this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Lots of various updates

+837 -502
+12
.config/fish/conf.d/50-config.fish
··· 27 27 set -gx DOCKER_NAME (sed -E 's/.*DOCKER_NAME=(.+)/\1/' /etc/profile.d/docker_name.sh) 28 28 end 29 29 30 + # Kinda silly this can't just be in workspace config, but oh well 31 + set -gx ROBOTFRAMEWORK_LS_WATCH_IMPL fsnotify 32 + set -gx ROBOTFRAMEWORK_LS_IGNORE_DIRS '[ 33 + "**/bazel-*", 34 + "**/.bazel_out", 35 + "**/.tox", 36 + "**/vendor", 37 + "**/CMakeFiles", 38 + "**/thirdparty", 39 + "**/src" 40 + ]' 41 + 30 42 # Set fish_user_paths here instead of fish_variables to expand $HOME per-machine 31 43 set -Ux fish_user_paths \ 32 44 $DEVKITARM/bin \
+1 -1
.config/fish/functions/juniper_ip_to_128_ip.fish
··· 1 1 function juniper_ip_to_128_ip 2 2 function __sub_ips 3 3 set -l regex (string escape --style=regex $argv[1]) 4 - string replace --regex --filter '^'$regex'[.]' $argv[2]'.' -- $argv[3] 4 + string replace --regex --filter '\b'$regex'[.]' $argv[2]'.' -- $argv[3] 5 5 end 6 6 7 7 for arg in $argv
+7 -2
.config/fish/functions/stat.fish
··· 1 - function stat --description 'alias stat stat -x' 2 - command stat -x $argv; 1 + function stat 2 + if status is-command-substitution 3 + # make sure e.g. tab-completion works as expected 4 + command stat $argv 5 + else 6 + command stat -x $argv 7 + end 3 8 end
+3
.config/fish/functions/sum.fish
··· 1 + function sum 2 + paste -sd+ - | math 3 + end
+2 -2
.config/iterm2/profiles/SSH Session (xterm-256color).json
··· 150 150 }, 151 151 "Bound Hosts": [], 152 152 "Character Encoding": 4, 153 - "Close Sessions On End": true, 153 + "Close Sessions On End": false, 154 154 "Columns": 80, 155 - "Command": "$$", 155 + "Command": "/usr/local/bin/fish -liC 'ssh $$USER$$@$$HOST$$'", 156 156 "Cursor Color": { 157 157 "Alpha Component": 1, 158 158 "Blue Component": 0.2850678861141205,
+668 -448
.config/tampermonkey/firefox-backup.json
··· 1 1 { 2 2 "created_by": "Tampermonkey", 3 - "version": "1", 4 3 "scripts": [ 5 4 { 6 - "name": "Google Meet Hangouts - PTT with Space", 5 + "enabled": true, 6 + "file_url": "https://greasyfork.org/scripts/38582-wanikani-open-framework/code/Wanikani%20Open%20Framework.user.js", 7 + "name": "Wanikani Open Framework", 7 8 "options": { 8 9 "check_for_updates": true, 9 10 "comment": null, 10 - "compatopts_for_requires": true, 11 - "compat_wrappedjsobject": false, 12 - "compat_metadata": false, 13 11 "compat_foreach": false, 14 - "compat_arrayleft": false, 15 - "compat_uW_gmonkey": false, 16 - "compat_forvarin": false, 12 + "compat_metadata": false, 13 + "compat_powerful_this": null, 14 + "compat_prototypes": false, 15 + "compat_wrappedjsobject": false, 16 + "compatopts_for_requires": true, 17 17 "noframes": null, 18 - "awareOfChrome": false, 19 - "run_at": null, 20 18 "override": { 21 - "use_includes": [], 22 - "orig_includes": [], 19 + "merge_connects": true, 20 + "merge_excludes": true, 23 21 "merge_includes": true, 24 - "use_matches": [], 25 - "orig_matches": [ 26 - "https://meet.google.com/*" 27 - ], 28 22 "merge_matches": true, 29 - "use_excludes": [], 23 + "orig_connects": [], 30 24 "orig_excludes": [], 31 - "merge_excludes": true, 32 - "use_connects": [], 33 - "merge_connects": true, 34 - "use_blockers": [], 35 - "orig_run_at": "document-idle", 36 - "orig_noframes": null 37 - } 38 - }, 39 - "storage": { 40 - "data": {}, 41 - "ts": 1606921521530 42 - }, 43 - "enabled": true, 44 - "position": 1, 45 - "uuid": "f8b2cb45-bbb5-4067-9271-349366516dac", 46 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBHb29nbGUgTWVldCBIYW5nb3V0cyAtIFBUVCB3aXRoIFNwYWNlCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL21pbmRibGVhY2guY29tLwovLyBAdmVyc2lvbiAgICAgIDAuMQovLyBAZGVzY3JpcHRpb24gIEhvbGQgZG93biBTcGFjZSBrZXkgdG8gdGFsaywgbGV0IGdvIHRvIG11dGUuIERvZXMgbm90IGludGVyZmVyZSB3aXRoIG90aGVyIG9wZXJhdGlvbiwgd29ya3MgbXVsdGluYXRpb25hbGx5LgovLyBAYXV0aG9yICAgICAgIFBhdHJpY2sgQmFybmVzCi8vIEBtYXRjaCAgICAgICAgaHR0cHM6Ly9tZWV0Lmdvb2dsZS5jb20vKgovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooKCkgPT4gewoJdmFyIGVsID0gdW5kZWZpbmVkOwoJY29uc3QgbWljID0gZW4gPT4gKHtrZXkscmVwZWF0LHRhcmdldH0pID0+IHsKCQllbCAmJiBlbC5pc0Nvbm5lY3RlZCB8fCAoZWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1pcy1tdXRlZF1bcm9sZT0iYnV0dG9uIl0nKSk7CgkJZWwgJiYga2V5PT09JyAnICYmICFyZXBlYXQgJiYgISgndmFsdWUnIGluIHRhcmdldCkgJiYgZWwuZGF0YXNldC5pc011dGVkID09PSBTdHJpbmcoZW4pICYmIGVsLmNsaWNrKCkKCX0KCWRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIG1pYyh0cnVlKSkKCWRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCBtaWMoZmFsc2UpKQp9KSgpOwo=" 47 - }, 48 - { 49 - "name": "Wanikani Open Framework", 50 - "options": { 51 - "check_for_updates": true, 52 - "comment": null, 53 - "compatopts_for_requires": true, 54 - "compat_wrappedjsobject": false, 55 - "compat_metadata": false, 56 - "compat_foreach": false, 57 - "compat_arrayleft": false, 58 - "compat_uW_gmonkey": false, 59 - "compat_forvarin": false, 60 - "noframes": null, 61 - "awareOfChrome": false, 62 - "run_at": null, 63 - "override": { 64 - "use_includes": [], 65 25 "orig_includes": [ 66 26 "/^https://(www|preview).wanikani.com//" 67 27 ], 68 - "merge_includes": true, 69 - "use_matches": [], 70 28 "orig_matches": [], 71 - "merge_matches": true, 72 - "use_excludes": [], 73 - "orig_excludes": [], 74 - "merge_excludes": true, 75 - "use_connects": [], 76 - "merge_connects": true, 29 + "orig_noframes": null, 30 + "orig_run_at": "document-start", 77 31 "use_blockers": [], 78 - "orig_run_at": "document-start", 79 - "orig_noframes": null 80 - } 32 + "use_connects": [], 33 + "use_excludes": [], 34 + "use_includes": [], 35 + "use_matches": [] 36 + }, 37 + "run_at": null, 38 + "tab_types": null, 39 + "unwrap": null 81 40 }, 41 + "position": 1, 42 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIE9wZW4gRnJhbWV3b3JrCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gRnJhbWV3b3JrIGZvciB3cml0aW5nIHNjcmlwdHMgZm9yIFdhbmlrYW5pCi8vIEB2ZXJzaW9uICAgICAxLjAuNTgKLy8gQGluY2x1ZGUgICAgIC9eaHR0cHM6Ly8od3d3fHByZXZpZXcpLndhbmlrYW5pLmNvbS8vCi8vIEBjb3B5cmlnaHQgICAyMDE4KywgUm9iaW4gRmluZGxleQovLyBAbGljZW5zZSAgICAgTUlUOyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1zdGFydAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbihnbG9iYWwpIHsKCSd1c2Ugc3RyaWN0JzsKCgkvKiBlc2xpbnQgbm8tbXVsdGktc3BhY2VzOiBvZmYgKi8KCS8qIGdsb2JhbHMgd2tvZiAqLwoKCXZhciB2ZXJzaW9uID0gJzEuMC41OCc7Cgl2YXIgaWdub3JlX21pc3NpbmdfaW5kZXhlZGRiID0gZmFsc2U7CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTdXBwb3J0ZWQgTW9kdWxlcwoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXZhciBzdXBwb3J0ZWRfbW9kdWxlcyA9IHsKCQlBcGl2MjogICAgeyB1cmw6ICdodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzg1ODEtd2FuaWthbmktb3Blbi1mcmFtZXdvcmstYXBpdjItbW9kdWxlL2NvZGUvV2FuaWthbmklMjBPcGVuJTIwRnJhbWV3b3JrJTIwLSUyMEFwaXYyJTIwbW9kdWxlLmpzP3ZlcnNpb249NzQ3ODY2J30sCgkJSXRlbURhdGE6IHsgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM4NTgwLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLWl0ZW1kYXRhLW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBJdGVtRGF0YSUyMG1vZHVsZS5qcz92ZXJzaW9uPTEwMzAxNTknfSwKCQlNZW51OiAgICAgeyB1cmw6ICdodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzg1Nzgtd2FuaWthbmktb3Blbi1mcmFtZXdvcmstbWVudS1tb2R1bGUvY29kZS9XYW5pa2FuaSUyME9wZW4lMjBGcmFtZXdvcmslMjAtJTIwTWVudSUyMG1vZHVsZS5qcz92ZXJzaW9uPTEwMjkzOTAnfSwKCQlQcm9ncmVzczogeyB1cmw6ICdodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzg1Nzctd2FuaWthbmktb3Blbi1mcmFtZXdvcmstcHJvZ3Jlc3MtbW9kdWxlL2NvZGUvV2FuaWthbmklMjBPcGVuJTIwRnJhbWV3b3JrJTIwLSUyMFByb2dyZXNzJTIwbW9kdWxlLmpzP3ZlcnNpb249NjAxNDczJ30sCgkJU2V0dGluZ3M6IHsgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM4NTc2LXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLXNldHRpbmdzLW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBTZXR0aW5ncyUyMG1vZHVsZS5qcz92ZXJzaW9uPTEwMzAxNjMnfSwKCX07CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBQdWJsaXNoZWQgaW50ZXJmYWNlCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJdmFyIHB1Ymxpc2hlZF9pbnRlcmZhY2UgPSB7CgkJaW5jbHVkZTogaW5jbHVkZSwgICAgICAgICAgICAgIC8vIGluY2x1ZGUobW9kdWxlX2xpc3QpICAgICAgICA9PiBQcm9taXNlCgkJcmVhZHk6ICAgcmVhZHksICAgICAgICAgICAgICAgIC8vIHJlYWR5KG1vZHVsZV9saXN0KSAgICAgICAgICA9PiBQcm9taXNlCgoJCWxvYWRfZmlsZTogICBsb2FkX2ZpbGUsICAgICAgICAvLyBsb2FkX2ZpbGUodXJsLCB1c2VfY2FjaGUpICAgPT4gUHJvbWlzZQoJCWxvYWRfY3NzOiAgICBsb2FkX2NzcywgICAgICAgICAvLyBsb2FkX2Nzcyh1cmwsIHVzZV9jYWNoZSkgICAgPT4gUHJvbWlzZQoJCWxvYWRfc2NyaXB0OiBsb2FkX3NjcmlwdCwgICAgICAvLyBsb2FkX3NjcmlwdCh1cmwsIHVzZV9jYWNoZSkgPT4gUHJvbWlzZQoKCQlmaWxlX2NhY2hlOiB7CgkJCWRpcjogICAge30sICAgICAgICAgICAgICAgIC8vIE9iamVjdCBjb250YWluaW5nIGRpcmVjdG9yeSBvZiBmaWxlcy4KCQkJbHM6ICAgICBmaWxlX2NhY2hlX2xpc3QsICAgLy8gbHMoKQoJCQljbGVhcjogIGZpbGVfY2FjaGVfY2xlYXIsICAvLyBjbGVhcigpICAgICAgICAgICAgID0+IFByb21pc2UKCQkJZGVsZXRlOiBmaWxlX2NhY2hlX2RlbGV0ZSwgLy8gZGVsZXRlKG5hbWUpICAgICAgICA9PiBQcm9taXNlCgkJCWZsdXNoOiAgZmlsZV9jYWNoZV9mbHVzaCwgIC8vIGZsdXNoKCkgICAgICAgICAgICAgPT4gUHJvbWlzZQoJCQlsb2FkOiAgIGZpbGVfY2FjaGVfbG9hZCwgICAvLyBsb2FkKG5hbWUpICAgICAgICAgID0+IFByb21pc2UKCQkJc2F2ZTogICBmaWxlX2NhY2hlX3NhdmUsICAgLy8gc2F2ZShuYW1lLCBjb250ZW50KSA9PiBQcm9taXNlCgkJCW5vX2NhY2hlOmZpbGVfbm9jYWNoZSwgICAgIC8vIG5vX2NhY2hlKG1vZHVsZXMpCgkJfSwKCgkJb246ICAgICAgd2FpdF9ldmVudCwgICAgICAgICAgIC8vIG9uKGV2ZW50LCBjYWxsYmFjaykKCQl0cmlnZ2VyOiB0cmlnZ2VyX2V2ZW50LCAgICAgICAgLy8gdHJpZ2dlcihldmVudFssIGRhdGExWywgZGF0YTJbLCAuLi5dXV0pCgoJCWdldF9zdGF0ZTogIGdldF9zdGF0ZSwgICAgICAgICAvLyBnZXQoc3RhdGVfdmFyKQoJCXNldF9zdGF0ZTogIHNldF9zdGF0ZSwgICAgICAgICAvLyBzZXQoc3RhdGVfdmFyLCB2YWx1ZSkKCQl3YWl0X3N0YXRlOiB3YWl0X3N0YXRlLCAgICAgICAgLy8gd2FpdChzdGF0ZV92YXIsIHZhbHVlWywgY2FsbGJhY2tbLCBwZXJzaXN0ZW50XV0pID0+IGlmIG5vIGNhbGxiYWNrLCByZXR1cm4gb25lLXNob3QgUHJvbWlzZQoKCQl2ZXJzaW9uOiB7CgkJCXZhbHVlOiB2ZXJzaW9uLAoJCQljb21wYXJlX3RvOiBjb21wYXJlX3RvLCAgICAvLyBjb21wYXJlX3ZlcnNpb24odmVyc2lvbikKCQl9Cgl9OwoKCXB1Ymxpc2hlZF9pbnRlcmZhY2Uuc3VwcG9ydF9maWxlcyA9IHsKCQknanF1ZXJ5X3VpLmpzJzogJ2h0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5dWkvMS4xMi4xL2pxdWVyeS11aS5taW4uanMnLAoJCSdqcXVpX3drbWFpbi5jc3MnOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JmaW5kbGV5L3dhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLzE1NTBhZjgzODNlYzI4YWQ0MDZjZjQwMWFlZTJkZTRjNTI0NDZmNmMvanF1aS13a21haW4uY3NzJywKCX07CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCglmdW5jdGlvbiBzcGxpdF9saXN0KHN0cikge3JldHVybiBzdHIucmVwbGFjZSgv44CBL2csJywnKS5yZXBsYWNlKC9bXHPjgIBdKy9nLCcgJykudHJpbSgpLnJlcGxhY2UoLyAqLCAqL2csICcsJykuc3BsaXQoJywnKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge3JldHVybiAobmFtZS5sZW5ndGggPiAwKTt9KTt9CglmdW5jdGlvbiBwcm9taXNlKCl7dmFyIGEsYixjPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGQsZSl7YT1kO2I9ZTt9KTtjLnJlc29sdmU9YTtjLnJlamVjdD1iO3JldHVybiBjO30KCgkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBDb21wYXJlIHRoZSBmcmFtZXdvcmsgdmVyc2lvbiBhZ2FpbnN0IGEgc3BlY2lmaWMgdmVyc2lvbi4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBjb21wYXJlX3RvKGNsaWVudF92ZXJzaW9uKSB7CgkJdmFyIGNsaWVudF92ZXIgPSBjbGllbnRfdmVyc2lvbi5zcGxpdCgnLicpLm1hcChkID0+IE51bWJlcihkKSk7CgkJdmFyIHdrb2ZfdmVyID0gdmVyc2lvbi5zcGxpdCgnLicpLm1hcChkID0+IE51bWJlcihkKSk7CgkJdmFyIGxlbiA9IE1hdGgubWF4KGNsaWVudF92ZXIubGVuZ3RoLCB3a29mX3Zlci5sZW5ndGgpOwoJCWZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbjsgaWR4KyspIHsKCQkJdmFyIGEgPSBjbGllbnRfdmVyW2lkeF0gfHwgMDsKCQkJdmFyIGIgPSB3a29mX3ZlcltpZHhdIHx8IDA7CgkJCWlmIChhID09PSBiKSBjb250aW51ZTsKCQkJaWYgKGEgPCBiKSByZXR1cm4gJ25ld2VyJzsKCQkJcmV0dXJuICdvbGRlcic7CgkJfQoJCXJldHVybiAnc2FtZSc7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIEluY2x1ZGUgYSBsaXN0IG9mIG1vZHVsZXMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJdmFyIGluY2x1ZGVfcHJvbWlzZXMgPSB7fTsKCglmdW5jdGlvbiBpbmNsdWRlKG1vZHVsZV9saXN0KSB7CgkJaWYgKHdrb2YuZ2V0X3N0YXRlKCd3a29mLndrb2YnKSAhPT0gJ3JlYWR5JykgewoJCQlyZXR1cm4gd2tvZi5yZWFkeSgnd2tvZicpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gd2tvZi5pbmNsdWRlKG1vZHVsZV9saXN0KTt9KTsKCQl9CgkJdmFyIGluY2x1ZGVfcHJvbWlzZSA9IHByb21pc2UoKTsKCQl2YXIgbW9kdWxlX25hbWVzID0gc3BsaXRfbGlzdChtb2R1bGVfbGlzdCk7CgkJdmFyIHNjcmlwdF9jbnQgPSBtb2R1bGVfbmFtZXMubGVuZ3RoOwoJCWlmIChzY3JpcHRfY250ID09PSAwKSB7CgkJCWluY2x1ZGVfcHJvbWlzZS5yZXNvbHZlKHtsb2FkZWQ6W10sIGZhaWxlZDpbXX0pOwoJCQlyZXR1cm4gaW5jbHVkZV9wcm9taXNlOwoJCX0KCgkJdmFyIGRvbmVfY250ID0gMDsKCQl2YXIgbG9hZGVkID0gW10sIGZhaWxlZCA9IFtdOwoJCXZhciBub19jYWNoZSA9IHNwbGl0X2xpc3QobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3drb2YuaW5jbHVkZS5ub2NhY2hlJykgfHwgJycpOwoJCWZvciAodmFyIGlkeCA9IDA7IGlkeCA8IG1vZHVsZV9uYW1lcy5sZW5ndGg7IGlkeCsrKSB7CgkJCXZhciBtb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lc1tpZHhdOwoJCQl2YXIgbW9kdWxlID0gc3VwcG9ydGVkX21vZHVsZXNbbW9kdWxlX25hbWVdOwoJCQlpZiAoIW1vZHVsZSkgewoJCQkJZmFpbGVkLnB1c2goe25hbWU6bW9kdWxlX25hbWUsIHVybDp1bmRlZmluZWR9KTsKCQkJCWNoZWNrX2RvbmUoKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCXZhciBhd2FpdF9sb2FkID0gaW5jbHVkZV9wcm9taXNlc1ttb2R1bGVfbmFtZV07CgkJCXZhciB1c2VfY2FjaGUgPSAobm9fY2FjaGUuaW5kZXhPZihtb2R1bGVfbmFtZSkgPCAwKSAmJiAobm9fY2FjaGUuaW5kZXhPZignKicpIDwgMCk7CgkJCWlmICghdXNlX2NhY2hlKSBmaWxlX2NhY2hlX2RlbGV0ZShtb2R1bGUudXJsKTsKCQkJaWYgKGF3YWl0X2xvYWQgPT09IHVuZGVmaW5lZCkgaW5jbHVkZV9wcm9taXNlc1ttb2R1bGVfbmFtZV0gPSBhd2FpdF9sb2FkID0gbG9hZF9zY3JpcHQobW9kdWxlLnVybCwgdXNlX2NhY2hlKTsKCQkJYXdhaXRfbG9hZC50aGVuKHB1c2hfbG9hZGVkLCBwdXNoX2ZhaWxlZCk7CgkJfQoKCQlyZXR1cm4gaW5jbHVkZV9wcm9taXNlOwoKCQlmdW5jdGlvbiBwdXNoX2xvYWRlZCh1cmwpIHsKCQkJbG9hZGVkLnB1c2godXJsKTsKCQkJY2hlY2tfZG9uZSgpOwoJCX0KCgkJZnVuY3Rpb24gcHVzaF9mYWlsZWQodXJsKSB7CgkJCWZhaWxlZC5wdXNoKHVybCk7CgkJCWNoZWNrX2RvbmUoKTsKCQl9CgoJCWZ1bmN0aW9uIGNoZWNrX2RvbmUoKSB7CgkJCWlmICgrK2RvbmVfY250IDwgc2NyaXB0X2NudCkgcmV0dXJuOwoJCQlpZiAoZmFpbGVkLmxlbmd0aCA9PT0gMCkgaW5jbHVkZV9wcm9taXNlLnJlc29sdmUoe2xvYWRlZDpsb2FkZWQsIGZhaWxlZDpmYWlsZWR9KTsKCQkJZWxzZSBpbmNsdWRlX3Byb21pc2UucmVqZWN0KHtlcnJvcjonRmFpbHVyZSBsb2FkaW5nIG1vZHVsZScsIGxvYWRlZDpsb2FkZWQsIGZhaWxlZDpmYWlsZWR9KTsKCQl9Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIFdhaXQgZm9yIGFsbCBtb2R1bGVzIHRvIHJlcG9ydCB0aGF0IHRoZXkgYXJlIHJlYWR5CgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gcmVhZHkobW9kdWxlX2xpc3QpIHsKCQl2YXIgbW9kdWxlX25hbWVzID0gc3BsaXRfbGlzdChtb2R1bGVfbGlzdCk7CgoJCXZhciByZWFkeV9wcm9taXNlcyA9IFsgXTsKCQlmb3IgKHZhciBpZHggaW4gbW9kdWxlX25hbWVzKSB7CgkJCXZhciBtb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lc1tpZHhdOwoJCQlyZWFkeV9wcm9taXNlcy5wdXNoKHdhaXRfc3RhdGUoJ3drb2YuJyArIG1vZHVsZV9uYW1lLCAncmVhZHknKSk7CgkJfQoKCQlpZiAocmVhZHlfcHJvbWlzZXMubGVuZ3RoID09PSAwKSB7CgkJCXJldHVybiBQcm9taXNlLnJlc29sdmUoKTsKCQl9IGVsc2UgaWYgKHJlYWR5X3Byb21pc2VzLmxlbmd0aCA9PT0gMSkgewoJCQlyZXR1cm4gcmVhZHlfcHJvbWlzZXNbMF07CgkJfSBlbHNlIHsKCQkJcmV0dXJuIFByb21pc2UuYWxsKHJlYWR5X3Byb21pc2VzKTsKCQl9Cgl9CgkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGEgZmlsZSBhc3luY2hyb25vdXNseSwgYW5kIHBhc3MgdGhlIGZpbGUgYXMgcmVzb2x2ZWQgUHJvbWlzZSBkYXRhLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGxvYWRfZmlsZSh1cmwsIHVzZV9jYWNoZSkgewoJCXZhciBmZXRjaF9wcm9taXNlID0gcHJvbWlzZSgpOwoJCXZhciBub19jYWNoZSA9IHNwbGl0X2xpc3QobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3drb2YubG9hZF9maWxlLm5vY2FjaGUnKSB8fCAnJyk7CgkJaWYgKG5vX2NhY2hlLmluZGV4T2YodXJsKSA+PSAwIHx8IG5vX2NhY2hlLmluZGV4T2YoJyonKSA+PSAwKSB1c2VfY2FjaGUgPSBmYWxzZTsKCQlpZiAodXNlX2NhY2hlID09PSB0cnVlKSB7CgkJCXJldHVybiBmaWxlX2NhY2hlX2xvYWQodXJsLCB1c2VfY2FjaGUpLmNhdGNoKGZldGNoX3VybCk7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGZldGNoX3VybCgpOwoJCX0KCgkJLy8gUmV0cmlldmUgZmlsZSBmcm9tIHNlcnZlcgoJCWZ1bmN0aW9uIGZldGNoX3VybCgpewoJCQl2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoJCQlyZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IHByb2Nlc3NfcmVzdWx0OwoJCQlyZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7CgkJCXJlcXVlc3Quc2VuZCgpOwoJCQlyZXR1cm4gZmV0Y2hfcHJvbWlzZTsKCQl9CgoJCWZ1bmN0aW9uIHByb2Nlc3NfcmVzdWx0KGV2ZW50KXsKCQkJaWYgKGV2ZW50LnRhcmdldC5yZWFkeVN0YXRlICE9PSA0KSByZXR1cm47CgkJCWlmIChldmVudC50YXJnZXQuc3RhdHVzID49IDQwMCB8fCBldmVudC50YXJnZXQuc3RhdHVzID09PSAwKSByZXR1cm4gZmV0Y2hfcHJvbWlzZS5yZWplY3QoZXZlbnQudGFyZ2V0LnN0YXR1cyk7CgkJCWlmICh1c2VfY2FjaGUpIHsKCQkJCWZpbGVfY2FjaGVfc2F2ZSh1cmwsIGV2ZW50LnRhcmdldC5yZXNwb25zZSkKCQkJCS50aGVuKGZldGNoX3Byb21pc2UucmVzb2x2ZS5iaW5kKG51bGwsZXZlbnQudGFyZ2V0LnJlc3BvbnNlKSk7CgkJCX0gZWxzZSB7CgkJCQlmZXRjaF9wcm9taXNlLnJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3BvbnNlKTsKCQkJfQoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gTG9hZCBhbmQgaW5zdGFsbCBhIHNwZWNpZmljIGZpbGUgdHlwZSBpbnRvIHRoZSBET00uCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9hbmRfYXBwZW5kKHVybCwgdGFnX25hbWUsIGxvY2F0aW9uLCB1c2VfY2FjaGUpIHsKCQl1cmwgPSB1cmwucmVwbGFjZSgvIi9nLCdcJycpOwoJCWlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhZ19uYW1lKydbdWlkPSInK3VybCsnIl0nKSAhPT0gbnVsbCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwoJCXJldHVybiBsb2FkX2ZpbGUodXJsLCB1c2VfY2FjaGUpLnRoZW4oYXBwZW5kX3RvX3RhZyk7CgoJCWZ1bmN0aW9uIGFwcGVuZF90b190YWcoY29udGVudCkgewoJCQl2YXIgdGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdfbmFtZSk7CgkJCXRhZy5pbm5lckhUTUwgPSBjb250ZW50OwoJCQl0YWcuc2V0QXR0cmlidXRlKCd1aWQnLCB1cmwpOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGxvY2F0aW9uKS5hcHBlbmRDaGlsZCh0YWcpOwoJCQlyZXR1cm4gdXJsOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gTG9hZCBhbmQgaW5zdGFsbCBhIENTUyBmaWxlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGxvYWRfY3NzKHVybCwgdXNlX2NhY2hlKSB7CgkJcmV0dXJuIGxvYWRfYW5kX2FwcGVuZCh1cmwsICdzdHlsZScsICdoZWFkJywgdXNlX2NhY2hlKTsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gTG9hZCBhbmQgaW5zdGFsbCBKYXZhc2NyaXB0LgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGxvYWRfc2NyaXB0KHVybCwgdXNlX2NhY2hlKSB7CgkJcmV0dXJuIGxvYWRfYW5kX2FwcGVuZCh1cmwsICdzY3JpcHQnLCAnYm9keScsIHVzZV9jYWNoZSk7Cgl9CgkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCXZhciBzdGF0ZV9saXN0ZW5lcnMgPSB7fTsKCXZhciBzdGF0ZV92YWx1ZXMgPSB7fTsKCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gR2V0IHRoZSB2YWx1ZSBvZiBhIHN0YXRlIHZhcmlhYmxlLCBhbmQgbm90aWZ5IGxpc3RlbmVycy4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBnZXRfc3RhdGUoc3RhdGVfdmFyKSB7CgkJcmV0dXJuIHN0YXRlX3ZhbHVlc1tzdGF0ZV92YXJdOwoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTZXQgdGhlIHZhbHVlIG9mIGEgc3RhdGUgdmFyaWFibGUsIGFuZCBub3RpZnkgbGlzdGVuZXJzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIHNldF9zdGF0ZShzdGF0ZV92YXIsIHZhbHVlKSB7CgkJdmFyIG9sZF92YWx1ZSA9IHN0YXRlX3ZhbHVlc1tzdGF0ZV92YXJdOwoJCWlmIChvbGRfdmFsdWUgPT09IHZhbHVlKSByZXR1cm47CgkJc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl0gPSB2YWx1ZTsKCgkJLy8gRG8gbGlzdGVuZXIgY2FsbGJhY2tzLCBhbmQgcmVtb3ZlIG5vbi1wZXJzaXN0ZW50IGxpc3RlbmVycwoJCXZhciBsaXN0ZW5lcnMgPSBzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXTsKCQl2YXIgcGVyc2lzdGVudF9saXN0ZW5lcnMgPSBbIF07CgkJZm9yICh2YXIgaWR4IGluIGxpc3RlbmVycykgewoJCQl2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaWR4XTsKCQkJdmFyIGtlZXAgPSB0cnVlOwoJCQlpZiAobGlzdGVuZXIudmFsdWUgPT09IHZhbHVlIHx8IGxpc3RlbmVyLnZhbHVlID09PSAnKicpIHsKCQkJCWtlZXAgPSBsaXN0ZW5lci5wZXJzaXN0ZW50OwoJCQkJdHJ5IHsKCQkJCQlsaXN0ZW5lci5jYWxsYmFjayh2YWx1ZSwgb2xkX3ZhbHVlKTsKCQkJCX0gY2F0Y2ggKGUpIHt9CgkJCX0KCQkJaWYgKGtlZXApIHBlcnNpc3RlbnRfbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOwoJCX0KCQlzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXSA9IHBlcnNpc3RlbnRfbGlzdGVuZXJzOwoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBXaGVuIHN0YXRlIG9mIHN0YXRlX3ZhciBjaGFuZ2VzIHRvIHZhbHVlLCBjYWxsIGNhbGxiYWNrLgoJLy8gSWYgcGVyc2lzdGVudCA9PT0gdHJ1ZSwgY29udGludWUgbGlzdGVuaW5nIGZvciBhZGRpdGlvbmFsIHN0YXRlIGNoYW5nZXMKCS8vIElmIHZhbHVlIGlzICcqJywgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgZm9yIGFsbCBzdGF0ZSBjaGFuZ2VzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIHdhaXRfc3RhdGUoc3RhdGVfdmFyLCB2YWx1ZSwgY2FsbGJhY2ssIHBlcnNpc3RlbnQpIHsKCQl2YXIgcHJvbWlzZTsKCQlpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkgewoJCQlwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CgkJCQljYWxsYmFjayA9IHJlc29sdmU7CgkJCX0pOwoJCX0KCQlpZiAoc3RhdGVfbGlzdGVuZXJzW3N0YXRlX3Zhcl0gPT09IHVuZGVmaW5lZCkgc3RhdGVfbGlzdGVuZXJzW3N0YXRlX3Zhcl0gPSBbIF07CgkJcGVyc2lzdGVudCA9IChwZXJzaXN0ZW50ID09PSB0cnVlKTsKCQl2YXIgY3VycmVudF92YWx1ZSA9IHN0YXRlX3ZhbHVlc1tzdGF0ZV92YXJdOwoJCWlmIChwZXJzaXN0ZW50IHx8IHZhbHVlICE9PSBjdXJyZW50X3ZhbHVlKSBzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXS5wdXNoKHtjYWxsYmFjazpjYWxsYmFjaywgcGVyc2lzdGVudDpwZXJzaXN0ZW50LCB2YWx1ZTp2YWx1ZX0pOwoKCQkvLyBJZiBpdCdzIGFscmVhZHkgYXQgdGhlIGRlc2lyZWQgc3RhdGUsIGNhbGwgdGhlIGNhbGxiYWNrIGltbWVkaWF0ZWx5LgoJCWlmICh2YWx1ZSA9PT0gY3VycmVudF92YWx1ZSkgewoJCQl0cnkgewoJCQkJY2FsbGJhY2sodmFsdWUsIGN1cnJlbnRfdmFsdWUpOwoJCQl9IGNhdGNoIChlcnIpIHt9CgkJfQoJCXJldHVybiBwcm9taXNlOwoJfQoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCgl2YXIgZXZlbnRfbGlzdGVuZXJzID0ge307CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIEZpcmUgYW4gZXZlbnQsIHdoaWNoIHRoZW4gY2FsbHMgY2FsbGJhY2tzIGZvciBhbnkgbGlzdGVuZXJzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIHRyaWdnZXJfZXZlbnQoZXZlbnQpIHsKCQl2YXIgbGlzdGVuZXJzID0gZXZlbnRfbGlzdGVuZXJzW2V2ZW50XTsKCQlpZiAobGlzdGVuZXJzID09PSB1bmRlZmluZWQpIHJldHVybjsKCQl2YXIgYXJncyA9IFtdOwoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGFyZ3MsYXJndW1lbnRzKTsKCQlhcmdzLnNoaWZ0KCk7CgkJZm9yICh2YXIgaWR4IGluIGxpc3RlbmVycykgdHJ5IHsKCQkJbGlzdGVuZXJzW2lkeF0uYXBwbHkobnVsbCxhcmdzKTsKCQl9IGNhdGNoIChlcnIpIHt9CgkJcmV0dXJuIGdsb2JhbC53a29mOwoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBBZGQgYSBsaXN0ZW5lciBmb3IgYW4gZXZlbnQuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gd2FpdF9ldmVudChldmVudCwgY2FsbGJhY2spIHsKCQlpZiAoZXZlbnRfbGlzdGVuZXJzW2V2ZW50XSA9PT0gdW5kZWZpbmVkKSBldmVudF9saXN0ZW5lcnNbZXZlbnRdID0gW107CgkJZXZlbnRfbGlzdGVuZXJzW2V2ZW50XS5wdXNoKGNhbGxiYWNrKTsKCQlyZXR1cm4gZ2xvYmFsLndrb2Y7Cgl9CgkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCXZhciBmaWxlX2NhY2hlX29wZW5fcHJvbWlzZTsKCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gT3BlbiB0aGUgZmlsZV9jYWNoZSBkYXRhYmFzZSAob3IgcmV0dXJuIGhhbmRsZSBpZiBvcGVuKS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX29wZW4oKSB7CgkJaWYgKGZpbGVfY2FjaGVfb3Blbl9wcm9taXNlKSByZXR1cm4gZmlsZV9jYWNoZV9vcGVuX3Byb21pc2U7CgkJdmFyIG9wZW5fcHJvbWlzZSA9IHByb21pc2UoKTsKCQlmaWxlX2NhY2hlX29wZW5fcHJvbWlzZSA9IG9wZW5fcHJvbWlzZTsKCQl2YXIgcmVxdWVzdDsKCQlyZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4oJ3drb2YuZmlsZV9jYWNoZScpOwoJCXJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gdXBncmFkZV9kYjsKCQlyZXF1ZXN0Lm9uc3VjY2VzcyA9IGdldF9kaXI7CgkJcmVxdWVzdC5vbmVycm9yID0gZXJyb3I7CgkJcmV0dXJuIG9wZW5fcHJvbWlzZTsKCgkJZnVuY3Rpb24gZXJyb3IoKSB7CgkJCWNvbnNvbGUubG9nKCdpbmRleGVkREIgY291bGQgbm90IG9wZW4hJyk7CgkJCXdrb2YuZmlsZV9jYWNoZS5kaXIgPSB7fTsKCQkJaWYgKGlnbm9yZV9taXNzaW5nX2luZGV4ZWRkYikgewoJCQkJb3Blbl9wcm9taXNlLnJlc29sdmUobnVsbCk7CgkJCX0gZWxzZSB7CgkJCQlvcGVuX3Byb21pc2UucmVqZWN0KCk7CgkJCX0KCQl9CgoJCWZ1bmN0aW9uIHVwZ3JhZGVfZGIoZXZlbnQpewoJCQl2YXIgZGIgPSBldmVudC50YXJnZXQucmVzdWx0OwoJCQl2YXIgc3RvcmUgPSBkYi5jcmVhdGVPYmplY3RTdG9yZSgnZmlsZXMnLCB7a2V5UGF0aDonbmFtZSd9KTsKCQl9CgoJCWZ1bmN0aW9uIGdldF9kaXIoZXZlbnQpewoJCQl2YXIgZGIgPSBldmVudC50YXJnZXQucmVzdWx0OwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZG9ubHknKTsKCQkJdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ2ZpbGVzJyk7CgkJCXZhciByZXF1ZXN0ID0gc3RvcmUuZ2V0KCdbZGlyXScpOwoJCQlyZXF1ZXN0Lm9uc3VjY2VzcyA9IHByb2Nlc3NfZGlyOwoJCQl0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gb3Blbl9wcm9taXNlLnJlc29sdmUuYmluZChudWxsLCBkYik7CgkJCW9wZW5fcHJvbWlzZS50aGVuKHNldFRpbWVvdXQuYmluZChudWxsLCBmaWxlX2NhY2hlX2NsZWFudXAsIDEwMDAwKSk7CgkJfQoKCQlmdW5jdGlvbiBwcm9jZXNzX2RpcihldmVudCl7CgkJCWlmIChldmVudC50YXJnZXQucmVzdWx0ID09PSB1bmRlZmluZWQpIHsKCQkJCXdrb2YuZmlsZV9jYWNoZS5kaXIgPSB7fTsKCQkJfSBlbHNlIHsKCQkJCXdrb2YuZmlsZV9jYWNoZS5kaXIgPSBKU09OLnBhcnNlKGV2ZW50LnRhcmdldC5yZXN1bHQuY29udGVudCk7CgkJCX0KCQl9Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIExpc3RzIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlX2NhY2hlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfbGlzdCgpIHsKCQljb25zb2xlLmxvZyhPYmplY3Qua2V5cyh3a29mLmZpbGVfY2FjaGUuZGlyKS5zb3J0KCkuam9pbignXG4nKSk7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIENsZWFyIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfY2xlYXIoKSB7CgkJcmV0dXJuIGZpbGVfY2FjaGVfb3BlbigpLnRoZW4oY2xlYXIpOwoKCQlmdW5jdGlvbiBjbGVhcihkYikgewoJCQl2YXIgY2xlYXJfcHJvbWlzZSA9IHByb21pc2UoKTsKCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IHt9OwoJCQlpZiAoZGIgPT09IG51bGwpIHJldHVybiBjbGVhcl9wcm9taXNlLnJlc29sdmUoKTsKCQkJdmFyIHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oJ2ZpbGVzJywgJ3JlYWR3cml0ZScpOwoJCQl2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnZmlsZXMnKTsKCQkJc3RvcmUuY2xlYXIoKTsKCQkJdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IGNsZWFyX3Byb21pc2UucmVzb2x2ZTsKCQl9Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIERlbGV0ZSBhIGZpbGUgZnJvbSB0aGUgZmlsZV9jYWNoZSBkYXRhYmFzZS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX2RlbGV0ZShwYXR0ZXJuKSB7CgkJcmV0dXJuIGZpbGVfY2FjaGVfb3BlbigpLnRoZW4oZGVsKTsKCgkJZnVuY3Rpb24gZGVsKGRiKSB7CgkJCXZhciBkZWxfcHJvbWlzZSA9IHByb21pc2UoKTsKCQkJaWYgKGRiID09PSBudWxsKSByZXR1cm4gZGVsX3Byb21pc2UucmVzb2x2ZSgpOwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZHdyaXRlJyk7CgkJCXZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdmaWxlcycpOwoJCQl2YXIgZmlsZXMgPSBPYmplY3Qua2V5cyh3a29mLmZpbGVfY2FjaGUuZGlyKS5maWx0ZXIoZnVuY3Rpb24oZmlsZSl7CgkJCQlpZiAocGF0dGVybiBpbnN0YW5jZW9mIFJlZ0V4cCkgewoJCQkJCXJldHVybiBmaWxlLm1hdGNoKHBhdHRlcm4pICE9PSBudWxsOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gKGZpbGUgPT09IHBhdHRlcm4pOwoJCQkJfQoJCQl9KTsKCQkJZmlsZXMuZm9yRWFjaChmdW5jdGlvbihmaWxlKXsKCQkJCXN0b3JlLmRlbGV0ZShmaWxlKTsKCQkJCWRlbGV0ZSB3a29mLmZpbGVfY2FjaGUuZGlyW2ZpbGVdOwoJCQl9KTsKCQkJZmlsZV9jYWNoZV9kaXJfc2F2ZSgpOwoJCQl0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gZGVsX3Byb21pc2UucmVzb2x2ZS5iaW5kKG51bGwsIGZpbGVzKTsKCQkJcmV0dXJuIGRlbF9wcm9taXNlOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gRm9yY2UgaW1tZWRpYXRlIHNhdmUgb2YgZmlsZV9jYWNoZSBkaXJlY3RvcnkuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9mbHVzaCgpIHsKCQlmaWxlX2NhY2hlX2Rpcl9zYXZlKHRydWUgLyogaW1tZWRpYXRlbHkgKi8pOwoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGEgZmlsZSBmcm9tIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfbG9hZChuYW1lKSB7CgkJdmFyIGxvYWRfcHJvbWlzZSA9IHByb21pc2UoKTsKCQlyZXR1cm4gZmlsZV9jYWNoZV9vcGVuKCkudGhlbihsb2FkKTsKCgkJZnVuY3Rpb24gbG9hZChkYikgewoJCQlpZiAod2tvZi5maWxlX2NhY2hlLmRpcltuYW1lXSA9PT0gdW5kZWZpbmVkKSB7CgkJCQlsb2FkX3Byb21pc2UucmVqZWN0KG5hbWUpOwoJCQkJcmV0dXJuIGxvYWRfcHJvbWlzZTsKCQkJfQoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZG9ubHknKTsKCQkJdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ2ZpbGVzJyk7CgkJCXZhciByZXF1ZXN0ID0gc3RvcmUuZ2V0KG5hbWUpOwoJCQl3a29mLmZpbGVfY2FjaGUuZGlyW25hbWVdLmxhc3RfbG9hZGVkID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwoJCQlmaWxlX2NhY2hlX2Rpcl9zYXZlKCk7CgkJCXJlcXVlc3Qub25zdWNjZXNzID0gZmluaXNoOwoJCQlyZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvcjsKCQkJcmV0dXJuIGxvYWRfcHJvbWlzZTsKCgkJCWZ1bmN0aW9uIGZpbmlzaChldmVudCl7CgkJCQlpZiAoZXZlbnQudGFyZ2V0LnJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7CgkJCQkJbG9hZF9wcm9taXNlLnJlamVjdChuYW1lKTsKCQkJCX0gZWxzZSB7CgkJCQkJbG9hZF9wcm9taXNlLnJlc29sdmUoZXZlbnQudGFyZ2V0LnJlc3VsdC5jb250ZW50KTsKCQkJCX0KCQkJfQoKCQkJZnVuY3Rpb24gZXJyb3IoZXZlbnQpewoJCQkJbG9hZF9wcm9taXNlLnJlamVjdChuYW1lKTsKCQkJfQoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gU2F2ZSBhIGZpbGUgaW50byB0aGUgZmlsZV9jYWNoZSBkYXRhYmFzZS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX3NhdmUobmFtZSwgY29udGVudCwgZXh0cmFfYXR0cmlicykgewoJCXJldHVybiBmaWxlX2NhY2hlX29wZW4oKS50aGVuKHNhdmUpOwoKCQlmdW5jdGlvbiBzYXZlKGRiKSB7CgkJCXZhciBzYXZlX3Byb21pc2UgPSBwcm9taXNlKCk7CgkJCWlmIChkYiA9PT0gbnVsbCkgcmV0dXJuIHNhdmVfcHJvbWlzZS5yZXNvbHZlKG5hbWUpOwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZHdyaXRlJyk7CgkJCXZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdmaWxlcycpOwoJCQlzdG9yZS5wdXQoe25hbWU6bmFtZSxjb250ZW50OmNvbnRlbnR9KTsKCQkJdmFyIG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTsKCQkJd2tvZi5maWxlX2NhY2hlLmRpcltuYW1lXSA9IE9iamVjdC5hc3NpZ24oe2FkZGVkOm5vdywgbGFzdF9sb2FkZWQ6bm93fSwgZXh0cmFfYXR0cmlicyk7CgkJCWZpbGVfY2FjaGVfZGlyX3NhdmUodHJ1ZSAvKiBpbW1lZGlhdGVseSAqLyk7CgkJCXRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBzYXZlX3Byb21pc2UucmVzb2x2ZS5iaW5kKG51bGwsIG5hbWUpOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gU2F2ZSBhIHRoZSBmaWxlX2NhY2hlIGRpcmVjdG9yeSBjb250ZW50cy4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgl2YXIgZmNfc3luY190aW1lcjsKCWZ1bmN0aW9uIGZpbGVfY2FjaGVfZGlyX3NhdmUoaW1tZWRpYXRlbHkpIHsKCQlpZiAoZmNfc3luY190aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQoZmNfc3luY190aW1lcik7CgkJdmFyIGRlbGF5ID0gKGltbWVkaWF0ZWx5ID8gMCA6IDIwMDApOwoJCWZjX3N5bmNfdGltZXIgPSBzZXRUaW1lb3V0KHNhdmUsIGRlbGF5KTsKCgkJZnVuY3Rpb24gc2F2ZSgpewoJCQlmaWxlX2NhY2hlX29wZW4oKS50aGVuKHNhdmUyKTsKCQl9CgoJCWZ1bmN0aW9uIHNhdmUyKGRiKXsKCQkJZmNfc3luY190aW1lciA9IHVuZGVmaW5lZDsKCQkJdmFyIHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rpb24oJ2ZpbGVzJywgJ3JlYWR3cml0ZScpOwoJCQl2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnZmlsZXMnKTsKCQkJc3RvcmUucHV0KHtuYW1lOidbZGlyXScsY29udGVudDpKU09OLnN0cmluZ2lmeSh3a29mLmZpbGVfY2FjaGUuZGlyKX0pOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gUmVtb3ZlIGZpbGVzIHRoYXQgaGF2ZW4ndCBiZWVuIGFjY2Vzc2VkIGluIGEgd2hpbGUuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9jbGVhbnVwKCkgewoJCXZhciB0aHJlc2hvbGQgPSBuZXcgRGF0ZSgpIC0gMTQqODY0MDAwMDA7IC8vIDE0IGRheXMKCQl2YXIgb2xkX2ZpbGVzID0gW107CgkJZm9yICh2YXIgZm5hbWUgaW4gd2tvZi5maWxlX2NhY2hlLmRpcikgewoJCQlpZiAoZm5hbWUubWF0Y2goL153a29mXC5zZXR0aW5nc1wuLykpIGNvbnRpbnVlOyAvLyBEb24ndCBmbHVzaCBzZXR0aW5ncyBmaWxlcy4KCQkJdmFyIGZkYXRlID0gbmV3IERhdGUod2tvZi5maWxlX2NhY2hlLmRpcltmbmFtZV0ubGFzdF9sb2FkZWQpOwoJCQlpZiAoZmRhdGUgPCB0aHJlc2hvbGQpIG9sZF9maWxlcy5wdXNoKGZuYW1lKTsKCQl9CgkJaWYgKG9sZF9maWxlcy5sZW5ndGggPT09IDApIHJldHVybjsKCQljb25zb2xlLmxvZygnQ2xlYW5pbmcgb3V0ICcrb2xkX2ZpbGVzLmxlbmd0aCsnIG9sZCBmaWxlKHMpIGZyb20gIndrb2YuZmlsZV9jYWNoZSI6Jyk7CgkJZm9yICh2YXIgZm51bSBpbiBvbGRfZmlsZXMpIHsKCQkJY29uc29sZS5sb2coJyAgJysoTnVtYmVyKGZudW0pKzEpKyc6ICcrb2xkX2ZpbGVzW2ZudW1dKTsKCQkJd2tvZi5maWxlX2NhY2hlLmRlbGV0ZShvbGRfZmlsZXNbZm51bV0pOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gUHJvY2VzcyBuby1jYWNoZSByZXF1ZXN0cy4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX25vY2FjaGUobGlzdCkgewoJCWlmIChsaXN0ID09PSB1bmRlZmluZWQpIHsKCQkJbGlzdCA9IHNwbGl0X2xpc3QobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3drb2YuaW5jbHVkZS5ub2NhY2hlJykgfHwgJycpOwoJCQlsaXN0ID0gbGlzdC5jb25jYXQoc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5sb2FkX2ZpbGUubm9jYWNoZScpIHx8ICcnKSk7CgkJCWNvbnNvbGUubG9nKGxpc3Quam9pbignLCcpKTsKCQl9IGVsc2UgaWYgKHR5cGVvZiBsaXN0ID09PSAnc3RyaW5nJykgewoJCQl2YXIgbm9fY2FjaGUgPSBzcGxpdF9saXN0KGxpc3QpOwoJCQl2YXIgaWR4LCBtb2R1bGVzID0gW10sIHVybHMgPSBbXTsKCQkJZm9yIChpZHggPSAwOyBpZHggPCBub19jYWNoZS5sZW5ndGg7IGlkeCsrKSB7CgkJCQl2YXIgaXRlbSA9IG5vX2NhY2hlW2lkeF07CgkJCQlpZiAoc3VwcG9ydGVkX21vZHVsZXNbaXRlbV0gIT09IHVuZGVmaW5lZCkgewoJCQkJCW1vZHVsZXMucHVzaChpdGVtKTsKCQkJCX0gZWxzZSB7CgkJCQkJdXJscy5wdXNoKGl0ZW0pOwoJCQkJfQoJCQl9CgkJCWNvbnNvbGUubG9nKCdNb2R1bGVzOiAnK21vZHVsZXMuam9pbignLCcpKTsKCQkJY29uc29sZS5sb2coJyAgIFVSTHM6ICcrdXJscy5qb2luKCcsJykpOwoJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnd2tvZi5pbmNsdWRlLm5vY2FjaGUnLCBtb2R1bGVzLmpvaW4oJywnKSk7CgkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCd3a29mLmxvYWRfZmlsZS5ub2NhY2hlJywgdXJscy5qb2luKCcsJykpOwoJCX0KCX0KCglmdW5jdGlvbiBkb2NfcmVhZHkoKSB7CgkJd2tvZi5zZXRfc3RhdGUoJ3drb2YuZG9jdW1lbnQnLCAncmVhZHknKTsKCX0KCgkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoJLy8gQm9vdGxvYWRlciBTdGFydHVwCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gc3RhcnR1cCgpIHsKCQlnbG9iYWwud2tvZiA9IHB1Ymxpc2hlZF9pbnRlcmZhY2U7CgoJCS8vIE1hcmsgZG9jdW1lbnQgc3RhdGUgYXMgJ3JlYWR5Jy4KCQlpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykgewoJCQlkb2NfcmVhZHkoKTsKCQl9IGVsc2UgewoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGRvY19yZWFkeSwgZmFsc2UpOyAgLy8gTm90aWZ5IGxpc3RlbmVycyB0aGF0IHdlIGFyZSByZWFkeS4KCQl9CgoJCS8vIE9wZW4gY2FjaGUsIHNvIHdrb2YuZmlsZV9jYWNoZS5kaXIgaXMgYXZhaWxhYmxlIHRvIGNvbnNvbGUgaW1tZWRpYXRlbHkuCgkJZmlsZV9jYWNoZV9vcGVuKCk7CgkJd2tvZi5zZXRfc3RhdGUoJ3drb2Yud2tvZicsICdyZWFkeScpOwoJfQoJc3RhcnR1cCgpOwoKfSkod2luZG93KTsK", 82 43 "storage": { 83 44 "data": {}, 84 45 "ts": 1607436649580 85 46 }, 86 - "enabled": true, 87 - "position": 2, 88 - "file_url": "https://greasyfork.org/scripts/38582-wanikani-open-framework/code/Wanikani%20Open%20Framework.user.js", 89 - "uuid": "e6f9fcca-44eb-425c-b066-541eb962863d", 90 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIE9wZW4gRnJhbWV3b3JrCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gRnJhbWV3b3JrIGZvciB3cml0aW5nIHNjcmlwdHMgZm9yIFdhbmlrYW5pCi8vIEB2ZXJzaW9uICAgICAxLjAuNTIKLy8gQGluY2x1ZGUgICAgIC9eaHR0cHM6Ly8od3d3fHByZXZpZXcpLndhbmlrYW5pLmNvbS8vCi8vIEBjb3B5cmlnaHQgICAyMDE4KywgUm9iaW4gRmluZGxleQovLyBAbGljZW5zZSAgICAgTUlUOyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1zdGFydAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbihnbG9iYWwpIHsKCSd1c2Ugc3RyaWN0JzsKCgkvKiBlc2xpbnQgbm8tbXVsdGktc3BhY2VzOiBvZmYgKi8KCS8qIGdsb2JhbHMgd2tvZiAqLwoKCXZhciB2ZXJzaW9uID0gJzEuMC41MCc7Cgl2YXIgaWdub3JlX21pc3NpbmdfaW5kZXhlZGRiID0gZmFsc2U7CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTdXBwb3J0ZWQgTW9kdWxlcwoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXZhciBzdXBwb3J0ZWRfbW9kdWxlcyA9IHsKCQlBcGl2MjogICAgeyB1cmw6ICdodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzg1ODEtd2FuaWthbmktb3Blbi1mcmFtZXdvcmstYXBpdjItbW9kdWxlL2NvZGUvV2FuaWthbmklMjBPcGVuJTIwRnJhbWV3b3JrJTIwLSUyMEFwaXYyJTIwbW9kdWxlLmpzP3ZlcnNpb249NzQ3ODY2J30sCgkJSXRlbURhdGE6IHsgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM4NTgwLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLWl0ZW1kYXRhLW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBJdGVtRGF0YSUyMG1vZHVsZS5qcz92ZXJzaW9uPTc2Nzg2OCd9LAoJCU1lbnU6ICAgICB7IHVybDogJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zODU3OC13YW5pa2FuaS1vcGVuLWZyYW1ld29yay1tZW51LW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBNZW51JTIwbW9kdWxlLmpzP3ZlcnNpb249ODQ5OTQ3J30sCgkJUHJvZ3Jlc3M6IHsgdXJsOiAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM4NTc3LXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLXByb2dyZXNzLW1vZHVsZS9jb2RlL1dhbmlrYW5pJTIwT3BlbiUyMEZyYW1ld29yayUyMC0lMjBQcm9ncmVzcyUyMG1vZHVsZS5qcz92ZXJzaW9uPTYwMTQ3Myd9LAoJCVNldHRpbmdzOiB7IHVybDogJ2h0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zODU3Ni13YW5pa2FuaS1vcGVuLWZyYW1ld29yay1zZXR0aW5ncy1tb2R1bGUvY29kZS9XYW5pa2FuaSUyME9wZW4lMjBGcmFtZXdvcmslMjAtJTIwU2V0dGluZ3MlMjBtb2R1bGUuanM/dmVyc2lvbj04NTAxNzYnfSwKCX07CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBQdWJsaXNoZWQgaW50ZXJmYWNlCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJdmFyIHB1Ymxpc2hlZF9pbnRlcmZhY2UgPSB7CgkJaW5jbHVkZTogaW5jbHVkZSwgICAgICAgICAgICAgIC8vIGluY2x1ZGUobW9kdWxlX2xpc3QpICAgICAgICA9PiBQcm9taXNlCgkJcmVhZHk6ICAgcmVhZHksICAgICAgICAgICAgICAgIC8vIHJlYWR5KG1vZHVsZV9saXN0KSAgICAgICAgICA9PiBQcm9taXNlCgoJCWxvYWRfZmlsZTogICBsb2FkX2ZpbGUsICAgICAgICAvLyBsb2FkX2ZpbGUodXJsLCB1c2VfY2FjaGUpICAgPT4gUHJvbWlzZQoJCWxvYWRfY3NzOiAgICBsb2FkX2NzcywgICAgICAgICAvLyBsb2FkX2Nzcyh1cmwsIHVzZV9jYWNoZSkgICAgPT4gUHJvbWlzZQoJCWxvYWRfc2NyaXB0OiBsb2FkX3NjcmlwdCwgICAgICAvLyBsb2FkX3NjcmlwdCh1cmwsIHVzZV9jYWNoZSkgPT4gUHJvbWlzZQoKCQlmaWxlX2NhY2hlOiB7CgkJCWRpcjogICAge30sICAgICAgICAgICAgICAgIC8vIE9iamVjdCBjb250YWluaW5nIGRpcmVjdG9yeSBvZiBmaWxlcy4KCQkJbHM6ICAgICBmaWxlX2NhY2hlX2xpc3QsICAgLy8gbHMoKQoJCQljbGVhcjogIGZpbGVfY2FjaGVfY2xlYXIsICAvLyBjbGVhcigpICAgICAgICAgICAgID0+IFByb21pc2UKCQkJZGVsZXRlOiBmaWxlX2NhY2hlX2RlbGV0ZSwgLy8gZGVsZXRlKG5hbWUpICAgICAgICA9PiBQcm9taXNlCgkJCWZsdXNoOiAgZmlsZV9jYWNoZV9mbHVzaCwgIC8vIGZsdXNoKCkgICAgICAgICAgICAgPT4gUHJvbWlzZQoJCQlsb2FkOiAgIGZpbGVfY2FjaGVfbG9hZCwgICAvLyBsb2FkKG5hbWUpICAgICAgICAgID0+IFByb21pc2UKCQkJc2F2ZTogICBmaWxlX2NhY2hlX3NhdmUsICAgLy8gc2F2ZShuYW1lLCBjb250ZW50KSA9PiBQcm9taXNlCgkJCW5vX2NhY2hlOmZpbGVfbm9jYWNoZSwgICAgIC8vIG5vX2NhY2hlKG1vZHVsZXMpCgkJfSwKCgkJb246ICAgICAgd2FpdF9ldmVudCwgICAgICAgICAgIC8vIG9uKGV2ZW50LCBjYWxsYmFjaykKCQl0cmlnZ2VyOiB0cmlnZ2VyX2V2ZW50LCAgICAgICAgLy8gdHJpZ2dlcihldmVudFssIGRhdGExWywgZGF0YTJbLCAuLi5dXV0pCgoJCWdldF9zdGF0ZTogIGdldF9zdGF0ZSwgICAgICAgICAvLyBnZXQoc3RhdGVfdmFyKQoJCXNldF9zdGF0ZTogIHNldF9zdGF0ZSwgICAgICAgICAvLyBzZXQoc3RhdGVfdmFyLCB2YWx1ZSkKCQl3YWl0X3N0YXRlOiB3YWl0X3N0YXRlLCAgICAgICAgLy8gd2FpdChzdGF0ZV92YXIsIHZhbHVlWywgY2FsbGJhY2tbLCBwZXJzaXN0ZW50XV0pID0+IGlmIG5vIGNhbGxiYWNrLCByZXR1cm4gb25lLXNob3QgUHJvbWlzZQoKCQl2ZXJzaW9uOiB7CgkJCXZhbHVlOiB2ZXJzaW9uLAoJCQljb21wYXJlX3RvOiBjb21wYXJlX3RvLCAgICAvLyBjb21wYXJlX3ZlcnNpb24odmVyc2lvbikKCQl9Cgl9OwoKCXB1Ymxpc2hlZF9pbnRlcmZhY2Uuc3VwcG9ydF9maWxlcyA9IHsKCQknanF1ZXJ5X3VpLmpzJzogJ2h0dHBzOi8vYWpheC5nb29nbGVhcGlzLmNvbS9hamF4L2xpYnMvanF1ZXJ5dWkvMS4xMi4xL2pxdWVyeS11aS5taW4uanMnLAoJCSdqcXVpX3drbWFpbi5jc3MnOiAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3JmaW5kbGV5L3dhbmlrYW5pLW9wZW4tZnJhbWV3b3JrLzE1NTBhZjgzODNlYzI4YWQ0MDZjZjQwMWFlZTJkZTRjNTI0NDZmNmMvanF1aS13a21haW4uY3NzJywKCX07CgoJLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCglmdW5jdGlvbiBzcGxpdF9saXN0KHN0cikge3JldHVybiBzdHIucmVwbGFjZSgvXlxzK3xccyooLClccyp8XHMrJC9nLCAnJDEnKS5zcGxpdCgnLCcpLmZpbHRlcihmdW5jdGlvbihuYW1lKSB7cmV0dXJuIChuYW1lLmxlbmd0aCA+IDApO30pO30KCWZ1bmN0aW9uIHByb21pc2UoKXt2YXIgYSxiLGM9bmV3IFByb21pc2UoZnVuY3Rpb24oZCxlKXthPWQ7Yj1lO30pO2MucmVzb2x2ZT1hO2MucmVqZWN0PWI7cmV0dXJuIGM7fQoKCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIENvbXBhcmUgdGhlIGZyYW1ld29yayB2ZXJzaW9uIGFnYWluc3QgYSBzcGVjaWZpYyB2ZXJzaW9uLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGNvbXBhcmVfdG8oY2xpZW50X3ZlcnNpb24pIHsKCQl2YXIgY2xpZW50X3ZlciA9IGNsaWVudF92ZXJzaW9uLnNwbGl0KCcuJykubWFwKGQgPT4gTnVtYmVyKGQpKTsKCQl2YXIgd2tvZl92ZXIgPSB2ZXJzaW9uLnNwbGl0KCcuJykubWFwKGQgPT4gTnVtYmVyKGQpKTsKCQl2YXIgbGVuID0gTWF0aC5tYXgoY2xpZW50X3Zlci5sZW5ndGgsIHdrb2ZfdmVyLmxlbmd0aCk7CgkJZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbGVuOyBpZHgrKykgewoJCQl2YXIgYSA9IGNsaWVudF92ZXJbaWR4XSB8fCAwOwoJCQl2YXIgYiA9IHdrb2ZfdmVyW2lkeF0gfHwgMDsKCQkJaWYgKGEgPT09IGIpIGNvbnRpbnVlOwoJCQlpZiAoYSA8IGIpIHJldHVybiAnbmV3ZXInOwoJCQlyZXR1cm4gJ29sZGVyJzsKCQl9CgkJcmV0dXJuICdzYW1lJzsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gSW5jbHVkZSBhIGxpc3Qgb2YgbW9kdWxlcy4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgl2YXIgaW5jbHVkZV9wcm9taXNlcyA9IHt9OwoKCWZ1bmN0aW9uIGluY2x1ZGUobW9kdWxlX2xpc3QpIHsKCQlpZiAod2tvZi5nZXRfc3RhdGUoJ3drb2Yud2tvZicpICE9PSAncmVhZHknKSB7CgkJCXJldHVybiB3a29mLnJlYWR5KCd3a29mJykudGhlbihmdW5jdGlvbigpe3JldHVybiB3a29mLmluY2x1ZGUobW9kdWxlX2xpc3QpO30pOwoJCX0KCQl2YXIgaW5jbHVkZV9wcm9taXNlID0gcHJvbWlzZSgpOwoJCXZhciBtb2R1bGVfbmFtZXMgPSBzcGxpdF9saXN0KG1vZHVsZV9saXN0KTsKCQl2YXIgc2NyaXB0X2NudCA9IG1vZHVsZV9uYW1lcy5sZW5ndGg7CgkJaWYgKHNjcmlwdF9jbnQgPT09IDApIHsKCQkJaW5jbHVkZV9wcm9taXNlLnJlc29sdmUoe2xvYWRlZDpbXSwgZmFpbGVkOltdfSk7CgkJCXJldHVybiBpbmNsdWRlX3Byb21pc2U7CgkJfQoKCQl2YXIgZG9uZV9jbnQgPSAwOwoJCXZhciBsb2FkZWQgPSBbXSwgZmFpbGVkID0gW107CgkJdmFyIG5vX2NhY2hlID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5pbmNsdWRlLm5vY2FjaGUnKSB8fCAnJyk7CgkJZm9yICh2YXIgaWR4ID0gMDsgaWR4IDwgbW9kdWxlX25hbWVzLmxlbmd0aDsgaWR4KyspIHsKCQkJdmFyIG1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWVzW2lkeF07CgkJCXZhciBtb2R1bGUgPSBzdXBwb3J0ZWRfbW9kdWxlc1ttb2R1bGVfbmFtZV07CgkJCWlmICghbW9kdWxlKSB7CgkJCQlmYWlsZWQucHVzaCh7bmFtZTptb2R1bGVfbmFtZSwgdXJsOnVuZGVmaW5lZH0pOwoJCQkJY2hlY2tfZG9uZSgpOwoJCQkJY29udGludWU7CgkJCX0KCQkJdmFyIGF3YWl0X2xvYWQgPSBpbmNsdWRlX3Byb21pc2VzW21vZHVsZV9uYW1lXTsKCQkJdmFyIHVzZV9jYWNoZSA9IChub19jYWNoZS5pbmRleE9mKG1vZHVsZV9uYW1lKSA8IDApICYmIChub19jYWNoZS5pbmRleE9mKCcqJykgPCAwKTsKCQkJaWYgKCF1c2VfY2FjaGUpIGZpbGVfY2FjaGVfZGVsZXRlKG1vZHVsZS51cmwpOwoJCQlpZiAoYXdhaXRfbG9hZCA9PT0gdW5kZWZpbmVkKSBpbmNsdWRlX3Byb21pc2VzW21vZHVsZV9uYW1lXSA9IGF3YWl0X2xvYWQgPSBsb2FkX3NjcmlwdChtb2R1bGUudXJsLCB1c2VfY2FjaGUpOwoJCQlhd2FpdF9sb2FkLnRoZW4ocHVzaF9sb2FkZWQsIHB1c2hfZmFpbGVkKTsKCQl9CgoJCXJldHVybiBpbmNsdWRlX3Byb21pc2U7CgoJCWZ1bmN0aW9uIHB1c2hfbG9hZGVkKHVybCkgewoJCQlsb2FkZWQucHVzaCh1cmwpOwoJCQljaGVja19kb25lKCk7CgkJfQoKCQlmdW5jdGlvbiBwdXNoX2ZhaWxlZCh1cmwpIHsKCQkJZmFpbGVkLnB1c2godXJsKTsKCQkJY2hlY2tfZG9uZSgpOwoJCX0KCgkJZnVuY3Rpb24gY2hlY2tfZG9uZSgpIHsKCQkJaWYgKCsrZG9uZV9jbnQgPCBzY3JpcHRfY250KSByZXR1cm47CgkJCWlmIChmYWlsZWQubGVuZ3RoID09PSAwKSBpbmNsdWRlX3Byb21pc2UucmVzb2x2ZSh7bG9hZGVkOmxvYWRlZCwgZmFpbGVkOmZhaWxlZH0pOwoJCQllbHNlIGluY2x1ZGVfcHJvbWlzZS5yZWplY3Qoe2Vycm9yOidGYWlsdXJlIGxvYWRpbmcgbW9kdWxlJywgbG9hZGVkOmxvYWRlZCwgZmFpbGVkOmZhaWxlZH0pOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gV2FpdCBmb3IgYWxsIG1vZHVsZXMgdG8gcmVwb3J0IHRoYXQgdGhleSBhcmUgcmVhZHkKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiByZWFkeShtb2R1bGVfbGlzdCkgewoJCXZhciBtb2R1bGVfbmFtZXMgPSBzcGxpdF9saXN0KG1vZHVsZV9saXN0KTsKCgkJdmFyIHJlYWR5X3Byb21pc2VzID0gWyBdOwoJCWZvciAodmFyIGlkeCBpbiBtb2R1bGVfbmFtZXMpIHsKCQkJdmFyIG1vZHVsZV9uYW1lID0gbW9kdWxlX25hbWVzW2lkeF07CgkJCXJlYWR5X3Byb21pc2VzLnB1c2god2FpdF9zdGF0ZSgnd2tvZi4nICsgbW9kdWxlX25hbWUsICdyZWFkeScpKTsKCQl9CgoJCWlmIChyZWFkeV9wcm9taXNlcy5sZW5ndGggPT09IDApIHsKCQkJcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwoJCX0gZWxzZSBpZiAocmVhZHlfcHJvbWlzZXMubGVuZ3RoID09PSAxKSB7CgkJCXJldHVybiByZWFkeV9wcm9taXNlc1swXTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gUHJvbWlzZS5hbGwocmVhZHlfcHJvbWlzZXMpOwoJCX0KCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIExvYWQgYSBmaWxlIGFzeW5jaHJvbm91c2x5LCBhbmQgcGFzcyB0aGUgZmlsZSBhcyByZXNvbHZlZCBQcm9taXNlIGRhdGEuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9maWxlKHVybCwgdXNlX2NhY2hlKSB7CgkJdmFyIGZldGNoX3Byb21pc2UgPSBwcm9taXNlKCk7CgkJdmFyIG5vX2NhY2hlID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5sb2FkX2ZpbGUubm9jYWNoZScpIHx8ICcnKTsKCQlpZiAobm9fY2FjaGUuaW5kZXhPZih1cmwpID49IDAgfHwgbm9fY2FjaGUuaW5kZXhPZignKicpID49IDApIHVzZV9jYWNoZSA9IGZhbHNlOwoJCWlmICh1c2VfY2FjaGUgPT09IHRydWUpIHsKCQkJcmV0dXJuIGZpbGVfY2FjaGVfbG9hZCh1cmwsIHVzZV9jYWNoZSkuY2F0Y2goZmV0Y2hfdXJsKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gZmV0Y2hfdXJsKCk7CgkJfQoKCQkvLyBSZXRyaWV2ZSBmaWxlIGZyb20gc2VydmVyCgkJZnVuY3Rpb24gZmV0Y2hfdXJsKCl7CgkJCXZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJCXJlcXVlc3Qub25yZWFkeXN0YXRlY2hhbmdlID0gcHJvY2Vzc19yZXN1bHQ7CgkJCXJlcXVlc3Qub3BlbignR0VUJywgdXJsLCB0cnVlKTsKCQkJcmVxdWVzdC5zZW5kKCk7CgkJCXJldHVybiBmZXRjaF9wcm9taXNlOwoJCX0KCgkJZnVuY3Rpb24gcHJvY2Vzc19yZXN1bHQoZXZlbnQpewoJCQlpZiAoZXZlbnQudGFyZ2V0LnJlYWR5U3RhdGUgIT09IDQpIHJldHVybjsKCQkJaWYgKGV2ZW50LnRhcmdldC5zdGF0dXMgPj0gNDAwIHx8IGV2ZW50LnRhcmdldC5zdGF0dXMgPT09IDApIHJldHVybiBmZXRjaF9wcm9taXNlLnJlamVjdChldmVudC50YXJnZXQuc3RhdHVzKTsKCQkJaWYgKHVzZV9jYWNoZSkgewoJCQkJZmlsZV9jYWNoZV9zYXZlKHVybCwgZXZlbnQudGFyZ2V0LnJlc3BvbnNlKQoJCQkJLnRoZW4oZmV0Y2hfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCxldmVudC50YXJnZXQucmVzcG9uc2UpKTsKCQkJfSBlbHNlIHsKCQkJCWZldGNoX3Byb21pc2UucmVzb2x2ZShldmVudC50YXJnZXQucmVzcG9uc2UpOwoJCQl9CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIGEgc3BlY2lmaWMgZmlsZSB0eXBlIGludG8gdGhlIERPTS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBsb2FkX2FuZF9hcHBlbmQodXJsLCB0YWdfbmFtZSwgbG9jYXRpb24sIHVzZV9jYWNoZSkgewoJCXVybCA9IHVybC5yZXBsYWNlKC8iL2csJ1wnJyk7CgkJaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodGFnX25hbWUrJ1t1aWQ9IicrdXJsKyciXScpICE9PSBudWxsKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CgkJcmV0dXJuIGxvYWRfZmlsZSh1cmwsIHVzZV9jYWNoZSkudGhlbihhcHBlbmRfdG9fdGFnKTsKCgkJZnVuY3Rpb24gYXBwZW5kX3RvX3RhZyhjb250ZW50KSB7CgkJCXZhciB0YWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ19uYW1lKTsKCQkJdGFnLmlubmVySFRNTCA9IGNvbnRlbnQ7CgkJCXRhZy5zZXRBdHRyaWJ1dGUoJ3VpZCcsIHVybCk7CgkJCWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IobG9jYXRpb24pLmFwcGVuZENoaWxkKHRhZyk7CgkJCXJldHVybiB1cmw7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIGEgQ1NTIGZpbGUuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9jc3ModXJsLCB1c2VfY2FjaGUpIHsKCQlyZXR1cm4gbG9hZF9hbmRfYXBwZW5kKHVybCwgJ3N0eWxlJywgJ2hlYWQnLCB1c2VfY2FjaGUpOwoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBMb2FkIGFuZCBpbnN0YWxsIEphdmFzY3JpcHQuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gbG9hZF9zY3JpcHQodXJsLCB1c2VfY2FjaGUpIHsKCQlyZXR1cm4gbG9hZF9hbmRfYXBwZW5kKHVybCwgJ3NjcmlwdCcsICdib2R5JywgdXNlX2NhY2hlKTsKCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJdmFyIHN0YXRlX2xpc3RlbmVycyA9IHt9OwoJdmFyIHN0YXRlX3ZhbHVlcyA9IHt9OwoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBHZXQgdGhlIHZhbHVlIG9mIGEgc3RhdGUgdmFyaWFibGUsIGFuZCBub3RpZnkgbGlzdGVuZXJzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGdldF9zdGF0ZShzdGF0ZV92YXIpIHsKCQlyZXR1cm4gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIFNldCB0aGUgdmFsdWUgb2YgYSBzdGF0ZSB2YXJpYWJsZSwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gc2V0X3N0YXRlKHN0YXRlX3ZhciwgdmFsdWUpIHsKCQl2YXIgb2xkX3ZhbHVlID0gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07CgkJaWYgKG9sZF92YWx1ZSA9PT0gdmFsdWUpIHJldHVybjsKCQlzdGF0ZV92YWx1ZXNbc3RhdGVfdmFyXSA9IHZhbHVlOwoKCQkvLyBEbyBsaXN0ZW5lciBjYWxsYmFja3MsIGFuZCByZW1vdmUgbm9uLXBlcnNpc3RlbnQgbGlzdGVuZXJzCgkJdmFyIGxpc3RlbmVycyA9IHN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdOwoJCXZhciBwZXJzaXN0ZW50X2xpc3RlbmVycyA9IFsgXTsKCQlmb3IgKHZhciBpZHggaW4gbGlzdGVuZXJzKSB7CgkJCXZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpZHhdOwoJCQl2YXIga2VlcCA9IHRydWU7CgkJCWlmIChsaXN0ZW5lci52YWx1ZSA9PT0gdmFsdWUgfHwgbGlzdGVuZXIudmFsdWUgPT09ICcqJykgewoJCQkJa2VlcCA9IGxpc3RlbmVyLnBlcnNpc3RlbnQ7CgkJCQl0cnkgewoJCQkJCWxpc3RlbmVyLmNhbGxiYWNrKHZhbHVlLCBvbGRfdmFsdWUpOwoJCQkJfSBjYXRjaCAoZSkge30KCQkJfQoJCQlpZiAoa2VlcCkgcGVyc2lzdGVudF9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7CgkJfQoJCXN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdID0gcGVyc2lzdGVudF9saXN0ZW5lcnM7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIFdoZW4gc3RhdGUgb2Ygc3RhdGVfdmFyIGNoYW5nZXMgdG8gdmFsdWUsIGNhbGwgY2FsbGJhY2suCgkvLyBJZiBwZXJzaXN0ZW50ID09PSB0cnVlLCBjb250aW51ZSBsaXN0ZW5pbmcgZm9yIGFkZGl0aW9uYWwgc3RhdGUgY2hhbmdlcwoJLy8gSWYgdmFsdWUgaXMgJyonLCBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBmb3IgYWxsIHN0YXRlIGNoYW5nZXMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gd2FpdF9zdGF0ZShzdGF0ZV92YXIsIHZhbHVlLCBjYWxsYmFjaywgcGVyc2lzdGVudCkgewoJCXZhciBwcm9taXNlOwoJCWlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7CgkJCXByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKCQkJCWNhbGxiYWNrID0gcmVzb2x2ZTsKCQkJfSk7CgkJfQoJCWlmIChzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXSA9PT0gdW5kZWZpbmVkKSBzdGF0ZV9saXN0ZW5lcnNbc3RhdGVfdmFyXSA9IFsgXTsKCQlwZXJzaXN0ZW50ID0gKHBlcnNpc3RlbnQgPT09IHRydWUpOwoJCXZhciBjdXJyZW50X3ZhbHVlID0gc3RhdGVfdmFsdWVzW3N0YXRlX3Zhcl07CgkJaWYgKHBlcnNpc3RlbnQgfHwgdmFsdWUgIT09IGN1cnJlbnRfdmFsdWUpIHN0YXRlX2xpc3RlbmVyc1tzdGF0ZV92YXJdLnB1c2goe2NhbGxiYWNrOmNhbGxiYWNrLCBwZXJzaXN0ZW50OnBlcnNpc3RlbnQsIHZhbHVlOnZhbHVlfSk7CgoJCS8vIElmIGl0J3MgYWxyZWFkeSBhdCB0aGUgZGVzaXJlZCBzdGF0ZSwgY2FsbCB0aGUgY2FsbGJhY2sgaW1tZWRpYXRlbHkuCgkJaWYgKHZhbHVlID09PSBjdXJyZW50X3ZhbHVlKSB7CgkJCXRyeSB7CgkJCQljYWxsYmFjayh2YWx1ZSwgY3VycmVudF92YWx1ZSk7CgkJCX0gY2F0Y2ggKGVycikge30KCQl9CgkJcmV0dXJuIHByb21pc2U7Cgl9CgkvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCXZhciBldmVudF9saXN0ZW5lcnMgPSB7fTsKCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gRmlyZSBhbiBldmVudCwgd2hpY2ggdGhlbiBjYWxscyBjYWxsYmFja3MgZm9yIGFueSBsaXN0ZW5lcnMuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gdHJpZ2dlcl9ldmVudChldmVudCkgewoJCXZhciBsaXN0ZW5lcnMgPSBldmVudF9saXN0ZW5lcnNbZXZlbnRdOwoJCWlmIChsaXN0ZW5lcnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuOwoJCXZhciBhcmdzID0gW107CgkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoYXJncyxhcmd1bWVudHMpOwoJCWFyZ3Muc2hpZnQoKTsKCQlmb3IgKHZhciBpZHggaW4gbGlzdGVuZXJzKSB0cnkgewoJCQlsaXN0ZW5lcnNbaWR4XS5hcHBseShudWxsLGFyZ3MpOwoJCX0gY2F0Y2ggKGVycikge30KCQlyZXR1cm4gZ2xvYmFsLndrb2Y7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIEFkZCBhIGxpc3RlbmVyIGZvciBhbiBldmVudC4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiB3YWl0X2V2ZW50KGV2ZW50LCBjYWxsYmFjaykgewoJCWlmIChldmVudF9saXN0ZW5lcnNbZXZlbnRdID09PSB1bmRlZmluZWQpIGV2ZW50X2xpc3RlbmVyc1tldmVudF0gPSBbXTsKCQlldmVudF9saXN0ZW5lcnNbZXZlbnRdLnB1c2goY2FsbGJhY2spOwoJCXJldHVybiBnbG9iYWwud2tvZjsKCX0KCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoJdmFyIGZpbGVfY2FjaGVfb3Blbl9wcm9taXNlOwoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBPcGVuIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlIChvciByZXR1cm4gaGFuZGxlIGlmIG9wZW4pLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfb3BlbigpIHsKCQlpZiAoZmlsZV9jYWNoZV9vcGVuX3Byb21pc2UpIHJldHVybiBmaWxlX2NhY2hlX29wZW5fcHJvbWlzZTsKCQl2YXIgb3Blbl9wcm9taXNlID0gcHJvbWlzZSgpOwoJCWZpbGVfY2FjaGVfb3Blbl9wcm9taXNlID0gb3Blbl9wcm9taXNlOwoJCXZhciByZXF1ZXN0OwoJCXJlcXVlc3QgPSBpbmRleGVkREIub3Blbignd2tvZi5maWxlX2NhY2hlJyk7CgkJcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSB1cGdyYWRlX2RiOwoJCXJlcXVlc3Qub25zdWNjZXNzID0gZ2V0X2RpcjsKCQlyZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvcjsKCQlyZXR1cm4gb3Blbl9wcm9taXNlOwoKCQlmdW5jdGlvbiBlcnJvcigpIHsKCQkJY29uc29sZS5sb2coJ2luZGV4ZWREQiBjb3VsZCBub3Qgb3BlbiEnKTsKCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IHt9OwoJCQlpZiAoaWdub3JlX21pc3NpbmdfaW5kZXhlZGRiKSB7CgkJCQlvcGVuX3Byb21pc2UucmVzb2x2ZShudWxsKTsKCQkJfSBlbHNlIHsKCQkJCW9wZW5fcHJvbWlzZS5yZWplY3QoKTsKCQkJfQoJCX0KCgkJZnVuY3Rpb24gdXBncmFkZV9kYihldmVudCl7CgkJCXZhciBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgkJCXZhciBzdG9yZSA9IGRiLmNyZWF0ZU9iamVjdFN0b3JlKCdmaWxlcycsIHtrZXlQYXRoOiduYW1lJ30pOwoJCX0KCgkJZnVuY3Rpb24gZ2V0X2RpcihldmVudCl7CgkJCXZhciBkYiA9IGV2ZW50LnRhcmdldC5yZXN1bHQ7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkb25seScpOwoJCQl2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnZmlsZXMnKTsKCQkJdmFyIHJlcXVlc3QgPSBzdG9yZS5nZXQoJ1tkaXJdJyk7CgkJCXJlcXVlc3Qub25zdWNjZXNzID0gcHJvY2Vzc19kaXI7CgkJCXRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBvcGVuX3Byb21pc2UucmVzb2x2ZS5iaW5kKG51bGwsIGRiKTsKCQkJb3Blbl9wcm9taXNlLnRoZW4oc2V0VGltZW91dC5iaW5kKG51bGwsIGZpbGVfY2FjaGVfY2xlYW51cCwgMTAwMDApKTsKCQl9CgoJCWZ1bmN0aW9uIHByb2Nlc3NfZGlyKGV2ZW50KXsKCQkJaWYgKGV2ZW50LnRhcmdldC5yZXN1bHQgPT09IHVuZGVmaW5lZCkgewoJCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IHt9OwoJCQl9IGVsc2UgewoJCQkJd2tvZi5maWxlX2NhY2hlLmRpciA9IEpTT04ucGFyc2UoZXZlbnQudGFyZ2V0LnJlc3VsdC5jb250ZW50KTsKCQkJfQoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gTGlzdHMgdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGVfY2FjaGUuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9saXN0KCkgewoJCWNvbnNvbGUubG9nKE9iamVjdC5rZXlzKHdrb2YuZmlsZV9jYWNoZS5kaXIpLnNvcnQoKS5qb2luKCdcbicpKTsKCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gQ2xlYXIgdGhlIGZpbGVfY2FjaGUgZGF0YWJhc2UuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9jbGVhcigpIHsKCQlyZXR1cm4gZmlsZV9jYWNoZV9vcGVuKCkudGhlbihjbGVhcik7CgoJCWZ1bmN0aW9uIGNsZWFyKGRiKSB7CgkJCXZhciBjbGVhcl9wcm9taXNlID0gcHJvbWlzZSgpOwoJCQl3a29mLmZpbGVfY2FjaGUuZGlyID0ge307CgkJCWlmIChkYiA9PT0gbnVsbCkgcmV0dXJuIGNsZWFyX3Byb21pc2UucmVzb2x2ZSgpOwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZHdyaXRlJyk7CgkJCXZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdmaWxlcycpOwoJCQlzdG9yZS5jbGVhcigpOwoJCQl0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gY2xlYXJfcHJvbWlzZS5yZXNvbHZlOwoJCX0KCX0KCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJLy8gRGVsZXRlIGEgZmlsZSBmcm9tIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfZGVsZXRlKHBhdHRlcm4pIHsKCQlyZXR1cm4gZmlsZV9jYWNoZV9vcGVuKCkudGhlbihkZWwpOwoKCQlmdW5jdGlvbiBkZWwoZGIpIHsKCQkJdmFyIGRlbF9wcm9taXNlID0gcHJvbWlzZSgpOwoJCQlpZiAoZGIgPT09IG51bGwpIHJldHVybiBkZWxfcHJvbWlzZS5yZXNvbHZlKCk7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkd3JpdGUnKTsKCQkJdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ2ZpbGVzJyk7CgkJCXZhciBmaWxlcyA9IE9iamVjdC5rZXlzKHdrb2YuZmlsZV9jYWNoZS5kaXIpLmZpbHRlcihmdW5jdGlvbihmaWxlKXsKCQkJCWlmIChwYXR0ZXJuIGluc3RhbmNlb2YgUmVnRXhwKSB7CgkJCQkJcmV0dXJuIGZpbGUubWF0Y2gocGF0dGVybikgIT09IG51bGw7CgkJCQl9IGVsc2UgewoJCQkJCXJldHVybiAoZmlsZSA9PT0gcGF0dGVybik7CgkJCQl9CgkJCX0pOwoJCQlmaWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGZpbGUpewoJCQkJc3RvcmUuZGVsZXRlKGZpbGUpOwoJCQkJZGVsZXRlIHdrb2YuZmlsZV9jYWNoZS5kaXJbZmlsZV07CgkJCX0pOwoJCQlmaWxlX2NhY2hlX2Rpcl9zYXZlKCk7CgkJCXRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBkZWxfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCwgZmlsZXMpOwoJCQlyZXR1cm4gZGVsX3Byb21pc2U7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBGb3JjZSBpbW1lZGlhdGUgc2F2ZSBvZiBmaWxlX2NhY2hlIGRpcmVjdG9yeS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX2ZsdXNoKCkgewoJCWZpbGVfY2FjaGVfZGlyX3NhdmUodHJ1ZSAvKiBpbW1lZGlhdGVseSAqLyk7Cgl9CgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIExvYWQgYSBmaWxlIGZyb20gdGhlIGZpbGVfY2FjaGUgZGF0YWJhc2UuCgkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoJZnVuY3Rpb24gZmlsZV9jYWNoZV9sb2FkKG5hbWUpIHsKCQl2YXIgbG9hZF9wcm9taXNlID0gcHJvbWlzZSgpOwoJCXJldHVybiBmaWxlX2NhY2hlX29wZW4oKS50aGVuKGxvYWQpOwoKCQlmdW5jdGlvbiBsb2FkKGRiKSB7CgkJCWlmICh3a29mLmZpbGVfY2FjaGUuZGlyW25hbWVdID09PSB1bmRlZmluZWQpIHsKCQkJCWxvYWRfcHJvbWlzZS5yZWplY3QobmFtZSk7CgkJCQlyZXR1cm4gbG9hZF9wcm9taXNlOwoJCQl9CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkb25seScpOwoJCQl2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgnZmlsZXMnKTsKCQkJdmFyIHJlcXVlc3QgPSBzdG9yZS5nZXQobmFtZSk7CgkJCXdrb2YuZmlsZV9jYWNoZS5kaXJbbmFtZV0ubGFzdF9sb2FkZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7CgkJCWZpbGVfY2FjaGVfZGlyX3NhdmUoKTsKCQkJcmVxdWVzdC5vbnN1Y2Nlc3MgPSBmaW5pc2g7CgkJCXJlcXVlc3Qub25lcnJvciA9IGVycm9yOwoJCQlyZXR1cm4gbG9hZF9wcm9taXNlOwoKCQkJZnVuY3Rpb24gZmluaXNoKGV2ZW50KXsKCQkJCWlmIChldmVudC50YXJnZXQucmVzdWx0ID09PSB1bmRlZmluZWQpIHsKCQkJCQlsb2FkX3Byb21pc2UucmVqZWN0KG5hbWUpOwoJCQkJfSBlbHNlIHsKCQkJCQlsb2FkX3Byb21pc2UucmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0LmNvbnRlbnQpOwoJCQkJfQoJCQl9CgoJCQlmdW5jdGlvbiBlcnJvcihldmVudCl7CgkJCQlsb2FkX3Byb21pc2UucmVqZWN0KG5hbWUpOwoJCQl9CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTYXZlIGEgZmlsZSBpbnRvIHRoZSBmaWxlX2NhY2hlIGRhdGFiYXNlLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfY2FjaGVfc2F2ZShuYW1lLCBjb250ZW50LCBleHRyYV9hdHRyaWJzKSB7CgkJcmV0dXJuIGZpbGVfY2FjaGVfb3BlbigpLnRoZW4oc2F2ZSk7CgoJCWZ1bmN0aW9uIHNhdmUoZGIpIHsKCQkJdmFyIHNhdmVfcHJvbWlzZSA9IHByb21pc2UoKTsKCQkJaWYgKGRiID09PSBudWxsKSByZXR1cm4gc2F2ZV9wcm9taXNlLnJlc29sdmUobmFtZSk7CgkJCXZhciB0cmFuc2FjdGlvbiA9IGRiLnRyYW5zYWN0aW9uKCdmaWxlcycsICdyZWFkd3JpdGUnKTsKCQkJdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoJ2ZpbGVzJyk7CgkJCXN0b3JlLnB1dCh7bmFtZTpuYW1lLGNvbnRlbnQ6Y29udGVudH0pOwoJCQl2YXIgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpOwoJCQl3a29mLmZpbGVfY2FjaGUuZGlyW25hbWVdID0gT2JqZWN0LmFzc2lnbih7YWRkZWQ6bm93LCBsYXN0X2xvYWRlZDpub3d9LCBleHRyYV9hdHRyaWJzKTsKCQkJZmlsZV9jYWNoZV9kaXJfc2F2ZSh0cnVlIC8qIGltbWVkaWF0ZWx5ICovKTsKCQkJdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9IHNhdmVfcHJvbWlzZS5yZXNvbHZlLmJpbmQobnVsbCwgbmFtZSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBTYXZlIGEgdGhlIGZpbGVfY2FjaGUgZGlyZWN0b3J5IGNvbnRlbnRzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCXZhciBmY19zeW5jX3RpbWVyOwoJZnVuY3Rpb24gZmlsZV9jYWNoZV9kaXJfc2F2ZShpbW1lZGlhdGVseSkgewoJCWlmIChmY19zeW5jX3RpbWVyICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dChmY19zeW5jX3RpbWVyKTsKCQl2YXIgZGVsYXkgPSAoaW1tZWRpYXRlbHkgPyAwIDogMjAwMCk7CgkJZmNfc3luY190aW1lciA9IHNldFRpbWVvdXQoc2F2ZSwgZGVsYXkpOwoKCQlmdW5jdGlvbiBzYXZlKCl7CgkJCWZpbGVfY2FjaGVfb3BlbigpLnRoZW4oc2F2ZTIpOwoJCX0KCgkJZnVuY3Rpb24gc2F2ZTIoZGIpewoJCQlmY19zeW5jX3RpbWVyID0gdW5kZWZpbmVkOwoJCQl2YXIgdHJhbnNhY3Rpb24gPSBkYi50cmFuc2FjdGlvbignZmlsZXMnLCAncmVhZHdyaXRlJyk7CgkJCXZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKCdmaWxlcycpOwoJCQlzdG9yZS5wdXQoe25hbWU6J1tkaXJdJyxjb250ZW50OkpTT04uc3RyaW5naWZ5KHdrb2YuZmlsZV9jYWNoZS5kaXIpfSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBSZW1vdmUgZmlsZXMgdGhhdCBoYXZlbid0IGJlZW4gYWNjZXNzZWQgaW4gYSB3aGlsZS4KCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBmaWxlX2NhY2hlX2NsZWFudXAoKSB7CgkJdmFyIHRocmVzaG9sZCA9IG5ldyBEYXRlKCkgLSAxNCo4NjQwMDAwMDsgLy8gMTQgZGF5cwoJCXZhciBvbGRfZmlsZXMgPSBbXTsKCQlmb3IgKHZhciBmbmFtZSBpbiB3a29mLmZpbGVfY2FjaGUuZGlyKSB7CgkJCWlmIChmbmFtZS5tYXRjaCgvXndrb2ZcLnNldHRpbmdzXC4vKSkgY29udGludWU7IC8vIERvbid0IGZsdXNoIHNldHRpbmdzIGZpbGVzLgoJCQl2YXIgZmRhdGUgPSBuZXcgRGF0ZSh3a29mLmZpbGVfY2FjaGUuZGlyW2ZuYW1lXS5sYXN0X2xvYWRlZCk7CgkJCWlmIChmZGF0ZSA8IHRocmVzaG9sZCkgb2xkX2ZpbGVzLnB1c2goZm5hbWUpOwoJCX0KCQlpZiAob2xkX2ZpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoJCWNvbnNvbGUubG9nKCdDbGVhbmluZyBvdXQgJytvbGRfZmlsZXMubGVuZ3RoKycgb2xkIGZpbGUocykgZnJvbSAid2tvZi5maWxlX2NhY2hlIjonKTsKCQlmb3IgKHZhciBmbnVtIGluIG9sZF9maWxlcykgewoJCQljb25zb2xlLmxvZygnICAnKyhOdW1iZXIoZm51bSkrMSkrJzogJytvbGRfZmlsZXNbZm51bV0pOwoJCQl3a29mLmZpbGVfY2FjaGUuZGVsZXRlKG9sZF9maWxlc1tmbnVtXSk7CgkJfQoJfQoKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgkvLyBQcm9jZXNzIG5vLWNhY2hlIHJlcXVlc3RzLgoJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCWZ1bmN0aW9uIGZpbGVfbm9jYWNoZShsaXN0KSB7CgkJaWYgKGxpc3QgPT09IHVuZGVmaW5lZCkgewoJCQlsaXN0ID0gc3BsaXRfbGlzdChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2tvZi5pbmNsdWRlLm5vY2FjaGUnKSB8fCAnJyk7CgkJCWxpc3QgPSBsaXN0LmNvbmNhdChzcGxpdF9saXN0KGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3a29mLmxvYWRfZmlsZS5ub2NhY2hlJykgfHwgJycpKTsKCQkJY29uc29sZS5sb2cobGlzdC5qb2luKCcsJykpOwoJCX0gZWxzZSBpZiAodHlwZW9mIGxpc3QgPT09ICdzdHJpbmcnKSB7CgkJCXZhciBub19jYWNoZSA9IHNwbGl0X2xpc3QobGlzdCk7CgkJCXZhciBpZHgsIG1vZHVsZXMgPSBbXSwgdXJscyA9IFtdOwoJCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG5vX2NhY2hlLmxlbmd0aDsgaWR4KyspIHsKCQkJCXZhciBpdGVtID0gbm9fY2FjaGVbaWR4XTsKCQkJCWlmIChzdXBwb3J0ZWRfbW9kdWxlc1tpdGVtXSAhPT0gdW5kZWZpbmVkKSB7CgkJCQkJbW9kdWxlcy5wdXNoKGl0ZW0pOwoJCQkJfSBlbHNlIHsKCQkJCQl1cmxzLnB1c2goaXRlbSk7CgkJCQl9CgkJCX0KCQkJY29uc29sZS5sb2coJ01vZHVsZXM6ICcrbW9kdWxlcy5qb2luKCcsJykpOwoJCQljb25zb2xlLmxvZygnICAgVVJMczogJyt1cmxzLmpvaW4oJywnKSk7CgkJCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCd3a29mLmluY2x1ZGUubm9jYWNoZScsIG1vZHVsZXMuam9pbignLCcpKTsKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3drb2YubG9hZF9maWxlLm5vY2FjaGUnLCB1cmxzLmpvaW4oJywnKSk7CgkJfQoJfQoKCWZ1bmN0aW9uIGRvY19yZWFkeSgpIHsKCQl3a29mLnNldF9zdGF0ZSgnd2tvZi5kb2N1bWVudCcsICdyZWFkeScpOwoJfQoKCS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgkvLyBCb290bG9hZGVyIFN0YXJ0dXAKCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCglmdW5jdGlvbiBzdGFydHVwKCkgewoJCWdsb2JhbC53a29mID0gcHVibGlzaGVkX2ludGVyZmFjZTsKCgkJLy8gTWFyayBkb2N1bWVudCBzdGF0ZSBhcyAncmVhZHknLgoJCWlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CgkJCWRvY19yZWFkeSgpOwoJCX0gZWxzZSB7CgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZG9jX3JlYWR5LCBmYWxzZSk7ICAvLyBOb3RpZnkgbGlzdGVuZXJzIHRoYXQgd2UgYXJlIHJlYWR5LgoJCX0KCgkJLy8gT3BlbiBjYWNoZSwgc28gd2tvZi5maWxlX2NhY2hlLmRpciBpcyBhdmFpbGFibGUgdG8gY29uc29sZSBpbW1lZGlhdGVseS4KCQlmaWxlX2NhY2hlX29wZW4oKTsKCQl3a29mLnNldF9zdGF0ZSgnd2tvZi53a29mJywgJ3JlYWR5Jyk7Cgl9CglzdGFydHVwKCk7Cgp9KSh3aW5kb3cpOwo=" 47 + "uuid": "e6f9fcca-44eb-425c-b066-541eb962863d" 91 48 }, 92 49 { 50 + "enabled": false, 51 + "file_url": "https://userscripts-mirror.org/scripts/source/174135.user.js", 93 52 "name": "WaniKani Improve", 94 53 "options": { 54 + "awareOfChrome": false, 95 55 "check_for_updates": true, 96 56 "comment": null, 97 - "compatopts_for_requires": true, 98 - "compat_wrappedjsobject": false, 57 + "compat_arrayleft": false, 58 + "compat_foreach": false, 59 + "compat_forvarin": false, 99 60 "compat_metadata": false, 100 - "compat_foreach": false, 101 - "compat_arrayleft": false, 61 + "compat_powerful_this": null, 102 62 "compat_uW_gmonkey": false, 103 - "compat_forvarin": false, 63 + "compat_wrappedjsobject": false, 64 + "compatopts_for_requires": true, 104 65 "noframes": null, 105 - "awareOfChrome": false, 106 - "run_at": null, 107 66 "override": { 108 - "use_includes": [], 67 + "merge_connects": true, 68 + "merge_excludes": true, 69 + "merge_includes": true, 70 + "merge_matches": true, 71 + "orig_excludes": [], 109 72 "orig_includes": [ 110 73 "https://www.wanikani.com/review/session", 111 74 "http://www.wanikani.com/review/session" 112 75 ], 113 - "merge_includes": true, 114 - "use_matches": [], 115 76 "orig_matches": [], 116 - "merge_matches": true, 77 + "orig_noframes": null, 78 + "orig_run_at": "document-end", 79 + "use_blockers": [], 80 + "use_connects": [], 117 81 "use_excludes": [], 118 - "orig_excludes": [], 119 - "merge_excludes": true, 120 - "use_connects": [], 121 - "merge_connects": true, 122 - "use_blockers": [], 123 - "orig_run_at": "document-end", 124 - "orig_noframes": null 125 - } 82 + "use_includes": [], 83 + "use_matches": [] 84 + }, 85 + "run_at": null, 86 + "tab_types": null 126 87 }, 127 - "storage": { 128 - "data": {}, 129 - "ts": 1607436649591 130 - }, 131 - "enabled": true, 132 - "position": 3, 133 - "file_url": "https://userscripts-mirror.org/scripts/source/174135.user.js", 134 - "uuid": "38820d1c-0915-49b6-a73f-2b2d2f9cfbd9", 135 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgV2FuaUthbmkgSW1wcm92ZQovLyBAbmFtZXNwYWNlIGh0dHA6Ly93d3cubWljaGFlbGZyYW5rLmNvbS5ici93YW5pa2FuaV9pbXByb3ZlLwovLyBAaW5jbHVkZSBodHRwczovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24KLy8gQGluY2x1ZGUgaHR0cDovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24KLy8gQHZlcnNpb24gMi4yLjIKLy8gQGdyYW50IEdNX2FkZFN0eWxlCi8vIEBncmFudCBHTV9nZXRSZXNvdXJjZVRleHQKLy8gQHJ1bi1hdCBkb2N1bWVudC1lbmQKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzIuMC4zL2pxdWVyeS5taW4uanMKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvcXRpcDIvMi4yLjAvanF1ZXJ5LnF0aXAubWluLmpzCi8vIEByZXNvdXJjZSBxdGlwQ1NTIGh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3F0aXAyLzIuMi4wL2pxdWVyeS5xdGlwLm1pbi5jc3MKLy8gPT0vVXNlclNjcmlwdD09Cgp2YXIgcXRpcENTUyA9IEdNX2dldFJlc291cmNlVGV4dCgicXRpcENTUyIpOwpHTV9hZGRTdHlsZShxdGlwQ1NTKTsKCiQualN0b3JhZ2UgPSB1bnNhZmVXaW5kb3cuJC5qU3RvcmFnZTsKCnZhciB3a2lfc2V0dGluZ3MgPSAkLmpTdG9yYWdlLmdldCgnd2tpX3NldHRpbmdzJyk7CgppZih3a2lfc2V0dGluZ3MgPT09IG51bGwpCnsKICAgIHdraV9zZXR0aW5ncyA9ICh7CiAgICAgICAgJ3draV90aW1lcl9zaG93X25leHRfaXRlbScgOiAwLAogICAgICAgICd3a2lfYnV0dG9uX2xhYmVsX2JnY29sb3InOiAnI0EyQTJBMicsCiAgICAgICAgJ3draV9idXR0b25fbGFiZWxfdGV4dGNvbG9yJyA6ICcjRkZGRkZGJywKICAgICAgICAnd2tpX2NvbWJvX2Rpc3BsYXknIDogdHJ1ZSwKICAgICAgICAnd2tpX3Nyc19sZXZlbHVwX2Rpc3BsYXknIDogdHJ1ZSwKICAgICAgICAnd2tpX2F1dG9fc2hvd19pbmZvJyA6IHRydWUsCiAgICAgICAgJ3draV9hdWRpb19hdXRvcGxheScgOiBmYWxzZQogICAgfSk7CiAgICBjb25zb2xlLmxvZygnV0tJOiBTZXR0aW5ncyBub3QgZm91bmQnKTsKfQplbHNlCnsKICAgIGNvbnNvbGUubG9nKCdXS0k6IFNldHRpbmdzIGZvdW5kJyk7CiAgICB3a2lfc2V0dGluZ3MgPSAkLnBhcnNlSlNPTih3a2lfc2V0dGluZ3MpOwp9Cgp2YXIgd2tpX2hpdF9jb21ibyA9IDA7CnZhciB3a2lfY29tYm9fcmVjb3JkID0gJC5qU3RvcmFnZS5nZXQoJ3draV9jb21ib19yZWNvcmQnKTsKCnZhciB3a2lfY3VycmVudF9pdGVtID0gJyc7CnZhciB3a2lfY3VycmVudF90eXBlID0gJyc7CnZhciB3a2lfY3VycmVudF9xdWVzdGlvbl90eXBlID0gJyc7CnZhciB3a2lfcHJldmlvdXNfaXRlbSA9ICcnOwp2YXIgd2tpX3ByZXZpb3VzX3R5cGUgPSAnJzsKdmFyIHdraV9wcmV2aW91c19xdWVzdGlvbl90eXBlID0gJyc7CnZhciB3a2lfcHJldmlvdXNfaXRlbV91cmwgPSAnJzsKdmFyIHdraV9zdWJtaXR0ZWRfYW5zd2VyID0gJyc7Cgp2YXIgd2tpX2pzdG9yZWRfY3VycmVudF9pdGVtID0gJyc7CnZhciB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtID0gJyc7Cgp2YXIgd2tpX2l0ZW1zX2FycmF5ID0gbmV3IEFycmF5KCk7Cgp2YXIgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3JlY2VpdmVkID0gZmFsc2U7CnZhciB3a2lfZXhjZXB0aW9uX21lc3NhZ2VfdHlwZSA9IDA7CnZhciB3a2lfYW5zd2VyX2V4Y2VwdGlvbl9tZXNzYWdlID0gbmV3IEFycmF5KCk7CndraV9hbnN3ZXJfZXhjZXB0aW9uX21lc3NhZ2VbMF0gPSAnQ2hlY2sgdGhlIHByZXZpb3VzIGl0ZW0nOwp3a2lfYW5zd2VyX2V4Y2VwdGlvbl9tZXNzYWdlWzFdID0gJ1lvdXIgYW5zd2VyIHdhcyBhIGJpdCBvZmYnOwp3a2lfYW5zd2VyX2V4Y2VwdGlvbl9tZXNzYWdlWzJdID0gJ1RoZXJlIGFyZSBvdGhlciBwb3NzaWJsZSByZWFkaW5ncyc7CndraV9hbnN3ZXJfZXhjZXB0aW9uX21lc3NhZ2VbM10gPSAnVGhlcmUgYXJlIG90aGVyIHBvc3NpYmxlIG1lYW5pbmdzJzsKCnZhciB3a2lfc3JzX2xldmVsID0gbmV3IEFycmF5KCk7CndraV9zcnNfbGV2ZWxbMF0gPSAnJzsgLy8gRXZlcnkgaXRlbSBzdGFydHMgb24gMQp3a2lfc3JzX2xldmVsWzFdID0gJyc7CndraV9zcnNfbGV2ZWxbMl0gPSAnJzsKd2tpX3Nyc19sZXZlbFszXSA9ICcnOwp3a2lfc3JzX2xldmVsWzRdID0gJyc7CndraV9zcnNfbGV2ZWxbNV0gPSAnR3VydSc7CndraV9zcnNfbGV2ZWxbNl0gPSAnJzsKd2tpX3Nyc19sZXZlbFs3XSA9ICdNYXN0ZXInOwp3a2lfc3JzX2xldmVsWzhdID0gJ0VubGlnaHRlbmVkJzsKd2tpX3Nyc19sZXZlbFs5XSA9ICdCdXJuZWQnOwp3a2lfc3JzX2xldmVsWzEwXSA9ICcnOyAvLyBTUlMgMTAgZG9lcyBub3QgZXhpc3QKCnZhciBzcnNfd3JhcHBlcl90b3AgPSAwOwp2YXIgc3JzX3dyYXBwZXJfdXBwZXIgPSAwOwoKJCgnPGxpIGlkPSJ3a2lfYnV0dG9uIiBjbGFzcz0id2tpX2RlZmF1bHRfY3Vyc29yIGRpc2FibGVkIj48ZGl2IGlkPSJ3a2lfbWltaWNfYnV0dG9uIj48ZGl2IGNsYXNzPSJ3a2lfaXRlbV93cmFwcGVyIj48ZGl2IGxhbmc9ImphIiBjbGFzcz0id2tpX2J1dHRvbl9pdGVtX2xhYmVsIj48ZGl2IGNsYXNzPSJ3a2lfc3RhcnRfbWVzc2FnZSI+UHJldmlvdXMgaXRlbTwvZGl2PjwvZGl2PjwvZGl2PjxpIGNsYXNzPSJpY29uLWluZm8tc2lnbiI+PC9pPjwvbGk+JykuaW5zZXJ0QWZ0ZXIoJyNvcHRpb24td3JhcC11cCcpOwokKCc8ZGl2IGlkPSJ3a2lfc3JzX3BvcHVwX3dyYXBwZXIiPjxkaXYgY2xhc3M9IndraV9zcnNfcG9wdXBfaWNvbiI+PGkgY2xhc3M9Imljb24tYXJyb3ctdXAiPjwvaT48L2Rpdj48ZGl2IGlkPSJ3a2lfc3JzX3BvcHVwX21lc3NhZ2UiPjwvZGl2PjwvZGl2PicpLmFwcGVuZFRvKCdib2R5Jyk7CgokKCc8c3BhbiBpZD0id2tpX2NvbWJvX2Rpc3BsYXkiPjxpIGNsYXNzPSJpY29uLXRyb3BoeSI+PC9pPjxzcGFuIGlkPSJ3a2lfY29tYm8iIHRpdGxlPSJDdXJyZW50IGNvbWJvIG9mIHJpZ2h0IGFuc3dlcnMiPjA8L3NwYW4+IDxzcGFuIGlkPSJ3a2lfY29tYm9fcmVjb3JkIiB0aXRsZT0iUmVjb3JkIG9mIHJpZ2h0IGFuc3dlcnMgaW4gYSByb3ciPjwvc3Bhbj48L3NwYW4+ICcpLmluc2VydEJlZm9yZSgnI3N0YXRzIGkuaWNvbi10aHVtYnMtdXAnKTsKCiQoJzxkaXYgaWQ9IndraV9jb25maWdfYnV0dG9uIj48c3BhbiBjbGFzcz0id2tpX3Rvb2x0aXAiIHJlbD0id2tpX3NldHRpbmdzX2luZm8iPjxzcGFuIGlkPSJ3a2lfc2V0dGluZ3NfaW5mbyIgY2xhc3M9IndraV9oaWRkZW4iPkNsaWNrIHRvIGFjY2VzcyBXYW5pS2FuaSBJbXByb3ZlIHNldHRpbmdzIG1lbnU8L3NwYW4+PGkgY2xhc3M9Imljb24tY29ncyI+PC9pPiBXS0kgMi4yLjI8L3NwYW4+PC9kaXY+JykuaW5zZXJ0QmVmb3JlKCcjaG90a2V5cycpOwoKJCgnPGRpdiBpZD0id2tpX21vZGFsX2JhY2tncm91bmQiPjwvZGl2PicpLmNzcyh7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLCBsZWZ0OiAwLCBoZWlnaHQ6ICQoZG9jdW1lbnQpLmhlaWdodCgpLCB3aWR0aDogJzEwMCUnLCBvcGFjaXR5OiAwLjcsIGJhY2tncm91bmRDb2xvcjogJyMwMDAwMDAnLCB6SW5kZXg6IDUwMDAsIGRpc3BsYXk6ICdub25lJyB9KS5hcHBlbmRUbygnYm9keScpOwoKJCgnPHN0eWxlIHR5cGU9InRleHQvY3NzIj4ud2tpX2hpZGRlbiB7IGRpc3BsYXk6IG5vbmU7IH0gLndraV9zZXR0aW5nc19zYXZlZCB7IHdpZHRoOiAzNTBweDsgcGFkZGluZzogMTBweDsgZm9udC1zaXplOiAxNnB4OyBkaXNwbGF5OiBub25lOyB9IC53a2lfc2V0dGluZ3NfZGlzY2FyZGVkIHsgd2lkdGg6IDM1MHB4OyBwYWRkaW5nOiAxMHB4OyBmb250LXNpemU6IDE2cHg7IGRpc3BsYXk6IG5vbmU7ICB9ICAud2tpX2NsZWFyIHsgY2xlYXI6IGJvdGg7fSAud2tpX2J0biB7IGNvbG9yOiByZ2IoMTUzLCAxNTMsIDE1Myk7IGZvbnQtZmFtaWx5OiAiVWJ1bnR1IixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpIHJnYmEoMCwgMCwgMCwgMC4xNSkgcmdiYSgwLCAwLCAwLCAwLjI1KTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiA0cHggMTJweDsgbWFyZ2luOiA1cHggMCAwOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGN1cnNvcjogcG9pbnRlcjsgIHRleHQtc2hhZG93OiAwcHggMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ1LCAyNDUsIDI0NSk7IGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYigyNTUsIDI1NSwgMjU1KSwgcmdiKDIzMCwgMjMwLCAyMzApKTsgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyBib3JkZXItd2lkdGg6IDFweDsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWNvbG9yOiByZ2IoMTg3LCAxODcsIDE4NykgcmdiKDE4NywgMTg3LCAxODcpIHJnYigxNjIsIDE2MiwgMTYyKTsgLW1vei1ib3JkZXItdG9wLWNvbG9yczogbm9uZTsgLW1vei1ib3JkZXItcmlnaHQtY29sb3JzOiBub25lOyAtbW96LWJvcmRlci1ib3R0b20tY29sb3JzOiBub25lOyAtbW96LWJvcmRlci1sZWZ0LWNvbG9yczogbm9uZTsgYm9yZGVyLWltYWdlOiBub25lOyBib3JkZXItcmFkaXVzOiA0cHg7IGJveC1zaGFkb3c6IDBweCAxcHggMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSBpbnNldCwgMHB4IDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTt9IC53a2lfYnRuOmhvdmVyIHsgY29sb3I6ICM3Nzc3Nzc7IGJveC1zaGFkb3c6IDBweCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsgfSAud2tpX3NldHRpbmdzX2Zvcm0geyB3aWR0aDogMzUwcHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgbGlzdC1zdHlsZS10eXBlOiBub25lO30gLndraV9zZXR0aW5nc19mb3JtIGxpIHsgcGFkZGluZzogMTBweCAwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWRlZGVkOyB9IC53a2lfc2V0dGluZ3NfZm9ybSBsaTpsYXN0LWNoaWxkIHsgYm9yZGVyLWJvdHRvbTogMDt9IC53a2lfc2V0dGluZ3NfZm9ybSBpbnB1dFt0eXBlPSJ0ZXh0Il0geyB3aWR0aDogOTglOyBtYXJnaW46IDhweCAwIDAgMDsgfSAud2tpX3NldHRpbmdzX2Zvcm0gaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7IG1hcmdpbjogM3B4IDVweCA1cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH0gICN3a2lfY29uZmlnX2J1dHRvbiB7Y3Vyc29yOiBwb2ludGVyOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDEwcHg7IGNvbG9yOiByZ2IoMTM2LCAxMzYsIDEzNik7IGZvbnQtc2l6ZTogMC44MTI1ZW07IHZlcnRpY2FsLWFsaWduOiBib3R0b207fSAjd2tpX3Nyc19wb3B1cF93cmFwcGVyIHt3aWR0aDogMTIxcHg7IGhlaWdodDogMzBweDsgcG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMTsgb3BhY2l0eTogMDsgfSAud2tpX3Nyc19wb3B1cF9pY29uIHsgd2lkdGg6IDMwcHg7IGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNXB4IDA7IGZsb2F0OiBsZWZ0OyB9ICN3a2lfc3JzX3BvcHVwX21lc3NhZ2UgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB3aGl0ZTsgZmxvYXQ6IHJpZ2h0OyBwYWRkaW5nOiA1cHg7IHdpZHRoOiA4MXB4OyB0ZXh0LXNoYWRvdzogMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEpOyB9IC53a2lfc3JzX2FwcHJlbnRpY2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjMwMEEyOyB9IC53a2lfc3JzX2d1cnUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjOUUzNEI3OyB9IC53a2lfc3JzX21hc3RlciB7IGJhY2tncm91bmQtY29sb3I6ICM0OTY3RTA7IH0gLndraV9zcnNfZW5saWdodG5lZCB7IGJhY2tncm91bmQtY29sb3I6ICMwMEEyRjM7IH0gLndraV9zcnNfYnVybmVkIHsgYmFja2dyb3VuZC1jb2xvcjogIzRFNEU0RTsgfSAud2tpX2RlZmF1bHRfY3Vyc29yIHsgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7IH0gLndraV9zdGFydF9tZXNzYWdleyBjb2xvcjogYmxhY2s7IGRpc3BsYXk6IGlubGluZTt9ICAjd2tpX2J1dHRvbiB7IHZlcnRpY2FsLWFsaWduOiBib3R0b207IGN1cnNvcjogcG9pbnRlcjsgfSAjd2tpX2J1dHRvbiBpIHttYXJnaW46IDEzcHggYXV0bzsgd2lkdGg6IDE4JTsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMTBweDsgdG9wOiAwOyB9ICN3a2lfbWltaWNfYnV0dG9uIHttYXJnaW4tcmlnaHQ6IDEwcHg7IGJhY2tncm91bmQtY29sb3I6IHJnYigyNTEsIDI1MSwgMjUxKTsgY29sb3I6IHJnYigxMzYsIDEzNiwgMTM2KTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBib3gtc2hhZG93OiAzcHggM3B4IDBweCByZ2IoMjI1LCAyMjUsIDIyNSk7fSAud2tpX2J1dHRvbl9pdGVtX2xhYmVsIHsgcGFkZGluZzogMTBweCAwIDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogJyArIHdraV9zZXR0aW5ncy53a2lfYnV0dG9uX2xhYmVsX3RleHRjb2xvciArICc7IHRleHQtc2hhZG93OiAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMSk7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvcGFjaXR5OiAwLjU7IH0gLndraV9idXR0b25faXRlbV9sYWJlbDpob3ZlciB7IG9wYWNpdHk6IDE7IH0gLndraV9pdGVtX3dyYXBwZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyB3aWR0aDogODAlOyB9IC53a2lfdm9jYWJ1bGFyeSB7IGJhY2tncm91bmQtY29sb3I6ICNBQTAwRkY7IH0gLndraV9rYW5qaSB7IGJhY2tncm91bmQtY29sb3I6ICNGRjAwQUE7IH0gLndraV9yYWRpY2FsIHsgYmFja2dyb3VuZC1jb2xvcjogIzAwQUFGRjsgfSAud2tpX2NpbnphIHsgYmFja2dyb3VuZC1jb2xvcjogJyArIHdraV9zZXR0aW5ncy53a2lfYnV0dG9uX2xhYmVsX2JnY29sb3IgKyAnOyB9IC5xdGlweyBtYXgtd2lkdGg6IDM4MHB4ICFpbXBvcnRhbnQ7IH0gI2FkZGl0aW9uYWwtY29udGVudCB1bCBsaSB7IHdpZHRoOiAxNi42JSAhaW1wb3J0YW50OyB9ICNhZGRpdGlvbmFsLWNvbnRlbnQge3RleHQtYWxpZ246IGNlbnRlcjt9ICN3a2lfYnV0dG9uIGltZyB7IG1heC13aWR0aDogMTQlOyBtYXJnaW46IC0xMHB4OyB9ICNhZGRpdGlvbmFsLWNvbnRlbnQgI2Fuc3dlci1leGNlcHRpb24ge2xlZnQ6IDguMyUgIWltcG9ydGFudDt9IEBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkgeyN3a2lfbWltaWNfYnV0dG9uIHtwYWRkaW5nOiA1cHg7IGZvbnQtc2l6ZTogMC43NWVtO30gLndraV9pdGVtX3dyYXBwZXIgeyBkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA0cHggNHB4IDNweDsgbWFyZ2luOiAtNHB4OyB9ICN3a2lfYnV0dG9uIGkgeyBwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiBhdXRvOyByaWdodDogYXV0bzsgbWFyZ2luOiAwOyB9IH0gQG1lZGlhIChtYXgtd2lkdGg6IDEyODBweCkgeyAjd2tpX2J1dHRvbiBpbWcgeyBtYXgtd2lkdGg6IDIyJTsgbWFyZ2luOiAtMTFweDsgfSBAbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7ICN3a2lfYnV0dG9uIGltZyB7IG1heC13aWR0aDogMjklOyBtYXJnaW46IC0xMXB4OyB9fSAgfSA8L3N0eWxlPicpLmFwcGVuZFRvKCdoZWFkJyk7CgoKaWYod2tpX3NldHRpbmdzLndraV9jb21ib19kaXNwbGF5ICE9PSB0cnVlKQp7CiAgICAkKCcjd2tpX2NvbWJvX2Rpc3BsYXknKS5oaWRlKCk7Cn0KCmlmKHdraV9zZXR0aW5ncy53a2lfc3JzX2xldmVsdXBfZGlzcGxheSAhPT0gdHJ1ZSkKewogICAgJCgnI3draV9zcnNfcG9wdXBfd3JhcHBlcicpLmhpZGUoKTsKfQoKaWYod2tpX2NvbWJvX3JlY29yZCA9PT0gbnVsbCkKewogICAgd2tpX2NvbWJvX3JlY29yZCA9IDA7Cn0KZWxzZQp7CiAgICBpZih3a2lfY29tYm9fcmVjb3JkICE9PSAwKQogICAgewogICAgICAgICQoJyN3a2lfY29tYm9fcmVjb3JkJykudGV4dCgnKCcgKyB3a2lfY29tYm9fcmVjb3JkICsgJyknKTsKICAgIH0KfQoKZnVuY3Rpb24gY2hlY2tBbnN3ZXIoKQp7CiAgICB3a2lfc3VibWl0dGVkX2Fuc3dlciA9ICQoJyN1c2VyLXJlc3BvbnNlJykudmFsKCk7CgogICAgaWYoIXdraV9zdWJtaXR0ZWRfYW5zd2VyKQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgYW5zd2VyRXhjZXB0aW9uID0gJC50cmltKCQoJyNhbnN3ZXItZXhjZXB0aW9uJykudGV4dCgpKTsKCiAgICBpZihhbnN3ZXJFeGNlcHRpb24uaW5kZXhPZignV2FuaUthbmkgaXMgbG9va2luZyBmb3IgdGhlJykgIT09IC0xKQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBjb25zb2xlLmxvZygnd2tpX3N1Ym1pdHRlZF9hbnN3ZXI6ICcgKyB3a2lfc3VibWl0dGVkX2Fuc3dlcik7CgogICAgaWYoYW5zd2VyRXhjZXB0aW9uLmxlbmd0aCA+IDApCiAgICB7CiAgICAgICAgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3JlY2VpdmVkID0gdHJ1ZTsKCiAgICAgICAgaWYoYW5zd2VyRXhjZXB0aW9uLmluZGV4T2YoJ2Fuc3dlciB3YXMgYSBiaXQgb2ZmJykgIT09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1dLSTogW2Fuc3dlckV4Y2VwdGlvbl0geW91ciBhbnN3ZXIgd2FzIGEgYml0IG9mZicpOwogICAgICAgICAgICAkKCcjd2tpX21pbWljX2J1dHRvbicpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjRjVGN0FCJyk7IC8vIHllbGxvdwogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi13YXJuaW5nLXNpZ24nKS5mYWRlT3V0KCkuZmFkZUluKCkuZmFkZU91dCgpLmZhZGVJbigpOwogICAgICAgICAgICB3a2lfZXhjZXB0aW9uX21lc3NhZ2VfdHlwZSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYW5zd2VyRXhjZXB0aW9uLmluZGV4T2YoJ3Bvc3NpYmxlIHJlYWRpbmdzJykgIT09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1dLSTogW2Fuc3dlckV4Y2VwdGlvbl0gb3RoZXIgcG9zc2libGUgcmVhZGluZ3MnKTsKICAgICAgICAgICAgJCgnI3draV9idXR0b24gaScpLnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3MoJ2ljb24tYXN0ZXJpc2snKTsKICAgICAgICAgICAgJCgnI3draV9taW1pY19idXR0b24nKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnI0NERTBGNycpOyAvLyBibHVlCiAgICAgICAgICAgIHdraV9leGNlcHRpb25fbWVzc2FnZV90eXBlID0gMjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhbnN3ZXJFeGNlcHRpb24uaW5kZXhPZigncG9zc2libGUgbWVhbmluZ3MnKSAhPT0gLTEpCiAgICAgICAgewogICAgICAgICAgICBjb25zb2xlLmxvZygnV0tJOiBbYW5zd2VyRXhjZXB0aW9uXSBvdGhlciBwb3NzaWJsZSBtZWFuaW5ncycpOwogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi1hc3RlcmlzaycpOwogICAgICAgICAgICAkKCcjd2tpX21pbWljX2J1dHRvbicpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjQ0RFMEY3Jyk7IC8vIGJsdWUKICAgICAgICAgICAgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3R5cGUgPSAzOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFuc3dlckV4Y2VwdGlvbi5pbmRleE9mKCdWaWV3IHRoZSBjb3JyZWN0JykgIT09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1dLSTogW2Fuc3dlckV4Y2VwdGlvbl0gd3JvbmcgYW5zd2VyJyk7CiAgICAgICAgICAgICQoJyN3a2lfbWltaWNfYnV0dG9uJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGQkZCRkInKTsgLy8gZGVmYXVsdCBncmV5IGNvbG9yCgogICAgICAgICAgICBpZih3a2lfc2V0dGluZ3Mud2tpX2F1dG9fc2hvd19pbmZvID09PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKCcjb3B0aW9uLWl0ZW0taW5mbycpLmNsaWNrKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdraV9leGNlcHRpb25fbWVzc2FnZV90eXBlID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8gdW5rbm93biBtZXNzYWdlCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXS0k6IFthbnN3ZXJFeGNlcHRpb25dICcgKyBhbnN3ZXJFeGNlcHRpb24pOwogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi1pbmZvLXNpZ24nKTsKICAgICAgICAgICAgJCgnI3draV9taW1pY19idXR0b24nKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnI0Y3RDRDRCcpOyAvLyByZWQKICAgICAgICAgICAgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3R5cGUgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB3a2lfZXhjZXB0aW9uX21lc3NhZ2VfcmVjZWl2ZWQgPSBmYWxzZTsKICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi1vaycpOwogICAgICAgICQoJyN3a2lfbWltaWNfYnV0dG9uJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGQkZCRkInKTsgLy8gZGVmYXVsdCBncmV5IGNvbG9yCiAgICB9CgogICAgaWYod2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3JlY2VpdmVkID09PSBmYWxzZSB8fCB3a2lfZXhjZXB0aW9uX21lc3NhZ2VfdHlwZSA+IDApCiAgICB7CiAgICAgICAgd2tpX2hpdF9jb21ibysrOwogICAgICAgICQoJyN3a2lfY29tYm8nKS50ZXh0KHdraV9oaXRfY29tYm8pOwogICAgICAgIGlmKHdraV9oaXRfY29tYm8gPiB3a2lfY29tYm9fcmVjb3JkKQogICAgICAgIHsKICAgICAgICAgICAgJC5qU3RvcmFnZS5zZXQoJ3draV9jb21ib19yZWNvcmQnLCB3a2lfaGl0X2NvbWJvKTsKICAgICAgICAgICAgJCgnI3draV9jb21ibycpLmZhZGVPdXQoKS5mYWRlSW4oKTsKICAgICAgICAgICAgJCgnI3draV9jb21ib19yZWNvcmQnKS5oaWRlKCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHdraV9oaXRfY29tYm8gPSAwOwogICAgICAgICQoJyN3a2lfY29tYm8nKS50ZXh0KHdraV9oaXRfY29tYm8pOwogICAgICAgICQoJyN3a2lfY29tYm9fcmVjb3JkJykudGV4dCgnKCcgKyAkLmpTdG9yYWdlLmdldCgnd2tpX2NvbWJvX3JlY29yZCcsIHdraV9oaXRfY29tYm8pICsgJyknKS5zaG93KCk7CiAgICB9CgogICAgaWYgKCQoJyNhbnN3ZXItZm9ybSBmb3JtIGZpZWxkc2V0JykuaGFzQ2xhc3MoJ2NvcnJlY3QnKSkKICAgIHsKICAgICAgICBjb25zb2xlLmxvZygnV0tJOiBDb3JyZWN0IGFuc3dlcicpOwoKICAgICAgICBpZiAod2tpX3NldHRpbmdzLndraV9hdWRpb19hdXRvcGxheSA9PT0gdHJ1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkKCcjb3B0aW9uLWF1ZGlvJykuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vdmVOZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKCIjb3B0aW9uLWF1ZGlvIikuY2xpY2soKTsKCiAgICAgICAgICAgICAgICAkKCcjb3B0aW9uLWF1ZGlvIGF1ZGlvJykuYmluZCgiZW5kZWQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgbW92ZU5leHQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIG1vdmVOZXh0KCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoJCgnI2Fuc3dlci1mb3JtIGZvcm0gZmllbGRzZXQnKS5oYXNDbGFzcygnaW5jb3JyZWN0JykpCiAgICB7CiAgICAgICAgY29uc29sZS5sb2coJ1dLSTogV3JvbmcgYW5zd2VyJyk7CiAgICB9Cn0KCmZ1bmN0aW9uIG1vdmVOZXh0KCkKewogICAgY29uc29sZS5sb2coJ1dLSTogTW92aW5nIHRvIG5leHQgcXVlc3Rpb24nKTsKICAgICQoJyNhbnN3ZXItZm9ybSBidXR0b24nKS50cmlnZ2VyKCdjbGljaycpOwp9CgokKCcjYW5zd2VyLWZvcm0gYnV0dG9uJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CiAgICBpZiAoZS5vcmlnaW5hbEV2ZW50ICE9PSB1bmRlZmluZWQgJiYgZS5vcmlnaW5hbEV2ZW50LnNjcmVlblggJiYgZS5vcmlnaW5hbEV2ZW50LnNjcmVlblkpCiAgICB7CiAgICAgICAgaWYoJCgnI3VzZXItcmVzcG9uc2UnKS52YWwoKSkKICAgICAgICB7CiAgICAgICAgCXNldFRpbWVvdXQoY2hlY2tBbnN3ZXIsIHdraV9zZXR0aW5ncy53a2lfdGltZXJfc2hvd19uZXh0X2l0ZW0pOwogICAgICAgIH0KICAgIH0KfSk7CgokKCcjcXVlc3Rpb24tdHlwZScpLmJpbmQoJ0RPTU5vZGVJbnNlcnRlZCcsIGZ1bmN0aW9uIChldmVudCkKewogICAgaWYoZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICE9ICdTVFJPTkcnKQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW0gPSAkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKTsKICAgIHdraV9jdXJyZW50X3F1ZXN0aW9uX3R5cGUgPSAkLmpTdG9yYWdlLmdldCgncXVlc3Rpb25UeXBlJyk7CgogICAgaWYod2tpX2pzdG9yZWRfY3VycmVudF9pdGVtWydrYW4nXSkKICAgIHsKICAgICAgICB3a2lfY3VycmVudF90eXBlID0gJ2thbmppJzsKICAgICAgICB3a2lfY3VycmVudF9pdGVtID0gd2tpX2pzdG9yZWRfY3VycmVudF9pdGVtWydrYW4nXTsKICAgIH0KICAgIGVsc2UgaWYod2tpX2pzdG9yZWRfY3VycmVudF9pdGVtWyd2b2MnXSkKICAgIHsKICAgICAgICB3a2lfY3VycmVudF90eXBlID0gJ3ZvY2FidWxhcnknOwogICAgICAgIHdraV9jdXJyZW50X2l0ZW0gPSB3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW1bJ3ZvYyddOwogICAgfQogICAgZWxzZSBpZih3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW1bJ3JhZCddKQogICAgewogICAgICAgIHdraV9jdXJyZW50X3R5cGUgPSAncmFkaWNhbCc7CiAgICAgICAgaWYod2tpX2pzdG9yZWRfY3VycmVudF9pdGVtWydyYWQnXS5pbmRleE9mKCcucG5nJykgIT09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgd2tpX2N1cnJlbnRfaXRlbSA9ICc8aW1nIHNyYz0iaHR0cDovL3MzLndhbmlrYW5pLmNvbS9pbWFnZXMvcmFkaWNhbHMvJyt3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW1bJ3JhZCddKyciIC8+JzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2tpX2N1cnJlbnRfaXRlbSA9IHdraV9qc3RvcmVkX2N1cnJlbnRfaXRlbVsncmFkJ107CiAgICAgICAgfQogICAgfQoKICAgIGNvbnNvbGUubG9nKCd3a2lfY3VycmVudF9pdGVtOiAnICsgd2tpX2N1cnJlbnRfaXRlbSk7CiAgICBjb25zb2xlLmxvZygnd2tpX2N1cnJlbnRfdHlwZTogJyArIHdraV9jdXJyZW50X3R5cGUpOwogICAgY29uc29sZS5sb2coJ3draV9jdXJyZW50X3F1ZXN0aW9uX3R5cGU6ICcgKyB3a2lfY3VycmVudF9xdWVzdGlvbl90eXBlKTsKCiAgICBpZih3a2lfc3JzX2xldmVsW3draV9qc3RvcmVkX2N1cnJlbnRfaXRlbVsnc3JzJ10gKyAxXSkKICAgIHsKICAgICAgICBjb25zb2xlLmxvZygnV0tJOiB0aGlzIGl0ZW0gd2lsbCBsZXZlbCB1cCB0byAnICsgd2tpX3Nyc19sZXZlbFt3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW1bJ3NycyddICsgMV0gKyAnJyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgY29uc29sZS5sb2coJ1dLSTogdGhpcyBpdGVtIHdpbGwgbm90IGxldmVsIHVwIHRvIGEgbmV3IFNSUyBjbGFzcycpOwogICAgfQoKICAgIGlmICgod2tpX3ByZXZpb3VzX2l0ZW0gIT0gd2tpX2N1cnJlbnRfaXRlbSkgfHwgKHdraV9wcmV2aW91c19pdGVtID09IHdraV9jdXJyZW50X2l0ZW0gJiYgd2tpX2N1cnJlbnRfcXVlc3Rpb25fdHlwZSAhPSB3a2lfcHJldmlvdXNfcXVlc3Rpb25fdHlwZSkpCiAgICB7CiAgICAgICAgaWYgKHdraV9wcmV2aW91c19pdGVtICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIXdraV9pdGVtc19hcnJheVt3a2lfcHJldmlvdXNfdHlwZSArICdfJyArIHdraV9qc3RvcmVkX3ByZXZpb3VzX2l0ZW1bJ2lkJ11dKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB3a2lfaXRlbXNfYXJyYXlbd2tpX3ByZXZpb3VzX3R5cGUgKyAnXycgKyB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydpZCddXSA9IHt9OwogICAgICAgICAgICAgICAgd2tpX2l0ZW1zX2FycmF5W3draV9wcmV2aW91c190eXBlICsgJ18nICsgd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbVsnaWQnXV1bJ3ZpZXdzJ10gPSAxOwogICAgICAgICAgICAgICAgd2tpX2l0ZW1zX2FycmF5W3draV9wcmV2aW91c190eXBlICsgJ18nICsgd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbVsnaWQnXV1bJ2NvcnJlY3RfYW5zd2VycyddID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdraV9pdGVtc19hcnJheVt3a2lfcHJldmlvdXNfdHlwZSArICdfJyArIHdraV9qc3RvcmVkX3ByZXZpb3VzX2l0ZW1bJ2lkJ11dWyd2aWV3cyddKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHdraV9leGNlcHRpb25fbWVzc2FnZV9yZWNlaXZlZCA9PT0gZmFsc2UgfHwgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3R5cGUgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB3a2lfaXRlbXNfYXJyYXlbd2tpX3ByZXZpb3VzX3R5cGUgKyAnXycgKyB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydpZCddXVsnY29ycmVjdF9hbnN3ZXJzJ10rKzsKCiAgICAgICAgICAgICAgICBpZigod2tpX2l0ZW1zX2FycmF5W3draV9wcmV2aW91c190eXBlICsgJ18nICsgd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbVsnaWQnXV1bJ3ZpZXdzJ10gPT0gMiAmJiB3a2lfaXRlbXNfYXJyYXlbd2tpX3ByZXZpb3VzX3R5cGUgKyAnXycgKyB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydpZCddXVsnY29ycmVjdF9hbnN3ZXJzJ10gPT0gMikgfHwgd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbVsncmFkJ10pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYod2tpX3Nyc19sZXZlbFt3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydzcnMnXSArIDFdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3draV9zcnNfcG9wdXBfbWVzc2FnZScpLnRleHQod2tpX3Nyc19sZXZlbFt3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydzcnMnXSArIDFdKS5yZW1vdmVDbGFzcygpLmFkZENsYXNzKCd3a2lfc3JzXycgKyB3a2lfc3JzX2xldmVsW3draV9qc3RvcmVkX3ByZXZpb3VzX2l0ZW1bJ3NycyddICsgMV0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3draV9zcnNfcG9wdXBfd3JhcHBlcicpLmFuaW1hdGUoeyd0b3AnOiBzcnNfd3JhcHBlcl91cHBlciwgJ29wYWNpdHknOiAxfSwgODAwLCBmdW5jdGlvbigpIHsgICQodGhpcykuZGVsYXkoODAwKS5hbmltYXRlKHsnb3BhY2l0eSc6IDB9LCA1MDAsIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLmNzcygndG9wJywgc3JzX3dyYXBwZXJfdG9wKTsgfSApOyB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoJyN3a2lfbWltaWNfYnV0dG9uJykucXRpcCgnZGVzdHJveScsIHRydWUpOwogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbicpLnJlbW92ZUNsYXNzKCk7CgogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiAud2tpX2J1dHRvbl9pdGVtX2xhYmVsJykuaHRtbCh3a2lfcHJldmlvdXNfaXRlbSkucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnd2tpX2J1dHRvbl9pdGVtX2xhYmVsIHdraV9jaW56YScpOwoKICAgICAgICAgICAgaWYod2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3JlY2VpdmVkID09PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKCcjd2tpX21pbWljX2J1dHRvbicpLnF0aXAoe2NvbnRlbnQ6IHsgdGV4dDogd2tpX2Fuc3dlcl9leGNlcHRpb25fbWVzc2FnZVt3a2lfZXhjZXB0aW9uX21lc3NhZ2VfdHlwZV0gfSwgcG9zaXRpb246IHsgbXk6ICdib3R0b20gY2VudGVyJywgYXQ6ICd0b3AgY2VudGVyJywgdmlld3BvcnQ6ICQod2luZG93KX0sIHN0eWxlOiAncXRpcC1ib290c3RyYXAnfSk7CgogICAgICAgICAgICAgICAgaWYod2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3R5cGUgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi1yZW1vdmUnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL3Jlc2V0IHRoZSB2YXIKICAgICAgICAgICAgICAgIHdraV9leGNlcHRpb25fbWVzc2FnZV9yZWNlaXZlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3a2lfcHJldmlvdXNfaXRlbV91cmwgPSAnaHR0cHM6Ly93d3cud2FuaWthbmkuY29tLyc7CgogICAgICAgICAgICBpZiAod2tpX3ByZXZpb3VzX3R5cGUgPT0gJ2thbmppJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2tpX3ByZXZpb3VzX2l0ZW1fdXJsICs9ICdrYW5qaS8nICsgd2tpX3ByZXZpb3VzX2l0ZW0gKyAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAod2tpX3ByZXZpb3VzX3R5cGUgPT0gJ3ZvY2FidWxhcnknKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB3a2lfcHJldmlvdXNfaXRlbV91cmwgKz0gJ3ZvY2FidWxhcnkvJyArIHdraV9wcmV2aW91c19pdGVtICsgJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHJhZGljYWxOYW1lID0gd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbS5lblswXTsKICAgICAgICAgICAgICAgIHdraV9wcmV2aW91c19pdGVtX3VybCArPSAncmFkaWNhbHMvJyArIHJhZGljYWxOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnICcsICctJykgKyAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc3JzX3dyYXBwZXJfdG9wID0gcGFyc2VJbnQoJCgiI3draV9taW1pY19idXR0b24iKS5vZmZzZXQoKS50b3AgKyAkKCIjd2tpX21pbWljX2J1dHRvbiIpLm91dGVySGVpZ2h0KCkpOwogICAgICAgICAgICBzcnNfd3JhcHBlcl91cHBlciA9IHBhcnNlSW50KHNyc193cmFwcGVyX3RvcCAtICgkKCIjd2tpX21pbWljX2J1dHRvbiIpLm91dGVySGVpZ2h0KCkgKiAyKSk7CgogICAgICAgICAgICAkKCcjd2tpX3Nyc19wb3B1cF93cmFwcGVyJykuY3NzKHsndG9wJzogc3JzX3dyYXBwZXJfdG9wICsgJ3B4JywgJ2xlZnQnOiBwYXJzZUludCgkKCIjd2tpX21pbWljX2J1dHRvbiIpLm91dGVyV2lkdGgoKSAvIDMgKyAkKCIjd2tpX21pbWljX2J1dHRvbiIpLm9mZnNldCgpLmxlZnQpICsgJ3B4J30pOwogICAgICAgIH0KCgogICAgICAgICQoJyN3a2lfYnV0dG9uJykubm90KCcuZGlzYWJsZWQnKS5xdGlwKAogICAgICAgIHsKICAgICAgICAgICAgaGlkZToKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXZlbnQ6ICdjbGljayB1bmZvY3VzJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGl0bGU6ICdQcmV2aW91cyAnICsgd2tpX3ByZXZpb3VzX3R5cGUgKyAnLiBZb3UgYW5zd2VyZWQgPHN0cm9uZz4nICsgd2tpX3N1Ym1pdHRlZF9hbnN3ZXIgKyAnPC9zdHJvbmc+JywKICAgICAgICAgICAgICAgIHRleHQ6ICc8aWZyYW1lIGlkPSJ3a2lfaWZyYW1lX3ByZXZpb3VzX2l0ZW0iIHNyYz0iJyArIHdraV9wcmV2aW91c19pdGVtX3VybCArICciIGZyYW1lYm9yZGVyPSIwIiBtYXJnaW5oZWlnaHQ9IjAiIHN0eWxlPSJ3aWR0aDozNTBweDsgaGVpZ2h0OiAyNTBweDsgb3ZlcmZsb3cteDogaGlkZGVuOyBvdmVyZmxvdy15OiBzY3JvbGw7IG9wYWNpdHk6IDA7Ij48L2lmcmFtZT4nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBvc2l0aW9uOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteTogJ2JvdHRvbSBjZW50ZXInLAogICAgICAgICAgICAgICAgYXQ6ICd0b3AgY2VudGVyJywKICAgICAgICAgICAgICAgIHZpZXdwb3J0OiAkKHdpbmRvdyksCiAgICAgICAgICAgICAgICBhZGp1c3Q6IHsgbWV0aG9kOiAnc2hpZnQgZmxpcCcgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaG93OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBldmVudDogJ2NsaWNrJywKICAgICAgICAgICAgICAgIHNvbG86IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRzOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aXNpYmxlOiBmdW5jdGlvbihldmVudCwgYXBpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoJ2lmcmFtZSN3a2lfaWZyYW1lX3ByZXZpb3VzX2l0ZW0nKS5sb2FkKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2tpX2lmcmFtZV9jb250ZW50ID0gJCh0aGlzKS5jb250ZW50cygpLmZpbmQoJ2JvZHknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHdraV9pZnJhbWVfY29udGVudC5hcHBlbmQoJzxzdHlsZT4uZm9vdGVyLWFkanVzdG1lbnQsIGZvb3RlciB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50fSBib2R5IHttYXJnaW46IDEwcHggIWltcG9ydGFudDt9IHNlY3Rpb24ge21hcmdpbjogMCAhaW1wb3J0YW50OyB9IC5jb250YWluZXIge21hcmdpbjogMCAhaW1wb3J0YW50OyB9IC5sZXZlbC1pY29uIHsgbWluLWhlaWdodDogNTJweDsgZmxvYXQ6IGxlZnQ7fSAudm9jYWJ1bGFyeS1pY29uLCAua2FuamktaWNvbiwgLnJhZGljYWwtaWNvbiB7ZmxvYXQ6IHJpZ2h0OyB3aWR0aDogODMlOyBoZWlnaHQ6IGF1dG87IHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50OyBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7IG1pbi1oZWlnaHQ6IDUycHg7fSAud2tpX2lmcmFtZV9oZWFkZXIge2ZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxpbmUtaGVpZ2h0OiA1NXB4fSAud2tpX2lmcmFtZV9zZWN0aW9uIHttYXJnaW46IDMwcHggMCAwICFpbXBvcnRhbnR9IC53a2lfaWZyYW1lX3NlY3Rpb246YWZ0ZXIge2NsZWFyOiBib3RoOyB9IC53a2lfaWZyYW1lX3NlY3Rpb24gaDIge2JvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjEyLCAyMTIsIDIxMikgIWltcG9ydGFudDsgbWFyZ2luOiAxNXB4IDAgN3B4ICFpbXBvcnRhbnQ7fSAud2tpX2lmcmFtZV9oZWFkZXIgLmVubGFyZ2UtaG92ZXIgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gPC9zdHlsZT4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3a2lfaWZyYW1lX2l0ZW0gPSB3a2lfaWZyYW1lX2NvbnRlbnQuZmluZCgnaGVhZGVyPmgxJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3a2lfaWZyYW1lX2l0ZW1fcHJvZ3Jlc3MgPSB3a2lfaWZyYW1lX2NvbnRlbnQuZmluZCgnI3Byb2dyZXNzJykuYWRkQ2xhc3MoJ3draV9pZnJhbWVfc2VjdGlvbicpLndyYXAoJzxkaXY+PC9kaXY+JykucGFyZW50KCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2tpX2lmcmFtZV9pdGVtX2FsdGVybmF0aXZlX21lYW5pbmcgPSB3a2lfaWZyYW1lX2NvbnRlbnQuZmluZCgnI2luZm9ybWF0aW9uJykuYWRkQ2xhc3MoJ2luZGl2aWR1YWwtaXRlbScpLndyYXAoJzxkaXY+PC9kaXY+JykucGFyZW50KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih3a2lfaXRlbXNfYXJyYXlbd2tpX3ByZXZpb3VzX3R5cGUgKyAnXycgKyB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydpZCddXVsnY29ycmVjdF9hbnN3ZXJzJ10gPT0gMikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdraV9yZWFkaW5nc19hbmRfbWVhbmluZ3MgPSB3a2lfaWZyYW1lX2NvbnRlbnQuZmluZCgnaDI6Y29udGFpbnMoIlJlYWRpbmciKSxoMjpjb250YWlucygiTWVhbmluZyIpLGgyOmNvbnRhaW5zKCJOYW1lIiknKS5wYXJlbnQoJ3NlY3Rpb24nKS5hZGRDbGFzcygnd2tpX2lmcmFtZV9zZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3a2lfaWZyYW1lX2NvbnRlbnQuYXBwZW5kKCc8aDIgY2xhc3M9IndraV9pZnJhbWVfaGVhZGVyIj4nICsgd2tpX2lmcmFtZV9pdGVtLmh0bWwoKSArICc8L2gyPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2tpX2lmcmFtZV9jb250ZW50LmFwcGVuZCh3a2lfaWZyYW1lX2l0ZW1fYWx0ZXJuYXRpdmVfbWVhbmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3a2lfaWZyYW1lX2NvbnRlbnQuYXBwZW5kKHdraV9yZWFkaW5nc19hbmRfbWVhbmluZ3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3a2lfcHJldmlvdXNfcXVlc3Rpb25fdHlwZS5pbmRleE9mKCdyZWFkaW5nJykgIT09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3a2lfaWZyYW1lX2l0ZW1fcmVhZGluZyA9IHdraV9pZnJhbWVfY29udGVudC5maW5kKCdoMjpjb250YWlucygiUmVhZGluZyIpJykucGFyZW50KCdzZWN0aW9uJykuYWRkQ2xhc3MoJ3draV9pZnJhbWVfc2VjdGlvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aDI+JywgeydjbGFzcycgOiAnd2tpX2lmcmFtZV9oZWFkZXInfSkuYXBwZW5kVG8od2tpX2lmcmFtZV9jb250ZW50KS5hcHBlbmQod2tpX2lmcmFtZV9pdGVtLmNoaWxkcmVuKCkpLmFwcGVuZCgnPGJyIHN0eWxlPSJjbGVhcjogYm90aDsiIC8+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2tpX2lmcmFtZV9jb250ZW50LmFwcGVuZCh3a2lfaWZyYW1lX2l0ZW1fcmVhZGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHdraV9wcmV2aW91c19xdWVzdGlvbl90eXBlLmluZGV4T2YoJ21lYW5pbmcnKSAhPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2tpX3ByZXZpb3VzX3R5cGUgPT0gJ3JhZGljYWwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdraV9pZnJhbWVfaXRlbV9tZWFuaW5nID0gd2tpX2lmcmFtZV9jb250ZW50LmZpbmQoJ2gyOmNvbnRhaW5zKCJOYW1lIiknKS5wYXJlbnQoJ3NlY3Rpb24nKS5hZGRDbGFzcygnd2tpX2lmcmFtZV9zZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3a2lfaWZyYW1lX2l0ZW1fbWVhbmluZyA9IHdraV9pZnJhbWVfY29udGVudC5maW5kKCdoMjpjb250YWlucygiTWVhbmluZyIpJykucGFyZW50KCdzZWN0aW9uJykuYWRkQ2xhc3MoJ3draV9pZnJhbWVfc2VjdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2tpX2lmcmFtZV9jb250ZW50LmFwcGVuZCgnPGgyIGNsYXNzPSJ3a2lfaWZyYW1lX2hlYWRlciI+JyArIHdraV9pZnJhbWVfaXRlbS5odG1sKCkgKyAnPC9oMj4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3a2lfaWZyYW1lX2NvbnRlbnQuYXBwZW5kKHdraV9pZnJhbWVfaXRlbV9hbHRlcm5hdGl2ZV9tZWFuaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3a2lfaWZyYW1lX2NvbnRlbnQuYXBwZW5kKHdraV9pZnJhbWVfaXRlbV9tZWFuaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgd2tpX2lmcmFtZV9jb250ZW50LmFwcGVuZCh3a2lfaWZyYW1lX2l0ZW1fcHJvZ3Jlc3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ29wYWNpdHknLCAnMScpOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3R5bGU6ICdxdGlwLWJvb3RzdHJhcCcKICAgICAgICB9KTsKCiAgICB9Cn0pOwoKCiQoJyNxdWVzdGlvbi10eXBlJykuYmluZCgnRE9NTm9kZVJlbW92ZWQnLCBmdW5jdGlvbiAoZXZlbnQpCnsKICAgIGlmKGV2ZW50LnRhcmdldC5ub2RlTmFtZSA9PSAnU1RST05HJykKICAgIHsKICAgICAgICB3a2lfcHJldmlvdXNfaXRlbSA9IHdraV9jdXJyZW50X2l0ZW07CiAgICAgICAgd2tpX3ByZXZpb3VzX3R5cGUgPSB3a2lfY3VycmVudF90eXBlOwogICAgICAgIHdraV9wcmV2aW91c19xdWVzdGlvbl90eXBlID0gd2tpX2N1cnJlbnRfcXVlc3Rpb25fdHlwZTsKICAgICAgICB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtID0gd2tpX2pzdG9yZWRfY3VycmVudF9pdGVtOwoKICAgICAgICBjb25zb2xlLmxvZygnV0tJOiBQcmV2aW91cyBpdGVtIHJlZ2lzdGVyZWQnKTsKICAgIH0KfSk7CgokKCcjdXNlci1yZXNwb25zZScpLmtleWRvd24oIGZ1bmN0aW9uKGUpIHsKICAgIHZhciBrZXkgPSBlLmNoYXJDb2RlID8gZS5jaGFyQ29kZSA6IGUua2V5Q29kZSA/IGUua2V5Q29kZSA6IDA7CgogICAgaWYgKGtleSA9PSAxMykKICAgIHsKICAgICAgICBzZXRUaW1lb3V0KGNoZWNrQW5zd2VyLCB3a2lfc2V0dGluZ3Mud2tpX3RpbWVyX3Nob3dfbmV4dF9pdGVtKTsKICAgIH0KfSk7CgoKdmFyIGxhYmVsX3RvZ2dsZSA9IDA7CiQoIiN3a2lfYnV0dG9uIikuYmluZCh7CiAgICBtb3VzZWVudGVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGl0ZW1fbGFiZWwgPSAkKHRoaXMpLmZpbmQoIi53a2lfaXRlbV93cmFwcGVyIik7CiAgICAgICAgaWYoaXRlbV9sYWJlbC5vdXRlcldpZHRoKCkgPCBpdGVtX2xhYmVsWzBdLnNjcm9sbFdpZHRoKQogICAgICAgIHsKICAgICAgICAgICAgaXRlbV9sYWJlbC5hbmltYXRlKAogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICB3aWR0aDogIjEwMCUiCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgIDIwMAogICAgICAgICAgICApOwogICAgICAgICAgICAkKHRoaXMpLmZpbmQoImkiKS5mYWRlT3V0KDEwMCk7CiAgICAgICAgICAgIGxhYmVsX3RvZ2dsZSA9IDE7CiAgICAgICAgfQoKICAgIH0sCiAgICBtb3VzZWxlYXZlOiBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGl0ZW1fbGFiZWwgPSAkKHRoaXMpLmZpbmQoIi53a2lfaXRlbV93cmFwcGVyIik7CiAgICAgICAgaWYobGFiZWxfdG9nZ2xlID09PSAxKQogICAgICAgIHsKICAgICAgICAgICAgaXRlbV9sYWJlbC5hbmltYXRlKAogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICB3aWR0aDogIjgwJSIKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgMjAwCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICQodGhpcykuZmluZCgiaSIpLmZhZGVJbigxMDApOwogICAgICAgICAgICBsYWJlbF90b2dnbGUgPSAwOwogICAgICAgIH0KICAgIH0KfSk7CgoKJCgnI3draV9jb25maWdfYnV0dG9uJykucXRpcCh7CiAgICBzaG93OgogICAgewogICAgICAgIGV2ZW50OiAnY2xpY2snLAogICAgICAgIGVmZmVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCgnI3draV9tb2RhbF9iYWNrZ3JvdW5kJykuZmFkZUluKCk7CiAgICAgICAgICAgICQodGhpcykuZmFkZUluKCk7CiAgICAgICAgfQogICAgfSwKICAgIGhpZGU6CiAgICB7CiAgICAgICAgZXZlbnQ6ICd1bmZvY3VzJywKICAgICAgICBlZmZlY3Q6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQoJyN3a2lfbW9kYWxfYmFja2dyb3VuZCcpLmZhZGVPdXQoKTsKICAgICAgICAgICAgJCh0aGlzKS5mYWRlT3V0KCk7CiAgICAgICAgfQogICAgfSwKICAgIGV2ZW50czogewoJICAgcmVuZGVyOiBmdW5jdGlvbihldmVudCwgYXBpKSB7CgkgICAgICAgJCgnI3draV9zZXR0aW5nc19jYW5jZWwnKS5iaW5kKCdjbGljaycsIHNldHRpbmdzQ2FuY2VsKTsKICAgICAgICAgICAkKCcjd2tpX3NldHRpbmdzX3NhdmUnKS5iaW5kKCdjbGljaycsIHNldHRpbmdzU2F2ZSk7CiAgICAgICB9CiAgICB9LAogICAgY29udGVudDoKICAgIHsKICAgICAgICB0aXRsZTogJzxoMiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+V2FuaUthbmkgSW1wcm92ZTwvaDI+JywKICAgICAgICB0ZXh0OiAnPHVsIGNsYXNzPSJ3a2lfc2V0dGluZ3NfZm9ybSI+PGxpPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IndraV9zZXR0aW5nc19hdWRpb19hdXRvcGxheSIgJysod2tpX3NldHRpbmdzLndraV9hdWRpb19hdXRvcGxheSA9PT0gdHJ1ZSA/ICdjaGVja2VkJyA6ICcnKSsnIC8+IDxsYWJlbCBmb3I9IndraV9zZXR0aW5nc19hdWRpb19hdXRvcGxheSI+UGxheSB2b2NhYnVsYXJ5IGF1ZGlvIHdoZW4gYXZhaWxhYmxlPC9sYWJlbD48L2xpPjxsaT48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ3a2lfc2V0dGluZ3NfY29tYm9fZGlzcGxheSIgJysod2tpX3NldHRpbmdzLndraV9jb21ib19kaXNwbGF5ID09PSB0cnVlID8gJ2NoZWNrZWQnIDogJycpKycgLz4gPGxhYmVsIGZvcj0id2tpX3NldHRpbmdzX2NvbWJvX2Rpc3BsYXkiPlNob3cgY29tYm8gaW5mb3JtYXRpb248L2xhYmVsPjwvbGk+PGxpPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IndraV9zZXR0aW5nc19zcnNfbGV2ZWx1cF9kaXNwbGF5IiAnKyh3a2lfc2V0dGluZ3Mud2tpX3Nyc19sZXZlbHVwX2Rpc3BsYXkgPT09IHRydWUgPyAnY2hlY2tlZCcgOiAnJykrJyAvPiA8bGFiZWwgZm9yPSJ3a2lfc2V0dGluZ3Nfc3JzX2xldmVsdXBfZGlzcGxheSI+V2hlbiBhbiBpdGVtIGxldmVsIHVwLCBkaXNwbGF5IHRoZSBuZXcgU1JTIGxldmVsPC9sYWJlbD48L2xpPjxsaT48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ3a2lfc2V0dGluZ3NfYXV0b19zaG93X2luZm8iICcrKHdraV9zZXR0aW5ncy53a2lfYXV0b19zaG93X2luZm8gPT09IHRydWUgPyAnY2hlY2tlZCcgOiAnJykrJyAvPiA8bGFiZWwgZm9yPSJ3a2lfc2V0dGluZ3NfYXV0b19zaG93X2luZm8iPkRpc3BsYXkgdGhlIGl0ZW0gaW5mb3JtYXRpb24gYWZ0ZXIgYSB3cm9uZyBhbnN3ZXI8L2xhYmVsPjwvbGk+PGxpPkJ1dHRvblwncyBiYWNrZ3JvdW5kIGNvbG9yIChkZWZhdWx0OiAjQTJBMkEyKTxiciAvPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0id2tpX3NldHRpbmdzX2J1dHRvbl9sYWJlbF9iZ2NvbG9yIiB2YWx1ZT0iJyt3a2lfc2V0dGluZ3Mud2tpX2J1dHRvbl9sYWJlbF9iZ2NvbG9yKyciIC8+PC9saT48bGk+QnV0dG9uXCdzIHRleHQgY29sb3IgIChkZWZhdWx0OiAjRkZGRkZGKTxiciAvPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0id2tpX3NldHRpbmdzX2J1dHRvbl9sYWJlbF90ZXh0Y29sb3IiIHZhbHVlPSInK3draV9zZXR0aW5ncy53a2lfYnV0dG9uX2xhYmVsX3RleHRjb2xvcisnIiAvPjwvbGk+PGxpPlRpbWUgdG8gd2FpdCBiZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0IHF1ZXN0aW9uIChtaWxpc2Vjb25kcywgZGVmYXVsdDogMCk8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IndraV9zZXR0aW5nc190aW1lcl9zaG93X25leHRfaXRlbSIgdmFsdWU9Iicrd2tpX3NldHRpbmdzLndraV90aW1lcl9zaG93X25leHRfaXRlbSsnIiAvPjwvbGk+PGxpPjxhIGlkPSJ3a2lfc2V0dGluZ3NfY2FuY2VsIiBjbGFzcz0id2tpX2J0biIgc3R5bGU9ImZsb2F0OiBsZWZ0OyI+Q2FuY2VsPC9hPjxhIGlkPSJ3a2lfc2V0dGluZ3Nfc2F2ZSIgY2xhc3M9IndraV9idG4iIHN0eWxlPSJmbG9hdDogcmlnaHQ7Ij5TYXZlPC9hPjxiciBjbGFzcz0id2tpX2NsZWFyIiAvPjwvbGk+PC91bD48ZGl2IGNsYXNzPSJ3a2lfc2V0dGluZ3Nfc2F2ZWQiPlNldHRpbmdzIHNhdmVkPC9kaXY+PGRpdiBjbGFzcz0id2tpX3NldHRpbmdzX2Rpc2NhcmRlZCI+Q2hhbmdlcyBkaXNjYXJkZWQ8L2Rpdj4nCiAgICB9LAogICAgcG9zaXRpb246CiAgICB7CiAgICAgICAgbXk6ICdjZW50ZXInLCBhdDogJ2NlbnRlcicsCiAgICAgICAgdGFyZ2V0OiAkKHdpbmRvdykKICAgIH0sCiAgICBzdHlsZTogewogICAgICAgIGNsYXNzZXM6ICdxdGlwLWJvb3RzdHJhcCcKICAgIH0KfSk7CgpmdW5jdGlvbiBzZXR0aW5nc0NhbmNlbCgpCnsKICAgIGNvbnNvbGUubG9nKCdXS0k6IHNldHRpbmdzIG5vdCBzYXZlZCcpOwogICAgJCgnLndraV9zZXR0aW5nc19mb3JtJykuc2xpZGVVcCgpOwogICAgJCgnLndraV9zZXR0aW5nc19kaXNjYXJkZWQnKS5zbGlkZURvd24oKTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI3draV9jb25maWdfYnV0dG9uJykucXRpcCgiaGlkZSIpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJy53a2lfc2V0dGluZ3NfZm9ybScpLnNob3coKTsKICAgICAgICAgICAgJCgnLndraV9zZXR0aW5nc19zYXZlZCcpLmhpZGUoKTsKICAgICAgICAgICAgJCgnLndraV9zZXR0aW5nc19kaXNjYXJkZWQnKS5oaWRlKCk7CiAgICAgICAgfSwgMTAwMCk7CiAgICB9LCAxMzAwKTsKfQoKZnVuY3Rpb24gc2V0dGluZ3NTYXZlKCkKewogICAgd2tpX3NldHRpbmdzLndraV9hdWRpb19hdXRvcGxheSA9ICQoIiN3a2lfc2V0dGluZ3NfYXVkaW9fYXV0b3BsYXkiKS5pcygiOmNoZWNrZWQiKSA/IHRydWUgOiBmYWxzZTsKICAgIHdraV9zZXR0aW5ncy53a2lfdGltZXJfc2hvd19uZXh0X2l0ZW0gPSAkKCcjd2tpX3NldHRpbmdzX3RpbWVyX3Nob3dfbmV4dF9pdGVtJykudmFsKCk7CiAgICB3a2lfc2V0dGluZ3Mud2tpX2J1dHRvbl9sYWJlbF9iZ2NvbG9yID0gJCgnI3draV9zZXR0aW5nc19idXR0b25fbGFiZWxfYmdjb2xvcicpLnZhbCgpOwogICAgd2tpX3NldHRpbmdzLndraV9idXR0b25fbGFiZWxfdGV4dGNvbG9yID0gJCgnI3draV9zZXR0aW5nc19idXR0b25fbGFiZWxfdGV4dGNvbG9yJykudmFsKCk7CiAgICB3a2lfc2V0dGluZ3Mud2tpX2NvbWJvX2Rpc3BsYXkgPSAkKCIjd2tpX3NldHRpbmdzX2NvbWJvX2Rpc3BsYXkiKS5pcygiOmNoZWNrZWQiKSA/IHRydWUgOiBmYWxzZTsKICAgIHdraV9zZXR0aW5ncy53a2lfc3JzX2xldmVsdXBfZGlzcGxheSA9ICQoIiN3a2lfc2V0dGluZ3Nfc3JzX2xldmVsdXBfZGlzcGxheSIpLmlzKCI6Y2hlY2tlZCIpID8gdHJ1ZSA6IGZhbHNlOwogICAgd2tpX3NldHRpbmdzLndraV9hdXRvX3Nob3dfaW5mbyA9ICQoIiN3a2lfc2V0dGluZ3NfYXV0b19zaG93X2luZm8iKS5pcygiOmNoZWNrZWQiKSA/IHRydWUgOiBmYWxzZTsKCiAgICAkLmpTdG9yYWdlLnNldCgnd2tpX3NldHRpbmdzJywgSlNPTi5zdHJpbmdpZnkod2tpX3NldHRpbmdzKSk7CgogICAgJCgnLndraV9idXR0b25faXRlbV9sYWJlbCcpLmNzcyh7J2NvbG9yJyA6IHdraV9zZXR0aW5ncy53a2lfYnV0dG9uX2xhYmVsX3RleHRjb2xvciwgJ2JhY2tncm91bmQtY29sb3InOiB3a2lfc2V0dGluZ3Mud2tpX2J1dHRvbl9sYWJlbF9iZ2NvbG9yfSk7CgogICAgaWYod2tpX3NldHRpbmdzLndraV9jb21ib19kaXNwbGF5ICE9PSB0cnVlKQogICAgewogICAgICAgICQoJyN3a2lfY29tYm9fZGlzcGxheScpLmhpZGUoKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAkKCcjd2tpX2NvbWJvX2Rpc3BsYXknKS5zaG93KCk7CiAgICB9CgogICAgaWYod2tpX3NldHRpbmdzLndraV9zcnNfbGV2ZWx1cF9kaXNwbGF5ICE9PSB0cnVlKQogICAgewogICAgICAgICQoJyN3a2lfc3JzX3BvcHVwX3dyYXBwZXInKS5oaWRlKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJCgnI3draV9zcnNfcG9wdXBfd3JhcHBlcicpLnNob3coKTsKICAgIH0KCiAgICAkKCcud2tpX3NldHRpbmdzX2Zvcm0nKS5zbGlkZVVwKCk7CiAgICAkKCcud2tpX3NldHRpbmdzX3NhdmVkJykuc2xpZGVEb3duKCk7CgogICAgY29uc29sZS5sb2coJ1dLSTogc2V0dGluZ3Mgc2F2ZWQnKTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI3draV9jb25maWdfYnV0dG9uJykucXRpcCgiaGlkZSIpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJy53a2lfc2V0dGluZ3NfZm9ybScpLnNob3coKTsKICAgICAgICAgICAgJCgnLndraV9zZXR0aW5nc19zYXZlZCcpLmhpZGUoKTsKICAgICAgICAgICAgJCgnLndraV9zZXR0aW5nc19kaXNjYXJkZWQnKS5oaWRlKCk7CiAgICAgICAgfSwgMTAwMCk7CiAgICB9LCAxMzAwKTsKfQoKCiQoJyNyZXBvcnQtZXJyb3JzIGEnKS5hdHRyKCdocmVmJywgJ2phdmFzY3JpcHQ6dm9pZCgwKTsnKTsKJCgnI3JlcG9ydC1lcnJvcnMnKS5hZGRDbGFzcygnd2tpX3Rvb2x0aXAnKS5hdHRyKCdyZWwnLCAnd2tpX2J1Z19tZXNzYWdlJykuYXBwZW5kKCc8c3BhbiBjbGFzcz0id2tpX2hpZGRlbiIgaWQ9IndraV9idWdfbWVzc2FnZSI+QmVmb3JlIHNlbmRpbmcgYSBidWcgcmVwb3J0LCBkaXNhYmxlIFdhbmlLYW5pIEltcHJvdmUgYW5kIGFsbCBvdGhlciBzY3JpcHRzIHJ1bm5pbmcgaW4gdGhlIHBhZ2UuIElmIHRoZSBlcnJvciBwZXJzaXN0cywgY29udGFjdCBXYW5pS2FuaSBhbmQgcmVwb3J0IHRoZSBwcm9ibGVtLjwvc3Bhbj4nKTsKCiQoJy53a2lfdG9vbHRpcCcpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZigkKHRoaXMpLmF0dHIoJ3JlbCcpKQogICAgewogICAgICAgIHZhciBxdGlwX2NvbnRlbnQgPSAkKCcjJyskKHRoaXMpLmF0dHIoJ3JlbCcpKS5odG1sKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdmFyIHF0aXBfY29udGVudCA9ICQodGhpcykuYXR0cigndGl0bGUnKTsKICAgIH0KICAgICQodGhpcykucXRpcCh7CiAgICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgICAgIGNsYXNzZXM6ICdxdGlwLWJvb3RzdHJhcCBxdGlwLXNoYWRvdycKICAgICAgICAgICB9LAogICAgICAgICAgIGhpZGU6IHsKICAgIAkJCWRlbGF5OiAxMDAsCiAgICAJCQlldmVudDogJ3VuZm9jdXMgbW91c2VsZWF2ZScsCiAgICAJCQlmaXhlZDogdHJ1ZQogICAgCQl9LAogICAgICAgICAgICBwb3NpdGlvbjoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXk6ICdib3R0b20gY2VudGVyJywKICAgICAgICAgICAgICAgIGF0OiAndG9wIGNlbnRlcicsCiAgICAgICAgICAgICAgICB2aWV3cG9ydDogJCh3aW5kb3cpLAogICAgICAgICAgICAgICAgbWV0aG9kOiAnc2hpZnQgbm9uZScKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29udGVudDogcXRpcF9jb250ZW50CiAgICB9KTsKfSk7CgokKHdpbmRvdykudW5sb2FkKGZ1bmN0aW9uKCl7CiAgICBpZih3a2lfaGl0X2NvbWJvID4gd2tpX2NvbWJvX3JlY29yZCkKICAgIHsKICAgICAgICAkLmpTdG9yYWdlLnNldCgnd2tpX2NvbWJvX3JlY29yZCcsIHdraV9oaXRfY29tYm8pOwogICAgICAgIGNvbnNvbGUubG9nKCdXS0k6IENvbWJvIHJlY29yZCBzYXZlZCcpOwogICAgfQp9KTs=", 136 - "resources": [ 137 - { 138 - "meta": { 139 - "name": "jquery.qtip.min.css", 140 - "url": "https://cdnjs.cloudflare.com/ajax/libs/qtip2/2.2.0/jquery.qtip.min.css", 141 - "ts": 1607436649582, 142 - "mimetype": "text/css" 143 - }, 144 - "source": "LyogcVRpcDIgdjIuMi4wIGJhc2ljIGNzczMgfCBxdGlwMi5jb20gfCBMaWNlbnNlZCBNSVQsIEdQTCB8IFRodSBOb3YgMjEgMjAxMyAyMDozNTowMCAqLwoucXRpcHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0yODAwMHB4O3RvcDotMjgwMDBweDtkaXNwbGF5Om5vbmU7bWF4LXdpZHRoOjI4MHB4O21pbi13aWR0aDo1MHB4O2ZvbnQtc2l6ZToxMC41cHg7bGluZS1oZWlnaHQ6MTJweDtkaXJlY3Rpb246bHRyO2JveC1zaGFkb3c6bm9uZTtwYWRkaW5nOjB9LnF0aXAtY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjVweCA5cHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtYWxpZ246bGVmdDt3b3JkLXdyYXA6YnJlYWstd29yZH0ucXRpcC10aXRsZWJhcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjVweCAzNXB4IDVweCAxMHB4O292ZXJmbG93OmhpZGRlbjtib3JkZXItd2lkdGg6MCAwIDFweDtmb250LXdlaWdodDo3MDB9LnF0aXAtdGl0bGViYXIrLnF0aXAtY29udGVudHtib3JkZXItdG9wLXdpZHRoOjAhaW1wb3J0YW50fS5xdGlwLWNsb3Nle3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi05cHg7dG9wOi05cHg7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTptZWRpdW0gbm9uZTtib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9LnF0aXAtdGl0bGViYXIgLnF0aXAtY2xvc2V7cmlnaHQ6NHB4O3RvcDo1MCU7bWFyZ2luLXRvcDotOXB4fSogaHRtbCAucXRpcC10aXRsZWJhciAucXRpcC1jbG9zZXt0b3A6MTZweH0ucXRpcC10aXRsZWJhciAudWktaWNvbiwucXRpcC1pY29uIC51aS1pY29ue2Rpc3BsYXk6YmxvY2s7dGV4dC1pbmRlbnQ6LTEwMDBlbTtkaXJlY3Rpb246bHRyfS5xdGlwLWljb24sLnF0aXAtaWNvbiAudWktaWNvbnstbW96LWJvcmRlci1yYWRpdXM6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnF0aXAtaWNvbiAudWktaWNvbnt3aWR0aDoxOHB4O2hlaWdodDoxNHB4O2xpbmUtaGVpZ2h0OjE0cHg7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1pbmRlbnQ6MDtmb250OjQwMCBib2xkIDEwcHgvMTNweCBUYWhvbWEsc2Fucy1zZXJpZjtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnQgbm9uZSBuby1yZXBlYXQgLTEwMGVtIC0xMDBlbX0ucXRpcC1mb2N1c3t9LnF0aXAtaG92ZXJ7fS5xdGlwLWRlZmF1bHR7Ym9yZGVyLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOiNGMUQwMzE7YmFja2dyb3VuZC1jb2xvcjojRkZGRkEzO2NvbG9yOiM1NTV9LnF0aXAtZGVmYXVsdCAucXRpcC10aXRsZWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNGRkVGOTN9LnF0aXAtZGVmYXVsdCAucXRpcC1pY29ue2JvcmRlci1jb2xvcjojQ0NDO2JhY2tncm91bmQ6I0YxRjFGMTtjb2xvcjojNzc3fS5xdGlwLWRlZmF1bHQgLnF0aXAtdGl0bGViYXIgLnF0aXAtY2xvc2V7Ym9yZGVyLWNvbG9yOiNBQUE7Y29sb3I6IzExMX0gLnF0aXAtbGlnaHR7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1jb2xvcjojRTJFMkUyO2NvbG9yOiM0NTQ1NDV9LnF0aXAtbGlnaHQgLnF0aXAtdGl0bGViYXJ7YmFja2dyb3VuZC1jb2xvcjojZjFmMWYxfSAucXRpcC1kYXJre2JhY2tncm91bmQtY29sb3I6IzUwNTA1MDtib3JkZXItY29sb3I6IzMwMzAzMDtjb2xvcjojZjNmM2YzfS5xdGlwLWRhcmsgLnF0aXAtdGl0bGViYXJ7YmFja2dyb3VuZC1jb2xvcjojNDA0MDQwfS5xdGlwLWRhcmsgLnF0aXAtaWNvbntib3JkZXItY29sb3I6IzQ0NH0ucXRpcC1kYXJrIC5xdGlwLXRpdGxlYmFyIC51aS1zdGF0ZS1ob3Zlcntib3JkZXItY29sb3I6IzMwMzAzMH0gLnF0aXAtY3JlYW17YmFja2dyb3VuZC1jb2xvcjojRkJGN0FBO2JvcmRlci1jb2xvcjojRjlFOThFO2NvbG9yOiNBMjdEMzV9LnF0aXAtY3JlYW0gLnF0aXAtdGl0bGViYXJ7YmFja2dyb3VuZC1jb2xvcjojRjBERTdEfS5xdGlwLWNyZWFtIC5xdGlwLWNsb3NlIC5xdGlwLWljb257YmFja2dyb3VuZC1wb3NpdGlvbjotODJweCAwfSAucXRpcC1yZWR7YmFja2dyb3VuZC1jb2xvcjojRjc4QjgzO2JvcmRlci1jb2xvcjojRDk1MjUyO2NvbG9yOiM5MTIzMjN9LnF0aXAtcmVkIC5xdGlwLXRpdGxlYmFye2JhY2tncm91bmQtY29sb3I6I0YwNkQ2NX0ucXRpcC1yZWQgLnF0aXAtY2xvc2UgLnF0aXAtaWNvbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDJweCAwfS5xdGlwLXJlZCAucXRpcC1pY29ue2JvcmRlci1jb2xvcjojRDk1MjUyfS5xdGlwLXJlZCAucXRpcC10aXRsZWJhciAudWktc3RhdGUtaG92ZXJ7Ym9yZGVyLWNvbG9yOiNEOTUyNTJ9IC5xdGlwLWdyZWVue2JhY2tncm91bmQtY29sb3I6I0NBRUQ5RTtib3JkZXItY29sb3I6IzkwRDkzRjtjb2xvcjojM0Y2MjE5fS5xdGlwLWdyZWVuIC5xdGlwLXRpdGxlYmFye2JhY2tncm91bmQtY29sb3I6I0IwREU3OH0ucXRpcC1ncmVlbiAucXRpcC1jbG9zZSAucXRpcC1pY29ue2JhY2tncm91bmQtcG9zaXRpb246LTQycHggMH0gLnF0aXAtYmx1ZXtiYWNrZ3JvdW5kLWNvbG9yOiNFNUY2RkU7Ym9yZGVyLWNvbG9yOiNBREQ5RUQ7Y29sb3I6IzVFOTlCRH0ucXRpcC1ibHVlIC5xdGlwLXRpdGxlYmFye2JhY2tncm91bmQtY29sb3I6I0QwRTlGNX0ucXRpcC1ibHVlIC5xdGlwLWNsb3NlIC5xdGlwLWljb257YmFja2dyb3VuZC1wb3NpdGlvbjotMnB4IDB9LnF0aXAtc2hhZG93ey13ZWJraXQtYm94LXNoYWRvdzoxcHggMXB4IDNweCAxcHggcmdiYSgwLDAsMCwuMTUpOy1tb3otYm94LXNoYWRvdzoxcHggMXB4IDNweCAxcHggcmdiYSgwLDAsMCwuMTUpO2JveC1zaGFkb3c6MXB4IDFweCAzcHggMXB4IHJnYmEoMCwwLDAsLjE1KX0ucXRpcC1yb3VuZGVkLC5xdGlwLXRpcHN5LC5xdGlwLWJvb3RzdHJhcHstbW96LWJvcmRlci1yYWRpdXM6NXB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHg7Ym9yZGVyLXJhZGl1czo1cHh9LnF0aXAtcm91bmRlZCAucXRpcC10aXRsZWJhcnstbW96LWJvcmRlci1yYWRpdXM6NHB4IDRweCAwIDA7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweCA0cHggMCAwO2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDB9LnF0aXAteW91dHViZXstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7Ym9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAzcHggIzMzMzstbW96LWJveC1zaGFkb3c6MCAwIDNweCAjMzMzO2JveC1zaGFkb3c6MCAwIDNweCAjMzMzO2NvbG9yOiNmZmY7Ym9yZGVyLXdpZHRoOjA7YmFja2dyb3VuZDojNEE0QTRBO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sY29sb3Itc3RvcCgwLCM0QTRBNEEpLGNvbG9yLXN0b3AoMTAwJSwjMDAwKSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzRBNEE0QSAwLCMwMDAgMTAwJSk7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIzRBNEE0QSAwLCMwMDAgMTAwJSk7YmFja2dyb3VuZC1pbWFnZTotbXMtbGluZWFyLWdyYWRpZW50KHRvcCwjNEE0QTRBIDAsIzAwMCAxMDAlKTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzRBNEE0QSAwLCMwMDAgMTAwJSl9LnF0aXAteW91dHViZSAucXRpcC10aXRsZWJhcntiYWNrZ3JvdW5kLWNvbG9yOiM0QTRBNEE7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApfS5xdGlwLXlvdXR1YmUgLnF0aXAtY29udGVudHtwYWRkaW5nOi43NWVtO2ZvbnQ6MTJweCBhcmlhbCxzYW5zLXNlcmlmO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuR3JhZGllbnQoR3JhZGllbnRUeXBlPTAsIFN0YXJ0Q29sb3JTdHI9IzRhNGE0YSwgRW5kQ29sb3JTdHI9IzAwMDAwMCk7LW1zLWZpbHRlcjoicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkdyYWRpZW50KEdyYWRpZW50VHlwZT0wLCBTdGFydENvbG9yU3RyPSM0YTRhNGEsIEVuZENvbG9yU3RyPSMwMDAwMDApOyJ9LnF0aXAteW91dHViZSAucXRpcC1pY29ue2JvcmRlci1jb2xvcjojMjIyfS5xdGlwLXlvdXR1YmUgLnF0aXAtdGl0bGViYXIgLnVpLXN0YXRlLWhvdmVye2JvcmRlci1jb2xvcjojMzAzMDMwfS5xdGlwLWp0b29sc3tiYWNrZ3JvdW5kOiMyMzIzMjM7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC43KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90dG9tLGZyb20oIzcxNzE3MSksdG8oIzIzMjMyMykpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCM3MTcxNzEsIzIzMjMyMyk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzcxNzE3MSwjMjMyMzIzKTtiYWNrZ3JvdW5kLWltYWdlOi1tcy1saW5lYXItZ3JhZGllbnQodG9wLCM3MTcxNzEsIzIzMjMyMyk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQodG9wLCM3MTcxNzEsIzIzMjMyMyk7Ym9yZGVyOjJweCBzb2xpZCAjZGRkO2JvcmRlcjoycHggc29saWQgcmdiYSgyNDEsMjQxLDI0MSwxKTstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7Ym9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAxMnB4ICMzMzM7LW1vei1ib3gtc2hhZG93OjAgMCAxMnB4ICMzMzM7Ym94LXNoYWRvdzowIDAgMTJweCAjMzMzfS5xdGlwLWp0b29scyAucXRpcC10aXRsZWJhcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jNzE3MTcxLCBlbmRDb2xvcnN0cj0jNEE0QTRBKTstbXMtZmlsdGVyOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jNzE3MTcxLCBlbmRDb2xvcnN0cj0jNEE0QTRBKSJ9LnF0aXAtanRvb2xzIC5xdGlwLWNvbnRlbnR7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM0QTRBNEEsIGVuZENvbG9yc3RyPSMyMzIzMjMpOy1tcy1maWx0ZXI6InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM0QTRBNEEsIGVuZENvbG9yc3RyPSMyMzIzMjMpIn0ucXRpcC1qdG9vbHMgLnF0aXAtdGl0bGViYXIsLnF0aXAtanRvb2xzIC5xdGlwLWNvbnRlbnR7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojZmZmO2JvcmRlcjowIGRhc2hlZCB0cmFuc3BhcmVudH0ucXRpcC1qdG9vbHMgLnF0aXAtaWNvbntib3JkZXItY29sb3I6IzU1NX0ucXRpcC1qdG9vbHMgLnF0aXAtdGl0bGViYXIgLnVpLXN0YXRlLWhvdmVye2JvcmRlci1jb2xvcjojMzMzfS5xdGlwLWNsdWV0aXB7LXdlYmtpdC1ib3gtc2hhZG93OjRweCA0cHggNXB4IHJnYmEoMCwwLDAsLjQpOy1tb3otYm94LXNoYWRvdzo0cHggNHB4IDVweCByZ2JhKDAsMCwwLC40KTtib3gtc2hhZG93OjRweCA0cHggNXB4IHJnYmEoMCwwLDAsLjQpO2JhY2tncm91bmQtY29sb3I6I0Q5RDlDMjtjb2xvcjojMTExO2JvcmRlcjowIGRhc2hlZCB0cmFuc3BhcmVudH0ucXRpcC1jbHVldGlwIC5xdGlwLXRpdGxlYmFye2JhY2tncm91bmQtY29sb3I6Izg3ODc2QTtjb2xvcjojZmZmO2JvcmRlcjowIGRhc2hlZCB0cmFuc3BhcmVudH0ucXRpcC1jbHVldGlwIC5xdGlwLWljb257Ym9yZGVyLWNvbG9yOiM4MDgwNjR9LnF0aXAtY2x1ZXRpcCAucXRpcC10aXRsZWJhciAudWktc3RhdGUtaG92ZXJ7Ym9yZGVyLWNvbG9yOiM2OTY5NTI7Y29sb3I6IzY5Njk1Mn0ucXRpcC10aXBzeXtiYWNrZ3JvdW5kOiMwMDA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC44Nyk7Y29sb3I6I2ZmZjtib3JkZXI6MCBzb2xpZCB0cmFuc3BhcmVudDtmb250LXNpemU6MTFweDtmb250LWZhbWlseTonTHVjaWRhIEdyYW5kZScsc2Fucy1zZXJpZjtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTZweDt0ZXh0LXNoYWRvdzowIDFweCAjMDAwfS5xdGlwLXRpcHN5IC5xdGlwLXRpdGxlYmFye3BhZGRpbmc6NnB4IDM1cHggMCAxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnF0aXAtdGlwc3kgLnF0aXAtY29udGVudHtwYWRkaW5nOjZweCAxMHB4fS5xdGlwLXRpcHN5IC5xdGlwLWljb257Ym9yZGVyLWNvbG9yOiMyMjI7dGV4dC1zaGFkb3c6bm9uZX0ucXRpcC10aXBzeSAucXRpcC10aXRsZWJhciAudWktc3RhdGUtaG92ZXJ7Ym9yZGVyLWNvbG9yOiMzMDMwMzB9LnF0aXAtdGlwcGVke2JvcmRlcjozcHggc29saWQgIzk1OUZBOTstbW96LWJvcmRlci1yYWRpdXM6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZC1jb2xvcjojRjlGOUY5O2NvbG9yOiM0NTQ1NDU7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtZmFtaWx5OnNlcmlmfS5xdGlwLXRpcHBlZCAucXRpcC10aXRsZWJhcntib3JkZXItYm90dG9tLXdpZHRoOjA7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiMzQTc5Qjg7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCxsZWZ0IGJvdHRvbSxmcm9tKCMzQTc5QjgpLHRvKCMyRTYyOUQpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjM0E3OUI4LCMyRTYyOUQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCMzQTc5QjgsIzJFNjI5RCk7YmFja2dyb3VuZC1pbWFnZTotbXMtbGluZWFyLWdyYWRpZW50KHRvcCwjM0E3OUI4LCMyRTYyOUQpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KHRvcCwjM0E3OUI4LCMyRTYyOUQpO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jM0E3OUI4LCBlbmRDb2xvcnN0cj0jMkU2MjlEKTstbXMtZmlsdGVyOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jM0E3OUI4LCBlbmRDb2xvcnN0cj0jMkU2MjlEKSJ9LnF0aXAtdGlwcGVkIC5xdGlwLWljb257Ym9yZGVyOjJweCBzb2xpZCAjMjg1NTg5O2JhY2tncm91bmQ6IzI4NTU4OX0ucXRpcC10aXBwZWQgLnF0aXAtaWNvbiAudWktaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiNGQkZCRkI7Y29sb3I6IzU1NX0ucXRpcC1ib290c3RyYXB7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojMzMzO3BhZGRpbmc6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTstd2Via2l0LWJvcmRlci1yYWRpdXM6NnB4Oy1tb3otYm9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLXJhZGl1czo2cHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMik7LW1vei1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMik7Ym94LXNoYWRvdzowIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpOy13ZWJraXQtYmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94Oy1tb3otYmFja2dyb3VuZC1jbGlwOnBhZGRpbmc7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94fS5xdGlwLWJvb3RzdHJhcCAucXRpcC10aXRsZWJhcntwYWRkaW5nOjhweCAxNHB4O21hcmdpbjowO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxOHB4O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmNztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViOy13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHggNXB4IDAgMDstbW96LWJvcmRlci1yYWRpdXM6NXB4IDVweCAwIDA7Ym9yZGVyLXJhZGl1czo1cHggNXB4IDAgMH0ucXRpcC1ib290c3RyYXAgLnF0aXAtdGl0bGViYXIgLnF0aXAtY2xvc2V7cmlnaHQ6MTFweDt0b3A6NDUlO2JvcmRlci1zdHlsZTpub25lfS5xdGlwLWJvb3RzdHJhcCAucXRpcC1jb250ZW50e3BhZGRpbmc6OXB4IDE0cHh9LnF0aXAtYm9vdHN0cmFwIC5xdGlwLWljb257YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ucXRpcC1ib290c3RyYXAgLnF0aXAtaWNvbiAudWktaWNvbnt3aWR0aDphdXRvO2hlaWdodDphdXRvO2Zsb2F0OnJpZ2h0O2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxOHB4O2NvbG9yOiMwMDA7dGV4dC1zaGFkb3c6MCAxcHggMCAjZmZmO29wYWNpdHk6LjI7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MjApfS5xdGlwLWJvb3RzdHJhcCAucXRpcC1pY29uIC51aS1pY29uOmhvdmVye2NvbG9yOiMwMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNDtmaWx0ZXI6YWxwaGEob3BhY2l0eT00MCl9LnF0aXA6bm90KC5pZTloYXhvcnMpIGRpdi5xdGlwLWNvbnRlbnQsLnF0aXA6bm90KC5pZTloYXhvcnMpIGRpdi5xdGlwLXRpdGxlYmFye2ZpbHRlcjpub25lOy1tcy1maWx0ZXI6bm9uZX0ucXRpcCAucXRpcC10aXB7bWFyZ2luOjAgYXV0bztvdmVyZmxvdzpoaWRkZW47ei1pbmRleDoxMH14Oi1vLXByZWZvY3VzLC5xdGlwIC5xdGlwLXRpcHt2aXNpYmlsaXR5OmhpZGRlbn0ucXRpcCAucXRpcC10aXAsLnF0aXAgLnF0aXAtdGlwIC5xdGlwLXZtbCwucXRpcCAucXRpcC10aXAgY2FudmFze3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiMxMjM0NTY7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6MCBkYXNoZWQgdHJhbnNwYXJlbnR9LnF0aXAgLnF0aXAtdGlwIGNhbnZhc3t0b3A6MDtsZWZ0OjB9LnF0aXAgLnF0aXAtdGlwIC5xdGlwLXZtbHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTtkaXNwbGF5OmlubGluZS1ibG9jazt2aXNpYmlsaXR5OnZpc2libGV9I3F0aXAtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDtsZWZ0OjA7dG9wOjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0jcXRpcC1vdmVybGF5LmJsdXJze2N1cnNvcjpwb2ludGVyfSNxdGlwLW92ZXJsYXkgZGl2e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6IzAwMDtvcGFjaXR5Oi43O2ZpbHRlcjphbHBoYShvcGFjaXR5PTcwKTstbXMtZmlsdGVyOiJhbHBoYShPcGFjaXR5PTcwKSJ9LnF0aXBtb2RhbC1pZTZmaXh7cG9zaXRpb246YWJzb2x1dGUhaW1wb3J0YW50fQ==" 145 - } 146 - ], 88 + "position": 2, 147 89 "requires": [ 148 90 { 149 91 "meta": { 92 + "mimetype": "text/javascript", 150 93 "name": "jquery.min.js", 151 - "url": "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js", 152 - "ts": 1607436649584, 153 - "mimetype": "text/javascript" 94 + "ts": 1630083357100, 95 + "url": "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js" 154 96 }, 155 97 "source": "LyohIGpRdWVyeSB2Mi4wLjMgfCAoYykgMjAwNSwgMjAxMyBqUXVlcnkgRm91bmRhdGlvbiwgSW5jLiB8IGpxdWVyeS5vcmcvbGljZW5zZQovL0Agc291cmNlTWFwcGluZ1VSTD1qcXVlcnkubWluLm1hcAoqLwooZnVuY3Rpb24oZSx1bmRlZmluZWQpe3ZhciB0LG4scj10eXBlb2YgdW5kZWZpbmVkLGk9ZS5sb2NhdGlvbixvPWUuZG9jdW1lbnQscz1vLmRvY3VtZW50RWxlbWVudCxhPWUualF1ZXJ5LHU9ZS4kLGw9e30sYz1bXSxwPSIyLjAuMyIsZj1jLmNvbmNhdCxoPWMucHVzaCxkPWMuc2xpY2UsZz1jLmluZGV4T2YsbT1sLnRvU3RyaW5nLHk9bC5oYXNPd25Qcm9wZXJ0eSx2PXAudHJpbSx4PWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyB4LmZuLmluaXQoZSxuLHQpfSxiPS9bKy1dPyg/OlxkKlwufClcZCsoPzpbZUVdWystXT9cZCt8KS8uc291cmNlLHc9L1xTKy9nLFQ9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxDPS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8saz0vXi1tcy0vLE49Ly0oW1xkYS16XSkvZ2ksRT1mdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9LFM9ZnVuY3Rpb24oKXtvLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFMsITEpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsUywhMSkseC5yZWFkeSgpfTt4LmZuPXgucHJvdG90eXBlPXtqcXVlcnk6cCxjb25zdHJ1Y3Rvcjp4LGluaXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk7aWYoIWUpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZihyPSI8Ij09PWUuY2hhckF0KDApJiYiPiI9PT1lLmNoYXJBdChlLmxlbmd0aC0xKSYmZS5sZW5ndGg+PTM/W251bGwsZSxudWxsXTpULmV4ZWMoZSksIXJ8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgeD90WzBdOnQseC5tZXJnZSh0aGlzLHgucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6bywhMCkpLEMudGVzdChyWzFdKSYmeC5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpeC5pc0Z1bmN0aW9uKHRoaXNbcl0pP3RoaXNbcl0odFtyXSk6dGhpcy5hdHRyKHIsdFtyXSk7cmV0dXJuIHRoaXN9cmV0dXJuIGk9by5nZXRFbGVtZW50QnlJZChyWzJdKSxpJiZpLnBhcmVudE5vZGUmJih0aGlzLmxlbmd0aD0xLHRoaXNbMF09aSksdGhpcy5jb250ZXh0PW8sdGhpcy5zZWxlY3Rvcj1lLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWUsdGhpcy5sZW5ndGg9MSx0aGlzKTp4LmlzRnVuY3Rpb24oZSk/bi5yZWFkeShlKTooZS5zZWxlY3RvciE9PXVuZGVmaW5lZCYmKHRoaXMuc2VsZWN0b3I9ZS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9ZS5jb250ZXh0KSx4Lm1ha2VBcnJheShlLHRoaXMpKX0sc2VsZWN0b3I6IiIsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBkLmNhbGwodGhpcyl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT90aGlzLnRvQXJyYXkoKTowPmU/dGhpc1t0aGlzLmxlbmd0aCtlXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9eC5tZXJnZSh0aGlzLmNvbnN0cnVjdG9yKCksZSk7cmV0dXJuIHQucHJldk9iamVjdD10aGlzLHQuY29udGV4dD10aGlzLmNvbnRleHQsdH0sZWFjaDpmdW5jdGlvbihlLHQpe3JldHVybiB4LmVhY2godGhpcyxlLHQpfSxyZWFkeTpmdW5jdGlvbihlKXtyZXR1cm4geC5yZWFkeS5wcm9taXNlKCkuZG9uZShlKSx0aGlzfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVuZ3RoLG49K2UrKDA+ZT90OjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZ0Pm4/W3RoaXNbbl1dOltdKX0sbWFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayh4Lm1hcCh0aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fHRoaXMuY29uc3RydWN0b3IobnVsbCl9LHB1c2g6aCxzb3J0OltdLnNvcnQsc3BsaWNlOltdLnNwbGljZX0seC5mbi5pbml0LnByb3RvdHlwZT14LmZuLHguZXh0ZW5kPXguZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsaSxvLHM9YXJndW1lbnRzWzBdfHx7fSxhPTEsdT1hcmd1bWVudHMubGVuZ3RoLGw9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIHMmJihsPXMscz1hcmd1bWVudHNbMV18fHt9LGE9MiksIm9iamVjdCI9PXR5cGVvZiBzfHx4LmlzRnVuY3Rpb24ocyl8fChzPXt9KSx1PT09YSYmKHM9dGhpcywtLWEpO3U+YTthKyspaWYobnVsbCE9KGU9YXJndW1lbnRzW2FdKSlmb3IodCBpbiBlKW49c1t0XSxyPWVbdF0scyE9PXImJihsJiZyJiYoeC5pc1BsYWluT2JqZWN0KHIpfHwoaT14LmlzQXJyYXkocikpKT8oaT8oaT0hMSxvPW4mJnguaXNBcnJheShuKT9uOltdKTpvPW4mJnguaXNQbGFpbk9iamVjdChuKT9uOnt9LHNbdF09eC5leHRlbmQobCxvLHIpKTpyIT09dW5kZWZpbmVkJiYoc1t0XT1yKSk7cmV0dXJuIHN9LHguZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhwK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vQ29uZmxpY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIGUuJD09PXgmJihlLiQ9dSksdCYmZS5qUXVlcnk9PT14JiYoZS5qUXVlcnk9YSkseH0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oZSl7ZT94LnJlYWR5V2FpdCsrOngucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihlKXsoZT09PSEwPy0teC5yZWFkeVdhaXQ6eC5pc1JlYWR5KXx8KHguaXNSZWFkeT0hMCxlIT09ITAmJi0teC5yZWFkeVdhaXQ+MHx8KG4ucmVzb2x2ZVdpdGgobyxbeF0pLHguZm4udHJpZ2dlciYmeChvKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKSkpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PT14LnR5cGUoZSl9LGlzQXJyYXk6QXJyYXkuaXNBcnJheSxpc1dpbmRvdzpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmZT09PWUud2luZG93fSxpc051bWVyaWM6ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoZSkpJiZpc0Zpbml0ZShlKX0sdHlwZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9lKyIiOiJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGU/bFttLmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXtpZigib2JqZWN0IiE9PXgudHlwZShlKXx8ZS5ub2RlVHlwZXx8eC5pc1dpbmRvdyhlKSlyZXR1cm4hMTt0cnl7aWYoZS5jb25zdHJ1Y3RvciYmIXkuY2FsbChlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKHQpe3JldHVybiExfXJldHVybiEwfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKGUpfSxwYXJzZUhUTUw6ZnVuY3Rpb24oZSx0LG4pe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0PXR8fG87dmFyIHI9Qy5leGVjKGUpLGk9IW4mJltdO3JldHVybiByP1t0LmNyZWF0ZUVsZW1lbnQoclsxXSldOihyPXguYnVpbGRGcmFnbWVudChbZV0sdCxpKSxpJiZ4KGkpLnJlbW92ZSgpLHgubWVyZ2UoW10sci5jaGlsZE5vZGVzKSl9LHBhcnNlSlNPTjpKU09OLnBhcnNlLHBhcnNlWE1MOmZ1bmN0aW9uKGUpe3ZhciB0LG47aWYoIWV8fCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gbnVsbDt0cnl7bj1uZXcgRE9NUGFyc2VyLHQ9bi5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChyKXt0PXVuZGVmaW5lZH1yZXR1cm4oIXR8fHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RoKSYmeC5lcnJvcigiSW52YWxpZCBYTUw6ICIrZSksdH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihlKXt2YXIgdCxuPWV2YWw7ZT14LnRyaW0oZSksZSYmKDE9PT1lLmluZGV4T2YoInVzZSBzdHJpY3QiKT8odD1vLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpLHQudGV4dD1lLG8uaGVhZC5hcHBlbmRDaGlsZCh0KS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpKTpuKGUpKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoaywibXMtIikucmVwbGFjZShOLEUpfSxub2RlTmFtZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9MCxvPWUubGVuZ3RoLHM9aihlKTtpZihuKXtpZihzKXtmb3IoO28+aTtpKyspaWYocj10LmFwcGx5KGVbaV0sbikscj09PSExKWJyZWFrfWVsc2UgZm9yKGkgaW4gZSlpZihyPXQuYXBwbHkoZVtpXSxuKSxyPT09ITEpYnJlYWt9ZWxzZSBpZihzKXtmb3IoO28+aTtpKyspaWYocj10LmNhbGwoZVtpXSxpLGVbaV0pLHI9PT0hMSlicmVha31lbHNlIGZvcihpIGluIGUpaWYocj10LmNhbGwoZVtpXSxpLGVbaV0pLHI9PT0hMSlicmVhaztyZXR1cm4gZX0sdHJpbTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjp2LmNhbGwoZSl9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoaihPYmplY3QoZSkpP3gubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOmguY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09dD8tMTpnLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe3ZhciBuPXQubGVuZ3RoLHI9ZS5sZW5ndGgsaT0wO2lmKCJudW1iZXIiPT10eXBlb2Ygbilmb3IoO24+aTtpKyspZVtyKytdPXRbaV07ZWxzZSB3aGlsZSh0W2ldIT09dW5kZWZpbmVkKWVbcisrXT10W2krK107cmV0dXJuIGUubGVuZ3RoPXIsZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1bXSxvPTAscz1lLmxlbmd0aDtmb3Iobj0hIW47cz5vO28rKylyPSEhdChlW29dLG8pLG4hPT1yJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgscz1qKGUpLGE9W107aWYocylmb3IoO28+aTtpKyspcj10KGVbaV0saSxuKSxudWxsIT1yJiYoYVthLmxlbmd0aF09cik7ZWxzZSBmb3IoaSBpbiBlKXI9dChlW2ldLGksbiksbnVsbCE9ciYmKGFbYS5sZW5ndGhdPXIpO3JldHVybiBmLmFwcGx5KFtdLGEpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLHguaXNGdW5jdGlvbihlKT8ocj1kLmNhbGwoYXJndW1lbnRzLDIpLGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KGQuY2FsbChhcmd1bWVudHMpKSl9LGkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx4Lmd1aWQrKyxpKTp1bmRlZmluZWR9LGFjY2VzczpmdW5jdGlvbihlLHQsbixyLGksbyxzKXt2YXIgYT0wLHU9ZS5sZW5ndGgsbD1udWxsPT1uO2lmKCJvYmplY3QiPT09eC50eXBlKG4pKXtpPSEwO2ZvcihhIGluIG4peC5hY2Nlc3MoZSx0LGEsblthXSwhMCxvLHMpfWVsc2UgaWYociE9PXVuZGVmaW5lZCYmKGk9ITAseC5pc0Z1bmN0aW9uKHIpfHwocz0hMCksbCYmKHM/KHQuY2FsbChlLHIpLHQ9bnVsbCk6KGw9dCx0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbC5jYWxsKHgoZSksbil9KSksdCkpZm9yKDt1PmE7YSsrKXQoZVthXSxuLHM/cjpyLmNhbGwoZVthXSxhLHQoZVthXSxuKSkpO3JldHVybiBpP2U6bD90LmNhbGwoZSk6dT90KGVbMF0sbik6b30sbm93OkRhdGUubm93LHN3YXA6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxzPXt9O2ZvcihvIGluIHQpc1tvXT1lLnN0eWxlW29dLGUuc3R5bGVbb109dFtvXTtpPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPXNbb107cmV0dXJuIGl9fSkseC5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKHQpe3JldHVybiBufHwobj14LkRlZmVycmVkKCksImNvbXBsZXRlIj09PW8ucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KHgucmVhZHkpOihvLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFMsITEpLGUuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsUywhMSkpKSxuLnByb21pc2UodCl9LHguZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2xbIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gaihlKXt2YXIgdD1lLmxlbmd0aCxuPXgudHlwZShlKTtyZXR1cm4geC5pc1dpbmRvdyhlKT8hMToxPT09ZS5ub2RlVHlwZSYmdD8hMDoiYXJyYXkiPT09bnx8ImZ1bmN0aW9uIiE9PW4mJigwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiZ0PjAmJnQtMSBpbiBlKX10PXgobyksZnVuY3Rpb24oZSx1bmRlZmluZWQpe3ZhciB0LG4scixpLG8scyxhLHUsbCxjLHAsZixoLGQsZyxtLHksdj0ic2l6emxlIistbmV3IERhdGUsYj1lLmRvY3VtZW50LHc9MCxUPTAsQz1zdCgpLGs9c3QoKSxOPXN0KCksRT0hMSxTPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10PyhFPSEwLDApOjB9LGo9dHlwZW9mIHVuZGVmaW5lZCxEPTE8PDMxLEE9e30uaGFzT3duUHJvcGVydHksTD1bXSxxPUwucG9wLEg9TC5wdXNoLE89TC5wdXNoLEY9TC5zbGljZSxQPUwuaW5kZXhPZnx8ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPXRoaXMubGVuZ3RoO2Zvcig7bj50O3QrKylpZih0aGlzW3RdPT09ZSlyZXR1cm4gdDtyZXR1cm4tMX0sUj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFc9Iig/OlxcXFwufFtcXHctXXxbXlxceDAwLVxceGEwXSkrIiwkPVcucmVwbGFjZSgidyIsIncjIiksQj0iXFxbIitNKyIqKCIrVysiKSIrTSsiKig/OihbKl4kfCF+XT89KSIrTSsiKig/OihbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCIrJCsiKXwpfCkiK00rIipcXF0iLEk9IjooIitXKyIpKD86XFwoKChbJ1wiXSkoKD86XFxcXC58W15cXFxcXSkqPylcXDN8KCg/OlxcXFwufFteXFxcXCgpW1xcXV18IitCLnJlcGxhY2UoMyw4KSsiKSopfC4qKVxcKXwpIix6PVJlZ0V4cCgiXiIrTSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitNKyIrJCIsImciKSxfPVJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxYPVJlZ0V4cCgiXiIrTSsiKihbPit+XXwiK00rIikiK00rIioiKSxVPVJlZ0V4cChNKyIqWyt+XSIpLFk9UmVnRXhwKCI9IitNKyIqKFteXFxdJ1wiXSopIitNKyIqXFxdIiwiZyIpLFY9UmVnRXhwKEkpLEc9UmVnRXhwKCJeIiskKyIkIiksSj17SUQ6UmVnRXhwKCJeIygiK1crIikiKSxDTEFTUzpSZWdFeHAoIl5cXC4oIitXKyIpIiksVEFHOlJlZ0V4cCgiXigiK1cucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOlJlZ0V4cCgiXiIrQiksUFNFVURPOlJlZ0V4cCgiXiIrSSksQ0hJTEQ6UmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK00rIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK00rIiooPzooWystXXwpIitNKyIqKFxcZCspfCkpIitNKyIqXFwpfCkiLCJpIiksYm9vbDpSZWdFeHAoIl4oPzoiK1IrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpSZWdFeHAoIl4iK00rIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrTSsiKigoPzotXFxkKT9cXGQqKSIrTSsiKlxcKXwpKD89W14tXXwkKSIsImkiKX0sUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sSz0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLFo9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxldD0vXmhcZCQvaSx0dD0vJ3xcXC9nLG50PVJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitNKyI/fCgiK00rIil8LikiLCJpZyIpLHJ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6MD5yP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxyPj4xMCw1NjMyMHwxMDIzJnIpfTt0cnl7Ty5hcHBseShMPUYuY2FsbChiLmNoaWxkTm9kZXMpLGIuY2hpbGROb2RlcyksTFtiLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChpdCl7Tz17YXBwbHk6TC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtILmFwcGx5KGUsRi5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gb3QoZSx0LHIsaSl7dmFyIG8scyxhLHUsbCxmLGcsbSx4LHc7aWYoKHQ/dC5vd25lckRvY3VtZW50fHx0OmIpIT09cCYmYyh0KSx0PXR8fHAscj1yfHxbXSwhZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiByO2lmKDEhPT0odT10Lm5vZGVUeXBlKSYmOSE9PXUpcmV0dXJuW107aWYoaCYmIWkpe2lmKG89Sy5leGVjKGUpKWlmKGE9b1sxXSl7aWYoOT09PXUpe2lmKHM9dC5nZXRFbGVtZW50QnlJZChhKSwhc3x8IXMucGFyZW50Tm9kZSlyZXR1cm4gcjtpZihzLmlkPT09YSlyZXR1cm4gci5wdXNoKHMpLHJ9ZWxzZSBpZih0Lm93bmVyRG9jdW1lbnQmJihzPXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSkmJnkodCxzKSYmcy5pZD09PWEpcmV0dXJuIHIucHVzaChzKSxyfWVsc2V7aWYob1syXSlyZXR1cm4gTy5hcHBseShyLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLHI7aWYoKGE9b1szXSkmJm4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBPLmFwcGx5KHIsdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpKSxyfWlmKG4ucXNhJiYoIWR8fCFkLnRlc3QoZSkpKXtpZihtPWc9dix4PXQsdz05PT09dSYmZSwxPT09dSYmIm9iamVjdCIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2Y9Z3QoZSksKGc9dC5nZXRBdHRyaWJ1dGUoImlkIikpP209Zy5yZXBsYWNlKHR0LCJcXCQmIik6dC5zZXRBdHRyaWJ1dGUoImlkIixtKSxtPSJbaWQ9JyIrbSsiJ10gIixsPWYubGVuZ3RoO3doaWxlKGwtLSlmW2xdPW0rbXQoZltsXSk7eD1VLnRlc3QoZSkmJnQucGFyZW50Tm9kZXx8dCx3PWYuam9pbigiLCIpfWlmKHcpdHJ5e3JldHVybiBPLmFwcGx5KHIseC5xdWVyeVNlbGVjdG9yQWxsKHcpKSxyfWNhdGNoKFQpe31maW5hbGx5e2d8fHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGt0KGUucmVwbGFjZSh6LCIkMSIpLHQscixpKX1mdW5jdGlvbiBzdCgpe3ZhciBlPVtdO2Z1bmN0aW9uIHQobixyKXtyZXR1cm4gZS5wdXNoKG4rPSIgIik+aS5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W25dPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gYXQoZSl7cmV0dXJuIGVbdl09ITAsZX1mdW5jdGlvbiB1dChlKXt2YXIgdD1wLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2gobil7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGx0KGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9ZS5sZW5ndGg7d2hpbGUoci0tKWkuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIGN0KGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmKH50LnNvdXJjZUluZGV4fHxEKS0ofmUuc291cmNlSW5kZXh8fEQpO2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBwdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1uJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBmdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gaHQoZSl7cmV0dXJuIGF0KGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LGF0KGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLHM9by5sZW5ndGg7d2hpbGUocy0tKW5baT1vW3NdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9cz1vdC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/IkhUTUwiIT09dC5ub2RlTmFtZTohMX0sbj1vdC5zdXBwb3J0PXt9LGM9b3Quc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT9lLm93bmVyRG9jdW1lbnR8fGU6YixyPXQuZGVmYXVsdFZpZXc7cmV0dXJuIHQhPT1wJiY5PT09dC5ub2RlVHlwZSYmdC5kb2N1bWVudEVsZW1lbnQ/KHA9dCxmPXQuZG9jdW1lbnRFbGVtZW50LGg9IXModCksciYmci5hdHRhY2hFdmVudCYmciE9PXIudG9wJiZyLmF0dGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXtjKCl9KSxuLmF0dHJpYnV0ZXM9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksbi5nZXRFbGVtZW50c0J5VGFnTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZCh0LmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2EnPjwvZGl2PjxkaXYgY2xhc3M9J2EgaSc+PC9kaXY+IixlLmZpcnN0Q2hpbGQuY2xhc3NOYW1lPSJpIiwyPT09ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RofSksbi5nZXRCeUlkPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBmLmFwcGVuZENoaWxkKGUpLmlkPXYsIXQuZ2V0RWxlbWVudHNCeU5hbWV8fCF0LmdldEVsZW1lbnRzQnlOYW1lKHYpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oaS5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQhPT1qJiZoKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuJiZuLnBhcmVudE5vZGU/W25dOltdfX0saS5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKG50LHJ0KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJpZCIpPT09dH19KTooZGVsZXRlIGkuZmluZC5JRCxpLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UobnQscnQpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj10eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT09aiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19KSxpLmZpbmQuVEFHPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHlwZW9mIHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1qP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6dW5kZWZpbmVkfTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT0wLG89dC5nZXRFbGVtZW50c0J5VGFnTmFtZShlKTtpZigiKiI9PT1lKXt3aGlsZShuPW9baSsrXSkxPT09bi5ub2RlVHlwZSYmci5wdXNoKG4pO3JldHVybiByfXJldHVybiBvfSxpLmZpbmQuQ0xBU1M9bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihlLHQpe3JldHVybiB0eXBlb2YgdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lIT09aiYmaD90LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSk6dW5kZWZpbmVkfSxnPVtdLGQ9W10sKG4ucXNhPVEudGVzdCh0LnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKHV0KGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8c2VsZWN0PjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fGQucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitSKyIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCI6Y2hlY2tlZCIpLmxlbmd0aHx8ZC5wdXNoKCI6Y2hlY2tlZCIpfSksdXQoZnVuY3Rpb24oZSl7dmFyIG49dC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO24uc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksZS5hcHBlbmRDaGlsZChuKS5zZXRBdHRyaWJ1dGUoInQiLCIiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0Xj0nJ10iKS5sZW5ndGgmJmQucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxkLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IiksZC5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPVEudGVzdChtPWYud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxmLm1vek1hdGNoZXNTZWxlY3Rvcnx8Zi5vTWF0Y2hlc1NlbGVjdG9yfHxmLm1zTWF0Y2hlc1NlbGVjdG9yKSkmJnV0KGZ1bmN0aW9uKGUpe24uZGlzY29ubmVjdGVkTWF0Y2g9bS5jYWxsKGUsImRpdiIpLG0uY2FsbChlLCJbcyE9JyddOngiKSxnLnB1c2goIiE9IixJKX0pLGQ9ZC5sZW5ndGgmJlJlZ0V4cChkLmpvaW4oInwiKSksZz1nLmxlbmd0aCYmUmVnRXhwKGcuam9pbigifCIpKSx5PVEudGVzdChmLmNvbnRhaW5zKXx8Zi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHQpe3ZhciBuPTk9PT1lLm5vZGVUeXBlP2UuZG9jdW1lbnRFbGVtZW50OmUscj10JiZ0LnBhcmVudE5vZGU7cmV0dXJuIGU9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbihlLHQpe2lmKHQpd2hpbGUodD10LnBhcmVudE5vZGUpaWYodD09PWUpcmV0dXJuITA7cmV0dXJuITF9LFM9Zi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9mdW5jdGlvbihlLHIpe2lmKGU9PT1yKXJldHVybiBFPSEwLDA7dmFyIGk9ci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKTtyZXR1cm4gaT8xJml8fCFuLnNvcnREZXRhY2hlZCYmci5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PWk/ZT09PXR8fHkoYixlKT8tMTpyPT09dHx8eShiLHIpPzE6bD9QLmNhbGwobCxlKS1QLmNhbGwobCxyKTowOjQmaT8tMToxOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MX06ZnVuY3Rpb24oZSxuKXt2YXIgcixpPTAsbz1lLnBhcmVudE5vZGUscz1uLnBhcmVudE5vZGUsYT1bZV0sdT1bbl07aWYoZT09PW4pcmV0dXJuIEU9ITAsMDtpZighb3x8IXMpcmV0dXJuIGU9PT10Py0xOm49PT10PzE6bz8tMTpzPzE6bD9QLmNhbGwobCxlKS1QLmNhbGwobCxuKTowO2lmKG89PT1zKXJldHVybiBjdChlLG4pO3I9ZTt3aGlsZShyPXIucGFyZW50Tm9kZSlhLnVuc2hpZnQocik7cj1uO3doaWxlKHI9ci5wYXJlbnROb2RlKXUudW5zaGlmdChyKTt3aGlsZShhW2ldPT09dVtpXSlpKys7cmV0dXJuIGk/Y3QoYVtpXSx1W2ldKTphW2ldPT09Yj8tMTp1W2ldPT09Yj8xOjB9LHQpOnB9LG90Lm1hdGNoZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gb3QoZSxudWxsLG51bGwsdCl9LG90Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLHQpe2lmKChlLm93bmVyRG9jdW1lbnR8fGUpIT09cCYmYyhlKSx0PXQucmVwbGFjZShZLCI9JyQxJ10iKSwhKCFuLm1hdGNoZXNTZWxlY3Rvcnx8IWh8fGcmJmcudGVzdCh0KXx8ZCYmZC50ZXN0KHQpKSl0cnl7dmFyIHI9bS5jYWxsKGUsdCk7aWYocnx8bi5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGkpe31yZXR1cm4gb3QodCxwLG51bGwsW2VdKS5sZW5ndGg+MH0sb3QuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4oZS5vd25lckRvY3VtZW50fHxlKSE9PXAmJmMoZSkseShlLHQpfSxvdC5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1wJiZjKGUpO3ZhciByPWkuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLG89ciYmQS5jYWxsKGkuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP3IoZSx0LCFoKTp1bmRlZmluZWQ7cmV0dXJuIG89PT11bmRlZmluZWQ/bi5hdHRyaWJ1dGVzfHwhaD9lLmdldEF0dHJpYnV0ZSh0KToobz1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZvLnNwZWNpZmllZD9vLnZhbHVlOm51bGw6b30sb3QuZXJyb3I9ZnVuY3Rpb24oZSl7dGhyb3cgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LG90LnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oZSl7dmFyIHQscj1bXSxpPTAsbz0wO2lmKEU9IW4uZGV0ZWN0RHVwbGljYXRlcyxsPSFuLnNvcnRTdGFibGUmJmUuc2xpY2UoMCksZS5zb3J0KFMpLEUpe3doaWxlKHQ9ZVtvKytdKXQ9PT1lW29dJiYoaT1yLnB1c2gobykpO3doaWxlKGktLSllLnNwbGljZShyW2ldLDEpfXJldHVybiBlfSxvPW90LmdldFRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbj0iIixyPTAsaT1lLm5vZGVUeXBlO2lmKGkpe2lmKDE9PT1pfHw5PT09aXx8MTE9PT1pKXtpZigic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQpcmV0dXJuIGUudGV4dENvbnRlbnQ7Zm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKW4rPW8oZSl9ZWxzZSBpZigzPT09aXx8ND09PWkpcmV0dXJuIGUubm9kZVZhbHVlfWVsc2UgZm9yKDt0PWVbcl07cisrKW4rPW8odCk7cmV0dXJuIG59LGk9b3Quc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86YXQsbWF0Y2g6SixhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKG50LHJ0KSxlWzNdPShlWzRdfHxlWzVdfHwiIikucmVwbGFjZShudCxydCksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fG90LmVycm9yKGVbMF0pLGVbNF09KyhlWzRdP2VbNV0rKGVbNl18fDEpOjIqKCJldmVuIj09PWVbM118fCJvZGQiPT09ZVszXSkpLGVbNV09KyhlWzddK2VbOF18fCJvZGQiPT09ZVszXSkpOmVbM10mJm90LmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzVdJiZlWzJdO3JldHVybiBKLkNISUxELnRlc3QoZVswXSk/bnVsbDooZVszXSYmZVs0XSE9PXVuZGVmaW5lZD9lWzJdPWVbNF06biYmVi50ZXN0KG4pJiYodD1ndChuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UobnQscnQpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PUNbZSsiICJdO3JldHVybiB0fHwodD1SZWdFeHAoIihefCIrTSsiKSIrZSsiKCIrTSsifCQpIikpJiZDKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8dHlwZW9mIGUuZ2V0QXR0cmlidXRlIT09aiYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIGk9b3QuYXR0cihyLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT10OnQ/KGkrPSIiLCI9Ij09PXQ/aT09PW46IiE9Ij09PXQ/aSE9PW46Il49Ij09PXQ/biYmMD09PWkuaW5kZXhPZihuKToiKj0iPT09dD9uJiZpLmluZGV4T2Yobik+LTE6IiQ9Ij09PXQ/biYmaS5zbGljZSgtbi5sZW5ndGgpPT09bjoifj0iPT09dD8oIiAiK2krIiAiKS5pbmRleE9mKG4pPi0xOiJ8PSI9PT10P2k9PT1ufHxpLnNsaWNlKDAsbi5sZW5ndGgrMSk9PT1uKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPSJudGgiIT09ZS5zbGljZSgwLDMpLHM9Imxhc3QiIT09ZS5zbGljZSgtNCksYT0ib2YtdHlwZSI9PT10O3JldHVybiAxPT09ciYmMD09PWk/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKHQsbix1KXt2YXIgbCxjLHAsZixoLGQsZz1vIT09cz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLG09dC5wYXJlbnROb2RlLHk9YSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHg9IXUmJiFhO2lmKG0pe2lmKG8pe3doaWxlKGcpe3A9dDt3aGlsZShwPXBbZ10paWYoYT9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2Q9Zz0ib25seSI9PT1lJiYhZCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihkPVtzP20uZmlyc3RDaGlsZDptLmxhc3RDaGlsZF0scyYmeCl7Yz1tW3ZdfHwobVt2XT17fSksbD1jW2VdfHxbXSxoPWxbMF09PT13JiZsWzFdLGY9bFswXT09PXcmJmxbMl0scD1oJiZtLmNoaWxkTm9kZXNbaF07d2hpbGUocD0rK2gmJnAmJnBbZ118fChmPWg9MCl8fGQucG9wKCkpaWYoMT09PXAubm9kZVR5cGUmJisrZiYmcD09PXQpe2NbZV09W3csaCxmXTticmVha319ZWxzZSBpZih4JiYobD0odFt2XXx8KHRbdl09e30pKVtlXSkmJmxbMF09PT13KWY9bFsxXTtlbHNlIHdoaWxlKHA9KytoJiZwJiZwW2ddfHwoZj1oPTApfHxkLnBvcCgpKWlmKChhP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpJiYrK2YmJih4JiYoKHBbdl18fChwW3ZdPXt9KSlbZV09W3csZl0pLHA9PT10KSlicmVhaztyZXR1cm4gZi09aSxmPT09cnx8MD09PWYlciYmZi9yPj0wfX19LFBTRVVETzpmdW5jdGlvbihlLHQpe3ZhciBuLHI9aS5wc2V1ZG9zW2VdfHxpLnNldEZpbHRlcnNbZS50b0xvd2VyQ2FzZSgpXXx8b3QuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gclt2XT9yKHQpOnIubGVuZ3RoPjE/KG49W2UsZSwiIix0XSxpLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9hdChmdW5jdGlvbihlLG4pe3ZhciBpLG89cihlLHQpLHM9by5sZW5ndGg7d2hpbGUocy0tKWk9UC5jYWxsKGUsb1tzXSksZVtpXT0hKG5baV09b1tzXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gcihlLDAsbil9KTpyfX0scHNldWRvczp7bm90OmF0KGZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W10scj1hKGUucmVwbGFjZSh6LCIkMSIpKTtyZXR1cm4gclt2XT9hdChmdW5jdGlvbihlLHQsbixpKXt2YXIgbyxzPXIoZSxudWxsLGksW10pLGE9ZS5sZW5ndGg7d2hpbGUoYS0tKShvPXNbYV0pJiYoZVthXT0hKHRbYV09bykpfSk6ZnVuY3Rpb24oZSxpLG8pe3JldHVybiB0WzBdPWUscih0LG51bGwsbyxuKSwhbi5wb3AoKX19KSxoYXM6YXQoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBvdChlLHQpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmF0KGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8dC5pbm5lclRleHR8fG8odCkpLmluZGV4T2YoZSk+LTF9fSksbGFuZzphdChmdW5jdGlvbihlKXtyZXR1cm4gRy50ZXN0KGV8fCIiKXx8b3QuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrZSksZT1lLnJlcGxhY2UobnQscnQpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24odCl7dmFyIG47ZG8gaWYobj1oP3QubGFuZzp0LmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8dC5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gbj1uLnRvTG93ZXJDYXNlKCksbj09PWV8fDA9PT1uLmluZGV4T2YoZSsiLSIpO3doaWxlKCh0PXQucGFyZW50Tm9kZSkmJjE9PT10Lm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24odCl7dmFyIG49ZS5sb2NhdGlvbiYmZS5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09dC5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PWZ9LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09cC5hY3RpdmVFbGVtZW50JiYoIXAuaGFzRm9jdXN8fHAuaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsZS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlTmFtZT4iQCJ8fDM9PT1lLm5vZGVUeXBlfHw0PT09ZS5ub2RlVHlwZSlyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGUpe3JldHVybiFpLnBzZXVkb3MuZW1wdHkoZSl9LGhlYWRlcjpmdW5jdGlvbihlKXtyZXR1cm4gZXQudGVzdChlLm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIFoudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8dC50b0xvd2VyQ2FzZSgpPT09ZS50eXBlKX0sZmlyc3Q6aHQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Omh0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpodChmdW5jdGlvbihlLHQsbil7cmV0dXJuWzA+bj9uK3Q6bl19KSxldmVuOmh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MDtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpodChmdW5jdGlvbihlLHQpe3ZhciBuPTE7Zm9yKDt0Pm47bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7dD4rK3I7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0saS5wc2V1ZG9zLm50aD1pLnBzZXVkb3MuZXE7Zm9yKHQgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0paS5wc2V1ZG9zW3RdPXB0KHQpO2Zvcih0IGlue3N1Ym1pdDohMCxyZXNldDohMH0paS5wc2V1ZG9zW3RdPWZ0KHQpO2Z1bmN0aW9uIGR0KCl7fWR0LnByb3RvdHlwZT1pLmZpbHRlcnM9aS5wc2V1ZG9zLGkuc2V0RmlsdGVycz1uZXcgZHQ7ZnVuY3Rpb24gZ3QoZSx0KXt2YXIgbixyLG8scyxhLHUsbCxjPWtbZSsiICJdO2lmKGMpcmV0dXJuIHQ/MDpjLnNsaWNlKDApO2E9ZSx1PVtdLGw9aS5wcmVGaWx0ZXI7d2hpbGUoYSl7KCFufHwocj1fLmV4ZWMoYSkpKSYmKHImJihhPWEuc2xpY2UoclswXS5sZW5ndGgpfHxhKSx1LnB1c2gobz1bXSkpLG49ITEsKHI9WC5leGVjKGEpKSYmKG49ci5zaGlmdCgpLG8ucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZSh6LCIgIil9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKTtmb3IocyBpbiBpLmZpbHRlcikhKHI9SltzXS5leGVjKGEpKXx8bFtzXSYmIShyPWxbc10ocikpfHwobj1yLnNoaWZ0KCksby5wdXNoKHt2YWx1ZTpuLHR5cGU6cyxtYXRjaGVzOnJ9KSxhPWEuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9hLmxlbmd0aDphP290LmVycm9yKGUpOmsoZSx1KS5zbGljZSgwKX1mdW5jdGlvbiBtdChlKXt2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjtmb3IoO24+dDt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB5dChlLHQsbil7dmFyIGk9dC5kaXIsbz1uJiYicGFyZW50Tm9kZSI9PT1pLHM9VCsrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixyKXt3aGlsZSh0PXRbaV0paWYoMT09PXQubm9kZVR5cGV8fG8pcmV0dXJuIGUodCxuLHIpfTpmdW5jdGlvbih0LG4sYSl7dmFyIHUsbCxjLHA9dysiICIrcztpZihhKXt3aGlsZSh0PXRbaV0paWYoKDE9PT10Lm5vZGVUeXBlfHxvKSYmZSh0LG4sYSkpcmV0dXJuITB9ZWxzZSB3aGlsZSh0PXRbaV0paWYoMT09PXQubm9kZVR5cGV8fG8paWYoYz10W3ZdfHwodFt2XT17fSksKGw9Y1tpXSkmJmxbMF09PT1wKXtpZigodT1sWzFdKT09PSEwfHx1PT09cilyZXR1cm4gdT09PSEwfWVsc2UgaWYobD1jW2ldPVtwXSxsWzFdPWUodCxuLGEpfHxyLGxbMV09PT0hMClyZXR1cm4hMH19ZnVuY3Rpb24gdnQoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24geHQoZSx0LG4scixpKXt2YXIgbyxzPVtdLGE9MCx1PWUubGVuZ3RoLGw9bnVsbCE9dDtmb3IoO3U+YTthKyspKG89ZVthXSkmJighbnx8bihvLHIsaSkpJiYocy5wdXNoKG8pLGwmJnQucHVzaChhKSk7cmV0dXJuIHN9ZnVuY3Rpb24gYnQoZSx0LG4scixpLG8pe3JldHVybiByJiYhclt2XSYmKHI9YnQocikpLGkmJiFpW3ZdJiYoaT1idChpLG8pKSxhdChmdW5jdGlvbihvLHMsYSx1KXt2YXIgbCxjLHAsZj1bXSxoPVtdLGQ9cy5sZW5ndGgsZz1vfHxDdCh0fHwiKiIsYS5ub2RlVHlwZT9bYV06YSxbXSksbT0hZXx8IW8mJnQ/Zzp4dChnLGYsZSxhLHUpLHk9bj9pfHwobz9lOmR8fHIpP1tdOnM6bTtpZihuJiZuKG0seSxhLHUpLHIpe2w9eHQoeSxoKSxyKGwsW10sYSx1KSxjPWwubGVuZ3RoO3doaWxlKGMtLSkocD1sW2NdKSYmKHlbaFtjXV09IShtW2hbY11dPXApKX1pZihvKXtpZihpfHxlKXtpZihpKXtsPVtdLGM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiZsLnB1c2gobVtjXT1wKTtpKG51bGwseT1bXSxsLHUpfWM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiYobD1pP1AuY2FsbChvLHApOmZbY10pPi0xJiYob1tsXT0hKHNbbF09cCkpfX1lbHNlIHk9eHQoeT09PXM/eS5zcGxpY2UoZCx5Lmxlbmd0aCk6eSksaT9pKG51bGwscyx5LHUpOk8uYXBwbHkocyx5KX0pfWZ1bmN0aW9uIHd0KGUpe3ZhciB0LG4scixvPWUubGVuZ3RoLHM9aS5yZWxhdGl2ZVtlWzBdLnR5cGVdLGE9c3x8aS5yZWxhdGl2ZVsiICJdLGw9cz8xOjAsYz15dChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LGEsITApLHA9eXQoZnVuY3Rpb24oZSl7cmV0dXJuIFAuY2FsbCh0LGUpPi0xfSxhLCEwKSxmPVtmdW5jdGlvbihlLG4scil7cmV0dXJuIXMmJihyfHxuIT09dSl8fCgodD1uKS5ub2RlVHlwZT9jKGUsbixyKTpwKGUsbixyKSl9XTtmb3IoO28+bDtsKyspaWYobj1pLnJlbGF0aXZlW2VbbF0udHlwZV0pZj1beXQodnQoZiksbildO2Vsc2V7aWYobj1pLmZpbHRlcltlW2xdLnR5cGVdLmFwcGx5KG51bGwsZVtsXS5tYXRjaGVzKSxuW3ZdKXtmb3Iocj0rK2w7bz5yO3IrKylpZihpLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJuIGJ0KGw+MSYmdnQoZiksbD4xJiZtdChlLnNsaWNlKDAsbC0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbbC0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKHosIiQxIiksbixyPmwmJnd0KGUuc2xpY2UobCxyKSksbz5yJiZ3dChlPWUuc2xpY2UocikpLG8+ciYmbXQoZSkpfWYucHVzaChuKX1yZXR1cm4gdnQoZil9ZnVuY3Rpb24gVHQoZSx0KXt2YXIgbj0wLG89dC5sZW5ndGg+MCxzPWUubGVuZ3RoPjAsYT1mdW5jdGlvbihhLGwsYyxmLGgpe3ZhciBkLGcsbSx5PVtdLHY9MCx4PSIwIixiPWEmJltdLFQ9bnVsbCE9aCxDPXUsaz1hfHxzJiZpLmZpbmQuVEFHKCIqIixoJiZsLnBhcmVudE5vZGV8fGwpLE49dys9bnVsbD09Qz8xOk1hdGgucmFuZG9tKCl8fC4xO2ZvcihUJiYodT1sIT09cCYmbCxyPW4pO251bGwhPShkPWtbeF0pO3grKyl7aWYocyYmZCl7Zz0wO3doaWxlKG09ZVtnKytdKWlmKG0oZCxsLGMpKXtmLnB1c2goZCk7YnJlYWt9VCYmKHc9TixyPSsrbil9byYmKChkPSFtJiZkKSYmdi0tLGEmJmIucHVzaChkKSl9aWYodis9eCxvJiZ4IT09dil7Zz0wO3doaWxlKG09dFtnKytdKW0oYix5LGwsYyk7aWYoYSl7aWYodj4wKXdoaWxlKHgtLSliW3hdfHx5W3hdfHwoeVt4XT1xLmNhbGwoZikpO3k9eHQoeSl9Ty5hcHBseShmLHkpLFQmJiFhJiZ5Lmxlbmd0aD4wJiZ2K3QubGVuZ3RoPjEmJm90LnVuaXF1ZVNvcnQoZil9cmV0dXJuIFQmJih3PU4sdT1DKSxifTtyZXR1cm4gbz9hdChhKTphfWE9b3QuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1bXSxvPU5bZSsiICJdO2lmKCFvKXt0fHwodD1ndChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pbz13dCh0W25dKSxvW3ZdP3IucHVzaChvKTppLnB1c2gobyk7bz1OKGUsVHQoaSxyKSl9cmV0dXJuIG99O2Z1bmN0aW9uIEN0KGUsdCxuKXt2YXIgcj0wLGk9dC5sZW5ndGg7Zm9yKDtpPnI7cisrKW90KGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiBrdChlLHQscixvKXt2YXIgcyx1LGwsYyxwLGY9Z3QoZSk7aWYoIW8mJjE9PT1mLmxlbmd0aCl7aWYodT1mWzBdPWZbMF0uc2xpY2UoMCksdS5sZW5ndGg+MiYmIklEIj09PShsPXVbMF0pLnR5cGUmJm4uZ2V0QnlJZCYmOT09PXQubm9kZVR5cGUmJmgmJmkucmVsYXRpdmVbdVsxXS50eXBlXSl7aWYodD0oaS5maW5kLklEKGwubWF0Y2hlc1swXS5yZXBsYWNlKG50LHJ0KSx0KXx8W10pWzBdLCF0KXJldHVybiByO2U9ZS5zbGljZSh1LnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1zPUoubmVlZHNDb250ZXh0LnRlc3QoZSk/MDp1Lmxlbmd0aDt3aGlsZShzLS0pe2lmKGw9dVtzXSxpLnJlbGF0aXZlW2M9bC50eXBlXSlicmVhaztpZigocD1pLmZpbmRbY10pJiYobz1wKGwubWF0Y2hlc1swXS5yZXBsYWNlKG50LHJ0KSxVLnRlc3QodVswXS50eXBlKSYmdC5wYXJlbnROb2RlfHx0KSkpe2lmKHUuc3BsaWNlKHMsMSksZT1vLmxlbmd0aCYmbXQodSksIWUpcmV0dXJuIE8uYXBwbHkocixvKSxyO2JyZWFrfX19cmV0dXJuIGEoZSxmKShvLHQsIWgscixVLnRlc3QoZSkpLHJ9bi5zb3J0U3RhYmxlPXYuc3BsaXQoIiIpLnNvcnQoUykuam9pbigiIik9PT12LG4uZGV0ZWN0RHVwbGljYXRlcz1FLGMoKSxuLnNvcnREZXRhY2hlZD11dChmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHAuY3JlYXRlRWxlbWVudCgiZGl2IikpfSksdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8bHQoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj91bmRlZmluZWQ6ZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLG4uYXR0cmlidXRlcyYmdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8aW5wdXQvPiIsZS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWUuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8bHQoInZhbHVlIixmdW5jdGlvbihlLHQsbil7cmV0dXJuIG58fCJpbnB1dCIhPT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dW5kZWZpbmVkOmUuZGVmYXVsdFZhbHVlfSksdXQoZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGx0KFIsZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiBuP3VuZGVmaW5lZDoocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOmVbdF09PT0hMD90LnRvTG93ZXJDYXNlKCk6bnVsbH0pLHguZmluZD1vdCx4LmV4cHI9b3Quc2VsZWN0b3JzLHguZXhwclsiOiJdPXguZXhwci5wc2V1ZG9zLHgudW5pcXVlPW90LnVuaXF1ZVNvcnQseC50ZXh0PW90LmdldFRleHQseC5pc1hNTERvYz1vdC5pc1hNTCx4LmNvbnRhaW5zPW90LmNvbnRhaW5zfShlKTt2YXIgRD17fTtmdW5jdGlvbiBBKGUpe3ZhciB0PURbZV09e307cmV0dXJuIHguZWFjaChlLm1hdGNoKHcpfHxbXSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fXguQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9InN0cmluZyI9PXR5cGVvZiBlP0RbZV18fEEoZSk6eC5leHRlbmQoe30sZSk7dmFyIHQsbixyLGksbyxzLGE9W10sdT0hZS5vbmNlJiZbXSxsPWZ1bmN0aW9uKHApe2Zvcih0PWUubWVtb3J5JiZwLG49ITAscz1pfHwwLGk9MCxvPWEubGVuZ3RoLHI9ITA7YSYmbz5zO3MrKylpZihhW3NdLmFwcGx5KHBbMF0scFsxXSk9PT0hMSYmZS5zdG9wT25GYWxzZSl7dD0hMTticmVha31yPSExLGEmJih1P3UubGVuZ3RoJiZsKHUuc2hpZnQoKSk6dD9hPVtdOmMuZGlzYWJsZSgpKX0sYz17YWRkOmZ1bmN0aW9uKCl7aWYoYSl7dmFyIG49YS5sZW5ndGg7KGZ1bmN0aW9uIHModCl7eC5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj14LnR5cGUobik7ImZ1bmN0aW9uIj09PXI/ZS51bmlxdWUmJmMuaGFzKG4pfHxhLnB1c2gobik6biYmbi5sZW5ndGgmJiJzdHJpbmciIT09ciYmcyhuKX0pfSkoYXJndW1lbnRzKSxyP289YS5sZW5ndGg6dCYmKGk9bixsKHQpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGEmJnguZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgbjt3aGlsZSgobj14LmluQXJyYXkodCxhLG4pKT4tMSlhLnNwbGljZShuLDEpLHImJihvPj1uJiZvLS0scz49biYmcy0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT94LmluQXJyYXkoZSxhKT4tMTohKCFhfHwhYS5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBhPVtdLG89MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGE9dT10PXVuZGVmaW5lZCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFhfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIHU9dW5kZWZpbmVkLHR8fGMuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiF1fSxmaXJlV2l0aDpmdW5jdGlvbihlLHQpe3JldHVybiFhfHxuJiYhdXx8KHQ9dHx8W10sdD1bZSx0LnNsaWNlP3Quc2xpY2UoKTp0XSxyP3UucHVzaCh0KTpsKHQpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGMuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFufX07cmV0dXJuIGN9LHguZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgdD1bWyJyZXNvbHZlIiwiZG9uZSIseC5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIix4LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIix4LkNhbGxiYWNrcygibWVtb3J5IildXSxuPSJwZW5kaW5nIixyPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBufSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIHguRGVmZXJyZWQoZnVuY3Rpb24obil7eC5lYWNoKHQsZnVuY3Rpb24odCxvKXt2YXIgcz1vWzBdLGE9eC5pc0Z1bmN0aW9uKGVbdF0pJiZlW3RdO2lbb1sxXV0oZnVuY3Rpb24oKXt2YXIgZT1hJiZhLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZ4LmlzRnVuY3Rpb24oZS5wcm9taXNlKT9lLnByb21pc2UoKS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCkucHJvZ3Jlc3Mobi5ub3RpZnkpOm5bcysiV2l0aCJdKHRoaXM9PT1yP24ucHJvbWlzZSgpOnRoaXMsYT9bZV06YXJndW1lbnRzKX0pfSksZT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP3guZXh0ZW5kKGUscik6cn19LGk9e307cmV0dXJuIHIucGlwZT1yLnRoZW4seC5lYWNoKHQsZnVuY3Rpb24oZSxvKXt2YXIgcz1vWzJdLGE9b1szXTtyW29bMV1dPXMuYWRkLGEmJnMuYWRkKGZ1bmN0aW9uKCl7bj1hfSx0WzFeZV1bMl0uZGlzYWJsZSx0WzJdWzJdLmxvY2spLGlbb1swXV09ZnVuY3Rpb24oKXtyZXR1cm4gaVtvWzBdKyJXaXRoIl0odGhpcz09PWk/cjp0aGlzLGFyZ3VtZW50cyksdGhpc30saVtvWzBdKyJXaXRoIl09cy5maXJlV2l0aH0pLHIucHJvbWlzZShpKSxlJiZlLmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1kLmNhbGwoYXJndW1lbnRzKSxyPW4ubGVuZ3RoLGk9MSE9PXJ8fGUmJnguaXNGdW5jdGlvbihlLnByb21pc2UpP3I6MCxvPTE9PT1pP2U6eC5EZWZlcnJlZCgpLHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyKXt0W2VdPXRoaXMsbltlXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6cixuPT09YT9vLm5vdGlmeVdpdGgodCxuKTotLWl8fG8ucmVzb2x2ZVdpdGgodCxuKX19LGEsdSxsO2lmKHI+MSlmb3IoYT1BcnJheShyKSx1PUFycmF5KHIpLGw9QXJyYXkocik7cj50O3QrKyluW3RdJiZ4LmlzRnVuY3Rpb24oblt0XS5wcm9taXNlKT9uW3RdLnByb21pc2UoKS5kb25lKHModCxsLG4pKS5mYWlsKG8ucmVqZWN0KS5wcm9ncmVzcyhzKHQsdSxhKSk6LS1pO3JldHVybiBpfHxvLnJlc29sdmVXaXRoKGwsbiksby5wcm9taXNlKCl9fSkseC5zdXBwb3J0PWZ1bmN0aW9uKHQpe3ZhciBuPW8uY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxyPW8uY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLGk9by5jcmVhdGVFbGVtZW50KCJkaXYiKSxzPW8uY3JlYXRlRWxlbWVudCgic2VsZWN0IiksYT1zLmFwcGVuZENoaWxkKG8uY3JlYXRlRWxlbWVudCgib3B0aW9uIikpO3JldHVybiBuLnR5cGU/KG4udHlwZT0iY2hlY2tib3giLHQuY2hlY2tPbj0iIiE9PW4udmFsdWUsdC5vcHRTZWxlY3RlZD1hLnNlbGVjdGVkLHQucmVsaWFibGVNYXJnaW5SaWdodD0hMCx0LmJveFNpemluZ1JlbGlhYmxlPSEwLHQucGl4ZWxQb3NpdGlvbj0hMSxuLmNoZWNrZWQ9ITAsdC5ub0Nsb25lQ2hlY2tlZD1uLmNsb25lTm9kZSghMCkuY2hlY2tlZCxzLmRpc2FibGVkPSEwLHQub3B0RGlzYWJsZWQ9IWEuZGlzYWJsZWQsbj1vLmNyZWF0ZUVsZW1lbnQoImlucHV0Iiksbi52YWx1ZT0idCIsbi50eXBlPSJyYWRpbyIsdC5yYWRpb1ZhbHVlPSJ0Ij09PW4udmFsdWUsbi5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJ0Iiksbi5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0Iiksci5hcHBlbmRDaGlsZChuKSx0LmNoZWNrQ2xvbmU9ci5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsdC5mb2N1c2luQnViYmxlcz0ib25mb2N1c2luImluIGUsaS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iY29udGVudC1ib3giLGkuY2xvbmVOb2RlKCEwKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcD0iIix0LmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09aS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCx4KGZ1bmN0aW9uKCl7dmFyIG4scixzPSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jazstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7LW1vei1ib3gtc2l6aW5nOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Y29udGVudC1ib3giLGE9by5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdO2EmJihuPW8uY3JlYXRlRWxlbWVudCgiZGl2Iiksbi5zdHlsZS5jc3NUZXh0PSJib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6LTk5OTlweDttYXJnaW4tdG9wOjFweCIsYS5hcHBlbmRDaGlsZChuKS5hcHBlbmRDaGlsZChpKSxpLmlubmVySFRNTD0iIixpLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpib3JkZXItYm94Oy1tb3otYm94LXNpemluZzpib3JkZXItYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElIix4LnN3YXAoYSxudWxsIT1hLnN0eWxlLnpvb20/e3pvb206MX06e30sZnVuY3Rpb24oKXt0LmJveFNpemluZz00PT09aS5vZmZzZXRXaWR0aH0pLGUuZ2V0Q29tcHV0ZWRTdHlsZSYmKHQucGl4ZWxQb3NpdGlvbj0iMSUiIT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShpLG51bGwpfHx7fSkudG9wLHQuYm94U2l6aW5nUmVsaWFibGU9IjRweCI9PT0oZS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt3aWR0aDoiNHB4In0pLndpZHRoLHI9aS5hcHBlbmRDaGlsZChvLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxyLnN0eWxlLmNzc1RleHQ9aS5zdHlsZS5jc3NUZXh0PXMsci5zdHlsZS5tYXJnaW5SaWdodD1yLnN0eWxlLndpZHRoPSIwIixpLnN0eWxlLndpZHRoPSIxcHgiLHQucmVsaWFibGVNYXJnaW5SaWdodD0hcGFyc2VGbG9hdCgoZS5nZXRDb21wdXRlZFN0eWxlKHIsbnVsbCl8fHt9KS5tYXJnaW5SaWdodCkpLGEucmVtb3ZlQ2hpbGQobikpfSksdCk6dH0oe30pO3ZhciBMLHEsSD0vKD86XHtbXHNcU10qXH18XFtbXHNcU10qXF0pJC8sTz0vKFtBLVpdKS9nO2Z1bmN0aW9uIEYoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5jYWNoZT17fSwwLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm57fX19KSx0aGlzLmV4cGFuZG89eC5leHBhbmRvK01hdGgucmFuZG9tKCl9Ri51aWQ9MSxGLmFjY2VwdHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubm9kZVR5cGU/MT09PWUubm9kZVR5cGV8fDk9PT1lLm5vZGVUeXBlOiEwfSxGLnByb3RvdHlwZT17a2V5OmZ1bmN0aW9uKGUpe2lmKCFGLmFjY2VwdHMoZSkpcmV0dXJuIDA7dmFyIHQ9e30sbj1lW3RoaXMuZXhwYW5kb107aWYoIW4pe249Ri51aWQrKzt0cnl7dFt0aGlzLmV4cGFuZG9dPXt2YWx1ZTpufSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLHQpfWNhdGNoKHIpe3RbdGhpcy5leHBhbmRvXT1uLHguZXh0ZW5kKGUsdCl9fXJldHVybiB0aGlzLmNhY2hlW25dfHwodGhpcy5jYWNoZVtuXT17fSksbn0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpPXRoaXMua2V5KGUpLG89dGhpcy5jYWNoZVtpXTtpZigic3RyaW5nIj09dHlwZW9mIHQpb1t0XT1uO2Vsc2UgaWYoeC5pc0VtcHR5T2JqZWN0KG8pKXguZXh0ZW5kKHRoaXMuY2FjaGVbaV0sdCk7ZWxzZSBmb3IociBpbiB0KW9bcl09dFtyXTtyZXR1cm4gb30sZ2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jYWNoZVt0aGlzLmtleShlKV07cmV0dXJuIHQ9PT11bmRlZmluZWQ/bjpuW3RdfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiB0PT09dW5kZWZpbmVkfHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJm49PT11bmRlZmluZWQ/KHI9dGhpcy5nZXQoZSx0KSxyIT09dW5kZWZpbmVkP3I6dGhpcy5nZXQoZSx4LmNhbWVsQ2FzZSh0KSkpOih0aGlzLnNldChlLHQsbiksbiE9PXVuZGVmaW5lZD9uOnQpfSxyZW1vdmU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbz10aGlzLmtleShlKSxzPXRoaXMuY2FjaGVbb107aWYodD09PXVuZGVmaW5lZCl0aGlzLmNhY2hlW29dPXt9O2Vsc2V7eC5pc0FycmF5KHQpP3I9dC5jb25jYXQodC5tYXAoeC5jYW1lbENhc2UpKTooaT14LmNhbWVsQ2FzZSh0KSx0IGluIHM/cj1bdCxpXToocj1pLHI9ciBpbiBzP1tyXTpyLm1hdGNoKHcpfHxbXSkpLG49ci5sZW5ndGg7d2hpbGUobi0tKWRlbGV0ZSBzW3Jbbl1dfX0saGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4heC5pc0VtcHR5T2JqZWN0KHRoaXMuY2FjaGVbZVt0aGlzLmV4cGFuZG9dXXx8e30pfSxkaXNjYXJkOmZ1bmN0aW9uKGUpe2VbdGhpcy5leHBhbmRvXSYmZGVsZXRlIHRoaXMuY2FjaGVbZVt0aGlzLmV4cGFuZG9dXX19LEw9bmV3IEYscT1uZXcgRix4LmV4dGVuZCh7YWNjZXB0RGF0YTpGLmFjY2VwdHMsaGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gTC5oYXNEYXRhKGUpfHxxLmhhc0RhdGEoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBMLmFjY2VzcyhlLHQsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtMLnJlbW92ZShlLHQpfSxfZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHEuYWNjZXNzKGUsdCxuKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXtxLnJlbW92ZShlLHQpfX0pLHguZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXRoaXNbMF0sbz0wLHM9bnVsbDtpZihlPT09dW5kZWZpbmVkKXtpZih0aGlzLmxlbmd0aCYmKHM9TC5nZXQoaSksMT09PWkubm9kZVR5cGUmJiFxLmdldChpLCJoYXNEYXRhQXR0cnMiKSkpe2ZvcihuPWkuYXR0cmlidXRlcztuLmxlbmd0aD5vO28rKylyPW5bb10ubmFtZSwwPT09ci5pbmRleE9mKCJkYXRhLSIpJiYocj14LmNhbWVsQ2FzZShyLnNsaWNlKDUpKSxQKGkscixzW3JdKSk7cS5zZXQoaSwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIHN9cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe0wuc2V0KHRoaXMsZSl9KTp4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKHQpe3ZhciBuLHI9eC5jYW1lbENhc2UoZSk7aWYoaSYmdD09PXVuZGVmaW5lZCl7aWYobj1MLmdldChpLGUpLG4hPT11bmRlZmluZWQpcmV0dXJuIG47aWYobj1MLmdldChpLHIpLG4hPT11bmRlZmluZWQpcmV0dXJuIG47aWYobj1QKGkscix1bmRlZmluZWQpLG4hPT11bmRlZmluZWQpcmV0dXJuIG59ZWxzZSB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1MLmdldCh0aGlzLHIpO0wuc2V0KHRoaXMscix0KSwtMSE9PWUuaW5kZXhPZigiLSIpJiZuIT09dW5kZWZpbmVkJiZMLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TC5yZW1vdmUodGhpcyxlKX0pfX0pO2Z1bmN0aW9uIFAoZSx0LG4pe3ZhciByO2lmKG49PT11bmRlZmluZWQmJjE9PT1lLm5vZGVUeXBlKWlmKHI9ImRhdGEtIit0LnJlcGxhY2UoTywiLSQxIikudG9Mb3dlckNhc2UoKSxuPWUuZ2V0QXR0cmlidXRlKHIpLCJzdHJpbmciPT10eXBlb2Ygbil7dHJ5e249InRydWUiPT09bj8hMDoiZmFsc2UiPT09bj8hMToibnVsbCI9PT1uP251bGw6K24rIiI9PT1uPytuOkgudGVzdChuKT9KU09OLnBhcnNlKG4pOm59Y2F0Y2goaSl7fUwuc2V0KGUsdCxuKX1lbHNlIG49dW5kZWZpbmVkO3JldHVybiBufXguZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7cmV0dXJuIGU/KHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1xLmdldChlLHQpLG4mJighcnx8eC5pc0FycmF5KG4pP3I9cS5hY2Nlc3MoZSx0LHgubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdKTp1bmRlZmluZWR9LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49eC5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsaT1uLnNoaWZ0KCksbz14Ll9xdWV1ZUhvb2tzKGUsdCkscz1mdW5jdGlvbigpe3guZGVxdWV1ZShlLHQpCn07ImlucHJvZ3Jlc3MiPT09aSYmKGk9bi5zaGlmdCgpLHItLSksaSYmKCJmeCI9PT10JiZuLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgby5zdG9wLGkuY2FsbChlLHMsbykpLCFyJiZvJiZvLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10KyJxdWV1ZUhvb2tzIjtyZXR1cm4gcS5nZXQoZSxuKXx8cS5hY2Nlc3MoZSxuLHtlbXB0eTp4LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKS5hZGQoZnVuY3Rpb24oKXtxLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSx4LmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxuPmFyZ3VtZW50cy5sZW5ndGg/eC5xdWV1ZSh0aGlzWzBdLGUpOnQ9PT11bmRlZmluZWQ/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgbj14LnF1ZXVlKHRoaXMsZSx0KTt4Ll9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJnguZGVxdWV1ZSh0aGlzLGUpfSl9LGRlcXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3guZGVxdWV1ZSh0aGlzLGUpfSl9LGRlbGF5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9eC5meD94LmZ4LnNwZWVkc1tlXXx8ZTplLHQ9dHx8ImZ4Iix0aGlzLnF1ZXVlKHQsZnVuY3Rpb24odCxuKXt2YXIgcj1zZXRUaW1lb3V0KHQsZSk7bi5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHIpfX0pfSxjbGVhclF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnF1ZXVlKGV8fCJmeCIsW10pfSxwcm9taXNlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0xLGk9eC5EZWZlcnJlZCgpLG89dGhpcyxzPXRoaXMubGVuZ3RoLGE9ZnVuY3Rpb24oKXstLXJ8fGkucmVzb2x2ZVdpdGgobyxbb10pfTsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT11bmRlZmluZWQpLGU9ZXx8ImZ4Ijt3aGlsZShzLS0pbj1xLmdldChvW3NdLGUrInF1ZXVlSG9va3MiKSxuJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKGEpKTtyZXR1cm4gYSgpLGkucHJvbWlzZSh0KX19KTt2YXIgUixNLFc9L1tcdFxyXG5cZl0vZywkPS9cci9nLEI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaTt4LmZuLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihlLHQpe3JldHVybiB4LmFjY2Vzcyh0aGlzLHguYXR0cixlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5yZW1vdmVBdHRyKHRoaXMsZSl9KX0scHJvcDpmdW5jdGlvbihlLHQpe3JldHVybiB4LmFjY2Vzcyh0aGlzLHgucHJvcCxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbeC5wcm9wRml4W2VdfHxlXX0pfSxhZGRDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLHM9MCxhPXRoaXMubGVuZ3RoLHU9InN0cmluZyI9PXR5cGVvZiBlJiZlO2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYodSlmb3IodD0oZXx8IiIpLm1hdGNoKHcpfHxbXTthPnM7cysrKWlmKG49dGhpc1tzXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVywiICIpOiIgIikpe289MDt3aGlsZShpPXRbbysrXSkwPnIuaW5kZXhPZigiICIraSsiICIpJiYocis9aSsiICIpO24uY2xhc3NOYW1lPXgudHJpbShyKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxzPTAsYT10aGlzLmxlbmd0aCx1PTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGUmJmU7aWYoeC5pc0Z1bmN0aW9uKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS5yZW1vdmVDbGFzcyhlLmNhbGwodGhpcyx0LHRoaXMuY2xhc3NOYW1lKSl9KTtpZih1KWZvcih0PShlfHwiIikubWF0Y2godyl8fFtdO2E+cztzKyspaWYobj10aGlzW3NdLHI9MT09PW4ubm9kZVR5cGUmJihuLmNsYXNzTmFtZT8oIiAiK24uY2xhc3NOYW1lKyIgIikucmVwbGFjZShXLCIgIik6IiIpKXtvPTA7d2hpbGUoaT10W28rK10pd2hpbGUoci5pbmRleE9mKCIgIitpKyIgIik+PTApcj1yLnJlcGxhY2UoIiAiK2krIiAiLCIgIik7bi5jbGFzc05hbWU9ZT94LnRyaW0ocik6IiJ9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmInN0cmluZyI9PT1uP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOnguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24obil7eCh0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRoaXMuY2xhc3NOYW1lLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1uKXt2YXIgdCxpPTAsbz14KHRoaXMpLHM9ZS5tYXRjaCh3KXx8W107d2hpbGUodD1zW2krK10pby5oYXNDbGFzcyh0KT9vLnJlbW92ZUNsYXNzKHQpOm8uYWRkQ2xhc3ModCl9ZWxzZShuPT09cnx8ImJvb2xlYW4iPT09bikmJih0aGlzLmNsYXNzTmFtZSYmcS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6cS5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIil9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQ9IiAiK2UrIiAiLG49MCxyPXRoaXMubGVuZ3RoO2Zvcig7cj5uO24rKylpZigxPT09dGhpc1tuXS5ub2RlVHlwZSYmKCIgIit0aGlzW25dLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVywiICIpLmluZGV4T2YodCk+PTApcmV0dXJuITA7cmV0dXJuITF9LHZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPXguaXNGdW5jdGlvbihlKSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIGk7MT09PXRoaXMubm9kZVR5cGUmJihpPXI/ZS5jYWxsKHRoaXMsbix4KHRoaXMpLnZhbCgpKTplLG51bGw9PWk/aT0iIjoibnVtYmVyIj09dHlwZW9mIGk/aSs9IiI6eC5pc0FycmF5KGkpJiYoaT14Lm1hcChpLGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksdD14LnZhbEhvb2tzW3RoaXMudHlwZV18fHgudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSx0JiYic2V0ImluIHQmJnQuc2V0KHRoaXMsaSwidmFsdWUiKSE9PXVuZGVmaW5lZHx8KHRoaXMudmFsdWU9aSkpfSk7aWYoaSlyZXR1cm4gdD14LnZhbEhvb2tzW2kudHlwZV18fHgudmFsSG9va3NbaS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSx0JiYiZ2V0ImluIHQmJihuPXQuZ2V0KGksInZhbHVlIikpIT09dW5kZWZpbmVkP246KG49aS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIG4/bi5yZXBsYWNlKCQsIiIpOm51bGw9PW4/IiI6bil9fX0pLHguZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyaWJ1dGVzLnZhbHVlO3JldHVybiF0fHx0LnNwZWNpZmllZD9lLnZhbHVlOmUudGV4dH19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLm9wdGlvbnMsaT1lLnNlbGVjdGVkSW5kZXgsbz0ic2VsZWN0LW9uZSI9PT1lLnR5cGV8fDA+aSxzPW8/bnVsbDpbXSxhPW8/aSsxOnIubGVuZ3RoLHU9MD5pP2E6bz9pOjA7Zm9yKDthPnU7dSsrKWlmKG49clt1XSwhKCFuLnNlbGVjdGVkJiZ1IT09aXx8KHguc3VwcG9ydC5vcHREaXNhYmxlZD9uLmRpc2FibGVkOm51bGwhPT1uLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fG4ucGFyZW50Tm9kZS5kaXNhYmxlZCYmeC5ub2RlTmFtZShuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PXgobikudmFsKCksbylyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT1lLm9wdGlvbnMsbz14Lm1ha2VBcnJheSh0KSxzPWkubGVuZ3RoO3doaWxlKHMtLSlyPWlbc10sKHIuc2VsZWN0ZWQ9eC5pbkFycmF5KHgocikudmFsKCksbyk+PTApJiYobj0hMCk7cmV0dXJuIG58fChlLnNlbGVjdGVkSW5kZXg9LTEpLG99fX0sYXR0cjpmdW5jdGlvbihlLHQsbil7dmFyIGksbyxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gdHlwZW9mIGUuZ2V0QXR0cmlidXRlPT09cj94LnByb3AoZSx0LG4pOigxPT09cyYmeC5pc1hNTERvYyhlKXx8KHQ9dC50b0xvd2VyQ2FzZSgpLGk9eC5hdHRySG9va3NbdF18fCh4LmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP006UikpLG49PT11bmRlZmluZWQ/aSYmImdldCJpbiBpJiZudWxsIT09KG89aS5nZXQoZSx0KSk/bzoobz14LmZpbmQuYXR0cihlLHQpLG51bGw9PW8/dW5kZWZpbmVkOm8pOm51bGwhPT1uP2kmJiJzZXQiaW4gaSYmKG89aS5zZXQoZSxuLHQpKSE9PXVuZGVmaW5lZD9vOihlLnNldEF0dHJpYnV0ZSh0LG4rIiIpLG4pOih4LnJlbW92ZUF0dHIoZSx0KSx1bmRlZmluZWQpKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaT0wLG89dCYmdC5tYXRjaCh3KTtpZihvJiYxPT09ZS5ub2RlVHlwZSl3aGlsZShuPW9baSsrXSlyPXgucHJvcEZpeFtuXXx8bix4LmV4cHIubWF0Y2guYm9vbC50ZXN0KG4pJiYoZVtyXT0hMSksZS5yZW1vdmVBdHRyaWJ1dGUobil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXguc3VwcG9ydC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmeC5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gbz0xIT09c3x8IXguaXNYTUxEb2MoZSksbyYmKHQ9eC5wcm9wRml4W3RdfHx0LGk9eC5wcm9wSG9va3NbdF0pLG4hPT11bmRlZmluZWQ/aSYmInNldCJpbiBpJiYocj1pLnNldChlLG4sdCkpIT09dW5kZWZpbmVkP3I6ZVt0XT1uOmkmJiJnZXQiaW4gaSYmbnVsbCE9PShyPWkuZ2V0KGUsdCkpP3I6ZVt0XX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8Qi50ZXN0KGUubm9kZU5hbWUpfHxlLmhyZWY/ZS50YWJJbmRleDotMX19fX0pLE09e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9PT0hMT94LnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSx4LmVhY2goeC5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24oZSx0KXt2YXIgbj14LmV4cHIuYXR0ckhhbmRsZVt0XXx8eC5maW5kLmF0dHI7eC5leHByLmF0dHJIYW5kbGVbdF09ZnVuY3Rpb24oZSx0LHIpe3ZhciBpPXguZXhwci5hdHRySGFuZGxlW3RdLG89cj91bmRlZmluZWQ6KHguZXhwci5hdHRySGFuZGxlW3RdPXVuZGVmaW5lZCkhPW4oZSx0LHIpP3QudG9Mb3dlckNhc2UoKTpudWxsO3JldHVybiB4LmV4cHIuYXR0ckhhbmRsZVt0XT1pLG99fSkseC5zdXBwb3J0Lm9wdFNlbGVjdGVkfHwoeC5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJnQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsbnVsbH19KSx4LmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe3gucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSx4LmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXt4LnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5pc0FycmF5KHQpP2UuY2hlY2tlZD14LmluQXJyYXkoeChlKS52YWwoKSx0KT49MDp1bmRlZmluZWR9fSx4LnN1cHBvcnQuY2hlY2tPbnx8KHgudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KTt2YXIgST0vXmtleS8sej0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sXz0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sWD0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIFUoKXtyZXR1cm4hMH1mdW5jdGlvbiBZKCl7cmV0dXJuITF9ZnVuY3Rpb24gVigpe3RyeXtyZXR1cm4gby5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319eC5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLHQsbixpLG8pe3ZhciBzLGEsdSxsLGMscCxmLGgsZCxnLG0seT1xLmdldChlKTtpZih5KXtuLmhhbmRsZXImJihzPW4sbj1zLmhhbmRsZXIsbz1zLnNlbGVjdG9yKSxuLmd1aWR8fChuLmd1aWQ9eC5ndWlkKyspLChsPXkuZXZlbnRzKXx8KGw9eS5ldmVudHM9e30pLChhPXkuaGFuZGxlKXx8KGE9eS5oYW5kbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiB4PT09cnx8ZSYmeC5ldmVudC50cmlnZ2VyZWQ9PT1lLnR5cGU/dW5kZWZpbmVkOnguZXZlbnQuZGlzcGF0Y2guYXBwbHkoYS5lbGVtLGFyZ3VtZW50cyl9LGEuZWxlbT1lKSx0PSh0fHwiIikubWF0Y2godyl8fFsiIl0sYz10Lmxlbmd0aDt3aGlsZShjLS0pdT1YLmV4ZWModFtjXSl8fFtdLGQ9bT11WzFdLGc9KHVbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxkJiYoZj14LmV2ZW50LnNwZWNpYWxbZF18fHt9LGQ9KG8/Zi5kZWxlZ2F0ZVR5cGU6Zi5iaW5kVHlwZSl8fGQsZj14LmV2ZW50LnNwZWNpYWxbZF18fHt9LHA9eC5leHRlbmQoe3R5cGU6ZCxvcmlnVHlwZTptLGRhdGE6aSxoYW5kbGVyOm4sZ3VpZDpuLmd1aWQsc2VsZWN0b3I6byxuZWVkc0NvbnRleHQ6byYmeC5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KG8pLG5hbWVzcGFjZTpnLmpvaW4oIi4iKX0scyksKGg9bFtkXSl8fChoPWxbZF09W10saC5kZWxlZ2F0ZUNvdW50PTAsZi5zZXR1cCYmZi5zZXR1cC5jYWxsKGUsaSxnLGEpIT09ITF8fGUuYWRkRXZlbnRMaXN0ZW5lciYmZS5hZGRFdmVudExpc3RlbmVyKGQsYSwhMSkpLGYuYWRkJiYoZi5hZGQuY2FsbChlLHApLHAuaGFuZGxlci5ndWlkfHwocC5oYW5kbGVyLmd1aWQ9bi5ndWlkKSksbz9oLnNwbGljZShoLmRlbGVnYXRlQ291bnQrKywwLHApOmgucHVzaChwKSx4LmV2ZW50Lmdsb2JhbFtkXT0hMCk7ZT1udWxsfX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG8scyxhLHUsbCxjLHAsZixoLGQsZyxtPXEuaGFzRGF0YShlKSYmcS5nZXQoZSk7aWYobSYmKHU9bS5ldmVudHMpKXt0PSh0fHwiIikubWF0Y2godyl8fFsiIl0sbD10Lmxlbmd0aDt3aGlsZShsLS0paWYoYT1YLmV4ZWModFtsXSl8fFtdLGg9Zz1hWzFdLGQ9KGFbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoKXtwPXguZXZlbnQuc3BlY2lhbFtoXXx8e30saD0ocj9wLmRlbGVnYXRlVHlwZTpwLmJpbmRUeXBlKXx8aCxmPXVbaF18fFtdLGE9YVsyXSYmUmVnRXhwKCIoXnxcXC4pIitkLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLHM9bz1mLmxlbmd0aDt3aGlsZShvLS0pYz1mW29dLCFpJiZnIT09Yy5vcmlnVHlwZXx8biYmbi5ndWlkIT09Yy5ndWlkfHxhJiYhYS50ZXN0KGMubmFtZXNwYWNlKXx8ciYmciE9PWMuc2VsZWN0b3ImJigiKioiIT09cnx8IWMuc2VsZWN0b3IpfHwoZi5zcGxpY2UobywxKSxjLnNlbGVjdG9yJiZmLmRlbGVnYXRlQ291bnQtLSxwLnJlbW92ZSYmcC5yZW1vdmUuY2FsbChlLGMpKTtzJiYhZi5sZW5ndGgmJihwLnRlYXJkb3duJiZwLnRlYXJkb3duLmNhbGwoZSxkLG0uaGFuZGxlKSE9PSExfHx4LnJlbW92ZUV2ZW50KGUsaCxtLmhhbmRsZSksZGVsZXRlIHVbaF0pfWVsc2UgZm9yKGggaW4gdSl4LmV2ZW50LnJlbW92ZShlLGgrdFtsXSxuLHIsITApO3guaXNFbXB0eU9iamVjdCh1KSYmKGRlbGV0ZSBtLmhhbmRsZSxxLnJlbW92ZShlLCJldmVudHMiKSl9fSx0cmlnZ2VyOmZ1bmN0aW9uKHQsbixyLGkpe3ZhciBzLGEsdSxsLGMscCxmLGg9W3J8fG9dLGQ9eS5jYWxsKHQsInR5cGUiKT90LnR5cGU6dCxnPXkuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGE9dT1yPXJ8fG8sMyE9PXIubm9kZVR5cGUmJjghPT1yLm5vZGVUeXBlJiYhXy50ZXN0KGQreC5ldmVudC50cmlnZ2VyZWQpJiYoZC5pbmRleE9mKCIuIik+PTAmJihnPWQuc3BsaXQoIi4iKSxkPWcuc2hpZnQoKSxnLnNvcnQoKSksYz0wPmQuaW5kZXhPZigiOiIpJiYib24iK2QsdD10W3guZXhwYW5kb10/dDpuZXcgeC5FdmVudChkLCJvYmplY3QiPT10eXBlb2YgdCYmdCksdC5pc1RyaWdnZXI9aT8yOjMsdC5uYW1lc3BhY2U9Zy5qb2luKCIuIiksdC5uYW1lc3BhY2VfcmU9dC5uYW1lc3BhY2U/UmVnRXhwKCIoXnxcXC4pIitnLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsdC5yZXN1bHQ9dW5kZWZpbmVkLHQudGFyZ2V0fHwodC50YXJnZXQ9ciksbj1udWxsPT1uP1t0XTp4Lm1ha2VBcnJheShuLFt0XSksZj14LmV2ZW50LnNwZWNpYWxbZF18fHt9LGl8fCFmLnRyaWdnZXJ8fGYudHJpZ2dlci5hcHBseShyLG4pIT09ITEpKXtpZighaSYmIWYubm9CdWJibGUmJiF4LmlzV2luZG93KHIpKXtmb3IobD1mLmRlbGVnYXRlVHlwZXx8ZCxfLnRlc3QobCtkKXx8KGE9YS5wYXJlbnROb2RlKTthO2E9YS5wYXJlbnROb2RlKWgucHVzaChhKSx1PWE7dT09PShyLm93bmVyRG9jdW1lbnR8fG8pJiZoLnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fGUpfXM9MDt3aGlsZSgoYT1oW3MrK10pJiYhdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXQudHlwZT1zPjE/bDpmLmJpbmRUeXBlfHxkLHA9KHEuZ2V0KGEsImV2ZW50cyIpfHx7fSlbdC50eXBlXSYmcS5nZXQoYSwiaGFuZGxlIikscCYmcC5hcHBseShhLG4pLHA9YyYmYVtjXSxwJiZ4LmFjY2VwdERhdGEoYSkmJnAuYXBwbHkmJnAuYXBwbHkoYSxuKT09PSExJiZ0LnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIHQudHlwZT1kLGl8fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fGYuX2RlZmF1bHQmJmYuX2RlZmF1bHQuYXBwbHkoaC5wb3AoKSxuKSE9PSExfHwheC5hY2NlcHREYXRhKHIpfHxjJiZ4LmlzRnVuY3Rpb24ocltkXSkmJiF4LmlzV2luZG93KHIpJiYodT1yW2NdLHUmJihyW2NdPW51bGwpLHguZXZlbnQudHJpZ2dlcmVkPWQscltkXSgpLHguZXZlbnQudHJpZ2dlcmVkPXVuZGVmaW5lZCx1JiYocltjXT11KSksdC5yZXN1bHR9fSxkaXNwYXRjaDpmdW5jdGlvbihlKXtlPXguZXZlbnQuZml4KGUpO3ZhciB0LG4scixpLG8scz1bXSxhPWQuY2FsbChhcmd1bWVudHMpLHU9KHEuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbZS50eXBlXXx8W10sbD14LmV2ZW50LnNwZWNpYWxbZS50eXBlXXx8e307aWYoYVswXT1lLGUuZGVsZWdhdGVUYXJnZXQ9dGhpcywhbC5wcmVEaXNwYXRjaHx8bC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsZSkhPT0hMSl7cz14LmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxlLHUpLHQ9MDt3aGlsZSgoaT1zW3QrK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXtlLmN1cnJlbnRUYXJnZXQ9aS5lbGVtLG49MDt3aGlsZSgobz1pLmhhbmRsZXJzW24rK10pJiYhZS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghZS5uYW1lc3BhY2VfcmV8fGUubmFtZXNwYWNlX3JlLnRlc3Qoby5uYW1lc3BhY2UpKSYmKGUuaGFuZGxlT2JqPW8sZS5kYXRhPW8uZGF0YSxyPSgoeC5ldmVudC5zcGVjaWFsW28ub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxvLmhhbmRsZXIpLmFwcGx5KGkuZWxlbSxhKSxyIT09dW5kZWZpbmVkJiYoZS5yZXN1bHQ9cik9PT0hMSYmKGUucHJldmVudERlZmF1bHQoKSxlLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGwucG9zdERpc3BhdGNoJiZsLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsZSksZS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihlLHQpe3ZhciBuLHIsaSxvLHM9W10sYT10LmRlbGVnYXRlQ291bnQsdT1lLnRhcmdldDtpZihhJiZ1Lm5vZGVUeXBlJiYoIWUuYnV0dG9ufHwiY2xpY2siIT09ZS50eXBlKSlmb3IoO3UhPT10aGlzO3U9dS5wYXJlbnROb2RlfHx0aGlzKWlmKHUuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWUudHlwZSl7Zm9yKHI9W10sbj0wO2E+bjtuKyspbz10W25dLGk9by5zZWxlY3RvcisiICIscltpXT09PXVuZGVmaW5lZCYmKHJbaV09by5uZWVkc0NvbnRleHQ/eChpLHRoaXMpLmluZGV4KHUpPj0wOnguZmluZChpLHRoaXMsbnVsbCxbdV0pLmxlbmd0aCkscltpXSYmci5wdXNoKG8pO3IubGVuZ3RoJiZzLnB1c2goe2VsZW06dSxoYW5kbGVyczpyfSl9cmV0dXJuIHQubGVuZ3RoPmEmJnMucHVzaCh7ZWxlbTp0aGlzLGhhbmRsZXJzOnQuc2xpY2UoYSl9KSxzfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09ZS53aGljaCYmKGUud2hpY2g9bnVsbCE9dC5jaGFyQ29kZT90LmNoYXJDb2RlOnQua2V5Q29kZSksZX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLHM9dC5idXR0b247cmV0dXJuIG51bGw9PWUucGFnZVgmJm51bGwhPXQuY2xpZW50WCYmKG49ZS50YXJnZXQub3duZXJEb2N1bWVudHx8byxyPW4uZG9jdW1lbnRFbGVtZW50LGk9bi5ib2R5LGUucGFnZVg9dC5jbGllbnRYKyhyJiZyLnNjcm9sbExlZnR8fGkmJmkuc2Nyb2xsTGVmdHx8MCktKHImJnIuY2xpZW50TGVmdHx8aSYmaS5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPXQuY2xpZW50WSsociYmci5zY3JvbGxUb3B8fGkmJmkuc2Nyb2xsVG9wfHwwKS0ociYmci5jbGllbnRUb3B8fGkmJmkuY2xpZW50VG9wfHwwKSksZS53aGljaHx8cz09PXVuZGVmaW5lZHx8KGUud2hpY2g9MSZzPzE6MiZzPzM6NCZzPzI6MCksZX19LGZpeDpmdW5jdGlvbihlKXtpZihlW3guZXhwYW5kb10pcmV0dXJuIGU7dmFyIHQsbixyLGk9ZS50eXBlLHM9ZSxhPXRoaXMuZml4SG9va3NbaV07YXx8KHRoaXMuZml4SG9va3NbaV09YT16LnRlc3QoaSk/dGhpcy5tb3VzZUhvb2tzOkkudGVzdChpKT90aGlzLmtleUhvb2tzOnt9KSxyPWEucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoYS5wcm9wcyk6dGhpcy5wcm9wcyxlPW5ldyB4LkV2ZW50KHMpLHQ9ci5sZW5ndGg7d2hpbGUodC0tKW49clt0XSxlW25dPXNbbl07cmV0dXJuIGUudGFyZ2V0fHwoZS50YXJnZXQ9byksMz09PWUudGFyZ2V0Lm5vZGVUeXBlJiYoZS50YXJnZXQ9ZS50YXJnZXQucGFyZW50Tm9kZSksYS5maWx0ZXI/YS5maWx0ZXIoZSxzKTplfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyE9PVYoKSYmdGhpcy5mb2N1cz8odGhpcy5mb2N1cygpLCExKTp1bmRlZmluZWR9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcz09PVYoKSYmdGhpcy5ibHVyPyh0aGlzLmJsdXIoKSwhMSk6dW5kZWZpbmVkfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4iY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZ4Lm5vZGVOYW1lKHRoaXMsImlucHV0Iik/KHRoaXMuY2xpY2soKSwhMSk6dW5kZWZpbmVkfSxfZGVmYXVsdDpmdW5jdGlvbihlKXtyZXR1cm4geC5ub2RlTmFtZShlLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7ZS5yZXN1bHQhPT11bmRlZmluZWQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXguZXh0ZW5kKG5ldyB4LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj94LmV2ZW50LnRyaWdnZXIoaSxudWxsLHQpOnguZXZlbnQuZGlzcGF0Y2guY2FsbCh0LGkpLGkuaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ucHJldmVudERlZmF1bHQoKX19LHgucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24oZSx0LG4pe2UucmVtb3ZlRXZlbnRMaXN0ZW5lciYmZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSl9LHguRXZlbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHguRXZlbnQ/KGUmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fGUuZ2V0UHJldmVudERlZmF1bHQmJmUuZ2V0UHJldmVudERlZmF1bHQoKT9VOlkpOnRoaXMudHlwZT1lLHQmJnguZXh0ZW5kKHRoaXMsdCksdGhpcy50aW1lU3RhbXA9ZSYmZS50aW1lU3RhbXB8fHgubm93KCksdGhpc1t4LmV4cGFuZG9dPSEwLHVuZGVmaW5lZCk6bmV3IHguRXZlbnQoZSx0KX0seC5FdmVudC5wcm90b3R5cGU9e2lzRGVmYXVsdFByZXZlbnRlZDpZLGlzUHJvcGFnYXRpb25TdG9wcGVkOlksaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6WSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1VLGUmJmUucHJldmVudERlZmF1bHQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9VSxlJiZlLnN0b3BQcm9wYWdhdGlvbiYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1VLHRoaXMuc3RvcFByb3BhZ2F0aW9uKCl9fSx4LmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihlLHQpe3guZXZlbnQuc3BlY2lhbFtlXT17ZGVsZWdhdGVUeXBlOnQsYmluZFR5cGU6dCxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG4scj10aGlzLGk9ZS5yZWxhdGVkVGFyZ2V0LG89ZS5oYW5kbGVPYmo7cmV0dXJuKCFpfHxpIT09ciYmIXguY29udGFpbnMocixpKSkmJihlLnR5cGU9by5vcmlnVHlwZSxuPW8uaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS50eXBlPXQpLG59fX0pLHguc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8eC5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihlLHQpe3ZhciBuPTAscj1mdW5jdGlvbihlKXt4LmV2ZW50LnNpbXVsYXRlKHQsZS50YXJnZXQseC5ldmVudC5maXgoZSksITApfTt4LmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7MD09PW4rKyYmby5hZGRFdmVudExpc3RlbmVyKGUsciwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7MD09PS0tbiYmby5yZW1vdmVFdmVudExpc3RlbmVyKGUsciwhMCl9fX0pLHguZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvLHM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPW58fHQsdD11bmRlZmluZWQpO2ZvcihzIGluIGUpdGhpcy5vbihzLHQsbixlW3NdLGkpO3JldHVybiB0aGlzfWlmKG51bGw9PW4mJm51bGw9PXI/KHI9dCxuPXQ9dW5kZWZpbmVkKTpudWxsPT1yJiYoInN0cmluZyI9PXR5cGVvZiB0PyhyPW4sbj11bmRlZmluZWQpOihyPW4sbj10LHQ9dW5kZWZpbmVkKSkscj09PSExKXI9WTtlbHNlIGlmKCFyKXJldHVybiB0aGlzO3JldHVybiAxPT09aSYmKG89cixyPWZ1bmN0aW9uKGUpe3JldHVybiB4KCkub2ZmKGUpLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxyLmd1aWQ9by5ndWlkfHwoby5ndWlkPXguZ3VpZCsrKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5hZGQodGhpcyxlLHIsbix0KX0pfSxvbmU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24oZSx0LG4sciwxKX0sb2ZmOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpO2lmKGUmJmUucHJldmVudERlZmF1bHQmJmUuaGFuZGxlT2JqKXJldHVybiByPWUuaGFuZGxlT2JqLHgoZS5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXtmb3IoaSBpbiBlKXRoaXMub2ZmKGksdCxlW2ldKTtyZXR1cm4gdGhpc31yZXR1cm4odD09PSExfHwiZnVuY3Rpb24iPT10eXBlb2YgdCkmJihuPXQsdD11bmRlZmluZWQpLG49PT0hMSYmKG49WSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5yZW1vdmUodGhpcyxlLG4sdCl9KX0sdHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpc1swXTtyZXR1cm4gbj94LmV2ZW50LnRyaWdnZXIoZSx0LG4sITApOnVuZGVmaW5lZH19KTt2YXIgRz0vXi5bXjojXFtcLixdKiQvLEo9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sUT14LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LEs9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07eC5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1bXSxyPXRoaXMsaT1yLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIHRoaXMucHVzaFN0YWNrKHgoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDtpPnQ7dCsrKWlmKHguY29udGFpbnMoclt0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IodD0wO2k+dDt0KyspeC5maW5kKGUsclt0XSxuKTtyZXR1cm4gbj10aGlzLnB1c2hTdGFjayhpPjE/eC51bmlxdWUobik6biksbi5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2U6ZSxufSxoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9eChlLHRoaXMpLG49dC5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9MDtmb3IoO24+ZTtlKyspaWYoeC5jb250YWlucyh0aGlzLHRbZV0pKXJldHVybiEwfSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZXQodGhpcyxlfHxbXSwhMCkpfSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGV0KHRoaXMsZXx8W10sITEpKX0saXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFldCh0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmUS50ZXN0KGUpP3goZSk6ZXx8W10sITEpLmxlbmd0aH0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10scz1RLnRlc3QoZSl8fCJzdHJpbmciIT10eXBlb2YgZT94KGUsdHx8dGhpcy5jb250ZXh0KTowO2Zvcig7aT5yO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT10O249bi5wYXJlbnROb2RlKWlmKDExPm4ubm9kZVR5cGUmJihzP3MuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJnguZmluZC5tYXRjaGVzU2VsZWN0b3IobixlKSkpe249by5wdXNoKG4pO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhvLmxlbmd0aD4xP3gudW5pcXVlKG8pOm8pfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/Zy5jYWxsKHgoZSksdGhpc1swXSk6Zy5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3ZhciBuPSJzdHJpbmciPT10eXBlb2YgZT94KGUsdCk6eC5tYWtlQXJyYXkoZSYmZS5ub2RlVHlwZT9bZV06ZSkscj14Lm1lcmdlKHRoaXMuZ2V0KCksbik7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgudW5pcXVlKHIpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSk7ZnVuY3Rpb24gWihlLHQpe3doaWxlKChlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZSk7cmV0dXJuIGV9eC5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiYxMSE9PXQubm9kZVR5cGU/dDpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZGlyKGUsInBhcmVudE5vZGUiLG4pfSxuZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBaKGUsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIFooZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJuZXh0U2libGluZyIsbil9LHByZXZVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZGlyKGUsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKGUpe3JldHVybiB4LnNpYmxpbmcoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGUpe3JldHVybiB4LnNpYmxpbmcoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGVudERvY3VtZW50fHx4Lm1lcmdlKFtdLGUuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgaT14Lm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihpPXguZmlsdGVyKHIsaSkpLHRoaXMubGVuZ3RoPjEmJihLW2VdfHx4LnVuaXF1ZShpKSxKLnRlc3QoZSkmJmkucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhpKX19KSx4LmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP3guZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106eC5maW5kLm1hdGNoZXMoZSx4LmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LGRpcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT1uIT09dW5kZWZpbmVkO3doaWxlKChlPWVbdF0pJiY5IT09ZS5ub2RlVHlwZSlpZigxPT09ZS5ub2RlVHlwZSl7aWYoaSYmeChlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LHNpYmxpbmc6ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtmb3IoO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufX0pO2Z1bmN0aW9uIGV0KGUsdCxuKXtpZih4LmlzRnVuY3Rpb24odCkpcmV0dXJuIHguZ3JlcChlLGZ1bmN0aW9uKGUscil7cmV0dXJuISF0LmNhbGwoZSxyLGUpIT09bn0pO2lmKHQubm9kZVR5cGUpcmV0dXJuIHguZ3JlcChlLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dCE9PW59KTtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKEcudGVzdCh0KSlyZXR1cm4geC5maWx0ZXIodCxlLG4pO3Q9eC5maWx0ZXIodCxlKX1yZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGcuY2FsbCh0LGUpPj0wIT09bn0pfXZhciB0dD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2dpLG50PS88KFtcdzpdKykvLHJ0PS88fCYjP1x3KzsvLGl0PS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksb3Q9L14oPzpjaGVja2JveHxyYWRpbykkL2ksc3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYXQ9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHV0PS9edHJ1ZVwvKC4qKS8sbHQ9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLGN0PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07Y3Qub3B0Z3JvdXA9Y3Qub3B0aW9uLGN0LnRib2R5PWN0LnRmb290PWN0LmNvbGdyb3VwPWN0LmNhcHRpb249Y3QudGhlYWQsY3QudGg9Y3QudGQseC5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT11bmRlZmluZWQ/eC50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8bykuY3JlYXRlVGV4dE5vZGUoZSkpfSxudWxsLGUsYXJndW1lbnRzLmxlbmd0aCl9LGFwcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7dmFyIHQ9cHQodGhpcyxlKTt0LmFwcGVuZENoaWxkKGUpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1wdCh0aGlzLGUpO3QuaW5zZXJ0QmVmb3JlKGUsdC5maXJzdENoaWxkKX19KX0sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZT94LmZpbHRlcihlLHRoaXMpOnRoaXMsaT0wO2Zvcig7bnVsbCE9KG49cltpXSk7aSsrKXR8fDEhPT1uLm5vZGVUeXBlfHx4LmNsZWFuRGF0YShtdChuKSksbi5wYXJlbnROb2RlJiYodCYmeC5jb250YWlucyhuLm93bmVyRG9jdW1lbnQsbikmJmR0KG10KG4sInNjcmlwdCIpKSxuLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobikpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpe3ZhciBlLHQ9MDtmb3IoO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKHguY2xlYW5EYXRhKG10KGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsPT1lPyExOmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB4LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKGU9PT11bmRlZmluZWQmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiFpdC50ZXN0KGUpJiYhY3RbKG50LmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPWUucmVwbGFjZSh0dCwiPCQxPjwvJDI+Iik7dHJ5e2Zvcig7cj5uO24rKyl0PXRoaXNbbl18fHt9LDE9PT10Lm5vZGVUeXBlJiYoeC5jbGVhbkRhdGEobXQodCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChpKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgZT14Lm1hcCh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybltlLm5leHRTaWJsaW5nLGUucGFyZW50Tm9kZV19KSx0PTA7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKG4pe3ZhciByPWVbdCsrXSxpPWVbdCsrXTtpJiYociYmci5wYXJlbnROb2RlIT09aSYmKHI9dGhpcy5uZXh0U2libGluZykseCh0aGlzKS5yZW1vdmUoKSxpLmluc2VydEJlZm9yZShuLHIpKX0sITApLHQ/dGhpczp0aGlzLnJlbW92ZSgpfSxkZXRhY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVtb3ZlKGUsITApfSxkb21NYW5pcDpmdW5jdGlvbihlLHQsbil7ZT1mLmFwcGx5KFtdLGUpO3ZhciByLGksbyxzLGEsdSxsPTAsYz10aGlzLmxlbmd0aCxwPXRoaXMsaD1jLTEsZD1lWzBdLGc9eC5pc0Z1bmN0aW9uKGQpO2lmKGd8fCEoMT49Y3x8InN0cmluZyIhPXR5cGVvZiBkfHx4LnN1cHBvcnQuY2hlY2tDbG9uZSkmJnN0LnRlc3QoZCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihyKXt2YXIgaT1wLmVxKHIpO2cmJihlWzBdPWQuY2FsbCh0aGlzLHIsaS5odG1sKCkpKSxpLmRvbU1hbmlwKGUsdCxuKX0pO2lmKGMmJihyPXguYnVpbGRGcmFnbWVudChlLHRoaXNbMF0ub3duZXJEb2N1bWVudCwhMSwhbiYmdGhpcyksaT1yLmZpcnN0Q2hpbGQsMT09PXIuY2hpbGROb2Rlcy5sZW5ndGgmJihyPWkpLGkpKXtmb3Iobz14Lm1hcChtdChyLCJzY3JpcHQiKSxmdCkscz1vLmxlbmd0aDtjPmw7bCsrKWE9cixsIT09aCYmKGE9eC5jbG9uZShhLCEwLCEwKSxzJiZ4Lm1lcmdlKG8sbXQoYSwic2NyaXB0IikpKSx0LmNhbGwodGhpc1tsXSxhLGwpO2lmKHMpZm9yKHU9b1tvLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LHgubWFwKG8saHQpLGw9MDtzPmw7bCsrKWE9b1tsXSxhdC50ZXN0KGEudHlwZXx8IiIpJiYhcS5hY2Nlc3MoYSwiZ2xvYmFsRXZhbCIpJiZ4LmNvbnRhaW5zKHUsYSkmJihhLnNyYz94Ll9ldmFsVXJsKGEuc3JjKTp4Lmdsb2JhbEV2YWwoYS50ZXh0Q29udGVudC5yZXBsYWNlKGx0LCIiKSkpfXJldHVybiB0aGlzfX0pLHguZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5mbltlXT1mdW5jdGlvbihlKXt2YXIgbixyPVtdLGk9eChlKSxvPWkubGVuZ3RoLTEscz0wO2Zvcig7bz49cztzKyspbj1zPT09bz90aGlzOnRoaXMuY2xvbmUoITApLHgoaVtzXSlbdF0obiksaC5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KSx4LmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxzLGE9ZS5jbG9uZU5vZGUoITApLHU9eC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSk7aWYoISh4LnN1cHBvcnQubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHguaXNYTUxEb2MoZSkpKWZvcihzPW10KGEpLG89bXQoZSkscj0wLGk9by5sZW5ndGg7aT5yO3IrKyl5dChvW3JdLHNbcl0pO2lmKHQpaWYobilmb3Iobz1vfHxtdChlKSxzPXN8fG10KGEpLHI9MCxpPW8ubGVuZ3RoO2k+cjtyKyspZ3Qob1tyXSxzW3JdKTtlbHNlIGd0KGUsYSk7cmV0dXJuIHM9bXQoYSwic2NyaXB0Iikscy5sZW5ndGg+MCYmZHQocywhdSYmbXQoZSwic2NyaXB0IikpLGF9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGksbyxzLGEsdSxsLGM9MCxwPWUubGVuZ3RoLGY9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksaD1bXTtmb3IoO3A+YztjKyspaWYoaT1lW2NdLGl8fDA9PT1pKWlmKCJvYmplY3QiPT09eC50eXBlKGkpKXgubWVyZ2UoaCxpLm5vZGVUeXBlP1tpXTppKTtlbHNlIGlmKHJ0LnRlc3QoaSkpe289b3x8Zi5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSxzPShudC5leGVjKGkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGE9Y3Rbc118fGN0Ll9kZWZhdWx0LG8uaW5uZXJIVE1MPWFbMV0raS5yZXBsYWNlKHR0LCI8JDE+PC8kMj4iKSthWzJdLGw9YVswXTt3aGlsZShsLS0pbz1vLmxhc3RDaGlsZDt4Lm1lcmdlKGgsby5jaGlsZE5vZGVzKSxvPWYuZmlyc3RDaGlsZCxvLnRleHRDb250ZW50PSIifWVsc2UgaC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUoaSkpO2YudGV4dENvbnRlbnQ9IiIsYz0wO3doaWxlKGk9aFtjKytdKWlmKCghcnx8LTE9PT14LmluQXJyYXkoaSxyKSkmJih1PXguY29udGFpbnMoaS5vd25lckRvY3VtZW50LGkpLG89bXQoZi5hcHBlbmRDaGlsZChpKSwic2NyaXB0IiksdSYmZHQobyksbikpe2w9MDt3aGlsZShpPW9bbCsrXSlhdC50ZXN0KGkudHlwZXx8IiIpJiZuLnB1c2goaSl9cmV0dXJuIGZ9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLHMsYT14LmV2ZW50LnNwZWNpYWwsdT0wO2Zvcig7KG49ZVt1XSkhPT11bmRlZmluZWQ7dSsrKXtpZihGLmFjY2VwdHMobikmJihvPW5bcS5leHBhbmRvXSxvJiYodD1xLmNhY2hlW29dKSkpe2lmKHI9T2JqZWN0LmtleXModC5ldmVudHN8fHt9KSxyLmxlbmd0aClmb3Iocz0wOyhpPXJbc10pIT09dW5kZWZpbmVkO3MrKylhW2ldP3guZXZlbnQucmVtb3ZlKG4saSk6eC5yZW1vdmVFdmVudChuLGksdC5oYW5kbGUpO3EuY2FjaGVbb10mJmRlbGV0ZSBxLmNhY2hlW29dfWRlbGV0ZSBMLmNhY2hlW25bTC5leHBhbmRvXV19fSxfZXZhbFVybDpmdW5jdGlvbihlKXtyZXR1cm4geC5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfX0pO2Z1bmN0aW9uIHB0KGUsdCl7cmV0dXJuIHgubm9kZU5hbWUoZSwidGFibGUiKSYmeC5ub2RlTmFtZSgxPT09dC5ub2RlVHlwZT90OnQuZmlyc3RDaGlsZCwidHIiKT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdfHxlLmFwcGVuZENoaWxkKGUub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKTplfWZ1bmN0aW9uIGZ0KGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gaHQoZSl7dmFyIHQ9dXQuZXhlYyhlLnR5cGUpO3JldHVybiB0P2UudHlwZT10WzFdOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBkdChlLHQpe3ZhciBuPWUubGVuZ3RoLHI9MDtmb3IoO24+cjtyKyspcS5zZXQoZVtyXSwiZ2xvYmFsRXZhbCIsIXR8fHEuZ2V0KHRbcl0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gZ3QoZSx0KXt2YXIgbixyLGksbyxzLGEsdSxsO2lmKDE9PT10Lm5vZGVUeXBlKXtpZihxLmhhc0RhdGEoZSkmJihvPXEuYWNjZXNzKGUpLHM9cS5zZXQodCxvKSxsPW8uZXZlbnRzKSl7ZGVsZXRlIHMuaGFuZGxlLHMuZXZlbnRzPXt9O2ZvcihpIGluIGwpZm9yKG49MCxyPWxbaV0ubGVuZ3RoO3I+bjtuKyspeC5ldmVudC5hZGQodCxpLGxbaV1bbl0pfUwuaGFzRGF0YShlKSYmKGE9TC5hY2Nlc3MoZSksdT14LmV4dGVuZCh7fSxhKSxMLnNldCh0LHUpKX19ZnVuY3Rpb24gbXQoZSx0KXt2YXIgbj1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodHx8IioiKTplLnF1ZXJ5U2VsZWN0b3JBbGw/ZS5xdWVyeVNlbGVjdG9yQWxsKHR8fCIqIik6W107cmV0dXJuIHQ9PT11bmRlZmluZWR8fHQmJngubm9kZU5hbWUoZSx0KT94Lm1lcmdlKFtlXSxuKTpufWZ1bmN0aW9uIHl0KGUsdCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOyJpbnB1dCI9PT1uJiZvdC50ZXN0KGUudHlwZSk/dC5jaGVja2VkPWUuY2hlY2tlZDooImlucHV0Ij09PW58fCJ0ZXh0YXJlYSI9PT1uKSYmKHQuZGVmYXVsdFZhbHVlPWUuZGVmYXVsdFZhbHVlKX14LmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4geC5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLndyYXBBbGwoZS5jYWxsKHRoaXMsdCkpfSk6KHRoaXNbMF0mJih0PXgoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpczt3aGlsZShlLmZpcnN0RWxlbWVudENoaWxkKWU9ZS5maXJzdEVsZW1lbnRDaGlsZDtyZXR1cm4gZX0pLmFwcGVuZCh0aGlzKSksdGhpcyl9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4geC5pc0Z1bmN0aW9uKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLndyYXBJbm5lcihlLmNhbGwodGhpcyx0KSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD14KHRoaXMpLG49dC5jb250ZW50cygpO24ubGVuZ3RoP24ud3JhcEFsbChlKTp0LmFwcGVuZChlKX0pfSx3cmFwOmZ1bmN0aW9uKGUpe3ZhciB0PXguaXNGdW5jdGlvbihlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3godGhpcykud3JhcEFsbCh0P2UuY2FsbCh0aGlzLG4pOmUpfSl9LHVud3JhcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhcmVudCgpLmVhY2goZnVuY3Rpb24oKXt4Lm5vZGVOYW1lKHRoaXMsImJvZHkiKXx8eCh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSkuZW5kKCl9fSk7dmFyIHZ0LHh0LGJ0PS9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyx3dD0vXm1hcmdpbi8sVHQ9UmVnRXhwKCJeKCIrYisiKSguKikkIiwiaSIpLEN0PVJlZ0V4cCgiXigiK2IrIikoPyFweClbYS16JV0rJCIsImkiKSxrdD1SZWdFeHAoIl4oWystXSk9KCIrYisiKSIsImkiKSxOdD17Qk9EWToiYmxvY2sifSxFdD17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6ImJsb2NrIn0sU3Q9e2xldHRlclNwYWNpbmc6MCxmb250V2VpZ2h0OjQwMH0sanQ9WyJUb3AiLCJSaWdodCIsIkJvdHRvbSIsIkxlZnQiXSxEdD1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIEF0KGUsdCl7aWYodCBpbiBlKXJldHVybiB0O3ZhciBuPXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKSxyPXQsaT1EdC5sZW5ndGg7d2hpbGUoaS0tKWlmKHQ9RHRbaV0rbix0IGluIGUpcmV0dXJuIHQ7cmV0dXJuIHJ9ZnVuY3Rpb24gTHQoZSx0KXtyZXR1cm4gZT10fHxlLCJub25lIj09PXguY3NzKGUsImRpc3BsYXkiKXx8IXguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfWZ1bmN0aW9uIHF0KHQpe3JldHVybiBlLmdldENvbXB1dGVkU3R5bGUodCxudWxsKX1mdW5jdGlvbiBIdChlLHQpe3ZhciBuLHIsaSxvPVtdLHM9MCxhPWUubGVuZ3RoO2Zvcig7YT5zO3MrKylyPWVbc10sci5zdHlsZSYmKG9bc109cS5nZXQociwib2xkZGlzcGxheSIpLG49ci5zdHlsZS5kaXNwbGF5LHQ/KG9bc118fCJub25lIiE9PW58fChyLnN0eWxlLmRpc3BsYXk9IiIpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZMdChyKSYmKG9bc109cS5hY2Nlc3Mociwib2xkZGlzcGxheSIsUnQoci5ub2RlTmFtZSkpKSk6b1tzXXx8KGk9THQociksKG4mJiJub25lIiE9PW58fCFpKSYmcS5zZXQociwib2xkZGlzcGxheSIsaT9uOnguY3NzKHIsImRpc3BsYXkiKSkpKTtmb3Iocz0wO2E+cztzKyspcj1lW3NdLHIuc3R5bGUmJih0JiYibm9uZSIhPT1yLnN0eWxlLmRpc3BsYXkmJiIiIT09ci5zdHlsZS5kaXNwbGF5fHwoci5zdHlsZS5kaXNwbGF5PXQ/b1tzXXx8IiI6Im5vbmUiKSk7cmV0dXJuIGV9eC5mbi5leHRlbmQoe2NzczpmdW5jdGlvbihlLHQpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG89e30scz0wO2lmKHguaXNBcnJheSh0KSl7Zm9yKHI9cXQoZSksaT10Lmxlbmd0aDtpPnM7cysrKW9bdFtzXV09eC5jc3MoZSx0W3NdLCExLHIpO3JldHVybiBvfXJldHVybiBuIT09dW5kZWZpbmVkP3guc3R5bGUoZSx0LG4pOnguY3NzKGUsdCl9LGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe0x0KHRoaXMpP3godGhpcykuc2hvdygpOngodGhpcykuaGlkZSgpfSl9fSkseC5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj12dChlLCJvcGFjaXR5Iik7cmV0dXJuIiI9PT1uPyIxIjpufX19fSxjc3NOdW1iZXI6e2NvbHVtbkNvdW50OiEwLGZpbGxPcGFjaXR5OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7ImZsb2F0IjoiY3NzRmxvYXQifSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBpLG8scyxhPXguY2FtZWxDYXNlKHQpLHU9ZS5zdHlsZTtyZXR1cm4gdD14LmNzc1Byb3BzW2FdfHwoeC5jc3NQcm9wc1thXT1BdCh1LGEpKSxzPXguY3NzSG9va3NbdF18fHguY3NzSG9va3NbYV0sbj09PXVuZGVmaW5lZD9zJiYiZ2V0ImluIHMmJihpPXMuZ2V0KGUsITEscikpIT09dW5kZWZpbmVkP2k6dVt0XToobz10eXBlb2Ygbiwic3RyaW5nIj09PW8mJihpPWt0LmV4ZWMobikpJiYobj0oaVsxXSsxKSppWzJdK3BhcnNlRmxvYXQoeC5jc3MoZSx0KSksbz0ibnVtYmVyIiksbnVsbD09bnx8Im51bWJlciI9PT1vJiZpc05hTihuKXx8KCJudW1iZXIiIT09b3x8eC5jc3NOdW1iZXJbYV18fChuKz0icHgiKSx4LnN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KHVbdF09ImluaGVyaXQiKSxzJiYic2V0ImluIHMmJihuPXMuc2V0KGUsbixyKSk9PT11bmRlZmluZWR8fCh1W3RdPW4pKSx1bmRlZmluZWQpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpLG8scyxhPXguY2FtZWxDYXNlKHQpO3JldHVybiB0PXguY3NzUHJvcHNbYV18fCh4LmNzc1Byb3BzW2FdPUF0KGUuc3R5bGUsYSkpLHM9eC5jc3NIb29rc1t0XXx8eC5jc3NIb29rc1thXSxzJiYiZ2V0ImluIHMmJihpPXMuZ2V0KGUsITAsbikpLGk9PT11bmRlZmluZWQmJihpPXZ0KGUsdCxyKSksIm5vcm1hbCI9PT1pJiZ0IGluIFN0JiYoaT1TdFt0XSksIiI9PT1ufHxuPyhvPXBhcnNlRmxvYXQoaSksbj09PSEwfHx4LmlzTnVtZXJpYyhvKT9vfHwwOmkpOml9fSksdnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGksbyxzPW58fHF0KGUpLGE9cz9zLmdldFByb3BlcnR5VmFsdWUodCl8fHNbdF06dW5kZWZpbmVkLHU9ZS5zdHlsZTtyZXR1cm4gcyYmKCIiIT09YXx8eC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl8fChhPXguc3R5bGUoZSx0KSksQ3QudGVzdChhKSYmd3QudGVzdCh0KSYmKHI9dS53aWR0aCxpPXUubWluV2lkdGgsbz11Lm1heFdpZHRoLHUubWluV2lkdGg9dS5tYXhXaWR0aD11LndpZHRoPWEsYT1zLndpZHRoLHUud2lkdGg9cix1Lm1pbldpZHRoPWksdS5tYXhXaWR0aD1vKSksYX07ZnVuY3Rpb24gT3QoZSx0LG4pe3ZhciByPVR0LmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzFdLShufHwwKSkrKHJbMl18fCJweCIpOnR9ZnVuY3Rpb24gRnQoZSx0LG4scixpKXt2YXIgbz1uPT09KHI/ImJvcmRlciI6ImNvbnRlbnQiKT80OiJ3aWR0aCI9PT10PzE6MCxzPTA7Zm9yKDs0Pm87bys9MikibWFyZ2luIj09PW4mJihzKz14LmNzcyhlLG4ranRbb10sITAsaSkpLHI/KCJjb250ZW50Ij09PW4mJihzLT14LmNzcyhlLCJwYWRkaW5nIitqdFtvXSwhMCxpKSksIm1hcmdpbiIhPT1uJiYocy09eC5jc3MoZSwiYm9yZGVyIitqdFtvXSsiV2lkdGgiLCEwLGkpKSk6KHMrPXguY3NzKGUsInBhZGRpbmciK2p0W29dLCEwLGkpLCJwYWRkaW5nIiE9PW4mJihzKz14LmNzcyhlLCJib3JkZXIiK2p0W29dKyJXaWR0aCIsITAsaSkpKTtyZXR1cm4gc31mdW5jdGlvbiBQdChlLHQsbil7dmFyIHI9ITAsaT0id2lkdGgiPT09dD9lLm9mZnNldFdpZHRoOmUub2Zmc2V0SGVpZ2h0LG89cXQoZSkscz14LnN1cHBvcnQuYm94U2l6aW5nJiYiYm9yZGVyLWJveCI9PT14LmNzcyhlLCJib3hTaXppbmciLCExLG8pO2lmKDA+PWl8fG51bGw9PWkpe2lmKGk9dnQoZSx0LG8pLCgwPml8fG51bGw9PWkpJiYoaT1lLnN0eWxlW3RdKSxDdC50ZXN0KGkpKXJldHVybiBpO3I9cyYmKHguc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZXx8aT09PWUuc3R5bGVbdF0pLGk9cGFyc2VGbG9hdChpKXx8MH1yZXR1cm4gaStGdChlLHQsbnx8KHM/ImJvcmRlciI6ImNvbnRlbnQiKSxyLG8pKyJweCJ9ZnVuY3Rpb24gUnQoZSl7dmFyIHQ9byxuPU50W2VdO3JldHVybiBufHwobj1NdChlLHQpLCJub25lIiE9PW4mJm58fCh4dD0oeHR8fHgoIjxpZnJhbWUgZnJhbWVib3JkZXI9JzAnIHdpZHRoPScwJyBoZWlnaHQ9JzAnLz4iKS5jc3MoImNzc1RleHQiLCJkaXNwbGF5OmJsb2NrICFpbXBvcnRhbnQiKSkuYXBwZW5kVG8odC5kb2N1bWVudEVsZW1lbnQpLHQ9KHh0WzBdLmNvbnRlbnRXaW5kb3d8fHh0WzBdLmNvbnRlbnREb2N1bWVudCkuZG9jdW1lbnQsdC53cml0ZSgiPCFkb2N0eXBlIGh0bWw+PGh0bWw+PGJvZHk+IiksdC5jbG9zZSgpLG49TXQoZSx0KSx4dC5kZXRhY2goKSksTnRbZV09biksbn1mdW5jdGlvbiBNdChlLHQpe3ZhciBuPXgodC5jcmVhdGVFbGVtZW50KGUpKS5hcHBlbmRUbyh0LmJvZHkpLHI9eC5jc3MoblswXSwiZGlzcGxheSIpO3JldHVybiBuLnJlbW92ZSgpLHJ9eC5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHQpe3guY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7cmV0dXJuIG4/MD09PWUub2Zmc2V0V2lkdGgmJmJ0LnRlc3QoeC5jc3MoZSwiZGlzcGxheSIpKT94LnN3YXAoZSxFdCxmdW5jdGlvbigpe3JldHVybiBQdChlLHQscil9KTpQdChlLHQscik6dW5kZWZpbmVkfSxzZXQ6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpPXImJnF0KGUpO3JldHVybiBPdChlLG4scj9GdChlLHQscix4LnN1cHBvcnQuYm94U2l6aW5nJiYiYm9yZGVyLWJveCI9PT14LmNzcyhlLCJib3hTaXppbmciLCExLGkpLGkpOjApfX19KSx4KGZ1bmN0aW9uKCl7eC5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHR8fCh4LmNzc0hvb2tzLm1hcmdpblJpZ2h0PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD94LnN3YXAoZSx7ZGlzcGxheToiaW5saW5lLWJsb2NrIn0sdnQsW2UsIm1hcmdpblJpZ2h0Il0pOnVuZGVmaW5lZH19KSwheC5zdXBwb3J0LnBpeGVsUG9zaXRpb24mJnguZm4ucG9zaXRpb24mJnguZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLHQpe3guY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4pe3JldHVybiBuPyhuPXZ0KGUsdCksQ3QudGVzdChuKT94KGUpLnBvc2l0aW9uKClbdF0rInB4IjpuKTp1bmRlZmluZWR9fX0pfSkseC5leHByJiZ4LmV4cHIuZmlsdGVycyYmKHguZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4gMD49ZS5vZmZzZXRXaWR0aCYmMD49ZS5vZmZzZXRIZWlnaHR9LHguZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuIXguZXhwci5maWx0ZXJzLmhpZGRlbihlKX0pLHguZWFjaCh7bWFyZ2luOiIiLHBhZGRpbmc6IiIsYm9yZGVyOiJXaWR0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7dmFyIHI9MCxpPXt9LG89InN0cmluZyI9PXR5cGVvZiBuP24uc3BsaXQoIiAiKTpbbl07Zm9yKDs0PnI7cisrKWlbZStqdFtyXSt0XT1vW3JdfHxvW3ItMl18fG9bMF07cmV0dXJuIGl9fSx3dC50ZXN0KGUpfHwoeC5jc3NIb29rc1tlK3RdLnNldD1PdCl9KTt2YXIgV3Q9LyUyMC9nLCR0PS9cW1xdJC8sQnQ9L1xyP1xuL2csSXQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLHp0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTt4LmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHgucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT14LnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT94Lm1ha2VBcnJheShlKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiF4KHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmenQudGVzdCh0aGlzLm5vZGVOYW1lKSYmIUl0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFvdC50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPXgodGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDp4LmlzQXJyYXkobik/eC5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKEJ0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShCdCwiXHJcbiIpfX0pLmdldCgpfX0pLHgucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9ZnVuY3Rpb24oZSx0KXt0PXguaXNGdW5jdGlvbih0KT90KCk6bnVsbD09dD8iIjp0LHJbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHQpfTtpZih0PT09dW5kZWZpbmVkJiYodD14LmFqYXhTZXR0aW5ncyYmeC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLHguaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF4LmlzUGxhaW5PYmplY3QoZSkpeC5lYWNoKGUsZnVuY3Rpb24oKXtpKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gZSlfdChuLGVbbl0sdCxpKTtyZXR1cm4gci5qb2luKCImIikucmVwbGFjZShXdCwiKyIpfTtmdW5jdGlvbiBfdChlLHQsbixyKXt2YXIgaTtpZih4LmlzQXJyYXkodCkpeC5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHwkdC50ZXN0KGUpP3IoZSxpKTpfdChlKyJbIisoIm9iamVjdCI9PXR5cGVvZiBpP3Q6IiIpKyJdIixpLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09eC50eXBlKHQpKXIoZSx0KTtlbHNlIGZvcihpIGluIHQpX3QoZSsiWyIraSsiXSIsdFtpXSxuLHIpfXguZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe3guZm5bdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfX0pLHguZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCkKfSxkZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5vbih0LGUsbixyKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGUsIioqIik6dGhpcy5vZmYodCxlfHwiKioiLG4pfX0pO3ZhciBYdCxVdCxZdD14Lm5vdygpLFZ0PS9cPy8sR3Q9LyMuKiQvLEp0PS8oWz8mXSlfPVteJl0qLyxRdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLEt0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFp0PS9eKD86R0VUfEhFQUQpJC8sZW49L15cL1wvLyx0bj0vXihbXHcuKy1dKzopKD86XC9cLyhbXlwvPyM6XSopKD86OihcZCspfCl8KS8sbm49eC5mbi5sb2FkLHJuPXt9LG9uPXt9LHNuPSIqLyIuY29uY2F0KCIqIik7dHJ5e1V0PWkuaHJlZn1jYXRjaChhbil7VXQ9by5jcmVhdGVFbGVtZW50KCJhIiksVXQuaHJlZj0iIixVdD1VdC5ocmVmfVh0PXRuLmV4ZWMoVXQudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIHVuKGUpe3JldHVybiBmdW5jdGlvbih0LG4peyJzdHJpbmciIT10eXBlb2YgdCYmKG49dCx0PSIqIik7dmFyIHIsaT0wLG89dC50b0xvd2VyQ2FzZSgpLm1hdGNoKHcpfHxbXTtpZih4LmlzRnVuY3Rpb24obikpd2hpbGUocj1vW2krK10pIisiPT09clswXT8ocj1yLnNsaWNlKDEpfHwiKiIsKGVbcl09ZVtyXXx8W10pLnVuc2hpZnQobikpOihlW3JdPWVbcl18fFtdKS5wdXNoKG4pfX1mdW5jdGlvbiBsbihlLHQsbixyKXt2YXIgaT17fSxvPWU9PT1vbjtmdW5jdGlvbiBzKGEpe3ZhciB1O3JldHVybiBpW2FdPSEwLHguZWFjaChlW2FdfHxbXSxmdW5jdGlvbihlLGEpe3ZhciBsPWEodCxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgbHx8b3x8aVtsXT9vPyEodT1sKTp1bmRlZmluZWQ6KHQuZGF0YVR5cGVzLnVuc2hpZnQobCkscyhsKSwhMSl9KSx1fXJldHVybiBzKHQuZGF0YVR5cGVzWzBdKXx8IWlbIioiXSYmcygiKiIpfWZ1bmN0aW9uIGNuKGUsdCl7dmFyIG4scixpPXguYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXRbbl0hPT11bmRlZmluZWQmJigoaVtuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJnguZXh0ZW5kKCEwLGUsciksZX14LmZuLmxvYWQ9ZnVuY3Rpb24oZSx0LG4pe2lmKCJzdHJpbmciIT10eXBlb2YgZSYmbm4pcmV0dXJuIG5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgcixpLG8scz10aGlzLGE9ZS5pbmRleE9mKCIgIik7cmV0dXJuIGE+PTAmJihyPWUuc2xpY2UoYSksZT1lLnNsaWNlKDAsYSkpLHguaXNGdW5jdGlvbih0KT8obj10LHQ9dW5kZWZpbmVkKTp0JiYib2JqZWN0Ij09dHlwZW9mIHQmJihpPSJQT1NUIikscy5sZW5ndGg+MCYmeC5hamF4KHt1cmw6ZSx0eXBlOmksZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7bz1hcmd1bWVudHMscy5odG1sKHI/eCgiPGRpdj4iKS5hcHBlbmQoeC5wYXJzZUhUTUwoZSkpLmZpbmQocik6ZSl9KS5jb21wbGV0ZShuJiZmdW5jdGlvbihlLHQpe3MuZWFjaChuLG98fFtlLnJlc3BvbnNlVGV4dCx0LGVdKX0pLHRoaXN9LHguZWFjaChbImFqYXhTdGFydCIsImFqYXhTdG9wIiwiYWpheENvbXBsZXRlIiwiYWpheEVycm9yIiwiYWpheFN1Y2Nlc3MiLCJhamF4U2VuZCJdLGZ1bmN0aW9uKGUsdCl7eC5mblt0XT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vbih0LGUpfX0pLHguZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpVdCx0eXBlOiJHRVQiLGlzTG9jYWw6S3QudGVzdChYdFsxXSksZ2xvYmFsOiEwLHByb2Nlc3NEYXRhOiEwLGFzeW5jOiEwLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLTgiLGFjY2VwdHM6eyIqIjpzbix0ZXh0OiJ0ZXh0L3BsYWluIixodG1sOiJ0ZXh0L2h0bWwiLHhtbDoiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0In0sY29udGVudHM6e3htbDoveG1sLyxodG1sOi9odG1sLyxqc29uOi9qc29uL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOngucGFyc2VKU09OLCJ0ZXh0IHhtbCI6eC5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/Y24oY24oZSx4LmFqYXhTZXR0aW5ncyksdCk6Y24oeC5hamF4U2V0dGluZ3MsZSl9LGFqYXhQcmVmaWx0ZXI6dW4ocm4pLGFqYXhUcmFuc3BvcnQ6dW4ob24pLGFqYXg6ZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGUmJih0PWUsZT11bmRlZmluZWQpLHQ9dHx8e307dmFyIG4scixpLG8scyxhLHUsbCxjPXguYWpheFNldHVwKHt9LHQpLHA9Yy5jb250ZXh0fHxjLGY9Yy5jb250ZXh0JiYocC5ub2RlVHlwZXx8cC5qcXVlcnkpP3gocCk6eC5ldmVudCxoPXguRGVmZXJyZWQoKSxkPXguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGc9Yy5zdGF0dXNDb2RlfHx7fSxtPXt9LHk9e30sdj0wLGI9ImNhbmNlbGVkIixUPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoMj09PXYpe2lmKCFvKXtvPXt9O3doaWxlKHQ9UXQuZXhlYyhpKSlvW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PW9bZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09dj9pOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHZ8fChlPXlbbl09eVtuXXx8ZSxtW2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZ8fChjLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZigyPnYpZm9yKHQgaW4gZSlnW3RdPVtnW3RdLGVbdF1dO2Vsc2UgVC5hbHdheXMoZVtULnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHxiO3JldHVybiBuJiZuLmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYoaC5wcm9taXNlKFQpLmNvbXBsZXRlPWQuYWRkLFQuc3VjY2Vzcz1ULmRvbmUsVC5lcnJvcj1ULmZhaWwsYy51cmw9KChlfHxjLnVybHx8VXQpKyIiKS5yZXBsYWNlKEd0LCIiKS5yZXBsYWNlKGVuLFh0WzFdKyIvLyIpLGMudHlwZT10Lm1ldGhvZHx8dC50eXBlfHxjLm1ldGhvZHx8Yy50eXBlLGMuZGF0YVR5cGVzPXgudHJpbShjLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2godyl8fFsiIl0sbnVsbD09Yy5jcm9zc0RvbWFpbiYmKGE9dG4uZXhlYyhjLnVybC50b0xvd2VyQ2FzZSgpKSxjLmNyb3NzRG9tYWluPSEoIWF8fGFbMV09PT1YdFsxXSYmYVsyXT09PVh0WzJdJiYoYVszXXx8KCJodHRwOiI9PT1hWzFdPyI4MCI6IjQ0MyIpKT09PShYdFszXXx8KCJodHRwOiI9PT1YdFsxXT8iODAiOiI0NDMiKSkpKSxjLmRhdGEmJmMucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgYy5kYXRhJiYoYy5kYXRhPXgucGFyYW0oYy5kYXRhLGMudHJhZGl0aW9uYWwpKSxsbihybixjLHQsVCksMj09PXYpcmV0dXJuIFQ7dT1jLmdsb2JhbCx1JiYwPT09eC5hY3RpdmUrKyYmeC5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxjLnR5cGU9Yy50eXBlLnRvVXBwZXJDYXNlKCksYy5oYXNDb250ZW50PSFadC50ZXN0KGMudHlwZSkscj1jLnVybCxjLmhhc0NvbnRlbnR8fChjLmRhdGEmJihyPWMudXJsKz0oVnQudGVzdChyKT8iJiI6Ij8iKStjLmRhdGEsZGVsZXRlIGMuZGF0YSksYy5jYWNoZT09PSExJiYoYy51cmw9SnQudGVzdChyKT9yLnJlcGxhY2UoSnQsIiQxXz0iK1l0KyspOnIrKFZ0LnRlc3Qocik/IiYiOiI/IikrIl89IitZdCsrKSksYy5pZk1vZGlmaWVkJiYoeC5sYXN0TW9kaWZpZWRbcl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHgubGFzdE1vZGlmaWVkW3JdKSx4LmV0YWdbcl0mJlQuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIseC5ldGFnW3JdKSksKGMuZGF0YSYmYy5oYXNDb250ZW50JiZjLmNvbnRlbnRUeXBlIT09ITF8fHQuY29udGVudFR5cGUpJiZULnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsYy5jb250ZW50VHlwZSksVC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLGMuZGF0YVR5cGVzWzBdJiZjLmFjY2VwdHNbYy5kYXRhVHlwZXNbMF1dP2MuYWNjZXB0c1tjLmRhdGFUeXBlc1swXV0rKCIqIiE9PWMuZGF0YVR5cGVzWzBdPyIsICIrc24rIjsgcT0wLjAxIjoiIik6Yy5hY2NlcHRzWyIqIl0pO2ZvcihsIGluIGMuaGVhZGVycylULnNldFJlcXVlc3RIZWFkZXIobCxjLmhlYWRlcnNbbF0pO2lmKGMuYmVmb3JlU2VuZCYmKGMuYmVmb3JlU2VuZC5jYWxsKHAsVCxjKT09PSExfHwyPT09dikpcmV0dXJuIFQuYWJvcnQoKTtiPSJhYm9ydCI7Zm9yKGwgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pVFtsXShjW2xdKTtpZihuPWxuKG9uLGMsdCxUKSl7VC5yZWFkeVN0YXRlPTEsdSYmZi50cmlnZ2VyKCJhamF4U2VuZCIsW1QsY10pLGMuYXN5bmMmJmMudGltZW91dD4wJiYocz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7VC5hYm9ydCgidGltZW91dCIpfSxjLnRpbWVvdXQpKTt0cnl7dj0xLG4uc2VuZChtLGspfWNhdGNoKEMpe2lmKCEoMj52KSl0aHJvdyBDO2soLTEsQyl9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayhlLHQsbyxhKXt2YXIgbCxtLHksYix3LEM9dDsyIT09diYmKHY9MixzJiZjbGVhclRpbWVvdXQocyksbj11bmRlZmluZWQsaT1hfHwiIixULnJlYWR5U3RhdGU9ZT4wPzQ6MCxsPWU+PTIwMCYmMzAwPmV8fDMwND09PWUsbyYmKGI9cG4oYyxULG8pKSxiPWZuKGMsYixULGwpLGw/KGMuaWZNb2RpZmllZCYmKHc9VC5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpLHcmJih4Lmxhc3RNb2RpZmllZFtyXT13KSx3PVQuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSx3JiYoeC5ldGFnW3JdPXcpKSwyMDQ9PT1lfHwiSEVBRCI9PT1jLnR5cGU/Qz0ibm9jb250ZW50IjozMDQ9PT1lP0M9Im5vdG1vZGlmaWVkIjooQz1iLnN0YXRlLG09Yi5kYXRhLHk9Yi5lcnJvcixsPSF5KSk6KHk9QywoZXx8IUMpJiYoQz0iZXJyb3IiLDA+ZSYmKGU9MCkpKSxULnN0YXR1cz1lLFQuc3RhdHVzVGV4dD0odHx8QykrIiIsbD9oLnJlc29sdmVXaXRoKHAsW20sQyxUXSk6aC5yZWplY3RXaXRoKHAsW1QsQyx5XSksVC5zdGF0dXNDb2RlKGcpLGc9dW5kZWZpbmVkLHUmJmYudHJpZ2dlcihsPyJhamF4U3VjY2VzcyI6ImFqYXhFcnJvciIsW1QsYyxsP206eV0pLGQuZmlyZVdpdGgocCxbVCxDXSksdSYmKGYudHJpZ2dlcigiYWpheENvbXBsZXRlIixbVCxjXSksLS14LmFjdGl2ZXx8eC5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9cmV0dXJuIFR9LGdldEpTT046ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4geC5nZXQoZSx1bmRlZmluZWQsdCwic2NyaXB0Iil9fSkseC5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsdCl7eFt0XT1mdW5jdGlvbihlLG4scixpKXtyZXR1cm4geC5pc0Z1bmN0aW9uKG4pJiYoaT1pfHxyLHI9bixuPXVuZGVmaW5lZCkseC5hamF4KHt1cmw6ZSx0eXBlOnQsZGF0YVR5cGU6aSxkYXRhOm4sc3VjY2VzczpyfSl9fSk7ZnVuY3Rpb24gcG4oZSx0LG4pe3ZhciByLGksbyxzLGE9ZS5jb250ZW50cyx1PWUuZGF0YVR5cGVzO3doaWxlKCIqIj09PXVbMF0pdS5zaGlmdCgpLHI9PT11bmRlZmluZWQmJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihpIGluIGEpaWYoYVtpXSYmYVtpXS50ZXN0KHIpKXt1LnVuc2hpZnQoaSk7YnJlYWt9aWYodVswXWluIG4pbz11WzBdO2Vsc2V7Zm9yKGkgaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tpKyIgIit1WzBdXSl7bz1pO2JyZWFrfXN8fChzPWkpfW89b3x8c31yZXR1cm4gbz8obyE9PXVbMF0mJnUudW5zaGlmdChvKSxuW29dKTp1bmRlZmluZWR9ZnVuY3Rpb24gZm4oZSx0LG4scil7dmFyIGksbyxzLGEsdSxsPXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihzIGluIGUuY29udmVydGVycylsW3MudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW3NdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIXUmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLHU9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89dTtlbHNlIGlmKCIqIiE9PXUmJnUhPT1vKXtpZihzPWxbdSsiICIrb118fGxbIiogIitvXSwhcylmb3IoaSBpbiBsKWlmKGE9aS5zcGxpdCgiICIpLGFbMV09PT1vJiYocz1sW3UrIiAiK2FbMF1dfHxsWyIqICIrYVswXV0pKXtzPT09ITA/cz1sW2ldOmxbaV0hPT0hMCYmKG89YVswXSxjLnVuc2hpZnQoYVsxXSkpO2JyZWFrfWlmKHMhPT0hMClpZihzJiZlWyJ0aHJvd3MiXSl0PXModCk7ZWxzZSB0cnl7dD1zKHQpfWNhdGNoKHApe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOnM/cDoiTm8gY29udmVyc2lvbiBmcm9tICIrdSsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX14LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB4Lmdsb2JhbEV2YWwoZSksZX19fSkseC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT11bmRlZmluZWQmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pLHguYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihlKXtpZihlLmNyb3NzRG9tYWluKXt2YXIgdCxuO3JldHVybntzZW5kOmZ1bmN0aW9uKHIsaSl7dD14KCI8c2NyaXB0PiIpLnByb3Aoe2FzeW5jOiEwLGNoYXJzZXQ6ZS5zY3JpcHRDaGFyc2V0LHNyYzplLnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKGUpe3QucmVtb3ZlKCksbj1udWxsLGUmJmkoImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxvLmhlYWQuYXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19fSk7dmFyIGhuPVtdLGRuPS8oPSlcPyg/PSZ8JCl8XD9cPy87eC5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBlPWhuLnBvcCgpfHx4LmV4cGFuZG8rIl8iK1l0Kys7cmV0dXJuIHRoaXNbZV09ITAsZX19KSx4LmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKHQsbixyKXt2YXIgaSxvLHMsYT10Lmpzb25wIT09ITEmJihkbi50ZXN0KHQudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmISh0LmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmRuLnRlc3QodC5kYXRhKSYmImRhdGEiKTtyZXR1cm4gYXx8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdPyhpPXQuanNvbnBDYWxsYmFjaz14LmlzRnVuY3Rpb24odC5qc29ucENhbGxiYWNrKT90Lmpzb25wQ2FsbGJhY2soKTp0Lmpzb25wQ2FsbGJhY2ssYT90W2FdPXRbYV0ucmVwbGFjZShkbiwiJDEiK2kpOnQuanNvbnAhPT0hMSYmKHQudXJsKz0oVnQudGVzdCh0LnVybCk/IiYiOiI/IikrdC5qc29ucCsiPSIraSksdC5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIHN8fHguZXJyb3IoaSsiIHdhcyBub3QgY2FsbGVkIiksc1swXX0sdC5kYXRhVHlwZXNbMF09Impzb24iLG89ZVtpXSxlW2ldPWZ1bmN0aW9uKCl7cz1hcmd1bWVudHN9LHIuYWx3YXlzKGZ1bmN0aW9uKCl7ZVtpXT1vLHRbaV0mJih0Lmpzb25wQ2FsbGJhY2s9bi5qc29ucENhbGxiYWNrLGhuLnB1c2goaSkpLHMmJnguaXNGdW5jdGlvbihvKSYmbyhzWzBdKSxzPW89dW5kZWZpbmVkfSksInNjcmlwdCIpOnVuZGVmaW5lZH0pLHguYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0fWNhdGNoKGUpe319O3ZhciBnbj14LmFqYXhTZXR0aW5ncy54aHIoKSxtbj17MDoyMDAsMTIyMzoyMDR9LHluPTAsdm49e307ZS5BY3RpdmVYT2JqZWN0JiZ4KGUpLm9uKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHZuKXZuW2VdKCk7dm49dW5kZWZpbmVkfSkseC5zdXBwb3J0LmNvcnM9ISFnbiYmIndpdGhDcmVkZW50aWFscyJpbiBnbix4LnN1cHBvcnQuYWpheD1nbj0hIWduLHguYWpheFRyYW5zcG9ydChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4geC5zdXBwb3J0LmNvcnN8fGduJiYhZS5jcm9zc0RvbWFpbj97c2VuZDpmdW5jdGlvbihuLHIpe3ZhciBpLG8scz1lLnhocigpO2lmKHMub3BlbihlLnR5cGUsZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpLGUueGhyRmllbGRzKWZvcihpIGluIGUueGhyRmllbGRzKXNbaV09ZS54aHJGaWVsZHNbaV07ZS5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUoZS5taW1lVHlwZSksZS5jcm9zc0RvbWFpbnx8blsiWC1SZXF1ZXN0ZWQtV2l0aCJdfHwoblsiWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihpIGluIG4pcy5zZXRSZXF1ZXN0SGVhZGVyKGksbltpXSk7dD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiYoZGVsZXRlIHZuW29dLHQ9cy5vbmxvYWQ9cy5vbmVycm9yPW51bGwsImFib3J0Ij09PWU/cy5hYm9ydCgpOiJlcnJvciI9PT1lP3Iocy5zdGF0dXN8fDQwNCxzLnN0YXR1c1RleHQpOnIobW5bcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInN0cmluZyI9PXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97dGV4dDpzLnJlc3BvbnNlVGV4dH06dW5kZWZpbmVkLHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPXQoKSxzLm9uZXJyb3I9dCgiZXJyb3IiKSx0PXZuW289eW4rK109dCgiYWJvcnQiKSxzLnNlbmQoZS5oYXNDb250ZW50JiZlLmRhdGF8fG51bGwpfSxhYm9ydDpmdW5jdGlvbigpe3QmJnQoKX19OnVuZGVmaW5lZH0pO3ZhciB4bixibix3bj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sVG49UmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrYisiKShbYS16JV0qKSQiLCJpIiksQ249L3F1ZXVlSG9va3MkLyxrbj1bQW5dLE5uPXsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpLHI9bi5jdXIoKSxpPVRuLmV4ZWModCksbz1pJiZpWzNdfHwoeC5jc3NOdW1iZXJbZV0/IiI6InB4Iikscz0oeC5jc3NOdW1iZXJbZV18fCJweCIhPT1vJiYrcikmJlRuLmV4ZWMoeC5jc3Mobi5lbGVtLGUpKSxhPTEsdT0yMDtpZihzJiZzWzNdIT09byl7bz1vfHxzWzNdLGk9aXx8W10scz0rcnx8MTtkbyBhPWF8fCIuNSIscy89YSx4LnN0eWxlKG4uZWxlbSxlLHMrbyk7d2hpbGUoYSE9PShhPW4uY3VyKCkvcikmJjEhPT1hJiYtLXUpfXJldHVybiBpJiYocz1uLnN0YXJ0PStzfHwrcnx8MCxuLnVuaXQ9byxuLmVuZD1pWzFdP3MrKGlbMV0rMSkqaVsyXToraVsyXSksbn1dfTtmdW5jdGlvbiBFbigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eG49dW5kZWZpbmVkfSkseG49eC5ub3coKX1mdW5jdGlvbiBTbihlLHQsbil7dmFyIHIsaT0oTm5bdF18fFtdKS5jb25jYXQoTm5bIioiXSksbz0wLHM9aS5sZW5ndGg7Zm9yKDtzPm87bysrKWlmKHI9aVtvXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBqbihlLHQsbil7dmFyIHIsaSxvPTAscz1rbi5sZW5ndGgsYT14LkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihpKXJldHVybiExO3ZhciB0PXhufHxFbigpLG49TWF0aC5tYXgoMCxsLnN0YXJ0VGltZStsLmR1cmF0aW9uLXQpLHI9bi9sLmR1cmF0aW9ufHwwLG89MS1yLHM9MCx1PWwudHdlZW5zLmxlbmd0aDtmb3IoO3U+cztzKyspbC50d2VlbnNbc10ucnVuKG8pO3JldHVybiBhLm5vdGlmeVdpdGgoZSxbbCxvLG5dKSwxPm8mJnU/bjooYS5yZXNvbHZlV2l0aChlLFtsXSksITEpfSxsPWEucHJvbWlzZSh7ZWxlbTplLHByb3BzOnguZXh0ZW5kKHt9LHQpLG9wdHM6eC5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LG4pLG9yaWdpbmFsUHJvcGVydGllczp0LG9yaWdpbmFsT3B0aW9uczpuLHN0YXJ0VGltZTp4bnx8RW4oKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPXguVHdlZW4oZSxsLm9wdHMsdCxuLGwub3B0cy5zcGVjaWFsRWFzaW5nW3RdfHxsLm9wdHMuZWFzaW5nKTtyZXR1cm4gbC50d2VlbnMucHVzaChyKSxyfSxzdG9wOmZ1bmN0aW9uKHQpe3ZhciBuPTAscj10P2wudHdlZW5zLmxlbmd0aDowO2lmKGkpcmV0dXJuIHRoaXM7Zm9yKGk9ITA7cj5uO24rKylsLnR3ZWVuc1tuXS5ydW4oMSk7cmV0dXJuIHQ/YS5yZXNvbHZlV2l0aChlLFtsLHRdKTphLnJlamVjdFdpdGgoZSxbbCx0XSksdGhpc319KSxjPWwucHJvcHM7Zm9yKERuKGMsbC5vcHRzLnNwZWNpYWxFYXNpbmcpO3M+bztvKyspaWYocj1rbltvXS5jYWxsKGwsZSxjLGwub3B0cykpcmV0dXJuIHI7cmV0dXJuIHgubWFwKGMsU24sbCkseC5pc0Z1bmN0aW9uKGwub3B0cy5zdGFydCkmJmwub3B0cy5zdGFydC5jYWxsKGUsbCkseC5meC50aW1lcih4LmV4dGVuZCh1LHtlbGVtOmUsYW5pbTpsLHF1ZXVlOmwub3B0cy5xdWV1ZX0pKSxsLnByb2dyZXNzKGwub3B0cy5wcm9ncmVzcykuZG9uZShsLm9wdHMuZG9uZSxsLm9wdHMuY29tcGxldGUpLmZhaWwobC5vcHRzLmZhaWwpLmFsd2F5cyhsLm9wdHMuYWx3YXlzKX1mdW5jdGlvbiBEbihlLHQpe3ZhciBuLHIsaSxvLHM7Zm9yKG4gaW4gZSlpZihyPXguY2FtZWxDYXNlKG4pLGk9dFtyXSxvPWVbbl0seC5pc0FycmF5KG8pJiYoaT1vWzFdLG89ZVtuXT1vWzBdKSxuIT09ciYmKGVbcl09byxkZWxldGUgZVtuXSkscz14LmNzc0hvb2tzW3JdLHMmJiJleHBhbmQiaW4gcyl7bz1zLmV4cGFuZChvKSxkZWxldGUgZVtyXTtmb3IobiBpbiBvKW4gaW4gZXx8KGVbbl09b1tuXSx0W25dPWkpfWVsc2UgdFtyXT1pfXguQW5pbWF0aW9uPXguZXh0ZW5kKGpuLHt0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7eC5pc0Z1bmN0aW9uKGUpPyh0PWUsZT1bIioiXSk6ZT1lLnNwbGl0KCIgIik7dmFyIG4scj0wLGk9ZS5sZW5ndGg7Zm9yKDtpPnI7cisrKW49ZVtyXSxObltuXT1ObltuXXx8W10sTm5bbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9rbi51bnNoaWZ0KGUpOmtuLnB1c2goZSl9fSk7ZnVuY3Rpb24gQW4oZSx0LG4pe3ZhciByLGksbyxzLGEsdSxsPXRoaXMsYz17fSxwPWUuc3R5bGUsZj1lLm5vZGVUeXBlJiZMdChlKSxoPXEuZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChhPXguX3F1ZXVlSG9va3MoZSwiZngiKSxudWxsPT1hLnVucXVldWVkJiYoYS51bnF1ZXVlZD0wLHU9YS5lbXB0eS5maXJlLGEuZW1wdHkuZmlyZT1mdW5jdGlvbigpe2EudW5xdWV1ZWR8fHUoKX0pLGEudW5xdWV1ZWQrKyxsLmFsd2F5cyhmdW5jdGlvbigpe2wuYWx3YXlzKGZ1bmN0aW9uKCl7YS51bnF1ZXVlZC0tLHgucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSksMT09PWUubm9kZVR5cGUmJigiaGVpZ2h0ImluIHR8fCJ3aWR0aCJpbiB0KSYmKG4ub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLCJpbmxpbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpJiYibm9uZSI9PT14LmNzcyhlLCJmbG9hdCIpJiYocC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksbi5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsbC5hbHdheXMoZnVuY3Rpb24oKXtwLm92ZXJmbG93PW4ub3ZlcmZsb3dbMF0scC5vdmVyZmxvd1g9bi5vdmVyZmxvd1sxXSxwLm92ZXJmbG93WT1uLm92ZXJmbG93WzJdfSkpO2ZvcihyIGluIHQpaWYoaT10W3JdLHduLmV4ZWMoaSkpe2lmKGRlbGV0ZSB0W3JdLG89b3x8InRvZ2dsZSI9PT1pLGk9PT0oZj8iaGlkZSI6InNob3ciKSl7aWYoInNob3ciIT09aXx8IWh8fGhbcl09PT11bmRlZmluZWQpY29udGludWU7Zj0hMH1jW3JdPWgmJmhbcl18fHguc3R5bGUoZSxyKX1pZigheC5pc0VtcHR5T2JqZWN0KGMpKXtoPyJoaWRkZW4iaW4gaCYmKGY9aC5oaWRkZW4pOmg9cS5hY2Nlc3MoZSwiZnhzaG93Iix7fSksbyYmKGguaGlkZGVuPSFmKSxmP3goZSkuc2hvdygpOmwuZG9uZShmdW5jdGlvbigpe3goZSkuaGlkZSgpfSksbC5kb25lKGZ1bmN0aW9uKCl7dmFyIHQ7cS5yZW1vdmUoZSwiZnhzaG93Iik7Zm9yKHQgaW4gYyl4LnN0eWxlKGUsdCxjW3RdKX0pO2ZvcihyIGluIGMpcz1TbihmP2hbcl06MCxyLGwpLHIgaW4gaHx8KGhbcl09cy5zdGFydCxmJiYocy5lbmQ9cy5zdGFydCxzLnN0YXJ0PSJ3aWR0aCI9PT1yfHwiaGVpZ2h0Ij09PXI/MTowKSl9fWZ1bmN0aW9uIExuKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyBMbi5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXguVHdlZW49TG4sTG4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpMbixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHwic3dpbmciLHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoeC5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPUxuLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpMbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1Mbi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9dD10aGlzLm9wdGlvbnMuZHVyYXRpb24/eC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpMbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxMbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9TG4ucHJvdG90eXBlLExuLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbD09ZS5lbGVtW2UucHJvcF18fGUuZWxlbS5zdHlsZSYmbnVsbCE9ZS5lbGVtLnN0eWxlW2UucHJvcF0/KHQ9eC5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90OjApOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7eC5meC5zdGVwW2UucHJvcF0/eC5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYobnVsbCE9ZS5lbGVtLnN0eWxlW3guY3NzUHJvcHNbZS5wcm9wXV18fHguY3NzSG9va3NbZS5wcm9wXSk/eC5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0sTG4ucHJvcEhvb2tzLnNjcm9sbFRvcD1Mbi5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx4LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49eC5mblt0XTt4LmZuW3RdPWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUocW4odCwhMCksZSxyLGkpfX0pLHguZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKEx0KS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT14LmlzRW1wdHlPYmplY3QoZSksbz14LnNwZWVkKHQsbixyKSxzPWZ1bmN0aW9uKCl7dmFyIHQ9am4odGhpcyx4LmV4dGVuZCh7fSxlKSxvKTsoaXx8cS5nZXQodGhpcywiZmluaXNoIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gcy5maW5pc2g9cyxpfHxvLnF1ZXVlPT09ITE/dGhpcy5lYWNoKHMpOnRoaXMucXVldWUoby5xdWV1ZSxzKX0sc3RvcDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYobj10LHQ9ZSxlPXVuZGVmaW5lZCksdCYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLGk9bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsbz14LnRpbWVycyxzPXEuZ2V0KHRoaXMpO2lmKGkpc1tpXSYmc1tpXS5zdG9wJiZyKHNbaV0pO2Vsc2UgZm9yKGkgaW4gcylzW2ldJiZzW2ldLnN0b3AmJkNuLnRlc3QoaSkmJnIoc1tpXSk7Zm9yKGk9by5sZW5ndGg7aS0tOylvW2ldLmVsZW0hPT10aGlzfHxudWxsIT1lJiZvW2ldLnF1ZXVlIT09ZXx8KG9baV0uYW5pbS5zdG9wKG4pLHQ9ITEsby5zcGxpY2UoaSwxKSk7KHR8fCFuKSYmeC5kZXF1ZXVlKHRoaXMsZSl9KX0sZmluaXNoOmZ1bmN0aW9uKGUpe3JldHVybiBlIT09ITEmJihlPWV8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG49cS5nZXQodGhpcykscj1uW2UrInF1ZXVlIl0saT1uW2UrInF1ZXVlSG9va3MiXSxvPXgudGltZXJzLHM9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCx4LnF1ZXVlKHRoaXMsZSxbXSksaSYmaS5zdG9wJiZpLnN0b3AuY2FsbCh0aGlzLCEwKSx0PW8ubGVuZ3RoO3QtLTspb1t0XS5lbGVtPT09dGhpcyYmb1t0XS5xdWV1ZT09PWUmJihvW3RdLmFuaW0uc3RvcCghMCksby5zcGxpY2UodCwxKSk7Zm9yKHQ9MDtzPnQ7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pO2Z1bmN0aW9uIHFuKGUsdCl7dmFyIG4scj17aGVpZ2h0OmV9LGk9MDtmb3IodD10PzE6MDs0Pmk7aSs9Mi10KW49anRbaV0sclsibWFyZ2luIituXT1yWyJwYWRkaW5nIituXT1lO3JldHVybiB0JiYoci5vcGFjaXR5PXIud2lkdGg9ZSkscn14LmVhY2goe3NsaWRlRG93bjpxbigic2hvdyIpLHNsaWRlVXA6cW4oImhpZGUiKSxzbGlkZVRvZ2dsZTpxbigidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSkseC5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP3guZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8eC5pc0Z1bmN0aW9uKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiF4LmlzRnVuY3Rpb24odCkmJnR9O3JldHVybiByLmR1cmF0aW9uPXguZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiByLmR1cmF0aW9uP3IuZHVyYXRpb246ci5kdXJhdGlvbiBpbiB4LmZ4LnNwZWVkcz94LmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTp4LmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ci5xdWV1ZXx8ci5xdWV1ZT09PSEwKSYmKHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7eC5pc0Z1bmN0aW9uKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZ4LmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0seC5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfX0seC50aW1lcnM9W10seC5meD1Mbi5wcm90b3R5cGUuaW5pdCx4LmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PXgudGltZXJzLG49MDtmb3IoeG49eC5ub3coKTt0Lmxlbmd0aD5uO24rKyllPXRbbl0sZSgpfHx0W25dIT09ZXx8dC5zcGxpY2Uobi0tLDEpO3QubGVuZ3RofHx4LmZ4LnN0b3AoKSx4bj11bmRlZmluZWR9LHguZngudGltZXI9ZnVuY3Rpb24oZSl7ZSgpJiZ4LnRpbWVycy5wdXNoKGUpJiZ4LmZ4LnN0YXJ0KCl9LHguZnguaW50ZXJ2YWw9MTMseC5meC5zdGFydD1mdW5jdGlvbigpe2JufHwoYm49c2V0SW50ZXJ2YWwoeC5meC50aWNrLHguZnguaW50ZXJ2YWwpKX0seC5meC5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChibiksYm49bnVsbH0seC5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0seC5meC5zdGVwPXt9LHguZXhwciYmeC5leHByLmZpbHRlcnMmJih4LmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4geC5ncmVwKHgudGltZXJzLGZ1bmN0aW9uKHQpe3JldHVybiBlPT09dC5lbGVtfSkubGVuZ3RofSkseC5mbi5vZmZzZXQ9ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZT09PXVuZGVmaW5lZD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt4Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixpPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfSxzPWkmJmkub3duZXJEb2N1bWVudDtpZihzKXJldHVybiB0PXMuZG9jdW1lbnRFbGVtZW50LHguY29udGFpbnModCxpKT8odHlwZW9mIGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09ciYmKG89aS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksbj1IbihzKSx7dG9wOm8udG9wK24ucGFnZVlPZmZzZXQtdC5jbGllbnRUb3AsbGVmdDpvLmxlZnQrbi5wYWdlWE9mZnNldC10LmNsaWVudExlZnR9KTpvfSx4Lm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLG8scyxhLHUsbCxjPXguY3NzKGUsInBvc2l0aW9uIikscD14KGUpLGY9e307InN0YXRpYyI9PT1jJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxhPXAub2Zmc2V0KCksbz14LmNzcyhlLCJ0b3AiKSx1PXguY3NzKGUsImxlZnQiKSxsPSgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYobyt1KS5pbmRleE9mKCJhdXRvIik+LTEsbD8ocj1wLnBvc2l0aW9uKCkscz1yLnRvcCxpPXIubGVmdCk6KHM9cGFyc2VGbG9hdChvKXx8MCxpPXBhcnNlRmxvYXQodSl8fDApLHguaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKGUsbixhKSksbnVsbCE9dC50b3AmJihmLnRvcD10LnRvcC1hLnRvcCtzKSxudWxsIT10LmxlZnQmJihmLmxlZnQ9dC5sZWZ0LWEubGVmdCtpKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSxmKTpwLmNzcyhmKX19LHguZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbj10aGlzWzBdLHI9e3RvcDowLGxlZnQ6MH07cmV0dXJuImZpeGVkIj09PXguY3NzKG4sInBvc2l0aW9uIik/dD1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihlPXRoaXMub2Zmc2V0UGFyZW50KCksdD10aGlzLm9mZnNldCgpLHgubm9kZU5hbWUoZVswXSwiaHRtbCIpfHwocj1lLm9mZnNldCgpKSxyLnRvcCs9eC5jc3MoZVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxyLmxlZnQrPXguY3NzKGVbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOnQudG9wLXIudG9wLXguY3NzKG4sIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LXIubGVmdC14LmNzcyhuLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnR8fHM7d2hpbGUoZSYmIXgubm9kZU5hbWUoZSwiaHRtbCIpJiYic3RhdGljIj09PXguY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8c30pfX0pLHguZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbih0LG4pe3ZhciByPSJwYWdlWU9mZnNldCI9PT1uO3guZm5bdF09ZnVuY3Rpb24oaSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24odCxpLG8pe3ZhciBzPUhuKHQpO3JldHVybiBvPT09dW5kZWZpbmVkP3M/c1tuXTp0W2ldOihzP3Muc2Nyb2xsVG8ocj9lLnBhZ2VYT2Zmc2V0Om8scj9vOmUucGFnZVlPZmZzZXQpOnRbaV09byx1bmRlZmluZWQpfSx0LGksYXJndW1lbnRzLmxlbmd0aCxudWxsKX19KTtmdW5jdGlvbiBIbihlKXtyZXR1cm4geC5pc1dpbmRvdyhlKT9lOjk9PT1lLm5vZGVUeXBlJiZlLmRlZmF1bHRWaWV3fXguZWFjaCh7SGVpZ2h0OiJoZWlnaHQiLFdpZHRoOiJ3aWR0aCJ9LGZ1bmN0aW9uKGUsdCl7eC5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe3guZm5bcl09ZnVuY3Rpb24ocixpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2Ygcikscz1ufHwocj09PSEwfHxpPT09ITA/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKHQsbixyKXt2YXIgaTtyZXR1cm4geC5pc1dpbmRvdyh0KT90LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IitlXTo5PT09dC5ub2RlVHlwZT8oaT10LmRvY3VtZW50RWxlbWVudCxNYXRoLm1heCh0LmJvZHlbInNjcm9sbCIrZV0saVsic2Nyb2xsIitlXSx0LmJvZHlbIm9mZnNldCIrZV0saVsib2Zmc2V0IitlXSxpWyJjbGllbnQiK2VdKSk6cj09PXVuZGVmaW5lZD94LmNzcyh0LG4scyk6eC5zdHlsZSh0LG4scixzKX0sdCxvP3I6dW5kZWZpbmVkLG8sbnVsbCl9fSl9KSx4LmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHguZm4uYW5kU2VsZj14LmZuLmFkZEJhY2ssIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz14OiJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiB4fSksIm9iamVjdCI9PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIGUuZG9jdW1lbnQmJihlLmpRdWVyeT1lLiQ9eCl9KSh3aW5kb3cpOwo=" 156 98 }, 157 99 { 158 100 "meta": { 101 + "mimetype": "text/javascript", 159 102 "name": "jquery.qtip.min.js", 160 - "url": "https://cdnjs.cloudflare.com/ajax/libs/qtip2/2.2.0/jquery.qtip.min.js", 161 - "ts": 1607436649585, 162 - "mimetype": "text/javascript" 103 + "ts": 1630083356994, 104 + "url": "https://cdnjs.cloudflare.com/ajax/libs/qtip2/2.2.0/jquery.qtip.min.js" 163 105 }, 164 106 "source": "LyogcVRpcDIgdjIuMi4wIHRpcHMgbW9kYWwgdmlld3BvcnQgc3ZnIGltYWdlbWFwIGllNiB8IHF0aXAyLmNvbSB8IExpY2Vuc2VkIE1JVCwgR1BMIHwgVGh1IE5vdiAyMSAyMDEzIDIwOjM0OjU5ICovCihmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjsiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImpxdWVyeSJdLHQpOmpRdWVyeSYmIWpRdWVyeS5mbi5xdGlwJiZ0KGpRdWVyeSl9KShmdW5jdGlvbihzKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyh0LGUsaSxvKXt0aGlzLmlkPWksdGhpcy50YXJnZXQ9dCx0aGlzLnRvb2x0aXA9RSx0aGlzLmVsZW1lbnRzPXt0YXJnZXQ6dH0sdGhpcy5faWQ9WCsiLSIraSx0aGlzLnRpbWVycz17aW1nOnt9fSx0aGlzLm9wdGlvbnM9ZSx0aGlzLnBsdWdpbnM9e30sdGhpcy5jYWNoZT17ZXZlbnQ6e30sdGFyZ2V0OnMoKSxkaXNhYmxlZDprLGF0dHI6byxvblRvb2x0aXA6ayxsYXN0Q2xhc3M6IiJ9LHRoaXMucmVuZGVyZWQ9dGhpcy5kZXN0cm95ZWQ9dGhpcy5kaXNhYmxlZD10aGlzLndhaXRpbmc9dGhpcy5oaWRkZW5EdXJpbmdXYWl0PXRoaXMucG9zaXRpb25pbmc9dGhpcy50cmlnZ2VyaW5nPWt9ZnVuY3Rpb24gbih0KXtyZXR1cm4gdD09PUV8fCJvYmplY3QiIT09cy50eXBlKHQpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIShzLmlzRnVuY3Rpb24odCl8fHQmJnQuYXR0cnx8dC5sZW5ndGh8fCJvYmplY3QiPT09cy50eXBlKHQpJiYodC5qcXVlcnl8fHQudGhlbikpfWZ1bmN0aW9uIGEodCl7dmFyIGUsaSxvLGE7cmV0dXJuIG4odCk/azoobih0Lm1ldGFkYXRhKSYmKHQubWV0YWRhdGE9e3R5cGU6dC5tZXRhZGF0YX0pLCJjb250ZW50ImluIHQmJihlPXQuY29udGVudCxuKGUpfHxlLmpxdWVyeXx8ZS5kb25lP2U9dC5jb250ZW50PXt0ZXh0Omk9cihlKT9rOmV9Omk9ZS50ZXh0LCJhamF4ImluIGUmJihvPWUuYWpheCxhPW8mJm8ub25jZSE9PWssZGVsZXRlIGUuYWpheCxlLnRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1pfHxzKHRoaXMpLmF0dHIoZS5vcHRpb25zLmNvbnRlbnQuYXR0cil8fCJMb2FkaW5nLi4uIixyPXMuYWpheChzLmV4dGVuZCh7fSxvLHtjb250ZXh0OmV9KSkudGhlbihvLnN1Y2Nlc3MsRSxvLmVycm9yKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0JiZhJiZlLnNldCgiY29udGVudC50ZXh0Iix0KSx0fSxmdW5jdGlvbih0LGkscyl7ZS5kZXN0cm95ZWR8fDA9PT10LnN0YXR1c3x8ZS5zZXQoImNvbnRlbnQudGV4dCIsaSsiOiAiK3MpfSk7cmV0dXJuIGE/bjooZS5zZXQoImNvbnRlbnQudGV4dCIsbikscil9KSwidGl0bGUiaW4gZSYmKG4oZS50aXRsZSl8fChlLmJ1dHRvbj1lLnRpdGxlLmJ1dHRvbixlLnRpdGxlPWUudGl0bGUudGV4dCkscihlLnRpdGxlfHxrKSYmKGUudGl0bGU9aykpKSwicG9zaXRpb24iaW4gdCYmbih0LnBvc2l0aW9uKSYmKHQucG9zaXRpb249e215OnQucG9zaXRpb24sYXQ6dC5wb3NpdGlvbn0pLCJzaG93ImluIHQmJm4odC5zaG93KSYmKHQuc2hvdz10LnNob3cuanF1ZXJ5P3t0YXJnZXQ6dC5zaG93fTp0LnNob3c9PT1XP3tyZWFkeTpXfTp7ZXZlbnQ6dC5zaG93fSksImhpZGUiaW4gdCYmbih0LmhpZGUpJiYodC5oaWRlPXQuaGlkZS5qcXVlcnk/e3RhcmdldDp0LmhpZGV9OntldmVudDp0LmhpZGV9KSwic3R5bGUiaW4gdCYmbih0LnN0eWxlKSYmKHQuc3R5bGU9e2NsYXNzZXM6dC5zdHlsZX0pLHMuZWFjaChSLGZ1bmN0aW9uKCl7dGhpcy5zYW5pdGl6ZSYmdGhpcy5zYW5pdGl6ZSh0KX0pLHQpfWZ1bmN0aW9uIGgodCxlKXtmb3IodmFyIGkscz0wLG89dCxuPWUuc3BsaXQoIi4iKTtvPW9bbltzKytdXTspbi5sZW5ndGg+cyYmKGk9byk7cmV0dXJuW2l8fHQsbi5wb3AoKV19ZnVuY3Rpb24gbCh0LGUpe3ZhciBpLHMsbztmb3IoaSBpbiB0aGlzLmNoZWNrcylmb3IocyBpbiB0aGlzLmNoZWNrc1tpXSkobz1SZWdFeHAocywiaSIpLmV4ZWModCkpJiYoZS5wdXNoKG8pLCgiYnVpbHRpbiI9PT1pfHx0aGlzLnBsdWdpbnNbaV0pJiZ0aGlzLmNoZWNrc1tpXVtzXS5hcHBseSh0aGlzLnBsdWdpbnNbaV18fHRoaXMsZSkpfWZ1bmN0aW9uIGModCl7cmV0dXJuIEcuY29uY2F0KCIiKS5qb2luKHQ/Ii0iK3QrIiAiOiIgIil9ZnVuY3Rpb24gZChpKXtyZXR1cm4gaSYme3R5cGU6aS50eXBlLHBhZ2VYOmkucGFnZVgscGFnZVk6aS5wYWdlWSx0YXJnZXQ6aS50YXJnZXQscmVsYXRlZFRhcmdldDppLnJlbGF0ZWRUYXJnZXQsc2Nyb2xsWDppLnNjcm9sbFh8fHQucGFnZVhPZmZzZXR8fGUuYm9keS5zY3JvbGxMZWZ0fHxlLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LHNjcm9sbFk6aS5zY3JvbGxZfHx0LnBhZ2VZT2Zmc2V0fHxlLmJvZHkuc2Nyb2xsVG9wfHxlLmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B9fHx7fX1mdW5jdGlvbiBwKHQsZSl7cmV0dXJuIGU+MD9zZXRUaW1lb3V0KHMucHJveHkodCx0aGlzKSxlKToodC5jYWxsKHRoaXMpLGkpfWZ1bmN0aW9uIHUodCl7cmV0dXJuIHRoaXMudG9vbHRpcC5oYXNDbGFzcyhlZSk/azooY2xlYXJUaW1lb3V0KHRoaXMudGltZXJzLnNob3cpLGNsZWFyVGltZW91dCh0aGlzLnRpbWVycy5oaWRlKSx0aGlzLnRpbWVycy5zaG93PXAuY2FsbCh0aGlzLGZ1bmN0aW9uKCl7dGhpcy50b2dnbGUoVyx0KX0sdGhpcy5vcHRpb25zLnNob3cuZGVsYXkpLGkpfWZ1bmN0aW9uIGYodCl7aWYodGhpcy50b29sdGlwLmhhc0NsYXNzKGVlKSlyZXR1cm4gazt2YXIgZT1zKHQucmVsYXRlZFRhcmdldCksaT1lLmNsb3Nlc3QoVSlbMF09PT10aGlzLnRvb2x0aXBbMF0sbz1lWzBdPT09dGhpcy5vcHRpb25zLnNob3cudGFyZ2V0WzBdO2lmKGNsZWFyVGltZW91dCh0aGlzLnRpbWVycy5zaG93KSxjbGVhclRpbWVvdXQodGhpcy50aW1lcnMuaGlkZSksdGhpcyE9PWVbMF0mJiJtb3VzZSI9PT10aGlzLm9wdGlvbnMucG9zaXRpb24udGFyZ2V0JiZpfHx0aGlzLm9wdGlvbnMuaGlkZS5maXhlZCYmL21vdXNlKG91dHxsZWF2ZXxtb3ZlKS8udGVzdCh0LnR5cGUpJiYoaXx8bykpdHJ5e3QucHJldmVudERlZmF1bHQoKSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWNhdGNoKG4pe31lbHNlIHRoaXMudGltZXJzLmhpZGU9cC5jYWxsKHRoaXMsZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZShrLHQpfSx0aGlzLm9wdGlvbnMuaGlkZS5kZWxheSx0aGlzKX1mdW5jdGlvbiBnKHQpe3JldHVybiB0aGlzLnRvb2x0aXAuaGFzQ2xhc3MoZWUpfHwhdGhpcy5vcHRpb25zLmhpZGUuaW5hY3RpdmU/azooY2xlYXJUaW1lb3V0KHRoaXMudGltZXJzLmluYWN0aXZlKSx0aGlzLnRpbWVycy5pbmFjdGl2ZT1wLmNhbGwodGhpcyxmdW5jdGlvbigpe3RoaXMuaGlkZSh0KX0sdGhpcy5vcHRpb25zLmhpZGUuaW5hY3RpdmUpLGkpfWZ1bmN0aW9uIG0odCl7dGhpcy5yZW5kZXJlZCYmdGhpcy50b29sdGlwWzBdLm9mZnNldFdpZHRoPjAmJnRoaXMucmVwb3NpdGlvbih0KX1mdW5jdGlvbiB2KHQsaSxvKXtzKGUuYm9keSkuZGVsZWdhdGUodCwoaS5zcGxpdD9pOmkuam9pbihoZSsiICIpKStoZSxmdW5jdGlvbigpe3ZhciB0PVQuYXBpW3MuYXR0cih0aGlzLEgpXTt0JiYhdC5kaXNhYmxlZCYmby5hcHBseSh0LGFyZ3VtZW50cyl9KX1mdW5jdGlvbiB5KHQsaSxuKXt2YXIgcixoLGwsYyxkLHA9cyhlLmJvZHkpLHU9dFswXT09PWU/cDp0LGY9dC5tZXRhZGF0YT90Lm1ldGFkYXRhKG4ubWV0YWRhdGEpOkUsZz0iaHRtbDUiPT09bi5tZXRhZGF0YS50eXBlJiZmP2Zbbi5tZXRhZGF0YS5uYW1lXTpFLG09dC5kYXRhKG4ubWV0YWRhdGEubmFtZXx8InF0aXBvcHRzIik7dHJ5e209InN0cmluZyI9PXR5cGVvZiBtP3MucGFyc2VKU09OKG0pOm19Y2F0Y2godil7fWlmKGM9cy5leHRlbmQoVyx7fSxULmRlZmF1bHRzLG4sIm9iamVjdCI9PXR5cGVvZiBtP2EobSk6RSxhKGd8fGYpKSxoPWMucG9zaXRpb24sYy5pZD1pLCJib29sZWFuIj09dHlwZW9mIGMuY29udGVudC50ZXh0KXtpZihsPXQuYXR0cihjLmNvbnRlbnQuYXR0ciksYy5jb250ZW50LmF0dHI9PT1rfHwhbClyZXR1cm4gaztjLmNvbnRlbnQudGV4dD1sfWlmKGguY29udGFpbmVyLmxlbmd0aHx8KGguY29udGFpbmVyPXApLGgudGFyZ2V0PT09ayYmKGgudGFyZ2V0PXUpLGMuc2hvdy50YXJnZXQ9PT1rJiYoYy5zaG93LnRhcmdldD11KSxjLnNob3cuc29sbz09PVcmJihjLnNob3cuc29sbz1oLmNvbnRhaW5lci5jbG9zZXN0KCJib2R5IikpLGMuaGlkZS50YXJnZXQ9PT1rJiYoYy5oaWRlLnRhcmdldD11KSxjLnBvc2l0aW9uLnZpZXdwb3J0PT09VyYmKGMucG9zaXRpb24udmlld3BvcnQ9aC5jb250YWluZXIpLGguY29udGFpbmVyPWguY29udGFpbmVyLmVxKDApLGguYXQ9bmV3IHooaC5hdCxXKSxoLm15PW5ldyB6KGgubXkpLHQuZGF0YShYKSlpZihjLm92ZXJ3cml0ZSl0LnF0aXAoImRlc3Ryb3kiLCEwKTtlbHNlIGlmKGMub3ZlcndyaXRlPT09aylyZXR1cm4gaztyZXR1cm4gdC5hdHRyKFksaSksYy5zdXBwcmVzcyYmKGQ9dC5hdHRyKCJ0aXRsZSIpKSYmdC5yZW1vdmVBdHRyKCJ0aXRsZSIpLmF0dHIoc2UsZCkuYXR0cigidGl0bGUiLCIiKSxyPW5ldyBvKHQsYyxpLCEhbCksdC5kYXRhKFgsciksdC5vbmUoInJlbW92ZS5xdGlwLSIraSsiIHJlbW92ZXF0aXAucXRpcC0iK2ksZnVuY3Rpb24oKXt2YXIgdDsodD1zKHRoaXMpLmRhdGEoWCkpJiZ0LmRlc3Ryb3koITApfSkscn1mdW5jdGlvbiBiKHQpe3JldHVybiB0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSl9ZnVuY3Rpb24gdyh0LGUpe3ZhciBzLG8sbj1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSkscj0oZSsiICIrYmUuam9pbihuKyIgIikrbikuc3BsaXQoIiAiKSxhPTA7aWYoeWVbZV0pcmV0dXJuIHQuY3NzKHllW2VdKTtmb3IoO3M9clthKytdOylpZigobz10LmNzcyhzKSkhPT1pKXJldHVybiB5ZVtlXT1zLG99ZnVuY3Rpb24gXyh0LGUpe3JldHVybiBNYXRoLmNlaWwocGFyc2VGbG9hdCh3KHQsZSkpKX1mdW5jdGlvbiB4KHQsZSl7dGhpcy5fbnM9InRpcCIsdGhpcy5vcHRpb25zPWUsdGhpcy5vZmZzZXQ9ZS5vZmZzZXQsdGhpcy5zaXplPVtlLndpZHRoLGUuaGVpZ2h0XSx0aGlzLmluaXQodGhpcy5xdGlwPXQpfWZ1bmN0aW9uIHEodCxlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLl9ucz0iLW1vZGFsIix0aGlzLmluaXQodGhpcy5xdGlwPXQpfWZ1bmN0aW9uIEModCl7dGhpcy5fbnM9ImllNiIsdGhpcy5pbml0KHRoaXMucXRpcD10KX12YXIgVCxqLHosTSxJLFc9ITAsaz0hMSxFPW51bGwsUz0ieCIsTD0ieSIsQT0id2lkdGgiLEI9ImhlaWdodCIsRD0idG9wIixGPSJsZWZ0IixPPSJib3R0b20iLFA9InJpZ2h0IixOPSJjZW50ZXIiLCQ9ImZsaXBpbnZlcnQiLFY9InNoaWZ0IixSPXt9LFg9InF0aXAiLFk9ImRhdGEtaGFzcXRpcCIsSD0iZGF0YS1xdGlwLWlkIixHPVsidWktd2lkZ2V0IiwidWktdG9vbHRpcCJdLFU9Ii4iK1gsUT0iY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlbGVhdmUgbW91c2VlbnRlciIuc3BsaXQoIiAiKSxKPVgrIi1maXhlZCIsSz1YKyItZGVmYXVsdCIsWj1YKyItZm9jdXMiLHRlPVgrIi1ob3ZlciIsZWU9WCsiLWRpc2FibGVkIixpZT0iX3JlcGxhY2VkQnlxVGlwIixzZT0ib2xkdGl0bGUiLG9lPXtpZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0zLGk9ZS5jcmVhdGVFbGVtZW50KCJkaXYiKTsoaS5pbm5lckhUTUw9IjwhLS1baWYgZ3QgSUUgIisgKyt0KyJdPjxpPjwvaT48IVtlbmRpZl0tLT4iKSYmaS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaSIpWzBdOyk7cmV0dXJuIHQ+ND90OjAvMH0oKSxpT1M6cGFyc2VGbG9hdCgoIiIrKC9DUFUuKk9TIChbMC05X117MSw1fSl8KENQVSBsaWtlKS4qQXBwbGVXZWJLaXQuKk1vYmlsZS9pLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudCl8fFswLCIiXSlbMV0pLnJlcGxhY2UoInVuZGVmaW5lZCIsIjNfMiIpLnJlcGxhY2UoIl8iLCIuIikucmVwbGFjZSgiXyIsIiIpKXx8a307aj1vLnByb3RvdHlwZSxqLl93aGVuPWZ1bmN0aW9uKHQpe3JldHVybiBzLndoZW4uYXBwbHkocyx0KX0sai5yZW5kZXI9ZnVuY3Rpb24odCl7aWYodGhpcy5yZW5kZXJlZHx8dGhpcy5kZXN0cm95ZWQpcmV0dXJuIHRoaXM7dmFyIGUsaT10aGlzLG89dGhpcy5vcHRpb25zLG49dGhpcy5jYWNoZSxyPXRoaXMuZWxlbWVudHMsYT1vLmNvbnRlbnQudGV4dCxoPW8uY29udGVudC50aXRsZSxsPW8uY29udGVudC5idXR0b24sYz1vLnBvc2l0aW9uLGQ9KCIuIit0aGlzLl9pZCsiICIsW10pO3JldHVybiBzLmF0dHIodGhpcy50YXJnZXRbMF0sImFyaWEtZGVzY3JpYmVkYnkiLHRoaXMuX2lkKSx0aGlzLnRvb2x0aXA9ci50b29sdGlwPWU9cygiPGRpdi8+Iix7aWQ6dGhpcy5faWQsImNsYXNzIjpbWCxLLG8uc3R5bGUuY2xhc3NlcyxYKyItcG9zLSIrby5wb3NpdGlvbi5teS5hYmJyZXYoKV0uam9pbigiICIpLHdpZHRoOm8uc3R5bGUud2lkdGh8fCIiLGhlaWdodDpvLnN0eWxlLmhlaWdodHx8IiIsdHJhY2tpbmc6Im1vdXNlIj09PWMudGFyZ2V0JiZjLmFkanVzdC5tb3VzZSxyb2xlOiJhbGVydCIsImFyaWEtbGl2ZSI6InBvbGl0ZSIsImFyaWEtYXRvbWljIjprLCJhcmlhLWRlc2NyaWJlZGJ5Ijp0aGlzLl9pZCsiLWNvbnRlbnQiLCJhcmlhLWhpZGRlbiI6V30pLnRvZ2dsZUNsYXNzKGVlLHRoaXMuZGlzYWJsZWQpLmF0dHIoSCx0aGlzLmlkKS5kYXRhKFgsdGhpcykuYXBwZW5kVG8oYy5jb250YWluZXIpLmFwcGVuZChyLmNvbnRlbnQ9cygiPGRpdiAvPiIseyJjbGFzcyI6WCsiLWNvbnRlbnQiLGlkOnRoaXMuX2lkKyItY29udGVudCIsImFyaWEtYXRvbWljIjpXfSkpLHRoaXMucmVuZGVyZWQ9LTEsdGhpcy5wb3NpdGlvbmluZz1XLGgmJih0aGlzLl9jcmVhdGVUaXRsZSgpLHMuaXNGdW5jdGlvbihoKXx8ZC5wdXNoKHRoaXMuX3VwZGF0ZVRpdGxlKGgsaykpKSxsJiZ0aGlzLl9jcmVhdGVCdXR0b24oKSxzLmlzRnVuY3Rpb24oYSl8fGQucHVzaCh0aGlzLl91cGRhdGVDb250ZW50KGEsaykpLHRoaXMucmVuZGVyZWQ9Vyx0aGlzLl9zZXRXaWRnZXQoKSxzLmVhY2goUixmdW5jdGlvbih0KXt2YXIgZTsicmVuZGVyIj09PXRoaXMuaW5pdGlhbGl6ZSYmKGU9dGhpcyhpKSkmJihpLnBsdWdpbnNbdF09ZSl9KSx0aGlzLl91bmFzc2lnbkV2ZW50cygpLHRoaXMuX2Fzc2lnbkV2ZW50cygpLHRoaXMuX3doZW4oZCkudGhlbihmdW5jdGlvbigpe2kuX3RyaWdnZXIoInJlbmRlciIpLGkucG9zaXRpb25pbmc9ayxpLmhpZGRlbkR1cmluZ1dhaXR8fCFvLnNob3cucmVhZHkmJiF0fHxpLnRvZ2dsZShXLG4uZXZlbnQsayksaS5oaWRkZW5EdXJpbmdXYWl0PWt9KSxULmFwaVt0aGlzLmlkXT10aGlzLHRoaXN9LGouZGVzdHJveT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7aWYoIXRoaXMuZGVzdHJveWVkKXt0aGlzLmRlc3Ryb3llZD1XO3ZhciB0PXRoaXMudGFyZ2V0LGU9dC5hdHRyKHNlKTt0aGlzLnJlbmRlcmVkJiZ0aGlzLnRvb2x0aXAuc3RvcCgxLDApLmZpbmQoIioiKS5yZW1vdmUoKS5lbmQoKS5yZW1vdmUoKSxzLmVhY2godGhpcy5wbHVnaW5zLGZ1bmN0aW9uKCl7dGhpcy5kZXN0cm95JiZ0aGlzLmRlc3Ryb3koKX0pLGNsZWFyVGltZW91dCh0aGlzLnRpbWVycy5zaG93KSxjbGVhclRpbWVvdXQodGhpcy50aW1lcnMuaGlkZSksdGhpcy5fdW5hc3NpZ25FdmVudHMoKSx0LnJlbW92ZURhdGEoWCkucmVtb3ZlQXR0cihIKS5yZW1vdmVBdHRyKFkpLnJlbW92ZUF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKSx0aGlzLm9wdGlvbnMuc3VwcHJlc3MmJmUmJnQuYXR0cigidGl0bGUiLGUpLnJlbW92ZUF0dHIoc2UpLHRoaXMuX3VuYmluZCh0KSx0aGlzLm9wdGlvbnM9dGhpcy5lbGVtZW50cz10aGlzLmNhY2hlPXRoaXMudGltZXJzPXRoaXMucGx1Z2lucz10aGlzLm1vdXNlPUUsZGVsZXRlIFQuYXBpW3RoaXMuaWRdfX1yZXR1cm4gdGhpcy5kZXN0cm95ZWQ/dGhpcy50YXJnZXQ6KHQ9PT1XJiYiaGlkZSIhPT10aGlzLnRyaWdnZXJpbmd8fCF0aGlzLnJlbmRlcmVkP2UuY2FsbCh0aGlzKToodGhpcy50b29sdGlwLm9uZSgidG9vbHRpcGhpZGRlbiIscy5wcm94eShlLHRoaXMpKSwhdGhpcy50cmlnZ2VyaW5nJiZ0aGlzLmhpZGUoKSksdGhpcy50YXJnZXQpfSxNPWouY2hlY2tzPXtidWlsdGluOnsiXmlkJCI6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49aT09PVc/VC5uZXh0aWQ6aSxyPVgrIi0iK247biE9PWsmJm4ubGVuZ3RoPjAmJiFzKCIjIityKS5sZW5ndGg/KHRoaXMuX2lkPXIsdGhpcy5yZW5kZXJlZCYmKHRoaXMudG9vbHRpcFswXS5pZD10aGlzLl9pZCx0aGlzLmVsZW1lbnRzLmNvbnRlbnRbMF0uaWQ9dGhpcy5faWQrIi1jb250ZW50Iix0aGlzLmVsZW1lbnRzLnRpdGxlWzBdLmlkPXRoaXMuX2lkKyItdGl0bGUiKSk6dFtlXT1vfSwiXnByZXJlbmRlciI6ZnVuY3Rpb24odCxlLGkpe2kmJiF0aGlzLnJlbmRlcmVkJiZ0aGlzLnJlbmRlcih0aGlzLm9wdGlvbnMuc2hvdy5yZWFkeSl9LCJeY29udGVudC50ZXh0JCI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX3VwZGF0ZUNvbnRlbnQoaSl9LCJeY29udGVudC5hdHRyJCI6ZnVuY3Rpb24odCxlLGkscyl7dGhpcy5vcHRpb25zLmNvbnRlbnQudGV4dD09PXRoaXMudGFyZ2V0LmF0dHIocykmJnRoaXMuX3VwZGF0ZUNvbnRlbnQodGhpcy50YXJnZXQuYXR0cihpKSl9LCJeY29udGVudC50aXRsZSQiOmZ1bmN0aW9uKHQsZSxzKXtyZXR1cm4gcz8ocyYmIXRoaXMuZWxlbWVudHMudGl0bGUmJnRoaXMuX2NyZWF0ZVRpdGxlKCksdGhpcy5fdXBkYXRlVGl0bGUocyksaSk6dGhpcy5fcmVtb3ZlVGl0bGUoKX0sIl5jb250ZW50LmJ1dHRvbiQiOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLl91cGRhdGVCdXR0b24oaSl9LCJeY29udGVudC50aXRsZS4odGV4dHxidXR0b24pJCI6ZnVuY3Rpb24odCxlLGkpe3RoaXMuc2V0KCJjb250ZW50LiIrZSxpKX0sIl5wb3NpdGlvbi4obXl8YXQpJCI6ZnVuY3Rpb24odCxlLGkpeyJzdHJpbmciPT10eXBlb2YgaSYmKHRbZV09bmV3IHooaSwiYXQiPT09ZSkpfSwiXnBvc2l0aW9uLmNvbnRhaW5lciQiOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLnJlbmRlcmVkJiZ0aGlzLnRvb2x0aXAuYXBwZW5kVG8oaSl9LCJec2hvdy5yZWFkeSQiOmZ1bmN0aW9uKHQsZSxpKXtpJiYoIXRoaXMucmVuZGVyZWQmJnRoaXMucmVuZGVyKFcpfHx0aGlzLnRvZ2dsZShXKSl9LCJec3R5bGUuY2xhc3NlcyQiOmZ1bmN0aW9uKHQsZSxpLHMpe3RoaXMucmVuZGVyZWQmJnRoaXMudG9vbHRpcC5yZW1vdmVDbGFzcyhzKS5hZGRDbGFzcyhpKX0sIl5zdHlsZS4od2lkdGh8aGVpZ2h0KSI6ZnVuY3Rpb24odCxlLGkpe3RoaXMucmVuZGVyZWQmJnRoaXMudG9vbHRpcC5jc3MoZSxpKX0sIl5zdHlsZS53aWRnZXR8Y29udGVudC50aXRsZSI6ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVkJiZ0aGlzLl9zZXRXaWRnZXQoKX0sIl5zdHlsZS5kZWYiOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLnJlbmRlcmVkJiZ0aGlzLnRvb2x0aXAudG9nZ2xlQ2xhc3MoSywhIWkpfSwiXmV2ZW50cy4ocmVuZGVyfHNob3d8bW92ZXxoaWRlfGZvY3VzfGJsdXIpJCI6ZnVuY3Rpb24odCxlLGkpe3RoaXMucmVuZGVyZWQmJnRoaXMudG9vbHRpcFsocy5pc0Z1bmN0aW9uKGkpPyIiOiJ1biIpKyJiaW5kIl0oInRvb2x0aXAiK2UsaSl9LCJeKHNob3d8aGlkZXxwb3NpdGlvbikuKGV2ZW50fHRhcmdldHxmaXhlZHxpbmFjdGl2ZXxsZWF2ZXxkaXN0YW5jZXx2aWV3cG9ydHxhZGp1c3QpIjpmdW5jdGlvbigpe2lmKHRoaXMucmVuZGVyZWQpe3ZhciB0PXRoaXMub3B0aW9ucy5wb3NpdGlvbjt0aGlzLnRvb2x0aXAuYXR0cigidHJhY2tpbmciLCJtb3VzZSI9PT10LnRhcmdldCYmdC5hZGp1c3QubW91c2UpLHRoaXMuX3VuYXNzaWduRXZlbnRzKCksdGhpcy5fYXNzaWduRXZlbnRzKCl9fX19LGouZ2V0PWZ1bmN0aW9uKHQpe2lmKHRoaXMuZGVzdHJveWVkKXJldHVybiB0aGlzO3ZhciBlPWgodGhpcy5vcHRpb25zLHQudG9Mb3dlckNhc2UoKSksaT1lWzBdW2VbMV1dO3JldHVybiBpLnByZWNlZGFuY2U/aS5zdHJpbmcoKTppfTt2YXIgbmU9L15wb3NpdGlvblwuKG15fGF0fGFkanVzdHx0YXJnZXR8Y29udGFpbmVyfHZpZXdwb3J0KXxzdHlsZXxjb250ZW50fHNob3dcLnJlYWR5L2kscmU9L15wcmVyZW5kZXJ8c2hvd1wucmVhZHkvaTtqLnNldD1mdW5jdGlvbih0LGUpe2lmKHRoaXMuZGVzdHJveWVkKXJldHVybiB0aGlzO3ZhciBvLG49dGhpcy5yZW5kZXJlZCxyPWssYz10aGlzLm9wdGlvbnM7cmV0dXJuIHRoaXMuY2hlY2tzLCJzdHJpbmciPT10eXBlb2YgdD8obz10LHQ9e30sdFtvXT1lKTp0PXMuZXh0ZW5kKHt9LHQpLHMuZWFjaCh0LGZ1bmN0aW9uKGUsbyl7aWYobiYmcmUudGVzdChlKSlyZXR1cm4gZGVsZXRlIHRbZV0saTt2YXIgYSxsPWgoYyxlLnRvTG93ZXJDYXNlKCkpO2E9bFswXVtsWzFdXSxsWzBdW2xbMV1dPW8mJm8ubm9kZVR5cGU/cyhvKTpvLHI9bmUudGVzdChlKXx8cix0W2VdPVtsWzBdLGxbMV0sbyxhXX0pLGEoYyksdGhpcy5wb3NpdGlvbmluZz1XLHMuZWFjaCh0LHMucHJveHkobCx0aGlzKSksdGhpcy5wb3NpdGlvbmluZz1rLHRoaXMucmVuZGVyZWQmJnRoaXMudG9vbHRpcFswXS5vZmZzZXRXaWR0aD4wJiZyJiZ0aGlzLnJlcG9zaXRpb24oIm1vdXNlIj09PWMucG9zaXRpb24udGFyZ2V0P0U6dGhpcy5jYWNoZS5ldmVudCksdGhpc30sai5fdXBkYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXRoaXMuY2FjaGU7cmV0dXJuIHRoaXMucmVuZGVyZWQmJnQ/KHMuaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKHRoaXMuZWxlbWVudHMudGFyZ2V0LG8uZXZlbnQsdGhpcyl8fCIiKSxzLmlzRnVuY3Rpb24odC50aGVuKT8oby53YWl0aW5nPVcsdC50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiBvLndhaXRpbmc9ayxpLl91cGRhdGUodCxlKX0sRSxmdW5jdGlvbih0KXtyZXR1cm4gaS5fdXBkYXRlKHQsZSl9KSk6dD09PWt8fCF0JiYiIiE9PXQ/azoodC5qcXVlcnkmJnQubGVuZ3RoPjA/ZS5lbXB0eSgpLmFwcGVuZCh0LmNzcyh7ZGlzcGxheToiYmxvY2siLHZpc2liaWxpdHk6InZpc2libGUifSkpOmUuaHRtbCh0KSx0aGlzLl93YWl0Rm9yQ29udGVudChlKS50aGVuKGZ1bmN0aW9uKHQpe3QuaW1hZ2VzJiZ0LmltYWdlcy5sZW5ndGgmJmkucmVuZGVyZWQmJmkudG9vbHRpcFswXS5vZmZzZXRXaWR0aD4wJiZpLnJlcG9zaXRpb24oby5ldmVudCwhdC5sZW5ndGgpfSkpKTprfSxqLl93YWl0Rm9yQ29udGVudD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNhY2hlO3JldHVybiBlLndhaXRpbmc9Vywocy5mbi5pbWFnZXNMb2FkZWQ/dC5pbWFnZXNMb2FkZWQoKTpzLkRlZmVycmVkKCkucmVzb2x2ZShbXSkpLmRvbmUoZnVuY3Rpb24oKXtlLndhaXRpbmc9a30pLnByb21pc2UoKX0sai5fdXBkYXRlQ29udGVudD1mdW5jdGlvbih0LGUpe3RoaXMuX3VwZGF0ZSh0LHRoaXMuZWxlbWVudHMuY29udGVudCxlKX0sai5fdXBkYXRlVGl0bGU9ZnVuY3Rpb24odCxlKXt0aGlzLl91cGRhdGUodCx0aGlzLmVsZW1lbnRzLnRpdGxlLGUpPT09ayYmdGhpcy5fcmVtb3ZlVGl0bGUoayl9LGouX2NyZWF0ZVRpdGxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50cyxlPXRoaXMuX2lkKyItdGl0bGUiO3QudGl0bGViYXImJnRoaXMuX3JlbW92ZVRpdGxlKCksdC50aXRsZWJhcj1zKCI8ZGl2IC8+Iix7ImNsYXNzIjpYKyItdGl0bGViYXIgIisodGhpcy5vcHRpb25zLnN0eWxlLndpZGdldD9jKCJoZWFkZXIiKToiIil9KS5hcHBlbmQodC50aXRsZT1zKCI8ZGl2IC8+Iix7aWQ6ZSwiY2xhc3MiOlgrIi10aXRsZSIsImFyaWEtYXRvbWljIjpXfSkpLmluc2VydEJlZm9yZSh0LmNvbnRlbnQpLmRlbGVnYXRlKCIucXRpcC1jbG9zZSIsIm1vdXNlZG93biBrZXlkb3duIG1vdXNldXAga2V5dXAgbW91c2VvdXQiLGZ1bmN0aW9uKHQpe3ModGhpcykudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1mb2N1cyIsImRvd24iPT09dC50eXBlLnN1YnN0cigtNCkpfSkuZGVsZWdhdGUoIi5xdGlwLWNsb3NlIiwibW91c2VvdmVyIG1vdXNlb3V0IixmdW5jdGlvbih0KXtzKHRoaXMpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIsIm1vdXNlb3ZlciI9PT10LnR5cGUpfSksdGhpcy5vcHRpb25zLmNvbnRlbnQuYnV0dG9uJiZ0aGlzLl9jcmVhdGVCdXR0b24oKX0sai5fcmVtb3ZlVGl0bGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbGVtZW50cztlLnRpdGxlJiYoZS50aXRsZWJhci5yZW1vdmUoKSxlLnRpdGxlYmFyPWUudGl0bGU9ZS5idXR0b249RSx0IT09ayYmdGhpcy5yZXBvc2l0aW9uKCkpfSxqLnJlcG9zaXRpb249ZnVuY3Rpb24oaSxvKXtpZighdGhpcy5yZW5kZXJlZHx8dGhpcy5wb3NpdGlvbmluZ3x8dGhpcy5kZXN0cm95ZWQpcmV0dXJuIHRoaXM7dGhpcy5wb3NpdGlvbmluZz1XO3ZhciBuLHIsYT10aGlzLmNhY2hlLGg9dGhpcy50b29sdGlwLGw9dGhpcy5vcHRpb25zLnBvc2l0aW9uLGM9bC50YXJnZXQsZD1sLm15LHA9bC5hdCx1PWwudmlld3BvcnQsZj1sLmNvbnRhaW5lcixnPWwuYWRqdXN0LG09Zy5tZXRob2Quc3BsaXQoIiAiKSx2PWgub3V0ZXJXaWR0aChrKSx5PWgub3V0ZXJIZWlnaHQoayksYj0wLHc9MCxfPWguY3NzKCJwb3NpdGlvbiIpLHg9e2xlZnQ6MCx0b3A6MH0scT1oWzBdLm9mZnNldFdpZHRoPjAsQz1pJiYic2Nyb2xsIj09PWkudHlwZSxUPXModCksaj1mWzBdLm93bmVyRG9jdW1lbnQsej10aGlzLm1vdXNlO2lmKHMuaXNBcnJheShjKSYmMj09PWMubGVuZ3RoKXA9e3g6Rix5OkR9LHg9e2xlZnQ6Y1swXSx0b3A6Y1sxXX07ZWxzZSBpZigibW91c2UiPT09YylwPXt4OkYseTpEfSwhenx8IXoucGFnZVh8fCFnLm1vdXNlJiZpJiZpLnBhZ2VYP2kmJmkucGFnZVh8fCgoIWcubW91c2V8fHRoaXMub3B0aW9ucy5zaG93LmRpc3RhbmNlKSYmYS5vcmlnaW4mJmEub3JpZ2luLnBhZ2VYP2k9YS5vcmlnaW46KCFpfHxpJiYoInJlc2l6ZSI9PT1pLnR5cGV8fCJzY3JvbGwiPT09aS50eXBlKSkmJihpPWEuZXZlbnQpKTppPXosInN0YXRpYyIhPT1fJiYoeD1mLm9mZnNldCgpKSxqLmJvZHkub2Zmc2V0V2lkdGghPT0odC5pbm5lcldpZHRofHxqLmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihyPXMoZS5ib2R5KS5vZmZzZXQoKSkseD17bGVmdDppLnBhZ2VYLXgubGVmdCsociYmci5sZWZ0fHwwKSx0b3A6aS5wYWdlWS14LnRvcCsociYmci50b3B8fDApfSxnLm1vdXNlJiZDJiZ6JiYoeC5sZWZ0LT0oei5zY3JvbGxYfHwwKS1ULnNjcm9sbExlZnQoKSx4LnRvcC09KHouc2Nyb2xsWXx8MCktVC5zY3JvbGxUb3AoKSk7ZWxzZXtpZigiZXZlbnQiPT09Yz9pJiZpLnRhcmdldCYmInNjcm9sbCIhPT1pLnR5cGUmJiJyZXNpemUiIT09aS50eXBlP2EudGFyZ2V0PXMoaS50YXJnZXQpOmkudGFyZ2V0fHwoYS50YXJnZXQ9dGhpcy5lbGVtZW50cy50YXJnZXQpOiJldmVudCIhPT1jJiYoYS50YXJnZXQ9cyhjLmpxdWVyeT9jOnRoaXMuZWxlbWVudHMudGFyZ2V0KSksYz1hLnRhcmdldCxjPXMoYykuZXEoMCksMD09PWMubGVuZ3RoKXJldHVybiB0aGlzO2NbMF09PT1lfHxjWzBdPT09dD8oYj1vZS5pT1M/dC5pbm5lcldpZHRoOmMud2lkdGgoKSx3PW9lLmlPUz90LmlubmVySGVpZ2h0OmMuaGVpZ2h0KCksY1swXT09PXQmJih4PXt0b3A6KHV8fGMpLnNjcm9sbFRvcCgpLGxlZnQ6KHV8fGMpLnNjcm9sbExlZnQoKX0pKTpSLmltYWdlbWFwJiZjLmlzKCJhcmVhIik/bj1SLmltYWdlbWFwKHRoaXMsYyxwLFIudmlld3BvcnQ/bTprKTpSLnN2ZyYmYyYmY1swXS5vd25lclNWR0VsZW1lbnQ/bj1SLnN2Zyh0aGlzLGMscCxSLnZpZXdwb3J0P206ayk6KGI9Yy5vdXRlcldpZHRoKGspLHc9Yy5vdXRlckhlaWdodChrKSx4PWMub2Zmc2V0KCkpLG4mJihiPW4ud2lkdGgsdz1uLmhlaWdodCxyPW4ub2Zmc2V0LHg9bi5wb3NpdGlvbikseD10aGlzLnJlcG9zaXRpb24ub2Zmc2V0KGMseCxmKSwob2UuaU9TPjMuMSYmNC4xPm9lLmlPU3x8b2UuaU9TPj00LjMmJjQuMzM+b2UuaU9TfHwhb2UuaU9TJiYiZml4ZWQiPT09XykmJih4LmxlZnQtPVQuc2Nyb2xsTGVmdCgpLHgudG9wLT1ULnNjcm9sbFRvcCgpKSwoIW58fG4mJm4uYWRqdXN0YWJsZSE9PWspJiYoeC5sZWZ0Kz1wLng9PT1QP2I6cC54PT09Tj9iLzI6MCx4LnRvcCs9cC55PT09Tz93OnAueT09PU4/dy8yOjApfXJldHVybiB4LmxlZnQrPWcueCsoZC54PT09UD8tdjpkLng9PT1OPy12LzI6MCkseC50b3ArPWcueSsoZC55PT09Tz8teTpkLnk9PT1OPy15LzI6MCksUi52aWV3cG9ydD8oeC5hZGp1c3RlZD1SLnZpZXdwb3J0KHRoaXMseCxsLGIsdyx2LHkpLHImJnguYWRqdXN0ZWQubGVmdCYmKHgubGVmdCs9ci5sZWZ0KSxyJiZ4LmFkanVzdGVkLnRvcCYmKHgudG9wKz1yLnRvcCkpOnguYWRqdXN0ZWQ9e2xlZnQ6MCx0b3A6MH0sdGhpcy5fdHJpZ2dlcigibW92ZSIsW3gsdS5lbGVtfHx1XSxpKT8oZGVsZXRlIHguYWRqdXN0ZWQsbz09PWt8fCFxfHxpc05hTih4LmxlZnQpfHxpc05hTih4LnRvcCl8fCJtb3VzZSI9PT1jfHwhcy5pc0Z1bmN0aW9uKGwuZWZmZWN0KT9oLmNzcyh4KTpzLmlzRnVuY3Rpb24obC5lZmZlY3QpJiYobC5lZmZlY3QuY2FsbChoLHRoaXMscy5leHRlbmQoe30seCkpLGgucXVldWUoZnVuY3Rpb24odCl7cyh0aGlzKS5jc3Moe29wYWNpdHk6IiIsaGVpZ2h0OiIifSksb2UuaWUmJnRoaXMuc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKSx0KCl9KSksdGhpcy5wb3NpdGlvbmluZz1rLHRoaXMpOnRoaXN9LGoucmVwb3NpdGlvbi5vZmZzZXQ9ZnVuY3Rpb24odCxpLG8pe2Z1bmN0aW9uIG4odCxlKXtpLmxlZnQrPWUqdC5zY3JvbGxMZWZ0KCksaS50b3ArPWUqdC5zY3JvbGxUb3AoKX1pZighb1swXSlyZXR1cm4gaTt2YXIgcixhLGgsbCxjPXModFswXS5vd25lckRvY3VtZW50KSxkPSEhb2UuaWUmJiJDU1MxQ29tcGF0IiE9PWUuY29tcGF0TW9kZSxwPW9bMF07ZG8ic3RhdGljIiE9PShhPXMuY3NzKHAsInBvc2l0aW9uIikpJiYoImZpeGVkIj09PWE/KGg9cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuKGMsLTEpKTooaD1zKHApLnBvc2l0aW9uKCksaC5sZWZ0Kz1wYXJzZUZsb2F0KHMuY3NzKHAsImJvcmRlckxlZnRXaWR0aCIpKXx8MCxoLnRvcCs9cGFyc2VGbG9hdChzLmNzcyhwLCJib3JkZXJUb3BXaWR0aCIpKXx8MCksaS5sZWZ0LT1oLmxlZnQrKHBhcnNlRmxvYXQocy5jc3MocCwibWFyZ2luTGVmdCIpKXx8MCksaS50b3AtPWgudG9wKyhwYXJzZUZsb2F0KHMuY3NzKHAsIm1hcmdpblRvcCIpKXx8MCkscnx8ImhpZGRlbiI9PT0obD1zLmNzcyhwLCJvdmVyZmxvdyIpKXx8InZpc2libGUiPT09bHx8KHI9cyhwKSkpO3doaWxlKHA9cC5vZmZzZXRQYXJlbnQpO3JldHVybiByJiYoclswXSE9PWNbMF18fGQpJiZuKHIsMSksaX07dmFyIGFlPSh6PWoucmVwb3NpdGlvbi5Db3JuZXI9ZnVuY3Rpb24odCxlKXt0PSgiIit0KS5yZXBsYWNlKC8oW0EtWl0pLywiICQxIikucmVwbGFjZSgvbWlkZGxlL2dpLE4pLnRvTG93ZXJDYXNlKCksdGhpcy54PSh0Lm1hdGNoKC9sZWZ0fHJpZ2h0L2kpfHx0Lm1hdGNoKC9jZW50ZXIvKXx8WyJpbmhlcml0Il0pWzBdLnRvTG93ZXJDYXNlKCksdGhpcy55PSh0Lm1hdGNoKC90b3B8Ym90dG9tfGNlbnRlci9pKXx8WyJpbmhlcml0Il0pWzBdLnRvTG93ZXJDYXNlKCksdGhpcy5mb3JjZVk9ISFlO3ZhciBpPXQuY2hhckF0KDApO3RoaXMucHJlY2VkYW5jZT0idCI9PT1pfHwiYiI9PT1pP0w6U30pLnByb3RvdHlwZTthZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt0aGlzW3RdPXRoaXNbdF09PT1GP1A6dGhpc1t0XT09PVA/RjplfHx0aGlzW3RdfSxhZS5zdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLngsZT10aGlzLnk7cmV0dXJuIHQ9PT1lP3Q6dGhpcy5wcmVjZWRhbmNlPT09THx8dGhpcy5mb3JjZVkmJiJjZW50ZXIiIT09ZT9lKyIgIit0OnQrIiAiK2V9LGFlLmFiYnJldj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc3RyaW5nKCkuc3BsaXQoIiAiKTtyZXR1cm4gdFswXS5jaGFyQXQoMCkrKHRbMV0mJnRbMV0uY2hhckF0KDApfHwiIil9LGFlLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB6KHRoaXMuc3RyaW5nKCksdGhpcy5mb3JjZVkpfSxqLnRvZ2dsZT1mdW5jdGlvbih0LGkpe3ZhciBvPXRoaXMuY2FjaGUsbj10aGlzLm9wdGlvbnMscj10aGlzLnRvb2x0aXA7aWYoaSl7aWYoL292ZXJ8ZW50ZXIvLnRlc3QoaS50eXBlKSYmL291dHxsZWF2ZS8udGVzdChvLmV2ZW50LnR5cGUpJiZuLnNob3cudGFyZ2V0LmFkZChpLnRhcmdldCkubGVuZ3RoPT09bi5zaG93LnRhcmdldC5sZW5ndGgmJnIuaGFzKGkucmVsYXRlZFRhcmdldCkubGVuZ3RoKXJldHVybiB0aGlzO28uZXZlbnQ9ZChpKX1pZih0aGlzLndhaXRpbmcmJiF0JiYodGhpcy5oaWRkZW5EdXJpbmdXYWl0PVcpLCF0aGlzLnJlbmRlcmVkKXJldHVybiB0P3RoaXMucmVuZGVyKDEpOnRoaXM7aWYodGhpcy5kZXN0cm95ZWR8fHRoaXMuZGlzYWJsZWQpcmV0dXJuIHRoaXM7dmFyIGEsaCxsLGM9dD8ic2hvdyI6ImhpZGUiLHA9dGhpcy5vcHRpb25zW2NdLHU9KHRoaXMub3B0aW9uc1t0PyJoaWRlIjoic2hvdyJdLHRoaXMub3B0aW9ucy5wb3NpdGlvbiksZj10aGlzLm9wdGlvbnMuY29udGVudCxnPXRoaXMudG9vbHRpcC5jc3MoIndpZHRoIiksbT10aGlzLnRvb2x0aXAuaXMoIjp2aXNpYmxlIiksdj10fHwxPT09cC50YXJnZXQubGVuZ3RoLHk9IWl8fDI+cC50YXJnZXQubGVuZ3RofHxvLnRhcmdldFswXT09PWkudGFyZ2V0O3JldHVybih0eXBlb2YgdCkuc2VhcmNoKCJib29sZWFufG51bWJlciIpJiYodD0hbSksYT0hci5pcygiOmFuaW1hdGVkIikmJm09PT10JiZ5LGg9YT9FOiEhdGhpcy5fdHJpZ2dlcihjLFs5MF0pLHRoaXMuZGVzdHJveWVkP3RoaXM6KGghPT1rJiZ0JiZ0aGlzLmZvY3VzKGkpLCFofHxhP3RoaXM6KHMuYXR0cihyWzBdLCJhcmlhLWhpZGRlbiIsIXQpLHQ/KG8ub3JpZ2luPWQodGhpcy5tb3VzZSkscy5pc0Z1bmN0aW9uKGYudGV4dCkmJnRoaXMuX3VwZGF0ZUNvbnRlbnQoZi50ZXh0LGspLHMuaXNGdW5jdGlvbihmLnRpdGxlKSYmdGhpcy5fdXBkYXRlVGl0bGUoZi50aXRsZSxrKSwhSSYmIm1vdXNlIj09PXUudGFyZ2V0JiZ1LmFkanVzdC5tb3VzZSYmKHMoZSkuYmluZCgibW91c2Vtb3ZlLiIrWCx0aGlzLl9zdG9yZU1vdXNlKSxJPVcpLGd8fHIuY3NzKCJ3aWR0aCIsci5vdXRlcldpZHRoKGspKSx0aGlzLnJlcG9zaXRpb24oaSxhcmd1bWVudHNbMl0pLGd8fHIuY3NzKCJ3aWR0aCIsIiIpLHAuc29sbyYmKCJzdHJpbmciPT10eXBlb2YgcC5zb2xvP3MocC5zb2xvKTpzKFUscC5zb2xvKSkubm90KHIpLm5vdChwLnRhcmdldCkucXRpcCgiaGlkZSIscy5FdmVudCgidG9vbHRpcHNvbG8iKSkpOihjbGVhclRpbWVvdXQodGhpcy50aW1lcnMuc2hvdyksZGVsZXRlIG8ub3JpZ2luLEkmJiFzKFUrJ1t0cmFja2luZz0idHJ1ZSJdOnZpc2libGUnLHAuc29sbykubm90KHIpLmxlbmd0aCYmKHMoZSkudW5iaW5kKCJtb3VzZW1vdmUuIitYKSxJPWspLHRoaXMuYmx1cihpKSksbD1zLnByb3h5KGZ1bmN0aW9uKCl7dD8ob2UuaWUmJnJbMF0uc3R5bGUucmVtb3ZlQXR0cmlidXRlKCJmaWx0ZXIiKSxyLmNzcygib3ZlcmZsb3ciLCIiKSwic3RyaW5nIj09dHlwZW9mIHAuYXV0b2ZvY3VzJiZzKHRoaXMub3B0aW9ucy5zaG93LmF1dG9mb2N1cyxyKS5mb2N1cygpLHRoaXMub3B0aW9ucy5zaG93LnRhcmdldC50cmlnZ2VyKCJxdGlwLSIrdGhpcy5pZCsiLWluYWN0aXZlIikpOnIuY3NzKHtkaXNwbGF5OiIiLHZpc2liaWxpdHk6IiIsb3BhY2l0eToiIixsZWZ0OiIiLHRvcDoiIn0pLHRoaXMuX3RyaWdnZXIodD8idmlzaWJsZSI6ImhpZGRlbiIpfSx0aGlzKSxwLmVmZmVjdD09PWt8fHY9PT1rPyhyW2NdKCksbCgpKTpzLmlzRnVuY3Rpb24ocC5lZmZlY3QpPyhyLnN0b3AoMSwxKSxwLmVmZmVjdC5jYWxsKHIsdGhpcyksci5xdWV1ZSgiZngiLGZ1bmN0aW9uKHQpe2woKSx0KCl9KSk6ci5mYWRlVG8oOTAsdD8xOjAsbCksdCYmcC50YXJnZXQudHJpZ2dlcigicXRpcC0iK3RoaXMuaWQrIi1pbmFjdGl2ZSIpLHRoaXMpKX0sai5zaG93PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRvZ2dsZShXLHQpfSxqLmhpZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudG9nZ2xlKGssdCl9LGouZm9jdXM9ZnVuY3Rpb24odCl7aWYoIXRoaXMucmVuZGVyZWR8fHRoaXMuZGVzdHJveWVkKXJldHVybiB0aGlzO3ZhciBlPXMoVSksaT10aGlzLnRvb2x0aXAsbz1wYXJzZUludChpWzBdLnN0eWxlLnpJbmRleCwxMCksbj1ULnppbmRleCtlLmxlbmd0aDtyZXR1cm4gaS5oYXNDbGFzcyhaKXx8dGhpcy5fdHJpZ2dlcigiZm9jdXMiLFtuXSx0KSYmKG8hPT1uJiYoZS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS56SW5kZXg+byYmKHRoaXMuc3R5bGUuekluZGV4PXRoaXMuc3R5bGUuekluZGV4LTEpfSksZS5maWx0ZXIoIi4iK1opLnF0aXAoImJsdXIiLHQpKSxpLmFkZENsYXNzKFopWzBdLnN0eWxlLnpJbmRleD1uKSx0aGlzfSxqLmJsdXI9ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMucmVuZGVyZWR8fHRoaXMuZGVzdHJveWVkP3RoaXM6KHRoaXMudG9vbHRpcC5yZW1vdmVDbGFzcyhaKSx0aGlzLl90cmlnZ2VyKCJibHVyIixbdGhpcy50b29sdGlwLmNzcygiekluZGV4IildLHQpLHRoaXMpfSxqLmRpc2FibGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGVzdHJveWVkP3RoaXM6KCJ0b2dnbGUiPT09dD90PSEodGhpcy5yZW5kZXJlZD90aGlzLnRvb2x0aXAuaGFzQ2xhc3MoZWUpOnRoaXMuZGlzYWJsZWQpOiJib29sZWFuIiE9dHlwZW9mIHQmJih0PVcpLHRoaXMucmVuZGVyZWQmJnRoaXMudG9vbHRpcC50b2dnbGVDbGFzcyhlZSx0KS5hdHRyKCJhcmlhLWRpc2FibGVkIix0KSx0aGlzLmRpc2FibGVkPSEhdCx0aGlzKX0sai5lbmFibGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNhYmxlKGspfSxqLl9jcmVhdGVCdXR0b249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5lbGVtZW50cyxpPWUudG9vbHRpcCxvPXRoaXMub3B0aW9ucy5jb250ZW50LmJ1dHRvbixuPSJzdHJpbmciPT10eXBlb2YgbyxyPW4/bzoiQ2xvc2UgdG9vbHRpcCI7ZS5idXR0b24mJmUuYnV0dG9uLnJlbW92ZSgpLGUuYnV0dG9uPW8uanF1ZXJ5P286cygiPGEgLz4iLHsiY2xhc3MiOiJxdGlwLWNsb3NlICIrKHRoaXMub3B0aW9ucy5zdHlsZS53aWRnZXQ/IiI6WCsiLWljb24iKSx0aXRsZTpyLCJhcmlhLWxhYmVsIjpyfSkucHJlcGVuZChzKCI8c3BhbiAvPiIseyJjbGFzcyI6InVpLWljb24gdWktaWNvbi1jbG9zZSIsaHRtbDoiJnRpbWVzOyJ9KSksZS5idXR0b24uYXBwZW5kVG8oZS50aXRsZWJhcnx8aSkuYXR0cigicm9sZSIsImJ1dHRvbiIpLmNsaWNrKGZ1bmN0aW9uKGUpe3JldHVybiBpLmhhc0NsYXNzKGVlKXx8dC5oaWRlKGUpLGt9KX0sai5fdXBkYXRlQnV0dG9uPWZ1bmN0aW9uKHQpe2lmKCF0aGlzLnJlbmRlcmVkKXJldHVybiBrO3ZhciBlPXRoaXMuZWxlbWVudHMuYnV0dG9uO3Q/dGhpcy5fY3JlYXRlQnV0dG9uKCk6ZS5yZW1vdmUoKX0sai5fc2V0V2lkZ2V0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLnN0eWxlLndpZGdldCxlPXRoaXMuZWxlbWVudHMsaT1lLnRvb2x0aXAscz1pLmhhc0NsYXNzKGVlKTtpLnJlbW92ZUNsYXNzKGVlKSxlZT10PyJ1aS1zdGF0ZS1kaXNhYmxlZCI6InF0aXAtZGlzYWJsZWQiLGkudG9nZ2xlQ2xhc3MoZWUscyksaS50b2dnbGVDbGFzcygidWktaGVscGVyLXJlc2V0ICIrYygpLHQpLnRvZ2dsZUNsYXNzKEssdGhpcy5vcHRpb25zLnN0eWxlLmRlZiYmIXQpLGUuY29udGVudCYmZS5jb250ZW50LnRvZ2dsZUNsYXNzKGMoImNvbnRlbnQiKSx0KSxlLnRpdGxlYmFyJiZlLnRpdGxlYmFyLnRvZ2dsZUNsYXNzKGMoImhlYWRlciIpLHQpLGUuYnV0dG9uJiZlLmJ1dHRvbi50b2dnbGVDbGFzcyhYKyItaWNvbiIsIXQpfSxqLl9zdG9yZU1vdXNlPWZ1bmN0aW9uKHQpeyh0aGlzLm1vdXNlPWQodCkpLnR5cGU9Im1vdXNlbW92ZSJ9LGouX2JpbmQ9ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcj0iLiIrdGhpcy5faWQrKG8/Ii0iK286IiIpO2UubGVuZ3RoJiZzKHQpLmJpbmQoKGUuc3BsaXQ/ZTplLmpvaW4ocisiICIpKStyLHMucHJveHkoaSxufHx0aGlzKSl9LGouX3VuYmluZD1mdW5jdGlvbih0LGUpe3ModCkudW5iaW5kKCIuIit0aGlzLl9pZCsoZT8iLSIrZToiIikpfTt2YXIgaGU9Ii4iK1g7cyhmdW5jdGlvbigpe3YoVSxbIm1vdXNlZW50ZXIiLCJtb3VzZWxlYXZlIl0sZnVuY3Rpb24odCl7dmFyIGU9Im1vdXNlZW50ZXIiPT09dC50eXBlLGk9cyh0LmN1cnJlbnRUYXJnZXQpLG89cyh0LnJlbGF0ZWRUYXJnZXR8fHQudGFyZ2V0KSxuPXRoaXMub3B0aW9ucztlPyh0aGlzLmZvY3VzKHQpLGkuaGFzQ2xhc3MoSikmJiFpLmhhc0NsYXNzKGVlKSYmY2xlYXJUaW1lb3V0KHRoaXMudGltZXJzLmhpZGUpKToibW91c2UiPT09bi5wb3NpdGlvbi50YXJnZXQmJm4uaGlkZS5ldmVudCYmbi5zaG93LnRhcmdldCYmIW8uY2xvc2VzdChuLnNob3cudGFyZ2V0WzBdKS5sZW5ndGgmJnRoaXMuaGlkZSh0KSxpLnRvZ2dsZUNsYXNzKHRlLGUpfSksdigiWyIrSCsiXSIsUSxnKX0pLGouX3RyaWdnZXI9ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXMuRXZlbnQoInRvb2x0aXAiK3QpO3JldHVybiBvLm9yaWdpbmFsRXZlbnQ9aSYmcy5leHRlbmQoe30saSl8fHRoaXMuY2FjaGUuZXZlbnR8fEUsdGhpcy50cmlnZ2VyaW5nPXQsdGhpcy50b29sdGlwLnRyaWdnZXIobyxbdGhpc10uY29uY2F0KGV8fFtdKSksdGhpcy50cmlnZ2VyaW5nPWssIW8uaXNEZWZhdWx0UHJldmVudGVkKCl9LGouX2JpbmRFdmVudHM9ZnVuY3Rpb24odCxlLG8sbixyLGEpe2lmKG4uYWRkKG8pLmxlbmd0aD09PW4ubGVuZ3RoKXt2YXIgaD1bXTtlPXMubWFwKGUsZnVuY3Rpb24oZSl7dmFyIG89cy5pbkFycmF5KGUsdCk7cmV0dXJuIG8+LTE/KGgucHVzaCh0LnNwbGljZShvLDEpWzBdKSxpKTplfSksaC5sZW5ndGgmJnRoaXMuX2JpbmQobyxoLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucmVuZGVyZWQ/dGhpcy50b29sdGlwWzBdLm9mZnNldFdpZHRoPjA6ITE7KGU/YTpyKS5jYWxsKHRoaXMsdCl9KX10aGlzLl9iaW5kKG8sdCxyKSx0aGlzLl9iaW5kKG4sZSxhKX0sai5fYXNzaWduSW5pdGlhbEV2ZW50cz1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3JldHVybiB0aGlzLmRpc2FibGVkfHx0aGlzLmRlc3Ryb3llZD9rOih0aGlzLmNhY2hlLmV2ZW50PWQodCksdGhpcy5jYWNoZS50YXJnZXQ9dD9zKHQudGFyZ2V0KTpbaV0sY2xlYXJUaW1lb3V0KHRoaXMudGltZXJzLnNob3cpLHRoaXMudGltZXJzLnNob3c9cC5jYWxsKHRoaXMsZnVuY3Rpb24oKXt0aGlzLnJlbmRlcigib2JqZWN0Ij09dHlwZW9mIHR8fG8uc2hvdy5yZWFkeSl9LG8uc2hvdy5kZWxheSksaSl9dmFyIG89dGhpcy5vcHRpb25zLG49by5zaG93LnRhcmdldCxyPW8uaGlkZS50YXJnZXQsYT1vLnNob3cuZXZlbnQ/cy50cmltKCIiK28uc2hvdy5ldmVudCkuc3BsaXQoIiAiKTpbXSxoPW8uaGlkZS5ldmVudD9zLnRyaW0oIiIrby5oaWRlLmV2ZW50KS5zcGxpdCgiICIpOltdOy9tb3VzZShvdmVyfGVudGVyKS9pLnRlc3Qoby5zaG93LmV2ZW50KSYmIS9tb3VzZShvdXR8bGVhdmUpL2kudGVzdChvLmhpZGUuZXZlbnQpJiZoLnB1c2goIm1vdXNlbGVhdmUiKSx0aGlzLl9iaW5kKG4sIm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7dGhpcy5fc3RvcmVNb3VzZSh0KSx0aGlzLmNhY2hlLm9uVGFyZ2V0PVd9KSx0aGlzLl9iaW5kRXZlbnRzKGEsaCxuLHIsZSxmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVycy5zaG93KX0pLChvLnNob3cucmVhZHl8fG8ucHJlcmVuZGVyKSYmZS5jYWxsKHRoaXMsdCl9LGouX2Fzc2lnbkV2ZW50cz1mdW5jdGlvbigpe3ZhciBpPXRoaXMsbz10aGlzLm9wdGlvbnMsbj1vLnBvc2l0aW9uLHI9dGhpcy50b29sdGlwLGE9by5zaG93LnRhcmdldCxoPW8uaGlkZS50YXJnZXQsbD1uLmNvbnRhaW5lcixjPW4udmlld3BvcnQsZD1zKGUpLHA9KHMoZS5ib2R5KSxzKHQpKSx2PW8uc2hvdy5ldmVudD9zLnRyaW0oIiIrby5zaG93LmV2ZW50KS5zcGxpdCgiICIpOltdLHk9by5oaWRlLmV2ZW50P3MudHJpbSgiIitvLmhpZGUuZXZlbnQpLnNwbGl0KCIgIik6W107cy5lYWNoKG8uZXZlbnRzLGZ1bmN0aW9uKHQsZSl7aS5fYmluZChyLCJ0b2dnbGUiPT09dD9bInRvb2x0aXBzaG93IiwidG9vbHRpcGhpZGUiXTpbInRvb2x0aXAiK3RdLGUsbnVsbCxyKX0pLC9tb3VzZShvdXR8bGVhdmUpL2kudGVzdChvLmhpZGUuZXZlbnQpJiYid2luZG93Ij09PW8uaGlkZS5sZWF2ZSYmdGhpcy5fYmluZChkLFsibW91c2VvdXQiLCJibHVyIl0sZnVuY3Rpb24odCl7L3NlbGVjdHxvcHRpb24vLnRlc3QodC50YXJnZXQubm9kZU5hbWUpfHx0LnJlbGF0ZWRUYXJnZXR8fHRoaXMuaGlkZSh0KX0pLG8uaGlkZS5maXhlZD9oPWguYWRkKHIuYWRkQ2xhc3MoSikpOi9tb3VzZShvdmVyfGVudGVyKS9pLnRlc3Qoby5zaG93LmV2ZW50KSYmdGhpcy5fYmluZChoLCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLnRpbWVycy5zaG93KX0pLCgiIitvLmhpZGUuZXZlbnQpLmluZGV4T2YoInVuZm9jdXMiKT4tMSYmdGhpcy5fYmluZChsLmNsb3Nlc3QoImh0bWwiKSxbIm1vdXNlZG93biIsInRvdWNoc3RhcnQiXSxmdW5jdGlvbih0KXt2YXIgZT1zKHQudGFyZ2V0KSxpPXRoaXMucmVuZGVyZWQmJiF0aGlzLnRvb2x0aXAuaGFzQ2xhc3MoZWUpJiZ0aGlzLnRvb2x0aXBbMF0ub2Zmc2V0V2lkdGg+MCxvPWUucGFyZW50cyhVKS5maWx0ZXIodGhpcy50b29sdGlwWzBdKS5sZW5ndGg+MDtlWzBdPT09dGhpcy50YXJnZXRbMF18fGVbMF09PT10aGlzLnRvb2x0aXBbMF18fG98fHRoaXMudGFyZ2V0LmhhcyhlWzBdKS5sZW5ndGh8fCFpfHx0aGlzLmhpZGUodCl9KSwibnVtYmVyIj09dHlwZW9mIG8uaGlkZS5pbmFjdGl2ZSYmKHRoaXMuX2JpbmQoYSwicXRpcC0iK3RoaXMuaWQrIi1pbmFjdGl2ZSIsZyksdGhpcy5fYmluZChoLmFkZChyKSxULmluYWN0aXZlRXZlbnRzLGcsIi1pbmFjdGl2ZSIpKSx0aGlzLl9iaW5kRXZlbnRzKHYseSxhLGgsdSxmKSx0aGlzLl9iaW5kKGEuYWRkKHIpLCJtb3VzZW1vdmUiLGZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiPT10eXBlb2Ygby5oaWRlLmRpc3RhbmNlKXt2YXIgZT10aGlzLmNhY2hlLm9yaWdpbnx8e30saT10aGlzLm9wdGlvbnMuaGlkZS5kaXN0YW5jZSxzPU1hdGguYWJzOyhzKHQucGFnZVgtZS5wYWdlWCk+PWl8fHModC5wYWdlWS1lLnBhZ2VZKT49aSkmJnRoaXMuaGlkZSh0KX10aGlzLl9zdG9yZU1vdXNlKHQpfSksIm1vdXNlIj09PW4udGFyZ2V0JiZuLmFkanVzdC5tb3VzZSYmKG8uaGlkZS5ldmVudCYmdGhpcy5fYmluZChhLFsibW91c2VlbnRlciIsIm1vdXNlbGVhdmUiXSxmdW5jdGlvbih0KXt0aGlzLmNhY2hlLm9uVGFyZ2V0PSJtb3VzZWVudGVyIj09PXQudHlwZX0pLHRoaXMuX2JpbmQoZCwibW91c2Vtb3ZlIixmdW5jdGlvbih0KXt0aGlzLnJlbmRlcmVkJiZ0aGlzLmNhY2hlLm9uVGFyZ2V0JiYhdGhpcy50b29sdGlwLmhhc0NsYXNzKGVlKSYmdGhpcy50b29sdGlwWzBdLm9mZnNldFdpZHRoPjAmJnRoaXMucmVwb3NpdGlvbih0KX0pKSwobi5hZGp1c3QucmVzaXplfHxjLmxlbmd0aCkmJnRoaXMuX2JpbmQocy5ldmVudC5zcGVjaWFsLnJlc2l6ZT9jOnAsInJlc2l6ZSIsbSksbi5hZGp1c3Quc2Nyb2xsJiZ0aGlzLl9iaW5kKHAuYWRkKG4uY29udGFpbmVyKSwic2Nyb2xsIixtKX0sai5fdW5hc3NpZ25FdmVudHM9ZnVuY3Rpb24oKXt2YXIgaT1bdGhpcy5vcHRpb25zLnNob3cudGFyZ2V0WzBdLHRoaXMub3B0aW9ucy5oaWRlLnRhcmdldFswXSx0aGlzLnJlbmRlcmVkJiZ0aGlzLnRvb2x0aXBbMF0sdGhpcy5vcHRpb25zLnBvc2l0aW9uLmNvbnRhaW5lclswXSx0aGlzLm9wdGlvbnMucG9zaXRpb24udmlld3BvcnRbMF0sdGhpcy5vcHRpb25zLnBvc2l0aW9uLmNvbnRhaW5lci5jbG9zZXN0KCJodG1sIilbMF0sdCxlXTt0aGlzLl91bmJpbmQocyhbXSkucHVzaFN0YWNrKHMuZ3JlcChpLGZ1bmN0aW9uKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdH0pKSl9LFQ9cy5mbi5xdGlwPWZ1bmN0aW9uKHQsZSxvKXt2YXIgbj0oIiIrdCkudG9Mb3dlckNhc2UoKSxyPUUsaD1zLm1ha2VBcnJheShhcmd1bWVudHMpLnNsaWNlKDEpLGw9aFtoLmxlbmd0aC0xXSxjPXRoaXNbMF0/cy5kYXRhKHRoaXNbMF0sWCk6RTtyZXR1cm4hYXJndW1lbnRzLmxlbmd0aCYmY3x8ImFwaSI9PT1uP2M6InN0cmluZyI9PXR5cGVvZiB0Pyh0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1zLmRhdGEodGhpcyxYKTtpZighdClyZXR1cm4gVztpZihsJiZsLnRpbWVTdGFtcCYmKHQuY2FjaGUuZXZlbnQ9bCksIWV8fCJvcHRpb24iIT09biYmIm9wdGlvbnMiIT09bil0W25dJiZ0W25dLmFwcGx5KHQsaCk7ZWxzZXtpZihvPT09aSYmIXMuaXNQbGFpbk9iamVjdChlKSlyZXR1cm4gcj10LmdldChlKSxrO3Quc2V0KGUsbyl9fSksciE9PUU/cjp0aGlzKToib2JqZWN0IiE9dHlwZW9mIHQmJmFyZ3VtZW50cy5sZW5ndGg/aTooYz1hKHMuZXh0ZW5kKFcse30sdCkpLHRoaXMuZWFjaChmdW5jdGlvbih0KXt2YXIgZSxvO3JldHVybiBvPXMuaXNBcnJheShjLmlkKT9jLmlkW3RdOmMuaWQsbz0hb3x8bz09PWt8fDE+by5sZW5ndGh8fFQuYXBpW29dP1QubmV4dGlkKys6byxlPXkocyh0aGlzKSxvLGMpLGU9PT1rP1c6KFQuYXBpW29dPWUscy5lYWNoKFIsZnVuY3Rpb24oKXsiaW5pdGlhbGl6ZSI9PT10aGlzLmluaXRpYWxpemUmJnRoaXMoZSl9KSxlLl9hc3NpZ25Jbml0aWFsRXZlbnRzKGwpLGkpfSkpfSxzLnF0aXA9byxULmFwaT17fSxzLmVhY2goe2F0dHI6ZnVuY3Rpb24odCxlKXtpZih0aGlzLmxlbmd0aCl7dmFyIGk9dGhpc1swXSxvPSJ0aXRsZSIsbj1zLmRhdGEoaSwicXRpcCIpO2lmKHQ9PT1vJiZuJiYib2JqZWN0Ij09dHlwZW9mIG4mJm4ub3B0aW9ucy5zdXBwcmVzcylyZXR1cm4gMj5hcmd1bWVudHMubGVuZ3RoP3MuYXR0cihpLHNlKToobiYmbi5vcHRpb25zLmNvbnRlbnQuYXR0cj09PW8mJm4uY2FjaGUuYXR0ciYmbi5zZXQoImNvbnRlbnQudGV4dCIsZSksdGhpcy5hdHRyKHNlLGUpKX1yZXR1cm4gcy5mblsiYXR0ciIraWVdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sY2xvbmU6ZnVuY3Rpb24odCl7dmFyIGU9KHMoW10pLHMuZm5bImNsb25lIitpZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpKTtyZXR1cm4gdHx8ZS5maWx0ZXIoIlsiK3NlKyJdIikuYXR0cigidGl0bGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHMuYXR0cih0aGlzLHNlKX0pLnJlbW92ZUF0dHIoc2UpLGV9fSxmdW5jdGlvbih0LGUpe2lmKCFlfHxzLmZuW3QraWVdKXJldHVybiBXO3ZhciBpPXMuZm5bdCtpZV09cy5mblt0XTtzLmZuW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KSxzLnVpfHwoc1siY2xlYW5EYXRhIitpZV09cy5jbGVhbkRhdGEscy5jbGVhbkRhdGE9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9MDsoZT1zKHRbaV0pKS5sZW5ndGg7aSsrKWlmKGUuYXR0cihZKSl0cnl7ZS50cmlnZ2VySGFuZGxlcigicmVtb3ZlcXRpcCIpfWNhdGNoKG8pe31zWyJjbGVhbkRhdGEiK2llXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9KSxULnZlcnNpb249IjIuMi4wIixULm5leHRpZD0wLFQuaW5hY3RpdmVFdmVudHM9USxULnppbmRleD0xNWUzLFQuZGVmYXVsdHM9e3ByZXJlbmRlcjprLGlkOmssb3ZlcndyaXRlOlcsc3VwcHJlc3M6Vyxjb250ZW50Ont0ZXh0OlcsYXR0cjoidGl0bGUiLHRpdGxlOmssYnV0dG9uOmt9LHBvc2l0aW9uOntteToidG9wIGxlZnQiLGF0OiJib3R0b20gcmlnaHQiLHRhcmdldDprLGNvbnRhaW5lcjprLHZpZXdwb3J0OmssYWRqdXN0Ont4OjAseTowLG1vdXNlOlcsc2Nyb2xsOlcscmVzaXplOlcsbWV0aG9kOiJmbGlwaW52ZXJ0IGZsaXBpbnZlcnQifSxlZmZlY3Q6ZnVuY3Rpb24odCxlKXtzKHRoaXMpLmFuaW1hdGUoZSx7ZHVyYXRpb246MjAwLHF1ZXVlOmt9KX19LHNob3c6e3RhcmdldDprLGV2ZW50OiJtb3VzZWVudGVyIixlZmZlY3Q6VyxkZWxheTo5MCxzb2xvOmsscmVhZHk6ayxhdXRvZm9jdXM6a30saGlkZTp7dGFyZ2V0OmssZXZlbnQ6Im1vdXNlbGVhdmUiLGVmZmVjdDpXLGRlbGF5OjAsZml4ZWQ6ayxpbmFjdGl2ZTprLGxlYXZlOiJ3aW5kb3ciLGRpc3RhbmNlOmt9LHN0eWxlOntjbGFzc2VzOiIiLHdpZGdldDprLHdpZHRoOmssaGVpZ2h0OmssZGVmOld9LGV2ZW50czp7cmVuZGVyOkUsbW92ZTpFLHNob3c6RSxoaWRlOkUsdG9nZ2xlOkUsdmlzaWJsZTpFLGhpZGRlbjpFLGZvY3VzOkUsYmx1cjpFfX07dmFyIGxlLGNlPSJtYXJnaW4iLGRlPSJib3JkZXIiLHBlPSJjb2xvciIsdWU9ImJhY2tncm91bmQtY29sb3IiLGZlPSJ0cmFuc3BhcmVudCIsZ2U9IiAhaW1wb3J0YW50IixtZT0hIWUuY3JlYXRlRWxlbWVudCgiY2FudmFzIikuZ2V0Q29udGV4dCx2ZT0vcmdiYT9cKDAsIDAsIDAoLCAwKT9cKXx0cmFuc3BhcmVudHwjMTIzNDU2L2kseWU9e30sYmU9WyJXZWJraXQiLCJPIiwiTW96IiwibXMiXTtpZihtZSl2YXIgd2U9dC5kZXZpY2VQaXhlbFJhdGlvfHwxLF9lPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jcmVhdGVFbGVtZW50KCJjYW52YXMiKS5nZXRDb250ZXh0KCIyZCIpO3JldHVybiB0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQud2Via2l0QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dC5tb3pCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1zQmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8dC5vQmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MX0oKSx4ZT13ZS9fZTtlbHNlIHZhciBxZT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIjxxdGlwdm1sOiIrdCsnIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQuY29tOnZtbCIgY2xhc3M9InF0aXAtdm1sIiAnKyhlfHwiIikrJyBzdHlsZT0iYmVoYXZpb3I6IHVybCgjZGVmYXVsdCNWTUwpOyAnKyhpfHwiIikrJyIgLz4nfTtzLmV4dGVuZCh4LnByb3RvdHlwZSx7aW5pdDpmdW5jdGlvbih0KXt2YXIgZSxpO2k9dGhpcy5lbGVtZW50PXQuZWxlbWVudHMudGlwPXMoIjxkaXYgLz4iLHsiY2xhc3MiOlgrIi10aXAifSkucHJlcGVuZFRvKHQudG9vbHRpcCksbWU/KGU9cygiPGNhbnZhcyAvPiIpLmFwcGVuZFRvKHRoaXMuZWxlbWVudClbMF0uZ2V0Q29udGV4dCgiMmQiKSxlLmxpbmVKb2luPSJtaXRlciIsZS5taXRlckxpbWl0PTFlNSxlLnNhdmUoKSk6KGU9cWUoInNoYXBlIiwnY29vcmRvcmlnaW49IjAsMCInLCJwb3NpdGlvbjphYnNvbHV0ZTsiKSx0aGlzLmVsZW1lbnQuaHRtbChlK2UpLHQuX2JpbmQocygiKiIsaSkuYWRkKGkpLFsiY2xpY2siLCJtb3VzZWRvd24iXSxmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfSx0aGlzLl9ucykpLHQuX2JpbmQodC50b29sdGlwLCJ0b29sdGlwbW92ZSIsdGhpcy5yZXBvc2l0aW9uLHRoaXMuX25zLHRoaXMpLHRoaXMuY3JlYXRlKCl9LF9zd2FwRGltZW5zaW9uczpmdW5jdGlvbigpe3RoaXMuc2l6ZVswXT10aGlzLm9wdGlvbnMuaGVpZ2h0LHRoaXMuc2l6ZVsxXT10aGlzLm9wdGlvbnMud2lkdGh9LF9yZXNldERpbWVuc2lvbnM6ZnVuY3Rpb24oKXt0aGlzLnNpemVbMF09dGhpcy5vcHRpb25zLndpZHRoLHRoaXMuc2l6ZVsxXT10aGlzLm9wdGlvbnMuaGVpZ2h0fSxfdXNlVGl0bGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5xdGlwLmVsZW1lbnRzLnRpdGxlYmFyO3JldHVybiBlJiYodC55PT09RHx8dC55PT09TiYmdGhpcy5lbGVtZW50LnBvc2l0aW9uKCkudG9wK3RoaXMuc2l6ZVsxXS8yK3RoaXMub3B0aW9ucy5vZmZzZXQ8ZS5vdXRlckhlaWdodChXKSl9LF9wYXJzZUNvcm5lcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnF0aXAub3B0aW9ucy5wb3NpdGlvbi5teTtyZXR1cm4gdD09PWt8fGU9PT1rP3Q9azp0PT09Vz90PW5ldyB6KGUuc3RyaW5nKCkpOnQuc3RyaW5nfHwodD1uZXcgeih0KSx0LmZpeGVkPVcpLHR9LF9wYXJzZVdpZHRoOmZ1bmN0aW9uKHQsZSxpKXt2YXIgcz10aGlzLnF0aXAuZWxlbWVudHMsbz1kZStiKGUpKyJXaWR0aCI7cmV0dXJuKGk/XyhpLG8pOl8ocy5jb250ZW50LG8pfHxfKHRoaXMuX3VzZVRpdGxlKHQpJiZzLnRpdGxlYmFyfHxzLmNvbnRlbnQsbyl8fF8ocy50b29sdGlwLG8pKXx8MH0sX3BhcnNlUmFkaXVzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucXRpcC5lbGVtZW50cyxpPWRlK2IodC55KStiKHQueCkrIlJhZGl1cyI7cmV0dXJuIDk+b2UuaWU/MDpfKHRoaXMuX3VzZVRpdGxlKHQpJiZlLnRpdGxlYmFyfHxlLmNvbnRlbnQsaSl8fF8oZS50b29sdGlwLGkpfHwwfSxfaW52YWxpZENvbG91cjpmdW5jdGlvbih0LGUsaSl7dmFyIHM9dC5jc3MoZSk7cmV0dXJuIXN8fGkmJnM9PT10LmNzcyhpKXx8dmUudGVzdChzKT9rOnN9LF9wYXJzZUNvbG91cnM6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5xdGlwLmVsZW1lbnRzLGk9dGhpcy5lbGVtZW50LmNzcygiY3NzVGV4dCIsIiIpLG89ZGUrYih0W3QucHJlY2VkYW5jZV0pK2IocGUpLG49dGhpcy5fdXNlVGl0bGUodCkmJmUudGl0bGViYXJ8fGUuY29udGVudCxyPXRoaXMuX2ludmFsaWRDb2xvdXIsYT1bXTtyZXR1cm4gYVswXT1yKGksdWUpfHxyKG4sdWUpfHxyKGUuY29udGVudCx1ZSl8fHIoZS50b29sdGlwLHVlKXx8aS5jc3ModWUpLGFbMV09cihpLG8scGUpfHxyKG4sbyxwZSl8fHIoZS5jb250ZW50LG8scGUpfHxyKGUudG9vbHRpcCxvLHBlKXx8ZS50b29sdGlwLmNzcyhvKSxzKCIqIixpKS5hZGQoaSkuY3NzKCJjc3NUZXh0Iix1ZSsiOiIrZmUrZ2UrIjsiK2RlKyI6MCIrZ2UrIjsiKSxhfSxfY2FsY3VsYXRlU2l6ZTpmdW5jdGlvbih0KXt2YXIgZSxpLHMsbz10LnByZWNlZGFuY2U9PT1MLG49dGhpcy5vcHRpb25zLndpZHRoLHI9dGhpcy5vcHRpb25zLmhlaWdodCxhPSJjIj09PXQuYWJicmV2KCksaD0obz9uOnIpKihhPy41OjEpLGw9TWF0aC5wb3csYz1NYXRoLnJvdW5kLGQ9TWF0aC5zcXJ0KGwoaCwyKStsKHIsMikpLHA9W3RoaXMuYm9yZGVyL2gqZCx0aGlzLmJvcmRlci9yKmRdO3JldHVybiBwWzJdPU1hdGguc3FydChsKHBbMF0sMiktbCh0aGlzLmJvcmRlciwyKSkscFszXT1NYXRoLnNxcnQobChwWzFdLDIpLWwodGhpcy5ib3JkZXIsMikpLGU9ZCtwWzJdK3BbM10rKGE/MDpwWzBdKSxpPWUvZCxzPVtjKGkqbiksYyhpKnIpXSxvP3M6cy5yZXZlcnNlKCl9LF9jYWxjdWxhdGVUaXA6ZnVuY3Rpb24odCxlLGkpe2k9aXx8MSxlPWV8fHRoaXMuc2l6ZTt2YXIgcz1lWzBdKmksbz1lWzFdKmksbj1NYXRoLmNlaWwocy8yKSxyPU1hdGguY2VpbChvLzIpLGE9e2JyOlswLDAscyxvLHMsMF0sYmw6WzAsMCxzLDAsMCxvXSx0cjpbMCxvLHMsMCxzLG9dLHRsOlswLDAsMCxvLHMsb10sdGM6WzAsbyxuLDAscyxvXSxiYzpbMCwwLHMsMCxuLG9dLHJjOlswLDAscyxyLDAsb10sbGM6W3MsMCxzLG8sMCxyXX07cmV0dXJuIGEubHQ9YS5icixhLnJ0PWEuYmwsYS5sYj1hLnRyLGEucmI9YS50bCxhW3QuYWJicmV2KCldfSxfZHJhd0Nvb3JkczpmdW5jdGlvbih0LGUpe3QuYmVnaW5QYXRoKCksdC5tb3ZlVG8oZVswXSxlWzFdKSx0LmxpbmVUbyhlWzJdLGVbM10pLHQubGluZVRvKGVbNF0sZVs1XSksdC5jbG9zZVBhdGgoKX0sY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb3JuZXI9KG1lfHxvZS5pZSkmJnRoaXMuX3BhcnNlQ29ybmVyKHRoaXMub3B0aW9ucy5jb3JuZXIpO3JldHVybih0aGlzLmVuYWJsZWQ9ISF0aGlzLmNvcm5lciYmImMiIT09dGhpcy5jb3JuZXIuYWJicmV2KCkpJiYodGhpcy5xdGlwLmNhY2hlLmNvcm5lcj10LmNsb25lKCksdGhpcy51cGRhdGUoKSksdGhpcy5lbGVtZW50LnRvZ2dsZSh0aGlzLmVuYWJsZWQpLHRoaXMuY29ybmVyfSx1cGRhdGU6ZnVuY3Rpb24oZSxpKXtpZighdGhpcy5lbmFibGVkKXJldHVybiB0aGlzO3ZhciBvLG4scixhLGgsbCxjLGQscD10aGlzLnF0aXAuZWxlbWVudHMsdT10aGlzLmVsZW1lbnQsZj11LmNoaWxkcmVuKCksZz10aGlzLm9wdGlvbnMsbT10aGlzLnNpemUsdj1nLm1pbWljLHk9TWF0aC5yb3VuZDtlfHwoZT10aGlzLnF0aXAuY2FjaGUuY29ybmVyfHx0aGlzLmNvcm5lciksdj09PWs/dj1lOih2PW5ldyB6KHYpLHYucHJlY2VkYW5jZT1lLnByZWNlZGFuY2UsImluaGVyaXQiPT09di54P3YueD1lLng6ImluaGVyaXQiPT09di55P3YueT1lLnk6di54PT09di55JiYodltlLnByZWNlZGFuY2VdPWVbZS5wcmVjZWRhbmNlXSkpLG49di5wcmVjZWRhbmNlLGUucHJlY2VkYW5jZT09PVM/dGhpcy5fc3dhcERpbWVuc2lvbnMoKTp0aGlzLl9yZXNldERpbWVuc2lvbnMoKSxvPXRoaXMuY29sb3I9dGhpcy5fcGFyc2VDb2xvdXJzKGUpLG9bMV0hPT1mZT8oZD10aGlzLmJvcmRlcj10aGlzLl9wYXJzZVdpZHRoKGUsZVtlLnByZWNlZGFuY2VdKSxnLmJvcmRlciYmMT5kJiYhdmUudGVzdChvWzFdKSYmKG9bMF09b1sxXSksdGhpcy5ib3JkZXI9ZD1nLmJvcmRlciE9PVc/Zy5ib3JkZXI6ZCk6dGhpcy5ib3JkZXI9ZD0wLGM9dGhpcy5zaXplPXRoaXMuX2NhbGN1bGF0ZVNpemUoZSksdS5jc3Moe3dpZHRoOmNbMF0saGVpZ2h0OmNbMV0sbGluZUhlaWdodDpjWzFdKyJweCJ9KSxsPWUucHJlY2VkYW5jZT09PUw/W3kodi54PT09Rj9kOnYueD09PVA/Y1swXS1tWzBdLWQ6KGNbMF0tbVswXSkvMikseSh2Lnk9PT1EP2NbMV0tbVsxXTowKV06W3kodi54PT09Rj9jWzBdLW1bMF06MCkseSh2Lnk9PT1EP2Q6di55PT09Tz9jWzFdLW1bMV0tZDooY1sxXS1tWzFdKS8yKV0sbWU/KHI9ZlswXS5nZXRDb250ZXh0KCIyZCIpLHIucmVzdG9yZSgpLHIuc2F2ZSgpLHIuY2xlYXJSZWN0KDAsMCw2ZTMsNmUzKSxhPXRoaXMuX2NhbGN1bGF0ZVRpcCh2LG0seGUpLGg9dGhpcy5fY2FsY3VsYXRlVGlwKHYsdGhpcy5zaXplLHhlKSxmLmF0dHIoQSxjWzBdKnhlKS5hdHRyKEIsY1sxXSp4ZSksZi5jc3MoQSxjWzBdKS5jc3MoQixjWzFdKSx0aGlzLl9kcmF3Q29vcmRzKHIsaCksci5maWxsU3R5bGU9b1sxXSxyLmZpbGwoKSxyLnRyYW5zbGF0ZShsWzBdKnhlLGxbMV0qeGUpLHRoaXMuX2RyYXdDb29yZHMocixhKSxyLmZpbGxTdHlsZT1vWzBdLHIuZmlsbCgpKTooYT10aGlzLl9jYWxjdWxhdGVUaXAodiksYT0ibSIrYVswXSsiLCIrYVsxXSsiIGwiK2FbMl0rIiwiK2FbM10rIiAiK2FbNF0rIiwiK2FbNV0rIiB4ZSIsbFsyXT1kJiYvXihyfGIpL2kudGVzdChlLnN0cmluZygpKT84PT09b2UuaWU/MjoxOjAsZi5jc3Moe2Nvb3Jkc2l6ZTpjWzBdK2QrIiAiKyhjWzFdK2QpLGFudGlhbGlhczoiIisodi5zdHJpbmcoKS5pbmRleE9mKE4pPi0xKSxsZWZ0OmxbMF0tbFsyXSpOdW1iZXIobj09PVMpLHRvcDpsWzFdLWxbMl0qTnVtYmVyKG49PT1MKSx3aWR0aDpjWzBdK2QsaGVpZ2h0OmNbMV0rZH0pLmVhY2goZnVuY3Rpb24odCl7dmFyIGU9cyh0aGlzKTtlW2UucHJvcD8icHJvcCI6ImF0dHIiXSh7Y29vcmRzaXplOmNbMF0rZCsiICIrKGNbMV0rZCkscGF0aDphLGZpbGxjb2xvcjpvWzBdLGZpbGxlZDohIXQsc3Ryb2tlZDohdH0pLnRvZ2dsZSghKCFkJiYhdCkpLCF0JiZlLmh0bWwocWUoInN0cm9rZSIsJ3dlaWdodD0iJysyKmQrJ3B4IiBjb2xvcj0iJytvWzFdKyciIG1pdGVybGltaXQ9IjEwMDAiIGpvaW5zdHlsZT0ibWl0ZXIiJykpfSkpLHQub3BlcmEmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtwLnRpcC5jc3Moe2Rpc3BsYXk6ImlubGluZS1ibG9jayIsdmlzaWJpbGl0eToidmlzaWJsZSJ9KX0sMSksaSE9PWsmJnRoaXMuY2FsY3VsYXRlKGUsYyl9LGNhbGN1bGF0ZTpmdW5jdGlvbih0LGUpe2lmKCF0aGlzLmVuYWJsZWQpcmV0dXJuIGs7dmFyIGksbyxuPXRoaXMscj10aGlzLnF0aXAuZWxlbWVudHMsYT10aGlzLmVsZW1lbnQsaD10aGlzLm9wdGlvbnMub2Zmc2V0LGw9KHIudG9vbHRpcC5oYXNDbGFzcygidWktd2lkZ2V0Iikse30pO3JldHVybiB0PXR8fHRoaXMuY29ybmVyLGk9dC5wcmVjZWRhbmNlLGU9ZXx8dGhpcy5fY2FsY3VsYXRlU2l6ZSh0KSxvPVt0LngsdC55XSxpPT09UyYmby5yZXZlcnNlKCkscy5lYWNoKG8sZnVuY3Rpb24ocyxvKXt2YXIgYSxjLGQ7bz09PU4/KGE9aT09PUw/RjpELGxbYV09IjUwJSIsbFtjZSsiLSIrYV09LU1hdGgucm91bmQoZVtpPT09TD8wOjFdLzIpK2gpOihhPW4uX3BhcnNlV2lkdGgodCxvLHIudG9vbHRpcCksYz1uLl9wYXJzZVdpZHRoKHQsbyxyLmNvbnRlbnQpLGQ9bi5fcGFyc2VSYWRpdXModCksbFtvXT1NYXRoLm1heCgtbi5ib3JkZXIscz9jOmgrKGQ+YT9kOi1hKSkpCn0pLGxbdFtpXV0tPWVbaT09PVM/MDoxXSxhLmNzcyh7bWFyZ2luOiIiLHRvcDoiIixib3R0b206IiIsbGVmdDoiIixyaWdodDoiIn0pLmNzcyhsKSxsfSxyZXBvc2l0aW9uOmZ1bmN0aW9uKHQsZSxzKXtmdW5jdGlvbiBvKHQsZSxpLHMsbyl7dD09PVYmJmwucHJlY2VkYW5jZT09PWUmJmNbc10mJmxbaV0hPT1OP2wucHJlY2VkYW5jZT1sLnByZWNlZGFuY2U9PT1TP0w6Uzp0IT09ViYmY1tzXSYmKGxbZV09bFtlXT09PU4/Y1tzXT4wP3M6bzpsW2VdPT09cz9vOnMpfWZ1bmN0aW9uIG4odCxlLG8pe2xbdF09PT1OP2dbY2UrIi0iK2VdPWZbdF09cltjZSsiLSIrZV0tY1tlXTooYT1yW29dIT09aT9bY1tlXSwtcltlXV06Wy1jW2VdLHJbZV1dLChmW3RdPU1hdGgubWF4KGFbMF0sYVsxXSkpPmFbMF0mJihzW2VdLT1jW2VdLGZbZV09ayksZ1tyW29dIT09aT9vOmVdPWZbdF0pfWlmKHRoaXMuZW5hYmxlZCl7dmFyIHIsYSxoPWUuY2FjaGUsbD10aGlzLmNvcm5lci5jbG9uZSgpLGM9cy5hZGp1c3RlZCxkPWUub3B0aW9ucy5wb3NpdGlvbi5hZGp1c3QubWV0aG9kLnNwbGl0KCIgIikscD1kWzBdLHU9ZFsxXXx8ZFswXSxmPXtsZWZ0OmssdG9wOmsseDowLHk6MH0sZz17fTt0aGlzLmNvcm5lci5maXhlZCE9PVcmJihvKHAsUyxMLEYsUCksbyh1LEwsUyxELE8pLGwuc3RyaW5nKCk9PT1oLmNvcm5lci5zdHJpbmcoKXx8aC5jb3JuZXJUb3A9PT1jLnRvcCYmaC5jb3JuZXJMZWZ0PT09Yy5sZWZ0fHx0aGlzLnVwZGF0ZShsLGspKSxyPXRoaXMuY2FsY3VsYXRlKGwpLHIucmlnaHQhPT1pJiYoci5sZWZ0PS1yLnJpZ2h0KSxyLmJvdHRvbSE9PWkmJihyLnRvcD0tci5ib3R0b20pLHIudXNlcj10aGlzLm9mZnNldCwoZi5sZWZ0PXA9PT1WJiYhIWMubGVmdCkmJm4oUyxGLFApLChmLnRvcD11PT09ViYmISFjLnRvcCkmJm4oTCxELE8pLHRoaXMuZWxlbWVudC5jc3MoZykudG9nZ2xlKCEoZi54JiZmLnl8fGwueD09PU4mJmYueXx8bC55PT09TiYmZi54KSkscy5sZWZ0LT1yLmxlZnQuY2hhckF0P3IudXNlcjpwIT09Vnx8Zi50b3B8fCFmLmxlZnQmJiFmLnRvcD9yLmxlZnQrdGhpcy5ib3JkZXI6MCxzLnRvcC09ci50b3AuY2hhckF0P3IudXNlcjp1IT09Vnx8Zi5sZWZ0fHwhZi5sZWZ0JiYhZi50b3A/ci50b3ArdGhpcy5ib3JkZXI6MCxoLmNvcm5lckxlZnQ9Yy5sZWZ0LGguY29ybmVyVG9wPWMudG9wLGguY29ybmVyPWwuY2xvbmUoKX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnF0aXAuX3VuYmluZCh0aGlzLnF0aXAudG9vbHRpcCx0aGlzLl9ucyksdGhpcy5xdGlwLmVsZW1lbnRzLnRpcCYmdGhpcy5xdGlwLmVsZW1lbnRzLnRpcC5maW5kKCIqIikucmVtb3ZlKCkuZW5kKCkucmVtb3ZlKCl9fSksbGU9Ui50aXA9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB4KHQsdC5vcHRpb25zLnN0eWxlLnRpcCl9LGxlLmluaXRpYWxpemU9InJlbmRlciIsbGUuc2FuaXRpemU9ZnVuY3Rpb24odCl7aWYodC5zdHlsZSYmInRpcCJpbiB0LnN0eWxlKXt2YXIgZT10LnN0eWxlLnRpcDsib2JqZWN0IiE9dHlwZW9mIGUmJihlPXQuc3R5bGUudGlwPXtjb3JuZXI6ZX0pLC9zdHJpbmd8Ym9vbGVhbi9pLnRlc3QodHlwZW9mIGUuY29ybmVyKXx8KGUuY29ybmVyPVcpfX0sTS50aXA9eyJecG9zaXRpb24ubXl8c3R5bGUudGlwLihjb3JuZXJ8bWltaWN8Ym9yZGVyKSQiOmZ1bmN0aW9uKCl7dGhpcy5jcmVhdGUoKSx0aGlzLnF0aXAucmVwb3NpdGlvbigpfSwiXnN0eWxlLnRpcC4oaGVpZ2h0fHdpZHRoKSQiOmZ1bmN0aW9uKHQpe3RoaXMuc2l6ZT1bdC53aWR0aCx0LmhlaWdodF0sdGhpcy51cGRhdGUoKSx0aGlzLnF0aXAucmVwb3NpdGlvbigpfSwiXmNvbnRlbnQudGl0bGV8c3R5bGUuKGNsYXNzZXN8d2lkZ2V0KSQiOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGUoKX19LHMuZXh0ZW5kKFcsVC5kZWZhdWx0cyx7c3R5bGU6e3RpcDp7Y29ybmVyOlcsbWltaWM6ayx3aWR0aDo2LGhlaWdodDo2LGJvcmRlcjpXLG9mZnNldDowfX19KTt2YXIgQ2UsVGUsamU9InF0aXAtbW9kYWwiLHplPSIuIitqZTtUZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7aWYocy5leHByWyI6Il0uZm9jdXNhYmxlKXJldHVybiBzLmV4cHJbIjoiXS5mb2N1c2FibGU7dmFyIGUsaSxvLG49IWlzTmFOKHMuYXR0cih0LCJ0YWJpbmRleCIpKSxyPXQubm9kZU5hbWUmJnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iYXJlYSI9PT1yPyhlPXQucGFyZW50Tm9kZSxpPWUubmFtZSx0LmhyZWYmJmkmJiJtYXAiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPyhvPXMoImltZ1t1c2VtYXA9IyIraSsiXSIpWzBdLCEhbyYmby5pcygiOnZpc2libGUiKSk6ITEpOi9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdC8udGVzdChyKT8hdC5kaXNhYmxlZDoiYSI9PT1yP3QuaHJlZnx8bjpufWZ1bmN0aW9uIGkodCl7MT5jLmxlbmd0aCYmdC5sZW5ndGg/dC5ub3QoImJvZHkiKS5ibHVyKCk6Yy5maXJzdCgpLmZvY3VzKCl9ZnVuY3Rpb24gbyh0KXtpZihoLmlzKCI6dmlzaWJsZSIpKXt2YXIgZSxvPXModC50YXJnZXQpLGE9bi50b29sdGlwLGw9by5jbG9zZXN0KFUpO2U9MT5sLmxlbmd0aD9rOnBhcnNlSW50KGxbMF0uc3R5bGUuekluZGV4LDEwKT5wYXJzZUludChhWzBdLnN0eWxlLnpJbmRleCwxMCksZXx8by5jbG9zZXN0KFUpWzBdPT09YVswXXx8aShvKSxyPXQudGFyZ2V0PT09Y1tjLmxlbmd0aC0xXX19dmFyIG4scixhLGgsbD10aGlzLGM9e307cy5leHRlbmQobCx7aW5pdDpmdW5jdGlvbigpe3JldHVybiBoPWwuZWxlbT1zKCI8ZGl2IC8+Iix7aWQ6InF0aXAtb3ZlcmxheSIsaHRtbDoiPGRpdj48L2Rpdj4iLG1vdXNlZG93bjpmdW5jdGlvbigpe3JldHVybiBrfX0pLmhpZGUoKSxzKGUuYm9keSkuYmluZCgiZm9jdXNpbiIremUsbykscyhlKS5iaW5kKCJrZXlkb3duIit6ZSxmdW5jdGlvbih0KXtuJiZuLm9wdGlvbnMuc2hvdy5tb2RhbC5lc2NhcGUmJjI3PT09dC5rZXlDb2RlJiZuLmhpZGUodCl9KSxoLmJpbmQoImNsaWNrIit6ZSxmdW5jdGlvbih0KXtuJiZuLm9wdGlvbnMuc2hvdy5tb2RhbC5ibHVyJiZuLmhpZGUodCl9KSxsfSx1cGRhdGU6ZnVuY3Rpb24oZSl7bj1lLGM9ZS5vcHRpb25zLnNob3cubW9kYWwuc3RlYWxmb2N1cyE9PWs/ZS50b29sdGlwLmZpbmQoIioiKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdCh0aGlzKX0pOltdfSx0b2dnbGU6ZnVuY3Rpb24odCxvLHIpe3ZhciBjPShzKGUuYm9keSksdC50b29sdGlwKSxkPXQub3B0aW9ucy5zaG93Lm1vZGFsLHA9ZC5lZmZlY3QsdT1vPyJzaG93IjoiaGlkZSIsZj1oLmlzKCI6dmlzaWJsZSIpLGc9cyh6ZSkuZmlsdGVyKCI6dmlzaWJsZTpub3QoOmFuaW1hdGVkKSIpLm5vdChjKTtyZXR1cm4gbC51cGRhdGUodCksbyYmZC5zdGVhbGZvY3VzIT09ayYmaShzKCI6Zm9jdXMiKSksaC50b2dnbGVDbGFzcygiYmx1cnMiLGQuYmx1ciksbyYmaC5hcHBlbmRUbyhlLmJvZHkpLGguaXMoIjphbmltYXRlZCIpJiZmPT09byYmYSE9PWt8fCFvJiZnLmxlbmd0aD9sOihoLnN0b3AoVyxrKSxzLmlzRnVuY3Rpb24ocCk/cC5jYWxsKGgsbyk6cD09PWs/aFt1XSgpOmguZmFkZVRvKHBhcnNlSW50KHIsMTApfHw5MCxvPzE6MCxmdW5jdGlvbigpe298fGguaGlkZSgpfSksb3x8aC5xdWV1ZShmdW5jdGlvbih0KXtoLmNzcyh7bGVmdDoiIix0b3A6IiJ9KSxzKHplKS5sZW5ndGh8fGguZGV0YWNoKCksdCgpfSksYT1vLG4uZGVzdHJveWVkJiYobj1FKSxsKX19KSxsLmluaXQoKX0sVGU9bmV3IFRlLHMuZXh0ZW5kKHEucHJvdG90eXBlLHtpbml0OmZ1bmN0aW9uKHQpe3ZhciBlPXQudG9vbHRpcDtyZXR1cm4gdGhpcy5vcHRpb25zLm9uPyh0LmVsZW1lbnRzLm92ZXJsYXk9VGUuZWxlbSxlLmFkZENsYXNzKGplKS5jc3MoInotaW5kZXgiLFQubW9kYWxfemluZGV4K3MoemUpLmxlbmd0aCksdC5fYmluZChlLFsidG9vbHRpcHNob3ciLCJ0b29sdGlwaGlkZSJdLGZ1bmN0aW9uKHQsaSxvKXt2YXIgbj10Lm9yaWdpbmFsRXZlbnQ7aWYodC50YXJnZXQ9PT1lWzBdKWlmKG4mJiJ0b29sdGlwaGlkZSI9PT10LnR5cGUmJi9tb3VzZShsZWF2ZXxlbnRlcikvLnRlc3Qobi50eXBlKSYmcyhuLnJlbGF0ZWRUYXJnZXQpLmNsb3Nlc3QoVGUuZWxlbVswXSkubGVuZ3RoKXRyeXt0LnByZXZlbnREZWZhdWx0KCl9Y2F0Y2gocil7fWVsc2UoIW58fG4mJiJ0b29sdGlwc29sbyIhPT1uLnR5cGUpJiZ0aGlzLnRvZ2dsZSh0LCJ0b29sdGlwc2hvdyI9PT10LnR5cGUsbyl9LHRoaXMuX25zLHRoaXMpLHQuX2JpbmQoZSwidG9vbHRpcGZvY3VzIixmdW5jdGlvbih0LGkpe2lmKCF0LmlzRGVmYXVsdFByZXZlbnRlZCgpJiZ0LnRhcmdldD09PWVbMF0pe3ZhciBvPXMoemUpLG49VC5tb2RhbF96aW5kZXgrby5sZW5ndGgscj1wYXJzZUludChlWzBdLnN0eWxlLnpJbmRleCwxMCk7VGUuZWxlbVswXS5zdHlsZS56SW5kZXg9bi0xLG8uZWFjaChmdW5jdGlvbigpe3RoaXMuc3R5bGUuekluZGV4PnImJih0aGlzLnN0eWxlLnpJbmRleC09MSl9KSxvLmZpbHRlcigiLiIrWikucXRpcCgiYmx1ciIsdC5vcmlnaW5hbEV2ZW50KSxlLmFkZENsYXNzKFopWzBdLnN0eWxlLnpJbmRleD1uLFRlLnVwZGF0ZShpKTt0cnl7dC5wcmV2ZW50RGVmYXVsdCgpfWNhdGNoKGEpe319fSx0aGlzLl9ucyx0aGlzKSx0Ll9iaW5kKGUsInRvb2x0aXBoaWRlIixmdW5jdGlvbih0KXt0LnRhcmdldD09PWVbMF0mJnMoemUpLmZpbHRlcigiOnZpc2libGUiKS5ub3QoZSkubGFzdCgpLnF0aXAoImZvY3VzIix0KX0sdGhpcy5fbnMsdGhpcyksaSk6dGhpc30sdG9nZ2xlOmZ1bmN0aW9uKHQsZSxzKXtyZXR1cm4gdCYmdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKT90aGlzOihUZS50b2dnbGUodGhpcy5xdGlwLCEhZSxzKSxpKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMucXRpcC50b29sdGlwLnJlbW92ZUNsYXNzKGplKSx0aGlzLnF0aXAuX3VuYmluZCh0aGlzLnF0aXAudG9vbHRpcCx0aGlzLl9ucyksVGUudG9nZ2xlKHRoaXMucXRpcCxrKSxkZWxldGUgdGhpcy5xdGlwLmVsZW1lbnRzLm92ZXJsYXl9fSksQ2U9Ui5tb2RhbD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHEodCx0Lm9wdGlvbnMuc2hvdy5tb2RhbCl9LENlLnNhbml0aXplPWZ1bmN0aW9uKHQpe3Quc2hvdyYmKCJvYmplY3QiIT10eXBlb2YgdC5zaG93Lm1vZGFsP3Quc2hvdy5tb2RhbD17b246ISF0LnNob3cubW9kYWx9OnQuc2hvdy5tb2RhbC5vbj09PWkmJih0LnNob3cubW9kYWwub249VykpfSxULm1vZGFsX3ppbmRleD1ULnppbmRleC0yMDAsQ2UuaW5pdGlhbGl6ZT0icmVuZGVyIixNLm1vZGFsPXsiXnNob3cubW9kYWwuKG9ufGJsdXIpJCI6ZnVuY3Rpb24oKXt0aGlzLmRlc3Ryb3koKSx0aGlzLmluaXQoKSx0aGlzLnF0aXAuZWxlbXMub3ZlcmxheS50b2dnbGUodGhpcy5xdGlwLnRvb2x0aXBbMF0ub2Zmc2V0V2lkdGg+MCl9fSxzLmV4dGVuZChXLFQuZGVmYXVsdHMse3Nob3c6e21vZGFsOntvbjprLGVmZmVjdDpXLGJsdXI6VyxzdGVhbGZvY3VzOlcsZXNjYXBlOld9fX0pLFIudmlld3BvcnQ9ZnVuY3Rpb24oaSxzLG8sbixyLGEsaCl7ZnVuY3Rpb24gbCh0LGUsaSxvLG4scixhLGgsbCl7dmFyIGM9c1tuXSxwPV9bdF0sYj14W3RdLHc9aT09PVYscT1wPT09bj9sOnA9PT1yPy1sOi1sLzIsQz1iPT09bj9oOmI9PT1yPy1oOi1oLzIsVD12W25dK3lbbl0tKGY/MDp1W25dKSxqPVQtYyx6PWMrbC0oYT09PUE/ZzptKS1ULE09cS0oXy5wcmVjZWRhbmNlPT09dHx8cD09PV9bZV0/QzowKS0oYj09PU4/aC8yOjApO3JldHVybiB3PyhNPShwPT09bj8xOi0xKSpxLHNbbl0rPWo+MD9qOno+MD8tejowLHNbbl09TWF0aC5tYXgoLXVbbl0reVtuXSxjLU0sTWF0aC5taW4oTWF0aC5tYXgoLXVbbl0reVtuXSsoYT09PUE/ZzptKSxjK00pLHNbbl0sImNlbnRlciI9PT1wP2MtcToxZTkpKSk6KG8qPWk9PT0kPzI6MCxqPjAmJihwIT09bnx8ej4wKT8oc1tuXS09TStvLGQuaW52ZXJ0KHQsbikpOno+MCYmKHAhPT1yfHxqPjApJiYoc1tuXS09KHA9PT1OPy1NOk0pK28sZC5pbnZlcnQodCxyKSksdj5zW25dJiYtc1tuXT56JiYoc1tuXT1jLGQ9Xy5jbG9uZSgpKSksc1tuXS1jfXZhciBjLGQscCx1LGYsZyxtLHYseSxiPW8udGFyZ2V0LHc9aS5lbGVtZW50cy50b29sdGlwLF89by5teSx4PW8uYXQscT1vLmFkanVzdCxDPXEubWV0aG9kLnNwbGl0KCIgIiksVD1DWzBdLGo9Q1sxXXx8Q1swXSx6PW8udmlld3BvcnQsTT1vLmNvbnRhaW5lcixJPWkuY2FjaGUsVz17bGVmdDowLHRvcDowfTtyZXR1cm4gei5qcXVlcnkmJmJbMF0hPT10JiZiWzBdIT09ZS5ib2R5JiYibm9uZSIhPT1xLm1ldGhvZD8odT1NLm9mZnNldCgpfHxXLGY9InN0YXRpYyI9PT1NLmNzcygicG9zaXRpb24iKSxjPSJmaXhlZCI9PT13LmNzcygicG9zaXRpb24iKSxnPXpbMF09PT10P3oud2lkdGgoKTp6Lm91dGVyV2lkdGgoayksbT16WzBdPT09dD96LmhlaWdodCgpOnoub3V0ZXJIZWlnaHQoayksdj17bGVmdDpjPzA6ei5zY3JvbGxMZWZ0KCksdG9wOmM/MDp6LnNjcm9sbFRvcCgpfSx5PXoub2Zmc2V0KCl8fFcsKCJzaGlmdCIhPT1UfHwic2hpZnQiIT09aikmJihkPV8uY2xvbmUoKSksVz17bGVmdDoibm9uZSIhPT1UP2woUyxMLFQscS54LEYsUCxBLG4sYSk6MCx0b3A6Im5vbmUiIT09aj9sKEwsUyxqLHEueSxELE8sQixyLGgpOjB9LGQmJkkubGFzdENsYXNzIT09KHA9WCsiLXBvcy0iK2QuYWJicmV2KCkpJiZ3LnJlbW92ZUNsYXNzKGkuY2FjaGUubGFzdENsYXNzKS5hZGRDbGFzcyhpLmNhY2hlLmxhc3RDbGFzcz1wKSxXKTpXfSxSLnBvbHlzPXtwb2x5Z29uOmZ1bmN0aW9uKHQsZSl7dmFyIGkscyxvLG49e3dpZHRoOjAsaGVpZ2h0OjAscG9zaXRpb246e3RvcDoxZTEwLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDoxZTEwfSxhZGp1c3RhYmxlOmt9LHI9MCxhPVtdLGg9MSxsPTEsYz0wLGQ9MDtmb3Iocj10Lmxlbmd0aDtyLS07KWk9W3BhcnNlSW50KHRbLS1yXSwxMCkscGFyc2VJbnQodFtyKzFdLDEwKV0saVswXT5uLnBvc2l0aW9uLnJpZ2h0JiYobi5wb3NpdGlvbi5yaWdodD1pWzBdKSxpWzBdPG4ucG9zaXRpb24ubGVmdCYmKG4ucG9zaXRpb24ubGVmdD1pWzBdKSxpWzFdPm4ucG9zaXRpb24uYm90dG9tJiYobi5wb3NpdGlvbi5ib3R0b209aVsxXSksaVsxXTxuLnBvc2l0aW9uLnRvcCYmKG4ucG9zaXRpb24udG9wPWlbMV0pLGEucHVzaChpKTtpZihzPW4ud2lkdGg9TWF0aC5hYnMobi5wb3NpdGlvbi5yaWdodC1uLnBvc2l0aW9uLmxlZnQpLG89bi5oZWlnaHQ9TWF0aC5hYnMobi5wb3NpdGlvbi5ib3R0b20tbi5wb3NpdGlvbi50b3ApLCJjIj09PWUuYWJicmV2KCkpbi5wb3NpdGlvbj17bGVmdDpuLnBvc2l0aW9uLmxlZnQrbi53aWR0aC8yLHRvcDpuLnBvc2l0aW9uLnRvcCtuLmhlaWdodC8yfTtlbHNle2Zvcig7cz4wJiZvPjAmJmg+MCYmbD4wOylmb3Iocz1NYXRoLmZsb29yKHMvMiksbz1NYXRoLmZsb29yKG8vMiksZS54PT09Rj9oPXM6ZS54PT09UD9oPW4ud2lkdGgtczpoKz1NYXRoLmZsb29yKHMvMiksZS55PT09RD9sPW86ZS55PT09Tz9sPW4uaGVpZ2h0LW86bCs9TWF0aC5mbG9vcihvLzIpLHI9YS5sZW5ndGg7ci0tJiYhKDI+YS5sZW5ndGgpOyljPWFbcl1bMF0tbi5wb3NpdGlvbi5sZWZ0LGQ9YVtyXVsxXS1uLnBvc2l0aW9uLnRvcCwoZS54PT09RiYmYz49aHx8ZS54PT09UCYmaD49Y3x8ZS54PT09TiYmKGg+Y3x8Yz5uLndpZHRoLWgpfHxlLnk9PT1EJiZkPj1sfHxlLnk9PT1PJiZsPj1kfHxlLnk9PT1OJiYobD5kfHxkPm4uaGVpZ2h0LWwpKSYmYS5zcGxpY2UociwxKTtuLnBvc2l0aW9uPXtsZWZ0OmFbMF1bMF0sdG9wOmFbMF1bMV19fXJldHVybiBufSxyZWN0OmZ1bmN0aW9uKHQsZSxpLHMpe3JldHVybnt3aWR0aDpNYXRoLmFicyhpLXQpLGhlaWdodDpNYXRoLmFicyhzLWUpLHBvc2l0aW9uOntsZWZ0Ok1hdGgubWluKHQsaSksdG9wOk1hdGgubWluKGUscyl9fX0sX2FuZ2xlczp7dGM6MS41LHRyOjcvNCx0bDo1LzQsYmM6LjUsYnI6LjI1LGJsOi43NSxyYzoyLGxjOjEsYzowfSxlbGxpcHNlOmZ1bmN0aW9uKHQsZSxpLHMsbyl7dmFyIG49Ui5wb2x5cy5fYW5nbGVzW28uYWJicmV2KCldLHI9MD09PW4/MDppKk1hdGguY29zKG4qTWF0aC5QSSksYT1zKk1hdGguc2luKG4qTWF0aC5QSSk7cmV0dXJue3dpZHRoOjIqaS1NYXRoLmFicyhyKSxoZWlnaHQ6MipzLU1hdGguYWJzKGEpLHBvc2l0aW9uOntsZWZ0OnQrcix0b3A6ZSthfSxhZGp1c3RhYmxlOmt9fSxjaXJjbGU6ZnVuY3Rpb24odCxlLGkscyl7cmV0dXJuIFIucG9seXMuZWxsaXBzZSh0LGUsaSxpLHMpfX0sUi5zdmc9ZnVuY3Rpb24odCxpLG8pe2Zvcih2YXIgbixyLGEsaCxsLGMsZCxwLHUsZixnLG09cyhlKSx2PWlbMF0seT1zKHYub3duZXJTVkdFbGVtZW50KSxiPTEsdz0xLF89ITA7IXYuZ2V0QkJveDspdj12LnBhcmVudE5vZGU7aWYoIXYuZ2V0QkJveHx8IXYucGFyZW50Tm9kZSlyZXR1cm4gaztuPXkuYXR0cigid2lkdGgiKXx8eS53aWR0aCgpfHxwYXJzZUludCh5LmNzcygid2lkdGgiKSwxMCkscj15LmF0dHIoImhlaWdodCIpfHx5LmhlaWdodCgpfHxwYXJzZUludCh5LmNzcygiaGVpZ2h0IiksMTApO3ZhciB4PShwYXJzZUludChpLmNzcygic3Ryb2tlLXdpZHRoIiksMTApfHwwKS8yO3N3aXRjaCh4JiYoYis9eC9uLHcrPXgvciksdi5ub2RlTmFtZSl7Y2FzZSJlbGxpcHNlIjpjYXNlImNpcmNsZSI6Zj1SLnBvbHlzLmVsbGlwc2Uodi5jeC5iYXNlVmFsLnZhbHVlLHYuY3kuYmFzZVZhbC52YWx1ZSwodi5yeHx8di5yKS5iYXNlVmFsLnZhbHVlK3gsKHYucnl8fHYucikuYmFzZVZhbC52YWx1ZSt4LG8pO2JyZWFrO2Nhc2UibGluZSI6Y2FzZSJwb2x5Z29uIjpjYXNlInBvbHlsaW5lIjpmb3IodT12LnBvaW50c3x8W3t4OnYueDEuYmFzZVZhbC52YWx1ZSx5OnYueTEuYmFzZVZhbC52YWx1ZX0se3g6di54Mi5iYXNlVmFsLnZhbHVlLHk6di55Mi5iYXNlVmFsLnZhbHVlfV0sZj1bXSxwPS0xLGM9dS5udW1iZXJPZkl0ZW1zfHx1Lmxlbmd0aDtjPisrcDspZD11LmdldEl0ZW0/dS5nZXRJdGVtKHApOnVbcF0sZi5wdXNoLmFwcGx5KGYsW2QueCxkLnldKTtmPVIucG9seXMucG9seWdvbihmLG8pO2JyZWFrO2RlZmF1bHQ6Zj12LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9e3dpZHRoOmYud2lkdGgsaGVpZ2h0OmYuaGVpZ2h0LHBvc2l0aW9uOntsZWZ0OmYubGVmdCx0b3A6Zi50b3B9fSxfPSExfXJldHVybiBnPWYucG9zaXRpb24seT15WzBdLF8mJih5LmNyZWF0ZVNWR1BvaW50JiYoYT12LmdldFNjcmVlbkNUTSgpLHU9eS5jcmVhdGVTVkdQb2ludCgpLHUueD1nLmxlZnQsdS55PWcudG9wLGg9dS5tYXRyaXhUcmFuc2Zvcm0oYSksZy5sZWZ0PWgueCxnLnRvcD1oLnkpLHkudmlld0JveCYmKGw9eS52aWV3Qm94LmJhc2VWYWwpJiZsLndpZHRoJiZsLmhlaWdodCYmKGIqPW4vbC53aWR0aCx3Kj1yL2wuaGVpZ2h0KSksZy5sZWZ0Kz1tLnNjcm9sbExlZnQoKSxnLnRvcCs9bS5zY3JvbGxUb3AoKSxmfSxSLmltYWdlbWFwPWZ1bmN0aW9uKHQsZSxpKXtlLmpxdWVyeXx8KGU9cyhlKSk7dmFyIG8sbixyLGEsaCxsPWUuYXR0cigic2hhcGUiKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoInBvbHkiLCJwb2x5Z29uIiksYz1zKCdpbWdbdXNlbWFwPSIjJytlLnBhcmVudCgibWFwIikuYXR0cigibmFtZSIpKyciXScpLGQ9cy50cmltKGUuYXR0cigiY29vcmRzIikpLHA9ZC5yZXBsYWNlKC8sJC8sIiIpLnNwbGl0KCIsIik7aWYoIWMubGVuZ3RoKXJldHVybiBrO2lmKCJwb2x5Z29uIj09PWwpYT1SLnBvbHlzLnBvbHlnb24ocCxpKTtlbHNle2lmKCFSLnBvbHlzW2xdKXJldHVybiBrO2ZvcihyPS0xLGg9cC5sZW5ndGgsbj1bXTtoPisrcjspbi5wdXNoKHBhcnNlSW50KHBbcl0sMTApKTthPVIucG9seXNbbF0uYXBwbHkodGhpcyxuLmNvbmNhdChpKSl9cmV0dXJuIG89Yy5vZmZzZXQoKSxvLmxlZnQrPU1hdGguY2VpbCgoYy5vdXRlcldpZHRoKGspLWMud2lkdGgoKSkvMiksby50b3ArPU1hdGguY2VpbCgoYy5vdXRlckhlaWdodChrKS1jLmhlaWdodCgpKS8yKSxhLnBvc2l0aW9uLmxlZnQrPW8ubGVmdCxhLnBvc2l0aW9uLnRvcCs9by50b3AsYX07dmFyIE1lLEllPSc8aWZyYW1lIGNsYXNzPSJxdGlwLWJnaWZyYW1lIiBmcmFtZWJvcmRlcj0iMCIgdGFiaW5kZXg9Ii0xIiBzcmM9ImphdmFzY3JpcHQ6XCdcJzsiICBzdHlsZT0iZGlzcGxheTpibG9jazsgcG9zaXRpb246YWJzb2x1dGU7IHotaW5kZXg6LTE7IGZpbHRlcjphbHBoYShvcGFjaXR5PTApOyAtbXMtZmlsdGVyOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuQWxwaGEoT3BhY2l0eT0wKSI7Ij48L2lmcmFtZT4nO3MuZXh0ZW5kKEMucHJvdG90eXBlLHtfc2Nyb2xsOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5xdGlwLmVsZW1lbnRzLm92ZXJsYXk7ZSYmKGVbMF0uc3R5bGUudG9wPXModCkuc2Nyb2xsVG9wKCkrInB4Iil9LGluaXQ6ZnVuY3Rpb24oaSl7dmFyIG89aS50b29sdGlwOzE+cygic2VsZWN0LCBvYmplY3QiKS5sZW5ndGgmJih0aGlzLmJnaWZyYW1lPWkuZWxlbWVudHMuYmdpZnJhbWU9cyhJZSkuYXBwZW5kVG8obyksaS5fYmluZChvLCJ0b29sdGlwbW92ZSIsdGhpcy5hZGp1c3RCR0lGcmFtZSx0aGlzLl9ucyx0aGlzKSksdGhpcy5yZWRyYXdDb250YWluZXI9cygiPGRpdi8+Iix7aWQ6WCsiLXJjb250YWluZXIifSkuYXBwZW5kVG8oZS5ib2R5KSxpLmVsZW1lbnRzLm92ZXJsYXkmJmkuZWxlbWVudHMub3ZlcmxheS5hZGRDbGFzcygicXRpcG1vZGFsLWllNmZpeCIpJiYoaS5fYmluZCh0LFsic2Nyb2xsIiwicmVzaXplIl0sdGhpcy5fc2Nyb2xsLHRoaXMuX25zLHRoaXMpLGkuX2JpbmQobyxbInRvb2x0aXBzaG93Il0sdGhpcy5fc2Nyb2xsLHRoaXMuX25zLHRoaXMpKSx0aGlzLnJlZHJhdygpfSxhZGp1c3RCR0lGcmFtZTpmdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLnF0aXAudG9vbHRpcCxzPXtoZWlnaHQ6aS5vdXRlckhlaWdodChrKSx3aWR0aDppLm91dGVyV2lkdGgoayl9LG89dGhpcy5xdGlwLnBsdWdpbnMudGlwLG49dGhpcy5xdGlwLmVsZW1lbnRzLnRpcDtlPXBhcnNlSW50KGkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDAsZT17bGVmdDotZSx0b3A6LWV9LG8mJm4mJih0PSJ4Ij09PW8uY29ybmVyLnByZWNlZGFuY2U/W0EsRl06W0IsRF0sZVt0WzFdXS09blt0WzBdXSgpKSx0aGlzLmJnaWZyYW1lLmNzcyhlKS5jc3Mocyl9LHJlZHJhdzpmdW5jdGlvbigpe2lmKDE+dGhpcy5xdGlwLnJlbmRlcmVkfHx0aGlzLmRyYXdpbmcpcmV0dXJuIHRoaXM7dmFyIHQsZSxpLHMsbz10aGlzLnF0aXAudG9vbHRpcCxuPXRoaXMucXRpcC5vcHRpb25zLnN0eWxlLHI9dGhpcy5xdGlwLm9wdGlvbnMucG9zaXRpb24uY29udGFpbmVyO3JldHVybiB0aGlzLnF0aXAuZHJhd2luZz0xLG4uaGVpZ2h0JiZvLmNzcyhCLG4uaGVpZ2h0KSxuLndpZHRoP28uY3NzKEEsbi53aWR0aCk6KG8uY3NzKEEsIiIpLmFwcGVuZFRvKHRoaXMucmVkcmF3Q29udGFpbmVyKSxlPW8ud2lkdGgoKSwxPmUlMiYmKGUrPTEpLGk9by5jc3MoIm1heFdpZHRoIil8fCIiLHM9by5jc3MoIm1pbldpZHRoIil8fCIiLHQ9KGkrcykuaW5kZXhPZigiJSIpPi0xP3Iud2lkdGgoKS8xMDA6MCxpPShpLmluZGV4T2YoIiUiKT4tMT90OjEpKnBhcnNlSW50KGksMTApfHxlLHM9KHMuaW5kZXhPZigiJSIpPi0xP3Q6MSkqcGFyc2VJbnQocywxMCl8fDAsZT1pK3M/TWF0aC5taW4oTWF0aC5tYXgoZSxzKSxpKTplLG8uY3NzKEEsTWF0aC5yb3VuZChlKSkuYXBwZW5kVG8ocikpLHRoaXMuZHJhd2luZz0wLHRoaXN9LGRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmJnaWZyYW1lJiZ0aGlzLmJnaWZyYW1lLnJlbW92ZSgpLHRoaXMucXRpcC5fdW5iaW5kKFt0LHRoaXMucXRpcC50b29sdGlwXSx0aGlzLl9ucyl9fSksTWU9Ui5pZTY9ZnVuY3Rpb24odCl7cmV0dXJuIDY9PT1vZS5pZT9uZXcgQyh0KTprfSxNZS5pbml0aWFsaXplPSJyZW5kZXIiLE0uaWU2PXsiXmNvbnRlbnR8c3R5bGUkIjpmdW5jdGlvbigpe3RoaXMucmVkcmF3KCl9fX0pfSkod2luZG93LGRvY3VtZW50KTsKLy9AIHNvdXJjZU1hcHBpbmdVUkw9aHR0cDovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9xdGlwMi8yLjIuMC9qcXVlcnkucXRpcC5taW4ubWFw" 165 107 } 166 - ] 108 + ], 109 + "resources": [ 110 + { 111 + "meta": { 112 + "mimetype": "text/css", 113 + "name": "jquery.qtip.min.css", 114 + "ts": 1630083356995, 115 + "url": "https://cdnjs.cloudflare.com/ajax/libs/qtip2/2.2.0/jquery.qtip.min.css" 116 + }, 117 + "source": "LyogcVRpcDIgdjIuMi4wIGJhc2ljIGNzczMgfCBxdGlwMi5jb20gfCBMaWNlbnNlZCBNSVQsIEdQTCB8IFRodSBOb3YgMjEgMjAxMyAyMDozNTowMCAqLwoucXRpcHtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0yODAwMHB4O3RvcDotMjgwMDBweDtkaXNwbGF5Om5vbmU7bWF4LXdpZHRoOjI4MHB4O21pbi13aWR0aDo1MHB4O2ZvbnQtc2l6ZToxMC41cHg7bGluZS1oZWlnaHQ6MTJweDtkaXJlY3Rpb246bHRyO2JveC1zaGFkb3c6bm9uZTtwYWRkaW5nOjB9LnF0aXAtY29udGVudHtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjVweCA5cHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtYWxpZ246bGVmdDt3b3JkLXdyYXA6YnJlYWstd29yZH0ucXRpcC10aXRsZWJhcntwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjVweCAzNXB4IDVweCAxMHB4O292ZXJmbG93OmhpZGRlbjtib3JkZXItd2lkdGg6MCAwIDFweDtmb250LXdlaWdodDo3MDB9LnF0aXAtdGl0bGViYXIrLnF0aXAtY29udGVudHtib3JkZXItdG9wLXdpZHRoOjAhaW1wb3J0YW50fS5xdGlwLWNsb3Nle3Bvc2l0aW9uOmFic29sdXRlO3JpZ2h0Oi05cHg7dG9wOi05cHg7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTptZWRpdW0gbm9uZTtib3JkZXItd2lkdGg6MXB4O2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9LnF0aXAtdGl0bGViYXIgLnF0aXAtY2xvc2V7cmlnaHQ6NHB4O3RvcDo1MCU7bWFyZ2luLXRvcDotOXB4fSogaHRtbCAucXRpcC10aXRsZWJhciAucXRpcC1jbG9zZXt0b3A6MTZweH0ucXRpcC10aXRsZWJhciAudWktaWNvbiwucXRpcC1pY29uIC51aS1pY29ue2Rpc3BsYXk6YmxvY2s7dGV4dC1pbmRlbnQ6LTEwMDBlbTtkaXJlY3Rpb246bHRyfS5xdGlwLWljb24sLnF0aXAtaWNvbiAudWktaWNvbnstbW96LWJvcmRlci1yYWRpdXM6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnF0aXAtaWNvbiAudWktaWNvbnt3aWR0aDoxOHB4O2hlaWdodDoxNHB4O2xpbmUtaGVpZ2h0OjE0cHg7dGV4dC1hbGlnbjpjZW50ZXI7dGV4dC1pbmRlbnQ6MDtmb250OjQwMCBib2xkIDEwcHgvMTNweCBUYWhvbWEsc2Fucy1zZXJpZjtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnQgbm9uZSBuby1yZXBlYXQgLTEwMGVtIC0xMDBlbX0ucXRpcC1mb2N1c3t9LnF0aXAtaG92ZXJ7fS5xdGlwLWRlZmF1bHR7Ym9yZGVyLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLWNvbG9yOiNGMUQwMzE7YmFja2dyb3VuZC1jb2xvcjojRkZGRkEzO2NvbG9yOiM1NTV9LnF0aXAtZGVmYXVsdCAucXRpcC10aXRsZWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNGRkVGOTN9LnF0aXAtZGVmYXVsdCAucXRpcC1pY29ue2JvcmRlci1jb2xvcjojQ0NDO2JhY2tncm91bmQ6I0YxRjFGMTtjb2xvcjojNzc3fS5xdGlwLWRlZmF1bHQgLnF0aXAtdGl0bGViYXIgLnF0aXAtY2xvc2V7Ym9yZGVyLWNvbG9yOiNBQUE7Y29sb3I6IzExMX0gLnF0aXAtbGlnaHR7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1jb2xvcjojRTJFMkUyO2NvbG9yOiM0NTQ1NDV9LnF0aXAtbGlnaHQgLnF0aXAtdGl0bGViYXJ7YmFja2dyb3VuZC1jb2xvcjojZjFmMWYxfSAucXRpcC1kYXJre2JhY2tncm91bmQtY29sb3I6IzUwNTA1MDtib3JkZXItY29sb3I6IzMwMzAzMDtjb2xvcjojZjNmM2YzfS5xdGlwLWRhcmsgLnF0aXAtdGl0bGViYXJ7YmFja2dyb3VuZC1jb2xvcjojNDA0MDQwfS5xdGlwLWRhcmsgLnF0aXAtaWNvbntib3JkZXItY29sb3I6IzQ0NH0ucXRpcC1kYXJrIC5xdGlwLXRpdGxlYmFyIC51aS1zdGF0ZS1ob3Zlcntib3JkZXItY29sb3I6IzMwMzAzMH0gLnF0aXAtY3JlYW17YmFja2dyb3VuZC1jb2xvcjojRkJGN0FBO2JvcmRlci1jb2xvcjojRjlFOThFO2NvbG9yOiNBMjdEMzV9LnF0aXAtY3JlYW0gLnF0aXAtdGl0bGViYXJ7YmFja2dyb3VuZC1jb2xvcjojRjBERTdEfS5xdGlwLWNyZWFtIC5xdGlwLWNsb3NlIC5xdGlwLWljb257YmFja2dyb3VuZC1wb3NpdGlvbjotODJweCAwfSAucXRpcC1yZWR7YmFja2dyb3VuZC1jb2xvcjojRjc4QjgzO2JvcmRlci1jb2xvcjojRDk1MjUyO2NvbG9yOiM5MTIzMjN9LnF0aXAtcmVkIC5xdGlwLXRpdGxlYmFye2JhY2tncm91bmQtY29sb3I6I0YwNkQ2NX0ucXRpcC1yZWQgLnF0aXAtY2xvc2UgLnF0aXAtaWNvbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMDJweCAwfS5xdGlwLXJlZCAucXRpcC1pY29ue2JvcmRlci1jb2xvcjojRDk1MjUyfS5xdGlwLXJlZCAucXRpcC10aXRsZWJhciAudWktc3RhdGUtaG92ZXJ7Ym9yZGVyLWNvbG9yOiNEOTUyNTJ9IC5xdGlwLWdyZWVue2JhY2tncm91bmQtY29sb3I6I0NBRUQ5RTtib3JkZXItY29sb3I6IzkwRDkzRjtjb2xvcjojM0Y2MjE5fS5xdGlwLWdyZWVuIC5xdGlwLXRpdGxlYmFye2JhY2tncm91bmQtY29sb3I6I0IwREU3OH0ucXRpcC1ncmVlbiAucXRpcC1jbG9zZSAucXRpcC1pY29ue2JhY2tncm91bmQtcG9zaXRpb246LTQycHggMH0gLnF0aXAtYmx1ZXtiYWNrZ3JvdW5kLWNvbG9yOiNFNUY2RkU7Ym9yZGVyLWNvbG9yOiNBREQ5RUQ7Y29sb3I6IzVFOTlCRH0ucXRpcC1ibHVlIC5xdGlwLXRpdGxlYmFye2JhY2tncm91bmQtY29sb3I6I0QwRTlGNX0ucXRpcC1ibHVlIC5xdGlwLWNsb3NlIC5xdGlwLWljb257YmFja2dyb3VuZC1wb3NpdGlvbjotMnB4IDB9LnF0aXAtc2hhZG93ey13ZWJraXQtYm94LXNoYWRvdzoxcHggMXB4IDNweCAxcHggcmdiYSgwLDAsMCwuMTUpOy1tb3otYm94LXNoYWRvdzoxcHggMXB4IDNweCAxcHggcmdiYSgwLDAsMCwuMTUpO2JveC1zaGFkb3c6MXB4IDFweCAzcHggMXB4IHJnYmEoMCwwLDAsLjE1KX0ucXRpcC1yb3VuZGVkLC5xdGlwLXRpcHN5LC5xdGlwLWJvb3RzdHJhcHstbW96LWJvcmRlci1yYWRpdXM6NXB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHg7Ym9yZGVyLXJhZGl1czo1cHh9LnF0aXAtcm91bmRlZCAucXRpcC10aXRsZWJhcnstbW96LWJvcmRlci1yYWRpdXM6NHB4IDRweCAwIDA7LXdlYmtpdC1ib3JkZXItcmFkaXVzOjRweCA0cHggMCAwO2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDB9LnF0aXAteW91dHViZXstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7Ym9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAzcHggIzMzMzstbW96LWJveC1zaGFkb3c6MCAwIDNweCAjMzMzO2JveC1zaGFkb3c6MCAwIDNweCAjMzMzO2NvbG9yOiNmZmY7Ym9yZGVyLXdpZHRoOjA7YmFja2dyb3VuZDojNEE0QTRBO2JhY2tncm91bmQtaW1hZ2U6LXdlYmtpdC1ncmFkaWVudChsaW5lYXIsbGVmdCB0b3AsbGVmdCBib3R0b20sY29sb3Itc3RvcCgwLCM0QTRBNEEpLGNvbG9yLXN0b3AoMTAwJSwjMDAwKSk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzRBNEE0QSAwLCMwMDAgMTAwJSk7YmFja2dyb3VuZC1pbWFnZTotbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIzRBNEE0QSAwLCMwMDAgMTAwJSk7YmFja2dyb3VuZC1pbWFnZTotbXMtbGluZWFyLWdyYWRpZW50KHRvcCwjNEE0QTRBIDAsIzAwMCAxMDAlKTtiYWNrZ3JvdW5kLWltYWdlOi1vLWxpbmVhci1ncmFkaWVudCh0b3AsIzRBNEE0QSAwLCMwMDAgMTAwJSl9LnF0aXAteW91dHViZSAucXRpcC10aXRsZWJhcntiYWNrZ3JvdW5kLWNvbG9yOiM0QTRBNEE7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDApfS5xdGlwLXlvdXR1YmUgLnF0aXAtY29udGVudHtwYWRkaW5nOi43NWVtO2ZvbnQ6MTJweCBhcmlhbCxzYW5zLXNlcmlmO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuR3JhZGllbnQoR3JhZGllbnRUeXBlPTAsIFN0YXJ0Q29sb3JTdHI9IzRhNGE0YSwgRW5kQ29sb3JTdHI9IzAwMDAwMCk7LW1zLWZpbHRlcjoicHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LkdyYWRpZW50KEdyYWRpZW50VHlwZT0wLCBTdGFydENvbG9yU3RyPSM0YTRhNGEsIEVuZENvbG9yU3RyPSMwMDAwMDApOyJ9LnF0aXAteW91dHViZSAucXRpcC1pY29ue2JvcmRlci1jb2xvcjojMjIyfS5xdGlwLXlvdXR1YmUgLnF0aXAtdGl0bGViYXIgLnVpLXN0YXRlLWhvdmVye2JvcmRlci1jb2xvcjojMzAzMDMwfS5xdGlwLWp0b29sc3tiYWNrZ3JvdW5kOiMyMzIzMjM7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC43KTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtZ3JhZGllbnQobGluZWFyLGxlZnQgdG9wLGxlZnQgYm90dG9tLGZyb20oIzcxNzE3MSksdG8oIzIzMjMyMykpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCM3MTcxNzEsIzIzMjMyMyk7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIzcxNzE3MSwjMjMyMzIzKTtiYWNrZ3JvdW5kLWltYWdlOi1tcy1saW5lYXItZ3JhZGllbnQodG9wLCM3MTcxNzEsIzIzMjMyMyk7YmFja2dyb3VuZC1pbWFnZTotby1saW5lYXItZ3JhZGllbnQodG9wLCM3MTcxNzEsIzIzMjMyMyk7Ym9yZGVyOjJweCBzb2xpZCAjZGRkO2JvcmRlcjoycHggc29saWQgcmdiYSgyNDEsMjQxLDI0MSwxKTstbW96LWJvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czoycHg7Ym9yZGVyLXJhZGl1czoycHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgMCAxMnB4ICMzMzM7LW1vei1ib3gtc2hhZG93OjAgMCAxMnB4ICMzMzM7Ym94LXNoYWRvdzowIDAgMTJweCAjMzMzfS5xdGlwLWp0b29scyAucXRpcC10aXRsZWJhcntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jNzE3MTcxLCBlbmRDb2xvcnN0cj0jNEE0QTRBKTstbXMtZmlsdGVyOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jNzE3MTcxLCBlbmRDb2xvcnN0cj0jNEE0QTRBKSJ9LnF0aXAtanRvb2xzIC5xdGlwLWNvbnRlbnR7ZmlsdGVyOnByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM0QTRBNEEsIGVuZENvbG9yc3RyPSMyMzIzMjMpOy1tcy1maWx0ZXI6InByb2dpZDpEWEltYWdlVHJhbnNmb3JtLk1pY3Jvc29mdC5ncmFkaWVudChzdGFydENvbG9yc3RyPSM0QTRBNEEsIGVuZENvbG9yc3RyPSMyMzIzMjMpIn0ucXRpcC1qdG9vbHMgLnF0aXAtdGl0bGViYXIsLnF0aXAtanRvb2xzIC5xdGlwLWNvbnRlbnR7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojZmZmO2JvcmRlcjowIGRhc2hlZCB0cmFuc3BhcmVudH0ucXRpcC1qdG9vbHMgLnF0aXAtaWNvbntib3JkZXItY29sb3I6IzU1NX0ucXRpcC1qdG9vbHMgLnF0aXAtdGl0bGViYXIgLnVpLXN0YXRlLWhvdmVye2JvcmRlci1jb2xvcjojMzMzfS5xdGlwLWNsdWV0aXB7LXdlYmtpdC1ib3gtc2hhZG93OjRweCA0cHggNXB4IHJnYmEoMCwwLDAsLjQpOy1tb3otYm94LXNoYWRvdzo0cHggNHB4IDVweCByZ2JhKDAsMCwwLC40KTtib3gtc2hhZG93OjRweCA0cHggNXB4IHJnYmEoMCwwLDAsLjQpO2JhY2tncm91bmQtY29sb3I6I0Q5RDlDMjtjb2xvcjojMTExO2JvcmRlcjowIGRhc2hlZCB0cmFuc3BhcmVudH0ucXRpcC1jbHVldGlwIC5xdGlwLXRpdGxlYmFye2JhY2tncm91bmQtY29sb3I6Izg3ODc2QTtjb2xvcjojZmZmO2JvcmRlcjowIGRhc2hlZCB0cmFuc3BhcmVudH0ucXRpcC1jbHVldGlwIC5xdGlwLWljb257Ym9yZGVyLWNvbG9yOiM4MDgwNjR9LnF0aXAtY2x1ZXRpcCAucXRpcC10aXRsZWJhciAudWktc3RhdGUtaG92ZXJ7Ym9yZGVyLWNvbG9yOiM2OTY5NTI7Y29sb3I6IzY5Njk1Mn0ucXRpcC10aXBzeXtiYWNrZ3JvdW5kOiMwMDA7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC44Nyk7Y29sb3I6I2ZmZjtib3JkZXI6MCBzb2xpZCB0cmFuc3BhcmVudDtmb250LXNpemU6MTFweDtmb250LWZhbWlseTonTHVjaWRhIEdyYW5kZScsc2Fucy1zZXJpZjtmb250LXdlaWdodDo3MDA7bGluZS1oZWlnaHQ6MTZweDt0ZXh0LXNoYWRvdzowIDFweCAjMDAwfS5xdGlwLXRpcHN5IC5xdGlwLXRpdGxlYmFye3BhZGRpbmc6NnB4IDM1cHggMCAxMHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9LnF0aXAtdGlwc3kgLnF0aXAtY29udGVudHtwYWRkaW5nOjZweCAxMHB4fS5xdGlwLXRpcHN5IC5xdGlwLWljb257Ym9yZGVyLWNvbG9yOiMyMjI7dGV4dC1zaGFkb3c6bm9uZX0ucXRpcC10aXBzeSAucXRpcC10aXRsZWJhciAudWktc3RhdGUtaG92ZXJ7Ym9yZGVyLWNvbG9yOiMzMDMwMzB9LnF0aXAtdGlwcGVke2JvcmRlcjozcHggc29saWQgIzk1OUZBOTstbW96LWJvcmRlci1yYWRpdXM6M3B4Oy13ZWJraXQtYm9yZGVyLXJhZGl1czozcHg7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZC1jb2xvcjojRjlGOUY5O2NvbG9yOiM0NTQ1NDU7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtZmFtaWx5OnNlcmlmfS5xdGlwLXRpcHBlZCAucXRpcC10aXRsZWJhcntib3JkZXItYm90dG9tLXdpZHRoOjA7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiMzQTc5Qjg7YmFja2dyb3VuZC1pbWFnZTotd2Via2l0LWdyYWRpZW50KGxpbmVhcixsZWZ0IHRvcCxsZWZ0IGJvdHRvbSxmcm9tKCMzQTc5QjgpLHRvKCMyRTYyOUQpKTtiYWNrZ3JvdW5kLWltYWdlOi13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwjM0E3OUI4LCMyRTYyOUQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1saW5lYXItZ3JhZGllbnQodG9wLCMzQTc5QjgsIzJFNjI5RCk7YmFja2dyb3VuZC1pbWFnZTotbXMtbGluZWFyLWdyYWRpZW50KHRvcCwjM0E3OUI4LCMyRTYyOUQpO2JhY2tncm91bmQtaW1hZ2U6LW8tbGluZWFyLWdyYWRpZW50KHRvcCwjM0E3OUI4LCMyRTYyOUQpO2ZpbHRlcjpwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jM0E3OUI4LCBlbmRDb2xvcnN0cj0jMkU2MjlEKTstbXMtZmlsdGVyOiJwcm9naWQ6RFhJbWFnZVRyYW5zZm9ybS5NaWNyb3NvZnQuZ3JhZGllbnQoc3RhcnRDb2xvcnN0cj0jM0E3OUI4LCBlbmRDb2xvcnN0cj0jMkU2MjlEKSJ9LnF0aXAtdGlwcGVkIC5xdGlwLWljb257Ym9yZGVyOjJweCBzb2xpZCAjMjg1NTg5O2JhY2tncm91bmQ6IzI4NTU4OX0ucXRpcC10aXBwZWQgLnF0aXAtaWNvbiAudWktaWNvbntiYWNrZ3JvdW5kLWNvbG9yOiNGQkZCRkI7Y29sb3I6IzU1NX0ucXRpcC1ib290c3RyYXB7Zm9udC1zaXplOjE0cHg7bGluZS1oZWlnaHQ6MjBweDtjb2xvcjojMzMzO3BhZGRpbmc6MXB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNjY2M7Ym9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4yKTstd2Via2l0LWJvcmRlci1yYWRpdXM6NnB4Oy1tb3otYm9yZGVyLXJhZGl1czo2cHg7Ym9yZGVyLXJhZGl1czo2cHg7LXdlYmtpdC1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMik7LW1vei1ib3gtc2hhZG93OjAgNXB4IDEwcHggcmdiYSgwLDAsMCwuMik7Ym94LXNoYWRvdzowIDVweCAxMHB4IHJnYmEoMCwwLDAsLjIpOy13ZWJraXQtYmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94Oy1tb3otYmFja2dyb3VuZC1jbGlwOnBhZGRpbmc7YmFja2dyb3VuZC1jbGlwOnBhZGRpbmctYm94fS5xdGlwLWJvb3RzdHJhcCAucXRpcC10aXRsZWJhcntwYWRkaW5nOjhweCAxNHB4O21hcmdpbjowO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxOHB4O2JhY2tncm91bmQtY29sb3I6I2Y3ZjdmNztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViOy13ZWJraXQtYm9yZGVyLXJhZGl1czo1cHggNXB4IDAgMDstbW96LWJvcmRlci1yYWRpdXM6NXB4IDVweCAwIDA7Ym9yZGVyLXJhZGl1czo1cHggNXB4IDAgMH0ucXRpcC1ib290c3RyYXAgLnF0aXAtdGl0bGViYXIgLnF0aXAtY2xvc2V7cmlnaHQ6MTFweDt0b3A6NDUlO2JvcmRlci1zdHlsZTpub25lfS5xdGlwLWJvb3RzdHJhcCAucXRpcC1jb250ZW50e3BhZGRpbmc6OXB4IDE0cHh9LnF0aXAtYm9vdHN0cmFwIC5xdGlwLWljb257YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ucXRpcC1ib290c3RyYXAgLnF0aXAtaWNvbiAudWktaWNvbnt3aWR0aDphdXRvO2hlaWdodDphdXRvO2Zsb2F0OnJpZ2h0O2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OjcwMDtsaW5lLWhlaWdodDoxOHB4O2NvbG9yOiMwMDA7dGV4dC1zaGFkb3c6MCAxcHggMCAjZmZmO29wYWNpdHk6LjI7ZmlsdGVyOmFscGhhKG9wYWNpdHk9MjApfS5xdGlwLWJvb3RzdHJhcCAucXRpcC1pY29uIC51aS1pY29uOmhvdmVye2NvbG9yOiMwMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7b3BhY2l0eTouNDtmaWx0ZXI6YWxwaGEob3BhY2l0eT00MCl9LnF0aXA6bm90KC5pZTloYXhvcnMpIGRpdi5xdGlwLWNvbnRlbnQsLnF0aXA6bm90KC5pZTloYXhvcnMpIGRpdi5xdGlwLXRpdGxlYmFye2ZpbHRlcjpub25lOy1tcy1maWx0ZXI6bm9uZX0ucXRpcCAucXRpcC10aXB7bWFyZ2luOjAgYXV0bztvdmVyZmxvdzpoaWRkZW47ei1pbmRleDoxMH14Oi1vLXByZWZvY3VzLC5xdGlwIC5xdGlwLXRpcHt2aXNpYmlsaXR5OmhpZGRlbn0ucXRpcCAucXRpcC10aXAsLnF0aXAgLnF0aXAtdGlwIC5xdGlwLXZtbCwucXRpcCAucXRpcC10aXAgY2FudmFze3Bvc2l0aW9uOmFic29sdXRlO2NvbG9yOiMxMjM0NTY7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6MCBkYXNoZWQgdHJhbnNwYXJlbnR9LnF0aXAgLnF0aXAtdGlwIGNhbnZhc3t0b3A6MDtsZWZ0OjB9LnF0aXAgLnF0aXAtdGlwIC5xdGlwLXZtbHtiZWhhdmlvcjp1cmwoI2RlZmF1bHQjVk1MKTtkaXNwbGF5OmlubGluZS1ibG9jazt2aXNpYmlsaXR5OnZpc2libGV9I3F0aXAtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDtsZWZ0OjA7dG9wOjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0jcXRpcC1vdmVybGF5LmJsdXJze2N1cnNvcjpwb2ludGVyfSNxdGlwLW92ZXJsYXkgZGl2e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO2JhY2tncm91bmQtY29sb3I6IzAwMDtvcGFjaXR5Oi43O2ZpbHRlcjphbHBoYShvcGFjaXR5PTcwKTstbXMtZmlsdGVyOiJhbHBoYShPcGFjaXR5PTcwKSJ9LnF0aXBtb2RhbC1pZTZmaXh7cG9zaXRpb246YWJzb2x1dGUhaW1wb3J0YW50fQ==" 118 + } 119 + ], 120 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgV2FuaUthbmkgSW1wcm92ZQovLyBAbmFtZXNwYWNlIGh0dHA6Ly93d3cubWljaGFlbGZyYW5rLmNvbS5ici93YW5pa2FuaV9pbXByb3ZlLwovLyBAaW5jbHVkZSBodHRwczovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24KLy8gQGluY2x1ZGUgaHR0cDovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24KLy8gQHZlcnNpb24gMi4yLjIKLy8gQGdyYW50IEdNX2FkZFN0eWxlCi8vIEBncmFudCBHTV9nZXRSZXNvdXJjZVRleHQKLy8gQHJ1bi1hdCBkb2N1bWVudC1lbmQKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvanF1ZXJ5LzIuMC4zL2pxdWVyeS5taW4uanMKLy8gQHJlcXVpcmUgaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvcXRpcDIvMi4yLjAvanF1ZXJ5LnF0aXAubWluLmpzCi8vIEByZXNvdXJjZSBxdGlwQ1NTIGh0dHBzOi8vY2RuanMuY2xvdWRmbGFyZS5jb20vYWpheC9saWJzL3F0aXAyLzIuMi4wL2pxdWVyeS5xdGlwLm1pbi5jc3MKLy8gPT0vVXNlclNjcmlwdD09Cgp2YXIgcXRpcENTUyA9IEdNX2dldFJlc291cmNlVGV4dCgicXRpcENTUyIpOwpHTV9hZGRTdHlsZShxdGlwQ1NTKTsKCiQualN0b3JhZ2UgPSB1bnNhZmVXaW5kb3cuJC5qU3RvcmFnZTsKCnZhciB3a2lfc2V0dGluZ3MgPSAkLmpTdG9yYWdlLmdldCgnd2tpX3NldHRpbmdzJyk7CgppZih3a2lfc2V0dGluZ3MgPT09IG51bGwpCnsKICAgIHdraV9zZXR0aW5ncyA9ICh7CiAgICAgICAgJ3draV90aW1lcl9zaG93X25leHRfaXRlbScgOiAwLAogICAgICAgICd3a2lfYnV0dG9uX2xhYmVsX2JnY29sb3InOiAnI0EyQTJBMicsCiAgICAgICAgJ3draV9idXR0b25fbGFiZWxfdGV4dGNvbG9yJyA6ICcjRkZGRkZGJywKICAgICAgICAnd2tpX2NvbWJvX2Rpc3BsYXknIDogdHJ1ZSwKICAgICAgICAnd2tpX3Nyc19sZXZlbHVwX2Rpc3BsYXknIDogdHJ1ZSwKICAgICAgICAnd2tpX2F1dG9fc2hvd19pbmZvJyA6IHRydWUsCiAgICAgICAgJ3draV9hdWRpb19hdXRvcGxheScgOiBmYWxzZQogICAgfSk7CiAgICBjb25zb2xlLmxvZygnV0tJOiBTZXR0aW5ncyBub3QgZm91bmQnKTsKfQplbHNlCnsKICAgIGNvbnNvbGUubG9nKCdXS0k6IFNldHRpbmdzIGZvdW5kJyk7CiAgICB3a2lfc2V0dGluZ3MgPSAkLnBhcnNlSlNPTih3a2lfc2V0dGluZ3MpOwp9Cgp2YXIgd2tpX2hpdF9jb21ibyA9IDA7CnZhciB3a2lfY29tYm9fcmVjb3JkID0gJC5qU3RvcmFnZS5nZXQoJ3draV9jb21ib19yZWNvcmQnKTsKCnZhciB3a2lfY3VycmVudF9pdGVtID0gJyc7CnZhciB3a2lfY3VycmVudF90eXBlID0gJyc7CnZhciB3a2lfY3VycmVudF9xdWVzdGlvbl90eXBlID0gJyc7CnZhciB3a2lfcHJldmlvdXNfaXRlbSA9ICcnOwp2YXIgd2tpX3ByZXZpb3VzX3R5cGUgPSAnJzsKdmFyIHdraV9wcmV2aW91c19xdWVzdGlvbl90eXBlID0gJyc7CnZhciB3a2lfcHJldmlvdXNfaXRlbV91cmwgPSAnJzsKdmFyIHdraV9zdWJtaXR0ZWRfYW5zd2VyID0gJyc7Cgp2YXIgd2tpX2pzdG9yZWRfY3VycmVudF9pdGVtID0gJyc7CnZhciB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtID0gJyc7Cgp2YXIgd2tpX2l0ZW1zX2FycmF5ID0gbmV3IEFycmF5KCk7Cgp2YXIgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3JlY2VpdmVkID0gZmFsc2U7CnZhciB3a2lfZXhjZXB0aW9uX21lc3NhZ2VfdHlwZSA9IDA7CnZhciB3a2lfYW5zd2VyX2V4Y2VwdGlvbl9tZXNzYWdlID0gbmV3IEFycmF5KCk7CndraV9hbnN3ZXJfZXhjZXB0aW9uX21lc3NhZ2VbMF0gPSAnQ2hlY2sgdGhlIHByZXZpb3VzIGl0ZW0nOwp3a2lfYW5zd2VyX2V4Y2VwdGlvbl9tZXNzYWdlWzFdID0gJ1lvdXIgYW5zd2VyIHdhcyBhIGJpdCBvZmYnOwp3a2lfYW5zd2VyX2V4Y2VwdGlvbl9tZXNzYWdlWzJdID0gJ1RoZXJlIGFyZSBvdGhlciBwb3NzaWJsZSByZWFkaW5ncyc7CndraV9hbnN3ZXJfZXhjZXB0aW9uX21lc3NhZ2VbM10gPSAnVGhlcmUgYXJlIG90aGVyIHBvc3NpYmxlIG1lYW5pbmdzJzsKCnZhciB3a2lfc3JzX2xldmVsID0gbmV3IEFycmF5KCk7CndraV9zcnNfbGV2ZWxbMF0gPSAnJzsgLy8gRXZlcnkgaXRlbSBzdGFydHMgb24gMQp3a2lfc3JzX2xldmVsWzFdID0gJyc7CndraV9zcnNfbGV2ZWxbMl0gPSAnJzsKd2tpX3Nyc19sZXZlbFszXSA9ICcnOwp3a2lfc3JzX2xldmVsWzRdID0gJyc7CndraV9zcnNfbGV2ZWxbNV0gPSAnR3VydSc7CndraV9zcnNfbGV2ZWxbNl0gPSAnJzsKd2tpX3Nyc19sZXZlbFs3XSA9ICdNYXN0ZXInOwp3a2lfc3JzX2xldmVsWzhdID0gJ0VubGlnaHRlbmVkJzsKd2tpX3Nyc19sZXZlbFs5XSA9ICdCdXJuZWQnOwp3a2lfc3JzX2xldmVsWzEwXSA9ICcnOyAvLyBTUlMgMTAgZG9lcyBub3QgZXhpc3QKCnZhciBzcnNfd3JhcHBlcl90b3AgPSAwOwp2YXIgc3JzX3dyYXBwZXJfdXBwZXIgPSAwOwoKJCgnPGxpIGlkPSJ3a2lfYnV0dG9uIiBjbGFzcz0id2tpX2RlZmF1bHRfY3Vyc29yIGRpc2FibGVkIj48ZGl2IGlkPSJ3a2lfbWltaWNfYnV0dG9uIj48ZGl2IGNsYXNzPSJ3a2lfaXRlbV93cmFwcGVyIj48ZGl2IGxhbmc9ImphIiBjbGFzcz0id2tpX2J1dHRvbl9pdGVtX2xhYmVsIj48ZGl2IGNsYXNzPSJ3a2lfc3RhcnRfbWVzc2FnZSI+UHJldmlvdXMgaXRlbTwvZGl2PjwvZGl2PjwvZGl2PjxpIGNsYXNzPSJpY29uLWluZm8tc2lnbiI+PC9pPjwvbGk+JykuaW5zZXJ0QWZ0ZXIoJyNvcHRpb24td3JhcC11cCcpOwokKCc8ZGl2IGlkPSJ3a2lfc3JzX3BvcHVwX3dyYXBwZXIiPjxkaXYgY2xhc3M9IndraV9zcnNfcG9wdXBfaWNvbiI+PGkgY2xhc3M9Imljb24tYXJyb3ctdXAiPjwvaT48L2Rpdj48ZGl2IGlkPSJ3a2lfc3JzX3BvcHVwX21lc3NhZ2UiPjwvZGl2PjwvZGl2PicpLmFwcGVuZFRvKCdib2R5Jyk7CgokKCc8c3BhbiBpZD0id2tpX2NvbWJvX2Rpc3BsYXkiPjxpIGNsYXNzPSJpY29uLXRyb3BoeSI+PC9pPjxzcGFuIGlkPSJ3a2lfY29tYm8iIHRpdGxlPSJDdXJyZW50IGNvbWJvIG9mIHJpZ2h0IGFuc3dlcnMiPjA8L3NwYW4+IDxzcGFuIGlkPSJ3a2lfY29tYm9fcmVjb3JkIiB0aXRsZT0iUmVjb3JkIG9mIHJpZ2h0IGFuc3dlcnMgaW4gYSByb3ciPjwvc3Bhbj48L3NwYW4+ICcpLmluc2VydEJlZm9yZSgnI3N0YXRzIGkuaWNvbi10aHVtYnMtdXAnKTsKCiQoJzxkaXYgaWQ9IndraV9jb25maWdfYnV0dG9uIj48c3BhbiBjbGFzcz0id2tpX3Rvb2x0aXAiIHJlbD0id2tpX3NldHRpbmdzX2luZm8iPjxzcGFuIGlkPSJ3a2lfc2V0dGluZ3NfaW5mbyIgY2xhc3M9IndraV9oaWRkZW4iPkNsaWNrIHRvIGFjY2VzcyBXYW5pS2FuaSBJbXByb3ZlIHNldHRpbmdzIG1lbnU8L3NwYW4+PGkgY2xhc3M9Imljb24tY29ncyI+PC9pPiBXS0kgMi4yLjI8L3NwYW4+PC9kaXY+JykuaW5zZXJ0QmVmb3JlKCcjaG90a2V5cycpOwoKJCgnPGRpdiBpZD0id2tpX21vZGFsX2JhY2tncm91bmQiPjwvZGl2PicpLmNzcyh7IHBvc2l0aW9uOiAnYWJzb2x1dGUnLCB0b3A6ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpLCBsZWZ0OiAwLCBoZWlnaHQ6ICQoZG9jdW1lbnQpLmhlaWdodCgpLCB3aWR0aDogJzEwMCUnLCBvcGFjaXR5OiAwLjcsIGJhY2tncm91bmRDb2xvcjogJyMwMDAwMDAnLCB6SW5kZXg6IDUwMDAsIGRpc3BsYXk6ICdub25lJyB9KS5hcHBlbmRUbygnYm9keScpOwoKJCgnPHN0eWxlIHR5cGU9InRleHQvY3NzIj4ud2tpX2hpZGRlbiB7IGRpc3BsYXk6IG5vbmU7IH0gLndraV9zZXR0aW5nc19zYXZlZCB7IHdpZHRoOiAzNTBweDsgcGFkZGluZzogMTBweDsgZm9udC1zaXplOiAxNnB4OyBkaXNwbGF5OiBub25lOyB9IC53a2lfc2V0dGluZ3NfZGlzY2FyZGVkIHsgd2lkdGg6IDM1MHB4OyBwYWRkaW5nOiAxMHB4OyBmb250LXNpemU6IDE2cHg7IGRpc3BsYXk6IG5vbmU7ICB9ICAud2tpX2NsZWFyIHsgY2xlYXI6IGJvdGg7fSAud2tpX2J0biB7IGNvbG9yOiByZ2IoMTUzLCAxNTMsIDE1Myk7IGZvbnQtZmFtaWx5OiAiVWJ1bnR1IixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsgYm9yZGVyLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMTUpIHJnYmEoMCwgMCwgMCwgMC4xNSkgcmdiYSgwLCAwLCAwLCAwLjI1KTsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBwYWRkaW5nOiA0cHggMTJweDsgbWFyZ2luOiA1cHggMCAwOyBmb250LXNpemU6IDE0cHg7IGxpbmUtaGVpZ2h0OiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGN1cnNvcjogcG9pbnRlcjsgIHRleHQtc2hhZG93OiAwcHggMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNzUpOyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQ1LCAyNDUsIDI0NSk7IGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYigyNTUsIDI1NSwgMjU1KSwgcmdiKDIzMCwgMjMwLCAyMzApKTsgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14OyBib3JkZXItd2lkdGg6IDFweDsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgYm9yZGVyLWNvbG9yOiByZ2IoMTg3LCAxODcsIDE4NykgcmdiKDE4NywgMTg3LCAxODcpIHJnYigxNjIsIDE2MiwgMTYyKTsgLW1vei1ib3JkZXItdG9wLWNvbG9yczogbm9uZTsgLW1vei1ib3JkZXItcmlnaHQtY29sb3JzOiBub25lOyAtbW96LWJvcmRlci1ib3R0b20tY29sb3JzOiBub25lOyAtbW96LWJvcmRlci1sZWZ0LWNvbG9yczogbm9uZTsgYm9yZGVyLWltYWdlOiBub25lOyBib3JkZXItcmFkaXVzOiA0cHg7IGJveC1zaGFkb3c6IDBweCAxcHggMHB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKSBpbnNldCwgMHB4IDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjA1KTt9IC53a2lfYnRuOmhvdmVyIHsgY29sb3I6ICM3Nzc3Nzc7IGJveC1zaGFkb3c6IDBweCAxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsgfSAud2tpX3NldHRpbmdzX2Zvcm0geyB3aWR0aDogMzUwcHg7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgbGlzdC1zdHlsZS10eXBlOiBub25lO30gLndraV9zZXR0aW5nc19mb3JtIGxpIHsgcGFkZGluZzogMTBweCAwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWRlZGVkOyB9IC53a2lfc2V0dGluZ3NfZm9ybSBsaTpsYXN0LWNoaWxkIHsgYm9yZGVyLWJvdHRvbTogMDt9IC53a2lfc2V0dGluZ3NfZm9ybSBpbnB1dFt0eXBlPSJ0ZXh0Il0geyB3aWR0aDogOTglOyBtYXJnaW46IDhweCAwIDAgMDsgfSAud2tpX3NldHRpbmdzX2Zvcm0gaW5wdXRbdHlwZT0iY2hlY2tib3giXSB7IG1hcmdpbjogM3B4IDVweCA1cHg7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH0gICN3a2lfY29uZmlnX2J1dHRvbiB7Y3Vyc29yOiBwb2ludGVyOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBhZGRpbmc6IDEwcHg7IGNvbG9yOiByZ2IoMTM2LCAxMzYsIDEzNik7IGZvbnQtc2l6ZTogMC44MTI1ZW07IHZlcnRpY2FsLWFsaWduOiBib3R0b207fSAjd2tpX3Nyc19wb3B1cF93cmFwcGVyIHt3aWR0aDogMTIxcHg7IGhlaWdodDogMzBweDsgcG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiAxMTsgb3BhY2l0eTogMDsgfSAud2tpX3Nyc19wb3B1cF9pY29uIHsgd2lkdGg6IDMwcHg7IGJhY2tncm91bmQtY29sb3I6ICNlZmVmZWY7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNXB4IDA7IGZsb2F0OiBsZWZ0OyB9ICN3a2lfc3JzX3BvcHVwX21lc3NhZ2UgeyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB3aGl0ZTsgZmxvYXQ6IHJpZ2h0OyBwYWRkaW5nOiA1cHg7IHdpZHRoOiA4MXB4OyB0ZXh0LXNoYWRvdzogMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEpOyB9IC53a2lfc3JzX2FwcHJlbnRpY2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRjMwMEEyOyB9IC53a2lfc3JzX2d1cnUgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjOUUzNEI3OyB9IC53a2lfc3JzX21hc3RlciB7IGJhY2tncm91bmQtY29sb3I6ICM0OTY3RTA7IH0gLndraV9zcnNfZW5saWdodG5lZCB7IGJhY2tncm91bmQtY29sb3I6ICMwMEEyRjM7IH0gLndraV9zcnNfYnVybmVkIHsgYmFja2dyb3VuZC1jb2xvcjogIzRFNEU0RTsgfSAud2tpX2RlZmF1bHRfY3Vyc29yIHsgY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7IH0gLndraV9zdGFydF9tZXNzYWdleyBjb2xvcjogYmxhY2s7IGRpc3BsYXk6IGlubGluZTt9ICAjd2tpX2J1dHRvbiB7IHZlcnRpY2FsLWFsaWduOiBib3R0b207IGN1cnNvcjogcG9pbnRlcjsgfSAjd2tpX2J1dHRvbiBpIHttYXJnaW46IDEzcHggYXV0bzsgd2lkdGg6IDE4JTsgcG9zaXRpb246IGFic29sdXRlOyByaWdodDogMTBweDsgdG9wOiAwOyB9ICN3a2lfbWltaWNfYnV0dG9uIHttYXJnaW4tcmlnaHQ6IDEwcHg7IGJhY2tncm91bmQtY29sb3I6IHJnYigyNTEsIDI1MSwgMjUxKTsgY29sb3I6IHJnYigxMzYsIDEzNiwgMTM2KTsgdGV4dC1kZWNvcmF0aW9uOiBub25lOyBib3gtc2hhZG93OiAzcHggM3B4IDBweCByZ2IoMjI1LCAyMjUsIDIyNSk7fSAud2tpX2J1dHRvbl9pdGVtX2xhYmVsIHsgcGFkZGluZzogMTBweCAwIDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogJyArIHdraV9zZXR0aW5ncy53a2lfYnV0dG9uX2xhYmVsX3RleHRjb2xvciArICc7IHRleHQtc2hhZG93OiAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMSk7IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyBvdmVyZmxvdzogaGlkZGVuOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvcGFjaXR5OiAwLjU7IH0gLndraV9idXR0b25faXRlbV9sYWJlbDpob3ZlciB7IG9wYWNpdHk6IDE7IH0gLndraV9pdGVtX3dyYXBwZXIgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOyB3aWR0aDogODAlOyB9IC53a2lfdm9jYWJ1bGFyeSB7IGJhY2tncm91bmQtY29sb3I6ICNBQTAwRkY7IH0gLndraV9rYW5qaSB7IGJhY2tncm91bmQtY29sb3I6ICNGRjAwQUE7IH0gLndraV9yYWRpY2FsIHsgYmFja2dyb3VuZC1jb2xvcjogIzAwQUFGRjsgfSAud2tpX2NpbnphIHsgYmFja2dyb3VuZC1jb2xvcjogJyArIHdraV9zZXR0aW5ncy53a2lfYnV0dG9uX2xhYmVsX2JnY29sb3IgKyAnOyB9IC5xdGlweyBtYXgtd2lkdGg6IDM4MHB4ICFpbXBvcnRhbnQ7IH0gI2FkZGl0aW9uYWwtY29udGVudCB1bCBsaSB7IHdpZHRoOiAxNi42JSAhaW1wb3J0YW50OyB9ICNhZGRpdGlvbmFsLWNvbnRlbnQge3RleHQtYWxpZ246IGNlbnRlcjt9ICN3a2lfYnV0dG9uIGltZyB7IG1heC13aWR0aDogMTQlOyBtYXJnaW46IC0xMHB4OyB9ICNhZGRpdGlvbmFsLWNvbnRlbnQgI2Fuc3dlci1leGNlcHRpb24ge2xlZnQ6IDguMyUgIWltcG9ydGFudDt9IEBtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkgeyN3a2lfbWltaWNfYnV0dG9uIHtwYWRkaW5nOiA1cHg7IGZvbnQtc2l6ZTogMC43NWVtO30gLndraV9pdGVtX3dyYXBwZXIgeyBkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA0cHggNHB4IDNweDsgbWFyZ2luOiAtNHB4OyB9ICN3a2lfYnV0dG9uIGkgeyBwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiBhdXRvOyByaWdodDogYXV0bzsgbWFyZ2luOiAwOyB9IH0gQG1lZGlhIChtYXgtd2lkdGg6IDEyODBweCkgeyAjd2tpX2J1dHRvbiBpbWcgeyBtYXgtd2lkdGg6IDIyJTsgbWFyZ2luOiAtMTFweDsgfSBAbWVkaWEgKG1heC13aWR0aDogMTAyNHB4KSB7ICN3a2lfYnV0dG9uIGltZyB7IG1heC13aWR0aDogMjklOyBtYXJnaW46IC0xMXB4OyB9fSAgfSA8L3N0eWxlPicpLmFwcGVuZFRvKCdoZWFkJyk7CgoKaWYod2tpX3NldHRpbmdzLndraV9jb21ib19kaXNwbGF5ICE9PSB0cnVlKQp7CiAgICAkKCcjd2tpX2NvbWJvX2Rpc3BsYXknKS5oaWRlKCk7Cn0KCmlmKHdraV9zZXR0aW5ncy53a2lfc3JzX2xldmVsdXBfZGlzcGxheSAhPT0gdHJ1ZSkKewogICAgJCgnI3draV9zcnNfcG9wdXBfd3JhcHBlcicpLmhpZGUoKTsKfQoKaWYod2tpX2NvbWJvX3JlY29yZCA9PT0gbnVsbCkKewogICAgd2tpX2NvbWJvX3JlY29yZCA9IDA7Cn0KZWxzZQp7CiAgICBpZih3a2lfY29tYm9fcmVjb3JkICE9PSAwKQogICAgewogICAgICAgICQoJyN3a2lfY29tYm9fcmVjb3JkJykudGV4dCgnKCcgKyB3a2lfY29tYm9fcmVjb3JkICsgJyknKTsKICAgIH0KfQoKZnVuY3Rpb24gY2hlY2tBbnN3ZXIoKQp7CiAgICB3a2lfc3VibWl0dGVkX2Fuc3dlciA9ICQoJyN1c2VyLXJlc3BvbnNlJykudmFsKCk7CgogICAgaWYoIXdraV9zdWJtaXR0ZWRfYW5zd2VyKQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgYW5zd2VyRXhjZXB0aW9uID0gJC50cmltKCQoJyNhbnN3ZXItZXhjZXB0aW9uJykudGV4dCgpKTsKCiAgICBpZihhbnN3ZXJFeGNlcHRpb24uaW5kZXhPZignV2FuaUthbmkgaXMgbG9va2luZyBmb3IgdGhlJykgIT09IC0xKQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBjb25zb2xlLmxvZygnd2tpX3N1Ym1pdHRlZF9hbnN3ZXI6ICcgKyB3a2lfc3VibWl0dGVkX2Fuc3dlcik7CgogICAgaWYoYW5zd2VyRXhjZXB0aW9uLmxlbmd0aCA+IDApCiAgICB7CiAgICAgICAgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3JlY2VpdmVkID0gdHJ1ZTsKCiAgICAgICAgaWYoYW5zd2VyRXhjZXB0aW9uLmluZGV4T2YoJ2Fuc3dlciB3YXMgYSBiaXQgb2ZmJykgIT09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1dLSTogW2Fuc3dlckV4Y2VwdGlvbl0geW91ciBhbnN3ZXIgd2FzIGEgYml0IG9mZicpOwogICAgICAgICAgICAkKCcjd2tpX21pbWljX2J1dHRvbicpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjRjVGN0FCJyk7IC8vIHllbGxvdwogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi13YXJuaW5nLXNpZ24nKS5mYWRlT3V0KCkuZmFkZUluKCkuZmFkZU91dCgpLmZhZGVJbigpOwogICAgICAgICAgICB3a2lfZXhjZXB0aW9uX21lc3NhZ2VfdHlwZSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoYW5zd2VyRXhjZXB0aW9uLmluZGV4T2YoJ3Bvc3NpYmxlIHJlYWRpbmdzJykgIT09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1dLSTogW2Fuc3dlckV4Y2VwdGlvbl0gb3RoZXIgcG9zc2libGUgcmVhZGluZ3MnKTsKICAgICAgICAgICAgJCgnI3draV9idXR0b24gaScpLnJlbW92ZUNsYXNzKCkuYWRkQ2xhc3MoJ2ljb24tYXN0ZXJpc2snKTsKICAgICAgICAgICAgJCgnI3draV9taW1pY19idXR0b24nKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnI0NERTBGNycpOyAvLyBibHVlCiAgICAgICAgICAgIHdraV9leGNlcHRpb25fbWVzc2FnZV90eXBlID0gMjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihhbnN3ZXJFeGNlcHRpb24uaW5kZXhPZigncG9zc2libGUgbWVhbmluZ3MnKSAhPT0gLTEpCiAgICAgICAgewogICAgICAgICAgICBjb25zb2xlLmxvZygnV0tJOiBbYW5zd2VyRXhjZXB0aW9uXSBvdGhlciBwb3NzaWJsZSBtZWFuaW5ncycpOwogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi1hc3RlcmlzaycpOwogICAgICAgICAgICAkKCcjd2tpX21pbWljX2J1dHRvbicpLmNzcygnYmFja2dyb3VuZC1jb2xvcicsICcjQ0RFMEY3Jyk7IC8vIGJsdWUKICAgICAgICAgICAgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3R5cGUgPSAzOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGFuc3dlckV4Y2VwdGlvbi5pbmRleE9mKCdWaWV3IHRoZSBjb3JyZWN0JykgIT09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ1dLSTogW2Fuc3dlckV4Y2VwdGlvbl0gd3JvbmcgYW5zd2VyJyk7CiAgICAgICAgICAgICQoJyN3a2lfbWltaWNfYnV0dG9uJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGQkZCRkInKTsgLy8gZGVmYXVsdCBncmV5IGNvbG9yCgogICAgICAgICAgICBpZih3a2lfc2V0dGluZ3Mud2tpX2F1dG9fc2hvd19pbmZvID09PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKCcjb3B0aW9uLWl0ZW0taW5mbycpLmNsaWNrKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdraV9leGNlcHRpb25fbWVzc2FnZV90eXBlID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgLy8gdW5rbm93biBtZXNzYWdlCiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXS0k6IFthbnN3ZXJFeGNlcHRpb25dICcgKyBhbnN3ZXJFeGNlcHRpb24pOwogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi1pbmZvLXNpZ24nKTsKICAgICAgICAgICAgJCgnI3draV9taW1pY19idXR0b24nKS5jc3MoJ2JhY2tncm91bmQtY29sb3InLCAnI0Y3RDRDRCcpOyAvLyByZWQKICAgICAgICAgICAgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3R5cGUgPSAwOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB3a2lfZXhjZXB0aW9uX21lc3NhZ2VfcmVjZWl2ZWQgPSBmYWxzZTsKICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi1vaycpOwogICAgICAgICQoJyN3a2lfbWltaWNfYnV0dG9uJykuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJywgJyNGQkZCRkInKTsgLy8gZGVmYXVsdCBncmV5IGNvbG9yCiAgICB9CgogICAgaWYod2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3JlY2VpdmVkID09PSBmYWxzZSB8fCB3a2lfZXhjZXB0aW9uX21lc3NhZ2VfdHlwZSA+IDApCiAgICB7CiAgICAgICAgd2tpX2hpdF9jb21ibysrOwogICAgICAgICQoJyN3a2lfY29tYm8nKS50ZXh0KHdraV9oaXRfY29tYm8pOwogICAgICAgIGlmKHdraV9oaXRfY29tYm8gPiB3a2lfY29tYm9fcmVjb3JkKQogICAgICAgIHsKICAgICAgICAgICAgJC5qU3RvcmFnZS5zZXQoJ3draV9jb21ib19yZWNvcmQnLCB3a2lfaGl0X2NvbWJvKTsKICAgICAgICAgICAgJCgnI3draV9jb21ibycpLmZhZGVPdXQoKS5mYWRlSW4oKTsKICAgICAgICAgICAgJCgnI3draV9jb21ib19yZWNvcmQnKS5oaWRlKCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHdraV9oaXRfY29tYm8gPSAwOwogICAgICAgICQoJyN3a2lfY29tYm8nKS50ZXh0KHdraV9oaXRfY29tYm8pOwogICAgICAgICQoJyN3a2lfY29tYm9fcmVjb3JkJykudGV4dCgnKCcgKyAkLmpTdG9yYWdlLmdldCgnd2tpX2NvbWJvX3JlY29yZCcsIHdraV9oaXRfY29tYm8pICsgJyknKS5zaG93KCk7CiAgICB9CgogICAgaWYgKCQoJyNhbnN3ZXItZm9ybSBmb3JtIGZpZWxkc2V0JykuaGFzQ2xhc3MoJ2NvcnJlY3QnKSkKICAgIHsKICAgICAgICBjb25zb2xlLmxvZygnV0tJOiBDb3JyZWN0IGFuc3dlcicpOwoKICAgICAgICBpZiAod2tpX3NldHRpbmdzLndraV9hdWRpb19hdXRvcGxheSA9PT0gdHJ1ZSkKICAgICAgICB7CiAgICAgICAgICAgIGlmICgkKCcjb3B0aW9uLWF1ZGlvJykuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG1vdmVOZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKCIjb3B0aW9uLWF1ZGlvIikuY2xpY2soKTsKCiAgICAgICAgICAgICAgICAkKCcjb3B0aW9uLWF1ZGlvIGF1ZGlvJykuYmluZCgiZW5kZWQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgbW92ZU5leHQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIG1vdmVOZXh0KCk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoJCgnI2Fuc3dlci1mb3JtIGZvcm0gZmllbGRzZXQnKS5oYXNDbGFzcygnaW5jb3JyZWN0JykpCiAgICB7CiAgICAgICAgY29uc29sZS5sb2coJ1dLSTogV3JvbmcgYW5zd2VyJyk7CiAgICB9Cn0KCmZ1bmN0aW9uIG1vdmVOZXh0KCkKewogICAgY29uc29sZS5sb2coJ1dLSTogTW92aW5nIHRvIG5leHQgcXVlc3Rpb24nKTsKICAgICQoJyNhbnN3ZXItZm9ybSBidXR0b24nKS50cmlnZ2VyKCdjbGljaycpOwp9CgokKCcjYW5zd2VyLWZvcm0gYnV0dG9uJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSl7CiAgICBpZiAoZS5vcmlnaW5hbEV2ZW50ICE9PSB1bmRlZmluZWQgJiYgZS5vcmlnaW5hbEV2ZW50LnNjcmVlblggJiYgZS5vcmlnaW5hbEV2ZW50LnNjcmVlblkpCiAgICB7CiAgICAgICAgaWYoJCgnI3VzZXItcmVzcG9uc2UnKS52YWwoKSkKICAgICAgICB7CiAgICAgICAgCXNldFRpbWVvdXQoY2hlY2tBbnN3ZXIsIHdraV9zZXR0aW5ncy53a2lfdGltZXJfc2hvd19uZXh0X2l0ZW0pOwogICAgICAgIH0KICAgIH0KfSk7CgokKCcjcXVlc3Rpb24tdHlwZScpLmJpbmQoJ0RPTU5vZGVJbnNlcnRlZCcsIGZ1bmN0aW9uIChldmVudCkKewogICAgaWYoZXZlbnQudGFyZ2V0Lm5vZGVOYW1lICE9ICdTVFJPTkcnKQogICAgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW0gPSAkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKTsKICAgIHdraV9jdXJyZW50X3F1ZXN0aW9uX3R5cGUgPSAkLmpTdG9yYWdlLmdldCgncXVlc3Rpb25UeXBlJyk7CgogICAgaWYod2tpX2pzdG9yZWRfY3VycmVudF9pdGVtWydrYW4nXSkKICAgIHsKICAgICAgICB3a2lfY3VycmVudF90eXBlID0gJ2thbmppJzsKICAgICAgICB3a2lfY3VycmVudF9pdGVtID0gd2tpX2pzdG9yZWRfY3VycmVudF9pdGVtWydrYW4nXTsKICAgIH0KICAgIGVsc2UgaWYod2tpX2pzdG9yZWRfY3VycmVudF9pdGVtWyd2b2MnXSkKICAgIHsKICAgICAgICB3a2lfY3VycmVudF90eXBlID0gJ3ZvY2FidWxhcnknOwogICAgICAgIHdraV9jdXJyZW50X2l0ZW0gPSB3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW1bJ3ZvYyddOwogICAgfQogICAgZWxzZSBpZih3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW1bJ3JhZCddKQogICAgewogICAgICAgIHdraV9jdXJyZW50X3R5cGUgPSAncmFkaWNhbCc7CiAgICAgICAgaWYod2tpX2pzdG9yZWRfY3VycmVudF9pdGVtWydyYWQnXS5pbmRleE9mKCcucG5nJykgIT09IC0xKQogICAgICAgIHsKICAgICAgICAgICAgd2tpX2N1cnJlbnRfaXRlbSA9ICc8aW1nIHNyYz0iaHR0cDovL3MzLndhbmlrYW5pLmNvbS9pbWFnZXMvcmFkaWNhbHMvJyt3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW1bJ3JhZCddKyciIC8+JzsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgd2tpX2N1cnJlbnRfaXRlbSA9IHdraV9qc3RvcmVkX2N1cnJlbnRfaXRlbVsncmFkJ107CiAgICAgICAgfQogICAgfQoKICAgIGNvbnNvbGUubG9nKCd3a2lfY3VycmVudF9pdGVtOiAnICsgd2tpX2N1cnJlbnRfaXRlbSk7CiAgICBjb25zb2xlLmxvZygnd2tpX2N1cnJlbnRfdHlwZTogJyArIHdraV9jdXJyZW50X3R5cGUpOwogICAgY29uc29sZS5sb2coJ3draV9jdXJyZW50X3F1ZXN0aW9uX3R5cGU6ICcgKyB3a2lfY3VycmVudF9xdWVzdGlvbl90eXBlKTsKCiAgICBpZih3a2lfc3JzX2xldmVsW3draV9qc3RvcmVkX2N1cnJlbnRfaXRlbVsnc3JzJ10gKyAxXSkKICAgIHsKICAgICAgICBjb25zb2xlLmxvZygnV0tJOiB0aGlzIGl0ZW0gd2lsbCBsZXZlbCB1cCB0byAnICsgd2tpX3Nyc19sZXZlbFt3a2lfanN0b3JlZF9jdXJyZW50X2l0ZW1bJ3NycyddICsgMV0gKyAnJyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgY29uc29sZS5sb2coJ1dLSTogdGhpcyBpdGVtIHdpbGwgbm90IGxldmVsIHVwIHRvIGEgbmV3IFNSUyBjbGFzcycpOwogICAgfQoKICAgIGlmICgod2tpX3ByZXZpb3VzX2l0ZW0gIT0gd2tpX2N1cnJlbnRfaXRlbSkgfHwgKHdraV9wcmV2aW91c19pdGVtID09IHdraV9jdXJyZW50X2l0ZW0gJiYgd2tpX2N1cnJlbnRfcXVlc3Rpb25fdHlwZSAhPSB3a2lfcHJldmlvdXNfcXVlc3Rpb25fdHlwZSkpCiAgICB7CiAgICAgICAgaWYgKHdraV9wcmV2aW91c19pdGVtICE9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgaWYoIXdraV9pdGVtc19hcnJheVt3a2lfcHJldmlvdXNfdHlwZSArICdfJyArIHdraV9qc3RvcmVkX3ByZXZpb3VzX2l0ZW1bJ2lkJ11dKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB3a2lfaXRlbXNfYXJyYXlbd2tpX3ByZXZpb3VzX3R5cGUgKyAnXycgKyB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydpZCddXSA9IHt9OwogICAgICAgICAgICAgICAgd2tpX2l0ZW1zX2FycmF5W3draV9wcmV2aW91c190eXBlICsgJ18nICsgd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbVsnaWQnXV1bJ3ZpZXdzJ10gPSAxOwogICAgICAgICAgICAgICAgd2tpX2l0ZW1zX2FycmF5W3draV9wcmV2aW91c190eXBlICsgJ18nICsgd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbVsnaWQnXV1bJ2NvcnJlY3RfYW5zd2VycyddID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHdraV9pdGVtc19hcnJheVt3a2lfcHJldmlvdXNfdHlwZSArICdfJyArIHdraV9qc3RvcmVkX3ByZXZpb3VzX2l0ZW1bJ2lkJ11dWyd2aWV3cyddKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmKHdraV9leGNlcHRpb25fbWVzc2FnZV9yZWNlaXZlZCA9PT0gZmFsc2UgfHwgd2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3R5cGUgPiAwKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB3a2lfaXRlbXNfYXJyYXlbd2tpX3ByZXZpb3VzX3R5cGUgKyAnXycgKyB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydpZCddXVsnY29ycmVjdF9hbnN3ZXJzJ10rKzsKCiAgICAgICAgICAgICAgICBpZigod2tpX2l0ZW1zX2FycmF5W3draV9wcmV2aW91c190eXBlICsgJ18nICsgd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbVsnaWQnXV1bJ3ZpZXdzJ10gPT0gMiAmJiB3a2lfaXRlbXNfYXJyYXlbd2tpX3ByZXZpb3VzX3R5cGUgKyAnXycgKyB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydpZCddXVsnY29ycmVjdF9hbnN3ZXJzJ10gPT0gMikgfHwgd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbVsncmFkJ10pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYod2tpX3Nyc19sZXZlbFt3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydzcnMnXSArIDFdKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3draV9zcnNfcG9wdXBfbWVzc2FnZScpLnRleHQod2tpX3Nyc19sZXZlbFt3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydzcnMnXSArIDFdKS5yZW1vdmVDbGFzcygpLmFkZENsYXNzKCd3a2lfc3JzXycgKyB3a2lfc3JzX2xldmVsW3draV9qc3RvcmVkX3ByZXZpb3VzX2l0ZW1bJ3NycyddICsgMV0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI3draV9zcnNfcG9wdXBfd3JhcHBlcicpLmFuaW1hdGUoeyd0b3AnOiBzcnNfd3JhcHBlcl91cHBlciwgJ29wYWNpdHknOiAxfSwgODAwLCBmdW5jdGlvbigpIHsgICQodGhpcykuZGVsYXkoODAwKS5hbmltYXRlKHsnb3BhY2l0eSc6IDB9LCA1MDAsIGZ1bmN0aW9uKCkgeyAkKHRoaXMpLmNzcygndG9wJywgc3JzX3dyYXBwZXJfdG9wKTsgfSApOyB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICQoJyN3a2lfbWltaWNfYnV0dG9uJykucXRpcCgnZGVzdHJveScsIHRydWUpOwogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbicpLnJlbW92ZUNsYXNzKCk7CgogICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiAud2tpX2J1dHRvbl9pdGVtX2xhYmVsJykuaHRtbCh3a2lfcHJldmlvdXNfaXRlbSkucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnd2tpX2J1dHRvbl9pdGVtX2xhYmVsIHdraV9jaW56YScpOwoKICAgICAgICAgICAgaWYod2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3JlY2VpdmVkID09PSB0cnVlKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkKCcjd2tpX21pbWljX2J1dHRvbicpLnF0aXAoe2NvbnRlbnQ6IHsgdGV4dDogd2tpX2Fuc3dlcl9leGNlcHRpb25fbWVzc2FnZVt3a2lfZXhjZXB0aW9uX21lc3NhZ2VfdHlwZV0gfSwgcG9zaXRpb246IHsgbXk6ICdib3R0b20gY2VudGVyJywgYXQ6ICd0b3AgY2VudGVyJywgdmlld3BvcnQ6ICQod2luZG93KX0sIHN0eWxlOiAncXRpcC1ib290c3RyYXAnfSk7CgogICAgICAgICAgICAgICAgaWYod2tpX2V4Y2VwdGlvbl9tZXNzYWdlX3R5cGUgPT0gMCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkKCcjd2tpX2J1dHRvbiBpJykucmVtb3ZlQ2xhc3MoKS5hZGRDbGFzcygnaWNvbi1yZW1vdmUnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL3Jlc2V0IHRoZSB2YXIKICAgICAgICAgICAgICAgIHdraV9leGNlcHRpb25fbWVzc2FnZV9yZWNlaXZlZCA9IGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB3a2lfcHJldmlvdXNfaXRlbV91cmwgPSAnaHR0cHM6Ly93d3cud2FuaWthbmkuY29tLyc7CgogICAgICAgICAgICBpZiAod2tpX3ByZXZpb3VzX3R5cGUgPT0gJ2thbmppJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgd2tpX3ByZXZpb3VzX2l0ZW1fdXJsICs9ICdrYW5qaS8nICsgd2tpX3ByZXZpb3VzX2l0ZW0gKyAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAod2tpX3ByZXZpb3VzX3R5cGUgPT0gJ3ZvY2FidWxhcnknKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB3a2lfcHJldmlvdXNfaXRlbV91cmwgKz0gJ3ZvY2FidWxhcnkvJyArIHdraV9wcmV2aW91c19pdGVtICsgJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIHJhZGljYWxOYW1lID0gd2tpX2pzdG9yZWRfcHJldmlvdXNfaXRlbS5lblswXTsKICAgICAgICAgICAgICAgIHdraV9wcmV2aW91c19pdGVtX3VybCArPSAncmFkaWNhbHMvJyArIHJhZGljYWxOYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnICcsICctJykgKyAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc3JzX3dyYXBwZXJfdG9wID0gcGFyc2VJbnQoJCgiI3draV9taW1pY19idXR0b24iKS5vZmZzZXQoKS50b3AgKyAkKCIjd2tpX21pbWljX2J1dHRvbiIpLm91dGVySGVpZ2h0KCkpOwogICAgICAgICAgICBzcnNfd3JhcHBlcl91cHBlciA9IHBhcnNlSW50KHNyc193cmFwcGVyX3RvcCAtICgkKCIjd2tpX21pbWljX2J1dHRvbiIpLm91dGVySGVpZ2h0KCkgKiAyKSk7CgogICAgICAgICAgICAkKCcjd2tpX3Nyc19wb3B1cF93cmFwcGVyJykuY3NzKHsndG9wJzogc3JzX3dyYXBwZXJfdG9wICsgJ3B4JywgJ2xlZnQnOiBwYXJzZUludCgkKCIjd2tpX21pbWljX2J1dHRvbiIpLm91dGVyV2lkdGgoKSAvIDMgKyAkKCIjd2tpX21pbWljX2J1dHRvbiIpLm9mZnNldCgpLmxlZnQpICsgJ3B4J30pOwogICAgICAgIH0KCgogICAgICAgICQoJyN3a2lfYnV0dG9uJykubm90KCcuZGlzYWJsZWQnKS5xdGlwKAogICAgICAgIHsKICAgICAgICAgICAgaGlkZToKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZXZlbnQ6ICdjbGljayB1bmZvY3VzJwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY29udGVudDoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdGl0bGU6ICdQcmV2aW91cyAnICsgd2tpX3ByZXZpb3VzX3R5cGUgKyAnLiBZb3UgYW5zd2VyZWQgPHN0cm9uZz4nICsgd2tpX3N1Ym1pdHRlZF9hbnN3ZXIgKyAnPC9zdHJvbmc+JywKICAgICAgICAgICAgICAgIHRleHQ6ICc8aWZyYW1lIGlkPSJ3a2lfaWZyYW1lX3ByZXZpb3VzX2l0ZW0iIHNyYz0iJyArIHdraV9wcmV2aW91c19pdGVtX3VybCArICciIGZyYW1lYm9yZGVyPSIwIiBtYXJnaW5oZWlnaHQ9IjAiIHN0eWxlPSJ3aWR0aDozNTBweDsgaGVpZ2h0OiAyNTBweDsgb3ZlcmZsb3cteDogaGlkZGVuOyBvdmVyZmxvdy15OiBzY3JvbGw7IG9wYWNpdHk6IDA7Ij48L2lmcmFtZT4nCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBvc2l0aW9uOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteTogJ2JvdHRvbSBjZW50ZXInLAogICAgICAgICAgICAgICAgYXQ6ICd0b3AgY2VudGVyJywKICAgICAgICAgICAgICAgIHZpZXdwb3J0OiAkKHdpbmRvdyksCiAgICAgICAgICAgICAgICBhZGp1c3Q6IHsgbWV0aG9kOiAnc2hpZnQgZmxpcCcgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBzaG93OgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBldmVudDogJ2NsaWNrJywKICAgICAgICAgICAgICAgIHNvbG86IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRzOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB2aXNpYmxlOiBmdW5jdGlvbihldmVudCwgYXBpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICQoJ2lmcmFtZSN3a2lfaWZyYW1lX3ByZXZpb3VzX2l0ZW0nKS5sb2FkKGZ1bmN0aW9uKCkKICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2tpX2lmcmFtZV9jb250ZW50ID0gJCh0aGlzKS5jb250ZW50cygpLmZpbmQoJ2JvZHknKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHdraV9pZnJhbWVfY29udGVudC5hcHBlbmQoJzxzdHlsZT4uZm9vdGVyLWFkanVzdG1lbnQsIGZvb3RlciB7ZGlzcGxheTogbm9uZSAhaW1wb3J0YW50fSBib2R5IHttYXJnaW46IDEwcHggIWltcG9ydGFudDt9IHNlY3Rpb24ge21hcmdpbjogMCAhaW1wb3J0YW50OyB9IC5jb250YWluZXIge21hcmdpbjogMCAhaW1wb3J0YW50OyB9IC5sZXZlbC1pY29uIHsgbWluLWhlaWdodDogNTJweDsgZmxvYXQ6IGxlZnQ7fSAudm9jYWJ1bGFyeS1pY29uLCAua2FuamktaWNvbiwgLnJhZGljYWwtaWNvbiB7ZmxvYXQ6IHJpZ2h0OyB3aWR0aDogODMlOyBoZWlnaHQ6IGF1dG87IHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50OyBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7IG1pbi1oZWlnaHQ6IDUycHg7fSAud2tpX2lmcmFtZV9oZWFkZXIge2ZvbnQtd2VpZ2h0OiBib2xkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGxpbmUtaGVpZ2h0OiA1NXB4fSAud2tpX2lmcmFtZV9zZWN0aW9uIHttYXJnaW46IDMwcHggMCAwICFpbXBvcnRhbnR9IC53a2lfaWZyYW1lX3NlY3Rpb246YWZ0ZXIge2NsZWFyOiBib3RoOyB9IC53a2lfaWZyYW1lX3NlY3Rpb24gaDIge2JvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMjEyLCAyMTIsIDIxMikgIWltcG9ydGFudDsgbWFyZ2luOiAxNXB4IDAgN3B4ICFpbXBvcnRhbnQ7fSAud2tpX2lmcmFtZV9oZWFkZXIgLmVubGFyZ2UtaG92ZXIgeyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0gPC9zdHlsZT4nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3a2lfaWZyYW1lX2l0ZW0gPSB3a2lfaWZyYW1lX2NvbnRlbnQuZmluZCgnaGVhZGVyPmgxJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3a2lfaWZyYW1lX2l0ZW1fcHJvZ3Jlc3MgPSB3a2lfaWZyYW1lX2NvbnRlbnQuZmluZCgnI3Byb2dyZXNzJykuYWRkQ2xhc3MoJ3draV9pZnJhbWVfc2VjdGlvbicpLndyYXAoJzxkaXY+PC9kaXY+JykucGFyZW50KCkuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgd2tpX2lmcmFtZV9pdGVtX2FsdGVybmF0aXZlX21lYW5pbmcgPSB3a2lfaWZyYW1lX2NvbnRlbnQuZmluZCgnI2luZm9ybWF0aW9uJykuYWRkQ2xhc3MoJ2luZGl2aWR1YWwtaXRlbScpLndyYXAoJzxkaXY+PC9kaXY+JykucGFyZW50KCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZih3a2lfaXRlbXNfYXJyYXlbd2tpX3ByZXZpb3VzX3R5cGUgKyAnXycgKyB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtWydpZCddXVsnY29ycmVjdF9hbnN3ZXJzJ10gPT0gMikKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdraV9yZWFkaW5nc19hbmRfbWVhbmluZ3MgPSB3a2lfaWZyYW1lX2NvbnRlbnQuZmluZCgnaDI6Y29udGFpbnMoIlJlYWRpbmciKSxoMjpjb250YWlucygiTWVhbmluZyIpLGgyOmNvbnRhaW5zKCJOYW1lIiknKS5wYXJlbnQoJ3NlY3Rpb24nKS5hZGRDbGFzcygnd2tpX2lmcmFtZV9zZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3a2lfaWZyYW1lX2NvbnRlbnQuYXBwZW5kKCc8aDIgY2xhc3M9IndraV9pZnJhbWVfaGVhZGVyIj4nICsgd2tpX2lmcmFtZV9pdGVtLmh0bWwoKSArICc8L2gyPicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2tpX2lmcmFtZV9jb250ZW50LmFwcGVuZCh3a2lfaWZyYW1lX2l0ZW1fYWx0ZXJuYXRpdmVfbWVhbmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3a2lfaWZyYW1lX2NvbnRlbnQuYXBwZW5kKHdraV9yZWFkaW5nc19hbmRfbWVhbmluZ3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih3a2lfcHJldmlvdXNfcXVlc3Rpb25fdHlwZS5pbmRleE9mKCdyZWFkaW5nJykgIT09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3a2lfaWZyYW1lX2l0ZW1fcmVhZGluZyA9IHdraV9pZnJhbWVfY29udGVudC5maW5kKCdoMjpjb250YWlucygiUmVhZGluZyIpJykucGFyZW50KCdzZWN0aW9uJykuYWRkQ2xhc3MoJ3draV9pZnJhbWVfc2VjdGlvbicpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aDI+JywgeydjbGFzcycgOiAnd2tpX2lmcmFtZV9oZWFkZXInfSkuYXBwZW5kVG8od2tpX2lmcmFtZV9jb250ZW50KS5hcHBlbmQod2tpX2lmcmFtZV9pdGVtLmNoaWxkcmVuKCkpLmFwcGVuZCgnPGJyIHN0eWxlPSJjbGVhcjogYm90aDsiIC8+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2tpX2lmcmFtZV9jb250ZW50LmFwcGVuZCh3a2lfaWZyYW1lX2l0ZW1fcmVhZGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHdraV9wcmV2aW91c19xdWVzdGlvbl90eXBlLmluZGV4T2YoJ21lYW5pbmcnKSAhPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYod2tpX3ByZXZpb3VzX3R5cGUgPT0gJ3JhZGljYWwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHdraV9pZnJhbWVfaXRlbV9tZWFuaW5nID0gd2tpX2lmcmFtZV9jb250ZW50LmZpbmQoJ2gyOmNvbnRhaW5zKCJOYW1lIiknKS5wYXJlbnQoJ3NlY3Rpb24nKS5hZGRDbGFzcygnd2tpX2lmcmFtZV9zZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3a2lfaWZyYW1lX2l0ZW1fbWVhbmluZyA9IHdraV9pZnJhbWVfY29udGVudC5maW5kKCdoMjpjb250YWlucygiTWVhbmluZyIpJykucGFyZW50KCdzZWN0aW9uJykuYWRkQ2xhc3MoJ3draV9pZnJhbWVfc2VjdGlvbicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2tpX2lmcmFtZV9jb250ZW50LmFwcGVuZCgnPGgyIGNsYXNzPSJ3a2lfaWZyYW1lX2hlYWRlciI+JyArIHdraV9pZnJhbWVfaXRlbS5odG1sKCkgKyAnPC9oMj4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3a2lfaWZyYW1lX2NvbnRlbnQuYXBwZW5kKHdraV9pZnJhbWVfaXRlbV9hbHRlcm5hdGl2ZV9tZWFuaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3a2lfaWZyYW1lX2NvbnRlbnQuYXBwZW5kKHdraV9pZnJhbWVfaXRlbV9tZWFuaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgd2tpX2lmcmFtZV9jb250ZW50LmFwcGVuZCh3a2lfaWZyYW1lX2l0ZW1fcHJvZ3Jlc3MpOwoKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ29wYWNpdHknLCAnMScpOwoKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3R5bGU6ICdxdGlwLWJvb3RzdHJhcCcKICAgICAgICB9KTsKCiAgICB9Cn0pOwoKCiQoJyNxdWVzdGlvbi10eXBlJykuYmluZCgnRE9NTm9kZVJlbW92ZWQnLCBmdW5jdGlvbiAoZXZlbnQpCnsKICAgIGlmKGV2ZW50LnRhcmdldC5ub2RlTmFtZSA9PSAnU1RST05HJykKICAgIHsKICAgICAgICB3a2lfcHJldmlvdXNfaXRlbSA9IHdraV9jdXJyZW50X2l0ZW07CiAgICAgICAgd2tpX3ByZXZpb3VzX3R5cGUgPSB3a2lfY3VycmVudF90eXBlOwogICAgICAgIHdraV9wcmV2aW91c19xdWVzdGlvbl90eXBlID0gd2tpX2N1cnJlbnRfcXVlc3Rpb25fdHlwZTsKICAgICAgICB3a2lfanN0b3JlZF9wcmV2aW91c19pdGVtID0gd2tpX2pzdG9yZWRfY3VycmVudF9pdGVtOwoKICAgICAgICBjb25zb2xlLmxvZygnV0tJOiBQcmV2aW91cyBpdGVtIHJlZ2lzdGVyZWQnKTsKICAgIH0KfSk7CgokKCcjdXNlci1yZXNwb25zZScpLmtleWRvd24oIGZ1bmN0aW9uKGUpIHsKICAgIHZhciBrZXkgPSBlLmNoYXJDb2RlID8gZS5jaGFyQ29kZSA6IGUua2V5Q29kZSA/IGUua2V5Q29kZSA6IDA7CgogICAgaWYgKGtleSA9PSAxMykKICAgIHsKICAgICAgICBzZXRUaW1lb3V0KGNoZWNrQW5zd2VyLCB3a2lfc2V0dGluZ3Mud2tpX3RpbWVyX3Nob3dfbmV4dF9pdGVtKTsKICAgIH0KfSk7CgoKdmFyIGxhYmVsX3RvZ2dsZSA9IDA7CiQoIiN3a2lfYnV0dG9uIikuYmluZCh7CiAgICBtb3VzZWVudGVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGl0ZW1fbGFiZWwgPSAkKHRoaXMpLmZpbmQoIi53a2lfaXRlbV93cmFwcGVyIik7CiAgICAgICAgaWYoaXRlbV9sYWJlbC5vdXRlcldpZHRoKCkgPCBpdGVtX2xhYmVsWzBdLnNjcm9sbFdpZHRoKQogICAgICAgIHsKICAgICAgICAgICAgaXRlbV9sYWJlbC5hbmltYXRlKAogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICB3aWR0aDogIjEwMCUiCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgIDIwMAogICAgICAgICAgICApOwogICAgICAgICAgICAkKHRoaXMpLmZpbmQoImkiKS5mYWRlT3V0KDEwMCk7CiAgICAgICAgICAgIGxhYmVsX3RvZ2dsZSA9IDE7CiAgICAgICAgfQoKICAgIH0sCiAgICBtb3VzZWxlYXZlOiBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGl0ZW1fbGFiZWwgPSAkKHRoaXMpLmZpbmQoIi53a2lfaXRlbV93cmFwcGVyIik7CiAgICAgICAgaWYobGFiZWxfdG9nZ2xlID09PSAxKQogICAgICAgIHsKICAgICAgICAgICAgaXRlbV9sYWJlbC5hbmltYXRlKAogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICB3aWR0aDogIjgwJSIKICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgMjAwCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICQodGhpcykuZmluZCgiaSIpLmZhZGVJbigxMDApOwogICAgICAgICAgICBsYWJlbF90b2dnbGUgPSAwOwogICAgICAgIH0KICAgIH0KfSk7CgoKJCgnI3draV9jb25maWdfYnV0dG9uJykucXRpcCh7CiAgICBzaG93OgogICAgewogICAgICAgIGV2ZW50OiAnY2xpY2snLAogICAgICAgIGVmZmVjdDogZnVuY3Rpb24oKQogICAgICAgIHsKICAgICAgICAgICAgJCgnI3draV9tb2RhbF9iYWNrZ3JvdW5kJykuZmFkZUluKCk7CiAgICAgICAgICAgICQodGhpcykuZmFkZUluKCk7CiAgICAgICAgfQogICAgfSwKICAgIGhpZGU6CiAgICB7CiAgICAgICAgZXZlbnQ6ICd1bmZvY3VzJywKICAgICAgICBlZmZlY3Q6IGZ1bmN0aW9uKCkKICAgICAgICB7CiAgICAgICAgICAgICQoJyN3a2lfbW9kYWxfYmFja2dyb3VuZCcpLmZhZGVPdXQoKTsKICAgICAgICAgICAgJCh0aGlzKS5mYWRlT3V0KCk7CiAgICAgICAgfQogICAgfSwKICAgIGV2ZW50czogewoJICAgcmVuZGVyOiBmdW5jdGlvbihldmVudCwgYXBpKSB7CgkgICAgICAgJCgnI3draV9zZXR0aW5nc19jYW5jZWwnKS5iaW5kKCdjbGljaycsIHNldHRpbmdzQ2FuY2VsKTsKICAgICAgICAgICAkKCcjd2tpX3NldHRpbmdzX3NhdmUnKS5iaW5kKCdjbGljaycsIHNldHRpbmdzU2F2ZSk7CiAgICAgICB9CiAgICB9LAogICAgY29udGVudDoKICAgIHsKICAgICAgICB0aXRsZTogJzxoMiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+V2FuaUthbmkgSW1wcm92ZTwvaDI+JywKICAgICAgICB0ZXh0OiAnPHVsIGNsYXNzPSJ3a2lfc2V0dGluZ3NfZm9ybSI+PGxpPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IndraV9zZXR0aW5nc19hdWRpb19hdXRvcGxheSIgJysod2tpX3NldHRpbmdzLndraV9hdWRpb19hdXRvcGxheSA9PT0gdHJ1ZSA/ICdjaGVja2VkJyA6ICcnKSsnIC8+IDxsYWJlbCBmb3I9IndraV9zZXR0aW5nc19hdWRpb19hdXRvcGxheSI+UGxheSB2b2NhYnVsYXJ5IGF1ZGlvIHdoZW4gYXZhaWxhYmxlPC9sYWJlbD48L2xpPjxsaT48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ3a2lfc2V0dGluZ3NfY29tYm9fZGlzcGxheSIgJysod2tpX3NldHRpbmdzLndraV9jb21ib19kaXNwbGF5ID09PSB0cnVlID8gJ2NoZWNrZWQnIDogJycpKycgLz4gPGxhYmVsIGZvcj0id2tpX3NldHRpbmdzX2NvbWJvX2Rpc3BsYXkiPlNob3cgY29tYm8gaW5mb3JtYXRpb248L2xhYmVsPjwvbGk+PGxpPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IndraV9zZXR0aW5nc19zcnNfbGV2ZWx1cF9kaXNwbGF5IiAnKyh3a2lfc2V0dGluZ3Mud2tpX3Nyc19sZXZlbHVwX2Rpc3BsYXkgPT09IHRydWUgPyAnY2hlY2tlZCcgOiAnJykrJyAvPiA8bGFiZWwgZm9yPSJ3a2lfc2V0dGluZ3Nfc3JzX2xldmVsdXBfZGlzcGxheSI+V2hlbiBhbiBpdGVtIGxldmVsIHVwLCBkaXNwbGF5IHRoZSBuZXcgU1JTIGxldmVsPC9sYWJlbD48L2xpPjxsaT48aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJ3a2lfc2V0dGluZ3NfYXV0b19zaG93X2luZm8iICcrKHdraV9zZXR0aW5ncy53a2lfYXV0b19zaG93X2luZm8gPT09IHRydWUgPyAnY2hlY2tlZCcgOiAnJykrJyAvPiA8bGFiZWwgZm9yPSJ3a2lfc2V0dGluZ3NfYXV0b19zaG93X2luZm8iPkRpc3BsYXkgdGhlIGl0ZW0gaW5mb3JtYXRpb24gYWZ0ZXIgYSB3cm9uZyBhbnN3ZXI8L2xhYmVsPjwvbGk+PGxpPkJ1dHRvblwncyBiYWNrZ3JvdW5kIGNvbG9yIChkZWZhdWx0OiAjQTJBMkEyKTxiciAvPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0id2tpX3NldHRpbmdzX2J1dHRvbl9sYWJlbF9iZ2NvbG9yIiB2YWx1ZT0iJyt3a2lfc2V0dGluZ3Mud2tpX2J1dHRvbl9sYWJlbF9iZ2NvbG9yKyciIC8+PC9saT48bGk+QnV0dG9uXCdzIHRleHQgY29sb3IgIChkZWZhdWx0OiAjRkZGRkZGKTxiciAvPjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0id2tpX3NldHRpbmdzX2J1dHRvbl9sYWJlbF90ZXh0Y29sb3IiIHZhbHVlPSInK3draV9zZXR0aW5ncy53a2lfYnV0dG9uX2xhYmVsX3RleHRjb2xvcisnIiAvPjwvbGk+PGxpPlRpbWUgdG8gd2FpdCBiZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0IHF1ZXN0aW9uIChtaWxpc2Vjb25kcywgZGVmYXVsdDogMCk8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IndraV9zZXR0aW5nc190aW1lcl9zaG93X25leHRfaXRlbSIgdmFsdWU9Iicrd2tpX3NldHRpbmdzLndraV90aW1lcl9zaG93X25leHRfaXRlbSsnIiAvPjwvbGk+PGxpPjxhIGlkPSJ3a2lfc2V0dGluZ3NfY2FuY2VsIiBjbGFzcz0id2tpX2J0biIgc3R5bGU9ImZsb2F0OiBsZWZ0OyI+Q2FuY2VsPC9hPjxhIGlkPSJ3a2lfc2V0dGluZ3Nfc2F2ZSIgY2xhc3M9IndraV9idG4iIHN0eWxlPSJmbG9hdDogcmlnaHQ7Ij5TYXZlPC9hPjxiciBjbGFzcz0id2tpX2NsZWFyIiAvPjwvbGk+PC91bD48ZGl2IGNsYXNzPSJ3a2lfc2V0dGluZ3Nfc2F2ZWQiPlNldHRpbmdzIHNhdmVkPC9kaXY+PGRpdiBjbGFzcz0id2tpX3NldHRpbmdzX2Rpc2NhcmRlZCI+Q2hhbmdlcyBkaXNjYXJkZWQ8L2Rpdj4nCiAgICB9LAogICAgcG9zaXRpb246CiAgICB7CiAgICAgICAgbXk6ICdjZW50ZXInLCBhdDogJ2NlbnRlcicsCiAgICAgICAgdGFyZ2V0OiAkKHdpbmRvdykKICAgIH0sCiAgICBzdHlsZTogewogICAgICAgIGNsYXNzZXM6ICdxdGlwLWJvb3RzdHJhcCcKICAgIH0KfSk7CgpmdW5jdGlvbiBzZXR0aW5nc0NhbmNlbCgpCnsKICAgIGNvbnNvbGUubG9nKCdXS0k6IHNldHRpbmdzIG5vdCBzYXZlZCcpOwogICAgJCgnLndraV9zZXR0aW5nc19mb3JtJykuc2xpZGVVcCgpOwogICAgJCgnLndraV9zZXR0aW5nc19kaXNjYXJkZWQnKS5zbGlkZURvd24oKTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI3draV9jb25maWdfYnV0dG9uJykucXRpcCgiaGlkZSIpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJy53a2lfc2V0dGluZ3NfZm9ybScpLnNob3coKTsKICAgICAgICAgICAgJCgnLndraV9zZXR0aW5nc19zYXZlZCcpLmhpZGUoKTsKICAgICAgICAgICAgJCgnLndraV9zZXR0aW5nc19kaXNjYXJkZWQnKS5oaWRlKCk7CiAgICAgICAgfSwgMTAwMCk7CiAgICB9LCAxMzAwKTsKfQoKZnVuY3Rpb24gc2V0dGluZ3NTYXZlKCkKewogICAgd2tpX3NldHRpbmdzLndraV9hdWRpb19hdXRvcGxheSA9ICQoIiN3a2lfc2V0dGluZ3NfYXVkaW9fYXV0b3BsYXkiKS5pcygiOmNoZWNrZWQiKSA/IHRydWUgOiBmYWxzZTsKICAgIHdraV9zZXR0aW5ncy53a2lfdGltZXJfc2hvd19uZXh0X2l0ZW0gPSAkKCcjd2tpX3NldHRpbmdzX3RpbWVyX3Nob3dfbmV4dF9pdGVtJykudmFsKCk7CiAgICB3a2lfc2V0dGluZ3Mud2tpX2J1dHRvbl9sYWJlbF9iZ2NvbG9yID0gJCgnI3draV9zZXR0aW5nc19idXR0b25fbGFiZWxfYmdjb2xvcicpLnZhbCgpOwogICAgd2tpX3NldHRpbmdzLndraV9idXR0b25fbGFiZWxfdGV4dGNvbG9yID0gJCgnI3draV9zZXR0aW5nc19idXR0b25fbGFiZWxfdGV4dGNvbG9yJykudmFsKCk7CiAgICB3a2lfc2V0dGluZ3Mud2tpX2NvbWJvX2Rpc3BsYXkgPSAkKCIjd2tpX3NldHRpbmdzX2NvbWJvX2Rpc3BsYXkiKS5pcygiOmNoZWNrZWQiKSA/IHRydWUgOiBmYWxzZTsKICAgIHdraV9zZXR0aW5ncy53a2lfc3JzX2xldmVsdXBfZGlzcGxheSA9ICQoIiN3a2lfc2V0dGluZ3Nfc3JzX2xldmVsdXBfZGlzcGxheSIpLmlzKCI6Y2hlY2tlZCIpID8gdHJ1ZSA6IGZhbHNlOwogICAgd2tpX3NldHRpbmdzLndraV9hdXRvX3Nob3dfaW5mbyA9ICQoIiN3a2lfc2V0dGluZ3NfYXV0b19zaG93X2luZm8iKS5pcygiOmNoZWNrZWQiKSA/IHRydWUgOiBmYWxzZTsKCiAgICAkLmpTdG9yYWdlLnNldCgnd2tpX3NldHRpbmdzJywgSlNPTi5zdHJpbmdpZnkod2tpX3NldHRpbmdzKSk7CgogICAgJCgnLndraV9idXR0b25faXRlbV9sYWJlbCcpLmNzcyh7J2NvbG9yJyA6IHdraV9zZXR0aW5ncy53a2lfYnV0dG9uX2xhYmVsX3RleHRjb2xvciwgJ2JhY2tncm91bmQtY29sb3InOiB3a2lfc2V0dGluZ3Mud2tpX2J1dHRvbl9sYWJlbF9iZ2NvbG9yfSk7CgogICAgaWYod2tpX3NldHRpbmdzLndraV9jb21ib19kaXNwbGF5ICE9PSB0cnVlKQogICAgewogICAgICAgICQoJyN3a2lfY29tYm9fZGlzcGxheScpLmhpZGUoKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICAkKCcjd2tpX2NvbWJvX2Rpc3BsYXknKS5zaG93KCk7CiAgICB9CgogICAgaWYod2tpX3NldHRpbmdzLndraV9zcnNfbGV2ZWx1cF9kaXNwbGF5ICE9PSB0cnVlKQogICAgewogICAgICAgICQoJyN3a2lfc3JzX3BvcHVwX3dyYXBwZXInKS5oaWRlKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgJCgnI3draV9zcnNfcG9wdXBfd3JhcHBlcicpLnNob3coKTsKICAgIH0KCiAgICAkKCcud2tpX3NldHRpbmdzX2Zvcm0nKS5zbGlkZVVwKCk7CiAgICAkKCcud2tpX3NldHRpbmdzX3NhdmVkJykuc2xpZGVEb3duKCk7CgogICAgY29uc29sZS5sb2coJ1dLSTogc2V0dGluZ3Mgc2F2ZWQnKTsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI3draV9jb25maWdfYnV0dG9uJykucXRpcCgiaGlkZSIpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJy53a2lfc2V0dGluZ3NfZm9ybScpLnNob3coKTsKICAgICAgICAgICAgJCgnLndraV9zZXR0aW5nc19zYXZlZCcpLmhpZGUoKTsKICAgICAgICAgICAgJCgnLndraV9zZXR0aW5nc19kaXNjYXJkZWQnKS5oaWRlKCk7CiAgICAgICAgfSwgMTAwMCk7CiAgICB9LCAxMzAwKTsKfQoKCiQoJyNyZXBvcnQtZXJyb3JzIGEnKS5hdHRyKCdocmVmJywgJ2phdmFzY3JpcHQ6dm9pZCgwKTsnKTsKJCgnI3JlcG9ydC1lcnJvcnMnKS5hZGRDbGFzcygnd2tpX3Rvb2x0aXAnKS5hdHRyKCdyZWwnLCAnd2tpX2J1Z19tZXNzYWdlJykuYXBwZW5kKCc8c3BhbiBjbGFzcz0id2tpX2hpZGRlbiIgaWQ9IndraV9idWdfbWVzc2FnZSI+QmVmb3JlIHNlbmRpbmcgYSBidWcgcmVwb3J0LCBkaXNhYmxlIFdhbmlLYW5pIEltcHJvdmUgYW5kIGFsbCBvdGhlciBzY3JpcHRzIHJ1bm5pbmcgaW4gdGhlIHBhZ2UuIElmIHRoZSBlcnJvciBwZXJzaXN0cywgY29udGFjdCBXYW5pS2FuaSBhbmQgcmVwb3J0IHRoZSBwcm9ibGVtLjwvc3Bhbj4nKTsKCiQoJy53a2lfdG9vbHRpcCcpLmVhY2goZnVuY3Rpb24oKSB7CiAgICBpZigkKHRoaXMpLmF0dHIoJ3JlbCcpKQogICAgewogICAgICAgIHZhciBxdGlwX2NvbnRlbnQgPSAkKCcjJyskKHRoaXMpLmF0dHIoJ3JlbCcpKS5odG1sKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgdmFyIHF0aXBfY29udGVudCA9ICQodGhpcykuYXR0cigndGl0bGUnKTsKICAgIH0KICAgICQodGhpcykucXRpcCh7CiAgICAgICAgICAgc3R5bGU6IHsKICAgICAgICAgICAgICAgIGNsYXNzZXM6ICdxdGlwLWJvb3RzdHJhcCBxdGlwLXNoYWRvdycKICAgICAgICAgICB9LAogICAgICAgICAgIGhpZGU6IHsKICAgIAkJCWRlbGF5OiAxMDAsCiAgICAJCQlldmVudDogJ3VuZm9jdXMgbW91c2VsZWF2ZScsCiAgICAJCQlmaXhlZDogdHJ1ZQogICAgCQl9LAogICAgICAgICAgICBwb3NpdGlvbjoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXk6ICdib3R0b20gY2VudGVyJywKICAgICAgICAgICAgICAgIGF0OiAndG9wIGNlbnRlcicsCiAgICAgICAgICAgICAgICB2aWV3cG9ydDogJCh3aW5kb3cpLAogICAgICAgICAgICAgICAgbWV0aG9kOiAnc2hpZnQgbm9uZScKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29udGVudDogcXRpcF9jb250ZW50CiAgICB9KTsKfSk7CgokKHdpbmRvdykudW5sb2FkKGZ1bmN0aW9uKCl7CiAgICBpZih3a2lfaGl0X2NvbWJvID4gd2tpX2NvbWJvX3JlY29yZCkKICAgIHsKICAgICAgICAkLmpTdG9yYWdlLnNldCgnd2tpX2NvbWJvX3JlY29yZCcsIHdraV9oaXRfY29tYm8pOwogICAgICAgIGNvbnNvbGUubG9nKCdXS0k6IENvbWJvIHJlY29yZCBzYXZlZCcpOwogICAgfQp9KTs=", 121 + "storage": { 122 + "data": {}, 123 + "ts": 1607436649591 124 + }, 125 + "uuid": "38820d1c-0915-49b6-a73f-2b2d2f9cfbd9" 167 126 }, 168 127 { 128 + "enabled": true, 129 + "file_url": "https://greasyfork.org/scripts/23696-wanikani-override/code/Wanikani%20Override.user.js", 169 130 "name": "Wanikani Override", 170 131 "options": { 132 + "awareOfChrome": false, 171 133 "check_for_updates": true, 172 134 "comment": null, 173 - "compatopts_for_requires": true, 174 - "compat_wrappedjsobject": false, 135 + "compat_arrayleft": false, 136 + "compat_foreach": false, 137 + "compat_forvarin": false, 175 138 "compat_metadata": false, 176 - "compat_foreach": false, 177 - "compat_arrayleft": false, 139 + "compat_powerful_this": null, 178 140 "compat_uW_gmonkey": false, 179 - "compat_forvarin": false, 141 + "compat_wrappedjsobject": false, 142 + "compatopts_for_requires": true, 180 143 "noframes": null, 181 - "awareOfChrome": false, 182 - "run_at": null, 183 144 "override": { 184 - "use_includes": [], 145 + "merge_connects": true, 146 + "merge_excludes": true, 147 + "merge_includes": true, 148 + "merge_matches": true, 149 + "orig_excludes": [], 185 150 "orig_includes": [ 186 151 "http://www.wanikani.com/review/session*", 187 152 "https://www.wanikani.com/review/session*" 188 153 ], 189 - "merge_includes": true, 190 - "use_matches": [], 191 154 "orig_matches": [], 192 - "merge_matches": true, 193 - "use_excludes": [], 194 - "orig_excludes": [], 195 - "merge_excludes": true, 196 - "use_connects": [], 197 - "merge_connects": true, 198 - "use_blockers": [], 155 + "orig_noframes": null, 199 156 "orig_run_at": "document-idle", 200 - "orig_noframes": null 201 - } 157 + "use_blockers": [], 158 + "use_connects": [], 159 + "use_excludes": [], 160 + "use_includes": [], 161 + "use_matches": [] 162 + }, 163 + "run_at": null, 164 + "tab_types": null 202 165 }, 203 - "storage": { 204 - "data": {}, 205 - "ts": 1607436649612 206 - }, 207 - "enabled": true, 208 - "position": 4, 209 - "file_url": "https://greasyfork.org/scripts/23696-wanikani-override/code/Wanikani%20Override.user.js", 210 - "uuid": "7da2a58d-d2aa-4e58-81fd-d5c8b940fca5", 211 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIE92ZXJyaWRlCi8vIEBuYW1lc3BhY2UgICB3a292ZXJyaWRlCi8vIEBkZXNjcmlwdGlvbiBBZGRzIGFuICJJZ25vcmUgQW5zd2VyIiBidXR0b24gZHVyaW5nIHJldmlld3MgdGhhdCBtYWtlcyBXYW5pS2FuaSBpZ25vcmUgdGhlIGN1cnJlbnQgYW5zd2VyICh1c2VmdWwgaWYsIGZvciBleGFtcGxlLCB5b3UgbWFkZSBhIHN0dXBpZCB0eXBvKQovLyBAaW5jbHVkZSAgICAgaHR0cDovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24qCi8vIEBpbmNsdWRlICAgICBodHRwczovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24qCi8vIEB2ZXJzaW9uICAgICAxLjIKLy8gQGF1dGhvciAgICAgIE1lbXBvCi8vIEBncmFudCAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgdW5zYWZlV2luZG93Ci8vIEByZXF1aXJlICAgICBodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjIubWluLmpzCi8vIEBsaWNlbnNlICAgICBHUEwgdmVyc2lvbiAzIG9yIGFueSBsYXRlciB2ZXJzaW9uOyBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKLy8gPT0vVXNlclNjcmlwdD09CgovL09yaWdpbmFsIGF1dGhvcjogUnVpIFBpbmhlaXJvCgovLyBFU0Mgc2hvcnRjdXQKCgovKgogKiBEZWJ1ZyBTZXR0aW5ncwogKi8KdmFyIGRlYnVnTG9nRW5hYmxlZCA9IHRydWU7CnZhciBzY3JpcHRTaG9ydE5hbWUgPSAnV0tPJzsKc2NyaXB0TG9nID0gZGVidWdMb2dFbmFibGVkID8gZnVuY3Rpb24gKG1zZykgewogIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykgewogICAgY29uc29sZS5sb2coc2NyaXB0U2hvcnROYW1lICsgJzogJyArIG1zZyk7CiAgfSBlbHNlIHsKICAgIGNvbnNvbGUubG9nKG1zZyk7CiAgfQp9CiA6IGZ1bmN0aW9uICgpIHsKfTsKLyoKICogT3RoZXIgc2V0dGluZ3MKICovCnZhciBwcmVmQWxsb3dVbmlnbm9yZSA9IHRydWU7Ci8qCiAqICJJZ25vcmUgQW5zd2VyIiBCdXR0b24gQ2xpY2sKICovCnZhciBBY3Rpb25FbnVtID0gT2JqZWN0LmZyZWV6ZSh7CiAgaWdub3JlOiAwLAogIHVuaWdub3JlOiAxCn0pOwpmdW5jdGlvbiBXS09faWdub3JlQW5zd2VyKCkKewogIHRyeQogIHsKICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IGl0ZW0gd2FzIGFuc3dlcmVkIGluY29ycmVjdGx5ICovCiAgICB2YXIgZWxtbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5jb3JyZWN0Jyk7CiAgICB2YXIgZWxtbnRzMiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ1dLT19pZ25vcmVkJyk7CiAgICAKICAgIHZhciBjdXJBY3Rpb247CiAgICBpZiAoIWlzRW1wdHkoZWxtbnRzWzBdKSkgLy8gQ3VycmVudCBhbnN3ZXIgaXMgd3JvbmcKICAgIGN1ckFjdGlvbiA9IEFjdGlvbkVudW0uaWdub3JlOwogICAgIGVsc2UgaWYgKHByZWZBbGxvd1VuaWdub3JlICYmICFpc0VtcHR5KGVsbW50czJbMF0pKSAvLyBDdXJyZW50IGFuc3dlciBpcyBpZ25vcmVkCiAgICBjdXJBY3Rpb24gPSBBY3Rpb25FbnVtLnVuaWdub3JlOwogICAgIGVsc2UKICAgIC8vIEVpdGhlciB0aGVyZSBpcyBubyBjdXJyZW50IGFuc3dlciwgb3IgaXQncyBjb3JyZWN0CiAgICB7CiAgICAgIGFsZXJ0KCdXS086IEN1cnJlbnQgaXRlbSB3YXNuXCd0IGFuc3dlcmVkIGluY29ycmVjdGx5LCBub3IgaWdub3JlZCBwcmV2aW91c2x5IScpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAKICAgIC8qIEdyYWIgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBxdWVzdGlvbiAqLwogCiAgICB2YXIgY3VySXRlbSA9ICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpOwogICAgdmFyIHF1ZXN0aW9uVHlwZSA9ICQualN0b3JhZ2UuZ2V0KCdxdWVzdGlvblR5cGUnKTsKIAogICAgLyogQnVpbGQgaXRlbSBuYW1lICovCiAgICB2YXIgaXRlbU5hbWU7CiAgICBpZiAoY3VySXRlbS5yYWQpCiAgICBpdGVtTmFtZSA9ICdyJzsKICAgICBlbHNlIGlmIChjdXJJdGVtLmthbikKICAgIGl0ZW1OYW1lID0gJ2snOwogICAgIGVsc2UKICAgIGl0ZW1OYW1lID0gJ3YnOwogICAgaXRlbU5hbWUgKz0gY3VySXRlbS5pZDsKICAgIHNjcmlwdExvZyhpdGVtTmFtZSk7CiAgICAvKiBHcmFiIGl0ZW0gZnJvbSBqU3RvcmFnZS4KICAgICAgICAgKiAKICAgICAgICAgKiBpdGVtLnJjIGFuZCBpdGVtLm1jID0+IFJlYWRpbmcvTWVhbmluZyBDb21wbGV0ZWQgKGlmIGFuc3dlcmVkIHRoZSBpdGVtIGNvcnJlY3RseSkKICAgICAgICAgKiBpdGVtLnJpIGFuZCBpdGVtLm1pID0+IFJlYWRpbmcvTWVhbmluZyBJbnZhbGlkIChudW1iZXIgb2YgbWlzdGFrZXMgYmVmb3JlIGFuc3dlcmluZyBjb3JyZWN0bHkpCiAgICAgICAgICovCiAgICB2YXIgaXRlbSA9ICQualN0b3JhZ2UuZ2V0KGl0ZW1OYW1lKSB8fCB7CiAgICB9OwogICAgLyogVXBkYXRlIHRoZSBpdGVtIGRhdGEgKi8KICAgIGlmIChxdWVzdGlvblR5cGUgPT09ICdtZWFuaW5nJykKICAgIHsKICAgICAgaWYgKCEoJ21pJyBpbiBpdGVtKSB8fCBpc0VtcHR5KGl0ZW0ubWkpKQogICAgICB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ2l0ZW0ubWkgdW5kZWZpbmVkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IAogICAgICBlbHNlIGlmIChpdGVtLm1pIDwgMCB8fCAoaXRlbS5taSA9PSAwICYmIGN1ckFjdGlvbiA9PSBBY3Rpb25FbnVtLmlnbm9yZSkpCiAgICAgIHsKICAgICAgICB0aHJvdyBFcnJvcignaXRlbS5taSB0b28gc21hbGwnKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGN1ckFjdGlvbiA9PSBBY3Rpb25FbnVtLmlnbm9yZSkKICAgICAgaXRlbS5taSAtPSAxOwogICAgICAgZWxzZQogICAgICBpdGVtLm1pICs9IDE7CiAgICAgIGRlbGV0ZSBpdGVtLm1jOwogICAgfSAKICAgIGVsc2UKICAgIHsKICAgICAgaWYgKCEoJ3JpJyBpbiBpdGVtKSB8fCBpc0VtcHR5KGl0ZW0ucmkpKQogICAgICB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ2l0ZW0ucmkgdW5kZWZpbmVkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IAogICAgICBlbHNlIGlmIChpdGVtLnJpIDwgMCB8fCAoaXRlbS5yaSA9PSAwICYmIGN1ckFjdGlvbiA9PSBBY3Rpb25FbnVtLmlnbm9yZSkpCiAgICAgIHsKICAgICAgICB0aHJvdyBFcnJvcignaS5yaSB0b28gc21hbGwnKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGN1ckFjdGlvbiA9PSBBY3Rpb25FbnVtLmlnbm9yZSkKICAgICAgaXRlbS5yaSAtPSAxOwogICAgICAgZWxzZQogICAgICBpdGVtLnJpICs9IDE7CiAgICAgIGRlbGV0ZSBpdGVtLnJjOwogICAgfQogICAgLyogU2F2ZSB0aGUgbmV3IHN0YXRlIGJhY2sgaW50byBqU3RvcmFnZSAqLwogCiAgICAkLmpTdG9yYWdlLnNldChpdGVtTmFtZSwgaXRlbSk7CiAgICAvKiBNb2RpZnkgdGhlIHF1ZXN0aW9ucyBjb3VudGVyIGFuZCB3cm9uZyBjb3VudGVyIGFuZCBjaGFuZ2UgdGhlIHN0eWxlIG9mIHRoZSBhbnN3ZXIgZmllbGQgKi8KICAgIHZhciB3cm9uZ0NvdW50ID0gJC5qU3RvcmFnZS5nZXQoJ3dyb25nQ291bnQnKTsKICAgIHZhciBxdWVzdGlvbkNvdW50ID0gJC5qU3RvcmFnZS5nZXQoJ3F1ZXN0aW9uQ291bnQnKTsKICAgIGlmIChjdXJBY3Rpb24gPT0gQWN0aW9uRW51bS5pZ25vcmUpCiAgICB7CiAgICAgICQualN0b3JhZ2Uuc2V0KCd3cm9uZ0NvdW50Jywgd3JvbmdDb3VudCAtIDEpOwogICAgICAkLmpTdG9yYWdlLnNldCgncXVlc3Rpb25Db3VudCcsIHF1ZXN0aW9uQ291bnQgLSAxKTsKICAgICAgJCgnI2Fuc3dlci1mb3JtIGZpZWxkc2V0JykucmVtb3ZlQ2xhc3MoJ2luY29ycmVjdCcpOwogICAgICAkKCcjYW5zd2VyLWZvcm0gZmllbGRzZXQnKS5hZGRDbGFzcygnV0tPX2lnbm9yZWQnKTsKICAgIH0gCiAgICBlbHNlCiAgICB7CiAgICAgICQualN0b3JhZ2Uuc2V0KCd3cm9uZ0NvdW50Jywgd3JvbmdDb3VudCArIDEpOwogICAgICAkLmpTdG9yYWdlLnNldCgncXVlc3Rpb25Db3VudCcsIHF1ZXN0aW9uQ291bnQgKyAxKTsKICAgICAgJCgnI2Fuc3dlci1mb3JtIGZpZWxkc2V0JykucmVtb3ZlQ2xhc3MoJ1dLT19pZ25vcmVkJyk7CiAgICAgICQoJyNhbnN3ZXItZm9ybSBmaWVsZHNldCcpLmFkZENsYXNzKCdpbmNvcnJlY3QnKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0gCiAgY2F0Y2ggKGVycikgewogICAgbG9nRXJyb3IoZXJyKTsKICB9Cn0KLyoKICogQmluZCAnficgYXMgYSBob3RrZXkgCiAqLwogCmZ1bmN0aW9uIGJpbmRIb3RrZXkoKQp7CiAgalF1ZXJ5KGRvY3VtZW50KS5vbigna2V5ZG93bi5yZXZpZXdTY3JlZW4nLCBmdW5jdGlvbiAoZXZlbnQpCiAgewogICAgaWYgKCQoJyNyZXZpZXdzJykuaXMoJzp2aXNpYmxlJykgJiYgISQoJyo6Zm9jdXMnKS5pcygndGV4dGFyZWEsIGlucHV0JykpCiAgICB7CiAgICAgIC8vYWxlcnQoJ2tleWNvZGU6ICcgKyBldmVudC5rZXlDb2RlKTsKICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CiAgICAgICAgLy9jYXNlIDE3NjogLy9GaXJlZm94ICd+JwogICAgICAgIC8vY2FzZSAxOTI6IC8vQ2hyb21lICd+JwogICAgICAgIGNhc2UgMjc6IC8vIEVTQyBCdXR0b24KICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGlmICgkKCcjdXNlci1yZXNwb25zZScpLmlzKCc6ZGlzYWJsZWQnKSkKICAgICAgICAgICBXS09faWdub3JlQW5zd2VyKCk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0pOwp9Ci8qCiAqIEluamVjdCBJZ25vcmUgQnV0dG9uCiAqLwogCmZ1bmN0aW9uIGFkZElnbm9yZUFuc3dlckJ0bigpCnsKICB2YXIgZm9vdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Zvb3RlcicpLAogICAgICAkYnRuID0galF1ZXJ5KCc8ZGl2IGlkPSJXS09fYnV0dG9uIiB0aXRsZT0iSWdub3JlIEFuc3dlciI+SWdub3JlIEFuc3dlcjwvZGl2PicpLm9uKCdjbGljaycsIFdLT19pZ25vcmVBbnN3ZXIpOwogIGpRdWVyeShmb290ZXJbMF0pLnByZXBlbmQoJGJ0bik7Cn0KLyoKICogUHJlcGFyZXMgdGhlIHNjcmlwdAogKi8KIApmdW5jdGlvbiBzY3JpcHRJbml0KCkKewogIC8vIEFkZCBnbG9iYWwgQ1NTIHN0eWxlcwogIEdNX2FkZFN0eWxlKCcjV0tPX2J1dHRvbiB7YmFja2dyb3VuZC1jb2xvcjogI0NDMDAwMDsgY29sb3I6ICNGRkZGRkY7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDAuODEyNWVtOyBwYWRkaW5nOiAxMHB4OyB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO30nKTsKICBHTV9hZGRTdHlsZSgnI2Fuc3dlci1mb3JtIGZpZWxkc2V0LldLT19pZ25vcmVkIGlucHV0W3R5cGU9InRleHQiXTotbW96LXBsYWNlaG9sZGVyLCAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tPX2lnbm9yZWQgaW5wdXRbdHlwZT0idGV4dCJdOi1tb3otcGxhY2Vob2xkZXIge2NvbG9yOiAjRkZGRkZGOyBmb250LWZhbWlseTogIlNvdXJjZSBTYW5zIFBybyIsc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDMwMDsgdGV4dC1zaGFkb3c6IG5vbmU7IHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGxpbmVhciAwczsgfSAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tPX2lnbm9yZWQgYnV0dG9uLCAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tPX2lnbm9yZWQgaW5wdXRbdHlwZT0idGV4dCJdLCAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tPX2lnbm9yZWQgaW5wdXRbdHlwZT0idGV4dCJdOmRpc2FibGVkIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGQ0MwMCAhaW1wb3J0YW50OyB9Jyk7CiAgc2NyaXB0TG9nKCdsb2FkZWQnKTsKICAvLyBTZXQgdXAgaG9va3MKICB0cnkKICB7CiAgICBhZGRJZ25vcmVBbnN3ZXJCdG4oKTsKICAgIGJpbmRIb3RrZXkoKTsKICB9IAogIGNhdGNoIChlcnIpIHsKICAgIGxvZ0Vycm9yKGVycik7CiAgfQp9Ci8qCiAqIEhlbHBlciBGdW5jdGlvbnMvVmFyaWFibGVzCiAqLwogCi8vdXNlICdqUXVlcnknIGZvciBncmVhc2Vtb25rZXkncyB2ZXJzaW9uLCAkIGlzIFdLJ3MgalF1ZXJ5CiAKJCA9IHVuc2FmZVdpbmRvdy4kOwpmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7CiAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsKTsKfQovKgogKiBFcnJvciBoYW5kbGluZwogKiBDYW4gdXNlICdlcnJvci5zdGFjaycsIG5vdCBjcm9zcy1icm93c2VyICh0aG91Z2ggaXQgc2hvdWxkIHdvcmsgb24gRmlyZWZveCBhbmQgQ2hyb21lKQogKi8KIApmdW5jdGlvbiBsb2dFcnJvcihlcnJvcikKewogIHZhciBzdGFja01lc3NhZ2UgPSAnJzsKICBpZiAoJ3N0YWNrJyBpbiBlcnJvcikKICBzdGFja01lc3NhZ2UgPSAnXG5cdFN0YWNrOiAnICsgZXJyb3Iuc3RhY2s7CiAgY29uc29sZS5lcnJvcihzY3JpcHRTaG9ydE5hbWUgKyAnIEVycm9yOiAnICsgZXJyb3IubmFtZSArICdcblx0TWVzc2FnZTogJyArIGVycm9yLm1lc3NhZ2UgKyBzdGFja01lc3NhZ2UpOwp9Ci8qCiAqIFN0YXJ0IHRoZSBzY3JpcHQKICovCiAKc2NyaXB0SW5pdCgpOwoKLy8gSG9vayBpbnRvIEFwcCBTdG9yZQp0cnkgeyAkKCcuYXBwLXN0b3JlLW1lbnUtaXRlbScpLnJlbW92ZSgpOyAkKCc8bGkgY2xhc3M9ImFwcC1zdG9yZS1tZW51LWl0ZW0iPjxhIGhyZWY9Imh0dHBzOi8vY29tbXVuaXR5LndhbmlrYW5pLmNvbS90L3RoZXJlLWFyZS1zby1tYW55LXVzZXItc2NyaXB0cy1ub3ctdGhhdC1kaXNjb3ZlcmluZy10aGVtLWlzLWhhcmQvMjA3MDkiPkFwcCBTdG9yZTwvYT48L2xpPicpLmluc2VydEJlZm9yZSgkKCcubmF2YmFyIC5kcm9wZG93bi1tZW51IC5uYXYtaGVhZGVyOmNvbnRhaW5zKCJBY2NvdW50IiknKSk7IHdpbmRvdy5hcHBTdG9yZVJlZ2lzdHJ5ID0gd2luZG93LmFwcFN0b3JlUmVnaXN0cnkgfHwge307IHdpbmRvdy5hcHBTdG9yZVJlZ2lzdHJ5W0dNX2luZm8uc2NyaXB0LnV1aWRdID0gR01faW5mbzsgbG9jYWxTdG9yYWdlLmFwcFN0b3JlUmVnaXN0cnkgPSBKU09OLnN0cmluZ2lmeShhcHBTdG9yZVJlZ2lzdHJ5KTsgfSBjYXRjaCAoZSkge30=", 166 + "position": 3, 212 167 "requires": [ 213 168 { 214 169 "meta": { 170 + "mimetype": "text/javascript", 215 171 "name": "jquery-1.11.2.min.js", 216 - "url": "http://code.jquery.com/jquery-1.11.2.min.js", 217 - "ts": 1607436649608, 218 - "mimetype": "text/javascript" 172 + "ts": 1649272273080, 173 + "url": "http://code.jquery.com/jquery-1.11.2.min.js" 219 174 }, 220 175 "source": "LyohIGpRdWVyeSB2MS4xMS4yIHwgKGMpIDIwMDUsIDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMiIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW0udHlwZShhKXx8YS5ub2RlVHlwZXx8bS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYoay5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZtLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UobywibXMtIikucmVwbGFjZShwLHEpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cihhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShuLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihyKE9iamVjdChhKSk/bS5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXIoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9ZiksbS5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG0uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omt9KSxtLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHIoYSl7dmFyIGI9YS5sZW5ndGgsYz1tLnR5cGUoYSk7cmV0dXJuImZ1bmN0aW9uIj09PWN8fG0uaXNXaW5kb3coYSk/ITE6MT09PWEubm9kZVR5cGUmJmI/ITA6ImFycmF5Ij09PWN8fDA9PT1ifHwibnVtYmVyIj09dHlwZW9mIGImJmI+MCYmYi0xIGluIGF9dmFyIHM9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGgsaSxqLGssbCxtLG4sbyxwLHEscixzLHQsdT0ic2l6emxlIisxKm5ldyBEYXRlLHY9YS5kb2N1bWVudCx3PTAseD0wLHk9aGIoKSx6PWhiKCksQT1oYigpLEI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWImJihsPSEwKSwwfSxDPTE8PDMxLEQ9e30uaGFzT3duUHJvcGVydHksRT1bXSxGPUUucG9wLEc9RS5wdXNoLEg9RS5wdXNoLEk9RS5zbGljZSxKPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWlmKGFbY109PT1iKXJldHVybiBjO3JldHVybi0xfSxLPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsTD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsTT0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLE49TS5yZXBsYWNlKCJ3IiwidyMiKSxPPSJcXFsiK0wrIiooIitNKyIpKD86IitMKyIqKFsqXiR8IX5dPz0pIitMKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrTisiKSl8KSIrTCsiKlxcXSIsUD0iOigiK00rIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK08rIikqKXwuKilcXCl8KSIsUT1uZXcgUmVnRXhwKEwrIisiLCJnIiksUj1uZXcgUmVnRXhwKCJeIitMKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK0wrIiskIiwiZyIpLFM9bmV3IFJlZ0V4cCgiXiIrTCsiKiwiK0wrIioiKSxUPW5ldyBSZWdFeHAoIl4iK0wrIiooWz4rfl18IitMKyIpIitMKyIqIiksVT1uZXcgUmVnRXhwKCI9IitMKyIqKFteXFxdJ1wiXSo/KSIrTCsiKlxcXSIsImciKSxWPW5ldyBSZWdFeHAoUCksVz1uZXcgUmVnRXhwKCJeIitOKyIkIiksWD17SUQ6bmV3IFJlZ0V4cCgiXiMoIitNKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK00rIikiKSxUQUc6bmV3IFJlZ0V4cCgiXigiK00ucmVwbGFjZSgidyIsIncqIikrIikiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK08pLFBTRVVETzpuZXcgUmVnRXhwKCJeIitQKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK0wrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK0wrIiooPzooWystXXwpIitMKyIqKFxcZCspfCkpIitMKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitLKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrTCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitMKyIqKCg/Oi1cXGQpP1xcZCopIitMKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxZPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksWj0vXmhcZCQvaSwkPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxfPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sYWI9L1srfl0vLGJiPS8nfFxcL2csY2I9bmV3IFJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitMKyI/fCgiK0wrIil8LikiLCJpZyIpLGRiPWZ1bmN0aW9uKGEsYixjKXt2YXIgZD0iMHgiK2ItNjU1MzY7cmV0dXJuIGQhPT1kfHxjP2I6MD5kP1N0cmluZy5mcm9tQ2hhckNvZGUoZCs2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZShkPj4xMHw1NTI5NiwxMDIzJmR8NTYzMjApfSxlYj1mdW5jdGlvbigpe20oKX07dHJ5e0guYXBwbHkoRT1JLmNhbGwodi5jaGlsZE5vZGVzKSx2LmNoaWxkTm9kZXMpLEVbdi5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2goZmIpe0g9e2FwcGx5OkUubGVuZ3RoP2Z1bmN0aW9uKGEsYil7Ry5hcHBseShhLEkuY2FsbChiKSl9OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5sZW5ndGgsZD0wO3doaWxlKGFbYysrXT1iW2QrK10pO2EubGVuZ3RoPWMtMX19fWZ1bmN0aW9uIGdiKGEsYixkLGUpe3ZhciBmLGgsaixrLGwsbyxyLHMsdyx4O2lmKChiP2Iub3duZXJEb2N1bWVudHx8Yjp2KSE9PW4mJm0oYiksYj1ifHxuLGQ9ZHx8W10saz1iLm5vZGVUeXBlLCJzdHJpbmciIT10eXBlb2YgYXx8IWF8fDEhPT1rJiY5IT09ayYmMTEhPT1rKXJldHVybiBkO2lmKCFlJiZwKXtpZigxMSE9PWsmJihmPV8uZXhlYyhhKSkpaWYoaj1mWzFdKXtpZig5PT09ayl7aWYoaD1iLmdldEVsZW1lbnRCeUlkKGopLCFofHwhaC5wYXJlbnROb2RlKXJldHVybiBkO2lmKGguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNlIGlmKGIub3duZXJEb2N1bWVudCYmKGg9Yi5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGopKSYmdChiLGgpJiZoLmlkPT09ailyZXR1cm4gZC5wdXNoKGgpLGR9ZWxzZXtpZihmWzJdKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKSksZDtpZigoaj1mWzNdKSYmYy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBILmFwcGx5KGQsYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGopKSxkfWlmKGMucXNhJiYoIXF8fCFxLnRlc3QoYSkpKXtpZihzPXI9dSx3PWIseD0xIT09ayYmYSwxPT09ayYmIm9iamVjdCIhPT1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe289ZyhhKSwocj1iLmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1yLnJlcGxhY2UoYmIsIlxcJCYiKTpiLnNldEF0dHJpYnV0ZSgiaWQiLHMpLHM9IltpZD0nIitzKyInXSAiLGw9by5sZW5ndGg7d2hpbGUobC0tKW9bbF09cytyYihvW2xdKTt3PWFiLnRlc3QoYSkmJnBiKGIucGFyZW50Tm9kZSl8fGIseD1vLmpvaW4oIiwiKX1pZih4KXRyeXtyZXR1cm4gSC5hcHBseShkLHcucXVlcnlTZWxlY3RvckFsbCh4KSksZH1jYXRjaCh5KXt9ZmluYWxseXtyfHxiLnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBpKGEucmVwbGFjZShSLCIkMSIpLGIsZCxlKX1mdW5jdGlvbiBoYigpe3ZhciBhPVtdO2Z1bmN0aW9uIGIoYyxlKXtyZXR1cm4gYS5wdXNoKGMrIiAiKT5kLmNhY2hlTGVuZ3RoJiZkZWxldGUgYlthLnNoaWZ0KCldLGJbYysiICJdPWV9cmV0dXJuIGJ9ZnVuY3Rpb24gaWIoYSl7cmV0dXJuIGFbdV09ITAsYX1mdW5jdGlvbiBqYihhKXt2YXIgYj1uLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWEoYil9Y2F0Y2goYyl7cmV0dXJuITF9ZmluYWxseXtiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGx9fWZ1bmN0aW9uIGtiKGEsYil7dmFyIGM9YS5zcGxpdCgifCIpLGU9YS5sZW5ndGg7d2hpbGUoZS0tKWQuYXR0ckhhbmRsZVtjW2VdXT1ifWZ1bmN0aW9uIGxiKGEsYil7dmFyIGM9YiYmYSxkPWMmJjE9PT1hLm5vZGVUeXBlJiYxPT09Yi5ub2RlVHlwZSYmKH5iLnNvdXJjZUluZGV4fHxDKS0ofmEuc291cmNlSW5kZXh8fEMpO2lmKGQpcmV0dXJuIGQ7aWYoYyl3aGlsZShjPWMubmV4dFNpYmxpbmcpaWYoYz09PWIpcmV0dXJuLTE7cmV0dXJuIGE/MTotMX1mdW5jdGlvbiBtYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1jJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBuYihhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9Yi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09Y3x8ImJ1dHRvbiI9PT1jKSYmYi50eXBlPT09YX19ZnVuY3Rpb24gb2IoYSl7cmV0dXJuIGliKGZ1bmN0aW9uKGIpe3JldHVybiBiPStiLGliKGZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hKFtdLGMubGVuZ3RoLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWNbZT1mW2ddXSYmKGNbZV09IShkW2VdPWNbZV0pKX0pfSl9ZnVuY3Rpb24gcGIoYSl7cmV0dXJuIGEmJiJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRFbGVtZW50c0J5VGFnTmFtZSYmYX1jPWdiLnN1cHBvcnQ9e30sZj1nYi5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj1hJiYoYS5vd25lckRvY3VtZW50fHxhKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIGI/IkhUTUwiIT09Yi5ub2RlTmFtZTohMX0sbT1nYi5zZXREb2N1bWVudD1mdW5jdGlvbihhKXt2YXIgYixlLGc9YT9hLm93bmVyRG9jdW1lbnR8fGE6djtyZXR1cm4gZyE9PW4mJjk9PT1nLm5vZGVUeXBlJiZnLmRvY3VtZW50RWxlbWVudD8obj1nLG89Zy5kb2N1bWVudEVsZW1lbnQsZT1nLmRlZmF1bHRWaWV3LGUmJmUhPT1lLnRvcCYmKGUuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZWIsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixlYikpLHA9IWYoZyksYy5hdHRyaWJ1dGVzPWpiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmNsYXNzTmFtZT0iaSIsIWEuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLGMuZ2V0RWxlbWVudHNCeVRhZ05hbWU9amIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoZy5jcmVhdGVDb21tZW50KCIiKSksIWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxjLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9JC50ZXN0KGcuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksYy5nZXRCeUlkPWpiKGZ1bmN0aW9uKGEpe3JldHVybiBvLmFwcGVuZENoaWxkKGEpLmlkPXUsIWcuZ2V0RWxlbWVudHNCeU5hbWV8fCFnLmdldEVsZW1lbnRzQnlOYW1lKHUpLmxlbmd0aH0pLGMuZ2V0QnlJZD8oZC5maW5kLklEPWZ1bmN0aW9uKGEsYil7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBiLmdldEVsZW1lbnRCeUlkJiZwKXt2YXIgYz1iLmdldEVsZW1lbnRCeUlkKGEpO3JldHVybiBjJiZjLnBhcmVudE5vZGU/W2NdOltdfX0sZC5maWx0ZXIuSUQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5yZXBsYWNlKGNiLGRiKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJpZCIpPT09Yn19KTooZGVsZXRlIGQuZmluZC5JRCxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2IsZGIpO3JldHVybiBmdW5jdGlvbihhKXt2YXIgYz0idW5kZWZpbmVkIiE9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSYmYS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBjJiZjLnZhbHVlPT09Yn19KSxkLmZpbmQuVEFHPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oYSxiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTpjLnFzYT9iLnF1ZXJ5U2VsZWN0b3JBbGwoYSk6dm9pZCAwfTpmdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT0wLGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKTtpZigiKiI9PT1hKXt3aGlsZShjPWZbZSsrXSkxPT09Yy5ub2RlVHlwZSYmZC5wdXNoKGMpO3JldHVybiBkfXJldHVybiBmfSxkLmZpbmQuQ0xBU1M9Yy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZmdW5jdGlvbihhLGIpe3JldHVybiBwP2IuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShhKTp2b2lkIDB9LHI9W10scT1bXSwoYy5xc2E9JC50ZXN0KGcucXVlcnlTZWxlY3RvckFsbCkpJiYoamIoZnVuY3Rpb24oYSl7by5hcHBlbmRDaGlsZChhKS5pbm5lckhUTUw9IjxhIGlkPSciK3UrIic+PC9hPjxzZWxlY3QgaWQ9JyIrdSsiLVxmXScgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGEucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnEucHVzaCgiWypeJF09IitMKyIqKD86Jyd8XCJcIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHEucHVzaCgiXFxbIitMKyIqKD86dmFsdWV8IitLKyIpIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIrdSsiLV0iKS5sZW5ndGh8fHEucHVzaCgifj0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxxLnB1c2goIjpjaGVja2VkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrdSsiKyoiKS5sZW5ndGh8fHEucHVzaCgiLiMuK1srfl0iKX0pLGpiKGZ1bmN0aW9uKGEpe3ZhciBiPWcuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtiLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGEuYXBwZW5kQ2hpbGQoYikuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGEucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnEucHVzaCgibmFtZSIrTCsiKlsqXiR8IX5dPz0iKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RofHxxLnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksYS5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4IikscS5wdXNoKCIsLio6Iil9KSksKGMubWF0Y2hlc1NlbGVjdG9yPSQudGVzdChzPW8ubWF0Y2hlc3x8by53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG8ubW96TWF0Y2hlc1NlbGVjdG9yfHxvLm9NYXRjaGVzU2VsZWN0b3J8fG8ubXNNYXRjaGVzU2VsZWN0b3IpKSYmamIoZnVuY3Rpb24oYSl7Yy5kaXNjb25uZWN0ZWRNYXRjaD1zLmNhbGwoYSwiZGl2Iikscy5jYWxsKGEsIltzIT0nJ106eCIpLHIucHVzaCgiIT0iLFApfSkscT1xLmxlbmd0aCYmbmV3IFJlZ0V4cChxLmpvaW4oInwiKSkscj1yLmxlbmd0aCYmbmV3IFJlZ0V4cChyLmpvaW4oInwiKSksYj0kLnRlc3Qoby5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiksdD1ifHwkLnRlc3Qoby5jb250YWlucyk/ZnVuY3Rpb24oYSxiKXt2YXIgYz05PT09YS5ub2RlVHlwZT9hLmRvY3VtZW50RWxlbWVudDphLGQ9YiYmYi5wYXJlbnROb2RlO3JldHVybiBhPT09ZHx8ISghZHx8MSE9PWQubm9kZVR5cGV8fCEoYy5jb250YWlucz9jLmNvbnRhaW5zKGQpOmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZCkpKX06ZnVuY3Rpb24oYSxiKXtpZihiKXdoaWxlKGI9Yi5wYXJlbnROb2RlKWlmKGI9PT1hKXJldHVybiEwO3JldHVybiExfSxCPWI/ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBkPSFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBkP2Q6KGQ9KGEub3duZXJEb2N1bWVudHx8YSk9PT0oYi5vd25lckRvY3VtZW50fHxiKT9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpOjEsMSZkfHwhYy5zb3J0RGV0YWNoZWQmJmIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSk9PT1kP2E9PT1nfHxhLm93bmVyRG9jdW1lbnQ9PT12JiZ0KHYsYSk/LTE6Yj09PWd8fGIub3duZXJEb2N1bWVudD09PXYmJnQodixiKT8xOms/SihrLGEpLUooayxiKTowOjQmZD8tMToxKX06ZnVuY3Rpb24oYSxiKXtpZihhPT09YilyZXR1cm4gbD0hMCwwO3ZhciBjLGQ9MCxlPWEucGFyZW50Tm9kZSxmPWIucGFyZW50Tm9kZSxoPVthXSxpPVtiXTtpZighZXx8IWYpcmV0dXJuIGE9PT1nPy0xOmI9PT1nPzE6ZT8tMTpmPzE6az9KKGssYSktSihrLGIpOjA7aWYoZT09PWYpcmV0dXJuIGxiKGEsYik7Yz1hO3doaWxlKGM9Yy5wYXJlbnROb2RlKWgudW5zaGlmdChjKTtjPWI7d2hpbGUoYz1jLnBhcmVudE5vZGUpaS51bnNoaWZ0KGMpO3doaWxlKGhbZF09PT1pW2RdKWQrKztyZXR1cm4gZD9sYihoW2RdLGlbZF0pOmhbZF09PT12Py0xOmlbZF09PT12PzE6MH0sZyk6bn0sZ2IubWF0Y2hlcz1mdW5jdGlvbihhLGIpe3JldHVybiBnYihhLG51bGwsbnVsbCxiKX0sZ2IubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGEsYil7aWYoKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLGI9Yi5yZXBsYWNlKFUsIj0nJDEnXSIpLCEoIWMubWF0Y2hlc1NlbGVjdG9yfHwhcHx8ciYmci50ZXN0KGIpfHxxJiZxLnRlc3QoYikpKXRyeXt2YXIgZD1zLmNhbGwoYSxiKTtpZihkfHxjLmRpc2Nvbm5lY3RlZE1hdGNofHxhLmRvY3VtZW50JiYxMSE9PWEuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIGR9Y2F0Y2goZSl7fXJldHVybiBnYihiLG4sbnVsbCxbYV0pLmxlbmd0aD4wfSxnYi5jb250YWlucz1mdW5jdGlvbihhLGIpe3JldHVybihhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKSx0KGEsYil9LGdiLmF0dHI9ZnVuY3Rpb24oYSxiKXsoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSk7dmFyIGU9ZC5hdHRySGFuZGxlW2IudG9Mb3dlckNhc2UoKV0sZj1lJiZELmNhbGwoZC5hdHRySGFuZGxlLGIudG9Mb3dlckNhc2UoKSk/ZShhLGIsIXApOnZvaWQgMDtyZXR1cm4gdm9pZCAwIT09Zj9mOmMuYXR0cmlidXRlc3x8IXA/YS5nZXRBdHRyaWJ1dGUoYik6KGY9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpKSYmZi5zcGVjaWZpZWQ/Zi52YWx1ZTpudWxsfSxnYi5lcnJvcj1mdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrYSl9LGdiLnVuaXF1ZVNvcnQ9ZnVuY3Rpb24oYSl7dmFyIGIsZD1bXSxlPTAsZj0wO2lmKGw9IWMuZGV0ZWN0RHVwbGljYXRlcyxrPSFjLnNvcnRTdGFibGUmJmEuc2xpY2UoMCksYS5zb3J0KEIpLGwpe3doaWxlKGI9YVtmKytdKWI9PT1hW2ZdJiYoZT1kLnB1c2goZikpO3doaWxlKGUtLSlhLnNwbGljZShkW2VdLDEpfXJldHVybiBrPW51bGwsYX0sZT1nYi5nZXRUZXh0PWZ1bmN0aW9uKGEpe3ZhciBiLGM9IiIsZD0wLGY9YS5ub2RlVHlwZTtpZihmKXtpZigxPT09Znx8OT09PWZ8fDExPT09Zil7aWYoInN0cmluZyI9PXR5cGVvZiBhLnRleHRDb250ZW50KXJldHVybiBhLnRleHRDb250ZW50O2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyljKz1lKGEpfWVsc2UgaWYoMz09PWZ8fDQ9PT1mKXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIHdoaWxlKGI9YVtkKytdKWMrPWUoYik7cmV0dXJuIGN9LGQ9Z2Iuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86aWIsbWF0Y2g6WCxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV09YVsxXS5yZXBsYWNlKGNiLGRiKSxhWzNdPShhWzNdfHxhWzRdfHxhWzVdfHwiIikucmVwbGFjZShjYixkYiksIn49Ij09PWFbMl0mJihhWzNdPSIgIithWzNdKyIgIiksYS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1hWzFdLnNsaWNlKDAsMyk/KGFbM118fGdiLmVycm9yKGFbMF0pLGFbNF09KyhhWzRdP2FbNV0rKGFbNl18fDEpOjIqKCJldmVuIj09PWFbM118fCJvZGQiPT09YVszXSkpLGFbNV09KyhhWzddK2FbOF18fCJvZGQiPT09YVszXSkpOmFbM10mJmdiLmVycm9yKGFbMF0pLGF9LFBTRVVETzpmdW5jdGlvbihhKXt2YXIgYixjPSFhWzZdJiZhWzJdO3JldHVybiBYLkNISUxELnRlc3QoYVswXSk/bnVsbDooYVszXT9hWzJdPWFbNF18fGFbNV18fCIiOmMmJlYudGVzdChjKSYmKGI9ZyhjLCEwKSkmJihiPWMuaW5kZXhPZigiKSIsYy5sZW5ndGgtYiktYy5sZW5ndGgpJiYoYVswXT1hWzBdLnNsaWNlKDAsYiksYVsyXT1jLnNsaWNlKDAsYikpLGEuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2IsZGIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09YT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn19LENMQVNTOmZ1bmN0aW9uKGEpe3ZhciBiPXlbYSsiICJdO3JldHVybiBifHwoYj1uZXcgUmVnRXhwKCIoXnwiK0wrIikiK2ErIigiK0wrInwkKSIpKSYmeShhLGZ1bmN0aW9uKGEpe3JldHVybiBiLnRlc3QoInN0cmluZyI9PXR5cGVvZiBhLmNsYXNzTmFtZSYmYS5jbGFzc05hbWV8fCJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGQpe3ZhciBlPWdiLmF0dHIoZCxhKTtyZXR1cm4gbnVsbD09ZT8iIT0iPT09YjpiPyhlKz0iIiwiPSI9PT1iP2U9PT1jOiIhPSI9PT1iP2UhPT1jOiJePSI9PT1iP2MmJjA9PT1lLmluZGV4T2YoYyk6Iio9Ij09PWI/YyYmZS5pbmRleE9mKGMpPi0xOiIkPSI9PT1iP2MmJmUuc2xpY2UoLWMubGVuZ3RoKT09PWM6In49Ij09PWI/KCIgIitlLnJlcGxhY2UoUSwiICIpKyIgIikuaW5kZXhPZihjKT4tMToifD0iPT09Yj9lPT09Y3x8ZS5zbGljZSgwLGMubGVuZ3RoKzEpPT09YysiLSI6ITEpOiEwfX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj0ibnRoIiE9PWEuc2xpY2UoMCwzKSxnPSJsYXN0IiE9PWEuc2xpY2UoLTQpLGg9Im9mLXR5cGUiPT09YjtyZXR1cm4gMT09PWQmJjA9PT1lP2Z1bmN0aW9uKGEpe3JldHVybiEhYS5wYXJlbnROb2RlfTpmdW5jdGlvbihiLGMsaSl7dmFyIGosayxsLG0sbixvLHA9ZiE9PWc/Im5leHRTaWJsaW5nIjoicHJldmlvdXNTaWJsaW5nIixxPWIucGFyZW50Tm9kZSxyPWgmJmIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxzPSFpJiYhaDtpZihxKXtpZihmKXt3aGlsZShwKXtsPWI7d2hpbGUobD1sW3BdKWlmKGg/bC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09cjoxPT09bC5ub2RlVHlwZSlyZXR1cm4hMTtvPXA9Im9ubHkiPT09YSYmIW8mJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYobz1bZz9xLmZpcnN0Q2hpbGQ6cS5sYXN0Q2hpbGRdLGcmJnMpe2s9cVt1XXx8KHFbdV09e30pLGo9a1thXXx8W10sbj1qWzBdPT09dyYmalsxXSxtPWpbMF09PT13JiZqWzJdLGw9biYmcS5jaGlsZE5vZGVzW25dO3doaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKDE9PT1sLm5vZGVUeXBlJiYrK20mJmw9PT1iKXtrW2FdPVt3LG4sbV07YnJlYWt9fWVsc2UgaWYocyYmKGo9KGJbdV18fChiW3VdPXt9KSlbYV0pJiZqWzBdPT09dyltPWpbMV07ZWxzZSB3aGlsZShsPSsrbiYmbCYmbFtwXXx8KG09bj0wKXx8by5wb3AoKSlpZigoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKSYmKyttJiYocyYmKChsW3VdfHwobFt1XT17fSkpW2FdPVt3LG1dKSxsPT09YikpYnJlYWs7cmV0dXJuIG0tPWUsbT09PWR8fG0lZD09PTAmJm0vZD49MH19fSxQU0VVRE86ZnVuY3Rpb24oYSxiKXt2YXIgYyxlPWQucHNldWRvc1thXXx8ZC5zZXRGaWx0ZXJzW2EudG9Mb3dlckNhc2UoKV18fGdiLmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrYSk7cmV0dXJuIGVbdV0/ZShiKTplLmxlbmd0aD4xPyhjPVthLGEsIiIsYl0sZC5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGEudG9Mb3dlckNhc2UoKSk/aWIoZnVuY3Rpb24oYSxjKXt2YXIgZCxmPWUoYSxiKSxnPWYubGVuZ3RoO3doaWxlKGctLSlkPUooYSxmW2ddKSxhW2RdPSEoY1tkXT1mW2ddKX0pOmZ1bmN0aW9uKGEpe3JldHVybiBlKGEsMCxjKX0pOmV9fSxwc2V1ZG9zOntub3Q6aWIoZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxkPWgoYS5yZXBsYWNlKFIsIiQxIikpO3JldHVybiBkW3VdP2liKGZ1bmN0aW9uKGEsYixjLGUpe3ZhciBmLGc9ZChhLG51bGwsZSxbXSksaD1hLmxlbmd0aDt3aGlsZShoLS0pKGY9Z1toXSkmJihhW2hdPSEoYltoXT1mKSl9KTpmdW5jdGlvbihhLGUsZil7cmV0dXJuIGJbMF09YSxkKGIsbnVsbCxmLGMpLGJbMF09bnVsbCwhYy5wb3AoKX19KSxoYXM6aWIoZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBnYihhLGIpLmxlbmd0aD4wfX0pLGNvbnRhaW5zOmliKGZ1bmN0aW9uKGEpe3JldHVybiBhPWEucmVwbGFjZShjYixkYiksZnVuY3Rpb24oYil7cmV0dXJuKGIudGV4dENvbnRlbnR8fGIuaW5uZXJUZXh0fHxlKGIpKS5pbmRleE9mKGEpPi0xfX0pLGxhbmc6aWIoZnVuY3Rpb24oYSl7cmV0dXJuIFcudGVzdChhfHwiIil8fGdiLmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2EpLGE9YS5yZXBsYWNlKGNiLGRiKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGIpe3ZhciBjO2RvIGlmKGM9cD9iLmxhbmc6Yi5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGIuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuIGM9Yy50b0xvd2VyQ2FzZSgpLGM9PT1hfHwwPT09Yy5pbmRleE9mKGErIi0iKTt3aGlsZSgoYj1iLnBhcmVudE5vZGUpJiYxPT09Yi5ub2RlVHlwZSk7cmV0dXJuITF9fSksdGFyZ2V0OmZ1bmN0aW9uKGIpe3ZhciBjPWEubG9jYXRpb24mJmEubG9jYXRpb24uaGFzaDtyZXR1cm4gYyYmYy5zbGljZSgxKT09PWIuaWR9LHJvb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1vfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW4uYWN0aXZlRWxlbWVudCYmKCFuLmhhc0ZvY3VzfHxuLmhhc0ZvY3VzKCkpJiYhIShhLnR5cGV8fGEuaHJlZnx8fmEudGFiSW5kZXgpfSxlbmFibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITF9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYhIWEuY2hlY2tlZHx8Im9wdGlvbiI9PT1iJiYhIWEuc2VsZWN0ZWR9LHNlbGVjdGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LGEuc2VsZWN0ZWQ9PT0hMH0sZW1wdHk6ZnVuY3Rpb24oYSl7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWlmKGEubm9kZVR5cGU8NilyZXR1cm4hMTtyZXR1cm4hMH0scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiFkLnBzZXVkb3MuZW1wdHkoYSl9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4gWi50ZXN0KGEubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihhKXtyZXR1cm4gWS50ZXN0KGEubm9kZU5hbWUpfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1iJiYiYnV0dG9uIj09PWEudHlwZXx8ImJ1dHRvbiI9PT1ifSx0ZXh0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiJpbnB1dCI9PT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJiJ0ZXh0Ij09PWEudHlwZSYmKG51bGw9PShiPWEuZ2V0QXR0cmlidXRlKCJ0eXBlIikpfHwidGV4dCI9PT1iLnRvTG93ZXJDYXNlKCkpfSxmaXJzdDpvYihmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6b2IoZnVuY3Rpb24oYSxiKXtyZXR1cm5bYi0xXX0pLGVxOm9iKGZ1bmN0aW9uKGEsYixjKXtyZXR1cm5bMD5jP2MrYjpjXX0pLGV2ZW46b2IoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MDtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxvZGQ6b2IoZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MTtiPmM7Yys9MilhLnB1c2goYyk7cmV0dXJuIGF9KSxsdDpvYihmdW5jdGlvbihhLGIsYyl7Zm9yKHZhciBkPTA+Yz9jK2I6YzstLWQ+PTA7KWEucHVzaChkKTtyZXR1cm4gYX0pLGd0Om9iKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOysrZDxiOylhLnB1c2goZCk7cmV0dXJuIGF9KX19LGQucHNldWRvcy5udGg9ZC5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KWQucHNldWRvc1tiXT1tYihiKTtmb3IoYiBpbntzdWJtaXQ6ITAscmVzZXQ6ITB9KWQucHNldWRvc1tiXT1uYihiKTtmdW5jdGlvbiBxYigpe31xYi5wcm90b3R5cGU9ZC5maWx0ZXJzPWQucHNldWRvcyxkLnNldEZpbHRlcnM9bmV3IHFiLGc9Z2IudG9rZW5pemU9ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPXpbYSsiICJdO2lmKGspcmV0dXJuIGI/MDprLnNsaWNlKDApO2g9YSxpPVtdLGo9ZC5wcmVGaWx0ZXI7d2hpbGUoaCl7KCFjfHwoZT1TLmV4ZWMoaCkpKSYmKGUmJihoPWguc2xpY2UoZVswXS5sZW5ndGgpfHxoKSxpLnB1c2goZj1bXSkpLGM9ITEsKGU9VC5leGVjKGgpKSYmKGM9ZS5zaGlmdCgpLGYucHVzaCh7dmFsdWU6Yyx0eXBlOmVbMF0ucmVwbGFjZShSLCIgIil9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtmb3IoZyBpbiBkLmZpbHRlcikhKGU9WFtnXS5leGVjKGgpKXx8altnXSYmIShlPWpbZ10oZSkpfHwoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZyxtYXRjaGVzOmV9KSxoPWguc2xpY2UoYy5sZW5ndGgpKTtpZighYylicmVha31yZXR1cm4gYj9oLmxlbmd0aDpoP2diLmVycm9yKGEpOnooYSxpKS5zbGljZSgwKX07ZnVuY3Rpb24gcmIoYSl7Zm9yKHZhciBiPTAsYz1hLmxlbmd0aCxkPSIiO2M+YjtiKyspZCs9YVtiXS52YWx1ZTtyZXR1cm4gZH1mdW5jdGlvbiBzYihhLGIsYyl7dmFyIGQ9Yi5kaXIsZT1jJiYicGFyZW50Tm9kZSI9PT1kLGY9eCsrO3JldHVybiBiLmZpcnN0P2Z1bmN0aW9uKGIsYyxmKXt3aGlsZShiPWJbZF0paWYoMT09PWIubm9kZVR5cGV8fGUpcmV0dXJuIGEoYixjLGYpfTpmdW5jdGlvbihiLGMsZyl7dmFyIGgsaSxqPVt3LGZdO2lmKGcpe3doaWxlKGI9YltkXSlpZigoMT09PWIubm9kZVR5cGV8fGUpJiZhKGIsYyxnKSlyZXR1cm4hMH1lbHNlIHdoaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSl7aWYoaT1iW3VdfHwoYlt1XT17fSksKGg9aVtkXSkmJmhbMF09PT13JiZoWzFdPT09ZilyZXR1cm4galsyXT1oWzJdO2lmKGlbZF09aixqWzJdPWEoYixjLGcpKXJldHVybiEwfX19ZnVuY3Rpb24gdGIoYSl7cmV0dXJuIGEubGVuZ3RoPjE/ZnVuY3Rpb24oYixjLGQpe3ZhciBlPWEubGVuZ3RoO3doaWxlKGUtLSlpZighYVtlXShiLGMsZCkpcmV0dXJuITE7cmV0dXJuITB9OmFbMF19ZnVuY3Rpb24gdWIoYSxiLGMpe2Zvcih2YXIgZD0wLGU9Yi5sZW5ndGg7ZT5kO2QrKylnYihhLGJbZF0sYyk7cmV0dXJuIGN9ZnVuY3Rpb24gdmIoYSxiLGMsZCxlKXtmb3IodmFyIGYsZz1bXSxoPTAsaT1hLmxlbmd0aCxqPW51bGwhPWI7aT5oO2grKykoZj1hW2hdKSYmKCFjfHxjKGYsZCxlKSkmJihnLnB1c2goZiksaiYmYi5wdXNoKGgpKTtyZXR1cm4gZ31mdW5jdGlvbiB3YihhLGIsYyxkLGUsZil7cmV0dXJuIGQmJiFkW3VdJiYoZD13YihkKSksZSYmIWVbdV0mJihlPXdiKGUsZikpLGliKGZ1bmN0aW9uKGYsZyxoLGkpe3ZhciBqLGssbCxtPVtdLG49W10sbz1nLmxlbmd0aCxwPWZ8fHViKGJ8fCIqIixoLm5vZGVUeXBlP1toXTpoLFtdKSxxPSFhfHwhZiYmYj9wOnZiKHAsbSxhLGgsaSkscj1jP2V8fChmP2E6b3x8ZCk/W106ZzpxO2lmKGMmJmMocSxyLGgsaSksZCl7aj12YihyLG4pLGQoaixbXSxoLGkpLGs9ai5sZW5ndGg7d2hpbGUoay0tKShsPWpba10pJiYocltuW2tdXT0hKHFbbltrXV09bCkpfWlmKGYpe2lmKGV8fGEpe2lmKGUpe2o9W10saz1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJmoucHVzaChxW2tdPWwpO2UobnVsbCxyPVtdLGosaSl9az1yLmxlbmd0aDt3aGlsZShrLS0pKGw9cltrXSkmJihqPWU/SihmLGwpOm1ba10pPi0xJiYoZltqXT0hKGdbal09bCkpfX1lbHNlIHI9dmIocj09PWc/ci5zcGxpY2UobyxyLmxlbmd0aCk6ciksZT9lKG51bGwsZyxyLGkpOkguYXBwbHkoZyxyKX0pfWZ1bmN0aW9uIHhiKGEpe2Zvcih2YXIgYixjLGUsZj1hLmxlbmd0aCxnPWQucmVsYXRpdmVbYVswXS50eXBlXSxoPWd8fGQucmVsYXRpdmVbIiAiXSxpPWc/MTowLGs9c2IoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1ifSxoLCEwKSxsPXNiKGZ1bmN0aW9uKGEpe3JldHVybiBKKGIsYSk+LTF9LGgsITApLG09W2Z1bmN0aW9uKGEsYyxkKXt2YXIgZT0hZyYmKGR8fGMhPT1qKXx8KChiPWMpLm5vZGVUeXBlP2soYSxjLGQpOmwoYSxjLGQpKTtyZXR1cm4gYj1udWxsLGV9XTtmPmk7aSsrKWlmKGM9ZC5yZWxhdGl2ZVthW2ldLnR5cGVdKW09W3NiKHRiKG0pLGMpXTtlbHNle2lmKGM9ZC5maWx0ZXJbYVtpXS50eXBlXS5hcHBseShudWxsLGFbaV0ubWF0Y2hlcyksY1t1XSl7Zm9yKGU9KytpO2Y+ZTtlKyspaWYoZC5yZWxhdGl2ZVthW2VdLnR5cGVdKWJyZWFrO3JldHVybiB3YihpPjEmJnRiKG0pLGk+MSYmcmIoYS5zbGljZSgwLGktMSkuY29uY2F0KHt2YWx1ZToiICI9PT1hW2ktMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShSLCIkMSIpLGMsZT5pJiZ4YihhLnNsaWNlKGksZSkpLGY+ZSYmeGIoYT1hLnNsaWNlKGUpKSxmPmUmJnJiKGEpKX1tLnB1c2goYyl9cmV0dXJuIHRiKG0pfWZ1bmN0aW9uIHliKGEsYil7dmFyIGM9Yi5sZW5ndGg+MCxlPWEubGVuZ3RoPjAsZj1mdW5jdGlvbihmLGcsaCxpLGspe3ZhciBsLG0sbyxwPTAscT0iMCIscj1mJiZbXSxzPVtdLHQ9aix1PWZ8fGUmJmQuZmluZC5UQUcoIioiLGspLHY9dys9bnVsbD09dD8xOk1hdGgucmFuZG9tKCl8fC4xLHg9dS5sZW5ndGg7Zm9yKGsmJihqPWchPT1uJiZnKTtxIT09eCYmbnVsbCE9KGw9dVtxXSk7cSsrKXtpZihlJiZsKXttPTA7d2hpbGUobz1hW20rK10paWYobyhsLGcsaCkpe2kucHVzaChsKTticmVha31rJiYodz12KX1jJiYoKGw9IW8mJmwpJiZwLS0sZiYmci5wdXNoKGwpKX1pZihwKz1xLGMmJnEhPT1wKXttPTA7d2hpbGUobz1iW20rK10pbyhyLHMsZyxoKTtpZihmKXtpZihwPjApd2hpbGUocS0tKXJbcV18fHNbcV18fChzW3FdPUYuY2FsbChpKSk7cz12YihzKX1ILmFwcGx5KGkscyksayYmIWYmJnMubGVuZ3RoPjAmJnArYi5sZW5ndGg+MSYmZ2IudW5pcXVlU29ydChpKX1yZXR1cm4gayYmKHc9dixqPXQpLHJ9O3JldHVybiBjP2liKGYpOmZ9cmV0dXJuIGg9Z2IuY29tcGlsZT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1bXSxmPUFbYSsiICJdO2lmKCFmKXtifHwoYj1nKGEpKSxjPWIubGVuZ3RoO3doaWxlKGMtLSlmPXhiKGJbY10pLGZbdV0/ZC5wdXNoKGYpOmUucHVzaChmKTtmPUEoYSx5YihlLGQpKSxmLnNlbGVjdG9yPWF9cmV0dXJuIGZ9LGk9Z2Iuc2VsZWN0PWZ1bmN0aW9uKGEsYixlLGYpe3ZhciBpLGosayxsLG0sbj0iZnVuY3Rpb24iPT10eXBlb2YgYSYmYSxvPSFmJiZnKGE9bi5zZWxlY3Rvcnx8YSk7aWYoZT1lfHxbXSwxPT09by5sZW5ndGgpe2lmKGo9b1swXT1vWzBdLnNsaWNlKDApLGoubGVuZ3RoPjImJiJJRCI9PT0oaz1qWzBdKS50eXBlJiZjLmdldEJ5SWQmJjk9PT1iLm5vZGVUeXBlJiZwJiZkLnJlbGF0aXZlW2pbMV0udHlwZV0pe2lmKGI9KGQuZmluZC5JRChrLm1hdGNoZXNbMF0ucmVwbGFjZShjYixkYiksYil8fFtdKVswXSwhYilyZXR1cm4gZTtuJiYoYj1iLnBhcmVudE5vZGUpLGE9YS5zbGljZShqLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1pPVgubmVlZHNDb250ZXh0LnRlc3QoYSk/MDpqLmxlbmd0aDt3aGlsZShpLS0pe2lmKGs9altpXSxkLnJlbGF0aXZlW2w9ay50eXBlXSlicmVhaztpZigobT1kLmZpbmRbbF0pJiYoZj1tKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNiLGRiKSxhYi50ZXN0KGpbMF0udHlwZSkmJnBiKGIucGFyZW50Tm9kZSl8fGIpKSl7aWYoai5zcGxpY2UoaSwxKSxhPWYubGVuZ3RoJiZyYihqKSwhYSlyZXR1cm4gSC5hcHBseShlLGYpLGU7YnJlYWt9fX1yZXR1cm4obnx8aChhLG8pKShmLGIsIXAsZSxhYi50ZXN0KGEpJiZwYihiLnBhcmVudE5vZGUpfHxiKSxlfSxjLnNvcnRTdGFibGU9dS5zcGxpdCgiIikuc29ydChCKS5qb2luKCIiKT09PXUsYy5kZXRlY3REdXBsaWNhdGVzPSEhbCxtKCksYy5zb3J0RGV0YWNoZWQ9amIoZnVuY3Rpb24oYSl7cmV0dXJuIDEmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuLmNyZWF0ZUVsZW1lbnQoImRpdiIpKX0pLGpiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09YS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGtiKCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmEuZ2V0QXR0cmlidXRlKGIsInR5cGUiPT09Yi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxjLmF0dHJpYnV0ZXMmJmpiKGZ1bmN0aW9uKGEpe3JldHVybiBhLmlubmVySFRNTD0iPGlucHV0Lz4iLGEuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGtiKCJ2YWx1ZSIsZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjfHwiaW5wdXQiIT09YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3ZvaWQgMDphLmRlZmF1bHRWYWx1ZX0pLGpiKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxrYihLLGZ1bmN0aW9uKGEsYixjKXt2YXIgZDtyZXR1cm4gYz92b2lkIDA6YVtiXT09PSEwP2IudG9Mb3dlckNhc2UoKTooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZkLnNwZWNpZmllZD9kLnZhbHVlOm51bGx9KSxnYn0oYSk7bS5maW5kPXMsbS5leHByPXMuc2VsZWN0b3JzLG0uZXhwclsiOiJdPW0uZXhwci5wc2V1ZG9zLG0udW5pcXVlPXMudW5pcXVlU29ydCxtLnRleHQ9cy5nZXRUZXh0LG0uaXNYTUxEb2M9cy5pc1hNTCxtLmNvbnRhaW5zPXMuY29udGFpbnM7dmFyIHQ9bS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCx1PS9ePChcdyspXHMqXC8/Pig/OjxcL1wxPnwpJC8sdj0vXi5bXjojXFtcLixdKiQvO2Z1bmN0aW9uIHcoYSxiLGMpe2lmKG0uaXNGdW5jdGlvbihiKSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4hIWIuY2FsbChhLGQsYSkhPT1jfSk7aWYoYi5ub2RlVHlwZSlyZXR1cm4gbS5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1iIT09Y30pO2lmKCJzdHJpbmciPT10eXBlb2YgYil7aWYodi50ZXN0KGIpKXJldHVybiBtLmZpbHRlcihiLGEsYyk7Yj1tLmZpbHRlcihiLGEpfXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gbS5pbkFycmF5KGEsYik+PTAhPT1jfSl9bS5maWx0ZXI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWJbMF07cmV0dXJuIGMmJihhPSI6bm90KCIrYSsiKSIpLDE9PT1iLmxlbmd0aCYmMT09PWQubm9kZVR5cGU/bS5maW5kLm1hdGNoZXNTZWxlY3RvcihkLGEpP1tkXTpbXTptLmZpbmQubWF0Y2hlcyhhLG0uZ3JlcChiLGZ1bmN0aW9uKGEpe3JldHVybiAxPT09YS5ub2RlVHlwZX0pKX0sbS5mbi5leHRlbmQoe2ZpbmQ6ZnVuY3Rpb24oYSl7dmFyIGIsYz1bXSxkPXRoaXMsZT1kLmxlbmd0aDtpZigic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIHRoaXMucHVzaFN0YWNrKG0oYSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKGI9MDtlPmI7YisrKWlmKG0uY29udGFpbnMoZFtiXSx0aGlzKSlyZXR1cm4hMH0pKTtmb3IoYj0wO2U+YjtiKyspbS5maW5kKGEsZFtiXSxjKTtyZXR1cm4gYz10aGlzLnB1c2hTdGFjayhlPjE/bS51bmlxdWUoYyk6YyksYy5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yP3RoaXMuc2VsZWN0b3IrIiAiK2E6YSxjfSxmaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHcodGhpcyxhfHxbXSwhMCkpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIXcodGhpcywic3RyaW5nIj09dHlwZW9mIGEmJnQudGVzdChhKT9tKGEpOmF8fFtdLCExKS5sZW5ndGh9fSk7dmFyIHgseT1hLmRvY3VtZW50LHo9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0qKSkkLyxBPW0uZm4uaW5pdD1mdW5jdGlvbihhLGIpe3ZhciBjLGQ7aWYoIWEpcmV0dXJuIHRoaXM7aWYoInN0cmluZyI9PXR5cGVvZiBhKXtpZihjPSI8Ij09PWEuY2hhckF0KDApJiYiPiI9PT1hLmNoYXJBdChhLmxlbmd0aC0xKSYmYS5sZW5ndGg+PTM/W251bGwsYSxudWxsXTp6LmV4ZWMoYSksIWN8fCFjWzFdJiZiKXJldHVybiFifHxiLmpxdWVyeT8oYnx8eCkuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGIpLmZpbmQoYSk7aWYoY1sxXSl7aWYoYj1iIGluc3RhbmNlb2YgbT9iWzBdOmIsbS5tZXJnZSh0aGlzLG0ucGFyc2VIVE1MKGNbMV0sYiYmYi5ub2RlVHlwZT9iLm93bmVyRG9jdW1lbnR8fGI6eSwhMCkpLHUudGVzdChjWzFdKSYmbS5pc1BsYWluT2JqZWN0KGIpKWZvcihjIGluIGIpbS5pc0Z1bmN0aW9uKHRoaXNbY10pP3RoaXNbY10oYltjXSk6dGhpcy5hdHRyKGMsYltjXSk7cmV0dXJuIHRoaXN9aWYoZD15LmdldEVsZW1lbnRCeUlkKGNbMl0pLGQmJmQucGFyZW50Tm9kZSl7aWYoZC5pZCE9PWNbMl0pcmV0dXJuIHguZmluZChhKTt0aGlzLmxlbmd0aD0xLHRoaXNbMF09ZH1yZXR1cm4gdGhpcy5jb250ZXh0PXksdGhpcy5zZWxlY3Rvcj1hLHRoaXN9cmV0dXJuIGEubm9kZVR5cGU/KHRoaXMuY29udGV4dD10aGlzWzBdPWEsdGhpcy5sZW5ndGg9MSx0aGlzKTptLmlzRnVuY3Rpb24oYSk/InVuZGVmaW5lZCIhPXR5cGVvZiB4LnJlYWR5P3gucmVhZHkoYSk6YShtKToodm9pZCAwIT09YS5zZWxlY3RvciYmKHRoaXMuc2VsZWN0b3I9YS5zZWxlY3Rvcix0aGlzLmNvbnRleHQ9YS5jb250ZXh0KSxtLm1ha2VBcnJheShhLHRoaXMpKX07QS5wcm90b3R5cGU9bS5mbix4PW0oeSk7dmFyIEI9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sQz17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTttLmV4dGVuZCh7ZGlyOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlPWFbYl07d2hpbGUoZSYmOSE9PWUubm9kZVR5cGUmJih2b2lkIDA9PT1jfHwxIT09ZS5ub2RlVHlwZXx8IW0oZSkuaXMoYykpKTE9PT1lLm5vZGVUeXBlJiZkLnB1c2goZSksZT1lW2JdO3JldHVybiBkfSxzaWJsaW5nOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPVtdO2E7YT1hLm5leHRTaWJsaW5nKTE9PT1hLm5vZGVUeXBlJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pLG0uZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oYSl7dmFyIGIsYz1tKGEsdGhpcyksZD1jLmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2Q+YjtiKyspaWYobS5jb250YWlucyh0aGlzLGNbYl0pKXJldHVybiEwfSl9LGNsb3Nlc3Q6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGMsZD0wLGU9dGhpcy5sZW5ndGgsZj1bXSxnPXQudGVzdChhKXx8InN0cmluZyIhPXR5cGVvZiBhP20oYSxifHx0aGlzLmNvbnRleHQpOjA7ZT5kO2QrKylmb3IoYz10aGlzW2RdO2MmJmMhPT1iO2M9Yy5wYXJlbnROb2RlKWlmKGMubm9kZVR5cGU8MTEmJihnP2cuaW5kZXgoYyk+LTE6MT09PWMubm9kZVR5cGUmJm0uZmluZC5tYXRjaGVzU2VsZWN0b3IoYyxhKSkpe2YucHVzaChjKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soZi5sZW5ndGg+MT9tLnVuaXF1ZShmKTpmKX0saW5kZXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/InN0cmluZyI9PXR5cGVvZiBhP20uaW5BcnJheSh0aGlzWzBdLG0oYSkpOm0uaW5BcnJheShhLmpxdWVyeT9hWzBdOmEsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS51bmlxdWUobS5tZXJnZSh0aGlzLmdldCgpLG0oYSxiKSkpKX0sYWRkQmFjazpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09YT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihhKSl9fSk7ZnVuY3Rpb24gRChhLGIpe2RvIGE9YVtiXTt3aGlsZShhJiYxIT09YS5ub2RlVHlwZSk7cmV0dXJuIGF9bS5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYxMSE9PWIubm9kZVR5cGU/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBtLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBEKGEsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoKGEucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBtLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDptLm1lcmdlKFtdLGEuY2hpbGROb2Rlcyl9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYyxkKXt2YXIgZT1tLm1hcCh0aGlzLGIsYyk7cmV0dXJuIlVudGlsIiE9PWEuc2xpY2UoLTUpJiYoZD1jKSxkJiYic3RyaW5nIj09dHlwZW9mIGQmJihlPW0uZmlsdGVyKGQsZSkpLHRoaXMubGVuZ3RoPjEmJihDW2FdfHwoZT1tLnVuaXF1ZShlKSksQi50ZXN0KGEpJiYoZT1lLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGUpfX0pO3ZhciBFPS9cUysvZyxGPXt9O2Z1bmN0aW9uIEcoYSl7dmFyIGI9RlthXT17fTtyZXR1cm4gbS5lYWNoKGEubWF0Y2goRSl8fFtdLGZ1bmN0aW9uKGEsYyl7YltjXT0hMH0pLGJ9bS5DYWxsYmFja3M9ZnVuY3Rpb24oYSl7YT0ic3RyaW5nIj09dHlwZW9mIGE/RlthXXx8RyhhKTptLmV4dGVuZCh7fSxhKTt2YXIgYixjLGQsZSxmLGcsaD1bXSxpPSFhLm9uY2UmJltdLGo9ZnVuY3Rpb24obCl7Zm9yKGM9YS5tZW1vcnkmJmwsZD0hMCxmPWd8fDAsZz0wLGU9aC5sZW5ndGgsYj0hMDtoJiZlPmY7ZisrKWlmKGhbZl0uYXBwbHkobFswXSxsWzFdKT09PSExJiZhLnN0b3BPbkZhbHNlKXtjPSExO2JyZWFrfWI9ITEsaCYmKGk/aS5sZW5ndGgmJmooaS5zaGlmdCgpKTpjP2g9W106ay5kaXNhYmxlKCkpfSxrPXthZGQ6ZnVuY3Rpb24oKXtpZihoKXt2YXIgZD1oLmxlbmd0aDshZnVuY3Rpb24gZihiKXttLmVhY2goYixmdW5jdGlvbihiLGMpe3ZhciBkPW0udHlwZShjKTsiZnVuY3Rpb24iPT09ZD9hLnVuaXF1ZSYmay5oYXMoYyl8fGgucHVzaChjKTpjJiZjLmxlbmd0aCYmInN0cmluZyIhPT1kJiZmKGMpfSl9KGFyZ3VtZW50cyksYj9lPWgubGVuZ3RoOmMmJihnPWQsaihjKSl9cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiBoJiZtLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGEsYyl7dmFyIGQ7d2hpbGUoKGQ9bS5pbkFycmF5KGMsaCxkKSk+LTEpaC5zcGxpY2UoZCwxKSxiJiYoZT49ZCYmZS0tLGY+PWQmJmYtLSl9KSx0aGlzfSxoYXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/bS5pbkFycmF5KGEsaCk+LTE6ISghaHx8IWgubGVuZ3RoKX0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaD1bXSxlPTAsdGhpc30sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiBoPWk9Yz12b2lkIDAsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haH0sbG9jazpmdW5jdGlvbigpe3JldHVybiBpPXZvaWQgMCxjfHxrLmRpc2FibGUoKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sZmlyZVdpdGg6ZnVuY3Rpb24oYSxjKXtyZXR1cm4haHx8ZCYmIWl8fChjPWN8fFtdLGM9W2EsYy5zbGljZT9jLnNsaWNlKCk6Y10sYj9pLnB1c2goYyk6aihjKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBrLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhZH19O3JldHVybiBrfSxtLmV4dGVuZCh7RGVmZXJyZWQ6ZnVuY3Rpb24oYSl7dmFyIGI9W1sicmVzb2x2ZSIsImRvbmUiLG0uQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlamVjdGVkIl0sWyJub3RpZnkiLCJwcm9ncmVzcyIsbS5DYWxsYmFja3MoIm1lbW9yeSIpXV0sYz0icGVuZGluZyIsZD17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSx0aGVuOmZ1bmN0aW9uKCl7dmFyIGE9YXJndW1lbnRzO3JldHVybiBtLkRlZmVycmVkKGZ1bmN0aW9uKGMpe20uZWFjaChiLGZ1bmN0aW9uKGIsZil7dmFyIGc9bS5pc0Z1bmN0aW9uKGFbYl0pJiZhW2JdO2VbZlsxXV0oZnVuY3Rpb24oKXt2YXIgYT1nJiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKTthJiZtLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hLnByb21pc2UoKS5kb25lKGMucmVzb2x2ZSkuZmFpbChjLnJlamVjdCkucHJvZ3Jlc3MoYy5ub3RpZnkpOmNbZlswXSsiV2l0aCJdKHRoaXM9PT1kP2MucHJvbWlzZSgpOnRoaXMsZz9bYV06YXJndW1lbnRzKX0pfSksYT1udWxsfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT1hP20uZXh0ZW5kKGEsZCk6ZH19LGU9e307cmV0dXJuIGQucGlwZT1kLnRoZW4sbS5lYWNoKGIsZnVuY3Rpb24oYSxmKXt2YXIgZz1mWzJdLGg9ZlszXTtkW2ZbMV1dPWcuYWRkLGgmJmcuYWRkKGZ1bmN0aW9uKCl7Yz1ofSxiWzFeYV1bMl0uZGlzYWJsZSxiWzJdWzJdLmxvY2spLGVbZlswXV09ZnVuY3Rpb24oKXtyZXR1cm4gZVtmWzBdKyJXaXRoIl0odGhpcz09PWU/ZDp0aGlzLGFyZ3VtZW50cyksdGhpc30sZVtmWzBdKyJXaXRoIl09Zy5maXJlV2l0aH0pLGQucHJvbWlzZShlKSxhJiZhLmNhbGwoZSxlKSxlfSx3aGVuOmZ1bmN0aW9uKGEpe3ZhciBiPTAsYz1kLmNhbGwoYXJndW1lbnRzKSxlPWMubGVuZ3RoLGY9MSE9PWV8fGEmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2U6MCxnPTE9PT1mP2E6bS5EZWZlcnJlZCgpLGg9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmdW5jdGlvbihlKXtiW2FdPXRoaXMsY1thXT1hcmd1bWVudHMubGVuZ3RoPjE/ZC5jYWxsKGFyZ3VtZW50cyk6ZSxjPT09aT9nLm5vdGlmeVdpdGgoYixjKTotLWZ8fGcucmVzb2x2ZVdpdGgoYixjKX19LGksaixrO2lmKGU+MSlmb3IoaT1uZXcgQXJyYXkoZSksaj1uZXcgQXJyYXkoZSksaz1uZXcgQXJyYXkoZSk7ZT5iO2IrKyljW2JdJiZtLmlzRnVuY3Rpb24oY1tiXS5wcm9taXNlKT9jW2JdLnByb21pc2UoKS5kb25lKGgoYixrLGMpKS5mYWlsKGcucmVqZWN0KS5wcm9ncmVzcyhoKGIsaixpKSk6LS1mO3JldHVybiBmfHxnLnJlc29sdmVXaXRoKGssYyksZy5wcm9taXNlKCl9fSk7dmFyIEg7bS5mbi5yZWFkeT1mdW5jdGlvbihhKXtyZXR1cm4gbS5yZWFkeS5wcm9taXNlKCkuZG9uZShhKSx0aGlzfSxtLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9tLnJlYWR5V2FpdCsrOm0ucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITA/IS0tbS5yZWFkeVdhaXQ6IW0uaXNSZWFkeSl7aWYoIXkuYm9keSlyZXR1cm4gc2V0VGltZW91dChtLnJlYWR5KTttLmlzUmVhZHk9ITAsYSE9PSEwJiYtLW0ucmVhZHlXYWl0PjB8fChILnJlc29sdmVXaXRoKHksW21dKSxtLmZuLnRyaWdnZXJIYW5kbGVyJiYobSh5KS50cmlnZ2VySGFuZGxlcigicmVhZHkiKSxtKHkpLm9mZigicmVhZHkiKSkpfX19KTtmdW5jdGlvbiBJKCl7eS5hZGRFdmVudExpc3RlbmVyPyh5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSkpOih5LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuZGV0YWNoRXZlbnQoIm9ubG9hZCIsSikpfWZ1bmN0aW9uIEooKXsoeS5hZGRFdmVudExpc3RlbmVyfHwibG9hZCI9PT1ldmVudC50eXBlfHwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKSYmKEkoKSxtLnJlYWR5KCkpfW0ucmVhZHkucHJvbWlzZT1mdW5jdGlvbihiKXtpZighSClpZihIPW0uRGVmZXJyZWQoKSwiY29tcGxldGUiPT09eS5yZWFkeVN0YXRlKXNldFRpbWVvdXQobS5yZWFkeSk7ZWxzZSBpZih5LmFkZEV2ZW50TGlzdGVuZXIpeS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixKLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLEosITEpO2Vsc2V7eS5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixKKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLEopO3ZhciBjPSExO3RyeXtjPW51bGw9PWEuZnJhbWVFbGVtZW50JiZ5LmRvY3VtZW50RWxlbWVudH1jYXRjaChkKXt9YyYmYy5kb1Njcm9sbCYmIWZ1bmN0aW9uIGUoKXtpZighbS5pc1JlYWR5KXt0cnl7Yy5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGEpe3JldHVybiBzZXRUaW1lb3V0KGUsNTApfUkoKSxtLnJlYWR5KCl9fSgpfXJldHVybiBILnByb21pc2UoYil9O3ZhciBLPSJ1bmRlZmluZWQiLEw7Zm9yKEwgaW4gbShrKSlicmVhaztrLm93bkxhc3Q9IjAiIT09TCxrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsbShmdW5jdGlvbigpe3ZhciBhLGIsYyxkO2M9eS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYm9keSIpWzBdLGMmJmMuc3R5bGUmJihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9ImRpc3BsYXk6aW5saW5lO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD1hPTM9PT1iLm9mZnNldFdpZHRoLGEmJihjLnN0eWxlLnpvb209MSkpLGMucmVtb3ZlQ2hpbGQoZCkpfSksZnVuY3Rpb24oKXt2YXIgYT15LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2lmKG51bGw9PWsuZGVsZXRlRXhwYW5kbyl7ay5kZWxldGVFeHBhbmRvPSEwO3RyeXtkZWxldGUgYS50ZXN0fWNhdGNoKGIpe2suZGVsZXRlRXhwYW5kbz0hMX19YT1udWxsfSgpLG0uYWNjZXB0RGF0YT1mdW5jdGlvbihhKXt2YXIgYj1tLm5vRGF0YVsoYS5ub2RlTmFtZSsiICIpLnRvTG93ZXJDYXNlKCldLGM9K2Eubm9kZVR5cGV8fDE7cmV0dXJuIDEhPT1jJiY5IT09Yz8hMTohYnx8YiE9PSEwJiZhLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09Yn07dmFyIE09L14oPzpce1tcd1xXXSpcfXxcW1tcd1xXXSpcXSkkLyxOPS8oW0EtWl0pL2c7ZnVuY3Rpb24gTyhhLGIsYyl7aWYodm9pZCAwPT09YyYmMT09PWEubm9kZVR5cGUpe3ZhciBkPSJkYXRhLSIrYi5yZXBsYWNlKE4sIi0kMSIpLnRvTG93ZXJDYXNlKCk7aWYoYz1hLmdldEF0dHJpYnV0ZShkKSwic3RyaW5nIj09dHlwZW9mIGMpe3RyeXtjPSJ0cnVlIj09PWM/ITA6ImZhbHNlIj09PWM/ITE6Im51bGwiPT09Yz9udWxsOitjKyIiPT09Yz8rYzpNLnRlc3QoYyk/bS5wYXJzZUpTT04oYyk6Y31jYXRjaChlKXt9bS5kYXRhKGEsYixjKX1lbHNlIGM9dm9pZCAwfXJldHVybiBjfWZ1bmN0aW9uIFAoYSl7dmFyIGI7Zm9yKGIgaW4gYSlpZigoImRhdGEiIT09Ynx8IW0uaXNFbXB0eU9iamVjdChhW2JdKSkmJiJ0b0pTT04iIT09YilyZXR1cm4hMTsKcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWIoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYigpe3JldHVybiExfWZ1bmN0aW9uIGNiKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2IoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYigpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWI6YmIpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJiLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJiLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJiLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFiLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWIsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWIsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmI7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRiKGEpe3ZhciBiPWViLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYj0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmI9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYj1uZXcgUmVnRXhwKCI8KD86IitlYisiKVtcXHMvPl0iLCJpIiksaGI9L15ccysvLGliPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamI9LzwoW1x3Ol0rKS8sa2I9Lzx0Ym9keS9pLGxiPS88fCYjP1x3KzsvLG1iPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmI9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2I9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBiPS9edHJ1ZVwvKC4qKS8scWI9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJiPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2I9ZGIoeSksdGI9c2IuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmIub3B0Z3JvdXA9cmIub3B0aW9uLHJiLnRib2R5PXJiLnRmb290PXJiLmNvbGdyb3VwPXJiLmNhcHRpb249cmIudGhlYWQscmIudGg9cmIudGQ7ZnVuY3Rpb24gdWIoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWIoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZiKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdiKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YihhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWIoYSl7dmFyIGI9cGIuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YihhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYihhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYihhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGIoYikudGV4dD1hLnRleHQseWIoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYi50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRiLmlubmVySFRNTD1hLm91dGVySFRNTCx0Yi5yZW1vdmVDaGlsZChmPXRiLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YihmKSxoPXViKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmIoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWIoYSksZD1kfHx1YihmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFiKGUsZFtnXSk7ZWxzZSBBYihhLGYpO3JldHVybiBkPXViKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnpiKGQsIWkmJnViKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYihiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYi50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamIuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJiW2ldfHxyYi5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYiwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhiLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhiLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2IudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYi50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHViKHAsImlucHV0IiksdmIpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXViKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnpiKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2IudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13Yih0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdiKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWIoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6Yih1YihjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHViKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmIsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWIudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2IudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhiLnRlc3QoYSl8fHJiWyhqYi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGliLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YihiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWIodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5iLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YihpLCJzY3JpcHQiKSx4YiksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWIoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWIpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYi50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWIsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENiLERiPXt9O2Z1bmN0aW9uIEViKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYihhKXt2YXIgYj15LGM9RGJbYV07cmV0dXJuIGN8fChjPUViKGEsYiksIm5vbmUiIT09YyYmY3x8KENiPShDYnx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2JbMF0uY29udGVudFdpbmRvd3x8Q2JbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWIoYSxiKSxDYi5kZXRhY2goKSksRGJbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYj0vXm1hcmdpbi8sSGI9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYixKYixLYj0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYj1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYj1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fEliKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhiLnRlc3QoZykmJkdiLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWI9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYj1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fEliKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYi50ZXN0KGcpJiYhS2IudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExiKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYj0vYWxwaGFcKFteKV0qXCkvaSxOYj0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYj0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGI9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYj1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmI9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNiPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYj1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFViKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYi5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGJbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmIoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmIoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdiKGEsYixjKXt2YXIgZD1QYi5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhiKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWIoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUliKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYihhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhiLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hiKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUpiKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYihpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFiLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVViKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUpiKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNiJiYoZj1TYltiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2IudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYixmdW5jdGlvbigpe3JldHVybiBZYihhLGIsZCl9KTpZYihhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJkliKGEpO3JldHVybiBXYihhLGMsZD9YYihhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmIudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1iLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1iLnRlc3QoZik/Zi5yZXBsYWNlKE1iLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGIoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEpiLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdiLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdiKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWIoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZiKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZiKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYihhLGIsYyxkLGUpe3JldHVybiBuZXcgWmIucHJvdG90eXBlLmluaXQoYSxiLGMsZCxlKQp9bS5Ud2Vlbj1aYixaYi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlpiLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChtLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9WmIucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOlpiLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPVpiLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLnBvcz1iPXRoaXMub3B0aW9ucy5kdXJhdGlvbj9tLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTphLHRoaXMubm93PSh0aGlzLmVuZC10aGlzLnN0YXJ0KSpiK3RoaXMuc3RhcnQsdGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLGMmJmMuc2V0P2Muc2V0KHRoaXMpOlpiLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LFpiLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZT1aYi5wcm90b3R5cGUsWmIucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiO3JldHVybiBudWxsPT1hLmVsZW1bYS5wcm9wXXx8YS5lbGVtLnN0eWxlJiZudWxsIT1hLmVsZW0uc3R5bGVbYS5wcm9wXT8oYj1tLmNzcyhhLmVsZW0sYS5wcm9wLCIiKSxiJiYiYXV0byIhPT1iP2I6MCk6YS5lbGVtW2EucHJvcF19LHNldDpmdW5jdGlvbihhKXttLmZ4LnN0ZXBbYS5wcm9wXT9tLmZ4LnN0ZXBbYS5wcm9wXShhKTphLmVsZW0uc3R5bGUmJihudWxsIT1hLmVsZW0uc3R5bGVbbS5jc3NQcm9wc1thLnByb3BdXXx8bS5jc3NIb29rc1thLnByb3BdKT9tLnN0eWxlKGEuZWxlbSxhLnByb3AsYS5ub3crYS51bml0KTphLmVsZW1bYS5wcm9wXT1hLm5vd319fSxaYi5wcm9wSG9va3Muc2Nyb2xsVG9wPVpiLnByb3BIb29rcy5zY3JvbGxMZWZ0PXtzZXQ6ZnVuY3Rpb24oYSl7YS5lbGVtLm5vZGVUeXBlJiZhLmVsZW0ucGFyZW50Tm9kZSYmKGEuZWxlbVthLnByb3BdPWEubm93KX19LG0uZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LHN3aW5nOmZ1bmN0aW9uKGEpe3JldHVybi41LU1hdGguY29zKGEqTWF0aC5QSSkvMn19LG0uZng9WmIucHJvdG90eXBlLmluaXQsbS5meC5zdGVwPXt9O3ZhciAkYixfYixhYz0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sYmM9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK1MrIikoW2EteiVdKikkIiwiaSIpLGNjPS9xdWV1ZUhvb2tzJC8sZGM9W2ljXSxlYz17IioiOltmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuY3JlYXRlVHdlZW4oYSxiKSxkPWMuY3VyKCksZT1iYy5leGVjKGIpLGY9ZSYmZVszXXx8KG0uY3NzTnVtYmVyW2FdPyIiOiJweCIpLGc9KG0uY3NzTnVtYmVyW2FdfHwicHgiIT09ZiYmK2QpJiZiYy5leGVjKG0uY3NzKGMuZWxlbSxhKSksaD0xLGk9MjA7aWYoZyYmZ1szXSE9PWYpe2Y9Znx8Z1szXSxlPWV8fFtdLGc9K2R8fDE7ZG8gaD1ofHwiLjUiLGcvPWgsbS5zdHlsZShjLmVsZW0sYSxnK2YpO3doaWxlKGghPT0oaD1jLmN1cigpL2QpJiYxIT09aCYmLS1pKX1yZXR1cm4gZSYmKGc9Yy5zdGFydD0rZ3x8K2R8fDAsYy51bml0PWYsYy5lbmQ9ZVsxXT9nKyhlWzFdKzEpKmVbMl06K2VbMl0pLGN9XX07ZnVuY3Rpb24gZmMoKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpeyRiPXZvaWQgMH0pLCRiPW0ubm93KCl9ZnVuY3Rpb24gZ2MoYSxiKXt2YXIgYyxkPXtoZWlnaHQ6YX0sZT0wO2ZvcihiPWI/MTowOzQ+ZTtlKz0yLWIpYz1UW2VdLGRbIm1hcmdpbiIrY109ZFsicGFkZGluZyIrY109YTtyZXR1cm4gYiYmKGQub3BhY2l0eT1kLndpZHRoPWEpLGR9ZnVuY3Rpb24gaGMoYSxiLGMpe2Zvcih2YXIgZCxlPShlY1tiXXx8W10pLmNvbmNhdChlY1siKiJdKSxmPTAsZz1lLmxlbmd0aDtnPmY7ZisrKWlmKGQ9ZVtmXS5jYWxsKGMsYixhKSlyZXR1cm4gZH1mdW5jdGlvbiBpYyhhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosbCxuPXRoaXMsbz17fSxwPWEuc3R5bGUscT1hLm5vZGVUeXBlJiZVKGEpLHI9bS5fZGF0YShhLCJmeHNob3ciKTtjLnF1ZXVlfHwoaD1tLl9xdWV1ZUhvb2tzKGEsImZ4IiksbnVsbD09aC51bnF1ZXVlZCYmKGgudW5xdWV1ZWQ9MCxpPWguZW1wdHkuZmlyZSxoLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtoLnVucXVldWVkfHxpKCl9KSxoLnVucXVldWVkKyssbi5hbHdheXMoZnVuY3Rpb24oKXtuLmFsd2F5cyhmdW5jdGlvbigpe2gudW5xdWV1ZWQtLSxtLnF1ZXVlKGEsImZ4IikubGVuZ3RofHxoLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1hLm5vZGVUeXBlJiYoImhlaWdodCJpbiBifHwid2lkdGgiaW4gYikmJihjLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSxqPW0uY3NzKGEsImRpc3BsYXkiKSxsPSJub25lIj09PWo/bS5fZGF0YShhLCJvbGRkaXNwbGF5Iil8fEZiKGEubm9kZU5hbWUpOmosImlubGluZSI9PT1sJiYibm9uZSI9PT1tLmNzcyhhLCJmbG9hdCIpJiYoay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYiaW5saW5lIiE9PUZiKGEubm9kZU5hbWUpP3Auem9vbT0xOnAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLGMub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLGsuc2hyaW5rV3JhcEJsb2NrcygpfHxuLmFsd2F5cyhmdW5jdGlvbigpe3Aub3ZlcmZsb3c9Yy5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1jLm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPWMub3ZlcmZsb3dbMl19KSk7Zm9yKGQgaW4gYilpZihlPWJbZF0sYWMuZXhlYyhlKSl7aWYoZGVsZXRlIGJbZF0sZj1mfHwidG9nZ2xlIj09PWUsZT09PShxPyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1lfHwhcnx8dm9pZCAwPT09cltkXSljb250aW51ZTtxPSEwfW9bZF09ciYmcltkXXx8bS5zdHlsZShhLGQpfWVsc2Ugaj12b2lkIDA7aWYobS5pc0VtcHR5T2JqZWN0KG8pKSJpbmxpbmUiPT09KCJub25lIj09PWo/RmIoYS5ub2RlTmFtZSk6aikmJihwLmRpc3BsYXk9aik7ZWxzZXtyPyJoaWRkZW4iaW4gciYmKHE9ci5oaWRkZW4pOnI9bS5fZGF0YShhLCJmeHNob3ciLHt9KSxmJiYoci5oaWRkZW49IXEpLHE/bShhKS5zaG93KCk6bi5kb25lKGZ1bmN0aW9uKCl7bShhKS5oaWRlKCl9KSxuLmRvbmUoZnVuY3Rpb24oKXt2YXIgYjttLl9yZW1vdmVEYXRhKGEsImZ4c2hvdyIpO2ZvcihiIGluIG8pbS5zdHlsZShhLGIsb1tiXSl9KTtmb3IoZCBpbiBvKWc9aGMocT9yW2RdOjAsZCxuKSxkIGluIHJ8fChyW2RdPWcuc3RhcnQscSYmKGcuZW5kPWcuc3RhcnQsZy5zdGFydD0id2lkdGgiPT09ZHx8ImhlaWdodCI9PT1kPzE6MCkpfX1mdW5jdGlvbiBqYyhhLGIpe3ZhciBjLGQsZSxmLGc7Zm9yKGMgaW4gYSlpZihkPW0uY2FtZWxDYXNlKGMpLGU9YltkXSxmPWFbY10sbS5pc0FycmF5KGYpJiYoZT1mWzFdLGY9YVtjXT1mWzBdKSxjIT09ZCYmKGFbZF09ZixkZWxldGUgYVtjXSksZz1tLmNzc0hvb2tzW2RdLGcmJiJleHBhbmQiaW4gZyl7Zj1nLmV4cGFuZChmKSxkZWxldGUgYVtkXTtmb3IoYyBpbiBmKWMgaW4gYXx8KGFbY109ZltjXSxiW2NdPWUpfWVsc2UgYltkXT1lfWZ1bmN0aW9uIGtjKGEsYixjKXt2YXIgZCxlLGY9MCxnPWRjLmxlbmd0aCxoPW0uRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgaS5lbGVtfSksaT1mdW5jdGlvbigpe2lmKGUpcmV0dXJuITE7Zm9yKHZhciBiPSRifHxmYygpLGM9TWF0aC5tYXgoMCxqLnN0YXJ0VGltZStqLmR1cmF0aW9uLWIpLGQ9Yy9qLmR1cmF0aW9ufHwwLGY9MS1kLGc9MCxpPWoudHdlZW5zLmxlbmd0aDtpPmc7ZysrKWoudHdlZW5zW2ddLnJ1bihmKTtyZXR1cm4gaC5ub3RpZnlXaXRoKGEsW2osZixjXSksMT5mJiZpP2M6KGgucmVzb2x2ZVdpdGgoYSxbal0pLCExKX0saj1oLnByb21pc2Uoe2VsZW06YSxwcm9wczptLmV4dGVuZCh7fSxiKSxvcHRzOm0uZXh0ZW5kKCEwLHtzcGVjaWFsRWFzaW5nOnt9fSxjKSxvcmlnaW5hbFByb3BlcnRpZXM6YixvcmlnaW5hbE9wdGlvbnM6YyxzdGFydFRpbWU6JGJ8fGZjKCksZHVyYXRpb246Yy5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oYixjKXt2YXIgZD1tLlR3ZWVuKGEsai5vcHRzLGIsYyxqLm9wdHMuc3BlY2lhbEVhc2luZ1tiXXx8ai5vcHRzLmVhc2luZyk7cmV0dXJuIGoudHdlZW5zLnB1c2goZCksZH0sc3RvcDpmdW5jdGlvbihiKXt2YXIgYz0wLGQ9Yj9qLnR3ZWVucy5sZW5ndGg6MDtpZihlKXJldHVybiB0aGlzO2ZvcihlPSEwO2Q+YztjKyspai50d2VlbnNbY10ucnVuKDEpO3JldHVybiBiP2gucmVzb2x2ZVdpdGgoYSxbaixiXSk6aC5yZWplY3RXaXRoKGEsW2osYl0pLHRoaXN9fSksaz1qLnByb3BzO2ZvcihqYyhrLGoub3B0cy5zcGVjaWFsRWFzaW5nKTtnPmY7ZisrKWlmKGQ9ZGNbZl0uY2FsbChqLGEsayxqLm9wdHMpKXJldHVybiBkO3JldHVybiBtLm1hcChrLGhjLGopLG0uaXNGdW5jdGlvbihqLm9wdHMuc3RhcnQpJiZqLm9wdHMuc3RhcnQuY2FsbChhLGopLG0uZngudGltZXIobS5leHRlbmQoaSx7ZWxlbTphLGFuaW06aixxdWV1ZTpqLm9wdHMucXVldWV9KSksai5wcm9ncmVzcyhqLm9wdHMucHJvZ3Jlc3MpLmRvbmUoai5vcHRzLmRvbmUsai5vcHRzLmNvbXBsZXRlKS5mYWlsKGoub3B0cy5mYWlsKS5hbHdheXMoai5vcHRzLmFsd2F5cyl9bS5BbmltYXRpb249bS5leHRlbmQoa2Mse3R3ZWVuZXI6ZnVuY3Rpb24oYSxiKXttLmlzRnVuY3Rpb24oYSk/KGI9YSxhPVsiKiJdKTphPWEuc3BsaXQoIiAiKTtmb3IodmFyIGMsZD0wLGU9YS5sZW5ndGg7ZT5kO2QrKyljPWFbZF0sZWNbY109ZWNbY118fFtdLGVjW2NdLnVuc2hpZnQoYil9LHByZWZpbHRlcjpmdW5jdGlvbihhLGIpe2I/ZGMudW5zaGlmdChhKTpkYy5wdXNoKGEpfX0pLG0uc3BlZWQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEmJiJvYmplY3QiPT10eXBlb2YgYT9tLmV4dGVuZCh7fSxhKTp7Y29tcGxldGU6Y3x8IWMmJmJ8fG0uaXNGdW5jdGlvbihhKSYmYSxkdXJhdGlvbjphLGVhc2luZzpjJiZifHxiJiYhbS5pc0Z1bmN0aW9uKGIpJiZifTtyZXR1cm4gZC5kdXJhdGlvbj1tLmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2YgZC5kdXJhdGlvbj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gbS5meC5zcGVlZHM/bS5meC5zcGVlZHNbZC5kdXJhdGlvbl06bS5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PWQucXVldWV8fGQucXVldWU9PT0hMCkmJihkLnF1ZXVlPSJmeCIpLGQub2xkPWQuY29tcGxldGUsZC5jb21wbGV0ZT1mdW5jdGlvbigpe20uaXNGdW5jdGlvbihkLm9sZCkmJmQub2xkLmNhbGwodGhpcyksZC5xdWV1ZSYmbS5kZXF1ZXVlKHRoaXMsZC5xdWV1ZSl9LGR9LG0uZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuZmlsdGVyKFUpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPW0uaXNFbXB0eU9iamVjdChhKSxmPW0uc3BlZWQoYixjLGQpLGc9ZnVuY3Rpb24oKXt2YXIgYj1rYyh0aGlzLG0uZXh0ZW5kKHt9LGEpLGYpOyhlfHxtLl9kYXRhKHRoaXMsImZpbmlzaCIpKSYmYi5zdG9wKCEwKX07cmV0dXJuIGcuZmluaXNoPWcsZXx8Zi5xdWV1ZT09PSExP3RoaXMuZWFjaChnKTp0aGlzLnF1ZXVlKGYucXVldWUsZyl9LHN0b3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWEuc3RvcDtkZWxldGUgYS5zdG9wLGIoYyl9O3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGM9YixiPWEsYT12b2lkIDApLGImJmEhPT0hMSYmdGhpcy5xdWV1ZShhfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj0hMCxlPW51bGwhPWEmJmErInF1ZXVlSG9va3MiLGY9bS50aW1lcnMsZz1tLl9kYXRhKHRoaXMpO2lmKGUpZ1tlXSYmZ1tlXS5zdG9wJiZkKGdbZV0pO2Vsc2UgZm9yKGUgaW4gZylnW2VdJiZnW2VdLnN0b3AmJmNjLnRlc3QoZSkmJmQoZ1tlXSk7Zm9yKGU9Zi5sZW5ndGg7ZS0tOylmW2VdLmVsZW0hPT10aGlzfHxudWxsIT1hJiZmW2VdLnF1ZXVlIT09YXx8KGZbZV0uYW5pbS5zdG9wKGMpLGI9ITEsZi5zcGxpY2UoZSwxKSk7KGJ8fCFjKSYmbS5kZXF1ZXVlKHRoaXMsYSl9KX0sZmluaXNoOmZ1bmN0aW9uKGEpe3JldHVybiBhIT09ITEmJihhPWF8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiLGM9bS5fZGF0YSh0aGlzKSxkPWNbYSsicXVldWUiXSxlPWNbYSsicXVldWVIb29rcyJdLGY9bS50aW1lcnMsZz1kP2QubGVuZ3RoOjA7Zm9yKGMuZmluaXNoPSEwLG0ucXVldWUodGhpcyxhLFtdKSxlJiZlLnN0b3AmJmUuc3RvcC5jYWxsKHRoaXMsITApLGI9Zi5sZW5ndGg7Yi0tOylmW2JdLmVsZW09PT10aGlzJiZmW2JdLnF1ZXVlPT09YSYmKGZbYl0uYW5pbS5zdG9wKCEwKSxmLnNwbGljZShiLDEpKTtmb3IoYj0wO2c+YjtiKyspZFtiXSYmZFtiXS5maW5pc2gmJmRbYl0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIGMuZmluaXNofSl9fSksbS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihhLGIpe3ZhciBjPW0uZm5bYl07bS5mbltiXT1mdW5jdGlvbihhLGQsZSl7cmV0dXJuIG51bGw9PWF8fCJib29sZWFuIj09dHlwZW9mIGE/Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGdjKGIsITApLGEsZCxlKX19KSxtLmVhY2goe3NsaWRlRG93bjpnYygic2hvdyIpLHNsaWRlVXA6Z2MoImhpZGUiKSxzbGlkZVRvZ2dsZTpnYygidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe20uZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksbS50aW1lcnM9W10sbS5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGEsYj1tLnRpbWVycyxjPTA7Zm9yKCRiPW0ubm93KCk7YzxiLmxlbmd0aDtjKyspYT1iW2NdLGEoKXx8YltjXSE9PWF8fGIuc3BsaWNlKGMtLSwxKTtiLmxlbmd0aHx8bS5meC5zdG9wKCksJGI9dm9pZCAwfSxtLmZ4LnRpbWVyPWZ1bmN0aW9uKGEpe20udGltZXJzLnB1c2goYSksYSgpP20uZnguc3RhcnQoKTptLnRpbWVycy5wb3AoKX0sbS5meC5pbnRlcnZhbD0xMyxtLmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7X2J8fChfYj1zZXRJbnRlcnZhbChtLmZ4LnRpY2ssbS5meC5pbnRlcnZhbCkpfSxtLmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKF9iKSxfYj1udWxsfSxtLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxtLmZuLmRlbGF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bS5meD9tLmZ4LnNwZWVkc1thXXx8YTphLGI9Ynx8ImZ4Iix0aGlzLnF1ZXVlKGIsZnVuY3Rpb24oYixjKXt2YXIgZD1zZXRUaW1lb3V0KGIsYSk7Yy5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KGQpfX0pfSxmdW5jdGlvbigpe3ZhciBhLGIsYyxkLGU7Yj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGIuc2V0QXR0cmlidXRlKCJjbGFzc05hbWUiLCJ0IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz15LmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGU9Yy5hcHBlbmRDaGlsZCh5LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sZC5zdHlsZS5jc3NUZXh0PSJ0b3A6MXB4IixrLmdldFNldEF0dHJpYnV0ZT0idCIhPT1iLmNsYXNzTmFtZSxrLnN0eWxlPS90b3AvLnRlc3QoZC5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGsuaHJlZk5vcm1hbGl6ZWQ9Ii9hIj09PWQuZ2V0QXR0cmlidXRlKCJocmVmIiksay5jaGVja09uPSEhYS52YWx1ZSxrLm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsay5lbmN0eXBlPSEheS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxjLmRpc2FibGVkPSEwLGsub3B0RGlzYWJsZWQ9IWUuZGlzYWJsZWQsYT15LmNyZWF0ZUVsZW1lbnQoImlucHV0IiksYS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksay5pbnB1dD0iIj09PWEuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpLGEudmFsdWU9InQiLGEuc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxrLnJhZGlvVmFsdWU9InQiPT09YS52YWx1ZX0oKTt2YXIgbGM9L1xyL2c7bS5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBkPW0uaXNGdW5jdGlvbihhKSx0aGlzLmVhY2goZnVuY3Rpb24oYyl7dmFyIGU7MT09PXRoaXMubm9kZVR5cGUmJihlPWQ/YS5jYWxsKHRoaXMsYyxtKHRoaXMpLnZhbCgpKTphLG51bGw9PWU/ZT0iIjoibnVtYmVyIj09dHlwZW9mIGU/ZSs9IiI6bS5pc0FycmF5KGUpJiYoZT1tLm1hcChlLGZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT1hPyIiOmErIiJ9KSksYj1tLnZhbEhvb2tzW3RoaXMudHlwZV18fG0udmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYic2V0ImluIGImJnZvaWQgMCE9PWIuc2V0KHRoaXMsZSwidmFsdWUiKXx8KHRoaXMudmFsdWU9ZSkpfSk7aWYoZSlyZXR1cm4gYj1tLnZhbEhvb2tzW2UudHlwZV18fG0udmFsSG9va3NbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxiJiYiZ2V0ImluIGImJnZvaWQgMCE9PShjPWIuZ2V0KGUsInZhbHVlIikpP2M6KGM9ZS52YWx1ZSwic3RyaW5nIj09dHlwZW9mIGM/Yy5yZXBsYWNlKGxjLCIiKTpudWxsPT1jPyIiOmMpfX19KSxtLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInZhbHVlIik7cmV0dXJuIG51bGwhPWI/YjptLnRyaW0obS50ZXh0KGEpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYixjLGQ9YS5vcHRpb25zLGU9YS5zZWxlY3RlZEluZGV4LGY9InNlbGVjdC1vbmUiPT09YS50eXBlfHwwPmUsZz1mP251bGw6W10saD1mP2UrMTpkLmxlbmd0aCxpPTA+ZT9oOmY/ZTowO2g+aTtpKyspaWYoYz1kW2ldLCEoIWMuc2VsZWN0ZWQmJmkhPT1lfHwoay5vcHREaXNhYmxlZD9jLmRpc2FibGVkOm51bGwhPT1jLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKSl8fGMucGFyZW50Tm9kZS5kaXNhYmxlZCYmbS5ub2RlTmFtZShjLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZihiPW0oYykudmFsKCksZilyZXR1cm4gYjtnLnB1c2goYil9cmV0dXJuIGd9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZT1hLm9wdGlvbnMsZj1tLm1ha2VBcnJheShiKSxnPWUubGVuZ3RoO3doaWxlKGctLSlpZihkPWVbZ10sbS5pbkFycmF5KG0udmFsSG9va3Mub3B0aW9uLmdldChkKSxmKT49MCl0cnl7ZC5zZWxlY3RlZD1jPSEwfWNhdGNoKGgpe2Quc2Nyb2xsSGVpZ2h0fWVsc2UgZC5zZWxlY3RlZD0hMTtyZXR1cm4gY3x8KGEuc2VsZWN0ZWRJbmRleD0tMSksZX19fX0pLG0uZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe20udmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmlzQXJyYXkoYik/YS5jaGVja2VkPW0uaW5BcnJheShtKGEpLnZhbCgpLGIpPj0wOnZvaWQgMH19LGsuY2hlY2tPbnx8KG0udmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBudWxsPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjphLnZhbHVlfSl9KTt2YXIgbWMsbmMsb2M9bS5leHByLmF0dHJIYW5kbGUscGM9L14oPzpjaGVja2VkfHNlbGVjdGVkKSQvaSxxYz1rLmdldFNldEF0dHJpYnV0ZSxyYz1rLmlucHV0O20uZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFYodGhpcyxtLmF0dHIsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20ucmVtb3ZlQXR0cih0aGlzLGEpfSl9fSksbS5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZj1hLm5vZGVUeXBlO2lmKGEmJjMhPT1mJiY4IT09ZiYmMiE9PWYpcmV0dXJuIHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09PUs/bS5wcm9wKGEsYixjKTooMT09PWYmJm0uaXNYTUxEb2MoYSl8fChiPWIudG9Mb3dlckNhc2UoKSxkPW0uYXR0ckhvb2tzW2JdfHwobS5leHByLm1hdGNoLmJvb2wudGVzdChiKT9uYzptYykpLHZvaWQgMD09PWM/ZCYmImdldCJpbiBkJiZudWxsIT09KGU9ZC5nZXQoYSxiKSk/ZTooZT1tLmZpbmQuYXR0cihhLGIpLG51bGw9PWU/dm9pZCAwOmUpOm51bGwhPT1jP2QmJiJzZXQiaW4gZCYmdm9pZCAwIT09KGU9ZC5zZXQoYSxjLGIpKT9lOihhLnNldEF0dHJpYnV0ZShiLGMrIiIpLGMpOnZvaWQgbS5yZW1vdmVBdHRyKGEsYikpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPTAsZj1iJiZiLm1hdGNoKEUpO2lmKGYmJjE9PT1hLm5vZGVUeXBlKXdoaWxlKGM9ZltlKytdKWQ9bS5wcm9wRml4W2NdfHxjLG0uZXhwci5tYXRjaC5ib29sLnRlc3QoYyk/cmMmJnFjfHwhcGMudGVzdChjKT9hW2RdPSExOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtkXT0hMTptLmF0dHIoYSxjLCIiKSxhLnJlbW92ZUF0dHJpYnV0ZShxYz9jOmQpfSxhdHRySG9va3M6e3R5cGU6e3NldDpmdW5jdGlvbihhLGIpe2lmKCFrLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT1iJiZtLm5vZGVOYW1lKGEsImlucHV0Iikpe3ZhciBjPWEudmFsdWU7cmV0dXJuIGEuc2V0QXR0cmlidXRlKCJ0eXBlIixiKSxjJiYoYS52YWx1ZT1jKSxifX19fX0pLG5jPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiPT09ITE/bS5yZW1vdmVBdHRyKGEsYyk6cmMmJnFjfHwhcGMudGVzdChjKT9hLnNldEF0dHJpYnV0ZSghcWMmJm0ucHJvcEZpeFtjXXx8YyxjKTphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYyldPWFbY109ITAsY319LG0uZWFjaChtLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihhLGIpe3ZhciBjPW9jW2JdfHxtLmZpbmQuYXR0cjtvY1tiXT1yYyYmcWN8fCFwYy50ZXN0KGIpP2Z1bmN0aW9uKGEsYixkKXt2YXIgZSxmO3JldHVybiBkfHwoZj1vY1tiXSxvY1tiXT1lLGU9bnVsbCE9YyhhLGIsZCk/Yi50b0xvd2VyQ2FzZSgpOm51bGwsb2NbYl09ZiksZX06ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjP3ZvaWQgMDphW20uY2FtZWxDYXNlKCJkZWZhdWx0LSIrYildP2IudG9Mb3dlckNhc2UoKTpudWxsfX0pLHJjJiZxY3x8KG0uYXR0ckhvb2tzLnZhbHVlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBtLm5vZGVOYW1lKGEsImlucHV0Iik/dm9pZChhLmRlZmF1bHRWYWx1ZT1iKTptYyYmbWMuc2V0KGEsYixjKX19KSxxY3x8KG1jPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPWEuZ2V0QXR0cmlidXRlTm9kZShjKTtyZXR1cm4gZHx8YS5zZXRBdHRyaWJ1dGVOb2RlKGQ9YS5vd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShjKSksZC52YWx1ZT1iKz0iIiwidmFsdWUiPT09Y3x8Yj09PWEuZ2V0QXR0cmlidXRlKGMpP2I6dm9pZCAwfX0sb2MuaWQ9b2MubmFtZT1vYy5jb29yZHM9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDooZD1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiYiIiE9PWQudmFsdWU/ZC52YWx1ZTpudWxsfSxtLnZhbEhvb2tzLmJ1dHRvbj17Z2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5nZXRBdHRyaWJ1dGVOb2RlKGIpO3JldHVybiBjJiZjLnNwZWNpZmllZD9jLnZhbHVlOnZvaWQgMH0sc2V0Om1jLnNldH0sbS5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtzZXQ6ZnVuY3Rpb24oYSxiLGMpe21jLnNldChhLCIiPT09Yj8hMTpiLGMpfX0sbS5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihhLGIpe20uYXR0ckhvb2tzW2JdPXtzZXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4iIj09PWM/KGEuc2V0QXR0cmlidXRlKGIsImF1dG8iKSxjKTp2b2lkIDB9fX0pKSxrLnN0eWxlfHwobS5hdHRySG9va3Muc3R5bGU9e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdHlsZS5jc3NUZXh0fHx2b2lkIDB9LHNldDpmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0eWxlLmNzc1RleHQ9YisiIn19KTt2YXIgc2M9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9ufG9iamVjdCkkL2ksdGM9L14oPzphfGFyZWEpJC9pO20uZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFYodGhpcyxtLnByb3AsYSxiLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9bS5wcm9wRml4W2FdfHxhLHRoaXMuZWFjaChmdW5jdGlvbigpe3RyeXt0aGlzW2FdPXZvaWQgMCxkZWxldGUgdGhpc1thXX1jYXRjaChiKXt9fSl9fSksbS5leHRlbmQoe3Byb3BGaXg6eyJmb3IiOiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUifSxwcm9wOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZz1hLm5vZGVUeXBlO2lmKGEmJjMhPT1nJiY4IT09ZyYmMiE9PWcpcmV0dXJuIGY9MSE9PWd8fCFtLmlzWE1MRG9jKGEpLGYmJihiPW0ucHJvcEZpeFtiXXx8YixlPW0ucHJvcEhvb2tzW2JdKSx2b2lkIDAhPT1jP2UmJiJzZXQiaW4gZSYmdm9pZCAwIT09KGQ9ZS5zZXQoYSxjLGIpKT9kOmFbYl09YzplJiYiZ2V0ImluIGUmJm51bGwhPT0oZD1lLmdldChhLGIpKT9kOmFbYl19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihhKXt2YXIgYj1tLmZpbmQuYXR0cihhLCJ0YWJpbmRleCIpO3JldHVybiBiP3BhcnNlSW50KGIsMTApOnNjLnRlc3QoYS5ub2RlTmFtZSl8fHRjLnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOi0xfX19fSksay5ocmVmTm9ybWFsaXplZHx8bS5lYWNoKFsiaHJlZiIsInNyYyJdLGZ1bmN0aW9uKGEsYil7bS5wcm9wSG9va3NbYl09e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoYiw0KX19fSksay5vcHRTZWxlY3RlZHx8KG0ucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiYoYi5zZWxlY3RlZEluZGV4LGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgpLG51bGx9fSksbS5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXttLnByb3BGaXhbdGhpcy50b0xvd2VyQ2FzZSgpXT10aGlzfSksay5lbmN0eXBlfHwobS5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIik7dmFyIHVjPS9bXHRcclxuXGZdL2c7bS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTAsaT10aGlzLmxlbmd0aCxqPSJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLmFkZENsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHVjLCIgIik6IiAiKSl7Zj0wO3doaWxlKGU9YltmKytdKWQuaW5kZXhPZigiICIrZSsiICIpPDAmJihkKz1lKyIgIik7Zz1tLnRyaW0oZCksYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGYsZyxoPTAsaT10aGlzLmxlbmd0aCxqPTA9PT1hcmd1bWVudHMubGVuZ3RofHwic3RyaW5nIj09dHlwZW9mIGEmJmE7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihqKWZvcihiPShhfHwiIikubWF0Y2goRSl8fFtdO2k+aDtoKyspaWYoYz10aGlzW2hdLGQ9MT09PWMubm9kZVR5cGUmJihjLmNsYXNzTmFtZT8oIiAiK2MuY2xhc3NOYW1lKyIgIikucmVwbGFjZSh1YywiICIpOiIiKSl7Zj0wO3doaWxlKGU9YltmKytdKXdoaWxlKGQuaW5kZXhPZigiICIrZSsiICIpPj0wKWQ9ZC5yZXBsYWNlKCIgIitlKyIgIiwiICIpO2c9YT9tLnRyaW0oZCk6IiIsYy5jbGFzc05hbWUhPT1nJiYoYy5jbGFzc05hbWU9Zyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGE7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYiYmInN0cmluZyI9PT1jP2I/dGhpcy5hZGRDbGFzcyhhKTp0aGlzLnJlbW92ZUNsYXNzKGEpOnRoaXMuZWFjaChtLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYyl7bSh0aGlzKS50b2dnbGVDbGFzcyhhLmNhbGwodGhpcyxjLHRoaXMuY2xhc3NOYW1lLGIpLGIpfTpmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09Yyl7dmFyIGIsZD0wLGU9bSh0aGlzKSxmPWEubWF0Y2goRSl8fFtdO3doaWxlKGI9ZltkKytdKWUuaGFzQ2xhc3MoYik/ZS5yZW1vdmVDbGFzcyhiKTplLmFkZENsYXNzKGIpfWVsc2UoYz09PUt8fCJib29sZWFuIj09PWMpJiYodGhpcy5jbGFzc05hbWUmJm0uX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6bS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiAiK2ErIiAiLGM9MCxkPXRoaXMubGVuZ3RoO2Q+YztjKyspaWYoMT09PXRoaXNbY10ubm9kZVR5cGUmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHVjLCIgIikuaW5kZXhPZihiKT49MClyZXR1cm4hMDtyZXR1cm4hMX19KSxtLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKGIsbnVsbCxhLGMpOnRoaXMudHJpZ2dlcihiKX19KSxtLmZuLmV4dGVuZCh7aG92ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGEpLm1vdXNlbGVhdmUoYnx8YSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMub2ZmKGEsIioqIik6dGhpcy5vZmYoYixhfHwiKioiLGMpfX0pO3ZhciB2Yz1tLm5vdygpLHdjPS9cPy8seGM9LygsKXwoXFt8eyl8KH18XSl8Iig/OlteIlxcXHJcbl18XFxbIlxcXC9iZm5ydF18XFx1W1xkYS1mQS1GXXs0fSkqIlxzKjo/fHRydWV8ZmFsc2V8bnVsbHwtPyg/ITBcZClcZCsoPzpcLlxkK3wpKD86W2VFXVsrLV0/XGQrfCkvZzttLnBhcnNlSlNPTj1mdW5jdGlvbihiKXtpZihhLkpTT04mJmEuSlNPTi5wYXJzZSlyZXR1cm4gYS5KU09OLnBhcnNlKGIrIiIpO3ZhciBjLGQ9bnVsbCxlPW0udHJpbShiKyIiKTtyZXR1cm4gZSYmIW0udHJpbShlLnJlcGxhY2UoeGMsZnVuY3Rpb24oYSxiLGUsZil7cmV0dXJuIGMmJmImJihkPTApLDA9PT1kP2E6KGM9ZXx8YixkKz0hZi0hZSwiIil9KSk/RnVuY3Rpb24oInJldHVybiAiK2UpKCk6bS5lcnJvcigiSW52YWxpZCBKU09OOiAiK2IpfSxtLnBhcnNlWE1MPWZ1bmN0aW9uKGIpe3ZhciBjLGQ7aWYoIWJ8fCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gbnVsbDt0cnl7YS5ET01QYXJzZXI/KGQ9bmV3IERPTVBhcnNlcixjPWQucGFyc2VGcm9tU3RyaW5nKGIsInRleHQveG1sIikpOihjPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksYy5hc3luYz0iZmFsc2UiLGMubG9hZFhNTChiKSl9Y2F0Y2goZSl7Yz12b2lkIDB9cmV0dXJuIGMmJmMuZG9jdW1lbnRFbGVtZW50JiYhYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fG0uZXJyb3IoIkludmFsaWQgWE1MOiAiK2IpLGN9O3ZhciB5Yyx6YyxBYz0vIy4qJC8sQmM9LyhbPyZdKV89W14mXSovLENjPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvZ20sRGM9L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sRWM9L14oPzpHRVR8SEVBRCkkLyxGYz0vXlwvXC8vLEdjPS9eKFtcdy4rLV0rOikoPzpcL1wvKD86W15cLz8jXSpAfCkoW15cLz8jOl0qKSg/OjooXGQrKXwpfCkvLEhjPXt9LEljPXt9LEpjPSIqLyIuY29uY2F0KCIqIik7dHJ5e3pjPWxvY2F0aW9uLmhyZWZ9Y2F0Y2goS2Mpe3pjPXkuY3JlYXRlRWxlbWVudCgiYSIpLHpjLmhyZWY9IiIsemM9emMuaHJlZn15Yz1HYy5leGVjKHpjLnRvTG93ZXJDYXNlKCkpfHxbXTtmdW5jdGlvbiBMYyhhKXtyZXR1cm4gZnVuY3Rpb24oYixjKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWIsYj0iKiIpO3ZhciBkLGU9MCxmPWIudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8W107aWYobS5pc0Z1bmN0aW9uKGMpKXdoaWxlKGQ9ZltlKytdKSIrIj09PWQuY2hhckF0KDApPyhkPWQuc2xpY2UoMSl8fCIqIiwoYVtkXT1hW2RdfHxbXSkudW5zaGlmdChjKSk6KGFbZF09YVtkXXx8W10pLnB1c2goYyl9fWZ1bmN0aW9uIE1jKGEsYixjLGQpe3ZhciBlPXt9LGY9YT09PUljO2Z1bmN0aW9uIGcoaCl7dmFyIGk7cmV0dXJuIGVbaF09ITAsbS5lYWNoKGFbaF18fFtdLGZ1bmN0aW9uKGEsaCl7dmFyIGo9aChiLGMsZCk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBqfHxmfHxlW2pdP2Y/IShpPWopOnZvaWQgMDooYi5kYXRhVHlwZXMudW5zaGlmdChqKSxnKGopLCExKX0pLGl9cmV0dXJuIGcoYi5kYXRhVHlwZXNbMF0pfHwhZVsiKiJdJiZnKCIqIil9ZnVuY3Rpb24gTmMoYSxiKXt2YXIgYyxkLGU9bS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGIpdm9pZCAwIT09YltkXSYmKChlW2RdP2E6Y3x8KGM9e30pKVtkXT1iW2RdKTtyZXR1cm4gYyYmbS5leHRlbmQoITAsYSxjKSxhfWZ1bmN0aW9uIE9jKGEsYixjKXt2YXIgZCxlLGYsZyxoPWEuY29udGVudHMsaT1hLmRhdGFUeXBlczt3aGlsZSgiKiI9PT1pWzBdKWkuc2hpZnQoKSx2b2lkIDA9PT1lJiYoZT1hLm1pbWVUeXBlfHxiLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYoZSlmb3IoZyBpbiBoKWlmKGhbZ10mJmhbZ10udGVzdChlKSl7aS51bnNoaWZ0KGcpO2JyZWFrfWlmKGlbMF1pbiBjKWY9aVswXTtlbHNle2ZvcihnIGluIGMpe2lmKCFpWzBdfHxhLmNvbnZlcnRlcnNbZysiICIraVswXV0pe2Y9ZzticmVha31kfHwoZD1nKX1mPWZ8fGR9cmV0dXJuIGY/KGYhPT1pWzBdJiZpLnVuc2hpZnQoZiksY1tmXSk6dm9pZCAwfWZ1bmN0aW9uIFBjKGEsYixjLGQpe3ZhciBlLGYsZyxoLGksaj17fSxrPWEuZGF0YVR5cGVzLnNsaWNlKCk7aWYoa1sxXSlmb3IoZyBpbiBhLmNvbnZlcnRlcnMpaltnLnRvTG93ZXJDYXNlKCldPWEuY29udmVydGVyc1tnXTtmPWsuc2hpZnQoKTt3aGlsZShmKWlmKGEucmVzcG9uc2VGaWVsZHNbZl0mJihjW2EucmVzcG9uc2VGaWVsZHNbZl1dPWIpLCFpJiZkJiZhLmRhdGFGaWx0ZXImJihiPWEuZGF0YUZpbHRlcihiLGEuZGF0YVR5cGUpKSxpPWYsZj1rLnNoaWZ0KCkpaWYoIioiPT09ZilmPWk7ZWxzZSBpZigiKiIhPT1pJiZpIT09Zil7aWYoZz1qW2krIiAiK2ZdfHxqWyIqICIrZl0sIWcpZm9yKGUgaW4gailpZihoPWUuc3BsaXQoIiAiKSxoWzFdPT09ZiYmKGc9altpKyIgIitoWzBdXXx8alsiKiAiK2hbMF1dKSl7Zz09PSEwP2c9altlXTpqW2VdIT09ITAmJihmPWhbMF0say51bnNoaWZ0KGhbMV0pKTticmVha31pZihnIT09ITApaWYoZyYmYVsidGhyb3dzIl0pYj1nKGIpO2Vsc2UgdHJ5e2I9ZyhiKX1jYXRjaChsKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjpnP2w6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK2krIiB0byAiK2Z9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6Yn19bS5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnpjLHR5cGU6IkdFVCIsaXNMb2NhbDpEYy50ZXN0KHljWzFdKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkpjLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6bS5wYXJzZUpTT04sInRleHQgeG1sIjptLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj9OYyhOYyhhLG0uYWpheFNldHRpbmdzKSxiKTpOYyhtLmFqYXhTZXR0aW5ncyxhKX0sYWpheFByZWZpbHRlcjpMYyhIYyksYWpheFRyYW5zcG9ydDpMYyhJYyksYWpheDpmdW5jdGlvbihhLGIpeyJvYmplY3QiPT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYj1ifHx7fTt2YXIgYyxkLGUsZixnLGgsaSxqLGs9bS5hamF4U2V0dXAoe30sYiksbD1rLmNvbnRleHR8fGssbj1rLmNvbnRleHQmJihsLm5vZGVUeXBlfHxsLmpxdWVyeSk/bShsKTptLmV2ZW50LG89bS5EZWZlcnJlZCgpLHA9bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikscT1rLnN0YXR1c0NvZGV8fHt9LHI9e30scz17fSx0PTAsdT0iY2FuY2VsZWQiLHY9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbihhKXt2YXIgYjtpZigyPT09dCl7aWYoIWope2o9e307d2hpbGUoYj1DYy5leGVjKGYpKWpbYlsxXS50b0xvd2VyQ2FzZSgpXT1iWzJdfWI9althLnRvTG93ZXJDYXNlKCldfXJldHVybiBudWxsPT1iP251bGw6Yn0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIDI9PT10P2Y6bnVsbH0sc2V0UmVxdWVzdEhlYWRlcjpmdW5jdGlvbihhLGIpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTtyZXR1cm4gdHx8KGE9c1tjXT1zW2NdfHxhLHJbYV09YiksdGhpc30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gdHx8KGsubWltZVR5cGU9YSksdGhpc30sc3RhdHVzQ29kZTpmdW5jdGlvbihhKXt2YXIgYjtpZihhKWlmKDI+dClmb3IoYiBpbiBhKXFbYl09W3FbYl0sYVtiXV07ZWxzZSB2LmFsd2F5cyhhW3Yuc3RhdHVzXSk7cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGEpe3ZhciBiPWF8fHU7cmV0dXJuIGkmJmkuYWJvcnQoYikseCgwLGIpLHRoaXN9fTtpZihvLnByb21pc2UodikuY29tcGxldGU9cC5hZGQsdi5zdWNjZXNzPXYuZG9uZSx2LmVycm9yPXYuZmFpbCxrLnVybD0oKGF8fGsudXJsfHx6YykrIiIpLnJlcGxhY2UoQWMsIiIpLnJlcGxhY2UoRmMseWNbMV0rIi8vIiksay50eXBlPWIubWV0aG9kfHxiLnR5cGV8fGsubWV0aG9kfHxrLnR5cGUsay5kYXRhVHlwZXM9bS50cmltKGsuZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChFKXx8WyIiXSxudWxsPT1rLmNyb3NzRG9tYWluJiYoYz1HYy5leGVjKGsudXJsLnRvTG93ZXJDYXNlKCkpLGsuY3Jvc3NEb21haW49ISghY3x8Y1sxXT09PXljWzFdJiZjWzJdPT09eWNbMl0mJihjWzNdfHwoImh0dHA6Ij09PWNbMV0/IjgwIjoiNDQzIikpPT09KHljWzNdfHwoImh0dHA6Ij09PXljWzFdPyI4MCI6IjQ0MyIpKSkpLGsuZGF0YSYmay5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBrLmRhdGEmJihrLmRhdGE9bS5wYXJhbShrLmRhdGEsay50cmFkaXRpb25hbCkpLE1jKEhjLGssYix2KSwyPT09dClyZXR1cm4gdjtoPW0uZXZlbnQmJmsuZ2xvYmFsLGgmJjA9PT1tLmFjdGl2ZSsrJiZtLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGsudHlwZT1rLnR5cGUudG9VcHBlckNhc2UoKSxrLmhhc0NvbnRlbnQ9IUVjLnRlc3Qoay50eXBlKSxlPWsudXJsLGsuaGFzQ29udGVudHx8KGsuZGF0YSYmKGU9ay51cmwrPSh3Yy50ZXN0KGUpPyImIjoiPyIpK2suZGF0YSxkZWxldGUgay5kYXRhKSxrLmNhY2hlPT09ITEmJihrLnVybD1CYy50ZXN0KGUpP2UucmVwbGFjZShCYywiJDFfPSIrdmMrKyk6ZSsod2MudGVzdChlKT8iJiI6Ij8iKSsiXz0iK3ZjKyspKSxrLmlmTW9kaWZpZWQmJihtLmxhc3RNb2RpZmllZFtlXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsbS5sYXN0TW9kaWZpZWRbZV0pLG0uZXRhZ1tlXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixtLmV0YWdbZV0pKSwoay5kYXRhJiZrLmhhc0NvbnRlbnQmJmsuY29udGVudFR5cGUhPT0hMXx8Yi5jb250ZW50VHlwZSkmJnYuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixrLmNvbnRlbnRUeXBlKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsay5kYXRhVHlwZXNbMF0mJmsuYWNjZXB0c1trLmRhdGFUeXBlc1swXV0/ay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXSsoIioiIT09ay5kYXRhVHlwZXNbMF0/IiwgIitKYysiOyBxPTAuMDEiOiIiKTprLmFjY2VwdHNbIioiXSk7Zm9yKGQgaW4gay5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcihkLGsuaGVhZGVyc1tkXSk7aWYoay5iZWZvcmVTZW5kJiYoay5iZWZvcmVTZW5kLmNhbGwobCx2LGspPT09ITF8fDI9PT10KSlyZXR1cm4gdi5hYm9ydCgpO3U9ImFib3J0Ijtmb3IoZCBpbntzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSl2W2RdKGtbZF0pO2lmKGk9TWMoSWMsayxiLHYpKXt2LnJlYWR5U3RhdGU9MSxoJiZuLnRyaWdnZXIoImFqYXhTZW5kIixbdixrXSksay5hc3luYyYmay50aW1lb3V0PjAmJihnPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGsudGltZW91dCkpO3RyeXt0PTEsaS5zZW5kKHIseCl9Y2F0Y2godyl7aWYoISgyPnQpKXRocm93IHc7eCgtMSx3KX19ZWxzZSB4KC0xLCJObyBUcmFuc3BvcnQiKTtmdW5jdGlvbiB4KGEsYixjLGQpe3ZhciBqLHIscyx1LHcseD1iOzIhPT10JiYodD0yLGcmJmNsZWFyVGltZW91dChnKSxpPXZvaWQgMCxmPWR8fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowLGo9YT49MjAwJiYzMDA+YXx8MzA0PT09YSxjJiYodT1PYyhrLHYsYykpLHU9UGMoayx1LHYsaiksaj8oay5pZk1vZGlmaWVkJiYodz12LmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksdyYmKG0ubGFzdE1vZGlmaWVkW2VdPXcpLHc9di5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpLHcmJihtLmV0YWdbZV09dykpLDIwND09PWF8fCJIRUFEIj09PWsudHlwZT94PSJub2NvbnRlbnQiOjMwND09PWE/eD0ibm90bW9kaWZpZWQiOih4PXUuc3RhdGUscj11LmRhdGEscz11LmVycm9yLGo9IXMpKToocz14LChhfHwheCkmJih4PSJlcnJvciIsMD5hJiYoYT0wKSkpLHYuc3RhdHVzPWEsdi5zdGF0dXNUZXh0PShifHx4KSsiIixqP28ucmVzb2x2ZVdpdGgobCxbcix4LHZdKTpvLnJlamVjdFdpdGgobCxbdix4LHNdKSx2LnN0YXR1c0NvZGUocSkscT12b2lkIDAsaCYmbi50cmlnZ2VyKGo/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbdixrLGo/cjpzXSkscC5maXJlV2l0aChsLFt2LHhdKSxoJiYobi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGtdKSwtLW0uYWN0aXZlfHxtLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gdn0sZ2V0SlNPTjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZ2V0KGEsYixjLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihhLGIpe3JldHVybiBtLmdldChhLHZvaWQgMCxiLCJzY3JpcHQiKX19KSxtLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxiKXttW2JdPWZ1bmN0aW9uKGEsYyxkLGUpe3JldHVybiBtLmlzRnVuY3Rpb24oYykmJihlPWV8fGQsZD1jLGM9dm9pZCAwKSxtLmFqYXgoe3VybDphLHR5cGU6YixkYXRhVHlwZTplLGRhdGE6YyxzdWNjZXNzOmR9KX19KSxtLl9ldmFsVXJsPWZ1bmN0aW9uKGEpe3JldHVybiBtLmFqYXgoe3VybDphLHR5cGU6IkdFVCIsZGF0YVR5cGU6InNjcmlwdCIsYXN5bmM6ITEsZ2xvYmFsOiExLCJ0aHJvd3MiOiEwfSl9LG0uZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGEpe2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykud3JhcEFsbChhLmNhbGwodGhpcyxiKSl9KTtpZih0aGlzWzBdKXt2YXIgYj1tKGEsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZiLmluc2VydEJlZm9yZSh0aGlzWzBdKSxiLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXM7d2hpbGUoYS5maXJzdENoaWxkJiYxPT09YS5maXJzdENoaWxkLm5vZGVUeXBlKWE9YS5maXJzdENoaWxkO3JldHVybiBhfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChtLmlzRnVuY3Rpb24oYSk/ZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwSW5uZXIoYS5jYWxsKHRoaXMsYikpfTpmdW5jdGlvbigpe3ZhciBiPW0odGhpcyksYz1iLmNvbnRlbnRzKCk7Yy5sZW5ndGg/Yy53cmFwQWxsKGEpOmIuYXBwZW5kKGEpfSl9LHdyYXA6ZnVuY3Rpb24oYSl7dmFyIGI9bS5pc0Z1bmN0aW9uKGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYyl7bSh0aGlzKS53cmFwQWxsKGI/YS5jYWxsKHRoaXMsYyk6YSl9KX0sdW53cmFwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFyZW50KCkuZWFjaChmdW5jdGlvbigpe20ubm9kZU5hbWUodGhpcywiYm9keSIpfHxtKHRoaXMpLnJlcGxhY2VXaXRoKHRoaXMuY2hpbGROb2Rlcyl9KS5lbmQoKX19KSxtLmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0V2lkdGg8PTAmJmEub2Zmc2V0SGVpZ2h0PD0wfHwhay5yZWxpYWJsZUhpZGRlbk9mZnNldHMoKSYmIm5vbmUiPT09KGEuc3R5bGUmJmEuc3R5bGUuZGlzcGxheXx8bS5jc3MoYSwiZGlzcGxheSIpKX0sbS5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihhKXtyZXR1cm4hbS5leHByLmZpbHRlcnMuaGlkZGVuKGEpfTt2YXIgUWM9LyUyMC9nLFJjPS9cW1xdJC8sU2M9L1xyP1xuL2csVGM9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFVjPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtmdW5jdGlvbiBWYyhhLGIsYyxkKXt2YXIgZTtpZihtLmlzQXJyYXkoYikpbS5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxSYy50ZXN0KGEpP2QoYSxlKTpWYyhhKyJbIisoIm9iamVjdCI9PXR5cGVvZiBlP2I6IiIpKyJdIixlLGMsZCl9KTtlbHNlIGlmKGN8fCJvYmplY3QiIT09bS50eXBlKGIpKWQoYSxiKTtlbHNlIGZvcihlIGluIGIpVmMoYSsiWyIrZSsiXSIsYltlXSxjLGQpfW0ucGFyYW09ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPVtdLGU9ZnVuY3Rpb24oYSxiKXtiPW0uaXNGdW5jdGlvbihiKT9iKCk6bnVsbD09Yj8iIjpiLGRbZC5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChhKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpfTtpZih2b2lkIDA9PT1iJiYoYj1tLmFqYXhTZXR0aW5ncyYmbS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLG0uaXNBcnJheShhKXx8YS5qcXVlcnkmJiFtLmlzUGxhaW5PYmplY3QoYSkpbS5lYWNoKGEsZnVuY3Rpb24oKXtlKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKGMgaW4gYSlWYyhjLGFbY10sYixlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShRYywiKyIpfSxtLmZuLmV4dGVuZCh7c2VyaWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG0ucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT1tLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gYT9tLm1ha2VBcnJheShhKTp0aGlzfSkuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy50eXBlO3JldHVybiB0aGlzLm5hbWUmJiFtKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmVWMudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVRjLnRlc3QoYSkmJih0aGlzLmNoZWNrZWR8fCFXLnRlc3QoYSkpfSkubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9bSh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09Yz9udWxsOm0uaXNBcnJheShjKT9tLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoU2MsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKFNjLCJcclxuIil9fSkuZ2V0KCl9fSksbS5hamF4U2V0dGluZ3MueGhyPXZvaWQgMCE9PWEuQWN0aXZlWE9iamVjdD9mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzTG9jYWwmJi9eKGdldHxwb3N0fGhlYWR8cHV0fGRlbGV0ZXxvcHRpb25zKSQvaS50ZXN0KHRoaXMudHlwZSkmJlpjKCl8fCRjKCl9OlpjO3ZhciBXYz0wLFhjPXt9LFljPW0uYWpheFNldHRpbmdzLnhocigpO2EuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9udW5sb2FkIixmdW5jdGlvbigpe2Zvcih2YXIgYSBpbiBYYylYY1thXSh2b2lkIDAsITApfSksay5jb3JzPSEhWWMmJiJ3aXRoQ3JlZGVudGlhbHMiaW4gWWMsWWM9ay5hamF4PSEhWWMsWWMmJm0uYWpheFRyYW5zcG9ydChmdW5jdGlvbihhKXtpZighYS5jcm9zc0RvbWFpbnx8ay5jb3JzKXt2YXIgYjtyZXR1cm57c2VuZDpmdW5jdGlvbihjLGQpe3ZhciBlLGY9YS54aHIoKSxnPSsrV2M7aWYoZi5vcGVuKGEudHlwZSxhLnVybCxhLmFzeW5jLGEudXNlcm5hbWUsYS5wYXNzd29yZCksYS54aHJGaWVsZHMpZm9yKGUgaW4gYS54aHJGaWVsZHMpZltlXT1hLnhockZpZWxkc1tlXTthLm1pbWVUeXBlJiZmLm92ZXJyaWRlTWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZShhLm1pbWVUeXBlKSxhLmNyb3NzRG9tYWlufHxjWyJYLVJlcXVlc3RlZC1XaXRoIl18fChjWyJYLVJlcXVlc3RlZC1XaXRoIl09IlhNTEh0dHBSZXF1ZXN0Iik7Zm9yKGUgaW4gYyl2b2lkIDAhPT1jW2VdJiZmLnNldFJlcXVlc3RIZWFkZXIoZSxjW2VdKyIiKTtmLnNlbmQoYS5oYXNDb250ZW50JiZhLmRhdGF8fG51bGwpLGI9ZnVuY3Rpb24oYyxlKXt2YXIgaCxpLGo7aWYoYiYmKGV8fDQ9PT1mLnJlYWR5U3RhdGUpKWlmKGRlbGV0ZSBYY1tnXSxiPXZvaWQgMCxmLm9ucmVhZHlzdGF0ZWNoYW5nZT1tLm5vb3AsZSk0IT09Zi5yZWFkeVN0YXRlJiZmLmFib3J0KCk7ZWxzZXtqPXt9LGg9Zi5zdGF0dXMsInN0cmluZyI9PXR5cGVvZiBmLnJlc3BvbnNlVGV4dCYmKGoudGV4dD1mLnJlc3BvbnNlVGV4dCk7dHJ5e2k9Zi5zdGF0dXNUZXh0fWNhdGNoKGspe2k9IiJ9aHx8IWEuaXNMb2NhbHx8YS5jcm9zc0RvbWFpbj8xMjIzPT09aCYmKGg9MjA0KTpoPWoudGV4dD8yMDA6NDA0fWomJmQoaCxpLGosZi5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSl9LGEuYXN5bmM/ND09PWYucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KGIpOmYub25yZWFkeXN0YXRlY2hhbmdlPVhjW2ddPWI6YigpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIodm9pZCAwLCEwKX19fX0pO2Z1bmN0aW9uIFpjKCl7dHJ5e3JldHVybiBuZXcgYS5YTUxIdHRwUmVxdWVzdH1jYXRjaChiKXt9fWZ1bmN0aW9uICRjKCl7dHJ5e3JldHVybiBuZXcgYS5BY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpfWNhdGNoKGIpe319bS5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi8oPzpqYXZhfGVjbWEpc2NyaXB0L30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihhKXtyZXR1cm4gbS5nbG9iYWxFdmFsKGEpLGF9fX0pLG0uYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihhKXt2b2lkIDA9PT1hLmNhY2hlJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxtLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGIsYz15LmhlYWR8fG0oImhlYWQiKVswXXx8eS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZCxlKXtiPXkuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksYi5hc3luYz0hMCxhLnNjcmlwdENoYXJzZXQmJihiLmNoYXJzZXQ9YS5zY3JpcHRDaGFyc2V0KSxiLnNyYz1hLnVybCxiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihhLGMpeyhjfHwhYi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KGIucmVhZHlTdGF0ZSkpJiYoYi5vbmxvYWQ9Yi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKSxiPW51bGwsY3x8ZSgyMDAsInN1Y2Nlc3MiKSl9LGMuaW5zZXJ0QmVmb3JlKGIsYy5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtiJiZiLm9ubG9hZCh2b2lkIDAsITApfX19fSk7dmFyIF9jPVtdLGFkPS8oPSlcPyg/PSZ8JCl8XD9cPy87bS5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3ZhciBhPV9jLnBvcCgpfHxtLmV4cGFuZG8rIl8iK3ZjKys7cmV0dXJuIHRoaXNbYV09ITAsYX19KSxtLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZSxmLGcsaD1iLmpzb25wIT09ITEmJihhZC50ZXN0KGIudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGIuZGF0YSYmIShiLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmFkLnRlc3QoYi5kYXRhKSYmImRhdGEiKTtyZXR1cm4gaHx8Impzb25wIj09PWIuZGF0YVR5cGVzWzBdPyhlPWIuanNvbnBDYWxsYmFjaz1tLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaD9iW2hdPWJbaF0ucmVwbGFjZShhZCwiJDEiK2UpOmIuanNvbnAhPT0hMSYmKGIudXJsKz0od2MudGVzdChiLnVybCk/IiYiOiI/IikrYi5qc29ucCsiPSIrZSksYi5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdPWZ1bmN0aW9uKCl7cmV0dXJuIGd8fG0uZXJyb3IoZSsiIHdhcyBub3QgY2FsbGVkIiksZ1swXX0sYi5kYXRhVHlwZXNbMF09Impzb24iLGY9YVtlXSxhW2VdPWZ1bmN0aW9uKCl7Zz1hcmd1bWVudHN9LGQuYWx3YXlzKGZ1bmN0aW9uKCl7YVtlXT1mLGJbZV0mJihiLmpzb25wQ2FsbGJhY2s9Yy5qc29ucENhbGxiYWNrLF9jLnB1c2goZSkpLGcmJm0uaXNGdW5jdGlvbihmKSYmZihnWzBdKSxnPWY9dm9pZCAwfSksInNjcmlwdCIpOnZvaWQgMH0pLG0ucGFyc2VIVE1MPWZ1bmN0aW9uKGEsYixjKXtpZighYXx8InN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBudWxsOyJib29sZWFuIj09dHlwZW9mIGImJihjPWIsYj0hMSksYj1ifHx5O3ZhciBkPXUuZXhlYyhhKSxlPSFjJiZbXTtyZXR1cm4gZD9bYi5jcmVhdGVFbGVtZW50KGRbMV0pXTooZD1tLmJ1aWxkRnJhZ21lbnQoW2FdLGIsZSksZSYmZS5sZW5ndGgmJm0oZSkucmVtb3ZlKCksbS5tZXJnZShbXSxkLmNoaWxkTm9kZXMpKX07dmFyIGJkPW0uZm4ubG9hZDttLmZuLmxvYWQ9ZnVuY3Rpb24oYSxiLGMpe2lmKCJzdHJpbmciIT10eXBlb2YgYSYmYmQpcmV0dXJuIGJkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZCxlLGYsZz10aGlzLGg9YS5pbmRleE9mKCIgIik7cmV0dXJuIGg+PTAmJihkPW0udHJpbShhLnNsaWNlKGgsYS5sZW5ndGgpKSxhPWEuc2xpY2UoMCxoKSksbS5pc0Z1bmN0aW9uKGIpPyhjPWIsYj12b2lkIDApOmImJiJvYmplY3QiPT10eXBlb2YgYiYmKGY9IlBPU1QiKSxnLmxlbmd0aD4wJiZtLmFqYXgoe3VybDphLHR5cGU6ZixkYXRhVHlwZToiaHRtbCIsZGF0YTpifSkuZG9uZShmdW5jdGlvbihhKXtlPWFyZ3VtZW50cyxnLmh0bWwoZD9tKCI8ZGl2PiIpLmFwcGVuZChtLnBhcnNlSFRNTChhKSkuZmluZChkKTphKX0pLmNvbXBsZXRlKGMmJmZ1bmN0aW9uKGEsYil7Zy5lYWNoKGMsZXx8W2EucmVzcG9uc2VUZXh0LGIsYV0pfSksdGhpc30sbS5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oYSxiKXttLmZuW2JdPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9uKGIsYSl9fSksbS5leHByLmZpbHRlcnMuYW5pbWF0ZWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZ3JlcChtLnRpbWVycyxmdW5jdGlvbihiKXtyZXR1cm4gYT09PWIuZWxlbX0pLmxlbmd0aH07dmFyIGNkPWEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Z1bmN0aW9uIGRkKGEpe3JldHVybiBtLmlzV2luZG93KGEpP2E6OT09PWEubm9kZVR5cGU/YS5kZWZhdWx0Vmlld3x8YS5wYXJlbnRXaW5kb3c6ITF9bS5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaCxpLGosaz1tLmNzcyhhLCJwb3NpdGlvbiIpLGw9bShhKSxuPXt9OyJzdGF0aWMiPT09ayYmKGEuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIiksaD1sLm9mZnNldCgpLGY9bS5jc3MoYSwidG9wIiksaT1tLmNzcyhhLCJsZWZ0Iiksaj0oImFic29sdXRlIj09PWt8fCJmaXhlZCI9PT1rKSYmbS5pbkFycmF5KCJhdXRvIixbZixpXSk+LTEsaj8oZD1sLnBvc2l0aW9uKCksZz1kLnRvcCxlPWQubGVmdCk6KGc9cGFyc2VGbG9hdChmKXx8MCxlPXBhcnNlRmxvYXQoaSl8fDApLG0uaXNGdW5jdGlvbihiKSYmKGI9Yi5jYWxsKGEsYyxoKSksbnVsbCE9Yi50b3AmJihuLnRvcD1iLnRvcC1oLnRvcCtnKSxudWxsIT1iLmxlZnQmJihuLmxlZnQ9Yi5sZWZ0LWgubGVmdCtlKSwidXNpbmciaW4gYj9iLnVzaW5nLmNhbGwoYSxuKTpsLmNzcyhuKX19LG0uZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oYSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09YT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihiKXttLm9mZnNldC5zZXRPZmZzZXQodGhpcyxhLGIpfSk7dmFyIGIsYyxkPXt0b3A6MCxsZWZ0OjB9LGU9dGhpc1swXSxmPWUmJmUub3duZXJEb2N1bWVudDtpZihmKXJldHVybiBiPWYuZG9jdW1lbnRFbGVtZW50LG0uY29udGFpbnMoYixlKT8odHlwZW9mIGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09SyYmKGQ9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSksYz1kZChmKSx7dG9wOmQudG9wKyhjLnBhZ2VZT2Zmc2V0fHxiLnNjcm9sbFRvcCktKGIuY2xpZW50VG9wfHwwKSxsZWZ0OmQubGVmdCsoYy5wYWdlWE9mZnNldHx8Yi5zY3JvbGxMZWZ0KS0oYi5jbGllbnRMZWZ0fHwwKX0pOmR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGEsYixjPXt0b3A6MCxsZWZ0OjB9LGQ9dGhpc1swXTtyZXR1cm4iZml4ZWQiPT09bS5jc3MoZCwicG9zaXRpb24iKT9iPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk6KGE9dGhpcy5vZmZzZXRQYXJlbnQoKSxiPXRoaXMub2Zmc2V0KCksbS5ub2RlTmFtZShhWzBdLCJodG1sIil8fChjPWEub2Zmc2V0KCkpLGMudG9wKz1tLmNzcyhhWzBdLCJib3JkZXJUb3BXaWR0aCIsITApLGMubGVmdCs9bS5jc3MoYVswXSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpLHt0b3A6Yi50b3AtYy50b3AtbS5jc3MoZCwibWFyZ2luVG9wIiwhMCksbGVmdDpiLmxlZnQtYy5sZWZ0LW0uY3NzKGQsIm1hcmdpbkxlZnQiLCEwKX19fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9mZnNldFBhcmVudHx8Y2Q7d2hpbGUoYSYmIW0ubm9kZU5hbWUoYSwiaHRtbCIpJiYic3RhdGljIj09PW0uY3NzKGEsInBvc2l0aW9uIikpYT1hLm9mZnNldFBhcmVudDtyZXR1cm4gYXx8Y2R9KX19KSxtLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oYSxiKXt2YXIgYz0vWS8udGVzdChiKTttLmZuW2FdPWZ1bmN0aW9uKGQpe3JldHVybiBWKHRoaXMsZnVuY3Rpb24oYSxkLGUpe3ZhciBmPWRkKGEpO3JldHVybiB2b2lkIDA9PT1lP2Y/YiBpbiBmP2ZbYl06Zi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbZF06YVtkXTp2b2lkKGY/Zi5zY3JvbGxUbyhjP20oZikuc2Nyb2xsTGVmdCgpOmUsYz9lOm0oZikuc2Nyb2xsVG9wKCkpOmFbZF09ZSl9LGEsZCxhcmd1bWVudHMubGVuZ3RoLG51bGwpfX0pLG0uZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09TGIoay5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKGEsYyl7cmV0dXJuIGM/KGM9SmIoYSxiKSxIYi50ZXN0KGMpP20oYSkucG9zaXRpb24oKVtiXSsicHgiOmMpOnZvaWQgMH0pfSksbS5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oYSxiKXttLmVhY2goe3BhZGRpbmc6ImlubmVyIithLGNvbnRlbnQ6YiwiIjoib3V0ZXIiK2F9LGZ1bmN0aW9uKGMsZCl7bS5mbltkXT1mdW5jdGlvbihkLGUpe3ZhciBmPWFyZ3VtZW50cy5sZW5ndGgmJihjfHwiYm9vbGVhbiIhPXR5cGVvZiBkKSxnPWN8fChkPT09ITB8fGU9PT0hMD8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihiLGMsZCl7dmFyIGU7cmV0dXJuIG0uaXNXaW5kb3coYik/Yi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrYV06OT09PWIubm9kZVR5cGU/KGU9Yi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoYi5ib2R5WyJzY3JvbGwiK2FdLGVbInNjcm9sbCIrYV0sYi5ib2R5WyJvZmZzZXQiK2FdLGVbIm9mZnNldCIrYV0sZVsiY2xpZW50IithXSkpOnZvaWQgMD09PWQ/bS5jc3MoYixjLGcpOm0uc3R5bGUoYixjLGQsZyl9LGIsZj9kOnZvaWQgMCxmLG51bGwpfX0pfSksbS5mbi5zaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSxtLmZuLmFuZFNlbGY9bS5mbi5hZGRCYWNrLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZSgianF1ZXJ5IixbXSxmdW5jdGlvbigpe3JldHVybiBtfSk7dmFyIGVkPWEualF1ZXJ5LGZkPWEuJDtyZXR1cm4gbS5ub0NvbmZsaWN0PWZ1bmN0aW9uKGIpe3JldHVybiBhLiQ9PT1tJiYoYS4kPWZkKSxiJiZhLmpRdWVyeT09PW0mJihhLmpRdWVyeT1lZCksbX0sdHlwZW9mIGI9PT1LJiYoYS5qUXVlcnk9YS4kPW0pLG19KTsK" 221 176 } 222 - ] 177 + ], 178 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIE92ZXJyaWRlCi8vIEBuYW1lc3BhY2UgICB3a292ZXJyaWRlCi8vIEBkZXNjcmlwdGlvbiBBZGRzIGFuICJJZ25vcmUgQW5zd2VyIiBidXR0b24gZHVyaW5nIHJldmlld3MgdGhhdCBtYWtlcyBXYW5pS2FuaSBpZ25vcmUgdGhlIGN1cnJlbnQgYW5zd2VyICh1c2VmdWwgaWYsIGZvciBleGFtcGxlLCB5b3UgbWFkZSBhIHN0dXBpZCB0eXBvKQovLyBAaW5jbHVkZSAgICAgaHR0cDovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24qCi8vIEBpbmNsdWRlICAgICBodHRwczovL3d3dy53YW5pa2FuaS5jb20vcmV2aWV3L3Nlc3Npb24qCi8vIEB2ZXJzaW9uICAgICAxLjIKLy8gQGF1dGhvciAgICAgIE1lbXBvCi8vIEBncmFudCAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgdW5zYWZlV2luZG93Ci8vIEByZXF1aXJlICAgICBodHRwOi8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0xLjExLjIubWluLmpzCi8vIEBsaWNlbnNlICAgICBHUEwgdmVyc2lvbiAzIG9yIGFueSBsYXRlciB2ZXJzaW9uOyBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKLy8gPT0vVXNlclNjcmlwdD09CgovL09yaWdpbmFsIGF1dGhvcjogUnVpIFBpbmhlaXJvCgovLyBFU0Mgc2hvcnRjdXQKCgovKgogKiBEZWJ1ZyBTZXR0aW5ncwogKi8KdmFyIGRlYnVnTG9nRW5hYmxlZCA9IHRydWU7CnZhciBzY3JpcHRTaG9ydE5hbWUgPSAnV0tPJzsKc2NyaXB0TG9nID0gZGVidWdMb2dFbmFibGVkID8gZnVuY3Rpb24gKG1zZykgewogIGlmICh0eXBlb2YgbXNnID09PSAnc3RyaW5nJykgewogICAgY29uc29sZS5sb2coc2NyaXB0U2hvcnROYW1lICsgJzogJyArIG1zZyk7CiAgfSBlbHNlIHsKICAgIGNvbnNvbGUubG9nKG1zZyk7CiAgfQp9CiA6IGZ1bmN0aW9uICgpIHsKfTsKLyoKICogT3RoZXIgc2V0dGluZ3MKICovCnZhciBwcmVmQWxsb3dVbmlnbm9yZSA9IHRydWU7Ci8qCiAqICJJZ25vcmUgQW5zd2VyIiBCdXR0b24gQ2xpY2sKICovCnZhciBBY3Rpb25FbnVtID0gT2JqZWN0LmZyZWV6ZSh7CiAgaWdub3JlOiAwLAogIHVuaWdub3JlOiAxCn0pOwpmdW5jdGlvbiBXS09faWdub3JlQW5zd2VyKCkKewogIHRyeQogIHsKICAgIC8qIENoZWNrIGlmIHRoZSBjdXJyZW50IGl0ZW0gd2FzIGFuc3dlcmVkIGluY29ycmVjdGx5ICovCiAgICB2YXIgZWxtbnRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnaW5jb3JyZWN0Jyk7CiAgICB2YXIgZWxtbnRzMiA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ1dLT19pZ25vcmVkJyk7CiAgICAKICAgIHZhciBjdXJBY3Rpb247CiAgICBpZiAoIWlzRW1wdHkoZWxtbnRzWzBdKSkgLy8gQ3VycmVudCBhbnN3ZXIgaXMgd3JvbmcKICAgIGN1ckFjdGlvbiA9IEFjdGlvbkVudW0uaWdub3JlOwogICAgIGVsc2UgaWYgKHByZWZBbGxvd1VuaWdub3JlICYmICFpc0VtcHR5KGVsbW50czJbMF0pKSAvLyBDdXJyZW50IGFuc3dlciBpcyBpZ25vcmVkCiAgICBjdXJBY3Rpb24gPSBBY3Rpb25FbnVtLnVuaWdub3JlOwogICAgIGVsc2UKICAgIC8vIEVpdGhlciB0aGVyZSBpcyBubyBjdXJyZW50IGFuc3dlciwgb3IgaXQncyBjb3JyZWN0CiAgICB7CiAgICAgIGFsZXJ0KCdXS086IEN1cnJlbnQgaXRlbSB3YXNuXCd0IGFuc3dlcmVkIGluY29ycmVjdGx5LCBub3IgaWdub3JlZCBwcmV2aW91c2x5IScpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAKICAgIC8qIEdyYWIgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBxdWVzdGlvbiAqLwogCiAgICB2YXIgY3VySXRlbSA9ICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpOwogICAgdmFyIHF1ZXN0aW9uVHlwZSA9ICQualN0b3JhZ2UuZ2V0KCdxdWVzdGlvblR5cGUnKTsKIAogICAgLyogQnVpbGQgaXRlbSBuYW1lICovCiAgICB2YXIgaXRlbU5hbWU7CiAgICBpZiAoY3VySXRlbS5yYWQpCiAgICBpdGVtTmFtZSA9ICdyJzsKICAgICBlbHNlIGlmIChjdXJJdGVtLmthbikKICAgIGl0ZW1OYW1lID0gJ2snOwogICAgIGVsc2UKICAgIGl0ZW1OYW1lID0gJ3YnOwogICAgaXRlbU5hbWUgKz0gY3VySXRlbS5pZDsKICAgIHNjcmlwdExvZyhpdGVtTmFtZSk7CiAgICAvKiBHcmFiIGl0ZW0gZnJvbSBqU3RvcmFnZS4KICAgICAgICAgKiAKICAgICAgICAgKiBpdGVtLnJjIGFuZCBpdGVtLm1jID0+IFJlYWRpbmcvTWVhbmluZyBDb21wbGV0ZWQgKGlmIGFuc3dlcmVkIHRoZSBpdGVtIGNvcnJlY3RseSkKICAgICAgICAgKiBpdGVtLnJpIGFuZCBpdGVtLm1pID0+IFJlYWRpbmcvTWVhbmluZyBJbnZhbGlkIChudW1iZXIgb2YgbWlzdGFrZXMgYmVmb3JlIGFuc3dlcmluZyBjb3JyZWN0bHkpCiAgICAgICAgICovCiAgICB2YXIgaXRlbSA9ICQualN0b3JhZ2UuZ2V0KGl0ZW1OYW1lKSB8fCB7CiAgICB9OwogICAgLyogVXBkYXRlIHRoZSBpdGVtIGRhdGEgKi8KICAgIGlmIChxdWVzdGlvblR5cGUgPT09ICdtZWFuaW5nJykKICAgIHsKICAgICAgaWYgKCEoJ21pJyBpbiBpdGVtKSB8fCBpc0VtcHR5KGl0ZW0ubWkpKQogICAgICB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ2l0ZW0ubWkgdW5kZWZpbmVkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IAogICAgICBlbHNlIGlmIChpdGVtLm1pIDwgMCB8fCAoaXRlbS5taSA9PSAwICYmIGN1ckFjdGlvbiA9PSBBY3Rpb25FbnVtLmlnbm9yZSkpCiAgICAgIHsKICAgICAgICB0aHJvdyBFcnJvcignaXRlbS5taSB0b28gc21hbGwnKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGN1ckFjdGlvbiA9PSBBY3Rpb25FbnVtLmlnbm9yZSkKICAgICAgaXRlbS5taSAtPSAxOwogICAgICAgZWxzZQogICAgICBpdGVtLm1pICs9IDE7CiAgICAgIGRlbGV0ZSBpdGVtLm1jOwogICAgfSAKICAgIGVsc2UKICAgIHsKICAgICAgaWYgKCEoJ3JpJyBpbiBpdGVtKSB8fCBpc0VtcHR5KGl0ZW0ucmkpKQogICAgICB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ2l0ZW0ucmkgdW5kZWZpbmVkJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9IAogICAgICBlbHNlIGlmIChpdGVtLnJpIDwgMCB8fCAoaXRlbS5yaSA9PSAwICYmIGN1ckFjdGlvbiA9PSBBY3Rpb25FbnVtLmlnbm9yZSkpCiAgICAgIHsKICAgICAgICB0aHJvdyBFcnJvcignaS5yaSB0b28gc21hbGwnKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGN1ckFjdGlvbiA9PSBBY3Rpb25FbnVtLmlnbm9yZSkKICAgICAgaXRlbS5yaSAtPSAxOwogICAgICAgZWxzZQogICAgICBpdGVtLnJpICs9IDE7CiAgICAgIGRlbGV0ZSBpdGVtLnJjOwogICAgfQogICAgLyogU2F2ZSB0aGUgbmV3IHN0YXRlIGJhY2sgaW50byBqU3RvcmFnZSAqLwogCiAgICAkLmpTdG9yYWdlLnNldChpdGVtTmFtZSwgaXRlbSk7CiAgICAvKiBNb2RpZnkgdGhlIHF1ZXN0aW9ucyBjb3VudGVyIGFuZCB3cm9uZyBjb3VudGVyIGFuZCBjaGFuZ2UgdGhlIHN0eWxlIG9mIHRoZSBhbnN3ZXIgZmllbGQgKi8KICAgIHZhciB3cm9uZ0NvdW50ID0gJC5qU3RvcmFnZS5nZXQoJ3dyb25nQ291bnQnKTsKICAgIHZhciBxdWVzdGlvbkNvdW50ID0gJC5qU3RvcmFnZS5nZXQoJ3F1ZXN0aW9uQ291bnQnKTsKICAgIGlmIChjdXJBY3Rpb24gPT0gQWN0aW9uRW51bS5pZ25vcmUpCiAgICB7CiAgICAgICQualN0b3JhZ2Uuc2V0KCd3cm9uZ0NvdW50Jywgd3JvbmdDb3VudCAtIDEpOwogICAgICAkLmpTdG9yYWdlLnNldCgncXVlc3Rpb25Db3VudCcsIHF1ZXN0aW9uQ291bnQgLSAxKTsKICAgICAgJCgnI2Fuc3dlci1mb3JtIGZpZWxkc2V0JykucmVtb3ZlQ2xhc3MoJ2luY29ycmVjdCcpOwogICAgICAkKCcjYW5zd2VyLWZvcm0gZmllbGRzZXQnKS5hZGRDbGFzcygnV0tPX2lnbm9yZWQnKTsKICAgIH0gCiAgICBlbHNlCiAgICB7CiAgICAgICQualN0b3JhZ2Uuc2V0KCd3cm9uZ0NvdW50Jywgd3JvbmdDb3VudCArIDEpOwogICAgICAkLmpTdG9yYWdlLnNldCgncXVlc3Rpb25Db3VudCcsIHF1ZXN0aW9uQ291bnQgKyAxKTsKICAgICAgJCgnI2Fuc3dlci1mb3JtIGZpZWxkc2V0JykucmVtb3ZlQ2xhc3MoJ1dLT19pZ25vcmVkJyk7CiAgICAgICQoJyNhbnN3ZXItZm9ybSBmaWVsZHNldCcpLmFkZENsYXNzKCdpbmNvcnJlY3QnKTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0gCiAgY2F0Y2ggKGVycikgewogICAgbG9nRXJyb3IoZXJyKTsKICB9Cn0KLyoKICogQmluZCAnficgYXMgYSBob3RrZXkgCiAqLwogCmZ1bmN0aW9uIGJpbmRIb3RrZXkoKQp7CiAgalF1ZXJ5KGRvY3VtZW50KS5vbigna2V5ZG93bi5yZXZpZXdTY3JlZW4nLCBmdW5jdGlvbiAoZXZlbnQpCiAgewogICAgaWYgKCQoJyNyZXZpZXdzJykuaXMoJzp2aXNpYmxlJykgJiYgISQoJyo6Zm9jdXMnKS5pcygndGV4dGFyZWEsIGlucHV0JykpCiAgICB7CiAgICAgIC8vYWxlcnQoJ2tleWNvZGU6ICcgKyBldmVudC5rZXlDb2RlKTsKICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CiAgICAgICAgLy9jYXNlIDE3NjogLy9GaXJlZm94ICd+JwogICAgICAgIC8vY2FzZSAxOTI6IC8vQ2hyb21lICd+JwogICAgICAgIGNhc2UgMjc6IC8vIEVTQyBCdXR0b24KICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIGlmICgkKCcjdXNlci1yZXNwb25zZScpLmlzKCc6ZGlzYWJsZWQnKSkKICAgICAgICAgICBXS09faWdub3JlQW5zd2VyKCk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0pOwp9Ci8qCiAqIEluamVjdCBJZ25vcmUgQnV0dG9uCiAqLwogCmZ1bmN0aW9uIGFkZElnbm9yZUFuc3dlckJ0bigpCnsKICB2YXIgZm9vdGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Zvb3RlcicpLAogICAgICAkYnRuID0galF1ZXJ5KCc8ZGl2IGlkPSJXS09fYnV0dG9uIiB0aXRsZT0iSWdub3JlIEFuc3dlciI+SWdub3JlIEFuc3dlcjwvZGl2PicpLm9uKCdjbGljaycsIFdLT19pZ25vcmVBbnN3ZXIpOwogIGpRdWVyeShmb290ZXJbMF0pLnByZXBlbmQoJGJ0bik7Cn0KLyoKICogUHJlcGFyZXMgdGhlIHNjcmlwdAogKi8KIApmdW5jdGlvbiBzY3JpcHRJbml0KCkKewogIC8vIEFkZCBnbG9iYWwgQ1NTIHN0eWxlcwogIEdNX2FkZFN0eWxlKCcjV0tPX2J1dHRvbiB7YmFja2dyb3VuZC1jb2xvcjogI0NDMDAwMDsgY29sb3I6ICNGRkZGRkY7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBmb250LXNpemU6IDAuODEyNWVtOyBwYWRkaW5nOiAxMHB4OyB2ZXJ0aWNhbC1hbGlnbjogYm90dG9tO30nKTsKICBHTV9hZGRTdHlsZSgnI2Fuc3dlci1mb3JtIGZpZWxkc2V0LldLT19pZ25vcmVkIGlucHV0W3R5cGU9InRleHQiXTotbW96LXBsYWNlaG9sZGVyLCAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tPX2lnbm9yZWQgaW5wdXRbdHlwZT0idGV4dCJdOi1tb3otcGxhY2Vob2xkZXIge2NvbG9yOiAjRkZGRkZGOyBmb250LWZhbWlseTogIlNvdXJjZSBTYW5zIFBybyIsc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDMwMDsgdGV4dC1zaGFkb3c6IG5vbmU7IHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGxpbmVhciAwczsgfSAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tPX2lnbm9yZWQgYnV0dG9uLCAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tPX2lnbm9yZWQgaW5wdXRbdHlwZT0idGV4dCJdLCAjYW5zd2VyLWZvcm0gZmllbGRzZXQuV0tPX2lnbm9yZWQgaW5wdXRbdHlwZT0idGV4dCJdOmRpc2FibGVkIHsgYmFja2dyb3VuZC1jb2xvcjogI0ZGQ0MwMCAhaW1wb3J0YW50OyB9Jyk7CiAgc2NyaXB0TG9nKCdsb2FkZWQnKTsKICAvLyBTZXQgdXAgaG9va3MKICB0cnkKICB7CiAgICBhZGRJZ25vcmVBbnN3ZXJCdG4oKTsKICAgIGJpbmRIb3RrZXkoKTsKICB9IAogIGNhdGNoIChlcnIpIHsKICAgIGxvZ0Vycm9yKGVycik7CiAgfQp9Ci8qCiAqIEhlbHBlciBGdW5jdGlvbnMvVmFyaWFibGVzCiAqLwogCi8vdXNlICdqUXVlcnknIGZvciBncmVhc2Vtb25rZXkncyB2ZXJzaW9uLCAkIGlzIFdLJ3MgalF1ZXJ5CiAKJCA9IHVuc2FmZVdpbmRvdy4kOwpmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7CiAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsKTsKfQovKgogKiBFcnJvciBoYW5kbGluZwogKiBDYW4gdXNlICdlcnJvci5zdGFjaycsIG5vdCBjcm9zcy1icm93c2VyICh0aG91Z2ggaXQgc2hvdWxkIHdvcmsgb24gRmlyZWZveCBhbmQgQ2hyb21lKQogKi8KIApmdW5jdGlvbiBsb2dFcnJvcihlcnJvcikKewogIHZhciBzdGFja01lc3NhZ2UgPSAnJzsKICBpZiAoJ3N0YWNrJyBpbiBlcnJvcikKICBzdGFja01lc3NhZ2UgPSAnXG5cdFN0YWNrOiAnICsgZXJyb3Iuc3RhY2s7CiAgY29uc29sZS5lcnJvcihzY3JpcHRTaG9ydE5hbWUgKyAnIEVycm9yOiAnICsgZXJyb3IubmFtZSArICdcblx0TWVzc2FnZTogJyArIGVycm9yLm1lc3NhZ2UgKyBzdGFja01lc3NhZ2UpOwp9Ci8qCiAqIFN0YXJ0IHRoZSBzY3JpcHQKICovCiAKc2NyaXB0SW5pdCgpOwoKLy8gSG9vayBpbnRvIEFwcCBTdG9yZQp0cnkgeyAkKCcuYXBwLXN0b3JlLW1lbnUtaXRlbScpLnJlbW92ZSgpOyAkKCc8bGkgY2xhc3M9ImFwcC1zdG9yZS1tZW51LWl0ZW0iPjxhIGhyZWY9Imh0dHBzOi8vY29tbXVuaXR5LndhbmlrYW5pLmNvbS90L3RoZXJlLWFyZS1zby1tYW55LXVzZXItc2NyaXB0cy1ub3ctdGhhdC1kaXNjb3ZlcmluZy10aGVtLWlzLWhhcmQvMjA3MDkiPkFwcCBTdG9yZTwvYT48L2xpPicpLmluc2VydEJlZm9yZSgkKCcubmF2YmFyIC5kcm9wZG93bi1tZW51IC5uYXYtaGVhZGVyOmNvbnRhaW5zKCJBY2NvdW50IiknKSk7IHdpbmRvdy5hcHBTdG9yZVJlZ2lzdHJ5ID0gd2luZG93LmFwcFN0b3JlUmVnaXN0cnkgfHwge307IHdpbmRvdy5hcHBTdG9yZVJlZ2lzdHJ5W0dNX2luZm8uc2NyaXB0LnV1aWRdID0gR01faW5mbzsgbG9jYWxTdG9yYWdlLmFwcFN0b3JlUmVnaXN0cnkgPSBKU09OLnN0cmluZ2lmeShhcHBTdG9yZVJlZ2lzdHJ5KTsgfSBjYXRjaCAoZSkge30=", 179 + "storage": { 180 + "data": {}, 181 + "ts": 1607436649612 182 + }, 183 + "uuid": "7da2a58d-d2aa-4e58-81fd-d5c8b940fca5" 223 184 }, 224 185 { 186 + "enabled": true, 187 + "file_url": "https://greasyfork.org/scripts/13475-wanikani-ultimate-timeline/code/Wanikani%20Ultimate%20Timeline.user.js", 225 188 "name": "Wanikani Ultimate Timeline", 226 189 "options": { 227 190 "check_for_updates": true, 228 191 "comment": null, 229 - "compatopts_for_requires": true, 230 - "compat_wrappedjsobject": false, 192 + "compat_foreach": false, 231 193 "compat_metadata": false, 232 - "compat_foreach": false, 233 - "compat_arrayleft": false, 234 - "compat_uW_gmonkey": false, 235 - "compat_forvarin": false, 194 + "compat_powerful_this": null, 195 + "compat_prototypes": false, 196 + "compat_wrappedjsobject": false, 197 + "compatopts_for_requires": true, 236 198 "noframes": null, 237 - "awareOfChrome": false, 238 - "run_at": null, 239 199 "override": { 240 - "use_includes": [], 200 + "merge_connects": true, 201 + "merge_excludes": true, 202 + "merge_includes": true, 203 + "merge_matches": true, 204 + "orig_connects": [], 205 + "orig_excludes": [], 241 206 "orig_includes": [ 242 207 "/^https://(www|preview).wanikani.com/(dashboard)?$/" 243 208 ], 244 - "merge_includes": true, 245 - "use_matches": [], 246 209 "orig_matches": [], 247 - "merge_matches": true, 248 - "use_excludes": [], 249 - "orig_excludes": [], 250 - "merge_excludes": true, 210 + "orig_noframes": null, 211 + "orig_run_at": "document-end", 212 + "use_blockers": [], 251 213 "use_connects": [], 252 - "merge_connects": true, 253 - "use_blockers": [], 254 - "orig_run_at": "document-end", 255 - "orig_noframes": null 256 - } 214 + "use_excludes": [], 215 + "use_includes": [], 216 + "use_matches": [] 217 + }, 218 + "run_at": null, 219 + "tab_types": null 257 220 }, 221 + "position": 4, 222 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIFVsdGltYXRlIFRpbWVsaW5lCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gUmV2aWV3IHNjaGVkdWxlIGV4cGxvcmVyIGZvciBXYW5pS2FuaQovLyBAdmVyc2lvbiAgICAgNy4wLjMwCi8vIEBpbmNsdWRlICAgICAvXmh0dHBzOi8vKHd3d3xwcmV2aWV3KS53YW5pa2FuaS5jb20vKGRhc2hib2FyZCk/JC8KLy8gQGNvcHlyaWdodCAgIDIwMTgrLCBSb2JpbiBGaW5kbGV5Ci8vIEBsaWNlbnNlICAgICBNSVQ7IGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLy8gQHJ1bi1hdCAgICAgIGRvY3VtZW50LWVuZAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCndpbmRvdy50aW1lbGluZSA9IHt9OwoKKGZ1bmN0aW9uKGdvYmopIHsKCiAgICAvKiBnbG9iYWwgJCwgd2tvZiAqLwogICAgLyogZXNsaW50IG5vLW11bHRpLXNwYWNlczogIm9mZiIgKi8KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemF0aW9uIG9mIHRoZSBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIHNjcmlwdF9uYW1lID0gJ1VsdGltYXRlIFRpbWVsaW5lJzsKICAgIHZhciB3a29mX3ZlcnNpb25fbmVlZGVkID0gJzEuMC4yNyc7CiAgICBpZiAoIXdpbmRvdy53a29mKSB7CiAgICAgICAgaWYgKGNvbmZpcm0oc2NyaXB0X25hbWUrJyByZXF1aXJlcyBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay5cbkRvIHlvdSB3YW50IHRvIGJlIGZvcndhcmRlZCB0byB0aGUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucz8nKSkgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICdodHRwczovL2NvbW11bml0eS53YW5pa2FuaS5jb20vdC9pbnN0cnVjdGlvbnMtaW5zdGFsbGluZy13YW5pa2FuaS1vcGVuLWZyYW1ld29yay8yODU0OSc7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh3a29mLnZlcnNpb24uY29tcGFyZV90byh3a29mX3ZlcnNpb25fbmVlZGVkKSA9PT0gJ29sZGVyJykgewogICAgICAgIGlmIChjb25maXJtKHNjcmlwdF9uYW1lKycgcmVxdWlyZXMgV2FuaWthbmkgT3BlbiBGcmFtZXdvcmsgdmVyc2lvbiAnK3drb2ZfdmVyc2lvbl9uZWVkZWQrJy5cbkRvIHlvdSB3YW50IHRvIGJlIGZvcndhcmRlZCB0byB0aGUgdXBkYXRlIHBhZ2U/JykpIHsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9zY3JpcHRzLzM4NTgyLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHdrb2YuaW5jbHVkZSgnSXRlbURhdGEsTWVudSxTZXR0aW5ncycpOwogICAgd2tvZi5yZWFkeSgnZG9jdW1lbnQsSXRlbURhdGEsTWVudSxTZXR0aW5ncycpLnRoZW4obG9hZF9zZXR0aW5ncykudGhlbihzdGFydHVwKTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENoYXJ0IGRlZmluaW5nIHRoZSBhdXRvLXNjYWxpbmcgZmFjdG9ycyBvZiB0aGUgWC1heGlzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgeHNjYWxlID0gewogICAgICAgIC8vIFNjYWxpbmcgY2hhcnQuICBFYWNoIGNvbHVtbiByZXByZXNlbnRzIGEgc2NhbGluZyByYW5nZSwKICAgICAgICAvLyBhbmQgZWFjaCByb3cgaXMgc29tZXRoaW5nIHRoYXQgd2UgYXJlIHNjYWxpbmcuCiAgICAgICAgaG91cnNfcGVyX2xhYmVsOiAgIFsgIDEgLCAgMyAsICA2ICwgIDEyICwgIDI0ICwgIDQ4ICwgNzIwIF0sCiAgICAgICAgcmVkX3RpY19jaG9pY2VzOiAgIFsnMWQnLCcxZCcsJzFkJywgJzFkJywgJzF3JywnMXdzJywgJzFtJ10sIC8vIFJlZCBtYWpvciB0aWNzIChyZWQgbGFiZWwpCiAgICAgICAgbWFqb3JfdGljX2Nob2ljZXM6IFsnMWgnLCczaCcsJzZoJywnMTJoJywgJzFkJywnMWRzJywgJzVEJ10sIC8vIE1ham9yIHRpY3MgKGhhcyBsYWJlbCkKICAgICAgICBtaW5vcl90aWNfY2hvaWNlczogWyAnLScsJzFoJywnMWgnLCAnM2gnLCAnNmgnLCcxMmgnLCAnMWQnXSwgLy8gTWlub3IgdGljcyAobm8gbGFiZWwpCiAgICAgICAgYnVuZGxlX2Nob2ljZXMgICA6IFsgIDEgLCAgMSAsICAxICwgICAzICwgICA2ICwgIDEyICwgIDI0IF0sIC8vIEhvdyBtYW55IGhvdXJzIGFyZSBidW5kbGVkIHRvZ2V0aGVyLgogICAgICAgIGlkeDogMAogICAgfTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEludGVyYWwgZ2xvYmFsIG9iamVjdCBmb3IgY2VudHJhbGl6aW5nIGRhdGEgYW5kIGNvbmZpZ3VyYXRpb24uCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBncmFwaCA9IHsKICAgICAgICBlbGVtOiBudWxsLAogICAgICAgIG1hcmdpbjogewogICAgICAgICAgICB0b3A6IDE2LAogICAgICAgICAgICBsZWZ0OiAyOCwKICAgICAgICAgICAgYm90dG9tOiAxNiwKICAgICAgICB9LAogICAgICAgIHhfYXhpczogewogICAgICAgICAgICB3aWR0aDogMCwKICAgICAgICAgICAgbWF4X2hvdXJzOiAwLAogICAgICAgICAgICBwaXhlbHNfcGVyX3RpYzogMCwKICAgICAgICB9LAogICAgICAgIHlfYXhpczogewogICAgICAgICAgICBoZWlnaHQ6IDEwMCwKICAgICAgICAgICAgbWluX2hlaWdodDogODAsCiAgICAgICAgICAgIG1heF9oZWlnaHQ6IDMwMCwKICAgICAgICAgICAgbWF4X3Jldmlld3M6IDAsCiAgICAgICAgfSwKICAgICAgICByYWRpY2FsX2NhY2hlOiB7fSwKICAgIH07CiAgICBnb2JqLmdyYXBoID0gZ3JhcGg7CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHbG9iYWwgdXRpbGl0eSBmdW5jdGlvbnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvX3RpdGxlX2Nhc2Uoc3RyKSB7cmV0dXJuIHN0ci5yZXBsYWNlKC9cd1xTKi9nLCBmdW5jdGlvbih0eHQpe3JldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7fSk7fQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2xvYmFsIHZhcmlhYmxlcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgc2V0dGluZ3MsIHNldHRpbmdzX2RpYWxvZzsKICAgIHZhciB0el9vZnMgPSBuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICB2YXIgdGltZV9zaGlmdCA9IE1hdGguY2VpbCh0el9vZnMgLyA2MCkgKiA2MCAtIHR6X29mczsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTG9hZCB0aGUgc2NyaXB0IHNldHRpbmdzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBsb2FkX3NldHRpbmdzKCkgewogICAgICAgIHZhciBkZWZhdWx0cyA9IHsKICAgICAgICAgICAgbWluaW1pemVkOiBmYWxzZSwKICAgICAgICAgICAgcGxhY2VtZW50OiAnYmVmb3JlX25leHRyZXZpZXcnLAogICAgICAgICAgICB0aW1lX2Zvcm1hdDogJzEyaG91cicsCiAgICAgICAgICAgIGdyYXBoX2hlaWdodDogMTAwLAogICAgICAgICAgICBtYXhfZGF5czogMTQsCiAgICAgICAgICAgIGRheXM6IDMuNSwKICAgICAgICAgICAgbWF4X2Jhcl93aWR0aDogNDAsCiAgICAgICAgICAgIG1heF9iYXJfaGVpZ2h0OiAwLAogICAgICAgICAgICBmaXhlZF9iYXJfaGVpZ2h0OiBmYWxzZSwKICAgICAgICAgICAgYmFyX3N0eWxlOiAnaXRlbV90eXBlJywKICAgICAgICAgICAgc3JzX2N1cnJfbmV4dDogJ2N1cnInLAogICAgICAgICAgICBjdXJyZW50X2xldmVsX21hcmtlcnM6ICdya3YnLAogICAgICAgICAgICBidXJuX21hcmtlcnM6ICdzaG93JywKICAgICAgICAgICAgc2hvd19yZXZpZXdfZGV0YWlsczogJ2Z1bGwnLAogICAgICAgICAgICByZXZpZXdfZGV0YWlsc19zdW1tYXJ5OiAnaXRlbV90eXBlJywKICAgICAgICAgICAgcmV2aWV3X2RldGFpbHNfYnV0dG9uczogdHJ1ZSwKICAgICAgICAgICAgc2hvd19iYXJfc3R5bGVfZHJvcGRvd246IHRydWUsCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gd2tvZi5TZXR0aW5ncy5sb2FkKCd0aW1lbGluZScsIGRlZmF1bHRzKS50aGVuKGZ1bmN0aW9uKGRhdGEpewogICAgICAgICAgICBzZXR0aW5ncyA9IHdrb2Yuc2V0dGluZ3MudGltZWxpbmU7CiAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3Muc2hvd19tYXJrZXJzKSB7CiAgICAgICAgICAgICAgICBjYXNlICdub25lJzoKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5jdXJyZW50X2xldmVsX21hcmtlcnMgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnVybl9tYXJrZXJzID0gJ2hpZGUnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnY3Vycic6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzID0gJ3Jrdic7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnVybl9tYXJrZXJzID0gJ2hpZGUnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnYnVybic6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9ICdzaG93JzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2JvdGgnOgogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmN1cnJlbnRfbGV2ZWxfbWFya2VycyA9ICdya3YnOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9ICdzaG93JzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgc2V0dGluZ3Muc2hvd19tYXJrZXJzOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTdGFydHVwCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHN0YXJ0dXAoKSB7CiAgICAgICAgaW5zdGFsbF9jc3MoKTsKICAgICAgICBpbnN0YWxsX21lbnVfbGluaygpOwogICAgICAgIHBsYWNlX3RpbWVsaW5lKHRydWUgLyogZmlyc3RfdGltZSAqLyk7CiAgICAgICAgZmV0Y2hfYW5kX3VwZGF0ZSgpOwogICAgICAgIHN0YXJ0X3JlZnJlc2hfdGltZXIoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluc3RhbGwgYSBsaW5rIHRvIHRoZSBzZXR0aW5ncyBpbiB0aGUgbWVudS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaW5zdGFsbF9tZW51X2xpbmsoKQogICAgewogICAgICAgIHdrb2YuTWVudS5pbnNlcnRfc2NyaXB0X2xpbmsoewogICAgICAgICAgICBuYW1lOiAndGltZWxpbmUnLAogICAgICAgICAgICBzdWJtZW51OiAnU2V0dGluZ3MnLAogICAgICAgICAgICB0aXRsZTogJ1VsdGltYXRlIFRpbWVsaW5lJywKICAgICAgICAgICAgb25fY2xpY2s6IG9wZW5fc2V0dGluZ3MKICAgICAgICB9KTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFRvcC1sZXZlbCBIVE1MIGZvciB0aGUgc2NyaXB0LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgdGltZWxpbmVfaHRtbCA9CiAgICAgICAgJzxzZWN0aW9uIGlkPSJ0aW1lbGluZSI+JysKICAgICAgICAnICA8aDQgY2xhc3M9Im5vX21pbiI+UmV2aWV3cyBUaW1lbGluZTwvaDQ+JysKICAgICAgICAnICA8aSBjbGFzcz0ibGluayBvcGVuIG5vc2VsZWN0IG5vX21pbiBmYSBmYS1jaGV2cm9uLXVwIiB0aXRsZT0iT3BlbiB0aGUgdGltZWxpbmUiPjwvaT4nKwogICAgICAgICcgIDxpIGNsYXNzPSJsaW5rIG1pbmltaXplIG5vc2VsZWN0IGZhIGZhLWNoZXZyb24tZG93biIgdGl0bGU9Ik1pbmltaXplIHRoZSB0aW1lbGluZSI+PC9pPicrCiAgICAgICAgJyAgPGkgY2xhc3M9ImxpbmsgcmVmcmVzaCBub3NlbGVjdCBmYSBmYS1yZWZyZXNoIiB0aXRsZT0iUmVmcmVzaCI+PC9pPicrCiAgICAgICAgJyAgPGkgY2xhc3M9Imxpbmsgc2V0dGluZ3Mgbm9zZWxlY3QgZmEgZmEtZ2VhciIgdGl0bGU9IkNoYW5nZSB0aW1lbGluZSBzZXR0aW5ncyI+PC9pPicrCiAgICAgICAgJyAgPHNwYW4gY2xhc3M9ImJhcl9zdHlsZSBoaWRkZW4iPjxsYWJlbD5CYXIgU3R5bGU6IDwvbGFiZWw+PHNlbGVjdD4nKwogICAgICAgICcgICAgPG9wdGlvbiBuYW1lPSJjb3VudCI+UmV2aWV3IENvdW50PC9vcHRpb24+JysKICAgICAgICAnICAgIDxvcHRpb24gbmFtZT0iaXRlbV90eXBlIj5JdGVtIFR5cGU8L29wdGlvbj4nKwogICAgICAgICcgICAgPG9wdGlvbiBuYW1lPSJzcnNfc3RhZ2UiPlNSUyBMZXZlbDwvb3B0aW9uPicrCiAgICAgICAgJyAgICA8b3B0aW9uIG5hbWU9ImxldmVsIj5MZXZlbDwvb3B0aW9uPicrCiAgICAgICAgJyAgPC9zZWxlY3Q+PC9zcGFuPicrCiAgICAgICAgJyAgPGZvcm0gY2xhc3M9InJhbmdlX2Zvcm0iIGNsYXNzPSJoaWRkZW4iPjxsYWJlbD48c3BhbiBjbGFzcz0icmFuZ2VfcmV2aWV3cyI+MDwvc3Bhbj4gcmV2aWV3cyBpbiA8c3BhbiBjbGFzcz0icmFuZ2VfZGF5cyI+MyBkYXlzPC9zcGFuPiA8aW5wdXQgY2xhc3M9InJhbmdlX2lucHV0IiB0eXBlPSJyYW5nZSIgbWluPSIwLjI1IiBtYXg9IjciIHZhbHVlPSIzIiBzdGVwPSIwLjI1IiBuYW1lPSJyYW5nZV9pbnB1dCI+PC9sYWJlbD48L2Zvcm0+PGJyIGNsZWFyPSJhbGwiIGNsYXNzPSJub19taW4iPicrCiAgICAgICAgJyAgPGRpdiBjbGFzcz0iZ3JhcGhfd3JhcCI+JysKICAgICAgICAnICAgIDxkaXYgY2xhc3M9InJldmlld19pbmZvIGhpZGRlbiI+PGRpdiBjbGFzcz0iaW5uZXIiPjwvZGl2PjwvZGl2PicrCiAgICAgICAgJyAgICA8ZGl2IGNsYXNzPSJncmFwaF9wYW5lbCI+PC9kaXY+JysKICAgICAgICAnICA8L2Rpdj4nKwogICAgICAgICc8L3NlY3Rpb24+JzsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluc3RhbGwgdGhlIHN0eWxlIHNoZWV0IGZvciB0aGUgc2NyaXB0LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBpbnN0YWxsX2NzcygpIHsKICAgICAgICB2YXIgdGltZWxpbmVfY3NzID0KICAgICAgICAgICAgJy5ub3NlbGVjdCB7LXdlYmtpdC10b3VjaC1jYWxsb3V0Om5vbmU7IC13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTsgLWtodG1sLXVzZXItc2VsZWN0Om5vbmU7IC1tb3otdXNlci1zZWxlY3Q6bm9uZTsgLW1zLXVzZXItc2VsZWN0Om5vbmU7IHVzZXItc2VsZWN0Om5vbmU7IGN1cnNvcjpkZWZhdWx0O30nKwogICAgICAgICAgICAnLmRhc2hib2FyZCBzZWN0aW9uLnJldmlldy1zdGF0dXMge2JvcmRlci10b3A6IDFweCBzb2xpZCAjZmZmZmZmO30nKwogICAgICAgICAgICAnLmRhc2hib2FyZCBzZWN0aW9uLnJldmlldy1zdGF0dXMgdWwgbGkgdGltZSB7d2hpdGUtc3BhY2U6IG5vd3JhcDsgb3ZlcmZsb3cteDogaGlkZGVuOyBoZWlnaHQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAwO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSB7bWFyZ2luLWJvdHRvbTogMHB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2Q0ZDRkNDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSA+IGg0IHtjbGVhcjpub25lOyBmbG9hdDpsZWZ0OyBoZWlnaHQ6MjBweDsgbWFyZ2luLXRvcDowcHg7IG1hcmdpbi1ib3R0b206NHB4OyBmb250LXdlaWdodDpub3JtYWw7IG1hcmdpbi1yaWdodDoxMnB4O30nKwogICAgICAgICAgICAnQG1lZGlhIChtYXgtd2lkdGg6IDc2N3B4KSB7I3RpbWVsaW5lIGg0IHtkaXNwbGF5OiBub25lO319JysKICAgICAgICAgICAgJyN0aW1lbGluZSA+IC5saW5rIHtjb2xvcjpyZ2JhKDAsMCwwLDAuMyk7IGZvbnQtc2l6ZToxLjFlbTsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IGN1cnNvcjpwb2ludGVyOyBtYXJnaW4tcmlnaHQ6NHB4O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gLmxpbms6aG92ZXIge2NvbG9yOnJnYmEoMjU1LDMxLDMxLDAuNSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmU6bm90KC5taW4pID4gLmxpbmsub3BlbiwgI3RpbWVsaW5lLm1pbiA+IDpub3QoLm5vX21pbikge2Rpc3BsYXk6bm9uZTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSA+IC5yYW5nZV9mb3JtIHtmbG9hdDpyaWdodDsgbWFyZ2luLWJvdHRvbTowcHg7IHRleHQtYWxpZ246cmlnaHQ7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIC5iYXJfc3R5bGUgbGFiZWwge2Rpc3BsYXk6aW5saW5lOyBtYXJnaW4tbGVmdDo4MHB4O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5iYXJfc3R5bGUgc2VsZWN0IHtoZWlnaHQ6YXV0bzsgcGFkZGluZzowOyB3aWR0aDphdXRvOyB2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTsgYmFja2dyb3VuZC1jb2xvcjojZTNlM2UzOyBib3JkZXI6MXB4IHNvbGlkICNhYWE7IGJvcmRlci1yYWRpdXM6MnB4O30nKwogICAgICAgICAgICAnQG1lZGlhIChtYXgtd2lkdGg6IDk3OXB4KSB7JysKICAgICAgICAgICAgJyAgI3RpbWVsaW5lIC5iYXJfc3R5bGUge2Zsb2F0OmxlZnQ7IGNsZWFyOmJvdGg7IG1hcmdpbi1sZWZ0OmluaGVyaXQ7fScrCiAgICAgICAgICAgICcgICN0aW1lbGluZSAuYmFyX3N0eWxlIGxhYmVsIHttYXJnaW4tbGVmdDppbmhlcml0O30nKwogICAgICAgICAgICAnfScrCiAgICAgICAgICAgICdAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsjdGltZWxpbmUgLmxpbmsge2Zsb2F0OmxlZnQ7fX0nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSA+IC5ncmFwaF9wYW5lbCBkaXYsICN0aW1lbGluZSA+IC5ncmFwaF9wYW5lbCBjYW52YXMge2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgPiAuZ3JhcGhfcGFuZWwgZGl2IHtib3JkZXI6MXB4IHNvbGlkICNkNGQ0ZDQ7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIC5ncmFwaF93cmFwIHtwb3NpdGlvbjpyZWxhdGl2ZTt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIHtwb3NpdGlvbjphYnNvbHV0ZTsgcGFkZGluZy1ib3R0b206MTUwcHg7IHotaW5kZXg6NTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLmlubmVyIHtwYWRkaW5nOjRweCA4cHggOHB4IDhweDsgY29sb3I6I2VlZWVlZTsgYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLDAuOCk7IGJvcmRlci1yYWRpdXM6NHB4OyBmb250LXdlaWdodDpib2xkOyB6LWluZGV4OjI7IGJveC1zaXppbmc6Ym9yZGVyLWJveDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkge2ZvbnQtZmFtaWx5OiJPcGVuIFNhbnMiLCJIZWx2ZXRpY2EgTmV1ZSIsSGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWY7IGZvbnQtc2l6ZToxM3B4OyBkaXNwbGF5OmlubGluZS1ibG9jazt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgZGl2IHtwYWRkaW5nOjBweCA4cHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5pbmRlbnQge3BhZGRpbmc6MDsgbWFyZ2luLWJvdHRvbTo4cHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5pbmRlbnQ6bGFzdC1jaGlsZCB7bWFyZ2luLWJvdHRvbTowO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSAuZml4ZWQge3RleHQtYWxpZ246cmlnaHQ7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC50b3Qge2NvbG9yOiMwMDAwMDA7IGJhY2tncm91bmQtY29sb3I6I2VmZWZlZjsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZWZlZmVmLCAjY2ZjZmNmKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLml0ZW1zX3dyYXAge3Bvc2l0aW9uOnJlbGF0aXZlO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5zdW1tYXJ5IC5maXhlZCB7ZGlzcGxheTppbmxpbmUtYmxvY2s7IHBvc2l0aW9uOnJlbGF0aXZlO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSAuaW5kZW50PmRpdiB7ZGlzcGxheTpub25lfScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9Iml0ZW1fdHlwZSJdIC5zdW1tYXJ5IC5pdGVtX3R5cGUge2Rpc3BsYXk6YmxvY2s7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gLnN1bW1hcnkgLnNyc19zdGFnZSB7ZGlzcGxheTpibG9jazt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5zdW1tYXJ5IC5sZXZlbCB7ZGlzcGxheTpibG9jazt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0iY291bnQiXSAuaXRlbV9saXN0ID4gbGkge2JhY2tncm91bmQtY29sb3I6I2VlZTsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZWZlZmVmLCAjY2ZjZmNmKTsgY29sb3I6IzAwMDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJjb3VudCJdIC5pdGVtX2xpc3QgPiBsaSBzdmcge3N0cm9rZTojMDAwO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9Iml0ZW1fdHlwZSJdIC5yYWQge2JhY2tncm91bmQtY29sb3I6IzAwOTZlNzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMGFmLCAjMDA5M2RkKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJpdGVtX3R5cGUiXSAua2FuIHtiYWNrZ3JvdW5kLWNvbG9yOiNlZTAwYTE7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2YwYSwgI2RkMDA5Myk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0iaXRlbV90eXBlIl0gLnZvYyB7YmFja2dyb3VuZC1jb2xvcjojOTgwMGU4OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNhMGYsICM5MzAwZGQpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIC5hcHByIHtiYWNrZ3JvdW5kLWNvbG9yOiNkZDAwOTM7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2ZmMDBhYSwgI2IzMDA3Nyk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gLmd1cnUge2JhY2tncm91bmQtY29sb3I6Izg4MmQ5ZTsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjYWEzOGM3LCAjNjYyMjc3KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAubWFzdCB7YmFja2dyb3VuZC1jb2xvcjojMjk0ZGRiOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM1MTZlZTEsICMyMTQyYzQpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIC5lbmxpIHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDkzZGQ7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzAwYWFmZiwgIzAwNzdiMyk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gLmJ1cm4ge2JhY2tncm91bmQtY29sb3I6IzQzNDM0MzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjNDM0MzQzLCAjMWExYTFhKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSBsaS5idXJuIHtib3JkZXI6MXB4IHNvbGlkICM3Nzc7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwMCB7YmFja2dyb3VuZC1jb2xvcjojNWViNmU4OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM1ZWI2ZTgsICMxZDhhYzkpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDEge2JhY2tncm91bmQtY29sb3I6I2UyNWViYzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZTI1ZWJjLCAjYzIyNDk1KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnAyIHtiYWNrZ3JvdW5kLWNvbG9yOiNhZjc5YzM7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2FmNzljMywgIzg3NDc5ZSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwMyB7YmFja2dyb3VuZC1jb2xvcjojNzY4Y2U3OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM3NjhjZTcsICMyNjRhZDkpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDQge2JhY2tncm91bmQtY29sb3I6IzVlNWU2NDsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjNWU1ZTY0LCAjMzEzMTM1KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnA1IHtiYWNrZ3JvdW5kLWNvbG9yOiNmNWM2Njc7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2Y1YzY2NywgI2YwYTUwZik7IGNvbG9yOiMzMzN9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwNSBzdmcge3N0cm9rZTojMzMzfScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSAuaW5kZW50Pi5jdXIge2Rpc3BsYXk6YmxvY2s7IGZvbnQtc3R5bGU6aXRhbGljOyBjb2xvcjojMDAwMDAwOyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmODg7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2ZmZmZhYSwgI2VlZWU3Nyk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5pbmRlbnQ+LmJ1ciB7ZGlzcGxheTpibG9jazsgZm9udC1zdHlsZTppdGFsaWM7IGNvbG9yOiNmZmZmZmY7IGJhY2tncm91bmQtY29sb3I6IzAwMDAwMDsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjNDQ0NDQ0LCAjMDAwMDAwKTt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1fbGlzdCB7bWFyZ2luOiA4cHggMCAwIDA7IHBhZGRpbmc6IDBweDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAuaXRlbV9saXN0ID4gbGkge3BhZGRpbmc6MCAzcHg7IG1hcmdpbjoxcHggMXB4OyBkaXNwbGF5OmlubGluZS1ibG9jazsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtc2l6ZToxNHB4OyBmb250LXdlaWdodDpub3JtYWw7IGN1cnNvcjpkZWZhdWx0OyBib3gtc2l6aW5nOmJvcmRlci1ib3g7IGJvcmRlcjoxcHggc29saWQgcmdiYSgwLDAsMCwwKTt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmVbZGF0YS1kZXRhaWw9ImZ1bGwiXSAuaXRlbV9saXN0ID4gbGkge2N1cnNvcjpwb2ludGVyO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5pdGVtX2luZm8ge3Bvc2l0aW9uOmFic29sdXRlOyBiYWNrZ3JvdW5kOiMzMzM7IGJvcmRlcjo4cHggc29saWQgcmdiYSgwLDAsMCwwLjcpOyBib3JkZXItcmFkaXVzOjZweDsgbGVmdDo0cHg7IHBhZGRpbmc6MCA4cHg7IHotaW5kZXg6MTA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1faW5mbyAuaXRlbSB7Zm9udC1zaXplOjJlbTsgbGluZS1oZWlnaHQ6MS4yZW07fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIHN2Zy5yYWRpY2FsIHtmaWxsOm5vbmU7c3Ryb2tlOiNmZmY7c3Ryb2tlLXdpZHRoOjg1O3N0cm9rZS1saW5lY2FwOnNxdWFyZTtzdHJva2UtbWl0ZXJsaW1pdDoyO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5pdGVtX2xpc3Qgc3ZnLnJhZGljYWwge3dpZHRoOjFlbTsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMnB4KTsgc3Ryb2tlLXdpZHRoOjg1O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5pdGVtX2luZm8gLml0ZW0gc3ZnLnJhZGljYWwge3dpZHRoOjI4cHg7IHRyYW5zZm9ybTp0cmFuc2xhdGVZKDJweCk7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIC5kZXRhaWxfYnV0dG9ucyB7ZGlzcGxheTppbmxpbmUtYmxvY2s7IHZlcnRpY2FsLWFsaWduOnRvcDsgbWFyZ2luLWxlZnQ6OHB4O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5kZXRhaWxfYnV0dG9ucyBidXR0b24ge2Rpc3BsYXk6YmxvY2s7IHdpZHRoOjEzMHB4OyBwYWRkaW5nOjA7IG1hcmdpbi1ib3R0b206MnB4OyBjb2xvcjojMDAwMDAwO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcge292ZXJmbG93OmhpZGRlbjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQge3BvaW50ZXItZXZlbnRzOm5vbmU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIHBhdGgge2ZpbGw6bm9uZTtzdHJva2U6YmxhY2s7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3NoYXBlLXJlbmRlcmluZzpjcmlzcEVkZ2VzO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCAubGlnaHQge3N0cm9rZTojZmZmZmZmO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCAuc2hhZG93IHtzdHJva2U6I2Q1ZDVkNTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgLm1ham9yIHtvcGFjaXR5OjAuMTU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5taW5vciB7b3BhY2l0eTowLjA1O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCAucmVkdGljIHtzdHJva2U6I2YyMjtvcGFjaXR5OjE7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5tYXgge3N0cm9rZTojZjIyO29wYWNpdHk6MC4yO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYm91bmRhcnkge2ZpbGw6IzAwMDtvcGFjaXR5OjA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5yZXNpemVfZ3JpcCB7ZmlsbDpub25lO2N1cnNvcjpyb3ctcmVzaXplO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAucmVzaXplX2dyaXAgLmxpZ2h0IHtzdHJva2U6I2ZmZmZmZjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLnJlc2l6ZV9ncmlwIC5zaGFkb3cge3N0cm9rZTojYmJiO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyB0ZXh0LnJlZHRpYyB7ZmlsbDojZjIyO2ZvbnQtd2VpZ2h0OmJvbGQ7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sYWJlbC14IHRleHQge3RleHQtYW5jaG9yOnN0YXJ0O2ZvbnQtc2l6ZTowLjhlbTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmxhYmVsLXkgdGV4dCB7dGV4dC1hbmNob3I6ZW5kO2ZvbnQtc2l6ZTowLjhlbTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgdGV4dCB7cG9pbnRlci1ldmVudHM6bm9uZTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJhcnMgcmVjdCB7c3Ryb2tlOm5vbmU7c2hhcGUtcmVuZGVyaW5nOmNyaXNwRWRnZXM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5iYXIub3ZlcmxheSB7b3BhY2l0eTowO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYmtnZCB7ZmlsbDojZjdmN2Y3O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAucmFkIHtmaWxsOiMwMGExZjE7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5rYW4ge2ZpbGw6I2YxMDBhMTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLnZvYyB7ZmlsbDojYTEwMGYxO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuc3VtIHtmaWxsOiMyOTRkZGI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5hcHByIHtmaWxsOiNkZDAwOTM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ndXJ1IHtmaWxsOiM4ODJkOWU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5tYXN0IHtmaWxsOiMyOTRkZGI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5lbmxpIHtmaWxsOiMwMDkzZGQ7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5idXJuIHtmaWxsOiM0MzQzNDM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5jb3VudCB7ZmlsbDojNzc4YWQ4O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubHZsZ3JwMCB7ZmlsbDojNWViNmU4O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubHZsZ3JwMSB7ZmlsbDojZTI1ZWJjO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubHZsZ3JwMiB7ZmlsbDojYWY3OWMzO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubHZsZ3JwMyB7ZmlsbDojNzY4Y2U3O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubHZsZ3JwNCB7ZmlsbDojNWU1ZTY0O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubHZsZ3JwNSB7ZmlsbDojZjVjNjY3O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYmFycyAuY3VyIHtmaWxsOiNmZmZmZmY7b3BhY2l0eTowLjY7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5iYXJzIC5idXIge2ZpbGw6IzAwMDAwMDtvcGFjaXR5OjAuNDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLm1hcmtlcnMge3N0cm9rZTojMDAwMDAwO3N0cm9rZS13aWR0aDowLjU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5tYXJrZXJzIC5idXIge2ZpbGw6IzAwMDAwMDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLm1hcmtlcnMgLmN1ciB7ZmlsbDojZmZmZmZmO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuaGlnaGxpZ2h0IC5ib3VuZGFyeSB7Y3Vyc29yOnBvaW50ZXI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmVbZGF0YS1kZXRhaWw9Im5vbmUiXSAuaGlnaGxpZ2h0IC5ib3VuZGFyeSB7Y3Vyc29yOmF1dG87fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5oaWdobGlnaHQgLm1hcmtlciB7cG9pbnRlci1ldmVudHM6bm9uZTtzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlczt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmhpZ2hsaWdodCBwYXRoLm1hcmtlciB7ZmlsbDojMDBhMWYxOyBzdHJva2U6IzAwYTFmMTsgc3Ryb2tlLXdpZHRoOjI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5oaWdobGlnaHQgcmVjdC5tYXJrZXIge2ZpbGw6cmdiYSgwLDE2MSwyNDEsMC4xKTsgc3Ryb2tlOiMwMGExZjE7IHN0cm9rZS13aWR0aDoxO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2Zy5saW5rOmhvdmVyICoge2ZpbGw6cmdiKDI1NSwzMSwzMSk7fScrCiAgICAgICAgICAgICdib2R5Lm11dGVfcG9wb3ZlciAucG9wb3Zlci5zcnMge2Rpc3BsYXk6bm9uZSAhaW1wb3J0YW50O30nKwogICAgICAgICAgICAnJzsKCiAgICAgICAgJCgnaGVhZCcpLmFwcGVuZCgnPHN0eWxlPicrdGltZWxpbmVfY3NzKyc8L3N0eWxlPicpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQbGFjZSB0aGUgdGltZWxpbmUgb24gdGhlIGRhc2hib2FyZCwgb3IgYWRqdXN0IGl0cyBsb2NhdGlvbiBvbiB0aGUgcGFnZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gcGxhY2VfdGltZWxpbmUoZmlyc3RfdGltZSkgewogICAgICAgIHZhciB0aW1lbGluZSA9IChmaXJzdF90aW1lID8gJCh0aW1lbGluZV9odG1sKSA6ICQoJyN0aW1lbGluZScpKTsKICAgICAgICAkKCcucHJvZ3Jlc3MtYW5kLWZvcmVjYXN0JykuYmVmb3JlKHRpbWVsaW5lKTsKICAgICAgICBpZiAoZmlyc3RfdGltZSkgewogICAgICAgICAgICAvLyBJbml0aWFsaXplIFVJIGZyb20gc2V0dGluZ3MKICAgICAgICAgICAgZ3JhcGguZWxlbSA9IHRpbWVsaW5lLmZpbmQoJy5ncmFwaF9wYW5lbCcpOwogICAgICAgICAgICBncmFwaC54X2F4aXMud2lkdGggPSBncmFwaC5lbGVtLndpZHRoKCkgLSBncmFwaC5tYXJnaW4ubGVmdDsKICAgICAgICAgICAgZ3JhcGgueV9heGlzLmhlaWdodCA9IHNldHRpbmdzLmdyYXBoX2hlaWdodCAtIChncmFwaC5tYXJnaW4udG9wICsgZ3JhcGgubWFyZ2luLmJvdHRvbSk7CiAgICAgICAgICAgIHVwZGF0ZV9taW5pbWl6ZSgpOwogICAgICAgICAgICBpbml0X3VpKCk7CgogICAgICAgICAgICAvLyBJbnN0YWxsIGV2ZW50IGhhbmRsZXJzCiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5saW5rLm9wZW4sIC5saW5rLm1pbmltaXplJykub24oJ2NsaWNrJywgdG9nZ2xlX21pbmltaXplKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLmxpbmsucmVmcmVzaCcpLm9uKCdjbGljaycsIGZldGNoX2FuZF91cGRhdGUpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcubGluay5zZXR0aW5ncycpLm9uKCdjbGljaycsIG9wZW5fc2V0dGluZ3MpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcuYmFyX3N0eWxlIHNlbGVjdCcpLm9uKCdjaGFuZ2UnLCBiYXJfc3R5bGVfY2hhbmdlZCk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5yYW5nZV9pbnB1dCcpLm9uKCdpbnB1dCBjaGFuZ2UnLCBkYXlzX2NoYW5nZWQpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcucmV2aWV3X2luZm8+LmlubmVyJykub24oJ21vdXNlZW50ZXInLCAnLml0ZW1fbGlzdCA+IGxpJywgaXRlbV9ob3Zlcik7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5yZXZpZXdfaW5mbz4uaW5uZXInKS5vbignbW91c2VsZWF2ZScsICcuaXRlbV9saXN0JywgaXRlbV9ob3Zlcik7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5yZXZpZXdfaW5mbz4uaW5uZXInKS5vbignY2xpY2snLCAnLmRldGFpbF9idXR0b25zIGJ1dHRvbicsIGRldGFpbF9idXR0b25fY2xpY2tlZCk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5yZXZpZXdfaW5mbz4uaW5uZXInKS5vbignY2xpY2snLCBmdW5jdGlvbigpe3JldHVybiBmYWxzZTt9KTsKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHdpbmRvd19yZXNpemVkKTsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFRvZ2dsZSB3aGV0aGVyIHRoZSB0aW1lbGluZSBpcyBtaW5pbWl6ZWQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvZ2dsZV9taW5pbWl6ZSgpIHsKICAgICAgICBzZXR0aW5ncy5taW5pbWl6ZWQgPSAhc2V0dGluZ3MubWluaW1pemVkOwogICAgICAgIHVwZGF0ZV9taW5pbWl6ZSgpOwogICAgICAgIHNhdmVfc2V0dGluZ3MoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGlkZSBvciB1bmhpZGUgdGhlIHRpbWVsaW5lIHdoZW4gdGhlIHVzZXIgbWluaW1pemVzL3Jlc3RvcmVzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiB1cGRhdGVfbWluaW1pemUoKSB7CiAgICAgICAgdmFyIHRpbWVsaW5lID0gJCgnI3RpbWVsaW5lJyk7CiAgICAgICAgdmFyIGlzX21pbiA9IHRpbWVsaW5lLmhhc0NsYXNzKCdtaW4nKTsKICAgICAgICBpZiAoc2V0dGluZ3MubWluaW1pemVkICYmICFpc19taW4pIHsKICAgICAgICAgICAgdGltZWxpbmUuYWRkQ2xhc3MoJ21pbicpOwogICAgICAgIH0gZWxzZSBpZiAoIXNldHRpbmdzLm1pbmltaXplZCAmJiBpc19taW4pIHsKICAgICAgICAgICAgdGltZWxpbmUucmVtb3ZlQ2xhc3MoJ21pbicpOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVXBkYXRlIHRoZSB0aW1lbGluZSBhZnRlciB0aGUgdXNlciBjaGFuZ2VzIHRoZSBudW1iZXIgb2YgZGF5cyB0byBkaXNwbGF5LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBkYXlzX2NoYW5nZWQoKSB7CiAgICAgICAgdmFyIGRheXMgPSBOdW1iZXIoJCgnI3RpbWVsaW5lIC5yYW5nZV9pbnB1dCcpLnZhbCgpKTsKICAgICAgICBpZiAoZGF5cyA9PT0gc2V0dGluZ3MuZGF5cykgcmV0dXJuOwogICAgICAgIHNldHRpbmdzLmRheXMgPSBkYXlzOwogICAgICAgIHVwZGF0ZV9zbGlkZXJfZGF5cygpOwogICAgICAgIGJ1bmRsZV9ieV90aW1lc2xvdCgpOwogICAgICAgIHVwZGF0ZV9zbGlkZXJfcmV2aWV3cygpOwogICAgICAgIGRyYXdfdGltZWxpbmUoKTsKICAgICAgICBzYXZlX3NldHRpbmdzKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhhbmRsZXIgZm9yIHdoZW4gdXNlciBjaGFuZ2VzIHRoZSBCYXIgU3R5bGUuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGJhcl9zdHlsZV9jaGFuZ2VkKCkgewogICAgICAgIHNldHRpbmdzLmJhcl9zdHlsZSA9ICQoJyN0aW1lbGluZSAuYmFyX3N0eWxlIHNlbGVjdCA6c2VsZWN0ZWQnKS5hdHRyKCduYW1lJyk7CiAgICAgICAgZHJhd190aW1lbGluZSgpOwogICAgICAgIHNhdmVfc2V0dGluZ3MoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGFuZGxlciBmb3Igd2hlbiB1c2VyIGNsaWNrcyAnU2F2ZScgaW4gdGhlIHNldHRpbmdzIHdpbmRvdy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gc2V0dGluZ3Nfc2F2ZWQoKSB7CiAgICAgICAgc2V0dGluZ3MgPSB3a29mLnNldHRpbmdzLnRpbWVsaW5lOwogICAgICAgIHBsYWNlX3RpbWVsaW5lKGZhbHNlIC8qIGZpcnN0X3RpbWUgKi8pOwogICAgICAgIGluaXRfdWkoKTsKICAgICAgICBidW5kbGVfYnlfdGltZXNsb3QoKTsKICAgICAgICBkcmF3X3RpbWVsaW5lKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemUgdGhlIHVzZXIgaW50ZXJmYWNlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBpbml0X3VpKCkgewogICAgICAgIGluaXRfc2xpZGVyKCk7CiAgICAgICAgaWYgKHNldHRpbmdzLnNob3dfYmFyX3N0eWxlX2Ryb3Bkb3duKSB7CiAgICAgICAgICAgICQoJyN0aW1lbGluZSAuYmFyX3N0eWxlJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoJyN0aW1lbGluZSAuYmFyX3N0eWxlJykuYWRkQ2xhc3MoJ2hpZGRlbicpOwogICAgICAgIH0KICAgICAgICAkKCcjdGltZWxpbmUgLmJhcl9zdHlsZSBvcHRpb25bbmFtZT0iJytzZXR0aW5ncy5iYXJfc3R5bGUrJyJdJykucHJvcCgnc2VsZWN0ZWQnLHRydWUpOwogICAgICAgICQoJyN0aW1lbGluZScpLmF0dHIoJ2RhdGEtZGV0YWlsJywgc2V0dGluZ3Muc2hvd19yZXZpZXdfZGV0YWlscyk7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbycpLmF0dHIoJ2RhdGEtbW9kZScsIHNldHRpbmdzLnJldmlld19kZXRhaWxzX3N1bW1hcnkpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBJbml0aWFsaXplIHRoZSBzY2FsZSBzbGlkZXIuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGluaXRfc2xpZGVyKCkgewogICAgICAgIHZhciByYW5nZSA9ICQoJyN0aW1lbGluZSAucmFuZ2VfaW5wdXQnKTsKICAgICAgICBpZiAoc2V0dGluZ3MuZGF5cyA+IHNldHRpbmdzLm1heF9kYXlzKSB7CiAgICAgICAgICAgIHNldHRpbmdzLmRheXMgPSBzZXR0aW5ncy5tYXhfZGF5czsKICAgICAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgICAgIH0KICAgICAgICByYW5nZS5hdHRyKCdtYXgnLCBzZXR0aW5ncy5tYXhfZGF5cyk7CiAgICAgICAgcmFuZ2UuYXR0cigndmFsdWUnLCBzZXR0aW5ncy5kYXlzKTsKICAgICAgICB1cGRhdGVfc2xpZGVyX2RheXMoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVXBkYXRlIHRoZSAncmV2aWV3cycgdGV4dCBvZiB0aGUgc2NhbGUgc2xpZGVyLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiB1cGRhdGVfc2xpZGVyX3Jldmlld3MoKSB7CiAgICAgICAgdmFyIHJldmlld19jb3VudCA9ICQoJyN0aW1lbGluZSAucmFuZ2VfcmV2aWV3cycpOwogICAgICAgIHJldmlld19jb3VudC50ZXh0KGdyYXBoLnRvdGFsX3Jldmlld3MpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBVcGRhdGUgdGhlICdkYXlzJyB0ZXh0IG9mIHRoZSBzY2FsZSBzbGlkZXIuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHVwZGF0ZV9zbGlkZXJfZGF5cygpIHsKICAgICAgICB2YXIgZGF5cyA9IHNldHRpbmdzLmRheXM7CiAgICAgICAgdmFyIHBlcmlvZCA9ICQoJyN0aW1lbGluZSAucmFuZ2VfZGF5cycpOwogICAgICAgIGlmIChkYXlzIDw9IDEpIHsKICAgICAgICAgICAgcGVyaW9kLnRleHQoKGRheXMqMjQpKycgaG91cnMnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwZXJpb2QudGV4dChkYXlzLnRvRml4ZWQoMikrJyBkYXlzJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTYXZlIHRoZSBzY3JpcHQgc2V0dGluZ3MgKGFmdGVyIGEgNTAwbXMgZGVsYXkpLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgc2F2ZV9kZWxheV90aW1lcjsKICAgIGZ1bmN0aW9uIHNhdmVfc2V0dGluZ3MoKSB7CiAgICAgICAgaWYgKHNhdmVfZGVsYXlfdGltZXIgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHNhdmVfZGVsYXlfdGltZXIpOwogICAgICAgIHNhdmVfZGVsYXlfdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIHdrb2YuU2V0dGluZ3Muc2F2ZSgndGltZWxpbmUnKTsKICAgICAgICB9LCA1MDApOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIYW5kbGVyIGZvciByZXNpemluZyB0aGUgcGFuZWwgYnkgZHJhZ2dpbmcgdGhlIGJvdHRvbSBvZiB0aGUgZ3JhcGguCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gcmVzaXplX3BhbmVsKGUpIHsKICAgICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjsKICAgICAgICB2YXIgcGFuZWwgPSAkKCcjdGltZWxpbmUgPiAuZ3JhcGhfcGFuZWwnKTsKICAgICAgICB2YXIgc3RhcnRfeSA9IGUucGFnZVk7CiAgICAgICAgdmFyIHN0YXJ0X2hlaWdodCA9IHNldHRpbmdzLmdyYXBoX2hlaWdodDsKICAgICAgICAkKCdib2R5JykKICAgICAgICAuYWRkQ2xhc3MoJ211dGVfcG9wb3ZlcicpCiAgICAgICAgLm9uKCdtb3VzZW1vdmUudGltZWxpbmVfcmVzaXplIHRvdWNobW92ZS50aW1lbGluZV9yZXNpemUnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgdmFyIGhlaWdodCA9IHN0YXJ0X2hlaWdodCArIChlLnBhZ2VZIC0gc3RhcnRfeSk7CiAgICAgICAgICAgIGlmIChoZWlnaHQgPCBncmFwaC55X2F4aXMubWluX2hlaWdodCkgaGVpZ2h0ID0gZ3JhcGgueV9heGlzLm1pbl9oZWlnaHQ7CiAgICAgICAgICAgIGlmIChoZWlnaHQgPiBncmFwaC55X2F4aXMubWF4X2hlaWdodCkgaGVpZ2h0ID0gZ3JhcGgueV9heGlzLm1heF9oZWlnaHQ7CiAgICAgICAgICAgIHNldHRpbmdzLmdyYXBoX2hlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgZ3JhcGgueV9heGlzLmhlaWdodCA9IGhlaWdodCAtIChncmFwaC5tYXJnaW4udG9wICsgZ3JhcGgubWFyZ2luLmJvdHRvbSk7CiAgICAgICAgICAgIGRyYXdfdGltZWxpbmUoKTsKICAgICAgICB9KQogICAgICAgIC5vbignbW91c2V1cC50aW1lbGluZV9yZXNpemUgdG91Y2hlbmQudGltZWxpbmVfcmVzaXplJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgIHNhdmVfc2V0dGluZ3MoKTsKICAgICAgICAgICAgJCgnYm9keScpLm9mZignLnRpbWVsaW5lX3Jlc2l6ZScpLnJlbW92ZUNsYXNzKCdtdXRlX3BvcG92ZXInKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgaG92ZXJpbmcgb3ZlciB0aGUgdGltZSBzY2FsZSBmb3IgaGlnaGxpZ2h0aW5nLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBoaWdobGlnaHQgPSB7c3RhcnQ6MCwgZW5kOjAsIGRyYWdnaW5nOmZhbHNlLCBoaWdobGlnaHRlZDogZmFsc2V9OwogICAgZnVuY3Rpb24gaGlnaGxpZ2h0X2hvdmVyKGUpIHsKICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd19yZXZpZXdfZGV0YWlscyA9PT0gJ25vbmUnKSByZXR1cm47CiAgICAgICAgaWYgKGhpZ2hsaWdodC5kcmFnZ2luZykgcmV0dXJuIHRydWU7CiAgICAgICAgdmFyIGJ1bmRsZV9pZHggPSBuZWFyZXN0X2J1bmRsZShlLnBhZ2VYKTsKICAgICAgICB2YXIgeDsKICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICBjYXNlICdtb3VzZWVudGVyJzoKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnbW91c2Vtb3ZlJzoKICAgICAgICAgICAgICAgIGlmIChoaWdobGlnaHQuaGlnaGxpZ2h0ZWQpIHJldHVybjsKICAgICAgICAgICAgICAgIHggPSBidW5kbGVfdG9feChidW5kbGVfaWR4KTsKICAgICAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuc3RhcnQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLDApJyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ21vdXNlbGVhdmUnOgogICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodC5kcmFnZ2luZyB8fCBoaWdobGlnaHQuaGlnaGxpZ2h0ZWQpIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgaGlkZV9oaWdobGlnaHQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAndG91Y2hzdGFydCc6CiAgICAgICAgICAgIGNhc2UgJ21vdXNlZG93bic6CiAgICAgICAgICAgICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodC5oaWdobGlnaHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBoaWdobGlnaHQuZHJhZ2dpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0LnN0YXJ0ID0gYnVuZGxlX2lkeDsKICAgICAgICAgICAgICAgIHggPSBidW5kbGVfdG9feChidW5kbGVfaWR4KTsKICAgICAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuc3RhcnQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLDApJyk7CiAgICAgICAgICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLmVuZCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoLTEwMCwwKScpOwogICAgICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgcmVjdC5tYXJrZXInKS5hdHRyKCd3aWR0aCcsMCkuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3grJywwKScpOwogICAgICAgICAgICAgICAgJCgnYm9keScpLm9uKCdtb3VzZW1vdmUudGltZWxpbmVfaGlnaGxpZ2h0JywgaGlnaGxpZ2h0X2RyYWcpOwogICAgICAgICAgICAgICAgJCgnYm9keScpLm9uKCd0b3VjaGVuZC50aW1lbGluZV9oaWdobGlnaHQgbW91c2V1cC50aW1lbGluZV9oaWdobGlnaHQnLCBoaWdobGlnaHRfcmVsZWFzZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV2ZW4gaGFuZGxlciBmb3IgZHJhZ2dpbmcgd2hlbiBoaWdobGlnaHRpbmcgYSB0aW1lIHJhbmdlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhpZ2hsaWdodF9kcmFnKGUpIHsKICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IG5lYXJlc3RfYnVuZGxlKGUucGFnZVgpOwogICAgICAgIGhpZ2hsaWdodC5lbmQgPSBidW5kbGVfaWR4OwogICAgICAgIHZhciB4MSA9IGJ1bmRsZV90b194KGhpZ2hsaWdodC5zdGFydCk7CiAgICAgICAgdmFyIHgyID0gYnVuZGxlX3RvX3goaGlnaGxpZ2h0LmVuZCk7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5lbmQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreDIrJywwKScpOwogICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IHJlY3QubWFya2VyJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK01hdGgubWluKHgxLHgyKSsnLjUsMC41KScpLmF0dHIoJ3dpZHRoJyxNYXRoLmFicyh4Mi14MSkpOwogICAgICAgIHNob3dfcmV2aWV3X2luZm8oZmFsc2UgLyogc3RpY2t5ICovKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgdGhlIGVuZCBvZiBhICdkcmFnJyB3aGVuIGhpZ2hsaWdodGluZyBhIHRpbWUgcmFuZ2UuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaGlnaGxpZ2h0X3JlbGVhc2UoZSkgewogICAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuOwogICAgICAgIGhpZ2hsaWdodC5kcmFnZ2luZyA9IGZhbHNlOwogICAgICAgICQoJ2JvZHknKS5vZmYoJy50aW1lbGluZV9oaWdobGlnaHQnKTsKICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IG5lYXJlc3RfYnVuZGxlKGUucGFnZVgpOwogICAgICAgIGhpZ2hsaWdodC5lbmQgPSBidW5kbGVfaWR4OwogICAgICAgIGlmIChoaWdobGlnaHQuc3RhcnQgPT09IGhpZ2hsaWdodC5lbmQpIHsKICAgICAgICAgICAgaGlkZV9oaWdobGlnaHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgeDEgPSBidW5kbGVfdG9feChNYXRoLm1pbihoaWdobGlnaHQuc3RhcnQsIGhpZ2hsaWdodC5lbmQpKTsKICAgICAgICAgICAgdmFyIHgyID0gYnVuZGxlX3RvX3goTWF0aC5tYXgoaGlnaGxpZ2h0LnN0YXJ0LCBoaWdobGlnaHQuZW5kKSk7CiAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuc3RhcnQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreDErJywwKScpOwogICAgICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLmVuZCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4MisnLDApJyk7CiAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IHJlY3QubWFya2VyJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3gxKycuNSwwLjUpJykuYXR0cignd2lkdGgnLHgyLXgxKTsKICAgICAgICAgICAgaGlnaGxpZ2h0LmhpZ2hsaWdodGVkID0gdHJ1ZTsKICAgICAgICAgICAgc2hvd19yZXZpZXdfaW5mbyh0cnVlIC8qIHN0aWNreSAqLyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGlkZSB0aGUgdGltZWxpbmUncyBoaWdobGlnaHQgY3Vyc29ycy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBoaWRlX2hpZ2hsaWdodCgpIHsKICAgICAgICBoaWdobGlnaHQuc3RhcnQgPSAtMTsKICAgICAgICBoaWdobGlnaHQuZW5kID0gLTE7CiAgICAgICAgaGlnaGxpZ2h0LmhpZ2hsaWdodGVkID0gZmFsc2U7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgcmVjdC5tYXJrZXInKS5hdHRyKCd3aWR0aCcsMCkuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtMTAwLDAuNSknKTsKICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLnN0YXJ0JykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtMTAwLDApJyk7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5lbmQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC0xMDAsMCknKTsKICAgICAgICBoaWRlX3Jldmlld19pbmZvKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIG5lYXJlc3RfYnVuZGxlKCkKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBuZWFyZXN0X2J1bmRsZSh4KSB7CiAgICAgICAgdmFyIHBhbmVsX2xlZnQgPSBNYXRoLmZsb29yKCQoJyN0aW1lbGluZSAuZ3JhcGhfcGFuZWwnKS5vZmZzZXQoKS5sZWZ0KTsKICAgICAgICB4IC09IHBhbmVsX2xlZnQgKyBncmFwaC5tYXJnaW4ubGVmdDsKICAgICAgICBpZiAoeCA8IDApIHggPSAwOwogICAgICAgIHZhciB0aWMgPSB4ICogZ3JhcGgueF9heGlzLm1heF9ob3VycyAvIGdyYXBoLnhfYXhpcy53aWR0aDsKICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IGdyYXBoLnRpbWVzbG90c1tNYXRoLm1pbihncmFwaC54X2F4aXMubWF4X2hvdXJzLTEsIE1hdGguZmxvb3IodGljKSldOwogICAgICAgIHZhciBidW5kbGUgPSBncmFwaC5idW5kbGVzW2J1bmRsZV9pZHhdOwogICAgICAgIHZhciBzdGFydCA9IGJ1bmRsZS5zdGFydF90aW1lOwogICAgICAgIHZhciBlbmQgPSBidW5kbGUuZW5kX3RpbWU7CiAgICAgICAgcmV0dXJuICh0aWMgPD0gKChzdGFydCtlbmQpLzIpID8gYnVuZGxlX2lkeCA6IGJ1bmRsZV9pZHgrMSk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENvbnZlcnQgYSBidW5kbGVfaWR4IHRvIGEgZ3JhcGggaG91ciBvZmZzZXQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gYnVuZGxlX3RvX3RpYyhidW5kbGVfaWR4KSB7CiAgICAgICAgaWYgKGJ1bmRsZV9pZHggPj0gZ3JhcGguYnVuZGxlcy5sZW5ndGgpIHJldHVybiBncmFwaC54X2F4aXMubWF4X2hvdXJzOwogICAgICAgIHJldHVybiBncmFwaC5idW5kbGVzW2J1bmRsZV9pZHhdLnN0YXJ0X3RpbWU7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENvbnZlcnQgYSBidW5kbGVfaWR4IHRvIGEgZ3JhcGggWCBvZmZzZXQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gYnVuZGxlX3RvX3goYnVuZGxlX2lkeCkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGJ1bmRsZV90b190aWMoYnVuZGxlX2lkeCkgKiBncmFwaC50aWNfc3BhY2luZyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE9wZW4gdGhlIHNldHRpbmdzIGRpYWxvZwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBvcGVuX3NldHRpbmdzKCkgewogICAgICAgIHZhciBjb25maWcgPSB7CiAgICAgICAgICAgIHNjcmlwdF9pZDogJ3RpbWVsaW5lJywKICAgICAgICAgICAgdGl0bGU6ICdVbHRpbWF0ZSBUaW1lbGluZScsCiAgICAgICAgICAgIG9uX3NhdmU6IHNldHRpbmdzX3NhdmVkLAogICAgICAgICAgICBjb250ZW50OiB7CiAgICAgICAgICAgICAgICB0YWJzOiB7dHlwZTondGFic2V0JywgY29udGVudDogewogICAgICAgICAgICAgICAgICAgIHBnR3JhcGg6IHt0eXBlOidwYWdlJywgbGFiZWw6J0dyYXBoJywgaG92ZXJfdGlwOidHcmFwaCBTZXR0aW5ncycsIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JwVGltZToge3R5cGU6J2dyb3VwJywgbGFiZWw6J1RpbWUnLCBjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfZm9ybWF0OiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonVGltZSBGb3JtYXQnLCBkZWZhdWx0OicxMmhvdXInLCBjb250ZW50OnsnMTJob3VyJzonMTItaG91cicsJzI0aG91cic6JzI0LWhvdXInLCAnaG91cnNfb25seSc6ICdIb3VycyBvbmx5J30sIGhvdmVyX3RpcDonRGlzcGxheSB0aW1lIGluIDEyIG9yIDI0LWhvdXIgZm9ybWF0LCBvciBob3Vycy1mcm9tLW5vdy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kYXlzOiB7dHlwZTonbnVtYmVyJywgbGFiZWw6J1NsaWRlciBSYW5nZSBNYXggKGRheXMpJywgbWluOjEsIG1heDoxMjUsIGRlZmF1bHQ6NywgaG92ZXJfdGlwOidDaG9vc2UgbWF4aW11bSByYW5nZSBvZiB0aGUgdGltZWxpbmUgc2xpZGVyIChpbiBkYXlzKS4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdycEJhcnM6IHt0eXBlOidncm91cCcsIGxhYmVsOidCYXJzJywgY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYmFyX3dpZHRoOiB7dHlwZTonbnVtYmVyJywgbGFiZWw6J01heCBCYXIgV2lkdGggKHBpeGVscyknLCBkZWZhdWx0OjAsIGhvdmVyX3RpcDonU2V0IHRoZSBtYXhpbXVtIGJhciB3aWR0aCAoaW4gcGl4ZWxzKS5cbigwID0gdW5saW1pdGVkKSd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Jhcl9oZWlnaHQ6IHt0eXBlOidudW1iZXInLCBsYWJlbDonTWF4IEdyYXBoIEhlaWdodCAocmV2aWV3cyknLCBkZWZhdWx0OjAsIGhvdmVyX3RpcDonU2V0IHRoZSBtYXhpbXVtIGdyYXBoIGhlaWdodCAoaW4gcmV2aWV3cykuXG4oMCA9IHVubGltaXRlZClcblVzZWZ1bCBmb3Igd2hlbiB5b3UgaGF2ZSBhIGh1Z2UgYmFja2xvZy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX2Jhcl9oZWlnaHQ6IHt0eXBlOidjaGVja2JveCcsIGxhYmVsOidGb3JjZSBHcmFwaCB0byBNYXggSGVpZ2h0JywgZGVmYXVsdDpmYWxzZSwgaG92ZXJfdGlwOidGb3JjZSB0aGUgZ3JhcGggaGVpZ2h0IHRvIGFsd2F5cyBiZSB0aGUgTWF4IEdyYXBoIEhlaWdodC5cblVzZWZ1bCB3aGVuIGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgcmV2aWV3cyB5b3UgZG8gaW4gb25lIHNpdHRpbmcuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJfc3R5bGU6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidCYXIgU3R5bGUnLCBkZWZhdWx0OidpdGVtX3R5cGUnLCBjb250ZW50OnsnY291bnQnOidSZXZpZXcgQ291bnQnLCdpdGVtX3R5cGUnOidJdGVtIFR5cGUnLCdzcnNfc3RhZ2UnOidTUlMgTGV2ZWwnLCdsZXZlbCc6J0xldmVsJ30sIGhvdmVyX3RpcDonQ2hvb3NlIGhvdyBiYXJzIGFyZSBzdWJkaXZpZGVkLid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JzX2N1cnJfbmV4dDoge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J0N1cnJlbnQgLyBOZXh0IFNSUyBMZXZlbCcsIGRlZmF1bHQ6J2N1cnInLCBjb250ZW50OnsnY3Vycic6J0N1cnJlbnQgU1JTIExldmVsJywnbmV4dCc6J05leHQgU1JTIExldmVsJ30sIGhvdmVyX3RpcDonU2VsZWN0IHdoZXRoZXIgU1JTIGlzIGNvbG9yLWNvZGVkIGJ5XG5jdXJyZW50IFNSUyBsZXZlbCwgb3IgbmV4dCBTUlMgbGV2ZWwuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICAgICAgICAgICAgICBncnBNYXJrZXJzOiB7dHlwZTonZ3JvdXAnLCBsYWJlbDonTWFya2VycycsIGNvbnRlbnQ6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9sZXZlbF9tYXJrZXJzOiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonQ3VycmVudCBMZXZlbCBNYXJrZXJzJywgZGVmYXVsdDoncmt2JywgY29udGVudDp7J25vbmUnOidOb25lJywncmsnOidSYWQgKyBLYW4nLCdya3YnOidSYWQgKyBLYW4gKyBWb2MnfSwgaG92ZXJfdGlwOidTZWxlY3Qgd2hpY2ggaXRlbSB0eXBlcyB3aWxsIHRyaWdnZXIgYSBDdXJyZW50IExldmVsXG5tYXJrZXIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZ3JhcGguJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXJuX21hcmtlcnM6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidCdXJuIE1hcmtlcnMnLCBkZWZhdWx0OidzaG93JywgY29udGVudDp7J3Nob3cnOidTaG93JywnaGlkZSc6J0hpZGUnfSwgaG92ZXJfdGlwOidTZWxlY3Qgd2hldGhlciBCdXJuIG1hcmtlcnMgYXJlIHNob3duXG5hdCB0aGUgYm90dG9tIG9mIHRoZSBncmFwaC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgcGdSZXZpZXdEZXRhaWxzOiB7dHlwZToncGFnZScsIGxhYmVsOidSZXZpZXcgRGV0YWlscycsIGhvdmVyX3RpcDonUmV2aWV3IERldGFpbHMgUG9wLXVwJywgY29udGVudDogewogICAgICAgICAgICAgICAgICAgICAgICBzaG93X3Jldmlld19kZXRhaWxzOiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonU2hvdyBSZXZpZXcgRGV0YWlscycsIGRlZmF1bHQ6J2Z1bGwnLCBjb250ZW50Onsnbm9uZSc6J05vbmUnLCdzdW1tYXJ5JzonU3VtbWFyeScsJ2l0ZW1fbGlzdCc6J0l0ZW0gTGlzdCcsJ2Z1bGwnOidGdWxsIEl0ZW0gRGV0YWlscyd9LCBob3Zlcl90aXA6J0Nob29zZSB0aGUgbGV2ZWwgb2YgZGV0YWlsIHRvIGRpc3BsYXlcbndoZW4gYSBiYXIgb3IgdGltZSByYW5nZSBpcyBzZWxlY3RlZC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmV2aWV3X2RldGFpbHNfc3VtbWFyeToge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J1JldmlldyBEZXRhaWxzIFN1bW1hcnknLCBkZWZhdWx0OidpdGVtX3R5cGUnLCBjb250ZW50OnsnY291bnQnOidSZXZpZXcgQ291bnQnLCdpdGVtX3R5cGUnOidJdGVtIFR5cGUnLCdzcnNfc3RhZ2UnOidTUlMgTGV2ZWwnLCdsZXZlbCc6J0xldmVsJ30sIGhvdmVyX3RpcDonQ2hvb3NlIHdoaWNoIHN1bW1hcnkgaW5mb3JtYXRpb24gdG9cbmRpc3BsYXkgb24gdGhlIFJldmlldyBEZXRhaWxzIHBvcC11cC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgcmV2aWV3X2RldGFpbHNfYnV0dG9uczoge3R5cGU6J2NoZWNrYm94JywgbGFiZWw6J1Nob3cgUmV2aWV3IERldGFpbHMgQnV0dG9ucycsIGRlZmF1bHQ6dHJ1ZSwgaG92ZXJfdGlwOidTaG93IGNvbmZpZ3VyYXRpb24gYnV0dG9ucyBvbiBSZXZpZXcgRGV0YWlscyBwb3AtdXAuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfYmFyX3N0eWxlX2Ryb3Bkb3duOiB7dHlwZTonY2hlY2tib3gnLCBsYWJlbDonU2hvdyBCYXIgU3R5bGUgRHJvcGRvd24nLCBkZWZhdWx0OmZhbHNlLCBob3Zlcl90aXA6J1Nob3cgdGhlIEJhciBTdHlsZSBkcm9wZG93biBhYm92ZSB0aGUgdGltZWxpbmUuJ30sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdmFyIHNldHRpbmdzX2RpYWxvZyA9IG5ldyB3a29mLlNldHRpbmdzKGNvbmZpZyk7CiAgICAgICAgc2V0dGluZ3NfZGlhbG9nLm9wZW4oKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgaG91cnMgcGVyIGJhci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZ2V0X2hvdXJzX3Blcl9iYXIoKSB7CiAgICAgICAgZ3JhcGgueF9heGlzLndpZHRoID0gZ3JhcGguZWxlbS53aWR0aCgpIC0gZ3JhcGgubWFyZ2luLmxlZnQ7CiAgICAgICAgZ3JhcGgueF9heGlzLm1heF9ob3VycyA9IE1hdGgucm91bmQoc2V0dGluZ3MuZGF5cyAqIDI0KTsKCiAgICAgICAgLy8gTm8gbW9yZSB0aGFuIDEgbGFiZWwgZXZlcnkgNTAgcGl4ZWxzCiAgICAgICAgdmFyIG1pbl9waXhlbHNfcGVyX2xhYmVsID0gNTA7CiAgICAgICAgZ3JhcGgubWluX2hvdXJzX3Blcl9sYWJlbCA9IG1pbl9waXhlbHNfcGVyX2xhYmVsICogZ3JhcGgueF9heGlzLm1heF9ob3VycyAvIGdyYXBoLnhfYXhpcy53aWR0aDsKICAgICAgICB4c2NhbGUuaWR4ID0gMDsKICAgICAgICB3aGlsZSAoKHhzY2FsZS5ob3Vyc19wZXJfbGFiZWxbeHNjYWxlLmlkeF0gPD0gZ3JhcGgubWluX2hvdXJzX3Blcl9sYWJlbCkgJiYKICAgICAgICAgICAgICAgKHhzY2FsZS5pZHggPCB4c2NhbGUuaG91cnNfcGVyX2xhYmVsLmxlbmd0aC0xKSkgewogICAgICAgICAgICB4c2NhbGUuaWR4Kys7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4geHNjYWxlLmJ1bmRsZV9jaG9pY2VzW3hzY2FsZS5pZHhdOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBNYXAgbGV0dGVycyBpbiB0aGUgeHNjYWxlIGNoYXJ0IHRvIGNvcnJlc3BvbmRpbmcgbGFiZWwtZ2VuZXJhdGluZyBmdW5jdGlvbnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBsYWJlbF9mdW5jdGlvbnMgPSB7CiAgICAgICAgJ20nOiBtb250aF9sYWJlbCwKICAgICAgICAndyc6IHdlZWtfbGFiZWwsCiAgICAgICAgJ0QnOiBtZGF5X2xhYmVsLAogICAgICAgICdkJzogZGF5X2xhYmVsLAogICAgICAgICdoJzogaG91cl9sYWJlbCwKICAgICAgICAnLSc6IG5vX2xhYmVsLAogICAgfTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIHRpbWUtc2NhbGUgbGFiZWxzCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG1vbnRoX2xhYmVsKGRhdGUsIHF0eSwgdXNlX3Nob3J0KSB7CiAgICAgICAgaWYgKGRhdGUuZ2V0SG91cnMoKSAhPT0gMCB8fCBkYXRlLmdldERhdGUoKSAhPT0gMSkgcmV0dXJuOwogICAgICAgIHJldHVybiBbJ0phbicsJ0ZlYicsJ01hcicsJ0FwcicsJ01heScsJ0p1bicsJ0p1bCcsJ0F1ZycsJ1NlcCcsJ09jdCcsJ05vdicsJ0RlYyddW2RhdGUuZ2V0TW9udGgoKV07CiAgICB9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHdlZWtfbGFiZWwoZGF0ZSwgcXR5LCB1c2Vfc2hvcnQpIHsKICAgICAgICBpZiAoZGF0ZS5nZXRIb3VycygpICE9PSAwIHx8IGRhdGUuZ2V0RGF5KCkgIT09IDApIHJldHVybjsKICAgICAgICByZXR1cm4gKHVzZV9zaG9ydCA/ICdTJyA6ICdTdW4nKTsKICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbWRheV9sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCkgewogICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgIT09IDApIHJldHVybjsKICAgICAgICB2YXIgbWRheSA9IGRhdGUuZ2V0RGF0ZSgpOwogICAgICAgIGlmIChtZGF5ICUgcXR5ICE9PSAwKSByZXR1cm47CiAgICAgICAgcmV0dXJuIG1kYXk7CiAgICB9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGRheV9sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCkgewogICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgIT09IDApIHJldHVybjsKICAgICAgICB2YXIgbGFiZWwgPSBbJ1N1bicsJ01vbicsJ1R1ZScsJ1dlZCcsJ1RodScsJ0ZyaScsJ1NhdCddW2RhdGUuZ2V0RGF5KCldOwogICAgICAgIHJldHVybiAodXNlX3Nob3J0ID8gbGFiZWxbMF0gOiBsYWJlbCk7CiAgICB9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhvdXJfbGFiZWwoZGF0ZSwgcXR5LCB1c2Vfc2hvcnQpIHsKICAgICAgICB2YXIgaGggPSBkYXRlLmdldEhvdXJzKCk7CiAgICAgICAgaWYgKChoaCAlIHF0eSkgIT09IDApIHJldHVybjsKICAgICAgICBpZiAoc2V0dGluZ3MudGltZV9mb3JtYXQgPT09ICcyNGhvdXInKSB7CiAgICAgICAgICAgIHJldHVybiAoJzAnK2hoKyc6MDAnKS5zbGljZSgtNSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICgoKGhoICsgMTEpICUgMTIpICsgMSkgKyAnYXAnW01hdGguZmxvb3IoaGgvMTIpXSArICdtJzsKICAgICAgICB9CiAgICB9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhvdXJfb25seV9sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCwgdGljX2lkeCkgewogICAgICAgIGlmICh0aWNfaWR4ICUgcXR5ICE9PSAwKSByZXR1cm47CiAgICAgICAgcmV0dXJuIHRpY19pZHggKyAodXNlX3Nob3J0ID8gJ2gnIDogJyBocnMnKTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG5vX2xhYmVsKCkge3JldHVybjt9CiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRHJhdyB0aGUgdGltZWxpbmUKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZHJhd190aW1lbGluZSgpIHsKICAgICAgICB2YXIgcGFuZWwgPSBncmFwaC5lbGVtLAogICAgICAgICAgICBwYW5lbF9oZWlnaHQgPSBzZXR0aW5ncy5ncmFwaF9oZWlnaHQsCiAgICAgICAgICAgIHBhbmVsX3dpZHRoID0gZ3JhcGguZWxlbS53aWR0aCgpLAogICAgICAgICAgICBncmFwaF9oZWlnaHQgPSBwYW5lbF9oZWlnaHQgLSAoZ3JhcGgubWFyZ2luLnRvcCArIGdyYXBoLm1hcmdpbi5ib3R0b20pOwoKICAgICAgICB2YXIgbWF0Y2ggPSB4c2NhbGUucmVkX3RpY19jaG9pY2VzW3hzY2FsZS5pZHhdLm1hdGNoKC9eKFxkKikoLikocz8pJC8pOwogICAgICAgIHZhciByZWRfcXR5ID0gTnVtYmVyKG1hdGNoWzFdKTsKICAgICAgICB2YXIgcmVkX2Z1bmMgPSBsYWJlbF9mdW5jdGlvbnNbbWF0Y2hbMl1dOwogICAgICAgIHZhciByZWRfdXNlX3Nob3J0ID0gKG1hdGNoWzNdID09PSAncycpOwoKICAgICAgICBtYXRjaCA9IHhzY2FsZS5tYWpvcl90aWNfY2hvaWNlc1t4c2NhbGUuaWR4XS5tYXRjaCgvXihcZCopKC4pKHM/KSQvKTsKICAgICAgICB2YXIgbWFqX3F0eSA9IE51bWJlcihtYXRjaFsxXSk7CiAgICAgICAgdmFyIG1hal9mdW5jID0gbGFiZWxfZnVuY3Rpb25zW21hdGNoWzJdXTsKICAgICAgICB2YXIgbWFqX3VzZV9zaG9ydCA9IChtYXRjaFszXSA9PT0gJ3MnKTsKCiAgICAgICAgbWF0Y2ggPSB4c2NhbGUubWlub3JfdGljX2Nob2ljZXNbeHNjYWxlLmlkeF0ubWF0Y2goL14oXGQqKSguKShzPykkLyk7CiAgICAgICAgdmFyIG1pbl9xdHkgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgICAgIHZhciBtaW5fZnVuYyA9IGxhYmVsX2Z1bmN0aW9uc1ttYXRjaFsyXV07CiAgICAgICAgdmFyIG1pbl91c2Vfc2hvcnQgPSAobWF0Y2hbM10gPT09ICdzJyk7CgogICAgICAgIGlmIChzZXR0aW5ncy50aW1lX2Zvcm1hdCA9PT0gJ2hvdXJzX29ubHknKSB7CiAgICAgICAgICAgIHJlZF9mdW5jID0gZnVuY3Rpb24oKSB7cmV0dXJuIDA7fTsKICAgICAgICAgICAgbWFqX2Z1bmMgPSBob3VyX29ubHlfbGFiZWw7CiAgICAgICAgICAgIG1pbl9mdW5jID0gaG91cl9vbmx5X2xhYmVsOwogICAgICAgIH0KCiAgICAgICAgdmFyIGJ1bmRsZV9zaXplID0geHNjYWxlLmJ1bmRsZV9jaG9pY2VzW3hzY2FsZS5pZHhdOwoKICAgICAgICAvLyBTdHJpbmcgZm9yIGJ1aWxkaW5nIGh0bWwuCiAgICAgICAgdmFyIGdyaWQgPSAnJzsKICAgICAgICB2YXIgbGFiZWxfeCA9IFtdOwogICAgICAgIHZhciBsYWJlbF95ID0gJyc7CiAgICAgICAgdmFyIGJhcnMgPSAnJywgYmFyX292ZXJsYXlzID0gJyc7CiAgICAgICAgdmFyIG1hcmtlcnMgPSAnJzsKCiAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAvLyBEcmF3IHZlcnRpY2FsIGF4aXMgZ3JpZAoKICAgICAgICAvLyBDYWxjdWxhdGUgbWFqb3IgYW5kIG1pbm9yIHZlcnRpY2FsIGdyYXBoIHRpY3MuCiAgICAgICAgdmFyIGluY19zID0gMSwgaW5jX2wgPSA1OwogICAgICAgIHZhciBtYXhfcmV2aWV3cyA9IGdyYXBoLm1heF9yZXZpZXdzOwogICAgICAgIGlmIChzZXR0aW5ncy5tYXhfYmFyX2hlaWdodCA+IDApIHsKICAgICAgICAgICAgaWYgKHNldHRpbmdzLmZpeGVkX2Jhcl9oZWlnaHQgfHwgKG1heF9yZXZpZXdzID4gc2V0dGluZ3MubWF4X2Jhcl9oZWlnaHQpKSBtYXhfcmV2aWV3cyA9IHNldHRpbmdzLm1heF9iYXJfaGVpZ2h0OwogICAgICAgIH0KICAgICAgICB3aGlsZSAoTWF0aC5jZWlsKG1heF9yZXZpZXdzIC8gaW5jX3MpID4gNSkgewogICAgICAgICAgICBzd2l0Y2ggKGluY19zLnRvU3RyaW5nKClbMF0pIHsKICAgICAgICAgICAgICAgIGNhc2UgJzEnOiBpbmNfcyAqPSAyOyBpbmNfbCAqPSAyOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzInOiBpbmNfcyA9IE1hdGgucm91bmQoMi41ICogaW5jX3MpOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzUnOiBpbmNfcyAqPSAyOyBpbmNfbCAqPSA1OyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRHJhdyB2ZXJ0aWNhbCBncmFwaCB0aWNzICgjIG9mIFJldmlld3MpLgogICAgICAgIHZhciB0aWNfY2xhc3MsIHk7CiAgICAgICAgZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzID0gTWF0aC5tYXgoMywgTWF0aC5jZWlsKG1heF9yZXZpZXdzIC8gaW5jX3MpICogaW5jX3MpOwogICAgICAgIGZvciAodmFyIHRpYyA9IDA7IHRpYyA8PSBncmFwaC55X2F4aXMubWF4X3Jldmlld3M7IHRpYyArPSBpbmNfcykgewogICAgICAgICAgICB0aWNfY2xhc3MgPSAoKHRpYyAlIGluY19sKSA9PT0gMCA/ICdtYWpvcicgOiAnbWlub3InKTsKICAgICAgICAgICAgeSA9IChncmFwaC5tYXJnaW4udG9wICsgZ3JhcGhfaGVpZ2h0KSAtIE1hdGgucm91bmQoZ3JhcGhfaGVpZ2h0ICogKHRpYyAvIGdyYXBoLnlfYXhpcy5tYXhfcmV2aWV3cykpOwogICAgICAgICAgICBpZiAodGljID4gMCkgewogICAgICAgICAgICAgICAgZ3JpZCArPSAnPHBhdGggY2xhc3M9IicrdGljX2NsYXNzKyciIGQ9Ik0nK2dyYXBoLm1hcmdpbi5sZWZ0KycsJyt5KydoJytncmFwaC54X2F4aXMud2lkdGgrJyIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhYmVsX3kgKz0gJzx0ZXh0IGNsYXNzPSInK3RpY19jbGFzcysnIiB4PSInKyhncmFwaC5tYXJnaW4ubGVmdC00KSsnIiB5PSInK3krJyIgZHk9IjAuNGVtIj4nK3RpYysnPC90ZXh0Pic7CiAgICAgICAgfQoKICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIC8vIERyYXcgaG9yaXpvbnRhbCBheGlzIGdyaWQKCiAgICAgICAgZ3JhcGgudGljX3NwYWNpbmcgPSAoZ3JhcGgueF9heGlzLndpZHRoKSAvIChncmFwaC54X2F4aXMubWF4X2hvdXJzKTsgLy8gV2lkdGggb2YgYSB0aW1lIHNsb3QuCiAgICAgICAgdmFyIHByZXZfbGFiZWwgPSAtOWUxMDsKICAgICAgICBmb3IgKHZhciB0aWNfaWR4ID0gMDsgdGljX2lkeCA8IGdyYXBoLnhfYXhpcy5tYXhfaG91cnM7IHRpY19pZHgrKykgewogICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKGdyYXBoLnN0YXJ0X3RpbWUuZ2V0VGltZSgpICsgdGljX2lkeCAqIDM2MDAwMDApOwoKICAgICAgICAgICAgdmFyIHJlZF9sYWJlbCA9IHJlZF9mdW5jKHRpbWUsIHJlZF9xdHksIHJlZF91c2Vfc2hvcnQsIHRpY19pZHgpOwogICAgICAgICAgICB2YXIgbWFqX2xhYmVsID0gbWFqX2Z1bmModGltZSwgbWFqX3F0eSwgbWFqX3VzZV9zaG9ydCwgdGljX2lkeCk7CiAgICAgICAgICAgIHZhciBtaW5fbGFiZWwgPSBtaW5fZnVuYyh0aW1lLCBtaW5fcXR5LCBtaW5fdXNlX3Nob3J0LCB0aWNfaWR4KTsKCiAgICAgICAgICAgIHZhciB4ID0gZ3JhcGgubWFyZ2luLmxlZnQgKyBNYXRoLnJvdW5kKCh0aWNfaWR4IC0gdGltZV9zaGlmdC82MCkgKiBncmFwaC50aWNfc3BhY2luZyk7CiAgICAgICAgICAgIHZhciBsYWJlbDsKICAgICAgICAgICAgaWYgKHJlZF9sYWJlbCkgewogICAgICAgICAgICAgICAgaWYgKHRpY19pZHggPiAwKSBncmlkICs9ICc8cGF0aCBjbGFzcz0icmVkdGljIiBkPSJNJyt4KycsMHYnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodC0xKSsnIiAvPic7CiAgICAgICAgICAgICAgICBpZiAoIW1hal91c2Vfc2hvcnQgJiYgdGljX2lkeCAtIHByZXZfbGFiZWwgPCBncmFwaC5taW5faG91cnNfcGVyX2xhYmVsKjAuNTgpIGxhYmVsX3gucG9wKCk7CiAgICAgICAgICAgICAgICBsYWJlbF94LnB1c2goJzx0ZXh0IGNsYXNzPSJyZWR0aWMiIHg9IicrKHgrNCkrJyIgeT0iJysoZ3JhcGgubWFyZ2luLnRvcC04KSsnIj4nK3JlZF9sYWJlbCsnPC90ZXh0PicpOwogICAgICAgICAgICAgICAgcHJldl9sYWJlbCA9IHRpY19pZHg7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWFqX2xhYmVsKSB7CiAgICAgICAgICAgICAgICBpZiAodGljX2lkeCA+IDApIGdyaWQgKz0gJzxwYXRoIGNsYXNzPSJtYWpvciIgZD0iTScreCsnLDB2JysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQtMSkrJyIgLz4nOwogICAgICAgICAgICAgICAgaWYgKG1hal91c2Vfc2hvcnQgfHwgdGljX2lkeCAtIHByZXZfbGFiZWwgPiBncmFwaC5taW5faG91cnNfcGVyX2xhYmVsKjAuNTgpIHsKICAgICAgICAgICAgICAgICAgICBsYWJlbF94LnB1c2goJzx0ZXh0IGNsYXNzPSJtYWpvciIgeD0iJysoeCs0KSsnIiB5PSInKyhncmFwaC5tYXJnaW4udG9wLTgpKyciPicrbWFqX2xhYmVsKyc8L3RleHQ+Jyk7CiAgICAgICAgICAgICAgICAgICAgcHJldl9sYWJlbCA9IHRpY19pZHg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWluX2xhYmVsKSB7CiAgICAgICAgICAgICAgICBpZiAodGljX2lkeCA+IDApIGdyaWQgKz0gJzxwYXRoIGNsYXNzPSJtaW5vciIgZD0iTScreCsnLCcrKGdyYXBoLm1hcmdpbi50b3AtNikrJ3YnKyhncmFwaF9oZWlnaHQrNikrJyIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIC8vIERyYXcgYmFycwoKICAgICAgICB2YXIgbWluX2Jhcl9oZWlnaHQgPSBNYXRoLmNlaWwoZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzIC8gZ3JhcGgueV9heGlzLmhlaWdodCk7CiAgICAgICAgZm9yICh2YXIgYnVuZGxlX2lkeCBpbiBncmFwaC5idW5kbGVzKSB7CiAgICAgICAgICAgIHZhciBidW5kbGUgPSBncmFwaC5idW5kbGVzW2J1bmRsZV9pZHhdOwogICAgICAgICAgICB2YXIgYmFyX3BhcnRzID0gW107CiAgICAgICAgICAgIHZhciBzdGF0cyA9IGJ1bmRsZS5zdGF0czsKCiAgICAgICAgICAgIHZhciB4MSA9IE1hdGgucm91bmQoYnVuZGxlLnN0YXJ0X3RpbWUgKiBncmFwaC50aWNfc3BhY2luZyk7CiAgICAgICAgICAgIHZhciB4MiA9IE1hdGgucm91bmQoYnVuZGxlLmVuZF90aW1lICogZ3JhcGgudGljX3NwYWNpbmcpOwogICAgICAgICAgICBpZiAoc2V0dGluZ3MubWF4X2Jhcl93aWR0aCA+IDApIHgyID0gTWF0aC5taW4oeDEgKyBzZXR0aW5ncy5tYXhfYmFyX3dpZHRoLCB4Mik7CgogICAgICAgICAgICBzd2l0Y2ggKHNldHRpbmdzLmJhcl9zdHlsZSkgewogICAgICAgICAgICAgICAgY2FzZSAnY291bnQnOgogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5jb3VudCkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidjb3VudCcsIGhlaWdodDpzdGF0cy5jb3VudH0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ2l0ZW1fdHlwZSc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLnJhZCkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidyYWQnLCBoZWlnaHQ6c3RhdHMucmFkfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLmthbikgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidrYW4nLCBoZWlnaHQ6c3RhdHMua2FufSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLnZvYykgYmFyX3BhcnRzLnB1c2goe2NsYXNzOid2b2MnLCBoZWlnaHQ6c3RhdHMudm9jfSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnc3JzX3N0YWdlJzoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuYXBwcikgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidhcHByJywgaGVpZ2h0OnN0YXRzLmFwcHJ9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuZ3VydSkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidndXJ1JywgaGVpZ2h0OnN0YXRzLmd1cnV9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMubWFzdCkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidtYXN0JywgaGVpZ2h0OnN0YXRzLm1hc3R9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuZW5saSkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidlbmxpJywgaGVpZ2h0OnN0YXRzLmVubGl9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMuYnVybikgYmFyX3BhcnRzLnB1c2goe2NsYXNzOididXJuJywgaGVpZ2h0OnN0YXRzLmJ1cm59KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdsZXZlbCc6CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgZ3JwX2lkeCA9IDA7IGdycF9pZHggPD0gNTsgZ3JwX2lkeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBncnBfbmFtZSA9ICdsdmxncnAnK2dycF9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0c1tncnBfbmFtZV0pIGJhcl9wYXJ0cy5wdXNoKHtjbGFzczonbHZsZ3JwJytncnBfaWR4LCBoZWlnaHQ6c3RhdHNbZ3JwX25hbWVdfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBiYXJfb2Zmc2V0ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgcGFydF9pZHggaW4gYmFyX3BhcnRzKSB7CiAgICAgICAgICAgICAgICB2YXIgcGFydCA9IGJhcl9wYXJ0c1twYXJ0X2lkeF07CiAgICAgICAgICAgICAgICBpZiAoKHBhcnRfaWR4ID09IGJhcl9wYXJ0cy5sZW5ndGgtMSkgJiYgKGJhcl9vZmZzZXQgKyBwYXJ0LmhlaWdodCA8IG1pbl9iYXJfaGVpZ2h0KSkgewogICAgICAgICAgICAgICAgICAgIHBhcnQuaGVpZ2h0ID0gbWluX2Jhcl9oZWlnaHQgLSBiYXJfb2Zmc2V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYmFycyArPSAnPHJlY3QgY2xhc3M9ImJhciAnK3BhcnQuY2xhc3MrJyIgeD0iJysoeDErMSkrJyIgeT0iJytiYXJfb2Zmc2V0KyciIHdpZHRoPSInKyh4Mi14MS0zKSsnIiBoZWlnaHQ9IicrcGFydC5oZWlnaHQrJyIgLz4nOwogICAgICAgICAgICAgICAgYmFyX29mZnNldCArPSBwYXJ0LmhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmFyX3BhcnRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGJhcl9vdmVybGF5cyArPSAnPHJlY3QgY2xhc3M9ImJhciBvdmVybGF5IiB4PSInK3gxKyciIHk9IjAiIHdpZHRoPSInKyh4Mi14MSkrJyIgaGVpZ2h0PSInK2dyYXBoLnlfYXhpcy5tYXhfcmV2aWV3cysnIiBkYXRhLWJ1bmRsZT0iJytidW5kbGVfaWR4KyciIC8+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIG1hcmtlcl94OwogICAgICAgICAgICBtYXJrZXJfeCA9IGdyYXBoLm1hcmdpbi5sZWZ0ICsgTWF0aC5mbG9vcigoeDEreDIpLzIpOwogICAgICAgICAgICBpZiAoYnVuZGxlLnN0YXRzLmhhc19jdXJyX21hcmtlciAmJiBzZXR0aW5ncy5jdXJyZW50X2xldmVsX21hcmtlcnMgIT09ICdub25lJykgewogICAgICAgICAgICAgICAgbWFya2VycyArPSAnPHBhdGggY2xhc3M9ImN1ciIgZD0iTScrbWFya2VyX3grJywnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodCsxKSsnbC0zLDZoNnoiIC8+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID4gMCAmJiBzZXR0aW5ncy5idXJuX21hcmtlcnMgPT09ICdzaG93JykgewogICAgICAgICAgICAgICAgbWFya2VycyArPSAnPHBhdGggY2xhc3M9ImJ1ciIgZD0iTScrbWFya2VyX3grJywnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodCs4KSsnbC0zLDZoNnoiIC8+JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAvLyBBc3NlbWJsZSB0aGUgSFRNTAoKICAgICAgICBwYW5lbC5odG1sKAogICAgICAgICAgICAnPHN2ZyBjbGFzcz0iZ3JhcGggbm9zZWxlY3QiIHdpZHRoPSInK3BhbmVsX3dpZHRoKyciIGhlaWdodD0iJytwYW5lbF9oZWlnaHQrJyI+JysKICAgICAgICAgICAgJyAgPHJlY3QgY2xhc3M9ImJrZ2QiIHg9IicrZ3JhcGgubWFyZ2luLmxlZnQrJyIgeT0iJytncmFwaC5tYXJnaW4udG9wKyciIHdpZHRoPSInK2dyYXBoLnhfYXhpcy53aWR0aCsnIiBoZWlnaHQ9IicrZ3JhcGhfaGVpZ2h0KyciIC8+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9ImdyaWQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAuNSwwLjUpIj4nKwogICAgICAgICAgICBncmlkKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJzaGFkb3ciIGQ9Ik0nKyhncmFwaC5tYXJnaW4ubGVmdC0yKSsnLDB2JysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQpKycsaCcrKGdyYXBoLm1hcmdpbi5sZWZ0K2dyYXBoLnhfYXhpcy53aWR0aCsxKSsnIiAvPicrCiAgICAgICAgICAgICcgICAgPHBhdGggY2xhc3M9ImxpZ2h0IiBkPSJNJysoZ3JhcGgubWFyZ2luLmxlZnQtMSkrJywwdicrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0LTEpKyciIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibGlnaHQiIGQ9Ik0nKyhncmFwaC5tYXJnaW4ubGVmdC0yKSsnLCcrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0KzEpKydoJysoZ3JhcGgubWFyZ2luLmxlZnQrZ3JhcGgueF9heGlzLndpZHRoKzEpKyciIC8+JysKICAgICAgICAgICAgJyAgPC9nPicrCiAgICAgICAgICAgICcgIDxnIGNsYXNzPSJsYWJlbC14Ij4nKwogICAgICAgICAgICBsYWJlbF94LmpvaW4oJycpKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9ImxhYmVsLXkiPicrCiAgICAgICAgICAgIGxhYmVsX3krCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0ibWFya2VycyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC41LDAuNSkiPicrCiAgICAgICAgICAgIG1hcmtlcnMrCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0iYmFycyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoJytncmFwaC5tYXJnaW4ubGVmdCsnLCcrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0KSsnKSBzY2FsZSgxLCcrKC0xICogZ3JhcGhfaGVpZ2h0IC8gZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzKSsnKSI+JysKICAgICAgICAgICAgYmFycysKICAgICAgICAgICAgYmFyX292ZXJsYXlzKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9InJlc2l6ZV9ncmlwIj4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJzaGFkb3ciIGQ9Ik0nKyhwYW5lbF93aWR0aC0yKSsnLCcrcGFuZWxfaGVpZ2h0KydsMiwtMm0wLC00bC02LDZtLTQsMGwxMCwtMTAiIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibGlnaHQiIGQ9Ik0nKyhwYW5lbF93aWR0aC0zKSsnLCcrcGFuZWxfaGVpZ2h0KydsMywtM20wLC00bC03LDdtLTQsMGwxMSwtMTEiIC8+JysKICAgICAgICAgICAgJyAgICA8cmVjdCBjbGFzcz0iYm91bmRhcnkiIHg9IjAiIHk9IicrKHBhbmVsX2hlaWdodC0xMykrJyIgd2lkdGg9IicrcGFuZWxfd2lkdGgrJyIgaGVpZ2h0PSIxMyIgLz4nKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9ImhpZ2hsaWdodCI+JysKICAgICAgICAgICAgJyAgICA8cmVjdCBjbGFzcz0ibWFya2VyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTAwLDAuNSkiIHg9IicrZ3JhcGgubWFyZ2luLmxlZnQrJyIgeT0iJytncmFwaC5tYXJnaW4udG9wKyciIHdpZHRoPSIwIiBoZWlnaHQ9IicrZ3JhcGhfaGVpZ2h0KyciIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibWFya2VyIHN0YXJ0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTAwLDApIiBkPSJNJytncmFwaC5tYXJnaW4ubGVmdCsnLCcrKGdyYXBoLm1hcmdpbi50b3AtMSkrJ2wtMywtNWg2bC0zLDV2JysoZ3JhcGhfaGVpZ2h0KzEpKyciIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibWFya2VyIGVuZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTEwMCwwKSIgZD0iTScrZ3JhcGgubWFyZ2luLmxlZnQrJywnKyhncmFwaC5tYXJnaW4udG9wLTEpKydsLTMsLTVoNmwtMyw1dicrKGdyYXBoX2hlaWdodCsxKSsnIiAvPicrCiAgICAgICAgICAgICcgICAgPHJlY3QgY2xhc3M9ImJvdW5kYXJ5IiB4PSInKyhncmFwaC5tYXJnaW4ubGVmdC0yKSsnIiB5PSIwIiB3aWR0aD0iJysoZ3JhcGgueF9heGlzLndpZHRoKzIpKyciIGhlaWdodD0iJytncmFwaC5tYXJnaW4udG9wKyciIC8+JysKICAgICAgICAgICAgJyAgPC9nPicrCiAgICAgICAgICAgICc8L3N2Zz4nCiAgICAgICAgKTsKICAgICAgICBwYW5lbC5oZWlnaHQocGFuZWxfaGVpZ2h0KTsKCiAgICAgICAgLy8gQXR0YWNoIGV2ZW50IGhhbmRsZXJzCiAgICAgICAgcGFuZWwuZmluZCgnLnJlc2l6ZV9ncmlwIC5ib3VuZGFyeScpLm9uKCdtb3VzZWRvd24gdG91Y2hzdGFydCcsIHJlc2l6ZV9wYW5lbCk7CiAgICAgICAgcGFuZWwuZmluZCgnLmhpZ2hsaWdodCAuYm91bmRhcnknKS5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlIG1vdXNlbW92ZSBtb3VzZWRvd24gdG91Y2hzdGFydCcsIGhpZ2hsaWdodF9ob3Zlcik7CiAgICAgICAgcGFuZWwuZmluZCgnLmJhci5vdmVybGF5Jykub24oJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGJhcl9ob3Zlcik7CiAgICAgICAgcGFuZWwuZmluZCgnLmJhci5vdmVybGF5Jykub24oJ2NsaWNrJywgYmFyX2NsaWNrKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgY2xpY2tpbmcgdGltZWxpbmUgYmFycy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gYmFyX2NsaWNrKGUpIHsKICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd19yZXZpZXdfZGV0YWlscyA9PT0gJ25vbmUnKSByZXR1cm47CiAgICAgICAgaWYgKGhpZ2hsaWdodC5oaWdobGlnaHRlZCkgaGlkZV9oaWdobGlnaHQoKTsKICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IE51bWJlcihlLnRhcmdldC5hdHRyaWJ1dGVzWydkYXRhLWJ1bmRsZSddLnZhbHVlKTsKICAgICAgICBoaWdobGlnaHQuc3RhcnQgPSBidW5kbGVfaWR4OwogICAgICAgIGhpZ2hsaWdodC5lbmQgPSBidW5kbGVfaWR4ICsgMTsKICAgICAgICBoaWdobGlnaHQuaGlnaGxpZ2h0ZWQgPSB0cnVlOwogICAgICAgIGdyYXBoLmVsZW0ub2ZmKCcuYmFyX2hvdmVyX21vdmUnKTsKICAgICAgICBzaG93X3Jldmlld19pbmZvKHRydWUgLyogc3RpY2t5ICovLCBlKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgaG92ZXJpbmcgb3ZlciB0aW1lbGluZSBiYXJzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBiYXJfaG92ZXIoZSkgewogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnbm9uZScpIHJldHVybjsKICAgICAgICBpZiAoaGlnaGxpZ2h0LmhpZ2hsaWdodGVkKSByZXR1cm47CiAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAnbW91c2VlbnRlcic6CiAgICAgICAgICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IE51bWJlcihlLnRhcmdldC5hdHRyaWJ1dGVzWydkYXRhLWJ1bmRsZSddLnZhbHVlKTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodC5zdGFydCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgICAgICAgICBoaWdobGlnaHQuZW5kID0gYnVuZGxlX2lkeCArIDE7CiAgICAgICAgICAgICAgICBzaG93X3Jldmlld19pbmZvKGZhbHNlIC8qIHN0aWNreSAqLywgZSk7CiAgICAgICAgICAgICAgICBncmFwaC5lbGVtLm9uKCdtb3VzZW1vdmUuYmFyX2hvdmVyX21vdmUnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICBncmFwaC5yZXZpZXdfaW5mby5jc3MoJ3RvcCcsIGUuY2xpZW50WSAtIGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIDMwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdtb3VzZWxlYXZlJzoKICAgICAgICAgICAgICAgIGdyYXBoLmVsZW0ub2ZmKCcuYmFyX2hvdmVyX21vdmUnKTsKICAgICAgICAgICAgICAgIGhpZGVfcmV2aWV3X2luZm8oKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQnVpbGQgYW5kIGRpc3BsYXkgdGhlIFJldmlldyBJbmZvIHBvcC11cC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gc2hvd19yZXZpZXdfaW5mbyhzdGlja3ksIGUpIHsKICAgICAgICB2YXIgaW5mbyA9ICQoJyN0aW1lbGluZSAucmV2aWV3X2luZm8nKTsKICAgICAgICBpZiAoc3RpY2t5KSB7CiAgICAgICAgICAgICQoJ2JvZHknKS5vZmYoJy50aW1lbGluZV9oaWRlaW5mbycpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrLnRpbWVsaW5lX2hpZGVpbmZvJywgZnVuY3Rpb24oZSl7CiAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLm9mZignLnRpbWVsaW5lX2hpZGVpbmZvJyk7CiAgICAgICAgICAgICAgICAgICAgaGlkZV9oaWdobGlnaHQoKTsKICAgICAgICAgICAgICAgICAgICBoaWRlX3Jldmlld19pbmZvKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwgMTApOwogICAgICAgIH0KCiAgICAgICAgdmFyIHN0YXJ0ID0gTWF0aC5taW4oaGlnaGxpZ2h0LnN0YXJ0LCBoaWdobGlnaHQuZW5kKTsKICAgICAgICB2YXIgZW5kID0gTWF0aC5tYXgoaGlnaGxpZ2h0LnN0YXJ0LCBoaWdobGlnaHQuZW5kKTsKCiAgICAgICAgdmFyIGJ1bmRsZSA9IHtpdGVtczpbXX07CiAgICAgICAgZm9yICh2YXIgYnVuZGxlX2lkeCA9IHN0YXJ0OyBidW5kbGVfaWR4IDwgZW5kOyBidW5kbGVfaWR4KyspIHsKICAgICAgICAgICAgYnVuZGxlLml0ZW1zID0gYnVuZGxlLml0ZW1zLmNvbmNhdChncmFwaC5idW5kbGVzW2J1bmRsZV9pZHhdLml0ZW1zKTsKICAgICAgICB9CgogICAgICAgIGNhbGNfYnVuZGxlX3N0YXRzKGJ1bmRsZSk7CgogICAgICAgIC8vIFByaW50IHRoZSBkYXRlIG9yIGRhdGUgcmFuZ2UuCiAgICAgICAgdmFyIGFsbG93X25vdyA9ICgoc3RhcnQgPT09IDApICYmIChncmFwaC5idW5kbGVfc2l6ZSA9PT0gMSkpOwogICAgICAgIHZhciBodG1sID0gJzxkaXY+JzsKICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsKICAgICAgICB2YXIgc3RhcnRfZGF0ZSA9IG5ldyBEYXRlKGdyYXBoLnN0YXJ0X3RpbWUuZ2V0VGltZSgpICsgYnVuZGxlX3RvX3RpYyhzdGFydCkgKiAzNjAwMDAwKTsKICAgICAgICB2YXIgZW5kX2RhdGUgPSBuZXcgRGF0ZShncmFwaC5zdGFydF90aW1lLmdldFRpbWUoKSArIGJ1bmRsZV90b190aWMoZW5kKSAqIDM2MDAwMDAgKyAodGltZV9zaGlmdCAtIDEpICogNjAwMDApOwogICAgICAgIHZhciBzYW1lX2RheSA9IChuZXcgRGF0ZShzdGFydF9kYXRlKS5zZXRIb3VycygwLDAsMCwwKSA9PSBuZXcgRGF0ZShlbmRfZGF0ZSkuc2V0SG91cnMoMCwwLDAsMCkpOwogICAgICAgIHZhciBzaG93X21vbnRoID0gKChub3cuZ2V0TW9udGgoKSAhPSBzdGFydF9kYXRlLmdldE1vbnRoKCkpIHx8ICgobmV3IERhdGUoZW5kX2RhdGUpLnNldEhvdXJzKDAsMCwwLDApIC0gbmV3IERhdGUobm93KS5zZXRIb3VycygwLDAsMCwwKSkgPiAoNi41ICogODY0MDAwMDApKSk7CiAgICAgICAgaWYgKCgoZW5kLXN0YXJ0KSA+IDEpIHx8IChncmFwaC5idW5kbGVfc2l6ZSA+IDEpKSB7CiAgICAgICAgICAgIGh0bWwgKz0gZm9ybWF0X2RhdGUoc3RhcnRfZGF0ZSwgYWxsb3dfbm93LCB0cnVlIC8qIHNob3dfZGF5ICovLCBzaG93X21vbnRoKSArICcgdG8gJyArIGZvcm1hdF9kYXRlKGVuZF9kYXRlLCBmYWxzZSwgIXNhbWVfZGF5IC8qIHNob3dfZGF5ICovLCBzaG93X21vbnRoICYmICFzYW1lX2RheSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaHRtbCArPSBmb3JtYXRfZGF0ZShzdGFydF9kYXRlLCBhbGxvd19ub3csIHRydWUgLyogc2hvd19kYXkgKi8sIHNob3dfbW9udGgpOwogICAgICAgIH0KICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwoKICAgICAgICAvLyBQb3B1bGF0ZSBpdGVtIHR5cGUgc3VtbWFyaWVzLgogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InN1bW1hcnkiPic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0idG90Ij4nKyhidW5kbGUuc3RhdHMuY291bnQpKycgcmV2aWV3czwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaW5kZW50Ij4nOwoKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJpdGVtX3R5cGUgcmFkIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5yYWQgfHwgMCkrJzwvc3Bhbj4gcmFkaWNhbHM8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Iml0ZW1fdHlwZSBrYW4iPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmthbiB8fCAwKSsnPC9zcGFuPiBrYW5qaTwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaXRlbV90eXBlIHZvYyI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMudm9jIHx8IDApKyc8L3NwYW4+IHZvY2FidWxhcnk8L2Rpdj4nOwoKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJzcnNfc3RhZ2UgYXBwciI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMuYXBwciB8fCAwKSsnPC9zcGFuPiBhcHByZW50aWNlPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJzcnNfc3RhZ2UgZ3VydSI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMuZ3VydSB8fCAwKSsnPC9zcGFuPiBndXJ1PC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJzcnNfc3RhZ2UgbWFzdCI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubWFzdCB8fCAwKSsnPC9zcGFuPiBtYXN0ZXI8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InNyc19zdGFnZSBlbmxpIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5lbmxpIHx8IDApKyc8L3NwYW4+IGVubGlnaHRlbmVkPC9kaXY+JzsKICAgICAgICBpZiAoc2V0dGluZ3Muc3JzX2N1cnJfbmV4dCA9PT0gJ25leHQnKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InNyc19zdGFnZSBidXJuIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5idXJuIHx8IDApKyc8L3NwYW4+IGJ1cm48L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ibGV2ZWwgbHZsZ3JwMCI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubHZsZ3JwMCB8fCAwKSsnPC9zcGFuPiBsZXZlbHMgMS0xMDwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ibGV2ZWwgbHZsZ3JwMSI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubHZsZ3JwMSB8fCAwKSsnPC9zcGFuPiBsZXZlbHMgMTEtMjA8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImxldmVsIGx2bGdycDIiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmx2bGdycDIgfHwgMCkrJzwvc3Bhbj4gbGV2ZWxzIDIxLTMwPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnAzIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnAzIHx8IDApKyc8L3NwYW4+IGxldmVscyAzMS00MDwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ibGV2ZWwgbHZsZ3JwNCI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubHZsZ3JwNCB8fCAwKSsnPC9zcGFuPiBsZXZlbHMgNDEtNTA8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImxldmVsIGx2bGdycDUiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmx2bGdycDUgfHwgMCkrJzwvc3Bhbj4gbGV2ZWxzIDUxLTYwPC9kaXY+JzsKCiAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKCiAgICAgICAgaWYgKChidW5kbGUuc3RhdHMuY3Vycl9jb3VudCA+IDApIHx8IChidW5kbGUuc3RhdHMuYnVybl9jb3VudCA+IDApKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImluZGVudCI+JzsKICAgICAgICAgICAgaWYgKGJ1bmRsZS5zdGF0cy5jdXJyX2NvdW50ID4gMCkgaHRtbCArPSAnPGRpdiBjbGFzcz0iY3VyIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrYnVuZGxlLnN0YXRzLmN1cnJfY291bnQrJzwvc3Bhbj4gQ3VycmVudCBMZXZlbDwvZGl2Pic7CiAgICAgICAgICAgIGlmIChidW5kbGUuc3RhdHMuYnVybl9jb3VudCA+IDApIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImJ1ciI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nK2J1bmRsZS5zdGF0cy5idXJuX2NvdW50Kyc8L3NwYW4+IEJ1cm4gSXRlbScrKGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID4gMSA/ICdzJyA6ICcnKSsnPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CgogICAgICAgIGlmIChzZXR0aW5ncy5yZXZpZXdfZGV0YWlsc19idXR0b25zKSB7CiAgICAgICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImRldGFpbF9idXR0b25zIj4nOwogICAgICAgICAgICBodG1sICs9ICc8YnV0dG9uIGNsYXNzPSJjb3VudCI+UmV2aWV3IENvdW50PC9idXR0b24+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGJ1dHRvbiBjbGFzcz0iaXRlbV90eXBlIj5JdGVtIFR5cGU8L2J1dHRvbj4nOwogICAgICAgICAgICBodG1sICs9ICc8YnV0dG9uIGNsYXNzPSJzcnNfc3RhZ2UiPlNSUyBMZXZlbDwvYnV0dG9uPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxidXR0b24gY2xhc3M9ImxldmVsIj5MZXZlbDwvYnV0dG9uPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd19yZXZpZXdfZGV0YWlscyA9PT0gJ2l0ZW1fbGlzdCcgfHwgc2V0dGluZ3Muc2hvd19yZXZpZXdfZGV0YWlscyA9PT0gJ2Z1bGwnKSB7CiAgICAgICAgICAgIGh0bWwgPSBwb3B1bGF0ZV9pdGVtX2xpc3QoYnVuZGxlLCBodG1sKTsKICAgICAgICB9CgogICAgICAgIGluZm8uZmluZCgnLmlubmVyJykuaHRtbChodG1sKTsKICAgICAgICBncmFwaC5yZXZpZXdfaW5mbyA9IGluZm87CgogICAgICAgIHZhciBudW1fd2lkdGggPSBidW5kbGUuc3RhdHMuY291bnQudG9TdHJpbmcoKTsKICAgICAgICBpbmZvLmZpbmQoJy5zdW1tYXJ5IC5maXhlZCcpLmNzcygnd2lkdGgnLCAobnVtX3dpZHRoLnRvU3RyaW5nKCkubGVuZ3RoICogOSArIDgpICsgJ3B4Jyk7CgogICAgICAgIHZhciB0b3AsIGxlZnQsIHJpZ2h0LCB3aWR0aDsKICAgICAgICB2YXIgaGFsZl93aWR0aCA9IGdyYXBoLnhfYXhpcy53aWR0aC8yOwogICAgICAgIHZhciB4ID0gYnVuZGxlX3RvX3goc3RhcnQpOwogICAgICAgIGluZm8uY3NzKCdtYXgtd2lkdGgnLCBoYWxmX3dpZHRoKTsKICAgICAgICBpZiAoaGlnaGxpZ2h0LmRyYWdnaW5nKSB7CiAgICAgICAgICAgIHRvcCA9IGdyYXBoLm1hcmdpbi50b3AgKyBncmFwaC55X2F4aXMuaGVpZ2h0ICsgZ3JhcGgubWFyZ2luLmJvdHRvbTsKICAgICAgICAgICAgaWYgKHggPCBoYWxmX3dpZHRoKSB7CiAgICAgICAgICAgICAgICBsZWZ0ID0gZ3JhcGgubWFyZ2luLmxlZnQgKyB4OwogICAgICAgICAgICAgICAgaW5mby5jc3Moe2xlZnQ6bGVmdCwgcmlnaHQ6J2F1dG8nLCB0b3A6dG9wfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByaWdodCA9IDA7CiAgICAgICAgICAgICAgICBpbmZvLmNzcyh7bGVmdDonYXV0bycsIHJpZ2h0OnJpZ2h0LCB0b3A6dG9wfSk7CiAgICAgICAgICAgICAgICBpZiAoeCA8IGdyYXBoLnhfYXhpcy53aWR0aCAtIGluZm8ub3V0ZXJXaWR0aCgpKSB7CiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGdyYXBoLm1hcmdpbi5sZWZ0ICsgeDsKICAgICAgICAgICAgICAgICAgICBpbmZvLmNzcyh7bGVmdDpsZWZ0LCByaWdodDonYXV0bycsIHRvcDp0b3B9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoZSkgewogICAgICAgICAgICB0b3AgPSBlLmNsaWVudFkgLSBlLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSAzMDsKICAgICAgICAgICAgaWYgKHggPCBoYWxmX3dpZHRoKSB7CiAgICAgICAgICAgICAgICBsZWZ0ID0gZ3JhcGgubWFyZ2luLmxlZnQgKyBidW5kbGVfdG9feChzdGFydCsxKSArIDQ7CiAgICAgICAgICAgICAgICBpbmZvLmNzcyh7bGVmdDpsZWZ0LCByaWdodDonYXV0bycsIHRvcDp0b3B9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJpZ2h0ID0gZ3JhcGgueF9heGlzLndpZHRoIC0gYnVuZGxlX3RvX3goc3RhcnQpICsgNDsKICAgICAgICAgICAgICAgIGluZm8uY3NzKHtsZWZ0OidhdXRvJywgcmlnaHQ6cmlnaHQsIHRvcDp0b3B9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaW5mby5yZW1vdmVDbGFzcygnaGlkZGVuJyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBvcHVsYXRlIHRoZSBsaXN0IG9mIGl0ZW1zIHByZXNlbnQgaW4gYSB0aW1lIGJ1bmRsZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gcG9wdWxhdGVfaXRlbV9saXN0KGJ1bmRsZSwgaHRtbCkgewogICAgICAgIHZhciBzcnNfdG9fY2xhc3MgPSB7CiAgICAgICAgICAgIGN1cnI6IFsnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2FwcHInLCdndXJ1JywnZ3VydScsJ21hc3QnLCdlbmxpJ10sCiAgICAgICAgICAgIG5leHQ6IFsnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2d1cnUnLCdndXJ1JywnbWFzdCcsJ2VubGknLCdidXJuJ10KICAgICAgICB9OwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Iml0ZW1faW5mbyBoaWRkZW4iPjwvZGl2Pjx1bCBjbGFzcz0iaXRlbV9saXN0Ij4nOwogICAgICAgIGZvciAodmFyIGl0ZW1faWR4IGluIGJ1bmRsZS5pdGVtcykgewogICAgICAgICAgICB2YXIgaXRlbSA9IGJ1bmRsZS5pdGVtc1tpdGVtX2lkeF07CiAgICAgICAgICAgIHZhciBjbGFzc2VzID0gWwogICAgICAgICAgICAgICAgaXRlbS5vYmplY3Quc2xpY2UoMCwzKSwKICAgICAgICAgICAgICAgIHNyc190b19jbGFzc1tzZXR0aW5ncy5zcnNfY3Vycl9uZXh0XVtpdGVtLmFzc2lnbm1lbnRzLnNyc19zdGFnZV0sCiAgICAgICAgICAgICAgICAnbHZsZ3JwJytNYXRoLmZsb29yKChpdGVtLmRhdGEubGV2ZWwtMSkvMTApCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIHZhciBpdGVtX25hbWU7CiAgICAgICAgICAgIGlmIChpdGVtLm9iamVjdCA9PT0gJ3JhZGljYWwnKSB7CiAgICAgICAgICAgICAgICBpZiAoaXRlbS5kYXRhLmNoYXJhY3RlcnMpIHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8bGkgY2xhc3M9IicrY2xhc3Nlcy5qb2luKCcgJykrJyI+JytpdGVtLmRhdGEuY2hhcmFjdGVycysnPC9saT4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8bGkgY2xhc3M9IicrY2xhc3Nlcy5qb2luKCcgJykrJyIgZGF0YS1yYWRuYW1lPSInK2l0ZW0uZGF0YS5zbHVnKyciPi4uLjwvbGk+JzsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0b3IgPSAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuaXRlbV9saXN0ID4gbGlbZGF0YS1yYWRuYW1lPSInK2l0ZW0uZGF0YS5zbHVnKyciXSc7CiAgICAgICAgICAgICAgICAgICAgbG9hZF9yYWRpY2FsX3N2ZyhpdGVtKS50aGVuKHBvcHVsYXRlX3JhZGljYWxfc3ZnLmJpbmQobnVsbCwgc2VsZWN0b3IpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxsaSBjbGFzcz0iJytjbGFzc2VzLmpvaW4oJyAnKSsnIj4nK2l0ZW0uZGF0YS5zbHVnKyc8L2xpPic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaHRtbCArPSAnPC91bD4nOwogICAgICAgIHJldHVybiBodG1sOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBJbnNlcnQgYW4gc3ZnIGludG8gYSBzcGVjaWZpZWQgRE9NIGVsZW1lbnQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlX3JhZGljYWxfc3ZnKHNlbGVjdG9yLCBzdmcpIHsKICAgICAgICAkKHNlbGVjdG9yKS5odG1sKHN2Zyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV2ZW50IGhhbmRsZXIgZm9yIGJ1dHRvbnMgb24gdGhlIFJldmlldyBJbmZvIHBvcC11cC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZGV0YWlsX2J1dHRvbl9jbGlja2VkKGUpIHsKICAgICAgICB2YXIgbW9kZSA9IGUudGFyZ2V0LmNsYXNzTmFtZTsKICAgICAgICAkKCcjdGltZWxpbmUgLnJldmlld19pbmZvJykuYXR0cignZGF0YS1tb2RlJywgbW9kZSk7CiAgICAgICAgc2V0dGluZ3MucmV2aWV3X2RldGFpbHNfc3VtbWFyeSA9IG1vZGU7CiAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciBob3ZlcmluZyBvdmVyIGFuIGl0ZW0gaW4gdGhlIFJldmlldyBEZXRhaWwgcG9wLXVwLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBpdGVtX2hvdmVyKGUpIHsKICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd19yZXZpZXdfZGV0YWlscyAhPT0gJ2Z1bGwnKSByZXR1cm47CiAgICAgICAgdmFyIGluZm8gPSAkKCcjdGltZWxpbmUgLml0ZW1faW5mbycpOwogICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ21vdXNlZW50ZXInOgogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgICAgIHZhciBpdGVtID0gZ3JhcGguY3VycmVudF9idW5kbGUuaXRlbXNbdGFyZ2V0LmluZGV4KCldOwogICAgICAgICAgICAgICAgdmFyIHBvcyA9IHRhcmdldC5wb3NpdGlvbigpOwogICAgICAgICAgICAgICAgaW5mby5jc3Moe3RvcDpwb3MudG9wK3RhcmdldC5vdXRlckhlaWdodCgpKzN9KTsKICAgICAgICAgICAgICAgIHBvcHVsYXRlX2l0ZW1faW5mbyhpbmZvLCBpdGVtKTsKICAgICAgICAgICAgICAgIGluZm8ucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdtb3VzZWxlYXZlJzoKICAgICAgICAgICAgICAgIGluZm8uYWRkQ2xhc3MoJ2hpZGRlbicpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIYW5kbGVyIGZvciByZXNpemluZyB0aGUgdGltZWxpbmUgd2hlbiB0aGUgd2luZG93IHNpemUgY2hhbmdlcy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gd2luZG93X3Jlc2l6ZWQoKSB7CiAgICAgICAgdmFyIG5ld193aWR0aCA9IGdyYXBoLmVsZW0ud2lkdGgoKTsKICAgICAgICBpZiAobmV3X3dpZHRoICE9IGdyYXBoLnhfYXhpcy53aWR0aCArIGdyYXBoLm1hcmdpbi5sZWZ0KSB7CiAgICAgICAgICAgIGJ1bmRsZV9ieV90aW1lc2xvdCgpOwogICAgICAgICAgICBkcmF3X3RpbWVsaW5lKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHZW5lcmF0ZSB0aGUgSFRNTCBjb250ZW50IG9mIHRoZSBJdGVtIERldGFpbCBwb3AtdXAuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBzcnNfc3RhZ2VzID0gWydJbml0aWF0ZScsICdBcHByZW50aWNlIDEnLCAnQXBwcmVudGljZSAyJywgJ0FwcHJlbnRpY2UgMycsICdBcHByZW50aWNlIDQnLCAnR3VydSAxJywgJ0d1cnUgMicsICdNYXN0ZXInLCAnRW5saWdodGVuZWQnLCAnQnVybmVkJ10KICAgIGZ1bmN0aW9uIHBvcHVsYXRlX2l0ZW1faW5mbyhpbmZvLCBpdGVtKSB7CiAgICAgICAgdmFyIGh0bWw7CiAgICAgICAgc3dpdGNoIChpdGVtLm9iamVjdCkgewogICAgICAgICAgICBjYXNlICdyYWRpY2FsJzoKICAgICAgICAgICAgICAgIGlmIChpdGVtLmRhdGEuY2hhcmFjdGVycykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgPSAnPHNwYW4gY2xhc3M9Iml0ZW0iPlJhZGljYWw6IDxzcGFuIGNsYXNzPSJzbHVnIiBsYW5nPSJqYSI+JytpdGVtLmRhdGEuY2hhcmFjdGVycysnPC9zcGFuPjwvc3Bhbj48YnI+JzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9ICc8c3BhbiBjbGFzcz0iaXRlbSI+UmFkaWNhbDogPHNwYW4gY2xhc3M9InNsdWciIGRhdGEtcmFkbmFtZT0iJytpdGVtLmRhdGEuc2x1ZysnIj4uLi48L3NwYW4+PC9zcGFuPjxicj4nOwogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9ICcjdGltZWxpbmUgLml0ZW1faW5mbyBbZGF0YS1yYWRuYW1lPSInK2l0ZW0uZGF0YS5zbHVnKyciXSc7CiAgICAgICAgICAgICAgICAgICAgbG9hZF9yYWRpY2FsX3N2ZyhpdGVtKS50aGVuKHBvcHVsYXRlX3JhZGljYWxfc3ZnLmJpbmQobnVsbCwgc2VsZWN0b3IpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAna2FuamknOgogICAgICAgICAgICAgICAgaHRtbCA9ICc8c3BhbiBjbGFzcz0iaXRlbSI+S2Fuamk6IDxzcGFuIGNsYXNzPSJzbHVnIiBsYW5nPSJqYSI+JytpdGVtLmRhdGEuc2x1ZysnPC9zcGFuPjwvc3Bhbj48YnI+JzsKICAgICAgICAgICAgICAgIGh0bWwgKz0gZ2V0X2ltcG9ydGFudF9yZWFkaW5nKGl0ZW0pKyc8YnI+JzsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAndm9jYWJ1bGFyeSc6CiAgICAgICAgICAgICAgICBodG1sID0gJzxzcGFuIGNsYXNzPSJpdGVtIj5Wb2NhYjogPHNwYW4gY2xhc3M9InNsdWciIGxhbmc9ImphIj4nK2l0ZW0uZGF0YS5zbHVnKyc8L3NwYW4+PC9zcGFuPjxicj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSAnUmVhZGluZzogJytnZXRfcmVhZGluZyhpdGVtKSsnPGJyPic7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaHRtbCArPSAnTWVhbmluZzogJytnZXRfbWVhbmluZ3MoaXRlbSkrJzxicj4nOwogICAgICAgIGh0bWwgKz0gJ0xldmVsOiAnK2l0ZW0uZGF0YS5sZXZlbCsnPGJyPic7CiAgICAgICAgaHRtbCArPSAnU1JTIExldmVsOiAnK2l0ZW0uYXNzaWdubWVudHMuc3JzX3N0YWdlKycgKCcrc3JzX3N0YWdlc1tpdGVtLmFzc2lnbm1lbnRzLnNyc19zdGFnZV0rJyknOwogICAgICAgIGluZm8uaHRtbChodG1sKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTG9hZCBhIHJhZGljYWwncyBzdmcgZmlsZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbG9hZF9yYWRpY2FsX3N2ZyhpdGVtKSB7CiAgICAgICAgdmFyIHByb21pc2UgPSBncmFwaC5yYWRpY2FsX2NhY2hlW2l0ZW0uZGF0YS5zbHVnXTsKICAgICAgICBpZiAocHJvbWlzZSkgcmV0dXJuIHByb21pc2U7CiAgICAgICAgaWYgKGl0ZW0uZGF0YS5jaGFyYWN0ZXJfaW1hZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHByb21pc2U7CiAgICAgICAgdmFyIHVybCA9IGl0ZW0uZGF0YS5jaGFyYWN0ZXJfaW1hZ2VzLmZpbHRlcihmdW5jdGlvbihpbWcpewogICAgICAgICAgICByZXR1cm4gKGltZy5jb250ZW50X3R5cGUgPT09ICdpbWFnZS9zdmcreG1sJyAmJiAhaW1nLm1ldGFkYXRhLmlubGluZV9zdHlsZXMpOwogICAgICAgIH0pWzBdLnVybDsKICAgICAgICBwcm9taXNlID0gd2tvZi5sb2FkX2ZpbGUodXJsKTsKICAgICAgICBncmFwaC5yYWRpY2FsX2NhY2hlW2l0ZW0uZGF0YS5zbHVnXSA9IHByb21pc2U7CiAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV4dHJhY3QgdGhlIG1lYW5pbmdzIChpbmNsdWRpbmcgc3lub255bXMpIGZyb20gYW4gaXRlbS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZ2V0X21lYW5pbmdzKGl0ZW0pIHsKICAgICAgICB2YXIgbWVhbmluZ3MgPSBbXTsKICAgICAgICBpZiAoaXRlbS5zdHVkeV9tYXRlcmlhbHMgJiYgaXRlbS5zdHVkeV9tYXRlcmlhbHMubWVhbmluZ19zeW5vbnltcykgewogICAgICAgICAgICBtZWFuaW5ncyA9IGl0ZW0uc3R1ZHlfbWF0ZXJpYWxzLm1lYW5pbmdfc3lub255bXM7CiAgICAgICAgfQogICAgICAgIG1lYW5pbmdzID0gbWVhbmluZ3MuY29uY2F0KGl0ZW0uZGF0YS5tZWFuaW5ncy5tYXAobWVhbmluZyA9PiBtZWFuaW5nLm1lYW5pbmcpKTsKICAgICAgICByZXR1cm4gdG9fdGl0bGVfY2FzZShtZWFuaW5ncy5qb2luKCcsICcpKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXh0cmFjdCB0aGUgJ2ltcG9ydGFudCcgcmVhZGluZ3MgZnJvbSBhIGthbmppLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBnZXRfaW1wb3J0YW50X3JlYWRpbmcoaXRlbSkgewogICAgICAgIHZhciByZWFkaW5ncyA9IGl0ZW0uZGF0YS5yZWFkaW5ncy5maWx0ZXIocmVhZGluZyA9PiByZWFkaW5nLnByaW1hcnkpOwogICAgICAgIHJldHVybiB0b190aXRsZV9jYXNlKHJlYWRpbmdzWzBdLnR5cGUpKyc6ICcrcmVhZGluZ3MubWFwKHJlYWRpbmcgPT4gcmVhZGluZy5yZWFkaW5nKS5qb2luKCcsICcpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFeHRyYWN0IHRoZSBsaXN0IG9mIHJlYWRpbmdzIGZyb20gYW4gaXRlbS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZ2V0X3JlYWRpbmcoaXRlbSkgewogICAgICAgIHJldHVybiBpdGVtLmRhdGEucmVhZGluZ3MubWFwKHJlYWRpbmcgPT4gcmVhZGluZy5yZWFkaW5nKS5qb2luKCcsICcpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIaWRlIHRoZSBSZXZpZXcgSW5mbyBwb3AtdXAuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhpZGVfcmV2aWV3X2luZm8oKSB7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbycpLmFkZENsYXNzKCdoaWRkZW4nKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2VuZXJhdGUgYSBmb3JtYXR0ZWQgZGF0ZSBzdHJpbmcuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGZvcm1hdF9kYXRlKHRpbWUsIGFsbG93X25vdywgc2hvd19kYXksIHNob3dfbW9udGgpIHsKICAgICAgICB2YXIgc3RyID0gJyc7CiAgICAgICAgaWYgKGFsbG93X25vdyAmJiB0aW1lLmdldFRpbWUoKSA+PSBncmFwaC5zdGFydF90aW1lLmdldFRpbWUoKSkgcmV0dXJuICdOb3cnOwogICAgICAgIGlmIChzaG93X2RheSkgewogICAgICAgICAgICBpZiAobmV3IERhdGUodGltZSkuc2V0SG91cnMoMCwwLDAsMCkgPT09IChuZXcgRGF0ZSgpKS5zZXRIb3VycygwLDAsMCwwKSkgewogICAgICAgICAgICAgICAgc3RyID0gJ1RvZGF5JzsKICAgICAgICAgICAgICAgIHNob3dfbW9udGggPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHN0ciA9ICdTdW5Nb25UdWVXZWRUaHVGcmlTYXQnLnN1YnN0cih0aW1lLmdldERheSgpKjMsIDMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzaG93X21vbnRoKSB7CiAgICAgICAgICAgICAgICBzdHIgKz0gJywgJyArICdKYW5GZWJNYXJBcHJNYXlKdW5KdWxBdWdTZXBPY3ROb3ZEZWMnLnN1YnN0cih0aW1lLmdldE1vbnRoKCkqMywgMykgKyAnICcgKyB0aW1lLmdldERhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2V0dGluZ3MudGltZV9mb3JtYXQgPT09ICcyNGhvdXInKSB7CiAgICAgICAgICAgIHN0ciArPSAnICcgKyAoJzAnICsgdGltZS5nZXRIb3VycygpKS5zbGljZSgtMikgKyAnOicgKyAoJzAnK3RpbWUuZ2V0TWludXRlcygpKS5zbGljZSgtMik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyICs9ICcgJyArICgnMCcgKyAoKCh0aW1lLmdldEhvdXJzKCkrMTEpJTEyKSsxKSkuc2xpY2UoLTIpICsgJzonKygnMCcrdGltZS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKSArICdhcCdbTWF0aC5mbG9vcih0aW1lLmdldEhvdXJzKCkvMTIpXSArICdtJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cjsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRmV0Y2ggaXRlbSBpbmZvLCBhbmQgcmVkcmF3IHRoZSB0aW1lbGluZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZmV0Y2hfYW5kX3VwZGF0ZSgpIHsKICAgICAgICByZXR1cm4gd2tvZi5JdGVtRGF0YS5nZXRfaXRlbXMoJ3N1YmplY3RzLCBhc3NpZ25tZW50cywgc3R1ZHlfbWF0ZXJpYWxzJykKICAgICAgICAudGhlbihwcm9jZXNzX2l0ZW1zKQogICAgICAgIC50aGVuKGRyYXdfdGltZWxpbmUpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcm9jZXNzIHRoZSBmZXRjaGVkIGl0ZW1zLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBwcm9jZXNzX2l0ZW1zKGZldGNoZWRfaXRlbXMpIHsKICAgICAgICAvLyBSZW1vdmUgYW55IHVubGVhcm5lZCBpdGVtcy4KICAgICAgICBncmFwaC5pdGVtcyA9IFtdOwogICAgICAgIGZvciAodmFyIGlkeCBpbiBmZXRjaGVkX2l0ZW1zKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gZmV0Y2hlZF9pdGVtc1tpZHhdOwogICAgICAgICAgICBpZiAoIWl0ZW0uYXNzaWdubWVudHMgfHwgIWl0ZW0uYXNzaWdubWVudHMuYXZhaWxhYmxlX2F0IHx8IGl0ZW0uYXNzaWdubWVudHMuc3JzX3N0YWdlIDw9IDApIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoaXRlbS5kYXRhLmxldmVsID4gd2tvZi51c2VyLmxldmVsKSBjb250aW51ZTsKICAgICAgICAgICAgZ3JhcGguaXRlbXMucHVzaChpdGVtKTsKICAgICAgICB9CgogICAgICAgIGdyYXBoLml0ZW1zLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICByZXR1cm4gKG5ldyBEYXRlKGEuYXNzaWdubWVudHMuYXZhaWxhYmxlX2F0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShiLmFzc2lnbm1lbnRzLmF2YWlsYWJsZV9hdCkuZ2V0VGltZSgpKTsKICAgICAgICB9KTsKCiAgICAgICAgYnVuZGxlX2J5X3RpbWVzbG90KCk7CiAgICAgICAgdXBkYXRlX3NsaWRlcl9yZXZpZXdzKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEJ1bmRsZSB0aGUgaXRlbXMgaW50byB0aW1lc2xvdHMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGJ1bmRsZV9ieV90aW1lc2xvdCgpIHsKICAgICAgICB2YXIgYnVuZGxlX3NpemUgPSBncmFwaC5idW5kbGVfc2l6ZSA9IGdldF9ob3Vyc19wZXJfYmFyKCk7CiAgICAgICAgdmFyIGJ1bmRsZXMgPSBncmFwaC5idW5kbGVzID0gW107CiAgICAgICAgdmFyIHRpbWVzbG90cyA9IGdyYXBoLnRpbWVzbG90cyA9IFtdOwoKICAgICAgICAvLyBSZXdpbmQgdGhlIGNsb2NrIHRvIHRoZSBzdGFydCBvZiBhIGJ1bmRsZSBwZXJpb2QuCiAgICAgICAgdmFyIHN0YXJ0X3RpbWUgPSB0b1N0YXJ0T2ZVVENIb3VyKG5ldyBEYXRlKCkpOwogICAgICAgIHdoaWxlIChzdGFydF90aW1lLmdldEhvdXJzKCkgJSBidW5kbGVfc2l6ZSAhPT0gMCkgc3RhcnRfdGltZSA9IG5ldyBEYXRlKHN0YXJ0X3RpbWUuZ2V0VGltZSgpIC0gMzYwMDAwMCk7CiAgICAgICAgZ3JhcGguc3RhcnRfdGltZSA9IHN0YXJ0X3RpbWU7CgogICAgICAgIC8vIEZpbmQgdGhlIHRpYyBvZiB0aGUgbGFzdCBidW5kbGUgKHJvdW5kIGRvd24gaWYgb25seSBhIHBhcnRpYWwpLgogICAgICAgIGdyYXBoLnRvdGFsX3Jldmlld3MgPSAwOwogICAgICAgIGdyYXBoLm1heF9yZXZpZXdzID0gMDsKICAgICAgICB2YXIgaG91ciA9IDAsIGl0ZW1faWR4ID0gMCwgaXRlbV9jb3VudCA9IDA7CiAgICAgICAgdmFyIGJ1bmRsZSA9IHtzdGFydF90aW1lOmhvdXIsIGl0ZW1zOltdfTsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICB0aW1lc2xvdHMucHVzaChidW5kbGVzLmxlbmd0aCk7CiAgICAgICAgICAgIGhvdXIrKzsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgcGFzdCBlbmQgb2YgdGhlIHRpbWVsaW5lIChpbmNsdWRpbmcgcm91bmRpbmcgdXAgdG8gdGhlIG5lYXJlc3QgYnVuZGxlKQogICAgICAgICAgICAvLyBOZWVkIHRvIHVzZSBkYXRlIGZ1bmN0aW9uIHRvIGFjY291bnQgZm9yIHRpbWUgc2hpZnRzIChlLmcuIERheWxpZ2h0IFNhdmluZ3MgVGltZSkKICAgICAgICAgICAgdmFyIHRpbWUgPSBuZXcgRGF0ZShzdGFydF90aW1lLmdldFRpbWUoKSArIGhvdXIgKiAzNjAwMDAwKTsKICAgICAgICAgICAgaWYgKCh0aW1lLmdldEhvdXJzKCkgJSBidW5kbGVfc2l6ZSkgIT09IDApIGNvbnRpbnVlOwoKICAgICAgICAgICAgdmFyIHN0YXJ0X2lkeCA9IGl0ZW1faWR4OwogICAgICAgICAgICB3aGlsZSAoKGl0ZW1faWR4IDwgZ3JhcGguaXRlbXMubGVuZ3RoKSAmJgogICAgICAgICAgICAgICAgICAgKG5ldyBEYXRlKGdyYXBoLml0ZW1zW2l0ZW1faWR4XS5hc3NpZ25tZW50cy5hdmFpbGFibGVfYXQpIDwgdGltZSkpIHsKICAgICAgICAgICAgICAgIGl0ZW1faWR4Kys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGJ1bmRsZS5pdGVtcyA9IGdyYXBoLml0ZW1zLnNsaWNlKHN0YXJ0X2lkeCwgaXRlbV9pZHgpOwogICAgICAgICAgICBidW5kbGUuZW5kX3RpbWUgPSBob3VyOwogICAgICAgICAgICBjYWxjX2J1bmRsZV9zdGF0cyhidW5kbGUpOwogICAgICAgICAgICBncmFwaC5idW5kbGVzLnB1c2goYnVuZGxlKTsKCiAgICAgICAgICAgIGdyYXBoLnRvdGFsX3Jldmlld3MgKz0gYnVuZGxlLml0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGJ1bmRsZS5pdGVtcy5sZW5ndGggPiBncmFwaC5tYXhfcmV2aWV3cykgZ3JhcGgubWF4X3Jldmlld3MgPSBidW5kbGUuaXRlbXMubGVuZ3RoOwogICAgICAgICAgICBpZiAoaG91ciA+PSBncmFwaC54X2F4aXMubWF4X2hvdXJzKSBicmVhazsKCiAgICAgICAgICAgIGJ1bmRsZSA9IHtzdGFydF90aW1lOmhvdXIsIGl0ZW1zOltdfTsKICAgICAgICB9CiAgICAgICAgZ3JhcGgueF9heGlzLm1heF9ob3VycyA9IGhvdXI7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENhbGN1bGF0ZSBzdGF0cyBmb3IgYSBidW5kbGUKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gY2FsY19idW5kbGVfc3RhdHMoYnVuZGxlKSB7CiAgICAgICAgdmFyIGl0eXBlX3RvX2ludCA9IHtyYWRpY2FsOjAsIGthbmppOjEsIHZvY2FidWxhcnk6Mn07CiAgICAgICAgdmFyIGl0eXBlX3RvX2NsYXNzID0ge3JhZGljYWw6J3JhZCcsIGthbmppOidrYW4nLCB2b2NhYnVsYXJ5Oid2b2MnfTsKICAgICAgICB2YXIgc3JzX3RvX2NsYXNzID0gewogICAgICAgICAgICBjdXJyOiBbJ2FwcHInLCdhcHByJywnYXBwcicsJ2FwcHInLCdhcHByJywnZ3VydScsJ2d1cnUnLCdtYXN0JywnZW5saSddLAogICAgICAgICAgICBuZXh0OiBbJ2FwcHInLCdhcHByJywnYXBwcicsJ2FwcHInLCdndXJ1JywnZ3VydScsJ21hc3QnLCdlbmxpJywnYnVybiddCiAgICAgICAgfTsKICAgICAgICBidW5kbGUuaXRlbXMuc29ydChmdW5jdGlvbihhLCBiKXsKICAgICAgICAgICAgdmFyIGFfaXR5cGUgPSBpdHlwZV90b19pbnRbYS5vYmplY3RdOwogICAgICAgICAgICB2YXIgYl9pdHlwZSA9IGl0eXBlX3RvX2ludFtiLm9iamVjdF07CiAgICAgICAgICAgIGlmIChhX2l0eXBlICE9PSBiX2l0eXBlKSByZXR1cm4gYV9pdHlwZSAtIGJfaXR5cGU7CiAgICAgICAgICAgIGlmIChhLmRhdGEubGV2ZWwgIT09IGIuZGF0YS5sZXZlbCkgcmV0dXJuIGEuZGF0YS5sZXZlbCAtIGIuZGF0YS5sZXZlbDsKICAgICAgICAgICAgcmV0dXJuIGEuZGF0YS5zbHVnLmxvY2FsZUNvbXBhcmUoYi5kYXRhLnNsdWcpOwogICAgICAgIH0pOwogICAgICAgIGJ1bmRsZS5zdGF0cyA9IHsKICAgICAgICAgICAgY291bnQ6MCwKICAgICAgICAgICAgcmFkOjAsIGthbjowLCB2b2M6MCwKICAgICAgICAgICAgYXBwcjowLCBndXJ1OjAsIG1hc3Q6MCwgZW5saTowLCBidXJuOjAsCiAgICAgICAgICAgIGx2bGdycDA6MCwgbHZsZ3JwMTowLCBsdmxncnAyOjAsIGx2bGdycDM6MCwgbHZsZ3JwNDowLCBsdmxncnA1OjAsCiAgICAgICAgICAgIGN1cnJfY291bnQ6IDAsCiAgICAgICAgICAgIGhhc19jdXJyX21hcmtlcjogZmFsc2UsCiAgICAgICAgICAgIGJ1cm5fY291bnQ6IDAKICAgICAgICB9OwogICAgICAgIHZhciBzdGF0cyA9IGJ1bmRsZS5zdGF0czsKICAgICAgICBmb3IgKHZhciBpdGVtX2lkeCBpbiBidW5kbGUuaXRlbXMpIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBidW5kbGUuaXRlbXNbaXRlbV9pZHhdOwogICAgICAgICAgICBzdGF0cy5jb3VudCsrOwogICAgICAgICAgICBzdGF0c1tpdHlwZV90b19jbGFzc1tpdGVtLm9iamVjdF1dKys7CiAgICAgICAgICAgIHN0YXRzW3Nyc190b19jbGFzc1tzZXR0aW5ncy5zcnNfY3Vycl9uZXh0XVtpdGVtLmFzc2lnbm1lbnRzLnNyc19zdGFnZV1dKys7CiAgICAgICAgICAgIHN0YXRzWydsdmxncnAnK01hdGguZmxvb3IoKGl0ZW0uZGF0YS5sZXZlbC0xKS8xMCldKys7CiAgICAgICAgICAgIGlmIChpdGVtLmRhdGEubGV2ZWwgPT09IHdrb2YudXNlci5sZXZlbCkgewogICAgICAgICAgICAgICAgc3RhdHMuY3Vycl9jb3VudCsrOwogICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLmN1cnJlbnRfbGV2ZWxfbWFya2Vycy5pbmRleE9mKGl0ZW0ub2JqZWN0WzBdKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHMuaGFzX2N1cnJfbWFya2VyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBidW5kbGUuc3RhdHMuYnVybl9jb3VudCA9IGJ1bmRsZS5zdGF0c1tzcnNfdG9fY2xhc3Nbc2V0dGluZ3Muc3JzX2N1cnJfbmV4dF1bOF1dOwogICAgICAgIGdyYXBoLmN1cnJlbnRfYnVuZGxlID0gYnVuZGxlOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBSZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IFVUQyBob3VyLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiB0b1N0YXJ0T2ZVVENIb3VyKGRhdGUpIHsKICAgICAgICB2YXIgZCA9IChkYXRlIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGUuZ2V0VGltZSgpIDogZGF0ZSk7CiAgICAgICAgZCA9IE1hdGguZmxvb3IoZC8zNjAwMDAwKSozNjAwMDAwOwogICAgICAgIHJldHVybiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUgPyBuZXcgRGF0ZShkKSA6IGQpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTdGFydCBhIHRpbWVyIHRvIHJlZnJlc2ggdGhlIHRpbWVsaW5lICh3aXRob3V0IGZldGNoKSBhdCB0aGUgdG9wIG9mIHRoZSBob3VyLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBzdGFydF9yZWZyZXNoX3RpbWVyKCkgewogICAgICAgIHZhciBub3cgPSBEYXRlLm5vdygpOwogICAgICAgIHZhciBuZXh0X2hvdXIgPSB0b1N0YXJ0T2ZVVENIb3VyKG5vdykgKyAzNjAxMDAwOyAvLyAxIHNlY29uZCBwYXN0IHRoZSBuZXh0IFVUQyBob3VyLgogICAgICAgIHZhciB3YWl0X3RpbWUgPSAobmV4dF9ob3VyIC0gbm93KTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgIGJ1bmRsZV9ieV90aW1lc2xvdCgpOwogICAgICAgICAgICB1cGRhdGVfc2xpZGVyX3Jldmlld3MoKTsKICAgICAgICAgICAgZHJhd190aW1lbGluZSgpOwogICAgICAgICAgICBzdGFydF9yZWZyZXNoX3RpbWVyKCk7CiAgICAgICAgfSwgd2FpdF90aW1lKTsKICAgIH0KCn0pKHdpbmRvdy50aW1lbGluZSk7Cg==", 258 223 "storage": { 259 224 "data": {}, 260 225 "ts": 1607436649623 261 226 }, 262 - "enabled": true, 263 - "position": 5, 264 - "file_url": "https://greasyfork.org/scripts/13475-wanikani-ultimate-timeline/code/Wanikani%20Ultimate%20Timeline.user.js", 265 - "uuid": "898d914c-c6aa-4606-abf9-fcc0e7385841", 266 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIFVsdGltYXRlIFRpbWVsaW5lCi8vIEBuYW1lc3BhY2UgICByZmluZGxleQovLyBAZGVzY3JpcHRpb24gUmV2aWV3IHNjaGVkdWxlIGV4cGxvcmVyIGZvciBXYW5pS2FuaQovLyBAdmVyc2lvbiAgICAgNy4wLjI4Ci8vIEBpbmNsdWRlICAgICAvXmh0dHBzOi8vKHd3d3xwcmV2aWV3KS53YW5pa2FuaS5jb20vKGRhc2hib2FyZCk/JC8KLy8gQGNvcHlyaWdodCAgIDIwMTgrLCBSb2JpbiBGaW5kbGV5Ci8vIEBsaWNlbnNlICAgICBNSVQ7IGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKLy8gQHJ1bi1hdCAgICAgIGRvY3VtZW50LWVuZAovLyBAZ3JhbnQgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCndpbmRvdy50aW1lbGluZSA9IHt9OwoKKGZ1bmN0aW9uKGdvYmopIHsKCiAgICAvKiBnbG9iYWwgJCwgd2tvZiAqLwogICAgLyogZXNsaW50IG5vLW11bHRpLXNwYWNlczogIm9mZiIgKi8KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemF0aW9uIG9mIHRoZSBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIHNjcmlwdF9uYW1lID0gJ1VsdGltYXRlIFRpbWVsaW5lJzsKICAgIHZhciB3a29mX3ZlcnNpb25fbmVlZGVkID0gJzEuMC4yNyc7CiAgICBpZiAoIXdpbmRvdy53a29mKSB7CiAgICAgICAgaWYgKGNvbmZpcm0oc2NyaXB0X25hbWUrJyByZXF1aXJlcyBXYW5pa2FuaSBPcGVuIEZyYW1ld29yay5cbkRvIHlvdSB3YW50IHRvIGJlIGZvcndhcmRlZCB0byB0aGUgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucz8nKSkgewogICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9ICdodHRwczovL2NvbW11bml0eS53YW5pa2FuaS5jb20vdC9pbnN0cnVjdGlvbnMtaW5zdGFsbGluZy13YW5pa2FuaS1vcGVuLWZyYW1ld29yay8yODU0OSc7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh3a29mLnZlcnNpb24uY29tcGFyZV90byh3a29mX3ZlcnNpb25fbmVlZGVkKSA9PT0gJ29sZGVyJykgewogICAgICAgIGlmIChjb25maXJtKHNjcmlwdF9uYW1lKycgcmVxdWlyZXMgV2FuaWthbmkgT3BlbiBGcmFtZXdvcmsgdmVyc2lvbiAnK3drb2ZfdmVyc2lvbl9uZWVkZWQrJy5cbkRvIHlvdSB3YW50IHRvIGJlIGZvcndhcmRlZCB0byB0aGUgdXBkYXRlIHBhZ2U/JykpIHsKICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSAnaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9zY3JpcHRzLzM4NTgyLXdhbmlrYW5pLW9wZW4tZnJhbWV3b3JrJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHdrb2YuaW5jbHVkZSgnSXRlbURhdGEsTWVudSxTZXR0aW5ncycpOwogICAgd2tvZi5yZWFkeSgnZG9jdW1lbnQsSXRlbURhdGEsTWVudSxTZXR0aW5ncycpLnRoZW4obG9hZF9zZXR0aW5ncykudGhlbihzdGFydHVwKTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIENoYXJ0IGRlZmluaW5nIHRoZSBhdXRvLXNjYWxpbmcgZmFjdG9ycyBvZiB0aGUgWC1heGlzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgeHNjYWxlID0gewogICAgICAgIC8vIFNjYWxpbmcgY2hhcnQuICBFYWNoIGNvbHVtbiByZXByZXNlbnRzIGEgc2NhbGluZyByYW5nZSwKICAgICAgICAvLyBhbmQgZWFjaCByb3cgaXMgc29tZXRoaW5nIHRoYXQgd2UgYXJlIHNjYWxpbmcuCiAgICAgICAgaG91cnNfcGVyX2xhYmVsOiAgIFsgIDEgLCAgMyAsICA2ICwgIDEyICwgIDI0ICwgIDQ4ICwgNzIwIF0sCiAgICAgICAgcmVkX3RpY19jaG9pY2VzOiAgIFsnMWQnLCcxZCcsJzFkJywgJzFkJywgJzF3JywnMXdzJywgJzFtJ10sIC8vIFJlZCBtYWpvciB0aWNzIChyZWQgbGFiZWwpCiAgICAgICAgbWFqb3JfdGljX2Nob2ljZXM6IFsnMWgnLCczaCcsJzZoJywnMTJoJywgJzFkJywnMWRzJywgJzVEJ10sIC8vIE1ham9yIHRpY3MgKGhhcyBsYWJlbCkKICAgICAgICBtaW5vcl90aWNfY2hvaWNlczogWyAnLScsJzFoJywnMWgnLCAnM2gnLCAnNmgnLCcxMmgnLCAnMWQnXSwgLy8gTWlub3IgdGljcyAobm8gbGFiZWwpCiAgICAgICAgYnVuZGxlX2Nob2ljZXMgICA6IFsgIDEgLCAgMSAsICAxICwgICAzICwgICA2ICwgIDEyICwgIDI0IF0sIC8vIEhvdyBtYW55IGhvdXJzIGFyZSBidW5kbGVkIHRvZ2V0aGVyLgogICAgICAgIGlkeDogMAogICAgfTsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEludGVyYWwgZ2xvYmFsIG9iamVjdCBmb3IgY2VudHJhbGl6aW5nIGRhdGEgYW5kIGNvbmZpZ3VyYXRpb24uCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBncmFwaCA9IHsKICAgICAgICBlbGVtOiBudWxsLAogICAgICAgIG1hcmdpbjogewogICAgICAgICAgICB0b3A6IDE2LAogICAgICAgICAgICBsZWZ0OiAyOCwKICAgICAgICAgICAgYm90dG9tOiAxNiwKICAgICAgICB9LAogICAgICAgIHhfYXhpczogewogICAgICAgICAgICB3aWR0aDogMCwKICAgICAgICAgICAgbWF4X2hvdXJzOiAwLAogICAgICAgICAgICBwaXhlbHNfcGVyX3RpYzogMCwKICAgICAgICB9LAogICAgICAgIHlfYXhpczogewogICAgICAgICAgICBoZWlnaHQ6IDEwMCwKICAgICAgICAgICAgbWluX2hlaWdodDogODAsCiAgICAgICAgICAgIG1heF9oZWlnaHQ6IDMwMCwKICAgICAgICAgICAgbWF4X3Jldmlld3M6IDAsCiAgICAgICAgfSwKICAgICAgICByYWRpY2FsX2NhY2hlOiB7fSwKICAgIH07CiAgICBnb2JqLmdyYXBoID0gZ3JhcGg7CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHbG9iYWwgdXRpbGl0eSBmdW5jdGlvbnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvX3RpdGxlX2Nhc2Uoc3RyKSB7cmV0dXJuIHN0ci5yZXBsYWNlKC9cd1xTKi9nLCBmdW5jdGlvbih0eHQpe3JldHVybiB0eHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCk7fSk7fQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gR2xvYmFsIHZhcmlhYmxlcwogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgc2V0dGluZ3MsIHNldHRpbmdzX2RpYWxvZzsKICAgIHZhciB0el9vZnMgPSBuZXcgRGF0ZSgpLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICB2YXIgdGltZV9zaGlmdCA9IE1hdGguY2VpbCh0el9vZnMgLyA2MCkgKiA2MCAtIHR6X29mczsKCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTG9hZCB0aGUgc2NyaXB0IHNldHRpbmdzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBsb2FkX3NldHRpbmdzKCkgewogICAgICAgIHZhciBkZWZhdWx0cyA9IHsKICAgICAgICAgICAgbWluaW1pemVkOiBmYWxzZSwKICAgICAgICAgICAgcGxhY2VtZW50OiAnYmVmb3JlX25leHRyZXZpZXcnLAogICAgICAgICAgICB0aW1lX2Zvcm1hdDogJzEyaG91cicsCiAgICAgICAgICAgIGdyYXBoX2hlaWdodDogMTAwLAogICAgICAgICAgICBtYXhfZGF5czogMTQsCiAgICAgICAgICAgIGRheXM6IDMuNSwKICAgICAgICAgICAgbWF4X2Jhcl93aWR0aDogNDAsCiAgICAgICAgICAgIG1heF9iYXJfaGVpZ2h0OiAwLAogICAgICAgICAgICBmaXhlZF9iYXJfaGVpZ2h0OiBmYWxzZSwKICAgICAgICAgICAgYmFyX3N0eWxlOiAnaXRlbV90eXBlJywKICAgICAgICAgICAgc3JzX2N1cnJfbmV4dDogJ2N1cnInLAogICAgICAgICAgICBjdXJyZW50X2xldmVsX21hcmtlcnM6ICdya3YnLAogICAgICAgICAgICBidXJuX21hcmtlcnM6ICdzaG93JywKICAgICAgICAgICAgc2hvd19yZXZpZXdfZGV0YWlsczogJ2Z1bGwnLAogICAgICAgICAgICByZXZpZXdfZGV0YWlsc19zdW1tYXJ5OiAnaXRlbV90eXBlJywKICAgICAgICAgICAgcmV2aWV3X2RldGFpbHNfYnV0dG9uczogdHJ1ZSwKICAgICAgICAgICAgc2hvd19iYXJfc3R5bGVfZHJvcGRvd246IHRydWUsCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gd2tvZi5TZXR0aW5ncy5sb2FkKCd0aW1lbGluZScsIGRlZmF1bHRzKS50aGVuKGZ1bmN0aW9uKGRhdGEpewogICAgICAgICAgICBzZXR0aW5ncyA9IHdrb2Yuc2V0dGluZ3MudGltZWxpbmU7CiAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3Muc2hvd19tYXJrZXJzKSB7CiAgICAgICAgICAgICAgICBjYXNlICdub25lJzoKICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5jdXJyZW50X2xldmVsX21hcmtlcnMgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnVybl9tYXJrZXJzID0gJ2hpZGUnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnY3Vycic6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzID0gJ3Jrdic7CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuYnVybl9tYXJrZXJzID0gJ2hpZGUnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnYnVybic6CiAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9ICdzaG93JzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2JvdGgnOgogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmN1cnJlbnRfbGV2ZWxfbWFya2VycyA9ICdya3YnOwogICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9ICdzaG93JzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWxldGUgc2V0dGluZ3Muc2hvd19tYXJrZXJzOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBTdGFydHVwCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHN0YXJ0dXAoKSB7CiAgICAgICAgaW5zdGFsbF9jc3MoKTsKICAgICAgICBpbnN0YWxsX21lbnVfbGluaygpOwogICAgICAgIHBsYWNlX3RpbWVsaW5lKHRydWUgLyogZmlyc3RfdGltZSAqLyk7CiAgICAgICAgZmV0Y2hfYW5kX3VwZGF0ZSgpOwogICAgICAgIHN0YXJ0X3JlZnJlc2hfdGltZXIoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluc3RhbGwgYSBsaW5rIHRvIHRoZSBzZXR0aW5ncyBpbiB0aGUgbWVudS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaW5zdGFsbF9tZW51X2xpbmsoKQogICAgewogICAgICAgIHdrb2YuTWVudS5pbnNlcnRfc2NyaXB0X2xpbmsoewogICAgICAgICAgICBuYW1lOiAndGltZWxpbmUnLAogICAgICAgICAgICBzdWJtZW51OiAnU2V0dGluZ3MnLAogICAgICAgICAgICB0aXRsZTogJ1VsdGltYXRlIFRpbWVsaW5lJywKICAgICAgICAgICAgb25fY2xpY2s6IG9wZW5fc2V0dGluZ3MKICAgICAgICB9KTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFRvcC1sZXZlbCBIVE1MIGZvciB0aGUgc2NyaXB0LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB2YXIgdGltZWxpbmVfaHRtbCA9CiAgICAgICAgJzxzZWN0aW9uIGlkPSJ0aW1lbGluZSI+JysKICAgICAgICAnICA8aDQgY2xhc3M9Im5vX21pbiI+UmV2aWV3cyBUaW1lbGluZTwvaDQ+JysKICAgICAgICAnICA8aSBjbGFzcz0ibGluayBvcGVuIG5vc2VsZWN0IG5vX21pbiBpY29uLWNoZXZyb24tdXAiIHRpdGxlPSJPcGVuIHRoZSB0aW1lbGluZSI+PC9pPicrCiAgICAgICAgJyAgPGkgY2xhc3M9ImxpbmsgbWluaW1pemUgbm9zZWxlY3QgaWNvbi1jaGV2cm9uLWRvd24iIHRpdGxlPSJNaW5pbWl6ZSB0aGUgdGltZWxpbmUiPjwvaT4nKwogICAgICAgICcgIDxpIGNsYXNzPSJsaW5rIHJlZnJlc2ggbm9zZWxlY3QgaWNvbi1yZWZyZXNoIiB0aXRsZT0iUmVmcmVzaCI+PC9pPicrCiAgICAgICAgJyAgPGkgY2xhc3M9Imxpbmsgc2V0dGluZ3Mgbm9zZWxlY3QgaWNvbi1nZWFyIiB0aXRsZT0iQ2hhbmdlIHRpbWVsaW5lIHNldHRpbmdzIj48L2k+JysKICAgICAgICAnICA8c3BhbiBjbGFzcz0iYmFyX3N0eWxlIGhpZGRlbiI+PGxhYmVsPkJhciBTdHlsZTogPC9sYWJlbD48c2VsZWN0PicrCiAgICAgICAgJyAgICA8b3B0aW9uIG5hbWU9ImNvdW50Ij5SZXZpZXcgQ291bnQ8L29wdGlvbj4nKwogICAgICAgICcgICAgPG9wdGlvbiBuYW1lPSJpdGVtX3R5cGUiPkl0ZW0gVHlwZTwvb3B0aW9uPicrCiAgICAgICAgJyAgICA8b3B0aW9uIG5hbWU9InNyc19zdGFnZSI+U1JTIExldmVsPC9vcHRpb24+JysKICAgICAgICAnICAgIDxvcHRpb24gbmFtZT0ibGV2ZWwiPkxldmVsPC9vcHRpb24+JysKICAgICAgICAnICA8L3NlbGVjdD48L3NwYW4+JysKICAgICAgICAnICA8Zm9ybSBjbGFzcz0icmFuZ2VfZm9ybSIgY2xhc3M9ImhpZGRlbiI+PGxhYmVsPjxzcGFuIGNsYXNzPSJyYW5nZV9yZXZpZXdzIj4wPC9zcGFuPiByZXZpZXdzIGluIDxzcGFuIGNsYXNzPSJyYW5nZV9kYXlzIj4zIGRheXM8L3NwYW4+IDxpbnB1dCBjbGFzcz0icmFuZ2VfaW5wdXQiIHR5cGU9InJhbmdlIiBtaW49IjAuMjUiIG1heD0iNyIgdmFsdWU9IjMiIHN0ZXA9IjAuMjUiIG5hbWU9InJhbmdlX2lucHV0Ij48L2xhYmVsPjwvZm9ybT48YnIgY2xlYXI9ImFsbCIgY2xhc3M9Im5vX21pbiI+JysKICAgICAgICAnICA8ZGl2IGNsYXNzPSJncmFwaF93cmFwIj4nKwogICAgICAgICcgICAgPGRpdiBjbGFzcz0icmV2aWV3X2luZm8gaGlkZGVuIj48ZGl2IGNsYXNzPSJpbm5lciI+PC9kaXY+PC9kaXY+JysKICAgICAgICAnICAgIDxkaXYgY2xhc3M9ImdyYXBoX3BhbmVsIj48L2Rpdj4nKwogICAgICAgICcgIDwvZGl2PicrCiAgICAgICAgJzwvc2VjdGlvbj4nOwoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSW5zdGFsbCB0aGUgc3R5bGUgc2hlZXQgZm9yIHRoZSBzY3JpcHQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGluc3RhbGxfY3NzKCkgewogICAgICAgIHZhciB0aW1lbGluZV9jc3MgPQogICAgICAgICAgICAnLm5vc2VsZWN0IHstd2Via2l0LXRvdWNoLWNhbGxvdXQ6bm9uZTsgLXdlYmtpdC11c2VyLXNlbGVjdDpub25lOyAta2h0bWwtdXNlci1zZWxlY3Q6bm9uZTsgLW1vei11c2VyLXNlbGVjdDpub25lOyAtbXMtdXNlci1zZWxlY3Q6bm9uZTsgdXNlci1zZWxlY3Q6bm9uZTsgY3Vyc29yOmRlZmF1bHQ7fScrCiAgICAgICAgICAgICcuZGFzaGJvYXJkIHNlY3Rpb24ucmV2aWV3LXN0YXR1cyB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNmZmZmZmY7fScrCiAgICAgICAgICAgICcuZGFzaGJvYXJkIHNlY3Rpb24ucmV2aWV3LXN0YXR1cyB1bCBsaSB0aW1lIHt3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdy14OiBoaWRkZW47IGhlaWdodDogMS41ZW07IG1hcmdpbi1ib3R0b206IDA7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIHttYXJnaW4tYm90dG9tOiAwcHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZDRkNGQ0O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gaDQge2NsZWFyOm5vbmU7IGZsb2F0OmxlZnQ7IGhlaWdodDoyMHB4OyBtYXJnaW4tdG9wOjBweDsgbWFyZ2luLWJvdHRvbTo0cHg7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgbWFyZ2luLXJpZ2h0OjEycHg7fScrCiAgICAgICAgICAgICdAbWVkaWEgKG1heC13aWR0aDogNzY3cHgpIHsjdGltZWxpbmUgaDQge2Rpc3BsYXk6IG5vbmU7fX0nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gLmxpbmsge2NvbG9yOnJnYmEoMCwwLDAsMC4zKTsgZm9udC1zaXplOjEuMWVtOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgY3Vyc29yOnBvaW50ZXI7IG1hcmdpbi1yaWdodDo0cHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgPiAubGluazpob3ZlciB7Y29sb3I6cmdiYSgyNTUsMzEsMzEsMC41KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZTpub3QoLm1pbikgPiAubGluay5vcGVuLCAjdGltZWxpbmUubWluID4gOm5vdCgubm9fbWluKSB7ZGlzcGxheTpub25lO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lID4gLnJhbmdlX2Zvcm0ge2Zsb2F0OnJpZ2h0OyBtYXJnaW4tYm90dG9tOjBweDsgdGV4dC1hbGlnbjpyaWdodDt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLmJhcl9zdHlsZSBsYWJlbCB7ZGlzcGxheTppbmxpbmU7IG1hcmdpbi1sZWZ0OjgwcHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLmJhcl9zdHlsZSBzZWxlY3Qge2hlaWdodDphdXRvOyBwYWRkaW5nOjA7IHdpZHRoOmF1dG87IHZlcnRpY2FsLWFsaWduOmJhc2VsaW5lOyBiYWNrZ3JvdW5kLWNvbG9yOiNlM2UzZTM7IGJvcmRlcjoxcHggc29saWQgI2FhYTsgYm9yZGVyLXJhZGl1czoycHg7fScrCiAgICAgICAgICAgICdAbWVkaWEgKG1heC13aWR0aDogOTc5cHgpIHsnKwogICAgICAgICAgICAnICAjdGltZWxpbmUgLmJhcl9zdHlsZSB7ZmxvYXQ6bGVmdDsgY2xlYXI6Ym90aDsgbWFyZ2luLWxlZnQ6aW5oZXJpdDt9JysKICAgICAgICAgICAgJyAgI3RpbWVsaW5lIC5iYXJfc3R5bGUgbGFiZWwge21hcmdpbi1sZWZ0OmluaGVyaXQ7fScrCiAgICAgICAgICAgICd9JysKICAgICAgICAgICAgJ0BtZWRpYSAobWF4LXdpZHRoOiA3NjdweCkgeyN0aW1lbGluZSAubGluayB7ZmxvYXQ6bGVmdDt9fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lID4gLmdyYXBoX3BhbmVsIGRpdiwgI3RpbWVsaW5lID4gLmdyYXBoX3BhbmVsIGNhbnZhcyB7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSA+IC5ncmFwaF9wYW5lbCBkaXYge2JvcmRlcjoxcHggc29saWQgI2Q0ZDRkNDt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLmdyYXBoX3dyYXAge3Bvc2l0aW9uOnJlbGF0aXZlO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8ge3Bvc2l0aW9uOmFic29sdXRlOyBwYWRkaW5nLWJvdHRvbToxNTBweDsgei1pbmRleDo1O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuaW5uZXIge3BhZGRpbmc6NHB4IDhweCA4cHggOHB4OyBjb2xvcjojZWVlZWVlOyBiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMC44KTsgYm9yZGVyLXJhZGl1czo0cHg7IGZvbnQtd2VpZ2h0OmJvbGQ7IHotaW5kZXg6MjsgYm94LXNpemluZzpib3JkZXItYm94O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSB7Zm9udC1mYW1pbHk6Ik9wZW4gU2FucyIsIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsgZm9udC1zaXplOjEzcHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuc3VtbWFyeSBkaXYge3BhZGRpbmc6MHB4IDhweDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudCB7cGFkZGluZzowOyBtYXJnaW4tYm90dG9tOjhweDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudDpsYXN0LWNoaWxkIHttYXJnaW4tYm90dG9tOjA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5maXhlZCB7dGV4dC1hbGlnbjpyaWdodDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLnRvdCB7Y29sb3I6IzAwMDAwMDsgYmFja2dyb3VuZC1jb2xvcjojZWZlZmVmOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlZmVmZWYsICNjZmNmY2YpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbyAuaXRlbXNfd3JhcCB7cG9zaXRpb246cmVsYXRpdmU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnN1bW1hcnkgLmZpeGVkIHtkaXNwbGF5OmlubGluZS1ibG9jazsgcG9zaXRpb246cmVsYXRpdmU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5pbmRlbnQ+ZGl2IHtkaXNwbGF5Om5vbmV9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0iaXRlbV90eXBlIl0gLnN1bW1hcnkgLml0ZW1fdHlwZSB7ZGlzcGxheTpibG9jazt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAuc3VtbWFyeSAuc3JzX3N0YWdlIHtkaXNwbGF5OmJsb2NrO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLnN1bW1hcnkgLmxldmVsIHtkaXNwbGF5OmJsb2NrO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJjb3VudCJdIC5pdGVtX2xpc3QgPiBsaSB7YmFja2dyb3VuZC1jb2xvcjojZWVlOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlZmVmZWYsICNjZmNmY2YpOyBjb2xvcjojMDAwO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImNvdW50Il0gLml0ZW1fbGlzdCA+IGxpIHN2ZyB7c3Ryb2tlOiMwMDA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0iaXRlbV90eXBlIl0gLnJhZCB7YmFja2dyb3VuZC1jb2xvcjojMDA5NmU3OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICMwYWYsICMwMDkzZGQpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9Iml0ZW1fdHlwZSJdIC5rYW4ge2JhY2tncm91bmQtY29sb3I6I2VlMDBhMTsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZjBhLCAjZGQwMDkzKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJpdGVtX3R5cGUiXSAudm9jIHtiYWNrZ3JvdW5kLWNvbG9yOiM5ODAwZTg7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2EwZiwgIzkzMDBkZCk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gLmFwcHIge2JhY2tncm91bmQtY29sb3I6I2RkMDA5MzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZmYwMGFhLCAjYjMwMDc3KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAuZ3VydSB7YmFja2dyb3VuZC1jb2xvcjojODgyZDllOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNhYTM4YzcsICM2NjIyNzcpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIC5tYXN0IHtiYWNrZ3JvdW5kLWNvbG9yOiMyOTRkZGI7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzUxNmVlMSwgIzIxNDJjNCk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ic3JzX3N0YWdlIl0gLmVubGkge2JhY2tncm91bmQtY29sb3I6IzAwOTNkZDsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjMDBhYWZmLCAjMDA3N2IzKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJzcnNfc3RhZ2UiXSAuYnVybiB7YmFja2dyb3VuZC1jb2xvcjojNDM0MzQzOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM0MzQzNDMsICMxYTFhMWEpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9InNyc19zdGFnZSJdIGxpLmJ1cm4ge2JvcmRlcjoxcHggc29saWQgIzc3Nzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnAwIHtiYWNrZ3JvdW5kLWNvbG9yOiM1ZWI2ZTg7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzVlYjZlOCwgIzFkOGFjOSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwMSB7YmFja2dyb3VuZC1jb2xvcjojZTI1ZWJjOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICNlMjVlYmMsICNjMjI0OTUpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDIge2JhY2tncm91bmQtY29sb3I6I2FmNzljMzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjYWY3OWMzLCAjODc0NzllKTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnAzIHtiYWNrZ3JvdW5kLWNvbG9yOiM3NjhjZTc7IGJhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgIzc2OGNlNywgIzI2NGFkOSk7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvW2RhdGEtbW9kZT0ibGV2ZWwiXSAubHZsZ3JwNCB7YmFja2dyb3VuZC1jb2xvcjojNWU1ZTY0OyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM1ZTVlNjQsICMzMTMxMzUpO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5yZXZpZXdfaW5mb1tkYXRhLW1vZGU9ImxldmVsIl0gLmx2bGdycDUge2JhY2tncm91bmQtY29sb3I6I2Y1YzY2NzsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZjVjNjY3LCAjZjBhNTBmKTsgY29sb3I6IzMzM30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm9bZGF0YS1tb2RlPSJsZXZlbCJdIC5sdmxncnA1IHN2ZyB7c3Ryb2tlOiMzMzN9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5zdW1tYXJ5IC5pbmRlbnQ+LmN1ciB7ZGlzcGxheTpibG9jazsgZm9udC1zdHlsZTppdGFsaWM7IGNvbG9yOiMwMDAwMDA7IGJhY2tncm91bmQtY29sb3I6I2ZmZmY4ODsgYmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCAjZmZmZmFhLCAjZWVlZTc3KTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gLnN1bW1hcnkgLmluZGVudD4uYnVyIHtkaXNwbGF5OmJsb2NrOyBmb250LXN0eWxlOml0YWxpYzsgY29sb3I6I2ZmZmZmZjsgYmFja2dyb3VuZC1jb2xvcjojMDAwMDAwOyBiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byBib3R0b20sICM0NDQ0NDQsICMwMDAwMDApO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZSAuaXRlbV9saXN0IHttYXJnaW46IDhweCAwIDAgMDsgcGFkZGluZzogMHB4O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIC5pdGVtX2xpc3QgPiBsaSB7cGFkZGluZzowIDNweDsgbWFyZ2luOjFweCAxcHg7IGRpc3BsYXk6aW5saW5lLWJsb2NrOyBib3JkZXItcmFkaXVzOjRweDsgZm9udC1zaXplOjE0cHg7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgY3Vyc29yOmRlZmF1bHQ7IGJveC1zaXppbmc6Ym9yZGVyLWJveDsgYm9yZGVyOjFweCBzb2xpZCByZ2JhKDAsMCwwLDApO30nKwoKICAgICAgICAgICAgJyN0aW1lbGluZVtkYXRhLWRldGFpbD0iZnVsbCJdIC5pdGVtX2xpc3QgPiBsaSB7Y3Vyc29yOnBvaW50ZXI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1faW5mbyB7cG9zaXRpb246YWJzb2x1dGU7IGJhY2tncm91bmQ6IzMzMzsgYm9yZGVyOjhweCBzb2xpZCByZ2JhKDAsMCwwLDAuNyk7IGJvcmRlci1yYWRpdXM6NnB4OyBsZWZ0OjRweDsgcGFkZGluZzowIDhweDsgei1pbmRleDoxMDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAuaXRlbV9pbmZvIC5pdGVtIHtmb250LXNpemU6MmVtOyBsaW5lLWhlaWdodDoxLjJlbTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSAucmV2aWV3X2luZm8gc3ZnLnJhZGljYWwge2ZpbGw6bm9uZTtzdHJva2U6I2ZmZjtzdHJva2Utd2lkdGg6ODU7c3Ryb2tlLWxpbmVjYXA6c3F1YXJlO3N0cm9rZS1taXRlcmxpbWl0OjI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1fbGlzdCBzdmcucmFkaWNhbCB7d2lkdGg6MWVtOyB0cmFuc2Zvcm06dHJhbnNsYXRlWSgycHgpOyBzdHJva2Utd2lkdGg6ODU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLml0ZW1faW5mbyAuaXRlbSBzdmcucmFkaWNhbCB7d2lkdGg6MjhweDsgdHJhbnNmb3JtOnRyYW5zbGF0ZVkoMnB4KTt9JysKCiAgICAgICAgICAgICcjdGltZWxpbmUgLmRldGFpbF9idXR0b25zIHtkaXNwbGF5OmlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246dG9wOyBtYXJnaW4tbGVmdDo4cHg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgLmRldGFpbF9idXR0b25zIGJ1dHRvbiB7ZGlzcGxheTpibG9jazsgd2lkdGg6MTMwcHg7IHBhZGRpbmc6MDsgbWFyZ2luLWJvdHRvbToycHg7fScrCgogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyB7b3ZlcmZsb3c6aGlkZGVuO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCB7cG9pbnRlci1ldmVudHM6bm9uZTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgcGF0aCB7ZmlsbDpub25lO3N0cm9rZTpibGFjaztzdHJva2UtbGluZWNhcDpzcXVhcmU7c2hhcGUtcmVuZGVyaW5nOmNyaXNwRWRnZXM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5saWdodCB7c3Ryb2tlOiNmZmZmZmY7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5zaGFkb3cge3N0cm9rZTojZDVkNWQ1O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuZ3JpZCAubWFqb3Ige29wYWNpdHk6MC4xNTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgLm1pbm9yIHtvcGFjaXR5OjAuMDU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ncmlkIC5yZWR0aWMge3N0cm9rZTojZjIyO29wYWNpdHk6MTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmdyaWQgLm1heCB7c3Ryb2tlOiNmMjI7b3BhY2l0eTowLjI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ib3VuZGFyeSB7ZmlsbDojMDAwO29wYWNpdHk6MDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLnJlc2l6ZV9ncmlwIHtmaWxsOm5vbmU7Y3Vyc29yOnJvdy1yZXNpemU7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5yZXNpemVfZ3JpcCAubGlnaHQge3N0cm9rZTojZmZmZmZmO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAucmVzaXplX2dyaXAgLnNoYWRvdyB7c3Ryb2tlOiNiYmI7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIHRleHQucmVkdGljIHtmaWxsOiNmMjI7Zm9udC13ZWlnaHQ6Ym9sZDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmxhYmVsLXggdGV4dCB7dGV4dC1hbmNob3I6c3RhcnQ7Zm9udC1zaXplOjAuOGVtO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubGFiZWwteSB0ZXh0IHt0ZXh0LWFuY2hvcjplbmQ7Zm9udC1zaXplOjAuOGVtO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyB0ZXh0IHtwb2ludGVyLWV2ZW50czpub25lO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuYmFycyByZWN0IHtzdHJva2U6bm9uZTtzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlczt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJhci5vdmVybGF5IHtvcGFjaXR5OjA7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5ia2dkIHtmaWxsOiNmN2Y3Zjc7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5yYWQge2ZpbGw6IzAwYTFmMTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmthbiB7ZmlsbDojZjEwMGExO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAudm9jIHtmaWxsOiNhMTAwZjE7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5zdW0ge2ZpbGw6IzI5NGRkYjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmFwcHIge2ZpbGw6I2RkMDA5Mzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmd1cnUge2ZpbGw6Izg4MmQ5ZTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLm1hc3Qge2ZpbGw6IzI5NGRkYjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmVubGkge2ZpbGw6IzAwOTNkZDt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJ1cm4ge2ZpbGw6IzQzNDM0Mzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmNvdW50IHtmaWxsOiM3NzhhZDg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnAwIHtmaWxsOiM1ZWI2ZTg7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnAxIHtmaWxsOiNlMjVlYmM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnAyIHtmaWxsOiNhZjc5YzM7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnAzIHtmaWxsOiM3NjhjZTc7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnA0IHtmaWxsOiM1ZTVlNjQ7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5sdmxncnA1IHtmaWxsOiNmNWM2Njc7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5iYXJzIC5jdXIge2ZpbGw6I2ZmZmZmZjtvcGFjaXR5OjAuNjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmJhcnMgLmJ1ciB7ZmlsbDojMDAwMDAwO29wYWNpdHk6MC40O30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubWFya2VycyB7c3Ryb2tlOiMwMDAwMDA7c3Ryb2tlLXdpZHRoOjAuNTt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLm1hcmtlcnMgLmJ1ciB7ZmlsbDojMDAwMDAwO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAubWFya2VycyAuY3VyIHtmaWxsOiNmZmZmZmY7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnIC5oaWdobGlnaHQgLmJvdW5kYXJ5IHtjdXJzb3I6cG9pbnRlcjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZVtkYXRhLWRldGFpbD0ibm9uZSJdIC5oaWdobGlnaHQgLmJvdW5kYXJ5IHtjdXJzb3I6YXV0bzt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmhpZ2hsaWdodCAubWFya2VyIHtwb2ludGVyLWV2ZW50czpub25lO3NoYXBlLXJlbmRlcmluZzpjcmlzcEVkZ2VzO30nKwogICAgICAgICAgICAnI3RpbWVsaW5lIHN2ZyAuaGlnaGxpZ2h0IHBhdGgubWFya2VyIHtmaWxsOiMwMGExZjE7IHN0cm9rZTojMDBhMWYxOyBzdHJva2Utd2lkdGg6Mjt9JysKICAgICAgICAgICAgJyN0aW1lbGluZSBzdmcgLmhpZ2hsaWdodCByZWN0Lm1hcmtlciB7ZmlsbDpyZ2JhKDAsMTYxLDI0MSwwLjEpOyBzdHJva2U6IzAwYTFmMTsgc3Ryb2tlLXdpZHRoOjE7fScrCiAgICAgICAgICAgICcjdGltZWxpbmUgc3ZnLmxpbms6aG92ZXIgKiB7ZmlsbDpyZ2IoMjU1LDMxLDMxKTt9JysKICAgICAgICAgICAgJ2JvZHkubXV0ZV9wb3BvdmVyIC5wb3BvdmVyLnNycyB7ZGlzcGxheTpub25lICFpbXBvcnRhbnQ7fScrCiAgICAgICAgICAgICcnOwoKICAgICAgICAkKCdoZWFkJykuYXBwZW5kKCc8c3R5bGU+Jyt0aW1lbGluZV9jc3MrJzwvc3R5bGU+Jyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFBsYWNlIHRoZSB0aW1lbGluZSBvbiB0aGUgZGFzaGJvYXJkLCBvciBhZGp1c3QgaXRzIGxvY2F0aW9uIG9uIHRoZSBwYWdlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBwbGFjZV90aW1lbGluZShmaXJzdF90aW1lKSB7CiAgICAgICAgdmFyIHRpbWVsaW5lID0gKGZpcnN0X3RpbWUgPyAkKHRpbWVsaW5lX2h0bWwpIDogJCgnI3RpbWVsaW5lJykpOwogICAgICAgICQoJy5wcm9ncmVzcy1hbmQtZm9yZWNhc3QnKS5iZWZvcmUodGltZWxpbmUpOwogICAgICAgIGlmIChmaXJzdF90aW1lKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgVUkgZnJvbSBzZXR0aW5ncwogICAgICAgICAgICBncmFwaC5lbGVtID0gdGltZWxpbmUuZmluZCgnLmdyYXBoX3BhbmVsJyk7CiAgICAgICAgICAgIGdyYXBoLnhfYXhpcy53aWR0aCA9IGdyYXBoLmVsZW0ud2lkdGgoKSAtIGdyYXBoLm1hcmdpbi5sZWZ0OwogICAgICAgICAgICBncmFwaC55X2F4aXMuaGVpZ2h0ID0gc2V0dGluZ3MuZ3JhcGhfaGVpZ2h0IC0gKGdyYXBoLm1hcmdpbi50b3AgKyBncmFwaC5tYXJnaW4uYm90dG9tKTsKICAgICAgICAgICAgdXBkYXRlX21pbmltaXplKCk7CiAgICAgICAgICAgIGluaXRfdWkoKTsKCiAgICAgICAgICAgIC8vIEluc3RhbGwgZXZlbnQgaGFuZGxlcnMKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLmxpbmsub3BlbiwgLmxpbmsubWluaW1pemUnKS5vbignY2xpY2snLCB0b2dnbGVfbWluaW1pemUpOwogICAgICAgICAgICB0aW1lbGluZS5maW5kKCcubGluay5yZWZyZXNoJykub24oJ2NsaWNrJywgZmV0Y2hfYW5kX3VwZGF0ZSk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5saW5rLnNldHRpbmdzJykub24oJ2NsaWNrJywgb3Blbl9zZXR0aW5ncyk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5iYXJfc3R5bGUgc2VsZWN0Jykub24oJ2NoYW5nZScsIGJhcl9zdHlsZV9jaGFuZ2VkKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJhbmdlX2lucHV0Jykub24oJ2lucHV0IGNoYW5nZScsIGRheXNfY2hhbmdlZCk7CiAgICAgICAgICAgIHRpbWVsaW5lLmZpbmQoJy5yZXZpZXdfaW5mbz4uaW5uZXInKS5vbignbW91c2VlbnRlcicsICcuaXRlbV9saXN0ID4gbGknLCBpdGVtX2hvdmVyKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJldmlld19pbmZvPi5pbm5lcicpLm9uKCdtb3VzZWxlYXZlJywgJy5pdGVtX2xpc3QnLCBpdGVtX2hvdmVyKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJldmlld19pbmZvPi5pbm5lcicpLm9uKCdjbGljaycsICcuZGV0YWlsX2J1dHRvbnMgYnV0dG9uJywgZGV0YWlsX2J1dHRvbl9jbGlja2VkKTsKICAgICAgICAgICAgdGltZWxpbmUuZmluZCgnLnJldmlld19pbmZvPi5pbm5lcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCl7cmV0dXJuIGZhbHNlO30pOwogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgd2luZG93X3Jlc2l6ZWQpOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVG9nZ2xlIHdoZXRoZXIgdGhlIHRpbWVsaW5lIGlzIG1pbmltaXplZC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdG9nZ2xlX21pbmltaXplKCkgewogICAgICAgIHNldHRpbmdzLm1pbmltaXplZCA9ICFzZXR0aW5ncy5taW5pbWl6ZWQ7CiAgICAgICAgdXBkYXRlX21pbmltaXplKCk7CiAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIaWRlIG9yIHVuaGlkZSB0aGUgdGltZWxpbmUgd2hlbiB0aGUgdXNlciBtaW5pbWl6ZXMvcmVzdG9yZXMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHVwZGF0ZV9taW5pbWl6ZSgpIHsKICAgICAgICB2YXIgdGltZWxpbmUgPSAkKCcjdGltZWxpbmUnKTsKICAgICAgICB2YXIgaXNfbWluID0gdGltZWxpbmUuaGFzQ2xhc3MoJ21pbicpOwogICAgICAgIGlmIChzZXR0aW5ncy5taW5pbWl6ZWQgJiYgIWlzX21pbikgewogICAgICAgICAgICB0aW1lbGluZS5hZGRDbGFzcygnbWluJyk7CiAgICAgICAgfSBlbHNlIGlmICghc2V0dGluZ3MubWluaW1pemVkICYmIGlzX21pbikgewogICAgICAgICAgICB0aW1lbGluZS5yZW1vdmVDbGFzcygnbWluJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBVcGRhdGUgdGhlIHRpbWVsaW5lIGFmdGVyIHRoZSB1c2VyIGNoYW5nZXMgdGhlIG51bWJlciBvZiBkYXlzIHRvIGRpc3BsYXkuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGRheXNfY2hhbmdlZCgpIHsKICAgICAgICB2YXIgZGF5cyA9IE51bWJlcigkKCcjdGltZWxpbmUgLnJhbmdlX2lucHV0JykudmFsKCkpOwogICAgICAgIGlmIChkYXlzID09PSBzZXR0aW5ncy5kYXlzKSByZXR1cm47CiAgICAgICAgc2V0dGluZ3MuZGF5cyA9IGRheXM7CiAgICAgICAgdXBkYXRlX3NsaWRlcl9kYXlzKCk7CiAgICAgICAgYnVuZGxlX2J5X3RpbWVzbG90KCk7CiAgICAgICAgdXBkYXRlX3NsaWRlcl9yZXZpZXdzKCk7CiAgICAgICAgZHJhd190aW1lbGluZSgpOwogICAgICAgIHNhdmVfc2V0dGluZ3MoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGFuZGxlciBmb3Igd2hlbiB1c2VyIGNoYW5nZXMgdGhlIEJhciBTdHlsZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gYmFyX3N0eWxlX2NoYW5nZWQoKSB7CiAgICAgICAgc2V0dGluZ3MuYmFyX3N0eWxlID0gJCgnI3RpbWVsaW5lIC5iYXJfc3R5bGUgc2VsZWN0IDpzZWxlY3RlZCcpLmF0dHIoJ25hbWUnKTsKICAgICAgICBkcmF3X3RpbWVsaW5lKCk7CiAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIYW5kbGVyIGZvciB3aGVuIHVzZXIgY2xpY2tzICdTYXZlJyBpbiB0aGUgc2V0dGluZ3Mgd2luZG93LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBzZXR0aW5nc19zYXZlZCgpIHsKICAgICAgICBzZXR0aW5ncyA9IHdrb2Yuc2V0dGluZ3MudGltZWxpbmU7CiAgICAgICAgcGxhY2VfdGltZWxpbmUoZmFsc2UgLyogZmlyc3RfdGltZSAqLyk7CiAgICAgICAgaW5pdF91aSgpOwogICAgICAgIGJ1bmRsZV9ieV90aW1lc2xvdCgpOwogICAgICAgIGRyYXdfdGltZWxpbmUoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSW5pdGlhbGl6ZSB0aGUgdXNlciBpbnRlcmZhY2UuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGluaXRfdWkoKSB7CiAgICAgICAgaW5pdF9zbGlkZXIoKTsKICAgICAgICBpZiAoc2V0dGluZ3Muc2hvd19iYXJfc3R5bGVfZHJvcGRvd24pIHsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5iYXJfc3R5bGUnKS5yZW1vdmVDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5iYXJfc3R5bGUnKS5hZGRDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgfQogICAgICAgICQoJyN0aW1lbGluZSAuYmFyX3N0eWxlIG9wdGlvbltuYW1lPSInK3NldHRpbmdzLmJhcl9zdHlsZSsnIl0nKS5wcm9wKCdzZWxlY3RlZCcsdHJ1ZSk7CiAgICAgICAgJCgnI3RpbWVsaW5lJykuYXR0cignZGF0YS1kZXRhaWwnLCBzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzKTsKICAgICAgICAkKCcjdGltZWxpbmUgLnJldmlld19pbmZvJykuYXR0cignZGF0YS1tb2RlJywgc2V0dGluZ3MucmV2aWV3X2RldGFpbHNfc3VtbWFyeSk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluaXRpYWxpemUgdGhlIHNjYWxlIHNsaWRlci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaW5pdF9zbGlkZXIoKSB7CiAgICAgICAgdmFyIHJhbmdlID0gJCgnI3RpbWVsaW5lIC5yYW5nZV9pbnB1dCcpOwogICAgICAgIGlmIChzZXR0aW5ncy5kYXlzID4gc2V0dGluZ3MubWF4X2RheXMpIHsKICAgICAgICAgICAgc2V0dGluZ3MuZGF5cyA9IHNldHRpbmdzLm1heF9kYXlzOwogICAgICAgICAgICBzYXZlX3NldHRpbmdzKCk7CiAgICAgICAgfQogICAgICAgIHJhbmdlLmF0dHIoJ21heCcsIHNldHRpbmdzLm1heF9kYXlzKTsKICAgICAgICByYW5nZS5hdHRyKCd2YWx1ZScsIHNldHRpbmdzLmRheXMpOwogICAgICAgIHVwZGF0ZV9zbGlkZXJfZGF5cygpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBVcGRhdGUgdGhlICdyZXZpZXdzJyB0ZXh0IG9mIHRoZSBzY2FsZSBzbGlkZXIuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHVwZGF0ZV9zbGlkZXJfcmV2aWV3cygpIHsKICAgICAgICB2YXIgcmV2aWV3X2NvdW50ID0gJCgnI3RpbWVsaW5lIC5yYW5nZV9yZXZpZXdzJyk7CiAgICAgICAgcmV2aWV3X2NvdW50LnRleHQoZ3JhcGgudG90YWxfcmV2aWV3cyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFVwZGF0ZSB0aGUgJ2RheXMnIHRleHQgb2YgdGhlIHNjYWxlIHNsaWRlci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdXBkYXRlX3NsaWRlcl9kYXlzKCkgewogICAgICAgIHZhciBkYXlzID0gc2V0dGluZ3MuZGF5czsKICAgICAgICB2YXIgcGVyaW9kID0gJCgnI3RpbWVsaW5lIC5yYW5nZV9kYXlzJyk7CiAgICAgICAgaWYgKGRheXMgPD0gMSkgewogICAgICAgICAgICBwZXJpb2QudGV4dCgoZGF5cyoyNCkrJyBob3VycycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBlcmlvZC50ZXh0KGRheXMudG9GaXhlZCgyKSsnIGRheXMnKTsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFNhdmUgdGhlIHNjcmlwdCBzZXR0aW5ncyAoYWZ0ZXIgYSA1MDBtcyBkZWxheSkuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBzYXZlX2RlbGF5X3RpbWVyOwogICAgZnVuY3Rpb24gc2F2ZV9zZXR0aW5ncygpIHsKICAgICAgICBpZiAoc2F2ZV9kZWxheV90aW1lciAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQoc2F2ZV9kZWxheV90aW1lcik7CiAgICAgICAgc2F2ZV9kZWxheV90aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgd2tvZi5TZXR0aW5ncy5zYXZlKCd0aW1lbGluZScpOwogICAgICAgIH0sIDUwMCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhhbmRsZXIgZm9yIHJlc2l6aW5nIHRoZSBwYW5lbCBieSBkcmFnZ2luZyB0aGUgYm90dG9tIG9mIHRoZSBncmFwaC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiByZXNpemVfcGFuZWwoZSkgewogICAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuOwogICAgICAgIHZhciBwYW5lbCA9ICQoJyN0aW1lbGluZSA+IC5ncmFwaF9wYW5lbCcpOwogICAgICAgIHZhciBzdGFydF95ID0gZS5wYWdlWTsKICAgICAgICB2YXIgc3RhcnRfaGVpZ2h0ID0gc2V0dGluZ3MuZ3JhcGhfaGVpZ2h0OwogICAgICAgICQoJ2JvZHknKQogICAgICAgIC5hZGRDbGFzcygnbXV0ZV9wb3BvdmVyJykKICAgICAgICAub24oJ21vdXNlbW92ZS50aW1lbGluZV9yZXNpemUgdG91Y2htb3ZlLnRpbWVsaW5lX3Jlc2l6ZScsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICB2YXIgaGVpZ2h0ID0gc3RhcnRfaGVpZ2h0ICsgKGUucGFnZVkgLSBzdGFydF95KTsKICAgICAgICAgICAgaWYgKGhlaWdodCA8IGdyYXBoLnlfYXhpcy5taW5faGVpZ2h0KSBoZWlnaHQgPSBncmFwaC55X2F4aXMubWluX2hlaWdodDsKICAgICAgICAgICAgaWYgKGhlaWdodCA+IGdyYXBoLnlfYXhpcy5tYXhfaGVpZ2h0KSBoZWlnaHQgPSBncmFwaC55X2F4aXMubWF4X2hlaWdodDsKICAgICAgICAgICAgc2V0dGluZ3MuZ3JhcGhfaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgICBncmFwaC55X2F4aXMuaGVpZ2h0ID0gaGVpZ2h0IC0gKGdyYXBoLm1hcmdpbi50b3AgKyBncmFwaC5tYXJnaW4uYm90dG9tKTsKICAgICAgICAgICAgZHJhd190aW1lbGluZSgpOwogICAgICAgIH0pCiAgICAgICAgLm9uKCdtb3VzZXVwLnRpbWVsaW5lX3Jlc2l6ZSB0b3VjaGVuZC50aW1lbGluZV9yZXNpemUnLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgc2F2ZV9zZXR0aW5ncygpOwogICAgICAgICAgICAkKCdib2R5Jykub2ZmKCcudGltZWxpbmVfcmVzaXplJykucmVtb3ZlQ2xhc3MoJ211dGVfcG9wb3ZlcicpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciBob3ZlcmluZyBvdmVyIHRoZSB0aW1lIHNjYWxlIGZvciBoaWdobGlnaHRpbmcuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIGhpZ2hsaWdodCA9IHtzdGFydDowLCBlbmQ6MCwgZHJhZ2dpbmc6ZmFsc2UsIGhpZ2hsaWdodGVkOiBmYWxzZX07CiAgICBmdW5jdGlvbiBoaWdobGlnaHRfaG92ZXIoZSkgewogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnbm9uZScpIHJldHVybjsKICAgICAgICBpZiAoaGlnaGxpZ2h0LmRyYWdnaW5nKSByZXR1cm4gdHJ1ZTsKICAgICAgICB2YXIgYnVuZGxlX2lkeCA9IG5lYXJlc3RfYnVuZGxlKGUucGFnZVgpOwogICAgICAgIHZhciB4OwogICAgICAgIHN3aXRjaCAoZS50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ21vdXNlZW50ZXInOgogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdtb3VzZW1vdmUnOgogICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodC5oaWdobGlnaHRlZCkgcmV0dXJuOwogICAgICAgICAgICAgICAgeCA9IGJ1bmRsZV90b194KGJ1bmRsZV9pZHgpOwogICAgICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5zdGFydCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4KycsMCknKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSAnbW91c2VsZWF2ZSc6CiAgICAgICAgICAgICAgICBpZiAoaGlnaGxpZ2h0LmRyYWdnaW5nIHx8IGhpZ2hsaWdodC5oaWdobGlnaHRlZCkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICBoaWRlX2hpZ2hsaWdodCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd0b3VjaHN0YXJ0JzoKICAgICAgICAgICAgY2FzZSAnbW91c2Vkb3duJzoKICAgICAgICAgICAgICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0LmhpZ2hsaWdodGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodC5kcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgICAgICBoaWdobGlnaHQuc3RhcnQgPSBidW5kbGVfaWR4OwogICAgICAgICAgICAgICAgeCA9IGJ1bmRsZV90b194KGJ1bmRsZV9pZHgpOwogICAgICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5zdGFydCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4KycsMCknKTsKICAgICAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuZW5kJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgtMTAwLDApJyk7CiAgICAgICAgICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCByZWN0Lm1hcmtlcicpLmF0dHIoJ3dpZHRoJywwKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreCsnLDApJyk7CiAgICAgICAgICAgICAgICAkKCdib2R5Jykub24oJ21vdXNlbW92ZS50aW1lbGluZV9oaWdobGlnaHQnLCBoaWdobGlnaHRfZHJhZyk7CiAgICAgICAgICAgICAgICAkKCdib2R5Jykub24oJ3RvdWNoZW5kLnRpbWVsaW5lX2hpZ2hsaWdodCBtb3VzZXVwLnRpbWVsaW5lX2hpZ2hsaWdodCcsIGhpZ2hsaWdodF9yZWxlYXNlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbiBoYW5kbGVyIGZvciBkcmFnZ2luZyB3aGVuIGhpZ2hsaWdodGluZyBhIHRpbWUgcmFuZ2UuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaGlnaGxpZ2h0X2RyYWcoZSkgewogICAgICAgIHZhciBidW5kbGVfaWR4ID0gbmVhcmVzdF9idW5kbGUoZS5wYWdlWCk7CiAgICAgICAgaGlnaGxpZ2h0LmVuZCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgdmFyIHgxID0gYnVuZGxlX3RvX3goaGlnaGxpZ2h0LnN0YXJ0KTsKICAgICAgICB2YXIgeDIgPSBidW5kbGVfdG9feChoaWdobGlnaHQuZW5kKTsKICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLmVuZCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4MisnLDApJyk7CiAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgcmVjdC5tYXJrZXInKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcrTWF0aC5taW4oeDEseDIpKycuNSwwLjUpJykuYXR0cignd2lkdGgnLE1hdGguYWJzKHgyLXgxKSk7CiAgICAgICAgc2hvd19yZXZpZXdfaW5mbyhmYWxzZSAvKiBzdGlja3kgKi8pOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciB0aGUgZW5kIG9mIGEgJ2RyYWcnIHdoZW4gaGlnaGxpZ2h0aW5nIGEgdGltZSByYW5nZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBoaWdobGlnaHRfcmVsZWFzZShlKSB7CiAgICAgICAgaWYgKGUuYnV0dG9uICE9PSAwKSByZXR1cm47CiAgICAgICAgaGlnaGxpZ2h0LmRyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgJCgnYm9keScpLm9mZignLnRpbWVsaW5lX2hpZ2hsaWdodCcpOwogICAgICAgIHZhciBidW5kbGVfaWR4ID0gbmVhcmVzdF9idW5kbGUoZS5wYWdlWCk7CiAgICAgICAgaGlnaGxpZ2h0LmVuZCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgaWYgKGhpZ2hsaWdodC5zdGFydCA9PT0gaGlnaGxpZ2h0LmVuZCkgewogICAgICAgICAgICBoaWRlX2hpZ2hsaWdodCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciB4MSA9IGJ1bmRsZV90b194KE1hdGgubWluKGhpZ2hsaWdodC5zdGFydCwgaGlnaGxpZ2h0LmVuZCkpOwogICAgICAgICAgICB2YXIgeDIgPSBidW5kbGVfdG9feChNYXRoLm1heChoaWdobGlnaHQuc3RhcnQsIGhpZ2hsaWdodC5lbmQpKTsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgLm1hcmtlci5zdGFydCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyt4MSsnLDApJyk7CiAgICAgICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuZW5kJykuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnK3gyKycsMCknKTsKICAgICAgICAgICAgJCgnI3RpbWVsaW5lIC5oaWdobGlnaHQgcmVjdC5tYXJrZXInKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcreDErJy41LDAuNSknKS5hdHRyKCd3aWR0aCcseDIteDEpOwogICAgICAgICAgICBoaWdobGlnaHQuaGlnaGxpZ2h0ZWQgPSB0cnVlOwogICAgICAgICAgICBzaG93X3Jldmlld19pbmZvKHRydWUgLyogc3RpY2t5ICovKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBIaWRlIHRoZSB0aW1lbGluZSdzIGhpZ2hsaWdodCBjdXJzb3JzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGhpZGVfaGlnaGxpZ2h0KCkgewogICAgICAgIGhpZ2hsaWdodC5zdGFydCA9IC0xOwogICAgICAgIGhpZ2hsaWdodC5lbmQgPSAtMTsKICAgICAgICBoaWdobGlnaHQuaGlnaGxpZ2h0ZWQgPSBmYWxzZTsKICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCByZWN0Lm1hcmtlcicpLmF0dHIoJ3dpZHRoJywwKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC0xMDAsMC41KScpOwogICAgICAgICQoJyN0aW1lbGluZSAuaGlnaGxpZ2h0IC5tYXJrZXIuc3RhcnQnKS5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKC0xMDAsMCknKTsKICAgICAgICAkKCcjdGltZWxpbmUgLmhpZ2hsaWdodCAubWFya2VyLmVuZCcpLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoLTEwMCwwKScpOwogICAgICAgIGhpZGVfcmV2aWV3X2luZm8oKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gbmVhcmVzdF9idW5kbGUoKQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG5lYXJlc3RfYnVuZGxlKHgpIHsKICAgICAgICB2YXIgcGFuZWxfbGVmdCA9IE1hdGguZmxvb3IoJCgnI3RpbWVsaW5lIC5ncmFwaF9wYW5lbCcpLm9mZnNldCgpLmxlZnQpOwogICAgICAgIHggLT0gcGFuZWxfbGVmdCArIGdyYXBoLm1hcmdpbi5sZWZ0OwogICAgICAgIGlmICh4IDwgMCkgeCA9IDA7CiAgICAgICAgdmFyIHRpYyA9IHggKiBncmFwaC54X2F4aXMubWF4X2hvdXJzIC8gZ3JhcGgueF9heGlzLndpZHRoOwogICAgICAgIHZhciBidW5kbGVfaWR4ID0gZ3JhcGgudGltZXNsb3RzW01hdGgubWluKGdyYXBoLnhfYXhpcy5tYXhfaG91cnMtMSwgTWF0aC5mbG9vcih0aWMpKV07CiAgICAgICAgdmFyIGJ1bmRsZSA9IGdyYXBoLmJ1bmRsZXNbYnVuZGxlX2lkeF07CiAgICAgICAgdmFyIHN0YXJ0ID0gYnVuZGxlLnN0YXJ0X3RpbWU7CiAgICAgICAgdmFyIGVuZCA9IGJ1bmRsZS5lbmRfdGltZTsKICAgICAgICByZXR1cm4gKHRpYyA8PSAoKHN0YXJ0K2VuZCkvMikgPyBidW5kbGVfaWR4IDogYnVuZGxlX2lkeCsxKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ29udmVydCBhIGJ1bmRsZV9pZHggdG8gYSBncmFwaCBob3VyIG9mZnNldC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBidW5kbGVfdG9fdGljKGJ1bmRsZV9pZHgpIHsKICAgICAgICBpZiAoYnVuZGxlX2lkeCA+PSBncmFwaC5idW5kbGVzLmxlbmd0aCkgcmV0dXJuIGdyYXBoLnhfYXhpcy5tYXhfaG91cnM7CiAgICAgICAgcmV0dXJuIGdyYXBoLmJ1bmRsZXNbYnVuZGxlX2lkeF0uc3RhcnRfdGltZTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ29udmVydCBhIGJ1bmRsZV9pZHggdG8gYSBncmFwaCBYIG9mZnNldC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBidW5kbGVfdG9feChidW5kbGVfaWR4KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYnVuZGxlX3RvX3RpYyhidW5kbGVfaWR4KSAqIGdyYXBoLnRpY19zcGFjaW5nKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gT3BlbiB0aGUgc2V0dGluZ3MgZGlhbG9nCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIG9wZW5fc2V0dGluZ3MoKSB7CiAgICAgICAgdmFyIGNvbmZpZyA9IHsKICAgICAgICAgICAgc2NyaXB0X2lkOiAndGltZWxpbmUnLAogICAgICAgICAgICB0aXRsZTogJ1VsdGltYXRlIFRpbWVsaW5lJywKICAgICAgICAgICAgb25fc2F2ZTogc2V0dGluZ3Nfc2F2ZWQsCiAgICAgICAgICAgIGNvbnRlbnQ6IHsKICAgICAgICAgICAgICAgIHRhYnM6IHt0eXBlOid0YWJzZXQnLCBjb250ZW50OiB7CiAgICAgICAgICAgICAgICAgICAgcGdHcmFwaDoge3R5cGU6J3BhZ2UnLCBsYWJlbDonR3JhcGgnLCBob3Zlcl90aXA6J0dyYXBoIFNldHRpbmdzJywgY29udGVudDogewogICAgICAgICAgICAgICAgICAgICAgICBncnBUaW1lOiB7dHlwZTonZ3JvdXAnLCBsYWJlbDonVGltZScsIGNvbnRlbnQ6ewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9mb3JtYXQ6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidUaW1lIEZvcm1hdCcsIGRlZmF1bHQ6JzEyaG91cicsIGNvbnRlbnQ6eycxMmhvdXInOicxMi1ob3VyJywnMjRob3VyJzonMjQtaG91cicsICdob3Vyc19vbmx5JzogJ0hvdXJzIG9ubHknfSwgaG92ZXJfdGlwOidEaXNwbGF5IHRpbWUgaW4gMTIgb3IgMjQtaG91ciBmb3JtYXQsIG9yIGhvdXJzLWZyb20tbm93Lid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RheXM6IHt0eXBlOidudW1iZXInLCBsYWJlbDonU2xpZGVyIFJhbmdlIE1heCAoZGF5cyknLCBtaW46MSwgbWF4OjEyNSwgZGVmYXVsdDo3LCBob3Zlcl90aXA6J0Nob29zZSBtYXhpbXVtIHJhbmdlIG9mIHRoZSB0aW1lbGluZSBzbGlkZXIgKGluIGRheXMpLid9LAogICAgICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgZ3JwQmFyczoge3R5cGU6J2dyb3VwJywgbGFiZWw6J0JhcnMnLCBjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9iYXJfd2lkdGg6IHt0eXBlOidudW1iZXInLCBsYWJlbDonTWF4IEJhciBXaWR0aCAocGl4ZWxzKScsIGRlZmF1bHQ6MCwgaG92ZXJfdGlwOidTZXQgdGhlIG1heGltdW0gYmFyIHdpZHRoIChpbiBwaXhlbHMpLlxuKDAgPSB1bmxpbWl0ZWQpJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYmFyX2hlaWdodDoge3R5cGU6J251bWJlcicsIGxhYmVsOidNYXggR3JhcGggSGVpZ2h0IChyZXZpZXdzKScsIGRlZmF1bHQ6MCwgaG92ZXJfdGlwOidTZXQgdGhlIG1heGltdW0gZ3JhcGggaGVpZ2h0IChpbiByZXZpZXdzKS5cbigwID0gdW5saW1pdGVkKVxuVXNlZnVsIGZvciB3aGVuIHlvdSBoYXZlIGEgaHVnZSBiYWNrbG9nLid9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfYmFyX2hlaWdodDoge3R5cGU6J2NoZWNrYm94JywgbGFiZWw6J0ZvcmNlIEdyYXBoIHRvIE1heCBIZWlnaHQnLCBkZWZhdWx0OmZhbHNlLCBob3Zlcl90aXA6J0ZvcmNlIHRoZSBncmFwaCBoZWlnaHQgdG8gYWx3YXlzIGJlIHRoZSBNYXggR3JhcGggSGVpZ2h0LlxuVXNlZnVsIHdoZW4gbGltaXRpbmcgdGhlIG51bWJlciBvZiByZXZpZXdzIHlvdSBkbyBpbiBvbmUgc2l0dGluZy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcl9zdHlsZToge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J0JhciBTdHlsZScsIGRlZmF1bHQ6J2l0ZW1fdHlwZScsIGNvbnRlbnQ6eydjb3VudCc6J1JldmlldyBDb3VudCcsJ2l0ZW1fdHlwZSc6J0l0ZW0gVHlwZScsJ3Nyc19zdGFnZSc6J1NSUyBMZXZlbCcsJ2xldmVsJzonTGV2ZWwnfSwgaG92ZXJfdGlwOidDaG9vc2UgaG93IGJhcnMgYXJlIHN1YmRpdmlkZWQuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcnNfY3Vycl9uZXh0OiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonQ3VycmVudCAvIE5leHQgU1JTIExldmVsJywgZGVmYXVsdDonY3VycicsIGNvbnRlbnQ6eydjdXJyJzonQ3VycmVudCBTUlMgTGV2ZWwnLCduZXh0JzonTmV4dCBTUlMgTGV2ZWwnfSwgaG92ZXJfdGlwOidTZWxlY3Qgd2hldGhlciBTUlMgaXMgY29sb3ItY29kZWQgYnlcbmN1cnJlbnQgU1JTIGxldmVsLCBvciBuZXh0IFNSUyBsZXZlbC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdycE1hcmtlcnM6IHt0eXBlOidncm91cCcsIGxhYmVsOidNYXJrZXJzJywgY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2xldmVsX21hcmtlcnM6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidDdXJyZW50IExldmVsIE1hcmtlcnMnLCBkZWZhdWx0Oidya3YnLCBjb250ZW50Onsnbm9uZSc6J05vbmUnLCdyayc6J1JhZCArIEthbicsJ3Jrdic6J1JhZCArIEthbiArIFZvYyd9LCBob3Zlcl90aXA6J1NlbGVjdCB3aGljaCBpdGVtIHR5cGVzIHdpbGwgdHJpZ2dlciBhIEN1cnJlbnQgTGV2ZWxcbm1hcmtlciBhdCB0aGUgYm90dG9tIG9mIHRoZSBncmFwaC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1cm5fbWFya2Vyczoge3R5cGU6J2Ryb3Bkb3duJywgbGFiZWw6J0J1cm4gTWFya2VycycsIGRlZmF1bHQ6J3Nob3cnLCBjb250ZW50Onsnc2hvdyc6J1Nob3cnLCdoaWRlJzonSGlkZSd9LCBob3Zlcl90aXA6J1NlbGVjdCB3aGV0aGVyIEJ1cm4gbWFya2VycyBhcmUgc2hvd25cbmF0IHRoZSBib3R0b20gb2YgdGhlIGdyYXBoLid9LAogICAgICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICBwZ1Jldmlld0RldGFpbHM6IHt0eXBlOidwYWdlJywgbGFiZWw6J1JldmlldyBEZXRhaWxzJywgaG92ZXJfdGlwOidSZXZpZXcgRGV0YWlscyBQb3AtdXAnLCBjb250ZW50OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dfcmV2aWV3X2RldGFpbHM6IHt0eXBlOidkcm9wZG93bicsIGxhYmVsOidTaG93IFJldmlldyBEZXRhaWxzJywgZGVmYXVsdDonZnVsbCcsIGNvbnRlbnQ6eydub25lJzonTm9uZScsJ3N1bW1hcnknOidTdW1tYXJ5JywnaXRlbV9saXN0JzonSXRlbSBMaXN0JywnZnVsbCc6J0Z1bGwgSXRlbSBEZXRhaWxzJ30sIGhvdmVyX3RpcDonQ2hvb3NlIHRoZSBsZXZlbCBvZiBkZXRhaWwgdG8gZGlzcGxheVxud2hlbiBhIGJhciBvciB0aW1lIHJhbmdlIGlzIHNlbGVjdGVkLid9LAogICAgICAgICAgICAgICAgICAgICAgICByZXZpZXdfZGV0YWlsc19zdW1tYXJ5OiB7dHlwZTonZHJvcGRvd24nLCBsYWJlbDonUmV2aWV3IERldGFpbHMgU3VtbWFyeScsIGRlZmF1bHQ6J2l0ZW1fdHlwZScsIGNvbnRlbnQ6eydjb3VudCc6J1JldmlldyBDb3VudCcsJ2l0ZW1fdHlwZSc6J0l0ZW0gVHlwZScsJ3Nyc19zdGFnZSc6J1NSUyBMZXZlbCcsJ2xldmVsJzonTGV2ZWwnfSwgaG92ZXJfdGlwOidDaG9vc2Ugd2hpY2ggc3VtbWFyeSBpbmZvcm1hdGlvbiB0b1xuZGlzcGxheSBvbiB0aGUgUmV2aWV3IERldGFpbHMgcG9wLXVwLid9LAogICAgICAgICAgICAgICAgICAgICAgICByZXZpZXdfZGV0YWlsc19idXR0b25zOiB7dHlwZTonY2hlY2tib3gnLCBsYWJlbDonU2hvdyBSZXZpZXcgRGV0YWlscyBCdXR0b25zJywgZGVmYXVsdDp0cnVlLCBob3Zlcl90aXA6J1Nob3cgY29uZmlndXJhdGlvbiBidXR0b25zIG9uIFJldmlldyBEZXRhaWxzIHBvcC11cC4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19iYXJfc3R5bGVfZHJvcGRvd246IHt0eXBlOidjaGVja2JveCcsIGxhYmVsOidTaG93IEJhciBTdHlsZSBEcm9wZG93bicsIGRlZmF1bHQ6ZmFsc2UsIGhvdmVyX3RpcDonU2hvdyB0aGUgQmFyIFN0eWxlIGRyb3Bkb3duIGFib3ZlIHRoZSB0aW1lbGluZS4nfSwKICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgc2V0dGluZ3NfZGlhbG9nID0gbmV3IHdrb2YuU2V0dGluZ3MoY29uZmlnKTsKICAgICAgICBzZXR0aW5nc19kaWFsb2cub3BlbigpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBob3VycyBwZXIgYmFyLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBnZXRfaG91cnNfcGVyX2JhcigpIHsKICAgICAgICBncmFwaC54X2F4aXMud2lkdGggPSBncmFwaC5lbGVtLndpZHRoKCkgLSBncmFwaC5tYXJnaW4ubGVmdDsKICAgICAgICBncmFwaC54X2F4aXMubWF4X2hvdXJzID0gTWF0aC5yb3VuZChzZXR0aW5ncy5kYXlzICogMjQpOwoKICAgICAgICAvLyBObyBtb3JlIHRoYW4gMSBsYWJlbCBldmVyeSA1MCBwaXhlbHMKICAgICAgICB2YXIgbWluX3BpeGVsc19wZXJfbGFiZWwgPSA1MDsKICAgICAgICBncmFwaC5taW5faG91cnNfcGVyX2xhYmVsID0gbWluX3BpeGVsc19wZXJfbGFiZWwgKiBncmFwaC54X2F4aXMubWF4X2hvdXJzIC8gZ3JhcGgueF9heGlzLndpZHRoOwogICAgICAgIHhzY2FsZS5pZHggPSAwOwogICAgICAgIHdoaWxlICgoeHNjYWxlLmhvdXJzX3Blcl9sYWJlbFt4c2NhbGUuaWR4XSA8PSBncmFwaC5taW5faG91cnNfcGVyX2xhYmVsKSAmJgogICAgICAgICAgICAgICAoeHNjYWxlLmlkeCA8IHhzY2FsZS5ob3Vyc19wZXJfbGFiZWwubGVuZ3RoLTEpKSB7CiAgICAgICAgICAgIHhzY2FsZS5pZHgrKzsKICAgICAgICB9CgogICAgICAgIHJldHVybiB4c2NhbGUuYnVuZGxlX2Nob2ljZXNbeHNjYWxlLmlkeF07CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1hcCBsZXR0ZXJzIGluIHRoZSB4c2NhbGUgY2hhcnQgdG8gY29ycmVzcG9uZGluZyBsYWJlbC1nZW5lcmF0aW5nIGZ1bmN0aW9ucy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIGxhYmVsX2Z1bmN0aW9ucyA9IHsKICAgICAgICAnbSc6IG1vbnRoX2xhYmVsLAogICAgICAgICd3Jzogd2Vla19sYWJlbCwKICAgICAgICAnRCc6IG1kYXlfbGFiZWwsCiAgICAgICAgJ2QnOiBkYXlfbGFiZWwsCiAgICAgICAgJ2gnOiBob3VyX2xhYmVsLAogICAgICAgICctJzogbm9fbGFiZWwsCiAgICB9OwoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBGdW5jdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGltZS1zY2FsZSBsYWJlbHMKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbW9udGhfbGFiZWwoZGF0ZSwgcXR5LCB1c2Vfc2hvcnQpIHsKICAgICAgICBpZiAoZGF0ZS5nZXRIb3VycygpICE9PSAwIHx8IGRhdGUuZ2V0RGF0ZSgpICE9PSAxKSByZXR1cm47CiAgICAgICAgcmV0dXJuIFsnSmFuJywnRmViJywnTWFyJywnQXByJywnTWF5JywnSnVuJywnSnVsJywnQXVnJywnU2VwJywnT2N0JywnTm92JywnRGVjJ11bZGF0ZS5nZXRNb250aCgpXTsKICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gd2Vla19sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCkgewogICAgICAgIGlmIChkYXRlLmdldEhvdXJzKCkgIT09IDAgfHwgZGF0ZS5nZXREYXkoKSAhPT0gMCkgcmV0dXJuOwogICAgICAgIHJldHVybiAodXNlX3Nob3J0ID8gJ1MnIDogJ1N1bicpOwogICAgfQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBtZGF5X2xhYmVsKGRhdGUsIHF0eSwgdXNlX3Nob3J0KSB7CiAgICAgICAgaWYgKGRhdGUuZ2V0SG91cnMoKSAhPT0gMCkgcmV0dXJuOwogICAgICAgIHZhciBtZGF5ID0gZGF0ZS5nZXREYXRlKCk7CiAgICAgICAgaWYgKG1kYXkgJSBxdHkgIT09IDApIHJldHVybjsKICAgICAgICByZXR1cm4gbWRheTsKICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZGF5X2xhYmVsKGRhdGUsIHF0eSwgdXNlX3Nob3J0KSB7CiAgICAgICAgaWYgKGRhdGUuZ2V0SG91cnMoKSAhPT0gMCkgcmV0dXJuOwogICAgICAgIHZhciBsYWJlbCA9IFsnU3VuJywnTW9uJywnVHVlJywnV2VkJywnVGh1JywnRnJpJywnU2F0J11bZGF0ZS5nZXREYXkoKV07CiAgICAgICAgcmV0dXJuICh1c2Vfc2hvcnQgPyBsYWJlbFswXSA6IGxhYmVsKTsKICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaG91cl9sYWJlbChkYXRlLCBxdHksIHVzZV9zaG9ydCkgewogICAgICAgIHZhciBoaCA9IGRhdGUuZ2V0SG91cnMoKTsKICAgICAgICBpZiAoKGhoICUgcXR5KSAhPT0gMCkgcmV0dXJuOwogICAgICAgIGlmIChzZXR0aW5ncy50aW1lX2Zvcm1hdCA9PT0gJzI0aG91cicpIHsKICAgICAgICAgICAgcmV0dXJuICgnMCcraGgrJzowMCcpLnNsaWNlKC01KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gKCgoaGggKyAxMSkgJSAxMikgKyAxKSArICdhcCdbTWF0aC5mbG9vcihoaC8xMildICsgJ20nOwogICAgICAgIH0KICAgIH0KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaG91cl9vbmx5X2xhYmVsKGRhdGUsIHF0eSwgdXNlX3Nob3J0LCB0aWNfaWR4KSB7CiAgICAgICAgaWYgKHRpY19pZHggJSBxdHkgIT09IDApIHJldHVybjsKICAgICAgICByZXR1cm4gdGljX2lkeCArICh1c2Vfc2hvcnQgPyAnaCcgOiAnIGhycycpOwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbm9fbGFiZWwoKSB7cmV0dXJuO30KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBEcmF3IHRoZSB0aW1lbGluZQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBkcmF3X3RpbWVsaW5lKCkgewogICAgICAgIHZhciBwYW5lbCA9IGdyYXBoLmVsZW0sCiAgICAgICAgICAgIHBhbmVsX2hlaWdodCA9IHNldHRpbmdzLmdyYXBoX2hlaWdodCwKICAgICAgICAgICAgcGFuZWxfd2lkdGggPSBncmFwaC5lbGVtLndpZHRoKCksCiAgICAgICAgICAgIGdyYXBoX2hlaWdodCA9IHBhbmVsX2hlaWdodCAtIChncmFwaC5tYXJnaW4udG9wICsgZ3JhcGgubWFyZ2luLmJvdHRvbSk7CgogICAgICAgIHZhciBtYXRjaCA9IHhzY2FsZS5yZWRfdGljX2Nob2ljZXNbeHNjYWxlLmlkeF0ubWF0Y2goL14oXGQqKSguKShzPykkLyk7CiAgICAgICAgdmFyIHJlZF9xdHkgPSBOdW1iZXIobWF0Y2hbMV0pOwogICAgICAgIHZhciByZWRfZnVuYyA9IGxhYmVsX2Z1bmN0aW9uc1ttYXRjaFsyXV07CiAgICAgICAgdmFyIHJlZF91c2Vfc2hvcnQgPSAobWF0Y2hbM10gPT09ICdzJyk7CgogICAgICAgIG1hdGNoID0geHNjYWxlLm1ham9yX3RpY19jaG9pY2VzW3hzY2FsZS5pZHhdLm1hdGNoKC9eKFxkKikoLikocz8pJC8pOwogICAgICAgIHZhciBtYWpfcXR5ID0gTnVtYmVyKG1hdGNoWzFdKTsKICAgICAgICB2YXIgbWFqX2Z1bmMgPSBsYWJlbF9mdW5jdGlvbnNbbWF0Y2hbMl1dOwogICAgICAgIHZhciBtYWpfdXNlX3Nob3J0ID0gKG1hdGNoWzNdID09PSAncycpOwoKICAgICAgICBtYXRjaCA9IHhzY2FsZS5taW5vcl90aWNfY2hvaWNlc1t4c2NhbGUuaWR4XS5tYXRjaCgvXihcZCopKC4pKHM/KSQvKTsKICAgICAgICB2YXIgbWluX3F0eSA9IE51bWJlcihtYXRjaFsxXSk7CiAgICAgICAgdmFyIG1pbl9mdW5jID0gbGFiZWxfZnVuY3Rpb25zW21hdGNoWzJdXTsKICAgICAgICB2YXIgbWluX3VzZV9zaG9ydCA9IChtYXRjaFszXSA9PT0gJ3MnKTsKCiAgICAgICAgaWYgKHNldHRpbmdzLnRpbWVfZm9ybWF0ID09PSAnaG91cnNfb25seScpIHsKICAgICAgICAgICAgcmVkX2Z1bmMgPSBmdW5jdGlvbigpIHtyZXR1cm4gMDt9OwogICAgICAgICAgICBtYWpfZnVuYyA9IGhvdXJfb25seV9sYWJlbDsKICAgICAgICAgICAgbWluX2Z1bmMgPSBob3VyX29ubHlfbGFiZWw7CiAgICAgICAgfQoKICAgICAgICB2YXIgYnVuZGxlX3NpemUgPSB4c2NhbGUuYnVuZGxlX2Nob2ljZXNbeHNjYWxlLmlkeF07CgogICAgICAgIC8vIFN0cmluZyBmb3IgYnVpbGRpbmcgaHRtbC4KICAgICAgICB2YXIgZ3JpZCA9ICcnOwogICAgICAgIHZhciBsYWJlbF94ID0gW107CiAgICAgICAgdmFyIGxhYmVsX3kgPSAnJzsKICAgICAgICB2YXIgYmFycyA9ICcnLCBiYXJfb3ZlcmxheXMgPSAnJzsKICAgICAgICB2YXIgbWFya2VycyA9ICcnOwoKICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIC8vIERyYXcgdmVydGljYWwgYXhpcyBncmlkCgogICAgICAgIC8vIENhbGN1bGF0ZSBtYWpvciBhbmQgbWlub3IgdmVydGljYWwgZ3JhcGggdGljcy4KICAgICAgICB2YXIgaW5jX3MgPSAxLCBpbmNfbCA9IDU7CiAgICAgICAgdmFyIG1heF9yZXZpZXdzID0gZ3JhcGgubWF4X3Jldmlld3M7CiAgICAgICAgaWYgKHNldHRpbmdzLm1heF9iYXJfaGVpZ2h0ID4gMCkgewogICAgICAgICAgICBpZiAoc2V0dGluZ3MuZml4ZWRfYmFyX2hlaWdodCB8fCAobWF4X3Jldmlld3MgPiBzZXR0aW5ncy5tYXhfYmFyX2hlaWdodCkpIG1heF9yZXZpZXdzID0gc2V0dGluZ3MubWF4X2Jhcl9oZWlnaHQ7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChNYXRoLmNlaWwobWF4X3Jldmlld3MgLyBpbmNfcykgPiA1KSB7CiAgICAgICAgICAgIHN3aXRjaCAoaW5jX3MudG9TdHJpbmcoKVswXSkgewogICAgICAgICAgICAgICAgY2FzZSAnMSc6IGluY19zICo9IDI7IGluY19sICo9IDI7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMic6IGluY19zID0gTWF0aC5yb3VuZCgyLjUgKiBpbmNfcyk7IGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNSc6IGluY19zICo9IDI7IGluY19sICo9IDU7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEcmF3IHZlcnRpY2FsIGdyYXBoIHRpY3MgKCMgb2YgUmV2aWV3cykuCiAgICAgICAgdmFyIHRpY19jbGFzcywgeTsKICAgICAgICBncmFwaC55X2F4aXMubWF4X3Jldmlld3MgPSBNYXRoLm1heCgzLCBNYXRoLmNlaWwobWF4X3Jldmlld3MgLyBpbmNfcykgKiBpbmNfcyk7CiAgICAgICAgZm9yICh2YXIgdGljID0gMDsgdGljIDw9IGdyYXBoLnlfYXhpcy5tYXhfcmV2aWV3czsgdGljICs9IGluY19zKSB7CiAgICAgICAgICAgIHRpY19jbGFzcyA9ICgodGljICUgaW5jX2wpID09PSAwID8gJ21ham9yJyA6ICdtaW5vcicpOwogICAgICAgICAgICB5ID0gKGdyYXBoLm1hcmdpbi50b3AgKyBncmFwaF9oZWlnaHQpIC0gTWF0aC5yb3VuZChncmFwaF9oZWlnaHQgKiAodGljIC8gZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzKSk7CiAgICAgICAgICAgIGlmICh0aWMgPiAwKSB7CiAgICAgICAgICAgICAgICBncmlkICs9ICc8cGF0aCBjbGFzcz0iJyt0aWNfY2xhc3MrJyIgZD0iTScrZ3JhcGgubWFyZ2luLmxlZnQrJywnK3krJ2gnK2dyYXBoLnhfYXhpcy53aWR0aCsnIiAvPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFiZWxfeSArPSAnPHRleHQgY2xhc3M9IicrdGljX2NsYXNzKyciIHg9IicrKGdyYXBoLm1hcmdpbi5sZWZ0LTQpKyciIHk9IicreSsnIiBkeT0iMC40ZW0iPicrdGljKyc8L3RleHQ+JzsKICAgICAgICB9CgogICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgLy8gRHJhdyBob3Jpem9udGFsIGF4aXMgZ3JpZAoKICAgICAgICBncmFwaC50aWNfc3BhY2luZyA9IChncmFwaC54X2F4aXMud2lkdGgpIC8gKGdyYXBoLnhfYXhpcy5tYXhfaG91cnMpOyAvLyBXaWR0aCBvZiBhIHRpbWUgc2xvdC4KICAgICAgICB2YXIgcHJldl9sYWJlbCA9IC05ZTEwOwogICAgICAgIGZvciAodmFyIHRpY19pZHggPSAwOyB0aWNfaWR4IDwgZ3JhcGgueF9heGlzLm1heF9ob3VyczsgdGljX2lkeCsrKSB7CiAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoZ3JhcGguc3RhcnRfdGltZS5nZXRUaW1lKCkgKyB0aWNfaWR4ICogMzYwMDAwMCk7CgogICAgICAgICAgICB2YXIgcmVkX2xhYmVsID0gcmVkX2Z1bmModGltZSwgcmVkX3F0eSwgcmVkX3VzZV9zaG9ydCwgdGljX2lkeCk7CiAgICAgICAgICAgIHZhciBtYWpfbGFiZWwgPSBtYWpfZnVuYyh0aW1lLCBtYWpfcXR5LCBtYWpfdXNlX3Nob3J0LCB0aWNfaWR4KTsKICAgICAgICAgICAgdmFyIG1pbl9sYWJlbCA9IG1pbl9mdW5jKHRpbWUsIG1pbl9xdHksIG1pbl91c2Vfc2hvcnQsIHRpY19pZHgpOwoKICAgICAgICAgICAgdmFyIHggPSBncmFwaC5tYXJnaW4ubGVmdCArIE1hdGgucm91bmQoKHRpY19pZHggLSB0aW1lX3NoaWZ0LzYwKSAqIGdyYXBoLnRpY19zcGFjaW5nKTsKICAgICAgICAgICAgdmFyIGxhYmVsOwogICAgICAgICAgICBpZiAocmVkX2xhYmVsKSB7CiAgICAgICAgICAgICAgICBpZiAodGljX2lkeCA+IDApIGdyaWQgKz0gJzxwYXRoIGNsYXNzPSJyZWR0aWMiIGQ9Ik0nK3grJywwdicrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0LTEpKyciIC8+JzsKICAgICAgICAgICAgICAgIGlmICghbWFqX3VzZV9zaG9ydCAmJiB0aWNfaWR4IC0gcHJldl9sYWJlbCA8IGdyYXBoLm1pbl9ob3Vyc19wZXJfbGFiZWwqMC41OCkgbGFiZWxfeC5wb3AoKTsKICAgICAgICAgICAgICAgIGxhYmVsX3gucHVzaCgnPHRleHQgY2xhc3M9InJlZHRpYyIgeD0iJysoeCs0KSsnIiB5PSInKyhncmFwaC5tYXJnaW4udG9wLTgpKyciPicrcmVkX2xhYmVsKyc8L3RleHQ+Jyk7CiAgICAgICAgICAgICAgICBwcmV2X2xhYmVsID0gdGljX2lkeDsKICAgICAgICAgICAgfSBlbHNlIGlmIChtYWpfbGFiZWwpIHsKICAgICAgICAgICAgICAgIGlmICh0aWNfaWR4ID4gMCkgZ3JpZCArPSAnPHBhdGggY2xhc3M9Im1ham9yIiBkPSJNJyt4KycsMHYnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodC0xKSsnIiAvPic7CiAgICAgICAgICAgICAgICBpZiAobWFqX3VzZV9zaG9ydCB8fCB0aWNfaWR4IC0gcHJldl9sYWJlbCA+IGdyYXBoLm1pbl9ob3Vyc19wZXJfbGFiZWwqMC41OCkgewogICAgICAgICAgICAgICAgICAgIGxhYmVsX3gucHVzaCgnPHRleHQgY2xhc3M9Im1ham9yIiB4PSInKyh4KzQpKyciIHk9IicrKGdyYXBoLm1hcmdpbi50b3AtOCkrJyI+JyttYWpfbGFiZWwrJzwvdGV4dD4nKTsKICAgICAgICAgICAgICAgICAgICBwcmV2X2xhYmVsID0gdGljX2lkeDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChtaW5fbGFiZWwpIHsKICAgICAgICAgICAgICAgIGlmICh0aWNfaWR4ID4gMCkgZ3JpZCArPSAnPHBhdGggY2xhc3M9Im1pbm9yIiBkPSJNJyt4KycsJysoZ3JhcGgubWFyZ2luLnRvcC02KSsndicrKGdyYXBoX2hlaWdodCs2KSsnIiAvPic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgLy8gRHJhdyBiYXJzCgogICAgICAgIHZhciBtaW5fYmFyX2hlaWdodCA9IE1hdGguY2VpbChncmFwaC55X2F4aXMubWF4X3Jldmlld3MgLyBncmFwaC55X2F4aXMuaGVpZ2h0KTsKICAgICAgICBmb3IgKHZhciBidW5kbGVfaWR4IGluIGdyYXBoLmJ1bmRsZXMpIHsKICAgICAgICAgICAgdmFyIGJ1bmRsZSA9IGdyYXBoLmJ1bmRsZXNbYnVuZGxlX2lkeF07CiAgICAgICAgICAgIHZhciBiYXJfcGFydHMgPSBbXTsKICAgICAgICAgICAgdmFyIHN0YXRzID0gYnVuZGxlLnN0YXRzOwoKICAgICAgICAgICAgdmFyIHgxID0gTWF0aC5yb3VuZChidW5kbGUuc3RhcnRfdGltZSAqIGdyYXBoLnRpY19zcGFjaW5nKTsKICAgICAgICAgICAgdmFyIHgyID0gTWF0aC5yb3VuZChidW5kbGUuZW5kX3RpbWUgKiBncmFwaC50aWNfc3BhY2luZyk7CiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5tYXhfYmFyX3dpZHRoID4gMCkgeDIgPSBNYXRoLm1pbih4MSArIHNldHRpbmdzLm1heF9iYXJfd2lkdGgsIHgyKTsKCiAgICAgICAgICAgIHN3aXRjaCAoc2V0dGluZ3MuYmFyX3N0eWxlKSB7CiAgICAgICAgICAgICAgICBjYXNlICdjb3VudCc6CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzLmNvdW50KSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2NvdW50JywgaGVpZ2h0OnN0YXRzLmNvdW50fSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgY2FzZSAnaXRlbV90eXBlJzoKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMucmFkKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J3JhZCcsIGhlaWdodDpzdGF0cy5yYWR9KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMua2FuKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2thbicsIGhlaWdodDpzdGF0cy5rYW59KTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHMudm9jKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J3ZvYycsIGhlaWdodDpzdGF0cy52b2N9KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlICdzcnNfc3RhZ2UnOgogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5hcHByKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2FwcHInLCBoZWlnaHQ6c3RhdHMuYXBwcn0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5ndXJ1KSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2d1cnUnLCBoZWlnaHQ6c3RhdHMuZ3VydX0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5tYXN0KSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J21hc3QnLCBoZWlnaHQ6c3RhdHMubWFzdH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5lbmxpKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2VubGknLCBoZWlnaHQ6c3RhdHMuZW5saX0pOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0cy5idXJuKSBiYXJfcGFydHMucHVzaCh7Y2xhc3M6J2J1cm4nLCBoZWlnaHQ6c3RhdHMuYnVybn0pOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgJ2xldmVsJzoKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBncnBfaWR4ID0gMDsgZ3JwX2lkeCA8PSA1OyBncnBfaWR4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGdycF9uYW1lID0gJ2x2bGdycCcrZ3JwX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRzW2dycF9uYW1lXSkgYmFyX3BhcnRzLnB1c2goe2NsYXNzOidsdmxncnAnK2dycF9pZHgsIGhlaWdodDpzdGF0c1tncnBfbmFtZV19KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGJhcl9vZmZzZXQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBwYXJ0X2lkeCBpbiBiYXJfcGFydHMpIHsKICAgICAgICAgICAgICAgIHZhciBwYXJ0ID0gYmFyX3BhcnRzW3BhcnRfaWR4XTsKICAgICAgICAgICAgICAgIGlmICgocGFydF9pZHggPT0gYmFyX3BhcnRzLmxlbmd0aC0xKSAmJiAoYmFyX29mZnNldCArIHBhcnQuaGVpZ2h0IDwgbWluX2Jhcl9oZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydC5oZWlnaHQgPSBtaW5fYmFyX2hlaWdodCAtIGJhcl9vZmZzZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBiYXJzICs9ICc8cmVjdCBjbGFzcz0iYmFyICcrcGFydC5jbGFzcysnIiB4PSInKyh4MSsxKSsnIiB5PSInK2Jhcl9vZmZzZXQrJyIgd2lkdGg9IicrKHgyLXgxLTMpKyciIGhlaWdodD0iJytwYXJ0LmhlaWdodCsnIiAvPic7CiAgICAgICAgICAgICAgICBiYXJfb2Zmc2V0ICs9IHBhcnQuaGVpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiYXJfcGFydHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgYmFyX292ZXJsYXlzICs9ICc8cmVjdCBjbGFzcz0iYmFyIG92ZXJsYXkiIHg9IicreDErJyIgeT0iMCIgd2lkdGg9IicrKHgyLXgxKSsnIiBoZWlnaHQ9IicrZ3JhcGgueV9heGlzLm1heF9yZXZpZXdzKyciIGRhdGEtYnVuZGxlPSInK2J1bmRsZV9pZHgrJyIgLz4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgbWFya2VyX3g7CiAgICAgICAgICAgIG1hcmtlcl94ID0gZ3JhcGgubWFyZ2luLmxlZnQgKyBNYXRoLmZsb29yKCh4MSt4MikvMik7CiAgICAgICAgICAgIGlmIChidW5kbGUuc3RhdHMuaGFzX2N1cnJfbWFya2VyICYmIHNldHRpbmdzLmN1cnJlbnRfbGV2ZWxfbWFya2VycyAhPT0gJ25vbmUnKSB7CiAgICAgICAgICAgICAgICBtYXJrZXJzICs9ICc8cGF0aCBjbGFzcz0iY3VyIiBkPSJNJyttYXJrZXJfeCsnLCcrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0KzEpKydsLTMsNmg2eiIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQgPiAwICYmIHNldHRpbmdzLmJ1cm5fbWFya2VycyA9PT0gJ3Nob3cnKSB7CiAgICAgICAgICAgICAgICBtYXJrZXJzICs9ICc8cGF0aCBjbGFzcz0iYnVyIiBkPSJNJyttYXJrZXJfeCsnLCcrKGdyYXBoLm1hcmdpbi50b3ArZ3JhcGhfaGVpZ2h0KzgpKydsLTMsNmg2eiIgLz4nOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgIC8vIEFzc2VtYmxlIHRoZSBIVE1MCgogICAgICAgIHBhbmVsLmh0bWwoCiAgICAgICAgICAgICc8c3ZnIGNsYXNzPSJncmFwaCBub3NlbGVjdCIgd2lkdGg9IicrcGFuZWxfd2lkdGgrJyIgaGVpZ2h0PSInK3BhbmVsX2hlaWdodCsnIj4nKwogICAgICAgICAgICAnICA8cmVjdCBjbGFzcz0iYmtnZCIgeD0iJytncmFwaC5tYXJnaW4ubGVmdCsnIiB5PSInK2dyYXBoLm1hcmdpbi50b3ArJyIgd2lkdGg9IicrZ3JhcGgueF9heGlzLndpZHRoKyciIGhlaWdodD0iJytncmFwaF9oZWlnaHQrJyIgLz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0iZ3JpZCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC41LDAuNSkiPicrCiAgICAgICAgICAgIGdyaWQrCiAgICAgICAgICAgICcgICAgPHBhdGggY2xhc3M9InNoYWRvdyIgZD0iTScrKGdyYXBoLm1hcmdpbi5sZWZ0LTIpKycsMHYnKyhncmFwaC5tYXJnaW4udG9wK2dyYXBoX2hlaWdodCkrJyxoJysoZ3JhcGgubWFyZ2luLmxlZnQrZ3JhcGgueF9heGlzLndpZHRoKzEpKyciIC8+JysKICAgICAgICAgICAgJyAgICA8cGF0aCBjbGFzcz0ibGlnaHQiIGQ9Ik0nKyhncmFwaC5tYXJnaW4ubGVmdC0xKSsnLDB2JysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQtMSkrJyIgLz4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJsaWdodCIgZD0iTScrKGdyYXBoLm1hcmdpbi5sZWZ0LTIpKycsJysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQrMSkrJ2gnKyhncmFwaC5tYXJnaW4ubGVmdCtncmFwaC54X2F4aXMud2lkdGgrMSkrJyIgLz4nKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJyAgPGcgY2xhc3M9ImxhYmVsLXgiPicrCiAgICAgICAgICAgIGxhYmVsX3guam9pbignJykrCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0ibGFiZWwteSI+JysKICAgICAgICAgICAgbGFiZWxfeSsKICAgICAgICAgICAgJyAgPC9nPicrCiAgICAgICAgICAgICcgIDxnIGNsYXNzPSJtYXJrZXJzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjUsMC41KSI+JysKICAgICAgICAgICAgbWFya2VycysKICAgICAgICAgICAgJyAgPC9nPicrCiAgICAgICAgICAgICcgIDxnIGNsYXNzPSJiYXJzIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgnK2dyYXBoLm1hcmdpbi5sZWZ0KycsJysoZ3JhcGgubWFyZ2luLnRvcCtncmFwaF9oZWlnaHQpKycpIHNjYWxlKDEsJysoLTEgKiBncmFwaF9oZWlnaHQgLyBncmFwaC55X2F4aXMubWF4X3Jldmlld3MpKycpIj4nKwogICAgICAgICAgICBiYXJzKwogICAgICAgICAgICBiYXJfb3ZlcmxheXMrCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0icmVzaXplX2dyaXAiPicrCiAgICAgICAgICAgICcgICAgPHBhdGggY2xhc3M9InNoYWRvdyIgZD0iTScrKHBhbmVsX3dpZHRoLTIpKycsJytwYW5lbF9oZWlnaHQrJ2wyLC0ybTAsLTRsLTYsNm0tNCwwbDEwLC0xMCIgLz4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJsaWdodCIgZD0iTScrKHBhbmVsX3dpZHRoLTMpKycsJytwYW5lbF9oZWlnaHQrJ2wzLC0zbTAsLTRsLTcsN20tNCwwbDExLC0xMSIgLz4nKwogICAgICAgICAgICAnICAgIDxyZWN0IGNsYXNzPSJib3VuZGFyeSIgeD0iMCIgeT0iJysocGFuZWxfaGVpZ2h0LTEzKSsnIiB3aWR0aD0iJytwYW5lbF93aWR0aCsnIiBoZWlnaHQ9IjEzIiAvPicrCiAgICAgICAgICAgICcgIDwvZz4nKwogICAgICAgICAgICAnICA8ZyBjbGFzcz0iaGlnaGxpZ2h0Ij4nKwogICAgICAgICAgICAnICAgIDxyZWN0IGNsYXNzPSJtYXJrZXIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDAsMC41KSIgeD0iJytncmFwaC5tYXJnaW4ubGVmdCsnIiB5PSInK2dyYXBoLm1hcmdpbi50b3ArJyIgd2lkdGg9IjAiIGhlaWdodD0iJytncmFwaF9oZWlnaHQrJyIgLz4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJtYXJrZXIgc3RhcnQiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0xMDAsMCkiIGQ9Ik0nK2dyYXBoLm1hcmdpbi5sZWZ0KycsJysoZ3JhcGgubWFyZ2luLnRvcC0xKSsnbC0zLC01aDZsLTMsNXYnKyhncmFwaF9oZWlnaHQrMSkrJyIgLz4nKwogICAgICAgICAgICAnICAgIDxwYXRoIGNsYXNzPSJtYXJrZXIgZW5kIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTAwLDApIiBkPSJNJytncmFwaC5tYXJnaW4ubGVmdCsnLCcrKGdyYXBoLm1hcmdpbi50b3AtMSkrJ2wtMywtNWg2bC0zLDV2JysoZ3JhcGhfaGVpZ2h0KzEpKyciIC8+JysKICAgICAgICAgICAgJyAgICA8cmVjdCBjbGFzcz0iYm91bmRhcnkiIHg9IicrKGdyYXBoLm1hcmdpbi5sZWZ0LTIpKyciIHk9IjAiIHdpZHRoPSInKyhncmFwaC54X2F4aXMud2lkdGgrMikrJyIgaGVpZ2h0PSInK2dyYXBoLm1hcmdpbi50b3ArJyIgLz4nKwogICAgICAgICAgICAnICA8L2c+JysKICAgICAgICAgICAgJzwvc3ZnPicKICAgICAgICApOwogICAgICAgIHBhbmVsLmhlaWdodChwYW5lbF9oZWlnaHQpOwoKICAgICAgICAvLyBBdHRhY2ggZXZlbnQgaGFuZGxlcnMKICAgICAgICBwYW5lbC5maW5kKCcucmVzaXplX2dyaXAgLmJvdW5kYXJ5Jykub24oJ21vdXNlZG93biB0b3VjaHN0YXJ0JywgcmVzaXplX3BhbmVsKTsKICAgICAgICBwYW5lbC5maW5kKCcuaGlnaGxpZ2h0IC5ib3VuZGFyeScpLm9uKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUgbW91c2Vtb3ZlIG1vdXNlZG93biB0b3VjaHN0YXJ0JywgaGlnaGxpZ2h0X2hvdmVyKTsKICAgICAgICBwYW5lbC5maW5kKCcuYmFyLm92ZXJsYXknKS5vbignbW91c2VlbnRlciBtb3VzZWxlYXZlJywgYmFyX2hvdmVyKTsKICAgICAgICBwYW5lbC5maW5kKCcuYmFyLm92ZXJsYXknKS5vbignY2xpY2snLCBiYXJfY2xpY2spOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciBjbGlja2luZyB0aW1lbGluZSBiYXJzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBiYXJfY2xpY2soZSkgewogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnbm9uZScpIHJldHVybjsKICAgICAgICBpZiAoaGlnaGxpZ2h0LmhpZ2hsaWdodGVkKSBoaWRlX2hpZ2hsaWdodCgpOwogICAgICAgIHZhciBidW5kbGVfaWR4ID0gTnVtYmVyKGUudGFyZ2V0LmF0dHJpYnV0ZXNbJ2RhdGEtYnVuZGxlJ10udmFsdWUpOwogICAgICAgIGhpZ2hsaWdodC5zdGFydCA9IGJ1bmRsZV9pZHg7CiAgICAgICAgaGlnaGxpZ2h0LmVuZCA9IGJ1bmRsZV9pZHggKyAxOwogICAgICAgIGhpZ2hsaWdodC5oaWdobGlnaHRlZCA9IHRydWU7CiAgICAgICAgZ3JhcGguZWxlbS5vZmYoJy5iYXJfaG92ZXJfbW92ZScpOwogICAgICAgIHNob3dfcmV2aWV3X2luZm8odHJ1ZSAvKiBzdGlja3kgKi8sIGUpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFdmVudCBoYW5kbGVyIGZvciBob3ZlcmluZyBvdmVyIHRpbWVsaW5lIGJhcnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGJhcl9ob3ZlcihlKSB7CiAgICAgICAgaWYgKHNldHRpbmdzLnNob3dfcmV2aWV3X2RldGFpbHMgPT09ICdub25lJykgcmV0dXJuOwogICAgICAgIGlmIChoaWdobGlnaHQuaGlnaGxpZ2h0ZWQpIHJldHVybjsKICAgICAgICBzd2l0Y2ggKGUudHlwZSkgewogICAgICAgICAgICBjYXNlICdtb3VzZWVudGVyJzoKICAgICAgICAgICAgICAgIHZhciBidW5kbGVfaWR4ID0gTnVtYmVyKGUudGFyZ2V0LmF0dHJpYnV0ZXNbJ2RhdGEtYnVuZGxlJ10udmFsdWUpOwogICAgICAgICAgICAgICAgaGlnaGxpZ2h0LnN0YXJ0ID0gYnVuZGxlX2lkeDsKICAgICAgICAgICAgICAgIGhpZ2hsaWdodC5lbmQgPSBidW5kbGVfaWR4ICsgMTsKICAgICAgICAgICAgICAgIHNob3dfcmV2aWV3X2luZm8oZmFsc2UgLyogc3RpY2t5ICovLCBlKTsKICAgICAgICAgICAgICAgIGdyYXBoLmVsZW0ub24oJ21vdXNlbW92ZS5iYXJfaG92ZXJfbW92ZScsIGZ1bmN0aW9uKGUpewogICAgICAgICAgICAgICAgICAgIGdyYXBoLnJldmlld19pbmZvLmNzcygndG9wJywgZS5jbGllbnRZIC0gZS50YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gMzApOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ21vdXNlbGVhdmUnOgogICAgICAgICAgICAgICAgZ3JhcGguZWxlbS5vZmYoJy5iYXJfaG92ZXJfbW92ZScpOwogICAgICAgICAgICAgICAgaGlkZV9yZXZpZXdfaW5mbygpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBCdWlsZCBhbmQgZGlzcGxheSB0aGUgUmV2aWV3IEluZm8gcG9wLXVwLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBzaG93X3Jldmlld19pbmZvKHN0aWNreSwgZSkgewogICAgICAgIHZhciBpbmZvID0gJCgnI3RpbWVsaW5lIC5yZXZpZXdfaW5mbycpOwogICAgICAgIGlmIChzdGlja3kpIHsKICAgICAgICAgICAgJCgnYm9keScpLm9mZignLnRpbWVsaW5lX2hpZGVpbmZvJyk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICQoJ2JvZHknKS5vbignY2xpY2sudGltZWxpbmVfaGlkZWluZm8nLCBmdW5jdGlvbihlKXsKICAgICAgICAgICAgICAgICAgICAkKCdib2R5Jykub2ZmKCcudGltZWxpbmVfaGlkZWluZm8nKTsKICAgICAgICAgICAgICAgICAgICBoaWRlX2hpZ2hsaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGhpZGVfcmV2aWV3X2luZm8oKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LCAxMCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3RhcnQgPSBNYXRoLm1pbihoaWdobGlnaHQuc3RhcnQsIGhpZ2hsaWdodC5lbmQpOwogICAgICAgIHZhciBlbmQgPSBNYXRoLm1heChoaWdobGlnaHQuc3RhcnQsIGhpZ2hsaWdodC5lbmQpOwoKICAgICAgICB2YXIgYnVuZGxlID0ge2l0ZW1zOltdfTsKICAgICAgICBmb3IgKHZhciBidW5kbGVfaWR4ID0gc3RhcnQ7IGJ1bmRsZV9pZHggPCBlbmQ7IGJ1bmRsZV9pZHgrKykgewogICAgICAgICAgICBidW5kbGUuaXRlbXMgPSBidW5kbGUuaXRlbXMuY29uY2F0KGdyYXBoLmJ1bmRsZXNbYnVuZGxlX2lkeF0uaXRlbXMpOwogICAgICAgIH0KCiAgICAgICAgY2FsY19idW5kbGVfc3RhdHMoYnVuZGxlKTsKCiAgICAgICAgLy8gUHJpbnQgdGhlIGRhdGUgb3IgZGF0ZSByYW5nZS4KICAgICAgICB2YXIgYWxsb3dfbm93ID0gKChzdGFydCA9PT0gMCkgJiYgKGdyYXBoLmJ1bmRsZV9zaXplID09PSAxKSk7CiAgICAgICAgdmFyIGh0bWwgPSAnPGRpdj4nOwogICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgIHZhciBzdGFydF9kYXRlID0gbmV3IERhdGUoZ3JhcGguc3RhcnRfdGltZS5nZXRUaW1lKCkgKyBidW5kbGVfdG9fdGljKHN0YXJ0KSAqIDM2MDAwMDApOwogICAgICAgIHZhciBlbmRfZGF0ZSA9IG5ldyBEYXRlKGdyYXBoLnN0YXJ0X3RpbWUuZ2V0VGltZSgpICsgYnVuZGxlX3RvX3RpYyhlbmQpICogMzYwMDAwMCArICh0aW1lX3NoaWZ0IC0gMSkgKiA2MDAwMCk7CiAgICAgICAgdmFyIHNhbWVfZGF5ID0gKG5ldyBEYXRlKHN0YXJ0X2RhdGUpLnNldEhvdXJzKDAsMCwwLDApID09IG5ldyBEYXRlKGVuZF9kYXRlKS5zZXRIb3VycygwLDAsMCwwKSk7CiAgICAgICAgdmFyIHNob3dfbW9udGggPSAoKG5vdy5nZXRNb250aCgpICE9IHN0YXJ0X2RhdGUuZ2V0TW9udGgoKSkgfHwgKChuZXcgRGF0ZShlbmRfZGF0ZSkuc2V0SG91cnMoMCwwLDAsMCkgLSBuZXcgRGF0ZShub3cpLnNldEhvdXJzKDAsMCwwLDApKSA+ICg2LjUgKiA4NjQwMDAwMCkpKTsKICAgICAgICBpZiAoKChlbmQtc3RhcnQpID4gMSkgfHwgKGdyYXBoLmJ1bmRsZV9zaXplID4gMSkpIHsKICAgICAgICAgICAgaHRtbCArPSBmb3JtYXRfZGF0ZShzdGFydF9kYXRlLCBhbGxvd19ub3csIHRydWUgLyogc2hvd19kYXkgKi8sIHNob3dfbW9udGgpICsgJyB0byAnICsgZm9ybWF0X2RhdGUoZW5kX2RhdGUsIGZhbHNlLCAhc2FtZV9kYXkgLyogc2hvd19kYXkgKi8sIHNob3dfbW9udGggJiYgIXNhbWVfZGF5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBodG1sICs9IGZvcm1hdF9kYXRlKHN0YXJ0X2RhdGUsIGFsbG93X25vdywgdHJ1ZSAvKiBzaG93X2RheSAqLywgc2hvd19tb250aCk7CiAgICAgICAgfQogICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CgogICAgICAgIC8vIFBvcHVsYXRlIGl0ZW0gdHlwZSBzdW1tYXJpZXMuCiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3VtbWFyeSI+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJ0b3QiPicrKGJ1bmRsZS5zdGF0cy5jb3VudCkrJyByZXZpZXdzPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJpbmRlbnQiPic7CgogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9Iml0ZW1fdHlwZSByYWQiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLnJhZCB8fCAwKSsnPC9zcGFuPiByYWRpY2FsczwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaXRlbV90eXBlIGthbiI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMua2FuIHx8IDApKyc8L3NwYW4+IGthbmppPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJpdGVtX3R5cGUgdm9jIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy52b2MgfHwgMCkrJzwvc3Bhbj4gdm9jYWJ1bGFyeTwvZGl2Pic7CgogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InNyc19zdGFnZSBhcHByIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5hcHByIHx8IDApKyc8L3NwYW4+IGFwcHJlbnRpY2U8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InNyc19zdGFnZSBndXJ1Ij48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5ndXJ1IHx8IDApKyc8L3NwYW4+IGd1cnU8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9InNyc19zdGFnZSBtYXN0Ij48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5tYXN0IHx8IDApKyc8L3NwYW4+IG1hc3RlcjwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3JzX3N0YWdlIGVubGkiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmVubGkgfHwgMCkrJzwvc3Bhbj4gZW5saWdodGVuZWQ8L2Rpdj4nOwogICAgICAgIGlmIChzZXR0aW5ncy5zcnNfY3Vycl9uZXh0ID09PSAnbmV4dCcpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ic3JzX3N0YWdlIGJ1cm4iPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmJ1cm4gfHwgMCkrJzwvc3Bhbj4gYnVybjwvZGl2Pic7CiAgICAgICAgfQoKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnAwIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnAwIHx8IDApKyc8L3NwYW4+IGxldmVscyAxLTEwPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnAxIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnAxIHx8IDApKyc8L3NwYW4+IGxldmVscyAxMS0yMDwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ibGV2ZWwgbHZsZ3JwMiI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubHZsZ3JwMiB8fCAwKSsnPC9zcGFuPiBsZXZlbHMgMjEtMzA8L2Rpdj4nOwogICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9ImxldmVsIGx2bGdycDMiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JysoYnVuZGxlLnN0YXRzLmx2bGdycDMgfHwgMCkrJzwvc3Bhbj4gbGV2ZWxzIDMxLTQwPC9kaXY+JzsKICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJsZXZlbCBsdmxncnA0Ij48c3BhbiBjbGFzcz0iZml4ZWQiPicrKGJ1bmRsZS5zdGF0cy5sdmxncnA0IHx8IDApKyc8L3NwYW4+IGxldmVscyA0MS01MDwvZGl2Pic7CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0ibGV2ZWwgbHZsZ3JwNSI+PHNwYW4gY2xhc3M9ImZpeGVkIj4nKyhidW5kbGUuc3RhdHMubHZsZ3JwNSB8fCAwKSsnPC9zcGFuPiBsZXZlbHMgNTEtNjA8L2Rpdj4nOwoKICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwoKICAgICAgICBpZiAoKGJ1bmRsZS5zdGF0cy5jdXJyX2NvdW50ID4gMCkgfHwgKGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID4gMCkpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaW5kZW50Ij4nOwogICAgICAgICAgICBpZiAoYnVuZGxlLnN0YXRzLmN1cnJfY291bnQgPiAwKSBodG1sICs9ICc8ZGl2IGNsYXNzPSJjdXIiPjxzcGFuIGNsYXNzPSJmaXhlZCI+JytidW5kbGUuc3RhdHMuY3Vycl9jb3VudCsnPC9zcGFuPiBDdXJyZW50IExldmVsPC9kaXY+JzsKICAgICAgICAgICAgaWYgKGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID4gMCkgaHRtbCArPSAnPGRpdiBjbGFzcz0iYnVyIj48c3BhbiBjbGFzcz0iZml4ZWQiPicrYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQrJzwvc3Bhbj4gQnVybiBJdGVtJysoYnVuZGxlLnN0YXRzLmJ1cm5fY291bnQgPiAxID8gJ3MnIDogJycpKyc8L2Rpdj4nOwogICAgICAgICAgICBodG1sICs9ICc8L2Rpdj4nOwogICAgICAgIH0KCiAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKCiAgICAgICAgaWYgKHNldHRpbmdzLnJldmlld19kZXRhaWxzX2J1dHRvbnMpIHsKICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iZGV0YWlsX2J1dHRvbnMiPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxidXR0b24gY2xhc3M9ImNvdW50Ij5SZXZpZXcgQ291bnQ8L2J1dHRvbj4nOwogICAgICAgICAgICBodG1sICs9ICc8YnV0dG9uIGNsYXNzPSJpdGVtX3R5cGUiPkl0ZW0gVHlwZTwvYnV0dG9uPic7CiAgICAgICAgICAgIGh0bWwgKz0gJzxidXR0b24gY2xhc3M9InNyc19zdGFnZSI+U1JTIExldmVsPC9idXR0b24+JzsKICAgICAgICAgICAgaHRtbCArPSAnPGJ1dHRvbiBjbGFzcz0ibGV2ZWwiPkxldmVsPC9idXR0b24+JzsKICAgICAgICAgICAgaHRtbCArPSAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnaXRlbV9saXN0JyB8fCBzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzID09PSAnZnVsbCcpIHsKICAgICAgICAgICAgaHRtbCA9IHBvcHVsYXRlX2l0ZW1fbGlzdChidW5kbGUsIGh0bWwpOwogICAgICAgIH0KCiAgICAgICAgaW5mby5maW5kKCcuaW5uZXInKS5odG1sKGh0bWwpOwogICAgICAgIGdyYXBoLnJldmlld19pbmZvID0gaW5mbzsKCiAgICAgICAgdmFyIG51bV93aWR0aCA9IGJ1bmRsZS5zdGF0cy5jb3VudC50b1N0cmluZygpOwogICAgICAgIGluZm8uZmluZCgnLnN1bW1hcnkgLmZpeGVkJykuY3NzKCd3aWR0aCcsIChudW1fd2lkdGgudG9TdHJpbmcoKS5sZW5ndGggKiA5ICsgOCkgKyAncHgnKTsKCiAgICAgICAgdmFyIHRvcCwgbGVmdCwgcmlnaHQsIHdpZHRoOwogICAgICAgIHZhciBoYWxmX3dpZHRoID0gZ3JhcGgueF9heGlzLndpZHRoLzI7CiAgICAgICAgdmFyIHggPSBidW5kbGVfdG9feChzdGFydCk7CiAgICAgICAgaW5mby5jc3MoJ21heC13aWR0aCcsIGhhbGZfd2lkdGgpOwogICAgICAgIGlmIChoaWdobGlnaHQuZHJhZ2dpbmcpIHsKICAgICAgICAgICAgdG9wID0gZ3JhcGgubWFyZ2luLnRvcCArIGdyYXBoLnlfYXhpcy5oZWlnaHQgKyBncmFwaC5tYXJnaW4uYm90dG9tOwogICAgICAgICAgICBpZiAoeCA8IGhhbGZfd2lkdGgpIHsKICAgICAgICAgICAgICAgIGxlZnQgPSBncmFwaC5tYXJnaW4ubGVmdCArIHg7CiAgICAgICAgICAgICAgICBpbmZvLmNzcyh7bGVmdDpsZWZ0LCByaWdodDonYXV0bycsIHRvcDp0b3B9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJpZ2h0ID0gMDsKICAgICAgICAgICAgICAgIGluZm8uY3NzKHtsZWZ0OidhdXRvJywgcmlnaHQ6cmlnaHQsIHRvcDp0b3B9KTsKICAgICAgICAgICAgICAgIGlmICh4IDwgZ3JhcGgueF9heGlzLndpZHRoIC0gaW5mby5vdXRlcldpZHRoKCkpIHsKICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gZ3JhcGgubWFyZ2luLmxlZnQgKyB4OwogICAgICAgICAgICAgICAgICAgIGluZm8uY3NzKHtsZWZ0OmxlZnQsIHJpZ2h0OidhdXRvJywgdG9wOnRvcH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChlKSB7CiAgICAgICAgICAgIHRvcCA9IGUuY2xpZW50WSAtIGUudGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIDMwOwogICAgICAgICAgICBpZiAoeCA8IGhhbGZfd2lkdGgpIHsKICAgICAgICAgICAgICAgIGxlZnQgPSBncmFwaC5tYXJnaW4ubGVmdCArIGJ1bmRsZV90b194KHN0YXJ0KzEpICsgNDsKICAgICAgICAgICAgICAgIGluZm8uY3NzKHtsZWZ0OmxlZnQsIHJpZ2h0OidhdXRvJywgdG9wOnRvcH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmlnaHQgPSBncmFwaC54X2F4aXMud2lkdGggLSBidW5kbGVfdG9feChzdGFydCkgKyA0OwogICAgICAgICAgICAgICAgaW5mby5jc3Moe2xlZnQ6J2F1dG8nLCByaWdodDpyaWdodCwgdG9wOnRvcH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpbmZvLnJlbW92ZUNsYXNzKCdoaWRkZW4nKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUG9wdWxhdGUgdGhlIGxpc3Qgb2YgaXRlbXMgcHJlc2VudCBpbiBhIHRpbWUgYnVuZGxlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBwb3B1bGF0ZV9pdGVtX2xpc3QoYnVuZGxlLCBodG1sKSB7CiAgICAgICAgdmFyIHNyc190b19jbGFzcyA9IHsKICAgICAgICAgICAgY3VycjogWydhcHByJywnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2d1cnUnLCdndXJ1JywnbWFzdCcsJ2VubGknXSwKICAgICAgICAgICAgbmV4dDogWydhcHByJywnYXBwcicsJ2FwcHInLCdhcHByJywnZ3VydScsJ2d1cnUnLCdtYXN0JywnZW5saScsJ2J1cm4nXQogICAgICAgIH07CiAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaXRlbV9pbmZvIGhpZGRlbiI+PC9kaXY+PHVsIGNsYXNzPSJpdGVtX2xpc3QiPic7CiAgICAgICAgZm9yICh2YXIgaXRlbV9pZHggaW4gYnVuZGxlLml0ZW1zKSB7CiAgICAgICAgICAgIHZhciBpdGVtID0gYnVuZGxlLml0ZW1zW2l0ZW1faWR4XTsKICAgICAgICAgICAgdmFyIGNsYXNzZXMgPSBbCiAgICAgICAgICAgICAgICBpdGVtLm9iamVjdC5zbGljZSgwLDMpLAogICAgICAgICAgICAgICAgc3JzX3RvX2NsYXNzW3NldHRpbmdzLnNyc19jdXJyX25leHRdW2l0ZW0uYXNzaWdubWVudHMuc3JzX3N0YWdlXSwKICAgICAgICAgICAgICAgICdsdmxncnAnK01hdGguZmxvb3IoKGl0ZW0uZGF0YS5sZXZlbC0xKS8xMCkKICAgICAgICAgICAgXTsKICAgICAgICAgICAgdmFyIGl0ZW1fbmFtZTsKICAgICAgICAgICAgaWYgKGl0ZW0ub2JqZWN0ID09PSAncmFkaWNhbCcpIHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLmRhdGEuY2hhcmFjdGVycykgewogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxsaSBjbGFzcz0iJytjbGFzc2VzLmpvaW4oJyAnKSsnIj4nK2l0ZW0uZGF0YS5jaGFyYWN0ZXJzKyc8L2xpPic7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxsaSBjbGFzcz0iJytjbGFzc2VzLmpvaW4oJyAnKSsnIiBkYXRhLXJhZG5hbWU9IicraXRlbS5kYXRhLnNsdWcrJyI+Li4uPC9saT4nOwogICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9ICcjdGltZWxpbmUgLnJldmlld19pbmZvIC5pdGVtX2xpc3QgPiBsaVtkYXRhLXJhZG5hbWU9IicraXRlbS5kYXRhLnNsdWcrJyJdJzsKICAgICAgICAgICAgICAgICAgICBsb2FkX3JhZGljYWxfc3ZnKGl0ZW0pLnRoZW4ocG9wdWxhdGVfcmFkaWNhbF9zdmcuYmluZChudWxsLCBzZWxlY3RvcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaHRtbCArPSAnPGxpIGNsYXNzPSInK2NsYXNzZXMuam9pbignICcpKyciPicraXRlbS5kYXRhLnNsdWcrJzwvbGk+JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBodG1sICs9ICc8L3VsPic7CiAgICAgICAgcmV0dXJuIGh0bWw7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEluc2VydCBhbiBzdmcgaW50byBhIHNwZWNpZmllZCBET00gZWxlbWVudC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gcG9wdWxhdGVfcmFkaWNhbF9zdmcoc2VsZWN0b3IsIHN2ZykgewogICAgICAgICQoc2VsZWN0b3IpLmh0bWwoc3ZnKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgaGFuZGxlciBmb3IgYnV0dG9ucyBvbiB0aGUgUmV2aWV3IEluZm8gcG9wLXVwLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBkZXRhaWxfYnV0dG9uX2NsaWNrZWQoZSkgewogICAgICAgIHZhciBtb2RlID0gZS50YXJnZXQuY2xhc3NOYW1lOwogICAgICAgICQoJyN0aW1lbGluZSAucmV2aWV3X2luZm8nKS5hdHRyKCdkYXRhLW1vZGUnLCBtb2RlKTsKICAgICAgICBzZXR0aW5ncy5yZXZpZXdfZGV0YWlsc19zdW1tYXJ5ID0gbW9kZTsKICAgICAgICBzYXZlX3NldHRpbmdzKCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV2ZW50IGhhbmRsZXIgZm9yIGhvdmVyaW5nIG92ZXIgYW4gaXRlbSBpbiB0aGUgUmV2aWV3IERldGFpbCBwb3AtdXAuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGl0ZW1faG92ZXIoZSkgewogICAgICAgIGlmIChzZXR0aW5ncy5zaG93X3Jldmlld19kZXRhaWxzICE9PSAnZnVsbCcpIHJldHVybjsKICAgICAgICB2YXIgaW5mbyA9ICQoJyN0aW1lbGluZSAuaXRlbV9pbmZvJyk7CiAgICAgICAgc3dpdGNoIChlLnR5cGUpIHsKICAgICAgICAgICAgY2FzZSAnbW91c2VlbnRlcic6CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gJChlLmN1cnJlbnRUYXJnZXQpOwogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBncmFwaC5jdXJyZW50X2J1bmRsZS5pdGVtc1t0YXJnZXQuaW5kZXgoKV07CiAgICAgICAgICAgICAgICB2YXIgcG9zID0gdGFyZ2V0LnBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICBpbmZvLmNzcyh7dG9wOnBvcy50b3ArdGFyZ2V0Lm91dGVySGVpZ2h0KCkrM30pOwogICAgICAgICAgICAgICAgcG9wdWxhdGVfaXRlbV9pbmZvKGluZm8sIGl0ZW0pOwogICAgICAgICAgICAgICAgaW5mby5yZW1vdmVDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ21vdXNlbGVhdmUnOgogICAgICAgICAgICAgICAgaW5mby5hZGRDbGFzcygnaGlkZGVuJyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhhbmRsZXIgZm9yIHJlc2l6aW5nIHRoZSB0aW1lbGluZSB3aGVuIHRoZSB3aW5kb3cgc2l6ZSBjaGFuZ2VzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiB3aW5kb3dfcmVzaXplZCgpIHsKICAgICAgICB2YXIgbmV3X3dpZHRoID0gZ3JhcGguZWxlbS53aWR0aCgpOwogICAgICAgIGlmIChuZXdfd2lkdGggIT0gZ3JhcGgueF9heGlzLndpZHRoICsgZ3JhcGgubWFyZ2luLmxlZnQpIHsKICAgICAgICAgICAgYnVuZGxlX2J5X3RpbWVzbG90KCk7CiAgICAgICAgICAgIGRyYXdfdGltZWxpbmUoKTsKICAgICAgICB9CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEdlbmVyYXRlIHRoZSBIVE1MIGNvbnRlbnQgb2YgdGhlIEl0ZW0gRGV0YWlsIHBvcC11cC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIHNyc19zdGFnZXMgPSBbJ0luaXRpYXRlJywgJ0FwcHJlbnRpY2UgMScsICdBcHByZW50aWNlIDInLCAnQXBwcmVudGljZSAzJywgJ0FwcHJlbnRpY2UgNCcsICdHdXJ1IDEnLCAnR3VydSAyJywgJ01hc3RlcicsICdFbmxpZ2h0ZW5lZCcsICdCdXJuZWQnXQogICAgZnVuY3Rpb24gcG9wdWxhdGVfaXRlbV9pbmZvKGluZm8sIGl0ZW0pIHsKICAgICAgICB2YXIgaHRtbDsKICAgICAgICBzd2l0Y2ggKGl0ZW0ub2JqZWN0KSB7CiAgICAgICAgICAgIGNhc2UgJ3JhZGljYWwnOgogICAgICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YS5jaGFyYWN0ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCA9ICc8c3BhbiBjbGFzcz0iaXRlbSI+UmFkaWNhbDogPHNwYW4gY2xhc3M9InNsdWciIGxhbmc9ImphIj4nK2l0ZW0uZGF0YS5jaGFyYWN0ZXJzKyc8L3NwYW4+PC9zcGFuPjxicj4nOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBodG1sID0gJzxzcGFuIGNsYXNzPSJpdGVtIj5SYWRpY2FsOiA8c3BhbiBjbGFzcz0ic2x1ZyIgZGF0YS1yYWRuYW1lPSInK2l0ZW0uZGF0YS5zbHVnKyciPi4uLjwvc3Bhbj48L3NwYW4+PGJyPic7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdG9yID0gJyN0aW1lbGluZSAuaXRlbV9pbmZvIFtkYXRhLXJhZG5hbWU9IicraXRlbS5kYXRhLnNsdWcrJyJdJzsKICAgICAgICAgICAgICAgICAgICBsb2FkX3JhZGljYWxfc3ZnKGl0ZW0pLnRoZW4ocG9wdWxhdGVfcmFkaWNhbF9zdmcuYmluZChudWxsLCBzZWxlY3RvcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdrYW5qaSc6CiAgICAgICAgICAgICAgICBodG1sID0gJzxzcGFuIGNsYXNzPSJpdGVtIj5LYW5qaTogPHNwYW4gY2xhc3M9InNsdWciIGxhbmc9ImphIj4nK2l0ZW0uZGF0YS5zbHVnKyc8L3NwYW4+PC9zcGFuPjxicj4nOwogICAgICAgICAgICAgICAgaHRtbCArPSBnZXRfaW1wb3J0YW50X3JlYWRpbmcoaXRlbSkrJzxicj4nOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICd2b2NhYnVsYXJ5JzoKICAgICAgICAgICAgICAgIGh0bWwgPSAnPHNwYW4gY2xhc3M9Iml0ZW0iPlZvY2FiOiA8c3BhbiBjbGFzcz0ic2x1ZyIgbGFuZz0iamEiPicraXRlbS5kYXRhLnNsdWcrJzwvc3Bhbj48L3NwYW4+PGJyPic7CiAgICAgICAgICAgICAgICBodG1sICs9ICdSZWFkaW5nOiAnK2dldF9yZWFkaW5nKGl0ZW0pKyc8YnI+JzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBodG1sICs9ICdNZWFuaW5nOiAnK2dldF9tZWFuaW5ncyhpdGVtKSsnPGJyPic7CiAgICAgICAgaHRtbCArPSAnTGV2ZWw6ICcraXRlbS5kYXRhLmxldmVsKyc8YnI+JzsKICAgICAgICBodG1sICs9ICdTUlMgTGV2ZWw6ICcraXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2UrJyAoJytzcnNfc3RhZ2VzW2l0ZW0uYXNzaWdubWVudHMuc3JzX3N0YWdlXSsnKSc7CiAgICAgICAgaW5mby5odG1sKGh0bWwpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBMb2FkIGEgcmFkaWNhbCdzIHN2ZyBmaWxlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBsb2FkX3JhZGljYWxfc3ZnKGl0ZW0pIHsKICAgICAgICB2YXIgcHJvbWlzZSA9IGdyYXBoLnJhZGljYWxfY2FjaGVbaXRlbS5kYXRhLnNsdWddOwogICAgICAgIGlmIChwcm9taXNlKSByZXR1cm4gcHJvbWlzZTsKICAgICAgICBpZiAoaXRlbS5kYXRhLmNoYXJhY3Rlcl9pbWFnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gcHJvbWlzZTsKICAgICAgICB2YXIgdXJsID0gaXRlbS5kYXRhLmNoYXJhY3Rlcl9pbWFnZXMuZmlsdGVyKGZ1bmN0aW9uKGltZyl7CiAgICAgICAgICAgIHJldHVybiAoaW1nLmNvbnRlbnRfdHlwZSA9PT0gJ2ltYWdlL3N2Zyt4bWwnICYmICFpbWcubWV0YWRhdGEuaW5saW5lX3N0eWxlcyk7CiAgICAgICAgfSlbMF0udXJsOwogICAgICAgIHByb21pc2UgPSB3a29mLmxvYWRfZmlsZSh1cmwpOwogICAgICAgIGdyYXBoLnJhZGljYWxfY2FjaGVbaXRlbS5kYXRhLnNsdWddID0gcHJvbWlzZTsKICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXh0cmFjdCB0aGUgbWVhbmluZ3MgKGluY2x1ZGluZyBzeW5vbnltcykgZnJvbSBhbiBpdGVtLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBnZXRfbWVhbmluZ3MoaXRlbSkgewogICAgICAgIHZhciBtZWFuaW5ncyA9IFtdOwogICAgICAgIGlmIChpdGVtLnN0dWR5X21hdGVyaWFscyAmJiBpdGVtLnN0dWR5X21hdGVyaWFscy5tZWFuaW5nX3N5bm9ueW1zKSB7CiAgICAgICAgICAgIG1lYW5pbmdzID0gaXRlbS5zdHVkeV9tYXRlcmlhbHMubWVhbmluZ19zeW5vbnltczsKICAgICAgICB9CiAgICAgICAgbWVhbmluZ3MgPSBtZWFuaW5ncy5jb25jYXQoaXRlbS5kYXRhLm1lYW5pbmdzLm1hcChtZWFuaW5nID0+IG1lYW5pbmcubWVhbmluZykpOwogICAgICAgIHJldHVybiB0b190aXRsZV9jYXNlKG1lYW5pbmdzLmpvaW4oJywgJykpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBFeHRyYWN0IHRoZSAnaW1wb3J0YW50JyByZWFkaW5ncyBmcm9tIGEga2FuamkuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGdldF9pbXBvcnRhbnRfcmVhZGluZyhpdGVtKSB7CiAgICAgICAgdmFyIHJlYWRpbmdzID0gaXRlbS5kYXRhLnJlYWRpbmdzLmZpbHRlcihyZWFkaW5nID0+IHJlYWRpbmcucHJpbWFyeSk7CiAgICAgICAgcmV0dXJuIHRvX3RpdGxlX2Nhc2UocmVhZGluZ3NbMF0udHlwZSkrJzogJytyZWFkaW5ncy5tYXAocmVhZGluZyA9PiByZWFkaW5nLnJlYWRpbmcpLmpvaW4oJywgJyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEV4dHJhY3QgdGhlIGxpc3Qgb2YgcmVhZGluZ3MgZnJvbSBhbiBpdGVtLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBnZXRfcmVhZGluZyhpdGVtKSB7CiAgICAgICAgcmV0dXJuIGl0ZW0uZGF0YS5yZWFkaW5ncy5tYXAocmVhZGluZyA9PiByZWFkaW5nLnJlYWRpbmcpLmpvaW4oJywgJyk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIEhpZGUgdGhlIFJldmlldyBJbmZvIHBvcC11cC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gaGlkZV9yZXZpZXdfaW5mbygpIHsKICAgICAgICAkKCcjdGltZWxpbmUgLnJldmlld19pbmZvJykuYWRkQ2xhc3MoJ2hpZGRlbicpOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBHZW5lcmF0ZSBhIGZvcm1hdHRlZCBkYXRlIHN0cmluZy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZm9ybWF0X2RhdGUodGltZSwgYWxsb3dfbm93LCBzaG93X2RheSwgc2hvd19tb250aCkgewogICAgICAgIHZhciBzdHIgPSAnJzsKICAgICAgICBpZiAoYWxsb3dfbm93ICYmIHRpbWUuZ2V0VGltZSgpID49IGdyYXBoLnN0YXJ0X3RpbWUuZ2V0VGltZSgpKSByZXR1cm4gJ05vdyc7CiAgICAgICAgaWYgKHNob3dfZGF5KSB7CiAgICAgICAgICAgIGlmIChuZXcgRGF0ZSh0aW1lKS5zZXRIb3VycygwLDAsMCwwKSA9PT0gKG5ldyBEYXRlKCkpLnNldEhvdXJzKDAsMCwwLDApKSB7CiAgICAgICAgICAgICAgICBzdHIgPSAnVG9kYXknOwogICAgICAgICAgICAgICAgc2hvd19tb250aCA9IGZhbHNlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3RyID0gJ1N1bk1vblR1ZVdlZFRodUZyaVNhdCcuc3Vic3RyKHRpbWUuZ2V0RGF5KCkqMywgMyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNob3dfbW9udGgpIHsKICAgICAgICAgICAgICAgIHN0ciArPSAnLCAnICsgJ0phbkZlYk1hckFwck1heUp1bkp1bEF1Z1NlcE9jdE5vdkRlYycuc3Vic3RyKHRpbWUuZ2V0TW9udGgoKSozLCAzKSArICcgJyArIHRpbWUuZ2V0RGF0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzZXR0aW5ncy50aW1lX2Zvcm1hdCA9PT0gJzI0aG91cicpIHsKICAgICAgICAgICAgc3RyICs9ICcgJyArICgnMCcgKyB0aW1lLmdldEhvdXJzKCkpLnNsaWNlKC0yKSArICc6JyArICgnMCcrdGltZS5nZXRNaW51dGVzKCkpLnNsaWNlKC0yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHIgKz0gJyAnICsgKCcwJyArICgoKHRpbWUuZ2V0SG91cnMoKSsxMSklMTIpKzEpKS5zbGljZSgtMikgKyAnOicrKCcwJyt0aW1lLmdldE1pbnV0ZXMoKSkuc2xpY2UoLTIpICsgJ2FwJ1tNYXRoLmZsb29yKHRpbWUuZ2V0SG91cnMoKS8xMildICsgJ20nOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyOwogICAgfQoKICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBGZXRjaCBpdGVtIGluZm8sIGFuZCByZWRyYXcgdGhlIHRpbWVsaW5lLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBmZXRjaF9hbmRfdXBkYXRlKCkgewogICAgICAgIHJldHVybiB3a29mLkl0ZW1EYXRhLmdldF9pdGVtcygnc3ViamVjdHMsIGFzc2lnbm1lbnRzLCBzdHVkeV9tYXRlcmlhbHMnKQogICAgICAgIC50aGVuKHByb2Nlc3NfaXRlbXMpCiAgICAgICAgLnRoZW4oZHJhd190aW1lbGluZSk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb2Nlc3MgdGhlIGZldGNoZWQgaXRlbXMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHByb2Nlc3NfaXRlbXMoZmV0Y2hlZF9pdGVtcykgewogICAgICAgIC8vIFJlbW92ZSBhbnkgdW5sZWFybmVkIGl0ZW1zLgogICAgICAgIGdyYXBoLml0ZW1zID0gW107CiAgICAgICAgZm9yICh2YXIgaWR4IGluIGZldGNoZWRfaXRlbXMpIHsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBmZXRjaGVkX2l0ZW1zW2lkeF07CiAgICAgICAgICAgIGlmICghaXRlbS5hc3NpZ25tZW50cyB8fCAhaXRlbS5hc3NpZ25tZW50cy5hdmFpbGFibGVfYXQgfHwgaXRlbS5hc3NpZ25tZW50cy5zcnNfc3RhZ2UgPD0gMCkgY29udGludWU7CiAgICAgICAgICAgIGlmIChpdGVtLmRhdGEubGV2ZWwgPiB3a29mLnVzZXIubGV2ZWwpIGNvbnRpbnVlOwogICAgICAgICAgICBncmFwaC5pdGVtcy5wdXNoKGl0ZW0pOwogICAgICAgIH0KCiAgICAgICAgZ3JhcGguaXRlbXMuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiAobmV3IERhdGUoYS5hc3NpZ25tZW50cy5hdmFpbGFibGVfYXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIuYXNzaWdubWVudHMuYXZhaWxhYmxlX2F0KS5nZXRUaW1lKCkpOwogICAgICAgIH0pOwoKICAgICAgICBidW5kbGVfYnlfdGltZXNsb3QoKTsKICAgICAgICB1cGRhdGVfc2xpZGVyX3Jldmlld3MoKTsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQnVuZGxlIHRoZSBpdGVtcyBpbnRvIHRpbWVzbG90cy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gYnVuZGxlX2J5X3RpbWVzbG90KCkgewogICAgICAgIHZhciBidW5kbGVfc2l6ZSA9IGdyYXBoLmJ1bmRsZV9zaXplID0gZ2V0X2hvdXJzX3Blcl9iYXIoKTsKICAgICAgICB2YXIgYnVuZGxlcyA9IGdyYXBoLmJ1bmRsZXMgPSBbXTsKICAgICAgICB2YXIgdGltZXNsb3RzID0gZ3JhcGgudGltZXNsb3RzID0gW107CgogICAgICAgIC8vIFJld2luZCB0aGUgY2xvY2sgdG8gdGhlIHN0YXJ0IG9mIGEgYnVuZGxlIHBlcmlvZC4KICAgICAgICB2YXIgc3RhcnRfdGltZSA9IHRvU3RhcnRPZlVUQ0hvdXIobmV3IERhdGUoKSk7CiAgICAgICAgd2hpbGUgKHN0YXJ0X3RpbWUuZ2V0SG91cnMoKSAlIGJ1bmRsZV9zaXplICE9PSAwKSBzdGFydF90aW1lID0gbmV3IERhdGUoc3RhcnRfdGltZS5nZXRUaW1lKCkgLSAzNjAwMDAwKTsKICAgICAgICBncmFwaC5zdGFydF90aW1lID0gc3RhcnRfdGltZTsKCiAgICAgICAgLy8gRmluZCB0aGUgdGljIG9mIHRoZSBsYXN0IGJ1bmRsZSAocm91bmQgZG93biBpZiBvbmx5IGEgcGFydGlhbCkuCiAgICAgICAgZ3JhcGgudG90YWxfcmV2aWV3cyA9IDA7CiAgICAgICAgZ3JhcGgubWF4X3Jldmlld3MgPSAwOwogICAgICAgIHZhciBob3VyID0gMCwgaXRlbV9pZHggPSAwLCBpdGVtX2NvdW50ID0gMDsKICAgICAgICB2YXIgYnVuZGxlID0ge3N0YXJ0X3RpbWU6aG91ciwgaXRlbXM6W119OwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIHRpbWVzbG90cy5wdXNoKGJ1bmRsZXMubGVuZ3RoKTsKICAgICAgICAgICAgaG91cisrOwogICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBwYXN0IGVuZCBvZiB0aGUgdGltZWxpbmUgKGluY2x1ZGluZyByb3VuZGluZyB1cCB0byB0aGUgbmVhcmVzdCBidW5kbGUpCiAgICAgICAgICAgIC8vIE5lZWQgdG8gdXNlIGRhdGUgZnVuY3Rpb24gdG8gYWNjb3VudCBmb3IgdGltZSBzaGlmdHMgKGUuZy4gRGF5bGlnaHQgU2F2aW5ncyBUaW1lKQogICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKHN0YXJ0X3RpbWUuZ2V0VGltZSgpICsgaG91ciAqIDM2MDAwMDApOwogICAgICAgICAgICBpZiAoKHRpbWUuZ2V0SG91cnMoKSAlIGJ1bmRsZV9zaXplKSAhPT0gMCkgY29udGludWU7CgogICAgICAgICAgICB2YXIgc3RhcnRfaWR4ID0gaXRlbV9pZHg7CiAgICAgICAgICAgIHdoaWxlICgoaXRlbV9pZHggPCBncmFwaC5pdGVtcy5sZW5ndGgpICYmCiAgICAgICAgICAgICAgICAgICAobmV3IERhdGUoZ3JhcGguaXRlbXNbaXRlbV9pZHhdLmFzc2lnbm1lbnRzLmF2YWlsYWJsZV9hdCkgPCB0aW1lKSkgewogICAgICAgICAgICAgICAgaXRlbV9pZHgrKzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgYnVuZGxlLml0ZW1zID0gZ3JhcGguaXRlbXMuc2xpY2Uoc3RhcnRfaWR4LCBpdGVtX2lkeCk7CiAgICAgICAgICAgIGJ1bmRsZS5lbmRfdGltZSA9IGhvdXI7CiAgICAgICAgICAgIGNhbGNfYnVuZGxlX3N0YXRzKGJ1bmRsZSk7CiAgICAgICAgICAgIGdyYXBoLmJ1bmRsZXMucHVzaChidW5kbGUpOwoKICAgICAgICAgICAgZ3JhcGgudG90YWxfcmV2aWV3cyArPSBidW5kbGUuaXRlbXMubGVuZ3RoOwogICAgICAgICAgICBpZiAoYnVuZGxlLml0ZW1zLmxlbmd0aCA+IGdyYXBoLm1heF9yZXZpZXdzKSBncmFwaC5tYXhfcmV2aWV3cyA9IGJ1bmRsZS5pdGVtcy5sZW5ndGg7CiAgICAgICAgICAgIGlmIChob3VyID49IGdyYXBoLnhfYXhpcy5tYXhfaG91cnMpIGJyZWFrOwoKICAgICAgICAgICAgYnVuZGxlID0ge3N0YXJ0X3RpbWU6aG91ciwgaXRlbXM6W119OwogICAgICAgIH0KICAgICAgICBncmFwaC54X2F4aXMubWF4X2hvdXJzID0gaG91cjsKICAgIH0KCiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gQ2FsY3VsYXRlIHN0YXRzIGZvciBhIGJ1bmRsZQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBjYWxjX2J1bmRsZV9zdGF0cyhidW5kbGUpIHsKICAgICAgICB2YXIgaXR5cGVfdG9faW50ID0ge3JhZGljYWw6MCwga2Fuamk6MSwgdm9jYWJ1bGFyeToyfTsKICAgICAgICB2YXIgaXR5cGVfdG9fY2xhc3MgPSB7cmFkaWNhbDoncmFkJywga2Fuamk6J2thbicsIHZvY2FidWxhcnk6J3ZvYyd9OwogICAgICAgIHZhciBzcnNfdG9fY2xhc3MgPSB7CiAgICAgICAgICAgIGN1cnI6IFsnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2FwcHInLCdndXJ1JywnZ3VydScsJ21hc3QnLCdlbmxpJ10sCiAgICAgICAgICAgIG5leHQ6IFsnYXBwcicsJ2FwcHInLCdhcHByJywnYXBwcicsJ2d1cnUnLCdndXJ1JywnbWFzdCcsJ2VubGknLCdidXJuJ10KICAgICAgICB9OwogICAgICAgIGJ1bmRsZS5pdGVtcy5zb3J0KGZ1bmN0aW9uKGEsIGIpewogICAgICAgICAgICB2YXIgYV9pdHlwZSA9IGl0eXBlX3RvX2ludFthLm9iamVjdF07CiAgICAgICAgICAgIHZhciBiX2l0eXBlID0gaXR5cGVfdG9faW50W2Iub2JqZWN0XTsKICAgICAgICAgICAgaWYgKGFfaXR5cGUgIT09IGJfaXR5cGUpIHJldHVybiBhX2l0eXBlIC0gYl9pdHlwZTsKICAgICAgICAgICAgaWYgKGEuZGF0YS5sZXZlbCAhPT0gYi5kYXRhLmxldmVsKSByZXR1cm4gYS5kYXRhLmxldmVsIC0gYi5kYXRhLmxldmVsOwogICAgICAgICAgICByZXR1cm4gYS5kYXRhLnNsdWcubG9jYWxlQ29tcGFyZShiLmRhdGEuc2x1Zyk7CiAgICAgICAgfSk7CiAgICAgICAgYnVuZGxlLnN0YXRzID0gewogICAgICAgICAgICBjb3VudDowLAogICAgICAgICAgICByYWQ6MCwga2FuOjAsIHZvYzowLAogICAgICAgICAgICBhcHByOjAsIGd1cnU6MCwgbWFzdDowLCBlbmxpOjAsIGJ1cm46MCwKICAgICAgICAgICAgbHZsZ3JwMDowLCBsdmxncnAxOjAsIGx2bGdycDI6MCwgbHZsZ3JwMzowLCBsdmxncnA0OjAsIGx2bGdycDU6MCwKICAgICAgICAgICAgY3Vycl9jb3VudDogMCwKICAgICAgICAgICAgaGFzX2N1cnJfbWFya2VyOiBmYWxzZSwKICAgICAgICAgICAgYnVybl9jb3VudDogMAogICAgICAgIH07CiAgICAgICAgdmFyIHN0YXRzID0gYnVuZGxlLnN0YXRzOwogICAgICAgIGZvciAodmFyIGl0ZW1faWR4IGluIGJ1bmRsZS5pdGVtcykgewogICAgICAgICAgICB2YXIgaXRlbSA9IGJ1bmRsZS5pdGVtc1tpdGVtX2lkeF07CiAgICAgICAgICAgIHN0YXRzLmNvdW50Kys7CiAgICAgICAgICAgIHN0YXRzW2l0eXBlX3RvX2NsYXNzW2l0ZW0ub2JqZWN0XV0rKzsKICAgICAgICAgICAgc3RhdHNbc3JzX3RvX2NsYXNzW3NldHRpbmdzLnNyc19jdXJyX25leHRdW2l0ZW0uYXNzaWdubWVudHMuc3JzX3N0YWdlXV0rKzsKICAgICAgICAgICAgc3RhdHNbJ2x2bGdycCcrTWF0aC5mbG9vcigoaXRlbS5kYXRhLmxldmVsLTEpLzEwKV0rKzsKICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YS5sZXZlbCA9PT0gd2tvZi51c2VyLmxldmVsKSB7CiAgICAgICAgICAgICAgICBzdGF0cy5jdXJyX2NvdW50Kys7CiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuY3VycmVudF9sZXZlbF9tYXJrZXJzLmluZGV4T2YoaXRlbS5vYmplY3RbMF0pID49IDApIHsKICAgICAgICAgICAgICAgICAgICBzdGF0cy5oYXNfY3Vycl9tYXJrZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJ1bmRsZS5zdGF0cy5idXJuX2NvdW50ID0gYnVuZGxlLnN0YXRzW3Nyc190b19jbGFzc1tzZXR0aW5ncy5zcnNfY3Vycl9uZXh0XVs4XV07CiAgICAgICAgZ3JhcGguY3VycmVudF9idW5kbGUgPSBidW5kbGU7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFJldHVybiB0aGUgdGltZXN0YW1wIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgVVRDIGhvdXIuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvU3RhcnRPZlVUQ0hvdXIoZGF0ZSkgewogICAgICAgIHZhciBkID0gKGRhdGUgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZS5nZXRUaW1lKCkgOiBkYXRlKTsKICAgICAgICBkID0gTWF0aC5mbG9vcihkLzM2MDAwMDApKjM2MDAwMDA7CiAgICAgICAgcmV0dXJuIChkYXRlIGluc3RhbmNlb2YgRGF0ZSA/IG5ldyBEYXRlKGQpIDogZCk7CiAgICB9CgogICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFN0YXJ0IGEgdGltZXIgdG8gcmVmcmVzaCB0aGUgdGltZWxpbmUgKHdpdGhvdXQgZmV0Y2gpIGF0IHRoZSB0b3Agb2YgdGhlIGhvdXIuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHN0YXJ0X3JlZnJlc2hfdGltZXIoKSB7CiAgICAgICAgdmFyIG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgdmFyIG5leHRfaG91ciA9IHRvU3RhcnRPZlVUQ0hvdXIobm93KSArIDM2MDEwMDA7IC8vIDEgc2Vjb25kIHBhc3QgdGhlIG5leHQgVVRDIGhvdXIuCiAgICAgICAgdmFyIHdhaXRfdGltZSA9IChuZXh0X2hvdXIgLSBub3cpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgYnVuZGxlX2J5X3RpbWVzbG90KCk7CiAgICAgICAgICAgIHVwZGF0ZV9zbGlkZXJfcmV2aWV3cygpOwogICAgICAgICAgICBkcmF3X3RpbWVsaW5lKCk7CiAgICAgICAgICAgIHN0YXJ0X3JlZnJlc2hfdGltZXIoKTsKICAgICAgICB9LCB3YWl0X3RpbWUpOwogICAgfQoKfSkod2luZG93LnRpbWVsaW5lKTsK" 227 + "uuid": "898d914c-c6aa-4606-abf9-fcc0e7385841" 267 228 }, 268 229 { 230 + "enabled": true, 231 + "file_url": "https://greasyfork.org/scripts/723-wanikani-stroke-order/code/WaniKani%20Stroke%20Order.user.js", 269 232 "name": "WaniKani Stroke Order", 270 233 "options": { 234 + "awareOfChrome": false, 271 235 "check_for_updates": true, 272 236 "comment": null, 273 - "compatopts_for_requires": true, 274 - "compat_wrappedjsobject": false, 237 + "compat_arrayleft": false, 238 + "compat_foreach": false, 239 + "compat_forvarin": false, 275 240 "compat_metadata": false, 276 - "compat_foreach": false, 277 - "compat_arrayleft": false, 241 + "compat_powerful_this": null, 278 242 "compat_uW_gmonkey": false, 279 - "compat_forvarin": false, 243 + "compat_wrappedjsobject": false, 244 + "compatopts_for_requires": true, 280 245 "noframes": null, 281 - "awareOfChrome": false, 282 - "run_at": null, 283 246 "override": { 284 - "use_includes": [], 247 + "merge_connects": true, 248 + "merge_excludes": true, 249 + "merge_includes": true, 250 + "merge_matches": true, 251 + "orig_excludes": [], 285 252 "orig_includes": [ 286 253 "http*://*wanikani.com/kanji/*", 287 254 "http*://*wanikani.com/level/*/kanji/*", 288 255 "http*://*wanikani.com/review/session", 289 256 "http*://*wanikani.com/lesson/session" 290 257 ], 291 - "merge_includes": true, 292 - "use_matches": [], 293 258 "orig_matches": [], 294 - "merge_matches": true, 295 - "use_excludes": [], 296 - "orig_excludes": [], 297 - "merge_excludes": true, 259 + "orig_noframes": null, 260 + "orig_run_at": "document-idle", 261 + "use_blockers": [], 298 262 "use_connects": [ 299 263 "jisho.org" 300 264 ], 301 - "merge_connects": true, 302 - "use_blockers": [], 303 - "orig_run_at": "document-idle", 304 - "orig_noframes": null 305 - } 265 + "use_excludes": [], 266 + "use_includes": [], 267 + "use_matches": [] 268 + }, 269 + "run_at": null, 270 + "tab_types": null 306 271 }, 307 - "storage": { 308 - "data": {}, 309 - "ts": 1607436649628 310 - }, 311 - "enabled": true, 312 - "position": 6, 313 - "file_url": "https://greasyfork.org/scripts/723-wanikani-stroke-order/code/WaniKani%20Stroke%20Order.user.js", 314 - "uuid": "648066f1-2454-460b-9217-49d3d4376da9", 315 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlLYW5pIFN0cm9rZSBPcmRlcgovLyBAbmFtZXNwYWNlICAgamFwYW5lc2UKLy8gQGRlc2NyaXB0aW9uIFNob3dzIGEga2FuamkncyBzdHJva2Ugb3JkZXIgb24gaXRzIHBhZ2UgYW5kIGR1cmluZyBsZXNzb25zIGFuZCByZXZpZXdzLgovLyBAbGljZW5zZSAgICAgR1BMIHZlcnNpb24gMyBvciBhbnkgbGF0ZXIgdmVyc2lvbjsgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCi8vIEBpbmNsdWRlICAgICBodHRwKjovLyp3YW5pa2FuaS5jb20va2FuamkvKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly8qd2FuaWthbmkuY29tL2xldmVsLyova2FuamkvKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly8qd2FuaWthbmkuY29tL3Jldmlldy9zZXNzaW9uCi8vIEBpbmNsdWRlICAgICBodHRwKjovLyp3YW5pa2FuaS5jb20vbGVzc29uL3Nlc3Npb24KLy8gQHZlcnNpb24gICAgIDEuMS4yCi8vIEBncmFudCAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAcmVxdWlyZSAgICAgaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjEwLjIvanF1ZXJ5Lm1pbi5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCi8qCiAqIFRoYW5rcyBhIGxvdCB0byAuLi4KICogV2FuaWthbmkgUGhvbmV0aWMtU2VtYW50aWMgQ29tcG9zaXRpb24gLSBVc2Vyc2NyaXB0CiAqIGJ5IHJ1aXBncGluaGVpcm8gKExvcmRHcmF2ZXdpc2gpCiAqIC4uLiBmb3IgY29kZSBzaG93aW5nIG1lIGhvdyB0byBpbnNlcnQgc2VjdGlvbnMgZHVyaW5nIGthbmppIHJldmlld3MuCiAqIFRoZSBjb2RlIGhlYXZpbHkgYm9ycm93cyBmcm9tIHRoYXQgc2NyaXB0IQogKiBBbHNvIHRoYW5rcyB0byBIYWxvIGZvciBhIGxvYWRpbmcgYnVnIGZpeCEKICovCgovKgogKiBIZWxwZXIgRnVuY3Rpb25zL1ZhcmlhYmxlcwogKi8KJCA9IHVuc2FmZVdpbmRvdy4kOwoKLyoKICogR2xvYmFsIFZhcmlhYmxlcy9PYmplY3RzL0NsYXNzZXMKICovCnZhciBQYWdlRW51bSA9IE9iamVjdC5mcmVlemUoeyB1bmtub3duOjAsIGthbmppOjEsIHJldmlld3M6MiwgbGVzc29uczozIH0pOwp2YXIgY3VyUGFnZSA9IFBhZ2VFbnVtLnVua25vd247CnZhciBKSVNITyA9ICJodHRwOi8vY2xhc3NpYy5qaXNoby5vcmciOwoKLyoKICogTWFpbgogKi8KZnVuY3Rpb24gaW5pdCgpIHsKICAgIC8vIERldGVybWluZSBwYWdlIHR5cGUKICAgIGlmICgvXC9rYW5qaVwvLi8udGVzdChkb2N1bWVudC5VUkwpKSB7CiAgICAgICAgY3VyUGFnZSA9IFBhZ2VFbnVtLmthbmppOwogICAgfSBlbHNlIGlmICgvXC9yZXZpZXcvLnRlc3QoZG9jdW1lbnQuVVJMKSkgewogICAgICAgIGN1clBhZ2UgPSBQYWdlRW51bS5yZXZpZXdzOwogICAgfSBlbHNlIGlmICgvXC9sZXNzb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgewogICAgICAgIGN1clBhZ2UgPSBQYWdlRW51bS5sZXNzb25zOwogICAgfQoKICAgIC8vIENyZWF0ZSBhbmQgc3RvcmUgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGhvbGQgdGhlIGltYWdlCiAgICB1bnNhZmVXaW5kb3cuZGlhZ3JhbSA9IGNyZWF0ZURpYWdyYW1TZWN0aW9uKCk7CgogICAgLy8gUmVnaXN0ZXIgY2FsbGJhY2sgZm9yIHdoZW4gdG8gbG9hZCBzdHJva2Ugb3JkZXIKICAgIHN3aXRjaCAoY3VyUGFnZSkgewogICAgICAgIGNhc2UgUGFnZUVudW0ua2Fuamk6CiAgICAgICAgICAgIGxvYWREaWFncmFtKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUGFnZUVudW0ucmV2aWV3czoKICAgICAgICAgICAgdmFyIG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsKICAgICAgICAgICAgICAgLy8gVGhlIGxhc3Qgb25lIGFsd2F5cyBoYXMgMiBtdXRhdGlvbnMsIHNvIGxldCdzIHVzZSB0aGF0CiAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbnMubGVuZ3RoICE9IDIpCiAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAvLyBSZXZpZXdzIGR5bmFtaWNhbGx5IGdlbmVyYXRlIHRoZSBET00uIFdlIGFsd2F5cyBuZWVkIHRvIHJlLWluc2VydCB0aGUgZWxlbWVudAogICAgICAgICAgICAgICBpZiAoZ2V0S2FuamkoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWFncmFtID0gY3JlYXRlRGlhZ3JhbVNlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhZ3JhbSAhPT0gbnVsbCAmJiBkaWFncmFtLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zYWZlV2luZG93LmRpYWdyYW0gPSBkaWFncmFtOwogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRGlhZ3JhbSgpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0sIDE1MCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG8ub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXRlbS1pbmZvJyksIHsnYXR0cmlidXRlcycgOiB0cnVlfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUGFnZUVudW0ubGVzc29uczoKICAgICAgICAgICAgdmFyIG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcihsb2FkRGlhZ3JhbSk7CiAgICAgICAgICAgIG8ub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VwcGxlbWVudC1rYW4nKSwgeydhdHRyaWJ1dGVzJyA6IHRydWV9KTsKICAgICAgICAgICAgbG9hZERpYWdyYW0oKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCmlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICBpbml0KCk7Cn0gZWxzZSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGluaXQpOwp9CgovKgogKiBSZXR1cm5zIHRoZSBjdXJyZW50IGthbmppCiAqLwpmdW5jdGlvbiBnZXRLYW5qaSgpIHsKICAgIHN3aXRjaChjdXJQYWdlKSB7CiAgICAgICAgY2FzZSBQYWdlRW51bS5rYW5qaToKICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnRpdGxlW2RvY3VtZW50LnRpdGxlLmxlbmd0aCAtIDFdOwoKICAgICAgICBjYXNlIFBhZ2VFbnVtLnJldmlld3M6CiAgICAgICAgICAgIHZhciBjdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImN1cnJlbnRJdGVtIik7CiAgICAgICAgICAgIGlmKCJrYW4iIGluIGN1ckl0ZW0pCiAgICAgICAgICAgICAgICByZXR1cm4gY3VySXRlbS5rYW4udHJpbSgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgY2FzZSBQYWdlRW51bS5sZXNzb25zOgogICAgICAgICAgICB2YXIga2FuamlOb2RlID0gJCgiI2NoYXJhY3RlciIpOwoKICAgICAgICAgICAgaWYoa2FuamlOb2RlID09PSB1bmRlZmluZWQgfHwga2FuamlOb2RlID09PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICByZXR1cm4ga2FuamlOb2RlLnRleHQoKS50cmltKCk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7Cn0KCi8qCiAqIENyZWF0ZXMgYSBzZWN0aW9uIGZvciB0aGUgZGlhZ3JhbSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXRzIGNvbnRlbnQKICovCmZ1bmN0aW9uIGNyZWF0ZURpYWdyYW1TZWN0aW9uKCkgewoKICAgIC8vIFJldmlld3MgaGFjazogT25seSBkbyBpdCBvbmNlCiAgICBpZiAoJCgnI3N0cm9rZV9vcmRlcicpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgdmFyIHNlY3Rpb25IVE1MID0gJzxzZWN0aW9uPjxoMj5TdHJva2UgT3JkZXI8L2gyPjxwIGlkPSJzdHJva2Vfb3JkZXIiPiZuYnNwOzwvcD48L3NlY3Rpb24+JzsKCiAgICAgICAgc3dpdGNoKGN1clBhZ2UpIHsKICAgICAgICAgICAgY2FzZSBQYWdlRW51bS5rYW5qaToKICAgICAgICAgICAgICAgICQoc2VjdGlvbkhUTUwpLmluc2VydEFmdGVyKCcjaW5mb3JtYXRpb24nKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFBhZ2VFbnVtLnJldmlld3M6CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygicHJlcGVuZCIpOwogICAgICAgICAgICAgICAgJCgnI2l0ZW0taW5mby1jb2wyJykucHJlcGVuZChzZWN0aW9uSFRNTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBQYWdlRW51bS5sZXNzb25zOgogICAgICAgICAgICAgICAgJCgnI3N1cHBsZW1lbnQta2FuLWJyZWFrZG93biAuY29sMScpLmFwcGVuZChzZWN0aW9uSFRNTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICQoJyNzdHJva2Vfb3JkZXInKTsKfQoKLyoKICogQWRkcyB0aGUgZGlhZ3JhbSBzZWN0aW9uIGVsZW1lbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uCiAqLwpmdW5jdGlvbiBsb2FkRGlhZ3JhbSgpIHsKCiAgICBpZiAoIXVuc2FmZVdpbmRvdyB8fCAhdW5zYWZlV2luZG93LmRpYWdyYW0ubGVuZ3RoKQogICAgICAgIHJldHVybjsKCiAgICB1bnNhZmVXaW5kb3cuZGlhZ3JhbS5odG1sKCJMb2FkaW5nLi4uIik7CgogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgIHVybDogSklTSE8gKyAiL2thbmppL2RldGFpbHMvIiArIGdldEthbmppKCksCiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24oeGhyKSB7CiAgICAgICAgICAgICAgICB2YXIgZGlhZ3JhbSA9IHVuc2FmZVdpbmRvdy5kaWFncmFtOwogICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWdyYW1VUkwgPSB4aHIucmVzcG9uc2VUZXh0Lm1hdGNoKC9cL3N0YXRpY1wvaW1hZ2VzXC9zdHJva2VfZGlhZ3JhbXNcL1swLTldK19mcmFtZXNcLnBuZy8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdyYW0uaHRtbCgnPGltZyBzcmM9IicgKyBKSVNITyArIGRpYWdyYW1VUkxbMF0gKyAnIiBhbHQ9IlN0cm9rZSBvcmRlciBkaWFncmFtIiAvPicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy5kaWFncmFtLmh0bWwoIkVycm9yIHdoaWxlIGxvYWRpbmcgZGlhZ3JhbSIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbih4aHIpIHsKICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy5kaWFncmFtLmh0bWwoIkVycm9yIHdoaWxlIGxvYWRpbmcgZGlhZ3JhbSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LCAwKTsKfQ==", 272 + "position": 5, 316 273 "requires": [ 317 274 { 318 275 "meta": { 276 + "mimetype": "text/javascript", 319 277 "name": "jquery.min.js", 320 - "url": "http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js", 321 - "ts": 1607436649625, 322 - "mimetype": "text/javascript" 278 + "ts": 1649272272962, 279 + "url": "http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js" 323 280 }, 324 281 "source": "LyohIGpRdWVyeSB2MS4xMC4yIHwgKGMpIDIwMDUsIDIwMTMgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UKLy9AIHNvdXJjZU1hcHBpbmdVUkw9anF1ZXJ5Lm1pbi5tYXAKKi8KKGZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXR5cGVvZiB0LG89ZS5sb2NhdGlvbixhPWUuZG9jdW1lbnQscz1hLmRvY3VtZW50RWxlbWVudCxsPWUualF1ZXJ5LHU9ZS4kLGM9e30scD1bXSxmPSIxLjEwLjIiLGQ9cC5jb25jYXQsaD1wLnB1c2gsZz1wLnNsaWNlLG09cC5pbmRleE9mLHk9Yy50b1N0cmluZyx2PWMuaGFzT3duUHJvcGVydHksYj1mLnRyaW0seD1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgeC5mbi5pbml0KGUsdCxyKX0sdz0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxUPS9cUysvZyxDPS9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZyxOPS9eKD86XHMqKDxbXHdcV10rPilbXj5dKnwjKFtcdy1dKikpJC8saz0vXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT58KSQvLEU9L15bXF0sOnt9XHNdKiQvLFM9Lyg/Ol58OnwsKSg/OlxzKlxbKSsvZyxBPS9cXCg/OlsiXFxcL2JmbnJ0XXx1W1xkYS1mQS1GXXs0fSkvZyxqPS8iW14iXFxcclxuXSoifHRydWV8ZmFsc2V8bnVsbHwtPyg/OlxkK1wufClcZCsoPzpbZUVdWystXT9cZCt8KS9nLEQ9L14tbXMtLyxMPS8tKFtcZGEtel0pL2dpLEg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfSxxPWZ1bmN0aW9uKGUpeyhhLmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWUudHlwZXx8ImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZSkmJihfKCkseC5yZWFkeSgpKX0sXz1mdW5jdGlvbigpe2EuYWRkRXZlbnRMaXN0ZW5lcj8oYS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixxLCExKSxlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLHEsITEpKTooYS5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixxKSxlLmRldGFjaEV2ZW50KCJvbmxvYWQiLHEpKX07eC5mbj14LnByb3RvdHlwZT17anF1ZXJ5OmYsY29uc3RydWN0b3I6eCxpbml0OmZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvO2lmKCFlKXJldHVybiB0aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoaT0iPCI9PT1lLmNoYXJBdCgwKSYmIj4iPT09ZS5jaGFyQXQoZS5sZW5ndGgtMSkmJmUubGVuZ3RoPj0zP1tudWxsLGUsbnVsbF06Ti5leGVjKGUpLCFpfHwhaVsxXSYmbilyZXR1cm4hbnx8bi5qcXVlcnk/KG58fHIpLmZpbmQoZSk6dGhpcy5jb25zdHJ1Y3RvcihuKS5maW5kKGUpO2lmKGlbMV0pe2lmKG49biBpbnN0YW5jZW9mIHg/blswXTpuLHgubWVyZ2UodGhpcyx4LnBhcnNlSFRNTChpWzFdLG4mJm4ubm9kZVR5cGU/bi5vd25lckRvY3VtZW50fHxuOmEsITApKSxrLnRlc3QoaVsxXSkmJnguaXNQbGFpbk9iamVjdChuKSlmb3IoaSBpbiBuKXguaXNGdW5jdGlvbih0aGlzW2ldKT90aGlzW2ldKG5baV0pOnRoaXMuYXR0cihpLG5baV0pO3JldHVybiB0aGlzfWlmKG89YS5nZXRFbGVtZW50QnlJZChpWzJdKSxvJiZvLnBhcmVudE5vZGUpe2lmKG8uaWQhPT1pWzJdKXJldHVybiByLmZpbmQoZSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPW99cmV0dXJuIHRoaXMuY29udGV4dD1hLHRoaXMuc2VsZWN0b3I9ZSx0aGlzfXJldHVybiBlLm5vZGVUeXBlPyh0aGlzLmNvbnRleHQ9dGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6eC5pc0Z1bmN0aW9uKGUpP3IucmVhZHkoZSk6KGUuc2VsZWN0b3IhPT10JiYodGhpcy5zZWxlY3Rvcj1lLnNlbGVjdG9yLHRoaXMuY29udGV4dD1lLmNvbnRleHQpLHgubWFrZUFycmF5KGUsdGhpcykpfSxzZWxlY3RvcjoiIixsZW5ndGg6MCx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIGcuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3RoaXMudG9BcnJheSgpOjA+ZT90aGlzW3RoaXMubGVuZ3RoK2VdOnRoaXNbZV19LHB1c2hTdGFjazpmdW5jdGlvbihlKXt2YXIgdD14Lm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdC5jb250ZXh0PXRoaXMuY29udGV4dCx0fSxlYWNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguZWFjaCh0aGlzLGUsdCl9LHJlYWR5OmZ1bmN0aW9uKGUpe3JldHVybiB4LnJlYWR5LnByb21pc2UoKS5kb25lKGUpLHRoaXN9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoMD5lP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJnQ+bj9bdGhpc1tuXV06W10pfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKHgubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpoLHNvcnQ6W10uc29ydCxzcGxpY2U6W10uc3BsaWNlfSx4LmZuLmluaXQucHJvdG90eXBlPXguZm4seC5leHRlbmQ9eC5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSxuLHIsaSxvLGEscz1hcmd1bWVudHNbMF18fHt9LGw9MSx1PWFyZ3VtZW50cy5sZW5ndGgsYz0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgcyYmKGM9cyxzPWFyZ3VtZW50c1sxXXx8e30sbD0yKSwib2JqZWN0Ij09dHlwZW9mIHN8fHguaXNGdW5jdGlvbihzKXx8KHM9e30pLHU9PT1sJiYocz10aGlzLC0tbCk7dT5sO2wrKylpZihudWxsIT0obz1hcmd1bWVudHNbbF0pKWZvcihpIGluIG8pZT1zW2ldLHI9b1tpXSxzIT09ciYmKGMmJnImJih4LmlzUGxhaW5PYmplY3Qocil8fChuPXguaXNBcnJheShyKSkpPyhuPyhuPSExLGE9ZSYmeC5pc0FycmF5KGUpP2U6W10pOmE9ZSYmeC5pc1BsYWluT2JqZWN0KGUpP2U6e30sc1tpXT14LmV4dGVuZChjLGEscikpOnIhPT10JiYoc1tpXT1yKSk7cmV0dXJuIHN9LHguZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKyhmK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vQ29uZmxpY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIGUuJD09PXgmJihlLiQ9dSksdCYmZS5qUXVlcnk9PT14JiYoZS5qUXVlcnk9bCkseH0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oZSl7ZT94LnJlYWR5V2FpdCsrOngucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihlKXtpZihlPT09ITA/IS0teC5yZWFkeVdhaXQ6IXguaXNSZWFkeSl7aWYoIWEuYm9keSlyZXR1cm4gc2V0VGltZW91dCh4LnJlYWR5KTt4LmlzUmVhZHk9ITAsZSE9PSEwJiYtLXgucmVhZHlXYWl0PjB8fChuLnJlc29sdmVXaXRoKGEsW3hdKSx4LmZuLnRyaWdnZXImJngoYSkudHJpZ2dlcigicmVhZHkiKS5vZmYoInJlYWR5IikpfX0saXNGdW5jdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT09eC50eXBlKGUpfSxpc0FycmF5OkFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJhcnJheSI9PT14LnR5cGUoZSl9LGlzV2luZG93OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT1lLndpbmRvd30saXNOdW1lcmljOmZ1bmN0aW9uKGUpe3JldHVybiFpc05hTihwYXJzZUZsb2F0KGUpKSYmaXNGaW5pdGUoZSl9LHR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2NbeS5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIG47aWYoIWV8fCJvYmplY3QiIT09eC50eXBlKGUpfHxlLm5vZGVUeXBlfHx4LmlzV2luZG93KGUpKXJldHVybiExO3RyeXtpZihlLmNvbnN0cnVjdG9yJiYhdi5jYWxsKGUsImNvbnN0cnVjdG9yIikmJiF2LmNhbGwoZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsImlzUHJvdG90eXBlT2YiKSlyZXR1cm4hMX1jYXRjaChyKXtyZXR1cm4hMX1pZih4LnN1cHBvcnQub3duTGFzdClmb3IobiBpbiBlKXJldHVybiB2LmNhbGwoZSxuKTtmb3IobiBpbiBlKTtyZXR1cm4gbj09PXR8fHYuY2FsbChlLG4pfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKGUpfSxwYXJzZUhUTUw6ZnVuY3Rpb24oZSx0LG4pe2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgdCYmKG49dCx0PSExKSx0PXR8fGE7dmFyIHI9ay5leGVjKGUpLGk9IW4mJltdO3JldHVybiByP1t0LmNyZWF0ZUVsZW1lbnQoclsxXSldOihyPXguYnVpbGRGcmFnbWVudChbZV0sdCxpKSxpJiZ4KGkpLnJlbW92ZSgpLHgubWVyZ2UoW10sci5jaGlsZE5vZGVzKSl9LHBhcnNlSlNPTjpmdW5jdGlvbihuKXtyZXR1cm4gZS5KU09OJiZlLkpTT04ucGFyc2U/ZS5KU09OLnBhcnNlKG4pOm51bGw9PT1uP246InN0cmluZyI9PXR5cGVvZiBuJiYobj14LnRyaW0obiksbiYmRS50ZXN0KG4ucmVwbGFjZShBLCJAIikucmVwbGFjZShqLCJdIikucmVwbGFjZShTLCIiKSkpP0Z1bmN0aW9uKCJyZXR1cm4gIituKSgpOih4LmVycm9yKCJJbnZhbGlkIEpTT046ICIrbiksdCl9LHBhcnNlWE1MOmZ1bmN0aW9uKG4pe3ZhciByLGk7aWYoIW58fCJzdHJpbmciIT10eXBlb2YgbilyZXR1cm4gbnVsbDt0cnl7ZS5ET01QYXJzZXI/KGk9bmV3IERPTVBhcnNlcixyPWkucGFyc2VGcm9tU3RyaW5nKG4sInRleHQveG1sIikpOihyPW5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MRE9NIiksci5hc3luYz0iZmFsc2UiLHIubG9hZFhNTChuKSl9Y2F0Y2gobyl7cj10fXJldHVybiByJiZyLmRvY3VtZW50RWxlbWVudCYmIXIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIikubGVuZ3RofHx4LmVycm9yKCJJbnZhbGlkIFhNTDogIituKSxyfSxub29wOmZ1bmN0aW9uKCl7fSxnbG9iYWxFdmFsOmZ1bmN0aW9uKHQpe3QmJngudHJpbSh0KSYmKGUuZXhlY1NjcmlwdHx8ZnVuY3Rpb24odCl7ZS5ldmFsLmNhbGwoZSx0KX0pKHQpfSxjYW1lbENhc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShELCJtcy0iKS5yZXBsYWNlKEwsSCl9LG5vZGVOYW1lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXQudG9Mb3dlckNhc2UoKX0sZWFjaDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgsYT1NKGUpO2lmKG4pe2lmKGEpe2Zvcig7bz5pO2krKylpZihyPXQuYXBwbHkoZVtpXSxuKSxyPT09ITEpYnJlYWt9ZWxzZSBmb3IoaSBpbiBlKWlmKHI9dC5hcHBseShlW2ldLG4pLHI9PT0hMSlicmVha31lbHNlIGlmKGEpe2Zvcig7bz5pO2krKylpZihyPXQuY2FsbChlW2ldLGksZVtpXSkscj09PSExKWJyZWFrfWVsc2UgZm9yKGkgaW4gZSlpZihyPXQuY2FsbChlW2ldLGksZVtpXSkscj09PSExKWJyZWFrO3JldHVybiBlfSx0cmltOmImJiFiLmNhbGwoIlx1ZmVmZlx1MDBhMCIpP2Z1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmIuY2FsbChlKX06ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6KGUrIiIpLnJlcGxhY2UoQywiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYoTShPYmplY3QoZSkpP3gubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOmguY2FsbChuLGUpKSxufSxpbkFycmF5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZih0KXtpZihtKXJldHVybiBtLmNhbGwodCxlLG4pO2ZvcihyPXQubGVuZ3RoLG49bj8wPm4/TWF0aC5tYXgoMCxyK24pOm46MDtyPm47bisrKWlmKG4gaW4gdCYmdFtuXT09PWUpcmV0dXJuIG59cmV0dXJuLTF9LG1lcmdlOmZ1bmN0aW9uKGUsbil7dmFyIHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPTA7aWYoIm51bWJlciI9PXR5cGVvZiByKWZvcig7cj5vO28rKyllW2krK109bltvXTtlbHNlIHdoaWxlKG5bb10hPT10KWVbaSsrXT1uW28rK107cmV0dXJuIGUubGVuZ3RoPWksZX0sZ3JlcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT1bXSxvPTAsYT1lLmxlbmd0aDtmb3Iobj0hIW47YT5vO28rKylyPSEhdChlW29dLG8pLG4hPT1yJiZpLnB1c2goZVtvXSk7cmV0dXJuIGl9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsaT0wLG89ZS5sZW5ndGgsYT1NKGUpLHM9W107aWYoYSlmb3IoO28+aTtpKyspcj10KGVbaV0saSxuKSxudWxsIT1yJiYoc1tzLmxlbmd0aF09cik7ZWxzZSBmb3IoaSBpbiBlKXI9dChlW2ldLGksbiksbnVsbCE9ciYmKHNbcy5sZW5ndGhdPXIpO3JldHVybiBkLmFwcGx5KFtdLHMpfSxndWlkOjEscHJveHk6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLG87cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuJiYobz1lW25dLG49ZSxlPW8pLHguaXNGdW5jdGlvbihlKT8ocj1nLmNhbGwoYXJndW1lbnRzLDIpLGk9ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShufHx0aGlzLHIuY29uY2F0KGcuY2FsbChhcmd1bWVudHMpKSl9LGkuZ3VpZD1lLmd1aWQ9ZS5ndWlkfHx4Lmd1aWQrKyxpKTp0fSxhY2Nlc3M6ZnVuY3Rpb24oZSxuLHIsaSxvLGEscyl7dmFyIGw9MCx1PWUubGVuZ3RoLGM9bnVsbD09cjtpZigib2JqZWN0Ij09PXgudHlwZShyKSl7bz0hMDtmb3IobCBpbiByKXguYWNjZXNzKGUsbixsLHJbbF0sITAsYSxzKX1lbHNlIGlmKGkhPT10JiYobz0hMCx4LmlzRnVuY3Rpb24oaSl8fChzPSEwKSxjJiYocz8obi5jYWxsKGUsaSksbj1udWxsKTooYz1uLG49ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBjLmNhbGwoeChlKSxuKX0pKSxuKSlmb3IoO3U+bDtsKyspbihlW2xdLHIscz9pOmkuY2FsbChlW2xdLGwsbihlW2xdLHIpKSk7cmV0dXJuIG8/ZTpjP24uY2FsbChlKTp1P24oZVswXSxyKTphfSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sc3dhcDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGE9e307Zm9yKG8gaW4gdClhW29dPWUuc3R5bGVbb10sZS5zdHlsZVtvXT10W29dO2k9bi5hcHBseShlLHJ8fFtdKTtmb3IobyBpbiB0KWUuc3R5bGVbb109YVtvXTtyZXR1cm4gaX19KSx4LnJlYWR5LnByb21pc2U9ZnVuY3Rpb24odCl7aWYoIW4paWYobj14LkRlZmVycmVkKCksImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZSlzZXRUaW1lb3V0KHgucmVhZHkpO2Vsc2UgaWYoYS5hZGRFdmVudExpc3RlbmVyKWEuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIscSwhMSksZS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixxLCExKTtlbHNle2EuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIscSksZS5hdHRhY2hFdmVudCgib25sb2FkIixxKTt2YXIgcj0hMTt0cnl7cj1udWxsPT1lLmZyYW1lRWxlbWVudCYmYS5kb2N1bWVudEVsZW1lbnR9Y2F0Y2goaSl7fXImJnIuZG9TY3JvbGwmJmZ1bmN0aW9uIG8oKXtpZigheC5pc1JlYWR5KXt0cnl7ci5kb1Njcm9sbCgibGVmdCIpfWNhdGNoKGUpe3JldHVybiBzZXRUaW1lb3V0KG8sNTApfV8oKSx4LnJlYWR5KCl9fSgpfXJldHVybiBuLnByb21pc2UodCl9LHguZWFjaCgiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2NbIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gTShlKXt2YXIgdD1lLmxlbmd0aCxuPXgudHlwZShlKTtyZXR1cm4geC5pc1dpbmRvdyhlKT8hMToxPT09ZS5ub2RlVHlwZSYmdD8hMDoiYXJyYXkiPT09bnx8ImZ1bmN0aW9uIiE9PW4mJigwPT09dHx8Im51bWJlciI9PXR5cGVvZiB0JiZ0PjAmJnQtMSBpbiBlKX1yPXgoYSksZnVuY3Rpb24oZSx0KXt2YXIgbixyLGksbyxhLHMsbCx1LGMscCxmLGQsaCxnLG0seSx2LGI9InNpenpsZSIrLW5ldyBEYXRlLHc9ZS5kb2N1bWVudCxUPTAsQz0wLE49c3QoKSxrPXN0KCksRT1zdCgpLFM9ITEsQT1mdW5jdGlvbihlLHQpe3JldHVybiBlPT09dD8oUz0hMCwwKTowfSxqPXR5cGVvZiB0LEQ9MTw8MzEsTD17fS5oYXNPd25Qcm9wZXJ0eSxIPVtdLHE9SC5wb3AsXz1ILnB1c2gsTT1ILnB1c2gsTz1ILnNsaWNlLEY9SC5pbmRleE9mfHxmdW5jdGlvbihlKXt2YXIgdD0wLG49dGhpcy5sZW5ndGg7Zm9yKDtuPnQ7dCsrKWlmKHRoaXNbdF09PT1lKXJldHVybiB0O3JldHVybi0xfSxCPSJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZCIsUD0iW1xceDIwXFx0XFxyXFxuXFxmXSIsUj0iKD86XFxcXC58W1xcdy1dfFteXFx4MDAtXFx4YTBdKSsiLFc9Ui5yZXBsYWNlKCJ3IiwidyMiKSwkPSJcXFsiK1ArIiooIitSKyIpIitQKyIqKD86KFsqXiR8IX5dPz0pIitQKyIqKD86KFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woIitXKyIpfCl8KSIrUCsiKlxcXSIsST0iOigiK1IrIikoPzpcXCgoKFsnXCJdKSgoPzpcXFxcLnxbXlxcXFxdKSo/KVxcM3woKD86XFxcXC58W15cXFxcKClbXFxdXXwiKyQucmVwbGFjZSgzLDgpKyIpKil8LiopXFwpfCkiLHo9UmVnRXhwKCJeIitQKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK1ArIiskIiwiZyIpLFg9UmVnRXhwKCJeIitQKyIqLCIrUCsiKiIpLFU9UmVnRXhwKCJeIitQKyIqKFs+K35dfCIrUCsiKSIrUCsiKiIpLFY9UmVnRXhwKFArIipbK35dIiksWT1SZWdFeHAoIj0iK1ArIiooW15cXF0nXCJdKikiK1ArIipcXF0iLCJnIiksSj1SZWdFeHAoSSksRz1SZWdFeHAoIl4iK1crIiQiKSxRPXtJRDpSZWdFeHAoIl4jKCIrUisiKSIpLENMQVNTOlJlZ0V4cCgiXlxcLigiK1IrIikiKSxUQUc6UmVnRXhwKCJeKCIrUi5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6UmVnRXhwKCJeIiskKSxQU0VVRE86UmVnRXhwKCJeIitJKSxDSElMRDpSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrUCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrUCsiKig/OihbKy1dfCkiK1ArIiooXFxkKyl8KSkiK1ArIipcXCl8KSIsImkiKSxib29sOlJlZ0V4cCgiXig/OiIrQisiKSQiLCJpIiksbmVlZHNDb250ZXh0OlJlZ0V4cCgiXiIrUCsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIitQKyIqKCg/Oi1cXGQpP1xcZCopIitQKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxLPS9eW157XStce1xzKlxbbmF0aXZlIFx3LyxaPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sZXQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSx0dD0vXmhcZCQvaSxudD0vJ3xcXC9nLHJ0PVJlZ0V4cCgiXFxcXChbXFxkYS1mXXsxLDZ9IitQKyI/fCgiK1ArIil8LikiLCJpZyIpLGl0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0iMHgiK3QtNjU1MzY7cmV0dXJuIHIhPT1yfHxuP3Q6MD5yP1N0cmluZy5mcm9tQ2hhckNvZGUocis2NTUzNik6U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxyPj4xMCw1NjMyMHwxMDIzJnIpfTt0cnl7TS5hcHBseShIPU8uY2FsbCh3LmNoaWxkTm9kZXMpLHcuY2hpbGROb2RlcyksSFt3LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChvdCl7TT17YXBwbHk6SC5sZW5ndGg/ZnVuY3Rpb24oZSx0KXtfLmFwcGx5KGUsTy5jYWxsKHQpKX06ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxlbmd0aCxyPTA7d2hpbGUoZVtuKytdPXRbcisrXSk7ZS5sZW5ndGg9bi0xfX19ZnVuY3Rpb24gYXQoZSx0LG4saSl7dmFyIG8sYSxzLGwsdSxjLGQsbSx5LHg7aWYoKHQ/dC5vd25lckRvY3VtZW50fHx0OncpIT09ZiYmcCh0KSx0PXR8fGYsbj1ufHxbXSwhZXx8InN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBuO2lmKDEhPT0obD10Lm5vZGVUeXBlKSYmOSE9PWwpcmV0dXJuW107aWYoaCYmIWkpe2lmKG89Wi5leGVjKGUpKWlmKHM9b1sxXSl7aWYoOT09PWwpe2lmKGE9dC5nZXRFbGVtZW50QnlJZChzKSwhYXx8IWEucGFyZW50Tm9kZSlyZXR1cm4gbjtpZihhLmlkPT09cylyZXR1cm4gbi5wdXNoKGEpLG59ZWxzZSBpZih0Lm93bmVyRG9jdW1lbnQmJihhPXQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChzKSkmJnYodCxhKSYmYS5pZD09PXMpcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYob1syXSlyZXR1cm4gTS5hcHBseShuLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLG47aWYoKHM9b1szXSkmJnIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBNLmFwcGx5KG4sdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHMpKSxufWlmKHIucXNhJiYoIWd8fCFnLnRlc3QoZSkpKXtpZihtPWQ9Yix5PXQseD05PT09bCYmZSwxPT09bCYmIm9iamVjdCIhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpe2M9bXQoZSksKGQ9dC5nZXRBdHRyaWJ1dGUoImlkIikpP209ZC5yZXBsYWNlKG50LCJcXCQmIik6dC5zZXRBdHRyaWJ1dGUoImlkIixtKSxtPSJbaWQ9JyIrbSsiJ10gIix1PWMubGVuZ3RoO3doaWxlKHUtLSljW3VdPW0reXQoY1t1XSk7eT1WLnRlc3QoZSkmJnQucGFyZW50Tm9kZXx8dCx4PWMuam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBNLmFwcGx5KG4seS5xdWVyeVNlbGVjdG9yQWxsKHgpKSxufWNhdGNoKFQpe31maW5hbGx5e2R8fHQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGt0KGUucmVwbGFjZSh6LCIkMSIpLHQsbixpKX1mdW5jdGlvbiBzdCgpe3ZhciBlPVtdO2Z1bmN0aW9uIHQobixyKXtyZXR1cm4gZS5wdXNoKG4rPSIgIik+by5jYWNoZUxlbmd0aCYmZGVsZXRlIHRbZS5zaGlmdCgpXSx0W25dPXJ9cmV0dXJuIHR9ZnVuY3Rpb24gbHQoZSl7cmV0dXJuIGVbYl09ITAsZX1mdW5jdGlvbiB1dChlKXt2YXIgdD1mLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2gobil7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGN0KGUsdCl7dmFyIG49ZS5zcGxpdCgifCIpLHI9ZS5sZW5ndGg7d2hpbGUoci0tKW8uYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIHB0KGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmKH50LnNvdXJjZUluZGV4fHxEKS0ofmUuc291cmNlSW5kZXh8fEQpO2lmKHIpcmV0dXJuIHI7aWYobil3aGlsZShuPW4ubmV4dFNpYmxpbmcpaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBmdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJpbnB1dCI9PT1uJiZ0LnR5cGU9PT1lfX1mdW5jdGlvbiBkdChlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybigiaW5wdXQiPT09bnx8ImJ1dHRvbiI9PT1uKSYmdC50eXBlPT09ZX19ZnVuY3Rpb24gaHQoZSl7cmV0dXJuIGx0KGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LGx0KGZ1bmN0aW9uKG4scil7dmFyIGksbz1lKFtdLG4ubGVuZ3RoLHQpLGE9by5sZW5ndGg7d2hpbGUoYS0tKW5baT1vW2FdXSYmKG5baV09IShyW2ldPW5baV0pKX0pfSl9cz1hdC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIHQ/IkhUTUwiIT09dC5ub2RlTmFtZTohMX0scj1hdC5zdXBwb3J0PXt9LHA9YXQuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIG49ZT9lLm93bmVyRG9jdW1lbnR8fGU6dyxpPW4uZGVmYXVsdFZpZXc7cmV0dXJuIG4hPT1mJiY5PT09bi5ub2RlVHlwZSYmbi5kb2N1bWVudEVsZW1lbnQ/KGY9bixkPW4uZG9jdW1lbnRFbGVtZW50LGg9IXMobiksaSYmaS5hdHRhY2hFdmVudCYmaSE9PWkudG9wJiZpLmF0dGFjaEV2ZW50KCJvbmJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXtwKCl9KSxyLmF0dHJpYnV0ZXM9dXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksci5nZXRFbGVtZW50c0J5VGFnTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBlbmRDaGlsZChuLmNyZWF0ZUNvbW1lbnQoIiIpKSwhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLHIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT11dChmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxkaXYgY2xhc3M9J2EnPjwvZGl2PjxkaXYgY2xhc3M9J2EgaSc+PC9kaXY+IixlLmZpcnN0Q2hpbGQuY2xhc3NOYW1lPSJpIiwyPT09ZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJpIikubGVuZ3RofSksci5nZXRCeUlkPXV0KGZ1bmN0aW9uKGUpe3JldHVybiBkLmFwcGVuZENoaWxkKGUpLmlkPWIsIW4uZ2V0RWxlbWVudHNCeU5hbWV8fCFuLmdldEVsZW1lbnRzQnlOYW1lKGIpLmxlbmd0aH0pLHIuZ2V0QnlJZD8oby5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQuZ2V0RWxlbWVudEJ5SWQhPT1qJiZoKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuJiZuLnBhcmVudE5vZGU/W25dOltdfX0sby5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHJ0LGl0KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJpZCIpPT09dH19KTooZGVsZXRlIG8uZmluZC5JRCxvLmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UocnQsaXQpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj10eXBlb2YgZS5nZXRBdHRyaWJ1dGVOb2RlIT09aiYmZS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBuJiZuLnZhbHVlPT09dH19KSxvLmZpbmQuVEFHPXIuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdHlwZW9mIG4uZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1qP24uZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6dH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLGk9MCxvPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7d2hpbGUobj1vW2krK10pMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gb30sby5maW5kLkNMQVNTPXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSxuKXtyZXR1cm4gdHlwZW9mIG4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSE9PWomJmg/bi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGUpOnR9LG09W10sZz1bXSwoci5xc2E9Sy50ZXN0KG4ucXVlcnlTZWxlY3RvckFsbCkpJiYodXQoZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IjxzZWxlY3Q+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8Zy5wdXNoKCJcXFsiK1ArIiooPzp2YWx1ZXwiK0IrIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxnLnB1c2goIjpjaGVja2VkIil9KSx1dChmdW5jdGlvbihlKXt2YXIgdD1uLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZSgidCIsIiIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3RePScnXSIpLmxlbmd0aCYmZy5wdXNoKCJbKl4kXT0iK1ArIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fGcucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxnLnB1c2goIiwuKjoiKX0pKSwoci5tYXRjaGVzU2VsZWN0b3I9Sy50ZXN0KHk9ZC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGQubW96TWF0Y2hlc1NlbGVjdG9yfHxkLm9NYXRjaGVzU2VsZWN0b3J8fGQubXNNYXRjaGVzU2VsZWN0b3IpKSYmdXQoZnVuY3Rpb24oZSl7ci5kaXNjb25uZWN0ZWRNYXRjaD15LmNhbGwoZSwiZGl2IikseS5jYWxsKGUsIltzIT0nJ106eCIpLG0ucHVzaCgiIT0iLEkpfSksZz1nLmxlbmd0aCYmUmVnRXhwKGcuam9pbigifCIpKSxtPW0ubGVuZ3RoJiZSZWdFeHAobS5qb2luKCJ8IikpLHY9Sy50ZXN0KGQuY29udGFpbnMpfHxkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7dmFyIG49OT09PWUubm9kZVR5cGU/ZS5kb2N1bWVudEVsZW1lbnQ6ZSxyPXQmJnQucGFyZW50Tm9kZTtyZXR1cm4gZT09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTplLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKGUsdCl7aWYodCl3aGlsZSh0PXQucGFyZW50Tm9kZSlpZih0PT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sQT1kLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP2Z1bmN0aW9uKGUsdCl7aWYoZT09PXQpcmV0dXJuIFM9ITAsMDt2YXIgaT10LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpO3JldHVybiBpPzEmaXx8IXIuc29ydERldGFjaGVkJiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpPT09aT9lPT09bnx8dih3LGUpPy0xOnQ9PT1ufHx2KHcsdCk/MTpjP0YuY2FsbChjLGUpLUYuY2FsbChjLHQpOjA6NCZpPy0xOjE6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj8tMToxfTpmdW5jdGlvbihlLHQpe3ZhciByLGk9MCxvPWUucGFyZW50Tm9kZSxhPXQucGFyZW50Tm9kZSxzPVtlXSxsPVt0XTtpZihlPT09dClyZXR1cm4gUz0hMCwwO2lmKCFvfHwhYSlyZXR1cm4gZT09PW4/LTE6dD09PW4/MTpvPy0xOmE/MTpjP0YuY2FsbChjLGUpLUYuY2FsbChjLHQpOjA7aWYobz09PWEpcmV0dXJuIHB0KGUsdCk7cj1lO3doaWxlKHI9ci5wYXJlbnROb2RlKXMudW5zaGlmdChyKTtyPXQ7d2hpbGUocj1yLnBhcmVudE5vZGUpbC51bnNoaWZ0KHIpO3doaWxlKHNbaV09PT1sW2ldKWkrKztyZXR1cm4gaT9wdChzW2ldLGxbaV0pOnNbaV09PT13Py0xOmxbaV09PT13PzE6MH0sbik6Zn0sYXQubWF0Y2hlcz1mdW5jdGlvbihlLHQpe3JldHVybiBhdChlLG51bGwsbnVsbCx0KX0sYXQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsdCl7aWYoKGUub3duZXJEb2N1bWVudHx8ZSkhPT1mJiZwKGUpLHQ9dC5yZXBsYWNlKFksIj0nJDEnXSIpLCEoIXIubWF0Y2hlc1NlbGVjdG9yfHwhaHx8bSYmbS50ZXN0KHQpfHxnJiZnLnRlc3QodCkpKXRyeXt2YXIgbj15LmNhbGwoZSx0KTtpZihufHxyLmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIG59Y2F0Y2goaSl7fXJldHVybiBhdCh0LGYsbnVsbCxbZV0pLmxlbmd0aD4wfSxhdC5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybihlLm93bmVyRG9jdW1lbnR8fGUpIT09ZiYmcChlKSx2KGUsdCl9LGF0LmF0dHI9ZnVuY3Rpb24oZSxuKXsoZS5vd25lckRvY3VtZW50fHxlKSE9PWYmJnAoZSk7dmFyIGk9by5hdHRySGFuZGxlW24udG9Mb3dlckNhc2UoKV0sYT1pJiZMLmNhbGwoby5hdHRySGFuZGxlLG4udG9Mb3dlckNhc2UoKSk/aShlLG4sIWgpOnQ7cmV0dXJuIGE9PT10P3IuYXR0cmlidXRlc3x8IWg/ZS5nZXRBdHRyaWJ1dGUobik6KGE9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmYS5zcGVjaWZpZWQ/YS52YWx1ZTpudWxsOmF9LGF0LmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2UpfSxhdC51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG49W10saT0wLG89MDtpZihTPSFyLmRldGVjdER1cGxpY2F0ZXMsYz0hci5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydChBKSxTKXt3aGlsZSh0PWVbbysrXSl0PT09ZVtvXSYmKGk9bi5wdXNoKG8pKTt3aGlsZShpLS0pZS5zcGxpY2UobltpXSwxKX1yZXR1cm4gZX0sYT1hdC5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLGk9ZS5ub2RlVHlwZTtpZihpKXtpZigxPT09aXx8OT09PWl8fDExPT09aSl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1hKGUpfWVsc2UgaWYoMz09PWl8fDQ9PT1pKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIGZvcig7dD1lW3JdO3IrKyluKz1hKHQpO3JldHVybiBufSxvPWF0LnNlbGVjdG9ycz17Y2FjaGVMZW5ndGg6NTAsY3JlYXRlUHNldWRvOmx0LG1hdGNoOlEsYXR0ckhhbmRsZTp7fSxmaW5kOnt9LHJlbGF0aXZlOnsiPiI6e2RpcjoicGFyZW50Tm9kZSIsZmlyc3Q6ITB9LCIgIjp7ZGlyOiJwYXJlbnROb2RlIn0sIisiOntkaXI6InByZXZpb3VzU2libGluZyIsZmlyc3Q6ITB9LCJ+Ijp7ZGlyOiJwcmV2aW91c1NpYmxpbmcifX0scHJlRmlsdGVyOntBVFRSOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0ucmVwbGFjZShydCxpdCksZVszXT0oZVs0XXx8ZVs1XXx8IiIpLnJlcGxhY2UocnQsaXQpLCJ+PSI9PT1lWzJdJiYoZVszXT0iICIrZVszXSsiICIpLGUuc2xpY2UoMCw0KX0sQ0hJTEQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS50b0xvd2VyQ2FzZSgpLCJudGgiPT09ZVsxXS5zbGljZSgwLDMpPyhlWzNdfHxhdC5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZhdC5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIG4scj0hZVs1XSYmZVsyXTtyZXR1cm4gUS5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10mJmVbNF0hPT10P2VbMl09ZVs0XTpyJiZKLnRlc3QocikmJihuPW10KHIsITApKSYmKG49ci5pbmRleE9mKCIpIixyLmxlbmd0aC1uKS1yLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCxuKSxlWzJdPXIuc2xpY2UoMCxuKSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShydCxpdCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9TltlKyIgIl07cmV0dXJuIHR8fCh0PVJlZ0V4cCgiKF58IitQKyIpIitlKyIoIitQKyJ8JCkiKSkmJk4oZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHx0eXBlb2YgZS5nZXRBdHRyaWJ1dGUhPT1qJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfSl9LEFUVFI6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihyKXt2YXIgaT1hdC5hdHRyKHIsZSk7cmV0dXJuIG51bGw9PWk/IiE9Ij09PXQ6dD8oaSs9IiIsIj0iPT09dD9pPT09bjoiIT0iPT09dD9pIT09bjoiXj0iPT09dD9uJiYwPT09aS5pbmRleE9mKG4pOiIqPSI9PT10P24mJmkuaW5kZXhPZihuKT4tMToiJD0iPT09dD9uJiZpLnNsaWNlKC1uLmxlbmd0aCk9PT1uOiJ+PSI9PT10PygiICIraSsiICIpLmluZGV4T2Yobik+LTE6Inw9Ij09PXQ/aT09PW58fGkuc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iOiExKTohMH19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09aT9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLGwpe3ZhciB1LGMscCxmLGQsaCxnPW8hPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsbT10LnBhcmVudE5vZGUseT1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksdj0hbCYmIXM7aWYobSl7aWYobyl7d2hpbGUoZyl7cD10O3doaWxlKHA9cFtnXSlpZihzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXk6MT09PXAubm9kZVR5cGUpcmV0dXJuITE7aD1nPSJvbmx5Ij09PWUmJiFoJiYibmV4dFNpYmxpbmcifXJldHVybiEwfWlmKGg9W2E/bS5maXJzdENoaWxkOm0ubGFzdENoaWxkXSxhJiZ2KXtjPW1bYl18fChtW2JdPXt9KSx1PWNbZV18fFtdLGQ9dVswXT09PVQmJnVbMV0sZj11WzBdPT09VCYmdVsyXSxwPWQmJm0uY2hpbGROb2Rlc1tkXTt3aGlsZShwPSsrZCYmcCYmcFtnXXx8KGY9ZD0wKXx8aC5wb3AoKSlpZigxPT09cC5ub2RlVHlwZSYmKytmJiZwPT09dCl7Y1tlXT1bVCxkLGZdO2JyZWFrfX1lbHNlIGlmKHYmJih1PSh0W2JdfHwodFtiXT17fSkpW2VdKSYmdVswXT09PVQpZj11WzFdO2Vsc2Ugd2hpbGUocD0rK2QmJnAmJnBbZ118fChmPWQ9MCl8fGgucG9wKCkpaWYoKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSkmJisrZiYmKHYmJigocFtiXXx8KHBbYl09e30pKVtlXT1bVCxmXSkscD09PXQpKWJyZWFrO3JldHVybiBmLT1pLGY9PT1yfHwwPT09ZiVyJiZmL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1vLnBzZXVkb3NbZV18fG8uc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHxhdC5lcnJvcigidW5zdXBwb3J0ZWQgcHNldWRvOiAiK2UpO3JldHVybiByW2JdP3IodCk6ci5sZW5ndGg+MT8obj1bZSxlLCIiLHRdLG8uc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eShlLnRvTG93ZXJDYXNlKCkpP2x0KGZ1bmN0aW9uKGUsbil7dmFyIGksbz1yKGUsdCksYT1vLmxlbmd0aDt3aGlsZShhLS0paT1GLmNhbGwoZSxvW2FdKSxlW2ldPSEobltpXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiByKGUsMCxuKX0pOnJ9fSxwc2V1ZG9zOntub3Q6bHQoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxyPWwoZS5yZXBsYWNlKHosIiQxIikpO3JldHVybiByW2JdP2x0KGZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBvLGE9cihlLG51bGwsaSxbXSkscz1lLmxlbmd0aDt3aGlsZShzLS0pKG89YVtzXSkmJihlW3NdPSEodFtzXT1vKSl9KTpmdW5jdGlvbihlLGksbyl7cmV0dXJuIHRbMF09ZSxyKHQsbnVsbCxvLG4pLCFuLnBvcCgpfX0pLGhhczpsdChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGF0KGUsdCkubGVuZ3RoPjB9fSksY29udGFpbnM6bHQoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8YSh0KSkuaW5kZXhPZihlKT4tMX19KSxsYW5nOmx0KGZ1bmN0aW9uKGUpe3JldHVybiBHLnRlc3QoZXx8IiIpfHxhdC5lcnJvcigidW5zdXBwb3J0ZWQgbGFuZzogIitlKSxlPWUucmVwbGFjZShydCxpdCkudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXt2YXIgbjtkbyBpZihuPWg/dC5sYW5nOnQuZ2V0QXR0cmlidXRlKCJ4bWw6bGFuZyIpfHx0LmdldEF0dHJpYnV0ZSgibGFuZyIpKXJldHVybiBuPW4udG9Mb3dlckNhc2UoKSxuPT09ZXx8MD09PW4uaW5kZXhPZihlKyItIik7d2hpbGUoKHQ9dC5wYXJlbnROb2RlKSYmMT09PXQubm9kZVR5cGUpO3JldHVybiExfX0pLHRhcmdldDpmdW5jdGlvbih0KXt2YXIgbj1lLmxvY2F0aW9uJiZlLmxvY2F0aW9uLmhhc2g7cmV0dXJuIG4mJm4uc2xpY2UoMSk9PT10LmlkfSxyb290OmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ZH0sZm9jdXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1mLmFjdGl2ZUVsZW1lbnQmJighZi5oYXNGb2N1c3x8Zi5oYXNGb2N1cygpKSYmISEoZS50eXBlfHxlLmhyZWZ8fH5lLnRhYkluZGV4KX0sZW5hYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSExfSxkaXNhYmxlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kaXNhYmxlZD09PSEwfSxjaGVja2VkOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmISFlLmNoZWNrZWR8fCJvcHRpb24iPT09dCYmISFlLnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxlLnNlbGVjdGVkPT09ITB9LGVtcHR5OmZ1bmN0aW9uKGUpe2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZylpZihlLm5vZGVOYW1lPiJAInx8Mz09PWUubm9kZVR5cGV8fDQ9PT1lLm5vZGVUeXBlKXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIW8ucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiB0dC50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gZXQudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8dC50b0xvd2VyQ2FzZSgpPT09ZS50eXBlKX0sZmlyc3Q6aHQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0Omh0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuW3QtMV19KSxlcTpodChmdW5jdGlvbihlLHQsbil7cmV0dXJuWzA+bj9uK3Q6bl19KSxldmVuOmh0KGZ1bmN0aW9uKGUsdCl7dmFyIG49MDtmb3IoO3Q+bjtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLG9kZDpodChmdW5jdGlvbihlLHQpe3ZhciBuPTE7Zm9yKDt0Pm47bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxsdDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDpodChmdW5jdGlvbihlLHQsbil7dmFyIHI9MD5uP24rdDpuO2Zvcig7dD4rK3I7KWUucHVzaChyKTtyZXR1cm4gZX0pfX0sby5wc2V1ZG9zLm50aD1vLnBzZXVkb3MuZXE7Zm9yKG4gaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pby5wc2V1ZG9zW25dPWZ0KG4pO2ZvcihuIGlue3N1Ym1pdDohMCxyZXNldDohMH0pby5wc2V1ZG9zW25dPWR0KG4pO2Z1bmN0aW9uIGd0KCl7fWd0LnByb3RvdHlwZT1vLmZpbHRlcnM9by5wc2V1ZG9zLG8uc2V0RmlsdGVycz1uZXcgZ3Q7ZnVuY3Rpb24gbXQoZSx0KXt2YXIgbixyLGksYSxzLGwsdSxjPWtbZSsiICJdO2lmKGMpcmV0dXJuIHQ/MDpjLnNsaWNlKDApO3M9ZSxsPVtdLHU9by5wcmVGaWx0ZXI7d2hpbGUocyl7KCFufHwocj1YLmV4ZWMocykpKSYmKHImJihzPXMuc2xpY2UoclswXS5sZW5ndGgpfHxzKSxsLnB1c2goaT1bXSkpLG49ITEsKHI9VS5leGVjKHMpKSYmKG49ci5zaGlmdCgpLGkucHVzaCh7dmFsdWU6bix0eXBlOnJbMF0ucmVwbGFjZSh6LCIgIil9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtmb3IoYSBpbiBvLmZpbHRlcikhKHI9UVthXS5leGVjKHMpKXx8dVthXSYmIShyPXVbYV0ocikpfHwobj1yLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6YSxtYXRjaGVzOnJ9KSxzPXMuc2xpY2Uobi5sZW5ndGgpKTtpZighbilicmVha31yZXR1cm4gdD9zLmxlbmd0aDpzP2F0LmVycm9yKGUpOmsoZSxsKS5zbGljZSgwKX1mdW5jdGlvbiB5dChlKXt2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjtmb3IoO24+dDt0Kyspcis9ZVt0XS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB2dChlLHQsbil7dmFyIHI9dC5kaXIsbz1uJiYicGFyZW50Tm9kZSI9PT1yLGE9QysrO3JldHVybiB0LmZpcnN0P2Z1bmN0aW9uKHQsbixpKXt3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fG8pcmV0dXJuIGUodCxuLGkpfTpmdW5jdGlvbih0LG4scyl7dmFyIGwsdSxjLHA9VCsiICIrYTtpZihzKXt3aGlsZSh0PXRbcl0paWYoKDE9PT10Lm5vZGVUeXBlfHxvKSYmZSh0LG4scykpcmV0dXJuITB9ZWxzZSB3aGlsZSh0PXRbcl0paWYoMT09PXQubm9kZVR5cGV8fG8paWYoYz10W2JdfHwodFtiXT17fSksKHU9Y1tyXSkmJnVbMF09PT1wKXtpZigobD11WzFdKT09PSEwfHxsPT09aSlyZXR1cm4gbD09PSEwfWVsc2UgaWYodT1jW3JdPVtwXSx1WzFdPWUodCxuLHMpfHxpLHVbMV09PT0hMClyZXR1cm4hMH19ZnVuY3Rpb24gYnQoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe3ZhciBpPWUubGVuZ3RoO3doaWxlKGktLSlpZighZVtpXSh0LG4scikpcmV0dXJuITE7cmV0dXJuITB9OmVbMF19ZnVuY3Rpb24geHQoZSx0LG4scixpKXt2YXIgbyxhPVtdLHM9MCxsPWUubGVuZ3RoLHU9bnVsbCE9dDtmb3IoO2w+cztzKyspKG89ZVtzXSkmJighbnx8bihvLHIsaSkpJiYoYS5wdXNoKG8pLHUmJnQucHVzaChzKSk7cmV0dXJuIGF9ZnVuY3Rpb24gd3QoZSx0LG4scixpLG8pe3JldHVybiByJiYhcltiXSYmKHI9d3QocikpLGkmJiFpW2JdJiYoaT13dChpLG8pKSxsdChmdW5jdGlvbihvLGEscyxsKXt2YXIgdSxjLHAsZj1bXSxkPVtdLGg9YS5sZW5ndGgsZz1vfHxOdCh0fHwiKiIscy5ub2RlVHlwZT9bc106cyxbXSksbT0hZXx8IW8mJnQ/Zzp4dChnLGYsZSxzLGwpLHk9bj9pfHwobz9lOmh8fHIpP1tdOmE6bTtpZihuJiZuKG0seSxzLGwpLHIpe3U9eHQoeSxkKSxyKHUsW10scyxsKSxjPXUubGVuZ3RoO3doaWxlKGMtLSkocD11W2NdKSYmKHlbZFtjXV09IShtW2RbY11dPXApKX1pZihvKXtpZihpfHxlKXtpZihpKXt1PVtdLGM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiZ1LnB1c2gobVtjXT1wKTtpKG51bGwseT1bXSx1LGwpfWM9eS5sZW5ndGg7d2hpbGUoYy0tKShwPXlbY10pJiYodT1pP0YuY2FsbChvLHApOmZbY10pPi0xJiYob1t1XT0hKGFbdV09cCkpfX1lbHNlIHk9eHQoeT09PWE/eS5zcGxpY2UoaCx5Lmxlbmd0aCk6eSksaT9pKG51bGwsYSx5LGwpOk0uYXBwbHkoYSx5KX0pfWZ1bmN0aW9uIFR0KGUpe3ZhciB0LG4scixpPWUubGVuZ3RoLGE9by5yZWxhdGl2ZVtlWzBdLnR5cGVdLHM9YXx8by5yZWxhdGl2ZVsiICJdLGw9YT8xOjAsYz12dChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LHMsITApLHA9dnQoZnVuY3Rpb24oZSl7cmV0dXJuIEYuY2FsbCh0LGUpPi0xfSxzLCEwKSxmPVtmdW5jdGlvbihlLG4scil7cmV0dXJuIWEmJihyfHxuIT09dSl8fCgodD1uKS5ub2RlVHlwZT9jKGUsbixyKTpwKGUsbixyKSl9XTtmb3IoO2k+bDtsKyspaWYobj1vLnJlbGF0aXZlW2VbbF0udHlwZV0pZj1bdnQoYnQoZiksbildO2Vsc2V7aWYobj1vLmZpbHRlcltlW2xdLnR5cGVdLmFwcGx5KG51bGwsZVtsXS5tYXRjaGVzKSxuW2JdKXtmb3Iocj0rK2w7aT5yO3IrKylpZihvLnJlbGF0aXZlW2Vbcl0udHlwZV0pYnJlYWs7cmV0dXJuIHd0KGw+MSYmYnQoZiksbD4xJiZ5dChlLnNsaWNlKDAsbC0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbbC0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKHosIiQxIiksbixyPmwmJlR0KGUuc2xpY2UobCxyKSksaT5yJiZUdChlPWUuc2xpY2UocikpLGk+ciYmeXQoZSkpfWYucHVzaChuKX1yZXR1cm4gYnQoZil9ZnVuY3Rpb24gQ3QoZSx0KXt2YXIgbj0wLHI9dC5sZW5ndGg+MCxhPWUubGVuZ3RoPjAscz1mdW5jdGlvbihzLGwsYyxwLGQpe3ZhciBoLGcsbSx5PVtdLHY9MCxiPSIwIix4PXMmJltdLHc9bnVsbCE9ZCxDPXUsTj1zfHxhJiZvLmZpbmQuVEFHKCIqIixkJiZsLnBhcmVudE5vZGV8fGwpLGs9VCs9bnVsbD09Qz8xOk1hdGgucmFuZG9tKCl8fC4xO2Zvcih3JiYodT1sIT09ZiYmbCxpPW4pO251bGwhPShoPU5bYl0pO2IrKyl7aWYoYSYmaCl7Zz0wO3doaWxlKG09ZVtnKytdKWlmKG0oaCxsLGMpKXtwLnB1c2goaCk7YnJlYWt9dyYmKFQ9ayxpPSsrbil9ciYmKChoPSFtJiZoKSYmdi0tLHMmJngucHVzaChoKSl9aWYodis9YixyJiZiIT09dil7Zz0wO3doaWxlKG09dFtnKytdKW0oeCx5LGwsYyk7aWYocyl7aWYodj4wKXdoaWxlKGItLSl4W2JdfHx5W2JdfHwoeVtiXT1xLmNhbGwocCkpO3k9eHQoeSl9TS5hcHBseShwLHkpLHcmJiFzJiZ5Lmxlbmd0aD4wJiZ2K3QubGVuZ3RoPjEmJmF0LnVuaXF1ZVNvcnQocCl9cmV0dXJuIHcmJihUPWssdT1DKSx4fTtyZXR1cm4gcj9sdChzKTpzfWw9YXQuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10saT1bXSxvPUVbZSsiICJdO2lmKCFvKXt0fHwodD1tdChlKSksbj10Lmxlbmd0aDt3aGlsZShuLS0pbz1UdCh0W25dKSxvW2JdP3IucHVzaChvKTppLnB1c2gobyk7bz1FKGUsQ3QoaSxyKSl9cmV0dXJuIG99O2Z1bmN0aW9uIE50KGUsdCxuKXt2YXIgcj0wLGk9dC5sZW5ndGg7Zm9yKDtpPnI7cisrKWF0KGUsdFtyXSxuKTtyZXR1cm4gbn1mdW5jdGlvbiBrdChlLHQsbixpKXt2YXIgYSxzLHUsYyxwLGY9bXQoZSk7aWYoIWkmJjE9PT1mLmxlbmd0aCl7aWYocz1mWzBdPWZbMF0uc2xpY2UoMCkscy5sZW5ndGg+MiYmIklEIj09PSh1PXNbMF0pLnR5cGUmJnIuZ2V0QnlJZCYmOT09PXQubm9kZVR5cGUmJmgmJm8ucmVsYXRpdmVbc1sxXS50eXBlXSl7aWYodD0oby5maW5kLklEKHUubWF0Y2hlc1swXS5yZXBsYWNlKHJ0LGl0KSx0KXx8W10pWzBdLCF0KXJldHVybiBuO2U9ZS5zbGljZShzLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1hPVEubmVlZHNDb250ZXh0LnRlc3QoZSk/MDpzLmxlbmd0aDt3aGlsZShhLS0pe2lmKHU9c1thXSxvLnJlbGF0aXZlW2M9dS50eXBlXSlicmVhaztpZigocD1vLmZpbmRbY10pJiYoaT1wKHUubWF0Y2hlc1swXS5yZXBsYWNlKHJ0LGl0KSxWLnRlc3Qoc1swXS50eXBlKSYmdC5wYXJlbnROb2RlfHx0KSkpe2lmKHMuc3BsaWNlKGEsMSksZT1pLmxlbmd0aCYmeXQocyksIWUpcmV0dXJuIE0uYXBwbHkobixpKSxuO2JyZWFrfX19cmV0dXJuIGwoZSxmKShpLHQsIWgsbixWLnRlc3QoZSkpLG59ci5zb3J0U3RhYmxlPWIuc3BsaXQoIiIpLnNvcnQoQSkuam9pbigiIik9PT1iLHIuZGV0ZWN0RHVwbGljYXRlcz1TLHAoKSxyLnNvcnREZXRhY2hlZD11dChmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGYuY3JlYXRlRWxlbWVudCgiZGl2IikpfSksdXQoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8Y3QoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gcj90OmUuZ2V0QXR0cmlidXRlKG4sInR5cGUiPT09bi50b0xvd2VyQ2FzZSgpPzE6Mil9KSxyLmF0dHJpYnV0ZXMmJnV0KGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGlucHV0Lz4iLGUuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT1lLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGN0KCJ2YWx1ZSIsZnVuY3Rpb24oZSxuLHIpe3JldHVybiByfHwiaW5wdXQiIT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpP3Q6ZS5kZWZhdWx0VmFsdWV9KSx1dChmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZS5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIil9KXx8Y3QoQixmdW5jdGlvbihlLG4scil7dmFyIGk7cmV0dXJuIHI/dDooaT1lLmdldEF0dHJpYnV0ZU5vZGUobikpJiZpLnNwZWNpZmllZD9pLnZhbHVlOmVbbl09PT0hMD9uLnRvTG93ZXJDYXNlKCk6bnVsbH0pLHguZmluZD1hdCx4LmV4cHI9YXQuc2VsZWN0b3JzLHguZXhwclsiOiJdPXguZXhwci5wc2V1ZG9zLHgudW5pcXVlPWF0LnVuaXF1ZVNvcnQseC50ZXh0PWF0LmdldFRleHQseC5pc1hNTERvYz1hdC5pc1hNTCx4LmNvbnRhaW5zPWF0LmNvbnRhaW5zfShlKTt2YXIgTz17fTtmdW5jdGlvbiBGKGUpe3ZhciB0PU9bZV09e307cmV0dXJuIHguZWFjaChlLm1hdGNoKFQpfHxbXSxmdW5jdGlvbihlLG4pe3Rbbl09ITB9KSx0fXguQ2FsbGJhY2tzPWZ1bmN0aW9uKGUpe2U9InN0cmluZyI9PXR5cGVvZiBlP09bZV18fEYoZSk6eC5leHRlbmQoe30sZSk7dmFyIG4scixpLG8sYSxzLGw9W10sdT0hZS5vbmNlJiZbXSxjPWZ1bmN0aW9uKHQpe2ZvcihyPWUubWVtb3J5JiZ0LGk9ITAsYT1zfHwwLHM9MCxvPWwubGVuZ3RoLG49ITA7bCYmbz5hO2ErKylpZihsW2FdLmFwcGx5KHRbMF0sdFsxXSk9PT0hMSYmZS5zdG9wT25GYWxzZSl7cj0hMTticmVha31uPSExLGwmJih1P3UubGVuZ3RoJiZjKHUuc2hpZnQoKSk6cj9sPVtdOnAuZGlzYWJsZSgpKX0scD17YWRkOmZ1bmN0aW9uKCl7aWYobCl7dmFyIHQ9bC5sZW5ndGg7KGZ1bmN0aW9uIGkodCl7eC5lYWNoKHQsZnVuY3Rpb24odCxuKXt2YXIgcj14LnR5cGUobik7ImZ1bmN0aW9uIj09PXI/ZS51bmlxdWUmJnAuaGFzKG4pfHxsLnB1c2gobik6biYmbi5sZW5ndGgmJiJzdHJpbmciIT09ciYmaShuKX0pfSkoYXJndW1lbnRzKSxuP289bC5sZW5ndGg6ciYmKHM9dCxjKHIpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGwmJnguZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXt2YXIgcjt3aGlsZSgocj14LmluQXJyYXkodCxsLHIpKT4tMSlsLnNwbGljZShyLDEpLG4mJihvPj1yJiZvLS0sYT49ciYmYS0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT94LmluQXJyYXkoZSxsKT4tMTohKCFsfHwhbC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBsPVtdLG89MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGw9dT1yPXQsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hbH0sbG9jazpmdW5jdGlvbigpe3JldHVybiB1PXQscnx8cC5kaXNhYmxlKCksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuIXV9LGZpcmVXaXRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIWx8fGkmJiF1fHwodD10fHxbXSx0PVtlLHQuc2xpY2U/dC5zbGljZSgpOnRdLG4/dS5wdXNoKHQpOmModCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gcC5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIWl9fTtyZXR1cm4gcH0seC5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbInJlc29sdmUiLCJkb25lIix4LkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLHguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCJyZWplY3RlZCJdLFsibm90aWZ5IiwicHJvZ3Jlc3MiLHguQ2FsbGJhY2tzKCJtZW1vcnkiKV1dLG49InBlbmRpbmciLHI9e3N0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG59LGFsd2F5czpmdW5jdGlvbigpe3JldHVybiBpLmRvbmUoYXJndW1lbnRzKS5mYWlsKGFyZ3VtZW50cyksdGhpc30sdGhlbjpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4geC5EZWZlcnJlZChmdW5jdGlvbihuKXt4LmVhY2godCxmdW5jdGlvbih0LG8pe3ZhciBhPW9bMF0scz14LmlzRnVuY3Rpb24oZVt0XSkmJmVbdF07aVtvWzFdXShmdW5jdGlvbigpe3ZhciBlPXMmJnMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJnguaXNGdW5jdGlvbihlLnByb21pc2UpP2UucHJvbWlzZSgpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KS5wcm9ncmVzcyhuLm5vdGlmeSk6blthKyJXaXRoIl0odGhpcz09PXI/bi5wcm9taXNlKCk6dGhpcyxzP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWU/eC5leHRlbmQoZSxyKTpyfX0saT17fTtyZXR1cm4gci5waXBlPXIudGhlbix4LmVhY2godCxmdW5jdGlvbihlLG8pe3ZhciBhPW9bMl0scz1vWzNdO3Jbb1sxXV09YS5hZGQscyYmYS5hZGQoZnVuY3Rpb24oKXtuPXN9LHRbMV5lXVsyXS5kaXNhYmxlLHRbMl1bMl0ubG9jayksaVtvWzBdXT1mdW5jdGlvbigpe3JldHVybiBpW29bMF0rIldpdGgiXSh0aGlzPT09aT9yOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW29bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksci5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuPWcuY2FsbChhcmd1bWVudHMpLHI9bi5sZW5ndGgsaT0xIT09cnx8ZSYmeC5pc0Z1bmN0aW9uKGUucHJvbWlzZSk/cjowLG89MT09PWk/ZTp4LkRlZmVycmVkKCksYT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3RbZV09dGhpcyxuW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9nLmNhbGwoYXJndW1lbnRzKTpyLG49PT1zP28ubm90aWZ5V2l0aCh0LG4pOi0taXx8by5yZXNvbHZlV2l0aCh0LG4pfX0scyxsLHU7aWYocj4xKWZvcihzPUFycmF5KHIpLGw9QXJyYXkociksdT1BcnJheShyKTtyPnQ7dCsrKW5bdF0mJnguaXNGdW5jdGlvbihuW3RdLnByb21pc2UpP25bdF0ucHJvbWlzZSgpLmRvbmUoYSh0LHUsbikpLmZhaWwoby5yZWplY3QpLnByb2dyZXNzKGEodCxsLHMpKTotLWk7cmV0dXJuIGl8fG8ucmVzb2x2ZVdpdGgodSxuKSxvLnByb21pc2UoKX19KSx4LnN1cHBvcnQ9ZnVuY3Rpb24odCl7dmFyIG4scixvLHMsbCx1LGMscCxmLGQ9YS5jcmVhdGVFbGVtZW50KCJkaXYiKTtpZihkLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLGQuaW5uZXJIVE1MPSIgIDxsaW5rLz48dGFibGU+PC90YWJsZT48YSBocmVmPScvYSc+YTwvYT48aW5wdXQgdHlwZT0nY2hlY2tib3gnLz4iLG49ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpfHxbXSxyPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSwhcnx8IXIuc3R5bGV8fCFuLmxlbmd0aClyZXR1cm4gdDtzPWEuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksdT1zLmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLG89ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxyLnN0eWxlLmNzc1RleHQ9InRvcDoxcHg7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41Iix0LmdldFNldEF0dHJpYnV0ZT0idCIhPT1kLmNsYXNzTmFtZSx0LmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1kLmZpcnN0Q2hpbGQubm9kZVR5cGUsdC50Ym9keT0hZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsdC5odG1sU2VyaWFsaXplPSEhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCx0LnN0eWxlPS90b3AvLnRlc3Qoci5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLHQuaHJlZk5vcm1hbGl6ZWQ9Ii9hIj09PXIuZ2V0QXR0cmlidXRlKCJocmVmIiksdC5vcGFjaXR5PS9eMC41Ly50ZXN0KHIuc3R5bGUub3BhY2l0eSksdC5jc3NGbG9hdD0hIXIuc3R5bGUuY3NzRmxvYXQsdC5jaGVja09uPSEhby52YWx1ZSx0Lm9wdFNlbGVjdGVkPXUuc2VsZWN0ZWQsdC5lbmN0eXBlPSEhYS5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSx0Lmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09YS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCx0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9ITEsdC5zaHJpbmtXcmFwQmxvY2tzPSExLHQucGl4ZWxQb3NpdGlvbj0hMSx0LmRlbGV0ZUV4cGFuZG89ITAsdC5ub0Nsb25lRXZlbnQ9ITAsdC5yZWxpYWJsZU1hcmdpblJpZ2h0PSEwLHQuYm94U2l6aW5nUmVsaWFibGU9ITAsby5jaGVja2VkPSEwLHQubm9DbG9uZUNoZWNrZWQ9by5jbG9uZU5vZGUoITApLmNoZWNrZWQscy5kaXNhYmxlZD0hMCx0Lm9wdERpc2FibGVkPSF1LmRpc2FibGVkO3RyeXtkZWxldGUgZC50ZXN0fWNhdGNoKGgpe3QuZGVsZXRlRXhwYW5kbz0hMX1vPWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxvLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSx0LmlucHV0PSIiPT09by5nZXRBdHRyaWJ1dGUoInZhbHVlIiksby52YWx1ZT0idCIsby5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLHQucmFkaW9WYWx1ZT0idCI9PT1vLnZhbHVlLG8uc2V0QXR0cmlidXRlKCJjaGVja2VkIiwidCIpLG8uc2V0QXR0cmlidXRlKCJuYW1lIiwidCIpLGw9YS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksbC5hcHBlbmRDaGlsZChvKSx0LmFwcGVuZENoZWNrZWQ9by5jaGVja2VkLHQuY2hlY2tDbG9uZT1sLmNsb25lTm9kZSghMCkuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuY2hlY2tlZCxkLmF0dGFjaEV2ZW50JiYoZC5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXt0Lm5vQ2xvbmVFdmVudD0hMX0pLGQuY2xvbmVOb2RlKCEwKS5jbGljaygpKTtmb3IoZiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWQuc2V0QXR0cmlidXRlKGM9Im9uIitmLCJ0IiksdFtmKyJCdWJibGVzIl09YyBpbiBlfHxkLmF0dHJpYnV0ZXNbY10uZXhwYW5kbz09PSExO2Quc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixkLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsdC5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWQuc3R5bGUuYmFja2dyb3VuZENsaXA7Zm9yKGYgaW4geCh0KSlicmVhaztyZXR1cm4gdC5vd25MYXN0PSIwIiE9PWYseChmdW5jdGlvbigpe3ZhciBuLHIsbyxzPSJwYWRkaW5nOjA7bWFyZ2luOjA7Ym9yZGVyOjA7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDstd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7IixsPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXTtsJiYobj1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpLG4uc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0Oi05OTk5cHg7bWFyZ2luLXRvcDoxcHgiLGwuYXBwZW5kQ2hpbGQobikuYXBwZW5kQ2hpbGQoZCksZC5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLG89ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxvWzBdLnN0eWxlLmNzc1RleHQ9InBhZGRpbmc6MDttYXJnaW46MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUiLHA9MD09PW9bMF0ub2Zmc2V0SGVpZ2h0LG9bMF0uc3R5bGUuZGlzcGxheT0iIixvWzFdLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQucmVsaWFibGVIaWRkZW5PZmZzZXRzPXAmJjA9PT1vWzBdLm9mZnNldEhlaWdodCxkLmlubmVySFRNTD0iIixkLnN0eWxlLmNzc1RleHQ9ImJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjFweDtib3JkZXI6MXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6NHB4O21hcmdpbi10b3A6MSU7cG9zaXRpb246YWJzb2x1dGU7dG9wOjElOyIseC5zd2FwKGwsbnVsbCE9bC5zdHlsZS56b29tP3t6b29tOjF9Ont9LGZ1bmN0aW9uKCl7dC5ib3hTaXppbmc9ND09PWQub2Zmc2V0V2lkdGh9KSxlLmdldENvbXB1dGVkU3R5bGUmJih0LnBpeGVsUG9zaXRpb249IjElIiE9PShlLmdldENvbXB1dGVkU3R5bGUoZCxudWxsKXx8e30pLnRvcCx0LmJveFNpemluZ1JlbGlhYmxlPSI0cHgiPT09KGUuZ2V0Q29tcHV0ZWRTdHlsZShkLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxyPWQuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJkaXYiKSksci5zdHlsZS5jc3NUZXh0PWQuc3R5bGUuY3NzVGV4dD1zLHIuc3R5bGUubWFyZ2luUmlnaHQ9ci5zdHlsZS53aWR0aD0iMCIsZC5zdHlsZS53aWR0aD0iMXB4Iix0LnJlbGlhYmxlTWFyZ2luUmlnaHQ9IXBhcnNlRmxvYXQoKGUuZ2V0Q29tcHV0ZWRTdHlsZShyLG51bGwpfHx7fSkubWFyZ2luUmlnaHQpKSx0eXBlb2YgZC5zdHlsZS56b29tIT09aSYmKGQuaW5uZXJIVE1MPSIiLGQuc3R5bGUuY3NzVGV4dD1zKyJ3aWR0aDoxcHg7cGFkZGluZzoxcHg7ZGlzcGxheTppbmxpbmU7em9vbToxIix0LmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9Mz09PWQub2Zmc2V0V2lkdGgsZC5zdHlsZS5kaXNwbGF5PSJibG9jayIsZC5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IixkLmZpcnN0Q2hpbGQuc3R5bGUud2lkdGg9IjVweCIsdC5zaHJpbmtXcmFwQmxvY2tzPTMhPT1kLm9mZnNldFdpZHRoLHQuaW5saW5lQmxvY2tOZWVkc0xheW91dCYmKGwuc3R5bGUuem9vbT0xKSksbC5yZW1vdmVDaGlsZChuKSxuPWQ9bz1yPW51bGwpfSksbj1zPWw9dT1yPW89bnVsbCx0Cn0oe30pO3ZhciBCPS8oPzpce1tcc1xTXSpcfXxcW1tcc1xTXSpcXSkkLyxQPS8oW0EtWl0pL2c7ZnVuY3Rpb24gUihlLG4scixpKXtpZih4LmFjY2VwdERhdGEoZSkpe3ZhciBvLGEscz14LmV4cGFuZG8sbD1lLm5vZGVUeXBlLHU9bD94LmNhY2hlOmUsYz1sP2Vbc106ZVtzXSYmcztpZihjJiZ1W2NdJiYoaXx8dVtjXS5kYXRhKXx8ciE9PXR8fCJzdHJpbmciIT10eXBlb2YgbilyZXR1cm4gY3x8KGM9bD9lW3NdPXAucG9wKCl8fHguZ3VpZCsrOnMpLHVbY118fCh1W2NdPWw/e306e3RvSlNPTjp4Lm5vb3B9KSwoIm9iamVjdCI9PXR5cGVvZiBufHwiZnVuY3Rpb24iPT10eXBlb2YgbikmJihpP3VbY109eC5leHRlbmQodVtjXSxuKTp1W2NdLmRhdGE9eC5leHRlbmQodVtjXS5kYXRhLG4pKSxhPXVbY10saXx8KGEuZGF0YXx8KGEuZGF0YT17fSksYT1hLmRhdGEpLHIhPT10JiYoYVt4LmNhbWVsQ2FzZShuKV09ciksInN0cmluZyI9PXR5cGVvZiBuPyhvPWFbbl0sbnVsbD09byYmKG89YVt4LmNhbWVsQ2FzZShuKV0pKTpvPWEsb319ZnVuY3Rpb24gVyhlLHQsbil7aWYoeC5hY2NlcHREYXRhKGUpKXt2YXIgcixpLG89ZS5ub2RlVHlwZSxhPW8/eC5jYWNoZTplLHM9bz9lW3guZXhwYW5kb106eC5leHBhbmRvO2lmKGFbc10pe2lmKHQmJihyPW4/YVtzXTphW3NdLmRhdGEpKXt4LmlzQXJyYXkodCk/dD10LmNvbmNhdCh4Lm1hcCh0LHguY2FtZWxDYXNlKSk6dCBpbiByP3Q9W3RdOih0PXguY2FtZWxDYXNlKHQpLHQ9dCBpbiByP1t0XTp0LnNwbGl0KCIgIikpLGk9dC5sZW5ndGg7d2hpbGUoaS0tKWRlbGV0ZSByW3RbaV1dO2lmKG4/IUkocik6IXguaXNFbXB0eU9iamVjdChyKSlyZXR1cm59KG58fChkZWxldGUgYVtzXS5kYXRhLEkoYVtzXSkpKSYmKG8/eC5jbGVhbkRhdGEoW2VdLCEwKTp4LnN1cHBvcnQuZGVsZXRlRXhwYW5kb3x8YSE9YS53aW5kb3c/ZGVsZXRlIGFbc106YVtzXT1udWxsKX19fXguZXh0ZW5kKHtjYWNoZTp7fSxub0RhdGE6e2FwcGxldDohMCxlbWJlZDohMCxvYmplY3Q6ImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCJ9LGhhc0RhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5ub2RlVHlwZT94LmNhY2hlW2VbeC5leHBhbmRvXV06ZVt4LmV4cGFuZG9dLCEhZSYmIUkoZSl9LGRhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBSKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe3JldHVybiBXKGUsdCl9LF9kYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gUihlLHQsbiwhMCl9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFcoZSx0LCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihlKXtpZihlLm5vZGVUeXBlJiYxIT09ZS5ub2RlVHlwZSYmOSE9PWUubm9kZVR5cGUpcmV0dXJuITE7dmFyIHQ9ZS5ub2RlTmFtZSYmeC5ub0RhdGFbZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXTtyZXR1cm4hdHx8dCE9PSEwJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3NpZCIpPT09dH19KSx4LmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLG4pe3ZhciByLGksbz1udWxsLGE9MCxzPXRoaXNbMF07aWYoZT09PXQpe2lmKHRoaXMubGVuZ3RoJiYobz14LmRhdGEocyksMT09PXMubm9kZVR5cGUmJiF4Ll9kYXRhKHMsInBhcnNlZEF0dHJzIikpKXtmb3Iocj1zLmF0dHJpYnV0ZXM7ci5sZW5ndGg+YTthKyspaT1yW2FdLm5hbWUsMD09PWkuaW5kZXhPZigiZGF0YS0iKSYmKGk9eC5jYW1lbENhc2UoaS5zbGljZSg1KSksJChzLGksb1tpXSkpO3guX2RhdGEocywicGFyc2VkQXR0cnMiLCEwKX1yZXR1cm4gb31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kYXRhKHRoaXMsZSl9KTphcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kYXRhKHRoaXMsZSxuKX0pOnM/JChzLGUseC5kYXRhKHMsZSkpOm51bGx9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3gucmVtb3ZlRGF0YSh0aGlzLGUpfSl9fSk7ZnVuY3Rpb24gJChlLG4scil7aWYocj09PXQmJjE9PT1lLm5vZGVUeXBlKXt2YXIgaT0iZGF0YS0iK24ucmVwbGFjZShQLCItJDEiKS50b0xvd2VyQ2FzZSgpO2lmKHI9ZS5nZXRBdHRyaWJ1dGUoaSksInN0cmluZyI9PXR5cGVvZiByKXt0cnl7cj0idHJ1ZSI9PT1yPyEwOiJmYWxzZSI9PT1yPyExOiJudWxsIj09PXI/bnVsbDorcisiIj09PXI/K3I6Qi50ZXN0KHIpP3gucGFyc2VKU09OKHIpOnJ9Y2F0Y2gobyl7fXguZGF0YShlLG4scil9ZWxzZSByPXR9cmV0dXJuIHJ9ZnVuY3Rpb24gSShlKXt2YXIgdDtmb3IodCBpbiBlKWlmKCgiZGF0YSIhPT10fHwheC5pc0VtcHR5T2JqZWN0KGVbdF0pKSYmInRvSlNPTiIhPT10KXJldHVybiExO3JldHVybiEwfXguZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihlLG4scil7dmFyIGk7cmV0dXJuIGU/KG49KG58fCJmeCIpKyJxdWV1ZSIsaT14Ll9kYXRhKGUsbiksciYmKCFpfHx4LmlzQXJyYXkocik/aT14Ll9kYXRhKGUsbix4Lm1ha2VBcnJheShyKSk6aS5wdXNoKHIpKSxpfHxbXSk6dH0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj14LnF1ZXVlKGUsdCkscj1uLmxlbmd0aCxpPW4uc2hpZnQoKSxvPXguX3F1ZXVlSG9va3MoZSx0KSxhPWZ1bmN0aW9uKCl7eC5kZXF1ZXVlKGUsdCl9OyJpbnByb2dyZXNzIj09PWkmJihpPW4uc2hpZnQoKSxyLS0pLGkmJigiZngiPT09dCYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIG8uc3RvcCxpLmNhbGwoZSxhLG8pKSwhciYmbyYmby5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIHguX2RhdGEoZSxuKXx8eC5fZGF0YShlLG4se2VtcHR5OnguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe3guX3JlbW92ZURhdGEoZSx0KyJxdWV1ZSIpLHguX3JlbW92ZURhdGEoZSxuKX0pfSl9fSkseC5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsbil7dmFyIHI9MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihuPWUsZT0iZngiLHItLSkscj5hcmd1bWVudHMubGVuZ3RoP3gucXVldWUodGhpc1swXSxlKTpuPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXgucXVldWUodGhpcyxlLG4pO3guX3F1ZXVlSG9va3ModGhpcyxlKSwiZngiPT09ZSYmImlucHJvZ3Jlc3MiIT09dFswXSYmeC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVsYXk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT14LmZ4P3guZnguc3BlZWRzW2VdfHxlOmUsdD10fHwiZngiLHRoaXMucXVldWUodCxmdW5jdGlvbih0LG4pe3ZhciByPXNldFRpbWVvdXQodCxlKTtuLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQocil9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSxuKXt2YXIgcixpPTEsbz14LkRlZmVycmVkKCksYT10aGlzLHM9dGhpcy5sZW5ndGgsbD1mdW5jdGlvbigpey0taXx8by5yZXNvbHZlV2l0aChhLFthXSl9OyJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPXQpLGU9ZXx8ImZ4Ijt3aGlsZShzLS0pcj14Ll9kYXRhKGFbc10sZSsicXVldWVIb29rcyIpLHImJnIuZW1wdHkmJihpKyssci5lbXB0eS5hZGQobCkpO3JldHVybiBsKCksby5wcm9taXNlKG4pfX0pO3ZhciB6LFgsVT0vW1x0XHJcblxmXS9nLFY9L1xyL2csWT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSxKPS9eKD86YXxhcmVhKSQvaSxHPS9eKD86Y2hlY2tlZHxzZWxlY3RlZCkkL2ksUT14LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLEs9eC5zdXBwb3J0LmlucHV0O3guZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMseC5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LnJlbW92ZUF0dHIodGhpcyxlKX0pfSxwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYWNjZXNzKHRoaXMseC5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiBlPXgucHJvcEZpeFtlXXx8ZSx0aGlzLmVhY2goZnVuY3Rpb24oKXt0cnl7dGhpc1tlXT10LGRlbGV0ZSB0aGlzW2VdfWNhdGNoKG4pe319KX0sYWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLGksbyxhPTAscz10aGlzLmxlbmd0aCxsPSJzdHJpbmciPT10eXBlb2YgZSYmZTtpZih4LmlzRnVuY3Rpb24oZSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbih0KXt4KHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGwpZm9yKHQ9KGV8fCIiKS5tYXRjaChUKXx8W107cz5hO2ErKylpZihuPXRoaXNbYV0scj0xPT09bi5ub2RlVHlwZSYmKG4uY2xhc3NOYW1lPygiICIrbi5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKFUsIiAiKToiICIpKXtvPTA7d2hpbGUoaT10W28rK10pMD5yLmluZGV4T2YoIiAiK2krIiAiKSYmKHIrPWkrIiAiKTtuLmNsYXNzTmFtZT14LnRyaW0ocil9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8sYT0wLHM9dGhpcy5sZW5ndGgsbD0wPT09YXJndW1lbnRzLmxlbmd0aHx8InN0cmluZyI9PXR5cGVvZiBlJiZlO2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsdCx0aGlzLmNsYXNzTmFtZSkpfSk7aWYobClmb3IodD0oZXx8IiIpLm1hdGNoKFQpfHxbXTtzPmE7YSsrKWlmKG49dGhpc1thXSxyPTE9PT1uLm5vZGVUeXBlJiYobi5jbGFzc05hbWU/KCIgIituLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoVSwiICIpOiIiKSl7bz0wO3doaWxlKGk9dFtvKytdKXdoaWxlKHIuaW5kZXhPZigiICIraSsiICIpPj0wKXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO24uY2xhc3NOYW1lPWU/eC50cmltKHIpOiIifXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihlLHQpe3ZhciBuPXR5cGVvZiBlO3JldHVybiJib29sZWFuIj09dHlwZW9mIHQmJiJzdHJpbmciPT09bj90P3RoaXMuYWRkQ2xhc3MoZSk6dGhpcy5yZW1vdmVDbGFzcyhlKTp4LmlzRnVuY3Rpb24oZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3godGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbix0aGlzLmNsYXNzTmFtZSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCJzdHJpbmciPT09bil7dmFyIHQscj0wLG89eCh0aGlzKSxhPWUubWF0Y2goVCl8fFtdO3doaWxlKHQ9YVtyKytdKW8uaGFzQ2xhc3ModCk/by5yZW1vdmVDbGFzcyh0KTpvLmFkZENsYXNzKHQpfWVsc2Uobj09PWl8fCJib29sZWFuIj09PW4pJiYodGhpcy5jbGFzc05hbWUmJnguX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxlPT09ITE/IiI6eC5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKX0pfSxoYXNDbGFzczpmdW5jdGlvbihlKXt2YXIgdD0iICIrZSsiICIsbj0wLHI9dGhpcy5sZW5ndGg7Zm9yKDtyPm47bisrKWlmKDE9PT10aGlzW25dLm5vZGVUeXBlJiYoIiAiK3RoaXNbbl0uY2xhc3NOYW1lKyIgIikucmVwbGFjZShVLCIgIikuaW5kZXhPZih0KT49MClyZXR1cm4hMDtyZXR1cm4hMX0sdmFsOmZ1bmN0aW9uKGUpe3ZhciBuLHIsaSxvPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGk9eC5pc0Z1bmN0aW9uKGUpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbzsxPT09dGhpcy5ub2RlVHlwZSYmKG89aT9lLmNhbGwodGhpcyxuLHgodGhpcykudmFsKCkpOmUsbnVsbD09bz9vPSIiOiJudW1iZXIiPT10eXBlb2Ygbz9vKz0iIjp4LmlzQXJyYXkobykmJihvPXgubWFwKG8sZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSxyPXgudmFsSG9va3NbdGhpcy50eXBlXXx8eC52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLHImJiJzZXQiaW4gciYmci5zZXQodGhpcyxvLCJ2YWx1ZSIpIT09dHx8KHRoaXMudmFsdWU9bykpfSk7aWYobylyZXR1cm4gcj14LnZhbEhvb2tzW28udHlwZV18fHgudmFsSG9va3Nbby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSxyJiYiZ2V0ImluIHImJihuPXIuZ2V0KG8sInZhbHVlIikpIT09dD9uOihuPW8udmFsdWUsInN0cmluZyI9PXR5cGVvZiBuP24ucmVwbGFjZShWLCIiKTpudWxsPT1uPyIiOm4pfX19KSx4LmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PXguZmluZC5hdHRyKGUsInZhbHVlIik7cmV0dXJuIG51bGwhPXQ/dDplLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LG89InNlbGVjdC1vbmUiPT09ZS50eXBlfHwwPmksYT1vP251bGw6W10scz1vP2krMTpyLmxlbmd0aCxsPTA+aT9zOm8/aTowO2Zvcig7cz5sO2wrKylpZihuPXJbbF0sISghbi5zZWxlY3RlZCYmbCE9PWl8fCh4LnN1cHBvcnQub3B0RGlzYWJsZWQ/bi5kaXNhYmxlZDpudWxsIT09bi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikpfHxuLnBhcmVudE5vZGUuZGlzYWJsZWQmJngubm9kZU5hbWUobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYodD14KG4pLnZhbCgpLG8pcmV0dXJuIHQ7YS5wdXNoKHQpfXJldHVybiBhfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGk9ZS5vcHRpb25zLG89eC5tYWtlQXJyYXkodCksYT1pLmxlbmd0aDt3aGlsZShhLS0pcj1pW2FdLChyLnNlbGVjdGVkPXguaW5BcnJheSh4KHIpLnZhbCgpLG8pPj0wKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxvfX19LGF0dHI6ZnVuY3Rpb24oZSxuLHIpe3ZhciBvLGEscz1lLm5vZGVUeXBlO2lmKGUmJjMhPT1zJiY4IT09cyYmMiE9PXMpcmV0dXJuIHR5cGVvZiBlLmdldEF0dHJpYnV0ZT09PWk/eC5wcm9wKGUsbixyKTooMT09PXMmJnguaXNYTUxEb2MoZSl8fChuPW4udG9Mb3dlckNhc2UoKSxvPXguYXR0ckhvb2tzW25dfHwoeC5leHByLm1hdGNoLmJvb2wudGVzdChuKT9YOnopKSxyPT09dD9vJiYiZ2V0ImluIG8mJm51bGwhPT0oYT1vLmdldChlLG4pKT9hOihhPXguZmluZC5hdHRyKGUsbiksbnVsbD09YT90OmEpOm51bGwhPT1yP28mJiJzZXQiaW4gbyYmKGE9by5zZXQoZSxyLG4pKSE9PXQ/YTooZS5zZXRBdHRyaWJ1dGUobixyKyIiKSxyKTooeC5yZW1vdmVBdHRyKGUsbiksdCkpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPTAsbz10JiZ0Lm1hdGNoKFQpO2lmKG8mJjE9PT1lLm5vZGVUeXBlKXdoaWxlKG49b1tpKytdKXI9eC5wcm9wRml4W25dfHxuLHguZXhwci5tYXRjaC5ib29sLnRlc3Qobik/SyYmUXx8IUcudGVzdChuKT9lW3JdPSExOmVbeC5jYW1lbENhc2UoImRlZmF1bHQtIituKV09ZVtyXT0hMTp4LmF0dHIoZSxuLCIiKSxlLnJlbW92ZUF0dHJpYnV0ZShRP246cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIXguc3VwcG9ydC5yYWRpb1ZhbHVlJiYicmFkaW8iPT09dCYmeC5ub2RlTmFtZShlLCJpbnB1dCIpKXt2YXIgbj1lLnZhbHVlO3JldHVybiBlLnNldEF0dHJpYnV0ZSgidHlwZSIsdCksbiYmKGUudmFsdWU9biksdH19fX0scHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPWUubm9kZVR5cGU7aWYoZSYmMyE9PXMmJjghPT1zJiYyIT09cylyZXR1cm4gYT0xIT09c3x8IXguaXNYTUxEb2MoZSksYSYmKG49eC5wcm9wRml4W25dfHxuLG89eC5wcm9wSG9va3Nbbl0pLHIhPT10P28mJiJzZXQiaW4gbyYmKGk9by5zZXQoZSxyLG4pKSE9PXQ/aTplW25dPXI6byYmImdldCJpbiBvJiZudWxsIT09KGk9by5nZXQoZSxuKSk/aTplW25dfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9eC5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpZLnRlc3QoZS5ub2RlTmFtZSl8fEoudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX19KSxYPXtzZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PT09ITE/eC5yZW1vdmVBdHRyKGUsbik6SyYmUXx8IUcudGVzdChuKT9lLnNldEF0dHJpYnV0ZSghUSYmeC5wcm9wRml4W25dfHxuLG4pOmVbeC5jYW1lbENhc2UoImRlZmF1bHQtIituKV09ZVtuXT0hMCxufX0seC5lYWNoKHguZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGUsbil7dmFyIHI9eC5leHByLmF0dHJIYW5kbGVbbl18fHguZmluZC5hdHRyO3guZXhwci5hdHRySGFuZGxlW25dPUsmJlF8fCFHLnRlc3Qobik/ZnVuY3Rpb24oZSxuLGkpe3ZhciBvPXguZXhwci5hdHRySGFuZGxlW25dLGE9aT90Oih4LmV4cHIuYXR0ckhhbmRsZVtuXT10KSE9cihlLG4saSk/bi50b0xvd2VyQ2FzZSgpOm51bGw7cmV0dXJuIHguZXhwci5hdHRySGFuZGxlW25dPW8sYX06ZnVuY3Rpb24oZSxuLHIpe3JldHVybiByP3Q6ZVt4LmNhbWVsQ2FzZSgiZGVmYXVsdC0iK24pXT9uLnRvTG93ZXJDYXNlKCk6bnVsbH19KSxLJiZRfHwoeC5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihlLG4scil7cmV0dXJuIHgubm9kZU5hbWUoZSwiaW5wdXQiKT8oZS5kZWZhdWx0VmFsdWU9bix0KTp6JiZ6LnNldChlLG4scil9fSksUXx8KHo9e3NldDpmdW5jdGlvbihlLG4scil7dmFyIGk9ZS5nZXRBdHRyaWJ1dGVOb2RlKHIpO3JldHVybiBpfHxlLnNldEF0dHJpYnV0ZU5vZGUoaT1lLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKHIpKSxpLnZhbHVlPW4rPSIiLCJ2YWx1ZSI9PT1yfHxuPT09ZS5nZXRBdHRyaWJ1dGUocik/bjp0fX0seC5leHByLmF0dHJIYW5kbGUuaWQ9eC5leHByLmF0dHJIYW5kbGUubmFtZT14LmV4cHIuYXR0ckhhbmRsZS5jb29yZHM9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpO3JldHVybiByP3Q6KGk9ZS5nZXRBdHRyaWJ1dGVOb2RlKG4pKSYmIiIhPT1pLnZhbHVlP2kudmFsdWU6bnVsbH0seC52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihlLG4pe3ZhciByPWUuZ2V0QXR0cmlidXRlTm9kZShuKTtyZXR1cm4gciYmci5zcGVjaWZpZWQ/ci52YWx1ZTp0fSxzZXQ6ei5zZXR9LHguYXR0ckhvb2tzLmNvbnRlbnRlZGl0YWJsZT17c2V0OmZ1bmN0aW9uKGUsdCxuKXt6LnNldChlLCIiPT09dD8hMTp0LG4pfX0seC5lYWNoKFsid2lkdGgiLCJoZWlnaHQiXSxmdW5jdGlvbihlLG4pe3guYXR0ckhvb2tzW25dPXtzZXQ6ZnVuY3Rpb24oZSxyKXtyZXR1cm4iIj09PXI/KGUuc2V0QXR0cmlidXRlKG4sImF1dG8iKSxyKTp0fX19KSkseC5zdXBwb3J0LmhyZWZOb3JtYWxpemVkfHx4LmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oZSx0KXt4LnByb3BIb29rc1t0XT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSh0LDQpfX19KSx4LnN1cHBvcnQuc3R5bGV8fCh4LmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnN0eWxlLmNzc1RleHR8fHR9LHNldDpmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0eWxlLmNzc1RleHQ9dCsiIn19KSx4LnN1cHBvcnQub3B0U2VsZWN0ZWR8fCh4LnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KSxudWxsfX0pLHguZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7eC5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLHguc3VwcG9ydC5lbmN0eXBlfHwoeC5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIikseC5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7eC52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsbil7cmV0dXJuIHguaXNBcnJheShuKT9lLmNoZWNrZWQ9eC5pbkFycmF5KHgoZSkudmFsKCksbik+PTA6dH19LHguc3VwcG9ydC5jaGVja09ufHwoeC52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pO3ZhciBaPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaSxldD0vXmtleS8sdHQ9L14oPzptb3VzZXxjb250ZXh0bWVudSl8Y2xpY2svLG50PS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxydD0vXihbXi5dKikoPzpcLiguKyl8KSQvO2Z1bmN0aW9uIGl0KCl7cmV0dXJuITB9ZnVuY3Rpb24gb3QoKXtyZXR1cm4hMX1mdW5jdGlvbiBhdCgpe3RyeXtyZXR1cm4gYS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319eC5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLG4scixvLGEpe3ZhciBzLGwsdSxjLHAsZixkLGgsZyxtLHksdj14Ll9kYXRhKGUpO2lmKHYpe3IuaGFuZGxlciYmKGM9cixyPWMuaGFuZGxlcixhPWMuc2VsZWN0b3IpLHIuZ3VpZHx8KHIuZ3VpZD14Lmd1aWQrKyksKGw9di5ldmVudHMpfHwobD12LmV2ZW50cz17fSksKGY9di5oYW5kbGUpfHwoZj12LmhhbmRsZT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIHg9PT1pfHxlJiZ4LmV2ZW50LnRyaWdnZXJlZD09PWUudHlwZT90OnguZXZlbnQuZGlzcGF0Y2guYXBwbHkoZi5lbGVtLGFyZ3VtZW50cyl9LGYuZWxlbT1lKSxuPShufHwiIikubWF0Y2goVCl8fFsiIl0sdT1uLmxlbmd0aDt3aGlsZSh1LS0pcz1ydC5leGVjKG5bdV0pfHxbXSxnPXk9c1sxXSxtPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZyYmKHA9eC5ldmVudC5zcGVjaWFsW2ddfHx7fSxnPShhP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxnLHA9eC5ldmVudC5zcGVjaWFsW2ddfHx7fSxkPXguZXh0ZW5kKHt0eXBlOmcsb3JpZ1R5cGU6eSxkYXRhOm8saGFuZGxlcjpyLGd1aWQ6ci5ndWlkLHNlbGVjdG9yOmEsbmVlZHNDb250ZXh0OmEmJnguZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChhKSxuYW1lc3BhY2U6bS5qb2luKCIuIil9LGMpLChoPWxbZ10pfHwoaD1sW2ddPVtdLGguZGVsZWdhdGVDb3VudD0wLHAuc2V0dXAmJnAuc2V0dXAuY2FsbChlLG8sbSxmKSE9PSExfHwoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcihnLGYsITEpOmUuYXR0YWNoRXZlbnQmJmUuYXR0YWNoRXZlbnQoIm9uIitnLGYpKSkscC5hZGQmJihwLmFkZC5jYWxsKGUsZCksZC5oYW5kbGVyLmd1aWR8fChkLmhhbmRsZXIuZ3VpZD1yLmd1aWQpKSxhP2guc3BsaWNlKGguZGVsZWdhdGVDb3VudCsrLDAsZCk6aC5wdXNoKGQpLHguZXZlbnQuZ2xvYmFsW2ddPSEwKTtlPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgbyxhLHMsbCx1LGMscCxmLGQsaCxnLG09eC5oYXNEYXRhKGUpJiZ4Ll9kYXRhKGUpO2lmKG0mJihjPW0uZXZlbnRzKSl7dD0odHx8IiIpLm1hdGNoKFQpfHxbIiJdLHU9dC5sZW5ndGg7d2hpbGUodS0tKWlmKHM9cnQuZXhlYyh0W3VdKXx8W10sZD1nPXNbMV0saD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGQpe3A9eC5ldmVudC5zcGVjaWFsW2RdfHx7fSxkPShyP3AuZGVsZWdhdGVUeXBlOnAuYmluZFR5cGUpfHxkLGY9Y1tkXXx8W10scz1zWzJdJiZSZWdFeHAoIihefFxcLikiK2guam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksbD1vPWYubGVuZ3RoO3doaWxlKG8tLSlhPWZbb10sIWkmJmchPT1hLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1hLmd1aWR8fHMmJiFzLnRlc3QoYS5uYW1lc3BhY2UpfHxyJiZyIT09YS5zZWxlY3RvciYmKCIqKiIhPT1yfHwhYS5zZWxlY3Rvcil8fChmLnNwbGljZShvLDEpLGEuc2VsZWN0b3ImJmYuZGVsZWdhdGVDb3VudC0tLHAucmVtb3ZlJiZwLnJlbW92ZS5jYWxsKGUsYSkpO2wmJiFmLmxlbmd0aCYmKHAudGVhcmRvd24mJnAudGVhcmRvd24uY2FsbChlLGgsbS5oYW5kbGUpIT09ITF8fHgucmVtb3ZlRXZlbnQoZSxkLG0uaGFuZGxlKSxkZWxldGUgY1tkXSl9ZWxzZSBmb3IoZCBpbiBjKXguZXZlbnQucmVtb3ZlKGUsZCt0W3VdLG4sciwhMCk7eC5pc0VtcHR5T2JqZWN0KGMpJiYoZGVsZXRlIG0uaGFuZGxlLHguX3JlbW92ZURhdGEoZSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihuLHIsaSxvKXt2YXIgcyxsLHUsYyxwLGYsZCxoPVtpfHxhXSxnPXYuY2FsbChuLCJ0eXBlIik/bi50eXBlOm4sbT12LmNhbGwobiwibmFtZXNwYWNlIik/bi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZih1PWY9aT1pfHxhLDMhPT1pLm5vZGVUeXBlJiY4IT09aS5ub2RlVHlwZSYmIW50LnRlc3QoZyt4LmV2ZW50LnRyaWdnZXJlZCkmJihnLmluZGV4T2YoIi4iKT49MCYmKG09Zy5zcGxpdCgiLiIpLGc9bS5zaGlmdCgpLG0uc29ydCgpKSxsPTA+Zy5pbmRleE9mKCI6IikmJiJvbiIrZyxuPW5beC5leHBhbmRvXT9uOm5ldyB4LkV2ZW50KGcsIm9iamVjdCI9PXR5cGVvZiBuJiZuKSxuLmlzVHJpZ2dlcj1vPzI6MyxuLm5hbWVzcGFjZT1tLmpvaW4oIi4iKSxuLm5hbWVzcGFjZV9yZT1uLm5hbWVzcGFjZT9SZWdFeHAoIihefFxcLikiK20uam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxuLnJlc3VsdD10LG4udGFyZ2V0fHwobi50YXJnZXQ9aSkscj1udWxsPT1yP1tuXTp4Lm1ha2VBcnJheShyLFtuXSkscD14LmV2ZW50LnNwZWNpYWxbZ118fHt9LG98fCFwLnRyaWdnZXJ8fHAudHJpZ2dlci5hcHBseShpLHIpIT09ITEpKXtpZighbyYmIXAubm9CdWJibGUmJiF4LmlzV2luZG93KGkpKXtmb3IoYz1wLmRlbGVnYXRlVHlwZXx8ZyxudC50ZXN0KGMrZyl8fCh1PXUucGFyZW50Tm9kZSk7dTt1PXUucGFyZW50Tm9kZSloLnB1c2godSksZj11O2Y9PT0oaS5vd25lckRvY3VtZW50fHxhKSYmaC5wdXNoKGYuZGVmYXVsdFZpZXd8fGYucGFyZW50V2luZG93fHxlKX1kPTA7d2hpbGUoKHU9aFtkKytdKSYmIW4uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSluLnR5cGU9ZD4xP2M6cC5iaW5kVHlwZXx8ZyxzPSh4Ll9kYXRhKHUsImV2ZW50cyIpfHx7fSlbbi50eXBlXSYmeC5fZGF0YSh1LCJoYW5kbGUiKSxzJiZzLmFwcGx5KHUscikscz1sJiZ1W2xdLHMmJnguYWNjZXB0RGF0YSh1KSYmcy5hcHBseSYmcy5hcHBseSh1LHIpPT09ITEmJm4ucHJldmVudERlZmF1bHQoKTtpZihuLnR5cGU9ZywhbyYmIW4uaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShoLnBvcCgpLHIpPT09ITEpJiZ4LmFjY2VwdERhdGEoaSkmJmwmJmlbZ10mJiF4LmlzV2luZG93KGkpKXtmPWlbbF0sZiYmKGlbbF09bnVsbCkseC5ldmVudC50cmlnZ2VyZWQ9Zzt0cnl7aVtnXSgpfWNhdGNoKHkpe314LmV2ZW50LnRyaWdnZXJlZD10LGYmJihpW2xdPWYpfXJldHVybiBuLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGUpe2U9eC5ldmVudC5maXgoZSk7dmFyIG4scixpLG8sYSxzPVtdLGw9Zy5jYWxsKGFyZ3VtZW50cyksdT0oeC5fZGF0YSh0aGlzLCJldmVudHMiKXx8e30pW2UudHlwZV18fFtdLGM9eC5ldmVudC5zcGVjaWFsW2UudHlwZV18fHt9O2lmKGxbMF09ZSxlLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWMucHJlRGlzcGF0Y2h8fGMucHJlRGlzcGF0Y2guY2FsbCh0aGlzLGUpIT09ITEpe3M9eC5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsZSx1KSxuPTA7d2hpbGUoKG89c1tuKytdKSYmIWUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSl7ZS5jdXJyZW50VGFyZ2V0PW8uZWxlbSxhPTA7d2hpbGUoKGk9by5oYW5kbGVyc1thKytdKSYmIWUuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSkoIWUubmFtZXNwYWNlX3JlfHxlLm5hbWVzcGFjZV9yZS50ZXN0KGkubmFtZXNwYWNlKSkmJihlLmhhbmRsZU9iaj1pLGUuZGF0YT1pLmRhdGEscj0oKHguZXZlbnQuc3BlY2lhbFtpLm9yaWdUeXBlXXx8e30pLmhhbmRsZXx8aS5oYW5kbGVyKS5hcHBseShvLmVsZW0sbCksciE9PXQmJihlLnJlc3VsdD1yKT09PSExJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcFByb3BhZ2F0aW9uKCkpKX1yZXR1cm4gYy5wb3N0RGlzcGF0Y2gmJmMucG9zdERpc3BhdGNoLmNhbGwodGhpcyxlKSxlLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsbil7dmFyIHIsaSxvLGEscz1bXSxsPW4uZGVsZWdhdGVDb3VudCx1PWUudGFyZ2V0O2lmKGwmJnUubm9kZVR5cGUmJighZS5idXR0b258fCJjbGljayIhPT1lLnR5cGUpKWZvcig7dSE9dGhpczt1PXUucGFyZW50Tm9kZXx8dGhpcylpZigxPT09dS5ub2RlVHlwZSYmKHUuZGlzYWJsZWQhPT0hMHx8ImNsaWNrIiE9PWUudHlwZSkpe2ZvcihvPVtdLGE9MDtsPmE7YSsrKWk9blthXSxyPWkuc2VsZWN0b3IrIiAiLG9bcl09PT10JiYob1tyXT1pLm5lZWRzQ29udGV4dD94KHIsdGhpcykuaW5kZXgodSk+PTA6eC5maW5kKHIsdGhpcyxudWxsLFt1XSkubGVuZ3RoKSxvW3JdJiZvLnB1c2goaSk7by5sZW5ndGgmJnMucHVzaCh7ZWxlbTp1LGhhbmRsZXJzOm99KX1yZXR1cm4gbi5sZW5ndGg+bCYmcy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6bi5zbGljZShsKX0pLHN9LGZpeDpmdW5jdGlvbihlKXtpZihlW3guZXhwYW5kb10pcmV0dXJuIGU7dmFyIHQsbixyLGk9ZS50eXBlLG89ZSxzPXRoaXMuZml4SG9va3NbaV07c3x8KHRoaXMuZml4SG9va3NbaV09cz10dC50ZXN0KGkpP3RoaXMubW91c2VIb29rczpldC50ZXN0KGkpP3RoaXMua2V5SG9va3M6e30pLHI9cy5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChzLnByb3BzKTp0aGlzLnByb3BzLGU9bmV3IHguRXZlbnQobyksdD1yLmxlbmd0aDt3aGlsZSh0LS0pbj1yW3RdLGVbbl09b1tuXTtyZXR1cm4gZS50YXJnZXR8fChlLnRhcmdldD1vLnNyY0VsZW1lbnR8fGEpLDM9PT1lLnRhcmdldC5ub2RlVHlwZSYmKGUudGFyZ2V0PWUudGFyZ2V0LnBhcmVudE5vZGUpLGUubWV0YUtleT0hIWUubWV0YUtleSxzLmZpbHRlcj9zLmZpbHRlcihlLG8pOmV9LHByb3BzOiJhbHRLZXkgYnViYmxlcyBjYW5jZWxhYmxlIGN0cmxLZXkgY3VycmVudFRhcmdldCBldmVudFBoYXNlIG1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2giLnNwbGl0KCIgIiksZml4SG9va3M6e30sa2V5SG9va3M6e3Byb3BzOiJjaGFyIGNoYXJDb2RlIGtleSBrZXlDb2RlIi5zcGxpdCgiICIpLGZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lLndoaWNoJiYoZS53aGljaD1udWxsIT10LmNoYXJDb2RlP3QuY2hhckNvZGU6dC5rZXlDb2RlKSxlfX0sbW91c2VIb29rczp7cHJvcHM6ImJ1dHRvbiBidXR0b25zIGNsaWVudFggY2xpZW50WSBmcm9tRWxlbWVudCBvZmZzZXRYIG9mZnNldFkgcGFnZVggcGFnZVkgc2NyZWVuWCBzY3JlZW5ZIHRvRWxlbWVudCIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oZSxuKXt2YXIgcixpLG8scz1uLmJ1dHRvbixsPW4uZnJvbUVsZW1lbnQ7cmV0dXJuIG51bGw9PWUucGFnZVgmJm51bGwhPW4uY2xpZW50WCYmKGk9ZS50YXJnZXQub3duZXJEb2N1bWVudHx8YSxvPWkuZG9jdW1lbnRFbGVtZW50LHI9aS5ib2R5LGUucGFnZVg9bi5jbGllbnRYKyhvJiZvLnNjcm9sbExlZnR8fHImJnIuc2Nyb2xsTGVmdHx8MCktKG8mJm8uY2xpZW50TGVmdHx8ciYmci5jbGllbnRMZWZ0fHwwKSxlLnBhZ2VZPW4uY2xpZW50WSsobyYmby5zY3JvbGxUb3B8fHImJnIuc2Nyb2xsVG9wfHwwKS0obyYmby5jbGllbnRUb3B8fHImJnIuY2xpZW50VG9wfHwwKSksIWUucmVsYXRlZFRhcmdldCYmbCYmKGUucmVsYXRlZFRhcmdldD1sPT09ZS50YXJnZXQ/bi50b0VsZW1lbnQ6bCksZS53aGljaHx8cz09PXR8fChlLndoaWNoPTEmcz8xOjImcz8zOjQmcz8yOjApLGV9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09YXQoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChlKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1hdCgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp0fSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4geC5ub2RlTmFtZSh0aGlzLCJpbnB1dCIpJiYiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrPyh0aGlzLmNsaWNrKCksITEpOnR9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3JldHVybiB4Lm5vZGVOYW1lKGUudGFyZ2V0LCJhIil9fSxiZWZvcmV1bmxvYWQ6e3Bvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLnJlc3VsdCE9PXQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXguZXh0ZW5kKG5ldyB4LkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMCxvcmlnaW5hbEV2ZW50Ont9fSk7cj94LmV2ZW50LnRyaWdnZXIoaSxudWxsLHQpOnguZXZlbnQuZGlzcGF0Y2guY2FsbCh0LGkpLGkuaXNEZWZhdWx0UHJldmVudGVkKCkmJm4ucHJldmVudERlZmF1bHQoKX19LHgucmVtb3ZlRXZlbnQ9YS5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpfTpmdW5jdGlvbihlLHQsbil7dmFyIHI9Im9uIit0O2UuZGV0YWNoRXZlbnQmJih0eXBlb2YgZVtyXT09PWkmJihlW3JdPW51bGwpLGUuZGV0YWNoRXZlbnQocixuKSl9LHguRXZlbnQ9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHguRXZlbnQ/KGUmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fGUucmV0dXJuVmFsdWU9PT0hMXx8ZS5nZXRQcmV2ZW50RGVmYXVsdCYmZS5nZXRQcmV2ZW50RGVmYXVsdCgpP2l0Om90KTp0aGlzLnR5cGU9ZSxuJiZ4LmV4dGVuZCh0aGlzLG4pLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHx4Lm5vdygpLHRoaXNbeC5leHBhbmRvXT0hMCx0KTpuZXcgeC5FdmVudChlLG4pfSx4LkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOm90LGlzUHJvcGFnYXRpb25TdG9wcGVkOm90LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOm90LHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWl0LGUmJihlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9aXQsZSYmKGUuc3RvcFByb3BhZ2F0aW9uJiZlLnN0b3BQcm9wYWdhdGlvbigpLGUuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1pdCx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0seC5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0sZnVuY3Rpb24oZSx0KXt4LmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxpPWUucmVsYXRlZFRhcmdldCxvPWUuaGFuZGxlT2JqO3JldHVybighaXx8aSE9PXImJiF4LmNvbnRhaW5zKHIsaSkpJiYoZS50eXBlPW8ub3JpZ1R5cGUsbj1vLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSx4LnN1cHBvcnQuc3VibWl0QnViYmxlc3x8KHguZXZlbnQuc3BlY2lhbC5zdWJtaXQ9e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIHgubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOih4LmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGUpe3ZhciBuPWUudGFyZ2V0LHI9eC5ub2RlTmFtZShuLCJpbnB1dCIpfHx4Lm5vZGVOYW1lKG4sImJ1dHRvbiIpP24uZm9ybTp0O3ImJiF4Ll9kYXRhKHIsInN1Ym1pdEJ1YmJsZXMiKSYmKHguZXZlbnQuYWRkKHIsInN1Ym1pdC5fc3VibWl0IixmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlPSEwfSkseC5fZGF0YShyLCJzdWJtaXRCdWJibGVzIiwhMCkpfSksdCl9LHBvc3REaXNwYXRjaDpmdW5jdGlvbihlKXtlLl9zdWJtaXRfYnViYmxlJiYoZGVsZXRlIGUuX3N1Ym1pdF9idWJibGUsdGhpcy5wYXJlbnROb2RlJiYhZS5pc1RyaWdnZXImJnguZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGUsITApKX0sdGVhcmRvd246ZnVuY3Rpb24oKXtyZXR1cm4geC5ub2RlTmFtZSh0aGlzLCJmb3JtIik/ITE6KHguZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0IiksdCl9fSkseC5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fCh4LmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBaLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKHguZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpeyJjaGVja2VkIj09PWUub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSkseC5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oZSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhZS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLHguZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxlLCEwKX0pKSwhMSk6KHguZXZlbnQuYWRkKHRoaXMsImJlZm9yZWFjdGl2YXRlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O1oudGVzdCh0Lm5vZGVOYW1lKSYmIXguX2RhdGEodCwiY2hhbmdlQnViYmxlcyIpJiYoeC5ldmVudC5hZGQodCwiY2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGUpeyF0aGlzLnBhcmVudE5vZGV8fGUuaXNTaW11bGF0ZWR8fGUuaXNUcmlnZ2VyfHx4LmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxlLCEwKX0pLHguX2RhdGEodCwiY2hhbmdlQnViYmxlcyIsITApKX0pLHQpfSxoYW5kbGU6ZnVuY3Rpb24oZSl7dmFyIG49ZS50YXJnZXQ7cmV0dXJuIHRoaXMhPT1ufHxlLmlzU2ltdWxhdGVkfHxlLmlzVHJpZ2dlcnx8InJhZGlvIiE9PW4udHlwZSYmImNoZWNrYm94IiE9PW4udHlwZT9lLmhhbmRsZU9iai5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0fSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiB4LmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFaLnRlc3QodGhpcy5ub2RlTmFtZSl9fSkseC5zdXBwb3J0LmZvY3VzaW5CdWJibGVzfHx4LmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWZ1bmN0aW9uKGUpe3guZXZlbnQuc2ltdWxhdGUodCxlLnRhcmdldCx4LmV2ZW50LmZpeChlKSwhMCl9O3guZXZlbnQuc3BlY2lhbFt0XT17c2V0dXA6ZnVuY3Rpb24oKXswPT09bisrJiZhLmFkZEV2ZW50TGlzdGVuZXIoZSxyLCEwKX0sdGVhcmRvd246ZnVuY3Rpb24oKXswPT09LS1uJiZhLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxyLCEwKX19fSkseC5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsbixyLGksbyl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIGUpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXQpO2ZvcihhIGluIGUpdGhpcy5vbihhLG4scixlW2FdLG8pO3JldHVybiB0aGlzfWlmKG51bGw9PXImJm51bGw9PWk/KGk9bixyPW49dCk6bnVsbD09aSYmKCJzdHJpbmciPT10eXBlb2Ygbj8oaT1yLHI9dCk6KGk9cixyPW4sbj10KSksaT09PSExKWk9b3Q7ZWxzZSBpZighaSlyZXR1cm4gdGhpcztyZXR1cm4gMT09PW8mJihzPWksaT1mdW5jdGlvbihlKXtyZXR1cm4geCgpLm9mZihlKSxzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saS5ndWlkPXMuZ3VpZHx8KHMuZ3VpZD14Lmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe3guZXZlbnQuYWRkKHRoaXMsZSxpLHIsbil9KX0sb25lOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLG4scil7dmFyIGksbztpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gaT1lLmhhbmRsZU9iaix4KGUuZGVsZWdhdGVUYXJnZXQpLm9mZihpLm5hbWVzcGFjZT9pLm9yaWdUeXBlKyIuIitpLm5hbWVzcGFjZTppLm9yaWdUeXBlLGkuc2VsZWN0b3IsaS5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgZSl7Zm9yKG8gaW4gZSl0aGlzLm9mZihvLG4sZVtvXSk7cmV0dXJuIHRoaXN9cmV0dXJuKG49PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiYocj1uLG49dCkscj09PSExJiYocj1vdCksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7eC5ldmVudC5yZW1vdmUodGhpcyxlLHIsbil9KX0sdHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt4LmV2ZW50LnRyaWdnZXIoZSx0LHRoaXMpfSl9LHRyaWdnZXJIYW5kbGVyOmZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpc1swXTtyZXR1cm4gcj94LmV2ZW50LnRyaWdnZXIoZSxuLHIsITApOnR9fSk7dmFyIHN0PS9eLlteOiNcW1wuLF0qJC8sbHQ9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sdXQ9eC5leHByLm1hdGNoLm5lZWRzQ29udGV4dCxjdD17Y2hpbGRyZW46ITAsY29udGVudHM6ITAsbmV4dDohMCxwcmV2OiEwfTt4LmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9dGhpcyxpPXIubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soeChlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO2k+dDt0KyspaWYoeC5jb250YWlucyhyW3RdLHRoaXMpKXJldHVybiEwfSkpO2Zvcih0PTA7aT50O3QrKyl4LmZpbmQoZSxyW3RdLG4pO3JldHVybiBuPXRoaXMucHVzaFN0YWNrKGk+MT94LnVuaXF1ZShuKTpuKSxuLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrZTplLG59LGhhczpmdW5jdGlvbihlKXt2YXIgdCxuPXgoZSx0aGlzKSxyPW4ubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih0PTA7cj50O3QrKylpZih4LmNvbnRhaW5zKHRoaXMsblt0XSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhmdCh0aGlzLGV8fFtdLCEwKSl9LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZnQodGhpcyxlfHxbXSwhMSkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWZ0KHRoaXMsInN0cmluZyI9PXR5cGVvZiBlJiZ1dC50ZXN0KGUpP3goZSk6ZXx8W10sITEpLmxlbmd0aH0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxpPXRoaXMubGVuZ3RoLG89W10sYT11dC50ZXN0KGUpfHwic3RyaW5nIiE9dHlwZW9mIGU/eChlLHR8fHRoaXMuY29udGV4dCk6MDtmb3IoO2k+cjtyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09dDtuPW4ucGFyZW50Tm9kZSlpZigxMT5uLm5vZGVUeXBlJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZ4LmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtuPW8ucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soby5sZW5ndGg+MT94LnVuaXF1ZShvKTpvKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP3guaW5BcnJheSh0aGlzWzBdLHgoZSkpOnguaW5BcnJheShlLmpxdWVyeT9lWzBdOmUsdGhpcyk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj0ic3RyaW5nIj09dHlwZW9mIGU/eChlLHQpOngubWFrZUFycmF5KGUmJmUubm9kZVR5cGU/W2VdOmUpLHI9eC5tZXJnZSh0aGlzLmdldCgpLG4pO3JldHVybiB0aGlzLnB1c2hTdGFjayh4LnVuaXF1ZShyKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pO2Z1bmN0aW9uIHB0KGUsdCl7ZG8gZT1lW3RdO3doaWxlKGUmJjEhPT1lLm5vZGVUeXBlKTtyZXR1cm4gZX14LmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHguZGlyKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHB0KGUsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oZSl7cmV0dXJuIHB0KGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiB4LmRpcihlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4geC5kaXIoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB4LmRpcihlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4geC5zaWJsaW5nKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4geC5zaWJsaW5nKGUuZmlyc3RDaGlsZCl9LGNvbnRlbnRzOmZ1bmN0aW9uKGUpe3JldHVybiB4Lm5vZGVOYW1lKGUsImlmcmFtZSIpP2UuY29udGVudERvY3VtZW50fHxlLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ6eC5tZXJnZShbXSxlLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oZSx0KXt4LmZuW2VdPWZ1bmN0aW9uKG4scil7dmFyIGk9eC5tYXAodGhpcyx0LG4pO3JldHVybiJVbnRpbCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYoaT14LmZpbHRlcihyLGkpKSx0aGlzLmxlbmd0aD4xJiYoY3RbZV18fChpPXgudW5pcXVlKGkpKSxsdC50ZXN0KGUpJiYoaT1pLnJldmVyc2UoKSkpLHRoaXMucHVzaFN0YWNrKGkpfX0pLHguZXh0ZW5kKHtmaWx0ZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/eC5maW5kLm1hdGNoZXNTZWxlY3RvcihyLGUpP1tyXTpbXTp4LmZpbmQubWF0Y2hlcyhlLHguZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sZGlyOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1bXSxvPWVbbl07d2hpbGUobyYmOSE9PW8ubm9kZVR5cGUmJihyPT09dHx8MSE9PW8ubm9kZVR5cGV8fCF4KG8pLmlzKHIpKSkxPT09by5ub2RlVHlwZSYmaS5wdXNoKG8pLG89b1tuXTtyZXR1cm4gaX0sc2libGluZzpmdW5jdGlvbihlLHQpe3ZhciBuPVtdO2Zvcig7ZTtlPWUubmV4dFNpYmxpbmcpMT09PWUubm9kZVR5cGUmJmUhPT10JiZuLnB1c2goZSk7cmV0dXJuIG59fSk7ZnVuY3Rpb24gZnQoZSx0LG4pe2lmKHguaXNGdW5jdGlvbih0KSlyZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4hIXQuY2FsbChlLHIsZSkhPT1ufSk7aWYodC5ub2RlVHlwZSlyZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoc3QudGVzdCh0KSlyZXR1cm4geC5maWx0ZXIodCxlLG4pO3Q9eC5maWx0ZXIodCxlKX1yZXR1cm4geC5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHguaW5BcnJheShlLHQpPj0wIT09bn0pfWZ1bmN0aW9uIGR0KGUpe3ZhciB0PWh0LnNwbGl0KCJ8Iiksbj1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihuLmNyZWF0ZUVsZW1lbnQpd2hpbGUodC5sZW5ndGgpbi5jcmVhdGVFbGVtZW50KHQucG9wKCkpO3JldHVybiBufXZhciBodD0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZ3Q9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxtdD1SZWdFeHAoIjwoPzoiK2h0KyIpW1xccy8+XSIsImkiKSx5dD0vXlxzKy8sdnQ9LzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9naSxidD0vPChbXHc6XSspLyx4dD0vPHRib2R5L2ksd3Q9Lzx8JiM/XHcrOy8sVHQ9LzwoPzpzY3JpcHR8c3R5bGV8bGluaykvaSxDdD0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxOdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxrdD0vXiR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksRXQ9L150cnVlXC8oLiopLyxTdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2csQXQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLGxlZ2VuZDpbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il0sYXJlYTpbMSwiPG1hcD4iLCI8L21hcD4iXSxwYXJhbTpbMSwiPG9iamVjdD4iLCI8L29iamVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0Onguc3VwcG9ydC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPC9kaXY+Il19LGp0PWR0KGEpLER0PWp0LmFwcGVuZENoaWxkKGEuY3JlYXRlRWxlbWVudCgiZGl2IikpO0F0Lm9wdGdyb3VwPUF0Lm9wdGlvbixBdC50Ym9keT1BdC50Zm9vdD1BdC5jb2xncm91cD1BdC5jYXB0aW9uPUF0LnRoZWFkLEF0LnRoPUF0LnRkLHguZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD94LnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHxhKS5jcmVhdGVUZXh0Tm9kZShlKSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1MdCh0aGlzLGUpO3QuYXBwZW5kQ2hpbGQoZSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PUx0KHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lP3guZmlsdGVyKGUsdGhpcyk6dGhpcyxpPTA7Zm9yKDtudWxsIT0obj1yW2ldKTtpKyspdHx8MSE9PW4ubm9kZVR5cGV8fHguY2xlYW5EYXRhKEZ0KG4pKSxuLnBhcmVudE5vZGUmJih0JiZ4LmNvbnRhaW5zKG4ub3duZXJEb2N1bWVudCxuKSYmX3QoRnQobiwic2NyaXB0IikpLG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSk7cmV0dXJuIHRoaXN9LGVtcHR5OmZ1bmN0aW9uKCl7dmFyIGUsdD0wO2Zvcig7bnVsbCE9KGU9dGhpc1t0XSk7dCsrKXsxPT09ZS5ub2RlVHlwZSYmeC5jbGVhbkRhdGEoRnQoZSwhMSkpO3doaWxlKGUuZmlyc3RDaGlsZCllLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCk7ZS5vcHRpb25zJiZ4Lm5vZGVOYW1lKGUsInNlbGVjdCIpJiYoZS5vcHRpb25zLmxlbmd0aD0wKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsPT1lPyExOmUsdD1udWxsPT10P2U6dCx0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB4LmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiB4LmFjY2Vzcyh0aGlzLGZ1bmN0aW9uKGUpe3ZhciBuPXRoaXNbMF18fHt9LHI9MCxpPXRoaXMubGVuZ3RoO2lmKGU9PT10KXJldHVybiAxPT09bi5ub2RlVHlwZT9uLmlubmVySFRNTC5yZXBsYWNlKGd0LCIiKTp0O2lmKCEoInN0cmluZyIhPXR5cGVvZiBlfHxUdC50ZXN0KGUpfHwheC5zdXBwb3J0Lmh0bWxTZXJpYWxpemUmJm10LnRlc3QoZSl8fCF4LnN1cHBvcnQubGVhZGluZ1doaXRlc3BhY2UmJnl0LnRlc3QoZSl8fEF0WyhidC5leGVjKGUpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2U9ZS5yZXBsYWNlKHZ0LCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtpPnI7cisrKW49dGhpc1tyXXx8e30sMT09PW4ubm9kZVR5cGUmJih4LmNsZWFuRGF0YShGdChuLCExKSksbi5pbm5lckhUTUw9ZSk7bj0wfWNhdGNoKG8pe319biYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPXgubWFwKHRoaXMsZnVuY3Rpb24oZSl7cmV0dXJuW2UubmV4dFNpYmxpbmcsZS5wYXJlbnROb2RlXX0pLHQ9MDtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24obil7dmFyIHI9ZVt0KytdLGk9ZVt0KytdO2kmJihyJiZyLnBhcmVudE5vZGUhPT1pJiYocj10aGlzLm5leHRTaWJsaW5nKSx4KHRoaXMpLnJlbW92ZSgpLGkuaW5zZXJ0QmVmb3JlKG4scikpfSwhMCksdD90aGlzOnRoaXMucmVtb3ZlKCl9LGRldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5yZW1vdmUoZSwhMCl9LGRvbU1hbmlwOmZ1bmN0aW9uKGUsdCxuKXtlPWQuYXBwbHkoW10sZSk7dmFyIHIsaSxvLGEscyxsLHU9MCxjPXRoaXMubGVuZ3RoLHA9dGhpcyxmPWMtMSxoPWVbMF0sZz14LmlzRnVuY3Rpb24oaCk7aWYoZ3x8ISgxPj1jfHwic3RyaW5nIiE9dHlwZW9mIGh8fHguc3VwcG9ydC5jaGVja0Nsb25lKSYmTnQudGVzdChoKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHIpe3ZhciBpPXAuZXEocik7ZyYmKGVbMF09aC5jYWxsKHRoaXMscixpLmh0bWwoKSkpLGkuZG9tTWFuaXAoZSx0LG4pfSk7aWYoYyYmKGw9eC5idWlsZEZyYWdtZW50KGUsdGhpc1swXS5vd25lckRvY3VtZW50LCExLCFuJiZ0aGlzKSxyPWwuZmlyc3RDaGlsZCwxPT09bC5jaGlsZE5vZGVzLmxlbmd0aCYmKGw9cikscikpe2ZvcihhPXgubWFwKEZ0KGwsInNjcmlwdCIpLEh0KSxvPWEubGVuZ3RoO2M+dTt1KyspaT1sLHUhPT1mJiYoaT14LmNsb25lKGksITAsITApLG8mJngubWVyZ2UoYSxGdChpLCJzY3JpcHQiKSkpLHQuY2FsbCh0aGlzW3VdLGksdSk7aWYobylmb3Iocz1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQseC5tYXAoYSxxdCksdT0wO28+dTt1KyspaT1hW3VdLGt0LnRlc3QoaS50eXBlfHwiIikmJiF4Ll9kYXRhKGksImdsb2JhbEV2YWwiKSYmeC5jb250YWlucyhzLGkpJiYoaS5zcmM/eC5fZXZhbFVybChpLnNyYyk6eC5nbG9iYWxFdmFsKChpLnRleHR8fGkudGV4dENvbnRlbnR8fGkuaW5uZXJIVE1MfHwiIikucmVwbGFjZShTdCwiIikpKTtsPXI9bnVsbH1yZXR1cm4gdGhpc319KTtmdW5jdGlvbiBMdChlLHQpe3JldHVybiB4Lm5vZGVOYW1lKGUsInRhYmxlIikmJngubm9kZU5hbWUoMT09PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8ZS5hcHBlbmRDaGlsZChlLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6ZX1mdW5jdGlvbiBIdChlKXtyZXR1cm4gZS50eXBlPShudWxsIT09eC5maW5kLmF0dHIoZSwidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gcXQoZSl7dmFyIHQ9RXQuZXhlYyhlLnR5cGUpO3JldHVybiB0P2UudHlwZT10WzFdOmUucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksZX1mdW5jdGlvbiBfdChlLHQpe3ZhciBuLHI9MDtmb3IoO251bGwhPShuPWVbcl0pO3IrKyl4Ll9kYXRhKG4sImdsb2JhbEV2YWwiLCF0fHx4Ll9kYXRhKHRbcl0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gTXQoZSx0KXtpZigxPT09dC5ub2RlVHlwZSYmeC5oYXNEYXRhKGUpKXt2YXIgbixyLGksbz14Ll9kYXRhKGUpLGE9eC5fZGF0YSh0LG8pLHM9by5ldmVudHM7aWYocyl7ZGVsZXRlIGEuaGFuZGxlLGEuZXZlbnRzPXt9O2ZvcihuIGluIHMpZm9yKHI9MCxpPXNbbl0ubGVuZ3RoO2k+cjtyKyspeC5ldmVudC5hZGQodCxuLHNbbl1bcl0pfWEuZGF0YSYmKGEuZGF0YT14LmV4dGVuZCh7fSxhLmRhdGEpKX19ZnVuY3Rpb24gT3QoZSx0KXt2YXIgbixyLGk7aWYoMT09PXQubm9kZVR5cGUpe2lmKG49dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCF4LnN1cHBvcnQubm9DbG9uZUV2ZW50JiZ0W3guZXhwYW5kb10pe2k9eC5fZGF0YSh0KTtmb3IociBpbiBpLmV2ZW50cyl4LnJlbW92ZUV2ZW50KHQscixpLmhhbmRsZSk7dC5yZW1vdmVBdHRyaWJ1dGUoeC5leHBhbmRvKX0ic2NyaXB0Ij09PW4mJnQudGV4dCE9PWUudGV4dD8oSHQodCkudGV4dD1lLnRleHQscXQodCkpOiJvYmplY3QiPT09bj8odC5wYXJlbnROb2RlJiYodC5vdXRlckhUTUw9ZS5vdXRlckhUTUwpLHguc3VwcG9ydC5odG1sNUNsb25lJiZlLmlubmVySFRNTCYmIXgudHJpbSh0LmlubmVySFRNTCkmJih0LmlubmVySFRNTD1lLmlubmVySFRNTCkpOiJpbnB1dCI9PT1uJiZDdC50ZXN0KGUudHlwZSk/KHQuZGVmYXVsdENoZWNrZWQ9dC5jaGVja2VkPWUuY2hlY2tlZCx0LnZhbHVlIT09ZS52YWx1ZSYmKHQudmFsdWU9ZS52YWx1ZSkpOiJvcHRpb24iPT09bj90LmRlZmF1bHRTZWxlY3RlZD10LnNlbGVjdGVkPWUuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09bnx8InRleHRhcmVhIj09PW4pJiYodC5kZWZhdWx0VmFsdWU9ZS5kZWZhdWx0VmFsdWUpfX14LmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe3guZm5bZV09ZnVuY3Rpb24oZSl7dmFyIG4scj0wLGk9W10sbz14KGUpLGE9by5sZW5ndGgtMTtmb3IoO2E+PXI7cisrKW49cj09PWE/dGhpczp0aGlzLmNsb25lKCEwKSx4KG9bcl0pW3RdKG4pLGguYXBwbHkoaSxuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soaSl9fSk7ZnVuY3Rpb24gRnQoZSxuKXt2YXIgcixvLGE9MCxzPXR5cGVvZiBlLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09aT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKG58fCIqIik6dHlwZW9mIGUucXVlcnlTZWxlY3RvckFsbCE9PWk/ZS5xdWVyeVNlbGVjdG9yQWxsKG58fCIqIik6dDtpZighcylmb3Iocz1bXSxyPWUuY2hpbGROb2Rlc3x8ZTtudWxsIT0obz1yW2FdKTthKyspIW58fHgubm9kZU5hbWUobyxuKT9zLnB1c2gobyk6eC5tZXJnZShzLEZ0KG8sbikpO3JldHVybiBuPT09dHx8biYmeC5ub2RlTmFtZShlLG4pP3gubWVyZ2UoW2VdLHMpOnN9ZnVuY3Rpb24gQnQoZSl7Q3QudGVzdChlLnR5cGUpJiYoZS5kZWZhdWx0Q2hlY2tlZD1lLmNoZWNrZWQpfXguZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsaSxvLGEscyxsPXguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpO2lmKHguc3VwcG9ydC5odG1sNUNsb25lfHx4LmlzWE1MRG9jKGUpfHwhbXQudGVzdCgiPCIrZS5ub2RlTmFtZSsiPiIpP289ZS5jbG9uZU5vZGUoITApOihEdC5pbm5lckhUTUw9ZS5vdXRlckhUTUwsRHQucmVtb3ZlQ2hpbGQobz1EdC5maXJzdENoaWxkKSksISh4LnN1cHBvcnQubm9DbG9uZUV2ZW50JiZ4LnN1cHBvcnQubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fHguaXNYTUxEb2MoZSkpKWZvcihyPUZ0KG8pLHM9RnQoZSksYT0wO251bGwhPShpPXNbYV0pOysrYSlyW2FdJiZPdChpLHJbYV0pO2lmKHQpaWYobilmb3Iocz1zfHxGdChlKSxyPXJ8fEZ0KG8pLGE9MDtudWxsIT0oaT1zW2FdKTthKyspTXQoaSxyW2FdKTtlbHNlIE10KGUsbyk7cmV0dXJuIHI9RnQobywic2NyaXB0Iiksci5sZW5ndGg+MCYmX3QociwhbCYmRnQoZSwic2NyaXB0IikpLHI9cz1pPW51bGwsb30sYnVpbGRGcmFnbWVudDpmdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvLGEscyxsLHUsYyxwPWUubGVuZ3RoLGY9ZHQodCksZD1bXSxoPTA7Zm9yKDtwPmg7aCsrKWlmKG89ZVtoXSxvfHwwPT09bylpZigib2JqZWN0Ij09PXgudHlwZShvKSl4Lm1lcmdlKGQsby5ub2RlVHlwZT9bb106byk7ZWxzZSBpZih3dC50ZXN0KG8pKXtzPXN8fGYuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSksbD0oYnQuZXhlYyhvKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxjPUF0W2xdfHxBdC5fZGVmYXVsdCxzLmlubmVySFRNTD1jWzFdK28ucmVwbGFjZSh2dCwiPCQxPjwvJDI+IikrY1syXSxpPWNbMF07d2hpbGUoaS0tKXM9cy5sYXN0Q2hpbGQ7aWYoIXguc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmeXQudGVzdChvKSYmZC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUoeXQuZXhlYyhvKVswXSkpLCF4LnN1cHBvcnQudGJvZHkpe289InRhYmxlIiE9PWx8fHh0LnRlc3Qobyk/Ijx0YWJsZT4iIT09Y1sxXXx8eHQudGVzdChvKT8wOnM6cy5maXJzdENoaWxkLGk9byYmby5jaGlsZE5vZGVzLmxlbmd0aDt3aGlsZShpLS0peC5ub2RlTmFtZSh1PW8uY2hpbGROb2Rlc1tpXSwidGJvZHkiKSYmIXUuY2hpbGROb2Rlcy5sZW5ndGgmJm8ucmVtb3ZlQ2hpbGQodSl9eC5tZXJnZShkLHMuY2hpbGROb2Rlcykscy50ZXh0Q29udGVudD0iIjt3aGlsZShzLmZpcnN0Q2hpbGQpcy5yZW1vdmVDaGlsZChzLmZpcnN0Q2hpbGQpO3M9Zi5sYXN0Q2hpbGR9ZWxzZSBkLnB1c2godC5jcmVhdGVUZXh0Tm9kZShvKSk7cyYmZi5yZW1vdmVDaGlsZChzKSx4LnN1cHBvcnQuYXBwZW5kQ2hlY2tlZHx8eC5ncmVwKEZ0KGQsImlucHV0IiksQnQpLGg9MDt3aGlsZShvPWRbaCsrXSlpZigoIXJ8fC0xPT09eC5pbkFycmF5KG8scikpJiYoYT14LmNvbnRhaW5zKG8ub3duZXJEb2N1bWVudCxvKSxzPUZ0KGYuYXBwZW5kQ2hpbGQobyksInNjcmlwdCIpLGEmJl90KHMpLG4pKXtpPTA7d2hpbGUobz1zW2krK10pa3QudGVzdChvLnR5cGV8fCIiKSYmbi5wdXNoKG8pfXJldHVybiBzPW51bGwsZn0sY2xlYW5EYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEscz0wLGw9eC5leHBhbmRvLHU9eC5jYWNoZSxjPXguc3VwcG9ydC5kZWxldGVFeHBhbmRvLGY9eC5ldmVudC5zcGVjaWFsO2Zvcig7bnVsbCE9KG49ZVtzXSk7cysrKWlmKCh0fHx4LmFjY2VwdERhdGEobikpJiYobz1uW2xdLGE9byYmdVtvXSkpe2lmKGEuZXZlbnRzKWZvcihyIGluIGEuZXZlbnRzKWZbcl0/eC5ldmVudC5yZW1vdmUobixyKTp4LnJlbW92ZUV2ZW50KG4scixhLmhhbmRsZSk7CnVbb10mJihkZWxldGUgdVtvXSxjP2RlbGV0ZSBuW2xdOnR5cGVvZiBuLnJlbW92ZUF0dHJpYnV0ZSE9PWk/bi5yZW1vdmVBdHRyaWJ1dGUobCk6bltsXT1udWxsLHAucHVzaChvKSl9fSxfZXZhbFVybDpmdW5jdGlvbihlKXtyZXR1cm4geC5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGFzeW5jOiExLGdsb2JhbDohMSwidGhyb3dzIjohMH0pfX0pLHguZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe2lmKHguaXNGdW5jdGlvbihlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe3godGhpcykud3JhcEFsbChlLmNhbGwodGhpcyx0KSl9KTtpZih0aGlzWzBdKXt2YXIgdD14KGUsdGhpc1swXS5vd25lckRvY3VtZW50KS5lcSgwKS5jbG9uZSghMCk7dGhpc1swXS5wYXJlbnROb2RlJiZ0Lmluc2VydEJlZm9yZSh0aGlzWzBdKSx0Lm1hcChmdW5jdGlvbigpe3ZhciBlPXRoaXM7d2hpbGUoZS5maXJzdENoaWxkJiYxPT09ZS5maXJzdENoaWxkLm5vZGVUeXBlKWU9ZS5maXJzdENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpfXJldHVybiB0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHguaXNGdW5jdGlvbihlKT90aGlzLmVhY2goZnVuY3Rpb24odCl7eCh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD14LmlzRnVuY3Rpb24oZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXt4KHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7eC5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fHgodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pO3ZhciBQdCxSdCxXdCwkdD0vYWxwaGFcKFteKV0qXCkvaSxJdD0vb3BhY2l0eVxzKj1ccyooW14pXSopLyx6dD0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC8sWHQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFV0PS9ebWFyZ2luLyxWdD1SZWdFeHAoIl4oIit3KyIpKC4qKSQiLCJpIiksWXQ9UmVnRXhwKCJeKCIrdysiKSg/IXB4KVthLXolXSskIiwiaSIpLEp0PVJlZ0V4cCgiXihbKy1dKT0oIit3KyIpIiwiaSIpLEd0PXtCT0RZOiJibG9jayJ9LFF0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxLdD17bGV0dGVyU3BhY2luZzowLGZvbnRXZWlnaHQ6NDAwfSxadD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGVuPVsiV2Via2l0IiwiTyIsIk1veiIsIm1zIl07ZnVuY3Rpb24gdG4oZSx0KXtpZih0IGluIGUpcmV0dXJuIHQ7dmFyIG49dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLHI9dCxpPWVuLmxlbmd0aDt3aGlsZShpLS0paWYodD1lbltpXStuLHQgaW4gZSlyZXR1cm4gdDtyZXR1cm4gcn1mdW5jdGlvbiBubihlLHQpe3JldHVybiBlPXR8fGUsIm5vbmUiPT09eC5jc3MoZSwiZGlzcGxheSIpfHwheC5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSl9ZnVuY3Rpb24gcm4oZSx0KXt2YXIgbixyLGksbz1bXSxhPTAscz1lLmxlbmd0aDtmb3IoO3M+YTthKyspcj1lW2FdLHIuc3R5bGUmJihvW2FdPXguX2RhdGEociwib2xkZGlzcGxheSIpLG49ci5zdHlsZS5kaXNwbGF5LHQ/KG9bYV18fCJub25lIiE9PW58fChyLnN0eWxlLmRpc3BsYXk9IiIpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZubihyKSYmKG9bYV09eC5fZGF0YShyLCJvbGRkaXNwbGF5IixsbihyLm5vZGVOYW1lKSkpKTpvW2FdfHwoaT1ubihyKSwobiYmIm5vbmUiIT09bnx8IWkpJiZ4Ll9kYXRhKHIsIm9sZGRpc3BsYXkiLGk/bjp4LmNzcyhyLCJkaXNwbGF5IikpKSk7Zm9yKGE9MDtzPmE7YSsrKXI9ZVthXSxyLnN0eWxlJiYodCYmIm5vbmUiIT09ci5zdHlsZS5kaXNwbGF5JiYiIiE9PXIuc3R5bGUuZGlzcGxheXx8KHIuc3R5bGUuZGlzcGxheT10P29bYV18fCIiOiJub25lIikpO3JldHVybiBlfXguZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSxuKXtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihlLG4scil7dmFyIGksbyxhPXt9LHM9MDtpZih4LmlzQXJyYXkobikpe2ZvcihvPVJ0KGUpLGk9bi5sZW5ndGg7aT5zO3MrKylhW25bc11dPXguY3NzKGUsbltzXSwhMSxvKTtyZXR1cm4gYX1yZXR1cm4gciE9PXQ/eC5zdHlsZShlLG4scik6eC5jc3MoZSxuKX0sZSxuLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHNob3c6ZnVuY3Rpb24oKXtyZXR1cm4gcm4odGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gcm4odGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7bm4odGhpcyk/eCh0aGlzKS5zaG93KCk6eCh0aGlzKS5oaWRlKCl9KX19KSx4LmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPVd0KGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZm9udFdlaWdodDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnsiZmxvYXQiOnguc3VwcG9ydC5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oZSxuLHIsaSl7aWYoZSYmMyE9PWUubm9kZVR5cGUmJjghPT1lLm5vZGVUeXBlJiZlLnN0eWxlKXt2YXIgbyxhLHMsbD14LmNhbWVsQ2FzZShuKSx1PWUuc3R5bGU7aWYobj14LmNzc1Byb3BzW2xdfHwoeC5jc3NQcm9wc1tsXT10bih1LGwpKSxzPXguY3NzSG9va3Nbbl18fHguY3NzSG9va3NbbF0scj09PXQpcmV0dXJuIHMmJiJnZXQiaW4gcyYmKG89cy5nZXQoZSwhMSxpKSkhPT10P286dVtuXTtpZihhPXR5cGVvZiByLCJzdHJpbmciPT09YSYmKG89SnQuZXhlYyhyKSkmJihyPShvWzFdKzEpKm9bMl0rcGFyc2VGbG9hdCh4LmNzcyhlLG4pKSxhPSJudW1iZXIiKSwhKG51bGw9PXJ8fCJudW1iZXIiPT09YSYmaXNOYU4ocil8fCgibnVtYmVyIiE9PWF8fHguY3NzTnVtYmVyW2xdfHwocis9InB4IikseC5zdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZXx8IiIhPT1yfHwwIT09bi5pbmRleE9mKCJiYWNrZ3JvdW5kIil8fCh1W25dPSJpbmhlcml0IikscyYmInNldCJpbiBzJiYocj1zLnNldChlLHIsaSkpPT09dCkpKXRyeXt1W25dPXJ9Y2F0Y2goYyl7fX19LGNzczpmdW5jdGlvbihlLG4scixpKXt2YXIgbyxhLHMsbD14LmNhbWVsQ2FzZShuKTtyZXR1cm4gbj14LmNzc1Byb3BzW2xdfHwoeC5jc3NQcm9wc1tsXT10bihlLnN0eWxlLGwpKSxzPXguY3NzSG9va3Nbbl18fHguY3NzSG9va3NbbF0scyYmImdldCJpbiBzJiYoYT1zLmdldChlLCEwLHIpKSxhPT09dCYmKGE9V3QoZSxuLGkpKSwibm9ybWFsIj09PWEmJm4gaW4gS3QmJihhPUt0W25dKSwiIj09PXJ8fHI/KG89cGFyc2VGbG9hdChhKSxyPT09ITB8fHguaXNOdW1lcmljKG8pP298fDA6YSk6YX19KSxlLmdldENvbXB1dGVkU3R5bGU/KFJ0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmdldENvbXB1dGVkU3R5bGUodCxudWxsKX0sV3Q9ZnVuY3Rpb24oZSxuLHIpe3ZhciBpLG8sYSxzPXJ8fFJ0KGUpLGw9cz9zLmdldFByb3BlcnR5VmFsdWUobil8fHNbbl06dCx1PWUuc3R5bGU7cmV0dXJuIHMmJigiIiE9PWx8fHguY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfHwobD14LnN0eWxlKGUsbikpLFl0LnRlc3QobCkmJlV0LnRlc3QobikmJihpPXUud2lkdGgsbz11Lm1pbldpZHRoLGE9dS5tYXhXaWR0aCx1Lm1pbldpZHRoPXUubWF4V2lkdGg9dS53aWR0aD1sLGw9cy53aWR0aCx1LndpZHRoPWksdS5taW5XaWR0aD1vLHUubWF4V2lkdGg9YSkpLGx9KTphLmRvY3VtZW50RWxlbWVudC5jdXJyZW50U3R5bGUmJihSdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5jdXJyZW50U3R5bGV9LFd0PWZ1bmN0aW9uKGUsbixyKXt2YXIgaSxvLGEscz1yfHxSdChlKSxsPXM/c1tuXTp0LHU9ZS5zdHlsZTtyZXR1cm4gbnVsbD09bCYmdSYmdVtuXSYmKGw9dVtuXSksWXQudGVzdChsKSYmIXp0LnRlc3QobikmJihpPXUubGVmdCxvPWUucnVudGltZVN0eWxlLGE9byYmby5sZWZ0LGEmJihvLmxlZnQ9ZS5jdXJyZW50U3R5bGUubGVmdCksdS5sZWZ0PSJmb250U2l6ZSI9PT1uPyIxZW0iOmwsbD11LnBpeGVsTGVmdCsicHgiLHUubGVmdD1pLGEmJihvLmxlZnQ9YSkpLCIiPT09bD8iYXV0byI6bH0pO2Z1bmN0aW9uIG9uKGUsdCxuKXt2YXIgcj1WdC5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsxXS0obnx8MCkpKyhyWzJdfHwicHgiKTp0fWZ1bmN0aW9uIGFuKGUsdCxuLHIsaSl7dmFyIG89bj09PShyPyJib3JkZXIiOiJjb250ZW50Iik/NDoid2lkdGgiPT09dD8xOjAsYT0wO2Zvcig7ND5vO28rPTIpIm1hcmdpbiI9PT1uJiYoYSs9eC5jc3MoZSxuK1p0W29dLCEwLGkpKSxyPygiY29udGVudCI9PT1uJiYoYS09eC5jc3MoZSwicGFkZGluZyIrWnRbb10sITAsaSkpLCJtYXJnaW4iIT09biYmKGEtPXguY3NzKGUsImJvcmRlciIrWnRbb10rIldpZHRoIiwhMCxpKSkpOihhKz14LmNzcyhlLCJwYWRkaW5nIitadFtvXSwhMCxpKSwicGFkZGluZyIhPT1uJiYoYSs9eC5jc3MoZSwiYm9yZGVyIitadFtvXSsiV2lkdGgiLCEwLGkpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gc24oZSx0LG4pe3ZhciByPSEwLGk9IndpZHRoIj09PXQ/ZS5vZmZzZXRXaWR0aDplLm9mZnNldEhlaWdodCxvPVJ0KGUpLGE9eC5zdXBwb3J0LmJveFNpemluZyYmImJvcmRlci1ib3giPT09eC5jc3MoZSwiYm94U2l6aW5nIiwhMSxvKTtpZigwPj1pfHxudWxsPT1pKXtpZihpPVd0KGUsdCxvKSwoMD5pfHxudWxsPT1pKSYmKGk9ZS5zdHlsZVt0XSksWXQudGVzdChpKSlyZXR1cm4gaTtyPWEmJih4LnN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGV8fGk9PT1lLnN0eWxlW3RdKSxpPXBhcnNlRmxvYXQoaSl8fDB9cmV0dXJuIGkrYW4oZSx0LG58fChhPyJib3JkZXIiOiJjb250ZW50IikscixvKSsicHgifWZ1bmN0aW9uIGxuKGUpe3ZhciB0PWEsbj1HdFtlXTtyZXR1cm4gbnx8KG49dW4oZSx0KSwibm9uZSIhPT1uJiZufHwoUHQ9KFB0fHx4KCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+IikuY3NzKCJjc3NUZXh0IiwiZGlzcGxheTpibG9jayAhaW1wb3J0YW50IikpLmFwcGVuZFRvKHQuZG9jdW1lbnRFbGVtZW50KSx0PShQdFswXS5jb250ZW50V2luZG93fHxQdFswXS5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LHQud3JpdGUoIjwhZG9jdHlwZSBodG1sPjxodG1sPjxib2R5PiIpLHQuY2xvc2UoKSxuPXVuKGUsdCksUHQuZGV0YWNoKCkpLEd0W2VdPW4pLG59ZnVuY3Rpb24gdW4oZSx0KXt2YXIgbj14KHQuY3JlYXRlRWxlbWVudChlKSkuYXBwZW5kVG8odC5ib2R5KSxyPXguY3NzKG5bMF0sImRpc3BsYXkiKTtyZXR1cm4gbi5yZW1vdmUoKSxyfXguZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oZSxuKXt4LmNzc0hvb2tzW25dPXtnZXQ6ZnVuY3Rpb24oZSxyLGkpe3JldHVybiByPzA9PT1lLm9mZnNldFdpZHRoJiZYdC50ZXN0KHguY3NzKGUsImRpc3BsYXkiKSk/eC5zd2FwKGUsUXQsZnVuY3Rpb24oKXtyZXR1cm4gc24oZSxuLGkpfSk6c24oZSxuLGkpOnR9LHNldDpmdW5jdGlvbihlLHQscil7dmFyIGk9ciYmUnQoZSk7cmV0dXJuIG9uKGUsdCxyP2FuKGUsbixyLHguc3VwcG9ydC5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PXguY3NzKGUsImJveFNpemluZyIsITEsaSksaSk6MCl9fX0pLHguc3VwcG9ydC5vcGFjaXR5fHwoeC5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSXQudGVzdCgodCYmZS5jdXJyZW50U3R5bGU/ZS5jdXJyZW50U3R5bGUuZmlsdGVyOmUuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6dD8iMSI6IiJ9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPWUuc3R5bGUscj1lLmN1cnJlbnRTdHlsZSxpPXguaXNOdW1lcmljKHQpPyJhbHBoYShvcGFjaXR5PSIrMTAwKnQrIikiOiIiLG89ciYmci5maWx0ZXJ8fG4uZmlsdGVyfHwiIjtuLnpvb209MSwodD49MXx8IiI9PT10KSYmIiI9PT14LnRyaW0oby5yZXBsYWNlKCR0LCIiKSkmJm4ucmVtb3ZlQXR0cmlidXRlJiYobi5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09dHx8ciYmIXIuZmlsdGVyKXx8KG4uZmlsdGVyPSR0LnRlc3Qobyk/by5yZXBsYWNlKCR0LGkpOm8rIiAiK2kpfX0pLHgoZnVuY3Rpb24oKXt4LnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KHguY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihlLG4pe3JldHVybiBuP3guc3dhcChlLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxXdCxbZSwibWFyZ2luUmlnaHQiXSk6dH19KSwheC5zdXBwb3J0LnBpeGVsUG9zaXRpb24mJnguZm4ucG9zaXRpb24mJnguZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLG4pe3guY3NzSG9va3Nbbl09e2dldDpmdW5jdGlvbihlLHIpe3JldHVybiByPyhyPVd0KGUsbiksWXQudGVzdChyKT94KGUpLnBvc2l0aW9uKClbbl0rInB4IjpyKTp0fX19KX0pLHguZXhwciYmeC5leHByLmZpbHRlcnMmJih4LmV4cHIuZmlsdGVycy5oaWRkZW49ZnVuY3Rpb24oZSl7cmV0dXJuIDA+PWUub2Zmc2V0V2lkdGgmJjA+PWUub2Zmc2V0SGVpZ2h0fHwheC5zdXBwb3J0LnJlbGlhYmxlSGlkZGVuT2Zmc2V0cyYmIm5vbmUiPT09KGUuc3R5bGUmJmUuc3R5bGUuZGlzcGxheXx8eC5jc3MoZSwiZGlzcGxheSIpKX0seC5leHByLmZpbHRlcnMudmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4heC5leHByLmZpbHRlcnMuaGlkZGVuKGUpfSkseC5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXt4LmNzc0hvb2tzW2UrdF09e2V4cGFuZDpmdW5jdGlvbihuKXt2YXIgcj0wLGk9e30sbz0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtmb3IoOzQ+cjtyKyspaVtlK1p0W3JdK3RdPW9bcl18fG9bci0yXXx8b1swXTtyZXR1cm4gaX19LFV0LnRlc3QoZSl8fCh4LmNzc0hvb2tzW2UrdF0uc2V0PW9uKX0pO3ZhciBjbj0vJTIwL2cscG49L1xbXF0kLyxmbj0vXHI/XG4vZyxkbj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksaG49L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO3guZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4geC5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPXgucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBlP3gubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIXgodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZobi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhZG4udGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IUN0LnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49eCh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOnguaXNBcnJheShuKT94Lm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoZm4sIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKGZuLCJcclxuIil9fSkuZ2V0KCl9fSkseC5wYXJhbT1mdW5jdGlvbihlLG4pe3ZhciByLGk9W10sbz1mdW5jdGlvbihlLHQpe3Q9eC5pc0Z1bmN0aW9uKHQpP3QoKTpudWxsPT10PyIiOnQsaVtpLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGUpKyI9IitlbmNvZGVVUklDb21wb25lbnQodCl9O2lmKG49PT10JiYobj14LmFqYXhTZXR0aW5ncyYmeC5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLHguaXNBcnJheShlKXx8ZS5qcXVlcnkmJiF4LmlzUGxhaW5PYmplY3QoZSkpeC5lYWNoKGUsZnVuY3Rpb24oKXtvKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKHIgaW4gZSlnbihyLGVbcl0sbixvKTtyZXR1cm4gaS5qb2luKCImIikucmVwbGFjZShjbiwiKyIpfTtmdW5jdGlvbiBnbihlLHQsbixyKXt2YXIgaTtpZih4LmlzQXJyYXkodCkpeC5lYWNoKHQsZnVuY3Rpb24odCxpKXtufHxwbi50ZXN0KGUpP3IoZSxpKTpnbihlKyJbIisoIm9iamVjdCI9PXR5cGVvZiBpP3Q6IiIpKyJdIixpLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09eC50eXBlKHQpKXIoZSx0KTtlbHNlIGZvcihpIGluIHQpZ24oZSsiWyIraSsiXSIsdFtpXSxuLHIpfXguZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe3guZm5bdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24odCxudWxsLGUsbik6dGhpcy50cmlnZ2VyKHQpfX0pLHguZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoZSkubW91c2VsZWF2ZSh0fHxlKX0sYmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9fSk7dmFyIG1uLHluLHZuPXgubm93KCksYm49L1w/Lyx4bj0vIy4qJC8sd249LyhbPyZdKV89W14mXSovLFRuPS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvZ20sQ249L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sTm49L14oPzpHRVR8SEVBRCkkLyxrbj0vXlwvXC8vLEVuPS9eKFtcdy4rLV0rOikoPzpcL1wvKFteXC8/IzpdKikoPzo6KFxkKyl8KXwpLyxTbj14LmZuLmxvYWQsQW49e30sam49e30sRG49IiovIi5jb25jYXQoIioiKTt0cnl7eW49by5ocmVmfWNhdGNoKExuKXt5bj1hLmNyZWF0ZUVsZW1lbnQoImEiKSx5bi5ocmVmPSIiLHluPXluLmhyZWZ9bW49RW4uZXhlYyh5bi50b0xvd2VyQ2FzZSgpKXx8W107ZnVuY3Rpb24gSG4oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7InN0cmluZyIhPXR5cGVvZiB0JiYobj10LHQ9IioiKTt2YXIgcixpPTAsbz10LnRvTG93ZXJDYXNlKCkubWF0Y2goVCl8fFtdO2lmKHguaXNGdW5jdGlvbihuKSl3aGlsZShyPW9baSsrXSkiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIHFuKGUsbixyLGkpe3ZhciBvPXt9LGE9ZT09PWpuO2Z1bmN0aW9uIHMobCl7dmFyIHU7cmV0dXJuIG9bbF09ITAseC5lYWNoKGVbbF18fFtdLGZ1bmN0aW9uKGUsbCl7dmFyIGM9bChuLHIsaSk7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxhfHxvW2NdP2E/ISh1PWMpOnQ6KG4uZGF0YVR5cGVzLnVuc2hpZnQoYykscyhjKSwhMSl9KSx1fXJldHVybiBzKG4uZGF0YVR5cGVzWzBdKXx8IW9bIioiXSYmcygiKiIpfWZ1bmN0aW9uIF9uKGUsbil7dmFyIHIsaSxvPXguYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IoaSBpbiBuKW5baV0hPT10JiYoKG9baV0/ZTpyfHwocj17fSkpW2ldPW5baV0pO3JldHVybiByJiZ4LmV4dGVuZCghMCxlLHIpLGV9eC5mbi5sb2FkPWZ1bmN0aW9uKGUsbixyKXtpZigic3RyaW5nIiE9dHlwZW9mIGUmJlNuKXJldHVybiBTbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGksbyxhLHM9dGhpcyxsPWUuaW5kZXhPZigiICIpO3JldHVybiBsPj0wJiYoaT1lLnNsaWNlKGwsZS5sZW5ndGgpLGU9ZS5zbGljZSgwLGwpKSx4LmlzRnVuY3Rpb24obik/KHI9bixuPXQpOm4mJiJvYmplY3QiPT10eXBlb2YgbiYmKGE9IlBPU1QiKSxzLmxlbmd0aD4wJiZ4LmFqYXgoe3VybDplLHR5cGU6YSxkYXRhVHlwZToiaHRtbCIsZGF0YTpufSkuZG9uZShmdW5jdGlvbihlKXtvPWFyZ3VtZW50cyxzLmh0bWwoaT94KCI8ZGl2PiIpLmFwcGVuZCh4LnBhcnNlSFRNTChlKSkuZmluZChpKTplKX0pLmNvbXBsZXRlKHImJmZ1bmN0aW9uKGUsdCl7cy5lYWNoKHIsb3x8W2UucmVzcG9uc2VUZXh0LHQsZV0pfSksdGhpc30seC5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24oZSx0KXt4LmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSkseC5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOnluLHR5cGU6IkdFVCIsaXNMb2NhbDpDbi50ZXN0KG1uWzFdKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkRuLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi94bWwvLGh0bWw6L2h0bWwvLGpzb246L2pzb24vfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6eC5wYXJzZUpTT04sInRleHQgeG1sIjp4LnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9fbihfbihlLHguYWpheFNldHRpbmdzKSx0KTpfbih4LmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjpIbihBbiksYWpheFRyYW5zcG9ydDpIbihqbiksYWpheDpmdW5jdGlvbihlLG4peyJvYmplY3QiPT10eXBlb2YgZSYmKG49ZSxlPXQpLG49bnx8e307dmFyIHIsaSxvLGEscyxsLHUsYyxwPXguYWpheFNldHVwKHt9LG4pLGY9cC5jb250ZXh0fHxwLGQ9cC5jb250ZXh0JiYoZi5ub2RlVHlwZXx8Zi5qcXVlcnkpP3goZik6eC5ldmVudCxoPXguRGVmZXJyZWQoKSxnPXguQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLG09cC5zdGF0dXNDb2RlfHx7fSx5PXt9LHY9e30sYj0wLHc9ImNhbmNlbGVkIixDPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoMj09PWIpe2lmKCFjKXtjPXt9O3doaWxlKHQ9VG4uZXhlYyhhKSljW3RbMV0udG9Mb3dlckNhc2UoKV09dFsyXX10PWNbZS50b0xvd2VyQ2FzZSgpXX1yZXR1cm4gbnVsbD09dD9udWxsOnR9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiAyPT09Yj9hOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGJ8fChlPXZbbl09dltuXXx8ZSx5W2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGJ8fChwLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZigyPmIpZm9yKHQgaW4gZSltW3RdPVttW3RdLGVbdF1dO2Vsc2UgQy5hbHdheXMoZVtDLnN0YXR1c10pO3JldHVybiB0aGlzfSxhYm9ydDpmdW5jdGlvbihlKXt2YXIgdD1lfHx3O3JldHVybiB1JiZ1LmFib3J0KHQpLGsoMCx0KSx0aGlzfX07aWYoaC5wcm9taXNlKEMpLmNvbXBsZXRlPWcuYWRkLEMuc3VjY2Vzcz1DLmRvbmUsQy5lcnJvcj1DLmZhaWwscC51cmw9KChlfHxwLnVybHx8eW4pKyIiKS5yZXBsYWNlKHhuLCIiKS5yZXBsYWNlKGtuLG1uWzFdKyIvLyIpLHAudHlwZT1uLm1ldGhvZHx8bi50eXBlfHxwLm1ldGhvZHx8cC50eXBlLHAuZGF0YVR5cGVzPXgudHJpbShwLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkubWF0Y2goVCl8fFsiIl0sbnVsbD09cC5jcm9zc0RvbWFpbiYmKHI9RW4uZXhlYyhwLnVybC50b0xvd2VyQ2FzZSgpKSxwLmNyb3NzRG9tYWluPSEoIXJ8fHJbMV09PT1tblsxXSYmclsyXT09PW1uWzJdJiYoclszXXx8KCJodHRwOiI9PT1yWzFdPyI4MCI6IjQ0MyIpKT09PShtblszXXx8KCJodHRwOiI9PT1tblsxXT8iODAiOiI0NDMiKSkpKSxwLmRhdGEmJnAucHJvY2Vzc0RhdGEmJiJzdHJpbmciIT10eXBlb2YgcC5kYXRhJiYocC5kYXRhPXgucGFyYW0ocC5kYXRhLHAudHJhZGl0aW9uYWwpKSxxbihBbixwLG4sQyksMj09PWIpcmV0dXJuIEM7bD1wLmdsb2JhbCxsJiYwPT09eC5hY3RpdmUrKyYmeC5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxwLnR5cGU9cC50eXBlLnRvVXBwZXJDYXNlKCkscC5oYXNDb250ZW50PSFObi50ZXN0KHAudHlwZSksbz1wLnVybCxwLmhhc0NvbnRlbnR8fChwLmRhdGEmJihvPXAudXJsKz0oYm4udGVzdChvKT8iJiI6Ij8iKStwLmRhdGEsZGVsZXRlIHAuZGF0YSkscC5jYWNoZT09PSExJiYocC51cmw9d24udGVzdChvKT9vLnJlcGxhY2Uod24sIiQxXz0iK3ZuKyspOm8rKGJuLnRlc3Qobyk/IiYiOiI/IikrIl89Iit2bisrKSkscC5pZk1vZGlmaWVkJiYoeC5sYXN0TW9kaWZpZWRbb10mJkMuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLHgubGFzdE1vZGlmaWVkW29dKSx4LmV0YWdbb10mJkMuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIseC5ldGFnW29dKSksKHAuZGF0YSYmcC5oYXNDb250ZW50JiZwLmNvbnRlbnRUeXBlIT09ITF8fG4uY29udGVudFR5cGUpJiZDLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIscC5jb250ZW50VHlwZSksQy5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHAuZGF0YVR5cGVzWzBdJiZwLmFjY2VwdHNbcC5kYXRhVHlwZXNbMF1dP3AuYWNjZXB0c1twLmRhdGFUeXBlc1swXV0rKCIqIiE9PXAuZGF0YVR5cGVzWzBdPyIsICIrRG4rIjsgcT0wLjAxIjoiIik6cC5hY2NlcHRzWyIqIl0pO2ZvcihpIGluIHAuaGVhZGVycylDLnNldFJlcXVlc3RIZWFkZXIoaSxwLmhlYWRlcnNbaV0pO2lmKHAuYmVmb3JlU2VuZCYmKHAuYmVmb3JlU2VuZC5jYWxsKGYsQyxwKT09PSExfHwyPT09YikpcmV0dXJuIEMuYWJvcnQoKTt3PSJhYm9ydCI7Zm9yKGkgaW57c3VjY2VzczoxLGVycm9yOjEsY29tcGxldGU6MX0pQ1tpXShwW2ldKTtpZih1PXFuKGpuLHAsbixDKSl7Qy5yZWFkeVN0YXRlPTEsbCYmZC50cmlnZ2VyKCJhamF4U2VuZCIsW0MscF0pLHAuYXN5bmMmJnAudGltZW91dD4wJiYocz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Qy5hYm9ydCgidGltZW91dCIpfSxwLnRpbWVvdXQpKTt0cnl7Yj0xLHUuc2VuZCh5LGspfWNhdGNoKE4pe2lmKCEoMj5iKSl0aHJvdyBOO2soLTEsTil9fWVsc2UgaygtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gayhlLG4scixpKXt2YXIgYyx5LHYsdyxULE49bjsyIT09YiYmKGI9MixzJiZjbGVhclRpbWVvdXQocyksdT10LGE9aXx8IiIsQy5yZWFkeVN0YXRlPWU+MD80OjAsYz1lPj0yMDAmJjMwMD5lfHwzMDQ9PT1lLHImJih3PU1uKHAsQyxyKSksdz1PbihwLHcsQyxjKSxjPyhwLmlmTW9kaWZpZWQmJihUPUMuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSxUJiYoeC5sYXN0TW9kaWZpZWRbb109VCksVD1DLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksVCYmKHguZXRhZ1tvXT1UKSksMjA0PT09ZXx8IkhFQUQiPT09cC50eXBlP049Im5vY29udGVudCI6MzA0PT09ZT9OPSJub3Rtb2RpZmllZCI6KE49dy5zdGF0ZSx5PXcuZGF0YSx2PXcuZXJyb3IsYz0hdikpOih2PU4sKGV8fCFOKSYmKE49ImVycm9yIiwwPmUmJihlPTApKSksQy5zdGF0dXM9ZSxDLnN0YXR1c1RleHQ9KG58fE4pKyIiLGM/aC5yZXNvbHZlV2l0aChmLFt5LE4sQ10pOmgucmVqZWN0V2l0aChmLFtDLE4sdl0pLEMuc3RhdHVzQ29kZShtKSxtPXQsbCYmZC50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbQyxwLGM/eTp2XSksZy5maXJlV2l0aChmLFtDLE5dKSxsJiYoZC50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtDLHBdKSwtLXguYWN0aXZlfHx4LmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gQ30sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHguZ2V0KGUsdCxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbihlLG4pe3JldHVybiB4LmdldChlLHQsbiwic2NyaXB0Iil9fSkseC5lYWNoKFsiZ2V0IiwicG9zdCJdLGZ1bmN0aW9uKGUsbil7eFtuXT1mdW5jdGlvbihlLHIsaSxvKXtyZXR1cm4geC5pc0Z1bmN0aW9uKHIpJiYobz1vfHxpLGk9cixyPXQpLHguYWpheCh7dXJsOmUsdHlwZTpuLGRhdGFUeXBlOm8sZGF0YTpyLHN1Y2Nlc3M6aX0pfX0pO2Z1bmN0aW9uIE1uKGUsbixyKXt2YXIgaSxvLGEscyxsPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczt3aGlsZSgiKiI9PT11WzBdKXUuc2hpZnQoKSxvPT09dCYmKG89ZS5taW1lVHlwZXx8bi5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKG8pZm9yKHMgaW4gbClpZihsW3NdJiZsW3NdLnRlc3Qobykpe3UudW5zaGlmdChzKTticmVha31pZih1WzBdaW4gcilhPXVbMF07ZWxzZXtmb3IocyBpbiByKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW3MrIiAiK3VbMF1dKXthPXM7YnJlYWt9aXx8KGk9cyl9YT1hfHxpfXJldHVybiBhPyhhIT09dVswXSYmdS51bnNoaWZ0KGEpLHJbYV0pOnR9ZnVuY3Rpb24gT24oZSx0LG4scil7dmFyIGksbyxhLHMsbCx1PXt9LGM9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihjWzFdKWZvcihhIGluIGUuY29udmVydGVycyl1W2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO289Yy5zaGlmdCgpO3doaWxlKG8paWYoZS5yZXNwb25zZUZpZWxkc1tvXSYmKG5bZS5yZXNwb25zZUZpZWxkc1tvXV09dCksIWwmJnImJmUuZGF0YUZpbHRlciYmKHQ9ZS5kYXRhRmlsdGVyKHQsZS5kYXRhVHlwZSkpLGw9byxvPWMuc2hpZnQoKSlpZigiKiI9PT1vKW89bDtlbHNlIGlmKCIqIiE9PWwmJmwhPT1vKXtpZihhPXVbbCsiICIrb118fHVbIiogIitvXSwhYSlmb3IoaSBpbiB1KWlmKHM9aS5zcGxpdCgiICIpLHNbMV09PT1vJiYoYT11W2wrIiAiK3NbMF1dfHx1WyIqICIrc1swXV0pKXthPT09ITA/YT11W2ldOnVbaV0hPT0hMCYmKG89c1swXSxjLnVuc2hpZnQoc1sxXSkpO2JyZWFrfWlmKGEhPT0hMClpZihhJiZlWyJ0aHJvd3MiXSl0PWEodCk7ZWxzZSB0cnl7dD1hKHQpfWNhdGNoKHApe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmE/cDoiTm8gY29udmVyc2lvbiBmcm9tICIrbCsiIHRvICIrb319fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTp0fX14LmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGUpe3JldHVybiB4Lmdsb2JhbEV2YWwoZSksZX19fSkseC5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2UuY2FjaGU9PT10JiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIixlLmdsb2JhbD0hMSl9KSx4LmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7dmFyIG4scj1hLmhlYWR8fHgoImhlYWQiKVswXXx8YS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24odCxpKXtuPWEuY3JlYXRlRWxlbWVudCgic2NyaXB0Iiksbi5hc3luYz0hMCxlLnNjcmlwdENoYXJzZXQmJihuLmNoYXJzZXQ9ZS5zY3JpcHRDaGFyc2V0KSxuLnNyYz1lLnVybCxuLm9ubG9hZD1uLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihlLHQpeyh0fHwhbi5yZWFkeVN0YXRlfHwvbG9hZGVkfGNvbXBsZXRlLy50ZXN0KG4ucmVhZHlTdGF0ZSkpJiYobi5vbmxvYWQ9bi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxuLnBhcmVudE5vZGUmJm4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSxuPW51bGwsdHx8aSgyMDAsInN1Y2Nlc3MiKSl9LHIuaW5zZXJ0QmVmb3JlKG4sci5maXJzdENoaWxkKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuLm9ubG9hZCh0LCEwKX19fX0pO3ZhciBGbj1bXSxCbj0vKD0pXD8oPz0mfCQpfFw/XD8vO3guYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1Gbi5wb3AoKXx8eC5leHBhbmRvKyJfIit2bisrO3JldHVybiB0aGlzW2VdPSEwLGV9fSkseC5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihuLHIsaSl7dmFyIG8sYSxzLGw9bi5qc29ucCE9PSExJiYoQm4udGVzdChuLnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiBuLmRhdGEmJiEobi5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZCbi50ZXN0KG4uZGF0YSkmJiJkYXRhIik7cmV0dXJuIGx8fCJqc29ucCI9PT1uLmRhdGFUeXBlc1swXT8obz1uLmpzb25wQ2FsbGJhY2s9eC5pc0Z1bmN0aW9uKG4uanNvbnBDYWxsYmFjayk/bi5qc29ucENhbGxiYWNrKCk6bi5qc29ucENhbGxiYWNrLGw/bltsXT1uW2xdLnJlcGxhY2UoQm4sIiQxIitvKTpuLmpzb25wIT09ITEmJihuLnVybCs9KGJuLnRlc3Qobi51cmwpPyImIjoiPyIpK24uanNvbnArIj0iK28pLG4uY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBzfHx4LmVycm9yKG8rIiB3YXMgbm90IGNhbGxlZCIpLHNbMF19LG4uZGF0YVR5cGVzWzBdPSJqc29uIixhPWVbb10sZVtvXT1mdW5jdGlvbigpe3M9YXJndW1lbnRzfSxpLmFsd2F5cyhmdW5jdGlvbigpe2Vbb109YSxuW29dJiYobi5qc29ucENhbGxiYWNrPXIuanNvbnBDYWxsYmFjayxGbi5wdXNoKG8pKSxzJiZ4LmlzRnVuY3Rpb24oYSkmJmEoc1swXSkscz1hPXR9KSwic2NyaXB0Iik6dH0pO3ZhciBQbixSbixXbj0wLCRuPWUuQWN0aXZlWE9iamVjdCYmZnVuY3Rpb24oKXt2YXIgZTtmb3IoZSBpbiBQbilQbltlXSh0LCEwKX07ZnVuY3Rpb24gSW4oKXt0cnl7cmV0dXJuIG5ldyBlLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKHQpe319ZnVuY3Rpb24gem4oKXt0cnl7cmV0dXJuIG5ldyBlLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2godCl7fX14LmFqYXhTZXR0aW5ncy54aHI9ZS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmSW4oKXx8em4oKX06SW4sUm49eC5hamF4U2V0dGluZ3MueGhyKCkseC5zdXBwb3J0LmNvcnM9ISFSbiYmIndpdGhDcmVkZW50aWFscyJpbiBSbixSbj14LnN1cHBvcnQuYWpheD0hIVJuLFJuJiZ4LmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24obil7aWYoIW4uY3Jvc3NEb21haW58fHguc3VwcG9ydC5jb3JzKXt2YXIgcjtyZXR1cm57c2VuZDpmdW5jdGlvbihpLG8pe3ZhciBhLHMsbD1uLnhocigpO2lmKG4udXNlcm5hbWU/bC5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jLG4udXNlcm5hbWUsbi5wYXNzd29yZCk6bC5vcGVuKG4udHlwZSxuLnVybCxuLmFzeW5jKSxuLnhockZpZWxkcylmb3IocyBpbiBuLnhockZpZWxkcylsW3NdPW4ueGhyRmllbGRzW3NdO24ubWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlKG4ubWltZVR5cGUpLG4uY3Jvc3NEb21haW58fGlbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGlbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKHMgaW4gaSlsLnNldFJlcXVlc3RIZWFkZXIocyxpW3NdKX1jYXRjaCh1KXt9bC5zZW5kKG4uaGFzQ29udGVudCYmbi5kYXRhfHxudWxsKSxyPWZ1bmN0aW9uKGUsaSl7dmFyIHMsdSxjLHA7dHJ5e2lmKHImJihpfHw0PT09bC5yZWFkeVN0YXRlKSlpZihyPXQsYSYmKGwub25yZWFkeXN0YXRlY2hhbmdlPXgubm9vcCwkbiYmZGVsZXRlIFBuW2FdKSxpKTQhPT1sLnJlYWR5U3RhdGUmJmwuYWJvcnQoKTtlbHNle3A9e30scz1sLnN0YXR1cyx1PWwuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCksInN0cmluZyI9PXR5cGVvZiBsLnJlc3BvbnNlVGV4dCYmKHAudGV4dD1sLnJlc3BvbnNlVGV4dCk7dHJ5e2M9bC5zdGF0dXNUZXh0fWNhdGNoKGYpe2M9IiJ9c3x8IW4uaXNMb2NhbHx8bi5jcm9zc0RvbWFpbj8xMjIzPT09cyYmKHM9MjA0KTpzPXAudGV4dD8yMDA6NDA0fX1jYXRjaChkKXtpfHxvKC0xLGQpfXAmJm8ocyxjLHAsdSl9LG4uYXN5bmM/ND09PWwucmVhZHlTdGF0ZT9zZXRUaW1lb3V0KHIpOihhPSsrV24sJG4mJihQbnx8KFBuPXt9LHgoZSkudW5sb2FkKCRuKSksUG5bYV09ciksbC5vbnJlYWR5c3RhdGVjaGFuZ2U9cik6cigpfSxhYm9ydDpmdW5jdGlvbigpe3ImJnIodCwhMCl9fX19KTt2YXIgWG4sVW4sVm49L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFluPVJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3crIikoW2EteiVdKikkIiwiaSIpLEpuPS9xdWV1ZUhvb2tzJC8sR249W25yXSxRbj17IioiOltmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4oZSx0KSxyPW4uY3VyKCksaT1Zbi5leGVjKHQpLG89aSYmaVszXXx8KHguY3NzTnVtYmVyW2VdPyIiOiJweCIpLGE9KHguY3NzTnVtYmVyW2VdfHwicHgiIT09byYmK3IpJiZZbi5leGVjKHguY3NzKG4uZWxlbSxlKSkscz0xLGw9MjA7aWYoYSYmYVszXSE9PW8pe289b3x8YVszXSxpPWl8fFtdLGE9K3J8fDE7ZG8gcz1zfHwiLjUiLGEvPXMseC5zdHlsZShuLmVsZW0sZSxhK28pO3doaWxlKHMhPT0ocz1uLmN1cigpL3IpJiYxIT09cyYmLS1sKX1yZXR1cm4gaSYmKGE9bi5zdGFydD0rYXx8K3J8fDAsbi51bml0PW8sbi5lbmQ9aVsxXT9hKyhpWzFdKzEpKmlbMl06K2lbMl0pLG59XX07ZnVuY3Rpb24gS24oKXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe1huPXR9KSxYbj14Lm5vdygpfWZ1bmN0aW9uIFpuKGUsdCxuKXt2YXIgcixpPShRblt0XXx8W10pLmNvbmNhdChRblsiKiJdKSxvPTAsYT1pLmxlbmd0aDtmb3IoO2E+bztvKyspaWYocj1pW29dLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIGVyKGUsdCxuKXt2YXIgcixpLG89MCxhPUduLmxlbmd0aCxzPXguRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgbC5lbGVtfSksbD1mdW5jdGlvbigpe2lmKGkpcmV0dXJuITE7dmFyIHQ9WG58fEtuKCksbj1NYXRoLm1heCgwLHUuc3RhcnRUaW1lK3UuZHVyYXRpb24tdCkscj1uL3UuZHVyYXRpb258fDAsbz0xLXIsYT0wLGw9dS50d2VlbnMubGVuZ3RoO2Zvcig7bD5hO2ErKyl1LnR3ZWVuc1thXS5ydW4obyk7cmV0dXJuIHMubm90aWZ5V2l0aChlLFt1LG8sbl0pLDE+byYmbD9uOihzLnJlc29sdmVXaXRoKGUsW3VdKSwhMSl9LHU9cy5wcm9taXNlKHtlbGVtOmUscHJvcHM6eC5leHRlbmQoe30sdCksb3B0czp4LmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fX0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOnQsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOlhufHxLbigpLGR1cmF0aW9uOm4uZHVyYXRpb24sdHdlZW5zOltdLGNyZWF0ZVR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIHI9eC5Ud2VlbihlLHUub3B0cyx0LG4sdS5vcHRzLnNwZWNpYWxFYXNpbmdbdF18fHUub3B0cy5lYXNpbmcpO3JldHVybiB1LnR3ZWVucy5wdXNoKHIpLHJ9LHN0b3A6ZnVuY3Rpb24odCl7dmFyIG49MCxyPXQ/dS50d2VlbnMubGVuZ3RoOjA7aWYoaSlyZXR1cm4gdGhpcztmb3IoaT0hMDtyPm47bisrKXUudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gdD9zLnJlc29sdmVXaXRoKGUsW3UsdF0pOnMucmVqZWN0V2l0aChlLFt1LHRdKSx0aGlzfX0pLGM9dS5wcm9wcztmb3IodHIoYyx1Lm9wdHMuc3BlY2lhbEVhc2luZyk7YT5vO28rKylpZihyPUduW29dLmNhbGwodSxlLGMsdS5vcHRzKSlyZXR1cm4gcjtyZXR1cm4geC5tYXAoYyxabix1KSx4LmlzRnVuY3Rpb24odS5vcHRzLnN0YXJ0KSYmdS5vcHRzLnN0YXJ0LmNhbGwoZSx1KSx4LmZ4LnRpbWVyKHguZXh0ZW5kKGwse2VsZW06ZSxhbmltOnUscXVldWU6dS5vcHRzLnF1ZXVlfSkpLHUucHJvZ3Jlc3ModS5vcHRzLnByb2dyZXNzKS5kb25lKHUub3B0cy5kb25lLHUub3B0cy5jb21wbGV0ZSkuZmFpbCh1Lm9wdHMuZmFpbCkuYWx3YXlzKHUub3B0cy5hbHdheXMpfWZ1bmN0aW9uIHRyKGUsdCl7dmFyIG4scixpLG8sYTtmb3IobiBpbiBlKWlmKHI9eC5jYW1lbENhc2UobiksaT10W3JdLG89ZVtuXSx4LmlzQXJyYXkobykmJihpPW9bMV0sbz1lW25dPW9bMF0pLG4hPT1yJiYoZVtyXT1vLGRlbGV0ZSBlW25dKSxhPXguY3NzSG9va3Nbcl0sYSYmImV4cGFuZCJpbiBhKXtvPWEuZXhwYW5kKG8pLGRlbGV0ZSBlW3JdO2ZvcihuIGluIG8pbiBpbiBlfHwoZVtuXT1vW25dLHRbbl09aSl9ZWxzZSB0W3JdPWl9eC5BbmltYXRpb249eC5leHRlbmQoZXIse3R3ZWVuZXI6ZnVuY3Rpb24oZSx0KXt4LmlzRnVuY3Rpb24oZSk/KHQ9ZSxlPVsiKiJdKTplPWUuc3BsaXQoIiAiKTt2YXIgbixyPTAsaT1lLmxlbmd0aDtmb3IoO2k+cjtyKyspbj1lW3JdLFFuW25dPVFuW25dfHxbXSxRbltuXS51bnNoaWZ0KHQpfSxwcmVmaWx0ZXI6ZnVuY3Rpb24oZSx0KXt0P0duLnVuc2hpZnQoZSk6R24ucHVzaChlKX19KTtmdW5jdGlvbiBucihlLHQsbil7dmFyIHIsaSxvLGEscyxsLHU9dGhpcyxjPXt9LHA9ZS5zdHlsZSxmPWUubm9kZVR5cGUmJm5uKGUpLGQ9eC5fZGF0YShlLCJmeHNob3ciKTtuLnF1ZXVlfHwocz14Ll9xdWV1ZUhvb2tzKGUsImZ4IiksbnVsbD09cy51bnF1ZXVlZCYmKHMudW5xdWV1ZWQ9MCxsPXMuZW1wdHkuZmlyZSxzLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXtzLnVucXVldWVkfHxsKCl9KSxzLnVucXVldWVkKyssdS5hbHdheXMoZnVuY3Rpb24oKXt1LmFsd2F5cyhmdW5jdGlvbigpe3MudW5xdWV1ZWQtLSx4LnF1ZXVlKGUsImZ4IikubGVuZ3RofHxzLmVtcHR5LmZpcmUoKX0pfSkpLDE9PT1lLm5vZGVUeXBlJiYoImhlaWdodCJpbiB0fHwid2lkdGgiaW4gdCkmJihuLm92ZXJmbG93PVtwLm92ZXJmbG93LHAub3ZlcmZsb3dYLHAub3ZlcmZsb3dZXSwiaW5saW5lIj09PXguY3NzKGUsImRpc3BsYXkiKSYmIm5vbmUiPT09eC5jc3MoZSwiZmxvYXQiKSYmKHguc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0JiYiaW5saW5lIiE9PWxuKGUubm9kZU5hbWUpP3Auem9vbT0xOnAuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihwLm92ZXJmbG93PSJoaWRkZW4iLHguc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzfHx1LmFsd2F5cyhmdW5jdGlvbigpe3Aub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxwLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLHAub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSk7Zm9yKHIgaW4gdClpZihpPXRbcl0sVm4uZXhlYyhpKSl7aWYoZGVsZXRlIHRbcl0sbz1vfHwidG9nZ2xlIj09PWksaT09PShmPyJoaWRlIjoic2hvdyIpKWNvbnRpbnVlO2Nbcl09ZCYmZFtyXXx8eC5zdHlsZShlLHIpfWlmKCF4LmlzRW1wdHlPYmplY3QoYykpe2Q/ImhpZGRlbiJpbiBkJiYoZj1kLmhpZGRlbik6ZD14Ll9kYXRhKGUsImZ4c2hvdyIse30pLG8mJihkLmhpZGRlbj0hZiksZj94KGUpLnNob3coKTp1LmRvbmUoZnVuY3Rpb24oKXt4KGUpLmhpZGUoKX0pLHUuZG9uZShmdW5jdGlvbigpe3ZhciB0O3guX3JlbW92ZURhdGEoZSwiZnhzaG93Iik7Zm9yKHQgaW4gYyl4LnN0eWxlKGUsdCxjW3RdKX0pO2ZvcihyIGluIGMpYT1abihmP2Rbcl06MCxyLHUpLHIgaW4gZHx8KGRbcl09YS5zdGFydCxmJiYoYS5lbmQ9YS5zdGFydCxhLnN0YXJ0PSJ3aWR0aCI9PT1yfHwiaGVpZ2h0Ij09PXI/MTowKSl9fWZ1bmN0aW9uIHJyKGUsdCxuLHIsaSl7cmV0dXJuIG5ldyByci5wcm90b3R5cGUuaW5pdChlLHQsbixyLGkpfXguVHdlZW49cnIscnIucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjpycixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsaSxvKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1pfHwic3dpbmciLHRoaXMub3B0aW9ucz10LHRoaXMuc3RhcnQ9dGhpcy5ub3c9dGhpcy5jdXIoKSx0aGlzLmVuZD1yLHRoaXMudW5pdD1vfHwoeC5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPXJyLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiBlJiZlLmdldD9lLmdldCh0aGlzKTpyci5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KHRoaXMpfSxydW46ZnVuY3Rpb24oZSl7dmFyIHQsbj1yci5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5wb3M9dD10aGlzLm9wdGlvbnMuZHVyYXRpb24/eC5lYXNpbmdbdGhpcy5lYXNpbmddKGUsdGhpcy5vcHRpb25zLmR1cmF0aW9uKmUsMCwxLHRoaXMub3B0aW9ucy5kdXJhdGlvbik6ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpyci5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KHRoaXMpLHRoaXN9fSxyci5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9cnIucHJvdG90eXBlLHJyLnByb3BIb29rcz17X2RlZmF1bHQ6e2dldDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gbnVsbD09ZS5lbGVtW2UucHJvcF18fGUuZWxlbS5zdHlsZSYmbnVsbCE9ZS5lbGVtLnN0eWxlW2UucHJvcF0/KHQ9eC5jc3MoZS5lbGVtLGUucHJvcCwiIiksdCYmImF1dG8iIT09dD90OjApOmUuZWxlbVtlLnByb3BdfSxzZXQ6ZnVuY3Rpb24oZSl7eC5meC5zdGVwW2UucHJvcF0/eC5meC5zdGVwW2UucHJvcF0oZSk6ZS5lbGVtLnN0eWxlJiYobnVsbCE9ZS5lbGVtLnN0eWxlW3guY3NzUHJvcHNbZS5wcm9wXV18fHguY3NzSG9va3NbZS5wcm9wXSk/eC5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCk6ZS5lbGVtW2UucHJvcF09ZS5ub3d9fX0scnIucHJvcEhvb2tzLnNjcm9sbFRvcD1yci5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSx4LmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49eC5mblt0XTt4LmZuW3RdPWZ1bmN0aW9uKGUscixpKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoaXIodCwhMCksZSxyLGkpfX0pLHguZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKG5uKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgaT14LmlzRW1wdHlPYmplY3QoZSksbz14LnNwZWVkKHQsbixyKSxhPWZ1bmN0aW9uKCl7dmFyIHQ9ZXIodGhpcyx4LmV4dGVuZCh7fSxlKSxvKTsoaXx8eC5fZGF0YSh0aGlzLCJmaW5pc2giKSkmJnQuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLGl8fG8ucXVldWU9PT0hMT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShvLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKGUsbixyKXt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0b3A7ZGVsZXRlIGUuc3RvcCx0KHIpfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJihyPW4sbj1lLGU9dCksbiYmZSE9PSExJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLG49bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsbz14LnRpbWVycyxhPXguX2RhdGEodGhpcyk7aWYobilhW25dJiZhW25dLnN0b3AmJmkoYVtuXSk7ZWxzZSBmb3IobiBpbiBhKWFbbl0mJmFbbl0uc3RvcCYmSm4udGVzdChuKSYmaShhW25dKTtmb3Iobj1vLmxlbmd0aDtuLS07KW9bbl0uZWxlbSE9PXRoaXN8fG51bGwhPWUmJm9bbl0ucXVldWUhPT1lfHwob1tuXS5hbmltLnN0b3AociksdD0hMSxvLnNwbGljZShuLDEpKTsodHx8IXIpJiZ4LmRlcXVldWUodGhpcyxlKX0pfSxmaW5pc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT0hMSYmKGU9ZXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbj14Ll9kYXRhKHRoaXMpLHI9bltlKyJxdWV1ZSJdLGk9bltlKyJxdWV1ZUhvb2tzIl0sbz14LnRpbWVycyxhPXI/ci5sZW5ndGg6MDtmb3Iobi5maW5pc2g9ITAseC5xdWV1ZSh0aGlzLGUsW10pLGkmJmkuc3RvcCYmaS5zdG9wLmNhbGwodGhpcywhMCksdD1vLmxlbmd0aDt0LS07KW9bdF0uZWxlbT09PXRoaXMmJm9bdF0ucXVldWU9PT1lJiYob1t0XS5hbmltLnN0b3AoITApLG8uc3BsaWNlKHQsMSkpO2Zvcih0PTA7YT50O3QrKylyW3RdJiZyW3RdLmZpbmlzaCYmclt0XS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgbi5maW5pc2h9KX19KTtmdW5jdGlvbiBpcihlLHQpe3ZhciBuLHI9e2hlaWdodDplfSxpPTA7Zm9yKHQ9dD8xOjA7ND5pO2krPTItdCluPVp0W2ldLHJbIm1hcmdpbiIrbl09clsicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKHIub3BhY2l0eT1yLndpZHRoPWUpLHJ9eC5lYWNoKHtzbGlkZURvd246aXIoInNob3ciKSxzbGlkZVVwOmlyKCJoaWRlIiksc2xpZGVUb2dnbGU6aXIoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXt4LmZuW2VdPWZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdGhpcy5hbmltYXRlKHQsZSxuLHIpfX0pLHguc3BlZWQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUmJiJvYmplY3QiPT10eXBlb2YgZT94LmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fHguaXNGdW5jdGlvbihlKSYmZSxkdXJhdGlvbjplLGVhc2luZzpuJiZ0fHx0JiYheC5pc0Z1bmN0aW9uKHQpJiZ0fTtyZXR1cm4gci5kdXJhdGlvbj14LmZ4Lm9mZj8wOiJudW1iZXIiPT10eXBlb2Ygci5kdXJhdGlvbj9yLmR1cmF0aW9uOnIuZHVyYXRpb24gaW4geC5meC5zcGVlZHM/eC5meC5zcGVlZHNbci5kdXJhdGlvbl06eC5meC5zcGVlZHMuX2RlZmF1bHQsKG51bGw9PXIucXVldWV8fHIucXVldWU9PT0hMCkmJihyLnF1ZXVlPSJmeCIpLHIub2xkPXIuY29tcGxldGUsci5jb21wbGV0ZT1mdW5jdGlvbigpe3guaXNGdW5jdGlvbihyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmeC5kZXF1ZXVlKHRoaXMsci5xdWV1ZSl9LHJ9LHguZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn19LHgudGltZXJzPVtdLHguZng9cnIucHJvdG90eXBlLmluaXQseC5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIGUsbj14LnRpbWVycyxyPTA7Zm9yKFhuPXgubm93KCk7bi5sZW5ndGg+cjtyKyspZT1uW3JdLGUoKXx8bltyXSE9PWV8fG4uc3BsaWNlKHItLSwxKTtuLmxlbmd0aHx8eC5meC5zdG9wKCksWG49dH0seC5meC50aW1lcj1mdW5jdGlvbihlKXtlKCkmJngudGltZXJzLnB1c2goZSkmJnguZnguc3RhcnQoKX0seC5meC5pbnRlcnZhbD0xMyx4LmZ4LnN0YXJ0PWZ1bmN0aW9uKCl7VW58fChVbj1zZXRJbnRlcnZhbCh4LmZ4LnRpY2sseC5meC5pbnRlcnZhbCkpfSx4LmZ4LnN0b3A9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKFVuKSxVbj1udWxsfSx4LmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSx4LmZ4LnN0ZXA9e30seC5leHByJiZ4LmV4cHIuZmlsdGVycyYmKHguZXhwci5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGUpe3JldHVybiB4LmdyZXAoeC50aW1lcnMsZnVuY3Rpb24odCl7cmV0dXJuIGU9PT10LmVsZW19KS5sZW5ndGh9KSx4LmZuLm9mZnNldD1mdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXt4Lm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIG4scixvPXt0b3A6MCxsZWZ0OjB9LGE9dGhpc1swXSxzPWEmJmEub3duZXJEb2N1bWVudDtpZihzKXJldHVybiBuPXMuZG9jdW1lbnRFbGVtZW50LHguY29udGFpbnMobixhKT8odHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IT09aSYmKG89YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkscj1vcihzKSx7dG9wOm8udG9wKyhyLnBhZ2VZT2Zmc2V0fHxuLnNjcm9sbFRvcCktKG4uY2xpZW50VG9wfHwwKSxsZWZ0Om8ubGVmdCsoci5wYWdlWE9mZnNldHx8bi5zY3JvbGxMZWZ0KS0obi5jbGllbnRMZWZ0fHwwKX0pOm99LHgub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXguY3NzKGUsInBvc2l0aW9uIik7InN0YXRpYyI9PT1yJiYoZS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKTt2YXIgaT14KGUpLG89aS5vZmZzZXQoKSxhPXguY3NzKGUsInRvcCIpLHM9eC5jc3MoZSwibGVmdCIpLGw9KCJhYnNvbHV0ZSI9PT1yfHwiZml4ZWQiPT09cikmJnguaW5BcnJheSgiYXV0byIsW2Esc10pPi0xLHU9e30sYz17fSxwLGY7bD8oYz1pLnBvc2l0aW9uKCkscD1jLnRvcCxmPWMubGVmdCk6KHA9cGFyc2VGbG9hdChhKXx8MCxmPXBhcnNlRmxvYXQocyl8fDApLHguaXNGdW5jdGlvbih0KSYmKHQ9dC5jYWxsKGUsbixvKSksbnVsbCE9dC50b3AmJih1LnRvcD10LnRvcC1vLnRvcCtwKSxudWxsIT10LmxlZnQmJih1LmxlZnQ9dC5sZWZ0LW8ubGVmdCtmKSwidXNpbmciaW4gdD90LnVzaW5nLmNhbGwoZSx1KTppLmNzcyh1KX19LHguZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbj17dG9wOjAsbGVmdDowfSxyPXRoaXNbMF07cmV0dXJuImZpeGVkIj09PXguY3NzKHIsInBvc2l0aW9uIik/dD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOihlPXRoaXMub2Zmc2V0UGFyZW50KCksdD10aGlzLm9mZnNldCgpLHgubm9kZU5hbWUoZVswXSwiaHRtbCIpfHwobj1lLm9mZnNldCgpKSxuLnRvcCs9eC5jc3MoZVswXSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxuLmxlZnQrPXguY3NzKGVbMF0sImJvcmRlckxlZnRXaWR0aCIsITApKSx7dG9wOnQudG9wLW4udG9wLXguY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LW4ubGVmdC14LmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vZmZzZXRQYXJlbnR8fHM7d2hpbGUoZSYmIXgubm9kZU5hbWUoZSwiaHRtbCIpJiYic3RhdGljIj09PXguY3NzKGUsInBvc2l0aW9uIikpZT1lLm9mZnNldFBhcmVudDtyZXR1cm4gZXx8c30pfX0pLHguZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihlLG4pe3ZhciByPS9ZLy50ZXN0KG4pO3guZm5bZV09ZnVuY3Rpb24oaSl7cmV0dXJuIHguYWNjZXNzKHRoaXMsZnVuY3Rpb24oZSxpLG8pe3ZhciBhPW9yKGUpO3JldHVybiBvPT09dD9hP24gaW4gYT9hW25dOmEuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W2ldOmVbaV06KGE/YS5zY3JvbGxUbyhyP3goYSkuc2Nyb2xsTGVmdCgpOm8scj9vOngoYSkuc2Nyb2xsVG9wKCkpOmVbaV09byx0KX0sZSxpLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSk7ZnVuY3Rpb24gb3IoZSl7cmV0dXJuIHguaXNXaW5kb3coZSk/ZTo5PT09ZS5ub2RlVHlwZT9lLmRlZmF1bHRWaWV3fHxlLnBhcmVudFdpbmRvdzohMX14LmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihlLG4pe3guZWFjaCh7cGFkZGluZzoiaW5uZXIiK2UsY29udGVudDpuLCIiOiJvdXRlciIrZX0sZnVuY3Rpb24ocixpKXt4LmZuW2ldPWZ1bmN0aW9uKGksbyl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKHJ8fCJib29sZWFuIiE9dHlwZW9mIGkpLHM9cnx8KGk9PT0hMHx8bz09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4geC5hY2Nlc3ModGhpcyxmdW5jdGlvbihuLHIsaSl7dmFyIG87cmV0dXJuIHguaXNXaW5kb3cobik/bi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrZV06OT09PW4ubm9kZVR5cGU/KG89bi5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgobi5ib2R5WyJzY3JvbGwiK2VdLG9bInNjcm9sbCIrZV0sbi5ib2R5WyJvZmZzZXQiK2VdLG9bIm9mZnNldCIrZV0sb1siY2xpZW50IitlXSkpOmk9PT10P3guY3NzKG4scixzKTp4LnN0eWxlKG4scixpLHMpfSxuLGE/aTp0LGEsbnVsbCl9fSl9KSx4LmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LHguZm4uYW5kU2VsZj14LmZuLmFkZEJhY2ssIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZSYmIm9iamVjdCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz14OihlLmpRdWVyeT1lLiQ9eCwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoImpxdWVyeSIsW10sZnVuY3Rpb24oKXtyZXR1cm4geH0pKX0pKHdpbmRvdyk7Cg==" 325 282 } 326 - ] 283 + ], 284 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlLYW5pIFN0cm9rZSBPcmRlcgovLyBAbmFtZXNwYWNlICAgamFwYW5lc2UKLy8gQGRlc2NyaXB0aW9uIFNob3dzIGEga2FuamkncyBzdHJva2Ugb3JkZXIgb24gaXRzIHBhZ2UgYW5kIGR1cmluZyBsZXNzb25zIGFuZCByZXZpZXdzLgovLyBAbGljZW5zZSAgICAgR1BMIHZlcnNpb24gMyBvciBhbnkgbGF0ZXIgdmVyc2lvbjsgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCi8vIEBpbmNsdWRlICAgICBodHRwKjovLyp3YW5pa2FuaS5jb20va2FuamkvKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly8qd2FuaWthbmkuY29tL2xldmVsLyova2FuamkvKgovLyBAaW5jbHVkZSAgICAgaHR0cCo6Ly8qd2FuaWthbmkuY29tL3Jldmlldy9zZXNzaW9uCi8vIEBpbmNsdWRlICAgICBodHRwKjovLyp3YW5pa2FuaS5jb20vbGVzc29uL3Nlc3Npb24KLy8gQHZlcnNpb24gICAgIDEuMS4yCi8vIEBncmFudCAgICAgICBHTV94bWxodHRwUmVxdWVzdAovLyBAcmVxdWlyZSAgICAgaHR0cDovL2FqYXguZ29vZ2xlYXBpcy5jb20vYWpheC9saWJzL2pxdWVyeS8xLjEwLjIvanF1ZXJ5Lm1pbi5qcwovLyA9PS9Vc2VyU2NyaXB0PT0KCi8qCiAqIFRoYW5rcyBhIGxvdCB0byAuLi4KICogV2FuaWthbmkgUGhvbmV0aWMtU2VtYW50aWMgQ29tcG9zaXRpb24gLSBVc2Vyc2NyaXB0CiAqIGJ5IHJ1aXBncGluaGVpcm8gKExvcmRHcmF2ZXdpc2gpCiAqIC4uLiBmb3IgY29kZSBzaG93aW5nIG1lIGhvdyB0byBpbnNlcnQgc2VjdGlvbnMgZHVyaW5nIGthbmppIHJldmlld3MuCiAqIFRoZSBjb2RlIGhlYXZpbHkgYm9ycm93cyBmcm9tIHRoYXQgc2NyaXB0IQogKiBBbHNvIHRoYW5rcyB0byBIYWxvIGZvciBhIGxvYWRpbmcgYnVnIGZpeCEKICovCgovKgogKiBIZWxwZXIgRnVuY3Rpb25zL1ZhcmlhYmxlcwogKi8KJCA9IHVuc2FmZVdpbmRvdy4kOwoKLyoKICogR2xvYmFsIFZhcmlhYmxlcy9PYmplY3RzL0NsYXNzZXMKICovCnZhciBQYWdlRW51bSA9IE9iamVjdC5mcmVlemUoeyB1bmtub3duOjAsIGthbmppOjEsIHJldmlld3M6MiwgbGVzc29uczozIH0pOwp2YXIgY3VyUGFnZSA9IFBhZ2VFbnVtLnVua25vd247CnZhciBKSVNITyA9ICJodHRwOi8vY2xhc3NpYy5qaXNoby5vcmciOwoKLyoKICogTWFpbgogKi8KZnVuY3Rpb24gaW5pdCgpIHsKICAgIC8vIERldGVybWluZSBwYWdlIHR5cGUKICAgIGlmICgvXC9rYW5qaVwvLi8udGVzdChkb2N1bWVudC5VUkwpKSB7CiAgICAgICAgY3VyUGFnZSA9IFBhZ2VFbnVtLmthbmppOwogICAgfSBlbHNlIGlmICgvXC9yZXZpZXcvLnRlc3QoZG9jdW1lbnQuVVJMKSkgewogICAgICAgIGN1clBhZ2UgPSBQYWdlRW51bS5yZXZpZXdzOwogICAgfSBlbHNlIGlmICgvXC9sZXNzb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgewogICAgICAgIGN1clBhZ2UgPSBQYWdlRW51bS5sZXNzb25zOwogICAgfQoKICAgIC8vIENyZWF0ZSBhbmQgc3RvcmUgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGhvbGQgdGhlIGltYWdlCiAgICB1bnNhZmVXaW5kb3cuZGlhZ3JhbSA9IGNyZWF0ZURpYWdyYW1TZWN0aW9uKCk7CgogICAgLy8gUmVnaXN0ZXIgY2FsbGJhY2sgZm9yIHdoZW4gdG8gbG9hZCBzdHJva2Ugb3JkZXIKICAgIHN3aXRjaCAoY3VyUGFnZSkgewogICAgICAgIGNhc2UgUGFnZUVudW0ua2Fuamk6CiAgICAgICAgICAgIGxvYWREaWFncmFtKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUGFnZUVudW0ucmV2aWV3czoKICAgICAgICAgICAgdmFyIG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHsKICAgICAgICAgICAgICAgLy8gVGhlIGxhc3Qgb25lIGFsd2F5cyBoYXMgMiBtdXRhdGlvbnMsIHNvIGxldCdzIHVzZSB0aGF0CiAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbnMubGVuZ3RoICE9IDIpCiAgICAgICAgICAgICAgICAgICByZXR1cm47CgogICAgICAgICAgICAgICAvLyBSZXZpZXdzIGR5bmFtaWNhbGx5IGdlbmVyYXRlIHRoZSBET00uIFdlIGFsd2F5cyBuZWVkIHRvIHJlLWluc2VydCB0aGUgZWxlbWVudAogICAgICAgICAgICAgICBpZiAoZ2V0S2FuamkoKSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgIHZhciBkaWFncmFtID0gY3JlYXRlRGlhZ3JhbVNlY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlhZ3JhbSAhPT0gbnVsbCAmJiBkaWFncmFtLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zYWZlV2luZG93LmRpYWdyYW0gPSBkaWFncmFtOwogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkRGlhZ3JhbSgpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0sIDE1MCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG8ub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaXRlbS1pbmZvJyksIHsnYXR0cmlidXRlcycgOiB0cnVlfSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUGFnZUVudW0ubGVzc29uczoKICAgICAgICAgICAgdmFyIG8gPSBuZXcgTXV0YXRpb25PYnNlcnZlcihsb2FkRGlhZ3JhbSk7CiAgICAgICAgICAgIG8ub2JzZXJ2ZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VwcGxlbWVudC1rYW4nKSwgeydhdHRyaWJ1dGVzJyA6IHRydWV9KTsKICAgICAgICAgICAgbG9hZERpYWdyYW0oKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCmlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICBpbml0KCk7Cn0gZWxzZSB7CiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGluaXQpOwp9CgovKgogKiBSZXR1cm5zIHRoZSBjdXJyZW50IGthbmppCiAqLwpmdW5jdGlvbiBnZXRLYW5qaSgpIHsKICAgIHN3aXRjaChjdXJQYWdlKSB7CiAgICAgICAgY2FzZSBQYWdlRW51bS5rYW5qaToKICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LnRpdGxlW2RvY3VtZW50LnRpdGxlLmxlbmd0aCAtIDFdOwoKICAgICAgICBjYXNlIFBhZ2VFbnVtLnJldmlld3M6CiAgICAgICAgICAgIHZhciBjdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImN1cnJlbnRJdGVtIik7CiAgICAgICAgICAgIGlmKCJrYW4iIGluIGN1ckl0ZW0pCiAgICAgICAgICAgICAgICByZXR1cm4gY3VySXRlbS5rYW4udHJpbSgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgY2FzZSBQYWdlRW51bS5sZXNzb25zOgogICAgICAgICAgICB2YXIga2FuamlOb2RlID0gJCgiI2NoYXJhY3RlciIpOwoKICAgICAgICAgICAgaWYoa2FuamlOb2RlID09PSB1bmRlZmluZWQgfHwga2FuamlOb2RlID09PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICAgICAgICByZXR1cm4ga2FuamlOb2RlLnRleHQoKS50cmltKCk7CiAgICB9CgogICAgcmV0dXJuIG51bGw7Cn0KCi8qCiAqIENyZWF0ZXMgYSBzZWN0aW9uIGZvciB0aGUgZGlhZ3JhbSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gaXRzIGNvbnRlbnQKICovCmZ1bmN0aW9uIGNyZWF0ZURpYWdyYW1TZWN0aW9uKCkgewoKICAgIC8vIFJldmlld3MgaGFjazogT25seSBkbyBpdCBvbmNlCiAgICBpZiAoJCgnI3N0cm9rZV9vcmRlcicpLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgdmFyIHNlY3Rpb25IVE1MID0gJzxzZWN0aW9uPjxoMj5TdHJva2UgT3JkZXI8L2gyPjxwIGlkPSJzdHJva2Vfb3JkZXIiPiZuYnNwOzwvcD48L3NlY3Rpb24+JzsKCiAgICAgICAgc3dpdGNoKGN1clBhZ2UpIHsKICAgICAgICAgICAgY2FzZSBQYWdlRW51bS5rYW5qaToKICAgICAgICAgICAgICAgICQoc2VjdGlvbkhUTUwpLmluc2VydEFmdGVyKCcjaW5mb3JtYXRpb24nKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIFBhZ2VFbnVtLnJldmlld3M6CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygicHJlcGVuZCIpOwogICAgICAgICAgICAgICAgJCgnI2l0ZW0taW5mby1jb2wyJykucHJlcGVuZChzZWN0aW9uSFRNTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBQYWdlRW51bS5sZXNzb25zOgogICAgICAgICAgICAgICAgJCgnI3N1cHBsZW1lbnQta2FuLWJyZWFrZG93biAuY29sMScpLmFwcGVuZChzZWN0aW9uSFRNTCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICQoJyNzdHJva2Vfb3JkZXInKTsKfQoKLyoKICogQWRkcyB0aGUgZGlhZ3JhbSBzZWN0aW9uIGVsZW1lbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2F0aW9uCiAqLwpmdW5jdGlvbiBsb2FkRGlhZ3JhbSgpIHsKCiAgICBpZiAoIXVuc2FmZVdpbmRvdyB8fCAhdW5zYWZlV2luZG93LmRpYWdyYW0ubGVuZ3RoKQogICAgICAgIHJldHVybjsKCiAgICB1bnNhZmVXaW5kb3cuZGlhZ3JhbS5odG1sKCJMb2FkaW5nLi4uIik7CgogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBHTV94bWxodHRwUmVxdWVzdCh7CiAgICAgICAgICAgIG1ldGhvZDogIkdFVCIsCiAgICAgICAgICAgIHVybDogSklTSE8gKyAiL2thbmppL2RldGFpbHMvIiArIGdldEthbmppKCksCiAgICAgICAgICAgIG9ubG9hZDogZnVuY3Rpb24oeGhyKSB7CiAgICAgICAgICAgICAgICB2YXIgZGlhZ3JhbSA9IHVuc2FmZVdpbmRvdy5kaWFncmFtOwogICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgPT0gMjAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWdyYW1VUkwgPSB4aHIucmVzcG9uc2VUZXh0Lm1hdGNoKC9cL3N0YXRpY1wvaW1hZ2VzXC9zdHJva2VfZGlhZ3JhbXNcL1swLTldK19mcmFtZXNcLnBuZy8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdyYW0uaHRtbCgnPGltZyBzcmM9IicgKyBKSVNITyArIGRpYWdyYW1VUkxbMF0gKyAnIiBhbHQ9IlN0cm9rZSBvcmRlciBkaWFncmFtIiAvPicpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy5kaWFncmFtLmh0bWwoIkVycm9yIHdoaWxlIGxvYWRpbmcgZGlhZ3JhbSIpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBvbmVycm9yOiBmdW5jdGlvbih4aHIpIHsKICAgICAgICAgICAgICAgIHVuc2FmZVdpbmRvdy5kaWFncmFtLmh0bWwoIkVycm9yIHdoaWxlIGxvYWRpbmcgZGlhZ3JhbSIpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9LCAwKTsKfQ==", 285 + "storage": { 286 + "data": {}, 287 + "ts": 1607436649628 288 + }, 289 + "uuid": "648066f1-2454-460b-9217-49d3d4376da9" 327 290 }, 328 291 { 292 + "enabled": true, 293 + "file_url": "https://openuserjs.org/install/laidbacktempo/Google_View_Image.user.js", 329 294 "name": "Google View Image", 330 295 "options": { 331 - "check_for_updates": true, 296 + "check_for_updates": false, 332 297 "comment": null, 298 + "compat_foreach": false, 299 + "compat_metadata": false, 300 + "compat_powerful_this": null, 301 + "compat_prototypes": false, 302 + "compat_wrappedjsobject": false, 333 303 "compatopts_for_requires": true, 334 - "compat_wrappedjsobject": false, 335 - "compat_metadata": false, 336 - "compat_foreach": false, 337 - "compat_arrayleft": false, 338 - "compat_uW_gmonkey": false, 339 - "compat_forvarin": false, 340 304 "noframes": null, 341 - "awareOfChrome": false, 342 - "run_at": null, 343 305 "override": { 344 - "use_includes": [], 306 + "merge_connects": true, 307 + "merge_excludes": true, 308 + "merge_includes": true, 309 + "merge_matches": false, 310 + "orig_connects": [], 311 + "orig_excludes": [], 345 312 "orig_includes": [], 346 - "merge_includes": true, 347 - "use_matches": [], 348 313 "orig_matches": [ 349 314 "https://**/*", 350 315 "http://**/*" 351 316 ], 352 - "merge_matches": true, 317 + "orig_noframes": null, 318 + "orig_run_at": "document-idle", 319 + "use_blockers": [], 320 + "use_connects": [], 353 321 "use_excludes": [], 354 - "orig_excludes": [], 355 - "merge_excludes": true, 356 - "use_connects": [], 357 - "merge_connects": true, 358 - "use_blockers": [], 359 - "orig_run_at": "document-idle", 360 - "orig_noframes": null 361 - } 322 + "use_includes": [], 323 + "use_matches": [ 324 + "https://www.google.com/**" 325 + ] 326 + }, 327 + "run_at": null, 328 + "tab_types": null 362 329 }, 330 + "position": 6, 331 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBHb29nbGUgVmlldyBJbWFnZQovLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly9Hb29nbGVWaWV3SW1hZ2UuY29tLwovLyBAdmVyc2lvbiAgICAgIDAuMQovLyBAZGVzY3JpcHRpb24gIEJyaW5nIGJhY2sgR29vZ2xlIFZpZXcgSW1hZ2UhCi8vIEBhdXRob3IgICAgICAgbGFpZGJhY2tUZW1wbwovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vKiovKgovLyBAbWF0Y2ggICAgICAgIGh0dHA6Ly8qKi8qCi8vIEBsaWNlbnNlIE1JVAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgpmdW5jdGlvbiB0b0kxOG4oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoL19fTVNHXyhcdyspX18vZywgZnVuY3Rpb24gKG1hdGNoLCB2MSkgewogICAgICAgIHJldHVybiB2MSA/IGNocm9tZS5pMThuLmdldE1lc3NhZ2UodjEpIDogJyc7CiAgICB9KTsKfQoKZnVuY3Rpb24gbG9jYWxpc2VPYmplY3Qob2JqLCB0YWcpIHsKICAgIG9iai5pbm5lckhUTUwgPSB0YWc7CiAgICByZXR1cm47CiAgICAvL3ZhciBtc2cgPSB0b0kxOG4odGFnKTsKICAgIC8vaWYgKG1zZyAhPSB0YWcpIG9iai5pbm5lckhUTUwgPSBtc2c7Cn0KCmZ1bmN0aW9uIGFkZExpbmtzKG5vZGUpIHsKICAgIC8vIGNvbnNvbGUubG9nKCJBZGRpbmcgbGluayIpOwogICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJBZGRpbmcgbGluayBpbiIpOwogICAgICAgIGlmICgobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2lyY19yaXMnKSkgfHwgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcmNfbWknKSB8fCAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2lyY190YXMnKSkpKSB7CiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygiQWRkaW5nIGxpbmsgT0sgT0sgIik7CiAgICAgICAgICAgIHZhciBvYmplY3QgPSBub2RlLmNsb3Nlc3QoJy5pcmNfYycpOwogICAgICAgICAgICAvLyBSZXRyaXZlIGltYWdlIGxpbmtzLCBhbmQgaW1hZ2UgdXJsCiAgICAgICAgICAgIHZhciBpbWFnZUxpbmtzID0gb2JqZWN0LnF1ZXJ5U2VsZWN0b3IoJy5fRkt3LmlyY19idXRfciA+IHRib2R5ID4gdHInKTsKICAgICAgICAgICAgdmFyIGltYWdlVGV4dCA9IG9iamVjdC5xdWVyeVNlbGVjdG9yKCcuX2NqaiA+IC5pcmNfaXQgPiAuaXJjX2hkID4gLl9yMycpOwoKICAgICAgICAgICAgLy8gUmV0cml2ZSB0aGUgaW1hZ2UgVVJMCiAgICAgICAgICAgIHZhciBpbWFnZVVSTDsKCiAgICAgICAgICAgIHZhciB0aHVtYm5haWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbWdbbmFtZT0iJyArIG9iamVjdC5kYXRhc2V0Lml0ZW1JZCArICciXScpOwogICAgICAgICAgICBpZiAodGh1bWJuYWlsKSB7CiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHRodW1ibmFpbC5jbG9zZXN0KCcucmdfYngnKS5xdWVyeVNlbGVjdG9yKCcucmdfbWV0YScpOwogICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gSlNPTi5wYXJzZShtZXRhLmlubmVySFRNTCk7CiAgICAgICAgICAgICAgICBpbWFnZVVSTCA9IG1ldGFkYXRhLm91OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaW1hZ2VVUkwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpcmNfbWknKVswXS5zcmM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFJlbW92ZSBwcmV2aW91c2x5IGdlbmVyYXRlZCB2aWV3IGltYWdlIGJ1dHRvbnMKICAgICAgICAgICAgdmFyIG9sZFZpZXdJbWFnZSA9IGltYWdlTGlua3MucXVlcnlTZWxlY3RvcignLmV4dF9hZGRvbicpOwogICAgICAgICAgICBpZiAob2xkVmlld0ltYWdlKSB7CiAgICAgICAgICAgICAgICBpbWFnZUxpbmtzLnJlbW92ZUNoaWxkKG9sZFZpZXdJbWFnZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBzZWFyY2ggYnkgaW1hZ2UgbGlua3MKICAgICAgICAgICAgdmFyIG9sZFNlYXJjaEJ5SW1hZ2UgPSBpbWFnZVRleHQucXVlcnlTZWxlY3RvcignLmV4dF9hZGRvbicpOwogICAgICAgICAgICBpZiAob2xkU2VhcmNoQnlJbWFnZSkgewogICAgICAgICAgICAgICAgaW1hZ2VUZXh0LnJlbW92ZUNoaWxkKG9sZFNlYXJjaEJ5SW1hZ2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgU2VhcmNoIGJ5IGltYWdlIGJ1dHRvbgogICAgICAgICAgICB2YXIgc2VhcmNoQnlJbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgc2VhcmNoQnlJbWFnZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnL3NlYXJjaGJ5aW1hZ2U/JmltYWdlX3VybD0nICsgaW1hZ2VVUkwpOwogICAgICAgICAgICBzZWFyY2hCeUltYWdlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnZXh0X2FkZG9uJyk7CiAgICAgICAgICAgIHNlYXJjaEJ5SW1hZ2Uuc2V0QXR0cmlidXRlKCdzdHlsZScsICdtYXJnaW4tbGVmdDo0cHQ7Jyk7CgogICAgICAgICAgICAvLyBJbnNlcnQgdGV4dCBpbnRvIFNlYXJjaCBieSBpbWFnZSBidXR0b24KICAgICAgICAgICAgdmFyIHNlYXJjaEJ5SW1hZ2VUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICBsb2NhbGlzZU9iamVjdChzZWFyY2hCeUltYWdlVGV4dCwgJzxzcGFuPlZpZXcgSW1hZ2U8L3NwYW4+Jyk7CiAgICAgICAgICAgIHNlYXJjaEJ5SW1hZ2UuYXBwZW5kQ2hpbGQoc2VhcmNoQnlJbWFnZVRleHQpOwoKICAgICAgICAgICAgLy8gQXBwZW5kIFNlYXJjaCBieSBpbWFnZSBidXR0b24KICAgICAgICAgICAgaW1hZ2VUZXh0LmFwcGVuZENoaWxkKHNlYXJjaEJ5SW1hZ2UpOwoKICAgICAgICAgICAgLy8gQ3JlYXRlIFZpZXcgaW1hZ2UgYnV0dG9uCiAgICAgICAgICAgIHZhciB2aWV3SW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgICAgICAgICB2aWV3SW1hZ2Uuc2V0QXR0cmlidXRlKCdjbGFzcycsICdleHRfYWRkb24nKTsKCiAgICAgICAgICAgIC8vIEFkZCBnbG9iZSB0byBWaWV3IGltYWdlIGJ1dHRvbgogICAgICAgICAgICB2YXIgdmlld0ltYWdlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgdmFyIGdsb2JlSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5fUkt3Ll93dGYuX1B0ZicpLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdmlld0ltYWdlTGluay5hcHBlbmRDaGlsZChnbG9iZUljb24pOwoKICAgICAgICAgICAgLy8gYWRkIHRleHQgdG8gdmlldyBpbWFnZSBidXR0b24KICAgICAgICAgICAgdmFyIHZpZXdJbWFnZVRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuX1dLdycpLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgbG9jYWxpc2VPYmplY3Qodmlld0ltYWdlVGV4dCwgJ1ZpZXcgSW1hZ2UnKTsKICAgICAgICAgICAgdmlld0ltYWdlTGluay5hcHBlbmRDaGlsZCh2aWV3SW1hZ2VUZXh0KTsKCiAgICAgICAgICAgIC8vIEFkZCBWaWV3IGltYWdlIGJ1dHRvbiBVUkwKICAgICAgICAgICAgdmlld0ltYWdlTGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBpbWFnZVVSTCk7CiAgICAgICAgICAgIHZpZXdJbWFnZUxpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7CiAgICAgICAgICAgIHZpZXdJbWFnZS5hcHBlbmRDaGlsZCh2aWV3SW1hZ2VMaW5rKTsKCiAgICAgICAgICAgIC8vIEFkZCBWaWV3IGltYWdlIGJ1dHRvbiB0byBJbWFnZSBMaW5rcwogICAgICAgICAgICB2YXIgc2F2ZSA9IGltYWdlTGlua3MuY2hpbGROb2Rlc1sxXTsKICAgICAgICAgICAgaW1hZ2VMaW5rcy5pbnNlcnRCZWZvcmUodmlld0ltYWdlLCBzYXZlKTsKICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCJBZGRpbmcgRE9ORSEhISIpOwogICAgICAgIH0KICAgIH0KfQoKCiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7CiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7CiAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzICYmIG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldOwogICAgICAgICAgICAgICAgICAgIGFkZExpbmtzKG5ld05vZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KTsKCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgfSk7CgogICAgYWRkTGlua3MoZG9jdW1lbnQuYm9keSk7Cgp9KSgpOw==", 363 332 "storage": { 364 333 "data": {}, 365 334 "ts": 1606921521538 366 335 }, 367 - "enabled": true, 368 - "position": 7, 369 - "file_url": "https://openuserjs.org/install/laidbacktempo/Google_View_Image.user.js", 370 - "uuid": "21e7da1a-d1ce-4acf-9838-a7b170386128", 371 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBHb29nbGUgVmlldyBJbWFnZQovLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly9Hb29nbGVWaWV3SW1hZ2UuY29tLwovLyBAdmVyc2lvbiAgICAgIDAuMQovLyBAZGVzY3JpcHRpb24gIEJyaW5nIGJhY2sgR29vZ2xlIFZpZXcgSW1hZ2UhCi8vIEBhdXRob3IgICAgICAgbGFpZGJhY2tUZW1wbwovLyBAbWF0Y2ggICAgICAgIGh0dHBzOi8vKiovKgovLyBAbWF0Y2ggICAgICAgIGh0dHA6Ly8qKi8qCi8vIEBsaWNlbnNlIE1JVAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CmNvbnNvbGUubG9nKCJIZWxsbyIpOwoKZnVuY3Rpb24gdG9JMThuKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9fX01TR18oXHcrKV9fL2csIGZ1bmN0aW9uIChtYXRjaCwgdjEpIHsKICAgICAgICByZXR1cm4gdjEgPyBjaHJvbWUuaTE4bi5nZXRNZXNzYWdlKHYxKSA6ICcnOwogICAgfSk7Cn0KY29uc29sZS5sb2coIkhlbGxvIDIiKTsKZnVuY3Rpb24gbG9jYWxpc2VPYmplY3Qob2JqLCB0YWcpIHsKICAgIG9iai5pbm5lckhUTUwgPSB0YWc7CiAgICByZXR1cm47CiAgICAvL3ZhciBtc2cgPSB0b0kxOG4odGFnKTsKICAgIC8vaWYgKG1zZyAhPSB0YWcpIG9iai5pbm5lckhUTUwgPSBtc2c7Cn0KCmZ1bmN0aW9uIGFkZExpbmtzKG5vZGUpIHsKICAgIGNvbnNvbGUubG9nKCJBZGRpbmcgbGluayIpOwogICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJBZGRpbmcgbGluayBpbiIpOwogICAgICAgIGlmICgobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2lyY19yaXMnKSkgfHwgKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdpcmNfbWknKSB8fCAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ2lyY190YXMnKSkpKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQWRkaW5nIGxpbmsgT0sgT0sgIik7CiAgICAgICAgICAgIHZhciBvYmplY3QgPSBub2RlLmNsb3Nlc3QoJy5pcmNfYycpOwogICAgICAgICAgICAvLyBSZXRyaXZlIGltYWdlIGxpbmtzLCBhbmQgaW1hZ2UgdXJsCiAgICAgICAgICAgIHZhciBpbWFnZUxpbmtzID0gb2JqZWN0LnF1ZXJ5U2VsZWN0b3IoJy5fRkt3LmlyY19idXRfciA+IHRib2R5ID4gdHInKTsKICAgICAgICAgICAgdmFyIGltYWdlVGV4dCA9IG9iamVjdC5xdWVyeVNlbGVjdG9yKCcuX2NqaiA+IC5pcmNfaXQgPiAuaXJjX2hkID4gLl9yMycpOwoKICAgICAgICAgICAgLy8gUmV0cml2ZSB0aGUgaW1hZ2UgVVJMCiAgICAgICAgICAgIHZhciBpbWFnZVVSTDsKCiAgICAgICAgICAgIHZhciB0aHVtYm5haWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbWdbbmFtZT0iJyArIG9iamVjdC5kYXRhc2V0Lml0ZW1JZCArICciXScpOwogICAgICAgICAgICBpZiAodGh1bWJuYWlsKSB7CiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHRodW1ibmFpbC5jbG9zZXN0KCcucmdfYngnKS5xdWVyeVNlbGVjdG9yKCcucmdfbWV0YScpOwogICAgICAgICAgICAgICAgdmFyIG1ldGFkYXRhID0gSlNPTi5wYXJzZShtZXRhLmlubmVySFRNTCk7CiAgICAgICAgICAgICAgICBpbWFnZVVSTCA9IG1ldGFkYXRhLm91OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaW1hZ2VVUkwgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpcmNfbWknKVswXS5zcmM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFJlbW92ZSBwcmV2aW91c2x5IGdlbmVyYXRlZCB2aWV3IGltYWdlIGJ1dHRvbnMKICAgICAgICAgICAgdmFyIG9sZFZpZXdJbWFnZSA9IGltYWdlTGlua3MucXVlcnlTZWxlY3RvcignLmV4dF9hZGRvbicpOwogICAgICAgICAgICBpZiAob2xkVmlld0ltYWdlKSB7CiAgICAgICAgICAgICAgICBpbWFnZUxpbmtzLnJlbW92ZUNoaWxkKG9sZFZpZXdJbWFnZSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBzZWFyY2ggYnkgaW1hZ2UgbGlua3MKICAgICAgICAgICAgdmFyIG9sZFNlYXJjaEJ5SW1hZ2UgPSBpbWFnZVRleHQucXVlcnlTZWxlY3RvcignLmV4dF9hZGRvbicpOwogICAgICAgICAgICBpZiAob2xkU2VhcmNoQnlJbWFnZSkgewogICAgICAgICAgICAgICAgaW1hZ2VUZXh0LnJlbW92ZUNoaWxkKG9sZFNlYXJjaEJ5SW1hZ2UpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgU2VhcmNoIGJ5IGltYWdlIGJ1dHRvbgogICAgICAgICAgICB2YXIgc2VhcmNoQnlJbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgc2VhcmNoQnlJbWFnZS5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCAnL3NlYXJjaGJ5aW1hZ2U/JmltYWdlX3VybD0nICsgaW1hZ2VVUkwpOwogICAgICAgICAgICBzZWFyY2hCeUltYWdlLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCAnZXh0X2FkZG9uJyk7CiAgICAgICAgICAgIHNlYXJjaEJ5SW1hZ2Uuc2V0QXR0cmlidXRlKCdzdHlsZScsICdtYXJnaW4tbGVmdDo0cHQ7Jyk7CgogICAgICAgICAgICAvLyBJbnNlcnQgdGV4dCBpbnRvIFNlYXJjaCBieSBpbWFnZSBidXR0b24KICAgICAgICAgICAgdmFyIHNlYXJjaEJ5SW1hZ2VUZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogICAgICAgICAgICBsb2NhbGlzZU9iamVjdChzZWFyY2hCeUltYWdlVGV4dCwgJzxzcGFuPlZpZXcgSW1hZ2U8L3NwYW4+Jyk7CiAgICAgICAgICAgIHNlYXJjaEJ5SW1hZ2UuYXBwZW5kQ2hpbGQoc2VhcmNoQnlJbWFnZVRleHQpOwoKICAgICAgICAgICAgLy8gQXBwZW5kIFNlYXJjaCBieSBpbWFnZSBidXR0b24KICAgICAgICAgICAgaW1hZ2VUZXh0LmFwcGVuZENoaWxkKHNlYXJjaEJ5SW1hZ2UpOwoKICAgICAgICAgICAgLy8gQ3JlYXRlIFZpZXcgaW1hZ2UgYnV0dG9uCiAgICAgICAgICAgIHZhciB2aWV3SW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgICAgICAgICB2aWV3SW1hZ2Uuc2V0QXR0cmlidXRlKCdjbGFzcycsICdleHRfYWRkb24nKTsKCiAgICAgICAgICAgIC8vIEFkZCBnbG9iZSB0byBWaWV3IGltYWdlIGJ1dHRvbgogICAgICAgICAgICB2YXIgdmlld0ltYWdlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgdmFyIGdsb2JlSWNvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5fUkt3Ll93dGYuX1B0ZicpLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdmlld0ltYWdlTGluay5hcHBlbmRDaGlsZChnbG9iZUljb24pOwoKICAgICAgICAgICAgLy8gYWRkIHRleHQgdG8gdmlldyBpbWFnZSBidXR0b24KICAgICAgICAgICAgdmFyIHZpZXdJbWFnZVRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuX1dLdycpLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgbG9jYWxpc2VPYmplY3Qodmlld0ltYWdlVGV4dCwgJ1ZpZXcgSW1hZ2UnKTsKICAgICAgICAgICAgdmlld0ltYWdlTGluay5hcHBlbmRDaGlsZCh2aWV3SW1hZ2VUZXh0KTsKCiAgICAgICAgICAgIC8vIEFkZCBWaWV3IGltYWdlIGJ1dHRvbiBVUkwKICAgICAgICAgICAgdmlld0ltYWdlTGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBpbWFnZVVSTCk7CiAgICAgICAgICAgIHZpZXdJbWFnZUxpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7CiAgICAgICAgICAgIHZpZXdJbWFnZS5hcHBlbmRDaGlsZCh2aWV3SW1hZ2VMaW5rKTsKCiAgICAgICAgICAgIC8vIEFkZCBWaWV3IGltYWdlIGJ1dHRvbiB0byBJbWFnZSBMaW5rcwogICAgICAgICAgICB2YXIgc2F2ZSA9IGltYWdlTGlua3MuY2hpbGROb2Rlc1sxXTsKICAgICAgICAgICAgaW1hZ2VMaW5rcy5pbnNlcnRCZWZvcmUodmlld0ltYWdlLCBzYXZlKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJBZGRpbmcgRE9ORSEhISIpOwogICAgICAgIH0KICAgIH0KfQoKCiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbiAobXV0YXRpb25zKSB7CiAgICAgICAgbXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7CiAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzICYmIG11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5ld05vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldOwogICAgICAgICAgICAgICAgICAgIGFkZExpbmtzKG5ld05vZGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9KTsKCiAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHsKICAgICAgICBjaGlsZExpc3Q6IHRydWUsCiAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgfSk7CgogICAgYWRkTGlua3MoZG9jdW1lbnQuYm9keSk7Cgp9KSgpOw==" 336 + "uuid": "21e7da1a-d1ce-4acf-9838-a7b170386128" 372 337 }, 373 338 { 339 + "enabled": true, 340 + "file_url": "https://greasyfork.org/scripts/233-wanikani-levelup-celebrator/code/WaniKani%20LevelUP%20Celebrator.user.js", 374 341 "name": "WaniKani LevelUP Celebrator", 375 342 "options": { 343 + "awareOfChrome": false, 376 344 "check_for_updates": true, 377 345 "comment": null, 378 - "compatopts_for_requires": true, 379 - "compat_wrappedjsobject": false, 380 - "compat_metadata": false, 381 - "compat_foreach": false, 382 346 "compat_arrayleft": false, 347 + "compat_foreach": false, 348 + "compat_forvarin": false, 349 + "compat_metadata": false, 350 + "compat_powerful_this": null, 383 351 "compat_uW_gmonkey": false, 384 - "compat_forvarin": false, 352 + "compat_wrappedjsobject": false, 353 + "compatopts_for_requires": true, 385 354 "noframes": null, 386 - "awareOfChrome": false, 387 - "run_at": null, 388 355 "override": { 389 - "use_includes": [], 356 + "merge_connects": true, 357 + "merge_excludes": true, 358 + "merge_includes": true, 359 + "merge_matches": true, 360 + "orig_excludes": [], 390 361 "orig_includes": [ 391 362 "https://www.wanikani.com/", 392 363 "https://www.wanikani.com/dashboard" 393 364 ], 394 - "merge_includes": true, 395 - "use_matches": [], 396 365 "orig_matches": [], 397 - "merge_matches": true, 398 - "use_excludes": [], 399 - "orig_excludes": [], 400 - "merge_excludes": true, 401 - "use_connects": [], 402 - "merge_connects": true, 403 - "use_blockers": [], 366 + "orig_noframes": null, 404 367 "orig_run_at": "document-end", 405 - "orig_noframes": null 406 - } 368 + "use_blockers": [], 369 + "use_connects": [], 370 + "use_excludes": [], 371 + "use_includes": [], 372 + "use_matches": [] 373 + }, 374 + "run_at": null, 375 + "tab_types": null 407 376 }, 377 + "position": 7, 378 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yCi8vIEBuYW1lc3BhY2UgICAgIGh0dHBzOi8vd3d3LndhbmlrYW5pLmNvbQovLyBAZGVzY3JpcHRpb24gICBUaGlzIHdpbGwgZGlzcGxheSBhICJsZXZlbC11cCIgbm90aWZpY2F0aW9uIG9uIHlvdXIgV0sgRGFzaGJvYXJkIGFmdGVyIHlvdSBsZXZlbCB1cC4gIFlvdSBjYW4gY3VzdG9taXplIHRoZSBpbWFnZSBhbmQgdGV4dCBvZiB0aGUgZGlzcGxheS4gIE90aGVyIGFjaGlldmVtZW50cyBhcmUgYWxzbyBub3RlZC4gIEJ5IFJob3NWZWVkY3kuCi8vIEB2ZXJzaW9uIDIuNC4wCi8vIEBpbmNsdWRlICAgICAgIGh0dHBzOi8vd3d3LndhbmlrYW5pLmNvbS8KLy8gQGluY2x1ZGUgICAgICAgaHR0cHM6Ly93d3cud2FuaWthbmkuY29tL2Rhc2hib2FyZAovLyBAcnVuLWF0CSAgZG9jdW1lbnQtZW5kCi8vIEBncmFudAkgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKCi8vID09L1VzZXJTY3JpcHQ9PQoKZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICBjb25zb2xlLmxvZygnZ2V0IGZjdCcpOwogICAgaWYgKGlkICYmIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKCWNvbnNvbGUubG9nKGlkKTsKICAgICAgICBpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgIH0KICAgIHJldHVybiBpZCB8fCBudWxsOwp9CgoKZnVuY3Rpb24gR01zZXR1cCgpIHsKICBpZiAoR01fcmVnaXN0ZXJNZW51Q29tbWFuZCkgewogICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgnV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yOiBTZXQgaW1hZ2UgVVJMJywgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjdXJFbnRyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nVVJMIikgfHwgIiI7CiAgICAgIHZhciBuZXdJbWdVUkwgPSBwcm9tcHQoJ05ldyBJbWFnZSBVUkw6JywgY3VyRW50cnkpOwogICAgICBpZiAobmV3SW1nVVJMICE9IG51bGwpIHsKCWlmICh0eXBlb2YobmV3SW1nVVJMKSAhPT0gInN0cmluZyIpIHsKCQluZXdJbWdVUkwgPSBTdHJpbmcobmV3SW1nVVJMKTsKCX0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cEltZ1VSTCIsIG5ld0ltZ1VSTCk7CiAgICAgIH0KICAgIH0pOwoKICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ1dhbmlLYW5pIExldmVsVVAgQ2VsZWJyYXRvcjogU2V0IGltYWdlIHBvc2l0aW9uJywgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjdXJFbnRyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nUG9zIikgfHwgIkxlZnQiOwogICAgICB2YXIgbmV3SW1nUG9zID0gcHJvbXB0KCdJbWFnZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0ZXh0IChsZWZ0LCByaWdodCwgYWJvdmUsIGJlbG93KTonLCBjdXJFbnRyeSk7CiAgICAgIGlmIChuZXdJbWdQb3MgIT0gbnVsbCkgewoJaWYgKHR5cGVvZihuZXdJbWdQb3MpICE9PSAic3RyaW5nIikgewoJCW5ld0ltZ1BvcyA9IFN0cmluZyhuZXdJbWdQb3MpOwoJfQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwSW1nUG9zIiwgbmV3SW1nUG9zKTsKICAgICAgfQogICAgfSk7CgogICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgnV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yOiBTZXQgdGV4dCcsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3VyRW50cnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFRleHQiKSB8fCAiIjsKICAgICAgdmFyIG5ld1RleHQgPSBwcm9tcHQoJ05ldyB0ZXh0OicsIGN1ckVudHJ5KTsKICAgICAgaWYgKG5ld1RleHQgIT0gbnVsbCkgewoJaWYgKHR5cGVvZihuZXdUZXh0KSAhPT0gInN0cmluZyIpIHsKCQluZXdUZXh0ID0gU3RyaW5nKG5ld1RleHQpOwoJfQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwVGV4dCIsIG5ld1RleHQpOwogICAgICB9CiAgICB9KTsKCiAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCdXYW5pS2FuaSBMZXZlbFVQIENlbGVicmF0b3I6IFByZXZpZXcnLCBmdW5jdGlvbigpIHsKCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBQcmV2aWV3IiwgMSk7Cglsb2NhdGlvbi5yZWxvYWQoKTsKICAgIH0pOwoKICB9Cn0KCgpmdW5jdGlvbiBjaGVja0xldmVsKCkgewoKCWNvbnNvbGUubG9nKCJjaGVja0xldmVsKCkgc3RhcnQiKTsKCgl2YXIgbGFzdEtub3duTGV2ZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFByZXZMZXZlbCIpIHx8IDE7CiAgICB2YXIgbGV2ZWxUZXh0ID0gJCgnbGkudXNlci1zdW1tYXJ5X19hdHRyaWJ1dGUgYScpWzBdLmhyZWYuc3BsaXQoJy9sZXZlbC8nKVsxXTsKICAgIHZhciBjdXJsZXZlbCA9IChsZXZlbFRleHQ/IGxldmVsVGV4dDogbGFzdEtub3duTGV2ZWwpOwoKICAgIGNvbnNvbGUubG9nKCJsZXZlbFRleHQ6ICIsIGxldmVsVGV4dCk7CiAgICBjb25zb2xlLmxvZygiY3VybGV2ZWw6ICIsIGN1cmxldmVsKTsKCgl2YXIgcHJldiA9IE51bWJlcihsYXN0S25vd25MZXZlbCk7Cgl2YXIgY3VyICA9IE51bWJlcihjdXJsZXZlbCk7Cgl2YXIgbmV4dCA9IHByZXYgKyAxOwoKCWlmIChjdXIgPT0gbmV4dCkgeyAKCQljb25zb2xlLmxvZygibGV2ZWxlZCB1cCEiKTsKCQl2YXIgZCA9IG5ldyBEYXRlKCk7CgkJdmFyIG4gPSBkLmdldFRpbWUoKTsKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cExldlRpbWUiLCBuKTsgLy8gcmVjb3JkIGxldmVsLXVwIHRpbWUKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cFByZXZMZXZlbCIsIGN1cik7ICAvLyB1cGRhdGUgJ2xhc3RLbm93bkxldmVsJyBmb3IgbmV4dCB0aW1lCgoJfSBlbHNlIGlmIChjdXIgIT0gcHJldikgewoJCS8vIGVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHJ1bm5pbmcsIG9yIHRoZXJlJ3MgYSBkaWZmZXJlbnQgdXNlciBoZXJlLCAKCQkvLyBvciB0aGUgdXNlcidzIHN1YnNjcmlwdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQsIG9yIHNvbWV0aGluZyBlbHNlIHdlaXJkIGlzIGdvaW5nIG9uOwoKCQkvLyBpZiBjdXIgPT0gMiwgYXNzdW1lIHRoZSB1c2VyJ3Mgc3Vic2NyaXB0aW9uIGV4cGlyZWQ7IGxlYXZlIGV2ZXJ5dGhpbmcgYmUgYW5kIHdhaXQgZm9yIHJlbmV3YWwuIE90aGVyd2lzZSwKCgkJaWYgKGN1ciAhPSAyIHx8ICEgbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiKSkgeyAKCgkJCS8vIGNsZWFyIFdLbHZsdXBMZXZUaW1lIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBkaXNwbGF5IHRoZSBsZXZlbC11cCBtZXNzYWdlCgkJCWNvbnNvbGUubG9nKCJyZWluaXRpYWxpemluZyIpOwoJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cExldlRpbWUiLCAwKTsKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiLCBjdXIpOyAgLy8gdXBkYXRlICdsYXN0S25vd25MZXZlbCcgZm9yIG5leHQgdGltZQoKCQkJLy8gYWxzbyByZWluaXRpYWxpemUgdGhlIG5leHRNaWxlc3RvbmVzIGFycmF5CgkJCWluaXRpYWxpemVNaWxlc3RvbmVzKCk7CgoJCX0KCgl9IC8vZWxzZSBjdXIgPT0gcHJldiwgc28gJ2xhc3RLbm93bkxldmVsJyBpcyBzdGlsbCBjb3JyZWN0IChvciBpdCB3aWxsIGNvbnRpbnVlIHRvIGRlZmF1bHQgdG8gMSBpZiBpdCBoYXNuJ3QgYmVlbiBzdG9yZWQgeWV0KQoKCWNvbnNvbGUubG9nKCJwcmV2IGxldmVsOiAiLCBwcmV2KTsKCWNvbnNvbGUubG9nKCJjdXIgbGV2ZWw6ICIsIGN1cik7Cgljb25zb2xlLmxvZygibmV4dCBsZXZlbDogIiwgbmV4dCk7Cgljb25zb2xlLmxvZygiY2hlY2tMZXZlbCgpIGVuZCIpOwoKCXJldHVybiBjdXI7Cn0KCgoKZnVuY3Rpb24gc2hvdWxkRGlzcGxheSgpIHsKCgljb25zb2xlLmxvZygnc2hvdWxkRGlzcGxheSgpIHN0YXJ0Jyk7CgoJdmFyIGxldlRpbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cExldlRpbWUiKSB8fCAwOwoJdmFyIHJhd2R1ciA9IDEwOyAgLy8gbmV3IGxldmVsIGRpc3BsYXkgaXMgZW5hYmxlZCBmb3IgMTAgbWludXRlcyBhZnRlciBmaXJzdCBkaXNwbGF5IHRpbWUKCXZhciBkID0gbmV3IERhdGUoKTsKCXZhciBub3cgPSBkLmdldFRpbWUoKTsKCXZhciByZXR2YWw7Cgl2YXIgZHVyYXRpb24gPSBOdW1iZXIocmF3ZHVyKTsKCXZhciBwcmV2aWV3ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFByZXZpZXciKTsKCgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7CgoJY29uc29sZS5sb2coIm5vdyA9ICIsIG5vdyk7Cgljb25zb2xlLmxvZygibGV2VGltZSA9ICIsIGxldlRpbWUpOwoJY29uc29sZS5sb2coInJhd2R1ciA9ICIsIHJhd2R1cik7Cgljb25zb2xlLmxvZygiZHVyYXRpb24gbWludXRlcyA9ICIsIGR1cmF0aW9uKTsKCglpZiAocHJldmlldyAmJiBwcmV2aWV3ID09IDEpIHsKCQljb25zb2xlLmxvZygiUHJldmlldyBlbmFibGVkLCBkaXNwbGF5IGl0Iik7CgkJc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cFByZXZpZXciLCAwKTsJLy8gb25jZSBvbmx5CgkJcmV0dXJuIDE7Cgl9CgoJaWYgKHRoZVR4dCAmJiB0aGVUeHQuc3Vic3RyaW5nKDAsIDgpID09ICIlI1RFU1QlIyIpIHsKCQljb25zb2xlLmxvZygidGV4dCBiZWdpbnMgd2l0aCAlI1RFU1QlIywgYWx3YXlzIGRpc3BsYXkiKTsKCQlyZXR1cm4gMTsKCX0KCQoJZHVyYXRpb24gKj0gNjAwMDA7IC8vIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzCgoJY29uc29sZS5sb2coImR1cmF0aW9uIG1zZWMgPSAiLCBkdXJhdGlvbik7CgoJY29uc29sZS5sb2coIm5vdyAtIGxldlRpbWUgPSAiLCBub3cgLSBsZXZUaW1lKTsKCglpZiAoKG5vdyAtIGxldlRpbWUpIDw9IGR1cmF0aW9uKSB7CgkJcmV0dmFsID0gMTsKCX0gZWxzZSB7CgkJcmV0dmFsID0gMDsKCX0KCgljb25zb2xlLmxvZygicmV0dmFsID0gIiwgcmV0dmFsKTsKCgljb25zb2xlLmxvZygnc2hvdWxkRGlzcGxheSgpIGVuZCcpOwoJcmV0dXJuIHJldHZhbDsKfQoKCgpmdW5jdGlvbiBkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UgKCBjdXJMZXZlbCApIHsKCWNvbnNvbGUubG9nKCdkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UoKSBzdGFydCcpOwoJdmFyIG1zZyA9IGdldCgic2VhcmNoIik7CiAgICAJdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKIAl2YXIgdGhlSW1nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdVUkwiKTsKIAl2YXIgdGhlUG9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdQb3MiKSB8fCAiTEVGVCI7Cgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7CgogICAgc3dpdGNoKHRoZVBvcy50b1VwcGVyQ2FzZSgpKSB7CgogICAgICAgIGNhc2UgIkJFTE9XIjoKICAgICAgICBjYXNlICJVTkRFUiI6CiAgICAgICAgY2FzZSAiVU5ERVJORUFUSCI6CiAgICAgICAgY2FzZSAiRE9XTiI6CiAgICAgICAgY2FzZSAiQk9UVE9NIjoKICAgICAgICBjYXNlICLjgZfjgZ8iOgogICAgICAgIGNhc2UgIuS4iyI6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46YXV0bzt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAgICAgICAgICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW46YXV0byI+IDwvaW1nPicrCiAgICAgICAgCQknPC9kaXY+JzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgIkFCT1ZFIjoKICAgICAgICBjYXNlICJUT1AiOgogICAgICAgIGNhc2UgIlVQIjoKICAgICAgICBjYXNlICJPVkVSIjoKICAgICAgICBjYXNlICJPTiBUT1AgT0YiOgogICAgICAgIGNhc2UgIkNFTlRFUiI6CiAgICAgICAgY2FzZSAiQ0VOVEVSRUQiOgogICAgICAgIGNhc2UgIuOBhuOBiCI6CiAgICAgICAgY2FzZSAi5LiKIjoKICAgICAgICBjYXNlICLjgarjgYsiOgogICAgICAgIGNhc2UgIuS4rSI6CiAgICAgICAgY2FzZSAi44Gh44KF44GG44GK44GGIjoKICAgICAgICBjYXNlICLkuK3lpK4iOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW46YXV0byI+IDwvaW1nPicrCiAgICAgICAgICAgICAgICAnPGRpdiBpZD0iV0tsdmx1cFR4dCIgc3R5bGU9Im1hcmdpbjphdXRvO3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJMRUZUIjoKICAgICAgICBjYXNlICJBVCBMRUZUIjoKICAgICAgICBjYXNlICJPTiBMRUZUIjoKICAgICAgICBjYXNlICJPTiBUSEUgTEVGVCI6CiAgICAgICAgY2FzZSAiTEVGVCBPRiI6CiAgICAgICAgY2FzZSAiVE8gVEhFIExFRlQgT0YiOgogICAgICAgIGNhc2UgIuOBsuOBoOOCiiI6CiAgICAgICAgY2FzZSAi5bemIjoKICAgICAgICBjYXNlICLjgbLjgaDjgorjgYzjgo8iOgogICAgICAgIGNhc2UgIuW3puWBtCI6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjIwcHgiPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46MjBweDtmbG9hdDpsZWZ0O3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJSSUdIVCI6CiAgICAgICAgY2FzZSAiQVQgUklHSFQiOgogICAgICAgIGNhc2UgIk9OIFJJR0hUIjoKICAgICAgICBjYXNlICJPTiBUSEUgUklHSFQiOgogICAgICAgIGNhc2UgIlJJR0hUIE9GIjoKICAgICAgICBjYXNlICJUTyBUSEUgUklHSFQgT0YiOgogICAgICAgIGNhc2UgIk1JR0kiOgogICAgICAgIGNhc2UgIuOBv+OBjiI6CiAgICAgICAgY2FzZSAi5Y+zIjoKICAgICAgICBjYXNlICLjgb/jgY7jgYzjgo8iOgogICAgICAgIGNhc2UgIuWPs+WBtCI6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxpbWcgaWQ9IldLbHZsdXBJbWciIHN0eWxlPSJmbG9hdDpyaWdodDttYXJnaW46MjBweCI+IDwvaW1nPicrCiAgICAgICAgICAgICAgICAnPGRpdiBpZD0iV0tsdmx1cFR4dCIgc3R5bGU9Im1hcmdpbjoyMHB4O2Zsb2F0OnJpZ2h0O3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgIH0KICAgIHQuc3R5bGUud2lkdGggPSAiMTIwMHB4IjsKICAgIHQuc3R5bGUubWFyZ2luID0gImF1dG8iOwoKICAgIG1zZy5hcHBlbmRDaGlsZCh0KTsKCgl2YXIgdGhpbmcxID0gZ2V0KCJXS2x2bHVwSW1nIik7CglpZiAodGhpbmcxICYmIHRoZUltZykgewoJCXRoaW5nMS5zcmMgPSB0aGVJbWc7Cgl9CgoJdmFyIHRoaW5nMiA9IGdldCgiV0tsdmx1cFR4dCIpOwoKCWlmICh0aGluZzIgJiYgdGhlVHh0KSB7CgkJaWYgKHRoZVR4dC5zdWJzdHJpbmcoMCwgOCkgPT0gIiUjVEVTVCUjIikgewoJCQkvLyBpbmRpY2F0ZXMgdGVzdCBtb2RlOyBzdHJpcCB0aGUgdGVzdCBmbGFnIG91dCBvZiB0aGUgdGV4dAoJCQl0aGVUeHQgPSB0aGVUeHQucmVwbGFjZSgiJSNURVNUJSMiLCAiIik7CgkJfQoJCQoJCXRoZVR4dCA9IHRoZVR4dC5yZXBsYWNlKC8jTEVWRUxOVU0jL2csIGN1ckxldmVsKTsgIC8vIHN1cHBvcnQgI0xFVkVMTlVNIyB2YXJpYWJsZSBpbiB0ZXh0IHN0cmluZ3MKCgkJdGhpbmcyLmlubmVySFRNTD0gdGhlVHh0OwoJfSAKCgljb25zb2xlLmxvZygnZGlzcGxheUxldmVsVXBNZXNzYWdlKCkgZW5kJyk7Cn0KCgpmdW5jdGlvbiBnZXROZXh0TWlsZXN0b25lKCBudW1UdXJ0bGVzICkgewoKCWNvbnNvbGUubG9nKCJnZXROZXh0TWlsZXN0b25lKCkiKTsKCgl2YXIgbWlsZXN0b25lcyA9IFsxLCAxMDAsIDI1MCwgNTAwLCA3NTAsIDEwMDAsIDE1MDAsIDIwMDAsIDI1MDAsIDMwMDAsIDQwMDAsIDUwMDAsIDYwMDAsIDcwMDAsIDgwMDAsIDkwMDAsIDEwMDAwLCA5OTk5OTldOwoJdmFyIGk9MDsKCgljb25zb2xlLmxvZygibnVtVHVydGxlcyA9ICIsIG51bVR1cnRsZXMpOwoKCXdoaWxlICggbWlsZXN0b25lc1tpXSA8PSBudW1UdXJ0bGVzICkgewoKCQlpKys7Cgl9Cgljb25zb2xlLmxvZygibmV4dCBtaWxlc3RvbmUgPSAiLCBtaWxlc3RvbmVzW2ldKTsKCXJldHVybiBtaWxlc3RvbmVzW2ldOwp9CgoKZnVuY3Rpb24gZ2V0VHVydGxlQ291bnRzKCkgewkvLyBjdW11bGF0aXZlIChlbmwgPSBlbmwgKyBidXIsIGV0Yy4pCgoJY29uc29sZS5sb2coImdldFR1cnRsZUNvdW50cygpIik7CgoJLy8gSSdtIGRvaW5nIHRoZSBzdHJpbmcgc3BsaXQoIiAiKSBhbmQgcmVwbGFjZSgpIHNvIHdlIHdpbGwgcGxheSBuaWNlbHkgd2l0aCBvbmUgb2YgbXkgb3RoZXIgc2NyaXB0cyBqdXN0IGluIGNhc2UgdGhlIG90aGVyIG9uZSBydW5zIGZpcnN0CgoJdmFyIGJzdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnVybmVkIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgZXN0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbmxpZ2h0ZW5lZCIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIilbMF0uaW5uZXJIVE1MLnNwbGl0KCIgIilbMF0gfHwgIjAiOwoJdmFyIG1zdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFzdGVyIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgZ3N0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJndXJ1IikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgYXN0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhcHByZW50aWNlIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7CgoJdmFyIHVwYXJyb3cgPSAi4oaRIjsKCXZhciBkb3duYXJyb3cgPSAi4oaTIjsKCglic3RyID0gYnN0ci5yZXBsYWNlKHVwYXJyb3csICIiKTsKCWVzdHIgPSBlc3RyLnJlcGxhY2UodXBhcnJvdywgIiIpOwoJbXN0ciA9IG1zdHIucmVwbGFjZSh1cGFycm93LCAiIik7Cglnc3RyID0gZ3N0ci5yZXBsYWNlKHVwYXJyb3csICIiKTsKCWFzdHIgPSBhc3RyLnJlcGxhY2UodXBhcnJvdywgIiIpOwoKCWJzdHIgPSBic3RyLnJlcGxhY2UoZG93bmFycm93LCAiIik7Cgllc3RyID0gZXN0ci5yZXBsYWNlKGRvd25hcnJvdywgIiIpOwoJbXN0ciA9IG1zdHIucmVwbGFjZShkb3duYXJyb3csICIiKTsKCWdzdHIgPSBnc3RyLnJlcGxhY2UoZG93bmFycm93LCAiIik7Cglhc3RyID0gYXN0ci5yZXBsYWNlKGRvd25hcnJvdywgIiIpOwoKCXZhciBidXJuZWQgPSBOdW1iZXIoIGJzdHIgKTsKCXZhciBlbmxpZ2h0ZW5lZCA9IE51bWJlciggZXN0ciApOwoJdmFyIG1hc3RlciA9IE51bWJlciggbXN0ciApOwoJdmFyIGd1cnUgPSBOdW1iZXIoIGdzdHIgKTsKCXZhciBhcHByZW50aWNlID0gTnVtYmVyKCBhc3RyICk7CgoJY29uc29sZS5sb2coInJhdyBjb3VudHM6ICIsIGFwcHJlbnRpY2UsIGd1cnUsIG1hc3RlciwgZW5saWdodGVuZWQsIGJ1cm5lZCk7CgoJZW5saWdodGVuZWQgKz0gYnVybmVkOwoJbWFzdGVyICs9IGVubGlnaHRlbmVkOwoJZ3VydSArPSBtYXN0ZXI7CglhcHByZW50aWNlICs9IGd1cnU7CgoJY29uc29sZS5sb2coImN1bXVsYXRpdmUgY291bnRzOiAiLCBhcHByZW50aWNlLCBndXJ1LCBtYXN0ZXIsIGVubGlnaHRlbmVkLCBidXJuZWQpOwoKCXJldHVybiBbYXBwcmVudGljZSwgZ3VydSwgbWFzdGVyLCBlbmxpZ2h0ZW5lZCwgYnVybmVkXTsKfQoKCgpmdW5jdGlvbiBpbml0ICgpIHsKCWNvbnNvbGUubG9nKCdpbml0KCkgc3RhcnQnKTsKCiAJdmFyIHRoZUltZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nVVJMIik7Cgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7Cgl2YXIgbmV4dE1pbGVzdG9uZXMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cE1pbGVzdG9uZXMiKTsKICAgIAogICAgICAJaWYgKCF0aGVJbWcpIHsKCQl0aGVJbWcgPSAiaHR0cHM6Ly9pLmltZ3VyLmNvbS9LNlVRTDFaLmdpZiI7CiAgICAgICAgCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwSW1nVVJMIiwgdGhlSW1nKTsKICAgICAgCX0KICAgICAgCiAgICAgIAlpZiAoIXRoZVR4dCkgewoJCXRoZVR4dCA9ICc8YnIvPllvdSBsZXZlbGVkIHVwITxici8+Q29uZ3JhdHVsYXRpb25zISc7CiAgICAgICAgCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwVGV4dCIsIHRoZVR4dCk7CiAgICAgIAl9CgoJaWYgKCFuZXh0TWlsZXN0b25lcykgewoKCQlpbml0aWFsaXplTWlsZXN0b25lcygpOwoJCQoJfQoKCWNvbnNvbGUubG9nKCdpbml0KCkgZW5kJyk7Cn0KCgpmdW5jdGlvbiBpbml0aWFsaXplTWlsZXN0b25lcyAoKSB7CgoJY29uc29sZS5sb2coImluaXRpYWxpemVNaWxlc3RvbmVzKCkiKTsKCgl2YXIgdHVydGxlQ291bnRzID0gZ2V0VHVydGxlQ291bnRzKCk7CS8vIGN1bXVsYXRpdmUgKGVubCA9IGVubCArIGJ1ciwgZXRjLikKCXZhciBuZXh0TWlsZXN0b25lcyA9IG5ldyBBcnJheSgpOwoKCWZvciAodmFyIHg9MTsgeCA8IHR1cnRsZUNvdW50cy5sZW5ndGg7IHgrKykgewoKCQluZXh0TWlsZXN0b25lc1t4LTFdID0gZ2V0TmV4dE1pbGVzdG9uZSggdHVydGxlQ291bnRzW3hdICk7ICAvLyB0dXJ0bGVDb3VudHNbXSBpbmNsdWRlcyBBcHByZW50aWNlIGl0ZW1zLCBuZXh0TWlsZXN0b25lc1tdIGRvZXMgbm90Cgl9CgoJbG9jYWxTdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBNaWxlc3RvbmVzIiwgSlNPTi5zdHJpbmdpZnkobmV4dE1pbGVzdG9uZXMpKTsKfQoKCmZ1bmN0aW9uIGNoZWNrTWlsZXN0b25lcyggbGV2ZWwgKSB7CgoJY29uc29sZS5sb2coImNoZWNrTWlsZXN0b25lcygpIik7CgoJdmFyIG5leHRNaWxlc3RvbmVzID0gSlNPTi5wYXJzZSggbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBNaWxlc3RvbmVzIikgKTsKCXZhciB0dXJ0bGVDb3VudHMgPSBnZXRUdXJ0bGVDb3VudHMoKTsKCXZhciBhY2hpZXZlbWVudHMgPSBuZXcgQXJyYXkoKTsKCXZhciBnb3RPbmUgPSAwOwoJdmFyIHRlc3RBbGxEb25lID0gbnVsbDsgLy9zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwVGVzdEFsbEJ1cm5lZCIpOwoKCWNvbnNvbGUubG9nKCJuZXh0TWlsZXN0b25lczogIiwgSlNPTi5zdHJpbmdpZnkobmV4dE1pbGVzdG9uZXMpKTsKCglpZiAoIHRlc3RBbGxEb25lIHx8IChsZXZlbCA+PSA1MCAgJiYgKHR1cnRsZUNvdW50c1swXSA9PSB0dXJ0bGVDb3VudHNbNF0pKSkgewoKCQkvLyBhbHNvIGNoZWNrIHRoYXQgbGVzc29ucyA9PSAwIGFuZCByZXZpZXdzID09IDAKCgkJdmFyIHJ2d3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJyZXZpZXdzIilbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXTsKCQl2YXIgbHNucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImxlc3NvbnMiKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpWzBdOwoJCgkJaWYgKHRlc3RBbGxEb25lIHx8IChydndzID09IDAgJiYgbHNucyA9PSAwKSkgewoKCQkJY29uc29sZS5sb2coImFsbCB0dXJ0bGVzIGJ1cm5lZCEiKTsKCgkJCS8vIHNldCBmbGFnCgkJCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBBbGxCdXJuZWQiLCAxKTsKCgkJCS8vIHJldHVybiBzb21lIG90aGVyd2lzZS1pbXBvc3NpYmxlIGFycmF5IHNvIHRoYXQgd2UnbGwgZ2V0IGludG8gZGlzcGxheU1pbGVzdG9uZXMoKQoJCQljb25zb2xlLmxvZygicmV0dXJuaW5nIFsxLDEsMSwxXSIpOwkKCQkJcmV0dXJuIFsxLCAxLCAxLCAxXTsKCQl9Cgl9CgoJZm9yICh2YXIgeD0wOyB4IDwgbmV4dE1pbGVzdG9uZXMubGVuZ3RoOyB4KyspIHsKCgkJaWYgKHR1cnRsZUNvdW50c1t4KzFdID49IG5leHRNaWxlc3RvbmVzW3hdKSB7IC8vIHR1cnRsZUNvdW50c1tdIGluY2x1ZGVzIEFwcHJlbnRpY2UgaXRlbXMsIG5leHRNaWxlc3RvbmVzW10gZG9lcyBub3QKCQkJCgkJCWFjaGlldmVtZW50c1t4XSA9IG5leHRNaWxlc3RvbmVzW3hdOwoJCQluZXh0TWlsZXN0b25lc1t4XSA9IGdldE5leHRNaWxlc3RvbmUoIHR1cnRsZUNvdW50c1t4KzFdICk7CgkJCWdvdE9uZSsrOwoKCQl9IGVsc2UgewoJCQlhY2hpZXZlbWVudHNbeF0gPSAwOwoJCX0KCX0KCgljb25zb2xlLmxvZygiYWNoaWV2ZW1lbnRzOiAiLCBKU09OLnN0cmluZ2lmeShhY2hpZXZlbWVudHMpKTsKCglpZiAoZ290T25lICE9IDApIHsKCgkJY29uc29sZS5sb2coImNoZWNrTWlsZXN0b25lcygpIHJldHVybmluZyBhY2hpZXZlbWVudHMiKTsKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cE1pbGVzdG9uZXMiLCBKU09OLnN0cmluZ2lmeShuZXh0TWlsZXN0b25lcykpOwoJCXJldHVybiBhY2hpZXZlbWVudHM7CgoJfSBlbHNlIHsKCQljb25zb2xlLmxvZygiY2hlY2tNaWxlc3RvbmVzKCkgcmV0dXJuaW5nIG51bGwiKTsKCQlyZXR1cm4gbnVsbDsKCX0KfQoKCmZ1bmN0aW9uIGRpc3BsYXlNaWxlc3RvbmVzICggbWlsZXN0b25lcyApIHsKCgljb25zb2xlLmxvZygnZGlzcGxheU1pbGVzdG9uZXMoKSBzdGFydCcpOwoJdmFyIG1zZyA9IGdldCgic2VhcmNoIik7CiAgICAJdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKIAl2YXIgdGhlSW1nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdVUkwiKTsKCXZhciB0aGVUeHQgPSAiPGJyLz4iOwoJdmFyIGxhYmVscyA9IFsiIEd1cnUgdHVydGxlISIsICIgTWFzdGVyIHR1cnRsZSEiLCAiIEVubGlnaHRlbmVkIHR1cnRsZSEiLCAiIEJ1cm5lZCB0dXJ0bGUhIl07CiAJdmFyIHRoZVBvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nUG9zIikgfHwgIkxFRlQiOwoKICAgIHN3aXRjaCh0aGVQb3MudG9VcHBlckNhc2UoKSkgewoKICAgICAgICBjYXNlICJCRUxPVyI6CiAgICAgICAgY2FzZSAiVU5ERVIiOgogICAgICAgIGNhc2UgIlVOREVSTkVBVEgiOgogICAgICAgIGNhc2UgIkRPV04iOgogICAgICAgIGNhc2UgIkJPVFRPTSI6CiAgICAgICAgY2FzZSAi44GX44GfIjoKICAgICAgICBjYXNlICLkuIsiOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8ZGl2IGlkPSJXS2x2bHVwVHh0IiBzdHlsZT0ibWFyZ2luOmF1dG87dGV4dC1hbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6MTEwJTtmb250LXNpemU6MzAwJSI+IDwvZGl2PicrCiAgICAgICAgICAgICAgICAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG8iPiA8L2ltZz4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJBQk9WRSI6CiAgICAgICAgY2FzZSAiVE9QIjoKICAgICAgICBjYXNlICJVUCI6CiAgICAgICAgY2FzZSAiT1ZFUiI6CiAgICAgICAgY2FzZSAiT04gVE9QIE9GIjoKICAgICAgICBjYXNlICJDRU5URVIiOgogICAgICAgIGNhc2UgIkNFTlRFUkVEIjoKICAgICAgICBjYXNlICLjgYbjgYgiOgogICAgICAgIGNhc2UgIuS4iiI6CiAgICAgICAgY2FzZSAi44Gq44GLIjoKICAgICAgICBjYXNlICLkuK0iOgogICAgICAgIGNhc2UgIuOBoeOCheOBhuOBiuOBhiI6CiAgICAgICAgY2FzZSAi5Lit5aSuIjoKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG8iPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46YXV0bzt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAiTEVGVCI6CiAgICAgICAgY2FzZSAiQVQgTEVGVCI6CiAgICAgICAgY2FzZSAiT04gTEVGVCI6CiAgICAgICAgY2FzZSAiT04gVEhFIExFRlQiOgogICAgICAgIGNhc2UgIkxFRlQgT0YiOgogICAgICAgIGNhc2UgIlRPIFRIRSBMRUZUIE9GIjoKICAgICAgICBjYXNlICLjgbLjgaDjgooiOgogICAgICAgIGNhc2UgIuW3piI6CiAgICAgICAgY2FzZSAi44Gy44Gg44KK44GM44KPIjoKICAgICAgICBjYXNlICLlt6blgbQiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxpbWcgaWQ9IldLbHZsdXBJbWciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjoyMHB4Ij4gPC9pbWc+JysKICAgICAgICAgICAgICAgICc8ZGl2IGlkPSJXS2x2bHVwVHh0IiBzdHlsZT0ibWFyZ2luOjIwcHg7ZmxvYXQ6bGVmdDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAiUklHSFQiOgogICAgICAgIGNhc2UgIkFUIFJJR0hUIjoKICAgICAgICBjYXNlICJPTiBSSUdIVCI6CiAgICAgICAgY2FzZSAiT04gVEhFIFJJR0hUIjoKICAgICAgICBjYXNlICJSSUdIVCBPRiI6CiAgICAgICAgY2FzZSAiVE8gVEhFIFJJR0hUIE9GIjoKICAgICAgICBjYXNlICJNSUdJIjoKICAgICAgICBjYXNlICLjgb/jgY4iOgogICAgICAgIGNhc2UgIuWPsyI6CiAgICAgICAgY2FzZSAi44G/44GO44GM44KPIjoKICAgICAgICBjYXNlICLlj7PlgbQiOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZmxvYXQ6cmlnaHQ7bWFyZ2luOjIwcHgiPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46MjBweDtmbG9hdDpyaWdodDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICB9CgogICAgdC5zdHlsZS53aWR0aCA9ICIxMjAwcHgiOwogICAgdC5zdHlsZS5tYXJnaW4gPSAiYXV0byI7CgogICAgbXNnLmFwcGVuZENoaWxkKHQpOwoKCXZhciB0aGluZzEgPSBnZXQoIldLbHZsdXBJbWciKTsKCWlmICh0aGluZzEgJiYgdGhlSW1nKSB7CgkJdGhpbmcxLnNyYyA9IHRoZUltZzsKCX0KCgl2YXIgYWxsRG9uZVdLID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cEFsbEJ1cm5lZCIpOwoJCglpZiAoYWxsRG9uZVdLICYmIGFsbERvbmVXSyA9PSAxKSB7CgoJCXRoZVR4dCArPSAiQUxMIFRVUlRMRVMgQlVSTkVEITxici8+V0FOSUtBTkkgQ09NUExFVEUhIjsKCQkvL3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oIldLbHZsdXBUZXN0QWxsQnVybmVkIik7Cgl9IGVsc2UgewoKCQlmb3IgKHZhciB4ID0gbWlsZXN0b25lcy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkgewoKCQkJaWYgKG1pbGVzdG9uZXNbeF0gPT0gMSkgewoKCQkJCXRoZVR4dCArPSAiRmlyc3QiICsgbGFiZWxzW3hdICsgIjxici8+IjsKCQkJfQoJCQllbHNlIGlmIChtaWxlc3RvbmVzW3hdICE9IDApIHsKCgkJCQl0aGVUeHQgKz0gbWlsZXN0b25lc1t4XSArICJ0aCIgKyBsYWJlbHNbeF0gKyAiPGJyLz4iOwoJCQl9CgkJfQoJfQoKICAgIHZhciBjdXN0b21CdXJuTGFiZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tCTFJCdXJuTGV2ZWxOYW1lIikgfHwgIkJ1cm5lZCI7CiAgICBpZiAoY3VzdG9tQnVybkxhYmVsICYmIChjdXN0b21CdXJuTGFiZWwgIT0gIkJ1cm5lZCIpKSB7CiAgICAgICAgdmFyIG5ld1RleHQgPSB0aGVUeHQucmVwbGFjZSgiQnVybmVkIiwgY3VzdG9tQnVybkxhYmVsKTsKICAgICAgICBpZiAobmV3VGV4dCA9PSB0aGVUeHQpIHsKICAgICAgICAgICAgdmFyIG5ld0NCTCA9IGN1c3RvbUJ1cm5MYWJlbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBuZXdUZXh0ID0gdGhlVHh0LnJlcGxhY2UoIkJVUk5FRCIsIG5ld0NCTCk7CiAgICAgICAgfQogICAgICAgIHRoZVR4dCA9IG5ld1RleHQ7CiAgICB9CgoJdmFyIHRoaW5nMiA9IGdldCgiV0tsdmx1cFR4dCIpOwoKCWlmICh0aGluZzIpIHsKCgkJdGhpbmcyLmlubmVySFRNTD0gdGhlVHh0OwoJfSAKCgljb25zb2xlLmxvZygnZGlzcGxheU1pbGVzdG9uZXMoKSBlbmQnKTsKfQoKCgpmdW5jdGlvbiBtYWluICgpIHsKCgl2YXIgY3VyTGV2ZWw7CgoJY29uc29sZS5sb2coIm1haW4oKSIpOwoKCWluaXQoKTsKCglHTXNldHVwKCk7CgoJY3VyTGV2ZWwgPSBjaGVja0xldmVsKCk7CgoJdmFyIGxhc3RLbm93bkxldmVsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiKSB8fCAxOwoKCWlmIChjdXJMZXZlbCAhPSBsYXN0S25vd25MZXZlbCkgeyByZXR1cm47IH0KCglpZiAoc2hvdWxkRGlzcGxheSgpKSB7CgoJCXZhciBkdXJ0ZXh0ID0gZ2V0KCJXS2x2bGR1clR4dCIpOwoKCQlpZiAoZHVydGV4dCkgeyBkdXJ0ZXh0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHVydGV4dCk7IH0gIC8vIG92ZXJyaWRlIFdLIExldmVsIER1cmF0aW9uIHNjcmlwdAoKCQlkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UoIGN1ckxldmVsICk7CgoJfSBlbHNlIHsKCgkJdmFyIG1pbGVzdG9uZXMgPSBjaGVja01pbGVzdG9uZXMoIGN1ckxldmVsICk7CgoJCWlmIChtaWxlc3RvbmVzKSB7CgoJCQl2YXIgZHVydGV4dCA9IGdldCgiV0tsdmxkdXJUeHQiKTsKCgkJCWlmIChkdXJ0ZXh0KSB7IGR1cnRleHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkdXJ0ZXh0KTsgfSAgLy8gb3ZlcnJpZGUgV0sgTGV2ZWwgRHVyYXRpb24gc2NyaXB0CgoJCQlkaXNwbGF5TWlsZXN0b25lcyggbWlsZXN0b25lcyApOwoKCQl9IAoJfQp9Cgp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIG1haW4sIGZhbHNlKTsKCmNvbnNvbGUubG9nKCdzY3JpcHQgbG9hZCBlbmQnKTsK", 408 379 "storage": { 409 380 "data": {}, 410 381 "ts": 1607436649632 411 382 }, 412 - "enabled": true, 413 - "position": 8, 414 - "file_url": "https://greasyfork.org/scripts/233-wanikani-levelup-celebrator/code/WaniKani%20LevelUP%20Celebrator.user.js", 415 - "uuid": "f56e4394-b554-42b3-b894-0263a9d2f095", 416 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICAgV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yCi8vIEBuYW1lc3BhY2UgICAgIGh0dHBzOi8vd3d3LndhbmlrYW5pLmNvbQovLyBAZGVzY3JpcHRpb24gICBUaGlzIHdpbGwgZGlzcGxheSBhICJsZXZlbC11cCIgbm90aWZpY2F0aW9uIG9uIHlvdXIgV0sgRGFzaGJvYXJkIGFmdGVyIHlvdSBsZXZlbCB1cC4gIFlvdSBjYW4gY3VzdG9taXplIHRoZSBpbWFnZSBhbmQgdGV4dCBvZiB0aGUgZGlzcGxheS4gIE90aGVyIGFjaGlldmVtZW50cyBhcmUgYWxzbyBub3RlZC4gIEJ5IFJob3NWZWVkY3kuCi8vIEB2ZXJzaW9uIDIuNC4wCi8vIEBpbmNsdWRlICAgICAgIGh0dHBzOi8vd3d3LndhbmlrYW5pLmNvbS8KLy8gQGluY2x1ZGUgICAgICAgaHR0cHM6Ly93d3cud2FuaWthbmkuY29tL2Rhc2hib2FyZAovLyBAcnVuLWF0CSAgZG9jdW1lbnQtZW5kCi8vIEBncmFudAkgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQKCi8vID09L1VzZXJTY3JpcHQ9PQoKZnVuY3Rpb24gZ2V0KGlkKSB7CiAgICBjb25zb2xlLmxvZygnZ2V0IGZjdCcpOwogICAgaWYgKGlkICYmIHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKCWNvbnNvbGUubG9nKGlkKTsKICAgICAgICBpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgIH0KICAgIHJldHVybiBpZCB8fCBudWxsOwp9CgoKZnVuY3Rpb24gR01zZXR1cCgpIHsKICBpZiAoR01fcmVnaXN0ZXJNZW51Q29tbWFuZCkgewogICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgnV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yOiBTZXQgaW1hZ2UgVVJMJywgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjdXJFbnRyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nVVJMIikgfHwgIiI7CiAgICAgIHZhciBuZXdJbWdVUkwgPSBwcm9tcHQoJ05ldyBJbWFnZSBVUkw6JywgY3VyRW50cnkpOwogICAgICBpZiAobmV3SW1nVVJMICE9IG51bGwpIHsKCWlmICh0eXBlb2YobmV3SW1nVVJMKSAhPT0gInN0cmluZyIpIHsKCQluZXdJbWdVUkwgPSBTdHJpbmcobmV3SW1nVVJMKTsKCX0KICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cEltZ1VSTCIsIG5ld0ltZ1VSTCk7CiAgICAgIH0KICAgIH0pOwoKICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoJ1dhbmlLYW5pIExldmVsVVAgQ2VsZWJyYXRvcjogU2V0IGltYWdlIHBvc2l0aW9uJywgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjdXJFbnRyeSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nUG9zIikgfHwgIkxlZnQiOwogICAgICB2YXIgbmV3SW1nUG9zID0gcHJvbXB0KCdJbWFnZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0ZXh0IChsZWZ0LCByaWdodCwgYWJvdmUsIGJlbG93KTonLCBjdXJFbnRyeSk7CiAgICAgIGlmIChuZXdJbWdQb3MgIT0gbnVsbCkgewoJaWYgKHR5cGVvZihuZXdJbWdQb3MpICE9PSAic3RyaW5nIikgewoJCW5ld0ltZ1BvcyA9IFN0cmluZyhuZXdJbWdQb3MpOwoJfQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwSW1nUG9zIiwgbmV3SW1nUG9zKTsKICAgICAgfQogICAgfSk7CgogICAgR01fcmVnaXN0ZXJNZW51Q29tbWFuZCgnV2FuaUthbmkgTGV2ZWxVUCBDZWxlYnJhdG9yOiBTZXQgdGV4dCcsIGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3VyRW50cnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFRleHQiKSB8fCAiIjsKICAgICAgdmFyIG5ld1RleHQgPSBwcm9tcHQoJ05ldyB0ZXh0OicsIGN1ckVudHJ5KTsKICAgICAgaWYgKG5ld1RleHQgIT0gbnVsbCkgewoJaWYgKHR5cGVvZihuZXdUZXh0KSAhPT0gInN0cmluZyIpIHsKCQluZXdUZXh0ID0gU3RyaW5nKG5ld1RleHQpOwoJfQogICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwVGV4dCIsIG5ld1RleHQpOwogICAgICB9CiAgICB9KTsKCiAgICBHTV9yZWdpc3Rlck1lbnVDb21tYW5kKCdXYW5pS2FuaSBMZXZlbFVQIENlbGVicmF0b3I6IFByZXZpZXcnLCBmdW5jdGlvbigpIHsKCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBQcmV2aWV3IiwgMSk7Cglsb2NhdGlvbi5yZWxvYWQoKTsKICAgIH0pOwoKICB9Cn0KCgpmdW5jdGlvbiBjaGVja0xldmVsKCkgewoKCWNvbnNvbGUubG9nKCJjaGVja0xldmVsKCkgc3RhcnQiKTsKCgl2YXIgbGFzdEtub3duTGV2ZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFByZXZMZXZlbCIpIHx8IDE7CiAgICB2YXIgbGV2ZWxUZXh0ID0gJCgnbGkudXNlci1zdW1tYXJ5X19hdHRyaWJ1dGUgYScpWzBdLmhyZWYuc3BsaXQoJy9sZXZlbC8nKVsxXTsKICAgIHZhciBjdXJsZXZlbCA9IChsZXZlbFRleHQ/IGxldmVsVGV4dDogbGFzdEtub3duTGV2ZWwpOwoKICAgIGNvbnNvbGUubG9nKCJsZXZlbFRleHQ6ICIsIGxldmVsVGV4dCk7CiAgICBjb25zb2xlLmxvZygiY3VybGV2ZWw6ICIsIGN1cmxldmVsKTsKCgl2YXIgcHJldiA9IE51bWJlcihsYXN0S25vd25MZXZlbCk7Cgl2YXIgY3VyICA9IE51bWJlcihjdXJsZXZlbCk7Cgl2YXIgbmV4dCA9IHByZXYgKyAxOwoKCWlmIChjdXIgPT0gbmV4dCkgeyAKCQljb25zb2xlLmxvZygibGV2ZWxlZCB1cCEiKTsKCQl2YXIgZCA9IG5ldyBEYXRlKCk7CgkJdmFyIG4gPSBkLmdldFRpbWUoKTsKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cExldlRpbWUiLCBuKTsgLy8gcmVjb3JkIGxldmVsLXVwIHRpbWUKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cFByZXZMZXZlbCIsIGN1cik7ICAvLyB1cGRhdGUgJ2xhc3RLbm93bkxldmVsJyBmb3IgbmV4dCB0aW1lCgoJfSBlbHNlIGlmIChjdXIgIT0gcHJldikgewoJCS8vIGVpdGhlciB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHJ1bm5pbmcsIG9yIHRoZXJlJ3MgYSBkaWZmZXJlbnQgdXNlciBoZXJlLCAKCQkvLyBvciB0aGUgdXNlcidzIHN1YnNjcmlwdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQsIG9yIHNvbWV0aGluZyBlbHNlIHdlaXJkIGlzIGdvaW5nIG9uOwoKCQkvLyBpZiBjdXIgPT0gMiwgYXNzdW1lIHRoZSB1c2VyJ3Mgc3Vic2NyaXB0aW9uIGV4cGlyZWQ7IGxlYXZlIGV2ZXJ5dGhpbmcgYmUgYW5kIHdhaXQgZm9yIHJlbmV3YWwuIE90aGVyd2lzZSwKCgkJaWYgKGN1ciAhPSAyIHx8ICEgbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiKSkgeyAKCgkJCS8vIGNsZWFyIFdLbHZsdXBMZXZUaW1lIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBkaXNwbGF5IHRoZSBsZXZlbC11cCBtZXNzYWdlCgkJCWNvbnNvbGUubG9nKCJyZWluaXRpYWxpemluZyIpOwoJCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cExldlRpbWUiLCAwKTsKCQkJbG9jYWxTdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiLCBjdXIpOyAgLy8gdXBkYXRlICdsYXN0S25vd25MZXZlbCcgZm9yIG5leHQgdGltZQoKCQkJLy8gYWxzbyByZWluaXRpYWxpemUgdGhlIG5leHRNaWxlc3RvbmVzIGFycmF5CgkJCWluaXRpYWxpemVNaWxlc3RvbmVzKCk7CgoJCX0KCgl9IC8vZWxzZSBjdXIgPT0gcHJldiwgc28gJ2xhc3RLbm93bkxldmVsJyBpcyBzdGlsbCBjb3JyZWN0IChvciBpdCB3aWxsIGNvbnRpbnVlIHRvIGRlZmF1bHQgdG8gMSBpZiBpdCBoYXNuJ3QgYmVlbiBzdG9yZWQgeWV0KQoKCWNvbnNvbGUubG9nKCJwcmV2IGxldmVsOiAiLCBwcmV2KTsKCWNvbnNvbGUubG9nKCJjdXIgbGV2ZWw6ICIsIGN1cik7Cgljb25zb2xlLmxvZygibmV4dCBsZXZlbDogIiwgbmV4dCk7Cgljb25zb2xlLmxvZygiY2hlY2tMZXZlbCgpIGVuZCIpOwoKCXJldHVybiBjdXI7Cn0KCgoKZnVuY3Rpb24gc2hvdWxkRGlzcGxheSgpIHsKCgljb25zb2xlLmxvZygnc2hvdWxkRGlzcGxheSgpIHN0YXJ0Jyk7CgoJdmFyIGxldlRpbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cExldlRpbWUiKSB8fCAwOwoJdmFyIHJhd2R1ciA9IDEwOyAgLy8gbmV3IGxldmVsIGRpc3BsYXkgaXMgZW5hYmxlZCBmb3IgMTAgbWludXRlcyBhZnRlciBmaXJzdCBkaXNwbGF5IHRpbWUKCXZhciBkID0gbmV3IERhdGUoKTsKCXZhciBub3cgPSBkLmdldFRpbWUoKTsKCXZhciByZXR2YWw7Cgl2YXIgZHVyYXRpb24gPSBOdW1iZXIocmF3ZHVyKTsKCXZhciBwcmV2aWV3ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cFByZXZpZXciKTsKCgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7CgoJY29uc29sZS5sb2coIm5vdyA9ICIsIG5vdyk7Cgljb25zb2xlLmxvZygibGV2VGltZSA9ICIsIGxldlRpbWUpOwoJY29uc29sZS5sb2coInJhd2R1ciA9ICIsIHJhd2R1cik7Cgljb25zb2xlLmxvZygiZHVyYXRpb24gbWludXRlcyA9ICIsIGR1cmF0aW9uKTsKCglpZiAocHJldmlldyAmJiBwcmV2aWV3ID09IDEpIHsKCQljb25zb2xlLmxvZygiUHJldmlldyBlbmFibGVkLCBkaXNwbGF5IGl0Iik7CgkJc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cFByZXZpZXciLCAwKTsJLy8gb25jZSBvbmx5CgkJcmV0dXJuIDE7Cgl9CgoJaWYgKHRoZVR4dCAmJiB0aGVUeHQuc3Vic3RyaW5nKDAsIDgpID09ICIlI1RFU1QlIyIpIHsKCQljb25zb2xlLmxvZygidGV4dCBiZWdpbnMgd2l0aCAlI1RFU1QlIywgYWx3YXlzIGRpc3BsYXkiKTsKCQlyZXR1cm4gMTsKCX0KCQoJZHVyYXRpb24gKj0gNjAwMDA7IC8vIGNvbnZlcnQgdG8gbWlsbGlzZWNvbmRzCgoJY29uc29sZS5sb2coImR1cmF0aW9uIG1zZWMgPSAiLCBkdXJhdGlvbik7CgoJY29uc29sZS5sb2coIm5vdyAtIGxldlRpbWUgPSAiLCBub3cgLSBsZXZUaW1lKTsKCglpZiAoKG5vdyAtIGxldlRpbWUpIDw9IGR1cmF0aW9uKSB7CgkJcmV0dmFsID0gMTsKCX0gZWxzZSB7CgkJcmV0dmFsID0gMDsKCX0KCgljb25zb2xlLmxvZygicmV0dmFsID0gIiwgcmV0dmFsKTsKCgljb25zb2xlLmxvZygnc2hvdWxkRGlzcGxheSgpIGVuZCcpOwoJcmV0dXJuIHJldHZhbDsKfQoKCgpmdW5jdGlvbiBkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UgKCBjdXJMZXZlbCApIHsKCWNvbnNvbGUubG9nKCdkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UoKSBzdGFydCcpOwoJdmFyIG1zZyA9IGdldCgic2VhcmNoIik7CiAgICAJdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKIAl2YXIgdGhlSW1nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdVUkwiKTsKIAl2YXIgdGhlUG9zID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdQb3MiKSB8fCAiTEVGVCI7Cgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7CgogICAgc3dpdGNoKHRoZVBvcy50b1VwcGVyQ2FzZSgpKSB7CgogICAgICAgIGNhc2UgIkJFTE9XIjoKICAgICAgICBjYXNlICJVTkRFUiI6CiAgICAgICAgY2FzZSAiVU5ERVJORUFUSCI6CiAgICAgICAgY2FzZSAiRE9XTiI6CiAgICAgICAgY2FzZSAiQk9UVE9NIjoKICAgICAgICBjYXNlICLjgZfjgZ8iOgogICAgICAgIGNhc2UgIuS4iyI6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46YXV0bzt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAgICAgICAgICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW46YXV0byI+IDwvaW1nPicrCiAgICAgICAgCQknPC9kaXY+JzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgIkFCT1ZFIjoKICAgICAgICBjYXNlICJUT1AiOgogICAgICAgIGNhc2UgIlVQIjoKICAgICAgICBjYXNlICJPVkVSIjoKICAgICAgICBjYXNlICJPTiBUT1AgT0YiOgogICAgICAgIGNhc2UgIkNFTlRFUiI6CiAgICAgICAgY2FzZSAiQ0VOVEVSRUQiOgogICAgICAgIGNhc2UgIuOBhuOBiCI6CiAgICAgICAgY2FzZSAi5LiKIjoKICAgICAgICBjYXNlICLjgarjgYsiOgogICAgICAgIGNhc2UgIuS4rSI6CiAgICAgICAgY2FzZSAi44Gh44KF44GG44GK44GGIjoKICAgICAgICBjYXNlICLkuK3lpK4iOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZGlzcGxheTpibG9jazttYXJnaW46YXV0byI+IDwvaW1nPicrCiAgICAgICAgICAgICAgICAnPGRpdiBpZD0iV0tsdmx1cFR4dCIgc3R5bGU9Im1hcmdpbjphdXRvO3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJMRUZUIjoKICAgICAgICBjYXNlICJBVCBMRUZUIjoKICAgICAgICBjYXNlICJPTiBMRUZUIjoKICAgICAgICBjYXNlICJPTiBUSEUgTEVGVCI6CiAgICAgICAgY2FzZSAiTEVGVCBPRiI6CiAgICAgICAgY2FzZSAiVE8gVEhFIExFRlQgT0YiOgogICAgICAgIGNhc2UgIuOBsuOBoOOCiiI6CiAgICAgICAgY2FzZSAi5bemIjoKICAgICAgICBjYXNlICLjgbLjgaDjgorjgYzjgo8iOgogICAgICAgIGNhc2UgIuW3puWBtCI6CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImZsb2F0OmxlZnQ7bWFyZ2luOjIwcHgiPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46MjBweDtmbG9hdDpsZWZ0O3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJSSUdIVCI6CiAgICAgICAgY2FzZSAiQVQgUklHSFQiOgogICAgICAgIGNhc2UgIk9OIFJJR0hUIjoKICAgICAgICBjYXNlICJPTiBUSEUgUklHSFQiOgogICAgICAgIGNhc2UgIlJJR0hUIE9GIjoKICAgICAgICBjYXNlICJUTyBUSEUgUklHSFQgT0YiOgogICAgICAgIGNhc2UgIk1JR0kiOgogICAgICAgIGNhc2UgIuOBv+OBjiI6CiAgICAgICAgY2FzZSAi5Y+zIjoKICAgICAgICBjYXNlICLjgb/jgY7jgYzjgo8iOgogICAgICAgIGNhc2UgIuWPs+WBtCI6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxpbWcgaWQ9IldLbHZsdXBJbWciIHN0eWxlPSJmbG9hdDpyaWdodDttYXJnaW46MjBweCI+IDwvaW1nPicrCiAgICAgICAgICAgICAgICAnPGRpdiBpZD0iV0tsdmx1cFR4dCIgc3R5bGU9Im1hcmdpbjoyMHB4O2Zsb2F0OnJpZ2h0O3RleHQtYWxpZ246Y2VudGVyO2xpbmUtaGVpZ2h0OjExMCU7Zm9udC1zaXplOjMwMCUiPiA8L2Rpdj4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgIH0KICAgIHQuc3R5bGUud2lkdGggPSAiMTIwMHB4IjsKICAgIHQuc3R5bGUubWFyZ2luID0gImF1dG8iOwoKICAgIG1zZy5hcHBlbmRDaGlsZCh0KTsKCgl2YXIgdGhpbmcxID0gZ2V0KCJXS2x2bHVwSW1nIik7CglpZiAodGhpbmcxICYmIHRoZUltZykgewoJCXRoaW5nMS5zcmMgPSB0aGVJbWc7Cgl9CgoJdmFyIHRoaW5nMiA9IGdldCgiV0tsdmx1cFR4dCIpOwoKCWlmICh0aGluZzIgJiYgdGhlVHh0KSB7CgkJaWYgKHRoZVR4dC5zdWJzdHJpbmcoMCwgOCkgPT0gIiUjVEVTVCUjIikgewoJCQkvLyBpbmRpY2F0ZXMgdGVzdCBtb2RlOyBzdHJpcCB0aGUgdGVzdCBmbGFnIG91dCBvZiB0aGUgdGV4dAoJCQl0aGVUeHQgPSB0aGVUeHQucmVwbGFjZSgiJSNURVNUJSMiLCAiIik7CgkJfQoJCQoJCXRoZVR4dCA9IHRoZVR4dC5yZXBsYWNlKC8jTEVWRUxOVU0jL2csIGN1ckxldmVsKTsgIC8vIHN1cHBvcnQgI0xFVkVMTlVNIyB2YXJpYWJsZSBpbiB0ZXh0IHN0cmluZ3MKCgkJdGhpbmcyLmlubmVySFRNTD0gdGhlVHh0OwoJfSAKCgljb25zb2xlLmxvZygnZGlzcGxheUxldmVsVXBNZXNzYWdlKCkgZW5kJyk7Cn0KCgpmdW5jdGlvbiBnZXROZXh0TWlsZXN0b25lKCBudW1UdXJ0bGVzICkgewoKCWNvbnNvbGUubG9nKCJnZXROZXh0TWlsZXN0b25lKCkiKTsKCgl2YXIgbWlsZXN0b25lcyA9IFsxLCAxMDAsIDI1MCwgNTAwLCA3NTAsIDEwMDAsIDE1MDAsIDIwMDAsIDI1MDAsIDMwMDAsIDQwMDAsIDUwMDAsIDYwMDAsIDcwMDAsIDgwMDAsIDkwMDAsIDEwMDAwLCA5OTk5OTldOwoJdmFyIGk9MDsKCgljb25zb2xlLmxvZygibnVtVHVydGxlcyA9ICIsIG51bVR1cnRsZXMpOwoKCXdoaWxlICggbWlsZXN0b25lc1tpXSA8PSBudW1UdXJ0bGVzICkgewoKCQlpKys7Cgl9Cgljb25zb2xlLmxvZygibmV4dCBtaWxlc3RvbmUgPSAiLCBtaWxlc3RvbmVzW2ldKTsKCXJldHVybiBtaWxlc3RvbmVzW2ldOwp9CgoKZnVuY3Rpb24gZ2V0VHVydGxlQ291bnRzKCkgewkvLyBjdW11bGF0aXZlIChlbmwgPSBlbmwgKyBidXIsIGV0Yy4pCgoJY29uc29sZS5sb2coImdldFR1cnRsZUNvdW50cygpIik7CgoJLy8gSSdtIGRvaW5nIHRoZSBzdHJpbmcgc3BsaXQoIiAiKSBhbmQgcmVwbGFjZSgpIHNvIHdlIHdpbGwgcGxheSBuaWNlbHkgd2l0aCBvbmUgb2YgbXkgb3RoZXIgc2NyaXB0cyBqdXN0IGluIGNhc2UgdGhlIG90aGVyIG9uZSBydW5zIGZpcnN0CgoJdmFyIGJzdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnVybmVkIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgZXN0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlbmxpZ2h0ZW5lZCIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIilbMF0uaW5uZXJIVE1MLnNwbGl0KCIgIilbMF0gfHwgIjAiOwoJdmFyIG1zdHIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFzdGVyIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgZ3N0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJndXJ1IikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7Cgl2YXIgYXN0ciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhcHByZW50aWNlIikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXS5pbm5lckhUTUwuc3BsaXQoIiAiKVswXSB8fCAiMCI7CgoJdmFyIHVwYXJyb3cgPSAi4oaRIjsKCXZhciBkb3duYXJyb3cgPSAi4oaTIjsKCglic3RyID0gYnN0ci5yZXBsYWNlKHVwYXJyb3csICIiKTsKCWVzdHIgPSBlc3RyLnJlcGxhY2UodXBhcnJvdywgIiIpOwoJbXN0ciA9IG1zdHIucmVwbGFjZSh1cGFycm93LCAiIik7Cglnc3RyID0gZ3N0ci5yZXBsYWNlKHVwYXJyb3csICIiKTsKCWFzdHIgPSBhc3RyLnJlcGxhY2UodXBhcnJvdywgIiIpOwoKCWJzdHIgPSBic3RyLnJlcGxhY2UoZG93bmFycm93LCAiIik7Cgllc3RyID0gZXN0ci5yZXBsYWNlKGRvd25hcnJvdywgIiIpOwoJbXN0ciA9IG1zdHIucmVwbGFjZShkb3duYXJyb3csICIiKTsKCWdzdHIgPSBnc3RyLnJlcGxhY2UoZG93bmFycm93LCAiIik7Cglhc3RyID0gYXN0ci5yZXBsYWNlKGRvd25hcnJvdywgIiIpOwoKCXZhciBidXJuZWQgPSBOdW1iZXIoIGJzdHIgKTsKCXZhciBlbmxpZ2h0ZW5lZCA9IE51bWJlciggZXN0ciApOwoJdmFyIG1hc3RlciA9IE51bWJlciggbXN0ciApOwoJdmFyIGd1cnUgPSBOdW1iZXIoIGdzdHIgKTsKCXZhciBhcHByZW50aWNlID0gTnVtYmVyKCBhc3RyICk7CgoJY29uc29sZS5sb2coInJhdyBjb3VudHM6ICIsIGFwcHJlbnRpY2UsIGd1cnUsIG1hc3RlciwgZW5saWdodGVuZWQsIGJ1cm5lZCk7CgoJZW5saWdodGVuZWQgKz0gYnVybmVkOwoJbWFzdGVyICs9IGVubGlnaHRlbmVkOwoJZ3VydSArPSBtYXN0ZXI7CglhcHByZW50aWNlICs9IGd1cnU7CgoJY29uc29sZS5sb2coImN1bXVsYXRpdmUgY291bnRzOiAiLCBhcHByZW50aWNlLCBndXJ1LCBtYXN0ZXIsIGVubGlnaHRlbmVkLCBidXJuZWQpOwoKCXJldHVybiBbYXBwcmVudGljZSwgZ3VydSwgbWFzdGVyLCBlbmxpZ2h0ZW5lZCwgYnVybmVkXTsKfQoKCgpmdW5jdGlvbiBpbml0ICgpIHsKCWNvbnNvbGUubG9nKCdpbml0KCkgc3RhcnQnKTsKCiAJdmFyIHRoZUltZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nVVJMIik7Cgl2YXIgdGhlVHh0ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBUZXh0Iik7Cgl2YXIgbmV4dE1pbGVzdG9uZXMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cE1pbGVzdG9uZXMiKTsKICAgIAogICAgICAJaWYgKCF0aGVJbWcpIHsKCQl0aGVJbWcgPSAiaHR0cHM6Ly9pLmltZ3VyLmNvbS9LNlVRTDFaLmdpZiI7CiAgICAgICAgCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwSW1nVVJMIiwgdGhlSW1nKTsKICAgICAgCX0KICAgICAgCiAgICAgIAlpZiAoIXRoZVR4dCkgewoJCXRoZVR4dCA9ICc8YnIvPllvdSBsZXZlbGVkIHVwITxici8+Q29uZ3JhdHVsYXRpb25zISc7CiAgICAgICAgCWxvY2FsU3RvcmFnZS5zZXRJdGVtKCJXS2x2bHVwVGV4dCIsIHRoZVR4dCk7CiAgICAgIAl9CgoJaWYgKCFuZXh0TWlsZXN0b25lcykgewoKCQlpbml0aWFsaXplTWlsZXN0b25lcygpOwoJCQoJfQoKCWNvbnNvbGUubG9nKCdpbml0KCkgZW5kJyk7Cn0KCgpmdW5jdGlvbiBpbml0aWFsaXplTWlsZXN0b25lcyAoKSB7CgoJY29uc29sZS5sb2coImluaXRpYWxpemVNaWxlc3RvbmVzKCkiKTsKCgl2YXIgdHVydGxlQ291bnRzID0gZ2V0VHVydGxlQ291bnRzKCk7CS8vIGN1bXVsYXRpdmUgKGVubCA9IGVubCArIGJ1ciwgZXRjLikKCXZhciBuZXh0TWlsZXN0b25lcyA9IG5ldyBBcnJheSgpOwoKCWZvciAodmFyIHg9MTsgeCA8IHR1cnRsZUNvdW50cy5sZW5ndGg7IHgrKykgewoKCQluZXh0TWlsZXN0b25lc1t4LTFdID0gZ2V0TmV4dE1pbGVzdG9uZSggdHVydGxlQ291bnRzW3hdICk7ICAvLyB0dXJ0bGVDb3VudHNbXSBpbmNsdWRlcyBBcHByZW50aWNlIGl0ZW1zLCBuZXh0TWlsZXN0b25lc1tdIGRvZXMgbm90Cgl9CgoJbG9jYWxTdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBNaWxlc3RvbmVzIiwgSlNPTi5zdHJpbmdpZnkobmV4dE1pbGVzdG9uZXMpKTsKfQoKCmZ1bmN0aW9uIGNoZWNrTWlsZXN0b25lcyggbGV2ZWwgKSB7CgoJY29uc29sZS5sb2coImNoZWNrTWlsZXN0b25lcygpIik7CgoJdmFyIG5leHRNaWxlc3RvbmVzID0gSlNPTi5wYXJzZSggbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBNaWxlc3RvbmVzIikgKTsKCXZhciB0dXJ0bGVDb3VudHMgPSBnZXRUdXJ0bGVDb3VudHMoKTsKCXZhciBhY2hpZXZlbWVudHMgPSBuZXcgQXJyYXkoKTsKCXZhciBnb3RPbmUgPSAwOwoJdmFyIHRlc3RBbGxEb25lID0gbnVsbDsgLy9zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwVGVzdEFsbEJ1cm5lZCIpOwoKCWNvbnNvbGUubG9nKCJuZXh0TWlsZXN0b25lczogIiwgSlNPTi5zdHJpbmdpZnkobmV4dE1pbGVzdG9uZXMpKTsKCglpZiAoIHRlc3RBbGxEb25lIHx8IChsZXZlbCA+PSA1MCAgJiYgKHR1cnRsZUNvdW50c1swXSA9PSB0dXJ0bGVDb3VudHNbNF0pKSkgewoKCQkvLyBhbHNvIGNoZWNrIHRoYXQgbGVzc29ucyA9PSAwIGFuZCByZXZpZXdzID09IDAKCgkJdmFyIHJ2d3MgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJyZXZpZXdzIilbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNwYW4iKVswXTsKCQl2YXIgbHNucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImxlc3NvbnMiKVswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic3BhbiIpWzBdOwoJCgkJaWYgKHRlc3RBbGxEb25lIHx8IChydndzID09IDAgJiYgbHNucyA9PSAwKSkgewoKCQkJY29uc29sZS5sb2coImFsbCB0dXJ0bGVzIGJ1cm5lZCEiKTsKCgkJCS8vIHNldCBmbGFnCgkJCXNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIldLbHZsdXBBbGxCdXJuZWQiLCAxKTsKCgkJCS8vIHJldHVybiBzb21lIG90aGVyd2lzZS1pbXBvc3NpYmxlIGFycmF5IHNvIHRoYXQgd2UnbGwgZ2V0IGludG8gZGlzcGxheU1pbGVzdG9uZXMoKQoJCQljb25zb2xlLmxvZygicmV0dXJuaW5nIFsxLDEsMSwxXSIpOwkKCQkJcmV0dXJuIFsxLCAxLCAxLCAxXTsKCQl9Cgl9CgoJZm9yICh2YXIgeD0wOyB4IDwgbmV4dE1pbGVzdG9uZXMubGVuZ3RoOyB4KyspIHsKCgkJaWYgKHR1cnRsZUNvdW50c1t4KzFdID49IG5leHRNaWxlc3RvbmVzW3hdKSB7IC8vIHR1cnRsZUNvdW50c1tdIGluY2x1ZGVzIEFwcHJlbnRpY2UgaXRlbXMsIG5leHRNaWxlc3RvbmVzW10gZG9lcyBub3QKCQkJCgkJCWFjaGlldmVtZW50c1t4XSA9IG5leHRNaWxlc3RvbmVzW3hdOwoJCQluZXh0TWlsZXN0b25lc1t4XSA9IGdldE5leHRNaWxlc3RvbmUoIHR1cnRsZUNvdW50c1t4KzFdICk7CgkJCWdvdE9uZSsrOwoKCQl9IGVsc2UgewoJCQlhY2hpZXZlbWVudHNbeF0gPSAwOwoJCX0KCX0KCgljb25zb2xlLmxvZygiYWNoaWV2ZW1lbnRzOiAiLCBKU09OLnN0cmluZ2lmeShhY2hpZXZlbWVudHMpKTsKCglpZiAoZ290T25lICE9IDApIHsKCgkJY29uc29sZS5sb2coImNoZWNrTWlsZXN0b25lcygpIHJldHVybmluZyBhY2hpZXZlbWVudHMiKTsKCQlsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiV0tsdmx1cE1pbGVzdG9uZXMiLCBKU09OLnN0cmluZ2lmeShuZXh0TWlsZXN0b25lcykpOwoJCXJldHVybiBhY2hpZXZlbWVudHM7CgoJfSBlbHNlIHsKCQljb25zb2xlLmxvZygiY2hlY2tNaWxlc3RvbmVzKCkgcmV0dXJuaW5nIG51bGwiKTsKCQlyZXR1cm4gbnVsbDsKCX0KfQoKCmZ1bmN0aW9uIGRpc3BsYXlNaWxlc3RvbmVzICggbWlsZXN0b25lcyApIHsKCgljb25zb2xlLmxvZygnZGlzcGxheU1pbGVzdG9uZXMoKSBzdGFydCcpOwoJdmFyIG1zZyA9IGdldCgic2VhcmNoIik7CiAgICAJdmFyIHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKIAl2YXIgdGhlSW1nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBJbWdVUkwiKTsKCXZhciB0aGVUeHQgPSAiPGJyLz4iOwoJdmFyIGxhYmVscyA9IFsiIEd1cnUgdHVydGxlISIsICIgTWFzdGVyIHR1cnRsZSEiLCAiIEVubGlnaHRlbmVkIHR1cnRsZSEiLCAiIEJ1cm5lZCB0dXJ0bGUhIl07CiAJdmFyIHRoZVBvcyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJXS2x2bHVwSW1nUG9zIikgfHwgIkxFRlQiOwoKICAgIHN3aXRjaCh0aGVQb3MudG9VcHBlckNhc2UoKSkgewoKICAgICAgICBjYXNlICJCRUxPVyI6CiAgICAgICAgY2FzZSAiVU5ERVIiOgogICAgICAgIGNhc2UgIlVOREVSTkVBVEgiOgogICAgICAgIGNhc2UgIkRPV04iOgogICAgICAgIGNhc2UgIkJPVFRPTSI6CiAgICAgICAgY2FzZSAi44GX44GfIjoKICAgICAgICBjYXNlICLkuIsiOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8ZGl2IGlkPSJXS2x2bHVwVHh0IiBzdHlsZT0ibWFyZ2luOmF1dG87dGV4dC1hbGlnbjpjZW50ZXI7bGluZS1oZWlnaHQ6MTEwJTtmb250LXNpemU6MzAwJSI+IDwvZGl2PicrCiAgICAgICAgICAgICAgICAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG8iPiA8L2ltZz4nKwogICAgICAgIAkJJzwvZGl2Pic7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICJBQk9WRSI6CiAgICAgICAgY2FzZSAiVE9QIjoKICAgICAgICBjYXNlICJVUCI6CiAgICAgICAgY2FzZSAiT1ZFUiI6CiAgICAgICAgY2FzZSAiT04gVE9QIE9GIjoKICAgICAgICBjYXNlICJDRU5URVIiOgogICAgICAgIGNhc2UgIkNFTlRFUkVEIjoKICAgICAgICBjYXNlICLjgYbjgYgiOgogICAgICAgIGNhc2UgIuS4iiI6CiAgICAgICAgY2FzZSAi44Gq44GLIjoKICAgICAgICBjYXNlICLkuK0iOgogICAgICAgIGNhc2UgIuOBoeOCheOBhuOBiuOBhiI6CiAgICAgICAgY2FzZSAi5Lit5aSuIjoKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSAnPGltZyBpZD0iV0tsdmx1cEltZyIgc3R5bGU9ImRpc3BsYXk6YmxvY2s7bWFyZ2luOmF1dG8iPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46YXV0bzt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAiTEVGVCI6CiAgICAgICAgY2FzZSAiQVQgTEVGVCI6CiAgICAgICAgY2FzZSAiT04gTEVGVCI6CiAgICAgICAgY2FzZSAiT04gVEhFIExFRlQiOgogICAgICAgIGNhc2UgIkxFRlQgT0YiOgogICAgICAgIGNhc2UgIlRPIFRIRSBMRUZUIE9GIjoKICAgICAgICBjYXNlICLjgbLjgaDjgooiOgogICAgICAgIGNhc2UgIuW3piI6CiAgICAgICAgY2FzZSAi44Gy44Gg44KK44GM44KPIjoKICAgICAgICBjYXNlICLlt6blgbQiOgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHQuaW5uZXJIVE1MID0gJzxpbWcgaWQ9IldLbHZsdXBJbWciIHN0eWxlPSJmbG9hdDpsZWZ0O21hcmdpbjoyMHB4Ij4gPC9pbWc+JysKICAgICAgICAgICAgICAgICc8ZGl2IGlkPSJXS2x2bHVwVHh0IiBzdHlsZT0ibWFyZ2luOjIwcHg7ZmxvYXQ6bGVmdDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAiUklHSFQiOgogICAgICAgIGNhc2UgIkFUIFJJR0hUIjoKICAgICAgICBjYXNlICJPTiBSSUdIVCI6CiAgICAgICAgY2FzZSAiT04gVEhFIFJJR0hUIjoKICAgICAgICBjYXNlICJSSUdIVCBPRiI6CiAgICAgICAgY2FzZSAiVE8gVEhFIFJJR0hUIE9GIjoKICAgICAgICBjYXNlICJNSUdJIjoKICAgICAgICBjYXNlICLjgb/jgY4iOgogICAgICAgIGNhc2UgIuWPsyI6CiAgICAgICAgY2FzZSAi44G/44GO44GM44KPIjoKICAgICAgICBjYXNlICLlj7PlgbQiOgogICAgICAgICAgICB0LmlubmVySFRNTCA9ICc8aW1nIGlkPSJXS2x2bHVwSW1nIiBzdHlsZT0iZmxvYXQ6cmlnaHQ7bWFyZ2luOjIwcHgiPiA8L2ltZz4nKwogICAgICAgICAgICAgICAgJzxkaXYgaWQ9IldLbHZsdXBUeHQiIHN0eWxlPSJtYXJnaW46MjBweDtmbG9hdDpyaWdodDt0ZXh0LWFsaWduOmNlbnRlcjtsaW5lLWhlaWdodDoxMTAlO2ZvbnQtc2l6ZTozMDAlIj4gPC9kaXY+JysKICAgICAgICAJCSc8L2Rpdj4nOwogICAgICAgICAgICBicmVhazsKCiAgICB9CgogICAgdC5zdHlsZS53aWR0aCA9ICIxMjAwcHgiOwogICAgdC5zdHlsZS5tYXJnaW4gPSAiYXV0byI7CgogICAgbXNnLmFwcGVuZENoaWxkKHQpOwoKCXZhciB0aGluZzEgPSBnZXQoIldLbHZsdXBJbWciKTsKCWlmICh0aGluZzEgJiYgdGhlSW1nKSB7CgkJdGhpbmcxLnNyYyA9IHRoZUltZzsKCX0KCgl2YXIgYWxsRG9uZVdLID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiV0tsdmx1cEFsbEJ1cm5lZCIpOwoJCglpZiAoYWxsRG9uZVdLICYmIGFsbERvbmVXSyA9PSAxKSB7CgoJCXRoZVR4dCArPSAiQUxMIFRVUlRMRVMgQlVSTkVEITxici8+V0FOSUtBTkkgQ09NUExFVEUhIjsKCQkvL3Nlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oIldLbHZsdXBUZXN0QWxsQnVybmVkIik7Cgl9IGVsc2UgewoKCQlmb3IgKHZhciB4ID0gbWlsZXN0b25lcy5sZW5ndGggLSAxOyB4ID49IDA7IHgtLSkgewoKCQkJaWYgKG1pbGVzdG9uZXNbeF0gPT0gMSkgewoKCQkJCXRoZVR4dCArPSAiRmlyc3QiICsgbGFiZWxzW3hdICsgIjxici8+IjsKCQkJfQoJCQllbHNlIGlmIChtaWxlc3RvbmVzW3hdICE9IDApIHsKCgkJCQl0aGVUeHQgKz0gbWlsZXN0b25lc1t4XSArICJ0aCIgKyBsYWJlbHNbeF0gKyAiPGJyLz4iOwoJCQl9CgkJfQoJfQoKICAgIHZhciBjdXN0b21CdXJuTGFiZWwgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiV0tCTFJCdXJuTGV2ZWxOYW1lIikgfHwgIkJ1cm5lZCI7CiAgICBpZiAoY3VzdG9tQnVybkxhYmVsICYmIChjdXN0b21CdXJuTGFiZWwgIT0gIkJ1cm5lZCIpKSB7CiAgICAgICAgdmFyIG5ld1RleHQgPSB0aGVUeHQucmVwbGFjZSgiQnVybmVkIiwgY3VzdG9tQnVybkxhYmVsKTsKICAgICAgICBpZiAobmV3VGV4dCA9PSB0aGVUeHQpIHsKICAgICAgICAgICAgdmFyIG5ld0NCTCA9IGN1c3RvbUJ1cm5MYWJlbC50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBuZXdUZXh0ID0gdGhlVHh0LnJlcGxhY2UoIkJVUk5FRCIsIG5ld0NCTCk7CiAgICAgICAgfQogICAgICAgIHRoZVR4dCA9IG5ld1RleHQ7CiAgICB9CgoJdmFyIHRoaW5nMiA9IGdldCgiV0tsdmx1cFR4dCIpOwoKCWlmICh0aGluZzIpIHsKCgkJdGhpbmcyLmlubmVySFRNTD0gdGhlVHh0OwoJfSAKCgljb25zb2xlLmxvZygnZGlzcGxheU1pbGVzdG9uZXMoKSBlbmQnKTsKfQoKCgpmdW5jdGlvbiBtYWluICgpIHsKCgl2YXIgY3VyTGV2ZWw7CgoJY29uc29sZS5sb2coIm1haW4oKSIpOwoKCWluaXQoKTsKCglHTXNldHVwKCk7CgoJY3VyTGV2ZWwgPSBjaGVja0xldmVsKCk7CgoJdmFyIGxhc3RLbm93bkxldmVsID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oIldLbHZsdXBQcmV2TGV2ZWwiKSB8fCAxOwoKCWlmIChjdXJMZXZlbCAhPSBsYXN0S25vd25MZXZlbCkgeyByZXR1cm47IH0KCglpZiAoc2hvdWxkRGlzcGxheSgpKSB7CgoJCXZhciBkdXJ0ZXh0ID0gZ2V0KCJXS2x2bGR1clR4dCIpOwoKCQlpZiAoZHVydGV4dCkgeyBkdXJ0ZXh0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZHVydGV4dCk7IH0gIC8vIG92ZXJyaWRlIFdLIExldmVsIER1cmF0aW9uIHNjcmlwdAoKCQlkaXNwbGF5TGV2ZWxVcE1lc3NhZ2UoIGN1ckxldmVsICk7CgoJfSBlbHNlIHsKCgkJdmFyIG1pbGVzdG9uZXMgPSBjaGVja01pbGVzdG9uZXMoIGN1ckxldmVsICk7CgoJCWlmIChtaWxlc3RvbmVzKSB7CgoJCQl2YXIgZHVydGV4dCA9IGdldCgiV0tsdmxkdXJUeHQiKTsKCgkJCWlmIChkdXJ0ZXh0KSB7IGR1cnRleHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkdXJ0ZXh0KTsgfSAgLy8gb3ZlcnJpZGUgV0sgTGV2ZWwgRHVyYXRpb24gc2NyaXB0CgoJCQlkaXNwbGF5TWlsZXN0b25lcyggbWlsZXN0b25lcyApOwoKCQl9IAoJfQp9Cgp3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIG1haW4sIGZhbHNlKTsKCmNvbnNvbGUubG9nKCdzY3JpcHQgbG9hZCBlbmQnKTsK" 383 + "uuid": "f56e4394-b554-42b3-b894-0263a9d2f095" 417 384 }, 418 385 { 386 + "enabled": false, 387 + "file_url": "https://greasyfork.org/scripts/26481-wanikani-katakana-madness/code/WaniKani%20Katakana%20Madness.user.js", 419 388 "name": "WaniKani Katakana Madness", 420 389 "options": { 390 + "awareOfChrome": false, 421 391 "check_for_updates": true, 422 392 "comment": null, 423 - "compatopts_for_requires": true, 424 - "compat_wrappedjsobject": false, 393 + "compat_arrayleft": false, 394 + "compat_foreach": false, 395 + "compat_forvarin": false, 425 396 "compat_metadata": false, 426 - "compat_foreach": false, 427 - "compat_arrayleft": false, 397 + "compat_powerful_this": null, 428 398 "compat_uW_gmonkey": false, 429 - "compat_forvarin": false, 399 + "compat_wrappedjsobject": false, 400 + "compatopts_for_requires": true, 430 401 "noframes": null, 431 - "awareOfChrome": false, 432 - "run_at": null, 433 402 "override": { 434 - "use_includes": [], 403 + "merge_connects": true, 404 + "merge_excludes": true, 405 + "merge_includes": true, 406 + "merge_matches": true, 407 + "orig_excludes": [], 435 408 "orig_includes": [ 436 409 "https://www.wanikani.com/*", 437 410 "http://www.wanikani.com/*" 438 411 ], 439 - "merge_includes": true, 440 - "use_matches": [], 441 412 "orig_matches": [], 442 - "merge_matches": true, 443 - "use_excludes": [], 444 - "orig_excludes": [], 445 - "merge_excludes": true, 413 + "orig_noframes": null, 414 + "orig_run_at": "document-end", 415 + "use_blockers": [], 446 416 "use_connects": [], 447 - "merge_connects": true, 448 - "use_blockers": [], 449 - "orig_run_at": "document-end", 450 - "orig_noframes": null 451 - } 417 + "use_excludes": [ 418 + "https://www.wanikani.com/lesson/*" 419 + ], 420 + "use_includes": [], 421 + "use_matches": [] 422 + }, 423 + "run_at": null, 424 + "tab_types": null 452 425 }, 426 + "position": 8, 427 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBXYW5pS2FuaSBLYXRha2FuYSBNYWRuZXNzCi8vIEBhdXRob3IgICAgICAgTHVrZS1GaWxld2Fsa2VyCi8vIEBuYW1lc3BhY2UgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9zY3JpcHRzLzI2NDgxLXdhbmlrYW5pLWthdGFrYW5hLW1hZG5lc3MKLy8gQGluY2x1ZGUgICAgICBodHRwczovL3d3dy53YW5pa2FuaS5jb20vKgovLyBAaW5jbHVkZSAgICAgIGh0dHA6Ly93d3cud2FuaWthbmkuY29tLyoKLy8gQHZlcnNpb24gICAgICAxLjAuOAovLyBAZGVzY3JpcHRpb24gIFRyYW5zZm9ybXMgZXZlcnl0aGluZyByZWxhdGVkIHRvIG9uJ3lvbWkgaW50byBrYXRha2FuYQovLyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LWVuZAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gQGxpY2Vuc2UgICAgICBHUEwgdjMuMAovLyA9PS9Vc2VyU2NyaXB0PT0KCi8qCiogS2FuamkgaW1wb3J0YW50IHJlYWRpbmcgKDE6IG9ueW9taSwgMDoga3VueW9taSkKKiBTYXZlZCBsb2NhbHksIHRvIHVwZGF0ZSBlbnRlciBhcGlLZXkgYW5kIHVzZSBmdW5jdGlvbiBvbiB0aGUgYm90dG9tIG9mIHRoZSBzY3JpcHQKKi8KdmFyIGFwaUtleSA9ICJrZXkiOwp2YXIga2FuamlZb21pUExFQVNBTlQgPSB7IuS4gCI6MSwi5LqMIjoxLCLkuZ0iOjEsIuS4gyI6MSwi5Lq6IjoxLCLlhaUiOjEsIuWFqyI6MSwi5YqbIjoxLCLljYEiOjEsIuS4iSI6MSwi5LiKIjoxLCLkuIsiOjEsIuWPoyI6MSwi5aSnIjoxLCLlpbMiOjEsIuWxsSI6MSwi5bedIjowLCLlt6UiOjEsIuWIgCI6MSwi5ZyfIjoxLCLljYMiOjEsIuWklSI6MCwi5a2QIjoxLCLlsI8iOjEsIuS4gSI6MSwi5LqGIjoxLCLlj4giOjAsIuS4uCI6MCwi5omNIjoxLCLkuK0iOjEsIuS6lCI6MSwi5YWtIjoxLCLlhoYiOjEsIuWkqSI6MSwi5omLIjowLCLmlociOjEsIuaXpSI6MSwi5pyIIjoxLCLmnKgiOjEsIuawtCI6MSwi54GrIjoxLCLniqwiOjAsIueOiyI6MSwi5Ye6IjoxLCLlm5siOjEsIuWPsyI6MSwi5bemIjoxLCLmnKwiOjEsIuatoyI6MSwi55SwIjowLCLnjokiOjAsIueZvSI6MSwi55uuIjowLCLnq4siOjEsIuOAhSI6MCwi5rC3IjowLCLomasiOjAsIuefsyI6MSwi5LiWIjoxLCLkuLsiOjEsIuS7liI6MSwi5LujIjoxLCLlhpkiOjEsIuWOuyI6MSwi5Y+3IjoxLCLlubMiOjEsIuaJkyI6MSwi55SzIjowLCLnmr8iOjAsIuekvCI6MSwi5LyRIjoxLCLlhYgiOjEsIuWQjSI6MSwi5a2XIjoxLCLlubQiOjEsIuaXqSI6MSwi5rCXIjoxLCLnmb4iOjEsIueruSI6MCwi57O4IjowLCLmnZEiOjAsIuiAsyI6MCwi55S3IjoxLCLnlLoiOjEsIuiKsSI6MCwi6KaLIjowLCLosp0iOjAsIui1pCI6MCwi6LazIjoxLCLou4oiOjEsIuS4jSI6MSwi5LuVIjoxLCLlrp0iOjEsIuWkriI6MSwi5LqhIjoxLCLljJYiOjEsIuS4oSI6MSwi5ZywIjoxLCLlhagiOjEsIuWQkSI6MSwi5a6JIjoxLCLlt54iOjEsIuaciSI6MSwi5puyIjoxLCLmrKEiOjEsIuatuyI6MSwi576KIjoxLCLooYAiOjEsIuS6rCI6MSwi5Zu9IjoxLCLlpJwiOjEsIuWmuSI6MSwi5aeJIjoxLCLlupciOjEsIuaYjiI6MSwi5p2xIjoxLCLmrakiOjEsIueUuyI6MSwi55u0IjoxLCLnn6UiOjEsIumVtyI6MSwi5YmNIjoxLCLljZciOjEsIuWupCI6MSwi5b6MIjoxLCLmgJ0iOjEsIuaYnyI6MSwi5rW3IjoxLCLmtLsiOjEsIuenkSI6MSwi54K5IjoxLCLojLYiOjEsIumjnyI6MSwi6aaWIjowLCLnp4EiOjEsIum7hCI6MCwi6buSIjoxLCLmrKAiOjEsIuawjyI6MSwi55SxIjoxLCLmnK0iOjEsIuawkSI6MSwi6L66IjoxLCLku5giOjAsIuS7pSI6MSwi5aSxIjoxLCLlv4UiOjEsIuacqiI6MSwi5pyrIjoxLCLmoKEiOjEsIuWkjyI6MCwi5a62IjoxLCLlvLEiOjEsIuaZgiI6MSwi57SZIjowLCLoqJgiOjEsIumrmCI6MSwi6YCaIjoxLCLlvLciOjEsIuaVmSI6MSwi55CGIjoxLCLntYQiOjEsIuiIuSI6MSwi6YCxIjoxLCLpm6oiOjAsIumtmiI6MSwi6bOlIjoxLCLpoqgiOjEsIumdkiI6MSwi6IKJIjoxLCLnsbMiOjEsIuWFhCI6MSwi55quIjoxLCLkuqQiOjEsIuS8miI6MSwi5YWJIjoxLCLlkIwiOjEsIuWbniI6MSwi5aSaIjoxLCLlvZMiOjEsIuavjiI6MSwi5769IjowLCLogIMiOjEsIuiHqiI6MSwi6ImyIjowLCLooYwiOjEsIuilvyI6MSwi5L2VIjowLCLkvZMiOjEsIuS9nCI6MSwi5ZuzIjoxLCLlo7AiOjAsIuW8nyI6MSwi5b2iIjoxLCLmnaUiOjEsIuekviI6MSwi6KeSIjoxLCLoqIAiOjEsIui1sCI6MSwi6LC3IjowLCLov5EiOjEsIumHjCI6MCwi6bqmIjowLCLlraYiOjEsIuaelyI6MCwi56m6IjoxLCLph5EiOjEsIumbqCI6MCwi6I2JIjowLCLpn7MiOjEsIuaxoCI6MSwi5Y+NIjoxLCLmlK8iOjEsIuS9jyI6MSwi5YqpIjoxLCLlkJsiOjEsIuWMuyI6MSwi5a++IjoxLCLlsYAiOjEsIuaKlSI6MSwi5b25IjoxLCLmsboiOjEsIueptiI6MSwi6LqrIjoxLCLogIUiOjEsIueglCI6MSwi5aC0IjoxLCLmnJ0iOjAsIueVqiI6MSwi562UIjowLCLntbUiOjEsIuiytyI6MCwi6YGTIjoxLCLplpMiOjEsIumbsiI6MCwi5pWwIjoxLCLoqbEiOjEsIualvSI6MSwi5omAIjoxLCLmo64iOjAsIumbuyI6MSwi6aasIjoxLCLkuIciOjEsIuS7iiI6MSwi5YWDIjoxLCLlhawiOjEsIuWGhSI6MSwi5YiGIjoxLCLliIciOjEsIuWPiyI6MSwi5Y2IIjoxLCLlpKoiOjEsIuWwkSI6MSwi5byVIjowLCLlv4MiOjEsIuaIuCI6MCwi5pa5IjoxLCLniZsiOjEsIueItiI6MCwi5q+bIjoxLCLlhqwiOjAsIuWMlyI6MSwi5Y2KIjoxLCLlj6QiOjEsIuWPsCI6MSwi5aSWIjoxLCLluIIiOjEsIuW6gyI6MCwi5q+NIjowLCLnlKgiOjEsIuefoiI6MCwi55SfIjoxLCLmraIiOjEsIuiQvSI6MSwi6IGeIjoxLCLmqKoiOjAsIumAsiI6MSwi6LuiIjoxLCLovrIiOjEsIumJhCI6MSwi6JGJIjowLCLmnIAiOjEsIue1giI6MSwi57+SIjoxLCLmrYwiOjEsIuiqniI6MSwi6KqtIjowLCLps7QiOjAsIue3miI6MSwi6ZuGIjoxLCLpo7IiOjAsIualrSI6MSwi5ryiIjoxLCLlp4siOjEsIui1tyI6MCwi6YCfIjoxLCLphY0iOjEsIumFkiI6MSwi6ZmiIjoxLCLot68iOjEsIui7vSI6MCwi6YGLIjoxLCLplosiOjEsIueulyI6MSwi6aCtIjowLCLoqr8iOjEsIuimqiI6MSwi6aGUIjowLCLnl4UiOjEsIuaxgiI6MSwi5pawIjoxLCLov5QiOjEsIuWumiI6MSwi5aOyIjoxLCLkuosiOjEsIuS9vyI6MSwi5YW3IjoxLCLlj5ciOjEsIuWSjCI6MSwi5a6fIjoxLCLmnI0iOjEsIuazsyI6MCwi54mpIjoxLCLoi6YiOjEsIuihqCI6MSwi6YOoIjoxLCLkuZciOjAsIuWuoiI6MSwi5bGLIjowLCLluqYiOjEsIueVjCI6MSwi5oyBIjoxLCLnmboiOjEsIuebuCI6MSwi55yMIjoxLCLnvo4iOjEsIuiyoCI6MSwi6YCBIjoxLCLph40iOjEsIuirhyI6MSwi6KaBIjoxLCLli50iOjEsIuS7riI6MSwi5LqIIjoxLCLkv50iOjEsIuippiI6MSwi6aiTIjoxfTsKdmFyIGthbmppWW9taVBBSU5GVUwgPSB7IuW7uiI6MSwi54yrIjowLCLlj7giOjEsIuWkqyI6MSwi6aOvIjoxLCLli4ciOjEsIuWNmCI6MSwi5a+6IjowLCLlsqkiOjAsIuaZtCI6MCwi56eLIjowLCLluLAiOjAsIuaYpSI6MCwi5pi8IjowLCLoqIgiOjEsIuWIlyI6MSwi5Yy6IjoxLCLlnYIiOjAsIuS/oSI6MSwi5byPIjoxLCLlpIkiOjEsIuaYqCI6MSwi5q+SIjoxLCLms5UiOjEsIuazoyI6MCwi5rWFIjowLCLoi7EiOjEsIue0gCI6MSwi6LuNIjoxLCLnr4kiOjEsIuS7jyI6MSwi5pmpIjoxLCLkuIgiOjEsIumKgCI6MSwi6KydIjoxLCLnhLYiOjEsIumkiiI6MSwi5oSfIjoxLCLmqYsiOjAsIuipqSI6MSwi6aGMIjoxLCLlrr8iOjEsIumhmCI6MSwi6aeFIjoxLCLlmagiOjEsIuWjqyI6MSwi6KqyIjoxLCLllY8iOjEsIuaVtCI6MSwi5pqXIjoxLCLmp5giOjAsIuemjyI6MSwi57eRIjowLCLnt7QiOjEsIumkqCI6MSwi5YSEIjoxLCLmlpkiOjEsIuaomSI6MSwi5q66IjoxLCLnhrEiOjEsIuizniI6MSwi6YG4IjoxLCLovKoiOjEsIumPoSI6MCwi5oOFIjoxLCLmmKAiOjEsIueWkSI6MSwi55qGIjowLCLmg7MiOjEsIuWDjyI6MSwi5bmyIjoxLCLpnZ4iOjEsIueEoSI6MSwi5pivIjoxLCLntZAiOjEsIue0sCI6MSwi5oKyIjoxLCLolqwiOjEsIuWOnyI6MSwi6by7IjowLCLlgbQiOjAsIuWFtSI6MSwi5aCCIjoxLCLloakiOjAsIuW4rSI6MSwi5pWXIjoxLCLmooUiOjAsIuWboCI6MSwi5bi4IjoxLCLorZgiOjEsIua4iSI6MSwi6JmaIjoxLCLlrpgiOjEsIuWvnyI6MSwi5bqVIjowLCLmhJsiOjEsIue9siI6MSwi6K2mIjoxLCLmgYsiOjEsIuimmiI6MSwi6KqsIjoxLCLlubsiOjEsIuipsyI6MSwi5YqHIjoxLCLllpwiOjEsIuaenCI6MSwi5qCEIjoxLCLoiIwiOjAsIue2miI6MSwi5YqgIjoxLCLnr4AiOjEsIua4myI6MSwi6aCGIjoxLCLlrrkiOjEsIuW4gyI6MSwi5piTIjoxLCLoi6UiOjAsIuiyoSI6MSwi6KmeIjoxLCLmmIYiOjEsIumWpSI6MSwi5q20IjoxLCLlhooiOjEsIuWuhyI6MSwi5a6ZIjoxLCLlv5kiOjEsIuWxpSI6MSwi5ZujIjoxLCLmmrQiOjEsIua3tyI6MSwi5LmxIjoxLCLlvpIiOjEsIuW+lyI6MSwi5pS5IjoxLCLpgKMiOjEsIuWWhCI6MSwi57WhIjoxLCLmr5QiOjEsIuWPsiI6MSwi56ybIjoxLCLoirgiOjEsIuauiyI6MSwi5Y2SIjoxLCLlrowiOjEsIuW/tSI6MSwi5pybIjoxLCLmoLwiOjEsIuiDvSI6MSwi5aalIjoxLCLmnZ8iOjEsIumbsCI6MSwi5p2+IjowLCLkvosiOjEsIuWNlCI6MSwi5Y+CIjoxLCLlkagiOjEsIuWbuiI6MSwi5ZuyIjoxLCLlraMiOjEsIuW4jCI6MSwi5oqYIjoxLCLmnZAiOjEsIue0hCI6MSwi55qEIjoxLCLln7oiOjEsIuaApyI6MSwi5oqAIjoxLCLooZMiOjEsIumqqCI6MSwi6aCRIjoxLCLoqLwiOjEsIumBoCI6MSwi5ZOBIjoxLCLnrJEiOjAsIueVmSI6MSwi5ZySIjoxLCLmm5wiOjEsIuabuCI6MSwi6ZaAIjoxLCLlj5YiOjEsIuS/giI6MSwi5YW4IjoxLCLlrogiOjEsIuW5uCI6MSwi5oClIjoxLCLnnJ8iOjEsIueusSI6MCwi6I23IjowLCLpnaIiOjEsIuW6nCI6MSwi5rK7IjoxLCLmtbQiOjEsIui+niI6MSwi6ZaiIjoxLCLmlL8iOjEsIuW8gSI6MSwi6Zm6IjoxLCLljbEiOjEsIuWtmCI6MSwi5bCCIjoxLCLlhpIiOjEsIuWGlyI6MSwi6ZiqIjoxLCLlk6EiOjEsIumajiI6MSwi5YuJIjoxLCLnrKwiOjEsIumDvSI6MSwi5b6FIjoxLCLmt7EiOjEsIuerpSI6MSwi5bqtIjoxLCLml4UiOjEsIuaguSI6MSwi5rWBIjoxLCLmtogiOjEsIuWAjSI6MSwi5bO2IjowLCLnpa0iOjEsIueroCI6MSwi5YuVIjoxLCLllYYiOjEsIuaCqiI6MSwi5pePIjoxLCLnkIMiOjEsIumZvSI6MSwi5a+SIjowLCLmmpEiOjAsIuacnyI6MSwi5qSNIjoxLCLmra8iOjAsIua4qSI6MSwi5rivIjoxLCLmua8iOjAsIueZuyI6MSwi552AIjoxLCLph44iOjEsIuefrSI6MSwi5rOJIjoxLCLlkIgiOjEsIuaBryI6MSwi5YOVIjoxLCLoqJMiOjEsIuW8kyI6MSwi5ZGKIjoxLCLnqK4iOjEsIumBlCI6MSwi6aGeIjoxLCLloLEiOjEsIuetiSI6MSwi56WIIjoxLCLmsb0iOjEsIuWAnyI6MSwi54S8IjowLCLlv5giOjEsIuW6pyI6MSwi5rSXIjoxLCLog7giOjAsIuWDpyI6MSwi6ISzIjoxLCLnpoUiOjEsIuWPryI6MSwi6KixIjoxLCLmnpoiOjEsIuWPpSI6MSwi6Z2ZIjoxLCLnpoEiOjEsIuWWqyI6MSwi54WZIjoxLCLlpKIiOjEsIueBvSI6MSwi55SjIjoxLCLnqbQiOjAsIuWbsCI6MSwi5qmfIjoxLCLlrrMiOjEsIueOhyI6MSwi6aObIjoxLCLkvZkiOjEsIumboyI6MSwi5aaoIjoxLCLooqsiOjEsIuijlSI6MSwi5bC7IjowLCLpnIciOjEsIuWwviI6MSwi5qKwIjoxLCLnoroiOjEsIuWrjCI6MSwi5YCLIjoxLCLlnKciOjEsIuWcqCI6MSwi5YCSIjoxLCLoh60iOjAsIuWOmiI6MCwi5aa7IjoxLCLorbAiOjEsIueKryI6MSwi572qIjoxLCLpmLIiOjEsIuirliI6MSwi57WMIjoxLCLmiJAiOjEsIuWRsyI6MSwi5L2OIjoxLCLmi74iOjAsIuS8nSI6MSwi6ICBIjoxLCLkvY0iOjEsIuWIqSI6MSwi5YqqIjoxLCLnibkiOjEsIuaUviI6MSwi5LqJIjoxLCLku7IiOjAsIuWFsSI6MSwi5aW9IjoxLCLliJ0iOjEsIuWIpSI6MSwi5Yq0IjoxLCLlkb0iOjEsIuWyuCI6MSwi5piUIjowLCLms6IiOjEsIuazqCI6MSwi6IKyIjoxLCLmjIciOjEsIua0iyI6MSwi56WeIjoxLCLmiKYiOjEsIuenkiI6MSwi57SaIjoxLCLov70iOjAsIuertiI6MSwi6ImvIjoxLCLlip8iOjEsIuS+vyI6MSwi5LukIjoxLCLlg40iOjEsIuaEjyI6MX07CnZhciBrYW5qaVlvbWlERUFUSCA9IHsi5bGFIjoxLCLoo5wiOjEsIumuriI6MSwi6ZmQIjoxLCLkuI4iOjEsIuWQqyI6MSwi5b2xIjoxLCLms4EiOjEsIua4oSI6MCwi6Z+/IjoxLCLnpagiOjEsIuaZryI6MSwi5oqcIjowLCLoqLQiOjEsIuionyI6MSwi6YCuIjoxLCLlgJkiOjEsIuaniyI6MSwi5qihIjoxLCLmjZUiOjEsIuWKuSI6MSwi5bGeIjoxLCLmhaMiOjEsIuixiiI6MSwi5rqAIjoxLCLogqUiOjEsIuW3uyI6MSwi5o2cIjoxLCLntZ4iOjEsIumaoCI6MSwi6LypIjoxLCLmjpsiOjAsIuabvyI6MCwi576pIjoxLCLmlbUiOjEsIua4iCI6MSwi5aeUIjoxLCLmjJkiOjEsIuWItiI6MSwi5YikIjoxLCLli5kiOjEsIuafuyI6MSwi57ePIjoxLCLoqK0iOjEsIuizhyI6MSwi5qipIjoxLCLku7YiOjEsIua0viI6MSwi5bKhIjowLCLntKAiOjEsIuaWrSI6MSwi6KmVIjoxLCLku7siOjEsIuaJuSI6MSwi5qScIjoxLCLlr6kiOjEsIuadoSI6MSwi6LKsIjoxLCLnnIEiOjEsIueojiI6MSwi5aKXIjoxLCLop6MiOjEsIumamyI6MSwi6KqNIjoxLCLkvIEiOjEsIumsvCI6MSwi6Z2pIjoxLCLkv7MiOjEsIuijgSI6MSwi5ZG8IjowLCLlj44iOjEsIuWBnCI6MSwi6IG3IjoxLCLopo8iOjEsIuittyI6MSwi5YmyIjowLCLltI4iOjAsIua8lCI6MSwi5b6LIjoxLCLluKsiOjEsIueciyI6MSwi5rqWIjoxLCLliYciOjEsIuWwjiI6MSwi5YKZIjoxLCLlubkiOjEsIuW8tSI6MSwi5YSqIjoxLCLmsqIiOjEsIuWuhSI6MSwi5pa9IjoxLCLotIUiOjEsIuePviI6MSwi5LmzIjoxLCLln44iOjAsIuengCI6MSwi5oKpIjowLCLmmociOjEsIuiDgyI6MSwi6YOOIjoxLCLmi5siOjEsIuautSI6MSwi6IW5IjoxLCLnl5siOjEsIumAgCI6MSwi5bGIIjoxLCLnuZQiOjEsIuiyuCI6MCwi6L+3IjoxLCLmg5EiOjEsIuiqmCI6MSwi5bCxIjoxLCLnl4ciOjEsIuioqiI6MSwi5oCSIjoxLCLmmIciOjEsIuecoCI6MSwi552hIjoxLCLnt6AiOjEsIui/qyI6MSwi6Z20IjowLCLmv4MiOjEsIuerryI6MSwi5qW1IjoxLCLlgaUiOjEsIumAlCI6MSwi5bq3IjoxLCLntaYiOjEsIumbhCI6MSwi5aiYIjowLCLkub4iOjEsIueboyI6MSwi5p2vIjoxLCLlgqwiOjEsIuS/gyI6MSwi5qynIjoxLCLmsZ8iOjAsIuiriyI6MSwi6Z+TIjoxLCLlo4oiOjEsIuiouiI6MSwi6ZajIjoxLCLlg5oiOjEsIuepjSI6MSwi552jIjoxLCLnlaUiOjEsIuiHoyI6MSwi6IiqIjoxLCLlr4QiOjEsIuadvyI6MSwi6KGXIjoxLCLlrpciOjEsIue3iiI6MSwi5a60IjoxLCLmgZAiOjEsIuaAliI6MSwi5re7IjoxLCLnjJsiOjEsIueDiCI6MSwi57SiIjoxLCLoqbAiOjAsIuelnSI6MSwi5ouFIjoxLCLpoY0iOjEsIuijvSI6MSwi54eDIjoxLCLpgZUiOjAsIui8uCI6MSwi5bGKIjowLCLni60iOjAsIuiCqSI6MCwi6IWVIjowLCLohbAiOjAsIuinpiI6MSwi6KaWIjoxLCLovIkiOjEsIuWxpCI6MSwi5Z6LIjoxLCLluoEiOjEsIuW3riI6MSwi5q2mIjoxLCLnrqEiOjEsIuixoSI6MSwi6YePIjoxLCLlooMiOjEsIueSsCI6MSwi6LOqIjoxLCLov7AiOjEsIuS+myI6MSwi5bGVIjoxLCLosqkiOjEsIuagqiI6MCwi6LOAIjoxLCLlkIQiOjEsIuiqlSI6MSwi572wIjoxLCLohLEiOjEsIumBjiI6MSwi5Z2KIjoxLCLlr50iOjAsIuWuriI6MCwi5qGIIjoxLCLnva4iOjEsIuS+oSI6MSwi6LK7IjoxLCLli6IiOjEsIuWWtiI6MSwi56S6IjoxLCLntbEiOjEsIumgmCI6MSwi562WIjoxLCLol6QiOjAsIuWJryI6MSwi6KazIjoxLCLlgKQiOjEsIuWQuCI6MSwi5ae/IjoxLCLln58iOjEsIuW/nCI6MSwi5o+QIjoxLCLmj7QiOjEsIueKtiI6MSwi5oWLIjoxLCLpgKAiOjEsIuaOiCI6MSwi5Y2wIjoxLCLlibUiOjEsIuW+gCI6MSwi5b6pIjoxLCLovIMiOjEsIuethiI6MSwi6YmbIjoxLCLosq8iOjEsIuaIkSI6MSwi5pWFIjoxLCLpmpwiOjEsIuW+kyI6MSwi5r+AIjoxLCLliLoiOjEsIuWKsSI6MSwi6KiOIjoxLCLpg7UiOjEsIumHnSI6MSwi5b60IjoxLCLmgKoiOjEsIueNoyI6MSwi56qBIjoxLCLoj5MiOjEsIuaysyI6MSwi5rGXIjowLCLmjK8iOjEsIuixmiI6MCwi5YaNIjoxLCLmjqUiOjEsIueLrCI6MSwi5Y2gIjoxLCLlt6giOjEsIuWmmSI6MSwi6bqXIjoxLCLkuKYiOjEsIuWGtyI6MSwi5YemIjoxLCLpgIYiOjEsIuW6qyI6MSwi5YWQIjoxLCLlh40iOjEsIuW5vCI6MSwi56iaIjoxLCLljZoiOjEsIuWlhyI6MSwi5riFIjoxLCLmvZQiOjEsIumMsiI6MSwi5L+uIjoxLCLpmooiOjEsIuWIuCI6MSwi5ammIjoxLCLlvq4iOjEsIuebiiI6MSwi56e7IjoxLCLnsr4iOjEsIueoiyI6MSwi57W2IjoxLCLmhrIiOjEsIuihhiI6MSwi5YKYIjowLCLmtZwiOjAsIuaSgyI6MSwi5pS7IjoxLCLntroiOjEsIumthSI6MSwi57O7IjoxLCLmuIciOjAsIuWpmiI6MSwi6YGKIjoxLCLml5ciOjEsIueFpyI6MSwi5b+rIjoxLCLniYgiOjEsIuiypyI6MSwi5LmPIjoxLCLpgakiOjEsIumgkCI6MSwi5bu2IjoxLCLnv4wiOjEsIuimpyI6MSwi5oeQIjowLCLmirwiOjAsIuabtCI6MSwi5rWuIjowLCLmnpUiOjAsIua8jyI6MSwi56ymIjoxLCLos7wiOjEsIui2iiI6MSwi6aO+IjoxLCLpqJIiOjEsIuiDjCI6MSwi5pKuIjoxLCLnm5ciOjF9Owp2YXIga2FuamlZb21pSEVMTCA9IHsi6b2iIjoxLCLpnIAiOjEsIuWunCI6MCwi57mwIjowLCLpgb8iOjEsIuWmiiI6MSwi5aigIjoxLCLoh7QiOjEsIuWIiiI6MSwi5aWPIjoxLCLkvLQiOjEsIuS9tSI6MSwi5YK+IjoxLCLljbQiOjEsIuWlpSI6MCwi5oWuIjoxLCLmh7giOjEsIuaIvyI6MSwi5omxIjowLCLmipEiOjEsIuaKniI6MSwi5o+PIjoxLCLnm6QiOjEsIue3kiI6MSwi56ewIjoxLCLnt6kiOjAsIuiolyI6MSwi6LOEIjoxLCLos4IiOjEsIui0iCI6MSwi6YCDIjoxLCLpgoQiOjEsIuaLkiI6MSwi6Yi0IjoxLCLpgqYiOjEsIumYnCI6MSwi5bKQIjoxLCLpm4ciOjEsIumahiI6MSwi5o6nIjowLCLlo4EiOjAsIuajiyI6MSwi5riLIjoxLCLnvqQiOjEsIueJhyI6MCwi5LuZIjoxLCLlhYUiOjEsIuWFjSI6MSwi5YunIjoxLCLlnI8iOjEsIuWfiyI6MCwi5Z+8IjowLCLlpaoiOjAsIuW+oSI6MSwi5oWOIjoxLCLnlLIiOjEsIuaeoCI6MCwi5paQIjoxLCLnpYkiOjEsIueosiI6MCwi6KyZIjoxLCLorbIiOjEsIui6jSI6MSwi6YqDIjoxLCLpi7wiOjEsIumghSI6MSwi5aCAIjowLCLpmqMiOjEsIumhpyI6MSwi6aeQIjoxLCLpp4YiOjAsIuWUsSI6MSwi5p+xIjoxLCLlrZ0iOjEsIuS/iiI6MSwi5YW8IjoxLCLlkLkiOjAsIuWJpCI6MSwi5behIjoxLCLmiJIiOjEsIuaOkiI6MSwi5pC6IjoxLCLpi60iOjEsIuaVjyI6MSwi5pW3IjowLCLmrr8iOjEsIueKoCI6MSwi542yIjoxLCLojIIiOjEsIumbhSI6MSwi6aC7IjoxLCLnuYEiOjEsIuauliI6MSwi6KGdIjoxLCLoloQiOjEsIuiqiSI6MSwi6KSSIjoxLCLpgI8iOjEsIuWtqyI6MSwi5a+MIjoxLCLono0iOjEsIumboiI6MSwi57eoIjoxLCLoj68iOjEsIuaXoiI6MSwi5pmuIjoxLCLosaoiOjEsIumRkSI6MSwi6ZmkIjoxLCLlsIsiOjEsIuW5viI6MCwi5buKIjoxLCLmjoMiOjEsIuazpSI6MSwi6amaIjoxLCLmo5IiOjEsIuWYhiI6MSwi5YCJIjoxLCLlt6MiOjAsIuaVkSI6MSwi5bivIjoxLCLlvoQiOjEsIuaVoyI6MSwi57KJIjoxLCLohIgiOjEsIuiPnCI6MSwi6LKoIjoxLCLpmbgiOjEsIuS8vCI6MSwi5aKTIjoxLCLlnYciOjEsIuW+syI6MSwi5o6iIjoxLCLlgbUiOjEsIueUmCI6MCwi5bCGIjoxLCLml6ciOjEsIuWnkyI6MSwi6LK/IjoxLCLnm58iOjEsIumBuiI6MSwi5YK1IjoxLCLkvLgiOjAsIuWPiiI6MSwi5aWIIjoxLCLluYUiOjAsIuW7gyI6MSwi5o+bIjoxLCLmkZgiOjEsIuaguCI6MSwi57iEIjoxLCLmspYiOjAsIua0pSI6MCwi54yuIjoxLCLnmYIiOjEsIue2mSI6MSwi57atIjoxLCLkvI4iOjEsIuiIniI6MSwi6LiPIjoxLCLoiKwiOjEsIumgvCI6MSwi5L6dIjoxLCLoq74iOjEsIum5vyI6MCwi54mZIjoxLCLotoUiOjEsIuWFhiI6MSwi5oqxIjowLCLot6EiOjEsIuaIuyI6MCwi6LezIjoxLCLmmK0iOjEsIua8gSI6MSwi5YSfIjoxLCLli58iOjEsIuWIkSI6MSwi5Z+3IjoxLCLloYEiOjEsIuW0qSI6MSwi5oKjIjoxLCLmipciOjEsIuaKtSI6MSwi5pesIjoxLCLniIYiOjEsIua5viI6MSwi5by+IjoxLCLogbQiOjEsIumBoyI6MSwi6ZeYIjoxLCLpppkiOjEsIumZoyI6MSwi6IeoIjoxLCLliYoiOjEsIuWlkSI6MSwi5o6yIjoxLCLni5kiOjEsIuiRrCI6MSwi5oG1IjoxLCLolLUiOjEsIuewoSI6MSwi6ZaJIjoxLCLoqowiOjEsIueqkyI6MCwi5ZCmIjoxLCLnrYsiOjEsIuWegiI6MSwi5a6jIjoxLCLlsIoiOjEsIuW/oCI6MSwi5ouhIjoxLCLmk40iOjEsIuaVrCI6MSwi54GwIjowLCLnhp8iOjEsIueVsCI6MSwi55qHIjoxLCLnm5siOjEsIueggiI6MSwi5rygIjoxLCLns5YiOjEsIue0jSI6MSwi6IK6IjoxLCLokZciOjEsIuiSuCI6MSwi6KOFIjoxLCLoo48iOjAsIuiruCI6MSwi6LODIjoxLCLmmq4iOjEsIumGpCI6MSwi54KOIjoxLCLnoLQiOjEsIuadiSI6MCwi54aKIjowLCLphaIiOjAsIueNhCI6MSwi6YqFIjoxLCLpgYUiOjEsIua4rCI6MSwi5b2rIjoxLCLoiI4iOjEsIuismyI6MSwi5rueIjoxLCLku4siOjEsIue0uSI6MSwi5bexIjoxLCLljoQiOjEsIuS6gCI6MCwi5LqSIjoxLCLliaMiOjEsIuW9vCI6MCwi5a+/IjoxLCLmgaUiOjAsIuaxgSI6MSwi5ZmMIjoxLCLngroiOjEsIumFlCI6MSwi6Y2LIjowLCLmuZYiOjEsIuaJlSI6MCwi5rK5IjoxLCLkuYUiOjEsIuWNtSI6MCwi6L68IjowLCLluo8iOjEsIuW/lyI6MSwi6L+OIjoxLCLmgakiOjEsIuaOoSI6MSwi5qGcIjowLCLmsLgiOjEsIua2siI6MSwi55y8IjoxLCLnpZYiOjEsIue4viI6MSwi6IiIIjoxLCLooZsiOjEsIuikhyI6MSwi6ZuRIjoxLCLphbgiOjEsIuizmyI6MSwi6YqtIjoxLCLpo7wiOjAsIuWCtyI6MSwi5YWaIjoxLCLljrMiOjEsIuaNqCI6MCwi5a+GIjoxLCLmsZoiOjEsIuaaliI6MSwi5qyyIjoxLCLmnLoiOjAsIuenmCI6MSwi6KizIjoxLCLmn5MiOjEsIueIqiI6MCwi5oudIjoxLCLlpbQiOjEsIuixhiI6MSwi6KqkIjoxLCLoh5MiOjEsIuiytCI6MSwi6ZmNIjoxLCLkuLwiOjEsIuWQkCI6MCwi6Zq3IjoxLCLoiosiOjAsIue4riI6MSwi57SUIjoxLCLnuKYiOjAsIueyiyI6MSwi56OBIjoxLCLntIUiOjEsIuWwhCI6MSwi5bmVIjoxLCLolqYiOjEsIuaPriI6MSwi5o6oIjoxLCLmsr8iOjEsIua6kCI6MSwi5YukIjoxLCLmrZMiOjEsIuaJvyI6MSwi5p6dIjoxLCLmkI0iOjEsIuWIuyI6MSwi6IWQIjoxLCLogZYiOjF9Owp2YXIga2FuamlZb21pUEFSQURJU0UgPSB7IuaPoSI6MSwi57SbIjoxLCLns74iOjEsIuaeoiI6MSwi6Lu4IjoxLCLlhYsiOjEsIuWPjCI6MSwi5YiwIjoxLCLlk7IiOjEsIuWWqiI6MSwi5aCFIjowLCLmi6wiOjEsIuW6iiI6MSwi5bynIjoxLCLmjJEiOjEsIuaOmCI6MSwi5o+6IjoxLCLmj5oiOjEsIuaWjiI6MSwi5p6QIjoxLCLmmqsiOjEsIuaziiI6MSwi5p+EIjowLCLmvZ8iOjAsIua7kSI6MSwi56+EIjoxLCLnhKYiOjEsIue2sSI6MCwi57ayIjoxLCLogp0iOjEsIuiKnSI6MCwi6I2SIjowLCLooosiOjAsIuehrCI6MSwi5puHIjowLCLmvoQiOjEsIuefmyI6MSwi6IKMIjowLCLoiJ8iOjAsIueLqSI6MCwi5Ye2IjoxLCLpkJgiOjEsIuWhiiI6MCwi6aCDIjowLCLohJoiOjEsIumtgiI6MSwi5LqVIjoxLCLkuZ8iOjAsIuWRqiI6MCwi5ayiIjoxLCLmmqYiOjEsIuecuiI6MSwi6LOtIjowLCLoo7giOjEsIueWsiI6MSwi5Y2TIjoxLCLlob4iOjEsIuiPjCI6MSwi56OoIjowLCLpmbAiOjEsIua5vyI6MSwi6ZyKIjoxLCLlq4EiOjAsIueovCI6MSwi5rqdIjoxLCLni4IiOjEsIua7nSI6MCwi57+UIjowLCLloqgiOjAsIumzqSI6MCwi56mPIjoxLCLpiI0iOjEsIumtlCI6MSwi5a+uIjoxLCLmo58iOjEsIuebhiI6MSwi5ZC+IjowLCLmlqwiOjEsIuWvpyI6MSwi5qSFIjoxLCLmrbMiOjEsIua2vCI6MSwi54y/IjowLCLnnrMiOjEsIumNtSI6MCwi6Zu2IjoxLCLnooEiOjEsIuW5vSI6MSwi56efIjoxLCLms6EiOjEsIueZliI6MCwi6Y2bIjoxLCLpjKwiOjEsIuepgiI6MCwi5bidIjoxLCLoj4oiOjEsIueerCI6MSwi6KqHIjoxLCLluoQiOjEsIumYuyI6MSwi5L+1IjoxLCLpu5kiOjEsIue2vyI6MSwi5p62IjoxLCLlrZQiOjEsIuWUhyI6MCwi56CVIjoxLCLnspgiOjEsIueypyI6MSwi5qy6IjoxLCLoqZAiOjEsIumcpyI6MCwi5p+zIjoxLCLkvIoiOjEsIuS9kCI6MSwi556tIjoxLCLlsLoiOjEsIuWTgCI6MSwi5aGAIjoxLCLlpoIiOjEsIuWinCI6MSwi5amGIjoxLCLltJYiOjEsIuW4vSI6MSwi5bmjIjoxLCLmgagiOjEsIuaGjiI6MSwi5oapIjoxLCLmiYciOjEsIuaJiSI6MSwi5o6MIjoxLCLmjL8iOjEsIua7tCI6MSwi54KKIjoxLCLnlbMiOjEsIueIvSI6MCwi5664IjowLCLoiq8iOjEsIuiDtCI6MSwi6Jm5IjowLCLlt74iOjEsIumcnCI6MCwi6JqKIjowLCLpqI4iOjEsIuW4syI6MSwi6JuHIjowLCLovrEiOjEsIuiyvCI6MCwi6YmiIjoxLCLpl4ciOjAsIumamSI6MCwi6aOiIjoxLCLppJMiOjEsIueVnCI6MSwi6L+FIjoxLCLok4QiOjEsIuWwvSI6MSwi5b2pIjoxLCLmurYiOjEsIuaGtiI6MSwi6ICQIjoxLCLouIoiOjAsIuizoiI6MSwi6LydIjoxLCLnga8iOjEsIuiEhSI6MSwi6bq7IjoxLCLlkrIiOjAsIuaClCI6MSwi5Z+5IjoxLCLohIciOjAsIumBgiI6MSwi5aGXIjoxLCLnj60iOjEsIuaWnCI6MSwi5q60IjoxLCLnm74iOjEsIuepqyI6MSwi6ba0IjowLCLmt6EiOjEsIue0qyI6MSwi6aeSIjowLCLmir0iOjEsIuiqkyI6MSwi5oKfIjoxLCLmi5MiOjEsIuaLmCI6MSwi56SOIjoxLCLliIgiOjAsIuWJmyI6MSwi5ZSvIjoxLCLlsLwiOjEsIuWjhyI6MSwi5qaCIjoxLCLmtbgiOjEsIueFriI6MCwi6KaGIjoxLCLorIAiOjEsIumalCI6MSwi6Zm2IjoxLCLkv5ciOjEsIuW+gSI6MSwi6ZmbIjoxLCLmoZEiOjAsIua9pCI6MSwi54+gIjoxLCLoobAiOjEsIuWKoyI6MSwi5aWoIjoxLCLli5giOjEsIuWmgyI6MSwi6YKqIjoxLCLmkKwiOjEsIuWisyI6MSwi5b2wIjoxLCLpp4QiOjEsIuW7tyI6MSwi6KiCIjoxLCLlo64iOjEsIua8giI6MSwi6bCQIjowLCLon7kiOjAsIuewvyI6MSwi5pm2IjoxLCLou4wiOjEsIua2ryI6MSwi5benIjoxLCLls7AiOjEsIuWUkCI6MSwi6ayxIjoxLCLmvKsiOjEsIuirriI6MSwi6YqYIjoxLCLloLAiOjAsIuWgpCI6MSwi57+7IjoxLCLlkI4iOjEsIuWlriI6MSwi5LuwIjoxLCLkuq0iOjEsIuS8ryI6MSwi5YG2IjoxLCLmt4AiOjAsIuaKiiI6MSwi5rSeIjoxLCLnlqsiOjEsIuijgiI6MSwi57GNIjoxLCLmn5QiOjEsIuayiCI6MSwi5rK8IjowLCLoqrAiOjAsIuilsiI6MSwi6LKiIjoxLCLotqMiOjEsIui3nSI6MSwi5pyXIjoxLCLljbMiOjEsIuaXqCI6MSwi5aiBIjoxLCLnrZIiOjEsIuePjSI6MSwi6ZyyIjoxLCLliLciOjEsIueJpyI6MSwi5r2uIjoxLCLlnqMiOjAsIuWwgSI6MSwi5bKzIjoxLCLmhbAiOjEsIuaHhyI6MSwi5oeyIjoxLCLmkakiOjEsIuaTpiI6MSwi5paJIjoxLCLmkrIiOjEsIua7hSI6MSwi5rOwIjoxLCLngokiOjEsIua7iyI6MSwi55C0IjowLCLoh7MiOjEsIuWEgCI6MSwi6JmOIjowLCLpgZwiOjEsIuS8uiI6MCwi5b65IjoxLCLngKwiOjAsIuaOqiI6MSwi5pKkIjoxLCLmi6AiOjEsIuaouSI6MSwi5qOEIjoxLCLom40iOjAsIuicgiI6MCwi6YWOIjoxLCLonJwiOjEsIuWinyI6MSwi5r2cIjoxLCLoiaYiOjEsIuaLsyI6MSwi54KtIjoxLCLnlZEiOjAsIuS7gSI6MSwi5YyFIjoxLCLooaMiOjEsIumJsSI6MSwi6KqgIjoxLCLpg7ciOjEsIuS+tSI6MSwi5YG9IjoxLCLpm7ciOjEsIui+myI6MSwi57KSIjoxLCLkuJgiOjEsIuWoryI6MSwi5paXIjoxLCLorI4iOjAsIuacsSI6MSwi5aGUIjoxLCLpq6oiOjAsIuegsiI6MSwi5a+4IjoxLCLnq5wiOjEsIue4gSI6MSwi57+8IjoxLCLlkIkiOjEsIuWIgyI6MCwi5b+NIjoxLCLmoYMiOjAsIuS+jSI6MCwi5L+6IjowLCLlj7EiOjAsIuaiqCI6MCwi5Yy5IjowLCLph6MiOjAsIuWPqyI6MSwi56ygIjowLCLltZAiOjAsIue8tiI6MSwi5raZIjoxLCLmo5oiOjAsIuWnqyI6MCwi6Iq9IjowfTsKdmFyIGthbmppWW9taVJFQUxJVFkgPSB7Iui7kiI6MSwi5aqbIjowLCLnjoQiOjEsIuWBiSI6MSwi6aCCIjoxLCLlj6wiOjEsIuaeryI6MSwi5oyfIjowLCLmsrgiOjEsIua/ryI6MSwi54elIjoxLCLnk7YiOjEsIuiCryI6MSwi6ICVIjoxLCLohIIiOjEsIuiGmiI6MSwi6LufIjoxLCLpg4oiOjEsIumahSI6MCwi6Zq7IjoxLCLpgrgiOjEsIua4piI6MSwi6YOhIjoxLCLph4giOjEsIuiCqiI6MSwi5ZaaIjoxLCLosp4iOjEsIuiLlyI6MSwi5oWIIjoxLCLopZ8iOjAsIuiTriI6MSwi6IGhIjoxLCLkuq4iOjEsIua1piI6MCwi5aGaIjowLCLmvLgiOjAsIuiXuyI6MSwi5aaEIjoxLCLlgLkiOjEsIueLkCI6MCwi6YCdIjoxLCLljL8iOjEsIuWvoSI6MSwi55eiIjoxLCLol40iOjAsIuWdkSI6MSwi55WUIjoxLCLllIQiOjAsIuaLtyI6MSwi5riTIjoxLCLlu4kiOjEsIuisuSI6MSwi5rmnIjoxLCLphpwiOjEsIuWNhyI6MCwi5q6JIjoxLCLnhakiOjEsIuWKviI6MSwi5qGfIjoxLCLlqb8iOjAsIuaFlSI6MSwi5723IjoxLCLnn68iOjEsIuWbmiI6MSwi5p+QIjoxLCLms4wiOjEsIuibriI6MSwi5bq2IjoxLCLpr6giOjEsIuiNmCI6MSwi5qC9IjoxLCLlhqAiOjEsIuaLkCI6MSwi5YuyIjoxLCLphawiOjEsIuashCI6MSwi57SLIjoxLCLljbgiOjAsIumAuCI6MSwi5bCaIjoxLCLpoZUiOjEsIueymyI6MSwi5oSaIjoxLCLot7UiOjEsIuWRiCI6MSwi55aOIjoxLCLnlr4iOjEsIuisoSI6MSwi6Y6MIjowLCLphbciOjEsIuWPmSI6MSwi5LiUIjowLCLnl7QiOjEsIuWRhiI6MSwi5ZO6IjoxLCLmgqAiOjEsIuWCsiI6MSwi6IyOIjowLCLpmL8iOjEsIuadjyI6MSwi6IycIjowLCLmoJ4iOjAsIuS8jyI6MSwi6Y6uIjoxLCLlpYkiOjEsIuaGgiI6MSwi5qCDIjowLCLmnLQiOjEsIue0ryI6MSwi5oOcIjoxLCLkvbMiOjEsIuaCvCI6MSwi6KmyIjoxLCLotbQiOjEsIumrhCI6MSwi5YKNIjoxLCLnmZIiOjEsIumDrSI6MSwi5bC/IjoxLCLomZwiOjEsIuizkyI6MSwi5oa+IjoxLCLlvKUiOjAsIueylyI6MSwi5b6qIjoxLCLohIoiOjEsIuWHnSI6MSwi5piMIjoxLCLml6YiOjEsIuaEiSI6MSwi5qCTIjoxLCLmirkiOjEsIuS5iyI6MCwi6b6NIjoxLCLnkZsiOjEsIumBvCI6MSwi6YKjIjoxLCLlr4IiOjEsIuW6uCI6MSwi5ouNIjoxLCLnjLYiOjEsIuWusCI6MSwi57irIjoxLCLlkYkiOjEsIuWHoSI6MSwi5oGtIjowLCLpjK8iOjEsIuepgCI6MSwi5byKIjoxLCLpmbUiOjEsIuiItiI6MSwi5oKmIjoxLCLnqq4iOjEsIue4myI6MSwi6L2EIjoxLCLlvKYiOjEsIua0qiI6MSwi56qSIjoxLCLmkYIiOjEsIumjvSI6MSwi6Z2WIjowLCLntLMiOjEsIuWYiSI6MSwi5pC+IjoxLCLonbYiOjEsIueikSI6MSwi5bCJIjoxLCLljKAiOjEsIuWHmyI6MSwi6YGlIjowLCLmmboiOjEsIuaftCI6MCwi55GgIjoxLCLmlaIiOjEsIualkyI6MSwi5Ye5IjoxLCLlh7giOjEsIuiQjCI6MSwi54OPIjowLCLos4oiOjEsIuaXiyI6MSwi6byTIjoxLCLohbgiOjEsIuanvSI6MSwi5LyQIjoxLCLloJUiOjEsIua8rCI6MCwi5Z2qIjowLCLntLoiOjEsIue+hSI6MSwi5bOhIjoxLCLkv7giOjEsIumGuCI6MSwi5byUIjoxLCLkuZkiOjEsIuihoSI6MSwi6YGNIjoxLCLmrL4iOjEsIumWsiI6MSwi5ZadIjoxLCLohpwiOjEsIuebsiI6MSwi6YW1IjoxLCLog44iOjEsIumBriI6MSwi5ZOJIjowLCLokrwiOjEsIuWHhiI6MSwi5a+bIjoxLCLog54iOjEsIua1hCI6MSwi6ZqPIjoxLCLnqL8iOjEsIuS4uSI6MSwi5aOMIjoxLCLoiJciOjEsIumosCI6MSwi57evIjoxLCLoiYciOjEsIuaKqyI6MSwi6YymIjowLCLlibAiOjEsIue5iiI6MSwi6KutIjoxLCLmg6giOjEsIuiZkCI6MSwi5o2uIjowLCLlvpAiOjEsIuaQrSI6MSwi6JKZIjoxLCLnk5wiOjEsIumviSI6MCwi5oi0IjoxLCLnt4siOjEsIuabmSI6MCwi6IOhIjoxLCLluKUiOjEsIuWVkyI6MSwi6JG1IjowLCLpp78iOjEsIuirkiI6MSwi6I6JIjoxLCLpgYciOjEsIumZpSI6MSwi6LKrIjoxLCLopociOjEsIuiMqCI6MCwi5ZGCIjoxLCLmk4EiOjEsIuWtpCI6MSwi6Y6WIjoxLCLos6AiOjEsIuWZtCI6MSwi56WlIjoxLCLnibIiOjEsIuWUhiI6MSwi56epIjoxLCLohqgiOjEsIuiKsyI6MSwi5oGSIjoxLCLlgKsiOjEsIumZsyI6MSwi6aCIIjoxLCLlgY8iOjEsIuezpyI6MSwi5q6KIjoxLCLmhaIiOjEsIuayoSI6MSwi5oCgIjoxLCLpga0iOjEsIuaDsCI6MSwi54yfIjoxLCLkuYMiOjEsIumiryI6MSwi57a+IjoxLCLpmrwiOjAsIui8lCI6MCwi56GrIjoxLCLotaYiOjEsIueqgyI6MSwi5oWoIjoxLCLmiK8iOjEsIuaJtiI6MSwi5r+BIjoxLCLlpZQiOjEsIuiCliI6MSwi5py9IjoxLCLkuqsiOjEsIuauuyI6MSwi6JepIjoxLCLpto8iOjEsIuWqkiI6MSwi5ZixIjoxLCLmpI4iOjEsIui/rSI6MSwi57W5IjoxLCLpmaoiOjEsIuitnCI6MSwi5YmWIjoxLCLmt5EiOjEsIuW4hiI6MSwi6YWMIjoxLCLmhqQiOjEsIuaagSI6MCwi5YKRIjoxLCLpjKAiOjEsIuWHjCI6MCwi55GeIjowLCLoj4UiOjAsIueSgyI6MSwi5ryjIjoxLCLlkJ8iOjEsIuS+riI6MSwi6YuzIjoxLCLolJEiOjEsIuiDhiI6MSwi5rWqIjoxLCLnpo0iOjEsIumFqiI6MSwi5oanIjowLCLkupwiOjEsIuaFtiI6MSwi5qKTIjowLCLmsbAiOjEsIuaymSI6MSwi5b+MIjoxLCLpgbciOjEsIuaLmSI6MSwi56+kIjoxLCLls6AiOjAsIuWPlCI6MCwi6ZuMIjowLCLloKoiOjAsIuW0hyI6MSwi55SaIjoxLCLmvIYiOjEsIuWyrCI6MCwi57ShIjoxLCLnpIEiOjEsIuWxryI6MSwi5ae7IjoxLCLnnaYiOjEsIuaTrCI6MSwi6ZaRIjoxLCLmm7kiOjEsIuWNkSI6MSwi6KmgIjoxfTsKCi8qCiogVXNlZCBmb3Igc3dpdGNoaW5nIGJldHdlZW4gaGlyYSBhbmQga2F0YSAodmljZSB2ZXJzYSkKKi8KdmFyIGhpcmFUb0thdGEgPSB7IuOCgSI6ICLjg6EiLCAi44KAIjogIuODoCIsICLjgoMiOiAi44OjIiwgIuOCgiI6ICLjg6IiLCAi44KFIjogIuODpSIsICLjgoQiOiAi44OkIiwgIuOChyI6ICLjg6ciLCAi44KGIjogIuODpiIsICLjgokiOiAi44OpIiwgIuOCiCI6ICLjg6giLCAi44KLIjogIuODqyIsICLjgooiOiAi44OqIiwgIuOCjSI6ICLjg60iLCAi44KMIjogIuODrCIsICLjgo8iOiAi44OvIiwgIuOCkyI6ICLjg7MiLCAi44KSIjogIuODsiIsICLjgYIiOiAi44KiIiwgIuOBhCI6ICLjgqQiLCAi44GGIjogIuOCpiIsICLjgYgiOiAi44KoIiwgIuOBiyI6ICLjgqsiLCAi44GKIjogIuOCqiIsICLjgY0iOiAi44KtIiwgIuOBjCI6ICLjgqwiLCAi44GPIjogIuOCryIsICLjgY4iOiAi44KuIiwgIuOBkSI6ICLjgrEiLCAi44GQIjogIuOCsCIsICLjgZMiOiAi44KzIiwgIuOBkiI6ICLjgrIiLCAi44GVIjogIuOCtSIsICLjgZQiOiAi44K0IiwgIuOBlyI6ICLjgrciLCAi44GWIjogIuOCtiIsICLjgZkiOiAi44K5IiwgIuOBmCI6ICLjgrgiLCAi44GbIjogIuOCuyIsICLjgZoiOiAi44K6IiwgIuOBnSI6ICLjgr0iLCAi44GcIjogIuOCvCIsICLjgZ8iOiAi44K/IiwgIuOBniI6ICLjgr4iLCAi44GhIjogIuODgSIsICLjgaAiOiAi44OAIiwgIuOBoyI6ICLjg4MiLCAi44GiIjogIuODgiIsICLjgaUiOiAi44OFIiwgIuOBpCI6ICLjg4QiLCAi44GnIjogIuODhyIsICLjgaYiOiAi44OGIiwgIuOBqSI6ICLjg4kiLCAi44GoIjogIuODiCIsICLjgasiOiAi44OLIiwgIuOBqiI6ICLjg4oiLCAi44GtIjogIuODjSIsICLjgawiOiAi44OMIiwgIuOBryI6ICLjg48iLCAi44GuIjogIuODjiIsICLjgbEiOiAi44ORIiwgIuOBsCI6ICLjg5AiLCAi44GzIjogIuODkyIsICLjgbIiOiAi44OSIiwgIuOBtSI6ICLjg5UiLCAi44G0IjogIuODlCIsICLjgbciOiAi44OXIiwgIuOBtiI6ICLjg5YiLCAi44G5IjogIuODmSIsICLjgbgiOiAi44OYIiwgIuOBuyI6ICLjg5siLCAi44G6IjogIuODmiIsICLjgb0iOiAi44OdIiwgIuOBvCI6ICLjg5wiLCAi44G/IjogIuODnyIsICLjgb4iOiAi44OeIn07CnZhciBrYXRhVG9IaXJhID0geyLjg6EiOiAi44KBIiwgIuODoCI6ICLjgoAiLCAi44OjIjogIuOCgyIsICLjg6IiOiAi44KCIiwgIuODpSI6ICLjgoUiLCAi44OkIjogIuOChCIsICLjg6ciOiAi44KHIiwgIuODpiI6ICLjgoYiLCAi44OpIjogIuOCiSIsICLjg6giOiAi44KIIiwgIuODqyI6ICLjgosiLCAi44OqIjogIuOCiiIsICLjg60iOiAi44KNIiwgIuODrCI6ICLjgowiLCAi44OvIjogIuOCjyIsICLjg7MiOiAi44KTIiwgIuODsiI6ICLjgpIiLCAi44KiIjogIuOBgiIsICLjgqQiOiAi44GEIiwgIuOCpiI6ICLjgYYiLCAi44KoIjogIuOBiCIsICLjgqsiOiAi44GLIiwgIuOCqiI6ICLjgYoiLCAi44KtIjogIuOBjSIsICLjgqwiOiAi44GMIiwgIuOCryI6ICLjgY8iLCAi44KuIjogIuOBjiIsICLjgrEiOiAi44GRIiwgIuOCsCI6ICLjgZAiLCAi44KzIjogIuOBkyIsICLjgrIiOiAi44GSIiwgIuOCtSI6ICLjgZUiLCAi44K0IjogIuOBlCIsICLjgrciOiAi44GXIiwgIuOCtiI6ICLjgZYiLCAi44K5IjogIuOBmSIsICLjgrgiOiAi44GYIiwgIuOCuyI6ICLjgZsiLCAi44K6IjogIuOBmiIsICLjgr0iOiAi44GdIiwgIuOCvCI6ICLjgZwiLCAi44K/IjogIuOBnyIsICLjgr4iOiAi44GeIiwgIuODgSI6ICLjgaEiLCAi44OAIjogIuOBoCIsICLjg4MiOiAi44GjIiwgIuODgiI6ICLjgaIiLCAi44OFIjogIuOBpSIsICLjg4QiOiAi44GkIiwgIuODhyI6ICLjgaciLCAi44OGIjogIuOBpiIsICLjg4kiOiAi44GpIiwgIuODiCI6ICLjgagiLCAi44OLIjogIuOBqyIsICLjg4oiOiAi44GqIiwgIuODjSI6ICLjga0iLCAi44OMIjogIuOBrCIsICLjg48iOiAi44GvIiwgIuODjiI6ICLjga4iLCAi44ORIjogIuOBsSIsICLjg5AiOiAi44GwIiwgIuODkyI6ICLjgbMiLCAi44OSIjogIuOBsiIsICLjg5UiOiAi44G1IiwgIuODlCI6ICLjgbQiLCAi44OXIjogIuOBtyIsICLjg5YiOiAi44G2IiwgIuODmSI6ICLjgbkiLCAi44OYIjogIuOBuCIsICLjg5siOiAi44G7IiwgIuODmiI6ICLjgboiLCAi44OdIjogIuOBvSIsICLjg5wiOiAi44G8IiwgIuODnyI6ICLjgb8iLCAi44OeIjogIuOBviJ9OwoKaWYgKC9kYXNoYm9hcmQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCBkb2N1bWVudC5VUkwgPT0gImh0dHA6Ly93d3cud2FuaWthbmkuY29tLyIgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwczovL3d3dy53YW5pa2FuaS5jb20vIikgLy8gSG9tZXBhZ2UKewogICAgdmFyIHJlcGxhY2VQb3B1cCA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICBpZiAoIGlzT255b21pQWxsKCQodGhpcykudGV4dCgpKSA9PSAxKSAkKHRoaXMpLmF0dHIoKCdkYXRhLW9yaWdpbmFsLXRpdGxlJyksIGNvbnZlcnRUb0thdGEoJCh0aGlzKS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJykpICk7CiAgICB9OwogICAgJCgnLmxhdHRpY2Utc2luZ2xlLWNoYXJhY3RlciBhW2RhdGEtb3JpZ2luYWwtdGl0bGVdJykuZWFjaChyZXBsYWNlUG9wdXApOwoKICAgIC8vIHRoaXMgaXMgZm9yIHNjcmlwdHMgd2hvIG1vZGlmeSB0aGUgaG9tZXNjcmVlbiBhZnRlciB0aGUgcGFnZSBmaW5pc2hlZCBsb2FkaW5nCiAgICAkKCcua2FuamktcHJvZ3Jlc3MgLmxhdHRpY2Utc2luZ2xlLWNoYXJhY3RlciAuc21hbGwtY2FwcyA+IHNwYW4nKS5iaW5kKCJET01TdWJ0cmVlTW9kaWZpZWQiLGZ1bmN0aW9uKCl7CiAgICAgICAgJCgnLmthbmppLXByb2dyZXNzIC5sYXR0aWNlLXNpbmdsZS1jaGFyYWN0ZXIgYVtkYXRhLW9yaWdpbmFsLXRpdGxlXScpLmVhY2gocmVwbGFjZVBvcHVwKTsKICAgIH0pOwoKfQplbHNlIGlmICgvXC9sYXR0aWNlXC9rYW5qaS8udGVzdChkb2N1bWVudC5VUkwpKSAvLyBMYXR0aWNlCnsKICAgIHZhciByZXBsYWNlUG9wdXAgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgaWYgKCBpc09ueW9taUFsbCgkKHRoaXMpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5hdHRyKCgnZGF0YS1vcmlnaW5hbC10aXRsZScpLCBjb252ZXJ0VG9LYXRhKCQodGhpcykuYXR0cignZGF0YS1vcmlnaW5hbC10aXRsZScpKSApOwogICAgfTsKICAgICQoJy5sYXR0aWNlLXNpbmdsZS1jaGFyYWN0ZXIgYVtkYXRhLW9yaWdpbmFsLXRpdGxlXScpLmVhY2gocmVwbGFjZVBvcHVwKTsKCn0KZWxzZSBpZiAoL1wva2FuamlcLy8udGVzdChkb2N1bWVudC5VUkwpKSAvLyBLYW5qaSBkZXRhaWwgcGFnZQp7CiAgICB2YXIgcmVwbGFjZVJlYWRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoJCh0aGlzKS5jaGlsZHJlbignaDMnKS50ZXh0KCkgPT0gIk9u4oCZeW9taSIpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCdwJykudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuY2hpbGRyZW4oJ3AnKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnLnNwYW40JykuZWFjaChyZXBsYWNlUmVhZGluZyk7CgogICAgLy8tLS0tLS0tLS0gVmlzdWFsbHkgU2ltaWxhciBLYW5qaSAtLS0tLS0tLS0vLwogICAgdmFyIHJlcGxhY2VTaW1pbGFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGlzT255b21pQWxsKCQodGhpcykuZmluZCgnLmNoYXJhY3RlcicpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VTaW1pbGFyKTsKfQplbHNlIGlmICgvXC9rYW5qaVw/ZGlmZmljdWx0Ly50ZXN0KGRvY3VtZW50LlVSTCkgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwOi8vd3d3LndhbmlrYW5pLmNvbS9rYW5qaSIpIC8vIEJpZyBrYW5qaSBwYWdlIGJhc2VkIG9uIGRpZmZpY3VsdHkKewogICAgdmFyIG4gPSBkb2N1bWVudC5VUkwubGFzdEluZGV4T2YoJz0nKTsKICAgIHZhciBkaWZmaWN1bHR5ID0gZG9jdW1lbnQuVVJMLnN1YnN0cmluZyhuICsgMSk7CgogICAgdmFyIHJlcGxhY2VMZXZlbFBvcnRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAkKHRoaXMpLmZpbmQoJy5jaGFyYWN0ZXItaXRlbScpLmVhY2gocmVwbGFjZVJlYWRpbmcpOwogICAgfTsKCiAgICB2YXIgcmVwbGFjZVJlYWRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoaXNPbnlvbWkoJCh0aGlzKS5maW5kKCcuY2hhcmFjdGVyJykudGV4dCgpLnJlcGxhY2UoL1xzL2csJycpLCBkaWZmaWN1bHR5KSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmVhY2gocmVwbGFjZUxldmVsUG9ydGlvbik7Cn0KZWxzZSBpZiAoL1wvcmFkaWNhbHNcLy8udGVzdChkb2N1bWVudC5VUkwpIHx8wqAvXC92b2NhYnVsYXJ5XC8vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gUmFkaWNhbCBhbmQgVm9jYWJ1bGFyeSBwYWdlCnsKICAgIC8vLS0tLS0tLS0tIEZvdW5kIEluIGFuZCBVdGlsaXplZCBLYW5qaSAtLS0tLS0tLS0vLwogICAgdmFyIHJlcGxhY2VSZWFkaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGlzT255b21pQWxsKCQodGhpcykuZmluZCgnLmNoYXJhY3RlcicpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VSZWFkaW5nKTsKfQplbHNlIGlmICgvXC9sZXZlbFwvLy50ZXN0KGRvY3VtZW50LlVSTCkpIC8vIExldmVsIHBhZ2UKewogICAgdmFyIG4gPSBkb2N1bWVudC5VUkwubGFzdEluZGV4T2YoJy8nKTsKICAgIHZhciBsZXZlbCA9IGRvY3VtZW50LlVSTC5zdWJzdHJpbmcobiArIDEpOwoKICAgIHZhciByZXBsYWNlUmVhZGluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChpc09ueW9taSgkKHRoaXMpLmNoaWxkcmVuKCcuY2hhcmFjdGVyJykudGV4dCgpLnJlcGxhY2UoL1xzL2csJycpLCBsZXZlbCkpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgwKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmVxKDEpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VSZWFkaW5nKTsKfQplbHNlIGlmICgvcmV2aWV3XC9zZXNzaW9uLy50ZXN0KGRvY3VtZW50LlVSTCkpIC8vIFJldmlldyB0ZXN0IHBhZ2UKewogICAgYW5zd2VyQ2hlY2tlci5vbGRJc0FzY2lpUHJlc2VudEtNID0gYW5zd2VyQ2hlY2tlci5pc0FzY2lpUHJlc2VudDsKICAgIGFuc3dlckNoZWNrZXIuaXNBc2NpaVByZXNlbnQgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgLy8gdGhpcyBpcyBmb3IgdHJhaWxpbmcgTiB0byDjg7MKICAgICAgICBpZihlW2UubGVuZ3RoLTFdID09PSAnTicpIHsKICAgICAgICAgICAgZSA9IGUuc3Vic3RyKDAsIGUubGVuZ3RoLTEpICsgJ+ODsycgKyBlLnN1YnN0cihlLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbnN3ZXJDaGVja2VyLm9sZElzQXNjaWlQcmVzZW50S00oZSk7CiAgICB9OwoKICAgIGFuc3dlckNoZWNrZXIub2xkRXZhbHVhdGVLTSA9IGFuc3dlckNoZWNrZXIuZXZhbHVhdGU7CiAgICBhbnN3ZXJDaGVja2VyLmV2YWx1YXRlID0gZnVuY3Rpb24oZSx0KSB7CiAgICAgICAgLy9jb25zb2xlLmxvZygkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKSk7CiAgICAgICAgLy8gdGhpcyBpcyBmb3IgdHJhaWxpbmcgTiB0byDjg7MKICAgICAgICBpZihlID09PSAicmVhZGluZyIgJiYgdFt0Lmxlbmd0aC0xXSA9PT0gJ04nKSB7CiAgICAgICAgICAgIHQgPSB0LnN1YnN0cigwLCB0Lmxlbmd0aC0xKSArICfjg7MnICsgdC5zdWJzdHIodC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICBpZihpc09ueW9taVJldmlldygpKSB7CiAgICAgICAgICAgIC8vIHRoaXMgaXMgZm9yIHRoZSAiV2FuaUthbmkgaXMgbG9va2luZyBmb3IgdGhlIG9ueW9taSByZWFkaW5nIiBmdW5jdGlvbgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpLmt1bi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qU3RvcmFnZS5nZXQoJ2N1cnJlbnRJdGVtJykua3VuW2ldID0gY29udmVydFRvS2F0YSgkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKS5rdW5baV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJC5qU3RvcmFnZS5nZXQoJ2N1cnJlbnRJdGVtJykub24ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpLm9uW2ldID0gY29udmVydFRvS2F0YSgkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKS5vbltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy9jb25zb2xlLmxvZygkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKSk7CiAgICAgICAgcmV0dXJuIGFuc3dlckNoZWNrZXIub2xkRXZhbHVhdGVLTShlLHQpOwogICAgfTsKCiAgICAkKCcjdXNlci1yZXNwb25zZScpLm9uKCdpbnB1dCcsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmKGlzT255b21pUmV2aWV3KCkpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNvbnZlcnRUb0thdGEoJCh0aGlzKS52YWwoKS50b1VwcGVyQ2FzZSgpKTsKICAgICAgICB9CiAgICB9KTsKCiAgICB2YXIgb2JzZXJ2ZU1lID0gJCgnI2l0ZW0taW5mbyAucHVyZS11LTEtNCcpWzBdOwogICAgb2JzZXJ2ZURPTSgpKCBvYnNlcnZlTWUgLGZ1bmN0aW9uKCkgewogICAgICAgIGlmKGlzT255b21pUmV2aWV3KCkpIHsKICAgICAgICAgICAgJCgnI2l0ZW0taW5mby1yZWFkaW5nID4gc3BhbicpLnRleHQoY29udmVydFRvS2F0YSgkKCcjaXRlbS1pbmZvLXJlYWRpbmcgPiBzcGFuJykudGV4dCgpKSk7CiAgICAgICAgfQogICAgfSk7CgogICAgLy8gY2hhbmdlIGxhc3QgMTAgaXRlbXMKICAgIHZhciBsYXN0MTBDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYoaXNPbnlvbWlBbGwoJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoKSkpewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMSkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgxKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgdmFyIG9ic2VydmVNZSA9ICQoJyNsYXN0LWl0ZW1zLWxpc3QnKVswXTsKICAgIG9ic2VydmVET00oKSggb2JzZXJ2ZU1lICxmdW5jdGlvbigpIHsKICAgICAgICAkKCcjbGFzdC1pdGVtcy1saXN0IC5rYW5qaScpLmVhY2gobGFzdDEwQ2hhbmdlKTsKICAgIH0pOwp9CmVsc2UgaWYgKC9yZXZpZXcvLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gUmV2aWV3IGluZm8gcGFnZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIGEgcmV2aWV3CnsKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcjcmV2aWV3cy1zdW1tYXJ5JylbMF07CiAgICBvYnNlcnZlRE9NKCkoIG9ic2VydmVNZSAsZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGUgPSAkKCcua2FuamkgLmhvdmVyJyk7CiAgICAgICAgaWYoZS5sZW5ndGggIT09IDAgJiYgaXNPbnlvbWlBbGwoZS5wcmV2KCdhJykuZXEoMCkudGV4dCgpKSkgewogICAgICAgICAgICB2YXIgb255b21pTm9kZSA9IGUuZmluZCgndWwnKS5maW5kKCdsaScpLmVxKDEpOwogICAgICAgICAgICBvbnlvbWlOb2RlLnRleHQoY29udmVydFRvS2F0YShvbnlvbWlOb2RlLnRleHQoKSkpOwogICAgICAgIH0KICAgIH0pOwp9CmVsc2UgaWYgKC9sZXNzb25cL3Nlc3Npb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gTGVzc29uIGFuZCBsZXNzb24gdGVzdCBwYWdlCnsKICAgIC8vLS0tLS0tLS0tIExlc3NvbiBQYXJ0IC0tLS0tLS0tLS8vCiAgICB2YXIgd2hlbkxlc3NvblNsaWRlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBLYW5qaSBpbmZvCiAgICAgICAgdmFyIHR5cGUgPSAkKCIjc3VwcGxlbWVudC1rYW4tcmVhZGluZy10eXBlIikudGV4dCgpOwogICAgICAgIGlmKHR5cGUgPT09ICJvbid5b21pIikgewogICAgICAgICAgICAkKCcjc3VwcGxlbWVudC1rYW4tcmVhZGluZyBzcGFuJykuZXEoMSkudGV4dChjb252ZXJ0VG9LYXRhKCQoJyNzdXBwbGVtZW50LWthbi1yZWFkaW5nIHNwYW4nKS5lcSgxKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICAgICAgLy8gVm9jYWJsZSBicmVha2Rvd24gaW5mbwogICAgICAgICQoIiNzdXBwbGVtZW50LXZvYy1icmVha2Rvd24iKS5maW5kKCcua2FuamknKS5lYWNoKHJlcGxhY2VCcmVha2Rvd24pOwogICAgfTsKICAgIHZhciByZXBsYWNlQnJlYWtkb3duID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmKGlzT255b21pQWxsKCQodGhpcykudGV4dCgpKSkgewogICAgICAgICAgICAkKHRoaXMpLmF0dHIoInRpdGxlIiwgY29udmVydFRvS2F0YSgkKHRoaXMpLmF0dHIoJ3RpdGxlJykpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnI2JhdGNoLWl0ZW1zJykuY2xpY2sod2hlbkxlc3NvblNsaWRlcyk7CgogICAgLy8tLS0tLS0tLS0gVGVzdCBQYXJ0IC0tLS0tLS0tLS8vCiAgICBhbnN3ZXJDaGVja2VyLm9sZElzQXNjaWlQcmVzZW50S00gPSBhbnN3ZXJDaGVja2VyLmlzQXNjaWlQcmVzZW50OwogICAgYW5zd2VyQ2hlY2tlci5pc0FzY2lpUHJlc2VudCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAvLyB0aGlzIGlzIGZvciB0cmFpbGluZyBOIHRvIOODswogICAgICAgIGlmKGVbZS5sZW5ndGgtMV0gPT09ICdOJykgewogICAgICAgICAgICBlID0gZS5zdWJzdHIoMCwgZS5sZW5ndGgtMSkgKyAn44OzJyArIGUuc3Vic3RyKGUubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFuc3dlckNoZWNrZXIub2xkSXNBc2NpaVByZXNlbnRLTShlKTsKICAgIH07CgogICAgYW5zd2VyQ2hlY2tlci5vbGRFdmFsdWF0ZUtNID0gYW5zd2VyQ2hlY2tlci5ldmFsdWF0ZTsKICAgIGFuc3dlckNoZWNrZXIuZXZhbHVhdGUgPSBmdW5jdGlvbihlLHQpIHsKICAgICAgICAvL2NvbnNvbGUubG9nKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpKTsKICAgICAgICAvLyB0aGlzIGlzIGZvciB0cmFpbGluZyBOIHRvIOODswogICAgICAgIGlmKGUgPT09ICJyZWFkaW5nIiAmJiB0W3QubGVuZ3RoLTFdID09PSAnTicpIHsKICAgICAgICAgICAgdCA9IHQuc3Vic3RyKDAsIHQubGVuZ3RoLTEpICsgJ+ODsycgKyB0LnN1YnN0cih0Lmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGlmKGlzT255b21pTGVzc29uKCkpIHsKICAgICAgICAgICAgLy8gdGhpcyBpcyBmb3IgdGhlICJXYW5pS2FuaSBpcyBsb29raW5nIGZvciB0aGUgb255b21pIHJlYWRpbmciIGZ1bmN0aW9uCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJC5qU3RvcmFnZS5nZXQoJ2wvY3VycmVudFF1aXpJdGVtJykua3VuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLmdldCgnbC9jdXJyZW50UXVpekl0ZW0nKS5rdW5baV0gPSBjb252ZXJ0VG9LYXRhKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpLmt1bltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkLmpTdG9yYWdlLmdldCgnbC9jdXJyZW50UXVpekl0ZW0nKS5vbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qU3RvcmFnZS5nZXQoJ2wvY3VycmVudFF1aXpJdGVtJykub25baV0gPSBjb252ZXJ0VG9LYXRhKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpLm9uW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYW5zd2VyQ2hlY2tlci5vbGRFdmFsdWF0ZUtNKGUsdCk7CiAgICB9OwoKICAgICQoJyN1c2VyLXJlc3BvbnNlJykub24oJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlMZXNzb24oKSkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gY29udmVydFRvS2F0YSgkKHRoaXMpLnZhbCgpLnRvVXBwZXJDYXNlKCkpOwogICAgICAgIH0KICAgIH0pOwoKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcjaXRlbS1pbmZvIC5wdXJlLXUtMS00JylbMF07CiAgICBvYnNlcnZlRE9NKCkoIG9ic2VydmVNZSAsZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlMZXNzb24oKSkgewogICAgICAgICAgICAkKCcjaXRlbS1pbmZvLXJlYWRpbmcgc3BhbicpLnRleHQoY29udmVydFRvS2F0YSgkKCcjaXRlbS1pbmZvLXJlYWRpbmcgc3BhbicpLnRleHQoKSkpOwogICAgICAgIH0KICAgIH0pOwoKfWVsc2UgaWYgKC9sZXNzb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gTGVzc29uIGluZm8gcGFnZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIGEgcnVuCnsKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcja2FuamknKVswXTsKICAgIG9ic2VydmVET00oKSggb2JzZXJ2ZU1lICxmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZSA9ICQoJy5rYW5qaSAuaG92ZXInKTsKICAgICAgICBpZihlLmxlbmd0aCAhPT0gMCAmJiBpc09ueW9taUFsbChlLnByZXYoJ2EnKS5lcSgwKS50ZXh0KCkpKSB7CiAgICAgICAgICAgIHZhciBvbnlvbWlOb2RlID0gZS5maW5kKCd1bCcpLmZpbmQoJ2xpJykuZXEoMSk7CiAgICAgICAgICAgIG9ueW9taU5vZGUudGV4dChjb252ZXJ0VG9LYXRhKG9ueW9taU5vZGUudGV4dCgpKSk7CiAgICAgICAgfQogICAgfSk7Cn0KCi8vIFNlYXJjaCByZXN1bHQKaWYoIC9kYXNoYm9hcmQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCBkb2N1bWVudC5VUkwgPT0gImh0dHA6Ly93d3cud2FuaWthbmkuY29tLyIgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwczovL3d3dy53YW5pa2FuaS5jb20vIiB8fCAvXC9sZXZlbC8udGVzdChkb2N1bWVudC5VUkwpIHx8CiAgIC9cL2xhdHRpY2UvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCAvXC9yYWRpY2Fscy8udGVzdChkb2N1bWVudC5VUkwpIHx8IC9cL2thbmppLy50ZXN0KGRvY3VtZW50LlVSTCkgfHwgL1wvdm9jYWJ1bGFyeS8udGVzdChkb2N1bWVudC5VUkwpIHx8CiAgIC9cL2NvbW11bml0eS8udGVzdChkb2N1bWVudC5VUkwpIHx8IC9cL2NoYXQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCAvXC9hY2NvdW50Ly50ZXN0KGRvY3VtZW50LlVSTCkgKSB7CiAgICB2YXIgc2VhcmNoQ2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlBbGwoJCh0aGlzKS5maW5kKCdzcGFuJykudGV4dCgpKSkgewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgwKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgdmFyIG9ic2VydmVNZSA9ICQoJy5zZWFyY2gtcmVzdWx0cycpWzBdOwogICAgb2JzZXJ2ZURPTSgpKCBvYnNlcnZlTWUgLGZ1bmN0aW9uKCkgewogICAgICAgICQoJy5zZWFyY2gtcmVzdWx0cyAja2FuamktJykuZWFjaChzZWFyY2hDaGFuZ2UpOwogICAgfSk7Cn0KCgoKLy8tLSBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmFuc2Zvcm1pbmcga2F0YSA8LT4gaGlyYSAtLS8vCmZ1bmN0aW9uIGlzT255b21pUmV2aWV3KCkgewoKICAgIHZhciBvYmpDdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImN1cnJlbnRJdGVtIik7CiAgICB2YXIgc3RyUXVlc3Rpb25UeXBlID0gJC5qU3RvcmFnZS5nZXQoInF1ZXN0aW9uVHlwZSIpOwoKICAgIGlmICgia2FuIiBpbiBvYmpDdXJJdGVtKSB7CiAgICAgICAgLy8gS2FuamkKICAgICAgICBpZiAoc3RyUXVlc3Rpb25UeXBlID09PSAicmVhZGluZyIpIHsKICAgICAgICAgICAgaWYob2JqQ3VySXRlbS5lbXBoID09PSAib255b21pIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGlzT255b21pTGVzc29uKCkgewoKICAgIHZhciBvYmpDdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImwvY3VycmVudFF1aXpJdGVtIik7CiAgICB2YXIgc3RyUXVlc3Rpb25UeXBlID0gJC5qU3RvcmFnZS5nZXQoImwvcXVlc3Rpb25UeXBlIik7CgogICAgaWYgKCJrYW4iIGluIG9iakN1ckl0ZW0pCiAgICB7CiAgICAgICAgLy8gS2FuamkKICAgICAgICBpZiAoc3RyUXVlc3Rpb25UeXBlID09PSAicmVhZGluZyIpIHsKICAgICAgICAgICAgaWYob2JqQ3VySXRlbS5lbXBoID09PSAib255b21pIil7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gaXNPbnlvbWkoa2FuamksIGxldmVsKQp7CiAgICBzd2l0Y2gobGV2ZWwudG9VcHBlckNhc2UoKSkgewogICAgICAgIGNhc2UgJ1BMRUFTQU5UJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzogY2FzZSAnMTAnOgogICAgICAgICAgICByZXR1cm4ga2FuamlZb21pUExFQVNBTlRba2FuamldOwogICAgICAgIGNhc2UgJ1BBSU5GVUwnOiBjYXNlICcxMSc6IGNhc2UgJzEyJzogY2FzZSAnMTMnOiBjYXNlICcxNCc6IGNhc2UgJzE1JzogY2FzZSAnMTYnOiBjYXNlICcxNyc6IGNhc2UgJzE4JzogY2FzZSAnMTknOiBjYXNlICcyMCc6CiAgICAgICAgICAgIHJldHVybiBrYW5qaVlvbWlQQUlORlVMW2thbmppXTsKICAgICAgICBjYXNlICdERUFUSCc6IGNhc2UgJzIxJzogY2FzZSAnMjInOiBjYXNlICcyMyc6IGNhc2UgJzI0JzogY2FzZSAnMjUnOiBjYXNlICcyNic6IGNhc2UgJzI3JzogY2FzZSAnMjgnOiBjYXNlICcyOSc6IGNhc2UgJzMwJzoKICAgICAgICAgICAgcmV0dXJuIGthbmppWW9taURFQVRIW2thbmppXTsKICAgICAgICBjYXNlICdIRUxMJzogY2FzZSAnMzEnOiBjYXNlICczMic6IGNhc2UgJzMzJzogY2FzZSAnMzQnOiBjYXNlICczNSc6IGNhc2UgJzM2JzogY2FzZSAnMzcnOiBjYXNlICczOCc6IGNhc2UgJzM5JzogY2FzZSAnNDAnOgogICAgICAgICAgICByZXR1cm4ga2FuamlZb21pSEVMTFtrYW5qaV07CiAgICAgICAgY2FzZSAnUEFSQURJU0UnOiBjYXNlICc0MSc6IGNhc2UgJzQyJzogY2FzZSAnNDMnOiBjYXNlICc0NCc6IGNhc2UgJzQ1JzogY2FzZSAnNDYnOiBjYXNlICc0Nyc6IGNhc2UgJzQ4JzogY2FzZSAnNDknOiBjYXNlICc1MCc6CiAgICAgICAgICAgIHJldHVybiBrYW5qaVlvbWlQQVJBRElTRVtrYW5qaV07CiAgICAgICAgY2FzZSAnUkVBTElUWSc6IGNhc2UgJzUxJzogY2FzZSAnNTInOiBjYXNlICc1Myc6IGNhc2UgJzU0JzogY2FzZSAnNTUnOiBjYXNlICc1Nic6IGNhc2UgJzU3JzogY2FzZSAnNTgnOiBjYXNlICc1OSc6IGNhc2UgJzYwJzoKICAgICAgICAgICAgcmV0dXJuIGthbmppWW9taVJFQUxJVFlba2FuamldOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAwOwogICAgfQp9CmZ1bmN0aW9uIGlzT255b21pQWxsKGthbmppKQp7CgogICAgaWYoa2FuamlZb21pUExFQVNBTlRba2FuamldKSByZXR1cm4gMTsKICAgIGlmKGthbmppWW9taVBBSU5GVUxba2FuamldKSByZXR1cm4gMTsKICAgIGlmKGthbmppWW9taURFQVRIW2thbmppXSkgcmV0dXJuIDE7CiAgICBpZihrYW5qaVlvbWlIRUxMW2thbmppXSkgcmV0dXJuIDE7CiAgICBpZihrYW5qaVlvbWlQQVJBRElTRVtrYW5qaV0pIHJldHVybiAxOwogICAgaWYoa2FuamlZb21pUkVBTElUWVtrYW5qaV0pIHJldHVybiAxOwogICAgcmV0dXJuIDA7Cgp9CmZ1bmN0aW9uIGNvbnZlcnRUb0thdGEoY2hhaW4pCnsKICAgIGNoYWluID0gY2hhaW4udHJpbSgpOwogICAgZm9yICh2YXIgaSA9IDAsIGMgPSBjaGFpbi5sZW5ndGg7IGkgPCBjOyBpKyspCiAgICB7CiAgICAgICAgY2hhaW4gPSByZXBsYWNlQXQoY2hhaW4sIGksIGhpcmFUb0thdGFbY2hhaW5baV1dIHx8IGNoYWluW2ldKTsKICAgIH0KICAgIHJldHVybiBjaGFpbjsKfQoKZnVuY3Rpb24gY29udmVydFRvSGlyYShjaGFpbikKewogICAgY2hhaW4gPSBjaGFpbi50cmltKCk7CiAgICBmb3IgKHZhciBpID0gMCwgYyA9IGNoYWluLmxlbmd0aDsgaSA8IGM7IGkrKykKICAgIHsKICAgICAgICBjaGFpbiA9IHJlcGxhY2VBdChjaGFpbiwgaSwga2F0YVRvSGlyYVtjaGFpbltpXV0gfHwgY2hhaW5baV0pOwogICAgfQogICAgcmV0dXJuIGNoYWluOwp9CgpmdW5jdGlvbiByZXBsYWNlQXQocywgbiwgdCkKewogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIG4pICsgdCArIHMuc3Vic3RyaW5nKG4gKyAxKTsKfQoKLyoKKiBXYWl0IGZvciBlbGVtZW50cyB0byBhcHBlYXIKKiBjYWxsIHdpdGggb2JzZXJ2ZURvbSgpKG9ic2Vydk5vZGUsIGNhbGxiYWNrRnVuY3Rpb24pOwoqIGZyb20gc3RhY2tvdmVyZmxvdzogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTQ1NzA2MTQKKi8KZnVuY3Rpb24gb2JzZXJ2ZURPTSgpIHsKICAgIHZhciBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsCiAgICAgICAgZXZlbnRMaXN0ZW5lclN1cHBvcnRlZCA9IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyOwogICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2spewogICAgICAgIGlmKCBNdXRhdGlvbk9ic2VydmVyICkgewogICAgICAgICAgICAvLyBkZWZpbmUgYSBuZXcgb2JzZXJ2ZXIKICAgICAgICAgICAgdmFyIG9icyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgIGlmKCBtdXRhdGlvbnNbMF0uYWRkZWROb2Rlcy5sZW5ndGggKQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBoYXZlIHRoZSBvYnNlcnZlciBvYnNlcnZlIGZvbyBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlbgogICAgICAgICAgICBvYnMub2JzZXJ2ZSggb2JqLCB7IGNoaWxkTGlzdDp0cnVlLCBzdWJ0cmVlOnRydWUgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIGV2ZW50TGlzdGVuZXJTdXBwb3J0ZWQgKSB7CiAgICAgICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpOwogICAgICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpOwogICAgICAgIH0KICAgIH07Cn0KCi8qCiogT25seSB1c2VkIGZvciBnZW5lcmF0aW5nIG9ueW9taUxpc3QKKiBDYW4gYWxzbyBiZSB1c2VkIHRvIGxvYWQga2Fuamkgb255b21pIGluZm9ybWF0aW9ucyBmcm9tIHNlcnZlciAoc2xvdykKKgoqIFVwZGF0ZToKKiBDYWxsIHdpdGggcGFyYW1ldGVyIG9mIGxldmVsIGFuZCBjb3B5IHRoZSBzdHJpbmcgZnJvbSB0aGUgbG9nIHdpbmRvdyBpbiBvbmUgb2YgdGhlIHZhcmlhYmxlcyBvbiB0aGUgdG9wCiogZS5nLgoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiUExFQVNBTlQiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJQQUlORlVMIikpOwoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiREVBVEgiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJIRUxMIikpOwoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiUEFSQURJU0UiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJSRUFMSVRZIikpOwoqLwpmdW5jdGlvbiBsb2FkS2F0YUZyb21BcGkobGV2ZWwpIHsKICAgIHZhciBsZXZlbHM7CiAgICBzd2l0Y2gobGV2ZWwpIHsKICAgICAgICBjYXNlICdQTEVBU0FOVCc6CiAgICAgICAgICAgIGxldmVscyA9ICIxLDIsMyw0LDUsNiw3LDgsOSwxMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1BBSU5GVUwnOgogICAgICAgICAgICBsZXZlbHMgPSAiMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdERUFUSCc6CiAgICAgICAgICAgIGxldmVscyA9ICIyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0hFTEwnOgogICAgICAgICAgICBsZXZlbHMgPSAiMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdQQVJBRElTRSc6CiAgICAgICAgICAgIGxldmVscyA9ICI0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1JFQUxJVFknOgogICAgICAgICAgICBsZXZlbHMgPSAiNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBsZXZlbHMgPSAnMSc7CiAgICB9CgogICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgcmVxLm9wZW4oJ0dFVCcsICdodHRwczovL3d3dy53YW5pa2FuaS5jb20vYXBpL3VzZXIvJyArIGFwaUtleSArICcva2FuamkvJyArIGxldmVscywgdHJ1ZSk7CiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHJlcS5yZWFkeVN0YXRlID09PSA0KSB7CiAgICAgICAgICAgIGlmIChyZXEuc3RhdHVzID49IDIwMCAmJiByZXEuc3RhdHVzIDwgNDAwKSB7CiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IEpTT04ucGFyc2UocmVxLnJlc3BvbnNlVGV4dCkucmVxdWVzdGVkX2luZm9ybWF0aW9uOwogICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbGlzdFtpXS5jaGFyYWN0ZXJdID0gbGlzdFtpXS5pbXBvcnRhbnRfcmVhZGluZyA9PSAib255b21pIiA/IDEgOiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0KSk7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWxlcnQoImVycm9yIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgcmVxLnNlbmQoKTsKfQo=", 453 428 "storage": { 454 429 "data": {}, 455 430 "ts": 1607436649633 456 431 }, 457 - "enabled": true, 458 - "position": 9, 459 - "file_url": "https://greasyfork.org/scripts/26481-wanikani-katakana-madness/code/WaniKani%20Katakana%20Madness.user.js", 460 - "uuid": "8e97bd94-02cf-48f1-a58b-ff272dd5aadb", 461 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBXYW5pS2FuaSBLYXRha2FuYSBNYWRuZXNzCi8vIEBhdXRob3IgICAgICAgTHVrZS1GaWxld2Fsa2VyCi8vIEBuYW1lc3BhY2UgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9lbi9zY3JpcHRzLzI2NDgxLXdhbmlrYW5pLWthdGFrYW5hLW1hZG5lc3MKLy8gQGluY2x1ZGUgICAgICBodHRwczovL3d3dy53YW5pa2FuaS5jb20vKgovLyBAaW5jbHVkZSAgICAgIGh0dHA6Ly93d3cud2FuaWthbmkuY29tLyoKLy8gQHZlcnNpb24gICAgICAxLjAuOAovLyBAZGVzY3JpcHRpb24gIFRyYW5zZm9ybXMgZXZlcnl0aGluZyByZWxhdGVkIHRvIG9uJ3lvbWkgaW50byBrYXRha2FuYQovLyBAcnVuLWF0ICAgICAgIGRvY3VtZW50LWVuZAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gQGxpY2Vuc2UgICAgICBHUEwgdjMuMAovLyA9PS9Vc2VyU2NyaXB0PT0KCi8qCiogS2FuamkgaW1wb3J0YW50IHJlYWRpbmcgKDE6IG9ueW9taSwgMDoga3VueW9taSkKKiBTYXZlZCBsb2NhbHksIHRvIHVwZGF0ZSBlbnRlciBhcGlLZXkgYW5kIHVzZSBmdW5jdGlvbiBvbiB0aGUgYm90dG9tIG9mIHRoZSBzY3JpcHQKKi8KdmFyIGFwaUtleSA9ICJrZXkiOwp2YXIga2FuamlZb21pUExFQVNBTlQgPSB7IuS4gCI6MSwi5LqMIjoxLCLkuZ0iOjEsIuS4gyI6MSwi5Lq6IjoxLCLlhaUiOjEsIuWFqyI6MSwi5YqbIjoxLCLljYEiOjEsIuS4iSI6MSwi5LiKIjoxLCLkuIsiOjEsIuWPoyI6MSwi5aSnIjoxLCLlpbMiOjEsIuWxsSI6MSwi5bedIjowLCLlt6UiOjEsIuWIgCI6MSwi5ZyfIjoxLCLljYMiOjEsIuWklSI6MCwi5a2QIjoxLCLlsI8iOjEsIuS4gSI6MSwi5LqGIjoxLCLlj4giOjAsIuS4uCI6MCwi5omNIjoxLCLkuK0iOjEsIuS6lCI6MSwi5YWtIjoxLCLlhoYiOjEsIuWkqSI6MSwi5omLIjowLCLmlociOjEsIuaXpSI6MSwi5pyIIjoxLCLmnKgiOjEsIuawtCI6MSwi54GrIjoxLCLniqwiOjAsIueOiyI6MSwi5Ye6IjoxLCLlm5siOjEsIuWPsyI6MSwi5bemIjoxLCLmnKwiOjEsIuatoyI6MSwi55SwIjowLCLnjokiOjAsIueZvSI6MSwi55uuIjowLCLnq4siOjEsIuOAhSI6MCwi5rC3IjowLCLomasiOjAsIuefsyI6MSwi5LiWIjoxLCLkuLsiOjEsIuS7liI6MSwi5LujIjoxLCLlhpkiOjEsIuWOuyI6MSwi5Y+3IjoxLCLlubMiOjEsIuaJkyI6MSwi55SzIjowLCLnmr8iOjAsIuekvCI6MSwi5LyRIjoxLCLlhYgiOjEsIuWQjSI6MSwi5a2XIjoxLCLlubQiOjEsIuaXqSI6MSwi5rCXIjoxLCLnmb4iOjEsIueruSI6MCwi57O4IjowLCLmnZEiOjAsIuiAsyI6MCwi55S3IjoxLCLnlLoiOjEsIuiKsSI6MCwi6KaLIjowLCLosp0iOjAsIui1pCI6MCwi6LazIjoxLCLou4oiOjEsIuS4jSI6MSwi5LuVIjoxLCLlrp0iOjEsIuWkriI6MSwi5LqhIjoxLCLljJYiOjEsIuS4oSI6MSwi5ZywIjoxLCLlhagiOjEsIuWQkSI6MSwi5a6JIjoxLCLlt54iOjEsIuaciSI6MSwi5puyIjoxLCLmrKEiOjEsIuatuyI6MSwi576KIjoxLCLooYAiOjEsIuS6rCI6MSwi5Zu9IjoxLCLlpJwiOjEsIuWmuSI6MSwi5aeJIjoxLCLlupciOjEsIuaYjiI6MSwi5p2xIjoxLCLmrakiOjEsIueUuyI6MSwi55u0IjoxLCLnn6UiOjEsIumVtyI6MSwi5YmNIjoxLCLljZciOjEsIuWupCI6MSwi5b6MIjoxLCLmgJ0iOjEsIuaYnyI6MSwi5rW3IjoxLCLmtLsiOjEsIuenkSI6MSwi54K5IjoxLCLojLYiOjEsIumjnyI6MSwi6aaWIjowLCLnp4EiOjEsIum7hCI6MCwi6buSIjoxLCLmrKAiOjEsIuawjyI6MSwi55SxIjoxLCLmnK0iOjEsIuawkSI6MSwi6L66IjoxLCLku5giOjAsIuS7pSI6MSwi5aSxIjoxLCLlv4UiOjEsIuacqiI6MSwi5pyrIjoxLCLmoKEiOjEsIuWkjyI6MCwi5a62IjoxLCLlvLEiOjEsIuaZgiI6MSwi57SZIjowLCLoqJgiOjEsIumrmCI6MSwi6YCaIjoxLCLlvLciOjEsIuaVmSI6MSwi55CGIjoxLCLntYQiOjEsIuiIuSI6MSwi6YCxIjoxLCLpm6oiOjAsIumtmiI6MSwi6bOlIjoxLCLpoqgiOjEsIumdkiI6MSwi6IKJIjoxLCLnsbMiOjEsIuWFhCI6MSwi55quIjoxLCLkuqQiOjEsIuS8miI6MSwi5YWJIjoxLCLlkIwiOjEsIuWbniI6MSwi5aSaIjoxLCLlvZMiOjEsIuavjiI6MSwi5769IjowLCLogIMiOjEsIuiHqiI6MSwi6ImyIjowLCLooYwiOjEsIuilvyI6MSwi5L2VIjowLCLkvZMiOjEsIuS9nCI6MSwi5ZuzIjoxLCLlo7AiOjAsIuW8nyI6MSwi5b2iIjoxLCLmnaUiOjEsIuekviI6MSwi6KeSIjoxLCLoqIAiOjEsIui1sCI6MSwi6LC3IjowLCLov5EiOjEsIumHjCI6MCwi6bqmIjowLCLlraYiOjEsIuaelyI6MCwi56m6IjoxLCLph5EiOjEsIumbqCI6MCwi6I2JIjowLCLpn7MiOjEsIuaxoCI6MSwi5Y+NIjoxLCLmlK8iOjEsIuS9jyI6MSwi5YqpIjoxLCLlkJsiOjEsIuWMuyI6MSwi5a++IjoxLCLlsYAiOjEsIuaKlSI6MSwi5b25IjoxLCLmsboiOjEsIueptiI6MSwi6LqrIjoxLCLogIUiOjEsIueglCI6MSwi5aC0IjoxLCLmnJ0iOjAsIueVqiI6MSwi562UIjowLCLntbUiOjEsIuiytyI6MCwi6YGTIjoxLCLplpMiOjEsIumbsiI6MCwi5pWwIjoxLCLoqbEiOjEsIualvSI6MSwi5omAIjoxLCLmo64iOjAsIumbuyI6MSwi6aasIjoxLCLkuIciOjEsIuS7iiI6MSwi5YWDIjoxLCLlhawiOjEsIuWGhSI6MSwi5YiGIjoxLCLliIciOjEsIuWPiyI6MSwi5Y2IIjoxLCLlpKoiOjEsIuWwkSI6MSwi5byVIjowLCLlv4MiOjEsIuaIuCI6MCwi5pa5IjoxLCLniZsiOjEsIueItiI6MCwi5q+bIjoxLCLlhqwiOjAsIuWMlyI6MSwi5Y2KIjoxLCLlj6QiOjEsIuWPsCI6MSwi5aSWIjoxLCLluIIiOjEsIuW6gyI6MCwi5q+NIjowLCLnlKgiOjEsIuefoiI6MCwi55SfIjoxLCLmraIiOjEsIuiQvSI6MSwi6IGeIjoxLCLmqKoiOjAsIumAsiI6MSwi6LuiIjoxLCLovrIiOjEsIumJhCI6MSwi6JGJIjowLCLmnIAiOjEsIue1giI6MSwi57+SIjoxLCLmrYwiOjEsIuiqniI6MSwi6KqtIjowLCLps7QiOjAsIue3miI6MSwi6ZuGIjoxLCLpo7IiOjAsIualrSI6MSwi5ryiIjoxLCLlp4siOjEsIui1tyI6MCwi6YCfIjoxLCLphY0iOjEsIumFkiI6MSwi6ZmiIjoxLCLot68iOjEsIui7vSI6MCwi6YGLIjoxLCLplosiOjEsIueulyI6MSwi6aCtIjowLCLoqr8iOjEsIuimqiI6MSwi6aGUIjowLCLnl4UiOjEsIuaxgiI6MSwi5pawIjoxLCLov5QiOjEsIuWumiI6MSwi5aOyIjoxLCLkuosiOjEsIuS9vyI6MSwi5YW3IjoxLCLlj5ciOjEsIuWSjCI6MSwi5a6fIjoxLCLmnI0iOjEsIuazsyI6MCwi54mpIjoxLCLoi6YiOjEsIuihqCI6MSwi6YOoIjoxLCLkuZciOjAsIuWuoiI6MSwi5bGLIjowLCLluqYiOjEsIueVjCI6MSwi5oyBIjoxLCLnmboiOjEsIuebuCI6MSwi55yMIjoxLCLnvo4iOjEsIuiyoCI6MSwi6YCBIjoxLCLph40iOjEsIuirhyI6MSwi6KaBIjoxLCLli50iOjEsIuS7riI6MSwi5LqIIjoxLCLkv50iOjEsIuippiI6MSwi6aiTIjoxfTsKdmFyIGthbmppWW9taVBBSU5GVUwgPSB7IuW7uiI6MSwi54yrIjowLCLlj7giOjEsIuWkqyI6MSwi6aOvIjoxLCLli4ciOjEsIuWNmCI6MSwi5a+6IjowLCLlsqkiOjAsIuaZtCI6MCwi56eLIjowLCLluLAiOjAsIuaYpSI6MCwi5pi8IjowLCLoqIgiOjEsIuWIlyI6MSwi5Yy6IjoxLCLlnYIiOjAsIuS/oSI6MSwi5byPIjoxLCLlpIkiOjEsIuaYqCI6MSwi5q+SIjoxLCLms5UiOjEsIuazoyI6MCwi5rWFIjowLCLoi7EiOjEsIue0gCI6MSwi6LuNIjoxLCLnr4kiOjEsIuS7jyI6MSwi5pmpIjoxLCLkuIgiOjEsIumKgCI6MSwi6KydIjoxLCLnhLYiOjEsIumkiiI6MSwi5oSfIjoxLCLmqYsiOjAsIuipqSI6MSwi6aGMIjoxLCLlrr8iOjEsIumhmCI6MSwi6aeFIjoxLCLlmagiOjEsIuWjqyI6MSwi6KqyIjoxLCLllY8iOjEsIuaVtCI6MSwi5pqXIjoxLCLmp5giOjAsIuemjyI6MSwi57eRIjowLCLnt7QiOjEsIumkqCI6MSwi5YSEIjoxLCLmlpkiOjEsIuaomSI6MSwi5q66IjoxLCLnhrEiOjEsIuizniI6MSwi6YG4IjoxLCLovKoiOjEsIumPoSI6MCwi5oOFIjoxLCLmmKAiOjEsIueWkSI6MSwi55qGIjowLCLmg7MiOjEsIuWDjyI6MSwi5bmyIjoxLCLpnZ4iOjEsIueEoSI6MSwi5pivIjoxLCLntZAiOjEsIue0sCI6MSwi5oKyIjoxLCLolqwiOjEsIuWOnyI6MSwi6by7IjowLCLlgbQiOjAsIuWFtSI6MSwi5aCCIjoxLCLloakiOjAsIuW4rSI6MSwi5pWXIjoxLCLmooUiOjAsIuWboCI6MSwi5bi4IjoxLCLorZgiOjEsIua4iSI6MSwi6JmaIjoxLCLlrpgiOjEsIuWvnyI6MSwi5bqVIjowLCLmhJsiOjEsIue9siI6MSwi6K2mIjoxLCLmgYsiOjEsIuimmiI6MSwi6KqsIjoxLCLlubsiOjEsIuipsyI6MSwi5YqHIjoxLCLllpwiOjEsIuaenCI6MSwi5qCEIjoxLCLoiIwiOjAsIue2miI6MSwi5YqgIjoxLCLnr4AiOjEsIua4myI6MSwi6aCGIjoxLCLlrrkiOjEsIuW4gyI6MSwi5piTIjoxLCLoi6UiOjAsIuiyoSI6MSwi6KmeIjoxLCLmmIYiOjEsIumWpSI6MSwi5q20IjoxLCLlhooiOjEsIuWuhyI6MSwi5a6ZIjoxLCLlv5kiOjEsIuWxpSI6MSwi5ZujIjoxLCLmmrQiOjEsIua3tyI6MSwi5LmxIjoxLCLlvpIiOjEsIuW+lyI6MSwi5pS5IjoxLCLpgKMiOjEsIuWWhCI6MSwi57WhIjoxLCLmr5QiOjEsIuWPsiI6MSwi56ybIjoxLCLoirgiOjEsIuauiyI6MSwi5Y2SIjoxLCLlrowiOjEsIuW/tSI6MSwi5pybIjoxLCLmoLwiOjEsIuiDvSI6MSwi5aalIjoxLCLmnZ8iOjEsIumbsCI6MSwi5p2+IjowLCLkvosiOjEsIuWNlCI6MSwi5Y+CIjoxLCLlkagiOjEsIuWbuiI6MSwi5ZuyIjoxLCLlraMiOjEsIuW4jCI6MSwi5oqYIjoxLCLmnZAiOjEsIue0hCI6MSwi55qEIjoxLCLln7oiOjEsIuaApyI6MSwi5oqAIjoxLCLooZMiOjEsIumqqCI6MSwi6aCRIjoxLCLoqLwiOjEsIumBoCI6MSwi5ZOBIjoxLCLnrJEiOjAsIueVmSI6MSwi5ZySIjoxLCLmm5wiOjEsIuabuCI6MSwi6ZaAIjoxLCLlj5YiOjEsIuS/giI6MSwi5YW4IjoxLCLlrogiOjEsIuW5uCI6MSwi5oClIjoxLCLnnJ8iOjEsIueusSI6MCwi6I23IjowLCLpnaIiOjEsIuW6nCI6MSwi5rK7IjoxLCLmtbQiOjEsIui+niI6MSwi6ZaiIjoxLCLmlL8iOjEsIuW8gSI6MSwi6Zm6IjoxLCLljbEiOjEsIuWtmCI6MSwi5bCCIjoxLCLlhpIiOjEsIuWGlyI6MSwi6ZiqIjoxLCLlk6EiOjEsIumajiI6MSwi5YuJIjoxLCLnrKwiOjEsIumDvSI6MSwi5b6FIjoxLCLmt7EiOjEsIuerpSI6MSwi5bqtIjoxLCLml4UiOjEsIuaguSI6MSwi5rWBIjoxLCLmtogiOjEsIuWAjSI6MSwi5bO2IjowLCLnpa0iOjEsIueroCI6MSwi5YuVIjoxLCLllYYiOjEsIuaCqiI6MSwi5pePIjoxLCLnkIMiOjEsIumZvSI6MSwi5a+SIjowLCLmmpEiOjAsIuacnyI6MSwi5qSNIjoxLCLmra8iOjAsIua4qSI6MSwi5rivIjoxLCLmua8iOjAsIueZuyI6MSwi552AIjoxLCLph44iOjEsIuefrSI6MSwi5rOJIjoxLCLlkIgiOjEsIuaBryI6MSwi5YOVIjoxLCLoqJMiOjEsIuW8kyI6MSwi5ZGKIjoxLCLnqK4iOjEsIumBlCI6MSwi6aGeIjoxLCLloLEiOjEsIuetiSI6MSwi56WIIjoxLCLmsb0iOjEsIuWAnyI6MSwi54S8IjowLCLlv5giOjEsIuW6pyI6MSwi5rSXIjoxLCLog7giOjAsIuWDpyI6MSwi6ISzIjoxLCLnpoUiOjEsIuWPryI6MSwi6KixIjoxLCLmnpoiOjEsIuWPpSI6MSwi6Z2ZIjoxLCLnpoEiOjEsIuWWqyI6MSwi54WZIjoxLCLlpKIiOjEsIueBvSI6MSwi55SjIjoxLCLnqbQiOjAsIuWbsCI6MSwi5qmfIjoxLCLlrrMiOjEsIueOhyI6MSwi6aObIjoxLCLkvZkiOjEsIumboyI6MSwi5aaoIjoxLCLooqsiOjEsIuijlSI6MSwi5bC7IjowLCLpnIciOjEsIuWwviI6MSwi5qKwIjoxLCLnoroiOjEsIuWrjCI6MSwi5YCLIjoxLCLlnKciOjEsIuWcqCI6MSwi5YCSIjoxLCLoh60iOjAsIuWOmiI6MCwi5aa7IjoxLCLorbAiOjEsIueKryI6MSwi572qIjoxLCLpmLIiOjEsIuirliI6MSwi57WMIjoxLCLmiJAiOjEsIuWRsyI6MSwi5L2OIjoxLCLmi74iOjAsIuS8nSI6MSwi6ICBIjoxLCLkvY0iOjEsIuWIqSI6MSwi5YqqIjoxLCLnibkiOjEsIuaUviI6MSwi5LqJIjoxLCLku7IiOjAsIuWFsSI6MSwi5aW9IjoxLCLliJ0iOjEsIuWIpSI6MSwi5Yq0IjoxLCLlkb0iOjEsIuWyuCI6MSwi5piUIjowLCLms6IiOjEsIuazqCI6MSwi6IKyIjoxLCLmjIciOjEsIua0iyI6MSwi56WeIjoxLCLmiKYiOjEsIuenkiI6MSwi57SaIjoxLCLov70iOjAsIuertiI6MSwi6ImvIjoxLCLlip8iOjEsIuS+vyI6MSwi5LukIjoxLCLlg40iOjEsIuaEjyI6MX07CnZhciBrYW5qaVlvbWlERUFUSCA9IHsi5bGFIjoxLCLoo5wiOjEsIumuriI6MSwi6ZmQIjoxLCLkuI4iOjEsIuWQqyI6MSwi5b2xIjoxLCLms4EiOjEsIua4oSI6MCwi6Z+/IjoxLCLnpagiOjEsIuaZryI6MSwi5oqcIjowLCLoqLQiOjEsIuionyI6MSwi6YCuIjoxLCLlgJkiOjEsIuaniyI6MSwi5qihIjoxLCLmjZUiOjEsIuWKuSI6MSwi5bGeIjoxLCLmhaMiOjEsIuixiiI6MSwi5rqAIjoxLCLogqUiOjEsIuW3uyI6MSwi5o2cIjoxLCLntZ4iOjEsIumaoCI6MSwi6LypIjoxLCLmjpsiOjAsIuabvyI6MCwi576pIjoxLCLmlbUiOjEsIua4iCI6MSwi5aeUIjoxLCLmjJkiOjEsIuWItiI6MSwi5YikIjoxLCLli5kiOjEsIuafuyI6MSwi57ePIjoxLCLoqK0iOjEsIuizhyI6MSwi5qipIjoxLCLku7YiOjEsIua0viI6MSwi5bKhIjowLCLntKAiOjEsIuaWrSI6MSwi6KmVIjoxLCLku7siOjEsIuaJuSI6MSwi5qScIjoxLCLlr6kiOjEsIuadoSI6MSwi6LKsIjoxLCLnnIEiOjEsIueojiI6MSwi5aKXIjoxLCLop6MiOjEsIumamyI6MSwi6KqNIjoxLCLkvIEiOjEsIumsvCI6MSwi6Z2pIjoxLCLkv7MiOjEsIuijgSI6MSwi5ZG8IjowLCLlj44iOjEsIuWBnCI6MSwi6IG3IjoxLCLopo8iOjEsIuittyI6MSwi5YmyIjowLCLltI4iOjAsIua8lCI6MSwi5b6LIjoxLCLluKsiOjEsIueciyI6MSwi5rqWIjoxLCLliYciOjEsIuWwjiI6MSwi5YKZIjoxLCLlubkiOjEsIuW8tSI6MSwi5YSqIjoxLCLmsqIiOjEsIuWuhSI6MSwi5pa9IjoxLCLotIUiOjEsIuePviI6MSwi5LmzIjoxLCLln44iOjAsIuengCI6MSwi5oKpIjowLCLmmociOjEsIuiDgyI6MSwi6YOOIjoxLCLmi5siOjEsIuautSI6MSwi6IW5IjoxLCLnl5siOjEsIumAgCI6MSwi5bGIIjoxLCLnuZQiOjEsIuiyuCI6MCwi6L+3IjoxLCLmg5EiOjEsIuiqmCI6MSwi5bCxIjoxLCLnl4ciOjEsIuioqiI6MSwi5oCSIjoxLCLmmIciOjEsIuecoCI6MSwi552hIjoxLCLnt6AiOjEsIui/qyI6MSwi6Z20IjowLCLmv4MiOjEsIuerryI6MSwi5qW1IjoxLCLlgaUiOjEsIumAlCI6MSwi5bq3IjoxLCLntaYiOjEsIumbhCI6MSwi5aiYIjowLCLkub4iOjEsIueboyI6MSwi5p2vIjoxLCLlgqwiOjEsIuS/gyI6MSwi5qynIjoxLCLmsZ8iOjAsIuiriyI6MSwi6Z+TIjoxLCLlo4oiOjEsIuiouiI6MSwi6ZajIjoxLCLlg5oiOjEsIuepjSI6MSwi552jIjoxLCLnlaUiOjEsIuiHoyI6MSwi6IiqIjoxLCLlr4QiOjEsIuadvyI6MSwi6KGXIjoxLCLlrpciOjEsIue3iiI6MSwi5a60IjoxLCLmgZAiOjEsIuaAliI6MSwi5re7IjoxLCLnjJsiOjEsIueDiCI6MSwi57SiIjoxLCLoqbAiOjAsIuelnSI6MSwi5ouFIjoxLCLpoY0iOjEsIuijvSI6MSwi54eDIjoxLCLpgZUiOjAsIui8uCI6MSwi5bGKIjowLCLni60iOjAsIuiCqSI6MCwi6IWVIjowLCLohbAiOjAsIuinpiI6MSwi6KaWIjoxLCLovIkiOjEsIuWxpCI6MSwi5Z6LIjoxLCLluoEiOjEsIuW3riI6MSwi5q2mIjoxLCLnrqEiOjEsIuixoSI6MSwi6YePIjoxLCLlooMiOjEsIueSsCI6MSwi6LOqIjoxLCLov7AiOjEsIuS+myI6MSwi5bGVIjoxLCLosqkiOjEsIuagqiI6MCwi6LOAIjoxLCLlkIQiOjEsIuiqlSI6MSwi572wIjoxLCLohLEiOjEsIumBjiI6MSwi5Z2KIjoxLCLlr50iOjAsIuWuriI6MCwi5qGIIjoxLCLnva4iOjEsIuS+oSI6MSwi6LK7IjoxLCLli6IiOjEsIuWWtiI6MSwi56S6IjoxLCLntbEiOjEsIumgmCI6MSwi562WIjoxLCLol6QiOjAsIuWJryI6MSwi6KazIjoxLCLlgKQiOjEsIuWQuCI6MSwi5ae/IjoxLCLln58iOjEsIuW/nCI6MSwi5o+QIjoxLCLmj7QiOjEsIueKtiI6MSwi5oWLIjoxLCLpgKAiOjEsIuaOiCI6MSwi5Y2wIjoxLCLlibUiOjEsIuW+gCI6MSwi5b6pIjoxLCLovIMiOjEsIuethiI6MSwi6YmbIjoxLCLosq8iOjEsIuaIkSI6MSwi5pWFIjoxLCLpmpwiOjEsIuW+kyI6MSwi5r+AIjoxLCLliLoiOjEsIuWKsSI6MSwi6KiOIjoxLCLpg7UiOjEsIumHnSI6MSwi5b60IjoxLCLmgKoiOjEsIueNoyI6MSwi56qBIjoxLCLoj5MiOjEsIuaysyI6MSwi5rGXIjowLCLmjK8iOjEsIuixmiI6MCwi5YaNIjoxLCLmjqUiOjEsIueLrCI6MSwi5Y2gIjoxLCLlt6giOjEsIuWmmSI6MSwi6bqXIjoxLCLkuKYiOjEsIuWGtyI6MSwi5YemIjoxLCLpgIYiOjEsIuW6qyI6MSwi5YWQIjoxLCLlh40iOjEsIuW5vCI6MSwi56iaIjoxLCLljZoiOjEsIuWlhyI6MSwi5riFIjoxLCLmvZQiOjEsIumMsiI6MSwi5L+uIjoxLCLpmooiOjEsIuWIuCI6MSwi5ammIjoxLCLlvq4iOjEsIuebiiI6MSwi56e7IjoxLCLnsr4iOjEsIueoiyI6MSwi57W2IjoxLCLmhrIiOjEsIuihhiI6MSwi5YKYIjowLCLmtZwiOjAsIuaSgyI6MSwi5pS7IjoxLCLntroiOjEsIumthSI6MSwi57O7IjoxLCLmuIciOjAsIuWpmiI6MSwi6YGKIjoxLCLml5ciOjEsIueFpyI6MSwi5b+rIjoxLCLniYgiOjEsIuiypyI6MSwi5LmPIjoxLCLpgakiOjEsIumgkCI6MSwi5bu2IjoxLCLnv4wiOjEsIuimpyI6MSwi5oeQIjowLCLmirwiOjAsIuabtCI6MSwi5rWuIjowLCLmnpUiOjAsIua8jyI6MSwi56ymIjoxLCLos7wiOjEsIui2iiI6MSwi6aO+IjoxLCLpqJIiOjEsIuiDjCI6MSwi5pKuIjoxLCLnm5ciOjF9Owp2YXIga2FuamlZb21pSEVMTCA9IHsi6b2iIjoxLCLpnIAiOjEsIuWunCI6MCwi57mwIjowLCLpgb8iOjEsIuWmiiI6MSwi5aigIjoxLCLoh7QiOjEsIuWIiiI6MSwi5aWPIjoxLCLkvLQiOjEsIuS9tSI6MSwi5YK+IjoxLCLljbQiOjEsIuWlpSI6MCwi5oWuIjoxLCLmh7giOjEsIuaIvyI6MSwi5omxIjowLCLmipEiOjEsIuaKniI6MSwi5o+PIjoxLCLnm6QiOjEsIue3kiI6MSwi56ewIjoxLCLnt6kiOjAsIuiolyI6MSwi6LOEIjoxLCLos4IiOjEsIui0iCI6MSwi6YCDIjoxLCLpgoQiOjEsIuaLkiI6MSwi6Yi0IjoxLCLpgqYiOjEsIumYnCI6MSwi5bKQIjoxLCLpm4ciOjEsIumahiI6MSwi5o6nIjowLCLlo4EiOjAsIuajiyI6MSwi5riLIjoxLCLnvqQiOjEsIueJhyI6MCwi5LuZIjoxLCLlhYUiOjEsIuWFjSI6MSwi5YunIjoxLCLlnI8iOjEsIuWfiyI6MCwi5Z+8IjowLCLlpaoiOjAsIuW+oSI6MSwi5oWOIjoxLCLnlLIiOjEsIuaeoCI6MCwi5paQIjoxLCLnpYkiOjEsIueosiI6MCwi6KyZIjoxLCLorbIiOjEsIui6jSI6MSwi6YqDIjoxLCLpi7wiOjEsIumghSI6MSwi5aCAIjowLCLpmqMiOjEsIumhpyI6MSwi6aeQIjoxLCLpp4YiOjAsIuWUsSI6MSwi5p+xIjoxLCLlrZ0iOjEsIuS/iiI6MSwi5YW8IjoxLCLlkLkiOjAsIuWJpCI6MSwi5behIjoxLCLmiJIiOjEsIuaOkiI6MSwi5pC6IjoxLCLpi60iOjEsIuaVjyI6MSwi5pW3IjowLCLmrr8iOjEsIueKoCI6MSwi542yIjoxLCLojIIiOjEsIumbhSI6MSwi6aC7IjoxLCLnuYEiOjEsIuauliI6MSwi6KGdIjoxLCLoloQiOjEsIuiqiSI6MSwi6KSSIjoxLCLpgI8iOjEsIuWtqyI6MSwi5a+MIjoxLCLono0iOjEsIumboiI6MSwi57eoIjoxLCLoj68iOjEsIuaXoiI6MSwi5pmuIjoxLCLosaoiOjEsIumRkSI6MSwi6ZmkIjoxLCLlsIsiOjEsIuW5viI6MCwi5buKIjoxLCLmjoMiOjEsIuazpSI6MSwi6amaIjoxLCLmo5IiOjEsIuWYhiI6MSwi5YCJIjoxLCLlt6MiOjAsIuaVkSI6MSwi5bivIjoxLCLlvoQiOjEsIuaVoyI6MSwi57KJIjoxLCLohIgiOjEsIuiPnCI6MSwi6LKoIjoxLCLpmbgiOjEsIuS8vCI6MSwi5aKTIjoxLCLlnYciOjEsIuW+syI6MSwi5o6iIjoxLCLlgbUiOjEsIueUmCI6MCwi5bCGIjoxLCLml6ciOjEsIuWnkyI6MSwi6LK/IjoxLCLnm58iOjEsIumBuiI6MSwi5YK1IjoxLCLkvLgiOjAsIuWPiiI6MSwi5aWIIjoxLCLluYUiOjAsIuW7gyI6MSwi5o+bIjoxLCLmkZgiOjEsIuaguCI6MSwi57iEIjoxLCLmspYiOjAsIua0pSI6MCwi54yuIjoxLCLnmYIiOjEsIue2mSI6MSwi57atIjoxLCLkvI4iOjEsIuiIniI6MSwi6LiPIjoxLCLoiKwiOjEsIumgvCI6MSwi5L6dIjoxLCLoq74iOjEsIum5vyI6MCwi54mZIjoxLCLotoUiOjEsIuWFhiI6MSwi5oqxIjowLCLot6EiOjEsIuaIuyI6MCwi6LezIjoxLCLmmK0iOjEsIua8gSI6MSwi5YSfIjoxLCLli58iOjEsIuWIkSI6MSwi5Z+3IjoxLCLloYEiOjEsIuW0qSI6MSwi5oKjIjoxLCLmipciOjEsIuaKtSI6MSwi5pesIjoxLCLniIYiOjEsIua5viI6MSwi5by+IjoxLCLogbQiOjEsIumBoyI6MSwi6ZeYIjoxLCLpppkiOjEsIumZoyI6MSwi6IeoIjoxLCLliYoiOjEsIuWlkSI6MSwi5o6yIjoxLCLni5kiOjEsIuiRrCI6MSwi5oG1IjoxLCLolLUiOjEsIuewoSI6MSwi6ZaJIjoxLCLoqowiOjEsIueqkyI6MCwi5ZCmIjoxLCLnrYsiOjEsIuWegiI6MSwi5a6jIjoxLCLlsIoiOjEsIuW/oCI6MSwi5ouhIjoxLCLmk40iOjEsIuaVrCI6MSwi54GwIjowLCLnhp8iOjEsIueVsCI6MSwi55qHIjoxLCLnm5siOjEsIueggiI6MSwi5rygIjoxLCLns5YiOjEsIue0jSI6MSwi6IK6IjoxLCLokZciOjEsIuiSuCI6MSwi6KOFIjoxLCLoo48iOjAsIuiruCI6MSwi6LODIjoxLCLmmq4iOjEsIumGpCI6MSwi54KOIjoxLCLnoLQiOjEsIuadiSI6MCwi54aKIjowLCLphaIiOjAsIueNhCI6MSwi6YqFIjoxLCLpgYUiOjEsIua4rCI6MSwi5b2rIjoxLCLoiI4iOjEsIuismyI6MSwi5rueIjoxLCLku4siOjEsIue0uSI6MSwi5bexIjoxLCLljoQiOjEsIuS6gCI6MCwi5LqSIjoxLCLliaMiOjEsIuW9vCI6MCwi5a+/IjoxLCLmgaUiOjAsIuaxgSI6MSwi5ZmMIjoxLCLngroiOjEsIumFlCI6MSwi6Y2LIjowLCLmuZYiOjEsIuaJlSI6MCwi5rK5IjoxLCLkuYUiOjEsIuWNtSI6MCwi6L68IjowLCLluo8iOjEsIuW/lyI6MSwi6L+OIjoxLCLmgakiOjEsIuaOoSI6MSwi5qGcIjowLCLmsLgiOjEsIua2siI6MSwi55y8IjoxLCLnpZYiOjEsIue4viI6MSwi6IiIIjoxLCLooZsiOjEsIuikhyI6MSwi6ZuRIjoxLCLphbgiOjEsIuizmyI6MSwi6YqtIjoxLCLpo7wiOjAsIuWCtyI6MSwi5YWaIjoxLCLljrMiOjEsIuaNqCI6MCwi5a+GIjoxLCLmsZoiOjEsIuaaliI6MSwi5qyyIjoxLCLmnLoiOjAsIuenmCI6MSwi6KizIjoxLCLmn5MiOjEsIueIqiI6MCwi5oudIjoxLCLlpbQiOjEsIuixhiI6MSwi6KqkIjoxLCLoh5MiOjEsIuiytCI6MSwi6ZmNIjoxLCLkuLwiOjEsIuWQkCI6MCwi6Zq3IjoxLCLoiosiOjAsIue4riI6MSwi57SUIjoxLCLnuKYiOjAsIueyiyI6MSwi56OBIjoxLCLntIUiOjEsIuWwhCI6MSwi5bmVIjoxLCLolqYiOjEsIuaPriI6MSwi5o6oIjoxLCLmsr8iOjEsIua6kCI6MSwi5YukIjoxLCLmrZMiOjEsIuaJvyI6MSwi5p6dIjoxLCLmkI0iOjEsIuWIuyI6MSwi6IWQIjoxLCLogZYiOjF9Owp2YXIga2FuamlZb21pUEFSQURJU0UgPSB7IuaPoSI6MSwi57SbIjoxLCLns74iOjEsIuaeoiI6MSwi6Lu4IjoxLCLlhYsiOjEsIuWPjCI6MSwi5YiwIjoxLCLlk7IiOjEsIuWWqiI6MSwi5aCFIjowLCLmi6wiOjEsIuW6iiI6MSwi5bynIjoxLCLmjJEiOjEsIuaOmCI6MSwi5o+6IjoxLCLmj5oiOjEsIuaWjiI6MSwi5p6QIjoxLCLmmqsiOjEsIuaziiI6MSwi5p+EIjowLCLmvZ8iOjAsIua7kSI6MSwi56+EIjoxLCLnhKYiOjEsIue2sSI6MCwi57ayIjoxLCLogp0iOjEsIuiKnSI6MCwi6I2SIjowLCLooosiOjAsIuehrCI6MSwi5puHIjowLCLmvoQiOjEsIuefmyI6MSwi6IKMIjowLCLoiJ8iOjAsIueLqSI6MCwi5Ye2IjoxLCLpkJgiOjEsIuWhiiI6MCwi6aCDIjowLCLohJoiOjEsIumtgiI6MSwi5LqVIjoxLCLkuZ8iOjAsIuWRqiI6MCwi5ayiIjoxLCLmmqYiOjEsIuecuiI6MSwi6LOtIjowLCLoo7giOjEsIueWsiI6MSwi5Y2TIjoxLCLlob4iOjEsIuiPjCI6MSwi56OoIjowLCLpmbAiOjEsIua5vyI6MSwi6ZyKIjoxLCLlq4EiOjAsIueovCI6MSwi5rqdIjoxLCLni4IiOjEsIua7nSI6MCwi57+UIjowLCLloqgiOjAsIumzqSI6MCwi56mPIjoxLCLpiI0iOjEsIumtlCI6MSwi5a+uIjoxLCLmo58iOjEsIuebhiI6MSwi5ZC+IjowLCLmlqwiOjEsIuWvpyI6MSwi5qSFIjoxLCLmrbMiOjEsIua2vCI6MSwi54y/IjowLCLnnrMiOjEsIumNtSI6MCwi6Zu2IjoxLCLnooEiOjEsIuW5vSI6MSwi56efIjoxLCLms6EiOjEsIueZliI6MCwi6Y2bIjoxLCLpjKwiOjEsIuepgiI6MCwi5bidIjoxLCLoj4oiOjEsIueerCI6MSwi6KqHIjoxLCLluoQiOjEsIumYuyI6MSwi5L+1IjoxLCLpu5kiOjEsIue2vyI6MSwi5p62IjoxLCLlrZQiOjEsIuWUhyI6MCwi56CVIjoxLCLnspgiOjEsIueypyI6MSwi5qy6IjoxLCLoqZAiOjEsIumcpyI6MCwi5p+zIjoxLCLkvIoiOjEsIuS9kCI6MSwi556tIjoxLCLlsLoiOjEsIuWTgCI6MSwi5aGAIjoxLCLlpoIiOjEsIuWinCI6MSwi5amGIjoxLCLltJYiOjEsIuW4vSI6MSwi5bmjIjoxLCLmgagiOjEsIuaGjiI6MSwi5oapIjoxLCLmiYciOjEsIuaJiSI6MSwi5o6MIjoxLCLmjL8iOjEsIua7tCI6MSwi54KKIjoxLCLnlbMiOjEsIueIvSI6MCwi5664IjowLCLoiq8iOjEsIuiDtCI6MSwi6Jm5IjowLCLlt74iOjEsIumcnCI6MCwi6JqKIjowLCLpqI4iOjEsIuW4syI6MSwi6JuHIjowLCLovrEiOjEsIuiyvCI6MCwi6YmiIjoxLCLpl4ciOjAsIumamSI6MCwi6aOiIjoxLCLppJMiOjEsIueVnCI6MSwi6L+FIjoxLCLok4QiOjEsIuWwvSI6MSwi5b2pIjoxLCLmurYiOjEsIuaGtiI6MSwi6ICQIjoxLCLouIoiOjAsIuizoiI6MSwi6LydIjoxLCLnga8iOjEsIuiEhSI6MSwi6bq7IjoxLCLlkrIiOjAsIuaClCI6MSwi5Z+5IjoxLCLohIciOjAsIumBgiI6MSwi5aGXIjoxLCLnj60iOjEsIuaWnCI6MSwi5q60IjoxLCLnm74iOjEsIuepqyI6MSwi6ba0IjowLCLmt6EiOjEsIue0qyI6MSwi6aeSIjowLCLmir0iOjEsIuiqkyI6MSwi5oKfIjoxLCLmi5MiOjEsIuaLmCI6MSwi56SOIjoxLCLliIgiOjAsIuWJmyI6MSwi5ZSvIjoxLCLlsLwiOjEsIuWjhyI6MSwi5qaCIjoxLCLmtbgiOjEsIueFriI6MCwi6KaGIjoxLCLorIAiOjEsIumalCI6MSwi6Zm2IjoxLCLkv5ciOjEsIuW+gSI6MSwi6ZmbIjoxLCLmoZEiOjAsIua9pCI6MSwi54+gIjoxLCLoobAiOjEsIuWKoyI6MSwi5aWoIjoxLCLli5giOjEsIuWmgyI6MSwi6YKqIjoxLCLmkKwiOjEsIuWisyI6MSwi5b2wIjoxLCLpp4QiOjEsIuW7tyI6MSwi6KiCIjoxLCLlo64iOjEsIua8giI6MSwi6bCQIjowLCLon7kiOjAsIuewvyI6MSwi5pm2IjoxLCLou4wiOjEsIua2ryI6MSwi5benIjoxLCLls7AiOjEsIuWUkCI6MSwi6ayxIjoxLCLmvKsiOjEsIuirriI6MSwi6YqYIjoxLCLloLAiOjAsIuWgpCI6MSwi57+7IjoxLCLlkI4iOjEsIuWlriI6MSwi5LuwIjoxLCLkuq0iOjEsIuS8ryI6MSwi5YG2IjoxLCLmt4AiOjAsIuaKiiI6MSwi5rSeIjoxLCLnlqsiOjEsIuijgiI6MSwi57GNIjoxLCLmn5QiOjEsIuayiCI6MSwi5rK8IjowLCLoqrAiOjAsIuilsiI6MSwi6LKiIjoxLCLotqMiOjEsIui3nSI6MSwi5pyXIjoxLCLljbMiOjEsIuaXqCI6MSwi5aiBIjoxLCLnrZIiOjEsIuePjSI6MSwi6ZyyIjoxLCLliLciOjEsIueJpyI6MSwi5r2uIjoxLCLlnqMiOjAsIuWwgSI6MSwi5bKzIjoxLCLmhbAiOjEsIuaHhyI6MSwi5oeyIjoxLCLmkakiOjEsIuaTpiI6MSwi5paJIjoxLCLmkrIiOjEsIua7hSI6MSwi5rOwIjoxLCLngokiOjEsIua7iyI6MSwi55C0IjowLCLoh7MiOjEsIuWEgCI6MSwi6JmOIjowLCLpgZwiOjEsIuS8uiI6MCwi5b65IjoxLCLngKwiOjAsIuaOqiI6MSwi5pKkIjoxLCLmi6AiOjEsIuaouSI6MSwi5qOEIjoxLCLom40iOjAsIuicgiI6MCwi6YWOIjoxLCLonJwiOjEsIuWinyI6MSwi5r2cIjoxLCLoiaYiOjEsIuaLsyI6MSwi54KtIjoxLCLnlZEiOjAsIuS7gSI6MSwi5YyFIjoxLCLooaMiOjEsIumJsSI6MSwi6KqgIjoxLCLpg7ciOjEsIuS+tSI6MSwi5YG9IjoxLCLpm7ciOjEsIui+myI6MSwi57KSIjoxLCLkuJgiOjEsIuWoryI6MSwi5paXIjoxLCLorI4iOjAsIuacsSI6MSwi5aGUIjoxLCLpq6oiOjAsIuegsiI6MSwi5a+4IjoxLCLnq5wiOjEsIue4gSI6MSwi57+8IjoxLCLlkIkiOjEsIuWIgyI6MCwi5b+NIjoxLCLmoYMiOjAsIuS+jSI6MCwi5L+6IjowLCLlj7EiOjAsIuaiqCI6MCwi5Yy5IjowLCLph6MiOjAsIuWPqyI6MSwi56ygIjowLCLltZAiOjAsIue8tiI6MSwi5raZIjoxLCLmo5oiOjAsIuWnqyI6MCwi6Iq9IjowfTsKdmFyIGthbmppWW9taVJFQUxJVFkgPSB7Iui7kiI6MSwi5aqbIjowLCLnjoQiOjEsIuWBiSI6MSwi6aCCIjoxLCLlj6wiOjEsIuaeryI6MSwi5oyfIjowLCLmsrgiOjEsIua/ryI6MSwi54elIjoxLCLnk7YiOjEsIuiCryI6MSwi6ICVIjoxLCLohIIiOjEsIuiGmiI6MSwi6LufIjoxLCLpg4oiOjEsIumahSI6MCwi6Zq7IjoxLCLpgrgiOjEsIua4piI6MSwi6YOhIjoxLCLph4giOjEsIuiCqiI6MSwi5ZaaIjoxLCLosp4iOjEsIuiLlyI6MSwi5oWIIjoxLCLopZ8iOjAsIuiTriI6MSwi6IGhIjoxLCLkuq4iOjEsIua1piI6MCwi5aGaIjowLCLmvLgiOjAsIuiXuyI6MSwi5aaEIjoxLCLlgLkiOjEsIueLkCI6MCwi6YCdIjoxLCLljL8iOjEsIuWvoSI6MSwi55eiIjoxLCLol40iOjAsIuWdkSI6MSwi55WUIjoxLCLllIQiOjAsIuaLtyI6MSwi5riTIjoxLCLlu4kiOjEsIuisuSI6MSwi5rmnIjoxLCLphpwiOjEsIuWNhyI6MCwi5q6JIjoxLCLnhakiOjEsIuWKviI6MSwi5qGfIjoxLCLlqb8iOjAsIuaFlSI6MSwi5723IjoxLCLnn68iOjEsIuWbmiI6MSwi5p+QIjoxLCLms4wiOjEsIuibriI6MSwi5bq2IjoxLCLpr6giOjEsIuiNmCI6MSwi5qC9IjoxLCLlhqAiOjEsIuaLkCI6MSwi5YuyIjoxLCLphawiOjEsIuashCI6MSwi57SLIjoxLCLljbgiOjAsIumAuCI6MSwi5bCaIjoxLCLpoZUiOjEsIueymyI6MSwi5oSaIjoxLCLot7UiOjEsIuWRiCI6MSwi55aOIjoxLCLnlr4iOjEsIuisoSI6MSwi6Y6MIjowLCLphbciOjEsIuWPmSI6MSwi5LiUIjowLCLnl7QiOjEsIuWRhiI6MSwi5ZO6IjoxLCLmgqAiOjEsIuWCsiI6MSwi6IyOIjowLCLpmL8iOjEsIuadjyI6MSwi6IycIjowLCLmoJ4iOjAsIuS8jyI6MSwi6Y6uIjoxLCLlpYkiOjEsIuaGgiI6MSwi5qCDIjowLCLmnLQiOjEsIue0ryI6MSwi5oOcIjoxLCLkvbMiOjEsIuaCvCI6MSwi6KmyIjoxLCLotbQiOjEsIumrhCI6MSwi5YKNIjoxLCLnmZIiOjEsIumDrSI6MSwi5bC/IjoxLCLomZwiOjEsIuizkyI6MSwi5oa+IjoxLCLlvKUiOjAsIueylyI6MSwi5b6qIjoxLCLohIoiOjEsIuWHnSI6MSwi5piMIjoxLCLml6YiOjEsIuaEiSI6MSwi5qCTIjoxLCLmirkiOjEsIuS5iyI6MCwi6b6NIjoxLCLnkZsiOjEsIumBvCI6MSwi6YKjIjoxLCLlr4IiOjEsIuW6uCI6MSwi5ouNIjoxLCLnjLYiOjEsIuWusCI6MSwi57irIjoxLCLlkYkiOjEsIuWHoSI6MSwi5oGtIjowLCLpjK8iOjEsIuepgCI6MSwi5byKIjoxLCLpmbUiOjEsIuiItiI6MSwi5oKmIjoxLCLnqq4iOjEsIue4myI6MSwi6L2EIjoxLCLlvKYiOjEsIua0qiI6MSwi56qSIjoxLCLmkYIiOjEsIumjvSI6MSwi6Z2WIjowLCLntLMiOjEsIuWYiSI6MSwi5pC+IjoxLCLonbYiOjEsIueikSI6MSwi5bCJIjoxLCLljKAiOjEsIuWHmyI6MSwi6YGlIjowLCLmmboiOjEsIuaftCI6MCwi55GgIjoxLCLmlaIiOjEsIualkyI6MSwi5Ye5IjoxLCLlh7giOjEsIuiQjCI6MSwi54OPIjowLCLos4oiOjEsIuaXiyI6MSwi6byTIjoxLCLohbgiOjEsIuanvSI6MSwi5LyQIjoxLCLloJUiOjEsIua8rCI6MCwi5Z2qIjowLCLntLoiOjEsIue+hSI6MSwi5bOhIjoxLCLkv7giOjEsIumGuCI6MSwi5byUIjoxLCLkuZkiOjEsIuihoSI6MSwi6YGNIjoxLCLmrL4iOjEsIumWsiI6MSwi5ZadIjoxLCLohpwiOjEsIuebsiI6MSwi6YW1IjoxLCLog44iOjEsIumBriI6MSwi5ZOJIjowLCLokrwiOjEsIuWHhiI6MSwi5a+bIjoxLCLog54iOjEsIua1hCI6MSwi6ZqPIjoxLCLnqL8iOjEsIuS4uSI6MSwi5aOMIjoxLCLoiJciOjEsIumosCI6MSwi57evIjoxLCLoiYciOjEsIuaKqyI6MSwi6YymIjowLCLlibAiOjEsIue5iiI6MSwi6KutIjoxLCLmg6giOjEsIuiZkCI6MSwi5o2uIjowLCLlvpAiOjEsIuaQrSI6MSwi6JKZIjoxLCLnk5wiOjEsIumviSI6MCwi5oi0IjoxLCLnt4siOjEsIuabmSI6MCwi6IOhIjoxLCLluKUiOjEsIuWVkyI6MSwi6JG1IjowLCLpp78iOjEsIuirkiI6MSwi6I6JIjoxLCLpgYciOjEsIumZpSI6MSwi6LKrIjoxLCLopociOjEsIuiMqCI6MCwi5ZGCIjoxLCLmk4EiOjEsIuWtpCI6MSwi6Y6WIjoxLCLos6AiOjEsIuWZtCI6MSwi56WlIjoxLCLnibIiOjEsIuWUhiI6MSwi56epIjoxLCLohqgiOjEsIuiKsyI6MSwi5oGSIjoxLCLlgKsiOjEsIumZsyI6MSwi6aCIIjoxLCLlgY8iOjEsIuezpyI6MSwi5q6KIjoxLCLmhaIiOjEsIuayoSI6MSwi5oCgIjoxLCLpga0iOjEsIuaDsCI6MSwi54yfIjoxLCLkuYMiOjEsIumiryI6MSwi57a+IjoxLCLpmrwiOjAsIui8lCI6MCwi56GrIjoxLCLotaYiOjEsIueqgyI6MSwi5oWoIjoxLCLmiK8iOjEsIuaJtiI6MSwi5r+BIjoxLCLlpZQiOjEsIuiCliI6MSwi5py9IjoxLCLkuqsiOjEsIuauuyI6MSwi6JepIjoxLCLpto8iOjEsIuWqkiI6MSwi5ZixIjoxLCLmpI4iOjEsIui/rSI6MSwi57W5IjoxLCLpmaoiOjEsIuitnCI6MSwi5YmWIjoxLCLmt5EiOjEsIuW4hiI6MSwi6YWMIjoxLCLmhqQiOjEsIuaagSI6MCwi5YKRIjoxLCLpjKAiOjEsIuWHjCI6MCwi55GeIjowLCLoj4UiOjAsIueSgyI6MSwi5ryjIjoxLCLlkJ8iOjEsIuS+riI6MSwi6YuzIjoxLCLolJEiOjEsIuiDhiI6MSwi5rWqIjoxLCLnpo0iOjEsIumFqiI6MSwi5oanIjowLCLkupwiOjEsIuaFtiI6MSwi5qKTIjowLCLmsbAiOjEsIuaymSI6MSwi5b+MIjoxLCLpgbciOjEsIuaLmSI6MSwi56+kIjoxLCLls6AiOjAsIuWPlCI6MCwi6ZuMIjowLCLloKoiOjAsIuW0hyI6MSwi55SaIjoxLCLmvIYiOjEsIuWyrCI6MCwi57ShIjoxLCLnpIEiOjEsIuWxryI6MSwi5ae7IjoxLCLnnaYiOjEsIuaTrCI6MSwi6ZaRIjoxLCLmm7kiOjEsIuWNkSI6MSwi6KmgIjoxfTsKCi8qCiogVXNlZCBmb3Igc3dpdGNoaW5nIGJldHdlZW4gaGlyYSBhbmQga2F0YSAodmljZSB2ZXJzYSkKKi8KdmFyIGhpcmFUb0thdGEgPSB7IuOCgSI6ICLjg6EiLCAi44KAIjogIuODoCIsICLjgoMiOiAi44OjIiwgIuOCgiI6ICLjg6IiLCAi44KFIjogIuODpSIsICLjgoQiOiAi44OkIiwgIuOChyI6ICLjg6ciLCAi44KGIjogIuODpiIsICLjgokiOiAi44OpIiwgIuOCiCI6ICLjg6giLCAi44KLIjogIuODqyIsICLjgooiOiAi44OqIiwgIuOCjSI6ICLjg60iLCAi44KMIjogIuODrCIsICLjgo8iOiAi44OvIiwgIuOCkyI6ICLjg7MiLCAi44KSIjogIuODsiIsICLjgYIiOiAi44KiIiwgIuOBhCI6ICLjgqQiLCAi44GGIjogIuOCpiIsICLjgYgiOiAi44KoIiwgIuOBiyI6ICLjgqsiLCAi44GKIjogIuOCqiIsICLjgY0iOiAi44KtIiwgIuOBjCI6ICLjgqwiLCAi44GPIjogIuOCryIsICLjgY4iOiAi44KuIiwgIuOBkSI6ICLjgrEiLCAi44GQIjogIuOCsCIsICLjgZMiOiAi44KzIiwgIuOBkiI6ICLjgrIiLCAi44GVIjogIuOCtSIsICLjgZQiOiAi44K0IiwgIuOBlyI6ICLjgrciLCAi44GWIjogIuOCtiIsICLjgZkiOiAi44K5IiwgIuOBmCI6ICLjgrgiLCAi44GbIjogIuOCuyIsICLjgZoiOiAi44K6IiwgIuOBnSI6ICLjgr0iLCAi44GcIjogIuOCvCIsICLjgZ8iOiAi44K/IiwgIuOBniI6ICLjgr4iLCAi44GhIjogIuODgSIsICLjgaAiOiAi44OAIiwgIuOBoyI6ICLjg4MiLCAi44GiIjogIuODgiIsICLjgaUiOiAi44OFIiwgIuOBpCI6ICLjg4QiLCAi44GnIjogIuODhyIsICLjgaYiOiAi44OGIiwgIuOBqSI6ICLjg4kiLCAi44GoIjogIuODiCIsICLjgasiOiAi44OLIiwgIuOBqiI6ICLjg4oiLCAi44GtIjogIuODjSIsICLjgawiOiAi44OMIiwgIuOBryI6ICLjg48iLCAi44GuIjogIuODjiIsICLjgbEiOiAi44ORIiwgIuOBsCI6ICLjg5AiLCAi44GzIjogIuODkyIsICLjgbIiOiAi44OSIiwgIuOBtSI6ICLjg5UiLCAi44G0IjogIuODlCIsICLjgbciOiAi44OXIiwgIuOBtiI6ICLjg5YiLCAi44G5IjogIuODmSIsICLjgbgiOiAi44OYIiwgIuOBuyI6ICLjg5siLCAi44G6IjogIuODmiIsICLjgb0iOiAi44OdIiwgIuOBvCI6ICLjg5wiLCAi44G/IjogIuODnyIsICLjgb4iOiAi44OeIn07CnZhciBrYXRhVG9IaXJhID0geyLjg6EiOiAi44KBIiwgIuODoCI6ICLjgoAiLCAi44OjIjogIuOCgyIsICLjg6IiOiAi44KCIiwgIuODpSI6ICLjgoUiLCAi44OkIjogIuOChCIsICLjg6ciOiAi44KHIiwgIuODpiI6ICLjgoYiLCAi44OpIjogIuOCiSIsICLjg6giOiAi44KIIiwgIuODqyI6ICLjgosiLCAi44OqIjogIuOCiiIsICLjg60iOiAi44KNIiwgIuODrCI6ICLjgowiLCAi44OvIjogIuOCjyIsICLjg7MiOiAi44KTIiwgIuODsiI6ICLjgpIiLCAi44KiIjogIuOBgiIsICLjgqQiOiAi44GEIiwgIuOCpiI6ICLjgYYiLCAi44KoIjogIuOBiCIsICLjgqsiOiAi44GLIiwgIuOCqiI6ICLjgYoiLCAi44KtIjogIuOBjSIsICLjgqwiOiAi44GMIiwgIuOCryI6ICLjgY8iLCAi44KuIjogIuOBjiIsICLjgrEiOiAi44GRIiwgIuOCsCI6ICLjgZAiLCAi44KzIjogIuOBkyIsICLjgrIiOiAi44GSIiwgIuOCtSI6ICLjgZUiLCAi44K0IjogIuOBlCIsICLjgrciOiAi44GXIiwgIuOCtiI6ICLjgZYiLCAi44K5IjogIuOBmSIsICLjgrgiOiAi44GYIiwgIuOCuyI6ICLjgZsiLCAi44K6IjogIuOBmiIsICLjgr0iOiAi44GdIiwgIuOCvCI6ICLjgZwiLCAi44K/IjogIuOBnyIsICLjgr4iOiAi44GeIiwgIuODgSI6ICLjgaEiLCAi44OAIjogIuOBoCIsICLjg4MiOiAi44GjIiwgIuODgiI6ICLjgaIiLCAi44OFIjogIuOBpSIsICLjg4QiOiAi44GkIiwgIuODhyI6ICLjgaciLCAi44OGIjogIuOBpiIsICLjg4kiOiAi44GpIiwgIuODiCI6ICLjgagiLCAi44OLIjogIuOBqyIsICLjg4oiOiAi44GqIiwgIuODjSI6ICLjga0iLCAi44OMIjogIuOBrCIsICLjg48iOiAi44GvIiwgIuODjiI6ICLjga4iLCAi44ORIjogIuOBsSIsICLjg5AiOiAi44GwIiwgIuODkyI6ICLjgbMiLCAi44OSIjogIuOBsiIsICLjg5UiOiAi44G1IiwgIuODlCI6ICLjgbQiLCAi44OXIjogIuOBtyIsICLjg5YiOiAi44G2IiwgIuODmSI6ICLjgbkiLCAi44OYIjogIuOBuCIsICLjg5siOiAi44G7IiwgIuODmiI6ICLjgboiLCAi44OdIjogIuOBvSIsICLjg5wiOiAi44G8IiwgIuODnyI6ICLjgb8iLCAi44OeIjogIuOBviJ9OwoKaWYgKC9kYXNoYm9hcmQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCBkb2N1bWVudC5VUkwgPT0gImh0dHA6Ly93d3cud2FuaWthbmkuY29tLyIgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwczovL3d3dy53YW5pa2FuaS5jb20vIikgLy8gSG9tZXBhZ2UKewogICAgdmFyIHJlcGxhY2VQb3B1cCA9IGZ1bmN0aW9uKCkKICAgIHsKICAgICAgICBpZiAoIGlzT255b21pQWxsKCQodGhpcykudGV4dCgpKSA9PSAxKSAkKHRoaXMpLmF0dHIoKCdkYXRhLW9yaWdpbmFsLXRpdGxlJyksIGNvbnZlcnRUb0thdGEoJCh0aGlzKS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRpdGxlJykpICk7CiAgICB9OwogICAgJCgnLmxhdHRpY2Utc2luZ2xlLWNoYXJhY3RlciBhW2RhdGEtb3JpZ2luYWwtdGl0bGVdJykuZWFjaChyZXBsYWNlUG9wdXApOwoKICAgIC8vIHRoaXMgaXMgZm9yIHNjcmlwdHMgd2hvIG1vZGlmeSB0aGUgaG9tZXNjcmVlbiBhZnRlciB0aGUgcGFnZSBmaW5pc2hlZCBsb2FkaW5nCiAgICAkKCcua2FuamktcHJvZ3Jlc3MgLmxhdHRpY2Utc2luZ2xlLWNoYXJhY3RlciAuc21hbGwtY2FwcyA+IHNwYW4nKS5iaW5kKCJET01TdWJ0cmVlTW9kaWZpZWQiLGZ1bmN0aW9uKCl7CiAgICAgICAgJCgnLmthbmppLXByb2dyZXNzIC5sYXR0aWNlLXNpbmdsZS1jaGFyYWN0ZXIgYVtkYXRhLW9yaWdpbmFsLXRpdGxlXScpLmVhY2gocmVwbGFjZVBvcHVwKTsKICAgIH0pOwoKfQplbHNlIGlmICgvXC9sYXR0aWNlXC9rYW5qaS8udGVzdChkb2N1bWVudC5VUkwpKSAvLyBMYXR0aWNlCnsKICAgIHZhciByZXBsYWNlUG9wdXAgPSBmdW5jdGlvbigpCiAgICB7CiAgICAgICAgaWYgKCBpc09ueW9taUFsbCgkKHRoaXMpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5hdHRyKCgnZGF0YS1vcmlnaW5hbC10aXRsZScpLCBjb252ZXJ0VG9LYXRhKCQodGhpcykuYXR0cignZGF0YS1vcmlnaW5hbC10aXRsZScpKSApOwogICAgfTsKICAgICQoJy5sYXR0aWNlLXNpbmdsZS1jaGFyYWN0ZXIgYVtkYXRhLW9yaWdpbmFsLXRpdGxlXScpLmVhY2gocmVwbGFjZVBvcHVwKTsKCn0KZWxzZSBpZiAoL1wva2FuamlcLy8udGVzdChkb2N1bWVudC5VUkwpKSAvLyBLYW5qaSBkZXRhaWwgcGFnZQp7CiAgICB2YXIgcmVwbGFjZVJlYWRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoJCh0aGlzKS5jaGlsZHJlbignaDMnKS50ZXh0KCkgPT0gIk9u4oCZeW9taSIpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMpLmNoaWxkcmVuKCdwJykudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuY2hpbGRyZW4oJ3AnKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnLnNwYW40JykuZWFjaChyZXBsYWNlUmVhZGluZyk7CgogICAgLy8tLS0tLS0tLS0gVmlzdWFsbHkgU2ltaWxhciBLYW5qaSAtLS0tLS0tLS0vLwogICAgdmFyIHJlcGxhY2VTaW1pbGFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGlzT255b21pQWxsKCQodGhpcykuZmluZCgnLmNoYXJhY3RlcicpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VTaW1pbGFyKTsKfQplbHNlIGlmICgvXC9rYW5qaVw/ZGlmZmljdWx0Ly50ZXN0KGRvY3VtZW50LlVSTCkgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwOi8vd3d3LndhbmlrYW5pLmNvbS9rYW5qaSIpIC8vIEJpZyBrYW5qaSBwYWdlIGJhc2VkIG9uIGRpZmZpY3VsdHkKewogICAgdmFyIG4gPSBkb2N1bWVudC5VUkwubGFzdEluZGV4T2YoJz0nKTsKICAgIHZhciBkaWZmaWN1bHR5ID0gZG9jdW1lbnQuVVJMLnN1YnN0cmluZyhuICsgMSk7CgogICAgdmFyIHJlcGxhY2VMZXZlbFBvcnRpb24gPSBmdW5jdGlvbigpIHsKICAgICAgICAkKHRoaXMpLmZpbmQoJy5jaGFyYWN0ZXItaXRlbScpLmVhY2gocmVwbGFjZVJlYWRpbmcpOwogICAgfTsKCiAgICB2YXIgcmVwbGFjZVJlYWRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoaXNPbnlvbWkoJCh0aGlzKS5maW5kKCcuY2hhcmFjdGVyJykudGV4dCgpLnJlcGxhY2UoL1xzL2csJycpLCBkaWZmaWN1bHR5KSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmVhY2gocmVwbGFjZUxldmVsUG9ydGlvbik7Cn0KZWxzZSBpZiAoL1wvcmFkaWNhbHNcLy8udGVzdChkb2N1bWVudC5VUkwpIHx8wqAvXC92b2NhYnVsYXJ5XC8vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gUmFkaWNhbCBhbmQgVm9jYWJ1bGFyeSBwYWdlCnsKICAgIC8vLS0tLS0tLS0tIEZvdW5kIEluIGFuZCBVdGlsaXplZCBLYW5qaSAtLS0tLS0tLS0vLwogICAgdmFyIHJlcGxhY2VSZWFkaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGlzT255b21pQWxsKCQodGhpcykuZmluZCgnLmNoYXJhY3RlcicpLnRleHQoKSkgPT0gMSkgJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoY29udmVydFRvS2F0YSgkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dCgpKSk7CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VSZWFkaW5nKTsKfQplbHNlIGlmICgvXC9sZXZlbFwvLy50ZXN0KGRvY3VtZW50LlVSTCkpIC8vIExldmVsIHBhZ2UKewogICAgdmFyIG4gPSBkb2N1bWVudC5VUkwubGFzdEluZGV4T2YoJy8nKTsKICAgIHZhciBsZXZlbCA9IGRvY3VtZW50LlVSTC5zdWJzdHJpbmcobiArIDEpOwoKICAgIHZhciByZXBsYWNlUmVhZGluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChpc09ueW9taSgkKHRoaXMpLmNoaWxkcmVuKCcuY2hhcmFjdGVyJykudGV4dCgpLnJlcGxhY2UoL1xzL2csJycpLCBsZXZlbCkpCiAgICAgICAgewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgwKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnLnNpbmdsZS1jaGFyYWN0ZXItZ3JpZCcpLmVxKDEpLmZpbmQoJ2EnKS5lYWNoKHJlcGxhY2VSZWFkaW5nKTsKfQplbHNlIGlmICgvcmV2aWV3XC9zZXNzaW9uLy50ZXN0KGRvY3VtZW50LlVSTCkpIC8vIFJldmlldyB0ZXN0IHBhZ2UKewogICAgYW5zd2VyQ2hlY2tlci5vbGRJc0FzY2lpUHJlc2VudEtNID0gYW5zd2VyQ2hlY2tlci5pc0FzY2lpUHJlc2VudDsKICAgIGFuc3dlckNoZWNrZXIuaXNBc2NpaVByZXNlbnQgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgLy8gdGhpcyBpcyBmb3IgdHJhaWxpbmcgTiB0byDjg7MKICAgICAgICBpZihlW2UubGVuZ3RoLTFdID09PSAnTicpIHsKICAgICAgICAgICAgZSA9IGUuc3Vic3RyKDAsIGUubGVuZ3RoLTEpICsgJ+ODsycgKyBlLnN1YnN0cihlLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbnN3ZXJDaGVja2VyLm9sZElzQXNjaWlQcmVzZW50S00oZSk7CiAgICB9OwoKICAgIGFuc3dlckNoZWNrZXIub2xkRXZhbHVhdGVLTSA9IGFuc3dlckNoZWNrZXIuZXZhbHVhdGU7CiAgICBhbnN3ZXJDaGVja2VyLmV2YWx1YXRlID0gZnVuY3Rpb24oZSx0KSB7CiAgICAgICAgLy9jb25zb2xlLmxvZygkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKSk7CiAgICAgICAgLy8gdGhpcyBpcyBmb3IgdHJhaWxpbmcgTiB0byDjg7MKICAgICAgICBpZihlID09PSAicmVhZGluZyIgJiYgdFt0Lmxlbmd0aC0xXSA9PT0gJ04nKSB7CiAgICAgICAgICAgIHQgPSB0LnN1YnN0cigwLCB0Lmxlbmd0aC0xKSArICfjg7MnICsgdC5zdWJzdHIodC5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICBpZihpc09ueW9taVJldmlldygpKSB7CiAgICAgICAgICAgIC8vIHRoaXMgaXMgZm9yIHRoZSAiV2FuaUthbmkgaXMgbG9va2luZyBmb3IgdGhlIG9ueW9taSByZWFkaW5nIiBmdW5jdGlvbgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8ICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpLmt1bi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qU3RvcmFnZS5nZXQoJ2N1cnJlbnRJdGVtJykua3VuW2ldID0gY29udmVydFRvS2F0YSgkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKS5rdW5baV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJC5qU3RvcmFnZS5nZXQoJ2N1cnJlbnRJdGVtJykub24ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpLm9uW2ldID0gY29udmVydFRvS2F0YSgkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKS5vbltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy9jb25zb2xlLmxvZygkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKSk7CiAgICAgICAgcmV0dXJuIGFuc3dlckNoZWNrZXIub2xkRXZhbHVhdGVLTShlLHQpOwogICAgfTsKCiAgICAkKCcjdXNlci1yZXNwb25zZScpLm9uKCdpbnB1dCcsIGZ1bmN0aW9uKCkgewogICAgICAgIGlmKGlzT255b21pUmV2aWV3KCkpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGNvbnZlcnRUb0thdGEoJCh0aGlzKS52YWwoKS50b1VwcGVyQ2FzZSgpKTsKICAgICAgICB9CiAgICB9KTsKCiAgICB2YXIgb2JzZXJ2ZU1lID0gJCgnI2l0ZW0taW5mbyAucHVyZS11LTEtNCcpWzBdOwogICAgb2JzZXJ2ZURPTSgpKCBvYnNlcnZlTWUgLGZ1bmN0aW9uKCkgewogICAgICAgIGlmKGlzT255b21pUmV2aWV3KCkpIHsKICAgICAgICAgICAgJCgnI2l0ZW0taW5mby1yZWFkaW5nID4gc3BhbicpLnRleHQoY29udmVydFRvS2F0YSgkKCcjaXRlbS1pbmZvLXJlYWRpbmcgPiBzcGFuJykudGV4dCgpKSk7CiAgICAgICAgfQogICAgfSk7CgogICAgLy8gY2hhbmdlIGxhc3QgMTAgaXRlbXMKICAgIHZhciBsYXN0MTBDaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYoaXNPbnlvbWlBbGwoJCh0aGlzKS5maW5kKCdsaScpLmVxKDApLnRleHQoKSkpewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMSkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgxKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgdmFyIG9ic2VydmVNZSA9ICQoJyNsYXN0LWl0ZW1zLWxpc3QnKVswXTsKICAgIG9ic2VydmVET00oKSggb2JzZXJ2ZU1lICxmdW5jdGlvbigpIHsKICAgICAgICAkKCcjbGFzdC1pdGVtcy1saXN0IC5rYW5qaScpLmVhY2gobGFzdDEwQ2hhbmdlKTsKICAgIH0pOwp9CmVsc2UgaWYgKC9yZXZpZXcvLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gUmV2aWV3IGluZm8gcGFnZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIGEgcmV2aWV3CnsKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcjcmV2aWV3cy1zdW1tYXJ5JylbMF07CiAgICBvYnNlcnZlRE9NKCkoIG9ic2VydmVNZSAsZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGUgPSAkKCcua2FuamkgLmhvdmVyJyk7CiAgICAgICAgaWYoZS5sZW5ndGggIT09IDAgJiYgaXNPbnlvbWlBbGwoZS5wcmV2KCdhJykuZXEoMCkudGV4dCgpKSkgewogICAgICAgICAgICB2YXIgb255b21pTm9kZSA9IGUuZmluZCgndWwnKS5maW5kKCdsaScpLmVxKDEpOwogICAgICAgICAgICBvbnlvbWlOb2RlLnRleHQoY29udmVydFRvS2F0YShvbnlvbWlOb2RlLnRleHQoKSkpOwogICAgICAgIH0KICAgIH0pOwp9CmVsc2UgaWYgKC9sZXNzb25cL3Nlc3Npb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gTGVzc29uIGFuZCBsZXNzb24gdGVzdCBwYWdlCnsKICAgIC8vLS0tLS0tLS0tIExlc3NvbiBQYXJ0IC0tLS0tLS0tLS8vCiAgICB2YXIgd2hlbkxlc3NvblNsaWRlcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBLYW5qaSBpbmZvCiAgICAgICAgdmFyIHR5cGUgPSAkKCIjc3VwcGxlbWVudC1rYW4tcmVhZGluZy10eXBlIikudGV4dCgpOwogICAgICAgIGlmKHR5cGUgPT09ICJvbid5b21pIikgewogICAgICAgICAgICAkKCcjc3VwcGxlbWVudC1rYW4tcmVhZGluZyBzcGFuJykuZXEoMSkudGV4dChjb252ZXJ0VG9LYXRhKCQoJyNzdXBwbGVtZW50LWthbi1yZWFkaW5nIHNwYW4nKS5lcSgxKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICAgICAgLy8gVm9jYWJsZSBicmVha2Rvd24gaW5mbwogICAgICAgICQoIiNzdXBwbGVtZW50LXZvYy1icmVha2Rvd24iKS5maW5kKCcua2FuamknKS5lYWNoKHJlcGxhY2VCcmVha2Rvd24pOwogICAgfTsKICAgIHZhciByZXBsYWNlQnJlYWtkb3duID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmKGlzT255b21pQWxsKCQodGhpcykudGV4dCgpKSkgewogICAgICAgICAgICAkKHRoaXMpLmF0dHIoInRpdGxlIiwgY29udmVydFRvS2F0YSgkKHRoaXMpLmF0dHIoJ3RpdGxlJykpKTsKICAgICAgICB9CiAgICB9OwogICAgJCgnI2JhdGNoLWl0ZW1zJykuY2xpY2sod2hlbkxlc3NvblNsaWRlcyk7CgogICAgLy8tLS0tLS0tLS0gVGVzdCBQYXJ0IC0tLS0tLS0tLS8vCiAgICBhbnN3ZXJDaGVja2VyLm9sZElzQXNjaWlQcmVzZW50S00gPSBhbnN3ZXJDaGVja2VyLmlzQXNjaWlQcmVzZW50OwogICAgYW5zd2VyQ2hlY2tlci5pc0FzY2lpUHJlc2VudCA9IGZ1bmN0aW9uKGUpIHsKICAgICAgICAvLyB0aGlzIGlzIGZvciB0cmFpbGluZyBOIHRvIOODswogICAgICAgIGlmKGVbZS5sZW5ndGgtMV0gPT09ICdOJykgewogICAgICAgICAgICBlID0gZS5zdWJzdHIoMCwgZS5sZW5ndGgtMSkgKyAn44OzJyArIGUuc3Vic3RyKGUubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFuc3dlckNoZWNrZXIub2xkSXNBc2NpaVByZXNlbnRLTShlKTsKICAgIH07CgogICAgYW5zd2VyQ2hlY2tlci5vbGRFdmFsdWF0ZUtNID0gYW5zd2VyQ2hlY2tlci5ldmFsdWF0ZTsKICAgIGFuc3dlckNoZWNrZXIuZXZhbHVhdGUgPSBmdW5jdGlvbihlLHQpIHsKICAgICAgICAvL2NvbnNvbGUubG9nKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpKTsKICAgICAgICAvLyB0aGlzIGlzIGZvciB0cmFpbGluZyBOIHRvIOODswogICAgICAgIGlmKGUgPT09ICJyZWFkaW5nIiAmJiB0W3QubGVuZ3RoLTFdID09PSAnTicpIHsKICAgICAgICAgICAgdCA9IHQuc3Vic3RyKDAsIHQubGVuZ3RoLTEpICsgJ+ODsycgKyB0LnN1YnN0cih0Lmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGlmKGlzT255b21pTGVzc29uKCkpIHsKICAgICAgICAgICAgLy8gdGhpcyBpcyBmb3IgdGhlICJXYW5pS2FuaSBpcyBsb29raW5nIGZvciB0aGUgb255b21pIHJlYWRpbmciIGZ1bmN0aW9uCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJC5qU3RvcmFnZS5nZXQoJ2wvY3VycmVudFF1aXpJdGVtJykua3VuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLmdldCgnbC9jdXJyZW50UXVpekl0ZW0nKS5rdW5baV0gPSBjb252ZXJ0VG9LYXRhKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpLmt1bltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAkLmpTdG9yYWdlLmdldCgnbC9jdXJyZW50UXVpekl0ZW0nKS5vbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgJC5qU3RvcmFnZS5nZXQoJ2wvY3VycmVudFF1aXpJdGVtJykub25baV0gPSBjb252ZXJ0VG9LYXRhKCQualN0b3JhZ2UuZ2V0KCdsL2N1cnJlbnRRdWl6SXRlbScpLm9uW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYW5zd2VyQ2hlY2tlci5vbGRFdmFsdWF0ZUtNKGUsdCk7CiAgICB9OwoKICAgICQoJyN1c2VyLXJlc3BvbnNlJykub24oJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlMZXNzb24oKSkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gY29udmVydFRvS2F0YSgkKHRoaXMpLnZhbCgpLnRvVXBwZXJDYXNlKCkpOwogICAgICAgIH0KICAgIH0pOwoKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcjaXRlbS1pbmZvIC5wdXJlLXUtMS00JylbMF07CiAgICBvYnNlcnZlRE9NKCkoIG9ic2VydmVNZSAsZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlMZXNzb24oKSkgewogICAgICAgICAgICAkKCcjaXRlbS1pbmZvLXJlYWRpbmcgc3BhbicpLnRleHQoY29udmVydFRvS2F0YSgkKCcjaXRlbS1pbmZvLXJlYWRpbmcgc3BhbicpLnRleHQoKSkpOwogICAgICAgIH0KICAgIH0pOwoKfWVsc2UgaWYgKC9sZXNzb24vLnRlc3QoZG9jdW1lbnQuVVJMKSkgLy8gTGVzc29uIGluZm8gcGFnZSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgZW5kIG9mIGEgcnVuCnsKICAgIHZhciBvYnNlcnZlTWUgPSAkKCcja2FuamknKVswXTsKICAgIG9ic2VydmVET00oKSggb2JzZXJ2ZU1lICxmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZSA9ICQoJy5rYW5qaSAuaG92ZXInKTsKICAgICAgICBpZihlLmxlbmd0aCAhPT0gMCAmJiBpc09ueW9taUFsbChlLnByZXYoJ2EnKS5lcSgwKS50ZXh0KCkpKSB7CiAgICAgICAgICAgIHZhciBvbnlvbWlOb2RlID0gZS5maW5kKCd1bCcpLmZpbmQoJ2xpJykuZXEoMSk7CiAgICAgICAgICAgIG9ueW9taU5vZGUudGV4dChjb252ZXJ0VG9LYXRhKG9ueW9taU5vZGUudGV4dCgpKSk7CiAgICAgICAgfQogICAgfSk7Cn0KCi8vIFNlYXJjaCByZXN1bHQKaWYoIC9kYXNoYm9hcmQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCBkb2N1bWVudC5VUkwgPT0gImh0dHA6Ly93d3cud2FuaWthbmkuY29tLyIgfHwgZG9jdW1lbnQuVVJMID09ICJodHRwczovL3d3dy53YW5pa2FuaS5jb20vIiB8fCAvXC9sZXZlbC8udGVzdChkb2N1bWVudC5VUkwpIHx8CiAgIC9cL2xhdHRpY2UvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCAvXC9yYWRpY2Fscy8udGVzdChkb2N1bWVudC5VUkwpIHx8IC9cL2thbmppLy50ZXN0KGRvY3VtZW50LlVSTCkgfHwgL1wvdm9jYWJ1bGFyeS8udGVzdChkb2N1bWVudC5VUkwpIHx8CiAgIC9cL2NvbW11bml0eS8udGVzdChkb2N1bWVudC5VUkwpIHx8IC9cL2NoYXQvLnRlc3QoZG9jdW1lbnQuVVJMKSB8fCAvXC9hY2NvdW50Ly50ZXN0KGRvY3VtZW50LlVSTCkgKSB7CiAgICB2YXIgc2VhcmNoQ2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYoaXNPbnlvbWlBbGwoJCh0aGlzKS5maW5kKCdzcGFuJykudGV4dCgpKSkgewogICAgICAgICAgICAkKHRoaXMpLmZpbmQoJ2xpJykuZXEoMCkudGV4dChjb252ZXJ0VG9LYXRhKCQodGhpcykuZmluZCgnbGknKS5lcSgwKS50ZXh0KCkpKTsKICAgICAgICB9CiAgICB9OwogICAgdmFyIG9ic2VydmVNZSA9ICQoJy5zZWFyY2gtcmVzdWx0cycpWzBdOwogICAgb2JzZXJ2ZURPTSgpKCBvYnNlcnZlTWUgLGZ1bmN0aW9uKCkgewogICAgICAgICQoJy5zZWFyY2gtcmVzdWx0cyAja2FuamktJykuZWFjaChzZWFyY2hDaGFuZ2UpOwogICAgfSk7Cn0KCgoKLy8tLSBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmFuc2Zvcm1pbmcga2F0YSA8LT4gaGlyYSAtLS8vCmZ1bmN0aW9uIGlzT255b21pUmV2aWV3KCkgewoKICAgIHZhciBvYmpDdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImN1cnJlbnRJdGVtIik7CiAgICB2YXIgc3RyUXVlc3Rpb25UeXBlID0gJC5qU3RvcmFnZS5nZXQoInF1ZXN0aW9uVHlwZSIpOwoKICAgIGlmICgia2FuIiBpbiBvYmpDdXJJdGVtKSB7CiAgICAgICAgLy8gS2FuamkKICAgICAgICBpZiAoc3RyUXVlc3Rpb25UeXBlID09PSAicmVhZGluZyIpIHsKICAgICAgICAgICAgaWYob2JqQ3VySXRlbS5lbXBoID09PSAib255b21pIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KCmZ1bmN0aW9uIGlzT255b21pTGVzc29uKCkgewoKICAgIHZhciBvYmpDdXJJdGVtID0gJC5qU3RvcmFnZS5nZXQoImwvY3VycmVudFF1aXpJdGVtIik7CiAgICB2YXIgc3RyUXVlc3Rpb25UeXBlID0gJC5qU3RvcmFnZS5nZXQoImwvcXVlc3Rpb25UeXBlIik7CgogICAgaWYgKCJrYW4iIGluIG9iakN1ckl0ZW0pCiAgICB7CiAgICAgICAgLy8gS2FuamkKICAgICAgICBpZiAoc3RyUXVlc3Rpb25UeXBlID09PSAicmVhZGluZyIpIHsKICAgICAgICAgICAgaWYob2JqQ3VySXRlbS5lbXBoID09PSAib255b21pIil7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKZnVuY3Rpb24gaXNPbnlvbWkoa2FuamksIGxldmVsKQp7CiAgICBzd2l0Y2gobGV2ZWwudG9VcHBlckNhc2UoKSkgewogICAgICAgIGNhc2UgJ1BMRUFTQU5UJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogY2FzZSAnNCc6IGNhc2UgJzUnOiBjYXNlICc2JzogY2FzZSAnNyc6IGNhc2UgJzgnOiBjYXNlICc5JzogY2FzZSAnMTAnOgogICAgICAgICAgICByZXR1cm4ga2FuamlZb21pUExFQVNBTlRba2FuamldOwogICAgICAgIGNhc2UgJ1BBSU5GVUwnOiBjYXNlICcxMSc6IGNhc2UgJzEyJzogY2FzZSAnMTMnOiBjYXNlICcxNCc6IGNhc2UgJzE1JzogY2FzZSAnMTYnOiBjYXNlICcxNyc6IGNhc2UgJzE4JzogY2FzZSAnMTknOiBjYXNlICcyMCc6CiAgICAgICAgICAgIHJldHVybiBrYW5qaVlvbWlQQUlORlVMW2thbmppXTsKICAgICAgICBjYXNlICdERUFUSCc6IGNhc2UgJzIxJzogY2FzZSAnMjInOiBjYXNlICcyMyc6IGNhc2UgJzI0JzogY2FzZSAnMjUnOiBjYXNlICcyNic6IGNhc2UgJzI3JzogY2FzZSAnMjgnOiBjYXNlICcyOSc6IGNhc2UgJzMwJzoKICAgICAgICAgICAgcmV0dXJuIGthbmppWW9taURFQVRIW2thbmppXTsKICAgICAgICBjYXNlICdIRUxMJzogY2FzZSAnMzEnOiBjYXNlICczMic6IGNhc2UgJzMzJzogY2FzZSAnMzQnOiBjYXNlICczNSc6IGNhc2UgJzM2JzogY2FzZSAnMzcnOiBjYXNlICczOCc6IGNhc2UgJzM5JzogY2FzZSAnNDAnOgogICAgICAgICAgICByZXR1cm4ga2FuamlZb21pSEVMTFtrYW5qaV07CiAgICAgICAgY2FzZSAnUEFSQURJU0UnOiBjYXNlICc0MSc6IGNhc2UgJzQyJzogY2FzZSAnNDMnOiBjYXNlICc0NCc6IGNhc2UgJzQ1JzogY2FzZSAnNDYnOiBjYXNlICc0Nyc6IGNhc2UgJzQ4JzogY2FzZSAnNDknOiBjYXNlICc1MCc6CiAgICAgICAgICAgIHJldHVybiBrYW5qaVlvbWlQQVJBRElTRVtrYW5qaV07CiAgICAgICAgY2FzZSAnUkVBTElUWSc6IGNhc2UgJzUxJzogY2FzZSAnNTInOiBjYXNlICc1Myc6IGNhc2UgJzU0JzogY2FzZSAnNTUnOiBjYXNlICc1Nic6IGNhc2UgJzU3JzogY2FzZSAnNTgnOiBjYXNlICc1OSc6IGNhc2UgJzYwJzoKICAgICAgICAgICAgcmV0dXJuIGthbmppWW9taVJFQUxJVFlba2FuamldOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAwOwogICAgfQp9CmZ1bmN0aW9uIGlzT255b21pQWxsKGthbmppKQp7CgogICAgaWYoa2FuamlZb21pUExFQVNBTlRba2FuamldKSByZXR1cm4gMTsKICAgIGlmKGthbmppWW9taVBBSU5GVUxba2FuamldKSByZXR1cm4gMTsKICAgIGlmKGthbmppWW9taURFQVRIW2thbmppXSkgcmV0dXJuIDE7CiAgICBpZihrYW5qaVlvbWlIRUxMW2thbmppXSkgcmV0dXJuIDE7CiAgICBpZihrYW5qaVlvbWlQQVJBRElTRVtrYW5qaV0pIHJldHVybiAxOwogICAgaWYoa2FuamlZb21pUkVBTElUWVtrYW5qaV0pIHJldHVybiAxOwogICAgcmV0dXJuIDA7Cgp9CmZ1bmN0aW9uIGNvbnZlcnRUb0thdGEoY2hhaW4pCnsKICAgIGNoYWluID0gY2hhaW4udHJpbSgpOwogICAgZm9yICh2YXIgaSA9IDAsIGMgPSBjaGFpbi5sZW5ndGg7IGkgPCBjOyBpKyspCiAgICB7CiAgICAgICAgY2hhaW4gPSByZXBsYWNlQXQoY2hhaW4sIGksIGhpcmFUb0thdGFbY2hhaW5baV1dIHx8IGNoYWluW2ldKTsKICAgIH0KICAgIHJldHVybiBjaGFpbjsKfQoKZnVuY3Rpb24gY29udmVydFRvSGlyYShjaGFpbikKewogICAgY2hhaW4gPSBjaGFpbi50cmltKCk7CiAgICBmb3IgKHZhciBpID0gMCwgYyA9IGNoYWluLmxlbmd0aDsgaSA8IGM7IGkrKykKICAgIHsKICAgICAgICBjaGFpbiA9IHJlcGxhY2VBdChjaGFpbiwgaSwga2F0YVRvSGlyYVtjaGFpbltpXV0gfHwgY2hhaW5baV0pOwogICAgfQogICAgcmV0dXJuIGNoYWluOwp9CgpmdW5jdGlvbiByZXBsYWNlQXQocywgbiwgdCkKewogICAgcmV0dXJuIHMuc3Vic3RyaW5nKDAsIG4pICsgdCArIHMuc3Vic3RyaW5nKG4gKyAxKTsKfQoKLyoKKiBXYWl0IGZvciBlbGVtZW50cyB0byBhcHBlYXIKKiBjYWxsIHdpdGggb2JzZXJ2ZURvbSgpKG9ic2Vydk5vZGUsIGNhbGxiYWNrRnVuY3Rpb24pOwoqIGZyb20gc3RhY2tvdmVyZmxvdzogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTQ1NzA2MTQKKi8KZnVuY3Rpb24gb2JzZXJ2ZURPTSgpIHsKICAgIHZhciBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsCiAgICAgICAgZXZlbnRMaXN0ZW5lclN1cHBvcnRlZCA9IHdpbmRvdy5hZGRFdmVudExpc3RlbmVyOwogICAgcmV0dXJuIGZ1bmN0aW9uKG9iaiwgY2FsbGJhY2spewogICAgICAgIGlmKCBNdXRhdGlvbk9ic2VydmVyICkgewogICAgICAgICAgICAvLyBkZWZpbmUgYSBuZXcgb2JzZXJ2ZXIKICAgICAgICAgICAgdmFyIG9icyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKG11dGF0aW9ucywgb2JzZXJ2ZXIpIHsKICAgICAgICAgICAgICAgIGlmKCBtdXRhdGlvbnNbMF0uYWRkZWROb2Rlcy5sZW5ndGggKQogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBoYXZlIHRoZSBvYnNlcnZlciBvYnNlcnZlIGZvbyBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlbgogICAgICAgICAgICBvYnMub2JzZXJ2ZSggb2JqLCB7IGNoaWxkTGlzdDp0cnVlLCBzdWJ0cmVlOnRydWUgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYoIGV2ZW50TGlzdGVuZXJTdXBwb3J0ZWQgKSB7CiAgICAgICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpOwogICAgICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpOwogICAgICAgIH0KICAgIH07Cn0KCi8qCiogT25seSB1c2VkIGZvciBnZW5lcmF0aW5nIG9ueW9taUxpc3QKKiBDYW4gYWxzbyBiZSB1c2VkIHRvIGxvYWQga2Fuamkgb255b21pIGluZm9ybWF0aW9ucyBmcm9tIHNlcnZlciAoc2xvdykKKgoqIFVwZGF0ZToKKiBDYWxsIHdpdGggcGFyYW1ldGVyIG9mIGxldmVsIGFuZCBjb3B5IHRoZSBzdHJpbmcgZnJvbSB0aGUgbG9nIHdpbmRvdyBpbiBvbmUgb2YgdGhlIHZhcmlhYmxlcyBvbiB0aGUgdG9wCiogZS5nLgoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiUExFQVNBTlQiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJQQUlORlVMIikpOwoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiREVBVEgiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJIRUxMIikpOwoqIGNvbnNvbGUubG9nKGxvYWRLYXRhRnJvbUFwaSgiUEFSQURJU0UiKSk7CiogY29uc29sZS5sb2cobG9hZEthdGFGcm9tQXBpKCJSRUFMSVRZIikpOwoqLwpmdW5jdGlvbiBsb2FkS2F0YUZyb21BcGkobGV2ZWwpIHsKICAgIHZhciBsZXZlbHM7CiAgICBzd2l0Y2gobGV2ZWwpIHsKICAgICAgICBjYXNlICdQTEVBU0FOVCc6CiAgICAgICAgICAgIGxldmVscyA9ICIxLDIsMyw0LDUsNiw3LDgsOSwxMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1BBSU5GVUwnOgogICAgICAgICAgICBsZXZlbHMgPSAiMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTksMjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdERUFUSCc6CiAgICAgICAgICAgIGxldmVscyA9ICIyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ0hFTEwnOgogICAgICAgICAgICBsZXZlbHMgPSAiMzEsMzIsMzMsMzQsMzUsMzYsMzcsMzgsMzksNDAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICdQQVJBRElTRSc6CiAgICAgICAgICAgIGxldmVscyA9ICI0MSw0Miw0Myw0NCw0NSw0Niw0Nyw0OCw0OSw1MCI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1JFQUxJVFknOgogICAgICAgICAgICBsZXZlbHMgPSAiNTEsNTIsNTMsNTQsNTUsNTYsNTcsNTgsNTksNjAiOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBsZXZlbHMgPSAnMSc7CiAgICB9CgogICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgcmVxLm9wZW4oJ0dFVCcsICdodHRwczovL3d3dy53YW5pa2FuaS5jb20vYXBpL3VzZXIvJyArIGFwaUtleSArICcva2FuamkvJyArIGxldmVscywgdHJ1ZSk7CiAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHJlcS5yZWFkeVN0YXRlID09PSA0KSB7CiAgICAgICAgICAgIGlmIChyZXEuc3RhdHVzID49IDIwMCAmJiByZXEuc3RhdHVzIDwgNDAwKSB7CiAgICAgICAgICAgICAgICB2YXIgbGlzdCA9IEpTT04ucGFyc2UocmVxLnJlc3BvbnNlVGV4dCkucmVxdWVzdGVkX2luZm9ybWF0aW9uOwogICAgICAgICAgICAgICAgdmFyIG91dHB1dCA9IHt9OwoKICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRbbGlzdFtpXS5jaGFyYWN0ZXJdID0gbGlzdFtpXS5pbXBvcnRhbnRfcmVhZGluZyA9PSAib255b21pIiA/IDEgOiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0KSk7CgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYWxlcnQoImVycm9yIik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgcmVxLnNlbmQoKTsKfQo=" 432 + "uuid": "8e97bd94-02cf-48f1-a58b-ff272dd5aadb" 462 433 }, 463 434 { 435 + "enabled": false, 436 + "file_url": "https://raw.githubusercontent.com/selslack/codingame-sync-userscript/master/codingame-sync.user.js", 464 437 "name": "Codingame File Sync", 465 438 "options": { 439 + "awareOfChrome": false, 466 440 "check_for_updates": true, 467 441 "comment": null, 468 - "compatopts_for_requires": true, 469 - "compat_wrappedjsobject": false, 442 + "compat_arrayleft": false, 443 + "compat_foreach": false, 444 + "compat_forvarin": false, 470 445 "compat_metadata": false, 471 - "compat_foreach": false, 472 - "compat_arrayleft": false, 446 + "compat_powerful_this": null, 473 447 "compat_uW_gmonkey": false, 474 - "compat_forvarin": false, 448 + "compat_wrappedjsobject": false, 449 + "compatopts_for_requires": true, 475 450 "noframes": null, 476 - "awareOfChrome": false, 477 - "run_at": null, 478 451 "override": { 479 - "use_includes": [], 480 - "orig_includes": [], 452 + "merge_connects": true, 453 + "merge_excludes": true, 481 454 "merge_includes": true, 482 - "use_matches": [], 455 + "merge_matches": true, 456 + "orig_excludes": [], 457 + "orig_includes": [], 483 458 "orig_matches": [ 484 459 "*://www.codingame.com/*" 485 460 ], 486 - "merge_matches": true, 487 - "use_excludes": [], 488 - "orig_excludes": [], 489 - "merge_excludes": true, 490 - "use_connects": [], 491 - "merge_connects": true, 461 + "orig_noframes": null, 462 + "orig_run_at": "document-idle", 492 463 "use_blockers": [], 493 - "orig_run_at": "document-idle", 494 - "orig_noframes": null 495 - } 464 + "use_connects": [], 465 + "use_excludes": [], 466 + "use_includes": [], 467 + "use_matches": [] 468 + }, 469 + "run_at": null, 470 + "tab_types": null 496 471 }, 472 + "position": 9, 473 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgIENvZGluZ2FtZSBGaWxlIFN5bmMKLy8gQG1hdGNoICAgICo6Ly93d3cuY29kaW5nYW1lLmNvbS8qCi8vIEB2ZXJzaW9uICAyLjAKLy8gQGdyYW50ICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIGlucHV0ID0gbnVsbDsKICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwoKICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHsKICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24uYWRkZWROb2Rlc1tpXS5ub2RlVHlwZSAhPT0gMSkgeyAvLyBFTEVNRU5UX05PREUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbnMgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldLnF1ZXJ5U2VsZWN0b3IoImRpdi5jb2RlLWJ1dHRvbnMiKTsKCiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbnMpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaW5wdXQuY2xhc3NOYW1lID0gImlkZS10YWIiOwogICAgICAgICAgICAgICAgaW5wdXQudHlwZSA9ICJmaWxlIjsKCiAgICAgICAgICAgICAgICBidXR0b25zLmluc2VydEJlZm9yZShpbnB1dCwgYnV0dG9ucy5maXJzdENoaWxkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5yZW1vdmVkTm9kZXNbaV0ubm9kZVR5cGUgIT09IDEpIHsgLy8gRUxFTUVOVF9OT0RFCiAgICAgICAgICAgICAgICAgICAgY29udGludWUgOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghbXV0YXRpb24ucmVtb3ZlZE5vZGVzW2ldLnF1ZXJ5U2VsZWN0b3IoImRpdi5jb2RlLWJ1dHRvbnMiKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwoKICAgIHZhciBzeW5jID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQuZmlsZXMubGVuZ3RoICE9PSAxKSB7CiAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChpbnB1dC5maWxlc1swXSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIFNhZmVseSBpZ25vcmUgYW55IGVycm9yCiAgICAgICAgfQogICAgfTsKCiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJFeHRlcm5hbEVkaXRvclRvSURFIiwgewogICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICAgIHN0YXR1czogInVwZGF0ZUNvZGUiLAogICAgICAgICAgICAgICAgY29kZTogZXZlbnQudGFyZ2V0LnJlc3VsdC5yZXBsYWNlKC9cclxuL2csICJcbiIpLnJlcGxhY2UoL1xyL2csICJcbiIpCiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9OwoKICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgewogICAgICAgIHN1YnRyZWU6IHRydWUsCiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgIGF0dHJpYnV0ZXM6IGZhbHNlLAogICAgICAgIGNoYXJhY3RlckRhdGE6IGZhbHNlCiAgICB9KTsKCiAgICBzZXRJbnRlcnZhbChzeW5jLCAxMDAwKTsKfSkoKTsK", 497 474 "storage": { 498 475 "data": {}, 499 476 "ts": 1607436649634 500 477 }, 501 - "enabled": false, 502 - "position": 10, 503 - "file_url": "https://raw.githubusercontent.com/selslack/codingame-sync-userscript/master/codingame-sync.user.js", 504 - "uuid": "7c2e57a8-c3c9-405e-93b2-c4bb6a4312aa", 505 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgIENvZGluZ2FtZSBGaWxlIFN5bmMKLy8gQG1hdGNoICAgICo6Ly93d3cuY29kaW5nYW1lLmNvbS8qCi8vIEB2ZXJzaW9uICAyLjAKLy8gQGdyYW50ICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgdmFyIGlucHV0ID0gbnVsbDsKICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwoKICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbnMpIHsKICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAobXV0YXRpb24pIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobXV0YXRpb24uYWRkZWROb2Rlc1tpXS5ub2RlVHlwZSAhPT0gMSkgeyAvLyBFTEVNRU5UX05PREUKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGV0IGJ1dHRvbnMgPSBtdXRhdGlvbi5hZGRlZE5vZGVzW2ldLnF1ZXJ5U2VsZWN0b3IoImRpdi5jb2RlLWJ1dHRvbnMiKTsKCiAgICAgICAgICAgICAgICBpZiAoIWJ1dHRvbnMpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZSA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICAgICAgICAgICAgaW5wdXQuY2xhc3NOYW1lID0gImlkZS10YWIiOwogICAgICAgICAgICAgICAgaW5wdXQudHlwZSA9ICJmaWxlIjsKCiAgICAgICAgICAgICAgICBidXR0b25zLmluc2VydEJlZm9yZShpbnB1dCwgYnV0dG9ucy5maXJzdENoaWxkKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdXRhdGlvbi5yZW1vdmVkTm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5yZW1vdmVkTm9kZXNbaV0ubm9kZVR5cGUgIT09IDEpIHsgLy8gRUxFTUVOVF9OT0RFCiAgICAgICAgICAgICAgICAgICAgY29udGludWUgOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghbXV0YXRpb24ucmVtb3ZlZE5vZGVzW2ldLnF1ZXJ5U2VsZWN0b3IoImRpdi5jb2RlLWJ1dHRvbnMiKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpbnB1dCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwoKICAgIHZhciBzeW5jID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghaW5wdXQgfHwgaW5wdXQuZmlsZXMubGVuZ3RoICE9PSAxKSB7CiAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgfQoKICAgICAgICB0cnkgewogICAgICAgICAgICByZWFkZXIucmVhZEFzVGV4dChpbnB1dC5maWxlc1swXSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIFNhZmVseSBpZ25vcmUgYW55IGVycm9yCiAgICAgICAgfQogICAgfTsKCiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJFeHRlcm5hbEVkaXRvclRvSURFIiwgewogICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICAgIHN0YXR1czogInVwZGF0ZUNvZGUiLAogICAgICAgICAgICAgICAgY29kZTogZXZlbnQudGFyZ2V0LnJlc3VsdC5yZXBsYWNlKC9cclxuL2csICJcbiIpLnJlcGxhY2UoL1xyL2csICJcbiIpCiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICB9OwoKICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgewogICAgICAgIHN1YnRyZWU6IHRydWUsCiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgIGF0dHJpYnV0ZXM6IGZhbHNlLAogICAgICAgIGNoYXJhY3RlckRhdGE6IGZhbHNlCiAgICB9KTsKCiAgICBzZXRJbnRlcnZhbChzeW5jLCAxMDAwKTsKfSkoKTsK" 478 + "uuid": "7c2e57a8-c3c9-405e-93b2-c4bb6a4312aa" 506 479 }, 507 480 { 481 + "enabled": true, 482 + "file_url": "https://greasyfork.org/scripts/396170-bunpro-disable-backspace-undo/code/Bunpro:%20Disable%20Backspace%20Undo.user.js", 508 483 "name": "Bunpro: Disable Backspace Undo", 509 484 "options": { 510 485 "check_for_updates": true, 511 486 "comment": null, 512 - "compatopts_for_requires": true, 487 + "compat_foreach": false, 488 + "compat_metadata": false, 489 + "compat_powerful_this": null, 490 + "compat_prototypes": false, 513 491 "compat_wrappedjsobject": false, 514 - "compat_metadata": false, 515 - "compat_foreach": false, 516 - "compat_arrayleft": false, 517 - "compat_uW_gmonkey": false, 518 - "compat_forvarin": false, 492 + "compatopts_for_requires": true, 519 493 "noframes": null, 520 - "awareOfChrome": false, 521 - "run_at": null, 522 494 "override": { 523 - "use_includes": [], 524 - "orig_includes": [ 525 - "*bunpro.jp/*" 526 - ], 495 + "merge_connects": true, 496 + "merge_excludes": true, 527 497 "merge_includes": true, 528 - "use_matches": [], 529 - "orig_matches": [], 530 498 "merge_matches": true, 531 - "use_excludes": [], 499 + "orig_connects": [], 532 500 "orig_excludes": [ 533 501 "*community.bunpro.jp*" 534 502 ], 535 - "merge_excludes": true, 503 + "orig_includes": [ 504 + "*bunpro.jp/*" 505 + ], 506 + "orig_matches": [], 507 + "orig_noframes": null, 508 + "orig_run_at": "document-idle", 509 + "use_blockers": [], 536 510 "use_connects": [], 537 - "merge_connects": true, 538 - "use_blockers": [], 539 - "orig_run_at": "document-idle", 540 - "orig_noframes": null 541 - } 511 + "use_excludes": [], 512 + "use_includes": [], 513 + "use_matches": [] 514 + }, 515 + "run_at": null, 516 + "tab_types": null 542 517 }, 543 - "storage": { 544 - "data": {}, 545 - "ts": 1607436649636 546 - }, 547 - "enabled": true, 548 - "position": 11, 549 - "file_url": "https://greasyfork.org/scripts/396170-bunpro-disable-backspace-undo/code/Bunpro:%20Disable%20Backspace%20Undo.user.js", 550 - "uuid": "a83ba4d2-a68b-45d6-b98f-e0c8a83de351", 551 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IERpc2FibGUgQmFja3NwYWNlIFVuZG8KLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAxLjAuMwovLyBAZGVzY3JpcHRpb24gIERpc2FibGVzIHRoZSBiYWNrc3BhY2UgZnVuY3Rpb25hbGl0eSBpbiByZXZpZXdzCi8vIEBhdXRob3IgICAgICAgS3VtaXJlaQovLyBAaW5jbHVkZSAgICAgICpidW5wcm8uanAvKgovLyBAZXhjbHVkZSAgICAgICpjb21tdW5pdHkuYnVucHJvLmpwKgovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy81MzkyLXdhaXRmb3JrZXllbGVtZW50cy9jb2RlL1dhaXRGb3JLZXlFbGVtZW50cy5qcz92ZXJzaW9uPTExNTAxMgovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zNzA2MjMtYnVucHJvLWhlbHBmdWwtZXZlbnRzL2NvZGUvQnVucHJvOiUyMEhlbHBmdWwlMjBFdmVudHMuanM/dmVyc2lvbj02MTU3MDAKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgdmFyICQgPSB3aW5kb3cuJDsKICAgICQoJ2h0bWwnKVswXS5hZGRFdmVudExpc3RlbmVyKCdxdWl6LXBhZ2UnLCAoKT0+ewogICAgICAgIHZhciBpbnB1dF9lbGVtID0gJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpOwogICAgICAgICQoJ2JvZHknKS5rZXlkb3duKChldmVudCk9PnsKICAgICAgICAgICAgdmFyIGNvbG9ycyA9IGlucHV0X2VsZW0uY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJykubWF0Y2goL1xkKy9nKTsKICAgICAgICAgICAgdmFyIHN1bSA9IGNvbG9ycy5yZWR1Y2UoKGEsIGIpPT5OdW1iZXIoYSkrTnVtYmVyKGIpKTsKICAgICAgICAgICAgdmFyIHJlZG5lc3MgPSBjb2xvcnNbMF0vc3VtOwogICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSA4ICYmIHJlZG5lc3MgPiAwLjQpIHsKICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgaW5wdXRfZWxlbS5ibHVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9KSgpOw==", 518 + "position": 10, 552 519 "requires": [ 553 520 { 554 521 "meta": { 555 - "name": "WaitForKeyElements.js", 556 - "url": "https://greasyfork.org/scripts/5392-waitforkeyelements/code/WaitForKeyElements.js?version=115012", 557 - "ts": 1607436649634, 558 - "mimetype": "text/javascript" 559 - }, 560 - "source": "LyotLS0gd2FpdEZvcktleUVsZW1lbnRzKCk6IEEgdXRpbGl0eSBmdW5jdGlvbiwgZm9yIEdyZWFzZW1vbmtleSBzY3JpcHRzLAp0aGF0IGRldGVjdHMgYW5kIGhhbmRsZXMgQUpBWGVkIGNvbnRlbnQuCiAKVXNhZ2UgZXhhbXBsZToKd2FpdEZvcktleUVsZW1lbnRzICgiZGl2LmNvbW1lbnRzIiwgY29tbWVudENhbGxiYWNrRnVuY3Rpb24pOwogCi8vLS0tIFBhZ2Utc3BlY2lmaWMgZnVuY3Rpb24gdG8gZG8gd2hhdCB3ZSB3YW50IHdoZW4gdGhlIG5vZGUgaXMgZm91bmQuCmZ1bmN0aW9uIGNvbW1lbnRDYWxsYmFja0Z1bmN0aW9uIChqTm9kZSkgewogICAgak5vZGUudGV4dCAoIlRoaXMgY29tbWVudCBjaGFuZ2VkIGJ5IHdhaXRGb3JLZXlFbGVtZW50cygpLiIpOwp9CiAKSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHlvdXIgc2NyaXB0IHRvIGhhdmUgbG9hZGVkIGpRdWVyeS4KKi8KCmZ1bmN0aW9uIHdhaXRGb3JLZXlFbGVtZW50cygKc2VsZWN0b3JUeHQsIC8qIFJlcXVpcmVkOiBUaGUgalF1ZXJ5IHNlbGVjdG9yIHN0cmluZyB0aGF0CnNwZWNpZmllcyB0aGUgZGVzaXJlZCBlbGVtZW50KHMpLgoqLwphY3Rpb25GdW5jdGlvbiwgLyogUmVxdWlyZWQ6IFRoZSBjb2RlIHRvIHJ1biB3aGVuIGVsZW1lbnRzIGFyZQpmb3VuZC4gSXQgaXMgcGFzc2VkIGEgak5vZGUgdG8gdGhlIG1hdGNoZWQKZWxlbWVudC4KKi8KYldhaXRPbmNlLCAvKiBPcHRpb25hbDogSWYgZmFsc2UsIHdpbGwgY29udGludWUgdG8gc2NhbiBmb3IKbmV3IGVsZW1lbnRzIGV2ZW4gYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoIGlzCmZvdW5kLgoqLwppZnJhbWVTZWxlY3RvciAvKiBPcHRpb25hbDogSWYgc2V0LCBpZGVudGlmaWVzIHRoZSBpZnJhbWUgdG8Kc2VhcmNoLgoqLwopIHsKICAgIHZhciB0YXJnZXROb2RlcywgYnRhcmdldHNGb3VuZDsKCiAgICBpZiAodHlwZW9mIGlmcmFtZVNlbGVjdG9yID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRhcmdldE5vZGVzID0gJChzZWxlY3RvclR4dCk7CiAgICBlbHNlCiAgICAgICAgdGFyZ2V0Tm9kZXMgPSAkKGlmcmFtZVNlbGVjdG9yKS5jb250ZW50cygpCiAgICAgICAgLmZpbmQoc2VsZWN0b3JUeHQpOwoKICAgIGlmICh0YXJnZXROb2RlcyAmJiB0YXJnZXROb2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgYnRhcmdldHNGb3VuZCA9IHRydWU7CiAgICAgICAgLyotLS0gRm91bmQgdGFyZ2V0IG5vZGUocykuIEdvIHRocm91Z2ggZWFjaCBhbmQgYWN0IGlmIHRoZXkKICAgICAgICBhcmUgbmV3LgogICAgICAgICovCiAgICAgICAgdGFyZ2V0Tm9kZXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBqVGhpcyA9ICQodGhpcyk7CiAgICAgICAgICAgIHZhciBhbHJlYWR5Rm91bmQgPSBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnKSB8fCBmYWxzZTsKCiAgICAgICAgICAgIGlmICghYWxyZWFkeUZvdW5kKSB7CiAgICAgICAgICAgICAgICAvLy0tLSBDYWxsIHRoZSBwYXlsb2FkIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgdmFyIGNhbmNlbEZvdW5kID0gYWN0aW9uRnVuY3Rpb24oalRoaXMpOwogICAgICAgICAgICAgICAgaWYgKGNhbmNlbEZvdW5kKQogICAgICAgICAgICAgICAgICAgIGJ0YXJnZXRzRm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgYnRhcmdldHNGb3VuZCA9IGZhbHNlOwogICAgfQoKICAgIC8vLS0tIEdldCB0aGUgdGltZXItY29udHJvbCB2YXJpYWJsZSBmb3IgdGhpcyBzZWxlY3Rvci4KICAgIHZhciBjb250cm9sT2JqID0gd2FpdEZvcktleUVsZW1lbnRzLmNvbnRyb2xPYmogfHwge307CiAgICB2YXIgY29udHJvbEtleSA9IHNlbGVjdG9yVHh0LnJlcGxhY2UoL1teXHddL2csICJfIik7CiAgICB2YXIgdGltZUNvbnRyb2wgPSBjb250cm9sT2JqW2NvbnRyb2xLZXldOwoKICAgIC8vLS0tIE5vdyBzZXQgb3IgY2xlYXIgdGhlIHRpbWVyIGFzIGFwcHJvcHJpYXRlLgogICAgaWYgKGJ0YXJnZXRzRm91bmQgJiYgYldhaXRPbmNlICYmIHRpbWVDb250cm9sKSB7CiAgICAgICAgLy8tLS0gVGhlIG9ubHkgY29uZGl0aW9uIHdoZXJlIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHRpbWVyLgogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZUNvbnRyb2wpOwogICAgICAgIGRlbGV0ZSBjb250cm9sT2JqW2NvbnRyb2xLZXldOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8tLS0gU2V0IGEgdGltZXIsIGlmIG5lZWRlZC4KICAgICAgICBpZiAoIXRpbWVDb250cm9sKSB7CiAgICAgICAgICAgIHRpbWVDb250cm9sID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgd2FpdEZvcktleUVsZW1lbnRzKHNlbGVjdG9yVHh0LAogICAgICAgICAgICAgICAgYWN0aW9uRnVuY3Rpb24sCiAgICAgICAgICAgICAgICBiV2FpdE9uY2UsCiAgICAgICAgICAgICAgICBpZnJhbWVTZWxlY3RvcgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzAwCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnRyb2xPYmpbY29udHJvbEtleV0gPSB0aW1lQ29udHJvbDsKICAgICAgICB9CiAgICB9CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMuY29udHJvbE9iaiA9IGNvbnRyb2xPYmo7Cn0=" 561 - }, 562 - { 563 - "meta": { 522 + "mimetype": "text/javascript", 564 523 "name": "Bunpro:%20Helpful%20Events.js", 565 - "url": "https://greasyfork.org/scripts/370623-bunpro-helpful-events/code/Bunpro:%20Helpful%20Events.js?version=615700", 566 - "ts": 1607436649634, 567 - "mimetype": "text/javascript" 524 + "ts": 1649271252201, 525 + "url": "https://greasyfork.org/scripts/370623-bunpro-helpful-events/code/Bunpro:%20Helpful%20Events.js?version=974369" 568 526 }, 569 - "source": "KGZ1bmN0aW9uKCkgewogICAgLy8gQWRkIGEgY3VzdG9tIGV2ZW50IGZvciB3aGVuIEJQIGNyZWF0ZXMgYSBuZXcgYm9keQogICAgdmFyIG5ld0JvZHkgPSBuZXcgRXZlbnQoJ25ldy1ib2R5Jyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJ2JvZHkgPiBoZWFkZXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KG5ld0JvZHkpO30pOwogICAgCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgZm9yIHdoZW4geW91IGdldCBhIG5ldyBpdGVtIGluIHJldmlld3MKICAgIHZhciBuZXdSZXZpZXdJdGVtID0gbmV3IEV2ZW50KCduZXctcmV2aWV3LWl0ZW0nKTsKICAgIHdhaXRGb3JLZXlFbGVtZW50cygnLmxldmVsX2xlc3Nvbl9pbmZvIGEnLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KG5ld1Jldmlld0l0ZW0pO30pOwogICAgCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgd2hlbiB5b3UgZ28gdG8gc3R1ZHkgb3IgY3JhbSBwYWdlCiAgICB2YXIgcXVpelBhZ2UgPSBuZXcgRXZlbnQoJ3F1aXotcGFnZScpOwogICAgd2FpdEZvcktleUVsZW1lbnRzKCcjc2hvdy1ncmFtbWFyJywgZnVuY3Rpb24oZSkge2ZpcmVFdmVudChxdWl6UGFnZSk7fSk7CiAgICAKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCB3aGVuIHlvdSBnbyB0byBzdHVkeSBwYWdlCiAgICB2YXIgc3R1ZHlQYWdlID0gbmV3IEV2ZW50KCdzdHVkeS1wYWdlJyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJyNzdHVkeS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KHN0dWR5UGFnZSk7fSk7CiAgICAKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCB3aGVuIHlvdSBnbyB0byBjcmFtIHBhZ2UKICAgIHZhciBjcmFtUGFnZSA9IG5ldyBFdmVudCgnY3JhbS1wYWdlJyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJyNjcmFtLXBhZ2UgI3Nob3ctZ3JhbW1hcicsIGZ1bmN0aW9uKGUpIHtmaXJlRXZlbnQoY3JhbVBhZ2UpO30pOwogICAgCiAgICAvLyBGaXJlcyB0aGUgZ2l2ZW4gZXZlbnQgb24gdGhlIEhUTUwgZWxlbWVudAogICAgZnVuY3Rpb24gZmlyZUV2ZW50KGV2ZW50KSB7CiAgICAJCXZhciByZXRyeUludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ0hUTUwnKVswXS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJldHJ5SW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAxMDApOwogICAgfQp9KSgpOw==" 527 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm87IEhlbHBmdWwgRXZlbnRzCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3RhbXBlcm1vbmtleS5uZXQvCi8vIEB2ZXJzaW9uICAgICAgMS4wLjIKLy8gQGF1dGhvciAgICAgICBLdW1pcmVpCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQzMjQxOC13YWl0LWZvci1zZWxlY3Rvci9jb2RlL1dhaXQlMjBGb3IlMjBTZWxlY3Rvci5qcz92ZXJzaW9uPTk3NDM2NgovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbih3ZnMpIHsKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCBmb3Igd2hlbiBCUCBjcmVhdGVzIGEgbmV3IGJvZHkKICAgIHZhciBuZXdCb2R5ID0gbmV3IEV2ZW50KCduZXctYm9keScpOwogICAgd2ZzLndhaXQoJ2JvZHkgPiBoZWFkZXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KG5ld0JvZHkpO30pOwoKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCBmb3Igd2hlbiB5b3UgZ2V0IGEgbmV3IGl0ZW0gaW4gcmV2aWV3cwogICAgdmFyIG5ld1Jldmlld0l0ZW0gPSBuZXcgRXZlbnQoJ25ldy1yZXZpZXctaXRlbScpOwogICAgd2ZzLndhaXQoJy5sZXZlbF9sZXNzb25faW5mbyBhJywgZnVuY3Rpb24oZSkge2ZpcmVFdmVudChuZXdSZXZpZXdJdGVtKTt9KTsKCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgd2hlbiB5b3UgZ28gdG8gc3R1ZHkgb3IgY3JhbSBwYWdlCiAgICB2YXIgcXVpelBhZ2UgPSBuZXcgRXZlbnQoJ3F1aXotcGFnZScpOwogICAgd2ZzLndhaXQoJyNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KHF1aXpQYWdlKTt9KTsKCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgd2hlbiB5b3UgZ28gdG8gc3R1ZHkgcGFnZQogICAgdmFyIHN0dWR5UGFnZSA9IG5ldyBFdmVudCgnc3R1ZHktcGFnZScpOwogICAgd2ZzLndhaXQoJyNzdHVkeS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KHN0dWR5UGFnZSk7fSk7CgogICAgLy8gQWRkIGEgY3VzdG9tIGV2ZW50IHdoZW4geW91IGdvIHRvIGNyYW0gcGFnZQogICAgdmFyIGNyYW1QYWdlID0gbmV3IEV2ZW50KCdjcmFtLXBhZ2UnKTsKICAgIHdmcy53YWl0KCcjY3JhbS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KGNyYW1QYWdlKTt9KTsKCiAgICAvLyBGaXJlcyB0aGUgZ2l2ZW4gZXZlbnQgb24gdGhlIEhUTUwgZWxlbWVudAogICAgZnVuY3Rpb24gZmlyZUV2ZW50KGV2ZW50KSB7CiAgICAgICAgdmFyIHJldHJ5SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSB7CiAgICAgICAgICAgICAgICAkKCdIVE1MJylbMF0uZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJldHJ5SW50ZXJ2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgMTAwKTsKICAgIH0KfSkod2luZG93Lndmcyk7Cg==" 570 528 } 571 - ] 529 + ], 530 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IERpc2FibGUgQmFja3NwYWNlIFVuZG8KLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAxLjAuNgovLyBAZGVzY3JpcHRpb24gIERpc2FibGVzIHRoZSBiYWNrc3BhY2UgZnVuY3Rpb25hbGl0eSBpbiByZXZpZXdzCi8vIEBhdXRob3IgICAgICAgS3VtaXJlaQovLyBAaW5jbHVkZSAgICAgICpidW5wcm8uanAvKgovLyBAZXhjbHVkZSAgICAgICpjb21tdW5pdHkuYnVucHJvLmpwKgovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zNzA2MjMtYnVucHJvLWhlbHBmdWwtZXZlbnRzL2NvZGUvQnVucHJvOiUyMEhlbHBmdWwlMjBFdmVudHMuanM/dmVyc2lvbj05NzQzNjkKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKKGZ1bmN0aW9uKCkgewogICAgdmFyICQgPSB3aW5kb3cuJDsKICAgICQoJ2h0bWwnKVswXS5hZGRFdmVudExpc3RlbmVyKCdxdWl6LXBhZ2UnLCAoKT0+ewogICAgICAgIHZhciBpbnB1dF9lbGVtID0gJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpOwogICAgICAgICQoJ2JvZHknKS5rZXlkb3duKChldmVudCk9PnsKICAgICAgICAgICAgdmFyIGNvbG9ycyA9IGlucHV0X2VsZW0uY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJykubWF0Y2goL1xkKy9nKTsKICAgICAgICAgICAgdmFyIHN1bSA9IGNvbG9ycy5yZWR1Y2UoKGEsIGIpPT5OdW1iZXIoYSkrTnVtYmVyKGIpKTsKICAgICAgICAgICAgdmFyIHJlZG5lc3MgPSBjb2xvcnNbMF0vc3VtOwogICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PSA4ICYmIHJlZG5lc3MgPiAwLjQpIHsKICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgaW5wdXRfZWxlbS5ibHVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0pOwp9KSgpOwo=", 531 + "storage": { 532 + "data": {}, 533 + "ts": 1607436649636 534 + }, 535 + "uuid": "a83ba4d2-a68b-45d6-b98f-e0c8a83de351" 572 536 }, 573 537 { 538 + "enabled": true, 539 + "file_url": "https://greasyfork.org/scripts/35063-wanikani-double-check/code/Wanikani%20Double-Check.user.js", 574 540 "name": "Wanikani Double-Check", 575 541 "options": { 576 - "check_for_updates": true, 542 + "check_for_updates": false, 577 543 "comment": null, 578 - "compatopts_for_requires": true, 579 - "compat_wrappedjsobject": false, 580 - "compat_metadata": false, 581 544 "compat_foreach": false, 582 - "compat_arrayleft": false, 583 - "compat_uW_gmonkey": false, 584 - "compat_forvarin": false, 545 + "compat_metadata": false, 546 + "compat_powerful_this": null, 547 + "compat_prototypes": false, 548 + "compat_wrappedjsobject": false, 549 + "compatopts_for_requires": true, 585 550 "noframes": null, 586 - "awareOfChrome": false, 587 - "run_at": null, 588 551 "override": { 589 - "use_includes": [], 552 + "merge_connects": true, 553 + "merge_excludes": true, 554 + "merge_includes": true, 555 + "merge_matches": true, 556 + "orig_connects": [], 557 + "orig_excludes": [], 590 558 "orig_includes": [ 591 559 "/^https://(www|preview).wanikani.com/review/session/" 592 560 ], 593 - "merge_includes": true, 594 - "use_matches": [], 595 561 "orig_matches": [], 596 - "merge_matches": true, 562 + "orig_noframes": null, 563 + "orig_run_at": "document-end", 564 + "use_blockers": [], 565 + "use_connects": [], 597 566 "use_excludes": [], 598 - "orig_excludes": [], 599 - "merge_excludes": true, 600 - "use_connects": [], 601 - "merge_connects": true, 602 - "use_blockers": [], 603 - "orig_run_at": "document-end", 604 - "orig_noframes": null 605 - } 567 + "use_includes": [], 568 + "use_matches": [] 569 + }, 570 + "run_at": null, 571 + "tab_types": null 606 572 }, 573 + "position": 11, 574 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIERvdWJsZS1DaGVjawovLyBAbmFtZXNwYWNlICAgd2tkb3VibGVjaGVjawovLyBAZGVzY3JpcHRpb24gQWxsb3dzIHJldHlwaW5nIHR5cG8nZCBhbnN3ZXJzLCBvciBtYXJraW5nIHdyb25nIHdoZW4gV0sncyB0eXBvIHRvbGVyYW5jZSBpcyB0b28gbGF4LgovLyBAaW5jbHVkZSAgICAgL15odHRwczovLyh3d3d8cHJldmlldykud2FuaWthbmkuY29tL3Jldmlldy9zZXNzaW9uLwovLyBAdmVyc2lvbiAgICAgMi4yLjM2Ci8vIEBhdXRob3IgICAgICBSb2JpbiBGaW5kbGV5Ci8vIEBjb3B5cmlnaHQgICAyMDE3KywgUm9iaW4gRmluZGxleQovLyBAbGljZW5zZSAgICAgTUlUOyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1lbmQKLy8gQGdyYW50ICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgovLyBDUkVESVRTOiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGFuIG9yaWdpbmFsIHNjcmlwdCBieSBXYW5pa2FuaSB1c2VyIEBFdGhhbi4KLy8gRXRoYW4ncyBzY3JpcHQgc3RvcHBlZCB3b3JraW5nIGR1ZSB0byBzb21lIFdhbmlrYW5pIGNoYW5nZXMuICBUaGUgY29kZSBiZWxvdyBpcwovLyAxMDAlIG15IG93biwgYnV0IGl0IGNsb3NlbHkgcmVwbGljYXRlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBFdGhhbidzIG9yaWdpbmFsIHNjcmlwdC4KCi8vIEhPVEtFWVM6Ci8vICAgIisiICAgICAgLSBNYXJrcyBhbnN3ZXIgYXMgJ2NvcnJlY3QnLgovLyAgICItIiAgICAgIC0gTWFya3MgYW5zd2VyIGFzICdpbmNvcnJlY3QnLgovLyAgICJFc2NhcGUiIG9yICJCYWNrc3BhY2UiIC0gUmVzZXRzIHF1ZXN0aW9uLCBhbGxvd2luZyB5b3UgdG8gcmV0eXBlLgoKLy8gU0VFIFNFVFRJTkdTIEJFTE9XLgoKd2luZG93LmRvdWJsZWNoZWNrID0ge307CgooZnVuY3Rpb24oZ29iaikgewoKICAgIC8qIGdsb2JhbCAkLCB3a29mLCBhZGRpdGlvbmFsQ29udGVudCwgbGFzdEl0ZW1zLCBTcnMsIHdhbmFrYW5hICovCgogICAgdmFyIHNldHRpbmdzOwoKICAgIHdrb2YuaW5jbHVkZSgnTWVudSxTZXR0aW5ncycpOwogICAgd2tvZi5yZWFkeSgnZG9jdW1lbnQsTWVudSxTZXR0aW5ncycpLnRoZW4oc2V0dXApOwoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBzZXR1cCgpIC0gU2V0IHVwIHRoZSBtZW51IGxpbmsgYW5kIGRlZmF1bHQgc2V0dGluZ3MuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gc2V0dXAoKSB7CiAgICAgICAgd2tvZi5NZW51Lmluc2VydF9zY3JpcHRfbGluayh7bmFtZTonZG91YmxlY2hlY2snLHN1Ym1lbnU6J1NldHRpbmdzJyx0aXRsZTonRG91YmxlLUNoZWNrJyxvbl9jbGljazpvcGVuX3NldHRpbmdzfSk7CgogICAgICAgIHZhciBkZWZhdWx0cyA9IHsKICAgICAgICAgICAgYWxsb3dfcmV0eXBpbmc6IHRydWUsCiAgICAgICAgICAgIGFsbG93X2NoYW5nZV9jb3JyZWN0OiBmYWxzZSwKICAgICAgICAgICAgc2hvd19jb3JyZWN0ZWRfYW5zd2VyOiBmYWxzZSwKICAgICAgICAgICAgYWxsb3dfY2hhbmdlX2luY29ycmVjdDogZmFsc2UsCiAgICAgICAgICAgIHR5cG9fYWN0aW9uOiAnaWdub3JlJywKICAgICAgICAgICAgd3JvbmdfYW5zd2VyX3R5cGVfYWN0aW9uOiAnd2FybicsCiAgICAgICAgICAgIHdyb25nX251bWJlcl9uX2FjdGlvbjogJ3dhcm4nLAogICAgICAgICAgICBzbWFsbF9rYW5hX2FjdGlvbjogJ3dhcm4nLAogICAgICAgICAgICBrYW5qaV9yZWFkaW5nX2Zvcl92b2NhYl9hY3Rpb246ICd3YXJuJywKICAgICAgICAgICAga2FuamlfbWVhbmluZ19mb3Jfdm9jYWJfYWN0aW9uOiAnd2FybicsCiAgICAgICAgICAgIGRlbGF5X3dyb25nOiB0cnVlLAogICAgICAgICAgICBkZWxheV9tdWx0aV9tZWFuaW5nOiBmYWxzZSwKICAgICAgICAgICAgZGVsYXlfc2xpZ2h0bHlfb2ZmOiBmYWxzZSwKICAgICAgICAgICAgZGVsYXlfcGVyaW9kOiAxLjUsCiAgICAgICAgICAgIHdhcm5fYnVybjogJ25ldmVyJywKICAgICAgICAgICAgYnVybl9kZWxheV9wZXJpb2Q6IDEuNSwKICAgICAgICAgICAgc2hvd19saWdodG5pbmdfYnV0dG9uOiB0cnVlLAogICAgICAgICAgICBsaWdodG5pbmdfZW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgIHNyc19tc2dfcGVyaW9kOiAxLjIsCiAgICAgICAgICAgIGF1dG9pbmZvX2NvcnJlY3Q6IGZhbHNlLAogICAgICAgICAgICBhdXRvaW5mb19pbmNvcnJlY3Q6IGZhbHNlLAogICAgICAgICAgICBhdXRvaW5mb19tdWx0aV9tZWFuaW5nOiBmYWxzZSwKICAgICAgICAgICAgYXV0b2luZm9fc2xpZ2h0bHlfb2ZmOiBmYWxzZQogICAgICAgIH0KICAgICAgICByZXR1cm4gd2tvZi5TZXR0aW5ncy5sb2FkKCdkb3VibGVjaGVjaycsIGRlZmF1bHRzKQogICAgICAgICAgICAudGhlbihpbml0X3VpLmJpbmQobnVsbCwgdHJ1ZSAvKiBmaXJzdF90aW1lICovKSk7CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIG9wZW5fc2V0dGluZ3MoKSAtIE9wZW4gdGhlIFNldHRpbmdzIGRpYWxvZy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBvcGVuX3NldHRpbmdzKCkgewogICAgICAgIHZhciBkaWFsb2cgPSBuZXcgd2tvZi5TZXR0aW5ncyh7CiAgICAgICAgICAgIHNjcmlwdF9pZDogJ2RvdWJsZWNoZWNrJywKICAgICAgICAgICAgdGl0bGU6ICdEb3VibGUtQ2hlY2sgU2V0dGluZ3MnLAogICAgICAgICAgICBvbl9zYXZlOiBpbml0X3VpLAogICAgICAgICAgICBwcmVfb3Blbjogc2V0dGluZ3NfcHJlb3BlbiwKICAgICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAgICAgdGFiQW5zd2Vyczoge3R5cGU6J3BhZ2UnLGxhYmVsOidBbnN3ZXJzJyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICBncnBDaGFuZ2VBbnN3ZXJzOiB7dHlwZTonZ3JvdXAnLGxhYmVsOidDaGFuZ2UgQW5zd2VyJyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmV0eXBpbmc6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J0FsbG93IHJldHlwaW5nIGFuc3dlcicsZGVmYXVsdDp0cnVlLGhvdmVyX3RpcDonV2hlbiBlbmFibGVkLCB5b3UgY2FuIHJldHlwZSB5b3VyIGFuc3dlciBieSBwcmVzc2luZyBFc2NhcGUgb3IgQmFja3NwYWNlLid9LAogICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19jaGFuZ2VfaW5jb3JyZWN0OiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidBbGxvdyBjaGFuZ2luZyB0byAiaW5jb3JyZWN0IicsZGVmYXVsdDp0cnVlLGhvdmVyX3RpcDonV2hlbiBlbmFibGVkLCB5b3UgY2FuIGNoYW5nZSB5b3VyIGFuc3dlclxudG8gImluY29ycmVjdCIgYnkgcHJlc3NpbmcgdGhlICItIiBrZXkuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2NoYW5nZV9jb3JyZWN0OiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidBbGxvdyBjaGFuZ2luZyB0byAiY29ycmVjdCInLGRlZmF1bHQ6dHJ1ZSxob3Zlcl90aXA6J1doZW4gZW5hYmxlZCwgeW91IGNhbiBjaGFuZ2UgeW91ciBhbnN3ZXJcbnRvICJjb3JyZWN0IiBieSBwcmVzc2luZyB0aGUgIisiIGtleS4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jb3JyZWN0ZWRfYW5zd2VyOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidTaG93IGNvcnJlY3RlZCBhbnN3ZXInLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidXaGVuIGVuYWJsZWQsIHByZXNzaW5nIFwnK1wnIHRvIGNvcnJlY3QgeW91ciBhbnN3ZXIgcHV0cyB0aGVcbmNvcnJlY3RlZCBhbnN3ZXIgaW4gdGhlIGlucHV0IGZpZWxkLiBQcmVzc2luZyBcJytcJyBtdWx0aXBsZVxudGltZXMgY3ljbGVzIHRocm91Z2ggYWxsIGFjY2VwdGFibGUgYW5zd2Vycy4nfSwKICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICBncnBDYXJlbGVzc01pc3Rha2VzOiB7dHlwZTonZ3JvdXAnLGxhYmVsOidDYXJlbGVzcyBNaXN0YWtlcycsY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cG9fYWN0aW9uOiB7dHlwZTonZHJvcGRvd24nLGxhYmVsOidUeXBvcyBpbiBtZWFuaW5nJyxkZWZhdWx0OidpZ25vcmUnLGNvbnRlbnQ6e2lnbm9yZTonSWdub3JlJyx3YXJuOidXYXJuL3NoYWtlJyx3cm9uZzonTWFyayB3cm9uZyd9LGhvdmVyX3RpcDonQ2hvb3NlIGFuIGFjdGlvbiB0byB0YWtlIHdoZW4gbWVhbmluZyBjb250YWlucyB0eXBvcy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgd3JvbmdfYW5zd2VyX3R5cGVfYWN0aW9uOiB7dHlwZTonZHJvcGRvd24nLGxhYmVsOidXcm9uZyBhbnN3ZXIgdHlwZScsZGVmYXVsdDond2FybicsY29udGVudDp7d2FybjonV2Fybi9zaGFrZScsd3Jvbmc6J01hcmsgd3JvbmcnfSxob3Zlcl90aXA6J0Nob29zZSBhbiBhY3Rpb24gdG8gdGFrZSB3aGVuIHJlYWRpbmcgd2FzIGVudGVyZWQgaW5zdGVhZCBvZiBtZWFuaW5nLCBvciB2aWNlIHZlcnNhLid9LAogICAgICAgICAgICAgICAgICAgICAgICB3cm9uZ19udW1iZXJfbl9hY3Rpb246IHt0eXBlOidkcm9wZG93bicsbGFiZWw6J1dyb25nIG51bWJlciBvZiBuXCdzJyxkZWZhdWx0Oid3YXJuJyxjb250ZW50Ont3YXJuOidXYXJuL3NoYWtlJyx3cm9uZzonTWFyayB3cm9uZyd9LGhvdmVyX3RpcDonQ2hvb3NlIGFuIGFjdGlvbiB0byB0YWtlIHdoZW4geW91IHR5cGUgdGhlIHdyb25nIG51bWJlciBvZiBuXCdzIGluIGNlcnRhaW4gcmVhZGluZyBxdWVzdGlvbnMuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsX2thbmFfYWN0aW9uOiB7dHlwZTonZHJvcGRvd24nLGxhYmVsOidCaWcga2FuYSBpbnN0ZWFkIG9mIHNtYWxsJyxkZWZhdWx0Oid3YXJuJyxjb250ZW50Ont3YXJuOidXYXJuL3NoYWtlJyx3cm9uZzonTWFyayB3cm9uZyd9LGhvdmVyX3RpcDonQ2hvb3NlIGFuIGFjdGlvbiB0byB0YWtlIHdoZW4geW91IHR5cGUgYSBiaWcga2FuYSBpbnN0ZWFkIG9mIHNtYWxsIChlLmcuIOOChiBpbnN0ZWFkIG9mIOOChSkuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIGthbmppX3JlYWRpbmdfZm9yX3ZvY2FiX2FjdGlvbjoge3R5cGU6J2Ryb3Bkb3duJyxsYWJlbDonS2FuamkgcmVhZGluZyBpbnN0ZWFkIG9mIHZvY2FiJyxkZWZhdWx0Oid3YXJuJyxjb250ZW50Ont3YXJuOidXYXJuL3NoYWtlJyx3cm9uZzonTWFyayB3cm9uZyd9LGhvdmVyX3RpcDonQ2hvb3NlIGFuIGFjdGlvbiB0byB0YWtlIHdoZW4gdGhlIHJlYWRpbmcgb2YgYSBrYW5qaSBpcyBlbnRlcmVkIGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgdm9jYWIgd29yZCBpbnN0ZWFkIG9mIHRoZSBjb3JyZWN0IHZvY2FiIHJlYWRpbmcuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIGthbmppX21lYW5pbmdfZm9yX3ZvY2FiX2FjdGlvbjoge3R5cGU6J2Ryb3Bkb3duJyxsYWJlbDonS2FuamkgbWVhbmluZyBpbnN0ZWFkIG9mIHZvY2FiJyxkZWZhdWx0Oid3YXJuJyxjb250ZW50Ont3YXJuOidXYXJuL3NoYWtlJyx3cm9uZzonTWFyayB3cm9uZyd9LGhvdmVyX3RpcDonQ2hvb3NlIGFuIGFjdGlvbiB0byB0YWtlIHdoZW4gdGhlIG1lYW5pbmcgb2YgYSBrYW5qaSBpcyBlbnRlcmVkIGZvciBhIHNpbmdsZSBjaGFyYWN0ZXIgdm9jYWIgd29yZCBpbnN0ZWFkIG9mIHRoZSBjb3JyZWN0IHZvY2FiIG1lYW5pbmcuJ30sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgIHRhYk1pc3Rha2VEZWxheToge3R5cGU6J3BhZ2UnLGxhYmVsOidNaXN0YWtlIERlbGF5Jyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICBncnBEZWxheToge3R5cGU6J2dyb3VwJyxsYWJlbDonRGVsYXkgTmV4dCBRdWVzdGlvbicsY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X3dyb25nOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidEZWxheSB3aGVuIHdyb25nJyxkZWZhdWx0OnRydWUscmVmcmVzaF9vbl9jaGFuZ2U6dHJ1ZSxob3Zlcl90aXA6J0lmIHlvdXIgYW5zd2VyIGlzIHdyb25nLCB5b3UgY2Fubm90IGFkdmFuY2VcbnRvIHRoZSBuZXh0IHF1ZXN0aW9uIGZvciBhdCBsZWFzdCBOIHNlY29uZHMuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X211bHRpX21lYW5pbmc6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J0RlbGF5IHdoZW4gbXVsdGlwbGUgbWVhbmluZ3MnLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidJZiB0aGUgaXRlbSBoYXMgbXVsdGlwbGUgbWVhbmluZ3MsIHlvdSBjYW5ub3QgYWR2YW5jZVxudG8gdGhlIG5leHQgcXVlc3Rpb24gZm9yIGF0IGxlYXN0IE4gc2Vjb25kcy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfc2xpZ2h0bHlfb2ZmOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidEZWxheSB3aGVuIGFuc3dlciBoYXMgdHlwb3MnLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidJZiB5b3VyIGFuc3dlciBjb250YWlucyB0eXBvcywgeW91IGNhbm5vdCBhZHZhbmNlXG50byB0aGUgbmV4dCBxdWVzdGlvbiBmb3IgYXQgbGVhc3QgTiBzZWNvbmRzLid9LAogICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9wZXJpb2Q6IHt0eXBlOidudW1iZXInLGxhYmVsOidEZWxheSBwZXJpb2QgKGluIHNlY29uZHMpJyxkZWZhdWx0OjEuNSxob3Zlcl90aXA6J051bWJlciBvZiBzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBhbGxvd2luZ1xueW91IHRvIGFkdmFuY2UgdG8gdGhlIG5leHQgcXVlc3Rpb24uJ30sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgIHRhYkJ1cm5SZXZpZXdzOiB7dHlwZToncGFnZScsbGFiZWw6J0J1cm4gUmV2aWV3cycsY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgZ3JwQnVyblJldmlld3M6IHt0eXBlOidncm91cCcsbGFiZWw6J0J1cm4gUmV2aWV3cycsY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5fYnVybjoge3R5cGU6J2Ryb3Bkb3duJyxsYWJlbDonV2FybiBiZWZvcmUgYnVybmluZycsZGVmYXVsdDonbmV2ZXInLGNvbnRlbnQ6e25ldmVyOidOZXZlcicsY2hlYXRlZDonSWYgeW91IGNoYW5nZWQgYW5zd2VyJyxhbHdheXM6J0Fsd2F5cyd9LGhvdmVyX3RpcDonQ2hvb3NlIHdoZW4gdG8gd2FybiBiZWZvcmUgYnVybmluZyBhbiBpdGVtLid9LAogICAgICAgICAgICAgICAgICAgICAgICBidXJuX2RlbGF5X3BlcmlvZDoge3R5cGU6J251bWJlcicsbGFiZWw6J0RlbGF5IGFmdGVyIHdhcm5pbmcgKGluIHNlY29uZHMpJyxkZWZhdWx0OjEuNSxob3Zlcl90aXA6J051bWJlciBvZiBzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBhbGxvd2luZ1xueW91IHRvIGFkdmFuY2UgdG8gdGhlIG5leHQgcXVlc3Rpb24gYWZ0ZXIgc2VlaW5nIGEgYnVybiB3YXJuaW5nLid9LAogICAgICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB0YWJMaWdodG5pbmc6IHt0eXBlOidwYWdlJyxsYWJlbDonTGlnaHRuaW5nJyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICBncnBMaWdodG5pbmc6IHt0eXBlOidncm91cCcsbGFiZWw6J0xpZ2h0bmluZyBNb2RlJyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19saWdodG5pbmdfYnV0dG9uOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidTaG93ICJMaWdodG5pbmcgTW9kZSIgYnV0dG9uJyxkZWZhdWx0OnRydWUsaG92ZXJfdGlwOidTaG93IHRoZSAiTGlnaHRuaW5nIE1vZGUiIHRvZ2dsZVxuYnV0dG9uIG9uIHRoZSByZXZpZXcgc2NyZWVuLid9LAogICAgICAgICAgICAgICAgICAgICAgICBsaWdodG5pbmdfZW5hYmxlZDoge3R5cGU6J2NoZWNrYm94JyxsYWJlbDonRW5hYmxlICJMaWdodG5pbmcgTW9kZSInLGRlZmF1bHQ6dHJ1ZSxyZWZyZXNoX29uX2NoYW5nZTp0cnVlLGhvdmVyX3RpcDonRW5hYmxlICJMaWdodG5pbmcgTW9kZSIsIHdoaWNoIGF1dG9tYXRpY2FsbHkgYWR2YW5jZXMgdG9cbnRoZSBuZXh0IHF1ZXN0aW9uIGlmIHlvdSBhbnN3ZXIgY29ycmVjdGx5Lid9LAogICAgICAgICAgICAgICAgICAgICAgICBzcnNfbXNnX3BlcmlvZDoge3R5cGU6J251bWJlcicsbGFiZWw6J1NSUyBwb3B1cCB0aW1lIChpbiBzZWNvbmRzKScsZGVmYXVsdDoxLjIsbWluOjAsaG92ZXJfdGlwOidIb3cgbG9uZyB0byBzaG93IFNSUyB1cC9kb3duIHBvcHVwIHdoZW4gaW4gbGlnaHRuaW5nIG1vZGUuICAoMCA9IGRvblwndCBzaG93KSd9LAogICAgICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB0YWJBdXRvSW5mbzoge3R5cGU6J3BhZ2UnLGxhYmVsOidJdGVtIEluZm8nLGNvbnRlbnQ6ewogICAgICAgICAgICAgICAgICAgIGdycEF1dG9JbmZvOiB7dHlwZTonZ3JvdXAnLGxhYmVsOidTaG93IEl0ZW0gSW5mbycsY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9pbmZvX2NvcnJlY3Q6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J0FmdGVyIGNvcnJlY3QgYW5zd2VyJyxkZWZhdWx0OmZhbHNlLGhvdmVyX3RpcDonQXV0b21hdGljYWxseSBzaG93IHRoZSBJdGVtIEluZm8gYWZ0ZXIgY29ycmVjdCBhbnN3ZXJzLicsIHZhbGlkYXRlOnZhbGlkYXRlX2F1dG9pbmZvX2NvcnJlY3R9LAogICAgICAgICAgICAgICAgICAgICAgICBhdXRvaW5mb19pbmNvcnJlY3Q6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J0FmdGVyIGluY29ycmVjdCBhbnN3ZXInLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidBdXRvbWF0aWNhbGx5IHNob3cgdGhlIEl0ZW0gSW5mbyBhZnRlciBpbmNvcnJlY3QgYW5zd2Vycy4nLCB2YWxpZGF0ZTp2YWxpZGF0ZV9hdXRvaW5mb19pbmNvcnJlY3R9LAogICAgICAgICAgICAgICAgICAgICAgICBhdXRvaW5mb19tdWx0aV9tZWFuaW5nOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidXaGVuIG11bHRpcGxlIG1lYW5pbmdzJyxkZWZhdWx0OmZhbHNlLGhvdmVyX3RpcDonQXV0b21hdGljYWxseSBzaG93IHRoZSBJdGVtIEluZm8gd2hlbiBhbiBpdGVtIGhhcyBtdWx0aXBsZSBtZWFuaW5ncy4nLCB2YWxpZGF0ZTp2YWxpZGF0ZV9hdXRvaW5mb19jb3JyZWN0fSwKICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2luZm9fc2xpZ2h0bHlfb2ZmOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidXaGVuIGFuc3dlciBoYXMgdHlwb3MnLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidBdXRvbWF0aWNhbGx5IHNob3cgdGhlIEl0ZW0gSW5mbyB3aGVuIHlvdXIgYW5zd2VyIGhhcyB0eXBvcy4nLCB2YWxpZGF0ZTp2YWxpZGF0ZV9hdXRvaW5mb19jb3JyZWN0fSwKICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgZGlhbG9nLm9wZW4oKTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gdmFsaWRhdGVfYXV0b2luZm9fY29ycmVjdCgpIC0gTm90aWZ5IHVzZXIgaWYgaXRlbWluZm8gYW5kIGxpZ2h0bmluZyBhcmUgYm90aCBlbmFibGVkLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlX2F1dG9pbmZvX2NvcnJlY3QoZW5hYmxlZCkgewogICAgICAgIGlmIChlbmFibGVkICYmIHNldHRpbmdzLmxpZ2h0bmluZ19lbmFibGVkKSB7CiAgICAgICAgICAgIHJldHVybiAnRGlzYWJsZSAiTGlnaHRuaW5nIE1vZGUiISc7CiAgICAgICAgfQogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyB2YWxpZGF0ZV9hdXRvaW5mb19pbmNvcnJlY3QoKSAtIE5vdGlmeSB1c2VyIGlmIGl0ZW1pbmZvIGFuZCBsaWdodG5pbmcgYXJlIGJvdGggZW5hYmxlZCwgYW5kIHdyb25nX2RlbGF5IGRpc2FibGVkLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHZhbGlkYXRlX2F1dG9pbmZvX2luY29ycmVjdChlbmFibGVkKSB7CiAgICAgICAgaWYgKGVuYWJsZWQgJiYgc2V0dGluZ3MubGlnaHRuaW5nX2VuYWJsZWQgJiYgIXNldHRpbmdzLmRlbGF5X3dyb25nKSB7CiAgICAgICAgICAgIHJldHVybiAnRGlzYWJsZSAiTGlnaHRuaW5nIE1vZGUiLCBvcjxicj5lbmFibGUgIkRlbGF5IHdoZW4gd3JvbmciISc7CiAgICAgICAgfQogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBzZXR0aW5nc19wcmVvcGVuKCkgLSBOb3RpZnkgdXNlciBpZiBpdGVtaW5mbyBhbmQgbGlnaHRuaW5nIGFyZSBib3RoIGVuYWJsZWQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gc2V0dGluZ3NfcHJlb3BlbihkaWFsb2cpIHsKICAgICAgICBkaWFsb2cuZGlhbG9nKHt3aWR0aDo1MjV9KTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gaW5pdF91aSgpIC0gSW5pdGlhbGl6ZSB0aGUgdXNlciBpbnRlcmZhY2UuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgdmFyIGZpcnN0X3RpbWUgPSB0cnVlOwogICAgZnVuY3Rpb24gaW5pdF91aSgpIHsKICAgICAgICBzZXR0aW5ncyA9IHdrb2Yuc2V0dGluZ3MuZG91YmxlY2hlY2s7CgogICAgICAgIGlmIChmaXJzdF90aW1lKSB7CiAgICAgICAgICAgIGZpcnN0X3RpbWUgPSBmYWxzZTsKICAgICAgICAgICAgc3RhcnR1cCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gTWlncmF0ZSAnbGlnaHRuaW5nJyBzZXR0aW5nIGZyb20gbG9jYWxTdG9yYWdlLgogICAgICAgIHZhciBsaWdodG5pbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbGlnaHRuaW5nJyk7CiAgICAgICAgaWYgKGxpZ2h0bmluZyA9PT0gJ2ZhbHNlJyB8fCBsaWdodG5pbmcgPT09ICd0cnVlJykgewogICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnbGlnaHRuaW5nJyk7CiAgICAgICAgICAgIHNldHRpbmdzLmxpZ2h0bmluZ19lbmFibGVkID0gbGlnaHRuaW5nOwogICAgICAgICAgICB3a29mLlNldHRpbmdzLnNhdmUoJ2RvdWJsZWNoZWNrJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBMaWdodG5pbmcgTW9kZSBidXR0b24uCiAgICAgICAgaWYgKHNldHRpbmdzLmxpZ2h0bmluZ19lbmFibGVkKSB7CiAgICAgICAgICAgICQoJyNsaWdodG5pbmctbW9kZScpLmFkZENsYXNzKCdkb3VibGVjaGVjay1hY3RpdmUnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjbGlnaHRuaW5nLW1vZGUnKS5yZW1vdmVDbGFzcygnZG91YmxlY2hlY2stYWN0aXZlJyk7CiAgICAgICAgfQogICAgICAgICQoJyNsaWdodG5pbmctbW9kZScpLnByb3AoJ2hpZGRlbicsICFzZXR0aW5ncy5zaG93X2xpZ2h0bmluZ19idXR0b24pOwoKICAgICAgICBzZXRDbGFzcygnI29wdGlvbi1kb3VibGUtY2hlY2snLCAnaGlkZGVuJywgIShzZXR0aW5ncy5hbGxvd19jaGFuZ2VfY29ycmVjdCB8fCBzZXR0aW5ncy5hbGxvd19jaGFuZ2VfaW5jb3JyZWN0KSk7CiAgICAgICAgc2V0Q2xhc3MoJyNvcHRpb24tcmV0eXBlJywgJ2hpZGRlbicsICFzZXR0aW5ncy5hbGxvd19yZXR5cGluZyk7CiAgICAgICAgcmVzaXplX2J1dHRvbnMoKTsKCiAgICAgICAgaWYgKHN0YXRlID09PSAnc2Vjb25kX3N1Ym1pdCcpIHsKICAgICAgICAgICAgc2V0Q2xhc3MoJyNvcHRpb24tZG91YmxlLWNoZWNrJywgJ2Rpc2FibGVkJywgISgKICAgICAgICAgICAgICAgIChuZXdfYW5zd2VyLnBhc3NlZCAmJiAoc2V0dGluZ3MuYWxsb3dfY2hhbmdlX2luY29ycmVjdCB8fCAhZmlyc3RfYW5zd2VyLnBhc3NlZCkpIHx8CiAgICAgICAgICAgICAgICAoIW5ld19hbnN3ZXIucGFzc2VkICYmIChzZXR0aW5ncy5hbGxvd19jaGFuZ2VfY29ycmVjdCB8fCBmaXJzdF9hbnN3ZXIucGFzc2VkKSkKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIHNldENsYXNzKCcjb3B0aW9uLXJldHlwZScsICdkaXNhYmxlZCcsICFzZXR0aW5ncy5hbGxvd19yZXR5cGluZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2V0Q2xhc3MoJyNvcHRpb24tZG91YmxlLWNoZWNrJywgJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIHZhciBvbGRfc3VibWl0X2hhbmRsZXIsIG9sZF9hbnN3ZXJfY2hlY2tlciwgaWdub3JlX3N1Ym1pdCA9IGZhbHNlLCBzdGF0ZSA9ICdmaXJzdF9zdWJtaXQnLCBzaG93X3Nycywgc3JzX2xvYWQsIGRlbGF5X3RpbWVyOwogICAgdmFyIGl0ZW0sIGl0eXBlLCBpdGVtX2lkLCBpdGVtX3N0YXR1cywgcXR5cGUsIHZhbGlkX2Fuc3dlcnMsIHdyb25nX2NudCwgcXVlc3Rpb25fY250LCBjb21wbGV0ZWRfY250LCBhbnN3ZXIsIG5ld19hbnN3ZXIsIGFjdGl2ZV9xdWV1ZTsKICAgIHZhciBsYXN0X2l0ZW1faWQsIGxhc3RfcXR5cGUsIGZpcnN0X2Fuc3dlcjsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gbGlnaHRuaW5nX2NsaWNrZWQoKSAtIExpZ2h0bmluZyBidXR0b24gaGFuZGxlci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBsaWdodG5pbmdfY2xpY2tlZCgpIHsKICAgICAgICBzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCA9ICFzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZDsKICAgICAgICB3a29mLlNldHRpbmdzLnNhdmUoJ2RvdWJsZWNoZWNrJyk7CiAgICAgICAgJCgnI2xpZ2h0bmluZy1tb2RlJykudG9nZ2xlQ2xhc3MoJ2RvdWJsZWNoZWNrLWFjdGl2ZScsIHNldHRpbmdzLmxpZ2h0bmluZ19lbmFibGVkKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIGdldF9jb3JyZWN0X2Fuc3dlcnMoKSAtIFJldHVybnMgYW4gYXJyYXkgb2YgYWNjZXB0YWJsZSBhbnN3ZXJzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGdldF9jb3JyZWN0X2Fuc3dlcnMoKSB7CiAgICAgICAgaWYgKHF0eXBlID09PSAncmVhZGluZycpIHsKICAgICAgICAgICAgaWYgKGl0eXBlID09PSAnaycpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5lbXBoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAib255b21pIjogcmV0dXJuIGl0ZW0ub247CiAgICAgICAgICAgICAgICAgICAgY2FzZSAia3VueW9taSI6IHJldHVybiBpdGVtLmt1bjsKICAgICAgICAgICAgICAgICAgICBjYXNlICJuYW5vcmkiOiByZXR1cm4gaXRlbS5uYW5vcmk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5rYW5hOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFtdLmNvbmNhdChpdGVtLnN5bixpdGVtLmVuKTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIGdldF9uZXh0X2NvcnJlY3RfYW5zd2VyKCkgLSBSZXR1cm5zIHRoZSBuZXh0IGFjY2VwdGFibGUgYW5zd2VyIGZyb20gdGhlCiAgICAvLyAgICBhcnJheSByZXR1cm5lZCBieSBnZXRfY29ycmVjdF9hbnN3ZXJzKCkuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZ2V0X25leHRfY29ycmVjdF9hbnN3ZXIoKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGZpcnN0X2Fuc3dlci5jb3JyZWN0X2Fuc3dlcnNbZmlyc3RfYW5zd2VyLmNvcnJlY3RfYW5zd2VyX2luZGV4XTsKICAgICAgICBmaXJzdF9hbnN3ZXIuY29ycmVjdF9hbnN3ZXJfaW5kZXggPSAoZmlyc3RfYW5zd2VyLmNvcnJlY3RfYW5zd2VyX2luZGV4ICsgMSkgJSBmaXJzdF9hbnN3ZXIuY29ycmVjdF9hbnN3ZXJzLmxlbmd0aDsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyB0b2dnbGVfcmVzdWx0KCkgLSBUb2dnbGUgYW4gYW5zd2VyIGZyb20gcmlnaHQtPndyb25nIG9yIHdyb25nLT5yaWdodC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiB0b2dnbGVfcmVzdWx0KG5ld19zdGF0ZSkgewogICAgICAgIGlmIChuZXdfc3RhdGUgPT09ICd0b2dnbGUnKSBuZXdfc3RhdGUgPSAobmV3X2Fuc3dlci5wYXNzZWQgPyAnaW5jb3JyZWN0JyA6ICdjb3JyZWN0Jyk7CiAgICAgICAgaWYgKHN0YXRlICE9PSAnc2Vjb25kX3N1Ym1pdCcpIHJldHVybiBmYWxzZTsKCiAgICAgICAgdmFyIGlucHV0ID0gJCgnI2Fuc3dlci1mb3JtIGZpZWxkc2V0IGlucHV0Jyk7CiAgICAgICAgdmFyIGN1cnJlbnRfcmVzcG9uc2UgPSBpbnB1dC52YWwoKTsKICAgICAgICBjbGVhcl9kZWxheSgpOwogICAgICAgIHN3aXRjaCAobmV3X3N0YXRlKSB7CiAgICAgICAgICAgIGNhc2UgJ2NvcnJlY3QnOgogICAgICAgICAgICAgICAgaWYgKCEoc2V0dGluZ3MuYWxsb3dfY2hhbmdlX2NvcnJlY3QgfHwgZmlyc3RfYW5zd2VyLnBhc3NlZCkpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChmaXJzdF9hbnN3ZXIucGFzc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsKGZpcnN0X2Fuc3dlci5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbChnZXRfbmV4dF9jb3JyZWN0X2Fuc3dlcigpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5ld19hbnN3ZXIgPSB7cGFzc2VkOnRydWUsIGFjY3VyYXRlOnRydWUsIG11bHRpcGxlQW5zd2VyczpmYWxzZSwgZXhjZXB0aW9uOmZhbHNlfTsKICAgICAgICAgICAgICAgIHNldF9hbnN3ZXJfc3RhdGUobmV3X2Fuc3dlciwgZmFsc2UgLyogc2hvd19tc2dzICovKTsKICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3Muc2hvd19jb3JyZWN0ZWRfYW5zd2VyKSBpbnB1dC52YWwoY3VycmVudF9yZXNwb25zZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnaW5jb3JyZWN0JzoKICAgICAgICAgICAgICAgIGlmICghKG5ld19hbnN3ZXIucGFzc2VkICYmIChzZXR0aW5ncy5hbGxvd19jaGFuZ2VfaW5jb3JyZWN0IHx8ICFmaXJzdF9hbnN3ZXIucGFzc2VkKSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIGlmIChmaXJzdF9hbnN3ZXIucGFzc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsKCd4eHh4eHgnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsKGZpcnN0X2Fuc3dlci5yZXNwb25zZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXdfYW5zd2VyID0ge3Bhc3NlZDpmYWxzZSwgYWNjdXJhdGU6ZmFsc2UsIG11bHRpcGxlQW5zd2VyczpmYWxzZSwgZXhjZXB0aW9uOmZhbHNlfTsKICAgICAgICAgICAgICAgIHNldF9hbnN3ZXJfc3RhdGUobmV3X2Fuc3dlciwgZmFsc2UgLyogc2hvd19tc2dzICovKTsKICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3Muc2hvd19jb3JyZWN0ZWRfYW5zd2VyKSBpbnB1dC52YWwoY3VycmVudF9yZXNwb25zZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAncmV0eXBlJzoKICAgICAgICAgICAgICAgIGlmICghc2V0dGluZ3MuYWxsb3dfcmV0eXBpbmcpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIHNldF9hbnN3ZXJfc3RhdGUoe3Jlc2V0OnRydWUsIGR1ZV90b19yZXR5cGU6dHJ1ZX0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBkb19kZWxheSgpIC0gRGlzYWJsZSB0aGUgc3VibWl0IGJ1dHRvbiBicmllZmx5IHRvIHByZXZlbnQgY2xpY2tpbmcgcGFzdCB3cm9uZyBhbnN3ZXJzLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIGRvX2RlbGF5KHBlcmlvZCkgewogICAgICAgIGlmIChwZXJpb2QgPT09IHVuZGVmaW5lZCkgcGVyaW9kID0gc2V0dGluZ3MuZGVsYXlfcGVyaW9kOwogICAgICAgIGlnbm9yZV9zdWJtaXQgPSB0cnVlOwogICAgICAgIGRlbGF5X3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgZGVsYXlfdGltZXIgPSAtMTsKICAgICAgICAgICAgaWdub3JlX3N1Ym1pdCA9IGZhbHNlOwogICAgICAgIH0sIHBlcmlvZCoxMDAwKTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gY2xlYXJfZGVsYXkoKSAtIENsZWFyIHRoZSBkZWxheSB0aW1lci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBjbGVhcl9kZWxheSgpIHsKICAgICAgICBpZiAoZGVsYXlfdGltZXIpIHsKICAgICAgICAgICAgaWdub3JlX3N1Ym1pdCA9IGZhbHNlOwogICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVsYXlfdGltZXIpOwogICAgICAgICAgICBkZWxheV90aW1lciA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIHJldHVybl9uZXdfYW5zd2VyKCkgLSBBbHRlcm5hdGUgYW5zd2VyIGNoZWNrZXIgdGhhdCBvdmVycmlkZXMgb3VyIHJlc3VsdHMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gcmV0dXJuX25ld19hbnN3ZXIoKSB7CiAgICAgICAgcmV0dXJuIG5ld19hbnN3ZXI7CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIHNldF9hbnN3ZXJfc3RhdGUoKSAtIFVwZGF0ZSB0aGUgc2NyZWVuIHRvIHNob3cgcmVzdWx0cyBvZiBhbnN3ZXItY2hlY2suCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gc2V0X2Fuc3dlcl9zdGF0ZShhbnN3ZXIsIHNob3dfbXNncykgewogICAgICAgIC8vIElmIHVzZXIgcmVxdWVzdGVkIHRvIHJldHlwZSBhbnN3ZXIsIHJlc2V0IHRoZSBxdWVzdGlvbi4KICAgICAgICBpZiAoYW5zd2VyLnJlc2V0KSB7CiAgICAgICAgICAgIGNsZWFyX2RlbGF5KCk7CiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gJ3NlY29uZF9zdWJtaXQnKSB7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgnd3JvbmdDb3VudCcsIHdyb25nX2NudCk7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgncXVlc3Rpb25Db3VudCcsIHF1ZXN0aW9uX2NudCk7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgnY29tcGxldGVkQ291bnQnLCBjb21wbGV0ZWRfY250KTsKICAgICAgICAgICAgICAgICQualN0b3JhZ2Uuc2V0KCdhY3RpdmVRdWV1ZScsIGFjdGl2ZV9xdWV1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUgPSAnZmlyc3Rfc3VibWl0JzsKCiAgICAgICAgICAgIC8vIElmIHdlIGFyZSByZXNldHRpbmcgZHVlIHRvIHRoZSB1c2VyIGNsaWNraW5nICdyZXR5cGUnLCB0aGVuIHdlIG5lZWQgdG8gdHJpZ2dlcgogICAgICAgICAgICAvLyBhIHJlZnJlc2ggdGhlIGlucHV0IGZpZWxkIGFuZCBzdGF0cyBieSB1cGRhdGluZyAnY3VycmVudEl0ZW0nIGluIGpTdG9yYWdlLgogICAgICAgICAgICBpZiAoYW5zd2VyLmR1ZV90b19yZXR5cGUpIHsKICAgICAgICAgICAgICAgICQualN0b3JhZ2Uuc2V0KCdjdXJyZW50SXRlbScsICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpKTsKICAgICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CgogICAgICAgICAgICB3aW5kb3cud2tSZWZyZXNoQXVkaW8oKTsKICAgICAgICAgICAgJCgiI2Fuc3dlci1leGNlcHRpb24iKS5yZW1vdmUoKTsKICAgICAgICAgICAgJCgnI29wdGlvbi1kb3VibGUtY2hlY2snKS5hZGRDbGFzcygnZGlzYWJsZWQnKS5maW5kKCdzcGFuJykuYXR0cigndGl0bGUnLCdNYXJrIFJpZ2h0JykuZmluZCgnaScpLmF0dHIoJ2NsYXNzJywnZmEgZmEtdGh1bWJzLXVwJyk7CiAgICAgICAgICAgICQoJyNvcHRpb24tcmV0eXBlJykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgIFNycy5yZW1vdmUoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYW5zd2VyIGlzIGludmFsaWQgZm9yIHNvbWUgcmVhc29uLCBkbyB0aGUgc2hha2UgdGhpbmcuCiAgICAgICAgdmFyIGRibGNoayA9ICQoJyNvcHRpb24tZG91YmxlLWNoZWNrJyk7CiAgICAgICAgdmFyIGlucHV0ID0gJCgnI3VzZXItcmVzcG9uc2UnKTsKICAgICAgICBpZiAoYW5zd2VyLmV4Y2VwdGlvbikgewogICAgICAgICAgICAkKCIjYW5zd2VyLWV4Y2VwdGlvbiIpLnJlbW92ZSgpOwogICAgICAgICAgICBpZiAoYW5zd2VyLmNvbmZpcm1pbmdfYnVybikgewogICAgICAgICAgICAgICAgLy8gTk9URTogV2UgY2FuIG9ubHkgcmVhY2ggdGhpcyBicmFuY2ggaWYgdGhlIGN1cnJlbnQgYW5zd2VyIGlzIGNvcnJlY3QsIG90aGVyd2lzZSB3ZSB3b3VsZG4ndCBiZSBidXJuaW5nIGl0LgogICAgICAgICAgICAgICAgZGJsY2hrLmZpbmQoJ3NwYW4nKS5hdHRyKCd0aXRsZScsJ01hcmsgV3JvbmcnKS5maW5kKCdpJykuYXR0cignY2xhc3MnLCdmYSBmYS10aHVtYnMtZG93bicpOwogICAgICAgICAgICAgICAgc2V0Q2xhc3MoZGJsY2hrLCAnZGlzYWJsZWQnLCAhKHNldHRpbmdzLmFsbG93X2NoYW5nZV9pbmNvcnJlY3QgfHwgIWZpcnN0X2Fuc3dlci5wYXNzZWQpKTsKICAgICAgICAgICAgICAgICQoIiNhbnN3ZXItZm9ybSBmaWVsZHNldCIpLnJlbW92ZUNsYXNzKCdpbmNvcnJlY3QnKS5yZW1vdmVDbGFzcygnY29ycmVjdCcpLmFkZENsYXNzKCdjb25mYnVybicpOwogICAgICAgICAgICAgICAgJCgiI2FkZGl0aW9uYWwtY29udGVudCIpLmFwcGVuZCgkKCc8ZGl2IGlkPSJhbnN3ZXItZXhjZXB0aW9uIj48c3Bhbj4nK2Fuc3dlci5leGNlcHRpb24rJzwvc3Bhbj48L2Rpdj4nKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZUluVXAiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkKCIjYW5zd2VyLWZvcm0gZm9ybSIpLmlzKCI6YW5pbWF0ZWQiKSkgewogICAgICAgICAgICAgICAgJCgiI3Jldmlld3MiKS5jc3MoIm92ZXJmbG93LXgiLCAiaGlkZGVuIik7CiAgICAgICAgICAgICAgICAkKCIjYW5zd2VyLWZvcm0gZm9ybSIpLmVmZmVjdCgic2hha2UiLCB7fSwgMzAwLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjcmV2aWV3cyIpLmNzcygib3ZlcmZsb3cteCIsICJ2aXNpYmxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbnN3ZXIuYWNjdXJhdGUgJiYgaW5wdXQudmFsKCkgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYW5zd2VyLmV4Y2VwdGlvbiA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNhbnN3ZXItZm9ybSBmb3JtIikuYXBwZW5kKCQoJzxkaXYgaWQ9ImFuc3dlci1leGNlcHRpb24iIGNsYXNzPSJhbnN3ZXItZXhjZXB0aW9uLWZvcm0iPjxzcGFuPicgKyBhbnN3ZXIuZXhjZXB0aW9uICsgJzwvc3Bhbj48L2Rpdj4nKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZUluVXAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS5maW5kKCJpbnB1dCIpLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gRHJhdyAnY29ycmVjdCcgb3IgJ2luY29ycmVjdCcgcmVzdWx0cywgZW5hYmxlIERvdWJsZS1DaGVjayBidXR0b24sIGFuZCBjYWxjdWxhdGUgdXBkYXRlZCBzdGF0aXN0aWNzLgogICAgICAgICQoIiN1c2VyLXJlc3BvbnNlIikuYmx1cigpOwogICAgICAgIHZhciBuZXdfc3RhdHVzID0gT2JqZWN0LmFzc2lnbih7fSxpdGVtX3N0YXR1cyk7CiAgICAgICAgdmFyIHJldHlwZSA9ICQoJyNvcHRpb24tcmV0eXBlJyk7CiAgICAgICAgc2V0Q2xhc3MocmV0eXBlLCAnZGlzYWJsZWQnLCAhc2V0dGluZ3MuYWxsb3dfcmV0eXBpbmcpOwogICAgICAgIGlmIChhbnN3ZXIucGFzc2VkKSB7CiAgICAgICAgICAgICQoIiNhbnN3ZXItZm9ybSBmaWVsZHNldCIpLnJlbW92ZUNsYXNzKCdpbmNvcnJlY3QnKS5yZW1vdmVDbGFzcygnY29uZmJ1cm4nKS5hZGRDbGFzcygnY29ycmVjdCcpOwogICAgICAgICAgICBkYmxjaGsuZmluZCgnc3BhbicpLmF0dHIoJ3RpdGxlJywnTWFyayBXcm9uZycpLmZpbmQoJ2knKS5hdHRyKCdjbGFzcycsJ2ZhIGZhLXRodW1icy1kb3duJyk7CiAgICAgICAgICAgIHNldENsYXNzKGRibGNoaywgJ2Rpc2FibGVkJywgIShzZXR0aW5ncy5hbGxvd19jaGFuZ2VfaW5jb3JyZWN0IHx8ICFmaXJzdF9hbnN3ZXIucGFzc2VkKSk7CiAgICAgICAgICAgIGlmIChxdHlwZSA9PT0gJ21lYW5pbmcnKSB7CiAgICAgICAgICAgICAgICBuZXdfc3RhdHVzLm1jID0gKG5ld19zdGF0dXMubWMgfHwgMCkgKyAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV3X3N0YXR1cy5yYyA9IChuZXdfc3RhdHVzLnJjIHx8IDApICsgMTsKICAgICAgICAgICAgICAgIGlmIChpbnB1dC52YWwoKS5zbGljZSgtMSkgPT09ICduJykgaW5wdXQudmFsKGlucHV0LnZhbCgpLnNsaWNlKDAsLTEpKyfjgpMnKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoIiNhbnN3ZXItZm9ybSBmaWVsZHNldCIpLnJlbW92ZUNsYXNzKCdjb3JyZWN0JykucmVtb3ZlQ2xhc3MoJ2NvbmZidXJuJykuYWRkQ2xhc3MoJ2luY29ycmVjdCcpOwogICAgICAgICAgICBkYmxjaGsuZmluZCgnc3BhbicpLmF0dHIoJ3RpdGxlJywnTWFyayBSaWdodCcpLmZpbmQoJ2knKS5hdHRyKCdjbGFzcycsJ2ZhIGZhLXRodW1icy11cCcpOwogICAgICAgICAgICBzZXRDbGFzcyhkYmxjaGssICdkaXNhYmxlZCcsICEoc2V0dGluZ3MuYWxsb3dfY2hhbmdlX2NvcnJlY3QgfHwgZmlyc3RfYW5zd2VyLnBhc3NlZCkpOwogICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgnd3JvbmdDb3VudCcsIHdyb25nX2NudCArIDEpOwogICAgICAgIH0KICAgICAgICAkLmpTdG9yYWdlLnNldCgncXVlc3Rpb25Db3VudCcsIHF1ZXN0aW9uX2NudCArIDEpOwoKICAgICAgICBpZiAoKChpdHlwZSA9PT0gJ3InKSB8fCAoKG5ld19zdGF0dXMucmMgfHwgMCkgPj0gMSkpICYmICgobmV3X3N0YXR1cy5tYyB8fCAwKSA+PSAxKSkgewogICAgICAgICAgICBpZiAoc2hvd19zcnMpIHsKICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5zcnNfbXNnX3BlcmlvZCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXR1cyA9IE9iamVjdC5hc3NpZ24oe30sbmV3X3N0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcnMgPSBpdGVtLnNyczsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChTcnMubG9hZC5iaW5kKFNycywgc3RhdHVzLCBzcnMpLCAxMDApOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFNycy5yZW1vdmUsIHNldHRpbmdzLnNyc19tc2dfcGVyaW9kICogMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBTcnMucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgU3JzLmxvYWQobmV3X3N0YXR1cyxpdGVtLnNycyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJC5qU3RvcmFnZS5zZXQoJ2NvbXBsZXRlZENvdW50JywgY29tcGxldGVkX2NudCArIDEpOwogICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgnYWN0aXZlUXVldWUnLCBhY3RpdmVfcXVldWUuc2xpY2UoMSkpOwogICAgICAgIH0KCiAgICAgICAgJCgiI3VzZXItcmVzcG9uc2UiKS5wcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoKICAgICAgICB3aW5kb3cud2tSZWZyZXNoQXVkaW8oKTsKICAgICAgICBhZGRpdGlvbmFsQ29udGVudC5lbmFibGVCdXR0b25zKCk7CiAgICAgICAgbGFzdEl0ZW1zLmRpc2FibGVTZXNzaW9uU3RhdHMoKTsKICAgICAgICAkKCIjYW5zd2VyLWV4Y2VwdGlvbiIpLnJlbW92ZSgpOwoKICAgICAgICAvLyBPcGVuIGl0ZW0gaW5mbywgZGVwZW5kaW5nIG9uIHNldHRpbmdzLgogICAgICAgIHZhciBzaG93aW5nX2luZm8gPSBmYWxzZTsKICAgICAgICBpZiAoYW5zd2VyLnBhc3NlZCAmJiAhc2V0dGluZ3MubGlnaHRuaW5nX2VuYWJsZWQgJiYKICAgICAgICAgICAgKHNldHRpbmdzLmF1dG9pbmZvX2NvcnJlY3QgfHwKICAgICAgICAgICAgIChzZXR0aW5ncy5hdXRvaW5mb19zbGlnaHRseV9vZmYgJiYgIWFuc3dlci5hY2N1cmF0ZSkgfHwKICAgICAgICAgICAgIChzZXR0aW5ncy5hdXRvaW5mb19tdWx0aV9tZWFuaW5nICYmIGFuc3dlci5tdWx0aXBsZUFuc3dlcnMpCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgc2hvd2luZ19pbmZvID0gdHJ1ZTsKICAgICAgICAgICAgJCgnI29wdGlvbi1pdGVtLWluZm8nKS5jbGljaygpOwogICAgICAgIH0gZWxzZSBpZiAoIWFuc3dlci5wYXNzZWQgJiYgIShzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCAmJiAhc2V0dGluZ3MuZGVsYXlfd3JvbmcpICYmIHNldHRpbmdzLmF1dG9pbmZvX2luY29ycmVjdCkgewogICAgICAgICAgICBzaG93aW5nX2luZm8gPSB0cnVlOwogICAgICAgICAgICAkKCcjb3B0aW9uLWl0ZW0taW5mbycpLmNsaWNrKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBXaGVuIHVzZXIgaXMgc3VibWl0dGluZyBhbiBhbnN3ZXIsIGRpc3BsYXkgdGhlIG9uLXNjcmVlbiBtZXNzYWdlIHRoYXQgV2FuaWthbmkgbm9ybWFsbHkgc2hvd3MuCiAgICAgICAgaWYgKHNob3dfbXNncykgewogICAgICAgICAgICB2YXIgbXNnOwogICAgICAgICAgICBpZiAoYW5zd2VyLnBhc3NlZCkgewogICAgICAgICAgICAgICAgaWYgKCFhbnN3ZXIuYWNjdXJhdGUpIHsKICAgICAgICAgICAgICAgICAgICBtc2cgPSAnWW91ciBhbnN3ZXIgd2FzIGEgYml0IG9mZi4gQ2hlY2sgdGhlICcrcXR5cGUrJyB0byBtYWtlIHN1cmUgeW91IGFyZSBjb3JyZWN0JzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5zd2VyLm11bHRpcGxlQW5zd2VycykgewogICAgICAgICAgICAgICAgICAgIG1zZyA9ICdEaWQgeW91IGtub3cgdGhpcyBpdGVtIGhhcyBtdWx0aXBsZSBwb3NzaWJsZSAnK3F0eXBlKydzPyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5zd2VyLmN1c3RvbV9tc2cpIHsKICAgICAgICAgICAgICAgIG1zZyA9IGFuc3dlci5jdXN0b21fbXNnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbXNnID0gJ05lZWQgaGVscD8gVmlldyB0aGUgY29ycmVjdCAnK3F0eXBlKycgYW5kIG1uZW1vbmljJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobXNnKSB7CiAgICAgICAgICAgICAgICBpZiAoc2hvd2luZ19pbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI2luZm9ybWF0aW9uIikucHJlcGVuZCgkKCc8ZGl2IGlkPSJhbnN3ZXItZXhjZXB0aW9uIiBzdHlsZT0idG9wOjA7Ij48c3Bhbj4nK21zZysnPC9zcGFuPjwvZGl2PicpLmFkZENsYXNzKCJhbmltYXRlZCBmYWRlSW5VcCIpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI2FkZGl0aW9uYWwtY29udGVudCIpLmFwcGVuZCgkKCc8ZGl2IGlkPSJhbnN3ZXItZXhjZXB0aW9uIj48c3Bhbj4nK21zZysnPC9zcGFuPjwvZGl2PicpLmFkZENsYXNzKCJhbmltYXRlZCBmYWRlSW5VcCIpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gc2V0Q2xhc3MoKSAtIEFkZCBvciByZW1vdmUgYSBjbGFzcyBiYXNlZCBvbiB0aGUgJ2VuYWJsZWQnIHN0YXRlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHNldENsYXNzKGVsZW0sIGNsYXNzbmFtZSwgZW5hYmxlZCkgewogICAgICAgIGlmICh0eXBlb2YgZWxlbSA9PT0gJ3N0cmluZycpIGVsZW0gPSAkKGVsZW0pOwogICAgICAgIGlmIChlbmFibGVkKSB7CiAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoY2xhc3NuYW1lKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MoY2xhc3NuYW1lKTsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIG5ld19zdWJtaXRfaGFuZGxlcigpIC0gSW50ZXJjZXB0IGhhbmRsZXIgZm9yICdzdWJtaXQnIGJ1dHRvbi4gIE92ZXJyaWRlcyBkZWZhdWx0IGJlaGF2aW9yIGFzIG5lZWRlZC4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBuZXdfc3VibWl0X2hhbmRsZXIoZSkgewogICAgICAgIC8vIERvbid0IHByb2Nlc3MgJ3N1Ym1pdCcgaWYgd2UgYXJlIGlnbm9yaW5nIHRlbXBvcmFyaWx5ICh0byBwcmV2ZW50IGRvdWJsZS10YXBwaW5nIHBhc3QgaW1wb3J0YW50IGluZm8pCgogICAgICAgIGlmIChpZ25vcmVfc3VibWl0KSB7CiAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIHByZXNzZXMgPGVudGVyPiBkdXJpbmcgZGVsYXkgcGVyaW9kLAogICAgICAgICAgICAvLyBXSyBlbmFibGVzIHRoZSB1c2VyIGlucHV0IGZpZWxkLCB3aGljaCBtYWtlcyBJdGVtIEluZm8gbm90IHdvcmsuCiAgICAgICAgICAgIC8vIExldCdzIG1ha2Ugc3VyZSB0aGUgaW5wdXQgZmllbGQgaXMgZGlzYWJsZWQuCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICQoIiN1c2VyLXJlc3BvbnNlIikucHJvcCgnZGlzYWJsZWQnLHRydWUpOwogICAgICAgICAgICB9LDEpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3VibWl0dGVkX2ltbWVkaWF0ZWx5ID0gZmFsc2U7CiAgICAgICAgc3dpdGNoKHN0YXRlKSB7CiAgICAgICAgICAgIGNhc2UgJ2ZpcnN0X3N1Ym1pdCc6CiAgICAgICAgICAgICAgICAvLyBXZSBpbnRlcmNlcHQgdGhlIGZpcnN0ICdzdWJtaXQnIGNsaWNrLCBhbmQgc2ltdWxhdGUgbm9ybWFsIFdhbmlrYW5pIHNjcmVlbiBiZWhhdmlvci4KICAgICAgICAgICAgICAgIHN0YXRlID0gJ3NlY29uZF9zdWJtaXQnOwoKICAgICAgICAgICAgICAgIC8vIENhcHR1cmUgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIGFuc3dlci4KICAgICAgICAgICAgICAgIGl0ZW0gPSAkLmpTdG9yYWdlLmdldCgnY3VycmVudEl0ZW0nKTsKICAgICAgICAgICAgICAgIGl0eXBlID0gKGl0ZW0ucmFkID8gJ3InIDogKGl0ZW0ua2FuID8gJ2snIDogJ3YnKSk7CiAgICAgICAgICAgICAgICBpdGVtX2lkID0gaXR5cGUgKyBpdGVtLmlkOwogICAgICAgICAgICAgICAgaXRlbV9zdGF0dXMgPSAkLmpTdG9yYWdlLmdldChpdGVtX2lkKSB8fCB7fTsKICAgICAgICAgICAgICAgIHF0eXBlID0gJC5qU3RvcmFnZS5nZXQoJ3F1ZXN0aW9uVHlwZScpOwogICAgICAgICAgICAgICAgd3JvbmdfY250ID0gJC5qU3RvcmFnZS5nZXQoJ3dyb25nQ291bnQnKSB8fCAwOwogICAgICAgICAgICAgICAgcXVlc3Rpb25fY250ID0gJC5qU3RvcmFnZS5nZXQoJ3F1ZXN0aW9uQ291bnQnKSB8fCAwOwogICAgICAgICAgICAgICAgY29tcGxldGVkX2NudCA9ICQualN0b3JhZ2UuZ2V0KCdjb21wbGV0ZWRDb3VudCcpIHx8IDA7CiAgICAgICAgICAgICAgICBhY3RpdmVfcXVldWUgPSAkLmpTdG9yYWdlLmdldCgnYWN0aXZlUXVldWUnKSB8fCBbXTsKICAgICAgICAgICAgICAgIHNob3dfc3JzID0gJC5qU3RvcmFnZS5nZXQoJ3Ivc3JzSW5kaWNhdG9yJyk7CgogICAgICAgICAgICAgICAgLy8gQXNrIFdhbmlrYW5pIGlmIHRoZSBhbnN3ZXIgaXMgcmlnaHQgKGJ1dCB3ZSBkb24ndCBhY3R1YWxseSBzdWJtaXQgdGhlIGFuc3dlcikuCiAgICAgICAgICAgICAgICBhbnN3ZXIgPSBvbGRfYW5zd2VyX2NoZWNrZXIocXR5cGUsICQoIiN1c2VyLXJlc3BvbnNlIikudmFsKCkpOwoKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2NyZWVuIHRvIHJlZmxlY3QgdGhlIHJlc3VsdHMgb2Ygb3VyIGNoZWNrZWQgYW5zd2VyLgogICAgICAgICAgICAgICAgJCgiaHRtbCwgYm9keSIpLmFuaW1hdGUoe3Njcm9sbFRvcDogMH0sIDIwMCk7CgogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgW21lYW5pbmcgaGFzIGthbmFdIG9yIFtyZWFkaW5nIGhhcyBsYXRpbl0KICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gJCgnI3VzZXItcmVzcG9uc2UnKS52YWwoKTsKICAgICAgICAgICAgICAgIGlmICgocXR5cGUgPT09ICdyZWFkaW5nJyAmJiB3aW5kb3cuYW5zd2VyQ2hlY2tlci5pc05vbkthbmFQcmVzZW50KHRleHQpKSB8fAogICAgICAgICAgICAgICAgICAgIChxdHlwZSA9PT0gJ21lYW5pbmcnICYmIHdpbmRvdy5hbnN3ZXJDaGVja2VyLmlzS2FuYVByZXNlbnQodGV4dCkpIHx8CiAgICAgICAgICAgICAgICAgICAgKHRleHQgPT09ICcnKSkgewogICAgICAgICAgICAgICAgICAgIGFuc3dlci5leGNlcHRpb24gPSBhbnN3ZXIuZXhjZXB0aW9uIHx8IHRydWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gTm9uLWV4YWN0IGFuc3dlciAoaS5lLiAiQ2xvc2UgYnV0IG5vIGNpZ2FyIiBzY3JpcHQpCiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLnBhc3NlZCAmJiAhYW5zd2VyLmFjY3VyYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzZXR0aW5ncy50eXBvX2FjdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd3YXJuJzogYW5zd2VyLmV4Y2VwdGlvbiA9ICdZb3VyIGFuc3dlciB3YXMgY2xvc2UsIGJ1dCBub3QgZXhhY3QnOyBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnd3JvbmcnOiBhbnN3ZXIucGFzc2VkID0gZmFsc2U7IGFuc3dlci5jdXN0b21fbXNnID0gJ1lvdXIgYW5zd2VyIHdhcyBub3QgZXhhY3QsIGFzIHJlcXVpcmVkIGJ5IHlvdXIgc2V0dGluZ3MuJzsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciByZWFkaW5nL21lYW5pbmcgbWl4dXBzCiAgICAgICAgICAgICAgICBpZiAoIWFuc3dlci5wYXNzZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocXR5cGUgPT09ICdtZWFuaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWNjZXB0ZWRfcmVhZGluZ3MgPSBbXS5jb25jYXQoaXRlbS5rYW5hLCBpdGVtLm9uLCBpdGVtLmt1biwgaXRlbS5uYW5vcmkpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW5zd2VyX2FzX2thbmEgPSB0b19rYW5hKCQoJyN1c2VyLXJlc3BvbnNlJykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWRfcmVhZGluZ3MuaW5kZXhPZihhbnN3ZXJfYXNfa2FuYSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLndyb25nX2Fuc3dlcl90eXBlX2FjdGlvbiA9PT0gJ3dhcm4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmV4Y2VwdGlvbiA9ICdPb3BzLCB3ZSB3YW50IHRoZSBtZWFuaW5nLCBub3QgdGhlIHJlYWRpbmcuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zd2VyLmV4Y2VwdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWx0aG91Z2ggV2FuaWthbmkgbm93IGNoZWNrcyBmb3IgcmVhZGluZ3MgZW50ZXJlZCBhcyBtZWFuaW5ncywgaXQgb25seQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja3MgdGhlICdwcmVmZXJyZWQnIHJlYWRpbmcuICBIZXJlLCB3ZSBjaGVjayBhbGwgcmVhZGluZ3MuCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhY2NlcHRlZF9tZWFuaW5ncyA9IGl0ZW0uZW47CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZF9tZWFuaW5ncyA9IGFjY2VwdGVkX21lYW5pbmdzLmNvbmNhdChpdGVtLnN5biwgaXRlbS5hdXhpbGlhcnlfbWVhbmluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKG1lYW5pbmcpID0+IG1lYW5pbmcudHlwZSA9PT0gJ3doaXRlbGlzdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChtZWFuaW5nKSA9PiBtZWFuaW5nLm1lYW5pbmcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChlKSB7fQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWVhbmluZ3NfYXNfaGlyYWdhbmEgPSBhY2NlcHRlZF9tZWFuaW5ncy5tYXAobSA9PiB0b19rYW5hKG0udG9Mb3dlckNhc2UoKSkucmVwbGFjZSgvXHMvZywnJykpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYW5zd2VyX2FzX2hpcmFnYW5hID0gQXJyYXkuZnJvbSgkKCcjdXNlci1yZXNwb25zZScpLnZhbCgpLnRvTG93ZXJDYXNlKCkpLm1hcChjID0+IHdhbmFrYW5hLnRvSGlyYWdhbmEoYykpLmpvaW4oJycpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVhbmluZ3NfYXNfaGlyYWdhbmEuaW5kZXhPZihhbnN3ZXJfYXNfaGlyYWdhbmEpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy53cm9uZ19hbnN3ZXJfdHlwZV9hY3Rpb24gPT09ICd3YXJuJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5leGNlcHRpb24gPSAnT29wcywgd2Ugd2FudCB0aGUgcmVhZGluZywgbm90IHRoZSBtZWFuaW5nLic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5leGNlcHRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgV2FuaWthbmkgd2FybmluZ3MgdGhhdCBzaG91bGQgYmUgY2hhbmdlZCB0byAnd3JvbmcnLCBiYXNlZCBvbiBzZXR0aW5ncy4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYW5zd2VyLmV4Y2VwdGlvbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKChzZXR0aW5ncy5rYW5qaV9tZWFuaW5nX2Zvcl92b2NhYl9hY3Rpb24gPT09ICd3cm9uZycpICYmIGFuc3dlci5leGNlcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnd2FudCB0aGUgdm9jYWJ1bGFyeSBtZWFuaW5nLCBub3QgdGhlIGthbmppIG1lYW5pbmcnKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKChzZXR0aW5ncy5rYW5qaV9yZWFkaW5nX2Zvcl92b2NhYl9hY3Rpb24gPT09ICd3cm9uZycpICYmIGFuc3dlci5leGNlcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnd2FudCB0aGUgdm9jYWJ1bGFyeSByZWFkaW5nLCBub3QgdGhlIGthbmppIHJlYWRpbmcnKSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKChzZXR0aW5ncy53cm9uZ19udW1iZXJfbl9hY3Rpb24gPT09ICd3cm9uZycpICYmIGFuc3dlci5leGNlcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZm9yZ2V0IHRoYXQg44KTJykpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICgoc2V0dGluZ3Muc21hbGxfa2FuYV9hY3Rpb24gPT09ICd3cm9uZycpICYmIGFuc3dlci5leGNlcHRpb24udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnd2F0Y2ggb3V0IGZvciB0aGUgc21hbGwnKSkpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuZXhjZXB0aW9uID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5wYXNzZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQ29weSB0aGUgbW9kaWZpZWQgYW5zd2VyIHRvIG5ld19hbnN3ZXIsIHdoaWNoIGlzIHdoYXQgd2lsbCBiZSBzdWJtaXR0ZWQgdG8gV2FuaWthbmkuCiAgICAgICAgICAgICAgICBuZXdfYW5zd2VyID0gT2JqZWN0LmFzc2lnbih7fSwgYW5zd2VyKTsKCiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXhjZXB0aW9ucyB0aGF0IGFyZSBwcmV2ZW50aW5nIHRoZSBhbnN3ZXIgZnJvbSBiZWluZyBzdWJtaXR0ZWQuCiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLmV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICAgIHNldF9hbnN3ZXJfc3RhdGUoYW5zd2VyLCB0cnVlIC8qIHNob3dfbXNncyAqLyk7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAnZmlyc3Rfc3VibWl0JzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIGFuc3dlciBpcyByZWFkeSBmb3Igc3VibWlzc2lvbiAoaS5lLiBubyBleGNlcHRpb25zKS4KICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIHVzZXIncyBmaXJzdCBhdHRlbXB0IGF0IHRoaXMgcXVlc3Rpb24sIHJlbWVtYmVyIHRoZSByZXN1bHQgc28KICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBkZXRlcm1pbmUgd2hldGhlciB0aGV5IGFsdGVyZWQgdGhlaXIgYW5zd2VyIGxhdGVyLgogICAgICAgICAgICAgICAgaWYgKCEoKGl0ZW1faWQgPT09IGxhc3RfaXRlbV9pZCkgJiYgKHF0eXBlID09PSBsYXN0X3F0eXBlKSkpIHsKICAgICAgICAgICAgICAgICAgICBmaXJzdF9hbnN3ZXIgPSBPYmplY3QuYXNzaWduKHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2U6JCgiI3VzZXItcmVzcG9uc2UiKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdF9hbnN3ZXJzOmdldF9jb3JyZWN0X2Fuc3dlcnMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVjdF9hbnN3ZXJfaW5kZXg6IDAsCiAgICAgICAgICAgICAgICAgICAgfSwgYW5zd2VyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhc3RfaXRlbV9pZCA9IGl0ZW1faWQ7CiAgICAgICAgICAgICAgICBsYXN0X3F0eXBlID0gcXR5cGU7CgogICAgICAgICAgICAgICAgLy8gT3B0aW9uYWxseSAoYWNjb3JkaW5nIHRvIHNldHRpbmdzKSwgdGVtcG9yYXJpbHkgaWdub3JlIGFueSBhZGRpdGlvbmFsIGNsaWNrcyBvbiB0aGUKICAgICAgICAgICAgICAgIC8vICdzdWJtaXQnIGJ1dHRvbiB0byBwcmV2ZW50IHRoZSB1c2VyIGZyb20gY2xpY2tpbmcgcGFzdCBpbXBvcnRhbnQgaW5mbyBhYm91dCB0aGUgYW5zd2VyLgogICAgICAgICAgICAgICAgaWYgKCghYW5zd2VyLnBhc3NlZCAmJiBzZXR0aW5ncy5kZWxheV93cm9uZykgfHwKICAgICAgICAgICAgICAgICAgICAoYW5zd2VyLnBhc3NlZCAmJgogICAgICAgICAgICAgICAgICAgICAoKCFhbnN3ZXIuYWNjdXJhdGUgJiYgc2V0dGluZ3MuZGVsYXlfc2xpZ2h0bHlfb2ZmKSB8fAogICAgICAgICAgICAgICAgICAgICAgKGFuc3dlci5tdWx0aXBsZUFuc3dlcnMgJiYgc2V0dGluZ3MuZGVsYXlfbXVsdGlfbWVhbmluZykpCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHNldF9hbnN3ZXJfc3RhdGUoYW5zd2VyLCB0cnVlIC8qIHNob3dfbXNncyAqLyk7CiAgICAgICAgICAgICAgICAgICAgZG9fZGVsYXkoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgc2V0X2Fuc3dlcl9zdGF0ZShhbnN3ZXIsIHRydWUgLyogc2hvd19tc2dzICovKTsKICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIG5ld19zdWJtaXRfaGFuZGxlcihlKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CgogICAgICAgICAgICBjYXNlICdzZWNvbmRfc3VibWl0JzoKCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBjaGFuZ2VkIHRoZWlyIGFuc3dlciB0byAnY29ycmVjdCcsIG1hcmsgdGhlIGl0ZW0KICAgICAgICAgICAgICAgIC8vIGluIHN0b3JhZ2UsIHNvIHdlIGNhbiB3YXJuIHRoZSB1c2VyIGlmIGl0IGNvbWVzIHVwIGZvciBidXJuLgogICAgICAgICAgICAgICAgLy8gVGhlIG1hcmsgaXMga2VwdCBmb3IgMTAgZGF5cyBpbiBjYXNlIHRoZSB1c2VyIGRvZXNuJ3QgY29tcGxldGUKICAgICAgICAgICAgICAgIC8vIHRoZSBpdGVtIChyZWFkaW5nIGFuZCBtZWFuaW5nKSB3aXRoaW4gb25lIHNlc3Npb24uCiAgICAgICAgICAgICAgICBpZiAoIWZpcnN0X2Fuc3dlci5wYXNzZWQgJiYgbmV3X2Fuc3dlci5wYXNzZWQpIHsKICAgICAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgnY29uZmJ1cm4vJyArIGl0ZW0uaWQsIHRydWUsIHtUVEw6MTAwMCozNjAwKjI0KjEwfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQmVmb3JlIGFjY2VwdGluZyBhIGZpbmFsIHN1Ym1pdCwgbm90aWZ5IHRoZSB1c2VyIGlmIGl0ZW0gd2lsbCBidXJuIChkZXBlbmRpbmcgb24gc2V0dGluZ3MpLgogICAgICAgICAgICAgICAgbmV3X2Fuc3dlci5leGNlcHRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICghbmV3X2Fuc3dlci5jb25maXJtaW5nX2J1cm4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHdhcm4gdGhlIHVzZXIgdGhhdCB0aGlzIGlzIGEgJ2J1cm4nIHJldmlldy4KICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiAiaXRlbV9zdGF0dXMubmkiIHNlZW1zIHRvIGJlIHVzZWQgYnkgb3RoZXIgc2NyaXB0cy4KICAgICAgICAgICAgICAgICAgICB2YXIgd2lsbF9idXJuID0gKGl0ZW0uc3JzID09PSA4KSAmJiBuZXdfYW5zd2VyLnBhc3NlZCAmJgogICAgICAgICAgICAgICAgICAgICAgICAhKGl0ZW1fc3RhdHVzLm1pIHx8IGl0ZW1fc3RhdHVzLnJpIHx8IGl0ZW1fc3RhdHVzLm5pKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoKGl0eXBlID09PSAncicpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAoKChpdGVtX3N0YXR1cy5yYyB8fCAwKSArIChxdHlwZSA9PT0gJ3JlYWRpbmcnID8gMSA6IDApID4gMCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAoKGl0ZW1fc3RhdHVzLm1jIHx8IDApICsgKHF0eXBlID09PSAnbWVhbmluZycgPyAxIDogMCkgPiAwKSkpOwogICAgICAgICAgICAgICAgICAgIHZhciBjaGVhdGVkID0gJC5qU3RvcmFnZS5nZXQoJ2NvbmZidXJuLycgKyBpdGVtLmlkKSA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAod2lsbF9idXJuICYmIChzZXR0aW5ncy53YXJuX2J1cm4gIT09ICduZXZlcicpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb21wdCBiZWZvcmUgYnVybmluZywgYW5kIHN1cHByZXNzIHByb2NlZWRpbmcgZm9yIGEgbW9tZW50LgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlYXRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Fuc3dlci5leGNlcHRpb24gPSAnWW91IG1vZGlmaWVkIGFuIGFuc3dlciBvbiB0aGlzIGl0ZW0uIEl0IHdpbGwgYmUgYnVybmVkIGlmIHlvdSBjb250aW51ZS4nOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNldHRpbmdzLndhcm5fYnVybiA9PT0gJ2Fsd2F5cycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hbnN3ZXIuZXhjZXB0aW9uID0gJ1RoaXMgaXRlbSB3aWxsIGJlIGJ1cm5lZCBpZiB5b3UgY29udGludWUuJwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdfYW5zd2VyLmV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2Fuc3dlci5jb25maXJtaW5nX2J1cm4gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2Fuc3dlcl9zdGF0ZShuZXdfYW5zd2VyLCB0cnVlIC8qIHNob3dfbXNncyAqLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSB3aGF0J3MgY2F1c2luZyB0aGUgaW5wdXQgZmllbGQgdG8gYmUgcmUtZW5hYmxlZCwgYnV0IHdlIGhhdmUgdG8gZGlzYWJsZSBpdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiN1c2VyLXJlc3BvbnNlIikucHJvcCgnZGlzYWJsZWQnLHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MuYnVybl9kZWxheV9wZXJpb2QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fZGVsYXkoc2V0dGluZ3MuYnVybl9kZWxheV9wZXJpb2QpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgYnVybmluZyB0aGUgaXRlbSBub3csIHNvIHdlIGNhbiByZW1vdmUgdGhlIG1hcmtlci4KICAgICAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLmRlbGV0ZUtleSgnY29uZmJ1cm4vJyArIGl0ZW0uaWQpOwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXdfYW5zd2VyLmNvbmZpcm1pbmdfYnVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBXZSBpbnRlcmNlcHRlZCB0aGUgZmlyc3Qgc3VibWl0LCBhbGxvd2luZyB0aGUgdXNlciB0byBvcHRpb25hbGx5IG1vZGlmeSB0aGVpciBhbnN3ZXIuCiAgICAgICAgICAgICAgICAvLyBOb3csIGVpdGhlciB0aGUgdXNlciBoYXMgY2xpY2tlZCBzdWJtaXQgYWdhaW4sIG9yIGxpZ2h0bmluZyBpcyBlbmFibGVkIGFuZCB3ZSBhcmUgYXV0b21hdGljYWxseSBjbGlja2luZyBzdWJtaXQgYWdhaW4uCiAgICAgICAgICAgICAgICAvLyBTaW5jZSBXYW5pa2FuaSBkaWRuJ3Qgc2VlIHRoZSBmaXJzdCBzdWJtaXQgKGJlY2F1c2Ugd2UgaW50ZXJjZXB0ZWQgaXQpLCBub3cgd2UgbmVlZCB0byBzaW11bGF0ZSB0d28gc3VibWl0cyBmb3IgV2FuaWthbmk6CiAgICAgICAgICAgICAgICAvLyAgIDEuIE9uZSBmb3IgV2FuaWthbmkgdG8gY2hlY2sgdGhlIChwb3NzaWJseSBjb3JyZWN0ZWQpIHJlc3VsdCwgYW5kCiAgICAgICAgICAgICAgICAvLyAgIDIuIE9uZSBmb3IgV2FuaWthbmkgdG8gbW92ZSBvbiB0byB0aGUgbmV4dCBxdWVzdGlvbi4KCiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgc2NyZWVuIHRvIHByZS1zdWJtaXR0ZWQgc3RhdGUsIHNvIFdhbmlrYW5pIHdvbid0IGdldCBjb25mdXNlZCB3aGVuIGl0IHRyaWVzIHRvIHByb2Nlc3MgdGhlIGFuc3dlci4KICAgICAgICAgICAgICAgIC8vIFdhbmlrYW5pIGNvZGUgd2lsbCB0aGVuIHVwZGF0ZSB0aGUgc2NyZWVuIGFjY29yZGluZyB0byBvdXIgZm9yY2VkIGFuc3dlci1jaGVjayByZXN1bHQuCiAgICAgICAgICAgICAgICAkKCcjb3B0aW9uLWRvdWJsZS1jaGVjaycpLmFkZENsYXNzKCdkaXNhYmxlZCcpLmZpbmQoJ3NwYW4nKS5hdHRyKCd0aXRsZScsJ0RvdWJsZS1DaGVjaycpLmZpbmQoJ2knKS5hdHRyKCdjbGFzcycsJ2ZhIGZhLXRodW1icy11cCcpOwogICAgICAgICAgICAgICAgJCgnI29wdGlvbi1yZXR5cGUnKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICQoJyN1c2VyLXJlc3BvbnNlJykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgnd3JvbmdDb3VudCcsIHdyb25nX2NudCk7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgncXVlc3Rpb25Db3VudCcsIHF1ZXN0aW9uX2NudCk7CiAgICAgICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgnY29tcGxldGVkQ291bnQnLCBjb21wbGV0ZWRfY250KTsKICAgICAgICAgICAgICAgICQualN0b3JhZ2Uuc2V0KCdhY3RpdmVRdWV1ZScsIGFjdGl2ZV9xdWV1ZSk7CgogICAgICAgICAgICAgICAgLy8gUHJldmVudCBXSyBmcm9tIHBvc3RpbmcgYSBzZWNvbmQgU1JTIG5vdGljZS4KICAgICAgICAgICAgICAgIHNyc19sb2FkID0gU3JzLmxvYWQ7CiAgICAgICAgICAgICAgICBTcnMubG9hZCA9IGZ1bmN0aW9uKCl7fTsKCiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBzdWJtaXQgYWN0dWFsbHkgZm9yd2FyZGVkIHRvIFdhbmlrYW5pLgogICAgICAgICAgICAgICAgLy8gSXQgd2lsbCBjaGVjayBvdXIgKHBvc3NpYmx5IGNvcnJlY3RlZCkgYW5zd2VyLgogICAgICAgICAgICAgICAgdmFyIG9sZF9hdWRpb0F1dG9wbGF5ID0gd2luZG93LmF1ZGlvQXV0b3BsYXk7CiAgICAgICAgICAgICAgICB3aW5kb3cuYXVkaW9BdXRvcGxheSA9IGZhbHNlOwogICAgICAgICAgICAgICAgb2xkX3N1Ym1pdF9oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBoaWRkZW4gdGhpcmQgY2xpY2sgZnJvbSBhYm92ZSwgd2hpY2ggV2FuaWthbmkgdGhpbmtzIGlzIHRoZSBzZWNvbmQgY2xpY2suCiAgICAgICAgICAgICAgICAvLyBXYW5pa2FuaSB3aWxsIG1vdmUgdG8gdGhlIG5leHQgcXVlc3Rpb24uCiAgICAgICAgICAgICAgICBzdGF0ZSA9ICdmaXJzdF9zdWJtaXQnOwoKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZGlzYWJsZSB0aGUgaW5wdXQgZmllbGQsIHNvIFdhbmlrYW5pIHdpbGwgc2VlIHRoaXMgYXMgdGhlIHNlY29uZCBjbGljay4KICAgICAgICAgICAgICAgICQoJyN1c2VyLXJlc3BvbnNlJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKCiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBTUlMgbWVzc2FnZSBmdW5jdGlvbiwgd2hpY2ggd2UgZGlzYWJsZWQgaW4gc2Vjb25kX3N1Ym1pdCBhYm92ZS4KICAgICAgICAgICAgICAgIFNycy5sb2FkID0gc3JzX2xvYWQ7CgogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgc2Vjb25kIHN1Ym1pdCBhY3R1YWxseSBmb3J3YXJkZWQgdG8gV2FuaWthbmkuCiAgICAgICAgICAgICAgICAvLyBJdCB3aWxsIG1vdmUgb24gdG8gdGhlIG5leHQgcXVlc3Rpb24uCiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2xkX3N1Ym1pdF9oYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB3aW5kb3cuYXVkaW9BdXRvcGxheSA9IG9sZF9hdWRpb0F1dG9wbGF5OwogICAgICAgICAgICAgICAgd2luZG93LndrUmVmcmVzaEF1ZGlvKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gU2ltdWxhdGUgaW5wdXQgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBhbmQgY29udmVydCB3aXRoIFdhbmFLYW5hIHRvIGthbmEKICAgIC8vICAtLSBDb250cmlidXRlZCBieSB1c2VyIEBTaW55YXZlbgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvX2thbmEodGV4dCkgewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRleHQpLnJlZHVjZSgodG90YWwsIGMpID0+IHdhbmFrYW5hLnRvS2FuYSh0b3RhbCArIGMsIHtJTUVNb2RlOiB0cnVlfSksICIiKS5yZXBsYWNlKC9uJC8sIFN0cmluZy5mcm9tQ2hhckNvZGUoMTI0MzUpKTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUmVzaXplIHRoZSBidXR0b25zIGFjY29yZGluZyB0byBob3cgbWFueSBhcmUgdmlzaWJsZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiByZXNpemVfYnV0dG9ucygpIHsKICAgICAgICB2YXIgYnV0dG9ucyA9ICQoJyNhZGRpdGlvbmFsLWNvbnRlbnQgdWw+bGknKTsKICAgICAgICB2YXIgYnRuX2NvdW50ID0gYnV0dG9ucy5sZW5ndGggLSBidXR0b25zLmZpbHRlcignLmhpZGRlbixbaGlkZGVuXScpLmxlbmd0aDsKICAgICAgICAkKCcjYWRkaXRpb25hbC1jb250ZW50IHVsID4gbGknKS5jc3MoJ3dpZHRoJyxNYXRoLmZsb29yKDk5MDAvYnRuX2NvdW50KS8xMDAgKyAnJScpOwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBFeHRlcm5hbCBob29rIGZvciBAcG9sdidzIHNjcmlwdCwgIldhbmlLYW5pIERpc2FibGUgRGVmYXVsdCBBbnN3ZXJzIgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGdvYmouc2V0X3N0YXRlID0gZnVuY3Rpb24oX3N0YXRlKSB7CiAgICAgICAgc3RhdGUgPSBfc3RhdGU7CiAgICB9OwoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBzdGFydHVwKCkgLSBJbnN0YWxsIG91ciBpbnRlcmNlcHQgaGFuZGxlcnMsIGFuZCBhZGQgb3VyIERvdWJsZS1DaGVjayBidXR0b24gYW5kIGhvdGtleQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHN0YXJ0dXAoKSB7CiAgICAgICAgLy8gSW50ZXJjZXB0IHRoZSBzdWJtaXQgYnV0dG9uIGhhbmRsZXIuCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIGludGVyY2VwdGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBvbGRfc3VibWl0X2hhbmRsZXIgPSAkLl9kYXRhKCAkKCcjYW5zd2VyLWZvcm0gZm9ybScpWzBdLCAnZXZlbnRzJykuc3VibWl0WzBdLmhhbmRsZXI7CiAgICAgICAgICAgICAgICAkLl9kYXRhKCAkKCcjYW5zd2VyLWZvcm0gZm9ybScpWzBdLCAnZXZlbnRzJykuc3VibWl0WzBdLmhhbmRsZXIgPSBuZXdfc3VibWl0X2hhbmRsZXI7CiAgICAgICAgICAgICAgICBpbnRlcmNlcHRlZCA9IHRydWU7CiAgICAgICAgICAgIH0gY2F0Y2goZXJyKSB7fQogICAgICAgICAgICBpZiAoIWludGVyY2VwdGVkKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIG9sZF9zdWJtaXRfaGFuZGxlciA9ICQuX2RhdGEoICQoJyNhbnN3ZXItZm9ybSBidXR0b24nKVswXSwgJ2V2ZW50cycpLmNsaWNrWzBdLmhhbmRsZXI7CiAgICAgICAgICAgICAgICAgICAgJC5fZGF0YSggJCgnI2Fuc3dlci1mb3JtIGJ1dHRvbicpWzBdLCAnZXZlbnRzJykuY2xpY2tbMF0uaGFuZGxlciA9IG5ld19zdWJtaXRfaGFuZGxlcjsKICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9IGNhdGNoKGVycikge30KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW50ZXJjZXB0ZWQpIHsKICAgICAgICAgICAgICAgIG9sZF9hbnN3ZXJfY2hlY2tlciA9IHdpbmRvdy5lbmhhbmNlQW5zd2VyQ2hlY2tlcih7ZXZhbHVhdGU6d2luZG93LmFuc3dlckNoZWNrZXIuZXZhbHVhdGV9KS5ldmFsdWF0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2goZXJyKSB7fQogICAgICAgIGlmICh0eXBlb2Ygb2xkX3N1Ym1pdF9oYW5kbGVyICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvbGRfYW5zd2VyX2NoZWNrZXIgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgYWxlcnQoJ1dhbmlrYW5pIERvdWJsZS1DaGVjayBzY3JpcHQgaXMgbm90IHdvcmtpbmcuJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIENsZWFyIHdhcm5pbmcgcG9wdXBzIGlmIHF1ZXN0aW9uIGNoYW5nZXMgZHVlIHRvIHJlYXNvbnMgb3V0c2lkZSBvZiB0aGlzIHNjcmlwdAogICAgICAgICQualN0b3JhZ2UubGlzdGVuS2V5Q2hhbmdlKCJjdXJyZW50SXRlbSIsIGZ1bmN0aW9uKGtleSwgYWN0aW9uKXsKICAgICAgICAgICAgc2V0X2Fuc3dlcl9zdGF0ZSh7cmVzZXQ6dHJ1ZX0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbnN0YWxsIHRoZSBMaWdodG5pbmcgTW9kZSBidXR0b24uCiAgICAgICAgJCgnaGVhZCcpLmFwcGVuZCgnPHN0eWxlPiNsaWdodG5pbmctbW9kZS5kb3VibGVjaGVjay1hY3RpdmUge2NvbG9yOiNmZjA7IG9wYWNpdHk6MS4wO308L3N0eWxlPicpOwogICAgICAgICQoJyNzdW1tYXJ5LWJ1dHRvbicpLmFwcGVuZCgnPGEgaWQ9ImxpZ2h0bmluZy1tb2RlIiBocmVmPSIjIiBoaWRkZW4gPjxpIGNsYXNzPSJmYSBmYS1ib2x0IiB0aXRsZT0iTGlnaHRuaW5nIE1vZGUgLSBXaGVuIGVuYWJsZWQsIGF1dG8tXG5hZHZhbmNlIGFmdGVyIGFuc3dlcmluZyBjb3JyZWN0bHkuIj48L2k+PC9hPicpOwogICAgICAgICQoJyNsaWdodG5pbmctbW9kZScpLm9uKCdjbGljaycsIGxpZ2h0bmluZ19jbGlja2VkKTsKCiAgICAgICAgLy8gSW5zdGFsbCB0aGUgRG91YmxlLUNoZWNrIGZlYXR1cmVzLgogICAgICAgICQoJyNhZGRpdGlvbmFsLWNvbnRlbnQgdWwnKS5jc3MoJ3RleHQtYWxpZ24nLCdjZW50ZXInKS5hcHBlbmQoCiAgICAgICAgICAgICc8bGkgaWQ9Im9wdGlvbi1kb3VibGUtY2hlY2siIGNsYXNzPSJkaXNhYmxlZCI+PHNwYW4gdGl0bGU9IkRvdWJsZSBDaGVjayI+PGkgY2xhc3M9ImZhIGZhLXRodW1icy11cCI+PC9pPjwvc3Bhbj48L2xpPicrCiAgICAgICAgICAgICc8bGkgaWQ9Im9wdGlvbi1yZXR5cGUiIGNsYXNzPSJkaXNhYmxlZCI+PHNwYW4gdGl0bGU9IlJldHlwZSI+PGkgY2xhc3M9ImZhIGZhLXVuZG8iPjwvaT48L3NwYW4+PC9saT48L3VsPicKICAgICAgICApOwogICAgICAgICQoJyNvcHRpb24tZG91YmxlLWNoZWNrJykub24oJ2NsaWNrJywgdG9nZ2xlX3Jlc3VsdC5iaW5kKG51bGwsJ3RvZ2dsZScpKTsKICAgICAgICAkKCcjb3B0aW9uLXJldHlwZScpLm9uKCdjbGljaycsIHRvZ2dsZV9yZXN1bHQuYmluZChudWxsLCdyZXR5cGUnKSk7CiAgICAgICAgJCgnYm9keScpLm9uKCdrZXlwcmVzcycsIGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSA0MykgdG9nZ2xlX3Jlc3VsdCgnY29ycmVjdCcpOwogICAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IDQ1KSB0b2dnbGVfcmVzdWx0KCdpbmNvcnJlY3QnKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSk7CiAgICAgICAgJCgnYm9keScpLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICBpZiAoKGV2ZW50LndoaWNoID09PSAyNyB8fCBldmVudC53aGljaCA9PT0gOCkgJiYKICAgICAgICAgICAgICAgIChzdGF0ZSAhPT0gJ2ZpcnN0X3N1Ym1pdCcpICYmCiAgICAgICAgICAgICAgICAoZXZlbnQudGFyZ2V0Lm5vZGVOYW1lID09PSAnQk9EWScpICYmCiAgICAgICAgICAgICAgICAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN3a29mc19kb3VibGVjaGVjaycpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9nZ2xlX3Jlc3VsdCgncmV0eXBlJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICdsJykgewogICAgICAgICAgICAgICAgbGlnaHRuaW5nX2NsaWNrZWQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KTsKICAgICAgICAkKCdoZWFkJykuYXBwZW5kKAogICAgICAgICAgICAnPHN0eWxlPicrCiAgICAgICAgICAgICcjYWRkaXRpb25hbC1jb250ZW50PnVsPmxpLmhpZGRlbiB7ZGlzcGxheTpub25lO30nKwogICAgICAgICAgICAnI2Fuc3dlci1mb3JtIGZpZWxkc2V0LmNvbmZidXJuIGJ1dHRvbiwgI2Fuc3dlci1mb3JtIGZpZWxkc2V0LmNvbmZidXJuIGlucHV0W3R5cGU9dGV4dF0sICNhbnN3ZXItZm9ybSBmaWVsZHNldC5jb25mYnVybiBpbnB1dFt0eXBlPXRleHRdOmRpc2FibGVkIHsnKwogICAgICAgICAgICAnICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwICFpbXBvcnRhbnQ7JysKICAgICAgICAgICAgJyAgY29sb3I6ICNmZmY7JysKICAgICAgICAgICAgJyAgdGV4dC1zaGFkb3c6IDJweCAycHggMCByZ2JhKDAsMCwwLDAuMik7JysKICAgICAgICAgICAgJyAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjFzIGVhc2UtaW47JysKICAgICAgICAgICAgJyAgb3BhY2l0eTogMSAhaW1wb3J0YW50OycrCiAgICAgICAgICAgICd9JysKICAgICAgICAgICAgJzwvc3R5bGU+Jyk7CgogICAgICAgIC8vIE92ZXJyaWRlIHRoZSBhbnN3ZXIgY2hlY2tlci4KICAgICAgICB3aW5kb3cuYW5zd2VyQ2hlY2tlci5ldmFsdWF0ZSA9IHJldHVybl9uZXdfYW5zd2VyOwogICAgICAgIHdpbmRvdy5lbmhhbmNlQW5zd2VyQ2hlY2tlciA9IGZ1bmN0aW9uKGFuc3dlckNoZWNrZXIpIHtyZXR1cm4gYW5zd2VyQ2hlY2tlcjt9OwoKICAgICAgICAvLyBUbyBwcmV2ZW50IFdhbmlrYW5pIGZyb20gY3V0dGluZyB0aGUgYXVkaW8gb2ZmIGluIGxpZ2h0bmluZyBtb2RlLAogICAgICAgIC8vIFdlIGluc3RydWN0IGFueSBjdXJyZW50bHkgcGxheWluZyBhdWRpbyB0byB1bmxvYWQgd2hlbiBpdCdzIGRvbmUsCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gdW5sb2FkaW5nIGl0IGltbWVkaWF0ZWx5LgogICAgICAgIHdpbmRvdy5Ib3dsZXIudW5sb2FkID0gZnVuY3Rpb24oKXsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IHdpbmRvdy5Ib3dsZXIuX2hvd2xzLmxlbmd0aC0xOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgdmFyIGhvd2wgPSB3aW5kb3cuSG93bGVyLl9ob3dsc1tpXTsKICAgICAgICAgICAgICAgIGlmIChob3dsLnBsYXlpbmcoKSB8fCBob3dsLl9xdWV1ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgaG93bC5vbignZW5kJywgaG93bC51bmxvYWQuYmluZChob3dsKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGhvd2wudW5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQoKfSkod2luZG93LmRvdWJsZWNoZWNrKTsK", 607 575 "storage": { 608 576 "data": {}, 609 577 "ts": 1606921521559 610 578 }, 611 - "enabled": true, 612 - "position": 12, 613 - "file_url": "https://greasyfork.org/scripts/35063-wanikani-double-check/code/Wanikani%20Double-Check.user.js", 614 - "uuid": "462d24eb-4e66-4f82-b8dd-79a94b1c8872", 615 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIFdhbmlrYW5pIERvdWJsZS1DaGVjawovLyBAbmFtZXNwYWNlICAgd2tkb3VibGVjaGVjawovLyBAZGVzY3JpcHRpb24gQWxsb3dzIHJldHlwaW5nIHR5cG8nZCBhbnN3ZXJzLCBvciBtYXJraW5nIHdyb25nIHdoZW4gV0sncyB0eXBvIHRvbGVyYW5jZSBpcyB0b28gbGF4LgovLyBAaW5jbHVkZSAgICAgL15odHRwczovLyh3d3d8cHJldmlldykud2FuaWthbmkuY29tL3Jldmlldy9zZXNzaW9uLwovLyBAdmVyc2lvbiAgICAgMi4yLjE0Ci8vIEBhdXRob3IgICAgICBSb2JpbiBGaW5kbGV5Ci8vIEBjb3B5cmlnaHQgICAyMDE3KywgUm9iaW4gRmluZGxleQovLyBAbGljZW5zZSAgICAgTUlUOyBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1lbmQKLy8gQGdyYW50ICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgovLyBDUkVESVRTOiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIGFuIG9yaWdpbmFsIHNjcmlwdCBieSBXYW5pa2FuaSB1c2VyIEBFdGhhbi4KLy8gRXRoYW4ncyBzY3JpcHQgc3RvcHBlZCB3b3JraW5nIGR1ZSB0byBzb21lIFdhbmlrYW5pIGNoYW5nZXMuICBUaGUgY29kZSBiZWxvdyBpcwovLyAxMDAlIG15IG93biwgYnV0IGl0IGNsb3NlbHkgcmVwbGljYXRlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBFdGhhbidzIG9yaWdpbmFsIHNjcmlwdC4KCi8vIEhPVEtFWVM6Ci8vICAgIisiICAgICAgLSBNYXJrcyBhbnN3ZXIgYXMgJ2NvcnJlY3QnLgovLyAgICItIiAgICAgIC0gTWFya3MgYW5zd2VyIGFzICdpbmNvcnJlY3QnLgovLyAgICJFc2NhcGUiIG9yICJCYWNrc3BhY2UiIC0gUmVzZXRzIHF1ZXN0aW9uLCBhbGxvd2luZyB5b3UgdG8gcmV0eXBlLgoKLy8gU0VFIFNFVFRJTkdTIEJFTE9XLgoKd2luZG93LmRvdWJsZWNoZWNrID0ge307CgooZnVuY3Rpb24oZ29iaikgewoKICAgIC8qIGdsb2JhbCAkLCB3a29mLCBhZGRpdGlvbmFsQ29udGVudCwgYW5zd2VyQ2hlY2tlciwgbGFzdEl0ZW1zLCBTcnMsIHdhbmFrYW5hICovCgogICAgdmFyIHNldHRpbmdzOwoKICAgIHdrb2YuaW5jbHVkZSgnTWVudSxTZXR0aW5ncycpOwogICAgd2tvZi5yZWFkeSgnZG9jdW1lbnQsTWVudSxTZXR0aW5ncycpLnRoZW4oc2V0dXApOwoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBzZXR1cCgpIC0gU2V0IHVwIHRoZSBtZW51IGxpbmsgYW5kIGRlZmF1bHQgc2V0dGluZ3MuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gc2V0dXAoKSB7CiAgICAgICAgd2tvZi5NZW51Lmluc2VydF9zY3JpcHRfbGluayh7bmFtZTonZG91YmxlY2hlY2snLHN1Ym1lbnU6J1NldHRpbmdzJyx0aXRsZTonRG91YmxlLUNoZWNrJyxvbl9jbGljazpvcGVuX3NldHRpbmdzfSk7CgogICAgICAgIHZhciBkZWZhdWx0cyA9IHsKICAgICAgICAgICAgYWxsb3dfcmV0eXBpbmc6IHRydWUsCiAgICAgICAgICAgIGFsbG93X2NoYW5nZV9jb3JyZWN0OiBmYWxzZSwKICAgICAgICAgICAgYWxsb3dfY2hhbmdlX2luY29ycmVjdDogZmFsc2UsCiAgICAgICAgICAgIHR5cG9fYWN0aW9uOiAnaWdub3JlJywKICAgICAgICAgICAgd3JvbmdfYW5zd2VyX3R5cGVfYWN0aW9uOiAnd2FybicsCiAgICAgICAgICAgIGRlbGF5X3dyb25nOiB0cnVlLAogICAgICAgICAgICBkZWxheV9tdWx0aV9tZWFuaW5nOiBmYWxzZSwKICAgICAgICAgICAgZGVsYXlfc2xpZ2h0bHlfb2ZmOiBmYWxzZSwKICAgICAgICAgICAgZGVsYXlfcGVyaW9kOiAxLjUsCiAgICAgICAgICAgIHNob3dfbGlnaHRuaW5nX2J1dHRvbjogdHJ1ZSwKICAgICAgICAgICAgbGlnaHRuaW5nX2VuYWJsZWQ6IGZhbHNlLAogICAgICAgICAgICBzcnNfbXNnX3BlcmlvZDogMS4yLAogICAgICAgICAgICBhdXRvaW5mb19jb3JyZWN0OiBmYWxzZSwKICAgICAgICAgICAgYXV0b2luZm9faW5jb3JyZWN0OiBmYWxzZSwKICAgICAgICAgICAgYXV0b2luZm9fbXVsdGlfbWVhbmluZzogZmFsc2UsCiAgICAgICAgICAgIGF1dG9pbmZvX3NsaWdodGx5X29mZjogZmFsc2UKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHdrb2YuU2V0dGluZ3MubG9hZCgnZG91YmxlY2hlY2snLCBkZWZhdWx0cykKICAgICAgICAgICAgLnRoZW4oaW5pdF91aS5iaW5kKG51bGwsIHRydWUgLyogZmlyc3RfdGltZSAqLykpOwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBvcGVuX3NldHRpbmdzKCkgLSBPcGVuIHRoZSBTZXR0aW5ncyBkaWFsb2cuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gb3Blbl9zZXR0aW5ncygpIHsKICAgICAgICB2YXIgZGlhbG9nID0gbmV3IHdrb2YuU2V0dGluZ3MoewogICAgICAgICAgICBzY3JpcHRfaWQ6ICdkb3VibGVjaGVjaycsCiAgICAgICAgICAgIHRpdGxlOiAnRG91YmxlLUNoZWNrIFNldHRpbmdzJywKICAgICAgICAgICAgb25fc2F2ZTogaW5pdF91aSwKICAgICAgICAgICAgY29udGVudDogewogICAgICAgICAgICAgICAgdGFiQW5zd2Vyczoge3R5cGU6J3BhZ2UnLGxhYmVsOidBbnN3ZXJzJyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICBncnBDaGFuZ2VBbnN3ZXJzOiB7dHlwZTonZ3JvdXAnLGxhYmVsOidDaGFuZ2UgQW5zd2VyJyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmV0eXBpbmc6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J0FsbG93IHJldHlwaW5nIGFuc3dlcicsZGVmYXVsdDp0cnVlLGhvdmVyX3RpcDonV2hlbiBlbmFibGVkLCB5b3UgY2FuIHJldHlwZSB5b3VyIGFuc3dlciBieSBwcmVzc2luZyBFc2NhcGUgb3IgQmFja3NwYWNlLid9LAogICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19jaGFuZ2VfY29ycmVjdDoge3R5cGU6J2NoZWNrYm94JyxsYWJlbDonQWxsb3cgY2hhbmdpbmcgdG8gImNvcnJlY3QiJyxkZWZhdWx0OnRydWUsaG92ZXJfdGlwOidXaGVuIGVuYWJsZWQsIHlvdSBjYW4gY2hhbmdlIHlvdXIgYW5zd2VyXG50byAiY29ycmVjdCIgYnkgcHJlc3NpbmcgdGhlICIrIiBrZXkuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X2NoYW5nZV9pbmNvcnJlY3Q6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J0FsbG93IGNoYW5naW5nIHRvICJpbmNvcnJlY3QiJyxkZWZhdWx0OnRydWUsaG92ZXJfdGlwOidXaGVuIGVuYWJsZWQsIHlvdSBjYW4gY2hhbmdlIHlvdXIgYW5zd2VyXG50byAiaW5jb3JyZWN0IiBieSBwcmVzc2luZyB0aGUgIi0iIGtleS4nfSwKICAgICAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgICAgICBncnBDYXJlbGVzc01pc3Rha2VzOiB7dHlwZTonZ3JvdXAnLGxhYmVsOidDYXJlbGVzcyBNaXN0YWtlcycsY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cG9fYWN0aW9uOiB7dHlwZTonZHJvcGRvd24nLGxhYmVsOidBY3Rpb24gZm9yIHR5cG9zJyxkZWZhdWx0OidpZ25vcmUnLGNvbnRlbnQ6e2lnbm9yZTonSWdub3JlJyx3YXJuOidXYXJuL3NoYWtlJyx3cm9uZzonTWFyayB3cm9uZyd9LGhvdmVyX3RpcDonQ2hvb3NlIGFuIGFjdGlvbiB0byB0YWtlIHdoZW4gYW5zd2VyIGNvbnRhaW5zIHR5cG9zLid9LAogICAgICAgICAgICAgICAgICAgICAgICB3cm9uZ19hbnN3ZXJfdHlwZV9hY3Rpb246IHt0eXBlOidkcm9wZG93bicsbGFiZWw6J1dyb25nIGFuc3dlciB0eXBlJyxkZWZhdWx0Oid3YXJuJyxjb250ZW50Ont3YXJuOidXYXJuL3NoYWtlJyx3cm9uZzonTWFyayB3cm9uZyd9LGhvdmVyX3RpcDonQ2hvb3NlIGFuIGFjdGlvbiB0byB0YWtlIHdoZW4gcmVhZGluZyB3YXMgZW50ZXJlZCBpbnN0ZWFkIG9mIG1lYW5pbmcsIG9yIHZpY2UgdmVyc2EuJ30sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgIHRhYk1pc3Rha2VEZWxheToge3R5cGU6J3BhZ2UnLGxhYmVsOidNaXN0YWtlIERlbGF5Jyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICBncnBEZWxheToge3R5cGU6J2dyb3VwJyxsYWJlbDonRGVsYXkgTmV4dCBRdWVzdGlvbicsY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X3dyb25nOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidEZWxheSB3aGVuIHdyb25nJyxkZWZhdWx0OnRydWUscmVmcmVzaF9vbl9jaGFuZ2U6dHJ1ZSxob3Zlcl90aXA6J0lmIHlvdXIgYW5zd2VyIGlzIHdyb25nLCB5b3UgY2Fubm90IGFkdmFuY2VcbnRvIHRoZSBuZXh0IHF1ZXN0aW9uIGZvciBhdCBsZWFzdCBOIHNlY29uZHMuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5X211bHRpX21lYW5pbmc6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J0RlbGF5IHdoZW4gbXVsdGlwbGUgbWVhbmluZ3MnLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidJZiB0aGUgaXRlbSBoYXMgbXVsdGlwbGUgbWVhbmluZ3MsIHlvdSBjYW5ub3QgYWR2YW5jZVxudG8gdGhlIG5leHQgcXVlc3Rpb24gZm9yIGF0IGxlYXN0IE4gc2Vjb25kcy4nfSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlfc2xpZ2h0bHlfb2ZmOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidEZWxheSB3aGVuIGFuc3dlciBoYXMgdHlwb3MnLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidJZiB5b3VyIGFuc3dlciBjb250YWlucyB0eXBvcywgeW91IGNhbm5vdCBhZHZhbmNlXG50byB0aGUgbmV4dCBxdWVzdGlvbiBmb3IgYXQgbGVhc3QgTiBzZWNvbmRzLid9LAogICAgICAgICAgICAgICAgICAgICAgICBkZWxheV9wZXJpb2Q6IHt0eXBlOidudW1iZXInLGxhYmVsOidEZWxheSBwZXJpb2QgKGluIHNlY29uZHMpJyxkZWZhdWx0OjEuNSxob3Zlcl90aXA6J051bWJlciBvZiBzZWNvbmRzIHRvIGRlbGF5IGJlZm9yZSBhbGxvd2luZ1xueW91IHRvIGFkdmFuY2UgdG8gdGhlIG5leHQgcXVlc3Rpb24uJ30sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgIHRhYkxpZ2h0bmluZzoge3R5cGU6J3BhZ2UnLGxhYmVsOidMaWdodG5pbmcnLGNvbnRlbnQ6ewogICAgICAgICAgICAgICAgICAgIGdycExpZ2h0bmluZzoge3R5cGU6J2dyb3VwJyxsYWJlbDonTGlnaHRuaW5nIE1vZGUnLGNvbnRlbnQ6ewogICAgICAgICAgICAgICAgICAgICAgICBzaG93X2xpZ2h0bmluZ19idXR0b246IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J1Nob3cgIkxpZ2h0bmluZyBNb2RlIiBidXR0b24nLGRlZmF1bHQ6dHJ1ZSxob3Zlcl90aXA6J1Nob3cgdGhlICJMaWdodG5pbmcgTW9kZSIgdG9nZ2xlXG5idXR0b24gb24gdGhlIHJldmlldyBzY3JlZW4uJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIGxpZ2h0bmluZ19lbmFibGVkOiB7dHlwZTonY2hlY2tib3gnLGxhYmVsOidFbmFibGUgIkxpZ2h0bmluZyBNb2RlIicsZGVmYXVsdDp0cnVlLHJlZnJlc2hfb25fY2hhbmdlOnRydWUsaG92ZXJfdGlwOidFbmFibGUgIkxpZ2h0bmluZyBNb2RlIiwgd2hpY2ggYXV0b21hdGljYWxseSBhZHZhbmNlcyB0b1xudGhlIG5leHQgcXVlc3Rpb24gaWYgeW91IGFuc3dlciBjb3JyZWN0bHkuJ30sCiAgICAgICAgICAgICAgICAgICAgICAgIHNyc19tc2dfcGVyaW9kOiB7dHlwZTonbnVtYmVyJyxsYWJlbDonU1JTIHBvcHVwIHRpbWUgKGluIHNlY29uZHMpJyxkZWZhdWx0OjEuMixtaW46MCxob3Zlcl90aXA6J0hvdyBsb25nIHRvIHNob3cgU1JTIHVwL2Rvd24gcG9wdXAgd2hlbiBpbiBsaWdodG5pbmcgbW9kZS4gICgwID0gZG9uXCd0IHNob3cpJ30sCiAgICAgICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgICAgICB9fSwKICAgICAgICAgICAgICAgIHRhYkF1dG9JbmZvOiB7dHlwZToncGFnZScsbGFiZWw6J0l0ZW0gSW5mbycsY29udGVudDp7CiAgICAgICAgICAgICAgICAgICAgZ3JwQXV0b0luZm86IHt0eXBlOidncm91cCcsbGFiZWw6J1Nob3cgSXRlbSBJbmZvJyxjb250ZW50OnsKICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2luZm9fY29ycmVjdDoge3R5cGU6J2NoZWNrYm94JyxsYWJlbDonQWZ0ZXIgY29ycmVjdCBhbnN3ZXInLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidBdXRvbWF0aWNhbGx5IHNob3cgdGhlIEl0ZW0gSW5mbyBhZnRlciBjb3JyZWN0IGFuc3dlcnMuJywgdmFsaWRhdGU6dmFsaWRhdGVfYXV0b2luZm9fY29ycmVjdH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9pbmZvX2luY29ycmVjdDoge3R5cGU6J2NoZWNrYm94JyxsYWJlbDonQWZ0ZXIgaW5jb3JyZWN0IGFuc3dlcicsZGVmYXVsdDpmYWxzZSxob3Zlcl90aXA6J0F1dG9tYXRpY2FsbHkgc2hvdyB0aGUgSXRlbSBJbmZvIGFmdGVyIGluY29ycmVjdCBhbnN3ZXJzLicsIHZhbGlkYXRlOnZhbGlkYXRlX2F1dG9pbmZvX2luY29ycmVjdH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9pbmZvX211bHRpX21lYW5pbmc6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J1doZW4gbXVsdGlwbGUgbWVhbmluZ3MnLGRlZmF1bHQ6ZmFsc2UsaG92ZXJfdGlwOidBdXRvbWF0aWNhbGx5IHNob3cgdGhlIEl0ZW0gSW5mbyB3aGVuIGFuIGl0ZW0gaGFzIG11bHRpcGxlIG1lYW5pbmdzLicsIHZhbGlkYXRlOnZhbGlkYXRlX2F1dG9pbmZvX2NvcnJlY3R9LAogICAgICAgICAgICAgICAgICAgICAgICBhdXRvaW5mb19zbGlnaHRseV9vZmY6IHt0eXBlOidjaGVja2JveCcsbGFiZWw6J1doZW4gYW5zd2VyIGhhcyB0eXBvcycsZGVmYXVsdDpmYWxzZSxob3Zlcl90aXA6J0F1dG9tYXRpY2FsbHkgc2hvdyB0aGUgSXRlbSBJbmZvIHdoZW4geW91ciBhbnN3ZXIgaGFzIHR5cG9zLicsIHZhbGlkYXRlOnZhbGlkYXRlX2F1dG9pbmZvX2NvcnJlY3R9LAogICAgICAgICAgICAgICAgICAgIH19LAogICAgICAgICAgICAgICAgfX0sCiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBkaWFsb2cub3BlbigpOwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyB2YWxpZGF0ZV9hdXRvaW5mb19jb3JyZWN0KCkgLSBOb3RpZnkgdXNlciBpZiBpdGVtaW5mbyBhbmQgbGlnaHRuaW5nIGFyZSBib3RoIGVuYWJsZWQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdmFsaWRhdGVfYXV0b2luZm9fY29ycmVjdChlbmFibGVkKSB7CiAgICAgICAgaWYgKGVuYWJsZWQgJiYgc2V0dGluZ3MubGlnaHRuaW5nX2VuYWJsZWQpIHsKICAgICAgICAgICAgcmV0dXJuICdEaXNhYmxlICJMaWdodG5pbmcgTW9kZSIhJzsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIHZhbGlkYXRlX2F1dG9pbmZvX2luY29ycmVjdCgpIC0gTm90aWZ5IHVzZXIgaWYgaXRlbWluZm8gYW5kIGxpZ2h0bmluZyBhcmUgYm90aCBlbmFibGVkLCBhbmQgd3JvbmdfZGVsYXkgZGlzYWJsZWQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gdmFsaWRhdGVfYXV0b2luZm9faW5jb3JyZWN0KGVuYWJsZWQpIHsKICAgICAgICBpZiAoZW5hYmxlZCAmJiBzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCAmJiAhc2V0dGluZ3MuZGVsYXlfd3JvbmcpIHsKICAgICAgICAgICAgcmV0dXJuICdEaXNhYmxlICJMaWdodG5pbmcgTW9kZSIsIG9yPGJyPmVuYWJsZSAiRGVsYXkgd2hlbiB3cm9uZyIhJzsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIGluaXRfdWkoKSAtIEluaXRpYWxpemUgdGhlIHVzZXIgaW50ZXJmYWNlLgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBmaXJzdF90aW1lID0gdHJ1ZTsKICAgIGZ1bmN0aW9uIGluaXRfdWkoKSB7CiAgICAgICAgc2V0dGluZ3MgPSB3a29mLnNldHRpbmdzLmRvdWJsZWNoZWNrOwoKICAgICAgICBpZiAoZmlyc3RfdGltZSkgewogICAgICAgICAgICBmaXJzdF90aW1lID0gZmFsc2U7CiAgICAgICAgICAgIHN0YXJ0dXAoKTsKICAgICAgICB9CgogICAgICAgIC8vIE1pZ3JhdGUgJ2xpZ2h0bmluZycgc2V0dGluZyBmcm9tIGxvY2FsU3RvcmFnZS4KICAgICAgICB2YXIgbGlnaHRuaW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2xpZ2h0bmluZycpOwogICAgICAgIGlmIChsaWdodG5pbmcgPT09ICdmYWxzZScgfHwgbGlnaHRuaW5nID09PSAndHJ1ZScpIHsKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ2xpZ2h0bmluZycpOwogICAgICAgICAgICBzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCA9IGxpZ2h0bmluZzsKICAgICAgICAgICAgd2tvZi5TZXR0aW5ncy5zYXZlKCdkb3VibGVjaGVjaycpOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgTGlnaHRuaW5nIE1vZGUgYnV0dG9uLgogICAgICAgIGlmIChzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCkgewogICAgICAgICAgICAkKCcjbGlnaHRuaW5nLW1vZGUnKS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJCgnI2xpZ2h0bmluZy1tb2RlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwogICAgICAgIH0KICAgICAgICAkKCcjbGlnaHRuaW5nLW1vZGUnKS5wcm9wKCdoaWRkZW4nLCAhc2V0dGluZ3Muc2hvd19saWdodG5pbmdfYnV0dG9uKTsKCiAgICAgICAgc2V0Q2xhc3MoJyNvcHRpb24tZG91YmxlLWNoZWNrJywgJ2hpZGRlbicsICEoc2V0dGluZ3MuYWxsb3dfY2hhbmdlX2NvcnJlY3QgfHwgc2V0dGluZ3MuYWxsb3dfY2hhbmdlX2luY29ycmVjdCkpOwogICAgICAgIHNldENsYXNzKCcjb3B0aW9uLXJldHlwZScsICdoaWRkZW4nLCAhc2V0dGluZ3MuYWxsb3dfcmV0eXBpbmcpOwogICAgICAgIHJlc2l6ZV9idXR0b25zKCk7CgogICAgICAgIGlmIChzdGF0ZSA9PT0gJ3NlY29uZF9zdWJtaXQnKSB7CiAgICAgICAgICAgIHNldENsYXNzKCcjb3B0aW9uLWRvdWJsZS1jaGVjaycsICdkaXNhYmxlZCcsICEoCiAgICAgICAgICAgICAgICAobmV3X2Fuc3dlci5wYXNzZWQgJiYgc2V0dGluZ3MuYWxsb3dfY2hhbmdlX2luY29ycmVjdCkgfHwgKCFuZXdfYW5zd2VyLnBhc3NlZCAmJiBzZXR0aW5ncy5hbGxvd19jaGFuZ2VfY29ycmVjdCkKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIHNldENsYXNzKCcjb3B0aW9uLXJldHlwZScsICdkaXNhYmxlZCcsICFzZXR0aW5ncy5hbGxvd19yZXR5cGluZyk7CiAgICAgICAgfQogICAgfQoKICAgIHZhciBvbGRfc3VibWl0X2hhbmRsZXIsIG9sZF9hbnN3ZXJfY2hlY2tlciwgaWdub3JlX3N1Ym1pdCA9IGZhbHNlLCBzdGF0ZSA9ICdmaXJzdF9zdWJtaXQnLCBwbGF5X2F1ZGlvLCBzaG93X3Nycywgc3JzX2xvYWQ7CiAgICB2YXIgaXRlbSwgaXR5cGUsIGl0ZW1faWQsIGl0ZW1fc3RhdHVzLCBxdHlwZSwgdmFsaWRfYW5zd2Vycywgd3JvbmdfY250LCBxdWVzdGlvbl9jbnQsIGNvbXBsZXRlZF9jbnQsIGFuc3dlciwgbmV3X2Fuc3dlcjsKCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gbGlnaHRuaW5nX2NsaWNrZWQoKSAtIExpZ2h0bmluZyBidXR0b24gaGFuZGxlci4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBsaWdodG5pbmdfY2xpY2tlZCgpIHsKICAgICAgICBzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCA9ICFzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZDsKICAgICAgICB3a29mLlNldHRpbmdzLnNhdmUoJ2RvdWJsZWNoZWNrJyk7CiAgICAgICAgJCgnI2xpZ2h0bmluZy1tb2RlJykudG9nZ2xlQ2xhc3MoJ2FjdGl2ZScsIHNldHRpbmdzLmxpZ2h0bmluZ19lbmFibGVkKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIHRvZ2dsZV9yZXN1bHQoKSAtIFRvZ2dsZSBhbiBhbnN3ZXIgZnJvbSByaWdodC0+d3Jvbmcgb3Igd3JvbmctPnJpZ2h0LgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvZ2dsZV9yZXN1bHQobmV3X3N0YXRlKSB7CiAgICAgICAgaWYgKG5ld19zdGF0ZSA9PT0gJ3RvZ2dsZScpIG5ld19zdGF0ZSA9IChuZXdfYW5zd2VyLnBhc3NlZCA/ICdpbmNvcnJlY3QnIDogJ2NvcnJlY3QnKTsKICAgICAgICBpZiAoc3RhdGUgIT09ICdzZWNvbmRfc3VibWl0JykgcmV0dXJuIGZhbHNlOwogICAgICAgIHN3aXRjaCAobmV3X3N0YXRlKSB7CiAgICAgICAgICAgIGNhc2UgJ2NvcnJlY3QnOgogICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5hbGxvd19jaGFuZ2VfY29ycmVjdCB8fCBuZXdfYW5zd2VyLnBhc3NlZCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgbmV3X2Fuc3dlciA9IHtwYXNzZWQ6dHJ1ZSwgYWNjdXJhdGU6dHJ1ZSwgbXVsdGlwbGVBbnN3ZXJzOmZhbHNlLCBleGNlcHRpb246ZmFsc2V9OwogICAgICAgICAgICAgICAgc2V0X2Fuc3dlcl9zdGF0ZShuZXdfYW5zd2VyLCBmYWxzZSAvKiBzaG93X21zZ3MgKi8pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2luY29ycmVjdCc6CiAgICAgICAgICAgICAgICBpZiAoIXNldHRpbmdzLmFsbG93X2NoYW5nZV9pbmNvcnJlY3QgfHwgIW5ld19hbnN3ZXIucGFzc2VkKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICBuZXdfYW5zd2VyID0ge3Bhc3NlZDpmYWxzZSwgYWNjdXJhdGU6ZmFsc2UsIG11bHRpcGxlQW5zd2VyczpmYWxzZSwgZXhjZXB0aW9uOmZhbHNlfTsKICAgICAgICAgICAgICAgIHNldF9hbnN3ZXJfc3RhdGUobmV3X2Fuc3dlciwgZmFsc2UgLyogc2hvd19tc2dzICovKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdyZXR5cGUnOgogICAgICAgICAgICAgICAgaWYgKCFzZXR0aW5ncy5hbGxvd19yZXR5cGluZykgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgc2V0X2Fuc3dlcl9zdGF0ZSh7cmVzZXQ6dHJ1ZX0sIGZhbHNlIC8qIHNob3dfbXNncyAqLyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIGRvX2RlbGF5KCkgLSBEaXNhYmxlIHRoZSBzdWJtaXQgYnV0dG9uIGJyaWVmbHkgdG8gcHJldmVudCBjbGlja2luZyBwYXN0IHdyb25nIGFuc3dlcnMuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gZG9fZGVsYXkoKSB7CiAgICAgICAgaWdub3JlX3N1Ym1pdCA9IHRydWU7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWdub3JlX3N1Ym1pdCA9IGZhbHNlOwogICAgICAgIH0sIHNldHRpbmdzLmRlbGF5X3BlcmlvZCoxMDAwKTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gcmV0dXJuX25ld19hbnN3ZXIoKSAtIEFsdGVybmF0ZSBhbnN3ZXIgY2hlY2tlciB0aGF0IG92ZXJyaWRlcyBvdXIgcmVzdWx0cy4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiByZXR1cm5fbmV3X2Fuc3dlcigpIHsKICAgICAgICByZXR1cm4gbmV3X2Fuc3dlcjsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gc2V0X2Fuc3dlcl9zdGF0ZSgpIC0gVXBkYXRlIHRoZSBzY3JlZW4gdG8gc2hvdyByZXN1bHRzIG9mIGFuc3dlci1jaGVjay4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBzZXRfYW5zd2VyX3N0YXRlKGFuc3dlciwgc2hvd19tc2dzLCBub19yZWRyYXcpIHsKICAgICAgICAvLyBJZiB1c2VyIHJlcXVlc3RlZCB0byByZXR5cGUgYW5zd2VyLCByZXNldCB0aGUgcXVlc3Rpb24uCiAgICAgICAgaWYgKGFuc3dlci5yZXNldCkgewogICAgICAgICAgICAkLmpTdG9yYWdlLnNldCgnd3JvbmdDb3VudCcsIHdyb25nX2NudCk7CiAgICAgICAgICAgICQualN0b3JhZ2Uuc2V0KCdxdWVzdGlvbkNvdW50JywgcXVlc3Rpb25fY250KTsKICAgICAgICAgICAgJC5qU3RvcmFnZS5zZXQoJ2NvbXBsZXRlZENvdW50JywgY29tcGxldGVkX2NudCk7CiAgICAgICAgICAgICQualN0b3JhZ2Uuc2V0KCdjdXJyZW50SXRlbScsIGl0ZW0pOwogICAgICAgICAgICAkKCIjYW5zd2VyLWV4Y2VwdGlvbiIpLnJlbW92ZSgpOwogICAgICAgICAgICAkKCcjb3B0aW9uLWRvdWJsZS1jaGVjaycpLmFkZENsYXNzKCdkaXNhYmxlZCcpLmZpbmQoJ3NwYW4nKS5hdHRyKCd0aXRsZScsJ01hcmsgUmlnaHQnKS5maW5kKCdpJykuYXR0cignY2xhc3MnLCdpY29uLXRodW1icy11cCcpOwogICAgICAgICAgICAkKCcjb3B0aW9uLXJldHlwZScpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgICBTcnMucmVtb3ZlKCk7CiAgICAgICAgICAgIHN0YXRlID0gJ2ZpcnN0X3N1Ym1pdCc7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIElmIGFuc3dlciBpcyBpbnZhbGlkIGZvciBzb21lIHJlYXNvbiwgZG8gdGhlIHNoYWtlIHRoaW5nLgogICAgICAgIGlmIChhbnN3ZXIuZXhjZXB0aW9uKSB7CiAgICAgICAgICAgICQoIiNhbnN3ZXItZXhjZXB0aW9uIikucmVtb3ZlKCk7CiAgICAgICAgICAgIGlmICghJCgiI2Fuc3dlci1mb3JtIGZvcm0iKS5pcygiOmFuaW1hdGVkIikpIHsKICAgICAgICAgICAgICAgICQoIiNyZXZpZXdzIikuY3NzKCJvdmVyZmxvdy14IiwgImhpZGRlbiIpOwogICAgICAgICAgICAgICAgdmFyIHhsYXQgPSB7b255b21pOiJvbid5b21pIiwga3VueW9taToia3VuJ3lvbWkiLCBuYW5vcmk6Im5hbm9yaSJ9OwogICAgICAgICAgICAgICAgdmFyIGVtcGggPSB4bGF0W2l0ZW0uZW1waF07CiAgICAgICAgICAgICAgICAkKCIjYW5zd2VyLWZvcm0gZm9ybSIpLmVmZmVjdCgic2hha2UiLCB7fSwgMzAwLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjcmV2aWV3cyIpLmNzcygib3ZlcmZsb3cteCIsICJ2aXNpYmxlIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbnN3ZXIuYWNjdXJhdGUgJiYgJCgnI3VzZXItcmVzcG9uc2UnKS52YWwoKSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNldHRpbmdzLndyb25nX2Fuc3dlcl90eXBlX2FjdGlvbiA9PT0gJ3dhcm4nICYmIGFuc3dlci53cm9uZ19hbnN3ZXJfdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiI2Fuc3dlci1mb3JtIGZvcm0iKS5hcHBlbmQoJCgnPGRpdiBpZD0iYW5zd2VyLWV4Y2VwdGlvbiIgY2xhc3M9ImFuc3dlci1leGNlcHRpb24tZm9ybSI+PHNwYW4+V2FuaUthbmkgaXMgbG9va2luZyBmb3IgdGhlICcrKHF0eXBlID09PSAncmVhZGluZycgPyAnUmVhZGluZycgOiAnTWVhbmluZycpKycuPC9zcGFuPjwvZGl2PicpLmFkZENsYXNzKCJhbmltYXRlZCBmYWRlSW5VcCIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYW5zd2VyLmJhZF9pbnB1dCAmJiBxdHlwZSA9PT0gJ3JlYWRpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjYW5zd2VyLWZvcm0gZm9ybSIpLmFwcGVuZCgkKCc8ZGl2IGlkPSJhbnN3ZXItZXhjZXB0aW9uIiBjbGFzcz0iYW5zd2VyLWV4Y2VwdGlvbi1mb3JtIj48c3Bhbj5XYW5pS2FuaSBpcyBsb29raW5nIGZvciB0aGUgJytlbXBoKyIgcmVhZGluZzwvc3Bhbj48L2Rpdj4iKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZUluVXAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5zd2VyLnBhc3NlZCAmJiBzZXR0aW5ncy50eXBvX2FjdGlvbiA9PT0gJ3dhcm4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCIjYW5zd2VyLWZvcm0gZm9ybSIpLmFwcGVuZCgkKCc8ZGl2IGlkPSJhbnN3ZXItZXhjZXB0aW9uIiBjbGFzcz0iYW5zd2VyLWV4Y2VwdGlvbi1mb3JtIj48c3Bhbj5Zb3VyIGFuc3dlciB3YXMgYSBiaXQgb2ZmLiBDaGVjayB0aGUgbWVhbmluZyB0byBtYWtlIHN1cmUgeW91IGFyZSBjb3JyZWN0Ljwvc3Bhbj48L2Rpdj4nKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZUluVXAiKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS5maW5kKCJpbnB1dCIpLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gRHJhdyAnY29ycmVjdCcgb3IgJ2luY29ycmVjdCcgcmVzdWx0cywgZW5hYmxlIERvdWJsZS1DaGVjayBidXR0b24sIGFuZCBjYWxjdWxhdGUgdXBkYXRlZCBzdGF0aXN0aWNzLgogICAgICAgIHZhciBuZXdfd3JvbmdfY250ID0gd3JvbmdfY250LCBuZXdfY29tcGxldGVkX2NudCA9IGNvbXBsZXRlZF9jbnQ7CiAgICAgICAgJCgiI3VzZXItcmVzcG9uc2UiKS5ibHVyKCk7CiAgICAgICAgaWYgKHNldHRpbmdzLmFsbG93X3JldHlwaW5nKSAkKCcjb3B0aW9uLXJldHlwZScpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgIHZhciBuZXdfc3RhdHVzID0gT2JqZWN0LmFzc2lnbih7fSxpdGVtX3N0YXR1cyk7CiAgICAgICAgdmFyIGRibGNoayA9ICQoJyNvcHRpb24tZG91YmxlLWNoZWNrJyk7CiAgICAgICAgdmFyIHJldHlwZSA9ICQoJyNvcHRpb24tcmV0eXBlJyk7CiAgICAgICAgc2V0Q2xhc3MocmV0eXBlLCAnZGlzYWJsZWQnLCAhc2V0dGluZ3MuYWxsb3dfcmV0eXBpbmcpOwogICAgICAgIGlmIChhbnN3ZXIucGFzc2VkKSB7CiAgICAgICAgICAgIGlmIChub19yZWRyYXcgIT09IHRydWUpIHsKICAgICAgICAgICAgICAgICQoIiNhbnN3ZXItZm9ybSBmaWVsZHNldCIpLnJlbW92ZUNsYXNzKCdpbmNvcnJlY3QnKS5hZGRDbGFzcygiY29ycmVjdCIpOwogICAgICAgICAgICAgICAgZGJsY2hrLmZpbmQoJ3NwYW4nKS5hdHRyKCd0aXRsZScsJ01hcmsgV3JvbmcnKS5maW5kKCdpJykuYXR0cignY2xhc3MnLCdpY29uLXRodW1icy1kb3duJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0Q2xhc3MoZGJsY2hrLCAnZGlzYWJsZWQnLCAhc2V0dGluZ3MuYWxsb3dfY2hhbmdlX2luY29ycmVjdCk7CiAgICAgICAgICAgIGlmIChxdHlwZSA9PT0gJ21lYW5pbmcnKSB7CiAgICAgICAgICAgICAgICBuZXdfc3RhdHVzLm1jID0gKG5ld19zdGF0dXMubWMgfHwgMCkgKyAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV3X3N0YXR1cy5yYyA9IChuZXdfc3RhdHVzLnJjIHx8IDApICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoIiNhbnN3ZXItZm9ybSBmaWVsZHNldCIpLnJlbW92ZUNsYXNzKCdjb3JyZWN0JykuYWRkQ2xhc3MoImluY29ycmVjdCIpOwogICAgICAgICAgICBkYmxjaGsuZmluZCgnc3BhbicpLmF0dHIoJ3RpdGxlJywnTWFyayBSaWdodCcpLmZpbmQoJ2knKS5hdHRyKCdjbGFzcycsJ2ljb24tdGh1bWJzLXVwJyk7CiAgICAgICAgICAgIHNldENsYXNzKGRibGNoaywgJ2Rpc2FibGVkJywgIXNldHRpbmdzLmFsbG93X2NoYW5nZV9jb3JyZWN0KTsKICAgICAgICAgICAgbmV3X3dyb25nX2NudCsrOwogICAgICAgIH0KICAgICAgICBpZiAoKGl0eXBlID09PSAncicgfHwgKChuZXdfc3RhdHVzLnJjIHx8IDApID49IDEpKSAmJiAoKG5ld19zdGF0dXMubWMgfHwgMCkgPj0gMSkpIHsKICAgICAgICAgICAgbmV3X2NvbXBsZXRlZF9jbnQrKzsKICAgICAgICAgICAgaWYgKHNob3dfc3JzKSB7CiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3MubGlnaHRuaW5nX2VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3JzX21zZ19wZXJpb2QgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGF0dXMgPSBPYmplY3QuYXNzaWduKHt9LG5ld19zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3JzID0gaXRlbS5zcnM7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoU3JzLmxvYWQuYmluZChTcnMsIHN0YXR1cywgc3JzKSwgMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChTcnMucmVtb3ZlLCBzZXR0aW5ncy5zcnNfbXNnX3BlcmlvZCAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgU3JzLmxvYWQobmV3X3N0YXR1cyxpdGVtLnNycyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJC5qU3RvcmFnZS5zZXQoJ3dyb25nQ291bnQnLCBuZXdfd3JvbmdfY250KTsKICAgICAgICAkLmpTdG9yYWdlLnNldCgncXVlc3Rpb25Db3VudCcsIHF1ZXN0aW9uX2NudCArIDEpOwogICAgICAgICQualN0b3JhZ2Uuc2V0KCdjb21wbGV0ZWRDb3VudCcsIG5ld19jb21wbGV0ZWRfY250KTsKICAgICAgICBpZiAobm9fcmVkcmF3ICE9PSB0cnVlKSB7CiAgICAgICAgICAgICQoIiN1c2VyLXJlc3BvbnNlIikucHJvcCgiZGlzYWJsZWQiLCAhMCk7CiAgICAgICAgfQoKICAgICAgICAvLyBXZSd2ZSByZW1vdmVkIHRoZSBhdWRpbyBwbGF5IGZyb20gZW5hYmxlQnV0dG9ucygpIHNvIHdlIGNhbiBjb250cm9sIHBsYXliYWNrLgogICAgICAgIC8vIEhlcmUsIHdlIGFyZSBpbnN0YWxsaW5nIHRoZSBhdWRpbywgYnV0IHRlbGxpbmcgaXQgbm90IHRvIHBsYXkgeWV0LgogICAgICAgIGFkZGl0aW9uYWxDb250ZW50LmVuYWJsZUJ1dHRvbnMoKTsKICAgICAgICAkKCdhdWRpbycpLnJlbW92ZSgpOyAvLyBUaGFua3MgdG8gU2lueWF2ZW4gZm9yIHRoZSBob3RmaXghIQogICAgICAgIHBsYXlfYXVkaW8oZmFsc2UpOwoKICAgICAgICB2YXIgcHJlcGVuZGVkQXVkaW8gPSAkKCdhdWRpbycpOwogICAgICAgICQoJyNvcHRpb24tYXVkaW8nKS5vZmYoJ2NsaWNrJyk7CiAgICAgICAgJCgnI29wdGlvbi1hdWRpbycpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKCQoJyN1c2VyLXJlc3BvbnNlJykuaXMoJzpkaXNhYmxlZCcpKSB7CiAgICAgICAgICAgICAgICBwcmVwZW5kZWRBdWRpby50cmlnZ2VyKCdwbGF5Jyk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gTm93IHRoYXQgdGhlIGF1ZGlvIGlzIGluc3RhbGxlZCwgbW92ZSBpdCBzbyBXSyBkb2Vzbid0IGRlbGV0ZSBpdCB1cG9uIHN1Ym1pdHRpbmcgYW4gYW5zd2VyLgogICAgICAgICQoJ2JvZHknKS5wcmVwZW5kKHByZXBlbmRlZEF1ZGlvKTsKCiAgICAgICAgLy8gQW5kIGZpbmFsbHksIHBsYXkgdGhlIGF1ZGlvIChpZiBhdXRvcGxheSBpcyBlbmFibGVkKS4KICAgICAgICBpZiAod2luZG93LmF1ZGlvQXV0b3BsYXkgJiYgYW5zd2VyLnBhc3NlZCkgcHJlcGVuZGVkQXVkaW8udHJpZ2dlcigncGxheScpOwoKICAgICAgICBsYXN0SXRlbXMuZGlzYWJsZVNlc3Npb25TdGF0cygpOwogICAgICAgICQoIiNhbnN3ZXItZXhjZXB0aW9uIikucmVtb3ZlKCk7CgogICAgICAgIC8vIE9wZW4gaXRlbSBpbmZvLCBkZXBlbmRpbmcgb24gc2V0dGluZ3MuCiAgICAgICAgdmFyIHNob3dpbmdfaW5mbyA9IGZhbHNlOwogICAgICAgIGlmIChhbnN3ZXIucGFzc2VkICYmICFzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCAmJgogICAgICAgICAgICAoc2V0dGluZ3MuYXV0b2luZm9fY29ycmVjdCB8fAogICAgICAgICAgICAgKHNldHRpbmdzLmF1dG9pbmZvX3NsaWdodGx5X29mZiAmJiAhYW5zd2VyLmFjY3VyYXRlKSB8fAogICAgICAgICAgICAgKHNldHRpbmdzLmF1dG9pbmZvX211bHRpX21lYW5pbmcgJiYgYW5zd2VyLm11bHRpcGxlQW5zd2VycykKICAgICAgICAgICAgKSkgewogICAgICAgICAgICBzaG93aW5nX2luZm8gPSB0cnVlOwogICAgICAgICAgICAkKCcjb3B0aW9uLWl0ZW0taW5mbycpLmNsaWNrKCk7CiAgICAgICAgfSBlbHNlIGlmICghYW5zd2VyLnBhc3NlZCAmJiAhKHNldHRpbmdzLmxpZ2h0bmluZ19lbmFibGVkICYmICFzZXR0aW5ncy5kZWxheV93cm9uZykgJiYgc2V0dGluZ3MuYXV0b2luZm9faW5jb3JyZWN0KSB7CiAgICAgICAgICAgIHNob3dpbmdfaW5mbyA9IHRydWU7CiAgICAgICAgICAgICQoJyNvcHRpb24taXRlbS1pbmZvJykuY2xpY2soKTsKICAgICAgICB9CgogICAgICAgIC8vIFdoZW4gdXNlciBpcyBzdWJtaXR0aW5nIGFuIGFuc3dlciwgZGlzcGxheSB0aGUgb24tc2NyZWVuIG1lc3NhZ2UgdGhhdCBXYW5pa2FuaSBub3JtYWxseSBzaG93cy4KICAgICAgICBpZiAoc2hvd19tc2dzKSB7CiAgICAgICAgICAgIHZhciBtc2c7CiAgICAgICAgICAgIGlmIChhbnN3ZXIucGFzc2VkKSB7CiAgICAgICAgICAgICAgICBpZiAoIWFuc3dlci5hY2N1cmF0ZSkgewogICAgICAgICAgICAgICAgICAgIG1zZyA9ICdZb3VyIGFuc3dlciB3YXMgYSBiaXQgb2ZmLiBDaGVjayB0aGUgJytxdHlwZSsnIHRvIG1ha2Ugc3VyZSB5b3UgYXJlIGNvcnJlY3QnOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbnN3ZXIubXVsdGlwbGVBbnN3ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgbXNnID0gJ0RpZCB5b3Uga25vdyB0aGlzIGl0ZW0gaGFzIG11bHRpcGxlIHBvc3NpYmxlICcrcXR5cGUrJ3M/JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG1zZyA9ICdOZWVkIGhlbHA/IFZpZXcgdGhlIGNvcnJlY3QgJytxdHlwZSsnIGFuZCBtbmVtb25pYyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1zZykgewogICAgICAgICAgICAgICAgaWYgKHNob3dpbmdfaW5mbykgewogICAgICAgICAgICAgICAgICAgICQoIiNpbmZvcm1hdGlvbiIpLnByZXBlbmQoJCgnPGRpdiBpZD0iYW5zd2VyLWV4Y2VwdGlvbiIgc3R5bGU9InRvcDowOyI+PHNwYW4+Jyttc2crJzwvc3Bhbj48L2Rpdj4nKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZUluVXAiKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoIiNhZGRpdGlvbmFsLWNvbnRlbnQiKS5hcHBlbmQoJCgnPGRpdiBpZD0iYW5zd2VyLWV4Y2VwdGlvbiI+PHNwYW4+Jyttc2crJzwvc3Bhbj48L2Rpdj4nKS5hZGRDbGFzcygiYW5pbWF0ZWQgZmFkZUluVXAiKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIHNldENsYXNzKCkgLSBBZGQgb3IgcmVtb3ZlIGEgY2xhc3MgYmFzZWQgb24gdGhlICdlbmFibGVkJyBzdGF0ZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiBzZXRDbGFzcyhlbGVtLCBjbGFzc25hbWUsIGVuYWJsZWQpIHsKICAgICAgICBpZiAodHlwZW9mIGVsZW0gPT09ICdzdHJpbmcnKSBlbGVtID0gJChlbGVtKTsKICAgICAgICBpZiAoZW5hYmxlZCkgewogICAgICAgICAgICBlbGVtLmFkZENsYXNzKGNsYXNzbmFtZSkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzKGNsYXNzbmFtZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBuZXdfc3VibWl0X2hhbmRsZXIoKSAtIEludGVyY2VwdCBoYW5kbGVyIGZvciAnc3VibWl0JyBidXR0b24uICBPdmVycmlkZXMgZGVmYXVsdCBiZWhhdmlvciBhcyBuZWVkZWQuCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZnVuY3Rpb24gbmV3X3N1Ym1pdF9oYW5kbGVyKGUpIHsKICAgICAgICB2YXIgZmFzdF9mb3J3YXJkID0gZmFsc2U7CgogICAgICAgIC8vIERvbid0IHByb2Nlc3MgJ3N1Ym1pdCcgaWYgd2UgYXJlIGlnbm9yaW5nIHRlbXBvcmFyaWx5ICh0byBwcmV2ZW50IGRvdWJsZS10YXBwaW5nIHBhc3QgaW1wb3J0YW50IGluZm8pCiAgICAgICAgaWYgKGlnbm9yZV9zdWJtaXQpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgcHJlc3NlcyA8ZW50ZXI+IGR1cmluZyBkZWxheSBwZXJpb2QsCiAgICAgICAgICAgIC8vIFdLIGVuYWJsZXMgdGhlIHVzZXIgaW5wdXQgZmllbGQsIHdoaWNoIG1ha2VzIEl0ZW0gSW5mbyBub3Qgd29yay4KICAgICAgICAgICAgLy8gTGV0J3MgbWFrZSBzdXJlIHRoZSBpbnB1dCBmaWVsZCBpcyBkaXNhYmxlZC4KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgJCgiI3VzZXItcmVzcG9uc2UiKS5wcm9wKCdkaXNhYmxlZCcsITApOwogICAgICAgICAgICB9LDEpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgbWFjaGluZSBiZWxvdywKICAgICAgICAvLyBzZWUgdGhlICJUaGVvcnkgb2Ygb3BlcmF0aW9uIiBpbmZvIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmlwdC4KICAgICAgICBzd2l0Y2goc3RhdGUpIHsKICAgICAgICAgICAgY2FzZSAnZmlyc3Rfc3VibWl0JzoKICAgICAgICAgICAgICAgIC8vIFdlIGludGVyY2VwdCB0aGUgZmlyc3QgJ3N1Ym1pdCcgY2xpY2ssIGFuZCBzaW11bGF0ZSBub3JtYWwgV2FuaWthbmkgc2NyZWVuIGJlaGF2aW9yLgogICAgICAgICAgICAgICAgc3RhdGUgPSAnc2Vjb25kX3N1Ym1pdCc7CgogICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSBiZWZvcmUgc3VibWl0dGluZyB0aGUgYW5zd2VyLgogICAgICAgICAgICAgICAgaXRlbSA9ICQualN0b3JhZ2UuZ2V0KCdjdXJyZW50SXRlbScpOwogICAgICAgICAgICAgICAgaXR5cGUgPSAoaXRlbS5yYWQgPyAncicgOiAoaXRlbS5rYW4gPyAnaycgOiAndicpKTsKICAgICAgICAgICAgICAgIGl0ZW1faWQgPSBpdHlwZSArIGl0ZW0uaWQ7CiAgICAgICAgICAgICAgICBpdGVtX3N0YXR1cyA9ICQualN0b3JhZ2UuZ2V0KGl0ZW1faWQpIHx8IHt9OwogICAgICAgICAgICAgICAgcXR5cGUgPSAkLmpTdG9yYWdlLmdldCgncXVlc3Rpb25UeXBlJyk7CiAgICAgICAgICAgICAgICB3cm9uZ19jbnQgPSAkLmpTdG9yYWdlLmdldCgnd3JvbmdDb3VudCcpOwogICAgICAgICAgICAgICAgcXVlc3Rpb25fY250ID0gJC5qU3RvcmFnZS5nZXQoJ3F1ZXN0aW9uQ291bnQnKTsKICAgICAgICAgICAgICAgIGNvbXBsZXRlZF9jbnQgPSAkLmpTdG9yYWdlLmdldCgnY29tcGxldGVkQ291bnQnKTsKICAgICAgICAgICAgICAgIHNob3dfc3JzID0gJC5qU3RvcmFnZS5nZXQoJ3Ivc3JzSW5kaWNhdG9yJyk7CgogICAgICAgICAgICAgICAgLy8gQXNrIFdhbmlrYW5pIGlmIHRoZSBhbnN3ZXIgaXMgcmlnaHQgKGJ1dCB3ZSBkb24ndCBhY3R1YWxseSBzdWJtaXQgdGhlIGFuc3dlcikuCiAgICAgICAgICAgICAgICBhbnN3ZXIgPSBvbGRfYW5zd2VyX2NoZWNrZXIocXR5cGUsICQoIiN1c2VyLXJlc3BvbnNlIikudmFsKCkpOwoKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2NyZWVuIHRvIHJlZmxlY3QgdGhlIHJlc3VsdHMgb2Ygb3VyIGNoZWNrZWQgYW5zd2VyLgogICAgICAgICAgICAgICAgJCgiaHRtbCwgYm9keSIpLmFuaW1hdGUoe3Njcm9sbFRvcDogMH0sIDIwMCk7CiAgICAgICAgICAgICAgICBuZXdfYW5zd2VyID0gT2JqZWN0LmFzc2lnbih7fSxhbnN3ZXIpOwoKICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gJCgnI3VzZXItcmVzcG9uc2UnKS52YWwoKTsKICAgICAgICAgICAgICAgIGlmICgocXR5cGUgPT09ICdyZWFkaW5nJyAmJiBhbnN3ZXJDaGVja2VyLmlzTm9uS2FuYVByZXNlbnQodGV4dCkpIHx8CiAgICAgICAgICAgICAgICAgICAgKHF0eXBlID09PSAnbWVhbmluZycgJiYgYW5zd2VyQ2hlY2tlci5pc0thbmFQcmVzZW50KHRleHQpKSB8fAogICAgICAgICAgICAgICAgICAgICh0ZXh0ID09PSAnJykpIHsKICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuZXhjZXB0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBhbnN3ZXIuYmFkX2lucHV0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBDbG9zZSBidXQgbm8gY2lnYXIKICAgICAgICAgICAgICAgIGlmIChhbnN3ZXIucGFzc2VkICYmICFhbnN3ZXIuYWNjdXJhdGUpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHNldHRpbmdzLnR5cG9fYWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3dhcm4nOiBhbnN3ZXIuZXhjZXB0aW9uID0gdHJ1ZTsgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3dyb25nJzogYW5zd2VyLnBhc3NlZCA9IGZhbHNlOyBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHJlYWRpbmcvbWVhbmluZyBtaXh1cHMKICAgICAgICAgICAgICAgIGFuc3dlci53cm9uZ19hbnN3ZXJfdHlwZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKCFhbnN3ZXIucGFzc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHF0eXBlID09PSAnbWVhbmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFjY2VwdGVkX3JlYWRpbmdzID0gW10uY29uY2F0KGl0ZW0ua2FuYSwgaXRlbS5vbiwgaXRlbS5rdW4sIGl0ZW0ubmFub3JpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFuc3dlcl9hc19rYW5hID0gdG9fa2FuYSgkKCcjdXNlci1yZXNwb25zZScpLnZhbCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkX3JlYWRpbmdzLmluZGV4T2YoYW5zd2VyX2FzX2thbmEpID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci53cm9uZ19hbnN3ZXJfdHlwZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWNjZXB0ZWRfbWVhbmluZ3MgPSBpdGVtLmVuLmNvbmNhdChpdGVtLnN5biwgYW5zd2VyQ2hlY2tlci5maWx0ZXJBdXhpbGlhcnlNZWFuaW5ncyhpdGVtLmF1eGlsaWFyeV9tZWFuaW5ncywgJ3doaXRlbGlzdCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1lYW5pbmdzX2FzX2hpcmFnYW5hID0gYWNjZXB0ZWRfbWVhbmluZ3MubWFwKG0gPT4gdG9fa2FuYShtLnRvTG93ZXJDYXNlKCkpLnJlcGxhY2UoL1xzL2csJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFuc3dlcl9hc19oaXJhZ2FuYSA9IEFycmF5LmZyb20oJCgnI3VzZXItcmVzcG9uc2UnKS52YWwoKS50b0xvd2VyQ2FzZSgpKS5tYXAoYyA9PiB3YW5ha2FuYS50b0hpcmFnYW5hKGMpKS5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lYW5pbmdzX2FzX2hpcmFnYW5hLmluZGV4T2YoYW5zd2VyX2FzX2hpcmFnYW5hKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXIud3JvbmdfYW5zd2VyX3R5cGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKChzZXR0aW5ncy53cm9uZ19hbnN3ZXJfdHlwZV9hY3Rpb24gPT09ICd3YXJuJykgJiYgYW5zd2VyLndyb25nX2Fuc3dlcl90eXBlKSBhbnN3ZXIuZXhjZXB0aW9uID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICBpZiAoYW5zd2VyLmV4Y2VwdGlvbikgewogICAgICAgICAgICAgICAgICAgIHNldF9hbnN3ZXJfc3RhdGUoYW5zd2VyLCB0cnVlIC8qIHNob3dfbXNncyAqLyk7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAnZmlyc3Rfc3VibWl0JzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gT3B0aW9uYWxseSAoYWNjb3JkaW5nIHRvIHNldHRpbmdzKSwgdGVtcG9yYXJpbHkgaWdub3JlIGFueSBhZGRpdGlvbmFsIGNsaWNrcyBvbiB0aGUKICAgICAgICAgICAgICAgIC8vICdzdWJtaXQnIGJ1dHRvbiB0byBwcmV2ZW50IHRoZSB1c2VyIGZyb20gY2xpY2tpbmcgcGFzdCBpbXBvcnRhbnQgaW5mbyBhYm91dCB0aGUgYW5zd2VyLgogICAgICAgICAgICAgICAgaWYgKCghYW5zd2VyLnBhc3NlZCAmJiBzZXR0aW5ncy5kZWxheV93cm9uZykgfHwKICAgICAgICAgICAgICAgICAgICAoYW5zd2VyLnBhc3NlZCAmJgogICAgICAgICAgICAgICAgICAgICAoKCFhbnN3ZXIuYWNjdXJhdGUgJiYgc2V0dGluZ3MuZGVsYXlfc2xpZ2h0bHlfb2ZmKSB8fCAoYW5zd2VyLm11bHRpcGxlQW5zd2VycyAmJiBzZXR0aW5ncy5kZWxheV9tdWx0aV9tZWFuaW5nKSkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgc2V0X2Fuc3dlcl9zdGF0ZShhbnN3ZXIsIHRydWUgLyogc2hvd19tc2dzICovKTsKICAgICAgICAgICAgICAgICAgICBkb19kZWxheSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0X2Fuc3dlcl9zdGF0ZShhbnN3ZXIsIHRydWUgLyogc2hvd19tc2dzICovLCBzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCAvKiBub19yZWRyYXcgKi8pOwogICAgICAgICAgICAgICAgICAgIGlmIChzZXR0aW5ncy5saWdodG5pbmdfZW5hYmxlZCkgZmFzdF9mb3J3YXJkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIWZhc3RfZm9yd2FyZCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgLyogbm8gYnJlYWsgKi8KICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZmFsbHRocm91Z2gKCiAgICAgICAgICAgIGNhc2UgJ3NlY29uZF9zdWJtaXQnOgogICAgICAgICAgICAgICAgLy8gV2UgaW50ZXJjZXB0ZWQgdGhlIGZpcnN0IHN1Ym1pdCwgYWxsb3dpbmcgdGhlIHVzZXIgdG8gb3B0aW9uYWxseSBtb2RpZnkgdGhlaXIgYW5zd2VyLgogICAgICAgICAgICAgICAgLy8gTm93LCBlaXRoZXIgdGhlIHVzZXIgaGFzIGNsaWNrZWQgc3VibWl0IGFnYWluLCBvciBsaWdodG5pbmcgaXMgZW5hYmxlZCBhbmQgd2UgYXJlIGF1dG9tYXRpY2FsbHkgY2xpY2tpbmcgc3VibWl0IGFnYWluLgogICAgICAgICAgICAgICAgLy8gU2luY2UgV2FuaWthbmkgZGlkbid0IHNlZSB0aGUgZmlyc3Qgc3VibWl0IChiZWNhdXNlIHdlIGludGVyY2VwdGVkIGl0KSwgbm93IHdlIG5lZWQgdG8gc2ltdWxhdGUgdHdvIHN1Ym1pdHMgZm9yIFdhbmlrYW5pOgogICAgICAgICAgICAgICAgLy8gICAxLiBPbmUgZm9yIFdhbmlrYW5pIHRvIGNoZWNrIHRoZSAocG9zc2libHkgY29ycmVjdGVkKSByZXN1bHQsIGFuZAogICAgICAgICAgICAgICAgLy8gICAyLiBPbmUgZm9yIFdhbmlrYW5pIHRvIG1vdmUgb24gdG8gdGhlIG5leHQgcXVlc3Rpb24uCgogICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHNjcmVlbiB0byBwcmUtc3VibWl0dGVkIHN0YXRlLCBzbyBXYW5pa2FuaSB3b24ndCBnZXQgY29uZnVzZWQgd2hlbiBpdCB0cmllcyB0byBwcm9jZXNzIHRoZSBhbnN3ZXIuCiAgICAgICAgICAgICAgICAvLyBXYW5pa2FuaSBjb2RlIHdpbGwgdGhlbiB1cGRhdGUgdGhlIHNjcmVlbiBhY2NvcmRpbmcgdG8gb3VyIGZvcmNlZCBhbnN3ZXItY2hlY2sgcmVzdWx0LgogICAgICAgICAgICAgICAgJCgnI29wdGlvbi1kb3VibGUtY2hlY2snKS5hZGRDbGFzcygnZGlzYWJsZWQnKS5maW5kKCdzcGFuJykuYXR0cigndGl0bGUnLCdEb3VibGUtQ2hlY2snKS5maW5kKCdpJykuYXR0cignY2xhc3MnLCdpY29uLXRodW1icy11cCcpOwogICAgICAgICAgICAgICAgJCgnI29wdGlvbi1yZXR5cGUnKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICQoJyN1c2VyLXJlc3BvbnNlJykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICQoJyNvcHRpb24tYXVkaW8gYXVkaW8nKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICQualN0b3JhZ2Uuc2V0KCd3cm9uZ0NvdW50Jywgd3JvbmdfY250KTsKICAgICAgICAgICAgICAgICQualN0b3JhZ2Uuc2V0KCdxdWVzdGlvbkNvdW50JywgcXVlc3Rpb25fY250KTsKICAgICAgICAgICAgICAgICQualN0b3JhZ2Uuc2V0KCdjb21wbGV0ZWRDb3VudCcsIGNvbXBsZXRlZF9jbnQpOwoKICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgV0sgZnJvbSBwb3N0aW5nIGEgc2Vjb25kIFNSUyBub3RpY2UuCiAgICAgICAgICAgICAgICBzcnNfbG9hZCA9IFNycy5sb2FkOwogICAgICAgICAgICAgICAgU3JzLmxvYWQgPSBmdW5jdGlvbigpe307CgogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qgc3VibWl0IGFjdHVhbGx5IGZvcndhcmRlZCB0byBXYW5pa2FuaS4KICAgICAgICAgICAgICAgIC8vIEl0IHdpbGwgY2hlY2sgb3VyIChwb3NzaWJseSBjb3JyZWN0ZWQpIGFuc3dlci4KICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBvbGRfc3VibWl0X2hhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGhpZGRlbiB0aGlyZCBjbGljayBmcm9tIGFib3ZlLCB3aGljaCBXYW5pa2FuaSB0aGlua3MgaXMgdGhlIHNlY29uZCBjbGljay4KICAgICAgICAgICAgICAgIC8vIFdhbmlrYW5pIHdpbGwgbW92ZSB0byB0aGUgbmV4dCBxdWVzdGlvbi4KICAgICAgICAgICAgICAgIHN0YXRlID0gJ2ZpcnN0X3N1Ym1pdCc7CgogICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBkaXNhYmxlIHRoZSBpbnB1dCBmaWVsZCwgc28gV2FuaWthbmkgd2lsbCBzZWUgdGhpcyBhcyB0aGUgc2Vjb25kIGNsaWNrLgogICAgICAgICAgICAgICAgJCgnI3VzZXItcmVzcG9uc2UnKS5hdHRyKCdkaXNhYmxlZCcsJ2Rpc2FibGVkJyk7CgogICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgU1JTIG1lc3NhZ2UgZnVuY3Rpb24sIHdoaWNoIHdlIGRpc2FibGVkIGluIHNlY29uZF9zdWJtaXQgYWJvdmUuCiAgICAgICAgICAgICAgICBTcnMubG9hZCA9IHNyc19sb2FkOwoKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHNlY29uZCBzdWJtaXQgYWN0dWFsbHkgZm9yd2FyZGVkIHRvIFdhbmlrYW5pLgogICAgICAgICAgICAgICAgLy8gSXQgd2lsbCBtb3ZlIG9uIHRvIHRoZSBuZXh0IHF1ZXN0aW9uLgogICAgICAgICAgICAgICAgcmV0dXJuIG9sZF9zdWJtaXRfaGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gU2ltdWxhdGUgaW5wdXQgY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBhbmQgY29udmVydCB3aXRoIFdhbmFLYW5hIHRvIGthbmEKICAgIC8vICAtLSBDb250cmlidXRlZCBieSB1c2VyIEBTaW55YXZlbgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHRvX2thbmEodGV4dCkgewogICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRleHQpLnJlZHVjZSgodG90YWwsIGMpID0+IHdhbmFrYW5hLnRvS2FuYSh0b3RhbCArIGMsIHtJTUVNb2RlOiB0cnVlfSksICIiKS5yZXBsYWNlKC9uJC8sIFN0cmluZy5mcm9tQ2hhckNvZGUoMTI0MzUpKTsKICAgIH0KCiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gUmVzaXplIHRoZSBidXR0b25zIGFjY29yZGluZyB0byBob3cgbWFueSBhcmUgdmlzaWJsZS4KICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBmdW5jdGlvbiByZXNpemVfYnV0dG9ucygpIHsKICAgICAgICB2YXIgYnV0dG9ucyA9ICQoJyNhZGRpdGlvbmFsLWNvbnRlbnQgdWw+bGknKTsKICAgICAgICB2YXIgYnRuX2NvdW50ID0gYnV0dG9ucy5sZW5ndGggLSBidXR0b25zLmZpbHRlcignLmhpZGRlbixbaGlkZGVuXScpLmxlbmd0aDsKICAgICAgICAkKCcjYWRkaXRpb25hbC1jb250ZW50IHVsID4gbGknKS5jc3MoJ3dpZHRoJyxNYXRoLmZsb29yKDk5MDAvYnRuX2NvdW50KS8xMDAgKyAnJScpOwogICAgfQoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBFeHRlcm5hbCBob29rIGZvciBAcG9sdidzIHNjcmlwdCwgIldhbmlLYW5pIERpc2FibGUgRGVmYXVsdCBBbnN3ZXJzIgogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGdvYmouc2V0X3N0YXRlID0gZnVuY3Rpb24oX3N0YXRlKSB7CiAgICAgICAgc3RhdGUgPSBfc3RhdGU7CiAgICB9OwoKICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBzdGFydHVwKCkgLSBJbnN0YWxsIG91ciBpbnRlcmNlcHQgaGFuZGxlcnMsIGFuZCBhZGQgb3VyIERvdWJsZS1DaGVjayBidXR0b24gYW5kIGhvdGtleQogICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGZ1bmN0aW9uIHN0YXJ0dXAoKSB7CiAgICAgICAgLy8gRGlzY29ubmVjdCB0aGUgYXVkaW8gcGxheWVyIHNvIHdlIGNhbiBjb250cm9sIGl0IG1hbnVhbGx5LgogICAgICAgIGlmIChhZGRpdGlvbmFsQ29udGVudC5hdWRpbykgewogICAgICAgICAgICBwbGF5X2F1ZGlvID0gYWRkaXRpb25hbENvbnRlbnQuYXVkaW87CiAgICAgICAgICAgIGFkZGl0aW9uYWxDb250ZW50LmF1ZGlvID0gZnVuY3Rpb24oKXt9OwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgY2FuIGludGVyY2VwdCB0aGUgc3VibWl0IGJ1dHRvbiBoYW5kbGVyLgogICAgICAgIHRyeSB7CiAgICAgICAgICAgIG9sZF9zdWJtaXRfaGFuZGxlciA9ICQuX2RhdGEoICQoJyNhbnN3ZXItZm9ybSBidXR0b24nKVswXSwgJ2V2ZW50cycpLmNsaWNrWzBdLmhhbmRsZXI7CiAgICAgICAgICAgIG9sZF9hbnN3ZXJfY2hlY2tlciA9IGFuc3dlckNoZWNrZXIuZXZhbHVhdGU7CiAgICAgICAgfSBjYXRjaChlcnIpIHt9CiAgICAgICAgaWYgKHR5cGVvZiBvbGRfc3VibWl0X2hhbmRsZXIgIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIG9sZF9hbnN3ZXJfY2hlY2tlciAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBhbGVydCgnV2FuaWthbmkgRG91YmxlLUNoZWNrIHNjcmlwdCBpcyBub3Qgd29ya2luZy4nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVwbGFjZSB0aGUgaGFuZGxlci4KICAgICAgICAkLl9kYXRhKCAkKCcjYW5zd2VyLWZvcm0gYnV0dG9uJylbMF0sICdldmVudHMnKS5jbGlja1swXS5oYW5kbGVyID0gbmV3X3N1Ym1pdF9oYW5kbGVyOwoKICAgICAgICAvLyBJbnN0YWxsIHRoZSBMaWdodG5pbmcgTW9kZSBidXR0b24uCiAgICAgICAgJCgnaGVhZCcpLmFwcGVuZCgnPHN0eWxlPiNsaWdodG5pbmctbW9kZS5hY3RpdmUge2NvbG9yOiNmZjA7IG9wYWNpdHk6MS4wO308L3N0eWxlPicpOwogICAgICAgICQoJyNzdW1tYXJ5LWJ1dHRvbicpLmFwcGVuZCgnPGEgaWQ9ImxpZ2h0bmluZy1tb2RlIiBocmVmPSIjIiBoaWRkZW4gPjxpIGNsYXNzPSJpY29uLWJvbHQiIHRpdGxlPSJMaWdodG5pbmcgTW9kZSAtIFdoZW4gZW5hYmxlZCwgYXV0by1cbmFkdmFuY2UgYWZ0ZXIgYW5zd2VyaW5nIGNvcnJlY3RseS4iPjwvaT48L2E+Jyk7CiAgICAgICAgJCgnI2xpZ2h0bmluZy1tb2RlJykub24oJ2NsaWNrJywgbGlnaHRuaW5nX2NsaWNrZWQpOwoKICAgICAgICAvLyBJbnN0YWxsIHRoZSBEb3VibGUtQ2hlY2sgZmVhdHVyZXMuCiAgICAgICAgJCgnI2FkZGl0aW9uYWwtY29udGVudCB1bCcpLmNzcygndGV4dC1hbGlnbicsJ2NlbnRlcicpLmFwcGVuZCgKICAgICAgICAgICAgJzxsaSBpZD0ib3B0aW9uLWRvdWJsZS1jaGVjayIgY2xhc3M9ImRpc2FibGVkIj48c3BhbiB0aXRsZT0iRG91YmxlIENoZWNrIj48aSBjbGFzcz0iaWNvbi10aHVtYnMtdXAiPjwvaT48L3NwYW4+PC9saT4nKwogICAgICAgICAgICAnPGxpIGlkPSJvcHRpb24tcmV0eXBlIiBjbGFzcz0iZGlzYWJsZWQiPjxzcGFuIHRpdGxlPSJSZXR5cGUiPjxpIGNsYXNzPSJpY29uLXVuZG8iPjwvaT48L3NwYW4+PC9saT48L3VsPicKICAgICAgICApOwogICAgICAgICQoJyNvcHRpb24tZG91YmxlLWNoZWNrJykub24oJ2NsaWNrJywgdG9nZ2xlX3Jlc3VsdC5iaW5kKG51bGwsJ3RvZ2dsZScpKTsKICAgICAgICAkKCcjb3B0aW9uLXJldHlwZScpLm9uKCdjbGljaycsIHRvZ2dsZV9yZXN1bHQuYmluZChudWxsLCdyZXR5cGUnKSk7CiAgICAgICAgJCgnYm9keScpLm9uKCdrZXlwcmVzcycsIGZ1bmN0aW9uKGV2ZW50KXsKICAgICAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSA0MykgdG9nZ2xlX3Jlc3VsdCgnY29ycmVjdCcpOwogICAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IDQ1KSB0b2dnbGVfcmVzdWx0KCdpbmNvcnJlY3QnKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSk7CiAgICAgICAgJCgnYm9keScpLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZXZlbnQpewogICAgICAgICAgICBpZiAoKGV2ZW50LndoaWNoID09PSAyNyB8fCBldmVudC53aGljaCA9PT0gOCkgJiYKICAgICAgICAgICAgICAgIChzdGF0ZSAhPT0gJ2ZpcnN0X3N1Ym1pdCcpICYmCiAgICAgICAgICAgICAgICAoZXZlbnQudGFyZ2V0Lm5vZGVOYW1lID09PSAnQk9EWScpICYmCiAgICAgICAgICAgICAgICAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN3a29mc19kb3VibGVjaGVjaycpKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdG9nZ2xlX3Jlc3VsdCgncmV0eXBlJyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuY3RybEtleSAmJiBldmVudC5rZXkgPT09ICdsJykgewogICAgICAgICAgICAgICAgbGlnaHRuaW5nX2NsaWNrZWQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KTsKICAgICAgICAkKCdoZWFkJykuYXBwZW5kKAogICAgICAgICAgICAnPHN0eWxlPicrCiAgICAgICAgICAgICcjYWRkaXRpb25hbC1jb250ZW50PnVsPmxpLmhpZGRlbiB7ZGlzcGxheTpub25lO30nKwogICAgICAgICAgICAnPC9zdHlsZT4nKTsKICAgICAgICBhbnN3ZXJDaGVja2VyLmV2YWx1YXRlID0gcmV0dXJuX25ld19hbnN3ZXI7CiAgICB9Cgp9KSh3aW5kb3cuZG91YmxlY2hlY2spOw==" 579 + "uuid": "462d24eb-4e66-4f82-b8dd-79a94b1c8872" 616 580 }, 617 581 { 582 + "enabled": true, 583 + "file_url": "https://greasyfork.org/scripts/371388-bunpro-mistake-delay/code/Bunpro:%20Mistake%20Delay.user.js", 618 584 "name": "Bunpro: Mistake Delay", 619 585 "options": { 620 586 "check_for_updates": true, 621 587 "comment": null, 622 - "compatopts_for_requires": true, 588 + "compat_foreach": false, 589 + "compat_metadata": false, 590 + "compat_powerful_this": null, 591 + "compat_prototypes": false, 623 592 "compat_wrappedjsobject": false, 624 - "compat_metadata": false, 625 - "compat_foreach": false, 626 - "compat_arrayleft": false, 627 - "compat_uW_gmonkey": false, 628 - "compat_forvarin": false, 593 + "compatopts_for_requires": true, 629 594 "noframes": null, 630 - "awareOfChrome": false, 631 - "run_at": null, 632 595 "override": { 633 - "use_includes": [], 634 - "orig_includes": [ 635 - "*bunpro.jp/*" 636 - ], 596 + "merge_connects": true, 597 + "merge_excludes": true, 637 598 "merge_includes": true, 638 - "use_matches": [], 639 - "orig_matches": [], 640 599 "merge_matches": true, 641 - "use_excludes": [], 600 + "orig_connects": [], 642 601 "orig_excludes": [ 643 602 "*community.bunpro.jp*" 644 603 ], 645 - "merge_excludes": true, 646 - "use_connects": [], 647 - "merge_connects": true, 648 - "use_blockers": [], 604 + "orig_includes": [ 605 + "*bunpro.jp/*" 606 + ], 607 + "orig_matches": [], 608 + "orig_noframes": null, 649 609 "orig_run_at": "document-idle", 650 - "orig_noframes": null 610 + "use_blockers": [], 611 + "use_connects": [], 612 + "use_excludes": [], 613 + "use_includes": [], 614 + "use_matches": [] 615 + }, 616 + "run_at": null, 617 + "tab_types": null 618 + }, 619 + "position": 12, 620 + "requires": [ 621 + { 622 + "meta": { 623 + "mimetype": "text/javascript", 624 + "name": "Bunpro:%20Helpful%20Events.js", 625 + "ts": 1649271252239, 626 + "url": "https://greasyfork.org/scripts/370623-bunpro-helpful-events/code/Bunpro:%20Helpful%20Events.js?version=974369" 627 + }, 628 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm87IEhlbHBmdWwgRXZlbnRzCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3RhbXBlcm1vbmtleS5uZXQvCi8vIEB2ZXJzaW9uICAgICAgMS4wLjIKLy8gQGF1dGhvciAgICAgICBLdW1pcmVpCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQzMjQxOC13YWl0LWZvci1zZWxlY3Rvci9jb2RlL1dhaXQlMjBGb3IlMjBTZWxlY3Rvci5qcz92ZXJzaW9uPTk3NDM2NgovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbih3ZnMpIHsKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCBmb3Igd2hlbiBCUCBjcmVhdGVzIGEgbmV3IGJvZHkKICAgIHZhciBuZXdCb2R5ID0gbmV3IEV2ZW50KCduZXctYm9keScpOwogICAgd2ZzLndhaXQoJ2JvZHkgPiBoZWFkZXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KG5ld0JvZHkpO30pOwoKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCBmb3Igd2hlbiB5b3UgZ2V0IGEgbmV3IGl0ZW0gaW4gcmV2aWV3cwogICAgdmFyIG5ld1Jldmlld0l0ZW0gPSBuZXcgRXZlbnQoJ25ldy1yZXZpZXctaXRlbScpOwogICAgd2ZzLndhaXQoJy5sZXZlbF9sZXNzb25faW5mbyBhJywgZnVuY3Rpb24oZSkge2ZpcmVFdmVudChuZXdSZXZpZXdJdGVtKTt9KTsKCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgd2hlbiB5b3UgZ28gdG8gc3R1ZHkgb3IgY3JhbSBwYWdlCiAgICB2YXIgcXVpelBhZ2UgPSBuZXcgRXZlbnQoJ3F1aXotcGFnZScpOwogICAgd2ZzLndhaXQoJyNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KHF1aXpQYWdlKTt9KTsKCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgd2hlbiB5b3UgZ28gdG8gc3R1ZHkgcGFnZQogICAgdmFyIHN0dWR5UGFnZSA9IG5ldyBFdmVudCgnc3R1ZHktcGFnZScpOwogICAgd2ZzLndhaXQoJyNzdHVkeS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KHN0dWR5UGFnZSk7fSk7CgogICAgLy8gQWRkIGEgY3VzdG9tIGV2ZW50IHdoZW4geW91IGdvIHRvIGNyYW0gcGFnZQogICAgdmFyIGNyYW1QYWdlID0gbmV3IEV2ZW50KCdjcmFtLXBhZ2UnKTsKICAgIHdmcy53YWl0KCcjY3JhbS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KGNyYW1QYWdlKTt9KTsKCiAgICAvLyBGaXJlcyB0aGUgZ2l2ZW4gZXZlbnQgb24gdGhlIEhUTUwgZWxlbWVudAogICAgZnVuY3Rpb24gZmlyZUV2ZW50KGV2ZW50KSB7CiAgICAgICAgdmFyIHJldHJ5SW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpewogICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSB7CiAgICAgICAgICAgICAgICAkKCdIVE1MJylbMF0uZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJldHJ5SW50ZXJ2YWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgMTAwKTsKICAgIH0KfSkod2luZG93Lndmcyk7Cg==" 651 629 } 652 - }, 630 + ], 631 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IE1pc3Rha2UgRGVsYXkKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAwLjIuOAovLyBAZGVzY3JpcHRpb24gIFByZXZlbnRzIHByZW1hdHVyZSB3cm9uZyBhbnN3ZXIgc3VibWlzc2lvbi4KLy8gQGF1dGhvciAgICAgICBLdW1pcmVpCi8vIEBpbmNsdWRlICAgICAgKmJ1bnByby5qcC8qCi8vIEBleGNsdWRlICAgICAgKmNvbW11bml0eS5idW5wcm8uanAqCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM3MDYyMy1idW5wcm8taGVscGZ1bC1ldmVudHMvY29kZS9CdW5wcm86JTIwSGVscGZ1bCUyMEV2ZW50cy5qcz92ZXJzaW9uPTk3NDM2OQovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CgkvLyBTZWNvbmRzIG9mIGRlbGF5Cgljb25zdCBkZWxheSA9IDI7CgoJLy8gV2FpdCB1bnRpbCB3ZSdyZSByZXZpZXdpbmcKCSQoJ0hUTUwnKVswXS5hZGRFdmVudExpc3RlbmVyKCdxdWl6LXBhZ2UnLCBmdW5jdGlvbigpIHsKCQkvLyBBZGQgdGhlIHN0YW5kYXJkIHN0eWxpbmcgdG8gdGhlIGRpc2FibGVkIGJ1dHRvbgoJCWFkZENTUygpOwoKCQkvLyBEbyBzdHVmZiB3aGVuIHdlIHByZXNzIGVudGVyIG9yIGJhY2tzcGFjZQoJCSQoJyNzdHVkeS1hbnN3ZXItaW5wdXQnKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCXZhciBlbGVtID0gJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpOwoJCQkvLyBJbml0aWF0ZSBkZWxhdGUgd2hlbiB3ZSBwcmVzcyBlbnRlciwgZ2V0IHRoZSBhbnN3ZXIgd3JvbmcsIGFuZCBubyBkZWxheSBpcyBhbHJlYWR5IGFjdGl2ZQoJCQl2YXIgYmtnID0gZWxlbVswXS5zdHlsZS5iYWNrZ3JvdW5kOwoJCQlpZiAoYmtnICE9ICIiKSB7CgkJCQl2YXIgYmtnX2xzdCA9IGJrZy5zbGljZSg1LCBia2cubGVuZ3RoLTEpLnNwbGl0KCcsICcpOwoJCQkJaWYgKGV2ZW50LndoaWNoID09IDEzICYmIE51bWJlcihia2dfbHN0WzBdKSA+IE51bWJlcihia2dfbHN0WzFdKSArIE51bWJlcihia2dfbHN0WzJdKSAmJiAhJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKS5sZW5ndGgpIHsKCQkJCQllbmFibGVEZWxheSgpOwoJCQkJCXNldFRpbWVvdXQoZGlzYWJsZURlbGF5LCBkZWxheSoxMDAwKTsKCQkJCX0KCQkJfQoJCX0pOwoJCSQoJ2JvZHknKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCS8vIENhbmNlbCBkZWxheSBpZiB3ZSBwcmVzcyBiYWNrc3BhY2UgYWZ0ZXIgZ2V0dGluZyBhbiBhbnN3ZXIgd3JvbmcKCQkJaWYgKGV2ZW50LndoaWNoID09IDggJiYgJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKS5sZW5ndGgpIGRpc2FibGVEZWxheSgpOwoJCX0pOwoJfSk7CgoJLy8gTWFrZXMgdXNlciB1bmFibGUgdG8gY29udGludWUgdG8gdGhlIG5leHQgaXRlbQoJZnVuY3Rpb24gZW5hYmxlRGVsYXkoKSB7CgkJJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpWzBdLmJsdXIoKTsKCQkkKCcjc3VibWl0LXN0dWR5LWFuc3dlcicpLmF0dHIoJ2lkJywgJ3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKTsKCX0KCgkvLyBNYWtlcyB1c2VyIGFibGUgdG8gY29udGludWUgdG8gdGhlIG5leHQgaXRlbSBhZ2FpbgoJZnVuY3Rpb24gZGlzYWJsZURlbGF5KCkgewoJCSQoJyNzdWJtaXQtc3R1ZHktYW5zd2VyLWRpc2FibGVkJykuYXR0cignaWQnLCAnc3VibWl0LXN0dWR5LWFuc3dlcicpOwoJfQoKCS8vIEFkZHMgdGhlIG5lZWRlZCBDU1MKCWZ1bmN0aW9uIGFkZENTUygpIHsKCQkkKCdoZWFkJykuYXBwZW5kKCc8c3R5bGU+I3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQgeycgKwoJCQkJCQkgJ3dpZHRoOiAxNSU7JyArCgkJCQkJCSAncmlnaHQ6IDA7JyArCgkJCQkJCSAndGV4dC1hbGlnbjogY2VudGVyOycgKwoJCQkJCQkgJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsnICsKCQkJCQkJICdmb250LXdlaWdodDogNDAwOycgKwoJCQkJCQkgJ2ZvbnQtc2l6ZTogMjBweDsnICsKCQkJCQkJICd6LWluZGV4OiAxMDA7JyArCgkJCQkJCSAnYm9yZGVyLXJhZGl1czogMDsnICsKCQkJCQkJICdjb2xvcjogd2hpdGU7JyArCgkJCQkJCSAnYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7JyArCgkJCQkJCSAnfScgKwoJCQkJCQkgJ0BtZWRpYSAobWF4LXdpZHRoOiA0ODBweCkgI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQge2ZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O308L3N0eWxlPicpCgl9Cn0pKCk7Cg==", 653 632 "storage": { 654 633 "data": {}, 655 634 "ts": 1607436649639 656 635 }, 636 + "uuid": "0550b6ba-fa53-4ccf-823b-54b3cacc7116" 637 + }, 638 + { 657 639 "enabled": true, 640 + "file_url": "https://greasyfork.org/scripts/370019-bunpro-auto-show-info/code/Bunpro:%20Auto-show%20Info.user.js", 641 + "name": "Bunpro: Auto-show Info", 642 + "options": { 643 + "check_for_updates": true, 644 + "comment": null, 645 + "compat_foreach": false, 646 + "compat_metadata": false, 647 + "compat_powerful_this": null, 648 + "compat_prototypes": false, 649 + "compat_wrappedjsobject": false, 650 + "compatopts_for_requires": true, 651 + "noframes": null, 652 + "override": { 653 + "merge_connects": true, 654 + "merge_excludes": true, 655 + "merge_includes": true, 656 + "merge_matches": true, 657 + "orig_connects": [], 658 + "orig_excludes": [ 659 + "*community.bunpro.jp*" 660 + ], 661 + "orig_includes": [ 662 + "*bunpro.jp/study*" 663 + ], 664 + "orig_matches": [], 665 + "orig_noframes": null, 666 + "orig_run_at": "document-idle", 667 + "use_blockers": [], 668 + "use_connects": [], 669 + "use_excludes": [], 670 + "use_includes": [], 671 + "use_matches": [] 672 + }, 673 + "run_at": null, 674 + "tab_types": null 675 + }, 658 676 "position": 13, 659 - "file_url": "https://greasyfork.org/scripts/371388-bunpro-mistake-delay/code/Bunpro:%20Mistake%20Delay.user.js", 660 - "uuid": "0550b6ba-fa53-4ccf-823b-54b3cacc7116", 661 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IE1pc3Rha2UgRGVsYXkKLy8gQG5hbWVzcGFjZSAgICBodHRwOi8vdGFtcGVybW9ua2V5Lm5ldC8KLy8gQHZlcnNpb24gICAgICAwLjIuNQovLyBAZGVzY3JpcHRpb24gIFByZXZlbnRzIHByZW1hdHVyZSB3cm9uZyBhbnN3ZXIgc3VibWlzc2lvbi4KLy8gQGF1dGhvciAgICAgICBLdW1pcmVpCi8vIEBpbmNsdWRlICAgICAgKmJ1bnByby5qcC8qCi8vIEBleGNsdWRlICAgICAgKmNvbW11bml0eS5idW5wcm8uanAqCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzUzOTItd2FpdGZvcmtleWVsZW1lbnRzL2NvZGUvV2FpdEZvcktleUVsZW1lbnRzLmpzP3ZlcnNpb249MTE1MDEyCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM3MDYyMy1idW5wcm8taGVscGZ1bC1ldmVudHMvY29kZS9CdW5wcm86JTIwSGVscGZ1bCUyMEV2ZW50cy5qcz92ZXJzaW9uPTYxNTcwMAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CgkvLyBTZWNvbmRzIG9mIGRlbGF5Cgljb25zdCBkZWxheSA9IDI7CgoJLy8gV2FpdCB1bnRpbCB3ZSdyZSByZXZpZXdpbmcKCSQoJ0hUTUwnKVswXS5hZGRFdmVudExpc3RlbmVyKCdxdWl6LXBhZ2UnLCBmdW5jdGlvbigpIHsKCQkvLyBBZGQgdGhlIHN0YW5kYXJkIHN0eWxpbmcgdG8gdGhlIGRpc2FibGVkIGJ1dHRvbgoJCWFkZENTUygpOwoKCQkvLyBEbyBzdHVmZiB3aGVuIHdlIHByZXNzIGVudGVyIG9yIGJhY2tzcGFjZQoJCSQoJyNzdHVkeS1hbnN3ZXItaW5wdXQnKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCXZhciBlbGVtID0gJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpOwoJCQkvLyBJbml0aWF0ZSBkZWxhdGUgd2hlbiB3ZSBwcmVzcyBlbnRlciwgZ2V0IHRoZSBhbnN3ZXIgd3JvbmcsIGFuZCBubyBkZWxheSBpcyBhbHJlYWR5IGFjdGl2ZQoJCQl2YXIgYmtnID0gZWxlbVswXS5zdHlsZS5iYWNrZ3JvdW5kOwoJCQlpZiAoYmtnICE9ICIiKSB7CgkJCQl2YXIgYmtnX2xzdCA9IGJrZy5zbGljZSg1LCBia2cubGVuZ3RoLTEpLnNwbGl0KCcsICcpOwoJCQkJaWYgKGV2ZW50LndoaWNoID09IDEzICYmIE51bWJlcihia2dfbHN0WzBdKSA+IE51bWJlcihia2dfbHN0WzFdKSArIE51bWJlcihia2dfbHN0WzJdKSAmJiAhJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKS5sZW5ndGgpIHsKCQkJCQllbmFibGVEZWxheSgpOwoJCQkJCXNldFRpbWVvdXQoZGlzYWJsZURlbGF5LCBkZWxheSoxMDAwKTsKCQkJCX0KCQkJfQoJCX0pOwoJCSQoJ2JvZHknKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCS8vIENhbmNlbCBkZWxheSBpZiB3ZSBwcmVzcyBiYWNrc3BhY2UgYWZ0ZXIgZ2V0dGluZyBhbiBhbnN3ZXIgd3JvbmcKCQkJaWYgKGV2ZW50LndoaWNoID09IDggJiYgJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKS5sZW5ndGgpIGRpc2FibGVEZWxheSgpOwoJCX0pOwoJfSk7CgoJLy8gTWFrZXMgdXNlciB1bmFibGUgdG8gY29udGludWUgdG8gdGhlIG5leHQgaXRlbQoJZnVuY3Rpb24gZW5hYmxlRGVsYXkoKSB7CgkJJCgnI3N0dWR5LWFuc3dlci1pbnB1dCcpWzBdLmJsdXIoKTsKCQkkKCcjc3VibWl0LXN0dWR5LWFuc3dlcicpLmF0dHIoJ2lkJywgJ3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQnKTsKCX0KCgkvLyBNYWtlcyB1c2VyIGFibGUgdG8gY29udGludWUgdG8gdGhlIG5leHQgaXRlbSBhZ2FpbgoJZnVuY3Rpb24gZGlzYWJsZURlbGF5KCkgewoJCSQoJyNzdWJtaXQtc3R1ZHktYW5zd2VyLWRpc2FibGVkJykuYXR0cignaWQnLCAnc3VibWl0LXN0dWR5LWFuc3dlcicpOwoJfQoKCS8vIEFkZHMgdGhlIG5lZWRlZCBDU1MKCWZ1bmN0aW9uIGFkZENTUygpIHsKCQkkKCdoZWFkJykuYXBwZW5kKCc8c3R5bGU+I3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQgeycgKwoJCQkJCQkgJ3dpZHRoOiAxNSU7JyArCgkJCQkJCSAncmlnaHQ6IDA7JyArCgkJCQkJCSAndGV4dC1hbGlnbjogY2VudGVyOycgKwoJCQkJCQkgJ3Bvc2l0aW9uOiBhYnNvbHV0ZTsnICsKCQkJCQkJICdmb250LXdlaWdodDogNDAwOycgKwoJCQkJCQkgJ2ZvbnQtc2l6ZTogMjBweDsnICsKCQkJCQkJICd6LWluZGV4OiAxMDA7JyArCgkJCQkJCSAnYm9yZGVyLXJhZGl1czogMDsnICsKCQkJCQkJICdjb2xvcjogd2hpdGU7JyArCgkJCQkJCSAnYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7JyArCgkJCQkJCSAnfScgKwoJCQkJCQkgJ0BtZWRpYSAobWF4LXdpZHRoOiA0ODBweCkgI3N1Ym1pdC1zdHVkeS1hbnN3ZXItZGlzYWJsZWQge2ZvbnQtc2l6ZTogMTJweCAhaW1wb3J0YW50O308L3N0eWxlPicpCgl9Cn0pKCk7", 662 677 "requires": [ 663 678 { 664 679 "meta": { 665 - "name": "WaitForKeyElements.js", 666 - "url": "https://greasyfork.org/scripts/5392-waitforkeyelements/code/WaitForKeyElements.js?version=115012", 667 - "ts": 1607436649638, 668 - "mimetype": "text/javascript" 680 + "mimetype": "text/javascript", 681 + "name": "Wait%20For%20Selector.js", 682 + "ts": 1649272239684, 683 + "url": "https://greasyfork.org/scripts/432418-wait-for-selector/code/Wait%20For%20Selector.js?version=990207" 669 684 }, 670 - "source": "LyotLS0gd2FpdEZvcktleUVsZW1lbnRzKCk6IEEgdXRpbGl0eSBmdW5jdGlvbiwgZm9yIEdyZWFzZW1vbmtleSBzY3JpcHRzLAp0aGF0IGRldGVjdHMgYW5kIGhhbmRsZXMgQUpBWGVkIGNvbnRlbnQuCiAKVXNhZ2UgZXhhbXBsZToKd2FpdEZvcktleUVsZW1lbnRzICgiZGl2LmNvbW1lbnRzIiwgY29tbWVudENhbGxiYWNrRnVuY3Rpb24pOwogCi8vLS0tIFBhZ2Utc3BlY2lmaWMgZnVuY3Rpb24gdG8gZG8gd2hhdCB3ZSB3YW50IHdoZW4gdGhlIG5vZGUgaXMgZm91bmQuCmZ1bmN0aW9uIGNvbW1lbnRDYWxsYmFja0Z1bmN0aW9uIChqTm9kZSkgewogICAgak5vZGUudGV4dCAoIlRoaXMgY29tbWVudCBjaGFuZ2VkIGJ5IHdhaXRGb3JLZXlFbGVtZW50cygpLiIpOwp9CiAKSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHlvdXIgc2NyaXB0IHRvIGhhdmUgbG9hZGVkIGpRdWVyeS4KKi8KCmZ1bmN0aW9uIHdhaXRGb3JLZXlFbGVtZW50cygKc2VsZWN0b3JUeHQsIC8qIFJlcXVpcmVkOiBUaGUgalF1ZXJ5IHNlbGVjdG9yIHN0cmluZyB0aGF0CnNwZWNpZmllcyB0aGUgZGVzaXJlZCBlbGVtZW50KHMpLgoqLwphY3Rpb25GdW5jdGlvbiwgLyogUmVxdWlyZWQ6IFRoZSBjb2RlIHRvIHJ1biB3aGVuIGVsZW1lbnRzIGFyZQpmb3VuZC4gSXQgaXMgcGFzc2VkIGEgak5vZGUgdG8gdGhlIG1hdGNoZWQKZWxlbWVudC4KKi8KYldhaXRPbmNlLCAvKiBPcHRpb25hbDogSWYgZmFsc2UsIHdpbGwgY29udGludWUgdG8gc2NhbiBmb3IKbmV3IGVsZW1lbnRzIGV2ZW4gYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoIGlzCmZvdW5kLgoqLwppZnJhbWVTZWxlY3RvciAvKiBPcHRpb25hbDogSWYgc2V0LCBpZGVudGlmaWVzIHRoZSBpZnJhbWUgdG8Kc2VhcmNoLgoqLwopIHsKICAgIHZhciB0YXJnZXROb2RlcywgYnRhcmdldHNGb3VuZDsKCiAgICBpZiAodHlwZW9mIGlmcmFtZVNlbGVjdG9yID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRhcmdldE5vZGVzID0gJChzZWxlY3RvclR4dCk7CiAgICBlbHNlCiAgICAgICAgdGFyZ2V0Tm9kZXMgPSAkKGlmcmFtZVNlbGVjdG9yKS5jb250ZW50cygpCiAgICAgICAgLmZpbmQoc2VsZWN0b3JUeHQpOwoKICAgIGlmICh0YXJnZXROb2RlcyAmJiB0YXJnZXROb2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgYnRhcmdldHNGb3VuZCA9IHRydWU7CiAgICAgICAgLyotLS0gRm91bmQgdGFyZ2V0IG5vZGUocykuIEdvIHRocm91Z2ggZWFjaCBhbmQgYWN0IGlmIHRoZXkKICAgICAgICBhcmUgbmV3LgogICAgICAgICovCiAgICAgICAgdGFyZ2V0Tm9kZXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBqVGhpcyA9ICQodGhpcyk7CiAgICAgICAgICAgIHZhciBhbHJlYWR5Rm91bmQgPSBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnKSB8fCBmYWxzZTsKCiAgICAgICAgICAgIGlmICghYWxyZWFkeUZvdW5kKSB7CiAgICAgICAgICAgICAgICAvLy0tLSBDYWxsIHRoZSBwYXlsb2FkIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgdmFyIGNhbmNlbEZvdW5kID0gYWN0aW9uRnVuY3Rpb24oalRoaXMpOwogICAgICAgICAgICAgICAgaWYgKGNhbmNlbEZvdW5kKQogICAgICAgICAgICAgICAgICAgIGJ0YXJnZXRzRm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgYnRhcmdldHNGb3VuZCA9IGZhbHNlOwogICAgfQoKICAgIC8vLS0tIEdldCB0aGUgdGltZXItY29udHJvbCB2YXJpYWJsZSBmb3IgdGhpcyBzZWxlY3Rvci4KICAgIHZhciBjb250cm9sT2JqID0gd2FpdEZvcktleUVsZW1lbnRzLmNvbnRyb2xPYmogfHwge307CiAgICB2YXIgY29udHJvbEtleSA9IHNlbGVjdG9yVHh0LnJlcGxhY2UoL1teXHddL2csICJfIik7CiAgICB2YXIgdGltZUNvbnRyb2wgPSBjb250cm9sT2JqW2NvbnRyb2xLZXldOwoKICAgIC8vLS0tIE5vdyBzZXQgb3IgY2xlYXIgdGhlIHRpbWVyIGFzIGFwcHJvcHJpYXRlLgogICAgaWYgKGJ0YXJnZXRzRm91bmQgJiYgYldhaXRPbmNlICYmIHRpbWVDb250cm9sKSB7CiAgICAgICAgLy8tLS0gVGhlIG9ubHkgY29uZGl0aW9uIHdoZXJlIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHRpbWVyLgogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZUNvbnRyb2wpOwogICAgICAgIGRlbGV0ZSBjb250cm9sT2JqW2NvbnRyb2xLZXldOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8tLS0gU2V0IGEgdGltZXIsIGlmIG5lZWRlZC4KICAgICAgICBpZiAoIXRpbWVDb250cm9sKSB7CiAgICAgICAgICAgIHRpbWVDb250cm9sID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgd2FpdEZvcktleUVsZW1lbnRzKHNlbGVjdG9yVHh0LAogICAgICAgICAgICAgICAgYWN0aW9uRnVuY3Rpb24sCiAgICAgICAgICAgICAgICBiV2FpdE9uY2UsCiAgICAgICAgICAgICAgICBpZnJhbWVTZWxlY3RvcgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzAwCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnRyb2xPYmpbY29udHJvbEtleV0gPSB0aW1lQ29udHJvbDsKICAgICAgICB9CiAgICB9CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMuY29udHJvbE9iaiA9IGNvbnRyb2xPYmo7Cn0=" 685 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBXYWl0IEZvciBTZWxlY3RvcgovLyBAbmFtZXNwYWNlICAgIGh0dHA6Ly90YW1wZXJtb25rZXkubmV0LwovLyBAZGVzY3JpcHRpb24gIFdhaXRzIGZvciBlbGVtZW50cwovLyBAYXV0aG9yICAgICAgIEt1bWlyZWkKLy8gQGluY2x1ZGUgICAgICAqY29tbXVuaXR5LndhbmlrYW5pLmNvbSoKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKOyhmdW5jdGlvbiAod2ZzKSB7CiAgICBsZXQgdmVyc2lvbiA9ICcxLjAuMScKCiAgICAvLyBDcmVhdGUgbmV3IG9ic2VydmVyIG9uIGJvZHkgdG8gbW9uaXRvciBhbGwgRE9NIGNoYW5nZXMKICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9uSGFuZGxlcikKICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2h0bWwnKVswXSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSkKCiAgICAvLyBJbnRlcmZhY2UgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIGxpYnJhcnkKICAgIGxldCBpbnRlcmZhY2UgPSB7CiAgICAgICAgdmVyc2lvbiwKICAgICAgICBvYnNlcnZlcjogb2JzZXJ2ZXIsCiAgICAgICAgd2FpdDogd2FpdEZvclNlbGVjdG9yLAogICAgICAgIHVud2FpdDogdW53YWl0SUQsCiAgICAgICAgd2FpdHM6IHt9LAogICAgICAgIHdhaXRzQnlJRDoge30sCiAgICAgICAgbmV4dElEOiAwLAogICAgfQoKICAgIC8vIFN0YXJ0CiAgICBpbnN0YWxsSW50ZXJmYWNlKCkKCiAgICAvLyBDcmVhdGVzIGEgbmV3IGVudHJ5IHRvIHNlYXJjaCBmb3Igd2hlbmV2ZXIgYSBuZXcgZWxlbWVudCBpcyBhZGRlZCB0byB0aGUgRE9NCiAgICBmdW5jdGlvbiB3YWl0Rm9yU2VsZWN0b3Ioc2VsZWN0b3IsIGNhbGxiYWNrKSB7CiAgICAgICAgaWYgKCFpbnRlcmZhY2Uud2FpdHNbc2VsZWN0b3JdKSBpbnRlcmZhY2Uud2FpdHNbc2VsZWN0b3JdID0ge30KICAgICAgICBpbnRlcmZhY2Uud2FpdHNbc2VsZWN0b3JdW2ludGVyZmFjZS5uZXh0SURdID0gY2FsbGJhY2sKICAgICAgICBpbnRlcmZhY2Uud2FpdHNCeUlEW2ludGVyZmFjZS5uZXh0SURdID0gc2VsZWN0b3IKICAgICAgICBzZWFyY2goc2VsZWN0b3IsIHRydWUpCiAgICAgICAgcmV0dXJuIGludGVyZmFjZS5uZXh0SUQrKwogICAgfQoKICAgIC8vIERlbGV0ZXMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgc2VsZWN0b3IKICAgIGZ1bmN0aW9uIHVud2FpdElEKElEKSB7CiAgICAgICAgZGVsZXRlIGludGVyZmFjZS53YWl0c1tpbnRlcmZhY2Uud2FpdHNCeUlEW0lEXV1bSURdCiAgICAgICAgZGVsZXRlIGludGVyZmFjZS53YWl0c0J5SURbSURdCiAgICB9CgogICAgLy8gTWFrZXMgc3VyZSB0aGF0IHRoZSBwdWJsaWMgaW50ZXJmYWNlIGlzIHRoZSBuZXdlc3QgdmVyc2lvbiBhbmQgdGhlIHNhbWUgYXMgdGhlIGxvY2FsIG9uZQogICAgZnVuY3Rpb24gaW5zdGFsbEludGVyZmFjZSgpIHsKICAgICAgICBpZiAoIXdmcykgd2luZG93LndmcyA9IGludGVyZmFjZQogICAgICAgIGVsc2UgaWYgKHdmcy52ZXJzaW9uIDwgaW50ZXJmYWNlLnZlcnNpb24pIHsKICAgICAgICAgICAgd2ZzLnZlcnNpb24gPSBpbnRlcmZhY2UudmVyc2lvbgogICAgICAgICAgICB3ZnMub2JzZXJ2ZXIuZGlzY29ubmVjdCgpCiAgICAgICAgICAgIHdmcy5vYnNlcnZlciA9IGludGVyZmFjZS5vYnNlcnZlcgogICAgICAgICAgICB3ZnMud2FpdCA9IGludGVyZmFjZS53YWl0CiAgICAgICAgICAgIHdmcy51bndhaXQgPSBpbnRlcmZhY2UudW53YWl0CiAgICAgICAgfQogICAgICAgIGludGVyZmFjZSA9IHdmcyB8fCBpbnRlcmZhY2UKICAgIH0KCiAgICAvLyBXYWl0cyB1bnRpbCB0aGVyZSBoYXMgYmVlbiBtb3JlIHRoYW4gMzAwIG1zIGJldHdlZW4gbXV0YXRpb25zIGFuZCB0aGVuIGNoZWNrcyBmb3IgbmV3IGVsZW1lbnRzCiAgICBsZXQgbGFzdE11dGF0aW9uRGF0ZSA9IDAgLy8gRXBvY2ggb2YgbGFzdCBtdXRhdGlvbiBldmVudAogICAgbGV0IHRpbWVvdXRJRCA9IDAKICAgIGZ1bmN0aW9uIG11dGF0aW9uSGFuZGxlcihtdXRhdGlvbnMpIHsKICAgICAgICBsZXQgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gbGFzdE11dGF0aW9uRGF0ZQogICAgICAgIGxhc3RNdXRhdGlvbkRhdGUgPSBEYXRlLm5vdygpCiAgICAgICAgaWYgKGR1cmF0aW9uIDwgMzAwKSB7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SUQpCiAgICAgICAgICAgIHRpbWVvdXRJRCA9IHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgZm9yIChsZXQgc2VsZWN0b3IgaW4gaW50ZXJmYWNlLndhaXRzKSBzZWFyY2goc2VsZWN0b3IpCiAgICAgICAgICAgIH0sIDMwMCkKICAgICAgICB9CiAgICB9CgogICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBzZWxlY3RvciBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIG9uIHRoZSBmb3VuZCBlbGVtZW50cwogICAgZnVuY3Rpb24gc2VhcmNoKHNlbGVjdG9yLCBhbGwgPSBmYWxzZSkgewogICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpLmZvckVhY2goKGUsIGkpID0+IHsKICAgICAgICAgICAgbGV0IGNhbGxiYWNrcyA9IE9iamVjdC52YWx1ZXMoaW50ZXJmYWNlLndhaXRzW3NlbGVjdG9yXSkKICAgICAgICAgICAgaWYgKGFsbCB8fCAhZS5XRlNGb3VuZCB8fCBlLldGU0ZvdW5kID09IGxhc3RNdXRhdGlvbkRhdGUpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykgY2FsbGJhY2soZSkKICAgICAgICAgICAgICAgIGUuV0ZTRm91bmQgPSBsYXN0TXV0YXRpb25EYXRlCiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgfQp9KSh3aW5kb3cud2ZzKQo=" 671 686 }, 672 687 { 673 688 "meta": { 689 + "mimetype": "text/javascript", 674 690 "name": "Bunpro:%20Helpful%20Events.js", 675 - "url": "https://greasyfork.org/scripts/370623-bunpro-helpful-events/code/Bunpro:%20Helpful%20Events.js?version=615700", 676 - "ts": 1607436649638, 677 - "mimetype": "text/javascript" 691 + "ts": 1649272239682, 692 + "url": "https://greasyfork.org/scripts/370623-bunpro-helpful-events/code/Bunpro:%20Helpful%20Events.js?version=990211" 678 693 }, 679 - "source": "KGZ1bmN0aW9uKCkgewogICAgLy8gQWRkIGEgY3VzdG9tIGV2ZW50IGZvciB3aGVuIEJQIGNyZWF0ZXMgYSBuZXcgYm9keQogICAgdmFyIG5ld0JvZHkgPSBuZXcgRXZlbnQoJ25ldy1ib2R5Jyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJ2JvZHkgPiBoZWFkZXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KG5ld0JvZHkpO30pOwogICAgCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgZm9yIHdoZW4geW91IGdldCBhIG5ldyBpdGVtIGluIHJldmlld3MKICAgIHZhciBuZXdSZXZpZXdJdGVtID0gbmV3IEV2ZW50KCduZXctcmV2aWV3LWl0ZW0nKTsKICAgIHdhaXRGb3JLZXlFbGVtZW50cygnLmxldmVsX2xlc3Nvbl9pbmZvIGEnLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KG5ld1Jldmlld0l0ZW0pO30pOwogICAgCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgd2hlbiB5b3UgZ28gdG8gc3R1ZHkgb3IgY3JhbSBwYWdlCiAgICB2YXIgcXVpelBhZ2UgPSBuZXcgRXZlbnQoJ3F1aXotcGFnZScpOwogICAgd2FpdEZvcktleUVsZW1lbnRzKCcjc2hvdy1ncmFtbWFyJywgZnVuY3Rpb24oZSkge2ZpcmVFdmVudChxdWl6UGFnZSk7fSk7CiAgICAKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCB3aGVuIHlvdSBnbyB0byBzdHVkeSBwYWdlCiAgICB2YXIgc3R1ZHlQYWdlID0gbmV3IEV2ZW50KCdzdHVkeS1wYWdlJyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJyNzdHVkeS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KHN0dWR5UGFnZSk7fSk7CiAgICAKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCB3aGVuIHlvdSBnbyB0byBjcmFtIHBhZ2UKICAgIHZhciBjcmFtUGFnZSA9IG5ldyBFdmVudCgnY3JhbS1wYWdlJyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJyNjcmFtLXBhZ2UgI3Nob3ctZ3JhbW1hcicsIGZ1bmN0aW9uKGUpIHtmaXJlRXZlbnQoY3JhbVBhZ2UpO30pOwogICAgCiAgICAvLyBGaXJlcyB0aGUgZ2l2ZW4gZXZlbnQgb24gdGhlIEhUTUwgZWxlbWVudAogICAgZnVuY3Rpb24gZmlyZUV2ZW50KGV2ZW50KSB7CiAgICAJCXZhciByZXRyeUludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ0hUTUwnKVswXS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJldHJ5SW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAxMDApOwogICAgfQp9KSgpOw==" 694 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IEhlbHBmdWwgRXZlbnRzCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3RhbXBlcm1vbmtleS5uZXQvCi8vIEB2ZXJzaW9uICAgICAgMS4wLjIKLy8gQGF1dGhvciAgICAgICBLdW1pcmVpCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQzMjQxOC13YWl0LWZvci1zZWxlY3Rvci9jb2RlL1dhaXQlMjBGb3IlMjBTZWxlY3Rvci5qcz92ZXJzaW9uPTk5MDIwNwovLyBAaW5jbHVkZSAgICAgICpidW5wcm8uanAqCi8vIEBleGNsdWRlICAgICAgKmNvbW11bml0eS5idW5wcm8uanAqCi8vID09L1VzZXJTY3JpcHQ9PQoKOyhmdW5jdGlvbiAod2ZzKSB7CiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgZm9yIHdoZW4gQlAgY3JlYXRlcyBhIG5ldyBib2R5CiAgICB2YXIgbmV3Qm9keSA9IG5ldyBFdmVudCgnbmV3LWJvZHknKQogICAgd2ZzLndhaXQoJ2JvZHkgPiBoZWFkZXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGZpcmVFdmVudChuZXdCb2R5KQogICAgfSkKCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgZm9yIHdoZW4geW91IGdldCBhIG5ldyBpdGVtIGluIHJldmlld3MKICAgIHZhciBuZXdSZXZpZXdJdGVtID0gbmV3IEV2ZW50KCduZXctcmV2aWV3LWl0ZW0nKQogICAgd2ZzLndhaXQoJy5sZXZlbF9sZXNzb25faW5mbyBhJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICBmaXJlRXZlbnQobmV3UmV2aWV3SXRlbSkKICAgIH0pCgogICAgLy8gQWRkIGEgY3VzdG9tIGV2ZW50IHdoZW4geW91IGdvIHRvIHN0dWR5IG9yIGNyYW0gcGFnZQogICAgdmFyIHF1aXpQYWdlID0gbmV3IEV2ZW50KCdxdWl6LXBhZ2UnKQogICAgd2ZzLndhaXQoJyNzaG93LWdyYW1tYXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGZpcmVFdmVudChxdWl6UGFnZSkKICAgIH0pCgogICAgLy8gQWRkIGEgY3VzdG9tIGV2ZW50IHdoZW4geW91IGdvIHRvIHN0dWR5IHBhZ2UKICAgIHZhciBzdHVkeVBhZ2UgPSBuZXcgRXZlbnQoJ3N0dWR5LXBhZ2UnKQogICAgd2ZzLndhaXQoJyNzdHVkeS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGZpcmVFdmVudChzdHVkeVBhZ2UpCiAgICB9KQoKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCB3aGVuIHlvdSBnbyB0byBjcmFtIHBhZ2UKICAgIHZhciBjcmFtUGFnZSA9IG5ldyBFdmVudCgnY3JhbS1wYWdlJykKICAgIHdmcy53YWl0KCcjY3JhbS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbiAoZSkgewogICAgICAgIGZpcmVFdmVudChjcmFtUGFnZSkKICAgIH0pCgogICAgLy8gRmlyZXMgdGhlIGdpdmVuIGV2ZW50IG9uIHRoZSBIVE1MIGVsZW1lbnQKICAgIGZ1bmN0aW9uIGZpcmVFdmVudChldmVudCkgewogICAgICAgIHZhciByZXRyeUludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnKSB7CiAgICAgICAgICAgICAgICAkKCdIVE1MJylbMF0uZGlzcGF0Y2hFdmVudChldmVudCkKICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwocmV0cnlJbnRlcnZhbCkKICAgICAgICAgICAgfQogICAgICAgIH0sIDEwMCkKICAgIH0KfSkod2luZG93LndmcykK" 680 695 } 681 - ] 696 + ], 697 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IEF1dG8tc2hvdyBJbmZvCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3RhbXBlcm1vbmtleS5uZXQvCi8vIEB2ZXJzaW9uICAgICAgMC4yLjEwCi8vIEBkZXNjcmlwdGlvbiAgQXV0b21hdGljYWxseSBleHBhbmRzIHRoZSBmdWxsIGdyYW1tYXIgaW5mbyB3aGVuIHlvdSBnZXQgYSByZXZpZXcgd3JvbmcuCi8vIEBhdXRob3IgICAgICAgS3VtaXJlaQovLyBAaW5jbHVkZSAgICAgICpidW5wcm8uanAvc3R1ZHkqCi8vIEBleGNsdWRlICAgICAgKmNvbW11bml0eS5idW5wcm8uanAqCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzQzMjQxOC13YWl0LWZvci1zZWxlY3Rvci9jb2RlL1dhaXQlMjBGb3IlMjBTZWxlY3Rvci5qcz92ZXJzaW9uPTk5MDIwNwovLyBAcmVxdWlyZSAgICAgIGh0dHBzOi8vZ3JlYXN5Zm9yay5vcmcvc2NyaXB0cy8zNzA2MjMtYnVucHJvLWhlbHBmdWwtZXZlbnRzL2NvZGUvQnVucHJvOiUyMEhlbHBmdWwlMjBFdmVudHMuanM/dmVyc2lvbj05OTAyMTEKLy8gQGdyYW50ICAgICAgICBub25lCi8vID09L1VzZXJTY3JpcHQ9PQoKOyhmdW5jdGlvbiAoKSB7CiAgICAvL3dhaXQgdW50aWwgd2UncmUgcmV2aWV3aW5nCiAgICAkKCdIVE1MJylbMF0uYWRkRXZlbnRMaXN0ZW5lcigncXVpei1wYWdlJywgZnVuY3Rpb24gKCkgewogICAgICAgIC8vZG8gc3R1ZmYgd2hlbiB3ZSBwcmVzcyBlbnRlciBhbmQgZ2V0IHRoZSBhbnN3ZXIgd3JvbmcKICAgICAgICAkKCcjc3R1ZHktYW5zd2VyLWlucHV0Jykub24oJ2tleWRvd24nLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LndoaWNoID09IDEzKSB7CiAgICAgICAgICAgICAgICBvcGVuSWZXcm9uZygpCiAgICAgICAgICAgIH0KICAgICAgICB9KQogICAgICAgIC8vZG8gc3R1ZmYgd2hlbiB3ZSBjbGljayBzdWJtaXQgYW5kIGdldCB0aGUgYW5zd2VyIHdyb25nCiAgICAgICAgJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXInKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIG9wZW5JZldyb25nKCkKICAgICAgICB9KQogICAgfSkKCiAgICAvL29wZW5zIHRoZSBpbmZvIGlmIHlvdSBnZXQgdGhlIGl0ZW0gd3JvbmcKICAgIGZ1bmN0aW9uIG9wZW5JZldyb25nKCkgewogICAgICAgIGlmICgkKCcub29wcy1idXR0b24nKVswXS5zdHlsZS5kaXNwbGF5ID09ICdibG9jaycgfHwgJCgnI2xlYXJuLW5ldy1ncmFtbWFyLXBhZ2UnKS5sZW5ndGgpIHsKICAgICAgICAgICAgJCgnLnNob3ctZ3JhbW1hci10ZXh0JykuY2xpY2soKQogICAgICAgIH0KICAgIH0KfSkoKQo=", 698 + "storage": { 699 + "data": {}, 700 + "ts": 1607436649642 701 + }, 702 + "uuid": "ea2cd70b-7fb9-4481-9ec5-2e5761f5ad46" 682 703 }, 683 704 { 684 - "name": "Bunpro: Auto-show Info", 705 + "enabled": true, 706 + "file_url": "https://raw.githubusercontent.com/Mottie/Github-userscripts/master/github-code-folding.user.js", 707 + "name": "GitHub Code Folding", 685 708 "options": { 686 709 "check_for_updates": true, 687 710 "comment": null, 688 - "compatopts_for_requires": true, 689 - "compat_wrappedjsobject": false, 690 - "compat_metadata": false, 691 711 "compat_foreach": false, 692 - "compat_arrayleft": false, 693 - "compat_uW_gmonkey": false, 694 - "compat_forvarin": false, 712 + "compat_metadata": false, 713 + "compat_powerful_this": null, 714 + "compat_prototypes": false, 715 + "compat_wrappedjsobject": false, 716 + "compatopts_for_requires": true, 695 717 "noframes": null, 696 - "awareOfChrome": false, 697 - "run_at": null, 698 718 "override": { 699 - "use_includes": [], 719 + "merge_connects": true, 720 + "merge_excludes": true, 721 + "merge_includes": true, 722 + "merge_matches": true, 723 + "orig_connects": [], 724 + "orig_excludes": [], 700 725 "orig_includes": [ 701 - "*bunpro.jp/*" 726 + "https://github.com/*", 727 + "https://gist.github.com/*" 702 728 ], 703 - "merge_includes": true, 704 - "use_matches": [], 705 729 "orig_matches": [], 706 - "merge_matches": true, 707 - "use_excludes": [], 708 - "orig_excludes": [ 709 - "*community.bunpro.jp*" 710 - ], 711 - "merge_excludes": true, 712 - "use_connects": [], 713 - "merge_connects": true, 714 - "use_blockers": [], 730 + "orig_noframes": null, 715 731 "orig_run_at": "document-idle", 716 - "orig_noframes": null 717 - } 718 - }, 719 - "storage": { 720 - "data": {}, 721 - "ts": 1607436649642 732 + "use_blockers": [], 733 + "use_connects": [], 734 + "use_excludes": [], 735 + "use_includes": [], 736 + "use_matches": [] 737 + }, 738 + "run_at": null, 739 + "tab_types": null 722 740 }, 723 - "enabled": true, 724 741 "position": 14, 725 - "file_url": "https://greasyfork.org/scripts/370019-bunpro-auto-show-info/code/Bunpro:%20Auto-show%20Info.user.js", 726 - "uuid": "ea2cd70b-7fb9-4481-9ec5-2e5761f5ad46", 727 - "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBCdW5wcm86IEF1dG8tc2hvdyBJbmZvCi8vIEBuYW1lc3BhY2UgICAgaHR0cDovL3RhbXBlcm1vbmtleS5uZXQvCi8vIEB2ZXJzaW9uICAgICAgMC4yLjQKLy8gQGRlc2NyaXB0aW9uICBBdXRvbWF0aWNhbGx5IGV4cGFuZHMgdGhlIGZ1bGwgZ3JhbW1hciBpbmZvIHdoZW4geW91IGdldCBhIHJldmlldyB3cm9uZy4KLy8gQGF1dGhvciAgICAgICBLdW1pcmVpCi8vIEBpbmNsdWRlICAgICAgKmJ1bnByby5qcC8qCi8vIEBleGNsdWRlICAgICAgKmNvbW11bml0eS5idW5wcm8uanAqCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzUzOTItd2FpdGZvcmtleWVsZW1lbnRzL2NvZGUvV2FpdEZvcktleUVsZW1lbnRzLmpzP3ZlcnNpb249MTE1MDEyCi8vIEByZXF1aXJlICAgICAgaHR0cHM6Ly9ncmVhc3lmb3JrLm9yZy9zY3JpcHRzLzM3MDYyMy1idW5wcm8taGVscGZ1bC1ldmVudHMvY29kZS9CdW5wcm86JTIwSGVscGZ1bCUyMEV2ZW50cy5qcz92ZXJzaW9uPTYxNTcwMAovLyBAZ3JhbnQgICAgICAgIG5vbmUKLy8gPT0vVXNlclNjcmlwdD09CgooZnVuY3Rpb24oKSB7CgkvL3dhaXQgdW50aWwgd2UncmUgcmV2aWV3aW5nCgkkKCdIVE1MJylbMF0uYWRkRXZlbnRMaXN0ZW5lcigncXVpei1wYWdlJywgZnVuY3Rpb24oKSB7CgkJLy9kbyBzdHVmZiB3aGVuIHdlIHByZXNzIGVudGVyIGFuZCBnZXQgdGhlIGFuc3dlciB3cm9uZwoJCSQoJyNzdHVkeS1hbnN3ZXItaW5wdXQnKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCWlmIChldmVudC53aGljaCA9PSAxMykgewoJCQkJb3BlbklmV3JvbmcoKTsKCQkJfQoJCX0pOwoJCS8vZG8gc3R1ZmYgd2hlbiB3ZSBjbGljayBzdWJtaXQgYW5kIGdldCB0aGUgYW5zd2VyIHdyb25nCgkJJCgnI3N1Ym1pdC1zdHVkeS1hbnN3ZXInKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKCQkJb3BlbklmV3JvbmcoKTsKCQl9KTsKCgl9KTsKCgkvL29wZW5zIHRoZSBpbmZvIGlmIHlvdSBnZXQgdGhlIGl0ZW0gd3JvbmcKCWZ1bmN0aW9uIG9wZW5JZldyb25nKCkgewoJCWlmICgkKCcub29wcy1idXR0b24nKVswXS5zdHlsZS5kaXNwbGF5ID09ICJibG9jayIgfHwgJCgnI2xlYXJuLW5ldy1ncmFtbWFyLXBhZ2UnKS5sZW5ndGgpIHsKCQkJJCgnLnNob3ctZ3JhbW1hci10ZXh0JykuY2xpY2soKTsKCQl9Cgl9Cn0pKCk7", 728 742 "requires": [ 729 743 { 730 744 "meta": { 731 - "name": "WaitForKeyElements.js", 732 - "url": "https://greasyfork.org/scripts/5392-waitforkeyelements/code/WaitForKeyElements.js?version=115012", 733 - "ts": 1607436649640, 734 - "mimetype": "text/javascript" 745 + "mimetype": "text/javascript", 746 + "name": "gm4-polyfill.js", 747 + "ts": 1649167236645, 748 + "url": "https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js?updated=20180103" 735 749 }, 736 - "source": "LyotLS0gd2FpdEZvcktleUVsZW1lbnRzKCk6IEEgdXRpbGl0eSBmdW5jdGlvbiwgZm9yIEdyZWFzZW1vbmtleSBzY3JpcHRzLAp0aGF0IGRldGVjdHMgYW5kIGhhbmRsZXMgQUpBWGVkIGNvbnRlbnQuCiAKVXNhZ2UgZXhhbXBsZToKd2FpdEZvcktleUVsZW1lbnRzICgiZGl2LmNvbW1lbnRzIiwgY29tbWVudENhbGxiYWNrRnVuY3Rpb24pOwogCi8vLS0tIFBhZ2Utc3BlY2lmaWMgZnVuY3Rpb24gdG8gZG8gd2hhdCB3ZSB3YW50IHdoZW4gdGhlIG5vZGUgaXMgZm91bmQuCmZ1bmN0aW9uIGNvbW1lbnRDYWxsYmFja0Z1bmN0aW9uIChqTm9kZSkgewogICAgak5vZGUudGV4dCAoIlRoaXMgY29tbWVudCBjaGFuZ2VkIGJ5IHdhaXRGb3JLZXlFbGVtZW50cygpLiIpOwp9CiAKSU1QT1JUQU5UOiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHlvdXIgc2NyaXB0IHRvIGhhdmUgbG9hZGVkIGpRdWVyeS4KKi8KCmZ1bmN0aW9uIHdhaXRGb3JLZXlFbGVtZW50cygKc2VsZWN0b3JUeHQsIC8qIFJlcXVpcmVkOiBUaGUgalF1ZXJ5IHNlbGVjdG9yIHN0cmluZyB0aGF0CnNwZWNpZmllcyB0aGUgZGVzaXJlZCBlbGVtZW50KHMpLgoqLwphY3Rpb25GdW5jdGlvbiwgLyogUmVxdWlyZWQ6IFRoZSBjb2RlIHRvIHJ1biB3aGVuIGVsZW1lbnRzIGFyZQpmb3VuZC4gSXQgaXMgcGFzc2VkIGEgak5vZGUgdG8gdGhlIG1hdGNoZWQKZWxlbWVudC4KKi8KYldhaXRPbmNlLCAvKiBPcHRpb25hbDogSWYgZmFsc2UsIHdpbGwgY29udGludWUgdG8gc2NhbiBmb3IKbmV3IGVsZW1lbnRzIGV2ZW4gYWZ0ZXIgdGhlIGZpcnN0IG1hdGNoIGlzCmZvdW5kLgoqLwppZnJhbWVTZWxlY3RvciAvKiBPcHRpb25hbDogSWYgc2V0LCBpZGVudGlmaWVzIHRoZSBpZnJhbWUgdG8Kc2VhcmNoLgoqLwopIHsKICAgIHZhciB0YXJnZXROb2RlcywgYnRhcmdldHNGb3VuZDsKCiAgICBpZiAodHlwZW9mIGlmcmFtZVNlbGVjdG9yID09ICJ1bmRlZmluZWQiKQogICAgICAgIHRhcmdldE5vZGVzID0gJChzZWxlY3RvclR4dCk7CiAgICBlbHNlCiAgICAgICAgdGFyZ2V0Tm9kZXMgPSAkKGlmcmFtZVNlbGVjdG9yKS5jb250ZW50cygpCiAgICAgICAgLmZpbmQoc2VsZWN0b3JUeHQpOwoKICAgIGlmICh0YXJnZXROb2RlcyAmJiB0YXJnZXROb2Rlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgYnRhcmdldHNGb3VuZCA9IHRydWU7CiAgICAgICAgLyotLS0gRm91bmQgdGFyZ2V0IG5vZGUocykuIEdvIHRocm91Z2ggZWFjaCBhbmQgYWN0IGlmIHRoZXkKICAgICAgICBhcmUgbmV3LgogICAgICAgICovCiAgICAgICAgdGFyZ2V0Tm9kZXMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBqVGhpcyA9ICQodGhpcyk7CiAgICAgICAgICAgIHZhciBhbHJlYWR5Rm91bmQgPSBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnKSB8fCBmYWxzZTsKCiAgICAgICAgICAgIGlmICghYWxyZWFkeUZvdW5kKSB7CiAgICAgICAgICAgICAgICAvLy0tLSBDYWxsIHRoZSBwYXlsb2FkIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgdmFyIGNhbmNlbEZvdW5kID0gYWN0aW9uRnVuY3Rpb24oalRoaXMpOwogICAgICAgICAgICAgICAgaWYgKGNhbmNlbEZvdW5kKQogICAgICAgICAgICAgICAgICAgIGJ0YXJnZXRzRm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBqVGhpcy5kYXRhKCdhbHJlYWR5Rm91bmQnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgYnRhcmdldHNGb3VuZCA9IGZhbHNlOwogICAgfQoKICAgIC8vLS0tIEdldCB0aGUgdGltZXItY29udHJvbCB2YXJpYWJsZSBmb3IgdGhpcyBzZWxlY3Rvci4KICAgIHZhciBjb250cm9sT2JqID0gd2FpdEZvcktleUVsZW1lbnRzLmNvbnRyb2xPYmogfHwge307CiAgICB2YXIgY29udHJvbEtleSA9IHNlbGVjdG9yVHh0LnJlcGxhY2UoL1teXHddL2csICJfIik7CiAgICB2YXIgdGltZUNvbnRyb2wgPSBjb250cm9sT2JqW2NvbnRyb2xLZXldOwoKICAgIC8vLS0tIE5vdyBzZXQgb3IgY2xlYXIgdGhlIHRpbWVyIGFzIGFwcHJvcHJpYXRlLgogICAgaWYgKGJ0YXJnZXRzRm91bmQgJiYgYldhaXRPbmNlICYmIHRpbWVDb250cm9sKSB7CiAgICAgICAgLy8tLS0gVGhlIG9ubHkgY29uZGl0aW9uIHdoZXJlIHdlIG5lZWQgdG8gY2xlYXIgdGhlIHRpbWVyLgogICAgICAgIGNsZWFySW50ZXJ2YWwodGltZUNvbnRyb2wpOwogICAgICAgIGRlbGV0ZSBjb250cm9sT2JqW2NvbnRyb2xLZXldOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8tLS0gU2V0IGEgdGltZXIsIGlmIG5lZWRlZC4KICAgICAgICBpZiAoIXRpbWVDb250cm9sKSB7CiAgICAgICAgICAgIHRpbWVDb250cm9sID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgd2FpdEZvcktleUVsZW1lbnRzKHNlbGVjdG9yVHh0LAogICAgICAgICAgICAgICAgYWN0aW9uRnVuY3Rpb24sCiAgICAgICAgICAgICAgICBiV2FpdE9uY2UsCiAgICAgICAgICAgICAgICBpZnJhbWVTZWxlY3RvcgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgMzAwCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGNvbnRyb2xPYmpbY29udHJvbEtleV0gPSB0aW1lQ29udHJvbDsKICAgICAgICB9CiAgICB9CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMuY29udHJvbE9iaiA9IGNvbnRyb2xPYmo7Cn0=" 750 + "source": "LyoKVGhpcyBoZWxwZXIgc2NyaXB0IGJyaWRnZXMgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBHcmVhc2Vtb25rZXkgNCBBUElzIGFuZApleGlzdGluZy9sZWdhY3kgQVBJcy4gIFNheSBmb3IgZXhhbXBsZSB5b3VyIHVzZXIgc2NyaXB0IGluY2x1ZGVzCgogICAgLy8gQGdyYW50IEdNX2dldFZhbHVlCgpBbmQgeW91J2QgbGlrZSB0byBiZSBjb21wYXRpYmxlIHdpdGggYm90aCBHcmVhc2Vtb25rZXkgMyBhbmQgR3JlYXNlbW9ua2V5IDQKKGFuZCBmb3IgdGhhdCBtYXR0ZXIgYWxsIHZlcnNpb25zIG9mIFZpb2xlbnRtb25rZXksIFRhbXBlcm1vbmtleSwgYW5kIGFueSBvdGhlcgp1c2VyIHNjcmlwdCBlbmdpbmUpLiAgQWRkOgoKICAgIC8vIEBncmFudCBHTS5nZXRWYWx1ZQogICAgLy8gQHJlcXVpcmUgaHR0cHM6Ly9ncmVhc2Vtb25rZXkuZ2l0aHViLmlvL2dtNC1wb2x5ZmlsbC9nbTQtcG9seWZpbGwuanMKCkFuZCBzd2l0Y2ggdG8gdGhlIG5ldyAoR00tZG90KSBBUElzLCB3aGljaCByZXR1cm4gcHJvbWlzZXMuICBJZiB5b3VyIHNjcmlwdAppcyBydW5uaW5nIGluIGFuIGVuZ2luZSB0aGF0IGRvZXMgbm90IHByb3ZpZGUgdGhlIG5ldyBhc3luY2hyb25vdXMgQVBJcywgdGhpcwpoZWxwZXIgd2lsbCBhZGQgdGhlbSwgYmFzZWQgb24gdGhlIG9sZCBBUElzLgoKSWYgeW91IHVzZSBgYXdhaXRgIGF0IHRoZSB0b3AgbGV2ZWwsIHlvdSdsbCBuZWVkIHRvIHdyYXAgeW91ciBzY3JpcHQgaW4gYW4KYGFzeW5jYCBmdW5jdGlvbiB0byBiZSBjb21wYXRpYmxlIHdpdGggYW55IHVzZXIgc2NyaXB0IGVuZ2luZSBiZXNpZGVzCkdyZWFzZW1vbmtleSA0LgoKICAgIChhc3luYyAoKSA9PiB7CiAgICBsZXQgeCA9IGF3YWl0IEdNLmdldFZhbHVlKCd4Jyk7CiAgICB9KSgpOwoqLwoKaWYgKHR5cGVvZiBHTSA9PSAndW5kZWZpbmVkJykgewogIHRoaXMuR00gPSB7fTsKfQoKCmlmICh0eXBlb2YgR01fYWRkU3R5bGUgPT0gJ3VuZGVmaW5lZCcpIHsKICB0aGlzLkdNX2FkZFN0eWxlID0gKGFDc3MpID0+IHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGxldCBoZWFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKICAgIGlmIChoZWFkKSB7CiAgICAgIGxldCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZSgndHlwZScsICd0ZXh0L2NzcycpOwogICAgICBzdHlsZS50ZXh0Q29udGVudCA9IGFDc3M7CiAgICAgIGhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9Owp9CgoKaWYgKHR5cGVvZiBHTV9yZWdpc3Rlck1lbnVDb21tYW5kID09ICd1bmRlZmluZWQnKSB7CiAgdGhpcy5HTV9yZWdpc3Rlck1lbnVDb21tYW5kID0gKGNhcHRpb24sIGNvbW1hbmRGdW5jLCBhY2Nlc3NLZXkpID0+IHsKICAgIGlmICghZG9jdW1lbnQuYm9keSkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnCiAgICAgICAgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5sb2NhbE5hbWUgPT09ICdodG1sJykgewogICAgICAgIG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMsIG9ic2VydmVyKSA9PiB7CiAgICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkgewogICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgIEdNX3JlZ2lzdGVyTWVudUNvbW1hbmQoY2FwdGlvbiwgY29tbWFuZEZ1bmMsIGFjY2Vzc0tleSk7CiAgICAgICAgICB9CiAgICAgICAgfSkub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLmVycm9yKCdHTV9yZWdpc3Rlck1lbnVDb21tYW5kIGdvdCBubyBib2R5LicpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIGxldCBjb250ZXh0TWVudSA9IGRvY3VtZW50LmJvZHkuZ2V0QXR0cmlidXRlKCdjb250ZXh0bWVudScpOwogICAgbGV0IG1lbnUgPSAoY29udGV4dE1lbnUgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdtZW51IycgKyBjb250ZXh0TWVudSkgOiBudWxsKTsKICAgIGlmICghbWVudSkgewogICAgICBtZW51ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbWVudScpOwogICAgICBtZW51LnNldEF0dHJpYnV0ZSgnaWQnLCAnZ20tcmVnaXN0ZXJlZC1tZW51Jyk7CiAgICAgIG1lbnUuc2V0QXR0cmlidXRlKCd0eXBlJywgJ2NvbnRleHQnKTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtZW51KTsKICAgICAgZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUoJ2NvbnRleHRtZW51JywgJ2dtLXJlZ2lzdGVyZWQtbWVudScpOwogICAgfQogICAgbGV0IG1lbnVJdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbWVudWl0ZW0nKTsKICAgIG1lbnVJdGVtLnRleHRDb250ZW50ID0gY2FwdGlvbjsKICAgIG1lbnVJdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY29tbWFuZEZ1bmMsIHRydWUpOwogICAgbWVudS5hcHBlbmRDaGlsZChtZW51SXRlbSk7CiAgfTsKfQoKCmlmICh0eXBlb2YgR01fZ2V0UmVzb3VyY2VUZXh0ID09ICd1bmRlZmluZWQnKSB7CiAgdGhpcy5HTV9nZXRSZXNvdXJjZVRleHQgPSAoYVJlcykgPT4gewogICAgJ3VzZSBzdHJpY3QnOwogICAgcmV0dXJuIEdNLmdldFJlc291cmNlVXJsKGFSZXMpCiAgICAgIC50aGVuKHVybCA9PiBmZXRjaCh1cmwpKQogICAgICAudGhlbihyZXNwID0+IHJlc3AudGV4dCgpKQogICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHsKICAgICAgICBHTS5sb2coJ1JlcXVlc3QgZmFpbGVkJywgZXJyb3IpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9KTsKICB9Owp9CgoKT2JqZWN0LmVudHJpZXMoewogICdsb2cnOiBjb25zb2xlLmxvZy5iaW5kKGNvbnNvbGUpLCAgLy8gUGFsZSBNb29uIGNvbXBhdGliaWxpdHkuICBTZWUgIzEzLgogICdpbmZvJzogR01faW5mbywKfSkuZm9yRWFjaCgoW25ld0tleSwgb2xkXSkgPT4gewogIGlmIChvbGQgJiYgKHR5cGVvZiBHTVtuZXdLZXldID09ICd1bmRlZmluZWQnKSkgewogICAgR01bbmV3S2V5XSA9IG9sZDsKICB9Cn0pOwoKCk9iamVjdC5lbnRyaWVzKHsKICAnR01fYWRkU3R5bGUnOiAnYWRkU3R5bGUnLAogICdHTV9kZWxldGVWYWx1ZSc6ICdkZWxldGVWYWx1ZScsCiAgJ0dNX2dldFJlc291cmNlVVJMJzogJ2dldFJlc291cmNlVXJsJywKICAnR01fZ2V0VmFsdWUnOiAnZ2V0VmFsdWUnLAogICdHTV9saXN0VmFsdWVzJzogJ2xpc3RWYWx1ZXMnLAogICdHTV9ub3RpZmljYXRpb24nOiAnbm90aWZpY2F0aW9uJywKICAnR01fb3BlbkluVGFiJzogJ29wZW5JblRhYicsCiAgJ0dNX3JlZ2lzdGVyTWVudUNvbW1hbmQnOiAncmVnaXN0ZXJNZW51Q29tbWFuZCcsCiAgJ0dNX3NldENsaXBib2FyZCc6ICdzZXRDbGlwYm9hcmQnLAogICdHTV9zZXRWYWx1ZSc6ICdzZXRWYWx1ZScsCiAgJ0dNX3htbGh0dHBSZXF1ZXN0JzogJ3htbEh0dHBSZXF1ZXN0JywKICAnR01fZ2V0UmVzb3VyY2VUZXh0JzogJ2dldFJlc291cmNlVGV4dCcsCn0pLmZvckVhY2goKFtvbGRLZXksIG5ld0tleV0pID0+IHsKICBsZXQgb2xkID0gdGhpc1tvbGRLZXldOwogIGlmIChvbGQgJiYgKHR5cGVvZiBHTVtuZXdLZXldID09ICd1bmRlZmluZWQnKSkgewogICAgR01bbmV3S2V5XSA9IGZ1bmN0aW9uKC4uLmFyZ3MpIHsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgcmVzb2x2ZShvbGQuYXBwbHkodGhpcywgYXJncykpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHJlamVjdChlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfTsKICB9Cn0pOwo=" 737 751 }, 738 752 { 739 753 "meta": { 740 - "name": "Bunpro:%20Helpful%20Events.js", 741 - "url": "https://greasyfork.org/scripts/370623-bunpro-helpful-events/code/Bunpro:%20Helpful%20Events.js?version=615700", 742 - "ts": 1607436649641, 743 - "mimetype": "text/javascript" 754 + "mimetype": "text/javascript", 755 + "name": "mutations.js", 756 + "ts": 1649167236560, 757 + "url": "https://greasyfork.org/scripts/28721-mutations/code/mutations.js?version=952601" 744 758 }, 745 - "source": "KGZ1bmN0aW9uKCkgewogICAgLy8gQWRkIGEgY3VzdG9tIGV2ZW50IGZvciB3aGVuIEJQIGNyZWF0ZXMgYSBuZXcgYm9keQogICAgdmFyIG5ld0JvZHkgPSBuZXcgRXZlbnQoJ25ldy1ib2R5Jyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJ2JvZHkgPiBoZWFkZXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KG5ld0JvZHkpO30pOwogICAgCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgZm9yIHdoZW4geW91IGdldCBhIG5ldyBpdGVtIGluIHJldmlld3MKICAgIHZhciBuZXdSZXZpZXdJdGVtID0gbmV3IEV2ZW50KCduZXctcmV2aWV3LWl0ZW0nKTsKICAgIHdhaXRGb3JLZXlFbGVtZW50cygnLmxldmVsX2xlc3Nvbl9pbmZvIGEnLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KG5ld1Jldmlld0l0ZW0pO30pOwogICAgCiAgICAvLyBBZGQgYSBjdXN0b20gZXZlbnQgd2hlbiB5b3UgZ28gdG8gc3R1ZHkgb3IgY3JhbSBwYWdlCiAgICB2YXIgcXVpelBhZ2UgPSBuZXcgRXZlbnQoJ3F1aXotcGFnZScpOwogICAgd2FpdEZvcktleUVsZW1lbnRzKCcjc2hvdy1ncmFtbWFyJywgZnVuY3Rpb24oZSkge2ZpcmVFdmVudChxdWl6UGFnZSk7fSk7CiAgICAKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCB3aGVuIHlvdSBnbyB0byBzdHVkeSBwYWdlCiAgICB2YXIgc3R1ZHlQYWdlID0gbmV3IEV2ZW50KCdzdHVkeS1wYWdlJyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJyNzdHVkeS1wYWdlICNzaG93LWdyYW1tYXInLCBmdW5jdGlvbihlKSB7ZmlyZUV2ZW50KHN0dWR5UGFnZSk7fSk7CiAgICAKICAgIC8vIEFkZCBhIGN1c3RvbSBldmVudCB3aGVuIHlvdSBnbyB0byBjcmFtIHBhZ2UKICAgIHZhciBjcmFtUGFnZSA9IG5ldyBFdmVudCgnY3JhbS1wYWdlJyk7CiAgICB3YWl0Rm9yS2V5RWxlbWVudHMoJyNjcmFtLXBhZ2UgI3Nob3ctZ3JhbW1hcicsIGZ1bmN0aW9uKGUpIHtmaXJlRXZlbnQoY3JhbVBhZ2UpO30pOwogICAgCiAgICAvLyBGaXJlcyB0aGUgZ2l2ZW4gZXZlbnQgb24gdGhlIEhUTUwgZWxlbWVudAogICAgZnVuY3Rpb24gZmlyZUV2ZW50KGV2ZW50KSB7CiAgICAJCXZhciByZXRyeUludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ0hUTUwnKVswXS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckludGVydmFsKHJldHJ5SW50ZXJ2YWwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAxMDApOwogICAgfQp9KSgpOw==" 759 + "source": "LyogR2l0SHViIG11dGF0aW9ucyBvYnNlcnZlciBsaWJyYXJ5IHNjcmlwdCB2MC40LjQKICogRGV0ZWN0IGNoYW5nZXMgdG8gdmFyaW91cyBlbGVtZW50cyBhbmQgdHJpZ2dlciBhbiBldmVudAogKiBUaGlzIHNjcmlwdCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIGEgbGlicmFyeSBmb3IgR2l0SHViLWJhc2VkIHVzZXJzY3JpcHRzCiAqIENvcHlyaWdodCDCqSAyMDIxIFJvYiBHYXJyaXNvbgogKiBMaWNlbnNlOiBNSVQKICovCigoKSA9PiB7CgkidXNlIHN0cmljdCI7CgoJLy8gcHJlZml4IGZvciBldmVudCAmIGRvY3VtZW50IGJvZHkgY2xhc3MgbmFtZSwgZS5nLiAiZ2htbzpjb250YWluZXIiCgljb25zdCBwcmVmaXggPSAiZ2htbyIsCgkJZGlzYWJsZUF0dHIgPSBgZGF0YS0ke3ByZWZpeH0tZGlzYWJsZWAsCgkJZGVib3VuY2VJbnRlcnZhbCA9IDIwMCwKCQl0YXJnZXRzID0gewoJCQkvLyBwamF4IGNvbnRhaW5lciAoY292ZXJzIGdlbmVyYWwsIHJlcG8gJiBnaXN0cykKCQkJLy8gLm5ld3MgPSBuZXdzZmVlZCBsYXlvdXQKCQkJLy8gLnJlcG9zaXRvcnktY29udGVudCA9IGZpbGUgY29kZSAoY29kZSBmb2xkaW5nKQoJCQkiW2RhdGEtcGpheC1jb250YWluZXJdLCAubmV3cywgLnJlcG9zaXRvcnktY29udGVudCI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogImNvbnRhaW5lciIKCQkJfSwKCQkJLy8gY29tbWVudCBwcmV2aWV3IGFjdGl2ZQoJCQkiLmpzLXByZXZpZXctYm9keSI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogInByZXZpZXciCgkJCX0sCgkJCS8vIC5qcy1kaXNjdXNzaW9uID0gd3JhcHBlciBmb3IgcHJvZ3Jlc3NpdmVseSBsb2FkZWQgY29tbWVudHM7CgkJCS8vICIjIGl0ZW1zIG5vdCBzaG93biIgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9naXRodWIvaXNzdWVzLzE4CgkJCS8vIC5kaXNjdXNzaW9uLWl0ZW0gPSBpc3N1ZSBzdGF0dXMgY2hhbmdlZCAoZ2l0aHViLWlzc3VlLXNob3ctc3RhdHVzKQoJCQkvLyAjcHJvZ3Jlc3NpdmUtdGltZWxpbmUtaXRlbS1jb250YWluZXIgPSBsb2FkIGhpZGRlbiBpdGVtcyAob2xkPykKCQkJLy8gI2pzLXByb2dyZXNzaXZlLXRpbWVsaW5lLWl0ZW0tY29udGFpbmVyID0gbG9hZCBoaWRkZW4gaXRlbXMKCQkJIi5qcy1kaXNjdXNzaW9uLCAuZGlzY3Vzc2lvbi1pdGVtLCAudG9vbGJhci1pdGVtLCAjcHJvZ3Jlc3NpdmUtdGltZWxpbmUtaXRlbS1jb250YWluZXIsICNqcy1wcm9ncmVzc2l2ZS10aW1lbGluZS1pdGVtLWNvbnRhaW5lciI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogImNvbW1lbnRzIgoJCQl9LAoJCQkvLyBwcm9ncmVzc2l2ZWx5IGxvYWRlZCBjb250ZW50IChkaWZmIGZpbGVzKQoJCQkiLmpzLWRpZmYtcHJvZ3Jlc3NpdmUtY29udGFpbmVyLCAuZGF0YS5ibG9iLXdyYXBwZXIsIC5qcy1kaWZmLWxvYWQtY29udGFpbmVyLCAuZGlmZi10YWJsZSB0Ym9keSI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogImRpZmYiCgkJCX0sCgkJCS8vIGlzc3Vlcy9wciBzaWRlYmFyICYgdGltZWxpbmUgc2VjdGlvbnM6IGUuZy4gZm9ybSBhY3Rpb25zLCBjb21taXQKCQkJLy8gcmVmZXJlbmNlcywgZGVwbG95bWVudCBzdGF0ZSAmIFBSIGNoZWNrcyBjb250YWluZXIKCQkJIi5qcy11cGRhdGFibGUtY29udGVudCwgLmpzLXVwZGF0YWJsZS1jb250ZW50LXByZXNlcnZlLXNjcm9sbC1wb3NpdGlvbiI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogInVwZGF0YWJsZSIKCQkJfSwKCQkJLy8gdXNlciBwcm9maWxlIG1lbnUgKGxvYWRzIG9uIGhvdmVyKQoJCQkiZGV0YWlscy1tZW51IjogewoJCQkJY291bnQ6IDAsCgkJCQluYW1lOiAibWVudSIKCQkJfQoJCX0sCgkJbGlzdCA9IE9iamVjdC5rZXlzKHRhcmdldHMpOwoKCWZ1bmN0aW9uIGZpcmVFdmVudHMoKSB7CgkJbGlzdC5mb3JFYWNoKHNlbGVjdG9yID0+IHsKCQkJaWYgKHRhcmdldHNbc2VsZWN0b3JdLmNvdW50ID4gMCkgewoJCQkJLy8gZXZlbnQgPT4gImdobW86Y29udGFpbmVyIiwgImdobW86Y29tbWVudHMiCgkJCQljb25zdCBldmVudCA9IG5ldyBFdmVudChwcmVmaXggKyAiOiIgKyB0YXJnZXRzW3NlbGVjdG9yXS5uYW1lKTsKCQkJCWRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOwoJCQl9CgkJCXRhcmdldHNbc2VsZWN0b3JdLmNvdW50ID0gMDsKCQl9KTsKCX0KCglmdW5jdGlvbiBpbml0KCkgewoJCS8vIHByZXZlbnQgZXJyb3Igd2hlbiBsaWJyYXJ5IGlzIGxvYWRlZCBhdCBkb2N1bWVudC1zdGFydCAmIG5vIGJvZHkgZXhpc3RzCgkJY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSIpOwoJCWxldCB0aW1lcjsKCQkvLyBwcmV2ZW50IHNjcmlwdCBmcm9tIGluc3RhbGxpbmcgbW9yZSB0aGFuIG9uY2UKCQlpZiAoY29udGFpbmVyICYmICFjb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKHByZWZpeCArICItZW5hYmxlZCIpKSB7CgkJCWNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHByZWZpeCArICItZW5hYmxlZCIpOwoJCQkvLyBib3VuZCB0byBkb2N1bWVudC5ib2R5Li4uIHRoaXMgbWF5IGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UKCQkJLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzkzMzIzNDAvMTQ1MzQ2CgkJCW5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7CgkJCQljbGVhclRpbWVvdXQodGltZXIpOwoJCQkJLyogZG9jdW1lbnQuYm9keSBhdHRyaWJ1dGUgdXNlZCB0byBkaXNhYmxlIHVwZGF0ZXM7IGl0ICpzaG91bGQgbm90KgoJCQkJICogYmUgdXNlZCByZWd1bGFybHkgYXMgbXVsdGlwbGUgc2NyaXB0cyBtYXkgZW5hYmxlIG9yIGRpc2FibGUgdGhlCgkJCQkgKiBvYnNlcnZlcnMgYXQgaW5hcHByb3ByaWF0ZSB0aW1lcy4gSXQgaXMgYmVzdCB0aGF0IGVhY2ggc2NyaXB0IGhhbmRsZXMKCQkJCSAqIHRoZSBtdXRhdGlvbiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbGlicmFyeSBvbiBpdHMgb3duCgkJCQkgKi8KCQkJCWlmIChjb250YWluZXIuZ2V0QXR0cmlidXRlKGRpc2FibGVBdHRyKSkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCWxldCBtaW5keCwgdGFyZ2V0LCBsaW5keCwKCQkJCQlsbGVuID0gbGlzdC5sZW5ndGgsCgkJCQkJbWxlbiA9IG11dGF0aW9ucy5sZW5ndGg7CgkJCQkvLyBhdm9pZGluZyB1c2Ugb2YgZm9yRWFjaCBsb29wcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucwoJCQkJZm9yIChtaW5keCA9IDA7IG1pbmR4IDwgbWxlbjsgbWluZHgrKykgewoJCQkJCXRhcmdldCA9IG11dGF0aW9uc1ttaW5keF0udGFyZ2V0OwoJCQkJCWlmICh0YXJnZXQpIHsKCQkJCQkJZm9yIChsaW5keCA9IDA7IGxpbmR4IDwgbGxlbjsgbGluZHgrKykgewoJCQkJCQkJaWYgKHRhcmdldC5tYXRjaGVzKGxpc3RbbGluZHhdKSkgewoJCQkJCQkJCXRhcmdldHNbbGlzdFtsaW5keF1dLmNvdW50Kys7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJZmlyZUV2ZW50cygpOwoJCQkJCX0sIGRlYm91bmNlSW50ZXJ2YWwpOwoJCQkJfQoJCQl9KS5vYnNlcnZlKGNvbnRhaW5lciwgewoJCQkJY2hpbGRMaXN0OiB0cnVlLAoJCQkJc3VidHJlZTogdHJ1ZQoJCQl9KTsKCQl9Cgl9CgoJaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCAoKSA9PiBpbml0KTsKCX0gZWxzZSB7CgkJaW5pdCgpOwoJfQoKfSkoKTsK" 760 + }, 761 + { 762 + "meta": { 763 + "mimetype": "text/javascript", 764 + "name": "utilsjs.js", 765 + "ts": 1649167236928, 766 + "url": "https://greasyfork.org/scripts/398877-utils-js/code/utilsjs.js?version=952600" 767 + }, 768 + "source": "LyogR2l0SHViIHVzZXJzY3JpcHQgdXRpbGl0aWVzIHYwLjIuMAogKiBDb3B5cmlnaHQgwqkgMjAyMSBSb2IgR2Fycmlzb24KICogTGljZW5zZTogTUlUCiAqLwovKiBleHBvcnRlZAogKiAkICQkCiAqIGFkZENsYXNzIHJlbW92ZUNsYXNzIHRvZ2dsZUNsYXNzCiAqIHJlbW92ZUVscyByZW1vdmVTZWxlY3Rpb24KICogb24gb2ZmIG1ha2UKICogZGVib3VuY2UKICovCiJ1c2Ugc3RyaWN0IjsKCmNvbnN0IFJFR0VYID0gewoJV0hJVEVTUEFDRTogL1xzKy8sCglOQU1FU1BBQ0U6IC9bLjpdLywKCUNPTU1BOiAvXHMqLFxzKi8KfTsKCi8qIERPTSB1dGlsaXRpZXMgKi8KLyoqCiAqIEZpbmQgJiByZXR1cm4gYSBzaW5nbGUgRE9NIG5vZGUKICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIC0gQ1NTIHNlbGVjdG9yIHN0cmluZwogKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIERPTSBub2RlIHRvIHN0YXJ0IHRoZSBxdWVyeSAoZGVmYXVsdHMgdG8gZG9jdW1lbnQpCiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudHxudWxsfQogKi8KY29uc3QgJCA9IChzZWxlY3RvciwgZWwpID0+IChlbCB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CgovKioKICogRmluZCAmIHJldHVybiBtdWx0aXBsZSBET00gbm9kZXMKICogQHBhcmFtIHtTdHJpbmd9IHNlbGVjdG9yIC0gQ1NTIHNlbGVjdG9yIHN0cmluZwogKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCAtIERPTSBub2RlIHRvIHN0YXJ0IHRoZSBxdWVyeSAoZGVmYXVsdHMgdG8gZG9jdW1lbnQpIAogKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX0KICovCmNvbnN0ICQkID0gKHNlbGVjdG9yLCBlbCkgPT4gWy4uLihlbCB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildOwoKLyoqCiAqIENvbW1vbiBmdW5jdGlvbnMKICovCmNvbnN0IF8gPSB7fTsKLyoqCiogUmV0dXJuIGFuIGFycmF5IG9mIGVsZW1lbnRzCiogQHBhcmFtIHtIVE1MRWxlbWVudHxIVE1MRWxlbWVudFtdfE5vZGVMaXN0fSBlbGVtZW50cyAKKiBAcmV0dXJucyB7SFRNTEVsZW1lbnRbXX0KKi8KXy5jcmVhdGVFbGVtZW50QXJyYXkgPSBlbGVtZW50cyA9PiB7CglpZiAoQXJyYXkuaXNBcnJheShlbGVtZW50cykpIHsKCQlyZXR1cm4gZWxlbWVudHM7Cgl9CglyZXR1cm4gZWxlbWVudHMgaW5zdGFuY2VvZiBOb2RlTGlzdCA/IFsuLi5lbGVtZW50c10gOiBbZWxlbWVudHNdOwp9OwovKioKKiBDb21tb24gZXZlbnQgbGlzdGVuZXIgY29kZQoqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIC0gImFkZCIgb3IgInJlbW92ZSIgZXZlbnQgbGlzdGVuZXIKKiBAcGFyYW0ge0hUTUxFbGVtZW50W119IGVscyAtIERPTSBub2RlIGFycmF5IHRoYXQgbmVlZCBsaXN0ZW5lcnMKKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIEV2ZW50IG5hbWUsIGUuZy4gImNsaWNrIiwgIm1vdXNlb3ZlciIsIGV0YwoqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgLSBFdmVudCBjYWxsYmFjawoqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gRXZlbnQgbGlzdGVuZXIgb3B0aW9ucyBvciB1c2VDYXB0dXJlIC0gc2VlCiogICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRXZlbnRUYXJnZXQvYWRkRXZlbnRMaXN0ZW5lciNwYXJhbWV0ZXJzCiovCl8uZXZlbnRMaXN0ZW5lciA9ICh0eXBlLCBlbHMsIG5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpID0+IHsKCWNvbnN0IGV2ZW50cyA9IG5hbWUuc3BsaXQoUkVHRVguV0hJVEVTUEFDRSk7CglfLmNyZWF0ZUVsZW1lbnRBcnJheShlbHMpLmZvckVhY2goZWwgPT4gewoJCWV2ZW50cy5mb3JFYWNoKGV2ID0+IHsKCQkJZWw/LltgJHt0eXBlfUV2ZW50TGlzdGVuZXJgXShldiwgaGFuZGxlciwgb3B0aW9ucyk7CgkJfSk7Cgl9KTsKfTsKLyoqCiogQ3JlYXRlIGFuIGFycmF5IG9mIGNsYXNzZXMvZXZlbnQgdHlwZXMgZnJvbSBhIHNwYWNlIG9yIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmcKKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NlcyAtIHNwYWNlIG9yIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgb3IgZXZlbnRzCiogQHJldHVybnMge1N0cmluZ1tdfQoqLwpfLmdldENsYXNzZXMgPSBjbGFzc2VzID0+IHsKCWlmIChBcnJheS5pc0FycmF5KGNsYXNzZXMpKSB7CgkJcmV0dXJuIGNsYXNzZXM7Cgl9Cgljb25zdCBuYW1lcyA9IGNsYXNzZXMudG9TdHJpbmcoKTsKCXJldHVybiBuYW1lcy5pbmNsdWRlcygiLCIpID8gbmFtZXMuc3BsaXQoUkVHRVguQ09NTUEpIDogW25hbWVzXTsKfTsKCi8qKgogKiBBZGQgY2xhc3MgbmFtZShzKSB0byBvbmUgb3IgbW9yZSBlbGVtZW50cwogKiBAcGFyYW0ge0hUTUxFbGVtZW50c1tdfE5vZGVsaXN0fEhUTUxFbGVtZW50fE5vZGV9IGVsZW1lbnRzIAogKiBAcGFyYW0ge3N0cmluZ3xhcnJheX0gY2xhc3NlcyAtIGNsYXNzIG5hbWUocykgdG8gYWRkOyBzdHJpbmcgY2FuIGNvbnRhaW4gYQogKiAgY29tbWEgc2VwYXJhdGVkIGxpc3QKICovCmNvbnN0IGFkZENsYXNzID0gKGVsZW1lbnRzLCBjbGFzc2VzKSA9PiB7Cgljb25zdCBjbGFzc05hbWVzID0gXy5nZXRDbGFzc2VzKGNsYXNzZXMpOwoJY29uc3QgZWxzID0gXy5jcmVhdGVFbGVtZW50QXJyYXkoZWxlbWVudHMpOwoJbGV0IGluZGV4ID0gZWxzLmxlbmd0aDsKCXdoaWxlIChpbmRleC0tKSB7CgkJZWxzW2luZGV4XT8uY2xhc3NMaXN0LmFkZCguLi5jbGFzc05hbWVzKTsKCX0KfTsKCi8qKgogKiBSZW1vdmUgY2xhc3MgbmFtZShzKSBmcm9tIG9uZSBvciBtb3JlIGVsZW1lbnRzCiAqIEBwYXJhbSB7SFRNTEVsZW1lbnRzW118Tm9kZUxpc3R8SFRNTEVsZW1lbnR8Tm9kZX0gZWxlbWVudHMKICogQHBhcmFtIHtzdHJpbmd8YXJyYXl9IGNsYXNzZXMgLSBjbGFzcyBuYW1lKHMpIHRvIGFkZDsgc3RyaW5nIGNhbiBjb250YWluIGEKICogIGNvbW1hIHNlcGFyYXRlZCBsaXN0CiAqLwpjb25zdCByZW1vdmVDbGFzcyA9IChlbGVtZW50cywgY2xhc3NlcykgPT4gewoJY29uc3QgY2xhc3NOYW1lcyA9IF8uZ2V0Q2xhc3NlcyhjbGFzc2VzKTsKCWNvbnN0IGVscyA9IF8uY3JlYXRlRWxlbWVudEFycmF5KGVsZW1lbnRzKTsKCWxldCBpbmRleCA9IGVscy5sZW5ndGg7Cgl3aGlsZSAoaW5kZXgtLSkgewoJCWVsc1tpbmRleF0/LmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3NOYW1lcyk7Cgl9Cn07CgovKioKICogVG9nZ2xlIGNsYXNzIG5hbWUgb2YgRE9NIGVsZW1lbnQocykKICogQHBhcmFtIHtIVE1MRWxlbWVudHxIVE1MRWxlbWVudFtdfE5vZGVMaXN0fSBlbHMgCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gY2xhc3MgbmFtZSB0byB0b2dnbGUgKHRvZ2dsZSBvbmx5IGFjY2VwdHMgb25lIG5hbWUpCiAqIEBwYXJhbSB7Ym9vbGVhbn0gZmxhZyAtIGZvcmNlIHRvZ2dsZTsgdHJ1ZSA9IGFkZCBjbGFzcywgZmFsc2UgPSByZW1vdmUgY2xhc3M7CiAqICBpZiB1bmRlZmluZWQsIHRoZSBjbGFzcyB3aWxsIGJlIHRvZ2dsZWQgYmFzZWQgb24gdGhlIGVsZW1lbnQncyBjbGFzcyBuYW1lCiAqLwovLyBmbGFnID0gdHJ1ZSwgdGhlbiBhZGQgY2xhc3MKY29uc3QgdG9nZ2xlQ2xhc3MgPSAoZWxlbWVudHMsIGNsYXNzTmFtZSwgZmxhZykgPT4gewoJY29uc3QgZWxzID0gXy5jcmVhdGVFbGVtZW50QXJyYXkoZWxlbWVudHMpOwoJbGV0IGluZGV4ID0gZWxtcy5sZW5ndGg7Cgl3aGlsZSAoaW5kZXgtLSkgewoJCWVsc1tpbmRleF0/LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBmbGFnKTsKCX0KfTsKCi8qKgogKiBSZW1vdmUgRE9NIG5vZGVzCiAqIEBwYXJhbSB7U3RyaW5nfSBzZWxlY3RvciAtIENTUyBzZWxlY3RvciBzdHJpbmcKICogQHBhcmFtIHtIVE1MRWxlbWVudHx1bmRlZmluZWR9IGVsIC0gcGFyZW50IERPTSBub2RlIChkZWZhdWx0cyB0byBkb2N1bWVudCkKICovCmNvbnN0IHJlbW92ZUVscyA9IChzZWxlY3RvciwgZWwpID0+IHsKCWxldCBlbHMgPSAkJChzZWxlY3RvciwgZWwpOwoJbGV0IGluZGV4ID0gZWxzLmxlbmd0aDsKCXdoaWxlIChpbmRleC0tKSB7CgkJZWxzW2luZGV4XS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsc1tpbmRleF0pOwoJfQp9OwoKLyoqCiAqIFJlbW92ZSB0ZXh0IHNlbGVjdGlvbgogKi8KY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gKCkgPT4gewoJLy8gcmVtb3ZlIHRleHQgc2VsZWN0aW9uIC0gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMxNzEzNDgvMTQ1MzQ2Cgljb25zdCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uCgkJPyB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkKCQk6IGRvY3VtZW50LnNlbGVjdGlvbjsKCWlmIChzZWwpIHsKCQlpZiAoc2VsLnJlbW92ZUFsbFJhbmdlcykgewoJCQlzZWwucmVtb3ZlQWxsUmFuZ2VzKCk7CgkJfSBlbHNlIGlmIChzZWwuZW1wdHkpIHsKCQkJc2VsLmVtcHR5KCk7CgkJfQoJfQp9OwoKLyoqCiAqIEFkZC9yZW1vdmUgZXZlbnQgbGlzdGVuZXIKICogQHBhcmFtIHtIVE1MRWxlbWVudHxIVE1MRWxlbWVudFtdfE5vZGVMaXN0fSBlbHMKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBldmVudCBuYW1lKHMpIHRvIGJpbmQsIGUuZy4gIm1vdXNldXAgbW91c2Vkb3duIjsgYWxzbwogKiAgIGFjY3BldHMgYSBjb21tYSBzZXBhcmF0ZWQgc3RyaW5nLCBlLmcuICJtb3VzZXVwLCBtb3VzZWRvd24iCiAqIEBwYXJhbSB7ZnVuY3Rpb259IGhhbmRsZXIgLSBldmVudCBoYW5kbGVyCiAqIEBwYXJhbSB7b3B0aW9uc30gZXZlbnRMaXN0ZW5lciBvcHRpb25zCiAqLwpjb25zdCBvbiA9IChlbHMsIG5hbWUgPSAiIiwgaGFuZGxlciwgb3B0aW9ucykgPT4gewoJXy5ldmVudExpc3RlbmVyKCJhZGQiLCBlbHMsIG5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpOwp9Owpjb25zdCBvZmYgPSAoZWxzLCBuYW1lID0gIiIsIGhhbmRsZXIsIG9wdGlvbnMpID0+IHsKCV8uZXZlbnRMaXN0ZW5lcigicmVtb3ZlIiwgZWxzLCBuYW1lLCBoYW5kbGVyLCBvcHRpb25zKTsKfQoKLyoqCiAqICoqKiogSGVscGVycyAqKioqCiAqLwovKioKICogRGVib3VuY2UKICogQHBhcmFtIHtGdW5jdGlvbn0gZnhuIC0gY2FsbGJhY2sgZXhlY3V0ZWQgYWZ0ZXIgZGVib3VuY2UKICogQHBhcmFtIHtOdW1iZXJ9IHRpbWUgLSB0aW1lIChpbiBtcykgdG8gZGVsYXkKICogQHJldHVybnMge0Z1bmN0aW9ufSBkZWJvdW5jZWQgZnVuY3Rpb24KICovCmNvbnN0IGRlYm91bmNlID0gKGZ4biwgdGltZSA9IDUwMCkgPT4gewoJbGV0IHRpbWVyOwoJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCWNsZWFyVGltZW91dCh0aW1lcik7CgkJdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKCQkJZnhuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgkJfSwgdGltZSk7Cgl9Cn0KCi8qKgogKiBAdHlwZWRlZiBVdGlsc35tYWtlT3B0aW9ucwogKiBAdHlwZSB7b2JqZWN0fQogKiBAcHJvcGVydHkge3N0cmluZ30gZWwgLSBIVE1MIGVsZW1lbnQgdGFnLCBlLmcuICJkaXYiIChkZWZhdWx0KQogKiBAcHJvcGVydHkge3N0cmluZ30gYXBwZW5kVG8gLSBzZWxlY3RvciBvZiB0YXJnZXQgZWxlbWVudCB0byBhcHBlbmQgbWVudQogKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3NOYW1lIC0gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBlbGVtZW50CiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBhdHRycyAtIEhUTUwgYXR0cmlidXRlcyAoYXMga2V5L3ZhbHVlIHBhcmllcykgdG8gc2V0CiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSB0ZXh0IC0gc3RyaW5nIGFkZGVkIHRvIGVsIHVzaW5nIHRleHRDb250ZW50CiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBodG1sIC0gaHRtbCB0byBiZSBhZGRlZCB1c2luZyBgaW5uZXJIVE1MYCAob3ZlcnJpZGVzIGB0ZXh0YCkKICogQHByb3BlcnR5IHthcnJheX0gY2hpbGRyZW4gLSBhcnJheSBvZiBlbGVtZW50cyB0byBhcHBlbmQgdG8gdGhlIGNyZWF0ZWQgZWxlbWVudAogKi8KLyoqCiAqIENyZWF0ZSBhIERPTSBlbGVtZW50CiAqIEBwYXJhbSB7VXRpbHN+bWFrZU9wdGlvbnN9CiAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH0gKG1heSBiZSBhbHJlYWR5IGluc2VydGVkIGluIHRoZSBET00pCiAqIEBleGFtcGxlCgltYWtlKHsgZWw6ICd1bCcsIGNsYXNzTmFtZTogJ3dyYXBwZXInLCBhcHBlbmRUbzogJ2JvZHknIH0sIFsKCQltYWtlKHsgZWw6ICdsaScsIHRleHQ6ICdpdGVtICMxJyB9KSwKCQltYWtlKHsgZWw6ICdsaScsIHRleHQ6ICdpdGVtICMyJyB9KQoJXSk7CiAqLwpjb25zdCBtYWtlID0gKG9iaiwgY2hpbGRyZW4pID0+IHsKCWNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChvYmouZWwgfHwgImRpdiIpOwoJY29uc3QgeHJlZiA9IHsKCQljbGFzc05hbWU6ICJjbGFzc05hbWUiLAoJCWlkOiAiaWQiLAoJCXRleHQ6ICJ0ZXh0Q29udGVudCIsCgkJaHRtbDogImlubmVySFRNTCIsIC8vIG92ZXJyaWRlcyB0ZXh0IHNldHRpbmcKCX07CglPYmplY3Qua2V5cyh4cmVmKS5mb3JFYWNoKGtleSA9PiB7CgkJaWYgKG9ialtrZXldKSB7CgkJCWVsW3hyZWZba2V5XV0gPSBvYmpba2V5XTsKCQl9Cgl9KQoJaWYgKG9iai5hdHRycykgewoJCWZvciAobGV0IGtleSBpbiBvYmouYXR0cnMpIHsKCQkJaWYgKG9iai5hdHRycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CgkJCQllbC5zZXRBdHRyaWJ1dGUoa2V5LCBvYmouYXR0cnNba2V5XSk7CgkJCX0KCQl9Cgl9CglpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikgJiYgY2hpbGRyZW4ubGVuZ3RoKSB7CgkJY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBlbC5hcHBlbmRDaGlsZChjaGlsZCkpOwoJfQoJaWYgKG9iai5hcHBlbmRUbykgewoJCWNvbnN0IHdyYXAgPSB0eXBlb2Ygb2JqLmFwcGVuZFRvID09PSAic3RyaW5nIiA/ICQoZWwpIDogZWw7CgkJaWYgKHdyYXApIHsKCQkJd3JhcC5hcHBlbmRDaGlsZChlbCk7CgkJfQoJfQoJcmV0dXJuIGVsOwp9Cg==" 746 769 } 747 - ] 770 + ], 771 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIEdpdEh1YiBDb2RlIEZvbGRpbmcKLy8gQHZlcnNpb24gICAgIDEuMS40Ci8vIEBkZXNjcmlwdGlvbiBBIHVzZXJzY3JpcHQgdGhhdCBhZGRzIGNvZGUgZm9sZGluZyB0byBHaXRIdWIgZmlsZXMKLy8gQGxpY2Vuc2UgICAgIE1JVAovLyBAYXV0aG9yICAgICAgUm9iIEdhcnJpc29uCi8vIEBuYW1lc3BhY2UgICBodHRwczovL2dpdGh1Yi5jb20vTW90dGllCi8vIEBpbmNsdWRlICAgICBodHRwczovL2dpdGh1Yi5jb20vKgovLyBAaW5jbHVkZSAgICAgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vKgovLyBAcnVuLWF0ICAgICAgZG9jdW1lbnQtaWRsZQovLyBAZ3JhbnQgICAgICAgR00uYWRkU3R5bGUKLy8gQGdyYW50ICAgICAgIEdNX2FkZFN0eWxlCi8vIEByZXF1aXJlICAgICBodHRwczovL2dyZWFzZW1vbmtleS5naXRodWIuaW8vZ200LXBvbHlmaWxsL2dtNC1wb2x5ZmlsbC5qcz91cGRhdGVkPTIwMTgwMTAzCi8vIEByZXF1aXJlICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMjg3MjEtbXV0YXRpb25zL2NvZGUvbXV0YXRpb25zLmpzP3ZlcnNpb249OTUyNjAxCi8vIEByZXF1aXJlICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMzk4ODc3LXV0aWxzLWpzL2NvZGUvdXRpbHNqcy5qcz92ZXJzaW9uPTk1MjYwMAovLyBAaWNvbiAgICAgICAgaHR0cHM6Ly9naXRodWIuZ2l0aHViYXNzZXRzLmNvbS9waW5uZWQtb2N0b2NhdC5zdmcKLy8gQHVwZGF0ZVVSTCAgIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Nb3R0aWUvR2l0aHViLXVzZXJzY3JpcHRzL21hc3Rlci9naXRodWItY29kZS1mb2xkaW5nLnVzZXIuanMKLy8gQGRvd25sb2FkVVJMIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Nb3R0aWUvR2l0aHViLXVzZXJzY3JpcHRzL21hc3Rlci9naXRodWItY29kZS1mb2xkaW5nLnVzZXIuanMKLy8gQHN1cHBvcnRVUkwgIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb3R0aWUvR2l0SHViLXVzZXJzY3JpcHRzL2lzc3VlcwovLyA9PS9Vc2VyU2NyaXB0PT0KLyogZ2xvYmFsICQgJCQgb24gKi8KLyoqCiAqIFRoaXMgdXNlcnNjcmlwdCBoYXMgYmVlbiBoZWF2aWx5IG1vZGlmaWVkIGZyb20gdGhlICJnaXRodWItY29kZS1mb2xkaW5nIgogKiBDaHJvbWUgZXh0ZW5zaW9uIENvcHlyaWdodCAyMDE2IGJ5IE5vYW0gTHVzdGlnZXI7IHVuZGVyIGFuIE1JVCBsaWNlbnNlCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2FtMzEyNy9naXRodWItY29kZS1mb2xkaW5nCiAqLwooKCkgPT4gewoJInVzZSBzdHJpY3QiOwoKCUdNLmFkZFN0eWxlKGAKCQl0ZC5ibG9iLWNvZGUuYmxvYi1jb2RlLWlubmVyIHsgcG9zaXRpb246cmVsYXRpdmU7IHBhZGRpbmctbGVmdDoxMHB4OyB9CgkJLmdoY2YtY29sbGFwc2VyIHsgcG9zaXRpb246YWJzb2x1dGU7IGxlZnQ6MnB4OyB3aWR0aDoxMHB4OyBjdXJzb3I6cG9pbnRlcjsgfQoJCS5naGNmLWNvbGxhcHNlcjphZnRlciB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCQkJY29udGVudDoiXHUyNWJjIjsgb3BhY2l0eTouNTsgdHJhbnNpdGlvbjouMTVzOyB9CgkJLmdoY2YtY29sbGFwc2VyOmhvdmVyOmFmdGVyIHsgb3BhY2l0eToxOyB9CgkJLmdoY2YtY29sbGFwc2VkLmdoY2YtY29sbGFwc2VyOmFmdGVyIHsgdHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpOwoJCQlvcGFjaXR5Oi44OyB9CgkJLmdoY2YtaGlkZGVuLWxpbmUgeyBkaXNwbGF5Om5vbmU7IH0KCQkuZ2hjZi1lbGxpcHNpcyB7IHBhZGRpbmc6MXB4IDJweDsgbWFyZ2luLWxlZnQ6MnB4OyBjdXJzb3I6cG9pbnRlcjsKCQkJYmFja2dyb3VuZDpyZ2JhKDI1NSwyMzUsNTksLjQpOyBwb3NpdGlvbjpyZWxhdGl2ZTsgei1pbmRleDoxOyB9CgkJLmdoY2YtZWxsaXBzaXM6aG92ZXIgeyBiYWNrZ3JvdW5kOnJnYmEoMjU1LDIzNSw1OSwuNyk7IH0KCWApOwoKCWNvbnN0IGJsb2NrcyA9IHt9OwoJY29uc3QgZWxsaXBzaXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7Cgljb25zdCB0cmlhbmdsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKCgl0cmlhbmdsZS5jbGFzc05hbWUgPSAiZ2hjZi1jb2xsYXBzZXIiOwoJZWxsaXBzaXMuY2xhc3NOYW1lID0gInBsLXNtaSBnaGNmLWVsbGlwc2lzIjsKCWVsbGlwc2lzLmlubmVySFRNTCA9ICImaGVsbGlwOyI7CgoJZnVuY3Rpb24gY291bnRJbml0aWFsV2hpdGVTcGFjZShhcnIpIHsKCQljb25zdCBnZXRXaGl0ZVNwYWNlSW5kZXggPSBpID0+IHsKCQkJaWYgKGFycltpXSAhPT0gIiAiICYmIGFycltpXSAhPT0gIlx0IiAmJiBhcnJbaV0gIT09ICJceGEwIikgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQkJcmV0dXJuIGdldFdoaXRlU3BhY2VJbmRleCgrK2kpOwoJCX07CgkJcmV0dXJuIGdldFdoaXRlU3BhY2VJbmRleCgwKTsKCX0KCglmdW5jdGlvbiBnZXRQcmV2aW91c1NwYWNlcyhtYXAsIGxpbmVOdW0pIHsKCQlsZXQgcHJldiA9IG1hcC5nZXQobGluZU51bSAtIDEpOwoJCXJldHVybiBwcmV2ID09PSAtMQoJCQk/IGdldFByZXZpb3VzU3BhY2VzKG1hcCwgbGluZU51bSAtIDEpCgkJCTogewoJCQkJbGluZU51bTogbGluZU51bSAtIDEsCgkJCQljb3VudDogcHJldgoJCQl9OwoJfQoKCWZ1bmN0aW9uIGdldExpbmVOdW1iZXIoZWwpIHsKCQlsZXQgZWxtID0gZWwuY2xvc2VzdCgidHIiKTsKCQlpZiAoZWxtKSB7CgkJCWVsbSA9IGVsbS5xdWVyeVNlbGVjdG9yKCJbZGF0YS1saW5lLW51bWJlcl0iKTsKCQkJcmV0dXJuIGVsbSA/IHBhcnNlSW50KGVsbS5kYXRhc2V0LmxpbmVOdW1iZXIsIDEwKSA6ICIiOwoJCX0KCQlyZXR1cm4gIiI7Cgl9CgoJZnVuY3Rpb24gZ2V0Q29kZUxpbmVzKGNvZGVCbG9jaykgewoJCXJldHVybiAkJCgiLmJsb2ItY29kZS1pbm5lciIsIGNvZGVCbG9jayk7Cgl9CgoJZnVuY3Rpb24gdG9nZ2xlQ29kZSh7IGFjdGlvbiwgY29kZUJsb2NrLCBpbmRleCwgZGVwdGggfSkgewoJCWxldCBlbHMsIGxpbmVOdW1zOwoJCWNvbnN0IGNvZGVMaW5lcyA9IGdldENvZGVMaW5lcyhjb2RlQmxvY2spIHx8IFtdOwoJCWNvbnN0IHBhaXJzID0gYmxvY2tzW2NvZGVCbG9jay5kYXRhc2V0LmJsb2NrSW5kZXhdOwoJCWlmICghcGFpcnMgfHwgY29kZUxpbmVzLmxlbmd0aCA9PT0gMCkgewoJCQlyZXR1cm47CgkJfQoJCS8vIGRlcHRoIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBzcGVjaWZpYyBkZXB0aCBudW1iZXIgdG8gdG9nZ2xlCgkJaWYgKGRlcHRoKSB7CgkJCWVscyA9ICQkKGAuZ2hjZi1jb2xsYXBzZXJbZGF0YS1kZXB0aD0iJHtkZXB0aH0iXWAsIGNvZGVCbG9jayk7CgkJCWxpbmVOdW1zID0gZWxzLm1hcChlbCA9PiB7CgkJCQllbC5jbGFzc0xpc3QudG9nZ2xlKCJnaGNmLWNvbGxhcHNlZCIsIGFjdGlvbiA9PT0gImhpZGUiKTsKCQkJCXJldHVybiBnZXRMaW5lTnVtYmVyKGVsKTsKCQkJfSk7CgkJfSBlbHNlIHsKCQkJbGluZU51bXMgPSBbaW5kZXhdOwoJCX0KCgkJaWYgKGFjdGlvbiA9PT0gImhpZGUiKSB7CgkJCWxpbmVOdW1zLmZvckVhY2goc3RhcnQgPT4gewoJCQkJbGV0IGVsbTsKCQkJCWxldCBlbmQgPSBwYWlycy5nZXQoc3RhcnQgLSAxKTsKCQkJCWNvZGVMaW5lcy5zbGljZShzdGFydCwgZW5kKS5mb3JFYWNoKGVsID0+IHsKCQkJCQllbG0gPSBlbC5jbG9zZXN0KCJ0ciIpOwoJCQkJCWlmIChlbG0pIHsKCQkJCQkJZWxtLmNsYXNzTGlzdC5hZGQoImdoY2YtaGlkZGVuLWxpbmUiKTsKCQkJCQl9CgkJCQl9KTsKCQkJCWlmICghJCgiLmdoY2YtZWxsaXBzaXMiLCBjb2RlTGluZXNbc3RhcnQgLSAxXSkpIHsKCQkJCQllbG0gPSAkKCIuZ2hjZi1jb2xsYXBzZXIiLCBjb2RlTGluZXNbc3RhcnQgLSAxXSk7CgkJCQkJZWxtLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKAoJCQkJCQllbGxpcHNpcy5jbG9uZU5vZGUodHJ1ZSksCgkJCQkJCW51bGwKCQkJCQkpOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgaWYgKGFjdGlvbiA9PT0gInNob3ciKSB7CgkJCWxpbmVOdW1zLmZvckVhY2goc3RhcnQgPT4gewoJCQkJbGV0IGVuZCA9IHBhaXJzLmdldChzdGFydCAtIDEpOwoJCQkJY29kZUxpbmVzLnNsaWNlKHN0YXJ0LCBlbmQpLmZvckVhY2goZWwgPT4gewoJCQkJCWxldCBlbG0gPSBlbC5jbG9zZXN0KCJ0ciIpOwoJCQkJCWlmIChlbG0pIHsKCQkJCQkJZWxtLmNsYXNzTGlzdC5yZW1vdmUoImdoY2YtaGlkZGVuLWxpbmUiKTsKCQkJCQkJcmVtb3ZlRWxzKCIuZ2hjZi1lbGxpcHNpcyIsIGVsbSk7CgkJCQkJfQoJCQkJCWVsbSA9ICQoIi5naGNmLWNvbGxhcHNlZCIsIGVsbSk7CgkJCQkJaWYgKGVsbSkgewoJCQkJCQllbG0uY2xhc3NMaXN0LnJlbW92ZSgiZ2hjZi1jb2xsYXBzZWQiKTsKCQkJCQl9CgkJCQl9KTsKCQkJCXJlbW92ZUVscygiLmdoY2YtZWxsaXBzaXMiLCBjb2RlTGluZXNbc3RhcnQgLSAxXSk7CgkJCX0pOwoJCX0KCQkvLyBzaGlmdCBlbmRzIHVwIHNlbGVjdGluZyB0ZXh0IG9uIHRoZSBwYWdlLCBzbyBjbGVhciBpdAoJCWlmIChsaW5lTnVtcy5sZW5ndGggPiAxKSB7CgkJCXJlbW92ZVNlbGVjdGlvbigpOwoJCX0KCX0KCglmdW5jdGlvbiBhZGRCaW5kaW5ncygpIHsKCQlvbihkb2N1bWVudCwgImNsaWNrIiwgZXZlbnQgPT4gewoJCQlsZXQgaW5kZXgsIGVsbSwgaXNDb2xsYXBzZWQ7CgkJCWNvbnN0IGVsID0gZXZlbnQudGFyZ2V0OwoJCQljb25zdCBjb2RlQmxvY2sgPSBlbC5jbG9zZXN0KCIuaGlnaGxpZ2h0Iik7CgoJCQkvLyBjbGljayBvbiBjb2xsYXBzZXIKCQkJaWYgKGVsICYmIGVsLmNsYXNzTGlzdC5jb250YWlucygiZ2hjZi1jb2xsYXBzZXIiKSkgewoJCQkJaXNDb2xsYXBzZWQgPSBlbC5jbGFzc0xpc3QuY29udGFpbnMoImdoY2YtY29sbGFwc2VkIik7CgkJCQlpbmRleCA9IGdldExpbmVOdW1iZXIoZWwpOwoJCQkJLy8gU2hpZnQgKyBjbGljayB0byB0b2dnbGUgdGhlbSBhbGwKCQkJCWlmIChpbmRleCAmJiBldmVudC5nZXRNb2RpZmllclN0YXRlKCJTaGlmdCIpKSB7CgkJCQkJcmV0dXJuIHRvZ2dsZUNvZGUoewoJCQkJCQlhY3Rpb246IGlzQ29sbGFwc2VkID8gInNob3ciIDogImhpZGUiLAoJCQkJCQljb2RlQmxvY2ssCgkJCQkJCWluZGV4LAoJCQkJCQlkZXB0aDogZWwuZGF0YXNldC5kZXB0aAoJCQkJCX0pOwoJCQkJfQoJCQkJaWYgKGluZGV4KSB7CgkJCQkJaWYgKGlzQ29sbGFwc2VkKSB7CgkJCQkJCWVsLmNsYXNzTGlzdC5yZW1vdmUoImdoY2YtY29sbGFwc2VkIik7CgkJCQkJCXRvZ2dsZUNvZGUoeyBhY3Rpb246ICJzaG93IiwgY29kZUJsb2NrLCBpbmRleCB9KTsKCQkJCQl9IGVsc2UgewoJCQkJCQllbC5jbGFzc0xpc3QuYWRkKCJnaGNmLWNvbGxhcHNlZCIpOwoJCQkJCQl0b2dnbGVDb2RlKHsgYWN0aW9uOiAiaGlkZSIsIGNvZGVCbG9jaywgaW5kZXggfSk7CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBjbGljayBvbiBlbGxpcHNpcwoJCQlpZiAoZWwgJiYgZWwuY2xhc3NMaXN0LmNvbnRhaW5zKCJnaGNmLWVsbGlwc2lzIikpIHsKCQkJCWVsbSA9ICQoIi5naGNmLWNvbGxhcHNlZCIsIGVsLnBhcmVudE5vZGUpOwoJCQkJaWYgKGVsbSkgewoJCQkJCWVsbS5jbGFzc0xpc3QucmVtb3ZlKCJnaGNmLWNvbGxhcHNlZCIpOwoJCQkJfQoJCQkJaW5kZXggPSBnZXRMaW5lTnVtYmVyKGVsKTsKCQkJCWlmIChpbmRleCkgewoJCQkJCXRvZ2dsZUNvZGUoeyBhY3Rpb246ICJzaG93IiwgY29kZUJsb2NrLCBpbmRleCB9KTsKCQkJCX0KCQkJfQoJCX0pOwoJfQoKCWZ1bmN0aW9uIGFkZENvZGVGb2xkaW5nKCkgewoJCS8vIEtlZXAgLmZpbGUgaW4gY2FzZSBzb21lb25lIG5lZWRzIHRoaXMgdXNlcnNjcmlwdCBmb3IgR2l0SHViIEVudGVycHJpc2UKCQlpZiAoJCgiLmZpbGUgdGFibGUuaGlnaGxpZ2h0LCAuYmxvYi13cmFwcGVyIHRhYmxlLmhpZ2hsaWdodCIpKSB7CgkJCSQkKCJ0YWJsZS5oaWdobGlnaHQiKS5mb3JFYWNoKChjb2RlQmxvY2ssIGJsb2NrSW5kZXgpID0+IHsKCQkJCWlmIChjb2RlQmxvY2sgJiYgY29kZUJsb2NrLmNsYXNzTGlzdC5jb250YWlucygiZ2hjZi1wcm9jZXNzZWQiKSkgewoJCQkJCS8vIEFscmVhZHkgcHJvY2Vzc2VkCgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJY29uc3QgY29kZUxpbmVzID0gZ2V0Q29kZUxpbmVzKGNvZGVCbG9jayk7CgkJCQlyZW1vdmVFbHMoInNwYW4uZ2hjZi1jb2xsYXBzZXIiLCBjb2RlQmxvY2spOwoJCQkJaWYgKGNvZGVMaW5lcykgewoJCQkJCS8vIEluIGNhc2UgdGhpcyBzY3JpcHQgaGFzIGFscmVhZHkgYmVlbiBydW4gYW5kIG1vZGlmaWVkIHRoZSBET00gb24gYQoJCQkJCS8vIHByZXZpb3VzIHBhZ2UgaW4gZ2l0aHViLCBtYWtlIHN1cmUgdG8gcmVzZXQgaXQuCgkJCQkJY29kZUJsb2NrLmNsYXNzTGlzdC5hZGQoImdoY2YtcHJvY2Vzc2VkIik7CgkJCQkJY29kZUJsb2NrLmRhdGFzZXQuYmxvY2tJbmRleCA9IGJsb2NrSW5kZXg7CgoJCQkJCWNvbnN0IHNwYWNlTWFwID0gbmV3IE1hcCgpOwoJCQkJCWNvbnN0IHN0YWNrID0gW107CgkJCQkJY29uc3QgcGFpcnMgPSBibG9ja3NbYmxvY2tJbmRleF0gPSBuZXcgTWFwKCk7CgoJCQkJCWNvZGVMaW5lcy5mb3JFYWNoKChlbCwgbGluZU51bSkgPT4gewoJCQkJCQlsZXQgcHJldlNwYWNlczsKCQkJCQkJbGV0IGxpbmUgPSBlbC50ZXh0Q29udGVudDsKCQkJCQkJbGV0IGNvdW50ID0gbGluZS50cmltKCkubGVuZ3RoCgkJCQkJCQk/IGNvdW50SW5pdGlhbFdoaXRlU3BhY2UobGluZS5zcGxpdCgiIikpCgkJCQkJCQk6IC0xOwoJCQkJCQlzcGFjZU1hcC5zZXQobGluZU51bSwgY291bnQpOwoKCQkJCQkJZnVuY3Rpb24gdHJ5UGFpcigpIHsKCQkJCQkJCWxldCBlbDsKCQkJCQkJCWxldCB0b3AgPSBzdGFja1tzdGFjay5sZW5ndGggLSAxXTsKCQkJCQkJCWlmIChjb3VudCAhPT0gLTEgJiYgY291bnQgPD0gc3BhY2VNYXAuZ2V0KHRvcCkpIHsKCQkJCQkJCQlwYWlycy5zZXQodG9wLCBsaW5lTnVtKTsKCQkJCQkJCQkvLyBwcmVwZW5kIHRyaWFuZ2xlCgkJCQkJCQkJZWwgPSB0cmlhbmdsZS5jbG9uZU5vZGUoKTsKCQkJCQkJCQllbC5kYXRhc2V0LmRlcHRoID0gY291bnQgKyAxOwoJCQkJCQkJCWNvZGVMaW5lc1t0b3BdLmluc2VydEJlZm9yZShlbCwgY29kZUxpbmVzW3RvcF0uY2hpbGROb2Rlc1swXSk7CgkJCQkJCQkJc3RhY2sucG9wKCk7CgkJCQkJCQkJcmV0dXJuIHRyeVBhaXIoKTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQl0cnlQYWlyKCk7CgoJCQkJCQlwcmV2U3BhY2VzID0gZ2V0UHJldmlvdXNTcGFjZXMoc3BhY2VNYXAsIGxpbmVOdW0pOwoJCQkJCQlpZiAoY291bnQgPiBwcmV2U3BhY2VzLmNvdW50KSB7CgkJCQkJCQlzdGFjay5wdXNoKHByZXZTcGFjZXMubGluZU51bSk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJfSk7CgkJfQoJfQoKCWZ1bmN0aW9uIHJlbW92ZUVscyhzZWxlY3RvciwgZWwpIHsKCQlsZXQgZWxzID0gJCQoc2VsZWN0b3IsIGVsKTsKCQlsZXQgaW5kZXggPSBlbHMubGVuZ3RoOwoJCXdoaWxlIChpbmRleC0tKSB7CgkJCWVsc1tpbmRleF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbHNbaW5kZXhdKTsKCQl9Cgl9CgoJZnVuY3Rpb24gcmVtb3ZlU2VsZWN0aW9uKCkgewoJCS8vIHJlbW92ZSB0ZXh0IHNlbGVjdGlvbiAtIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMTcxMzQ4LzE0NTM0NgoJCWNvbnN0IHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24KCQkJPyB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkKCQkJOiBkb2N1bWVudC5zZWxlY3Rpb247CgkJaWYgKHNlbCkgewoJCQlpZiAoc2VsLnJlbW92ZUFsbFJhbmdlcykgewoJCQkJc2VsLnJlbW92ZUFsbFJhbmdlcygpOwoJCQl9IGVsc2UgaWYgKHNlbC5lbXB0eSkgewoJCQkJc2VsLmVtcHR5KCk7CgkJCX0KCQl9Cgl9CgoJb24oZG9jdW1lbnQsICJnaG1vOmNvbnRhaW5lciIsIGFkZENvZGVGb2xkaW5nKTsKCWFkZENvZGVGb2xkaW5nKCk7CglhZGRCaW5kaW5ncygpOwoKfSkoKTsK", 772 + "storage": { 773 + "data": {}, 774 + "ts": 1636664956605 775 + }, 776 + "uuid": "03039f55-1392-4e34-89d8-7a324da08087" 777 + }, 778 + { 779 + "enabled": true, 780 + "file_url": "https://raw.githubusercontent.com/Mottie/GitHub-userscripts/master/github-sort-reactions.user.js", 781 + "name": "GitHub Sort Reactions", 782 + "options": { 783 + "check_for_updates": true, 784 + "comment": null, 785 + "compat_foreach": false, 786 + "compat_metadata": false, 787 + "compat_powerful_this": null, 788 + "compat_prototypes": false, 789 + "compat_wrappedjsobject": false, 790 + "compatopts_for_requires": true, 791 + "noframes": null, 792 + "override": { 793 + "merge_connects": true, 794 + "merge_excludes": true, 795 + "merge_includes": true, 796 + "merge_matches": true, 797 + "orig_connects": [], 798 + "orig_excludes": [], 799 + "orig_includes": [ 800 + "https://github.com/*" 801 + ], 802 + "orig_matches": [], 803 + "orig_noframes": null, 804 + "orig_run_at": "document-idle", 805 + "use_blockers": [], 806 + "use_connects": [], 807 + "use_excludes": [], 808 + "use_includes": [], 809 + "use_matches": [] 810 + }, 811 + "run_at": null, 812 + "tab_types": null 813 + }, 814 + "position": 15, 815 + "requires": [ 816 + { 817 + "meta": { 818 + "mimetype": "text/javascript", 819 + "name": "mutations.js", 820 + "ts": 1649167236845, 821 + "url": "https://greasyfork.org/scripts/28721-mutations/code/mutations.js?version=952601" 822 + }, 823 + "source": "LyogR2l0SHViIG11dGF0aW9ucyBvYnNlcnZlciBsaWJyYXJ5IHNjcmlwdCB2MC40LjQKICogRGV0ZWN0IGNoYW5nZXMgdG8gdmFyaW91cyBlbGVtZW50cyBhbmQgdHJpZ2dlciBhbiBldmVudAogKiBUaGlzIHNjcmlwdCBpcyBtZWFudCB0byBiZSB1c2VkIGFzIGEgbGlicmFyeSBmb3IgR2l0SHViLWJhc2VkIHVzZXJzY3JpcHRzCiAqIENvcHlyaWdodCDCqSAyMDIxIFJvYiBHYXJyaXNvbgogKiBMaWNlbnNlOiBNSVQKICovCigoKSA9PiB7CgkidXNlIHN0cmljdCI7CgoJLy8gcHJlZml4IGZvciBldmVudCAmIGRvY3VtZW50IGJvZHkgY2xhc3MgbmFtZSwgZS5nLiAiZ2htbzpjb250YWluZXIiCgljb25zdCBwcmVmaXggPSAiZ2htbyIsCgkJZGlzYWJsZUF0dHIgPSBgZGF0YS0ke3ByZWZpeH0tZGlzYWJsZWAsCgkJZGVib3VuY2VJbnRlcnZhbCA9IDIwMCwKCQl0YXJnZXRzID0gewoJCQkvLyBwamF4IGNvbnRhaW5lciAoY292ZXJzIGdlbmVyYWwsIHJlcG8gJiBnaXN0cykKCQkJLy8gLm5ld3MgPSBuZXdzZmVlZCBsYXlvdXQKCQkJLy8gLnJlcG9zaXRvcnktY29udGVudCA9IGZpbGUgY29kZSAoY29kZSBmb2xkaW5nKQoJCQkiW2RhdGEtcGpheC1jb250YWluZXJdLCAubmV3cywgLnJlcG9zaXRvcnktY29udGVudCI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogImNvbnRhaW5lciIKCQkJfSwKCQkJLy8gY29tbWVudCBwcmV2aWV3IGFjdGl2ZQoJCQkiLmpzLXByZXZpZXctYm9keSI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogInByZXZpZXciCgkJCX0sCgkJCS8vIC5qcy1kaXNjdXNzaW9uID0gd3JhcHBlciBmb3IgcHJvZ3Jlc3NpdmVseSBsb2FkZWQgY29tbWVudHM7CgkJCS8vICIjIGl0ZW1zIG5vdCBzaG93biIgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL2lzYWFjcy9naXRodWIvaXNzdWVzLzE4CgkJCS8vIC5kaXNjdXNzaW9uLWl0ZW0gPSBpc3N1ZSBzdGF0dXMgY2hhbmdlZCAoZ2l0aHViLWlzc3VlLXNob3ctc3RhdHVzKQoJCQkvLyAjcHJvZ3Jlc3NpdmUtdGltZWxpbmUtaXRlbS1jb250YWluZXIgPSBsb2FkIGhpZGRlbiBpdGVtcyAob2xkPykKCQkJLy8gI2pzLXByb2dyZXNzaXZlLXRpbWVsaW5lLWl0ZW0tY29udGFpbmVyID0gbG9hZCBoaWRkZW4gaXRlbXMKCQkJIi5qcy1kaXNjdXNzaW9uLCAuZGlzY3Vzc2lvbi1pdGVtLCAudG9vbGJhci1pdGVtLCAjcHJvZ3Jlc3NpdmUtdGltZWxpbmUtaXRlbS1jb250YWluZXIsICNqcy1wcm9ncmVzc2l2ZS10aW1lbGluZS1pdGVtLWNvbnRhaW5lciI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogImNvbW1lbnRzIgoJCQl9LAoJCQkvLyBwcm9ncmVzc2l2ZWx5IGxvYWRlZCBjb250ZW50IChkaWZmIGZpbGVzKQoJCQkiLmpzLWRpZmYtcHJvZ3Jlc3NpdmUtY29udGFpbmVyLCAuZGF0YS5ibG9iLXdyYXBwZXIsIC5qcy1kaWZmLWxvYWQtY29udGFpbmVyLCAuZGlmZi10YWJsZSB0Ym9keSI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogImRpZmYiCgkJCX0sCgkJCS8vIGlzc3Vlcy9wciBzaWRlYmFyICYgdGltZWxpbmUgc2VjdGlvbnM6IGUuZy4gZm9ybSBhY3Rpb25zLCBjb21taXQKCQkJLy8gcmVmZXJlbmNlcywgZGVwbG95bWVudCBzdGF0ZSAmIFBSIGNoZWNrcyBjb250YWluZXIKCQkJIi5qcy11cGRhdGFibGUtY29udGVudCwgLmpzLXVwZGF0YWJsZS1jb250ZW50LXByZXNlcnZlLXNjcm9sbC1wb3NpdGlvbiI6IHsKCQkJCWNvdW50OiAwLAoJCQkJbmFtZTogInVwZGF0YWJsZSIKCQkJfSwKCQkJLy8gdXNlciBwcm9maWxlIG1lbnUgKGxvYWRzIG9uIGhvdmVyKQoJCQkiZGV0YWlscy1tZW51IjogewoJCQkJY291bnQ6IDAsCgkJCQluYW1lOiAibWVudSIKCQkJfQoJCX0sCgkJbGlzdCA9IE9iamVjdC5rZXlzKHRhcmdldHMpOwoKCWZ1bmN0aW9uIGZpcmVFdmVudHMoKSB7CgkJbGlzdC5mb3JFYWNoKHNlbGVjdG9yID0+IHsKCQkJaWYgKHRhcmdldHNbc2VsZWN0b3JdLmNvdW50ID4gMCkgewoJCQkJLy8gZXZlbnQgPT4gImdobW86Y29udGFpbmVyIiwgImdobW86Y29tbWVudHMiCgkJCQljb25zdCBldmVudCA9IG5ldyBFdmVudChwcmVmaXggKyAiOiIgKyB0YXJnZXRzW3NlbGVjdG9yXS5uYW1lKTsKCQkJCWRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpOwoJCQl9CgkJCXRhcmdldHNbc2VsZWN0b3JdLmNvdW50ID0gMDsKCQl9KTsKCX0KCglmdW5jdGlvbiBpbml0KCkgewoJCS8vIHByZXZlbnQgZXJyb3Igd2hlbiBsaWJyYXJ5IGlzIGxvYWRlZCBhdCBkb2N1bWVudC1zdGFydCAmIG5vIGJvZHkgZXhpc3RzCgkJY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiYm9keSIpOwoJCWxldCB0aW1lcjsKCQkvLyBwcmV2ZW50IHNjcmlwdCBmcm9tIGluc3RhbGxpbmcgbW9yZSB0aGFuIG9uY2UKCQlpZiAoY29udGFpbmVyICYmICFjb250YWluZXIuY2xhc3NMaXN0LmNvbnRhaW5zKHByZWZpeCArICItZW5hYmxlZCIpKSB7CgkJCWNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHByZWZpeCArICItZW5hYmxlZCIpOwoJCQkvLyBib3VuZCB0byBkb2N1bWVudC5ib2R5Li4uIHRoaXMgbWF5IGJlIGJhZCBmb3IgcGVyZm9ybWFuY2UKCQkJLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzkzMzIzNDAvMTQ1MzQ2CgkJCW5ldyBNdXRhdGlvbk9ic2VydmVyKG11dGF0aW9ucyA9PiB7CgkJCQljbGVhclRpbWVvdXQodGltZXIpOwoJCQkJLyogZG9jdW1lbnQuYm9keSBhdHRyaWJ1dGUgdXNlZCB0byBkaXNhYmxlIHVwZGF0ZXM7IGl0ICpzaG91bGQgbm90KgoJCQkJICogYmUgdXNlZCByZWd1bGFybHkgYXMgbXVsdGlwbGUgc2NyaXB0cyBtYXkgZW5hYmxlIG9yIGRpc2FibGUgdGhlCgkJCQkgKiBvYnNlcnZlcnMgYXQgaW5hcHByb3ByaWF0ZSB0aW1lcy4gSXQgaXMgYmVzdCB0aGF0IGVhY2ggc2NyaXB0IGhhbmRsZXMKCQkJCSAqIHRoZSBtdXRhdGlvbiBldmVudHMgdHJpZ2dlcmVkIGJ5IHRoaXMgbGlicmFyeSBvbiBpdHMgb3duCgkJCQkgKi8KCQkJCWlmIChjb250YWluZXIuZ2V0QXR0cmlidXRlKGRpc2FibGVBdHRyKSkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCWxldCBtaW5keCwgdGFyZ2V0LCBsaW5keCwKCQkJCQlsbGVuID0gbGlzdC5sZW5ndGgsCgkJCQkJbWxlbiA9IG11dGF0aW9ucy5sZW5ndGg7CgkJCQkvLyBhdm9pZGluZyB1c2Ugb2YgZm9yRWFjaCBsb29wcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucwoJCQkJZm9yIChtaW5keCA9IDA7IG1pbmR4IDwgbWxlbjsgbWluZHgrKykgewoJCQkJCXRhcmdldCA9IG11dGF0aW9uc1ttaW5keF0udGFyZ2V0OwoJCQkJCWlmICh0YXJnZXQpIHsKCQkJCQkJZm9yIChsaW5keCA9IDA7IGxpbmR4IDwgbGxlbjsgbGluZHgrKykgewoJCQkJCQkJaWYgKHRhcmdldC5tYXRjaGVzKGxpc3RbbGluZHhdKSkgewoJCQkJCQkJCXRhcmdldHNbbGlzdFtsaW5keF1dLmNvdW50Kys7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHsKCQkJCQkJZmlyZUV2ZW50cygpOwoJCQkJCX0sIGRlYm91bmNlSW50ZXJ2YWwpOwoJCQkJfQoJCQl9KS5vYnNlcnZlKGNvbnRhaW5lciwgewoJCQkJY2hpbGRMaXN0OiB0cnVlLAoJCQkJc3VidHJlZTogdHJ1ZQoJCQl9KTsKCQl9Cgl9CgoJaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJsb2FkaW5nIikgewoJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCAoKSA9PiBpbml0KTsKCX0gZWxzZSB7CgkJaW5pdCgpOwoJfQoKfSkoKTsK" 824 + } 825 + ], 826 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIEdpdEh1YiBTb3J0IFJlYWN0aW9ucwovLyBAdmVyc2lvbiAgICAgMC4yLjE2Ci8vIEBkZXNjcmlwdGlvbiBBIHVzZXJzY3JpcHQgdGhhdCBzb3J0cyBjb21tZW50cyBieSByZWFjdGlvbgovLyBAbGljZW5zZSAgICAgTUlUCi8vIEBhdXRob3IgICAgICBSb2IgR2Fycmlzb24KLy8gQG5hbWVzcGFjZSAgIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb3R0aWUKLy8gQGluY2x1ZGUgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS8qCi8vIEBydW4tYXQgICAgICBkb2N1bWVudC1pZGxlCi8vIEBncmFudCAgICAgICBHTV9hZGRTdHlsZQovLyBAZ3JhbnQgICAgICAgR01fZ2V0VmFsdWUKLy8gQGdyYW50ICAgICAgIEdNX3NldFZhbHVlCi8vIEByZXF1aXJlICAgICBodHRwczovL2dyZWFzeWZvcmsub3JnL3NjcmlwdHMvMjg3MjEtbXV0YXRpb25zL2NvZGUvbXV0YXRpb25zLmpzP3ZlcnNpb249OTUyNjAxCi8vIEBpY29uICAgICAgICBodHRwczovL2dpdGh1Yi5naXRodWJhc3NldHMuY29tL3Bpbm5lZC1vY3RvY2F0LnN2ZwovLyBAdXBkYXRlVVJMICAgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL01vdHRpZS9HaXRIdWItdXNlcnNjcmlwdHMvbWFzdGVyL2dpdGh1Yi1zb3J0LXJlYWN0aW9ucy51c2VyLmpzCi8vIEBkb3dubG9hZFVSTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTW90dGllL0dpdEh1Yi11c2Vyc2NyaXB0cy9tYXN0ZXIvZ2l0aHViLXNvcnQtcmVhY3Rpb25zLnVzZXIuanMKLy8gQHN1cHBvcnRVUkwgIGh0dHBzOi8vZ2l0aHViLmNvbS9Nb3R0aWUvR2l0SHViLXVzZXJzY3JpcHRzL2lzc3VlcwovLyA9PS9Vc2VyU2NyaXB0PT0KKCgpID0+IHsKCSJ1c2Ugc3RyaWN0IjsKCgljb25zdCBub25JbnRlZ2VyID0gL1teXGRdL2c7Cgljb25zdCByZWFjdGlvblZhbHVlcyA9IHsKCQkiVEhVTUJTX1VQIjogMSwKCQkiSE9PUkFZIjogMSwKCQkiSEVBUlQiOiAxLAoJCSJMQVVHSCI6IDAuNSwKCQkiQ09ORlVTRUQiOiAtMC41LAoJCSJUSFVNQlNfRE9XTiI6IC0xCgl9OwoJY29uc3QgY3VycmVudFNvcnQgPSB7CgkJaW5pdDogZmFsc2UsCgkJZWw6IG51bGwsCgkJZGlyOiAwLCAvLyAwID0gdW5zb3J0ZWQsIDEgPSBkZXNjLCAyID0gYXNjCgkJYnVzeTogZmFsc2UsCgkJdHlwZTogR01fZ2V0VmFsdWUoInNlbGVjdGVkLXJlYWN0aW9uIiwgIk5PTkUiKQoJfTsKCgljb25zdCBlbW9qaVNyYyA9ICJodHRwczovL2dpdGh1Yi5naXRodWJhc3NldHMuY29tL2ltYWdlcy9pY29ucy9lbW9qaS91bmljb2RlIjsKCgljb25zdCBzb3J0QmxvY2sgPSBgCjxkaXYgY2xhc3M9IlRpbWVsaW5lSXRlbSBnaHNyLXNvcnQtYmxvY2sgZ2hzci1pcy1jb2xsYXBzZWQganMtdGltZWxpbmUtcHJvZ3Jlc3NpdmUtZm9jdXMtY29udGFpbmVyIj4KCTxkaXYgY2xhc3M9ImF2YXRhci1wYXJlbnQtY2hpbGQgVGltZWxpbmVJdGVtLWF2YXRhciBib3JkZXIgZ2hzci1zb3J0LWF2YXRhciBnaHNyLW5vLXNlbGVjdGlvbiI+CgkJPGRpdiBjbGFzcz0iZ2hzci1pY29uLXdyYXAgdG9vbHRpcHBlZCB0b29sdGlwcGVkLW4iIGFyaWEtbGFiZWw9IkNsaWNrIHRvIHRvZ2dsZSByZWFjdGlvbiBzb3J0IG1lbnUiPgoJCQk8c3ZnIGFyaWEtaGlkZGVuPSJ0cnVlIiBjbGFzcz0ib2N0aWNvbiBnaHNyLXNvcnQtaWNvbiIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjUiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCAxNiAxNiI+CgkJCQk8cGF0aCBkPSJNMTUgOCAxIDggOCAwek0xNSA5IDEgOSA4IDE2eiIvPgoJCQk8L3N2Zz4KCQk8L2Rpdj4KCQk8Zy1lbW9qaT48L2ctZW1vamk+CgkJPGJ1dHRvbiBjbGFzcz0iZ2hzci1zb3J0LWJ1dHRvbiBnaHNyLWF2YXRhci1zb3J0IGJ0biBidG4tc20gdG9vbHRpcHBlZCB0b29sdGlwcGVkLW4iIGFyaWEtbGFiZWw9IlRvZ2dsZSBzZWxlY3RlZCByZWFjdGlvbiBzb3J0IGRpcmVjdGlvbiI+CgkJCTxzcGFuPjwvc3Bhbj4KCQk8L2J1dHRvbj4KCTwvZGl2PgoJPGRpdiBjbGFzcz0idGltZWxpbmUtY29tbWVudCBtbC1uMyI+CgkJPGRpdiBjbGFzcz0idGltZWxpbmUtY29tbWVudC1oZWFkZXIgY29tbWVudCBjb21tZW50LWJvZHkiPgoJCQk8aDMgY2xhc3M9InRpbWVsaW5lLWNvbW1lbnQtaGVhZGVyLXRleHQgZjUgdGV4dC1ub3JtYWwiPgoJCQkJPGJ1dHRvbiBjbGFzcz0iZ2hzci1zb3J0LWJ1dHRvbiBidG4gYnRuLXNtIHRvb2x0aXBwZWQgdG9vbHRpcHBlZC1uIiB0eXBlPSJidXR0b24iIGFyaWEtbGFiZWw9IlNvcnQgYnkgKzEgcmVhY3Rpb24iIGRhdGEtc29ydD0iVEhVTUJTX1VQIj4KCQkJCQk8Zy1lbW9qaSBhbGlhcz0iKzEiIGNsYXNzPSJlbW9qaSIgZmFsbGJhY2stc3JjPSIke2Vtb2ppU3JjfS8xZjQ0ZC5wbmciPvCfkY08L2ctZW1vamk+CgkJCQk8L2J1dHRvbj4KCQkJCTxidXR0b24gY2xhc3M9Imdoc3Itc29ydC1idXR0b24gYnRuIGJ0bi1zbSB0b29sdGlwcGVkIHRvb2x0aXBwZWQtbiIgdHlwZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSJTb3J0IGJ5IC0xIHJlYWN0aW9uIiBkYXRhLXNvcnQ9IlRIVU1CU19ET1dOIj4KCQkJCQk8Zy1lbW9qaSBhbGlhcz0iLTEiIGNsYXNzPSJlbW9qaSIgZmFsbGJhY2stc3JjPSIke2Vtb2ppU3JjfS8xZjQ0ZS5wbmciPvCfkY48L2ctZW1vamk+CgkJCQk8L2J1dHRvbj4KCQkJCTxidXR0b24gY2xhc3M9Imdoc3Itc29ydC1idXR0b24gYnRuIGJ0bi1zbSB0b29sdGlwcGVkIHRvb2x0aXBwZWQtbiIgdHlwZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSJTb3J0IGJ5IGxhdWdoIHJlYWN0aW9uIiBkYXRhLXNvcnQ9IkxBVUdIIj4KCQkJCQk8Zy1lbW9qaSBhbGlhcz0ic21pbGUiIGNsYXNzPSJlbW9qaSIgZmFsbGJhY2stc3JjPSIke2Vtb2ppU3JjfS8xZjYwNC5wbmciPvCfmIQ8L2ctZW1vamk+CgkJCQk8L2J1dHRvbj4KCQkJCTxidXR0b24gY2xhc3M9Imdoc3Itc29ydC1idXR0b24gYnRuIGJ0bi1zbSB0b29sdGlwcGVkIHRvb2x0aXBwZWQtbiIgdHlwZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSJTb3J0IGJ5IGhvb3JheSByZWFjdGlvbiIgZGF0YS1zb3J0PSJIT09SQVkiPgoJCQkJCTxnLWVtb2ppIGFsaWFzPSJ0YWRhIiBjbGFzcz0iZW1vamkiIGZhbGxiYWNrLXNyYz0iJHtlbW9qaVNyY30vMWYzODkucG5nIj7wn46JPC9nLWVtb2ppPgoJCQkJPC9idXR0b24+CgkJCQk8YnV0dG9uIGNsYXNzPSJnaHNyLXNvcnQtYnV0dG9uIGJ0biBidG4tc20gdG9vbHRpcHBlZCB0b29sdGlwcGVkLW4iIHR5cGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iU29ydCBieSBjb25mdXNlZCByZWFjdGlvbiIgZGF0YS1zb3J0PSJDT05GVVNFRCI+CgkJCQkJPGctZW1vamkgYWxpYXM9InRoaW5raW5nX2ZhY2UiIGNsYXNzPSJlbW9qaSIgZmFsbGJhY2stc3JjPSIke2Vtb2ppU3JjfS8xZjYxNS5wbmciPvCfmJU8L2ctZW1vamk+CgkJCQk8L2J1dHRvbj4KCQkJCTxidXR0b24gY2xhc3M9Imdoc3Itc29ydC1idXR0b24gYnRuIGJ0bi1zbSB0b29sdGlwcGVkIHRvb2x0aXBwZWQtbiIgdHlwZT0iYnV0dG9uIiBhcmlhLWxhYmVsPSJTb3J0IGJ5IGhlYXJ0IHJlYWN0aW9uIiBkYXRhLXNvcnQ9IkhFQVJUIj4KCQkJCQk8Zy1lbW9qaSBhbGlhcz0iaGVhcnQiIGNsYXNzPSJlbW9qaSIgZmFsbGJhY2stc3JjPSIke2Vtb2ppU3JjfS8yNzY0LnBuZyI+4p2k77iPPC9nLWVtb2ppPgoJCQkJPC9idXR0b24+CgkJCQk8YnV0dG9uIGNsYXNzPSJnaHNyLXNvcnQtYnV0dG9uIGJ0biBidG4tc20gdG9vbHRpcHBlZCB0b29sdGlwcGVkLW4gdG9vbHRpcHBlZC1tdWx0aWxpbmUiIHR5cGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iU29ydCBieSByZWFjdGlvbiBldmFsdWF0aW9uCih0aHVtYnMgdXAsIGhvb3JheSAmIGhlYXJ0ID0gKzE7CmxhdWdoID0gKzAuNTsgY29uZnVzZWQgPSAtMC41Owp0aHVtYnMgZG93biA9IC0xKSIgZGF0YS1zb3J0PSJBQ1RJVkUiPgoJCQkJCTxnLWVtb2ppIGFsaWFzPSJzcGVha19ub19ldmlsIiBjbGFzcz0iZW1vamkiIGZhbGxiYWNrLXNyYz0iJHtlbW9qaVNyY30vMWY2NGEucG5nIj7wn5mKPC9nLWVtb2ppPgoJCQkJPC9idXR0b24+CgkJCTwvaDM+CgkJPC9kaXY+Cgk8L2Rpdj4KPC9kaXY+YDsKCglmdW5jdGlvbiBzdW1PZlJlYWN0aW9ucyhlbCkgewoJCXJldHVybiBPYmplY3Qua2V5cyhyZWFjdGlvblZhbHVlcykucmVkdWNlKChzdW0sIGl0ZW0pID0+IHsKCQkJY29uc3QgZWxtID0gJChgLmNvbW1lbnQtcmVhY3Rpb25zLW9wdGlvbnMgYnV0dG9uW3ZhbHVlKj0iJHtpdGVtfSJdYCwgZWwpOwoJCQlyZXR1cm4gc3VtICsgKGdldFZhbHVlKGVsbSkgKiByZWFjdGlvblZhbHVlc1tpdGVtXSk7CgkJfSwgMCk7Cgl9CgoJZnVuY3Rpb24gZ2V0VmFsdWUoZWxtKSB7CgkJcmV0dXJuIGVsbSA/CgkJCXBhcnNlSW50KGVsbS50ZXh0Q29udGVudC5yZXBsYWNlKG5vbkludGVnZXIsICIiKSB8fCAiMCIsIDEwKSA6CgkJCTA7Cgl9CgoJZnVuY3Rpb24gZXh0cmFjdFNvcnRWYWx1ZShlbG0sIHR5cGUsIGRpcikgewoJCWlmIChkaXIgPT09IDAgfHwgdHlwZSA9PT0gIk5PTkUiIHx8IHR5cGUgPT09ICJBQ1RJVkUiKSB7CgkJCXJldHVybiBwYXJzZUZsb2F0KAoJCQkJZWxtLmRhdGFzZXRbYHNvcnRDb21tZW50JHtkaXIgPT09IDAgPyAiRGF0ZSIgOiAiU3VtIn1gXQoJCQkpOwoJCX0KCQlyZXR1cm4gZ2V0VmFsdWUoJChgLmNvbW1lbnQtcmVhY3Rpb25zIGJ1dHRvblt2YWx1ZSo9IiR7dHlwZX0iXWAsIGVsbSkpOwoJfQoKCWZ1bmN0aW9uIHN0YWJsZVNvcnRWYWx1ZShlbG0pIHsKCQlyZXR1cm4gcGFyc2VJbnQoZWxtLmRhdGFzZXQuc29ydENvbW1lbnREYXRlLCAxMCk7Cgl9CgoJZnVuY3Rpb24gdXBkYXRlQXZhdGFyKCkgewoJCUdNX3NldFZhbHVlKCJzZWxlY3RlZC1yZWFjdGlvbiIsIGN1cnJlbnRTb3J0LnR5cGUpOwoJCWNvbnN0IGJsb2NrID0gJCgiLmdoc3Itc29ydC1ibG9jayIpLAoJCQlhdmF0YXIgPSAkKCIuZ2hzci1zb3J0LWF2YXRhciIsIGJsb2NrKSwKCQkJaWNvbiA9ICQoIi5naHNyLXNvcnQtYnV0dG9uIHNwYW4iLCBhdmF0YXIpOwoJCWlmIChhdmF0YXIpIHsKCQkJbGV0IGN1cnJlbnQgPSAkKGAuY29tbWVudC1ib2R5IFtkYXRhLXNvcnQ9JHtjdXJyZW50U29ydC50eXBlfV1gLCBibG9jayk7CgkJCWF2YXRhci5jbGFzc0xpc3QucmVtb3ZlKCJnaHNyLW5vLXNlbGVjdGlvbiIpOwoJCQlhdmF0YXIucmVwbGFjZUNoaWxkKAoJCQkJJCgiZy1lbW9qaSIsIGN1cnJlbnQpLmNsb25lTm9kZSh0cnVlKSwKCQkJCSQoImctZW1vamkiLCBhdmF0YXIpCgkJCSk7CgkJCWlmIChjdXJyZW50U29ydC5kaXIgPT09IDApIHsKCQkJCS8vIHVzZSB1bnNvcnRlZCBzdmcgaW4gc29ydCBidXR0b24KCQkJCWN1cnJlbnQgPSAkKCIuZ2hzci1zb3J0LWljb24iLCBhdmF0YXIpLmNsb25lTm9kZSh0cnVlKTsKCQkJCWN1cnJlbnQuY2xhc3NMaXN0LnJlbW92ZSgiZ2hzci1zb3J0LWljb24iKTsKCQkJCWljb24udGV4dENvbnRlbnQgPSAiIjsKCQkJCWljb24uYXBwZW5kQ2hpbGQoY3VycmVudCk7CgkJCX0gZWxzZSB7CgkJCQlpY29uLnRleHRDb250ZW50ID0gY3VycmVudFNvcnQuZGlyICE9PSAxID8gIuKWsiIgOiAi4pa8IjsKCQkJfQoJCX0KCX0KCglmdW5jdGlvbiBzb3J0KCkgewoJCWN1cnJlbnRTb3J0LmJ1c3kgPSB0cnVlOwoJCWNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLAoJCQljb250YWluZXIgPSAkKCIuanMtZGlzY3Vzc2lvbiIpLAoJCQlzb3J0QmxvY2sgPSAkKCIuZ2hzci1zb3J0LWJsb2NrIiksCgkJCWxvYWRNb3JlID0gJCgiI3Byb2dyZXNzaXZlLXRpbWVsaW5lLWl0ZW0tY29udGFpbmVyIiksCgkJCWRpciA9IGN1cnJlbnRTb3J0LmRpciwKCQkJc29ydEFzYyA9IGRpciAhPT0gMSwKCQkJdHlwZSA9IGN1cnJlbnRTb3J0LmVsID8gY3VycmVudFNvcnQuZWwuZGF0YXNldC5zb3J0IDogIk5PTkUiOwoJCWN1cnJlbnRTb3J0LnR5cGUgPSB0eXBlOwoJCXVwZGF0ZUF2YXRhcigpOwoKCQkkJCgiLmpzLXRpbWVsaW5lLWl0ZW0iKQoJCQkuc29ydCgoYSwgYikgPT4gewoJCQkJY29uc3QgYXYgPSBleHRyYWN0U29ydFZhbHVlKGEsIHR5cGUsIGRpciksCgkJCQkJYnYgPSBleHRyYWN0U29ydFZhbHVlKGIsIHR5cGUsIGRpcik7CgkJCQlpZiAoYXYgPT09IGJ2KSB7CgkJCQkJcmV0dXJuIHN0YWJsZVNvcnRWYWx1ZShhKSAtIHN0YWJsZVNvcnRWYWx1ZShiKTsKCQkJCX0KCQkJCXJldHVybiBzb3J0QXNjID8gYXYgLSBidiA6IGJ2IC0gYXY7CgkJCX0pCgkJCS5mb3JFYWNoKGVsID0+IHsKCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKGVsKTsKCQkJfSk7CgkJY29udGFpbmVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTsKCQlpZiAobG9hZE1vcmUpIHsKCQkJLy8gTW92ZSBsb2FkIG1vcmUgY29tbWVudHMgdG8gdG9wCgkJCXNvcnRCbG9jay5wYXJlbnROb2RlLmluc2VydEJlZm9yZShsb2FkTW9yZSwgc29ydEJsb2NrLm5leHRTaWJsaW5nKTsKCQl9CgkJc2V0VGltZW91dCgoKSA9PiB7CgkJCWN1cnJlbnRTb3J0LmJ1c3kgPSBmYWxzZTsKCQl9LCAxMDApOwoJfQoKCWZ1bmN0aW9uIHVwZGF0ZSgpIHsKCQlpZiAoIWN1cnJlbnRTb3J0LmluaXQgfHwgJCQoIi5oYXMtcmVhY3Rpb25zIikubGVuZ3RoIDwgMikgewoJCQlyZXR1cm4gdG9nZ2xlU29ydEJsb2NrKGZhbHNlKTsKCQl9CgkJdG9nZ2xlU29ydEJsb2NrKHRydWUpOwoJCWNvbnN0IGl0ZW1zID0gJCQoIi5qcy10aW1lbGluZS1pdGVtOm5vdChbZGF0YS1zb3J0LWNvbW1lbnQtZGF0ZV0pIik7CgkJaWYgKGl0ZW1zKSB7CgkJCWl0ZW1zLmZvckVhY2goZWwgPT4gewoJCQkJbGV0IGRhdGUgPSAkKCJbZGF0ZXRpbWVdIiwgZWwpOwoJCQkJaWYgKGRhdGUpIHsKCQkJCQlkYXRlID0gZGF0ZS5nZXRBdHRyaWJ1dGUoImRhdGV0aW1lIik7CgkJCQkJZWwuc2V0QXR0cmlidXRlKCJkYXRhLXNvcnQtY29tbWVudC1kYXRlIiwgRGF0ZS5wYXJzZShkYXRlKSk7CgkJCQl9CgkJCQkvLyBBZGQgcmVzZXQgZGF0ZSAmIG1vc3QgYWN0aXZlIHN1bW1hdGlvbgoJCQkJZWwuc2V0QXR0cmlidXRlKCJkYXRhLXNvcnQtY29tbWVudC1zdW0iLCBzdW1PZlJlYWN0aW9ucyhlbCkpOwoJCQl9KTsKCQl9CgkJaWYgKGN1cnJlbnRTb3J0LmVsICYmICFjdXJyZW50U29ydC5idXN5KSB7CgkJCXNvcnQoKTsKCQl9Cgl9CgoJZnVuY3Rpb24gaW5pdFNvcnQoZXZlbnQpIHsKCQlsZXQgZGlyZWN0aW9uLAoJCQl0YXJnZXQgPSBldmVudC50YXJnZXQ7CgkJaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImdoc3Itc29ydC1idXR0b24iKSkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoImdoc3ItYXZhdGFyLXNvcnQiKSkgewoJCQkJLy8gVXNpbmcgYXZhdGFyIHNvcnQgYnV0dG9uOyByZXRhcmdldCBidXR0b24KCQkJCXRhcmdldCA9ICQoYC5naHNyLXNvcnQtYnV0dG9uW2RhdGEtc29ydD0iJHtjdXJyZW50U29ydC50eXBlfSJdYCk7CgkJCQljdXJyZW50U29ydC5lbCA9IHRhcmdldDsKCQkJfQoJCQkkJCgiLmdoc3Itc29ydC1idXR0b24iKS5mb3JFYWNoKGVsID0+IHsKCQkJCWVsLmNsYXNzTGlzdC50b2dnbGUoInNlbGVjdGVkIiwgZWwgPT09IHRhcmdldCk7CgkJCQllbC5jbGFzc0xpc3QucmVtb3ZlKCJhc2MiLCAiZGVzYyIpOwoJCQl9KTsKCQkJaWYgKGN1cnJlbnRTb3J0LmVsID09PSB0YXJnZXQpIHsKCQkJCWN1cnJlbnRTb3J0LmRpciA9IChjdXJyZW50U29ydC5kaXIgKyAxKSAlIDM7CgkJCX0gZWxzZSB7CgkJCQljdXJyZW50U29ydC5lbCA9IHRhcmdldDsKCQkJCWN1cnJlbnRTb3J0LmRpciA9IDE7CgkJCX0KCQkJaWYgKGN1cnJlbnRTb3J0LmRpciAhPT0gMCkgewoJCQkJZGlyZWN0aW9uID0gY3VycmVudFNvcnQuZGlyID09PSAxID8gImRlc2MiIDogImFzYyI7CgkJCQljdXJyZW50U29ydC5lbC5jbGFzc0xpc3QuYWRkKGRpcmVjdGlvbik7CgkJCQkkKCIuZ2hzci1hdmF0YXItc29ydCIpLmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uKTsKCQkJfQoJCQlzb3J0KCk7CgkJfSBlbHNlIGlmICh0YXJnZXQubWF0Y2hlcygiLmdoc3Itc29ydC1hdmF0YXIsIC5naHNyLWljb24td3JhcCIpKSB7CgkJCSQoIi5naHNyLXNvcnQtYmxvY2siKS5jbGFzc0xpc3QudG9nZ2xlKCJnaHNyLWlzLWNvbGxhcHNlZCIpOwoJCX0KCX0KCglmdW5jdGlvbiB0b2dnbGVTb3J0QmxvY2soc2hvdykgewoJCWNvbnN0IGJsb2NrID0gJCgiLmdoc3Itc29ydC1ibG9jayIpOwoJCWlmIChibG9jaykgewoJCQlibG9jay5zdHlsZS5kaXNwbGF5ID0gc2hvdyA/ICJibG9jayIgOiAibm9uZSI7CgkJfSBlbHNlIGlmIChzaG93KSB7CgkJCWFkZFNvcnRCbG9jaygpOwoJCX0KCX0KCglmdW5jdGlvbiBhZGRTb3J0QmxvY2soKSB7CgkJY3VycmVudFNvcnQuYnVzeSA9IHRydWU7CgkJY29uc3QgZmlyc3QgPSAkKCIuVGltZWxpbmVJdGVtIik7CgkJaWYgKGZpcnN0KSB7CgkJCWZpcnN0LmNsYXNzTGlzdC5hZGQoImdoc3Itc2tpcC1zb3J0Iik7CgkJCWZpcnN0Lmluc2VydEFkamFjZW50SFRNTCgiYWZ0ZXJFbmQiLCBzb3J0QmxvY2spOwoJCX0KCQljdXJyZW50U29ydC5idXN5ID0gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gaW5pdCgpIHsKCQlpZiAoIWN1cnJlbnRTb3J0LmluaXQpIHsKCQkJR01fYWRkU3R5bGUoYAoJCQkJLmdoc3Itc29ydC1ibG9jayAuY29tbWVudC1ib2R5IHsgcGFkZGluZzogMCAxMHB4OyB9CgkJCQkuZ2hzci1zb3J0LWJsb2NrIC50aW1lbGluZS1jb21tZW50LWhlYWRlciB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQoJCQkJLmdoc3Itc29ydC1ibG9jayAuZW1vamkgeyB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7IHBvaW50ZXItZXZlbnRzOiBub25lOyB9CgkJCQkuZ2hzci1zb3J0LWJsb2NrIC5idG4uYXNjIC5lbW9qaTphZnRlciB7IGNvbnRlbnQ6ICLilrIiOyB9CgkJCQkuZ2hzci1zb3J0LWJsb2NrIC5idG4uZGVzYyAuZW1vamk6YWZ0ZXIgeyBjb250ZW50OiAi4pa8IjsgfQoJCQkJLmdoc3Itc29ydC1hdmF0YXIsIC5naHNyLWljb24td3JhcCB7IGhlaWdodDogNDhweDsgd2lkdGg6IDQ0cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgfQoJCQkJLmdoc3Itc29ydC1hdmF0YXIgeyBiYWNrZ3JvdW5kOiByZ2JhKDEyOCwgMTI4LCAxMjgsIDAuMik7IGJvcmRlcjogIzc3NyAxcHggc29saWQ7IH0KCQkJCS5naHNyLXNvcnQtYXZhdGFyIC5lbW9qaSB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgdG9wOiAtMzZweDsgfQoJCQkJLmdoc3Itc29ydC1hdmF0YXIgc3ZnIHsgcG9pbnRlci1ldmVudHM6IG5vbmU7IH0KCQkJCS5naHNyLXNvcnQtYXZhdGFyLmdoc3Itbm8tc2VsZWN0aW9uIHsgY3Vyc29yOiBwb2ludGVyOyBwYWRkaW5nOiAwIDRweCAwIDA7IH0KCQkJCS5naHNyLXNvcnQtYXZhdGFyLmdoc3Itbm8tc2VsZWN0aW9uIC5lbW9qaSwKCQkJCS5naHNyLXNvcnQtYXZhdGFyLmdoc3Itbm8tc2VsZWN0aW9uIC5idG4sCgkJCQkuZ2hzci1zb3J0LWF2YXRhcjpub3QoLmdoc3Itbm8tc2VsZWN0aW9uKSBzdmcuZ2hzci1zb3J0LWljb24geyBkaXNwbGF5OiBub25lOyB9CgkJCQkuZ2hzci1zb3J0LWF2YXRhciAuYnRuIHsgYm9yZGVyLXJhZGl1czogMjBweDsgd2lkdGg6IDIwcHg7IGhlaWdodDogMjBweDsgcG9zaXRpb246IGFic29sdXRlOyBib3R0b206IC01cHg7IHJpZ2h0OiAtNXB4OyB9CgkJCQkuZ2hzci1zb3J0LWF2YXRhciAuYnRuIHNwYW4geyBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDVweDsgdG9wOiAwOyBwb2ludGVyLWV2ZW50czogbm9uZTsgfQoJCQkJLmdoc3Itc29ydC1hdmF0YXIgLmJ0bi5hc2Mgc3BhbiB7IHRvcDogLTNweDsgfQoJCQkJLmdoc3Itc29ydC1hdmF0YXIgLmJ0biBzcGFuIHN2ZyB7IGhlaWdodDogMTBweDsgd2lkdGg6IDEwcHg7IHZlcnRpY2FsLWFsaWduOiB1bnNldDsgfQoJCQkJLmdoc3Itc29ydC1ibG9jay5naHNyLWlzLWNvbGxhcHNlZCBoMywKCQkJCS5naHNyLXNvcnQtYmxvY2suZ2hzci1pcy1jb2xsYXBzZWQgLnRpbWVsaW5lLWNvbW1lbnQ6YmVmb3JlLAoJCQkJLmdoc3Itc29ydC1ibG9jay5naHNyLWlzLWNvbGxhcHNlZCAudGltZWxpbmUtY29tbWVudDphZnRlciB7IGRpc3BsYXk6IG5vbmU7IH0KCQkJCS5naHNyLXNvcnQtYmxvY2suZ2hzci1pcy1jb2xsYXBzZWQgLnRpbWVsaW5lLWNvbW1lbnQgeyBtYXJnaW46IDEwcHggMDsgfQoJCQkJLmdoc3Itc29ydC1ibG9jay5naHNyLWlzLWNvbGxhcHNlZCAuVGltZWxpbmVJdGVtLWF2YXRhciB7IHRvcDogNnB4OyB9CgkJCWApOwoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJnaG1vOmNvbnRhaW5lciIsIHVwZGF0ZSk7CgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImdobW86Y29tbWVudHMiLCB1cGRhdGUpOwoJCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGluaXRTb3J0KTsKCQkJY3VycmVudFNvcnQuaW5pdCA9IHRydWU7CgkJCXVwZGF0ZSgpOwoJCQkvLyAiTk9ORSIgY2FuIG9ubHkgYmUgc2VlbiBvbiB1c2Vyc2NyaXB0IGluaXQvZmFjdG9yeSByZXNldAoJCQlpZiAoJCgiLmdoc3Itc29ydC1ibG9jayIpICYmIGN1cnJlbnRTb3J0LnR5cGUgIT09ICJOT05FIikgewoJCQkJdXBkYXRlQXZhdGFyKCk7CgkJCX0KCQl9Cgl9CgoJZnVuY3Rpb24gJChzZWxlY3RvciwgZWwpIHsKCQlyZXR1cm4gKGVsIHx8IGRvY3VtZW50KS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKCX0KCglmdW5jdGlvbiAkJChzZWxlY3RvciwgZWwpIHsKCQlyZXR1cm4gWy4uLihlbCB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildOwoJfQoKCWlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAibG9hZGluZyIpIHsKCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgdXBkYXRlLCB7b25jZTogdHJ1ZX0pOwoJfSBlbHNlIHsKCQlpbml0KCk7Cgl9Cn0pKCk7Cg==", 827 + "storage": { 828 + "data": {}, 829 + "ts": 1636665066915 830 + }, 831 + "uuid": "31410fbe-5cc6-4a14-a3f3-339c85f4d804" 832 + }, 833 + { 834 + "enabled": true, 835 + "file_url": "https://raw.githubusercontent.com/Mottie/GitHub-userscripts/master/github-update-fork.user.js", 836 + "name": "GitHub Update Fork", 837 + "options": { 838 + "check_for_updates": true, 839 + "comment": null, 840 + "compat_foreach": false, 841 + "compat_metadata": false, 842 + "compat_powerful_this": null, 843 + "compat_prototypes": false, 844 + "compat_wrappedjsobject": false, 845 + "compatopts_for_requires": true, 846 + "noframes": null, 847 + "override": { 848 + "merge_connects": true, 849 + "merge_excludes": true, 850 + "merge_includes": true, 851 + "merge_matches": true, 852 + "orig_connects": [], 853 + "orig_excludes": [], 854 + "orig_includes": [ 855 + "https://github.com/*" 856 + ], 857 + "orig_matches": [], 858 + "orig_noframes": null, 859 + "orig_run_at": "document-idle", 860 + "use_blockers": [], 861 + "use_connects": [], 862 + "use_excludes": [], 863 + "use_includes": [], 864 + "use_matches": [] 865 + }, 866 + "run_at": null, 867 + "tab_types": null 868 + }, 869 + "position": 16, 870 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIEdpdEh1YiBVcGRhdGUgRm9yawovLyBAdmVyc2lvbiAgICAgMC4yLjAKLy8gQGRlc2NyaXB0aW9uIEEgdXNlcnNjcmlwdCB0aGF0IGFkZHMgYSBsaW5rIHRvIHVwZGF0ZSB5b3VyIGZvcmsKLy8gQGxpY2Vuc2UgICAgIE1JVAovLyBAYXV0aG9yICAgICAgUm9iIEdhcnJpc29uCi8vIEBuYW1lc3BhY2UgICBodHRwczovL2dpdGh1Yi5jb20vTW90dGllCi8vIEBpbmNsdWRlICAgICBodHRwczovL2dpdGh1Yi5jb20vKgovLyBAcnVuLWF0ICAgICAgZG9jdW1lbnQtaWRsZQovLyBAZ3JhbnQgICAgICAgbm9uZQovLyBAaWNvbiAgICAgICAgaHR0cHM6Ly9naXRodWIuZ2l0aHViYXNzZXRzLmNvbS9waW5uZWQtb2N0b2NhdC5zdmcKLy8gQHVwZGF0ZVVSTCAgIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Nb3R0aWUvR2l0SHViLXVzZXJzY3JpcHRzL21hc3Rlci9naXRodWItdXBkYXRlLWZvcmsudXNlci5qcwovLyBAZG93bmxvYWRVUkwgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL01vdHRpZS9HaXRIdWItdXNlcnNjcmlwdHMvbWFzdGVyL2dpdGh1Yi11cGRhdGUtZm9yay51c2VyLmpzCi8vIEBzdXBwb3J0VVJMICBodHRwczovL2dpdGh1Yi5jb20vTW90dGllL0dpdEh1Yi11c2Vyc2NyaXB0cy9pc3N1ZXMKLy8gPT0vVXNlclNjcmlwdD09CigoKSA9PiB7CgkidXNlIHN0cmljdCI7CgoJZnVuY3Rpb24gZ2V0VXBzdHJlYW1CcmFuY2goY29tcGFyZUxpbmssIGluZm8pIHsKCQkvLyBMb29rIGZvciAiY29tbWl0IGJlaGluZCIgb3IgImNvbW1pdHMgYmVoaW5kIgoJCWlmIChjb21wYXJlTGluayAmJiBpbmZvICYmIC9jb21taXRzP1xzYmVoaW5kLy50ZXN0KGluZm8udGV4dENvbnRlbnQpKSB7CgkJCS8vIGZvcmtlZCBmcm9tIGxpbmsgdGV4dCAiOnVzZXIvOnJlcG8iCgkJCWNvbnN0IHJlZ2V4cCA9IC9iZWhpbmRccyooLis6Wy1cdy5dKykvOwoJCQkvLyBUaGUgbWF0Y2ggd2lsbCBpbmNsdWRlIHRoZSBzZW50ZW5jZSBwZXJpb2QgYmVjYXVzZSBicmFuY2ggbmFtZXMgbWF5CgkJCS8vIGluY2x1ZGUgYSB2ZXJzaW9uIG51bWJlciwgZS5nLiAidXNlcjpteS1icmFuY2gtdjEuMCIKCQkJY29uc3QgYnJhbmNoID0gKGluZm8udGV4dENvbnRlbnQubWF0Y2gocmVnZXhwKSB8fCBbXSlbMV07CgkJCXJldHVybiBicmFuY2gKCQkJCT8gYnJhbmNoLnN1YnN0cmluZygwLCBicmFuY2gubGVuZ3RoIC0gMSkKCQkJCTogbnVsbDsKCQl9CgkJcmV0dXJuIG51bGw7Cgl9CgoJZnVuY3Rpb24gZ2V0VXNlckJyYW5jaCgpIHsKCQkvLyBUaGUgYnJhbmNoIHNlbGVjdG9yIG1heSBjb250YWluIGEgdHJ1bmNhdGVkIGJyYW5jaCBuYW1lLCBzbyB1c2UgdGhlIHVybAoJCWNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7CgkJY29uc3QgaW5kZXggPSBwYXRoLmluZGV4T2YoIi90cmVlLyIpOwoJCXJldHVybiBpbmRleCA+IC0xCgkJCT8gcGF0aC5zdWJzdHJpbmcoaW5kZXggKyA2LCBwYXRoLmxlbmd0aCkKCQkJOiAibWFzdGVyIjsKCX0KCglmdW5jdGlvbiBhZGRMaW5rKGNvbXBhcmVMaW5rLCBpbmZvKSB7CgkJY29uc3QgYnJhbmNoID0gZ2V0VXBzdHJlYW1CcmFuY2goY29tcGFyZUxpbmssIGluZm8pOwoJCWlmIChicmFuY2gpIHsKCQkJY29uc3QgdXNlckJyYW5jaCA9IGdldFVzZXJCcmFuY2goKTsKCQkJY29uc3QgcHJMaW5rID0gY29tcGFyZUxpbmsucHJldmlvdXNFbGVtZW50U2libGluZzsKCQkJY29uc3QgbGluayA9IHByTGluay5jbG9uZU5vZGUoKTsKCQkJLy8gaHR0cHM6Ly9naXRodWIuY29tLzxGT1JLPi88UkVQTz4vY29tcGFyZS88QlJBTkNIPi4uLjxTT1VSQ0U+OjxCUkFOQ0g+CgkJCWxpbmsuaHJlZiA9IGAke2NvbXBhcmVMaW5rLmhyZWZ9LyR7dXNlckJyYW5jaH0uLi4ke2JyYW5jaH1gOwoJCQlsaW5rLmNsYXNzTGlzdC5hZGQoImdodWYtdXBkYXRlLWxpbmsiKTsKCQkJbGluay5hcHBlbmRDaGlsZCgkKCJzdmciLCBwckxpbmspLmNsb25lTm9kZSh0cnVlKSk7CgkJCWxpbmsuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiBVcGRhdGUgZm9yayIpKTsKCQkJcHJMaW5rLmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlYmVnaW4iLCBsaW5rKTsKCQl9Cgl9CgoJZnVuY3Rpb24gaW5pdCgpIHsKCQljb25zdCBjb21wYXJlTGluayA9ICQoImFbaHJlZio9J3B1bGwvbmV3J10gKyBhW2hyZWYkPScvY29tcGFyZSddIik7CgkJY29uc3QgaW5mbyA9IGNvbXBhcmVMaW5rPy5jbG9zZXN0KCIuQm94Iik/LmZpcnN0RWxlbWVudENoaWxkOwoJCWlmIChjb21wYXJlTGluayAmJiBpbmZvKSB7CgkJCWFkZExpbmsoY29tcGFyZUxpbmssIGluZm8pOwoJCX0KCX0KCglmdW5jdGlvbiAkKHN0ciwgZWwgPSBkb2N1bWVudCkgewoJCXJldHVybiBlbC5xdWVyeVNlbGVjdG9yKHN0cik7Cgl9CgoJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicGpheDplbmQiLCBpbml0KTsKCWluaXQoKTsKCn0pKCk7Cg==", 871 + "storage": { 872 + "data": {}, 873 + "ts": 1636665106109 874 + }, 875 + "uuid": "20aad555-b97e-4d4a-bfe5-7853897de54d" 876 + }, 877 + { 878 + "enabled": false, 879 + "file_url": "https://raw.githubusercontent.com/Mottie/Github-userscripts/master/github-title-notification.user.js", 880 + "name": "GitHub - Pin Repos to Sidebar", 881 + "options": { 882 + "check_for_updates": false, 883 + "comment": null, 884 + "compat_foreach": false, 885 + "compat_metadata": false, 886 + "compat_powerful_this": null, 887 + "compat_prototypes": false, 888 + "compat_wrappedjsobject": false, 889 + "compatopts_for_requires": true, 890 + "noframes": null, 891 + "override": { 892 + "merge_connects": true, 893 + "merge_excludes": true, 894 + "merge_includes": true, 895 + "merge_matches": true, 896 + "orig_connects": [], 897 + "orig_excludes": [], 898 + "orig_includes": [], 899 + "orig_matches": [ 900 + "http*://github.com/*dashboard", 901 + "http*://github.com/" 902 + ], 903 + "orig_noframes": null, 904 + "orig_run_at": "document-idle", 905 + "use_blockers": [], 906 + "use_connects": [], 907 + "use_excludes": [], 908 + "use_includes": [], 909 + "use_matches": [] 910 + }, 911 + "run_at": null, 912 + "tab_types": null 913 + }, 914 + "position": 17, 915 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgIEdpdEh1YiAtIFBpbiBSZXBvcyB0byBTaWRlYmFyCi8vIEB2ZXJzaW9uICAgICAwLjEuMAovLyBAZGVzY3JpcHRpb24gQSB1c2Vyc2NyaXB0IHRoYXQgYWxsb3dzIHlvdSB0byBwaW4gcmVwb3NpdG9yaWVzIHRvIHRoZSBHaXRIdWIgZGFzaGJvYXJkIHNpZGViYXIKLy8gQGxpY2Vuc2UgICAgIE1JVAovLyBAYXV0aG9yICAgICAgSWFuIENoYW1iZXJsYWluCi8vIEBuYW1lc3BhY2UgICBodHRwczovL2dpdGh1Yi5jb20vaWFuLWgtY2hhbWJlcmxhaW4KLy8gQG1hdGNoICAgICAgIGh0dHAqOi8vZ2l0aHViLmNvbS8qZGFzaGJvYXJkCi8vIEBtYXRjaCAgICAgICBodHRwKjovL2dpdGh1Yi5jb20vCi8vIEBncmFudCAgICAgICBHTV9nZXRWYWx1ZQovLyBAZ3JhbnQgICAgICAgR01fc2V0VmFsdWUKLy8gQGdyYW50ICAgICAgIEdNX2FkZFZhbHVlQ2hhbmdlTGlzdGVuZXIKLy8gQGljb24gICAgICAgIGh0dHBzOi8vZ2l0aHViLmdpdGh1YmFzc2V0cy5jb20vcGlubmVkLW9jdG9jYXQuc3ZnCi8vID09L1VzZXJTY3JpcHQ9PQoKCi8qKgpHZW5lcmFsIFRPRE9TOgogIC0gRE9NIHVwZGF0ZSBhZnRlciBjbGlja2luZyAidW5waW4iCiAgLSB1cGRhdGUgRE9NIGFmdGVyIHVzZXIgY2xpY2tzICJTaG93IG1vcmUiLCBvciB0eXBlcyBpbiBmaWx0ZXIgYm94ICh0byBnZXQgcGluIGJ1dHRvbikKICAtIGdlbmVyYWwgZWZmaWNpZW5jeSwgcHJvYmFibHkgZG9pbmcgd2F5IG1vcmUgZmV0Y2hlcyB0aGFuIG5lZWRlZC4gTWF5YmUgc29tZSBraW5kIG9mIGNhY2hlCiAgLSBmaW5hbGl6ZSA9VXNlclNjcmlwdD0gaGVhZGVyIGFzIG5lZWRlZCwgVVJMcyBldGMuCiovCgooZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbG9jYWxTdG9yYWdlS2V5ID0gJ3Bpbm5lZFJlcG9zJzsKICAgIGNvbnN0IHJlcG9TZWxlY3RvcnMgPSBbJ2xpLnNvdXJjZScsICdsaS5mb3JrJ107CgogICAgZnVuY3Rpb24gbG9nKC4uLmFyZ3MpIHsKICAgICAgICBjb25zdCBkZWJ1Z0xvZ3MgPSBmYWxzZTsKCiAgICAgICAgaWYgKGRlYnVnTG9ncykgewogICAgICAgICAgICBjb25zb2xlLmxvZyguLi5hcmdzKTsKICAgICAgICB9CiAgICB9CgogICAgbGV0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKCiAgICBhc3luYyBmdW5jdGlvbiBnZXRCb29rbWFya0ljb24oZmlsbGVkKSB7CiAgICAgICAgbGV0IGZpbGxlZEJvb2ttYXJrID0gbnVsbDsKICAgICAgICBsZXQgdW5maWxsZWRCb29rbWFyayA9IG51bGw7CgogICAgICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoSWNvbih1cmwsIGZpbGxlZCkgewogICAgICAgICAgICBjb25zdCBtaW1lVHlwZSA9ICdpbWFnZS9zdmcreG1sJzsKCiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgICdBY2NlcHQnOiBtaW1lVHlwZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuaW5nKCdVbmFibGUgdG8gbG9hZCBib29rbWFyayBpY29uJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIGxldCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsIG1pbWVUeXBlKTsKICAgICAgICAgICAgaWYgKGRvYyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm5pbmcoJ1VuYWJsZSB0byBwYXJzZSBib29rbWFyayBpY29uJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2MuZmlyc3RDaGlsZDsKCiAgICAgICAgICAgIGVsZW0uc2V0QXR0cmlidXRlKCd3aWR0aCcsIDE2KTsKICAgICAgICAgICAgZWxlbS5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIDE2KTsKICAgICAgICAgICAgZWxlbS5jbGFzc0xpc3QuYWRkKCdvY3RpY29uJyk7CiAgICAgICAgICAgIGVsZW0uY2xhc3NMaXN0LmFkZChmaWxsZWQgPyAnb2N0aWNvbi1ib29rbWFyay1maWxsJyA6ICdvY3RpY29uLWJvb2ttYXJrJyk7CiAgICAgICAgICAgIGVsZW0uY2xhc3NMaXN0LmFkZChmaWxsZWQgPyAnanMtYm9va21hcmstZmlsbGVkJyA6ICdqcy1ib29rbWFyaycpOwoKICAgICAgICAgICAgcmV0dXJuIGVsZW07CiAgICAgICAgfQoKICAgICAgICBpZiAoZmlsbGVkKSB7CiAgICAgICAgICAgIGlmIChmaWxsZWRCb29rbWFyayA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBmaWxsZWRCb29rbWFyayA9IGF3YWl0IGZldGNoSWNvbignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3ByaW1lci9vY3RpY29ucy9tYWluL2ljb25zL2Jvb2ttYXJrLWZpbGwtMjQuc3ZnJywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZpbGxlZEJvb2ttYXJrLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodW5maWxsZWRCb29rbWFyayA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB1bmZpbGxlZEJvb2ttYXJrID0gYXdhaXQgZmV0Y2hJY29uKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcHJpbWVyL29jdGljb25zL21haW4vaWNvbnMvYm9va21hcmstMjQuc3ZnJywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB1bmZpbGxlZEJvb2ttYXJrLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICB9CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlKCkgewogICAgICAgIGNvbnN0IGNvbnRleHRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5TZWxlY3RNZW51JykuYXR0cmlidXRlcy5zcmMudmFsdWUpOwogICAgICAgIGNvbnN0IHJlcG9Db250ZXh0ID0gY29udGV4dFBhcmFtcy5nZXQoJy9kYXNoYm9hcmQvYWpheF9jb250ZXh0X2xpc3Q/Y3VycmVudF9jb250ZXh0Jyk7CgogICAgICAgIGxvZyhgQ3VycmVudCBkYXNoYm9hcmQgcmVwbyBjb250ZXh0OiAiJHtyZXBvQ29udGV4dH0iYCk7CgogICAgICAgIGNvbnN0IHJlcG9FbGVtU2VsZWN0b3IgPSByZXBvU2VsZWN0b3JzLm1hcChzID0+IGAke3N9IGFgKS5qb2luKCcsJyk7CgogICAgICAgIC8vIFRPRE86IHNob3VsZCB0aGlzIGJlIGluIGFuIGluaXQgZnVuY3Rpb24gaW5zdGVhZCBvZiBoZXJlPwogICAgICAgIGxldCBsb2FkZWRSZXBvRWxlbXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocmVwb0VsZW1TZWxlY3RvcikpOwoKICAgICAgICBhd2FpdCB1cGRhdGVSZXBvRE9NKGxvYWRlZFJlcG9FbGVtcyk7CgogICAgICAgIC8vIGZpbmQgYW5kIGZldGNoIHRoZSAiU2hvdyBtb3JlIiByZXBvcyBiYXNlZCBvbiB0aGUgY29udGV4dAogICAgICAgIGxldCBmZXRjaFVybCA9IG51bGw7CiAgICAgICAgbGV0IHNob3dNb3JlU2VsZWN0b3IgPSAnLmpzLW1vcmUtcmVwb3MtZm9ybSA+IGlucHV0W25hbWU9InlvdXJfcmVwb3NfY3Vyc29yIl0nOwoKICAgICAgICBsZXQgcmVwb3NDdXJzb3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNob3dNb3JlU2VsZWN0b3IpOwogICAgICAgIGlmIChyZXBvc0N1cnNvciA9PSBudWxsKSB7CiAgICAgICAgICAgIHNob3dNb3JlU2VsZWN0b3IgPSAnLmpzLW1vcmUtcmVwb3MtZm9ybSA+IGlucHV0W25hbWU9InJlcG9zX2N1cnNvciJdJzsKCiAgICAgICAgICAgIHJlcG9zQ3Vyc29yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzaG93TW9yZVNlbGVjdG9yKTsKICAgICAgICAgICAgaWYgKHJlcG9zQ3Vyc29yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGluIHVzZXIgY29udGV4dCBhbmQgbmVlZCB0byBsb2FkIG1vcmUgcmVwb3MKICAgICAgICAgICAgICAgIGZldGNoVXJsID0gYC9kYXNoYm9hcmQvYWpheF9yZXBvc2l0b3JpZXM/bG9jYXRpb249Y2VudGVyJmJ1dHRvbj0mcmVwb3NfY3Vyc29yPWA7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBJbiBvcmcgY29udGV4dCwgbG9hZCBtb3JlIHJlcG9zCiAgICAgICAgICAgIGZldGNoVXJsID0gYC9vcmdhbml6YXRpb25zLyR7cmVwb0NvbnRleHR9L2FqYXhfeW91cl9yZXBvcz9pbnB1dF9pZD1vcmctcmVwb3MtZmlsdGVyLXNtJmJ1dHRvbj0meW91cl9yZXBvc19jdXJzb3I9YDsKICAgICAgICB9CgogICAgICAgIGxldCBwaW5uZWRSZXBvSHJlZnMgPSBnZXRQaW5uZWRSZXBvcygpOwoKICAgICAgICAvLyBUT0RPIG1heWJlIGRvIHNvbWUgY2FjaGluZyBvZiB0aGUgcmVzcG9uc2VzLCBidXQgaWRrIGhvdyB3b3J0aCBpdCB0aGF0IGlzLgogICAgICAgIHdoaWxlIChyZXBvc0N1cnNvciAhPSBudWxsKSB7CiAgICAgICAgICAgIGNvbnN0IGN1cnNvclZhbHVlID0gcmVwb3NDdXJzb3IuYXR0cmlidXRlcy52YWx1ZS52YWx1ZTsKCiAgICAgICAgICAgIGxvZyhgRmV0Y2hpbmcgJHtmZXRjaFVybCtjdXJzb3JWYWx1ZX1gKTsKCiAgICAgICAgICAgIGNvbnN0IG1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICJHRVQiLAogICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6ICJpbmNsdWRlIiwKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHsKICAgICAgICAgICAgICAgICAgICAiQWNjZXB0IjogbWltZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgIngtcmVxdWVzdGVkLXdpdGgiOiAiWE1MSHR0cFJlcXVlc3QiLAogICAgICAgICAgICAgICAgICAgICJTZWMtRmV0Y2gtRGVzdCI6ICJlbXB0eSIsCiAgICAgICAgICAgICAgICAgICAgIlNlYy1GZXRjaC1Nb2RlIjogImNvcnMiLAogICAgICAgICAgICAgICAgICAgICJTZWMtRmV0Y2gtU2l0ZSI6ICJzYW1lLW9yaWdpbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZWZlcnJlcjogZG9jdW1lbnQuVVJMLAogICAgICAgICAgICAgICAgbW9kZTogImNvcnMiCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBjb25zdCBuZXh0UmVwb1Jlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmV0Y2hVcmwgKyBjdXJzb3JWYWx1ZSwgcmVxdWVzdFBhcmFtcyk7CgogICAgICAgICAgICBpZiAoIW5leHRSZXBvUmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybmluZygiVW5hYmxlIHRvIGxvYWQgYWxsIHJlcG9zIGZvciB0aGUgY3VycmVudCBkYXNoYm9hcmQiKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxldCB0ZXh0ID0gYXdhaXQgbmV4dFJlcG9SZXNwb25zZS50ZXh0KCk7CiAgICAgICAgICAgIGxldCBuZXh0UmVwb3NEb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsIG1pbWVUeXBlKTsKCiAgICAgICAgICAgIGF3YWl0IHVwZGF0ZVJlcG9ET00oQXJyYXkuZnJvbShuZXh0UmVwb3NEb2MucXVlcnlTZWxlY3RvckFsbChyZXBvRWxlbVNlbGVjdG9yKSkpOwoKICAgICAgICAgICAgcmVwb3NDdXJzb3IgPSBuZXh0UmVwb3NEb2MucXVlcnlTZWxlY3RvcihzaG93TW9yZVNlbGVjdG9yKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0UGlubmVkUmVwb3MoKSB7CiAgICAgICAgY29uc3QgcmVwb3MgPSBKU09OLnBhcnNlKEdNX2dldFZhbHVlKGxvY2FsU3RvcmFnZUtleSwgJ1tdJykpOwogICAgICAgIGxvZyhgUGlubmVkIHJlcG9zIGZyb20gc3RvcmFnZTogJHtyZXBvc31gKTsKICAgICAgICByZXR1cm4gcmVwb3M7CiAgICB9CgogICAgLyoqCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgbGl2ZSBgdWxgIGVsZW1lbnRzIHdoZXJlIHBpbm5lZCByZXBvcyBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAqLwogICAgZnVuY3Rpb24gZmluZE9yQ3JlYXRlUGlubmVkUmVwb0xpc3RzKCkgewogICAgICAgIGxldCBwaW5uZWRSZXBvTGlzdEVsZW1zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnanMtcGlubmVkLXJlcG9zJyk7CgogICAgICAgIGlmIChwaW5uZWRSZXBvTGlzdEVsZW1zLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIGxldCBwaW5uZWRSZXBvTGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3VsJyk7CgogICAgICAgICAgICAvLyBmb3IgZGVidWdnaW5nIGFuZCBmaW5kaW5nIHRvIGFkZCByZXBvcyB0byBpdCBsYXRlcjoKICAgICAgICAgICAgcGlubmVkUmVwb0xpc3QuY2xhc3NMaXN0LmFkZCgnanMtcGlubmVkLXJlcG9zJyk7CgogICAgICAgICAgICAvLyBGb3Igc3R5bGUgbWF0Y2hpbmcgd2l0aCBvdGhlciB1bCBmb3IgcmVwb3M6CiAgICAgICAgICAgIHBpbm5lZFJlcG9MaXN0LmNsYXNzTGlzdC5hZGQoJ2xpc3Qtc3R5bGUtbm9uZScpOwogICAgICAgICAgICBwaW5uZWRSZXBvTGlzdC5jbGFzc0xpc3QuYWRkKCdtdC1tZC0zJyk7CiAgICAgICAgICAgIHBpbm5lZFJlcG9MaXN0LmNsYXNzTGlzdC5hZGQoJ21iLW1kLTMnKTsKCiAgICAgICAgICAgIGZvciAobGV0IHJlcG9zRmlsdGVyIG9mIFsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoYm9hcmQtcmVwb3MtZmlsdGVyLWxlZnQnKSwKICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcmctcmVwb3MtZmlsdGVyLXNtJyksCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3JnLXJlcG9zLWZpbHRlci14bCcpLAogICAgICAgICAgICBdKSB7CiAgICAgICAgICAgICAgICBpZiAocmVwb3NGaWx0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJlcG9zRmlsdGVyLnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKHBpbm5lZFJlcG9MaXN0LmNsb25lTm9kZSh0cnVlKSwgcmVwb3NGaWx0ZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnanMtcGlubmVkLXJlcG9zJyk7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUmVwb0RPTShuZXdSZXBvRWxlbWVudHMpIHsKICAgICAgICBsZXQgcGlubmVkUmVwb0hyZWZzID0gZ2V0UGlubmVkUmVwb3MoKTsKCiAgICAgICAgbGV0IHBpbm5lZFJlcG9MaXN0cyA9IGZpbmRPckNyZWF0ZVBpbm5lZFJlcG9MaXN0cygpOwoKICAgICAgICBmb3IgKGNvbnN0IHJlcG9FbGVtIG9mIG5ld1JlcG9FbGVtZW50cykgewogICAgICAgICAgICBsZXQgcGFyZW50ID0gcmVwb0VsZW0ucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgbGV0IGNoaWxkRGl2ID0gbnVsbDsKCiAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQudGFnTmFtZSAhPT0gJ0xJJykgewogICAgICAgICAgICAgICAgY2hpbGREaXYgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY29uc3QgaHJlZiA9IHJlcG9FbGVtLmF0dHJpYnV0ZXMuaHJlZi52YWx1ZTsKCiAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY29uc3QgaXNQaW5uZWQgPSBwaW5uZWRSZXBvSHJlZnMuaW5jbHVkZXMoaHJlZik7CgogICAgICAgICAgICAgICAgaWYgKHBhcmVudC5xdWVyeVNlbGVjdG9yKCcgYnV0dG9uLmpzLXJlcG8tcGluJykgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGxldCBwaW5CdXR0b24gPSBhd2FpdCBidWlsZFBpbkJ1dHRvbihpc1Bpbm5lZCk7CgogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZERpdiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkRGl2LmFwcGVuZENoaWxkKHBpbkJ1dHRvbik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHBpbkJ1dHRvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5jbGFzc0xpc3QuYWRkKCdkLWZsZXgnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGlzUGlubmVkKSB7CiAgICAgICAgICAgICAgICAgICAgbG9nKGBQaW5uaW5nIHJlcG8gJyR7aHJlZn0nYCk7CiAgICAgICAgICAgICAgICAgICAgLy8gVGFrZSBpdCBvdXQgb2YgdGhlICJ1bnBpbm5lZCIgbGlzdAogICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcmVwb0xpc3Qgb2YgcGlubmVkUmVwb0xpc3RzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXBvTGlzdC5xdWVyeVNlbGVjdG9yKGBsaSBhW2hyZWY9JyR7aHJlZn0nXWApID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9MaXN0LmFwcGVuZENoaWxkKHBhcmVudC5jbG9uZU5vZGUodHJ1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBQcm9iYWJseSBhbHNvIG5lZWQgdG8gcmVtb3ZlKCkgaGVyZSBpZiBpdCdzIGluIHRoZSBwaW4gbGlzdAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGxldCBlbGVtIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvbi5qcy1yZXBvLXBpbicpKSB7CiAgICAgICAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVQaW5DbGljayk7CiAgICAgICAgfQogICAgfQoKICAgIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkUGluQnV0dG9uKHBpbm5lZCkgewogICAgICAgIGxldCB1bnBpbkxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICB1bnBpbkxpbmsuY2xhc3NMaXN0LmFkZCgnanMtcmVwby1waW4nKTsKICAgICAgICB1bnBpbkxpbmsuY2xhc3NMaXN0LmFkZCgnY29sb3ItZmctZGVmYXVsdCcpOwogICAgICAgIHVucGluTGluay5jbGFzc0xpc3QuYWRkKCdidG4tbGluaycpOwogICAgICAgIHVucGluTGluay5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ21hcmdpbi1sZWZ0OiBhdXRvOycpOwoKICAgICAgICBsZXQgcGlubmVkSWNvbiA9IGF3YWl0IGdldEJvb2ttYXJrSWNvbih0cnVlKTsKICAgICAgICBsZXQgdW5waW5uZWRJY29uID0gYXdhaXQgZ2V0Qm9va21hcmtJY29uKGZhbHNlKTsKCiAgICAgICAgaWYgKHBpbm5lZCkgewogICAgICAgICAgICB1bnBpbkxpbmsuY2xhc3NMaXN0LmFkZCgnanMtcGlubmVkLXJlcG8nKTsKICAgICAgICAgICAgdW5waW5uZWRJY29uLnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVucGluTGluay5jbGFzc0xpc3QuYWRkKCdqcy11bnBpbm5lZC1yZXBvJyk7CiAgICAgICAgICAgIHBpbm5lZEljb24uc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7CiAgICAgICAgfQoKICAgICAgICB1bnBpbkxpbmsuYXBwZW5kQ2hpbGQocGlubmVkSWNvbik7CiAgICAgICAgdW5waW5MaW5rLmFwcGVuZENoaWxkKHVucGlubmVkSWNvbik7CgogICAgICAgIHJldHVybiB1bnBpbkxpbms7CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlUGluQ2xpY2soZXZlbnQpIHsKICAgICAgICBsZXQgZWxlbSA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7CgogICAgICAgIGxldCByZXBvID0gZWxlbS5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3IoJ2EnKTsKICAgICAgICBpZiAocmVwbyA9PSBudWxsKSB7CiAgICAgICAgICAgIGxvZygnRmFpbGVkIHRvIGZpbmQgcmVwbyBmb3IgY2xpY2tlZCBidXR0b24nKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG9nKGBQaW4gbGluayBjbGlja2VkOiAke3JlcG8uYXR0cmlidXRlcy5ocmVmLnZhbHVlfWApOwogICAgICAgIH0KCiAgICAgICAgbGV0IHBpbm5lZEljb24gPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2Zy5qcy1ib29rbWFyay1maWxsZWQnKTsKICAgICAgICBsZXQgdW5waW5uZWRJY29uID0gZWxlbS5xdWVyeVNlbGVjdG9yKCdzdmcuanMtYm9va21hcmsnKTsKCiAgICAgICAgY29uc3Qgd2FzVW5waW5uZWQgPSBlbGVtLmNsYXNzTGlzdC5yZXBsYWNlKCdqcy11bnBpbm5lZC1yZXBvJywgJ2pzLXBpbm5lZC1yZXBvJyk7CgogICAgICAgIGlmICh3YXNVbnBpbm5lZCkgewogICAgICAgICAgICB1bnBpbm5lZEljb24uc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAnJyk7CiAgICAgICAgICAgIHBpbm5lZEljb24ucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTsKCiAgICAgICAgICAgIGF3YWl0IGhhbmRsZVBpblJlcG8ocmVwbyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWxlbS5jbGFzc0xpc3QucmVwbGFjZSgnanMtcGlubmVkLXJlcG8nLCAnanMtdW5waW5uZWQtcmVwbycpOwoKICAgICAgICAgICAgcGlubmVkSWNvbi5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICcnKTsKICAgICAgICAgICAgdW5waW5uZWRJY29uLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7CgogICAgICAgICAgICBhd2FpdCBoYW5kbGVVbnBpblJlcG8ocmVwbyk7CiAgICAgICAgfQoKICAgICAgICBhd2FpdCB1cGRhdGUoKTsKICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVQaW5SZXBvKHJlcG8pIHsKICAgICAgICBjb25zdCBocmVmID0gcmVwby5hdHRyaWJ1dGVzLmhyZWYudmFsdWU7CgogICAgICAgIGxldCBwaW5uZWRSZXBvcyA9IGdldFBpbm5lZFJlcG9zKCk7CgogICAgICAgIGlmICghcGlubmVkUmVwb3MuaW5jbHVkZXMoaHJlZikpIHsKICAgICAgICAgICAgcGlubmVkUmVwb3MucHVzaChocmVmKTsKICAgICAgICAgICAgR01fc2V0VmFsdWUobG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShwaW5uZWRSZXBvcykpOwogICAgICAgIH0KICAgIH0KCiAgICBhc3luYyBmdW5jdGlvbiBoYW5kbGVVbnBpblJlcG8ocmVwbykgewogICAgICAgIGNvbnN0IHJlcG9IcmVmID0gcmVwby5hdHRyaWJ1dGVzLmhyZWYudmFsdWU7CiAgICAgICAgbGV0IHBpbm5lZFJlcG9zID0gZ2V0UGlubmVkUmVwb3MoKS5maWx0ZXIoaHJlZiA9PiBocmVmICE9PSByZXBvSHJlZik7CiAgICAgICAgR01fc2V0VmFsdWUobG9jYWxTdG9yYWdlS2V5LCBKU09OLnN0cmluZ2lmeShwaW5uZWRSZXBvcykpOwogICAgfQoKICAgIGZ1bmN0aW9uIHdhaXRGb3JFbGVtZW50KHNlbGVjdG9yLCBjYWxsYmFjaykgewogICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkgewogICAgICAgICAgICBjYWxsYmFjaygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvZyhgRWxlbWVudCAnJHtzZWxlY3Rvcn0nIG5vdCBmb3VuZCwgd2FpdGluZyAzMDBtc2ApOwoKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB3YWl0Rm9yRWxlbWVudChzZWxlY3RvciwgY2FsbGJhY2spOwogICAgICAgICAgICB9LCAzMDApOwogICAgICAgIH0KICAgIH0KCiAgICAvLyBXYWl0IGZvciB0aGUgcmVwb3MgdG8gYmUgcG9wdWxhdGVkIGluIHRoZSBzaWRlYmFyIGJlZm9yZSB0cnlpbmcgdG8gdXBkYXRlIHRoZSBET00KICAgIHdhaXRGb3JFbGVtZW50KHJlcG9TZWxlY3RvcnMuam9pbignLCcpLCB1cGRhdGUpOwoKICAgIEdNX2FkZFZhbHVlQ2hhbmdlTGlzdGVuZXIobG9jYWxTdG9yYWdlS2V5LCBhc3luYyAobmFtZSwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUsIHJlbW90ZSkgPT4gYXdhaXQgdXBkYXRlKCkpOwp9KSgpOw==", 916 + "storage": { 917 + "data": { 918 + "pinnedRepos": "s[\"/mistsys/mist_go_utils\",\"/mistsys/mist-ap\",\"/corewa-rs/corewars\",\"/mistsys/mist-agent-go\",\"/128technology/rules_128tech\",\"/mistsys/demoapi\",\"/ian-h-chamberlain/dotfiles\",\"/Meziu/ctru-rs\",\"/Meziu/rust-linker-fix-3ds\",\"/Meziu/rust-horizon\",\"/Meziu/cargo-3ds\",\"/corewa-rs/vscode-redcode\",\"/Juniper-SSN/ssr\",\"/ian-h-chamberlain/docker-rust-devkitarm\"]" 919 + }, 920 + "ts": 1650393027096 921 + }, 922 + "uuid": "c8c37d2c-a4d8-4ddd-accd-51cc5f2ea6a4" 923 + }, 924 + { 925 + "enabled": true, 926 + "name": "Openstack Firefox Console Fixer", 927 + "options": { 928 + "check_for_updates": false, 929 + "comment": null, 930 + "compat_foreach": false, 931 + "compat_metadata": false, 932 + "compat_powerful_this": null, 933 + "compat_prototypes": false, 934 + "compat_wrappedjsobject": false, 935 + "compatopts_for_requires": true, 936 + "noframes": null, 937 + "override": { 938 + "merge_connects": true, 939 + "merge_excludes": true, 940 + "merge_includes": true, 941 + "merge_matches": true, 942 + "orig_connects": [], 943 + "orig_excludes": [], 944 + "orig_includes": [], 945 + "orig_matches": [ 946 + "https://spaceport.lab.128technology.com:6082/spice_auto.html*" 947 + ], 948 + "orig_noframes": null, 949 + "orig_run_at": "document-idle", 950 + "use_blockers": [], 951 + "use_connects": [], 952 + "use_excludes": [], 953 + "use_includes": [], 954 + "use_matches": [] 955 + }, 956 + "run_at": null, 957 + "tab_types": null, 958 + "unwrap": null 959 + }, 960 + "position": 18, 961 + "source": "Ly8gPT1Vc2VyU2NyaXB0PT0KLy8gQG5hbWUgICAgICAgICBPcGVuc3RhY2sgRmlyZWZveCBDb25zb2xlIEZpeGVyCi8vIEBuYW1lc3BhY2UgICAgaHR0cHM6Ly9naXRodWIuY29tL2lhbi1oLWNoYW1iZXJsYWluCi8vIEB2ZXJzaW9uICAgICAgMC4xCi8vIEBkZXNjcmlwdGlvbiAgRml4IGEgaG9ycmlibGUgb3BlbnN0YWNrIGJ1ZyBieSBpbmplY3Rpbmcgc29tZSBrZXljb2RlcyBmb3IgRmlyZWZveAovLyBAYXV0aG9yICAgICAgIElhbiBDaGFtYmVybGFpbiAoR2l0SHViIEBpYW4taC1jaGFtYmVybGFpbikKLy8gQG1hdGNoICAgICAgICBodHRwczovL3NwYWNlcG9ydC5sYWIuMTI4dGVjaG5vbG9neS5jb206NjA4Mi9zcGljZV9hdXRvLmh0bWwqCi8vIEBpY29uICAgICAgICAgaHR0cHM6Ly9zcGFjZXBvcnQubGFiLjEyOHRlY2hub2xvZ3kuY29tL3N0YXRpYy9kYXNoYm9hcmQvaW1nL2Zhdmljb24uaWNvCi8vIEBncmFudCAgICAgICAgbm9uZQovLyA9PS9Vc2VyU2NyaXB0PT0KCihmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBpZiAodHlwZW9mIGZpcmVmb3hfc2Nhbm1hcCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvLyBGaXJlZm94IHNlZW1zIHRvIHNlbmQgMjI0IHdoZXRoZXIgdGhlIGxlZnQgb3IgcmlnaHQg4oyYIGtleSBpcyBwcmVzc2VkCiAgICAgICAgLy8gVmFsdWUgZnJvbSBodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvc3BpY2Uvc3BpY2UtaHRtbDUvLS9ibG9iL3NwaWNlLWh0bWw1LTAuMS43L3V0aWxzLmpzI0wyMTAKICAgICAgICBmaXJlZm94X3NjYW5tYXBbMjI0XSA9IDB4RTA1QjsgLy8gS0VZX0xNZXRhCgogICAgICAgIC8vIEVuYWJsZSBudW1sb2NrLCBmb3Igc29tZSByZWFzb24gdGhpcyBkb2Vzbid0IHdvcmsgYnkgZGVmYXVsdC4gTWF5YmUgYmVjYXVzZSBpdCBzZW5kcyBhIEtleV9DTEVBUiBpbnN0ZWFkPwogICAgICAgIGZpcmVmb3hfc2Nhbm1hcFsxMl0gPSBLRVlfTnVtTG9jazsKICAgIH0KfSkoKTs=", 962 + "storage": { 963 + "data": {}, 964 + "ts": 1656605726968 965 + }, 966 + "uuid": "ed158b6e-8995-48a5-8a2a-2e63f4546680" 748 967 } 749 - ] 968 + ], 969 + "version": "1" 750 970 }
+3
.config/vscode/extensions.txt
··· 30 30 haskell.haskell@2.2.0 31 31 IBM.output-colorizer@0.1.2 32 32 iliazeus.vscode-ansi@1.1.2 33 + iocave.customize-ui@0.1.63 34 + iocave.monkey-patch@0.1.19 33 35 janjoerke.jenkins-pipeline-linter-connector@1.2.0 34 36 jasonnutter.vscode-codeowners@1.1.1 35 37 jbenden.c-cpp-flylint@1.11.0 36 38 jeff-hykin.better-cpp-syntax@1.15.13 37 39 jinliming2.vscode-go-template@0.2.1 40 + josetr.cmake-language-support-vscode@0.0.4 38 41 joshuapoehls.json-escaper@1.1.2 39 42 justusadam.language-haskell@3.6.0 40 43 korekontrol.saltstack@0.0.9
+3 -1
.config/yadm/alt/.gitconfig.local##class.work,hostname.juniper
··· 6 6 [gpg] 7 7 program = pinentry-mac 8 8 [url "git@github.com:mistsys"] 9 - insteadOf = https://github.com/mistsys 9 + insteadOf = https://github.com/mistsys 10 + [url "git@github.com:Juniper-SSN"] 11 + insteadOf = https://github.com/Juniper-SSN
.config/yadm/alt/.ssh/known_hosts##class.work

This is a binary file and will not be displayed.

+2
.cspell/default.txt
··· 43 43 globbing 44 44 gltf 45 45 gopackagesdriver 46 + gopls 46 47 hacky 47 48 hmac 48 49 htop ··· 90 91 noarch 91 92 nolint 92 93 NordVPN 94 + noreplace 93 95 NPM 94 96 npmrc 95 97 nvim
+4 -1
.gitconfig
··· 19 19 default-branch = !git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@' 20 20 branch-clean = !git branch --merged origin/\"$(git default-branch)\" | egrep -v \"[*+]|$(git default-branch)\\$\" | xargs -n 1 git branch --delete 21 21 alias = "!sh -c '[ $# = 2 ] && git config --global alias.\"$1\" \"$2\" && exit 0 || echo \"usage: git alias <new alias> <original command>\" >&2 && exit 1' -" 22 - aliases = !git config --get-regexp 'alias.*' | sed -E 's/alias\\.([^[:space:]]+)[[:space:]](.+)/[\\1]'$'\\\\\\n'' \\2/' 22 + aliases = "!echo [alias]; git config --get-regexp 'alias[.].*' | sed -E 's/alias[.]([^[:space:]]+)/\t\\1 =/'" 23 23 bc = branch-clean 24 24 bpull = !sh -c 'git fetch origin $1:$1' - 25 25 vdiff = difftool -d HEAD ··· 30 30 # Helpers for quoting/unquoting git aliases, from https://stackoverflow.com/questions/38057261/git-config-alias-escaping 31 31 quote-string = "!read -r l; printf \\\"!; printf %s \"$l\" | sed 's/\\([\\\"]\\)/\\\\\\1/g'; printf \" #\\\"\\n\" #" 32 32 quote-string-undo = "!read -r l; printf %s \"$l\" | sed 's/\\\\\\([\\\"]\\)/\\1/g'; printf \"\\n\" #" 33 + assign-pr = "!f() { git config branch.\"$1\".github-pr-owner-number \"$(git remote get-url origin | sed -E \"s#.*github[.]com[/:]([^.]+)([.]git)?#\\1#\" | tr \"/\" \"#\")#$2\"; }; f" 34 + git = !git 33 35 [core] 34 36 excludesfile = ~/.gitignore_global 35 37 editor = vim ··· 51 53 [push] 52 54 # Override 'submodule.recurse' to make rpush work without warnings 53 55 recurseSubmodules = no 56 + autoSetupRemote = true 54 57 [pull] 55 58 rebase = false 56 59 [commit]
+5 -2
.lnav/formats/installed/128t_log.json
··· 6 6 "url": "https://www.128technology.com", 7 7 "regex": { 8 8 "startup": { 9 - "pattern": "^(?<timestamp>[A-Za-z]{3} \\d{1,2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}) (?<category>[A-Z]+)\\s*set to (?<level>[A-Z]+).*" 9 + "pattern": "^(?<timestamp>[A-Za-z]{3} \\d{1,2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}) (?<category>[A-Z]+)\\s*set to (?<level>[A-Za-z]+).*" 10 10 }, 11 11 "basic": { 12 - "pattern": "^(?<timestamp>[A-Za-z]{3} \\d{1,2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}) \\[(?<category>[A-Z]+)\\s*\\|\\s*(?<subcat>[A-Z]+|--)\\s*\\] (?<level>[A-Z]+)\\s*\\((?<process>[-a-zA-Z0-9]+)\\s*\\) (?<body>.*)" 12 + "pattern": "^(?<timestamp>[A-Za-z]{3} \\d{1,2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}) \\[(?<category>[A-Z]+)\\s*\\|\\s*(?<subcat>[A-Z]+|--)\\s*\\] (?<level>[A-Z]+)\\s*\\((?<process>[-a-zA-Z0-9 ]+)\\s*\\) (?<body>.*)" 13 13 } 14 14 }, 15 + "file-pattern": "(accessManager|analyticsReporter|auditdReceiver|automatedProvisioner|configDirector|conflux|databaseQueryCoordinator|dnsManager|dynamicPeerUpdateManager|highwayPlatform|influx_clean|influx_configure|influx_sync|influxdb|influxdb_http(-[0-9]+)?|inspectorCheckResult|minionWatchdog|nodeMonitor|pdmTransportAgent|persistentDataManager|processManager|processes|rappidDownloader|saltEventPublisher|saltMasterProcess|secureCommunicationManager|securityKeyManager|snmpTrapAgent|stateMonitor|stepRepository|systemServicesCoordinator|tank_clean|t128-analytics|tsi-after|tsi-before|tunnelProcesses|web-server([0-9]+)?|yin-and-friends|zookeeperServer)([.][0-9]+)?[.]log([.][0-9]+)?$", 15 16 "timestamp-format": [ 16 17 "%b %d %k:%M:%S.%L" 17 18 ], ··· 61 62 "pattern": "^(?<timestamp>[A-Za-z]{3} \\d{1,2} \\d{2}:\\d{2}:\\d{2}\\.\\d{3}) (?<level>[A-Z]+)\\s*(?<body>.*) \\[(?<module>[a-z_]+):(?<lineno>\\d+)\\] \\((?<thread>[A-Za-z0-9_-]+)\\)" 62 63 } 63 64 }, 65 + "file-pattern": "pcli[.]log([.][0-9]+)?$", 64 66 "timestamp-format": [ 65 67 "%b %d %k:%M:%S.%L" 66 68 ], ··· 107 109 "pattern": "^(?<timestamp>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\,\\d{3}):\\s*(?<level>[A-Z]+)\\s*-\\s*(?<body>.*)$" 108 110 } 109 111 }, 112 + "file-pattern": "(installer|initializer|tmux_wrapper)([.][0-9]+)?[.]log$", 110 113 "timestamp-format": [ 111 114 "%Y-%m-%d %k:%M:%S,%L" 112 115 ],
+3 -2
.lnav/formats/installed/minion_log.json .lnav/formats/installed/salt.json
··· 1 1 { 2 2 "$schema": "https://lnav.org/schemas/format-v1.schema.json", 3 3 "minion_log": { 4 - "title": "Salt Minion Log", 5 - "description": "Log format generated by salt-minion", 4 + "title": "Salt Minion/Master Log", 5 + "description": "Log format generated by salt", 6 6 "url": "https://www.saltstack.com/", 7 7 "regex": { 8 8 "basic": { 9 9 "pattern": "(?P<timestamp>\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d{3}) \\[(?P<module>[a-zA-Z0-9._]+)\\s*:(?P<lineno>\\d+)\\s*\\]\\[(?P<level>[A-Z]+)\\s*\\]\\[(?P<pid>\\d+)\\] (?P<body>(.|\\n)*)" 10 10 } 11 11 }, 12 + "file-pattern": "(minion|master|saltMaster[.]log)(-[0-9]+)?$", 12 13 "timestamp-format": [ 13 14 "%Y-%m-%d %k:%M:%S,%L" 14 15 ],
.ssh/config

This is a binary file and will not be displayed.

+48 -18
Library/Application Support/Code/User/keybindings.json
··· 303 303 "when": "inQuickOpen", 304 304 }, 305 305 { 306 + "key": "escape", 307 + "command": "hideSuggestWidget", 308 + "when": "neovim.mode == 'normal' && suggestWidgetVisible", 309 + }, 310 + { 306 311 "key": "cmd+/", 307 312 "command": "vscode-neovim.send", 308 313 "when": "editorTextFocus && neovim.init && neovim.mode != 'insert'", ··· 318 323 { 319 324 "key": "cmd+c", 320 325 "command": "vscode-neovim.send", 321 - "when": "editorTextFocus && neovim.mode == 'visual'", 326 + "when": "editorTextFocus && neovim.init && neovim.mode == 'visual'", 322 327 "args": "\"+ygv", 323 328 }, 324 329 { 325 330 "key": "cmd+c", 326 331 "command": "-vscode-neovim.send", 327 - "when": "neovim.mode != 'visual'", 332 + "when": "neovim.init && neovim.mode != 'visual'", 328 333 }, 329 334 { 330 335 "key": "cmd+v", 331 336 "command": "vscode-neovim.send", 332 - "when": "editorTextFocus && !neovim.recording && neovim.mode != 'insert'", 337 + "when": "editorTextFocus && neovim.init && !neovim.recording && neovim.mode != 'insert'", 333 338 "args": "\"+p", 334 339 }, 335 340 // Pass through cmd+shift+p since neovim defaults binding ctrl+p 336 341 { 337 342 "key": "cmd+shift+p", 338 343 "command": "vscode-neovim.send", 339 - "when": "editorTextFocus && neovim.mode == 'visual'", 344 + "when": "editorTextFocus && neovim.init && neovim.mode == 'visual'", 340 345 "args": "<C-S-P>", 341 346 }, 342 347 // The below keybinds have !isInDiffEditor to allow rebinding for diff mode ··· 344 349 "key": "n", 345 350 "command": "vscode-neovim.send", 346 351 "args": "n", 347 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 352 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 348 353 }, 349 354 { 350 355 "key": "p", 351 356 "command": "vscode-neovim.send", 352 357 "args": "p", 353 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 358 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 354 359 }, 355 360 { 356 361 "key": "j", 357 362 "command": "vscode-neovim.send", 358 363 "args": "j", 359 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 364 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 360 365 }, 361 366 { 362 367 "key": "k", 363 368 "command": "vscode-neovim.send", 364 369 "args": "k", 365 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 370 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 366 371 }, 367 372 { 368 373 "key": "m", 369 374 "command": "vscode-neovim.send", 370 375 "args": "m", 371 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 376 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 372 377 }, 373 378 { 374 379 "key": "shift+d", 375 380 "command": "vscode-neovim.send", 376 381 "args": "<S-d>", 377 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 382 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 378 383 }, 379 384 { 380 385 "key": "shift+e", 381 386 "command": "vscode-neovim.send", 382 387 "args": "<S-e>", 383 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 388 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 384 389 }, 385 390 { 386 391 "key": "shift+e", 387 392 "command": "vscode-neovim.send", 388 393 "args": "<S-e>", 389 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 394 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 390 395 }, 391 396 { 392 397 "key": "[", 393 398 "command": "vscode-neovim.send", 394 399 "args": "[", 395 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 400 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 396 401 }, 397 402 { 398 403 "key": "shift+[", 399 404 "command": "vscode-neovim.send", 400 405 "args": "{", 401 - "when": "editorTextFocus && neovim.mode != 'insert' && !isInDiffEditor", 406 + "when": "editorTextFocus && neovim.init && neovim.mode != 'insert' && !isInDiffEditor", 402 407 }, 403 408 404 409 // Find + replace keybinds, required to send selection back to VSCode ··· 421 426 "key": "cmd+f", 422 427 "command": "vscode-neovim.send", 423 428 "args": "\\f", 424 - "when": "editorTextFocus && neovim.mode == 'visual'" 429 + "when": "editorTextFocus && neovim.init && neovim.mode == 'visual'" 425 430 }, 426 431 { 427 432 "key": "cmd+r", ··· 437 442 "key": "cmd+r", 438 443 "command": "vscode-neovim.send", 439 444 "args": "\\r", 440 - "when": "editorTextFocus && neovim.mode == 'visual'" 445 + "when": "editorTextFocus && neovim.init && neovim.mode == 'visual'" 441 446 }, 442 447 443 448 // // Rebind findNext and findPrev so that neovim cursor will move ··· 463 468 // "when": "editorFocus && findInputFocussed && neovim.mode != 'insert'" 464 469 // }, 465 470 471 + // These up/down bindings are a total PITA due to 472 + // https://github.com/microsoft/vscode/issues/91473 466 473 { 467 474 "key": "up", 468 475 "command": "-vscode-neovim.send", 469 - "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && (neovim.recording || editorTextFocus && neovim.init && neovim.mode != 'insert')", 476 + }, 477 + { 478 + "key": "up", 479 + "command": "vscode-neovim.send", 480 + "when": "!suggestWidgetVisible && neovim.recording || !suggestWidgetVisible && editorTextFocus && neovim.init && neovim.mode != 'insert'", 481 + "args": "<Up>", 470 482 }, 471 483 { 472 484 "key": "down", 473 485 "command": "-vscode-neovim.send", 474 - "when": "suggestWidgetMultipleSuggestions && suggestWidgetVisible && (neovim.recording || editorTextFocus && neovim.init && neovim.mode != 'insert')", 486 + }, 487 + { 488 + "key": "down", 489 + "command": "vscode-neovim.send", 490 + "when": "!suggestWidgetVisible && neovim.init && neovim.recording || !suggestWidgetVisible && editorTextFocus && neovim.init && neovim.mode != 'insert'", 491 + "args": "<Down>", 492 + }, 493 + // dang, yo: these would be nice to work, but https://github.com/microsoft/vscode/issues/98479 494 + { 495 + "key": "up", 496 + "command": "vscode-neovim.send-cmdline", 497 + "when": "neovim.mode == 'cmdline_insert' || neovim.mode == 'cmdline_normal' || neovim.mode == 'cmdline_replace'", 498 + "args": "<Up>" 499 + }, 500 + { 501 + "key": "down", 502 + "command": "vscode-neovim.send-cmdline", 503 + "when": "neovim.mode == 'cmdline_insert' || neovim.mode == 'cmdline_normal' || neovim.mode == 'cmdline_replace'", 504 + "args": "<Down>" 475 505 }, 476 506 // ========================================================================= 477 507 // End bindings for vscode-neovim
+76 -25
Library/Application Support/Code/User/settings.json
··· 48 48 }, 49 49 "[markdown]": { 50 50 "editor.wordWrap": "on", 51 - "editor.quickSuggestions": false, 51 + "editor.quickSuggestions": { 52 + "comments": "off", 53 + "strings": "off", 54 + "other": "off" 55 + }, 52 56 "editor.tabSize": 2, 53 57 }, 54 58 "[org]": { ··· 114 118 "atlascode.jira.todoIssues.enabled": true, 115 119 "atlascode.outputLevel": "debug", 116 120 117 - "bazel.buildifierExecutable": "/usr/local/bin/buildifier", 118 - "bazel.buildifierFixOnFormat": false, 121 + "bazel.buildifierFixOnFormat": true, 119 122 "bazel.executable": "/usr/local/bin/bazelisk", 120 123 "bazel.enableCodeLens": true, 121 124 ··· 222 225 ], 223 226 "cSpell.showStatus": false, 224 227 "cSpell.useGitignore": true, 228 + "cSpell.diagnosticLevel": "Hint", 229 + 230 + "customizeUI.font.monospace": "Input Mono", 231 + "customizeUI.fontSizeMap": { 232 + "monospace": "11px", 233 + }, 234 + "customizeUI.stylesheet": { 235 + ".monaco-workbench .part>.content code": { 236 + "font-size": "11px !important", 237 + }, 238 + ".monaco-workbench .part>.content .tiw-metadata-value": { 239 + "font-size": "11px !important", 240 + }, 241 + ".monaco-workbench .part>.content .monaco-tokenized-source": { 242 + "font-size": "11px !important", 243 + }, 244 + ".comment-body pre *": { 245 + "font-size": "11px !important", 246 + "font-family": "'Input Mono' !important", 247 + }, 248 + ".comment-body code *": { 249 + "font-size": "11px !important", 250 + "font-family": "'Input Mono' !important", 251 + }, 252 + ".comment-body .diff *": { 253 + "font-size": "11px !important", 254 + "font-family": "'Input Mono' !important", 255 + }, 256 + }, 225 257 226 258 "debug.internalConsoleOptions": "openOnSessionStart", 227 259 "debug.console.historySuggestions": false, ··· 237 269 "editor.fontSize": 11, 238 270 "editor.fontWeight": "100", 239 271 "editor.inlayHints.enabled": "onUnlessPressed", 240 - "editor.bracketPairColorization.enabled": false, 241 272 "editor.minimap.showSlider": "always", 242 273 "editor.multiCursorModifier": "alt", 243 274 "editor.renderControlCharacters": true, ··· 286 317 "semicolon.injected:rust": "#F8F8F2", 287 318 "unresolvedReference.injected:rust": "#F8F8F2", 288 319 289 - 290 320 "keywordNameCall:robotframework": "#A6E22E", 291 321 292 - "tomlArrayKey:toml": "#F92672", 322 + "tomlArrayKey:toml": { 323 + "foreground": "#F92672", 324 + "italic": false 325 + }, 293 326 "tomlTableKey:toml": "#F92672", 294 327 }, 295 328 } ··· 304 337 }, 305 338 }, 306 339 { 307 - "scope": "variable.key.table.toml", 340 + "scope": "support.type.property-name.toml", 341 + "settings": { 342 + "foreground": "#F92672", 343 + "fontStyle": "", 344 + }, 345 + }, 346 + { 347 + "scope": "support.type.property-name.table.toml", 308 348 "settings": { 309 349 "foreground": "#A6E22E", 350 + "fontStyle": "" 310 351 }, 311 352 }, 312 353 { 313 - "scope": "variable.key.array", 354 + "scope": "support.type.property-name.array.toml", 314 355 "settings": { 315 356 "foreground": "#A6E22E", 357 + "fontStyle": "" 316 358 } 317 359 }, 318 360 { ··· 332 374 "commands": [ 333 375 { 334 376 "match": "[.]go$", 335 - "cmd": "golines ${file} --write-output --ignored-dirs=vendor --shorten-comments --base-formatter=cat --max-len=88" 377 + "cmd": "golines ${file} --write-output --ignored-dirs=vendor --shorten-comments --base-formatter=cat --max-len=120 --tab-len=1" 336 378 }, 337 379 ] 338 380 }, ··· 415 457 "*.pica": "asm-intel-x86-generic", 416 458 "CODEOWNERS": "codeowners", 417 459 "*.meta": "json", 418 - "*.vdo": "shellscript" 460 + "*.vdo": "shellscript", 461 + "*.sh.j2": "jinja-shell" 419 462 }, 420 463 "files.exclude": { 464 + "**/.cache/**": true, 421 465 "**/.DS_Store": true, 422 466 "**/.git": true, 423 467 "**/.hg": true, 424 468 "**/.svn": true, 425 469 "**/CVS": true, 426 470 "__pycache__": true, 471 + "**/private/var/tmp/**": true, 427 472 }, 428 473 "files.insertFinalNewline": true, 429 474 "files.trimTrailingWhitespace": true, ··· 439 484 "**/bazel-*/**": true, 440 485 "**/execroot/**": true, 441 486 "**/.cargo/**": true, 487 + "**/private/var/tmp/**": true, 442 488 }, 443 489 444 490 "git.autoRepositoryDetection": "openEditors", ··· 446 492 "git.ignoreSubmodules": false, 447 493 "git.enableSmartCommit": true, 448 494 "git.openDiffOnClick": false, 495 + "git.mergeEditor": true, 449 496 450 497 "githubIssues.useBranchForIssues": "prompt", 451 498 "githubIssues.assignWhenWorking": false, ··· 467 514 "githubPullRequests.commentExpandState": "expandUnresolved", 468 515 "githubPullRequests.createOnPublishBranch": "never", 469 516 "githubPullRequests.fileListLayout": "tree", 517 + "githubPullRequests.assignCreated": "${user}", 470 518 "githubPullRequests.queries": [ 471 519 { 472 520 "label": "Waiting For My Review", ··· 491 539 "closed": false 492 540 }, 493 541 494 - "gitlens.advanced.fileHistoryFollowsRenames": false, 542 + "gitlens.advanced.fileHistoryFollowsRenames": true, 495 543 "gitlens.advanced.messages": { 496 544 "suppressCommitHasNoPreviousCommitWarning": false, 497 545 "suppressCommitNotFoundWarning": false, ··· 580 628 "gulp.autoDetect": "off", 581 629 582 630 "hexeditor.columnWidth": 16, 583 - "hexeditor.showDecodedText": false, 631 + "hexeditor.showDecodedText": true, 584 632 "hexeditor.defaultEndianness": "little", 585 633 "hexeditor.inspectorType": "aside", 586 634 ··· 724 772 "rust-analyzer.inlayHints.parameterHints.enable": true, 725 773 "rust-analyzer.inlayHints.typeHints.enable": true, 726 774 "rust-analyzer.inlayHints.chainingHints.enable": true, 727 - "rust-analyzer.inlayHints.closureReturnTypeHints.enable": true, 775 + "rust-analyzer.inlayHints.closureReturnTypeHints.enable": "with_block", 728 776 "rust-analyzer.inlayHints.lifetimeElisionHints.enable": "skip_trivial", 729 777 "rust-analyzer.inlayHints.maxLength": 15, 730 - "rust-analyzer.inlayHints.reborrowHints.enable": true, 778 + "rust-analyzer.inlayHints.reborrowHints.enable": "always", 731 779 "rust-analyzer.inlayHints.renderColons": true, 732 780 "rust-analyzer.procMacro.enable": true, 733 781 "rust-analyzer.runnableEnv": { ··· 739 787 "asvetliakov.vscode-neovim" 740 788 ], 741 789 "remote.containers.repositoryConfigurationPaths": [ 742 - "~/.config/vscode/devcontainers" 790 + "/Users/ichamberlain/.config/vscode/devcontainers", 791 + "/Users/ianchamberlain/.config/vscode/devcontainers", 743 792 ], 744 793 745 794 "salt-lint.enable": true, ··· 812 861 "terminal.integrated.experimentalUseTitleEvent": true, 813 862 "terminal.integrated.gpuAcceleration": "auto", 814 863 "terminal.integrated.defaultProfile.osx": "fish", 864 + "terminal.integrated.defaultProfile.linux": "fish", 815 865 "terminal.integrated.profiles.osx": { 816 866 "bash": { 817 867 "path": "bash", 818 - "args": [ 819 - "-l" 820 - ], 821 868 "icon": "terminal-bash" 822 869 }, 823 870 "zsh": { 824 871 "path": "zsh", 825 - "args": [ 826 - "-l" 827 - ], 828 872 "icon": "zap" 829 873 }, 830 874 "fish": { 831 - "path": "/usr/local/bin/fish", 832 - "args": [ 833 - "-l" 834 - ], 875 + "path": "fish", 876 + "icon": "chevron-right" 877 + }, 878 + }, 879 + "terminal.integrated.profiles.linux": { 880 + "bash": { 881 + "path": "bash", 882 + "icon": "terminal-bash" 883 + }, 884 + "fish": { 885 + "path": "fish", 835 886 "icon": "chevron-right" 836 887 }, 837 888 },
Library/Application Support/lghub/settings.db

This is a binary file and will not be displayed.