@blinkk/root-cms 2.0.0-rc.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.js +226 -20
- package/dist/cli.js +217 -164
- package/dist/{client-AKOLkEwt.d.ts → client-fqtWzfpQ.d.ts} +359 -107
- package/dist/client.d.ts +1 -1
- package/dist/client.js +730 -314
- package/dist/core.d.ts +5 -80
- package/dist/core.js +732 -509
- package/dist/functions.js +721 -299
- package/dist/plugin.d.ts +1 -1
- package/dist/plugin.js +988 -518
- package/dist/project.d.ts +1 -1
- package/dist/project.js +2 -2
- package/dist/richtext.js +0 -1
- package/dist/{schema-ix967Ud0.d.ts → schema-KpQGOA1Z.d.ts} +65 -8
- package/dist/ui/signin.css +0 -1
- package/dist/ui/signin.js +0 -1
- package/dist/ui/ui.css +1 -2
- package/dist/ui/ui.js +142 -103
- package/package.json +20 -16
package/dist/ui/signin.js
CHANGED
|
@@ -1379,4 +1379,3 @@ firebase/app/dist/esm/index.esm.js:
|
|
|
1379
1379
|
* limitations under the License.
|
|
1380
1380
|
*)
|
|
1381
1381
|
*/
|
|
1382
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvY29uc3RhbnRzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2Fzc2VydC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9jcnlwdC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9kZWVwQ29weS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9nbG9iYWwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZGVmYXVsdHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZGVmZXJyZWQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZW11bGF0b3IudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZW52aXJvbm1lbnQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZXJyb3JzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2pzb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvand0LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL29iai50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9wcm9taXNlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3F1ZXJ5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3NoYTEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvc3Vic2NyaWJlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL3ZhbGlkYXRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvdXRmOC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy91dWlkLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrdXRpbEAxLjkuMy9ub2RlX21vZHVsZXMvQGZpcmViYXNlL3V0aWwvc3JjL2V4cG9uZW50aWFsX2JhY2tvZmYudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSt1dGlsQDEuOS4zL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvdXRpbC9zcmMvZm9ybWF0dGVycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK3V0aWxAMS45LjMvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS91dGlsL3NyYy9jb21wYXQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZStjb21wb25lbnRAMC42LjQvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9jb21wb25lbnQvc3JjL2NvbXBvbmVudC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2NvbXBvbmVudEAwLjYuNC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2NvbXBvbmVudC9zcmMvY29uc3RhbnRzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrY29tcG9uZW50QDAuNi40L25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvY29tcG9uZW50L3NyYy9wcm92aWRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2NvbXBvbmVudEAwLjYuNC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2NvbXBvbmVudC9zcmMvY29tcG9uZW50X2NvbnRhaW5lci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2xvZ2dlckAwLjQuMC9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2xvZ2dlci9zcmMvbG9nZ2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9pZGJANy4xLjEvbm9kZV9tb2R1bGVzL2lkYi9idWlsZC93cmFwLWlkYi12YWx1ZS5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vaWRiQDcuMS4xL25vZGVfbW9kdWxlcy9pZGIvYnVpbGQvaW5kZXguanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9wbGF0Zm9ybUxvZ2dlclNlcnZpY2UudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9sb2dnZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9jb25zdGFudHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9pbnRlcm5hbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL2ZpcmViYXNlQXBwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvYXBpLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvaW5kZXhlZGRiLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2FwcC9zcmMvaGVhcnRiZWF0U2VydmljZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hcHAvc3JjL3JlZ2lzdGVyQ29yZUNvbXBvbmVudHMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXBwL3NyYy9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vZmlyZWJhc2VAMTAuNS4yL25vZGVfbW9kdWxlcy9maXJlYmFzZS9hcHAvaW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3RzbGliQDIuNi4yL25vZGVfbW9kdWxlcy90c2xpYi90c2xpYi5lczYubWpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL21vZGVsL2VudW1fbWFwcy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvbG9nLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9hc3NlcnQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91dGlsL2xvY2F0aW9uLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9uYXZpZ2F0b3IudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91dGlsL2RlbGF5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9lbXVsYXRvci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvZmV0Y2hfcHJvdmlkZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2Vycm9ycy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvaW5kZXgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9yZWNhcHRjaGEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2FjY291bnRfbWFuYWdlbWVudC9hY2NvdW50LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC90aW1lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXNlci9pZF90b2tlbl9yZXN1bHQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL2ludmFsaWRhdGlvbi50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvcHJvYWN0aXZlX3JlZnJlc2gudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfbWV0YWRhdGEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3JlbG9hZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vdG9rZW4udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3Rva2VuX21hbmFnZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfaW1wbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvaW5zdGFudGlhdG9yLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcGVyc2lzdGVuY2UvaW5fbWVtb3J5LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfdXNlcl9tYW5hZ2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9icm93c2VyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC92ZXJzaW9uLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYXV0aC9taWRkbGV3YXJlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9wYXNzd29yZF9wb2xpY3kvZ2V0X3Bhc3N3b3JkX3BvbGljeS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2F1dGgvcGFzc3dvcmRfcG9saWN5X2ltcGwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2F1dGhfaW1wbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2xvYWRfanMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2VudGVycHJpc2VfdmVyaWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2luaXRpYWxpemUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2VtdWxhdG9yLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvYXV0aF9jcmVkZW50aWFsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvZW1haWxfYW5kX3Bhc3N3b3JkLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL2VtYWlsX2xpbmsudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9jcmVkZW50aWFscy9lbWFpbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vaWRwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvb2F1dGgudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL3Ntcy50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2NyZWRlbnRpYWxzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYWN0aW9uX2NvZGVfdXJsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL2VtYWlsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL2ZlZGVyYXRlZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9vYXV0aC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9mYWNlYm9vay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9nb29nbGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9wcm92aWRlcnMvZ2l0aHViLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvY3JlZGVudGlhbHMvc2FtbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3Byb3ZpZGVycy9zYW1sLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvcHJvdmlkZXJzL3R3aXR0ZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL3NpZ25fdXAudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9hbm9ueW1vdXMudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9lcnJvci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3V0aWwvcHJvdmlkZXJzLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXNlci9saW5rX3VubGluay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvcmVhdXRoZW50aWNhdGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9zdHJhdGVnaWVzL2NyZWRlbnRpYWwudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvYXBpL2F1dGhlbnRpY2F0aW9uL2N1c3RvbV90b2tlbi50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvY3VzdG9tX3Rva2VuLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL21mYS9tZmFfaW5mby50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvYWN0aW9uX2NvZGVfc2V0dGluZ3MudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9zdHJhdGVnaWVzL2VtYWlsX2FuZF9wYXNzd29yZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvZW1haWxfbGluay50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYXV0aGVudGljYXRpb24vY3JlYXRlX2F1dGhfdXJpLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9lbWFpbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L3Byb2ZpbGUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS91c2VyL2FjY291bnRfaW5mby50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3VzZXIvYWRkaXRpb25hbF91c2VyX2luZm8udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvbWZhX3Nlc3Npb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9yZXNvbHZlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L21mYS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvbWZhX3VzZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9wZXJzaXN0ZW5jZS9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3BlcnNpc3RlbmNlL2Jyb3dzZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9wZXJzaXN0ZW5jZS9sb2NhbF9zdG9yYWdlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcGVyc2lzdGVuY2Uvc2Vzc2lvbl9zdG9yYWdlLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvbWVzc2FnZWNoYW5uZWwvcHJvbWlzZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL21lc3NhZ2VjaGFubmVsL3JlY2VpdmVyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9ldmVudF9pZC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL21lc3NhZ2VjaGFubmVsL3NlbmRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2F1dGhfd2luZG93LnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvdXRpbC93b3JrZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9wZXJzaXN0ZW5jZS9pbmRleGVkX2RiLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX21vY2sudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2xvYWRlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGFfdmVyaWZpZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9zdHJhdGVnaWVzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcHJvdmlkZXJzL3Bob25lLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9yZXNvbHZlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL3N0cmF0ZWdpZXMvaWRwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9hYnN0cmFjdF9wb3B1cF9yZWRpcmVjdF9vcGVyYXRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9zdHJhdGVnaWVzL3BvcHVwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvc3RyYXRlZ2llcy9yZWRpcmVjdC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL3N0cmF0ZWdpZXMvcmVkaXJlY3QudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvY29yZS9hdXRoL2F1dGhfZXZlbnRfbWFuYWdlci50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9hcGkvcHJvamVjdF9jb25maWcvZ2V0X3Byb2plY3RfY29uZmlnLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC92YWxpZGF0ZV9vcmlnaW4udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9pZnJhbWUvZ2FwaS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9wbGF0Zm9ybV9icm93c2VyL2lmcmFtZS9pZnJhbWUudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci91dGlsL3BvcHVwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvdXRpbC9oYW5kbGVyLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL3BsYXRmb3JtX2Jyb3dzZXIvcG9wdXBfcmVkaXJlY3QudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvbWZhL21mYV9hc3NlcnRpb24udHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9tZmEvYXNzZXJ0aW9ucy9waG9uZS50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9tZmEvYXNzZXJ0aW9ucy90b3RwLnRzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9AZmlyZWJhc2UrYXV0aEAxLjMuMl9AZmlyZWJhc2UrYXBwQDAuOS4yMi9ub2RlX21vZHVsZXMvQGZpcmViYXNlL2F1dGgvc3JjL2NvcmUvYXV0aC9maXJlYmFzZV9pbnRlcm5hbC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQGZpcmViYXNlK2F1dGhAMS4zLjJfQGZpcmViYXNlK2FwcEAwLjkuMjIvbm9kZV9tb2R1bGVzL0BmaXJlYmFzZS9hdXRoL3NyYy9jb3JlL2F1dGgvcmVnaXN0ZXIudHMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0BmaXJlYmFzZSthdXRoQDEuMy4yX0BmaXJlYmFzZSthcHBAMC45LjIyL25vZGVfbW9kdWxlcy9AZmlyZWJhc2UvYXV0aC9zcmMvcGxhdGZvcm1fYnJvd3Nlci9pbmRleC50cyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy91dGlsLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9vcHRpb25zLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtZWxlbWVudC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvY29tcG9uZW50LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jcmVhdGUtY29udGV4dC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9jaGlsZHJlbi5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9wcm9wcy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvZGlmZi9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9zcmMvcmVuZGVyLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9jbG9uZS1lbGVtZW50LmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L3NyYy9kaWZmL2NhdGNoLWVycm9yLmpzIiwgIi4uLy4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS9wcmVhY3RAMTAuMTkuMy9ub2RlX21vZHVsZXMvcHJlYWN0L2hvb2tzL3NyYy9pbmRleC5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9qc3gtcnVudGltZS9zcmMvdXRpbHMuanMiLCAiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3ByZWFjdEAxMC4xOS4zL25vZGVfbW9kdWxlcy9wcmVhY3Qvc3JjL2NvbnN0YW50cy5qcyIsICIuLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vcHJlYWN0QDEwLjE5LjMvbm9kZV9tb2R1bGVzL3ByZWFjdC9qc3gtcnVudGltZS9zcmMvaW5kZXguanMiLCAiLi4vLi4vc2lnbmluL3NpZ25pbi50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogQGZpbGVvdmVydmlldyBGaXJlYmFzZSBjb25zdGFudHMuICBTb21lIG9mIHRoZXNlIChAZGVmaW5lcykgY2FuIGJlIG92ZXJyaWRkZW4gYXQgY29tcGlsZS10aW1lLlxuICovXG5cbmV4cG9ydCBjb25zdCBDT05TVEFOVFMgPSB7XG4gIC8qKlxuICAgKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRoaXMgaXMgdGhlIGNsaWVudCBOb2RlLmpzIFNESy5cbiAgICovXG4gIE5PREVfQ0xJRU5UOiBmYWxzZSxcbiAgLyoqXG4gICAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBpcyB0aGUgQWRtaW4gTm9kZS5qcyBTREsuXG4gICAqL1xuICBOT0RFX0FETUlOOiBmYWxzZSxcblxuICAvKipcbiAgICogRmlyZWJhc2UgU0RLIFZlcnNpb25cbiAgICovXG4gIFNES19WRVJTSU9OOiAnJHtKU0NPUkVfVkVSU0lPTn0nXG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENPTlNUQU5UUyB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLyoqXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHByb3ZpZGVkIGFzc2VydGlvbiBpcyBmYWxzeVxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0ID0gZnVuY3Rpb24gKGFzc2VydGlvbjogdW5rbm93biwgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghYXNzZXJ0aW9uKSB7XG4gICAgdGhyb3cgYXNzZXJ0aW9uRXJyb3IobWVzc2FnZSk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBFcnJvciBvYmplY3Qgc3VpdGFibGUgZm9yIHRocm93aW5nLlxuICovXG5leHBvcnQgY29uc3QgYXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbiAobWVzc2FnZTogc3RyaW5nKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgICdGaXJlYmFzZSBEYXRhYmFzZSAoJyArXG4gICAgICBDT05TVEFOVFMuU0RLX1ZFUlNJT04gK1xuICAgICAgJykgSU5URVJOQUwgQVNTRVJUIEZBSUxFRDogJyArXG4gICAgICBtZXNzYWdlXG4gICk7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IHN0cmluZ1RvQnl0ZUFycmF5ID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogbnVtYmVyW10ge1xuICAvLyBUT0RPKHVzZXIpOiBVc2UgbmF0aXZlIGltcGxlbWVudGF0aW9ucyBpZi93aGVuIGF2YWlsYWJsZVxuICBjb25zdCBvdXQ6IG51bWJlcltdID0gW107XG4gIGxldCBwID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgYyA9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICBvdXRbcCsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmXG4gICAgICBpICsgMSA8IHN0ci5sZW5ndGggJiZcbiAgICAgIChzdHIuY2hhckNvZGVBdChpICsgMSkgJiAweGZjMDApID09PSAweGRjMDBcbiAgICApIHtcbiAgICAgIC8vIFN1cnJvZ2F0ZSBQYWlyXG4gICAgICBjID0gMHgxMDAwMCArICgoYyAmIDB4MDNmZikgPDwgMTApICsgKHN0ci5jaGFyQ29kZUF0KCsraSkgJiAweDAzZmYpO1xuICAgICAgb3V0W3ArK10gPSAoYyA+PiAxOCkgfCAyNDA7XG4gICAgICBvdXRbcCsrXSA9ICgoYyA+PiAxMikgJiA2MykgfCAxMjg7XG4gICAgICBvdXRbcCsrXSA9ICgoYyA+PiA2KSAmIDYzKSB8IDEyODtcbiAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dFtwKytdID0gKGMgPj4gMTIpIHwgMjI0O1xuICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUdXJucyBhbiBhcnJheSBvZiBudW1iZXJzIGludG8gdGhlIHN0cmluZyBnaXZlbiBieSB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGVcbiAqIGNoYXJhY3RlcnMgdG8gd2hpY2ggdGhlIG51bWJlcnMgY29ycmVzcG9uZC5cbiAqIEBwYXJhbSBieXRlcyBBcnJheSBvZiBudW1iZXJzIHJlcHJlc2VudGluZyBjaGFyYWN0ZXJzLlxuICogQHJldHVybiBTdHJpbmdpZmljYXRpb24gb2YgdGhlIGFycmF5LlxuICovXG5jb25zdCBieXRlQXJyYXlUb1N0cmluZyA9IGZ1bmN0aW9uIChieXRlczogbnVtYmVyW10pOiBzdHJpbmcge1xuICAvLyBUT0RPKHVzZXIpOiBVc2UgbmF0aXZlIGltcGxlbWVudGF0aW9ucyBpZi93aGVuIGF2YWlsYWJsZVxuICBjb25zdCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGxldCBwb3MgPSAwLFxuICAgIGMgPSAwO1xuICB3aGlsZSAocG9zIDwgYnl0ZXMubGVuZ3RoKSB7XG4gICAgY29uc3QgYzEgPSBieXRlc1twb3MrK107XG4gICAgaWYgKGMxIDwgMTI4KSB7XG4gICAgICBvdXRbYysrXSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYzEpO1xuICAgIH0gZWxzZSBpZiAoYzEgPiAxOTEgJiYgYzEgPCAyMjQpIHtcbiAgICAgIGNvbnN0IGMyID0gYnl0ZXNbcG9zKytdO1xuICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYzEgJiAzMSkgPDwgNikgfCAoYzIgJiA2MykpO1xuICAgIH0gZWxzZSBpZiAoYzEgPiAyMzkgJiYgYzEgPCAzNjUpIHtcbiAgICAgIC8vIFN1cnJvZ2F0ZSBQYWlyXG4gICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcbiAgICAgIGNvbnN0IGMzID0gYnl0ZXNbcG9zKytdO1xuICAgICAgY29uc3QgYzQgPSBieXRlc1twb3MrK107XG4gICAgICBjb25zdCB1ID1cbiAgICAgICAgKCgoYzEgJiA3KSA8PCAxOCkgfCAoKGMyICYgNjMpIDw8IDEyKSB8ICgoYzMgJiA2MykgPDwgNikgfCAoYzQgJiA2MykpIC1cbiAgICAgICAgMHgxMDAwMDtcbiAgICAgIG91dFtjKytdID0gU3RyaW5nLmZyb21DaGFyQ29kZSgweGQ4MDAgKyAodSA+PiAxMCkpO1xuICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4ZGMwMCArICh1ICYgMTAyMykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjMiA9IGJ5dGVzW3BvcysrXTtcbiAgICAgIGNvbnN0IGMzID0gYnl0ZXNbcG9zKytdO1xuICAgICAgb3V0W2MrK10gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKFxuICAgICAgICAoKGMxICYgMTUpIDw8IDEyKSB8ICgoYzIgJiA2MykgPDwgNikgfCAoYzMgJiA2MylcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQuam9pbignJyk7XG59O1xuXG5pbnRlcmZhY2UgQmFzZTY0IHtcbiAgYnl0ZVRvQ2hhck1hcF86IHsgW2tleTogbnVtYmVyXTogc3RyaW5nIH0gfCBudWxsO1xuICBjaGFyVG9CeXRlTWFwXzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB8IG51bGw7XG4gIGJ5dGVUb0NoYXJNYXBXZWJTYWZlXzogeyBba2V5OiBudW1iZXJdOiBzdHJpbmcgfSB8IG51bGw7XG4gIGNoYXJUb0J5dGVNYXBXZWJTYWZlXzogeyBba2V5OiBzdHJpbmddOiBudW1iZXIgfSB8IG51bGw7XG4gIEVOQ09ERURfVkFMU19CQVNFOiBzdHJpbmc7XG4gIHJlYWRvbmx5IEVOQ09ERURfVkFMUzogc3RyaW5nO1xuICByZWFkb25seSBFTkNPREVEX1ZBTFNfV0VCU0FGRTogc3RyaW5nO1xuICBIQVNfTkFUSVZFX1NVUFBPUlQ6IGJvb2xlYW47XG4gIGVuY29kZUJ5dGVBcnJheShpbnB1dDogbnVtYmVyW10gfCBVaW50OEFycmF5LCB3ZWJTYWZlPzogYm9vbGVhbik6IHN0cmluZztcbiAgZW5jb2RlU3RyaW5nKGlucHV0OiBzdHJpbmcsIHdlYlNhZmU/OiBib29sZWFuKTogc3RyaW5nO1xuICBkZWNvZGVTdHJpbmcoaW5wdXQ6IHN0cmluZywgd2ViU2FmZTogYm9vbGVhbik6IHN0cmluZztcbiAgZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQ6IHN0cmluZywgd2ViU2FmZTogYm9vbGVhbik6IG51bWJlcltdO1xuICBpbml0XygpOiB2b2lkO1xufVxuXG4vLyBXZSBkZWZpbmUgaXQgYXMgYW4gb2JqZWN0IGxpdGVyYWwgaW5zdGVhZCBvZiBhIGNsYXNzIGJlY2F1c2UgYSBjbGFzcyBjb21waWxlZCBkb3duIHRvIGVzNSBjYW4ndFxuLy8gYmUgdHJlZXNoYWtlZC4gaHR0cHM6Ly9naXRodWIuY29tL3JvbGx1cC9yb2xsdXAvaXNzdWVzLzE2OTFcbi8vIFN0YXRpYyBsb29rdXAgbWFwcywgbGF6aWx5IHBvcHVsYXRlZCBieSBpbml0XygpXG5leHBvcnQgY29uc3QgYmFzZTY0OiBCYXNlNjQgPSB7XG4gIC8qKlxuICAgKiBNYXBzIGJ5dGVzIHRvIGNoYXJhY3RlcnMuXG4gICAqL1xuICBieXRlVG9DaGFyTWFwXzogbnVsbCxcblxuICAvKipcbiAgICogTWFwcyBjaGFyYWN0ZXJzIHRvIGJ5dGVzLlxuICAgKi9cbiAgY2hhclRvQnl0ZU1hcF86IG51bGwsXG5cbiAgLyoqXG4gICAqIE1hcHMgYnl0ZXMgdG8gd2Vic2FmZSBjaGFyYWN0ZXJzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYnl0ZVRvQ2hhck1hcFdlYlNhZmVfOiBudWxsLFxuXG4gIC8qKlxuICAgKiBNYXBzIHdlYnNhZmUgY2hhcmFjdGVycyB0byBieXRlcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNoYXJUb0J5dGVNYXBXZWJTYWZlXzogbnVsbCxcblxuICAvKipcbiAgICogT3VyIGRlZmF1bHQgYWxwaGFiZXQsIHNoYXJlZCBiZXR3ZWVuXG4gICAqIEVOQ09ERURfVkFMUyBhbmQgRU5DT0RFRF9WQUxTX1dFQlNBRkVcbiAgICovXG4gIEVOQ09ERURfVkFMU19CQVNFOlxuICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicgKyAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonICsgJzAxMjM0NTY3ODknLFxuXG4gIC8qKlxuICAgKiBPdXIgZGVmYXVsdCBhbHBoYWJldC4gVmFsdWUgNjQgKD0pIGlzIHNwZWNpYWw7IGl0IG1lYW5zIFwibm90aGluZy5cIlxuICAgKi9cbiAgZ2V0IEVOQ09ERURfVkFMUygpIHtcbiAgICByZXR1cm4gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRSArICcrLz0nO1xuICB9LFxuXG4gIC8qKlxuICAgKiBPdXIgd2Vic2FmZSBhbHBoYWJldC5cbiAgICovXG4gIGdldCBFTkNPREVEX1ZBTFNfV0VCU0FGRSgpIHtcbiAgICByZXR1cm4gdGhpcy5FTkNPREVEX1ZBTFNfQkFTRSArICctXy4nO1xuICB9LFxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBzdXBwb3J0cyB0aGUgYXRvYiBhbmQgYnRvYSBmdW5jdGlvbnMuIFRoaXMgZXh0ZW5zaW9uXG4gICAqIHN0YXJ0ZWQgYXQgTW96aWxsYSBidXQgaXMgbm93IGltcGxlbWVudGVkIGJ5IG1hbnkgYnJvd3NlcnMuIFdlIHVzZSB0aGVcbiAgICogQVNTVU1FXyogdmFyaWFibGVzIHRvIGF2b2lkIHB1bGxpbmcgaW4gdGhlIGZ1bGwgdXNlcmFnZW50IGRldGVjdGlvbiBsaWJyYXJ5XG4gICAqIGJ1dCBzdGlsbCBhbGxvd2luZyB0aGUgc3RhbmRhcmQgcGVyLWJyb3dzZXIgY29tcGlsYXRpb25zLlxuICAgKlxuICAgKi9cbiAgSEFTX05BVElWRV9TVVBQT1JUOiB0eXBlb2YgYXRvYiA9PT0gJ2Z1bmN0aW9uJyxcblxuICAvKipcbiAgICogQmFzZTY0LWVuY29kZSBhbiBhcnJheSBvZiBieXRlcy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IEFuIGFycmF5IG9mIGJ5dGVzIChudW1iZXJzIHdpdGhcbiAgICogICAgIHZhbHVlIGluIFswLCAyNTVdKSB0byBlbmNvZGUuXG4gICAqIEBwYXJhbSB3ZWJTYWZlIEJvb2xlYW4gaW5kaWNhdGluZyB3ZSBzaG91bGQgdXNlIHRoZVxuICAgKiAgICAgYWx0ZXJuYXRpdmUgYWxwaGFiZXQuXG4gICAqIEByZXR1cm4gVGhlIGJhc2U2NCBlbmNvZGVkIHN0cmluZy5cbiAgICovXG4gIGVuY29kZUJ5dGVBcnJheShpbnB1dDogbnVtYmVyW10gfCBVaW50OEFycmF5LCB3ZWJTYWZlPzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ2VuY29kZUJ5dGVBcnJheSB0YWtlcyBhbiBhcnJheSBhcyBhIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdF8oKTtcblxuICAgIGNvbnN0IGJ5dGVUb0NoYXJNYXAgPSB3ZWJTYWZlXG4gICAgICA/IHRoaXMuYnl0ZVRvQ2hhck1hcFdlYlNhZmVfIVxuICAgICAgOiB0aGlzLmJ5dGVUb0NoYXJNYXBfITtcblxuICAgIGNvbnN0IG91dHB1dCA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgY29uc3QgYnl0ZTEgPSBpbnB1dFtpXTtcbiAgICAgIGNvbnN0IGhhdmVCeXRlMiA9IGkgKyAxIDwgaW5wdXQubGVuZ3RoO1xuICAgICAgY29uc3QgYnl0ZTIgPSBoYXZlQnl0ZTIgPyBpbnB1dFtpICsgMV0gOiAwO1xuICAgICAgY29uc3QgaGF2ZUJ5dGUzID0gaSArIDIgPCBpbnB1dC5sZW5ndGg7XG4gICAgICBjb25zdCBieXRlMyA9IGhhdmVCeXRlMyA/IGlucHV0W2kgKyAyXSA6IDA7XG5cbiAgICAgIGNvbnN0IG91dEJ5dGUxID0gYnl0ZTEgPj4gMjtcbiAgICAgIGNvbnN0IG91dEJ5dGUyID0gKChieXRlMSAmIDB4MDMpIDw8IDQpIHwgKGJ5dGUyID4+IDQpO1xuICAgICAgbGV0IG91dEJ5dGUzID0gKChieXRlMiAmIDB4MGYpIDw8IDIpIHwgKGJ5dGUzID4+IDYpO1xuICAgICAgbGV0IG91dEJ5dGU0ID0gYnl0ZTMgJiAweDNmO1xuXG4gICAgICBpZiAoIWhhdmVCeXRlMykge1xuICAgICAgICBvdXRCeXRlNCA9IDY0O1xuXG4gICAgICAgIGlmICghaGF2ZUJ5dGUyKSB7XG4gICAgICAgICAgb3V0Qnl0ZTMgPSA2NDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBvdXRwdXQucHVzaChcbiAgICAgICAgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlMV0sXG4gICAgICAgIGJ5dGVUb0NoYXJNYXBbb3V0Qnl0ZTJdLFxuICAgICAgICBieXRlVG9DaGFyTWFwW291dEJ5dGUzXSxcbiAgICAgICAgYnl0ZVRvQ2hhck1hcFtvdXRCeXRlNF1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTtcbiAgfSxcblxuICAvKipcbiAgICogQmFzZTY0LWVuY29kZSBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IEEgc3RyaW5nIHRvIGVuY29kZS5cbiAgICogQHBhcmFtIHdlYlNhZmUgSWYgdHJ1ZSwgd2Ugc2hvdWxkIHVzZSB0aGVcbiAgICogICAgIGFsdGVybmF0aXZlIGFscGhhYmV0LlxuICAgKiBAcmV0dXJuIFRoZSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXG4gICAqL1xuICBlbmNvZGVTdHJpbmcoaW5wdXQ6IHN0cmluZywgd2ViU2FmZT86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIC8vIFNob3J0Y3V0IGZvciBNb3ppbGxhIGJyb3dzZXJzIHRoYXQgaW1wbGVtZW50XG4gICAgLy8gYSBuYXRpdmUgYmFzZTY0IGVuY29kZXIgaW4gdGhlIGZvcm0gb2YgXCJidG9hL2F0b2JcIlxuICAgIGlmICh0aGlzLkhBU19OQVRJVkVfU1VQUE9SVCAmJiAhd2ViU2FmZSkge1xuICAgICAgcmV0dXJuIGJ0b2EoaW5wdXQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbmNvZGVCeXRlQXJyYXkoc3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQpLCB3ZWJTYWZlKTtcbiAgfSxcblxuICAvKipcbiAgICogQmFzZTY0LWRlY29kZSBhIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0IHRvIGRlY29kZS5cbiAgICogQHBhcmFtIHdlYlNhZmUgVHJ1ZSBpZiB3ZSBzaG91bGQgdXNlIHRoZVxuICAgKiAgICAgYWx0ZXJuYXRpdmUgYWxwaGFiZXQuXG4gICAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCB2YWx1ZS5cbiAgICovXG4gIGRlY29kZVN0cmluZyhpbnB1dDogc3RyaW5nLCB3ZWJTYWZlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAvLyBTaG9ydGN1dCBmb3IgTW96aWxsYSBicm93c2VycyB0aGF0IGltcGxlbWVudFxuICAgIC8vIGEgbmF0aXZlIGJhc2U2NCBlbmNvZGVyIGluIHRoZSBmb3JtIG9mIFwiYnRvYS9hdG9iXCJcbiAgICBpZiAodGhpcy5IQVNfTkFUSVZFX1NVUFBPUlQgJiYgIXdlYlNhZmUpIHtcbiAgICAgIHJldHVybiBhdG9iKGlucHV0KTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVBcnJheVRvU3RyaW5nKHRoaXMuZGVjb2RlU3RyaW5nVG9CeXRlQXJyYXkoaW5wdXQsIHdlYlNhZmUpKTtcbiAgfSxcblxuICAvKipcbiAgICogQmFzZTY0LWRlY29kZSBhIHN0cmluZy5cbiAgICpcbiAgICogSW4gYmFzZS02NCBkZWNvZGluZywgZ3JvdXBzIG9mIGZvdXIgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIGludG8gdGhyZWVcbiAgICogYnl0ZXMuICBJZiB0aGUgZW5jb2RlciBkaWQgbm90IGFwcGx5IHBhZGRpbmcsIHRoZSBpbnB1dCBsZW5ndGggbWF5IG5vdFxuICAgKiBiZSBhIG11bHRpcGxlIG9mIDQuXG4gICAqXG4gICAqIEluIHRoaXMgY2FzZSwgdGhlIGxhc3QgZ3JvdXAgd2lsbCBoYXZlIGZld2VyIHRoYW4gNCBjaGFyYWN0ZXJzLCBhbmRcbiAgICogcGFkZGluZyB3aWxsIGJlIGluZmVycmVkLiAgSWYgdGhlIGdyb3VwIGhhcyBvbmUgb3IgdHdvIGNoYXJhY3RlcnMsIGl0IGRlY29kZXNcbiAgICogdG8gb25lIGJ5dGUuICBJZiB0aGUgZ3JvdXAgaGFzIHRocmVlIGNoYXJhY3RlcnMsIGl0IGRlY29kZXMgdG8gdHdvIGJ5dGVzLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXQgSW5wdXQgdG8gZGVjb2RlLlxuICAgKiBAcGFyYW0gd2ViU2FmZSBUcnVlIGlmIHdlIHNob3VsZCB1c2UgdGhlIHdlYi1zYWZlIGFscGhhYmV0LlxuICAgKiBAcmV0dXJuIGJ5dGVzIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCB2YWx1ZS5cbiAgICovXG4gIGRlY29kZVN0cmluZ1RvQnl0ZUFycmF5KGlucHV0OiBzdHJpbmcsIHdlYlNhZmU6IGJvb2xlYW4pOiBudW1iZXJbXSB7XG4gICAgdGhpcy5pbml0XygpO1xuXG4gICAgY29uc3QgY2hhclRvQnl0ZU1hcCA9IHdlYlNhZmVcbiAgICAgID8gdGhpcy5jaGFyVG9CeXRlTWFwV2ViU2FmZV8hXG4gICAgICA6IHRoaXMuY2hhclRvQnl0ZU1hcF8hO1xuXG4gICAgY29uc3Qgb3V0cHV0OiBudW1iZXJbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7ICkge1xuICAgICAgY29uc3QgYnl0ZTEgPSBjaGFyVG9CeXRlTWFwW2lucHV0LmNoYXJBdChpKyspXTtcblxuICAgICAgY29uc3QgaGF2ZUJ5dGUyID0gaSA8IGlucHV0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGJ5dGUyID0gaGF2ZUJ5dGUyID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogMDtcbiAgICAgICsraTtcblxuICAgICAgY29uc3QgaGF2ZUJ5dGUzID0gaSA8IGlucHV0Lmxlbmd0aDtcbiAgICAgIGNvbnN0IGJ5dGUzID0gaGF2ZUJ5dGUzID8gY2hhclRvQnl0ZU1hcFtpbnB1dC5jaGFyQXQoaSldIDogNjQ7XG4gICAgICArK2k7XG5cbiAgICAgIGNvbnN0IGhhdmVCeXRlNCA9IGkgPCBpbnB1dC5sZW5ndGg7XG4gICAgICBjb25zdCBieXRlNCA9IGhhdmVCeXRlNCA/IGNoYXJUb0J5dGVNYXBbaW5wdXQuY2hhckF0KGkpXSA6IDY0O1xuICAgICAgKytpO1xuXG4gICAgICBpZiAoYnl0ZTEgPT0gbnVsbCB8fCBieXRlMiA9PSBudWxsIHx8IGJ5dGUzID09IG51bGwgfHwgYnl0ZTQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3IoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3V0Qnl0ZTEgPSAoYnl0ZTEgPDwgMikgfCAoYnl0ZTIgPj4gNCk7XG4gICAgICBvdXRwdXQucHVzaChvdXRCeXRlMSk7XG5cbiAgICAgIGlmIChieXRlMyAhPT0gNjQpIHtcbiAgICAgICAgY29uc3Qgb3V0Qnl0ZTIgPSAoKGJ5dGUyIDw8IDQpICYgMHhmMCkgfCAoYnl0ZTMgPj4gMik7XG4gICAgICAgIG91dHB1dC5wdXNoKG91dEJ5dGUyKTtcblxuICAgICAgICBpZiAoYnl0ZTQgIT09IDY0KSB7XG4gICAgICAgICAgY29uc3Qgb3V0Qnl0ZTMgPSAoKGJ5dGUzIDw8IDYpICYgMHhjMCkgfCBieXRlNDtcbiAgICAgICAgICBvdXRwdXQucHVzaChvdXRCeXRlMyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9LFxuXG4gIC8qKlxuICAgKiBMYXp5IHN0YXRpYyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4gQ2FsbGVkIGJlZm9yZVxuICAgKiBhY2Nlc3NpbmcgYW55IG9mIHRoZSBzdGF0aWMgbWFwIHZhcmlhYmxlcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluaXRfKCkge1xuICAgIGlmICghdGhpcy5ieXRlVG9DaGFyTWFwXykge1xuICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwXyA9IHt9O1xuICAgICAgdGhpcy5jaGFyVG9CeXRlTWFwXyA9IHt9O1xuICAgICAgdGhpcy5ieXRlVG9DaGFyTWFwV2ViU2FmZV8gPSB7fTtcbiAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcFdlYlNhZmVfID0ge307XG5cbiAgICAgIC8vIFdlIHdhbnQgcXVpY2sgbWFwcGluZ3MgYmFjayBhbmQgZm9ydGgsIHNvIHdlIHByZWNvbXB1dGUgdHdvIG1hcHMuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuRU5DT0RFRF9WQUxTLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuYnl0ZVRvQ2hhck1hcF9baV0gPSB0aGlzLkVOQ09ERURfVkFMUy5jaGFyQXQoaSk7XG4gICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF9bdGhpcy5ieXRlVG9DaGFyTWFwX1tpXV0gPSBpO1xuICAgICAgICB0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlX1tpXSA9IHRoaXMuRU5DT0RFRF9WQUxTX1dFQlNBRkUuY2hhckF0KGkpO1xuICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlX1t0aGlzLmJ5dGVUb0NoYXJNYXBXZWJTYWZlX1tpXV0gPSBpO1xuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZyB3aGVuIGRlY29kaW5nIGFuZCBjb3JyZWN0bHkgZGVjb2RlIGJvdGggZW5jb2RpbmdzLlxuICAgICAgICBpZiAoaSA+PSB0aGlzLkVOQ09ERURfVkFMU19CQVNFLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuY2hhclRvQnl0ZU1hcF9bdGhpcy5FTkNPREVEX1ZBTFNfV0VCU0FGRS5jaGFyQXQoaSldID0gaTtcbiAgICAgICAgICB0aGlzLmNoYXJUb0J5dGVNYXBXZWJTYWZlX1t0aGlzLkVOQ09ERURfVkFMUy5jaGFyQXQoaSldID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBBbiBlcnJvciBlbmNvdW50ZXJlZCB3aGlsZSBkZWNvZGluZyBiYXNlNjQgc3RyaW5nLlxuICovXG5leHBvcnQgY2xhc3MgRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IG5hbWUgPSAnRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3InO1xufVxuXG4vKipcbiAqIFVSTC1zYWZlIGJhc2U2NCBlbmNvZGluZ1xuICovXG5leHBvcnQgY29uc3QgYmFzZTY0RW5jb2RlID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXRmOEJ5dGVzID0gc3RyaW5nVG9CeXRlQXJyYXkoc3RyKTtcbiAgcmV0dXJuIGJhc2U2NC5lbmNvZGVCeXRlQXJyYXkodXRmOEJ5dGVzLCB0cnVlKTtcbn07XG5cbi8qKlxuICogVVJMLXNhZmUgYmFzZTY0IGVuY29kaW5nICh3aXRob3V0IFwiLlwiIHBhZGRpbmcgaW4gdGhlIGVuZCkuXG4gKiBlLmcuIFVzZWQgaW4gSlNPTiBXZWIgVG9rZW4gKEpXVCkgcGFydHMuXG4gKi9cbmV4cG9ydCBjb25zdCBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyA9IGZ1bmN0aW9uIChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIFVzZSBiYXNlNjR1cmwgZW5jb2RpbmcgYW5kIHJlbW92ZSBwYWRkaW5nIGluIHRoZSBlbmQgKGRvdCBjaGFyYWN0ZXJzKS5cbiAgcmV0dXJuIGJhc2U2NEVuY29kZShzdHIpLnJlcGxhY2UoL1xcLi9nLCAnJyk7XG59O1xuXG4vKipcbiAqIFVSTC1zYWZlIGJhc2U2NCBkZWNvZGluZ1xuICpcbiAqIE5PVEU6IERPIE5PVCB1c2UgdGhlIGdsb2JhbCBhdG9iKCkgZnVuY3Rpb24gLSBpdCBkb2VzIE5PVCBzdXBwb3J0IHRoZVxuICogYmFzZTY0VXJsIHZhcmlhbnQgZW5jb2RpbmcuXG4gKlxuICogQHBhcmFtIHN0ciBUbyBiZSBkZWNvZGVkXG4gKiBAcmV0dXJuIERlY29kZWQgcmVzdWx0LCBpZiBwb3NzaWJsZVxuICovXG5leHBvcnQgY29uc3QgYmFzZTY0RGVjb2RlID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVTdHJpbmcoc3RyLCB0cnVlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ2Jhc2U2NERlY29kZSBmYWlsZWQ6ICcsIGUpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIERvIGEgZGVlcC1jb3B5IG9mIGJhc2ljIEphdmFTY3JpcHQgT2JqZWN0cyBvciBBcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ29weTxUPih2YWx1ZTogVCk6IFQge1xuICByZXR1cm4gZGVlcEV4dGVuZCh1bmRlZmluZWQsIHZhbHVlKSBhcyBUO1xufVxuXG4vKipcbiAqIENvcHkgcHJvcGVydGllcyBmcm9tIHNvdXJjZSB0byB0YXJnZXQgKHJlY3Vyc2l2ZWx5IGFsbG93cyBleHRlbnNpb25cbiAqIG9mIE9iamVjdHMgYW5kIEFycmF5cykuICBTY2FsYXIgdmFsdWVzIGluIHRoZSB0YXJnZXQgYXJlIG92ZXItd3JpdHRlbi5cbiAqIElmIHRhcmdldCBpcyB1bmRlZmluZWQsIGFuIG9iamVjdCBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZSB3aWxsIGJlIGNyZWF0ZWRcbiAqIChhbmQgcmV0dXJuZWQpLlxuICpcbiAqIFdlIHJlY3Vyc2l2ZWx5IGNvcHkgYWxsIGNoaWxkIHByb3BlcnRpZXMgb2YgcGxhaW4gT2JqZWN0cyBpbiB0aGUgc291cmNlLSBzb1xuICogdGhhdCBuYW1lc3BhY2UtIGxpa2UgZGljdGlvbmFyaWVzIGFyZSBtZXJnZWQuXG4gKlxuICogTm90ZSB0aGF0IHRoZSB0YXJnZXQgY2FuIGJlIGEgZnVuY3Rpb24sIGluIHdoaWNoIGNhc2UgdGhlIHByb3BlcnRpZXMgaW5cbiAqIHRoZSBzb3VyY2UgT2JqZWN0IGFyZSBjb3BpZWQgb250byBpdCBhcyBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgRnVuY3Rpb24uXG4gKlxuICogTm90ZTogd2UgZG9uJ3QgbWVyZ2UgX19wcm90b19fIHRvIHByZXZlbnQgcHJvdG90eXBlIHBvbGx1dGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcEV4dGVuZCh0YXJnZXQ6IHVua25vd24sIHNvdXJjZTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBPYmplY3QpKSB7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHN3aXRjaCAoc291cmNlLmNvbnN0cnVjdG9yKSB7XG4gICAgY2FzZSBEYXRlOlxuICAgICAgLy8gVHJlYXQgRGF0ZXMgbGlrZSBzY2FsYXJzOyBpZiB0aGUgdGFyZ2V0IGRhdGUgb2JqZWN0IGhhZCBhbnkgY2hpbGRcbiAgICAgIC8vIHByb3BlcnRpZXMgLSB0aGV5IHdpbGwgYmUgbG9zdCFcbiAgICAgIGNvbnN0IGRhdGVWYWx1ZSA9IHNvdXJjZSBhcyBEYXRlO1xuICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGVWYWx1ZS5nZXRUaW1lKCkpO1xuXG4gICAgY2FzZSBPYmplY3Q6XG4gICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGFyZ2V0ID0ge307XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIEFycmF5OlxuICAgICAgLy8gQWx3YXlzIGNvcHkgdGhlIGFycmF5IHNvdXJjZSBhbmQgb3ZlcndyaXRlIHRoZSB0YXJnZXQuXG4gICAgICB0YXJnZXQgPSBbXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIC8vIE5vdCBhIHBsYWluIE9iamVjdCAtIHRyZWF0IGl0IGFzIGEgc2NhbGFyLlxuICAgICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBpbiBzb3VyY2UpIHtcbiAgICAvLyB1c2UgaXNWYWxpZEtleSB0byBndWFyZCBhZ2FpbnN0IHByb3RvdHlwZSBwb2xsdXRpb24uIFNlZSBodHRwczovL3NueWsuaW8vdnVsbi9TTllLLUpTLUxPREFTSC00NTAyMDJcbiAgICBpZiAoIXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCAhaXNWYWxpZEtleShwcm9wKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3BdID0gZGVlcEV4dGVuZChcbiAgICAgICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3Byb3BdLFxuICAgICAgKHNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcHJvcF1cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZEtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4ga2V5ICE9PSAnX19wcm90b19fJztcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFBvbHlmaWxsIGZvciBgZ2xvYmFsVGhpc2Agb2JqZWN0LlxuICogQHJldHVybnMgdGhlIGBnbG9iYWxUaGlzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBlbnZpcm9ubWVudC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbCgpOiB0eXBlb2YgZ2xvYmFsVGhpcyB7XG4gIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG4gIGlmICh0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBnbG9iYWw7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gbG9jYXRlIGdsb2JhbCBvYmplY3QuJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgYmFzZTY0RGVjb2RlIH0gZnJvbSAnLi9jcnlwdCc7XG5pbXBvcnQgeyBnZXRHbG9iYWwgfSBmcm9tICcuL2dsb2JhbCc7XG5cbi8qKlxuICogS2V5cyBmb3IgZXhwZXJpbWVudGFsIHByb3BlcnRpZXMgb24gdGhlIGBGaXJlYmFzZURlZmF1bHRzYCBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCB0eXBlIEV4cGVyaW1lbnRhbEtleSA9ICdhdXRoVG9rZW5TeW5jVVJMJyB8ICdhdXRoSWRUb2tlbk1heEFnZSc7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIGJlIGluamVjdGVkIGludG8gdGhlIGVudmlyb25tZW50IGFzIF9fRklSRUJBU0VfREVGQVVMVFNfXyxcbiAqIGVpdGhlciBhcyBhIHByb3BlcnR5IG9mIGdsb2JhbFRoaXMsIGEgc2hlbGwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIGFcbiAqIGNvb2tpZS5cbiAqXG4gKiBUaGlzIG9iamVjdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZVxuICogYSBGaXJlYmFzZSBhcHAgYXMgd2VsbCBhcyBhbnkgZW11bGF0b3JzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXJlYmFzZURlZmF1bHRzIHtcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgZW11bGF0b3JIb3N0cz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIF9hdXRoVG9rZW5TeW5jVVJMPzogc3RyaW5nO1xuICBfYXV0aElkVG9rZW5NYXhBZ2U/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBPdmVycmlkZSBGaXJlYmFzZSdzIHJ1bnRpbWUgZW52aXJvbm1lbnQgZGV0ZWN0aW9uIGFuZFxuICAgKiBmb3JjZSB0aGUgU0RLIHRvIGFjdCBhcyBpZiBpdCB3ZXJlIGluIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQuXG4gICAqL1xuICBmb3JjZUVudmlyb25tZW50PzogJ2Jyb3dzZXInIHwgJ25vZGUnO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIC8vIE5lZWQgYHZhcmAgZm9yIHRoaXMgdG8gd29yay5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZhclxuICB2YXIgX19GSVJFQkFTRV9ERUZBVUxUU19fOiBGaXJlYmFzZURlZmF1bHRzIHwgdW5kZWZpbmVkO1xufVxuXG5jb25zdCBnZXREZWZhdWx0c0Zyb21HbG9iYWwgPSAoKTogRmlyZWJhc2VEZWZhdWx0cyB8IHVuZGVmaW5lZCA9PlxuICBnZXRHbG9iYWwoKS5fX0ZJUkVCQVNFX0RFRkFVTFRTX187XG5cbi8qKlxuICogQXR0ZW1wdCB0byByZWFkIGRlZmF1bHRzIGZyb20gYSBKU09OIHN0cmluZyBwcm92aWRlZCB0b1xuICogcHJvY2VzcyguKWVudiguKV9fRklSRUJBU0VfREVGQVVMVFNfXyBvciBhIEpTT04gZmlsZSB3aG9zZSBwYXRoIGlzIGluXG4gKiBwcm9jZXNzKC4pZW52KC4pX19GSVJFQkFTRV9ERUZBVUxUU19QQVRIX19cbiAqIFRoZSBkb3RzIGFyZSBpbiBwYXJlbnMgYmVjYXVzZSBjZXJ0YWluIGNvbXBpbGVycyAoVml0ZT8pIGNhbm5vdFxuICogaGFuZGxlIHNlZWluZyB0aGF0IHZhcmlhYmxlIGluIGNvbW1lbnRzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9maXJlYmFzZS9maXJlYmFzZS1qcy1zZGsvaXNzdWVzLzY4MzhcbiAqL1xuY29uc3QgZ2V0RGVmYXVsdHNGcm9tRW52VmFyaWFibGUgPSAoKTogRmlyZWJhc2VEZWZhdWx0cyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgcHJvY2VzcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdHlwZW9mIHByb2Nlc3MuZW52ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBkZWZhdWx0c0pzb25TdHJpbmcgPSBwcm9jZXNzLmVudi5fX0ZJUkVCQVNFX0RFRkFVTFRTX187XG4gIGlmIChkZWZhdWx0c0pzb25TdHJpbmcpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWZhdWx0c0pzb25TdHJpbmcpO1xuICB9XG59O1xuXG5jb25zdCBnZXREZWZhdWx0c0Zyb21Db29raWUgPSAoKTogRmlyZWJhc2VEZWZhdWx0cyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBtYXRjaDtcbiAgdHJ5IHtcbiAgICBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaCgvX19GSVJFQkFTRV9ERUZBVUxUU19fPShbXjtdKykvKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFNvbWUgZW52aXJvbm1lbnRzIHN1Y2ggYXMgQW5ndWxhciBVbml2ZXJzYWwgU1NSIGhhdmUgYVxuICAgIC8vIGBkb2N1bWVudGAgb2JqZWN0IGJ1dCBlcnJvciBvbiBhY2Nlc3NpbmcgYGRvY3VtZW50LmNvb2tpZWAuXG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGRlY29kZWQgPSBtYXRjaCAmJiBiYXNlNjREZWNvZGUobWF0Y2hbMV0pO1xuICByZXR1cm4gZGVjb2RlZCAmJiBKU09OLnBhcnNlKGRlY29kZWQpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3QuIEl0IGNoZWNrcyBpbiBvcmRlcjpcbiAqICgxKSBpZiBzdWNoIGFuIG9iamVjdCBleGlzdHMgYXMgYSBwcm9wZXJ0eSBvZiBgZ2xvYmFsVGhpc2BcbiAqICgyKSBpZiBzdWNoIGFuIG9iamVjdCB3YXMgcHJvdmlkZWQgb24gYSBzaGVsbCBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICogKDMpIGlmIHN1Y2ggYW4gb2JqZWN0IGV4aXN0cyBpbiBhIGNvb2tpZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdHMgPSAoKTogRmlyZWJhc2VEZWZhdWx0cyB8IHVuZGVmaW5lZCA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdldERlZmF1bHRzRnJvbUdsb2JhbCgpIHx8XG4gICAgICBnZXREZWZhdWx0c0Zyb21FbnZWYXJpYWJsZSgpIHx8XG4gICAgICBnZXREZWZhdWx0c0Zyb21Db29raWUoKVxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvKipcbiAgICAgKiBDYXRjaC1hbGwgZm9yIGJlaW5nIHVuYWJsZSB0byBnZXQgX19GSVJFQkFTRV9ERUZBVUxUU19fIGR1ZVxuICAgICAqIHRvIGFueSBlbnZpcm9ubWVudCBjYXNlIHdlIGhhdmUgbm90IGFjY291bnRlZCBmb3IuIExvZyB0b1xuICAgICAqIGluZm8gaW5zdGVhZCBvZiBzd2FsbG93aW5nIHNvIHdlIGNhbiBmaW5kIHRoZXNlIHVua25vd24gY2FzZXNcbiAgICAgKiBhbmQgYWRkIHBhdGhzIGZvciB0aGVtIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBjb25zb2xlLmluZm8oYFVuYWJsZSB0byBnZXQgX19GSVJFQkFTRV9ERUZBVUxUU19fIGR1ZSB0bzogJHtlfWApO1xuICAgIHJldHVybjtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIGVtdWxhdG9yIGhvc3Qgc3RvcmVkIGluIHRoZSBfX0ZJUkVCQVNFX0RFRkFVTFRTX18gb2JqZWN0XG4gKiBmb3IgdGhlIGdpdmVuIHByb2R1Y3QuXG4gKiBAcmV0dXJucyBhIFVSTCBob3N0IGZvcm1hdHRlZCBsaWtlIGAxMjcuMC4wLjE6OTk5OWAgb3IgYFs6OjFdOjQwMDBgIGlmIGF2YWlsYWJsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdCA9IChcbiAgcHJvZHVjdE5hbWU6IHN0cmluZ1xuKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IGdldERlZmF1bHRzKCk/LmVtdWxhdG9ySG9zdHM/Lltwcm9kdWN0TmFtZV07XG5cbi8qKlxuICogUmV0dXJucyBlbXVsYXRvciBob3N0bmFtZSBhbmQgcG9ydCBzdG9yZWQgaW4gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3RcbiAqIGZvciB0aGUgZ2l2ZW4gcHJvZHVjdC5cbiAqIEByZXR1cm5zIGEgcGFpciBvZiBob3N0bmFtZSBhbmQgcG9ydCBsaWtlIGBbXCI6OjFcIiwgNDAwMF1gIGlmIGF2YWlsYWJsZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdG5hbWVBbmRQb3J0ID0gKFxuICBwcm9kdWN0TmFtZTogc3RyaW5nXG4pOiBbaG9zdG5hbWU6IHN0cmluZywgcG9ydDogbnVtYmVyXSB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGhvc3QgPSBnZXREZWZhdWx0RW11bGF0b3JIb3N0KHByb2R1Y3ROYW1lKTtcbiAgaWYgKCFob3N0KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBzZXBhcmF0b3JJbmRleCA9IGhvc3QubGFzdEluZGV4T2YoJzonKTsgLy8gRmluZGluZyB0aGUgbGFzdCBzaW5jZSBJUHY2IGFkZHIgYWxzbyBoYXMgY29sb25zLlxuICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMCB8fCBzZXBhcmF0b3JJbmRleCArIDEgPT09IGhvc3QubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGhvc3QgJHtob3N0fSB3aXRoIG5vIHNlcGFyYXRlIGhvc3RuYW1lIGFuZCBwb3J0IWApO1xuICB9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgY29uc3QgcG9ydCA9IHBhcnNlSW50KGhvc3Quc3Vic3RyaW5nKHNlcGFyYXRvckluZGV4ICsgMSksIDEwKTtcbiAgaWYgKGhvc3RbMF0gPT09ICdbJykge1xuICAgIC8vIEJyYWNrZXQtcXVvdGVkIGBbaXB2NmFkZHJdOnBvcnRgID0+IHJldHVybiBcImlwdjZhZGRyXCIgKHdpdGhvdXQgYnJhY2tldHMpLlxuICAgIHJldHVybiBbaG9zdC5zdWJzdHJpbmcoMSwgc2VwYXJhdG9ySW5kZXggLSAxKSwgcG9ydF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFtob3N0LnN1YnN0cmluZygwLCBzZXBhcmF0b3JJbmRleCksIHBvcnRdO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgRmlyZWJhc2UgYXBwIGNvbmZpZyBzdG9yZWQgaW4gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0QXBwQ29uZmlnID0gKCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQgPT5cbiAgZ2V0RGVmYXVsdHMoKT8uY29uZmlnO1xuXG4vKipcbiAqIFJldHVybnMgYW4gZXhwZXJpbWVudGFsIHNldHRpbmcgb24gdGhlIF9fRklSRUJBU0VfREVGQVVMVFNfXyBvYmplY3QgKHByb3BlcnRpZXNcbiAqIHByZWZpeGVkIGJ5IFwiX1wiKVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwZXJpbWVudGFsU2V0dGluZyA9IDxUIGV4dGVuZHMgRXhwZXJpbWVudGFsS2V5PihcbiAgbmFtZTogVFxuKTogRmlyZWJhc2VEZWZhdWx0c1tgXyR7VH1gXSA9PlxuICBnZXREZWZhdWx0cygpPy5bYF8ke25hbWV9YF0gYXMgRmlyZWJhc2VEZWZhdWx0c1tgXyR7VH1gXTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQ8Uj4ge1xuICBwcm9taXNlOiBQcm9taXNlPFI+O1xuICByZWplY3Q6ICh2YWx1ZT86IHVua25vd24pID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcmVzb2x2ZTogKHZhbHVlPzogdW5rbm93bikgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmUgPSByZXNvbHZlIGFzICh2YWx1ZT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICB0aGlzLnJlamVjdCA9IHJlamVjdCBhcyAodmFsdWU/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE91ciBBUEkgaW50ZXJuYWxzIGFyZSBub3QgcHJvbWlzZWlmaWVkIGFuZCBjYW5ub3QgYmVjYXVzZSBvdXIgY2FsbGJhY2sgQVBJcyBoYXZlIHN1YnRsZSBleHBlY3RhdGlvbnMgYXJvdW5kXG4gICAqIGludm9raW5nIHByb21pc2VzIGlubGluZSwgd2hpY2ggUHJvbWlzZXMgYXJlIGZvcmJpZGRlbiB0byBkby4gVGhpcyBtZXRob2QgYWNjZXB0cyBhbiBvcHRpb25hbCBub2RlLXN0eWxlIGNhbGxiYWNrXG4gICAqIGFuZCByZXR1cm5zIGEgbm9kZS1zdHlsZSBjYWxsYmFjayB3aGljaCB3aWxsIHJlc29sdmUgb3IgcmVqZWN0IHRoZSBEZWZlcnJlZCdzIHByb21pc2UuXG4gICAqL1xuICB3cmFwQ2FsbGJhY2soXG4gICAgY2FsbGJhY2s/OiAoZXJyb3I/OiB1bmtub3duLCB2YWx1ZT86IHVua25vd24pID0+IHZvaWRcbiAgKTogKGVycm9yOiB1bmtub3duLCB2YWx1ZT86IHVua25vd24pID0+IHZvaWQge1xuICAgIHJldHVybiAoZXJyb3IsIHZhbHVlPykgPT4ge1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHRoaXMucmVqZWN0KGVycm9yKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZSh2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEF0dGFjaGluZyBub29wIGhhbmRsZXIganVzdCBpbiBjYXNlIGRldmVsb3BlciB3YXNuJ3QgZXhwZWN0aW5nXG4gICAgICAgIC8vIHByb21pc2VzXG4gICAgICAgIHRoaXMucHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG5cbiAgICAgICAgLy8gU29tZSBvZiBvdXIgY2FsbGJhY2tzIGRvbid0IGV4cGVjdCBhIHZhbHVlIGFuZCBvdXIgb3duIHRlc3RzXG4gICAgICAgIC8vIGFzc2VydCB0aGF0IHRoZSBwYXJhbWV0ZXIgbGVuZ3RoIGlzIDFcbiAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNhbGxiYWNrKGVycm9yKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhlcnJvciwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nIH0gZnJvbSAnLi9jcnlwdCc7XG5cbi8vIEZpcmViYXNlIEF1dGggdG9rZW5zIGNvbnRhaW4gc25ha2VfY2FzZSBjbGFpbXMgZm9sbG93aW5nIHRoZSBKV1Qgc3RhbmRhcmQgLyBjb252ZW50aW9uLlxuLyogZXNsaW50LWRpc2FibGUgY2FtZWxjYXNlICovXG5cbmV4cG9ydCB0eXBlIEZpcmViYXNlU2lnbkluUHJvdmlkZXIgPVxuICB8ICdjdXN0b20nXG4gIHwgJ2VtYWlsJ1xuICB8ICdwYXNzd29yZCdcbiAgfCAncGhvbmUnXG4gIHwgJ2Fub255bW91cydcbiAgfCAnZ29vZ2xlLmNvbSdcbiAgfCAnZmFjZWJvb2suY29tJ1xuICB8ICdnaXRodWIuY29tJ1xuICB8ICd0d2l0dGVyLmNvbSdcbiAgfCAnbWljcm9zb2Z0LmNvbSdcbiAgfCAnYXBwbGUuY29tJztcblxuaW50ZXJmYWNlIEZpcmViYXNlSWRUb2tlbiB7XG4gIC8vIEFsd2F5cyBzZXQgdG8gaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGUuY29tL1BST0pFQ1RfSURcbiAgaXNzOiBzdHJpbmc7XG5cbiAgLy8gQWx3YXlzIHNldCB0byBQUk9KRUNUX0lEXG4gIGF1ZDogc3RyaW5nO1xuXG4gIC8vIFRoZSB1c2VyJ3MgdW5pcXVlIElEXG4gIHN1Yjogc3RyaW5nO1xuXG4gIC8vIFRoZSB0b2tlbiBpc3N1ZSB0aW1lLCBpbiBzZWNvbmRzIHNpbmNlIGVwb2NoXG4gIGlhdDogbnVtYmVyO1xuXG4gIC8vIFRoZSB0b2tlbiBleHBpcnkgdGltZSwgbm9ybWFsbHkgJ2lhdCcgKyAzNjAwXG4gIGV4cDogbnVtYmVyO1xuXG4gIC8vIFRoZSB1c2VyJ3MgdW5pcXVlIElELiBNdXN0IGJlIGVxdWFsIHRvICdzdWInXG4gIHVzZXJfaWQ6IHN0cmluZztcblxuICAvLyBUaGUgdGltZSB0aGUgdXNlciBhdXRoZW50aWNhdGVkLCBub3JtYWxseSAnaWF0J1xuICBhdXRoX3RpbWU6IG51bWJlcjtcblxuICAvLyBUaGUgc2lnbiBpbiBwcm92aWRlciwgb25seSBzZXQgd2hlbiB0aGUgcHJvdmlkZXIgaXMgJ2Fub255bW91cydcbiAgcHJvdmlkZXJfaWQ/OiAnYW5vbnltb3VzJztcblxuICAvLyBUaGUgdXNlcidzIHByaW1hcnkgZW1haWxcbiAgZW1haWw/OiBzdHJpbmc7XG5cbiAgLy8gVGhlIHVzZXIncyBlbWFpbCB2ZXJpZmljYXRpb24gc3RhdHVzXG4gIGVtYWlsX3ZlcmlmaWVkPzogYm9vbGVhbjtcblxuICAvLyBUaGUgdXNlcidzIHByaW1hcnkgcGhvbmUgbnVtYmVyXG4gIHBob25lX251bWJlcj86IHN0cmluZztcblxuICAvLyBUaGUgdXNlcidzIGRpc3BsYXkgbmFtZVxuICBuYW1lPzogc3RyaW5nO1xuXG4gIC8vIFRoZSB1c2VyJ3MgcHJvZmlsZSBwaG90byBVUkxcbiAgcGljdHVyZT86IHN0cmluZztcblxuICAvLyBJbmZvcm1hdGlvbiBvbiBhbGwgaWRlbnRpdGllcyBsaW5rZWQgdG8gdGhpcyB1c2VyXG4gIGZpcmViYXNlOiB7XG4gICAgLy8gVGhlIHByaW1hcnkgc2lnbi1pbiBwcm92aWRlclxuICAgIHNpZ25faW5fcHJvdmlkZXI6IEZpcmViYXNlU2lnbkluUHJvdmlkZXI7XG5cbiAgICAvLyBBIG1hcCBvZiBwcm92aWRlcnMgdG8gdGhlIHVzZXIncyBsaXN0IG9mIHVuaXF1ZSBpZGVudGlmaWVycyBmcm9tXG4gICAgLy8gZWFjaCBwcm92aWRlclxuICAgIGlkZW50aXRpZXM/OiB7IFtwcm92aWRlciBpbiBGaXJlYmFzZVNpZ25JblByb3ZpZGVyXT86IHN0cmluZ1tdIH07XG4gIH07XG5cbiAgLy8gQ3VzdG9tIGNsYWltcyBzZXQgYnkgdGhlIGRldmVsb3BlclxuICBbY2xhaW06IHN0cmluZ106IHVua25vd247XG5cbiAgdWlkPzogbmV2ZXI7IC8vIFRyeSB0byBjYXRjaCBhIGNvbW1vbiBtaXN0YWtlIG9mIFwidWlkXCIgKHNob3VsZCBiZSBcInN1YlwiIGluc3RlYWQpLlxufVxuXG5leHBvcnQgdHlwZSBFbXVsYXRvck1vY2tUb2tlbk9wdGlvbnMgPSAoeyB1c2VyX2lkOiBzdHJpbmcgfSB8IHsgc3ViOiBzdHJpbmcgfSkgJlxuICBQYXJ0aWFsPEZpcmViYXNlSWRUb2tlbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2NrVXNlclRva2VuKFxuICB0b2tlbjogRW11bGF0b3JNb2NrVG9rZW5PcHRpb25zLFxuICBwcm9qZWN0SWQ/OiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGlmICh0b2tlbi51aWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnVGhlIFwidWlkXCIgZmllbGQgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBtb2NrVXNlclRva2VuLiBQbGVhc2UgdXNlIFwic3ViXCIgaW5zdGVhZCBmb3IgRmlyZWJhc2UgQXV0aCBVc2VyIElELidcbiAgICApO1xuICB9XG4gIC8vIFVuc2VjdXJlZCBKV1RzIHVzZSBcIm5vbmVcIiBhcyB0aGUgYWxnb3JpdGhtLlxuICBjb25zdCBoZWFkZXIgPSB7XG4gICAgYWxnOiAnbm9uZScsXG4gICAgdHlwZTogJ0pXVCdcbiAgfTtcblxuICBjb25zdCBwcm9qZWN0ID0gcHJvamVjdElkIHx8ICdkZW1vLXByb2plY3QnO1xuICBjb25zdCBpYXQgPSB0b2tlbi5pYXQgfHwgMDtcbiAgY29uc3Qgc3ViID0gdG9rZW4uc3ViIHx8IHRva2VuLnVzZXJfaWQ7XG4gIGlmICghc3ViKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibW9ja1VzZXJUb2tlbiBtdXN0IGNvbnRhaW4gJ3N1Yicgb3IgJ3VzZXJfaWQnIGZpZWxkIVwiKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQ6IEZpcmViYXNlSWRUb2tlbiA9IHtcbiAgICAvLyBTZXQgYWxsIHJlcXVpcmVkIGZpZWxkcyB0byBkZWNlbnQgZGVmYXVsdHNcbiAgICBpc3M6IGBodHRwczovL3NlY3VyZXRva2VuLmdvb2dsZS5jb20vJHtwcm9qZWN0fWAsXG4gICAgYXVkOiBwcm9qZWN0LFxuICAgIGlhdCxcbiAgICBleHA6IGlhdCArIDM2MDAsXG4gICAgYXV0aF90aW1lOiBpYXQsXG4gICAgc3ViLFxuICAgIHVzZXJfaWQ6IHN1YixcbiAgICBmaXJlYmFzZToge1xuICAgICAgc2lnbl9pbl9wcm92aWRlcjogJ2N1c3RvbScsXG4gICAgICBpZGVudGl0aWVzOiB7fVxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB3aXRoIHVzZXIgb3B0aW9uc1xuICAgIC4uLnRva2VuXG4gIH07XG5cbiAgLy8gVW5zZWN1cmVkIEpXVHMgdXNlIHRoZSBlbXB0eSBzdHJpbmcgYXMgYSBzaWduYXR1cmUuXG4gIGNvbnN0IHNpZ25hdHVyZSA9ICcnO1xuICByZXR1cm4gW1xuICAgIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nKEpTT04uc3RyaW5naWZ5KGhlYWRlcikpLFxuICAgIGJhc2U2NHVybEVuY29kZVdpdGhvdXRQYWRkaW5nKEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKSxcbiAgICBzaWduYXR1cmVcbiAgXS5qb2luKCcuJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ09OU1RBTlRTIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdHMgfSBmcm9tICcuL2RlZmF1bHRzJztcblxuLyoqXG4gKiBSZXR1cm5zIG5hdmlnYXRvci51c2VyQWdlbnQgc3RyaW5nIG9yICcnIGlmIGl0J3Mgbm90IGRlZmluZWQuXG4gKiBAcmV0dXJuIHVzZXIgYWdlbnQgc3RyaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVQSgpOiBzdHJpbmcge1xuICBpZiAoXG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgbmF2aWdhdG9yWyd1c2VyQWdlbnQnXSA9PT0gJ3N0cmluZydcbiAgKSB7XG4gICAgcmV0dXJuIG5hdmlnYXRvclsndXNlckFnZW50J107XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IENvcmRvdmEgLyBQaG9uZUdhcCAvIElvbmljIGZyYW1ld29ya3Mgb24gYSBtb2JpbGUgZGV2aWNlLlxuICpcbiAqIERlbGliZXJhdGVseSBkb2VzIG5vdCByZWx5IG9uIGNoZWNraW5nIGBmaWxlOi8vYCBVUkxzIChhcyB0aGlzIGZhaWxzIFBob25lR2FwXG4gKiBpbiB0aGUgUmlwcGxlIGVtdWxhdG9yKSBub3IgQ29yZG92YSBgb25EZXZpY2VSZWFkeWAsIHdoaWNoIHdvdWxkIG5vcm1hbGx5XG4gKiB3YWl0IGZvciBhIGNhbGxiYWNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGVDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgLy8gQHRzLWlnbm9yZSBTZXR0aW5nIHVwIGFuIGJyb2FkbHkgYXBwbGljYWJsZSBpbmRleCBzaWduYXR1cmUgZm9yIFdpbmRvd1xuICAgIC8vIGp1c3QgdG8gZGVhbCB3aXRoIHRoaXMgY2FzZSB3b3VsZCBwcm9iYWJseSBiZSBhIGJhZCBpZGVhLlxuICAgICEhKHdpbmRvd1snY29yZG92YSddIHx8IHdpbmRvd1sncGhvbmVnYXAnXSB8fCB3aW5kb3dbJ1Bob25lR2FwJ10pICYmXG4gICAgL2lvc3xpcGhvbmV8aXBvZHxpcGFkfGFuZHJvaWR8YmxhY2tiZXJyeXxpZW1vYmlsZS9pLnRlc3QoZ2V0VUEoKSlcbiAgKTtcbn1cblxuLyoqXG4gKiBEZXRlY3QgTm9kZS5qcy5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgTm9kZS5qcyBlbnZpcm9ubWVudCBpcyBkZXRlY3RlZCBvciBzcGVjaWZpZWQuXG4gKi9cbi8vIE5vZGUgZGV0ZWN0aW9uIGxvZ2ljIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9pbGlha2FuL2RldGVjdC1ub2RlL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZSgpOiBib29sZWFuIHtcbiAgY29uc3QgZm9yY2VFbnZpcm9ubWVudCA9IGdldERlZmF1bHRzKCk/LmZvcmNlRW52aXJvbm1lbnQ7XG4gIGlmIChmb3JjZUVudmlyb25tZW50ID09PSAnbm9kZScpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChmb3JjZUVudmlyb25tZW50ID09PSAnYnJvd3NlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSAnW29iamVjdCBwcm9jZXNzXSdcbiAgICApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogRGV0ZWN0IEJyb3dzZXIgRW52aXJvbm1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyAmJiBzZWxmLnNlbGYgPT09IHNlbGY7XG59XG5cbi8qKlxuICogRGV0ZWN0IGJyb3dzZXIgZXh0ZW5zaW9ucyAoQ2hyb21lIGFuZCBGaXJlZm94IGF0IGxlYXN0KS5cbiAqL1xuaW50ZXJmYWNlIEJyb3dzZXJSdW50aW1lIHtcbiAgaWQ/OiB1bmtub3duO1xufVxuZGVjbGFyZSBjb25zdCBjaHJvbWU6IHsgcnVudGltZT86IEJyb3dzZXJSdW50aW1lIH07XG5kZWNsYXJlIGNvbnN0IGJyb3dzZXI6IHsgcnVudGltZT86IEJyb3dzZXJSdW50aW1lIH07XG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyRXh0ZW5zaW9uKCk6IGJvb2xlYW4ge1xuICBjb25zdCBydW50aW1lID1cbiAgICB0eXBlb2YgY2hyb21lID09PSAnb2JqZWN0J1xuICAgICAgPyBjaHJvbWUucnVudGltZVxuICAgICAgOiB0eXBlb2YgYnJvd3NlciA9PT0gJ29iamVjdCdcbiAgICAgID8gYnJvd3Nlci5ydW50aW1lXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiBydW50aW1lID09PSAnb2JqZWN0JyAmJiBydW50aW1lLmlkICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IFJlYWN0IE5hdGl2ZS5cbiAqXG4gKiBAcmV0dXJuIHRydWUgaWYgUmVhY3ROYXRpdmUgZW52aXJvbm1lbnQgaXMgZGV0ZWN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1JlYWN0TmF0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBuYXZpZ2F0b3IgPT09ICdvYmplY3QnICYmIG5hdmlnYXRvclsncHJvZHVjdCddID09PSAnUmVhY3ROYXRpdmUnXG4gICk7XG59XG5cbi8qKiBEZXRlY3RzIEVsZWN0cm9uIGFwcHMuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVjdHJvbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldFVBKCkuaW5kZXhPZignRWxlY3Ryb24vJykgPj0gMDtcbn1cblxuLyoqIERldGVjdHMgSW50ZXJuZXQgRXhwbG9yZXIuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJRSgpOiBib29sZWFuIHtcbiAgY29uc3QgdWEgPSBnZXRVQSgpO1xuICByZXR1cm4gdWEuaW5kZXhPZignTVNJRSAnKSA+PSAwIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgPj0gMDtcbn1cblxuLyoqIERldGVjdHMgVW5pdmVyc2FsIFdpbmRvd3MgUGxhdGZvcm0gYXBwcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1VXUCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGdldFVBKCkuaW5kZXhPZignTVNBcHBIb3N0LycpID49IDA7XG59XG5cbi8qKlxuICogRGV0ZWN0IHdoZXRoZXIgdGhlIGN1cnJlbnQgU0RLIGJ1aWxkIGlzIHRoZSBOb2RlIHZlcnNpb24uXG4gKlxuICogQHJldHVybiB0cnVlIGlmIGl0J3MgdGhlIE5vZGUgU0RLIGJ1aWxkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlU2RrKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQ09OU1RBTlRTLk5PREVfQ0xJRU5UID09PSB0cnVlIHx8IENPTlNUQU5UUy5OT0RFX0FETUlOID09PSB0cnVlO1xufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHdlIGFyZSBydW5uaW5nIGluIFNhZmFyaS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmFyaSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICAhaXNOb2RlKCkgJiZcbiAgICBuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdTYWZhcmknKSAmJlxuICAgICFuYXZpZ2F0b3IudXNlckFnZW50LmluY2x1ZGVzKCdDaHJvbWUnKVxuICApO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiBpbmRleGVkREIgaXMgc3VwcG9ydGVkIGJ5IGN1cnJlbnQgYnJvd3Nlci9zZXJ2aWNlIHdvcmtlciBjb250ZXh0XG4gKiBAcmV0dXJuIHRydWUgaWYgaW5kZXhlZERCIGlzIHN1cHBvcnRlZCBieSBjdXJyZW50IGJyb3dzZXIvc2VydmljZSB3b3JrZXIgY29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbmRleGVkREJBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbmRleGVkREIgPT09ICdvYmplY3QnO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBtZXRob2QgdmFsaWRhdGVzIGJyb3dzZXIvc3cgY29udGV4dCBmb3IgaW5kZXhlZERCIGJ5IG9wZW5pbmcgYSBkdW1teSBpbmRleGVkREIgZGF0YWJhc2UgYW5kIHJlamVjdFxuICogaWYgZXJyb3JzIG9jY3VyIGR1cmluZyB0aGUgZGF0YWJhc2Ugb3BlbiBvcGVyYXRpb24uXG4gKlxuICogQHRocm93cyBleGNlcHRpb24gaWYgY3VycmVudCBicm93c2VyL3N3IGNvbnRleHQgY2FuJ3QgcnVuIGlkYi5vcGVuIChleDogU2FmYXJpIGlmcmFtZSwgRmlyZWZveFxuICogcHJpdmF0ZSBicm93c2luZylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGxldCBwcmVFeGlzdDogYm9vbGVhbiA9IHRydWU7XG4gICAgICBjb25zdCBEQl9DSEVDS19OQU1FID1cbiAgICAgICAgJ3ZhbGlkYXRlLWJyb3dzZXItY29udGV4dC1mb3ItaW5kZXhlZGRiLWFuYWx5dGljcy1tb2R1bGUnO1xuICAgICAgY29uc3QgcmVxdWVzdCA9IHNlbGYuaW5kZXhlZERCLm9wZW4oREJfQ0hFQ0tfTkFNRSk7XG4gICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZXN1bHQuY2xvc2UoKTtcbiAgICAgICAgLy8gZGVsZXRlIGRhdGFiYXNlIG9ubHkgd2hlbiBpdCBkb2Vzbid0IHByZS1leGlzdFxuICAgICAgICBpZiAoIXByZUV4aXN0KSB7XG4gICAgICAgICAgc2VsZi5pbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoREJfQ0hFQ0tfTkFNRSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgIH07XG4gICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHtcbiAgICAgICAgcHJlRXhpc3QgPSBmYWxzZTtcbiAgICAgIH07XG5cbiAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcbiAgICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3I/Lm1lc3NhZ2UgfHwgJycpO1xuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBUaGlzIG1ldGhvZCBjaGVja3Mgd2hldGhlciBjb29raWUgaXMgZW5hYmxlZCB3aXRoaW4gY3VycmVudCBicm93c2VyXG4gKiBAcmV0dXJuIHRydWUgaWYgY29va2llIGlzIGVuYWJsZWQgd2l0aGluIGN1cnJlbnQgYnJvd3NlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJlQ29va2llc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhbmF2aWdhdG9yLmNvb2tpZUVuYWJsZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGZpbGVvdmVydmlldyBTdGFuZGFyZGl6ZWQgRmlyZWJhc2UgRXJyb3IuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogICAvLyBUeXBlc2NyaXB0IHN0cmluZyBsaXRlcmFscyBmb3IgdHlwZS1zYWZlIGNvZGVzXG4gKiAgIHR5cGUgRXJyID1cbiAqICAgICAndW5rbm93bicgfFxuICogICAgICdvYmplY3Qtbm90LWZvdW5kJ1xuICogICAgIDtcbiAqXG4gKiAgIC8vIENsb3N1cmUgZW51bSBmb3IgdHlwZS1zYWZlIGVycm9yIGNvZGVzXG4gKiAgIC8vIGF0LWVudW0ge3N0cmluZ31cbiAqICAgdmFyIEVyciA9IHtcbiAqICAgICBVTktOT1dOOiAndW5rbm93bicsXG4gKiAgICAgT0JKRUNUX05PVF9GT1VORDogJ29iamVjdC1ub3QtZm91bmQnLFxuICogICB9XG4gKlxuICogICBsZXQgZXJyb3JzOiBNYXA8RXJyLCBzdHJpbmc+ID0ge1xuICogICAgICdnZW5lcmljLWVycm9yJzogXCJVbmtub3duIGVycm9yXCIsXG4gKiAgICAgJ2ZpbGUtbm90LWZvdW5kJzogXCJDb3VsZCBub3QgZmluZCBmaWxlOiB7JGZpbGV9XCIsXG4gKiAgIH07XG4gKlxuICogICAvLyBUeXBlLXNhZmUgZnVuY3Rpb24gLSBtdXN0IHBhc3MgYSB2YWxpZCBlcnJvciBjb2RlIGFzIHBhcmFtLlxuICogICBsZXQgZXJyb3IgPSBuZXcgRXJyb3JGYWN0b3J5PEVycj4oJ3NlcnZpY2UnLCAnU2VydmljZScsIGVycm9ycyk7XG4gKlxuICogICAuLi5cbiAqICAgdGhyb3cgZXJyb3IuY3JlYXRlKEVyci5HRU5FUklDKTtcbiAqICAgLi4uXG4gKiAgIHRocm93IGVycm9yLmNyZWF0ZShFcnIuRklMRV9OT1RfRk9VTkQsIHsnZmlsZSc6IGZpbGVOYW1lfSk7XG4gKiAgIC4uLlxuICogICAvLyBTZXJ2aWNlOiBDb3VsZCBub3QgZmlsZSBmaWxlOiBmb28udHh0IChzZXJ2aWNlL2ZpbGUtbm90LWZvdW5kKS5cbiAqXG4gKiAgIGNhdGNoIChlKSB7XG4gKiAgICAgYXNzZXJ0KGUubWVzc2FnZSA9PT0gXCJDb3VsZCBub3QgZmluZCBmaWxlOiBmb28udHh0LlwiKTtcbiAqICAgICBpZiAoKGUgYXMgRmlyZWJhc2VFcnJvcik/LmNvZGUgPT09ICdzZXJ2aWNlL2ZpbGUtbm90LWZvdW5kJykge1xuICogICAgICAgY29uc29sZS5sb2coXCJDb3VsZCBub3QgcmVhZCBmaWxlOiBcIiArIGVbJ2ZpbGUnXSk7XG4gKiAgICAgfVxuICogICB9XG4gKi9cblxuZXhwb3J0IHR5cGUgRXJyb3JNYXA8RXJyb3JDb2RlIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgcmVhZG9ubHkgW0sgaW4gRXJyb3JDb2RlXTogc3RyaW5nO1xufTtcblxuY29uc3QgRVJST1JfTkFNRSA9ICdGaXJlYmFzZUVycm9yJztcblxuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdMaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVycm9yRGF0YSB7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8vIEJhc2VkIG9uIGNvZGUgZnJvbTpcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Vycm9yI0N1c3RvbV9FcnJvcl9UeXBlc1xuZXhwb3J0IGNsYXNzIEZpcmViYXNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKiBUaGUgY3VzdG9tIG5hbWUgZm9yIGFsbCBGaXJlYmFzZUVycm9ycy4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gRVJST1JfTkFNRTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAvKiogVGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgZXJyb3IuICovXG4gICAgcmVhZG9ubHkgY29kZTogc3RyaW5nLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAvKiogQ3VzdG9tIGRhdGEgZm9yIHRoaXMgZXJyb3IuICovXG4gICAgcHVibGljIGN1c3RvbURhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcblxuICAgIC8vIEZpeCBGb3IgRVM1XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgRmlyZWJhc2VFcnJvci5wcm90b3R5cGUpO1xuXG4gICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSBmb3Igd2hlcmUgb3VyIGVycm9yIHdhcyB0aHJvd24uXG4gICAgLy8gT25seSBhdmFpbGFibGUgb24gVjguXG4gICAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBFcnJvckZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFcnJvckZhY3Rvcnk8XG4gIEVycm9yQ29kZSBleHRlbmRzIHN0cmluZyxcbiAgRXJyb3JQYXJhbXMgZXh0ZW5kcyB7IHJlYWRvbmx5IFtLIGluIEVycm9yQ29kZV0/OiBFcnJvckRhdGEgfSA9IHt9XG4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JzOiBFcnJvck1hcDxFcnJvckNvZGU+XG4gICkge31cblxuICBjcmVhdGU8SyBleHRlbmRzIEVycm9yQ29kZT4oXG4gICAgY29kZTogSyxcbiAgICAuLi5kYXRhOiBLIGV4dGVuZHMga2V5b2YgRXJyb3JQYXJhbXMgPyBbRXJyb3JQYXJhbXNbS11dIDogW11cbiAgKTogRmlyZWJhc2VFcnJvciB7XG4gICAgY29uc3QgY3VzdG9tRGF0YSA9IChkYXRhWzBdIGFzIEVycm9yRGF0YSkgfHwge307XG4gICAgY29uc3QgZnVsbENvZGUgPSBgJHt0aGlzLnNlcnZpY2V9LyR7Y29kZX1gO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy5lcnJvcnNbY29kZV07XG5cbiAgICBjb25zdCBtZXNzYWdlID0gdGVtcGxhdGUgPyByZXBsYWNlVGVtcGxhdGUodGVtcGxhdGUsIGN1c3RvbURhdGEpIDogJ0Vycm9yJztcbiAgICAvLyBTZXJ2aWNlIE5hbWU6IEVycm9yIG1lc3NhZ2UgKHNlcnZpY2UvY29kZSkuXG4gICAgY29uc3QgZnVsbE1lc3NhZ2UgPSBgJHt0aGlzLnNlcnZpY2VOYW1lfTogJHttZXNzYWdlfSAoJHtmdWxsQ29kZX0pLmA7XG5cbiAgICBjb25zdCBlcnJvciA9IG5ldyBGaXJlYmFzZUVycm9yKGZ1bGxDb2RlLCBmdWxsTWVzc2FnZSwgY3VzdG9tRGF0YSk7XG5cbiAgICByZXR1cm4gZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVwbGFjZVRlbXBsYXRlKHRlbXBsYXRlOiBzdHJpbmcsIGRhdGE6IEVycm9yRGF0YSk6IHN0cmluZyB7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKFBBVFRFUk4sIChfLCBrZXkpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IFN0cmluZyh2YWx1ZSkgOiBgPCR7a2V5fT8+YDtcbiAgfSk7XG59XG5cbmNvbnN0IFBBVFRFUk4gPSAvXFx7XFwkKFtefV0rKX0vZztcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEV2YWx1YXRlcyBhIEpTT04gc3RyaW5nIGludG8gYSBqYXZhc2NyaXB0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIEEgc3RyaW5nIGNvbnRhaW5pbmcgSlNPTi5cbiAqIEByZXR1cm4geyp9IFRoZSBqYXZhc2NyaXB0IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHNwZWNpZmllZCBKU09OLlxuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbkV2YWwoc3RyOiBzdHJpbmcpOiB1bmtub3duIHtcbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIEpTT04gcmVwcmVzZW50aW5nIGEgamF2YXNjcmlwdCBvYmplY3QuXG4gKiBAcGFyYW0geyp9IGRhdGEgSmF2YXNjcmlwdCBvYmplY3QgdG8gYmUgc3RyaW5naWZpZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBKU09OIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkoZGF0YTogdW5rbm93bik6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShkYXRhKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBiYXNlNjREZWNvZGUgfSBmcm9tICcuL2NyeXB0JztcbmltcG9ydCB7IGpzb25FdmFsIH0gZnJvbSAnLi9qc29uJztcblxuaW50ZXJmYWNlIENsYWltcyB7XG4gIFtrZXk6IHN0cmluZ106IHt9O1xufVxuXG5pbnRlcmZhY2UgRGVjb2RlZFRva2VuIHtcbiAgaGVhZGVyOiBvYmplY3Q7XG4gIGNsYWltczogQ2xhaW1zO1xuICBkYXRhOiBvYmplY3Q7XG4gIHNpZ25hdHVyZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERlY29kZXMgYSBGaXJlYmFzZSBhdXRoLiB0b2tlbiBpbnRvIGNvbnN0aXR1ZW50IHBhcnRzLlxuICpcbiAqIE5vdGVzOlxuICogLSBNYXkgcmV0dXJuIHdpdGggaW52YWxpZCAvIGluY29tcGxldGUgY2xhaW1zIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRlY29kZSA9IGZ1bmN0aW9uICh0b2tlbjogc3RyaW5nKTogRGVjb2RlZFRva2VuIHtcbiAgbGV0IGhlYWRlciA9IHt9LFxuICAgIGNsYWltczogQ2xhaW1zID0ge30sXG4gICAgZGF0YSA9IHt9LFxuICAgIHNpZ25hdHVyZSA9ICcnO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFydHMgPSB0b2tlbi5zcGxpdCgnLicpO1xuICAgIGhlYWRlciA9IGpzb25FdmFsKGJhc2U2NERlY29kZShwYXJ0c1swXSkgfHwgJycpIGFzIG9iamVjdDtcbiAgICBjbGFpbXMgPSBqc29uRXZhbChiYXNlNjREZWNvZGUocGFydHNbMV0pIHx8ICcnKSBhcyBDbGFpbXM7XG4gICAgc2lnbmF0dXJlID0gcGFydHNbMl07XG4gICAgZGF0YSA9IGNsYWltc1snZCddIHx8IHt9O1xuICAgIGRlbGV0ZSBjbGFpbXNbJ2QnXTtcbiAgfSBjYXRjaCAoZSkge31cblxuICByZXR1cm4ge1xuICAgIGhlYWRlcixcbiAgICBjbGFpbXMsXG4gICAgZGF0YSxcbiAgICBzaWduYXR1cmVcbiAgfTtcbn07XG5cbmludGVyZmFjZSBEZWNvZGVkVG9rZW4ge1xuICBoZWFkZXI6IG9iamVjdDtcbiAgY2xhaW1zOiBDbGFpbXM7XG4gIGRhdGE6IG9iamVjdDtcbiAgc2lnbmF0dXJlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGVjb2RlcyBhIEZpcmViYXNlIGF1dGguIHRva2VuIGFuZCBjaGVja3MgdGhlIHZhbGlkaXR5IG9mIGl0cyB0aW1lLWJhc2VkIGNsYWltcy4gV2lsbCByZXR1cm4gdHJ1ZSBpZiB0aGVcbiAqIHRva2VuIGlzIHdpdGhpbiB0aGUgdGltZSB3aW5kb3cgYXV0aG9yaXplZCBieSB0aGUgJ25iZicgKG5vdC1iZWZvcmUpIGFuZCAnaWF0JyAoaXNzdWVkLWF0KSBjbGFpbXMuXG4gKlxuICogTm90ZXM6XG4gKiAtIE1heSByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZSBpZiB0aGVyZSdzIG5vIG5hdGl2ZSBiYXNlNjQgZGVjb2Rpbmcgc3VwcG9ydC5cbiAqIC0gRG9lc24ndCBjaGVjayBpZiB0aGUgdG9rZW4gaXMgYWN0dWFsbHkgdmFsaWQuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbGlkVGltZXN0YW1wID0gZnVuY3Rpb24gKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY2xhaW1zOiBDbGFpbXMgPSBkZWNvZGUodG9rZW4pLmNsYWltcztcbiAgY29uc3Qgbm93OiBudW1iZXIgPSBNYXRoLmZsb29yKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCk7XG4gIGxldCB2YWxpZFNpbmNlOiBudW1iZXIgPSAwLFxuICAgIHZhbGlkVW50aWw6IG51bWJlciA9IDA7XG5cbiAgaWYgKHR5cGVvZiBjbGFpbXMgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnbmJmJykpIHtcbiAgICAgIHZhbGlkU2luY2UgPSBjbGFpbXNbJ25iZiddIGFzIG51bWJlcjtcbiAgICB9IGVsc2UgaWYgKGNsYWltcy5oYXNPd25Qcm9wZXJ0eSgnaWF0JykpIHtcbiAgICAgIHZhbGlkU2luY2UgPSBjbGFpbXNbJ2lhdCddIGFzIG51bWJlcjtcbiAgICB9XG5cbiAgICBpZiAoY2xhaW1zLmhhc093blByb3BlcnR5KCdleHAnKSkge1xuICAgICAgdmFsaWRVbnRpbCA9IGNsYWltc1snZXhwJ10gYXMgbnVtYmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0b2tlbiB3aWxsIGV4cGlyZSBhZnRlciAyNGggYnkgZGVmYXVsdFxuICAgICAgdmFsaWRVbnRpbCA9IHZhbGlkU2luY2UgKyA4NjQwMDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgICEhbm93ICYmXG4gICAgISF2YWxpZFNpbmNlICYmXG4gICAgISF2YWxpZFVudGlsICYmXG4gICAgbm93ID49IHZhbGlkU2luY2UgJiZcbiAgICBub3cgPD0gdmFsaWRVbnRpbFxuICApO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIHJldHVybnMgaXRzIGlzc3VlZCBhdCB0aW1lIGlmIHZhbGlkLCBudWxsIG90aGVyd2lzZS5cbiAqXG4gKiBOb3RlczpcbiAqIC0gTWF5IHJldHVybiBudWxsIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzc3VlZEF0VGltZSA9IGZ1bmN0aW9uICh0b2tlbjogc3RyaW5nKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGNsYWltczogQ2xhaW1zID0gZGVjb2RlKHRva2VuKS5jbGFpbXM7XG4gIGlmICh0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpKSB7XG4gICAgcmV0dXJuIGNsYWltc1snaWF0J10gYXMgbnVtYmVyO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIGEgRmlyZWJhc2UgYXV0aC4gdG9rZW4gYW5kIGNoZWNrcyB0aGUgdmFsaWRpdHkgb2YgaXRzIGZvcm1hdC4gRXhwZWN0cyBhIHZhbGlkIGlzc3VlZC1hdCB0aW1lLlxuICpcbiAqIE5vdGVzOlxuICogLSBNYXkgcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUgaWYgdGhlcmUncyBubyBuYXRpdmUgYmFzZTY0IGRlY29kaW5nIHN1cHBvcnQuXG4gKiAtIERvZXNuJ3QgY2hlY2sgaWYgdGhlIHRva2VuIGlzIGFjdHVhbGx5IHZhbGlkLlxuICovXG5leHBvcnQgY29uc3QgaXNWYWxpZEZvcm1hdCA9IGZ1bmN0aW9uICh0b2tlbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRlY29kZWQgPSBkZWNvZGUodG9rZW4pLFxuICAgIGNsYWltcyA9IGRlY29kZWQuY2xhaW1zO1xuXG4gIHJldHVybiAhIWNsYWltcyAmJiB0eXBlb2YgY2xhaW1zID09PSAnb2JqZWN0JyAmJiBjbGFpbXMuaGFzT3duUHJvcGVydHkoJ2lhdCcpO1xufTtcblxuLyoqXG4gKiBBdHRlbXB0cyB0byBwZWVyIGludG8gYW4gYXV0aCB0b2tlbiBhbmQgZGV0ZXJtaW5lIGlmIGl0J3MgYW4gYWRtaW4gYXV0aCB0b2tlbiBieSBsb29raW5nIGF0IHRoZSBjbGFpbXMgcG9ydGlvbi5cbiAqXG4gKiBOb3RlczpcbiAqIC0gTWF5IHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlIGlmIHRoZXJlJ3Mgbm8gbmF0aXZlIGJhc2U2NCBkZWNvZGluZyBzdXBwb3J0LlxuICogLSBEb2Vzbid0IGNoZWNrIGlmIHRoZSB0b2tlbiBpcyBhY3R1YWxseSB2YWxpZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQWRtaW4gPSBmdW5jdGlvbiAodG9rZW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBjbGFpbXM6IENsYWltcyA9IGRlY29kZSh0b2tlbikuY2xhaW1zO1xuICByZXR1cm4gdHlwZW9mIGNsYWltcyA9PT0gJ29iamVjdCcgJiYgY2xhaW1zWydhZG1pbiddID09PSB0cnVlO1xufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBULCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVHZXQ8VCBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIFQ+KFxuICBvYmo6IFQsXG4gIGtleTogS1xuKTogVFtLXSB8IHVuZGVmaW5lZCB7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgcmV0dXJuIG9ialtrZXldO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHkob2JqOiBvYmplY3QpOiBvYmogaXMge30ge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcDxLIGV4dGVuZHMgc3RyaW5nLCBWLCBVPihcbiAgb2JqOiB7IFtrZXkgaW4gS106IFYgfSxcbiAgZm46ICh2YWx1ZTogViwga2V5OiBLLCBvYmo6IHsgW2tleSBpbiBLXTogViB9KSA9PiBVLFxuICBjb250ZXh0T2JqPzogdW5rbm93blxuKTogeyBba2V5IGluIEtdOiBVIH0ge1xuICBjb25zdCByZXM6IFBhcnRpYWw8eyBba2V5IGluIEtdOiBVIH0+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICByZXNba2V5XSA9IGZuLmNhbGwoY29udGV4dE9iaiwgb2JqW2tleV0sIGtleSwgb2JqKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcyBhcyB7IFtrZXkgaW4gS106IFUgfTtcbn1cblxuLyoqXG4gKiBEZWVwIGVxdWFsIHR3byBvYmplY3RzLiBTdXBwb3J0IEFycmF5cyBhbmQgT2JqZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChhOiBvYmplY3QsIGI6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhhKTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhiKTtcbiAgZm9yIChjb25zdCBrIG9mIGFLZXlzKSB7XG4gICAgaWYgKCFiS2V5cy5pbmNsdWRlcyhrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGFQcm9wID0gKGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tdO1xuICAgIGNvbnN0IGJQcm9wID0gKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tdO1xuICAgIGlmIChpc09iamVjdChhUHJvcCkgJiYgaXNPYmplY3QoYlByb3ApKSB7XG4gICAgICBpZiAoIWRlZXBFcXVhbChhUHJvcCwgYlByb3ApKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFQcm9wICE9PSBiUHJvcCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgayBvZiBiS2V5cykge1xuICAgIGlmICghYUtleXMuaW5jbHVkZXMoaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KHRoaW5nOiB1bmtub3duKTogdGhpbmcgaXMgb2JqZWN0IHtcbiAgcmV0dXJuIHRoaW5nICE9PSBudWxsICYmIHR5cGVvZiB0aGluZyA9PT0gJ29iamVjdCc7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRGVmZXJyZWQgfSBmcm9tICcuL2RlZmVycmVkJztcblxuLyoqXG4gKiBSZWplY3RzIGlmIHRoZSBnaXZlbiBwcm9taXNlIGRvZXNuJ3QgcmVzb2x2ZSBpbiB0aW1lSW5NUyBtaWxsaXNlY29uZHMuXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb21pc2VXaXRoVGltZW91dDxUPihcbiAgcHJvbWlzZTogUHJvbWlzZTxUPixcbiAgdGltZUluTVMgPSAyMDAwXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgZGVmZXJyZWRQcm9taXNlID0gbmV3IERlZmVycmVkPFQ+KCk7XG4gIHNldFRpbWVvdXQoKCkgPT4gZGVmZXJyZWRQcm9taXNlLnJlamVjdCgndGltZW91dCEnKSwgdGltZUluTVMpO1xuICBwcm9taXNlLnRoZW4oZGVmZXJyZWRQcm9taXNlLnJlc29sdmUsIGRlZmVycmVkUHJvbWlzZS5yZWplY3QpO1xuICByZXR1cm4gZGVmZXJyZWRQcm9taXNlLnByb21pc2U7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVlcnlzdHJpbmctZm9ybWF0dGVkIHN0cmluZyAoZS5nLiAmYXJnPXZhbCZhcmcyPXZhbDIpIGZyb20gYVxuICogcGFyYW1zIG9iamVjdCAoZS5nLiB7YXJnOiAndmFsJywgYXJnMjogJ3ZhbDInfSlcbiAqIE5vdGU6IFlvdSBtdXN0IHByZXBlbmQgaXQgd2l0aCA/IHdoZW4gYWRkaW5nIGl0IHRvIGEgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlzdHJpbmcocXVlcnlzdHJpbmdQYXJhbXM6IHtcbiAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyO1xufSk6IHN0cmluZyB7XG4gIGNvbnN0IHBhcmFtcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhxdWVyeXN0cmluZ1BhcmFtcykpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIHZhbHVlLmZvckVhY2goYXJyYXlWYWwgPT4ge1xuICAgICAgICBwYXJhbXMucHVzaChcbiAgICAgICAgICBlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChhcnJheVZhbClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXMucHVzaChlbmNvZGVVUklDb21wb25lbnQoa2V5KSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyYW1zLmxlbmd0aCA/ICcmJyArIHBhcmFtcy5qb2luKCcmJykgOiAnJztcbn1cblxuLyoqXG4gKiBEZWNvZGVzIGEgcXVlcnlzdHJpbmcgKGUuZy4gP2FyZz12YWwmYXJnMj12YWwyKSBpbnRvIGEgcGFyYW1zIG9iamVjdFxuICogKGUuZy4ge2FyZzogJ3ZhbCcsIGFyZzI6ICd2YWwyJ30pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeXN0cmluZ0RlY29kZShxdWVyeXN0cmluZzogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBjb25zdCB0b2tlbnMgPSBxdWVyeXN0cmluZy5yZXBsYWNlKC9eXFw/LywgJycpLnNwbGl0KCcmJyk7XG5cbiAgdG9rZW5zLmZvckVhY2godG9rZW4gPT4ge1xuICAgIGlmICh0b2tlbikge1xuICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gdG9rZW4uc3BsaXQoJz0nKTtcbiAgICAgIG9ialtkZWNvZGVVUklDb21wb25lbnQoa2V5KV0gPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0aGUgcXVlcnkgc3RyaW5nIHBhcnQgb2YgYSBVUkwsIGluY2x1ZGluZyB0aGUgbGVhZGluZyBxdWVzdGlvbiBtYXJrIChpZiBwcmVzZW50KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RRdWVyeXN0cmluZyh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHF1ZXJ5U3RhcnQgPSB1cmwuaW5kZXhPZignPycpO1xuICBpZiAoIXF1ZXJ5U3RhcnQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgZnJhZ21lbnRTdGFydCA9IHVybC5pbmRleE9mKCcjJywgcXVlcnlTdGFydCk7XG4gIHJldHVybiB1cmwuc3Vic3RyaW5nKFxuICAgIHF1ZXJ5U3RhcnQsXG4gICAgZnJhZ21lbnRTdGFydCA+IDAgPyBmcmFnbWVudFN0YXJ0IDogdW5kZWZpbmVkXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IFNIQS0xIGNyeXB0b2dyYXBoaWMgaGFzaC5cbiAqIFZhcmlhYmxlIG5hbWVzIGZvbGxvdyB0aGUgbm90YXRpb24gaW4gRklQUyBQVUIgMTgwLTM6XG4gKiBodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZmlwcy9maXBzMTgwLTMvZmlwczE4MC0zX2ZpbmFsLnBkZi5cbiAqXG4gKiBVc2FnZTpcbiAqICAgdmFyIHNoYTEgPSBuZXcgc2hhMSgpO1xuICogICBzaGExLnVwZGF0ZShieXRlcyk7XG4gKiAgIHZhciBoYXNoID0gc2hhMS5kaWdlc3QoKTtcbiAqXG4gKiBQZXJmb3JtYW5jZTpcbiAqICAgQ2hyb21lIDIzOiAgIH40MDAgTWJpdC9zXG4gKiAgIEZpcmVmb3ggMTY6ICB+MjUwIE1iaXQvc1xuICpcbiAqL1xuXG4vKipcbiAqIFNIQS0xIGNyeXB0b2dyYXBoaWMgaGFzaCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBUaGUgcHJvcGVydGllcyBkZWNsYXJlZCBoZXJlIGFyZSBkaXNjdXNzZWQgaW4gdGhlIGFib3ZlIGFsZ29yaXRobSBkb2N1bWVudC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQGZpbmFsXG4gKiBAc3RydWN0XG4gKi9cbmV4cG9ydCBjbGFzcyBTaGExIHtcbiAgLyoqXG4gICAqIEhvbGRzIHRoZSBwcmV2aW91cyB2YWx1ZXMgb2YgYWNjdW11bGF0ZWQgdmFyaWFibGVzIGEtZSBpbiB0aGUgY29tcHJlc3NfXG4gICAqIGZ1bmN0aW9uLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGFpbl86IG51bWJlcltdID0gW107XG5cbiAgLyoqXG4gICAqIEEgYnVmZmVyIGhvbGRpbmcgdGhlIHBhcnRpYWxseSBjb21wdXRlZCBoYXNoIHJlc3VsdC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYnVmXzogbnVtYmVyW10gPSBbXTtcblxuICAvKipcbiAgICogQW4gYXJyYXkgb2YgODAgYnl0ZXMsIGVhY2ggYSBwYXJ0IG9mIHRoZSBtZXNzYWdlIHRvIGJlIGhhc2hlZC4gIFJlZmVycmVkIHRvXG4gICAqIGFzIHRoZSBtZXNzYWdlIHNjaGVkdWxlIGluIHRoZSBkb2NzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBXXzogbnVtYmVyW10gPSBbXTtcblxuICAvKipcbiAgICogQ29udGFpbnMgZGF0YSBuZWVkZWQgdG8gcGFkIG1lc3NhZ2VzIGxlc3MgdGhhbiA2NCBieXRlcy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcGFkXzogbnVtYmVyW10gPSBbXTtcblxuICAvKipcbiAgICogQHByaXZhdGUge251bWJlcn1cbiAgICovXG4gIHByaXZhdGUgaW5idWZfOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZSB7bnVtYmVyfVxuICAgKi9cbiAgcHJpdmF0ZSB0b3RhbF86IG51bWJlciA9IDA7XG5cbiAgYmxvY2tTaXplOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5ibG9ja1NpemUgPSA1MTIgLyA4O1xuXG4gICAgdGhpcy5wYWRfWzBdID0gMTI4O1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgdGhpcy5ibG9ja1NpemU7ICsraSkge1xuICAgICAgdGhpcy5wYWRfW2ldID0gMDtcbiAgICB9XG5cbiAgICB0aGlzLnJlc2V0KCk7XG4gIH1cblxuICByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYWluX1swXSA9IDB4Njc0NTIzMDE7XG4gICAgdGhpcy5jaGFpbl9bMV0gPSAweGVmY2RhYjg5O1xuICAgIHRoaXMuY2hhaW5fWzJdID0gMHg5OGJhZGNmZTtcbiAgICB0aGlzLmNoYWluX1szXSA9IDB4MTAzMjU0NzY7XG4gICAgdGhpcy5jaGFpbl9bNF0gPSAweGMzZDJlMWYwO1xuXG4gICAgdGhpcy5pbmJ1Zl8gPSAwO1xuICAgIHRoaXMudG90YWxfID0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBjb21wcmVzcyBoZWxwZXIgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBidWYgQmxvY2sgdG8gY29tcHJlc3MuXG4gICAqIEBwYXJhbSBvZmZzZXQgT2Zmc2V0IG9mIHRoZSBibG9jayBpbiB0aGUgYnVmZmVyLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29tcHJlc3NfKGJ1ZjogbnVtYmVyW10gfCBVaW50OEFycmF5IHwgc3RyaW5nLCBvZmZzZXQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIW9mZnNldCkge1xuICAgICAgb2Zmc2V0ID0gMDtcbiAgICB9XG5cbiAgICBjb25zdCBXID0gdGhpcy5XXztcblxuICAgIC8vIGdldCAxNiBiaWcgZW5kaWFuIHdvcmRzXG4gICAgaWYgKHR5cGVvZiBidWYgPT09ICdzdHJpbmcnKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyspIHtcbiAgICAgICAgLy8gVE9ETyh1c2VyKTogW2J1ZyA4MTQwMTIyXSBSZWNlbnQgdmVyc2lvbnMgb2YgU2FmYXJpIGZvciBNYWMgT1MgYW5kIGlPU1xuICAgICAgICAvLyBoYXZlIGEgYnVnIHRoYXQgdHVybnMgdGhlIHBvc3QtaW5jcmVtZW50ICsrIG9wZXJhdG9yIGludG8gcHJlLWluY3JlbWVudFxuICAgICAgICAvLyBkdXJpbmcgSklUIGNvbXBpbGF0aW9uLiAgV2UgaGF2ZSBjb2RlIHRoYXQgZGVwZW5kcyBoZWF2aWx5IG9uIFNIQS0xIGZvclxuICAgICAgICAvLyBjb3JyZWN0bmVzcyBhbmQgd2hpY2ggaXMgYWZmZWN0ZWQgYnkgdGhpcyBidWcsIHNvIEkndmUgcmVtb3ZlZCBhbGwgdXNlc1xuICAgICAgICAvLyBvZiBwb3N0LWluY3JlbWVudCArKyBpbiB3aGljaCB0aGUgcmVzdWx0IHZhbHVlIGlzIHVzZWQuICBXZSBjYW4gcmV2ZXJ0XG4gICAgICAgIC8vIHRoaXMgY2hhbmdlIG9uY2UgdGhlIFNhZmFyaSBidWdcbiAgICAgICAgLy8gKGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMDkwMzYpIGhhcyBiZWVuIGZpeGVkIGFuZFxuICAgICAgICAvLyBtb3N0IGNsaWVudHMgaGF2ZSBiZWVuIHVwZGF0ZWQuXG4gICAgICAgIFdbaV0gPVxuICAgICAgICAgIChidWYuY2hhckNvZGVBdChvZmZzZXQpIDw8IDI0KSB8XG4gICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDEpIDw8IDE2KSB8XG4gICAgICAgICAgKGJ1Zi5jaGFyQ29kZUF0KG9mZnNldCArIDIpIDw8IDgpIHxcbiAgICAgICAgICBidWYuY2hhckNvZGVBdChvZmZzZXQgKyAzKTtcbiAgICAgICAgb2Zmc2V0ICs9IDQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICBXW2ldID1cbiAgICAgICAgICAoYnVmW29mZnNldF0gPDwgMjQpIHxcbiAgICAgICAgICAoYnVmW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgICAgICAgKGJ1ZltvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgICAgICAgYnVmW29mZnNldCArIDNdO1xuICAgICAgICBvZmZzZXQgKz0gNDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBleHBhbmQgdG8gODAgd29yZHNcbiAgICBmb3IgKGxldCBpID0gMTY7IGkgPCA4MDsgaSsrKSB7XG4gICAgICBjb25zdCB0ID0gV1tpIC0gM10gXiBXW2kgLSA4XSBeIFdbaSAtIDE0XSBeIFdbaSAtIDE2XTtcbiAgICAgIFdbaV0gPSAoKHQgPDwgMSkgfCAodCA+Pj4gMzEpKSAmIDB4ZmZmZmZmZmY7XG4gICAgfVxuXG4gICAgbGV0IGEgPSB0aGlzLmNoYWluX1swXTtcbiAgICBsZXQgYiA9IHRoaXMuY2hhaW5fWzFdO1xuICAgIGxldCBjID0gdGhpcy5jaGFpbl9bMl07XG4gICAgbGV0IGQgPSB0aGlzLmNoYWluX1szXTtcbiAgICBsZXQgZSA9IHRoaXMuY2hhaW5fWzRdO1xuICAgIGxldCBmLCBrO1xuXG4gICAgLy8gVE9ETyh1c2VyKTogVHJ5IHRvIHVucm9sbCB0aGlzIGxvb3AgdG8gc3BlZWQgdXAgdGhlIGNvbXB1dGF0aW9uLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODA7IGkrKykge1xuICAgICAgaWYgKGkgPCA0MCkge1xuICAgICAgICBpZiAoaSA8IDIwKSB7XG4gICAgICAgICAgZiA9IGQgXiAoYiAmIChjIF4gZCkpO1xuICAgICAgICAgIGsgPSAweDVhODI3OTk5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGYgPSBiIF4gYyBeIGQ7XG4gICAgICAgICAgayA9IDB4NmVkOWViYTE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpIDwgNjApIHtcbiAgICAgICAgICBmID0gKGIgJiBjKSB8IChkICYgKGIgfCBjKSk7XG4gICAgICAgICAgayA9IDB4OGYxYmJjZGM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZiA9IGIgXiBjIF4gZDtcbiAgICAgICAgICBrID0gMHhjYTYyYzFkNjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0ID0gKCgoYSA8PCA1KSB8IChhID4+PiAyNykpICsgZiArIGUgKyBrICsgV1tpXSkgJiAweGZmZmZmZmZmO1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSAoKGIgPDwgMzApIHwgKGIgPj4+IDIpKSAmIDB4ZmZmZmZmZmY7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSB0O1xuICAgIH1cblxuICAgIHRoaXMuY2hhaW5fWzBdID0gKHRoaXMuY2hhaW5fWzBdICsgYSkgJiAweGZmZmZmZmZmO1xuICAgIHRoaXMuY2hhaW5fWzFdID0gKHRoaXMuY2hhaW5fWzFdICsgYikgJiAweGZmZmZmZmZmO1xuICAgIHRoaXMuY2hhaW5fWzJdID0gKHRoaXMuY2hhaW5fWzJdICsgYykgJiAweGZmZmZmZmZmO1xuICAgIHRoaXMuY2hhaW5fWzNdID0gKHRoaXMuY2hhaW5fWzNdICsgZCkgJiAweGZmZmZmZmZmO1xuICAgIHRoaXMuY2hhaW5fWzRdID0gKHRoaXMuY2hhaW5fWzRdICsgZSkgJiAweGZmZmZmZmZmO1xuICB9XG5cbiAgdXBkYXRlKGJ5dGVzPzogbnVtYmVyW10gfCBVaW50OEFycmF5IHwgc3RyaW5nLCBsZW5ndGg/OiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyBUT0RPKGpvaG5sZW56KTogdGlnaHRlbiB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIGFuZCByZW1vdmUgdGhpcyBjaGVja1xuICAgIGlmIChieXRlcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsZW5ndGggPSBieXRlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgY29uc3QgbGVuZ3RoTWludXNCbG9jayA9IGxlbmd0aCAtIHRoaXMuYmxvY2tTaXplO1xuICAgIGxldCBuID0gMDtcbiAgICAvLyBVc2luZyBsb2NhbCBpbnN0ZWFkIG9mIG1lbWJlciB2YXJpYWJsZXMgZ2l2ZXMgfjUlIHNwZWVkdXAgb24gRmlyZWZveCAxNi5cbiAgICBjb25zdCBidWYgPSB0aGlzLmJ1Zl87XG4gICAgbGV0IGluYnVmID0gdGhpcy5pbmJ1Zl87XG5cbiAgICAvLyBUaGUgb3V0ZXIgd2hpbGUgbG9vcCBzaG91bGQgZXhlY3V0ZSBhdCBtb3N0IHR3aWNlLlxuICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XG4gICAgICAvLyBXaGVuIHdlIGhhdmUgbm8gZGF0YSBpbiB0aGUgYmxvY2sgdG8gdG9wIHVwLCB3ZSBjYW4gZGlyZWN0bHkgcHJvY2VzcyB0aGVcbiAgICAgIC8vIGlucHV0IGJ1ZmZlciAoYXNzdW1pbmcgaXQgY29udGFpbnMgc3VmZmljaWVudCBkYXRhKS4gVGhpcyBnaXZlcyB+MjUlXG4gICAgICAvLyBzcGVlZHVwIG9uIENocm9tZSAyMyBhbmQgfjE1JSBzcGVlZHVwIG9uIEZpcmVmb3ggMTYsIGJ1dCByZXF1aXJlcyB0aGF0XG4gICAgICAvLyB0aGUgZGF0YSBpcyBwcm92aWRlZCBpbiBsYXJnZSBjaHVua3MgKG9yIGluIG11bHRpcGxlcyBvZiA2NCBieXRlcykuXG4gICAgICBpZiAoaW5idWYgPT09IDApIHtcbiAgICAgICAgd2hpbGUgKG4gPD0gbGVuZ3RoTWludXNCbG9jaykge1xuICAgICAgICAgIHRoaXMuY29tcHJlc3NfKGJ5dGVzLCBuKTtcbiAgICAgICAgICBuICs9IHRoaXMuYmxvY2tTaXplO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHdoaWxlIChuIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgYnVmW2luYnVmXSA9IGJ5dGVzLmNoYXJDb2RlQXQobik7XG4gICAgICAgICAgKytpbmJ1ZjtcbiAgICAgICAgICArK247XG4gICAgICAgICAgaWYgKGluYnVmID09PSB0aGlzLmJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcbiAgICAgICAgICAgIGluYnVmID0gMDtcbiAgICAgICAgICAgIC8vIEp1bXAgdG8gdGhlIG91dGVyIGxvb3Agc28gd2UgdXNlIHRoZSBmdWxsLWJsb2NrIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKG4gPCBsZW5ndGgpIHtcbiAgICAgICAgICBidWZbaW5idWZdID0gYnl0ZXNbbl07XG4gICAgICAgICAgKytpbmJ1ZjtcbiAgICAgICAgICArK247XG4gICAgICAgICAgaWYgKGluYnVmID09PSB0aGlzLmJsb2NrU2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5jb21wcmVzc18oYnVmKTtcbiAgICAgICAgICAgIGluYnVmID0gMDtcbiAgICAgICAgICAgIC8vIEp1bXAgdG8gdGhlIG91dGVyIGxvb3Agc28gd2UgdXNlIHRoZSBmdWxsLWJsb2NrIG9wdGltaXphdGlvbi5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5idWZfID0gaW5idWY7XG4gICAgdGhpcy50b3RhbF8gKz0gbGVuZ3RoO1xuICB9XG5cbiAgLyoqIEBvdmVycmlkZSAqL1xuICBkaWdlc3QoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IGRpZ2VzdDogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgdG90YWxCaXRzID0gdGhpcy50b3RhbF8gKiA4O1xuXG4gICAgLy8gQWRkIHBhZCAweDgwIDB4MDAqLlxuICAgIGlmICh0aGlzLmluYnVmXyA8IDU2KSB7XG4gICAgICB0aGlzLnVwZGF0ZSh0aGlzLnBhZF8sIDU2IC0gdGhpcy5pbmJ1Zl8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZSh0aGlzLnBhZF8sIHRoaXMuYmxvY2tTaXplIC0gKHRoaXMuaW5idWZfIC0gNTYpKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgIyBiaXRzLlxuICAgIGZvciAobGV0IGkgPSB0aGlzLmJsb2NrU2l6ZSAtIDE7IGkgPj0gNTY7IGktLSkge1xuICAgICAgdGhpcy5idWZfW2ldID0gdG90YWxCaXRzICYgMjU1O1xuICAgICAgdG90YWxCaXRzIC89IDI1NjsgLy8gRG9uJ3QgdXNlIGJpdC1zaGlmdGluZyBoZXJlIVxuICAgIH1cblxuICAgIHRoaXMuY29tcHJlc3NfKHRoaXMuYnVmXyk7XG5cbiAgICBsZXQgbiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA1OyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSAyNDsgaiA+PSAwOyBqIC09IDgpIHtcbiAgICAgICAgZGlnZXN0W25dID0gKHRoaXMuY2hhaW5fW2ldID4+IGopICYgMjU1O1xuICAgICAgICArK247XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWdlc3Q7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuZXhwb3J0IHR5cGUgTmV4dEZuPFQ+ID0gKHZhbHVlOiBUKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgRXJyb3JGbiA9IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBDb21wbGV0ZUZuID0gKCkgPT4gdm9pZDtcblxuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZlcjxUPiB7XG4gIC8vIENhbGxlZCBvbmNlIGZvciBlYWNoIHZhbHVlIGluIGEgc3RyZWFtIG9mIHZhbHVlcy5cbiAgbmV4dDogTmV4dEZuPFQ+O1xuXG4gIC8vIEEgc3RyZWFtIHRlcm1pbmF0ZXMgYnkgYSBzaW5nbGUgY2FsbCB0byBFSVRIRVIgZXJyb3IoKSBvciBjb21wbGV0ZSgpLlxuICBlcnJvcjogRXJyb3JGbjtcblxuICAvLyBObyBldmVudHMgd2lsbCBiZSBzZW50IHRvIG5leHQoKSBvbmNlIGNvbXBsZXRlKCkgaXMgY2FsbGVkLlxuICBjb21wbGV0ZTogQ29tcGxldGVGbjtcbn1cblxuZXhwb3J0IHR5cGUgUGFydGlhbE9ic2VydmVyPFQ+ID0gUGFydGlhbDxPYnNlcnZlcjxUPj47XG5cbi8vIFRPRE86IFN1cHBvcnQgYWxzbyBVbnN1YnNjcmliZS51bnN1YnNjcmliZT9cbmV4cG9ydCB0eXBlIFVuc3Vic2NyaWJlID0gKCkgPT4gdm9pZDtcblxuLyoqXG4gKiBUaGUgU3Vic2NyaWJlIGludGVyZmFjZSBoYXMgdHdvIGZvcm1zIC0gcGFzc2luZyB0aGUgaW5saW5lIGZ1bmN0aW9uXG4gKiBjYWxsYmFja3MsIG9yIGEgb2JqZWN0IGludGVyZmFjZSB3aXRoIGNhbGxiYWNrIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlPFQ+IHtcbiAgKG5leHQ/OiBOZXh0Rm48VD4sIGVycm9yPzogRXJyb3JGbiwgY29tcGxldGU/OiBDb21wbGV0ZUZuKTogVW5zdWJzY3JpYmU7XG4gIChvYnNlcnZlcjogUGFydGlhbE9ic2VydmVyPFQ+KTogVW5zdWJzY3JpYmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2JzZXJ2YWJsZTxUPiB7XG4gIC8vIFN1YnNjcmliZSBtZXRob2RcbiAgc3Vic2NyaWJlOiBTdWJzY3JpYmU8VD47XG59XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dG9yPFQ+ID0gKG9ic2VydmVyOiBPYnNlcnZlcjxUPikgPT4gdm9pZDtcblxuLyoqXG4gKiBIZWxwZXIgdG8gbWFrZSBhIFN1YnNjcmliZSBmdW5jdGlvbiAoanVzdCBsaWtlIFByb21pc2UgaGVscHMgbWFrZSBhXG4gKiBUaGVuYWJsZSkuXG4gKlxuICogQHBhcmFtIGV4ZWN1dG9yIEZ1bmN0aW9uIHdoaWNoIGNhbiBtYWtlIGNhbGxzIHRvIGEgc2luZ2xlIE9ic2VydmVyXG4gKiAgICAgYXMgYSBwcm94eS5cbiAqIEBwYXJhbSBvbk5vT2JzZXJ2ZXJzIENhbGxiYWNrIHdoZW4gY291bnQgb2YgT2JzZXJ2ZXJzIGdvZXMgdG8gemVyby5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmliZTxUPihcbiAgZXhlY3V0b3I6IEV4ZWN1dG9yPFQ+LFxuICBvbk5vT2JzZXJ2ZXJzPzogRXhlY3V0b3I8VD5cbik6IFN1YnNjcmliZTxUPiB7XG4gIGNvbnN0IHByb3h5ID0gbmV3IE9ic2VydmVyUHJveHk8VD4oZXhlY3V0b3IsIG9uTm9PYnNlcnZlcnMpO1xuICByZXR1cm4gcHJveHkuc3Vic2NyaWJlLmJpbmQocHJveHkpO1xufVxuXG4vKipcbiAqIEltcGxlbWVudCBmYW4tb3V0IGZvciBhbnkgbnVtYmVyIG9mIE9ic2VydmVycyBhdHRhY2hlZCB2aWEgYSBzdWJzY3JpYmVcbiAqIGZ1bmN0aW9uLlxuICovXG5jbGFzcyBPYnNlcnZlclByb3h5PFQ+IGltcGxlbWVudHMgT2JzZXJ2ZXI8VD4ge1xuICBwcml2YXRlIG9ic2VydmVyczogQXJyYXk8T2JzZXJ2ZXI8VD4+IHwgdW5kZWZpbmVkID0gW107XG4gIHByaXZhdGUgdW5zdWJzY3JpYmVzOiBVbnN1YnNjcmliZVtdID0gW107XG4gIHByaXZhdGUgb25Ob09ic2VydmVyczogRXhlY3V0b3I8VD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgb2JzZXJ2ZXJDb3VudCA9IDA7XG4gIC8vIE1pY3JvLXRhc2sgc2NoZWR1bGluZyBieSBjYWxsaW5nIHRhc2sudGhlbigpLlxuICBwcml2YXRlIHRhc2sgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHJpdmF0ZSBmaW5hbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBmaW5hbEVycm9yPzogRXJyb3I7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBleGVjdXRvciBGdW5jdGlvbiB3aGljaCBjYW4gbWFrZSBjYWxscyB0byBhIHNpbmdsZSBPYnNlcnZlclxuICAgKiAgICAgYXMgYSBwcm94eS5cbiAgICogQHBhcmFtIG9uTm9PYnNlcnZlcnMgQ2FsbGJhY2sgd2hlbiBjb3VudCBvZiBPYnNlcnZlcnMgZ29lcyB0byB6ZXJvLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZXhlY3V0b3I6IEV4ZWN1dG9yPFQ+LCBvbk5vT2JzZXJ2ZXJzPzogRXhlY3V0b3I8VD4pIHtcbiAgICB0aGlzLm9uTm9PYnNlcnZlcnMgPSBvbk5vT2JzZXJ2ZXJzO1xuICAgIC8vIENhbGwgdGhlIGV4ZWN1dG9yIGFzeW5jaHJvbm91c2x5IHNvIHN1YnNjcmliZXJzIHRoYXQgYXJlIGNhbGxlZFxuICAgIC8vIHN5bmNocm9ub3VzbHkgYWZ0ZXIgdGhlIGNyZWF0aW9uIG9mIHRoZSBzdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAvLyBjYW4gc3RpbGwgcmVjZWl2ZSB0aGUgdmVyeSBmaXJzdCB2YWx1ZSBnZW5lcmF0ZWQgaW4gdGhlIGV4ZWN1dG9yLlxuICAgIHRoaXMudGFza1xuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBleGVjdXRvcih0aGlzKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3IoZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5leHQodmFsdWU6IFQpOiB2b2lkIHtcbiAgICB0aGlzLmZvckVhY2hPYnNlcnZlcigob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGVycm9yKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHtcbiAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcbiAgICB9KTtcbiAgICB0aGlzLmNsb3NlKGVycm9yKTtcbiAgfVxuXG4gIGNvbXBsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZm9yRWFjaE9ic2VydmVyKChvYnNlcnZlcjogT2JzZXJ2ZXI8VD4pID0+IHtcbiAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1YnNjcmliZSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBhbiBPYnNlcnZlciB0byB0aGUgZmFuLW91dCBsaXN0LlxuICAgKlxuICAgKiAtIFdlIHJlcXVpcmUgdGhhdCBubyBldmVudCBpcyBzZW50IHRvIGEgc3Vic2NyaWJlciBzeWNocm9ub3VzbHkgdG8gdGhlaXJcbiAgICogICBjYWxsIHRvIHN1YnNjcmliZSgpLlxuICAgKi9cbiAgc3Vic2NyaWJlKFxuICAgIG5leHRPck9ic2VydmVyPzogTmV4dEZuPFQ+IHwgUGFydGlhbE9ic2VydmVyPFQ+LFxuICAgIGVycm9yPzogRXJyb3JGbixcbiAgICBjb21wbGV0ZT86IENvbXBsZXRlRm5cbiAgKTogVW5zdWJzY3JpYmUge1xuICAgIGxldCBvYnNlcnZlcjogT2JzZXJ2ZXI8VD47XG5cbiAgICBpZiAoXG4gICAgICBuZXh0T3JPYnNlcnZlciA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBlcnJvciA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBjb21wbGV0ZSA9PT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgT2JzZXJ2ZXIuJyk7XG4gICAgfVxuXG4gICAgLy8gQXNzZW1ibGUgYW4gT2JzZXJ2ZXIgb2JqZWN0IHdoZW4gcGFzc2VkIGFzIGNhbGxiYWNrIGZ1bmN0aW9ucy5cbiAgICBpZiAoXG4gICAgICBpbXBsZW1lbnRzQW55TWV0aG9kcyhuZXh0T3JPYnNlcnZlciBhcyB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSwgW1xuICAgICAgICAnbmV4dCcsXG4gICAgICAgICdlcnJvcicsXG4gICAgICAgICdjb21wbGV0ZSdcbiAgICAgIF0pXG4gICAgKSB7XG4gICAgICBvYnNlcnZlciA9IG5leHRPck9ic2VydmVyIGFzIE9ic2VydmVyPFQ+O1xuICAgIH0gZWxzZSB7XG4gICAgICBvYnNlcnZlciA9IHtcbiAgICAgICAgbmV4dDogbmV4dE9yT2JzZXJ2ZXIgYXMgTmV4dEZuPFQ+LFxuICAgICAgICBlcnJvcixcbiAgICAgICAgY29tcGxldGVcbiAgICAgIH0gYXMgT2JzZXJ2ZXI8VD47XG4gICAgfVxuXG4gICAgaWYgKG9ic2VydmVyLm5leHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JzZXJ2ZXIubmV4dCA9IG5vb3AgYXMgTmV4dEZuPFQ+O1xuICAgIH1cbiAgICBpZiAob2JzZXJ2ZXIuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb2JzZXJ2ZXIuZXJyb3IgPSBub29wIGFzIEVycm9yRm47XG4gICAgfVxuICAgIGlmIChvYnNlcnZlci5jb21wbGV0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBvYnNlcnZlci5jb21wbGV0ZSA9IG5vb3AgYXMgQ29tcGxldGVGbjtcbiAgICB9XG5cbiAgICBjb25zdCB1bnN1YiA9IHRoaXMudW5zdWJzY3JpYmVPbmUuYmluZCh0aGlzLCB0aGlzLm9ic2VydmVycyEubGVuZ3RoKTtcblxuICAgIC8vIEF0dGVtcHQgdG8gc3Vic2NyaWJlIHRvIGEgdGVybWluYXRlZCBPYnNlcnZhYmxlIC0gd2VcbiAgICAvLyBqdXN0IHJlc3BvbmQgdG8gdGhlIE9ic2VydmVyIHdpdGggdGhlIGZpbmFsIGVycm9yIG9yIGNvbXBsZXRlXG4gICAgLy8gZXZlbnQuXG4gICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICB0aGlzLnRhc2sudGhlbigoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHRoaXMuZmluYWxFcnJvcikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IodGhpcy5maW5hbEVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBub3RoaW5nXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5vYnNlcnZlcnMhLnB1c2gob2JzZXJ2ZXIgYXMgT2JzZXJ2ZXI8VD4pO1xuXG4gICAgcmV0dXJuIHVuc3ViO1xuICB9XG5cbiAgLy8gVW5zdWJzY3JpYmUgaXMgc3luY2hyb25vdXMgLSB3ZSBndWFyYW50ZWUgdGhhdCBubyBldmVudHMgYXJlIHNlbnQgdG9cbiAgLy8gYW55IHVuc3Vic2NyaWJlZCBPYnNlcnZlci5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZU9uZShpOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlcnMgPT09IHVuZGVmaW5lZCB8fCB0aGlzLm9ic2VydmVyc1tpXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMub2JzZXJ2ZXJzW2ldO1xuXG4gICAgdGhpcy5vYnNlcnZlckNvdW50IC09IDE7XG4gICAgaWYgKHRoaXMub2JzZXJ2ZXJDb3VudCA9PT0gMCAmJiB0aGlzLm9uTm9PYnNlcnZlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5vbk5vT2JzZXJ2ZXJzKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9yRWFjaE9ic2VydmVyKGZuOiAob2JzZXJ2ZXI6IE9ic2VydmVyPFQ+KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZmluYWxpemVkKSB7XG4gICAgICAvLyBBbHJlYWR5IGNsb3NlZCBieSBwcmV2aW91cyBldmVudC4uLi5qdXN0IGVhdCB0aGUgYWRkaXRpb25hbCB2YWx1ZXMuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2luY2Ugc2VuZE9uZSBjYWxscyBhc3luY2hyb25vdXNseSAtIHRoZXJlIGlzIG5vIGNoYW5jZSB0aGF0XG4gICAgLy8gdGhpcy5vYnNlcnZlcnMgd2lsbCBiZWNvbWUgdW5kZWZpbmVkLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vYnNlcnZlcnMhLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLnNlbmRPbmUoaSwgZm4pO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbGwgdGhlIE9ic2VydmVyIHZpYSBvbmUgb2YgaXQncyBjYWxsYmFjayBmdW5jdGlvbi4gV2UgYXJlIGNhcmVmdWwgdG9cbiAgLy8gY29uZmlybSB0aGF0IHRoZSBvYnNlcnZlIGhhcyBub3QgYmVlbiB1bnN1YnNjcmliZWQgc2luY2UgdGhpcyBhc3luY2hyb25vdXNcbiAgLy8gZnVuY3Rpb24gaGFkIGJlZW4gcXVldWVkLlxuICBwcml2YXRlIHNlbmRPbmUoaTogbnVtYmVyLCBmbjogKG9ic2VydmVyOiBPYnNlcnZlcjxUPikgPT4gdm9pZCk6IHZvaWQge1xuICAgIC8vIEV4ZWN1dGUgdGhlIGNhbGxiYWNrIGFzeW5jaHJvbm91c2x5XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIHRoaXMudGFzay50aGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9ic2VydmVycyAhPT0gdW5kZWZpbmVkICYmIHRoaXMub2JzZXJ2ZXJzW2ldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmbih0aGlzLm9ic2VydmVyc1tpXSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvLyBJZ25vcmUgZXhjZXB0aW9ucyByYWlzZWQgaW4gT2JzZXJ2ZXJzIG9yIG1pc3NpbmcgbWV0aG9kcyBvZiBhblxuICAgICAgICAgIC8vIE9ic2VydmVyLlxuICAgICAgICAgIC8vIExvZyBlcnJvciB0byBjb25zb2xlLiBiLzMxNDA0ODA2XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZShlcnI/OiBFcnJvcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmZpbmFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmZpbmFsaXplZCA9IHRydWU7XG4gICAgaWYgKGVyciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZpbmFsRXJyb3IgPSBlcnI7XG4gICAgfVxuICAgIC8vIFByb3h5IGlzIG5vIGxvbmdlciBuZWVkZWQgLSBnYXJiYWdlIGNvbGxlY3QgcmVmZXJlbmNlc1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICB0aGlzLnRhc2sudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLm9ic2VydmVycyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMub25Ob09ic2VydmVycyA9IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogVHVybiBzeW5jaHJvbm91cyBmdW5jdGlvbiBpbnRvIG9uZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGFzeW5jKGZuOiBGdW5jdGlvbiwgb25FcnJvcj86IEVycm9yRm4pOiBGdW5jdGlvbiB7XG4gIHJldHVybiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKHRydWUpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgIGlmIChvbkVycm9yKSB7XG4gICAgICAgICAgb25FcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgcGFzc2VkIGluIGltcGxlbWVudHMgYW55IG9mIHRoZSBuYW1lZCBtZXRob2RzLlxuICovXG5mdW5jdGlvbiBpbXBsZW1lbnRzQW55TWV0aG9kcyhcbiAgb2JqOiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSxcbiAgbWV0aG9kczogc3RyaW5nW11cbik6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIG9iaiAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgZm9yIChjb25zdCBtZXRob2Qgb2YgbWV0aG9kcykge1xuICAgIGlmIChtZXRob2QgaW4gb2JqICYmIHR5cGVvZiBvYmpbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBub29wKCk6IHZvaWQge1xuICAvLyBkbyBub3RoaW5nXG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGZvciBhIHB1YmxpYyBmdW5jdGlvbi5cbiAqIFRocm93cyBhbiBlcnJvciBpZiBpdCBmYWlscy5cbiAqXG4gKiBAcGFyYW0gZm5OYW1lIFRoZSBmdW5jdGlvbiBuYW1lXG4gKiBAcGFyYW0gbWluQ291bnQgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBhbGxvdyBmb3IgdGhlIGZ1bmN0aW9uIGNhbGxcbiAqIEBwYXJhbSBtYXhDb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXJndW1lbnQgdG8gYWxsb3cgZm9yIHRoZSBmdW5jdGlvbiBjYWxsXG4gKiBAcGFyYW0gYXJnQ291bnQgVGhlIGFjdHVhbCBudW1iZXIgb2YgYXJndW1lbnRzIHByb3ZpZGVkLlxuICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBcmdDb3VudCA9IGZ1bmN0aW9uIChcbiAgZm5OYW1lOiBzdHJpbmcsXG4gIG1pbkNvdW50OiBudW1iZXIsXG4gIG1heENvdW50OiBudW1iZXIsXG4gIGFyZ0NvdW50OiBudW1iZXJcbik6IHZvaWQge1xuICBsZXQgYXJnRXJyb3I7XG4gIGlmIChhcmdDb3VudCA8IG1pbkNvdW50KSB7XG4gICAgYXJnRXJyb3IgPSAnYXQgbGVhc3QgJyArIG1pbkNvdW50O1xuICB9IGVsc2UgaWYgKGFyZ0NvdW50ID4gbWF4Q291bnQpIHtcbiAgICBhcmdFcnJvciA9IG1heENvdW50ID09PSAwID8gJ25vbmUnIDogJ25vIG1vcmUgdGhhbiAnICsgbWF4Q291bnQ7XG4gIH1cbiAgaWYgKGFyZ0Vycm9yKSB7XG4gICAgY29uc3QgZXJyb3IgPVxuICAgICAgZm5OYW1lICtcbiAgICAgICcgZmFpbGVkOiBXYXMgY2FsbGVkIHdpdGggJyArXG4gICAgICBhcmdDb3VudCArXG4gICAgICAoYXJnQ291bnQgPT09IDEgPyAnIGFyZ3VtZW50LicgOiAnIGFyZ3VtZW50cy4nKSArXG4gICAgICAnIEV4cGVjdHMgJyArXG4gICAgICBhcmdFcnJvciArXG4gICAgICAnLic7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgdG8gcHJlZml4IGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQgZmFpbGVkIGFyZ3VtZW50IHZhbGlkYXRpb25cbiAqXG4gKiBAcGFyYW0gZm5OYW1lIFRoZSBmdW5jdGlvbiBuYW1lXG4gKiBAcGFyYW0gYXJnTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXJndW1lbnRcbiAqIEByZXR1cm4gVGhlIHByZWZpeCB0byBhZGQgdG8gdGhlIGVycm9yIHRocm93biBmb3IgdmFsaWRhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yUHJlZml4KGZuTmFtZTogc3RyaW5nLCBhcmdOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7Zm5OYW1lfSBmYWlsZWQ6ICR7YXJnTmFtZX0gYXJndW1lbnQgYDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZm5OYW1lXG4gKiBAcGFyYW0gYXJndW1lbnROdW1iZXJcbiAqIEBwYXJhbSBuYW1lc3BhY2VcbiAqIEBwYXJhbSBvcHRpb25hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVOYW1lc3BhY2UoXG4gIGZuTmFtZTogc3RyaW5nLFxuICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgb3B0aW9uYWw6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAob3B0aW9uYWwgJiYgIW5hbWVzcGFjZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodHlwZW9mIG5hbWVzcGFjZSAhPT0gJ3N0cmluZycpIHtcbiAgICAvL1RPRE86IEkgc2hvdWxkIGRvIG1vcmUgdmFsaWRhdGlvbiBoZXJlLiBXZSBvbmx5IGFsbG93IGNlcnRhaW4gY2hhcnMgaW4gbmFtZXNwYWNlcy5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBlcnJvclByZWZpeChmbk5hbWUsICduYW1lc3BhY2UnKSArICdtdXN0IGJlIGEgdmFsaWQgZmlyZWJhc2UgbmFtZXNwYWNlLidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNhbGxiYWNrKFxuICBmbk5hbWU6IHN0cmluZyxcbiAgYXJndW1lbnROYW1lOiBzdHJpbmcsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gIGNhbGxiYWNrOiBGdW5jdGlvbixcbiAgb3B0aW9uYWw6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAob3B0aW9uYWwgJiYgIWNhbGxiYWNrKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBlcnJvclByZWZpeChmbk5hbWUsIGFyZ3VtZW50TmFtZSkgKyAnbXVzdCBiZSBhIHZhbGlkIGZ1bmN0aW9uLidcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNvbnRleHRPYmplY3QoXG4gIGZuTmFtZTogc3RyaW5nLFxuICBhcmd1bWVudE5hbWU6IHN0cmluZyxcbiAgY29udGV4dDogdW5rbm93bixcbiAgb3B0aW9uYWw6IGJvb2xlYW5cbik6IHZvaWQge1xuICBpZiAob3B0aW9uYWwgJiYgIWNvbnRleHQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHR5cGVvZiBjb250ZXh0ICE9PSAnb2JqZWN0JyB8fCBjb250ZXh0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgZXJyb3JQcmVmaXgoZm5OYW1lLCBhcmd1bWVudE5hbWUpICsgJ211c3QgYmUgYSB2YWxpZCBjb250ZXh0IG9iamVjdC4nXG4gICAgKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGFzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcblxuLy8gQ29kZSBvcmlnaW5hbGx5IGNhbWUgZnJvbSBnb29nLmNyeXB0LnN0cmluZ1RvVXRmOEJ5dGVBcnJheSwgYnV0IGZvciBzb21lIHJlYXNvbiB0aGV5XG4vLyBhdXRvbWF0aWNhbGx5IHJlcGxhY2VkICdcXHJcXG4nIHdpdGggJ1xcbicsIGFuZCB0aGV5IGRpZG4ndCBoYW5kbGUgc3Vycm9nYXRlIHBhaXJzLFxuLy8gc28gaXQncyBiZWVuIG1vZGlmaWVkLlxuXG4vLyBOb3RlIHRoYXQgbm90IGFsbCBVbmljb2RlIGNoYXJhY3RlcnMgYXBwZWFyIGFzIHNpbmdsZSBjaGFyYWN0ZXJzIGluIEphdmFTY3JpcHQgc3RyaW5ncy5cbi8vIGZyb21DaGFyQ29kZSByZXR1cm5zIHRoZSBVVEYtMTYgZW5jb2Rpbmcgb2YgYSBjaGFyYWN0ZXIgLSBzbyBzb21lIFVuaWNvZGUgY2hhcmFjdGVyc1xuLy8gdXNlIDIgY2hhcmFjdGVycyBpbiBKYXZhc2NyaXB0LiAgQWxsIDQtYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzIGJlZ2luIHdpdGggYSBmaXJzdFxuLy8gY2hhcmFjdGVyIGluIHRoZSByYW5nZSAweEQ4MDAgLSAweERCRkYgKHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBzby1jYWxsZWQgc3Vycm9nYXRlXG4vLyBwYWlyKS5cbi8vIFNlZSBodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtMTUuMS4zXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0J5dGVBcnJheSA9IGZ1bmN0aW9uIChzdHI6IHN0cmluZyk6IG51bWJlcltdIHtcbiAgY29uc3Qgb3V0OiBudW1iZXJbXSA9IFtdO1xuICBsZXQgcCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcblxuICAgIC8vIElzIHRoaXMgdGhlIGxlYWQgc3Vycm9nYXRlIGluIGEgc3Vycm9nYXRlIHBhaXI/XG4gICAgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmKSB7XG4gICAgICBjb25zdCBoaWdoID0gYyAtIDB4ZDgwMDsgLy8gdGhlIGhpZ2ggMTAgYml0cy5cbiAgICAgIGkrKztcbiAgICAgIGFzc2VydChpIDwgc3RyLmxlbmd0aCwgJ1N1cnJvZ2F0ZSBwYWlyIG1pc3NpbmcgdHJhaWwgc3Vycm9nYXRlLicpO1xuICAgICAgY29uc3QgbG93ID0gc3RyLmNoYXJDb2RlQXQoaSkgLSAweGRjMDA7IC8vIHRoZSBsb3cgMTAgYml0cy5cbiAgICAgIGMgPSAweDEwMDAwICsgKGhpZ2ggPDwgMTApICsgbG93O1xuICAgIH1cblxuICAgIGlmIChjIDwgMTI4KSB7XG4gICAgICBvdXRbcCsrXSA9IGM7XG4gICAgfSBlbHNlIGlmIChjIDwgMjA0OCkge1xuICAgICAgb3V0W3ArK10gPSAoYyA+PiA2KSB8IDE5MjtcbiAgICAgIG91dFtwKytdID0gKGMgJiA2MykgfCAxMjg7XG4gICAgfSBlbHNlIGlmIChjIDwgNjU1MzYpIHtcbiAgICAgIG91dFtwKytdID0gKGMgPj4gMTIpIHwgMjI0O1xuICAgICAgb3V0W3ArK10gPSAoKGMgPj4gNikgJiA2MykgfCAxMjg7XG4gICAgICBvdXRbcCsrXSA9IChjICYgNjMpIHwgMTI4O1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRbcCsrXSA9IChjID4+IDE4KSB8IDI0MDtcbiAgICAgIG91dFtwKytdID0gKChjID4+IDEyKSAmIDYzKSB8IDEyODtcbiAgICAgIG91dFtwKytdID0gKChjID4+IDYpICYgNjMpIHwgMTI4O1xuICAgICAgb3V0W3ArK10gPSAoYyAmIDYzKSB8IDEyODtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGxlbmd0aCB3aXRob3V0IGFjdHVhbGx5IGNvbnZlcnRpbmc7IHVzZWZ1bCBmb3IgZG9pbmcgY2hlYXBlciB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7bnVtYmVyfVxuICovXG5leHBvcnQgY29uc3Qgc3RyaW5nTGVuZ3RoID0gZnVuY3Rpb24gKHN0cjogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IHAgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGMgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBpZiAoYyA8IDEyOCkge1xuICAgICAgcCsrO1xuICAgIH0gZWxzZSBpZiAoYyA8IDIwNDgpIHtcbiAgICAgIHAgKz0gMjtcbiAgICB9IGVsc2UgaWYgKGMgPj0gMHhkODAwICYmIGMgPD0gMHhkYmZmKSB7XG4gICAgICAvLyBMZWFkIHN1cnJvZ2F0ZSBvZiBhIHN1cnJvZ2F0ZSBwYWlyLiAgVGhlIHBhaXIgdG9nZXRoZXIgd2lsbCB0YWtlIDQgYnl0ZXMgdG8gcmVwcmVzZW50LlxuICAgICAgcCArPSA0O1xuICAgICAgaSsrOyAvLyBza2lwIHRyYWlsIHN1cnJvZ2F0ZS5cbiAgICB9IGVsc2Uge1xuICAgICAgcCArPSAzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcDtcbn07XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBDb3BpZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjExNzUyM1xuICogR2VuZXJhdGVzIGEgbmV3IHV1aWQuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgYyA9PiB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMCxcbiAgICAgIHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qKlxuICogVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdG8gZXhwb25lbnRpYWxseSBpbmNyZWFzZS5cbiAqL1xuY29uc3QgREVGQVVMVF9JTlRFUlZBTF9NSUxMSVMgPSAxMDAwO1xuXG4vKipcbiAqIFRoZSBmYWN0b3IgdG8gYmFja29mZiBieS5cbiAqIFNob3VsZCBiZSBhIG51bWJlciBncmVhdGVyIHRoYW4gMS5cbiAqL1xuY29uc3QgREVGQVVMVF9CQUNLT0ZGX0ZBQ1RPUiA9IDI7XG5cbi8qKlxuICogVGhlIG1heGltdW0gbWlsbGlzZWNvbmRzIHRvIGluY3JlYXNlIHRvLlxuICpcbiAqIDxwPlZpc2libGUgZm9yIHRlc3RpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9WQUxVRV9NSUxMSVMgPSA0ICogNjAgKiA2MCAqIDEwMDA7IC8vIEZvdXIgaG91cnMsIGxpa2UgaU9TIGFuZCBBbmRyb2lkLlxuXG4vKipcbiAqIFRoZSBwZXJjZW50YWdlIG9mIGJhY2tvZmYgdGltZSB0byByYW5kb21pemUgYnkuXG4gKiBTZWVcbiAqIGh0dHA6Ly9nby9zYWZlLWNsaWVudC1iZWhhdmlvciNzdGVwLTEtZGV0ZXJtaW5lLXRoZS1hcHByb3ByaWF0ZS1yZXRyeS1pbnRlcnZhbC10by1oYW5kbGUtc3Bpa2UtdHJhZmZpY1xuICogZm9yIGNvbnRleHQuXG4gKlxuICogPHA+VmlzaWJsZSBmb3IgdGVzdGluZ1xuICovXG5leHBvcnQgY29uc3QgUkFORE9NX0ZBQ1RPUiA9IDAuNTtcblxuLyoqXG4gKiBCYXNlZCBvbiB0aGUgYmFja29mZiBtZXRob2QgZnJvbVxuICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWxpYnJhcnkvYmxvYi9tYXN0ZXIvY2xvc3VyZS9nb29nL21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmLmpzLlxuICogRXh0cmFjdGVkIGhlcmUgc28gd2UgZG9uJ3QgbmVlZCB0byBwYXNzIG1ldGFkYXRhIGFuZCBhIHN0YXRlZnVsIEV4cG9uZW50aWFsQmFja29mZiBvYmplY3QgYXJvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlQmFja29mZk1pbGxpcyhcbiAgYmFja29mZkNvdW50OiBudW1iZXIsXG4gIGludGVydmFsTWlsbGlzOiBudW1iZXIgPSBERUZBVUxUX0lOVEVSVkFMX01JTExJUyxcbiAgYmFja29mZkZhY3RvcjogbnVtYmVyID0gREVGQVVMVF9CQUNLT0ZGX0ZBQ1RPUlxuKTogbnVtYmVyIHtcbiAgLy8gQ2FsY3VsYXRlcyBhbiBleHBvbmVudGlhbGx5IGluY3JlYXNpbmcgdmFsdWUuXG4gIC8vIERldmlhdGlvbjogY2FsY3VsYXRlcyB2YWx1ZSBmcm9tIGNvdW50IGFuZCBhIGNvbnN0YW50IGludGVydmFsLCBzbyB3ZSBvbmx5IG5lZWQgdG8gc2F2ZSB2YWx1ZVxuICAvLyBhbmQgY291bnQgdG8gcmVzdG9yZSBzdGF0ZS5cbiAgY29uc3QgY3VyckJhc2VWYWx1ZSA9IGludGVydmFsTWlsbGlzICogTWF0aC5wb3coYmFja29mZkZhY3RvciwgYmFja29mZkNvdW50KTtcblxuICAvLyBBIHJhbmRvbSBcImZ1enpcIiB0byBhdm9pZCB3YXZlcyBvZiByZXRyaWVzLlxuICAvLyBEZXZpYXRpb246IHJhbmRvbUZhY3RvciBpcyByZXF1aXJlZC5cbiAgY29uc3QgcmFuZG9tV2FpdCA9IE1hdGgucm91bmQoXG4gICAgLy8gQSBmcmFjdGlvbiBvZiB0aGUgYmFja29mZiB2YWx1ZSB0byBhZGQvc3VidHJhY3QuXG4gICAgLy8gRGV2aWF0aW9uOiBjaGFuZ2VzIG11bHRpcGxpY2F0aW9uIG9yZGVyIHRvIGltcHJvdmUgcmVhZGFiaWxpdHkuXG4gICAgUkFORE9NX0ZBQ1RPUiAqXG4gICAgICBjdXJyQmFzZVZhbHVlICpcbiAgICAgIC8vIEEgcmFuZG9tIGZsb2F0IChyb3VuZGVkIHRvIGludCBieSBNYXRoLnJvdW5kIGFib3ZlKSBpbiB0aGUgcmFuZ2UgWy0xLCAxXS4gRGV0ZXJtaW5lc1xuICAgICAgLy8gaWYgd2UgYWRkIG9yIHN1YnRyYWN0LlxuICAgICAgKE1hdGgucmFuZG9tKCkgLSAwLjUpICpcbiAgICAgIDJcbiAgKTtcblxuICAvLyBMaW1pdHMgYmFja29mZiB0byBtYXggdG8gYXZvaWQgZWZmZWN0aXZlbHkgcGVybWFuZW50IGJhY2tvZmYuXG4gIHJldHVybiBNYXRoLm1pbihNQVhfVkFMVUVfTUlMTElTLCBjdXJyQmFzZVZhbHVlICsgcmFuZG9tV2FpdCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBQcm92aWRlIEVuZ2xpc2ggb3JkaW5hbCBsZXR0ZXJzIGFmdGVyIGEgbnVtYmVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcmRpbmFsKGk6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKGkpKSB7XG4gICAgcmV0dXJuIGAke2l9YDtcbiAgfVxuICByZXR1cm4gaSArIGluZGljYXRvcihpKTtcbn1cblxuZnVuY3Rpb24gaW5kaWNhdG9yKGk6IG51bWJlcik6IHN0cmluZyB7XG4gIGkgPSBNYXRoLmFicyhpKTtcbiAgY29uc3QgY2VudCA9IGkgJSAxMDA7XG4gIGlmIChjZW50ID49IDEwICYmIGNlbnQgPD0gMjApIHtcbiAgICByZXR1cm4gJ3RoJztcbiAgfVxuICBjb25zdCBkZWMgPSBpICUgMTA7XG4gIGlmIChkZWMgPT09IDEpIHtcbiAgICByZXR1cm4gJ3N0JztcbiAgfVxuICBpZiAoZGVjID09PSAyKSB7XG4gICAgcmV0dXJuICduZCc7XG4gIH1cbiAgaWYgKGRlYyA9PT0gMykge1xuICAgIHJldHVybiAncmQnO1xuICB9XG4gIHJldHVybiAndGgnO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGF0PFQ+IHtcbiAgX2RlbGVnYXRlOiBUO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kdWxhckluc3RhbmNlPEV4cFNlcnZpY2U+KFxuICBzZXJ2aWNlOiBDb21wYXQ8RXhwU2VydmljZT4gfCBFeHBTZXJ2aWNlXG4pOiBFeHBTZXJ2aWNlIHtcbiAgaWYgKHNlcnZpY2UgJiYgKHNlcnZpY2UgYXMgQ29tcGF0PEV4cFNlcnZpY2U+KS5fZGVsZWdhdGUpIHtcbiAgICByZXR1cm4gKHNlcnZpY2UgYXMgQ29tcGF0PEV4cFNlcnZpY2U+KS5fZGVsZWdhdGU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNlcnZpY2UgYXMgRXhwU2VydmljZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBJbnN0YW50aWF0aW9uTW9kZSxcbiAgSW5zdGFuY2VGYWN0b3J5LFxuICBDb21wb25lbnRUeXBlLFxuICBEaWN0aW9uYXJ5LFxuICBOYW1lLFxuICBvbkluc3RhbmNlQ3JlYXRlZENhbGxiYWNrXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gYGF1dGhgLCBgYXV0aC1pbnRlcm5hbGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvbmVudDxUIGV4dGVuZHMgTmFtZSA9IE5hbWU+IHtcbiAgbXVsdGlwbGVJbnN0YW5jZXMgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHNlcnZpY2UgbmFtZXNwYWNlXG4gICAqL1xuICBzZXJ2aWNlUHJvcHM6IERpY3Rpb25hcnkgPSB7fTtcblxuICBpbnN0YW50aWF0aW9uTW9kZSA9IEluc3RhbnRpYXRpb25Nb2RlLkxBWlk7XG5cbiAgb25JbnN0YW5jZUNyZWF0ZWQ6IG9uSW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2s8VD4gfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG5hbWUgVGhlIHB1YmxpYyBzZXJ2aWNlIG5hbWUsIGUuZy4gYXBwLCBhdXRoLCBmaXJlc3RvcmUsIGRhdGFiYXNlXG4gICAqIEBwYXJhbSBpbnN0YW5jZUZhY3RvcnkgU2VydmljZSBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgcHVibGljIGludGVyZmFjZVxuICAgKiBAcGFyYW0gdHlwZSB3aGV0aGVyIHRoZSBzZXJ2aWNlIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgaXMgcHVibGljIG9yIHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IG5hbWU6IFQsXG4gICAgcmVhZG9ubHkgaW5zdGFuY2VGYWN0b3J5OiBJbnN0YW5jZUZhY3Rvcnk8VD4sXG4gICAgcmVhZG9ubHkgdHlwZTogQ29tcG9uZW50VHlwZVxuICApIHt9XG5cbiAgc2V0SW5zdGFudGlhdGlvbk1vZGUobW9kZTogSW5zdGFudGlhdGlvbk1vZGUpOiB0aGlzIHtcbiAgICB0aGlzLmluc3RhbnRpYXRpb25Nb2RlID0gbW9kZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldE11bHRpcGxlSW5zdGFuY2VzKG11bHRpcGxlSW5zdGFuY2VzOiBib29sZWFuKTogdGhpcyB7XG4gICAgdGhpcy5tdWx0aXBsZUluc3RhbmNlcyA9IG11bHRpcGxlSW5zdGFuY2VzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0U2VydmljZVByb3BzKHByb3BzOiBEaWN0aW9uYXJ5KTogdGhpcyB7XG4gICAgdGhpcy5zZXJ2aWNlUHJvcHMgPSBwcm9wcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldEluc3RhbmNlQ3JlYXRlZENhbGxiYWNrKGNhbGxiYWNrOiBvbkluc3RhbmNlQ3JlYXRlZENhbGxiYWNrPFQ+KTogdGhpcyB7XG4gICAgdGhpcy5vbkluc3RhbmNlQ3JlYXRlZCA9IGNhbGxiYWNrO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfRU5UUllfTkFNRSA9ICdbREVGQVVMVF0nO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IERlZmVycmVkIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnLi9jb21wb25lbnRfY29udGFpbmVyJztcbmltcG9ydCB7IERFRkFVTFRfRU5UUllfTkFNRSB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7XG4gIEluaXRpYWxpemVPcHRpb25zLFxuICBJbnN0YW50aWF0aW9uTW9kZSxcbiAgTmFtZSxcbiAgTmFtZVNlcnZpY2VNYXBwaW5nLFxuICBPbkluaXRDYWxsQmFja1xufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50JztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgaW5zdGFuY2UgZm9yIHNlcnZpY2UgbmFtZSBULCBlLmcuICdhdXRoJywgJ2F1dGgtaW50ZXJuYWwnXG4gKiBOYW1lU2VydmljZU1hcHBpbmdbVF0gaXMgYW4gYWxpYXMgZm9yIHRoZSB0eXBlIG9mIHRoZSBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgUHJvdmlkZXI8VCBleHRlbmRzIE5hbWU+IHtcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IENvbXBvbmVudDxUPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RhbmNlczogTWFwPHN0cmluZywgTmFtZVNlcnZpY2VNYXBwaW5nW1RdPiA9IG5ldyBNYXAoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBpbnN0YW5jZXNEZWZlcnJlZDogTWFwPFxuICAgIHN0cmluZyxcbiAgICBEZWZlcnJlZDxOYW1lU2VydmljZU1hcHBpbmdbVF0+XG4gID4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdGFuY2VzT3B0aW9uczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID1cbiAgICBuZXcgTWFwKCk7XG4gIHByaXZhdGUgb25Jbml0Q2FsbGJhY2tzOiBNYXA8c3RyaW5nLCBTZXQ8T25Jbml0Q2FsbEJhY2s8VD4+PiA9IG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG5hbWU6IFQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lclxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpZGVudGlmaWVyIEEgcHJvdmlkZXIgY2FuIHByb3ZpZGUgbXVsaXRwbGUgaW5zdGFuY2VzIG9mIGEgc2VydmljZVxuICAgKiBpZiB0aGlzLmNvbXBvbmVudC5tdWx0aXBsZUluc3RhbmNlcyBpcyB0cnVlLlxuICAgKi9cbiAgZ2V0KGlkZW50aWZpZXI/OiBzdHJpbmcpOiBQcm9taXNlPE5hbWVTZXJ2aWNlTWFwcGluZ1tUXT4ge1xuICAgIC8vIGlmIG11bHRpcGxlSW5zdGFuY2VzIGlzIG5vdCBzdXBwb3J0ZWQsIHVzZSB0aGUgZGVmYXVsdCBuYW1lXG4gICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPSB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpZGVudGlmaWVyKTtcblxuICAgIGlmICghdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5oYXMobm9ybWFsaXplZElkZW50aWZpZXIpKSB7XG4gICAgICBjb25zdCBkZWZlcnJlZCA9IG5ldyBEZWZlcnJlZDxOYW1lU2VydmljZU1hcHBpbmdbVF0+KCk7XG4gICAgICB0aGlzLmluc3RhbmNlc0RlZmVycmVkLnNldChub3JtYWxpemVkSWRlbnRpZmllciwgZGVmZXJyZWQpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikgfHxcbiAgICAgICAgdGhpcy5zaG91bGRBdXRvSW5pdGlhbGl6ZSgpXG4gICAgICApIHtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc2VydmljZSBpZiBpdCBjYW4gYmUgYXV0by1pbml0aWFsaXplZFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gdGhpcy5nZXRPckluaXRpYWxpemVTZXJ2aWNlKHtcbiAgICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIHdoZW4gdGhlIGluc3RhbmNlIGZhY3RvcnkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgZ2V0KCksIGl0IHNob3VsZCBub3QgY2F1c2VcbiAgICAgICAgICAvLyBhIGZhdGFsIGVycm9yLiBXZSBqdXN0IHJldHVybiB0aGUgdW5yZXNvbHZlZCBwcm9taXNlIGluIHRoaXMgY2FzZS5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmdldChub3JtYWxpemVkSWRlbnRpZmllcikhLnByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMuaWRlbnRpZmllciBBIHByb3ZpZGVyIGNhbiBwcm92aWRlIG11bGl0cGxlIGluc3RhbmNlcyBvZiBhIHNlcnZpY2VcbiAgICogaWYgdGhpcy5jb21wb25lbnQubXVsdGlwbGVJbnN0YW5jZXMgaXMgdHJ1ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMub3B0aW9uYWwgSWYgb3B0aW9uYWwgaXMgZmFsc2Ugb3Igbm90IHByb3ZpZGVkLCB0aGUgbWV0aG9kIHRocm93cyBhbiBlcnJvciB3aGVuXG4gICAqIHRoZSBzZXJ2aWNlIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUuXG4gICAqIElmIG9wdGlvbmFsIGlzIHRydWUsIHRoZSBtZXRob2QgcmV0dXJucyBudWxsIGlmIHRoZSBzZXJ2aWNlIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUuXG4gICAqL1xuICBnZXRJbW1lZGlhdGUob3B0aW9uczoge1xuICAgIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgb3B0aW9uYWw6IHRydWU7XG4gIH0pOiBOYW1lU2VydmljZU1hcHBpbmdbVF0gfCBudWxsO1xuICBnZXRJbW1lZGlhdGUob3B0aW9ucz86IHtcbiAgICBpZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIG9wdGlvbmFsPzogZmFsc2U7XG4gIH0pOiBOYW1lU2VydmljZU1hcHBpbmdbVF07XG4gIGdldEltbWVkaWF0ZShvcHRpb25zPzoge1xuICAgIGlkZW50aWZpZXI/OiBzdHJpbmc7XG4gICAgb3B0aW9uYWw/OiBib29sZWFuO1xuICB9KTogTmFtZVNlcnZpY2VNYXBwaW5nW1RdIHwgbnVsbCB7XG4gICAgLy8gaWYgbXVsdGlwbGVJbnN0YW5jZXMgaXMgbm90IHN1cHBvcnRlZCwgdXNlIHRoZSBkZWZhdWx0IG5hbWVcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKFxuICAgICAgb3B0aW9ucz8uaWRlbnRpZmllclxuICAgICk7XG4gICAgY29uc3Qgb3B0aW9uYWwgPSBvcHRpb25zPy5vcHRpb25hbCA/PyBmYWxzZTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikgfHxcbiAgICAgIHRoaXMuc2hvdWxkQXV0b0luaXRpYWxpemUoKVxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XG4gICAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllclxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJbiBjYXNlIGEgY29tcG9uZW50IGlzIG5vdCBpbml0aWFsaXplZCBhbmQgc2hvdWxkL2NhbiBub3QgYmUgYXV0by1pbml0aWFsaXplZCBhdCB0aGUgbW9tZW50LCByZXR1cm4gbnVsbCBpZiB0aGUgb3B0aW9uYWwgZmxhZyBpcyBzZXQsIG9yIHRocm93XG4gICAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihgU2VydmljZSAke3RoaXMubmFtZX0gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldENvbXBvbmVudCgpOiBDb21wb25lbnQ8VD4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnQ7XG4gIH1cblxuICBzZXRDb21wb25lbnQoY29tcG9uZW50OiBDb21wb25lbnQ8VD4pOiB2b2lkIHtcbiAgICBpZiAoY29tcG9uZW50Lm5hbWUgIT09IHRoaXMubmFtZSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBNaXNtYXRjaGluZyBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gZm9yIFByb3ZpZGVyICR7dGhpcy5uYW1lfS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbXBvbmVudCkge1xuICAgICAgdGhyb3cgRXJyb3IoYENvbXBvbmVudCBmb3IgJHt0aGlzLm5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlkZWRgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcblxuICAgIC8vIHJldHVybiBlYXJseSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gaW5pdGlhbGl6ZSB0aGUgY29tcG9uZW50IGlmIHRoZSBjb21wb25lbnQgcmVxdWlyZXMgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gKGNhbGxpbmcgYFByb3ZpZGVyLmluaXRpYWxpemUoKWApXG4gICAgaWYgKCF0aGlzLnNob3VsZEF1dG9Jbml0aWFsaXplKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBpZiB0aGUgc2VydmljZSBpcyBlYWdlciwgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZVxuICAgIGlmIChpc0NvbXBvbmVudEVhZ2VyKGNvbXBvbmVudCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZ2V0T3JJbml0aWFsaXplU2VydmljZSh7IGluc3RhbmNlSWRlbnRpZmllcjogREVGQVVMVF9FTlRSWV9OQU1FIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyB3aGVuIHRoZSBpbnN0YW5jZSBmYWN0b3J5IGZvciBhbiBlYWdlciBDb21wb25lbnQgdGhyb3dzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgdGhlIGVhZ2VyXG4gICAgICAgIC8vIGluaXRpYWxpemF0aW9uLCBpdCBzaG91bGQgbm90IGNhdXNlIGEgZmF0YWwgZXJyb3IuXG4gICAgICAgIC8vIFRPRE86IEludmVzdGlnYXRlIGlmIHdlIG5lZWQgdG8gbWFrZSBpdCBjb25maWd1cmFibGUsIGJlY2F1c2Ugc29tZSBjb21wb25lbnQgbWF5IHdhbnQgdG8gY2F1c2VcbiAgICAgICAgLy8gYSBmYXRhbCBlcnJvciBpbiB0aGlzIGNhc2U/XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHNlcnZpY2UgaW5zdGFuY2VzIGZvciB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZSB0aGVtXG4gICAgLy8gTk9URTogaWYgdGhpcy5tdWx0aXBsZUluc3RhbmNlcyBpcyBmYWxzZSwgb25seSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWRcbiAgICAvLyBhbmQgYWxsIHByb21pc2VzIHdpdGggcmVzb2x2ZSB3aXRoIGl0IHJlZ2FyZGxlc3Mgb2YgdGhlIGlkZW50aWZpZXIuXG4gICAgZm9yIChjb25zdCBbXG4gICAgICBpbnN0YW5jZUlkZW50aWZpZXIsXG4gICAgICBpbnN0YW5jZURlZmVycmVkXG4gICAgXSBvZiB0aGlzLmluc3RhbmNlc0RlZmVycmVkLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkZW50aWZpZXIgPVxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUluc3RhbmNlSWRlbnRpZmllcihpbnN0YW5jZUlkZW50aWZpZXIpO1xuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBgZ2V0T3JJbml0aWFsaXplU2VydmljZSgpYCBzaG91bGQgYWx3YXlzIHJldHVybiBhIHZhbGlkIGluc3RhbmNlIHNpbmNlIGEgY29tcG9uZW50IGlzIGd1YXJhbnRlZWQuIHVzZSAhIHRvIG1ha2UgdHlwZXNjcmlwdCBoYXBweS5cbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xuICAgICAgICAgIGluc3RhbmNlSWRlbnRpZmllcjogbm9ybWFsaXplZElkZW50aWZpZXJcbiAgICAgICAgfSkhO1xuICAgICAgICBpbnN0YW5jZURlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyB3aGVuIHRoZSBpbnN0YW5jZSBmYWN0b3J5IHRocm93cyBhbiBleGNlcHRpb24sIGl0IHNob3VsZCBub3QgY2F1c2VcbiAgICAgICAgLy8gYSBmYXRhbCBlcnJvci4gV2UganVzdCBsZWF2ZSB0aGUgcHJvbWlzZSB1bnJlc29sdmVkLlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNsZWFySW5zdGFuY2UoaWRlbnRpZmllcjogc3RyaW5nID0gREVGQVVMVF9FTlRSWV9OQU1FKTogdm9pZCB7XG4gICAgdGhpcy5pbnN0YW5jZXNEZWZlcnJlZC5kZWxldGUoaWRlbnRpZmllcik7XG4gICAgdGhpcy5pbnN0YW5jZXNPcHRpb25zLmRlbGV0ZShpZGVudGlmaWVyKTtcbiAgICB0aGlzLmluc3RhbmNlcy5kZWxldGUoaWRlbnRpZmllcik7XG4gIH1cblxuICAvLyBhcHAuZGVsZXRlKCkgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIG9uIGV2ZXJ5IHByb3ZpZGVyIHRvIGRlbGV0ZSB0aGUgc2VydmljZXNcbiAgLy8gVE9ETzogc2hvdWxkIHdlIG1hcmsgdGhlIHByb3ZpZGVyIGFzIGRlbGV0ZWQ/XG4gIGFzeW5jIGRlbGV0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlcyA9IEFycmF5LmZyb20odGhpcy5pbnN0YW5jZXMudmFsdWVzKCkpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgLi4uc2VydmljZXNcbiAgICAgICAgLmZpbHRlcihzZXJ2aWNlID0+ICdJTlRFUk5BTCcgaW4gc2VydmljZSkgLy8gbGVnYWN5IHNlcnZpY2VzXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIC5tYXAoc2VydmljZSA9PiAoc2VydmljZSBhcyBhbnkpLklOVEVSTkFMIS5kZWxldGUoKSksXG4gICAgICAuLi5zZXJ2aWNlc1xuICAgICAgICAuZmlsdGVyKHNlcnZpY2UgPT4gJ19kZWxldGUnIGluIHNlcnZpY2UpIC8vIG1vZHVsYXJpemVkIHNlcnZpY2VzXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIC5tYXAoc2VydmljZSA9PiAoc2VydmljZSBhcyBhbnkpLl9kZWxldGUoKSlcbiAgICBdKTtcbiAgfVxuXG4gIGlzQ29tcG9uZW50U2V0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudCAhPSBudWxsO1xuICB9XG5cbiAgaXNJbml0aWFsaXplZChpZGVudGlmaWVyOiBzdHJpbmcgPSBERUZBVUxUX0VOVFJZX05BTUUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXMuaGFzKGlkZW50aWZpZXIpO1xuICB9XG5cbiAgZ2V0T3B0aW9ucyhpZGVudGlmaWVyOiBzdHJpbmcgPSBERUZBVUxUX0VOVFJZX05BTUUpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzT3B0aW9ucy5nZXQoaWRlbnRpZmllcikgfHwge307XG4gIH1cblxuICBpbml0aWFsaXplKG9wdHM6IEluaXRpYWxpemVPcHRpb25zID0ge30pOiBOYW1lU2VydmljZU1hcHBpbmdbVF0ge1xuICAgIGNvbnN0IHsgb3B0aW9ucyA9IHt9IH0gPSBvcHRzO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRJZGVudGlmaWVyID0gdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoXG4gICAgICBvcHRzLmluc3RhbmNlSWRlbnRpZmllclxuICAgICk7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZChub3JtYWxpemVkSWRlbnRpZmllcikpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgJHt0aGlzLm5hbWV9KCR7bm9ybWFsaXplZElkZW50aWZpZXJ9KSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkYFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaXNDb21wb25lbnRTZXQoKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYENvbXBvbmVudCAke3RoaXMubmFtZX0gaGFzIG5vdCBiZWVuIHJlZ2lzdGVyZWQgeWV0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2UgPSB0aGlzLmdldE9ySW5pdGlhbGl6ZVNlcnZpY2Uoe1xuICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVkSWRlbnRpZmllcixcbiAgICAgIG9wdGlvbnNcbiAgICB9KSE7XG5cbiAgICAvLyByZXNvbHZlIGFueSBwZW5kaW5nIHByb21pc2Ugd2FpdGluZyBmb3IgdGhlIHNlcnZpY2UgaW5zdGFuY2VcbiAgICBmb3IgKGNvbnN0IFtcbiAgICAgIGluc3RhbmNlSWRlbnRpZmllcixcbiAgICAgIGluc3RhbmNlRGVmZXJyZWRcbiAgICBdIG9mIHRoaXMuaW5zdGFuY2VzRGVmZXJyZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkRGVmZXJyZWRJZGVudGlmaWVyID1cbiAgICAgICAgdGhpcy5ub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoaW5zdGFuY2VJZGVudGlmaWVyKTtcbiAgICAgIGlmIChub3JtYWxpemVkSWRlbnRpZmllciA9PT0gbm9ybWFsaXplZERlZmVycmVkSWRlbnRpZmllcikge1xuICAgICAgICBpbnN0YW5jZURlZmVycmVkLnJlc29sdmUoaW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBpbnZva2VkICBhZnRlciB0aGUgcHJvdmlkZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyBwcm92aWRlci5pbml0aWFsaXplKCkuXG4gICAqIFRoZSBmdW5jdGlvbiBpcyBpbnZva2VkIFNZTkNIUk9OT1VTTFksIHNvIGl0IHNob3VsZCBub3QgZXhlY3V0ZSBhbnkgbG9uZ3J1bm5pbmcgdGFza3MgaW4gb3JkZXIgdG8gbm90IGJsb2NrIHRoZSBwcm9ncmFtLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpZmllciBBbiBvcHRpb25hbCBpbnN0YW5jZSBpZGVudGlmaWVyXG4gICAqIEByZXR1cm5zIGEgZnVuY3Rpb24gdG8gdW5yZWdpc3RlciB0aGUgY2FsbGJhY2tcbiAgICovXG4gIG9uSW5pdChjYWxsYmFjazogT25Jbml0Q2FsbEJhY2s8VD4sIGlkZW50aWZpZXI/OiBzdHJpbmcpOiAoKSA9PiB2b2lkIHtcbiAgICBjb25zdCBub3JtYWxpemVkSWRlbnRpZmllciA9IHRoaXMubm9ybWFsaXplSW5zdGFuY2VJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgIGNvbnN0IGV4aXN0aW5nQ2FsbGJhY2tzID1cbiAgICAgIHRoaXMub25Jbml0Q2FsbGJhY2tzLmdldChub3JtYWxpemVkSWRlbnRpZmllcikgPz9cbiAgICAgIG5ldyBTZXQ8T25Jbml0Q2FsbEJhY2s8VD4+KCk7XG4gICAgZXhpc3RpbmdDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTtcbiAgICB0aGlzLm9uSW5pdENhbGxiYWNrcy5zZXQobm9ybWFsaXplZElkZW50aWZpZXIsIGV4aXN0aW5nQ2FsbGJhY2tzKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nSW5zdGFuY2UgPSB0aGlzLmluc3RhbmNlcy5nZXQobm9ybWFsaXplZElkZW50aWZpZXIpO1xuICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICBjYWxsYmFjayhleGlzdGluZ0luc3RhbmNlLCBub3JtYWxpemVkSWRlbnRpZmllcik7XG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGV4aXN0aW5nQ2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnZva2Ugb25Jbml0IGNhbGxiYWNrcyBzeW5jaHJvbm91c2x5XG4gICAqIEBwYXJhbSBpbnN0YW5jZSB0aGUgc2VydmljZSBpbnN0YW5jZWBcbiAgICovXG4gIHByaXZhdGUgaW52b2tlT25Jbml0Q2FsbGJhY2tzKFxuICAgIGluc3RhbmNlOiBOYW1lU2VydmljZU1hcHBpbmdbVF0sXG4gICAgaWRlbnRpZmllcjogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMub25Jbml0Q2FsbGJhY2tzLmdldChpZGVudGlmaWVyKTtcbiAgICBpZiAoIWNhbGxiYWNrcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2FsbGJhY2soaW5zdGFuY2UsIGlkZW50aWZpZXIpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgaW4gdGhlIG9uSW5pdCBjYWxsYmFja1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3JJbml0aWFsaXplU2VydmljZSh7XG4gICAgaW5zdGFuY2VJZGVudGlmaWVyLFxuICAgIG9wdGlvbnMgPSB7fVxuICB9OiB7XG4gICAgaW5zdGFuY2VJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9KTogTmFtZVNlcnZpY2VNYXBwaW5nW1RdIHwgbnVsbCB7XG4gICAgbGV0IGluc3RhbmNlID0gdGhpcy5pbnN0YW5jZXMuZ2V0KGluc3RhbmNlSWRlbnRpZmllcik7XG4gICAgaWYgKCFpbnN0YW5jZSAmJiB0aGlzLmNvbXBvbmVudCkge1xuICAgICAgaW5zdGFuY2UgPSB0aGlzLmNvbXBvbmVudC5pbnN0YW5jZUZhY3RvcnkodGhpcy5jb250YWluZXIsIHtcbiAgICAgICAgaW5zdGFuY2VJZGVudGlmaWVyOiBub3JtYWxpemVJZGVudGlmaWVyRm9yRmFjdG9yeShpbnN0YW5jZUlkZW50aWZpZXIpLFxuICAgICAgICBvcHRpb25zXG4gICAgICB9KTtcbiAgICAgIHRoaXMuaW5zdGFuY2VzLnNldChpbnN0YW5jZUlkZW50aWZpZXIsIGluc3RhbmNlKTtcbiAgICAgIHRoaXMuaW5zdGFuY2VzT3B0aW9ucy5zZXQoaW5zdGFuY2VJZGVudGlmaWVyLCBvcHRpb25zKTtcblxuICAgICAgLyoqXG4gICAgICAgKiBJbnZva2Ugb25Jbml0IGxpc3RlbmVycy5cbiAgICAgICAqIE5vdGUgdGhpcy5jb21wb25lbnQub25JbnN0YW5jZUNyZWF0ZWQgaXMgZGlmZmVyZW50LCB3aGljaCBpcyB1c2VkIGJ5IHRoZSBjb21wb25lbnQgY3JlYXRvcixcbiAgICAgICAqIHdoaWxlIG9uSW5pdCBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQgYnkgY29uc3VtZXJzIG9mIHRoZSBwcm92aWRlci5cbiAgICAgICAqL1xuICAgICAgdGhpcy5pbnZva2VPbkluaXRDYWxsYmFja3MoaW5zdGFuY2UsIGluc3RhbmNlSWRlbnRpZmllcik7XG5cbiAgICAgIC8qKlxuICAgICAgICogT3JkZXIgaXMgaW1wb3J0YW50XG4gICAgICAgKiBvbkluc3RhbmNlQ3JlYXRlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhpcy5pbnN0YW5jZXMuc2V0KGluc3RhbmNlSWRlbnRpZmllciwgaW5zdGFuY2UpOyB3aGljaFxuICAgICAgICogbWFrZXMgYGlzSW5pdGlhbGl6ZWQoKWAgcmV0dXJuIHRydWUuXG4gICAgICAgKi9cbiAgICAgIGlmICh0aGlzLmNvbXBvbmVudC5vbkluc3RhbmNlQ3JlYXRlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuY29tcG9uZW50Lm9uSW5zdGFuY2VDcmVhdGVkKFxuICAgICAgICAgICAgdGhpcy5jb250YWluZXIsXG4gICAgICAgICAgICBpbnN0YW5jZUlkZW50aWZpZXIsXG4gICAgICAgICAgICBpbnN0YW5jZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgaW4gdGhlIG9uSW5zdGFuY2VDcmVhdGVkQ2FsbGJhY2tcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpbnN0YW5jZSB8fCBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVJbnN0YW5jZUlkZW50aWZpZXIoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nID0gREVGQVVMVF9FTlRSWV9OQU1FXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wb25lbnQubXVsdGlwbGVJbnN0YW5jZXMgPyBpZGVudGlmaWVyIDogREVGQVVMVF9FTlRSWV9OQU1FO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaWRlbnRpZmllcjsgLy8gYXNzdW1lIG11bHRpcGxlIGluc3RhbmNlcyBhcmUgc3VwcG9ydGVkIGJlZm9yZSB0aGUgY29tcG9uZW50IGlzIHByb3ZpZGVkLlxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkQXV0b0luaXRpYWxpemUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhdGhpcy5jb21wb25lbnQgJiZcbiAgICAgIHRoaXMuY29tcG9uZW50Lmluc3RhbnRpYXRpb25Nb2RlICE9PSBJbnN0YW50aWF0aW9uTW9kZS5FWFBMSUNJVFxuICAgICk7XG4gIH1cbn1cblxuLy8gdW5kZWZpbmVkIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHNlcnZpY2UgZmFjdG9yeSBmb3IgdGhlIGRlZmF1bHQgaW5zdGFuY2VcbmZ1bmN0aW9uIG5vcm1hbGl6ZUlkZW50aWZpZXJGb3JGYWN0b3J5KGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpZGVudGlmaWVyID09PSBERUZBVUxUX0VOVFJZX05BTUUgPyB1bmRlZmluZWQgOiBpZGVudGlmaWVyO1xufVxuXG5mdW5jdGlvbiBpc0NvbXBvbmVudEVhZ2VyPFQgZXh0ZW5kcyBOYW1lPihjb21wb25lbnQ6IENvbXBvbmVudDxUPik6IGJvb2xlYW4ge1xuICByZXR1cm4gY29tcG9uZW50Lmluc3RhbnRpYXRpb25Nb2RlID09PSBJbnN0YW50aWF0aW9uTW9kZS5FQUdFUjtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgTmFtZSB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIENvbXBvbmVudENvbnRhaW5lciB0aGF0IHByb3ZpZGVzIFByb3ZpZGVycyBmb3Igc2VydmljZSBuYW1lIFQsIGUuZy4gYGF1dGhgLCBgYXV0aC1pbnRlcm5hbGBcbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbnRhaW5lciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvdmlkZXJzID0gbmV3IE1hcDxzdHJpbmcsIFByb3ZpZGVyPE5hbWU+PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nKSB7fVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29tcG9uZW50IENvbXBvbmVudCBiZWluZyBhZGRlZFxuICAgKiBAcGFyYW0gb3ZlcndyaXRlIFdoZW4gYSBjb21wb25lbnQgd2l0aCB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCxcbiAgICogaWYgb3ZlcndyaXRlIGlzIHRydWU6IG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgY29tcG9uZW50IHdpdGggdGhlIG5ldyBjb21wb25lbnQgYW5kIGNyZWF0ZSBhIG5ld1xuICAgKiBwcm92aWRlciB3aXRoIHRoZSBuZXcgY29tcG9uZW50LiBJdCBjYW4gYmUgdXNlZnVsIGluIHRlc3RzIHdoZXJlIHlvdSB3YW50IHRvIHVzZSBkaWZmZXJlbnQgbW9ja3NcbiAgICogZm9yIGRpZmZlcmVudCB0ZXN0cy5cbiAgICogaWYgb3ZlcndyaXRlIGlzIGZhbHNlOiB0aHJvdyBhbiBleGNlcHRpb25cbiAgICovXG4gIGFkZENvbXBvbmVudDxUIGV4dGVuZHMgTmFtZT4oY29tcG9uZW50OiBDb21wb25lbnQ8VD4pOiB2b2lkIHtcbiAgICBjb25zdCBwcm92aWRlciA9IHRoaXMuZ2V0UHJvdmlkZXIoY29tcG9uZW50Lm5hbWUpO1xuICAgIGlmIChwcm92aWRlci5pc0NvbXBvbmVudFNldCgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIHdpdGggJHt0aGlzLm5hbWV9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcm92aWRlci5zZXRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfVxuXG4gIGFkZE9yT3ZlcndyaXRlQ29tcG9uZW50PFQgZXh0ZW5kcyBOYW1lPihjb21wb25lbnQ6IENvbXBvbmVudDxUPik6IHZvaWQge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gdGhpcy5nZXRQcm92aWRlcihjb21wb25lbnQubmFtZSk7XG4gICAgaWYgKHByb3ZpZGVyLmlzQ29tcG9uZW50U2V0KCkpIHtcbiAgICAgIC8vIGRlbGV0ZSB0aGUgZXhpc3RpbmcgcHJvdmlkZXIgZnJvbSB0aGUgY29udGFpbmVyLCBzbyB3ZSBjYW4gcmVnaXN0ZXIgdGhlIG5ldyBjb21wb25lbnRcbiAgICAgIHRoaXMucHJvdmlkZXJzLmRlbGV0ZShjb21wb25lbnQubmFtZSk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRQcm92aWRlciBwcm92aWRlcyBhIHR5cGUgc2FmZSBpbnRlcmZhY2Ugd2hlcmUgaXQgY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggYSBmaWVsZCBuYW1lXG4gICAqIHByZXNlbnQgaW4gTmFtZVNlcnZpY2VNYXBwaW5nIGludGVyZmFjZS5cbiAgICpcbiAgICogRmlyZWJhc2UgU0RLcyBwcm92aWRpbmcgc2VydmljZXMgc2hvdWxkIGV4dGVuZCBOYW1lU2VydmljZU1hcHBpbmcgaW50ZXJmYWNlIHRvIHJlZ2lzdGVyXG4gICAqIHRoZW1zZWx2ZXMuXG4gICAqL1xuICBnZXRQcm92aWRlcjxUIGV4dGVuZHMgTmFtZT4obmFtZTogVCk6IFByb3ZpZGVyPFQ+IHtcbiAgICBpZiAodGhpcy5wcm92aWRlcnMuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5wcm92aWRlcnMuZ2V0KG5hbWUpIGFzIHVua25vd24gYXMgUHJvdmlkZXI8VD47XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlIGEgUHJvdmlkZXIgZm9yIGEgc2VydmljZSB0aGF0IGhhc24ndCByZWdpc3RlcmVkIHdpdGggRmlyZWJhc2VcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBQcm92aWRlcjxUPihuYW1lLCB0aGlzKTtcbiAgICB0aGlzLnByb3ZpZGVycy5zZXQobmFtZSwgcHJvdmlkZXIgYXMgdW5rbm93biBhcyBQcm92aWRlcjxOYW1lPik7XG5cbiAgICByZXR1cm4gcHJvdmlkZXIgYXMgUHJvdmlkZXI8VD47XG4gIH1cblxuICBnZXRQcm92aWRlcnMoKTogQXJyYXk8UHJvdmlkZXI8TmFtZT4+IHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLnByb3ZpZGVycy52YWx1ZXMoKSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgdHlwZSBMb2dMZXZlbFN0cmluZyA9XG4gIHwgJ2RlYnVnJ1xuICB8ICd2ZXJib3NlJ1xuICB8ICdpbmZvJ1xuICB8ICd3YXJuJ1xuICB8ICdlcnJvcidcbiAgfCAnc2lsZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBMb2dPcHRpb25zIHtcbiAgbGV2ZWw6IExvZ0xldmVsU3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBMb2dDYWxsYmFjayA9IChjYWxsYmFja1BhcmFtczogTG9nQ2FsbGJhY2tQYXJhbXMpID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nQ2FsbGJhY2tQYXJhbXMge1xuICBsZXZlbDogTG9nTGV2ZWxTdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgYXJnczogdW5rbm93bltdO1xuICB0eXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb250YWluZXIgZm9yIGFsbCBvZiB0aGUgTG9nZ2VyIGluc3RhbmNlc1xuICovXG5leHBvcnQgY29uc3QgaW5zdGFuY2VzOiBMb2dnZXJbXSA9IFtdO1xuXG4vKipcbiAqIFRoZSBKUyBTREsgc3VwcG9ydHMgNSBsb2cgbGV2ZWxzIGFuZCBhbHNvIGFsbG93cyBhIHVzZXIgdGhlIGFiaWxpdHkgdG9cbiAqIHNpbGVuY2UgdGhlIGxvZ3MgYWx0b2dldGhlci5cbiAqXG4gKiBUaGUgb3JkZXIgaXMgYSBmb2xsb3dzOlxuICogREVCVUcgPCBWRVJCT1NFIDwgSU5GTyA8IFdBUk4gPCBFUlJPUlxuICpcbiAqIEFsbCBvZiB0aGUgbG9nIHR5cGVzIGFib3ZlIHRoZSBjdXJyZW50IGxvZyBsZXZlbCB3aWxsIGJlIGNhcHR1cmVkIChpLmUuIGlmXG4gKiB5b3Ugc2V0IHRoZSBsb2cgbGV2ZWwgdG8gYElORk9gLCBlcnJvcnMgd2lsbCBzdGlsbCBiZSBsb2dnZWQsIGJ1dCBgREVCVUdgIGFuZFxuICogYFZFUkJPU0VgIGxvZ3Mgd2lsbCBub3QpXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgREVCVUcsXG4gIFZFUkJPU0UsXG4gIElORk8sXG4gIFdBUk4sXG4gIEVSUk9SLFxuICBTSUxFTlRcbn1cblxuY29uc3QgbGV2ZWxTdHJpbmdUb0VudW06IHsgW2tleSBpbiBMb2dMZXZlbFN0cmluZ106IExvZ0xldmVsIH0gPSB7XG4gICdkZWJ1Zyc6IExvZ0xldmVsLkRFQlVHLFxuICAndmVyYm9zZSc6IExvZ0xldmVsLlZFUkJPU0UsXG4gICdpbmZvJzogTG9nTGV2ZWwuSU5GTyxcbiAgJ3dhcm4nOiBMb2dMZXZlbC5XQVJOLFxuICAnZXJyb3InOiBMb2dMZXZlbC5FUlJPUixcbiAgJ3NpbGVudCc6IExvZ0xldmVsLlNJTEVOVFxufTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBsb2cgbGV2ZWxcbiAqL1xuY29uc3QgZGVmYXVsdExvZ0xldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLklORk87XG5cbi8qKlxuICogV2UgYWxsb3cgdXNlcnMgdGhlIGFiaWxpdHkgdG8gcGFzcyB0aGVpciBvd24gbG9nIGhhbmRsZXIuIFdlIHdpbGwgcGFzcyB0aGVcbiAqIHR5cGUgb2YgbG9nLCB0aGUgY3VycmVudCBsb2cgbGV2ZWwsIGFuZCBhbnkgb3RoZXIgYXJndW1lbnRzIHBhc3NlZCAoaS5lLiB0aGVcbiAqIG1lc3NhZ2VzIHRoYXQgdGhlIHVzZXIgd2FudHMgdG8gbG9nKSB0byB0aGlzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBMb2dIYW5kbGVyID0gKFxuICBsb2dnZXJJbnN0YW5jZTogTG9nZ2VyLFxuICBsb2dUeXBlOiBMb2dMZXZlbCxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pID0+IHZvaWQ7XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBkaXNwbGF5ZWQgaW4gdGhlIGRldmVsb3BlciBjb25zb2xlIChpblxuICogY2hyb21lKS4gVG8gYXZvaWQgZm9yY2luZyB1c2VycyB0byBoYXZlIHRvIG9wdC1pbiB0byB0aGVzZSBsb2dzIHR3aWNlXG4gKiAoaS5lLiBvbmNlIGZvciBmaXJlYmFzZSwgYW5kIG9uY2UgaW4gdGhlIGNvbnNvbGUpLCB3ZSBhcmUgc2VuZGluZyBgREVCVUdgXG4gKiBsb2dzIHRvIHRoZSBgY29uc29sZS5sb2dgIGZ1bmN0aW9uLlxuICovXG5jb25zdCBDb25zb2xlTWV0aG9kID0ge1xuICBbTG9nTGV2ZWwuREVCVUddOiAnbG9nJyxcbiAgW0xvZ0xldmVsLlZFUkJPU0VdOiAnbG9nJyxcbiAgW0xvZ0xldmVsLklORk9dOiAnaW5mbycsXG4gIFtMb2dMZXZlbC5XQVJOXTogJ3dhcm4nLFxuICBbTG9nTGV2ZWwuRVJST1JdOiAnZXJyb3InXG59O1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGxvZyBoYW5kbGVyIHdpbGwgZm9yd2FyZCBERUJVRywgVkVSQk9TRSwgSU5GTywgV0FSTiwgYW5kIEVSUk9SXG4gKiBtZXNzYWdlcyBvbiB0byB0aGVpciBjb3JyZXNwb25kaW5nIGNvbnNvbGUgY291bnRlcnBhcnRzIChpZiB0aGUgbG9nIG1ldGhvZFxuICogaXMgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGxvZyBsZXZlbClcbiAqL1xuY29uc3QgZGVmYXVsdExvZ0hhbmRsZXI6IExvZ0hhbmRsZXIgPSAoaW5zdGFuY2UsIGxvZ1R5cGUsIC4uLmFyZ3MpOiB2b2lkID0+IHtcbiAgaWYgKGxvZ1R5cGUgPCBpbnN0YW5jZS5sb2dMZXZlbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIGNvbnN0IG1ldGhvZCA9IENvbnNvbGVNZXRob2RbbG9nVHlwZSBhcyBrZXlvZiB0eXBlb2YgQ29uc29sZU1ldGhvZF07XG4gIGlmIChtZXRob2QpIHtcbiAgICBjb25zb2xlW21ldGhvZCBhcyAnbG9nJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdlcnJvciddKFxuICAgICAgYFske25vd31dICAke2luc3RhbmNlLm5hbWV9OmAsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQXR0ZW1wdGVkIHRvIGxvZyBhIG1lc3NhZ2Ugd2l0aCBhbiBpbnZhbGlkIGxvZ1R5cGUgKHZhbHVlOiAke2xvZ1R5cGV9KWBcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgY2xhc3MgTG9nZ2VyIHtcbiAgLyoqXG4gICAqIEdpdmVzIHlvdSBhbiBpbnN0YW5jZSBvZiBhIExvZ2dlciB0byBjYXB0dXJlIG1lc3NhZ2VzIGFjY29yZGluZyB0b1xuICAgKiBGaXJlYmFzZSdzIGxvZ2dpbmcgc2NoZW1lLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSB0aGF0IHRoZSBsb2dzIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICogQ2FwdHVyZSB0aGUgY3VycmVudCBpbnN0YW5jZSBmb3IgbGF0ZXIgdXNlXG4gICAgICovXG4gICAgaW5zdGFuY2VzLnB1c2godGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGxvZyBsZXZlbCBvZiB0aGUgZ2l2ZW4gTG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9nTGV2ZWwgPSBkZWZhdWx0TG9nTGV2ZWw7XG5cbiAgZ2V0IGxvZ0xldmVsKCk6IExvZ0xldmVsIHtcbiAgICByZXR1cm4gdGhpcy5fbG9nTGV2ZWw7XG4gIH1cblxuICBzZXQgbG9nTGV2ZWwodmFsOiBMb2dMZXZlbCkge1xuICAgIGlmICghKHZhbCBpbiBMb2dMZXZlbCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmFsdWUgXCIke3ZhbH1cIiBhc3NpZ25lZCB0byBcXGBsb2dMZXZlbFxcYGApO1xuICAgIH1cbiAgICB0aGlzLl9sb2dMZXZlbCA9IHZhbDtcbiAgfVxuXG4gIC8vIFdvcmthcm91bmQgZm9yIHNldHRlci9nZXR0ZXIgaGF2aW5nIHRvIGJlIHRoZSBzYW1lIHR5cGUuXG4gIHNldExvZ0xldmVsKHZhbDogTG9nTGV2ZWwgfCBMb2dMZXZlbFN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX2xvZ0xldmVsID0gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyBsZXZlbFN0cmluZ1RvRW51bVt2YWxdIDogdmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYWluIChpbnRlcm5hbCkgbG9nIGhhbmRsZXIgZm9yIHRoZSBMb2dnZXIgaW5zdGFuY2UuXG4gICAqIENhbiBiZSBzZXQgdG8gYSBuZXcgZnVuY3Rpb24gaW4gaW50ZXJuYWwgcGFja2FnZSBjb2RlIGJ1dCBub3QgYnkgdXNlci5cbiAgICovXG4gIHByaXZhdGUgX2xvZ0hhbmRsZXI6IExvZ0hhbmRsZXIgPSBkZWZhdWx0TG9nSGFuZGxlcjtcbiAgZ2V0IGxvZ0hhbmRsZXIoKTogTG9nSGFuZGxlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xvZ0hhbmRsZXI7XG4gIH1cbiAgc2V0IGxvZ0hhbmRsZXIodmFsOiBMb2dIYW5kbGVyKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1ZhbHVlIGFzc2lnbmVkIHRvIGBsb2dIYW5kbGVyYCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICB9XG4gICAgdGhpcy5fbG9nSGFuZGxlciA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb3B0aW9uYWwsIGFkZGl0aW9uYWwsIHVzZXItZGVmaW5lZCBsb2cgaGFuZGxlciBmb3IgdGhlIExvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIHByaXZhdGUgX3VzZXJMb2dIYW5kbGVyOiBMb2dIYW5kbGVyIHwgbnVsbCA9IG51bGw7XG4gIGdldCB1c2VyTG9nSGFuZGxlcigpOiBMb2dIYW5kbGVyIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXJMb2dIYW5kbGVyO1xuICB9XG4gIHNldCB1c2VyTG9nSGFuZGxlcih2YWw6IExvZ0hhbmRsZXIgfCBudWxsKSB7XG4gICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgPSB2YWw7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgYWxsIGJhc2VkIG9uIHRoZSBgY29uc29sZWAgaW50ZXJmYWNlXG4gICAqL1xuXG4gIGRlYnVnKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyICYmIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkRFQlVHLCAuLi5hcmdzKTtcbiAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLkRFQlVHLCAuLi5hcmdzKTtcbiAgfVxuICBsb2coLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiZcbiAgICAgIHRoaXMuX3VzZXJMb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLlZFUkJPU0UsIC4uLmFyZ3MpO1xuICAgIHRoaXMuX2xvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuVkVSQk9TRSwgLi4uYXJncyk7XG4gIH1cbiAgaW5mbyguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJiB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5JTkZPLCAuLi5hcmdzKTtcbiAgICB0aGlzLl9sb2dIYW5kbGVyKHRoaXMsIExvZ0xldmVsLklORk8sIC4uLmFyZ3MpO1xuICB9XG4gIHdhcm4oLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgdGhpcy5fdXNlckxvZ0hhbmRsZXIgJiYgdGhpcy5fdXNlckxvZ0hhbmRsZXIodGhpcywgTG9nTGV2ZWwuV0FSTiwgLi4uYXJncyk7XG4gICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5XQVJOLCAuLi5hcmdzKTtcbiAgfVxuICBlcnJvciguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLl91c2VyTG9nSGFuZGxlciAmJiB0aGlzLl91c2VyTG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5FUlJPUiwgLi4uYXJncyk7XG4gICAgdGhpcy5fbG9nSGFuZGxlcih0aGlzLCBMb2dMZXZlbC5FUlJPUiwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldExvZ0xldmVsKGxldmVsOiBMb2dMZXZlbFN0cmluZyB8IExvZ0xldmVsKTogdm9pZCB7XG4gIGluc3RhbmNlcy5mb3JFYWNoKGluc3QgPT4ge1xuICAgIGluc3Quc2V0TG9nTGV2ZWwobGV2ZWwpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFVzZXJMb2dIYW5kbGVyKFxuICBsb2dDYWxsYmFjazogTG9nQ2FsbGJhY2sgfCBudWxsLFxuICBvcHRpb25zPzogTG9nT3B0aW9uc1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKSB7XG4gICAgbGV0IGN1c3RvbUxvZ0xldmVsOiBMb2dMZXZlbCB8IG51bGwgPSBudWxsO1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubGV2ZWwpIHtcbiAgICAgIGN1c3RvbUxvZ0xldmVsID0gbGV2ZWxTdHJpbmdUb0VudW1bb3B0aW9ucy5sZXZlbF07XG4gICAgfVxuICAgIGlmIChsb2dDYWxsYmFjayA9PT0gbnVsbCkge1xuICAgICAgaW5zdGFuY2UudXNlckxvZ0hhbmRsZXIgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS51c2VyTG9nSGFuZGxlciA9IChcbiAgICAgICAgaW5zdGFuY2U6IExvZ2dlcixcbiAgICAgICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgICAgICAuLi5hcmdzOiB1bmtub3duW11cbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYXJnc1xuICAgICAgICAgIC5tYXAoYXJnID0+IHtcbiAgICAgICAgICAgIGlmIChhcmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFyZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhcmcudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGFyZy5tZXNzYWdlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoaWdub3JlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKGFyZyA9PiBhcmcpXG4gICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICAgICAgaWYgKGxldmVsID49IChjdXN0b21Mb2dMZXZlbCA/PyBpbnN0YW5jZS5sb2dMZXZlbCkpIHtcbiAgICAgICAgICBsb2dDYWxsYmFjayh7XG4gICAgICAgICAgICBsZXZlbDogTG9nTGV2ZWxbbGV2ZWxdLnRvTG93ZXJDYXNlKCkgYXMgTG9nTGV2ZWxTdHJpbmcsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHR5cGU6IGluc3RhbmNlLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiIsICJjb25zdCBpbnN0YW5jZU9mQW55ID0gKG9iamVjdCwgY29uc3RydWN0b3JzKSA9PiBjb25zdHJ1Y3RvcnMuc29tZSgoYykgPT4gb2JqZWN0IGluc3RhbmNlb2YgYyk7XG5cbmxldCBpZGJQcm94eWFibGVUeXBlcztcbmxldCBjdXJzb3JBZHZhbmNlTWV0aG9kcztcbi8vIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBwcmV2ZW50IGl0IHRocm93aW5nIHVwIGluIG5vZGUgZW52aXJvbm1lbnRzLlxuZnVuY3Rpb24gZ2V0SWRiUHJveHlhYmxlVHlwZXMoKSB7XG4gICAgcmV0dXJuIChpZGJQcm94eWFibGVUeXBlcyB8fFxuICAgICAgICAoaWRiUHJveHlhYmxlVHlwZXMgPSBbXG4gICAgICAgICAgICBJREJEYXRhYmFzZSxcbiAgICAgICAgICAgIElEQk9iamVjdFN0b3JlLFxuICAgICAgICAgICAgSURCSW5kZXgsXG4gICAgICAgICAgICBJREJDdXJzb3IsXG4gICAgICAgICAgICBJREJUcmFuc2FjdGlvbixcbiAgICAgICAgXSkpO1xufVxuLy8gVGhpcyBpcyBhIGZ1bmN0aW9uIHRvIHByZXZlbnQgaXQgdGhyb3dpbmcgdXAgaW4gbm9kZSBlbnZpcm9ubWVudHMuXG5mdW5jdGlvbiBnZXRDdXJzb3JBZHZhbmNlTWV0aG9kcygpIHtcbiAgICByZXR1cm4gKGN1cnNvckFkdmFuY2VNZXRob2RzIHx8XG4gICAgICAgIChjdXJzb3JBZHZhbmNlTWV0aG9kcyA9IFtcbiAgICAgICAgICAgIElEQkN1cnNvci5wcm90b3R5cGUuYWR2YW5jZSxcbiAgICAgICAgICAgIElEQkN1cnNvci5wcm90b3R5cGUuY29udGludWUsXG4gICAgICAgICAgICBJREJDdXJzb3IucHJvdG90eXBlLmNvbnRpbnVlUHJpbWFyeUtleSxcbiAgICAgICAgXSkpO1xufVxuY29uc3QgY3Vyc29yUmVxdWVzdE1hcCA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCB0cmFuc2FjdGlvbkRvbmVNYXAgPSBuZXcgV2Vha01hcCgpO1xuY29uc3QgdHJhbnNhY3Rpb25TdG9yZU5hbWVzTWFwID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHRyYW5zZm9ybUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHJldmVyc2VUcmFuc2Zvcm1DYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5mdW5jdGlvbiBwcm9taXNpZnlSZXF1ZXN0KHJlcXVlc3QpIHtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB1bmxpc3RlbiA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsIHN1Y2Nlc3MpO1xuICAgICAgICAgICAgcmVxdWVzdC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUod3JhcChyZXF1ZXN0LnJlc3VsdCkpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QocmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICB1bmxpc3RlbigpO1xuICAgICAgICB9O1xuICAgICAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3N1Y2Nlc3MnLCBzdWNjZXNzKTtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yKTtcbiAgICB9KTtcbiAgICBwcm9taXNlXG4gICAgICAgIC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAvLyBTaW5jZSBjdXJzb3JpbmcgcmV1c2VzIHRoZSBJREJSZXF1ZXN0ICgqc2lnaCopLCB3ZSBjYWNoZSBpdCBmb3IgbGF0ZXIgcmV0cmlldmFsXG4gICAgICAgIC8vIChzZWUgd3JhcEZ1bmN0aW9uKS5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSURCQ3Vyc29yKSB7XG4gICAgICAgICAgICBjdXJzb3JSZXF1ZXN0TWFwLnNldCh2YWx1ZSwgcmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2F0Y2hpbmcgdG8gYXZvaWQgXCJVbmNhdWdodCBQcm9taXNlIGV4Y2VwdGlvbnNcIlxuICAgIH0pXG4gICAgICAgIC5jYXRjaCgoKSA9PiB7IH0pO1xuICAgIC8vIFRoaXMgbWFwcGluZyBleGlzdHMgaW4gcmV2ZXJzZVRyYW5zZm9ybUNhY2hlIGJ1dCBkb2Vzbid0IGRvZXNuJ3QgZXhpc3QgaW4gdHJhbnNmb3JtQ2FjaGUuIFRoaXNcbiAgICAvLyBpcyBiZWNhdXNlIHdlIGNyZWF0ZSBtYW55IHByb21pc2VzIGZyb20gYSBzaW5nbGUgSURCUmVxdWVzdC5cbiAgICByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuc2V0KHByb21pc2UsIHJlcXVlc3QpO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuZnVuY3Rpb24gY2FjaGVEb25lUHJvbWlzZUZvclRyYW5zYWN0aW9uKHR4KSB7XG4gICAgLy8gRWFybHkgYmFpbCBpZiB3ZSd2ZSBhbHJlYWR5IGNyZWF0ZWQgYSBkb25lIHByb21pc2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgaWYgKHRyYW5zYWN0aW9uRG9uZU1hcC5oYXModHgpKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgZG9uZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgdW5saXN0ZW4gPSAoKSA9PiB7XG4gICAgICAgICAgICB0eC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb21wbGV0ZScsIGNvbXBsZXRlKTtcbiAgICAgICAgICAgIHR4LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgdHgucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBlcnJvcik7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QodHguZXJyb3IgfHwgbmV3IERPTUV4Y2VwdGlvbignQWJvcnRFcnJvcicsICdBYm9ydEVycm9yJykpO1xuICAgICAgICAgICAgdW5saXN0ZW4oKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHguYWRkRXZlbnRMaXN0ZW5lcignY29tcGxldGUnLCBjb21wbGV0ZSk7XG4gICAgICAgIHR4LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICB0eC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGVycm9yKTtcbiAgICB9KTtcbiAgICAvLyBDYWNoZSBpdCBmb3IgbGF0ZXIgcmV0cmlldmFsLlxuICAgIHRyYW5zYWN0aW9uRG9uZU1hcC5zZXQodHgsIGRvbmUpO1xufVxubGV0IGlkYlByb3h5VHJhcHMgPSB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElEQlRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0cmFuc2FjdGlvbi5kb25lLlxuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdkb25lJylcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNhY3Rpb25Eb25lTWFwLmdldCh0YXJnZXQpO1xuICAgICAgICAgICAgLy8gUG9seWZpbGwgZm9yIG9iamVjdFN0b3JlTmFtZXMgYmVjYXVzZSBvZiBFZGdlLlxuICAgICAgICAgICAgaWYgKHByb3AgPT09ICdvYmplY3RTdG9yZU5hbWVzJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQub2JqZWN0U3RvcmVOYW1lcyB8fCB0cmFuc2FjdGlvblN0b3JlTmFtZXNNYXAuZ2V0KHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYWtlIHR4LnN0b3JlIHJldHVybiB0aGUgb25seSBzdG9yZSBpbiB0aGUgdHJhbnNhY3Rpb24sIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBhcmUgbWFueS5cbiAgICAgICAgICAgIGlmIChwcm9wID09PSAnc3RvcmUnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlY2VpdmVyLm9iamVjdFN0b3JlTmFtZXNbMV1cbiAgICAgICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgOiByZWNlaXZlci5vYmplY3RTdG9yZShyZWNlaXZlci5vYmplY3RTdG9yZU5hbWVzWzBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBFbHNlIHRyYW5zZm9ybSB3aGF0ZXZlciB3ZSBnZXQgYmFjay5cbiAgICAgICAgcmV0dXJuIHdyYXAodGFyZ2V0W3Byb3BdKTtcbiAgICB9LFxuICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGhhcyh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElEQlRyYW5zYWN0aW9uICYmXG4gICAgICAgICAgICAocHJvcCA9PT0gJ2RvbmUnIHx8IHByb3AgPT09ICdzdG9yZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQ7XG4gICAgfSxcbn07XG5mdW5jdGlvbiByZXBsYWNlVHJhcHMoY2FsbGJhY2spIHtcbiAgICBpZGJQcm94eVRyYXBzID0gY2FsbGJhY2soaWRiUHJveHlUcmFwcyk7XG59XG5mdW5jdGlvbiB3cmFwRnVuY3Rpb24oZnVuYykge1xuICAgIC8vIER1ZSB0byBleHBlY3RlZCBvYmplY3QgZXF1YWxpdHkgKHdoaWNoIGlzIGVuZm9yY2VkIGJ5IHRoZSBjYWNoaW5nIGluIGB3cmFwYCksIHdlXG4gICAgLy8gb25seSBjcmVhdGUgb25lIG5ldyBmdW5jIHBlciBmdW5jLlxuICAgIC8vIEVkZ2UgZG9lc24ndCBzdXBwb3J0IG9iamVjdFN0b3JlTmFtZXMgKGJvb28pLCBzbyB3ZSBwb2x5ZmlsbCBpdCBoZXJlLlxuICAgIGlmIChmdW5jID09PSBJREJEYXRhYmFzZS5wcm90b3R5cGUudHJhbnNhY3Rpb24gJiZcbiAgICAgICAgISgnb2JqZWN0U3RvcmVOYW1lcycgaW4gSURCVHJhbnNhY3Rpb24ucHJvdG90eXBlKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHN0b3JlTmFtZXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHR4ID0gZnVuYy5jYWxsKHVud3JhcCh0aGlzKSwgc3RvcmVOYW1lcywgLi4uYXJncyk7XG4gICAgICAgICAgICB0cmFuc2FjdGlvblN0b3JlTmFtZXNNYXAuc2V0KHR4LCBzdG9yZU5hbWVzLnNvcnQgPyBzdG9yZU5hbWVzLnNvcnQoKSA6IFtzdG9yZU5hbWVzXSk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcCh0eCk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIC8vIEN1cnNvciBtZXRob2RzIGFyZSBzcGVjaWFsLCBhcyB0aGUgYmVoYXZpb3VyIGlzIGEgbGl0dGxlIG1vcmUgZGlmZmVyZW50IHRvIHN0YW5kYXJkIElEQi4gSW5cbiAgICAvLyBJREIsIHlvdSBhZHZhbmNlIHRoZSBjdXJzb3IgYW5kIHdhaXQgZm9yIGEgbmV3ICdzdWNjZXNzJyBvbiB0aGUgSURCUmVxdWVzdCB0aGF0IGdhdmUgeW91IHRoZVxuICAgIC8vIGN1cnNvci4gSXQncyBraW5kYSBsaWtlIGEgcHJvbWlzZSB0aGF0IGNhbiByZXNvbHZlIHdpdGggbWFueSB2YWx1ZXMuIFRoYXQgZG9lc24ndCBtYWtlIHNlbnNlXG4gICAgLy8gd2l0aCByZWFsIHByb21pc2VzLCBzbyBlYWNoIGFkdmFuY2UgbWV0aG9kcyByZXR1cm5zIGEgbmV3IHByb21pc2UgZm9yIHRoZSBjdXJzb3Igb2JqZWN0LCBvclxuICAgIC8vIHVuZGVmaW5lZCBpZiB0aGUgZW5kIG9mIHRoZSBjdXJzb3IgaGFzIGJlZW4gcmVhY2hlZC5cbiAgICBpZiAoZ2V0Q3Vyc29yQWR2YW5jZU1ldGhvZHMoKS5pbmNsdWRlcyhmdW5jKSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8vIENhbGxpbmcgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHdpdGggdGhlIHByb3h5IGFzICd0aGlzJyBjYXVzZXMgSUxMRUdBTCBJTlZPQ0FUSU9OLCBzbyB3ZSB1c2VcbiAgICAgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAgICAgICAgICBmdW5jLmFwcGx5KHVud3JhcCh0aGlzKSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gd3JhcChjdXJzb3JSZXF1ZXN0TWFwLmdldCh0aGlzKSk7XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAvLyBDYWxsaW5nIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiB3aXRoIHRoZSBwcm94eSBhcyAndGhpcycgY2F1c2VzIElMTEVHQUwgSU5WT0NBVElPTiwgc28gd2UgdXNlXG4gICAgICAgIC8vIHRoZSBvcmlnaW5hbCBvYmplY3QuXG4gICAgICAgIHJldHVybiB3cmFwKGZ1bmMuYXBwbHkodW53cmFwKHRoaXMpLCBhcmdzKSk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybUNhY2hhYmxlVmFsdWUodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gd3JhcEZ1bmN0aW9uKHZhbHVlKTtcbiAgICAvLyBUaGlzIGRvZXNuJ3QgcmV0dXJuLCBpdCBqdXN0IGNyZWF0ZXMgYSAnZG9uZScgcHJvbWlzZSBmb3IgdGhlIHRyYW5zYWN0aW9uLFxuICAgIC8vIHdoaWNoIGlzIGxhdGVyIHJldHVybmVkIGZvciB0cmFuc2FjdGlvbi5kb25lIChzZWUgaWRiT2JqZWN0SGFuZGxlcikuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSURCVHJhbnNhY3Rpb24pXG4gICAgICAgIGNhY2hlRG9uZVByb21pc2VGb3JUcmFuc2FjdGlvbih2YWx1ZSk7XG4gICAgaWYgKGluc3RhbmNlT2ZBbnkodmFsdWUsIGdldElkYlByb3h5YWJsZVR5cGVzKCkpKVxuICAgICAgICByZXR1cm4gbmV3IFByb3h5KHZhbHVlLCBpZGJQcm94eVRyYXBzKTtcbiAgICAvLyBSZXR1cm4gdGhlIHNhbWUgdmFsdWUgYmFjayBpZiB3ZSdyZSBub3QgZ29pbmcgdG8gdHJhbnNmb3JtIGl0LlxuICAgIHJldHVybiB2YWx1ZTtcbn1cbmZ1bmN0aW9uIHdyYXAodmFsdWUpIHtcbiAgICAvLyBXZSBzb21ldGltZXMgZ2VuZXJhdGUgbXVsdGlwbGUgcHJvbWlzZXMgZnJvbSBhIHNpbmdsZSBJREJSZXF1ZXN0IChlZyB3aGVuIGN1cnNvcmluZyksIGJlY2F1c2VcbiAgICAvLyBJREIgaXMgd2VpcmQgYW5kIGEgc2luZ2xlIElEQlJlcXVlc3QgY2FuIHlpZWxkIG1hbnkgcmVzcG9uc2VzLCBzbyB0aGVzZSBjYW4ndCBiZSBjYWNoZWQuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSURCUmVxdWVzdClcbiAgICAgICAgcmV0dXJuIHByb21pc2lmeVJlcXVlc3QodmFsdWUpO1xuICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgdHJhbnNmb3JtZWQgdGhpcyB2YWx1ZSBiZWZvcmUsIHJldXNlIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZS5cbiAgICAvLyBUaGlzIGlzIGZhc3RlciwgYnV0IGl0IGFsc28gcHJvdmlkZXMgb2JqZWN0IGVxdWFsaXR5LlxuICAgIGlmICh0cmFuc2Zvcm1DYWNoZS5oYXModmFsdWUpKVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtQ2FjaGUuZ2V0KHZhbHVlKTtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHRyYW5zZm9ybUNhY2hhYmxlVmFsdWUodmFsdWUpO1xuICAgIC8vIE5vdCBhbGwgdHlwZXMgYXJlIHRyYW5zZm9ybWVkLlxuICAgIC8vIFRoZXNlIG1heSBiZSBwcmltaXRpdmUgdHlwZXMsIHNvIHRoZXkgY2FuJ3QgYmUgV2Vha01hcCBrZXlzLlxuICAgIGlmIChuZXdWYWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdHJhbnNmb3JtQ2FjaGUuc2V0KHZhbHVlLCBuZXdWYWx1ZSk7XG4gICAgICAgIHJldmVyc2VUcmFuc2Zvcm1DYWNoZS5zZXQobmV3VmFsdWUsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1ZhbHVlO1xufVxuY29uc3QgdW53cmFwID0gKHZhbHVlKSA9PiByZXZlcnNlVHJhbnNmb3JtQ2FjaGUuZ2V0KHZhbHVlKTtcblxuZXhwb3J0IHsgcmV2ZXJzZVRyYW5zZm9ybUNhY2hlIGFzIGEsIGluc3RhbmNlT2ZBbnkgYXMgaSwgcmVwbGFjZVRyYXBzIGFzIHIsIHVud3JhcCBhcyB1LCB3cmFwIGFzIHcgfTtcbiIsICJpbXBvcnQgeyB3IGFzIHdyYXAsIHIgYXMgcmVwbGFjZVRyYXBzIH0gZnJvbSAnLi93cmFwLWlkYi12YWx1ZS5qcyc7XG5leHBvcnQgeyB1IGFzIHVud3JhcCwgdyBhcyB3cmFwIH0gZnJvbSAnLi93cmFwLWlkYi12YWx1ZS5qcyc7XG5cbi8qKlxuICogT3BlbiBhIGRhdGFiYXNlLlxuICpcbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGRhdGFiYXNlLlxuICogQHBhcmFtIHZlcnNpb24gU2NoZW1hIHZlcnNpb24uXG4gKiBAcGFyYW0gY2FsbGJhY2tzIEFkZGl0aW9uYWwgY2FsbGJhY2tzLlxuICovXG5mdW5jdGlvbiBvcGVuREIobmFtZSwgdmVyc2lvbiwgeyBibG9ja2VkLCB1cGdyYWRlLCBibG9ja2luZywgdGVybWluYXRlZCB9ID0ge30pIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gaW5kZXhlZERCLm9wZW4obmFtZSwgdmVyc2lvbik7XG4gICAgY29uc3Qgb3BlblByb21pc2UgPSB3cmFwKHJlcXVlc3QpO1xuICAgIGlmICh1cGdyYWRlKSB7XG4gICAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigndXBncmFkZW5lZWRlZCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgdXBncmFkZSh3cmFwKHJlcXVlc3QucmVzdWx0KSwgZXZlbnQub2xkVmVyc2lvbiwgZXZlbnQubmV3VmVyc2lvbiwgd3JhcChyZXF1ZXN0LnRyYW5zYWN0aW9uKSwgZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGJsb2NrZWQpIHtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdibG9ja2VkJywgKGV2ZW50KSA9PiBibG9ja2VkKFxuICAgICAgICAvLyBDYXN0aW5nIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQtRE9NLWxpYi1nZW5lcmF0b3IvcHVsbC8xNDA1XG4gICAgICAgIGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50Lm5ld1ZlcnNpb24sIGV2ZW50KSk7XG4gICAgfVxuICAgIG9wZW5Qcm9taXNlXG4gICAgICAgIC50aGVuKChkYikgPT4ge1xuICAgICAgICBpZiAodGVybWluYXRlZClcbiAgICAgICAgICAgIGRiLmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgKCkgPT4gdGVybWluYXRlZCgpKTtcbiAgICAgICAgaWYgKGJsb2NraW5nKSB7XG4gICAgICAgICAgICBkYi5hZGRFdmVudExpc3RlbmVyKCd2ZXJzaW9uY2hhbmdlJywgKGV2ZW50KSA9PiBibG9ja2luZyhldmVudC5vbGRWZXJzaW9uLCBldmVudC5uZXdWZXJzaW9uLCBldmVudCkpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHsgfSk7XG4gICAgcmV0dXJuIG9wZW5Qcm9taXNlO1xufVxuLyoqXG4gKiBEZWxldGUgYSBkYXRhYmFzZS5cbiAqXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSBkYXRhYmFzZS5cbiAqL1xuZnVuY3Rpb24gZGVsZXRlREIobmFtZSwgeyBibG9ja2VkIH0gPSB7fSkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UobmFtZSk7XG4gICAgaWYgKGJsb2NrZWQpIHtcbiAgICAgICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCdibG9ja2VkJywgKGV2ZW50KSA9PiBibG9ja2VkKFxuICAgICAgICAvLyBDYXN0aW5nIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQtRE9NLWxpYi1nZW5lcmF0b3IvcHVsbC8xNDA1XG4gICAgICAgIGV2ZW50Lm9sZFZlcnNpb24sIGV2ZW50KSk7XG4gICAgfVxuICAgIHJldHVybiB3cmFwKHJlcXVlc3QpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKTtcbn1cblxuY29uc3QgcmVhZE1ldGhvZHMgPSBbJ2dldCcsICdnZXRLZXknLCAnZ2V0QWxsJywgJ2dldEFsbEtleXMnLCAnY291bnQnXTtcbmNvbnN0IHdyaXRlTWV0aG9kcyA9IFsncHV0JywgJ2FkZCcsICdkZWxldGUnLCAnY2xlYXInXTtcbmNvbnN0IGNhY2hlZE1ldGhvZHMgPSBuZXcgTWFwKCk7XG5mdW5jdGlvbiBnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB7XG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSURCRGF0YWJhc2UgJiZcbiAgICAgICAgIShwcm9wIGluIHRhcmdldCkgJiZcbiAgICAgICAgdHlwZW9mIHByb3AgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjYWNoZWRNZXRob2RzLmdldChwcm9wKSlcbiAgICAgICAgcmV0dXJuIGNhY2hlZE1ldGhvZHMuZ2V0KHByb3ApO1xuICAgIGNvbnN0IHRhcmdldEZ1bmNOYW1lID0gcHJvcC5yZXBsYWNlKC9Gcm9tSW5kZXgkLywgJycpO1xuICAgIGNvbnN0IHVzZUluZGV4ID0gcHJvcCAhPT0gdGFyZ2V0RnVuY05hbWU7XG4gICAgY29uc3QgaXNXcml0ZSA9IHdyaXRlTWV0aG9kcy5pbmNsdWRlcyh0YXJnZXRGdW5jTmFtZSk7XG4gICAgaWYgKFxuICAgIC8vIEJhaWwgaWYgdGhlIHRhcmdldCBkb2Vzbid0IGV4aXN0IG9uIHRoZSB0YXJnZXQuIEVnLCBnZXRBbGwgaXNuJ3QgaW4gRWRnZS5cbiAgICAhKHRhcmdldEZ1bmNOYW1lIGluICh1c2VJbmRleCA/IElEQkluZGV4IDogSURCT2JqZWN0U3RvcmUpLnByb3RvdHlwZSkgfHxcbiAgICAgICAgIShpc1dyaXRlIHx8IHJlYWRNZXRob2RzLmluY2x1ZGVzKHRhcmdldEZ1bmNOYW1lKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXRob2QgPSBhc3luYyBmdW5jdGlvbiAoc3RvcmVOYW1lLCAuLi5hcmdzKSB7XG4gICAgICAgIC8vIGlzV3JpdGUgPyAncmVhZHdyaXRlJyA6IHVuZGVmaW5lZCBnemlwcHMgYmV0dGVyLCBidXQgZmFpbHMgaW4gRWRnZSA6KFxuICAgICAgICBjb25zdCB0eCA9IHRoaXMudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBpc1dyaXRlID8gJ3JlYWR3cml0ZScgOiAncmVhZG9ubHknKTtcbiAgICAgICAgbGV0IHRhcmdldCA9IHR4LnN0b3JlO1xuICAgICAgICBpZiAodXNlSW5kZXgpXG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuaW5kZXgoYXJncy5zaGlmdCgpKTtcbiAgICAgICAgLy8gTXVzdCByZWplY3QgaWYgb3AgcmVqZWN0cy5cbiAgICAgICAgLy8gSWYgaXQncyBhIHdyaXRlIG9wZXJhdGlvbiwgbXVzdCByZWplY3QgaWYgdHguZG9uZSByZWplY3RzLlxuICAgICAgICAvLyBNdXN0IHJlamVjdCB3aXRoIG9wIHJlamVjdGlvbiBmaXJzdC5cbiAgICAgICAgLy8gTXVzdCByZXNvbHZlIHdpdGggb3AgdmFsdWUuXG4gICAgICAgIC8vIE11c3QgaGFuZGxlIGJvdGggcHJvbWlzZXMgKG5vIHVuaGFuZGxlZCByZWplY3Rpb25zKVxuICAgICAgICByZXR1cm4gKGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHRhcmdldFt0YXJnZXRGdW5jTmFtZV0oLi4uYXJncyksXG4gICAgICAgICAgICBpc1dyaXRlICYmIHR4LmRvbmUsXG4gICAgICAgIF0pKVswXTtcbiAgICB9O1xuICAgIGNhY2hlZE1ldGhvZHMuc2V0KHByb3AsIG1ldGhvZCk7XG4gICAgcmV0dXJuIG1ldGhvZDtcbn1cbnJlcGxhY2VUcmFwcygob2xkVHJhcHMpID0+ICh7XG4gICAgLi4ub2xkVHJhcHMsXG4gICAgZ2V0OiAodGFyZ2V0LCBwcm9wLCByZWNlaXZlcikgPT4gZ2V0TWV0aG9kKHRhcmdldCwgcHJvcCkgfHwgb2xkVHJhcHMuZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpLFxuICAgIGhhczogKHRhcmdldCwgcHJvcCkgPT4gISFnZXRNZXRob2QodGFyZ2V0LCBwcm9wKSB8fCBvbGRUcmFwcy5oYXModGFyZ2V0LCBwcm9wKSxcbn0pKTtcblxuZXhwb3J0IHsgZGVsZXRlREIsIG9wZW5EQiB9O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIENvbXBvbmVudENvbnRhaW5lcixcbiAgQ29tcG9uZW50VHlwZSxcbiAgUHJvdmlkZXIsXG4gIE5hbWVcbn0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2UsIFZlcnNpb25TZXJ2aWNlIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybUxvZ2dlclNlcnZpY2VJbXBsIGltcGxlbWVudHMgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcikge31cbiAgLy8gSW4gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3aWxsIGJlIGNhbGxlZCBieSBpbnN0YWxsYXRpb25zIG9uXG4gIC8vIGF1dGggdG9rZW4gcmVmcmVzaCwgYW5kIGluc3RhbGxhdGlvbnMgd2lsbCBzZW5kIHRoaXMgc3RyaW5nLlxuICBnZXRQbGF0Zm9ybUluZm9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm92aWRlcnMgPSB0aGlzLmNvbnRhaW5lci5nZXRQcm92aWRlcnMoKTtcbiAgICAvLyBMb29wIHRocm91Z2ggcHJvdmlkZXJzIGFuZCBnZXQgbGlicmFyeS92ZXJzaW9uIHBhaXJzIGZyb20gYW55IHRoYXQgYXJlXG4gICAgLy8gdmVyc2lvbiBjb21wb25lbnRzLlxuICAgIHJldHVybiBwcm92aWRlcnNcbiAgICAgIC5tYXAocHJvdmlkZXIgPT4ge1xuICAgICAgICBpZiAoaXNWZXJzaW9uU2VydmljZVByb3ZpZGVyKHByb3ZpZGVyKSkge1xuICAgICAgICAgIGNvbnN0IHNlcnZpY2UgPSBwcm92aWRlci5nZXRJbW1lZGlhdGUoKSBhcyBWZXJzaW9uU2VydmljZTtcbiAgICAgICAgICByZXR1cm4gYCR7c2VydmljZS5saWJyYXJ5fS8ke3NlcnZpY2UudmVyc2lvbn1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihsb2dTdHJpbmcgPT4gbG9nU3RyaW5nKVxuICAgICAgLmpvaW4oJyAnKTtcbiAgfVxufVxuLyoqXG4gKlxuICogQHBhcmFtIHByb3ZpZGVyIGNoZWNrIGlmIHRoaXMgcHJvdmlkZXIgcHJvdmlkZXMgYSBWZXJzaW9uU2VydmljZVxuICpcbiAqIE5PVEU6IFVzaW5nIFByb3ZpZGVyPCdhcHAtdmVyc2lvbic+IGlzIGEgaGFjayB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm92aWRlclxuICogcHJvdmlkZXMgVmVyc2lvblNlcnZpY2UuIFRoZSBwcm92aWRlciBpcyBub3QgbmVjZXNzYXJpbHkgYSAnYXBwLXZlcnNpb24nXG4gKiBwcm92aWRlci5cbiAqL1xuZnVuY3Rpb24gaXNWZXJzaW9uU2VydmljZVByb3ZpZGVyKHByb3ZpZGVyOiBQcm92aWRlcjxOYW1lPik6IGJvb2xlYW4ge1xuICBjb25zdCBjb21wb25lbnQgPSBwcm92aWRlci5nZXRDb21wb25lbnQoKTtcbiAgcmV0dXJuIGNvbXBvbmVudD8udHlwZSA9PT0gQ29tcG9uZW50VHlwZS5WRVJTSU9OO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuXG5leHBvcnQgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcignQGZpcmViYXNlL2FwcCcpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IG5hbWUgYXMgYXBwTmFtZSB9IGZyb20gJy4uL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGFwcENvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi9hcHAtY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGFuYWx5dGljc0NvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hbmFseXRpY3MtY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGFuYWx5dGljc05hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hbmFseXRpY3MvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgYXBwQ2hlY2tDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvYXBwLWNoZWNrLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBhcHBDaGVja05hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hcHAtY2hlY2svcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgYXV0aE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9hdXRoL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGF1dGhDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvYXV0aC1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZGF0YWJhc2VOYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvZGF0YWJhc2UvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZGF0YWJhc2VDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvZGF0YWJhc2UtY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGZ1bmN0aW9uc05hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9mdW5jdGlvbnMvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZnVuY3Rpb25zQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2Z1bmN0aW9ucy1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgaW5zdGFsbGF0aW9uc05hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9pbnN0YWxsYXRpb25zL3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGluc3RhbGxhdGlvbnNDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvaW5zdGFsbGF0aW9ucy1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgbWVzc2FnaW5nTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL21lc3NhZ2luZy9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBtZXNzYWdpbmdDb21wYXROYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvbWVzc2FnaW5nLWNvbXBhdC9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBwZXJmb3JtYW5jZU5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9wZXJmb3JtYW5jZS9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBwZXJmb3JtYW5jZUNvbXBhdE5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9wZXJmb3JtYW5jZS1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgcmVtb3RlQ29uZmlnTmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL3JlbW90ZS1jb25maWcvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgcmVtb3RlQ29uZmlnQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL3JlbW90ZS1jb25maWctY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIHN0b3JhZ2VOYW1lIH0gZnJvbSAnLi4vLi4vLi4vcGFja2FnZXMvc3RvcmFnZS9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgbmFtZSBhcyBzdG9yYWdlQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL3N0b3JhZ2UtY29tcGF0L3BhY2thZ2UuanNvbic7XG5pbXBvcnQgeyBuYW1lIGFzIGZpcmVzdG9yZU5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9maXJlc3RvcmUvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgZmlyZXN0b3JlQ29tcGF0TmFtZSB9IGZyb20gJy4uLy4uLy4uL3BhY2thZ2VzL2ZpcmVzdG9yZS1jb21wYXQvcGFja2FnZS5qc29uJztcbmltcG9ydCB7IG5hbWUgYXMgcGFja2FnZU5hbWUgfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlcy9maXJlYmFzZS9wYWNrYWdlLmpzb24nO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGFwcCBuYW1lXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VOVFJZX05BTUUgPSAnW0RFRkFVTFRdJztcblxuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX0xPR19TVFJJTkcgPSB7XG4gIFthcHBOYW1lXTogJ2ZpcmUtY29yZScsXG4gIFthcHBDb21wYXROYW1lXTogJ2ZpcmUtY29yZS1jb21wYXQnLFxuICBbYW5hbHl0aWNzTmFtZV06ICdmaXJlLWFuYWx5dGljcycsXG4gIFthbmFseXRpY3NDb21wYXROYW1lXTogJ2ZpcmUtYW5hbHl0aWNzLWNvbXBhdCcsXG4gIFthcHBDaGVja05hbWVdOiAnZmlyZS1hcHAtY2hlY2snLFxuICBbYXBwQ2hlY2tDb21wYXROYW1lXTogJ2ZpcmUtYXBwLWNoZWNrLWNvbXBhdCcsXG4gIFthdXRoTmFtZV06ICdmaXJlLWF1dGgnLFxuICBbYXV0aENvbXBhdE5hbWVdOiAnZmlyZS1hdXRoLWNvbXBhdCcsXG4gIFtkYXRhYmFzZU5hbWVdOiAnZmlyZS1ydGRiJyxcbiAgW2RhdGFiYXNlQ29tcGF0TmFtZV06ICdmaXJlLXJ0ZGItY29tcGF0JyxcbiAgW2Z1bmN0aW9uc05hbWVdOiAnZmlyZS1mbicsXG4gIFtmdW5jdGlvbnNDb21wYXROYW1lXTogJ2ZpcmUtZm4tY29tcGF0JyxcbiAgW2luc3RhbGxhdGlvbnNOYW1lXTogJ2ZpcmUtaWlkJyxcbiAgW2luc3RhbGxhdGlvbnNDb21wYXROYW1lXTogJ2ZpcmUtaWlkLWNvbXBhdCcsXG4gIFttZXNzYWdpbmdOYW1lXTogJ2ZpcmUtZmNtJyxcbiAgW21lc3NhZ2luZ0NvbXBhdE5hbWVdOiAnZmlyZS1mY20tY29tcGF0JyxcbiAgW3BlcmZvcm1hbmNlTmFtZV06ICdmaXJlLXBlcmYnLFxuICBbcGVyZm9ybWFuY2VDb21wYXROYW1lXTogJ2ZpcmUtcGVyZi1jb21wYXQnLFxuICBbcmVtb3RlQ29uZmlnTmFtZV06ICdmaXJlLXJjJyxcbiAgW3JlbW90ZUNvbmZpZ0NvbXBhdE5hbWVdOiAnZmlyZS1yYy1jb21wYXQnLFxuICBbc3RvcmFnZU5hbWVdOiAnZmlyZS1nY3MnLFxuICBbc3RvcmFnZUNvbXBhdE5hbWVdOiAnZmlyZS1nY3MtY29tcGF0JyxcbiAgW2ZpcmVzdG9yZU5hbWVdOiAnZmlyZS1mc3QnLFxuICBbZmlyZXN0b3JlQ29tcGF0TmFtZV06ICdmaXJlLWZzdC1jb21wYXQnLFxuICAnZmlyZS1qcyc6ICdmaXJlLWpzJywgLy8gUGxhdGZvcm0gaWRlbnRpZmllciBmb3IgSlMgU0RLLlxuICBbcGFja2FnZU5hbWVdOiAnZmlyZS1qcy1hbGwnXG59IGFzIGNvbnN0O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpcmViYXNlQXBwIH0gZnJvbSAnLi9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBQcm92aWRlciwgTmFtZSB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHsgREVGQVVMVF9FTlRSWV9OQU1FIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRmlyZWJhc2VBcHBJbXBsIH0gZnJvbSAnLi9maXJlYmFzZUFwcCc7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBfYXBwcyA9IG5ldyBNYXA8c3RyaW5nLCBGaXJlYmFzZUFwcD4oKTtcblxuLyoqXG4gKiBSZWdpc3RlcmVkIGNvbXBvbmVudHMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgY29uc3QgX2NvbXBvbmVudHMgPSBuZXcgTWFwPHN0cmluZywgQ29tcG9uZW50PGFueT4+KCk7XG5cbi8qKlxuICogQHBhcmFtIGNvbXBvbmVudCAtIHRoZSBjb21wb25lbnQgYmVpbmcgYWRkZWQgdG8gdGhpcyBhcHAncyBjb250YWluZXJcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hZGRDb21wb25lbnQ8VCBleHRlbmRzIE5hbWU+KFxuICBhcHA6IEZpcmViYXNlQXBwLFxuICBjb21wb25lbnQ6IENvbXBvbmVudDxUPlxuKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmNvbnRhaW5lci5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDb21wb25lbnQgJHtjb21wb25lbnQubmFtZX0gZmFpbGVkIHRvIHJlZ2lzdGVyIHdpdGggRmlyZWJhc2VBcHAgJHthcHAubmFtZX1gLFxuICAgICAgZVxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYWRkT3JPdmVyd3JpdGVDb21wb25lbnQoXG4gIGFwcDogRmlyZWJhc2VBcHAsXG4gIGNvbXBvbmVudDogQ29tcG9uZW50XG4pOiB2b2lkIHtcbiAgKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmNvbnRhaW5lci5hZGRPck92ZXJ3cml0ZUNvbXBvbmVudChjb21wb25lbnQpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gY29tcG9uZW50IC0gdGhlIGNvbXBvbmVudCB0byByZWdpc3RlclxuICogQHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbXBvbmVudCBpcyByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3JlZ2lzdGVyQ29tcG9uZW50PFQgZXh0ZW5kcyBOYW1lPihcbiAgY29tcG9uZW50OiBDb21wb25lbnQ8VD5cbik6IGJvb2xlYW4ge1xuICBjb25zdCBjb21wb25lbnROYW1lID0gY29tcG9uZW50Lm5hbWU7XG4gIGlmIChfY29tcG9uZW50cy5oYXMoY29tcG9uZW50TmFtZSkpIHtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgVGhlcmUgd2VyZSBtdWx0aXBsZSBhdHRlbXB0cyB0byByZWdpc3RlciBjb21wb25lbnQgJHtjb21wb25lbnROYW1lfS5gXG4gICAgKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIF9jb21wb25lbnRzLnNldChjb21wb25lbnROYW1lLCBjb21wb25lbnQpO1xuXG4gIC8vIGFkZCB0aGUgY29tcG9uZW50IHRvIGV4aXN0aW5nIGFwcCBpbnN0YW5jZXNcbiAgZm9yIChjb25zdCBhcHAgb2YgX2FwcHMudmFsdWVzKCkpIHtcbiAgICBfYWRkQ29tcG9uZW50KGFwcCBhcyBGaXJlYmFzZUFwcEltcGwsIGNvbXBvbmVudCk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIGFwcCAtIEZpcmViYXNlQXBwIGluc3RhbmNlXG4gKiBAcGFyYW0gbmFtZSAtIHNlcnZpY2UgbmFtZVxuICpcbiAqIEByZXR1cm5zIHRoZSBwcm92aWRlciBmb3IgdGhlIHNlcnZpY2Ugd2l0aCB0aGUgbWF0Y2hpbmcgbmFtZVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldFByb3ZpZGVyPFQgZXh0ZW5kcyBOYW1lPihcbiAgYXBwOiBGaXJlYmFzZUFwcCxcbiAgbmFtZTogVFxuKTogUHJvdmlkZXI8VD4ge1xuICBjb25zdCBoZWFydGJlYXRDb250cm9sbGVyID0gKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmNvbnRhaW5lclxuICAgIC5nZXRQcm92aWRlcignaGVhcnRiZWF0JylcbiAgICAuZ2V0SW1tZWRpYXRlKHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIGlmIChoZWFydGJlYXRDb250cm9sbGVyKSB7XG4gICAgdm9pZCBoZWFydGJlYXRDb250cm9sbGVyLnRyaWdnZXJIZWFydGJlYXQoKTtcbiAgfVxuICByZXR1cm4gKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmNvbnRhaW5lci5nZXRQcm92aWRlcihuYW1lKTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIGFwcCAtIEZpcmViYXNlQXBwIGluc3RhbmNlXG4gKiBAcGFyYW0gbmFtZSAtIHNlcnZpY2UgbmFtZVxuICogQHBhcmFtIGluc3RhbmNlSWRlbnRpZmllciAtIHNlcnZpY2UgaW5zdGFuY2UgaWRlbnRpZmllciBpbiBjYXNlIHRoZSBzZXJ2aWNlIHN1cHBvcnRzIG11bHRpcGxlIGluc3RhbmNlc1xuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX3JlbW92ZVNlcnZpY2VJbnN0YW5jZTxUIGV4dGVuZHMgTmFtZT4oXG4gIGFwcDogRmlyZWJhc2VBcHAsXG4gIG5hbWU6IFQsXG4gIGluc3RhbmNlSWRlbnRpZmllcjogc3RyaW5nID0gREVGQVVMVF9FTlRSWV9OQU1FXG4pOiB2b2lkIHtcbiAgX2dldFByb3ZpZGVyKGFwcCwgbmFtZSkuY2xlYXJJbnN0YW5jZShpbnN0YW5jZUlkZW50aWZpZXIpO1xufVxuXG4vKipcbiAqIFRlc3Qgb25seVxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gX2NsZWFyQ29tcG9uZW50cygpOiB2b2lkIHtcbiAgX2NvbXBvbmVudHMuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBFeHBvcnRlZCBpbiBvcmRlciB0byBiZSB1c2VkIGluIGFwcC1jb21wYXQgcGFja2FnZVxuICovXG5leHBvcnQgeyBERUZBVUxUX0VOVFJZX05BTUUgYXMgX0RFRkFVTFRfRU5UUllfTkFNRSB9O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEVycm9yRmFjdG9yeSwgRXJyb3JNYXAgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIEFwcEVycm9yIHtcbiAgTk9fQVBQID0gJ25vLWFwcCcsXG4gIEJBRF9BUFBfTkFNRSA9ICdiYWQtYXBwLW5hbWUnLFxuICBEVVBMSUNBVEVfQVBQID0gJ2R1cGxpY2F0ZS1hcHAnLFxuICBBUFBfREVMRVRFRCA9ICdhcHAtZGVsZXRlZCcsXG4gIE5PX09QVElPTlMgPSAnbm8tb3B0aW9ucycsXG4gIElOVkFMSURfQVBQX0FSR1VNRU5UID0gJ2ludmFsaWQtYXBwLWFyZ3VtZW50JyxcbiAgSU5WQUxJRF9MT0dfQVJHVU1FTlQgPSAnaW52YWxpZC1sb2ctYXJndW1lbnQnLFxuICBJREJfT1BFTiA9ICdpZGItb3BlbicsXG4gIElEQl9HRVQgPSAnaWRiLWdldCcsXG4gIElEQl9XUklURSA9ICdpZGItc2V0JyxcbiAgSURCX0RFTEVURSA9ICdpZGItZGVsZXRlJ1xufVxuXG5jb25zdCBFUlJPUlM6IEVycm9yTWFwPEFwcEVycm9yPiA9IHtcbiAgW0FwcEVycm9yLk5PX0FQUF06XG4gICAgXCJObyBGaXJlYmFzZSBBcHAgJ3skYXBwTmFtZX0nIGhhcyBiZWVuIGNyZWF0ZWQgLSBcIiArXG4gICAgJ2NhbGwgaW5pdGlhbGl6ZUFwcCgpIGZpcnN0JyxcbiAgW0FwcEVycm9yLkJBRF9BUFBfTkFNRV06IFwiSWxsZWdhbCBBcHAgbmFtZTogJ3skYXBwTmFtZX1cIixcbiAgW0FwcEVycm9yLkRVUExJQ0FURV9BUFBdOlxuICAgIFwiRmlyZWJhc2UgQXBwIG5hbWVkICd7JGFwcE5hbWV9JyBhbHJlYWR5IGV4aXN0cyB3aXRoIGRpZmZlcmVudCBvcHRpb25zIG9yIGNvbmZpZ1wiLFxuICBbQXBwRXJyb3IuQVBQX0RFTEVURURdOiBcIkZpcmViYXNlIEFwcCBuYW1lZCAneyRhcHBOYW1lfScgYWxyZWFkeSBkZWxldGVkXCIsXG4gIFtBcHBFcnJvci5OT19PUFRJT05TXTpcbiAgICAnTmVlZCB0byBwcm92aWRlIG9wdGlvbnMsIHdoZW4gbm90IGJlaW5nIGRlcGxveWVkIHRvIGhvc3RpbmcgdmlhIHNvdXJjZS4nLFxuICBbQXBwRXJyb3IuSU5WQUxJRF9BUFBfQVJHVU1FTlRdOlxuICAgICdmaXJlYmFzZS57JGFwcE5hbWV9KCkgdGFrZXMgZWl0aGVyIG5vIGFyZ3VtZW50IG9yIGEgJyArXG4gICAgJ0ZpcmViYXNlIEFwcCBpbnN0YW5jZS4nLFxuICBbQXBwRXJyb3IuSU5WQUxJRF9MT0dfQVJHVU1FTlRdOlxuICAgICdGaXJzdCBhcmd1bWVudCB0byBgb25Mb2dgIG11c3QgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLicsXG4gIFtBcHBFcnJvci5JREJfT1BFTl06XG4gICAgJ0Vycm9yIHRocm93biB3aGVuIG9wZW5pbmcgSW5kZXhlZERCLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcbiAgW0FwcEVycm9yLklEQl9HRVRdOlxuICAgICdFcnJvciB0aHJvd24gd2hlbiByZWFkaW5nIGZyb20gSW5kZXhlZERCLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcbiAgW0FwcEVycm9yLklEQl9XUklURV06XG4gICAgJ0Vycm9yIHRocm93biB3aGVuIHdyaXRpbmcgdG8gSW5kZXhlZERCLiBPcmlnaW5hbCBlcnJvcjogeyRvcmlnaW5hbEVycm9yTWVzc2FnZX0uJyxcbiAgW0FwcEVycm9yLklEQl9ERUxFVEVdOlxuICAgICdFcnJvciB0aHJvd24gd2hlbiBkZWxldGluZyBmcm9tIEluZGV4ZWREQi4gT3JpZ2luYWwgZXJyb3I6IHskb3JpZ2luYWxFcnJvck1lc3NhZ2V9Lidcbn07XG5cbmludGVyZmFjZSBFcnJvclBhcmFtcyB7XG4gIFtBcHBFcnJvci5OT19BUFBdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuQkFEX0FQUF9OQU1FXTogeyBhcHBOYW1lOiBzdHJpbmcgfTtcbiAgW0FwcEVycm9yLkRVUExJQ0FURV9BUFBdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuQVBQX0RFTEVURURdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuSU5WQUxJRF9BUFBfQVJHVU1FTlRdOiB7IGFwcE5hbWU6IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuSURCX09QRU5dOiB7IG9yaWdpbmFsRXJyb3JNZXNzYWdlPzogc3RyaW5nIH07XG4gIFtBcHBFcnJvci5JREJfR0VUXTogeyBvcmlnaW5hbEVycm9yTWVzc2FnZT86IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuSURCX1dSSVRFXTogeyBvcmlnaW5hbEVycm9yTWVzc2FnZT86IHN0cmluZyB9O1xuICBbQXBwRXJyb3IuSURCX0RFTEVURV06IHsgb3JpZ2luYWxFcnJvck1lc3NhZ2U/OiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGNvbnN0IEVSUk9SX0ZBQ1RPUlkgPSBuZXcgRXJyb3JGYWN0b3J5PEFwcEVycm9yLCBFcnJvclBhcmFtcz4oXG4gICdhcHAnLFxuICAnRmlyZWJhc2UnLFxuICBFUlJPUlNcbik7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRmlyZWJhc2VBcHAsXG4gIEZpcmViYXNlT3B0aW9ucyxcbiAgRmlyZWJhc2VBcHBTZXR0aW5nc1xufSBmcm9tICcuL3B1YmxpYy10eXBlcyc7XG5pbXBvcnQge1xuICBDb21wb25lbnRDb250YWluZXIsXG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50VHlwZVxufSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7IEVSUk9SX0ZBQ1RPUlksIEFwcEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5leHBvcnQgY2xhc3MgRmlyZWJhc2VBcHBJbXBsIGltcGxlbWVudHMgRmlyZWJhc2VBcHAge1xuICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBGaXJlYmFzZU9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgX25hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIE9yaWdpbmFsIGNvbmZpZyB2YWx1ZXMgcGFzc2VkIGluIGFzIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyLlxuICAgKiBJdCBpcyBvbmx5IHVzZWQgdG8gY29tcGFyZSB3aXRoIGFub3RoZXIgY29uZmlnIG9iamVjdCB0byBzdXBwb3J0IGlkZW1wb3RlbnQgaW5pdGlhbGl6ZUFwcCgpLlxuICAgKlxuICAgKiBVcGRhdGluZyBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQgb24gdGhlIEFwcCBpbnN0YW5jZSB3aWxsIG5vdCBjaGFuZ2UgaXRzIHZhbHVlIGluIF9jb25maWcuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb25maWc6IFJlcXVpcmVkPEZpcmViYXNlQXBwU2V0dGluZ3M+O1xuICBwcml2YXRlIF9hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2lzRGVsZXRlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvcHRpb25zOiBGaXJlYmFzZU9wdGlvbnMsXG4gICAgY29uZmlnOiBSZXF1aXJlZDxGaXJlYmFzZUFwcFNldHRpbmdzPixcbiAgICBjb250YWluZXI6IENvbXBvbmVudENvbnRhaW5lclxuICApIHtcbiAgICB0aGlzLl9vcHRpb25zID0geyAuLi5vcHRpb25zIH07XG4gICAgdGhpcy5fY29uZmlnID0geyAuLi5jb25maWcgfTtcbiAgICB0aGlzLl9uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkID1cbiAgICAgIGNvbmZpZy5hdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ7XG4gICAgdGhpcy5fY29udGFpbmVyID0gY29udGFpbmVyO1xuICAgIHRoaXMuY29udGFpbmVyLmFkZENvbXBvbmVudChcbiAgICAgIG5ldyBDb21wb25lbnQoJ2FwcCcsICgpID0+IHRoaXMsIENvbXBvbmVudFR5cGUuUFVCTElDKVxuICAgICk7XG4gIH1cblxuICBnZXQgYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkO1xuICB9XG5cbiAgc2V0IGF1dG9tYXRpY0RhdGFDb2xsZWN0aW9uRW5hYmxlZCh2YWw6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XG4gICAgdGhpcy5fYXV0b21hdGljRGF0YUNvbGxlY3Rpb25FbmFibGVkID0gdmFsO1xuICB9XG5cbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNoZWNrRGVzdHJveWVkKCk7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBnZXQgb3B0aW9ucygpOiBGaXJlYmFzZU9wdGlvbnMge1xuICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgfVxuXG4gIGdldCBjb25maWcoKTogUmVxdWlyZWQ8RmlyZWJhc2VBcHBTZXR0aW5ncz4ge1xuICAgIHRoaXMuY2hlY2tEZXN0cm95ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgZ2V0IGNvbnRhaW5lcigpOiBDb21wb25lbnRDb250YWluZXIge1xuICAgIHJldHVybiB0aGlzLl9jb250YWluZXI7XG4gIH1cblxuICBnZXQgaXNEZWxldGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc0RlbGV0ZWQ7XG4gIH1cblxuICBzZXQgaXNEZWxldGVkKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzRGVsZXRlZCA9IHZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgdGhyb3cgYW4gRXJyb3IgaWYgdGhlIEFwcCBoYXMgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgLVxuICAgKiB1c2UgYmVmb3JlIHBlcmZvcm1pbmcgQVBJIGFjdGlvbnMgb24gdGhlIEFwcC5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tEZXN0cm95ZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZWxldGVkKSB7XG4gICAgICB0aHJvdyBFUlJPUl9GQUNUT1JZLmNyZWF0ZShBcHBFcnJvci5BUFBfREVMRVRFRCwgeyBhcHBOYW1lOiB0aGlzLl9uYW1lIH0pO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEZpcmViYXNlQXBwLFxuICBGaXJlYmFzZU9wdGlvbnMsXG4gIEZpcmViYXNlQXBwU2V0dGluZ3Ncbn0gZnJvbSAnLi9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9FTlRSWV9OQU1FLCBQTEFURk9STV9MT0dfU1RSSU5HIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgRVJST1JfRkFDVE9SWSwgQXBwRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge1xuICBDb21wb25lbnRDb250YWluZXIsXG4gIENvbXBvbmVudCxcbiAgTmFtZSxcbiAgQ29tcG9uZW50VHlwZVxufSBmcm9tICdAZmlyZWJhc2UvY29tcG9uZW50JztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9maXJlYmFzZS9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgRmlyZWJhc2VBcHBJbXBsIH0gZnJvbSAnLi9maXJlYmFzZUFwcCc7XG5pbXBvcnQgeyBfYXBwcywgX2NvbXBvbmVudHMsIF9yZWdpc3RlckNvbXBvbmVudCB9IGZyb20gJy4vaW50ZXJuYWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IHtcbiAgTG9nTGV2ZWxTdHJpbmcsXG4gIHNldExvZ0xldmVsIGFzIHNldExvZ0xldmVsSW1wbCxcbiAgTG9nQ2FsbGJhY2ssXG4gIExvZ09wdGlvbnMsXG4gIHNldFVzZXJMb2dIYW5kbGVyXG59IGZyb20gJ0BmaXJlYmFzZS9sb2dnZXInO1xuaW1wb3J0IHsgZGVlcEVxdWFsLCBnZXREZWZhdWx0QXBwQ29uZmlnIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5leHBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IFNESyB2ZXJzaW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNES19WRVJTSU9OID0gdmVyc2lvbjtcblxuLyoqXG4gKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIHtAbGluayBAZmlyZWJhc2UvYXBwI0ZpcmViYXNlQXBwfSBpbnN0YW5jZS5cbiAqXG4gKiBTZWVcbiAqIHtAbGlua1xuICogICBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy93ZWIvc2V0dXAjYWRkX2ZpcmViYXNlX3RvX3lvdXJfYXBwXG4gKiAgIHwgQWRkIEZpcmViYXNlIHRvIHlvdXIgYXBwfSBhbmRcbiAqIHtAbGlua1xuICogICBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy93ZWIvc2V0dXAjbXVsdGlwbGUtcHJvamVjdHNcbiAqICAgfCBJbml0aWFsaXplIG11bHRpcGxlIHByb2plY3RzfSBmb3IgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICpcbiAqIC8vIEluaXRpYWxpemUgZGVmYXVsdCBhcHBcbiAqIC8vIFJldHJpZXZlIHlvdXIgb3duIG9wdGlvbnMgdmFsdWVzIGJ5IGFkZGluZyBhIHdlYiBhcHAgb25cbiAqIC8vIGh0dHBzOi8vY29uc29sZS5maXJlYmFzZS5nb29nbGUuY29tXG4gKiBpbml0aWFsaXplQXBwKHtcbiAqICAgYXBpS2V5OiBcIkFJemEuLi4uXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdXRoIC8gR2VuZXJhbCBVc2VcbiAqICAgYXV0aERvbWFpbjogXCJZT1VSX0FQUC5maXJlYmFzZWFwcC5jb21cIiwgICAgICAgICAvLyBBdXRoIHdpdGggcG9wdXAvcmVkaXJlY3RcbiAqICAgZGF0YWJhc2VVUkw6IFwiaHR0cHM6Ly9ZT1VSX0FQUC5maXJlYmFzZWlvLmNvbVwiLCAvLyBSZWFsdGltZSBEYXRhYmFzZVxuICogICBzdG9yYWdlQnVja2V0OiBcIllPVVJfQVBQLmFwcHNwb3QuY29tXCIsICAgICAgICAgIC8vIFN0b3JhZ2VcbiAqICAgbWVzc2FnaW5nU2VuZGVySWQ6IFwiMTIzNDU2Nzg5XCIgICAgICAgICAgICAgICAgICAvLyBDbG91ZCBNZXNzYWdpbmdcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqXG4gKiAvLyBJbml0aWFsaXplIGFub3RoZXIgYXBwXG4gKiBjb25zdCBvdGhlckFwcCA9IGluaXRpYWxpemVBcHAoe1xuICogICBkYXRhYmFzZVVSTDogXCJodHRwczovLzxPVEhFUl9EQVRBQkFTRV9OQU1FPi5maXJlYmFzZWlvLmNvbVwiLFxuICogICBzdG9yYWdlQnVja2V0OiBcIjxPVEhFUl9TVE9SQUdFX0JVQ0tFVD4uYXBwc3BvdC5jb21cIlxuICogfSwgXCJvdGhlckFwcFwiKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGFwcCdzIHNlcnZpY2VzLlxuICogQHBhcmFtIG5hbWUgLSBPcHRpb25hbCBuYW1lIG9mIHRoZSBhcHAgdG8gaW5pdGlhbGl6ZS4gSWYgbm8gbmFtZVxuICogICBpcyBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgYFwiW0RFRkFVTFRdXCJgLlxuICpcbiAqIEByZXR1cm5zIFRoZSBpbml0aWFsaXplZCBhcHAuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChcbiAgb3B0aW9uczogRmlyZWJhc2VPcHRpb25zLFxuICBuYW1lPzogc3RyaW5nXG4pOiBGaXJlYmFzZUFwcDtcbi8qKlxuICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBGaXJlYmFzZUFwcCBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBhcHAncyBzZXJ2aWNlcy5cbiAqIEBwYXJhbSBjb25maWcgLSBGaXJlYmFzZUFwcCBDb25maWd1cmF0aW9uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUFwcChcbiAgb3B0aW9uczogRmlyZWJhc2VPcHRpb25zLFxuICBjb25maWc/OiBGaXJlYmFzZUFwcFNldHRpbmdzXG4pOiBGaXJlYmFzZUFwcDtcbi8qKlxuICogQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBGaXJlYmFzZUFwcCBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXBwKCk6IEZpcmViYXNlQXBwO1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVBcHAoXG4gIF9vcHRpb25zPzogRmlyZWJhc2VPcHRpb25zLFxuICByYXdDb25maWcgPSB7fVxuKTogRmlyZWJhc2VBcHAge1xuICBsZXQgb3B0aW9ucyA9IF9vcHRpb25zO1xuXG4gIGlmICh0eXBlb2YgcmF3Q29uZmlnICE9PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IG5hbWUgPSByYXdDb25maWc7XG4gICAgcmF3Q29uZmlnID0geyBuYW1lIH07XG4gIH1cblxuICBjb25zdCBjb25maWc6IFJlcXVpcmVkPEZpcmViYXNlQXBwU2V0dGluZ3M+ID0ge1xuICAgIG5hbWU6IERFRkFVTFRfRU5UUllfTkFNRSxcbiAgICBhdXRvbWF0aWNEYXRhQ29sbGVjdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgIC4uLnJhd0NvbmZpZ1xuICB9O1xuICBjb25zdCBuYW1lID0gY29uZmlnLm5hbWU7XG5cbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCAhbmFtZSkge1xuICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLkJBRF9BUFBfTkFNRSwge1xuICAgICAgYXBwTmFtZTogU3RyaW5nKG5hbWUpXG4gICAgfSk7XG4gIH1cblxuICBvcHRpb25zIHx8PSBnZXREZWZhdWx0QXBwQ29uZmlnKCk7XG5cbiAgaWYgKCFvcHRpb25zKSB7XG4gICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuTk9fT1BUSU9OUyk7XG4gIH1cblxuICBjb25zdCBleGlzdGluZ0FwcCA9IF9hcHBzLmdldChuYW1lKSBhcyBGaXJlYmFzZUFwcEltcGw7XG4gIGlmIChleGlzdGluZ0FwcCkge1xuICAgIC8vIHJldHVybiB0aGUgZXhpc3RpbmcgYXBwIGlmIG9wdGlvbnMgYW5kIGNvbmZpZyBkZWVwIGVxdWFsIHRoZSBvbmVzIGluIHRoZSBleGlzdGluZyBhcHAuXG4gICAgaWYgKFxuICAgICAgZGVlcEVxdWFsKG9wdGlvbnMsIGV4aXN0aW5nQXBwLm9wdGlvbnMpICYmXG4gICAgICBkZWVwRXF1YWwoY29uZmlnLCBleGlzdGluZ0FwcC5jb25maWcpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdBcHA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLkRVUExJQ0FURV9BUFAsIHsgYXBwTmFtZTogbmFtZSB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb250YWluZXIgPSBuZXcgQ29tcG9uZW50Q29udGFpbmVyKG5hbWUpO1xuICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBfY29tcG9uZW50cy52YWx1ZXMoKSkge1xuICAgIGNvbnRhaW5lci5hZGRDb21wb25lbnQoY29tcG9uZW50KTtcbiAgfVxuXG4gIGNvbnN0IG5ld0FwcCA9IG5ldyBGaXJlYmFzZUFwcEltcGwob3B0aW9ucywgY29uZmlnLCBjb250YWluZXIpO1xuXG4gIF9hcHBzLnNldChuYW1lLCBuZXdBcHApO1xuXG4gIHJldHVybiBuZXdBcHA7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIGEge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9IGluc3RhbmNlLlxuICpcbiAqIFdoZW4gY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGUgZGVmYXVsdCBhcHAgaXMgcmV0dXJuZWQuIFdoZW4gYW4gYXBwIG5hbWVcbiAqIGlzIHByb3ZpZGVkLCB0aGUgYXBwIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBuYW1lIGlzIHJldHVybmVkLlxuICpcbiAqIEFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIGFwcCBiZWluZyByZXRyaWV2ZWQgaGFzIG5vdCB5ZXQgYmVlblxuICogaW5pdGlhbGl6ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFJldHVybiB0aGUgZGVmYXVsdCBhcHBcbiAqIGNvbnN0IGFwcCA9IGdldEFwcCgpO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFJldHVybiBhIG5hbWVkIGFwcFxuICogY29uc3Qgb3RoZXJBcHAgPSBnZXRBcHAoXCJvdGhlckFwcFwiKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBuYW1lIC0gT3B0aW9uYWwgbmFtZSBvZiB0aGUgYXBwIHRvIHJldHVybi4gSWYgbm8gbmFtZSBpc1xuICogICBwcm92aWRlZCwgdGhlIGRlZmF1bHQgaXMgYFwiW0RFRkFVTFRdXCJgLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhcHAgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQgYXBwIG5hbWUuXG4gKiAgIElmIG5vIGFwcCBuYW1lIGlzIHByb3ZpZGVkLCB0aGUgZGVmYXVsdCBhcHAgaXMgcmV0dXJuZWQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBwKG5hbWU6IHN0cmluZyA9IERFRkFVTFRfRU5UUllfTkFNRSk6IEZpcmViYXNlQXBwIHtcbiAgY29uc3QgYXBwID0gX2FwcHMuZ2V0KG5hbWUpO1xuICBpZiAoIWFwcCAmJiBuYW1lID09PSBERUZBVUxUX0VOVFJZX05BTUUgJiYgZ2V0RGVmYXVsdEFwcENvbmZpZygpKSB7XG4gICAgcmV0dXJuIGluaXRpYWxpemVBcHAoKTtcbiAgfVxuICBpZiAoIWFwcCkge1xuICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLk5PX0FQUCwgeyBhcHBOYW1lOiBuYW1lIH0pO1xuICB9XG5cbiAgcmV0dXJuIGFwcDtcbn1cblxuLyoqXG4gKiBBIChyZWFkLW9ubHkpIGFycmF5IG9mIGFsbCBpbml0aWFsaXplZCBhcHBzLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBwcygpOiBGaXJlYmFzZUFwcFtdIHtcbiAgcmV0dXJuIEFycmF5LmZyb20oX2FwcHMudmFsdWVzKCkpO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhpcyBhcHAgdW51c2FibGUgYW5kIGZyZWVzIHRoZSByZXNvdXJjZXMgb2YgYWxsIGFzc29jaWF0ZWRcbiAqIHNlcnZpY2VzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBkZWxldGVBcHAoYXBwKVxuICogICAudGhlbihmdW5jdGlvbigpIHtcbiAqICAgICBjb25zb2xlLmxvZyhcIkFwcCBkZWxldGVkIHN1Y2Nlc3NmdWxseVwiKTtcbiAqICAgfSlcbiAqICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJFcnJvciBkZWxldGluZyBhcHA6XCIsIGVycm9yKTtcbiAqICAgfSk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVBcHAoYXBwOiBGaXJlYmFzZUFwcCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBuYW1lID0gYXBwLm5hbWU7XG4gIGlmIChfYXBwcy5oYXMobmFtZSkpIHtcbiAgICBfYXBwcy5kZWxldGUobmFtZSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAoYXBwIGFzIEZpcmViYXNlQXBwSW1wbCkuY29udGFpbmVyXG4gICAgICAgIC5nZXRQcm92aWRlcnMoKVxuICAgICAgICAubWFwKHByb3ZpZGVyID0+IHByb3ZpZGVyLmRlbGV0ZSgpKVxuICAgICk7XG4gICAgKGFwcCBhcyBGaXJlYmFzZUFwcEltcGwpLmlzRGVsZXRlZCA9IHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgYSBsaWJyYXJ5J3MgbmFtZSBhbmQgdmVyc2lvbiBmb3IgcGxhdGZvcm0gbG9nZ2luZyBwdXJwb3Nlcy5cbiAqIEBwYXJhbSBsaWJyYXJ5IC0gTmFtZSBvZiAxcCBvciAzcCBsaWJyYXJ5IChlLmcuIGZpcmVzdG9yZSwgYW5ndWxhcmZpcmUpXG4gKiBAcGFyYW0gdmVyc2lvbiAtIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGF0IGxpYnJhcnkuXG4gKiBAcGFyYW0gdmFyaWFudCAtIEJ1bmRsZSB2YXJpYW50LCBlLmcuLCBub2RlLCBybiwgZXRjLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVmVyc2lvbihcbiAgbGlicmFyeUtleU9yTmFtZTogc3RyaW5nLFxuICB2ZXJzaW9uOiBzdHJpbmcsXG4gIHZhcmlhbnQ/OiBzdHJpbmdcbik6IHZvaWQge1xuICAvLyBUT0RPOiBXZSBjYW4gdXNlIHRoaXMgY2hlY2sgdG8gd2hpdGVsaXN0IHN0cmluZ3Mgd2hlbi9pZiB3ZSBzZXQgdXBcbiAgLy8gYSBnb29kIHdoaXRlbGlzdCBzeXN0ZW0uXG4gIGxldCBsaWJyYXJ5ID0gUExBVEZPUk1fTE9HX1NUUklOR1tsaWJyYXJ5S2V5T3JOYW1lXSA/PyBsaWJyYXJ5S2V5T3JOYW1lO1xuICBpZiAodmFyaWFudCkge1xuICAgIGxpYnJhcnkgKz0gYC0ke3ZhcmlhbnR9YDtcbiAgfVxuICBjb25zdCBsaWJyYXJ5TWlzbWF0Y2ggPSBsaWJyYXJ5Lm1hdGNoKC9cXHN8XFwvLyk7XG4gIGNvbnN0IHZlcnNpb25NaXNtYXRjaCA9IHZlcnNpb24ubWF0Y2goL1xcc3xcXC8vKTtcbiAgaWYgKGxpYnJhcnlNaXNtYXRjaCB8fCB2ZXJzaW9uTWlzbWF0Y2gpIHtcbiAgICBjb25zdCB3YXJuaW5nID0gW1xuICAgICAgYFVuYWJsZSB0byByZWdpc3RlciBsaWJyYXJ5IFwiJHtsaWJyYXJ5fVwiIHdpdGggdmVyc2lvbiBcIiR7dmVyc2lvbn1cIjpgXG4gICAgXTtcbiAgICBpZiAobGlicmFyeU1pc21hdGNoKSB7XG4gICAgICB3YXJuaW5nLnB1c2goXG4gICAgICAgIGBsaWJyYXJ5IG5hbWUgXCIke2xpYnJhcnl9XCIgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICh3aGl0ZXNwYWNlIG9yIFwiL1wiKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChsaWJyYXJ5TWlzbWF0Y2ggJiYgdmVyc2lvbk1pc21hdGNoKSB7XG4gICAgICB3YXJuaW5nLnB1c2goJ2FuZCcpO1xuICAgIH1cbiAgICBpZiAodmVyc2lvbk1pc21hdGNoKSB7XG4gICAgICB3YXJuaW5nLnB1c2goXG4gICAgICAgIGB2ZXJzaW9uIG5hbWUgXCIke3ZlcnNpb259XCIgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzICh3aGl0ZXNwYWNlIG9yIFwiL1wiKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKHdhcm5pbmcuam9pbignICcpKTtcbiAgICByZXR1cm47XG4gIH1cbiAgX3JlZ2lzdGVyQ29tcG9uZW50KFxuICAgIG5ldyBDb21wb25lbnQoXG4gICAgICBgJHtsaWJyYXJ5fS12ZXJzaW9uYCBhcyBOYW1lLFxuICAgICAgKCkgPT4gKHsgbGlicmFyeSwgdmVyc2lvbiB9KSxcbiAgICAgIENvbXBvbmVudFR5cGUuVkVSU0lPTlxuICAgIClcbiAgKTtcbn1cblxuLyoqXG4gKiBTZXRzIGxvZyBoYW5kbGVyIGZvciBhbGwgRmlyZWJhc2UgU0RLcy5cbiAqIEBwYXJhbSBsb2dDYWxsYmFjayAtIEFuIG9wdGlvbmFsIGN1c3RvbSBsb2cgaGFuZGxlciB0aGF0IGV4ZWN1dGVzIHVzZXIgY29kZSB3aGVuZXZlclxuICogdGhlIEZpcmViYXNlIFNESyBtYWtlcyBhIGxvZ2dpbmcgY2FsbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkxvZyhcbiAgbG9nQ2FsbGJhY2s6IExvZ0NhbGxiYWNrIHwgbnVsbCxcbiAgb3B0aW9ucz86IExvZ09wdGlvbnNcbik6IHZvaWQge1xuICBpZiAobG9nQ2FsbGJhY2sgIT09IG51bGwgJiYgdHlwZW9mIGxvZ0NhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgRVJST1JfRkFDVE9SWS5jcmVhdGUoQXBwRXJyb3IuSU5WQUxJRF9MT0dfQVJHVU1FTlQpO1xuICB9XG4gIHNldFVzZXJMb2dIYW5kbGVyKGxvZ0NhbGxiYWNrLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBTZXRzIGxvZyBsZXZlbCBmb3IgYWxsIEZpcmViYXNlIFNES3MuXG4gKlxuICogQWxsIG9mIHRoZSBsb2cgdHlwZXMgYWJvdmUgdGhlIGN1cnJlbnQgbG9nIGxldmVsIGFyZSBjYXB0dXJlZCAoaS5lLiBpZlxuICogeW91IHNldCB0aGUgbG9nIGxldmVsIHRvIGBpbmZvYCwgZXJyb3JzIGFyZSBsb2dnZWQsIGJ1dCBgZGVidWdgIGFuZFxuICogYHZlcmJvc2VgIGxvZ3MgYXJlIG5vdCkuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TG9nTGV2ZWwobG9nTGV2ZWw6IExvZ0xldmVsU3RyaW5nKTogdm9pZCB7XG4gIHNldExvZ0xldmVsSW1wbChsb2dMZXZlbCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IERCU2NoZW1hLCBvcGVuREIsIElEQlBEYXRhYmFzZSB9IGZyb20gJ2lkYic7XG5pbXBvcnQgeyBBcHBFcnJvciwgRVJST1JfRkFDVE9SWSB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IEZpcmViYXNlQXBwIH0gZnJvbSAnLi9wdWJsaWMtdHlwZXMnO1xuaW1wb3J0IHsgSGVhcnRiZWF0c0luSW5kZXhlZERCIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbmNvbnN0IERCX05BTUUgPSAnZmlyZWJhc2UtaGVhcnRiZWF0LWRhdGFiYXNlJztcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuY29uc3QgU1RPUkVfTkFNRSA9ICdmaXJlYmFzZS1oZWFydGJlYXQtc3RvcmUnO1xuXG5pbnRlcmZhY2UgQXBwREIgZXh0ZW5kcyBEQlNjaGVtYSB7XG4gICdmaXJlYmFzZS1oZWFydGJlYXQtc3RvcmUnOiB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdmFsdWU6IEhlYXJ0YmVhdHNJbkluZGV4ZWREQjtcbiAgfTtcbn1cblxubGV0IGRiUHJvbWlzZTogUHJvbWlzZTxJREJQRGF0YWJhc2U8QXBwREI+PiB8IG51bGwgPSBudWxsO1xuZnVuY3Rpb24gZ2V0RGJQcm9taXNlKCk6IFByb21pc2U8SURCUERhdGFiYXNlPEFwcERCPj4ge1xuICBpZiAoIWRiUHJvbWlzZSkge1xuICAgIGRiUHJvbWlzZSA9IG9wZW5EQjxBcHBEQj4oREJfTkFNRSwgREJfVkVSU0lPTiwge1xuICAgICAgdXBncmFkZTogKGRiLCBvbGRWZXJzaW9uKSA9PiB7XG4gICAgICAgIC8vIFdlIGRvbid0IHVzZSAnYnJlYWsnIGluIHRoaXMgc3dpdGNoIHN0YXRlbWVudCwgdGhlIGZhbGwtdGhyb3VnaFxuICAgICAgICAvLyBiZWhhdmlvciBpcyB3aGF0IHdlIHdhbnQsIGJlY2F1c2UgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHZlcnNpb25zIGJldHdlZW5cbiAgICAgICAgLy8gdGhlIG9sZCB2ZXJzaW9uIGFuZCB0aGUgY3VycmVudCB2ZXJzaW9uLCB3ZSB3YW50IEFMTCB0aGUgbWlncmF0aW9uc1xuICAgICAgICAvLyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhvc2UgdmVyc2lvbnMgdG8gcnVuLCBub3Qgb25seSB0aGUgbGFzdCBvbmUuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZWZhdWx0LWNhc2VcbiAgICAgICAgc3dpdGNoIChvbGRWZXJzaW9uKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU1RPUkVfTkFNRSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgIHRocm93IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLklEQl9PUEVOLCB7XG4gICAgICAgIG9yaWdpbmFsRXJyb3JNZXNzYWdlOiBlLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBkYlByb21pc2U7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIoXG4gIGFwcDogRmlyZWJhc2VBcHBcbik6IFByb21pc2U8SGVhcnRiZWF0c0luSW5kZXhlZERCIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGIgPSBhd2FpdCBnZXREYlByb21pc2UoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkYlxuICAgICAgLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUpXG4gICAgICAub2JqZWN0U3RvcmUoU1RPUkVfTkFNRSlcbiAgICAgIC5nZXQoY29tcHV0ZUtleShhcHApKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpZGJHZXRFcnJvciA9IEVSUk9SX0ZBQ1RPUlkuY3JlYXRlKEFwcEVycm9yLklEQl9HRVQsIHtcbiAgICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IChlIGFzIEVycm9yKT8ubWVzc2FnZVxuICAgICAgfSk7XG4gICAgICBsb2dnZXIud2FybihpZGJHZXRFcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKFxuICBhcHA6IEZpcmViYXNlQXBwLFxuICBoZWFydGJlYXRPYmplY3Q6IEhlYXJ0YmVhdHNJbkluZGV4ZWREQlxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGIgPSBhd2FpdCBnZXREYlByb21pc2UoKTtcbiAgICBjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKFNUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICBjb25zdCBvYmplY3RTdG9yZSA9IHR4Lm9iamVjdFN0b3JlKFNUT1JFX05BTUUpO1xuICAgIGF3YWl0IG9iamVjdFN0b3JlLnB1dChoZWFydGJlYXRPYmplY3QsIGNvbXB1dGVLZXkoYXBwKSk7XG4gICAgYXdhaXQgdHguZG9uZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oZS5tZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaWRiR2V0RXJyb3IgPSBFUlJPUl9GQUNUT1JZLmNyZWF0ZShBcHBFcnJvci5JREJfV1JJVEUsIHtcbiAgICAgICAgb3JpZ2luYWxFcnJvck1lc3NhZ2U6IChlIGFzIEVycm9yKT8ubWVzc2FnZVxuICAgICAgfSk7XG4gICAgICBsb2dnZXIud2FybihpZGJHZXRFcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29tcHV0ZUtleShhcHA6IEZpcmViYXNlQXBwKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2FwcC5uYW1lfSEke2FwcC5vcHRpb25zLmFwcElkfWA7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50Q29udGFpbmVyIH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQge1xuICBiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyxcbiAgaXNJbmRleGVkREJBdmFpbGFibGUsXG4gIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGVcbn0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHtcbiAgcmVhZEhlYXJ0YmVhdHNGcm9tSW5kZXhlZERCLFxuICB3cml0ZUhlYXJ0YmVhdHNUb0luZGV4ZWREQlxufSBmcm9tICcuL2luZGV4ZWRkYic7XG5pbXBvcnQgeyBGaXJlYmFzZUFwcCB9IGZyb20gJy4vcHVibGljLXR5cGVzJztcbmltcG9ydCB7XG4gIEhlYXJ0YmVhdHNCeVVzZXJBZ2VudCxcbiAgSGVhcnRiZWF0U2VydmljZSxcbiAgSGVhcnRiZWF0c0luSW5kZXhlZERCLFxuICBIZWFydGJlYXRTdG9yYWdlLFxuICBTaW5nbGVEYXRlSGVhcnRiZWF0XG59IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBNQVhfSEVBREVSX0JZVEVTID0gMTAyNDtcbi8vIDMwIGRheXNcbmNvbnN0IFNUT1JFRF9IRUFSVEJFQVRfUkVURU5USU9OX01BWF9NSUxMSVMgPSAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbmV4cG9ydCBjbGFzcyBIZWFydGJlYXRTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEhlYXJ0YmVhdFNlcnZpY2Uge1xuICAvKipcbiAgICogVGhlIHBlcnNpc3RlbmNlIGxheWVyIGZvciBoZWFydGJlYXRzXG4gICAqIExlYXZlIHB1YmxpYyBmb3IgZWFzaWVyIHRlc3RpbmcuXG4gICAqL1xuICBfc3RvcmFnZTogSGVhcnRiZWF0U3RvcmFnZUltcGw7XG5cbiAgLyoqXG4gICAqIEluLW1lbW9yeSBjYWNoZSBmb3IgaGVhcnRiZWF0cywgdXNlZCBieSBnZXRIZWFydGJlYXRzSGVhZGVyKCkgdG8gZ2VuZXJhdGVcbiAgICogdGhlIGhlYWRlciBzdHJpbmcuXG4gICAqIFN0b3JlcyBvbmUgcmVjb3JkIHBlciBkYXRlLiBUaGlzIHdpbGwgYmUgY29uc29saWRhdGVkIGludG8gdGhlIHN0YW5kYXJkXG4gICAqIGZvcm1hdCBvZiBvbmUgcmVjb3JkIHBlciB1c2VyIGFnZW50IHN0cmluZyBiZWZvcmUgYmVpbmcgc2VudCBhcyBhIGhlYWRlci5cbiAgICogUG9wdWxhdGVkIGZyb20gaW5kZXhlZERCIHdoZW4gdGhlIGNvbnRyb2xsZXIgaXMgaW5zdGFudGlhdGVkIGFuZCBzaG91bGRcbiAgICogYmUga2VwdCBpbiBzeW5jIHdpdGggaW5kZXhlZERCLlxuICAgKiBMZWF2ZSBwdWJsaWMgZm9yIGVhc2llciB0ZXN0aW5nLlxuICAgKi9cbiAgX2hlYXJ0YmVhdHNDYWNoZTogSGVhcnRiZWF0c0luSW5kZXhlZERCIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHRoZSBpbml0aWFsaXphdGlvbiBwcm9taXNlIGZvciBwb3B1bGF0aW5nIGhlYXJ0YmVhdENhY2hlLlxuICAgKiBJZiBnZXRIZWFydGJlYXRzSGVhZGVyKCkgaXMgY2FsbGVkIGJlZm9yZSB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgKiAoaGVhcmJlYXRzQ2FjaGUgPT0gbnVsbCksIGl0IHNob3VsZCB3YWl0IGZvciB0aGlzIHByb21pc2VcbiAgICogTGVhdmUgcHVibGljIGZvciBlYXNpZXIgdGVzdGluZy5cbiAgICovXG4gIF9oZWFydGJlYXRzQ2FjaGVQcm9taXNlOiBQcm9taXNlPEhlYXJ0YmVhdHNJbkluZGV4ZWREQj47XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgY29udGFpbmVyOiBDb21wb25lbnRDb250YWluZXIpIHtcbiAgICBjb25zdCBhcHAgPSB0aGlzLmNvbnRhaW5lci5nZXRQcm92aWRlcignYXBwJykuZ2V0SW1tZWRpYXRlKCk7XG4gICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBIZWFydGJlYXRTdG9yYWdlSW1wbChhcHApO1xuICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZVByb21pc2UgPSB0aGlzLl9zdG9yYWdlLnJlYWQoKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPSByZXN1bHQ7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB0byByZXBvcnQgYSBoZWFydGJlYXQuIFRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlXG4gICAqIGEgSGVhcnRiZWF0c0J5VXNlckFnZW50IG9iamVjdCwgdXBkYXRlIGhlYXJ0YmVhdHNDYWNoZSwgYW5kIHBlcnNpc3QgaXRcbiAgICogdG8gSW5kZXhlZERCLlxuICAgKiBOb3RlIHRoYXQgd2Ugb25seSBzdG9yZSBvbmUgaGVhcnRiZWF0IHBlciBkYXkuIFNvIGlmIGEgaGVhcnRiZWF0IGZvciB0b2RheSBpc1xuICAgKiBhbHJlYWR5IGxvZ2dlZCwgc3Vic2VxdWVudCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGluIHRoZSBzYW1lIGRheSB3aWxsIGJlIGlnbm9yZWQuXG4gICAqL1xuICBhc3luYyB0cmlnZ2VySGVhcnRiZWF0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBsYXRmb3JtTG9nZ2VyID0gdGhpcy5jb250YWluZXJcbiAgICAgIC5nZXRQcm92aWRlcigncGxhdGZvcm0tbG9nZ2VyJylcbiAgICAgIC5nZXRJbW1lZGlhdGUoKTtcblxuICAgIC8vIFRoaXMgaXMgdGhlIFwiRmlyZWJhc2UgdXNlciBhZ2VudFwiIHN0cmluZyBmcm9tIHRoZSBwbGF0Zm9ybSBsb2dnZXJcbiAgICAvLyBzZXJ2aWNlLCBub3QgdGhlIGJyb3dzZXIgdXNlciBhZ2VudC5cbiAgICBjb25zdCBhZ2VudCA9IHBsYXRmb3JtTG9nZ2VyLmdldFBsYXRmb3JtSW5mb1N0cmluZygpO1xuICAgIGNvbnN0IGRhdGUgPSBnZXRVVENEYXRlU3RyaW5nKCk7XG4gICAgaWYgKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlID0gYXdhaXQgdGhpcy5faGVhcnRiZWF0c0NhY2hlUHJvbWlzZTtcbiAgICB9XG4gICAgLy8gRG8gbm90IHN0b3JlIGEgaGVhcnRiZWF0IGlmIG9uZSBpcyBhbHJlYWR5IHN0b3JlZCBmb3IgdGhpcyBkYXlcbiAgICAvLyBvciBpZiBhIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIHNlbnQgdG9kYXkuXG4gICAgaWYgKFxuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA9PT0gZGF0ZSB8fFxuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMuc29tZShcbiAgICAgICAgc2luZ2xlRGF0ZUhlYXJ0YmVhdCA9PiBzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGUgPT09IGRhdGVcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVGhlcmUgaXMgbm8gZW50cnkgZm9yIHRoaXMgZGF0ZS4gQ3JlYXRlIG9uZS5cbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzLnB1c2goeyBkYXRlLCBhZ2VudCB9KTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGVudHJpZXMgb2xkZXIgdGhhbiAzMCBkYXlzLlxuICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzID0gdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMuZmlsdGVyKFxuICAgICAgc2luZ2xlRGF0ZUhlYXJ0YmVhdCA9PiB7XG4gICAgICAgIGNvbnN0IGhiVGltZXN0YW1wID0gbmV3IERhdGUoc2luZ2xlRGF0ZUhlYXJ0YmVhdC5kYXRlKS52YWx1ZU9mKCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIHJldHVybiBub3cgLSBoYlRpbWVzdGFtcCA8PSBTVE9SRURfSEVBUlRCRUFUX1JFVEVOVElPTl9NQVhfTUlMTElTO1xuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZyB3aGljaCBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlIGhlYXJ0YmVhdC1zcGVjaWZpYyBoZWFkZXIgZGlyZWN0bHkuXG4gICAqIEl0IGFsc28gY2xlYXJzIGFsbCBoZWFydGJlYXRzIGZyb20gbWVtb3J5IGFzIHdlbGwgYXMgaW4gSW5kZXhlZERCLlxuICAgKlxuICAgKiBOT1RFOiBDb25zdW1pbmcgcHJvZHVjdCBTREtzIHNob3VsZCBub3Qgc2VuZCB0aGUgaGVhZGVyIGlmIHRoaXMgbWV0aG9kXG4gICAqIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgZ2V0SGVhcnRiZWF0c0hlYWRlcigpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPT09IG51bGwpIHtcbiAgICAgIGF3YWl0IHRoaXMuX2hlYXJ0YmVhdHNDYWNoZVByb21pc2U7XG4gICAgfVxuICAgIC8vIElmIGl0J3Mgc3RpbGwgbnVsbCBvciB0aGUgYXJyYXkgaXMgZW1wdHksIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2VuZC5cbiAgICBpZiAoXG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUgPT09IG51bGwgfHxcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gZ2V0VVRDRGF0ZVN0cmluZygpO1xuICAgIC8vIEV4dHJhY3QgYXMgbWFueSBoZWFydGJlYXRzIGZyb20gdGhlIGNhY2hlIGFzIHdpbGwgZml0IHVuZGVyIHRoZSBzaXplIGxpbWl0LlxuICAgIGNvbnN0IHsgaGVhcnRiZWF0c1RvU2VuZCwgdW5zZW50RW50cmllcyB9ID0gZXh0cmFjdEhlYXJ0YmVhdHNGb3JIZWFkZXIoXG4gICAgICB0aGlzLl9oZWFydGJlYXRzQ2FjaGUuaGVhcnRiZWF0c1xuICAgICk7XG4gICAgY29uc3QgaGVhZGVyU3RyaW5nID0gYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IHZlcnNpb246IDIsIGhlYXJ0YmVhdHM6IGhlYXJ0YmVhdHNUb1NlbmQgfSlcbiAgICApO1xuICAgIC8vIFN0b3JlIGxhc3Qgc2VudCBkYXRlIHRvIHByZXZlbnQgYW5vdGhlciBiZWluZyBsb2dnZWQvc2VudCBmb3IgdGhlIHNhbWUgZGF5LlxuICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5sYXN0U2VudEhlYXJ0YmVhdERhdGUgPSBkYXRlO1xuICAgIGlmICh1bnNlbnRFbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIFN0b3JlIGFueSB1bnNlbnQgZW50cmllcyBpZiB0aGV5IGV4aXN0LlxuICAgICAgdGhpcy5faGVhcnRiZWF0c0NhY2hlLmhlYXJ0YmVhdHMgPSB1bnNlbnRFbnRyaWVzO1xuICAgICAgLy8gVGhpcyBzZWVtcyBtb3JlIGxpa2VseSB0aGFuIGVtcHR5aW5nIHRoZSBhcnJheSAoYmVsb3cpIHRvIGxlYWQgdG8gc29tZSBvZGQgc3RhdGVcbiAgICAgIC8vIHNpbmNlIHRoZSBjYWNoZSBpc24ndCBlbXB0eSBhbmQgdGhpcyB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBvbiB0aGUgbmV4dCByZXF1ZXN0LFxuICAgICAgLy8gYW5kIGlzIHByb2JhYmx5IHNhZmVzdCBpZiB3ZSBhd2FpdCBpdC5cbiAgICAgIGF3YWl0IHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdHNDYWNoZS5oZWFydGJlYXRzID0gW107XG4gICAgICAvLyBEbyBub3Qgd2FpdCBmb3IgdGhpcywgdG8gcmVkdWNlIGxhdGVuY3kuXG4gICAgICB2b2lkIHRoaXMuX3N0b3JhZ2Uub3ZlcndyaXRlKHRoaXMuX2hlYXJ0YmVhdHNDYWNoZSk7XG4gICAgfVxuICAgIHJldHVybiBoZWFkZXJTdHJpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VVRDRGF0ZVN0cmluZygpOiBzdHJpbmcge1xuICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gIC8vIFJldHVybnMgZGF0ZSBmb3JtYXQgJ1lZWVktTU0tREQnXG4gIHJldHVybiB0b2RheS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SGVhcnRiZWF0c0ZvckhlYWRlcihcbiAgaGVhcnRiZWF0c0NhY2hlOiBTaW5nbGVEYXRlSGVhcnRiZWF0W10sXG4gIG1heFNpemUgPSBNQVhfSEVBREVSX0JZVEVTXG4pOiB7XG4gIGhlYXJ0YmVhdHNUb1NlbmQ6IEhlYXJ0YmVhdHNCeVVzZXJBZ2VudFtdO1xuICB1bnNlbnRFbnRyaWVzOiBTaW5nbGVEYXRlSGVhcnRiZWF0W107XG59IHtcbiAgLy8gSGVhcnRiZWF0cyBncm91cGVkIGJ5IHVzZXIgYWdlbnQgaW4gdGhlIHN0YW5kYXJkIGZvcm1hdCB0byBiZSBzZW50IGluXG4gIC8vIHRoZSBoZWFkZXIuXG4gIGNvbnN0IGhlYXJ0YmVhdHNUb1NlbmQ6IEhlYXJ0YmVhdHNCeVVzZXJBZ2VudFtdID0gW107XG4gIC8vIFNpbmdsZSBkYXRlIGZvcm1hdCBoZWFydGJlYXRzIHRoYXQgYXJlIG5vdCBzZW50LlxuICBsZXQgdW5zZW50RW50cmllcyA9IGhlYXJ0YmVhdHNDYWNoZS5zbGljZSgpO1xuICBmb3IgKGNvbnN0IHNpbmdsZURhdGVIZWFydGJlYXQgb2YgaGVhcnRiZWF0c0NhY2hlKSB7XG4gICAgLy8gTG9vayBmb3IgYW4gZXhpc3RpbmcgZW50cnkgd2l0aCB0aGUgc2FtZSB1c2VyIGFnZW50LlxuICAgIGNvbnN0IGhlYXJ0YmVhdEVudHJ5ID0gaGVhcnRiZWF0c1RvU2VuZC5maW5kKFxuICAgICAgaGIgPT4gaGIuYWdlbnQgPT09IHNpbmdsZURhdGVIZWFydGJlYXQuYWdlbnRcbiAgICApO1xuICAgIGlmICghaGVhcnRiZWF0RW50cnkpIHtcbiAgICAgIC8vIElmIG5vIGVudHJ5IGZvciB0aGlzIHVzZXIgYWdlbnQgZXhpc3RzLCBjcmVhdGUgb25lLlxuICAgICAgaGVhcnRiZWF0c1RvU2VuZC5wdXNoKHtcbiAgICAgICAgYWdlbnQ6IHNpbmdsZURhdGVIZWFydGJlYXQuYWdlbnQsXG4gICAgICAgIGRhdGVzOiBbc2luZ2xlRGF0ZUhlYXJ0YmVhdC5kYXRlXVxuICAgICAgfSk7XG4gICAgICBpZiAoY291bnRCeXRlcyhoZWFydGJlYXRzVG9TZW5kKSA+IG1heFNpemUpIHtcbiAgICAgICAgLy8gSWYgdGhlIGhlYWRlciB3b3VsZCBleGNlZWQgbWF4IHNpemUsIHJlbW92ZSB0aGUgYWRkZWQgaGVhcnRiZWF0XG4gICAgICAgIC8vIGVudHJ5IGFuZCBzdG9wIGFkZGluZyB0byB0aGUgaGVhZGVyLlxuICAgICAgICBoZWFydGJlYXRzVG9TZW5kLnBvcCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaGVhcnRiZWF0RW50cnkuZGF0ZXMucHVzaChzaW5nbGVEYXRlSGVhcnRiZWF0LmRhdGUpO1xuICAgICAgLy8gSWYgdGhlIGhlYWRlciB3b3VsZCBleGNlZWQgbWF4IHNpemUsIHJlbW92ZSB0aGUgYWRkZWQgZGF0ZVxuICAgICAgLy8gYW5kIHN0b3AgYWRkaW5nIHRvIHRoZSBoZWFkZXIuXG4gICAgICBpZiAoY291bnRCeXRlcyhoZWFydGJlYXRzVG9TZW5kKSA+IG1heFNpemUpIHtcbiAgICAgICAgaGVhcnRiZWF0RW50cnkuZGF0ZXMucG9wKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBQb3AgdW5zZW50IGVudHJ5IGZyb20gcXVldWUuIChTa2lwcGVkIGlmIGFkZGluZyB0aGUgZW50cnkgZXhjZWVkZWRcbiAgICAvLyBxdW90YSBhbmQgdGhlIGxvb3AgYnJlYWtzIGVhcmx5LilcbiAgICB1bnNlbnRFbnRyaWVzID0gdW5zZW50RW50cmllcy5zbGljZSgxKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGhlYXJ0YmVhdHNUb1NlbmQsXG4gICAgdW5zZW50RW50cmllc1xuICB9O1xufVxuXG5leHBvcnQgY2xhc3MgSGVhcnRiZWF0U3RvcmFnZUltcGwgaW1wbGVtZW50cyBIZWFydGJlYXRTdG9yYWdlIHtcbiAgcHJpdmF0ZSBfY2FuVXNlSW5kZXhlZERCUHJvbWlzZTogUHJvbWlzZTxib29sZWFuPjtcbiAgY29uc3RydWN0b3IocHVibGljIGFwcDogRmlyZWJhc2VBcHApIHtcbiAgICB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlID0gdGhpcy5ydW5JbmRleGVkREJFbnZpcm9ubWVudENoZWNrKCk7XG4gIH1cbiAgYXN5bmMgcnVuSW5kZXhlZERCRW52aXJvbm1lbnRDaGVjaygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIWlzSW5kZXhlZERCQXZhaWxhYmxlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUoKVxuICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAuY2F0Y2goKCkgPT4gZmFsc2UpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogUmVhZCBhbGwgaGVhcnRiZWF0cy5cbiAgICovXG4gIGFzeW5jIHJlYWQoKTogUHJvbWlzZTxIZWFydGJlYXRzSW5JbmRleGVkREI+IHtcbiAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xuICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XG4gICAgICByZXR1cm4geyBoZWFydGJlYXRzOiBbXSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpZGJIZWFydGJlYXRPYmplY3QgPSBhd2FpdCByZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIodGhpcy5hcHApO1xuICAgICAgcmV0dXJuIGlkYkhlYXJ0YmVhdE9iamVjdCB8fCB7IGhlYXJ0YmVhdHM6IFtdIH07XG4gICAgfVxuICB9XG4gIC8vIG92ZXJ3cml0ZSB0aGUgc3RvcmFnZSB3aXRoIHRoZSBwcm92aWRlZCBoZWFydGJlYXRzXG4gIGFzeW5jIG92ZXJ3cml0ZShoZWFydGJlYXRzT2JqZWN0OiBIZWFydGJlYXRzSW5JbmRleGVkREIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xuICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdCA9IGF3YWl0IHRoaXMucmVhZCgpO1xuICAgICAgcmV0dXJuIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKHRoaXMuYXBwLCB7XG4gICAgICAgIGxhc3RTZW50SGVhcnRiZWF0RGF0ZTpcbiAgICAgICAgICBoZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA/P1xuICAgICAgICAgIGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdC5sYXN0U2VudEhlYXJ0YmVhdERhdGUsXG4gICAgICAgIGhlYXJ0YmVhdHM6IGhlYXJ0YmVhdHNPYmplY3QuaGVhcnRiZWF0c1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIGFkZCBoZWFydGJlYXRzXG4gIGFzeW5jIGFkZChoZWFydGJlYXRzT2JqZWN0OiBIZWFydGJlYXRzSW5JbmRleGVkREIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjYW5Vc2VJbmRleGVkREIgPSBhd2FpdCB0aGlzLl9jYW5Vc2VJbmRleGVkREJQcm9taXNlO1xuICAgIGlmICghY2FuVXNlSW5kZXhlZERCKSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdCA9IGF3YWl0IHRoaXMucmVhZCgpO1xuICAgICAgcmV0dXJuIHdyaXRlSGVhcnRiZWF0c1RvSW5kZXhlZERCKHRoaXMuYXBwLCB7XG4gICAgICAgIGxhc3RTZW50SGVhcnRiZWF0RGF0ZTpcbiAgICAgICAgICBoZWFydGJlYXRzT2JqZWN0Lmxhc3RTZW50SGVhcnRiZWF0RGF0ZSA/P1xuICAgICAgICAgIGV4aXN0aW5nSGVhcnRiZWF0c09iamVjdC5sYXN0U2VudEhlYXJ0YmVhdERhdGUsXG4gICAgICAgIGhlYXJ0YmVhdHM6IFtcbiAgICAgICAgICAuLi5leGlzdGluZ0hlYXJ0YmVhdHNPYmplY3QuaGVhcnRiZWF0cyxcbiAgICAgICAgICAuLi5oZWFydGJlYXRzT2JqZWN0LmhlYXJ0YmVhdHNcbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGJ5dGVzIG9mIGEgSGVhcnRiZWF0c0J5VXNlckFnZW50IGFycmF5IGFmdGVyIGJlaW5nIHdyYXBwZWRcbiAqIGluIGEgcGxhdGZvcm0gbG9nZ2luZyBoZWFkZXIgSlNPTiBvYmplY3QsIHN0cmluZ2lmaWVkLCBhbmQgY29udmVydGVkXG4gKiB0byBiYXNlIDY0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY291bnRCeXRlcyhoZWFydGJlYXRzQ2FjaGU6IEhlYXJ0YmVhdHNCeVVzZXJBZ2VudFtdKTogbnVtYmVyIHtcbiAgLy8gYmFzZTY0IGhhcyBhIHJlc3RyaWN0ZWQgc2V0IG9mIGNoYXJhY3RlcnMsIGFsbCBvZiB3aGljaCBzaG91bGQgYmUgMSBieXRlLlxuICByZXR1cm4gYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmcoXG4gICAgLy8gaGVhcnRiZWF0c0NhY2hlIHdyYXBwZXIgcHJvcGVydGllc1xuICAgIEpTT04uc3RyaW5naWZ5KHsgdmVyc2lvbjogMiwgaGVhcnRiZWF0czogaGVhcnRiZWF0c0NhY2hlIH0pXG4gICkubGVuZ3RoO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgQ29tcG9uZW50VHlwZSB9IGZyb20gJ0BmaXJlYmFzZS9jb21wb25lbnQnO1xuaW1wb3J0IHsgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vcGxhdGZvcm1Mb2dnZXJTZXJ2aWNlJztcbmltcG9ydCB7IG5hbWUsIHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgX3JlZ2lzdGVyQ29tcG9uZW50IH0gZnJvbSAnLi9pbnRlcm5hbCc7XG5pbXBvcnQgeyByZWdpc3RlclZlcnNpb24gfSBmcm9tICcuL2FwaSc7XG5pbXBvcnQgeyBIZWFydGJlYXRTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaGVhcnRiZWF0U2VydmljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvcmVDb21wb25lbnRzKHZhcmlhbnQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgX3JlZ2lzdGVyQ29tcG9uZW50KFxuICAgIG5ldyBDb21wb25lbnQoXG4gICAgICAncGxhdGZvcm0tbG9nZ2VyJyxcbiAgICAgIGNvbnRhaW5lciA9PiBuZXcgUGxhdGZvcm1Mb2dnZXJTZXJ2aWNlSW1wbChjb250YWluZXIpLFxuICAgICAgQ29tcG9uZW50VHlwZS5QUklWQVRFXG4gICAgKVxuICApO1xuICBfcmVnaXN0ZXJDb21wb25lbnQoXG4gICAgbmV3IENvbXBvbmVudChcbiAgICAgICdoZWFydGJlYXQnLFxuICAgICAgY29udGFpbmVyID0+IG5ldyBIZWFydGJlYXRTZXJ2aWNlSW1wbChjb250YWluZXIpLFxuICAgICAgQ29tcG9uZW50VHlwZS5QUklWQVRFXG4gICAgKVxuICApO1xuXG4gIC8vIFJlZ2lzdGVyIGBhcHBgIHBhY2thZ2UuXG4gIHJlZ2lzdGVyVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCB2YXJpYW50KTtcbiAgLy8gQlVJTERfVEFSR0VUIHdpbGwgYmUgcmVwbGFjZWQgYnkgdmFsdWVzIGxpa2UgZXNtNSwgZXNtMjAxNywgY2pzNSwgZXRjIGR1cmluZyB0aGUgY29tcGlsYXRpb25cbiAgcmVnaXN0ZXJWZXJzaW9uKG5hbWUsIHZlcnNpb24sICdfX0JVSUxEX1RBUkdFVF9fJyk7XG4gIC8vIFJlZ2lzdGVyIHBsYXRmb3JtIFNESyBpZGVudGlmaWVyIChubyB2ZXJzaW9uKS5cbiAgcmVnaXN0ZXJWZXJzaW9uKCdmaXJlLWpzJywgJycpO1xufVxuIiwgIi8qKlxuICogRmlyZWJhc2UgQXBwXG4gKlxuICogQHJlbWFya3MgVGhpcyBwYWNrYWdlIGNvb3JkaW5hdGVzIHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGRpZmZlcmVudCBGaXJlYmFzZSBjb21wb25lbnRzXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyByZWdpc3RlckNvcmVDb21wb25lbnRzIH0gZnJvbSAnLi9yZWdpc3RlckNvcmVDb21wb25lbnRzJztcblxuZXhwb3J0ICogZnJvbSAnLi9hcGknO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcm5hbCc7XG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy10eXBlcyc7XG5cbnJlZ2lzdGVyQ29yZUNvbXBvbmVudHMoJ19fUlVOVElNRV9FTlZfXycpO1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyByZWdpc3RlclZlcnNpb24gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IG5hbWUsIHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuXG5yZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgJ2FwcCcpO1xuZXhwb3J0ICogZnJvbSAnQGZpcmViYXNlL2FwcCc7XG4iLCAiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXG5cblBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueVxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcbklORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTVxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Jcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcblBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UsIFN1cHByZXNzZWRFcnJvciwgU3ltYm9sICovXG5cbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xuICBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XG4gICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XG4gICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xuICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2V4dGVuZHMoZCwgYikge1xuICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICBleHRlbmRTdGF0aWNzKGQsIGIpO1xuICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cbiAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xufVxuXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XG4gIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7XG4gICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07XG4gICAgICB9XG4gICAgICByZXR1cm4gdDtcbiAgfVxuICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XG4gIHZhciB0ID0ge307XG4gIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxuICAgICAgdFtwXSA9IHNbcF07XG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcbiAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXG4gICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xuICAgICAgfVxuICByZXR1cm4gdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcbiAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcbiAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0LCBrZXkpIHsgZGVjb3JhdG9yKHRhcmdldCwga2V5LCBwYXJhbUluZGV4KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19lc0RlY29yYXRlKGN0b3IsIGRlc2NyaXB0b3JJbiwgZGVjb3JhdG9ycywgY29udGV4dEluLCBpbml0aWFsaXplcnMsIGV4dHJhSW5pdGlhbGl6ZXJzKSB7XG4gIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxuICB2YXIga2luZCA9IGNvbnRleHRJbi5raW5kLCBrZXkgPSBraW5kID09PSBcImdldHRlclwiID8gXCJnZXRcIiA6IGtpbmQgPT09IFwic2V0dGVyXCIgPyBcInNldFwiIDogXCJ2YWx1ZVwiO1xuICB2YXIgdGFyZ2V0ID0gIWRlc2NyaXB0b3JJbiAmJiBjdG9yID8gY29udGV4dEluW1wic3RhdGljXCJdID8gY3RvciA6IGN0b3IucHJvdG90eXBlIDogbnVsbDtcbiAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XG4gIHZhciBfLCBkb25lID0gZmFsc2U7XG4gIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgY29udGV4dCA9IHt9O1xuICAgICAgZm9yICh2YXIgcCBpbiBjb250ZXh0SW4pIGNvbnRleHRbcF0gPSBwID09PSBcImFjY2Vzc1wiID8ge30gOiBjb250ZXh0SW5bcF07XG4gICAgICBmb3IgKHZhciBwIGluIGNvbnRleHRJbi5hY2Nlc3MpIGNvbnRleHQuYWNjZXNzW3BdID0gY29udGV4dEluLmFjY2Vzc1twXTtcbiAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XG4gICAgICB2YXIgcmVzdWx0ID0gKDAsIGRlY29yYXRvcnNbaV0pKGtpbmQgPT09IFwiYWNjZXNzb3JcIiA/IHsgZ2V0OiBkZXNjcmlwdG9yLmdldCwgc2V0OiBkZXNjcmlwdG9yLnNldCB9IDogZGVzY3JpcHRvcltrZXldLCBjb250ZXh0KTtcbiAgICAgIGlmIChraW5kID09PSBcImFjY2Vzc29yXCIpIHtcbiAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IG51bGwgfHwgdHlwZW9mIHJlc3VsdCAhPT0gXCJvYmplY3RcIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICBpZiAoXyA9IGFjY2VwdChyZXN1bHQuZ2V0KSkgZGVzY3JpcHRvci5nZXQgPSBfO1xuICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XG4gICAgICAgICAgaWYgKF8gPSBhY2NlcHQocmVzdWx0LmluaXQpKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xuICAgICAgICAgIGlmIChraW5kID09PSBcImZpZWxkXCIpIGluaXRpYWxpemVycy51bnNoaWZ0KF8pO1xuICAgICAgICAgIGVsc2UgZGVzY3JpcHRvcltrZXldID0gXztcbiAgICAgIH1cbiAgfVxuICBpZiAodGFyZ2V0KSBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSwgZGVzY3JpcHRvcik7XG4gIGRvbmUgPSB0cnVlO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcbiAgdmFyIHVzZVZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDI7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdGlhbGl6ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHVzZVZhbHVlID8gdmFsdWUgOiB2b2lkIDA7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gX19wcm9wS2V5KHgpIHtcbiAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xuICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIG5hbWUgPSBuYW1lLmRlc2NyaXB0aW9uID8gXCJbXCIuY29uY2F0KG5hbWUuZGVzY3JpcHRpb24sIFwiXVwiKSA6IFwiXCI7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwgXCJuYW1lXCIsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogcHJlZml4ID8gXCJcIi5jb25jYXQocHJlZml4LCBcIiBcIiwgbmFtZSkgOiBuYW1lIH0pO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHtcbiAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkge1xuICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgc3dpdGNoIChvcFswXSkge1xuICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xuICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cbiAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn1cblxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gIH1cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gIG9bazJdID0gbVtrXTtcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gX19leHBvcnRTdGFyKG0sIG8pIHtcbiAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvLCBwKSkgX19jcmVhdGVCaW5kaW5nKG8sIG0sIHApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX192YWx1ZXMobykge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xuICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX3JlYWQobywgbikge1xuICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghbSkgcmV0dXJuIG87XG4gIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICB0cnkge1xuICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gIH1cbiAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gIGZpbmFsbHkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICB9XG4gIHJldHVybiBhcjtcbn1cblxuLyoqIEBkZXByZWNhdGVkICovXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XG4gIGZvciAodmFyIGFyID0gW10sIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKVxuICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xuICByZXR1cm4gYXI7XG59XG5cbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXlzKCkge1xuICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcbiAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxuICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXG4gICAgICAgICAgcltrXSA9IGFbal07XG4gIHJldHVybiByO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheSh0bywgZnJvbSwgcGFjaykge1xuICBpZiAocGFjayB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAyKSBmb3IgKHZhciBpID0gMCwgbCA9IGZyb20ubGVuZ3RoLCBhcjsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgYXJbaV0gPSBmcm9tW2ldO1xuICAgICAgfVxuICB9XG4gIHJldHVybiB0by5jb25jYXQoYXIgfHwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hd2FpdCh2KSB7XG4gIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcbiAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbiAgdmFyIGcgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSksIGksIHEgPSBbXTtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xuICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gcmVzdW1lKG4sIHYpIHsgdHJ5IHsgc3RlcChnW25dKHYpKTsgfSBjYXRjaCAoZSkgeyBzZXR0bGUocVswXVszXSwgZSk7IH0gfVxuICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cbiAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxuICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XG4gIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xuICB2YXIgaSwgcDtcbiAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiLCBmdW5jdGlvbiAoZSkgeyB0aHJvdyBlOyB9KSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcbiAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogZmFsc2UgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNWYWx1ZXMobykge1xuICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xuICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xuICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSBcImZ1bmN0aW9uXCIgPyBfX3ZhbHVlcyhvKSA6IG9bU3ltYm9sLml0ZXJhdG9yXSgpLCBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaSk7XG4gIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cbiAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcbiAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cbiAgcmV0dXJuIGNvb2tlZDtcbn07XG5cbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gIG9bXCJkZWZhdWx0XCJdID0gdjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XG4gIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gIHZhciByZXN1bHQgPSB7fTtcbiAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xuICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgc3RhdGUsIGtpbmQsIGYpIHtcbiAgaWYgKGtpbmQgPT09IFwiYVwiICYmICFmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiUHJpdmF0ZSBhY2Nlc3NvciB3YXMgZGVmaW5lZCB3aXRob3V0IGEgZ2V0dGVyXCIpO1xuICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIGtpbmQgPT09IFwibVwiID8gZiA6IGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyKSA6IGYgPyBmLnZhbHVlIDogc3RhdGUuZ2V0KHJlY2VpdmVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRTZXQocmVjZWl2ZXIsIHN0YXRlLCB2YWx1ZSwga2luZCwgZikge1xuICBpZiAoa2luZCA9PT0gXCJtXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIG1ldGhvZCBpcyBub3Qgd3JpdGFibGVcIik7XG4gIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcbiAgaWYgKHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgIT09IHN0YXRlIHx8ICFmIDogIXN0YXRlLmhhcyhyZWNlaXZlcikpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3Qgd3JpdGUgcHJpdmF0ZSBtZW1iZXIgdG8gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcbiAgcmV0dXJuIChraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlciwgdmFsdWUpIDogZiA/IGYudmFsdWUgPSB2YWx1ZSA6IHN0YXRlLnNldChyZWNlaXZlciwgdmFsdWUpKSwgdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkSW4oc3RhdGUsIHJlY2VpdmVyKSB7XG4gIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xuICByZXR1cm4gdHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciA9PT0gc3RhdGUgOiBzdGF0ZS5oYXMocmVjZWl2ZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19hZGREaXNwb3NhYmxlUmVzb3VyY2UoZW52LCB2YWx1ZSwgYXN5bmMpIHtcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB2b2lkIDApIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiT2JqZWN0IGV4cGVjdGVkLlwiKTtcbiAgICB2YXIgZGlzcG9zZTtcbiAgICBpZiAoYXN5bmMpIHtcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XG4gICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbiAgICB9XG4gICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xuICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xuICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRpc3Bvc2UgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBub3QgZGlzcG9zYWJsZS5cIik7XG4gICAgZW52LnN0YWNrLnB1c2goeyB2YWx1ZTogdmFsdWUsIGRpc3Bvc2U6IGRpc3Bvc2UsIGFzeW5jOiBhc3luYyB9KTtcbiAgfVxuICBlbHNlIGlmIChhc3luYykge1xuICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xuICB2YXIgZSA9IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgcmV0dXJuIGUubmFtZSA9IFwiU3VwcHJlc3NlZEVycm9yXCIsIGUuZXJyb3IgPSBlcnJvciwgZS5zdXBwcmVzc2VkID0gc3VwcHJlc3NlZCwgZTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2Rpc3Bvc2VSZXNvdXJjZXMoZW52KSB7XG4gIGZ1bmN0aW9uIGZhaWwoZSkge1xuICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcbiAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xuICB9XG4gIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgd2hpbGUgKGVudi5zdGFjay5sZW5ndGgpIHtcbiAgICAgIHZhciByZWMgPSBlbnYuc3RhY2sucG9wKCk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjLmRpc3Bvc2UgJiYgcmVjLmRpc3Bvc2UuY2FsbChyZWMudmFsdWUpO1xuICAgICAgICBpZiAocmVjLmFzeW5jKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkudGhlbihuZXh0LCBmdW5jdGlvbihlKSB7IGZhaWwoZSk7IHJldHVybiBuZXh0KCk7IH0pO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICBmYWlsKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XG4gIH1cbiAgcmV0dXJuIG5leHQoKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBfX2V4dGVuZHMsXG4gIF9fYXNzaWduLFxuICBfX3Jlc3QsXG4gIF9fZGVjb3JhdGUsXG4gIF9fcGFyYW0sXG4gIF9fbWV0YWRhdGEsXG4gIF9fYXdhaXRlcixcbiAgX19nZW5lcmF0b3IsXG4gIF9fY3JlYXRlQmluZGluZyxcbiAgX19leHBvcnRTdGFyLFxuICBfX3ZhbHVlcyxcbiAgX19yZWFkLFxuICBfX3NwcmVhZCxcbiAgX19zcHJlYWRBcnJheXMsXG4gIF9fc3ByZWFkQXJyYXksXG4gIF9fYXdhaXQsXG4gIF9fYXN5bmNHZW5lcmF0b3IsXG4gIF9fYXN5bmNEZWxlZ2F0b3IsXG4gIF9fYXN5bmNWYWx1ZXMsXG4gIF9fbWFrZVRlbXBsYXRlT2JqZWN0LFxuICBfX2ltcG9ydFN0YXIsXG4gIF9faW1wb3J0RGVmYXVsdCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcbiAgX19jbGFzc1ByaXZhdGVGaWVsZEluLFxuICBfX2FkZERpc3Bvc2FibGVSZXNvdXJjZSxcbiAgX19kaXNwb3NlUmVzb3VyY2VzLFxufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEFuIGVudW0gb2YgZmFjdG9ycyB0aGF0IG1heSBiZSB1c2VkIGZvciBtdWx0aWZhY3RvciBhdXRoZW50aWNhdGlvbi5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBGYWN0b3JJZCA9IHtcbiAgLyoqIFBob25lIGFzIHNlY29uZCBmYWN0b3IgKi9cbiAgUEhPTkU6ICdwaG9uZScsXG4gIFRPVFA6ICd0b3RwJ1xufSBhcyBjb25zdDtcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBvZiBzdXBwb3J0ZWQgcHJvdmlkZXJzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFByb3ZpZGVySWQgPSB7XG4gIC8qKiBGYWNlYm9vayBwcm92aWRlciBJRCAqL1xuICBGQUNFQk9PSzogJ2ZhY2Vib29rLmNvbScsXG4gIC8qKiBHaXRIdWIgcHJvdmlkZXIgSUQgKi9cbiAgR0lUSFVCOiAnZ2l0aHViLmNvbScsXG4gIC8qKiBHb29nbGUgcHJvdmlkZXIgSUQgKi9cbiAgR09PR0xFOiAnZ29vZ2xlLmNvbScsXG4gIC8qKiBQYXNzd29yZCBwcm92aWRlciAqL1xuICBQQVNTV09SRDogJ3Bhc3N3b3JkJyxcbiAgLyoqIFBob25lIHByb3ZpZGVyICovXG4gIFBIT05FOiAncGhvbmUnLFxuICAvKiogVHdpdHRlciBwcm92aWRlciBJRCAqL1xuICBUV0lUVEVSOiAndHdpdHRlci5jb20nXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBzaWduLWluIG1ldGhvZHMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgU2lnbkluTWV0aG9kID0ge1xuICAvKiogRW1haWwgbGluayBzaWduIGluIG1ldGhvZCAqL1xuICBFTUFJTF9MSU5LOiAnZW1haWxMaW5rJyxcbiAgLyoqIEVtYWlsL3Bhc3N3b3JkIHNpZ24gaW4gbWV0aG9kICovXG4gIEVNQUlMX1BBU1NXT1JEOiAncGFzc3dvcmQnLFxuICAvKiogRmFjZWJvb2sgc2lnbiBpbiBtZXRob2QgKi9cbiAgRkFDRUJPT0s6ICdmYWNlYm9vay5jb20nLFxuICAvKiogR2l0SHViIHNpZ24gaW4gbWV0aG9kICovXG4gIEdJVEhVQjogJ2dpdGh1Yi5jb20nLFxuICAvKiogR29vZ2xlIHNpZ24gaW4gbWV0aG9kICovXG4gIEdPT0dMRTogJ2dvb2dsZS5jb20nLFxuICAvKiogUGhvbmUgc2lnbiBpbiBtZXRob2QgKi9cbiAgUEhPTkU6ICdwaG9uZScsXG4gIC8qKiBUd2l0dGVyIHNpZ24gaW4gbWV0aG9kICovXG4gIFRXSVRURVI6ICd0d2l0dGVyLmNvbSdcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRW51bWVyYXRpb24gb2Ygc3VwcG9ydGVkIG9wZXJhdGlvbiB0eXBlcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBPcGVyYXRpb25UeXBlID0ge1xuICAvKiogT3BlcmF0aW9uIGludm9sdmluZyBsaW5raW5nIGFuIGFkZGl0aW9uYWwgcHJvdmlkZXIgdG8gYW4gYWxyZWFkeSBzaWduZWQtaW4gdXNlci4gKi9cbiAgTElOSzogJ2xpbmsnLFxuICAvKiogT3BlcmF0aW9uIGludm9sdmluZyB1c2luZyBhIHByb3ZpZGVyIHRvIHJlYXV0aGVudGljYXRlIGFuIGFscmVhZHkgc2lnbmVkLWluIHVzZXIuICovXG4gIFJFQVVUSEVOVElDQVRFOiAncmVhdXRoZW50aWNhdGUnLFxuICAvKiogT3BlcmF0aW9uIGludm9sdmluZyBzaWduaW5nIGluIGEgdXNlci4gKi9cbiAgU0lHTl9JTjogJ3NpZ25Jbidcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHBvc3NpYmxlIGVtYWlsIGFjdGlvbiB0eXBlcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBBY3Rpb25Db2RlT3BlcmF0aW9uID0ge1xuICAvKiogVGhlIGVtYWlsIGxpbmsgc2lnbi1pbiBhY3Rpb24uICovXG4gIEVNQUlMX1NJR05JTjogJ0VNQUlMX1NJR05JTicsXG4gIC8qKiBUaGUgcGFzc3dvcmQgcmVzZXQgYWN0aW9uLiAqL1xuICBQQVNTV09SRF9SRVNFVDogJ1BBU1NXT1JEX1JFU0VUJyxcbiAgLyoqIFRoZSBlbWFpbCByZXZvY2F0aW9uIGFjdGlvbi4gKi9cbiAgUkVDT1ZFUl9FTUFJTDogJ1JFQ09WRVJfRU1BSUwnLFxuICAvKiogVGhlIHJldmVydCBzZWNvbmQgZmFjdG9yIGFkZGl0aW9uIGVtYWlsIGFjdGlvbi4gKi9cbiAgUkVWRVJUX1NFQ09ORF9GQUNUT1JfQURESVRJT046ICdSRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTicsXG4gIC8qKiBUaGUgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb24gZW1haWwgYWN0aW9uLiAqL1xuICBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTDogJ1ZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMJyxcbiAgLyoqIFRoZSBlbWFpbCB2ZXJpZmljYXRpb24gYWN0aW9uLiAqL1xuICBWRVJJRllfRU1BSUw6ICdWRVJJRllfRU1BSUwnXG59IGFzIGNvbnN0O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhFcnJvck1hcCwgVXNlciB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBFcnJvckZhY3RvcnksIEVycm9yTWFwIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQgeyBJZFRva2VuTWZhUmVzcG9uc2UgfSBmcm9tICcuLi9hcGkvYXV0aGVudGljYXRpb24vbWZhJztcbmltcG9ydCB7IEFwcE5hbWUgfSBmcm9tICcuLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFscyc7XG5cbi8qKlxuICogRW51bWVyYXRpb24gb2YgRmlyZWJhc2UgQXV0aCBlcnJvciBjb2Rlcy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQXV0aEVycm9yQ29kZSB7XG4gIEFETUlOX09OTFlfT1BFUkFUSU9OID0gJ2FkbWluLXJlc3RyaWN0ZWQtb3BlcmF0aW9uJyxcbiAgQVJHVU1FTlRfRVJST1IgPSAnYXJndW1lbnQtZXJyb3InLFxuICBBUFBfTk9UX0FVVEhPUklaRUQgPSAnYXBwLW5vdC1hdXRob3JpemVkJyxcbiAgQVBQX05PVF9JTlNUQUxMRUQgPSAnYXBwLW5vdC1pbnN0YWxsZWQnLFxuICBDQVBUQ0hBX0NIRUNLX0ZBSUxFRCA9ICdjYXB0Y2hhLWNoZWNrLWZhaWxlZCcsXG4gIENPREVfRVhQSVJFRCA9ICdjb2RlLWV4cGlyZWQnLFxuICBDT1JET1ZBX05PVF9SRUFEWSA9ICdjb3Jkb3ZhLW5vdC1yZWFkeScsXG4gIENPUlNfVU5TVVBQT1JURUQgPSAnY29ycy11bnN1cHBvcnRlZCcsXG4gIENSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0UgPSAnY3JlZGVudGlhbC1hbHJlYWR5LWluLXVzZScsXG4gIENSRURFTlRJQUxfTUlTTUFUQ0ggPSAnY3VzdG9tLXRva2VuLW1pc21hdGNoJyxcbiAgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOID0gJ3JlcXVpcmVzLXJlY2VudC1sb2dpbicsXG4gIERFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSCA9ICdkZXBlbmRlbnQtc2RrLWluaXRpYWxpemVkLWJlZm9yZS1hdXRoJyxcbiAgRFlOQU1JQ19MSU5LX05PVF9BQ1RJVkFURUQgPSAnZHluYW1pYy1saW5rLW5vdC1hY3RpdmF0ZWQnLFxuICBFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OID0gJ2VtYWlsLWNoYW5nZS1uZWVkcy12ZXJpZmljYXRpb24nLFxuICBFTUFJTF9FWElTVFMgPSAnZW1haWwtYWxyZWFkeS1pbi11c2UnLFxuICBFTVVMQVRPUl9DT05GSUdfRkFJTEVEID0gJ2VtdWxhdG9yLWNvbmZpZy1mYWlsZWQnLFxuICBFWFBJUkVEX09PQl9DT0RFID0gJ2V4cGlyZWQtYWN0aW9uLWNvZGUnLFxuICBFWFBJUkVEX1BPUFVQX1JFUVVFU1QgPSAnY2FuY2VsbGVkLXBvcHVwLXJlcXVlc3QnLFxuICBJTlRFUk5BTF9FUlJPUiA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIElOVkFMSURfQVBJX0tFWSA9ICdpbnZhbGlkLWFwaS1rZXknLFxuICBJTlZBTElEX0FQUF9DUkVERU5USUFMID0gJ2ludmFsaWQtYXBwLWNyZWRlbnRpYWwnLFxuICBJTlZBTElEX0FQUF9JRCA9ICdpbnZhbGlkLWFwcC1pZCcsXG4gIElOVkFMSURfQVVUSCA9ICdpbnZhbGlkLXVzZXItdG9rZW4nLFxuICBJTlZBTElEX0FVVEhfRVZFTlQgPSAnaW52YWxpZC1hdXRoLWV2ZW50JyxcbiAgSU5WQUxJRF9DRVJUX0hBU0ggPSAnaW52YWxpZC1jZXJ0LWhhc2gnLFxuICBJTlZBTElEX0NPREUgPSAnaW52YWxpZC12ZXJpZmljYXRpb24tY29kZScsXG4gIElOVkFMSURfQ09OVElOVUVfVVJJID0gJ2ludmFsaWQtY29udGludWUtdXJpJyxcbiAgSU5WQUxJRF9DT1JET1ZBX0NPTkZJR1VSQVRJT04gPSAnaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb24nLFxuICBJTlZBTElEX0NVU1RPTV9UT0tFTiA9ICdpbnZhbGlkLWN1c3RvbS10b2tlbicsXG4gIElOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTiA9ICdpbnZhbGlkLWR5bmFtaWMtbGluay1kb21haW4nLFxuICBJTlZBTElEX0VNQUlMID0gJ2ludmFsaWQtZW1haWwnLFxuICBJTlZBTElEX0VNVUxBVE9SX1NDSEVNRSA9ICdpbnZhbGlkLWVtdWxhdG9yLXNjaGVtZScsXG4gIElOVkFMSURfSURQX1JFU1BPTlNFID0gJ2ludmFsaWQtY3JlZGVudGlhbCcsXG4gIElOVkFMSURfTUVTU0FHRV9QQVlMT0FEID0gJ2ludmFsaWQtbWVzc2FnZS1wYXlsb2FkJyxcbiAgSU5WQUxJRF9NRkFfU0VTU0lPTiA9ICdpbnZhbGlkLW11bHRpLWZhY3Rvci1zZXNzaW9uJyxcbiAgSU5WQUxJRF9PQVVUSF9DTElFTlRfSUQgPSAnaW52YWxpZC1vYXV0aC1jbGllbnQtaWQnLFxuICBJTlZBTElEX09BVVRIX1BST1ZJREVSID0gJ2ludmFsaWQtb2F1dGgtcHJvdmlkZXInLFxuICBJTlZBTElEX09PQl9DT0RFID0gJ2ludmFsaWQtYWN0aW9uLWNvZGUnLFxuICBJTlZBTElEX09SSUdJTiA9ICd1bmF1dGhvcml6ZWQtZG9tYWluJyxcbiAgSU5WQUxJRF9QQVNTV09SRCA9ICd3cm9uZy1wYXNzd29yZCcsXG4gIElOVkFMSURfUEVSU0lTVEVOQ0UgPSAnaW52YWxpZC1wZXJzaXN0ZW5jZS10eXBlJyxcbiAgSU5WQUxJRF9QSE9ORV9OVU1CRVIgPSAnaW52YWxpZC1waG9uZS1udW1iZXInLFxuICBJTlZBTElEX1BST1ZJREVSX0lEID0gJ2ludmFsaWQtcHJvdmlkZXItaWQnLFxuICBJTlZBTElEX1JFQ0lQSUVOVF9FTUFJTCA9ICdpbnZhbGlkLXJlY2lwaWVudC1lbWFpbCcsXG4gIElOVkFMSURfU0VOREVSID0gJ2ludmFsaWQtc2VuZGVyJyxcbiAgSU5WQUxJRF9TRVNTSU9OX0lORk8gPSAnaW52YWxpZC12ZXJpZmljYXRpb24taWQnLFxuICBJTlZBTElEX1RFTkFOVF9JRCA9ICdpbnZhbGlkLXRlbmFudC1pZCcsXG4gIExPR0lOX0JMT0NLRUQgPSAnbG9naW4tYmxvY2tlZCcsXG4gIE1GQV9JTkZPX05PVF9GT1VORCA9ICdtdWx0aS1mYWN0b3ItaW5mby1ub3QtZm91bmQnLFxuICBNRkFfUkVRVUlSRUQgPSAnbXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWQnLFxuICBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FID0gJ21pc3NpbmctYW5kcm9pZC1wa2ctbmFtZScsXG4gIE1JU1NJTkdfQVBQX0NSRURFTlRJQUwgPSAnbWlzc2luZy1hcHAtY3JlZGVudGlhbCcsXG4gIE1JU1NJTkdfQVVUSF9ET01BSU4gPSAnYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkJyxcbiAgTUlTU0lOR19DT0RFID0gJ21pc3NpbmctdmVyaWZpY2F0aW9uLWNvZGUnLFxuICBNSVNTSU5HX0NPTlRJTlVFX1VSSSA9ICdtaXNzaW5nLWNvbnRpbnVlLXVyaScsXG4gIE1JU1NJTkdfSUZSQU1FX1NUQVJUID0gJ21pc3NpbmctaWZyYW1lLXN0YXJ0JyxcbiAgTUlTU0lOR19JT1NfQlVORExFX0lEID0gJ21pc3NpbmctaW9zLWJ1bmRsZS1pZCcsXG4gIE1JU1NJTkdfT1JfSU5WQUxJRF9OT05DRSA9ICdtaXNzaW5nLW9yLWludmFsaWQtbm9uY2UnLFxuICBNSVNTSU5HX01GQV9JTkZPID0gJ21pc3NpbmctbXVsdGktZmFjdG9yLWluZm8nLFxuICBNSVNTSU5HX01GQV9TRVNTSU9OID0gJ21pc3NpbmctbXVsdGktZmFjdG9yLXNlc3Npb24nLFxuICBNSVNTSU5HX1BIT05FX05VTUJFUiA9ICdtaXNzaW5nLXBob25lLW51bWJlcicsXG4gIE1JU1NJTkdfUEFTU1dPUkQgPSAnbWlzc2luZy1wYXNzd29yZCcsXG4gIE1JU1NJTkdfU0VTU0lPTl9JTkZPID0gJ21pc3NpbmctdmVyaWZpY2F0aW9uLWlkJyxcbiAgTU9EVUxFX0RFU1RST1lFRCA9ICdhcHAtZGVsZXRlZCcsXG4gIE5FRURfQ09ORklSTUFUSU9OID0gJ2FjY291bnQtZXhpc3RzLXdpdGgtZGlmZmVyZW50LWNyZWRlbnRpYWwnLFxuICBORVRXT1JLX1JFUVVFU1RfRkFJTEVEID0gJ25ldHdvcmstcmVxdWVzdC1mYWlsZWQnLFxuICBOVUxMX1VTRVIgPSAnbnVsbC11c2VyJyxcbiAgTk9fQVVUSF9FVkVOVCA9ICduby1hdXRoLWV2ZW50JyxcbiAgTk9fU1VDSF9QUk9WSURFUiA9ICduby1zdWNoLXByb3ZpZGVyJyxcbiAgT1BFUkFUSU9OX05PVF9BTExPV0VEID0gJ29wZXJhdGlvbi1ub3QtYWxsb3dlZCcsXG4gIE9QRVJBVElPTl9OT1RfU1VQUE9SVEVEID0gJ29wZXJhdGlvbi1ub3Qtc3VwcG9ydGVkLWluLXRoaXMtZW52aXJvbm1lbnQnLFxuICBQT1BVUF9CTE9DS0VEID0gJ3BvcHVwLWJsb2NrZWQnLFxuICBQT1BVUF9DTE9TRURfQllfVVNFUiA9ICdwb3B1cC1jbG9zZWQtYnktdXNlcicsXG4gIFBST1ZJREVSX0FMUkVBRFlfTElOS0VEID0gJ3Byb3ZpZGVyLWFscmVhZHktbGlua2VkJyxcbiAgUVVPVEFfRVhDRUVERUQgPSAncXVvdGEtZXhjZWVkZWQnLFxuICBSRURJUkVDVF9DQU5DRUxMRURfQllfVVNFUiA9ICdyZWRpcmVjdC1jYW5jZWxsZWQtYnktdXNlcicsXG4gIFJFRElSRUNUX09QRVJBVElPTl9QRU5ESU5HID0gJ3JlZGlyZWN0LW9wZXJhdGlvbi1wZW5kaW5nJyxcbiAgUkVKRUNURURfQ1JFREVOVElBTCA9ICdyZWplY3RlZC1jcmVkZW50aWFsJyxcbiAgU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVEID0gJ3NlY29uZC1mYWN0b3ItYWxyZWFkeS1pbi11c2UnLFxuICBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEID0gJ21heGltdW0tc2Vjb25kLWZhY3Rvci1jb3VudC1leGNlZWRlZCcsXG4gIFRFTkFOVF9JRF9NSVNNQVRDSCA9ICd0ZW5hbnQtaWQtbWlzbWF0Y2gnLFxuICBUSU1FT1VUID0gJ3RpbWVvdXQnLFxuICBUT0tFTl9FWFBJUkVEID0gJ3VzZXItdG9rZW4tZXhwaXJlZCcsXG4gIFRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiA9ICd0b28tbWFueS1yZXF1ZXN0cycsXG4gIFVOQVVUSE9SSVpFRF9ET01BSU4gPSAndW5hdXRob3JpemVkLWNvbnRpbnVlLXVyaScsXG4gIFVOU1VQUE9SVEVEX0ZJUlNUX0ZBQ1RPUiA9ICd1bnN1cHBvcnRlZC1maXJzdC1mYWN0b3InLFxuICBVTlNVUFBPUlRFRF9QRVJTSVNURU5DRSA9ICd1bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlJyxcbiAgVU5TVVBQT1JURURfVEVOQU5UX09QRVJBVElPTiA9ICd1bnN1cHBvcnRlZC10ZW5hbnQtb3BlcmF0aW9uJyxcbiAgVU5WRVJJRklFRF9FTUFJTCA9ICd1bnZlcmlmaWVkLWVtYWlsJyxcbiAgVVNFUl9DQU5DRUxMRUQgPSAndXNlci1jYW5jZWxsZWQnLFxuICBVU0VSX0RFTEVURUQgPSAndXNlci1ub3QtZm91bmQnLFxuICBVU0VSX0RJU0FCTEVEID0gJ3VzZXItZGlzYWJsZWQnLFxuICBVU0VSX01JU01BVENIID0gJ3VzZXItbWlzbWF0Y2gnLFxuICBVU0VSX1NJR05FRF9PVVQgPSAndXNlci1zaWduZWQtb3V0JyxcbiAgV0VBS19QQVNTV09SRCA9ICd3ZWFrLXBhc3N3b3JkJyxcbiAgV0VCX1NUT1JBR0VfVU5TVVBQT1JURUQgPSAnd2ViLXN0b3JhZ2UtdW5zdXBwb3J0ZWQnLFxuICBBTFJFQURZX0lOSVRJQUxJWkVEID0gJ2FscmVhZHktaW5pdGlhbGl6ZWQnLFxuICBSRUNBUFRDSEFfTk9UX0VOQUJMRUQgPSAncmVjYXB0Y2hhLW5vdC1lbmFibGVkJyxcbiAgTUlTU0lOR19SRUNBUFRDSEFfVE9LRU4gPSAnbWlzc2luZy1yZWNhcHRjaGEtdG9rZW4nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9UT0tFTiA9ICdpbnZhbGlkLXJlY2FwdGNoYS10b2tlbicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX0FDVElPTiA9ICdpbnZhbGlkLXJlY2FwdGNoYS1hY3Rpb24nLFxuICBNSVNTSU5HX0NMSUVOVF9UWVBFID0gJ21pc3NpbmctY2xpZW50LXR5cGUnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OID0gJ21pc3NpbmctcmVjYXB0Y2hhLXZlcnNpb24nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OID0gJ2ludmFsaWQtcmVjYXB0Y2hhLXZlcnNpb24nLFxuICBJTlZBTElEX1JFUV9UWVBFID0gJ2ludmFsaWQtcmVxLXR5cGUnLFxuICBVTlNVUFBPUlRFRF9QQVNTV09SRF9QT0xJQ1lfU0NIRU1BX1ZFUlNJT04gPSAndW5zdXBwb3J0ZWQtcGFzc3dvcmQtcG9saWN5LXNjaGVtYS12ZXJzaW9uJyxcbiAgUEFTU1dPUkRfRE9FU19OT1RfTUVFVF9SRVFVSVJFTUVOVFMgPSAncGFzc3dvcmQtZG9lcy1ub3QtbWVldC1yZXF1aXJlbWVudHMnXG59XG5cbmZ1bmN0aW9uIF9kZWJ1Z0Vycm9yTWFwKCk6IEVycm9yTWFwPEF1dGhFcnJvckNvZGU+IHtcbiAgcmV0dXJuIHtcbiAgICBbQXV0aEVycm9yQ29kZS5BRE1JTl9PTkxZX09QRVJBVElPTl06XG4gICAgICAnVGhpcyBvcGVyYXRpb24gaXMgcmVzdHJpY3RlZCB0byBhZG1pbmlzdHJhdG9ycyBvbmx5LicsXG4gICAgW0F1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JdOiAnJyxcbiAgICBbQXV0aEVycm9yQ29kZS5BUFBfTk9UX0FVVEhPUklaRURdOlxuICAgICAgXCJUaGlzIGFwcCwgaWRlbnRpZmllZCBieSB0aGUgZG9tYWluIHdoZXJlIGl0J3MgaG9zdGVkLCBpcyBub3QgXCIgK1xuICAgICAgJ2F1dGhvcml6ZWQgdG8gdXNlIEZpcmViYXNlIEF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIHByb3ZpZGVkIEFQSSBrZXkuICcgK1xuICAgICAgJ1JldmlldyB5b3VyIGtleSBjb25maWd1cmF0aW9uIGluIHRoZSBHb29nbGUgQVBJIGNvbnNvbGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5BUFBfTk9UX0lOU1RBTExFRF06XG4gICAgICAnVGhlIHJlcXVlc3RlZCBtb2JpbGUgYXBwbGljYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgaWRlbnRpZmllciAoJyArXG4gICAgICAnQW5kcm9pZCBwYWNrYWdlIG5hbWUgb3IgaU9TIGJ1bmRsZSBJRCkgcHJvdmlkZWQgaXMgbm90IGluc3RhbGxlZCBvbiAnICtcbiAgICAgICd0aGlzIGRldmljZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkNBUFRDSEFfQ0hFQ0tfRkFJTEVEXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIHJlc3BvbnNlIHRva2VuIHByb3ZpZGVkIGlzIGVpdGhlciBpbnZhbGlkLCBleHBpcmVkLCAnICtcbiAgICAgICdhbHJlYWR5IHVzZWQgb3IgdGhlIGRvbWFpbiBhc3NvY2lhdGVkIHdpdGggaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGxpc3QgJyArXG4gICAgICAnb2Ygd2hpdGVsaXN0ZWQgZG9tYWlucy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkNPREVfRVhQSVJFRF06XG4gICAgICAnVGhlIFNNUyBjb2RlIGhhcyBleHBpcmVkLiBQbGVhc2UgcmUtc2VuZCB0aGUgdmVyaWZpY2F0aW9uIGNvZGUgdG8gdHJ5ICcgK1xuICAgICAgJ2FnYWluLicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ09SRE9WQV9OT1RfUkVBRFldOiAnQ29yZG92YSBmcmFtZXdvcmsgaXMgbm90IHJlYWR5LicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ09SU19VTlNVUFBPUlRFRF06ICdUaGlzIGJyb3dzZXIgaXMgbm90IHN1cHBvcnRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0VdOlxuICAgICAgJ1RoaXMgY3JlZGVudGlhbCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBhIGRpZmZlcmVudCB1c2VyIGFjY291bnQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5DUkVERU5USUFMX01JU01BVENIXTpcbiAgICAgICdUaGUgY3VzdG9tIHRva2VuIGNvcnJlc3BvbmRzIHRvIGEgZGlmZmVyZW50IGF1ZGllbmNlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOXTpcbiAgICAgICdUaGlzIG9wZXJhdGlvbiBpcyBzZW5zaXRpdmUgYW5kIHJlcXVpcmVzIHJlY2VudCBhdXRoZW50aWNhdGlvbi4gTG9nIGluICcgK1xuICAgICAgJ2FnYWluIGJlZm9yZSByZXRyeWluZyB0aGlzIHJlcXVlc3QuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5ERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEhdOlxuICAgICAgJ0Fub3RoZXIgRmlyZWJhc2UgU0RLIHdhcyBpbml0aWFsaXplZCBhbmQgaXMgdHJ5aW5nIHRvIHVzZSBBdXRoIGJlZm9yZSBBdXRoIGlzICcgK1xuICAgICAgJ2luaXRpYWxpemVkLiBQbGVhc2UgYmUgc3VyZSB0byBjYWxsIGBpbml0aWFsaXplQXV0aGAgb3IgYGdldEF1dGhgIGJlZm9yZSAnICtcbiAgICAgICdzdGFydGluZyBhbnkgb3RoZXIgRmlyZWJhc2UgU0RLLicsXG4gICAgW0F1dGhFcnJvckNvZGUuRFlOQU1JQ19MSU5LX05PVF9BQ1RJVkFURURdOlxuICAgICAgJ1BsZWFzZSBhY3RpdmF0ZSBEeW5hbWljIExpbmtzIGluIHRoZSBGaXJlYmFzZSBDb25zb2xlIGFuZCBhZ3JlZSB0byB0aGUgdGVybXMgYW5kICcgK1xuICAgICAgJ2NvbmRpdGlvbnMuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5FTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OXTpcbiAgICAgICdNdWx0aS1mYWN0b3IgdXNlcnMgbXVzdCBhbHdheXMgaGF2ZSBhIHZlcmlmaWVkIGVtYWlsLicsXG4gICAgW0F1dGhFcnJvckNvZGUuRU1BSUxfRVhJU1RTXTpcbiAgICAgICdUaGUgZW1haWwgYWRkcmVzcyBpcyBhbHJlYWR5IGluIHVzZSBieSBhbm90aGVyIGFjY291bnQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5FTVVMQVRPUl9DT05GSUdfRkFJTEVEXTpcbiAgICAgICdBdXRoIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCB0byBtYWtlIGEgbmV0d29yayBjYWxsLiBBdXRoIGNhbiAnICtcbiAgICAgICdubyBsb25nZXIgYmUgY29uZmlndXJlZCB0byB1c2UgdGhlIGVtdWxhdG9yLiBUcnkgY2FsbGluZyAnICtcbiAgICAgICdcImNvbm5lY3RBdXRoRW11bGF0b3IoKVwiIHNvb25lci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkVYUElSRURfT09CX0NPREVdOiAnVGhlIGFjdGlvbiBjb2RlIGhhcyBleHBpcmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuRVhQSVJFRF9QT1BVUF9SRVFVRVNUXTpcbiAgICAgICdUaGlzIG9wZXJhdGlvbiBoYXMgYmVlbiBjYW5jZWxsZWQgZHVlIHRvIGFub3RoZXIgY29uZmxpY3RpbmcgcG9wdXAgYmVpbmcgb3BlbmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JdOiAnQW4gaW50ZXJuYWwgQXV0aEVycm9yIGhhcyBvY2N1cnJlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQVBQX0NSRURFTlRJQUxdOlxuICAgICAgJ1RoZSBwaG9uZSB2ZXJpZmljYXRpb24gcmVxdWVzdCBjb250YWlucyBhbiBpbnZhbGlkIGFwcGxpY2F0aW9uIHZlcmlmaWVyLicgK1xuICAgICAgJyBUaGUgcmVDQVBUQ0hBIHRva2VuIHJlc3BvbnNlIGlzIGVpdGhlciBpbnZhbGlkIG9yIGV4cGlyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQUF9JRF06XG4gICAgICAnVGhlIG1vYmlsZSBhcHAgaWRlbnRpZmllciBpcyBub3QgcmVnaXN0ZWQgZm9yIHRoZSBjdXJyZW50IHByb2plY3QuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEhdOlxuICAgICAgXCJUaGlzIHVzZXIncyBjcmVkZW50aWFsIGlzbid0IHZhbGlkIGZvciB0aGlzIHByb2plY3QuIFRoaXMgY2FuIGhhcHBlbiBcIiArXG4gICAgICBcImlmIHRoZSB1c2VyJ3MgdG9rZW4gaGFzIGJlZW4gdGFtcGVyZWQgd2l0aCwgb3IgaWYgdGhlIHVzZXIgaXNuJ3QgZm9yIFwiICtcbiAgICAgICd0aGUgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBBUEkga2V5LicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9BVVRIX0VWRU5UXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPREVdOlxuICAgICAgJ1RoZSBTTVMgdmVyaWZpY2F0aW9uIGNvZGUgdXNlZCB0byBjcmVhdGUgdGhlIHBob25lIGF1dGggY3JlZGVudGlhbCBpcyAnICtcbiAgICAgICdpbnZhbGlkLiBQbGVhc2UgcmVzZW5kIHRoZSB2ZXJpZmljYXRpb24gY29kZSBzbXMgYW5kIGJlIHN1cmUgdG8gdXNlIHRoZSAnICtcbiAgICAgICd2ZXJpZmljYXRpb24gY29kZSBwcm92aWRlZCBieSB0aGUgdXNlci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQ09OVElOVUVfVVJJXTpcbiAgICAgICdUaGUgY29udGludWUgVVJMIHByb3ZpZGVkIGluIHRoZSByZXF1ZXN0IGlzIGludmFsaWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTl06XG4gICAgICAnVGhlIGZvbGxvd2luZyBDb3Jkb3ZhIHBsdWdpbnMgbXVzdCBiZSBpbnN0YWxsZWQgdG8gZW5hYmxlIE9BdXRoIHNpZ24taW46ICcgK1xuICAgICAgJ2NvcmRvdmEtcGx1Z2luLWJ1aWxkaW5mbywgY29yZG92YS11bml2ZXJzYWwtbGlua3MtcGx1Z2luLCAnICtcbiAgICAgICdjb3Jkb3ZhLXBsdWdpbi1icm93c2VydGFiLCBjb3Jkb3ZhLXBsdWdpbi1pbmFwcGJyb3dzZXIgYW5kICcgK1xuICAgICAgJ2NvcmRvdmEtcGx1Z2luLWN1c3RvbXVybHNjaGVtZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfQ1VTVE9NX1RPS0VOXTpcbiAgICAgICdUaGUgY3VzdG9tIHRva2VuIGZvcm1hdCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbi4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTl06XG4gICAgICAnVGhlIHByb3ZpZGVkIGR5bmFtaWMgbGluayBkb21haW4gaXMgbm90IGNvbmZpZ3VyZWQgb3IgYXV0aG9yaXplZCBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfRU1BSUxdOiAnVGhlIGVtYWlsIGFkZHJlc3MgaXMgYmFkbHkgZm9ybWF0dGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9FTVVMQVRPUl9TQ0hFTUVdOlxuICAgICAgJ0VtdWxhdG9yIFVSTCBtdXN0IHN0YXJ0IHdpdGggYSB2YWxpZCBzY2hlbWUgKGh0dHA6Ly8gb3IgaHR0cHM6Ly8pLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9BUElfS0VZXTpcbiAgICAgICdZb3VyIEFQSSBrZXkgaXMgaW52YWxpZCwgcGxlYXNlIGNoZWNrIHlvdSBoYXZlIGNvcGllZCBpdCBjb3JyZWN0bHkuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX0NFUlRfSEFTSF06XG4gICAgICAnVGhlIFNIQS0xIGNlcnRpZmljYXRlIGhhc2ggcHJvdmlkZWQgaXMgaW52YWxpZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfSURQX1JFU1BPTlNFXTpcbiAgICAgICdUaGUgc3VwcGxpZWQgYXV0aCBjcmVkZW50aWFsIGlzIG1hbGZvcm1lZCBvciBoYXMgZXhwaXJlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfTUVTU0FHRV9QQVlMT0FEXTpcbiAgICAgICdUaGUgZW1haWwgdGVtcGxhdGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGFjdGlvbiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMgaW4gaXRzIG1lc3NhZ2UuICcgK1xuICAgICAgJ1BsZWFzZSBmaXggYnkgZ29pbmcgdG8gdGhlIEF1dGggZW1haWwgdGVtcGxhdGVzIHNlY3Rpb24gaW4gdGhlIEZpcmViYXNlIENvbnNvbGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX01GQV9TRVNTSU9OXTpcbiAgICAgICdUaGUgcmVxdWVzdCBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgcHJvb2Ygb2YgZmlyc3QgZmFjdG9yIHN1Y2Nlc3NmdWwgc2lnbi1pbi4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfT0FVVEhfUFJPVklERVJdOlxuICAgICAgJ0VtYWlsQXV0aFByb3ZpZGVyIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb3BlcmF0aW9uLiBUaGlzIG9wZXJhdGlvbiAnICtcbiAgICAgICdvbmx5IHN1cHBvcnRzIE9BdXRoIHByb3ZpZGVycy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfT0FVVEhfQ0xJRU5UX0lEXTpcbiAgICAgICdUaGUgT0F1dGggY2xpZW50IElEIHByb3ZpZGVkIGlzIGVpdGhlciBpbnZhbGlkIG9yIGRvZXMgbm90IG1hdGNoIHRoZSAnICtcbiAgICAgICdzcGVjaWZpZWQgQVBJIGtleS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfT1JJR0lOXTpcbiAgICAgICdUaGlzIGRvbWFpbiBpcyBub3QgYXV0aG9yaXplZCBmb3IgT0F1dGggb3BlcmF0aW9ucyBmb3IgeW91ciBGaXJlYmFzZSAnICtcbiAgICAgICdwcm9qZWN0LiBFZGl0IHRoZSBsaXN0IG9mIGF1dGhvcml6ZWQgZG9tYWlucyBmcm9tIHRoZSBGaXJlYmFzZSBjb25zb2xlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9PT0JfQ09ERV06XG4gICAgICAnVGhlIGFjdGlvbiBjb2RlIGlzIGludmFsaWQuIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgY29kZSBpcyBtYWxmb3JtZWQsICcgK1xuICAgICAgJ2V4cGlyZWQsIG9yIGhhcyBhbHJlYWR5IGJlZW4gdXNlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUEFTU1dPUkRdOlxuICAgICAgJ1RoZSBwYXNzd29yZCBpcyBpbnZhbGlkIG9yIHRoZSB1c2VyIGRvZXMgbm90IGhhdmUgYSBwYXNzd29yZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUEVSU0lTVEVOQ0VdOlxuICAgICAgJ1RoZSBzcGVjaWZpZWQgcGVyc2lzdGVuY2UgdHlwZSBpcyBpbnZhbGlkLiBJdCBjYW4gb25seSBiZSBsb2NhbCwgc2Vzc2lvbiBvciBub25lLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9QSE9ORV9OVU1CRVJdOlxuICAgICAgJ1RoZSBmb3JtYXQgb2YgdGhlIHBob25lIG51bWJlciBwcm92aWRlZCBpcyBpbmNvcnJlY3QuIFBsZWFzZSBlbnRlciB0aGUgJyArXG4gICAgICAncGhvbmUgbnVtYmVyIGluIGEgZm9ybWF0IHRoYXQgY2FuIGJlIHBhcnNlZCBpbnRvIEUuMTY0IGZvcm1hdC4gRS4xNjQgJyArXG4gICAgICAncGhvbmUgbnVtYmVycyBhcmUgd3JpdHRlbiBpbiB0aGUgZm9ybWF0IFsrXVtjb3VudHJ5IGNvZGVdW3N1YnNjcmliZXIgJyArXG4gICAgICAnbnVtYmVyIGluY2x1ZGluZyBhcmVhIGNvZGVdLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9QUk9WSURFUl9JRF06XG4gICAgICAnVGhlIHNwZWNpZmllZCBwcm92aWRlciBJRCBpcyBpbnZhbGlkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9SRUNJUElFTlRfRU1BSUxdOlxuICAgICAgJ1RoZSBlbWFpbCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYWN0aW9uIGZhaWxlZCB0byBzZW5kIGFzIHRoZSBwcm92aWRlZCAnICtcbiAgICAgICdyZWNpcGllbnQgZW1haWwgYWRkcmVzcyBpcyBpbnZhbGlkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9TRU5ERVJdOlxuICAgICAgJ1RoZSBlbWFpbCB0ZW1wbGF0ZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYWN0aW9uIGNvbnRhaW5zIGFuIGludmFsaWQgc2VuZGVyIGVtYWlsIG9yIG5hbWUuICcgK1xuICAgICAgJ1BsZWFzZSBmaXggYnkgZ29pbmcgdG8gdGhlIEF1dGggZW1haWwgdGVtcGxhdGVzIHNlY3Rpb24gaW4gdGhlIEZpcmViYXNlIENvbnNvbGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1NFU1NJT05fSU5GT106XG4gICAgICAnVGhlIHZlcmlmaWNhdGlvbiBJRCB1c2VkIHRvIGNyZWF0ZSB0aGUgcGhvbmUgYXV0aCBjcmVkZW50aWFsIGlzIGludmFsaWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1RFTkFOVF9JRF06XG4gICAgICBcIlRoZSBBdXRoIGluc3RhbmNlJ3MgdGVuYW50IElEIGlzIGludmFsaWQuXCIsXG4gICAgW0F1dGhFcnJvckNvZGUuTE9HSU5fQkxPQ0tFRF06XG4gICAgICAnTG9naW4gYmxvY2tlZCBieSB1c2VyLXByb3ZpZGVkIG1ldGhvZDogeyRvcmlnaW5hbE1lc3NhZ2V9JyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FXTpcbiAgICAgICdBbiBBbmRyb2lkIFBhY2thZ2UgTmFtZSBtdXN0IGJlIHByb3ZpZGVkIGlmIHRoZSBBbmRyb2lkIEFwcCBpcyByZXF1aXJlZCB0byBiZSBpbnN0YWxsZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0FVVEhfRE9NQUlOXTpcbiAgICAgICdCZSBzdXJlIHRvIGluY2x1ZGUgYXV0aERvbWFpbiB3aGVuIGNhbGxpbmcgZmlyZWJhc2UuaW5pdGlhbGl6ZUFwcCgpLCAnICtcbiAgICAgICdieSBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgRmlyZWJhc2UgY29uc29sZS4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVBQX0NSRURFTlRJQUxdOlxuICAgICAgJ1RoZSBwaG9uZSB2ZXJpZmljYXRpb24gcmVxdWVzdCBpcyBtaXNzaW5nIGFuIGFwcGxpY2F0aW9uIHZlcmlmaWVyICcgK1xuICAgICAgJ2Fzc2VydGlvbi4gQSByZUNBUFRDSEEgcmVzcG9uc2UgdG9rZW4gbmVlZHMgdG8gYmUgcHJvdmlkZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NPREVdOlxuICAgICAgJ1RoZSBwaG9uZSBhdXRoIGNyZWRlbnRpYWwgd2FzIGNyZWF0ZWQgd2l0aCBhbiBlbXB0eSBTTVMgdmVyaWZpY2F0aW9uIGNvZGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NPTlRJTlVFX1VSSV06XG4gICAgICAnQSBjb250aW51ZSBVUkwgbXVzdCBiZSBwcm92aWRlZCBpbiB0aGUgcmVxdWVzdC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfSUZSQU1FX1NUQVJUXTogJ0FuIGludGVybmFsIEF1dGhFcnJvciBoYXMgb2NjdXJyZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0lPU19CVU5ETEVfSURdOlxuICAgICAgJ0FuIGlPUyBCdW5kbGUgSUQgbXVzdCBiZSBwcm92aWRlZCBpZiBhbiBBcHAgU3RvcmUgSUQgaXMgcHJvdmlkZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX09SX0lOVkFMSURfTk9OQ0VdOlxuICAgICAgJ1RoZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBub25jZS4gVGhpcyBjYW4gb2NjdXIgaWYgdGhlICcgK1xuICAgICAgJ1NIQS0yNTYgaGFzaCBvZiB0aGUgcHJvdmlkZWQgcmF3IG5vbmNlIGRvZXMgbm90IG1hdGNoIHRoZSBoYXNoZWQgbm9uY2UgJyArXG4gICAgICAnaW4gdGhlIElEIHRva2VuIHBheWxvYWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX1BBU1NXT1JEXTogJ0Egbm9uLWVtcHR5IHBhc3N3b3JkIG11c3QgYmUgcHJvdmlkZWQnLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfTUZBX0lORk9dOlxuICAgICAgJ05vIHNlY29uZCBmYWN0b3IgaWRlbnRpZmllciBpcyBwcm92aWRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfTUZBX1NFU1NJT05dOlxuICAgICAgJ1RoZSByZXF1ZXN0IGlzIG1pc3NpbmcgcHJvb2Ygb2YgZmlyc3QgZmFjdG9yIHN1Y2Nlc3NmdWwgc2lnbi1pbi4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfUEhPTkVfTlVNQkVSXTpcbiAgICAgICdUbyBzZW5kIHZlcmlmaWNhdGlvbiBjb2RlcywgcHJvdmlkZSBhIHBob25lIG51bWJlciBmb3IgdGhlIHJlY2lwaWVudC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1JU1NJTkdfU0VTU0lPTl9JTkZPXTpcbiAgICAgICdUaGUgcGhvbmUgYXV0aCBjcmVkZW50aWFsIHdhcyBjcmVhdGVkIHdpdGggYW4gZW1wdHkgdmVyaWZpY2F0aW9uIElELicsXG4gICAgW0F1dGhFcnJvckNvZGUuTU9EVUxFX0RFU1RST1lFRF06XG4gICAgICAnVGhpcyBpbnN0YW5jZSBvZiBGaXJlYmFzZUFwcCBoYXMgYmVlbiBkZWxldGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUZBX0lORk9fTk9UX0ZPVU5EXTpcbiAgICAgICdUaGUgdXNlciBkb2VzIG5vdCBoYXZlIGEgc2Vjb25kIGZhY3RvciBtYXRjaGluZyB0aGUgaWRlbnRpZmllciBwcm92aWRlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRF06XG4gICAgICAnUHJvb2Ygb2Ygb3duZXJzaGlwIG9mIGEgc2Vjb25kIGZhY3RvciBpcyByZXF1aXJlZCB0byBjb21wbGV0ZSBzaWduLWluLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTkVFRF9DT05GSVJNQVRJT05dOlxuICAgICAgJ0FuIGFjY291bnQgYWxyZWFkeSBleGlzdHMgd2l0aCB0aGUgc2FtZSBlbWFpbCBhZGRyZXNzIGJ1dCBkaWZmZXJlbnQgJyArXG4gICAgICAnc2lnbi1pbiBjcmVkZW50aWFscy4gU2lnbiBpbiB1c2luZyBhIHByb3ZpZGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzICcgK1xuICAgICAgJ2VtYWlsIGFkZHJlc3MuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEXTpcbiAgICAgICdBIG5ldHdvcmsgQXV0aEVycm9yIChzdWNoIGFzIHRpbWVvdXQsIGludGVycnVwdGVkIGNvbm5lY3Rpb24gb3IgdW5yZWFjaGFibGUgaG9zdCkgaGFzIG9jY3VycmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTk9fQVVUSF9FVkVOVF06ICdBbiBpbnRlcm5hbCBBdXRoRXJyb3IgaGFzIG9jY3VycmVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTk9fU1VDSF9QUk9WSURFUl06XG4gICAgICAnVXNlciB3YXMgbm90IGxpbmtlZCB0byBhbiBhY2NvdW50IHdpdGggdGhlIGdpdmVuIHByb3ZpZGVyLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTlVMTF9VU0VSXTpcbiAgICAgICdBIG51bGwgdXNlciBvYmplY3Qgd2FzIHByb3ZpZGVkIGFzIHRoZSBhcmd1bWVudCBmb3IgYW4gb3BlcmF0aW9uIHdoaWNoICcgK1xuICAgICAgJ3JlcXVpcmVzIGEgbm9uLW51bGwgdXNlciBvYmplY3QuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX0FMTE9XRURdOlxuICAgICAgJ1RoZSBnaXZlbiBzaWduLWluIHByb3ZpZGVyIGlzIGRpc2FibGVkIGZvciB0aGlzIEZpcmViYXNlIHByb2plY3QuICcgK1xuICAgICAgJ0VuYWJsZSBpdCBpbiB0aGUgRmlyZWJhc2UgY29uc29sZSwgdW5kZXIgdGhlIHNpZ24taW4gbWV0aG9kIHRhYiBvZiB0aGUgJyArXG4gICAgICAnQXV0aCBzZWN0aW9uLicsXG4gICAgW0F1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURURdOlxuICAgICAgJ1RoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGVudmlyb25tZW50IHRoaXMgYXBwbGljYXRpb24gaXMgJyArXG4gICAgICAncnVubmluZyBvbi4gXCJsb2NhdGlvbi5wcm90b2NvbFwiIG11c3QgYmUgaHR0cCwgaHR0cHMgb3IgY2hyb21lLWV4dGVuc2lvbicgK1xuICAgICAgJyBhbmQgd2ViIHN0b3JhZ2UgbXVzdCBiZSBlbmFibGVkLicsXG4gICAgW0F1dGhFcnJvckNvZGUuUE9QVVBfQkxPQ0tFRF06XG4gICAgICAnVW5hYmxlIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgcG9wdXAuIEl0IG1heSBoYXZlIGJlZW4gYmxvY2tlZCBieSB0aGUgYnJvd3Nlci4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlBPUFVQX0NMT1NFRF9CWV9VU0VSXTpcbiAgICAgICdUaGUgcG9wdXAgaGFzIGJlZW4gY2xvc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZSBmaW5hbGl6aW5nIHRoZSBvcGVyYXRpb24uJyxcbiAgICBbQXV0aEVycm9yQ29kZS5QUk9WSURFUl9BTFJFQURZX0xJTktFRF06XG4gICAgICAnVXNlciBjYW4gb25seSBiZSBsaW5rZWQgdG8gb25lIGlkZW50aXR5IGZvciB0aGUgZ2l2ZW4gcHJvdmlkZXIuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5RVU9UQV9FWENFRURFRF06XG4gICAgICBcIlRoZSBwcm9qZWN0J3MgcXVvdGEgZm9yIHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIGV4Y2VlZGVkLlwiLFxuICAgIFtBdXRoRXJyb3JDb2RlLlJFRElSRUNUX0NBTkNFTExFRF9CWV9VU0VSXTpcbiAgICAgICdUaGUgcmVkaXJlY3Qgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB0aGUgdXNlciBiZWZvcmUgZmluYWxpemluZy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlJFRElSRUNUX09QRVJBVElPTl9QRU5ESU5HXTpcbiAgICAgICdBIHJlZGlyZWN0IHNpZ24taW4gb3BlcmF0aW9uIGlzIGFscmVhZHkgcGVuZGluZy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlJFSkVDVEVEX0NSRURFTlRJQUxdOlxuICAgICAgJ1RoZSByZXF1ZXN0IGNvbnRhaW5zIG1hbGZvcm1lZCBvciBtaXNtYXRjaGluZyBjcmVkZW50aWFscy4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlNFQ09ORF9GQUNUT1JfQUxSRUFEWV9FTlJPTExFRF06XG4gICAgICAnVGhlIHNlY29uZCBmYWN0b3IgaXMgYWxyZWFkeSBlbnJvbGxlZCBvbiB0aGlzIGFjY291bnQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5TRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEXTpcbiAgICAgICdUaGUgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBzZWNvbmQgZmFjdG9ycyBvbiBhIHVzZXIgaGFzIGJlZW4gZXhjZWVkZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5URU5BTlRfSURfTUlTTUFUQ0hdOlxuICAgICAgXCJUaGUgcHJvdmlkZWQgdGVuYW50IElEIGRvZXMgbm90IG1hdGNoIHRoZSBBdXRoIGluc3RhbmNlJ3MgdGVuYW50IElEXCIsXG4gICAgW0F1dGhFcnJvckNvZGUuVElNRU9VVF06ICdUaGUgb3BlcmF0aW9uIGhhcyB0aW1lZCBvdXQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5UT0tFTl9FWFBJUkVEXTpcbiAgICAgIFwiVGhlIHVzZXIncyBjcmVkZW50aWFsIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhlIHVzZXIgbXVzdCBzaWduIGluIGFnYWluLlwiLFxuICAgIFtBdXRoRXJyb3JDb2RlLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUl06XG4gICAgICAnV2UgaGF2ZSBibG9ja2VkIGFsbCByZXF1ZXN0cyBmcm9tIHRoaXMgZGV2aWNlIGR1ZSB0byB1bnVzdWFsIGFjdGl2aXR5LiAnICtcbiAgICAgICdUcnkgYWdhaW4gbGF0ZXIuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTkFVVEhPUklaRURfRE9NQUlOXTpcbiAgICAgICdUaGUgZG9tYWluIG9mIHRoZSBjb250aW51ZSBVUkwgaXMgbm90IHdoaXRlbGlzdGVkLiAgUGxlYXNlIHdoaXRlbGlzdCAnICtcbiAgICAgICd0aGUgZG9tYWluIGluIHRoZSBGaXJlYmFzZSBjb25zb2xlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuVU5TVVBQT1JURURfRklSU1RfRkFDVE9SXTpcbiAgICAgICdFbnJvbGxpbmcgYSBzZWNvbmQgZmFjdG9yIG9yIHNpZ25pbmcgaW4gd2l0aCBhIG11bHRpLWZhY3RvciBhY2NvdW50IHJlcXVpcmVzIHNpZ24taW4gd2l0aCBhIHN1cHBvcnRlZCBmaXJzdCBmYWN0b3IuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9QRVJTSVNURU5DRV06XG4gICAgICAnVGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbmNlIHR5cGUuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OXTpcbiAgICAgICdUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIGEgbXVsdGktdGVuYW50IGNvbnRleHQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VTlZFUklGSUVEX0VNQUlMXTpcbiAgICAgICdUaGUgb3BlcmF0aW9uIHJlcXVpcmVzIGEgdmVyaWZpZWQgZW1haWwuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX0NBTkNFTExFRF06XG4gICAgICAnVGhlIHVzZXIgZGlkIG5vdCBncmFudCB5b3VyIGFwcGxpY2F0aW9uIHRoZSBwZXJtaXNzaW9ucyBpdCByZXF1ZXN0ZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX0RFTEVURURdOlxuICAgICAgJ1RoZXJlIGlzIG5vIHVzZXIgcmVjb3JkIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZGVudGlmaWVyLiBUaGUgdXNlciBtYXkgJyArXG4gICAgICAnaGF2ZSBiZWVuIGRlbGV0ZWQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX0RJU0FCTEVEXTpcbiAgICAgICdUaGUgdXNlciBhY2NvdW50IGhhcyBiZWVuIGRpc2FibGVkIGJ5IGFuIGFkbWluaXN0cmF0b3IuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX01JU01BVENIXTpcbiAgICAgICdUaGUgc3VwcGxpZWQgY3JlZGVudGlhbHMgZG8gbm90IGNvcnJlc3BvbmQgdG8gdGhlIHByZXZpb3VzbHkgc2lnbmVkIGluIHVzZXIuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5VU0VSX1NJR05FRF9PVVRdOiAnJyxcbiAgICBbQXV0aEVycm9yQ29kZS5XRUFLX1BBU1NXT1JEXTpcbiAgICAgICdUaGUgcGFzc3dvcmQgbXVzdCBiZSA2IGNoYXJhY3RlcnMgbG9uZyBvciBtb3JlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuV0VCX1NUT1JBR0VfVU5TVVBQT1JURURdOlxuICAgICAgJ1RoaXMgYnJvd3NlciBpcyBub3Qgc3VwcG9ydGVkIG9yIDNyZCBwYXJ0eSBjb29raWVzIGFuZCBkYXRhIG1heSBiZSBkaXNhYmxlZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLkFMUkVBRFlfSU5JVElBTElaRURdOlxuICAgICAgJ2luaXRpYWxpemVBdXRoKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgd2l0aCAnICtcbiAgICAgICdkaWZmZXJlbnQgb3B0aW9ucy4gVG8gYXZvaWQgdGhpcyBlcnJvciwgY2FsbCBpbml0aWFsaXplQXV0aCgpIHdpdGggdGhlICcgK1xuICAgICAgJ3NhbWUgb3B0aW9ucyBhcyB3aGVuIGl0IHdhcyBvcmlnaW5hbGx5IGNhbGxlZCwgb3IgY2FsbCBnZXRBdXRoKCkgdG8gcmV0dXJuIHRoZScgK1xuICAgICAgJyBhbHJlYWR5IGluaXRpYWxpemVkIGluc3RhbmNlLicsXG4gICAgW0F1dGhFcnJvckNvZGUuTUlTU0lOR19SRUNBUFRDSEFfVE9LRU5dOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgdG9rZW4gaXMgbWlzc2luZyB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVDQVBUQ0hBX1RPS0VOXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIHRva2VuIGlzIGludmFsaWQgd2hlbiBzZW5kaW5nIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9BQ1RJT05dOlxuICAgICAgJ1RoZSByZUNBUFRDSEEgYWN0aW9uIGlzIGludmFsaWQgd2hlbiBzZW5kaW5nIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5SRUNBUFRDSEFfTk9UX0VOQUJMRURdOlxuICAgICAgJ3JlQ0FQVENIQSBFbnRlcnByaXNlIGludGVncmF0aW9uIGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIHByb2plY3QuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NMSUVOVF9UWVBFXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIGNsaWVudCB0eXBlIGlzIG1pc3Npbmcgd2hlbiBzZW5kaW5nIHJlcXVlc3QgdG8gdGhlIGJhY2tlbmQuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIHZlcnNpb24gaXMgbWlzc2luZyB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLklOVkFMSURfUkVRX1RZUEVdOiAnSW52YWxpZCByZXF1ZXN0IHBhcmFtZXRlcnMuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OXTpcbiAgICAgICdUaGUgcmVDQVBUQ0hBIHZlcnNpb24gaXMgaW52YWxpZCB3aGVuIHNlbmRpbmcgcmVxdWVzdCB0byB0aGUgYmFja2VuZC4nLFxuICAgIFtBdXRoRXJyb3JDb2RlLlVOU1VQUE9SVEVEX1BBU1NXT1JEX1BPTElDWV9TQ0hFTUFfVkVSU0lPTl06XG4gICAgICAnVGhlIHBhc3N3b3JkIHBvbGljeSByZWNlaXZlZCBmcm9tIHRoZSBiYWNrZW5kIHVzZXMgYSBzY2hlbWEgdmVyc2lvbiB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIHRoZSBGaXJlYmFzZSBTREsuJyxcbiAgICBbQXV0aEVycm9yQ29kZS5QQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UU106XG4gICAgICAnVGhlIHBhc3N3b3JkIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cy4nXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXJyb3JNYXBSZXRyaWV2ZXIgZXh0ZW5kcyBBdXRoRXJyb3JNYXAge1xuICAoKTogRXJyb3JNYXA8QXV0aEVycm9yQ29kZT47XG59XG5cbmZ1bmN0aW9uIF9wcm9kRXJyb3JNYXAoKTogRXJyb3JNYXA8QXV0aEVycm9yQ29kZT4ge1xuICAvLyBXZSB3aWxsIGluY2x1ZGUgdGhpcyBvbmUgbWVzc2FnZSBpbiB0aGUgcHJvZCBlcnJvciBtYXAgc2luY2UgYnkgdGhlIHZlcnlcbiAgLy8gbmF0dXJlIG9mIHRoaXMgZXJyb3IsIGRldmVsb3BlcnMgd2lsbCBuZXZlciBiZSBhYmxlIHRvIHNlZSB0aGUgbWVzc2FnZVxuICAvLyB1c2luZyB0aGUgZGVidWdFcnJvck1hcCAod2hpY2ggaXMgaW5zdGFsbGVkIGR1cmluZyBhdXRoIGluaXRpYWxpemF0aW9uKS5cbiAgcmV0dXJuIHtcbiAgICBbQXV0aEVycm9yQ29kZS5ERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEhdOlxuICAgICAgJ0Fub3RoZXIgRmlyZWJhc2UgU0RLIHdhcyBpbml0aWFsaXplZCBhbmQgaXMgdHJ5aW5nIHRvIHVzZSBBdXRoIGJlZm9yZSBBdXRoIGlzICcgK1xuICAgICAgJ2luaXRpYWxpemVkLiBQbGVhc2UgYmUgc3VyZSB0byBjYWxsIGBpbml0aWFsaXplQXV0aGAgb3IgYGdldEF1dGhgIGJlZm9yZSAnICtcbiAgICAgICdzdGFydGluZyBhbnkgb3RoZXIgRmlyZWJhc2UgU0RLLidcbiAgfSBhcyBFcnJvck1hcDxBdXRoRXJyb3JDb2RlPjtcbn1cblxuLyoqXG4gKiBBIHZlcmJvc2UgZXJyb3IgbWFwIHdpdGggZGV0YWlsZWQgZGVzY3JpcHRpb25zIGZvciBtb3N0IGVycm9yIGNvZGVzLlxuICpcbiAqIFNlZSBkaXNjdXNzaW9uIGF0IHtAbGluayBBdXRoRXJyb3JNYXB9XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZGVidWdFcnJvck1hcDogQXV0aEVycm9yTWFwID0gX2RlYnVnRXJyb3JNYXA7XG5cbi8qKlxuICogQSBtaW5pbWFsIGVycm9yIG1hcCB3aXRoIGFsbCB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzIHN0cmlwcGVkLlxuICpcbiAqIFNlZSBkaXNjdXNzaW9uIGF0IHtAbGluayBBdXRoRXJyb3JNYXB9XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcHJvZEVycm9yTWFwOiBBdXRoRXJyb3JNYXAgPSBfcHJvZEVycm9yTWFwO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVkRXJyb3JQYXJhbXMge1xuICBhcHBOYW1lOiBBcHBOYW1lO1xuICBjcmVkZW50aWFsPzogQXV0aENyZWRlbnRpYWw7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwaG9uZU51bWJlcj86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIHVzZXI/OiBVc2VyO1xuICBfc2VydmVyUmVzcG9uc2U/OiBvYmplY3Q7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbnR5cGUgR2VuZXJpY0F1dGhFcnJvclBhcmFtcyA9IHtcbiAgW2tleSBpbiBFeGNsdWRlPFxuICAgIEF1dGhFcnJvckNvZGUsXG4gICAgfCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICAgfCBBdXRoRXJyb3JDb2RlLkRFUEVOREVOVF9TREtfSU5JVF9CRUZPUkVfQVVUSFxuICAgIHwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICAgIHwgQXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRURcbiAgICB8IEF1dGhFcnJvckNvZGUuTk9fQVVUSF9FVkVOVFxuICAgIHwgQXV0aEVycm9yQ29kZS5PUEVSQVRJT05fTk9UX1NVUFBPUlRFRFxuICA+XToge1xuICAgIGFwcE5hbWU/OiBBcHBOYW1lO1xuICAgIGVtYWlsPzogc3RyaW5nO1xuICAgIHBob25lTnVtYmVyPzogc3RyaW5nO1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gIH07XG59O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhFcnJvclBhcmFtcyBleHRlbmRzIEdlbmVyaWNBdXRoRXJyb3JQYXJhbXMge1xuICBbQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUl06IHsgYXBwTmFtZT86IEFwcE5hbWUgfTtcbiAgW0F1dGhFcnJvckNvZGUuREVQRU5ERU5UX1NES19JTklUX0JFRk9SRV9BVVRIXTogeyBhcHBOYW1lPzogQXBwTmFtZSB9O1xuICBbQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUl06IHsgYXBwTmFtZT86IEFwcE5hbWUgfTtcbiAgW0F1dGhFcnJvckNvZGUuTE9HSU5fQkxPQ0tFRF06IHtcbiAgICBhcHBOYW1lPzogQXBwTmFtZTtcbiAgICBvcmlnaW5hbE1lc3NhZ2U/OiBzdHJpbmc7XG4gIH07XG4gIFtBdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfU1VQUE9SVEVEXTogeyBhcHBOYW1lPzogQXBwTmFtZSB9O1xuICBbQXV0aEVycm9yQ29kZS5OT19BVVRIX0VWRU5UXTogeyBhcHBOYW1lPzogQXBwTmFtZSB9O1xuICBbQXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRURdOiB7XG4gICAgYXBwTmFtZTogQXBwTmFtZTtcbiAgICBfc2VydmVyUmVzcG9uc2U6IElkVG9rZW5NZmFSZXNwb25zZTtcbiAgfTtcbiAgW0F1dGhFcnJvckNvZGUuSU5WQUxJRF9DT1JET1ZBX0NPTkZJR1VSQVRJT05dOiB7XG4gICAgYXBwTmFtZTogQXBwTmFtZTtcbiAgICBtaXNzaW5nUGx1Z2luPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgY29uc3QgX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZID0gbmV3IEVycm9yRmFjdG9yeTxcbiAgQXV0aEVycm9yQ29kZSxcbiAgQXV0aEVycm9yUGFyYW1zXG4+KCdhdXRoJywgJ0ZpcmViYXNlJywgX3Byb2RFcnJvck1hcCgpKTtcblxuLyoqXG4gKiBBIG1hcCBvZiBwb3RlbnRpYWwgYEF1dGhgIGVycm9yIGNvZGVzLCBmb3IgZWFzaWVyIGNvbXBhcmlzb24gd2l0aCBlcnJvcnNcbiAqIHRocm93biBieSB0aGUgU0RLLlxuICpcbiAqIEByZW1hcmtzXG4gKiBOb3RlIHRoYXQgeW91IGNhbid0IHRyZWUtc2hha2UgaW5kaXZpZHVhbCBrZXlzXG4gKiBpbiB0aGUgbWFwLCBzbyBieSB1c2luZyB0aGUgbWFwIHlvdSBtaWdodCBzdWJzdGFudGlhbGx5IGluY3JlYXNlIHlvdXJcbiAqIGJ1bmRsZSBzaXplLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IEFVVEhfRVJST1JfQ09ERVNfTUFQX0RPX05PVF9VU0VfSU5URVJOQUxMWSA9IHtcbiAgQURNSU5fT05MWV9PUEVSQVRJT046ICdhdXRoL2FkbWluLXJlc3RyaWN0ZWQtb3BlcmF0aW9uJyxcbiAgQVJHVU1FTlRfRVJST1I6ICdhdXRoL2FyZ3VtZW50LWVycm9yJyxcbiAgQVBQX05PVF9BVVRIT1JJWkVEOiAnYXV0aC9hcHAtbm90LWF1dGhvcml6ZWQnLFxuICBBUFBfTk9UX0lOU1RBTExFRDogJ2F1dGgvYXBwLW5vdC1pbnN0YWxsZWQnLFxuICBDQVBUQ0hBX0NIRUNLX0ZBSUxFRDogJ2F1dGgvY2FwdGNoYS1jaGVjay1mYWlsZWQnLFxuICBDT0RFX0VYUElSRUQ6ICdhdXRoL2NvZGUtZXhwaXJlZCcsXG4gIENPUkRPVkFfTk9UX1JFQURZOiAnYXV0aC9jb3Jkb3ZhLW5vdC1yZWFkeScsXG4gIENPUlNfVU5TVVBQT1JURUQ6ICdhdXRoL2NvcnMtdW5zdXBwb3J0ZWQnLFxuICBDUkVERU5USUFMX0FMUkVBRFlfSU5fVVNFOiAnYXV0aC9jcmVkZW50aWFsLWFscmVhZHktaW4tdXNlJyxcbiAgQ1JFREVOVElBTF9NSVNNQVRDSDogJ2F1dGgvY3VzdG9tLXRva2VuLW1pc21hdGNoJyxcbiAgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOOiAnYXV0aC9yZXF1aXJlcy1yZWNlbnQtbG9naW4nLFxuICBERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEg6ICdhdXRoL2RlcGVuZGVudC1zZGstaW5pdGlhbGl6ZWQtYmVmb3JlLWF1dGgnLFxuICBEWU5BTUlDX0xJTktfTk9UX0FDVElWQVRFRDogJ2F1dGgvZHluYW1pYy1saW5rLW5vdC1hY3RpdmF0ZWQnLFxuICBFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OOiAnYXV0aC9lbWFpbC1jaGFuZ2UtbmVlZHMtdmVyaWZpY2F0aW9uJyxcbiAgRU1BSUxfRVhJU1RTOiAnYXV0aC9lbWFpbC1hbHJlYWR5LWluLXVzZScsXG4gIEVNVUxBVE9SX0NPTkZJR19GQUlMRUQ6ICdhdXRoL2VtdWxhdG9yLWNvbmZpZy1mYWlsZWQnLFxuICBFWFBJUkVEX09PQl9DT0RFOiAnYXV0aC9leHBpcmVkLWFjdGlvbi1jb2RlJyxcbiAgRVhQSVJFRF9QT1BVUF9SRVFVRVNUOiAnYXV0aC9jYW5jZWxsZWQtcG9wdXAtcmVxdWVzdCcsXG4gIElOVEVSTkFMX0VSUk9SOiAnYXV0aC9pbnRlcm5hbC1lcnJvcicsXG4gIElOVkFMSURfQVBJX0tFWTogJ2F1dGgvaW52YWxpZC1hcGkta2V5JyxcbiAgSU5WQUxJRF9BUFBfQ1JFREVOVElBTDogJ2F1dGgvaW52YWxpZC1hcHAtY3JlZGVudGlhbCcsXG4gIElOVkFMSURfQVBQX0lEOiAnYXV0aC9pbnZhbGlkLWFwcC1pZCcsXG4gIElOVkFMSURfQVVUSDogJ2F1dGgvaW52YWxpZC11c2VyLXRva2VuJyxcbiAgSU5WQUxJRF9BVVRIX0VWRU5UOiAnYXV0aC9pbnZhbGlkLWF1dGgtZXZlbnQnLFxuICBJTlZBTElEX0NFUlRfSEFTSDogJ2F1dGgvaW52YWxpZC1jZXJ0LWhhc2gnLFxuICBJTlZBTElEX0NPREU6ICdhdXRoL2ludmFsaWQtdmVyaWZpY2F0aW9uLWNvZGUnLFxuICBJTlZBTElEX0NPTlRJTlVFX1VSSTogJ2F1dGgvaW52YWxpZC1jb250aW51ZS11cmknLFxuICBJTlZBTElEX0NPUkRPVkFfQ09ORklHVVJBVElPTjogJ2F1dGgvaW52YWxpZC1jb3Jkb3ZhLWNvbmZpZ3VyYXRpb24nLFxuICBJTlZBTElEX0NVU1RPTV9UT0tFTjogJ2F1dGgvaW52YWxpZC1jdXN0b20tdG9rZW4nLFxuICBJTlZBTElEX0RZTkFNSUNfTElOS19ET01BSU46ICdhdXRoL2ludmFsaWQtZHluYW1pYy1saW5rLWRvbWFpbicsXG4gIElOVkFMSURfRU1BSUw6ICdhdXRoL2ludmFsaWQtZW1haWwnLFxuICBJTlZBTElEX0VNVUxBVE9SX1NDSEVNRTogJ2F1dGgvaW52YWxpZC1lbXVsYXRvci1zY2hlbWUnLFxuICBJTlZBTElEX0lEUF9SRVNQT05TRTogJ2F1dGgvaW52YWxpZC1jcmVkZW50aWFsJyxcbiAgSU5WQUxJRF9NRVNTQUdFX1BBWUxPQUQ6ICdhdXRoL2ludmFsaWQtbWVzc2FnZS1wYXlsb2FkJyxcbiAgSU5WQUxJRF9NRkFfU0VTU0lPTjogJ2F1dGgvaW52YWxpZC1tdWx0aS1mYWN0b3Itc2Vzc2lvbicsXG4gIElOVkFMSURfT0FVVEhfQ0xJRU5UX0lEOiAnYXV0aC9pbnZhbGlkLW9hdXRoLWNsaWVudC1pZCcsXG4gIElOVkFMSURfT0FVVEhfUFJPVklERVI6ICdhdXRoL2ludmFsaWQtb2F1dGgtcHJvdmlkZXInLFxuICBJTlZBTElEX09PQl9DT0RFOiAnYXV0aC9pbnZhbGlkLWFjdGlvbi1jb2RlJyxcbiAgSU5WQUxJRF9PUklHSU46ICdhdXRoL3VuYXV0aG9yaXplZC1kb21haW4nLFxuICBJTlZBTElEX1BBU1NXT1JEOiAnYXV0aC93cm9uZy1wYXNzd29yZCcsXG4gIElOVkFMSURfUEVSU0lTVEVOQ0U6ICdhdXRoL2ludmFsaWQtcGVyc2lzdGVuY2UtdHlwZScsXG4gIElOVkFMSURfUEhPTkVfTlVNQkVSOiAnYXV0aC9pbnZhbGlkLXBob25lLW51bWJlcicsXG4gIElOVkFMSURfUFJPVklERVJfSUQ6ICdhdXRoL2ludmFsaWQtcHJvdmlkZXItaWQnLFxuICBJTlZBTElEX1JFQ0lQSUVOVF9FTUFJTDogJ2F1dGgvaW52YWxpZC1yZWNpcGllbnQtZW1haWwnLFxuICBJTlZBTElEX1NFTkRFUjogJ2F1dGgvaW52YWxpZC1zZW5kZXInLFxuICBJTlZBTElEX1NFU1NJT05fSU5GTzogJ2F1dGgvaW52YWxpZC12ZXJpZmljYXRpb24taWQnLFxuICBJTlZBTElEX1RFTkFOVF9JRDogJ2F1dGgvaW52YWxpZC10ZW5hbnQtaWQnLFxuICBNRkFfSU5GT19OT1RfRk9VTkQ6ICdhdXRoL211bHRpLWZhY3Rvci1pbmZvLW5vdC1mb3VuZCcsXG4gIE1GQV9SRVFVSVJFRDogJ2F1dGgvbXVsdGktZmFjdG9yLWF1dGgtcmVxdWlyZWQnLFxuICBNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FOiAnYXV0aC9taXNzaW5nLWFuZHJvaWQtcGtnLW5hbWUnLFxuICBNSVNTSU5HX0FQUF9DUkVERU5USUFMOiAnYXV0aC9taXNzaW5nLWFwcC1jcmVkZW50aWFsJyxcbiAgTUlTU0lOR19BVVRIX0RPTUFJTjogJ2F1dGgvYXV0aC1kb21haW4tY29uZmlnLXJlcXVpcmVkJyxcbiAgTUlTU0lOR19DT0RFOiAnYXV0aC9taXNzaW5nLXZlcmlmaWNhdGlvbi1jb2RlJyxcbiAgTUlTU0lOR19DT05USU5VRV9VUkk6ICdhdXRoL21pc3NpbmctY29udGludWUtdXJpJyxcbiAgTUlTU0lOR19JRlJBTUVfU1RBUlQ6ICdhdXRoL21pc3NpbmctaWZyYW1lLXN0YXJ0JyxcbiAgTUlTU0lOR19JT1NfQlVORExFX0lEOiAnYXV0aC9taXNzaW5nLWlvcy1idW5kbGUtaWQnLFxuICBNSVNTSU5HX09SX0lOVkFMSURfTk9OQ0U6ICdhdXRoL21pc3Npbmctb3ItaW52YWxpZC1ub25jZScsXG4gIE1JU1NJTkdfTUZBX0lORk86ICdhdXRoL21pc3NpbmctbXVsdGktZmFjdG9yLWluZm8nLFxuICBNSVNTSU5HX01GQV9TRVNTSU9OOiAnYXV0aC9taXNzaW5nLW11bHRpLWZhY3Rvci1zZXNzaW9uJyxcbiAgTUlTU0lOR19QSE9ORV9OVU1CRVI6ICdhdXRoL21pc3NpbmctcGhvbmUtbnVtYmVyJyxcbiAgTUlTU0lOR19TRVNTSU9OX0lORk86ICdhdXRoL21pc3NpbmctdmVyaWZpY2F0aW9uLWlkJyxcbiAgTU9EVUxFX0RFU1RST1lFRDogJ2F1dGgvYXBwLWRlbGV0ZWQnLFxuICBORUVEX0NPTkZJUk1BVElPTjogJ2F1dGgvYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbCcsXG4gIE5FVFdPUktfUkVRVUVTVF9GQUlMRUQ6ICdhdXRoL25ldHdvcmstcmVxdWVzdC1mYWlsZWQnLFxuICBOVUxMX1VTRVI6ICdhdXRoL251bGwtdXNlcicsXG4gIE5PX0FVVEhfRVZFTlQ6ICdhdXRoL25vLWF1dGgtZXZlbnQnLFxuICBOT19TVUNIX1BST1ZJREVSOiAnYXV0aC9uby1zdWNoLXByb3ZpZGVyJyxcbiAgT1BFUkFUSU9OX05PVF9BTExPV0VEOiAnYXV0aC9vcGVyYXRpb24tbm90LWFsbG93ZWQnLFxuICBPUEVSQVRJT05fTk9UX1NVUFBPUlRFRDogJ2F1dGgvb3BlcmF0aW9uLW5vdC1zdXBwb3J0ZWQtaW4tdGhpcy1lbnZpcm9ubWVudCcsXG4gIFBPUFVQX0JMT0NLRUQ6ICdhdXRoL3BvcHVwLWJsb2NrZWQnLFxuICBQT1BVUF9DTE9TRURfQllfVVNFUjogJ2F1dGgvcG9wdXAtY2xvc2VkLWJ5LXVzZXInLFxuICBQUk9WSURFUl9BTFJFQURZX0xJTktFRDogJ2F1dGgvcHJvdmlkZXItYWxyZWFkeS1saW5rZWQnLFxuICBRVU9UQV9FWENFRURFRDogJ2F1dGgvcXVvdGEtZXhjZWVkZWQnLFxuICBSRURJUkVDVF9DQU5DRUxMRURfQllfVVNFUjogJ2F1dGgvcmVkaXJlY3QtY2FuY2VsbGVkLWJ5LXVzZXInLFxuICBSRURJUkVDVF9PUEVSQVRJT05fUEVORElORzogJ2F1dGgvcmVkaXJlY3Qtb3BlcmF0aW9uLXBlbmRpbmcnLFxuICBSRUpFQ1RFRF9DUkVERU5USUFMOiAnYXV0aC9yZWplY3RlZC1jcmVkZW50aWFsJyxcbiAgU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVEOiAnYXV0aC9zZWNvbmQtZmFjdG9yLWFscmVhZHktaW4tdXNlJyxcbiAgU0VDT05EX0ZBQ1RPUl9MSU1JVF9FWENFRURFRDogJ2F1dGgvbWF4aW11bS1zZWNvbmQtZmFjdG9yLWNvdW50LWV4Y2VlZGVkJyxcbiAgVEVOQU5UX0lEX01JU01BVENIOiAnYXV0aC90ZW5hbnQtaWQtbWlzbWF0Y2gnLFxuICBUSU1FT1VUOiAnYXV0aC90aW1lb3V0JyxcbiAgVE9LRU5fRVhQSVJFRDogJ2F1dGgvdXNlci10b2tlbi1leHBpcmVkJyxcbiAgVE9PX01BTllfQVRURU1QVFNfVFJZX0xBVEVSOiAnYXV0aC90b28tbWFueS1yZXF1ZXN0cycsXG4gIFVOQVVUSE9SSVpFRF9ET01BSU46ICdhdXRoL3VuYXV0aG9yaXplZC1jb250aW51ZS11cmknLFxuICBVTlNVUFBPUlRFRF9GSVJTVF9GQUNUT1I6ICdhdXRoL3Vuc3VwcG9ydGVkLWZpcnN0LWZhY3RvcicsXG4gIFVOU1VQUE9SVEVEX1BFUlNJU1RFTkNFOiAnYXV0aC91bnN1cHBvcnRlZC1wZXJzaXN0ZW5jZS10eXBlJyxcbiAgVU5TVVBQT1JURURfVEVOQU5UX09QRVJBVElPTjogJ2F1dGgvdW5zdXBwb3J0ZWQtdGVuYW50LW9wZXJhdGlvbicsXG4gIFVOVkVSSUZJRURfRU1BSUw6ICdhdXRoL3VudmVyaWZpZWQtZW1haWwnLFxuICBVU0VSX0NBTkNFTExFRDogJ2F1dGgvdXNlci1jYW5jZWxsZWQnLFxuICBVU0VSX0RFTEVURUQ6ICdhdXRoL3VzZXItbm90LWZvdW5kJyxcbiAgVVNFUl9ESVNBQkxFRDogJ2F1dGgvdXNlci1kaXNhYmxlZCcsXG4gIFVTRVJfTUlTTUFUQ0g6ICdhdXRoL3VzZXItbWlzbWF0Y2gnLFxuICBVU0VSX1NJR05FRF9PVVQ6ICdhdXRoL3VzZXItc2lnbmVkLW91dCcsXG4gIFdFQUtfUEFTU1dPUkQ6ICdhdXRoL3dlYWstcGFzc3dvcmQnLFxuICBXRUJfU1RPUkFHRV9VTlNVUFBPUlRFRDogJ2F1dGgvd2ViLXN0b3JhZ2UtdW5zdXBwb3J0ZWQnLFxuICBBTFJFQURZX0lOSVRJQUxJWkVEOiAnYXV0aC9hbHJlYWR5LWluaXRpYWxpemVkJyxcbiAgUkVDQVBUQ0hBX05PVF9FTkFCTEVEOiAnYXV0aC9yZWNhcHRjaGEtbm90LWVuYWJsZWQnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9UT0tFTjogJ2F1dGgvbWlzc2luZy1yZWNhcHRjaGEtdG9rZW4nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9UT0tFTjogJ2F1dGgvaW52YWxpZC1yZWNhcHRjaGEtdG9rZW4nLFxuICBJTlZBTElEX1JFQ0FQVENIQV9BQ1RJT046ICdhdXRoL2ludmFsaWQtcmVjYXB0Y2hhLWFjdGlvbicsXG4gIE1JU1NJTkdfQ0xJRU5UX1RZUEU6ICdhdXRoL21pc3NpbmctY2xpZW50LXR5cGUnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OOiAnYXV0aC9taXNzaW5nLXJlY2FwdGNoYS12ZXJzaW9uJyxcbiAgSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTjogJ2F1dGgvaW52YWxpZC1yZWNhcHRjaGEtdmVyc2lvbicsXG4gIElOVkFMSURfUkVRX1RZUEU6ICdhdXRoL2ludmFsaWQtcmVxLXR5cGUnXG59IGFzIGNvbnN0O1xuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IExvZ2dlciwgTG9nTGV2ZWwgfSBmcm9tICdAZmlyZWJhc2UvbG9nZ2VyJztcbmltcG9ydCB7IFNES19WRVJTSU9OIH0gZnJvbSAnQGZpcmViYXNlL2FwcCc7XG5cbmV4cG9ydCB7IExvZ0xldmVsIH07XG5cbmNvbnN0IGxvZ0NsaWVudCA9IG5ldyBMb2dnZXIoJ0BmaXJlYmFzZS9hdXRoJyk7XG5cbi8vIEhlbHBlciBtZXRob2RzIGFyZSBuZWVkZWQgYmVjYXVzZSB2YXJpYWJsZXMgY2FuJ3QgYmUgZXhwb3J0ZWQgYXMgcmVhZC93cml0ZVxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRMb2dMZXZlbCgpOiBMb2dMZXZlbCB7XG4gIHJldHVybiBsb2dDbGllbnQubG9nTGV2ZWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfc2V0TG9nTGV2ZWwobmV3TGV2ZWw6IExvZ0xldmVsKTogdm9pZCB7XG4gIGxvZ0NsaWVudC5sb2dMZXZlbCA9IG5ld0xldmVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2xvZ0RlYnVnKG1zZzogc3RyaW5nLCAuLi5hcmdzOiBzdHJpbmdbXSk6IHZvaWQge1xuICBpZiAobG9nQ2xpZW50LmxvZ0xldmVsIDw9IExvZ0xldmVsLkRFQlVHKSB7XG4gICAgbG9nQ2xpZW50LmRlYnVnKGBBdXRoICgke1NES19WRVJTSU9OfSk6ICR7bXNnfWAsIC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfbG9nV2Fybihtc2c6IHN0cmluZywgLi4uYXJnczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGxvZ0NsaWVudC5sb2dMZXZlbCA8PSBMb2dMZXZlbC5XQVJOKSB7XG4gICAgbG9nQ2xpZW50Lndhcm4oYEF1dGggKCR7U0RLX1ZFUlNJT059KTogJHttc2d9YCwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9sb2dFcnJvcihtc2c6IHN0cmluZywgLi4uYXJnczogc3RyaW5nW10pOiB2b2lkIHtcbiAgaWYgKGxvZ0NsaWVudC5sb2dMZXZlbCA8PSBMb2dMZXZlbC5FUlJPUikge1xuICAgIGxvZ0NsaWVudC5lcnJvcihgQXV0aCAoJHtTREtfVkVSU0lPTn0pOiAke21zZ31gLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgRXJyb3JGYWN0b3J5LCBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQge1xuICBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlksXG4gIEF1dGhFcnJvckNvZGUsXG4gIEF1dGhFcnJvclBhcmFtcyxcbiAgcHJvZEVycm9yTWFwLFxuICBFcnJvck1hcFJldHJpZXZlclxufSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2xvZ0Vycm9yIH0gZnJvbSAnLi9sb2cnO1xuXG50eXBlIEF1dGhFcnJvckxpc3RQYXJhbXM8Sz4gPSBLIGV4dGVuZHMga2V5b2YgQXV0aEVycm9yUGFyYW1zXG4gID8gW0F1dGhFcnJvclBhcmFtc1tLXV1cbiAgOiBbXTtcbnR5cGUgTGVzc0FwcE5hbWU8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+ID0gT21pdDxBdXRoRXJyb3JQYXJhbXNbS10sICdhcHBOYW1lJz47XG5cbi8qKlxuICogVW5jb25kaXRpb25hbGx5IGZhaWxzLCB0aHJvd2luZyBhIGRldmVsb3BlciBmYWNpbmcgSU5URVJOQUxfRVJST1JcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRCk7ICAvLyBFcnJvcjogdGhlIE1GQV9SRVFVSVJFRCBlcnJvciBuZWVkcyBtb3JlIHBhcmFtcyB0aGFuIGFwcE5hbWVcbiAqIGZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRUQsIHtzZXJ2ZXJSZXNwb25zZX0pOyAgLy8gQ29tcGlsZXNcbiAqIGZhaWwoQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7ICAvLyBDb21waWxlczsgaW50ZXJuYWwgZXJyb3IgZG9lcyBub3QgbmVlZCBhcHBOYW1lXG4gKiBmYWlsKEF1dGhFcnJvckNvZGUuVVNFUl9ERUxFVEVEKTsgIC8vIEVycm9yOiBVU0VSX0RFTEVURUQgcmVxdWlyZXMgYXBwIG5hbWVcbiAqIGZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5VU0VSX0RFTEVURUQpOyAgLy8gQ29tcGlsZXM7IFVTRVJfREVMRVRFRCBfb25seV8gbmVlZHMgYXBwIG5hbWVcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhcHBOYW1lIEFwcCBuYW1lIGZvciB0YWdnaW5nIHRoZSBlcnJvclxuICogQHRocm93cyBGaXJlYmFzZUVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfZmFpbDxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4oXG4gIGNvZGU6IEssXG4gIC4uLmRhdGE6IHt9IGV4dGVuZHMgQXV0aEVycm9yUGFyYW1zW0tdXG4gICAgPyBbQXV0aEVycm9yUGFyYW1zW0tdP11cbiAgICA6IFtBdXRoRXJyb3JQYXJhbXNbS11dXG4pOiBuZXZlcjtcbmV4cG9ydCBmdW5jdGlvbiBfZmFpbDxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4oXG4gIGF1dGg6IEF1dGgsXG4gIGNvZGU6IEssXG4gIC4uLmRhdGE6IHt9IGV4dGVuZHMgTGVzc0FwcE5hbWU8Sz4gPyBbTGVzc0FwcE5hbWU8Sz4/XSA6IFtMZXNzQXBwTmFtZTxLPl1cbik6IG5ldmVyO1xuZXhwb3J0IGZ1bmN0aW9uIF9mYWlsPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXV0aE9yQ29kZTogQXV0aCB8IEssXG4gIC4uLnJlc3Q6IHVua25vd25bXVxuKTogbmV2ZXIge1xuICB0aHJvdyBjcmVhdGVFcnJvckludGVybmFsKGF1dGhPckNvZGUsIC4uLnJlc3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NyZWF0ZUVycm9yPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgY29kZTogSyxcbiAgLi4uZGF0YToge30gZXh0ZW5kcyBBdXRoRXJyb3JQYXJhbXNbS11cbiAgICA/IFtBdXRoRXJyb3JQYXJhbXNbS10/XVxuICAgIDogW0F1dGhFcnJvclBhcmFtc1tLXV1cbik6IEZpcmViYXNlRXJyb3I7XG5leHBvcnQgZnVuY3Rpb24gX2NyZWF0ZUVycm9yPEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXV0aDogQXV0aCxcbiAgY29kZTogSyxcbiAgLi4uZGF0YToge30gZXh0ZW5kcyBMZXNzQXBwTmFtZTxLPiA/IFtMZXNzQXBwTmFtZTxLPj9dIDogW0xlc3NBcHBOYW1lPEs+XVxuKTogRmlyZWJhc2VFcnJvcjtcbmV4cG9ydCBmdW5jdGlvbiBfY3JlYXRlRXJyb3I8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBhdXRoT3JDb2RlOiBBdXRoIHwgSyxcbiAgLi4ucmVzdDogdW5rbm93bltdXG4pOiBGaXJlYmFzZUVycm9yIHtcbiAgcmV0dXJuIGNyZWF0ZUVycm9ySW50ZXJuYWwoYXV0aE9yQ29kZSwgLi4ucmVzdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZShcbiAgYXV0aDogQXV0aCxcbiAgY29kZTogQXV0aEVycm9yQ29kZSxcbiAgbWVzc2FnZTogc3RyaW5nXG4pOiBGaXJlYmFzZUVycm9yIHtcbiAgY29uc3QgZXJyb3JNYXAgPSB7XG4gICAgLi4uKHByb2RFcnJvck1hcCBhcyBFcnJvck1hcFJldHJpZXZlcikoKSxcbiAgICBbY29kZV06IG1lc3NhZ2VcbiAgfTtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBFcnJvckZhY3Rvcnk8QXV0aEVycm9yQ29kZSwgQXV0aEVycm9yUGFyYW1zPihcbiAgICAnYXV0aCcsXG4gICAgJ0ZpcmViYXNlJyxcbiAgICBlcnJvck1hcFxuICApO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUoY29kZSwge1xuICAgIGFwcE5hbWU6IGF1dGgubmFtZVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9hc3NlcnRJbnN0YW5jZU9mKFxuICBhdXRoOiBBdXRoLFxuICBvYmplY3Q6IG9iamVjdCxcbiAgaW5zdGFuY2U6IHVua25vd25cbik6IHZvaWQge1xuICBjb25zdCBjb25zdHJ1Y3Rvckluc3RhbmNlID0gaW5zdGFuY2UgYXMgeyBuZXcgKC4uLmFyZ3M6IHVua25vd25bXSk6IHVua25vd24gfTtcbiAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgY29uc3RydWN0b3JJbnN0YW5jZSkpIHtcbiAgICBpZiAoY29uc3RydWN0b3JJbnN0YW5jZS5uYW1lICE9PSBvYmplY3QuY29uc3RydWN0b3IubmFtZSkge1xuICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgfVxuXG4gICAgdGhyb3cgX2Vycm9yV2l0aEN1c3RvbU1lc3NhZ2UoXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUixcbiAgICAgIGBUeXBlIG9mICR7b2JqZWN0LmNvbnN0cnVjdG9yLm5hbWV9IGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIGluc3RhbmNlLmAgK1xuICAgICAgICBgRGlkIHlvdSBwYXNzIGEgcmVmZXJlbmNlIGZyb20gYSBkaWZmZXJlbnQgQXV0aCBTREs/YFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JJbnRlcm5hbDxLIGV4dGVuZHMgQXV0aEVycm9yQ29kZT4oXG4gIGF1dGhPckNvZGU6IEF1dGggfCBLLFxuICAuLi5yZXN0OiB1bmtub3duW11cbik6IEZpcmViYXNlRXJyb3Ige1xuICBpZiAodHlwZW9mIGF1dGhPckNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY29kZSA9IHJlc3RbMF0gYXMgSztcbiAgICBjb25zdCBmdWxsUGFyYW1zID0gWy4uLnJlc3Quc2xpY2UoMSldIGFzIEF1dGhFcnJvckxpc3RQYXJhbXM8Sz47XG4gICAgaWYgKGZ1bGxQYXJhbXNbMF0pIHtcbiAgICAgIGZ1bGxQYXJhbXNbMF0uYXBwTmFtZSA9IGF1dGhPckNvZGUubmFtZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGF1dGhPckNvZGUgYXMgQXV0aEludGVybmFsKS5fZXJyb3JGYWN0b3J5LmNyZWF0ZShcbiAgICAgIGNvZGUsXG4gICAgICAuLi5mdWxsUGFyYW1zXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlkuY3JlYXRlKFxuICAgIGF1dGhPckNvZGUsXG4gICAgLi4uKHJlc3QgYXMgQXV0aEVycm9yTGlzdFBhcmFtczxLPilcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9hc3NlcnQ8SyBleHRlbmRzIEF1dGhFcnJvckNvZGU+KFxuICBhc3NlcnRpb246IHVua25vd24sXG4gIGNvZGU6IEssXG4gIC4uLmRhdGE6IHt9IGV4dGVuZHMgQXV0aEVycm9yUGFyYW1zW0tdXG4gICAgPyBbQXV0aEVycm9yUGFyYW1zW0tdP11cbiAgICA6IFtBdXRoRXJyb3JQYXJhbXNbS11dXG4pOiBhc3NlcnRzIGFzc2VydGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBfYXNzZXJ0PEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXNzZXJ0aW9uOiB1bmtub3duLFxuICBhdXRoOiBBdXRoLFxuICBjb2RlOiBLLFxuICAuLi5kYXRhOiB7fSBleHRlbmRzIExlc3NBcHBOYW1lPEs+ID8gW0xlc3NBcHBOYW1lPEs+P10gOiBbTGVzc0FwcE5hbWU8Sz5dXG4pOiBhc3NlcnRzIGFzc2VydGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBfYXNzZXJ0PEsgZXh0ZW5kcyBBdXRoRXJyb3JDb2RlPihcbiAgYXNzZXJ0aW9uOiB1bmtub3duLFxuICBhdXRoT3JDb2RlOiBBdXRoIHwgSyxcbiAgLi4ucmVzdDogdW5rbm93bltdXG4pOiBhc3NlcnRzIGFzc2VydGlvbiB7XG4gIGlmICghYXNzZXJ0aW9uKSB7XG4gICAgdGhyb3cgY3JlYXRlRXJyb3JJbnRlcm5hbChhdXRoT3JDb2RlLCAuLi5yZXN0KTtcbiAgfVxufVxuXG4vLyBXZSByZWFsbHkgZG8gd2FudCB0byBhY2NlcHQgbGl0ZXJhbGx5IGFueSBmdW5jdGlvbiB0eXBlIGhlcmVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG50eXBlIFR5cGVFeHBlY3RhdGlvbiA9IEZ1bmN0aW9uIHwgc3RyaW5nIHwgTWFwVHlwZTtcblxuaW50ZXJmYWNlIE1hcFR5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBUeXBlRXhwZWN0YXRpb24gfCBPcHRpb25hbD4ge31cblxuY2xhc3MgT3B0aW9uYWwge1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSB0eXBlOiBUeXBlRXhwZWN0YXRpb24pIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBvcHQodHlwZTogVHlwZUV4cGVjdGF0aW9uKTogT3B0aW9uYWwge1xuICByZXR1cm4gbmV3IE9wdGlvbmFsKHR5cGUpO1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhlIHJ1bnRpbWUgdHlwZXMgb2YgYXJndW1lbnRzLiBUaGUgJ2V4cGVjdGVkJyBmaWVsZCBjYW4gYmUgb25lIG9mXG4gKiBhIGNsYXNzLCBhIHN0cmluZyAocmVwcmVzZW50aW5nIGEgXCJ0eXBlb2ZcIiBjYWxsKSwgb3IgYSByZWNvcmQgbWFwIG9mIG5hbWVcbiAqIHRvIHR5cGUuIEZ1cnRoZXJtb3JlLCB0aGUgb3B0KCkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gbWFyayBhIGZpZWxkIGFzXG4gKiBvcHRpb25hbC4gRm9yIGV4YW1wbGU6XG4gKlxuICogZnVuY3Rpb24gZm9vKGF1dGg6IEF1dGgsIHByb2ZpbGU6IHtkaXNwbGF5TmFtZT86IHN0cmluZ30sIHVwZGF0ZSA9IGZhbHNlKSB7XG4gKiAgIGFzc2VydFR5cGVzKGFyZ3VtZW50cywgW0F1dGhJbXBsLCB7ZGlzcGxheU5hbWU6IG9wdCgnc3RyaW5nJyl9LCBvcHQoJ2Jvb2xlYW4nKV0pO1xuICogfVxuICpcbiAqIG9wdCgpIGNhbiBiZSB1c2VkIGZvciBhbnkgdHlwZTpcbiAqIGZ1bmN0aW9uIGZvbyhhdXRoPzogQXV0aCkge1xuICogICBhc3NlcnRUeXBlcyhhcmd1bWVudHMsIFtvcHQoQXV0aEltcGwpXSk7XG4gKiB9XG4gKlxuICogVGhlIHN0cmluZyB0eXBlcyBjYW4gYmUgb3InZCB0b2dldGhlciwgYW5kIHlvdSBjYW4gdXNlIFwibnVsbFwiIGFzIHdlbGwgKG5vdGVcbiAqIHRoYXQgdHlwZW9mIG51bGwgPT09ICdvYmplY3QnOyB0aGlzIGlzIGFuIGVkZ2UgY2FzZSkuIEZvciBleGFtcGxlOlxuICpcbiAqIGZ1bmN0aW9uIGZvbyhwcm9maWxlOiB7ZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsfSkge1xuICogICBhc3NlcnRUeXBlcyhhcmd1bWVudHMsIFt7ZGlzcGxheU5hbWU6IG9wdCgnc3RyaW5nfG51bGwnKX1dKTtcbiAqIH1cbiAqXG4gKiBAcGFyYW0gYXJnc1xuICogQHBhcmFtIGV4cGVjdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlcyhcbiAgYXJnczogT21pdDxJQXJndW1lbnRzLCAnY2FsbGVlJz4sXG4gIC4uLmV4cGVjdGVkOiBBcnJheTxUeXBlRXhwZWN0YXRpb24gfCBPcHRpb25hbD5cbik6IHZvaWQge1xuICBpZiAoYXJncy5sZW5ndGggPiBleHBlY3RlZC5sZW5ndGgpIHtcbiAgICBfZmFpbChBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SLCB7fSk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGV4cGVjdCA9IGV4cGVjdGVkW2ldO1xuICAgIGNvbnN0IGFyZyA9IGFyZ3NbaV07XG5cbiAgICBpZiAoZXhwZWN0IGluc3RhbmNlb2YgT3B0aW9uYWwpIHtcbiAgICAgIC8vIElmIHRoZSBhcmcgaXMgdW5kZWZpbmVkLCB0aGVuIGl0IG1hdGNoZXMgXCJvcHRpb25hbFwiIGFuZCB3ZSBjYW4gbW92ZSB0b1xuICAgICAgLy8gdGhlIG5leHQgYXJnXG4gICAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBleHBlY3QgPSBleHBlY3QudHlwZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGV4cGVjdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEhhbmRsZSB0aGUgZWRnZSBjYXNlIGZvciBudWxsIGJlY2F1c2UgdHlwZW9mIG51bGwgPT09ICdvYmplY3QnXG4gICAgICBpZiAoZXhwZWN0LmluY2x1ZGVzKCdudWxsJykgJiYgYXJnID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXF1aXJlZCA9IGV4cGVjdC5zcGxpdCgnfCcpO1xuICAgICAgX2Fzc2VydChyZXF1aXJlZC5pbmNsdWRlcyh0eXBlb2YgYXJnKSwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUiwge30pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cGVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIHJlY29yZCBhcmd1bWVudHNcbiAgICAgIGNvbnN0IHJlY29yZCA9IGFyZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvbnN0IG1hcCA9IGV4cGVjdCBhcyBNYXBUeXBlO1xuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cGVjdCk7XG5cbiAgICAgIGFzc2VydFR5cGVzKFxuICAgICAgICBrZXlzLm1hcChrID0+IHJlY29yZFtrXSksXG4gICAgICAgIC4uLmtleXMubWFwKGsgPT4gbWFwW2tdKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2Fzc2VydChhcmcgaW5zdGFuY2VvZiBleHBlY3QsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IsIHt9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBVbmNvbmRpdGlvbmFsbHkgZmFpbHMsIHRocm93aW5nIGFuIGludGVybmFsIGVycm9yIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGZhaWx1cmUgdHlwZSBvZiBmYWlsdXJlIGVuY291bnRlcmVkXG4gKiBAdGhyb3dzIEVycm9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0ZhaWwoZmFpbHVyZTogc3RyaW5nKTogbmV2ZXIge1xuICAvLyBMb2cgdGhlIGZhaWx1cmUgaW4gYWRkaXRpb24gdG8gdGhyb3cgYW4gZXhjZXB0aW9uLCBqdXN0IGluIGNhc2UgdGhlXG4gIC8vIGV4Y2VwdGlvbiBpcyBzd2FsbG93ZWQuXG4gIGNvbnN0IG1lc3NhZ2UgPSBgSU5URVJOQUwgQVNTRVJUSU9OIEZBSUxFRDogYCArIGZhaWx1cmU7XG4gIF9sb2dFcnJvcihtZXNzYWdlKTtcblxuICAvLyBOT1RFOiBXZSBkb24ndCB1c2UgRmlyZWJhc2VFcnJvciBoZXJlIGJlY2F1c2UgdGhlc2UgYXJlIGludGVybmFsIGZhaWx1cmVzXG4gIC8vIHRoYXQgY2Fubm90IGJlIGhhbmRsZWQgYnkgdGhlIHVzZXIuIChBbHNvIGl0IHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyXG4gIC8vIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgZXJyb3IgYW5kIGFzc2VydCBtb2R1bGVzIHdoaWNoIGRvZXNuJ3Qgd29yay4pXG4gIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbn1cblxuLyoqXG4gKiBGYWlscyBpZiB0aGUgZ2l2ZW4gYXNzZXJ0aW9uIGNvbmRpdGlvbiBpcyBmYWxzZSwgdGhyb3dpbmcgYW4gRXJyb3Igd2l0aCB0aGVcbiAqIGdpdmVuIG1lc3NhZ2UgaWYgaXQgZGlkLlxuICpcbiAqIEBwYXJhbSBhc3NlcnRpb25cbiAqIEBwYXJhbSBtZXNzYWdlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWJ1Z0Fzc2VydChcbiAgYXNzZXJ0aW9uOiB1bmtub3duLFxuICBtZXNzYWdlOiBzdHJpbmdcbik6IGFzc2VydHMgYXNzZXJ0aW9uIHtcbiAgaWYgKCFhc3NlcnRpb24pIHtcbiAgICBkZWJ1Z0ZhaWwobWVzc2FnZSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gX2dldEN1cnJlbnRVcmwoKTogc3RyaW5nIHtcbiAgcmV0dXJuICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5sb2NhdGlvbj8uaHJlZikgfHwgJyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNIdHRwT3JIdHRwcygpOiBib29sZWFuIHtcbiAgcmV0dXJuIF9nZXRDdXJyZW50U2NoZW1lKCkgPT09ICdodHRwOicgfHwgX2dldEN1cnJlbnRTY2hlbWUoKSA9PT0gJ2h0dHBzOic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2V0Q3VycmVudFNjaGVtZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5sb2NhdGlvbj8ucHJvdG9jb2wpIHx8IG51bGw7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNCcm93c2VyRXh0ZW5zaW9uIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgX2lzSHR0cE9ySHR0cHMgfSBmcm9tICcuL2xvY2F0aW9uJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgYnJvd3NlciBpcyB3b3JraW5nIG9ubGluZVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2lzT25saW5lKCk6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICBuYXZpZ2F0b3IgJiZcbiAgICAnb25MaW5lJyBpbiBuYXZpZ2F0b3IgJiZcbiAgICB0eXBlb2YgbmF2aWdhdG9yLm9uTGluZSA9PT0gJ2Jvb2xlYW4nICYmXG4gICAgLy8gQXBwbHkgb25seSBmb3IgdHJhZGl0aW9uYWwgd2ViIGFwcHMgYW5kIENocm9tZSBleHRlbnNpb25zLlxuICAgIC8vIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGZvciBDb3Jkb3ZhIGFwcHMgd2hpY2ggaGF2ZSB1bnJlbGlhYmxlXG4gICAgLy8gbmF2aWdhdG9yLm9uTGluZSBiZWhhdmlvciB1bmxlc3MgY29yZG92YS1wbHVnaW4tbmV0d29yay1pbmZvcm1hdGlvbiBpc1xuICAgIC8vIGluc3RhbGxlZCB3aGljaCBvdmVyd3JpdGVzIHRoZSBuYXRpdmUgbmF2aWdhdG9yLm9uTGluZSB2YWx1ZSBhbmRcbiAgICAvLyBkZWZpbmVzIG5hdmlnYXRvci5jb25uZWN0aW9uLlxuICAgIChfaXNIdHRwT3JIdHRwcygpIHx8IGlzQnJvd3NlckV4dGVuc2lvbigpIHx8ICdjb25uZWN0aW9uJyBpbiBuYXZpZ2F0b3IpXG4gICkge1xuICAgIHJldHVybiBuYXZpZ2F0b3Iub25MaW5lO1xuICB9XG4gIC8vIElmIHdlIGNhbid0IGRldGVybWluZSB0aGUgc3RhdGUsIGFzc3VtZSBpdCBpcyBvbmxpbmUuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldFVzZXJMYW5ndWFnZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiBuYXZpZ2F0b3IgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgbmF2aWdhdG9yTGFuZ3VhZ2U6IE5hdmlnYXRvckxhbmd1YWdlID0gbmF2aWdhdG9yO1xuICByZXR1cm4gKFxuICAgIC8vIE1vc3QgcmVsaWFibGUsIGJ1dCBvbmx5IHN1cHBvcnRlZCBpbiBDaHJvbWUvRmlyZWZveC5cbiAgICAobmF2aWdhdG9yTGFuZ3VhZ2UubGFuZ3VhZ2VzICYmIG5hdmlnYXRvckxhbmd1YWdlLmxhbmd1YWdlc1swXSkgfHxcbiAgICAvLyBTdXBwb3J0ZWQgaW4gbW9zdCBicm93c2VycywgYnV0IHJldHVybnMgdGhlIGxhbmd1YWdlIG9mIHRoZSBicm93c2VyXG4gICAgLy8gVUksIG5vdCB0aGUgbGFuZ3VhZ2Ugc2V0IGluIGJyb3dzZXIgc2V0dGluZ3MuXG4gICAgbmF2aWdhdG9yTGFuZ3VhZ2UubGFuZ3VhZ2UgfHxcbiAgICAvLyBDb3VsZG4ndCBkZXRlcm1pbmUgbGFuZ3VhZ2UuXG4gICAgbnVsbFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGlzTW9iaWxlQ29yZG92YSwgaXNSZWFjdE5hdGl2ZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IF9pc09ubGluZSB9IGZyb20gJy4vbmF2aWdhdG9yJztcbmltcG9ydCB7IGRlYnVnQXNzZXJ0IH0gZnJvbSAnLi9hc3NlcnQnO1xuXG5leHBvcnQgY29uc3QgZW51bSBEZWxheU1pbiB7XG4gIE9GRkxJTkUgPSA1MDAwXG59XG5cbi8qKlxuICogQSBzdHJ1Y3R1cmUgdG8gaGVscCBwaWNrIGJldHdlZW4gYSByYW5nZSBvZiBsb25nIGFuZCBzaG9ydCBkZWxheSBkdXJhdGlvbnNcbiAqIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4gSW4gZ2VuZXJhbCwgdGhlIGxvbmcgZGVsYXkgaXMgdXNlZCBmb3JcbiAqIG1vYmlsZSBlbnZpcm9ubWVudHMgd2hlcmVhcyBzaG9ydCBkZWxheXMgYXJlIHVzZWQgZm9yIGRlc2t0b3AgZW52aXJvbm1lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgRGVsYXkge1xuICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIG9mZmxpbmUgZGVsYXkgdGltZW91dCBpbiBtcy5cblxuICBwcml2YXRlIHJlYWRvbmx5IGlzTW9iaWxlOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNob3J0RGVsYXk6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvbmdEZWxheTogbnVtYmVyXG4gICkge1xuICAgIC8vIEludGVybmFsIGVycm9yIHdoZW4gaW1wcm9wZXJseSBpbml0aWFsaXplZC5cbiAgICBkZWJ1Z0Fzc2VydChcbiAgICAgIGxvbmdEZWxheSA+IHNob3J0RGVsYXksXG4gICAgICAnU2hvcnQgZGVsYXkgc2hvdWxkIGJlIGxlc3MgdGhhbiBsb25nIGRlbGF5ISdcbiAgICApO1xuICAgIHRoaXMuaXNNb2JpbGUgPSBpc01vYmlsZUNvcmRvdmEoKSB8fCBpc1JlYWN0TmF0aXZlKCk7XG4gIH1cblxuICBnZXQoKTogbnVtYmVyIHtcbiAgICBpZiAoIV9pc09ubGluZSgpKSB7XG4gICAgICAvLyBQaWNrIHRoZSBzaG9ydGVyIHRpbWVvdXQuXG4gICAgICByZXR1cm4gTWF0aC5taW4oRGVsYXlNaW4uT0ZGTElORSwgdGhpcy5zaG9ydERlbGF5KTtcbiAgICB9XG4gICAgLy8gSWYgcnVubmluZyBpbiBhIG1vYmlsZSBlbnZpcm9ubWVudCwgcmV0dXJuIHRoZSBsb25nIGRlbGF5LCBvdGhlcndpc2VcbiAgICAvLyByZXR1cm4gdGhlIHNob3J0IGRlbGF5LlxuICAgIC8vIFRoaXMgY291bGQgYmUgaW1wcm92ZWQgaW4gdGhlIGZ1dHVyZSB0byBkeW5hbWljYWxseSBjaGFuZ2UgYmFzZWQgb24gb3RoZXJcbiAgICAvLyB2YXJpYWJsZXMgaW5zdGVhZCBvZiBqdXN0IHJlYWRpbmcgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAgcmV0dXJuIHRoaXMuaXNNb2JpbGUgPyB0aGlzLmxvbmdEZWxheSA6IHRoaXMuc2hvcnREZWxheTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBkZWJ1Z0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcblxuZXhwb3J0IGZ1bmN0aW9uIF9lbXVsYXRvclVybChjb25maWc6IENvbmZpZ0ludGVybmFsLCBwYXRoPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgZGVidWdBc3NlcnQoY29uZmlnLmVtdWxhdG9yLCAnRW11bGF0b3Igc2hvdWxkIGFsd2F5cyBiZSBzZXQgaGVyZScpO1xuICBjb25zdCB7IHVybCB9ID0gY29uZmlnLmVtdWxhdG9yO1xuXG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiB1cmw7XG4gIH1cblxuICByZXR1cm4gYCR7dXJsfSR7cGF0aC5zdGFydHNXaXRoKCcvJykgPyBwYXRoLnNsaWNlKDEpIDogcGF0aH1gO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGRlYnVnRmFpbCB9IGZyb20gJy4vYXNzZXJ0JztcblxuZXhwb3J0IGNsYXNzIEZldGNoUHJvdmlkZXIge1xuICBwcml2YXRlIHN0YXRpYyBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaCB8IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIGhlYWRlcnNJbXBsOiB0eXBlb2YgSGVhZGVycyB8IG51bGw7XG4gIHByaXZhdGUgc3RhdGljIHJlc3BvbnNlSW1wbDogdHlwZW9mIFJlc3BvbnNlIHwgbnVsbDtcblxuICBzdGF0aWMgaW5pdGlhbGl6ZShcbiAgICBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaCxcbiAgICBoZWFkZXJzSW1wbD86IHR5cGVvZiBIZWFkZXJzLFxuICAgIHJlc3BvbnNlSW1wbD86IHR5cGVvZiBSZXNwb25zZVxuICApOiB2b2lkIHtcbiAgICB0aGlzLmZldGNoSW1wbCA9IGZldGNoSW1wbDtcbiAgICBpZiAoaGVhZGVyc0ltcGwpIHtcbiAgICAgIHRoaXMuaGVhZGVyc0ltcGwgPSBoZWFkZXJzSW1wbDtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlSW1wbCkge1xuICAgICAgdGhpcy5yZXNwb25zZUltcGwgPSByZXNwb25zZUltcGw7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGZldGNoKCk6IHR5cGVvZiBmZXRjaCB7XG4gICAgaWYgKHRoaXMuZmV0Y2hJbXBsKSB7XG4gICAgICByZXR1cm4gdGhpcy5mZXRjaEltcGw7XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgJ2ZldGNoJyBpbiBzZWxmKSB7XG4gICAgICByZXR1cm4gc2VsZi5mZXRjaDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLmZldGNoKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5mZXRjaDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBmZXRjaCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmZXRjaDtcbiAgICB9XG4gICAgZGVidWdGYWlsKFxuICAgICAgJ0NvdWxkIG5vdCBmaW5kIGZldGNoIGltcGxlbWVudGF0aW9uLCBtYWtlIHN1cmUgeW91IGNhbGwgRmV0Y2hQcm92aWRlci5pbml0aWFsaXplKCkgd2l0aCBhbiBhcHByb3ByaWF0ZSBwb2x5ZmlsbCdcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIGhlYWRlcnMoKTogdHlwZW9mIEhlYWRlcnMge1xuICAgIGlmICh0aGlzLmhlYWRlcnNJbXBsKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWFkZXJzSW1wbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyAmJiAnSGVhZGVycycgaW4gc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGYuSGVhZGVycztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLkhlYWRlcnMpIHtcbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLkhlYWRlcnM7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgSGVhZGVycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBIZWFkZXJzO1xuICAgIH1cbiAgICBkZWJ1Z0ZhaWwoXG4gICAgICAnQ291bGQgbm90IGZpbmQgSGVhZGVycyBpbXBsZW1lbnRhdGlvbiwgbWFrZSBzdXJlIHlvdSBjYWxsIEZldGNoUHJvdmlkZXIuaW5pdGlhbGl6ZSgpIHdpdGggYW4gYXBwcm9wcmlhdGUgcG9seWZpbGwnXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyByZXNwb25zZSgpOiB0eXBlb2YgUmVzcG9uc2Uge1xuICAgIGlmICh0aGlzLnJlc3BvbnNlSW1wbCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzcG9uc2VJbXBsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmICdSZXNwb25zZScgaW4gc2VsZikge1xuICAgICAgcmV0dXJuIHNlbGYuUmVzcG9uc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpcy5SZXNwb25zZSkge1xuICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuUmVzcG9uc2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgUmVzcG9uc2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gUmVzcG9uc2U7XG4gICAgfVxuICAgIGRlYnVnRmFpbChcbiAgICAgICdDb3VsZCBub3QgZmluZCBSZXNwb25zZSBpbXBsZW1lbnRhdGlvbiwgbWFrZSBzdXJlIHlvdSBjYWxsIEZldGNoUHJvdmlkZXIuaW5pdGlhbGl6ZSgpIHdpdGggYW4gYXBwcm9wcmlhdGUgcG9seWZpbGwnXG4gICAgKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9jb3JlL2Vycm9ycyc7XG5cbi8qKlxuICogRXJyb3JzIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBiYWNrZW5kXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIFNlcnZlckVycm9yIHtcbiAgQURNSU5fT05MWV9PUEVSQVRJT04gPSAnQURNSU5fT05MWV9PUEVSQVRJT04nLFxuICBCTE9DS0lOR19GVU5DVElPTl9FUlJPUl9SRVNQT05TRSA9ICdCTE9DS0lOR19GVU5DVElPTl9FUlJPUl9SRVNQT05TRScsXG4gIENBUFRDSEFfQ0hFQ0tfRkFJTEVEID0gJ0NBUFRDSEFfQ0hFQ0tfRkFJTEVEJyxcbiAgQ09SU19VTlNVUFBPUlRFRCA9ICdDT1JTX1VOU1VQUE9SVEVEJyxcbiAgQ1JFREVOVElBTF9NSVNNQVRDSCA9ICdDUkVERU5USUFMX01JU01BVENIJyxcbiAgQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOID0gJ0NSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTicsXG4gIERZTkFNSUNfTElOS19OT1RfQUNUSVZBVEVEID0gJ0RZTkFNSUNfTElOS19OT1RfQUNUSVZBVEVEJyxcbiAgRU1BSUxfQ0hBTkdFX05FRURTX1ZFUklGSUNBVElPTiA9ICdFTUFJTF9DSEFOR0VfTkVFRFNfVkVSSUZJQ0FUSU9OJyxcbiAgRU1BSUxfRVhJU1RTID0gJ0VNQUlMX0VYSVNUUycsXG4gIEVNQUlMX05PVF9GT1VORCA9ICdFTUFJTF9OT1RfRk9VTkQnLFxuICBFWFBJUkVEX09PQl9DT0RFID0gJ0VYUElSRURfT09CX0NPREUnLFxuICBGRURFUkFURURfVVNFUl9JRF9BTFJFQURZX0xJTktFRCA9ICdGRURFUkFURURfVVNFUl9JRF9BTFJFQURZX0xJTktFRCcsXG4gIElOVkFMSURfQVBQX0NSRURFTlRJQUwgPSAnSU5WQUxJRF9BUFBfQ1JFREVOVElBTCcsXG4gIElOVkFMSURfQVBQX0lEID0gJ0lOVkFMSURfQVBQX0lEJyxcbiAgSU5WQUxJRF9DRVJUX0hBU0ggPSAnSU5WQUxJRF9DRVJUX0hBU0gnLFxuICBJTlZBTElEX0NPREUgPSAnSU5WQUxJRF9DT0RFJyxcbiAgSU5WQUxJRF9DT05USU5VRV9VUkkgPSAnSU5WQUxJRF9DT05USU5VRV9VUkknLFxuICBJTlZBTElEX0NVU1RPTV9UT0tFTiA9ICdJTlZBTElEX0NVU1RPTV9UT0tFTicsXG4gIElOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTiA9ICdJTlZBTElEX0RZTkFNSUNfTElOS19ET01BSU4nLFxuICBJTlZBTElEX0VNQUlMID0gJ0lOVkFMSURfRU1BSUwnLFxuICBJTlZBTElEX0lEX1RPS0VOID0gJ0lOVkFMSURfSURfVE9LRU4nLFxuICBJTlZBTElEX0lEUF9SRVNQT05TRSA9ICdJTlZBTElEX0lEUF9SRVNQT05TRScsXG4gIElOVkFMSURfSURFTlRJRklFUiA9ICdJTlZBTElEX0lERU5USUZJRVInLFxuICBJTlZBTElEX01FU1NBR0VfUEFZTE9BRCA9ICdJTlZBTElEX01FU1NBR0VfUEFZTE9BRCcsXG4gIElOVkFMSURfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCA9ICdJTlZBTElEX01GQV9QRU5ESU5HX0NSRURFTlRJQUwnLFxuICBJTlZBTElEX09BVVRIX0NMSUVOVF9JRCA9ICdJTlZBTElEX09BVVRIX0NMSUVOVF9JRCcsXG4gIElOVkFMSURfT09CX0NPREUgPSAnSU5WQUxJRF9PT0JfQ09ERScsXG4gIElOVkFMSURfUEFTU1dPUkQgPSAnSU5WQUxJRF9QQVNTV09SRCcsXG4gIElOVkFMSURfUEVORElOR19UT0tFTiA9ICdJTlZBTElEX1BFTkRJTkdfVE9LRU4nLFxuICBJTlZBTElEX1BIT05FX05VTUJFUiA9ICdJTlZBTElEX1BIT05FX05VTUJFUicsXG4gIElOVkFMSURfUFJPVklERVJfSUQgPSAnSU5WQUxJRF9QUk9WSURFUl9JRCcsXG4gIElOVkFMSURfUkVDSVBJRU5UX0VNQUlMID0gJ0lOVkFMSURfUkVDSVBJRU5UX0VNQUlMJyxcbiAgSU5WQUxJRF9TRU5ERVIgPSAnSU5WQUxJRF9TRU5ERVInLFxuICBJTlZBTElEX1NFU1NJT05fSU5GTyA9ICdJTlZBTElEX1NFU1NJT05fSU5GTycsXG4gIElOVkFMSURfVEVNUE9SQVJZX1BST09GID0gJ0lOVkFMSURfVEVNUE9SQVJZX1BST09GJyxcbiAgSU5WQUxJRF9URU5BTlRfSUQgPSAnSU5WQUxJRF9URU5BTlRfSUQnLFxuICBNRkFfRU5ST0xMTUVOVF9OT1RfRk9VTkQgPSAnTUZBX0VOUk9MTE1FTlRfTk9UX0ZPVU5EJyxcbiAgTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRSA9ICdNSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FJyxcbiAgTUlTU0lOR19BUFBfQ1JFREVOVElBTCA9ICdNSVNTSU5HX0FQUF9DUkVERU5USUFMJyxcbiAgTUlTU0lOR19DT0RFID0gJ01JU1NJTkdfQ09ERScsXG4gIE1JU1NJTkdfQ09OVElOVUVfVVJJID0gJ01JU1NJTkdfQ09OVElOVUVfVVJJJyxcbiAgTUlTU0lOR19DVVNUT01fVE9LRU4gPSAnTUlTU0lOR19DVVNUT01fVE9LRU4nLFxuICBNSVNTSU5HX0lPU19CVU5ETEVfSUQgPSAnTUlTU0lOR19JT1NfQlVORExFX0lEJyxcbiAgTUlTU0lOR19NRkFfRU5ST0xMTUVOVF9JRCA9ICdNSVNTSU5HX01GQV9FTlJPTExNRU5UX0lEJyxcbiAgTUlTU0lOR19NRkFfUEVORElOR19DUkVERU5USUFMID0gJ01JU1NJTkdfTUZBX1BFTkRJTkdfQ1JFREVOVElBTCcsXG4gIE1JU1NJTkdfT09CX0NPREUgPSAnTUlTU0lOR19PT0JfQ09ERScsXG4gIE1JU1NJTkdfT1JfSU5WQUxJRF9OT05DRSA9ICdNSVNTSU5HX09SX0lOVkFMSURfTk9OQ0UnLFxuICBNSVNTSU5HX1BBU1NXT1JEID0gJ01JU1NJTkdfUEFTU1dPUkQnLFxuICBNSVNTSU5HX1JFUV9UWVBFID0gJ01JU1NJTkdfUkVRX1RZUEUnLFxuICBNSVNTSU5HX1BIT05FX05VTUJFUiA9ICdNSVNTSU5HX1BIT05FX05VTUJFUicsXG4gIE1JU1NJTkdfU0VTU0lPTl9JTkZPID0gJ01JU1NJTkdfU0VTU0lPTl9JTkZPJyxcbiAgT1BFUkFUSU9OX05PVF9BTExPV0VEID0gJ09QRVJBVElPTl9OT1RfQUxMT1dFRCcsXG4gIFBBU1NXT1JEX0xPR0lOX0RJU0FCTEVEID0gJ1BBU1NXT1JEX0xPR0lOX0RJU0FCTEVEJyxcbiAgUVVPVEFfRVhDRUVERUQgPSAnUVVPVEFfRVhDRUVERUQnLFxuICBSRVNFVF9QQVNTV09SRF9FWENFRURfTElNSVQgPSAnUkVTRVRfUEFTU1dPUkRfRVhDRUVEX0xJTUlUJyxcbiAgUkVKRUNURURfQ1JFREVOVElBTCA9ICdSRUpFQ1RFRF9DUkVERU5USUFMJyxcbiAgU0VDT05EX0ZBQ1RPUl9FWElTVFMgPSAnU0VDT05EX0ZBQ1RPUl9FWElTVFMnLFxuICBTRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVEID0gJ1NFQ09ORF9GQUNUT1JfTElNSVRfRVhDRUVERUQnLFxuICBTRVNTSU9OX0VYUElSRUQgPSAnU0VTU0lPTl9FWFBJUkVEJyxcbiAgVEVOQU5UX0lEX01JU01BVENIID0gJ1RFTkFOVF9JRF9NSVNNQVRDSCcsXG4gIFRPS0VOX0VYUElSRUQgPSAnVE9LRU5fRVhQSVJFRCcsXG4gIFRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUiA9ICdUT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVInLFxuICBVTlNVUFBPUlRFRF9GSVJTVF9GQUNUT1IgPSAnVU5TVVBQT1JURURfRklSU1RfRkFDVE9SJyxcbiAgVU5TVVBQT1JURURfVEVOQU5UX09QRVJBVElPTiA9ICdVTlNVUFBPUlRFRF9URU5BTlRfT1BFUkFUSU9OJyxcbiAgVU5BVVRIT1JJWkVEX0RPTUFJTiA9ICdVTkFVVEhPUklaRURfRE9NQUlOJyxcbiAgVU5WRVJJRklFRF9FTUFJTCA9ICdVTlZFUklGSUVEX0VNQUlMJyxcbiAgVVNFUl9DQU5DRUxMRUQgPSAnVVNFUl9DQU5DRUxMRUQnLFxuICBVU0VSX0RJU0FCTEVEID0gJ1VTRVJfRElTQUJMRUQnLFxuICBVU0VSX05PVF9GT1VORCA9ICdVU0VSX05PVF9GT1VORCcsXG4gIFdFQUtfUEFTU1dPUkQgPSAnV0VBS19QQVNTV09SRCcsXG4gIFJFQ0FQVENIQV9OT1RfRU5BQkxFRCA9ICdSRUNBUFRDSEFfTk9UX0VOQUJMRUQnLFxuICBNSVNTSU5HX1JFQ0FQVENIQV9UT0tFTiA9ICdNSVNTSU5HX1JFQ0FQVENIQV9UT0tFTicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX1RPS0VOID0gJ0lOVkFMSURfUkVDQVBUQ0hBX1RPS0VOJyxcbiAgSU5WQUxJRF9SRUNBUFRDSEFfQUNUSU9OID0gJ0lOVkFMSURfUkVDQVBUQ0hBX0FDVElPTicsXG4gIE1JU1NJTkdfQ0xJRU5UX1RZUEUgPSAnTUlTU0lOR19DTElFTlRfVFlQRScsXG4gIE1JU1NJTkdfUkVDQVBUQ0hBX1ZFUlNJT04gPSAnTUlTU0lOR19SRUNBUFRDSEFfVkVSU0lPTicsXG4gIElOVkFMSURfUkVDQVBUQ0hBX1ZFUlNJT04gPSAnSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTicsXG4gIElOVkFMSURfUkVRX1RZUEUgPSAnSU5WQUxJRF9SRVFfVFlQRScsXG4gIFBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTID0gJ1BBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTJ1xufVxuXG4vKipcbiAqIEFQSSBSZXNwb25zZSBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBKc29uRXJyb3Ige1xuICBlcnJvcjoge1xuICAgIGNvZGU6IG51bWJlcjtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgZXJyb3JzPzogW1xuICAgICAge1xuICAgICAgICBtZXNzYWdlOiBTZXJ2ZXJFcnJvcjtcbiAgICAgICAgZG9tYWluOiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgfVxuICAgIF07XG4gIH07XG59XG5cbi8qKlxuICogVHlwZSBkZWZpbml0aW9uIGZvciBhIG1hcCBmcm9tIHNlcnZlciBlcnJvcnMgdG8gZGV2ZWxvcGVyIHZpc2libGUgZXJyb3JzXG4gKi9cbmV4cG9ydCBkZWNsYXJlIHR5cGUgU2VydmVyRXJyb3JNYXA8QXBpRXJyb3IgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICByZWFkb25seSBbSyBpbiBBcGlFcnJvcl06IEF1dGhFcnJvckNvZGU7XG59O1xuXG4vKipcbiAqIE1hcCBmcm9tIGVycm9ycyByZXR1cm5lZCBieSB0aGUgc2VydmVyIHRvIGVycm9ycyB0byBkZXZlbG9wZXIgdmlzaWJsZSBlcnJvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFNFUlZFUl9FUlJPUl9NQVA6IFBhcnRpYWw8U2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+PiA9IHtcbiAgLy8gQ3VzdG9tIHRva2VuIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLkNSRURFTlRJQUxfTUlTTUFUQ0hdOiBBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfTUlTTUFUQ0gsXG4gIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfQ1VTVE9NX1RPS0VOXTogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcblxuICAvLyBDcmVhdGUgQXV0aCBVUkkgZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9JREVOVElGSUVSXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX0VNQUlMLFxuICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgU0RLIHNlbmRzIGEgYmFkIHJlcXVlc3QuXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX0NPTlRJTlVFX1VSSV06IEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsXG5cbiAgLy8gU2lnbiBpbiB3aXRoIGVtYWlsIGFuZCBwYXNzd29yZCBlcnJvcnMgKHNvbWUgYXBwbHkgdG8gc2lnbiB1cCB0b28pLlxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9QQVNTV09SRF06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9QQVNTV09SRCxcbiAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgdGhlIFNESyBzZW5kcyBhIGJhZCByZXF1ZXN0LlxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19QQVNTV09SRF06IEF1dGhFcnJvckNvZGUuTUlTU0lOR19QQVNTV09SRCxcblxuICAvLyBTaWduIHVwIHdpdGggZW1haWwgYW5kIHBhc3N3b3JkIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLkVNQUlMX0VYSVNUU106IEF1dGhFcnJvckNvZGUuRU1BSUxfRVhJU1RTLFxuICBbU2VydmVyRXJyb3IuUEFTU1dPUkRfTE9HSU5fRElTQUJMRURdOiBBdXRoRXJyb3JDb2RlLk9QRVJBVElPTl9OT1RfQUxMT1dFRCxcblxuICAvLyBWZXJpZnkgYXNzZXJ0aW9uIGZvciBzaWduIGluIHdpdGggY3JlZGVudGlhbCBlcnJvcnM6XG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX0lEUF9SRVNQT05TRV06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9JRFBfUkVTUE9OU0UsXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1BFTkRJTkdfVE9LRU5dOiBBdXRoRXJyb3JDb2RlLklOVkFMSURfSURQX1JFU1BPTlNFLFxuICBbU2VydmVyRXJyb3IuRkVERVJBVEVEX1VTRVJfSURfQUxSRUFEWV9MSU5LRURdOlxuICAgIEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9BTFJFQURZX0lOX1VTRSxcblxuICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgU0RLIHNlbmRzIGEgYmFkIHJlcXVlc3QuXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX1JFUV9UWVBFXTogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcblxuICAvLyBTZW5kIFBhc3N3b3JkIHJlc2V0IGVtYWlsIGVycm9yczpcbiAgW1NlcnZlckVycm9yLkVNQUlMX05PVF9GT1VORF06IEF1dGhFcnJvckNvZGUuVVNFUl9ERUxFVEVELFxuICBbU2VydmVyRXJyb3IuUkVTRVRfUEFTU1dPUkRfRVhDRUVEX0xJTUlUXTpcbiAgICBBdXRoRXJyb3JDb2RlLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUixcblxuICBbU2VydmVyRXJyb3IuRVhQSVJFRF9PT0JfQ09ERV06IEF1dGhFcnJvckNvZGUuRVhQSVJFRF9PT0JfQ09ERSxcbiAgW1NlcnZlckVycm9yLklOVkFMSURfT09CX0NPREVdOiBBdXRoRXJyb3JDb2RlLklOVkFMSURfT09CX0NPREUsXG4gIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHRoZSBTREsgc2VuZHMgYSBiYWQgcmVxdWVzdC5cbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfT09CX0NPREVdOiBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLFxuXG4gIC8vIE9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIElEIHRva2VuIGluIHJlcXVlc3Q6XG4gIFtTZXJ2ZXJFcnJvci5DUkVERU5USUFMX1RPT19PTERfTE9HSU5fQUdBSU5dOlxuICAgIEF1dGhFcnJvckNvZGUuQ1JFREVOVElBTF9UT09fT0xEX0xPR0lOX0FHQUlOLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9JRF9UT0tFTl06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9BVVRILFxuICBbU2VydmVyRXJyb3IuVE9LRU5fRVhQSVJFRF06IEF1dGhFcnJvckNvZGUuVE9LRU5fRVhQSVJFRCxcbiAgW1NlcnZlckVycm9yLlVTRVJfTk9UX0ZPVU5EXTogQXV0aEVycm9yQ29kZS5UT0tFTl9FWFBJUkVELFxuXG4gIC8vIE90aGVyIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLlRPT19NQU5ZX0FUVEVNUFRTX1RSWV9MQVRFUl06XG4gICAgQXV0aEVycm9yQ29kZS5UT09fTUFOWV9BVFRFTVBUU19UUllfTEFURVIsXG4gIFtTZXJ2ZXJFcnJvci5QQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UU106XG4gICAgQXV0aEVycm9yQ29kZS5QQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UUyxcblxuICAvLyBQaG9uZSBBdXRoIHJlbGF0ZWQgZXJyb3JzLlxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9DT0RFXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX0NPREUsXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1NFU1NJT05fSU5GT106IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9TRVNTSU9OX0lORk8sXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX1RFTVBPUkFSWV9QUk9PRl06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9JRFBfUkVTUE9OU0UsXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX1NFU1NJT05fSU5GT106IEF1dGhFcnJvckNvZGUuTUlTU0lOR19TRVNTSU9OX0lORk8sXG4gIFtTZXJ2ZXJFcnJvci5TRVNTSU9OX0VYUElSRURdOiBBdXRoRXJyb3JDb2RlLkNPREVfRVhQSVJFRCxcblxuICAvLyBPdGhlciBhY3Rpb24gY29kZSBlcnJvcnMgd2hlbiBhZGRpdGlvbmFsIHNldHRpbmdzIHBhc3NlZC5cbiAgLy8gTUlTU0lOR19DT05USU5VRV9VUkkgaXMgZ2V0dGluZyBtYXBwZWQgdG8gSU5URVJOQUxfRVJST1IgYWJvdmUuXG4gIC8vIFRoaXMgaXMgT0sgYXMgdGhpcyBlcnJvciB3aWxsIGJlIGNhdWdodCBieSBjbGllbnQgc2lkZSB2YWxpZGF0aW9uLlxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRV06XG4gICAgQXV0aEVycm9yQ29kZS5NSVNTSU5HX0FORFJPSURfUEFDS0FHRV9OQU1FLFxuICBbU2VydmVyRXJyb3IuVU5BVVRIT1JJWkVEX0RPTUFJTl06IEF1dGhFcnJvckNvZGUuVU5BVVRIT1JJWkVEX0RPTUFJTixcblxuICAvLyBnZXRQcm9qZWN0Q29uZmlnIGVycm9ycyB3aGVuIGNsaWVudElkIGlzIHBhc3NlZC5cbiAgW1NlcnZlckVycm9yLklOVkFMSURfT0FVVEhfQ0xJRU5UX0lEXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX09BVVRIX0NMSUVOVF9JRCxcblxuICAvLyBVc2VyIGFjdGlvbnMgKHNpZ24tdXAgb3IgZGVsZXRpb24pIGRpc2FibGVkIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLkFETUlOX09OTFlfT1BFUkFUSU9OXTogQXV0aEVycm9yQ29kZS5BRE1JTl9PTkxZX09QRVJBVElPTixcblxuICAvLyBNdWx0aSBmYWN0b3IgcmVsYXRlZCBlcnJvcnMuXG4gIFtTZXJ2ZXJFcnJvci5JTlZBTElEX01GQV9QRU5ESU5HX0NSRURFTlRJQUxdOlxuICAgIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9NRkFfU0VTU0lPTixcbiAgW1NlcnZlckVycm9yLk1GQV9FTlJPTExNRU5UX05PVF9GT1VORF06IEF1dGhFcnJvckNvZGUuTUZBX0lORk9fTk9UX0ZPVU5ELFxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19NRkFfRU5ST0xMTUVOVF9JRF06IEF1dGhFcnJvckNvZGUuTUlTU0lOR19NRkFfSU5GTyxcbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfTUZBX1BFTkRJTkdfQ1JFREVOVElBTF06XG4gICAgQXV0aEVycm9yQ29kZS5NSVNTSU5HX01GQV9TRVNTSU9OLFxuICBbU2VydmVyRXJyb3IuU0VDT05EX0ZBQ1RPUl9FWElTVFNdOlxuICAgIEF1dGhFcnJvckNvZGUuU0VDT05EX0ZBQ1RPUl9BTFJFQURZX0VOUk9MTEVELFxuICBbU2VydmVyRXJyb3IuU0VDT05EX0ZBQ1RPUl9MSU1JVF9FWENFRURFRF06XG4gICAgQXV0aEVycm9yQ29kZS5TRUNPTkRfRkFDVE9SX0xJTUlUX0VYQ0VFREVELFxuXG4gIC8vIEJsb2NraW5nIGZ1bmN0aW9ucyByZWxhdGVkIGVycm9ycy5cbiAgW1NlcnZlckVycm9yLkJMT0NLSU5HX0ZVTkNUSU9OX0VSUk9SX1JFU1BPTlNFXTogQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcblxuICAvLyBSZWNhcHRjaGEgcmVsYXRlZCBlcnJvcnMuXG4gIFtTZXJ2ZXJFcnJvci5SRUNBUFRDSEFfTk9UX0VOQUJMRURdOiBBdXRoRXJyb3JDb2RlLlJFQ0FQVENIQV9OT1RfRU5BQkxFRCxcbiAgW1NlcnZlckVycm9yLk1JU1NJTkdfUkVDQVBUQ0hBX1RPS0VOXTogQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9UT0tFTixcbiAgW1NlcnZlckVycm9yLklOVkFMSURfUkVDQVBUQ0hBX1RPS0VOXTogQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9UT0tFTixcbiAgW1NlcnZlckVycm9yLklOVkFMSURfUkVDQVBUQ0hBX0FDVElPTl06XG4gICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9BQ1RJT04sXG4gIFtTZXJ2ZXJFcnJvci5NSVNTSU5HX0NMSUVOVF9UWVBFXTogQXV0aEVycm9yQ29kZS5NSVNTSU5HX0NMSUVOVF9UWVBFLFxuICBbU2VydmVyRXJyb3IuTUlTU0lOR19SRUNBUFRDSEFfVkVSU0lPTl06XG4gICAgQXV0aEVycm9yQ29kZS5NSVNTSU5HX1JFQ0FQVENIQV9WRVJTSU9OLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9SRUNBUFRDSEFfVkVSU0lPTl06XG4gICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX1JFQ0FQVENIQV9WRVJTSU9OLFxuICBbU2VydmVyRXJyb3IuSU5WQUxJRF9SRVFfVFlQRV06IEF1dGhFcnJvckNvZGUuSU5WQUxJRF9SRVFfVFlQRVxufTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yLCBxdWVyeXN0cmluZyB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSwgTmFtZWRFcnJvclBhcmFtcyB9IGZyb20gJy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7XG4gIF9jcmVhdGVFcnJvcixcbiAgX2Vycm9yV2l0aEN1c3RvbU1lc3NhZ2UsXG4gIF9mYWlsXG59IGZyb20gJy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgX2VtdWxhdG9yVXJsIH0gZnJvbSAnLi4vY29yZS91dGlsL2VtdWxhdG9yJztcbmltcG9ydCB7IEZldGNoUHJvdmlkZXIgfSBmcm9tICcuLi9jb3JlL3V0aWwvZmV0Y2hfcHJvdmlkZXInO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwsIENvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UsIFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgSWRUb2tlbk1mYVJlc3BvbnNlIH0gZnJvbSAnLi9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgU0VSVkVSX0VSUk9SX01BUCwgU2VydmVyRXJyb3IsIFNlcnZlckVycm9yTWFwIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5leHBvcnQgY29uc3QgZW51bSBIdHRwTWV0aG9kIHtcbiAgUE9TVCA9ICdQT1NUJyxcbiAgR0VUID0gJ0dFVCdcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gSHR0cEhlYWRlciB7XG4gIENPTlRFTlRfVFlQRSA9ICdDb250ZW50LVR5cGUnLFxuICBYX0ZJUkVCQVNFX0xPQ0FMRSA9ICdYLUZpcmViYXNlLUxvY2FsZScsXG4gIFhfQ0xJRU5UX1ZFUlNJT04gPSAnWC1DbGllbnQtVmVyc2lvbicsXG4gIFhfRklSRUJBU0VfR01QSUQgPSAnWC1GaXJlYmFzZS1nbXBpZCcsXG4gIFhfRklSRUJBU0VfQ0xJRU5UID0gJ1gtRmlyZWJhc2UtQ2xpZW50JyxcbiAgWF9GSVJFQkFTRV9BUFBfQ0hFQ0sgPSAnWC1GaXJlYmFzZS1BcHBDaGVjaydcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRW5kcG9pbnQge1xuICBDUkVBVEVfQVVUSF9VUkkgPSAnL3YxL2FjY291bnRzOmNyZWF0ZUF1dGhVcmknLFxuICBERUxFVEVfQUNDT1VOVCA9ICcvdjEvYWNjb3VudHM6ZGVsZXRlJyxcbiAgUkVTRVRfUEFTU1dPUkQgPSAnL3YxL2FjY291bnRzOnJlc2V0UGFzc3dvcmQnLFxuICBTSUdOX1VQID0gJy92MS9hY2NvdW50czpzaWduVXAnLFxuICBTSUdOX0lOX1dJVEhfQ1VTVE9NX1RPS0VOID0gJy92MS9hY2NvdW50czpzaWduSW5XaXRoQ3VzdG9tVG9rZW4nLFxuICBTSUdOX0lOX1dJVEhfRU1BSUxfTElOSyA9ICcvdjEvYWNjb3VudHM6c2lnbkluV2l0aEVtYWlsTGluaycsXG4gIFNJR05fSU5fV0lUSF9JRFAgPSAnL3YxL2FjY291bnRzOnNpZ25JbldpdGhJZHAnLFxuICBTSUdOX0lOX1dJVEhfUEFTU1dPUkQgPSAnL3YxL2FjY291bnRzOnNpZ25JbldpdGhQYXNzd29yZCcsXG4gIFNJR05fSU5fV0lUSF9QSE9ORV9OVU1CRVIgPSAnL3YxL2FjY291bnRzOnNpZ25JbldpdGhQaG9uZU51bWJlcicsXG4gIFNFTkRfVkVSSUZJQ0FUSU9OX0NPREUgPSAnL3YxL2FjY291bnRzOnNlbmRWZXJpZmljYXRpb25Db2RlJyxcbiAgU0VORF9PT0JfQ09ERSA9ICcvdjEvYWNjb3VudHM6c2VuZE9vYkNvZGUnLFxuICBTRVRfQUNDT1VOVF9JTkZPID0gJy92MS9hY2NvdW50czp1cGRhdGUnLFxuICBHRVRfQUNDT1VOVF9JTkZPID0gJy92MS9hY2NvdW50czpsb29rdXAnLFxuICBHRVRfUkVDQVBUQ0hBX1BBUkFNID0gJy92MS9yZWNhcHRjaGFQYXJhbXMnLFxuICBTVEFSVF9NRkFfRU5ST0xMTUVOVCA9ICcvdjIvYWNjb3VudHMvbWZhRW5yb2xsbWVudDpzdGFydCcsXG4gIEZJTkFMSVpFX01GQV9FTlJPTExNRU5UID0gJy92Mi9hY2NvdW50cy9tZmFFbnJvbGxtZW50OmZpbmFsaXplJyxcbiAgU1RBUlRfTUZBX1NJR05fSU4gPSAnL3YyL2FjY291bnRzL21mYVNpZ25JbjpzdGFydCcsXG4gIEZJTkFMSVpFX01GQV9TSUdOX0lOID0gJy92Mi9hY2NvdW50cy9tZmFTaWduSW46ZmluYWxpemUnLFxuICBXSVRIRFJBV19NRkEgPSAnL3YyL2FjY291bnRzL21mYUVucm9sbG1lbnQ6d2l0aGRyYXcnLFxuICBHRVRfUFJPSkVDVF9DT05GSUcgPSAnL3YxL3Byb2plY3RzJyxcbiAgR0VUX1JFQ0FQVENIQV9DT05GSUcgPSAnL3YyL3JlY2FwdGNoYUNvbmZpZycsXG4gIEdFVF9QQVNTV09SRF9QT0xJQ1kgPSAnL3YyL3Bhc3N3b3JkUG9saWN5J1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBSZWNhcHRjaGFDbGllbnRUeXBlIHtcbiAgV0VCID0gJ0NMSUVOVF9UWVBFX1dFQicsXG4gIEFORFJPSUQgPSAnQ0xJRU5UX1RZUEVfQU5EUk9JRCcsXG4gIElPUyA9ICdDTElFTlRfVFlQRV9JT1MnXG59XG5cbmV4cG9ydCBjb25zdCBlbnVtIFJlY2FwdGNoYVZlcnNpb24ge1xuICBFTlRFUlBSSVNFID0gJ1JFQ0FQVENIQV9FTlRFUlBSSVNFJ1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBSZWNhcHRjaGFBY3Rpb25OYW1lIHtcbiAgU0lHTl9JTl9XSVRIX1BBU1NXT1JEID0gJ3NpZ25JbldpdGhQYXNzd29yZCcsXG4gIEdFVF9PT0JfQ09ERSA9ICdnZXRPb2JDb2RlJyxcbiAgU0lHTl9VUF9QQVNTV09SRCA9ICdzaWduVXBQYXNzd29yZCdcbn1cblxuZXhwb3J0IGNvbnN0IGVudW0gRW5mb3JjZW1lbnRTdGF0ZSB7XG4gIEVORk9SQ0UgPSAnRU5GT1JDRScsXG4gIEFVRElUID0gJ0FVRElUJyxcbiAgT0ZGID0gJ09GRicsXG4gIEVORk9SQ0VNRU5UX1NUQVRFX1VOU1BFQ0lGSUVEID0gJ0VORk9SQ0VNRU5UX1NUQVRFX1VOU1BFQ0lGSUVEJ1xufVxuXG4vLyBQcm92aWRlcnMgdGhhdCBoYXZlIHJlQ0FQVENIQSBFbnRlcnByaXNlIHN1cHBvcnQuXG5leHBvcnQgY29uc3QgZW51bSBSZWNhcHRjaGFQcm92aWRlciB7XG4gIEVNQUlMX1BBU1NXT1JEX1BST1ZJREVSID0gJ0VNQUlMX1BBU1NXT1JEX1BST1ZJREVSJ1xufVxuXG5leHBvcnQgY29uc3QgREVGQVVMVF9BUElfVElNRU9VVF9NUyA9IG5ldyBEZWxheSgzMF8wMDAsIDYwXzAwMCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBfYWRkVGlkSWZOZWNlc3Nhcnk8VCBleHRlbmRzIHsgdGVuYW50SWQ/OiBzdHJpbmcgfT4oXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFRcbik6IFQge1xuICBpZiAoYXV0aC50ZW5hbnRJZCAmJiAhcmVxdWVzdC50ZW5hbnRJZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZXF1ZXN0LFxuICAgICAgdGVuYW50SWQ6IGF1dGgudGVuYW50SWRcbiAgICB9O1xuICB9XG4gIHJldHVybiByZXF1ZXN0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3BlcmZvcm1BcGlSZXF1ZXN0PFQsIFY+KFxuICBhdXRoOiBBdXRoLFxuICBtZXRob2Q6IEh0dHBNZXRob2QsXG4gIHBhdGg6IEVuZHBvaW50LFxuICByZXF1ZXN0PzogVCxcbiAgY3VzdG9tRXJyb3JNYXA6IFBhcnRpYWw8U2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+PiA9IHt9XG4pOiBQcm9taXNlPFY+IHtcbiAgcmV0dXJuIF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZyhhdXRoLCBjdXN0b21FcnJvck1hcCwgYXN5bmMgKCkgPT4ge1xuICAgIGxldCBib2R5ID0ge307XG4gICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICBpZiAobWV0aG9kID09PSBIdHRwTWV0aG9kLkdFVCkge1xuICAgICAgICBwYXJhbXMgPSByZXF1ZXN0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9keSA9IHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gcXVlcnlzdHJpbmcoe1xuICAgICAga2V5OiBhdXRoLmNvbmZpZy5hcGlLZXksXG4gICAgICAuLi5wYXJhbXNcbiAgICB9KS5zbGljZSgxKTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSBhd2FpdCAoYXV0aCBhcyBBdXRoSW50ZXJuYWwpLl9nZXRBZGRpdGlvbmFsSGVhZGVycygpO1xuICAgIGhlYWRlcnNbSHR0cEhlYWRlci5DT05URU5UX1RZUEVdID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgaWYgKGF1dGgubGFuZ3VhZ2VDb2RlKSB7XG4gICAgICBoZWFkZXJzW0h0dHBIZWFkZXIuWF9GSVJFQkFTRV9MT0NBTEVdID0gYXV0aC5sYW5ndWFnZUNvZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIEZldGNoUHJvdmlkZXIuZmV0Y2goKShcbiAgICAgIF9nZXRGaW5hbFRhcmdldChhdXRoLCBhdXRoLmNvbmZpZy5hcGlIb3N0LCBwYXRoLCBxdWVyeSksXG4gICAgICB7XG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcmVmZXJyZXJQb2xpY3k6ICduby1yZWZlcnJlcicsXG4gICAgICAgIC4uLmJvZHlcbiAgICAgIH1cbiAgICApO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZzxWPihcbiAgYXV0aDogQXV0aCxcbiAgY3VzdG9tRXJyb3JNYXA6IFBhcnRpYWw8U2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+PixcbiAgZmV0Y2hGbjogKCkgPT4gUHJvbWlzZTxSZXNwb25zZT5cbik6IFByb21pc2U8Vj4ge1xuICAoYXV0aCBhcyBBdXRoSW50ZXJuYWwpLl9jYW5Jbml0RW11bGF0b3IgPSBmYWxzZTtcbiAgY29uc3QgZXJyb3JNYXAgPSB7IC4uLlNFUlZFUl9FUlJPUl9NQVAsIC4uLmN1c3RvbUVycm9yTWFwIH07XG4gIHRyeSB7XG4gICAgY29uc3QgbmV0d29ya1RpbWVvdXQgPSBuZXcgTmV0d29ya1RpbWVvdXQ8UmVzcG9uc2U+KGF1dGgpO1xuICAgIGNvbnN0IHJlc3BvbnNlOiBSZXNwb25zZSA9IGF3YWl0IFByb21pc2UucmFjZTxQcm9taXNlPFJlc3BvbnNlPj4oW1xuICAgICAgZmV0Y2hGbigpLFxuICAgICAgbmV0d29ya1RpbWVvdXQucHJvbWlzZVxuICAgIF0pO1xuXG4gICAgLy8gSWYgd2UndmUgcmVhY2hlZCB0aGlzIHBvaW50LCB0aGUgZmV0Y2ggc3VjY2VlZGVkIGFuZCB0aGUgbmV0d29ya1RpbWVvdXRcbiAgICAvLyBkaWRuJ3QgdGhyb3c7IGNsZWFyIHRoZSBuZXR3b3JrIHRpbWVvdXQgZGVsYXkgc28gdGhhdCBOb2RlIHdvbid0IGhhbmdcbiAgICBuZXR3b3JrVGltZW91dC5jbGVhck5ldHdvcmtUaW1lb3V0KCk7XG5cbiAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGlmICgnbmVlZENvbmZpcm1hdGlvbicgaW4ganNvbikge1xuICAgICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLk5FRURfQ09ORklSTUFUSU9OLCBqc29uKTtcbiAgICB9XG5cbiAgICBpZiAocmVzcG9uc2Uub2sgJiYgISgnZXJyb3JNZXNzYWdlJyBpbiBqc29uKSkge1xuICAgICAgcmV0dXJuIGpzb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IHJlc3BvbnNlLm9rID8ganNvbi5lcnJvck1lc3NhZ2UgOiBqc29uLmVycm9yLm1lc3NhZ2U7XG4gICAgICBjb25zdCBbc2VydmVyRXJyb3JDb2RlLCBzZXJ2ZXJFcnJvck1lc3NhZ2VdID0gZXJyb3JNZXNzYWdlLnNwbGl0KCcgOiAnKTtcbiAgICAgIGlmIChzZXJ2ZXJFcnJvckNvZGUgPT09IFNlcnZlckVycm9yLkZFREVSQVRFRF9VU0VSX0lEX0FMUkVBRFlfTElOS0VEKSB7XG4gICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBBdXRoRXJyb3JDb2RlLkNSRURFTlRJQUxfQUxSRUFEWV9JTl9VU0UsXG4gICAgICAgICAganNvblxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChzZXJ2ZXJFcnJvckNvZGUgPT09IFNlcnZlckVycm9yLkVNQUlMX0VYSVNUUykge1xuICAgICAgICB0aHJvdyBfbWFrZVRhZ2dlZEVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuRU1BSUxfRVhJU1RTLCBqc29uKTtcbiAgICAgIH0gZWxzZSBpZiAoc2VydmVyRXJyb3JDb2RlID09PSBTZXJ2ZXJFcnJvci5VU0VSX0RJU0FCTEVEKSB7XG4gICAgICAgIHRocm93IF9tYWtlVGFnZ2VkRXJyb3IoYXV0aCwgQXV0aEVycm9yQ29kZS5VU0VSX0RJU0FCTEVELCBqc29uKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF1dGhFcnJvciA9XG4gICAgICAgIGVycm9yTWFwW3NlcnZlckVycm9yQ29kZSBhcyBTZXJ2ZXJFcnJvcl0gfHxcbiAgICAgICAgKHNlcnZlckVycm9yQ29kZVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLnJlcGxhY2UoL1tfXFxzXSsvZywgJy0nKSBhcyB1bmtub3duIGFzIEF1dGhFcnJvckNvZGUpO1xuICAgICAgaWYgKHNlcnZlckVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aHJvdyBfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZShhdXRoLCBhdXRoRXJyb3IsIHNlcnZlckVycm9yTWVzc2FnZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfZmFpbChhdXRoLCBhdXRoRXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChlIGluc3RhbmNlb2YgRmlyZWJhc2VFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgLy8gQ2hhbmdpbmcgdGhpcyB0byBhIGRpZmZlcmVudCBlcnJvciBjb2RlIHdpbGwgbG9nIHVzZXIgb3V0IHdoZW4gdGhlcmUgaXMgYSBuZXR3b3JrIGVycm9yXG4gICAgLy8gYmVjYXVzZSB3ZSB0cmVhdCBhbnkgZXJyb3Igb3RoZXIgdGhhbiBORVRXT1JLX1JFUVVFU1RfRkFJTEVEIGFzIHRva2VuIGlzIGludmFsaWQuXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9ibG9iLzRmYmM3MzYxMGQ3MGJlNGUwODUyZTdkZTYzYTM5Y2I3ODk3ZTg1NDYvcGFja2FnZXMvYXV0aC9zcmMvY29yZS9hdXRoL2F1dGhfaW1wbC50cyNMMzA5LUwzMTZcbiAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRUQsIHsgJ21lc3NhZ2UnOiBTdHJpbmcoZSkgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxULCBWIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlPihcbiAgYXV0aDogQXV0aCxcbiAgbWV0aG9kOiBIdHRwTWV0aG9kLFxuICBwYXRoOiBFbmRwb2ludCxcbiAgcmVxdWVzdD86IFQsXG4gIGN1c3RvbUVycm9yTWFwOiBQYXJ0aWFsPFNlcnZlckVycm9yTWFwPFNlcnZlckVycm9yPj4gPSB7fVxuKTogUHJvbWlzZTxWPiB7XG4gIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gKGF3YWl0IF9wZXJmb3JtQXBpUmVxdWVzdDxULCBWIHwgSWRUb2tlbk1mYVJlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIG1ldGhvZCxcbiAgICBwYXRoLFxuICAgIHJlcXVlc3QsXG4gICAgY3VzdG9tRXJyb3JNYXBcbiAgKSkgYXMgVjtcbiAgaWYgKCdtZmFQZW5kaW5nQ3JlZGVudGlhbCcgaW4gc2VydmVyUmVzcG9uc2UpIHtcbiAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLk1GQV9SRVFVSVJFRCwge1xuICAgICAgX3NlcnZlclJlc3BvbnNlOiBzZXJ2ZXJSZXNwb25zZVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHNlcnZlclJlc3BvbnNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldEZpbmFsVGFyZ2V0KFxuICBhdXRoOiBBdXRoLFxuICBob3N0OiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbiAgcXVlcnk6IHN0cmluZ1xuKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGAke2hvc3R9JHtwYXRofT8ke3F1ZXJ5fWA7XG5cbiAgaWYgKCEoYXV0aCBhcyBBdXRoSW50ZXJuYWwpLmNvbmZpZy5lbXVsYXRvcikge1xuICAgIHJldHVybiBgJHthdXRoLmNvbmZpZy5hcGlTY2hlbWV9Oi8vJHtiYXNlfWA7XG4gIH1cblxuICByZXR1cm4gX2VtdWxhdG9yVXJsKGF1dGguY29uZmlnIGFzIENvbmZpZ0ludGVybmFsLCBiYXNlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wYXJzZUVuZm9yY2VtZW50U3RhdGUoXG4gIGVuZm9yY2VtZW50U3RhdGVTdHI6IHN0cmluZ1xuKTogRW5mb3JjZW1lbnRTdGF0ZSB7XG4gIHN3aXRjaCAoZW5mb3JjZW1lbnRTdGF0ZVN0cikge1xuICAgIGNhc2UgJ0VORk9SQ0UnOlxuICAgICAgcmV0dXJuIEVuZm9yY2VtZW50U3RhdGUuRU5GT1JDRTtcbiAgICBjYXNlICdBVURJVCc6XG4gICAgICByZXR1cm4gRW5mb3JjZW1lbnRTdGF0ZS5BVURJVDtcbiAgICBjYXNlICdPRkYnOlxuICAgICAgcmV0dXJuIEVuZm9yY2VtZW50U3RhdGUuT0ZGO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gRW5mb3JjZW1lbnRTdGF0ZS5FTkZPUkNFTUVOVF9TVEFURV9VTlNQRUNJRklFRDtcbiAgfVxufVxuXG5jbGFzcyBOZXR3b3JrVGltZW91dDxUPiB7XG4gIC8vIE5vZGUgdGltZXJzIGFuZCBicm93c2VyIHRpbWVycyBhcmUgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUsIGJ1dCB3ZVxuICAvLyBkb24ndCBjYXJlIGFib3V0IHRoZSB2YWx1ZSBoZXJlXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgdGltZXI6IGFueSB8IG51bGwgPSBudWxsO1xuICByZWFkb25seSBwcm9taXNlID0gbmV3IFByb21pc2U8VD4oKF8sIHJlamVjdCkgPT4ge1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJldHVybiByZWplY3QoXG4gICAgICAgIF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRClcbiAgICAgICk7XG4gICAgfSwgREVGQVVMVF9BUElfVElNRU9VVF9NUy5nZXQoKSk7XG4gIH0pO1xuXG4gIGNsZWFyTmV0d29ya1RpbWVvdXQoKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhdXRoOiBBdXRoKSB7fVxufVxuXG5pbnRlcmZhY2UgUG90ZW50aWFsUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICBlbWFpbD86IHN0cmluZztcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfbWFrZVRhZ2dlZEVycm9yKFxuICBhdXRoOiBBdXRoLFxuICBjb2RlOiBBdXRoRXJyb3JDb2RlLFxuICByZXNwb25zZTogUG90ZW50aWFsUmVzcG9uc2Vcbik6IEZpcmViYXNlRXJyb3Ige1xuICBjb25zdCBlcnJvclBhcmFtczogTmFtZWRFcnJvclBhcmFtcyA9IHtcbiAgICBhcHBOYW1lOiBhdXRoLm5hbWVcbiAgfTtcblxuICBpZiAocmVzcG9uc2UuZW1haWwpIHtcbiAgICBlcnJvclBhcmFtcy5lbWFpbCA9IHJlc3BvbnNlLmVtYWlsO1xuICB9XG4gIGlmIChyZXNwb25zZS5waG9uZU51bWJlcikge1xuICAgIGVycm9yUGFyYW1zLnBob25lTnVtYmVyID0gcmVzcG9uc2UucGhvbmVOdW1iZXI7XG4gIH1cblxuICBjb25zdCBlcnJvciA9IF9jcmVhdGVFcnJvcihhdXRoLCBjb2RlLCBlcnJvclBhcmFtcyk7XG5cbiAgLy8gV2Uga25vdyBjdXN0b21EYXRhIGlzIGRlZmluZWQgb24gZXJyb3IgYmVjYXVzZSBlcnJvclBhcmFtcyBpcyBkZWZpbmVkXG4gIChlcnJvci5jdXN0b21EYXRhISBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSkuX3Rva2VuUmVzcG9uc2UgPSByZXNwb25zZTtcbiAgcmV0dXJuIGVycm9yO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFJlY2FwdGNoYVBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHtcbiAgR2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2UsXG4gIFJlY2FwdGNoYUVuZm9yY2VtZW50UHJvdmlkZXJTdGF0ZVxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vcmVjYXB0Y2hhJztcbmltcG9ydCB7IEVuZm9yY2VtZW50U3RhdGUsIF9wYXJzZUVuZm9yY2VtZW50U3RhdGUgfSBmcm9tICcuLi8uLi9hcGkvaW5kZXgnO1xuXG4vLyByZUNBUFRDSEEgdjIgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYSB7XG4gIHJlbmRlcjogKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHBhcmFtZXRlcnM6IFJlY2FwdGNoYVBhcmFtZXRlcnMpID0+IG51bWJlcjtcbiAgZ2V0UmVzcG9uc2U6IChpZDogbnVtYmVyKSA9PiBzdHJpbmc7XG4gIGV4ZWN1dGU6IChpZDogbnVtYmVyKSA9PiB1bmtub3duO1xuICByZXNldDogKGlkOiBudW1iZXIpID0+IHVua25vd247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1YyKFxuICBncmVjYXB0Y2hhOiBSZWNhcHRjaGEgfCBHcmVDQVBUQ0hBIHwgdW5kZWZpbmVkXG4pOiBncmVjYXB0Y2hhIGlzIFJlY2FwdGNoYSB7XG4gIHJldHVybiAoXG4gICAgZ3JlY2FwdGNoYSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGdyZWNhcHRjaGEgYXMgUmVjYXB0Y2hhKS5nZXRSZXNwb25zZSAhPT0gdW5kZWZpbmVkXG4gICk7XG59XG5cbi8vIHJlQ0FQVENIQSBFbnRlcnByaXNlICYgdjMgc2hhcmVkIGludGVyZmFjZVxuZXhwb3J0IGludGVyZmFjZSBHcmVDQVBUQ0hBVG9wTGV2ZWwgZXh0ZW5kcyBHcmVDQVBUQ0hBIHtcbiAgZW50ZXJwcmlzZTogR3JlQ0FQVENIQTtcbn1cblxuLy8gcmVDQVBUQ0hBIEVudGVycHJpc2UgaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIEdyZUNBUFRDSEEge1xuICByZWFkeTogKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuICBleGVjdXRlOiAoc2l0ZUtleTogc3RyaW5nLCBvcHRpb25zOiB7IGFjdGlvbjogc3RyaW5nIH0pID0+IFByb21pc2U8c3RyaW5nPjtcbiAgcmVuZGVyOiAoXG4gICAgY29udGFpbmVyOiBzdHJpbmcgfCBIVE1MRWxlbWVudCxcbiAgICBwYXJhbWV0ZXJzOiBHcmVDQVBUQ0hBUmVuZGVyT3B0aW9uXG4gICkgPT4gc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyZUNBUFRDSEFSZW5kZXJPcHRpb24ge1xuICBzaXRla2V5OiBzdHJpbmc7XG4gIHNpemU6ICdpbnZpc2libGUnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNFbnRlcnByaXNlKFxuICBncmVjYXB0Y2hhOiBSZWNhcHRjaGEgfCBHcmVDQVBUQ0hBIHwgdW5kZWZpbmVkXG4pOiBncmVjYXB0Y2hhIGlzIEdyZUNBUFRDSEFUb3BMZXZlbCB7XG4gIHJldHVybiAoXG4gICAgZ3JlY2FwdGNoYSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKGdyZWNhcHRjaGEgYXMgR3JlQ0FQVENIQVRvcExldmVsKS5lbnRlcnByaXNlICE9PSB1bmRlZmluZWRcbiAgKTtcbn1cblxuLy8gVE9ETyhjaHVhbnIpOiBSZXBsYWNlIHRoaXMgd2l0aCB0aGUgQXV0aFdpbmRvdyBhZnRlciByZXNvbHZpbmcgdGhlIGRlcGVuZGVuY3kgaXNzdWUgaW4gTm9kZS5qcyBlbnYuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIGdyZWNhcHRjaGE/OiBSZWNhcHRjaGEgfCBHcmVDQVBUQ0hBVG9wTGV2ZWw7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlY2FwdGNoYUNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgcmVDQVBUQ0hBIHNpdGUga2V5LlxuICAgKi9cbiAgc2l0ZUtleTogc3RyaW5nID0gJyc7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIHByb3ZpZGVycyBhbmQgdGhlaXIgZW5hYmxlbWVudCBzdGF0dXMgZm9yIHJlQ0FQVENIQSBFbnRlcnByaXNlLlxuICAgKi9cbiAgcmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZTogUmVjYXB0Y2hhRW5mb3JjZW1lbnRQcm92aWRlclN0YXRlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihyZXNwb25zZTogR2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2UucmVjYXB0Y2hhS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigncmVjYXB0Y2hhS2V5IHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICAvLyBFeGFtcGxlIHJlc3BvbnNlLnJlY2FwdGNoYUtleTogXCJwcm9qZWN0cy9wcm9qMTIzL2tleXMvc2l0ZWtleTEyM1wiXG4gICAgdGhpcy5zaXRlS2V5ID0gcmVzcG9uc2UucmVjYXB0Y2hhS2V5LnNwbGl0KCcvJylbM107XG4gICAgdGhpcy5yZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlID0gcmVzcG9uc2UucmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSByZUNBUFRDSEEgRW50ZXJwcmlzZSBlbmZvcmNlbWVudCBzdGF0ZSBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJTdHIgLSBUaGUgcHJvdmlkZXIgd2hvc2UgZW5mb3JjZW1lbnQgc3RhdGUgaXMgdG8gYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIFRoZSByZUNBUFRDSEEgRW50ZXJwcmlzZSBlbmZvcmNlbWVudCBzdGF0ZSBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyLlxuICAgKi9cbiAgZ2V0UHJvdmlkZXJFbmZvcmNlbWVudFN0YXRlKHByb3ZpZGVyU3RyOiBzdHJpbmcpOiBFbmZvcmNlbWVudFN0YXRlIHwgbnVsbCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMucmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZSB8fFxuICAgICAgdGhpcy5yZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlLmxlbmd0aCA9PT0gMFxuICAgICkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlIG9mIHRoaXMucmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZSkge1xuICAgICAgaWYgKFxuICAgICAgICByZWNhcHRjaGFFbmZvcmNlbWVudFN0YXRlLnByb3ZpZGVyICYmXG4gICAgICAgIHJlY2FwdGNoYUVuZm9yY2VtZW50U3RhdGUucHJvdmlkZXIgPT09IHByb3ZpZGVyU3RyXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIF9wYXJzZUVuZm9yY2VtZW50U3RhdGUoXG4gICAgICAgICAgcmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZS5lbmZvcmNlbWVudFN0YXRlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVDQVBUQ0hBIEVudGVycHJpc2UgZW5mb3JjZW1lbnQgc3RhdGUgZm9yIHRoZSBwcm92aWRlciBpcyBzZXQgdG8gRU5GT1JDRSBvciBBVURJVC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyU3RyIC0gVGhlIHByb3ZpZGVyIHdob3NlIGVuYWJsZW1lbnQgc3RhdGUgaXMgdG8gYmUgcmV0dXJuZWQuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHJlQ0FQVENIQSBFbnRlcnByaXNlIHByb3RlY3Rpb24gaXMgZW5hYmxlZCBmb3IgdGhlIGdpdmVuIHByb3ZpZGVyLlxuICAgKi9cbiAgaXNQcm92aWRlckVuYWJsZWQocHJvdmlkZXJTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmdldFByb3ZpZGVyRW5mb3JjZW1lbnRTdGF0ZShwcm92aWRlclN0cikgPT09XG4gICAgICAgIEVuZm9yY2VtZW50U3RhdGUuRU5GT1JDRSB8fFxuICAgICAgdGhpcy5nZXRQcm92aWRlckVuZm9yY2VtZW50U3RhdGUocHJvdmlkZXJTdHIpID09PSBFbmZvcmNlbWVudFN0YXRlLkFVRElUXG4gICAgKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBSZWNhcHRjaGFDbGllbnRUeXBlLFxuICBSZWNhcHRjaGFWZXJzaW9uLFxuICBfcGVyZm9ybUFwaVJlcXVlc3QsXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeVxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW50ZXJmYWNlIEdldFJlY2FwdGNoYVBhcmFtUmVzcG9uc2Uge1xuICByZWNhcHRjaGFTaXRlS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0UmVjYXB0Y2hhUGFyYW1zKGF1dGg6IEF1dGgpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gKFxuICAgIChcbiAgICAgIGF3YWl0IF9wZXJmb3JtQXBpUmVxdWVzdDx2b2lkLCBHZXRSZWNhcHRjaGFQYXJhbVJlc3BvbnNlPihcbiAgICAgICAgYXV0aCxcbiAgICAgICAgSHR0cE1ldGhvZC5HRVQsXG4gICAgICAgIEVuZHBvaW50LkdFVF9SRUNBUFRDSEFfUEFSQU1cbiAgICAgIClcbiAgICApLnJlY2FwdGNoYVNpdGVLZXkgfHwgJydcbiAgKTtcbn1cblxuLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGZvciByZUNBUFRDSEEgZW50ZXJwcmlzZSBpbnRlZ3JhdGlvbi5cbmludGVyZmFjZSBHZXRSZWNhcHRjaGFDb25maWdSZXF1ZXN0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGNsaWVudFR5cGU/OiBSZWNhcHRjaGFDbGllbnRUeXBlO1xuICB2ZXJzaW9uPzogUmVjYXB0Y2hhVmVyc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWNhcHRjaGFFbmZvcmNlbWVudFByb3ZpZGVyU3RhdGUge1xuICBwcm92aWRlcjogc3RyaW5nO1xuICBlbmZvcmNlbWVudFN0YXRlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2Uge1xuICByZWNhcHRjaGFLZXk6IHN0cmluZztcbiAgcmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZTogUmVjYXB0Y2hhRW5mb3JjZW1lbnRQcm92aWRlclN0YXRlW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSZWNhcHRjaGFDb25maWcoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldFJlY2FwdGNoYUNvbmZpZ1JlcXVlc3Rcbik6IFByb21pc2U8R2V0UmVjYXB0Y2hhQ29uZmlnUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBHZXRSZWNhcHRjaGFDb25maWdSZXF1ZXN0LFxuICAgIEdldFJlY2FwdGNoYUNvbmZpZ1Jlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICBFbmRwb2ludC5HRVRfUkVDQVBUQ0hBX0NPTkZJRyxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBFbmRwb2ludCwgSHR0cE1ldGhvZCwgX3BlcmZvcm1BcGlSZXF1ZXN0IH0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgTWZhRW5yb2xsbWVudCB9IGZyb20gJy4vbWZhJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUFjY291bnRSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlQWNjb3VudChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogRGVsZXRlQWNjb3VudFJlcXVlc3Rcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PERlbGV0ZUFjY291bnRSZXF1ZXN0LCB2b2lkPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5ERUxFVEVfQUNDT1VOVCxcbiAgICByZXF1ZXN0XG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXJVc2VySW5mbyB7XG4gIHByb3ZpZGVySWQ6IHN0cmluZztcbiAgcmF3SWQ/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgcGhvdG9Vcmw/OiBzdHJpbmc7XG4gIHBob25lTnVtYmVyPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUxpbmtlZEFjY291bnRzUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgZGVsZXRlUHJvdmlkZXI6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUxpbmtlZEFjY291bnRzUmVzcG9uc2Uge1xuICBwcm92aWRlclVzZXJJbmZvOiBQcm92aWRlclVzZXJJbmZvW107XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWxldGVMaW5rZWRBY2NvdW50cyhcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogRGVsZXRlTGlua2VkQWNjb3VudHNSZXF1ZXN0XG4pOiBQcm9taXNlPERlbGV0ZUxpbmtlZEFjY291bnRzUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBEZWxldGVMaW5rZWRBY2NvdW50c1JlcXVlc3QsXG4gICAgRGVsZXRlTGlua2VkQWNjb3VudHNSZXNwb25zZVxuICA+KGF1dGgsIEh0dHBNZXRob2QuUE9TVCwgRW5kcG9pbnQuU0VUX0FDQ09VTlRfSU5GTywgcmVxdWVzdCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQVBJVXNlckluZm8ge1xuICBsb2NhbElkPzogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgcGhvdG9Vcmw/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBlbWFpbFZlcmlmaWVkPzogYm9vbGVhbjtcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG4gIGxhc3RMb2dpbkF0PzogbnVtYmVyO1xuICBjcmVhdGVkQXQ/OiBudW1iZXI7XG4gIHRlbmFudElkPzogc3RyaW5nO1xuICBwYXNzd29yZEhhc2g/OiBzdHJpbmc7XG4gIHByb3ZpZGVyVXNlckluZm8/OiBQcm92aWRlclVzZXJJbmZvW107XG4gIG1mYUluZm8/OiBNZmFFbnJvbGxtZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QWNjb3VudEluZm9SZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEFjY291bnRJbmZvUmVzcG9uc2Uge1xuICB1c2VyczogQVBJVXNlckluZm9bXTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFjY291bnRJbmZvKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBHZXRBY2NvdW50SW5mb1JlcXVlc3Rcbik6IFByb21pc2U8R2V0QWNjb3VudEluZm9SZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PEdldEFjY291bnRJbmZvUmVxdWVzdCwgR2V0QWNjb3VudEluZm9SZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuR0VUX0FDQ09VTlRfSU5GTyxcbiAgICByZXF1ZXN0XG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyhcbiAgdXRjVGltZXN0YW1wPzogc3RyaW5nIHwgbnVtYmVyXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIXV0Y1RpbWVzdGFtcCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBDb252ZXJ0IHRvIGRhdGUgb2JqZWN0LlxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShOdW1iZXIodXRjVGltZXN0YW1wKSk7XG4gICAgLy8gVGVzdCBkYXRlIGlzIHZhbGlkLlxuICAgIGlmICghaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAvLyBDb252ZXJ0IHRvIFVUQyBkYXRlIHN0cmluZy5cbiAgICAgIHJldHVybiBkYXRlLnRvVVRDU3RyaW5nKCk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRG8gbm90aGluZy4gdW5kZWZpbmVkIHdpbGwgYmUgcmV0dXJuZWQuXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBJZFRva2VuUmVzdWx0LCBQYXJzZWRUb2tlbiwgVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBiYXNlNjREZWNvZGUsIGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2xvZ0Vycm9yIH0gZnJvbSAnLi4vdXRpbC9sb2cnO1xuaW1wb3J0IHsgdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nIH0gZnJvbSAnLi4vdXRpbC90aW1lJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG4vKipcbiAqIFJldHVybnMgYSBKU09OIFdlYiBUb2tlbiAoSldUKSB1c2VkIHRvIGlkZW50aWZ5IHRoZSB1c2VyIHRvIGEgRmlyZWJhc2Ugc2VydmljZS5cbiAqXG4gKiBAcmVtYXJrc1xuICogUmV0dXJucyB0aGUgY3VycmVudCB0b2tlbiBpZiBpdCBoYXMgbm90IGV4cGlyZWQgb3IgaWYgaXQgd2lsbCBub3QgZXhwaXJlIGluIHRoZSBuZXh0IGZpdmVcbiAqIG1pbnV0ZXMuIE90aGVyd2lzZSwgdGhpcyB3aWxsIHJlZnJlc2ggdGhlIHRva2VuIGFuZCByZXR1cm4gYSBuZXcgb25lLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gZm9yY2VSZWZyZXNoIC0gRm9yY2UgcmVmcmVzaCByZWdhcmRsZXNzIG9mIHRva2VuIGV4cGlyYXRpb24uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SWRUb2tlbih1c2VyOiBVc2VyLCBmb3JjZVJlZnJlc2ggPSBmYWxzZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZXNlcmlhbGl6ZWQgSlNPTiBXZWIgVG9rZW4gKEpXVCkgdXNlZCB0byBpZGVudGlmeSB0aGUgdXNlciB0byBhIEZpcmViYXNlIHNlcnZpY2UuXG4gKlxuICogQHJlbWFya3NcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgdG9rZW4gaWYgaXQgaGFzIG5vdCBleHBpcmVkIG9yIGlmIGl0IHdpbGwgbm90IGV4cGlyZSBpbiB0aGUgbmV4dCBmaXZlXG4gKiBtaW51dGVzLiBPdGhlcndpc2UsIHRoaXMgd2lsbCByZWZyZXNoIHRoZSB0b2tlbiBhbmQgcmV0dXJuIGEgbmV3IG9uZS5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIGZvcmNlUmVmcmVzaCAtIEZvcmNlIHJlZnJlc2ggcmVnYXJkbGVzcyBvZiB0b2tlbiBleHBpcmF0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldElkVG9rZW5SZXN1bHQoXG4gIHVzZXI6IFVzZXIsXG4gIGZvcmNlUmVmcmVzaCA9IGZhbHNlXG4pOiBQcm9taXNlPElkVG9rZW5SZXN1bHQ+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgdG9rZW4gPSBhd2FpdCB1c2VySW50ZXJuYWwuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xuICBjb25zdCBjbGFpbXMgPSBfcGFyc2VUb2tlbih0b2tlbik7XG5cbiAgX2Fzc2VydChcbiAgICBjbGFpbXMgJiYgY2xhaW1zLmV4cCAmJiBjbGFpbXMuYXV0aF90aW1lICYmIGNsYWltcy5pYXQsXG4gICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICApO1xuICBjb25zdCBmaXJlYmFzZSA9XG4gICAgdHlwZW9mIGNsYWltcy5maXJlYmFzZSA9PT0gJ29iamVjdCcgPyBjbGFpbXMuZmlyZWJhc2UgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc2lnbkluUHJvdmlkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGZpcmViYXNlPy5bJ3NpZ25faW5fcHJvdmlkZXInXTtcblxuICByZXR1cm4ge1xuICAgIGNsYWltcyxcbiAgICB0b2tlbixcbiAgICBhdXRoVGltZTogdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKFxuICAgICAgc2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzKGNsYWltcy5hdXRoX3RpbWUpXG4gICAgKSEsXG4gICAgaXNzdWVkQXRUaW1lOiB1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmcoXG4gICAgICBzZWNvbmRzU3RyaW5nVG9NaWxsaXNlY29uZHMoY2xhaW1zLmlhdClcbiAgICApISxcbiAgICBleHBpcmF0aW9uVGltZTogdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKFxuICAgICAgc2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzKGNsYWltcy5leHApXG4gICAgKSEsXG4gICAgc2lnbkluUHJvdmlkZXI6IHNpZ25JblByb3ZpZGVyIHx8IG51bGwsXG4gICAgc2lnbkluU2Vjb25kRmFjdG9yOiBmaXJlYmFzZT8uWydzaWduX2luX3NlY29uZF9mYWN0b3InXSB8fCBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNlY29uZHNTdHJpbmdUb01pbGxpc2Vjb25kcyhzZWNvbmRzOiBzdHJpbmcpOiBudW1iZXIge1xuICByZXR1cm4gTnVtYmVyKHNlY29uZHMpICogMTAwMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wYXJzZVRva2VuKHRva2VuOiBzdHJpbmcpOiBQYXJzZWRUb2tlbiB8IG51bGwge1xuICBjb25zdCBbYWxnb3JpdGhtLCBwYXlsb2FkLCBzaWduYXR1cmVdID0gdG9rZW4uc3BsaXQoJy4nKTtcbiAgaWYgKFxuICAgIGFsZ29yaXRobSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgcGF5bG9hZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgc2lnbmF0dXJlID09PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgX2xvZ0Vycm9yKCdKV1QgbWFsZm9ybWVkLCBjb250YWluZWQgZmV3ZXIgdGhhbiAzIHNlY3Rpb25zJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGRlY29kZWQgPSBiYXNlNjREZWNvZGUocGF5bG9hZCk7XG4gICAgaWYgKCFkZWNvZGVkKSB7XG4gICAgICBfbG9nRXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgYmFzZTY0IEpXVCBwYXlsb2FkJyk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlZCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBfbG9nRXJyb3IoXG4gICAgICAnQ2F1Z2h0IGVycm9yIHBhcnNpbmcgSldUIHBheWxvYWQgYXMgSlNPTicsXG4gICAgICAoZSBhcyBFcnJvcik/LnRvU3RyaW5nKClcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogRXh0cmFjdCBleHBpcmVzSW4gVFRMIGZyb20gYSB0b2tlbiBieSBzdWJ0cmFjdGluZyB0aGUgZXhwaXJhdGlvbiBmcm9tIHRoZSBpc3N1YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF90b2tlbkV4cGlyZXNJbih0b2tlbjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgcGFyc2VkVG9rZW4gPSBfcGFyc2VUb2tlbih0b2tlbik7XG4gIF9hc3NlcnQocGFyc2VkVG9rZW4sIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICBfYXNzZXJ0KHR5cGVvZiBwYXJzZWRUb2tlbi5leHAgIT09ICd1bmRlZmluZWQnLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgX2Fzc2VydCh0eXBlb2YgcGFyc2VkVG9rZW4uaWF0ICE9PSAndW5kZWZpbmVkJywgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIHJldHVybiBOdW1iZXIocGFyc2VkVG9rZW4uZXhwKSAtIE51bWJlcihwYXJzZWRUb2tlbi5pYXQpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfbG9nb3V0SWZJbnZhbGlkYXRlZDxUPihcbiAgdXNlcjogVXNlckludGVybmFsLFxuICBwcm9taXNlOiBQcm9taXNlPFQ+LFxuICBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZVxuKTogUHJvbWlzZTxUPiB7XG4gIGlmIChieXBhc3NBdXRoU3RhdGUpIHtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBGaXJlYmFzZUVycm9yICYmIGlzVXNlckludmFsaWRhdGVkKGUpKSB7XG4gICAgICBpZiAodXNlci5hdXRoLmN1cnJlbnRVc2VyID09PSB1c2VyKSB7XG4gICAgICAgIGF3YWl0IHVzZXIuYXV0aC5zaWduT3V0KCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1VzZXJJbnZhbGlkYXRlZCh7IGNvZGUgfTogRmlyZWJhc2VFcnJvcik6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGNvZGUgPT09IGBhdXRoLyR7QXV0aEVycm9yQ29kZS5VU0VSX0RJU0FCTEVEfWAgfHxcbiAgICBjb2RlID09PSBgYXV0aC8ke0F1dGhFcnJvckNvZGUuVE9LRU5fRVhQSVJFRH1gXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbi8vIFJlZnJlc2ggdGhlIHRva2VuIGZpdmUgbWludXRlcyBiZWZvcmUgZXhwaXJhdGlvblxuZXhwb3J0IGNvbnN0IGVudW0gRHVyYXRpb24ge1xuICBPRkZTRVQgPSA1ICogMTAwMCAqIDYwLFxuICBSRVRSWV9CQUNLT0ZGX01JTiA9IDMwICogMTAwMCxcbiAgUkVUUllfQkFDS09GRl9NQVggPSAxNiAqIDYwICogMTAwMFxufVxuXG5leHBvcnQgY2xhc3MgUHJvYWN0aXZlUmVmcmVzaCB7XG4gIHByaXZhdGUgaXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgLy8gTm9kZSB0aW1lcnMgYW5kIGJyb3dzZXIgdGltZXJzIHJldHVybiBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCB0eXBlcy5cbiAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgY2FyZSB3aGF0IHRoZSB2YWx1ZSBpcyBidXQgVFMgd29uJ3QgYWNjZXB0IHVua25vd24gYW5kXG4gIC8vIHdlIGNhbid0IGNhc3QgcHJvcGVybHkgaW4gYm90aCBlbnZpcm9ubWVudHMuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgdGltZXJJZDogYW55IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZXJyb3JCYWNrb2ZmID0gRHVyYXRpb24uUkVUUllfQkFDS09GRl9NSU47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB1c2VyOiBVc2VySW50ZXJuYWwpIHt9XG5cbiAgX3N0YXJ0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzUnVubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNSdW5uaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNjaGVkdWxlKCk7XG4gIH1cblxuICBfc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSdW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc1J1bm5pbmcgPSBmYWxzZTtcbiAgICBpZiAodGhpcy50aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcklkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEludGVydmFsKHdhc0Vycm9yOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICBpZiAod2FzRXJyb3IpIHtcbiAgICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5lcnJvckJhY2tvZmY7XG4gICAgICB0aGlzLmVycm9yQmFja29mZiA9IE1hdGgubWluKFxuICAgICAgICB0aGlzLmVycm9yQmFja29mZiAqIDIsXG4gICAgICAgIER1cmF0aW9uLlJFVFJZX0JBQ0tPRkZfTUFYXG4gICAgICApO1xuICAgICAgcmV0dXJuIGludGVydmFsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZXNldCB0aGUgZXJyb3IgYmFja29mZlxuICAgICAgdGhpcy5lcnJvckJhY2tvZmYgPSBEdXJhdGlvbi5SRVRSWV9CQUNLT0ZGX01JTjtcbiAgICAgIGNvbnN0IGV4cFRpbWUgPSB0aGlzLnVzZXIuc3RzVG9rZW5NYW5hZ2VyLmV4cGlyYXRpb25UaW1lID8/IDA7XG4gICAgICBjb25zdCBpbnRlcnZhbCA9IGV4cFRpbWUgLSBEYXRlLm5vdygpIC0gRHVyYXRpb24uT0ZGU0VUO1xuXG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgaW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGUod2FzRXJyb3IgPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1J1bm5pbmcpIHtcbiAgICAgIC8vIEp1c3QgaW4gY2FzZS4uLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVydmFsID0gdGhpcy5nZXRJbnRlcnZhbCh3YXNFcnJvcik7XG4gICAgdGhpcy50aW1lcklkID0gc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLml0ZXJhdGlvbigpO1xuICAgIH0sIGludGVydmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaXRlcmF0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnVzZXIuZ2V0SWRUb2tlbih0cnVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBPbmx5IHJldHJ5IG9uIG5ldHdvcmsgZXJyb3JzXG4gICAgICBpZiAoXG4gICAgICAgIChlIGFzIEZpcmViYXNlRXJyb3IpPy5jb2RlID09PVxuICAgICAgICBgYXV0aC8ke0F1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRH1gXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5zY2hlZHVsZSgvKiB3YXNFcnJvciAqLyB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNjaGVkdWxlKCk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyTWV0YWRhdGEgYXMgVXNlck1ldGFkYXRhVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IHV0Y1RpbWVzdGFtcFRvRGF0ZVN0cmluZyB9IGZyb20gJy4uL3V0aWwvdGltZSc7XG5cbmV4cG9ydCBjbGFzcyBVc2VyTWV0YWRhdGEgaW1wbGVtZW50cyBVc2VyTWV0YWRhdGFUeXBlIHtcbiAgY3JlYXRpb25UaW1lPzogc3RyaW5nO1xuICBsYXN0U2lnbkluVGltZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNyZWF0ZWRBdD86IHN0cmluZyB8IG51bWJlcixcbiAgICBwcml2YXRlIGxhc3RMb2dpbkF0Pzogc3RyaW5nIHwgbnVtYmVyXG4gICkge1xuICAgIHRoaXMuX2luaXRpYWxpemVUaW1lKCk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplVGltZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxhc3RTaWduSW5UaW1lID0gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHRoaXMubGFzdExvZ2luQXQpO1xuICAgIHRoaXMuY3JlYXRpb25UaW1lID0gdXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nKHRoaXMuY3JlYXRlZEF0KTtcbiAgfVxuXG4gIF9jb3B5KG1ldGFkYXRhOiBVc2VyTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IG1ldGFkYXRhLmNyZWF0ZWRBdDtcbiAgICB0aGlzLmxhc3RMb2dpbkF0ID0gbWV0YWRhdGEubGFzdExvZ2luQXQ7XG4gICAgdGhpcy5faW5pdGlhbGl6ZVRpbWUoKTtcbiAgfVxuXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBjcmVhdGVkQXQ6IHRoaXMuY3JlYXRlZEF0LFxuICAgICAgbGFzdExvZ2luQXQ6IHRoaXMubGFzdExvZ2luQXRcbiAgICB9O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlciwgVXNlckluZm8gfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQge1xuICBnZXRBY2NvdW50SW5mbyxcbiAgUHJvdmlkZXJVc2VySW5mb1xufSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L2FjY291bnQnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfbG9nb3V0SWZJbnZhbGlkYXRlZCB9IGZyb20gJy4vaW52YWxpZGF0aW9uJztcbmltcG9ydCB7IFVzZXJNZXRhZGF0YSB9IGZyb20gJy4vdXNlcl9tZXRhZGF0YSc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfcmVsb2FkV2l0aG91dFNhdmluZyh1c2VyOiBVc2VySW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXV0aCA9IHVzZXIuYXV0aDtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKFxuICAgIHVzZXIsXG4gICAgZ2V0QWNjb3VudEluZm8oYXV0aCwgeyBpZFRva2VuIH0pXG4gICk7XG5cbiAgX2Fzc2VydChyZXNwb25zZT8udXNlcnMubGVuZ3RoLCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcblxuICBjb25zdCBjb3JlQWNjb3VudCA9IHJlc3BvbnNlLnVzZXJzWzBdO1xuXG4gIHVzZXIuX25vdGlmeVJlbG9hZExpc3RlbmVyKGNvcmVBY2NvdW50KTtcblxuICBjb25zdCBuZXdQcm92aWRlckRhdGEgPSBjb3JlQWNjb3VudC5wcm92aWRlclVzZXJJbmZvPy5sZW5ndGhcbiAgICA/IGV4dHJhY3RQcm92aWRlckRhdGEoY29yZUFjY291bnQucHJvdmlkZXJVc2VySW5mbylcbiAgICA6IFtdO1xuXG4gIGNvbnN0IHByb3ZpZGVyRGF0YSA9IG1lcmdlUHJvdmlkZXJEYXRhKHVzZXIucHJvdmlkZXJEYXRhLCBuZXdQcm92aWRlckRhdGEpO1xuXG4gIC8vIFByZXNlcnZlcyB0aGUgbm9uLW5vbnltb3VzIHN0YXR1cyBvZiB0aGUgc3RvcmVkIHVzZXIsIGV2ZW4gaWYgbm8gbW9yZVxuICAvLyBjcmVkZW50aWFscyAoZmVkZXJhdGVkIG9yIGVtYWlsL3Bhc3N3b3JkKSBhcmUgbGlua2VkIHRvIHRoZSB1c2VyLiBJZlxuICAvLyB0aGUgdXNlciB3YXMgcHJldmlvdXNseSBhbm9ueW1vdXMsIHRoZW4gdXNlIHByb3ZpZGVyIGRhdGEgdG8gdXBkYXRlLlxuICAvLyBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgaXQgd2FzIG5vdCBhbm9ueW1vdXMgYmVmb3JlLCBpdCBzaG91bGQgbmV2ZXIgYmVcbiAgLy8gY29uc2lkZXJlZCBhbm9ueW1vdXMgbm93LlxuICBjb25zdCBvbGRJc0Fub255bW91cyA9IHVzZXIuaXNBbm9ueW1vdXM7XG4gIGNvbnN0IG5ld0lzQW5vbnltb3VzID1cbiAgICAhKHVzZXIuZW1haWwgJiYgY29yZUFjY291bnQucGFzc3dvcmRIYXNoKSAmJiAhcHJvdmlkZXJEYXRhPy5sZW5ndGg7XG4gIGNvbnN0IGlzQW5vbnltb3VzID0gIW9sZElzQW5vbnltb3VzID8gZmFsc2UgOiBuZXdJc0Fub255bW91cztcblxuICBjb25zdCB1cGRhdGVzOiBQYXJ0aWFsPFVzZXJJbnRlcm5hbD4gPSB7XG4gICAgdWlkOiBjb3JlQWNjb3VudC5sb2NhbElkLFxuICAgIGRpc3BsYXlOYW1lOiBjb3JlQWNjb3VudC5kaXNwbGF5TmFtZSB8fCBudWxsLFxuICAgIHBob3RvVVJMOiBjb3JlQWNjb3VudC5waG90b1VybCB8fCBudWxsLFxuICAgIGVtYWlsOiBjb3JlQWNjb3VudC5lbWFpbCB8fCBudWxsLFxuICAgIGVtYWlsVmVyaWZpZWQ6IGNvcmVBY2NvdW50LmVtYWlsVmVyaWZpZWQgfHwgZmFsc2UsXG4gICAgcGhvbmVOdW1iZXI6IGNvcmVBY2NvdW50LnBob25lTnVtYmVyIHx8IG51bGwsXG4gICAgdGVuYW50SWQ6IGNvcmVBY2NvdW50LnRlbmFudElkIHx8IG51bGwsXG4gICAgcHJvdmlkZXJEYXRhLFxuICAgIG1ldGFkYXRhOiBuZXcgVXNlck1ldGFkYXRhKGNvcmVBY2NvdW50LmNyZWF0ZWRBdCwgY29yZUFjY291bnQubGFzdExvZ2luQXQpLFxuICAgIGlzQW5vbnltb3VzXG4gIH07XG5cbiAgT2JqZWN0LmFzc2lnbih1c2VyLCB1cGRhdGVzKTtcbn1cblxuLyoqXG4gKiBSZWxvYWRzIHVzZXIgYWNjb3VudCBkYXRhLCBpZiBzaWduZWQgaW4uXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWxvYWQodXNlcjogVXNlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWw6IFVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXJJbnRlcm5hbCk7XG5cbiAgLy8gRXZlbiB0aG91Z2ggdGhlIGN1cnJlbnQgdXNlciBoYXNuJ3QgY2hhbmdlZCwgdXBkYXRlXG4gIC8vIGN1cnJlbnQgdXNlciB3aWxsIHRyaWdnZXIgYSBwZXJzaXN0ZW5jZSB1cGRhdGUgdy8gdGhlXG4gIC8vIG5ldyBpbmZvLlxuICBhd2FpdCB1c2VySW50ZXJuYWwuYXV0aC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQodXNlckludGVybmFsKTtcbiAgdXNlckludGVybmFsLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh1c2VySW50ZXJuYWwpO1xufVxuXG5mdW5jdGlvbiBtZXJnZVByb3ZpZGVyRGF0YShcbiAgb3JpZ2luYWw6IFVzZXJJbmZvW10sXG4gIG5ld0RhdGE6IFVzZXJJbmZvW11cbik6IFVzZXJJbmZvW10ge1xuICBjb25zdCBkZWR1cGVkID0gb3JpZ2luYWwuZmlsdGVyKFxuICAgIG8gPT4gIW5ld0RhdGEuc29tZShuID0+IG4ucHJvdmlkZXJJZCA9PT0gby5wcm92aWRlcklkKVxuICApO1xuICByZXR1cm4gWy4uLmRlZHVwZWQsIC4uLm5ld0RhdGFdO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UHJvdmlkZXJEYXRhKHByb3ZpZGVyczogUHJvdmlkZXJVc2VySW5mb1tdKTogVXNlckluZm9bXSB7XG4gIHJldHVybiBwcm92aWRlcnMubWFwKCh7IHByb3ZpZGVySWQsIC4uLnByb3ZpZGVyIH0pID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdmlkZXJJZCxcbiAgICAgIHVpZDogcHJvdmlkZXIucmF3SWQgfHwgJycsXG4gICAgICBkaXNwbGF5TmFtZTogcHJvdmlkZXIuZGlzcGxheU5hbWUgfHwgbnVsbCxcbiAgICAgIGVtYWlsOiBwcm92aWRlci5lbWFpbCB8fCBudWxsLFxuICAgICAgcGhvbmVOdW1iZXI6IHByb3ZpZGVyLnBob25lTnVtYmVyIHx8IG51bGwsXG4gICAgICBwaG90b1VSTDogcHJvdmlkZXIucGhvdG9VcmwgfHwgbnVsbFxuICAgIH07XG4gIH0pO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuXG5pbXBvcnQgeyBxdWVyeXN0cmluZyB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHtcbiAgX2dldEZpbmFsVGFyZ2V0LFxuICBfcGVyZm9ybUZldGNoV2l0aEVycm9ySGFuZGxpbmcsXG4gIEh0dHBNZXRob2QsXG4gIEh0dHBIZWFkZXJcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgRmV0Y2hQcm92aWRlciB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9mZXRjaF9wcm92aWRlcic7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuXG5leHBvcnQgY29uc3QgZW51bSBFbmRwb2ludCB7XG4gIFRPS0VOID0gJy92MS90b2tlbidcbn1cblxuLyoqIFRoZSBzZXJ2ZXIgcmVzcG9uc2VzIHdpdGggc25ha2VfY2FzZTsgd2UgY29udmVydCB0byBjYW1lbENhc2UgKi9cbmludGVyZmFjZSBSZXF1ZXN0U3RzVG9rZW5TZXJ2ZXJSZXNwb25zZSB7XG4gIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICBleHBpcmVzX2luOiBzdHJpbmc7XG4gIHJlZnJlc2hfdG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0U3RzVG9rZW5SZXNwb25zZSB7XG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIGV4cGlyZXNJbjogc3RyaW5nO1xuICByZWZyZXNoVG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RTdHNUb2tlbihcbiAgYXV0aDogQXV0aCxcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmdcbik6IFByb21pc2U8UmVxdWVzdFN0c1Rva2VuUmVzcG9uc2U+IHtcbiAgY29uc3QgcmVzcG9uc2UgPVxuICAgIGF3YWl0IF9wZXJmb3JtRmV0Y2hXaXRoRXJyb3JIYW5kbGluZzxSZXF1ZXN0U3RzVG9rZW5TZXJ2ZXJSZXNwb25zZT4oXG4gICAgICBhdXRoLFxuICAgICAge30sXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBxdWVyeXN0cmluZyh7XG4gICAgICAgICAgJ2dyYW50X3R5cGUnOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgJ3JlZnJlc2hfdG9rZW4nOiByZWZyZXNoVG9rZW5cbiAgICAgICAgfSkuc2xpY2UoMSk7XG4gICAgICAgIGNvbnN0IHsgdG9rZW5BcGlIb3N0LCBhcGlLZXkgfSA9IGF1dGguY29uZmlnO1xuICAgICAgICBjb25zdCB1cmwgPSBfZ2V0RmluYWxUYXJnZXQoXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICB0b2tlbkFwaUhvc3QsXG4gICAgICAgICAgRW5kcG9pbnQuVE9LRU4sXG4gICAgICAgICAgYGtleT0ke2FwaUtleX1gXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgaGVhZGVycyA9IGF3YWl0IChhdXRoIGFzIEF1dGhJbnRlcm5hbCkuX2dldEFkZGl0aW9uYWxIZWFkZXJzKCk7XG4gICAgICAgIGhlYWRlcnNbSHR0cEhlYWRlci5DT05URU5UX1RZUEVdID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG5cbiAgICAgICAgcmV0dXJuIEZldGNoUHJvdmlkZXIuZmV0Y2goKSh1cmwsIHtcbiAgICAgICAgICBtZXRob2Q6IEh0dHBNZXRob2QuUE9TVCxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIGJvZHlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgKTtcblxuICAvLyBUaGUgcmVzcG9uc2UgY29tZXMgYmFjayBpbiBzbmFrZV9jYXNlLiBDb252ZXJ0IHRvIGNhbWVsOlxuICByZXR1cm4ge1xuICAgIGFjY2Vzc1Rva2VuOiByZXNwb25zZS5hY2Nlc3NfdG9rZW4sXG4gICAgZXhwaXJlc0luOiByZXNwb25zZS5leHBpcmVzX2luLFxuICAgIHJlZnJlc2hUb2tlbjogcmVzcG9uc2UucmVmcmVzaF90b2tlblxuICB9O1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpbmFsaXplTWZhUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vbWZhJztcbmltcG9ydCB7IHJlcXVlc3RTdHNUb2tlbiB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi90b2tlbic7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGVyc2lzdGVkQmxvYiB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7IF9hc3NlcnQsIGRlYnVnRmFpbCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF90b2tlbkV4cGlyZXNJbiB9IGZyb20gJy4vaWRfdG9rZW5fcmVzdWx0JztcblxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIG9mZmljaWFsIGV4cGlyYXRpb24gdGltZSBvZiBhIHRva2VuXG4gKiB0byByZWZyZXNoIHRoYXQgdG9rZW4sIHRvIHByb3ZpZGUgYSBidWZmZXIgZm9yIFJQQ3MgdG8gY29tcGxldGUuXG4gKi9cbmV4cG9ydCBjb25zdCBlbnVtIEJ1ZmZlciB7XG4gIFRPS0VOX1JFRlJFU0ggPSAzMF8wMDBcbn1cblxuLyoqXG4gKiBXZSBuZWVkIHRvIG1hcmsgdGhpcyBjbGFzcyBhcyBpbnRlcm5hbCBleHBsaWNpdGx5IHRvIGV4Y2x1ZGUgaXQgaW4gdGhlIHB1YmxpYyB0eXBpbmdzLCBiZWNhdXNlXG4gKiBpdCByZWZlcmVuY2VzIEF1dGhJbnRlcm5hbCB3aGljaCBoYXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpdGggVXNlckludGVybmFsLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgU3RzVG9rZW5NYW5hZ2VyIHtcbiAgcmVmcmVzaFRva2VuOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgYWNjZXNzVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBleHBpcmF0aW9uVGltZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgZ2V0IGlzRXhwaXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgIXRoaXMuZXhwaXJhdGlvblRpbWUgfHxcbiAgICAgIERhdGUubm93KCkgPiB0aGlzLmV4cGlyYXRpb25UaW1lIC0gQnVmZmVyLlRPS0VOX1JFRlJFU0hcbiAgICApO1xuICB9XG5cbiAgdXBkYXRlRnJvbVNlcnZlclJlc3BvbnNlKFxuICAgIHJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2UgfCBGaW5hbGl6ZU1mYVJlc3BvbnNlXG4gICk6IHZvaWQge1xuICAgIF9hc3NlcnQocmVzcG9uc2UuaWRUb2tlbiwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgX2Fzc2VydChcbiAgICAgIHR5cGVvZiByZXNwb25zZS5pZFRva2VuICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgcmVzcG9uc2UucmVmcmVzaFRva2VuICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuICAgIGNvbnN0IGV4cGlyZXNJbiA9XG4gICAgICAnZXhwaXJlc0luJyBpbiByZXNwb25zZSAmJiB0eXBlb2YgcmVzcG9uc2UuZXhwaXJlc0luICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICA/IE51bWJlcihyZXNwb25zZS5leHBpcmVzSW4pXG4gICAgICAgIDogX3Rva2VuRXhwaXJlc0luKHJlc3BvbnNlLmlkVG9rZW4pO1xuICAgIHRoaXMudXBkYXRlVG9rZW5zQW5kRXhwaXJhdGlvbihcbiAgICAgIHJlc3BvbnNlLmlkVG9rZW4sXG4gICAgICByZXNwb25zZS5yZWZyZXNoVG9rZW4sXG4gICAgICBleHBpcmVzSW5cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0VG9rZW4oXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGZvcmNlUmVmcmVzaCA9IGZhbHNlXG4gICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIF9hc3NlcnQoXG4gICAgICAhdGhpcy5hY2Nlc3NUb2tlbiB8fCB0aGlzLnJlZnJlc2hUb2tlbixcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLlRPS0VOX0VYUElSRURcbiAgICApO1xuXG4gICAgaWYgKCFmb3JjZVJlZnJlc2ggJiYgdGhpcy5hY2Nlc3NUb2tlbiAmJiAhdGhpcy5pc0V4cGlyZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFjY2Vzc1Rva2VuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlZnJlc2hUb2tlbikge1xuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKGF1dGgsIHRoaXMucmVmcmVzaFRva2VuISk7XG4gICAgICByZXR1cm4gdGhpcy5hY2Nlc3NUb2tlbjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNsZWFyUmVmcmVzaFRva2VuKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaFRva2VuID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaChhdXRoOiBBdXRoSW50ZXJuYWwsIG9sZFRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCByZWZyZXNoVG9rZW4sIGV4cGlyZXNJbiB9ID0gYXdhaXQgcmVxdWVzdFN0c1Rva2VuKFxuICAgICAgYXV0aCxcbiAgICAgIG9sZFRva2VuXG4gICAgKTtcbiAgICB0aGlzLnVwZGF0ZVRva2Vuc0FuZEV4cGlyYXRpb24oXG4gICAgICBhY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgIE51bWJlcihleHBpcmVzSW4pXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlVG9rZW5zQW5kRXhwaXJhdGlvbihcbiAgICBhY2Nlc3NUb2tlbjogc3RyaW5nLFxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgIGV4cGlyZXNJblNlYzogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaFRva2VuID0gcmVmcmVzaFRva2VuIHx8IG51bGw7XG4gICAgdGhpcy5hY2Nlc3NUb2tlbiA9IGFjY2Vzc1Rva2VuIHx8IG51bGw7XG4gICAgdGhpcy5leHBpcmF0aW9uVGltZSA9IERhdGUubm93KCkgKyBleHBpcmVzSW5TZWMgKiAxMDAwO1xuICB9XG5cbiAgc3RhdGljIGZyb21KU09OKGFwcE5hbWU6IHN0cmluZywgb2JqZWN0OiBQZXJzaXN0ZWRCbG9iKTogU3RzVG9rZW5NYW5hZ2VyIHtcbiAgICBjb25zdCB7IHJlZnJlc2hUb2tlbiwgYWNjZXNzVG9rZW4sIGV4cGlyYXRpb25UaW1lIH0gPSBvYmplY3Q7XG5cbiAgICBjb25zdCBtYW5hZ2VyID0gbmV3IFN0c1Rva2VuTWFuYWdlcigpO1xuICAgIGlmIChyZWZyZXNoVG9rZW4pIHtcbiAgICAgIF9hc3NlcnQodHlwZW9mIHJlZnJlc2hUb2tlbiA9PT0gJ3N0cmluZycsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsIHtcbiAgICAgICAgYXBwTmFtZVxuICAgICAgfSk7XG4gICAgICBtYW5hZ2VyLnJlZnJlc2hUb2tlbiA9IHJlZnJlc2hUb2tlbjtcbiAgICB9XG4gICAgaWYgKGFjY2Vzc1Rva2VuKSB7XG4gICAgICBfYXNzZXJ0KHR5cGVvZiBhY2Nlc3NUb2tlbiA9PT0gJ3N0cmluZycsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsIHtcbiAgICAgICAgYXBwTmFtZVxuICAgICAgfSk7XG4gICAgICBtYW5hZ2VyLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgfVxuICAgIGlmIChleHBpcmF0aW9uVGltZSkge1xuICAgICAgX2Fzc2VydChcbiAgICAgICAgdHlwZW9mIGV4cGlyYXRpb25UaW1lID09PSAnbnVtYmVyJyxcbiAgICAgICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUixcbiAgICAgICAge1xuICAgICAgICAgIGFwcE5hbWVcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIG1hbmFnZXIuZXhwaXJhdGlvblRpbWUgPSBleHBpcmF0aW9uVGltZTtcbiAgICB9XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH1cblxuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmcmVzaFRva2VuOiB0aGlzLnJlZnJlc2hUb2tlbixcbiAgICAgIGFjY2Vzc1Rva2VuOiB0aGlzLmFjY2Vzc1Rva2VuLFxuICAgICAgZXhwaXJhdGlvblRpbWU6IHRoaXMuZXhwaXJhdGlvblRpbWVcbiAgICB9O1xuICB9XG5cbiAgX2Fzc2lnbihzdHNUb2tlbk1hbmFnZXI6IFN0c1Rva2VuTWFuYWdlcik6IHZvaWQge1xuICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBzdHNUb2tlbk1hbmFnZXIuYWNjZXNzVG9rZW47XG4gICAgdGhpcy5yZWZyZXNoVG9rZW4gPSBzdHNUb2tlbk1hbmFnZXIucmVmcmVzaFRva2VuO1xuICAgIHRoaXMuZXhwaXJhdGlvblRpbWUgPSBzdHNUb2tlbk1hbmFnZXIuZXhwaXJhdGlvblRpbWU7XG4gIH1cblxuICBfY2xvbmUoKTogU3RzVG9rZW5NYW5hZ2VyIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgU3RzVG9rZW5NYW5hZ2VyKCksIHRoaXMudG9KU09OKCkpO1xuICB9XG5cbiAgX3BlcmZvcm1SZWZyZXNoKCk6IG5ldmVyIHtcbiAgICByZXR1cm4gZGVidWdGYWlsKCdub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IElkVG9rZW5SZXN1bHQgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgTmV4dEZuIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQge1xuICBBUElVc2VySW5mbyxcbiAgZGVsZXRlQWNjb3VudFxufSBmcm9tICcuLi8uLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L2FjY291bnQnO1xuaW1wb3J0IHsgRmluYWxpemVNZmFSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQge1xuICBNdXRhYmxlVXNlckluZm8sXG4gIFVzZXJJbnRlcm5hbCxcbiAgVXNlclBhcmFtZXRlcnNcbn0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IFBlcnNpc3RlZEJsb2IgfSBmcm9tICcuLi9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgZ2V0SWRUb2tlblJlc3VsdCB9IGZyb20gJy4vaWRfdG9rZW5fcmVzdWx0JztcbmltcG9ydCB7IF9sb2dvdXRJZkludmFsaWRhdGVkIH0gZnJvbSAnLi9pbnZhbGlkYXRpb24nO1xuaW1wb3J0IHsgUHJvYWN0aXZlUmVmcmVzaCB9IGZyb20gJy4vcHJvYWN0aXZlX3JlZnJlc2gnO1xuaW1wb3J0IHsgX3JlbG9hZFdpdGhvdXRTYXZpbmcsIHJlbG9hZCB9IGZyb20gJy4vcmVsb2FkJztcbmltcG9ydCB7IFN0c1Rva2VuTWFuYWdlciB9IGZyb20gJy4vdG9rZW5fbWFuYWdlcic7XG5pbXBvcnQgeyBVc2VyTWV0YWRhdGEgfSBmcm9tICcuL3VzZXJfbWV0YWRhdGEnO1xuaW1wb3J0IHsgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuZnVuY3Rpb24gYXNzZXJ0U3RyaW5nT3JVbmRlZmluZWQoXG4gIGFzc2VydGlvbjogdW5rbm93bixcbiAgYXBwTmFtZTogc3RyaW5nXG4pOiBhc3NlcnRzIGFzc2VydGlvbiBpcyBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBfYXNzZXJ0KFxuICAgIHR5cGVvZiBhc3NlcnRpb24gPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBhc3NlcnRpb24gPT09ICd1bmRlZmluZWQnLFxuICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsXG4gICAgeyBhcHBOYW1lIH1cbiAgKTtcbn1cblxuZXhwb3J0IGNsYXNzIFVzZXJJbXBsIGltcGxlbWVudHMgVXNlckludGVybmFsIHtcbiAgLy8gRm9yIHRoZSB1c2VyIG9iamVjdCwgcHJvdmlkZXIgaXMgYWx3YXlzIEZpcmViYXNlLlxuICByZWFkb25seSBwcm92aWRlcklkID0gUHJvdmlkZXJJZC5GSVJFQkFTRTtcbiAgc3RzVG9rZW5NYW5hZ2VyOiBTdHNUb2tlbk1hbmFnZXI7XG4gIC8vIExhc3Qga25vd24gYWNjZXNzVG9rZW4gc28gd2Uga25vdyB3aGVuIGl0IGNoYW5nZXNcbiAgcHJpdmF0ZSBhY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbDtcblxuICB1aWQ6IHN0cmluZztcbiAgYXV0aDogQXV0aEludGVybmFsO1xuICBlbWFpbFZlcmlmaWVkOiBib29sZWFuO1xuICBpc0Fub255bW91czogYm9vbGVhbjtcbiAgdGVuYW50SWQ6IHN0cmluZyB8IG51bGw7XG4gIHJlYWRvbmx5IG1ldGFkYXRhOiBVc2VyTWV0YWRhdGE7XG4gIHByb3ZpZGVyRGF0YTogTXV0YWJsZVVzZXJJbmZvW107XG5cbiAgLy8gT3B0aW9uYWwgZmllbGRzIGZyb20gVXNlckluZm9cbiAgZGlzcGxheU5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsO1xuICBwaG9uZU51bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgcGhvdG9VUkw6IHN0cmluZyB8IG51bGw7XG5cbiAgX3JlZGlyZWN0RXZlbnRJZD86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9hY3RpdmVSZWZyZXNoID0gbmV3IFByb2FjdGl2ZVJlZnJlc2godGhpcyk7XG5cbiAgY29uc3RydWN0b3IoeyB1aWQsIGF1dGgsIHN0c1Rva2VuTWFuYWdlciwgLi4ub3B0IH06IFVzZXJQYXJhbWV0ZXJzKSB7XG4gICAgdGhpcy51aWQgPSB1aWQ7XG4gICAgdGhpcy5hdXRoID0gYXV0aDtcbiAgICB0aGlzLnN0c1Rva2VuTWFuYWdlciA9IHN0c1Rva2VuTWFuYWdlcjtcbiAgICB0aGlzLmFjY2Vzc1Rva2VuID0gc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuO1xuICAgIHRoaXMuZGlzcGxheU5hbWUgPSBvcHQuZGlzcGxheU5hbWUgfHwgbnVsbDtcbiAgICB0aGlzLmVtYWlsID0gb3B0LmVtYWlsIHx8IG51bGw7XG4gICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gb3B0LmVtYWlsVmVyaWZpZWQgfHwgZmFsc2U7XG4gICAgdGhpcy5waG9uZU51bWJlciA9IG9wdC5waG9uZU51bWJlciB8fCBudWxsO1xuICAgIHRoaXMucGhvdG9VUkwgPSBvcHQucGhvdG9VUkwgfHwgbnVsbDtcbiAgICB0aGlzLmlzQW5vbnltb3VzID0gb3B0LmlzQW5vbnltb3VzIHx8IGZhbHNlO1xuICAgIHRoaXMudGVuYW50SWQgPSBvcHQudGVuYW50SWQgfHwgbnVsbDtcbiAgICB0aGlzLnByb3ZpZGVyRGF0YSA9IG9wdC5wcm92aWRlckRhdGEgPyBbLi4ub3B0LnByb3ZpZGVyRGF0YV0gOiBbXTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbmV3IFVzZXJNZXRhZGF0YShcbiAgICAgIG9wdC5jcmVhdGVkQXQgfHwgdW5kZWZpbmVkLFxuICAgICAgb3B0Lmxhc3RMb2dpbkF0IHx8IHVuZGVmaW5lZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRJZFRva2VuKGZvcmNlUmVmcmVzaD86IGJvb2xlYW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQoXG4gICAgICB0aGlzLFxuICAgICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIuZ2V0VG9rZW4odGhpcy5hdXRoLCBmb3JjZVJlZnJlc2gpXG4gICAgKTtcbiAgICBfYXNzZXJ0KGFjY2Vzc1Rva2VuLCB0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuXG4gICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4gIT09IGFjY2Vzc1Rva2VuKSB7XG4gICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgICBhd2FpdCB0aGlzLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHRoaXMpO1xuICAgICAgdGhpcy5hdXRoLl9ub3RpZnlMaXN0ZW5lcnNJZkN1cnJlbnQodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFjY2Vzc1Rva2VuO1xuICB9XG5cbiAgZ2V0SWRUb2tlblJlc3VsdChmb3JjZVJlZnJlc2g/OiBib29sZWFuKTogUHJvbWlzZTxJZFRva2VuUmVzdWx0PiB7XG4gICAgcmV0dXJuIGdldElkVG9rZW5SZXN1bHQodGhpcywgZm9yY2VSZWZyZXNoKTtcbiAgfVxuXG4gIHJlbG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gcmVsb2FkKHRoaXMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWxvYWRVc2VySW5mbzogQVBJVXNlckluZm8gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWxvYWRMaXN0ZW5lcjogTmV4dEZuPEFQSVVzZXJJbmZvPiB8IG51bGwgPSBudWxsO1xuXG4gIF9hc3NpZ24odXNlcjogVXNlckludGVybmFsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMgPT09IHVzZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgX2Fzc2VydCh0aGlzLnVpZCA9PT0gdXNlci51aWQsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgdGhpcy5kaXNwbGF5TmFtZSA9IHVzZXIuZGlzcGxheU5hbWU7XG4gICAgdGhpcy5waG90b1VSTCA9IHVzZXIucGhvdG9VUkw7XG4gICAgdGhpcy5lbWFpbCA9IHVzZXIuZW1haWw7XG4gICAgdGhpcy5lbWFpbFZlcmlmaWVkID0gdXNlci5lbWFpbFZlcmlmaWVkO1xuICAgIHRoaXMucGhvbmVOdW1iZXIgPSB1c2VyLnBob25lTnVtYmVyO1xuICAgIHRoaXMuaXNBbm9ueW1vdXMgPSB1c2VyLmlzQW5vbnltb3VzO1xuICAgIHRoaXMudGVuYW50SWQgPSB1c2VyLnRlbmFudElkO1xuICAgIHRoaXMucHJvdmlkZXJEYXRhID0gdXNlci5wcm92aWRlckRhdGEubWFwKHVzZXJJbmZvID0+ICh7IC4uLnVzZXJJbmZvIH0pKTtcbiAgICB0aGlzLm1ldGFkYXRhLl9jb3B5KHVzZXIubWV0YWRhdGEpO1xuICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLl9hc3NpZ24odXNlci5zdHNUb2tlbk1hbmFnZXIpO1xuICB9XG5cbiAgX2Nsb25lKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFVzZXJJbnRlcm5hbCB7XG4gICAgY29uc3QgbmV3VXNlciA9IG5ldyBVc2VySW1wbCh7XG4gICAgICAuLi50aGlzLFxuICAgICAgYXV0aCxcbiAgICAgIHN0c1Rva2VuTWFuYWdlcjogdGhpcy5zdHNUb2tlbk1hbmFnZXIuX2Nsb25lKClcbiAgICB9KTtcbiAgICBuZXdVc2VyLm1ldGFkYXRhLl9jb3B5KHRoaXMubWV0YWRhdGEpO1xuICAgIHJldHVybiBuZXdVc2VyO1xuICB9XG5cbiAgX29uUmVsb2FkKGNhbGxiYWNrOiBOZXh0Rm48QVBJVXNlckluZm8+KTogdm9pZCB7XG4gICAgLy8gVGhlcmUgc2hvdWxkIG9ubHkgZXZlciBiZSBvbmUgbGlzdGVuZXIsIGFuZCB0aGF0IGlzIGEgc2luZ2xlIGluc3RhbmNlIG9mIE11bHRpRmFjdG9yVXNlclxuICAgIF9hc3NlcnQoIXRoaXMucmVsb2FkTGlzdGVuZXIsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgdGhpcy5yZWxvYWRMaXN0ZW5lciA9IGNhbGxiYWNrO1xuICAgIGlmICh0aGlzLnJlbG9hZFVzZXJJbmZvKSB7XG4gICAgICB0aGlzLl9ub3RpZnlSZWxvYWRMaXN0ZW5lcih0aGlzLnJlbG9hZFVzZXJJbmZvKTtcbiAgICAgIHRoaXMucmVsb2FkVXNlckluZm8gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIF9ub3RpZnlSZWxvYWRMaXN0ZW5lcih1c2VySW5mbzogQVBJVXNlckluZm8pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWxvYWRMaXN0ZW5lcikge1xuICAgICAgdGhpcy5yZWxvYWRMaXN0ZW5lcih1c2VySW5mbyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIG5vIGxpc3RlbmVyIGlzIHN1YnNjcmliZWQgeWV0LCBzYXZlIHRoZSByZXN1bHQgc28gaXQncyBhdmFpbGFibGUgd2hlbiB0aGV5IGRvIHN1YnNjcmliZVxuICAgICAgdGhpcy5yZWxvYWRVc2VySW5mbyA9IHVzZXJJbmZvO1xuICAgIH1cbiAgfVxuXG4gIF9zdGFydFByb2FjdGl2ZVJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5wcm9hY3RpdmVSZWZyZXNoLl9zdGFydCgpO1xuICB9XG5cbiAgX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMucHJvYWN0aXZlUmVmcmVzaC5fc3RvcCgpO1xuICB9XG5cbiAgYXN5bmMgX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KFxuICAgIHJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2UgfCBGaW5hbGl6ZU1mYVJlc3BvbnNlLFxuICAgIHJlbG9hZCA9IGZhbHNlXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB0b2tlbnNSZWZyZXNoZWQgPSBmYWxzZTtcbiAgICBpZiAoXG4gICAgICByZXNwb25zZS5pZFRva2VuICYmXG4gICAgICByZXNwb25zZS5pZFRva2VuICE9PSB0aGlzLnN0c1Rva2VuTWFuYWdlci5hY2Nlc3NUb2tlblxuICAgICkge1xuICAgICAgdGhpcy5zdHNUb2tlbk1hbmFnZXIudXBkYXRlRnJvbVNlcnZlclJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIHRva2Vuc1JlZnJlc2hlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKHJlbG9hZCkge1xuICAgICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodGhpcyk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh0aGlzKTtcbiAgICBpZiAodG9rZW5zUmVmcmVzaGVkKSB7XG4gICAgICB0aGlzLmF1dGguX25vdGlmeUxpc3RlbmVyc0lmQ3VycmVudCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHRoaXMuZ2V0SWRUb2tlbigpO1xuICAgIGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKHRoaXMsIGRlbGV0ZUFjY291bnQodGhpcy5hdXRoLCB7IGlkVG9rZW4gfSkpO1xuICAgIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLmNsZWFyUmVmcmVzaFRva2VuKCk7XG5cbiAgICAvLyBUT0RPOiBEZXRlcm1pbmUgaWYgY2FuY2VsbGFibGUtcHJvbWlzZXMgYXJlIG5lY2Vzc2FyeSB0byB1c2UgaW4gdGhpcyBjbGFzcyBzbyB0aGF0IGRlbGV0ZSgpXG4gICAgLy8gICAgICAgY2FuY2VscyBwZW5kaW5nIGFjdGlvbnMuLi5cblxuICAgIHJldHVybiB0aGlzLmF1dGguc2lnbk91dCgpO1xuICB9XG5cbiAgdG9KU09OKCk6IFBlcnNpc3RlZEJsb2Ige1xuICAgIHJldHVybiB7XG4gICAgICB1aWQ6IHRoaXMudWlkLFxuICAgICAgZW1haWw6IHRoaXMuZW1haWwgfHwgdW5kZWZpbmVkLFxuICAgICAgZW1haWxWZXJpZmllZDogdGhpcy5lbWFpbFZlcmlmaWVkLFxuICAgICAgZGlzcGxheU5hbWU6IHRoaXMuZGlzcGxheU5hbWUgfHwgdW5kZWZpbmVkLFxuICAgICAgaXNBbm9ueW1vdXM6IHRoaXMuaXNBbm9ueW1vdXMsXG4gICAgICBwaG90b1VSTDogdGhpcy5waG90b1VSTCB8fCB1bmRlZmluZWQsXG4gICAgICBwaG9uZU51bWJlcjogdGhpcy5waG9uZU51bWJlciB8fCB1bmRlZmluZWQsXG4gICAgICB0ZW5hbnRJZDogdGhpcy50ZW5hbnRJZCB8fCB1bmRlZmluZWQsXG4gICAgICBwcm92aWRlckRhdGE6IHRoaXMucHJvdmlkZXJEYXRhLm1hcCh1c2VySW5mbyA9PiAoeyAuLi51c2VySW5mbyB9KSksXG4gICAgICBzdHNUb2tlbk1hbmFnZXI6IHRoaXMuc3RzVG9rZW5NYW5hZ2VyLnRvSlNPTigpLFxuICAgICAgLy8gUmVkaXJlY3QgZXZlbnQgSUQgbXVzdCBiZSBtYWludGFpbmVkIGluIGNhc2UgdGhlcmUgaXMgYSBwZW5kaW5nXG4gICAgICAvLyByZWRpcmVjdCBldmVudC5cbiAgICAgIF9yZWRpcmVjdEV2ZW50SWQ6IHRoaXMuX3JlZGlyZWN0RXZlbnRJZCxcbiAgICAgIC4uLnRoaXMubWV0YWRhdGEudG9KU09OKCksXG5cbiAgICAgIC8vIFJlcXVpcmVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGxlZ2FjeSBTREsgKGdvL2ZpcmViYXNlLWF1dGgtc2RrLXBlcnNpc3RlbmNlLXBhcnNpbmcpOlxuICAgICAgYXBpS2V5OiB0aGlzLmF1dGguY29uZmlnLmFwaUtleSxcbiAgICAgIGFwcE5hbWU6IHRoaXMuYXV0aC5uYW1lXG4gICAgICAvLyBNaXNzaW5nIGF1dGhEb21haW4gd2lsbCBiZSB0b2xlcmF0ZWQgYnkgdGhlIGxlZ2FjeSBTREsuXG4gICAgICAvLyBzdHNUb2tlbk1hbmFnZXIuYXBpS2V5IGlzbid0IGFjdHVhbGx5IHJlcXVpcmVkIChkZXNwaXRlIHRoZSBsZWdhY3kgU0RLIHBlcnNpc3RpbmcgaXQpLlxuICAgIH07XG4gIH1cblxuICBnZXQgcmVmcmVzaFRva2VuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3RzVG9rZW5NYW5hZ2VyLnJlZnJlc2hUb2tlbiB8fCAnJztcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbUpTT04oYXV0aDogQXV0aEludGVybmFsLCBvYmplY3Q6IFBlcnNpc3RlZEJsb2IpOiBVc2VySW50ZXJuYWwge1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gb2JqZWN0LmRpc3BsYXlOYW1lID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbWFpbCA9IG9iamVjdC5lbWFpbCA/PyB1bmRlZmluZWQ7XG4gICAgY29uc3QgcGhvbmVOdW1iZXIgPSBvYmplY3QucGhvbmVOdW1iZXIgPz8gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBob3RvVVJMID0gb2JqZWN0LnBob3RvVVJMID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0ZW5hbnRJZCA9IG9iamVjdC50ZW5hbnRJZCA/PyB1bmRlZmluZWQ7XG4gICAgY29uc3QgX3JlZGlyZWN0RXZlbnRJZCA9IG9iamVjdC5fcmVkaXJlY3RFdmVudElkID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjcmVhdGVkQXQgPSBvYmplY3QuY3JlYXRlZEF0ID8/IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsYXN0TG9naW5BdCA9IG9iamVjdC5sYXN0TG9naW5BdCA/PyB1bmRlZmluZWQ7XG4gICAgY29uc3Qge1xuICAgICAgdWlkLFxuICAgICAgZW1haWxWZXJpZmllZCxcbiAgICAgIGlzQW5vbnltb3VzLFxuICAgICAgcHJvdmlkZXJEYXRhLFxuICAgICAgc3RzVG9rZW5NYW5hZ2VyOiBwbGFpbk9iamVjdFRva2VuTWFuYWdlclxuICAgIH0gPSBvYmplY3Q7XG5cbiAgICBfYXNzZXJ0KHVpZCAmJiBwbGFpbk9iamVjdFRva2VuTWFuYWdlciwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG5cbiAgICBjb25zdCBzdHNUb2tlbk1hbmFnZXIgPSBTdHNUb2tlbk1hbmFnZXIuZnJvbUpTT04oXG4gICAgICB0aGlzLm5hbWUsXG4gICAgICBwbGFpbk9iamVjdFRva2VuTWFuYWdlciBhcyBQZXJzaXN0ZWRCbG9iXG4gICAgKTtcblxuICAgIF9hc3NlcnQodHlwZW9mIHVpZCA9PT0gJ3N0cmluZycsIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGRpc3BsYXlOYW1lLCBhdXRoLm5hbWUpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGVtYWlsLCBhdXRoLm5hbWUpO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgZW1haWxWZXJpZmllZCA9PT0gJ2Jvb2xlYW4nLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1JcbiAgICApO1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgaXNBbm9ueW1vdXMgPT09ICdib29sZWFuJyxcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChwaG9uZU51bWJlciwgYXV0aC5uYW1lKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChwaG90b1VSTCwgYXV0aC5uYW1lKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZCh0ZW5hbnRJZCwgYXV0aC5uYW1lKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChfcmVkaXJlY3RFdmVudElkLCBhdXRoLm5hbWUpO1xuICAgIGFzc2VydFN0cmluZ09yVW5kZWZpbmVkKGNyZWF0ZWRBdCwgYXV0aC5uYW1lKTtcbiAgICBhc3NlcnRTdHJpbmdPclVuZGVmaW5lZChsYXN0TG9naW5BdCwgYXV0aC5uYW1lKTtcbiAgICBjb25zdCB1c2VyID0gbmV3IFVzZXJJbXBsKHtcbiAgICAgIHVpZCxcbiAgICAgIGF1dGgsXG4gICAgICBlbWFpbCxcbiAgICAgIGVtYWlsVmVyaWZpZWQsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIGlzQW5vbnltb3VzLFxuICAgICAgcGhvdG9VUkwsXG4gICAgICBwaG9uZU51bWJlcixcbiAgICAgIHRlbmFudElkLFxuICAgICAgc3RzVG9rZW5NYW5hZ2VyLFxuICAgICAgY3JlYXRlZEF0LFxuICAgICAgbGFzdExvZ2luQXRcbiAgICB9KTtcblxuICAgIGlmIChwcm92aWRlckRhdGEgJiYgQXJyYXkuaXNBcnJheShwcm92aWRlckRhdGEpKSB7XG4gICAgICB1c2VyLnByb3ZpZGVyRGF0YSA9IHByb3ZpZGVyRGF0YS5tYXAodXNlckluZm8gPT4gKHsgLi4udXNlckluZm8gfSkpO1xuICAgIH1cblxuICAgIGlmIChfcmVkaXJlY3RFdmVudElkKSB7XG4gICAgICB1c2VyLl9yZWRpcmVjdEV2ZW50SWQgPSBfcmVkaXJlY3RFdmVudElkO1xuICAgIH1cblxuICAgIHJldHVybiB1c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYSBVc2VyIGZyb20gYW4gaWRUb2tlbiBzZXJ2ZXIgcmVzcG9uc2VcbiAgICogQHBhcmFtIGF1dGhcbiAgICogQHBhcmFtIGlkVG9rZW5SZXNwb25zZVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIF9mcm9tSWRUb2tlblJlc3BvbnNlKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuUmVzcG9uc2U6IElkVG9rZW5SZXNwb25zZSxcbiAgICBpc0Fub255bW91czogYm9vbGVhbiA9IGZhbHNlXG4gICk6IFByb21pc2U8VXNlckludGVybmFsPiB7XG4gICAgY29uc3Qgc3RzVG9rZW5NYW5hZ2VyID0gbmV3IFN0c1Rva2VuTWFuYWdlcigpO1xuICAgIHN0c1Rva2VuTWFuYWdlci51cGRhdGVGcm9tU2VydmVyUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIEZpcmViYXNlIEF1dGggdXNlci5cbiAgICBjb25zdCB1c2VyID0gbmV3IFVzZXJJbXBsKHtcbiAgICAgIHVpZDogaWRUb2tlblJlc3BvbnNlLmxvY2FsSWQsXG4gICAgICBhdXRoLFxuICAgICAgc3RzVG9rZW5NYW5hZ2VyLFxuICAgICAgaXNBbm9ueW1vdXNcbiAgICB9KTtcblxuICAgIC8vIFVwZGF0ZXMgdGhlIHVzZXIgaW5mbyBhbmQgZGF0YSBhbmQgcmVzb2x2ZXMgd2l0aCBhIHVzZXIgaW5zdGFuY2UuXG4gICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcik7XG4gICAgcmV0dXJuIHVzZXI7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBkZWJ1Z0Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcblxuLyoqXG4gKiBPdXIgQVBJIGhhcyBhIGxvdCBvZiBvbmUtb2ZmIGNvbnN0YW50cyB0aGF0IGFyZSB1c2VkIHRvIGRvIHRoaW5ncy5cbiAqIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3QgZXhwb3J0IHRoZXNlIGFzIGNsYXNzZXMgaW5zdGFudGlhdGVkIGRpcmVjdGx5IHNpbmNlXG4gKiB0aGUgY29uc3RydWN0b3IgbWF5IHNpZGUgZWZmZWN0IGFuZCB0aGVyZWZvcmUgY2FuJ3QgYmUgcHJvdmVuIHRvIGJlIHNhZmVseVxuICogY3VsbGVkLiBJbnN0ZWFkLCB3ZSBleHBvcnQgdGhlc2UgY2xhc3NlcyB0aGVtc2VsdmVzIGFzIGEgbG93ZXJDYW1lbENhc2VcbiAqIGNvbnN0YW50LCBhbmQgaW5zdGFudGlhdGUgdGhlbSB1bmRlciB0aGUgaG9vZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5nbGV0b25JbnN0YW50aWF0b3I8VD4ge1xuICBuZXcgKCk6IFQ7XG59XG5cbmNvbnN0IGluc3RhbmNlQ2FjaGU6IE1hcDx1bmtub3duLCB1bmtub3duPiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIF9nZXRJbnN0YW5jZTxUPihjbHM6IHVua25vd24pOiBUIHtcbiAgZGVidWdBc3NlcnQoY2xzIGluc3RhbmNlb2YgRnVuY3Rpb24sICdFeHBlY3RlZCBhIGNsYXNzIGRlZmluaXRpb24nKTtcbiAgbGV0IGluc3RhbmNlID0gaW5zdGFuY2VDYWNoZS5nZXQoY2xzKSBhcyBUIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpbnN0YW5jZSkge1xuICAgIGRlYnVnQXNzZXJ0KFxuICAgICAgaW5zdGFuY2UgaW5zdGFuY2VvZiBjbHMsXG4gICAgICAnSW5zdGFuY2Ugc3RvcmVkIGluIGNhY2hlIG1pc21hdGNoZWQgd2l0aCBjbGFzcydcbiAgICApO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIGluc3RhbmNlID0gbmV3IChjbHMgYXMgU2luZ2xldG9uSW5zdGFudGlhdG9yPFQ+KSgpO1xuICBpbnN0YW5jZUNhY2hlLnNldChjbHMsIGluc3RhbmNlKTtcbiAgcmV0dXJuIGluc3RhbmNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2NsZWFySW5zdGFuY2VNYXAoKTogdm9pZCB7XG4gIGluc3RhbmNlQ2FjaGUuY2xlYXIoKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQZXJzaXN0ZW5jZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIFBlcnNpc3RlbmNlSW50ZXJuYWwsXG4gIFBlcnNpc3RlbmNlVHlwZSxcbiAgUGVyc2lzdGVuY2VWYWx1ZSxcbiAgU3RvcmFnZUV2ZW50TGlzdGVuZXJcbn0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlQZXJzaXN0ZW5jZSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlSW50ZXJuYWwge1xuICBzdGF0aWMgdHlwZTogJ05PTkUnID0gJ05PTkUnO1xuICByZWFkb25seSB0eXBlID0gUGVyc2lzdGVuY2VUeXBlLk5PTkU7XG4gIHN0b3JhZ2U6IFJlY29yZDxzdHJpbmcsIFBlcnNpc3RlbmNlVmFsdWU+ID0ge307XG5cbiAgYXN5bmMgX2lzQXZhaWxhYmxlKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgX3NldChrZXk6IHN0cmluZywgdmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnN0b3JhZ2Vba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgYXN5bmMgX2dldDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLnN0b3JhZ2Vba2V5XTtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiAodmFsdWUgYXMgVCk7XG4gIH1cblxuICBhc3luYyBfcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZGVsZXRlIHRoaXMuc3RvcmFnZVtrZXldO1xuICB9XG5cbiAgX2FkZExpc3RlbmVyKF9rZXk6IHN0cmluZywgX2xpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgaW4tbWVtb3J5IHN0b3JhZ2Ugc2luY2UgaXQgY2Fubm90IGJlIHNoYXJlZCBhY3Jvc3Mgd2luZG93cy93b3JrZXJzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3JlbW92ZUxpc3RlbmVyKF9rZXk6IHN0cmluZywgX2xpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgaW4tbWVtb3J5IHN0b3JhZ2Ugc2luY2UgaXQgY2Fubm90IGJlIHNoYXJlZCBhY3Jvc3Mgd2luZG93cy93b3JrZXJzXG4gICAgcmV0dXJuO1xuICB9XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBlcnNpc3RlbmNlfSBvZiB0eXBlICdOT05FJy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpbk1lbW9yeVBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZSA9IEluTWVtb3J5UGVyc2lzdGVuY2U7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXBpS2V5LCBBcHBOYW1lLCBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgUGVyc2lzdGVkQmxvYiwgUGVyc2lzdGVuY2VJbnRlcm5hbCB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7IFVzZXJJbXBsIH0gZnJvbSAnLi4vdXNlci91c2VyX2ltcGwnO1xuaW1wb3J0IHsgX2dldEluc3RhbmNlIH0gZnJvbSAnLi4vdXRpbC9pbnN0YW50aWF0b3InO1xuaW1wb3J0IHsgaW5NZW1vcnlQZXJzaXN0ZW5jZSB9IGZyb20gJy4vaW5fbWVtb3J5JztcblxuZXhwb3J0IGNvbnN0IGVudW0gS2V5TmFtZSB7XG4gIEFVVEhfVVNFUiA9ICdhdXRoVXNlcicsXG4gIEFVVEhfRVZFTlQgPSAnYXV0aEV2ZW50JyxcbiAgUkVESVJFQ1RfVVNFUiA9ICdyZWRpcmVjdFVzZXInLFxuICBQRVJTSVNURU5DRV9VU0VSID0gJ3BlcnNpc3RlbmNlJ1xufVxuZXhwb3J0IGNvbnN0IGVudW0gTmFtZXNwYWNlIHtcbiAgUEVSU0lTVEVOQ0UgPSAnZmlyZWJhc2UnXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfcGVyc2lzdGVuY2VLZXlOYW1lKFxuICBrZXk6IHN0cmluZyxcbiAgYXBpS2V5OiBBcGlLZXksXG4gIGFwcE5hbWU6IEFwcE5hbWVcbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtOYW1lc3BhY2UuUEVSU0lTVEVOQ0V9OiR7a2V5fToke2FwaUtleX06JHthcHBOYW1lfWA7XG59XG5cbmV4cG9ydCBjbGFzcyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBmdWxsVXNlcktleTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGZ1bGxQZXJzaXN0ZW5jZUtleTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGJvdW5kRXZlbnRIYW5kbGVyOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZUludGVybmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdXNlcktleTogc3RyaW5nXG4gICkge1xuICAgIGNvbnN0IHsgY29uZmlnLCBuYW1lIH0gPSB0aGlzLmF1dGg7XG4gICAgdGhpcy5mdWxsVXNlcktleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUodGhpcy51c2VyS2V5LCBjb25maWcuYXBpS2V5LCBuYW1lKTtcbiAgICB0aGlzLmZ1bGxQZXJzaXN0ZW5jZUtleSA9IF9wZXJzaXN0ZW5jZUtleU5hbWUoXG4gICAgICBLZXlOYW1lLlBFUlNJU1RFTkNFX1VTRVIsXG4gICAgICBjb25maWcuYXBpS2V5LFxuICAgICAgbmFtZVxuICAgICk7XG4gICAgdGhpcy5ib3VuZEV2ZW50SGFuZGxlciA9IGF1dGguX29uU3RvcmFnZUV2ZW50LmJpbmQoYXV0aCk7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZS5fYWRkTGlzdGVuZXIodGhpcy5mdWxsVXNlcktleSwgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XG4gIH1cblxuICBzZXRDdXJyZW50VXNlcih1c2VyOiBVc2VySW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5fc2V0KHRoaXMuZnVsbFVzZXJLZXksIHVzZXIudG9KU09OKCkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0Q3VycmVudFVzZXIoKTogUHJvbWlzZTxVc2VySW50ZXJuYWwgfCBudWxsPiB7XG4gICAgY29uc3QgYmxvYiA9IGF3YWl0IHRoaXMucGVyc2lzdGVuY2UuX2dldDxQZXJzaXN0ZWRCbG9iPih0aGlzLmZ1bGxVc2VyS2V5KTtcbiAgICByZXR1cm4gYmxvYiA/IFVzZXJJbXBsLl9mcm9tSlNPTih0aGlzLmF1dGgsIGJsb2IpIDogbnVsbDtcbiAgfVxuXG4gIHJlbW92ZUN1cnJlbnRVc2VyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnBlcnNpc3RlbmNlLl9yZW1vdmUodGhpcy5mdWxsVXNlcktleSk7XG4gIH1cblxuICBzYXZlUGVyc2lzdGVuY2VGb3JSZWRpcmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5fc2V0KFxuICAgICAgdGhpcy5mdWxsUGVyc2lzdGVuY2VLZXksXG4gICAgICB0aGlzLnBlcnNpc3RlbmNlLnR5cGVcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0UGVyc2lzdGVuY2UobmV3UGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlSW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5wZXJzaXN0ZW5jZSA9PT0gbmV3UGVyc2lzdGVuY2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50VXNlciA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICBhd2FpdCB0aGlzLnJlbW92ZUN1cnJlbnRVc2VyKCk7XG5cbiAgICB0aGlzLnBlcnNpc3RlbmNlID0gbmV3UGVyc2lzdGVuY2U7XG5cbiAgICBpZiAoY3VycmVudFVzZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLnNldEN1cnJlbnRVc2VyKGN1cnJlbnRVc2VyKTtcbiAgICB9XG4gIH1cblxuICBkZWxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5wZXJzaXN0ZW5jZS5fcmVtb3ZlTGlzdGVuZXIodGhpcy5mdWxsVXNlcktleSwgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgY3JlYXRlKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBwZXJzaXN0ZW5jZUhpZXJhcmNoeTogUGVyc2lzdGVuY2VJbnRlcm5hbFtdLFxuICAgIHVzZXJLZXkgPSBLZXlOYW1lLkFVVEhfVVNFUlxuICApOiBQcm9taXNlPFBlcnNpc3RlbmNlVXNlck1hbmFnZXI+IHtcbiAgICBpZiAoIXBlcnNpc3RlbmNlSGllcmFyY2h5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyKFxuICAgICAgICBfZ2V0SW5zdGFuY2UoaW5NZW1vcnlQZXJzaXN0ZW5jZSksXG4gICAgICAgIGF1dGgsXG4gICAgICAgIHVzZXJLZXlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRWxpbWluYXRlIGFueSBwZXJzaXN0ZW5jZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZVxuICAgIGNvbnN0IGF2YWlsYWJsZVBlcnNpc3RlbmNlcyA9IChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBwZXJzaXN0ZW5jZUhpZXJhcmNoeS5tYXAoYXN5bmMgcGVyc2lzdGVuY2UgPT4ge1xuICAgICAgICAgIGlmIChhd2FpdCBwZXJzaXN0ZW5jZS5faXNBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBlcnNpc3RlbmNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICkuZmlsdGVyKHBlcnNpc3RlbmNlID0+IHBlcnNpc3RlbmNlKSBhcyBQZXJzaXN0ZW5jZUludGVybmFsW107XG5cbiAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGZpcnN0IHBlcnNpc3RlbmNlIGxpc3RlZCwgb3IgaW4gbWVtb3J5IGlmIG5vbmUgYXZhaWxhYmxlXG4gICAgbGV0IHNlbGVjdGVkUGVyc2lzdGVuY2UgPVxuICAgICAgYXZhaWxhYmxlUGVyc2lzdGVuY2VzWzBdIHx8XG4gICAgICBfZ2V0SW5zdGFuY2U8UGVyc2lzdGVuY2VJbnRlcm5hbD4oaW5NZW1vcnlQZXJzaXN0ZW5jZSk7XG5cbiAgICBjb25zdCBrZXkgPSBfcGVyc2lzdGVuY2VLZXlOYW1lKHVzZXJLZXksIGF1dGguY29uZmlnLmFwaUtleSwgYXV0aC5uYW1lKTtcblxuICAgIC8vIFB1bGwgb3V0IHRoZSBleGlzdGluZyB1c2VyLCBzZXR0aW5nIHRoZSBjaG9zZW4gcGVyc2lzdGVuY2UgdG8gdGhhdFxuICAgIC8vIHBlcnNpc3RlbmNlIGlmIHRoZSB1c2VyIGV4aXN0cy5cbiAgICBsZXQgdXNlclRvTWlncmF0ZTogVXNlckludGVybmFsIHwgbnVsbCA9IG51bGw7XG4gICAgLy8gTm90ZSwgaGVyZSB3ZSBjaGVjayBmb3IgYSB1c2VyIGluIF9hbGxfIHBlcnNpc3RlbmNlcywgbm90IGp1c3QgdGhlXG4gICAgLy8gb25lcyBkZWVtZWQgYXZhaWxhYmxlLiBJZiB3ZSBjYW4gbWlncmF0ZSBhIHVzZXIgb3V0IG9mIGEgYnJva2VuXG4gICAgLy8gcGVyc2lzdGVuY2UsIHdlIHdpbGwgKGJ1dCBvbmx5IGlmIHRoYXQgcGVyc2lzdGVuY2Ugc3VwcG9ydHMgbWlncmF0aW9uKS5cbiAgICBmb3IgKGNvbnN0IHBlcnNpc3RlbmNlIG9mIHBlcnNpc3RlbmNlSGllcmFyY2h5KSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgcGVyc2lzdGVuY2UuX2dldDxQZXJzaXN0ZWRCbG9iPihrZXkpO1xuICAgICAgICBpZiAoYmxvYikge1xuICAgICAgICAgIGNvbnN0IHVzZXIgPSBVc2VySW1wbC5fZnJvbUpTT04oYXV0aCwgYmxvYik7IC8vIHRocm93cyBmb3IgdW5wYXJzYWJsZSBibG9iICh3cm9uZyBmb3JtYXQpXG4gICAgICAgICAgaWYgKHBlcnNpc3RlbmNlICE9PSBzZWxlY3RlZFBlcnNpc3RlbmNlKSB7XG4gICAgICAgICAgICB1c2VyVG9NaWdyYXRlID0gdXNlcjtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZWN0ZWRQZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgZmluZCB0aGUgdXNlciBpbiBhIHBlcnNpc3RlbmNlIHRoYXQgZG9lcyBzdXBwb3J0IG1pZ3JhdGlvbiwgdXNlXG4gICAgLy8gdGhhdCBtaWdyYXRpb24gcGF0aCAob2Ygb25seSBwZXJzaXN0ZW5jZXMgdGhhdCBzdXBwb3J0IG1pZ3JhdGlvbilcbiAgICBjb25zdCBtaWdyYXRpb25IaWVyYXJjaHkgPSBhdmFpbGFibGVQZXJzaXN0ZW5jZXMuZmlsdGVyKFxuICAgICAgcCA9PiBwLl9zaG91bGRBbGxvd01pZ3JhdGlvblxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgcGVyc2lzdGVuY2UgZG9lcyBfbm90XyBhbGxvdyBtaWdyYXRpb24sIGp1c3QgZmluaXNoIG9mZiBoZXJlXG4gICAgaWYgKFxuICAgICAgIXNlbGVjdGVkUGVyc2lzdGVuY2UuX3Nob3VsZEFsbG93TWlncmF0aW9uIHx8XG4gICAgICAhbWlncmF0aW9uSGllcmFyY2h5Lmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyKHNlbGVjdGVkUGVyc2lzdGVuY2UsIGF1dGgsIHVzZXJLZXkpO1xuICAgIH1cblxuICAgIHNlbGVjdGVkUGVyc2lzdGVuY2UgPSBtaWdyYXRpb25IaWVyYXJjaHlbMF07XG4gICAgaWYgKHVzZXJUb01pZ3JhdGUpIHtcbiAgICAgIC8vIFRoaXMgbm9ybWFsbHkgc2hvdWxkbid0IHRocm93IHNpbmNlIGNob3NlblBlcnNpc3RlbmNlLmlzQXZhaWxhYmxlKCkgaXMgdHJ1ZSwgYnV0IGlmIGl0IGRvZXNcbiAgICAgIC8vIHdlJ2xsIGp1c3QgbGV0IGl0IGJ1YmJsZSB0byBzdXJmYWNlIHRoZSBlcnJvci5cbiAgICAgIGF3YWl0IHNlbGVjdGVkUGVyc2lzdGVuY2UuX3NldChrZXksIHVzZXJUb01pZ3JhdGUudG9KU09OKCkpO1xuICAgIH1cblxuICAgIC8vIEF0dGVtcHQgdG8gY2xlYXIgdGhlIGtleSBpbiBvdGhlciBwZXJzaXN0ZW5jZXMgYnV0IGlnbm9yZSBlcnJvcnMuIFRoaXMgaGVscHMgcHJldmVudCBpc3N1ZXNcbiAgICAvLyBzdWNoIGFzIHVzZXJzIGdldHRpbmcgc3R1Y2sgd2l0aCBhIHByZXZpb3VzIGFjY291bnQgYWZ0ZXIgc2lnbmluZyBvdXQgYW5kIHJlZnJlc2hpbmcgdGhlIHRhYi5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIHBlcnNpc3RlbmNlSGllcmFyY2h5Lm1hcChhc3luYyBwZXJzaXN0ZW5jZSA9PiB7XG4gICAgICAgIGlmIChwZXJzaXN0ZW5jZSAhPT0gc2VsZWN0ZWRQZXJzaXN0ZW5jZSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBwZXJzaXN0ZW5jZS5fcmVtb3ZlKGtleSk7XG4gICAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyKHNlbGVjdGVkUGVyc2lzdGVuY2UsIGF1dGgsIHVzZXJLZXkpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNJRSwgZ2V0VUEgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmludGVyZmFjZSBOYXZpZ2F0b3JTdGFuZGFsb25lIGV4dGVuZHMgTmF2aWdhdG9yIHtcbiAgc3RhbmRhbG9uZT86IHVua25vd247XG59XG5cbmludGVyZmFjZSBEb2N1bWVudCB7XG4gIGRvY3VtZW50TW9kZT86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFbnVtcyBmb3IgQnJvd3NlciBuYW1lLlxuICovXG5leHBvcnQgY29uc3QgZW51bSBCcm93c2VyTmFtZSB7XG4gIEFORFJPSUQgPSAnQW5kcm9pZCcsXG4gIEJMQUNLQkVSUlkgPSAnQmxhY2tiZXJyeScsXG4gIEVER0UgPSAnRWRnZScsXG4gIEZJUkVGT1ggPSAnRmlyZWZveCcsXG4gIElFID0gJ0lFJyxcbiAgSUVNT0JJTEUgPSAnSUVNb2JpbGUnLFxuICBPUEVSQSA9ICdPcGVyYScsXG4gIE9USEVSID0gJ090aGVyJyxcbiAgQ0hST01FID0gJ0Nocm9tZScsXG4gIFNBRkFSSSA9ICdTYWZhcmknLFxuICBTSUxLID0gJ1NpbGsnLFxuICBXRUJPUyA9ICdXZWJvcydcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgdGhlIGJyb3dzZXIgZm9yIHRoZSBwdXJwb3NlcyBvZiByZXBvcnRpbmcgdXNhZ2UgdG8gdGhlIEFQSVxuICovXG5leHBvcnQgZnVuY3Rpb24gX2dldEJyb3dzZXJOYW1lKHVzZXJBZ2VudDogc3RyaW5nKTogQnJvd3Nlck5hbWUgfCBzdHJpbmcge1xuICBjb25zdCB1YSA9IHVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO1xuICBpZiAodWEuaW5jbHVkZXMoJ29wZXJhLycpIHx8IHVhLmluY2x1ZGVzKCdvcHIvJykgfHwgdWEuaW5jbHVkZXMoJ29waW9zLycpKSB7XG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLk9QRVJBO1xuICB9IGVsc2UgaWYgKF9pc0lFTW9iaWxlKHVhKSkge1xuICAgIC8vIFdpbmRvd3MgcGhvbmUgSUVNb2JpbGUgYnJvd3Nlci5cbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuSUVNT0JJTEU7XG4gIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ21zaWUnKSB8fCB1YS5pbmNsdWRlcygndHJpZGVudC8nKSkge1xuICAgIHJldHVybiBCcm93c2VyTmFtZS5JRTtcbiAgfSBlbHNlIGlmICh1YS5pbmNsdWRlcygnZWRnZS8nKSkge1xuICAgIHJldHVybiBCcm93c2VyTmFtZS5FREdFO1xuICB9IGVsc2UgaWYgKF9pc0ZpcmVmb3godWEpKSB7XG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLkZJUkVGT1g7XG4gIH0gZWxzZSBpZiAodWEuaW5jbHVkZXMoJ3NpbGsvJykpIHtcbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuU0lMSztcbiAgfSBlbHNlIGlmIChfaXNCbGFja0JlcnJ5KHVhKSkge1xuICAgIC8vIEJsYWNrYmVycnkgYnJvd3Nlci5cbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuQkxBQ0tCRVJSWTtcbiAgfSBlbHNlIGlmIChfaXNXZWJPUyh1YSkpIHtcbiAgICAvLyBXZWJPUyBkZWZhdWx0IGJyb3dzZXIuXG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLldFQk9TO1xuICB9IGVsc2UgaWYgKF9pc1NhZmFyaSh1YSkpIHtcbiAgICByZXR1cm4gQnJvd3Nlck5hbWUuU0FGQVJJO1xuICB9IGVsc2UgaWYgKFxuICAgICh1YS5pbmNsdWRlcygnY2hyb21lLycpIHx8IF9pc0Nocm9tZUlPUyh1YSkpICYmXG4gICAgIXVhLmluY2x1ZGVzKCdlZGdlLycpXG4gICkge1xuICAgIHJldHVybiBCcm93c2VyTmFtZS5DSFJPTUU7XG4gIH0gZWxzZSBpZiAoX2lzQW5kcm9pZCh1YSkpIHtcbiAgICAvLyBBbmRyb2lkIHN0b2NrIGJyb3dzZXIuXG4gICAgcmV0dXJuIEJyb3dzZXJOYW1lLkFORFJPSUQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gTW9zdCBtb2Rlcm4gYnJvd3NlcnMgaGF2ZSBuYW1lL3ZlcnNpb24gYXQgZW5kIG9mIHVzZXIgYWdlbnQgc3RyaW5nLlxuICAgIGNvbnN0IHJlID0gLyhbYS16QS1aXFxkXFwuXSspXFwvW2EtekEtWlxcZFxcLl0qJC87XG4gICAgY29uc3QgbWF0Y2hlcyA9IHVzZXJBZ2VudC5tYXRjaChyZSk7XG4gICAgaWYgKG1hdGNoZXM/Lmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIG1hdGNoZXNbMV07XG4gICAgfVxuICB9XG4gIHJldHVybiBCcm93c2VyTmFtZS5PVEhFUjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0ZpcmVmb3godWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAvZmlyZWZveFxcLy9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzU2FmYXJpKHVzZXJBZ2VudCA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgY29uc3QgdWEgPSB1c2VyQWdlbnQudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIChcbiAgICB1YS5pbmNsdWRlcygnc2FmYXJpLycpICYmXG4gICAgIXVhLmluY2x1ZGVzKCdjaHJvbWUvJykgJiZcbiAgICAhdWEuaW5jbHVkZXMoJ2NyaW9zLycpICYmXG4gICAgIXVhLmluY2x1ZGVzKCdhbmRyb2lkJylcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0Nocm9tZUlPUyh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9jcmlvc1xcLy9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzSUVNb2JpbGUodWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAvaWVtb2JpbGUvaS50ZXN0KHVhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0FuZHJvaWQodWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAvYW5kcm9pZC9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzQmxhY2tCZXJyeSh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC9ibGFja2JlcnJ5L2kudGVzdCh1YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNXZWJPUyh1YSA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgcmV0dXJuIC93ZWJvcy9pLnRlc3QodWEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzSU9TKHVhID0gZ2V0VUEoKSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIC9pcGhvbmV8aXBhZHxpcG9kL2kudGVzdCh1YSkgfHxcbiAgICAoL21hY2ludG9zaC9pLnRlc3QodWEpICYmIC9tb2JpbGUvaS50ZXN0KHVhKSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0lPUzdPcjgodWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgLyhpUGFkfGlQaG9uZXxpUG9kKS4qT1MgN19cXGQvaS50ZXN0KHVhKSB8fFxuICAgIC8oaVBhZHxpUGhvbmV8aVBvZCkuKk9TIDhfXFxkL2kudGVzdCh1YSlcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc0lPU1N0YW5kYWxvbmUodWEgPSBnZXRVQSgpKTogYm9vbGVhbiB7XG4gIHJldHVybiBfaXNJT1ModWEpICYmICEhKHdpbmRvdy5uYXZpZ2F0b3IgYXMgTmF2aWdhdG9yU3RhbmRhbG9uZSk/LnN0YW5kYWxvbmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNJRTEwKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNJRSgpICYmIChkb2N1bWVudCBhcyBEb2N1bWVudCkuZG9jdW1lbnRNb2RlID09PSAxMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9pc01vYmlsZUJyb3dzZXIodWE6IHN0cmluZyA9IGdldFVBKCkpOiBib29sZWFuIHtcbiAgLy8gVE9ETzogaW1wbGVtZW50IGdldEJyb3dzZXJOYW1lIGVxdWl2YWxlbnQgZm9yIE9TLlxuICByZXR1cm4gKFxuICAgIF9pc0lPUyh1YSkgfHxcbiAgICBfaXNBbmRyb2lkKHVhKSB8fFxuICAgIF9pc1dlYk9TKHVhKSB8fFxuICAgIF9pc0JsYWNrQmVycnkodWEpIHx8XG4gICAgL3dpbmRvd3MgcGhvbmUvaS50ZXN0KHVhKSB8fFxuICAgIF9pc0lFTW9iaWxlKHVhKVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2lzSWZyYW1lKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIC8vIENoZWNrIHRoYXQgdGhlIGN1cnJlbnQgd2luZG93IGlzIG5vdCB0aGUgdG9wIHdpbmRvdy5cbiAgICAvLyBJZiBzbywgcmV0dXJuIHRydWUuXG4gICAgcmV0dXJuICEhKHdpbmRvdyAmJiB3aW5kb3cgIT09IHdpbmRvdy50b3ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IF9nZXRCcm93c2VyTmFtZSB9IGZyb20gJy4vYnJvd3Nlcic7XG5pbXBvcnQgeyBnZXRVQSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuZXhwb3J0IGNvbnN0IGVudW0gQ2xpZW50SW1wbGVtZW50YXRpb24ge1xuICBDT1JFID0gJ0pzQ29yZSdcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gQ2xpZW50UGxhdGZvcm0ge1xuICBCUk9XU0VSID0gJ0Jyb3dzZXInLFxuICBOT0RFID0gJ05vZGUnLFxuICBSRUFDVF9OQVRJVkUgPSAnUmVhY3ROYXRpdmUnLFxuICBDT1JET1ZBID0gJ0NvcmRvdmEnLFxuICBXT1JLRVIgPSAnV29ya2VyJ1xufVxuXG4vKlxuICogRGV0ZXJtaW5lIHRoZSBTREsgdmVyc2lvbiBzdHJpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9nZXRDbGllbnRWZXJzaW9uKFxuICBjbGllbnRQbGF0Zm9ybTogQ2xpZW50UGxhdGZvcm0sXG4gIGZyYW1ld29ya3M6IHJlYWRvbmx5IHN0cmluZ1tdID0gW11cbik6IHN0cmluZyB7XG4gIGxldCByZXBvcnRlZFBsYXRmb3JtOiBzdHJpbmc7XG4gIHN3aXRjaCAoY2xpZW50UGxhdGZvcm0pIHtcbiAgICBjYXNlIENsaWVudFBsYXRmb3JtLkJST1dTRVI6XG4gICAgICAvLyBJbiBhIGJyb3dzZXIgZW52aXJvbm1lbnQsIHJlcG9ydCB0aGUgYnJvd3NlciBuYW1lLlxuICAgICAgcmVwb3J0ZWRQbGF0Zm9ybSA9IF9nZXRCcm93c2VyTmFtZShnZXRVQSgpKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgQ2xpZW50UGxhdGZvcm0uV09SS0VSOlxuICAgICAgLy8gVGVjaG5pY2FsbHkgYSB3b3JrZXIgcnVucyBmcm9tIGEgYnJvd3NlciBidXQgd2UgbmVlZCB0byBkaWZmZXJlbnRpYXRlIGFcbiAgICAgIC8vIHdvcmtlciBmcm9tIGEgYnJvd3Nlci5cbiAgICAgIC8vIEZvciBleGFtcGxlOiBDaHJvbWUtV29ya2VyL0pzQ29yZS80LjkuMS9GaXJlYmFzZUNvcmUtd2ViLlxuICAgICAgcmVwb3J0ZWRQbGF0Zm9ybSA9IGAke19nZXRCcm93c2VyTmFtZShnZXRVQSgpKX0tJHtjbGllbnRQbGF0Zm9ybX1gO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJlcG9ydGVkUGxhdGZvcm0gPSBjbGllbnRQbGF0Zm9ybTtcbiAgfVxuICBjb25zdCByZXBvcnRlZEZyYW1ld29ya3MgPSBmcmFtZXdvcmtzLmxlbmd0aFxuICAgID8gZnJhbWV3b3Jrcy5qb2luKCcsJylcbiAgICA6ICdGaXJlYmFzZUNvcmUtd2ViJzsgLyogZGVmYXVsdCB2YWx1ZSBpZiBubyBvdGhlciBmcmFtZXdvcmsgaXMgdXNlZCAqL1xuICByZXR1cm4gYCR7cmVwb3J0ZWRQbGF0Zm9ybX0vJHtDbGllbnRJbXBsZW1lbnRhdGlvbi5DT1JFfS8ke1NES19WRVJTSU9OfS8ke3JlcG9ydGVkRnJhbWV3b3Jrc31gO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgVW5zdWJzY3JpYmUsIFVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5cbmludGVyZmFjZSBNaWRkbGV3YXJlRW50cnkge1xuICAodXNlcjogVXNlciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+O1xuICBvbkFib3J0PzogKCkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhNaWRkbGV3YXJlUXVldWUge1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXVlOiBNaWRkbGV3YXJlRW50cnlbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIHB1c2hDYWxsYmFjayhcbiAgICBjYWxsYmFjazogKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAgICBvbkFib3J0PzogKCkgPT4gdm9pZFxuICApOiBVbnN1YnNjcmliZSB7XG4gICAgLy8gVGhlIGNhbGxiYWNrIGNvdWxkIGJlIHN5bmMgb3IgYXN5bmMuIFdyYXAgaXQgaW50byBhXG4gICAgLy8gZnVuY3Rpb24gdGhhdCBpcyBhbHdheXMgYXN5bmMuXG4gICAgY29uc3Qgd3JhcHBlZENhbGxiYWNrOiBNaWRkbGV3YXJlRW50cnkgPSAoXG4gICAgICB1c2VyOiBVc2VyIHwgbnVsbFxuICAgICk6IFByb21pc2U8dm9pZD4gPT5cbiAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjYWxsYmFjayh1c2VyKTtcbiAgICAgICAgICAvLyBFaXRoZXIgcmVzb2x2ZSB3aXRoIGV4aXN0aW5nIHByb21pc2Ugb3Igd3JhcCBhIG5vbi1wcm9taXNlXG4gICAgICAgICAgLy8gcmV0dXJuIHZhbHVlIGludG8gYSBwcm9taXNlLlxuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIFN5bmMgY2FsbGJhY2sgdGhyb3dzLlxuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgLy8gQXR0YWNoIHRoZSBvbkFib3J0IGlmIHByZXNlbnRcbiAgICB3cmFwcGVkQ2FsbGJhY2sub25BYm9ydCA9IG9uQWJvcnQ7XG4gICAgdGhpcy5xdWV1ZS5wdXNoKHdyYXBwZWRDYWxsYmFjayk7XG5cbiAgICBjb25zdCBpbmRleCA9IHRoaXMucXVldWUubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgLy8gVW5zdWJzY3JpYmUuIFJlcGxhY2Ugd2l0aCBuby1vcC4gRG8gbm90IHJlbW92ZSBmcm9tIGFycmF5LCBvciBpdCB3aWxsIGRpc3R1cmJcbiAgICAgIC8vIGluZGV4aW5nIG9mIG90aGVyIGVsZW1lbnRzLlxuICAgICAgdGhpcy5xdWV1ZVtpbmRleF0gPSAoKSA9PiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcnVuTWlkZGxld2FyZShuZXh0VXNlcjogVXNlciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5hdXRoLmN1cnJlbnRVc2VyID09PSBuZXh0VXNlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdoaWxlIHJ1bm5pbmcgdGhlIG1pZGRsZXdhcmUsIGJ1aWxkIGEgdGVtcG9yYXJ5IHN0YWNrIG9mIG9uQWJvcnRcbiAgICAvLyBjYWxsYmFja3MgdG8gY2FsbCBpZiBvbmUgbWlkZGxld2FyZSBjYWxsYmFjayByZWplY3RzLlxuXG4gICAgY29uc3Qgb25BYm9ydFN0YWNrOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IGJlZm9yZVN0YXRlQ2FsbGJhY2sgb2YgdGhpcy5xdWV1ZSkge1xuICAgICAgICBhd2FpdCBiZWZvcmVTdGF0ZUNhbGxiYWNrKG5leHRVc2VyKTtcblxuICAgICAgICAvLyBPbmx5IHB1c2ggdGhlIG9uQWJvcnQgaWYgdGhlIGNhbGxiYWNrIHN1Y2NlZWRzXG4gICAgICAgIGlmIChiZWZvcmVTdGF0ZUNhbGxiYWNrLm9uQWJvcnQpIHtcbiAgICAgICAgICBvbkFib3J0U3RhY2sucHVzaChiZWZvcmVTdGF0ZUNhbGxiYWNrLm9uQWJvcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gUnVuIGFsbCBvbkFib3J0LCB3aXRoIHNlcGFyYXRlIHRyeS9jYXRjaCB0byBpZ25vcmUgYW55IGVycm9ycyBhbmRcbiAgICAgIC8vIGNvbnRpbnVlXG4gICAgICBvbkFib3J0U3RhY2sucmV2ZXJzZSgpO1xuICAgICAgZm9yIChjb25zdCBvbkFib3J0IG9mIG9uQWJvcnRTdGFjaykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG9uQWJvcnQoKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIC8qIHN3YWxsb3cgZXJyb3IgKi9cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aHJvdyB0aGlzLmF1dGguX2Vycm9yRmFjdG9yeS5jcmVhdGUoQXV0aEVycm9yQ29kZS5MT0dJTl9CTE9DS0VELCB7XG4gICAgICAgIG9yaWdpbmFsTWVzc2FnZTogKGUgYXMgRXJyb3IpPy5tZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMyBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBfcGVyZm9ybUFwaVJlcXVlc3QsXG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3Nhcnlcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbi8qKlxuICogUmVxdWVzdCBvYmplY3QgZm9yIGZldGNoaW5nIHRoZSBwYXNzd29yZCBwb2xpY3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGFzc3dvcmRQb2xpY3lSZXF1ZXN0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzcG9uc2Ugb2JqZWN0IGZvciBmZXRjaGluZyB0aGUgcGFzc3dvcmQgcG9saWN5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFBhc3N3b3JkUG9saWN5UmVzcG9uc2Uge1xuICBjdXN0b21TdHJlbmd0aE9wdGlvbnM6IHtcbiAgICBtaW5QYXNzd29yZExlbmd0aD86IG51bWJlcjtcbiAgICBtYXhQYXNzd29yZExlbmd0aD86IG51bWJlcjtcbiAgICBjb250YWluc0xvd2VyY2FzZUNoYXJhY3Rlcj86IGJvb2xlYW47XG4gICAgY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXI/OiBib29sZWFuO1xuICAgIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3Rlcj86IGJvb2xlYW47XG4gICAgY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXI/OiBib29sZWFuO1xuICB9O1xuICBhbGxvd2VkTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVycz86IHN0cmluZ1tdO1xuICBlbmZvcmNlbWVudFN0YXRlOiBzdHJpbmc7XG4gIGZvcmNlVXBncmFkZU9uU2lnbmluPzogYm9vbGVhbjtcbiAgc2NoZW1hVmVyc2lvbjogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZldGNoZXMgdGhlIHBhc3N3b3JkIHBvbGljeSBmb3IgdGhlIGN1cnJlbnRseSBzZXQgdGVuYW50IG9yIHRoZSBwcm9qZWN0IGlmIG5vIHRlbmFudCBpcyBzZXQuXG4gKlxuICogQHBhcmFtIGF1dGggQXV0aCBvYmplY3QuXG4gKiBAcGFyYW0gcmVxdWVzdCBQYXNzd29yZCBwb2xpY3kgcmVxdWVzdC5cbiAqIEByZXR1cm5zIFBhc3N3b3JkIHBvbGljeSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9nZXRQYXNzd29yZFBvbGljeShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogR2V0UGFzc3dvcmRQb2xpY3lSZXF1ZXN0ID0ge31cbik6IFByb21pc2U8R2V0UGFzc3dvcmRQb2xpY3lSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIEdldFBhc3N3b3JkUG9saWN5UmVxdWVzdCxcbiAgICBHZXRQYXNzd29yZFBvbGljeVJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICBFbmRwb2ludC5HRVRfUEFTU1dPUkRfUE9MSUNZLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIzIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEdldFBhc3N3b3JkUG9saWN5UmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvcGFzc3dvcmRfcG9saWN5L2dldF9wYXNzd29yZF9wb2xpY3knO1xuaW1wb3J0IHtcbiAgUGFzc3dvcmRQb2xpY3lDdXN0b21TdHJlbmd0aE9wdGlvbnMsXG4gIFBhc3N3b3JkUG9saWN5SW50ZXJuYWwsXG4gIFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsXG59IGZyb20gJy4uLy4uL21vZGVsL3Bhc3N3b3JkX3BvbGljeSc7XG5pbXBvcnQgeyBQYXNzd29yZFZhbGlkYXRpb25TdGF0dXMgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG4vLyBNaW5pbXVtIG1pbiBwYXNzd29yZCBsZW5ndGggZW5mb3JjZWQgYnkgdGhlIGJhY2tlbmQsIGV2ZW4gaWYgbm8gbWluaW11bSBsZW5ndGggaXMgc2V0LlxuY29uc3QgTUlOSU1VTV9NSU5fUEFTU1dPUkRfTEVOR1RIID0gNjtcblxuLyoqXG4gKiBTdG9yZXMgcGFzc3dvcmQgcG9saWN5IHJlcXVpcmVtZW50cyBhbmQgcHJvdmlkZXMgcGFzc3dvcmQgdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBwb2xpY3kuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjbGFzcyBQYXNzd29yZFBvbGljeUltcGwgaW1wbGVtZW50cyBQYXNzd29yZFBvbGljeUludGVybmFsIHtcbiAgcmVhZG9ubHkgY3VzdG9tU3RyZW5ndGhPcHRpb25zOiBQYXNzd29yZFBvbGljeUN1c3RvbVN0cmVuZ3RoT3B0aW9ucztcbiAgcmVhZG9ubHkgYWxsb3dlZE5vbkFscGhhbnVtZXJpY0NoYXJhY3RlcnM6IHN0cmluZztcbiAgcmVhZG9ubHkgZW5mb3JjZW1lbnRTdGF0ZTogc3RyaW5nO1xuICByZWFkb25seSBmb3JjZVVwZ3JhZGVPblNpZ25pbjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2NoZW1hVmVyc2lvbjogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBHZXRQYXNzd29yZFBvbGljeVJlc3BvbnNlKSB7XG4gICAgLy8gT25seSBpbmNsdWRlIGN1c3RvbSBzdHJlbmd0aCBvcHRpb25zIGRlZmluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgIGNvbnN0IHJlc3BvbnNlT3B0aW9ucyA9IHJlc3BvbnNlLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucztcbiAgICB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucyA9IHt9O1xuICAgIC8vIFRPRE86IFJlbW92ZSBvbmNlIHRoZSBiYWNrZW5kIGlzIHVwZGF0ZWQgdG8gaW5jbHVkZSB0aGUgbWluaW11bSBtaW4gcGFzc3dvcmQgbGVuZ3RoIGluc3RlYWQgb2YgdW5kZWZpbmVkIHdoZW4gdGhlcmUgaXMgbm8gbWluaW11bSBsZW5ndGggc2V0LlxuICAgIHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zLm1pblBhc3N3b3JkTGVuZ3RoID1cbiAgICAgIHJlc3BvbnNlT3B0aW9ucy5taW5QYXNzd29yZExlbmd0aCA/PyBNSU5JTVVNX01JTl9QQVNTV09SRF9MRU5HVEg7XG4gICAgaWYgKHJlc3BvbnNlT3B0aW9ucy5tYXhQYXNzd29yZExlbmd0aCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMubWF4UGFzc3dvcmRMZW5ndGggPVxuICAgICAgICByZXNwb25zZU9wdGlvbnMubWF4UGFzc3dvcmRMZW5ndGg7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZU9wdGlvbnMuY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNMb3dlcmNhc2VMZXR0ZXIgPVxuICAgICAgICByZXNwb25zZU9wdGlvbnMuY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZU9wdGlvbnMuY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNVcHBlcmNhc2VMZXR0ZXIgPVxuICAgICAgICByZXNwb25zZU9wdGlvbnMuY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZU9wdGlvbnMuY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zLmNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlciA9XG4gICAgICAgIHJlc3BvbnNlT3B0aW9ucy5jb250YWluc051bWVyaWNDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZU9wdGlvbnMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXIgPVxuICAgICAgICByZXNwb25zZU9wdGlvbnMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXI7XG4gICAgfVxuXG4gICAgdGhpcy5lbmZvcmNlbWVudFN0YXRlID0gcmVzcG9uc2UuZW5mb3JjZW1lbnRTdGF0ZTtcbiAgICBpZiAodGhpcy5lbmZvcmNlbWVudFN0YXRlID09PSAnRU5GT1JDRU1FTlRfU1RBVEVfVU5TUEVDSUZJRUQnKSB7XG4gICAgICB0aGlzLmVuZm9yY2VtZW50U3RhdGUgPSAnT0ZGJztcbiAgICB9XG5cbiAgICAvLyBVc2UgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhcmUgc3BlY2lmaWVkIGluIHRoZSByZXNwb25zZS5cbiAgICB0aGlzLmFsbG93ZWROb25BbHBoYW51bWVyaWNDaGFyYWN0ZXJzID1cbiAgICAgIHJlc3BvbnNlLmFsbG93ZWROb25BbHBoYW51bWVyaWNDaGFyYWN0ZXJzPy5qb2luKCcnKSA/PyAnJztcblxuICAgIHRoaXMuZm9yY2VVcGdyYWRlT25TaWduaW4gPSByZXNwb25zZS5mb3JjZVVwZ3JhZGVPblNpZ25pbiA/PyBmYWxzZTtcbiAgICB0aGlzLnNjaGVtYVZlcnNpb24gPSByZXNwb25zZS5zY2hlbWFWZXJzaW9uO1xuICB9XG5cbiAgdmFsaWRhdGVQYXNzd29yZChwYXNzd29yZDogc3RyaW5nKTogUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzIHtcbiAgICBjb25zdCBzdGF0dXM6IFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsID0ge1xuICAgICAgaXNWYWxpZDogdHJ1ZSxcbiAgICAgIHBhc3N3b3JkUG9saWN5OiB0aGlzXG4gICAgfTtcblxuICAgIC8vIENoZWNrIHRoZSBwYXNzd29yZCBsZW5ndGggYW5kIGNoYXJhY3RlciBvcHRpb25zLlxuICAgIHRoaXMudmFsaWRhdGVQYXNzd29yZExlbmd0aE9wdGlvbnMocGFzc3dvcmQsIHN0YXR1cyk7XG4gICAgdGhpcy52YWxpZGF0ZVBhc3N3b3JkQ2hhcmFjdGVyT3B0aW9ucyhwYXNzd29yZCwgc3RhdHVzKTtcblxuICAgIC8vIENvbWJpbmUgdGhlIHN0YXR1cyBpbnRvIHNpbmdsZSBpc1ZhbGlkIHByb3BlcnR5LlxuICAgIHN0YXR1cy5pc1ZhbGlkICYmPSBzdGF0dXMubWVldHNNaW5QYXNzd29yZExlbmd0aCA/PyB0cnVlO1xuICAgIHN0YXR1cy5pc1ZhbGlkICYmPSBzdGF0dXMubWVldHNNYXhQYXNzd29yZExlbmd0aCA/PyB0cnVlO1xuICAgIHN0YXR1cy5pc1ZhbGlkICYmPSBzdGF0dXMuY29udGFpbnNMb3dlcmNhc2VMZXR0ZXIgPz8gdHJ1ZTtcbiAgICBzdGF0dXMuaXNWYWxpZCAmJj0gc3RhdHVzLmNvbnRhaW5zVXBwZXJjYXNlTGV0dGVyID8/IHRydWU7XG4gICAgc3RhdHVzLmlzVmFsaWQgJiY9IHN0YXR1cy5jb250YWluc051bWVyaWNDaGFyYWN0ZXIgPz8gdHJ1ZTtcbiAgICBzdGF0dXMuaXNWYWxpZCAmJj0gc3RhdHVzLmNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyID8/IHRydWU7XG5cbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IHRoZSBwYXNzd29yZCBtZWV0cyB0aGUgbGVuZ3RoIG9wdGlvbnMgZm9yIHRoZSBwb2xpY3kuXG4gICAqXG4gICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCB0byB2YWxpZGF0ZS5cbiAgICogQHBhcmFtIHN0YXR1cyBWYWxpZGF0aW9uIHN0YXR1cy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVQYXNzd29yZExlbmd0aE9wdGlvbnMoXG4gICAgcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBzdGF0dXM6IFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1pblBhc3N3b3JkTGVuZ3RoID0gdGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMubWluUGFzc3dvcmRMZW5ndGg7XG4gICAgY29uc3QgbWF4UGFzc3dvcmRMZW5ndGggPSB0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5tYXhQYXNzd29yZExlbmd0aDtcbiAgICBpZiAobWluUGFzc3dvcmRMZW5ndGgpIHtcbiAgICAgIHN0YXR1cy5tZWV0c01pblBhc3N3b3JkTGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoID49IG1pblBhc3N3b3JkTGVuZ3RoO1xuICAgIH1cbiAgICBpZiAobWF4UGFzc3dvcmRMZW5ndGgpIHtcbiAgICAgIHN0YXR1cy5tZWV0c01heFBhc3N3b3JkTGVuZ3RoID0gcGFzc3dvcmQubGVuZ3RoIDw9IG1heFBhc3N3b3JkTGVuZ3RoO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgcGFzc3dvcmQgbWVldHMgdGhlIGNoYXJhY3RlciBvcHRpb25zIGZvciB0aGUgcG9saWN5LlxuICAgKlxuICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgdG8gdmFsaWRhdGUuXG4gICAqIEBwYXJhbSBzdGF0dXMgVmFsaWRhdGlvbiBzdGF0dXMuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlUGFzc3dvcmRDaGFyYWN0ZXJPcHRpb25zKFxuICAgIHBhc3N3b3JkOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBQYXNzd29yZFZhbGlkYXRpb25TdGF0dXNJbnRlcm5hbFxuICApOiB2b2lkIHtcbiAgICAvLyBBc3NpZ24gc3RhdHVzZXMgZm9yIHJlcXVpcmVtZW50cyBldmVuIGlmIHRoZSBwYXNzd29yZCBpcyBhbiBlbXB0eSBzdHJpbmcuXG4gICAgdGhpcy51cGRhdGVQYXNzd29yZENoYXJhY3Rlck9wdGlvbnNTdGF0dXNlcyhcbiAgICAgIHN0YXR1cyxcbiAgICAgIC8qIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyPSAqLyBmYWxzZSxcbiAgICAgIC8qIGNvbnRhaW5zVXBwZXJjYXNlQ2hhcmFjdGVyPSAqLyBmYWxzZSxcbiAgICAgIC8qIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3Rlcj0gKi8gZmFsc2UsXG4gICAgICAvKiBjb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3Rlcj0gKi8gZmFsc2VcbiAgICApO1xuXG4gICAgbGV0IHBhc3N3b3JkQ2hhcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhc3N3b3JkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwYXNzd29yZENoYXIgPSBwYXNzd29yZC5jaGFyQXQoaSk7XG4gICAgICB0aGlzLnVwZGF0ZVBhc3N3b3JkQ2hhcmFjdGVyT3B0aW9uc1N0YXR1c2VzKFxuICAgICAgICBzdGF0dXMsXG4gICAgICAgIC8qIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyPSAqLyBwYXNzd29yZENoYXIgPj0gJ2EnICYmXG4gICAgICAgICAgcGFzc3dvcmRDaGFyIDw9ICd6JyxcbiAgICAgICAgLyogY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXI9ICovIHBhc3N3b3JkQ2hhciA+PSAnQScgJiZcbiAgICAgICAgICBwYXNzd29yZENoYXIgPD0gJ1onLFxuICAgICAgICAvKiBjb250YWluc051bWVyaWNDaGFyYWN0ZXI9ICovIHBhc3N3b3JkQ2hhciA+PSAnMCcgJiZcbiAgICAgICAgICBwYXNzd29yZENoYXIgPD0gJzknLFxuICAgICAgICAvKiBjb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3Rlcj0gKi8gdGhpcy5hbGxvd2VkTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVycy5pbmNsdWRlcyhcbiAgICAgICAgICBwYXNzd29yZENoYXJcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgcnVubmluZyB2YWxpZGF0aW9uIHN0YXR1cyB3aXRoIHRoZSBzdGF0dXNlcyBmb3IgdGhlIGNoYXJhY3RlciBvcHRpb25zLlxuICAgKiBFeHBlY3RlZCB0byBiZSBjYWxsZWQgZWFjaCB0aW1lIGEgY2hhcmFjdGVyIGlzIHByb2Nlc3NlZCB0byB1cGRhdGUgZWFjaCBvcHRpb24gc3RhdHVzXG4gICAqIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNoYXJhY3Rlci5cbiAgICpcbiAgICogQHBhcmFtIHN0YXR1cyBWYWxpZGF0aW9uIHN0YXR1cy5cbiAgICogQHBhcmFtIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyIFdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIGxvd2VyY2FzZSBsZXR0ZXIuXG4gICAqIEBwYXJhbSBjb250YWluc1VwcGVyY2FzZUNoYXJhY3RlciBXaGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYW4gdXBwZXJjYXNlIGxldHRlci5cbiAgICogQHBhcmFtIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlciBXaGV0aGVyIHRoZSBjaGFyYWN0ZXIgaXMgYSBudW1lcmljIGNoYXJhY3Rlci5cbiAgICogQHBhcmFtIGNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyIFdoZXRoZXIgdGhlIGNoYXJhY3RlciBpcyBhIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVQYXNzd29yZENoYXJhY3Rlck9wdGlvbnNTdGF0dXNlcyhcbiAgICBzdGF0dXM6IFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c0ludGVybmFsLFxuICAgIGNvbnRhaW5zTG93ZXJjYXNlQ2hhcmFjdGVyOiBib29sZWFuLFxuICAgIGNvbnRhaW5zVXBwZXJjYXNlQ2hhcmFjdGVyOiBib29sZWFuLFxuICAgIGNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlcjogYm9vbGVhbixcbiAgICBjb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3RlcjogYm9vbGVhblxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNMb3dlcmNhc2VMZXR0ZXIpIHtcbiAgICAgIHN0YXR1cy5jb250YWluc0xvd2VyY2FzZUxldHRlciB8fD0gY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmN1c3RvbVN0cmVuZ3RoT3B0aW9ucy5jb250YWluc1VwcGVyY2FzZUxldHRlcikge1xuICAgICAgc3RhdHVzLmNvbnRhaW5zVXBwZXJjYXNlTGV0dGVyIHx8PSBjb250YWluc1VwcGVyY2FzZUNoYXJhY3RlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY3VzdG9tU3RyZW5ndGhPcHRpb25zLmNvbnRhaW5zTnVtZXJpY0NoYXJhY3Rlcikge1xuICAgICAgc3RhdHVzLmNvbnRhaW5zTnVtZXJpY0NoYXJhY3RlciB8fD0gY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyO1xuICAgIH1cbiAgICBpZiAodGhpcy5jdXN0b21TdHJlbmd0aE9wdGlvbnMuY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXIpIHtcbiAgICAgIHN0YXR1cy5jb250YWluc05vbkFscGhhbnVtZXJpY0NoYXJhY3RlciB8fD1cbiAgICAgICAgY29udGFpbnNOb25BbHBoYW51bWVyaWNDaGFyYWN0ZXI7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX0ZpcmViYXNlU2VydmljZSwgRmlyZWJhc2VBcHAgfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5pbXBvcnQgeyBBcHBDaGVja0ludGVybmFsQ29tcG9uZW50TmFtZSB9IGZyb20gJ0BmaXJlYmFzZS9hcHAtY2hlY2staW50ZXJvcC10eXBlcyc7XG5pbXBvcnQge1xuICBBdXRoLFxuICBBdXRoRXJyb3JNYXAsXG4gIEF1dGhTZXR0aW5ncyxcbiAgRW11bGF0b3JDb25maWcsXG4gIE5leHRPck9ic2VydmVyLFxuICBQZXJzaXN0ZW5jZSxcbiAgUG9wdXBSZWRpcmVjdFJlc29sdmVyLFxuICBVc2VyLFxuICBVc2VyQ3JlZGVudGlhbCxcbiAgQ29tcGxldGVGbixcbiAgRXJyb3JGbixcbiAgTmV4dEZuLFxuICBVbnN1YnNjcmliZSxcbiAgUGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQge1xuICBjcmVhdGVTdWJzY3JpYmUsXG4gIEVycm9yRmFjdG9yeSxcbiAgRmlyZWJhc2VFcnJvcixcbiAgZ2V0TW9kdWxhckluc3RhbmNlLFxuICBPYnNlcnZlcixcbiAgU3Vic2NyaWJlXG59IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgQXV0aEludGVybmFsLCBDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7XG4gIEF1dGhFcnJvckNvZGUsXG4gIEF1dGhFcnJvclBhcmFtcyxcbiAgRXJyb3JNYXBSZXRyaWV2ZXIsXG4gIF9ERUZBVUxUX0FVVEhfRVJST1JfRkFDVE9SWVxufSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VJbnRlcm5hbCB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7XG4gIEtleU5hbWUsXG4gIFBlcnNpc3RlbmNlVXNlck1hbmFnZXJcbn0gZnJvbSAnLi4vcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfdXNlcl9tYW5hZ2VyJztcbmltcG9ydCB7IF9yZWxvYWRXaXRob3V0U2F2aW5nIH0gZnJvbSAnLi4vdXNlci9yZWxvYWQnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IF9nZXRJbnN0YW5jZSB9IGZyb20gJy4uL3V0aWwvaW5zdGFudGlhdG9yJztcbmltcG9ydCB7IF9nZXRVc2VyTGFuZ3VhZ2UgfSBmcm9tICcuLi91dGlsL25hdmlnYXRvcic7XG5pbXBvcnQgeyBfZ2V0Q2xpZW50VmVyc2lvbiB9IGZyb20gJy4uL3V0aWwvdmVyc2lvbic7XG5pbXBvcnQgeyBIdHRwSGVhZGVyIH0gZnJvbSAnLi4vLi4vYXBpJztcbmltcG9ydCB7IEF1dGhNaWRkbGV3YXJlUXVldWUgfSBmcm9tICcuL21pZGRsZXdhcmUnO1xuaW1wb3J0IHsgUmVjYXB0Y2hhQ29uZmlnIH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhJztcbmltcG9ydCB7IF9sb2dXYXJuIH0gZnJvbSAnLi4vdXRpbC9sb2cnO1xuaW1wb3J0IHsgX2dldFBhc3N3b3JkUG9saWN5IH0gZnJvbSAnLi4vLi4vYXBpL3Bhc3N3b3JkX3BvbGljeS9nZXRfcGFzc3dvcmRfcG9saWN5JztcbmltcG9ydCB7IFBhc3N3b3JkUG9saWN5SW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wYXNzd29yZF9wb2xpY3knO1xuaW1wb3J0IHsgUGFzc3dvcmRQb2xpY3lJbXBsIH0gZnJvbSAnLi9wYXNzd29yZF9wb2xpY3lfaW1wbCc7XG5cbmludGVyZmFjZSBBc3luY0FjdGlvbiB7XG4gICgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgY29uc3QgZW51bSBEZWZhdWx0Q29uZmlnIHtcbiAgVE9LRU5fQVBJX0hPU1QgPSAnc2VjdXJldG9rZW4uZ29vZ2xlYXBpcy5jb20nLFxuICBBUElfSE9TVCA9ICdpZGVudGl0eXRvb2xraXQuZ29vZ2xlYXBpcy5jb20nLFxuICBBUElfU0NIRU1FID0gJ2h0dHBzJ1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aEltcGwgaW1wbGVtZW50cyBBdXRoSW50ZXJuYWwsIF9GaXJlYmFzZVNlcnZpY2Uge1xuICBjdXJyZW50VXNlcjogVXNlciB8IG51bGwgPSBudWxsO1xuICBlbXVsYXRvckNvbmZpZzogRW11bGF0b3JDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvcGVyYXRpb25zID0gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHByaXZhdGUgcGVyc2lzdGVuY2VNYW5hZ2VyPzogUGVyc2lzdGVuY2VVc2VyTWFuYWdlcjtcbiAgcHJpdmF0ZSByZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcj86IFBlcnNpc3RlbmNlVXNlck1hbmFnZXI7XG4gIHByaXZhdGUgYXV0aFN0YXRlU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbjxVc2VyPih0aGlzKTtcbiAgcHJpdmF0ZSBpZFRva2VuU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbjxVc2VyPih0aGlzKTtcbiAgcHJpdmF0ZSByZWFkb25seSBiZWZvcmVTdGF0ZVF1ZXVlID0gbmV3IEF1dGhNaWRkbGV3YXJlUXVldWUodGhpcyk7XG4gIHByaXZhdGUgcmVkaXJlY3RVc2VyOiBVc2VySW50ZXJuYWwgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBpc1Byb2FjdGl2ZVJlZnJlc2hFbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgRVhQRUNURURfUEFTU1dPUkRfUE9MSUNZX1NDSEVNQV9WRVJTSU9OOiBudW1iZXIgPSAxO1xuXG4gIC8vIEFueSBuZXR3b3JrIGNhbGxzIHdpbGwgc2V0IHRoaXMgdG8gdHJ1ZSBhbmQgcHJldmVudCBzdWJzZXF1ZW50IGVtdWxhdG9yXG4gIC8vIGluaXRpYWxpemF0aW9uXG4gIF9jYW5Jbml0RW11bGF0b3IgPSB0cnVlO1xuICBfaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICBfZGVsZXRlZCA9IGZhbHNlO1xuICBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG4gIF9wb3B1cFJlZGlyZWN0UmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsIHwgbnVsbCA9IG51bGw7XG4gIF9lcnJvckZhY3Rvcnk6IEVycm9yRmFjdG9yeTxBdXRoRXJyb3JDb2RlLCBBdXRoRXJyb3JQYXJhbXM+ID1cbiAgICBfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlk7XG4gIF9hZ2VudFJlY2FwdGNoYUNvbmZpZzogUmVjYXB0Y2hhQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIF90ZW5hbnRSZWNhcHRjaGFDb25maWdzOiBSZWNvcmQ8c3RyaW5nLCBSZWNhcHRjaGFDb25maWc+ID0ge307XG4gIF9wcm9qZWN0UGFzc3dvcmRQb2xpY3k6IFBhc3N3b3JkUG9saWN5SW50ZXJuYWwgfCBudWxsID0gbnVsbDtcbiAgX3RlbmFudFBhc3N3b3JkUG9saWNpZXM6IFJlY29yZDxzdHJpbmcsIFBhc3N3b3JkUG9saWN5SW50ZXJuYWw+ID0ge307XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvLyBUcmFja3MgdGhlIGxhc3Qgbm90aWZpZWQgVUlEIGZvciBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzIHRvIHByZXZlbnRcbiAgLy8gcmVwZWF0ZWQgY2FsbHMgdG8gdGhlIGNhbGxiYWNrcy4gVW5kZWZpbmVkIG1lYW5zIGl0J3MgbmV2ZXIgYmVlblxuICAvLyBjYWxsZWQsIHdoZXJlYXMgbnVsbCBtZWFucyBpdCdzIGJlZW4gY2FsbGVkIHdpdGggYSBzaWduZWQgb3V0IHVzZXJcbiAgcHJpdmF0ZSBsYXN0Tm90aWZpZWRVaWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgbGFuZ3VhZ2VDb2RlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgdGVuYW50SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBzZXR0aW5nczogQXV0aFNldHRpbmdzID0geyBhcHBWZXJpZmljYXRpb25EaXNhYmxlZEZvclRlc3Rpbmc6IGZhbHNlIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGFwcDogRmlyZWJhc2VBcHAsXG4gICAgcHJpdmF0ZSByZWFkb25seSBoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXI6IFByb3ZpZGVyPCdoZWFydGJlYXQnPixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFwcENoZWNrU2VydmljZVByb3ZpZGVyOiBQcm92aWRlcjxBcHBDaGVja0ludGVybmFsQ29tcG9uZW50TmFtZT4sXG4gICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZzogQ29uZmlnSW50ZXJuYWxcbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gYXBwLm5hbWU7XG4gICAgdGhpcy5jbGllbnRWZXJzaW9uID0gY29uZmlnLnNka0NsaWVudFZlcnNpb247XG4gIH1cblxuICBfaW5pdGlhbGl6ZVdpdGhQZXJzaXN0ZW5jZShcbiAgICBwZXJzaXN0ZW5jZUhpZXJhcmNoeTogUGVyc2lzdGVuY2VJbnRlcm5hbFtdLFxuICAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XG4gICAgICB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIgPSBfZ2V0SW5zdGFuY2UocG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcbiAgICB9XG5cbiAgICAvLyBIYXZlIHRvIGNoZWNrIGZvciBhcHAgZGVsZXRpb24gdGhyb3VnaG91dCBpbml0aWFsaXphdGlvbiAoYWZ0ZXIgZWFjaFxuICAgIC8vIHByb21pc2UgcmVzb2x1dGlvbilcbiAgICB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UgPSB0aGlzLnF1ZXVlKGFzeW5jICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXIgPSBhd2FpdCBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyLmNyZWF0ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcGVyc2lzdGVuY2VIaWVyYXJjaHlcbiAgICAgICk7XG5cbiAgICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVzb2x2ZXIgZWFybHkgaWYgbmVjZXNzYXJ5IChvbmx5IGFwcGxpY2FibGUgdG8gd2ViOlxuICAgICAgLy8gdGhpcyB3aWxsIGNhdXNlIHRoZSBpZnJhbWUgdG8gbG9hZCBpbW1lZGlhdGVseSBpbiBjZXJ0YWluIGNhc2VzKVxuICAgICAgaWYgKHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlcj8uX3Nob3VsZEluaXRQcm9hY3RpdmVseSkge1xuICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCBkb24ndCBoYWx0IGF1dGggbG9hZGluZ1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlci5faW5pdGlhbGl6ZSh0aGlzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8qIElnbm9yZSB0aGUgZXJyb3IgKi9cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVDdXJyZW50VXNlcihwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpO1xuICAgICAgdGhpcy5sYXN0Tm90aWZpZWRVaWQgPSB0aGlzLmN1cnJlbnRVc2VyPy51aWQgfHwgbnVsbDtcblxuICAgICAgaWYgKHRoaXMuX2RlbGV0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIHBlcnNpc3RlbmNlIGlzIGNoYW5nZWQgaW4gYW5vdGhlciB3aW5kb3csIHRoZSB1c2VyIG1hbmFnZXIgd2lsbCBsZXQgdXMga25vd1xuICAgKi9cbiAgYXN5bmMgX29uU3RvcmFnZUV2ZW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9kZWxldGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuYXNzZXJ0ZWRQZXJzaXN0ZW5jZS5nZXRDdXJyZW50VXNlcigpO1xuXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRVc2VyICYmICF1c2VyKSB7XG4gICAgICAvLyBObyBjaGFuZ2UsIGRvIG5vdGhpbmcgKHdhcyBzaWduZWQgb3V0IGFuZCByZW1haW5lZCBzaWduZWQgb3V0KS5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgc2FtZSB1c2VyIGlzIHRvIGJlIHN5bmNocm9uaXplZC5cbiAgICBpZiAodGhpcy5jdXJyZW50VXNlciAmJiB1c2VyICYmIHRoaXMuY3VycmVudFVzZXIudWlkID09PSB1c2VyLnVpZCkge1xuICAgICAgLy8gRGF0YSB1cGRhdGUsIHNpbXBseSBjb3B5IGRhdGEgY2hhbmdlcy5cbiAgICAgIHRoaXMuX2N1cnJlbnRVc2VyLl9hc3NpZ24odXNlcik7XG4gICAgICAvLyBJZiB0b2tlbnMgY2hhbmdlZCBmcm9tIHByZXZpb3VzIHVzZXIgdG9rZW5zLCB0aGlzIHdpbGwgdHJpZ2dlclxuICAgICAgLy8gbm90aWZ5QXV0aExpc3RlbmVyc18uXG4gICAgICBhd2FpdCB0aGlzLmN1cnJlbnRVc2VyLmdldElkVG9rZW4oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY3VycmVudCBBdXRoIHN0YXRlLiBFaXRoZXIgYSBuZXcgbG9naW4gb3IgbG9nb3V0LlxuICAgIC8vIFNraXAgYmxvY2tpbmcgY2FsbGJhY2tzLCB0aGV5IHNob3VsZCBub3QgYXBwbHkgdG8gYSBjaGFuZ2UgaW4gYW5vdGhlciB0YWIuXG4gICAgYXdhaXQgdGhpcy5fdXBkYXRlQ3VycmVudFVzZXIodXNlciwgLyogc2tpcEJlZm9yZVN0YXRlQ2FsbGJhY2tzICovIHRydWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ3VycmVudFVzZXIoXG4gICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIEZpcnN0IGNoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcGVuZGluZyByZWRpcmVjdCBldmVudC5cbiAgICBjb25zdCBwcmV2aW91c2x5U3RvcmVkVXNlciA9XG4gICAgICAoYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLmdldEN1cnJlbnRVc2VyKCkpIGFzIFVzZXJJbnRlcm5hbCB8IG51bGw7XG4gICAgbGV0IGZ1dHVyZUN1cnJlbnRVc2VyID0gcHJldmlvdXNseVN0b3JlZFVzZXI7XG4gICAgbGV0IG5lZWRzVG9jaGVja01pZGRsZXdhcmUgPSBmYWxzZTtcbiAgICBpZiAocG9wdXBSZWRpcmVjdFJlc29sdmVyICYmIHRoaXMuY29uZmlnLmF1dGhEb21haW4pIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0T3JJbml0UmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIoKTtcbiAgICAgIGNvbnN0IHJlZGlyZWN0VXNlckV2ZW50SWQgPSB0aGlzLnJlZGlyZWN0VXNlcj8uX3JlZGlyZWN0RXZlbnRJZDtcbiAgICAgIGNvbnN0IHN0b3JlZFVzZXJFdmVudElkID0gZnV0dXJlQ3VycmVudFVzZXI/Ll9yZWRpcmVjdEV2ZW50SWQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyeVJlZGlyZWN0U2lnbkluKHBvcHVwUmVkaXJlY3RSZXNvbHZlcik7XG5cbiAgICAgIC8vIElmIHRoZSBzdG9yZWQgdXNlciAoaS5lLiB0aGUgb2xkIFwiY3VycmVudFVzZXJcIikgaGFzIGEgcmVkaXJlY3RJZCB0aGF0XG4gICAgICAvLyBtYXRjaGVzIHRoZSByZWRpcmVjdCB1c2VyLCB0aGVuIHdlIHdhbnQgdG8gaW5pdGlhbGx5IHNpZ24gaW4gd2l0aCB0aGVcbiAgICAgIC8vIG5ldyB1c2VyIG9iamVjdCBmcm9tIHJlc3VsdC5cbiAgICAgIC8vIFRPRE8oc2FtZ2hvKTogTW9yZSB0aG9yb3VnaGx5IHRlc3QgYWxsIG9mIHRoaXNcbiAgICAgIGlmIChcbiAgICAgICAgKCFyZWRpcmVjdFVzZXJFdmVudElkIHx8IHJlZGlyZWN0VXNlckV2ZW50SWQgPT09IHN0b3JlZFVzZXJFdmVudElkKSAmJlxuICAgICAgICByZXN1bHQ/LnVzZXJcbiAgICAgICkge1xuICAgICAgICBmdXR1cmVDdXJyZW50VXNlciA9IHJlc3VsdC51c2VyIGFzIFVzZXJJbnRlcm5hbDtcbiAgICAgICAgbmVlZHNUb2NoZWNrTWlkZGxld2FyZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gdXNlciBpbiBwZXJzaXN0ZW5jZSwgdGhlcmUgaXMgbm8gY3VycmVudCB1c2VyLiBTZXQgdG8gbnVsbC5cbiAgICBpZiAoIWZ1dHVyZUN1cnJlbnRVc2VyKSB7XG4gICAgICByZXR1cm4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKG51bGwpO1xuICAgIH1cblxuICAgIGlmICghZnV0dXJlQ3VycmVudFVzZXIuX3JlZGlyZWN0RXZlbnRJZCkge1xuICAgICAgLy8gVGhpcyBpc24ndCBhIHJlZGlyZWN0IGxpbmsgb3BlcmF0aW9uLCB3ZSBjYW4gcmVsb2FkIGFuZCBiYWlsLlxuICAgICAgLy8gRmlyc3QgdGhvdWdoLCBlbnN1cmUgdGhhdCB3ZSBjaGVjayB0aGUgbWlkZGxld2FyZSBpcyBoYXBweS5cbiAgICAgIGlmIChuZWVkc1RvY2hlY2tNaWRkbGV3YXJlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5iZWZvcmVTdGF0ZVF1ZXVlLnJ1bk1pZGRsZXdhcmUoZnV0dXJlQ3VycmVudFVzZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgZnV0dXJlQ3VycmVudFVzZXIgPSBwcmV2aW91c2x5U3RvcmVkVXNlcjtcbiAgICAgICAgICAvLyBXZSBrbm93IHRoaXMgaXMgYXZhaWxhYmxlIHNpbmNlIHRoZSBiaXQgaXMgb25seSBzZXQgd2hlbiB0aGVcbiAgICAgICAgICAvLyByZXNvbHZlciBpcyBhdmFpbGFibGVcbiAgICAgICAgICB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIhLl9vdmVycmlkZVJlZGlyZWN0UmVzdWx0KHRoaXMsICgpID0+XG4gICAgICAgICAgICBQcm9taXNlLnJlamVjdChlKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGZ1dHVyZUN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbG9hZEFuZFNldEN1cnJlbnRVc2VyT3JDbGVhcihmdXR1cmVDdXJyZW50VXNlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKG51bGwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF9hc3NlcnQodGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLCB0aGlzLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcbiAgICBhd2FpdCB0aGlzLmdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKCk7XG5cbiAgICAvLyBJZiB0aGUgcmVkaXJlY3QgdXNlcidzIGV2ZW50IElEIG1hdGNoZXMgdGhlIGN1cnJlbnQgdXNlcidzIGV2ZW50IElELFxuICAgIC8vIERPIE5PVCByZWxvYWQgdGhlIGN1cnJlbnQgdXNlciwgb3RoZXJ3aXNlIHRoZXknbGwgYmUgY2xlYXJlZCBmcm9tIHN0b3JhZ2UuXG4gICAgLy8gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIHRoZSByZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdCgpIGZsb3cuXG4gICAgaWYgKFxuICAgICAgdGhpcy5yZWRpcmVjdFVzZXIgJiZcbiAgICAgIHRoaXMucmVkaXJlY3RVc2VyLl9yZWRpcmVjdEV2ZW50SWQgPT09IGZ1dHVyZUN1cnJlbnRVc2VyLl9yZWRpcmVjdEV2ZW50SWRcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLmRpcmVjdGx5U2V0Q3VycmVudFVzZXIoZnV0dXJlQ3VycmVudFVzZXIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlbG9hZEFuZFNldEN1cnJlbnRVc2VyT3JDbGVhcihmdXR1cmVDdXJyZW50VXNlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeVJlZGlyZWN0U2lnbkluKFxuICAgIHJlZGlyZWN0UmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuICApOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsIHwgbnVsbD4ge1xuICAgIC8vIFRoZSByZWRpcmVjdCB1c2VyIG5lZWRzIHRvIGJlIGNoZWNrZWQgKGFuZCBzaWduZWQgaW4gaWYgYXZhaWxhYmxlKVxuICAgIC8vIGR1cmluZyBhdXRoIGluaXRpYWxpemF0aW9uLiBBbGwgb2YgdGhlIG5vcm1hbCBzaWduIGluIGFuZCBsaW5rL3JlYXV0aFxuICAgIC8vIGZsb3dzIGNhbGwgYmFjayBpbnRvIGF1dGggYW5kIHB1c2ggdGhpbmdzIG9udG8gdGhlIHByb21pc2UgcXVldWUuIFdlXG4gICAgLy8gbmVlZCB0byBhd2FpdCB0aGUgcmVzdWx0IG9mIHRoZSByZWRpcmVjdCBzaWduIGluICppbnNpZGUgdGhlIHByb21pc2VcbiAgICAvLyBxdWV1ZSouIFRoaXMgcHJlc2VudHMgYSBwcm9ibGVtOiB3ZSBydW4gaW50byBkZWFkbG9jay4gU2VlOlxuICAgIC8vICAgIOKUjD4gW0luaXRpYWxpemF0aW9uXSDilIDilIDilIDilIDilIDilJBcbiAgICAvLyAgICDilIw+IFs8b3RoZXIgcXVldWUgdGFza3M+XSDilIJcbiAgICAvLyAgICDilJTilIAgW2dldFJlZGlyZWN0UmVzdWx0XSA84pSA4pSYXG4gICAgLy8gICAgd2hlcmUgW10gYXJlIHRhc2tzIG9uIHRoZSBxdWV1ZSBhbmQgYXJyb3dzIGRlbm90ZSBhd2FpdHNcbiAgICAvLyBJbml0aWFsaXphdGlvbiB3aWxsIG5ldmVyIGNvbXBsZXRlIGJlY2F1c2UgaXQncyB3YWl0aW5nIG9uIHNvbWV0aGluZ1xuICAgIC8vIHRoYXQncyB3YWl0aW5nIGZvciBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSFcbiAgICAvL1xuICAgIC8vIEluc3RlYWQsIHRoaXMgbWV0aG9kIGNhbGxzIGdldFJlZGlyZWN0UmVzdWx0KCkgKHN0b3JlZCBpblxuICAgIC8vIF9jb21wbGV0ZVJlZGlyZWN0Rm4pIHdpdGggYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgaW5zdHJ1Y3RzIGFsbCBvZlxuICAgIC8vIHRoZSB1bmRlcmx5aW5nIGF1dGggb3BlcmF0aW9ucyB0byBza2lwIGFueXRoaW5nIHRoYXQgbXV0YXRlcyBhdXRoIHN0YXRlLlxuXG4gICAgbGV0IHJlc3VsdDogVXNlckNyZWRlbnRpYWwgfCBudWxsID0gbnVsbDtcbiAgICB0cnkge1xuICAgICAgLy8gV2Uga25vdyB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXIgaXMgc2V0IHNpbmNlIHJlZGlyZWN0UmVzb2x2ZXJcbiAgICAgIC8vIGlzIHBhc3NlZCBpbi4gVGhlIF9jb21wbGV0ZVJlZGlyZWN0Rm4gZXhwZWN0cyB0aGUgdW53cmFwcGVkIGV4dGVybi5cbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuX3BvcHVwUmVkaXJlY3RSZXNvbHZlciEuX2NvbXBsZXRlUmVkaXJlY3RGbihcbiAgICAgICAgdGhpcyxcbiAgICAgICAgcmVkaXJlY3RSZXNvbHZlcixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBTd2FsbG93IGFueSBlcnJvcnMgaGVyZTsgdGhlIGNvZGUgY2FuIHJldHJpZXZlIHRoZW0gaW5cbiAgICAgIC8vIGdldFJlZGlyZWN0UmVzdWx0KCkuXG4gICAgICBhd2FpdCB0aGlzLl9zZXRSZWRpcmVjdFVzZXIobnVsbCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVsb2FkQW5kU2V0Q3VycmVudFVzZXJPckNsZWFyKFxuICAgIHVzZXI6IFVzZXJJbnRlcm5hbFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgX3JlbG9hZFdpdGhvdXRTYXZpbmcodXNlcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKFxuICAgICAgICAoZSBhcyBGaXJlYmFzZUVycm9yKT8uY29kZSAhPT1cbiAgICAgICAgYGF1dGgvJHtBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRUR9YFxuICAgICAgKSB7XG4gICAgICAgIC8vIFNvbWV0aGluZydzIHdyb25nIHdpdGggdGhlIHVzZXIncyB0b2tlbi4gTG9nIHRoZW0gb3V0IGFuZCByZW1vdmVcbiAgICAgICAgLy8gdGhlbSBmcm9tIHN0b3JhZ2VcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcihudWxsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICB9XG5cbiAgdXNlRGV2aWNlTGFuZ3VhZ2UoKTogdm9pZCB7XG4gICAgdGhpcy5sYW5ndWFnZUNvZGUgPSBfZ2V0VXNlckxhbmd1YWdlKCk7XG4gIH1cblxuICBhc3luYyBfZGVsZXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX2RlbGV0ZWQgPSB0cnVlO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQ3VycmVudFVzZXIodXNlckV4dGVybjogVXNlciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBUaGUgcHVibGljIHVwZGF0ZUN1cnJlbnRVc2VyIG1ldGhvZCBuZWVkcyB0byBtYWtlIGEgY29weSBvZiB0aGUgdXNlcixcbiAgICAvLyBhbmQgYWxzbyBjaGVjayB0aGF0IHRoZSBwcm9qZWN0IG1hdGNoZXNcbiAgICBjb25zdCB1c2VyID0gdXNlckV4dGVyblxuICAgICAgPyAoZ2V0TW9kdWxhckluc3RhbmNlKHVzZXJFeHRlcm4pIGFzIFVzZXJJbnRlcm5hbClcbiAgICAgIDogbnVsbDtcbiAgICBpZiAodXNlcikge1xuICAgICAgX2Fzc2VydChcbiAgICAgICAgdXNlci5hdXRoLmNvbmZpZy5hcGlLZXkgPT09IHRoaXMuY29uZmlnLmFwaUtleSxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX0FVVEhcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl91cGRhdGVDdXJyZW50VXNlcih1c2VyICYmIHVzZXIuX2Nsb25lKHRoaXMpKTtcbiAgfVxuXG4gIGFzeW5jIF91cGRhdGVDdXJyZW50VXNlcihcbiAgICB1c2VyOiBVc2VyIHwgbnVsbCxcbiAgICBza2lwQmVmb3JlU3RhdGVDYWxsYmFja3M6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodXNlcikge1xuICAgICAgX2Fzc2VydChcbiAgICAgICAgdGhpcy50ZW5hbnRJZCA9PT0gdXNlci50ZW5hbnRJZCxcbiAgICAgICAgdGhpcyxcbiAgICAgICAgQXV0aEVycm9yQ29kZS5URU5BTlRfSURfTUlTTUFUQ0hcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuYmVmb3JlU3RhdGVRdWV1ZS5ydW5NaWRkbGV3YXJlKHVzZXIpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnF1ZXVlKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuZGlyZWN0bHlTZXRDdXJyZW50VXNlcih1c2VyIGFzIFVzZXJJbnRlcm5hbCB8IG51bGwpO1xuICAgICAgdGhpcy5ub3RpZnlBdXRoTGlzdGVuZXJzKCk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzaWduT3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJ1biBmaXJzdCwgdG8gYmxvY2sgX3NldFJlZGlyZWN0VXNlcigpIGlmIGFueSBjYWxsYmFja3MgZmFpbC5cbiAgICBhd2FpdCB0aGlzLmJlZm9yZVN0YXRlUXVldWUucnVuTWlkZGxld2FyZShudWxsKTtcbiAgICAvLyBDbGVhciB0aGUgcmVkaXJlY3QgdXNlciB3aGVuIHNpZ25PdXQgaXMgY2FsbGVkXG4gICAgaWYgKHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIgfHwgdGhpcy5fcG9wdXBSZWRpcmVjdFJlc29sdmVyKSB7XG4gICAgICBhd2FpdCB0aGlzLl9zZXRSZWRpcmVjdFVzZXIobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gUHJldmVudCBjYWxsYmFja3MgZnJvbSBiZWluZyBjYWxsZWQgYWdhaW4gaW4gX3VwZGF0ZUN1cnJlbnRVc2VyLCBhc1xuICAgIC8vIHRoZXkgd2VyZSBhbHJlYWR5IGNhbGxlZCBpbiB0aGUgZmlyc3QgbGluZS5cbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlQ3VycmVudFVzZXIobnVsbCwgLyogc2tpcEJlZm9yZVN0YXRlQ2FsbGJhY2tzICovIHRydWUpO1xuICB9XG5cbiAgc2V0UGVyc2lzdGVuY2UocGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnNldFBlcnNpc3RlbmNlKF9nZXRJbnN0YW5jZShwZXJzaXN0ZW5jZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgX2dldFJlY2FwdGNoYUNvbmZpZygpOiBSZWNhcHRjaGFDb25maWcgfCBudWxsIHtcbiAgICBpZiAodGhpcy50ZW5hbnRJZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWdlbnRSZWNhcHRjaGFDb25maWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl90ZW5hbnRSZWNhcHRjaGFDb25maWdzW3RoaXMudGVuYW50SWRdO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHZhbGlkYXRlUGFzc3dvcmQocGFzc3dvcmQ6IHN0cmluZyk6IFByb21pc2U8UGFzc3dvcmRWYWxpZGF0aW9uU3RhdHVzPiB7XG4gICAgaWYgKCF0aGlzLl9nZXRQYXNzd29yZFBvbGljeUludGVybmFsKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuX3VwZGF0ZVBhc3N3b3JkUG9saWN5KCk7XG4gICAgfVxuXG4gICAgLy8gUGFzc3dvcmQgcG9saWN5IHdpbGwgYmUgZGVmaW5lZCBhZnRlciBmZXRjaGluZy5cbiAgICBjb25zdCBwYXNzd29yZFBvbGljeTogUGFzc3dvcmRQb2xpY3lJbnRlcm5hbCA9XG4gICAgICB0aGlzLl9nZXRQYXNzd29yZFBvbGljeUludGVybmFsKCkhO1xuXG4gICAgLy8gQ2hlY2sgdGhhdCB0aGUgcG9saWN5IHNjaGVtYSB2ZXJzaW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgU0RLLlxuICAgIC8vIFRPRE86IFVwZGF0ZSB0aGlzIGxvZ2ljIHRvIHVzZSBhIG1heCBzdXBwb3J0ZWQgcG9saWN5IHNjaGVtYSB2ZXJzaW9uIG9uY2Ugd2UgaGF2ZSBtdWx0aXBsZSBzY2hlbWEgdmVyc2lvbnMuXG4gICAgaWYgKFxuICAgICAgcGFzc3dvcmRQb2xpY3kuc2NoZW1hVmVyc2lvbiAhPT1cbiAgICAgIHRoaXMuRVhQRUNURURfUEFTU1dPUkRfUE9MSUNZX1NDSEVNQV9WRVJTSU9OXG4gICAgKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIHRoaXMuX2Vycm9yRmFjdG9yeS5jcmVhdGUoXG4gICAgICAgICAgQXV0aEVycm9yQ29kZS5VTlNVUFBPUlRFRF9QQVNTV09SRF9QT0xJQ1lfU0NIRU1BX1ZFUlNJT04sXG4gICAgICAgICAge31cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFzc3dvcmRQb2xpY3kudmFsaWRhdGVQYXNzd29yZChwYXNzd29yZCk7XG4gIH1cblxuICBfZ2V0UGFzc3dvcmRQb2xpY3lJbnRlcm5hbCgpOiBQYXNzd29yZFBvbGljeUludGVybmFsIHwgbnVsbCB7XG4gICAgaWYgKHRoaXMudGVuYW50SWQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcm9qZWN0UGFzc3dvcmRQb2xpY3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl90ZW5hbnRQYXNzd29yZFBvbGljaWVzW3RoaXMudGVuYW50SWRdO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF91cGRhdGVQYXNzd29yZFBvbGljeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9nZXRQYXNzd29yZFBvbGljeSh0aGlzKTtcblxuICAgIGNvbnN0IHBhc3N3b3JkUG9saWN5OiBQYXNzd29yZFBvbGljeUludGVybmFsID0gbmV3IFBhc3N3b3JkUG9saWN5SW1wbChcbiAgICAgIHJlc3BvbnNlXG4gICAgKTtcblxuICAgIGlmICh0aGlzLnRlbmFudElkID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9wcm9qZWN0UGFzc3dvcmRQb2xpY3kgPSBwYXNzd29yZFBvbGljeTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVuYW50UGFzc3dvcmRQb2xpY2llc1t0aGlzLnRlbmFudElkXSA9IHBhc3N3b3JkUG9saWN5O1xuICAgIH1cbiAgfVxuXG4gIF9nZXRQZXJzaXN0ZW5jZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UucGVyc2lzdGVuY2UudHlwZTtcbiAgfVxuXG4gIF91cGRhdGVFcnJvck1hcChlcnJvck1hcDogQXV0aEVycm9yTWFwKTogdm9pZCB7XG4gICAgdGhpcy5fZXJyb3JGYWN0b3J5ID0gbmV3IEVycm9yRmFjdG9yeTxBdXRoRXJyb3JDb2RlLCBBdXRoRXJyb3JQYXJhbXM+KFxuICAgICAgJ2F1dGgnLFxuICAgICAgJ0ZpcmViYXNlJyxcbiAgICAgIChlcnJvck1hcCBhcyBFcnJvck1hcFJldHJpZXZlcikoKVxuICAgICk7XG4gIH1cblxuICBvbkF1dGhTdGF0ZUNoYW5nZWQoXG4gICAgbmV4dE9yT2JzZXJ2ZXI6IE5leHRPck9ic2VydmVyPFVzZXI+LFxuICAgIGVycm9yPzogRXJyb3JGbixcbiAgICBjb21wbGV0ZWQ/OiBDb21wbGV0ZUZuXG4gICk6IFVuc3Vic2NyaWJlIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpc3RlclN0YXRlTGlzdGVuZXIoXG4gICAgICB0aGlzLmF1dGhTdGF0ZVN1YnNjcmlwdGlvbixcbiAgICAgIG5leHRPck9ic2VydmVyLFxuICAgICAgZXJyb3IsXG4gICAgICBjb21wbGV0ZWRcbiAgICApO1xuICB9XG5cbiAgYmVmb3JlQXV0aFN0YXRlQ2hhbmdlZChcbiAgICBjYWxsYmFjazogKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAgICBvbkFib3J0PzogKCkgPT4gdm9pZFxuICApOiBVbnN1YnNjcmliZSB7XG4gICAgcmV0dXJuIHRoaXMuYmVmb3JlU3RhdGVRdWV1ZS5wdXNoQ2FsbGJhY2soY2FsbGJhY2ssIG9uQWJvcnQpO1xuICB9XG5cbiAgb25JZFRva2VuQ2hhbmdlZChcbiAgICBuZXh0T3JPYnNlcnZlcjogTmV4dE9yT2JzZXJ2ZXI8VXNlcj4sXG4gICAgZXJyb3I/OiBFcnJvckZuLFxuICAgIGNvbXBsZXRlZD86IENvbXBsZXRlRm5cbiAgKTogVW5zdWJzY3JpYmUge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdGVyU3RhdGVMaXN0ZW5lcihcbiAgICAgIHRoaXMuaWRUb2tlblN1YnNjcmlwdGlvbixcbiAgICAgIG5leHRPck9ic2VydmVyLFxuICAgICAgZXJyb3IsXG4gICAgICBjb21wbGV0ZWRcbiAgICApO1xuICB9XG5cbiAgYXV0aFN0YXRlUmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5vbkF1dGhTdGF0ZUNoYW5nZWQoKCkgPT4ge1xuICAgICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdG9KU09OKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwaUtleTogdGhpcy5jb25maWcuYXBpS2V5LFxuICAgICAgYXV0aERvbWFpbjogdGhpcy5jb25maWcuYXV0aERvbWFpbixcbiAgICAgIGFwcE5hbWU6IHRoaXMubmFtZSxcbiAgICAgIGN1cnJlbnRVc2VyOiB0aGlzLl9jdXJyZW50VXNlcj8udG9KU09OKClcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgX3NldFJlZGlyZWN0VXNlcihcbiAgICB1c2VyOiBVc2VySW50ZXJuYWwgfCBudWxsLFxuICAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWRpcmVjdE1hbmFnZXIgPSBhd2FpdCB0aGlzLmdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKFxuICAgICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyXG4gICAgKTtcbiAgICByZXR1cm4gdXNlciA9PT0gbnVsbFxuICAgICAgPyByZWRpcmVjdE1hbmFnZXIucmVtb3ZlQ3VycmVudFVzZXIoKVxuICAgICAgOiByZWRpcmVjdE1hbmFnZXIuc2V0Q3VycmVudFVzZXIodXNlcik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9ySW5pdFJlZGlyZWN0UGVyc2lzdGVuY2VNYW5hZ2VyKFxuICAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuICApOiBQcm9taXNlPFBlcnNpc3RlbmNlVXNlck1hbmFnZXI+IHtcbiAgICBpZiAoIXRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVyOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB8IG51bGwgPVxuICAgICAgICAocG9wdXBSZWRpcmVjdFJlc29sdmVyICYmIF9nZXRJbnN0YW5jZShwb3B1cFJlZGlyZWN0UmVzb2x2ZXIpKSB8fFxuICAgICAgICB0aGlzLl9wb3B1cFJlZGlyZWN0UmVzb2x2ZXI7XG4gICAgICBfYXNzZXJ0KHJlc29sdmVyLCB0aGlzLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcbiAgICAgIHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIgPSBhd2FpdCBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyLmNyZWF0ZShcbiAgICAgICAgdGhpcyxcbiAgICAgICAgW19nZXRJbnN0YW5jZShyZXNvbHZlci5fcmVkaXJlY3RQZXJzaXN0ZW5jZSldLFxuICAgICAgICBLZXlOYW1lLlJFRElSRUNUX1VTRVJcbiAgICAgICk7XG4gICAgICB0aGlzLnJlZGlyZWN0VXNlciA9XG4gICAgICAgIGF3YWl0IHRoaXMucmVkaXJlY3RQZXJzaXN0ZW5jZU1hbmFnZXIuZ2V0Q3VycmVudFVzZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5yZWRpcmVjdFBlcnNpc3RlbmNlTWFuYWdlcjtcbiAgfVxuXG4gIGFzeW5jIF9yZWRpcmVjdFVzZXJGb3JJZChpZDogc3RyaW5nKTogUHJvbWlzZTxVc2VySW50ZXJuYWwgfCBudWxsPiB7XG4gICAgLy8gTWFrZSBzdXJlIHdlJ3ZlIGNsZWFyZWQgYW55IHBlbmRpbmcgcGVyc2lzdGVuY2UgYWN0aW9ucyBpZiB3ZSdyZSBub3QgaW5cbiAgICAvLyB0aGUgaW5pdGlhbGl6ZXJcbiAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCkge1xuICAgICAgYXdhaXQgdGhpcy5xdWV1ZShhc3luYyAoKSA9PiB7fSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2N1cnJlbnRVc2VyPy5fcmVkaXJlY3RFdmVudElkID09PSBpZCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRVc2VyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlZGlyZWN0VXNlcj8uX3JlZGlyZWN0RXZlbnRJZCA9PT0gaWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZGlyZWN0VXNlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIF9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VyOiBVc2VySW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodXNlciA9PT0gdGhpcy5jdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIHRoaXMucXVldWUoYXN5bmMgKCkgPT4gdGhpcy5kaXJlY3RseVNldEN1cnJlbnRVc2VyKHVzZXIpKTtcbiAgICB9XG4gIH1cblxuICAvKiogTm90aWZpZXMgbGlzdGVuZXJzIG9ubHkgaWYgdGhlIHVzZXIgaXMgY3VycmVudCAqL1xuICBfbm90aWZ5TGlzdGVuZXJzSWZDdXJyZW50KHVzZXI6IFVzZXJJbnRlcm5hbCk6IHZvaWQge1xuICAgIGlmICh1c2VyID09PSB0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICB0aGlzLm5vdGlmeUF1dGhMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICBfa2V5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuY29uZmlnLmF1dGhEb21haW59OiR7dGhpcy5jb25maWcuYXBpS2V5fToke3RoaXMubmFtZX1gO1xuICB9XG5cbiAgX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzUHJvYWN0aXZlUmVmcmVzaEVuYWJsZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmN1cnJlbnRVc2VyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50VXNlci5fc3RvcFByb2FjdGl2ZVJlZnJlc2goKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB1c2VyIGNhc3QgYXMgdGhlIGludGVybmFsIHR5cGUgKi9cbiAgZ2V0IF9jdXJyZW50VXNlcigpOiBVc2VySW50ZXJuYWwge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRVc2VyIGFzIFVzZXJJbnRlcm5hbDtcbiAgfVxuXG4gIHByaXZhdGUgbm90aWZ5QXV0aExpc3RlbmVycygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmlkVG9rZW5TdWJzY3JpcHRpb24ubmV4dCh0aGlzLmN1cnJlbnRVc2VyKTtcblxuICAgIGNvbnN0IGN1cnJlbnRVaWQgPSB0aGlzLmN1cnJlbnRVc2VyPy51aWQgPz8gbnVsbDtcbiAgICBpZiAodGhpcy5sYXN0Tm90aWZpZWRVaWQgIT09IGN1cnJlbnRVaWQpIHtcbiAgICAgIHRoaXMubGFzdE5vdGlmaWVkVWlkID0gY3VycmVudFVpZDtcbiAgICAgIHRoaXMuYXV0aFN0YXRlU3Vic2NyaXB0aW9uLm5leHQodGhpcy5jdXJyZW50VXNlcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclN0YXRlTGlzdGVuZXIoXG4gICAgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb248VXNlcj4sXG4gICAgbmV4dE9yT2JzZXJ2ZXI6IE5leHRPck9ic2VydmVyPFVzZXI+LFxuICAgIGVycm9yPzogRXJyb3JGbixcbiAgICBjb21wbGV0ZWQ/OiBDb21wbGV0ZUZuXG4gICk6IFVuc3Vic2NyaWJlIHtcbiAgICBpZiAodGhpcy5fZGVsZXRlZCkge1xuICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGNiID1cbiAgICAgIHR5cGVvZiBuZXh0T3JPYnNlcnZlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG5leHRPck9ic2VydmVyXG4gICAgICAgIDogbmV4dE9yT2JzZXJ2ZXIubmV4dC5iaW5kKG5leHRPck9ic2VydmVyKTtcblxuICAgIGxldCBpc1Vuc3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuX2lzSW5pdGlhbGl6ZWRcbiAgICAgID8gUHJvbWlzZS5yZXNvbHZlKClcbiAgICAgIDogdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICAgIF9hc3NlcnQocHJvbWlzZSwgdGhpcywgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgLy8gVGhlIGNhbGxiYWNrIG5lZWRzIHRvIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBwZXIgdGhlIHNwZWMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAoaXNVbnN1YnNjcmliZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2IodGhpcy5jdXJyZW50VXNlcik7XG4gICAgfSk7XG5cbiAgICBpZiAodHlwZW9mIG5leHRPck9ic2VydmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmlwdGlvbi5hZGRPYnNlcnZlcihcbiAgICAgICAgbmV4dE9yT2JzZXJ2ZXIsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBjb21wbGV0ZWRcbiAgICAgICk7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpc1Vuc3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSA9IHN1YnNjcmlwdGlvbi5hZGRPYnNlcnZlcihuZXh0T3JPYnNlcnZlcik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpc1Vuc3Vic2NyaWJlZCA9IHRydWU7XG4gICAgICAgIHVuc3Vic2NyaWJlKCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnByb3RlY3RlZCAoZnJvbSByYWNlIGNvbmRpdGlvbnMpIG1ldGhvZCB0byBzZXQgdGhlIGN1cnJlbnQgdXNlci4gVGhpc1xuICAgKiBzaG91bGQgb25seSBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBxdWV1ZWQgY2FsbGJhY2suIFRoaXMgaXMgbmVjZXNzYXJ5XG4gICAqIGJlY2F1c2UgdGhlIHF1ZXVlIHNob3VsZG4ndCByZWx5IG9uIGFub3RoZXIgcXVldWVkIGNhbGxiYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBkaXJlY3RseVNldEN1cnJlbnRVc2VyKFxuICAgIHVzZXI6IFVzZXJJbnRlcm5hbCB8IG51bGxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY3VycmVudFVzZXIgJiYgdGhpcy5jdXJyZW50VXNlciAhPT0gdXNlcikge1xuICAgICAgdGhpcy5fY3VycmVudFVzZXIuX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfVxuICAgIGlmICh1c2VyICYmIHRoaXMuaXNQcm9hY3RpdmVSZWZyZXNoRW5hYmxlZCkge1xuICAgICAgdXNlci5fc3RhcnRQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50VXNlciA9IHVzZXI7XG5cbiAgICBpZiAodXNlcikge1xuICAgICAgYXdhaXQgdGhpcy5hc3NlcnRlZFBlcnNpc3RlbmNlLnNldEN1cnJlbnRVc2VyKHVzZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFzc2VydGVkUGVyc2lzdGVuY2UucmVtb3ZlQ3VycmVudFVzZXIoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHF1ZXVlKGFjdGlvbjogQXN5bmNBY3Rpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBJbiBjYXNlIHNvbWV0aGluZyBlcnJvcnMsIHRoZSBjYWxsYmFjayBzdGlsbCBzaG91bGQgYmUgY2FsbGVkIGluIG9yZGVyXG4gICAgLy8gdG8ga2VlcCB0aGUgcHJvbWlzZSBjaGFpbiBhbGl2ZVxuICAgIHRoaXMub3BlcmF0aW9ucyA9IHRoaXMub3BlcmF0aW9ucy50aGVuKGFjdGlvbiwgYWN0aW9uKTtcbiAgICByZXR1cm4gdGhpcy5vcGVyYXRpb25zO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgYXNzZXJ0ZWRQZXJzaXN0ZW5jZSgpOiBQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyIHtcbiAgICBfYXNzZXJ0KHRoaXMucGVyc2lzdGVuY2VNYW5hZ2VyLCB0aGlzLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICByZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZU1hbmFnZXI7XG4gIH1cblxuICBwcml2YXRlIGZyYW1ld29ya3M6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgY2xpZW50VmVyc2lvbjogc3RyaW5nO1xuICBfbG9nRnJhbWV3b3JrKGZyYW1ld29yazogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFmcmFtZXdvcmsgfHwgdGhpcy5mcmFtZXdvcmtzLmluY2x1ZGVzKGZyYW1ld29yaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mcmFtZXdvcmtzLnB1c2goZnJhbWV3b3JrKTtcblxuICAgIC8vIFNvcnQgYWxwaGFiZXRpY2FsbHkgc28gdGhhdCBcIkZpcmViYXNlQ29yZS13ZWIsRmlyZWJhc2VVSS13ZWJcIiBhbmRcbiAgICAvLyBcIkZpcmViYXNlVUktd2ViLEZpcmViYXNlQ29yZS13ZWJcIiBhcmVuJ3Qgdmlld2VkIGFzIGRpZmZlcmVudC5cbiAgICB0aGlzLmZyYW1ld29ya3Muc29ydCgpO1xuICAgIHRoaXMuY2xpZW50VmVyc2lvbiA9IF9nZXRDbGllbnRWZXJzaW9uKFxuICAgICAgdGhpcy5jb25maWcuY2xpZW50UGxhdGZvcm0sXG4gICAgICB0aGlzLl9nZXRGcmFtZXdvcmtzKClcbiAgICApO1xuICB9XG4gIF9nZXRGcmFtZXdvcmtzKCk6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5mcmFtZXdvcmtzO1xuICB9XG4gIGFzeW5jIF9nZXRBZGRpdGlvbmFsSGVhZGVycygpOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICAvLyBBZGRpdGlvbmFsIGhlYWRlcnMgb24gZXZlcnkgcmVxdWVzdFxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICBbSHR0cEhlYWRlci5YX0NMSUVOVF9WRVJTSU9OXTogdGhpcy5jbGllbnRWZXJzaW9uXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmFwcC5vcHRpb25zLmFwcElkKSB7XG4gICAgICBoZWFkZXJzW0h0dHBIZWFkZXIuWF9GSVJFQkFTRV9HTVBJRF0gPSB0aGlzLmFwcC5vcHRpb25zLmFwcElkO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBoZWFydGJlYXQgc2VydmljZSBleGlzdHMsIGFkZCB0aGUgaGVhcnRiZWF0IHN0cmluZ1xuICAgIGNvbnN0IGhlYXJ0YmVhdHNIZWFkZXIgPSBhd2FpdCB0aGlzLmhlYXJ0YmVhdFNlcnZpY2VQcm92aWRlclxuICAgICAgLmdldEltbWVkaWF0ZSh7XG4gICAgICAgIG9wdGlvbmFsOiB0cnVlXG4gICAgICB9KVxuICAgICAgPy5nZXRIZWFydGJlYXRzSGVhZGVyKCk7XG4gICAgaWYgKGhlYXJ0YmVhdHNIZWFkZXIpIHtcbiAgICAgIGhlYWRlcnNbSHR0cEhlYWRlci5YX0ZJUkVCQVNFX0NMSUVOVF0gPSBoZWFydGJlYXRzSGVhZGVyO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBBcHAgQ2hlY2sgc2VydmljZSBleGlzdHMsIGFkZCB0aGUgQXBwIENoZWNrIHRva2VuIGluIHRoZSBoZWFkZXJzXG4gICAgY29uc3QgYXBwQ2hlY2tUb2tlbiA9IGF3YWl0IHRoaXMuX2dldEFwcENoZWNrVG9rZW4oKTtcbiAgICBpZiAoYXBwQ2hlY2tUb2tlbikge1xuICAgICAgaGVhZGVyc1tIdHRwSGVhZGVyLlhfRklSRUJBU0VfQVBQX0NIRUNLXSA9IGFwcENoZWNrVG9rZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlcnM7XG4gIH1cblxuICBhc3luYyBfZ2V0QXBwQ2hlY2tUb2tlbigpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGFwcENoZWNrVG9rZW5SZXN1bHQgPSBhd2FpdCB0aGlzLmFwcENoZWNrU2VydmljZVByb3ZpZGVyXG4gICAgICAuZ2V0SW1tZWRpYXRlKHsgb3B0aW9uYWw6IHRydWUgfSlcbiAgICAgID8uZ2V0VG9rZW4oKTtcbiAgICBpZiAoYXBwQ2hlY2tUb2tlblJlc3VsdD8uZXJyb3IpIHtcbiAgICAgIC8vIENvbnRleHQ6IGFwcENoZWNrLmdldFRva2VuKCkgd2lsbCBuZXZlciB0aHJvdyBldmVuIGlmIGFuIGVycm9yIGhhcHBlbmVkLlxuICAgICAgLy8gSW4gdGhlIGVycm9yIGNhc2UsIGEgZHVtbXkgdG9rZW4gd2lsbCBiZSByZXR1cm5lZCBhbG9uZyB3aXRoIGFuIGVycm9yIGZpZWxkIGRlc2NyaWJpbmdcbiAgICAgIC8vIHRoZSBlcnJvci4gSW4gZ2VuZXJhbCwgd2Ugc2hvdWxkbid0IGNhcmUgYWJvdXQgdGhlIGVycm9yIGNvbmRpdGlvbiBhbmQganVzdCB1c2VcbiAgICAgIC8vIHRoZSB0b2tlbiAoYWN0dWFsIG9yIGR1bW15KSB0byBzZW5kIHJlcXVlc3RzLlxuICAgICAgX2xvZ1dhcm4oXG4gICAgICAgIGBFcnJvciB3aGlsZSByZXRyaWV2aW5nIEFwcCBDaGVjayB0b2tlbjogJHthcHBDaGVja1Rva2VuUmVzdWx0LmVycm9yfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBhcHBDaGVja1Rva2VuUmVzdWx0Py50b2tlbjtcbiAgfVxufVxuXG4vKipcbiAqIE1ldGhvZCB0byBiZSB1c2VkIHRvIGNhc3QgZG93biB0byBvdXIgcHJpdmF0ZSBpbXBsbWVudGF0aW9uIG9mIEF1dGguXG4gKiBJdCB3aWxsIGFsc28gaGFuZGxlIHVud3JhcHBpbmcgZnJvbSB0aGUgY29tcGF0IHR5cGUgaWYgbmVjZXNzYXJ5XG4gKlxuICogQHBhcmFtIGF1dGggQXV0aCBvYmplY3QgcGFzc2VkIGluIGZyb20gZGV2ZWxvcGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2FzdEF1dGgoYXV0aDogQXV0aCk6IEF1dGhJbnRlcm5hbCB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkgYXMgQXV0aEludGVybmFsO1xufVxuXG4vKiogSGVscGVyIGNsYXNzIHRvIHdyYXAgc3Vic2NyaWJlciBsb2dpYyAqL1xuY2xhc3MgU3Vic2NyaXB0aW9uPFQ+IHtcbiAgcHJpdmF0ZSBvYnNlcnZlcjogT2JzZXJ2ZXI8VCB8IG51bGw+IHwgbnVsbCA9IG51bGw7XG4gIHJlYWRvbmx5IGFkZE9ic2VydmVyOiBTdWJzY3JpYmU8VCB8IG51bGw+ID0gY3JlYXRlU3Vic2NyaWJlKFxuICAgIG9ic2VydmVyID0+ICh0aGlzLm9ic2VydmVyID0gb2JzZXJ2ZXIpXG4gICk7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIGdldCBuZXh0KCk6IE5leHRGbjxUIHwgbnVsbD4ge1xuICAgIF9hc3NlcnQodGhpcy5vYnNlcnZlciwgdGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlci5uZXh0LmJpbmQodGhpcy5vYnNlcnZlcik7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2NyZWF0ZUVycm9yIH0gZnJvbSAnLi4vY29yZS91dGlsL2Fzc2VydCc7XG5cbmZ1bmN0aW9uIGdldFNjcmlwdFBhcmVudEVsZW1lbnQoKTogSFRNTERvY3VtZW50IHwgSFRNTEhlYWRFbGVtZW50IHtcbiAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJyk/LlswXSA/PyBkb2N1bWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9sb2FkSlModXJsOiBzdHJpbmcpOiBQcm9taXNlPEV2ZW50PiB7XG4gIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyB0aW1lb3V0IHN1cHBvcnQgJiBjYW5jZWxsYXRpb25cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIGVsLnNldEF0dHJpYnV0ZSgnc3JjJywgdXJsKTtcbiAgICBlbC5vbmxvYWQgPSByZXNvbHZlO1xuICAgIGVsLm9uZXJyb3IgPSBlID0+IHtcbiAgICAgIGNvbnN0IGVycm9yID0gX2NyZWF0ZUVycm9yKEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgICAgZXJyb3IuY3VzdG9tRGF0YSA9IGUgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIHJlamVjdChlcnJvcik7XG4gICAgfTtcbiAgICBlbC50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgZWwuY2hhcnNldCA9ICdVVEYtOCc7XG4gICAgZ2V0U2NyaXB0UGFyZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKGVsKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZ2VuZXJhdGVDYWxsYmFja05hbWUocHJlZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYF9fJHtwcmVmaXh9JHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAxMDAwMDAwKX1gO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHMgKi9cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGlzRW50ZXJwcmlzZSwgUmVjYXB0Y2hhQ29uZmlnIH0gZnJvbSAnLi9yZWNhcHRjaGEnO1xuaW1wb3J0IHsgZ2V0UmVjYXB0Y2hhQ29uZmlnIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3JlY2FwdGNoYSc7XG5pbXBvcnQge1xuICBSZWNhcHRjaGFDbGllbnRUeXBlLFxuICBSZWNhcHRjaGFWZXJzaW9uLFxuICBSZWNhcHRjaGFBY3Rpb25OYW1lLFxuICBSZWNhcHRjaGFQcm92aWRlclxufSBmcm9tICcuLi8uLi9hcGknO1xuXG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgKiBhcyBqc0hlbHBlcnMgZnJvbSAnLi4vbG9hZF9qcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuXG5jb25zdCBSRUNBUFRDSEFfRU5URVJQUklTRV9VUkwgPVxuICAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvZW50ZXJwcmlzZS5qcz9yZW5kZXI9JztcblxuZXhwb3J0IGNvbnN0IFJFQ0FQVENIQV9FTlRFUlBSSVNFX1ZFUklGSUVSX1RZUEUgPSAncmVjYXB0Y2hhLWVudGVycHJpc2UnO1xuZXhwb3J0IGNvbnN0IEZBS0VfVE9LRU4gPSAnTk9fUkVDQVBUQ0hBJztcblxuZXhwb3J0IGNsYXNzIFJlY2FwdGNoYUVudGVycHJpc2VWZXJpZmllciB7XG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIGFwcGxpY2F0aW9uIHZlcmlmaWVyIChlLmcuIFwicmVjYXB0Y2hhLWVudGVycHJpc2VcIikuXG4gICAqL1xuICByZWFkb25seSB0eXBlID0gUkVDQVBUQ0hBX0VOVEVSUFJJU0VfVkVSSUZJRVJfVFlQRTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGF1dGg6IEF1dGhJbnRlcm5hbDtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGF1dGhFeHRlcm4gLSBUaGUgY29ycmVzcG9uZGluZyBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gICAqXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdXRoRXh0ZXJuOiBBdXRoKSB7XG4gICAgdGhpcy5hdXRoID0gX2Nhc3RBdXRoKGF1dGhFeHRlcm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciBhIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gYXNzZXJ0IHRoZSB2YWxpZGl0eSBvZiBhIHJlcXVlc3QuXG4gICAqL1xuICBhc3luYyB2ZXJpZnkoXG4gICAgYWN0aW9uOiBzdHJpbmcgPSAndmVyaWZ5JyxcbiAgICBmb3JjZVJlZnJlc2ggPSBmYWxzZVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGFzeW5jIGZ1bmN0aW9uIHJldHJpZXZlU2l0ZUtleShhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgaWYgKCFmb3JjZVJlZnJlc2gpIHtcbiAgICAgICAgaWYgKGF1dGgudGVuYW50SWQgPT0gbnVsbCAmJiBhdXRoLl9hZ2VudFJlY2FwdGNoYUNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGF1dGguX2FnZW50UmVjYXB0Y2hhQ29uZmlnLnNpdGVLZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGF1dGgudGVuYW50SWQgIT0gbnVsbCAmJlxuICAgICAgICAgIGF1dGguX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3NbYXV0aC50ZW5hbnRJZF0gIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gYXV0aC5fdGVuYW50UmVjYXB0Y2hhQ29uZmlnc1thdXRoLnRlbmFudElkXS5zaXRlS2V5O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZ2V0UmVjYXB0Y2hhQ29uZmlnKGF1dGgsIHtcbiAgICAgICAgICBjbGllbnRUeXBlOiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQixcbiAgICAgICAgICB2ZXJzaW9uOiBSZWNhcHRjaGFWZXJzaW9uLkVOVEVSUFJJU0VcbiAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVjYXB0Y2hhS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcigncmVjYXB0Y2hhIEVudGVycHJpc2Ugc2l0ZSBrZXkgdW5kZWZpbmVkJykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gbmV3IFJlY2FwdGNoYUNvbmZpZyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgIGlmIChhdXRoLnRlbmFudElkID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhdXRoLl9hZ2VudFJlY2FwdGNoYUNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhdXRoLl90ZW5hbnRSZWNhcHRjaGFDb25maWdzW2F1dGgudGVuYW50SWRdID0gY29uZmlnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKGNvbmZpZy5zaXRlS2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmV0cmlldmVSZWNhcHRjaGFUb2tlbihcbiAgICAgIHNpdGVLZXk6IHN0cmluZyxcbiAgICAgIHJlc29sdmU6ICh2YWx1ZTogc3RyaW5nIHwgUHJvbWlzZUxpa2U8c3RyaW5nPikgPT4gdm9pZCxcbiAgICAgIHJlamVjdDogKHJlYXNvbj86IHVua25vd24pID0+IHZvaWRcbiAgICApOiB2b2lkIHtcbiAgICAgIGNvbnN0IGdyZWNhcHRjaGEgPSB3aW5kb3cuZ3JlY2FwdGNoYTtcbiAgICAgIGlmIChpc0VudGVycHJpc2UoZ3JlY2FwdGNoYSkpIHtcbiAgICAgICAgZ3JlY2FwdGNoYS5lbnRlcnByaXNlLnJlYWR5KCgpID0+IHtcbiAgICAgICAgICBncmVjYXB0Y2hhLmVudGVycHJpc2VcbiAgICAgICAgICAgIC5leGVjdXRlKHNpdGVLZXksIHsgYWN0aW9uIH0pXG4gICAgICAgICAgICAudGhlbih0b2tlbiA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUodG9rZW4pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUoRkFLRV9UT0tFTik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QoRXJyb3IoJ05vIHJlQ0FQVENIQSBlbnRlcnByaXNlIHNjcmlwdCBsb2FkZWQuJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHJpZXZlU2l0ZUtleSh0aGlzLmF1dGgpXG4gICAgICAgIC50aGVuKHNpdGVLZXkgPT4ge1xuICAgICAgICAgIGlmICghZm9yY2VSZWZyZXNoICYmIGlzRW50ZXJwcmlzZSh3aW5kb3cuZ3JlY2FwdGNoYSkpIHtcbiAgICAgICAgICAgIHJldHJpZXZlUmVjYXB0Y2hhVG9rZW4oc2l0ZUtleSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgIHJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3IoJ1JlY2FwdGNoYVZlcmlmaWVyIGlzIG9ubHkgc3VwcG9ydGVkIGluIGJyb3dzZXInKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqc0hlbHBlcnNcbiAgICAgICAgICAgICAgLl9sb2FkSlMoUkVDQVBUQ0hBX0VOVEVSUFJJU0VfVVJMICsgc2l0ZUtleSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHJpZXZlUmVjYXB0Y2hhVG9rZW4oc2l0ZUtleSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluamVjdFJlY2FwdGNoYUZpZWxkczxUPihcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICByZXF1ZXN0OiBULFxuICBhY3Rpb246IFJlY2FwdGNoYUFjdGlvbk5hbWUsXG4gIGNhcHRjaGFSZXNwID0gZmFsc2Vcbik6IFByb21pc2U8VD4ge1xuICBjb25zdCB2ZXJpZmllciA9IG5ldyBSZWNhcHRjaGFFbnRlcnByaXNlVmVyaWZpZXIoYXV0aCk7XG4gIGxldCBjYXB0Y2hhUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgY2FwdGNoYVJlc3BvbnNlID0gYXdhaXQgdmVyaWZpZXIudmVyaWZ5KGFjdGlvbik7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2FwdGNoYVJlc3BvbnNlID0gYXdhaXQgdmVyaWZpZXIudmVyaWZ5KGFjdGlvbiwgdHJ1ZSk7XG4gIH1cbiAgY29uc3QgbmV3UmVxdWVzdCA9IHsgLi4ucmVxdWVzdCB9O1xuICBpZiAoIWNhcHRjaGFSZXNwKSB7XG4gICAgT2JqZWN0LmFzc2lnbihuZXdSZXF1ZXN0LCB7IGNhcHRjaGFSZXNwb25zZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBPYmplY3QuYXNzaWduKG5ld1JlcXVlc3QsIHsgJ2NhcHRjaGFSZXNwJzogY2FwdGNoYVJlc3BvbnNlIH0pO1xuICB9XG4gIE9iamVjdC5hc3NpZ24obmV3UmVxdWVzdCwgeyAnY2xpZW50VHlwZSc6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCIH0pO1xuICBPYmplY3QuYXNzaWduKG5ld1JlcXVlc3QsIHtcbiAgICAncmVjYXB0Y2hhVmVyc2lvbic6IFJlY2FwdGNoYVZlcnNpb24uRU5URVJQUklTRVxuICB9KTtcbiAgcmV0dXJuIG5ld1JlcXVlc3Q7XG59XG5cbnR5cGUgQWN0aW9uTWV0aG9kPFRSZXF1ZXN0LCBUUmVzcG9uc2U+ID0gKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBUUmVxdWVzdFxuKSA9PiBQcm9taXNlPFRSZXNwb25zZT47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVSZWNhcHRjaGFGbG93PFRSZXF1ZXN0LCBUUmVzcG9uc2U+KFxuICBhdXRoSW5zdGFuY2U6IEF1dGhJbnRlcm5hbCxcbiAgcmVxdWVzdDogVFJlcXVlc3QsXG4gIGFjdGlvbk5hbWU6IFJlY2FwdGNoYUFjdGlvbk5hbWUsXG4gIGFjdGlvbk1ldGhvZDogQWN0aW9uTWV0aG9kPFRSZXF1ZXN0LCBUUmVzcG9uc2U+XG4pOiBQcm9taXNlPFRSZXNwb25zZT4ge1xuICBpZiAoXG4gICAgYXV0aEluc3RhbmNlXG4gICAgICAuX2dldFJlY2FwdGNoYUNvbmZpZygpXG4gICAgICA/LmlzUHJvdmlkZXJFbmFibGVkKFJlY2FwdGNoYVByb3ZpZGVyLkVNQUlMX1BBU1NXT1JEX1BST1ZJREVSKVxuICApIHtcbiAgICBjb25zdCByZXF1ZXN0V2l0aFJlY2FwdGNoYSA9IGF3YWl0IGluamVjdFJlY2FwdGNoYUZpZWxkcyhcbiAgICAgIGF1dGhJbnN0YW5jZSxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBhY3Rpb25OYW1lLFxuICAgICAgYWN0aW9uTmFtZSA9PT0gUmVjYXB0Y2hhQWN0aW9uTmFtZS5HRVRfT09CX0NPREVcbiAgICApO1xuICAgIHJldHVybiBhY3Rpb25NZXRob2QoYXV0aEluc3RhbmNlLCByZXF1ZXN0V2l0aFJlY2FwdGNoYSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFjdGlvbk1ldGhvZChhdXRoSW5zdGFuY2UsIHJlcXVlc3QpLmNhdGNoKGFzeW5jIGVycm9yID0+IHtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSBgYXV0aC8ke0F1dGhFcnJvckNvZGUuTUlTU0lOR19SRUNBUFRDSEFfVE9LRU59YCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgJHthY3Rpb25OYW1lfSBpcyBwcm90ZWN0ZWQgYnkgcmVDQVBUQ0hBIEVudGVycHJpc2UgZm9yIHRoaXMgcHJvamVjdC4gQXV0b21hdGljYWxseSB0cmlnZ2VyaW5nIHRoZSByZUNBUFRDSEEgZmxvdyBhbmQgcmVzdGFydGluZyB0aGUgZmxvdy5gXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RXaXRoUmVjYXB0Y2hhID0gYXdhaXQgaW5qZWN0UmVjYXB0Y2hhRmllbGRzKFxuICAgICAgICAgIGF1dGhJbnN0YW5jZSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIGFjdGlvbk5hbWUsXG4gICAgICAgICAgYWN0aW9uTmFtZSA9PT0gUmVjYXB0Y2hhQWN0aW9uTmFtZS5HRVRfT09CX0NPREVcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGFjdGlvbk1ldGhvZChhdXRoSW5zdGFuY2UsIHJlcXVlc3RXaXRoUmVjYXB0Y2hhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9pbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnKGF1dGg6IEF1dGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZ2V0UmVjYXB0Y2hhQ29uZmlnKGF1dGhJbnRlcm5hbCwge1xuICAgIGNsaWVudFR5cGU6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCLFxuICAgIHZlcnNpb246IFJlY2FwdGNoYVZlcnNpb24uRU5URVJQUklTRVxuICB9KTtcblxuICBjb25zdCBjb25maWcgPSBuZXcgUmVjYXB0Y2hhQ29uZmlnKHJlc3BvbnNlKTtcbiAgaWYgKGF1dGhJbnRlcm5hbC50ZW5hbnRJZCA9PSBudWxsKSB7XG4gICAgYXV0aEludGVybmFsLl9hZ2VudFJlY2FwdGNoYUNvbmZpZyA9IGNvbmZpZztcbiAgfSBlbHNlIHtcbiAgICBhdXRoSW50ZXJuYWwuX3RlbmFudFJlY2FwdGNoYUNvbmZpZ3NbYXV0aEludGVybmFsLnRlbmFudElkXSA9IGNvbmZpZztcbiAgfVxuXG4gIGlmIChjb25maWcuaXNQcm92aWRlckVuYWJsZWQoUmVjYXB0Y2hhUHJvdmlkZXIuRU1BSUxfUEFTU1dPUkRfUFJPVklERVIpKSB7XG4gICAgY29uc3QgdmVyaWZpZXIgPSBuZXcgUmVjYXB0Y2hhRW50ZXJwcmlzZVZlcmlmaWVyKGF1dGhJbnRlcm5hbCk7XG4gICAgdm9pZCB2ZXJpZmllci52ZXJpZnkoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF9nZXRQcm92aWRlciwgRmlyZWJhc2VBcHAgfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IGRlZXBFcXVhbCB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IEF1dGgsIERlcGVuZGVuY2llcyB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgUGVyc2lzdGVuY2VJbnRlcm5hbCB9IGZyb20gJy4uL3BlcnNpc3RlbmNlJztcbmltcG9ydCB7IF9mYWlsIH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2dldEluc3RhbmNlIH0gZnJvbSAnLi4vdXRpbC9pbnN0YW50aWF0b3InO1xuaW1wb3J0IHsgQXV0aEltcGwgfSBmcm9tICcuL2F1dGhfaW1wbCc7XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgYW4ge0BsaW5rIEF1dGh9IGluc3RhbmNlIHdpdGggZmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlclxuICoge0BsaW5rIERlcGVuZGVuY2llc30uXG4gKlxuICogQHJlbWFya3NcbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBtb3JlIGNvbnRyb2wgb3ZlciB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHRoYW5cbiAqIHtAbGluayBnZXRBdXRofS4gYGdldEF1dGhgIHVzZXMgcGxhdGZvcm0tc3BlY2lmaWMgZGVmYXVsdHMgdG8gc3VwcGx5XG4gKiB0aGUge0BsaW5rIERlcGVuZGVuY2llc30uIEluIGdlbmVyYWwsIGBnZXRBdXRoYCBpcyB0aGUgZWFzaWVzdCB3YXkgdG9cbiAqIGluaXRpYWxpemUgQXV0aCBhbmQgd29ya3MgZm9yIG1vc3QgdXNlIGNhc2VzLiBVc2UgYGluaXRpYWxpemVBdXRoYCBpZiB5b3VcbiAqIG5lZWQgY29udHJvbCBvdmVyIHdoaWNoIHBlcnNpc3RlbmNlIGxheWVyIGlzIHVzZWQsIG9yIHRvIG1pbmltaXplIGJ1bmRsZVxuICogc2l6ZSBpZiB5b3UncmUgbm90IHVzaW5nIGVpdGhlciBgc2lnbkluV2l0aFBvcHVwYCBvciBgc2lnbkluV2l0aFJlZGlyZWN0YC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWYgeW91ciBhcHAgb25seSB1c2VzIGFub255bW91cyBhY2NvdW50cyBhbmQgeW91IG9ubHkgd2FudFxuICogYWNjb3VudHMgc2F2ZWQgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24sIGluaXRpYWxpemUgYEF1dGhgIHdpdGg6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGF1dGggPSBpbml0aWFsaXplQXV0aChhcHAsIHtcbiAqICAgcGVyc2lzdGVuY2U6IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UsXG4gKiAgIHBvcHVwUmVkaXJlY3RSZXNvbHZlcjogdW5kZWZpbmVkLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQXV0aChhcHA6IEZpcmViYXNlQXBwLCBkZXBzPzogRGVwZW5kZW5jaWVzKTogQXV0aCB7XG4gIGNvbnN0IHByb3ZpZGVyID0gX2dldFByb3ZpZGVyKGFwcCwgJ2F1dGgnKTtcblxuICBpZiAocHJvdmlkZXIuaXNJbml0aWFsaXplZCgpKSB7XG4gICAgY29uc3QgYXV0aCA9IHByb3ZpZGVyLmdldEltbWVkaWF0ZSgpIGFzIEF1dGhJbXBsO1xuICAgIGNvbnN0IGluaXRpYWxPcHRpb25zID0gcHJvdmlkZXIuZ2V0T3B0aW9ucygpIGFzIERlcGVuZGVuY2llcztcbiAgICBpZiAoZGVlcEVxdWFsKGluaXRpYWxPcHRpb25zLCBkZXBzID8/IHt9KSkge1xuICAgICAgcmV0dXJuIGF1dGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9mYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuQUxSRUFEWV9JTklUSUFMSVpFRCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXV0aCA9IHByb3ZpZGVyLmluaXRpYWxpemUoeyBvcHRpb25zOiBkZXBzIH0pIGFzIEF1dGhJbXBsO1xuXG4gIHJldHVybiBhdXRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2luaXRpYWxpemVBdXRoSW5zdGFuY2UoXG4gIGF1dGg6IEF1dGhJbXBsLFxuICBkZXBzPzogRGVwZW5kZW5jaWVzXG4pOiB2b2lkIHtcbiAgY29uc3QgcGVyc2lzdGVuY2UgPSBkZXBzPy5wZXJzaXN0ZW5jZSB8fCBbXTtcbiAgY29uc3QgaGllcmFyY2h5ID0gKFxuICAgIEFycmF5LmlzQXJyYXkocGVyc2lzdGVuY2UpID8gcGVyc2lzdGVuY2UgOiBbcGVyc2lzdGVuY2VdXG4gICkubWFwPFBlcnNpc3RlbmNlSW50ZXJuYWw+KF9nZXRJbnN0YW5jZSk7XG4gIGlmIChkZXBzPy5lcnJvck1hcCkge1xuICAgIGF1dGguX3VwZGF0ZUVycm9yTWFwKGRlcHMuZXJyb3JNYXApO1xuICB9XG5cbiAgLy8gVGhpcyBwcm9taXNlIGlzIGludGVuZGVkIHRvIGZsb2F0OyBhdXRoIGluaXRpYWxpemF0aW9uIGhhcHBlbnMgaW4gdGhlXG4gIC8vIGJhY2tncm91bmQsIG1lYW53aGlsZSB0aGUgYXV0aCBvYmplY3QgbWF5IGJlIHVzZWQgYnkgdGhlIGFwcC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICBhdXRoLl9pbml0aWFsaXplV2l0aFBlcnNpc3RlbmNlKGhpZXJhcmNoeSwgZGVwcz8ucG9wdXBSZWRpcmVjdFJlc29sdmVyKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuL2F1dGhfaW1wbCc7XG5cbi8qKlxuICogQ2hhbmdlcyB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIEZpcmViYXNlIEF1dGggRW11bGF0b3IsIGluc3RlYWQgb2YgcHJvZHVjdGlvblxuICogRmlyZWJhc2UgQXV0aCBzZXJ2aWNlcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBtdXN0IGJlIGNhbGxlZCBzeW5jaHJvbm91c2x5IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgZmlyc3QgY2FsbCB0b1xuICoge0BsaW5rIGluaXRpYWxpemVBdXRofS4gIERvIG5vdCB1c2Ugd2l0aCBwcm9kdWN0aW9uIGNyZWRlbnRpYWxzIGFzIGVtdWxhdG9yXG4gKiB0cmFmZmljIGlzIG5vdCBlbmNyeXB0ZWQuXG4gKlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25uZWN0QXV0aEVtdWxhdG9yKGF1dGgsICdodHRwOi8vMTI3LjAuMC4xOjkwOTknLCB7IGRpc2FibGVXYXJuaW5nczogdHJ1ZSB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIGF0IHdoaWNoIHRoZSBlbXVsYXRvciBpcyBydW5uaW5nIChlZywgJ2h0dHA6Ly9sb2NhbGhvc3Q6OTA5OScpLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbC4gYG9wdGlvbnMuZGlzYWJsZVdhcm5pbmdzYCBkZWZhdWx0cyB0byBgZmFsc2VgLiBTZXQgaXQgdG9cbiAqIGB0cnVlYCB0byBkaXNhYmxlIHRoZSB3YXJuaW5nIGJhbm5lciBhdHRhY2hlZCB0byB0aGUgRE9NLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbm5lY3RBdXRoRW11bGF0b3IoXG4gIGF1dGg6IEF1dGgsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBkaXNhYmxlV2FybmluZ3M6IGJvb2xlYW4gfVxuKTogdm9pZCB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgX2Fzc2VydChcbiAgICBhdXRoSW50ZXJuYWwuX2NhbkluaXRFbXVsYXRvcixcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgQXV0aEVycm9yQ29kZS5FTVVMQVRPUl9DT05GSUdfRkFJTEVEXG4gICk7XG5cbiAgX2Fzc2VydChcbiAgICAvXmh0dHBzPzpcXC9cXC8vLnRlc3QodXJsKSxcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgQXV0aEVycm9yQ29kZS5JTlZBTElEX0VNVUxBVE9SX1NDSEVNRVxuICApO1xuXG4gIGNvbnN0IGRpc2FibGVXYXJuaW5ncyA9ICEhb3B0aW9ucz8uZGlzYWJsZVdhcm5pbmdzO1xuXG4gIGNvbnN0IHByb3RvY29sID0gZXh0cmFjdFByb3RvY29sKHVybCk7XG4gIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gZXh0cmFjdEhvc3RBbmRQb3J0KHVybCk7XG4gIGNvbnN0IHBvcnRTdHIgPSBwb3J0ID09PSBudWxsID8gJycgOiBgOiR7cG9ydH1gO1xuXG4gIC8vIEFsd2F5cyByZXBsYWNlIHBhdGggd2l0aCBcIi9cIiAoZXZlbiBpZiBpbnB1dCB1cmwgaGFkIG5vIHBhdGggYXQgYWxsLCBvciBoYWQgYSBkaWZmZXJlbnQgb25lKS5cbiAgYXV0aEludGVybmFsLmNvbmZpZy5lbXVsYXRvciA9IHsgdXJsOiBgJHtwcm90b2NvbH0vLyR7aG9zdH0ke3BvcnRTdHJ9L2AgfTtcbiAgYXV0aEludGVybmFsLnNldHRpbmdzLmFwcFZlcmlmaWNhdGlvbkRpc2FibGVkRm9yVGVzdGluZyA9IHRydWU7XG4gIGF1dGhJbnRlcm5hbC5lbXVsYXRvckNvbmZpZyA9IE9iamVjdC5mcmVlemUoe1xuICAgIGhvc3QsXG4gICAgcG9ydCxcbiAgICBwcm90b2NvbDogcHJvdG9jb2wucmVwbGFjZSgnOicsICcnKSxcbiAgICBvcHRpb25zOiBPYmplY3QuZnJlZXplKHsgZGlzYWJsZVdhcm5pbmdzIH0pXG4gIH0pO1xuXG4gIGlmICghZGlzYWJsZVdhcm5pbmdzKSB7XG4gICAgZW1pdEVtdWxhdG9yV2FybmluZygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQcm90b2NvbCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHByb3RvY29sRW5kID0gdXJsLmluZGV4T2YoJzonKTtcbiAgcmV0dXJuIHByb3RvY29sRW5kIDwgMCA/ICcnIDogdXJsLnN1YnN0cigwLCBwcm90b2NvbEVuZCArIDEpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SG9zdEFuZFBvcnQodXJsOiBzdHJpbmcpOiB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyIHwgbnVsbDtcbn0ge1xuICBjb25zdCBwcm90b2NvbCA9IGV4dHJhY3RQcm90b2NvbCh1cmwpO1xuICBjb25zdCBhdXRob3JpdHkgPSAvKFxcL1xcLyk/KFtePyMvXSspLy5leGVjKHVybC5zdWJzdHIocHJvdG9jb2wubGVuZ3RoKSk7IC8vIEJldHdlZW4gLy8gYW5kIC8sID8gb3IgIy5cbiAgaWYgKCFhdXRob3JpdHkpIHtcbiAgICByZXR1cm4geyBob3N0OiAnJywgcG9ydDogbnVsbCB9O1xuICB9XG4gIGNvbnN0IGhvc3RBbmRQb3J0ID0gYXV0aG9yaXR5WzJdLnNwbGl0KCdAJykucG9wKCkgfHwgJyc7IC8vIFN0cmlwIG91dCBcInVzZXJuYW1lOnBhc3N3b3JkQFwiLlxuICBjb25zdCBicmFja2V0ZWRJUHY2ID0gL14oXFxbW15cXF1dK1xcXSkoOnwkKS8uZXhlYyhob3N0QW5kUG9ydCk7XG4gIGlmIChicmFja2V0ZWRJUHY2KSB7XG4gICAgY29uc3QgaG9zdCA9IGJyYWNrZXRlZElQdjZbMV07XG4gICAgcmV0dXJuIHsgaG9zdCwgcG9ydDogcGFyc2VQb3J0KGhvc3RBbmRQb3J0LnN1YnN0cihob3N0Lmxlbmd0aCArIDEpKSB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtob3N0LCBwb3J0XSA9IGhvc3RBbmRQb3J0LnNwbGl0KCc6Jyk7XG4gICAgcmV0dXJuIHsgaG9zdCwgcG9ydDogcGFyc2VQb3J0KHBvcnQpIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VQb3J0KHBvcnRTdHI6IHN0cmluZyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoIXBvcnRTdHIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBwb3J0ID0gTnVtYmVyKHBvcnRTdHIpO1xuICBpZiAoaXNOYU4ocG9ydCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcG9ydDtcbn1cblxuZnVuY3Rpb24gZW1pdEVtdWxhdG9yV2FybmluZygpOiB2b2lkIHtcbiAgZnVuY3Rpb24gYXR0YWNoQmFubmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO1xuICAgIGNvbnN0IHN0eSA9IGVsLnN0eWxlO1xuICAgIGVsLmlubmVyVGV4dCA9XG4gICAgICAnUnVubmluZyBpbiBlbXVsYXRvciBtb2RlLiBEbyBub3QgdXNlIHdpdGggcHJvZHVjdGlvbiBjcmVkZW50aWFscy4nO1xuICAgIHN0eS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgc3R5LndpZHRoID0gJzEwMCUnO1xuICAgIHN0eS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZmZmZic7XG4gICAgc3R5LmJvcmRlciA9ICcuMWVtIHNvbGlkICMwMDAwMDAnO1xuICAgIHN0eS5jb2xvciA9ICcjYjUwMDAwJztcbiAgICBzdHkuYm90dG9tID0gJzBweCc7XG4gICAgc3R5LmxlZnQgPSAnMHB4JztcbiAgICBzdHkubWFyZ2luID0gJzBweCc7XG4gICAgc3R5LnpJbmRleCA9ICcxMDAwMCc7XG4gICAgc3R5LnRleHRBbGlnbiA9ICdjZW50ZXInO1xuICAgIGVsLmNsYXNzTGlzdC5hZGQoJ2ZpcmViYXNlLWVtdWxhdG9yLXdhcm5pbmcnKTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNvbnNvbGUuaW5mbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICdXQVJOSU5HOiBZb3UgYXJlIHVzaW5nIHRoZSBBdXRoIEVtdWxhdG9yLCcgK1xuICAgICAgICAnIHdoaWNoIGlzIGludGVuZGVkIGZvciBsb2NhbCB0ZXN0aW5nIG9ubHkuICBEbyBub3QgdXNlIHdpdGgnICtcbiAgICAgICAgJyBwcm9kdWN0aW9uIGNyZWRlbnRpYWxzLidcbiAgICApO1xuICB9XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBhdHRhY2hCYW5uZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhdHRhY2hCYW5uZXIoKTtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IGRlYnVnRmFpbCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuLyoqXG4gKiBJbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIHRoZSBjcmVkZW50aWFscyByZXR1cm5lZCBieSBhbiB7QGxpbmsgQXV0aFByb3ZpZGVyfS5cbiAqXG4gKiBAcmVtYXJrc1xuICogSW1wbGVtZW50YXRpb25zIHNwZWNpZnkgdGhlIGRldGFpbHMgYWJvdXQgZWFjaCBhdXRoIHByb3ZpZGVyJ3MgY3JlZGVudGlhbCByZXF1aXJlbWVudHMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQXV0aENyZWRlbnRpYWwge1xuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICAvKipcbiAgICAgKiBUaGUgYXV0aGVudGljYXRpb24gcHJvdmlkZXIgSUQgZm9yIHRoZSBjcmVkZW50aWFsLlxuICAgICAqXG4gICAgICogQHJlbWFya3NcbiAgICAgKiBGb3IgZXhhbXBsZSwgJ2ZhY2Vib29rLmNvbScsIG9yICdnb29nbGUuY29tJy5cbiAgICAgKi9cbiAgICByZWFkb25seSBwcm92aWRlcklkOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIGF1dGhlbnRpY2F0aW9uIHNpZ24gaW4gbWV0aG9kIGZvciB0aGUgY3JlZGVudGlhbC5cbiAgICAgKlxuICAgICAqIEByZW1hcmtzXG4gICAgICogRm9yIGV4YW1wbGUsIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JELCBvclxuICAgICAqIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX0xJTksuIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHNpZ24taW4gbWV0aG9kXG4gICAgICogaWRlbnRpZmllciBhcyByZXR1cm5lZCBpbiB7QGxpbmsgZmV0Y2hTaWduSW5NZXRob2RzRm9yRW1haWx9LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNpZ25Jbk1ldGhvZDogc3RyaW5nXG4gICkge31cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyBhIEpTT04tc2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgKi9cbiAgdG9KU09OKCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRJZFRva2VuUmVzcG9uc2UoX2F1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8UGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xpbmtUb0lkVG9rZW4oXG4gICAgX2F1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBfaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGRlYnVnRmFpbCgnbm90IGltcGxlbWVudGVkJyk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKF9hdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBkZWJ1Z0ZhaWwoJ25vdCBpbXBsZW1lbnRlZCcpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQWN0aW9uQ29kZU9wZXJhdGlvbiwgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtQXBpUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBNZmFFbnJvbGxtZW50IH0gZnJvbSAnLi9tZmEnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc2V0UGFzc3dvcmRSZXF1ZXN0IHtcbiAgb29iQ29kZTogc3RyaW5nO1xuICBuZXdQYXNzd29yZD86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzZXRQYXNzd29yZFJlc3BvbnNlIHtcbiAgZW1haWw6IHN0cmluZztcbiAgbmV3RW1haWw/OiBzdHJpbmc7XG4gIHJlcXVlc3RUeXBlPzogQWN0aW9uQ29kZU9wZXJhdGlvbjtcbiAgbWZhSW5mbz86IE1mYUVucm9sbG1lbnQ7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNldFBhc3N3b3JkKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBSZXNldFBhc3N3b3JkUmVxdWVzdFxuKTogUHJvbWlzZTxSZXNldFBhc3N3b3JkUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxSZXNldFBhc3N3b3JkUmVxdWVzdCwgUmVzZXRQYXNzd29yZFJlc3BvbnNlPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5SRVNFVF9QQVNTV09SRCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRW1haWxQYXNzd29yZFJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHJldHVyblNlY3VyZVRva2VuPzogYm9vbGVhbjtcbiAgZW1haWw/OiBzdHJpbmc7XG4gIHBhc3N3b3JkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZUVtYWlsUGFzc3dvcmRSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7fVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRW1haWxQYXNzd29yZChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogVXBkYXRlRW1haWxQYXNzd29yZFJlcXVlc3Rcbik6IFByb21pc2U8VXBkYXRlRW1haWxQYXNzd29yZFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgVXBkYXRlRW1haWxQYXNzd29yZFJlcXVlc3QsXG4gICAgVXBkYXRlRW1haWxQYXNzd29yZFJlc3BvbnNlXG4gID4oYXV0aCwgSHR0cE1ldGhvZC5QT1NULCBFbmRwb2ludC5TRVRfQUNDT1VOVF9JTkZPLCByZXF1ZXN0KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBseUFjdGlvbkNvZGVSZXF1ZXN0IHtcbiAgb29iQ29kZTogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBseUFjdGlvbkNvZGVSZXNwb25zZSB7fVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXBwbHlBY3Rpb25Db2RlKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBBcHBseUFjdGlvbkNvZGVSZXF1ZXN0XG4pOiBQcm9taXNlPEFwcGx5QWN0aW9uQ29kZVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8QXBwbHlBY3Rpb25Db2RlUmVxdWVzdCwgQXBwbHlBY3Rpb25Db2RlUmVzcG9uc2U+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNFVF9BQ0NPVU5UX0lORk8sXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQWN0aW9uQ29kZU9wZXJhdGlvbiwgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBSZWNhcHRjaGFDbGllbnRUeXBlLFxuICBSZWNhcHRjaGFWZXJzaW9uLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtQXBpUmVxdWVzdCxcbiAgX3BlcmZvcm1TaWduSW5SZXF1ZXN0XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW4sIElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoUGFzc3dvcmRSZXF1ZXN0IHtcbiAgcmV0dXJuU2VjdXJlVG9rZW4/OiBib29sZWFuO1xuICBlbWFpbDogc3RyaW5nO1xuICBwYXNzd29yZDogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgY2FwdGNoYVJlc3BvbnNlPzogc3RyaW5nO1xuICBjbGllbnRUeXBlPzogUmVjYXB0Y2hhQ2xpZW50VHlwZTtcbiAgcmVjYXB0Y2hhVmVyc2lvbj86IFJlY2FwdGNoYVZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aFBhc3N3b3JkUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICBlbWFpbDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aFBhc3N3b3JkKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoUGFzc3dvcmRSZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25JbldpdGhQYXNzd29yZFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgU2lnbkluV2l0aFBhc3N3b3JkUmVxdWVzdCxcbiAgICBTaWduSW5XaXRoUGFzc3dvcmRSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fSU5fV0lUSF9QQVNTV09SRCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRPb2JDb2RlUmVxdWVzdCB7XG4gIGVtYWlsPzogc3RyaW5nOyAvLyBFdmVyeXRoaW5nIGV4Y2VwdCBWRVJJRllfQU5EX0NIQU5HRV9FTUFJTFxuICBjb250aW51ZVVybD86IHN0cmluZztcbiAgaU9TQnVuZGxlSWQ/OiBzdHJpbmc7XG4gIGlvc0FwcFN0b3JlSWQ/OiBzdHJpbmc7XG4gIGFuZHJvaWRQYWNrYWdlTmFtZT86IHN0cmluZztcbiAgYW5kcm9pZEluc3RhbGxBcHA/OiBib29sZWFuO1xuICBhbmRyb2lkTWluaW11bVZlcnNpb25Db2RlPzogc3RyaW5nO1xuICBjYW5IYW5kbGVDb2RlSW5BcHA/OiBib29sZWFuO1xuICBkeW5hbWljTGlua0RvbWFpbj86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIHRhcmdldFByb2plY3RpZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlFbWFpbFJlcXVlc3QgZXh0ZW5kcyBHZXRPb2JDb2RlUmVxdWVzdCB7XG4gIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9FTUFJTDtcbiAgaWRUb2tlbjogSWRUb2tlbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZFJlc2V0UmVxdWVzdCBleHRlbmRzIEdldE9vYkNvZGVSZXF1ZXN0IHtcbiAgcmVxdWVzdFR5cGU6IEFjdGlvbkNvZGVPcGVyYXRpb24uUEFTU1dPUkRfUkVTRVQ7XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGNhcHRjaGFSZXNwPzogc3RyaW5nO1xuICBjbGllbnRUeXBlPzogUmVjYXB0Y2hhQ2xpZW50VHlwZTtcbiAgcmVjYXB0Y2hhVmVyc2lvbj86IFJlY2FwdGNoYVZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxTaWduSW5SZXF1ZXN0IGV4dGVuZHMgR2V0T29iQ29kZVJlcXVlc3Qge1xuICByZXF1ZXN0VHlwZTogQWN0aW9uQ29kZU9wZXJhdGlvbi5FTUFJTF9TSUdOSU47XG4gIGVtYWlsOiBzdHJpbmc7XG4gIGNhcHRjaGFSZXNwPzogc3RyaW5nO1xuICBjbGllbnRUeXBlPzogUmVjYXB0Y2hhQ2xpZW50VHlwZTtcbiAgcmVjYXB0Y2hhVmVyc2lvbj86IFJlY2FwdGNoYVZlcnNpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5QW5kQ2hhbmdlRW1haWxSZXF1ZXN0IGV4dGVuZHMgR2V0T29iQ29kZVJlcXVlc3Qge1xuICByZXF1ZXN0VHlwZTogQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfQU5EX0NIQU5HRV9FTUFJTDtcbiAgaWRUb2tlbjogSWRUb2tlbjtcbiAgbmV3RW1haWw6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEdldE9vYkNvZGVSZXNwb25zZSB7XG4gIGVtYWlsOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyaWZ5RW1haWxSZXNwb25zZSBleHRlbmRzIEdldE9vYkNvZGVSZXNwb25zZSB7fVxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZFJlc2V0UmVzcG9uc2UgZXh0ZW5kcyBHZXRPb2JDb2RlUmVzcG9uc2Uge31cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWxTaWduSW5SZXNwb25zZSBleHRlbmRzIEdldE9vYkNvZGVSZXNwb25zZSB7fVxuZXhwb3J0IGludGVyZmFjZSBWZXJpZnlBbmRDaGFuZ2VFbWFpbFJlc3BvbnNlIGV4dGVuZHMgR2V0T29iQ29kZVJlcXVlc3Qge31cblxuYXN5bmMgZnVuY3Rpb24gc2VuZE9vYkNvZGUoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldE9vYkNvZGVSZXF1ZXN0XG4pOiBQcm9taXNlPEdldE9vYkNvZGVSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PEdldE9vYkNvZGVSZXF1ZXN0LCBHZXRPb2JDb2RlUmVzcG9uc2U+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNFTkRfT09CX0NPREUsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kRW1haWxWZXJpZmljYXRpb24oXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFZlcmlmeUVtYWlsUmVxdWVzdFxuKTogUHJvbWlzZTxWZXJpZnlFbWFpbFJlc3BvbnNlPiB7XG4gIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNlbmRQYXNzd29yZFJlc2V0RW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFBhc3N3b3JkUmVzZXRSZXF1ZXN0XG4pOiBQcm9taXNlPFBhc3N3b3JkUmVzZXRSZXNwb25zZT4ge1xuICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU2lnbkluTGlua1RvRW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEVtYWlsU2lnbkluUmVxdWVzdFxuKTogUHJvbWlzZTxFbWFpbFNpZ25JblJlc3BvbnNlPiB7XG4gIHJldHVybiBzZW5kT29iQ29kZShhdXRoLCByZXF1ZXN0KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFuZENoYW5nZUVtYWlsKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBWZXJpZnlBbmRDaGFuZ2VFbWFpbFJlcXVlc3Rcbik6IFByb21pc2U8VmVyaWZ5QW5kQ2hhbmdlRW1haWxSZXNwb25zZT4ge1xuICByZXR1cm4gc2VuZE9vYkNvZGUoYXV0aCwgcmVxdWVzdCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgX3BlcmZvcm1TaWduSW5SZXF1ZXN0LFxuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhFbWFpbExpbmtSZXF1ZXN0IHtcbiAgZW1haWw6IHN0cmluZztcbiAgb29iQ29kZTogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoRW1haWxMaW5rUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICBlbWFpbDogc3RyaW5nO1xuICBpc05ld1VzZXI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoRW1haWxMaW5rKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoRW1haWxMaW5rUmVxdWVzdFxuKTogUHJvbWlzZTxTaWduSW5XaXRoRW1haWxMaW5rUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxcbiAgICBTaWduSW5XaXRoRW1haWxMaW5rUmVxdWVzdCxcbiAgICBTaWduSW5XaXRoRW1haWxMaW5rUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TSUdOX0lOX1dJVEhfRU1BSUxfTElOSyxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZ1JlcXVlc3RcbiAgZXh0ZW5kcyBTaWduSW5XaXRoRW1haWxMaW5rUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZ1JlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aEVtYWlsTGlua1Jlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgU2lnbkluV2l0aEVtYWlsTGlua0ZvckxpbmtpbmdSZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhFbWFpbExpbmtSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fSU5fV0lUSF9FTUFJTF9MSU5LLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuaW1wb3J0IHsgdXBkYXRlRW1haWxQYXNzd29yZCB9IGZyb20gJy4uLy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7XG4gIHNpZ25JbldpdGhQYXNzd29yZCxcbiAgU2lnbkluV2l0aFBhc3N3b3JkUmVxdWVzdFxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7XG4gIHNpZ25JbldpdGhFbWFpbExpbmssXG4gIHNpZ25JbldpdGhFbWFpbExpbmtGb3JMaW5raW5nXG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9saW5rJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfZmFpbCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9hdXRoX2NyZWRlbnRpYWwnO1xuaW1wb3J0IHsgaGFuZGxlUmVjYXB0Y2hhRmxvdyB9IGZyb20gJy4uLy4uL3BsYXRmb3JtX2Jyb3dzZXIvcmVjYXB0Y2hhL3JlY2FwdGNoYV9lbnRlcnByaXNlX3ZlcmlmaWVyJztcbmltcG9ydCB7IFJlY2FwdGNoYUFjdGlvbk5hbWUsIFJlY2FwdGNoYUNsaWVudFR5cGUgfSBmcm9tICcuLi8uLi9hcGknO1xuLyoqXG4gKiBJbnRlcmZhY2UgdGhhdCByZXByZXNlbnRzIHRoZSBjcmVkZW50aWFscyByZXR1cm5lZCBieSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IGZvclxuICoge0BsaW5rIFByb3ZpZGVySWR9LlBBU1NXT1JEXG4gKlxuICogQHJlbWFya3NcbiAqIENvdmVycyBib3RoIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX1BBU1NXT1JEIGFuZFxuICoge0BsaW5rIFNpZ25Jbk1ldGhvZH0uRU1BSUxfTElOSy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBFbWFpbEF1dGhDcmVkZW50aWFsIGV4dGVuZHMgQXV0aENyZWRlbnRpYWwge1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHJlYWRvbmx5IF9lbWFpbDogc3RyaW5nLFxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICByZWFkb25seSBfcGFzc3dvcmQ6IHN0cmluZyxcbiAgICBzaWduSW5NZXRob2Q6IFNpZ25Jbk1ldGhvZCxcbiAgICAvKiogQGludGVybmFsICovXG4gICAgcmVhZG9ubHkgX3RlbmFudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICApIHtcbiAgICBzdXBlcihQcm92aWRlcklkLlBBU1NXT1JELCBzaWduSW5NZXRob2QpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21FbWFpbEFuZFBhc3N3b3JkKFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgcGFzc3dvcmQ6IHN0cmluZ1xuICApOiBFbWFpbEF1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gbmV3IEVtYWlsQXV0aENyZWRlbnRpYWwoXG4gICAgICBlbWFpbCxcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgU2lnbkluTWV0aG9kLkVNQUlMX1BBU1NXT1JEXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tRW1haWxBbmRDb2RlKFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgb29iQ29kZTogc3RyaW5nLFxuICAgIHRlbmFudElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICApOiBFbWFpbEF1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gbmV3IEVtYWlsQXV0aENyZWRlbnRpYWwoXG4gICAgICBlbWFpbCxcbiAgICAgIG9vYkNvZGUsXG4gICAgICBTaWduSW5NZXRob2QuRU1BSUxfTElOSyxcbiAgICAgIHRlbmFudElkXG4gICAgKTtcbiAgfVxuXG4gIC8qKiB7QGluaGVyaXRkb2MgQXV0aENyZWRlbnRpYWwudG9KU09OfSAqL1xuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgcGFzc3dvcmQ6IHRoaXMuX3Bhc3N3b3JkLFxuICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZCxcbiAgICAgIHRlbmFudElkOiB0aGlzLl90ZW5hbnRJZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byBkZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGludG8gYW4ge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uIC0gRWl0aGVyIGBvYmplY3RgIG9yIHRoZSBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LiBXaGVuIHN0cmluZyBpc1xuICAgKiBwcm92aWRlZCwgYEpTT04ucGFyc2VgIHdvdWxkIGJlIGNhbGxlZCBmaXJzdC5cbiAgICpcbiAgICogQHJldHVybnMgSWYgdGhlIEpTT04gaW5wdXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0sIG51bGwgaXMgcmV0dXJuZWQuXG4gICAqL1xuICBzdGF0aWMgZnJvbUpTT04oanNvbjogb2JqZWN0IHwgc3RyaW5nKTogRW1haWxBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGNvbnN0IG9iaiA9IHR5cGVvZiBqc29uID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoanNvbikgOiBqc29uO1xuICAgIGlmIChvYmo/LmVtYWlsICYmIG9iaj8ucGFzc3dvcmQpIHtcbiAgICAgIGlmIChvYmouc2lnbkluTWV0aG9kID09PSBTaWduSW5NZXRob2QuRU1BSUxfUEFTU1dPUkQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb21FbWFpbEFuZFBhc3N3b3JkKG9iai5lbWFpbCwgb2JqLnBhc3N3b3JkKTtcbiAgICAgIH0gZWxzZSBpZiAob2JqLnNpZ25Jbk1ldGhvZCA9PT0gU2lnbkluTWV0aG9kLkVNQUlMX0xJTkspIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zyb21FbWFpbEFuZENvZGUob2JqLmVtYWlsLCBvYmoucGFzc3dvcmQsIG9iai50ZW5hbnRJZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgc3dpdGNoICh0aGlzLnNpZ25Jbk1ldGhvZCkge1xuICAgICAgY2FzZSBTaWduSW5NZXRob2QuRU1BSUxfUEFTU1dPUkQ6XG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IFNpZ25JbldpdGhQYXNzd29yZFJlcXVlc3QgPSB7XG4gICAgICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWUsXG4gICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgICAgIHBhc3N3b3JkOiB0aGlzLl9wYXNzd29yZCxcbiAgICAgICAgICBjbGllbnRUeXBlOiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQlxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaGFuZGxlUmVjYXB0Y2hhRmxvdyhcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgUmVjYXB0Y2hhQWN0aW9uTmFtZS5TSUdOX0lOX1dJVEhfUEFTU1dPUkQsXG4gICAgICAgICAgc2lnbkluV2l0aFBhc3N3b3JkXG4gICAgICAgICk7XG4gICAgICBjYXNlIFNpZ25Jbk1ldGhvZC5FTUFJTF9MSU5LOlxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCB7XG4gICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgICAgIG9vYkNvZGU6IHRoaXMuX3Bhc3N3b3JkXG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhc3luYyBfbGlua1RvSWRUb2tlbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgc3dpdGNoICh0aGlzLnNpZ25Jbk1ldGhvZCkge1xuICAgICAgY2FzZSBTaWduSW5NZXRob2QuRU1BSUxfUEFTU1dPUkQ6XG4gICAgICAgIHJldHVybiB1cGRhdGVFbWFpbFBhc3N3b3JkKGF1dGgsIHtcbiAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlLFxuICAgICAgICAgIGVtYWlsOiB0aGlzLl9lbWFpbCxcbiAgICAgICAgICBwYXNzd29yZDogdGhpcy5fcGFzc3dvcmRcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFNpZ25Jbk1ldGhvZC5FTUFJTF9MSU5LOlxuICAgICAgICByZXR1cm4gc2lnbkluV2l0aEVtYWlsTGlua0ZvckxpbmtpbmcoYXV0aCwge1xuICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgZW1haWw6IHRoaXMuX2VtYWlsLFxuICAgICAgICAgIG9vYkNvZGU6IHRoaXMuX3Bhc3N3b3JkXG4gICAgICAgIH0pO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0UmVhdXRoZW50aWNhdGlvblJlc29sdmVyKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2dldElkVG9rZW5SZXNwb25zZShhdXRoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtU2lnbkluUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBJZFRva2VuLCBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoSWRwUmVxdWVzdCB7XG4gIHJlcXVlc3RVcmk6IHN0cmluZztcbiAgcG9zdEJvZHk/OiBzdHJpbmc7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIHJldHVyblNlY3VyZVRva2VuOiBib29sZWFuO1xuICByZXR1cm5JZHBDcmVkZW50aWFsPzogYm9vbGVhbjtcbiAgaWRUb2tlbj86IElkVG9rZW47XG4gIGF1dG9DcmVhdGU/OiBib29sZWFuO1xuICBwZW5kaW5nVG9rZW4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aElkcFJlc3BvbnNlIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlIHtcbiAgb2F1dGhBY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgb2F1dGhUb2tlblNlY3JldD86IHN0cmluZztcbiAgbm9uY2U/OiBzdHJpbmc7XG4gIG9hdXRoSWRUb2tlbj86IHN0cmluZztcbiAgcGVuZGluZ1Rva2VuPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aElkcChcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogU2lnbkluV2l0aElkcFJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aElkcFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8U2lnbkluV2l0aElkcFJlcXVlc3QsIFNpZ25JbldpdGhJZHBSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX0lEUCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBxdWVyeXN0cmluZyB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHtcbiAgc2lnbkluV2l0aElkcCxcbiAgU2lnbkluV2l0aElkcFJlcXVlc3Rcbn0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2lkcCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2ZhaWwgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4vYXV0aF9jcmVkZW50aWFsJztcblxuY29uc3QgSURQX1JFUVVFU1RfVVJJID0gJ2h0dHA6Ly9sb2NhbGhvc3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9BdXRoQ3JlZGVudGlhbFBhcmFtcyB7XG4gIC8vIE9BdXRoIDIgdXNlcyBlaXRoZXIgaWQgdG9rZW4gb3IgYWNjZXNzIHRva2VuXG4gIGlkVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZyB8IG51bGw7XG5cbiAgLy8gVGhlc2UgZmllbGRzIGFyZSB1c2VkIHdpdGggT0F1dGggMVxuICBvYXV0aFRva2VuPzogc3RyaW5nO1xuICBzZWNyZXQ/OiBzdHJpbmc7XG4gIG9hdXRoVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLy8gTm9uY2UgaXMgb25seSBzZXQgaWYgcGVuZGluZ1Rva2VuIGlzIG5vdCBwcmVzZW50XG4gIG5vbmNlPzogc3RyaW5nO1xuICBwZW5kaW5nVG9rZW4/OiBzdHJpbmc7XG5cbiAgLy8gVXRpbGl0aWVzXG4gIHByb3ZpZGVySWQ6IHN0cmluZztcbiAgc2lnbkluTWV0aG9kOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgT0F1dGggY3JlZGVudGlhbHMgcmV0dXJuZWQgYnkgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBJbXBsZW1lbnRhdGlvbnMgc3BlY2lmeSB0aGUgZGV0YWlscyBhYm91dCBlYWNoIGF1dGggcHJvdmlkZXIncyBjcmVkZW50aWFsIHJlcXVpcmVtZW50cy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBPQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIC8qKlxuICAgKiBUaGUgT0F1dGggSUQgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjcmVkZW50aWFsIGlmIGl0IGJlbG9uZ3MgdG8gYW4gT0lEQyBwcm92aWRlcixcbiAgICogc3VjaCBhcyBgZ29vZ2xlLmNvbWAuXG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgaWRUb2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBPQXV0aCBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjcmVkZW50aWFsIGlmIGl0IGJlbG9uZ3MgdG8gYW5cbiAgICoge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LCBzdWNoIGFzIGBmYWNlYm9vay5jb21gLCBgdHdpdHRlci5jb21gLCBldGMuXG4gICAqIEByZWFkb25seVxuICAgKi9cbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgT0F1dGggYWNjZXNzIHRva2VuIHNlY3JldCBhc3NvY2lhdGVkIHdpdGggdGhlIGNyZWRlbnRpYWwgaWYgaXQgYmVsb25ncyB0byBhbiBPQXV0aCAxLjBcbiAgICogcHJvdmlkZXIsIHN1Y2ggYXMgYHR3aXR0ZXIuY29tYC5cbiAgICogQHJlYWRvbmx5XG4gICAqL1xuICBzZWNyZXQ/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBub25jZT86IHN0cmluZztcbiAgcHJpdmF0ZSBwZW5kaW5nVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tUGFyYW1zKHBhcmFtczogT0F1dGhDcmVkZW50aWFsUGFyYW1zKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICBjb25zdCBjcmVkID0gbmV3IE9BdXRoQ3JlZGVudGlhbChwYXJhbXMucHJvdmlkZXJJZCwgcGFyYW1zLnNpZ25Jbk1ldGhvZCk7XG5cbiAgICBpZiAocGFyYW1zLmlkVG9rZW4gfHwgcGFyYW1zLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyBPQXV0aCAyIGFuZCBlaXRoZXIgSUQgdG9rZW4gb3IgYWNjZXNzIHRva2VuLlxuICAgICAgaWYgKHBhcmFtcy5pZFRva2VuKSB7XG4gICAgICAgIGNyZWQuaWRUb2tlbiA9IHBhcmFtcy5pZFRva2VuO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIGNyZWQuYWNjZXNzVG9rZW4gPSBwYXJhbXMuYWNjZXNzVG9rZW47XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBub25jZSBpZiBhdmFpbGFibGUgYW5kIG5vIHBlbmRpbmdUb2tlbiBpcyBwcmVzZW50LlxuICAgICAgaWYgKHBhcmFtcy5ub25jZSAmJiAhcGFyYW1zLnBlbmRpbmdUb2tlbikge1xuICAgICAgICBjcmVkLm5vbmNlID0gcGFyYW1zLm5vbmNlO1xuICAgICAgfVxuXG4gICAgICBpZiAocGFyYW1zLnBlbmRpbmdUb2tlbikge1xuICAgICAgICBjcmVkLnBlbmRpbmdUb2tlbiA9IHBhcmFtcy5wZW5kaW5nVG9rZW47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwYXJhbXMub2F1dGhUb2tlbiAmJiBwYXJhbXMub2F1dGhUb2tlblNlY3JldCkge1xuICAgICAgLy8gT0F1dGggMSBhbmQgT0F1dGggdG9rZW4gd2l0aCB0b2tlbiBzZWNyZXRcbiAgICAgIGNyZWQuYWNjZXNzVG9rZW4gPSBwYXJhbXMub2F1dGhUb2tlbjtcbiAgICAgIGNyZWQuc2VjcmV0ID0gcGFyYW1zLm9hdXRoVG9rZW5TZWNyZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9mYWlsKEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVkO1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICAqL1xuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgaWRUb2tlbjogdGhpcy5pZFRva2VuLFxuICAgICAgYWNjZXNzVG9rZW46IHRoaXMuYWNjZXNzVG9rZW4sXG4gICAgICBzZWNyZXQ6IHRoaXMuc2VjcmV0LFxuICAgICAgbm9uY2U6IHRoaXMubm9uY2UsXG4gICAgICBwZW5kaW5nVG9rZW46IHRoaXMucGVuZGluZ1Rva2VuLFxuICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkLFxuICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIG1ldGhvZCB0byBkZXNlcmlhbGl6ZSBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0IGludG8gYW5cbiAgICoge0BsaW5rICBBdXRoQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSBqc29uIC0gSW5wdXQgY2FuIGJlIGVpdGhlciBPYmplY3Qgb3IgdGhlIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuXG4gICAqIFdoZW4gc3RyaW5nIGlzIHByb3ZpZGVkLCBKU09OLnBhcnNlIHdvdWxkIGJlIGNhbGxlZCBmaXJzdC5cbiAgICpcbiAgICogQHJldHVybnMgSWYgdGhlIEpTT04gaW5wdXQgZG9lcyBub3QgcmVwcmVzZW50IGFuIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LCBudWxsIGlzIHJldHVybmVkLlxuICAgKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb246IHN0cmluZyB8IG9iamVjdCk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGNvbnN0IG9iaiA9IHR5cGVvZiBqc29uID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoanNvbikgOiBqc29uO1xuICAgIGNvbnN0IHsgcHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kLCAuLi5yZXN0IH06IE9BdXRoQ3JlZGVudGlhbFBhcmFtcyA9IG9iajtcbiAgICBpZiAoIXByb3ZpZGVySWQgfHwgIXNpZ25Jbk1ldGhvZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlZCA9IG5ldyBPQXV0aENyZWRlbnRpYWwocHJvdmlkZXJJZCwgc2lnbkluTWV0aG9kKTtcbiAgICBjcmVkLmlkVG9rZW4gPSByZXN0LmlkVG9rZW4gfHwgdW5kZWZpbmVkO1xuICAgIGNyZWQuYWNjZXNzVG9rZW4gPSByZXN0LmFjY2Vzc1Rva2VuIHx8IHVuZGVmaW5lZDtcbiAgICBjcmVkLnNlY3JldCA9IHJlc3Quc2VjcmV0O1xuICAgIGNyZWQubm9uY2UgPSByZXN0Lm5vbmNlO1xuICAgIGNyZWQucGVuZGluZ1Rva2VuID0gcmVzdC5wZW5kaW5nVG9rZW4gfHwgbnVsbDtcbiAgICByZXR1cm4gY3JlZDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldElkVG9rZW5SZXNwb25zZShhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbGlua1RvSWRUb2tlbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5pZFRva2VuID0gaWRUb2tlbjtcbiAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xuICAgIHJlcXVlc3QuYXV0b0NyZWF0ZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlcXVlc3QoKTogU2lnbkluV2l0aElkcFJlcXVlc3Qge1xuICAgIGNvbnN0IHJlcXVlc3Q6IFNpZ25JbldpdGhJZHBSZXF1ZXN0ID0ge1xuICAgICAgcmVxdWVzdFVyaTogSURQX1JFUVVFU1RfVVJJLFxuICAgICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMucGVuZGluZ1Rva2VuKSB7XG4gICAgICByZXF1ZXN0LnBlbmRpbmdUb2tlbiA9IHRoaXMucGVuZGluZ1Rva2VuO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwb3N0Qm9keTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgaWYgKHRoaXMuaWRUb2tlbikge1xuICAgICAgICBwb3N0Qm9keVsnaWRfdG9rZW4nXSA9IHRoaXMuaWRUb2tlbjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFjY2Vzc1Rva2VuKSB7XG4gICAgICAgIHBvc3RCb2R5WydhY2Nlc3NfdG9rZW4nXSA9IHRoaXMuYWNjZXNzVG9rZW47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWNyZXQpIHtcbiAgICAgICAgcG9zdEJvZHlbJ29hdXRoX3Rva2VuX3NlY3JldCddID0gdGhpcy5zZWNyZXQ7XG4gICAgICB9XG5cbiAgICAgIHBvc3RCb2R5Wydwcm92aWRlcklkJ10gPSB0aGlzLnByb3ZpZGVySWQ7XG4gICAgICBpZiAodGhpcy5ub25jZSAmJiAhdGhpcy5wZW5kaW5nVG9rZW4pIHtcbiAgICAgICAgcG9zdEJvZHlbJ25vbmNlJ10gPSB0aGlzLm5vbmNlO1xuICAgICAgfVxuXG4gICAgICByZXF1ZXN0LnBvc3RCb2R5ID0gcXVlcnlzdHJpbmcocG9zdEJvZHkpO1xuICAgIH1cblxuICAgIHJldHVybiByZXF1ZXN0O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeSxcbiAgX21ha2VUYWdnZWRFcnJvcixcbiAgX3BlcmZvcm1BcGlSZXF1ZXN0LFxuICBfcGVyZm9ybVNpZ25JblJlcXVlc3Rcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFNlcnZlckVycm9yLCBTZXJ2ZXJFcnJvck1hcCB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVxdWVzdCB7XG4gIHBob25lTnVtYmVyOiBzdHJpbmc7XG4gIHJlY2FwdGNoYVRva2VuOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGVSZXNwb25zZSB7XG4gIHNlc3Npb25JbmZvOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVxdWVzdFxuKTogUHJvbWlzZTxTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVxdWVzdCxcbiAgICBTZW5kUGhvbmVWZXJpZmljYXRpb25Db2RlUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TRU5EX1ZFUklGSUNBVElPTl9DT0RFLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Qge1xuICB0ZW1wb3JhcnlQcm9vZj86IHN0cmluZztcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG4gIHNlc3Npb25JbmZvPzogc3RyaW5nO1xuICBjb2RlPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW5rV2l0aFBob25lTnVtYmVyUmVxdWVzdFxuICBleHRlbmRzIFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2UgZXh0ZW5kcyBJZFRva2VuUmVzcG9uc2Uge1xuICB0ZW1wb3JhcnlQcm9vZj86IHN0cmluZztcbiAgcGhvbmVOdW1iZXI/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoUGhvbmVOdW1iZXIoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtU2lnbkluUmVxdWVzdDxcbiAgICBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhQaG9uZU51bWJlclJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUixcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoUGhvbmVOdW1iZXIoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IExpbmtXaXRoUGhvbmVOdW1iZXJSZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25JbldpdGhQaG9uZU51bWJlclJlc3BvbnNlPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgX3BlcmZvcm1TaWduSW5SZXF1ZXN0PFxuICAgIExpbmtXaXRoUGhvbmVOdW1iZXJSZXF1ZXN0LFxuICAgIFNpZ25JbldpdGhQaG9uZU51bWJlclJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0lHTl9JTl9XSVRIX1BIT05FX05VTUJFUixcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbiAgaWYgKHJlc3BvbnNlLnRlbXBvcmFyeVByb29mKSB7XG4gICAgdGhyb3cgX21ha2VUYWdnZWRFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLk5FRURfQ09ORklSTUFUSU9OLCByZXNwb25zZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlO1xufVxuXG5pbnRlcmZhY2UgVmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZ1JlcXVlc3RcbiAgZXh0ZW5kcyBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0IHtcbiAgb3BlcmF0aW9uOiAnUkVBVVRIJztcbn1cblxuY29uc3QgVkVSSUZZX1BIT05FX05VTUJFUl9GT1JfRVhJU1RJTkdfRVJST1JfTUFQXzogUGFydGlhbDxcbiAgU2VydmVyRXJyb3JNYXA8U2VydmVyRXJyb3I+XG4+ID0ge1xuICBbU2VydmVyRXJyb3IuVVNFUl9OT1RfRk9VTkRdOiBBdXRoRXJyb3JDb2RlLlVTRVJfREVMRVRFRFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBob25lTnVtYmVyRm9yRXhpc3RpbmcoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Rcbik6IFByb21pc2U8U2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2U+IHtcbiAgY29uc3QgYXBpUmVxdWVzdDogVmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZ1JlcXVlc3QgPSB7XG4gICAgLi4ucmVxdWVzdCxcbiAgICBvcGVyYXRpb246ICdSRUFVVEgnXG4gIH07XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgVmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZ1JlcXVlc3QsXG4gICAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5TSUdOX0lOX1dJVEhfUEhPTkVfTlVNQkVSLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCBhcGlSZXF1ZXN0KSxcbiAgICBWRVJJRllfUEhPTkVfTlVNQkVSX0ZPUl9FWElTVElOR19FUlJPUl9NQVBfXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUHJvdmlkZXJJZCwgU2lnbkluTWV0aG9kIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG5pbXBvcnQgeyBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQge1xuICBsaW5rV2l0aFBob25lTnVtYmVyLFxuICBzaWduSW5XaXRoUGhvbmVOdW1iZXIsXG4gIFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3QsXG4gIHZlcmlmeVBob25lTnVtYmVyRm9yRXhpc3Rpbmdcbn0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3Ntcyc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9hdXRoX2NyZWRlbnRpYWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBob25lQXV0aENyZWRlbnRpYWxQYXJhbWV0ZXJzIHtcbiAgdmVyaWZpY2F0aW9uSWQ/OiBzdHJpbmc7XG4gIHZlcmlmaWNhdGlvbkNvZGU/OiBzdHJpbmc7XG4gIHBob25lTnVtYmVyPzogc3RyaW5nO1xuICB0ZW1wb3JhcnlQcm9vZj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjcmVkZW50aWFscyByZXR1cm5lZCBieSB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXJ9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIFBob25lQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwYXJhbXM6IFBob25lQXV0aENyZWRlbnRpYWxQYXJhbWV0ZXJzKSB7XG4gICAgc3VwZXIoUHJvdmlkZXJJZC5QSE9ORSwgU2lnbkluTWV0aG9kLlBIT05FKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tVmVyaWZpY2F0aW9uKFxuICAgIHZlcmlmaWNhdGlvbklkOiBzdHJpbmcsXG4gICAgdmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nXG4gICk6IFBob25lQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBuZXcgUGhvbmVBdXRoQ3JlZGVudGlhbCh7IHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21Ub2tlblJlc3BvbnNlKFxuICAgIHBob25lTnVtYmVyOiBzdHJpbmcsXG4gICAgdGVtcG9yYXJ5UHJvb2Y6IHN0cmluZ1xuICApOiBQaG9uZUF1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gbmV3IFBob25lQXV0aENyZWRlbnRpYWwoeyBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCB0aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xpbmtUb0lkVG9rZW4oXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGlkVG9rZW46IHN0cmluZ1xuICApOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBsaW5rV2l0aFBob25lTnVtYmVyKGF1dGgsIHtcbiAgICAgIGlkVG9rZW4sXG4gICAgICAuLi50aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRSZWF1dGhlbnRpY2F0aW9uUmVzb2x2ZXIoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdmVyaWZ5UGhvbmVOdW1iZXJGb3JFeGlzdGluZyhhdXRoLCB0aGlzLl9tYWtlVmVyaWZpY2F0aW9uUmVxdWVzdCgpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21ha2VWZXJpZmljYXRpb25SZXF1ZXN0KCk6IFNpZ25JbldpdGhQaG9uZU51bWJlclJlcXVlc3Qge1xuICAgIGNvbnN0IHsgdGVtcG9yYXJ5UHJvb2YsIHBob25lTnVtYmVyLCB2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSB9ID1cbiAgICAgIHRoaXMucGFyYW1zO1xuICAgIGlmICh0ZW1wb3JhcnlQcm9vZiAmJiBwaG9uZU51bWJlcikge1xuICAgICAgcmV0dXJuIHsgdGVtcG9yYXJ5UHJvb2YsIHBob25lTnVtYmVyIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlc3Npb25JbmZvOiB2ZXJpZmljYXRpb25JZCxcbiAgICAgIGNvZGU6IHZlcmlmaWNhdGlvbkNvZGVcbiAgICB9O1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICovXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIGNvbnN0IG9iajogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIHByb3ZpZGVySWQ6IHRoaXMucHJvdmlkZXJJZFxuICAgIH07XG4gICAgaWYgKHRoaXMucGFyYW1zLnBob25lTnVtYmVyKSB7XG4gICAgICBvYmoucGhvbmVOdW1iZXIgPSB0aGlzLnBhcmFtcy5waG9uZU51bWJlcjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyYW1zLnRlbXBvcmFyeVByb29mKSB7XG4gICAgICBvYmoudGVtcG9yYXJ5UHJvb2YgPSB0aGlzLnBhcmFtcy50ZW1wb3JhcnlQcm9vZjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbkNvZGUpIHtcbiAgICAgIG9iai52ZXJpZmljYXRpb25Db2RlID0gdGhpcy5wYXJhbXMudmVyaWZpY2F0aW9uQ29kZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucGFyYW1zLnZlcmlmaWNhdGlvbklkKSB7XG4gICAgICBvYmoudmVyaWZpY2F0aW9uSWQgPSB0aGlzLnBhcmFtcy52ZXJpZmljYXRpb25JZDtcbiAgICB9XG5cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLyoqIEdlbmVyYXRlcyBhIHBob25lIGNyZWRlbnRpYWwgYmFzZWQgb24gYSBwbGFpbiBvYmplY3Qgb3IgYSBKU09OIHN0cmluZy4gKi9cbiAgc3RhdGljIGZyb21KU09OKGpzb246IG9iamVjdCB8IHN0cmluZyk6IFBob25lQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAodHlwZW9mIGpzb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBqc29uID0gSlNPTi5wYXJzZShqc29uKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlLCBwaG9uZU51bWJlciwgdGVtcG9yYXJ5UHJvb2YgfSA9XG4gICAgICBqc29uIGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gICAgaWYgKFxuICAgICAgIXZlcmlmaWNhdGlvbkNvZGUgJiZcbiAgICAgICF2ZXJpZmljYXRpb25JZCAmJlxuICAgICAgIXBob25lTnVtYmVyICYmXG4gICAgICAhdGVtcG9yYXJ5UHJvb2ZcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGhvbmVBdXRoQ3JlZGVudGlhbCh7XG4gICAgICB2ZXJpZmljYXRpb25JZCxcbiAgICAgIHZlcmlmaWNhdGlvbkNvZGUsXG4gICAgICBwaG9uZU51bWJlcixcbiAgICAgIHRlbXBvcmFyeVByb29mXG4gICAgfSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBleHRyYWN0UXVlcnlzdHJpbmcsIHF1ZXJ5c3RyaW5nRGVjb2RlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQWN0aW9uQ29kZU9wZXJhdGlvbiB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4vdXRpbC9hc3NlcnQnO1xuXG4vKipcbiAqIEVudW1zIGZvciBmaWVsZHMgaW4gVVJMIHF1ZXJ5IHN0cmluZy5cbiAqXG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5jb25zdCBlbnVtIFF1ZXJ5RmllbGQge1xuICBBUElfS0VZID0gJ2FwaUtleScsXG4gIENPREUgPSAnb29iQ29kZScsXG4gIENPTlRJTlVFX1VSTCA9ICdjb250aW51ZVVybCcsXG4gIExBTkdVQUdFX0NPREUgPSAnbGFuZ3VhZ2VDb2RlJyxcbiAgTU9ERSA9ICdtb2RlJyxcbiAgVEVOQU5UX0lEID0gJ3RlbmFudElkJ1xufVxuXG4vKipcbiAqIE1hcHMgdGhlIG1vZGUgc3RyaW5nIGluIGFjdGlvbiBjb2RlIFVSTCB0byBBY3Rpb24gQ29kZSBJbmZvIG9wZXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gbW9kZVxuICovXG5mdW5jdGlvbiBwYXJzZU1vZGUobW9kZTogc3RyaW5nIHwgbnVsbCk6IEFjdGlvbkNvZGVPcGVyYXRpb24gfCBudWxsIHtcbiAgc3dpdGNoIChtb2RlKSB7XG4gICAgY2FzZSAncmVjb3ZlckVtYWlsJzpcbiAgICAgIHJldHVybiBBY3Rpb25Db2RlT3BlcmF0aW9uLlJFQ09WRVJfRU1BSUw7XG4gICAgY2FzZSAncmVzZXRQYXNzd29yZCc6XG4gICAgICByZXR1cm4gQWN0aW9uQ29kZU9wZXJhdGlvbi5QQVNTV09SRF9SRVNFVDtcbiAgICBjYXNlICdzaWduSW4nOlxuICAgICAgcmV0dXJuIEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOO1xuICAgIGNhc2UgJ3ZlcmlmeUVtYWlsJzpcbiAgICAgIHJldHVybiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9FTUFJTDtcbiAgICBjYXNlICd2ZXJpZnlBbmRDaGFuZ2VFbWFpbCc6XG4gICAgICByZXR1cm4gQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfQU5EX0NIQU5HRV9FTUFJTDtcbiAgICBjYXNlICdyZXZlcnRTZWNvbmRGYWN0b3JBZGRpdGlvbic6XG4gICAgICByZXR1cm4gQWN0aW9uQ29kZU9wZXJhdGlvbi5SRVZFUlRfU0VDT05EX0ZBQ1RPUl9BRERJVElPTjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gcGFyc2UgRkRMIGxpbmtzXG4gKlxuICogQHBhcmFtIHVybFxuICovXG5mdW5jdGlvbiBwYXJzZURlZXBMaW5rKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGluayA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyh1cmwpKVsnbGluayddO1xuXG4gIC8vIERvdWJsZSBsaW5rIGNhc2UgKGF1dG9tYXRpYyByZWRpcmVjdCkuXG4gIGNvbnN0IGRvdWJsZURlZXBMaW5rID0gbGlua1xuICAgID8gcXVlcnlzdHJpbmdEZWNvZGUoZXh0cmFjdFF1ZXJ5c3RyaW5nKGxpbmspKVsnZGVlcF9saW5rX2lkJ11cbiAgICA6IG51bGw7XG4gIC8vIGlPUyBjdXN0b20gc2NoZW1lIGxpbmtzLlxuICBjb25zdCBpT1NEZWVwTGluayA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyh1cmwpKVtcbiAgICAnZGVlcF9saW5rX2lkJ1xuICBdO1xuICBjb25zdCBpT1NEb3VibGVEZWVwTGluayA9IGlPU0RlZXBMaW5rXG4gICAgPyBxdWVyeXN0cmluZ0RlY29kZShleHRyYWN0UXVlcnlzdHJpbmcoaU9TRGVlcExpbmspKVsnbGluayddXG4gICAgOiBudWxsO1xuICByZXR1cm4gaU9TRG91YmxlRGVlcExpbmsgfHwgaU9TRGVlcExpbmsgfHwgZG91YmxlRGVlcExpbmsgfHwgbGluayB8fCB1cmw7XG59XG5cbi8qKlxuICogQSB1dGlsaXR5IGNsYXNzIHRvIHBhcnNlIGVtYWlsIGFjdGlvbiBVUkxzIHN1Y2ggYXMgcGFzc3dvcmQgcmVzZXQsIGVtYWlsIHZlcmlmaWNhdGlvbixcbiAqIGVtYWlsIGxpbmsgc2lnbiBpbiwgZXRjLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEFjdGlvbkNvZGVVUkwge1xuICAvKipcbiAgICogVGhlIEFQSSBrZXkgb2YgdGhlIGVtYWlsIGFjdGlvbiBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpS2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIGNvZGUgb2YgdGhlIGVtYWlsIGFjdGlvbiBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZTogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGNvbnRpbnVlIFVSTCBvZiB0aGUgZW1haWwgYWN0aW9uIGxpbmsuIE51bGwgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGludWVVcmw6IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2UgY29kZSBvZiB0aGUgZW1haWwgYWN0aW9uIGxpbmsuIE51bGwgaWYgbm90IHByb3ZpZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAvKipcbiAgICogVGhlIGFjdGlvbiBwZXJmb3JtZWQgYnkgdGhlIGVtYWlsIGFjdGlvbiBsaW5rLiBJdCByZXR1cm5zIGZyb20gb25lIG9mIHRoZSB0eXBlcyBmcm9tXG4gICAqIHtAbGluayBBY3Rpb25Db2RlSW5mb31cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHRlbmFudCBJRCBvZiB0aGUgZW1haWwgYWN0aW9uIGxpbmsuIE51bGwgaWYgdGhlIGVtYWlsIGFjdGlvbiBpcyBmcm9tIHRoZSBwYXJlbnQgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHRlbmFudElkOiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gYWN0aW9uTGluayAtIFRoZSBsaW5rIGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgVVJMLlxuICAgKiBAcmV0dXJucyBUaGUge0BsaW5rIEFjdGlvbkNvZGVVUkx9IG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgbGluayBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFjdGlvbkxpbms6IHN0cmluZykge1xuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHF1ZXJ5c3RyaW5nRGVjb2RlKGV4dHJhY3RRdWVyeXN0cmluZyhhY3Rpb25MaW5rKSk7XG4gICAgY29uc3QgYXBpS2V5ID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuQVBJX0tFWV0gPz8gbnVsbDtcbiAgICBjb25zdCBjb2RlID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuQ09ERV0gPz8gbnVsbDtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBwYXJzZU1vZGUoc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuTU9ERV0gPz8gbnVsbCk7XG4gICAgLy8gVmFsaWRhdGUgQVBJIGtleSwgY29kZSBhbmQgbW9kZS5cbiAgICBfYXNzZXJ0KGFwaUtleSAmJiBjb2RlICYmIG9wZXJhdGlvbiwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgdGhpcy5hcGlLZXkgPSBhcGlLZXk7XG4gICAgdGhpcy5vcGVyYXRpb24gPSBvcGVyYXRpb247XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICB0aGlzLmNvbnRpbnVlVXJsID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuQ09OVElOVUVfVVJMXSA/PyBudWxsO1xuICAgIHRoaXMubGFuZ3VhZ2VDb2RlID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuTEFOR1VBR0VfQ09ERV0gPz8gbnVsbDtcbiAgICB0aGlzLnRlbmFudElkID0gc2VhcmNoUGFyYW1zW1F1ZXJ5RmllbGQuVEVOQU5UX0lEXSA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgZW1haWwgYWN0aW9uIGxpbmsgc3RyaW5nIGFuZCByZXR1cm5zIGFuIHtAbGluayBBY3Rpb25Db2RlVVJMfSBpZiB0aGUgbGluayBpcyB2YWxpZCxcbiAgICogb3RoZXJ3aXNlIHJldHVybnMgbnVsbC5cbiAgICpcbiAgICogQHBhcmFtIGxpbmsgIC0gVGhlIGVtYWlsIGFjdGlvbiBsaW5rIHN0cmluZy5cbiAgICogQHJldHVybnMgVGhlIHtAbGluayBBY3Rpb25Db2RlVVJMfSBvYmplY3QsIG9yIG51bGwgaWYgdGhlIGxpbmsgaXMgaW52YWxpZC5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc3RhdGljIHBhcnNlTGluayhsaW5rOiBzdHJpbmcpOiBBY3Rpb25Db2RlVVJMIHwgbnVsbCB7XG4gICAgY29uc3QgYWN0aW9uTGluayA9IHBhcnNlRGVlcExpbmsobGluayk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgQWN0aW9uQ29kZVVSTChhY3Rpb25MaW5rKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlcyB0aGUgZW1haWwgYWN0aW9uIGxpbmsgc3RyaW5nIGFuZCByZXR1cm5zIGFuIHtAbGluayBBY3Rpb25Db2RlVVJMfSBpZlxuICogdGhlIGxpbmsgaXMgdmFsaWQsIG90aGVyd2lzZSByZXR1cm5zIG51bGwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBY3Rpb25Db2RlVVJMKGxpbms6IHN0cmluZyk6IEFjdGlvbkNvZGVVUkwgfCBudWxsIHtcbiAgcmV0dXJuIEFjdGlvbkNvZGVVUkwucGFyc2VMaW5rKGxpbmspO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcbmltcG9ydCB7IEF1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IEFjdGlvbkNvZGVVUkwgfSBmcm9tICcuLi9hY3Rpb25fY29kZV91cmwnO1xuaW1wb3J0IHsgRW1haWxBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL2VtYWlsJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyB7QGxpbmsgRW1haWxBdXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgRW1haWxBdXRoUHJvdmlkZXIgaW1wbGVtZW50cyBBdXRoUHJvdmlkZXIge1xuICAvKipcbiAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEFTU1dPUkQsIGV2ZW4gZm9yIGVtYWlsIGxpbmsuXG4gICAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUFJPVklERVJfSUQ6ICdwYXNzd29yZCcgPSBQcm92aWRlcklkLlBBU1NXT1JEO1xuICAvKipcbiAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRC5cbiAgICovXG4gIHN0YXRpYyByZWFkb25seSBFTUFJTF9QQVNTV09SRF9TSUdOX0lOX01FVEhPRDogJ3Bhc3N3b3JkJyA9XG4gICAgU2lnbkluTWV0aG9kLkVNQUlMX1BBU1NXT1JEO1xuICAvKipcbiAgICogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9MSU5LLlxuICAgKi9cbiAgc3RhdGljIHJlYWRvbmx5IEVNQUlMX0xJTktfU0lHTl9JTl9NRVRIT0Q6ICdlbWFpbExpbmsnID1cbiAgICBTaWduSW5NZXRob2QuRU1BSUxfTElOSztcbiAgLyoqXG4gICAqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LlBBU1NXT1JELCBldmVuIGZvciBlbWFpbCBsaW5rLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdmlkZXJJZCA9IEVtYWlsQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lEO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0gdXNpbmcgYW4gZW1haWwgYW5kIHBhc3N3b3JkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gRW1haWxBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChlbWFpbCwgcGFzc3dvcmQpO1xuICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGgsIGF1dGhDcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLCBlbWFpbCwgcGFzc3dvcmQpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGVtYWlsIC0gRW1haWwgYWRkcmVzcy5cbiAgICogQHBhcmFtIHBhc3N3b3JkIC0gVXNlciBhY2NvdW50IHBhc3N3b3JkLlxuICAgKiBAcmV0dXJucyBUaGUgYXV0aCBwcm92aWRlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWwoZW1haWw6IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZyk6IEVtYWlsQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBFbWFpbEF1dGhDcmVkZW50aWFsLl9mcm9tRW1haWxBbmRQYXNzd29yZChlbWFpbCwgcGFzc3dvcmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSB1c2luZyBhbiBlbWFpbCBhbmQgYW4gZW1haWwgbGluayBhZnRlciBhIHNpZ24gaW4gd2l0aFxuICAgKiBlbWFpbCBsaW5rIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiBjb25zdCBhdXRoQ3JlZGVudGlhbCA9IEVtYWlsQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxXaXRoTGluayhhdXRoLCBlbWFpbCwgZW1haWxMaW5rKTtcbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCBlbWFpbCk7XG4gICAqIC8vIE9idGFpbiBlbWFpbExpbmsgZnJvbSB1c2VyLlxuICAgKiBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IHNpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWwsIGVtYWlsTGluayk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgdXNlZCB0byB2ZXJpZnkgdGhlIGxpbmsuXG4gICAqIEBwYXJhbSBlbWFpbCAtIEVtYWlsIGFkZHJlc3MuXG4gICAqIEBwYXJhbSBlbWFpbExpbmsgLSBTaWduLWluIGVtYWlsIGxpbmsuXG4gICAqIEByZXR1cm5zIC0gVGhlIGF1dGggcHJvdmlkZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsV2l0aExpbmsoXG4gICAgZW1haWw6IHN0cmluZyxcbiAgICBlbWFpbExpbms6IHN0cmluZ1xuICApOiBFbWFpbEF1dGhDcmVkZW50aWFsIHtcbiAgICBjb25zdCBhY3Rpb25Db2RlVXJsID0gQWN0aW9uQ29kZVVSTC5wYXJzZUxpbmsoZW1haWxMaW5rKTtcbiAgICBfYXNzZXJ0KGFjdGlvbkNvZGVVcmwsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuXG4gICAgcmV0dXJuIEVtYWlsQXV0aENyZWRlbnRpYWwuX2Zyb21FbWFpbEFuZENvZGUoXG4gICAgICBlbWFpbCxcbiAgICAgIGFjdGlvbkNvZGVVcmwuY29kZSxcbiAgICAgIGFjdGlvbkNvZGVVcmwudGVuYW50SWRcbiAgICApO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuLyoqXG4gKiBNYXAgb2YgT0F1dGggQ3VzdG9tIFBhcmFtZXRlcnMuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBDdXN0b21QYXJhbWV0ZXJzID0gUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIEZlZGVyYXRlZCBwcm92aWRlcnMgKE9BdXRoIChpbmNsdWRpbmcgT0lEQyksIFNBTUwpLlxuICpcbiAqIFRoaXMgY2xhc3MgaXMgbm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIgaW1wbGVtZW50cyBBdXRoUHJvdmlkZXIge1xuICAvKiogQGludGVybmFsICovXG4gIGRlZmF1bHRMYW5ndWFnZUNvZGU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgY3VzdG9tUGFyYW1ldGVyczogQ3VzdG9tUGFyYW1ldGVycyA9IHt9O1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgZ2VuZXJpYyBPQXV0aCBwcm92aWRlcnMuXG4gICAqXG4gICAqIEBwYXJhbSBwcm92aWRlcklkIC0gUHJvdmlkZXIgZm9yIHdoaWNoIGNyZWRlbnRpYWxzIHNob3VsZCBiZSBnZW5lcmF0ZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBwcm92aWRlcklkOiBzdHJpbmcpIHt9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbGFuZ3VhZ2UgZ29kZS5cbiAgICpcbiAgICogQHBhcmFtIGxhbmd1YWdlQ29kZSAtIGxhbmd1YWdlIGNvZGVcbiAgICovXG4gIHNldERlZmF1bHRMYW5ndWFnZShsYW5ndWFnZUNvZGU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmRlZmF1bHRMYW5ndWFnZUNvZGUgPSBsYW5ndWFnZUNvZGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgT0F1dGggY3VzdG9tIHBhcmFtZXRlcnMgdG8gcGFzcyBpbiBhbiBPQXV0aCByZXF1ZXN0IGZvciBwb3B1cCBhbmQgcmVkaXJlY3Qgc2lnbi1pblxuICAgKiBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiBGb3IgYSBkZXRhaWxlZCBsaXN0LCBjaGVjayB0aGUgcmVzZXJ2ZWQgcmVxdWlyZWQgT0F1dGggMi4wIHBhcmFtZXRlcnMgc3VjaCBhcyBgY2xpZW50X2lkYCxcbiAgICogYHJlZGlyZWN0X3VyaWAsIGBzY29wZWAsIGByZXNwb25zZV90eXBlYCwgYW5kIGBzdGF0ZWAgYXJlIG5vdCBhbGxvd2VkIGFuZCB3aWxsIGJlIGlnbm9yZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjdXN0b21PQXV0aFBhcmFtZXRlcnMgLSBUaGUgY3VzdG9tIE9BdXRoIHBhcmFtZXRlcnMgdG8gcGFzcyBpbiB0aGUgT0F1dGggcmVxdWVzdC5cbiAgICovXG4gIHNldEN1c3RvbVBhcmFtZXRlcnMoY3VzdG9tT0F1dGhQYXJhbWV0ZXJzOiBDdXN0b21QYXJhbWV0ZXJzKTogQXV0aFByb3ZpZGVyIHtcbiAgICB0aGlzLmN1c3RvbVBhcmFtZXRlcnMgPSBjdXN0b21PQXV0aFBhcmFtZXRlcnM7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgbGlzdCBvZiB7QGxpbmsgQ3VzdG9tUGFyYW1ldGVyc30uXG4gICAqL1xuICBnZXRDdXN0b21QYXJhbWV0ZXJzKCk6IEN1c3RvbVBhcmFtZXRlcnMge1xuICAgIHJldHVybiB0aGlzLmN1c3RvbVBhcmFtZXRlcnM7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoUHJvdmlkZXIsIFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5pbXBvcnQgeyBPQXV0aENyZWRlbnRpYWwsIE9BdXRoQ3JlZGVudGlhbFBhcmFtcyB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL29hdXRoJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFNpZ25JbldpdGhJZHBSZXNwb25zZSB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsJztcbmltcG9ydCB7IEZlZGVyYXRlZEF1dGhQcm92aWRlciB9IGZyb20gJy4vZmVkZXJhdGVkJztcblxuLyoqXG4gKiBEZWZpbmVzIHRoZSBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQHJlbWFya3NcbiAqIEZvciBJRCB0b2tlbnMgd2l0aCBub25jZSBjbGFpbSwgdGhlIHJhdyBub25jZSBoYXMgdG8gYWxzbyBiZSBwcm92aWRlZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT0F1dGhDcmVkZW50aWFsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgT0F1dGggSUQgdG9rZW4gdXNlZCB0byBpbml0aWFsaXplIHRoZSB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfS5cbiAgICovXG4gIGlkVG9rZW4/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgT0F1dGggYWNjZXNzIHRva2VuIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0uXG4gICAqL1xuICBhY2Nlc3NUb2tlbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSByYXcgbm9uY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBJRCB0b2tlbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogSXQgaXMgcmVxdWlyZWQgd2hlbiBhbiBJRCB0b2tlbiB3aXRoIGEgbm9uY2UgZmllbGQgaXMgcHJvdmlkZWQuIFRoZSBTSEEtMjU2IGhhc2ggb2YgdGhlXG4gICAqIHJhdyBub25jZSBtdXN0IG1hdGNoIHRoZSBub25jZSBmaWVsZCBpbiB0aGUgSUQgdG9rZW4uXG4gICAqL1xuICByYXdOb25jZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21tb24gY29kZSB0byBhbGwgT0F1dGggcHJvdmlkZXJzLiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlXG4gKiB7QGxpbmsgT0F1dGhQcm92aWRlcn0gc28gdGhhdCBjaGlsZCBwcm92aWRlcnMgKGxpa2VcbiAqIHtAbGluayBHb29nbGVBdXRoUHJvdmlkZXJ9KSBkb24ndCBpbmhlcml0IHRoZSBgY3JlZGVudGlhbGAgaW5zdGFuY2UgbWV0aG9kLlxuICogSW5zdGVhZCwgdGhleSByZWx5IG9uIGEgc3RhdGljIGBjcmVkZW50aWFsYCBtZXRob2QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlT0F1dGhQcm92aWRlclxuICBleHRlbmRzIEZlZGVyYXRlZEF1dGhQcm92aWRlclxuICBpbXBsZW1lbnRzIEF1dGhQcm92aWRlclxue1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgc2NvcGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gT0F1dGggc2NvcGUgdG8gdGhlIGNyZWRlbnRpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFByb3ZpZGVyIE9BdXRoIHNjb3BlIHRvIGFkZC5cbiAgICovXG4gIGFkZFNjb3BlKHNjb3BlOiBzdHJpbmcpOiBBdXRoUHJvdmlkZXIge1xuICAgIC8vIElmIG5vdCBhbHJlYWR5IGFkZGVkLCBhZGQgc2NvcGUgdG8gbGlzdC5cbiAgICBpZiAoIXRoaXMuc2NvcGVzLmluY2x1ZGVzKHNjb3BlKSkge1xuICAgICAgdGhpcy5zY29wZXMucHVzaChzY29wZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBjdXJyZW50IGxpc3Qgb2YgT0F1dGggc2NvcGVzLlxuICAgKi9cbiAgZ2V0U2NvcGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuc2NvcGVzXTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGdlbmVyaWMge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IE9BdXRoUHJvdmlkZXIoJ2dvb2dsZS5jb20nKTtcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgnZW1haWwnKTtcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcbiAqXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcbiAqIGlmIChyZXN1bHQpIHtcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIE9BdXRoIEFjY2VzcyBUb2tlbiBmb3IgdGhlIHByb3ZpZGVyLlxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IE9BdXRoUHJvdmlkZXIoJ2dvb2dsZS5jb20nKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgnZW1haWwnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XG4gKlxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIE9BdXRoIEFjY2VzcyBUb2tlbiBmb3IgdGhlIHByb3ZpZGVyLlxuICogY29uc3QgY3JlZGVudGlhbCA9IHByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KGF1dGgsIHJlc3VsdCk7XG4gKiBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiBgYGBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIE9BdXRoUHJvdmlkZXIgZXh0ZW5kcyBCYXNlT0F1dGhQcm92aWRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSBKU09OIHN0cmluZyBvciBhIHBsYWluIG9iamVjdC5cbiAgICogQHBhcmFtIGpzb24gLSBBIHBsYWluIG9iamVjdCBvciBhIEpTT04gc3RyaW5nXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21KU09OKGpzb246IG9iamVjdCB8IHN0cmluZyk6IE9BdXRoQ3JlZGVudGlhbCB7XG4gICAgY29uc3Qgb2JqID0gdHlwZW9mIGpzb24gPT09ICdzdHJpbmcnID8gSlNPTi5wYXJzZShqc29uKSA6IGpzb247XG4gICAgX2Fzc2VydChcbiAgICAgICdwcm92aWRlcklkJyBpbiBvYmogJiYgJ3NpZ25Jbk1ldGhvZCcgaW4gb2JqLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICAgICk7XG4gICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyhvYmopO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEgZ2VuZXJpYyBPQXV0aCBwcm92aWRlcidzIGFjY2VzcyB0b2tlbiBvciBJRCB0b2tlbi5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhlIHJhdyBub25jZSBpcyByZXF1aXJlZCB3aGVuIGFuIElEIHRva2VuIHdpdGggYSBub25jZSBmaWVsZCBpcyBwcm92aWRlZC4gVGhlIFNIQS0yNTYgaGFzaCBvZlxuICAgKiB0aGUgcmF3IG5vbmNlIG11c3QgbWF0Y2ggdGhlIG5vbmNlIGZpZWxkIGluIHRoZSBJRCB0b2tlbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiAvLyBgZ29vZ2xlVXNlcmAgZnJvbSB0aGUgb25zdWNjZXNzIEdvb2dsZSBTaWduIEluIGNhbGxiYWNrLlxuICAgKiAvLyBJbml0aWFsaXplIGEgZ2VuZXJhdGUgT0F1dGggcHJvdmlkZXIgd2l0aCBhIGBnb29nbGUuY29tYCBwcm92aWRlcklkLlxuICAgKiBjb25zdCBwcm92aWRlciA9IG5ldyBPQXV0aFByb3ZpZGVyKCdnb29nbGUuY29tJyk7XG4gICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsKHtcbiAgICogICBpZFRva2VuOiBnb29nbGVVc2VyLmdldEF1dGhSZXNwb25zZSgpLmlkX3Rva2VuLFxuICAgKiB9KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gRWl0aGVyIHRoZSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIHRoZSBJRCB0b2tlbiwgYWNjZXNzIHRva2VuIGFuZCByYXcgbm9uY2VcbiAgICogb3IgdGhlIElEIHRva2VuIHN0cmluZy5cbiAgICovXG4gIGNyZWRlbnRpYWwocGFyYW1zOiBPQXV0aENyZWRlbnRpYWxPcHRpb25zKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gdGhpcy5fY3JlZGVudGlhbCh7IC4uLnBhcmFtcywgbm9uY2U6IHBhcmFtcy5yYXdOb25jZSB9KTtcbiAgfVxuXG4gIC8qKiBBbiBpbnRlcm5hbCBjcmVkZW50aWFsIG1ldGhvZCB0aGF0IGFjY2VwdHMgbW9yZSBwZXJtaXNzaXZlIG9wdGlvbnMgKi9cbiAgcHJpdmF0ZSBfY3JlZGVudGlhbChcbiAgICBwYXJhbXM6IE9taXQ8T0F1dGhDcmVkZW50aWFsUGFyYW1zLCAnc2lnbkluTWV0aG9kJyB8ICdwcm92aWRlcklkJz5cbiAgKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICBfYXNzZXJ0KHBhcmFtcy5pZFRva2VuIHx8IHBhcmFtcy5hY2Nlc3NUb2tlbiwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG4gICAgLy8gRm9yIE9BdXRoQ3JlZGVudGlhbCwgc2lnbiBpbiBtZXRob2QgaXMgc2FtZSBhcyBwcm92aWRlcklkLlxuICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgcHJvdmlkZXJJZDogdGhpcy5wcm92aWRlcklkLFxuICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnByb3ZpZGVySWRcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQoXG4gICAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4gICk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBPQXV0aFByb3ZpZGVyLm9hdXRoQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcbiAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIE9BdXRoUHJvdmlkZXIub2F1dGhDcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBvYXV0aENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHtcbiAgICBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZVxuICB9OiBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgb2F1dGhJZFRva2VuLFxuICAgICAgb2F1dGhBY2Nlc3NUb2tlbixcbiAgICAgIG9hdXRoVG9rZW5TZWNyZXQsXG4gICAgICBwZW5kaW5nVG9rZW4sXG4gICAgICBub25jZSxcbiAgICAgIHByb3ZpZGVySWRcbiAgICB9ID0gdG9rZW5SZXNwb25zZSBhcyBTaWduSW5XaXRoSWRwUmVzcG9uc2U7XG4gICAgaWYgKFxuICAgICAgIW9hdXRoQWNjZXNzVG9rZW4gJiZcbiAgICAgICFvYXV0aFRva2VuU2VjcmV0ICYmXG4gICAgICAhb2F1dGhJZFRva2VuICYmXG4gICAgICAhcGVuZGluZ1Rva2VuXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoIXByb3ZpZGVySWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gbmV3IE9BdXRoUHJvdmlkZXIocHJvdmlkZXJJZCkuX2NyZWRlbnRpYWwoe1xuICAgICAgICBpZFRva2VuOiBvYXV0aElkVG9rZW4sXG4gICAgICAgIGFjY2Vzc1Rva2VuOiBvYXV0aEFjY2Vzc1Rva2VuLFxuICAgICAgICBub25jZSxcbiAgICAgICAgcGVuZGluZ1Rva2VuXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE9BdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL29hdXRoJztcbmltcG9ydCB7IEJhc2VPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9vYXV0aCc7XG5pbXBvcnQgeyBQcm92aWRlcklkLCBTaWduSW5NZXRob2QgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZm9yIHtAbGluayBQcm92aWRlcklkfS5GQUNFQk9PSy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiBpZiAocmVzdWx0KSB7XG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBGYWNlYm9vayBBY2Nlc3MgVG9rZW4uXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCd1c2VyX2JpcnRoZGF5Jyk7XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoUG9wdXAoYXV0aCwgcHJvdmlkZXIpO1xuICpcbiAqIC8vIFRoZSBzaWduZWQtaW4gdXNlciBpbmZvLlxuICogY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogLy8gVGhpcyBnaXZlcyB5b3UgYSBGYWNlYm9vayBBY2Nlc3MgVG9rZW4uXG4gKiBjb25zdCBjcmVkZW50aWFsID0gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEZhY2Vib29rQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5GQUNFQk9PSy4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IEZBQ0VCT09LX1NJR05fSU5fTUVUSE9EOiAnZmFjZWJvb2suY29tJyA9XG4gICAgU2lnbkluTWV0aG9kLkZBQ0VCT09LO1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uRkFDRUJPT0suICovXG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogJ2ZhY2Vib29rLmNvbScgPSBQcm92aWRlcklkLkZBQ0VCT09LO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuRkFDRUJPT0spO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBGYWNlYm9vay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiAvLyBgZXZlbnRgIGZyb20gdGhlIEZhY2Vib29rIGF1dGguYXV0aFJlc3BvbnNlQ2hhbmdlIGNhbGxiYWNrLlxuICAgKiBjb25zdCBjcmVkZW50aWFsID0gRmFjZWJvb2tBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChldmVudC5hdXRoUmVzcG9uc2UuYWNjZXNzVG9rZW4pO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEZhY2Vib29rIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsKGFjY2Vzc1Rva2VuOiBzdHJpbmcpOiBPQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xuICAgICAgcHJvdmlkZXJJZDogRmFjZWJvb2tBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQsXG4gICAgICBzaWduSW5NZXRob2Q6IEZhY2Vib29rQXV0aFByb3ZpZGVyLkZBQ0VCT09LX1NJR05fSU5fTUVUSE9ELFxuICAgICAgYWNjZXNzVG9rZW5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBVc2VyQ3JlZGVudGlhbH0uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQoXG4gICAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4gICk6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIHVzZXJDcmVkZW50aWFsIGFzIFVzZXJDcmVkZW50aWFsSW50ZXJuYWxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXG4gICAqIHRocm93biBkdXJpbmcgYSBzaWduLWluLCBsaW5rLCBvciByZWF1dGhlbnRpY2F0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcjogRmlyZWJhc2VFcnJvcik6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBGYWNlYm9va0F1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7XG4gICAgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2VcbiAgfTogVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UgfHwgISgnb2F1dGhBY2Nlc3NUb2tlbicgaW4gdG9rZW5SZXNwb25zZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEZhY2Vib29rQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IFNpZ25JbldpdGhJZHBSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9pZHAnO1xuaW1wb3J0IHsgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBPQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi9jcmVkZW50aWFscy9vYXV0aCc7XG5pbXBvcnQgeyBCYXNlT0F1dGhQcm92aWRlciB9IGZyb20gJy4vb2F1dGgnO1xuaW1wb3J0IHsgUHJvdmlkZXJJZCwgU2lnbkluTWV0aG9kIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGFuIGFuIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZvciB7QGxpbmsgUHJvdmlkZXJJZH0uR09PR0xFLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBHb29nbGVBdXRoUHJvdmlkZXIoKTtcbiAqIC8vIFN0YXJ0IGEgc2lnbiBpbiBwcm9jZXNzIGZvciBhbiB1bmF1dGhlbnRpY2F0ZWQgdXNlci5cbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgnZW1haWwnKTtcbiAqIGF3YWl0IHNpZ25JbldpdGhSZWRpcmVjdChhdXRoLCBwcm92aWRlcik7XG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcbiAqXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcbiAqIGlmIChyZXN1bHQpIHtcbiAqICAgLy8gVGhpcyBpcyB0aGUgc2lnbmVkLWluIHVzZXJcbiAqICAgY29uc3QgdXNlciA9IHJlc3VsdC51c2VyO1xuICogICAvLyBUaGlzIGdpdmVzIHlvdSBhIEdvb2dsZSBBY2Nlc3MgVG9rZW4uXG4gKiAgIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEdvb2dsZUF1dGhQcm92aWRlcigpO1xuICogcHJvdmlkZXIuYWRkU2NvcGUoJ3Byb2ZpbGUnKTtcbiAqIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR29vZ2xlIEFjY2VzcyBUb2tlbi5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIGBgYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNsYXNzIEdvb2dsZUF1dGhQcm92aWRlciBleHRlbmRzIEJhc2VPQXV0aFByb3ZpZGVyIHtcbiAgLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFNpZ25Jbk1ldGhvZH0uR09PR0xFLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgR09PR0xFX1NJR05fSU5fTUVUSE9EOiAnZ29vZ2xlLmNvbScgPSBTaWduSW5NZXRob2QuR09PR0xFO1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uR09PR0xFLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUFJPVklERVJfSUQ6ICdnb29nbGUuY29tJyA9IFByb3ZpZGVySWQuR09PR0xFO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuR09PR0xFKTtcbiAgICB0aGlzLmFkZFNjb3BlKCdwcm9maWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIEdvb2dsZS4gQXQgbGVhc3Qgb25lIG9mIElEIHRva2VuIGFuZCBhY2Nlc3MgdG9rZW4gaXMgcmVxdWlyZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogLy8gXFxgZ29vZ2xlVXNlclxcYCBmcm9tIHRoZSBvbnN1Y2Nlc3MgR29vZ2xlIFNpZ24gSW4gY2FsbGJhY2suXG4gICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbChnb29nbGVVc2VyLmdldEF1dGhSZXNwb25zZSgpLmlkX3Rva2VuKTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoY3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gaWRUb2tlbiAtIEdvb2dsZSBJRCB0b2tlbi5cbiAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIC0gR29vZ2xlIGFjY2VzcyB0b2tlbi5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsKFxuICAgIGlkVG9rZW4/OiBzdHJpbmcgfCBudWxsLFxuICAgIGFjY2Vzc1Rva2VuPzogc3RyaW5nIHwgbnVsbFxuICApOiBPQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBPQXV0aENyZWRlbnRpYWwuX2Zyb21QYXJhbXMoe1xuICAgICAgcHJvdmlkZXJJZDogR29vZ2xlQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lELFxuICAgICAgc2lnbkluTWV0aG9kOiBHb29nbGVBdXRoUHJvdmlkZXIuR09PR0xFX1NJR05fSU5fTUVUSE9ELFxuICAgICAgaWRUb2tlbixcbiAgICAgIGFjY2Vzc1Rva2VuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KFxuICAgIHVzZXJDcmVkZW50aWFsOiBVc2VyQ3JlZGVudGlhbFxuICApOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gR29vZ2xlQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIEF1dGhFcnJvcn0gd2hpY2ggd2FzXG4gICAqIHRocm93biBkdXJpbmcgYSBzaWduLWluLCBsaW5rLCBvciByZWF1dGhlbnRpY2F0ZSBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21FcnJvcihlcnJvcjogRmlyZWJhc2VFcnJvcik6IE9BdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIHJldHVybiBHb29nbGVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICAoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkgYXMgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2VcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3Qoe1xuICAgIF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlXG4gIH06IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgaWYgKCF0b2tlblJlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB7IG9hdXRoSWRUb2tlbiwgb2F1dGhBY2Nlc3NUb2tlbiB9ID1cbiAgICAgIHRva2VuUmVzcG9uc2UgYXMgU2lnbkluV2l0aElkcFJlc3BvbnNlO1xuICAgIGlmICghb2F1dGhJZFRva2VuICYmICFvYXV0aEFjY2Vzc1Rva2VuKSB7XG4gICAgICAvLyBUaGlzIGNvdWxkIGJlIGFuIG9hdXRoIDEgY3JlZGVudGlhbCBvciBhIHBob25lIGNyZWRlbnRpYWxcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gR29vZ2xlQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwob2F1dGhJZFRva2VuLCBvYXV0aEFjY2Vzc1Rva2VuKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEZpcmViYXNlRXJyb3IgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgT0F1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMvb2F1dGgnO1xuaW1wb3J0IHsgQmFzZU9BdXRoUHJvdmlkZXIgfSBmcm9tICcuL29hdXRoJztcbmltcG9ydCB7IFByb3ZpZGVySWQsIFNpZ25Jbk1ldGhvZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBQcm92aWRlciBmb3IgZ2VuZXJhdGluZyBhbiB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmb3Ige0BsaW5rIFByb3ZpZGVySWR9LkdJVEhVQi5cbiAqXG4gKiBAcmVtYXJrc1xuICogR2l0SHViIHJlcXVpcmVzIGFuIE9BdXRoIDIuMCByZWRpcmVjdCwgc28geW91IGNhbiBlaXRoZXIgaGFuZGxlIHRoZSByZWRpcmVjdCBkaXJlY3RseSwgb3IgdXNlXG4gKiB0aGUge0BsaW5rIHNpZ25JbldpdGhQb3B1cH0gaGFuZGxlcjpcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR2l0aHViQXV0aFByb3ZpZGVyKCk7XG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXG4gKiBwcm92aWRlci5hZGRTY29wZSgncmVwbycpO1xuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogaWYgKHJlc3VsdCkge1xuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR2l0aHViIEFjY2VzcyBUb2tlbi5cbiAqICAgY29uc3QgY3JlZGVudGlhbCA9IEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgR2l0aHViQXV0aFByb3ZpZGVyKCk7XG4gKiBwcm92aWRlci5hZGRTY29wZSgncmVwbycpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqXG4gKiAvLyBUaGUgc2lnbmVkLWluIHVzZXIgaW5mby5cbiAqIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqIC8vIFRoaXMgZ2l2ZXMgeW91IGEgR2l0aHViIEFjY2VzcyBUb2tlbi5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBHaXRodWJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQocmVzdWx0KTtcbiAqIGNvbnN0IHRva2VuID0gY3JlZGVudGlhbC5hY2Nlc3NUb2tlbjtcbiAqIGBgYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgR2l0aHViQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5HSVRIVUIuICovXG4gIHN0YXRpYyByZWFkb25seSBHSVRIVUJfU0lHTl9JTl9NRVRIT0Q6ICdnaXRodWIuY29tJyA9IFNpZ25Jbk1ldGhvZC5HSVRIVUI7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBQcm92aWRlcklkfS5HSVRIVUIuICovXG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogJ2dpdGh1Yi5jb20nID0gUHJvdmlkZXJJZC5HSVRIVUI7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJvdmlkZXJJZC5HSVRIVUIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjcmVkZW50aWFsIGZvciBHaXRodWIuXG4gICAqXG4gICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiAtIEdpdGh1YiBhY2Nlc3MgdG9rZW4uXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbChhY2Nlc3NUb2tlbjogc3RyaW5nKTogT0F1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gT0F1dGhDcmVkZW50aWFsLl9mcm9tUGFyYW1zKHtcbiAgICAgIHByb3ZpZGVySWQ6IEdpdGh1YkF1dGhQcm92aWRlci5QUk9WSURFUl9JRCxcbiAgICAgIHNpZ25Jbk1ldGhvZDogR2l0aHViQXV0aFByb3ZpZGVyLkdJVEhVQl9TSUdOX0lOX01FVEhPRCxcbiAgICAgIGFjY2Vzc1Rva2VuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9LlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tUmVzdWx0KFxuICAgIHVzZXJDcmVkZW50aWFsOiBVc2VyQ3JlZGVudGlhbFxuICApOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gR2l0aHViQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcbiAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7XG4gICAgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2VcbiAgfTogVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UgfHwgISgnb2F1dGhBY2Nlc3NUb2tlbicgaW4gdG9rZW5SZXNwb25zZSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghdG9rZW5SZXNwb25zZS5vYXV0aEFjY2Vzc1Rva2VuKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEdpdGh1YkF1dGhQcm92aWRlci5jcmVkZW50aWFsKHRva2VuUmVzcG9uc2Uub2F1dGhBY2Nlc3NUb2tlbik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIFNBTUwgY3JlZGVudGlhbHMgcmV0dXJuZWQgYnkgYW4ge0BsaW5rIFNBTUxBdXRoUHJvdmlkZXJ9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5pbXBvcnQge1xuICBzaWduSW5XaXRoSWRwLFxuICBTaWduSW5XaXRoSWRwUmVxdWVzdFxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vaWRwJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2F1dGhfY3JlZGVudGlhbCc7XG5cbmNvbnN0IElEUF9SRVFVRVNUX1VSSSA9ICdodHRwOi8vbG9jYWxob3N0JztcblxuLyoqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBTQU1MQXV0aENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcm92aWRlcklkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nVG9rZW46IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihwcm92aWRlcklkLCBwcm92aWRlcklkKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldElkVG9rZW5SZXNwb25zZShhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbGlua1RvSWRUb2tlbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nXG4gICk6IFByb21pc2U8SWRUb2tlblJlc3BvbnNlPiB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuYnVpbGRSZXF1ZXN0KCk7XG4gICAgcmVxdWVzdC5pZFRva2VuID0gaWRUb2tlbjtcbiAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCByZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkUmVxdWVzdCgpO1xuICAgIHJlcXVlc3QuYXV0b0NyZWF0ZSA9IGZhbHNlO1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdGRvYyBBdXRoQ3JlZGVudGlhbC50b0pTT059ICAqL1xuICB0b0pTT04oKTogb2JqZWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2lnbkluTWV0aG9kOiB0aGlzLnNpZ25Jbk1ldGhvZCxcbiAgICAgIHByb3ZpZGVySWQ6IHRoaXMucHJvdmlkZXJJZCxcbiAgICAgIHBlbmRpbmdUb2tlbjogdGhpcy5wZW5kaW5nVG9rZW5cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXRpYyBtZXRob2QgdG8gZGVzZXJpYWxpemUgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCBpbnRvIGFuXG4gICAqIHtAbGluayAgQXV0aENyZWRlbnRpYWx9LlxuICAgKlxuICAgKiBAcGFyYW0ganNvbiAtIElucHV0IGNhbiBiZSBlaXRoZXIgT2JqZWN0IG9yIHRoZSBzdHJpbmdpZmllZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LlxuICAgKiBXaGVuIHN0cmluZyBpcyBwcm92aWRlZCwgSlNPTi5wYXJzZSB3b3VsZCBiZSBjYWxsZWQgZmlyc3QuXG4gICAqXG4gICAqIEByZXR1cm5zIElmIHRoZSBKU09OIGlucHV0IGRvZXMgbm90IHJlcHJlc2VudCBhbiB7QGxpbmsgIEF1dGhDcmVkZW50aWFsfSwgbnVsbCBpcyByZXR1cm5lZC5cbiAgICovXG4gIHN0YXRpYyBmcm9tSlNPTihqc29uOiBzdHJpbmcgfCBvYmplY3QpOiBTQU1MQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBjb25zdCBvYmogPSB0eXBlb2YganNvbiA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGpzb24pIDoganNvbjtcbiAgICBjb25zdCB7IHByb3ZpZGVySWQsIHNpZ25Jbk1ldGhvZCwgcGVuZGluZ1Rva2VuIH06IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPVxuICAgICAgb2JqO1xuICAgIGlmIChcbiAgICAgICFwcm92aWRlcklkIHx8XG4gICAgICAhc2lnbkluTWV0aG9kIHx8XG4gICAgICAhcGVuZGluZ1Rva2VuIHx8XG4gICAgICBwcm92aWRlcklkICE9PSBzaWduSW5NZXRob2RcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU0FNTEF1dGhDcmVkZW50aWFsKHByb3ZpZGVySWQsIHBlbmRpbmdUb2tlbik7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHN0YXRpYyBtZXRob2QgdG8gYXZvaWQgZXhwb3NpbmcgdGhlIGNvbnN0cnVjdG9yIHRvIGVuZCB1c2Vycy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgX2NyZWF0ZShwcm92aWRlcklkOiBzdHJpbmcsIHBlbmRpbmdUb2tlbjogc3RyaW5nKTogU0FNTEF1dGhDcmVkZW50aWFsIHtcbiAgICByZXR1cm4gbmV3IFNBTUxBdXRoQ3JlZGVudGlhbChwcm92aWRlcklkLCBwZW5kaW5nVG9rZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlcXVlc3QoKTogU2lnbkluV2l0aElkcFJlcXVlc3Qge1xuICAgIHJldHVybiB7XG4gICAgICByZXF1ZXN0VXJpOiBJRFBfUkVRVUVTVF9VUkksXG4gICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcbiAgICAgIHBlbmRpbmdUb2tlbjogdGhpcy5wZW5kaW5nVG9rZW5cbiAgICB9O1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFNpZ25JbldpdGhJZHBSZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9pZHAnO1xuaW1wb3J0IHsgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzJztcbmltcG9ydCB7IFNBTUxBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL3NhbWwnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRmVkZXJhdGVkQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9mZWRlcmF0ZWQnO1xuXG5jb25zdCBTQU1MX1BST1ZJREVSX1BSRUZJWCA9ICdzYW1sLic7XG5cbi8qKlxuICogQW4ge0BsaW5rIEF1dGhQcm92aWRlcn0gZm9yIFNBTUwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgU0FNTEF1dGhQcm92aWRlciBleHRlbmRzIEZlZGVyYXRlZEF1dGhQcm92aWRlciB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3Rvci4gVGhlIHByb3ZpZGVySWQgbXVzdCBzdGFydCB3aXRoIFwic2FtbC5cIlxuICAgKiBAcGFyYW0gcHJvdmlkZXJJZCAtIFNBTUwgcHJvdmlkZXIgSUQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcm92aWRlcklkOiBzdHJpbmcpIHtcbiAgICBfYXNzZXJ0KFxuICAgICAgcHJvdmlkZXJJZC5zdGFydHNXaXRoKFNBTUxfUFJPVklERVJfUFJFRklYKSxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIHN1cGVyKHByb3ZpZGVySWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9IGFmdGVyIGFcbiAgICogc3VjY2Vzc2Z1bCBTQU1MIGZsb3cgY29tcGxldGVzLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgdG8gZ2V0IGFuIHtAbGluayBBdXRoQ3JlZGVudGlhbH0sIHlvdSBjb3VsZCB3cml0ZSB0aGVcbiAgICogZm9sbG93aW5nIGNvZGU6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHNhbWxQcm92aWRlcik7XG4gICAqIGNvbnN0IGNyZWRlbnRpYWwgPSBTQU1MQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tUmVzdWx0KHVzZXJDcmVkZW50aWFsKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB1c2VyQ3JlZGVudGlhbCAtIFRoZSB1c2VyIGNyZWRlbnRpYWwuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbEZyb21SZXN1bHQoXG4gICAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4gICk6IEF1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIFNBTUxBdXRoUHJvdmlkZXIuc2FtbENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KFxuICAgICAgdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVXNlZCB0byBleHRyYWN0IHRoZSB1bmRlcmx5aW5nIHtAbGluayBPQXV0aENyZWRlbnRpYWx9IGZyb20gYSB7QGxpbmsgQXV0aEVycm9yfSB3aGljaCB3YXNcbiAgICogdGhyb3duIGR1cmluZyBhIHNpZ24taW4sIGxpbmssIG9yIHJlYXV0aGVudGljYXRlIG9wZXJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gU0FNTEF1dGhQcm92aWRlci5zYW1sQ3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICAoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkgYXMgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSBmcm9tIGEgSlNPTiBzdHJpbmcgb3IgYSBwbGFpbiBvYmplY3QuXG4gICAqIEBwYXJhbSBqc29uIC0gQSBwbGFpbiBvYmplY3Qgb3IgYSBKU09OIHN0cmluZ1xuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tSlNPTihqc29uOiBzdHJpbmcgfCBvYmplY3QpOiBBdXRoQ3JlZGVudGlhbCB7XG4gICAgY29uc3QgY3JlZGVudGlhbCA9IFNBTUxBdXRoQ3JlZGVudGlhbC5mcm9tSlNPTihqc29uKTtcbiAgICBfYXNzZXJ0KGNyZWRlbnRpYWwsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuICAgIHJldHVybiBjcmVkZW50aWFsO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgc2FtbENyZWRlbnRpYWxGcm9tVGFnZ2VkT2JqZWN0KHtcbiAgICBfdG9rZW5SZXNwb25zZTogdG9rZW5SZXNwb25zZVxuICB9OiBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSk6IFNBTUxBdXRoQ3JlZGVudGlhbCB8IG51bGwge1xuICAgIGlmICghdG9rZW5SZXNwb25zZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwZW5kaW5nVG9rZW4sIHByb3ZpZGVySWQgfSA9IHRva2VuUmVzcG9uc2UgYXMgU2lnbkluV2l0aElkcFJlc3BvbnNlO1xuXG4gICAgaWYgKCFwZW5kaW5nVG9rZW4gfHwgIXByb3ZpZGVySWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gU0FNTEF1dGhDcmVkZW50aWFsLl9jcmVhdGUocHJvdmlkZXJJZCwgcGVuZGluZ1Rva2VuKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBUd2l0dGVyIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHsgU2lnbkluV2l0aElkcFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2lkcCc7XG5pbXBvcnQgeyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE9BdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzL29hdXRoJztcbmltcG9ydCB7IEJhc2VPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9vYXV0aCc7XG5pbXBvcnQgeyBQcm92aWRlcklkLCBTaWduSW5NZXRob2QgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYW4ge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZm9yIHtAbGluayBQcm92aWRlcklkfS5UV0lUVEVSLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBUd2l0dGVyQXV0aFByb3ZpZGVyKCk7XG4gKiAvLyBTdGFydCBhIHNpZ24gaW4gcHJvY2VzcyBmb3IgYW4gdW5hdXRoZW50aWNhdGVkIHVzZXIuXG4gKiBhd2FpdCBzaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIpO1xuICogLy8gVGhpcyB3aWxsIHRyaWdnZXIgYSBmdWxsIHBhZ2UgcmVkaXJlY3QgYXdheSBmcm9tIHlvdXIgYXBwXG4gKlxuICogLy8gQWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIHJlZGlyZWN0IHdoZW4geW91ciBhcHAgaW5pdGlhbGl6ZXMgeW91IGNhbiBvYnRhaW4gdGhlIHJlc3VsdFxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCk7XG4gKiBpZiAocmVzdWx0KSB7XG4gKiAgIC8vIFRoaXMgaXMgdGhlIHNpZ25lZC1pbiB1c2VyXG4gKiAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAqICAgLy8gVGhpcyBnaXZlcyB5b3UgYSBUd2l0dGVyIEFjY2VzcyBUb2tlbiBhbmQgU2VjcmV0LlxuICogICBjb25zdCBjcmVkZW50aWFsID0gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogICBjb25zdCB0b2tlbiA9IGNyZWRlbnRpYWwuYWNjZXNzVG9rZW47XG4gKiAgIGNvbnN0IHNlY3JldCA9IGNyZWRlbnRpYWwuc2VjcmV0O1xuICogfVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFR3aXR0ZXJBdXRoUHJvdmlkZXIoKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XG4gKlxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIFR3aXR0ZXIgQWNjZXNzIFRva2VuIGFuZCBTZWNyZXQuXG4gKiBjb25zdCBjcmVkZW50aWFsID0gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChyZXN1bHQpO1xuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogY29uc3Qgc2VjcmV0ID0gY3JlZGVudGlhbC5zZWNyZXQ7XG4gKiBgYGBcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUd2l0dGVyQXV0aFByb3ZpZGVyIGV4dGVuZHMgQmFzZU9BdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgU2lnbkluTWV0aG9kfS5UV0lUVEVSLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgVFdJVFRFUl9TSUdOX0lOX01FVEhPRDogJ3R3aXR0ZXIuY29tJyA9IFNpZ25Jbk1ldGhvZC5UV0lUVEVSO1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uVFdJVFRFUi4gKi9cbiAgc3RhdGljIHJlYWRvbmx5IFBST1ZJREVSX0lEOiAndHdpdHRlci5jb20nID0gUHJvdmlkZXJJZC5UV0lUVEVSO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuVFdJVFRFUik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgZm9yIFR3aXR0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbiAtIFR3aXR0ZXIgYWNjZXNzIHRva2VuLlxuICAgKiBAcGFyYW0gc2VjcmV0IC0gVHdpdHRlciBzZWNyZXQuXG4gICAqL1xuICBzdGF0aWMgY3JlZGVudGlhbCh0b2tlbjogc3RyaW5nLCBzZWNyZXQ6IHN0cmluZyk6IE9BdXRoQ3JlZGVudGlhbCB7XG4gICAgcmV0dXJuIE9BdXRoQ3JlZGVudGlhbC5fZnJvbVBhcmFtcyh7XG4gICAgICBwcm92aWRlcklkOiBUd2l0dGVyQXV0aFByb3ZpZGVyLlBST1ZJREVSX0lELFxuICAgICAgc2lnbkluTWV0aG9kOiBUd2l0dGVyQXV0aFByb3ZpZGVyLlRXSVRURVJfU0lHTl9JTl9NRVRIT0QsXG4gICAgICBvYXV0aFRva2VuOiB0b2tlbixcbiAgICAgIG9hdXRoVG9rZW5TZWNyZXQ6IHNlY3JldFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gZXh0cmFjdCB0aGUgdW5kZXJseWluZyB7QGxpbmsgT0F1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdChcbiAgICB1c2VyQ3JlZGVudGlhbDogVXNlckNyZWRlbnRpYWxcbiAgKTogT0F1dGhDcmVkZW50aWFsIHwgbnVsbCB7XG4gICAgcmV0dXJuIFR3aXR0ZXJBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICB1c2VyQ3JlZGVudGlhbCBhcyBVc2VyQ3JlZGVudGlhbEludGVybmFsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIGV4dHJhY3QgdGhlIHVuZGVybHlpbmcge0BsaW5rIE9BdXRoQ3JlZGVudGlhbH0gZnJvbSBhIHtAbGluayBBdXRoRXJyb3J9IHdoaWNoIHdhc1xuICAgKiB0aHJvd24gZHVyaW5nIGEgc2lnbi1pbiwgbGluaywgb3IgcmVhdXRoZW50aWNhdGUgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICAgKi9cbiAgc3RhdGljIGNyZWRlbnRpYWxGcm9tRXJyb3IoZXJyb3I6IEZpcmViYXNlRXJyb3IpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdChcbiAgICAgIChlcnJvci5jdXN0b21EYXRhIHx8IHt9KSBhcyBUYWdnZWRXaXRoVG9rZW5SZXNwb25zZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjcmVkZW50aWFsRnJvbVRhZ2dlZE9iamVjdCh7XG4gICAgX3Rva2VuUmVzcG9uc2U6IHRva2VuUmVzcG9uc2VcbiAgfTogVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UpOiBPQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IG9hdXRoQWNjZXNzVG9rZW4sIG9hdXRoVG9rZW5TZWNyZXQgfSA9XG4gICAgICB0b2tlblJlc3BvbnNlIGFzIFNpZ25JbldpdGhJZHBSZXNwb25zZTtcbiAgICBpZiAoIW9hdXRoQWNjZXNzVG9rZW4gfHwgIW9hdXRoVG9rZW5TZWNyZXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gVHdpdHRlckF1dGhQcm92aWRlci5jcmVkZW50aWFsKG9hdXRoQWNjZXNzVG9rZW4sIG9hdXRoVG9rZW5TZWNyZXQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgRW5kcG9pbnQsXG4gIEh0dHBNZXRob2QsXG4gIFJlY2FwdGNoYUNsaWVudFR5cGUsXG4gIFJlY2FwdGNoYVZlcnNpb24sXG4gIF9hZGRUaWRJZk5lY2Vzc2FyeSxcbiAgX3BlcmZvcm1TaWduSW5SZXF1ZXN0XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25VcFJlcXVlc3Qge1xuICByZXR1cm5TZWN1cmVUb2tlbj86IGJvb2xlYW47XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwYXNzd29yZD86IHN0cmluZztcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGNhcHRjaGFSZXNwb25zZT86IHN0cmluZztcbiAgY2xpZW50VHlwZT86IFJlY2FwdGNoYUNsaWVudFR5cGU7XG4gIHJlY2FwdGNoYVZlcnNpb24/OiBSZWNhcHRjaGFWZXJzaW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25VcFJlc3BvbnNlIGV4dGVuZHMgSWRUb2tlblJlc3BvbnNlIHtcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIGVtYWlsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnblVwKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduVXBSZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25VcFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8U2lnblVwUmVxdWVzdCwgU2lnblVwUmVzcG9uc2U+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fVVAsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgVXNlckludGVybmFsLCBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBVc2VySW1wbCB9IGZyb20gJy4vdXNlcl9pbXBsJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSwgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuaW50ZXJmYWNlIFVzZXJDcmVkZW50aWFsUGFyYW1zIHtcbiAgcmVhZG9ubHkgdXNlcjogVXNlckludGVybmFsO1xuICByZWFkb25seSBwcm92aWRlcklkOiBQcm92aWRlcklkIHwgc3RyaW5nIHwgbnVsbDtcbiAgcmVhZG9ubHkgX3Rva2VuUmVzcG9uc2U/OiBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlO1xuICByZWFkb25seSBvcGVyYXRpb25UeXBlOiBPcGVyYXRpb25UeXBlO1xufVxuXG5leHBvcnQgY2xhc3MgVXNlckNyZWRlbnRpYWxJbXBsXG4gIGltcGxlbWVudHMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCwgVXNlckNyZWRlbnRpYWxQYXJhbXNcbntcbiAgcmVhZG9ubHkgdXNlcjogVXNlckludGVybmFsO1xuICByZWFkb25seSBwcm92aWRlcklkOiBQcm92aWRlcklkIHwgc3RyaW5nIHwgbnVsbDtcbiAgcmVhZG9ubHkgX3Rva2VuUmVzcG9uc2U6IFBob25lT3JPYXV0aFRva2VuUmVzcG9uc2UgfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGU7XG5cbiAgY29uc3RydWN0b3IocGFyYW1zOiBVc2VyQ3JlZGVudGlhbFBhcmFtcykge1xuICAgIHRoaXMudXNlciA9IHBhcmFtcy51c2VyO1xuICAgIHRoaXMucHJvdmlkZXJJZCA9IHBhcmFtcy5wcm92aWRlcklkO1xuICAgIHRoaXMuX3Rva2VuUmVzcG9uc2UgPSBwYXJhbXMuX3Rva2VuUmVzcG9uc2U7XG4gICAgdGhpcy5vcGVyYXRpb25UeXBlID0gcGFyYW1zLm9wZXJhdGlvblR5cGU7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUsXG4gICAgaWRUb2tlblJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2UsXG4gICAgaXNBbm9ueW1vdXM6IGJvb2xlYW4gPSBmYWxzZVxuICApOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+IHtcbiAgICBjb25zdCB1c2VyID0gYXdhaXQgVXNlckltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgICBhdXRoLFxuICAgICAgaWRUb2tlblJlc3BvbnNlLFxuICAgICAgaXNBbm9ueW1vdXNcbiAgICApO1xuICAgIGNvbnN0IHByb3ZpZGVySWQgPSBwcm92aWRlcklkRm9yUmVzcG9uc2UoaWRUb2tlblJlc3BvbnNlKTtcbiAgICBjb25zdCB1c2VyQ3JlZCA9IG5ldyBVc2VyQ3JlZGVudGlhbEltcGwoe1xuICAgICAgdXNlcixcbiAgICAgIHByb3ZpZGVySWQsXG4gICAgICBfdG9rZW5SZXNwb25zZTogaWRUb2tlblJlc3BvbnNlLFxuICAgICAgb3BlcmF0aW9uVHlwZVxuICAgIH0pO1xuICAgIHJldHVybiB1c2VyQ3JlZDtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBfZm9yT3BlcmF0aW9uKFxuICAgIHVzZXI6IFVzZXJJbnRlcm5hbCxcbiAgICBvcGVyYXRpb25UeXBlOiBPcGVyYXRpb25UeXBlLFxuICAgIHJlc3BvbnNlOiBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlXG4gICk6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbXBsPiB7XG4gICAgYXdhaXQgdXNlci5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIC8qIHJlbG9hZCAqLyB0cnVlKTtcbiAgICBjb25zdCBwcm92aWRlcklkID0gcHJvdmlkZXJJZEZvclJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICByZXR1cm4gbmV3IFVzZXJDcmVkZW50aWFsSW1wbCh7XG4gICAgICB1c2VyLFxuICAgICAgcHJvdmlkZXJJZCxcbiAgICAgIF90b2tlblJlc3BvbnNlOiByZXNwb25zZSxcbiAgICAgIG9wZXJhdGlvblR5cGVcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwcm92aWRlcklkRm9yUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2Vcbik6IFByb3ZpZGVySWQgfCBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHJlc3BvbnNlLnByb3ZpZGVySWQpIHtcbiAgICByZXR1cm4gcmVzcG9uc2UucHJvdmlkZXJJZDtcbiAgfVxuXG4gIGlmICgncGhvbmVOdW1iZXInIGluIHJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIFByb3ZpZGVySWQuUEhPTkU7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoLCBVc2VyQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBzaWduVXAgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vc2lnbl91cCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW1wbCB9IGZyb20gJy4uL3VzZXIvdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiBhcyBhbiBhbm9ueW1vdXMgdXNlci5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBhbm9ueW1vdXMgdXNlciBzaWduZWQgaW4sIHRoYXQgdXNlciB3aWxsIGJlIHJldHVybmVkOyBvdGhlcndpc2UsIGFcbiAqIG5ldyBhbm9ueW1vdXMgdXNlciBpZGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5Bbm9ueW1vdXNseShhdXRoOiBBdXRoKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGF3YWl0IGF1dGhJbnRlcm5hbC5faW5pdGlhbGl6YXRpb25Qcm9taXNlO1xuICBpZiAoYXV0aEludGVybmFsLmN1cnJlbnRVc2VyPy5pc0Fub255bW91cykge1xuICAgIC8vIElmIGFuIGFub255bW91cyB1c2VyIGlzIGFscmVhZHkgc2lnbmVkIGluLCBubyBuZWVkIHRvIHNpZ24gdGhlbSBpbiBhZ2Fpbi5cbiAgICByZXR1cm4gbmV3IFVzZXJDcmVkZW50aWFsSW1wbCh7XG4gICAgICB1c2VyOiBhdXRoSW50ZXJuYWwuY3VycmVudFVzZXIgYXMgVXNlckludGVybmFsLFxuICAgICAgcHJvdmlkZXJJZDogbnVsbCxcbiAgICAgIG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUuU0lHTl9JTlxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2lnblVwKGF1dGhJbnRlcm5hbCwge1xuICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlXG4gIH0pO1xuICBjb25zdCB1c2VyQ3JlZGVudGlhbCA9IGF3YWl0IFVzZXJDcmVkZW50aWFsSW1wbC5fZnJvbUlkVG9rZW5SZXNwb25zZShcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgT3BlcmF0aW9uVHlwZS5TSUdOX0lOLFxuICAgIHJlc3BvbnNlLFxuICAgIHRydWVcbiAgKTtcbiAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcbiAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE11bHRpRmFjdG9yRXJyb3IgYXMgTXVsdGlGYWN0b3JFcnJvclB1YmxpYyB9IGZyb20gJy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NvcmUvY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgSWRUb2tlbk1mYVJlc3BvbnNlIH0gZnJvbSAnLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWwvZW51bXMnO1xuXG5leHBvcnQgdHlwZSBNdWx0aUZhY3RvckVycm9yRGF0YSA9IE11bHRpRmFjdG9yRXJyb3JQdWJsaWNbJ2N1c3RvbURhdGEnXSAmIHtcbiAgX3NlcnZlclJlc3BvbnNlOiBJZFRva2VuTWZhUmVzcG9uc2U7XG59O1xuXG5leHBvcnQgY2xhc3MgTXVsdGlGYWN0b3JFcnJvclxuICBleHRlbmRzIEZpcmViYXNlRXJyb3JcbiAgaW1wbGVtZW50cyBNdWx0aUZhY3RvckVycm9yUHVibGljXG57XG4gIHJlYWRvbmx5IGN1c3RvbURhdGE6IE11bHRpRmFjdG9yRXJyb3JEYXRhO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGVycm9yOiBGaXJlYmFzZUVycm9yLFxuICAgIHJlYWRvbmx5IG9wZXJhdGlvblR5cGU6IE9wZXJhdGlvblR5cGUsXG4gICAgcmVhZG9ubHkgdXNlcj86IFVzZXJJbnRlcm5hbFxuICApIHtcbiAgICBzdXBlcihlcnJvci5jb2RlLCBlcnJvci5tZXNzYWdlKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQtd2lraS9ibG9iL21hc3Rlci9CcmVha2luZy1DaGFuZ2VzLm1kI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29ya1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBNdWx0aUZhY3RvckVycm9yLnByb3RvdHlwZSk7XG4gICAgdGhpcy5jdXN0b21EYXRhID0ge1xuICAgICAgYXBwTmFtZTogYXV0aC5uYW1lLFxuICAgICAgdGVuYW50SWQ6IGF1dGgudGVuYW50SWQgPz8gdW5kZWZpbmVkLFxuICAgICAgX3NlcnZlclJlc3BvbnNlOiBlcnJvci5jdXN0b21EYXRhIS5fc2VydmVyUmVzcG9uc2UgYXMgSWRUb2tlbk1mYVJlc3BvbnNlLFxuICAgICAgb3BlcmF0aW9uVHlwZVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgX2Zyb21FcnJvckFuZE9wZXJhdGlvbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZXJyb3I6IEZpcmViYXNlRXJyb3IsXG4gICAgb3BlcmF0aW9uVHlwZTogT3BlcmF0aW9uVHlwZSxcbiAgICB1c2VyPzogVXNlckludGVybmFsXG4gICk6IE11bHRpRmFjdG9yRXJyb3Ige1xuICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JFcnJvcihhdXRoLCBlcnJvciwgb3BlcmF0aW9uVHlwZSwgdXNlcik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeShcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICBvcGVyYXRpb25UeXBlOiBPcGVyYXRpb25UeXBlLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbCxcbiAgdXNlcj86IFVzZXJJbnRlcm5hbFxuKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgY29uc3QgaWRUb2tlblByb3ZpZGVyID1cbiAgICBvcGVyYXRpb25UeXBlID09PSBPcGVyYXRpb25UeXBlLlJFQVVUSEVOVElDQVRFXG4gICAgICA/IGNyZWRlbnRpYWwuX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoKVxuICAgICAgOiBjcmVkZW50aWFsLl9nZXRJZFRva2VuUmVzcG9uc2UoYXV0aCk7XG5cbiAgcmV0dXJuIGlkVG9rZW5Qcm92aWRlci5jYXRjaChlcnJvciA9PiB7XG4gICAgaWYgKGVycm9yLmNvZGUgPT09IGBhdXRoLyR7QXV0aEVycm9yQ29kZS5NRkFfUkVRVUlSRUR9YCkge1xuICAgICAgdGhyb3cgTXVsdGlGYWN0b3JFcnJvci5fZnJvbUVycm9yQW5kT3BlcmF0aW9uKFxuICAgICAgICBhdXRoLFxuICAgICAgICBlcnJvcixcbiAgICAgICAgb3BlcmF0aW9uVHlwZSxcbiAgICAgICAgdXNlclxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlckFzc29jaWF0ZWRPYmplY3Qge1xuICBwcm92aWRlcklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRha2VzIGEgc2V0IG9mIFVzZXJJbmZvIHByb3ZpZGVyIGRhdGEgYW5kIGNvbnZlcnRzIGl0IHRvIGEgc2V0IG9mIG5hbWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm92aWRlckRhdGFBc05hbWVzPFQgZXh0ZW5kcyBQcm92aWRlckFzc29jaWF0ZWRPYmplY3Q+KFxuICBwcm92aWRlckRhdGE6IFRbXVxuKTogU2V0PHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFNldChcbiAgICBwcm92aWRlckRhdGFcbiAgICAgIC5tYXAoKHsgcHJvdmlkZXJJZCB9KSA9PiBwcm92aWRlcklkKVxuICAgICAgLmZpbHRlcihwaWQgPT4gISFwaWQpIGFzIHN0cmluZ1tdXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IGRlbGV0ZUxpbmtlZEFjY291bnRzIH0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9hY2NvdW50JztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCwgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi9jcmVkZW50aWFscyc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBwcm92aWRlckRhdGFBc05hbWVzIH0gZnJvbSAnLi4vdXRpbC9wcm92aWRlcnMnO1xuaW1wb3J0IHsgX2xvZ291dElmSW52YWxpZGF0ZWQgfSBmcm9tICcuL2ludmFsaWRhdGlvbic7XG5pbXBvcnQgeyBfcmVsb2FkV2l0aG91dFNhdmluZyB9IGZyb20gJy4vcmVsb2FkJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW1wbCB9IGZyb20gJy4vdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSwgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBVbmxpbmtzIGEgcHJvdmlkZXIgZnJvbSBhIHVzZXIgYWNjb3VudC5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHByb3ZpZGVySWQgLSBUaGUgcHJvdmlkZXIgdG8gdW5saW5rLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVubGluayh1c2VyOiBVc2VyLCBwcm92aWRlcklkOiBzdHJpbmcpOiBQcm9taXNlPFVzZXI+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgYXdhaXQgX2Fzc2VydExpbmtlZFN0YXR1cyh0cnVlLCB1c2VySW50ZXJuYWwsIHByb3ZpZGVySWQpO1xuICBjb25zdCB7IHByb3ZpZGVyVXNlckluZm8gfSA9IGF3YWl0IGRlbGV0ZUxpbmtlZEFjY291bnRzKHVzZXJJbnRlcm5hbC5hdXRoLCB7XG4gICAgaWRUb2tlbjogYXdhaXQgdXNlckludGVybmFsLmdldElkVG9rZW4oKSxcbiAgICBkZWxldGVQcm92aWRlcjogW3Byb3ZpZGVySWRdXG4gIH0pO1xuXG4gIGNvbnN0IHByb3ZpZGVyc0xlZnQgPSBwcm92aWRlckRhdGFBc05hbWVzKHByb3ZpZGVyVXNlckluZm8gfHwgW10pO1xuXG4gIHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEgPSB1c2VySW50ZXJuYWwucHJvdmlkZXJEYXRhLmZpbHRlcihwZCA9PlxuICAgIHByb3ZpZGVyc0xlZnQuaGFzKHBkLnByb3ZpZGVySWQpXG4gICk7XG4gIGlmICghcHJvdmlkZXJzTGVmdC5oYXMoUHJvdmlkZXJJZC5QSE9ORSkpIHtcbiAgICB1c2VySW50ZXJuYWwucGhvbmVOdW1iZXIgPSBudWxsO1xuICB9XG5cbiAgYXdhaXQgdXNlckludGVybmFsLmF1dGguX3BlcnNpc3RVc2VySWZDdXJyZW50KHVzZXJJbnRlcm5hbCk7XG4gIHJldHVybiB1c2VySW50ZXJuYWw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfbGluayhcbiAgdXNlcjogVXNlckludGVybmFsLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbCxcbiAgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2Vcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IF9sb2dvdXRJZkludmFsaWRhdGVkKFxuICAgIHVzZXIsXG4gICAgY3JlZGVudGlhbC5fbGlua1RvSWRUb2tlbih1c2VyLmF1dGgsIGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpKSxcbiAgICBieXBhc3NBdXRoU3RhdGVcbiAgKTtcbiAgcmV0dXJuIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uKHVzZXIsIE9wZXJhdGlvblR5cGUuTElOSywgcmVzcG9uc2UpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2Fzc2VydExpbmtlZFN0YXR1cyhcbiAgZXhwZWN0ZWQ6IGJvb2xlYW4sXG4gIHVzZXI6IFVzZXJJbnRlcm5hbCxcbiAgcHJvdmlkZXI6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IF9yZWxvYWRXaXRob3V0U2F2aW5nKHVzZXIpO1xuICBjb25zdCBwcm92aWRlcklkcyA9IHByb3ZpZGVyRGF0YUFzTmFtZXModXNlci5wcm92aWRlckRhdGEpO1xuXG4gIGNvbnN0IGNvZGUgPVxuICAgIGV4cGVjdGVkID09PSBmYWxzZVxuICAgICAgPyBBdXRoRXJyb3JDb2RlLlBST1ZJREVSX0FMUkVBRFlfTElOS0VEXG4gICAgICA6IEF1dGhFcnJvckNvZGUuTk9fU1VDSF9QUk9WSURFUjtcbiAgX2Fzc2VydChwcm92aWRlcklkcy5oYXMocHJvdmlkZXIpID09PSBleHBlY3RlZCwgdXNlci5hdXRoLCBjb2RlKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBGaXJlYmFzZUVycm9yIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgX3Byb2Nlc3NDcmVkZW50aWFsU2F2aW5nTWZhQ29udGV4dElmTmVjZXNzYXJ5IH0gZnJvbSAnLi4vLi4vbWZhL21mYV9lcnJvcic7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCwgX2ZhaWwgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfcGFyc2VUb2tlbiB9IGZyb20gJy4vaWRfdG9rZW5fcmVzdWx0JztcbmltcG9ydCB7IF9sb2dvdXRJZkludmFsaWRhdGVkIH0gZnJvbSAnLi9pbnZhbGlkYXRpb24nO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbXBsIH0gZnJvbSAnLi91c2VyX2NyZWRlbnRpYWxfaW1wbCc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfcmVhdXRoZW50aWNhdGUoXG4gIHVzZXI6IFVzZXJJbnRlcm5hbCxcbiAgY3JlZGVudGlhbDogQXV0aENyZWRlbnRpYWwsXG4gIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW1wbD4ge1xuICBjb25zdCB7IGF1dGggfSA9IHVzZXI7XG4gIGNvbnN0IG9wZXJhdGlvblR5cGUgPSBPcGVyYXRpb25UeXBlLlJFQVVUSEVOVElDQVRFO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICAgIHVzZXIsXG4gICAgICBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkoXG4gICAgICAgIGF1dGgsXG4gICAgICAgIG9wZXJhdGlvblR5cGUsXG4gICAgICAgIGNyZWRlbnRpYWwsXG4gICAgICAgIHVzZXJcbiAgICAgICksXG4gICAgICBieXBhc3NBdXRoU3RhdGVcbiAgICApO1xuICAgIF9hc3NlcnQocmVzcG9uc2UuaWRUb2tlbiwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgY29uc3QgcGFyc2VkID0gX3BhcnNlVG9rZW4ocmVzcG9uc2UuaWRUb2tlbik7XG4gICAgX2Fzc2VydChwYXJzZWQsIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuXG4gICAgY29uc3QgeyBzdWI6IGxvY2FsSWQgfSA9IHBhcnNlZDtcbiAgICBfYXNzZXJ0KHVzZXIudWlkID09PSBsb2NhbElkLCBhdXRoLCBBdXRoRXJyb3JDb2RlLlVTRVJfTUlTTUFUQ0gpO1xuXG4gICAgcmV0dXJuIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uKHVzZXIsIG9wZXJhdGlvblR5cGUsIHJlc3BvbnNlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIENvbnZlcnQgdXNlciBkZWxldGVkIGVycm9yIGludG8gdXNlciBtaXNtYXRjaFxuICAgIGlmICgoZSBhcyBGaXJlYmFzZUVycm9yKT8uY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLlVTRVJfREVMRVRFRH1gKSB7XG4gICAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLlVTRVJfTUlTTUFUQ0gpO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWwsIEF1dGgsIFVzZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkgfSBmcm9tICcuLi8uLi9tZmEvbWZhX2Vycm9yJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uL2NyZWRlbnRpYWxzJztcbmltcG9ydCB7IF9hc3NlcnRMaW5rZWRTdGF0dXMsIF9saW5rIH0gZnJvbSAnLi4vdXNlci9saW5rX3VubGluayc7XG5pbXBvcnQgeyBfcmVhdXRoZW50aWNhdGUgfSBmcm9tICcuLi91c2VyL3JlYXV0aGVudGljYXRlJztcbmltcG9ydCB7IFVzZXJDcmVkZW50aWFsSW1wbCB9IGZyb20gJy4uL3VzZXIvdXNlcl9jcmVkZW50aWFsX2ltcGwnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgT3BlcmF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9zaWduSW5XaXRoQ3JlZGVudGlhbChcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbCxcbiAgYnlwYXNzQXV0aFN0YXRlID0gZmFsc2Vcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgY29uc3Qgb3BlcmF0aW9uVHlwZSA9IE9wZXJhdGlvblR5cGUuU0lHTl9JTjtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkoXG4gICAgYXV0aCxcbiAgICBvcGVyYXRpb25UeXBlLFxuICAgIGNyZWRlbnRpYWxcbiAgKTtcbiAgY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgYXV0aCxcbiAgICBvcGVyYXRpb25UeXBlLFxuICAgIHJlc3BvbnNlXG4gICk7XG5cbiAgaWYgKCFieXBhc3NBdXRoU3RhdGUpIHtcbiAgICBhd2FpdCBhdXRoLl91cGRhdGVDdXJyZW50VXNlcih1c2VyQ3JlZGVudGlhbC51c2VyKTtcbiAgfVxuICByZXR1cm4gdXNlckNyZWRlbnRpYWw7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMuXG4gKlxuICogQHJlbWFya3NcbiAqIEFuIHtAbGluayBBdXRoUHJvdmlkZXJ9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gVGhlIGF1dGggY3JlZGVudGlhbC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaWduSW5XaXRoQ3JlZGVudGlhbChcbiAgYXV0aDogQXV0aCxcbiAgY3JlZGVudGlhbDogQXV0aENyZWRlbnRpYWxcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgcmV0dXJuIF9zaWduSW5XaXRoQ3JlZGVudGlhbChfY2FzdEF1dGgoYXV0aCksIGNyZWRlbnRpYWwpO1xufVxuXG4vKipcbiAqIExpbmtzIHRoZSB1c2VyIGFjY291bnQgd2l0aCB0aGUgZ2l2ZW4gY3JlZGVudGlhbHMuXG4gKlxuICogQHJlbWFya3NcbiAqIEFuIHtAbGluayBBdXRoUHJvdmlkZXJ9IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjcmVkZW50aWFsLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhdXRoIGNyZWRlbnRpYWwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlua1dpdGhDcmVkZW50aWFsKFxuICB1c2VyOiBVc2VyLFxuICBjcmVkZW50aWFsOiBBdXRoQ3JlZGVudGlhbFxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuXG4gIGF3YWl0IF9hc3NlcnRMaW5rZWRTdGF0dXMoZmFsc2UsIHVzZXJJbnRlcm5hbCwgY3JlZGVudGlhbC5wcm92aWRlcklkKTtcblxuICByZXR1cm4gX2xpbmsodXNlckludGVybmFsLCBjcmVkZW50aWFsKTtcbn1cblxuLyoqXG4gKiBSZS1hdXRoZW50aWNhdGVzIGEgdXNlciB1c2luZyBhIGZyZXNoIGNyZWRlbnRpYWwuXG4gKlxuICogQHJlbWFya3NcbiAqIFVzZSBiZWZvcmUgb3BlcmF0aW9ucyBzdWNoIGFzIHtAbGluayB1cGRhdGVQYXNzd29yZH0gdGhhdCByZXF1aXJlIHRva2VucyBmcm9tIHJlY2VudCBzaWduLWluXG4gKiBhdHRlbXB0cy4gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmVjb3ZlciBmcm9tIGEgYENSRURFTlRJQUxfVE9PX09MRF9MT0dJTl9BR0FJTmAgZXJyb3JcbiAqIG9yIGEgYFRPS0VOX0VYUElSRURgIGVycm9yLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gY3JlZGVudGlhbCAtIFRoZSBhdXRoIGNyZWRlbnRpYWwuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbChcbiAgdXNlcjogVXNlcixcbiAgY3JlZGVudGlhbDogQXV0aENyZWRlbnRpYWxcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgcmV0dXJuIF9yZWF1dGhlbnRpY2F0ZShnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsLCBjcmVkZW50aWFsKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5LFxuICBfcGVyZm9ybVNpZ25JblJlcXVlc3Rcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbkluV2l0aEN1c3RvbVRva2VuUmVxdWVzdCB7XG4gIHRva2VuOiBzdHJpbmc7XG4gIHJldHVyblNlY3VyZVRva2VuOiBib29sZWFuO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWduSW5XaXRoQ3VzdG9tVG9rZW5SZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7fVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aEN1c3RvbVRva2VuKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBTaWduSW5XaXRoQ3VzdG9tVG9rZW5SZXF1ZXN0XG4pOiBQcm9taXNlPFNpZ25JbldpdGhDdXN0b21Ub2tlblJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybVNpZ25JblJlcXVlc3Q8XG4gICAgU2lnbkluV2l0aEN1c3RvbVRva2VuUmVxdWVzdCxcbiAgICBTaWduSW5XaXRoQ3VzdG9tVG9rZW5SZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNJR05fSU5fV0lUSF9DVVNUT01fVE9LRU4sXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aCwgVXNlckNyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBzaWduSW5XaXRoQ3VzdG9tVG9rZW4gYXMgZ2V0SWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL2N1c3RvbV90b2tlbic7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEltcGwgfSBmcm9tICcuLi91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsJztcbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IE9wZXJhdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgc2lnbnMgaW4gdXNpbmcgYSBjdXN0b20gdG9rZW4uXG4gKlxuICogQHJlbWFya3NcbiAqIEN1c3RvbSB0b2tlbnMgYXJlIHVzZWQgdG8gaW50ZWdyYXRlIEZpcmViYXNlIEF1dGggd2l0aCBleGlzdGluZyBhdXRoIHN5c3RlbXMsIGFuZCBtdXN0XG4gKiBiZSBnZW5lcmF0ZWQgYnkgYW4gYXV0aCBiYWNrZW5kIHVzaW5nIHRoZVxuICoge0BsaW5rIGh0dHBzOi8vZmlyZWJhc2UuZ29vZ2xlLmNvbS9kb2NzL3JlZmVyZW5jZS9hZG1pbi9ub2RlL2FkbWluLmF1dGguQXV0aCNjcmVhdGVjdXN0b210b2tlbiB8IGNyZWF0ZUN1c3RvbVRva2VufVxuICogbWV0aG9kIGluIHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC9hZG1pbiB8IEFkbWluIFNES30gLlxuICpcbiAqIEZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIHRva2VuIGlzIGludmFsaWQsIGV4cGlyZWQsIG9yIG5vdCBhY2NlcHRlZCBieSB0aGUgRmlyZWJhc2UgQXV0aCBzZXJ2aWNlLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBjdXN0b21Ub2tlbiAtIFRoZSBjdXN0b20gdG9rZW4gdG8gc2lnbiBpbiB3aXRoLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhDdXN0b21Ub2tlbihcbiAgYXV0aDogQXV0aCxcbiAgY3VzdG9tVG9rZW46IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGNvbnN0IHJlc3BvbnNlOiBJZFRva2VuUmVzcG9uc2UgPSBhd2FpdCBnZXRJZFRva2VuUmVzcG9uc2UoYXV0aEludGVybmFsLCB7XG4gICAgdG9rZW46IGN1c3RvbVRva2VuLFxuICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlXG4gIH0pO1xuICBjb25zdCBjcmVkID0gYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICBPcGVyYXRpb25UeXBlLlNJR05fSU4sXG4gICAgcmVzcG9uc2VcbiAgKTtcbiAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVDdXJyZW50VXNlcihjcmVkLnVzZXIpO1xuICByZXR1cm4gY3JlZDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBGYWN0b3JJZCxcbiAgTXVsdGlGYWN0b3JJbmZvLFxuICBQaG9uZU11bHRpRmFjdG9ySW5mbyxcbiAgVG90cE11bHRpRmFjdG9ySW5mb1xufSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHtcbiAgUGhvbmVNZmFFbnJvbGxtZW50LFxuICBNZmFFbnJvbGxtZW50LFxuICBUb3RwTWZhRW5yb2xsbWVudFxufSBmcm9tICcuLi9hcGkvYWNjb3VudF9tYW5hZ2VtZW50L21mYSc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2ZhaWwgfSBmcm9tICcuLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uL21vZGVsL2F1dGgnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXVsdGlGYWN0b3JJbmZvSW1wbCBpbXBsZW1lbnRzIE11bHRpRmFjdG9ySW5mbyB7XG4gIHJlYWRvbmx5IHVpZDogc3RyaW5nO1xuICByZWFkb25seSBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGw7XG4gIHJlYWRvbmx5IGVucm9sbG1lbnRUaW1lOiBzdHJpbmc7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZhY3RvcklkOiBGYWN0b3JJZCwgcmVzcG9uc2U6IE1mYUVucm9sbG1lbnQpIHtcbiAgICB0aGlzLnVpZCA9IHJlc3BvbnNlLm1mYUVucm9sbG1lbnRJZDtcbiAgICB0aGlzLmVucm9sbG1lbnRUaW1lID0gbmV3IERhdGUocmVzcG9uc2UuZW5yb2xsZWRBdCkudG9VVENTdHJpbmcoKTtcbiAgICB0aGlzLmRpc3BsYXlOYW1lID0gcmVzcG9uc2UuZGlzcGxheU5hbWU7XG4gIH1cblxuICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgZW5yb2xsbWVudDogTWZhRW5yb2xsbWVudFxuICApOiBNdWx0aUZhY3RvckluZm9JbXBsIHtcbiAgICBpZiAoJ3Bob25lSW5mbycgaW4gZW5yb2xsbWVudCkge1xuICAgICAgcmV0dXJuIFBob25lTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKGF1dGgsIGVucm9sbG1lbnQpO1xuICAgIH0gZWxzZSBpZiAoJ3RvdHBJbmZvJyBpbiBlbnJvbGxtZW50KSB7XG4gICAgICByZXR1cm4gVG90cE11bHRpRmFjdG9ySW5mb0ltcGwuX2Zyb21TZXJ2ZXJSZXNwb25zZShhdXRoLCBlbnJvbGxtZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIF9mYWlsKGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQaG9uZU11bHRpRmFjdG9ySW5mb0ltcGxcbiAgZXh0ZW5kcyBNdWx0aUZhY3RvckluZm9JbXBsXG4gIGltcGxlbWVudHMgUGhvbmVNdWx0aUZhY3RvckluZm9cbntcbiAgcmVhZG9ubHkgcGhvbmVOdW1iZXI6IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHJlc3BvbnNlOiBQaG9uZU1mYUVucm9sbG1lbnQpIHtcbiAgICBzdXBlcihGYWN0b3JJZC5QSE9ORSwgcmVzcG9uc2UpO1xuICAgIHRoaXMucGhvbmVOdW1iZXIgPSByZXNwb25zZS5waG9uZUluZm87XG4gIH1cblxuICBzdGF0aWMgX2Zyb21TZXJ2ZXJSZXNwb25zZShcbiAgICBfYXV0aDogQXV0aEludGVybmFsLFxuICAgIGVucm9sbG1lbnQ6IE1mYUVucm9sbG1lbnRcbiAgKTogUGhvbmVNdWx0aUZhY3RvckluZm9JbXBsIHtcbiAgICByZXR1cm4gbmV3IFBob25lTXVsdGlGYWN0b3JJbmZvSW1wbChlbnJvbGxtZW50IGFzIFBob25lTWZhRW5yb2xsbWVudCk7XG4gIH1cbn1cbmV4cG9ydCBjbGFzcyBUb3RwTXVsdGlGYWN0b3JJbmZvSW1wbFxuICBleHRlbmRzIE11bHRpRmFjdG9ySW5mb0ltcGxcbiAgaW1wbGVtZW50cyBUb3RwTXVsdGlGYWN0b3JJbmZvXG57XG4gIHByaXZhdGUgY29uc3RydWN0b3IocmVzcG9uc2U6IFRvdHBNZmFFbnJvbGxtZW50KSB7XG4gICAgc3VwZXIoRmFjdG9ySWQuVE9UUCwgcmVzcG9uc2UpO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tU2VydmVyUmVzcG9uc2UoXG4gICAgX2F1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBlbnJvbGxtZW50OiBNZmFFbnJvbGxtZW50XG4gICk6IFRvdHBNdWx0aUZhY3RvckluZm9JbXBsIHtcbiAgICByZXR1cm4gbmV3IFRvdHBNdWx0aUZhY3RvckluZm9JbXBsKGVucm9sbG1lbnQgYXMgVG90cE1mYUVucm9sbG1lbnQpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQWN0aW9uQ29kZVNldHRpbmdzLCBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgR2V0T29iQ29kZVJlcXVlc3QgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcblxuZXhwb3J0IGZ1bmN0aW9uIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldE9vYkNvZGVSZXF1ZXN0LFxuICBhY3Rpb25Db2RlU2V0dGluZ3M6IEFjdGlvbkNvZGVTZXR0aW5nc1xuKTogdm9pZCB7XG4gIF9hc3NlcnQoXG4gICAgYWN0aW9uQ29kZVNldHRpbmdzLnVybD8ubGVuZ3RoID4gMCxcbiAgICBhdXRoLFxuICAgIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9DT05USU5VRV9VUklcbiAgKTtcbiAgX2Fzc2VydChcbiAgICB0eXBlb2YgYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluLmxlbmd0aCA+IDAsXG4gICAgYXV0aCxcbiAgICBBdXRoRXJyb3JDb2RlLklOVkFMSURfRFlOQU1JQ19MSU5LX0RPTUFJTlxuICApO1xuXG4gIHJlcXVlc3QuY29udGludWVVcmwgPSBhY3Rpb25Db2RlU2V0dGluZ3MudXJsO1xuICByZXF1ZXN0LmR5bmFtaWNMaW5rRG9tYWluID0gYWN0aW9uQ29kZVNldHRpbmdzLmR5bmFtaWNMaW5rRG9tYWluO1xuICByZXF1ZXN0LmNhbkhhbmRsZUNvZGVJbkFwcCA9IGFjdGlvbkNvZGVTZXR0aW5ncy5oYW5kbGVDb2RlSW5BcHA7XG5cbiAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncy5pT1MpIHtcbiAgICBfYXNzZXJ0KFxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmlPUy5idW5kbGVJZC5sZW5ndGggPiAwLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuTUlTU0lOR19JT1NfQlVORExFX0lEXG4gICAgKTtcbiAgICByZXF1ZXN0LmlPU0J1bmRsZUlkID0gYWN0aW9uQ29kZVNldHRpbmdzLmlPUy5idW5kbGVJZDtcbiAgfVxuXG4gIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZCkge1xuICAgIF9hc3NlcnQoXG4gICAgICBhY3Rpb25Db2RlU2V0dGluZ3MuYW5kcm9pZC5wYWNrYWdlTmFtZS5sZW5ndGggPiAwLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuTUlTU0lOR19BTkRST0lEX1BBQ0tBR0VfTkFNRVxuICAgICk7XG4gICAgcmVxdWVzdC5hbmRyb2lkSW5zdGFsbEFwcCA9IGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLmluc3RhbGxBcHA7XG4gICAgcmVxdWVzdC5hbmRyb2lkTWluaW11bVZlcnNpb25Db2RlID1cbiAgICAgIGFjdGlvbkNvZGVTZXR0aW5ncy5hbmRyb2lkLm1pbmltdW1WZXJzaW9uO1xuICAgIHJlcXVlc3QuYW5kcm9pZFBhY2thZ2VOYW1lID0gYWN0aW9uQ29kZVNldHRpbmdzLmFuZHJvaWQucGFja2FnZU5hbWU7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBY3Rpb25Db2RlSW5mbyxcbiAgQWN0aW9uQ29kZU9wZXJhdGlvbixcbiAgQWN0aW9uQ29kZVNldHRpbmdzLFxuICBBdXRoLFxuICBVc2VyQ3JlZGVudGlhbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgKiBhcyBhY2NvdW50IGZyb20gJy4uLy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCAqIGFzIGF1dGhlbnRpY2F0aW9uIGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHsgc2lnblVwLCBTaWduVXBSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL3NpZ25fdXAnO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JJbmZvSW1wbCB9IGZyb20gJy4uLy4uL21mYS9tZmFfaW5mbyc7XG5pbXBvcnQgeyBFbWFpbEF1dGhQcm92aWRlciB9IGZyb20gJy4uL3Byb3ZpZGVycy9lbWFpbCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEltcGwgfSBmcm9tICcuLi91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0IH0gZnJvbSAnLi9hY3Rpb25fY29kZV9zZXR0aW5ncyc7XG5pbXBvcnQgeyBzaWduSW5XaXRoQ3JlZGVudGlhbCB9IGZyb20gJy4vY3JlZGVudGlhbCc7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IE9wZXJhdGlvblR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5pbXBvcnQgeyBoYW5kbGVSZWNhcHRjaGFGbG93IH0gZnJvbSAnLi4vLi4vcGxhdGZvcm1fYnJvd3Nlci9yZWNhcHRjaGEvcmVjYXB0Y2hhX2VudGVycHJpc2VfdmVyaWZpZXInO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgUmVjYXB0Y2hhQWN0aW9uTmFtZSwgUmVjYXB0Y2hhQ2xpZW50VHlwZSB9IGZyb20gJy4uLy4uL2FwaSc7XG5cbi8qKlxuICogVXBkYXRlcyB0aGUgcGFzc3dvcmQgcG9saWN5IGNhY2hlZCBpbiB0aGUge0BsaW5rIEF1dGh9IGluc3RhbmNlIGlmIGEgcG9saWN5IGlzIGFscmVhZHlcbiAqIGNhY2hlZCBmb3IgdGhlIHByb2plY3Qgb3IgdGVuYW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBXZSBvbmx5IGZldGNoIHRoZSBwYXNzd29yZCBwb2xpY3kgaWYgdGhlIHBhc3N3b3JkIGRpZCBub3QgbWVldCBwb2xpY3kgcmVxdWlyZW1lbnRzIGFuZFxuICogdGhlcmUgaXMgYW4gZXhpc3RpbmcgcG9saWN5IGNhY2hlZC4gQSBkZXZlbG9wZXIgbXVzdCBjYWxsIHZhbGlkYXRlUGFzc3dvcmQgYXQgbGVhc3RcbiAqIG9uY2UgZm9yIHRoZSBjYWNoZSB0byBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlY2FjaGVQYXNzd29yZFBvbGljeShhdXRoOiBBdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgaWYgKGF1dGhJbnRlcm5hbC5fZ2V0UGFzc3dvcmRQb2xpY3lJbnRlcm5hbCgpKSB7XG4gICAgYXdhaXQgYXV0aEludGVybmFsLl91cGRhdGVQYXNzd29yZFBvbGljeSgpO1xuICB9XG59XG5cbi8qKlxuICogU2VuZHMgYSBwYXNzd29yZCByZXNldCBlbWFpbCB0byB0aGUgZ2l2ZW4gZW1haWwgYWRkcmVzcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8gY29tcGxldGUgdGhlIHBhc3N3b3JkIHJlc2V0LCBjYWxsIHtAbGluayBjb25maXJtUGFzc3dvcmRSZXNldH0gd2l0aCB0aGUgY29kZSBzdXBwbGllZCBpblxuICogdGhlIGVtYWlsIHNlbnQgdG8gdGhlIHVzZXIsIGFsb25nIHdpdGggdGhlIG5ldyBwYXNzd29yZCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgc2VuZFBhc3N3b3JkUmVzZXRFbWFpbChhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XG4gKiAvLyBPYnRhaW4gY29kZSBmcm9tIHVzZXIuXG4gKiBhd2FpdCBjb25maXJtUGFzc3dvcmRSZXNldCgndXNlckBleGFtcGxlLmNvbScsIGNvZGUpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIGFjdGlvbkNvZGVTZXR0aW5ncyAtIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVNldHRpbmdzfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kUGFzc3dvcmRSZXNldEVtYWlsKFxuICBhdXRoOiBBdXRoLFxuICBlbWFpbDogc3RyaW5nLFxuICBhY3Rpb25Db2RlU2V0dGluZ3M/OiBBY3Rpb25Db2RlU2V0dGluZ3Ncbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGNvbnN0IHJlcXVlc3Q6IGF1dGhlbnRpY2F0aW9uLlBhc3N3b3JkUmVzZXRSZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlBBU1NXT1JEX1JFU0VULFxuICAgIGVtYWlsLFxuICAgIGNsaWVudFR5cGU6IFJlY2FwdGNoYUNsaWVudFR5cGUuV0VCXG4gIH07XG4gIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcbiAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KGF1dGhJbnRlcm5hbCwgcmVxdWVzdCwgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAgfVxuICBhd2FpdCBoYW5kbGVSZWNhcHRjaGFGbG93KFxuICAgIGF1dGhJbnRlcm5hbCxcbiAgICByZXF1ZXN0LFxuICAgIFJlY2FwdGNoYUFjdGlvbk5hbWUuR0VUX09PQl9DT0RFLFxuICAgIGF1dGhlbnRpY2F0aW9uLnNlbmRQYXNzd29yZFJlc2V0RW1haWxcbiAgKTtcbn1cblxuLyoqXG4gKiBDb21wbGV0ZXMgdGhlIHBhc3N3b3JkIHJlc2V0IHByb2Nlc3MsIGdpdmVuIGEgY29uZmlybWF0aW9uIGNvZGUgYW5kIG5ldyBwYXNzd29yZC5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gb29iQ29kZSAtIEEgY29uZmlybWF0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cbiAqIEBwYXJhbSBuZXdQYXNzd29yZCAtIFRoZSBuZXcgcGFzc3dvcmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29uZmlybVBhc3N3b3JkUmVzZXQoXG4gIGF1dGg6IEF1dGgsXG4gIG9vYkNvZGU6IHN0cmluZyxcbiAgbmV3UGFzc3dvcmQ6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFjY291bnRcbiAgICAucmVzZXRQYXNzd29yZChnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCksIHtcbiAgICAgIG9vYkNvZGUsXG4gICAgICBuZXdQYXNzd29yZFxuICAgIH0pXG4gICAgLmNhdGNoKGFzeW5jIGVycm9yID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZXJyb3IuY29kZSA9PT1cbiAgICAgICAgYGF1dGgvJHtBdXRoRXJyb3JDb2RlLlBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTfWBcbiAgICAgICkge1xuICAgICAgICB2b2lkIHJlY2FjaGVQYXNzd29yZFBvbGljeShhdXRoKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSk7XG4gIC8vIERvIG5vdCByZXR1cm4gdGhlIGVtYWlsLlxufVxuXG4vKipcbiAqIEFwcGxpZXMgYSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyIGJ5IGVtYWlsIG9yIG90aGVyIG91dC1vZi1iYW5kIG1lY2hhbmlzbS5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gb29iQ29kZSAtIEEgdmVyaWZpY2F0aW9uIGNvZGUgc2VudCB0byB0aGUgdXNlci5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhcHBseUFjdGlvbkNvZGUoXG4gIGF1dGg6IEF1dGgsXG4gIG9vYkNvZGU6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IGFjY291bnQuYXBwbHlBY3Rpb25Db2RlKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgeyBvb2JDb2RlIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIHZlcmlmaWNhdGlvbiBjb2RlIHNlbnQgdG8gdGhlIHVzZXIgYnkgZW1haWwgb3Igb3RoZXIgb3V0LW9mLWJhbmQgbWVjaGFuaXNtLlxuICpcbiAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvb2JDb2RlIC0gQSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrQWN0aW9uQ29kZShcbiAgYXV0aDogQXV0aCxcbiAgb29iQ29kZTogc3RyaW5nXG4pOiBQcm9taXNlPEFjdGlvbkNvZGVJbmZvPiB7XG4gIGNvbnN0IGF1dGhNb2R1bGFyID0gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFjY291bnQucmVzZXRQYXNzd29yZChhdXRoTW9kdWxhciwgeyBvb2JDb2RlIH0pO1xuXG4gIC8vIEVtYWlsIGNvdWxkIGJlIGVtcHR5IG9ubHkgaWYgdGhlIHJlcXVlc3QgdHlwZSBpcyBFTUFJTF9TSUdOSU4gb3JcbiAgLy8gVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwuXG4gIC8vIE5ldyBlbWFpbCBzaG91bGQgbm90IGJlIGVtcHR5IGlmIHRoZSByZXF1ZXN0IHR5cGUgaXNcbiAgLy8gVkVSSUZZX0FORF9DSEFOR0VfRU1BSUwuXG4gIC8vIE11bHRpLWZhY3RvciBpbmZvIGNvdWxkIG5vdCBiZSBlbXB0eSBpZiB0aGUgcmVxdWVzdCB0eXBlIGlzXG4gIC8vIFJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OLlxuICBjb25zdCBvcGVyYXRpb24gPSByZXNwb25zZS5yZXF1ZXN0VHlwZTtcbiAgX2Fzc2VydChvcGVyYXRpb24sIGF1dGhNb2R1bGFyLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgc3dpdGNoIChvcGVyYXRpb24pIHtcbiAgICBjYXNlIEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOOlxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMOlxuICAgICAgX2Fzc2VydChyZXNwb25zZS5uZXdFbWFpbCwgYXV0aE1vZHVsYXIsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBBY3Rpb25Db2RlT3BlcmF0aW9uLlJFVkVSVF9TRUNPTkRfRkFDVE9SX0FERElUSU9OOlxuICAgICAgX2Fzc2VydChyZXNwb25zZS5tZmFJbmZvLCBhdXRoTW9kdWxhciwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgLy8gZmFsbCB0aHJvdWdoXG4gICAgZGVmYXVsdDpcbiAgICAgIF9hc3NlcnQocmVzcG9uc2UuZW1haWwsIGF1dGhNb2R1bGFyLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgfVxuXG4gIC8vIFRoZSBtdWx0aS1mYWN0b3IgaW5mbyBmb3IgcmV2ZXJ0IHNlY29uZCBmYWN0b3IgYWRkaXRpb25cbiAgbGV0IG11bHRpRmFjdG9ySW5mbzogTXVsdGlGYWN0b3JJbmZvSW1wbCB8IG51bGwgPSBudWxsO1xuICBpZiAocmVzcG9uc2UubWZhSW5mbykge1xuICAgIG11bHRpRmFjdG9ySW5mbyA9IE11bHRpRmFjdG9ySW5mb0ltcGwuX2Zyb21TZXJ2ZXJSZXNwb25zZShcbiAgICAgIF9jYXN0QXV0aChhdXRoTW9kdWxhciksXG4gICAgICByZXNwb25zZS5tZmFJbmZvXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZGF0YToge1xuICAgICAgZW1haWw6XG4gICAgICAgIChyZXNwb25zZS5yZXF1ZXN0VHlwZSA9PT0gQWN0aW9uQ29kZU9wZXJhdGlvbi5WRVJJRllfQU5EX0NIQU5HRV9FTUFJTFxuICAgICAgICAgID8gcmVzcG9uc2UubmV3RW1haWxcbiAgICAgICAgICA6IHJlc3BvbnNlLmVtYWlsKSB8fCBudWxsLFxuICAgICAgcHJldmlvdXNFbWFpbDpcbiAgICAgICAgKHJlc3BvbnNlLnJlcXVlc3RUeXBlID09PSBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMXG4gICAgICAgICAgPyByZXNwb25zZS5lbWFpbFxuICAgICAgICAgIDogcmVzcG9uc2UubmV3RW1haWwpIHx8IG51bGwsXG4gICAgICBtdWx0aUZhY3RvckluZm9cbiAgICB9LFxuICAgIG9wZXJhdGlvblxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyBhIHBhc3N3b3JkIHJlc2V0IGNvZGUgc2VudCB0byB0aGUgdXNlciBieSBlbWFpbCBvciBvdGhlciBvdXQtb2YtYmFuZCBtZWNoYW5pc20uXG4gKlxuICogQHJldHVybnMgdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzIGlmIHZhbGlkLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBjb2RlIC0gQSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeVBhc3N3b3JkUmVzZXRDb2RlKFxuICBhdXRoOiBBdXRoLFxuICBjb2RlOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgY2hlY2tBY3Rpb25Db2RlKGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSwgY29kZSk7XG4gIC8vIEVtYWlsIHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCBzaW5jZSBhIGNvZGUgd2FzIHNlbnQgdG8gaXRcbiAgcmV0dXJuIGRhdGEuZW1haWwhO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdXNlciBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGVtYWlsIGFkZHJlc3MgYW5kIHBhc3N3b3JkLlxuICpcbiAqIEByZW1hcmtzXG4gKiBPbiBzdWNjZXNzZnVsIGNyZWF0aW9uIG9mIHRoZSB1c2VyIGFjY291bnQsIHRoaXMgdXNlciB3aWxsIGFsc28gYmUgc2lnbmVkIGluIHRvIHlvdXIgYXBwbGljYXRpb24uXG4gKlxuICogVXNlciBhY2NvdW50IGNyZWF0aW9uIGNhbiBmYWlsIGlmIHRoZSBhY2NvdW50IGFscmVhZHkgZXhpc3RzIG9yIHRoZSBwYXNzd29yZCBpcyBpbnZhbGlkLlxuICpcbiAqIE5vdGU6IFRoZSBlbWFpbCBhZGRyZXNzIGFjdHMgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgYW5kIGVuYWJsZXMgYW4gZW1haWwtYmFzZWRcbiAqIHBhc3N3b3JkIHJlc2V0LiBUaGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIGEgbmV3IHVzZXIgYWNjb3VudCBhbmQgc2V0IHRoZSBpbml0aWFsIHVzZXIgcGFzc3dvcmQuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIHBhc3N3b3JkIC0gVGhlIHVzZXIncyBjaG9zZW4gcGFzc3dvcmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKFxuICBhdXRoOiBBdXRoLFxuICBlbWFpbDogc3RyaW5nLFxuICBwYXNzd29yZDogc3RyaW5nXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gIGNvbnN0IGF1dGhJbnRlcm5hbCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgY29uc3QgcmVxdWVzdDogU2lnblVwUmVxdWVzdCA9IHtcbiAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcbiAgICBlbWFpbCxcbiAgICBwYXNzd29yZCxcbiAgICBjbGllbnRUeXBlOiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQlxuICB9O1xuICBjb25zdCBzaWduVXBSZXNwb25zZTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+ID0gaGFuZGxlUmVjYXB0Y2hhRmxvdyhcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgcmVxdWVzdCxcbiAgICBSZWNhcHRjaGFBY3Rpb25OYW1lLlNJR05fVVBfUEFTU1dPUkQsXG4gICAgc2lnblVwXG4gICk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2lnblVwUmVzcG9uc2UuY2F0Y2goZXJyb3IgPT4ge1xuICAgIGlmIChcbiAgICAgIGVycm9yLmNvZGUgPT09IGBhdXRoLyR7QXV0aEVycm9yQ29kZS5QQVNTV09SRF9ET0VTX05PVF9NRUVUX1JFUVVJUkVNRU5UU31gXG4gICAgKSB7XG4gICAgICB2b2lkIHJlY2FjaGVQYXNzd29yZFBvbGljeShhdXRoKTtcbiAgICB9XG5cbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG5cbiAgY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBVc2VyQ3JlZGVudGlhbEltcGwuX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gICAgYXV0aEludGVybmFsLFxuICAgIE9wZXJhdGlvblR5cGUuU0lHTl9JTixcbiAgICByZXNwb25zZVxuICApO1xuICBhd2FpdCBhdXRoSW50ZXJuYWwuX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xuXG4gIHJldHVybiB1c2VyQ3JlZGVudGlhbDtcbn1cblxuLyoqXG4gKiBBc3luY2hyb25vdXNseSBzaWducyBpbiB1c2luZyBhbiBlbWFpbCBhbmQgcGFzc3dvcmQuXG4gKlxuICogQHJlbWFya3NcbiAqIEZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIGVtYWlsIGFkZHJlc3MgYW5kIHBhc3N3b3JkIGRvIG5vdCBtYXRjaC5cbiAqXG4gKiBOb3RlOiBUaGUgdXNlcidzIHBhc3N3b3JkIGlzIE5PVCB0aGUgcGFzc3dvcmQgdXNlZCB0byBhY2Nlc3MgdGhlIHVzZXIncyBlbWFpbCBhY2NvdW50LiBUaGVcbiAqIGVtYWlsIGFkZHJlc3Mgc2VydmVzIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyLCBhbmQgdGhlIHBhc3N3b3JkIGlzIHVzZWQgdG8gYWNjZXNzXG4gKiB0aGUgdXNlcidzIGFjY291bnQgaW4geW91ciBGaXJlYmFzZSBwcm9qZWN0LiBTZWUgYWxzbzoge0BsaW5rIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZH0uXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXJzIGVtYWlsIGFkZHJlc3MuXG4gKiBAcGFyYW0gcGFzc3dvcmQgLSBUaGUgdXNlcnMgcGFzc3dvcmQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmcsXG4gIHBhc3N3b3JkOiBzdHJpbmdcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgcmV0dXJuIHNpZ25JbldpdGhDcmVkZW50aWFsKFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSxcbiAgICBFbWFpbEF1dGhQcm92aWRlci5jcmVkZW50aWFsKGVtYWlsLCBwYXNzd29yZClcbiAgKS5jYXRjaChhc3luYyBlcnJvciA9PiB7XG4gICAgaWYgKFxuICAgICAgZXJyb3IuY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLlBBU1NXT1JEX0RPRVNfTk9UX01FRVRfUkVRVUlSRU1FTlRTfWBcbiAgICApIHtcbiAgICAgIHZvaWQgcmVjYWNoZVBhc3N3b3JkUG9saWN5KGF1dGgpO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBY3Rpb25Db2RlT3BlcmF0aW9uLFxuICBBY3Rpb25Db2RlU2V0dGluZ3MsXG4gIEF1dGgsXG4gIFVzZXJDcmVkZW50aWFsXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7IEFjdGlvbkNvZGVVUkwgfSBmcm9tICcuLi9hY3Rpb25fY29kZV91cmwnO1xuaW1wb3J0IHsgRW1haWxBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi9wcm92aWRlcnMvZW1haWwnO1xuaW1wb3J0IHsgX2dldEN1cnJlbnRVcmwgfSBmcm9tICcuLi91dGlsL2xvY2F0aW9uJztcbmltcG9ydCB7IF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QgfSBmcm9tICcuL2FjdGlvbl9jb2RlX3NldHRpbmdzJztcbmltcG9ydCB7IHNpZ25JbldpdGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFsJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IGhhbmRsZVJlY2FwdGNoYUZsb3cgfSBmcm9tICcuLi8uLi9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGFfZW50ZXJwcmlzZV92ZXJpZmllcic7XG5pbXBvcnQgeyBSZWNhcHRjaGFBY3Rpb25OYW1lLCBSZWNhcHRjaGFDbGllbnRUeXBlIH0gZnJvbSAnLi4vLi4vYXBpJztcblxuLyoqXG4gKiBTZW5kcyBhIHNpZ24taW4gZW1haWwgbGluayB0byB0aGUgdXNlciB3aXRoIHRoZSBzcGVjaWZpZWQgZW1haWwuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoZSBzaWduLWluIG9wZXJhdGlvbiBoYXMgdG8gYWx3YXlzIGJlIGNvbXBsZXRlZCBpbiB0aGUgYXBwIHVubGlrZSBvdGhlciBvdXQgb2YgYmFuZCBlbWFpbFxuICogYWN0aW9ucyAocGFzc3dvcmQgcmVzZXQgYW5kIGVtYWlsIHZlcmlmaWNhdGlvbnMpLiBUaGlzIGlzIGJlY2F1c2UsIGF0IHRoZSBlbmQgb2YgdGhlIGZsb3csXG4gKiB0aGUgdXNlciBpcyBleHBlY3RlZCB0byBiZSBzaWduZWQgaW4gYW5kIHRoZWlyIEF1dGggc3RhdGUgcGVyc2lzdGVkIHdpdGhpbiB0aGUgYXBwLlxuICpcbiAqIFRvIGNvbXBsZXRlIHNpZ24gaW4gd2l0aCB0aGUgZW1haWwgbGluaywgY2FsbCB7QGxpbmsgc2lnbkluV2l0aEVtYWlsTGlua30gd2l0aCB0aGUgZW1haWxcbiAqIGFkZHJlc3MgYW5kIHRoZSBlbWFpbCBsaW5rIHN1cHBsaWVkIGluIHRoZSBlbWFpbCBzZW50IHRvIHRoZSB1c2VyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBjb25zdCBhY3Rpb25Db2RlU2V0dGluZ3MgPSB7XG4gKiAgIHVybDogJ2h0dHBzOi8vd3d3LmV4YW1wbGUuY29tLz9lbWFpbD11c2VyQGV4YW1wbGUuY29tJyxcbiAqICAgaU9TOiB7XG4gKiAgICAgIGJ1bmRsZUlkOiAnY29tLmV4YW1wbGUuaW9zJ1xuICogICB9LFxuICogICBhbmRyb2lkOiB7XG4gKiAgICAgcGFja2FnZU5hbWU6ICdjb20uZXhhbXBsZS5hbmRyb2lkJyxcbiAqICAgICBpbnN0YWxsQXBwOiB0cnVlLFxuICogICAgIG1pbmltdW1WZXJzaW9uOiAnMTInXG4gKiAgIH0sXG4gKiAgIGhhbmRsZUNvZGVJbkFwcDogdHJ1ZVxuICogfTtcbiAqIGF3YWl0IHNlbmRTaWduSW5MaW5rVG9FbWFpbChhdXRoLCAndXNlckBleGFtcGxlLmNvbScsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XG4gKiAvLyBPYnRhaW4gZW1haWxMaW5rIGZyb20gdGhlIHVzZXIuXG4gKiBpZihpc1NpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgZW1haWxMaW5rKSkge1xuICogICBhd2FpdCBzaWduSW5XaXRoRW1haWxMaW5rKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgZW1haWxMaW5rKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhdXRoSW50ZXJuYWwgLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIGFjdGlvbkNvZGVTZXR0aW5ncyAtIFRoZSB7QGxpbmsgQWN0aW9uQ29kZVNldHRpbmdzfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZW5kU2lnbkluTGlua1RvRW1haWwoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmcsXG4gIGFjdGlvbkNvZGVTZXR0aW5nczogQWN0aW9uQ29kZVNldHRpbmdzXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBjb25zdCByZXF1ZXN0OiBhcGkuRW1haWxTaWduSW5SZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLkVNQUlMX1NJR05JTixcbiAgICBlbWFpbCxcbiAgICBjbGllbnRUeXBlOiBSZWNhcHRjaGFDbGllbnRUeXBlLldFQlxuICB9O1xuICBmdW5jdGlvbiBzZXRBY3Rpb25Db2RlU2V0dGluZ3MoXG4gICAgcmVxdWVzdDogYXBpLkVtYWlsU2lnbkluUmVxdWVzdCxcbiAgICBhY3Rpb25Db2RlU2V0dGluZ3M6IEFjdGlvbkNvZGVTZXR0aW5nc1xuICApOiB2b2lkIHtcbiAgICBfYXNzZXJ0KFxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzLmhhbmRsZUNvZGVJbkFwcCxcbiAgICAgIGF1dGhJbnRlcm5hbCxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcbiAgICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoXG4gICAgICAgIGF1dGhJbnRlcm5hbCxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgYWN0aW9uQ29kZVNldHRpbmdzXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBzZXRBY3Rpb25Db2RlU2V0dGluZ3MocmVxdWVzdCwgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAgYXdhaXQgaGFuZGxlUmVjYXB0Y2hhRmxvdyhcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgcmVxdWVzdCxcbiAgICBSZWNhcHRjaGFBY3Rpb25OYW1lLkdFVF9PT0JfQ09ERSxcbiAgICBhcGkuc2VuZFNpZ25JbkxpbmtUb0VtYWlsXG4gICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGluY29taW5nIGxpbmsgaXMgYSBzaWduLWluIHdpdGggZW1haWwgbGluayBzdWl0YWJsZSBmb3Ige0BsaW5rIHNpZ25JbldpdGhFbWFpbExpbmt9LlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBlbWFpbExpbmsgLSBUaGUgbGluayBzZW50IHRvIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NpZ25JbldpdGhFbWFpbExpbmsoYXV0aDogQXV0aCwgZW1haWxMaW5rOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0aW9uQ29kZVVybCA9IEFjdGlvbkNvZGVVUkwucGFyc2VMaW5rKGVtYWlsTGluayk7XG4gIHJldHVybiBhY3Rpb25Db2RlVXJsPy5vcGVyYXRpb24gPT09IEFjdGlvbkNvZGVPcGVyYXRpb24uRU1BSUxfU0lHTklOO1xufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHVzaW5nIGFuIGVtYWlsIGFuZCBzaWduLWluIGVtYWlsIGxpbmsuXG4gKlxuICogQHJlbWFya3NcbiAqIElmIG5vIGxpbmsgaXMgcGFzc2VkLCB0aGUgbGluayBpcyBpbmZlcnJlZCBmcm9tIHRoZSBjdXJyZW50IFVSTC5cbiAqXG4gKiBGYWlscyB3aXRoIGFuIGVycm9yIGlmIHRoZSBlbWFpbCBhZGRyZXNzIGlzIGludmFsaWQgb3IgT1RQIGluIGVtYWlsIGxpbmsgZXhwaXJlcy5cbiAqXG4gKiBOb3RlOiBDb25maXJtIHRoZSBsaW5rIGlzIGEgc2lnbi1pbiBlbWFpbCBsaW5rIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kIGZpcmViYXNlLmF1dGguQXV0aC5pc1NpZ25JbldpdGhFbWFpbExpbmsuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgc2VuZFNpZ25JbkxpbmtUb0VtYWlsKGF1dGgsICd1c2VyQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAqIC8vIE9idGFpbiBlbWFpbExpbmsgZnJvbSB0aGUgdXNlci5cbiAqIGlmKGlzU2lnbkluV2l0aEVtYWlsTGluayhhdXRoLCBlbWFpbExpbmspKSB7XG4gKiAgIGF3YWl0IHNpZ25JbldpdGhFbWFpbExpbmsoYXV0aCwgJ3VzZXJAZXhhbXBsZS5jb20nLCBlbWFpbExpbmspO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICogQHBhcmFtIGVtYWlsTGluayAtIFRoZSBsaW5rIHNlbnQgdG8gdGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhFbWFpbExpbmsoXG4gIGF1dGg6IEF1dGgsXG4gIGVtYWlsOiBzdHJpbmcsXG4gIGVtYWlsTGluaz86IHN0cmluZ1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbD4ge1xuICBjb25zdCBhdXRoTW9kdWxhciA9IGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKTtcbiAgY29uc3QgY3JlZGVudGlhbCA9IEVtYWlsQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxXaXRoTGluayhcbiAgICBlbWFpbCxcbiAgICBlbWFpbExpbmsgfHwgX2dldEN1cnJlbnRVcmwoKVxuICApO1xuICAvLyBDaGVjayBpZiB0aGUgdGVuYW50IElEIGluIHRoZSBlbWFpbCBsaW5rIG1hdGNoZXMgdGhlIHRlbmFudCBJRCBvbiBBdXRoXG4gIC8vIGluc3RhbmNlLlxuICBfYXNzZXJ0KFxuICAgIGNyZWRlbnRpYWwuX3RlbmFudElkID09PSAoYXV0aE1vZHVsYXIudGVuYW50SWQgfHwgbnVsbCksXG4gICAgYXV0aE1vZHVsYXIsXG4gICAgQXV0aEVycm9yQ29kZS5URU5BTlRfSURfTUlTTUFUQ0hcbiAgKTtcbiAgcmV0dXJuIHNpZ25JbldpdGhDcmVkZW50aWFsKGF1dGhNb2R1bGFyLCBjcmVkZW50aWFsKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5LFxuICBfcGVyZm9ybUFwaVJlcXVlc3Rcbn0gZnJvbSAnLi4vaW5kZXgnO1xuaW1wb3J0IHsgQXV0aCB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlQXV0aFVyaVJlcXVlc3Qge1xuICBpZGVudGlmaWVyOiBzdHJpbmc7XG4gIGNvbnRpbnVlVXJpOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUF1dGhVcmlSZXNwb25zZSB7XG4gIHNpZ25pbk1ldGhvZHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aFVyaShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogQ3JlYXRlQXV0aFVyaVJlcXVlc3Rcbik6IFByb21pc2U8Q3JlYXRlQXV0aFVyaVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8Q3JlYXRlQXV0aFVyaVJlcXVlc3QsIENyZWF0ZUF1dGhVcmlSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuQ1JFQVRFX0FVVEhfVVJJLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEFjdGlvbkNvZGVPcGVyYXRpb24sXG4gIEFjdGlvbkNvZGVTZXR0aW5ncyxcbiAgQXV0aCxcbiAgVXNlclxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVBdXRoVXJpLFxuICBDcmVhdGVBdXRoVXJpUmVxdWVzdFxufSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vY3JlYXRlX2F1dGhfdXJpJztcbmltcG9ydCAqIGFzIGFwaSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vZW1haWxfYW5kX3Bhc3N3b3JkJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX2dldEN1cnJlbnRVcmwsIF9pc0h0dHBPckh0dHBzIH0gZnJvbSAnLi4vdXRpbC9sb2NhdGlvbic7XG5pbXBvcnQgeyBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0IH0gZnJvbSAnLi9hY3Rpb25fY29kZV9zZXR0aW5ncyc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbi8qKlxuICogR2V0cyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBzaWduIGluIG1ldGhvZHMgZm9yIHRoZSBnaXZlbiBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIGlzIHVzZWZ1bCB0byBkaWZmZXJlbnRpYXRlIG1ldGhvZHMgb2Ygc2lnbi1pbiBmb3IgdGhlIHNhbWUgcHJvdmlkZXIsIGVnLlxuICoge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aGljaCBoYXMgMiBtZXRob2RzIG9mIHNpZ24taW4sXG4gKiB7QGxpbmsgU2lnbkluTWV0aG9kfS5FTUFJTF9QQVNTV09SRCBhbmRcbiAqIHtAbGluayBTaWduSW5NZXRob2R9LkVNQUlMX0xJTksuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVtYWlsIC0gVGhlIHVzZXIncyBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZldGNoU2lnbkluTWV0aG9kc0ZvckVtYWlsKFxuICBhdXRoOiBBdXRoLFxuICBlbWFpbDogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIC8vIGNyZWF0ZUF1dGhVcmkgcmV0dXJucyBhbiBlcnJvciBpZiBjb250aW51ZSBVUkkgaXMgbm90IGh0dHAgb3IgaHR0cHMuXG4gIC8vIEZvciBlbnZpcm9ubWVudHMgbGlrZSBDb3Jkb3ZhLCBDaHJvbWUgZXh0ZW5zaW9ucywgbmF0aXZlIGZyYW1ld29ya3MsIGZpbGVcbiAgLy8gc3lzdGVtcywgZXRjLCB1c2UgaHR0cDovL2xvY2FsaG9zdCBhcyBjb250aW51ZSBVUkwuXG4gIGNvbnN0IGNvbnRpbnVlVXJpID0gX2lzSHR0cE9ySHR0cHMoKSA/IF9nZXRDdXJyZW50VXJsKCkgOiAnaHR0cDovL2xvY2FsaG9zdCc7XG4gIGNvbnN0IHJlcXVlc3Q6IENyZWF0ZUF1dGhVcmlSZXF1ZXN0ID0ge1xuICAgIGlkZW50aWZpZXI6IGVtYWlsLFxuICAgIGNvbnRpbnVlVXJpXG4gIH07XG5cbiAgY29uc3QgeyBzaWduaW5NZXRob2RzIH0gPSBhd2FpdCBjcmVhdGVBdXRoVXJpKFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKSxcbiAgICByZXF1ZXN0XG4gICk7XG5cbiAgcmV0dXJuIHNpZ25pbk1ldGhvZHMgfHwgW107XG59XG5cbi8qKlxuICogU2VuZHMgYSB2ZXJpZmljYXRpb24gZW1haWwgdG8gYSB1c2VyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgaXMgY29tcGxldGVkIGJ5IGNhbGxpbmcge0BsaW5rIGFwcGx5QWN0aW9uQ29kZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgc2VuZEVtYWlsVmVyaWZpY2F0aW9uKHVzZXIsIGFjdGlvbkNvZGVTZXR0aW5ncyk7XG4gKiAvLyBPYnRhaW4gY29kZSBmcm9tIHRoZSB1c2VyLlxuICogYXdhaXQgYXBwbHlBY3Rpb25Db2RlKGF1dGgsIGNvZGUpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBhY3Rpb25Db2RlU2V0dGluZ3MgLSBUaGUge0BsaW5rIEFjdGlvbkNvZGVTZXR0aW5nc30uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZEVtYWlsVmVyaWZpY2F0aW9uKFxuICB1c2VyOiBVc2VyLFxuICBhY3Rpb25Db2RlU2V0dGluZ3M/OiBBY3Rpb25Db2RlU2V0dGluZ3MgfCBudWxsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICBjb25zdCByZXF1ZXN0OiBhcGkuVmVyaWZ5RW1haWxSZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9FTUFJTCxcbiAgICBpZFRva2VuXG4gIH07XG4gIGlmIChhY3Rpb25Db2RlU2V0dGluZ3MpIHtcbiAgICBfc2V0QWN0aW9uQ29kZVNldHRpbmdzT25SZXF1ZXN0KFxuICAgICAgdXNlckludGVybmFsLmF1dGgsXG4gICAgICByZXF1ZXN0LFxuICAgICAgYWN0aW9uQ29kZVNldHRpbmdzXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHsgZW1haWwgfSA9IGF3YWl0IGFwaS5zZW5kRW1haWxWZXJpZmljYXRpb24odXNlckludGVybmFsLmF1dGgsIHJlcXVlc3QpO1xuXG4gIGlmIChlbWFpbCAhPT0gdXNlci5lbWFpbCkge1xuICAgIGF3YWl0IHVzZXIucmVsb2FkKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTZW5kcyBhIHZlcmlmaWNhdGlvbiBlbWFpbCB0byBhIG5ldyBlbWFpbCBhZGRyZXNzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGUgdXNlcidzIGVtYWlsIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgbmV3IG9uZSBhZnRlciBiZWluZyB2ZXJpZmllZC5cbiAqXG4gKiBJZiB5b3UgaGF2ZSBhIGN1c3RvbSBlbWFpbCBhY3Rpb24gaGFuZGxlciwgeW91IGNhbiBjb21wbGV0ZSB0aGUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgY2FsbGluZ1xuICoge0BsaW5rIGFwcGx5QWN0aW9uQ29kZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGNvbnN0IGFjdGlvbkNvZGVTZXR0aW5ncyA9IHtcbiAqICAgdXJsOiAnaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vP2VtYWlsPXVzZXJAZXhhbXBsZS5jb20nLFxuICogICBpT1M6IHtcbiAqICAgICAgYnVuZGxlSWQ6ICdjb20uZXhhbXBsZS5pb3MnXG4gKiAgIH0sXG4gKiAgIGFuZHJvaWQ6IHtcbiAqICAgICBwYWNrYWdlTmFtZTogJ2NvbS5leGFtcGxlLmFuZHJvaWQnLFxuICogICAgIGluc3RhbGxBcHA6IHRydWUsXG4gKiAgICAgbWluaW11bVZlcnNpb246ICcxMidcbiAqICAgfSxcbiAqICAgaGFuZGxlQ29kZUluQXBwOiB0cnVlXG4gKiB9O1xuICogYXdhaXQgdmVyaWZ5QmVmb3JlVXBkYXRlRW1haWwodXNlciwgJ25ld2VtYWlsQGV4YW1wbGUuY29tJywgYWN0aW9uQ29kZVNldHRpbmdzKTtcbiAqIC8vIE9idGFpbiBjb2RlIGZyb20gdGhlIHVzZXIuXG4gKiBhd2FpdCBhcHBseUFjdGlvbkNvZGUoYXV0aCwgY29kZSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIG5ld0VtYWlsIC0gVGhlIG5ldyBlbWFpbCBhZGRyZXNzIHRvIGJlIHZlcmlmaWVkIGJlZm9yZSB1cGRhdGUuXG4gKiBAcGFyYW0gYWN0aW9uQ29kZVNldHRpbmdzIC0gVGhlIHtAbGluayBBY3Rpb25Db2RlU2V0dGluZ3N9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHZlcmlmeUJlZm9yZVVwZGF0ZUVtYWlsKFxuICB1c2VyOiBVc2VyLFxuICBuZXdFbWFpbDogc3RyaW5nLFxuICBhY3Rpb25Db2RlU2V0dGluZ3M/OiBBY3Rpb25Db2RlU2V0dGluZ3MgfCBudWxsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICBjb25zdCByZXF1ZXN0OiBhcGkuVmVyaWZ5QW5kQ2hhbmdlRW1haWxSZXF1ZXN0ID0ge1xuICAgIHJlcXVlc3RUeXBlOiBBY3Rpb25Db2RlT3BlcmF0aW9uLlZFUklGWV9BTkRfQ0hBTkdFX0VNQUlMLFxuICAgIGlkVG9rZW4sXG4gICAgbmV3RW1haWxcbiAgfTtcbiAgaWYgKGFjdGlvbkNvZGVTZXR0aW5ncykge1xuICAgIF9zZXRBY3Rpb25Db2RlU2V0dGluZ3NPblJlcXVlc3QoXG4gICAgICB1c2VySW50ZXJuYWwuYXV0aCxcbiAgICAgIHJlcXVlc3QsXG4gICAgICBhY3Rpb25Db2RlU2V0dGluZ3NcbiAgICApO1xuICB9XG5cbiAgY29uc3QgeyBlbWFpbCB9ID0gYXdhaXQgYXBpLnZlcmlmeUFuZENoYW5nZUVtYWlsKHVzZXJJbnRlcm5hbC5hdXRoLCByZXF1ZXN0KTtcblxuICBpZiAoZW1haWwgIT09IHVzZXIuZW1haWwpIHtcbiAgICAvLyBJZiB0aGUgbG9jYWwgY29weSBvZiB0aGUgZW1haWwgb24gdXNlciBpcyBvdXRkYXRlZCwgcmVsb2FkIHRoZVxuICAgIC8vIHVzZXIuXG4gICAgYXdhaXQgdXNlci5yZWxvYWQoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEVuZHBvaW50LCBIdHRwTWV0aG9kLCBfcGVyZm9ybUFwaVJlcXVlc3QgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVQcm9maWxlUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBwaG90b1VybD86IHN0cmluZyB8IG51bGw7XG4gIHJldHVyblNlY3VyZVRva2VuOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZVByb2ZpbGVSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgcGhvdG9Vcmw/OiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZShcbiAgYXV0aDogQXV0aCxcbiAgcmVxdWVzdDogVXBkYXRlUHJvZmlsZVJlcXVlc3Rcbik6IFByb21pc2U8VXBkYXRlUHJvZmlsZVJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8VXBkYXRlUHJvZmlsZVJlcXVlc3QsIFVwZGF0ZVByb2ZpbGVSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU0VUX0FDQ09VTlRfSU5GTyxcbiAgICByZXF1ZXN0XG4gICk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7XG4gIHVwZGF0ZUVtYWlsUGFzc3dvcmQgYXMgYXBpVXBkYXRlRW1haWxQYXNzd29yZCxcbiAgVXBkYXRlRW1haWxQYXNzd29yZFJlcXVlc3Rcbn0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9lbWFpbF9hbmRfcGFzc3dvcmQnO1xuaW1wb3J0IHsgdXBkYXRlUHJvZmlsZSBhcyBhcGlVcGRhdGVQcm9maWxlIH0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9wcm9maWxlJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX2xvZ291dElmSW52YWxpZGF0ZWQgfSBmcm9tICcuL2ludmFsaWRhdGlvbic7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBQcm92aWRlcklkIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG4vKipcbiAqIFVwZGF0ZXMgYSB1c2VyJ3MgcHJvZmlsZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gcHJvZmlsZSAtIFRoZSBwcm9maWxlJ3MgYGRpc3BsYXlOYW1lYCBhbmQgYHBob3RvVVJMYCB0byB1cGRhdGUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHJvZmlsZShcbiAgdXNlcjogVXNlcixcbiAge1xuICAgIGRpc3BsYXlOYW1lLFxuICAgIHBob3RvVVJMOiBwaG90b1VybFxuICB9OiB7IGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDsgcGhvdG9VUkw/OiBzdHJpbmcgfCBudWxsIH1cbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZGlzcGxheU5hbWUgPT09IHVuZGVmaW5lZCAmJiBwaG90b1VybCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXJJbnRlcm5hbC5nZXRJZFRva2VuKCk7XG4gIGNvbnN0IHByb2ZpbGVSZXF1ZXN0ID0ge1xuICAgIGlkVG9rZW4sXG4gICAgZGlzcGxheU5hbWUsXG4gICAgcGhvdG9VcmwsXG4gICAgcmV0dXJuU2VjdXJlVG9rZW46IHRydWVcbiAgfTtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICB1c2VySW50ZXJuYWwsXG4gICAgYXBpVXBkYXRlUHJvZmlsZSh1c2VySW50ZXJuYWwuYXV0aCwgcHJvZmlsZVJlcXVlc3QpXG4gICk7XG5cbiAgdXNlckludGVybmFsLmRpc3BsYXlOYW1lID0gcmVzcG9uc2UuZGlzcGxheU5hbWUgfHwgbnVsbDtcbiAgdXNlckludGVybmFsLnBob3RvVVJMID0gcmVzcG9uc2UucGhvdG9VcmwgfHwgbnVsbDtcblxuICAvLyBVcGRhdGUgdGhlIHBhc3N3b3JkIHByb3ZpZGVyIGFzIHdlbGxcbiAgY29uc3QgcGFzc3dvcmRQcm92aWRlciA9IHVzZXJJbnRlcm5hbC5wcm92aWRlckRhdGEuZmluZChcbiAgICAoeyBwcm92aWRlcklkIH0pID0+IHByb3ZpZGVySWQgPT09IFByb3ZpZGVySWQuUEFTU1dPUkRcbiAgKTtcbiAgaWYgKHBhc3N3b3JkUHJvdmlkZXIpIHtcbiAgICBwYXNzd29yZFByb3ZpZGVyLmRpc3BsYXlOYW1lID0gdXNlckludGVybmFsLmRpc3BsYXlOYW1lO1xuICAgIHBhc3N3b3JkUHJvdmlkZXIucGhvdG9VUkwgPSB1c2VySW50ZXJuYWwucGhvdG9VUkw7XG4gIH1cblxuICBhd2FpdCB1c2VySW50ZXJuYWwuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KHJlc3BvbnNlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB1c2VyJ3MgZW1haWwgYWRkcmVzcy5cbiAqXG4gKiBAcmVtYXJrc1xuICogQW4gZW1haWwgd2lsbCBiZSBzZW50IHRvIHRoZSBvcmlnaW5hbCBlbWFpbCBhZGRyZXNzIChpZiBpdCB3YXMgc2V0KSB0aGF0IGFsbG93cyB0byByZXZva2UgdGhlXG4gKiBlbWFpbCBhZGRyZXNzIGNoYW5nZSwgaW4gb3JkZXIgdG8gcHJvdGVjdCB0aGVtIGZyb20gYWNjb3VudCBoaWphY2tpbmcuXG4gKlxuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHkgc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHkgc2lnbmVkXG4gKiBpbi4gSWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQsIGFzayB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgYWdhaW4gYW5kIHRoZW4gY2FsbFxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gbmV3RW1haWwgLSBUaGUgbmV3IGVtYWlsIGFkZHJlc3MuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRW1haWwodXNlcjogVXNlciwgbmV3RW1haWw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gdXBkYXRlRW1haWxPclBhc3N3b3JkKFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWwsXG4gICAgbmV3RW1haWwsXG4gICAgbnVsbFxuICApO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHVzZXIncyBwYXNzd29yZC5cbiAqXG4gKiBAcmVtYXJrc1xuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHkgc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHkgc2lnbmVkXG4gKiBpbi4gSWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQsIGFzayB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgYWdhaW4gYW5kIHRoZW4gY2FsbFxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gbmV3UGFzc3dvcmQgLSBUaGUgbmV3IHBhc3N3b3JkLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVBhc3N3b3JkKHVzZXI6IFVzZXIsIG5ld1Bhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIHVwZGF0ZUVtYWlsT3JQYXNzd29yZChcbiAgICBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsLFxuICAgIG51bGwsXG4gICAgbmV3UGFzc3dvcmRcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdXBkYXRlRW1haWxPclBhc3N3b3JkKFxuICB1c2VyOiBVc2VySW50ZXJuYWwsXG4gIGVtYWlsOiBzdHJpbmcgfCBudWxsLFxuICBwYXNzd29yZDogc3RyaW5nIHwgbnVsbFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgYXV0aCB9ID0gdXNlcjtcbiAgY29uc3QgaWRUb2tlbiA9IGF3YWl0IHVzZXIuZ2V0SWRUb2tlbigpO1xuICBjb25zdCByZXF1ZXN0OiBVcGRhdGVFbWFpbFBhc3N3b3JkUmVxdWVzdCA9IHtcbiAgICBpZFRva2VuLFxuICAgIHJldHVyblNlY3VyZVRva2VuOiB0cnVlXG4gIH07XG5cbiAgaWYgKGVtYWlsKSB7XG4gICAgcmVxdWVzdC5lbWFpbCA9IGVtYWlsO1xuICB9XG5cbiAgaWYgKHBhc3N3b3JkKSB7XG4gICAgcmVxdWVzdC5wYXNzd29yZCA9IHBhc3N3b3JkO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfbG9nb3V0SWZJbnZhbGlkYXRlZChcbiAgICB1c2VyLFxuICAgIGFwaVVwZGF0ZUVtYWlsUGFzc3dvcmQoYXV0aCwgcmVxdWVzdClcbiAgKTtcbiAgYXdhaXQgdXNlci5fdXBkYXRlVG9rZW5zSWZOZWNlc3NhcnkocmVzcG9uc2UsIC8qIHJlbG9hZCAqLyB0cnVlKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBZGRpdGlvbmFsVXNlckluZm8sIFVzZXJDcmVkZW50aWFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IElkVG9rZW5SZXNwb25zZSwgSWRUb2tlblJlc3BvbnNlS2luZCB9IGZyb20gJy4uLy4uL21vZGVsL2lkX3Rva2VuJztcbmltcG9ydCB7IF9wYXJzZVRva2VuIH0gZnJvbSAnLi9pZF90b2tlbl9yZXN1bHQnO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgUHJvdmlkZXJJZCB9IGZyb20gJy4uLy4uL21vZGVsL2VudW1zJztcblxuLyoqXG4gKiBQYXJzZSB0aGUgYEFkZGl0aW9uYWxVc2VySW5mb2AgZnJvbSB0aGUgSUQgdG9rZW4gcmVzcG9uc2UuXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gX2Zyb21JZFRva2VuUmVzcG9uc2UoXG4gIGlkVG9rZW5SZXNwb25zZT86IElkVG9rZW5SZXNwb25zZVxuKTogQWRkaXRpb25hbFVzZXJJbmZvIHwgbnVsbCB7XG4gIGlmICghaWRUb2tlblJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBwcm92aWRlcklkIH0gPSBpZFRva2VuUmVzcG9uc2U7XG4gIGNvbnN0IHByb2ZpbGUgPSBpZFRva2VuUmVzcG9uc2UucmF3VXNlckluZm9cbiAgICA/IEpTT04ucGFyc2UoaWRUb2tlblJlc3BvbnNlLnJhd1VzZXJJbmZvKVxuICAgIDoge307XG4gIGNvbnN0IGlzTmV3VXNlciA9XG4gICAgaWRUb2tlblJlc3BvbnNlLmlzTmV3VXNlciB8fFxuICAgIGlkVG9rZW5SZXNwb25zZS5raW5kID09PSBJZFRva2VuUmVzcG9uc2VLaW5kLlNpZ251cE5ld1VzZXI7XG4gIGlmICghcHJvdmlkZXJJZCAmJiBpZFRva2VuUmVzcG9uc2U/LmlkVG9rZW4pIHtcbiAgICBjb25zdCBzaWduSW5Qcm92aWRlciA9IF9wYXJzZVRva2VuKGlkVG9rZW5SZXNwb25zZS5pZFRva2VuKT8uZmlyZWJhc2U/LltcbiAgICAgICdzaWduX2luX3Byb3ZpZGVyJ1xuICAgIF07XG4gICAgaWYgKHNpZ25JblByb3ZpZGVyKSB7XG4gICAgICBjb25zdCBmaWx0ZXJlZFByb3ZpZGVySWQgPVxuICAgICAgICBzaWduSW5Qcm92aWRlciAhPT0gUHJvdmlkZXJJZC5BTk9OWU1PVVMgJiZcbiAgICAgICAgc2lnbkluUHJvdmlkZXIgIT09IFByb3ZpZGVySWQuQ1VTVE9NXG4gICAgICAgICAgPyAoc2lnbkluUHJvdmlkZXIgYXMgUHJvdmlkZXJJZClcbiAgICAgICAgICA6IG51bGw7XG4gICAgICAvLyBVc2VzIGdlbmVyaWMgY2xhc3MgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBsZWdhY3kgU0RLLlxuICAgICAgcmV0dXJuIG5ldyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgZmlsdGVyZWRQcm92aWRlcklkKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFwcm92aWRlcklkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc3dpdGNoIChwcm92aWRlcklkKSB7XG4gICAgY2FzZSBQcm92aWRlcklkLkZBQ0VCT09LOlxuICAgICAgcmV0dXJuIG5ldyBGYWNlYm9va0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb2ZpbGUpO1xuICAgIGNhc2UgUHJvdmlkZXJJZC5HSVRIVUI6XG4gICAgICByZXR1cm4gbmV3IEdpdGh1YkFkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb2ZpbGUpO1xuICAgIGNhc2UgUHJvdmlkZXJJZC5HT09HTEU6XG4gICAgICByZXR1cm4gbmV3IEdvb2dsZUFkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb2ZpbGUpO1xuICAgIGNhc2UgUHJvdmlkZXJJZC5UV0lUVEVSOlxuICAgICAgcmV0dXJuIG5ldyBUd2l0dGVyQWRkaXRpb25hbFVzZXJJbmZvKFxuICAgICAgICBpc05ld1VzZXIsXG4gICAgICAgIHByb2ZpbGUsXG4gICAgICAgIGlkVG9rZW5SZXNwb25zZS5zY3JlZW5OYW1lIHx8IG51bGxcbiAgICAgICk7XG4gICAgY2FzZSBQcm92aWRlcklkLkNVU1RPTTpcbiAgICBjYXNlIFByb3ZpZGVySWQuQU5PTllNT1VTOlxuICAgICAgcmV0dXJuIG5ldyBHZW5lcmljQWRkaXRpb25hbFVzZXJJbmZvKGlzTmV3VXNlciwgbnVsbCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyhpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUpO1xuICB9XG59XG5cbmNsYXNzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8gaW1wbGVtZW50cyBBZGRpdGlvbmFsVXNlckluZm8ge1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBpc05ld1VzZXI6IGJvb2xlYW4sXG4gICAgcmVhZG9ubHkgcHJvdmlkZXJJZDogUHJvdmlkZXJJZCB8IHN0cmluZyB8IG51bGwsXG4gICAgcmVhZG9ubHkgcHJvZmlsZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fVxuICApIHt9XG59XG5cbmNsYXNzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSBleHRlbmRzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBpc05ld1VzZXI6IGJvb2xlYW4sXG4gICAgcHJvdmlkZXJJZDogUHJvdmlkZXJJZCxcbiAgICBwcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByZWFkb25seSB1c2VybmFtZTogc3RyaW5nIHwgbnVsbFxuICApIHtcbiAgICBzdXBlcihpc05ld1VzZXIsIHByb3ZpZGVySWQsIHByb2ZpbGUpO1xuICB9XG59XG5cbmNsYXNzIEZhY2Vib29rQWRkaXRpb25hbFVzZXJJbmZvIGV4dGVuZHMgR2VuZXJpY0FkZGl0aW9uYWxVc2VySW5mbyB7XG4gIGNvbnN0cnVjdG9yKGlzTmV3VXNlcjogYm9vbGVhbiwgcHJvZmlsZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBzdXBlcihpc05ld1VzZXIsIFByb3ZpZGVySWQuRkFDRUJPT0ssIHByb2ZpbGUpO1xuICB9XG59XG5cbmNsYXNzIEdpdGh1YkFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSB7XG4gIGNvbnN0cnVjdG9yKGlzTmV3VXNlcjogYm9vbGVhbiwgcHJvZmlsZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBzdXBlcihcbiAgICAgIGlzTmV3VXNlcixcbiAgICAgIFByb3ZpZGVySWQuR0lUSFVCLFxuICAgICAgcHJvZmlsZSxcbiAgICAgIHR5cGVvZiBwcm9maWxlPy5sb2dpbiA9PT0gJ3N0cmluZycgPyBwcm9maWxlPy5sb2dpbiA6IG51bGxcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEdvb2dsZUFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEdlbmVyaWNBZGRpdGlvbmFsVXNlckluZm8ge1xuICBjb25zdHJ1Y3Rvcihpc05ld1VzZXI6IGJvb2xlYW4sIHByb2ZpbGU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgc3VwZXIoaXNOZXdVc2VyLCBQcm92aWRlcklkLkdPT0dMRSwgcHJvZmlsZSk7XG4gIH1cbn1cblxuY2xhc3MgVHdpdHRlckFkZGl0aW9uYWxVc2VySW5mbyBleHRlbmRzIEZlZGVyYXRlZEFkZGl0aW9uYWxVc2VySW5mb1dpdGhVc2VybmFtZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIGlzTmV3VXNlcjogYm9vbGVhbixcbiAgICBwcm9maWxlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBzY3JlZW5OYW1lOiBzdHJpbmcgfCBudWxsXG4gICkge1xuICAgIHN1cGVyKGlzTmV3VXNlciwgUHJvdmlkZXJJZC5UV0lUVEVSLCBwcm9maWxlLCBzY3JlZW5OYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIEV4dHJhY3RzIHByb3ZpZGVyIHNwZWNpZmljIHtAbGluayBBZGRpdGlvbmFsVXNlckluZm99IGZvciB0aGUgZ2l2ZW4gY3JlZGVudGlhbC5cbiAqXG4gKiBAcGFyYW0gdXNlckNyZWRlbnRpYWwgLSBUaGUgdXNlciBjcmVkZW50aWFsLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFkZGl0aW9uYWxVc2VySW5mbyhcbiAgdXNlckNyZWRlbnRpYWw6IFVzZXJDcmVkZW50aWFsXG4pOiBBZGRpdGlvbmFsVXNlckluZm8gfCBudWxsIHtcbiAgY29uc3QgeyB1c2VyLCBfdG9rZW5SZXNwb25zZSB9ID0gdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbDtcbiAgaWYgKHVzZXIuaXNBbm9ueW1vdXMgJiYgIV90b2tlblJlc3BvbnNlKSB7XG4gICAgLy8gSGFuZGxlIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgc2lnbkluQW5vbnltb3VzbHkoKSBnZXRzIGNhbGxlZCB0d2ljZS5cbiAgICAvLyBObyBuZXR3b3JrIGNhbGwgaXMgbWFkZSBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gYWN0dWFsbHkgZmlsbCB0aGlzIGluXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3ZpZGVySWQ6IG51bGwsXG4gICAgICBpc05ld1VzZXI6IGZhbHNlLFxuICAgICAgcHJvZmlsZTogbnVsbFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gX2Zyb21JZFRva2VuUmVzcG9uc2UoX3Rva2VuUmVzcG9uc2UpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7XG4gIEF1dGgsXG4gIE5leHRPck9ic2VydmVyLFxuICBQZXJzaXN0ZW5jZSxcbiAgVXNlcixcbiAgQ29tcGxldGVGbixcbiAgRXJyb3JGbixcbiAgVW5zdWJzY3JpYmUsXG4gIFBhc3N3b3JkVmFsaWRhdGlvblN0YXR1c1xufSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgX2luaXRpYWxpemVSZWNhcHRjaGFDb25maWcgfSBmcm9tICcuLi9wbGF0Zm9ybV9icm93c2VyL3JlY2FwdGNoYS9yZWNhcHRjaGFfZW50ZXJwcmlzZV92ZXJpZmllcic7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcblxuZXhwb3J0IHtcbiAgZGVidWdFcnJvck1hcCxcbiAgcHJvZEVycm9yTWFwLFxuICBBVVRIX0VSUk9SX0NPREVTX01BUF9ET19OT1RfVVNFX0lOVEVSTkFMTFkgYXMgQXV0aEVycm9yQ29kZXNcbn0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBOb24tb3B0aW9uYWwgYXV0aCBtZXRob2RzLlxuLyoqXG4gKiBDaGFuZ2VzIHRoZSB0eXBlIG9mIHBlcnNpc3RlbmNlIG9uIHRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgZm9yIHRoZSBjdXJyZW50bHkgc2F2ZWRcbiAqIGBBdXRoYCBzZXNzaW9uIGFuZCBhcHBsaWVzIHRoaXMgdHlwZSBvZiBwZXJzaXN0ZW5jZSBmb3IgZnV0dXJlIHNpZ24taW4gcmVxdWVzdHMsIGluY2x1ZGluZ1xuICogc2lnbi1pbiB3aXRoIHJlZGlyZWN0IHJlcXVlc3RzLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciBzaWduaW5nIGluIHRvIHNwZWNpZnkgd2hldGhlciB0aGVpciBzZXNzaW9uIHNob3VsZCBiZVxuICogcmVtZW1iZXJlZCBvciBub3QuIEl0IGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIG5ldmVyIHBlcnNpc3QgdGhlIGBBdXRoYCBzdGF0ZSBmb3IgYXBwbGljYXRpb25zXG4gKiB0aGF0IGFyZSBzaGFyZWQgYnkgb3RoZXIgdXNlcnMgb3IgaGF2ZSBzZW5zaXRpdmUgZGF0YS5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogc2V0UGVyc2lzdGVuY2UoYXV0aCwgYnJvd3NlclNlc3Npb25QZXJzaXN0ZW5jZSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGVyc2lzdGVuY2UgLSBUaGUge0BsaW5rIFBlcnNpc3RlbmNlfSB0byB1c2UuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBlcnNpc3RlbmNlIGNoYW5nZSBoYXMgY29tcGxldGVkXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UGVyc2lzdGVuY2UoXG4gIGF1dGg6IEF1dGgsXG4gIHBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkuc2V0UGVyc2lzdGVuY2UocGVyc2lzdGVuY2UpO1xufVxuXG4vKipcbiAqIExvYWRzIHRoZSByZUNBUFRDSEEgY29uZmlndXJhdGlvbiBpbnRvIHRoZSBgQXV0aGAgaW5zdGFuY2UuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgd2lsbCBsb2FkIHRoZSByZUNBUFRDSEEgY29uZmlnLCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVDQVBUQ0hBXG4gKiB2ZXJpZmljYXRpb24gZmxvdyBzaG91bGQgYmUgdHJpZ2dlcmVkIGZvciBlYWNoIGF1dGggcHJvdmlkZXIsIGludG8gdGhlXG4gKiBjdXJyZW50IEF1dGggc2Vzc2lvbi5cbiAqXG4gKiBJZiBpbml0aWFsaXplUmVjYXB0Y2hhQ29uZmlnKCkgaXMgbm90IGludm9rZWQsIHRoZSBhdXRoIGZsb3cgd2lsbCBhbHdheXMgc3RhcnRcbiAqIHdpdGhvdXQgcmVDQVBUQ0hBIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHByb3ZpZGVyIGlzIGNvbmZpZ3VyZWQgdG8gcmVxdWlyZSByZUNBUFRDSEFcbiAqIHZlcmlmaWNhdGlvbiwgdGhlIFNESyB3aWxsIHRyYW5zcGFyZW50bHkgbG9hZCB0aGUgcmVDQVBUQ0hBIGNvbmZpZyBhbmQgcmVzdGFydCB0aGVcbiAqIGF1dGggZmxvd3MuXG4gKlxuICogVGh1cywgYnkgY2FsbGluZyB0aGlzIG9wdGlvbmFsIG1ldGhvZCwgeW91IHdpbGwgcmVkdWNlIHRoZSBsYXRlbmN5IG9mIGZ1dHVyZSBhdXRoIGZsb3dzLlxuICogTG9hZGluZyB0aGUgcmVDQVBUQ0hBIGNvbmZpZyBlYXJseSB3aWxsIGFsc28gZW5oYW5jZSB0aGUgc2lnbmFsIGNvbGxlY3RlZCBieSByZUNBUFRDSEEuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGluaXRpYWxpemVSZWNhcHRjaGFDb25maWcoYXV0aCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZyhhdXRoOiBBdXRoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBfaW5pdGlhbGl6ZVJlY2FwdGNoYUNvbmZpZyhhdXRoKTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIHBhc3N3b3JkIGFnYWluc3QgdGhlIHBhc3N3b3JkIHBvbGljeSBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdCBvciB0ZW5hbnQuXG4gKlxuICogQHJlbWFya3NcbiAqIElmIG5vIHRlbmFudCBJRCBpcyBzZXQgb24gdGhlIGBBdXRoYCBpbnN0YW5jZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgcGFzc3dvcmRcbiAqIHBvbGljeSBjb25maWd1cmVkIGZvciB0aGUgcHJvamVjdC4gT3RoZXJ3aXNlLCB0aGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgcG9saWN5IGNvbmZpZ3VyZWRcbiAqIGZvciB0aGUgdGVuYW50LiBJZiBhIHBhc3N3b3JkIHBvbGljeSBoYXMgbm90IGJlZW4gY29uZmlndXJlZCwgdGhlbiB0aGUgZGVmYXVsdCBwb2xpY3lcbiAqIGNvbmZpZ3VyZWQgZm9yIGFsbCBwcm9qZWN0cyB3aWxsIGJlIHVzZWQuXG4gKlxuICogSWYgYW4gYXV0aCBmbG93IGZhaWxzIGJlY2F1c2UgYSBzdWJtaXR0ZWQgcGFzc3dvcmQgZG9lcyBub3QgbWVldCB0aGUgcGFzc3dvcmQgcG9saWN5XG4gKiByZXF1aXJlbWVudHMgYW5kIHRoaXMgbWV0aG9kIGhhcyBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgdXNlIHRoZVxuICogbW9zdCByZWNlbnQgcG9saWN5IGF2YWlsYWJsZSB3aGVuIGNhbGxlZCBhZ2Fpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogdmFsaWRhdGVQYXNzd29yZChhdXRoLCAnc29tZS1wYXNzd29yZCcpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXNzd29yZCBUaGUgcGFzc3dvcmQgdG8gdmFsaWRhdGUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVQYXNzd29yZChcbiAgYXV0aDogQXV0aCxcbiAgcGFzc3dvcmQ6IHN0cmluZ1xuKTogUHJvbWlzZTxQYXNzd29yZFZhbGlkYXRpb25TdGF0dXM+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICByZXR1cm4gYXV0aEludGVybmFsLnZhbGlkYXRlUGFzc3dvcmQocGFzc3dvcmQpO1xufVxuXG4vKipcbiAqIEFkZHMgYW4gb2JzZXJ2ZXIgZm9yIGNoYW5nZXMgdG8gdGhlIHNpZ25lZC1pbiB1c2VyJ3MgSUQgdG9rZW4uXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaW5jbHVkZXMgc2lnbi1pbiwgc2lnbi1vdXQsIGFuZCB0b2tlbiByZWZyZXNoIGV2ZW50cy5cbiAqIFRoaXMgd2lsbCBub3QgYmUgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgdXBvbiBJRCB0b2tlbiBleHBpcmF0aW9uLiBVc2Uge0BsaW5rIFVzZXIuZ2V0SWRUb2tlbn0gdG8gcmVmcmVzaCB0aGUgSUQgdG9rZW4uXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIG5leHRPck9ic2VydmVyIC0gY2FsbGJhY2sgdHJpZ2dlcmVkIG9uIGNoYW5nZS5cbiAqIEBwYXJhbSBlcnJvciAtIERlcHJlY2F0ZWQuIFRoaXMgY2FsbGJhY2sgaXMgbmV2ZXIgdHJpZ2dlcmVkLiBFcnJvcnNcbiAqIG9uIHNpZ25pbmcgaW4vb3V0IGNhbiBiZSBjYXVnaHQgaW4gcHJvbWlzZXMgcmV0dXJuZWQgZnJvbVxuICogc2lnbi1pbi9zaWduLW91dCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gY29tcGxldGVkIC0gRGVwcmVjYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBuZXZlciB0cmlnZ2VyZWQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25JZFRva2VuQ2hhbmdlZChcbiAgYXV0aDogQXV0aCxcbiAgbmV4dE9yT2JzZXJ2ZXI6IE5leHRPck9ic2VydmVyPFVzZXI+LFxuICBlcnJvcj86IEVycm9yRm4sXG4gIGNvbXBsZXRlZD86IENvbXBsZXRlRm5cbik6IFVuc3Vic2NyaWJlIHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5vbklkVG9rZW5DaGFuZ2VkKFxuICAgIG5leHRPck9ic2VydmVyLFxuICAgIGVycm9yLFxuICAgIGNvbXBsZXRlZFxuICApO1xufVxuLyoqXG4gKiBBZGRzIGEgYmxvY2tpbmcgY2FsbGJhY2sgdGhhdCBydW5zIGJlZm9yZSBhbiBhdXRoIHN0YXRlIGNoYW5nZVxuICogc2V0cyBhIG5ldyB1c2VyLlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIGNhbGxiYWNrIHRyaWdnZXJlZCBiZWZvcmUgbmV3IHVzZXIgdmFsdWUgaXMgc2V0LlxuICogICBJZiB0aGlzIHRocm93cywgaXQgYmxvY2tzIHRoZSB1c2VyIGZyb20gYmVpbmcgc2V0LlxuICogQHBhcmFtIG9uQWJvcnQgLSBjYWxsYmFjayB0cmlnZ2VyZWQgaWYgYSBsYXRlciBgYmVmb3JlQXV0aFN0YXRlQ2hhbmdlZCgpYFxuICogICBjYWxsYmFjayB0aHJvd3MsIGFsbG93aW5nIHlvdSB0byB1bmRvIGFueSBzaWRlIGVmZmVjdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKFxuICBhdXRoOiBBdXRoLFxuICBjYWxsYmFjazogKHVzZXI6IFVzZXIgfCBudWxsKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPixcbiAgb25BYm9ydD86ICgpID0+IHZvaWRcbik6IFVuc3Vic2NyaWJlIHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS5iZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKGNhbGxiYWNrLCBvbkFib3J0KTtcbn1cbi8qKlxuICogQWRkcyBhbiBvYnNlcnZlciBmb3IgY2hhbmdlcyB0byB0aGUgdXNlcidzIHNpZ24taW4gc3RhdGUuXG4gKlxuICogQHJlbWFya3NcbiAqIFRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvciwgc2VlIHtAbGluayBvbklkVG9rZW5DaGFuZ2VkfS5cbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbmV4dE9yT2JzZXJ2ZXIgLSBjYWxsYmFjayB0cmlnZ2VyZWQgb24gY2hhbmdlLlxuICogQHBhcmFtIGVycm9yIC0gRGVwcmVjYXRlZC4gVGhpcyBjYWxsYmFjayBpcyBuZXZlciB0cmlnZ2VyZWQuIEVycm9yc1xuICogb24gc2lnbmluZyBpbi9vdXQgY2FuIGJlIGNhdWdodCBpbiBwcm9taXNlcyByZXR1cm5lZCBmcm9tXG4gKiBzaWduLWluL3NpZ24tb3V0IGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBjb21wbGV0ZWQgLSBEZXByZWNhdGVkLiBUaGlzIGNhbGxiYWNrIGlzIG5ldmVyIHRyaWdnZXJlZC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkF1dGhTdGF0ZUNoYW5nZWQoXG4gIGF1dGg6IEF1dGgsXG4gIG5leHRPck9ic2VydmVyOiBOZXh0T3JPYnNlcnZlcjxVc2VyPixcbiAgZXJyb3I/OiBFcnJvckZuLFxuICBjb21wbGV0ZWQ/OiBDb21wbGV0ZUZuXG4pOiBVbnN1YnNjcmliZSB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCkub25BdXRoU3RhdGVDaGFuZ2VkKFxuICAgIG5leHRPck9ic2VydmVyLFxuICAgIGVycm9yLFxuICAgIGNvbXBsZXRlZFxuICApO1xufVxuLyoqXG4gKiBTZXRzIHRoZSBjdXJyZW50IGxhbmd1YWdlIHRvIHRoZSBkZWZhdWx0IGRldmljZS9icm93c2VyIHByZWZlcmVuY2UuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURldmljZUxhbmd1YWdlKGF1dGg6IEF1dGgpOiB2b2lkIHtcbiAgZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnVzZURldmljZUxhbmd1YWdlKCk7XG59XG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNldHMgdGhlIHByb3ZpZGVkIHVzZXIgYXMge0BsaW5rIEF1dGguY3VycmVudFVzZXJ9IG9uIHRoZVxuICoge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEByZW1hcmtzXG4gKiBBIG5ldyBpbnN0YW5jZSBjb3B5IG9mIHRoZSB1c2VyIHByb3ZpZGVkIHdpbGwgYmUgbWFkZSBhbmQgc2V0IGFzIGN1cnJlbnRVc2VyLlxuICpcbiAqIFRoaXMgd2lsbCB0cmlnZ2VyIHtAbGluayBvbkF1dGhTdGF0ZUNoYW5nZWR9IGFuZCB7QGxpbmsgb25JZFRva2VuQ2hhbmdlZH0gbGlzdGVuZXJzXG4gKiBsaWtlIG90aGVyIHNpZ24gaW4gbWV0aG9kcy5cbiAqXG4gKiBUaGUgb3BlcmF0aW9uIGZhaWxzIHdpdGggYW4gZXJyb3IgaWYgdGhlIHVzZXIgdG8gYmUgdXBkYXRlZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IEZpcmViYXNlXG4gKiBwcm9qZWN0LlxuICpcbiAqIEBwYXJhbSBhdXRoIC0gVGhlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB1c2VyIC0gVGhlIG5ldyB7QGxpbmsgVXNlcn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQ3VycmVudFVzZXIoXG4gIGF1dGg6IEF1dGgsXG4gIHVzZXI6IFVzZXIgfCBudWxsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIGdldE1vZHVsYXJJbnN0YW5jZShhdXRoKS51cGRhdGVDdXJyZW50VXNlcih1c2VyKTtcbn1cbi8qKlxuICogU2lnbnMgb3V0IHRoZSBjdXJyZW50IHVzZXIuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25PdXQoYXV0aDogQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gZ2V0TW9kdWxhckluc3RhbmNlKGF1dGgpLnNpZ25PdXQoKTtcbn1cblxuZXhwb3J0IHsgaW5pdGlhbGl6ZUF1dGggfSBmcm9tICcuL2F1dGgvaW5pdGlhbGl6ZSc7XG5leHBvcnQgeyBjb25uZWN0QXV0aEVtdWxhdG9yIH0gZnJvbSAnLi9hdXRoL2VtdWxhdG9yJztcblxuLy8gY3JlZGVudGlhbHNcbmV4cG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFscyc7XG5leHBvcnQgeyBFbWFpbEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi9jcmVkZW50aWFscy9lbWFpbCc7XG5leHBvcnQgeyBPQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWxzL29hdXRoJztcbmV4cG9ydCB7IFBob25lQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWxzL3Bob25lJztcblxuLy8gcGVyc2lzdGVuY2VcbmV4cG9ydCB7IGluTWVtb3J5UGVyc2lzdGVuY2UgfSBmcm9tICcuL3BlcnNpc3RlbmNlL2luX21lbW9yeSc7XG5cbi8vIHByb3ZpZGVyc1xuZXhwb3J0IHsgRW1haWxBdXRoUHJvdmlkZXIgfSBmcm9tICcuL3Byb3ZpZGVycy9lbWFpbCc7XG5leHBvcnQgeyBGYWNlYm9va0F1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL2ZhY2Vib29rJztcbmV4cG9ydCB7IEN1c3RvbVBhcmFtZXRlcnMgfSBmcm9tICcuL3Byb3ZpZGVycy9mZWRlcmF0ZWQnO1xuZXhwb3J0IHsgR29vZ2xlQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi9wcm92aWRlcnMvZ29vZ2xlJztcbmV4cG9ydCB7IEdpdGh1YkF1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL2dpdGh1Yic7XG5leHBvcnQgeyBPQXV0aFByb3ZpZGVyLCBPQXV0aENyZWRlbnRpYWxPcHRpb25zIH0gZnJvbSAnLi9wcm92aWRlcnMvb2F1dGgnO1xuZXhwb3J0IHsgU0FNTEF1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL3NhbWwnO1xuZXhwb3J0IHsgVHdpdHRlckF1dGhQcm92aWRlciB9IGZyb20gJy4vcHJvdmlkZXJzL3R3aXR0ZXInO1xuXG4vLyBzdHJhdGVnaWVzXG5leHBvcnQgeyBzaWduSW5Bbm9ueW1vdXNseSB9IGZyb20gJy4vc3RyYXRlZ2llcy9hbm9ueW1vdXMnO1xuZXhwb3J0IHtcbiAgc2lnbkluV2l0aENyZWRlbnRpYWwsXG4gIGxpbmtXaXRoQ3JlZGVudGlhbCxcbiAgcmVhdXRoZW50aWNhdGVXaXRoQ3JlZGVudGlhbFxufSBmcm9tICcuL3N0cmF0ZWdpZXMvY3JlZGVudGlhbCc7XG5leHBvcnQgeyBzaWduSW5XaXRoQ3VzdG9tVG9rZW4gfSBmcm9tICcuL3N0cmF0ZWdpZXMvY3VzdG9tX3Rva2VuJztcbmV4cG9ydCB7XG4gIHNlbmRQYXNzd29yZFJlc2V0RW1haWwsXG4gIGNvbmZpcm1QYXNzd29yZFJlc2V0LFxuICBhcHBseUFjdGlvbkNvZGUsXG4gIGNoZWNrQWN0aW9uQ29kZSxcbiAgdmVyaWZ5UGFzc3dvcmRSZXNldENvZGUsXG4gIGNyZWF0ZVVzZXJXaXRoRW1haWxBbmRQYXNzd29yZCxcbiAgc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmRcbn0gZnJvbSAnLi9zdHJhdGVnaWVzL2VtYWlsX2FuZF9wYXNzd29yZCc7XG5leHBvcnQge1xuICBzZW5kU2lnbkluTGlua1RvRW1haWwsXG4gIGlzU2lnbkluV2l0aEVtYWlsTGluayxcbiAgc2lnbkluV2l0aEVtYWlsTGlua1xufSBmcm9tICcuL3N0cmF0ZWdpZXMvZW1haWxfbGluayc7XG5leHBvcnQge1xuICBmZXRjaFNpZ25Jbk1ldGhvZHNGb3JFbWFpbCxcbiAgc2VuZEVtYWlsVmVyaWZpY2F0aW9uLFxuICB2ZXJpZnlCZWZvcmVVcGRhdGVFbWFpbFxufSBmcm9tICcuL3N0cmF0ZWdpZXMvZW1haWwnO1xuXG4vLyBjb3JlXG5leHBvcnQgeyBBY3Rpb25Db2RlVVJMLCBwYXJzZUFjdGlvbkNvZGVVUkwgfSBmcm9tICcuL2FjdGlvbl9jb2RlX3VybCc7XG5cbi8vIHVzZXJcbmV4cG9ydCB7XG4gIHVwZGF0ZVByb2ZpbGUsXG4gIHVwZGF0ZUVtYWlsLFxuICB1cGRhdGVQYXNzd29yZFxufSBmcm9tICcuL3VzZXIvYWNjb3VudF9pbmZvJztcbmV4cG9ydCB7IGdldElkVG9rZW4sIGdldElkVG9rZW5SZXN1bHQgfSBmcm9tICcuL3VzZXIvaWRfdG9rZW5fcmVzdWx0JztcbmV4cG9ydCB7IHVubGluayB9IGZyb20gJy4vdXNlci9saW5rX3VubGluayc7XG5leHBvcnQgeyBnZXRBZGRpdGlvbmFsVXNlckluZm8gfSBmcm9tICcuL3VzZXIvYWRkaXRpb25hbF91c2VyX2luZm8nO1xuXG4vLyBOb24tb3B0aW9uYWwgdXNlciBtZXRob2RzLlxuZXhwb3J0IHsgcmVsb2FkIH0gZnJvbSAnLi91c2VyL3JlbG9hZCc7XG4vKipcbiAqIERlbGV0ZXMgYW5kIHNpZ25zIG91dCB0aGUgdXNlci5cbiAqXG4gKiBAcmVtYXJrc1xuICogSW1wb3J0YW50OiB0aGlzIGlzIGEgc2VjdXJpdHktc2Vuc2l0aXZlIG9wZXJhdGlvbiB0aGF0IHJlcXVpcmVzIHRoZSB1c2VyIHRvIGhhdmUgcmVjZW50bHlcbiAqIHNpZ25lZCBpbi4gSWYgdGhpcyByZXF1aXJlbWVudCBpc24ndCBtZXQsIGFzayB0aGUgdXNlciB0byBhdXRoZW50aWNhdGUgYWdhaW4gYW5kIHRoZW4gY2FsbFxuICoge0BsaW5rIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWx9LlxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsZXRlVXNlcih1c2VyOiBVc2VyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikuZGVsZXRlKCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVXNlckludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvclNlc3Npb24gfSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgZW51bSBNdWx0aUZhY3RvclNlc3Npb25UeXBlIHtcbiAgRU5ST0xMID0gJ2Vucm9sbCcsXG4gIFNJR05fSU4gPSAnc2lnbmluJ1xufVxuXG5pbnRlcmZhY2UgU2VyaWFsaXplZE11bHRpRmFjdG9yU2Vzc2lvbiB7XG4gIG11bHRpRmFjdG9yU2Vzc2lvbjoge1xuICAgIGlkVG9rZW4/OiBzdHJpbmc7XG4gICAgcGVuZGluZ0NyZWRlbnRpYWw/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIGltcGxlbWVudHMgTXVsdGlGYWN0b3JTZXNzaW9uIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSB0eXBlOiBNdWx0aUZhY3RvclNlc3Npb25UeXBlLFxuICAgIHJlYWRvbmx5IGNyZWRlbnRpYWw6IHN0cmluZyxcbiAgICByZWFkb25seSB1c2VyPzogVXNlckludGVybmFsXG4gICkge31cblxuICBzdGF0aWMgX2Zyb21JZHRva2VuKFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICB1c2VyPzogVXNlckludGVybmFsXG4gICk6IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwge1xuICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbChcbiAgICAgIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuRU5ST0xMLFxuICAgICAgaWRUb2tlbixcbiAgICAgIHVzZXJcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIF9mcm9tTWZhUGVuZGluZ0NyZWRlbnRpYWwoXG4gICAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZ1xuICApOiBNdWx0aUZhY3RvclNlc3Npb25JbXBsIHtcbiAgICByZXR1cm4gbmV3IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwoXG4gICAgICBNdWx0aUZhY3RvclNlc3Npb25UeXBlLlNJR05fSU4sXG4gICAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbFxuICAgICk7XG4gIH1cblxuICB0b0pTT04oKTogU2VyaWFsaXplZE11bHRpRmFjdG9yU2Vzc2lvbiB7XG4gICAgY29uc3Qga2V5ID1cbiAgICAgIHRoaXMudHlwZSA9PT0gTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5FTlJPTExcbiAgICAgICAgPyAnaWRUb2tlbidcbiAgICAgICAgOiAncGVuZGluZ0NyZWRlbnRpYWwnO1xuICAgIHJldHVybiB7XG4gICAgICBtdWx0aUZhY3RvclNlc3Npb246IHtcbiAgICAgICAgW2tleV06IHRoaXMuY3JlZGVudGlhbFxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZnJvbUpTT04oXG4gICAgb2JqOiBQYXJ0aWFsPFNlcmlhbGl6ZWRNdWx0aUZhY3RvclNlc3Npb24+XG4gICk6IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwgfCBudWxsIHtcbiAgICBpZiAob2JqPy5tdWx0aUZhY3RvclNlc3Npb24pIHtcbiAgICAgIGlmIChvYmoubXVsdGlGYWN0b3JTZXNzaW9uPy5wZW5kaW5nQ3JlZGVudGlhbCkge1xuICAgICAgICByZXR1cm4gTXVsdGlGYWN0b3JTZXNzaW9uSW1wbC5fZnJvbU1mYVBlbmRpbmdDcmVkZW50aWFsKFxuICAgICAgICAgIG9iai5tdWx0aUZhY3RvclNlc3Npb24ucGVuZGluZ0NyZWRlbnRpYWxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAob2JqLm11bHRpRmFjdG9yU2Vzc2lvbj8uaWRUb2tlbikge1xuICAgICAgICByZXR1cm4gTXVsdGlGYWN0b3JTZXNzaW9uSW1wbC5fZnJvbUlkdG9rZW4oXG4gICAgICAgICAgb2JqLm11bHRpRmFjdG9yU2Vzc2lvbi5pZFRva2VuXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aCxcbiAgTXVsdGlGYWN0b3JSZXNvbHZlcixcbiAgVXNlckNyZWRlbnRpYWwsXG4gIE11bHRpRmFjdG9yRXJyb3Jcbn0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgVXNlckNyZWRlbnRpYWxJbXBsIH0gZnJvbSAnLi4vY29yZS91c2VyL3VzZXJfY3JlZGVudGlhbF9pbXBsJztcbmltcG9ydCB7IF9hc3NlcnQsIF9mYWlsIH0gZnJvbSAnLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwgfSBmcm9tICcuL21mYV9hc3NlcnRpb24nO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JFcnJvciBhcyBNdWx0aUZhY3RvckVycm9ySW50ZXJuYWwgfSBmcm9tICcuL21mYV9lcnJvcic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckluZm9JbXBsIH0gZnJvbSAnLi9tZmFfaW5mbyc7XG5pbXBvcnQgeyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIH0gZnJvbSAnLi9tZmFfc2Vzc2lvbic7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBPcGVyYXRpb25UeXBlIH0gZnJvbSAnLi4vbW9kZWwvZW51bXMnO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwgaW1wbGVtZW50cyBNdWx0aUZhY3RvclJlc29sdmVyIHtcbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBzZXNzaW9uOiBNdWx0aUZhY3RvclNlc3Npb25JbXBsLFxuICAgIHJlYWRvbmx5IGhpbnRzOiBNdWx0aUZhY3RvckluZm9JbXBsW10sXG4gICAgcHJpdmF0ZSByZWFkb25seSBzaWduSW5SZXNvbHZlcjogKFxuICAgICAgYXNzZXJ0aW9uOiBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgICApID0+IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD5cbiAgKSB7fVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9mcm9tRXJyb3IoXG4gICAgYXV0aEV4dGVybjogQXV0aCxcbiAgICBlcnJvcjogTXVsdGlGYWN0b3JFcnJvckludGVybmFsXG4gICk6IE11bHRpRmFjdG9yUmVzb2x2ZXJJbXBsIHtcbiAgICBjb25zdCBhdXRoID0gX2Nhc3RBdXRoKGF1dGhFeHRlcm4pO1xuICAgIGNvbnN0IHNlcnZlclJlc3BvbnNlID0gZXJyb3IuY3VzdG9tRGF0YS5fc2VydmVyUmVzcG9uc2U7XG4gICAgY29uc3QgaGludHMgPSAoc2VydmVyUmVzcG9uc2UubWZhSW5mbyB8fCBbXSkubWFwKGVucm9sbG1lbnQgPT5cbiAgICAgIE11bHRpRmFjdG9ySW5mb0ltcGwuX2Zyb21TZXJ2ZXJSZXNwb25zZShhdXRoLCBlbnJvbGxtZW50KVxuICAgICk7XG5cbiAgICBfYXNzZXJ0KFxuICAgICAgc2VydmVyUmVzcG9uc2UubWZhUGVuZGluZ0NyZWRlbnRpYWwsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUlxuICAgICk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwuX2Zyb21NZmFQZW5kaW5nQ3JlZGVudGlhbChcbiAgICAgIHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsXG4gICAgKTtcblxuICAgIHJldHVybiBuZXcgTXVsdGlGYWN0b3JSZXNvbHZlckltcGwoXG4gICAgICBzZXNzaW9uLFxuICAgICAgaGludHMsXG4gICAgICBhc3luYyAoXG4gICAgICAgIGFzc2VydGlvbjogTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsXG4gICAgICApOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+ID0+IHtcbiAgICAgICAgY29uc3QgbWZhUmVzcG9uc2UgPSBhd2FpdCBhc3NlcnRpb24uX3Byb2Nlc3MoYXV0aCwgc2Vzc2lvbik7XG4gICAgICAgIC8vIENsZWFyIG91dCB0aGUgdW5uZWVkZWQgZmllbGRzIGZyb20gdGhlIG9sZCBsb2dpbiByZXNwb25zZVxuICAgICAgICBkZWxldGUgc2VydmVyUmVzcG9uc2UubWZhSW5mbztcbiAgICAgICAgZGVsZXRlIHNlcnZlclJlc3BvbnNlLm1mYVBlbmRpbmdDcmVkZW50aWFsO1xuXG4gICAgICAgIC8vIFVzZSBpbiB0aGUgbmV3IHRva2VuICYgcmVmcmVzaCB0b2tlbiBpbiB0aGUgb2xkIHJlc3BvbnNlXG4gICAgICAgIGNvbnN0IGlkVG9rZW5SZXNwb25zZSA9IHtcbiAgICAgICAgICAuLi5zZXJ2ZXJSZXNwb25zZSxcbiAgICAgICAgICBpZFRva2VuOiBtZmFSZXNwb25zZS5pZFRva2VuLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbjogbWZhUmVzcG9uc2UucmVmcmVzaFRva2VuXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIGNvbGxhcHNlIHRoaXMgc3dpdGNoIHN0YXRlbWVudCBpbnRvIFVzZXJDcmVkZW50aWFsSW1wbC5fZm9yT3BlcmF0aW9uIGFuZCBoYXZlIGl0IHN1cHBvcnQgdGhlIFNJR05fSU4gY2FzZVxuICAgICAgICBzd2l0Y2ggKGVycm9yLm9wZXJhdGlvblR5cGUpIHtcbiAgICAgICAgICBjYXNlIE9wZXJhdGlvblR5cGUuU0lHTl9JTjpcbiAgICAgICAgICAgIGNvbnN0IHVzZXJDcmVkZW50aWFsID1cbiAgICAgICAgICAgICAgYXdhaXQgVXNlckNyZWRlbnRpYWxJbXBsLl9mcm9tSWRUb2tlblJlc3BvbnNlKFxuICAgICAgICAgICAgICAgIGF1dGgsXG4gICAgICAgICAgICAgICAgZXJyb3Iub3BlcmF0aW9uVHlwZSxcbiAgICAgICAgICAgICAgICBpZFRva2VuUmVzcG9uc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGF3YWl0IGF1dGguX3VwZGF0ZUN1cnJlbnRVc2VyKHVzZXJDcmVkZW50aWFsLnVzZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHVzZXJDcmVkZW50aWFsO1xuICAgICAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5SRUFVVEhFTlRJQ0FURTpcbiAgICAgICAgICAgIF9hc3NlcnQoZXJyb3IudXNlciwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgICAgICAgICByZXR1cm4gVXNlckNyZWRlbnRpYWxJbXBsLl9mb3JPcGVyYXRpb24oXG4gICAgICAgICAgICAgIGVycm9yLnVzZXIsXG4gICAgICAgICAgICAgIGVycm9yLm9wZXJhdGlvblR5cGUsXG4gICAgICAgICAgICAgIGlkVG9rZW5SZXNwb25zZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZVNpZ25JbihcbiAgICBhc3NlcnRpb25FeHRlcm46IE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbFxuICApOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gICAgY29uc3QgYXNzZXJ0aW9uID0gYXNzZXJ0aW9uRXh0ZXJuIGFzIE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbDtcbiAgICByZXR1cm4gdGhpcy5zaWduSW5SZXNvbHZlcihhc3NlcnRpb24pO1xuICB9XG59XG5cbi8qKlxuICogUHJvdmlkZXMgYSB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlcn0gc3VpdGFibGUgZm9yIGNvbXBsZXRpb24gb2YgYVxuICogbXVsdGktZmFjdG9yIGZsb3cuXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIGVycm9yIC0gVGhlIHtAbGluayBNdWx0aUZhY3RvckVycm9yfSByYWlzZWQgZHVyaW5nIGEgc2lnbi1pbiwgb3JcbiAqIHJlYXV0aGVudGljYXRpb24gb3BlcmF0aW9uLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE11bHRpRmFjdG9yUmVzb2x2ZXIoXG4gIGF1dGg6IEF1dGgsXG4gIGVycm9yOiBNdWx0aUZhY3RvckVycm9yXG4pOiBNdWx0aUZhY3RvclJlc29sdmVyIHtcbiAgY29uc3QgYXV0aE1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UoYXV0aCk7XG4gIGNvbnN0IGVycm9ySW50ZXJuYWwgPSBlcnJvciBhcyBNdWx0aUZhY3RvckVycm9ySW50ZXJuYWw7XG4gIF9hc3NlcnQoXG4gICAgZXJyb3IuY3VzdG9tRGF0YS5vcGVyYXRpb25UeXBlLFxuICAgIGF1dGhNb2R1bGFyLFxuICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgKTtcbiAgX2Fzc2VydChcbiAgICBlcnJvckludGVybmFsLmN1c3RvbURhdGEuX3NlcnZlclJlc3BvbnNlPy5tZmFQZW5kaW5nQ3JlZGVudGlhbCxcbiAgICBhdXRoTW9kdWxhcixcbiAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICk7XG5cbiAgcmV0dXJuIE11bHRpRmFjdG9yUmVzb2x2ZXJJbXBsLl9mcm9tRXJyb3IoYXV0aE1vZHVsYXIsIGVycm9ySW50ZXJuYWwpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIEVuZHBvaW50LFxuICBIdHRwTWV0aG9kLFxuICBfYWRkVGlkSWZOZWNlc3NhcnksXG4gIF9wZXJmb3JtQXBpUmVxdWVzdFxufSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0IH0gZnJvbSAnLi4vYXV0aGVudGljYXRpb24vc21zJztcbmltcG9ydCB7IEZpbmFsaXplTWZhUmVzcG9uc2UgfSBmcm9tICcuLi9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5cbi8qKlxuICogTUZBIEluZm8gYXMgcmV0dXJuZWQgYnkgdGhlIEFQSS5cbiAqL1xuaW50ZXJmYWNlIEJhc2VNZmFFbnJvbGxtZW50IHtcbiAgbWZhRW5yb2xsbWVudElkOiBzdHJpbmc7XG4gIGVucm9sbGVkQXQ6IG51bWJlcjtcbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQW4gTUZBIHByb3ZpZGVkIGJ5IFNNUyB2ZXJpZmljYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVNZmFFbnJvbGxtZW50IGV4dGVuZHMgQmFzZU1mYUVucm9sbG1lbnQge1xuICBwaG9uZUluZm86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBNRkEgcHJvdmlkZWQgYnkgVE9UUCAoVGltZS1iYXNlZCBPbmUgVGltZSBQYXNzd29yZCkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90cE1mYUVucm9sbG1lbnQgZXh0ZW5kcyBCYXNlTWZhRW5yb2xsbWVudCB7fVxuXG4vKipcbiAqIE1mYUVucm9sbG1lbnQgY2FuIGJlIGFueSBzdWJ0eXBlIG9mIEJhc2VNZmFFbnJvbGxtZW50LCBjdXJyZW50bHkgb25seSBQaG9uZU1mYUVucm9sbG1lbnQgYW5kIFRvdHBNZmFFbnJvbGxtZW50IGFyZSBzdXBwb3J0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE1mYUVucm9sbG1lbnQgPSBQaG9uZU1mYUVucm9sbG1lbnQgfCBUb3RwTWZhRW5yb2xsbWVudDtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFydFBob25lTWZhRW5yb2xsbWVudFJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHBob25lRW5yb2xsbWVudEluZm86IHtcbiAgICBwaG9uZU51bWJlcjogc3RyaW5nO1xuICAgIHJlY2FwdGNoYVRva2VuOiBzdHJpbmc7XG4gIH07XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0UGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2Uge1xuICBwaG9uZVNlc3Npb25JbmZvOiB7XG4gICAgc2Vzc2lvbkluZm86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0RW5yb2xsUGhvbmVNZmEoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVxdWVzdDogU3RhcnRQaG9uZU1mYUVucm9sbG1lbnRSZXF1ZXN0XG4pOiBQcm9taXNlPFN0YXJ0UGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2U+IHtcbiAgcmV0dXJuIF9wZXJmb3JtQXBpUmVxdWVzdDxcbiAgICBTdGFydFBob25lTWZhRW5yb2xsbWVudFJlcXVlc3QsXG4gICAgU3RhcnRQaG9uZU1mYUVucm9sbG1lbnRSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNUQVJUX01GQV9FTlJPTExNRU5ULFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgcGhvbmVWZXJpZmljYXRpb25JbmZvOiBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0O1xuICBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGw7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2VcbiAgZXh0ZW5kcyBGaW5hbGl6ZU1mYVJlc3BvbnNlIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5hbGl6ZUVucm9sbFBob25lTWZhKFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIHJlcXVlc3Q6IEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVxdWVzdFxuKTogUHJvbWlzZTxGaW5hbGl6ZVBob25lTWZhRW5yb2xsbWVudFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgRmluYWxpemVQaG9uZU1mYUVucm9sbG1lbnRSZXF1ZXN0LFxuICAgIEZpbmFsaXplUGhvbmVNZmFFbnJvbGxtZW50UmVzcG9uc2VcbiAgPihcbiAgICBhdXRoLFxuICAgIEh0dHBNZXRob2QuUE9TVCxcbiAgICBFbmRwb2ludC5GSU5BTElaRV9NRkFfRU5ST0xMTUVOVCxcbiAgICBfYWRkVGlkSWZOZWNlc3NhcnkoYXV0aCwgcmVxdWVzdClcbiAgKTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3Qge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHRvdHBFbnJvbGxtZW50SW5mbzoge307XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0VG90cE1mYUVucm9sbG1lbnRSZXNwb25zZSB7XG4gIHRvdHBTZXNzaW9uSW5mbzoge1xuICAgIHNoYXJlZFNlY3JldEtleTogc3RyaW5nO1xuICAgIHZlcmlmaWNhdGlvbkNvZGVMZW5ndGg6IG51bWJlcjtcbiAgICBoYXNoaW5nQWxnb3JpdGhtOiBzdHJpbmc7XG4gICAgcGVyaW9kU2VjOiBudW1iZXI7XG4gICAgc2Vzc2lvbkluZm86IHN0cmluZztcbiAgICBmaW5hbGl6ZUVucm9sbG1lbnRUaW1lOiBudW1iZXI7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEVucm9sbFRvdHBNZmEoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVxdWVzdDogU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3Rcbik6IFByb21pc2U8U3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlcXVlc3QsXG4gICAgU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlXG4gID4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuU1RBUlRfTUZBX0VOUk9MTE1FTlQsXG4gICAgX2FkZFRpZElmTmVjZXNzYXJ5KGF1dGgsIHJlcXVlc3QpXG4gICk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG90cFZlcmlmaWNhdGlvbkluZm8ge1xuICBzZXNzaW9uSW5mbzogc3RyaW5nO1xuICB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmc7XG59XG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXF1ZXN0IHtcbiAgaWRUb2tlbjogc3RyaW5nO1xuICB0b3RwVmVyaWZpY2F0aW9uSW5mbzogVG90cFZlcmlmaWNhdGlvbkluZm87XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpemVUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlXG4gIGV4dGVuZHMgRmluYWxpemVNZmFSZXNwb25zZSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVFbnJvbGxUb3RwTWZhKFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIHJlcXVlc3Q6IEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXF1ZXN0XG4pOiBQcm9taXNlPEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXF1ZXN0LFxuICAgIEZpbmFsaXplVG90cE1mYUVucm9sbG1lbnRSZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LkZJTkFMSVpFX01GQV9FTlJPTExNRU5ULFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhkcmF3TWZhUmVxdWVzdCB7XG4gIGlkVG9rZW46IHN0cmluZztcbiAgbWZhRW5yb2xsbWVudElkOiBzdHJpbmc7XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdpdGhkcmF3TWZhUmVzcG9uc2UgZXh0ZW5kcyBGaW5hbGl6ZU1mYVJlc3BvbnNlIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoZHJhd01mYShcbiAgYXV0aDogQXV0aEludGVybmFsLFxuICByZXF1ZXN0OiBXaXRoZHJhd01mYVJlcXVlc3Rcbik6IFByb21pc2U8V2l0aGRyYXdNZmFSZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFdpdGhkcmF3TWZhUmVxdWVzdCwgV2l0aGRyYXdNZmFSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLlBPU1QsXG4gICAgRW5kcG9pbnQuV0lUSERSQVdfTUZBLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBNdWx0aUZhY3RvckFzc2VydGlvbixcbiAgTXVsdGlGYWN0b3JJbmZvLFxuICBNdWx0aUZhY3RvclNlc3Npb24sXG4gIE11bHRpRmFjdG9yVXNlcixcbiAgVXNlclxufSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyB3aXRoZHJhd01mYSB9IGZyb20gJy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvbWZhJztcbmltcG9ydCB7IF9sb2dvdXRJZkludmFsaWRhdGVkIH0gZnJvbSAnLi4vY29yZS91c2VyL2ludmFsaWRhdGlvbic7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB9IGZyb20gJy4vbWZhX2Fzc2VydGlvbic7XG5pbXBvcnQgeyBNdWx0aUZhY3RvckluZm9JbXBsIH0gZnJvbSAnLi9tZmFfaW5mbyc7XG5pbXBvcnQgeyBNdWx0aUZhY3RvclNlc3Npb25JbXBsIH0gZnJvbSAnLi9tZmFfc2Vzc2lvbic7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBNdWx0aUZhY3RvclVzZXJJbXBsIGltcGxlbWVudHMgTXVsdGlGYWN0b3JVc2VyIHtcbiAgZW5yb2xsZWRGYWN0b3JzOiBNdWx0aUZhY3RvckluZm9bXSA9IFtdO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocmVhZG9ubHkgdXNlcjogVXNlckludGVybmFsKSB7XG4gICAgdXNlci5fb25SZWxvYWQodXNlckluZm8gPT4ge1xuICAgICAgaWYgKHVzZXJJbmZvLm1mYUluZm8pIHtcbiAgICAgICAgdGhpcy5lbnJvbGxlZEZhY3RvcnMgPSB1c2VySW5mby5tZmFJbmZvLm1hcChlbnJvbGxtZW50ID0+XG4gICAgICAgICAgTXVsdGlGYWN0b3JJbmZvSW1wbC5fZnJvbVNlcnZlclJlc3BvbnNlKHVzZXIuYXV0aCwgZW5yb2xsbWVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBfZnJvbVVzZXIodXNlcjogVXNlckludGVybmFsKTogTXVsdGlGYWN0b3JVc2VySW1wbCB7XG4gICAgcmV0dXJuIG5ldyBNdWx0aUZhY3RvclVzZXJJbXBsKHVzZXIpO1xuICB9XG5cbiAgYXN5bmMgZ2V0U2Vzc2lvbigpOiBQcm9taXNlPE11bHRpRmFjdG9yU2Vzc2lvbj4ge1xuICAgIHJldHVybiBNdWx0aUZhY3RvclNlc3Npb25JbXBsLl9mcm9tSWR0b2tlbihcbiAgICAgIGF3YWl0IHRoaXMudXNlci5nZXRJZFRva2VuKCksXG4gICAgICB0aGlzLnVzZXJcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZW5yb2xsKFxuICAgIGFzc2VydGlvbkV4dGVybjogTXVsdGlGYWN0b3JBc3NlcnRpb24sXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFzc2VydGlvbiA9IGFzc2VydGlvbkV4dGVybiBhcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGw7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLmdldFNlc3Npb24oKSkgYXMgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbDtcbiAgICBjb25zdCBmaW5hbGl6ZU1mYVJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQoXG4gICAgICB0aGlzLnVzZXIsXG4gICAgICBhc3NlcnRpb24uX3Byb2Nlc3ModGhpcy51c2VyLmF1dGgsIHNlc3Npb24sIGRpc3BsYXlOYW1lKVxuICAgICk7XG4gICAgLy8gTmV3IHRva2VucyB3aWxsIGJlIGlzc3VlZCBhZnRlciBlbnJvbGxtZW50IG9mIHRoZSBuZXcgc2Vjb25kIGZhY3RvcnMuXG4gICAgLy8gVGhleSBuZWVkIHRvIGJlIHVwZGF0ZWQgb24gdGhlIHVzZXIuXG4gICAgYXdhaXQgdGhpcy51c2VyLl91cGRhdGVUb2tlbnNJZk5lY2Vzc2FyeShmaW5hbGl6ZU1mYVJlc3BvbnNlKTtcbiAgICAvLyBUaGUgdXNlciBuZWVkcyB0byBiZSByZWxvYWRlZCB0byBnZXQgdGhlIG5ldyBtdWx0aS1mYWN0b3IgaW5mb3JtYXRpb25cbiAgICAvLyBmcm9tIHNlcnZlci4gVVNFUl9SRUxPQURFRCBldmVudCB3aWxsIGJlIHRyaWdnZXJlZCBhbmQgYGVucm9sbGVkRmFjdG9yc2BcbiAgICAvLyB3aWxsIGJlIHVwZGF0ZWQuXG4gICAgcmV0dXJuIHRoaXMudXNlci5yZWxvYWQoKTtcbiAgfVxuXG4gIGFzeW5jIHVuZW5yb2xsKGluZm9PclVpZDogTXVsdGlGYWN0b3JJbmZvIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbWZhRW5yb2xsbWVudElkID1cbiAgICAgIHR5cGVvZiBpbmZvT3JVaWQgPT09ICdzdHJpbmcnID8gaW5mb09yVWlkIDogaW5mb09yVWlkLnVpZDtcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdGhpcy51c2VyLmdldElkVG9rZW4oKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaWRUb2tlblJlc3BvbnNlID0gYXdhaXQgX2xvZ291dElmSW52YWxpZGF0ZWQoXG4gICAgICAgIHRoaXMudXNlcixcbiAgICAgICAgd2l0aGRyYXdNZmEodGhpcy51c2VyLmF1dGgsIHtcbiAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIG1mYUVucm9sbG1lbnRJZFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc2Vjb25kIGZhY3RvciBmcm9tIHRoZSB1c2VyJ3MgbGlzdC5cbiAgICAgIHRoaXMuZW5yb2xsZWRGYWN0b3JzID0gdGhpcy5lbnJvbGxlZEZhY3RvcnMuZmlsdGVyKFxuICAgICAgICAoeyB1aWQgfSkgPT4gdWlkICE9PSBtZmFFbnJvbGxtZW50SWRcbiAgICAgICk7XG4gICAgICAvLyBEZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYmFja2VuZCBkZWNpZGVkIHRvIHJldm9rZSB0aGUgdXNlcidzIHNlc3Npb24sXG4gICAgICAvLyB0aGUgdG9rZW5SZXNwb25zZSBtYXkgYmUgZW1wdHkuIElmIHRoZSB0b2tlbnMgd2VyZSBub3QgdXBkYXRlZCAoYW5kIHRoZXlcbiAgICAgIC8vIGFyZSBub3cgaW52YWxpZCksIHJlbG9hZGluZyB0aGUgdXNlciB3aWxsIGRpc2NvdmVyIHRoaXMgYW5kIGludmFsaWRhdGVcbiAgICAgIC8vIHRoZSB1c2VyJ3Mgc3RhdGUgYWNjb3JkaW5nbHkuXG4gICAgICBhd2FpdCB0aGlzLnVzZXIuX3VwZGF0ZVRva2Vuc0lmTmVjZXNzYXJ5KGlkVG9rZW5SZXNwb25zZSk7XG4gICAgICBhd2FpdCB0aGlzLnVzZXIucmVsb2FkKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbXVsdGlGYWN0b3JVc2VyQ2FjaGUgPSBuZXcgV2Vha01hcDxVc2VyLCBNdWx0aUZhY3RvclVzZXI+KCk7XG5cbi8qKlxuICogVGhlIHtAbGluayBNdWx0aUZhY3RvclVzZXJ9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgaXMgdXNlZCB0byBhY2Nlc3MgYWxsIG11bHRpLWZhY3RvciBwcm9wZXJ0aWVzIGFuZCBvcGVyYXRpb25zIHJlbGF0ZWQgdG8gdGhlIHVzZXIuXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aUZhY3Rvcih1c2VyOiBVc2VyKTogTXVsdGlGYWN0b3JVc2VyIHtcbiAgY29uc3QgdXNlck1vZHVsYXIgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcik7XG4gIGlmICghbXVsdGlGYWN0b3JVc2VyQ2FjaGUuaGFzKHVzZXJNb2R1bGFyKSkge1xuICAgIG11bHRpRmFjdG9yVXNlckNhY2hlLnNldChcbiAgICAgIHVzZXJNb2R1bGFyLFxuICAgICAgTXVsdGlGYWN0b3JVc2VySW1wbC5fZnJvbVVzZXIodXNlck1vZHVsYXIgYXMgVXNlckludGVybmFsKVxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG11bHRpRmFjdG9yVXNlckNhY2hlLmdldCh1c2VyTW9kdWxhcikhO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBQZXJzaXN0ZW5jZSB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIFBlcnNpc3RlbmNlVHlwZSB7XG4gIFNFU1NJT04gPSAnU0VTU0lPTicsXG4gIExPQ0FMID0gJ0xPQ0FMJyxcbiAgTk9ORSA9ICdOT05FJ1xufVxuXG5leHBvcnQgdHlwZSBQZXJzaXN0ZWRCbG9iID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGFudGlhdG9yPFQ+IHtcbiAgKGJsb2I6IFBlcnNpc3RlZEJsb2IpOiBUO1xufVxuXG5leHBvcnQgdHlwZSBQZXJzaXN0ZW5jZVZhbHVlID0gUGVyc2lzdGVkQmxvYiB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNUT1JBR0VfQVZBSUxBQkxFX0tFWSA9ICdfX3Nhayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcmFnZUV2ZW50TGlzdGVuZXIge1xuICAodmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUgfCBudWxsKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQZXJzaXN0ZW5jZUludGVybmFsIGV4dGVuZHMgUGVyc2lzdGVuY2Uge1xuICB0eXBlOiBQZXJzaXN0ZW5jZVR5cGU7XG4gIF9pc0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+O1xuICBfc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSk6IFByb21pc2U8dm9pZD47XG4gIF9nZXQ8VCBleHRlbmRzIFBlcnNpc3RlbmNlVmFsdWU+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD47XG4gIF9yZW1vdmUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xuICBfYWRkTGlzdGVuZXIoa2V5OiBzdHJpbmcsIGxpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQ7XG4gIF9yZW1vdmVMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZDtcbiAgLy8gU2hvdWxkIHRoaXMgcGVyc2lzdGVuY2UgYWxsb3cgbWlncmF0aW9uIHVwIHRoZSBjaG9zZW4gaGllcmFyY2h5P1xuICBfc2hvdWxkQWxsb3dNaWdyYXRpb24/OiBib29sZWFuO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIFBlcnNpc3RlbmNlVmFsdWUsXG4gIFNUT1JBR0VfQVZBSUxBQkxFX0tFWSxcbiAgUGVyc2lzdGVuY2VUeXBlXG59IGZyb20gJy4uLy4uL2NvcmUvcGVyc2lzdGVuY2UnO1xuXG4vLyBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBicm93c2VyIHBlcnNpc3RlbmNlIHR5cGVzOiBsb2NhbCBhbmQgc2Vzc2lvbi5cbi8vIEJvdGggaGF2ZSB0aGUgc2FtZSBpbXBsZW1lbnRhdGlvbiBidXQgdXNlIGEgZGlmZmVyZW50IHVuZGVybHlpbmcgc3RvcmFnZVxuLy8gb2JqZWN0LlxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3Mge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0b3JhZ2VSZXRyaWV2ZXI6ICgpID0+IFN0b3JhZ2UsXG4gICAgcmVhZG9ubHkgdHlwZTogUGVyc2lzdGVuY2VUeXBlXG4gICkge31cblxuICBfaXNBdmFpbGFibGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5zdG9yYWdlKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICAgICAgfVxuICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9BVkFJTEFCTEVfS0VZLCAnMScpO1xuICAgICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9BVkFJTEFCTEVfS0VZKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBfc2V0KGtleTogc3RyaW5nLCB2YWx1ZTogUGVyc2lzdGVuY2VWYWx1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBfZ2V0PFQgZXh0ZW5kcyBQZXJzaXN0ZW5jZVZhbHVlPihrZXk6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICBjb25zdCBqc29uID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGpzb24gPyBKU09OLnBhcnNlKGpzb24pIDogbnVsbCk7XG4gIH1cblxuICBfcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IHN0b3JhZ2UoKTogU3RvcmFnZSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVJldHJpZXZlcigpO1xuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUGVyc2lzdGVuY2UgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRVQSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7XG4gIF9pc1NhZmFyaSxcbiAgX2lzSU9TLFxuICBfaXNJZnJhbWUsXG4gIF9pc01vYmlsZUJyb3dzZXIsXG4gIF9pc0lFMTBcbn0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHtcbiAgUGVyc2lzdGVuY2VJbnRlcm5hbCBhcyBJbnRlcm5hbFBlcnNpc3RlbmNlLFxuICBQZXJzaXN0ZW5jZVR5cGUsXG4gIFBlcnNpc3RlbmNlVmFsdWUsXG4gIFN0b3JhZ2VFdmVudExpc3RlbmVyXG59IGZyb20gJy4uLy4uL2NvcmUvcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHsgQnJvd3NlclBlcnNpc3RlbmNlQ2xhc3MgfSBmcm9tICcuL2Jyb3dzZXInO1xuXG5mdW5jdGlvbiBfaWZyYW1lQ2Fubm90U3luY1dlYlN0b3JhZ2UoKTogYm9vbGVhbiB7XG4gIGNvbnN0IHVhID0gZ2V0VUEoKTtcbiAgcmV0dXJuIF9pc1NhZmFyaSh1YSkgfHwgX2lzSU9TKHVhKTtcbn1cblxuLy8gVGhlIHBvbGxpbmcgcGVyaW9kIGluIGNhc2UgZXZlbnRzIGFyZSBub3Qgc3VwcG9ydGVkXG5leHBvcnQgY29uc3QgX1BPTExJTkdfSU5URVJWQUxfTVMgPSAxMDAwO1xuXG4vLyBUaGUgSUUgMTAgbG9jYWxTdG9yYWdlIGNyb3NzIHRhYiBzeW5jaHJvbml6YXRpb24gZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG5jb25zdCBJRTEwX0xPQ0FMX1NUT1JBR0VfU1lOQ19ERUxBWSA9IDEwO1xuXG5jbGFzcyBCcm93c2VyTG9jYWxQZXJzaXN0ZW5jZVxuICBleHRlbmRzIEJyb3dzZXJQZXJzaXN0ZW5jZUNsYXNzXG4gIGltcGxlbWVudHMgSW50ZXJuYWxQZXJzaXN0ZW5jZVxue1xuICBzdGF0aWMgdHlwZTogJ0xPQ0FMJyA9ICdMT0NBTCc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKCkgPT4gd2luZG93LmxvY2FsU3RvcmFnZSwgUGVyc2lzdGVuY2VUeXBlLkxPQ0FMKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRFdmVudEhhbmRsZXIgPSAoXG4gICAgZXZlbnQ6IFN0b3JhZ2VFdmVudCxcbiAgICBwb2xsPzogYm9vbGVhblxuICApOiB2b2lkID0+IHRoaXMub25TdG9yYWdlRXZlbnQoZXZlbnQsIHBvbGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogUmVjb3JkPHN0cmluZywgU2V0PFN0b3JhZ2VFdmVudExpc3RlbmVyPj4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiA9IHt9O1xuICAvLyBzZXRUaW1lb3V0IHJldHVybiB2YWx1ZSBpcyBwbGF0Zm9ybSBzcGVjaWZpY1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHBvbGxUaW1lcjogYW55IHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gU2FmYXJpIG9yIGlPUyBicm93c2VyIGFuZCBlbWJlZGRlZCBpbiBhbiBpZnJhbWUuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2FmYXJpTG9jYWxTdG9yYWdlTm90U3luY2VkID1cbiAgICBfaWZyYW1lQ2Fubm90U3luY1dlYlN0b3JhZ2UoKSAmJiBfaXNJZnJhbWUoKTtcbiAgLy8gV2hldGhlciB0byB1c2UgcG9sbGluZyBpbnN0ZWFkIG9mIGRlcGVuZGluZyBvbiB3aW5kb3cgZXZlbnRzXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFsbGJhY2tUb1BvbGxpbmcgPSBfaXNNb2JpbGVCcm93c2VyKCk7XG4gIHJlYWRvbmx5IF9zaG91bGRBbGxvd01pZ3JhdGlvbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBmb3JBbGxDaGFuZ2VkS2V5cyhcbiAgICBjYjogKGtleTogc3RyaW5nLCBvbGRWYWx1ZTogc3RyaW5nIHwgbnVsbCwgbmV3VmFsdWU6IHN0cmluZyB8IG51bGwpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgYWxsIGtleXMgd2l0aCBsaXN0ZW5lcnMgb24gdGhlbS5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykpIHtcbiAgICAgIC8vIEdldCB2YWx1ZSBmcm9tIGxvY2FsU3RvcmFnZS5cbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5sb2NhbENhY2hlW2tleV07XG4gICAgICAvLyBJZiBsb2NhbCBtYXAgdmFsdWUgZG9lcyBub3QgbWF0Y2gsIHRyaWdnZXIgbGlzdGVuZXIgd2l0aCBzdG9yYWdlIGV2ZW50LlxuICAgICAgLy8gRGlmZmVyZW50aWF0ZSB0aGlzIHNpbXVsYXRlZCBldmVudCBmcm9tIHRoZSByZWFsIHN0b3JhZ2UgZXZlbnQuXG4gICAgICBpZiAobmV3VmFsdWUgIT09IG9sZFZhbHVlKSB7XG4gICAgICAgIGNiKGtleSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uU3RvcmFnZUV2ZW50KGV2ZW50OiBTdG9yYWdlRXZlbnQsIHBvbGwgPSBmYWxzZSk6IHZvaWQge1xuICAgIC8vIEtleSB3b3VsZCBiZSBudWxsIGluIHNvbWUgc2l0dWF0aW9ucywgbGlrZSB3aGVuIGxvY2FsU3RvcmFnZSBpcyBjbGVhcmVkXG4gICAgaWYgKCFldmVudC5rZXkpIHtcbiAgICAgIHRoaXMuZm9yQWxsQ2hhbmdlZEtleXMoXG4gICAgICAgIChrZXk6IHN0cmluZywgX29sZFZhbHVlOiBzdHJpbmcgfCBudWxsLCBuZXdWYWx1ZTogc3RyaW5nIHwgbnVsbCkgPT4ge1xuICAgICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgbmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleTtcblxuICAgIC8vIENoZWNrIHRoZSBtZWNoYW5pc20gaG93IHRoaXMgZXZlbnQgd2FzIGRldGVjdGVkLlxuICAgIC8vIFRoZSBmaXJzdCBldmVudCB3aWxsIGRpY3RhdGUgdGhlIG1lY2hhbmlzbSB0byBiZSB1c2VkLlxuICAgIGlmIChwb2xsKSB7XG4gICAgICAvLyBFbnZpcm9ubWVudCBkZXRlY3RzIHN0b3JhZ2UgY2hhbmdlcyB2aWEgcG9sbGluZy5cbiAgICAgIC8vIFJlbW92ZSBzdG9yYWdlIGV2ZW50IGxpc3RlbmVyIHRvIHByZXZlbnQgcG9zc2libGUgZXZlbnQgZHVwbGljYXRpb24uXG4gICAgICB0aGlzLmRldGFjaExpc3RlbmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEVudmlyb25tZW50IGRldGVjdHMgc3RvcmFnZSBjaGFuZ2VzIHZpYSBzdG9yYWdlIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgLy8gUmVtb3ZlIHBvbGxpbmcgbGlzdGVuZXIgdG8gcHJldmVudCBwb3NzaWJsZSBldmVudCBkdXBsaWNhdGlvbi5cbiAgICAgIHRoaXMuc3RvcFBvbGxpbmcoKTtcbiAgICB9XG5cbiAgICAvLyBTYWZhcmkgZW1iZWRkZWQgaWZyYW1lLiBTdG9yYWdlIGV2ZW50IHdpbGwgdHJpZ2dlciB3aXRoIHRoZSBkZWx0YVxuICAgIC8vIGNoYW5nZXMgYnV0IG5vIGNoYW5nZXMgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBpZnJhbWUgbG9jYWxTdG9yYWdlLlxuICAgIGlmICh0aGlzLnNhZmFyaUxvY2FsU3RvcmFnZU5vdFN5bmNlZCkge1xuICAgICAgLy8gR2V0IGN1cnJlbnQgaWZyYW1lIHBhZ2UgdmFsdWUuXG4gICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICAvLyBWYWx1ZSBub3Qgc3luY2hyb25pemVkLCBzeW5jaHJvbml6ZSBtYW51YWxseS5cbiAgICAgIGlmIChldmVudC5uZXdWYWx1ZSAhPT0gc3RvcmVkVmFsdWUpIHtcbiAgICAgICAgaWYgKGV2ZW50Lm5ld1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgLy8gVmFsdWUgY2hhbmdlZCBmcm9tIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oa2V5LCBldmVudC5uZXdWYWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ3VycmVudCB2YWx1ZSBkZWxldGVkLlxuICAgICAgICAgIHRoaXMuc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2NhbENhY2hlW2tleV0gPT09IGV2ZW50Lm5ld1ZhbHVlICYmICFwb2xsKSB7XG4gICAgICAgIC8vIEFscmVhZHkgZGV0ZWN0ZWQgYW5kIHByb2Nlc3NlZCwgZG8gbm90IHRyaWdnZXIgbGlzdGVuZXJzIGFnYWluLlxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJpZ2dlckxpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIC8vIEtlZXAgbG9jYWwgbWFwIHVwIHRvIGRhdGUgaW4gY2FzZSBzdG9yYWdlIGV2ZW50IGlzIHRyaWdnZXJlZCBiZWZvcmVcbiAgICAgIC8vIHBvbGwuXG4gICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgICBpZiAoIXBvbGwgJiYgdGhpcy5sb2NhbENhY2hlW2tleV0gPT09IHN0b3JlZFZhbHVlKSB7XG4gICAgICAgIC8vIFJlYWwgc3RvcmFnZSBldmVudCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGRldGVjdGVkLCBkbyBub3RoaW5nLlxuICAgICAgICAvLyBUaGlzIHNlZW1zIHRvIHRyaWdnZXIgaW4gc29tZSBJRSBicm93c2VycyBmb3Igc29tZSByZWFzb24uXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKGtleSwgc3RvcmVkVmFsdWUpO1xuICAgIH07XG5cbiAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgaWYgKFxuICAgICAgX2lzSUUxMCgpICYmXG4gICAgICBzdG9yZWRWYWx1ZSAhPT0gZXZlbnQubmV3VmFsdWUgJiZcbiAgICAgIGV2ZW50Lm5ld1ZhbHVlICE9PSBldmVudC5vbGRWYWx1ZVxuICAgICkge1xuICAgICAgLy8gSUUgMTAgaGFzIHRoaXMgd2VpcmQgYnVnIHdoZXJlIGEgc3RvcmFnZSBldmVudCB3b3VsZCB0cmlnZ2VyIHdpdGggdGhlXG4gICAgICAvLyBjb3JyZWN0IGtleSwgb2xkVmFsdWUgYW5kIG5ld1ZhbHVlIGJ1dCBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpIGRvZXNcbiAgICAgIC8vIG5vdCB5aWVsZCB0aGUgdXBkYXRlZCB2YWx1ZSB1bnRpbCBhIGZldyBtaWxsaXNlY29uZHMuIFRoaXMgZW5zdXJlc1xuICAgICAgLy8gdGhpcyByZWNvdmVycyBmcm9tIHRoYXQgc2l0dWF0aW9uLlxuICAgICAgc2V0VGltZW91dCh0cmlnZ2VyTGlzdGVuZXJzLCBJRTEwX0xPQ0FMX1NUT1JBR0VfU1lOQ19ERUxBWSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyaWdnZXJMaXN0ZW5lcnMoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG5vdGlmeUxpc3RlbmVycyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IHZhbHVlO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW2tleV07XG4gICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBBcnJheS5mcm9tKGxpc3RlbmVycykpIHtcbiAgICAgICAgbGlzdGVuZXIodmFsdWUgPyBKU09OLnBhcnNlKHZhbHVlKSA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0UG9sbGluZygpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BQb2xsaW5nKCk7XG5cbiAgICB0aGlzLnBvbGxUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMuZm9yQWxsQ2hhbmdlZEtleXMoXG4gICAgICAgIChrZXk6IHN0cmluZywgb2xkVmFsdWU6IHN0cmluZyB8IG51bGwsIG5ld1ZhbHVlOiBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgICAgdGhpcy5vblN0b3JhZ2VFdmVudChcbiAgICAgICAgICAgIG5ldyBTdG9yYWdlRXZlbnQoJ3N0b3JhZ2UnLCB7XG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgICAgICAgIG5ld1ZhbHVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC8qIHBvbGwgKi8gdHJ1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSwgX1BPTExJTkdfSU5URVJWQUxfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUG9sbGluZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb2xsVGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5wb2xsVGltZXIpO1xuICAgICAgdGhpcy5wb2xsVGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXR0YWNoTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0YWNoTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3N0b3JhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIF9hZGRMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFdoZXRoZXIgYnJvd3NlciBjYW4gZGV0ZWN0IHN0b3JhZ2UgZXZlbnQgd2hlbiBpdCBoYWQgYWxyZWFkeSBiZWVuIHB1c2hlZCB0byB0aGUgYmFja2dyb3VuZC5cbiAgICAgIC8vIFRoaXMgbWF5IGhhcHBlbiBpbiBzb21lIG1vYmlsZSBicm93c2Vycy4gQSBsb2NhbFN0b3JhZ2UgY2hhbmdlIGluIHRoZSBmb3JlZ3JvdW5kIHdpbmRvd1xuICAgICAgLy8gd2lsbCBub3QgYmUgZGV0ZWN0ZWQgaW4gdGhlIGJhY2tncm91bmQgd2luZG93IHZpYSB0aGUgc3RvcmFnZSBldmVudC5cbiAgICAgIC8vIFRoaXMgd2FzIGRldGVjdGVkIGluIGlPUyA3LnggbW9iaWxlIGJyb3dzZXJzXG4gICAgICBpZiAodGhpcy5mYWxsYmFja1RvUG9sbGluZykge1xuICAgICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hdHRhY2hMaXN0ZW5lcigpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2tleV0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0gPSBuZXcgU2V0KCk7XG4gICAgICAvLyBQb3B1bGF0ZSB0aGUgY2FjaGUgdG8gYXZvaWQgc3B1cmlvdXNseSB0cmlnZ2VyaW5nIG9uIGZpcnN0IHBvbGwuXG4gICAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfVxuICAgIHRoaXMubGlzdGVuZXJzW2tleV0uYWRkKGxpc3RlbmVyKTtcbiAgfVxuXG4gIF9yZW1vdmVMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0uZGVsZXRlKGxpc3RlbmVyKTtcblxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0uc2l6ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kZXRhY2hMaXN0ZW5lcigpO1xuICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFVwZGF0ZSBsb2NhbCBjYWNoZSBvbiBiYXNlIG9wZXJhdGlvbnM6XG5cbiAgYXN5bmMgX3NldChrZXk6IHN0cmluZywgdmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBzdXBlci5fc2V0KGtleSwgdmFsdWUpO1xuICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpO1xuICB9XG5cbiAgYXN5bmMgX2dldDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBzdXBlci5fZ2V0PFQ+KGtleSk7XG4gICAgdGhpcy5sb2NhbENhY2hlW2tleV0gPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgYXN5bmMgX3JlbW92ZShrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHN1cGVyLl9yZW1vdmUoa2V5KTtcbiAgICBkZWxldGUgdGhpcy5sb2NhbENhY2hlW2tleV07XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIHR5cGUgYExPQ0FMYCB1c2luZyBgbG9jYWxTdG9yYWdlYFxuICogZm9yIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2U6IFBlcnNpc3RlbmNlID0gQnJvd3NlckxvY2FsUGVyc2lzdGVuY2U7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUGVyc2lzdGVuY2UgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQge1xuICBQZXJzaXN0ZW5jZUludGVybmFsIGFzIEludGVybmFsUGVyc2lzdGVuY2UsXG4gIFBlcnNpc3RlbmNlVHlwZSxcbiAgU3RvcmFnZUV2ZW50TGlzdGVuZXJcbn0gZnJvbSAnLi4vLi4vY29yZS9wZXJzaXN0ZW5jZSc7XG5pbXBvcnQgeyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyB9IGZyb20gJy4vYnJvd3Nlcic7XG5cbmNsYXNzIEJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2VcbiAgZXh0ZW5kcyBCcm93c2VyUGVyc2lzdGVuY2VDbGFzc1xuICBpbXBsZW1lbnRzIEludGVybmFsUGVyc2lzdGVuY2VcbntcbiAgc3RhdGljIHR5cGU6ICdTRVNTSU9OJyA9ICdTRVNTSU9OJztcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigoKSA9PiB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UsIFBlcnNpc3RlbmNlVHlwZS5TRVNTSU9OKTtcbiAgfVxuXG4gIF9hZGRMaXN0ZW5lcihfa2V5OiBzdHJpbmcsIF9saXN0ZW5lcjogU3RvcmFnZUV2ZW50TGlzdGVuZXIpOiB2b2lkIHtcbiAgICAvLyBMaXN0ZW5lcnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHNlc3Npb24gc3RvcmFnZSBzaW5jZSBpdCBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyB3aW5kb3dzXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgX3JlbW92ZUxpc3RlbmVyKF9rZXk6IHN0cmluZywgX2xpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIC8vIExpc3RlbmVycyBhcmUgbm90IHN1cHBvcnRlZCBmb3Igc2Vzc2lvbiBzdG9yYWdlIHNpbmNlIGl0IGNhbm5vdCBiZSBzaGFyZWQgYWNyb3NzIHdpbmRvd3NcbiAgICByZXR1cm47XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGVyc2lzdGVuY2V9IG9mIGBTRVNTSU9OYCB1c2luZyBgc2Vzc2lvblN0b3JhZ2VgXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZSA9IEJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqIFRPRE86IHJlbW92ZSB0aGlzIG9uY2UgdHNsaWIgaGFzIGEgcG9seWZpbGwgZm9yIFByb21pc2UuYWxsU2V0dGxlZCAqL1xuaW50ZXJmYWNlIFByb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD4ge1xuICBmdWxmaWxsZWQ6IHRydWU7XG4gIHZhbHVlOiBUO1xufVxuXG5pbnRlcmZhY2UgUHJvbWlzZVJlamVjdGVkUmVzdWx0IHtcbiAgZnVsZmlsbGVkOiBmYWxzZTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVhc29uOiBhbnk7XG59XG5cbmV4cG9ydCB0eXBlIFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+ID1cbiAgfCBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+XG4gIHwgUHJvbWlzZVJlamVjdGVkUmVzdWx0O1xuXG4vKipcbiAqIFNoaW0gZm9yIFByb21pc2UuYWxsU2V0dGxlZCwgbm90ZSB0aGUgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm1hdCBvZiBgZnVsZmlsbGVkYCB2cyBgc3RhdHVzYC5cbiAqXG4gKiBAcGFyYW0gcHJvbWlzZXMgLSBBcnJheSBvZiBwcm9taXNlcyB0byB3YWl0IG9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX2FsbFNldHRsZWQ8VD4oXG4gIHByb21pc2VzOiBBcnJheTxQcm9taXNlPFQ+PlxuKTogUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDxUPj4+IHtcbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHByb21pc2VzLm1hcChhc3luYyBwcm9taXNlID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcHJvbWlzZTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBmdWxmaWxsZWQ6IHRydWUsXG4gICAgICAgICAgdmFsdWVcbiAgICAgICAgfSBhcyBQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+O1xuICAgICAgfSBjYXRjaCAocmVhc29uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZnVsZmlsbGVkOiBmYWxzZSxcbiAgICAgICAgICByZWFzb25cbiAgICAgICAgfSBhcyBQcm9taXNlUmVqZWN0ZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgfSlcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBSZWNlaXZlckhhbmRsZXIsXG4gIF9FdmVudFR5cGUsXG4gIF9SZWNlaXZlclJlc3BvbnNlLFxuICBTZW5kZXJNZXNzYWdlRXZlbnQsXG4gIF9TdGF0dXMsXG4gIF9TZW5kZXJSZXF1ZXN0XG59IGZyb20gJy4vaW5kZXgnO1xuaW1wb3J0IHsgX2FsbFNldHRsZWQgfSBmcm9tICcuL3Byb21pc2UnO1xuXG4vKipcbiAqIEludGVyZmFjZSBjbGFzcyBmb3IgcmVjZWl2aW5nIG1lc3NhZ2VzLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFJlY2VpdmVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcmVjZWl2ZXJzOiBSZWNlaXZlcltdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYm91bmRFdmVudEhhbmRsZXI6IEV2ZW50TGlzdGVuZXI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyc01hcDoge1xuICAgIC8vIFR5cGVzY3JpcHQgZG9lc24ndCBoYXZlIGV4aXN0ZW50aWFsIHR5cGVzIDooXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBbZXZlbnRUeXBlOiBzdHJpbmddOiBTZXQ8UmVjZWl2ZXJIYW5kbGVyPGFueSwgYW55Pj47XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGV2ZW50VGFyZ2V0OiBFdmVudFRhcmdldCkge1xuICAgIHRoaXMuYm91bmRFdmVudEhhbmRsZXIgPSB0aGlzLmhhbmRsZUV2ZW50LmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogT2J0YWluIGFuIGluc3RhbmNlIG9mIGEgUmVjZWl2ZXIgZm9yIGEgZ2l2ZW4gZXZlbnQgdGFyZ2V0LCBpZiBub25lIGV4aXN0cyBpdCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFRhcmdldCAtIEFuIGV2ZW50IHRhcmdldCAoc3VjaCBhcyB3aW5kb3cgb3Igc2VsZikgdGhyb3VnaCB3aGljaCB0aGUgdW5kZXJseWluZ1xuICAgKiBtZXNzYWdlcyB3aWxsIGJlIHJlY2VpdmVkLlxuICAgKi9cbiAgc3RhdGljIF9nZXRJbnN0YW5jZShldmVudFRhcmdldDogRXZlbnRUYXJnZXQpOiBSZWNlaXZlciB7XG4gICAgLy8gVGhlIHJlc3VsdHMgYXJlIHN0b3JlZCBpbiBhbiBhcnJheSBzaW5jZSBvYmplY3RzIGNhbid0IGJlIGtleXMgZm9yIG90aGVyXG4gICAgLy8gb2JqZWN0cy4gSW4gYWRkaXRpb24sIHNldHRpbmcgYSB1bmlxdWUgcHJvcGVydHkgb24gYW4gZXZlbnQgdGFyZ2V0IGFzIGFcbiAgICAvLyBoYXNoIG1hcCBrZXkgbWF5IG5vdCBiZSBhbGxvd2VkIGR1ZSB0byBDT1JTIHJlc3RyaWN0aW9ucy5cbiAgICBjb25zdCBleGlzdGluZ0luc3RhbmNlID0gdGhpcy5yZWNlaXZlcnMuZmluZChyZWNlaXZlciA9PlxuICAgICAgcmVjZWl2ZXIuaXNMaXN0ZW5pbmd0byhldmVudFRhcmdldClcbiAgICApO1xuICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTtcbiAgICB9XG4gICAgY29uc3QgbmV3SW5zdGFuY2UgPSBuZXcgUmVjZWl2ZXIoZXZlbnRUYXJnZXQpO1xuICAgIHRoaXMucmVjZWl2ZXJzLnB1c2gobmV3SW5zdGFuY2UpO1xuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMaXN0ZW5pbmd0byhldmVudFRhcmdldDogRXZlbnRUYXJnZXQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ldmVudFRhcmdldCA9PT0gZXZlbnRUYXJnZXQ7XG4gIH1cblxuICAvKipcbiAgICogRmFucyBvdXQgYSBNZXNzYWdlRXZlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogU2VuZHMgYW4ge0BsaW5rIFN0YXR1cy5BQ0t9IHVwb24gcmVjZWlwdCBhbmQgYSB7QGxpbmsgU3RhdHVzLkRPTkV9IG9uY2UgYWxsIGhhbmRsZXJzIGhhdmVcbiAgICogZmluaXNoZWQgcHJvY2Vzc2luZy5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IC0gVGhlIE1lc3NhZ2VFdmVudC5cbiAgICpcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlRXZlbnQ8XG4gICAgVCBleHRlbmRzIF9SZWNlaXZlclJlc3BvbnNlLFxuICAgIFMgZXh0ZW5kcyBfU2VuZGVyUmVxdWVzdFxuICA+KGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1lc3NhZ2VFdmVudCA9IGV2ZW50IGFzIE1lc3NhZ2VFdmVudDxTZW5kZXJNZXNzYWdlRXZlbnQ8Uz4+O1xuICAgIGNvbnN0IHsgZXZlbnRJZCwgZXZlbnRUeXBlLCBkYXRhIH0gPSBtZXNzYWdlRXZlbnQuZGF0YTtcblxuICAgIGNvbnN0IGhhbmRsZXJzOiBTZXQ8UmVjZWl2ZXJIYW5kbGVyPFQsIFM+PiB8IHVuZGVmaW5lZCA9XG4gICAgICB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV07XG4gICAgaWYgKCFoYW5kbGVycz8uc2l6ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1lc3NhZ2VFdmVudC5wb3J0c1swXS5wb3N0TWVzc2FnZSh7XG4gICAgICBzdGF0dXM6IF9TdGF0dXMuQUNLLFxuICAgICAgZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZVxuICAgIH0pO1xuXG4gICAgY29uc3QgcHJvbWlzZXMgPSBBcnJheS5mcm9tKGhhbmRsZXJzKS5tYXAoYXN5bmMgaGFuZGxlciA9PlxuICAgICAgaGFuZGxlcihtZXNzYWdlRXZlbnQub3JpZ2luLCBkYXRhKVxuICAgICk7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBfYWxsU2V0dGxlZChwcm9taXNlcyk7XG4gICAgbWVzc2FnZUV2ZW50LnBvcnRzWzBdLnBvc3RNZXNzYWdlKHtcbiAgICAgIHN0YXR1czogX1N0YXR1cy5ET05FLFxuICAgICAgZXZlbnRJZCxcbiAgICAgIGV2ZW50VHlwZSxcbiAgICAgIHJlc3BvbnNlXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGEgcGFydGljdWxhciBldmVudC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50VHlwZSAtIEV2ZW50IG5hbWUgdG8gc3Vic2NyaWJlIHRvLlxuICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIC0gVGhlIGV2ZW50IGhhbmRsZXIgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIGV2ZW50cy5cbiAgICpcbiAgICovXG4gIF9zdWJzY3JpYmU8VCBleHRlbmRzIF9SZWNlaXZlclJlc3BvbnNlLCBTIGV4dGVuZHMgX1NlbmRlclJlcXVlc3Q+KFxuICAgIGV2ZW50VHlwZTogX0V2ZW50VHlwZSxcbiAgICBldmVudEhhbmRsZXI6IFJlY2VpdmVySGFuZGxlcjxULCBTPlxuICApOiB2b2lkIHtcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5oYW5kbGVyc01hcCkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLmJvdW5kRXZlbnRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSkge1xuICAgICAgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdID0gbmV3IFNldCgpO1xuICAgIH1cblxuICAgIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXS5hZGQoZXZlbnRIYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBhbiBldmVudCBoYW5kbGVyIGZyb20gYSBwYXJ0aWN1bGFyIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gRXZlbnQgbmFtZSB0byB1bnN1YnNjcmliZSBmcm9tLlxuICAgKiBAcGFyYW0gZXZlbnRIYW5kbGVyIC0gT3B0aW5vYWwgZXZlbnQgaGFuZGxlciwgaWYgbm9uZSBwcm92aWRlZCwgdW5zdWJzY3JpYmUgYWxsIGhhbmRsZXJzIG9uIHRoaXMgZXZlbnQuXG4gICAqXG4gICAqL1xuICBfdW5zdWJzY3JpYmU8VCBleHRlbmRzIF9SZWNlaXZlclJlc3BvbnNlLCBTIGV4dGVuZHMgX1NlbmRlclJlcXVlc3Q+KFxuICAgIGV2ZW50VHlwZTogX0V2ZW50VHlwZSxcbiAgICBldmVudEhhbmRsZXI/OiBSZWNlaXZlckhhbmRsZXI8VCwgUz5cbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXSAmJiBldmVudEhhbmRsZXIpIHtcbiAgICAgIHRoaXMuaGFuZGxlcnNNYXBbZXZlbnRUeXBlXS5kZWxldGUoZXZlbnRIYW5kbGVyKTtcbiAgICB9XG4gICAgaWYgKCFldmVudEhhbmRsZXIgfHwgdGhpcy5oYW5kbGVyc01hcFtldmVudFR5cGVdLnNpemUgPT09IDApIHtcbiAgICAgIGRlbGV0ZSB0aGlzLmhhbmRsZXJzTWFwW2V2ZW50VHlwZV07XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuaGFuZGxlcnNNYXApLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5ib3VuZEV2ZW50SGFuZGxlcik7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIF9nZW5lcmF0ZUV2ZW50SWQocHJlZml4ID0gJycsIGRpZ2l0cyA9IDEwKTogc3RyaW5nIHtcbiAgbGV0IHJhbmRvbSA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZ2l0czsgaSsrKSB7XG4gICAgcmFuZG9tICs9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwKTtcbiAgfVxuICByZXR1cm4gcHJlZml4ICsgcmFuZG9tO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF9nZW5lcmF0ZUV2ZW50SWQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZXZlbnRfaWQnO1xuaW1wb3J0IHtcbiAgX1NlbmRlclJlcXVlc3QsXG4gIF9FdmVudFR5cGUsXG4gIFJlY2VpdmVyTWVzc2FnZUV2ZW50LFxuICBfTWVzc2FnZUVycm9yLFxuICBTZW5kZXJNZXNzYWdlRXZlbnQsXG4gIF9TdGF0dXMsXG4gIF9SZWNlaXZlck1lc3NhZ2VSZXNwb25zZSxcbiAgX1JlY2VpdmVyUmVzcG9uc2UsXG4gIF9UaW1lb3V0RHVyYXRpb25cbn0gZnJvbSAnLi9pbmRleCc7XG5cbmludGVyZmFjZSBNZXNzYWdlSGFuZGxlciB7XG4gIG1lc3NhZ2VDaGFubmVsOiBNZXNzYWdlQ2hhbm5lbDtcbiAgb25NZXNzYWdlOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0O1xufVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3Igc2VuZGluZyBtZXNzYWdlcyBhbmQgd2FpdGluZyBmb3IgYSBjb21wbGV0aW9uIHJlc3BvbnNlLlxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFNlbmRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcnMgPSBuZXcgU2V0PE1lc3NhZ2VIYW5kbGVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdGFyZ2V0OiBTZXJ2aWNlV29ya2VyKSB7fVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSB0aGUgaGFuZGxlciBhbmQgcmVtb3ZlIGl0IGZyb20gb3VyIHRyYWNraW5nIFNldC5cbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBUaGUgaGFuZGxlciB0byB1bnN1YnNjcmliZS5cbiAgICovXG4gIHByaXZhdGUgcmVtb3ZlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcjogTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICBpZiAoaGFuZGxlci5tZXNzYWdlQ2hhbm5lbCkge1xuICAgICAgaGFuZGxlci5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5yZW1vdmVFdmVudExpc3RlbmVyKFxuICAgICAgICAnbWVzc2FnZScsXG4gICAgICAgIGhhbmRsZXIub25NZXNzYWdlXG4gICAgICApO1xuICAgICAgaGFuZGxlci5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5jbG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLmhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgUmVjZWl2ZXIgbG9jYXRlZCBhdCB7QGxpbmsgdGFyZ2V0fS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogV2UnbGwgZmlyc3Qgd2FpdCBhIGJpdCBmb3IgYW4gQUNLICwgaWYgd2UgZ2V0IG9uZSB3ZSB3aWxsIHdhaXQgc2lnbmlmaWNhbnRseSBsb25nZXIgdW50aWwgdGhlXG4gICAqIHJlY2VpdmVyIGhhcyBoYWQgYSBjaGFuY2UgdG8gZnVsbHkgcHJvY2VzcyB0aGUgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGV2ZW50IHRvIHNlbmQuXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHBheWxvYWQgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gdGltZW91dCAtIFRpbWVvdXQgZm9yIHdhaXRpbmcgb24gYW4gQUNLIGZyb20gdGhlIHJlY2VpdmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBzZXR0bGVkIHByb21pc2VzIGZyb20gYWxsIHRoZSBoYW5kbGVycyB0aGF0IHdlcmUgbGlzdGVuaW5nIG9uIHRoZSByZWNlaXZlci5cbiAgICovXG4gIGFzeW5jIF9zZW5kPFQgZXh0ZW5kcyBfUmVjZWl2ZXJSZXNwb25zZSwgUyBleHRlbmRzIF9TZW5kZXJSZXF1ZXN0PihcbiAgICBldmVudFR5cGU6IF9FdmVudFR5cGUsXG4gICAgZGF0YTogUyxcbiAgICB0aW1lb3V0ID0gX1RpbWVvdXREdXJhdGlvbi5BQ0tcbiAgKTogUHJvbWlzZTxfUmVjZWl2ZXJNZXNzYWdlUmVzcG9uc2U8VD4+IHtcbiAgICBjb25zdCBtZXNzYWdlQ2hhbm5lbCA9XG4gICAgICB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgIT09ICd1bmRlZmluZWQnID8gbmV3IE1lc3NhZ2VDaGFubmVsKCkgOiBudWxsO1xuICAgIGlmICghbWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihfTWVzc2FnZUVycm9yLkNPTk5FQ1RJT05fVU5BVkFJTEFCTEUpO1xuICAgIH1cbiAgICAvLyBOb2RlIHRpbWVycyBhbmQgYnJvd3NlciB0aW1lcnMgcmV0dXJuIGZ1bmRhbWVudGFsbHkgZGlmZmVyZW50IHR5cGVzLlxuICAgIC8vIFdlIGRvbid0IGFjdHVhbGx5IGNhcmUgd2hhdCB0aGUgdmFsdWUgaXMgYnV0IFRTIHdvbid0IGFjY2VwdCB1bmtub3duIGFuZFxuICAgIC8vIHdlIGNhbid0IGNhc3QgcHJvcGVybHkgaW4gYm90aCBlbnZpcm9ubWVudHMuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBsZXQgY29tcGxldGlvblRpbWVyOiBhbnk7XG4gICAgbGV0IGhhbmRsZXI6IE1lc3NhZ2VIYW5kbGVyO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxfUmVjZWl2ZXJNZXNzYWdlUmVzcG9uc2U8VD4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50SWQgPSBfZ2VuZXJhdGVFdmVudElkKCcnLCAyMCk7XG4gICAgICBtZXNzYWdlQ2hhbm5lbC5wb3J0MS5zdGFydCgpO1xuICAgICAgY29uc3QgYWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihfTWVzc2FnZUVycm9yLlVOU1VQUE9SVEVEX0VWRU5UKSk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICAgIGhhbmRsZXIgPSB7XG4gICAgICAgIG1lc3NhZ2VDaGFubmVsLFxuICAgICAgICBvbk1lc3NhZ2UoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUV2ZW50ID0gZXZlbnQgYXMgTWVzc2FnZUV2ZW50PFJlY2VpdmVyTWVzc2FnZUV2ZW50PFQ+PjtcbiAgICAgICAgICBpZiAobWVzc2FnZUV2ZW50LmRhdGEuZXZlbnRJZCAhPT0gZXZlbnRJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2VFdmVudC5kYXRhLnN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSBfU3RhdHVzLkFDSzpcbiAgICAgICAgICAgICAgLy8gVGhlIHJlY2VpdmVyIHNob3VsZCBBQ0sgZmlyc3QuXG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dChhY2tUaW1lcik7XG4gICAgICAgICAgICAgIGNvbXBsZXRpb25UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoX01lc3NhZ2VFcnJvci5USU1FT1VUKSk7XG4gICAgICAgICAgICAgIH0sIF9UaW1lb3V0RHVyYXRpb24uQ09NUExFVElPTik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBfU3RhdHVzLkRPTkU6XG4gICAgICAgICAgICAgIC8vIE9uY2UgdGhlIHJlY2VpdmVyJ3MgaGFuZGxlcnMgYXJlIGZpbmlzaGVkIHdlIHdpbGwgZ2V0IHRoZSByZXN1bHRzLlxuICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoY29tcGxldGlvblRpbWVyKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShtZXNzYWdlRXZlbnQuZGF0YS5yZXNwb25zZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGFja1RpbWVyKTtcbiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGNvbXBsZXRpb25UaW1lcik7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoX01lc3NhZ2VFcnJvci5JTlZBTElEX1JFU1BPTlNFKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHRoaXMuaGFuZGxlcnMuYWRkKGhhbmRsZXIpO1xuICAgICAgbWVzc2FnZUNoYW5uZWwucG9ydDEuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIub25NZXNzYWdlKTtcbiAgICAgIHRoaXMudGFyZ2V0LnBvc3RNZXNzYWdlKFxuICAgICAgICB7XG4gICAgICAgICAgZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50SWQsXG4gICAgICAgICAgZGF0YVxuICAgICAgICB9IGFzIFNlbmRlck1lc3NhZ2VFdmVudDxTPixcbiAgICAgICAgW21lc3NhZ2VDaGFubmVsLnBvcnQyXVxuICAgICAgKTtcbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgIHRoaXMucmVtb3ZlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBSZWNhcHRjaGEsIEdyZUNBUFRDSEFUb3BMZXZlbCB9IGZyb20gJy4vcmVjYXB0Y2hhL3JlY2FwdGNoYSc7XG5cbi8qKlxuICogQSBzcGVjaWFsaXplZCB3aW5kb3cgdHlwZSB0aGF0IG1lbGRzIHRoZSBub3JtYWwgd2luZG93IHR5cGUgcGx1cyB0aGVcbiAqIHZhcmlvdXMgYml0cyB3ZSBuZWVkLiBUaGUgdGhyZWUgZGlmZmVyZW50IGJsb2NrcyB0aGF0IGFyZSAmJ2QgdG9nZXRoZXJcbiAqIGNhbnQgYmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBibG9jayB0b2dldGhlci5cbiAqL1xuZXhwb3J0IHR5cGUgQXV0aFdpbmRvdyA9IHtcbiAgLy8gU3RhbmRhcmQgd2luZG93IHR5cGVzXG4gIFtUIGluIGtleW9mIFdpbmRvd106IFdpbmRvd1tUXTtcbn0gJiB7XG4gIC8vIEFueSBrbm93biAvIG5hbWVkIHByb3BlcnRpZXMgd2Ugd2FudCB0byBhZGRcbiAgZ3JlY2FwdGNoYT86IFJlY2FwdGNoYSB8IEdyZUNBUFRDSEFUb3BMZXZlbDtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgX19fanNsPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZ2FwaT86IHR5cGVvZiBnYXBpO1xufSAmIHtcbiAgLy8gQSBmaW5hbCBjYXRjaC1hbGwgZm9yIGNhbGxiYWNrcyAod2hpY2ggd2lsbCBoYXZlIHJhbmRvbSBuYW1lcykgdGhhdFxuICAvLyB3ZSB3aWxsIHN0aWNrIG9uIHRoZSB3aW5kb3cuXG4gIFtjYWxsYmFjazogc3RyaW5nXTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZDtcbn07XG5cbi8qKlxuICogTGF6eSBhY2Nlc3NvciBmb3Igd2luZG93LCBzaW5jZSB0aGUgY29tcGF0IGxheWVyIHdvbid0IHRyZWUgc2hha2UgdGhpcyBvdXQsXG4gKiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBub3QgdG8gbWVzcyB3aXRoIHdpbmRvdyB1bmxlc3Mgd2UgaGF2ZSB0b1xuICovXG5leHBvcnQgZnVuY3Rpb24gX3dpbmRvdygpOiBBdXRoV2luZG93IHtcbiAgcmV0dXJuIHdpbmRvdyBhcyB1bmtub3duIGFzIEF1dGhXaW5kb3c7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfc2V0V2luZG93TG9jYXRpb24odXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgX3dpbmRvdygpLmxvY2F0aW9uLmhyZWYgPSB1cmw7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF93aW5kb3cgfSBmcm9tICcuLi9hdXRoX3dpbmRvdyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfaXNXb3JrZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIF93aW5kb3coKVsnV29ya2VyR2xvYmFsU2NvcGUnXSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgX3dpbmRvdygpWydpbXBvcnRTY3JpcHRzJ10gPT09ICdmdW5jdGlvbidcbiAgKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9nZXRBY3RpdmVTZXJ2aWNlV29ya2VyKCk6IFByb21pc2U8U2VydmljZVdvcmtlciB8IG51bGw+IHtcbiAgaWYgKCFuYXZpZ2F0b3I/LnNlcnZpY2VXb3JrZXIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGF3YWl0IG5hdmlnYXRvci5zZXJ2aWNlV29ya2VyLnJlYWR5O1xuICAgIHJldHVybiByZWdpc3RyYXRpb24uYWN0aXZlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldFNlcnZpY2VXb3JrZXJDb250cm9sbGVyKCk6IFNlcnZpY2VXb3JrZXIgfCBudWxsIHtcbiAgcmV0dXJuIG5hdmlnYXRvcj8uc2VydmljZVdvcmtlcj8uY29udHJvbGxlciB8fCBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2dldFdvcmtlckdsb2JhbFNjb3BlKCk6IFNlcnZpY2VXb3JrZXIgfCBudWxsIHtcbiAgcmV0dXJuIF9pc1dvcmtlcigpID8gKHNlbGYgYXMgdW5rbm93biBhcyBTZXJ2aWNlV29ya2VyKSA6IG51bGw7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgUGVyc2lzdGVuY2UgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHtcbiAgUGVyc2lzdGVkQmxvYixcbiAgUGVyc2lzdGVuY2VJbnRlcm5hbCBhcyBJbnRlcm5hbFBlcnNpc3RlbmNlLFxuICBQZXJzaXN0ZW5jZVR5cGUsXG4gIFBlcnNpc3RlbmNlVmFsdWUsXG4gIFN0b3JhZ2VFdmVudExpc3RlbmVyLFxuICBTVE9SQUdFX0FWQUlMQUJMRV9LRVlcbn0gZnJvbSAnLi4vLi4vY29yZS9wZXJzaXN0ZW5jZS8nO1xuaW1wb3J0IHtcbiAgX0V2ZW50VHlwZSxcbiAgX1BpbmdSZXNwb25zZSxcbiAgS2V5Q2hhbmdlZFJlc3BvbnNlLFxuICBLZXlDaGFuZ2VkUmVxdWVzdCxcbiAgUGluZ1JlcXVlc3QsXG4gIF9UaW1lb3V0RHVyYXRpb25cbn0gZnJvbSAnLi4vbWVzc2FnZWNoYW5uZWwvaW5kZXgnO1xuaW1wb3J0IHsgUmVjZWl2ZXIgfSBmcm9tICcuLi9tZXNzYWdlY2hhbm5lbC9yZWNlaXZlcic7XG5pbXBvcnQgeyBTZW5kZXIgfSBmcm9tICcuLi9tZXNzYWdlY2hhbm5lbC9zZW5kZXInO1xuaW1wb3J0IHtcbiAgX2lzV29ya2VyLFxuICBfZ2V0QWN0aXZlU2VydmljZVdvcmtlcixcbiAgX2dldFNlcnZpY2VXb3JrZXJDb250cm9sbGVyLFxuICBfZ2V0V29ya2VyR2xvYmFsU2NvcGVcbn0gZnJvbSAnLi4vdXRpbC93b3JrZXInO1xuXG5leHBvcnQgY29uc3QgREJfTkFNRSA9ICdmaXJlYmFzZUxvY2FsU3RvcmFnZURiJztcbmNvbnN0IERCX1ZFUlNJT04gPSAxO1xuY29uc3QgREJfT0JKRUNUU1RPUkVfTkFNRSA9ICdmaXJlYmFzZUxvY2FsU3RvcmFnZSc7XG5jb25zdCBEQl9EQVRBX0tFWVBBVEggPSAnZmJhc2Vfa2V5JztcblxuaW50ZXJmYWNlIERCT2JqZWN0IHtcbiAgW0RCX0RBVEFfS0VZUEFUSF06IHN0cmluZztcbiAgdmFsdWU6IFBlcnNpc3RlZEJsb2I7XG59XG5cbi8qKlxuICogUHJvbWlzZSB3cmFwcGVyIGZvciBJREJSZXF1ZXN0XG4gKlxuICogVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCBjbGVhbmx5IGV4dGVuZCBQcm9taXNlPFQ+IHNpbmNlIHByb21pc2VzIGFyZSBub3QgY2FsbGFibGUgaW4gRVM2XG4gKlxuICovXG5jbGFzcyBEQlByb21pc2U8VD4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3Q6IElEQlJlcXVlc3QpIHt9XG5cbiAgdG9Qcm9taXNlKCk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxUPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh0aGlzLnJlcXVlc3QucmVzdWx0KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICByZWplY3QodGhpcy5yZXF1ZXN0LmVycm9yKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldE9iamVjdFN0b3JlKGRiOiBJREJEYXRhYmFzZSwgaXNSZWFkV3JpdGU6IGJvb2xlYW4pOiBJREJPYmplY3RTdG9yZSB7XG4gIHJldHVybiBkYlxuICAgIC50cmFuc2FjdGlvbihbREJfT0JKRUNUU1RPUkVfTkFNRV0sIGlzUmVhZFdyaXRlID8gJ3JlYWR3cml0ZScgOiAncmVhZG9ubHknKVxuICAgIC5vYmplY3RTdG9yZShEQl9PQkpFQ1RTVE9SRV9OQU1FKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9jbGVhckRhdGFiYXNlKGRiOiBJREJEYXRhYmFzZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBvYmplY3RTdG9yZSA9IGdldE9iamVjdFN0b3JlKGRiLCB0cnVlKTtcbiAgcmV0dXJuIG5ldyBEQlByb21pc2U8dm9pZD4ob2JqZWN0U3RvcmUuY2xlYXIoKSkudG9Qcm9taXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfZGVsZXRlRGF0YWJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIuZGVsZXRlRGF0YWJhc2UoREJfTkFNRSk7XG4gIHJldHVybiBuZXcgREJQcm9taXNlPHZvaWQ+KHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX29wZW5EYXRhYmFzZSgpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3BlbihEQl9OQU1FLCBEQl9WRVJTSU9OKTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgcmVqZWN0KHJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuXG4gICAgcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCd1cGdyYWRlbmVlZGVkJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGIgPSByZXF1ZXN0LnJlc3VsdDtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoREJfT0JKRUNUU1RPUkVfTkFNRSwgeyBrZXlQYXRoOiBEQl9EQVRBX0tFWVBBVEggfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcignc3VjY2VzcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGRiOiBJREJEYXRhYmFzZSA9IHJlcXVlc3QucmVzdWx0O1xuICAgICAgLy8gU3RyYW5nZSBidWcgdGhhdCBvY2N1cnMgaW4gRmlyZWZveCB3aGVuIG11bHRpcGxlIHRhYnMgYXJlIG9wZW5lZCBhdCB0aGVcbiAgICAgIC8vIHNhbWUgdGltZS4gVGhlIG9ubHkgd2F5IHRvIHJlY292ZXIgc2VlbXMgdG8gYmUgZGVsZXRpbmcgdGhlIGRhdGFiYXNlXG4gICAgICAvLyBhbmQgcmUtaW5pdGlhbGl6aW5nIGl0LlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZpcmViYXNlL2ZpcmViYXNlLWpzLXNkay9pc3N1ZXMvNjM0XG5cbiAgICAgIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhEQl9PQkpFQ1RTVE9SRV9OQU1FKSkge1xuICAgICAgICAvLyBOZWVkIHRvIGNsb3NlIHRoZSBkYXRhYmFzZSBvciBlbHNlIHlvdSBnZXQgYSBgYmxvY2tlZGAgZXZlbnRcbiAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgYXdhaXQgX2RlbGV0ZURhdGFiYXNlKCk7XG4gICAgICAgIHJlc29sdmUoYXdhaXQgX29wZW5EYXRhYmFzZSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZGIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9wdXRPYmplY3QoXG4gIGRiOiBJREJEYXRhYmFzZSxcbiAga2V5OiBzdHJpbmcsXG4gIHZhbHVlOiBQZXJzaXN0ZW5jZVZhbHVlIHwgc3RyaW5nXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCB0cnVlKS5wdXQoe1xuICAgIFtEQl9EQVRBX0tFWVBBVEhdOiBrZXksXG4gICAgdmFsdWVcbiAgfSk7XG4gIHJldHVybiBuZXcgREJQcm9taXNlPHZvaWQ+KHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPYmplY3QoXG4gIGRiOiBJREJEYXRhYmFzZSxcbiAga2V5OiBzdHJpbmdcbik6IFByb21pc2U8UGVyc2lzdGVkQmxvYiB8IG51bGw+IHtcbiAgY29uc3QgcmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCBmYWxzZSkuZ2V0KGtleSk7XG4gIGNvbnN0IGRhdGEgPSBhd2FpdCBuZXcgREJQcm9taXNlPERCT2JqZWN0IHwgdW5kZWZpbmVkPihyZXF1ZXN0KS50b1Byb21pc2UoKTtcbiAgcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBkYXRhLnZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX2RlbGV0ZU9iamVjdChkYjogSURCRGF0YWJhc2UsIGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlcXVlc3QgPSBnZXRPYmplY3RTdG9yZShkYiwgdHJ1ZSkuZGVsZXRlKGtleSk7XG4gIHJldHVybiBuZXcgREJQcm9taXNlPHZvaWQ+KHJlcXVlc3QpLnRvUHJvbWlzZSgpO1xufVxuXG5leHBvcnQgY29uc3QgX1BPTExJTkdfSU5URVJWQUxfTVMgPSA4MDA7XG5leHBvcnQgY29uc3QgX1RSQU5TQUNUSU9OX1JFVFJZX0NPVU5UID0gMztcblxuY2xhc3MgSW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSBpbXBsZW1lbnRzIEludGVybmFsUGVyc2lzdGVuY2Uge1xuICBzdGF0aWMgdHlwZTogJ0xPQ0FMJyA9ICdMT0NBTCc7XG5cbiAgdHlwZSA9IFBlcnNpc3RlbmNlVHlwZS5MT0NBTDtcbiAgZGI/OiBJREJEYXRhYmFzZTtcbiAgcmVhZG9ubHkgX3Nob3VsZEFsbG93TWlncmF0aW9uID0gdHJ1ZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyczogUmVjb3JkPHN0cmluZywgU2V0PFN0b3JhZ2VFdmVudExpc3RlbmVyPj4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2NhbENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBQZXJzaXN0ZW5jZVZhbHVlIHwgbnVsbD4gPSB7fTtcbiAgLy8gc2V0VGltZW91dCByZXR1cm4gdmFsdWUgaXMgcGxhdGZvcm0gc3BlY2lmaWNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBwb2xsVGltZXI6IGFueSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBlbmRpbmdXcml0ZXMgPSAwO1xuXG4gIHByaXZhdGUgcmVjZWl2ZXI6IFJlY2VpdmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc2VuZGVyOiBTZW5kZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZXJ2aWNlV29ya2VyUmVjZWl2ZXJBdmFpbGFibGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhY3RpdmVTZXJ2aWNlV29ya2VyOiBTZXJ2aWNlV29ya2VyIHwgbnVsbCA9IG51bGw7XG4gIC8vIFZpc2libGUgZm9yIHRlc3Rpbmcgb25seVxuICByZWFkb25seSBfd29ya2VySW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEZpcmUgJiBmb3JnZXQgdGhlIHNlcnZpY2Ugd29ya2VyIHJlZ2lzdHJhdGlvbiBhcyBpdCBtYXkgbmV2ZXIgcmVzb2x2ZVxuICAgIHRoaXMuX3dvcmtlckluaXRpYWxpemF0aW9uUHJvbWlzZSA9XG4gICAgICB0aGlzLmluaXRpYWxpemVTZXJ2aWNlV29ya2VyTWVzc2FnaW5nKCkudGhlbihcbiAgICAgICAgKCkgPT4ge30sXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICB9XG5cbiAgYXN5bmMgX29wZW5EYigpOiBQcm9taXNlPElEQkRhdGFiYXNlPiB7XG4gICAgaWYgKHRoaXMuZGIpIHtcbiAgICAgIHJldHVybiB0aGlzLmRiO1xuICAgIH1cbiAgICB0aGlzLmRiID0gYXdhaXQgX29wZW5EYXRhYmFzZSgpO1xuICAgIHJldHVybiB0aGlzLmRiO1xuICB9XG5cbiAgYXN5bmMgX3dpdGhSZXRyaWVzPFQ+KG9wOiAoZGI6IElEQkRhdGFiYXNlKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IG51bUF0dGVtcHRzID0gMDtcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYiA9IGF3YWl0IHRoaXMuX29wZW5EYigpO1xuICAgICAgICByZXR1cm4gYXdhaXQgb3AoZGIpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAobnVtQXR0ZW1wdHMrKyA+IF9UUkFOU0FDVElPTl9SRVRSWV9DT1VOVCkge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZGIpIHtcbiAgICAgICAgICB0aGlzLmRiLmNsb3NlKCk7XG4gICAgICAgICAgdGhpcy5kYiA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgZXhwb25lbnRpYWwgYmFja29mZlxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRleGVkREIgZXZlbnRzIGRvIG5vdCBwcm9wYWdhdGUgZnJvbSB0aGUgbWFpbiB3aW5kb3cgdG8gdGhlIHdvcmtlciBjb250ZXh0LiAgV2UgcmVseSBvbiBhXG4gICAqIHBvc3RNZXNzYWdlIGludGVyZmFjZSB0byBzZW5kIHRoZXNlIGV2ZW50cyB0byB0aGUgd29ya2VyIG91cnNlbHZlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZVNlcnZpY2VXb3JrZXJNZXNzYWdpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIF9pc1dvcmtlcigpID8gdGhpcy5pbml0aWFsaXplUmVjZWl2ZXIoKSA6IHRoaXMuaW5pdGlhbGl6ZVNlbmRlcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzIHRoZSB3b3JrZXIgd2Ugc2hvdWxkIGxpc3RlbiB0byBldmVudHMgZnJvbSB0aGUgbWFpbiB3aW5kb3cuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVSZWNlaXZlcigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlY2VpdmVyID0gUmVjZWl2ZXIuX2dldEluc3RhbmNlKF9nZXRXb3JrZXJHbG9iYWxTY29wZSgpISk7XG4gICAgLy8gUmVmcmVzaCBmcm9tIHBlcnNpc3RlbmNlIGlmIHdlIHJlY2VpdmUgYSBLZXlDaGFuZ2VkIG1lc3NhZ2UuXG4gICAgdGhpcy5yZWNlaXZlci5fc3Vic2NyaWJlKFxuICAgICAgX0V2ZW50VHlwZS5LRVlfQ0hBTkdFRCxcbiAgICAgIGFzeW5jIChfb3JpZ2luOiBzdHJpbmcsIGRhdGE6IEtleUNoYW5nZWRSZXF1ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSBhd2FpdCB0aGlzLl9wb2xsKCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5UHJvY2Vzc2VkOiBrZXlzLmluY2x1ZGVzKGRhdGEua2V5KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICk7XG4gICAgLy8gTGV0IHRoZSBzZW5kZXIga25vdyB0aGF0IHdlIGFyZSBsaXN0ZW5pbmcgc28gdGhleSBnaXZlIHVzIG1vcmUgdGltZW91dC5cbiAgICB0aGlzLnJlY2VpdmVyLl9zdWJzY3JpYmUoXG4gICAgICBfRXZlbnRUeXBlLlBJTkcsXG4gICAgICBhc3luYyAoX29yaWdpbjogc3RyaW5nLCBfZGF0YTogUGluZ1JlcXVlc3QpID0+IHtcbiAgICAgICAgcmV0dXJuIFtfRXZlbnRUeXBlLktFWV9DSEFOR0VEXTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzIHRoZSBtYWluIHdpbmRvdywgd2Ugc2hvdWxkIGxldCB0aGUgd29ya2VyIGtub3cgd2hlbiBrZXlzIGNoYW5nZSAoc2V0IGFuZCByZW1vdmUpLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1NlcnZpY2VXb3JrZXJDb250YWluZXIvcmVhZHkgfCBTZXJ2aWNlV29ya2VyQ29udGFpbmVyLnJlYWR5fVxuICAgKiBtYXkgbm90IHJlc29sdmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVTZW5kZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYW4gYWN0aXZlIHNlcnZpY2Ugd29ya2VyLlxuICAgIHRoaXMuYWN0aXZlU2VydmljZVdvcmtlciA9IGF3YWl0IF9nZXRBY3RpdmVTZXJ2aWNlV29ya2VyKCk7XG4gICAgaWYgKCF0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZW5kZXIgPSBuZXcgU2VuZGVyKHRoaXMuYWN0aXZlU2VydmljZVdvcmtlcik7XG4gICAgLy8gUGluZyB0aGUgc2VydmljZSB3b3JrZXIgdG8gY2hlY2sgd2hhdCBldmVudHMgdGhleSBjYW4gaGFuZGxlLlxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnNlbmRlci5fc2VuZDxfUGluZ1Jlc3BvbnNlLCBQaW5nUmVxdWVzdD4oXG4gICAgICBfRXZlbnRUeXBlLlBJTkcsXG4gICAgICB7fSxcbiAgICAgIF9UaW1lb3V0RHVyYXRpb24uTE9OR19BQ0tcbiAgICApO1xuICAgIGlmICghcmVzdWx0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICByZXN1bHRzWzBdPy5mdWxmaWxsZWQgJiZcbiAgICAgIHJlc3VsdHNbMF0/LnZhbHVlLmluY2x1ZGVzKF9FdmVudFR5cGUuS0VZX0NIQU5HRUQpXG4gICAgKSB7XG4gICAgICB0aGlzLnNlcnZpY2VXb3JrZXJSZWNlaXZlckF2YWlsYWJsZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExldCB0aGUgd29ya2VyIGtub3cgYWJvdXQgYSBjaGFuZ2VkIGtleSwgdGhlIGV4YWN0IGtleSBkb2Vzbid0IHRlY2huaWNhbGx5IG1hdHRlciBzaW5jZSB0aGVcbiAgICogd29ya2VyIHdpbGwganVzdCB0cmlnZ2VyIGEgZnVsbCBzeW5jIGFueXdheS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIG5vdywgd2Ugb25seSBzdXBwb3J0IG9uZSBzZXJ2aWNlIHdvcmtlciBwZXIgcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIGtleSAtIFN0b3JhZ2Uga2V5IHdoaWNoIGNoYW5nZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIG5vdGlmeVNlcnZpY2VXb3JrZXIoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5zZW5kZXIgfHxcbiAgICAgICF0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXIgfHxcbiAgICAgIF9nZXRTZXJ2aWNlV29ya2VyQ29udHJvbGxlcigpICE9PSB0aGlzLmFjdGl2ZVNlcnZpY2VXb3JrZXJcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZGVyLl9zZW5kPEtleUNoYW5nZWRSZXNwb25zZSwgS2V5Q2hhbmdlZFJlcXVlc3Q+KFxuICAgICAgICBfRXZlbnRUeXBlLktFWV9DSEFOR0VELFxuICAgICAgICB7IGtleSB9LFxuICAgICAgICAvLyBVc2UgbG9uZyB0aW1lb3V0IGlmIHJlY2VpdmVyIGhhcyBwcmV2aW91c2x5IHJlc3BvbmRlZCB0byBhIHBpbmcgZnJvbSB1cy5cbiAgICAgICAgdGhpcy5zZXJ2aWNlV29ya2VyUmVjZWl2ZXJBdmFpbGFibGVcbiAgICAgICAgICA/IF9UaW1lb3V0RHVyYXRpb24uTE9OR19BQ0tcbiAgICAgICAgICA6IF9UaW1lb3V0RHVyYXRpb24uQUNLXG4gICAgICApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVGhpcyBpcyBhIGJlc3QgZWZmb3J0IGFwcHJvYWNoLiBJZ25vcmUgZXJyb3JzLlxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIF9pc0F2YWlsYWJsZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFpbmRleGVkREIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgZGIgPSBhd2FpdCBfb3BlbkRhdGFiYXNlKCk7XG4gICAgICBhd2FpdCBfcHV0T2JqZWN0KGRiLCBTVE9SQUdFX0FWQUlMQUJMRV9LRVksICcxJyk7XG4gICAgICBhd2FpdCBfZGVsZXRlT2JqZWN0KGRiLCBTVE9SQUdFX0FWQUlMQUJMRV9LRVkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7fVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3dpdGhQZW5kaW5nV3JpdGUod3JpdGU6ICgpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnBlbmRpbmdXcml0ZXMrKztcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGUoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5wZW5kaW5nV3JpdGVzLS07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3NldChrZXk6IHN0cmluZywgdmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd2l0aFBlbmRpbmdXcml0ZShhc3luYyAoKSA9PiB7XG4gICAgICBhd2FpdCB0aGlzLl93aXRoUmV0cmllcygoZGI6IElEQkRhdGFiYXNlKSA9PiBfcHV0T2JqZWN0KGRiLCBrZXksIHZhbHVlKSk7XG4gICAgICB0aGlzLmxvY2FsQ2FjaGVba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXMubm90aWZ5U2VydmljZVdvcmtlcihrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgX2dldDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VWYWx1ZT4oa2V5OiBzdHJpbmcpOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3Qgb2JqID0gKGF3YWl0IHRoaXMuX3dpdGhSZXRyaWVzKChkYjogSURCRGF0YWJhc2UpID0+XG4gICAgICBnZXRPYmplY3QoZGIsIGtleSlcbiAgICApKSBhcyBUO1xuICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gb2JqO1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBhc3luYyBfcmVtb3ZlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dpdGhQZW5kaW5nV3JpdGUoYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5fd2l0aFJldHJpZXMoKGRiOiBJREJEYXRhYmFzZSkgPT4gX2RlbGV0ZU9iamVjdChkYiwga2V5KSk7XG4gICAgICBkZWxldGUgdGhpcy5sb2NhbENhY2hlW2tleV07XG4gICAgICByZXR1cm4gdGhpcy5ub3RpZnlTZXJ2aWNlV29ya2VyKGtleSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9wb2xsKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAvLyBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIGZhbGxiYWNrIGlmIGdldEFsbCBpcyBub3Qgc3VwcG9ydGVkXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5fd2l0aFJldHJpZXMoKGRiOiBJREJEYXRhYmFzZSkgPT4ge1xuICAgICAgY29uc3QgZ2V0QWxsUmVxdWVzdCA9IGdldE9iamVjdFN0b3JlKGRiLCBmYWxzZSkuZ2V0QWxsKCk7XG4gICAgICByZXR1cm4gbmV3IERCUHJvbWlzZTxEQk9iamVjdFtdIHwgbnVsbD4oZ2V0QWxsUmVxdWVzdCkudG9Qcm9taXNlKCk7XG4gICAgfSk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyB3cml0ZXMgaW4gcHJvZ3Jlc3MgYWJvcnQsIHdlJ2xsIGdldCBwaWNrZWQgdXAgb24gdGhlIG5leHQgcG9sbFxuICAgIGlmICh0aGlzLnBlbmRpbmdXcml0ZXMgIT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gW107XG4gICAgY29uc3Qga2V5c0luUmVzdWx0ID0gbmV3IFNldCgpO1xuICAgIGZvciAoY29uc3QgeyBmYmFzZV9rZXk6IGtleSwgdmFsdWUgfSBvZiByZXN1bHQpIHtcbiAgICAgIGtleXNJblJlc3VsdC5hZGQoa2V5KTtcbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLmxvY2FsQ2FjaGVba2V5XSkgIT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkge1xuICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhrZXksIHZhbHVlIGFzIFBlcnNpc3RlbmNlVmFsdWUpO1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCBsb2NhbEtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmxvY2FsQ2FjaGUpKSB7XG4gICAgICBpZiAodGhpcy5sb2NhbENhY2hlW2xvY2FsS2V5XSAmJiAha2V5c0luUmVzdWx0Lmhhcyhsb2NhbEtleSkpIHtcbiAgICAgICAgLy8gRGVsZXRlZFxuICAgICAgICB0aGlzLm5vdGlmeUxpc3RlbmVycyhsb2NhbEtleSwgbnVsbCk7XG4gICAgICAgIGtleXMucHVzaChsb2NhbEtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBrZXlzO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlMaXN0ZW5lcnMoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgbmV3VmFsdWU6IFBlcnNpc3RlbmNlVmFsdWUgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIHRoaXMubG9jYWxDYWNoZVtrZXldID0gbmV3VmFsdWU7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5saXN0ZW5lcnNba2V5XTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIEFycmF5LmZyb20obGlzdGVuZXJzKSkge1xuICAgICAgICBsaXN0ZW5lcihuZXdWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFBvbGxpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUG9sbGluZygpO1xuXG4gICAgdGhpcy5wb2xsVGltZXIgPSBzZXRJbnRlcnZhbChcbiAgICAgIGFzeW5jICgpID0+IHRoaXMuX3BvbGwoKSxcbiAgICAgIF9QT0xMSU5HX0lOVEVSVkFMX01TXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcFBvbGxpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucG9sbFRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucG9sbFRpbWVyKTtcbiAgICAgIHRoaXMucG9sbFRpbWVyID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBfYWRkTGlzdGVuZXIoa2V5OiBzdHJpbmcsIGxpc3RlbmVyOiBTdG9yYWdlRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLmxpc3RlbmVycykubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9sbGluZygpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubGlzdGVuZXJzW2tleV0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0gPSBuZXcgU2V0KCk7XG4gICAgICAvLyBQb3B1bGF0ZSB0aGUgY2FjaGUgdG8gYXZvaWQgc3B1cmlvdXNseSB0cmlnZ2VyaW5nIG9uIGZpcnN0IHBvbGwuXG4gICAgICB2b2lkIHRoaXMuX2dldChrZXkpOyAvLyBUaGlzIGNhbiBoYXBwZW4gaW4gdGhlIGJhY2tncm91bmQgYXN5bmMgYW5kIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkuXG4gICAgfVxuICAgIHRoaXMubGlzdGVuZXJzW2tleV0uYWRkKGxpc3RlbmVyKTtcbiAgfVxuXG4gIF9yZW1vdmVMaXN0ZW5lcihrZXk6IHN0cmluZywgbGlzdGVuZXI6IFN0b3JhZ2VFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0pIHtcbiAgICAgIHRoaXMubGlzdGVuZXJzW2tleV0uZGVsZXRlKGxpc3RlbmVyKTtcblxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJzW2tleV0uc2l6ZSA9PT0gMCkge1xuICAgICAgICBkZWxldGUgdGhpcy5saXN0ZW5lcnNba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5saXN0ZW5lcnMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdG9wUG9sbGluZygpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBQZXJzaXN0ZW5jZX0gb2YgdHlwZSBgTE9DQUxgIHVzaW5nIGBpbmRleGVkREJgXG4gKiBmb3IgdGhlIHVuZGVybHlpbmcgc3RvcmFnZS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlOiBQZXJzaXN0ZW5jZSA9IEluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2U7XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgX3BlcmZvcm1BcGlSZXF1ZXN0LFxuICBFbmRwb2ludCxcbiAgSHR0cE1ldGhvZCxcbiAgX2FkZFRpZElmTmVjZXNzYXJ5XG59IGZyb20gJy4uL2luZGV4JztcbmltcG9ydCB7IEF1dGggfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgSWRUb2tlblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWwvaWRfdG9rZW4nO1xuaW1wb3J0IHsgTWZhRW5yb2xsbWVudCB9IGZyb20gJy4uL2FjY291bnRfbWFuYWdlbWVudC9tZmEnO1xuaW1wb3J0IHsgU2lnbkluV2l0aElkcFJlc3BvbnNlIH0gZnJvbSAnLi9pZHAnO1xuaW1wb3J0IHtcbiAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVxdWVzdCxcbiAgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2Vcbn0gZnJvbSAnLi9zbXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplTWZhUmVzcG9uc2Uge1xuICBpZFRva2VuOiBzdHJpbmc7XG4gIHJlZnJlc2hUb2tlbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkVG9rZW5NZmFSZXNwb25zZSBleHRlbmRzIElkVG9rZW5SZXNwb25zZSB7XG4gIG1mYVBlbmRpbmdDcmVkZW50aWFsPzogc3RyaW5nO1xuICBtZmFJbmZvPzogTWZhRW5yb2xsbWVudFtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0UGhvbmVNZmFTaWduSW5SZXF1ZXN0IHtcbiAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZztcbiAgbWZhRW5yb2xsbWVudElkOiBzdHJpbmc7XG4gIHBob25lU2lnbkluSW5mbzoge1xuICAgIHJlY2FwdGNoYVRva2VuOiBzdHJpbmc7XG4gIH07XG4gIHRlbmFudElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0UGhvbmVNZmFTaWduSW5SZXNwb25zZSB7XG4gIHBob25lUmVzcG9uc2VJbmZvOiB7XG4gICAgc2Vzc2lvbkluZm86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0U2lnbkluUGhvbmVNZmEoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IFN0YXJ0UGhvbmVNZmFTaWduSW5SZXF1ZXN0XG4pOiBQcm9taXNlPFN0YXJ0UGhvbmVNZmFTaWduSW5SZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIFN0YXJ0UGhvbmVNZmFTaWduSW5SZXF1ZXN0LFxuICAgIFN0YXJ0UGhvbmVNZmFTaWduSW5SZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LlNUQVJUX01GQV9TSUdOX0lOLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXF1ZXN0IHtcbiAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZztcbiAgcGhvbmVWZXJpZmljYXRpb25JbmZvOiBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXF1ZXN0O1xuICB0ZW5hbnRJZD86IHN0cmluZztcbn1cblxuLy8gVE9UUCBNRkEgU2lnbiBpbiBvbmx5IGhhcyBhIGZpbmFsaXplIHBoYXNlLiBQaG9uZSBNRkEgaGFzIGEgc3RhcnQgcGhhc2UgdG8gaW5pdGlhdGUgc2VuZGluZyBhblxuLy8gU01TIGFuZCBhIGZpbmFsaXplIHBoYXNlIHRvIGNvbXBsZXRlIHNpZ24gaW4uIFdpdGggVE9UUCwgdGhlIHVzZXIgYWxyZWFkeSBoYXMgdGhlIE9UUCBpbiB0aGVcbi8vIFRPVFAvQXV0aGVudGljYXRvciBhcHAuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplVG90cE1mYVNpZ25JblJlcXVlc3Qge1xuICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc3RyaW5nO1xuICB0b3RwVmVyaWZpY2F0aW9uSW5mbzogeyB2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcgfTtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIG1mYUVucm9sbG1lbnRJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXNwb25zZSBleHRlbmRzIEZpbmFsaXplTWZhUmVzcG9uc2Uge31cblxuZXhwb3J0IGludGVyZmFjZSBGaW5hbGl6ZVRvdHBNZmFTaWduSW5SZXNwb25zZSBleHRlbmRzIEZpbmFsaXplTWZhUmVzcG9uc2Uge31cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsaXplU2lnbkluUGhvbmVNZmEoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXF1ZXN0XG4pOiBQcm9taXNlPEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXNwb25zZT4ge1xuICByZXR1cm4gX3BlcmZvcm1BcGlSZXF1ZXN0PFxuICAgIEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXF1ZXN0LFxuICAgIEZpbmFsaXplUGhvbmVNZmFTaWduSW5SZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LkZJTkFMSVpFX01GQV9TSUdOX0lOLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluYWxpemVTaWduSW5Ub3RwTWZhKFxuICBhdXRoOiBBdXRoLFxuICByZXF1ZXN0OiBGaW5hbGl6ZVRvdHBNZmFTaWduSW5SZXF1ZXN0XG4pOiBQcm9taXNlPEZpbmFsaXplVG90cE1mYVNpZ25JblJlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8XG4gICAgRmluYWxpemVUb3RwTWZhU2lnbkluUmVxdWVzdCxcbiAgICBGaW5hbGl6ZVRvdHBNZmFTaWduSW5SZXNwb25zZVxuICA+KFxuICAgIGF1dGgsXG4gICAgSHR0cE1ldGhvZC5QT1NULFxuICAgIEVuZHBvaW50LkZJTkFMSVpFX01GQV9TSUdOX0lOLFxuICAgIF9hZGRUaWRJZk5lY2Vzc2FyeShhdXRoLCByZXF1ZXN0KVxuICApO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdHlwZSBQaG9uZU9yT2F1dGhUb2tlblJlc3BvbnNlID1cbiAgfCBTaWduSW5XaXRoUGhvbmVOdW1iZXJSZXNwb25zZVxuICB8IFNpZ25JbldpdGhJZHBSZXNwb25zZVxuICB8IElkVG9rZW5SZXNwb25zZTtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBSZWNhcHRjaGFQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7XG4gIFJlY2FwdGNoYSxcbiAgR3JlQ0FQVENIQVRvcExldmVsLFxuICBHcmVDQVBUQ0hBUmVuZGVyT3B0aW9uLFxuICBHcmVDQVBUQ0hBXG59IGZyb20gJy4vcmVjYXB0Y2hhJztcblxuZXhwb3J0IGNvbnN0IF9TT0xWRV9USU1FX01TID0gNTAwO1xuZXhwb3J0IGNvbnN0IF9FWFBJUkFUSU9OX1RJTUVfTVMgPSA2MF8wMDA7XG5leHBvcnQgY29uc3QgX1dJREdFVF9JRF9TVEFSVCA9IDFfMDAwXzAwMF8wMDBfMDAwO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdpZGdldCB7XG4gIGdldFJlc3BvbnNlOiAoKSA9PiBzdHJpbmcgfCBudWxsO1xuICBkZWxldGU6ICgpID0+IHZvaWQ7XG4gIGV4ZWN1dGU6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrUmVDYXB0Y2hhIGltcGxlbWVudHMgUmVjYXB0Y2hhIHtcbiAgcHJpdmF0ZSBjb3VudGVyID0gX1dJREdFVF9JRF9TVEFSVDtcbiAgX3dpZGdldHMgPSBuZXcgTWFwPG51bWJlciwgV2lkZ2V0PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIHJlbmRlcihcbiAgICBjb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgIHBhcmFtZXRlcnM/OiBSZWNhcHRjaGFQYXJhbWV0ZXJzXG4gICk6IG51bWJlciB7XG4gICAgY29uc3QgaWQgPSB0aGlzLmNvdW50ZXI7XG4gICAgdGhpcy5fd2lkZ2V0cy5zZXQoXG4gICAgICBpZCxcbiAgICAgIG5ldyBNb2NrV2lkZ2V0KGNvbnRhaW5lciwgdGhpcy5hdXRoLm5hbWUsIHBhcmFtZXRlcnMgfHwge30pXG4gICAgKTtcbiAgICB0aGlzLmNvdW50ZXIrKztcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICByZXNldChvcHRXaWRnZXRJZD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcbiAgICB2b2lkIHRoaXMuX3dpZGdldHMuZ2V0KGlkKT8uZGVsZXRlKCk7XG4gICAgdGhpcy5fd2lkZ2V0cy5kZWxldGUoaWQpO1xuICB9XG5cbiAgZ2V0UmVzcG9uc2Uob3B0V2lkZ2V0SWQ/OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGlkID0gb3B0V2lkZ2V0SWQgfHwgX1dJREdFVF9JRF9TVEFSVDtcbiAgICByZXR1cm4gdGhpcy5fd2lkZ2V0cy5nZXQoaWQpPy5nZXRSZXNwb25zZSgpIHx8ICcnO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZShvcHRXaWRnZXRJZD86IG51bWJlciB8IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgaWQ6IG51bWJlciA9IChvcHRXaWRnZXRJZCBhcyBudW1iZXIpIHx8IF9XSURHRVRfSURfU1RBUlQ7XG4gICAgdm9pZCB0aGlzLl93aWRnZXRzLmdldChpZCk/LmV4ZWN1dGUoKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1vY2tHcmVDQVBUQ0hBVG9wTGV2ZWwgaW1wbGVtZW50cyBHcmVDQVBUQ0hBVG9wTGV2ZWwge1xuICBlbnRlcnByaXNlOiBHcmVDQVBUQ0hBID0gbmV3IE1vY2tHcmVDQVBUQ0hBKCk7XG4gIHJlYWR5KGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIGV4ZWN1dGUoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9zaXRlS2V5OiBzdHJpbmcsXG4gICAgX29wdGlvbnM6IHsgYWN0aW9uOiBzdHJpbmcgfVxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJ3Rva2VuJyk7XG4gIH1cbiAgcmVuZGVyKFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBfY29udGFpbmVyOiBzdHJpbmcgfCBIVE1MRWxlbWVudCxcbiAgICBfcGFyYW1ldGVyczogR3JlQ0FQVENIQVJlbmRlck9wdGlvblxuICApOiBzdHJpbmcge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW9ja0dyZUNBUFRDSEEgaW1wbGVtZW50cyBHcmVDQVBUQ0hBIHtcbiAgcmVhZHkoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjYWxsYmFjaygpO1xuICB9XG5cbiAgZXhlY3V0ZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgX3NpdGVLZXk6IHN0cmluZyxcbiAgICBfb3B0aW9uczogeyBhY3Rpb246IHN0cmluZyB9XG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgndG9rZW4nKTtcbiAgfVxuICByZW5kZXIoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIF9jb250YWluZXI6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgIF9wYXJhbWV0ZXJzOiBHcmVDQVBUQ0hBUmVuZGVyT3B0aW9uXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNb2NrV2lkZ2V0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGlzVmlzaWJsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSB0aW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkZWxldGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzcG9uc2VUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xpY2tIYW5kbGVyID0gKCk6IHZvaWQgPT4ge1xuICAgIHRoaXMuZXhlY3V0ZSgpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNvbnRhaW5lck9ySWQ6IHN0cmluZyB8IEhUTUxFbGVtZW50LFxuICAgIGFwcE5hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcmFtczogUmVjYXB0Y2hhUGFyYW1ldGVyc1xuICApIHtcbiAgICBjb25zdCBjb250YWluZXIgPVxuICAgICAgdHlwZW9mIGNvbnRhaW5lck9ySWQgPT09ICdzdHJpbmcnXG4gICAgICAgID8gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY29udGFpbmVyT3JJZClcbiAgICAgICAgOiBjb250YWluZXJPcklkO1xuICAgIF9hc3NlcnQoY29udGFpbmVyLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SLCB7IGFwcE5hbWUgfSk7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IHRoaXMucGFyYW1zLnNpemUgIT09ICdpbnZpc2libGUnO1xuICAgIGlmICh0aGlzLmlzVmlzaWJsZSkge1xuICAgICAgdGhpcy5leGVjdXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbGlja0hhbmRsZXIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFJlc3BvbnNlKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5yZXNwb25zZVRva2VuO1xuICB9XG5cbiAgZGVsZXRlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcbiAgICB0aGlzLmRlbGV0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnRpbWVySWQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVySWQpO1xuICAgICAgdGhpcy50aW1lcklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5jb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLmNsaWNrSGFuZGxlcik7XG4gIH1cblxuICBleGVjdXRlKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tJZkRlbGV0ZWQoKTtcbiAgICBpZiAodGhpcy50aW1lcklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZXNwb25zZVRva2VuID0gZ2VuZXJhdGVSYW5kb21BbHBoYU51bWVyaWNTdHJpbmcoNTApO1xuICAgICAgY29uc3QgeyBjYWxsYmFjaywgJ2V4cGlyZWQtY2FsbGJhY2snOiBleHBpcmVkQ2FsbGJhY2sgfSA9IHRoaXMucGFyYW1zO1xuICAgICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2FsbGJhY2sodGhpcy5yZXNwb25zZVRva2VuKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cblxuICAgICAgdGhpcy50aW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVySWQgPSBudWxsO1xuICAgICAgICB0aGlzLnJlc3BvbnNlVG9rZW4gPSBudWxsO1xuICAgICAgICBpZiAoZXhwaXJlZENhbGxiYWNrKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV4cGlyZWRDYWxsYmFjaygpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgICB0aGlzLmV4ZWN1dGUoKTtcbiAgICAgICAgfVxuICAgICAgfSwgX0VYUElSQVRJT05fVElNRV9NUyk7XG4gICAgfSwgX1NPTFZFX1RJTUVfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmRGVsZXRlZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZWxldGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlQ0FQVENIQSBtb2NrIHdhcyBhbHJlYWR5IGRlbGV0ZWQhJyk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tQWxwaGFOdW1lcmljU3RyaW5nKGxlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY2hhcnMgPSBbXTtcbiAgY29uc3QgYWxsb3dlZENoYXJzID1cbiAgICAnMTIzNDU2Nzg5MGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY2hhcnMucHVzaChcbiAgICAgIGFsbG93ZWRDaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYWxsb3dlZENoYXJzLmxlbmd0aCkpXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgcXVlcnlzdHJpbmcgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0LCBfY3JlYXRlRXJyb3IgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IERlbGF5IH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2RlbGF5JztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgX3dpbmRvdyB9IGZyb20gJy4uL2F1dGhfd2luZG93JztcbmltcG9ydCAqIGFzIGpzSGVscGVycyBmcm9tICcuLi9sb2FkX2pzJztcbmltcG9ydCB7IFJlY2FwdGNoYSwgaXNWMiB9IGZyb20gJy4vcmVjYXB0Y2hhJztcbmltcG9ydCB7IE1vY2tSZUNhcHRjaGEgfSBmcm9tICcuL3JlY2FwdGNoYV9tb2NrJztcblxuLy8gUmVDYXB0Y2hhIHdpbGwgbG9hZCB1c2luZyB0aGUgc2FtZSBjYWxsYmFjaywgc28gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG5lZWRzXG4vLyB0byBiZSBrZXB0IGFyb3VuZFxuZXhwb3J0IGNvbnN0IF9KU0xPQURfQ0FMTEJBQ0sgPSBqc0hlbHBlcnMuX2dlbmVyYXRlQ2FsbGJhY2tOYW1lKCdyY2InKTtcbmNvbnN0IE5FVFdPUktfVElNRU9VVF9ERUxBWSA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xuY29uc3QgUkVDQVBUQ0hBX0JBU0UgPSAnaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYXBpLmpzPyc7XG5cbi8qKlxuICogV2UgbmVlZCB0byBtYXJrIHRoaXMgaW50ZXJmYWNlIGFzIGludGVybmFsIGV4cGxpY2l0bHkgdG8gZXhjbHVkZSBpdCBpbiB0aGUgcHVibGljIHR5cGluZ3MsIGJlY2F1c2VcbiAqIGl0IHJlZmVyZW5jZXMgQXV0aEludGVybmFsIHdoaWNoIGhhcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2l0aCBVc2VySW50ZXJuYWwuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVDYXB0Y2hhTG9hZGVyIHtcbiAgbG9hZChhdXRoOiBBdXRoSW50ZXJuYWwsIGhsPzogc3RyaW5nKTogUHJvbWlzZTxSZWNhcHRjaGE+O1xuICBjbGVhcmVkT25lSW5zdGFuY2UoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBMb2FkZXIgZm9yIHRoZSBHUmVDYXB0Y2hhIGxpYnJhcnkuIFRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgb25lIG9mIHRoaXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZUNhcHRjaGFMb2FkZXJJbXBsIGltcGxlbWVudHMgUmVDYXB0Y2hhTG9hZGVyIHtcbiAgcHJpdmF0ZSBob3N0TGFuZ3VhZ2UgPSAnJztcbiAgcHJpdmF0ZSBjb3VudGVyID0gMDtcbiAgLyoqXG4gICAqIENoZWNrIGZvciBgcmVuZGVyKClgIG1ldGhvZC4gYHdpbmRvdy5ncmVjYXB0Y2hhYCB3aWxsIGV4aXN0IGlmIHRoZSBFbnRlcnByaXNlXG4gICAqIHZlcnNpb24gb2YgdGhlIFJlQ0FQVENIQSBzY3JpcHQgd2FzIGxvYWRlZCBieSBzb21lb25lIGVsc2UgKGUuZy4gQXBwIENoZWNrKSBidXRcbiAgICogYHdpbmRvdy5ncmVjYXB0Y2hhLnJlbmRlcigpYCB3aWxsIG5vdC4gQW5vdGhlciBsb2FkIHdpbGwgYWRkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsaWJyYXJ5U2VwYXJhdGVseUxvYWRlZCA9ICEhX3dpbmRvdygpLmdyZWNhcHRjaGE/LnJlbmRlcjtcblxuICBsb2FkKGF1dGg6IEF1dGhJbnRlcm5hbCwgaGwgPSAnJyk6IFByb21pc2U8UmVjYXB0Y2hhPiB7XG4gICAgX2Fzc2VydChpc0hvc3RMYW5ndWFnZVZhbGlkKGhsKSwgYXV0aCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG5cbiAgICBpZiAodGhpcy5zaG91bGRSZXNvbHZlSW1tZWRpYXRlbHkoaGwpICYmIGlzVjIoX3dpbmRvdygpLmdyZWNhcHRjaGEpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKF93aW5kb3coKS5ncmVjYXB0Y2hhISBhcyBSZWNhcHRjaGEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2U8UmVjYXB0Y2hhPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBuZXR3b3JrVGltZW91dCA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLk5FVFdPUktfUkVRVUVTVF9GQUlMRUQpKTtcbiAgICAgIH0sIE5FVFdPUktfVElNRU9VVF9ERUxBWS5nZXQoKSk7XG5cbiAgICAgIF93aW5kb3coKVtfSlNMT0FEX0NBTExCQUNLXSA9ICgpID0+IHtcbiAgICAgICAgX3dpbmRvdygpLmNsZWFyVGltZW91dChuZXR3b3JrVGltZW91dCk7XG4gICAgICAgIGRlbGV0ZSBfd2luZG93KClbX0pTTE9BRF9DQUxMQkFDS107XG5cbiAgICAgICAgY29uc3QgcmVjYXB0Y2hhID0gX3dpbmRvdygpLmdyZWNhcHRjaGEgYXMgUmVjYXB0Y2hhO1xuXG4gICAgICAgIGlmICghcmVjYXB0Y2hhIHx8ICFpc1YyKHJlY2FwdGNoYSkpIHtcbiAgICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXcmFwIHRoZSBncmVwdGNoYSByZW5kZXIgZnVuY3Rpb24gc28gdGhhdCB3ZSBrbm93IGlmIHRoZSBkZXZlbG9wZXIgaGFzXG4gICAgICAgIC8vIGNhbGxlZCBpdCBzZXBhcmF0ZWx5XG4gICAgICAgIGNvbnN0IHJlbmRlciA9IHJlY2FwdGNoYS5yZW5kZXI7XG4gICAgICAgIHJlY2FwdGNoYS5yZW5kZXIgPSAoY29udGFpbmVyLCBwYXJhbXMpID0+IHtcbiAgICAgICAgICBjb25zdCB3aWRnZXRJZCA9IHJlbmRlcihjb250YWluZXIsIHBhcmFtcyk7XG4gICAgICAgICAgdGhpcy5jb3VudGVyKys7XG4gICAgICAgICAgcmV0dXJuIHdpZGdldElkO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuaG9zdExhbmd1YWdlID0gaGw7XG4gICAgICAgIHJlc29sdmUocmVjYXB0Y2hhKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHVybCA9IGAke1JFQ0FQVENIQV9CQVNFfT8ke3F1ZXJ5c3RyaW5nKHtcbiAgICAgICAgb25sb2FkOiBfSlNMT0FEX0NBTExCQUNLLFxuICAgICAgICByZW5kZXI6ICdleHBsaWNpdCcsXG4gICAgICAgIGhsXG4gICAgICB9KX1gO1xuXG4gICAgICBqc0hlbHBlcnMuX2xvYWRKUyh1cmwpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KG5ldHdvcmtUaW1lb3V0KTtcbiAgICAgICAgcmVqZWN0KF9jcmVhdGVFcnJvcihhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyZWRPbmVJbnN0YW5jZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50ZXItLTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkUmVzb2x2ZUltbWVkaWF0ZWx5KGhsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBXZSBjYW4gcmVzb2x2ZSBpbW1lZGlhdGVseSBpZjpcbiAgICAvLyAgIOKAoiBncmVjYXB0Y2hhIGlzIGFscmVhZHkgZGVmaW5lZCBBTkQgKFxuICAgIC8vICAgICAxLiB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlIGNvZGVzIGFyZSB0aGUgc2FtZSBPUlxuICAgIC8vICAgICAyLiB0aGVyZSBleGlzdHMgYWxyZWFkeSBhIFJlQ2FwdGNoYSBvbiB0aGUgcGFnZVxuICAgIC8vICAgICAzLiB0aGUgbGlicmFyeSB3YXMgYWxyZWFkeSBsb2FkZWQgYnkgdGhlIGFwcFxuICAgIC8vIEluIGNhc2VzICgyKSBhbmQgKDMpLCB3ZSBfY2FuJ3RfIHJlbG9hZCBhcyBpdCB3b3VsZCBicmVhayB0aGUgcmVjYXB0Y2hhc1xuICAgIC8vIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIHBhZ2VcbiAgICByZXR1cm4gKFxuICAgICAgISFfd2luZG93KCkuZ3JlY2FwdGNoYT8ucmVuZGVyICYmXG4gICAgICAoaGwgPT09IHRoaXMuaG9zdExhbmd1YWdlIHx8XG4gICAgICAgIHRoaXMuY291bnRlciA+IDAgfHxcbiAgICAgICAgdGhpcy5saWJyYXJ5U2VwYXJhdGVseUxvYWRlZClcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzSG9zdExhbmd1YWdlVmFsaWQoaGw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaGwubGVuZ3RoIDw9IDYgJiYgL15cXHMqW2EtekEtWjAtOVxcLV0qXFxzKiQvLnRlc3QoaGwpO1xufVxuXG5leHBvcnQgY2xhc3MgTW9ja1JlQ2FwdGNoYUxvYWRlckltcGwgaW1wbGVtZW50cyBSZUNhcHRjaGFMb2FkZXIge1xuICBhc3luYyBsb2FkKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8UmVjYXB0Y2hhPiB7XG4gICAgcmV0dXJuIG5ldyBNb2NrUmVDYXB0Y2hhKGF1dGgpO1xuICB9XG5cbiAgY2xlYXJlZE9uZUluc3RhbmNlKCk6IHZvaWQge31cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBdXRoLCBSZWNhcHRjaGFQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IGdldFJlY2FwdGNoYVBhcmFtcyB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9yZWNhcHRjaGEnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2lzSHR0cE9ySHR0cHMgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvbG9jYXRpb24nO1xuaW1wb3J0IHsgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXBwbGljYXRpb25fdmVyaWZpZXInO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfd2luZG93IH0gZnJvbSAnLi4vYXV0aF93aW5kb3cnO1xuaW1wb3J0IHsgX2lzV29ya2VyIH0gZnJvbSAnLi4vdXRpbC93b3JrZXInO1xuaW1wb3J0IHsgUmVjYXB0Y2hhIH0gZnJvbSAnLi9yZWNhcHRjaGEnO1xuaW1wb3J0IHtcbiAgTW9ja1JlQ2FwdGNoYUxvYWRlckltcGwsXG4gIFJlQ2FwdGNoYUxvYWRlcixcbiAgUmVDYXB0Y2hhTG9hZGVySW1wbFxufSBmcm9tICcuL3JlY2FwdGNoYV9sb2FkZXInO1xuXG5leHBvcnQgY29uc3QgUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUgPSAncmVjYXB0Y2hhJztcblxuY29uc3QgREVGQVVMVF9QQVJBTVM6IFJlY2FwdGNoYVBhcmFtZXRlcnMgPSB7XG4gIHRoZW1lOiAnbGlnaHQnLFxuICB0eXBlOiAnaW1hZ2UnXG59O1xuXG50eXBlIFRva2VuQ2FsbGJhY2sgPSAodG9rZW46IHN0cmluZykgPT4gdm9pZDtcblxuLyoqXG4gKiBBbiB7QGxpbmsgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvIHwgcmVDQVBUQ0hBfS1iYXNlZCBhcHBsaWNhdGlvbiB2ZXJpZmllci5cbiAqXG4gKiBAcmVtYXJrc1xuICogYFJlY2FwdGNoYVZlcmlmaWVyYCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWNhcHRjaGFWZXJpZmllciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbCB7XG4gIC8qKlxuICAgKiBUaGUgYXBwbGljYXRpb24gdmVyaWZpZXIgdHlwZS5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogRm9yIGEgcmVDQVBUQ0hBIHZlcmlmaWVyLCB0aGlzIGlzICdyZWNhcHRjaGEnLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZSA9IFJFQ0FQVENIQV9WRVJJRklFUl9UWVBFO1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuICBwcml2YXRlIHdpZGdldElkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGlzSW52aXNpYmxlOiBib29sZWFuO1xuICBwcml2YXRlIHJlYWRvbmx5IHRva2VuQ2hhbmdlTGlzdGVuZXJzID0gbmV3IFNldDxUb2tlbkNhbGxiYWNrPigpO1xuICBwcml2YXRlIHJlbmRlclByb21pc2U6IFByb21pc2U8bnVtYmVyPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGg6IEF1dGhJbnRlcm5hbDtcblxuICAvKiogQGludGVybmFsICovXG4gIHJlYWRvbmx5IF9yZWNhcHRjaGFMb2FkZXI6IFJlQ2FwdGNoYUxvYWRlcjtcbiAgcHJpdmF0ZSByZWNhcHRjaGE6IFJlY2FwdGNoYSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXV0aEV4dGVybiAtIFRoZSBjb3JyZXNwb25kaW5nIEZpcmViYXNlIHtAbGluayBBdXRofSBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lck9ySWQgLSBUaGUgcmVDQVBUQ0hBIGNvbnRhaW5lciBwYXJhbWV0ZXIuXG4gICAqXG4gICAqIEByZW1hcmtzXG4gICAqIFRoaXMgaGFzIGRpZmZlcmVudCBtZWFuaW5nIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByZUNBUFRDSEEgaXMgaGlkZGVuIG9yIHZpc2libGUuIEZvciBhXG4gICAqIHZpc2libGUgcmVDQVBUQ0hBIHRoZSBjb250YWluZXIgbXVzdCBiZSBlbXB0eS4gSWYgYSBzdHJpbmcgaXMgdXNlZCwgaXQgaGFzIHRvIGNvcnJlc3BvbmQgdG9cbiAgICogYW4gZWxlbWVudCBJRC4gVGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBtdXN0IGFsc28gbXVzdCBiZSBpbiB0aGUgRE9NIGF0IHRoZSB0aW1lIG9mXG4gICAqIGluaXRpYWxpemF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyAtIFRoZSBvcHRpb25hbCByZUNBUFRDSEEgcGFyYW1ldGVycy5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogQ2hlY2sgdGhlIHJlQ0FQVENIQSBkb2NzIGZvciBhIGNvbXByZWhlbnNpdmUgbGlzdC4gQWxsIHBhcmFtZXRlcnMgYXJlIGFjY2VwdGVkIGV4Y2VwdCBmb3JcbiAgICogdGhlIHNpdGVrZXkuIEZpcmViYXNlIEF1dGggYmFja2VuZCBwcm92aXNpb25zIGEgcmVDQVBUQ0hBIGZvciBlYWNoIHByb2plY3QgYW5kIHdpbGxcbiAgICogY29uZmlndXJlIHRoaXMgdXBvbiByZW5kZXJpbmcuIEZvciBhbiBpbnZpc2libGUgcmVDQVBUQ0hBLCBhIHNpemUga2V5IG11c3QgaGF2ZSB0aGUgdmFsdWVcbiAgICogJ2ludmlzaWJsZScuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBhdXRoRXh0ZXJuOiBBdXRoLFxuICAgIGNvbnRhaW5lck9ySWQ6IEhUTUxFbGVtZW50IHwgc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcGFyYW1ldGVyczogUmVjYXB0Y2hhUGFyYW1ldGVycyA9IHtcbiAgICAgIC4uLkRFRkFVTFRfUEFSQU1TXG4gICAgfVxuICApIHtcbiAgICB0aGlzLmF1dGggPSBfY2FzdEF1dGgoYXV0aEV4dGVybik7XG4gICAgdGhpcy5pc0ludmlzaWJsZSA9IHRoaXMucGFyYW1ldGVycy5zaXplID09PSAnaW52aXNpYmxlJztcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURURcbiAgICApO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgICB0eXBlb2YgY29udGFpbmVyT3JJZCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjb250YWluZXJPcklkKVxuICAgICAgICA6IGNvbnRhaW5lck9ySWQ7XG4gICAgX2Fzc2VydChjb250YWluZXIsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUik7XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICB0aGlzLnBhcmFtZXRlcnMuY2FsbGJhY2sgPSB0aGlzLm1ha2VUb2tlbkNhbGxiYWNrKHRoaXMucGFyYW1ldGVycy5jYWxsYmFjayk7XG5cbiAgICB0aGlzLl9yZWNhcHRjaGFMb2FkZXIgPSB0aGlzLmF1dGguc2V0dGluZ3MuYXBwVmVyaWZpY2F0aW9uRGlzYWJsZWRGb3JUZXN0aW5nXG4gICAgICA/IG5ldyBNb2NrUmVDYXB0Y2hhTG9hZGVySW1wbCgpXG4gICAgICA6IG5ldyBSZUNhcHRjaGFMb2FkZXJJbXBsKCk7XG5cbiAgICB0aGlzLnZhbGlkYXRlU3RhcnRpbmdTdGF0ZSgpO1xuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgaWYgc2RrIHZlcnNpb24gaXMgbmVlZGVkXG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSB1c2VyIHRvIHNvbHZlIHRoZSByZUNBUFRDSEEgYW5kIHJlc29sdmVzIHdpdGggdGhlIHJlQ0FQVENIQSB0b2tlbi5cbiAgICpcbiAgICogQHJldHVybnMgQSBQcm9taXNlIGZvciB0aGUgcmVDQVBUQ0hBIHRva2VuLlxuICAgKi9cbiAgYXN5bmMgdmVyaWZ5KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICBjb25zdCBpZCA9IGF3YWl0IHRoaXMucmVuZGVyKCk7XG4gICAgY29uc3QgcmVjYXB0Y2hhID0gdGhpcy5nZXRBc3NlcnRlZFJlY2FwdGNoYSgpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSByZWNhcHRjaGEuZ2V0UmVzcG9uc2UoaWQpO1xuICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgdG9rZW5DaGFuZ2UgPSAodG9rZW46IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgdG9rZW4gZXhwaXJhdGlvbnMuXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2tlbkNoYW5nZUxpc3RlbmVycy5kZWxldGUodG9rZW5DaGFuZ2UpO1xuICAgICAgICByZXNvbHZlKHRva2VuKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMudG9rZW5DaGFuZ2VMaXN0ZW5lcnMuYWRkKHRva2VuQ2hhbmdlKTtcbiAgICAgIGlmICh0aGlzLmlzSW52aXNpYmxlKSB7XG4gICAgICAgIHJlY2FwdGNoYS5leGVjdXRlKGlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSByZUNBUFRDSEEgd2lkZ2V0IG9uIHRoZSBwYWdlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZUNBUFRDSEEgd2lkZ2V0IElELlxuICAgKi9cbiAgcmVuZGVyKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIHByb21pc2UuIFNpbmNlIGl0J3Mgbm90IGFzeW5jICh3ZSB3YW50IHRvIHJldHVybiB0aGVcbiAgICAgIC8vIF9zYW1lXyBwcm9taXNlIGlmIHJlbmRlcmluZyBpcyBzdGlsbCBvY2N1cnJpbmcpLCB0aGUgQVBJIHN1cmZhY2Ugc2hvdWxkXG4gICAgICAvLyByZWplY3Qgd2l0aCB0aGUgZXJyb3IgcmF0aGVyIHRoYW4ganVzdCB0aHJvd1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlbmRlclByb21pc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclByb21pc2U7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJQcm9taXNlID0gdGhpcy5tYWtlUmVuZGVyUHJvbWlzZSgpLmNhdGNoKGUgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJQcm9taXNlID0gbnVsbDtcbiAgICAgIHRocm93IGU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5yZW5kZXJQcm9taXNlO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICBpZiAodGhpcy53aWRnZXRJZCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5nZXRBc3NlcnRlZFJlY2FwdGNoYSgpLnJlc2V0KHRoaXMud2lkZ2V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHJlQ0FQVENIQSB3aWRnZXQgZnJvbSB0aGUgcGFnZSBhbmQgZGVzdHJveXMgdGhlIGluc3RhbmNlLlxuICAgKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnROb3REZXN0cm95ZWQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5fcmVjYXB0Y2hhTG9hZGVyLmNsZWFyZWRPbmVJbnN0YW5jZSgpO1xuICAgIGlmICghdGhpcy5pc0ludmlzaWJsZSkge1xuICAgICAgdGhpcy5jb250YWluZXIuY2hpbGROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdmFsaWRhdGVTdGFydGluZ1N0YXRlKCk6IHZvaWQge1xuICAgIF9hc3NlcnQoIXRoaXMucGFyYW1ldGVycy5zaXRla2V5LCB0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1IpO1xuICAgIF9hc3NlcnQoXG4gICAgICB0aGlzLmlzSW52aXNpYmxlIHx8ICF0aGlzLmNvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCksXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICAgKTtcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuT1BFUkFUSU9OX05PVF9TVVBQT1JURURcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlVG9rZW5DYWxsYmFjayhcbiAgICBleGlzdGluZzogVG9rZW5DYWxsYmFjayB8IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBUb2tlbkNhbGxiYWNrIHtcbiAgICByZXR1cm4gdG9rZW4gPT4ge1xuICAgICAgdGhpcy50b2tlbkNoYW5nZUxpc3RlbmVycy5mb3JFYWNoKGxpc3RlbmVyID0+IGxpc3RlbmVyKHRva2VuKSk7XG4gICAgICBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGV4aXN0aW5nKHRva2VuKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4aXN0aW5nID09PSAnc3RyaW5nJykge1xuICAgICAgICBjb25zdCBnbG9iYWxGdW5jID0gX3dpbmRvdygpW2V4aXN0aW5nXTtcbiAgICAgICAgaWYgKHR5cGVvZiBnbG9iYWxGdW5jID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZ2xvYmFsRnVuYyh0b2tlbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3NlcnROb3REZXN0cm95ZWQoKTogdm9pZCB7XG4gICAgX2Fzc2VydCghdGhpcy5kZXN0cm95ZWQsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1ha2VSZW5kZXJQcm9taXNlKCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgaWYgKCF0aGlzLndpZGdldElkKSB7XG4gICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5jb250YWluZXI7XG4gICAgICBpZiAoIXRoaXMuaXNJbnZpc2libGUpIHtcbiAgICAgICAgY29uc3QgZ3VhcmFudGVlZEVtcHR5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChndWFyYW50ZWVkRW1wdHkpO1xuICAgICAgICBjb250YWluZXIgPSBndWFyYW50ZWVkRW1wdHk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMud2lkZ2V0SWQgPSB0aGlzLmdldEFzc2VydGVkUmVjYXB0Y2hhKCkucmVuZGVyKFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIHRoaXMucGFyYW1ldGVyc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy53aWRnZXRJZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBfYXNzZXJ0KFxuICAgICAgX2lzSHR0cE9ySHR0cHMoKSAmJiAhX2lzV29ya2VyKCksXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgKTtcblxuICAgIGF3YWl0IGRvbVJlYWR5KCk7XG4gICAgdGhpcy5yZWNhcHRjaGEgPSBhd2FpdCB0aGlzLl9yZWNhcHRjaGFMb2FkZXIubG9hZChcbiAgICAgIHRoaXMuYXV0aCxcbiAgICAgIHRoaXMuYXV0aC5sYW5ndWFnZUNvZGUgfHwgdW5kZWZpbmVkXG4gICAgKTtcblxuICAgIGNvbnN0IHNpdGVLZXkgPSBhd2FpdCBnZXRSZWNhcHRjaGFQYXJhbXModGhpcy5hdXRoKTtcbiAgICBfYXNzZXJ0KHNpdGVLZXksIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgdGhpcy5wYXJhbWV0ZXJzLnNpdGVrZXkgPSBzaXRlS2V5O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBc3NlcnRlZFJlY2FwdGNoYSgpOiBSZWNhcHRjaGEge1xuICAgIF9hc3NlcnQodGhpcy5yZWNhcHRjaGEsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgcmV0dXJuIHRoaXMucmVjYXB0Y2hhO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRvbVJlYWR5KCk6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgcmVzb2x2ZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb2N1bWVudCBub3QgcmVhZHksIHdhaXQgZm9yIGxvYWQgYmVmb3JlIHJlc29sdmluZy5cbiAgICAvLyBTYXZlIHJlc29sdmVyLCBzbyB3ZSBjYW4gcmVtb3ZlIGxpc3RlbmVyIGluIGNhc2UgaXQgd2FzIGV4dGVybmFsbHlcbiAgICAvLyBjYW5jZWxsZWQuXG4gICAgcmVzb2x2ZXIgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCByZXNvbHZlcik7XG4gIH0pLmNhdGNoKGUgPT4ge1xuICAgIGlmIChyZXNvbHZlcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCByZXNvbHZlcik7XG4gICAgfVxuXG4gICAgdGhyb3cgZTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25WZXJpZmllcixcbiAgQXV0aCxcbiAgQ29uZmlybWF0aW9uUmVzdWx0LFxuICBQaG9uZUluZm9PcHRpb25zLFxuICBVc2VyLFxuICBVc2VyQ3JlZGVudGlhbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBzdGFydEVucm9sbFBob25lTWZhIH0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9tZmEnO1xuaW1wb3J0IHsgc3RhcnRTaWduSW5QaG9uZU1mYSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgc2VuZFBob25lVmVyaWZpY2F0aW9uQ29kZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9zbXMnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXBwbGljYXRpb25fdmVyaWZpZXInO1xuaW1wb3J0IHsgUGhvbmVBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL2NvcmUvY3JlZGVudGlhbHMvcGhvbmUnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnRMaW5rZWRTdGF0dXMsIF9saW5rIH0gZnJvbSAnLi4vLi4vY29yZS91c2VyL2xpbmtfdW5saW5rJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHtcbiAgbGlua1dpdGhDcmVkZW50aWFsLFxuICByZWF1dGhlbnRpY2F0ZVdpdGhDcmVkZW50aWFsLFxuICBzaWduSW5XaXRoQ3JlZGVudGlhbFxufSBmcm9tICcuLi8uLi9jb3JlL3N0cmF0ZWdpZXMvY3JlZGVudGlhbCc7XG5pbXBvcnQge1xuICBNdWx0aUZhY3RvclNlc3Npb25JbXBsLFxuICBNdWx0aUZhY3RvclNlc3Npb25UeXBlXG59IGZyb20gJy4uLy4uL21mYS9tZmFfc2Vzc2lvbic7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IFJFQ0FQVENIQV9WRVJJRklFUl9UWVBFIH0gZnJvbSAnLi4vcmVjYXB0Y2hhL3JlY2FwdGNoYV92ZXJpZmllcic7XG5pbXBvcnQgeyBfY2FzdEF1dGggfSBmcm9tICcuLi8uLi9jb3JlL2F1dGgvYXV0aF9pbXBsJztcbmltcG9ydCB7IGdldE1vZHVsYXJJbnN0YW5jZSB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcbmltcG9ydCB7IFByb3ZpZGVySWQgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbmludGVyZmFjZSBPbkNvbmZpcm1hdGlvbkNhbGxiYWNrIHtcbiAgKGNyZWRlbnRpYWw6IFBob25lQXV0aENyZWRlbnRpYWwpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPjtcbn1cblxuY2xhc3MgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCBpbXBsZW1lbnRzIENvbmZpcm1hdGlvblJlc3VsdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IHZlcmlmaWNhdGlvbklkOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBvbkNvbmZpcm1hdGlvbjogT25Db25maXJtYXRpb25DYWxsYmFja1xuICApIHt9XG5cbiAgY29uZmlybSh2ZXJpZmljYXRpb25Db2RlOiBzdHJpbmcpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gICAgY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKFxuICAgICAgdGhpcy52ZXJpZmljYXRpb25JZCxcbiAgICAgIHZlcmlmaWNhdGlvbkNvZGVcbiAgICApO1xuICAgIHJldHVybiB0aGlzLm9uQ29uZmlybWF0aW9uKGF1dGhDcmVkZW50aWFsKTtcbiAgfVxufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHNpZ25zIGluIHVzaW5nIGEgcGhvbmUgbnVtYmVyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIG1ldGhvZCBzZW5kcyBhIGNvZGUgdmlhIFNNUyB0byB0aGUgZ2l2ZW5cbiAqIHBob25lIG51bWJlciwgYW5kIHJldHVybnMgYSB7QGxpbmsgQ29uZmlybWF0aW9uUmVzdWx0fS4gQWZ0ZXIgdGhlIHVzZXJcbiAqIHByb3ZpZGVzIHRoZSBjb2RlIHNlbnQgdG8gdGhlaXIgcGhvbmUsIGNhbGwge0BsaW5rIENvbmZpcm1hdGlvblJlc3VsdC5jb25maXJtfVxuICogd2l0aCB0aGUgY29kZSB0byBzaWduIHRoZSB1c2VyIGluLlxuICpcbiAqIEZvciBhYnVzZSBwcmV2ZW50aW9uLCB0aGlzIG1ldGhvZCBhbHNvIHJlcXVpcmVzIGEge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxuICogVGhpcyBTREsgaW5jbHVkZXMgYSByZUNBUFRDSEEtYmFzZWQgaW1wbGVtZW50YXRpb24sIHtAbGluayBSZWNhcHRjaGFWZXJpZmllcn0uXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiB3b3JrIG9uIG90aGVyIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZVxuICoge0BsaW5rIFJlY2FwdGNoYVZlcmlmaWVyfSAobGlrZSBSZWFjdCBOYXRpdmUpLCBidXQgeW91IG5lZWQgdG8gdXNlIGFcbiAqIHRoaXJkLXBhcnR5IHtAbGluayBBcHBsaWNhdGlvblZlcmlmaWVyfSBpbXBsZW1lbnRhdGlvbi5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gJ3JlY2FwdGNoYS1jb250YWluZXInIGlzIHRoZSBJRCBvZiBhbiBlbGVtZW50IGluIHRoZSBET00uXG4gKiBjb25zdCBhcHBsaWNhdGlvblZlcmlmaWVyID0gbmV3IGZpcmViYXNlLmF1dGguUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcbiAqIGNvbnN0IGNvbmZpcm1hdGlvblJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XG4gKiAvLyBPYnRhaW4gYSB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXG4gKiBjb25zdCBjcmVkZW50aWFsID0gYXdhaXQgY29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm0odmVyaWZpY2F0aW9uQ29kZSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYXV0aCAtIFRoZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGhvbmVOdW1iZXIgLSBUaGUgdXNlcidzIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQgKGUuZy4gKzE2NTA1NTUwMTAxKS5cbiAqIEBwYXJhbSBhcHBWZXJpZmllciAtIFRoZSB7QGxpbmsgQXBwbGljYXRpb25WZXJpZmllcn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2lnbkluV2l0aFBob25lTnVtYmVyKFxuICBhdXRoOiBBdXRoLFxuICBwaG9uZU51bWJlcjogc3RyaW5nLFxuICBhcHBWZXJpZmllcjogQXBwbGljYXRpb25WZXJpZmllclxuKTogUHJvbWlzZTxDb25maXJtYXRpb25SZXN1bHQ+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IF92ZXJpZnlQaG9uZU51bWJlcihcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgcGhvbmVOdW1iZXIsXG4gICAgZ2V0TW9kdWxhckluc3RhbmNlKGFwcFZlcmlmaWVyIGFzIEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbClcbiAgKTtcbiAgcmV0dXJuIG5ldyBDb25maXJtYXRpb25SZXN1bHRJbXBsKHZlcmlmaWNhdGlvbklkLCBjcmVkID0+XG4gICAgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aEludGVybmFsLCBjcmVkKVxuICApO1xufVxuXG4vKipcbiAqIExpbmtzIHRoZSB1c2VyIGFjY291bnQgd2l0aCB0aGUgZ2l2ZW4gcGhvbmUgbnVtYmVyLlxuICpcbiAqIEByZW1hcmtzXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHBob25lTnVtYmVyIC0gVGhlIHVzZXIncyBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0IChlLmcuICsxNjUwNTU1MDEwMSkuXG4gKiBAcGFyYW0gYXBwVmVyaWZpZXIgLSBUaGUge0BsaW5rIEFwcGxpY2F0aW9uVmVyaWZpZXJ9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoUGhvbmVOdW1iZXIoXG4gIHVzZXI6IFVzZXIsXG4gIHBob25lTnVtYmVyOiBzdHJpbmcsXG4gIGFwcFZlcmlmaWVyOiBBcHBsaWNhdGlvblZlcmlmaWVyXG4pOiBQcm9taXNlPENvbmZpcm1hdGlvblJlc3VsdD4ge1xuICBjb25zdCB1c2VySW50ZXJuYWwgPSBnZXRNb2R1bGFySW5zdGFuY2UodXNlcikgYXMgVXNlckludGVybmFsO1xuICBhd2FpdCBfYXNzZXJ0TGlua2VkU3RhdHVzKGZhbHNlLCB1c2VySW50ZXJuYWwsIFByb3ZpZGVySWQuUEhPTkUpO1xuICBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IF92ZXJpZnlQaG9uZU51bWJlcihcbiAgICB1c2VySW50ZXJuYWwuYXV0aCxcbiAgICBwaG9uZU51bWJlcixcbiAgICBnZXRNb2R1bGFySW5zdGFuY2UoYXBwVmVyaWZpZXIgYXMgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsKVxuICApO1xuICByZXR1cm4gbmV3IENvbmZpcm1hdGlvblJlc3VsdEltcGwodmVyaWZpY2F0aW9uSWQsIGNyZWQgPT5cbiAgICBsaW5rV2l0aENyZWRlbnRpYWwodXNlckludGVybmFsLCBjcmVkKVxuICApO1xufVxuXG4vKipcbiAqIFJlLWF1dGhlbnRpY2F0ZXMgYSB1c2VyIHVzaW5nIGEgZnJlc2ggcGhvbmUgY3JlZGVudGlhbC5cbiAqXG4gKiBAcmVtYXJrc1xuICogVXNlIGJlZm9yZSBvcGVyYXRpb25zIHN1Y2ggYXMge0BsaW5rIHVwZGF0ZVBhc3N3b3JkfSB0aGF0IHJlcXVpcmUgdG9rZW5zIGZyb20gcmVjZW50IHNpZ24taW4gYXR0ZW1wdHMuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBwaG9uZU51bWJlciAtIFRoZSB1c2VyJ3MgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdCAoZS5nLiArMTY1MDU1NTAxMDEpLlxuICogQHBhcmFtIGFwcFZlcmlmaWVyIC0gVGhlIHtAbGluayBBcHBsaWNhdGlvblZlcmlmaWVyfS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhQaG9uZU51bWJlcihcbiAgdXNlcjogVXNlcixcbiAgcGhvbmVOdW1iZXI6IHN0cmluZyxcbiAgYXBwVmVyaWZpZXI6IEFwcGxpY2F0aW9uVmVyaWZpZXJcbik6IFByb21pc2U8Q29uZmlybWF0aW9uUmVzdWx0PiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIGNvbnN0IHZlcmlmaWNhdGlvbklkID0gYXdhaXQgX3ZlcmlmeVBob25lTnVtYmVyKFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIHBob25lTnVtYmVyLFxuICAgIGdldE1vZHVsYXJJbnN0YW5jZShhcHBWZXJpZmllciBhcyBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWwpXG4gICk7XG4gIHJldHVybiBuZXcgQ29uZmlybWF0aW9uUmVzdWx0SW1wbCh2ZXJpZmljYXRpb25JZCwgY3JlZCA9PlxuICAgIHJlYXV0aGVudGljYXRlV2l0aENyZWRlbnRpYWwodXNlckludGVybmFsLCBjcmVkKVxuICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSB2ZXJpZmljYXRpb24gSUQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBTTVMgY29kZSB0aGF0IGlzIHNlbnQuXG4gKlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3ZlcmlmeVBob25lTnVtYmVyKFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIG9wdGlvbnM6IFBob25lSW5mb09wdGlvbnMgfCBzdHJpbmcsXG4gIHZlcmlmaWVyOiBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHJlY2FwdGNoYVRva2VuID0gYXdhaXQgdmVyaWZpZXIudmVyaWZ5KCk7XG5cbiAgdHJ5IHtcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIHJlY2FwdGNoYVRva2VuID09PSAnc3RyaW5nJyxcbiAgICAgIGF1dGgsXG4gICAgICBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SXG4gICAgKTtcbiAgICBfYXNzZXJ0KFxuICAgICAgdmVyaWZpZXIudHlwZSA9PT0gUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUsXG4gICAgICBhdXRoLFxuICAgICAgQXV0aEVycm9yQ29kZS5BUkdVTUVOVF9FUlJPUlxuICAgICk7XG5cbiAgICBsZXQgcGhvbmVJbmZvT3B0aW9uczogUGhvbmVJbmZvT3B0aW9ucztcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHBob25lSW5mb09wdGlvbnMgPSB7XG4gICAgICAgIHBob25lTnVtYmVyOiBvcHRpb25zXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBwaG9uZUluZm9PcHRpb25zID0gb3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAoJ3Nlc3Npb24nIGluIHBob25lSW5mb09wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHNlc3Npb24gPSBwaG9uZUluZm9PcHRpb25zLnNlc3Npb24gYXMgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbDtcblxuICAgICAgaWYgKCdwaG9uZU51bWJlcicgaW4gcGhvbmVJbmZvT3B0aW9ucykge1xuICAgICAgICBfYXNzZXJ0KFxuICAgICAgICAgIHNlc3Npb24udHlwZSA9PT0gTXVsdGlGYWN0b3JTZXNzaW9uVHlwZS5FTlJPTEwsXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3RhcnRFbnJvbGxQaG9uZU1mYShhdXRoLCB7XG4gICAgICAgICAgaWRUb2tlbjogc2Vzc2lvbi5jcmVkZW50aWFsLFxuICAgICAgICAgIHBob25lRW5yb2xsbWVudEluZm86IHtcbiAgICAgICAgICAgIHBob25lTnVtYmVyOiBwaG9uZUluZm9PcHRpb25zLnBob25lTnVtYmVyLFxuICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UucGhvbmVTZXNzaW9uSW5mby5zZXNzaW9uSW5mbztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9hc3NlcnQoXG4gICAgICAgICAgc2Vzc2lvbi50eXBlID09PSBNdWx0aUZhY3RvclNlc3Npb25UeXBlLlNJR05fSU4sXG4gICAgICAgICAgYXV0aCxcbiAgICAgICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IG1mYUVucm9sbG1lbnRJZCA9XG4gICAgICAgICAgcGhvbmVJbmZvT3B0aW9ucy5tdWx0aUZhY3RvckhpbnQ/LnVpZCB8fFxuICAgICAgICAgIHBob25lSW5mb09wdGlvbnMubXVsdGlGYWN0b3JVaWQ7XG4gICAgICAgIF9hc3NlcnQobWZhRW5yb2xsbWVudElkLCBhdXRoLCBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfTUZBX0lORk8pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHN0YXJ0U2lnbkluUGhvbmVNZmEoYXV0aCwge1xuICAgICAgICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsOiBzZXNzaW9uLmNyZWRlbnRpYWwsXG4gICAgICAgICAgbWZhRW5yb2xsbWVudElkLFxuICAgICAgICAgIHBob25lU2lnbkluSW5mbzoge1xuICAgICAgICAgICAgcmVjYXB0Y2hhVG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UucGhvbmVSZXNwb25zZUluZm8uc2Vzc2lvbkluZm87XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHsgc2Vzc2lvbkluZm8gfSA9IGF3YWl0IHNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGUoYXV0aCwge1xuICAgICAgICBwaG9uZU51bWJlcjogcGhvbmVJbmZvT3B0aW9ucy5waG9uZU51bWJlcixcbiAgICAgICAgcmVjYXB0Y2hhVG9rZW5cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNlc3Npb25JbmZvO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICB2ZXJpZmllci5fcmVzZXQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIHVzZXIncyBwaG9uZSBudW1iZXIuXG4gKlxuICogQHJlbWFya3NcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIC8vICdyZWNhcHRjaGEtY29udGFpbmVyJyBpcyB0aGUgSUQgb2YgYW4gZWxlbWVudCBpbiB0aGUgRE9NLlxuICogY29uc3QgYXBwbGljYXRpb25WZXJpZmllciA9IG5ldyBSZWNhcHRjaGFWZXJpZmllcigncmVjYXB0Y2hhLWNvbnRhaW5lcicpO1xuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgUGhvbmVBdXRoUHJvdmlkZXIoYXV0aCk7XG4gKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKCcrMTY1MDU1NTAxMDEnLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAqIC8vIE9idGFpbiB0aGUgdmVyaWZpY2F0aW9uQ29kZSBmcm9tIHRoZSB1c2VyLlxuICogY29uc3QgcGhvbmVDcmVkZW50aWFsID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XG4gKiBhd2FpdCB1cGRhdGVQaG9uZU51bWJlcih1c2VyLCBwaG9uZUNyZWRlbnRpYWwpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBjcmVkZW50aWFsIC0gQSBjcmVkZW50aWFsIGF1dGhlbnRpY2F0aW5nIHRoZSBuZXcgcGhvbmUgbnVtYmVyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVBob25lTnVtYmVyKFxuICB1c2VyOiBVc2VyLFxuICBjcmVkZW50aWFsOiBQaG9uZUF1dGhDcmVkZW50aWFsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgX2xpbmsoZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbCwgY3JlZGVudGlhbCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aCxcbiAgUGhvbmVJbmZvT3B0aW9ucyxcbiAgQXBwbGljYXRpb25WZXJpZmllcixcbiAgVXNlckNyZWRlbnRpYWxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9hcGkvYXV0aGVudGljYXRpb24vc21zJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uVmVyaWZpZXJJbnRlcm5hbCBhcyBBcHBsaWNhdGlvblZlcmlmaWVySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hcHBsaWNhdGlvbl92ZXJpZmllcic7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgYXMgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIGFzIFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IFBob25lQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi9jb3JlL2NyZWRlbnRpYWxzL3Bob25lJztcbmltcG9ydCB7IF92ZXJpZnlQaG9uZU51bWJlciB9IGZyb20gJy4uL3N0cmF0ZWdpZXMvcGhvbmUnO1xuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoQ3JlZGVudGlhbCB9IGZyb20gJy4uLy4uL2NvcmUnO1xuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciwgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBQcm92aWRlcklkLCBTaWduSW5NZXRob2QgfSBmcm9tICcuLi8uLi9tb2RlbC9lbnVtcyc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYW4ge0BsaW5rIFBob25lQXV0aENyZWRlbnRpYWx9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBgUGhvbmVBdXRoUHJvdmlkZXJgIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyAncmVjYXB0Y2hhLWNvbnRhaW5lcicgaXMgdGhlIElEIG9mIGFuIGVsZW1lbnQgaW4gdGhlIERPTS5cbiAqIGNvbnN0IGFwcGxpY2F0aW9uVmVyaWZpZXIgPSBuZXcgUmVjYXB0Y2hhVmVyaWZpZXIoJ3JlY2FwdGNoYS1jb250YWluZXInKTtcbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xuICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcignKzE2NTA1NTUwMTAxJywgYXBwbGljYXRpb25WZXJpZmllcik7XG4gKiAvLyBPYnRhaW4gdGhlIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAqIGNvbnN0IHBob25lQ3JlZGVudGlhbCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWwodmVyaWZpY2F0aW9uSWQsIHZlcmlmaWNhdGlvbkNvZGUpO1xuICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBwaG9uZUNyZWRlbnRpYWwpO1xuICogYGBgXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUGhvbmVBdXRoUHJvdmlkZXIge1xuICAvKiogQWx3YXlzIHNldCB0byB7QGxpbmsgUHJvdmlkZXJJZH0uUEhPTkUuICovXG4gIHN0YXRpYyByZWFkb25seSBQUk9WSURFUl9JRDogJ3Bob25lJyA9IFByb3ZpZGVySWQuUEhPTkU7XG4gIC8qKiBBbHdheXMgc2V0IHRvIHtAbGluayBTaWduSW5NZXRob2R9LlBIT05FLiAqL1xuICBzdGF0aWMgcmVhZG9ubHkgUEhPTkVfU0lHTl9JTl9NRVRIT0Q6ICdwaG9uZScgPSBTaWduSW5NZXRob2QuUEhPTkU7XG5cbiAgLyoqIEFsd2F5cyBzZXQgdG8ge0BsaW5rIFByb3ZpZGVySWR9LlBIT05FLiAqL1xuICByZWFkb25seSBwcm92aWRlcklkID0gUGhvbmVBdXRoUHJvdmlkZXIuUFJPVklERVJfSUQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gYXV0aCAtIFRoZSBGaXJlYmFzZSB7QGxpbmsgQXV0aH0gaW5zdGFuY2UgaW4gd2hpY2ggc2lnbi1pbnMgc2hvdWxkIG9jY3VyLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IoYXV0aDogQXV0aCkge1xuICAgIHRoaXMuYXV0aCA9IF9jYXN0QXV0aChhdXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBTdGFydHMgYSBwaG9uZSBudW1iZXIgYXV0aGVudGljYXRpb24gZmxvdyBieSBzZW5kaW5nIGEgdmVyaWZpY2F0aW9uIGNvZGUgdG8gdGhlIGdpdmVuIHBob25lXG4gICAqIG51bWJlci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiBjb25zdCBwcm92aWRlciA9IG5ldyBQaG9uZUF1dGhQcm92aWRlcihhdXRoKTtcbiAgICogY29uc3QgdmVyaWZpY2F0aW9uSWQgPSBhd2FpdCBwcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcihwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XG4gICAqIC8vIE9idGFpbiB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXG4gICAqIGNvbnN0IGF1dGhDcmVkZW50aWFsID0gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgdmVyaWZpY2F0aW9uQ29kZSk7XG4gICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gYXdhaXQgc2lnbkluV2l0aENyZWRlbnRpYWwoYXV0aCwgYXV0aENyZWRlbnRpYWwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogQW4gYWx0ZXJuYXRpdmUgZmxvdyBpcyBwcm92aWRlZCB1c2luZyB0aGUgYHNpZ25JbldpdGhQaG9uZU51bWJlcmAgbWV0aG9kLlxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGNvbnN0IGNvbmZpcm1hdGlvblJlc3VsdCA9IHNpZ25JbldpdGhQaG9uZU51bWJlcihhdXRoLCBwaG9uZU51bWJlciwgYXBwbGljYXRpb25WZXJpZmllcik7XG4gICAqIC8vIE9idGFpbiB2ZXJpZmljYXRpb25Db2RlIGZyb20gdGhlIHVzZXIuXG4gICAqIGNvbnN0IHVzZXJDcmVkZW50aWFsID0gY29uZmlybWF0aW9uUmVzdWx0LmNvbmZpcm0odmVyaWZpY2F0aW9uQ29kZSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGhvbmVJbmZvT3B0aW9ucyAtIFRoZSB1c2VyJ3Mge0BsaW5rIFBob25lSW5mb09wdGlvbnN9LiBUaGUgcGhvbmUgbnVtYmVyIHNob3VsZCBiZSBpblxuICAgKiBFLjE2NCBmb3JtYXQgKGUuZy4gKzE2NTA1NTUwMTAxKS5cbiAgICogQHBhcmFtIGFwcGxpY2F0aW9uVmVyaWZpZXIgLSBGb3IgYWJ1c2UgcHJldmVudGlvbiwgdGhpcyBtZXRob2QgYWxzbyByZXF1aXJlcyBhXG4gICAqIHtAbGluayBBcHBsaWNhdGlvblZlcmlmaWVyfS4gVGhpcyBTREsgaW5jbHVkZXMgYSByZUNBUFRDSEEtYmFzZWQgaW1wbGVtZW50YXRpb24sXG4gICAqIHtAbGluayBSZWNhcHRjaGFWZXJpZmllcn0uXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSBmb3IgYSB2ZXJpZmljYXRpb24gSUQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvXG4gICAqIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsfSB0byBpZGVudGlmeSB0aGlzIGZsb3cuLlxuICAgKi9cbiAgdmVyaWZ5UGhvbmVOdW1iZXIoXG4gICAgcGhvbmVPcHRpb25zOiBQaG9uZUluZm9PcHRpb25zIHwgc3RyaW5nLFxuICAgIGFwcGxpY2F0aW9uVmVyaWZpZXI6IEFwcGxpY2F0aW9uVmVyaWZpZXJcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gX3ZlcmlmeVBob25lTnVtYmVyKFxuICAgICAgdGhpcy5hdXRoLFxuICAgICAgcGhvbmVPcHRpb25zLFxuICAgICAgZ2V0TW9kdWxhckluc3RhbmNlKGFwcGxpY2F0aW9uVmVyaWZpZXIgYXMgQXBwbGljYXRpb25WZXJpZmllckludGVybmFsKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBob25lIGF1dGggY3JlZGVudGlhbCwgZ2l2ZW4gdGhlIHZlcmlmaWNhdGlvbiBJRCBmcm9tXG4gICAqIHtAbGluayBQaG9uZUF1dGhQcm92aWRlci52ZXJpZnlQaG9uZU51bWJlcn0gYW5kIHRoZSBjb2RlIHRoYXQgd2FzIHNlbnQgdG8gdGhlIHVzZXInc1xuICAgKiBtb2JpbGUgZGV2aWNlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBqYXZhc2NyaXB0XG4gICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xuICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAgICogLy8gT2J0YWluIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAgICogY29uc3QgYXV0aENyZWRlbnRpYWwgPSBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsKHZlcmlmaWNhdGlvbklkLCB2ZXJpZmljYXRpb25Db2RlKTtcbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBzaWduSW5XaXRoQ3JlZGVudGlhbChhdXRoLCBhdXRoQ3JlZGVudGlhbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBBbiBhbHRlcm5hdGl2ZSBmbG93IGlzIHByb3ZpZGVkIHVzaW5nIHRoZSBgc2lnbkluV2l0aFBob25lTnVtYmVyYCBtZXRob2QuXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogY29uc3QgY29uZmlybWF0aW9uUmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBob25lTnVtYmVyKGF1dGgsIHBob25lTnVtYmVyLCBhcHBsaWNhdGlvblZlcmlmaWVyKTtcbiAgICogLy8gT2J0YWluIHZlcmlmaWNhdGlvbkNvZGUgZnJvbSB0aGUgdXNlci5cbiAgICogY29uc3QgdXNlckNyZWRlbnRpYWwgPSBhd2FpdCBjb25maXJtYXRpb25SZXN1bHQuY29uZmlybSh2ZXJpZmljYXRpb25Db2RlKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB2ZXJpZmljYXRpb25JZCAtIFRoZSB2ZXJpZmljYXRpb24gSUQgcmV0dXJuZWQgZnJvbSB7QGxpbmsgUGhvbmVBdXRoUHJvdmlkZXIudmVyaWZ5UGhvbmVOdW1iZXJ9LlxuICAgKiBAcGFyYW0gdmVyaWZpY2F0aW9uQ29kZSAtIFRoZSB2ZXJpZmljYXRpb24gY29kZSBzZW50IHRvIHRoZSB1c2VyJ3MgbW9iaWxlIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGF1dGggcHJvdmlkZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsKFxuICAgIHZlcmlmaWNhdGlvbklkOiBzdHJpbmcsXG4gICAgdmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nXG4gICk6IFBob25lQXV0aENyZWRlbnRpYWwge1xuICAgIHJldHVybiBQaG9uZUF1dGhDcmVkZW50aWFsLl9mcm9tVmVyaWZpY2F0aW9uKFxuICAgICAgdmVyaWZpY2F0aW9uSWQsXG4gICAgICB2ZXJpZmljYXRpb25Db2RlXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZXMgYW4ge0BsaW5rIEF1dGhDcmVkZW50aWFsfSBmcm9tIGEge0BsaW5rIFVzZXJDcmVkZW50aWFsfS5cbiAgICogQHBhcmFtIHVzZXJDcmVkZW50aWFsIC0gVGhlIHVzZXIgY3JlZGVudGlhbC5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbVJlc3VsdChcbiAgICB1c2VyQ3JlZGVudGlhbDogVXNlckNyZWRlbnRpYWxcbiAgKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBjb25zdCBjcmVkZW50aWFsID0gdXNlckNyZWRlbnRpYWwgYXMgVXNlckNyZWRlbnRpYWxJbnRlcm5hbDtcbiAgICByZXR1cm4gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoY3JlZGVudGlhbCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiB7QGxpbmsgQXV0aENyZWRlbnRpYWx9IHdoZW4gcGFzc2VkIGFuIGVycm9yLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKlxuICAgKiBUaGlzIG1ldGhvZCB3b3JrcyBmb3IgZXJyb3JzIGxpa2VcbiAgICogYGF1dGgvYWNjb3VudC1leGlzdHMtd2l0aC1kaWZmZXJlbnQtY3JlZGVudGlhbHNgLiBUaGlzIGlzIHVzZWZ1bCBmb3JcbiAgICogcmVjb3ZlcmluZyB3aGVuIGF0dGVtcHRpbmcgdG8gc2V0IGEgdXNlcidzIHBob25lIG51bWJlciBidXQgdGhlIG51bWJlclxuICAgKiBpbiBxdWVzdGlvbiBpcyBhbHJlYWR5IHRpZWQgdG8gYW5vdGhlciBhY2NvdW50LiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZ1xuICAgKiBjb2RlIHRyaWVzIHRvIHVwZGF0ZSB0aGUgY3VycmVudCB1c2VyJ3MgcGhvbmUgbnVtYmVyLCBhbmQgaWYgdGhhdFxuICAgKiBmYWlscywgbGlua3MgdGhlIHVzZXIgd2l0aCB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhhdCBudW1iZXI6XG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IFBob25lQXV0aFByb3ZpZGVyKGF1dGgpO1xuICAgKiBjb25zdCB2ZXJpZmljYXRpb25JZCA9IGF3YWl0IHByb3ZpZGVyLnZlcmlmeVBob25lTnVtYmVyKG51bWJlciwgdmVyaWZpZXIpO1xuICAgKiB0cnkge1xuICAgKiAgIGNvbnN0IGNvZGUgPSAnJzsgLy8gUHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgdmVyaWZpY2F0aW9uIGNvZGVcbiAgICogICBhd2FpdCB1cGRhdGVQaG9uZU51bWJlcihcbiAgICogICAgICAgYXV0aC5jdXJyZW50VXNlcixcbiAgICogICAgICAgUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbCh2ZXJpZmljYXRpb25JZCwgY29kZSkpO1xuICAgKiB9IGNhdGNoIChlKSB7XG4gICAqICAgaWYgKChlIGFzIEZpcmViYXNlRXJyb3IpPy5jb2RlID09PSAnYXV0aC9hY2NvdW50LWV4aXN0cy13aXRoLWRpZmZlcmVudC1jcmVkZW50aWFsJykge1xuICAgKiAgICAgY29uc3QgY3JlZCA9IFBob25lQXV0aFByb3ZpZGVyLmNyZWRlbnRpYWxGcm9tRXJyb3IoZSk7XG4gICAqICAgICBhd2FpdCBsaW5rV2l0aENyZWRlbnRpYWwoYXV0aC5jdXJyZW50VXNlciwgY3JlZCk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIC8vIEF0IHRoaXMgcG9pbnQsIGF1dGguY3VycmVudFVzZXIucGhvbmVOdW1iZXIgPT09IG51bWJlci5cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBnZW5lcmF0ZSBhIGNyZWRlbnRpYWwgZnJvbS5cbiAgICovXG4gIHN0YXRpYyBjcmVkZW50aWFsRnJvbUVycm9yKGVycm9yOiBGaXJlYmFzZUVycm9yKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICByZXR1cm4gUGhvbmVBdXRoUHJvdmlkZXIuY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3QoXG4gICAgICAoZXJyb3IuY3VzdG9tRGF0YSB8fCB7fSkgYXMgVGFnZ2VkV2l0aFRva2VuUmVzcG9uc2VcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgY3JlZGVudGlhbEZyb21UYWdnZWRPYmplY3Qoe1xuICAgIF90b2tlblJlc3BvbnNlOiB0b2tlblJlc3BvbnNlXG4gIH06IFRhZ2dlZFdpdGhUb2tlblJlc3BvbnNlKTogQXV0aENyZWRlbnRpYWwgfCBudWxsIHtcbiAgICBpZiAoIXRva2VuUmVzcG9uc2UpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IHBob25lTnVtYmVyLCB0ZW1wb3JhcnlQcm9vZiB9ID1cbiAgICAgIHRva2VuUmVzcG9uc2UgYXMgU2lnbkluV2l0aFBob25lTnVtYmVyUmVzcG9uc2U7XG4gICAgaWYgKHBob25lTnVtYmVyICYmIHRlbXBvcmFyeVByb29mKSB7XG4gICAgICByZXR1cm4gUGhvbmVBdXRoQ3JlZGVudGlhbC5fZnJvbVRva2VuUmVzcG9uc2UoXG4gICAgICAgIHBob25lTnVtYmVyLFxuICAgICAgICB0ZW1wb3JhcnlQcm9vZlxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IF9nZXRJbnN0YW5jZSB9IGZyb20gJy4vaW5zdGFudGlhdG9yJztcblxuLyoqXG4gKiBDaG9vc2VzIGEgcG9wdXAvcmVkaXJlY3QgcmVzb2x2ZXIgdG8gdXNlLiBUaGlzIHByZWZlcnMgdGhlIG92ZXJyaWRlICh3aGljaFxuICogaXMgZGlyZWN0bHkgcGFzc2VkIGluKSwgYW5kIGZhbGxzIGJhY2sgdG8gdGhlIHByb3BlcnR5IHNldCBvbiB0aGUgYXV0aFxuICogb2JqZWN0LiBJZiBuZWl0aGVyIGFyZSBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gZXJyb3JzIHcvIGFuIGFyZ3VtZW50IGVycm9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcmVzb2x2ZXJPdmVycmlkZTogUG9wdXBSZWRpcmVjdFJlc29sdmVyIHwgdW5kZWZpbmVkXG4pOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB7XG4gIGlmIChyZXNvbHZlck92ZXJyaWRlKSB7XG4gICAgcmV0dXJuIF9nZXRJbnN0YW5jZShyZXNvbHZlck92ZXJyaWRlKTtcbiAgfVxuXG4gIF9hc3NlcnQoYXV0aC5fcG9wdXBSZWRpcmVjdFJlc29sdmVyLCBhdXRoLCBBdXRoRXJyb3JDb2RlLkFSR1VNRU5UX0VSUk9SKTtcblxuICByZXR1cm4gYXV0aC5fcG9wdXBSZWRpcmVjdFJlc29sdmVyO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7XG4gIHNpZ25JbldpdGhJZHAsXG4gIFNpZ25JbldpdGhJZHBSZXF1ZXN0XG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9pZHAnO1xuaW1wb3J0IHsgUGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZSB9IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBJZFRva2VuUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9tb2RlbC9pZF90b2tlbic7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwsIFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhDcmVkZW50aWFsIH0gZnJvbSAnLi4vY3JlZGVudGlhbHMnO1xuaW1wb3J0IHsgX2xpbmsgYXMgX2xpbmtVc2VyIH0gZnJvbSAnLi4vdXNlci9saW5rX3VubGluayc7XG5pbXBvcnQgeyBfcmVhdXRoZW50aWNhdGUgfSBmcm9tICcuLi91c2VyL3JlYXV0aGVudGljYXRlJztcbmltcG9ydCB7IF9hc3NlcnQgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfc2lnbkluV2l0aENyZWRlbnRpYWwgfSBmcm9tICcuL2NyZWRlbnRpYWwnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBQcm92aWRlcklkIH0gZnJvbSAnLi4vLi4vbW9kZWwvZW51bXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElkcFRhc2tQYXJhbXMge1xuICBhdXRoOiBBdXRoSW50ZXJuYWw7XG4gIHJlcXVlc3RVcmk6IHN0cmluZztcbiAgc2Vzc2lvbklkPzogc3RyaW5nO1xuICB0ZW5hbnRJZD86IHN0cmluZztcbiAgcG9zdEJvZHk/OiBzdHJpbmc7XG4gIHBlbmRpbmdUb2tlbj86IHN0cmluZztcbiAgdXNlcj86IFVzZXJJbnRlcm5hbDtcbiAgYnlwYXNzQXV0aFN0YXRlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgSWRwVGFzayA9IChcbiAgcGFyYW1zOiBJZHBUYXNrUGFyYW1zXG4pID0+IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbD47XG5cbmNsYXNzIElkcENyZWRlbnRpYWwgZXh0ZW5kcyBBdXRoQ3JlZGVudGlhbCB7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHBhcmFtczogSWRwVGFza1BhcmFtcykge1xuICAgIHN1cGVyKFByb3ZpZGVySWQuQ1VTVE9NLCBQcm92aWRlcklkLkNVU1RPTSk7XG4gIH1cblxuICBfZ2V0SWRUb2tlblJlc3BvbnNlKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8UGhvbmVPck9hdXRoVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHRoaXMuX2J1aWxkSWRwUmVxdWVzdCgpKTtcbiAgfVxuXG4gIF9saW5rVG9JZFRva2VuKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxJZFRva2VuUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gc2lnbkluV2l0aElkcChhdXRoLCB0aGlzLl9idWlsZElkcFJlcXVlc3QoaWRUb2tlbikpO1xuICB9XG5cbiAgX2dldFJlYXV0aGVudGljYXRpb25SZXNvbHZlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPElkVG9rZW5SZXNwb25zZT4ge1xuICAgIHJldHVybiBzaWduSW5XaXRoSWRwKGF1dGgsIHRoaXMuX2J1aWxkSWRwUmVxdWVzdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkSWRwUmVxdWVzdChpZFRva2VuPzogc3RyaW5nKTogU2lnbkluV2l0aElkcFJlcXVlc3Qge1xuICAgIGNvbnN0IHJlcXVlc3Q6IFNpZ25JbldpdGhJZHBSZXF1ZXN0ID0ge1xuICAgICAgcmVxdWVzdFVyaTogdGhpcy5wYXJhbXMucmVxdWVzdFVyaSxcbiAgICAgIHNlc3Npb25JZDogdGhpcy5wYXJhbXMuc2Vzc2lvbklkLFxuICAgICAgcG9zdEJvZHk6IHRoaXMucGFyYW1zLnBvc3RCb2R5LFxuICAgICAgdGVuYW50SWQ6IHRoaXMucGFyYW1zLnRlbmFudElkLFxuICAgICAgcGVuZGluZ1Rva2VuOiB0aGlzLnBhcmFtcy5wZW5kaW5nVG9rZW4sXG4gICAgICByZXR1cm5TZWN1cmVUb2tlbjogdHJ1ZSxcbiAgICAgIHJldHVybklkcENyZWRlbnRpYWw6IHRydWVcbiAgICB9O1xuXG4gICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgIHJlcXVlc3QuaWRUb2tlbiA9IGlkVG9rZW47XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9zaWduSW4oXG4gIHBhcmFtczogSWRwVGFza1BhcmFtc1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPiB7XG4gIHJldHVybiBfc2lnbkluV2l0aENyZWRlbnRpYWwoXG4gICAgcGFyYW1zLmF1dGgsXG4gICAgbmV3IElkcENyZWRlbnRpYWwocGFyYW1zKSxcbiAgICBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlXG4gICkgYXMgUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9yZWF1dGgoXG4gIHBhcmFtczogSWRwVGFza1BhcmFtc1xuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsPiB7XG4gIGNvbnN0IHsgYXV0aCwgdXNlciB9ID0gcGFyYW1zO1xuICBfYXNzZXJ0KHVzZXIsIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICByZXR1cm4gX3JlYXV0aGVudGljYXRlKFxuICAgIHVzZXIsXG4gICAgbmV3IElkcENyZWRlbnRpYWwocGFyYW1zKSxcbiAgICBwYXJhbXMuYnlwYXNzQXV0aFN0YXRlXG4gICk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfbGluayhcbiAgcGFyYW1zOiBJZHBUYXNrUGFyYW1zXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWw+IHtcbiAgY29uc3QgeyBhdXRoLCB1c2VyIH0gPSBwYXJhbXM7XG4gIF9hc3NlcnQodXNlciwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gIHJldHVybiBfbGlua1VzZXIodXNlciwgbmV3IElkcENyZWRlbnRpYWwocGFyYW1zKSwgcGFyYW1zLmJ5cGFzc0F1dGhTdGF0ZSk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgRmlyZWJhc2VFcnJvciB9IGZyb20gJ0BmaXJlYmFzZS91dGlsJztcblxuaW1wb3J0IHtcbiAgQXV0aEV2ZW50LFxuICBBdXRoRXZlbnRDb25zdW1lcixcbiAgQXV0aEV2ZW50VHlwZSxcbiAgRXZlbnRNYW5hZ2VyLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwsIFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgZGVidWdBc3NlcnQsIF9mYWlsIH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHtcbiAgX2xpbmssXG4gIF9yZWF1dGgsXG4gIF9zaWduSW4sXG4gIElkcFRhc2ssXG4gIElkcFRhc2tQYXJhbXNcbn0gZnJvbSAnLi4vc3RyYXRlZ2llcy9pZHAnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5cbmludGVyZmFjZSBQZW5kaW5nUHJvbWlzZSB7XG4gIHJlc29sdmU6IChjcmVkOiBVc2VyQ3JlZGVudGlhbEludGVybmFsIHwgbnVsbCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBvcHVwIGV2ZW50IG1hbmFnZXIuIEhhbmRsZXMgdGhlIHBvcHVwJ3MgZW50aXJlIGxpZmVjeWNsZTsgbGlzdGVucyB0byBhdXRoXG4gKiBldmVudHNcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UG9wdXBSZWRpcmVjdE9wZXJhdGlvblxuICBpbXBsZW1lbnRzIEF1dGhFdmVudENvbnN1bWVyXG57XG4gIHByaXZhdGUgcGVuZGluZ1Byb21pc2U6IFBlbmRpbmdQcm9taXNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZXZlbnRNYW5hZ2VyOiBFdmVudE1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgcmVhZG9ubHkgZmlsdGVyOiBBdXRoRXZlbnRUeXBlW107XG5cbiAgYWJzdHJhY3QgZXZlbnRJZDogc3RyaW5nIHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGZpbHRlcjogQXV0aEV2ZW50VHlwZSB8IEF1dGhFdmVudFR5cGVbXSxcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsLFxuICAgIHByb3RlY3RlZCB1c2VyPzogVXNlckludGVybmFsLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZVxuICApIHtcbiAgICB0aGlzLmZpbHRlciA9IEFycmF5LmlzQXJyYXkoZmlsdGVyKSA/IGZpbHRlciA6IFtmaWx0ZXJdO1xuICB9XG5cbiAgYWJzdHJhY3Qgb25FeGVjdXRpb24oKTogUHJvbWlzZTx2b2lkPjtcblxuICBleGVjdXRlKCk6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbCB8IG51bGw+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbCB8IG51bGw+KFxuICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnBlbmRpbmdQcm9taXNlID0geyByZXNvbHZlLCByZWplY3QgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gYXdhaXQgdGhpcy5yZXNvbHZlci5faW5pdGlhbGl6ZSh0aGlzLmF1dGgpO1xuICAgICAgICAgIGF3YWl0IHRoaXMub25FeGVjdXRpb24oKTtcbiAgICAgICAgICB0aGlzLmV2ZW50TWFuYWdlci5yZWdpc3RlckNvbnN1bWVyKHRoaXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdGhpcy5yZWplY3QoZSBhcyBFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgYXN5bmMgb25BdXRoRXZlbnQoZXZlbnQ6IEF1dGhFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgdXJsUmVzcG9uc2UsIHNlc3Npb25JZCwgcG9zdEJvZHksIHRlbmFudElkLCBlcnJvciwgdHlwZSB9ID0gZXZlbnQ7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICB0aGlzLnJlamVjdChlcnJvcik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zOiBJZHBUYXNrUGFyYW1zID0ge1xuICAgICAgYXV0aDogdGhpcy5hdXRoLFxuICAgICAgcmVxdWVzdFVyaTogdXJsUmVzcG9uc2UhLFxuICAgICAgc2Vzc2lvbklkOiBzZXNzaW9uSWQhLFxuICAgICAgdGVuYW50SWQ6IHRlbmFudElkIHx8IHVuZGVmaW5lZCxcbiAgICAgIHBvc3RCb2R5OiBwb3N0Qm9keSB8fCB1bmRlZmluZWQsXG4gICAgICB1c2VyOiB0aGlzLnVzZXIsXG4gICAgICBieXBhc3NBdXRoU3RhdGU6IHRoaXMuYnlwYXNzQXV0aFN0YXRlXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlc29sdmUoYXdhaXQgdGhpcy5nZXRJZHBUYXNrKHR5cGUpKHBhcmFtcykpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMucmVqZWN0KGUgYXMgRXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIG9uRXJyb3IoZXJyb3I6IEZpcmViYXNlRXJyb3IpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGdldElkcFRhc2sodHlwZTogQXV0aEV2ZW50VHlwZSk6IElkcFRhc2sge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1BPUFVQOlxuICAgICAgY2FzZSBBdXRoRXZlbnRUeXBlLlNJR05fSU5fVklBX1JFRElSRUNUOlxuICAgICAgICByZXR1cm4gX3NpZ25JbjtcbiAgICAgIGNhc2UgQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9QT1BVUDpcbiAgICAgIGNhc2UgQXV0aEV2ZW50VHlwZS5MSU5LX1ZJQV9SRURJUkVDVDpcbiAgICAgICAgcmV0dXJuIF9saW5rO1xuICAgICAgY2FzZSBBdXRoRXZlbnRUeXBlLlJFQVVUSF9WSUFfUE9QVVA6XG4gICAgICBjYXNlIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9SRURJUkVDVDpcbiAgICAgICAgcmV0dXJuIF9yZWF1dGg7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBfZmFpbCh0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZXNvbHZlKGNyZWQ6IFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfCBudWxsKTogdm9pZCB7XG4gICAgZGVidWdBc3NlcnQodGhpcy5wZW5kaW5nUHJvbWlzZSwgJ1BlbmRpbmcgcHJvbWlzZSB3YXMgbmV2ZXIgc2V0Jyk7XG4gICAgdGhpcy5wZW5kaW5nUHJvbWlzZS5yZXNvbHZlKGNyZWQpO1xuICAgIHRoaXMudW5yZWdpc3RlckFuZENsZWFuVXAoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWplY3QoZXJyb3I6IEVycm9yKTogdm9pZCB7XG4gICAgZGVidWdBc3NlcnQodGhpcy5wZW5kaW5nUHJvbWlzZSwgJ1BlbmRpbmcgcHJvbWlzZSB3YXMgbmV2ZXIgc2V0Jyk7XG4gICAgdGhpcy5wZW5kaW5nUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIHRoaXMudW5yZWdpc3RlckFuZENsZWFuVXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5yZWdpc3RlckFuZENsZWFuVXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZXZlbnRNYW5hZ2VyKSB7XG4gICAgICB0aGlzLmV2ZW50TWFuYWdlci51bnJlZ2lzdGVyQ29uc3VtZXIodGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nUHJvbWlzZSA9IG51bGw7XG4gICAgdGhpcy5jbGVhblVwKCk7XG4gIH1cblxuICBhYnN0cmFjdCBjbGVhblVwKCk6IHZvaWQ7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aCxcbiAgQXV0aFByb3ZpZGVyLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIsXG4gIFVzZXIsXG4gIFVzZXJDcmVkZW50aWFsXG59IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IF9jYXN0QXV0aCB9IGZyb20gJy4uLy4uL2NvcmUvYXV0aC9hdXRoX2ltcGwnO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7XG4gIF9hc3NlcnQsXG4gIGRlYnVnQXNzZXJ0LFxuICBfY3JlYXRlRXJyb3IsXG4gIF9hc3NlcnRJbnN0YW5jZU9mXG59IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgX2dlbmVyYXRlRXZlbnRJZCB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9ldmVudF9pZCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7XG4gIEF1dGhFdmVudFR5cGUsXG4gIFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsXG59IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX3dpdGhEZWZhdWx0UmVzb2x2ZXIgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvcmVzb2x2ZXInO1xuaW1wb3J0IHsgQXV0aFBvcHVwIH0gZnJvbSAnLi4vdXRpbC9wb3B1cCc7XG5pbXBvcnQgeyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL3N0cmF0ZWdpZXMvYWJzdHJhY3RfcG9wdXBfcmVkaXJlY3Rfb3BlcmF0aW9uJztcbmltcG9ydCB7IEZlZGVyYXRlZEF1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uL2NvcmUvcHJvdmlkZXJzL2ZlZGVyYXRlZCc7XG5pbXBvcnQgeyBnZXRNb2R1bGFySW5zdGFuY2UgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbi8qXG4gKiBUaGUgZXZlbnQgdGltZW91dCBpcyB0aGUgc2FtZSBvbiBtb2JpbGUgYW5kIGRlc2t0b3AsIG5vIG5lZWQgZm9yIERlbGF5LiBTZXQgdGhpcyB0byA4cyBzaW5jZVxuICogYmxvY2tpbmcgZnVuY3Rpb25zIGNhbiB0YWtlIHVwdG8gN3MgdG8gY29tcGxldGUgc2lnbiBpbiwgYXMgZG9jdW1lbnRlZCBpbjpcbiAqIGh0dHBzOi8vY2xvdWQuZ29vZ2xlLmNvbS9pZGVudGl0eS1wbGF0Zm9ybS9kb2NzL2Jsb2NraW5nLWZ1bmN0aW9ucyN1bmRlcnN0YW5kaW5nX2Jsb2NraW5nX2Z1bmN0aW9uc1xuICogaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC9leHRlbmQtd2l0aC1ibG9ja2luZy1mdW5jdGlvbnMjdW5kZXJzdGFuZGluZ19ibG9ja2luZ19mdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gX1RpbWVvdXQge1xuICBBVVRIX0VWRU5UID0gODAwMFxufVxuZXhwb3J0IGNvbnN0IF9QT0xMX1dJTkRPV19DTE9TRV9USU1FT1VUID0gbmV3IERlbGF5KDIwMDAsIDEwMDAwKTtcblxuLyoqXG4gKiBBdXRoZW50aWNhdGVzIGEgRmlyZWJhc2UgY2xpZW50IHVzaW5nIGEgcG9wdXAtYmFzZWQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvdy5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgc3VjY2VlZHMsIHJldHVybnMgdGhlIHNpZ25lZCBpbiB1c2VyIGFsb25nIHdpdGggdGhlIHByb3ZpZGVyJ3MgY3JlZGVudGlhbC4gSWYgc2lnbiBpbiB3YXNcbiAqIHVuc3VjY2Vzc2Z1bCwgcmV0dXJucyBhbiBlcnJvciBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBhIHBvcHVwLlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cChhdXRoLCBwcm92aWRlcik7XG4gKlxuICogLy8gVGhlIHNpZ25lZC1pbiB1c2VyIGluZm8uXG4gKiBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAvLyBUaGlzIGdpdmVzIHlvdSBhIEZhY2Vib29rIEFjY2VzcyBUb2tlbi5cbiAqIGNvbnN0IGNyZWRlbnRpYWwgPSBwcm92aWRlci5jcmVkZW50aWFsRnJvbVJlc3VsdChhdXRoLCByZXN1bHQpO1xuICogY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNpZ25JbldpdGhQb3B1cChcbiAgYXV0aDogQXV0aCxcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgY29uc3QgYXV0aEludGVybmFsID0gX2Nhc3RBdXRoKGF1dGgpO1xuICBfYXNzZXJ0SW5zdGFuY2VPZihhdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcbiAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKGF1dGhJbnRlcm5hbCwgcmVzb2x2ZXIpO1xuICBjb25zdCBhY3Rpb24gPSBuZXcgUG9wdXBPcGVyYXRpb24oXG4gICAgYXV0aEludGVybmFsLFxuICAgIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUE9QVVAsXG4gICAgcHJvdmlkZXIsXG4gICAgcmVzb2x2ZXJJbnRlcm5hbFxuICApO1xuICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XG59XG5cbi8qKlxuICogUmVhdXRoZW50aWNhdGVzIHRoZSBjdXJyZW50IHVzZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHtAbGluayBPQXV0aFByb3ZpZGVyfSB1c2luZyBhIHBvcC11cCBiYXNlZFxuICogT0F1dGggZmxvdy5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgdGhlIHJlYXV0aGVudGljYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIHJldHVybmVkIHJlc3VsdCB3aWxsIGNvbnRhaW4gdGhlIHVzZXIgYW5kIHRoZVxuICogcHJvdmlkZXIncyBjcmVkZW50aWFsLlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcG9wdXAuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFBvcHVwKGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFJlYXV0aGVudGljYXRlIHVzaW5nIGEgcG9wdXAuXG4gKiBhd2FpdCByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cChyZXN1bHQudXNlciwgcHJvdmlkZXIpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWF1dGhlbnRpY2F0ZVdpdGhQb3B1cChcbiAgdXNlcjogVXNlcixcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8VXNlckNyZWRlbnRpYWw+IHtcbiAgY29uc3QgdXNlckludGVybmFsID0gZ2V0TW9kdWxhckluc3RhbmNlKHVzZXIpIGFzIFVzZXJJbnRlcm5hbDtcbiAgX2Fzc2VydEluc3RhbmNlT2YodXNlckludGVybmFsLmF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xuICBjb25zdCByZXNvbHZlckludGVybmFsID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIodXNlckludGVybmFsLmF1dGgsIHJlc29sdmVyKTtcbiAgY29uc3QgYWN0aW9uID0gbmV3IFBvcHVwT3BlcmF0aW9uKFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9QT1BVUCxcbiAgICBwcm92aWRlcixcbiAgICByZXNvbHZlckludGVybmFsLFxuICAgIHVzZXJJbnRlcm5hbFxuICApO1xuICByZXR1cm4gYWN0aW9uLmV4ZWN1dGVOb3ROdWxsKCk7XG59XG5cbi8qKlxuICogTGlua3MgdGhlIGF1dGhlbnRpY2F0ZWQgcHJvdmlkZXIgdG8gdGhlIHVzZXIgYWNjb3VudCB1c2luZyBhIHBvcC11cCBiYXNlZCBPQXV0aCBmbG93LlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiB0aGUgbGlua2luZyBpcyBzdWNjZXNzZnVsLCB0aGUgcmV0dXJuZWQgcmVzdWx0IHdpbGwgY29udGFpbiB0aGUgdXNlciBhbmQgdGhlIHByb3ZpZGVyJ3MgY3JlZGVudGlhbC5cbiAqXG4gKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGluIGEgTm9kZS5qcyBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgamF2YXNjcmlwdFxuICogLy8gU2lnbiBpbiB1c2luZyBzb21lIG90aGVyIHByb3ZpZGVyLlxuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aEVtYWlsQW5kUGFzc3dvcmQoYXV0aCwgZW1haWwsIHBhc3N3b3JkKTtcbiAqIC8vIExpbmsgdXNpbmcgYSBwb3B1cC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XG4gKiBhd2FpdCBsaW5rV2l0aFBvcHVwKHJlc3VsdC51c2VyLCBwcm92aWRlcik7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdXNlciAtIFRoZSB1c2VyLlxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpbmtXaXRoUG9wdXAoXG4gIHVzZXI6IFVzZXIsXG4gIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gIHJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcbiAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKHVzZXJJbnRlcm5hbC5hdXRoLCByZXNvbHZlcik7XG5cbiAgY29uc3QgYWN0aW9uID0gbmV3IFBvcHVwT3BlcmF0aW9uKFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUE9QVVAsXG4gICAgcHJvdmlkZXIsXG4gICAgcmVzb2x2ZXJJbnRlcm5hbCxcbiAgICB1c2VySW50ZXJuYWxcbiAgKTtcbiAgcmV0dXJuIGFjdGlvbi5leGVjdXRlTm90TnVsbCgpO1xufVxuXG4vKipcbiAqIFBvcHVwIGV2ZW50IG1hbmFnZXIuIEhhbmRsZXMgdGhlIHBvcHVwJ3MgZW50aXJlIGxpZmVjeWNsZTsgbGlzdGVucyB0byBhdXRoXG4gKiBldmVudHNcbiAqXG4gKi9cbmNsYXNzIFBvcHVwT3BlcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RQb3B1cFJlZGlyZWN0T3BlcmF0aW9uIHtcbiAgLy8gT25seSBvbmUgcG9wdXAgaXMgZXZlciBzaG93biBhdCBvbmNlLiBUaGUgbGlmZWN5Y2xlIG9mIHRoZSBjdXJyZW50IHBvcHVwXG4gIC8vIGNhbiBiZSBtYW5hZ2VkIC8gY2FuY2VsbGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudFBvcHVwQWN0aW9uOiBQb3B1cE9wZXJhdGlvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGF1dGhXaW5kb3c6IEF1dGhQb3B1cCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHBvbGxJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGZpbHRlcjogQXV0aEV2ZW50VHlwZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gICAgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsLFxuICAgIHVzZXI/OiBVc2VySW50ZXJuYWxcbiAgKSB7XG4gICAgc3VwZXIoYXV0aCwgZmlsdGVyLCByZXNvbHZlciwgdXNlcik7XG4gICAgaWYgKFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbikge1xuICAgICAgUG9wdXBPcGVyYXRpb24uY3VycmVudFBvcHVwQWN0aW9uLmNhbmNlbCgpO1xuICAgIH1cblxuICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IHRoaXM7XG4gIH1cblxuICBhc3luYyBleGVjdXRlTm90TnVsbCgpOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5leGVjdXRlKCk7XG4gICAgX2Fzc2VydChyZXN1bHQsIHRoaXMuYXV0aCwgQXV0aEVycm9yQ29kZS5JTlRFUk5BTF9FUlJPUik7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIG9uRXhlY3V0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGRlYnVnQXNzZXJ0KFxuICAgICAgdGhpcy5maWx0ZXIubGVuZ3RoID09PSAxLFxuICAgICAgJ1BvcHVwIG9wZXJhdGlvbnMgb25seSBoYW5kbGUgb25lIGV2ZW50J1xuICAgICk7XG4gICAgY29uc3QgZXZlbnRJZCA9IF9nZW5lcmF0ZUV2ZW50SWQoKTtcbiAgICB0aGlzLmF1dGhXaW5kb3cgPSBhd2FpdCB0aGlzLnJlc29sdmVyLl9vcGVuUG9wdXAoXG4gICAgICB0aGlzLmF1dGgsXG4gICAgICB0aGlzLnByb3ZpZGVyLFxuICAgICAgdGhpcy5maWx0ZXJbMF0sIC8vIFRoZXJlJ3MgYWx3YXlzIG9uZSwgc2VlIGNvbnN0cnVjdG9yXG4gICAgICBldmVudElkXG4gICAgKTtcbiAgICB0aGlzLmF1dGhXaW5kb3cuYXNzb2NpYXRlZEV2ZW50ID0gZXZlbnRJZDtcblxuICAgIC8vIENoZWNrIGZvciB3ZWIgc3RvcmFnZSBzdXBwb3J0IGFuZCBvcmlnaW4gdmFsaWRhdGlvbiBfYWZ0ZXJfIHRoZSBwb3B1cCBpc1xuICAgIC8vIGxvYWRlZC4gVGhlc2Ugb3BlcmF0aW9ucyBhcmUgc2xvdyAofjEgc2Vjb25kIG9yIHNvKSBSYXRoZXIgdGhhblxuICAgIC8vIHdhaXRpbmcgb24gdGhlbSBiZWZvcmUgb3BlbmluZyB0aGUgd2luZG93LCBvcHRpbWlzdGljYWxseSBvcGVuIHRoZSBwb3B1cFxuICAgIC8vIGFuZCBjaGVjayBmb3Igc3RvcmFnZSBzdXBwb3J0IGF0IHRoZSBzYW1lIHRpbWUuIElmIHN0b3JhZ2Ugc3VwcG9ydCBpc1xuICAgIC8vIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbCBjYXVzZSB0aGUgd2hvbGUgdGhpbmcgdG8gcmVqZWN0IHByb3Blcmx5LiBJdFxuICAgIC8vIHdpbGwgYWxzbyBjbG9zZSB0aGUgcG9wdXAsIGJ1dCBzaW5jZSB0aGUgcHJvbWlzZSBoYXMgYWxyZWFkeSByZWplY3RlZCxcbiAgICAvLyB0aGUgcG9wdXAgY2xvc2VkIGJ5IHVzZXIgcG9sbCB3aWxsIHJlamVjdCBpbnRvIHRoZSB2b2lkLlxuICAgIHRoaXMucmVzb2x2ZXIuX29yaWdpblZhbGlkYXRpb24odGhpcy5hdXRoKS5jYXRjaChlID0+IHtcbiAgICAgIHRoaXMucmVqZWN0KGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXNvbHZlci5faXNJZnJhbWVXZWJTdG9yYWdlU3VwcG9ydGVkKHRoaXMuYXV0aCwgaXNTdXBwb3J0ZWQgPT4ge1xuICAgICAgaWYgKCFpc1N1cHBvcnRlZCkge1xuICAgICAgICB0aGlzLnJlamVjdChcbiAgICAgICAgICBfY3JlYXRlRXJyb3IodGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLldFQl9TVE9SQUdFX1VOU1VQUE9SVEVEKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSGFuZGxlIHVzZXIgY2xvc3VyZS4gTm90aWNlIHRoaXMgZG9lcyAqbm90KiB1c2UgYXdhaXRcbiAgICB0aGlzLnBvbGxVc2VyQ2FuY2VsbGF0aW9uKCk7XG4gIH1cblxuICBnZXQgZXZlbnRJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoV2luZG93Py5hc3NvY2lhdGVkRXZlbnQgfHwgbnVsbDtcbiAgfVxuXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlamVjdChfY3JlYXRlRXJyb3IodGhpcy5hdXRoLCBBdXRoRXJyb3JDb2RlLkVYUElSRURfUE9QVVBfUkVRVUVTVCkpO1xuICB9XG5cbiAgY2xlYW5VcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hdXRoV2luZG93KSB7XG4gICAgICB0aGlzLmF1dGhXaW5kb3cuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb2xsSWQpIHtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5wb2xsSWQpO1xuICAgIH1cblxuICAgIHRoaXMuYXV0aFdpbmRvdyA9IG51bGw7XG4gICAgdGhpcy5wb2xsSWQgPSBudWxsO1xuICAgIFBvcHVwT3BlcmF0aW9uLmN1cnJlbnRQb3B1cEFjdGlvbiA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIHBvbGxVc2VyQ2FuY2VsbGF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IHBvbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5hdXRoV2luZG93Py53aW5kb3c/LmNsb3NlZCkge1xuICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHRpbWUgZm9yIHdoYXRldmVyIGFjdGlvbiB0b1xuICAgICAgICAvLyBjb21wbGV0ZS4gVGhlIHdpbmRvdyBjb3VsZCBoYXZlIGNsb3NlZCBidXQgdGhlIHNpZ24gaW4gbmV0d29ya1xuICAgICAgICAvLyBjYWxsIGNvdWxkIHN0aWxsIGJlIGluIGZsaWdodC4gVGhpcyBpcyBzcGVjaWZpY2FsbHkgdHJ1ZSBmb3JcbiAgICAgICAgLy8gRmlyZWZveCBvciBpZiB0aGUgb3BlbmVyIGlzIGluIGFuIGlmcmFtZSwgaW4gd2hpY2ggY2FzZSB0aGUgb2F1dGhcbiAgICAgICAgLy8gaGVscGVyIGNsb3NlcyB0aGUgcG9wdXAuXG4gICAgICAgIHRoaXMucG9sbElkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMucG9sbElkID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJlamVjdChcbiAgICAgICAgICAgIF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIEF1dGhFcnJvckNvZGUuUE9QVVBfQ0xPU0VEX0JZX1VTRVIpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSwgX1RpbWVvdXQuQVVUSF9FVkVOVCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wb2xsSWQgPSB3aW5kb3cuc2V0VGltZW91dChwb2xsLCBfUE9MTF9XSU5ET1dfQ0xPU0VfVElNRU9VVC5nZXQoKSk7XG4gICAgfTtcblxuICAgIHBvbGwoKTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHtcbiAgQXV0aEV2ZW50LFxuICBBdXRoRXZlbnRUeXBlLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbFxufSBmcm9tICcuLi8uLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBVc2VyQ3JlZGVudGlhbEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvdXNlcic7XG5pbXBvcnQgeyBQZXJzaXN0ZW5jZUludGVybmFsIH0gZnJvbSAnLi4vcGVyc2lzdGVuY2UnO1xuaW1wb3J0IHsgX3BlcnNpc3RlbmNlS2V5TmFtZSB9IGZyb20gJy4uL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlX3VzZXJfbWFuYWdlcic7XG5pbXBvcnQgeyBfZ2V0SW5zdGFuY2UgfSBmcm9tICcuLi91dGlsL2luc3RhbnRpYXRvcic7XG5pbXBvcnQgeyBBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24gfSBmcm9tICcuL2Fic3RyYWN0X3BvcHVwX3JlZGlyZWN0X29wZXJhdGlvbic7XG5cbmNvbnN0IFBFTkRJTkdfUkVESVJFQ1RfS0VZID0gJ3BlbmRpbmdSZWRpcmVjdCc7XG5cbi8vIFdlIG9ubHkgZ2V0IG9uZSByZWRpcmVjdCBvdXRjb21lIGZvciBhbnkgb25lIGF1dGgsIHNvIGp1c3Qgc3RvcmUgaXRcbi8vIGluIGhlcmUuXG5jb25zdCByZWRpcmVjdE91dGNvbWVNYXA6IE1hcDxcbiAgc3RyaW5nLFxuICAoKSA9PiBQcm9taXNlPFVzZXJDcmVkZW50aWFsSW50ZXJuYWwgfCBudWxsPlxuPiA9IG5ldyBNYXAoKTtcblxuZXhwb3J0IGNsYXNzIFJlZGlyZWN0QWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQb3B1cFJlZGlyZWN0T3BlcmF0aW9uIHtcbiAgZXZlbnRJZCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHJlc29sdmVyOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCxcbiAgICBieXBhc3NBdXRoU3RhdGUgPSBmYWxzZVxuICApIHtcbiAgICBzdXBlcihcbiAgICAgIGF1dGgsXG4gICAgICBbXG4gICAgICAgIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUkVESVJFQ1QsXG4gICAgICAgIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUkVESVJFQ1QsXG4gICAgICAgIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9SRURJUkVDVCxcbiAgICAgICAgQXV0aEV2ZW50VHlwZS5VTktOT1dOXG4gICAgICBdLFxuICAgICAgcmVzb2x2ZXIsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBieXBhc3NBdXRoU3RhdGVcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBleGVjdXRlIGZ1bmN0aW9uOyBpZiB3ZSBhbHJlYWR5IGhhdmUgYSByZWRpcmVjdCByZXN1bHQsIHRoZW5cbiAgICoganVzdCByZXR1cm4gaXQuXG4gICAqL1xuICBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8VXNlckNyZWRlbnRpYWxJbnRlcm5hbCB8IG51bGw+IHtcbiAgICBsZXQgcmVhZHlPdXRjb21lID0gcmVkaXJlY3RPdXRjb21lTWFwLmdldCh0aGlzLmF1dGguX2tleSgpKTtcbiAgICBpZiAoIXJlYWR5T3V0Y29tZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaGFzUGVuZGluZ1JlZGlyZWN0ID0gYXdhaXQgX2dldEFuZENsZWFyUGVuZGluZ1JlZGlyZWN0U3RhdHVzKFxuICAgICAgICAgIHRoaXMucmVzb2x2ZXIsXG4gICAgICAgICAgdGhpcy5hdXRoXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGhhc1BlbmRpbmdSZWRpcmVjdCA/IGF3YWl0IHN1cGVyLmV4ZWN1dGUoKSA6IG51bGw7XG4gICAgICAgIHJlYWR5T3V0Y29tZSA9ICgpID0+IFByb21pc2UucmVzb2x2ZShyZXN1bHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWFkeU91dGNvbWUgPSAoKSA9PiBQcm9taXNlLnJlamVjdChlKTtcbiAgICAgIH1cblxuICAgICAgcmVkaXJlY3RPdXRjb21lTWFwLnNldCh0aGlzLmF1dGguX2tleSgpLCByZWFkeU91dGNvbWUpO1xuICAgIH1cblxuICAgIC8vIElmIHdlJ3JlIG5vdCBieXBhc3NpbmcgYXV0aCBzdGF0ZSwgdGhlIHJlYWR5IG91dGNvbWUgc2hvdWxkIGJlIHNldCB0b1xuICAgIC8vIG51bGwuXG4gICAgaWYgKCF0aGlzLmJ5cGFzc0F1dGhTdGF0ZSkge1xuICAgICAgcmVkaXJlY3RPdXRjb21lTWFwLnNldCh0aGlzLmF1dGguX2tleSgpLCAoKSA9PiBQcm9taXNlLnJlc29sdmUobnVsbCkpO1xuICAgIH1cblxuICAgIHJldHVybiByZWFkeU91dGNvbWUoKTtcbiAgfVxuXG4gIGFzeW5jIG9uQXV0aEV2ZW50KGV2ZW50OiBBdXRoRXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9SRURJUkVDVCkge1xuICAgICAgcmV0dXJuIHN1cGVyLm9uQXV0aEV2ZW50KGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IEF1dGhFdmVudFR5cGUuVU5LTk9XTikge1xuICAgICAgLy8gVGhpcyBpcyBhIHNlbnRpbmVsIHZhbHVlIGluZGljYXRpbmcgdGhlcmUncyBubyBwZW5kaW5nIHJlZGlyZWN0XG4gICAgICB0aGlzLnJlc29sdmUobnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmV2ZW50SWQpIHtcbiAgICAgIGNvbnN0IHVzZXIgPSBhd2FpdCB0aGlzLmF1dGguX3JlZGlyZWN0VXNlckZvcklkKGV2ZW50LmV2ZW50SWQpO1xuICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uQXV0aEV2ZW50KGV2ZW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzb2x2ZShudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBvbkV4ZWN1dGlvbigpOiBQcm9taXNlPHZvaWQ+IHt9XG5cbiAgY2xlYW5VcCgpOiB2b2lkIHt9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZ2V0QW5kQ2xlYXJQZW5kaW5nUmVkaXJlY3RTdGF0dXMoXG4gIHJlc29sdmVyOiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCxcbiAgYXV0aDogQXV0aEludGVybmFsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qga2V5ID0gcGVuZGluZ1JlZGlyZWN0S2V5KGF1dGgpO1xuICBjb25zdCBwZXJzaXN0ZW5jZSA9IHJlc29sdmVyUGVyc2lzdGVuY2UocmVzb2x2ZXIpO1xuICBpZiAoIShhd2FpdCBwZXJzaXN0ZW5jZS5faXNBdmFpbGFibGUoKSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgaGFzUGVuZGluZ1JlZGlyZWN0ID0gKGF3YWl0IHBlcnNpc3RlbmNlLl9nZXQoa2V5KSkgPT09ICd0cnVlJztcbiAgYXdhaXQgcGVyc2lzdGVuY2UuX3JlbW92ZShrZXkpO1xuICByZXR1cm4gaGFzUGVuZGluZ1JlZGlyZWN0O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX3NldFBlbmRpbmdSZWRpcmVjdFN0YXR1cyhcbiAgcmVzb2x2ZXI6IFBvcHVwUmVkaXJlY3RSZXNvbHZlckludGVybmFsLFxuICBhdXRoOiBBdXRoSW50ZXJuYWxcbik6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gcmVzb2x2ZXJQZXJzaXN0ZW5jZShyZXNvbHZlcikuX3NldChwZW5kaW5nUmVkaXJlY3RLZXkoYXV0aCksICd0cnVlJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBfY2xlYXJSZWRpcmVjdE91dGNvbWVzKCk6IHZvaWQge1xuICByZWRpcmVjdE91dGNvbWVNYXAuY2xlYXIoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9vdmVycmlkZVJlZGlyZWN0UmVzdWx0KFxuICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gIHJlc3VsdDogKCkgPT4gUHJvbWlzZTxVc2VyQ3JlZGVudGlhbEludGVybmFsIHwgbnVsbD5cbik6IHZvaWQge1xuICByZWRpcmVjdE91dGNvbWVNYXAuc2V0KGF1dGguX2tleSgpLCByZXN1bHQpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlclBlcnNpc3RlbmNlKFxuICByZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVySW50ZXJuYWxcbik6IFBlcnNpc3RlbmNlSW50ZXJuYWwge1xuICByZXR1cm4gX2dldEluc3RhbmNlKHJlc29sdmVyLl9yZWRpcmVjdFBlcnNpc3RlbmNlKTtcbn1cblxuZnVuY3Rpb24gcGVuZGluZ1JlZGlyZWN0S2V5KGF1dGg6IEF1dGhJbnRlcm5hbCk6IHN0cmluZyB7XG4gIHJldHVybiBfcGVyc2lzdGVuY2VLZXlOYW1lKFxuICAgIFBFTkRJTkdfUkVESVJFQ1RfS0VZLFxuICAgIGF1dGguY29uZmlnLmFwaUtleSxcbiAgICBhdXRoLm5hbWVcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQge1xuICBBdXRoLFxuICBBdXRoUHJvdmlkZXIsXG4gIFBvcHVwUmVkaXJlY3RSZXNvbHZlcixcbiAgVXNlcixcbiAgVXNlckNyZWRlbnRpYWxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuaW1wb3J0IHsgX2Nhc3RBdXRoIH0gZnJvbSAnLi4vLi4vY29yZS9hdXRoL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBfYXNzZXJ0TGlua2VkU3RhdHVzIH0gZnJvbSAnLi4vLi4vY29yZS91c2VyL2xpbmtfdW5saW5rJztcbmltcG9ydCB7IF9hc3NlcnRJbnN0YW5jZU9mIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfZ2VuZXJhdGVFdmVudElkIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2V2ZW50X2lkJztcbmltcG9ydCB7IEF1dGhFdmVudFR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBVc2VySW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC91c2VyJztcbmltcG9ydCB7IF93aXRoRGVmYXVsdFJlc29sdmVyIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL3Jlc29sdmVyJztcbmltcG9ydCB7XG4gIFJlZGlyZWN0QWN0aW9uLFxuICBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzXG59IGZyb20gJy4uLy4uL2NvcmUvc3RyYXRlZ2llcy9yZWRpcmVjdCc7XG5pbXBvcnQgeyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi8uLi9jb3JlL3Byb3ZpZGVycy9mZWRlcmF0ZWQnO1xuaW1wb3J0IHsgZ2V0TW9kdWxhckluc3RhbmNlIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuXG4vKipcbiAqIEF1dGhlbnRpY2F0ZXMgYSBGaXJlYmFzZSBjbGllbnQgdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVG8gaGFuZGxlIHRoZSByZXN1bHRzIGFuZCBlcnJvcnMgZm9yIHRoaXMgb3BlcmF0aW9uLCByZWZlciB0byB7QGxpbmsgZ2V0UmVkaXJlY3RSZXN1bHR9LlxuICogRm9sbG93IHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC93ZWIvcmVkaXJlY3QtYmVzdC1wcmFjdGljZXNcbiAqIHwgYmVzdCBwcmFjdGljZXN9IHdoZW4gdXNpbmcge0BsaW5rIHNpZ25JbldpdGhSZWRpcmVjdH0uXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XG4gKiAvLyBZb3UgY2FuIGFkZCBhZGRpdGlvbmFsIHNjb3BlcyB0byB0aGUgcHJvdmlkZXI6XG4gKiBwcm92aWRlci5hZGRTY29wZSgndXNlcl9iaXJ0aGRheScpO1xuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogaWYgKHJlc3VsdCkge1xuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogfVxuICogLy8gQXMgdGhpcyBBUEkgY2FuIGJlIHVzZWQgZm9yIHNpZ24taW4sIGxpbmtpbmcgYW5kIHJlYXV0aGVudGljYXRpb24sXG4gKiAvLyBjaGVjayB0aGUgb3BlcmF0aW9uVHlwZSB0byBkZXRlcm1pbmUgd2hhdCB0cmlnZ2VyZWQgdGhpcyByZWRpcmVjdFxuICogLy8gb3BlcmF0aW9uLlxuICogY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHJlc3VsdC5vcGVyYXRpb25UeXBlO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHByb3ZpZGVyIC0gVGhlIHByb3ZpZGVyIHRvIGF1dGhlbnRpY2F0ZS4gVGhlIHByb3ZpZGVyIGhhcyB0byBiZSBhbiB7QGxpbmsgT0F1dGhQcm92aWRlcn0uXG4gKiBOb24tT0F1dGggcHJvdmlkZXJzIGxpa2Uge0BsaW5rIEVtYWlsQXV0aFByb3ZpZGVyfSB3aWxsIHRocm93IGFuIGVycm9yLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25JbldpdGhSZWRpcmVjdChcbiAgYXV0aDogQXV0aCxcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8bmV2ZXI+IHtcbiAgcmV0dXJuIF9zaWduSW5XaXRoUmVkaXJlY3QoYXV0aCwgcHJvdmlkZXIsIHJlc29sdmVyKSBhcyBQcm9taXNlPG5ldmVyPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9zaWduSW5XaXRoUmVkaXJlY3QoXG4gIGF1dGg6IEF1dGgsXG4gIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gIHJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4pOiBQcm9taXNlPHZvaWQgfCBuZXZlcj4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKGF1dGgsIHByb3ZpZGVyLCBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIpO1xuICAvLyBXYWl0IGZvciBhdXRoIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlLCB0aGlzIHdpbGwgcHJvY2VzcyBwZW5kaW5nIHJlZGlyZWN0cyBhbmQgY2xlYXIgdGhlXG4gIC8vIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGluIHBlcnNpc3RlbmNlLiBUaGlzIHNob3VsZCBiZSBjb21wbGV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgbmV3XG4gIC8vIHJlZGlyZWN0IGFuZCBjcmVhdGluZyBhIFBFTkRJTkdfUkVESVJFQ1RfS0VZIGVudHJ5LlxuICBhd2FpdCBhdXRoSW50ZXJuYWwuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgY29uc3QgcmVzb2x2ZXJJbnRlcm5hbCA9IF93aXRoRGVmYXVsdFJlc29sdmVyKGF1dGhJbnRlcm5hbCwgcmVzb2x2ZXIpO1xuICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIGF1dGhJbnRlcm5hbCk7XG5cbiAgcmV0dXJuIHJlc29sdmVySW50ZXJuYWwuX29wZW5SZWRpcmVjdChcbiAgICBhdXRoSW50ZXJuYWwsXG4gICAgcHJvdmlkZXIsXG4gICAgQXV0aEV2ZW50VHlwZS5TSUdOX0lOX1ZJQV9SRURJUkVDVFxuICApO1xufVxuXG4vKipcbiAqIFJlYXV0aGVudGljYXRlcyB0aGUgY3VycmVudCB1c2VyIHdpdGggdGhlIHNwZWNpZmllZCB7QGxpbmsgT0F1dGhQcm92aWRlcn0gdXNpbmcgYSBmdWxsLXBhZ2UgcmVkaXJlY3QgZmxvdy5cbiAqIEByZW1hcmtzXG4gKiBUbyBoYW5kbGUgdGhlIHJlc3VsdHMgYW5kIGVycm9ycyBmb3IgdGhpcyBvcGVyYXRpb24sIHJlZmVyIHRvIHtAbGluayBnZXRSZWRpcmVjdFJlc3VsdH0uXG4gKiBGb2xsb3cgdGhlIHtAbGluayBodHRwczovL2ZpcmViYXNlLmdvb2dsZS5jb20vZG9jcy9hdXRoL3dlYi9yZWRpcmVjdC1iZXN0LXByYWN0aWNlc1xuICogfCBiZXN0IHByYWN0aWNlc30gd2hlbiB1c2luZyB7QGxpbmsgcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3R9LlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIGEgcmVkaXJlY3QuXG4gKiBjb25zdCBwcm92aWRlciA9IG5ldyBGYWNlYm9va0F1dGhQcm92aWRlcigpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogLy8gUmVhdXRoZW50aWNhdGUgdXNpbmcgYSByZWRpcmVjdC5cbiAqIGF3YWl0IHJlYXV0aGVudGljYXRlV2l0aFJlZGlyZWN0KHJlc3VsdC51c2VyLCBwcm92aWRlcik7XG4gKiAvLyBUaGlzIHdpbGwgYWdhaW4gdHJpZ2dlciBhIGZ1bGwgcGFnZSByZWRpcmVjdCBhd2F5IGZyb20geW91ciBhcHBcbiAqXG4gKiAvLyBBZnRlciByZXR1cm5pbmcgZnJvbSB0aGUgcmVkaXJlY3Qgd2hlbiB5b3VyIGFwcCBpbml0aWFsaXplcyB5b3UgY2FuIG9idGFpbiB0aGUgcmVzdWx0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZWRpcmVjdFJlc3VsdChhdXRoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB1c2VyIC0gVGhlIHVzZXIuXG4gKiBAcGFyYW0gcHJvdmlkZXIgLSBUaGUgcHJvdmlkZXIgdG8gYXV0aGVudGljYXRlLiBUaGUgcHJvdmlkZXIgaGFzIHRvIGJlIGFuIHtAbGluayBPQXV0aFByb3ZpZGVyfS5cbiAqIE5vbi1PQXV0aCBwcm92aWRlcnMgbGlrZSB7QGxpbmsgRW1haWxBdXRoUHJvdmlkZXJ9IHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gKiBAcGFyYW0gcmVzb2x2ZXIgLSBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUG9wdXBSZWRpcmVjdFJlc29sdmVyfSwgb3B0aW9uYWxcbiAqIGlmIGFscmVhZHkgc3VwcGxpZWQgdG8ge0BsaW5rIGluaXRpYWxpemVBdXRofSBvciBwcm92aWRlZCBieSB7QGxpbmsgZ2V0QXV0aH0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QoXG4gIHVzZXI6IFVzZXIsXG4gIHByb3ZpZGVyOiBBdXRoUHJvdmlkZXIsXG4gIHJlc29sdmVyPzogUG9wdXBSZWRpcmVjdFJlc29sdmVyXG4pOiBQcm9taXNlPG5ldmVyPiB7XG4gIHJldHVybiBfcmVhdXRoZW50aWNhdGVXaXRoUmVkaXJlY3QoXG4gICAgdXNlcixcbiAgICBwcm92aWRlcixcbiAgICByZXNvbHZlclxuICApIGFzIFByb21pc2U8bmV2ZXI+O1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9yZWF1dGhlbnRpY2F0ZVdpdGhSZWRpcmVjdChcbiAgdXNlcjogVXNlcixcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8dm9pZCB8IG5ldmVyPiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcbiAgLy8gV2FpdCBmb3IgYXV0aCBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSwgdGhpcyB3aWxsIHByb2Nlc3MgcGVuZGluZyByZWRpcmVjdHMgYW5kIGNsZWFyIHRoZVxuICAvLyBQRU5ESU5HX1JFRElSRUNUX0tFWSBpbiBwZXJzaXN0ZW5jZS4gVGhpcyBzaG91bGQgYmUgY29tcGxldGVkIGJlZm9yZSBzdGFydGluZyBhIG5ld1xuICAvLyByZWRpcmVjdCBhbmQgY3JlYXRpbmcgYSBQRU5ESU5HX1JFRElSRUNUX0tFWSBlbnRyeS5cbiAgYXdhaXQgdXNlckludGVybmFsLmF1dGguX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgLy8gQWxsb3cgdGhlIHJlc29sdmVyIHRvIGVycm9yIGJlZm9yZSBwZXJzaXN0aW5nIHRoZSByZWRpcmVjdCB1c2VyXG4gIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcih1c2VySW50ZXJuYWwuYXV0aCwgcmVzb2x2ZXIpO1xuICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbC5hdXRoKTtcblxuICBjb25zdCBldmVudElkID0gYXdhaXQgcHJlcGFyZVVzZXJGb3JSZWRpcmVjdCh1c2VySW50ZXJuYWwpO1xuICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIHByb3ZpZGVyLFxuICAgIEF1dGhFdmVudFR5cGUuUkVBVVRIX1ZJQV9SRURJUkVDVCxcbiAgICBldmVudElkXG4gICk7XG59XG5cbi8qKlxuICogTGlua3MgdGhlIHtAbGluayBPQXV0aFByb3ZpZGVyfSB0byB0aGUgdXNlciBhY2NvdW50IHVzaW5nIGEgZnVsbC1wYWdlIHJlZGlyZWN0IGZsb3cuXG4gKiBAcmVtYXJrc1xuICogVG8gaGFuZGxlIHRoZSByZXN1bHRzIGFuZCBlcnJvcnMgZm9yIHRoaXMgb3BlcmF0aW9uLCByZWZlciB0byB7QGxpbmsgZ2V0UmVkaXJlY3RSZXN1bHR9LlxuICogRm9sbG93IHRoZSB7QGxpbmsgaHR0cHM6Ly9maXJlYmFzZS5nb29nbGUuY29tL2RvY3MvYXV0aC93ZWIvcmVkaXJlY3QtYmVzdC1wcmFjdGljZXNcbiAqIHwgYmVzdCBwcmFjdGljZXN9IHdoZW4gdXNpbmcge0BsaW5rIGxpbmtXaXRoUmVkaXJlY3R9LlxuICpcbiAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaW4gYSBOb2RlLmpzIGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiAvLyBTaWduIGluIHVzaW5nIHNvbWUgb3RoZXIgcHJvdmlkZXIuXG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBzaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZChhdXRoLCBlbWFpbCwgcGFzc3dvcmQpO1xuICogLy8gTGluayB1c2luZyBhIHJlZGlyZWN0LlxuICogY29uc3QgcHJvdmlkZXIgPSBuZXcgRmFjZWJvb2tBdXRoUHJvdmlkZXIoKTtcbiAqIGF3YWl0IGxpbmtXaXRoUmVkaXJlY3QocmVzdWx0LnVzZXIsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVzZXIgLSBUaGUgdXNlci5cbiAqIEBwYXJhbSBwcm92aWRlciAtIFRoZSBwcm92aWRlciB0byBhdXRoZW50aWNhdGUuIFRoZSBwcm92aWRlciBoYXMgdG8gYmUgYW4ge0BsaW5rIE9BdXRoUHJvdmlkZXJ9LlxuICogTm9uLU9BdXRoIHByb3ZpZGVycyBsaWtlIHtAbGluayBFbWFpbEF1dGhQcm92aWRlcn0gd2lsbCB0aHJvdyBhbiBlcnJvci5cbiAqIEBwYXJhbSByZXNvbHZlciAtIEFuIGluc3RhbmNlIG9mIHtAbGluayBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJ9LCBvcHRpb25hbFxuICogaWYgYWxyZWFkeSBzdXBwbGllZCB0byB7QGxpbmsgaW5pdGlhbGl6ZUF1dGh9IG9yIHByb3ZpZGVkIGJ5IHtAbGluayBnZXRBdXRofS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaW5rV2l0aFJlZGlyZWN0KFxuICB1c2VyOiBVc2VyLFxuICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTxuZXZlcj4ge1xuICByZXR1cm4gX2xpbmtXaXRoUmVkaXJlY3QodXNlciwgcHJvdmlkZXIsIHJlc29sdmVyKSBhcyBQcm9taXNlPG5ldmVyPjtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfbGlua1dpdGhSZWRpcmVjdChcbiAgdXNlcjogVXNlcixcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgcmVzb2x2ZXI/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJcbik6IFByb21pc2U8dm9pZCB8IG5ldmVyPiB7XG4gIGNvbnN0IHVzZXJJbnRlcm5hbCA9IGdldE1vZHVsYXJJbnN0YW5jZSh1c2VyKSBhcyBVc2VySW50ZXJuYWw7XG4gIF9hc3NlcnRJbnN0YW5jZU9mKHVzZXJJbnRlcm5hbC5hdXRoLCBwcm92aWRlciwgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKTtcbiAgLy8gV2FpdCBmb3IgYXV0aCBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSwgdGhpcyB3aWxsIHByb2Nlc3MgcGVuZGluZyByZWRpcmVjdHMgYW5kIGNsZWFyIHRoZVxuICAvLyBQRU5ESU5HX1JFRElSRUNUX0tFWSBpbiBwZXJzaXN0ZW5jZS4gVGhpcyBzaG91bGQgYmUgY29tcGxldGVkIGJlZm9yZSBzdGFydGluZyBhIG5ld1xuICAvLyByZWRpcmVjdCBhbmQgY3JlYXRpbmcgYSBQRU5ESU5HX1JFRElSRUNUX0tFWSBlbnRyeS5cbiAgYXdhaXQgdXNlckludGVybmFsLmF1dGguX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgLy8gQWxsb3cgdGhlIHJlc29sdmVyIHRvIGVycm9yIGJlZm9yZSBwZXJzaXN0aW5nIHRoZSByZWRpcmVjdCB1c2VyXG4gIGNvbnN0IHJlc29sdmVySW50ZXJuYWwgPSBfd2l0aERlZmF1bHRSZXNvbHZlcih1c2VySW50ZXJuYWwuYXV0aCwgcmVzb2x2ZXIpO1xuICBhd2FpdCBfYXNzZXJ0TGlua2VkU3RhdHVzKGZhbHNlLCB1c2VySW50ZXJuYWwsIHByb3ZpZGVyLnByb3ZpZGVySWQpO1xuICBhd2FpdCBfc2V0UGVuZGluZ1JlZGlyZWN0U3RhdHVzKHJlc29sdmVySW50ZXJuYWwsIHVzZXJJbnRlcm5hbC5hdXRoKTtcblxuICBjb25zdCBldmVudElkID0gYXdhaXQgcHJlcGFyZVVzZXJGb3JSZWRpcmVjdCh1c2VySW50ZXJuYWwpO1xuICByZXR1cm4gcmVzb2x2ZXJJbnRlcm5hbC5fb3BlblJlZGlyZWN0KFxuICAgIHVzZXJJbnRlcm5hbC5hdXRoLFxuICAgIHByb3ZpZGVyLFxuICAgIEF1dGhFdmVudFR5cGUuTElOS19WSUFfUkVESVJFQ1QsXG4gICAgZXZlbnRJZFxuICApO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgVXNlckNyZWRlbnRpYWx9IGZyb20gdGhlIHJlZGlyZWN0LWJhc2VkIHNpZ24taW4gZmxvdy5cbiAqXG4gKiBAcmVtYXJrc1xuICogSWYgc2lnbi1pbiBzdWNjZWVkZWQsIHJldHVybnMgdGhlIHNpZ25lZCBpbiB1c2VyLiBJZiBzaWduLWluIHdhcyB1bnN1Y2Nlc3NmdWwsIGZhaWxzIHdpdGggYW5cbiAqIGVycm9yLiBJZiBubyByZWRpcmVjdCBvcGVyYXRpb24gd2FzIGNhbGxlZCwgcmV0dXJucyBgbnVsbGAuXG4gKlxuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGphdmFzY3JpcHRcbiAqIC8vIFNpZ24gaW4gdXNpbmcgYSByZWRpcmVjdC5cbiAqIGNvbnN0IHByb3ZpZGVyID0gbmV3IEZhY2Vib29rQXV0aFByb3ZpZGVyKCk7XG4gKiAvLyBZb3UgY2FuIGFkZCBhZGRpdGlvbmFsIHNjb3BlcyB0byB0aGUgcHJvdmlkZXI6XG4gKiBwcm92aWRlci5hZGRTY29wZSgndXNlcl9iaXJ0aGRheScpO1xuICogLy8gU3RhcnQgYSBzaWduIGluIHByb2Nlc3MgZm9yIGFuIHVuYXV0aGVudGljYXRlZCB1c2VyLlxuICogYXdhaXQgc2lnbkluV2l0aFJlZGlyZWN0KGF1dGgsIHByb3ZpZGVyKTtcbiAqIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwYWdlIHJlZGlyZWN0IGF3YXkgZnJvbSB5b3VyIGFwcFxuICpcbiAqIC8vIEFmdGVyIHJldHVybmluZyBmcm9tIHRoZSByZWRpcmVjdCB3aGVuIHlvdXIgYXBwIGluaXRpYWxpemVzIHlvdSBjYW4gb2J0YWluIHRoZSByZXN1bHRcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlZGlyZWN0UmVzdWx0KGF1dGgpO1xuICogaWYgKHJlc3VsdCkge1xuICogICAvLyBUaGlzIGlzIHRoZSBzaWduZWQtaW4gdXNlclxuICogICBjb25zdCB1c2VyID0gcmVzdWx0LnVzZXI7XG4gKiAgIC8vIFRoaXMgZ2l2ZXMgeW91IGEgRmFjZWJvb2sgQWNjZXNzIFRva2VuLlxuICogICBjb25zdCBjcmVkZW50aWFsID0gcHJvdmlkZXIuY3JlZGVudGlhbEZyb21SZXN1bHQoYXV0aCwgcmVzdWx0KTtcbiAqICAgY29uc3QgdG9rZW4gPSBjcmVkZW50aWFsLmFjY2Vzc1Rva2VuO1xuICogfVxuICogLy8gQXMgdGhpcyBBUEkgY2FuIGJlIHVzZWQgZm9yIHNpZ24taW4sIGxpbmtpbmcgYW5kIHJlYXV0aGVudGljYXRpb24sXG4gKiAvLyBjaGVjayB0aGUgb3BlcmF0aW9uVHlwZSB0byBkZXRlcm1pbmUgd2hhdCB0cmlnZ2VyZWQgdGhpcyByZWRpcmVjdFxuICogLy8gb3BlcmF0aW9uLlxuICogY29uc3Qgb3BlcmF0aW9uVHlwZSA9IHJlc3VsdC5vcGVyYXRpb25UeXBlO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGF1dGggLSBUaGUge0BsaW5rIEF1dGh9IGluc3RhbmNlLlxuICogQHBhcmFtIHJlc29sdmVyIC0gQW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0sIG9wdGlvbmFsXG4gKiBpZiBhbHJlYWR5IHN1cHBsaWVkIHRvIHtAbGluayBpbml0aWFsaXplQXV0aH0gb3IgcHJvdmlkZWQgYnkge0BsaW5rIGdldEF1dGh9LlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFJlZGlyZWN0UmVzdWx0KFxuICBhdXRoOiBBdXRoLFxuICByZXNvbHZlcj86IFBvcHVwUmVkaXJlY3RSZXNvbHZlclxuKTogUHJvbWlzZTxVc2VyQ3JlZGVudGlhbCB8IG51bGw+IHtcbiAgYXdhaXQgX2Nhc3RBdXRoKGF1dGgpLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIHJldHVybiBfZ2V0UmVkaXJlY3RSZXN1bHQoYXV0aCwgcmVzb2x2ZXIsIGZhbHNlKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF9nZXRSZWRpcmVjdFJlc3VsdChcbiAgYXV0aDogQXV0aCxcbiAgcmVzb2x2ZXJFeHRlcm4/OiBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIsXG4gIGJ5cGFzc0F1dGhTdGF0ZSA9IGZhbHNlXG4pOiBQcm9taXNlPFVzZXJDcmVkZW50aWFsIHwgbnVsbD4ge1xuICBjb25zdCBhdXRoSW50ZXJuYWwgPSBfY2FzdEF1dGgoYXV0aCk7XG4gIGNvbnN0IHJlc29sdmVyID0gX3dpdGhEZWZhdWx0UmVzb2x2ZXIoYXV0aEludGVybmFsLCByZXNvbHZlckV4dGVybik7XG4gIGNvbnN0IGFjdGlvbiA9IG5ldyBSZWRpcmVjdEFjdGlvbihhdXRoSW50ZXJuYWwsIHJlc29sdmVyLCBieXBhc3NBdXRoU3RhdGUpO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3Rpb24uZXhlY3V0ZSgpO1xuXG4gIGlmIChyZXN1bHQgJiYgIWJ5cGFzc0F1dGhTdGF0ZSkge1xuICAgIGRlbGV0ZSByZXN1bHQudXNlci5fcmVkaXJlY3RFdmVudElkO1xuICAgIGF3YWl0IGF1dGhJbnRlcm5hbC5fcGVyc2lzdFVzZXJJZkN1cnJlbnQocmVzdWx0LnVzZXIgYXMgVXNlckludGVybmFsKTtcbiAgICBhd2FpdCBhdXRoSW50ZXJuYWwuX3NldFJlZGlyZWN0VXNlcihudWxsLCByZXNvbHZlckV4dGVybik7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcmVwYXJlVXNlckZvclJlZGlyZWN0KHVzZXI6IFVzZXJJbnRlcm5hbCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGV2ZW50SWQgPSBfZ2VuZXJhdGVFdmVudElkKGAke3VzZXIudWlkfTo6OmApO1xuICB1c2VyLl9yZWRpcmVjdEV2ZW50SWQgPSBldmVudElkO1xuICBhd2FpdCB1c2VyLmF1dGguX3NldFJlZGlyZWN0VXNlcih1c2VyKTtcbiAgYXdhaXQgdXNlci5hdXRoLl9wZXJzaXN0VXNlcklmQ3VycmVudCh1c2VyKTtcbiAgcmV0dXJuIGV2ZW50SWQ7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHtcbiAgQXV0aEV2ZW50LFxuICBBdXRoRXZlbnRDb25zdW1lcixcbiAgQXV0aEV2ZW50VHlwZSxcbiAgRXZlbnRNYW5hZ2VyXG59IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfY3JlYXRlRXJyb3IgfSBmcm9tICcuLi91dGlsL2Fzc2VydCc7XG5cbi8vIFRoZSBhbW91bnQgb2YgdGltZSB0byBzdG9yZSB0aGUgVUlEcyBvZiBzZWVuIGV2ZW50czsgdGhpcyBpc1xuLy8gc2V0IHRvIDEwIG1pbiBieSBkZWZhdWx0XG5jb25zdCBFVkVOVF9EVVBMSUNBVElPTl9DQUNIRV9EVVJBVElPTl9NUyA9IDEwICogNjAgKiAxMDAwO1xuXG5leHBvcnQgY2xhc3MgQXV0aEV2ZW50TWFuYWdlciBpbXBsZW1lbnRzIEV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FjaGVkRXZlbnRVaWRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb25zdW1lcnM6IFNldDxBdXRoRXZlbnRDb25zdW1lcj4gPSBuZXcgU2V0KCk7XG4gIHByb3RlY3RlZCBxdWV1ZWRSZWRpcmVjdEV2ZW50OiBBdXRoRXZlbnQgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCA9IGZhbHNlO1xuICBwcml2YXRlIGxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsKSB7fVxuXG4gIHJlZ2lzdGVyQ29uc3VtZXIoYXV0aEV2ZW50Q29uc3VtZXI6IEF1dGhFdmVudENvbnN1bWVyKTogdm9pZCB7XG4gICAgdGhpcy5jb25zdW1lcnMuYWRkKGF1dGhFdmVudENvbnN1bWVyKTtcblxuICAgIGlmIChcbiAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCAmJlxuICAgICAgdGhpcy5pc0V2ZW50Rm9yQ29uc3VtZXIodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50LCBhdXRoRXZlbnRDb25zdW1lcilcbiAgICApIHtcbiAgICAgIHRoaXMuc2VuZFRvQ29uc3VtZXIodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50LCBhdXRoRXZlbnRDb25zdW1lcik7XG4gICAgICB0aGlzLnNhdmVFdmVudFRvQ2FjaGUodGhpcy5xdWV1ZWRSZWRpcmVjdEV2ZW50KTtcbiAgICAgIHRoaXMucXVldWVkUmVkaXJlY3RFdmVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgdW5yZWdpc3RlckNvbnN1bWVyKGF1dGhFdmVudENvbnN1bWVyOiBBdXRoRXZlbnRDb25zdW1lcik6IHZvaWQge1xuICAgIHRoaXMuY29uc3VtZXJzLmRlbGV0ZShhdXRoRXZlbnRDb25zdW1lcik7XG4gIH1cblxuICBvbkV2ZW50KGV2ZW50OiBBdXRoRXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBoYW5kbGVkXG4gICAgaWYgKHRoaXMuaGFzRXZlbnRCZWVuSGFuZGxlZChldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgIHRoaXMuY29uc3VtZXJzLmZvckVhY2goY29uc3VtZXIgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNFdmVudEZvckNvbnN1bWVyKGV2ZW50LCBjb25zdW1lcikpIHtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VuZFRvQ29uc3VtZXIoZXZlbnQsIGNvbnN1bWVyKTtcbiAgICAgICAgdGhpcy5zYXZlRXZlbnRUb0NhY2hlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmhhc0hhbmRsZWRQb3RlbnRpYWxSZWRpcmVjdCB8fCAhaXNSZWRpcmVjdEV2ZW50KGV2ZW50KSkge1xuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBzZWVuIGEgcmVkaXJlY3QgYmVmb3JlLCBvciB0aGlzIGlzIGEgcG9wdXAgZXZlbnQsXG4gICAgICAvLyBiYWlsIG5vd1xuICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5oYXNIYW5kbGVkUG90ZW50aWFsUmVkaXJlY3QgPSB0cnVlO1xuXG4gICAgLy8gSWYgdGhlIHJlZGlyZWN0IHdhc24ndCBoYW5kbGVkLCBoYW5nIG9uIHRvIGl0XG4gICAgaWYgKCFoYW5kbGVkKSB7XG4gICAgICB0aGlzLnF1ZXVlZFJlZGlyZWN0RXZlbnQgPSBldmVudDtcbiAgICAgIGhhbmRsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kVG9Db25zdW1lcihldmVudDogQXV0aEV2ZW50LCBjb25zdW1lcjogQXV0aEV2ZW50Q29uc3VtZXIpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuZXJyb3IgJiYgIWlzTnVsbFJlZGlyZWN0RXZlbnQoZXZlbnQpKSB7XG4gICAgICBjb25zdCBjb2RlID1cbiAgICAgICAgKGV2ZW50LmVycm9yLmNvZGU/LnNwbGl0KCdhdXRoLycpWzFdIGFzIEF1dGhFcnJvckNvZGUpIHx8XG4gICAgICAgIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1I7XG4gICAgICBjb25zdW1lci5vbkVycm9yKF9jcmVhdGVFcnJvcih0aGlzLmF1dGgsIGNvZGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3VtZXIub25BdXRoRXZlbnQoZXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNFdmVudEZvckNvbnN1bWVyKFxuICAgIGV2ZW50OiBBdXRoRXZlbnQsXG4gICAgY29uc3VtZXI6IEF1dGhFdmVudENvbnN1bWVyXG4gICk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGV2ZW50SWRNYXRjaGVzID1cbiAgICAgIGNvbnN1bWVyLmV2ZW50SWQgPT09IG51bGwgfHxcbiAgICAgICghIWV2ZW50LmV2ZW50SWQgJiYgZXZlbnQuZXZlbnRJZCA9PT0gY29uc3VtZXIuZXZlbnRJZCk7XG4gICAgcmV0dXJuIGNvbnN1bWVyLmZpbHRlci5pbmNsdWRlcyhldmVudC50eXBlKSAmJiBldmVudElkTWF0Y2hlcztcbiAgfVxuXG4gIHByaXZhdGUgaGFzRXZlbnRCZWVuSGFuZGxlZChldmVudDogQXV0aEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKFxuICAgICAgRGF0ZS5ub3coKSAtIHRoaXMubGFzdFByb2Nlc3NlZEV2ZW50VGltZSA+PVxuICAgICAgRVZFTlRfRFVQTElDQVRJT05fQ0FDSEVfRFVSQVRJT05fTVNcbiAgICApIHtcbiAgICAgIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkRXZlbnRVaWRzLmhhcyhldmVudFVpZChldmVudCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlRXZlbnRUb0NhY2hlKGV2ZW50OiBBdXRoRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmNhY2hlZEV2ZW50VWlkcy5hZGQoZXZlbnRVaWQoZXZlbnQpKTtcbiAgICB0aGlzLmxhc3RQcm9jZXNzZWRFdmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGV2ZW50VWlkKGU6IEF1dGhFdmVudCk6IHN0cmluZyB7XG4gIHJldHVybiBbZS50eXBlLCBlLmV2ZW50SWQsIGUuc2Vzc2lvbklkLCBlLnRlbmFudElkXS5maWx0ZXIodiA9PiB2KS5qb2luKCctJyk7XG59XG5cbmZ1bmN0aW9uIGlzTnVsbFJlZGlyZWN0RXZlbnQoeyB0eXBlLCBlcnJvciB9OiBBdXRoRXZlbnQpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0eXBlID09PSBBdXRoRXZlbnRUeXBlLlVOS05PV04gJiZcbiAgICBlcnJvcj8uY29kZSA9PT0gYGF1dGgvJHtBdXRoRXJyb3JDb2RlLk5PX0FVVEhfRVZFTlR9YFxuICApO1xufVxuXG5mdW5jdGlvbiBpc1JlZGlyZWN0RXZlbnQoZXZlbnQ6IEF1dGhFdmVudCk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICBjYXNlIEF1dGhFdmVudFR5cGUuU0lHTl9JTl9WSUFfUkVESVJFQ1Q6XG4gICAgY2FzZSBBdXRoRXZlbnRUeXBlLkxJTktfVklBX1JFRElSRUNUOlxuICAgIGNhc2UgQXV0aEV2ZW50VHlwZS5SRUFVVEhfVklBX1JFRElSRUNUOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSBBdXRoRXZlbnRUeXBlLlVOS05PV046XG4gICAgICByZXR1cm4gaXNOdWxsUmVkaXJlY3RFdmVudChldmVudCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF9wZXJmb3JtQXBpUmVxdWVzdCwgRW5kcG9pbnQsIEh0dHBNZXRob2QgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBBdXRoIH0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBHZXRQcm9qZWN0Q29uZmlnUmVxdWVzdCB7XG4gIGFuZHJvaWRQYWNrYWdlTmFtZT86IHN0cmluZztcbiAgaW9zQnVuZGxlSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UHJvamVjdENvbmZpZ1Jlc3BvbnNlIHtcbiAgYXV0aG9yaXplZERvbWFpbnM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX2dldFByb2plY3RDb25maWcoXG4gIGF1dGg6IEF1dGgsXG4gIHJlcXVlc3Q6IEdldFByb2plY3RDb25maWdSZXF1ZXN0ID0ge31cbik6IFByb21pc2U8R2V0UHJvamVjdENvbmZpZ1Jlc3BvbnNlPiB7XG4gIHJldHVybiBfcGVyZm9ybUFwaVJlcXVlc3Q8R2V0UHJvamVjdENvbmZpZ1JlcXVlc3QsIEdldFByb2plY3RDb25maWdSZXNwb25zZT4oXG4gICAgYXV0aCxcbiAgICBIdHRwTWV0aG9kLkdFVCxcbiAgICBFbmRwb2ludC5HRVRfUFJPSkVDVF9DT05GSUcsXG4gICAgcmVxdWVzdFxuICApO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IF9nZXRQcm9qZWN0Q29uZmlnIH0gZnJvbSAnLi4vLi4vYXBpL3Byb2plY3RfY29uZmlnL2dldF9wcm9qZWN0X2NvbmZpZyc7XG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2ZhaWwgfSBmcm9tICcuL2Fzc2VydCc7XG5pbXBvcnQgeyBfZ2V0Q3VycmVudFVybCB9IGZyb20gJy4vbG9jYXRpb24nO1xuXG5jb25zdCBJUF9BRERSRVNTX1JFR0VYID0gL15cXGR7MSwzfVxcLlxcZHsxLDN9XFwuXFxkezEsM31cXC5cXGR7MSwzfSQvO1xuY29uc3QgSFRUUF9SRUdFWCA9IC9eaHR0cHM/LztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIF92YWxpZGF0ZU9yaWdpbihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgLy8gU2tpcCBvcmlnaW4gdmFsaWRhdGlvbiBpZiB3ZSBhcmUgaW4gYW4gZW11bGF0ZWQgZW52aXJvbm1lbnRcbiAgaWYgKGF1dGguY29uZmlnLmVtdWxhdG9yKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBhdXRob3JpemVkRG9tYWlucyB9ID0gYXdhaXQgX2dldFByb2plY3RDb25maWcoYXV0aCk7XG5cbiAgZm9yIChjb25zdCBkb21haW4gb2YgYXV0aG9yaXplZERvbWFpbnMpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG1hdGNoRG9tYWluKGRvbWFpbikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRG8gbm90aGluZyBpZiB0aGVyZSdzIGEgVVJMIGVycm9yOyBqdXN0IGNvbnRpbnVlIHNlYXJjaGluZ1xuICAgIH1cbiAgfVxuXG4gIC8vIEluIHRoZSBvbGQgU0RLLCB0aGlzIGVycm9yIGFsc28gcHJvdmlkZXMgaGVscGZ1bCBtZXNzYWdlcy5cbiAgX2ZhaWwoYXV0aCwgQXV0aEVycm9yQ29kZS5JTlZBTElEX09SSUdJTik7XG59XG5cbmZ1bmN0aW9uIG1hdGNoRG9tYWluKGV4cGVjdGVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgY3VycmVudFVybCA9IF9nZXRDdXJyZW50VXJsKCk7XG4gIGNvbnN0IHsgcHJvdG9jb2wsIGhvc3RuYW1lIH0gPSBuZXcgVVJMKGN1cnJlbnRVcmwpO1xuICBpZiAoZXhwZWN0ZWQuc3RhcnRzV2l0aCgnY2hyb21lLWV4dGVuc2lvbjovLycpKSB7XG4gICAgY29uc3QgY2VVcmwgPSBuZXcgVVJMKGV4cGVjdGVkKTtcblxuICAgIGlmIChjZVVybC5ob3N0bmFtZSA9PT0gJycgJiYgaG9zdG5hbWUgPT09ICcnKSB7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gd2UncmUgbm90IHBhcnNpbmcgY2hyb21lIFVSTHMgcHJvcGVybHlcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHByb3RvY29sID09PSAnY2hyb21lLWV4dGVuc2lvbjonICYmXG4gICAgICAgIGV4cGVjdGVkLnJlcGxhY2UoJ2Nocm9tZS1leHRlbnNpb246Ly8nLCAnJykgPT09XG4gICAgICAgICAgY3VycmVudFVybC5yZXBsYWNlKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJywgJycpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBwcm90b2NvbCA9PT0gJ2Nocm9tZS1leHRlbnNpb246JyAmJiBjZVVybC5ob3N0bmFtZSA9PT0gaG9zdG5hbWU7XG4gIH1cblxuICBpZiAoIUhUVFBfUkVHRVgudGVzdChwcm90b2NvbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoSVBfQUREUkVTU19SRUdFWC50ZXN0KGV4cGVjdGVkKSkge1xuICAgIC8vIFRoZSBkb21haW4gaGFzIHRvIGJlIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHBhdHRlcm4sIGFzIGFuIElQIGRvbWFpbiB3aWxsXG4gICAgLy8gb25seSBjb250YWluIHRoZSBJUCwgbm8gZXh0cmEgY2hhcmFjdGVyLlxuICAgIHJldHVybiBob3N0bmFtZSA9PT0gZXhwZWN0ZWQ7XG4gIH1cblxuICAvLyBEb3RzIGluIHBhdHRlcm4gc2hvdWxkIGJlIGVzY2FwZWQuXG4gIGNvbnN0IGVzY2FwZWREb21haW5QYXR0ZXJuID0gZXhwZWN0ZWQucmVwbGFjZSgvXFwuL2csICdcXFxcLicpO1xuICAvLyBOb24gaXAgYWRkcmVzcyBkb21haW5zLlxuICAvLyBkb21haW4uY29tID0gKi5kb21haW4uY29tIE9SIGRvbWFpbi5jb21cbiAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKFxuICAgICdeKC4rXFxcXC4nICsgZXNjYXBlZERvbWFpblBhdHRlcm4gKyAnfCcgKyBlc2NhcGVkRG9tYWluUGF0dGVybiArICcpJCcsXG4gICAgJ2knXG4gICk7XG4gIHJldHVybiByZS50ZXN0KGhvc3RuYW1lKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9jcmVhdGVFcnJvciB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQgeyBfd2luZG93IH0gZnJvbSAnLi4vYXV0aF93aW5kb3cnO1xuaW1wb3J0ICogYXMganMgZnJvbSAnLi4vbG9hZF9qcyc7XG5cbmNvbnN0IE5FVFdPUktfVElNRU9VVCA9IG5ldyBEZWxheSgzMDAwMCwgNjAwMDApO1xuXG4vKipcbiAqIFJlc2V0IHVubGFvZGVkIEdBcGkgbW9kdWxlcy4gSWYgZ2FwaS5sb2FkIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgZXJyb3IsXG4gKiBpdCB3aWxsIHN0b3Agd29ya2luZyBhZnRlciBhIHJldHJpYWwuIFRoaXMgaXMgYSBoYWNrIHRvIGZpeCB0aGlzIGlzc3VlLlxuICovXG5mdW5jdGlvbiByZXNldFVubG9hZGVkR2FwaU1vZHVsZXMoKTogdm9pZCB7XG4gIC8vIENsZWFyIGxhc3QgZmFpbGVkIGdhcGkubG9hZCBzdGF0ZSB0byBmb3JjZSBuZXh0IGdhcGkubG9hZCB0byBmaXJzdFxuICAvLyBsb2FkIHRoZSBmYWlsZWQgZ2FwaS5pZnJhbWVzIG1vZHVsZS5cbiAgLy8gR2V0IGdhcGl4LmJlYWNvbiBjb250ZXh0LlxuICBjb25zdCBiZWFjb24gPSBfd2luZG93KCkuX19fanNsO1xuICAvLyBHZXQgY3VycmVudCBoaW50LlxuICBpZiAoYmVhY29uPy5IKSB7XG4gICAgLy8gR2V0IGdhcGkgaGludC5cbiAgICBmb3IgKGNvbnN0IGhpbnQgb2YgT2JqZWN0LmtleXMoYmVhY29uLkgpKSB7XG4gICAgICAvLyBSZXF1ZXN0ZWQgbW9kdWxlcy5cbiAgICAgIGJlYWNvbi5IW2hpbnRdLnIgPSBiZWFjb24uSFtoaW50XS5yIHx8IFtdO1xuICAgICAgLy8gTG9hZGVkIG1vZHVsZXMuXG4gICAgICBiZWFjb24uSFtoaW50XS5MID0gYmVhY29uLkhbaGludF0uTCB8fCBbXTtcbiAgICAgIC8vIFNldCByZXF1ZXN0ZWQgbW9kdWxlcyB0byBhIGNvcHkgb2YgdGhlIGxvYWRlZCBtb2R1bGVzLlxuICAgICAgYmVhY29uLkhbaGludF0uciA9IFsuLi5iZWFjb24uSFtoaW50XS5MXTtcbiAgICAgIC8vIENsZWFyIHBlbmRpbmcgY2FsbGJhY2tzLlxuICAgICAgaWYgKGJlYWNvbi5DUCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJlYWNvbi5DUC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIC8vIFJlbW92ZSBhbGwgZmFpbGVkIHBlbmRpbmcgY2FsbGJhY2tzLlxuICAgICAgICAgIGJlYWNvbi5DUFtpXSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gbG9hZEdhcGkoYXV0aDogQXV0aEludGVybmFsKTogUHJvbWlzZTxnYXBpLmlmcmFtZXMuQ29udGV4dD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8Z2FwaS5pZnJhbWVzLkNvbnRleHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAvLyBGdW5jdGlvbiB0byBydW4gd2hlbiBnYXBpLmxvYWQgaXMgcmVhZHkuXG4gICAgZnVuY3Rpb24gbG9hZEdhcGlJZnJhbWUoKTogdm9pZCB7XG4gICAgICAvLyBUaGUgZGV2ZWxvcGVyIG1heSBoYXZlIHRyaWVkIHRvIHByZXZpb3VzbHkgcnVuIGdhcGkubG9hZCBhbmQgZmFpbGVkLlxuICAgICAgLy8gUnVuIHRoaXMgdG8gZml4IHRoYXQuXG4gICAgICByZXNldFVubG9hZGVkR2FwaU1vZHVsZXMoKTtcbiAgICAgIGdhcGkubG9hZCgnZ2FwaS5pZnJhbWVzJywge1xuICAgICAgICBjYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoZ2FwaS5pZnJhbWVzLmdldENvbnRleHQoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9udGltZW91dDogKCkgPT4ge1xuICAgICAgICAgIC8vIFRoZSBhYm92ZSByZXNldCBtYXkgYmUgc3VmZmljaWVudCwgYnV0IGhhdmluZyB0aGlzIHJlc2V0IGFmdGVyXG4gICAgICAgICAgLy8gZmFpbHVyZSBlbnN1cmVzIHRoYXQgaWYgdGhlIGRldmVsb3BlciBjYWxscyBnYXBpLmxvYWQgYWZ0ZXIgdGhlXG4gICAgICAgICAgLy8gY29ubmVjdGlvbiBpcyByZS1lc3RhYmxpc2hlZCBhbmQgYmVmb3JlIGFub3RoZXIgYXR0ZW1wdCB0byBlbWJlZFxuICAgICAgICAgIC8vIHRoZSBpZnJhbWUsIGl0IHdvdWxkIHdvcmsgYW5kIHdvdWxkIG5vdCBiZSBicm9rZW4gYmVjYXVzZSBvZiBvdXJcbiAgICAgICAgICAvLyBmYWlsZWQgYXR0ZW1wdC5cbiAgICAgICAgICAvLyBUaW1lb3V0IHdoZW4gZ2FwaS5pZnJhbWVzLklmcmFtZSBub3QgbG9hZGVkLlxuICAgICAgICAgIHJlc2V0VW5sb2FkZWRHYXBpTW9kdWxlcygpO1xuICAgICAgICAgIHJlamVjdChfY3JlYXRlRXJyb3IoYXV0aCwgQXV0aEVycm9yQ29kZS5ORVRXT1JLX1JFUVVFU1RfRkFJTEVEKSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRpbWVvdXQ6IE5FVFdPUktfVElNRU9VVC5nZXQoKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKF93aW5kb3coKS5nYXBpPy5pZnJhbWVzPy5JZnJhbWUpIHtcbiAgICAgIC8vIElmIGdhcGkuaWZyYW1lcy5JZnJhbWUgYXZhaWxhYmxlLCByZXNvbHZlLlxuICAgICAgcmVzb2x2ZShnYXBpLmlmcmFtZXMuZ2V0Q29udGV4dCgpKTtcbiAgICB9IGVsc2UgaWYgKCEhX3dpbmRvdygpLmdhcGk/LmxvYWQpIHtcbiAgICAgIC8vIEdhcGkgbG9hZGVyIHJlYWR5LCBsb2FkIGdhcGkuaWZyYW1lcy5cbiAgICAgIGxvYWRHYXBpSWZyYW1lKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBpZnJhbWUgY2FsbGJhY2sgd2hlbiB0aGlzIGlzIGNhbGxlZCBzbyBhcyBub3QgdG8gb3ZlcndyaXRlXG4gICAgICAvLyBhbnkgcHJldmlvdXMgZGVmaW5lZCBjYWxsYmFjay4gVGhpcyBoYXBwZW5zIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZFxuICAgICAgLy8gbXVsdGlwbGUgdGltZXMgaW4gcGFyYWxsZWwgYW5kIGNvdWxkIHJlc3VsdCBpbiB0aGUgbGF0ZXIgY2FsbGJhY2tcbiAgICAgIC8vIG92ZXJ3cml0aW5nIHRoZSBwcmV2aW91cyBvbmUuIFRoaXMgd291bGQgZW5kIHVwIHdpdGggYSBpZnJhbWVcbiAgICAgIC8vIHRpbWVvdXQuXG4gICAgICBjb25zdCBjYk5hbWUgPSBqcy5fZ2VuZXJhdGVDYWxsYmFja05hbWUoJ2lmcmFtZWZjYicpO1xuICAgICAgLy8gR0FwaSBsb2FkZXIgbm90IGF2YWlsYWJsZSwgZHluYW1pY2FsbHkgbG9hZCBwbGF0Zm9ybS5qcy5cbiAgICAgIF93aW5kb3coKVtjYk5hbWVdID0gKCkgPT4ge1xuICAgICAgICAvLyBHQXBpIGxvYWRlciBzaG91bGQgYmUgcmVhZHkuXG4gICAgICAgIGlmICghIWdhcGkubG9hZCkge1xuICAgICAgICAgIGxvYWRHYXBpSWZyYW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gR2FwaSBsb2FkZXIgZmFpbGVkLCB0aHJvdyBlcnJvci5cbiAgICAgICAgICByZWplY3QoX2NyZWF0ZUVycm9yKGF1dGgsIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRCkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgLy8gTG9hZCBHQXBpIGxvYWRlci5cbiAgICAgIHJldHVybiBqc1xuICAgICAgICAuX2xvYWRKUyhgaHR0cHM6Ly9hcGlzLmdvb2dsZS5jb20vanMvYXBpLmpzP29ubG9hZD0ke2NiTmFtZX1gKVxuICAgICAgICAuY2F0Y2goZSA9PiByZWplY3QoZSkpO1xuICAgIH1cbiAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgIC8vIFJlc2V0IGNhY2hlZCBwcm9taXNlIHRvIGFsbG93IGZvciByZXRyaWFsLlxuICAgIGNhY2hlZEdBcGlMb2FkZXIgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbn1cblxubGV0IGNhY2hlZEdBcGlMb2FkZXI6IFByb21pc2U8Z2FwaS5pZnJhbWVzLkNvbnRleHQ+IHwgbnVsbCA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gX2xvYWRHYXBpKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8Z2FwaS5pZnJhbWVzLkNvbnRleHQ+IHtcbiAgY2FjaGVkR0FwaUxvYWRlciA9IGNhY2hlZEdBcGlMb2FkZXIgfHwgbG9hZEdhcGkoYXV0aCk7XG4gIHJldHVybiBjYWNoZWRHQXBpTG9hZGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0TG9hZGVyKCk6IHZvaWQge1xuICBjYWNoZWRHQXBpTG9hZGVyID0gbnVsbDtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IHF1ZXJ5c3RyaW5nIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgRGVmYXVsdENvbmZpZyB9IGZyb20gJy4uLy4uLy4uL2ludGVybmFsJztcblxuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uLy4uL2NvcmUvZXJyb3JzJztcbmltcG9ydCB7IF9hc3NlcnQsIF9jcmVhdGVFcnJvciB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgRGVsYXkgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWwvZGVsYXknO1xuaW1wb3J0IHsgX2VtdWxhdG9yVXJsIH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2VtdWxhdG9yJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgX3dpbmRvdyB9IGZyb20gJy4uL2F1dGhfd2luZG93JztcbmltcG9ydCAqIGFzIGdhcGlMb2FkZXIgZnJvbSAnLi9nYXBpJztcblxuY29uc3QgUElOR19USU1FT1VUID0gbmV3IERlbGF5KDUwMDAsIDE1MDAwKTtcbmNvbnN0IElGUkFNRV9QQVRIID0gJ19fL2F1dGgvaWZyYW1lJztcbmNvbnN0IEVNVUxBVEVEX0lGUkFNRV9QQVRIID0gJ2VtdWxhdG9yL2F1dGgvaWZyYW1lJztcblxuY29uc3QgSUZSQU1FX0FUVFJJQlVURVMgPSB7XG4gIHN0eWxlOiB7XG4gICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgdG9wOiAnLTEwMHB4JyxcbiAgICB3aWR0aDogJzFweCcsXG4gICAgaGVpZ2h0OiAnMXB4J1xuICB9LFxuICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gIHRhYmluZGV4OiAnLTEnXG59O1xuXG4vLyBNYXAgZnJvbSBhcGlIb3N0IHRvIGVuZHBvaW50IElEIGZvciBwYXNzaW5nIGludG8gaWZyYW1lLiBJbiBjdXJyZW50IFNESywgYXBpSG9zdCBjYW4gYmUgc2V0IHRvXG4vLyBhbnl0aGluZyAobm90IGZyb20gYSBsaXN0IG9mIGVuZHBvaW50cyB3aXRoIElEcyBhcyBpbiBsZWdhY3kpLCBzbyB0aGlzIGlzIHRoZSBjbG9zZXN0IHdlIGNhbiBnZXQuXG5jb25zdCBFSURfRlJPTV9BUElIT1NUID0gbmV3IE1hcChbXG4gIFtEZWZhdWx0Q29uZmlnLkFQSV9IT1NULCAncCddLCAvLyBwcm9kdWN0aW9uXG4gIFsnc3RhZ2luZy1pZGVudGl0eXRvb2xraXQuc2FuZGJveC5nb29nbGVhcGlzLmNvbScsICdzJ10sIC8vIHN0YWdpbmdcbiAgWyd0ZXN0LWlkZW50aXR5dG9vbGtpdC5zYW5kYm94Lmdvb2dsZWFwaXMuY29tJywgJ3QnXSAvLyB0ZXN0XG5dKTtcblxuZnVuY3Rpb24gZ2V0SWZyYW1lVXJsKGF1dGg6IEF1dGhJbnRlcm5hbCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbmZpZyA9IGF1dGguY29uZmlnO1xuICBfYXNzZXJ0KGNvbmZpZy5hdXRoRG9tYWluLCBhdXRoLCBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVVUSF9ET01BSU4pO1xuICBjb25zdCB1cmwgPSBjb25maWcuZW11bGF0b3JcbiAgICA/IF9lbXVsYXRvclVybChjb25maWcsIEVNVUxBVEVEX0lGUkFNRV9QQVRIKVxuICAgIDogYGh0dHBzOi8vJHthdXRoLmNvbmZpZy5hdXRoRG9tYWlufS8ke0lGUkFNRV9QQVRIfWA7XG5cbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcbiAgICBhcHBOYW1lOiBhdXRoLm5hbWUsXG4gICAgdjogU0RLX1ZFUlNJT05cbiAgfTtcbiAgY29uc3QgZWlkID0gRUlEX0ZST01fQVBJSE9TVC5nZXQoYXV0aC5jb25maWcuYXBpSG9zdCk7XG4gIGlmIChlaWQpIHtcbiAgICBwYXJhbXMuZWlkID0gZWlkO1xuICB9XG4gIGNvbnN0IGZyYW1ld29ya3MgPSBhdXRoLl9nZXRGcmFtZXdvcmtzKCk7XG4gIGlmIChmcmFtZXdvcmtzLmxlbmd0aCkge1xuICAgIHBhcmFtcy5mdyA9IGZyYW1ld29ya3Muam9pbignLCcpO1xuICB9XG4gIHJldHVybiBgJHt1cmx9PyR7cXVlcnlzdHJpbmcocGFyYW1zKS5zbGljZSgxKX1gO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gX29wZW5JZnJhbWUoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbFxuKTogUHJvbWlzZTxnYXBpLmlmcmFtZXMuSWZyYW1lPiB7XG4gIGNvbnN0IGNvbnRleHQgPSBhd2FpdCBnYXBpTG9hZGVyLl9sb2FkR2FwaShhdXRoKTtcbiAgY29uc3QgZ2FwaSA9IF93aW5kb3coKS5nYXBpO1xuICBfYXNzZXJ0KGdhcGksIGF1dGgsIEF1dGhFcnJvckNvZGUuSU5URVJOQUxfRVJST1IpO1xuICByZXR1cm4gY29udGV4dC5vcGVuKFxuICAgIHtcbiAgICAgIHdoZXJlOiBkb2N1bWVudC5ib2R5LFxuICAgICAgdXJsOiBnZXRJZnJhbWVVcmwoYXV0aCksXG4gICAgICBtZXNzYWdlSGFuZGxlcnNGaWx0ZXI6IGdhcGkuaWZyYW1lcy5DUk9TU19PUklHSU5fSUZSQU1FU19GSUxURVIsXG4gICAgICBhdHRyaWJ1dGVzOiBJRlJBTUVfQVRUUklCVVRFUyxcbiAgICAgIGRvbnRjbGVhcjogdHJ1ZVxuICAgIH0sXG4gICAgKGlmcmFtZTogZ2FwaS5pZnJhbWVzLklmcmFtZSkgPT5cbiAgICAgIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgYXdhaXQgaWZyYW1lLnJlc3R5bGUoe1xuICAgICAgICAgIC8vIFByZXZlbnQgaWZyYW1lIGZyb20gY2xvc2luZyBvbiBtb3VzZSBvdXQuXG4gICAgICAgICAgc2V0SGlkZU9uTGVhdmU6IGZhbHNlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG5ldHdvcmtFcnJvciA9IF9jcmVhdGVFcnJvcihcbiAgICAgICAgICBhdXRoLFxuICAgICAgICAgIEF1dGhFcnJvckNvZGUuTkVUV09SS19SRVFVRVNUX0ZBSUxFRFxuICAgICAgICApO1xuICAgICAgICAvLyBDb25maXJtIGlmcmFtZSBpcyBjb3JyZWN0bHkgbG9hZGVkLlxuICAgICAgICAvLyBUbyBmYWxsYmFjayBvbiBmYWlsdXJlLCBzZXQgYSB0aW1lb3V0LlxuICAgICAgICBjb25zdCBuZXR3b3JrRXJyb3JUaW1lciA9IF93aW5kb3coKS5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZWplY3QobmV0d29ya0Vycm9yKTtcbiAgICAgICAgfSwgUElOR19USU1FT1VULmdldCgpKTtcbiAgICAgICAgLy8gQ2xlYXIgdGltZXIgYW5kIHJlc29sdmUgcGVuZGluZyBpZnJhbWUgcmVhZHkgcHJvbWlzZS5cbiAgICAgICAgZnVuY3Rpb24gY2xlYXJUaW1lckFuZFJlc29sdmUoKTogdm9pZCB7XG4gICAgICAgICAgX3dpbmRvdygpLmNsZWFyVGltZW91dChuZXR3b3JrRXJyb3JUaW1lcik7XG4gICAgICAgICAgcmVzb2x2ZShpZnJhbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRoaXMgcmV0dXJucyBhbiBJVGhlbmFibGUuIEhvd2V2ZXIgdGhlIHJlamVjdCBwYXJ0IGRvZXMgbm90IGNhbGxcbiAgICAgICAgLy8gd2hlbiB0aGUgaWZyYW1lIGlzIG5vdCBsb2FkZWQuXG4gICAgICAgIGlmcmFtZS5waW5nKGNsZWFyVGltZXJBbmRSZXNvbHZlKS50aGVuKGNsZWFyVGltZXJBbmRSZXNvbHZlLCAoKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KG5ldHdvcmtFcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgKTtcbn1cbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZ2V0VUEgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQge1xuICBfaXNDaHJvbWVJT1MsXG4gIF9pc0ZpcmVmb3gsXG4gIF9pc0lPU1N0YW5kYWxvbmVcbn0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vLi4vbW9kZWwvYXV0aCc7XG5cbmNvbnN0IEJBU0VfUE9QVVBfT1BUSU9OUyA9IHtcbiAgbG9jYXRpb246ICd5ZXMnLFxuICByZXNpemFibGU6ICd5ZXMnLFxuICBzdGF0dXNiYXI6ICd5ZXMnLFxuICB0b29sYmFyOiAnbm8nXG59O1xuXG5jb25zdCBERUZBVUxUX1dJRFRIID0gNTAwO1xuY29uc3QgREVGQVVMVF9IRUlHSFQgPSA2MDA7XG5jb25zdCBUQVJHRVRfQkxBTksgPSAnX2JsYW5rJztcblxuY29uc3QgRklSRUZPWF9FTVBUWV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdCc7XG5cbmV4cG9ydCBjbGFzcyBBdXRoUG9wdXAge1xuICBhc3NvY2lhdGVkRXZlbnQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHdpbmRvdzogV2luZG93IHwgbnVsbCkge31cblxuICBjbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy53aW5kb3cpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMud2luZG93LmNsb3NlKCk7XG4gICAgICB9IGNhdGNoIChlKSB7fVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gX29wZW4oXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgdXJsPzogc3RyaW5nLFxuICBuYW1lPzogc3RyaW5nLFxuICB3aWR0aCA9IERFRkFVTFRfV0lEVEgsXG4gIGhlaWdodCA9IERFRkFVTFRfSEVJR0hUXG4pOiBBdXRoUG9wdXAge1xuICBjb25zdCB0b3AgPSBNYXRoLm1heCgod2luZG93LnNjcmVlbi5hdmFpbEhlaWdodCAtIGhlaWdodCkgLyAyLCAwKS50b1N0cmluZygpO1xuICBjb25zdCBsZWZ0ID0gTWF0aC5tYXgoKHdpbmRvdy5zY3JlZW4uYXZhaWxXaWR0aCAtIHdpZHRoKSAvIDIsIDApLnRvU3RyaW5nKCk7XG4gIGxldCB0YXJnZXQgPSAnJztcblxuICBjb25zdCBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIC4uLkJBU0VfUE9QVVBfT1BUSU9OUyxcbiAgICB3aWR0aDogd2lkdGgudG9TdHJpbmcoKSxcbiAgICBoZWlnaHQ6IGhlaWdodC50b1N0cmluZygpLFxuICAgIHRvcCxcbiAgICBsZWZ0XG4gIH07XG5cbiAgLy8gQ2hyb21lIGlPUyA3IGFuZCA4IGlzIHJldHVybmluZyBhbiB1bmRlZmluZWQgcG9wdXAgd2luIHdoZW4gdGFyZ2V0IGlzXG4gIC8vIHNwZWNpZmllZCwgZXZlbiB0aG91Z2ggdGhlIHBvcHVwIGlzIG5vdCBuZWNlc3NhcmlseSBibG9ja2VkLlxuICBjb25zdCB1YSA9IGdldFVBKCkudG9Mb3dlckNhc2UoKTtcblxuICBpZiAobmFtZSkge1xuICAgIHRhcmdldCA9IF9pc0Nocm9tZUlPUyh1YSkgPyBUQVJHRVRfQkxBTksgOiBuYW1lO1xuICB9XG5cbiAgaWYgKF9pc0ZpcmVmb3godWEpKSB7XG4gICAgLy8gRmlyZWZveCBjb21wbGFpbnMgd2hlbiBpbnZhbGlkIFVSTHMgYXJlIHBvcHBlZCBvdXQuIEhhY2t5IHdheSB0byBieXBhc3MuXG4gICAgdXJsID0gdXJsIHx8IEZJUkVGT1hfRU1QVFlfVVJMO1xuICAgIC8vIEZpcmVmb3ggZGlzYWJsZXMgYnkgZGVmYXVsdCBzY3JvbGxpbmcgb24gcG9wdXAgd2luZG93cywgd2hpY2ggY2FuIGNyZWF0ZVxuICAgIC8vIGlzc3VlcyB3aGVuIHRoZSB1c2VyIGhhcyBtYW55IEdvb2dsZSBhY2NvdW50cywgZm9yIGluc3RhbmNlLlxuICAgIG9wdGlvbnMuc2Nyb2xsYmFycyA9ICd5ZXMnO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9uc1N0cmluZyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpLnJlZHVjZShcbiAgICAoYWNjdW0sIFtrZXksIHZhbHVlXSkgPT4gYCR7YWNjdW19JHtrZXl9PSR7dmFsdWV9LGAsXG4gICAgJydcbiAgKTtcblxuICBpZiAoX2lzSU9TU3RhbmRhbG9uZSh1YSkgJiYgdGFyZ2V0ICE9PSAnX3NlbGYnKSB7XG4gICAgb3BlbkFzTmV3V2luZG93SU9TKHVybCB8fCAnJywgdGFyZ2V0KTtcbiAgICByZXR1cm4gbmV3IEF1dGhQb3B1cChudWxsKTtcbiAgfVxuXG4gIC8vIGFib3V0OmJsYW5rIGdldHRpbmcgc2FuaXRpemVkIGNhdXNpbmcgYnJvd3NlcnMgbGlrZSBJRS9FZGdlIHRvIGRpc3BsYXlcbiAgLy8gYnJpZWYgZXJyb3IgbWVzc2FnZSBiZWZvcmUgcmVkaXJlY3RpbmcgdG8gaGFuZGxlci5cbiAgY29uc3QgbmV3V2luID0gd2luZG93Lm9wZW4odXJsIHx8ICcnLCB0YXJnZXQsIG9wdGlvbnNTdHJpbmcpO1xuICBfYXNzZXJ0KG5ld1dpbiwgYXV0aCwgQXV0aEVycm9yQ29kZS5QT1BVUF9CTE9DS0VEKTtcblxuICAvLyBGbGFreSBvbiBJRSBlZGdlLCBlbmNhcHN1bGF0ZSB3aXRoIGEgdHJ5IGFuZCBjYXRjaC5cbiAgdHJ5IHtcbiAgICBuZXdXaW4uZm9jdXMoKTtcbiAgfSBjYXRjaCAoZSkge31cblxuICByZXR1cm4gbmV3IEF1dGhQb3B1cChuZXdXaW4pO1xufVxuXG5mdW5jdGlvbiBvcGVuQXNOZXdXaW5kb3dJT1ModXJsOiBzdHJpbmcsIHRhcmdldDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICBlbC5ocmVmID0gdXJsO1xuICBlbC50YXJnZXQgPSB0YXJnZXQ7XG4gIGNvbnN0IGNsaWNrID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ01vdXNlRXZlbnQnKTtcbiAgY2xpY2suaW5pdE1vdXNlRXZlbnQoXG4gICAgJ2NsaWNrJyxcbiAgICB0cnVlLFxuICAgIHRydWUsXG4gICAgd2luZG93LFxuICAgIDEsXG4gICAgMCxcbiAgICAwLFxuICAgIDAsXG4gICAgMCxcbiAgICBmYWxzZSxcbiAgICBmYWxzZSxcbiAgICBmYWxzZSxcbiAgICBmYWxzZSxcbiAgICAxLFxuICAgIG51bGxcbiAgKTtcbiAgZWwuZGlzcGF0Y2hFdmVudChjbGljayk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IEF1dGhQcm92aWRlciB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBBcGlLZXksIEFwcE5hbWUsIEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgQXV0aEV2ZW50VHlwZSB9IGZyb20gJy4uLy4uL21vZGVsL3BvcHVwX3JlZGlyZWN0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4vYXNzZXJ0JztcbmltcG9ydCB7IGlzRW1wdHksIHF1ZXJ5c3RyaW5nIH0gZnJvbSAnQGZpcmViYXNlL3V0aWwnO1xuaW1wb3J0IHsgX2VtdWxhdG9yVXJsIH0gZnJvbSAnLi9lbXVsYXRvcic7XG5pbXBvcnQgeyBGZWRlcmF0ZWRBdXRoUHJvdmlkZXIgfSBmcm9tICcuLi9wcm92aWRlcnMvZmVkZXJhdGVkJztcbmltcG9ydCB7IEJhc2VPQXV0aFByb3ZpZGVyIH0gZnJvbSAnLi4vcHJvdmlkZXJzL29hdXRoJztcblxuLyoqXG4gKiBVUkwgZm9yIEF1dGhlbnRpY2F0aW9uIHdpZGdldCB3aGljaCB3aWxsIGluaXRpYXRlIHRoZSBPQXV0aCBoYW5kc2hha2VcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgV0lER0VUX1BBVEggPSAnX18vYXV0aC9oYW5kbGVyJztcblxuLyoqXG4gKiBVUkwgZm9yIGVtdWxhdGVkIGVudmlyb25tZW50XG4gKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IEVNVUxBVE9SX1dJREdFVF9QQVRIID0gJ2VtdWxhdG9yL2F1dGgvaGFuZGxlcic7XG5cbi8qKlxuICogRnJhZ21lbnQgbmFtZSBmb3IgdGhlIEFwcCBDaGVjayB0b2tlbiB0aGF0IGdldHMgcGFzc2VkIHRvIHRoZSB3aWRnZXRcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgRklSRUJBU0VfQVBQX0NIRUNLX0ZSQUdNRU5UX0lEID0gZW5jb2RlVVJJQ29tcG9uZW50KCdmYWMnKTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jb25zaXN0ZW50LXR5cGUtZGVmaW5pdGlvbnNcbnR5cGUgV2lkZ2V0UGFyYW1zID0ge1xuICBhcGlLZXk6IEFwaUtleTtcbiAgYXBwTmFtZTogQXBwTmFtZTtcbiAgYXV0aFR5cGU6IEF1dGhFdmVudFR5cGU7XG4gIHJlZGlyZWN0VXJsPzogc3RyaW5nO1xuICB2OiBzdHJpbmc7XG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG4gIHNjb3Blcz86IHN0cmluZztcbiAgY3VzdG9tUGFyYW1ldGVycz86IHN0cmluZztcbiAgZXZlbnRJZD86IHN0cmluZztcbiAgdGlkPzogc3RyaW5nO1xufSAmIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfZ2V0UmVkaXJlY3RVcmwoXG4gIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgcHJvdmlkZXI6IEF1dGhQcm92aWRlcixcbiAgYXV0aFR5cGU6IEF1dGhFdmVudFR5cGUsXG4gIHJlZGlyZWN0VXJsPzogc3RyaW5nLFxuICBldmVudElkPzogc3RyaW5nLFxuICBhZGRpdGlvbmFsUGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgX2Fzc2VydChhdXRoLmNvbmZpZy5hdXRoRG9tYWluLCBhdXRoLCBBdXRoRXJyb3JDb2RlLk1JU1NJTkdfQVVUSF9ET01BSU4pO1xuICBfYXNzZXJ0KGF1dGguY29uZmlnLmFwaUtleSwgYXV0aCwgQXV0aEVycm9yQ29kZS5JTlZBTElEX0FQSV9LRVkpO1xuXG4gIGNvbnN0IHBhcmFtczogV2lkZ2V0UGFyYW1zID0ge1xuICAgIGFwaUtleTogYXV0aC5jb25maWcuYXBpS2V5LFxuICAgIGFwcE5hbWU6IGF1dGgubmFtZSxcbiAgICBhdXRoVHlwZSxcbiAgICByZWRpcmVjdFVybCxcbiAgICB2OiBTREtfVkVSU0lPTixcbiAgICBldmVudElkXG4gIH07XG5cbiAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgRmVkZXJhdGVkQXV0aFByb3ZpZGVyKSB7XG4gICAgcHJvdmlkZXIuc2V0RGVmYXVsdExhbmd1YWdlKGF1dGgubGFuZ3VhZ2VDb2RlKTtcbiAgICBwYXJhbXMucHJvdmlkZXJJZCA9IHByb3ZpZGVyLnByb3ZpZGVySWQgfHwgJyc7XG4gICAgaWYgKCFpc0VtcHR5KHByb3ZpZGVyLmdldEN1c3RvbVBhcmFtZXRlcnMoKSkpIHtcbiAgICAgIHBhcmFtcy5jdXN0b21QYXJhbWV0ZXJzID0gSlNPTi5zdHJpbmdpZnkocHJvdmlkZXIuZ2V0Q3VzdG9tUGFyYW1ldGVycygpKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPIHNldCBhZGRpdGlvbmFsUGFyYW1zIGZyb20gdGhlIHByb3ZpZGVyIGFzIHdlbGw/XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYWRkaXRpb25hbFBhcmFtcyB8fCB7fSkpIHtcbiAgICAgIHBhcmFtc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgQmFzZU9BdXRoUHJvdmlkZXIpIHtcbiAgICBjb25zdCBzY29wZXMgPSBwcm92aWRlci5nZXRTY29wZXMoKS5maWx0ZXIoc2NvcGUgPT4gc2NvcGUgIT09ICcnKTtcbiAgICBpZiAoc2NvcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtcy5zY29wZXMgPSBzY29wZXMuam9pbignLCcpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChhdXRoLnRlbmFudElkKSB7XG4gICAgcGFyYW1zLnRpZCA9IGF1dGgudGVuYW50SWQ7XG4gIH1cblxuICAvLyBUT0RPOiBtYXliZSBzZXQgZWlkIGFzIGVuZGlwb2ludElkXG4gIC8vIFRPRE86IG1heWJlIHNldCBmdyBhcyBGcmFtZXdvcmtzLmpvaW4oXCIsXCIpXG5cbiAgY29uc3QgcGFyYW1zRGljdCA9IHBhcmFtcyBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhwYXJhbXNEaWN0KSkge1xuICAgIGlmIChwYXJhbXNEaWN0W2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgZGVsZXRlIHBhcmFtc0RpY3Rba2V5XTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXRzIHRoZSBBcHAgQ2hlY2sgdG9rZW4gdG8gcGFzcyB0byB0aGUgd2lkZ2V0XG4gIGNvbnN0IGFwcENoZWNrVG9rZW4gPSBhd2FpdCBhdXRoLl9nZXRBcHBDaGVja1Rva2VuKCk7XG4gIGNvbnN0IGFwcENoZWNrVG9rZW5GcmFnbWVudCA9IGFwcENoZWNrVG9rZW5cbiAgICA/IGAjJHtGSVJFQkFTRV9BUFBfQ0hFQ0tfRlJBR01FTlRfSUR9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGFwcENoZWNrVG9rZW4pfWBcbiAgICA6ICcnO1xuXG4gIC8vIFN0YXJ0IGF0IGluZGV4IDEgdG8gc2tpcCB0aGUgbGVhZGluZyAnJicgaW4gdGhlIHF1ZXJ5IHN0cmluZ1xuICByZXR1cm4gYCR7Z2V0SGFuZGxlckJhc2UoYXV0aCl9PyR7cXVlcnlzdHJpbmcocGFyYW1zRGljdCkuc2xpY2UoXG4gICAgMVxuICApfSR7YXBwQ2hlY2tUb2tlbkZyYWdtZW50fWA7XG59XG5cbmZ1bmN0aW9uIGdldEhhbmRsZXJCYXNlKHsgY29uZmlnIH06IEF1dGhJbnRlcm5hbCk6IHN0cmluZyB7XG4gIGlmICghY29uZmlnLmVtdWxhdG9yKSB7XG4gICAgcmV0dXJuIGBodHRwczovLyR7Y29uZmlnLmF1dGhEb21haW59LyR7V0lER0VUX1BBVEh9YDtcbiAgfVxuXG4gIHJldHVybiBfZW11bGF0b3JVcmwoY29uZmlnLCBFTVVMQVRPUl9XSURHRVRfUEFUSCk7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgQXV0aFByb3ZpZGVyLCBQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgfSBmcm9tICcuLi9tb2RlbC9wdWJsaWNfdHlwZXMnO1xuXG5pbXBvcnQgeyBBdXRoRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS9hdXRoL2F1dGhfZXZlbnRfbWFuYWdlcic7XG5pbXBvcnQgeyBBdXRoRXJyb3JDb2RlIH0gZnJvbSAnLi4vY29yZS9lcnJvcnMnO1xuaW1wb3J0IHsgX2Fzc2VydCwgZGVidWdBc3NlcnQsIF9mYWlsIH0gZnJvbSAnLi4vY29yZS91dGlsL2Fzc2VydCc7XG5pbXBvcnQgeyBfZ2VuZXJhdGVFdmVudElkIH0gZnJvbSAnLi4vY29yZS91dGlsL2V2ZW50X2lkJztcbmltcG9ydCB7IF9nZXRDdXJyZW50VXJsIH0gZnJvbSAnLi4vY29yZS91dGlsL2xvY2F0aW9uJztcbmltcG9ydCB7IF92YWxpZGF0ZU9yaWdpbiB9IGZyb20gJy4uL2NvcmUvdXRpbC92YWxpZGF0ZV9vcmlnaW4nO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5pbXBvcnQge1xuICBBdXRoRXZlbnRUeXBlLFxuICBFdmVudE1hbmFnZXIsXG4gIEdhcGlBdXRoRXZlbnQsXG4gIEdhcGlPdXRjb21lLFxuICBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbFxufSBmcm9tICcuLi9tb2RlbC9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBfc2V0V2luZG93TG9jYXRpb24gfSBmcm9tICcuL2F1dGhfd2luZG93JztcbmltcG9ydCB7IF9vcGVuSWZyYW1lIH0gZnJvbSAnLi9pZnJhbWUvaWZyYW1lJztcbmltcG9ydCB7IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UgfSBmcm9tICcuL3BlcnNpc3RlbmNlL3Nlc3Npb25fc3RvcmFnZSc7XG5pbXBvcnQgeyBfb3BlbiwgQXV0aFBvcHVwIH0gZnJvbSAnLi91dGlsL3BvcHVwJztcbmltcG9ydCB7IF9nZXRSZWRpcmVjdFJlc3VsdCB9IGZyb20gJy4vc3RyYXRlZ2llcy9yZWRpcmVjdCc7XG5pbXBvcnQgeyBfZ2V0UmVkaXJlY3RVcmwgfSBmcm9tICcuLi9jb3JlL3V0aWwvaGFuZGxlcic7XG5pbXBvcnQgeyBfaXNJT1MsIF9pc01vYmlsZUJyb3dzZXIsIF9pc1NhZmFyaSB9IGZyb20gJy4uL2NvcmUvdXRpbC9icm93c2VyJztcbmltcG9ydCB7IF9vdmVycmlkZVJlZGlyZWN0UmVzdWx0IH0gZnJvbSAnLi4vY29yZS9zdHJhdGVnaWVzL3JlZGlyZWN0JztcblxuLyoqXG4gKiBUaGUgc3BlY2lhbCB3ZWIgc3RvcmFnZSBldmVudFxuICpcbiAqL1xuY29uc3QgV0VCX1NUT1JBR0VfU1VQUE9SVF9LRVkgPSAnd2ViU3RvcmFnZVN1cHBvcnQnO1xuXG5pbnRlcmZhY2UgV2ViU3RvcmFnZVN1cHBvcnRNZXNzYWdlIGV4dGVuZHMgZ2FwaS5pZnJhbWVzLk1lc3NhZ2Uge1xuICBbaW5kZXg6IG51bWJlcl06IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xufVxuXG5pbnRlcmZhY2UgTWFuYWdlck9yUHJvbWlzZSB7XG4gIG1hbmFnZXI/OiBFdmVudE1hbmFnZXI7XG4gIHByb21pc2U/OiBQcm9taXNlPEV2ZW50TWFuYWdlcj47XG59XG5cbmNsYXNzIEJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIgaW1wbGVtZW50cyBQb3B1cFJlZGlyZWN0UmVzb2x2ZXJJbnRlcm5hbCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRNYW5hZ2VyczogUmVjb3JkPHN0cmluZywgTWFuYWdlck9yUHJvbWlzZT4gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBpZnJhbWVzOiBSZWNvcmQ8c3RyaW5nLCBnYXBpLmlmcmFtZXMuSWZyYW1lPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IG9yaWdpblZhbGlkYXRpb25Qcm9taXNlczogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx2b2lkPj4gPSB7fTtcblxuICByZWFkb25seSBfcmVkaXJlY3RQZXJzaXN0ZW5jZSA9IGJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2U7XG5cbiAgLy8gV3JhcHBpbmcgaW4gYXN5bmMgZXZlbiB0aG91Z2ggd2UgZG9uJ3QgYXdhaXQgYW55d2hlcmUgaW4gb3JkZXJcbiAgLy8gdG8gbWFrZSBzdXJlIGVycm9ycyBhcmUgcmFpc2VkIGFzIHByb21pc2UgcmVqZWN0aW9uc1xuICBhc3luYyBfb3BlblBvcHVwKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICAgIGF1dGhUeXBlOiBBdXRoRXZlbnRUeXBlLFxuICAgIGV2ZW50SWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxBdXRoUG9wdXA+IHtcbiAgICBkZWJ1Z0Fzc2VydChcbiAgICAgIHRoaXMuZXZlbnRNYW5hZ2Vyc1thdXRoLl9rZXkoKV0/Lm1hbmFnZXIsXG4gICAgICAnX2luaXRpYWxpemUoKSBub3QgY2FsbGVkIGJlZm9yZSBfb3BlblBvcHVwKCknXG4gICAgKTtcblxuICAgIGNvbnN0IHVybCA9IGF3YWl0IF9nZXRSZWRpcmVjdFVybChcbiAgICAgIGF1dGgsXG4gICAgICBwcm92aWRlcixcbiAgICAgIGF1dGhUeXBlLFxuICAgICAgX2dldEN1cnJlbnRVcmwoKSxcbiAgICAgIGV2ZW50SWRcbiAgICApO1xuICAgIHJldHVybiBfb3BlbihhdXRoLCB1cmwsIF9nZW5lcmF0ZUV2ZW50SWQoKSk7XG4gIH1cblxuICBhc3luYyBfb3BlblJlZGlyZWN0KFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBwcm92aWRlcjogQXV0aFByb3ZpZGVyLFxuICAgIGF1dGhUeXBlOiBBdXRoRXZlbnRUeXBlLFxuICAgIGV2ZW50SWQ/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxuZXZlcj4ge1xuICAgIGF3YWl0IHRoaXMuX29yaWdpblZhbGlkYXRpb24oYXV0aCk7XG4gICAgY29uc3QgdXJsID0gYXdhaXQgX2dldFJlZGlyZWN0VXJsKFxuICAgICAgYXV0aCxcbiAgICAgIHByb3ZpZGVyLFxuICAgICAgYXV0aFR5cGUsXG4gICAgICBfZ2V0Q3VycmVudFVybCgpLFxuICAgICAgZXZlbnRJZFxuICAgICk7XG4gICAgX3NldFdpbmRvd0xvY2F0aW9uKHVybCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCgpID0+IHt9KTtcbiAgfVxuXG4gIF9pbml0aWFsaXplKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8RXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3Qga2V5ID0gYXV0aC5fa2V5KCk7XG4gICAgaWYgKHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldKSB7XG4gICAgICBjb25zdCB7IG1hbmFnZXIsIHByb21pc2UgfSA9IHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldO1xuICAgICAgaWYgKG1hbmFnZXIpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYW5hZ2VyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnQXNzZXJ0KHByb21pc2UsICdJZiBtYW5hZ2VyIGlzIG5vdCBzZXQsIHByb21pc2Ugc2hvdWxkIGJlJyk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLmluaXRBbmRHZXRNYW5hZ2VyKGF1dGgpO1xuICAgIHRoaXMuZXZlbnRNYW5hZ2Vyc1trZXldID0geyBwcm9taXNlIH07XG5cbiAgICAvLyBJZiB0aGUgcHJvbWlzZSBpcyByZWplY3RlZCwgdGhlIGtleSBzaG91bGQgYmUgcmVtb3ZlZCBzbyB0aGF0IHRoZVxuICAgIC8vIG9wZXJhdGlvbiBjYW4gYmUgcmV0cmllZCBsYXRlci5cbiAgICBwcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50TWFuYWdlcnNba2V5XTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0QW5kR2V0TWFuYWdlcihhdXRoOiBBdXRoSW50ZXJuYWwpOiBQcm9taXNlPEV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IGlmcmFtZSA9IGF3YWl0IF9vcGVuSWZyYW1lKGF1dGgpO1xuICAgIGNvbnN0IG1hbmFnZXIgPSBuZXcgQXV0aEV2ZW50TWFuYWdlcihhdXRoKTtcbiAgICBpZnJhbWUucmVnaXN0ZXI8R2FwaUF1dGhFdmVudD4oXG4gICAgICAnYXV0aEV2ZW50JyxcbiAgICAgIChpZnJhbWVFdmVudDogR2FwaUF1dGhFdmVudCB8IG51bGwpID0+IHtcbiAgICAgICAgX2Fzc2VydChpZnJhbWVFdmVudD8uYXV0aEV2ZW50LCBhdXRoLCBBdXRoRXJyb3JDb2RlLklOVkFMSURfQVVUSF9FVkVOVCk7XG4gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIHNwbGl0dGluZyByZWRpcmVjdCBhbmQgcG9wdXAgZXZlbnRzIGVhcmxpZXIgb25cblxuICAgICAgICBjb25zdCBoYW5kbGVkID0gbWFuYWdlci5vbkV2ZW50KGlmcmFtZUV2ZW50LmF1dGhFdmVudCk7XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogaGFuZGxlZCA/IEdhcGlPdXRjb21lLkFDSyA6IEdhcGlPdXRjb21lLkVSUk9SIH07XG4gICAgICB9LFxuICAgICAgZ2FwaS5pZnJhbWVzLkNST1NTX09SSUdJTl9JRlJBTUVTX0ZJTFRFUlxuICAgICk7XG5cbiAgICB0aGlzLmV2ZW50TWFuYWdlcnNbYXV0aC5fa2V5KCldID0geyBtYW5hZ2VyIH07XG4gICAgdGhpcy5pZnJhbWVzW2F1dGguX2tleSgpXSA9IGlmcmFtZTtcbiAgICByZXR1cm4gbWFuYWdlcjtcbiAgfVxuXG4gIF9pc0lmcmFtZVdlYlN0b3JhZ2VTdXBwb3J0ZWQoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGNiOiAoc3VwcG9ydGVkOiBib29sZWFuKSA9PiB1bmtub3duXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuaWZyYW1lc1thdXRoLl9rZXkoKV07XG4gICAgaWZyYW1lLnNlbmQ8Z2FwaS5pZnJhbWVzLk1lc3NhZ2UsIFdlYlN0b3JhZ2VTdXBwb3J0TWVzc2FnZT4oXG4gICAgICBXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSxcbiAgICAgIHsgdHlwZTogV0VCX1NUT1JBR0VfU1VQUE9SVF9LRVkgfSxcbiAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgIGNvbnN0IGlzU3VwcG9ydGVkID0gcmVzdWx0Py5bMF0/LltXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWV07XG4gICAgICAgIGlmIChpc1N1cHBvcnRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2IoISFpc1N1cHBvcnRlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBfZmFpbChhdXRoLCBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SKTtcbiAgICAgIH0sXG4gICAgICBnYXBpLmlmcmFtZXMuQ1JPU1NfT1JJR0lOX0lGUkFNRVNfRklMVEVSXG4gICAgKTtcbiAgfVxuXG4gIF9vcmlnaW5WYWxpZGF0aW9uKGF1dGg6IEF1dGhJbnRlcm5hbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGtleSA9IGF1dGguX2tleSgpO1xuICAgIGlmICghdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XSkge1xuICAgICAgdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XSA9IF92YWxpZGF0ZU9yaWdpbihhdXRoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vcmlnaW5WYWxpZGF0aW9uUHJvbWlzZXNba2V5XTtcbiAgfVxuXG4gIGdldCBfc2hvdWxkSW5pdFByb2FjdGl2ZWx5KCk6IGJvb2xlYW4ge1xuICAgIC8vIE1vYmlsZSBicm93c2VycyBhbmQgU2FmYXJpIG5lZWQgdG8gb3B0aW1pc3RpY2FsbHkgaW5pdGlhbGl6ZVxuICAgIHJldHVybiBfaXNNb2JpbGVCcm93c2VyKCkgfHwgX2lzU2FmYXJpKCkgfHwgX2lzSU9TKCk7XG4gIH1cblxuICBfY29tcGxldGVSZWRpcmVjdEZuID0gX2dldFJlZGlyZWN0UmVzdWx0O1xuXG4gIF9vdmVycmlkZVJlZGlyZWN0UmVzdWx0ID0gX292ZXJyaWRlUmVkaXJlY3RSZXN1bHQ7XG59XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFBvcHVwUmVkaXJlY3RSZXNvbHZlcn0gc3VpdGFibGUgZm9yIGJyb3dzZXJcbiAqIGJhc2VkIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBAcmVtYXJrc1xuICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgYnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlcjogUG9wdXBSZWRpcmVjdFJlc29sdmVyID1cbiAgQnJvd3NlclBvcHVwUmVkaXJlY3RSZXNvbHZlcjtcbiIsICIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgRmFjdG9ySWQsIE11bHRpRmFjdG9yQXNzZXJ0aW9uIH0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IGRlYnVnRmFpbCB9IGZyb20gJy4uL2NvcmUvdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCwgTXVsdGlGYWN0b3JTZXNzaW9uVHlwZSB9IGZyb20gJy4vbWZhX3Nlc3Npb24nO1xuaW1wb3J0IHsgRmluYWxpemVNZmFSZXNwb25zZSB9IGZyb20gJy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgQXV0aEludGVybmFsIH0gZnJvbSAnLi4vbW9kZWwvYXV0aCc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGwgaW1wbGVtZW50cyBNdWx0aUZhY3RvckFzc2VydGlvbiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihyZWFkb25seSBmYWN0b3JJZDogRmFjdG9ySWQpIHt9XG5cbiAgX3Byb2Nlc3MoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIHNlc3Npb246IE11bHRpRmFjdG9yU2Vzc2lvbkltcGwsXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsXG4gICk6IFByb21pc2U8RmluYWxpemVNZmFSZXNwb25zZT4ge1xuICAgIHN3aXRjaCAoc2Vzc2lvbi50eXBlKSB7XG4gICAgICBjYXNlIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuRU5ST0xMOlxuICAgICAgICByZXR1cm4gdGhpcy5fZmluYWxpemVFbnJvbGwoYXV0aCwgc2Vzc2lvbi5jcmVkZW50aWFsLCBkaXNwbGF5TmFtZSk7XG4gICAgICBjYXNlIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUuU0lHTl9JTjpcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbmFsaXplU2lnbkluKGF1dGgsIHNlc3Npb24uY3JlZGVudGlhbCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZGVidWdGYWlsKCd1bmV4cGVjdGVkIE11bHRpRmFjdG9yU2Vzc2lvblR5cGUnKTtcbiAgICB9XG4gIH1cblxuICBhYnN0cmFjdCBfZmluYWxpemVFbnJvbGwoXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICBkaXNwbGF5TmFtZT86IHN0cmluZyB8IG51bGxcbiAgKTogUHJvbWlzZTxGaW5hbGl6ZU1mYVJlc3BvbnNlPjtcbiAgYWJzdHJhY3QgX2ZpbmFsaXplU2lnbkluKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBtZmFQZW5kaW5nQ3JlZGVudGlhbDogc3RyaW5nXG4gICk6IFByb21pc2U8RmluYWxpemVNZmFSZXNwb25zZT47XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIEZhY3RvcklkLFxuICBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uXG59IGZyb20gJy4uLy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5cbmltcG9ydCB7IE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB9IGZyb20gJy4uLy4uLy4uL21mYS9tZmFfYXNzZXJ0aW9uJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHsgZmluYWxpemVFbnJvbGxQaG9uZU1mYSB9IGZyb20gJy4uLy4uLy4uL2FwaS9hY2NvdW50X21hbmFnZW1lbnQvbWZhJztcbmltcG9ydCB7IFBob25lQXV0aENyZWRlbnRpYWwgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NyZWRlbnRpYWxzL3Bob25lJztcbmltcG9ydCB7XG4gIGZpbmFsaXplU2lnbkluUGhvbmVNZmEsXG4gIEZpbmFsaXplTWZhUmVzcG9uc2Vcbn0gZnJvbSAnLi4vLi4vLi4vYXBpL2F1dGhlbnRpY2F0aW9uL21mYSc7XG5cbi8qKlxuICoge0Bpbmhlcml0ZG9jIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb259XG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgZXh0ZW5kcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgaW1wbGVtZW50cyBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uXG57XG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBjcmVkZW50aWFsOiBQaG9uZUF1dGhDcmVkZW50aWFsKSB7XG4gICAgc3VwZXIoRmFjdG9ySWQuUEhPTkUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21DcmVkZW50aWFsKFxuICAgIGNyZWRlbnRpYWw6IFBob25lQXV0aENyZWRlbnRpYWxcbiAgKTogUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwge1xuICAgIHJldHVybiBuZXcgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbkltcGwoY3JlZGVudGlhbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5hbGl6ZUVucm9sbChcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgaWRUb2tlbjogc3RyaW5nLFxuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nIHwgbnVsbFxuICApOiBQcm9taXNlPEZpbmFsaXplTWZhUmVzcG9uc2U+IHtcbiAgICByZXR1cm4gZmluYWxpemVFbnJvbGxQaG9uZU1mYShhdXRoLCB7XG4gICAgICBpZFRva2VuLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICBwaG9uZVZlcmlmaWNhdGlvbkluZm86IHRoaXMuY3JlZGVudGlhbC5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZmluYWxpemVTaWduSW4oXG4gICAgYXV0aDogQXV0aEludGVybmFsLFxuICAgIG1mYVBlbmRpbmdDcmVkZW50aWFsOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxGaW5hbGl6ZU1mYVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZpbmFsaXplU2lnbkluUGhvbmVNZmEoYXV0aCwge1xuICAgICAgbWZhUGVuZGluZ0NyZWRlbnRpYWwsXG4gICAgICBwaG9uZVZlcmlmaWNhdGlvbkluZm86IHRoaXMuY3JlZGVudGlhbC5fbWFrZVZlcmlmaWNhdGlvblJlcXVlc3QoKVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYSB7QGxpbmsgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbn0uXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgUGhvbmVNdWx0aUZhY3RvckdlbmVyYXRvciB7XG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIHtAbGluayBQaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZiB0aGUgcGhvbmUgc2Vjb25kIGZhY3Rvci5cbiAgICpcbiAgICogQHJlbWFya3NcbiAgICogVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpbiBhIE5vZGUuanMgZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBwaG9uZUF1dGhDcmVkZW50aWFsIC0gQSBjcmVkZW50aWFsIHByb3ZpZGVkIGJ5IHtAbGluayBQaG9uZUF1dGhQcm92aWRlci5jcmVkZW50aWFsfS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbn0gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aFxuICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlci5yZXNvbHZlU2lnbklufVxuICAgKi9cbiAgc3RhdGljIGFzc2VydGlvbihjcmVkZW50aWFsOiBQaG9uZUF1dGhDcmVkZW50aWFsKTogUGhvbmVNdWx0aUZhY3RvckFzc2VydGlvbiB7XG4gICAgcmV0dXJuIFBob25lTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsLl9mcm9tQ3JlZGVudGlhbChjcmVkZW50aWFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgcGhvbmUgc2Vjb25kIGZhY3RvcjogYHBob25lYC5cbiAgICovXG4gIHN0YXRpYyBGQUNUT1JfSUQgPSAncGhvbmUnO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQge1xuICBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb24sXG4gIE11bHRpRmFjdG9yU2Vzc2lvbixcbiAgRmFjdG9ySWRcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IEF1dGhJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL2F1dGgnO1xuaW1wb3J0IHtcbiAgZmluYWxpemVFbnJvbGxUb3RwTWZhLFxuICBzdGFydEVucm9sbFRvdHBNZmEsXG4gIFN0YXJ0VG90cE1mYUVucm9sbG1lbnRSZXNwb25zZSxcbiAgVG90cFZlcmlmaWNhdGlvbkluZm9cbn0gZnJvbSAnLi4vLi4vYXBpL2FjY291bnRfbWFuYWdlbWVudC9tZmEnO1xuaW1wb3J0IHtcbiAgRmluYWxpemVNZmFSZXNwb25zZSxcbiAgZmluYWxpemVTaWduSW5Ub3RwTWZhXG59IGZyb20gJy4uLy4uL2FwaS9hdXRoZW50aWNhdGlvbi9tZmEnO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIH0gZnJvbSAnLi4vLi4vbWZhL21mYV9hc3NlcnRpb24nO1xuaW1wb3J0IHsgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbCB9IGZyb20gJy4uL21mYV9zZXNzaW9uJztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi8uLi9jb3JlL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vLi4vY29yZS91dGlsL2Fzc2VydCc7XG5cbi8qKlxuICogUHJvdmlkZXIgZm9yIGdlbmVyYXRpbmcgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufS5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBUb3RwTXVsdGlGYWN0b3JHZW5lcmF0b3Ige1xuICAvKipcbiAgICogUHJvdmlkZXMgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZlxuICAgKiB0aGUgVE9UUCAodGltZS1iYXNlZCBvbmUtdGltZSBwYXNzd29yZCkgc2Vjb25kIGZhY3Rvci5cbiAgICogVGhpcyBhc3NlcnRpb24gaXMgdXNlZCB0byBjb21wbGV0ZSBlbnJvbGxtZW50IGluIFRPVFAgc2Vjb25kIGZhY3Rvci5cbiAgICpcbiAgICogQHBhcmFtIHNlY3JldCBBIHtAbGluayBUb3RwU2VjcmV0fSBjb250YWluaW5nIHRoZSBzaGFyZWQgc2VjcmV0IGtleSBhbmQgb3RoZXIgVE9UUCBwYXJhbWV0ZXJzLlxuICAgKiBAcGFyYW0gb25lVGltZVBhc3N3b3JkIE9uZS10aW1lIHBhc3N3b3JkIGZyb20gVE9UUCBBcHAuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbn0gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aFxuICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JVc2VyLmVucm9sbH0uXG4gICAqL1xuICBzdGF0aWMgYXNzZXJ0aW9uRm9yRW5yb2xsbWVudChcbiAgICBzZWNyZXQ6IFRvdHBTZWNyZXQsXG4gICAgb25lVGltZVBhc3N3b3JkOiBzdHJpbmdcbiAgKTogVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uIHtcbiAgICByZXR1cm4gVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbC5fZnJvbVNlY3JldChzZWNyZXQsIG9uZVRpbWVQYXNzd29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZXMgYSB7QGxpbmsgVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9ufSB0byBjb25maXJtIG93bmVyc2hpcCBvZiB0aGUgVE9UUCBzZWNvbmQgZmFjdG9yLlxuICAgKiBUaGlzIGFzc2VydGlvbiBpcyB1c2VkIHRvIGNvbXBsZXRlIHNpZ25JbiB3aXRoIFRPVFAgYXMgdGhlIHNlY29uZCBmYWN0b3IuXG4gICAqXG4gICAqIEBwYXJhbSBlbnJvbGxtZW50SWQgaWRlbnRpZmllcyB0aGUgZW5yb2xsZWQgVE9UUCBzZWNvbmQgZmFjdG9yLlxuICAgKiBAcGFyYW0gb25lVGltZVBhc3N3b3JkIE9uZS10aW1lIHBhc3N3b3JkIGZyb20gVE9UUCBBcHAuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbn0gd2hpY2ggY2FuIGJlIHVzZWQgd2l0aFxuICAgKiB7QGxpbmsgTXVsdGlGYWN0b3JSZXNvbHZlci5yZXNvbHZlU2lnbklufS5cbiAgICovXG4gIHN0YXRpYyBhc3NlcnRpb25Gb3JTaWduSW4oXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgb25lVGltZVBhc3N3b3JkOiBzdHJpbmdcbiAgKTogVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uIHtcbiAgICByZXR1cm4gVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbC5fZnJvbUVucm9sbG1lbnRJZChcbiAgICAgIGVucm9sbG1lbnRJZCxcbiAgICAgIG9uZVRpbWVQYXNzd29yZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHByb21pc2UgdG8ge0BsaW5rIFRvdHBTZWNyZXR9IHdoaWNoIGNvbnRhaW5zIHRoZSBUT1RQIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBvdGhlciBwYXJhbWV0ZXJzLlxuICAgKiBDcmVhdGVzIGEgVE9UUCBzZWNyZXQgYXMgcGFydCBvZiBlbnJvbGxpbmcgYSBUT1RQIHNlY29uZCBmYWN0b3IuXG4gICAqIFVzZWQgZm9yIGdlbmVyYXRpbmcgYSBRUiBjb2RlIFVSTCBvciBpbnB1dHRpbmcgaW50byBhIFRPVFAgYXBwLlxuICAgKiBUaGlzIG1ldGhvZCB1c2VzIHRoZSBhdXRoIGluc3RhbmNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgaW4gdGhlIG11bHRpRmFjdG9yU2Vzc2lvbi5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gVGhlIHtAbGluayBNdWx0aUZhY3RvclNlc3Npb259IHRoYXQgdGhlIHVzZXIgaXMgcGFydCBvZi5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRvIHtAbGluayBUb3RwU2VjcmV0fS5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBnZW5lcmF0ZVNlY3JldChcbiAgICBzZXNzaW9uOiBNdWx0aUZhY3RvclNlc3Npb25cbiAgKTogUHJvbWlzZTxUb3RwU2VjcmV0PiB7XG4gICAgY29uc3QgbWZhU2Vzc2lvbiA9IHNlc3Npb24gYXMgTXVsdGlGYWN0b3JTZXNzaW9uSW1wbDtcbiAgICBfYXNzZXJ0KFxuICAgICAgdHlwZW9mIG1mYVNlc3Npb24udXNlcj8uYXV0aCAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICBBdXRoRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SXG4gICAgKTtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHN0YXJ0RW5yb2xsVG90cE1mYShtZmFTZXNzaW9uLnVzZXIuYXV0aCwge1xuICAgICAgaWRUb2tlbjogbWZhU2Vzc2lvbi5jcmVkZW50aWFsLFxuICAgICAgdG90cEVucm9sbG1lbnRJbmZvOiB7fVxuICAgIH0pO1xuICAgIHJldHVybiBUb3RwU2VjcmV0Ll9mcm9tU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlKFxuICAgICAgcmVzcG9uc2UsXG4gICAgICBtZmFTZXNzaW9uLnVzZXIuYXV0aFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIFRPVFAgc2Vjb25kIGZhY3RvcjogYHRvdHBgLlxuICAgKi9cbiAgc3RhdGljIEZBQ1RPUl9JRDogJ3RvdHAnID0gRmFjdG9ySWQuVE9UUDtcbn1cblxuZXhwb3J0IGNsYXNzIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgZXh0ZW5kcyBNdWx0aUZhY3RvckFzc2VydGlvbkltcGxcbiAgaW1wbGVtZW50cyBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25cbntcbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgb3RwOiBzdHJpbmcsXG4gICAgcmVhZG9ubHkgZW5yb2xsbWVudElkPzogc3RyaW5nLFxuICAgIHJlYWRvbmx5IHNlY3JldD86IFRvdHBTZWNyZXRcbiAgKSB7XG4gICAgc3VwZXIoRmFjdG9ySWQuVE9UUCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZnJvbVNlY3JldChcbiAgICBzZWNyZXQ6IFRvdHBTZWNyZXQsXG4gICAgb3RwOiBzdHJpbmdcbiAgKTogVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB7XG4gICAgcmV0dXJuIG5ldyBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsKG90cCwgdW5kZWZpbmVkLCBzZWNyZXQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX2Zyb21FbnJvbGxtZW50SWQoXG4gICAgZW5yb2xsbWVudElkOiBzdHJpbmcsXG4gICAgb3RwOiBzdHJpbmdcbiAgKTogVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCB7XG4gICAgcmV0dXJuIG5ldyBUb3RwTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsKG90cCwgZW5yb2xsbWVudElkKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgYXN5bmMgX2ZpbmFsaXplRW5yb2xsKFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbCxcbiAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmcgfCBudWxsXG4gICk6IFByb21pc2U8RmluYWxpemVNZmFSZXNwb25zZT4ge1xuICAgIF9hc3NlcnQoXG4gICAgICB0eXBlb2YgdGhpcy5zZWNyZXQgIT09ICd1bmRlZmluZWQnLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIHJldHVybiBmaW5hbGl6ZUVucm9sbFRvdHBNZmEoYXV0aCwge1xuICAgICAgaWRUb2tlbixcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgdG90cFZlcmlmaWNhdGlvbkluZm86IHRoaXMuc2VjcmV0Ll9tYWtlVG90cFZlcmlmaWNhdGlvbkluZm8odGhpcy5vdHApXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGFzeW5jIF9maW5hbGl6ZVNpZ25JbihcbiAgICBhdXRoOiBBdXRoSW50ZXJuYWwsXG4gICAgbWZhUGVuZGluZ0NyZWRlbnRpYWw6IHN0cmluZ1xuICApOiBQcm9taXNlPEZpbmFsaXplTWZhUmVzcG9uc2U+IHtcbiAgICBfYXNzZXJ0KFxuICAgICAgdGhpcy5lbnJvbGxtZW50SWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLm90cCAhPT0gdW5kZWZpbmVkLFxuICAgICAgYXV0aCxcbiAgICAgIEF1dGhFcnJvckNvZGUuQVJHVU1FTlRfRVJST1JcbiAgICApO1xuICAgIGNvbnN0IHRvdHBWZXJpZmljYXRpb25JbmZvID0geyB2ZXJpZmljYXRpb25Db2RlOiB0aGlzLm90cCB9O1xuICAgIHJldHVybiBmaW5hbGl6ZVNpZ25JblRvdHBNZmEoYXV0aCwge1xuICAgICAgbWZhUGVuZGluZ0NyZWRlbnRpYWwsXG4gICAgICBtZmFFbnJvbGxtZW50SWQ6IHRoaXMuZW5yb2xsbWVudElkLFxuICAgICAgdG90cFZlcmlmaWNhdGlvbkluZm9cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVyIGZvciBnZW5lcmF0aW5nIGEge0BsaW5rIFRvdHBNdWx0aUZhY3RvckFzc2VydGlvbn0uXG4gKlxuICogU3RvcmVzIHRoZSBzaGFyZWQgc2VjcmV0IGtleSBhbmQgb3RoZXIgcGFyYW1ldGVycyB0byBnZW5lcmF0ZSB0aW1lLWJhc2VkIE9UUHMuXG4gKiBJbXBsZW1lbnRzIG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIHNoYXJlZCBzZWNyZXQga2V5IGFuZCBnZW5lcmF0ZSBhIFFSIGNvZGUgVVJMLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgVG90cFNlY3JldCB7XG4gIC8qKlxuICAgKiBTaGFyZWQgc2VjcmV0IGtleS9zZWVkIHVzZWQgZm9yIGVucm9sbGluZyBpbiBUT1RQIE1GQSBhbmQgZ2VuZXJhdGluZyBPVFBzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjcmV0S2V5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBIYXNoaW5nIGFsZ29yaXRobSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgaGFzaGluZ0FsZ29yaXRobTogc3RyaW5nO1xuICAvKipcbiAgICogTGVuZ3RoIG9mIHRoZSBvbmUtdGltZSBwYXNzd29yZHMgdG8gYmUgZ2VuZXJhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29kZUxlbmd0aDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGludGVydmFsIChpbiBzZWNvbmRzKSB3aGVuIHRoZSBPVFAgY29kZXMgc2hvdWxkIGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvZGVJbnRlcnZhbFNlY29uZHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSB0aW1lc3RhbXAgKFVUQyBzdHJpbmcpIGJ5IHdoaWNoIFRPVFAgZW5yb2xsbWVudCBzaG91bGQgYmUgY29tcGxldGVkLlxuICAgKi9cbiAgLy8gVGhpcyBjYW4gYmUgdXNlZCBieSBjYWxsZXJzIHRvIHNob3cgYSBjb3VudGRvd24gb2Ygd2hlbiB0byBlbnRlciBPVFAgY29kZSBieS5cbiAgcmVhZG9ubHkgZW5yb2xsbWVudENvbXBsZXRpb25EZWFkbGluZTogc3RyaW5nO1xuXG4gIC8vIFRoZSBwdWJsaWMgbWVtYmVycyBhcmUgZGVjbGFyZWQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3Igc28gdGhlIGRvY3MgY2FuIGJlIGdlbmVyYXRlZC5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBzZWNyZXRLZXk6IHN0cmluZyxcbiAgICBoYXNoaW5nQWxnb3JpdGhtOiBzdHJpbmcsXG4gICAgY29kZUxlbmd0aDogbnVtYmVyLFxuICAgIGNvZGVJbnRlcnZhbFNlY29uZHM6IG51bWJlcixcbiAgICBlbnJvbGxtZW50Q29tcGxldGlvbkRlYWRsaW5lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzZXNzaW9uSW5mbzogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aDogQXV0aEludGVybmFsXG4gICkge1xuICAgIHRoaXMuc2VjcmV0S2V5ID0gc2VjcmV0S2V5O1xuICAgIHRoaXMuaGFzaGluZ0FsZ29yaXRobSA9IGhhc2hpbmdBbGdvcml0aG07XG4gICAgdGhpcy5jb2RlTGVuZ3RoID0gY29kZUxlbmd0aDtcbiAgICB0aGlzLmNvZGVJbnRlcnZhbFNlY29uZHMgPSBjb2RlSW50ZXJ2YWxTZWNvbmRzO1xuICAgIHRoaXMuZW5yb2xsbWVudENvbXBsZXRpb25EZWFkbGluZSA9IGVucm9sbG1lbnRDb21wbGV0aW9uRGVhZGxpbmU7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZnJvbVN0YXJ0VG90cE1mYUVucm9sbG1lbnRSZXNwb25zZShcbiAgICByZXNwb25zZTogU3RhcnRUb3RwTWZhRW5yb2xsbWVudFJlc3BvbnNlLFxuICAgIGF1dGg6IEF1dGhJbnRlcm5hbFxuICApOiBUb3RwU2VjcmV0IHtcbiAgICByZXR1cm4gbmV3IFRvdHBTZWNyZXQoXG4gICAgICByZXNwb25zZS50b3RwU2Vzc2lvbkluZm8uc2hhcmVkU2VjcmV0S2V5LFxuICAgICAgcmVzcG9uc2UudG90cFNlc3Npb25JbmZvLmhhc2hpbmdBbGdvcml0aG0sXG4gICAgICByZXNwb25zZS50b3RwU2Vzc2lvbkluZm8udmVyaWZpY2F0aW9uQ29kZUxlbmd0aCxcbiAgICAgIHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby5wZXJpb2RTZWMsXG4gICAgICBuZXcgRGF0ZShyZXNwb25zZS50b3RwU2Vzc2lvbkluZm8uZmluYWxpemVFbnJvbGxtZW50VGltZSkudG9VVENTdHJpbmcoKSxcbiAgICAgIHJlc3BvbnNlLnRvdHBTZXNzaW9uSW5mby5zZXNzaW9uSW5mbyxcbiAgICAgIGF1dGhcbiAgICApO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbWFrZVRvdHBWZXJpZmljYXRpb25JbmZvKG90cDogc3RyaW5nKTogVG90cFZlcmlmaWNhdGlvbkluZm8ge1xuICAgIHJldHVybiB7IHNlc3Npb25JbmZvOiB0aGlzLnNlc3Npb25JbmZvLCB2ZXJpZmljYXRpb25Db2RlOiBvdHAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgUVIgY29kZSBVUkwgYXMgZGVzY3JpYmVkIGluXG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZ29vZ2xlLWF1dGhlbnRpY2F0b3Ivd2lraS9LZXktVXJpLUZvcm1hdFxuICAgKiBUaGlzIGNhbiBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYXMgYSBRUiBjb2RlIHRvIGJlIHNjYW5uZWQgaW50byBhIFRPVFAgYXBwIGxpa2UgR29vZ2xlIEF1dGhlbnRpY2F0b3IuXG4gICAqIElmIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSB1bnNwZWNpZmllZCwgYW4gYWNjb3VudE5hbWUgb2YgPHVzZXJFbWFpbD4gYW5kIGlzc3VlciBvZiA8ZmlyZWJhc2VBcHBOYW1lPiBhcmUgdXNlZC5cbiAgICpcbiAgICogQHBhcmFtIGFjY291bnROYW1lIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50L2FwcCBhbG9uZyB3aXRoIGEgdXNlciBpZGVudGlmaWVyLlxuICAgKiBAcGFyYW0gaXNzdWVyIGlzc3VlciBvZiB0aGUgVE9UUCAobGlrZWx5IHRoZSBhcHAgbmFtZSkuXG4gICAqIEByZXR1cm5zIEEgUVIgY29kZSBVUkwgc3RyaW5nLlxuICAgKi9cbiAgZ2VuZXJhdGVRckNvZGVVcmwoYWNjb3VudE5hbWU/OiBzdHJpbmcsIGlzc3Vlcj86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHVzZURlZmF1bHRzID0gZmFsc2U7XG4gICAgaWYgKF9pc0VtcHR5U3RyaW5nKGFjY291bnROYW1lKSB8fCBfaXNFbXB0eVN0cmluZyhpc3N1ZXIpKSB7XG4gICAgICB1c2VEZWZhdWx0cyA9IHRydWU7XG4gICAgfVxuICAgIGlmICh1c2VEZWZhdWx0cykge1xuICAgICAgaWYgKF9pc0VtcHR5U3RyaW5nKGFjY291bnROYW1lKSkge1xuICAgICAgICBhY2NvdW50TmFtZSA9IHRoaXMuYXV0aC5jdXJyZW50VXNlcj8uZW1haWwgfHwgJ3Vua25vd251c2VyJztcbiAgICAgIH1cbiAgICAgIGlmIChfaXNFbXB0eVN0cmluZyhpc3N1ZXIpKSB7XG4gICAgICAgIGlzc3VlciA9IHRoaXMuYXV0aC5uYW1lO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYG90cGF1dGg6Ly90b3RwLyR7aXNzdWVyfToke2FjY291bnROYW1lfT9zZWNyZXQ9JHt0aGlzLnNlY3JldEtleX0maXNzdWVyPSR7aXNzdWVyfSZhbGdvcml0aG09JHt0aGlzLmhhc2hpbmdBbGdvcml0aG19JmRpZ2l0cz0ke3RoaXMuY29kZUxlbmd0aH1gO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmZ1bmN0aW9uIF9pc0VtcHR5U3RyaW5nKGlucHV0Pzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICd1bmRlZmluZWQnIHx8IGlucHV0Py5sZW5ndGggPT09IDA7XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgVW5zdWJzY3JpYmUgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5pbXBvcnQgeyBGaXJlYmFzZUF1dGhJbnRlcm5hbCB9IGZyb20gJ0BmaXJlYmFzZS9hdXRoLWludGVyb3AtdHlwZXMnO1xuXG5pbXBvcnQgeyBBdXRoSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IFVzZXJJbnRlcm5hbCB9IGZyb20gJy4uLy4uL21vZGVsL3VzZXInO1xuaW1wb3J0IHsgX2Fzc2VydCB9IGZyb20gJy4uL3V0aWwvYXNzZXJ0JztcbmltcG9ydCB7IEF1dGhFcnJvckNvZGUgfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5pbnRlcmZhY2UgVG9rZW5MaXN0ZW5lciB7XG4gICh0b2s6IHN0cmluZyB8IG51bGwpOiB1bmtub3duO1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aEludGVyb3AgaW1wbGVtZW50cyBGaXJlYmFzZUF1dGhJbnRlcm5hbCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW50ZXJuYWxMaXN0ZW5lcnM6IE1hcDxUb2tlbkxpc3RlbmVyLCBVbnN1YnNjcmliZT4gPVxuICAgIG5ldyBNYXAoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGF1dGg6IEF1dGhJbnRlcm5hbCkge31cblxuICBnZXRVaWQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdGhpcy5hc3NlcnRBdXRoQ29uZmlndXJlZCgpO1xuICAgIHJldHVybiB0aGlzLmF1dGguY3VycmVudFVzZXI/LnVpZCB8fCBudWxsO1xuICB9XG5cbiAgYXN5bmMgZ2V0VG9rZW4oXG4gICAgZm9yY2VSZWZyZXNoPzogYm9vbGVhblxuICApOiBQcm9taXNlPHsgYWNjZXNzVG9rZW46IHN0cmluZyB9IHwgbnVsbD4ge1xuICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcbiAgICBhd2FpdCB0aGlzLmF1dGguX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgICBpZiAoIXRoaXMuYXV0aC5jdXJyZW50VXNlcikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGguY3VycmVudFVzZXIuZ2V0SWRUb2tlbihmb3JjZVJlZnJlc2gpO1xuICAgIHJldHVybiB7IGFjY2Vzc1Rva2VuIH07XG4gIH1cblxuICBhZGRBdXRoVG9rZW5MaXN0ZW5lcihsaXN0ZW5lcjogVG9rZW5MaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMuYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTtcbiAgICBpZiAodGhpcy5pbnRlcm5hbExpc3RlbmVycy5oYXMobGlzdGVuZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLmF1dGgub25JZFRva2VuQ2hhbmdlZCh1c2VyID0+IHtcbiAgICAgIGxpc3RlbmVyKFxuICAgICAgICAodXNlciBhcyBVc2VySW50ZXJuYWwgfCBudWxsKT8uc3RzVG9rZW5NYW5hZ2VyLmFjY2Vzc1Rva2VuIHx8IG51bGxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgdGhpcy5pbnRlcm5hbExpc3RlbmVycy5zZXQobGlzdGVuZXIsIHVuc3Vic2NyaWJlKTtcbiAgICB0aGlzLnVwZGF0ZVByb2FjdGl2ZVJlZnJlc2goKTtcbiAgfVxuXG4gIHJlbW92ZUF1dGhUb2tlbkxpc3RlbmVyKGxpc3RlbmVyOiBUb2tlbkxpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5hc3NlcnRBdXRoQ29uZmlndXJlZCgpO1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy5pbnRlcm5hbExpc3RlbmVycy5nZXQobGlzdGVuZXIpO1xuICAgIGlmICghdW5zdWJzY3JpYmUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmludGVybmFsTGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgdW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnVwZGF0ZVByb2FjdGl2ZVJlZnJlc2goKTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0QXV0aENvbmZpZ3VyZWQoKTogdm9pZCB7XG4gICAgX2Fzc2VydChcbiAgICAgIHRoaXMuYXV0aC5faW5pdGlhbGl6YXRpb25Qcm9taXNlLFxuICAgICAgQXV0aEVycm9yQ29kZS5ERVBFTkRFTlRfU0RLX0lOSVRfQkVGT1JFX0FVVEhcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQcm9hY3RpdmVSZWZyZXNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVybmFsTGlzdGVuZXJzLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLmF1dGguX3N0YXJ0UHJvYWN0aXZlUmVmcmVzaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmF1dGguX3N0b3BQcm9hY3RpdmVSZWZyZXNoKCk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgX3JlZ2lzdGVyQ29tcG9uZW50LCByZWdpc3RlclZlcnNpb24gfSBmcm9tICdAZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQ29tcG9uZW50VHlwZSxcbiAgSW5zdGFudGlhdGlvbk1vZGVcbn0gZnJvbSAnQGZpcmViYXNlL2NvbXBvbmVudCc7XG5cbmltcG9ydCB7IG5hbWUsIHZlcnNpb24gfSBmcm9tICcuLi8uLi8uLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgQXV0aEVycm9yQ29kZSB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBfYXNzZXJ0IH0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuaW1wb3J0IHsgX2dldENsaWVudFZlcnNpb24sIENsaWVudFBsYXRmb3JtIH0gZnJvbSAnLi4vdXRpbC92ZXJzaW9uJztcbmltcG9ydCB7IF9jYXN0QXV0aCwgQXV0aEltcGwsIERlZmF1bHRDb25maWcgfSBmcm9tICcuL2F1dGhfaW1wbCc7XG5pbXBvcnQgeyBBdXRoSW50ZXJvcCB9IGZyb20gJy4vZmlyZWJhc2VfaW50ZXJuYWwnO1xuaW1wb3J0IHsgQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi8uLi9tb2RlbC9hdXRoJztcbmltcG9ydCB7IERlcGVuZGVuY2llcyB9IGZyb20gJy4uLy4uL21vZGVsL3B1YmxpY190eXBlcyc7XG5pbXBvcnQgeyBfaW5pdGlhbGl6ZUF1dGhJbnN0YW5jZSB9IGZyb20gJy4vaW5pdGlhbGl6ZSc7XG5cbmV4cG9ydCBjb25zdCBlbnVtIF9Db21wb25lbnROYW1lIHtcbiAgQVVUSCA9ICdhdXRoJyxcbiAgQVVUSF9JTlRFUk5BTCA9ICdhdXRoLWludGVybmFsJ1xufVxuXG5mdW5jdGlvbiBnZXRWZXJzaW9uRm9yUGxhdGZvcm0oXG4gIGNsaWVudFBsYXRmb3JtOiBDbGllbnRQbGF0Zm9ybVxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoIChjbGllbnRQbGF0Zm9ybSkge1xuICAgIGNhc2UgQ2xpZW50UGxhdGZvcm0uTk9ERTpcbiAgICAgIHJldHVybiAnbm9kZSc7XG4gICAgY2FzZSBDbGllbnRQbGF0Zm9ybS5SRUFDVF9OQVRJVkU6XG4gICAgICByZXR1cm4gJ3JuJztcbiAgICBjYXNlIENsaWVudFBsYXRmb3JtLldPUktFUjpcbiAgICAgIHJldHVybiAnd2Vid29ya2VyJztcbiAgICBjYXNlIENsaWVudFBsYXRmb3JtLkNPUkRPVkE6XG4gICAgICByZXR1cm4gJ2NvcmRvdmEnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckF1dGgoY2xpZW50UGxhdGZvcm06IENsaWVudFBsYXRmb3JtKTogdm9pZCB7XG4gIF9yZWdpc3RlckNvbXBvbmVudChcbiAgICBuZXcgQ29tcG9uZW50KFxuICAgICAgX0NvbXBvbmVudE5hbWUuQVVUSCxcbiAgICAgIChjb250YWluZXIsIHsgb3B0aW9uczogZGVwcyB9OiB7IG9wdGlvbnM/OiBEZXBlbmRlbmNpZXMgfSkgPT4ge1xuICAgICAgICBjb25zdCBhcHAgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoJ2FwcCcpLmdldEltbWVkaWF0ZSgpITtcbiAgICAgICAgY29uc3QgaGVhcnRiZWF0U2VydmljZVByb3ZpZGVyID1cbiAgICAgICAgICBjb250YWluZXIuZ2V0UHJvdmlkZXI8J2hlYXJ0YmVhdCc+KCdoZWFydGJlYXQnKTtcbiAgICAgICAgY29uc3QgYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXIgPVxuICAgICAgICAgIGNvbnRhaW5lci5nZXRQcm92aWRlcjwnYXBwLWNoZWNrLWludGVybmFsJz4oJ2FwcC1jaGVjay1pbnRlcm5hbCcpO1xuICAgICAgICBjb25zdCB7IGFwaUtleSwgYXV0aERvbWFpbiB9ID0gYXBwLm9wdGlvbnM7XG5cbiAgICAgICAgX2Fzc2VydChcbiAgICAgICAgICBhcGlLZXkgJiYgIWFwaUtleS5pbmNsdWRlcygnOicpLFxuICAgICAgICAgIEF1dGhFcnJvckNvZGUuSU5WQUxJRF9BUElfS0VZLFxuICAgICAgICAgIHsgYXBwTmFtZTogYXBwLm5hbWUgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZzogQ29uZmlnSW50ZXJuYWwgPSB7XG4gICAgICAgICAgYXBpS2V5LFxuICAgICAgICAgIGF1dGhEb21haW4sXG4gICAgICAgICAgY2xpZW50UGxhdGZvcm0sXG4gICAgICAgICAgYXBpSG9zdDogRGVmYXVsdENvbmZpZy5BUElfSE9TVCxcbiAgICAgICAgICB0b2tlbkFwaUhvc3Q6IERlZmF1bHRDb25maWcuVE9LRU5fQVBJX0hPU1QsXG4gICAgICAgICAgYXBpU2NoZW1lOiBEZWZhdWx0Q29uZmlnLkFQSV9TQ0hFTUUsXG4gICAgICAgICAgc2RrQ2xpZW50VmVyc2lvbjogX2dldENsaWVudFZlcnNpb24oY2xpZW50UGxhdGZvcm0pXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYXV0aEluc3RhbmNlID0gbmV3IEF1dGhJbXBsKFxuICAgICAgICAgIGFwcCxcbiAgICAgICAgICBoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIsXG4gICAgICAgICAgYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXIsXG4gICAgICAgICAgY29uZmlnXG4gICAgICAgICk7XG4gICAgICAgIF9pbml0aWFsaXplQXV0aEluc3RhbmNlKGF1dGhJbnN0YW5jZSwgZGVwcyk7XG5cbiAgICAgICAgcmV0dXJuIGF1dGhJbnN0YW5jZTtcbiAgICAgIH0sXG4gICAgICBDb21wb25lbnRUeXBlLlBVQkxJQ1xuICAgIClcbiAgICAgIC8qKlxuICAgICAgICogQXV0aCBjYW4gb25seSBiZSBpbml0aWFsaXplZCBieSBleHBsaWNpdGx5IGNhbGxpbmcgZ2V0QXV0aCgpIG9yIGluaXRpYWxpemVBdXRoKClcbiAgICAgICAqIEZvciB3aHkgd2UgZG8gdGhpcywgU2VlIGdvL2ZpcmViYXNlLW5leHQtYXV0aC1pbml0XG4gICAgICAgKi9cbiAgICAgIC5zZXRJbnN0YW50aWF0aW9uTW9kZShJbnN0YW50aWF0aW9uTW9kZS5FWFBMSUNJVClcbiAgICAgIC8qKlxuICAgICAgICogQmVjYXVzZSBhbGwgZmlyZWJhc2UgcHJvZHVjdHMgdGhhdCBkZXBlbmQgb24gYXV0aCBkZXBlbmQgb24gYXV0aC1pbnRlcm5hbCBkaXJlY3RseSxcbiAgICAgICAqIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBhdXRoLWludGVybmFsIGFmdGVyIGF1dGggaXMgaW5pdGlhbGl6ZWQgdG8gbWFrZSBpdCBhdmFpbGFibGUgdG8gb3RoZXIgZmlyZWJhc2UgcHJvZHVjdHMuXG4gICAgICAgKi9cbiAgICAgIC5zZXRJbnN0YW5jZUNyZWF0ZWRDYWxsYmFjayhcbiAgICAgICAgKGNvbnRhaW5lciwgX2luc3RhbmNlSWRlbnRpZmllciwgX2luc3RhbmNlKSA9PiB7XG4gICAgICAgICAgY29uc3QgYXV0aEludGVybmFsUHJvdmlkZXIgPSBjb250YWluZXIuZ2V0UHJvdmlkZXIoXG4gICAgICAgICAgICBfQ29tcG9uZW50TmFtZS5BVVRIX0lOVEVSTkFMXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhdXRoSW50ZXJuYWxQcm92aWRlci5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIClcbiAgKTtcblxuICBfcmVnaXN0ZXJDb21wb25lbnQoXG4gICAgbmV3IENvbXBvbmVudChcbiAgICAgIF9Db21wb25lbnROYW1lLkFVVEhfSU5URVJOQUwsXG4gICAgICBjb250YWluZXIgPT4ge1xuICAgICAgICBjb25zdCBhdXRoID0gX2Nhc3RBdXRoKFxuICAgICAgICAgIGNvbnRhaW5lci5nZXRQcm92aWRlcihfQ29tcG9uZW50TmFtZS5BVVRIKS5nZXRJbW1lZGlhdGUoKSFcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIChhdXRoID0+IG5ldyBBdXRoSW50ZXJvcChhdXRoKSkoYXV0aCk7XG4gICAgICB9LFxuICAgICAgQ29tcG9uZW50VHlwZS5QUklWQVRFXG4gICAgKS5zZXRJbnN0YW50aWF0aW9uTW9kZShJbnN0YW50aWF0aW9uTW9kZS5FWFBMSUNJVClcbiAgKTtcblxuICByZWdpc3RlclZlcnNpb24obmFtZSwgdmVyc2lvbiwgZ2V0VmVyc2lvbkZvclBsYXRmb3JtKGNsaWVudFBsYXRmb3JtKSk7XG4gIC8vIEJVSUxEX1RBUkdFVCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHZhbHVlcyBsaWtlIGVzbTUsIGVzbTIwMTcsIGNqczUsIGV0YyBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uXG4gIHJlZ2lzdGVyVmVyc2lvbihuYW1lLCB2ZXJzaW9uLCAnX19CVUlMRF9UQVJHRVRfXycpO1xufVxuIiwgIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEZpcmViYXNlQXBwLCBnZXRBcHAsIF9nZXRQcm92aWRlciB9IGZyb20gJ0BmaXJlYmFzZS9hcHAnO1xuXG5pbXBvcnQge1xuICBpbml0aWFsaXplQXV0aCxcbiAgYmVmb3JlQXV0aFN0YXRlQ2hhbmdlZCxcbiAgb25JZFRva2VuQ2hhbmdlZCxcbiAgY29ubmVjdEF1dGhFbXVsYXRvclxufSBmcm9tICcuLic7XG5pbXBvcnQgeyByZWdpc3RlckF1dGggfSBmcm9tICcuLi9jb3JlL2F1dGgvcmVnaXN0ZXInO1xuaW1wb3J0IHsgQ2xpZW50UGxhdGZvcm0gfSBmcm9tICcuLi9jb3JlL3V0aWwvdmVyc2lvbic7XG5pbXBvcnQgeyBicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSB9IGZyb20gJy4vcGVyc2lzdGVuY2UvbG9jYWxfc3RvcmFnZSc7XG5pbXBvcnQgeyBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlIH0gZnJvbSAnLi9wZXJzaXN0ZW5jZS9zZXNzaW9uX3N0b3JhZ2UnO1xuaW1wb3J0IHsgaW5kZXhlZERCTG9jYWxQZXJzaXN0ZW5jZSB9IGZyb20gJy4vcGVyc2lzdGVuY2UvaW5kZXhlZF9kYic7XG5pbXBvcnQgeyBicm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyIH0gZnJvbSAnLi9wb3B1cF9yZWRpcmVjdCc7XG5pbXBvcnQgeyBBdXRoLCBVc2VyIH0gZnJvbSAnLi4vbW9kZWwvcHVibGljX3R5cGVzJztcbmltcG9ydCB7IGdldERlZmF1bHRFbXVsYXRvckhvc3QsIGdldEV4cGVyaW1lbnRhbFNldHRpbmcgfSBmcm9tICdAZmlyZWJhc2UvdXRpbCc7XG5cbmNvbnN0IERFRkFVTFRfSURfVE9LRU5fTUFYX0FHRSA9IDUgKiA2MDtcbmNvbnN0IGF1dGhJZFRva2VuTWF4QWdlID1cbiAgZ2V0RXhwZXJpbWVudGFsU2V0dGluZygnYXV0aElkVG9rZW5NYXhBZ2UnKSB8fCBERUZBVUxUX0lEX1RPS0VOX01BWF9BR0U7XG5cbmxldCBsYXN0UG9zdGVkSWRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG5cbmNvbnN0IG1pbnRDb29raWVGYWN0b3J5ID0gKHVybDogc3RyaW5nKSA9PiBhc3luYyAodXNlcjogVXNlciB8IG51bGwpID0+IHtcbiAgY29uc3QgaWRUb2tlblJlc3VsdCA9IHVzZXIgJiYgKGF3YWl0IHVzZXIuZ2V0SWRUb2tlblJlc3VsdCgpKTtcbiAgY29uc3QgaWRUb2tlbkFnZSA9XG4gICAgaWRUb2tlblJlc3VsdCAmJlxuICAgIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIERhdGUucGFyc2UoaWRUb2tlblJlc3VsdC5pc3N1ZWRBdFRpbWUpKSAvIDFfMDAwO1xuICBpZiAoaWRUb2tlbkFnZSAmJiBpZFRva2VuQWdlID4gYXV0aElkVG9rZW5NYXhBZ2UpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gU3BlY2lmaWNhbGx5IHRyaXAgbnVsbCA9PiB1bmRlZmluZWQgd2hlbiBsb2dnZWQgb3V0LCB0byBkZWxldGUgYW55IGV4aXN0aW5nIGNvb2tpZVxuICBjb25zdCBpZFRva2VuID0gaWRUb2tlblJlc3VsdD8udG9rZW47XG4gIGlmIChsYXN0UG9zdGVkSWRUb2tlbiA9PT0gaWRUb2tlbikge1xuICAgIHJldHVybjtcbiAgfVxuICBsYXN0UG9zdGVkSWRUb2tlbiA9IGlkVG9rZW47XG4gIGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZDogaWRUb2tlbiA/ICdQT1NUJyA6ICdERUxFVEUnLFxuICAgIGhlYWRlcnM6IGlkVG9rZW5cbiAgICAgID8ge1xuICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke2lkVG9rZW59YFxuICAgICAgICB9XG4gICAgICA6IHt9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBBdXRoIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQge0BsaW5rIEBmaXJlYmFzZS9hcHAjRmlyZWJhc2VBcHB9LlxuICogSWYgbm8gaW5zdGFuY2UgZXhpc3RzLCBpbml0aWFsaXplcyBhbiBBdXRoIGluc3RhbmNlIHdpdGggcGxhdGZvcm0tc3BlY2lmaWMgZGVmYXVsdCBkZXBlbmRlbmNpZXMuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBGaXJlYmFzZSBBcHAuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXV0aChhcHA6IEZpcmViYXNlQXBwID0gZ2V0QXBwKCkpOiBBdXRoIHtcbiAgY29uc3QgcHJvdmlkZXIgPSBfZ2V0UHJvdmlkZXIoYXBwLCAnYXV0aCcpO1xuXG4gIGlmIChwcm92aWRlci5pc0luaXRpYWxpemVkKCkpIHtcbiAgICByZXR1cm4gcHJvdmlkZXIuZ2V0SW1tZWRpYXRlKCk7XG4gIH1cblxuICBjb25zdCBhdXRoID0gaW5pdGlhbGl6ZUF1dGgoYXBwLCB7XG4gICAgcG9wdXBSZWRpcmVjdFJlc29sdmVyOiBicm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyLFxuICAgIHBlcnNpc3RlbmNlOiBbXG4gICAgICBpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlLFxuICAgICAgYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UsXG4gICAgICBicm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlXG4gICAgXVxuICB9KTtcblxuICBjb25zdCBhdXRoVG9rZW5TeW5jVXJsID0gZ2V0RXhwZXJpbWVudGFsU2V0dGluZygnYXV0aFRva2VuU3luY1VSTCcpO1xuICBpZiAoYXV0aFRva2VuU3luY1VybCkge1xuICAgIGNvbnN0IG1pbnRDb29raWUgPSBtaW50Q29va2llRmFjdG9yeShhdXRoVG9rZW5TeW5jVXJsKTtcbiAgICBiZWZvcmVBdXRoU3RhdGVDaGFuZ2VkKGF1dGgsIG1pbnRDb29raWUsICgpID0+XG4gICAgICBtaW50Q29va2llKGF1dGguY3VycmVudFVzZXIpXG4gICAgKTtcbiAgICBvbklkVG9rZW5DaGFuZ2VkKGF1dGgsIHVzZXIgPT4gbWludENvb2tpZSh1c2VyKSk7XG4gIH1cblxuICBjb25zdCBhdXRoRW11bGF0b3JIb3N0ID0gZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdCgnYXV0aCcpO1xuICBpZiAoYXV0aEVtdWxhdG9ySG9zdCkge1xuICAgIGNvbm5lY3RBdXRoRW11bGF0b3IoYXV0aCwgYGh0dHA6Ly8ke2F1dGhFbXVsYXRvckhvc3R9YCk7XG4gIH1cblxuICByZXR1cm4gYXV0aDtcbn1cblxucmVnaXN0ZXJBdXRoKENsaWVudFBsYXRmb3JtLkJST1dTRVIpO1xuIiwgIi8qKiBOb3JtYWwgaHlkcmF0aW9uIHRoYXQgYXR0YWNoZXMgdG8gYSBET00gdHJlZSBidXQgZG9lcyBub3QgZGlmZiBpdC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFX0hZRFJBVEUgPSAxIDw8IDU7XG4vKiogU2lnbmlmaWVzIHRoaXMgVk5vZGUgc3VzcGVuZGVkIG9uIHRoZSBwcmV2aW91cyByZW5kZXIgKi9cbmV4cG9ydCBjb25zdCBNT0RFX1NVU1BFTkRFRCA9IDEgPDwgNztcbi8qKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIG5vZGUgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgd2hpbGUgcGF0Y2hpbmcgY2hpbGRyZW4gKi9cbmV4cG9ydCBjb25zdCBJTlNFUlRfVk5PREUgPSAxIDw8IDE2O1xuLyoqIEluZGljYXRlcyBhIFZOb2RlIGhhcyBiZWVuIG1hdGNoZWQgd2l0aCBhbm90aGVyIFZOb2RlIGluIHRoZSBkaWZmICovXG5leHBvcnQgY29uc3QgTUFUQ0hFRCA9IDEgPDwgMTc7XG5cbi8qKiBSZXNldCBhbGwgbW9kZSBmbGFncyAqL1xuZXhwb3J0IGNvbnN0IFJFU0VUX01PREUgPSB+KE1PREVfSFlEUkFURSB8IE1PREVfU1VTUEVOREVEKTtcblxuZXhwb3J0IGNvbnN0IEVNUFRZX09CSiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoe30pO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSUiA9IFtdO1xuZXhwb3J0IGNvbnN0IElTX05PTl9ESU1FTlNJT05BTCA9XG5cdC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7XG4iLCAiaW1wb3J0IHsgRU1QVFlfQVJSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbi8qKlxuICogQXNzaWduIHByb3BlcnRpZXMgZnJvbSBgcHJvcHNgIHRvIGBvYmpgXG4gKiBAdGVtcGxhdGUgTywgUCBUaGUgb2JqIGFuZCBwcm9wcyB0eXBlc1xuICogQHBhcmFtIHtPfSBvYmogVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG9cbiAqIEBwYXJhbSB7UH0gcHJvcHMgVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbVxuICogQHJldHVybnMge08gJiBQfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduKG9iaiwgcHJvcHMpIHtcblx0Ly8gQHRzLWV4cGVjdC1lcnJvciBXZSBjaGFuZ2UgdGhlIHR5cGUgb2YgYG9iamAgdG8gYmUgYE8gJiBQYFxuXHRmb3IgKGxldCBpIGluIHByb3BzKSBvYmpbaV0gPSBwcm9wc1tpXTtcblx0cmV0dXJuIC8qKiBAdHlwZSB7TyAmIFB9ICovIChvYmopO1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGNoaWxkIG5vZGUgZnJvbSBpdHMgcGFyZW50IGlmIGF0dGFjaGVkLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3JcbiAqIElFMTEgd2hpY2ggZG9lc24ndCBzdXBwb3J0IGBFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUoKWAuIFVzaW5nIHRoaXMgZnVuY3Rpb25cbiAqIGlzIHNtYWxsZXIgdGhhbiBpbmNsdWRpbmcgYSBkZWRpY2F0ZWQgcG9seWZpbGwuXG4gKiBAcGFyYW0ge3ByZWFjdC5Db250YWluZXJOb2RlfSBub2RlIFRoZSBub2RlIHRvIHJlbW92ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlTm9kZShub2RlKSB7XG5cdGxldCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuXHRpZiAocGFyZW50Tm9kZSkgcGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNsaWNlID0gRU1QVFlfQVJSLnNsaWNlO1xuIiwgImltcG9ydCB7IF9jYXRjaEVycm9yIH0gZnJvbSAnLi9kaWZmL2NhdGNoLWVycm9yJztcblxuLyoqXG4gKiBUaGUgYG9wdGlvbmAgb2JqZWN0IGNhbiBwb3RlbnRpYWxseSBjb250YWluIGNhbGxiYWNrIGZ1bmN0aW9uc1xuICogdGhhdCBhcmUgY2FsbGVkIGR1cmluZyB2YXJpb3VzIHN0YWdlcyBvZiBvdXIgcmVuZGVyZXIuIFRoaXMgaXMgdGhlXG4gKiBmb3VuZGF0aW9uIG9uIHdoaWNoIGFsbCBvdXIgYWRkb25zIGxpa2UgYHByZWFjdC9kZWJ1Z2AsIGBwcmVhY3QvY29tcGF0YCxcbiAqIGFuZCBgcHJlYWN0L2hvb2tzYCBhcmUgYmFzZWQgb24uIFNlZSB0aGUgYE9wdGlvbnNgIHR5cGUgaW4gYGludGVybmFsLmQudHNgXG4gKiBmb3IgYSBmdWxsIGxpc3Qgb2YgYXZhaWxhYmxlIG9wdGlvbiBob29rcyAobW9zdCBlZGl0b3JzL0lERXMgYWxsb3cgeW91IHRvXG4gKiBjdHJsK2NsaWNrIG9yIGNtZCtjbGljayBvbiBtYWMgdGhlIHR5cGUgZGVmaW5pdGlvbiBiZWxvdykuXG4gKiBAdHlwZSB7T3B0aW9uc31cbiAqL1xuY29uc3Qgb3B0aW9ucyA9IHtcblx0X2NhdGNoRXJyb3Jcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9wdGlvbnM7XG4iLCAiaW1wb3J0IHsgc2xpY2UgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcblxubGV0IHZub2RlSWQgPSAwO1xuXG4vKipcbiAqIENyZWF0ZSBhbiB2aXJ0dWFsIG5vZGUgKHVzZWQgZm9yIEpTWClcbiAqIEBwYXJhbSB7Vk5vZGVbXCJ0eXBlXCJdfSB0eXBlIFRoZSBub2RlIG5hbWUgb3IgQ29tcG9uZW50IGNvbnN0cnVjdG9yIGZvciB0aGlzXG4gKiB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0IHwgbnVsbCB8IHVuZGVmaW5lZH0gW3Byb3BzXSBUaGUgcHJvcGVydGllcyBvZiB0aGUgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge0FycmF5PGltcG9ydCgnLicpLkNvbXBvbmVudENoaWxkcmVuPn0gW2NoaWxkcmVuXSBUaGUgY2hpbGRyZW4gb2YgdGhlXG4gKiB2aXJ0dWFsIG5vZGVcbiAqIEByZXR1cm5zIHtWTm9kZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnQodHlwZSwgcHJvcHMsIGNoaWxkcmVuKSB7XG5cdGxldCBub3JtYWxpemVkUHJvcHMgPSB7fSxcblx0XHRrZXksXG5cdFx0cmVmLFxuXHRcdGk7XG5cdGZvciAoaSBpbiBwcm9wcykge1xuXHRcdGlmIChpID09ICdrZXknKSBrZXkgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChpID09ICdyZWYnKSByZWYgPSBwcm9wc1tpXTtcblx0XHRlbHNlIG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHByb3BzW2ldO1xuXHR9XG5cblx0aWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7XG5cdFx0bm9ybWFsaXplZFByb3BzLmNoaWxkcmVuID1cblx0XHRcdGFyZ3VtZW50cy5sZW5ndGggPiAzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIDogY2hpbGRyZW47XG5cdH1cblxuXHQvLyBJZiBhIENvbXBvbmVudCBWTm9kZSwgY2hlY2sgZm9yIGFuZCBhcHBseSBkZWZhdWx0UHJvcHNcblx0Ly8gTm90ZTogdHlwZSBtYXkgYmUgdW5kZWZpbmVkIGluIGRldmVsb3BtZW50LCBtdXN0IG5ldmVyIGVycm9yIGhlcmUuXG5cdGlmICh0eXBlb2YgdHlwZSA9PSAnZnVuY3Rpb24nICYmIHR5cGUuZGVmYXVsdFByb3BzICE9IG51bGwpIHtcblx0XHRmb3IgKGkgaW4gdHlwZS5kZWZhdWx0UHJvcHMpIHtcblx0XHRcdGlmIChub3JtYWxpemVkUHJvcHNbaV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRub3JtYWxpemVkUHJvcHNbaV0gPSB0eXBlLmRlZmF1bHRQcm9wc1tpXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY3JlYXRlVk5vZGUodHlwZSwgbm9ybWFsaXplZFByb3BzLCBrZXksIHJlZiwgbnVsbCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgVk5vZGUgKHVzZWQgaW50ZXJuYWxseSBieSBQcmVhY3QpXG4gKiBAcGFyYW0ge1ZOb2RlW1widHlwZVwiXX0gdHlwZSBUaGUgbm9kZSBuYW1lIG9yIENvbXBvbmVudFxuICogQ29uc3RydWN0b3IgZm9yIHRoaXMgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdCB8IHN0cmluZyB8IG51bWJlciB8IG51bGx9IHByb3BzIFRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgdmlydHVhbCBub2RlLlxuICogSWYgdGhpcyB2aXJ0dWFsIG5vZGUgcmVwcmVzZW50cyBhIHRleHQgbm9kZSwgdGhpcyBpcyB0aGUgdGV4dCBvZiB0aGUgbm9kZSAoc3RyaW5nIG9yIG51bWJlcikuXG4gKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IG51bGx9IGtleSBUaGUga2V5IGZvciB0aGlzIHZpcnR1YWwgbm9kZSwgdXNlZCB3aGVuXG4gKiBkaWZmaW5nIGl0IGFnYWluc3QgaXRzIGNoaWxkcmVuXG4gKiBAcGFyYW0ge1ZOb2RlW1wicmVmXCJdfSByZWYgVGhlIHJlZiBwcm9wZXJ0eSB0aGF0IHdpbGxcbiAqIHJlY2VpdmUgYSByZWZlcmVuY2UgdG8gaXRzIGNyZWF0ZWQgY2hpbGRcbiAqIEByZXR1cm5zIHtWTm9kZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZOb2RlKHR5cGUsIHByb3BzLCBrZXksIHJlZiwgb3JpZ2luYWwpIHtcblx0Ly8gVjggc2VlbXMgdG8gYmUgYmV0dGVyIGF0IGRldGVjdGluZyB0eXBlIHNoYXBlcyBpZiB0aGUgb2JqZWN0IGlzIGFsbG9jYXRlZCBmcm9tIHRoZSBzYW1lIGNhbGwgc2l0ZVxuXHQvLyBEbyBub3QgaW5saW5lIGludG8gY3JlYXRlRWxlbWVudCBhbmQgY29lcmNlVG9WTm9kZSFcblx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0Y29uc3Qgdm5vZGUgPSB7XG5cdFx0dHlwZSxcblx0XHRwcm9wcyxcblx0XHRrZXksXG5cdFx0cmVmLFxuXHRcdF9jaGlsZHJlbjogbnVsbCxcblx0XHRfcGFyZW50OiBudWxsLFxuXHRcdF9kZXB0aDogMCxcblx0XHRfZG9tOiBudWxsLFxuXHRcdC8vIF9uZXh0RG9tIG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gdW5kZWZpbmVkIGIvYyBpdCB3aWxsIGV2ZW50dWFsbHlcblx0XHQvLyBiZSBzZXQgdG8gZG9tLm5leHRTaWJsaW5nIHdoaWNoIGNhbiByZXR1cm4gYG51bGxgIGFuZCBpdCBpcyBpbXBvcnRhbnRcblx0XHQvLyB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYW4gdW5pbml0aWFsaXplZCBfbmV4dERvbSBhbmRcblx0XHQvLyBhIF9uZXh0RG9tIHRoYXQgaGFzIGJlZW4gc2V0IHRvIGBudWxsYFxuXHRcdF9uZXh0RG9tOiB1bmRlZmluZWQsXG5cdFx0X2NvbXBvbmVudDogbnVsbCxcblx0XHRjb25zdHJ1Y3RvcjogdW5kZWZpbmVkLFxuXHRcdF9vcmlnaW5hbDogb3JpZ2luYWwgPT0gbnVsbCA/ICsrdm5vZGVJZCA6IG9yaWdpbmFsLFxuXHRcdF9pbmRleDogLTEsXG5cdFx0X2ZsYWdzOiAwXG5cdH07XG5cblx0Ly8gT25seSBpbnZva2UgdGhlIHZub2RlIGhvb2sgaWYgdGhpcyB3YXMgKm5vdCogYSBkaXJlY3QgY29weTpcblx0aWYgKG9yaWdpbmFsID09IG51bGwgJiYgb3B0aW9ucy52bm9kZSAhPSBudWxsKSBvcHRpb25zLnZub2RlKHZub2RlKTtcblxuXHRyZXR1cm4gdm5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWYoKSB7XG5cdHJldHVybiB7IGN1cnJlbnQ6IG51bGwgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIEZyYWdtZW50KHByb3BzKSB7XG5cdHJldHVybiBwcm9wcy5jaGlsZHJlbjtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHRoZSBhcmd1bWVudCBpcyBhIHZhbGlkIFByZWFjdCBWTm9kZS5cbiAqIEBwYXJhbSB7Kn0gdm5vZGVcbiAqIEByZXR1cm5zIHt2bm9kZSBpcyBWTm9kZX1cbiAqL1xuZXhwb3J0IGNvbnN0IGlzVmFsaWRFbGVtZW50ID0gdm5vZGUgPT5cblx0dm5vZGUgIT0gbnVsbCAmJiB2bm9kZS5jb25zdHJ1Y3RvciA9PSB1bmRlZmluZWQ7XG4iLCAiaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGRpZmYsIGNvbW1pdFJvb3QgfSBmcm9tICcuL2RpZmYvaW5kZXgnO1xuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBNT0RFX0hZRFJBVEUgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQmFzZSBDb21wb25lbnQgY2xhc3MuIFByb3ZpZGVzIGBzZXRTdGF0ZSgpYCBhbmQgYGZvcmNlVXBkYXRlKClgLCB3aGljaFxuICogdHJpZ2dlciByZW5kZXJpbmdcbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBUaGUgaW5pdGlhbCBjb21wb25lbnQgcHJvcHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBjb250ZXh0IFRoZSBpbml0aWFsIGNvbnRleHQgZnJvbSBwYXJlbnQgY29tcG9uZW50cydcbiAqIGdldENoaWxkQ29udGV4dFxuICovXG5leHBvcnQgZnVuY3Rpb24gQmFzZUNvbXBvbmVudChwcm9wcywgY29udGV4dCkge1xuXHR0aGlzLnByb3BzID0gcHJvcHM7XG5cdHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG59XG5cbi8qKlxuICogVXBkYXRlIGNvbXBvbmVudCBzdGF0ZSBhbmQgc2NoZWR1bGUgYSByZS1yZW5kZXIuXG4gKiBAdGhpcyB7Q29tcG9uZW50fVxuICogQHBhcmFtIHtvYmplY3QgfCAoKHM6IG9iamVjdCwgcDogb2JqZWN0KSA9PiBvYmplY3QpfSB1cGRhdGUgQSBoYXNoIG9mIHN0YXRlXG4gKiBwcm9wZXJ0aWVzIHRvIHVwZGF0ZSB3aXRoIG5ldyB2YWx1ZXMgb3IgYSBmdW5jdGlvbiB0aGF0IGdpdmVuIHRoZSBjdXJyZW50XG4gKiBzdGF0ZSBhbmQgcHJvcHMgcmV0dXJucyBhIG5ldyBwYXJ0aWFsIHN0YXRlXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IFtjYWxsYmFja10gQSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb25jZSBjb21wb25lbnQgc3RhdGUgaXNcbiAqIHVwZGF0ZWRcbiAqL1xuQmFzZUNvbXBvbmVudC5wcm90b3R5cGUuc2V0U3RhdGUgPSBmdW5jdGlvbiAodXBkYXRlLCBjYWxsYmFjaykge1xuXHQvLyBvbmx5IGNsb25lIHN0YXRlIHdoZW4gY29weWluZyB0byBuZXh0U3RhdGUgdGhlIGZpcnN0IHRpbWUuXG5cdGxldCBzO1xuXHRpZiAodGhpcy5fbmV4dFN0YXRlICE9IG51bGwgJiYgdGhpcy5fbmV4dFN0YXRlICE9PSB0aGlzLnN0YXRlKSB7XG5cdFx0cyA9IHRoaXMuX25leHRTdGF0ZTtcblx0fSBlbHNlIHtcblx0XHRzID0gdGhpcy5fbmV4dFN0YXRlID0gYXNzaWduKHt9LCB0aGlzLnN0YXRlKTtcblx0fVxuXG5cdGlmICh0eXBlb2YgdXBkYXRlID09ICdmdW5jdGlvbicpIHtcblx0XHQvLyBTb21lIGxpYnJhcmllcyBsaWtlIGBpbW1lcmAgbWFyayB0aGUgY3VycmVudCBzdGF0ZSBhcyByZWFkb25seSxcblx0XHQvLyBwcmV2ZW50aW5nIHVzIGZyb20gbXV0YXRpbmcgaXQsIHNvIHdlIG5lZWQgdG8gY2xvbmUgaXQuIFNlZSAjMjcxNlxuXHRcdHVwZGF0ZSA9IHVwZGF0ZShhc3NpZ24oe30sIHMpLCB0aGlzLnByb3BzKTtcblx0fVxuXG5cdGlmICh1cGRhdGUpIHtcblx0XHRhc3NpZ24ocywgdXBkYXRlKTtcblx0fVxuXG5cdC8vIFNraXAgdXBkYXRlIGlmIHVwZGF0ZXIgZnVuY3Rpb24gcmV0dXJuZWQgbnVsbFxuXHRpZiAodXBkYXRlID09IG51bGwpIHJldHVybjtcblxuXHRpZiAodGhpcy5fdm5vZGUpIHtcblx0XHRpZiAoY2FsbGJhY2spIHtcblx0XHRcdHRoaXMuX3N0YXRlQ2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuXHRcdH1cblx0XHRlbnF1ZXVlUmVuZGVyKHRoaXMpO1xuXHR9XG59O1xuXG4vKipcbiAqIEltbWVkaWF0ZWx5IHBlcmZvcm0gYSBzeW5jaHJvbm91cyByZS1yZW5kZXIgb2YgdGhlIGNvbXBvbmVudFxuICogQHRoaXMge0NvbXBvbmVudH1cbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gW2NhbGxiYWNrXSBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciBjb21wb25lbnQgaXNcbiAqIHJlLXJlbmRlcmVkXG4gKi9cbkJhc2VDb21wb25lbnQucHJvdG90eXBlLmZvcmNlVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG5cdGlmICh0aGlzLl92bm9kZSkge1xuXHRcdC8vIFNldCByZW5kZXIgbW9kZSBzbyB0aGF0IHdlIGNhbiBkaWZmZXJlbnRpYXRlIHdoZXJlIHRoZSByZW5kZXIgcmVxdWVzdFxuXHRcdC8vIGlzIGNvbWluZyBmcm9tLiBXZSBuZWVkIHRoaXMgYmVjYXVzZSBmb3JjZVVwZGF0ZSBzaG91bGQgbmV2ZXIgY2FsbFxuXHRcdC8vIHNob3VsZENvbXBvbmVudFVwZGF0ZVxuXHRcdHRoaXMuX2ZvcmNlID0gdHJ1ZTtcblx0XHRpZiAoY2FsbGJhY2spIHRoaXMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcblx0XHRlbnF1ZXVlUmVuZGVyKHRoaXMpO1xuXHR9XG59O1xuXG4vKipcbiAqIEFjY2VwdHMgYHByb3BzYCBhbmQgYHN0YXRlYCwgYW5kIHJldHVybnMgYSBuZXcgVmlydHVhbCBET00gdHJlZSB0byBidWlsZC5cbiAqIFZpcnR1YWwgRE9NIGlzIGdlbmVyYWxseSBjb25zdHJ1Y3RlZCB2aWEgW0pTWF0oaHR0cDovL2phc29uZm9ybWF0LmNvbS93dGYtaXMtanN4KS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBwcm9wcyBQcm9wcyAoZWc6IEpTWCBhdHRyaWJ1dGVzKSByZWNlaXZlZCBmcm9tIHBhcmVudFxuICogZWxlbWVudC9jb21wb25lbnRcbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZSBUaGUgY29tcG9uZW50J3MgY3VycmVudCBzdGF0ZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbnRleHQgQ29udGV4dCBvYmplY3QsIGFzIHJldHVybmVkIGJ5IHRoZSBuZWFyZXN0XG4gKiBhbmNlc3RvcidzIGBnZXRDaGlsZENvbnRleHQoKWBcbiAqIEByZXR1cm5zIHtDb21wb25lbnRDaGlsZHJlbiB8IHZvaWR9XG4gKi9cbkJhc2VDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IEZyYWdtZW50O1xuXG4vKipcbiAqIEBwYXJhbSB7Vk5vZGV9IHZub2RlXG4gKiBAcGFyYW0ge251bWJlciB8IG51bGx9IFtjaGlsZEluZGV4XVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RG9tU2libGluZyh2bm9kZSwgY2hpbGRJbmRleCkge1xuXHRpZiAoY2hpbGRJbmRleCA9PSBudWxsKSB7XG5cdFx0Ly8gVXNlIGNoaWxkSW5kZXg9PW51bGwgYXMgYSBzaWduYWwgdG8gcmVzdW1lIHRoZSBzZWFyY2ggZnJvbSB0aGUgdm5vZGUncyBzaWJsaW5nXG5cdFx0cmV0dXJuIHZub2RlLl9wYXJlbnRcblx0XHRcdD8gZ2V0RG9tU2libGluZyh2bm9kZS5fcGFyZW50LCB2bm9kZS5faW5kZXggKyAxKVxuXHRcdFx0OiBudWxsO1xuXHR9XG5cblx0bGV0IHNpYmxpbmc7XG5cdGZvciAoOyBjaGlsZEluZGV4IDwgdm5vZGUuX2NoaWxkcmVuLmxlbmd0aDsgY2hpbGRJbmRleCsrKSB7XG5cdFx0c2libGluZyA9IHZub2RlLl9jaGlsZHJlbltjaGlsZEluZGV4XTtcblxuXHRcdGlmIChzaWJsaW5nICE9IG51bGwgJiYgc2libGluZy5fZG9tICE9IG51bGwpIHtcblx0XHRcdC8vIFNpbmNlIHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzIGtlZXBzIF9kb20gcG9pbnRlciBjb3JyZWN0LFxuXHRcdFx0Ly8gd2UgY2FuIHJlbHkgb24gX2RvbSB0byB0ZWxsIHVzIGlmIHRoaXMgc3VidHJlZSBjb250YWlucyBhXG5cdFx0XHQvLyByZW5kZXJlZCBET00gbm9kZSwgYW5kIHdoYXQgdGhlIGZpcnN0IHJlbmRlcmVkIERPTSBub2RlIGlzXG5cdFx0XHRyZXR1cm4gc2libGluZy5fZG9tO1xuXHRcdH1cblx0fVxuXG5cdC8vIElmIHdlIGdldCBoZXJlLCB3ZSBoYXZlIG5vdCBmb3VuZCBhIERPTSBub2RlIGluIHRoaXMgdm5vZGUncyBjaGlsZHJlbi5cblx0Ly8gV2UgbXVzdCByZXN1bWUgZnJvbSB0aGlzIHZub2RlJ3Mgc2libGluZyAoaW4gaXQncyBwYXJlbnQgX2NoaWxkcmVuIGFycmF5KVxuXHQvLyBPbmx5IGNsaW1iIHVwIGFuZCBzZWFyY2ggdGhlIHBhcmVudCBpZiB3ZSBhcmVuJ3Qgc2VhcmNoaW5nIHRocm91Z2ggYSBET01cblx0Ly8gVk5vZGUgKG1lYW5pbmcgd2UgcmVhY2hlZCB0aGUgRE9NIHBhcmVudCBvZiB0aGUgb3JpZ2luYWwgdm5vZGUgdGhhdCBiZWdhblxuXHQvLyB0aGUgc2VhcmNoKVxuXHRyZXR1cm4gdHlwZW9mIHZub2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyA/IGdldERvbVNpYmxpbmcodm5vZGUpIDogbnVsbDtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGluLXBsYWNlIHJlLXJlbmRlcmluZyBvZiBhIGNvbXBvbmVudC5cbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgVGhlIGNvbXBvbmVudCB0byByZXJlbmRlclxuICovXG5mdW5jdGlvbiByZW5kZXJDb21wb25lbnQoY29tcG9uZW50KSB7XG5cdGxldCBvbGRWTm9kZSA9IGNvbXBvbmVudC5fdm5vZGUsXG5cdFx0b2xkRG9tID0gb2xkVk5vZGUuX2RvbSxcblx0XHRwYXJlbnREb20gPSBjb21wb25lbnQuX3BhcmVudERvbSxcblx0XHRjb21taXRRdWV1ZSA9IFtdLFxuXHRcdHJlZlF1ZXVlID0gW107XG5cblx0aWYgKHBhcmVudERvbSkge1xuXHRcdGNvbnN0IG5ld1ZOb2RlID0gYXNzaWduKHt9LCBvbGRWTm9kZSk7XG5cdFx0bmV3Vk5vZGUuX29yaWdpbmFsID0gb2xkVk5vZGUuX29yaWdpbmFsICsgMTtcblx0XHRpZiAob3B0aW9ucy52bm9kZSkgb3B0aW9ucy52bm9kZShuZXdWTm9kZSk7XG5cblx0XHRkaWZmKFxuXHRcdFx0cGFyZW50RG9tLFxuXHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRvbGRWTm9kZSxcblx0XHRcdGNvbXBvbmVudC5fZ2xvYmFsQ29udGV4dCxcblx0XHRcdHBhcmVudERvbS5vd25lclNWR0VsZW1lbnQgIT09IHVuZGVmaW5lZCxcblx0XHRcdG9sZFZOb2RlLl9mbGFncyAmIE1PREVfSFlEUkFURSA/IFtvbGREb21dIDogbnVsbCxcblx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0b2xkRG9tID09IG51bGwgPyBnZXREb21TaWJsaW5nKG9sZFZOb2RlKSA6IG9sZERvbSxcblx0XHRcdCEhKG9sZFZOb2RlLl9mbGFncyAmIE1PREVfSFlEUkFURSksXG5cdFx0XHRyZWZRdWV1ZVxuXHRcdCk7XG5cblx0XHRuZXdWTm9kZS5fcGFyZW50Ll9jaGlsZHJlbltuZXdWTm9kZS5faW5kZXhdID0gbmV3Vk5vZGU7XG5cdFx0Y29tbWl0Um9vdChjb21taXRRdWV1ZSwgbmV3Vk5vZGUsIHJlZlF1ZXVlKTtcblxuXHRcdGlmIChuZXdWTm9kZS5fZG9tICE9IG9sZERvbSkge1xuXHRcdFx0dXBkYXRlUGFyZW50RG9tUG9pbnRlcnMobmV3Vk5vZGUpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEBwYXJhbSB7Vk5vZGV9IHZub2RlXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZVBhcmVudERvbVBvaW50ZXJzKHZub2RlKSB7XG5cdGlmICgodm5vZGUgPSB2bm9kZS5fcGFyZW50KSAhPSBudWxsICYmIHZub2RlLl9jb21wb25lbnQgIT0gbnVsbCkge1xuXHRcdHZub2RlLl9kb20gPSB2bm9kZS5fY29tcG9uZW50LmJhc2UgPSBudWxsO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdm5vZGUuX2NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsZXQgY2hpbGQgPSB2bm9kZS5fY2hpbGRyZW5baV07XG5cdFx0XHRpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5fZG9tICE9IG51bGwpIHtcblx0XHRcdFx0dm5vZGUuX2RvbSA9IHZub2RlLl9jb21wb25lbnQuYmFzZSA9IGNoaWxkLl9kb207XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB1cGRhdGVQYXJlbnREb21Qb2ludGVycyh2bm9kZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBUaGUgcmVuZGVyIHF1ZXVlXG4gKiBAdHlwZSB7QXJyYXk8Q29tcG9uZW50Pn1cbiAqL1xubGV0IHJlcmVuZGVyUXVldWUgPSBbXTtcblxuLypcbiAqIFRoZSB2YWx1ZSBvZiBgQ29tcG9uZW50LmRlYm91bmNlYCBtdXN0IGFzeW5jaHJvbm91c2x5IGludm9rZSB0aGUgcGFzc2VkIGluIGNhbGxiYWNrLiBJdCBpc1xuICogaW1wb3J0YW50IHRoYXQgY29udHJpYnV0b3JzIHRvIFByZWFjdCBjYW4gY29uc2lzdGVudGx5IHJlYXNvbiBhYm91dCB3aGF0IGNhbGxzIHRvIGBzZXRTdGF0ZWAsIGV0Yy5cbiAqIGRvLCBhbmQgd2hlbiB0aGVpciBlZmZlY3RzIHdpbGwgYmUgYXBwbGllZC4gU2VlIHRoZSBsaW5rcyBiZWxvdyBmb3Igc29tZSBmdXJ0aGVyIHJlYWRpbmcgb24gZGVzaWduaW5nXG4gKiBhc3luY2hyb25vdXMgQVBJcy5cbiAqICogW0Rlc2lnbmluZyBBUElzIGZvciBBc3luY2hyb255XShodHRwczovL2Jsb2cuaXpzLm1lLzIwMTMvMDgvZGVzaWduaW5nLWFwaXMtZm9yLWFzeW5jaHJvbnkpXG4gKiAqIFtDYWxsYmFja3Mgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91c10oaHR0cHM6Ly9ibG9nLm9tZXRlci5jb20vMjAxMS8wNy8yNC9jYWxsYmFja3Mtc3luY2hyb25vdXMtYW5kLWFzeW5jaHJvbm91cy8pXG4gKi9cblxubGV0IHByZXZEZWJvdW5jZTtcblxuY29uc3QgZGVmZXIgPVxuXHR0eXBlb2YgUHJvbWlzZSA9PSAnZnVuY3Rpb24nXG5cdFx0PyBQcm9taXNlLnByb3RvdHlwZS50aGVuLmJpbmQoUHJvbWlzZS5yZXNvbHZlKCkpXG5cdFx0OiBzZXRUaW1lb3V0O1xuXG4vKipcbiAqIEVucXVldWUgYSByZXJlbmRlciBvZiBhIGNvbXBvbmVudFxuICogQHBhcmFtIHtDb21wb25lbnR9IGMgVGhlIGNvbXBvbmVudCB0byByZXJlbmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5xdWV1ZVJlbmRlcihjKSB7XG5cdGlmIChcblx0XHQoIWMuX2RpcnR5ICYmXG5cdFx0XHQoYy5fZGlydHkgPSB0cnVlKSAmJlxuXHRcdFx0cmVyZW5kZXJRdWV1ZS5wdXNoKGMpICYmXG5cdFx0XHQhcHJvY2Vzcy5fcmVyZW5kZXJDb3VudCsrKSB8fFxuXHRcdHByZXZEZWJvdW5jZSAhPT0gb3B0aW9ucy5kZWJvdW5jZVJlbmRlcmluZ1xuXHQpIHtcblx0XHRwcmV2RGVib3VuY2UgPSBvcHRpb25zLmRlYm91bmNlUmVuZGVyaW5nO1xuXHRcdChwcmV2RGVib3VuY2UgfHwgZGVmZXIpKHByb2Nlc3MpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtDb21wb25lbnR9IGFcbiAqIEBwYXJhbSB7Q29tcG9uZW50fSBiXG4gKi9cbmNvbnN0IGRlcHRoU29ydCA9IChhLCBiKSA9PiBhLl92bm9kZS5fZGVwdGggLSBiLl92bm9kZS5fZGVwdGg7XG5cbi8qKiBGbHVzaCB0aGUgcmVuZGVyIHF1ZXVlIGJ5IHJlcmVuZGVyaW5nIGFsbCBxdWV1ZWQgY29tcG9uZW50cyAqL1xuZnVuY3Rpb24gcHJvY2VzcygpIHtcblx0bGV0IGM7XG5cdHJlcmVuZGVyUXVldWUuc29ydChkZXB0aFNvcnQpO1xuXHQvLyBEb24ndCB1cGRhdGUgYHJlbmRlckNvdW50YCB5ZXQuIEtlZXAgaXRzIHZhbHVlIG5vbi16ZXJvIHRvIHByZXZlbnQgdW5uZWNlc3Nhcnlcblx0Ly8gcHJvY2VzcygpIGNhbGxzIGZyb20gZ2V0dGluZyBzY2hlZHVsZWQgd2hpbGUgYHF1ZXVlYCBpcyBzdGlsbCBiZWluZyBjb25zdW1lZC5cblx0d2hpbGUgKChjID0gcmVyZW5kZXJRdWV1ZS5zaGlmdCgpKSkge1xuXHRcdGlmIChjLl9kaXJ0eSkge1xuXHRcdFx0bGV0IHJlbmRlclF1ZXVlTGVuZ3RoID0gcmVyZW5kZXJRdWV1ZS5sZW5ndGg7XG5cdFx0XHRyZW5kZXJDb21wb25lbnQoYyk7XG5cdFx0XHRpZiAocmVyZW5kZXJRdWV1ZS5sZW5ndGggPiByZW5kZXJRdWV1ZUxlbmd0aCkge1xuXHRcdFx0XHQvLyBXaGVuIGkuZS4gcmVyZW5kZXJpbmcgYSBwcm92aWRlciBhZGRpdGlvbmFsIG5ldyBpdGVtcyBjYW4gYmUgaW5qZWN0ZWQsIHdlIHdhbnQgdG9cblx0XHRcdFx0Ly8ga2VlcCB0aGUgb3JkZXIgZnJvbSB0b3AgdG8gYm90dG9tIHdpdGggdGhvc2UgbmV3IGl0ZW1zIHNvIHdlIGNhbiBoYW5kbGUgdGhlbSBpbiBhXG5cdFx0XHRcdC8vIHNpbmdsZSBwYXNzXG5cdFx0XHRcdHJlcmVuZGVyUXVldWUuc29ydChkZXB0aFNvcnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRwcm9jZXNzLl9yZXJlbmRlckNvdW50ID0gMDtcbn1cblxucHJvY2Vzcy5fcmVyZW5kZXJDb3VudCA9IDA7XG4iLCAiaW1wb3J0IHsgZW5xdWV1ZVJlbmRlciB9IGZyb20gJy4vY29tcG9uZW50JztcblxuZXhwb3J0IGxldCBpID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbnRleHQoZGVmYXVsdFZhbHVlLCBjb250ZXh0SWQpIHtcblx0Y29udGV4dElkID0gJ19fY0MnICsgaSsrO1xuXG5cdGNvbnN0IGNvbnRleHQgPSB7XG5cdFx0X2lkOiBjb250ZXh0SWQsXG5cdFx0X2RlZmF1bHRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuXHRcdC8qKiBAdHlwZSB7RnVuY3Rpb25Db21wb25lbnR9ICovXG5cdFx0Q29uc3VtZXIocHJvcHMsIGNvbnRleHRWYWx1ZSkge1xuXHRcdFx0Ly8gcmV0dXJuIHByb3BzLmNoaWxkcmVuKFxuXHRcdFx0Ly8gXHRjb250ZXh0W2NvbnRleHRJZF0gPyBjb250ZXh0W2NvbnRleHRJZF0ucHJvcHMudmFsdWUgOiBkZWZhdWx0VmFsdWVcblx0XHRcdC8vICk7XG5cdFx0XHRyZXR1cm4gcHJvcHMuY2hpbGRyZW4oY29udGV4dFZhbHVlKTtcblx0XHR9LFxuXHRcdC8qKiBAdHlwZSB7RnVuY3Rpb25Db21wb25lbnR9ICovXG5cdFx0UHJvdmlkZXIocHJvcHMpIHtcblx0XHRcdGlmICghdGhpcy5nZXRDaGlsZENvbnRleHQpIHtcblx0XHRcdFx0LyoqIEB0eXBlIHtDb21wb25lbnRbXX0gKi9cblx0XHRcdFx0bGV0IHN1YnMgPSBbXTtcblx0XHRcdFx0bGV0IGN0eCA9IHt9O1xuXHRcdFx0XHRjdHhbY29udGV4dElkXSA9IHRoaXM7XG5cblx0XHRcdFx0dGhpcy5nZXRDaGlsZENvbnRleHQgPSAoKSA9PiBjdHg7XG5cblx0XHRcdFx0dGhpcy5zaG91bGRDb21wb25lbnRVcGRhdGUgPSBmdW5jdGlvbiAoX3Byb3BzKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMucHJvcHMudmFsdWUgIT09IF9wcm9wcy52YWx1ZSkge1xuXHRcdFx0XHRcdFx0Ly8gSSB0aGluayB0aGUgZm9yY2VkIHZhbHVlIHByb3BhZ2F0aW9uIGhlcmUgd2FzIG9ubHkgbmVlZGVkIHdoZW4gYG9wdGlvbnMuZGVib3VuY2VSZW5kZXJpbmdgIHdhcyBiZWluZyBieXBhc3NlZDpcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmVhY3Rqcy9wcmVhY3QvY29tbWl0LzRkMzM5ZmI4MDNiZWEwOWU5ZjE5OGFiZjM4Y2ExYmY4ZWE0Yjc3NzEjZGlmZi01NDY4MmNlMzgwOTM1YTcxN2U0MWI4YmZjNTQ3MzdmNlIzNThcblx0XHRcdFx0XHRcdC8vIEluIHRob3NlIGNhc2VzIHRob3VnaCwgZXZlbiB3aXRoIHRoZSB2YWx1ZSBjb3JyZWN0ZWQsIHdlJ3JlIGRvdWJsZS1yZW5kZXJpbmcgYWxsIG5vZGVzLlxuXHRcdFx0XHRcdFx0Ly8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGp1c3QgdGVsbCBmb2xrcyBub3QgdG8gdXNlIGZvcmNlLXN5bmMgbW9kZS5cblx0XHRcdFx0XHRcdC8vIEN1cnJlbnRseSwgdXNpbmcgYHVzZUNvbnRleHQoKWAgaW4gYSBjbGFzcyBjb21wb25lbnQgd2lsbCBvdmVyd3JpdGUgaXRzIGB0aGlzLmNvbnRleHRgIHZhbHVlLlxuXHRcdFx0XHRcdFx0Ly8gc3Vicy5zb21lKGMgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gXHRjLmNvbnRleHQgPSBfcHJvcHMudmFsdWU7XG5cdFx0XHRcdFx0XHQvLyBcdGVucXVldWVSZW5kZXIoYyk7XG5cdFx0XHRcdFx0XHQvLyB9KTtcblxuXHRcdFx0XHRcdFx0Ly8gc3Vicy5zb21lKGMgPT4ge1xuXHRcdFx0XHRcdFx0Ly8gXHRjLmNvbnRleHRbY29udGV4dElkXSA9IF9wcm9wcy52YWx1ZTtcblx0XHRcdFx0XHRcdC8vIFx0ZW5xdWV1ZVJlbmRlcihjKTtcblx0XHRcdFx0XHRcdC8vIH0pO1xuXHRcdFx0XHRcdFx0c3Vicy5zb21lKGMgPT4ge1xuXHRcdFx0XHRcdFx0XHRjLl9mb3JjZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdGVucXVldWVSZW5kZXIoYyk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dGhpcy5zdWIgPSBjID0+IHtcblx0XHRcdFx0XHRzdWJzLnB1c2goYyk7XG5cdFx0XHRcdFx0bGV0IG9sZCA9IGMuY29tcG9uZW50V2lsbFVubW91bnQ7XG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsVW5tb3VudCA9ICgpID0+IHtcblx0XHRcdFx0XHRcdHN1YnMuc3BsaWNlKHN1YnMuaW5kZXhPZihjKSwgMSk7XG5cdFx0XHRcdFx0XHRpZiAob2xkKSBvbGQuY2FsbChjKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcHJvcHMuY2hpbGRyZW47XG5cdFx0fVxuXHR9O1xuXG5cdC8vIERldnRvb2xzIG5lZWRzIGFjY2VzcyB0byB0aGUgY29udGV4dCBvYmplY3Qgd2hlbiBpdFxuXHQvLyBlbmNvdW50ZXJzIGEgUHJvdmlkZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnRcblx0Ly8gc2V0dGluZyBgZGlzcGxheU5hbWVgIG9uIHRoZSBjb250ZXh0IG9iamVjdCBpbnN0ZWFkXG5cdC8vIG9mIG9uIHRoZSBjb21wb25lbnQgaXRzZWxmLiBTZWU6XG5cdC8vIGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9jb250ZXh0Lmh0bWwjY29udGV4dGRpc3BsYXluYW1lXG5cblx0cmV0dXJuIChjb250ZXh0LlByb3ZpZGVyLl9jb250ZXh0UmVmID0gY29udGV4dC5Db25zdW1lci5jb250ZXh0VHlwZSA9XG5cdFx0Y29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHsgZGlmZiwgdW5tb3VudCwgYXBwbHlSZWYgfSBmcm9tICcuL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZVZOb2RlLCBGcmFnbWVudCB9IGZyb20gJy4uL2NyZWF0ZS1lbGVtZW50JztcbmltcG9ydCB7IEVNUFRZX09CSiwgRU1QVFlfQVJSLCBJTlNFUlRfVk5PREUsIE1BVENIRUQgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgaXNBcnJheSB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgZ2V0RG9tU2libGluZyB9IGZyb20gJy4uL2NvbXBvbmVudCc7XG5cbi8qKlxuICogRGlmZiB0aGUgY2hpbGRyZW4gb2YgYSB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gcGFyZW50RG9tIFRoZSBET00gZWxlbWVudCB3aG9zZSBjaGlsZHJlbiBhcmUgYmVpbmdcbiAqIGRpZmZlZFxuICogQHBhcmFtIHtDb21wb25lbnRDaGlsZHJlbltdfSByZW5kZXJSZXN1bHRcbiAqIEBwYXJhbSB7Vk5vZGV9IG5ld1BhcmVudFZOb2RlIFRoZSBuZXcgdmlydHVhbCBub2RlIHdob3NlIGNoaWxkcmVuIHNob3VsZCBiZVxuICogZGlmZidlZCBhZ2FpbnN0IG9sZFBhcmVudFZOb2RlXG4gKiBAcGFyYW0ge1ZOb2RlfSBvbGRQYXJlbnRWTm9kZSBUaGUgb2xkIHZpcnR1YWwgbm9kZSB3aG9zZSBjaGlsZHJlbiBzaG91bGQgYmVcbiAqIGRpZmYnZWQgYWdhaW5zdCBuZXdQYXJlbnRWTm9kZVxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbENvbnRleHQgVGhlIGN1cnJlbnQgY29udGV4dCBvYmplY3QgLSBtb2RpZmllZCBieVxuICogZ2V0Q2hpbGRDb250ZXh0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3ZnIFdoZXRoZXIgb3Igbm90IHRoaXMgRE9NIG5vZGUgaXMgYW4gU1ZHIG5vZGVcbiAqIEBwYXJhbSB7QXJyYXk8UHJlYWN0RWxlbWVudD59IGV4Y2Vzc0RvbUNoaWxkcmVuXG4gKiBAcGFyYW0ge0FycmF5PENvbXBvbmVudD59IGNvbW1pdFF1ZXVlIExpc3Qgb2YgY29tcG9uZW50cyB3aGljaCBoYXZlIGNhbGxiYWNrc1xuICogdG8gaW52b2tlIGluIGNvbW1pdFJvb3RcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gb2xkRG9tIFRoZSBjdXJyZW50IGF0dGFjaGVkIERPTSBlbGVtZW50IGFueSBuZXcgZG9tXG4gKiBlbGVtZW50cyBzaG91bGQgYmUgcGxhY2VkIGFyb3VuZC4gTGlrZWx5IGBudWxsYCBvbiBmaXJzdCByZW5kZXIgKGV4Y2VwdCB3aGVuXG4gKiBoeWRyYXRpbmcpLiBDYW4gYmUgYSBzaWJsaW5nIERPTSBlbGVtZW50IHdoZW4gZGlmZmluZyBGcmFnbWVudHMgdGhhdCBoYXZlXG4gKiBzaWJsaW5ncy4gSW4gbW9zdCBjYXNlcywgaXQgc3RhcnRzIG91dCBhcyBgb2xkQ2hpbGRyZW5bMF0uX2RvbWAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzSHlkcmF0aW5nIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBoeWRyYXRpb25cbiAqIEBwYXJhbSB7YW55W119IHJlZlF1ZXVlIGFuIGFycmF5IG9mIGVsZW1lbnRzIG5lZWRlZCB0byBpbnZva2UgcmVmc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZkNoaWxkcmVuKFxuXHRwYXJlbnREb20sXG5cdHJlbmRlclJlc3VsdCxcblx0bmV3UGFyZW50Vk5vZGUsXG5cdG9sZFBhcmVudFZOb2RlLFxuXHRnbG9iYWxDb250ZXh0LFxuXHRpc1N2Zyxcblx0ZXhjZXNzRG9tQ2hpbGRyZW4sXG5cdGNvbW1pdFF1ZXVlLFxuXHRvbGREb20sXG5cdGlzSHlkcmF0aW5nLFxuXHRyZWZRdWV1ZVxuKSB7XG5cdGxldCBpLFxuXHRcdC8qKiBAdHlwZSB7Vk5vZGV9ICovXG5cdFx0b2xkVk5vZGUsXG5cdFx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0XHRjaGlsZFZOb2RlLFxuXHRcdC8qKiBAdHlwZSB7UHJlYWN0RWxlbWVudH0gKi9cblx0XHRuZXdEb20sXG5cdFx0LyoqIEB0eXBlIHtQcmVhY3RFbGVtZW50fSAqL1xuXHRcdGZpcnN0Q2hpbGREb207XG5cblx0Ly8gVGhpcyBpcyBhIGNvbXByZXNzaW9uIG9mIG9sZFBhcmVudFZOb2RlIT1udWxsICYmIG9sZFBhcmVudFZOb2RlICE9IEVNUFRZX09CSiAmJiBvbGRQYXJlbnRWTm9kZS5fY2hpbGRyZW4gfHwgRU1QVFlfQVJSXG5cdC8vIGFzIEVNUFRZX09CSi5fY2hpbGRyZW4gc2hvdWxkIGJlIGB1bmRlZmluZWRgLlxuXHQvKiogQHR5cGUge1ZOb2RlW119ICovXG5cdGxldCBvbGRDaGlsZHJlbiA9IChvbGRQYXJlbnRWTm9kZSAmJiBvbGRQYXJlbnRWTm9kZS5fY2hpbGRyZW4pIHx8IEVNUFRZX0FSUjtcblxuXHRsZXQgbmV3Q2hpbGRyZW5MZW5ndGggPSByZW5kZXJSZXN1bHQubGVuZ3RoO1xuXG5cdG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tID0gb2xkRG9tO1xuXHRjb25zdHJ1Y3ROZXdDaGlsZHJlbkFycmF5KG5ld1BhcmVudFZOb2RlLCByZW5kZXJSZXN1bHQsIG9sZENoaWxkcmVuKTtcblx0b2xkRG9tID0gbmV3UGFyZW50Vk5vZGUuX25leHREb207XG5cblx0Zm9yIChpID0gMDsgaSA8IG5ld0NoaWxkcmVuTGVuZ3RoOyBpKyspIHtcblx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldO1xuXG5cdFx0aWYgKFxuXHRcdFx0Y2hpbGRWTm9kZSA9PSBudWxsIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnYm9vbGVhbicgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdmdW5jdGlvbidcblx0XHQpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdC8vIEF0IHRoaXMgcG9pbnQsIGNvbnN0cnVjdE5ld0NoaWxkcmVuQXJyYXkgaGFzIGFzc2lnbmVkIF9pbmRleCB0byBiZSB0aGVcblx0XHQvLyBtYXRjaGluZ0luZGV4IGZvciB0aGlzIFZOb2RlJ3Mgb2xkVk5vZGUgKG9yIC0xIGlmIHRoZXJlIGlzIG5vIG9sZFZOb2RlKS5cblx0XHRpZiAoY2hpbGRWTm9kZS5faW5kZXggPT09IC0xKSB7XG5cdFx0XHRvbGRWTm9kZSA9IEVNUFRZX09CSjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlbltjaGlsZFZOb2RlLl9pbmRleF0gfHwgRU1QVFlfT0JKO1xuXHRcdH1cblxuXHRcdC8vIFVwZGF0ZSBjaGlsZFZOb2RlLl9pbmRleCB0byBpdHMgZmluYWwgaW5kZXhcblx0XHRjaGlsZFZOb2RlLl9pbmRleCA9IGk7XG5cblx0XHQvLyBNb3JwaCB0aGUgb2xkIGVsZW1lbnQgaW50byB0aGUgbmV3IG9uZSwgYnV0IGRvbid0IGFwcGVuZCBpdCB0byB0aGUgZG9tIHlldFxuXHRcdGRpZmYoXG5cdFx0XHRwYXJlbnREb20sXG5cdFx0XHRjaGlsZFZOb2RlLFxuXHRcdFx0b2xkVk5vZGUsXG5cdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0aXNTdmcsXG5cdFx0XHRleGNlc3NEb21DaGlsZHJlbixcblx0XHRcdGNvbW1pdFF1ZXVlLFxuXHRcdFx0b2xkRG9tLFxuXHRcdFx0aXNIeWRyYXRpbmcsXG5cdFx0XHRyZWZRdWV1ZVxuXHRcdCk7XG5cblx0XHQvLyBBZGp1c3QgRE9NIG5vZGVzXG5cdFx0bmV3RG9tID0gY2hpbGRWTm9kZS5fZG9tO1xuXHRcdGlmIChjaGlsZFZOb2RlLnJlZiAmJiBvbGRWTm9kZS5yZWYgIT0gY2hpbGRWTm9kZS5yZWYpIHtcblx0XHRcdGlmIChvbGRWTm9kZS5yZWYpIHtcblx0XHRcdFx0YXBwbHlSZWYob2xkVk5vZGUucmVmLCBudWxsLCBjaGlsZFZOb2RlKTtcblx0XHRcdH1cblx0XHRcdHJlZlF1ZXVlLnB1c2goXG5cdFx0XHRcdGNoaWxkVk5vZGUucmVmLFxuXHRcdFx0XHRjaGlsZFZOb2RlLl9jb21wb25lbnQgfHwgbmV3RG9tLFxuXHRcdFx0XHRjaGlsZFZOb2RlXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChmaXJzdENoaWxkRG9tID09IG51bGwgJiYgbmV3RG9tICE9IG51bGwpIHtcblx0XHRcdGZpcnN0Q2hpbGREb20gPSBuZXdEb207XG5cdFx0fVxuXG5cdFx0aWYgKFxuXHRcdFx0Y2hpbGRWTm9kZS5fZmxhZ3MgJiBJTlNFUlRfVk5PREUgfHxcblx0XHRcdG9sZFZOb2RlLl9jaGlsZHJlbiA9PT0gY2hpbGRWTm9kZS5fY2hpbGRyZW5cblx0XHQpIHtcblx0XHRcdG9sZERvbSA9IGluc2VydChjaGlsZFZOb2RlLCBvbGREb20sIHBhcmVudERvbSk7XG5cdFx0fSBlbHNlIGlmIChcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlLnR5cGUgPT0gJ2Z1bmN0aW9uJyAmJlxuXHRcdFx0Y2hpbGRWTm9kZS5fbmV4dERvbSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHQvLyBTaW5jZSBGcmFnbWVudHMgb3IgY29tcG9uZW50cyB0aGF0IHJldHVybiBGcmFnbWVudCBsaWtlIFZOb2RlcyBjYW5cblx0XHRcdC8vIGNvbnRhaW4gbXVsdGlwbGUgRE9NIG5vZGVzIGFzIHRoZSBzYW1lIGxldmVsLCBjb250aW51ZSB0aGUgZGlmZiBmcm9tXG5cdFx0XHQvLyB0aGUgc2libGluZyBvZiBsYXN0IERPTSBjaGlsZCBvZiB0aGlzIGNoaWxkIFZOb2RlXG5cdFx0XHRvbGREb20gPSBjaGlsZFZOb2RlLl9uZXh0RG9tO1xuXHRcdH0gZWxzZSBpZiAobmV3RG9tKSB7XG5cdFx0XHRvbGREb20gPSBuZXdEb20ubmV4dFNpYmxpbmc7XG5cdFx0fVxuXG5cdFx0Ly8gRWFnZXJseSBjbGVhbnVwIF9uZXh0RG9tLiBXZSBkb24ndCBuZWVkIHRvIHBlcnNpc3QgdGhlIHZhbHVlIGJlY2F1c2UgaXRcblx0XHQvLyBpcyBvbmx5IHVzZWQgYnkgYGRpZmZDaGlsZHJlbmAgdG8gZGV0ZXJtaW5lIHdoZXJlIHRvIHJlc3VtZSB0aGUgZGlmZlxuXHRcdC8vIGFmdGVyIGRpZmZpbmcgQ29tcG9uZW50cyBhbmQgRnJhZ21lbnRzLiBPbmNlIHdlIHN0b3JlIGl0IHRoZSBuZXh0RE9NXG5cdFx0Ly8gbG9jYWwgdmFyLCB3ZSBjYW4gY2xlYW4gdXAgdGhlIHByb3BlcnR5LiBBbHNvIHByZXZlbnRzIHVzIGhhbmdpbmcgb24gdG9cblx0XHQvLyBET00gbm9kZXMgdGhhdCBtYXkgaGF2ZSBiZWVuIHVubW91bnRlZC5cblx0XHRjaGlsZFZOb2RlLl9uZXh0RG9tID0gdW5kZWZpbmVkO1xuXG5cdFx0Ly8gVW5zZXQgZGlmZmluZyBmbGFnc1xuXHRcdGNoaWxkVk5vZGUuX2ZsYWdzICY9IH4oSU5TRVJUX1ZOT0RFIHwgTUFUQ0hFRCk7XG5cdH1cblxuXHQvLyBUT0RPOiBXaXRoIG5ldyBjaGlsZCBkaWZmaW5nIGFsZ28sIGNvbnNpZGVyIGFsdCB3YXlzIHRvIGRpZmYgRnJhZ21lbnRzLlxuXHQvLyBTdWNoIGFzIGRyb3BwaW5nIG9sZERvbSBhbmQgbW92aW5nIGZyYWdtZW50cyBpbiBwbGFjZVxuXHQvL1xuXHQvLyBCZWNhdXNlIHRoZSBuZXdQYXJlbnRWTm9kZSBpcyBGcmFnbWVudC1saWtlLCB3ZSBuZWVkIHRvIHNldCBpdCdzXG5cdC8vIF9uZXh0RG9tIHByb3BlcnR5IHRvIHRoZSBuZXh0U2libGluZyBvZiBpdHMgbGFzdCBjaGlsZCBET00gbm9kZS5cblx0Ly9cblx0Ly8gYG9sZERvbWAgY29udGFpbnMgdGhlIGNvcnJlY3QgdmFsdWUgaGVyZSBiZWNhdXNlIGlmIHRoZSBsYXN0IGNoaWxkXG5cdC8vIGlzIGEgRnJhZ21lbnQtbGlrZSwgdGhlbiBvbGREb20gaGFzIGFscmVhZHkgYmVlbiBzZXQgdG8gdGhhdCBjaGlsZCdzIF9uZXh0RG9tLlxuXHQvLyBJZiB0aGUgbGFzdCBjaGlsZCBpcyBhIERPTSBWTm9kZSwgdGhlbiBvbGREb20gd2lsbCBiZSBzZXQgdG8gdGhhdCBET01cblx0Ly8gbm9kZSdzIG5leHRTaWJsaW5nLlxuXHRuZXdQYXJlbnRWTm9kZS5fbmV4dERvbSA9IG9sZERvbTtcblx0bmV3UGFyZW50Vk5vZGUuX2RvbSA9IGZpcnN0Q2hpbGREb207XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gbmV3UGFyZW50Vk5vZGVcbiAqIEBwYXJhbSB7Q29tcG9uZW50Q2hpbGRyZW5bXX0gcmVuZGVyUmVzdWx0XG4gKiBAcGFyYW0ge1ZOb2RlW119IG9sZENoaWxkcmVuXG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdE5ld0NoaWxkcmVuQXJyYXkobmV3UGFyZW50Vk5vZGUsIHJlbmRlclJlc3VsdCwgb2xkQ2hpbGRyZW4pIHtcblx0LyoqIEB0eXBlIHtudW1iZXJ9ICovXG5cdGxldCBpO1xuXHQvKiogQHR5cGUge1ZOb2RlfSAqL1xuXHRsZXQgY2hpbGRWTm9kZTtcblx0LyoqIEB0eXBlIHtWTm9kZX0gKi9cblx0bGV0IG9sZFZOb2RlO1xuXG5cdGNvbnN0IG5ld0NoaWxkcmVuTGVuZ3RoID0gcmVuZGVyUmVzdWx0Lmxlbmd0aDtcblx0bGV0IG9sZENoaWxkcmVuTGVuZ3RoID0gb2xkQ2hpbGRyZW4ubGVuZ3RoLFxuXHRcdHJlbWFpbmluZ09sZENoaWxkcmVuID0gb2xkQ2hpbGRyZW5MZW5ndGg7XG5cblx0bGV0IHNrZXcgPSAwO1xuXG5cdG5ld1BhcmVudFZOb2RlLl9jaGlsZHJlbiA9IFtdO1xuXHRmb3IgKGkgPSAwOyBpIDwgbmV3Q2hpbGRyZW5MZW5ndGg7IGkrKykge1xuXHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgV2UgYXJlIHJldXNpbmcgdGhlIGNoaWxkVk5vZGUgdmFyaWFibGUgdG8gaG9sZCBib3RoIHRoZVxuXHRcdC8vIHByZSBhbmQgcG9zdCBub3JtYWxpemVkIGNoaWxkVk5vZGVcblx0XHRjaGlsZFZOb2RlID0gcmVuZGVyUmVzdWx0W2ldO1xuXG5cdFx0aWYgKFxuXHRcdFx0Y2hpbGRWTm9kZSA9PSBudWxsIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnYm9vbGVhbicgfHxcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdmdW5jdGlvbidcblx0XHQpIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBudWxsO1xuXHRcdH1cblx0XHQvLyBJZiB0aGlzIG5ld1ZOb2RlIGlzIGJlaW5nIHJldXNlZCAoZS5nLiA8ZGl2PntyZXVzZX17cmV1c2V9PC9kaXY+KSBpbiB0aGUgc2FtZSBkaWZmLFxuXHRcdC8vIG9yIHdlIGFyZSByZW5kZXJpbmcgYSBjb21wb25lbnQgKGUuZy4gc2V0U3RhdGUpIGNvcHkgdGhlIG9sZFZOb2RlcyBzbyBpdCBjYW4gaGF2ZVxuXHRcdC8vIGl0J3Mgb3duIERPTSAmIGV0Yy4gcG9pbnRlcnNcblx0XHRlbHNlIGlmIChcblx0XHRcdHR5cGVvZiBjaGlsZFZOb2RlID09ICdzdHJpbmcnIHx8XG5cdFx0XHR0eXBlb2YgY2hpbGRWTm9kZSA9PSAnbnVtYmVyJyB8fFxuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZhbGlkLXR5cGVvZlxuXHRcdFx0dHlwZW9mIGNoaWxkVk5vZGUgPT0gJ2JpZ2ludCcgfHxcblx0XHRcdGNoaWxkVk5vZGUuY29uc3RydWN0b3IgPT0gU3RyaW5nXG5cdFx0KSB7XG5cdFx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY3JlYXRlVk5vZGUoXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdGNoaWxkVk5vZGUsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdGNoaWxkVk5vZGVcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChpc0FycmF5KGNoaWxkVk5vZGUpKSB7XG5cdFx0XHRjaGlsZFZOb2RlID0gbmV3UGFyZW50Vk5vZGUuX2NoaWxkcmVuW2ldID0gY3JlYXRlVk5vZGUoXG5cdFx0XHRcdEZyYWdtZW50LFxuXHRcdFx0XHR7IGNoaWxkcmVuOiBjaGlsZFZOb2RlIH0sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG51bGxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIGlmIChjaGlsZFZOb2RlLmNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgJiYgY2hpbGRWTm9kZS5fZGVwdGggPiAwKSB7XG5cdFx0XHQvLyBWTm9kZSBpcyBhbHJlYWR5IGluIHVzZSwgY2xvbmUgaXQuIFRoaXMgY2FuIGhhcHBlbiBpbiB0aGUgZm9sbG93aW5nXG5cdFx0XHQvLyBzY2VuYXJpbzpcblx0XHRcdC8vICAgY29uc3QgcmV1c2UgPSA8ZGl2IC8+XG5cdFx0XHQvLyAgIDxkaXY+e3JldXNlfTxzcGFuIC8+e3JldXNlfTwvZGl2PlxuXHRcdFx0Y2hpbGRWTm9kZSA9IG5ld1BhcmVudFZOb2RlLl9jaGlsZHJlbltpXSA9IGNyZWF0ZVZOb2RlKFxuXHRcdFx0XHRjaGlsZFZOb2RlLnR5cGUsXG5cdFx0XHRcdGNoaWxkVk5vZGUucHJvcHMsXG5cdFx0XHRcdGNoaWxkVk5vZGUua2V5LFxuXHRcdFx0XHRjaGlsZFZOb2RlLnJlZiA/IGNoaWxkVk5vZGUucmVmIDogbnVsbCxcblx0XHRcdFx0Y2hpbGRWTm9kZS5fb3JpZ2luYWxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNoaWxkVk5vZGUgPSBuZXdQYXJlbnRWTm9kZS5fY2hpbGRyZW5baV0gPSBjaGlsZFZOb2RlO1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSB1bm1vdW50aW5nIG51bGwgcGxhY2Vob2xkZXJzLCBpLmUuIFZOb2RlID0+IG51bGwgaW4gdW5rZXllZCBjaGlsZHJlblxuXHRcdGlmIChjaGlsZFZOb2RlID09IG51bGwpIHtcblx0XHRcdG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5baV07XG5cdFx0XHRpZiAob2xkVk5vZGUgJiYgb2xkVk5vZGUua2V5ID09IG51bGwgJiYgb2xkVk5vZGUuX2RvbSkge1xuXHRcdFx0XHRpZiAob2xkVk5vZGUuX2RvbSA9PSBuZXdQYXJlbnRWTm9kZS5fbmV4dERvbSkge1xuXHRcdFx0XHRcdG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tID0gZ2V0RG9tU2libGluZyhvbGRWTm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR1bm1vdW50KG9sZFZOb2RlLCBvbGRWTm9kZSwgZmFsc2UpO1xuXG5cdFx0XHRcdC8vIEV4cGxpY2l0bHkgbnVsbGlmeSB0aGlzIHBvc2l0aW9uIGluIG9sZENoaWxkcmVuIGluc3RlYWQgb2YganVzdFxuXHRcdFx0XHQvLyBzZXR0aW5nIGBfbWF0Y2g9dHJ1ZWAgdG8gcHJldmVudCBvdGhlciByb3V0aW5lcyAoZS5nLlxuXHRcdFx0XHQvLyBgZmluZE1hdGNoaW5nSW5kZXhgIG9yIGBnZXREb21TaWJsaW5nYCkgZnJvbSB0aGlua2luZyBWTm9kZXMgb3IgRE9NXG5cdFx0XHRcdC8vIG5vZGVzIGluIHRoaXMgcG9zaXRpb24gYXJlIHN0aWxsIGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIGRpZmZpbmcgd2hlblxuXHRcdFx0XHQvLyB0aGV5IGhhdmUgYWN0dWFsbHkgYWxyZWFkeSBiZWVuIHVubW91bnRlZC4gRm9yIGV4YW1wbGUsIGJ5IG9ubHlcblx0XHRcdFx0Ly8gc2V0dGluZyBgX21hdGNoPXRydWVgIGhlcmUsIHRoZSB1bm1vdW50aW5nIGxvb3AgbGF0ZXIgd291bGQgYXR0ZW1wdFxuXHRcdFx0XHQvLyB0byB1bm1vdW50IHRoaXMgVk5vZGUgYWdhaW4gc2VlaW5nIGBfbWF0Y2g9PXRydWVgLiAgRnVydGhlcixcblx0XHRcdFx0Ly8gZ2V0RG9tU2libGluZyBkb2Vzbid0IGtub3cgYWJvdXQgX21hdGNoIGFuZCBzbyB3b3VsZCBpbmNvcnJlY3RseVxuXHRcdFx0XHQvLyBhc3N1bWUgRE9NIG5vZGVzIGluIHRoaXMgc3VidHJlZSBhcmUgbW91bnRlZCBhbmQgdXNhYmxlLlxuXHRcdFx0XHRvbGRDaGlsZHJlbltpXSA9IG51bGw7XG5cdFx0XHRcdHJlbWFpbmluZ09sZENoaWxkcmVuLS07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNoaWxkVk5vZGUuX3BhcmVudCA9IG5ld1BhcmVudFZOb2RlO1xuXHRcdGNoaWxkVk5vZGUuX2RlcHRoID0gbmV3UGFyZW50Vk5vZGUuX2RlcHRoICsgMTtcblxuXHRcdGNvbnN0IHNrZXdlZEluZGV4ID0gaSArIHNrZXc7XG5cdFx0Y29uc3QgbWF0Y2hpbmdJbmRleCA9IGZpbmRNYXRjaGluZ0luZGV4KFxuXHRcdFx0Y2hpbGRWTm9kZSxcblx0XHRcdG9sZENoaWxkcmVuLFxuXHRcdFx0c2tld2VkSW5kZXgsXG5cdFx0XHRyZW1haW5pbmdPbGRDaGlsZHJlblxuXHRcdCk7XG5cblx0XHQvLyBUZW1wb3JhcmlseSBzdG9yZSB0aGUgbWF0Y2hpbmdJbmRleCBvbiB0aGUgX2luZGV4IHByb3BlcnR5IHNvIHdlIGNhbiBwdWxsXG5cdFx0Ly8gb3V0IHRoZSBvbGRWTm9kZSBpbiBkaWZmQ2hpbGRyZW4uIFdlJ2xsIG92ZXJyaWRlIHRoaXMgdG8gdGhlIFZOb2RlJ3Ncblx0XHQvLyBmaW5hbCBpbmRleCBhZnRlciB1c2luZyB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgb2xkVk5vZGVcblx0XHRjaGlsZFZOb2RlLl9pbmRleCA9IG1hdGNoaW5nSW5kZXg7XG5cblx0XHRvbGRWTm9kZSA9IG51bGw7XG5cdFx0aWYgKG1hdGNoaW5nSW5kZXggIT09IC0xKSB7XG5cdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW21hdGNoaW5nSW5kZXhdO1xuXHRcdFx0cmVtYWluaW5nT2xkQ2hpbGRyZW4tLTtcblx0XHRcdGlmIChvbGRWTm9kZSkge1xuXHRcdFx0XHRvbGRWTm9kZS5fZmxhZ3MgfD0gTUFUQ0hFRDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBIZXJlLCB3ZSBkZWZpbmUgaXNNb3VudGluZyBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBza2V3IGRpZmZpbmdcblx0XHQvLyBhbGdvcml0aG0uIE5vZGVzIHRoYXQgYXJlIHVuc3VzcGVuZGluZyBhcmUgY29uc2lkZXJlZCBtb3VudGluZyBhbmQgd2UgZGV0ZWN0XG5cdFx0Ly8gdGhpcyBieSBjaGVja2luZyBpZiBvbGRWTm9kZS5fb3JpZ2luYWwgPT09IG51bGxcblx0XHRjb25zdCBpc01vdW50aW5nID0gb2xkVk5vZGUgPT0gbnVsbCB8fCBvbGRWTm9kZS5fb3JpZ2luYWwgPT09IG51bGw7XG5cblx0XHRpZiAoaXNNb3VudGluZykge1xuXHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPT0gLTEpIHtcblx0XHRcdFx0c2tldy0tO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB3ZSBhcmUgbW91bnRpbmcgYSBET00gVk5vZGUsIG1hcmsgaXQgZm9yIGluc2VydGlvblxuXHRcdFx0aWYgKHR5cGVvZiBjaGlsZFZOb2RlLnR5cGUgIT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRjaGlsZFZOb2RlLl9mbGFncyB8PSBJTlNFUlRfVk5PREU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChtYXRjaGluZ0luZGV4ICE9PSBza2V3ZWRJbmRleCkge1xuXHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPT09IHNrZXdlZEluZGV4ICsgMSkge1xuXHRcdFx0XHRza2V3Kys7XG5cdFx0XHR9IGVsc2UgaWYgKG1hdGNoaW5nSW5kZXggPiBza2V3ZWRJbmRleCkge1xuXHRcdFx0XHRpZiAocmVtYWluaW5nT2xkQ2hpbGRyZW4gPiBuZXdDaGlsZHJlbkxlbmd0aCAtIHNrZXdlZEluZGV4KSB7XG5cdFx0XHRcdFx0c2tldyArPSBtYXRjaGluZ0luZGV4IC0gc2tld2VkSW5kZXg7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gIyMjIENoYW5nZSBmcm9tIGtleWVkOiBJIHRoaW5rIHRoaXMgd2FzIG1pc3NpbmcgZnJvbSB0aGUgYWxnby4uLlxuXHRcdFx0XHRcdHNrZXctLTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChtYXRjaGluZ0luZGV4IDwgc2tld2VkSW5kZXgpIHtcblx0XHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggPT0gc2tld2VkSW5kZXggLSAxKSB7XG5cdFx0XHRcdFx0c2tldyA9IG1hdGNoaW5nSW5kZXggLSBza2V3ZWRJbmRleDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRza2V3ID0gMDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2tldyA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1vdmUgdGhpcyBWTm9kZSdzIERPTSBpZiB0aGUgb3JpZ2luYWwgaW5kZXggKG1hdGNoaW5nSW5kZXgpIGRvZXNuJ3Rcblx0XHRcdC8vIG1hdGNoIHRoZSBuZXcgc2tldyBpbmRleCAoaSArIG5ldyBza2V3KVxuXHRcdFx0aWYgKG1hdGNoaW5nSW5kZXggIT09IGkgKyBza2V3KSB7XG5cdFx0XHRcdGNoaWxkVk5vZGUuX2ZsYWdzIHw9IElOU0VSVF9WTk9ERTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZW1vdmUgcmVtYWluaW5nIG9sZENoaWxkcmVuIGlmIHRoZXJlIGFyZSBhbnkuIExvb3AgZm9yd2FyZHMgc28gdGhhdCBhcyB3ZVxuXHQvLyB1bm1vdW50IERPTSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9sZENoaWxkcmVuLCB3ZSBjYW4gYWRqdXN0IG9sZERvbSB0b1xuXHQvLyBwb2ludCB0byB0aGUgbmV4dCBjaGlsZCwgd2hpY2ggbmVlZHMgdG8gYmUgdGhlIGZpcnN0IERPTSBub2RlIHRoYXQgd29uJ3QgYmVcblx0Ly8gdW5tb3VudGVkLlxuXHRpZiAocmVtYWluaW5nT2xkQ2hpbGRyZW4pIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgb2xkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuXHRcdFx0b2xkVk5vZGUgPSBvbGRDaGlsZHJlbltpXTtcblx0XHRcdGlmIChvbGRWTm9kZSAhPSBudWxsICYmIChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PT0gMCkge1xuXHRcdFx0XHRpZiAob2xkVk5vZGUuX2RvbSA9PSBuZXdQYXJlbnRWTm9kZS5fbmV4dERvbSkge1xuXHRcdFx0XHRcdG5ld1BhcmVudFZOb2RlLl9uZXh0RG9tID0gZ2V0RG9tU2libGluZyhvbGRWTm9kZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR1bm1vdW50KG9sZFZOb2RlLCBvbGRWTm9kZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gcGFyZW50Vk5vZGVcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gb2xkRG9tXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbVxuICogQHJldHVybnMge1ByZWFjdEVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGluc2VydChwYXJlbnRWTm9kZSwgb2xkRG9tLCBwYXJlbnREb20pIHtcblx0Ly8gTm90ZTogVk5vZGVzIGluIG5lc3RlZCBzdXNwZW5kZWQgdHJlZXMgbWF5IGJlIG1pc3NpbmcgX2NoaWxkcmVuLlxuXG5cdGlmICh0eXBlb2YgcGFyZW50Vk5vZGUudHlwZSA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0bGV0IGNoaWxkcmVuID0gcGFyZW50Vk5vZGUuX2NoaWxkcmVuO1xuXHRcdGZvciAobGV0IGkgPSAwOyBjaGlsZHJlbiAmJiBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdGlmIChjaGlsZHJlbltpXSkge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbnRlciB0aGlzIGNvZGUgcGF0aCBvbiBzQ1UgYmFpbG91dCwgd2hlcmUgd2UgY29weVxuXHRcdFx0XHQvLyBvbGRWTm9kZS5fY2hpbGRyZW4gdG8gbmV3Vk5vZGUuX2NoaWxkcmVuLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgb2xkXG5cdFx0XHRcdC8vIGNoaWxkcmVuJ3MgX3BhcmVudCBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBuZXdWTm9kZSAocGFyZW50Vk5vZGVcblx0XHRcdFx0Ly8gaGVyZSkuXG5cdFx0XHRcdGNoaWxkcmVuW2ldLl9wYXJlbnQgPSBwYXJlbnRWTm9kZTtcblx0XHRcdFx0b2xkRG9tID0gaW5zZXJ0KGNoaWxkcmVuW2ldLCBvbGREb20sIHBhcmVudERvbSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9sZERvbTtcblx0fSBlbHNlIGlmIChwYXJlbnRWTm9kZS5fZG9tICE9IG9sZERvbSkge1xuXHRcdHBhcmVudERvbS5pbnNlcnRCZWZvcmUocGFyZW50Vk5vZGUuX2RvbSwgb2xkRG9tIHx8IG51bGwpO1xuXHRcdG9sZERvbSA9IHBhcmVudFZOb2RlLl9kb207XG5cdH1cblxuXHRyZXR1cm4gb2xkRG9tICYmIG9sZERvbS5uZXh0U2libGluZztcbn1cblxuLyoqXG4gKiBGbGF0dGVuIGFuZCBsb29wIHRocm91Z2ggdGhlIGNoaWxkcmVuIG9mIGEgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge0NvbXBvbmVudENoaWxkcmVufSBjaGlsZHJlbiBUaGUgdW5mbGF0dGVuZWQgY2hpbGRyZW4gb2YgYSB2aXJ0dWFsXG4gKiBub2RlXG4gKiBAcmV0dXJucyB7Vk5vZGVbXX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2hpbGRBcnJheShjaGlsZHJlbiwgb3V0KSB7XG5cdG91dCA9IG91dCB8fCBbXTtcblx0aWYgKGNoaWxkcmVuID09IG51bGwgfHwgdHlwZW9mIGNoaWxkcmVuID09ICdib29sZWFuJykge1xuXHR9IGVsc2UgaWYgKGlzQXJyYXkoY2hpbGRyZW4pKSB7XG5cdFx0Y2hpbGRyZW4uc29tZShjaGlsZCA9PiB7XG5cdFx0XHR0b0NoaWxkQXJyYXkoY2hpbGQsIG91dCk7XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b3V0LnB1c2goY2hpbGRyZW4pO1xuXHR9XG5cdHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQHBhcmFtIHtWTm9kZX0gY2hpbGRWTm9kZVxuICogQHBhcmFtIHtWTm9kZVtdfSBvbGRDaGlsZHJlblxuICogQHBhcmFtIHtudW1iZXJ9IHNrZXdlZEluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gcmVtYWluaW5nT2xkQ2hpbGRyZW5cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGZpbmRNYXRjaGluZ0luZGV4KFxuXHRjaGlsZFZOb2RlLFxuXHRvbGRDaGlsZHJlbixcblx0c2tld2VkSW5kZXgsXG5cdHJlbWFpbmluZ09sZENoaWxkcmVuXG4pIHtcblx0Y29uc3Qga2V5ID0gY2hpbGRWTm9kZS5rZXk7XG5cdGNvbnN0IHR5cGUgPSBjaGlsZFZOb2RlLnR5cGU7XG5cdGxldCB4ID0gc2tld2VkSW5kZXggLSAxO1xuXHRsZXQgeSA9IHNrZXdlZEluZGV4ICsgMTtcblx0bGV0IG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5bc2tld2VkSW5kZXhdO1xuXG5cdC8vIFdlIG9ubHkgbmVlZCB0byBwZXJmb3JtIGEgc2VhcmNoIGlmIHRoZXJlIGFyZSBtb3JlIGNoaWxkcmVuXG5cdC8vIChyZW1haW5pbmdPbGRDaGlsZHJlbikgdG8gc2VhcmNoLiBIb3dldmVyLCBpZiB0aGUgb2xkVk5vZGUgd2UganVzdCBsb29rZWRcblx0Ly8gYXQgc2tld2VkSW5kZXggd2FzIG5vdCBhbHJlYWR5IHVzZWQgaW4gdGhpcyBkaWZmLCB0aGVuIHRoZXJlIG11c3QgYmUgYXRcblx0Ly8gbGVhc3QgMSBvdGhlciAoc28gZ3JlYXRlciB0aGFuIDEpIHJlbWFpbmluZ09sZENoaWxkcmVuIHRvIGF0dGVtcHQgdG8gbWF0Y2hcblx0Ly8gYWdhaW5zdC4gU28gdGhlIGZvbGxvd2luZyBjb25kaXRpb24gY2hlY2tzIHRoYXQgZW5zdXJpbmdcblx0Ly8gcmVtYWluaW5nT2xkQ2hpbGRyZW4gPiAxIGlmIHRoZSBvbGRWTm9kZSBpcyBub3QgYWxyZWFkeSB1c2VkL21hdGNoZWQuIEVsc2Vcblx0Ly8gaWYgdGhlIG9sZFZOb2RlIHdhcyBudWxsIG9yIG1hdGNoZWQsIHRoZW4gdGhlcmUgY291bGQgbmVlZHMgdG8gYmUgYXQgbGVhc3Rcblx0Ly8gMSAoYWthIGByZW1haW5pbmdPbGRDaGlsZHJlbiA+IDBgKSBjaGlsZHJlbiB0byBmaW5kIGFuZCBjb21wYXJlIGFnYWluc3QuXG5cdGxldCBzaG91bGRTZWFyY2ggPVxuXHRcdHJlbWFpbmluZ09sZENoaWxkcmVuID5cblx0XHQob2xkVk5vZGUgIT0gbnVsbCAmJiAob2xkVk5vZGUuX2ZsYWdzICYgTUFUQ0hFRCkgPT09IDAgPyAxIDogMCk7XG5cblx0aWYgKFxuXHRcdG9sZFZOb2RlID09PSBudWxsIHx8XG5cdFx0KG9sZFZOb2RlICYmIGtleSA9PSBvbGRWTm9kZS5rZXkgJiYgdHlwZSA9PT0gb2xkVk5vZGUudHlwZSlcblx0KSB7XG5cdFx0cmV0dXJuIHNrZXdlZEluZGV4O1xuXHR9IGVsc2UgaWYgKHNob3VsZFNlYXJjaCkge1xuXHRcdHdoaWxlICh4ID49IDAgfHwgeSA8IG9sZENoaWxkcmVuLmxlbmd0aCkge1xuXHRcdFx0aWYgKHggPj0gMCkge1xuXHRcdFx0XHRvbGRWTm9kZSA9IG9sZENoaWxkcmVuW3hdO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0b2xkVk5vZGUgJiZcblx0XHRcdFx0XHQob2xkVk5vZGUuX2ZsYWdzICYgTUFUQ0hFRCkgPT09IDAgJiZcblx0XHRcdFx0XHRrZXkgPT0gb2xkVk5vZGUua2V5ICYmXG5cdFx0XHRcdFx0dHlwZSA9PT0gb2xkVk5vZGUudHlwZVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4geDtcblx0XHRcdFx0fVxuXHRcdFx0XHR4LS07XG5cdFx0XHR9XG5cblx0XHRcdGlmICh5IDwgb2xkQ2hpbGRyZW4ubGVuZ3RoKSB7XG5cdFx0XHRcdG9sZFZOb2RlID0gb2xkQ2hpbGRyZW5beV07XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRvbGRWTm9kZSAmJlxuXHRcdFx0XHRcdChvbGRWTm9kZS5fZmxhZ3MgJiBNQVRDSEVEKSA9PT0gMCAmJlxuXHRcdFx0XHRcdGtleSA9PSBvbGRWTm9kZS5rZXkgJiZcblx0XHRcdFx0XHR0eXBlID09PSBvbGRWTm9kZS50eXBlXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiB5O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHkrKztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gLTE7XG59XG4iLCAiaW1wb3J0IHsgSVNfTk9OX0RJTUVOU0lPTkFMIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4uL29wdGlvbnMnO1xuXG5mdW5jdGlvbiBzZXRTdHlsZShzdHlsZSwga2V5LCB2YWx1ZSkge1xuXHRpZiAoa2V5WzBdID09PSAnLScpIHtcblx0XHRzdHlsZS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlKTtcblx0fSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XG5cdFx0c3R5bGVba2V5XSA9ICcnO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnbnVtYmVyJyB8fCBJU19OT05fRElNRU5TSU9OQUwudGVzdChrZXkpKSB7XG5cdFx0c3R5bGVba2V5XSA9IHZhbHVlO1xuXHR9IGVsc2Uge1xuXHRcdHN0eWxlW2tleV0gPSB2YWx1ZSArICdweCc7XG5cdH1cbn1cblxuLyoqXG4gKiBTZXQgYSBwcm9wZXJ0eSB2YWx1ZSBvbiBhIERPTSBub2RlXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IGRvbSBUaGUgRE9NIG5vZGUgdG8gbW9kaWZ5XG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gc2V0XG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgdGhlIHByb3BlcnR5IHRvXG4gKiBAcGFyYW0geyp9IG9sZFZhbHVlIFRoZSBvbGQgdmFsdWUgdGhlIHByb3BlcnR5IGhhZFxuICogQHBhcmFtIHtib29sZWFufSBpc1N2ZyBXaGV0aGVyIG9yIG5vdCB0aGlzIERPTSBub2RlIGlzIGFuIFNWRyBub2RlIG9yIG5vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJvcGVydHkoZG9tLCBuYW1lLCB2YWx1ZSwgb2xkVmFsdWUsIGlzU3ZnKSB7XG5cdGxldCB1c2VDYXB0dXJlO1xuXG5cdG86IGlmIChuYW1lID09PSAnc3R5bGUnKSB7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykge1xuXHRcdFx0ZG9tLnN0eWxlLmNzc1RleHQgPSB2YWx1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHR5cGVvZiBvbGRWYWx1ZSA9PSAnc3RyaW5nJykge1xuXHRcdFx0XHRkb20uc3R5bGUuY3NzVGV4dCA9IG9sZFZhbHVlID0gJyc7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChvbGRWYWx1ZSkge1xuXHRcdFx0XHRmb3IgKG5hbWUgaW4gb2xkVmFsdWUpIHtcblx0XHRcdFx0XHRpZiAoISh2YWx1ZSAmJiBuYW1lIGluIHZhbHVlKSkge1xuXHRcdFx0XHRcdFx0c2V0U3R5bGUoZG9tLnN0eWxlLCBuYW1lLCAnJyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0XHRmb3IgKG5hbWUgaW4gdmFsdWUpIHtcblx0XHRcdFx0XHRpZiAoIW9sZFZhbHVlIHx8IHZhbHVlW25hbWVdICE9PSBvbGRWYWx1ZVtuYW1lXSkge1xuXHRcdFx0XHRcdFx0c2V0U3R5bGUoZG9tLnN0eWxlLCBuYW1lLCB2YWx1ZVtuYW1lXSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8vIEJlbmNobWFyayBmb3IgY29tcGFyaXNvbjogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81NzRjOTU0YmRiOTY1YjlhMDA5NjVhYzZcblx0ZWxzZSBpZiAobmFtZVswXSA9PT0gJ28nICYmIG5hbWVbMV0gPT09ICduJykge1xuXHRcdHVzZUNhcHR1cmUgPVxuXHRcdFx0bmFtZSAhPT0gKG5hbWUgPSBuYW1lLnJlcGxhY2UoLyhQb2ludGVyQ2FwdHVyZSkkfENhcHR1cmUkLywgJyQxJykpO1xuXG5cdFx0Ly8gSW5mZXIgY29ycmVjdCBjYXNpbmcgZm9yIERPTSBidWlsdC1pbiBldmVudHM6XG5cdFx0aWYgKG5hbWUudG9Mb3dlckNhc2UoKSBpbiBkb20pIG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMik7XG5cdFx0ZWxzZSBuYW1lID0gbmFtZS5zbGljZSgyKTtcblxuXHRcdGlmICghZG9tLl9saXN0ZW5lcnMpIGRvbS5fbGlzdGVuZXJzID0ge307XG5cdFx0ZG9tLl9saXN0ZW5lcnNbbmFtZSArIHVzZUNhcHR1cmVdID0gdmFsdWU7XG5cblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdGlmICghb2xkVmFsdWUpIHtcblx0XHRcdFx0dmFsdWUuX2F0dGFjaGVkID0gRGF0ZS5ub3coKTtcblx0XHRcdFx0Y29uc3QgaGFuZGxlciA9IHVzZUNhcHR1cmUgPyBldmVudFByb3h5Q2FwdHVyZSA6IGV2ZW50UHJveHk7XG5cdFx0XHRcdGRvbS5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIsIHVzZUNhcHR1cmUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsdWUuX2F0dGFjaGVkID0gb2xkVmFsdWUuX2F0dGFjaGVkO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBoYW5kbGVyID0gdXNlQ2FwdHVyZSA/IGV2ZW50UHJveHlDYXB0dXJlIDogZXZlbnRQcm94eTtcblx0XHRcdGRvbS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGhhbmRsZXIsIHVzZUNhcHR1cmUpO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRpZiAoaXNTdmcpIHtcblx0XHRcdC8vIE5vcm1hbGl6ZSBpbmNvcnJlY3QgcHJvcCB1c2FnZSBmb3IgU1ZHOlxuXHRcdFx0Ly8gLSB4bGluazpocmVmIC8geGxpbmtIcmVmIC0tPiBocmVmICh4bGluazpocmVmIHdhcyByZW1vdmVkIGZyb20gU1ZHIGFuZCBpc24ndCBuZWVkZWQpXG5cdFx0XHQvLyAtIGNsYXNzTmFtZSAtLT4gY2xhc3Ncblx0XHRcdG5hbWUgPSBuYW1lLnJlcGxhY2UoL3hsaW5rKEh8OmgpLywgJ2gnKS5yZXBsYWNlKC9zTmFtZSQvLCAncycpO1xuXHRcdH0gZWxzZSBpZiAoXG5cdFx0XHRuYW1lICE9PSAnd2lkdGgnICYmXG5cdFx0XHRuYW1lICE9PSAnaGVpZ2h0JyAmJlxuXHRcdFx0bmFtZSAhPT0gJ2hyZWYnICYmXG5cdFx0XHRuYW1lICE9PSAnbGlzdCcgJiZcblx0XHRcdG5hbWUgIT09ICdmb3JtJyAmJlxuXHRcdFx0Ly8gRGVmYXVsdCB2YWx1ZSBpbiBicm93c2VycyBpcyBgLTFgIGFuZCBhbiBlbXB0eSBzdHJpbmcgaXNcblx0XHRcdC8vIGNhc3QgdG8gYDBgIGluc3RlYWRcblx0XHRcdG5hbWUgIT09ICd0YWJJbmRleCcgJiZcblx0XHRcdG5hbWUgIT09ICdkb3dubG9hZCcgJiZcblx0XHRcdG5hbWUgIT09ICdyb3dTcGFuJyAmJlxuXHRcdFx0bmFtZSAhPT0gJ2NvbFNwYW4nICYmXG5cdFx0XHRuYW1lICE9PSAncm9sZScgJiZcblx0XHRcdG5hbWUgaW4gZG9tXG5cdFx0KSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkb21bbmFtZV0gPSB2YWx1ZSA9PSBudWxsID8gJycgOiB2YWx1ZTtcblx0XHRcdFx0Ly8gbGFiZWxsZWQgYnJlYWsgaXMgMWIgc21hbGxlciBoZXJlIHRoYW4gYSByZXR1cm4gc3RhdGVtZW50IChzb3JyeSlcblx0XHRcdFx0YnJlYWsgbztcblx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0fVxuXG5cdFx0Ly8gYXJpYS0gYW5kIGRhdGEtIGF0dHJpYnV0ZXMgaGF2ZSBubyBib29sZWFuIHJlcHJlc2VudGF0aW9uLlxuXHRcdC8vIEEgYGZhbHNlYCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYXR0cmlidXRlIG5vdCBiZWluZ1xuXHRcdC8vIHByZXNlbnQsIHNvIHdlIGNhbid0IHJlbW92ZSBpdC4gRm9yIG5vbi1ib29sZWFuIGFyaWFcblx0XHQvLyBhdHRyaWJ1dGVzIHdlIGNvdWxkIHRyZWF0IGZhbHNlIGFzIGEgcmVtb3ZhbCwgYnV0IHRoZVxuXHRcdC8vIGFtb3VudCBvZiBleGNlcHRpb25zIHdvdWxkIGNvc3QgdG9vIG1hbnkgYnl0ZXMuIE9uIHRvcCBvZlxuXHRcdC8vIHRoYXQgb3RoZXIgZnJhbWV3b3JrcyBnZW5lcmFsbHkgc3RyaW5naWZ5IGBmYWxzZWAuXG5cblx0XHRpZiAodHlwZW9mIHZhbHVlID09ICdmdW5jdGlvbicpIHtcblx0XHRcdC8vIG5ldmVyIHNlcmlhbGl6ZSBmdW5jdGlvbnMgYXMgYXR0cmlidXRlIHZhbHVlc1xuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUgIT09IGZhbHNlIHx8IG5hbWVbNF0gPT09ICctJykpIHtcblx0XHRcdGRvbS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkb20ucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIFByb3h5IGFuIGV2ZW50IHRvIGhvb2tlZCBldmVudCBoYW5kbGVyc1xuICogQHBhcmFtIHtQcmVhY3RFdmVudH0gZSBUaGUgZXZlbnQgb2JqZWN0IGZyb20gdGhlIGJyb3dzZXJcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGV2ZW50UHJveHkoZSkge1xuXHRjb25zdCBldmVudEhhbmRsZXIgPSB0aGlzLl9saXN0ZW5lcnNbZS50eXBlICsgZmFsc2VdO1xuXHQvKipcblx0ICogVGhpcyB0cmljayBpcyBpbnNwaXJlZCBieSBWdWUgaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL2NvcmUvYmxvYi9tYWluL3BhY2thZ2VzL3J1bnRpbWUtZG9tL3NyYy9tb2R1bGVzL2V2ZW50cy50cyNMOTAtTDEwMVxuXHQgKiB3aGVuIHRoZSBkb20gcGVyZm9ybXMgYW4gZXZlbnQgaXQgbGVhdmVzIG1pY3JvLXRpY2tzIGluIGJldHdlZW4gYnViYmxpbmcgdXAgd2hpY2ggbWVhbnMgdGhhdCBhbiBldmVudCBjYW4gdHJpZ2dlciBvbiBhIG5ld2x5XG5cdCAqIGNyZWF0ZWQgRE9NLW5vZGUgd2hpbGUgdGhlIGV2ZW50IGJ1YmJsZXMgdXAsIHRoaXMgY2FuIGNhdXNlIHF1aXJreSBiZWhhdmlvciBhcyBzZWVuIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9wcmVhY3Rqcy9wcmVhY3QvaXNzdWVzLzM5Mjdcblx0ICovXG5cdGlmICghZS5fZGlzcGF0Y2hlZCkge1xuXHRcdC8vIFdoZW4gYW4gZXZlbnQgaGFzIG5vIF9kaXNwYXRjaGVkIHdlIGtub3cgdGhpcyBpcyB0aGUgZmlyc3QgZXZlbnQtdGFyZ2V0IGluIHRoZSBjaGFpblxuXHRcdC8vIHNvIHdlIHNldCB0aGUgaW5pdGlhbCBkaXNwYXRjaGVkIHRpbWUuXG5cdFx0ZS5fZGlzcGF0Y2hlZCA9IERhdGUubm93KCk7XG5cdFx0Ly8gV2hlbiB0aGUgX2Rpc3BhdGNoZWQgaXMgc21hbGxlciB0aGFuIHRoZSB0aW1lIHdoZW4gdGhlIHRhcmdldHRlZCBldmVudCBoYW5kbGVyIHdhcyBhdHRhY2hlZFxuXHRcdC8vIHdlIGtub3cgd2UgaGF2ZSBidWJibGVkIHVwIHRvIGFuIGVsZW1lbnQgdGhhdCB3YXMgYWRkZWQgZHVyaW5nIHBhdGNoaW5nIHRoZSBkb20uXG5cdH0gZWxzZSBpZiAoZS5fZGlzcGF0Y2hlZCA8PSBldmVudEhhbmRsZXIuX2F0dGFjaGVkKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHJldHVybiBldmVudEhhbmRsZXIob3B0aW9ucy5ldmVudCA/IG9wdGlvbnMuZXZlbnQoZSkgOiBlKTtcbn1cblxuLyoqXG4gKiBQcm94eSBhbiBldmVudCB0byBob29rZWQgZXZlbnQgaGFuZGxlcnNcbiAqIEBwYXJhbSB7UHJlYWN0RXZlbnR9IGUgVGhlIGV2ZW50IG9iamVjdCBmcm9tIHRoZSBicm93c2VyXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBldmVudFByb3h5Q2FwdHVyZShlKSB7XG5cdHJldHVybiB0aGlzLl9saXN0ZW5lcnNbZS50eXBlICsgdHJ1ZV0ob3B0aW9ucy5ldmVudCA/IG9wdGlvbnMuZXZlbnQoZSkgOiBlKTtcbn1cbiIsICJpbXBvcnQge1xuXHRFTVBUWV9PQkosXG5cdE1PREVfSFlEUkFURSxcblx0TU9ERV9TVVNQRU5ERUQsXG5cdFJFU0VUX01PREVcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIGdldERvbVNpYmxpbmcgfSBmcm9tICcuLi9jb21wb25lbnQnO1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICcuLi9jcmVhdGUtZWxlbWVudCc7XG5pbXBvcnQgeyBkaWZmQ2hpbGRyZW4gfSBmcm9tICcuL2NoaWxkcmVuJztcbmltcG9ydCB7IHNldFByb3BlcnR5IH0gZnJvbSAnLi9wcm9wcyc7XG5pbXBvcnQgeyBhc3NpZ24sIGlzQXJyYXksIHJlbW92ZU5vZGUsIHNsaWNlIH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQgb3B0aW9ucyBmcm9tICcuLi9vcHRpb25zJztcblxuLyoqXG4gKiBEaWZmIHR3byB2aXJ0dWFsIG5vZGVzIGFuZCBhcHBseSBwcm9wZXIgY2hhbmdlcyB0byB0aGUgRE9NXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbSBUaGUgcGFyZW50IG9mIHRoZSBET00gZWxlbWVudFxuICogQHBhcmFtIHtWTm9kZX0gbmV3Vk5vZGUgVGhlIG5ldyB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7Vk5vZGV9IG9sZFZOb2RlIFRoZSBvbGQgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsQ29udGV4dCBUaGUgY3VycmVudCBjb250ZXh0IG9iamVjdC4gTW9kaWZpZWQgYnlcbiAqIGdldENoaWxkQ29udGV4dFxuICogQHBhcmFtIHtib29sZWFufSBpc1N2ZyBXaGV0aGVyIG9yIG5vdCB0aGlzIGVsZW1lbnQgaXMgYW4gU1ZHIG5vZGVcbiAqIEBwYXJhbSB7QXJyYXk8UHJlYWN0RWxlbWVudD59IGV4Y2Vzc0RvbUNoaWxkcmVuXG4gKiBAcGFyYW0ge0FycmF5PENvbXBvbmVudD59IGNvbW1pdFF1ZXVlIExpc3Qgb2YgY29tcG9uZW50cyB3aGljaCBoYXZlIGNhbGxiYWNrc1xuICogdG8gaW52b2tlIGluIGNvbW1pdFJvb3RcbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudH0gb2xkRG9tIFRoZSBjdXJyZW50IGF0dGFjaGVkIERPTSBlbGVtZW50IGFueSBuZXcgZG9tXG4gKiBlbGVtZW50cyBzaG91bGQgYmUgcGxhY2VkIGFyb3VuZC4gTGlrZWx5IGBudWxsYCBvbiBmaXJzdCByZW5kZXIgKGV4Y2VwdCB3aGVuXG4gKiBoeWRyYXRpbmcpLiBDYW4gYmUgYSBzaWJsaW5nIERPTSBlbGVtZW50IHdoZW4gZGlmZmluZyBGcmFnbWVudHMgdGhhdCBoYXZlXG4gKiBzaWJsaW5ncy4gSW4gbW9zdCBjYXNlcywgaXQgc3RhcnRzIG91dCBhcyBgb2xkQ2hpbGRyZW5bMF0uX2RvbWAuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzSHlkcmF0aW5nIFdoZXRoZXIgb3Igbm90IHdlIGFyZSBpbiBoeWRyYXRpb25cbiAqIEBwYXJhbSB7YW55W119IHJlZlF1ZXVlIGFuIGFycmF5IG9mIGVsZW1lbnRzIG5lZWRlZCB0byBpbnZva2UgcmVmc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZihcblx0cGFyZW50RG9tLFxuXHRuZXdWTm9kZSxcblx0b2xkVk5vZGUsXG5cdGdsb2JhbENvbnRleHQsXG5cdGlzU3ZnLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdG9sZERvbSxcblx0aXNIeWRyYXRpbmcsXG5cdHJlZlF1ZXVlXG4pIHtcblx0LyoqIEB0eXBlIHthbnl9ICovXG5cdGxldCB0bXAsXG5cdFx0bmV3VHlwZSA9IG5ld1ZOb2RlLnR5cGU7XG5cblx0Ly8gV2hlbiBwYXNzaW5nIHRocm91Z2ggY3JlYXRlRWxlbWVudCBpdCBhc3NpZ25zIHRoZSBvYmplY3Rcblx0Ly8gY29uc3RydWN0b3IgYXMgdW5kZWZpbmVkLiBUaGlzIHRvIHByZXZlbnQgSlNPTi1pbmplY3Rpb24uXG5cdGlmIChuZXdWTm9kZS5jb25zdHJ1Y3RvciAhPT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcblxuXHQvLyBJZiB0aGUgcHJldmlvdXMgZGlmZiBiYWlsZWQgb3V0LCByZXN1bWUgY3JlYXRpbmcvaHlkcmF0aW5nLlxuXHRpZiAob2xkVk5vZGUuX2ZsYWdzICYgTU9ERV9TVVNQRU5ERUQpIHtcblx0XHRpc0h5ZHJhdGluZyA9ICEhKG9sZFZOb2RlLl9mbGFncyAmIE1PREVfSFlEUkFURSk7XG5cdFx0b2xkRG9tID0gbmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdFx0ZXhjZXNzRG9tQ2hpbGRyZW4gPSBbb2xkRG9tXTtcblx0fVxuXG5cdGlmICgodG1wID0gb3B0aW9ucy5fZGlmZikpIHRtcChuZXdWTm9kZSk7XG5cblx0b3V0ZXI6IGlmICh0eXBlb2YgbmV3VHlwZSA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGxldCBjLCBpc05ldywgb2xkUHJvcHMsIG9sZFN0YXRlLCBzbmFwc2hvdCwgY2xlYXJQcm9jZXNzaW5nRXhjZXB0aW9uO1xuXHRcdFx0bGV0IG5ld1Byb3BzID0gbmV3Vk5vZGUucHJvcHM7XG5cblx0XHRcdC8vIE5lY2Vzc2FyeSBmb3IgY3JlYXRlQ29udGV4dCBhcGkuIFNldHRpbmcgdGhpcyBwcm9wZXJ0eSB3aWxsIHBhc3Ncblx0XHRcdC8vIHRoZSBjb250ZXh0IHZhbHVlIGFzIGB0aGlzLmNvbnRleHRgIGp1c3QgZm9yIHRoaXMgY29tcG9uZW50LlxuXHRcdFx0dG1wID0gbmV3VHlwZS5jb250ZXh0VHlwZTtcblx0XHRcdGxldCBwcm92aWRlciA9IHRtcCAmJiBnbG9iYWxDb250ZXh0W3RtcC5faWRdO1xuXHRcdFx0bGV0IGNvbXBvbmVudENvbnRleHQgPSB0bXBcblx0XHRcdFx0PyBwcm92aWRlclxuXHRcdFx0XHRcdD8gcHJvdmlkZXIucHJvcHMudmFsdWVcblx0XHRcdFx0XHQ6IHRtcC5fZGVmYXVsdFZhbHVlXG5cdFx0XHRcdDogZ2xvYmFsQ29udGV4dDtcblxuXHRcdFx0Ly8gR2V0IGNvbXBvbmVudCBhbmQgc2V0IGl0IHRvIGBjYFxuXHRcdFx0aWYgKG9sZFZOb2RlLl9jb21wb25lbnQpIHtcblx0XHRcdFx0YyA9IG5ld1ZOb2RlLl9jb21wb25lbnQgPSBvbGRWTm9kZS5fY29tcG9uZW50O1xuXHRcdFx0XHRjbGVhclByb2Nlc3NpbmdFeGNlcHRpb24gPSBjLl9wcm9jZXNzaW5nRXhjZXB0aW9uID0gYy5fcGVuZGluZ0Vycm9yO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Ly8gSW5zdGFudGlhdGUgdGhlIG5ldyBjb21wb25lbnRcblx0XHRcdFx0aWYgKCdwcm90b3R5cGUnIGluIG5ld1R5cGUgJiYgbmV3VHlwZS5wcm90b3R5cGUucmVuZGVyKSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUaGUgY2hlY2sgYWJvdmUgdmVyaWZpZXMgdGhhdCBuZXdUeXBlIGlzIHN1cHBvc2UgdG8gYmUgY29uc3RydWN0ZWRcblx0XHRcdFx0XHRuZXdWTm9kZS5fY29tcG9uZW50ID0gYyA9IG5ldyBuZXdUeXBlKG5ld1Byb3BzLCBjb21wb25lbnRDb250ZXh0KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBUcnVzdCBtZSwgQ29tcG9uZW50IGltcGxlbWVudHMgdGhlIGludGVyZmFjZSB3ZSB3YW50XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NvbXBvbmVudCA9IGMgPSBuZXcgQmFzZUNvbXBvbmVudChcblx0XHRcdFx0XHRcdG5ld1Byb3BzLFxuXHRcdFx0XHRcdFx0Y29tcG9uZW50Q29udGV4dFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0Yy5jb25zdHJ1Y3RvciA9IG5ld1R5cGU7XG5cdFx0XHRcdFx0Yy5yZW5kZXIgPSBkb1JlbmRlcjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvdmlkZXIpIHByb3ZpZGVyLnN1YihjKTtcblxuXHRcdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRcdGlmICghYy5zdGF0ZSkgYy5zdGF0ZSA9IHt9O1xuXHRcdFx0XHRjLmNvbnRleHQgPSBjb21wb25lbnRDb250ZXh0O1xuXHRcdFx0XHRjLl9nbG9iYWxDb250ZXh0ID0gZ2xvYmFsQ29udGV4dDtcblx0XHRcdFx0aXNOZXcgPSBjLl9kaXJ0eSA9IHRydWU7XG5cdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJbnZva2UgZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzXG5cdFx0XHRpZiAoYy5fbmV4dFN0YXRlID09IG51bGwpIHtcblx0XHRcdFx0Yy5fbmV4dFN0YXRlID0gYy5zdGF0ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1R5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzICE9IG51bGwpIHtcblx0XHRcdFx0aWYgKGMuX25leHRTdGF0ZSA9PSBjLnN0YXRlKSB7XG5cdFx0XHRcdFx0Yy5fbmV4dFN0YXRlID0gYXNzaWduKHt9LCBjLl9uZXh0U3RhdGUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXNzaWduKFxuXHRcdFx0XHRcdGMuX25leHRTdGF0ZSxcblx0XHRcdFx0XHRuZXdUeXBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyhuZXdQcm9wcywgYy5fbmV4dFN0YXRlKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRvbGRQcm9wcyA9IGMucHJvcHM7XG5cdFx0XHRvbGRTdGF0ZSA9IGMuc3RhdGU7XG5cdFx0XHRjLl92bm9kZSA9IG5ld1ZOb2RlO1xuXG5cdFx0XHQvLyBJbnZva2UgcHJlLXJlbmRlciBsaWZlY3ljbGUgbWV0aG9kc1xuXHRcdFx0aWYgKGlzTmV3KSB7XG5cdFx0XHRcdGlmIChcblx0XHRcdFx0XHRuZXdUeXBlLmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyA9PSBudWxsICYmXG5cdFx0XHRcdFx0Yy5jb21wb25lbnRXaWxsTW91bnQgIT0gbnVsbFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxNb3VudCgpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGMuY29tcG9uZW50RGlkTW91bnQgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKGMuY29tcG9uZW50RGlkTW91bnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0bmV3VHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMgPT0gbnVsbCAmJlxuXHRcdFx0XHRcdG5ld1Byb3BzICE9PSBvbGRQcm9wcyAmJlxuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyAhPSBudWxsXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGMuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuZXdQcm9wcywgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IWMuX2ZvcmNlICYmXG5cdFx0XHRcdFx0KChjLnNob3VsZENvbXBvbmVudFVwZGF0ZSAhPSBudWxsICYmXG5cdFx0XHRcdFx0XHRjLnNob3VsZENvbXBvbmVudFVwZGF0ZShcblx0XHRcdFx0XHRcdFx0bmV3UHJvcHMsXG5cdFx0XHRcdFx0XHRcdGMuX25leHRTdGF0ZSxcblx0XHRcdFx0XHRcdFx0Y29tcG9uZW50Q29udGV4dFxuXHRcdFx0XHRcdFx0KSA9PT0gZmFsc2UpIHx8XG5cdFx0XHRcdFx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPT09IG9sZFZOb2RlLl9vcmlnaW5hbClcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Ly8gTW9yZSBpbmZvIGFib3V0IHRoaXMgaGVyZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vSm92aURlQ3Jvb2NrL2JlYzVmMmNlOTM1NDRkMmU2MDcwZWY4ZTAwMzZlNGU4XG5cdFx0XHRcdFx0aWYgKG5ld1ZOb2RlLl9vcmlnaW5hbCAhPT0gb2xkVk5vZGUuX29yaWdpbmFsKSB7XG5cdFx0XHRcdFx0XHQvLyBXaGVuIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBiYWlsIGJlY2F1c2Ugb2Ygc0NVIHdlIGhhdmUgdG8gdXBkYXRlXG5cdFx0XHRcdFx0XHQvLyB0aGUgcHJvcHMsIHN0YXRlIGFuZCBkaXJ0eS1zdGF0ZS5cblx0XHRcdFx0XHRcdC8vIHdoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aCBzdHJpY3QtZXF1YWxpdHkgd2UgZG9uJ3QgYXMgdGhlIGNoaWxkIGNvdWxkIHN0aWxsXG5cdFx0XHRcdFx0XHQvLyBiZSBkaXJ0aWVkIHNlZSAjMzg4M1xuXHRcdFx0XHRcdFx0Yy5wcm9wcyA9IG5ld1Byb3BzO1xuXHRcdFx0XHRcdFx0Yy5zdGF0ZSA9IGMuX25leHRTdGF0ZTtcblx0XHRcdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdFx0XHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuID0gb2xkVk5vZGUuX2NoaWxkcmVuO1xuXHRcdFx0XHRcdG5ld1ZOb2RlLl9jaGlsZHJlbi5mb3JFYWNoKHZub2RlID0+IHtcblx0XHRcdFx0XHRcdGlmICh2bm9kZSkgdm5vZGUuX3BhcmVudCA9IG5ld1ZOb2RlO1xuXHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjLl9zdGF0ZUNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goYy5fc3RhdGVDYWxsYmFja3NbaV0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXG5cdFx0XHRcdFx0aWYgKGMuX3JlbmRlckNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdGNvbW1pdFF1ZXVlLnB1c2goYyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWsgb3V0ZXI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnRXaWxsVXBkYXRlICE9IG51bGwpIHtcblx0XHRcdFx0XHRjLmNvbXBvbmVudFdpbGxVcGRhdGUobmV3UHJvcHMsIGMuX25leHRTdGF0ZSwgY29tcG9uZW50Q29udGV4dCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoYy5jb21wb25lbnREaWRVcGRhdGUgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKCgpID0+IHtcblx0XHRcdFx0XHRcdGMuY29tcG9uZW50RGlkVXBkYXRlKG9sZFByb3BzLCBvbGRTdGF0ZSwgc25hcHNob3QpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGMuY29udGV4dCA9IGNvbXBvbmVudENvbnRleHQ7XG5cdFx0XHRjLnByb3BzID0gbmV3UHJvcHM7XG5cdFx0XHRjLl9wYXJlbnREb20gPSBwYXJlbnREb207XG5cdFx0XHRjLl9mb3JjZSA9IGZhbHNlO1xuXG5cdFx0XHRsZXQgcmVuZGVySG9vayA9IG9wdGlvbnMuX3JlbmRlcixcblx0XHRcdFx0Y291bnQgPSAwO1xuXHRcdFx0aWYgKCdwcm90b3R5cGUnIGluIG5ld1R5cGUgJiYgbmV3VHlwZS5wcm90b3R5cGUucmVuZGVyKSB7XG5cdFx0XHRcdGMuc3RhdGUgPSBjLl9uZXh0U3RhdGU7XG5cdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cblx0XHRcdFx0aWYgKHJlbmRlckhvb2spIHJlbmRlckhvb2sobmV3Vk5vZGUpO1xuXG5cdFx0XHRcdHRtcCA9IGMucmVuZGVyKGMucHJvcHMsIGMuc3RhdGUsIGMuY29udGV4dCk7XG5cblx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBjLl9zdGF0ZUNhbGxiYWNrcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRcdGMuX3JlbmRlckNhbGxiYWNrcy5wdXNoKGMuX3N0YXRlQ2FsbGJhY2tzW2ldKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjLl9zdGF0ZUNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGMuX2RpcnR5ID0gZmFsc2U7XG5cdFx0XHRcdFx0aWYgKHJlbmRlckhvb2spIHJlbmRlckhvb2sobmV3Vk5vZGUpO1xuXG5cdFx0XHRcdFx0dG1wID0gYy5yZW5kZXIoYy5wcm9wcywgYy5zdGF0ZSwgYy5jb250ZXh0KTtcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBzZXRTdGF0ZSBjYWxsZWQgaW4gcmVuZGVyLCBzZWUgIzI1NTNcblx0XHRcdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXHRcdFx0XHR9IHdoaWxlIChjLl9kaXJ0eSAmJiArK2NvdW50IDwgMjUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIYW5kbGUgc2V0U3RhdGUgY2FsbGVkIGluIHJlbmRlciwgc2VlICMyNTUzXG5cdFx0XHRjLnN0YXRlID0gYy5fbmV4dFN0YXRlO1xuXG5cdFx0XHRpZiAoYy5nZXRDaGlsZENvbnRleHQgIT0gbnVsbCkge1xuXHRcdFx0XHRnbG9iYWxDb250ZXh0ID0gYXNzaWduKGFzc2lnbih7fSwgZ2xvYmFsQ29udGV4dCksIGMuZ2V0Q2hpbGRDb250ZXh0KCkpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWlzTmV3ICYmIGMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgIT0gbnVsbCkge1xuXHRcdFx0XHRzbmFwc2hvdCA9IGMuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUob2xkUHJvcHMsIG9sZFN0YXRlKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IGlzVG9wTGV2ZWxGcmFnbWVudCA9XG5cdFx0XHRcdHRtcCAhPSBudWxsICYmIHRtcC50eXBlID09PSBGcmFnbWVudCAmJiB0bXAua2V5ID09IG51bGw7XG5cdFx0XHRsZXQgcmVuZGVyUmVzdWx0ID0gaXNUb3BMZXZlbEZyYWdtZW50ID8gdG1wLnByb3BzLmNoaWxkcmVuIDogdG1wO1xuXG5cdFx0XHRkaWZmQ2hpbGRyZW4oXG5cdFx0XHRcdHBhcmVudERvbSxcblx0XHRcdFx0aXNBcnJheShyZW5kZXJSZXN1bHQpID8gcmVuZGVyUmVzdWx0IDogW3JlbmRlclJlc3VsdF0sXG5cdFx0XHRcdG5ld1ZOb2RlLFxuXHRcdFx0XHRvbGRWTm9kZSxcblx0XHRcdFx0Z2xvYmFsQ29udGV4dCxcblx0XHRcdFx0aXNTdmcsXG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0XHRjb21taXRRdWV1ZSxcblx0XHRcdFx0b2xkRG9tLFxuXHRcdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdFx0cmVmUXVldWVcblx0XHRcdCk7XG5cblx0XHRcdGMuYmFzZSA9IG5ld1ZOb2RlLl9kb207XG5cblx0XHRcdC8vIFdlIHN1Y2Nlc3NmdWxseSByZW5kZXJlZCB0aGlzIFZOb2RlLCB1bnNldCBhbnkgc3RvcmVkIGh5ZHJhdGlvbi9iYWlsb3V0IHN0YXRlOlxuXHRcdFx0bmV3Vk5vZGUuX2ZsYWdzICY9IFJFU0VUX01PREU7XG5cblx0XHRcdGlmIChjLl9yZW5kZXJDYWxsYmFja3MubGVuZ3RoKSB7XG5cdFx0XHRcdGNvbW1pdFF1ZXVlLnB1c2goYyk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjbGVhclByb2Nlc3NpbmdFeGNlcHRpb24pIHtcblx0XHRcdFx0Yy5fcGVuZGluZ0Vycm9yID0gYy5fcHJvY2Vzc2luZ0V4Y2VwdGlvbiA9IG51bGw7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0bmV3Vk5vZGUuX29yaWdpbmFsID0gbnVsbDtcblx0XHRcdC8vIGlmIGh5ZHJhdGluZyBvciBjcmVhdGluZyBpbml0aWFsIHRyZWUsIGJhaWxvdXQgcHJlc2VydmVzIERPTTpcblx0XHRcdGlmIChpc0h5ZHJhdGluZyB8fCBleGNlc3NEb21DaGlsZHJlbiAhPSBudWxsKSB7XG5cdFx0XHRcdG5ld1ZOb2RlLl9kb20gPSBvbGREb207XG5cdFx0XHRcdG5ld1ZOb2RlLl9mbGFncyB8PSBpc0h5ZHJhdGluZ1xuXHRcdFx0XHRcdD8gTU9ERV9IWURSQVRFIHwgTU9ERV9TVVNQRU5ERURcblx0XHRcdFx0XHQ6IE1PREVfSFlEUkFURTtcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5bZXhjZXNzRG9tQ2hpbGRyZW4uaW5kZXhPZihvbGREb20pXSA9IG51bGw7XG5cdFx0XHRcdC8vIF4gY291bGQgcG9zc2libHkgYmUgc2ltcGxpZmllZCB0bzpcblx0XHRcdFx0Ly8gZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoID0gMDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5ld1ZOb2RlLl9kb20gPSBvbGRWTm9kZS5fZG9tO1xuXHRcdFx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBvbGRWTm9kZS5fY2hpbGRyZW47XG5cdFx0XHR9XG5cdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIG5ld1ZOb2RlLCBvbGRWTm9kZSk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKFxuXHRcdGV4Y2Vzc0RvbUNoaWxkcmVuID09IG51bGwgJiZcblx0XHRuZXdWTm9kZS5fb3JpZ2luYWwgPT09IG9sZFZOb2RlLl9vcmlnaW5hbFxuXHQpIHtcblx0XHRuZXdWTm9kZS5fY2hpbGRyZW4gPSBvbGRWTm9kZS5fY2hpbGRyZW47XG5cdFx0bmV3Vk5vZGUuX2RvbSA9IG9sZFZOb2RlLl9kb207XG5cdH0gZWxzZSB7XG5cdFx0bmV3Vk5vZGUuX2RvbSA9IGRpZmZFbGVtZW50Tm9kZXMoXG5cdFx0XHRvbGRWTm9kZS5fZG9tLFxuXHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRvbGRWTm9kZSxcblx0XHRcdGdsb2JhbENvbnRleHQsXG5cdFx0XHRpc1N2Zyxcblx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuLFxuXHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdHJlZlF1ZXVlXG5cdFx0KTtcblx0fVxuXG5cdGlmICgodG1wID0gb3B0aW9ucy5kaWZmZWQpKSB0bXAobmV3Vk5vZGUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8Q29tcG9uZW50Pn0gY29tbWl0UXVldWUgTGlzdCBvZiBjb21wb25lbnRzXG4gKiB3aGljaCBoYXZlIGNhbGxiYWNrcyB0byBpbnZva2UgaW4gY29tbWl0Um9vdFxuICogQHBhcmFtIHtWTm9kZX0gcm9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tbWl0Um9vdChjb21taXRRdWV1ZSwgcm9vdCwgcmVmUXVldWUpIHtcblx0cm9vdC5fbmV4dERvbSA9IHVuZGVmaW5lZDtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IHJlZlF1ZXVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0YXBwbHlSZWYocmVmUXVldWVbaV0sIHJlZlF1ZXVlWysraV0sIHJlZlF1ZXVlWysraV0pO1xuXHR9XG5cblx0aWYgKG9wdGlvbnMuX2NvbW1pdCkgb3B0aW9ucy5fY29tbWl0KHJvb3QsIGNvbW1pdFF1ZXVlKTtcblxuXHRjb21taXRRdWV1ZS5zb21lKGMgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIFJldXNlIHRoZSBjb21taXRRdWV1ZSB2YXJpYWJsZSBoZXJlIHNvIHRoZSB0eXBlIGNoYW5nZXNcblx0XHRcdGNvbW1pdFF1ZXVlID0gYy5fcmVuZGVyQ2FsbGJhY2tzO1xuXHRcdFx0Yy5fcmVuZGVyQ2FsbGJhY2tzID0gW107XG5cdFx0XHRjb21taXRRdWV1ZS5zb21lKGNiID0+IHtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvciBTZWUgYWJvdmUgY29tbWVudCBvbiBjb21taXRRdWV1ZVxuXHRcdFx0XHRjYi5jYWxsKGMpO1xuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0b3B0aW9ucy5fY2F0Y2hFcnJvcihlLCBjLl92bm9kZSk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiBEaWZmIHR3byB2aXJ0dWFsIG5vZGVzIHJlcHJlc2VudGluZyBET00gZWxlbWVudFxuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50fSBkb20gVGhlIERPTSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgdmlydHVhbCBub2Rlc1xuICogYmVpbmcgZGlmZmVkXG4gKiBAcGFyYW0ge1ZOb2RlfSBuZXdWTm9kZSBUaGUgbmV3IHZpcnR1YWwgbm9kZVxuICogQHBhcmFtIHtWTm9kZX0gb2xkVk5vZGUgVGhlIG9sZCB2aXJ0dWFsIG5vZGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxDb250ZXh0IFRoZSBjdXJyZW50IGNvbnRleHQgb2JqZWN0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzU3ZnIFdoZXRoZXIgb3Igbm90IHRoaXMgRE9NIG5vZGUgaXMgYW4gU1ZHIG5vZGVcbiAqIEBwYXJhbSB7QXJyYXk8UHJlYWN0RWxlbWVudD59IGV4Y2Vzc0RvbUNoaWxkcmVuXG4gKiBAcGFyYW0ge0FycmF5PENvbXBvbmVudD59IGNvbW1pdFF1ZXVlIExpc3Qgb2YgY29tcG9uZW50cyB3aGljaCBoYXZlIGNhbGxiYWNrc1xuICogdG8gaW52b2tlIGluIGNvbW1pdFJvb3RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNIeWRyYXRpbmcgV2hldGhlciBvciBub3Qgd2UgYXJlIGluIGh5ZHJhdGlvblxuICogQHBhcmFtIHthbnlbXX0gcmVmUXVldWUgYW4gYXJyYXkgb2YgZWxlbWVudHMgbmVlZGVkIHRvIGludm9rZSByZWZzXG4gKiBAcmV0dXJucyB7UHJlYWN0RWxlbWVudH1cbiAqL1xuZnVuY3Rpb24gZGlmZkVsZW1lbnROb2Rlcyhcblx0ZG9tLFxuXHRuZXdWTm9kZSxcblx0b2xkVk5vZGUsXG5cdGdsb2JhbENvbnRleHQsXG5cdGlzU3ZnLFxuXHRleGNlc3NEb21DaGlsZHJlbixcblx0Y29tbWl0UXVldWUsXG5cdGlzSHlkcmF0aW5nLFxuXHRyZWZRdWV1ZVxuKSB7XG5cdGxldCBvbGRQcm9wcyA9IG9sZFZOb2RlLnByb3BzO1xuXHRsZXQgbmV3UHJvcHMgPSBuZXdWTm9kZS5wcm9wcztcblx0bGV0IG5vZGVUeXBlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChuZXdWTm9kZS50eXBlKTtcblx0LyoqIEB0eXBlIHthbnl9ICovXG5cdGxldCBpO1xuXHQvKiogQHR5cGUge3sgX19odG1sPzogc3RyaW5nIH19ICovXG5cdGxldCBuZXdIdG1sO1xuXHQvKiogQHR5cGUge3sgX19odG1sPzogc3RyaW5nIH19ICovXG5cdGxldCBvbGRIdG1sO1xuXHQvKiogQHR5cGUge0NvbXBvbmVudENoaWxkcmVufSAqL1xuXHRsZXQgbmV3Q2hpbGRyZW47XG5cdGxldCB2YWx1ZTtcblx0bGV0IGlucHV0VmFsdWU7XG5cdGxldCBjaGVja2VkO1xuXG5cdC8vIFRyYWNrcyBlbnRlcmluZyBhbmQgZXhpdGluZyBTVkcgbmFtZXNwYWNlIHdoZW4gZGVzY2VuZGluZyB0aHJvdWdoIHRoZSB0cmVlLlxuXHRpZiAobm9kZVR5cGUgPT09ICdzdmcnKSBpc1N2ZyA9IHRydWU7XG5cblx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuICE9IG51bGwpIHtcblx0XHRmb3IgKGkgPSAwOyBpIDwgZXhjZXNzRG9tQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhbHVlID0gZXhjZXNzRG9tQ2hpbGRyZW5baV07XG5cblx0XHRcdC8vIGlmIG5ld1ZOb2RlIG1hdGNoZXMgYW4gZWxlbWVudCBpbiBleGNlc3NEb21DaGlsZHJlbiBvciB0aGUgYGRvbWBcblx0XHRcdC8vIGFyZ3VtZW50IG1hdGNoZXMgYW4gZWxlbWVudCBpbiBleGNlc3NEb21DaGlsZHJlbiwgcmVtb3ZlIGl0IGZyb21cblx0XHRcdC8vIGV4Y2Vzc0RvbUNoaWxkcmVuIHNvIGl0IGlzbid0IGxhdGVyIHJlbW92ZWQgaW4gZGlmZkNoaWxkcmVuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHZhbHVlICYmXG5cdFx0XHRcdCdzZXRBdHRyaWJ1dGUnIGluIHZhbHVlID09PSAhIW5vZGVUeXBlICYmXG5cdFx0XHRcdChub2RlVHlwZSA/IHZhbHVlLmxvY2FsTmFtZSA9PT0gbm9kZVR5cGUgOiB2YWx1ZS5ub2RlVHlwZSA9PT0gMylcblx0XHRcdCkge1xuXHRcdFx0XHRkb20gPSB2YWx1ZTtcblx0XHRcdFx0ZXhjZXNzRG9tQ2hpbGRyZW5baV0gPSBudWxsO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoZG9tID09IG51bGwpIHtcblx0XHRpZiAobm9kZVR5cGUgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuZXdQcm9wcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGlzU3ZnKSB7XG5cdFx0XHRkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywgbm9kZVR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkb20gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5vZGVUeXBlLCBuZXdQcm9wcy5pcyAmJiBuZXdQcm9wcyk7XG5cdFx0fVxuXG5cdFx0Ly8gd2UgY3JlYXRlZCBhIG5ldyBwYXJlbnQsIHNvIG5vbmUgb2YgdGhlIHByZXZpb3VzbHkgYXR0YWNoZWQgY2hpbGRyZW4gY2FuIGJlIHJldXNlZDpcblx0XHRleGNlc3NEb21DaGlsZHJlbiA9IG51bGw7XG5cdFx0Ly8gd2UgYXJlIGNyZWF0aW5nIGEgbmV3IG5vZGUsIHNvIHdlIGNhbiBhc3N1bWUgdGhpcyBpcyBhIG5ldyBzdWJ0cmVlIChpblxuXHRcdC8vIGNhc2Ugd2UgYXJlIGh5ZHJhdGluZyksIHRoaXMgZGVvcHRzIHRoZSBoeWRyYXRlXG5cdFx0aXNIeWRyYXRpbmcgPSBmYWxzZTtcblx0fVxuXG5cdGlmIChub2RlVHlwZSA9PT0gbnVsbCkge1xuXHRcdC8vIER1cmluZyBoeWRyYXRpb24sIHdlIHN0aWxsIGhhdmUgdG8gc3BsaXQgbWVyZ2VkIHRleHQgZnJvbSBTU1InZCBIVE1MLlxuXHRcdGlmIChvbGRQcm9wcyAhPT0gbmV3UHJvcHMgJiYgKCFpc0h5ZHJhdGluZyB8fCBkb20uZGF0YSAhPT0gbmV3UHJvcHMpKSB7XG5cdFx0XHRkb20uZGF0YSA9IG5ld1Byb3BzO1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHQvLyBJZiBleGNlc3NEb21DaGlsZHJlbiB3YXMgbm90IG51bGwsIHJlcG9wdWxhdGUgaXQgd2l0aCB0aGUgY3VycmVudCBlbGVtZW50J3MgY2hpbGRyZW46XG5cdFx0ZXhjZXNzRG9tQ2hpbGRyZW4gPSBleGNlc3NEb21DaGlsZHJlbiAmJiBzbGljZS5jYWxsKGRvbS5jaGlsZE5vZGVzKTtcblxuXHRcdG9sZFByb3BzID0gb2xkVk5vZGUucHJvcHMgfHwgRU1QVFlfT0JKO1xuXG5cdFx0Ly8gSWYgd2UgYXJlIGluIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFyZSBub3QgaHlkcmF0aW5nIGJ1dCBhcmUgdXNpbmdcblx0XHQvLyBleGlzdGluZyBET00gKGUuZy4gcmVwbGFjZU5vZGUpIHdlIHNob3VsZCByZWFkIHRoZSBleGlzdGluZyBET01cblx0XHQvLyBhdHRyaWJ1dGVzIHRvIGRpZmYgdGhlbVxuXHRcdGlmICghaXNIeWRyYXRpbmcgJiYgZXhjZXNzRG9tQ2hpbGRyZW4gIT0gbnVsbCkge1xuXHRcdFx0b2xkUHJvcHMgPSB7fTtcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBkb20uYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YWx1ZSA9IGRvbS5hdHRyaWJ1dGVzW2ldO1xuXHRcdFx0XHRvbGRQcm9wc1t2YWx1ZS5uYW1lXSA9IHZhbHVlLnZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoaSBpbiBvbGRQcm9wcykge1xuXHRcdFx0dmFsdWUgPSBvbGRQcm9wc1tpXTtcblx0XHRcdGlmIChpID09ICdjaGlsZHJlbicpIHtcblx0XHRcdH0gZWxzZSBpZiAoaSA9PSAnZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwnKSB7XG5cdFx0XHRcdG9sZEh0bWwgPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoaSAhPT0gJ2tleScgJiYgIShpIGluIG5ld1Byb3BzKSkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIG51bGwsIHZhbHVlLCBpc1N2Zyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRHVyaW5nIGh5ZHJhdGlvbiwgcHJvcHMgYXJlIG5vdCBkaWZmZWQgYXQgYWxsIChpbmNsdWRpbmcgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpXG5cdFx0Ly8gQFRPRE8gd2Ugc2hvdWxkIHdhcm4gaW4gZGVidWcgbW9kZSB3aGVuIHByb3BzIGRvbid0IG1hdGNoIGhlcmUuXG5cdFx0Zm9yIChpIGluIG5ld1Byb3BzKSB7XG5cdFx0XHR2YWx1ZSA9IG5ld1Byb3BzW2ldO1xuXHRcdFx0aWYgKGkgPT0gJ2NoaWxkcmVuJykge1xuXHRcdFx0XHRuZXdDaGlsZHJlbiA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChpID09ICdkYW5nZXJvdXNseVNldElubmVySFRNTCcpIHtcblx0XHRcdFx0bmV3SHRtbCA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChpID09ICd2YWx1ZScpIHtcblx0XHRcdFx0aW5wdXRWYWx1ZSA9IHZhbHVlO1xuXHRcdFx0fSBlbHNlIGlmIChpID09ICdjaGVja2VkJykge1xuXHRcdFx0XHRjaGVja2VkID0gdmFsdWU7XG5cdFx0XHR9IGVsc2UgaWYgKFxuXHRcdFx0XHRpICE9PSAna2V5JyAmJlxuXHRcdFx0XHQoIWlzSHlkcmF0aW5nIHx8IHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSAmJlxuXHRcdFx0XHRvbGRQcm9wc1tpXSAhPT0gdmFsdWVcblx0XHRcdCkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIHZhbHVlLCBvbGRQcm9wc1tpXSwgaXNTdmcpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIElmIHRoZSBuZXcgdm5vZGUgZGlkbid0IGhhdmUgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwsIGRpZmYgaXRzIGNoaWxkcmVuXG5cdFx0aWYgKG5ld0h0bWwpIHtcblx0XHRcdC8vIEF2b2lkIHJlLWFwcGx5aW5nIHRoZSBzYW1lICdfX2h0bWwnIGlmIGl0IGRpZCBub3QgY2hhbmdlZCBiZXR3ZWVuIHJlLXJlbmRlclxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhaXNIeWRyYXRpbmcgJiZcblx0XHRcdFx0KCFvbGRIdG1sIHx8XG5cdFx0XHRcdFx0KG5ld0h0bWwuX19odG1sICE9PSBvbGRIdG1sLl9faHRtbCAmJlxuXHRcdFx0XHRcdFx0bmV3SHRtbC5fX2h0bWwgIT09IGRvbS5pbm5lckhUTUwpKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGRvbS5pbm5lckhUTUwgPSBuZXdIdG1sLl9faHRtbDtcblx0XHRcdH1cblxuXHRcdFx0bmV3Vk5vZGUuX2NoaWxkcmVuID0gW107XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmIChvbGRIdG1sKSBkb20uaW5uZXJIVE1MID0gJyc7XG5cblx0XHRcdGRpZmZDaGlsZHJlbihcblx0XHRcdFx0ZG9tLFxuXHRcdFx0XHRpc0FycmF5KG5ld0NoaWxkcmVuKSA/IG5ld0NoaWxkcmVuIDogW25ld0NoaWxkcmVuXSxcblx0XHRcdFx0bmV3Vk5vZGUsXG5cdFx0XHRcdG9sZFZOb2RlLFxuXHRcdFx0XHRnbG9iYWxDb250ZXh0LFxuXHRcdFx0XHRpc1N2ZyAmJiBub2RlVHlwZSAhPT0gJ2ZvcmVpZ25PYmplY3QnLFxuXHRcdFx0XHRleGNlc3NEb21DaGlsZHJlbixcblx0XHRcdFx0Y29tbWl0UXVldWUsXG5cdFx0XHRcdGV4Y2Vzc0RvbUNoaWxkcmVuXG5cdFx0XHRcdFx0PyBleGNlc3NEb21DaGlsZHJlblswXVxuXHRcdFx0XHRcdDogb2xkVk5vZGUuX2NoaWxkcmVuICYmIGdldERvbVNpYmxpbmcob2xkVk5vZGUsIDApLFxuXHRcdFx0XHRpc0h5ZHJhdGluZyxcblx0XHRcdFx0cmVmUXVldWVcblx0XHRcdCk7XG5cblx0XHRcdC8vIFJlbW92ZSBjaGlsZHJlbiB0aGF0IGFyZSBub3QgcGFydCBvZiBhbnkgdm5vZGUuXG5cdFx0XHRpZiAoZXhjZXNzRG9tQ2hpbGRyZW4gIT0gbnVsbCkge1xuXHRcdFx0XHRmb3IgKGkgPSBleGNlc3NEb21DaGlsZHJlbi5sZW5ndGg7IGktLTsgKSB7XG5cdFx0XHRcdFx0aWYgKGV4Y2Vzc0RvbUNoaWxkcmVuW2ldICE9IG51bGwpIHJlbW92ZU5vZGUoZXhjZXNzRG9tQ2hpbGRyZW5baV0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQXMgYWJvdmUsIGRvbid0IGRpZmYgcHJvcHMgZHVyaW5nIGh5ZHJhdGlvblxuXHRcdGlmICghaXNIeWRyYXRpbmcpIHtcblx0XHRcdGkgPSAndmFsdWUnO1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRpbnB1dFZhbHVlICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0Ly8gIzI3NTYgRm9yIHRoZSA8cHJvZ3Jlc3M+LWVsZW1lbnQgdGhlIGluaXRpYWwgdmFsdWUgaXMgMCxcblx0XHRcdFx0Ly8gZGVzcGl0ZSB0aGUgYXR0cmlidXRlIG5vdCBiZWluZyBwcmVzZW50LiBXaGVuIHRoZSBhdHRyaWJ1dGVcblx0XHRcdFx0Ly8gaXMgbWlzc2luZyB0aGUgcHJvZ3Jlc3MgYmFyIGlzIHRyZWF0ZWQgYXMgaW5kZXRlcm1pbmF0ZS5cblx0XHRcdFx0Ly8gVG8gZml4IHRoYXQgd2UnbGwgYWx3YXlzIHVwZGF0ZSBpdCB3aGVuIGl0IGlzIDAgZm9yIHByb2dyZXNzIGVsZW1lbnRzXG5cdFx0XHRcdChpbnB1dFZhbHVlICE9PSBkb21baV0gfHxcblx0XHRcdFx0XHQobm9kZVR5cGUgPT09ICdwcm9ncmVzcycgJiYgIWlucHV0VmFsdWUpIHx8XG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBvbmx5IGZvciBJRSAxMSB0byBmaXggPHNlbGVjdD4gdmFsdWUgbm90IGJlaW5nIHVwZGF0ZWQuXG5cdFx0XHRcdFx0Ly8gVG8gYXZvaWQgYSBzdGFsZSBzZWxlY3QgdmFsdWUgd2UgbmVlZCB0byBzZXQgdGhlIG9wdGlvbi52YWx1ZVxuXHRcdFx0XHRcdC8vIGFnYWluLCB3aGljaCB0cmlnZ2VycyBJRTExIHRvIHJlLWV2YWx1YXRlIHRoZSBzZWxlY3QgdmFsdWVcblx0XHRcdFx0XHQobm9kZVR5cGUgPT09ICdvcHRpb24nICYmIGlucHV0VmFsdWUgIT09IG9sZFByb3BzW2ldKSlcblx0XHRcdCkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIGlucHV0VmFsdWUsIG9sZFByb3BzW2ldLCBmYWxzZSk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSAnY2hlY2tlZCc7XG5cdFx0XHRpZiAoY2hlY2tlZCAhPT0gdW5kZWZpbmVkICYmIGNoZWNrZWQgIT09IGRvbVtpXSkge1xuXHRcdFx0XHRzZXRQcm9wZXJ0eShkb20sIGksIGNoZWNrZWQsIG9sZFByb3BzW2ldLCBmYWxzZSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGRvbTtcbn1cblxuLyoqXG4gKiBJbnZva2Ugb3IgdXBkYXRlIGEgcmVmLCBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBhIGZ1bmN0aW9uIG9yIG9iamVjdCByZWYuXG4gKiBAcGFyYW0ge1JlZjxhbnk+fSByZWZcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtWTm9kZX0gdm5vZGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UmVmKHJlZiwgdmFsdWUsIHZub2RlKSB7XG5cdHRyeSB7XG5cdFx0aWYgKHR5cGVvZiByZWYgPT0gJ2Z1bmN0aW9uJykgcmVmKHZhbHVlKTtcblx0XHRlbHNlIHJlZi5jdXJyZW50ID0gdmFsdWU7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIHZub2RlKTtcblx0fVxufVxuXG4vKipcbiAqIFVubW91bnQgYSB2aXJ0dWFsIG5vZGUgZnJvbSB0aGUgdHJlZSBhbmQgYXBwbHkgRE9NIGNoYW5nZXNcbiAqIEBwYXJhbSB7Vk5vZGV9IHZub2RlIFRoZSB2aXJ0dWFsIG5vZGUgdG8gdW5tb3VudFxuICogQHBhcmFtIHtWTm9kZX0gcGFyZW50Vk5vZGUgVGhlIHBhcmVudCBvZiB0aGUgVk5vZGUgdGhhdCBpbml0aWF0ZWQgdGhlIHVubW91bnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NraXBSZW1vdmVdIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBhIHBhcmVudCBub2RlIG9mIHRoZVxuICogY3VycmVudCBlbGVtZW50IGlzIGFscmVhZHkgZGV0YWNoZWQgZnJvbSB0aGUgRE9NLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5tb3VudCh2bm9kZSwgcGFyZW50Vk5vZGUsIHNraXBSZW1vdmUpIHtcblx0bGV0IHI7XG5cdGlmIChvcHRpb25zLnVubW91bnQpIG9wdGlvbnMudW5tb3VudCh2bm9kZSk7XG5cblx0aWYgKChyID0gdm5vZGUucmVmKSkge1xuXHRcdGlmICghci5jdXJyZW50IHx8IHIuY3VycmVudCA9PT0gdm5vZGUuX2RvbSkge1xuXHRcdFx0YXBwbHlSZWYociwgbnVsbCwgcGFyZW50Vk5vZGUpO1xuXHRcdH1cblx0fVxuXG5cdGlmICgociA9IHZub2RlLl9jb21wb25lbnQpICE9IG51bGwpIHtcblx0XHRpZiAoci5jb21wb25lbnRXaWxsVW5tb3VudCkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ci5jb21wb25lbnRXaWxsVW5tb3VudCgpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIHBhcmVudFZOb2RlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyLmJhc2UgPSByLl9wYXJlbnREb20gPSBudWxsO1xuXHRcdHZub2RlLl9jb21wb25lbnQgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoKHIgPSB2bm9kZS5fY2hpbGRyZW4pKSB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAocltpXSkge1xuXHRcdFx0XHR1bm1vdW50KFxuXHRcdFx0XHRcdHJbaV0sXG5cdFx0XHRcdFx0cGFyZW50Vk5vZGUsXG5cdFx0XHRcdFx0c2tpcFJlbW92ZSB8fCB0eXBlb2Ygdm5vZGUudHlwZSAhPT0gJ2Z1bmN0aW9uJ1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICghc2tpcFJlbW92ZSAmJiB2bm9kZS5fZG9tICE9IG51bGwpIHtcblx0XHRyZW1vdmVOb2RlKHZub2RlLl9kb20pO1xuXHR9XG5cblx0Ly8gTXVzdCBiZSBzZXQgdG8gYHVuZGVmaW5lZGAgdG8gcHJvcGVybHkgY2xlYW4gdXAgYF9uZXh0RG9tYFxuXHQvLyBmb3Igd2hpY2ggYG51bGxgIGlzIGEgdmFsaWQgdmFsdWUuIFNlZSBjb21tZW50IGluIGBjcmVhdGUtZWxlbWVudC5qc2Bcblx0dm5vZGUuX3BhcmVudCA9IHZub2RlLl9kb20gPSB2bm9kZS5fbmV4dERvbSA9IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBgLnJlbmRlcigpYCBtZXRob2QgZm9yIGEgUEZDIGJhY2tpbmcgaW5zdGFuY2UuICovXG5mdW5jdGlvbiBkb1JlbmRlcihwcm9wcywgc3RhdGUsIGNvbnRleHQpIHtcblx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IocHJvcHMsIGNvbnRleHQpO1xufVxuIiwgImltcG9ydCB7IEVNUFRZX09CSiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNvbW1pdFJvb3QsIGRpZmYgfSBmcm9tICcuL2RpZmYvaW5kZXgnO1xuaW1wb3J0IHsgY3JlYXRlRWxlbWVudCwgRnJhZ21lbnQgfSBmcm9tICcuL2NyZWF0ZS1lbGVtZW50JztcbmltcG9ydCBvcHRpb25zIGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBzbGljZSB9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogUmVuZGVyIGEgUHJlYWN0IHZpcnR1YWwgbm9kZSBpbnRvIGEgRE9NIGVsZW1lbnRcbiAqIEBwYXJhbSB7Q29tcG9uZW50Q2hpbGR9IHZub2RlIFRoZSB2aXJ0dWFsIG5vZGUgdG8gcmVuZGVyXG4gKiBAcGFyYW0ge1ByZWFjdEVsZW1lbnR9IHBhcmVudERvbSBUaGUgRE9NIGVsZW1lbnQgdG8gcmVuZGVyIGludG9cbiAqIEBwYXJhbSB7UHJlYWN0RWxlbWVudCB8IG9iamVjdH0gW3JlcGxhY2VOb2RlXSBPcHRpb25hbDogQXR0ZW1wdCB0byByZS11c2UgYW5cbiAqIGV4aXN0aW5nIERPTSB0cmVlIHJvb3RlZCBhdCBgcmVwbGFjZU5vZGVgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXIodm5vZGUsIHBhcmVudERvbSwgcmVwbGFjZU5vZGUpIHtcblx0aWYgKG9wdGlvbnMuX3Jvb3QpIG9wdGlvbnMuX3Jvb3Qodm5vZGUsIHBhcmVudERvbSk7XG5cblx0Ly8gV2UgYWJ1c2UgdGhlIGByZXBsYWNlTm9kZWAgcGFyYW1ldGVyIGluIGBoeWRyYXRlKClgIHRvIHNpZ25hbCBpZiB3ZSBhcmUgaW5cblx0Ly8gaHlkcmF0aW9uIG1vZGUgb3Igbm90IGJ5IHBhc3NpbmcgdGhlIGBoeWRyYXRlYCBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEgRE9NXG5cdC8vIGVsZW1lbnQuLlxuXHRsZXQgaXNIeWRyYXRpbmcgPSB0eXBlb2YgcmVwbGFjZU5vZGUgPT0gJ2Z1bmN0aW9uJztcblxuXHQvLyBUbyBiZSBhYmxlIHRvIHN1cHBvcnQgY2FsbGluZyBgcmVuZGVyKClgIG11bHRpcGxlIHRpbWVzIG9uIHRoZSBzYW1lXG5cdC8vIERPTSBub2RlLCB3ZSBuZWVkIHRvIG9idGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgdHJlZS4gV2UgZG9cblx0Ly8gdGhpcyBieSBhc3NpZ25pbmcgYSBuZXcgYF9jaGlsZHJlbmAgcHJvcGVydHkgdG8gRE9NIG5vZGVzIHdoaWNoIHBvaW50c1xuXHQvLyB0byB0aGUgbGFzdCByZW5kZXJlZCB0cmVlLiBCeSBkZWZhdWx0IHRoaXMgcHJvcGVydHkgaXMgbm90IHByZXNlbnQsIHdoaWNoXG5cdC8vIG1lYW5zIHRoYXQgd2UgYXJlIG1vdW50aW5nIGEgbmV3IHRyZWUgZm9yIHRoZSBmaXJzdCB0aW1lLlxuXHRsZXQgb2xkVk5vZGUgPSBpc0h5ZHJhdGluZ1xuXHRcdD8gbnVsbFxuXHRcdDogKHJlcGxhY2VOb2RlICYmIHJlcGxhY2VOb2RlLl9jaGlsZHJlbikgfHwgcGFyZW50RG9tLl9jaGlsZHJlbjtcblxuXHR2bm9kZSA9ICgoIWlzSHlkcmF0aW5nICYmIHJlcGxhY2VOb2RlKSB8fCBwYXJlbnREb20pLl9jaGlsZHJlbiA9XG5cdFx0Y3JlYXRlRWxlbWVudChGcmFnbWVudCwgbnVsbCwgW3Zub2RlXSk7XG5cblx0Ly8gTGlzdCBvZiBlZmZlY3RzIHRoYXQgbmVlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgZGlmZmluZy5cblx0bGV0IGNvbW1pdFF1ZXVlID0gW10sXG5cdFx0cmVmUXVldWUgPSBbXTtcblx0ZGlmZihcblx0XHRwYXJlbnREb20sXG5cdFx0Ly8gRGV0ZXJtaW5lIHRoZSBuZXcgdm5vZGUgdHJlZSBhbmQgc3RvcmUgaXQgb24gdGhlIERPTSBlbGVtZW50IG9uXG5cdFx0Ly8gb3VyIGN1c3RvbSBgX2NoaWxkcmVuYCBwcm9wZXJ0eS5cblx0XHR2bm9kZSxcblx0XHRvbGRWTm9kZSB8fCBFTVBUWV9PQkosXG5cdFx0RU1QVFlfT0JKLFxuXHRcdHBhcmVudERvbS5vd25lclNWR0VsZW1lbnQgIT09IHVuZGVmaW5lZCxcblx0XHQhaXNIeWRyYXRpbmcgJiYgcmVwbGFjZU5vZGVcblx0XHRcdD8gW3JlcGxhY2VOb2RlXVxuXHRcdFx0OiBvbGRWTm9kZVxuXHRcdFx0PyBudWxsXG5cdFx0XHQ6IHBhcmVudERvbS5maXJzdENoaWxkXG5cdFx0XHQ/IHNsaWNlLmNhbGwocGFyZW50RG9tLmNoaWxkTm9kZXMpXG5cdFx0XHQ6IG51bGwsXG5cdFx0Y29tbWl0UXVldWUsXG5cdFx0IWlzSHlkcmF0aW5nICYmIHJlcGxhY2VOb2RlXG5cdFx0XHQ/IHJlcGxhY2VOb2RlXG5cdFx0XHQ6IG9sZFZOb2RlXG5cdFx0XHQ/IG9sZFZOb2RlLl9kb21cblx0XHRcdDogcGFyZW50RG9tLmZpcnN0Q2hpbGQsXG5cdFx0aXNIeWRyYXRpbmcsXG5cdFx0cmVmUXVldWVcblx0KTtcblxuXHQvLyBGbHVzaCBhbGwgcXVldWVkIGVmZmVjdHNcblx0Y29tbWl0Um9vdChjb21taXRRdWV1ZSwgdm5vZGUsIHJlZlF1ZXVlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQgd2l0aCBkYXRhIGZyb20gYSBQcmVhY3QgdmlydHVhbCBub2RlXG4gKiBAcGFyYW0ge0NvbXBvbmVudENoaWxkfSB2bm9kZSBUaGUgdmlydHVhbCBub2RlIHRvIHJlbmRlclxuICogQHBhcmFtIHtQcmVhY3RFbGVtZW50fSBwYXJlbnREb20gVGhlIERPTSBlbGVtZW50IHRvIHVwZGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZSh2bm9kZSwgcGFyZW50RG9tKSB7XG5cdHJlbmRlcih2bm9kZSwgcGFyZW50RG9tLCBoeWRyYXRlKTtcbn1cbiIsICJpbXBvcnQgeyBhc3NpZ24sIHNsaWNlIH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7IGNyZWF0ZVZOb2RlIH0gZnJvbSAnLi9jcmVhdGUtZWxlbWVudCc7XG5cbi8qKlxuICogQ2xvbmVzIHRoZSBnaXZlbiBWTm9kZSwgb3B0aW9uYWxseSBhZGRpbmcgYXR0cmlidXRlcy9wcm9wcyBhbmQgcmVwbGFjaW5nIGl0c1xuICogY2hpbGRyZW4uXG4gKiBAcGFyYW0ge1ZOb2RlfSB2bm9kZSBUaGUgdmlydHVhbCBET00gZWxlbWVudCB0byBjbG9uZVxuICogQHBhcmFtIHtvYmplY3R9IHByb3BzIEF0dHJpYnV0ZXMvcHJvcHMgdG8gYWRkIHdoZW4gY2xvbmluZ1xuICogQHBhcmFtIHtBcnJheTxDb21wb25lbnRDaGlsZHJlbj59IHJlc3QgQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIHdpbGwgYmUgdXNlZFxuICogYXMgcmVwbGFjZW1lbnQgY2hpbGRyZW4uXG4gKiBAcmV0dXJucyB7Vk5vZGV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbG9uZUVsZW1lbnQodm5vZGUsIHByb3BzLCBjaGlsZHJlbikge1xuXHRsZXQgbm9ybWFsaXplZFByb3BzID0gYXNzaWduKHt9LCB2bm9kZS5wcm9wcyksXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRpO1xuXG5cdGxldCBkZWZhdWx0UHJvcHM7XG5cblx0aWYgKHZub2RlLnR5cGUgJiYgdm5vZGUudHlwZS5kZWZhdWx0UHJvcHMpIHtcblx0XHRkZWZhdWx0UHJvcHMgPSB2bm9kZS50eXBlLmRlZmF1bHRQcm9wcztcblx0fVxuXG5cdGZvciAoaSBpbiBwcm9wcykge1xuXHRcdGlmIChpID09ICdrZXknKSBrZXkgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChpID09ICdyZWYnKSByZWYgPSBwcm9wc1tpXTtcblx0XHRlbHNlIGlmIChwcm9wc1tpXSA9PT0gdW5kZWZpbmVkICYmIGRlZmF1bHRQcm9wcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRub3JtYWxpemVkUHJvcHNbaV0gPSBkZWZhdWx0UHJvcHNbaV07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHByb3BzW2ldO1xuXHRcdH1cblx0fVxuXG5cdGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikge1xuXHRcdG5vcm1hbGl6ZWRQcm9wcy5jaGlsZHJlbiA9XG5cdFx0XHRhcmd1bWVudHMubGVuZ3RoID4gMyA/IHNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSA6IGNoaWxkcmVuO1xuXHR9XG5cblx0cmV0dXJuIGNyZWF0ZVZOb2RlKFxuXHRcdHZub2RlLnR5cGUsXG5cdFx0bm9ybWFsaXplZFByb3BzLFxuXHRcdGtleSB8fCB2bm9kZS5rZXksXG5cdFx0cmVmIHx8IHZub2RlLnJlZixcblx0XHRudWxsXG5cdCk7XG59XG4iLCAiLyoqXG4gKiBGaW5kIHRoZSBjbG9zZXN0IGVycm9yIGJvdW5kYXJ5IHRvIGEgdGhyb3duIGVycm9yIGFuZCBjYWxsIGl0XG4gKiBAcGFyYW0ge29iamVjdH0gZXJyb3IgVGhlIHRocm93biB2YWx1ZVxuICogQHBhcmFtIHtWTm9kZX0gdm5vZGUgVGhlIHZub2RlIHRoYXQgdGhyZXcgdGhlIGVycm9yIHRoYXQgd2FzIGNhdWdodCAoZXhjZXB0XG4gKiBmb3IgdW5tb3VudGluZyB3aGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRoZSBoaWdoZXN0IHBhcmVudCB0aGF0IHdhcyBiZWluZ1xuICogdW5tb3VudGVkKVxuICogQHBhcmFtIHtWTm9kZX0gW29sZFZOb2RlXVxuICogQHBhcmFtIHtFcnJvckluZm99IFtlcnJvckluZm9dXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfY2F0Y2hFcnJvcihlcnJvciwgdm5vZGUsIG9sZFZOb2RlLCBlcnJvckluZm8pIHtcblx0LyoqIEB0eXBlIHtDb21wb25lbnR9ICovXG5cdGxldCBjb21wb25lbnQsXG5cdFx0LyoqIEB0eXBlIHtDb21wb25lbnRUeXBlfSAqL1xuXHRcdGN0b3IsXG5cdFx0LyoqIEB0eXBlIHtib29sZWFufSAqL1xuXHRcdGhhbmRsZWQ7XG5cblx0Zm9yICg7ICh2bm9kZSA9IHZub2RlLl9wYXJlbnQpOyApIHtcblx0XHRpZiAoKGNvbXBvbmVudCA9IHZub2RlLl9jb21wb25lbnQpICYmICFjb21wb25lbnQuX3Byb2Nlc3NpbmdFeGNlcHRpb24pIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGN0b3IgPSBjb21wb25lbnQuY29uc3RydWN0b3I7XG5cblx0XHRcdFx0aWYgKGN0b3IgJiYgY3Rvci5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3IgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbXBvbmVudC5zZXRTdGF0ZShjdG9yLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcihlcnJvcikpO1xuXHRcdFx0XHRcdGhhbmRsZWQgPSBjb21wb25lbnQuX2RpcnR5O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGNvbXBvbmVudC5jb21wb25lbnREaWRDYXRjaCAhPSBudWxsKSB7XG5cdFx0XHRcdFx0Y29tcG9uZW50LmNvbXBvbmVudERpZENhdGNoKGVycm9yLCBlcnJvckluZm8gfHwge30pO1xuXHRcdFx0XHRcdGhhbmRsZWQgPSBjb21wb25lbnQuX2RpcnR5O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVGhpcyBpcyBhbiBlcnJvciBib3VuZGFyeS4gTWFyayBpdCBhcyBoYXZpbmcgYmFpbGVkIG91dCwgYW5kIHdoZXRoZXIgaXQgd2FzIG1pZC1oeWRyYXRpb24uXG5cdFx0XHRcdGlmIChoYW5kbGVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuIChjb21wb25lbnQuX3BlbmRpbmdFcnJvciA9IGNvbXBvbmVudCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0ZXJyb3IgPSBlO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRocm93IGVycm9yO1xufVxuIiwgImltcG9ydCB7IG9wdGlvbnMgfSBmcm9tICdwcmVhY3QnO1xuXG4vKiogQHR5cGUge251bWJlcn0gKi9cbmxldCBjdXJyZW50SW5kZXg7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xubGV0IGN1cnJlbnRDb21wb25lbnQ7XG5cbi8qKiBAdHlwZSB7aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50fSAqL1xubGV0IHByZXZpb3VzQ29tcG9uZW50O1xuXG4vKiogQHR5cGUge251bWJlcn0gKi9cbmxldCBjdXJyZW50SG9vayA9IDA7XG5cbi8qKiBAdHlwZSB7QXJyYXk8aW1wb3J0KCcuL2ludGVybmFsJykuQ29tcG9uZW50Pn0gKi9cbmxldCBhZnRlclBhaW50RWZmZWN0cyA9IFtdO1xuXG5sZXQgRU1QVFkgPSBbXTtcblxubGV0IG9sZEJlZm9yZURpZmYgPSBvcHRpb25zLl9kaWZmO1xubGV0IG9sZEJlZm9yZVJlbmRlciA9IG9wdGlvbnMuX3JlbmRlcjtcbmxldCBvbGRBZnRlckRpZmYgPSBvcHRpb25zLmRpZmZlZDtcbmxldCBvbGRDb21taXQgPSBvcHRpb25zLl9jb21taXQ7XG5sZXQgb2xkQmVmb3JlVW5tb3VudCA9IG9wdGlvbnMudW5tb3VudDtcblxuY29uc3QgUkFGX1RJTUVPVVQgPSAxMDA7XG5sZXQgcHJldlJhZjtcblxub3B0aW9ucy5fZGlmZiA9IHZub2RlID0+IHtcblx0Y3VycmVudENvbXBvbmVudCA9IG51bGw7XG5cdGlmIChvbGRCZWZvcmVEaWZmKSBvbGRCZWZvcmVEaWZmKHZub2RlKTtcbn07XG5cbm9wdGlvbnMuX3JlbmRlciA9IHZub2RlID0+IHtcblx0aWYgKG9sZEJlZm9yZVJlbmRlcikgb2xkQmVmb3JlUmVuZGVyKHZub2RlKTtcblxuXHRjdXJyZW50Q29tcG9uZW50ID0gdm5vZGUuX2NvbXBvbmVudDtcblx0Y3VycmVudEluZGV4ID0gMDtcblxuXHRjb25zdCBob29rcyA9IGN1cnJlbnRDb21wb25lbnQuX19ob29rcztcblx0aWYgKGhvb2tzKSB7XG5cdFx0aWYgKHByZXZpb3VzQ29tcG9uZW50ID09PSBjdXJyZW50Q29tcG9uZW50KSB7XG5cdFx0XHRob29rcy5fcGVuZGluZ0VmZmVjdHMgPSBbXTtcblx0XHRcdGN1cnJlbnRDb21wb25lbnQuX3JlbmRlckNhbGxiYWNrcyA9IFtdO1xuXHRcdFx0aG9va3MuX2xpc3QuZm9yRWFjaChob29rSXRlbSA9PiB7XG5cdFx0XHRcdGlmIChob29rSXRlbS5fbmV4dFZhbHVlKSB7XG5cdFx0XHRcdFx0aG9va0l0ZW0uX3ZhbHVlID0gaG9va0l0ZW0uX25leHRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRob29rSXRlbS5fcGVuZGluZ1ZhbHVlID0gRU1QVFk7XG5cdFx0XHRcdGhvb2tJdGVtLl9uZXh0VmFsdWUgPSBob29rSXRlbS5fcGVuZGluZ0FyZ3MgPSB1bmRlZmluZWQ7XG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzLmZvckVhY2goaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRob29rcy5fcGVuZGluZ0VmZmVjdHMuZm9yRWFjaChpbnZva2VFZmZlY3QpO1xuXHRcdFx0aG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0XHRjdXJyZW50SW5kZXggPSAwO1xuXHRcdH1cblx0fVxuXHRwcmV2aW91c0NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQ7XG59O1xuXG5vcHRpb25zLmRpZmZlZCA9IHZub2RlID0+IHtcblx0aWYgKG9sZEFmdGVyRGlmZikgb2xkQWZ0ZXJEaWZmKHZub2RlKTtcblxuXHRjb25zdCBjID0gdm5vZGUuX2NvbXBvbmVudDtcblx0aWYgKGMgJiYgYy5fX2hvb2tzKSB7XG5cdFx0aWYgKGMuX19ob29rcy5fcGVuZGluZ0VmZmVjdHMubGVuZ3RoKSBhZnRlclBhaW50KGFmdGVyUGFpbnRFZmZlY3RzLnB1c2goYykpO1xuXHRcdGMuX19ob29rcy5fbGlzdC5mb3JFYWNoKGhvb2tJdGVtID0+IHtcblx0XHRcdGlmIChob29rSXRlbS5fcGVuZGluZ0FyZ3MpIHtcblx0XHRcdFx0aG9va0l0ZW0uX2FyZ3MgPSBob29rSXRlbS5fcGVuZGluZ0FyZ3M7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaG9va0l0ZW0uX3BlbmRpbmdWYWx1ZSAhPT0gRU1QVFkpIHtcblx0XHRcdFx0aG9va0l0ZW0uX3ZhbHVlID0gaG9va0l0ZW0uX3BlbmRpbmdWYWx1ZTtcblx0XHRcdH1cblx0XHRcdGhvb2tJdGVtLl9wZW5kaW5nQXJncyA9IHVuZGVmaW5lZDtcblx0XHRcdGhvb2tJdGVtLl9wZW5kaW5nVmFsdWUgPSBFTVBUWTtcblx0XHR9KTtcblx0fVxuXHRwcmV2aW91c0NvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQgPSBudWxsO1xufTtcblxub3B0aW9ucy5fY29tbWl0ID0gKHZub2RlLCBjb21taXRRdWV1ZSkgPT4ge1xuXHRjb21taXRRdWV1ZS5zb21lKGNvbXBvbmVudCA9PiB7XG5cdFx0dHJ5IHtcblx0XHRcdGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLmZvckVhY2goaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRjb21wb25lbnQuX3JlbmRlckNhbGxiYWNrcyA9IGNvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLmZpbHRlcihjYiA9PlxuXHRcdFx0XHRjYi5fdmFsdWUgPyBpbnZva2VFZmZlY3QoY2IpIDogdHJ1ZVxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRjb21taXRRdWV1ZS5zb21lKGMgPT4ge1xuXHRcdFx0XHRpZiAoYy5fcmVuZGVyQ2FsbGJhY2tzKSBjLl9yZW5kZXJDYWxsYmFja3MgPSBbXTtcblx0XHRcdH0pO1xuXHRcdFx0Y29tbWl0UXVldWUgPSBbXTtcblx0XHRcdG9wdGlvbnMuX2NhdGNoRXJyb3IoZSwgY29tcG9uZW50Ll92bm9kZSk7XG5cdFx0fVxuXHR9KTtcblxuXHRpZiAob2xkQ29tbWl0KSBvbGRDb21taXQodm5vZGUsIGNvbW1pdFF1ZXVlKTtcbn07XG5cbm9wdGlvbnMudW5tb3VudCA9IHZub2RlID0+IHtcblx0aWYgKG9sZEJlZm9yZVVubW91bnQpIG9sZEJlZm9yZVVubW91bnQodm5vZGUpO1xuXG5cdGNvbnN0IGMgPSB2bm9kZS5fY29tcG9uZW50O1xuXHRpZiAoYyAmJiBjLl9faG9va3MpIHtcblx0XHRsZXQgaGFzRXJyb3JlZDtcblx0XHRjLl9faG9va3MuX2xpc3QuZm9yRWFjaChzID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGludm9rZUNsZWFudXAocyk7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGhhc0Vycm9yZWQgPSBlO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGMuX19ob29rcyA9IHVuZGVmaW5lZDtcblx0XHRpZiAoaGFzRXJyb3JlZCkgb3B0aW9ucy5fY2F0Y2hFcnJvcihoYXNFcnJvcmVkLCBjLl92bm9kZSk7XG5cdH1cbn07XG5cbi8qKlxuICogR2V0IGEgaG9vaydzIHN0YXRlIGZyb20gdGhlIGN1cnJlbnRDb21wb25lbnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGhvb2sgdG8gZ2V0XG4gKiBAcGFyYW0ge251bWJlcn0gdHlwZSBUaGUgaW5kZXggb2YgdGhlIGhvb2sgdG8gZ2V0XG4gKiBAcmV0dXJucyB7YW55fVxuICovXG5mdW5jdGlvbiBnZXRIb29rU3RhdGUoaW5kZXgsIHR5cGUpIHtcblx0aWYgKG9wdGlvbnMuX2hvb2spIHtcblx0XHRvcHRpb25zLl9ob29rKGN1cnJlbnRDb21wb25lbnQsIGluZGV4LCBjdXJyZW50SG9vayB8fCB0eXBlKTtcblx0fVxuXHRjdXJyZW50SG9vayA9IDA7XG5cblx0Ly8gTGFyZ2VseSBpbnNwaXJlZCBieTpcblx0Ly8gKiBodHRwczovL2dpdGh1Yi5jb20vbWljaGFlbC1rbGVpbi9mdW5jeS5qcy9ibG9iL2Y2YmU3MzQ2OGU2ZWM0NmIwZmY1YWEzY2M0YzliYWY3MmEyOTAyNWEvc3JjL2hvb2tzL2NvcmVfaG9va3MubWpzXG5cdC8vICogaHR0cHM6Ly9naXRodWIuY29tL21pY2hhZWwta2xlaW4vZnVuY3kuanMvYmxvYi82NTBiZWFhNThjNDNjMzNhNzQ4MjBhM2M5OGIzYzcwNzljZjJlMzMzL3NyYy9yZW5kZXJlci5tanNcblx0Ly8gT3RoZXIgaW1wbGVtZW50YXRpb25zIHRvIGxvb2sgYXQ6XG5cdC8vICogaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL21ub3gwNXFwOFxuXHRjb25zdCBob29rcyA9XG5cdFx0Y3VycmVudENvbXBvbmVudC5fX2hvb2tzIHx8XG5cdFx0KGN1cnJlbnRDb21wb25lbnQuX19ob29rcyA9IHtcblx0XHRcdF9saXN0OiBbXSxcblx0XHRcdF9wZW5kaW5nRWZmZWN0czogW11cblx0XHR9KTtcblxuXHRpZiAoaW5kZXggPj0gaG9va3MuX2xpc3QubGVuZ3RoKSB7XG5cdFx0aG9va3MuX2xpc3QucHVzaCh7IF9wZW5kaW5nVmFsdWU6IEVNUFRZIH0pO1xuXHR9XG5cdHJldHVybiBob29rcy5fbGlzdFtpbmRleF07XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW5kZXgnKS5TdGF0ZVVwZGF0ZXI8YW55Pn0gW2luaXRpYWxTdGF0ZV1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0YXRlKGluaXRpYWxTdGF0ZSkge1xuXHRjdXJyZW50SG9vayA9IDE7XG5cdHJldHVybiB1c2VSZWR1Y2VyKGludm9rZU9yUmV0dXJuLCBpbml0aWFsU3RhdGUpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuUmVkdWNlcjxhbnksIGFueT59IHJlZHVjZXJcbiAqIEBwYXJhbSB7aW1wb3J0KCcuL2luZGV4JykuU3RhdGVVcGRhdGVyPGFueT59IGluaXRpYWxTdGF0ZVxuICogQHBhcmFtIHsoaW5pdGlhbFN0YXRlOiBhbnkpID0+IHZvaWR9IFtpbml0XVxuICogQHJldHVybnMge1sgYW55LCAoc3RhdGU6IGFueSkgPT4gdm9pZCBdfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVkdWNlcihyZWR1Y2VyLCBpbml0aWFsU3RhdGUsIGluaXQpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5SZWR1Y2VySG9va1N0YXRlfSAqL1xuXHRjb25zdCBob29rU3RhdGUgPSBnZXRIb29rU3RhdGUoY3VycmVudEluZGV4KyssIDIpO1xuXHRob29rU3RhdGUuX3JlZHVjZXIgPSByZWR1Y2VyO1xuXHRpZiAoIWhvb2tTdGF0ZS5fY29tcG9uZW50KSB7XG5cdFx0aG9va1N0YXRlLl92YWx1ZSA9IFtcblx0XHRcdCFpbml0ID8gaW52b2tlT3JSZXR1cm4odW5kZWZpbmVkLCBpbml0aWFsU3RhdGUpIDogaW5pdChpbml0aWFsU3RhdGUpLFxuXG5cdFx0XHRhY3Rpb24gPT4ge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VmFsdWUgPSBob29rU3RhdGUuX25leHRWYWx1ZVxuXHRcdFx0XHRcdD8gaG9va1N0YXRlLl9uZXh0VmFsdWVbMF1cblx0XHRcdFx0XHQ6IGhvb2tTdGF0ZS5fdmFsdWVbMF07XG5cdFx0XHRcdGNvbnN0IG5leHRWYWx1ZSA9IGhvb2tTdGF0ZS5fcmVkdWNlcihjdXJyZW50VmFsdWUsIGFjdGlvbik7XG5cblx0XHRcdFx0aWYgKGN1cnJlbnRWYWx1ZSAhPT0gbmV4dFZhbHVlKSB7XG5cdFx0XHRcdFx0aG9va1N0YXRlLl9uZXh0VmFsdWUgPSBbbmV4dFZhbHVlLCBob29rU3RhdGUuX3ZhbHVlWzFdXTtcblx0XHRcdFx0XHRob29rU3RhdGUuX2NvbXBvbmVudC5zZXRTdGF0ZSh7fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdO1xuXG5cdFx0aG9va1N0YXRlLl9jb21wb25lbnQgPSBjdXJyZW50Q29tcG9uZW50O1xuXG5cdFx0aWYgKCFjdXJyZW50Q29tcG9uZW50Ll9oYXNTY3VGcm9tSG9va3MpIHtcblx0XHRcdGN1cnJlbnRDb21wb25lbnQuX2hhc1NjdUZyb21Ib29rcyA9IHRydWU7XG5cdFx0XHRsZXQgcHJldlNjdSA9IGN1cnJlbnRDb21wb25lbnQuc2hvdWxkQ29tcG9uZW50VXBkYXRlO1xuXHRcdFx0Y29uc3QgcHJldkNXVSA9IGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50V2lsbFVwZGF0ZTtcblxuXHRcdFx0Ly8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgZm9yY2VkIHVwZGF0ZSBgc2hvdWxkQ29tcG9uZW50VXBkYXRlYCB3aWxsXG5cdFx0XHQvLyBub3QgYmUgY2FsbGVkLiBCdXQgd2UgdXNlIHRoYXQgdG8gdXBkYXRlIHRoZSBob29rIHZhbHVlcywgc28gd2Vcblx0XHRcdC8vIG5lZWQgdG8gY2FsbCBpdC5cblx0XHRcdGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50V2lsbFVwZGF0ZSA9IGZ1bmN0aW9uIChwLCBzLCBjKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9mb3JjZSkge1xuXHRcdFx0XHRcdGxldCB0bXAgPSBwcmV2U2N1O1xuXHRcdFx0XHRcdC8vIENsZWFyIHRvIGF2b2lkIG90aGVyIHNDVSBob29rcyBmcm9tIGJlaW5nIGNhbGxlZFxuXHRcdFx0XHRcdHByZXZTY3UgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0dXBkYXRlSG9va1N0YXRlKHAsIHMsIGMpO1xuXHRcdFx0XHRcdHByZXZTY3UgPSB0bXA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocHJldkNXVSkgcHJldkNXVS5jYWxsKHRoaXMsIHAsIHMsIGMpO1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gVGhpcyBTQ1UgaGFzIHRoZSBwdXJwb3NlIG9mIGJhaWxpbmcgb3V0IGFmdGVyIHJlcGVhdGVkIHVwZGF0ZXNcblx0XHRcdC8vIHRvIHN0YXRlZnVsIGhvb2tzLlxuXHRcdFx0Ly8gd2Ugc3RvcmUgdGhlIG5leHQgdmFsdWUgaW4gX25leHRWYWx1ZVswXSBhbmQga2VlcCBkb2luZyB0aGF0IGZvciBhbGxcblx0XHRcdC8vIHN0YXRlIHNldHRlcnMsIGlmIHdlIGhhdmUgbmV4dCBzdGF0ZXMgYW5kXG5cdFx0XHQvLyBhbGwgbmV4dCBzdGF0ZXMgd2l0aGluIGEgY29tcG9uZW50IGVuZCB1cCBiZWluZyBlcXVhbCB0byB0aGVpciBvcmlnaW5hbCBzdGF0ZVxuXHRcdFx0Ly8gd2UgYXJlIHNhZmUgdG8gYmFpbCBvdXQgZm9yIHRoaXMgc3BlY2lmaWMgY29tcG9uZW50LlxuXHRcdFx0LyoqXG5cdFx0XHQgKlxuXHRcdFx0ICogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbXBvbmVudFtcInNob3VsZENvbXBvbmVudFVwZGF0ZVwiXX1cblx0XHRcdCAqL1xuXHRcdFx0Ly8gQHRzLWlnbm9yZSAtIFdlIGRvbid0IHVzZSBUUyB0byBkb3dudHJhbnNwaWxlXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8taW5uZXItZGVjbGFyYXRpb25zXG5cdFx0XHRmdW5jdGlvbiB1cGRhdGVIb29rU3RhdGUocCwgcywgYykge1xuXHRcdFx0XHRpZiAoIWhvb2tTdGF0ZS5fY29tcG9uZW50Ll9faG9va3MpIHJldHVybiB0cnVlO1xuXG5cdFx0XHRcdGNvbnN0IHN0YXRlSG9va3MgPSBob29rU3RhdGUuX2NvbXBvbmVudC5fX2hvb2tzLl9saXN0LmZpbHRlcihcblx0XHRcdFx0XHR4ID0+IHguX2NvbXBvbmVudFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBhbGxIb29rc0VtcHR5ID0gc3RhdGVIb29rcy5ldmVyeSh4ID0+ICF4Ll9uZXh0VmFsdWUpO1xuXHRcdFx0XHQvLyBXaGVuIHdlIGhhdmUgbm8gdXBkYXRlZCBob29rcyBpbiB0aGUgY29tcG9uZW50IHdlIGludm9rZSB0aGUgcHJldmlvdXMgU0NVIG9yXG5cdFx0XHRcdC8vIHRyYXZlcnNlIHRoZSBWRE9NIHRyZWUgZnVydGhlci5cblx0XHRcdFx0aWYgKGFsbEhvb2tzRW1wdHkpIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJldlNjdSA/IHByZXZTY3UuY2FsbCh0aGlzLCBwLCBzLCBjKSA6IHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSBjaGVjayB3aGV0aGVyIHdlIGhhdmUgY29tcG9uZW50cyB3aXRoIGEgbmV4dFZhbHVlIHNldCB0aGF0XG5cdFx0XHRcdC8vIGhhdmUgdmFsdWVzIHRoYXQgYXJlbid0IGVxdWFsIHRvIG9uZSBhbm90aGVyIHRoaXMgcHVzaGVzXG5cdFx0XHRcdC8vIHVzIHRvIHVwZGF0ZSBmdXJ0aGVyIGRvd24gdGhlIHRyZWVcblx0XHRcdFx0bGV0IHNob3VsZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0XHRzdGF0ZUhvb2tzLmZvckVhY2goaG9va0l0ZW0gPT4ge1xuXHRcdFx0XHRcdGlmIChob29rSXRlbS5fbmV4dFZhbHVlKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50VmFsdWUgPSBob29rSXRlbS5fdmFsdWVbMF07XG5cdFx0XHRcdFx0XHRob29rSXRlbS5fdmFsdWUgPSBob29rSXRlbS5fbmV4dFZhbHVlO1xuXHRcdFx0XHRcdFx0aG9va0l0ZW0uX25leHRWYWx1ZSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50VmFsdWUgIT09IGhvb2tJdGVtLl92YWx1ZVswXSkgc2hvdWxkVXBkYXRlID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiBzaG91bGRVcGRhdGUgfHwgaG9va1N0YXRlLl9jb21wb25lbnQucHJvcHMgIT09IHBcblx0XHRcdFx0XHQ/IHByZXZTY3Vcblx0XHRcdFx0XHRcdD8gcHJldlNjdS5jYWxsKHRoaXMsIHAsIHMsIGMpXG5cdFx0XHRcdFx0XHQ6IHRydWVcblx0XHRcdFx0XHQ6IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50Q29tcG9uZW50LnNob3VsZENvbXBvbmVudFVwZGF0ZSA9IHVwZGF0ZUhvb2tTdGF0ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gaG9va1N0YXRlLl9uZXh0VmFsdWUgfHwgaG9va1N0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdH0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7YW55W119IGFyZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUVmZmVjdChjYWxsYmFjaywgYXJncykge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gKi9cblx0Y29uc3Qgc3RhdGUgPSBnZXRIb29rU3RhdGUoY3VycmVudEluZGV4KyssIDMpO1xuXHRpZiAoIW9wdGlvbnMuX3NraXBFZmZlY3RzICYmIGFyZ3NDaGFuZ2VkKHN0YXRlLl9hcmdzLCBhcmdzKSkge1xuXHRcdHN0YXRlLl92YWx1ZSA9IGNhbGxiYWNrO1xuXHRcdHN0YXRlLl9wZW5kaW5nQXJncyA9IGFyZ3M7XG5cblx0XHRjdXJyZW50Q29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3R9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VMYXlvdXRFZmZlY3QoY2FsbGJhY2ssIGFyZ3MpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA0KTtcblx0aWYgKCFvcHRpb25zLl9za2lwRWZmZWN0cyAmJiBhcmdzQ2hhbmdlZChzdGF0ZS5fYXJncywgYXJncykpIHtcblx0XHRzdGF0ZS5fdmFsdWUgPSBjYWxsYmFjaztcblx0XHRzdGF0ZS5fcGVuZGluZ0FyZ3MgPSBhcmdzO1xuXG5cdFx0Y3VycmVudENvbXBvbmVudC5fcmVuZGVyQ2FsbGJhY2tzLnB1c2goc3RhdGUpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWYoaW5pdGlhbFZhbHVlKSB7XG5cdGN1cnJlbnRIb29rID0gNTtcblx0cmV0dXJuIHVzZU1lbW8oKCkgPT4gKHsgY3VycmVudDogaW5pdGlhbFZhbHVlIH0pLCBbXSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHJlZlxuICogQHBhcmFtIHsoKSA9PiBvYmplY3R9IGNyZWF0ZUhhbmRsZVxuICogQHBhcmFtIHthbnlbXX0gYXJnc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsIGNyZWF0ZUhhbmRsZSwgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDY7XG5cdHVzZUxheW91dEVmZmVjdChcblx0XHQoKSA9PiB7XG5cdFx0XHRpZiAodHlwZW9mIHJlZiA9PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdHJlZihjcmVhdGVIYW5kbGUoKSk7XG5cdFx0XHRcdHJldHVybiAoKSA9PiByZWYobnVsbCk7XG5cdFx0XHR9IGVsc2UgaWYgKHJlZikge1xuXHRcdFx0XHRyZWYuY3VycmVudCA9IGNyZWF0ZUhhbmRsZSgpO1xuXHRcdFx0XHRyZXR1cm4gKCkgPT4gKHJlZi5jdXJyZW50ID0gbnVsbCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRhcmdzID09IG51bGwgPyBhcmdzIDogYXJncy5jb25jYXQocmVmKVxuXHQpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7KCkgPT4gYW55fSBmYWN0b3J5XG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VNZW1vKGZhY3RvcnksIGFyZ3MpIHtcblx0LyoqIEB0eXBlIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5NZW1vSG9va1N0YXRlfSAqL1xuXHRjb25zdCBzdGF0ZSA9IGdldEhvb2tTdGF0ZShjdXJyZW50SW5kZXgrKywgNyk7XG5cdGlmIChhcmdzQ2hhbmdlZChzdGF0ZS5fYXJncywgYXJncykpIHtcblx0XHRzdGF0ZS5fcGVuZGluZ1ZhbHVlID0gZmFjdG9yeSgpO1xuXHRcdHN0YXRlLl9wZW5kaW5nQXJncyA9IGFyZ3M7XG5cdFx0c3RhdGUuX2ZhY3RvcnkgPSBmYWN0b3J5O1xuXHRcdHJldHVybiBzdGF0ZS5fcGVuZGluZ1ZhbHVlO1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cblxuLyoqXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gKiBAcGFyYW0ge2FueVtdfSBhcmdzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VDYWxsYmFjayhjYWxsYmFjaywgYXJncykge1xuXHRjdXJyZW50SG9vayA9IDg7XG5cdHJldHVybiB1c2VNZW1vKCgpID0+IGNhbGxiYWNrLCBhcmdzKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLlByZWFjdENvbnRleHR9IGNvbnRleHRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUNvbnRleHQoY29udGV4dCkge1xuXHRjb25zdCBwcm92aWRlciA9IGN1cnJlbnRDb21wb25lbnQuY29udGV4dFtjb250ZXh0Ll9pZF07XG5cdC8vIFdlIGNvdWxkIHNraXAgdGhpcyBjYWxsIGhlcmUsIGJ1dCB0aGFuIHdlJ2Qgbm90IGNhbGxcblx0Ly8gYG9wdGlvbnMuX2hvb2tgLiBXZSBuZWVkIHRvIGRvIHRoYXQgaW4gb3JkZXIgdG8gbWFrZVxuXHQvLyB0aGUgZGV2dG9vbHMgYXdhcmUgb2YgdGhpcyBob29rLlxuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkNvbnRleHRIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCA5KTtcblx0Ly8gVGhlIGRldnRvb2xzIG5lZWRzIGFjY2VzcyB0byB0aGUgY29udGV4dCBvYmplY3QgdG9cblx0Ly8gYmUgYWJsZSB0byBwdWxsIG9mIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gbm8gcHJvdmlkZXJcblx0Ly8gaXMgcHJlc2VudCBpbiB0aGUgdHJlZS5cblx0c3RhdGUuX2NvbnRleHQgPSBjb250ZXh0O1xuXHRpZiAoIXByb3ZpZGVyKSByZXR1cm4gY29udGV4dC5fZGVmYXVsdFZhbHVlO1xuXHQvLyBUaGlzIGlzIHByb2JhYmx5IG5vdCBzYWZlIHRvIGNvbnZlcnQgdG8gXCIhXCJcblx0aWYgKHN0YXRlLl92YWx1ZSA9PSBudWxsKSB7XG5cdFx0c3RhdGUuX3ZhbHVlID0gdHJ1ZTtcblx0XHRwcm92aWRlci5zdWIoY3VycmVudENvbXBvbmVudCk7XG5cdH1cblx0cmV0dXJuIHByb3ZpZGVyLnByb3BzLnZhbHVlO1xufVxuXG4vKipcbiAqIERpc3BsYXkgYSBjdXN0b20gbGFiZWwgZm9yIGEgY3VzdG9tIGhvb2sgZm9yIHRoZSBkZXZ0b29scyBwYW5lbFxuICogQHR5cGUgezxUPih2YWx1ZTogVCwgY2I/OiAodmFsdWU6IFQpID0+IHN0cmluZyB8IG51bWJlcikgPT4gdm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlcikge1xuXHRpZiAob3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKSB7XG5cdFx0b3B0aW9ucy51c2VEZWJ1Z1ZhbHVlKGZvcm1hdHRlciA/IGZvcm1hdHRlcih2YWx1ZSkgOiB2YWx1ZSk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0geyhlcnJvcjogYW55LCBlcnJvckluZm86IGltcG9ydCgncHJlYWN0JykuRXJyb3JJbmZvKSA9PiB2b2lkfSBjYlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlRXJyb3JCb3VuZGFyeShjYikge1xuXHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVycm9yQm91bmRhcnlIb29rU3RhdGV9ICovXG5cdGNvbnN0IHN0YXRlID0gZ2V0SG9va1N0YXRlKGN1cnJlbnRJbmRleCsrLCAxMCk7XG5cdGNvbnN0IGVyclN0YXRlID0gdXNlU3RhdGUoKTtcblx0c3RhdGUuX3ZhbHVlID0gY2I7XG5cdGlmICghY3VycmVudENvbXBvbmVudC5jb21wb25lbnREaWRDYXRjaCkge1xuXHRcdGN1cnJlbnRDb21wb25lbnQuY29tcG9uZW50RGlkQ2F0Y2ggPSAoZXJyLCBlcnJvckluZm8pID0+IHtcblx0XHRcdGlmIChzdGF0ZS5fdmFsdWUpIHN0YXRlLl92YWx1ZShlcnIsIGVycm9ySW5mbyk7XG5cdFx0XHRlcnJTdGF0ZVsxXShlcnIpO1xuXHRcdH07XG5cdH1cblx0cmV0dXJuIFtcblx0XHRlcnJTdGF0ZVswXSxcblx0XHQoKSA9PiB7XG5cdFx0XHRlcnJTdGF0ZVsxXSh1bmRlZmluZWQpO1xuXHRcdH1cblx0XTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUlkKCkge1xuXHRjb25zdCBzdGF0ZSA9IGdldEhvb2tTdGF0ZShjdXJyZW50SW5kZXgrKywgMTEpO1xuXHRpZiAoIXN0YXRlLl92YWx1ZSkge1xuXHRcdC8vIEdyYWIgZWl0aGVyIHRoZSByb290IG5vZGUgb3IgdGhlIG5lYXJlc3QgYXN5bmMgYm91bmRhcnkgbm9kZS5cblx0XHQvKiogQHR5cGUge2ltcG9ydCgnLi9pbnRlcm5hbC5kJykuVk5vZGV9ICovXG5cdFx0bGV0IHJvb3QgPSBjdXJyZW50Q29tcG9uZW50Ll92bm9kZTtcblx0XHR3aGlsZSAocm9vdCAhPT0gbnVsbCAmJiAhcm9vdC5fbWFzayAmJiByb290Ll9wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdHJvb3QgPSByb290Ll9wYXJlbnQ7XG5cdFx0fVxuXG5cdFx0bGV0IG1hc2sgPSByb290Ll9tYXNrIHx8IChyb290Ll9tYXNrID0gWzAsIDBdKTtcblx0XHRzdGF0ZS5fdmFsdWUgPSAnUCcgKyBtYXNrWzBdICsgJy0nICsgbWFza1sxXSsrO1xuXHR9XG5cblx0cmV0dXJuIHN0YXRlLl92YWx1ZTtcbn1cbi8qKlxuICogQWZ0ZXIgcGFpbnQgZWZmZWN0cyBjb25zdW1lci5cbiAqL1xuZnVuY3Rpb24gZmx1c2hBZnRlclBhaW50RWZmZWN0cygpIHtcblx0bGV0IGNvbXBvbmVudDtcblx0d2hpbGUgKChjb21wb25lbnQgPSBhZnRlclBhaW50RWZmZWN0cy5zaGlmdCgpKSkge1xuXHRcdGlmICghY29tcG9uZW50Ll9wYXJlbnREb20gfHwgIWNvbXBvbmVudC5fX2hvb2tzKSBjb250aW51ZTtcblx0XHR0cnkge1xuXHRcdFx0Y29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzLmZvckVhY2goaW52b2tlQ2xlYW51cCk7XG5cdFx0XHRjb21wb25lbnQuX19ob29rcy5fcGVuZGluZ0VmZmVjdHMuZm9yRWFjaChpbnZva2VFZmZlY3QpO1xuXHRcdFx0Y29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Y29tcG9uZW50Ll9faG9va3MuX3BlbmRpbmdFZmZlY3RzID0gW107XG5cdFx0XHRvcHRpb25zLl9jYXRjaEVycm9yKGUsIGNvbXBvbmVudC5fdm5vZGUpO1xuXHRcdH1cblx0fVxufVxuXG5sZXQgSEFTX1JBRiA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT0gJ2Z1bmN0aW9uJztcblxuLyoqXG4gKiBTY2hlZHVsZSBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGJyb3dzZXIgaGFzIGEgY2hhbmNlIHRvIHBhaW50IGEgbmV3IGZyYW1lLlxuICogRG8gdGhpcyBieSBjb21iaW5pbmcgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIChyQUYpICsgc2V0VGltZW91dCB0byBpbnZva2UgYSBjYWxsYmFjayBhZnRlclxuICogdGhlIG5leHQgYnJvd3NlciBmcmFtZS5cbiAqXG4gKiBBbHNvLCBzY2hlZHVsZSBhIHRpbWVvdXQgaW4gcGFyYWxsZWwgdG8gdGhlIHRoZSByQUYgdG8gZW5zdXJlIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkXG4gKiBldmVuIGlmIFJBRiBkb2Vzbid0IGZpcmUgKGZvciBleGFtcGxlIGlmIHRoZSBicm93c2VyIHRhYiBpcyBub3QgdmlzaWJsZSlcbiAqXG4gKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIGFmdGVyTmV4dEZyYW1lKGNhbGxiYWNrKSB7XG5cdGNvbnN0IGRvbmUgPSAoKSA9PiB7XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdGlmIChIQVNfUkFGKSBjYW5jZWxBbmltYXRpb25GcmFtZShyYWYpO1xuXHRcdHNldFRpbWVvdXQoY2FsbGJhY2spO1xuXHR9O1xuXHRjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dChkb25lLCBSQUZfVElNRU9VVCk7XG5cblx0bGV0IHJhZjtcblx0aWYgKEhBU19SQUYpIHtcblx0XHRyYWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZG9uZSk7XG5cdH1cbn1cblxuLy8gTm90ZTogaWYgc29tZW9uZSB1c2VkIG9wdGlvbnMuZGVib3VuY2VSZW5kZXJpbmcgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUsXG4vLyB0aGVuIGVmZmVjdHMgd2lsbCBBTFdBWVMgcnVuIG9uIHRoZSBORVhUIGZyYW1lIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgb25lLCBpbmN1cnJpbmcgYSB+MTZtcyBkZWxheS5cbi8vIFBlcmhhcHMgdGhpcyBpcyBub3Qgc3VjaCBhIGJpZyBkZWFsLlxuLyoqXG4gKiBTY2hlZHVsZSBhZnRlclBhaW50RWZmZWN0cyBmbHVzaCBhZnRlciB0aGUgYnJvd3NlciBwYWludHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZXdRdWV1ZUxlbmd0aFxuICovXG5mdW5jdGlvbiBhZnRlclBhaW50KG5ld1F1ZXVlTGVuZ3RoKSB7XG5cdGlmIChuZXdRdWV1ZUxlbmd0aCA9PT0gMSB8fCBwcmV2UmFmICE9PSBvcHRpb25zLnJlcXVlc3RBbmltYXRpb25GcmFtZSkge1xuXHRcdHByZXZSYWYgPSBvcHRpb25zLnJlcXVlc3RBbmltYXRpb25GcmFtZTtcblx0XHQocHJldlJhZiB8fCBhZnRlck5leHRGcmFtZSkoZmx1c2hBZnRlclBhaW50RWZmZWN0cyk7XG5cdH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydCgnLi9pbnRlcm5hbCcpLkVmZmVjdEhvb2tTdGF0ZX0gaG9va1xuICovXG5mdW5jdGlvbiBpbnZva2VDbGVhbnVwKGhvb2spIHtcblx0Ly8gQSBob29rIGNsZWFudXAgY2FuIGludHJvZHVjZSBhIGNhbGwgdG8gcmVuZGVyIHdoaWNoIGNyZWF0ZXMgYSBuZXcgcm9vdCwgdGhpcyB3aWxsIGNhbGwgb3B0aW9ucy52bm9kZVxuXHQvLyBhbmQgbW92ZSB0aGUgY3VycmVudENvbXBvbmVudCBhd2F5LlxuXHRjb25zdCBjb21wID0gY3VycmVudENvbXBvbmVudDtcblx0bGV0IGNsZWFudXAgPSBob29rLl9jbGVhbnVwO1xuXHRpZiAodHlwZW9mIGNsZWFudXAgPT0gJ2Z1bmN0aW9uJykge1xuXHRcdGhvb2suX2NsZWFudXAgPSB1bmRlZmluZWQ7XG5cdFx0Y2xlYW51cCgpO1xuXHR9XG5cblx0Y3VycmVudENvbXBvbmVudCA9IGNvbXA7XG59XG5cbi8qKlxuICogSW52b2tlIGEgSG9vaydzIGVmZmVjdFxuICogQHBhcmFtIHtpbXBvcnQoJy4vaW50ZXJuYWwnKS5FZmZlY3RIb29rU3RhdGV9IGhvb2tcbiAqL1xuZnVuY3Rpb24gaW52b2tlRWZmZWN0KGhvb2spIHtcblx0Ly8gQSBob29rIGNhbGwgY2FuIGludHJvZHVjZSBhIGNhbGwgdG8gcmVuZGVyIHdoaWNoIGNyZWF0ZXMgYSBuZXcgcm9vdCwgdGhpcyB3aWxsIGNhbGwgb3B0aW9ucy52bm9kZVxuXHQvLyBhbmQgbW92ZSB0aGUgY3VycmVudENvbXBvbmVudCBhd2F5LlxuXHRjb25zdCBjb21wID0gY3VycmVudENvbXBvbmVudDtcblx0aG9vay5fY2xlYW51cCA9IGhvb2suX3ZhbHVlKCk7XG5cdGN1cnJlbnRDb21wb25lbnQgPSBjb21wO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7YW55W119IG9sZEFyZ3NcbiAqIEBwYXJhbSB7YW55W119IG5ld0FyZ3NcbiAqL1xuZnVuY3Rpb24gYXJnc0NoYW5nZWQob2xkQXJncywgbmV3QXJncykge1xuXHRyZXR1cm4gKFxuXHRcdCFvbGRBcmdzIHx8XG5cdFx0b2xkQXJncy5sZW5ndGggIT09IG5ld0FyZ3MubGVuZ3RoIHx8XG5cdFx0bmV3QXJncy5zb21lKChhcmcsIGluZGV4KSA9PiBhcmcgIT09IG9sZEFyZ3NbaW5kZXhdKVxuXHQpO1xufVxuXG5mdW5jdGlvbiBpbnZva2VPclJldHVybihhcmcsIGYpIHtcblx0cmV0dXJuIHR5cGVvZiBmID09ICdmdW5jdGlvbicgPyBmKGFyZykgOiBmO1xufVxuIiwgImNvbnN0IEVOQ09ERURfRU5USVRJRVMgPSAvW1wiJjxdLztcblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBzdHIgKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVFbnRpdGllcyhzdHIpIHtcblx0Ly8gU2tpcCBhbGwgd29yayBmb3Igc3RyaW5ncyB3aXRoIG5vIGVudGl0aWVzIG5lZWRpbmcgZW5jb2Rpbmc6XG5cdGlmIChzdHIubGVuZ3RoID09PSAwIHx8IEVOQ09ERURfRU5USVRJRVMudGVzdChzdHIpID09PSBmYWxzZSkgcmV0dXJuIHN0cjtcblxuXHRsZXQgbGFzdCA9IDAsXG5cdFx0aSA9IDAsXG5cdFx0b3V0ID0gJycsXG5cdFx0Y2ggPSAnJztcblxuXHQvLyBTZWVrIGZvcndhcmQgaW4gc3RyIHVudGlsIHRoZSBuZXh0IGVudGl0eSBjaGFyOlxuXHRmb3IgKDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuXHRcdHN3aXRjaCAoc3RyLmNoYXJDb2RlQXQoaSkpIHtcblx0XHRcdGNhc2UgMzQ6XG5cdFx0XHRcdGNoID0gJyZxdW90Oyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAzODpcblx0XHRcdFx0Y2ggPSAnJmFtcDsnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgNjA6XG5cdFx0XHRcdGNoID0gJyZsdDsnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHQvLyBBcHBlbmQgc2tpcHBlZC9idWZmZXJlZCBjaGFyYWN0ZXJzIGFuZCB0aGUgZW5jb2RlZCBlbnRpdHk6XG5cdFx0aWYgKGkgIT09IGxhc3QpIG91dCArPSBzdHIuc2xpY2UobGFzdCwgaSk7XG5cdFx0b3V0ICs9IGNoO1xuXHRcdC8vIFN0YXJ0IHRoZSBuZXh0IHNlZWsvYnVmZmVyIGFmdGVyIHRoZSBlbnRpdHkncyBvZmZzZXQ6XG5cdFx0bGFzdCA9IGkgKyAxO1xuXHR9XG5cdGlmIChpICE9PSBsYXN0KSBvdXQgKz0gc3RyLnNsaWNlKGxhc3QsIGkpO1xuXHRyZXR1cm4gb3V0O1xufVxuIiwgIi8qKiBOb3JtYWwgaHlkcmF0aW9uIHRoYXQgYXR0YWNoZXMgdG8gYSBET00gdHJlZSBidXQgZG9lcyBub3QgZGlmZiBpdC4gKi9cbmV4cG9ydCBjb25zdCBNT0RFX0hZRFJBVEUgPSAxIDw8IDU7XG4vKiogU2lnbmlmaWVzIHRoaXMgVk5vZGUgc3VzcGVuZGVkIG9uIHRoZSBwcmV2aW91cyByZW5kZXIgKi9cbmV4cG9ydCBjb25zdCBNT0RFX1NVU1BFTkRFRCA9IDEgPDwgNztcbi8qKiBJbmRpY2F0ZXMgdGhhdCB0aGlzIG5vZGUgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgd2hpbGUgcGF0Y2hpbmcgY2hpbGRyZW4gKi9cbmV4cG9ydCBjb25zdCBJTlNFUlRfVk5PREUgPSAxIDw8IDE2O1xuLyoqIEluZGljYXRlcyBhIFZOb2RlIGhhcyBiZWVuIG1hdGNoZWQgd2l0aCBhbm90aGVyIFZOb2RlIGluIHRoZSBkaWZmICovXG5leHBvcnQgY29uc3QgTUFUQ0hFRCA9IDEgPDwgMTc7XG5cbi8qKiBSZXNldCBhbGwgbW9kZSBmbGFncyAqL1xuZXhwb3J0IGNvbnN0IFJFU0VUX01PREUgPSB+KE1PREVfSFlEUkFURSB8IE1PREVfU1VTUEVOREVEKTtcblxuZXhwb3J0IGNvbnN0IEVNUFRZX09CSiA9IC8qKiBAdHlwZSB7YW55fSAqLyAoe30pO1xuZXhwb3J0IGNvbnN0IEVNUFRZX0FSUiA9IFtdO1xuZXhwb3J0IGNvbnN0IElTX05PTl9ESU1FTlNJT05BTCA9XG5cdC9hY2l0fGV4KD86c3xnfG58cHwkKXxycGh8Z3JpZHxvd3N8bW5jfG50d3xpbmVbY2hdfHpvb3xeb3JkfGl0ZXJhL2k7XG4iLCAiaW1wb3J0IHsgb3B0aW9ucywgRnJhZ21lbnQgfSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHsgZW5jb2RlRW50aXRpZXMgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IElTX05PTl9ESU1FTlNJT05BTCB9IGZyb20gJy4uLy4uL3NyYy9jb25zdGFudHMnO1xuXG5sZXQgdm5vZGVJZCA9IDA7XG5cbmNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG4vKipcbiAqIEBmaWxlb3ZlcnZpZXdcbiAqIFRoaXMgZmlsZSBleHBvcnRzIHZhcmlvdXMgbWV0aG9kcyB0aGF0IGltcGxlbWVudCBCYWJlbCdzIFwiYXV0b21hdGljXCIgSlNYIHJ1bnRpbWUgQVBJOlxuICogLSBqc3godHlwZSwgcHJvcHMsIGtleSlcbiAqIC0ganN4cyh0eXBlLCBwcm9wcywga2V5KVxuICogLSBqc3hERVYodHlwZSwgcHJvcHMsIGtleSwgX19zb3VyY2UsIF9fc2VsZilcbiAqXG4gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgY3JlYXRlVk5vZGUgaGVyZSBpcyBvcHRpbWl6ZWQgZm9yIHBlcmZvcm1hbmNlLlxuICogQmVuY2htYXJrczogaHR0cHM6Ly9lc2JlbmNoLmNvbS9iZW5jaC81ZjZiNTRhMGI0NjMyMTAwYTdkY2QyYjNcbiAqL1xuXG4vKipcbiAqIEpTWC5FbGVtZW50IGZhY3RvcnkgdXNlZCBieSBCYWJlbCdzIHtydW50aW1lOlwiYXV0b21hdGljXCJ9IEpTWCB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7Vk5vZGVbJ3R5cGUnXX0gdHlwZVxuICogQHBhcmFtIHtWTm9kZVsncHJvcHMnXX0gcHJvcHNcbiAqIEBwYXJhbSB7Vk5vZGVbJ2tleSddfSBba2V5XVxuICogQHBhcmFtIHt1bmtub3dufSBbaXNTdGF0aWNDaGlsZHJlbl1cbiAqIEBwYXJhbSB7dW5rbm93bn0gW19fc291cmNlXVxuICogQHBhcmFtIHt1bmtub3dufSBbX19zZWxmXVxuICovXG5mdW5jdGlvbiBjcmVhdGVWTm9kZSh0eXBlLCBwcm9wcywga2V5LCBpc1N0YXRpY0NoaWxkcmVuLCBfX3NvdXJjZSwgX19zZWxmKSB7XG5cdC8vIFdlJ2xsIHdhbnQgdG8gcHJlc2VydmUgYHJlZmAgaW4gcHJvcHMgdG8gZ2V0IHJpZCBvZiB0aGUgbmVlZCBmb3Jcblx0Ly8gZm9yd2FyZFJlZiBjb21wb25lbnRzIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGF0IHNob3VsZCBoYXBwZW4gdmlhXG5cdC8vIGEgc2VwYXJhdGUgUFIuXG5cdGxldCBub3JtYWxpemVkUHJvcHMgPSB7fSxcblx0XHRyZWYsXG5cdFx0aTtcblx0Zm9yIChpIGluIHByb3BzKSB7XG5cdFx0aWYgKGkgPT0gJ3JlZicpIHtcblx0XHRcdHJlZiA9IHByb3BzW2ldO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRub3JtYWxpemVkUHJvcHNbaV0gPSBwcm9wc1tpXTtcblx0XHR9XG5cdH1cblxuXHQvKiogQHR5cGUge1ZOb2RlICYgeyBfX3NvdXJjZTogYW55OyBfX3NlbGY6IGFueSB9fSAqL1xuXHRjb25zdCB2bm9kZSA9IHtcblx0XHR0eXBlLFxuXHRcdHByb3BzOiBub3JtYWxpemVkUHJvcHMsXG5cdFx0a2V5LFxuXHRcdHJlZixcblx0XHRfY2hpbGRyZW46IG51bGwsXG5cdFx0X3BhcmVudDogbnVsbCxcblx0XHRfZGVwdGg6IDAsXG5cdFx0X2RvbTogbnVsbCxcblx0XHRfbmV4dERvbTogdW5kZWZpbmVkLFxuXHRcdF9jb21wb25lbnQ6IG51bGwsXG5cdFx0Y29uc3RydWN0b3I6IHVuZGVmaW5lZCxcblx0XHRfb3JpZ2luYWw6IC0tdm5vZGVJZCxcblx0XHRfaW5kZXg6IC0xLFxuXHRcdF9mbGFnczogMCxcblx0XHRfX3NvdXJjZSxcblx0XHRfX3NlbGZcblx0fTtcblxuXHQvLyBJZiBhIENvbXBvbmVudCBWTm9kZSwgY2hlY2sgZm9yIGFuZCBhcHBseSBkZWZhdWx0UHJvcHMuXG5cdC8vIE5vdGU6IGB0eXBlYCBpcyBvZnRlbiBhIFN0cmluZywgYW5kIGNhbiBiZSBgdW5kZWZpbmVkYCBpbiBkZXZlbG9wbWVudC5cblx0aWYgKHR5cGVvZiB0eXBlID09PSAnZnVuY3Rpb24nICYmIChyZWYgPSB0eXBlLmRlZmF1bHRQcm9wcykpIHtcblx0XHRmb3IgKGkgaW4gcmVmKVxuXHRcdFx0aWYgKHR5cGVvZiBub3JtYWxpemVkUHJvcHNbaV0gPT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHRcdG5vcm1hbGl6ZWRQcm9wc1tpXSA9IHJlZltpXTtcblx0XHRcdH1cblx0fVxuXG5cdGlmIChvcHRpb25zLnZub2RlKSBvcHRpb25zLnZub2RlKHZub2RlKTtcblx0cmV0dXJuIHZub2RlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIHRlbXBsYXRlIHZub2RlLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBleHBlY3RlZCB0byBiZVxuICogdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGEgcHJlY29tcGlsZSBKU1ggdHJhbnNmb3JtXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB0ZW1wbGF0ZXNcbiAqIEBwYXJhbSAge0FycmF5PHN0cmluZyB8IG51bGwgfCBWTm9kZT59IGV4cHJzXG4gKiBAcmV0dXJucyB7Vk5vZGV9XG4gKi9cbmZ1bmN0aW9uIGpzeFRlbXBsYXRlKHRlbXBsYXRlcywgLi4uZXhwcnMpIHtcblx0Y29uc3Qgdm5vZGUgPSBjcmVhdGVWTm9kZShGcmFnbWVudCwgeyB0cGw6IHRlbXBsYXRlcywgZXhwcnMgfSk7XG5cdC8vIEJ5cGFzcyByZW5kZXIgdG8gc3RyaW5nIHRvcCBsZXZlbCBGcmFnbWVudCBvcHRpbWl6YXRpb25cblx0dm5vZGUua2V5ID0gdm5vZGUuX3Zub2RlO1xuXHRyZXR1cm4gdm5vZGU7XG59XG5cbmNvbnN0IEpTX1RPX0NTUyA9IHt9O1xuY29uc3QgQ1NTX1JFR0VYID0gL1tBLVpdL2c7XG5cbi8qKlxuICogU2VyaWFsaXplIGFuIEhUTUwgYXR0cmlidXRlIHRvIGEgc3RyaW5nLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdFxuICogZXhwZWN0ZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYnV0IHJhdGhlciB0aHJvdWdoIGEgcHJlY29tcGlsZVxuICogSlNYIHRyYW5zZm9ybVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBhdHRyaWJ1dGUgdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGpzeEF0dHIobmFtZSwgdmFsdWUpIHtcblx0aWYgKG9wdGlvbnMuYXR0cikge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG9wdGlvbnMuYXR0cihuYW1lLCB2YWx1ZSk7XG5cdFx0aWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0aWYgKG5hbWUgPT09ICdyZWYnIHx8IG5hbWUgPT09ICdrZXknKSByZXR1cm4gJyc7XG5cdGlmIChuYW1lID09PSAnc3R5bGUnICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcblx0XHRsZXQgc3RyID0gJyc7XG5cdFx0Zm9yIChsZXQgcHJvcCBpbiB2YWx1ZSkge1xuXHRcdFx0bGV0IHZhbCA9IHZhbHVlW3Byb3BdO1xuXHRcdFx0aWYgKHZhbCAhPSBudWxsICYmIHZhbCAhPT0gJycpIHtcblx0XHRcdFx0Y29uc3QgbmFtZSA9XG5cdFx0XHRcdFx0cHJvcFswXSA9PSAnLSdcblx0XHRcdFx0XHRcdD8gcHJvcFxuXHRcdFx0XHRcdFx0OiBKU19UT19DU1NbcHJvcF0gfHxcblx0XHRcdFx0XHRcdCAgKEpTX1RPX0NTU1twcm9wXSA9IHByb3AucmVwbGFjZShDU1NfUkVHRVgsICctJCYnKS50b0xvd2VyQ2FzZSgpKTtcblxuXHRcdFx0XHRsZXQgc3VmZml4ID0gJzsnO1xuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0dHlwZW9mIHZhbCA9PT0gJ251bWJlcicgJiZcblx0XHRcdFx0XHQvLyBFeGNsdWRlIGN1c3RvbS1hdHRyaWJ1dGVzXG5cdFx0XHRcdFx0IW5hbWUuc3RhcnRzV2l0aCgnLS0nKSAmJlxuXHRcdFx0XHRcdCFJU19OT05fRElNRU5TSU9OQUwudGVzdChuYW1lKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRzdWZmaXggPSAncHg7Jztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdHIgPSBzdHIgKyBuYW1lICsgJzonICsgdmFsICsgc3VmZml4O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gbmFtZSArICc9XCInICsgc3RyICsgJ1wiJztcblx0fVxuXG5cdGlmIChcblx0XHR2YWx1ZSA9PSBudWxsIHx8XG5cdFx0dmFsdWUgPT09IGZhbHNlIHx8XG5cdFx0dHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8XG5cdFx0dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuXHQpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH0gZWxzZSBpZiAodmFsdWUgPT09IHRydWUpIHJldHVybiBuYW1lO1xuXG5cdHJldHVybiBuYW1lICsgJz1cIicgKyBlbmNvZGVFbnRpdGllcyh2YWx1ZSkgKyAnXCInO1xufVxuXG4vKipcbiAqIEVzY2FwZSBhIGR5bmFtaWMgY2hpbGQgcGFzc2VkIHRvIGBqc3hUZW1wbGF0ZWAuIFRoaXMgZnVuY3Rpb25cbiAqIGlzIG5vdCBleHBlY3RlZCB0byBiZSB1c2VkIGRpcmVjdGx5LCBidXQgcmF0aGVyIHRocm91Z2ggYVxuICogcHJlY29tcGlsZSBKU1ggdHJhbnNmb3JtXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbCB8IFZOb2RlIHwgQXJyYXk8c3RyaW5nIHwgbnVsbCB8IFZOb2RlPn1cbiAqL1xuZnVuY3Rpb24ganN4RXNjYXBlKHZhbHVlKSB7XG5cdGlmIChcblx0XHR2YWx1ZSA9PSBudWxsIHx8XG5cdFx0dHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHxcblx0XHR0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbidcblx0KSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuXHRcdC8vIENoZWNrIGZvciBWTm9kZVxuXHRcdGlmICh2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7XG5cblx0XHRpZiAoaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0dmFsdWVbaV0gPSBqc3hFc2NhcGUodmFsdWVbaV0pO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbmNvZGVFbnRpdGllcygnJyArIHZhbHVlKTtcbn1cblxuZXhwb3J0IHtcblx0Y3JlYXRlVk5vZGUgYXMganN4LFxuXHRjcmVhdGVWTm9kZSBhcyBqc3hzLFxuXHRjcmVhdGVWTm9kZSBhcyBqc3hERVYsXG5cdEZyYWdtZW50LFxuXHQvLyBwcmVjb21waWxlZCBKU1ggdHJhbnNmb3JtXG5cdGpzeFRlbXBsYXRlLFxuXHRqc3hBdHRyLFxuXHRqc3hFc2NhcGVcbn07XG4iLCAiaW1wb3J0IHtGaXJlYmFzZUFwcCwgaW5pdGlhbGl6ZUFwcH0gZnJvbSAnZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7R29vZ2xlQXV0aFByb3ZpZGVyLCBzaWduSW5XaXRoUG9wdXB9IGZyb20gJ2ZpcmViYXNlL2F1dGgnO1xuaW1wb3J0IHtBdXRoLCBnZXRBdXRofSBmcm9tICdmaXJlYmFzZS9hdXRoJztcbmltcG9ydCB7cmVuZGVyfSBmcm9tICdwcmVhY3QnO1xuaW1wb3J0IHt1c2VTdGF0ZX0gZnJvbSAncHJlYWN0L2hvb2tzJztcbmltcG9ydCAnLi9zdHlsZXMvZ2xvYmFsLmNzcyc7XG5pbXBvcnQgJy4vc3R5bGVzL3NpZ25pbi5jc3MnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fUk9PVF9DVFg6IHtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGZpcmViYXNlQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIH07XG4gICAgZmlyZWJhc2U6IHtcbiAgICAgIGFwcDogRmlyZWJhc2VBcHA7XG4gICAgICBhdXRoOiBBdXRoO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gU2lnbkluKCkge1xuICBjb25zdCBbZXJyb3JNc2csIHNldEVycm9yTXNnXSA9IHVzZVN0YXRlKCcnKTtcbiAgY29uc3QgdGl0bGUgPSB3aW5kb3cuX19ST09UX0NUWC5uYW1lO1xuXG4gIGZ1bmN0aW9uIG9uRXJyb3IobXNnOiBzdHJpbmcpIHtcbiAgICBzZXRFcnJvck1zZyhtc2cpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInNpZ25pblwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJzaWduaW5fX2hlYWRsaW5lXCI+XG4gICAgICAgIHt0aXRsZSAmJiA8aDEgY2xhc3NOYW1lPVwic2lnbmluX19oZWFkbGluZV9fdGl0bGVcIj57dGl0bGV9PC9oMT59XG4gICAgICAgIDxwIGNsYXNzTmFtZT1cInNpZ25pbl9faGVhZGxpbmVfX2JvZHlcIj5cbiAgICAgICAgICB7dGl0bGUgPyBgU2lnbiBpbiB0byBjb250aW51ZSB0byAke3RpdGxlfWAgOiAnU2lnbiBpbiB0byBjb250aW51ZSd9XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPFNpZ25Jbi5CdXR0b24gb25FcnJvcj17b25FcnJvcn0gLz5cbiAgICAgIHtlcnJvck1zZyAmJiA8cCBjbGFzc05hbWU9XCJzaWduaW5fX2Vycm9yXCI+e2Vycm9yTXNnfTwvcD59XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmludGVyZmFjZSBCdXR0b25Qcm9wcyB7XG4gIG9uRXJyb3I6IChtc2c6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuU2lnbkluLkJ1dHRvbiA9IChwcm9wczogQnV0dG9uUHJvcHMpID0+IHtcbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UmVzRGF0YShyZXM6IFJlc3BvbnNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHJlcy5qc29uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHNpZ25JbigpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IG5ldyBHb29nbGVBdXRoUHJvdmlkZXIoKTtcbiAgICBwcm92aWRlci5hZGRTY29wZSgncHJvZmlsZScpO1xuICAgIHByb3ZpZGVyLmFkZFNjb3BlKCdlbWFpbCcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNpZ25JbldpdGhQb3B1cCh3aW5kb3cuZmlyZWJhc2UuYXV0aCwgcHJvdmlkZXIpO1xuICAgIGNvbnN0IHVzZXIgPSByZXN1bHQudXNlcjtcbiAgICBjb25zdCBpZFRva2VuID0gYXdhaXQgdXNlci5nZXRJZFRva2VuKCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9jbXMvbG9naW4nLCB7XG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtpZFRva2VufSksXG4gICAgfSk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldFJlc0RhdGEocmVzKTtcblxuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIGNvbnN0IGVtYWlsID0gdXNlcj8uZW1haWwgfHwgJyhubyBlbWFpbCknO1xuICAgICAgaWYgKGRhdGEucmVhc29uKSB7XG4gICAgICAgIHByb3BzLm9uRXJyb3IoXG4gICAgICAgICAgYExvZ2luIGZhaWxlZCBmb3I6ICR7ZW1haWx9LiBSZWFzb246ICR7ZGF0YS5yZWFzb259LiBJZiB5b3UgYmVsaWV2ZSB0aGlzIGlzIGEgbWlzdGFrZSwgcGxlYXNlIGNvbnRhY3QgYSBkZXZlbG9wZXIgdG8gaGVscCByZXNvbHZlIHRoZSBpc3N1ZS5gXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9wcy5vbkVycm9yKFxuICAgICAgICAgIGBMb2dpbiBmYWlsZWQgZm9yOiAke2VtYWlsfS4gSWYgeW91IGJlbGlldmUgdGhpcyBpcyBhIG1pc3Rha2UsIHBsZWFzZSBjb250YWN0IGEgZGV2ZWxvcGVyIHRvIGhlbHAgcmVzb2x2ZSB0aGUgaXNzdWUuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdsb2dpbiBmYWlsZWQnKTtcbiAgICAgIGNvbnNvbGUubG9nKHJlcy5zdGF0dXMsIGRhdGEpO1xuICAgICAgcHJvcHMub25FcnJvcignQW4gdW5rbm93biBlcnJvciBoYXMgb2NjdXJyZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdsb2dpbiBmYWlsZWQnKTtcbiAgICAgIGNvbnNvbGUubG9nKHJlcy5zdGF0dXMsIGRhdGEpO1xuICAgICAgaWYgKGRhdGEucmVhc29uKSB7XG4gICAgICAgIHByb3BzLm9uRXJyb3IoYExvZ2luIGZhaWxlZC4gUmVhc29uOiAke2RhdGEucmVhc29ufWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvcHMub25FcnJvcignTG9naW4gZmFpbGVkLicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2dpblN1Y2Nlc3NSZWRpcmVjdCgpO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8YnV0dG9uIGNsYXNzTmFtZT1cInNpZ25pbl9fYnV0dG9uXCIgb25DbGljaz17c2lnbklufT5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwic2lnbmluX19idXR0b25fX2ljb25cIj5cbiAgICAgICAgPFNpZ25Jbi5HTG9nbyAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInNpZ25pbl9fYnV0dG9uX19sYWJlbFwiPlNpZ24gaW4gd2l0aCBHb29nbGU8L2Rpdj5cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn07XG5cblNpZ25Jbi5HTG9nbyA9ICgpID0+IChcbiAgPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgNDggNDhcIj5cbiAgICA8Zz5cbiAgICAgIDxwYXRoXG4gICAgICAgIGZpbGw9XCIjRUE0MzM1XCJcbiAgICAgICAgZD1cIk0yNCA5LjVjMy41NCAwIDYuNzEgMS4yMiA5LjIxIDMuNmw2Ljg1LTYuODVDMzUuOSAyLjM4IDMwLjQ3IDAgMjQgMCAxNC42MiAwIDYuNTEgNS4zOCAyLjU2IDEzLjIybDcuOTggNi4xOUMxMi40MyAxMy43MiAxNy43NCA5LjUgMjQgOS41elwiXG4gICAgICA+PC9wYXRoPlxuICAgICAgPHBhdGhcbiAgICAgICAgZmlsbD1cIiM0Mjg1RjRcIlxuICAgICAgICBkPVwiTTQ2Ljk4IDI0LjU1YzAtMS41Ny0uMTUtMy4wOS0uMzgtNC41NUgyNHY5LjAyaDEyLjk0Yy0uNTggMi45Ni0yLjI2IDUuNDgtNC43OCA3LjE4bDcuNzMgNmM0LjUxLTQuMTggNy4wOS0xMC4zNiA3LjA5LTE3LjY1elwiXG4gICAgICA+PC9wYXRoPlxuICAgICAgPHBhdGhcbiAgICAgICAgZmlsbD1cIiNGQkJDMDVcIlxuICAgICAgICBkPVwiTTEwLjUzIDI4LjU5Yy0uNDgtMS40NS0uNzYtMi45OS0uNzYtNC41OXMuMjctMy4xNC43Ni00LjU5bC03Ljk4LTYuMTlDLjkyIDE2LjQ2IDAgMjAuMTIgMCAyNGMwIDMuODguOTIgNy41NCAyLjU2IDEwLjc4bDcuOTctNi4xOXpcIlxuICAgICAgPjwvcGF0aD5cbiAgICAgIDxwYXRoXG4gICAgICAgIGZpbGw9XCIjMzRBODUzXCJcbiAgICAgICAgZD1cIk0yNCA0OGM2LjQ4IDAgMTEuOTMtMi4xMyAxNS44OS01LjgxbC03LjczLTZjLTIuMTUgMS40NS00LjkyIDIuMy04LjE2IDIuMy02LjI2IDAtMTEuNTctNC4yMi0xMy40Ny05LjkxbC03Ljk4IDYuMTlDNi41MSA0Mi42MiAxNC42MiA0OCAyNCA0OHpcIlxuICAgICAgPjwvcGF0aD5cbiAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoNDh2NDhIMHpcIj48L3BhdGg+XG4gICAgPC9nPlxuICA8L3N2Zz5cbik7XG5cbmZ1bmN0aW9uIGxvZ2luU3VjY2Vzc1JlZGlyZWN0KCkge1xuICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO1xuICBsZXQgcmVkaXJlY3RVcmwgPSBwYXJhbXMuZ2V0KCdjb250aW51ZScpO1xuICBpZiAoXG4gICAgIXJlZGlyZWN0VXJsIHx8XG4gICAgIXJlZGlyZWN0VXJsLnN0YXJ0c1dpdGgoJy8nKSB8fFxuICAgIHJlZGlyZWN0VXJsLnN0YXJ0c1dpdGgoJy9jbXMvbG9naW4nKVxuICApIHtcbiAgICByZWRpcmVjdFVybCA9ICcvY21zJztcbiAgfVxuICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShyZWRpcmVjdFVybCk7XG59XG5cbmNvbnN0IGFwcCA9IGluaXRpYWxpemVBcHAod2luZG93Ll9fUk9PVF9DVFguZmlyZWJhc2VDb25maWcpO1xuY29uc3QgYXV0aCA9IGdldEF1dGgoYXBwKTtcbndpbmRvdy5maXJlYmFzZSA9IHthcHAsIGF1dGh9O1xuY29uc3Qgcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyb290JykhO1xucm9vdC5pbm5lckhUTUwgPSAnJztcbnJlbmRlcig8U2lnbkluIC8+LCByb290KTtcbiJdLAogICJtYXBwaW5ncyI6ICJtQkVpQkEsSUFBTUEsR0FBb0IsU0FBVUMsRUFBVyxDQUU3QyxJQUFNQyxFQUFnQixDQUFBLEVBQ2xCQyxFQUFJLEVBQ1IsUUFBU0MsRUFBSSxFQUFHQSxFQUFJSCxFQUFJLE9B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QUNMLEVBQUUsMElBQ0gsRUFDREEsRUFBQyxRQUNDLEtBQUssVUFDTCxFQUFFLDRIQUNILEVBQ0RBLEVBQUMsUUFDQyxLQUFLLFVBQ0wsRUFBRSxtSUFDSCxFQUNEQSxFQUFDLFFBQ0MsS0FBSyxVQUNMLEVBQUUsOElBQ0gsRUFDREEsRUFBQyxRQUFLLEtBQUssT0FBTyxFQUFFLGdCQUFnQixHQUN0QyxFQUNGLEVBR0YsU0FBU2EsSUFBdUIsQ0FFOUIsSUFBSUMsRUFEVyxJQUFJLGdCQUFnQixPQUFPLFNBQVMsTUFBTSxFQUNoQyxJQUFJLFVBQVUsR0FFckMsQ0FBQ0EsR0FDRCxDQUFDQSxFQUFZLFdBQVcsR0FBRyxHQUMzQkEsRUFBWSxXQUFXLFlBQVksS0FFbkNBLEVBQWMsUUFFaEIsT0FBTyxTQUFTLFFBQVFBLENBQVcsQ0FDckMsQ0FFQSxJQUFNQyxHQUFNQyxHQUFjLE9BQU8sV0FBVyxjQUFjLEVBQ3BEQyxHQUFPQyxHQUFRSCxFQUFHLEVBQ3hCLE9BQU8sU0FBVyxDQUFDLElBQUFBLEdBQUssS0FBQUUsRUFBSSxFQUM1QixJQUFNRSxHQUFPLFNBQVMsZUFBZSxNQUFNLEVBQzNDQSxHQUFLLFVBQVksR0FDakJDLEdBQU9wQixFQUFDUCxHQUFBLEVBQU8sRUFBSTBCLEVBQUkiLAogICJuYW1lcyI6IFsic3RyaW5nVG9CeXRlQXJyYXkiLCAic3RyIiwgIm91dCIsICJwIiwgImkiLCAiYyIsICJieXRlQXJyYXlUb1N0cmluZyIsICJieXRlcyIsICJwb3MiLCAiYzEiLCAiYzIiLCAiYzMiLCAiYzQiLCAidSIsICJiYXNlNjQiLCAiaW5wdXQiLCAid2ViU2FmZSIsICJieXRlVG9DaGFyTWFwIiwgIm91dHB1dCIsICJieXRlMSIsICJoYXZlQnl0ZTIiLCAiYnl0ZTIiLCAiaGF2ZUJ5dGUzIiwgImJ5dGUzIiwgIm91dEJ5dGUxIiwgIm91dEJ5dGUyIiwgIm91dEJ5dGUzIiwgIm91dEJ5dGU0IiwgImNoYXJUb0J5dGVNYXAiLCAiYnl0ZTQiLCAiRGVjb2RlQmFzZTY0U3RyaW5nRXJyb3IiLCAiYmFzZTY0RW5jb2RlIiwgInV0ZjhCeXRlcyIsICJiYXNlNjR1cmxFbmNvZGVXaXRob3V0UGFkZGluZyIsICJiYXNlNjREZWNvZGUiLCAiZ2V0R2xvYmFsIiwgImdldERlZmF1bHRzRnJvbUdsb2JhbCIsICJnZXREZWZhdWx0c0Zyb21FbnZWYXJpYWJsZSIsICJkZWZhdWx0c0pzb25TdHJpbmciLCAiZ2V0RGVmYXVsdHNGcm9tQ29va2llIiwgIm1hdGNoIiwgImRlY29kZWQiLCAiYmFzZTY0RGVjb2RlIiwgImdldERlZmF1bHRzIiwgImUiLCAiZ2V0RGVmYXVsdEVtdWxhdG9ySG9zdCIsICJwcm9kdWN0TmFtZSIsICJfYSIsICJfYiIsICJnZXREZWZhdWx0QXBwQ29uZmlnIiwgIl9hIiwgImdldERlZmF1bHRzIiwgImdldEV4cGVyaW1lbnRhbFNldHRpbmciLCAibmFtZSIsICJEZWZlcnJlZCIsICJyZXNvbHZlIiwgInJlamVjdCIsICJjYWxsYmFjayIsICJlcnJvciIsICJ2YWx1ZSIsICJnZXRVQSIsICJpc01vYmlsZUNvcmRvdmEiLCAiaXNCcm93c2VyRXh0ZW5zaW9uIiwgInJ1bnRpbWUiLCAiaXNSZWFjdE5hdGl2ZSIsICJpc0lFIiwgInVhIiwgImdldFVBIiwgImlzSW5kZXhlZERCQXZhaWxhYmxlIiwgInZhbGlkYXRlSW5kZXhlZERCT3BlbmFibGUiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAicHJlRXhpc3QiLCAiREJfQ0hFQ0tfTkFNRSIsICJyZXF1ZXN0IiwgIl9hIiwgImVycm9yIiwgIkVSUk9SX05BTUUiLCAiRmlyZWJhc2VFcnJvciIsICJfRmlyZWJhc2VFcnJvciIsICJjb2RlIiwgIm1lc3NhZ2UiLCAiY3VzdG9tRGF0YSIsICJFcnJvckZhY3RvcnkiLCAic2VydmljZSIsICJzZXJ2aWNlTmFtZSIsICJlcnJvcnMiLCAiZGF0YSIsICJmdWxsQ29kZSIsICJ0ZW1wbGF0ZSIsICJyZXBsYWNlVGVtcGxhdGUiLCAiZnVsbE1lc3NhZ2UiLCAiUEFUVEVSTiIsICJfIiwgImtleSIsICJ2YWx1ZSIsICJpc0VtcHR5IiwgIm9iaiIsICJrZXkiLCAiZGVlcEVxdWFsIiwgImEiLCAiYiIsICJhS2V5cyIsICJiS2V5cyIsICJrIiwgImFQcm9wIiwgImJQcm9wIiwgImlzT2JqZWN0IiwgInRoaW5nIiwgInF1ZXJ5c3RyaW5nIiwgInF1ZXJ5c3RyaW5nUGFyYW1zIiwgInBhcmFtcyIsICJrZXkiLCAidmFsdWUiLCAiYXJyYXlWYWwiLCAicXVlcnlzdHJpbmdEZWNvZGUiLCAib2JqIiwgInRva2VuIiwgImV4dHJhY3RRdWVyeXN0cmluZyIsICJ1cmwiLCAicXVlcnlTdGFydCIsICJmcmFnbWVudFN0YXJ0IiwgImNyZWF0ZVN1YnNjcmliZSIsICJleGVjdXRvciIsICJvbk5vT2JzZXJ2ZXJzIiwgInByb3h5IiwgIk9ic2VydmVyUHJveHkiLCAiZSIsICJ2YWx1ZSIsICJvYnNlcnZlciIsICJlcnJvciIsICJuZXh0T3JPYnNlcnZlciIsICJjb21wbGV0ZSIsICJpbXBsZW1lbnRzQW55TWV0aG9kcyIsICJub29wIiwgInVuc3ViIiwgImkiLCAiZm4iLCAiZXJyIiwgImltcGxlbWVudHNBbnlNZXRob2RzIiwgIm9iaiIsICJtZXRob2RzIiwgIm1ldGhvZCIsICJub29wIiwgIk1BWF9WQUxVRV9NSUxMSVMiLCAiZ2V0TW9kdWxhckluc3RhbmNlIiwgInNlcnZpY2UiLCAiQ29tcG9uZW50IiwgIm5hbWUiLCAiaW5zdGFuY2VGYWN0b3J5IiwgInR5cGUiLCAibW9kZSIsICJtdWx0aXBsZUluc3RhbmNlcyIsICJwcm9wcyIsICJjYWxsYmFjayIsICJERUZBVUxUX0VOVFJZX05BTUUiLCAiUHJvdmlkZXIiLCAiY29udGFpbmVyIiwgImlkZW50aWZpZXIiLCAibm9ybWFsaXplZElkZW50aWZpZXIiLCAiZGVmZXJyZWQiLCAiRGVmZXJyZWQiLCAiaW5zdGFuY2UiLCAib3B0aW9ucyIsICJvcHRpb25hbCIsICJfYSIsICJlIiwgImNvbXBvbmVudCIsICJpc0NvbXBvbmVudEVhZ2VyIiwgImluc3RhbmNlSWRlbnRpZmllciIsICJpbnN0YW5jZURlZmVycmVkIiwgInNlcnZpY2VzIiwgInNlcnZpY2UiLCAib3B0cyIsICJub3JtYWxpemVkRGVmZXJyZWRJZGVudGlmaWVyIiwgImV4aXN0aW5nQ2FsbGJhY2tzIiwgImV4aXN0aW5nSW5zdGFuY2UiLCAiY2FsbGJhY2tzIiwgIm5vcm1hbGl6ZUlkZW50aWZpZXJGb3JGYWN0b3J5IiwgIkNvbXBvbmVudENvbnRhaW5lciIsICJwcm92aWRlciIsICJpbnN0YW5jZXMiLCAiTG9nTGV2ZWwiLCAibGV2ZWxTdHJpbmdUb0VudW0iLCAiZGVmYXVsdExvZ0xldmVsIiwgIkNvbnNvbGVNZXRob2QiLCAiZGVmYXVsdExvZ0hhbmRsZXIiLCAiaW5zdGFuY2UiLCAibG9nVHlwZSIsICJhcmdzIiwgIm5vdyIsICJtZXRob2QiLCAiTG9nZ2VyIiwgIm5hbWUiLCAidmFsIiwgImluc3RhbmNlT2ZBbnkiLCAib2JqZWN0IiwgImNvbnN0cnVjdG9ycyIsICJjIiwgImlkYlByb3h5YWJsZVR5cGVzIiwgImN1cnNvckFkdmFuY2VNZXRob2RzIiwgImdldElkYlByb3h5YWJsZVR5cGVzIiwgImdldEN1cnNvckFkdmFuY2VNZXRob2RzIiwgImN1cnNvclJlcXVlc3RNYXAiLCAidHJhbnNhY3Rpb25Eb25lTWFwIiwgInRyYW5zYWN0aW9uU3RvcmVOYW1lc01hcCIsICJ0cmFuc2Zvcm1DYWNoZSIsICJyZXZlcnNlVHJhbnNmb3JtQ2FjaGUiLCAicHJvbWlzaWZ5UmVxdWVzdCIsICJyZXF1ZXN0IiwgInByb21pc2UiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAidW5saXN0ZW4iLCAic3VjY2VzcyIsICJlcnJvciIsICJ3cmFwIiwgInZhbHVlIiwgImNhY2hlRG9uZVByb21pc2VGb3JUcmFuc2FjdGlvbiIsICJ0eCIsICJkb25lIiwgImNvbXBsZXRlIiwgImlkYlByb3h5VHJhcHMiLCAidGFyZ2V0IiwgInByb3AiLCAicmVjZWl2ZXIiLCAicmVwbGFjZVRyYXBzIiwgImNhbGxiYWNrIiwgIndyYXBGdW5jdGlvbiIsICJmdW5jIiwgInN0b3JlTmFtZXMiLCAiYXJncyIsICJ1bndyYXAiLCAidHJhbnNmb3JtQ2FjaGFibGVWYWx1ZSIsICJuZXdWYWx1ZSIsICJvcGVuREIiLCAibmFtZSIsICJ2ZXJzaW9uIiwgImJsb2NrZWQiLCAidXBncmFkZSIsICJibG9ja2luZyIsICJ0ZXJtaW5hdGVkIiwgInJlcXVlc3QiLCAib3BlblByb21pc2UiLCAid3JhcCIsICJldmVudCIsICJkYiIsICJyZWFkTWV0aG9kcyIsICJ3cml0ZU1ldGhvZHMiLCAiY2FjaGVkTWV0aG9kcyIsICJnZXRNZXRob2QiLCAidGFyZ2V0IiwgInByb3AiLCAidGFyZ2V0RnVuY05hbWUiLCAidXNlSW5kZXgiLCAiaXNXcml0ZSIsICJtZXRob2QiLCAic3RvcmVOYW1lIiwgImFyZ3MiLCAidHgiLCAicmVwbGFjZVRyYXBzIiwgIm9sZFRyYXBzIiwgInJlY2VpdmVyIiwgIlBsYXRmb3JtTG9nZ2VyU2VydmljZUltcGwiLCAiY29udGFpbmVyIiwgInByb3ZpZGVyIiwgImlzVmVyc2lvblNlcnZpY2VQcm92aWRlciIsICJzZXJ2aWNlIiwgImxvZ1N0cmluZyIsICJjb21wb25lbnQiLCAibG9nZ2VyIiwgIkxvZ2dlciIsICJERUZBVUxUX0VOVFJZX05BTUUiLCAiUExBVEZPUk1fTE9HX1NUUklORyIsICJhcHBOYW1lIiwgImFwcENvbXBhdE5hbWUiLCAiYW5hbHl0aWNzTmFtZSIsICJhbmFseXRpY3NDb21wYXROYW1lIiwgImFwcENoZWNrTmFtZSIsICJhcHBDaGVja0NvbXBhdE5hbWUiLCAiYXV0aE5hbWUiLCAiYXV0aENvbXBhdE5hbWUiLCAiZGF0YWJhc2VOYW1lIiwgImRhdGFiYXNlQ29tcGF0TmFtZSIsICJmdW5jdGlvbnNOYW1lIiwgImZ1bmN0aW9uc0NvbXBhdE5hbWUiLCAiaW5zdGFsbGF0aW9uc05hbWUiLCAiaW5zdGFsbGF0aW9uc0NvbXBhdE5hbWUiLCAibWVzc2FnaW5nTmFtZSIsICJtZXNzYWdpbmdDb21wYXROYW1lIiwgInBlcmZvcm1hbmNlTmFtZSIsICJwZXJmb3JtYW5jZUNvbXBhdE5hbWUiLCAicmVtb3RlQ29uZmlnTmFtZSIsICJyZW1vdGVDb25maWdDb21wYXROYW1lIiwgInN0b3JhZ2VOYW1lIiwgInN0b3JhZ2VDb21wYXROYW1lIiwgImZpcmVzdG9yZU5hbWUiLCAiZmlyZXN0b3JlQ29tcGF0TmFtZSIsICJwYWNrYWdlTmFtZSIsICJfYXBwcyIsICJfY29tcG9uZW50cyIsICJfYWRkQ29tcG9uZW50IiwgImFwcCIsICJlIiwgIl9yZWdpc3RlckNvbXBvbmVudCIsICJjb21wb25lbnQiLCAiY29tcG9uZW50TmFtZSIsICJfY29tcG9uZW50cyIsICJsb2dnZXIiLCAiYXBwIiwgIl9hcHBzIiwgIl9hZGRDb21wb25lbnQiLCAiX2dldFByb3ZpZGVyIiwgIm5hbWUiLCAiaGVhcnRiZWF0Q29udHJvbGxlciIsICJFUlJPUlMiLCAiRVJST1JfRkFDVE9SWSIsICJFcnJvckZhY3RvcnkiLCAiRmlyZWJhc2VBcHBJbXBsIiwgIm9wdGlvbnMiLCAiY29uZmlnIiwgImNvbnRhaW5lciIsICJDb21wb25lbnQiLCAidmFsIiwgIlNES19WRVJTSU9OIiwgInZlcnNpb24iLCAiaW5pdGlhbGl6ZUFwcCIsICJfb3B0aW9ucyIsICJyYXdDb25maWciLCAiREVGQVVMVF9FTlRSWV9OQU1FIiwgIm5hbWUiLCAiZ2V0RGVmYXVsdEFwcENvbmZpZyIsICJleGlzdGluZ0FwcCIsICJfYXBwcyIsICJkZWVwRXF1YWwiLCAiQ29tcG9uZW50Q29udGFpbmVyIiwgImNvbXBvbmVudCIsICJfY29tcG9uZW50cyIsICJuZXdBcHAiLCAiZ2V0QXBwIiwgImFwcCIsICJyZWdpc3RlclZlcnNpb24iLCAibGlicmFyeUtleU9yTmFtZSIsICJ2ZXJzaW9uIiwgInZhcmlhbnQiLCAibGlicmFyeSIsICJfYSIsICJQTEFURk9STV9MT0dfU1RSSU5HIiwgImxpYnJhcnlNaXNtYXRjaCIsICJ2ZXJzaW9uTWlzbWF0Y2giLCAid2FybmluZyIsICJsb2dnZXIiLCAiX3JlZ2lzdGVyQ29tcG9uZW50IiwgIkNvbXBvbmVudCIsICJEQl9OQU1FIiwgIkRCX1ZFUlNJT04iLCAiU1RPUkVfTkFNRSIsICJkYlByb21pc2UiLCAiZ2V0RGJQcm9taXNlIiwgIm9wZW5EQiIsICJkYiIsICJvbGRWZXJzaW9uIiwgImUiLCAiRVJST1JfRkFDVE9SWSIsICJyZWFkSGVhcnRiZWF0c0Zyb21JbmRleGVkREIiLCAiYXBwIiwgImNvbXB1dGVLZXkiLCAiRmlyZWJhc2VFcnJvciIsICJsb2dnZXIiLCAiaWRiR2V0RXJyb3IiLCAid3JpdGVIZWFydGJlYXRzVG9JbmRleGVkREIiLCAiaGVhcnRiZWF0T2JqZWN0IiwgInR4IiwgIk1BWF9IRUFERVJfQllURVMiLCAiU1RPUkVEX0hFQVJUQkVBVF9SRVRFTlRJT05fTUFYX01JTExJUyIsICJIZWFydGJlYXRTZXJ2aWNlSW1wbCIsICJjb250YWluZXIiLCAiSGVhcnRiZWF0U3RvcmFnZUltcGwiLCAicmVzdWx0IiwgImFnZW50IiwgImRhdGUiLCAiZ2V0VVRDRGF0ZVN0cmluZyIsICJzaW5nbGVEYXRlSGVhcnRiZWF0IiwgImhiVGltZXN0YW1wIiwgImhlYXJ0YmVhdHNUb1NlbmQiLCAidW5zZW50RW50cmllcyIsICJleHRyYWN0SGVhcnRiZWF0c0ZvckhlYWRlciIsICJoZWFkZXJTdHJpbmciLCAiYmFzZTY0dXJsRW5jb2RlV2l0aG91dFBhZGRpbmciLCAiaGVhcnRiZWF0c0NhY2hlIiwgIm1heFNpemUiLCAiaGVhcnRiZWF0RW50cnkiLCAiaGIiLCAiY291bnRCeXRlcyIsICJpc0luZGV4ZWREQkF2YWlsYWJsZSIsICJ2YWxpZGF0ZUluZGV4ZWREQk9wZW5hYmxlIiwgImhlYXJ0YmVhdHNPYmplY3QiLCAiZXhpc3RpbmdIZWFydGJlYXRzT2JqZWN0IiwgIl9hIiwgInJlZ2lzdGVyQ29yZUNvbXBvbmVudHMiLCAidmFyaWFudCIsICJfcmVnaXN0ZXJDb21wb25lbnQiLCAiQ29tcG9uZW50IiwgIlBsYXRmb3JtTG9nZ2VyU2VydmljZUltcGwiLCAicmVnaXN0ZXJWZXJzaW9uIiwgIm5hbWUiLCAidmVyc2lvbiIsICJyZWdpc3RlclZlcnNpb24iLCAibmFtZSIsICJ2ZXJzaW9uIiwgIl9fcmVzdCIsICJzIiwgInAiLCAiX3Byb2RFcnJvck1hcCIsICJwcm9kRXJyb3JNYXAiLCAiX3Byb2RFcnJvck1hcCIsICJfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlkiLCAiRXJyb3JGYWN0b3J5IiwgImxvZ0NsaWVudCIsICJMb2dnZXIiLCAiX2xvZ1dhcm4iLCAibXNnIiwgImFyZ3MiLCAiTG9nTGV2ZWwiLCAiU0RLX1ZFUlNJT04iLCAiX2xvZ0Vycm9yIiwgIl9mYWlsIiwgImF1dGhPckNvZGUiLCAicmVzdCIsICJjcmVhdGVFcnJvckludGVybmFsIiwgIl9jcmVhdGVFcnJvciIsICJfZXJyb3JXaXRoQ3VzdG9tTWVzc2FnZSIsICJhdXRoIiwgImNvZGUiLCAibWVzc2FnZSIsICJlcnJvck1hcCIsICJwcm9kRXJyb3JNYXAiLCAiRXJyb3JGYWN0b3J5IiwgIl9hc3NlcnRJbnN0YW5jZU9mIiwgIm9iamVjdCIsICJpbnN0YW5jZSIsICJjb25zdHJ1Y3Rvckluc3RhbmNlIiwgImZ1bGxQYXJhbXMiLCAiX0RFRkFVTFRfQVVUSF9FUlJPUl9GQUNUT1JZIiwgIl9hc3NlcnQiLCAiYXNzZXJ0aW9uIiwgImRlYnVnRmFpbCIsICJmYWlsdXJlIiwgImRlYnVnQXNzZXJ0IiwgIl9nZXRDdXJyZW50VXJsIiwgIl9hIiwgIl9pc0h0dHBPckh0dHBzIiwgIl9nZXRDdXJyZW50U2NoZW1lIiwgIl9pc09ubGluZSIsICJpc0Jyb3dzZXJFeHRlbnNpb24iLCAiX2dldFVzZXJMYW5ndWFnZSIsICJuYXZpZ2F0b3JMYW5ndWFnZSIsICJEZWxheSIsICJzaG9ydERlbGF5IiwgImxvbmdEZWxheSIsICJpc01vYmlsZUNvcmRvdmEiLCAiaXNSZWFjdE5hdGl2ZSIsICJfZW11bGF0b3JVcmwiLCAiY29uZmlnIiwgInBhdGgiLCAidXJsIiwgIkZldGNoUHJvdmlkZXIiLCAiZmV0Y2hJbXBsIiwgImhlYWRlcnNJbXBsIiwgInJlc3BvbnNlSW1wbCIsICJTRVJWRVJfRVJST1JfTUFQIiwgIkRFRkFVTFRfQVBJX1RJTUVPVVRfTVMiLCAiX2FkZFRpZElmTmVjZXNzYXJ5IiwgInJlcXVlc3QiLCAiX3BlcmZvcm1BcGlSZXF1ZXN0IiwgIm1ldGhvZCIsICJjdXN0b21FcnJvck1hcCIsICJfcGVyZm9ybUZldGNoV2l0aEVycm9ySGFuZGxpbmciLCAiYm9keSIsICJwYXJhbXMiLCAicXVlcnkiLCAicXVlcnlzdHJpbmciLCAiaGVhZGVycyIsICJfZ2V0RmluYWxUYXJnZXQiLCAiZmV0Y2hGbiIsICJuZXR3b3JrVGltZW91dCIsICJOZXR3b3JrVGltZW91dCIsICJyZXNwb25zZSIsICJqc29uIiwgIl9tYWtlVGFnZ2VkRXJyb3IiLCAiZXJyb3JNZXNzYWdlIiwgInNlcnZlckVycm9yQ29kZSIsICJzZXJ2ZXJFcnJvck1lc3NhZ2UiLCAiYXV0aEVycm9yIiwgImUiLCAiRmlyZWJhc2VFcnJvciIsICJfcGVyZm9ybVNpZ25JblJlcXVlc3QiLCAic2VydmVyUmVzcG9uc2UiLCAiaG9zdCIsICJiYXNlIiwgIl9wYXJzZUVuZm9yY2VtZW50U3RhdGUiLCAiZW5mb3JjZW1lbnRTdGF0ZVN0ciIsICJfIiwgInJlamVjdCIsICJlcnJvclBhcmFtcyIsICJlcnJvciIsICJpc0VudGVycHJpc2UiLCAiZ3JlY2FwdGNoYSIsICJSZWNhcHRjaGFDb25maWciLCAicmVzcG9uc2UiLCAicHJvdmlkZXJTdHIiLCAicmVjYXB0Y2hhRW5mb3JjZW1lbnRTdGF0ZSIsICJfcGFyc2VFbmZvcmNlbWVudFN0YXRlIiwgImdldFJlY2FwdGNoYUNvbmZpZyIsICJhdXRoIiwgInJlcXVlc3QiLCAiX3BlcmZvcm1BcGlSZXF1ZXN0IiwgIl9hZGRUaWRJZk5lY2Vzc2FyeSIsICJkZWxldGVBY2NvdW50IiwgImdldEFjY291bnRJbmZvIiwgImF1dGgiLCAicmVxdWVzdCIsICJfcGVyZm9ybUFwaVJlcXVlc3QiLCAidXRjVGltZXN0YW1wVG9EYXRlU3RyaW5nIiwgInV0Y1RpbWVzdGFtcCIsICJkYXRlIiwgImdldElkVG9rZW5SZXN1bHQiLCAidXNlciIsICJmb3JjZVJlZnJlc2giLCAidXNlckludGVybmFsIiwgImdldE1vZHVsYXJJbnN0YW5jZSIsICJ0b2tlbiIsICJjbGFpbXMiLCAiX3BhcnNlVG9rZW4iLCAiX2Fzc2VydCIsICJmaXJlYmFzZSIsICJzaWduSW5Qcm92aWRlciIsICJ1dGNUaW1lc3RhbXBUb0RhdGVTdHJpbmciLCAic2Vjb25kc1N0cmluZ1RvTWlsbGlzZWNvbmRzIiwgInNlY29uZHMiLCAiYWxnb3JpdGhtIiwgInBheWxvYWQiLCAic2lnbmF0dXJlIiwgIl9sb2dFcnJvciIsICJkZWNvZGVkIiwgImJhc2U2NERlY29kZSIsICJlIiwgIl90b2tlbkV4cGlyZXNJbiIsICJwYXJzZWRUb2tlbiIsICJfbG9nb3V0SWZJbnZhbGlkYXRlZCIsICJwcm9taXNlIiwgImJ5cGFzc0F1dGhTdGF0ZSIsICJGaXJlYmFzZUVycm9yIiwgImlzVXNlckludmFsaWRhdGVkIiwgImNvZGUiLCAiUHJvYWN0aXZlUmVmcmVzaCIsICJ3YXNFcnJvciIsICJpbnRlcnZhbCIsICJfYSIsICJVc2VyTWV0YWRhdGEiLCAiY3JlYXRlZEF0IiwgImxhc3RMb2dpbkF0IiwgIm1ldGFkYXRhIiwgIl9yZWxvYWRXaXRob3V0U2F2aW5nIiwgImF1dGgiLCAiaWRUb2tlbiIsICJyZXNwb25zZSIsICJnZXRBY2NvdW50SW5mbyIsICJjb3JlQWNjb3VudCIsICJuZXdQcm92aWRlckRhdGEiLCAiZXh0cmFjdFByb3ZpZGVyRGF0YSIsICJwcm92aWRlckRhdGEiLCAibWVyZ2VQcm92aWRlckRhdGEiLCAib2xkSXNBbm9ueW1vdXMiLCAibmV3SXNBbm9ueW1vdXMiLCAiaXNBbm9ueW1vdXMiLCAidXBkYXRlcyIsICJyZWxvYWQiLCAib3JpZ2luYWwiLCAibmV3RGF0YSIsICJvIiwgIm4iLCAicHJvdmlkZXJzIiwgInByb3ZpZGVySWQiLCAicHJvdmlkZXIiLCAiX19yZXN0IiwgInJlcXVlc3RTdHNUb2tlbiIsICJyZWZyZXNoVG9rZW4iLCAiX3BlcmZvcm1GZXRjaFdpdGhFcnJvckhhbmRsaW5nIiwgImJvZHkiLCAicXVlcnlzdHJpbmciLCAidG9rZW5BcGlIb3N0IiwgImFwaUtleSIsICJ1cmwiLCAiX2dldEZpbmFsVGFyZ2V0IiwgImhlYWRlcnMiLCAiRmV0Y2hQcm92aWRlciIsICJTdHNUb2tlbk1hbmFnZXIiLCAiX1N0c1Rva2VuTWFuYWdlciIsICJleHBpcmVzSW4iLCAib2xkVG9rZW4iLCAiYWNjZXNzVG9rZW4iLCAiZXhwaXJlc0luU2VjIiwgImFwcE5hbWUiLCAib2JqZWN0IiwgImV4cGlyYXRpb25UaW1lIiwgIm1hbmFnZXIiLCAic3RzVG9rZW5NYW5hZ2VyIiwgImRlYnVnRmFpbCIsICJhc3NlcnRTdHJpbmdPclVuZGVmaW5lZCIsICJhc3NlcnRpb24iLCAiVXNlckltcGwiLCAiX1VzZXJJbXBsIiwgInVpZCIsICJvcHQiLCAidXNlckluZm8iLCAibmV3VXNlciIsICJjYWxsYmFjayIsICJ0b2tlbnNSZWZyZXNoZWQiLCAiZGVsZXRlQWNjb3VudCIsICJkaXNwbGF5TmFtZSIsICJlbWFpbCIsICJfYiIsICJwaG9uZU51bWJlciIsICJfYyIsICJwaG90b1VSTCIsICJfZCIsICJ0ZW5hbnRJZCIsICJfZSIsICJfcmVkaXJlY3RFdmVudElkIiwgIl9mIiwgIl9nIiwgIl9oIiwgImVtYWlsVmVyaWZpZWQiLCAicGxhaW5PYmplY3RUb2tlbk1hbmFnZXIiLCAiaWRUb2tlblJlc3BvbnNlIiwgImluc3RhbmNlQ2FjaGUiLCAiX2dldEluc3RhbmNlIiwgImNscyIsICJkZWJ1Z0Fzc2VydCIsICJpbnN0YW5jZSIsICJJbk1lbW9yeVBlcnNpc3RlbmNlIiwgImtleSIsICJ2YWx1ZSIsICJfa2V5IiwgIl9saXN0ZW5lciIsICJpbk1lbW9yeVBlcnNpc3RlbmNlIiwgIl9wZXJzaXN0ZW5jZUtleU5hbWUiLCAiUGVyc2lzdGVuY2VVc2VyTWFuYWdlciIsICJfUGVyc2lzdGVuY2VVc2VyTWFuYWdlciIsICJwZXJzaXN0ZW5jZSIsICJ1c2VyS2V5IiwgImNvbmZpZyIsICJuYW1lIiwgImJsb2IiLCAibmV3UGVyc2lzdGVuY2UiLCAiY3VycmVudFVzZXIiLCAicGVyc2lzdGVuY2VIaWVyYXJjaHkiLCAiYXZhaWxhYmxlUGVyc2lzdGVuY2VzIiwgInNlbGVjdGVkUGVyc2lzdGVuY2UiLCAidXNlclRvTWlncmF0ZSIsICJtaWdyYXRpb25IaWVyYXJjaHkiLCAicCIsICJfZ2V0QnJvd3Nlck5hbWUiLCAidXNlckFnZW50IiwgInVhIiwgIl9pc0lFTW9iaWxlIiwgIl9pc0ZpcmVmb3giLCAiX2lzQmxhY2tCZXJyeSIsICJfaXNXZWJPUyIsICJfaXNTYWZhcmkiLCAiX2lzQ2hyb21lSU9TIiwgIl9pc0FuZHJvaWQiLCAicmUiLCAibWF0Y2hlcyIsICJnZXRVQSIsICJfaXNJT1MiLCAiX2lzSU9TU3RhbmRhbG9uZSIsICJ1YSIsICJnZXRVQSIsICJfaXNJT1MiLCAiX2EiLCAiX2lzSUUxMCIsICJpc0lFIiwgIl9pc01vYmlsZUJyb3dzZXIiLCAiX2lzQW5kcm9pZCIsICJfaXNXZWJPUyIsICJfaXNCbGFja0JlcnJ5IiwgIl9pc0lFTW9iaWxlIiwgIl9pc0lmcmFtZSIsICJfZ2V0Q2xpZW50VmVyc2lvbiIsICJjbGllbnRQbGF0Zm9ybSIsICJmcmFtZXdvcmtzIiwgInJlcG9ydGVkUGxhdGZvcm0iLCAiX2dldEJyb3dzZXJOYW1lIiwgInJlcG9ydGVkRnJhbWV3b3JrcyIsICJTREtfVkVSU0lPTiIsICJBdXRoTWlkZGxld2FyZVF1ZXVlIiwgImF1dGgiLCAiY2FsbGJhY2siLCAib25BYm9ydCIsICJ3cmFwcGVkQ2FsbGJhY2siLCAidXNlciIsICJyZXNvbHZlIiwgInJlamVjdCIsICJyZXN1bHQiLCAiZSIsICJpbmRleCIsICJuZXh0VXNlciIsICJvbkFib3J0U3RhY2siLCAiYmVmb3JlU3RhdGVDYWxsYmFjayIsICJfZ2V0UGFzc3dvcmRQb2xpY3kiLCAicmVxdWVzdCIsICJfcGVyZm9ybUFwaVJlcXVlc3QiLCAiX2FkZFRpZElmTmVjZXNzYXJ5IiwgIk1JTklNVU1fTUlOX1BBU1NXT1JEX0xFTkdUSCIsICJQYXNzd29yZFBvbGljeUltcGwiLCAicmVzcG9uc2UiLCAicmVzcG9uc2VPcHRpb25zIiwgIl9jIiwgIl9iIiwgIl9kIiwgInBhc3N3b3JkIiwgInN0YXR1cyIsICJfZSIsICJfZiIsICJtaW5QYXNzd29yZExlbmd0aCIsICJtYXhQYXNzd29yZExlbmd0aCIsICJwYXNzd29yZENoYXIiLCAiY29udGFpbnNMb3dlcmNhc2VDaGFyYWN0ZXIiLCAiY29udGFpbnNVcHBlcmNhc2VDaGFyYWN0ZXIiLCAiY29udGFpbnNOdW1lcmljQ2hhcmFjdGVyIiwgImNvbnRhaW5zTm9uQWxwaGFudW1lcmljQ2hhcmFjdGVyIiwgIkF1dGhJbXBsIiwgImFwcCIsICJoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIiLCAiYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXIiLCAiY29uZmlnIiwgIlN1YnNjcmlwdGlvbiIsICJfREVGQVVMVF9BVVRIX0VSUk9SX0ZBQ1RPUlkiLCAicGVyc2lzdGVuY2VIaWVyYXJjaHkiLCAicG9wdXBSZWRpcmVjdFJlc29sdmVyIiwgIl9nZXRJbnN0YW5jZSIsICJQZXJzaXN0ZW5jZVVzZXJNYW5hZ2VyIiwgInByZXZpb3VzbHlTdG9yZWRVc2VyIiwgImZ1dHVyZUN1cnJlbnRVc2VyIiwgIm5lZWRzVG9jaGVja01pZGRsZXdhcmUiLCAicmVkaXJlY3RVc2VyRXZlbnRJZCIsICJzdG9yZWRVc2VyRXZlbnRJZCIsICJfYXNzZXJ0IiwgInJlZGlyZWN0UmVzb2x2ZXIiLCAiX3JlbG9hZFdpdGhvdXRTYXZpbmciLCAiX2dldFVzZXJMYW5ndWFnZSIsICJ1c2VyRXh0ZXJuIiwgImdldE1vZHVsYXJJbnN0YW5jZSIsICJza2lwQmVmb3JlU3RhdGVDYWxsYmFja3MiLCAicGVyc2lzdGVuY2UiLCAicGFzc3dvcmRQb2xpY3kiLCAiZXJyb3JNYXAiLCAiRXJyb3JGYWN0b3J5IiwgIm5leHRPck9ic2VydmVyIiwgImVycm9yIiwgImNvbXBsZXRlZCIsICJ1bnN1YnNjcmliZSIsICJyZWRpcmVjdE1hbmFnZXIiLCAicmVzb2x2ZXIiLCAiaWQiLCAiY3VycmVudFVpZCIsICJzdWJzY3JpcHRpb24iLCAiY2IiLCAiaXNVbnN1YnNjcmliZWQiLCAicHJvbWlzZSIsICJhY3Rpb24iLCAiZnJhbWV3b3JrIiwgImhlYWRlcnMiLCAiaGVhcnRiZWF0c0hlYWRlciIsICJhcHBDaGVja1Rva2VuIiwgImFwcENoZWNrVG9rZW5SZXN1bHQiLCAiX2xvZ1dhcm4iLCAiX2Nhc3RBdXRoIiwgImNyZWF0ZVN1YnNjcmliZSIsICJvYnNlcnZlciIsICJnZXRTY3JpcHRQYXJlbnRFbGVtZW50IiwgIl9sb2FkSlMiLCAidXJsIiwgImVsIiwgIl9jcmVhdGVFcnJvciIsICJfZ2VuZXJhdGVDYWxsYmFja05hbWUiLCAicHJlZml4IiwgIlJFQ0FQVENIQV9FTlRFUlBSSVNFX1VSTCIsICJSRUNBUFRDSEFfRU5URVJQUklTRV9WRVJJRklFUl9UWVBFIiwgIkZBS0VfVE9LRU4iLCAiUmVjYXB0Y2hhRW50ZXJwcmlzZVZlcmlmaWVyIiwgImF1dGhFeHRlcm4iLCAiZm9yY2VSZWZyZXNoIiwgInJldHJpZXZlU2l0ZUtleSIsICJnZXRSZWNhcHRjaGFDb25maWciLCAiUmVjYXB0Y2hhQ29uZmlnIiwgInJldHJpZXZlUmVjYXB0Y2hhVG9rZW4iLCAic2l0ZUtleSIsICJncmVjYXB0Y2hhIiwgImlzRW50ZXJwcmlzZSIsICJ0b2tlbiIsICJqc0hlbHBlcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgLl9sb2FkSlMiLCAiaW5qZWN0UmVjYXB0Y2hhRmllbGRzIiwgImNhcHRjaGFSZXNwIiwgInZlcmlmaWVyIiwgImNhcHRjaGFSZXNwb25zZSIsICJuZXdSZXF1ZXN0IiwgImhhbmRsZVJlY2FwdGNoYUZsb3ciLCAiYXV0aEluc3RhbmNlIiwgImFjdGlvbk5hbWUiLCAiYWN0aW9uTWV0aG9kIiwgInJlcXVlc3RXaXRoUmVjYXB0Y2hhIiwgImluaXRpYWxpemVBdXRoIiwgImFwcCIsICJkZXBzIiwgInByb3ZpZGVyIiwgIl9nZXRQcm92aWRlciIsICJhdXRoIiwgImluaXRpYWxPcHRpb25zIiwgImRlZXBFcXVhbCIsICJfZmFpbCIsICJfaW5pdGlhbGl6ZUF1dGhJbnN0YW5jZSIsICJwZXJzaXN0ZW5jZSIsICJoaWVyYXJjaHkiLCAiX2dldEluc3RhbmNlIiwgImNvbm5lY3RBdXRoRW11bGF0b3IiLCAidXJsIiwgIm9wdGlvbnMiLCAiYXV0aEludGVybmFsIiwgIl9jYXN0QXV0aCIsICJfYXNzZXJ0IiwgImRpc2FibGVXYXJuaW5ncyIsICJwcm90b2NvbCIsICJleHRyYWN0UHJvdG9jb2wiLCAiaG9zdCIsICJwb3J0IiwgImV4dHJhY3RIb3N0QW5kUG9ydCIsICJwb3J0U3RyIiwgImVtaXRFbXVsYXRvcldhcm5pbmciLCAicHJvdG9jb2xFbmQiLCAiYXV0aG9yaXR5IiwgImhvc3RBbmRQb3J0IiwgImJyYWNrZXRlZElQdjYiLCAicGFyc2VQb3J0IiwgImF0dGFjaEJhbm5lciIsICJlbCIsICJzdHkiLCAiQXV0aENyZWRlbnRpYWwiLCAicHJvdmlkZXJJZCIsICJzaWduSW5NZXRob2QiLCAiZGVidWdGYWlsIiwgIl9hdXRoIiwgIl9pZFRva2VuIiwgInVwZGF0ZUVtYWlsUGFzc3dvcmQiLCAiYXV0aCIsICJyZXF1ZXN0IiwgIl9wZXJmb3JtQXBpUmVxdWVzdCIsICJzaWduSW5XaXRoUGFzc3dvcmQiLCAiYXV0aCIsICJyZXF1ZXN0IiwgIl9wZXJmb3JtU2lnbkluUmVxdWVzdCIsICJfYWRkVGlkSWZOZWNlc3NhcnkiLCAic2lnbkluV2l0aEVtYWlsTGluayIsICJhdXRoIiwgInJlcXVlc3QiLCAiX3BlcmZvcm1TaWduSW5SZXF1ZXN0IiwgIl9hZGRUaWRJZk5lY2Vzc2FyeSIsICJzaWduSW5XaXRoRW1haWxMaW5rRm9yTGlua2luZyIsICJFbWFpbEF1dGhDcmVkZW50aWFsIiwgIl9FbWFpbEF1dGhDcmVkZW50aWFsIiwgIkF1dGhDcmVkZW50aWFsIiwgIl9lbWFpbCIsICJfcGFzc3dvcmQiLCAic2lnbkluTWV0aG9kIiwgIl90ZW5hbnRJZCIsICJlbWFpbCIsICJwYXNzd29yZCIsICJvb2JDb2RlIiwgInRlbmFudElkIiwgImpzb24iLCAib2JqIiwgImhhbmRsZVJlY2FwdGNoYUZsb3ciLCAic2lnbkluV2l0aFBhc3N3b3JkIiwgIl9mYWlsIiwgImlkVG9rZW4iLCAidXBkYXRlRW1haWxQYXNzd29yZCIsICJzaWduSW5XaXRoSWRwIiwgIklEUF9SRVFVRVNUX1VSSSIsICJPQXV0aENyZWRlbnRpYWwiLCAiX09BdXRoQ3JlZGVudGlhbCIsICJwYXJhbXMiLCAiY3JlZCIsICJwcm92aWRlcklkIiwgInJlc3QiLCAiX19yZXN0IiwgInBvc3RCb2R5IiwgInF1ZXJ5c3RyaW5nIiwgInNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGUiLCAiX3BlcmZvcm1BcGlSZXF1ZXN0IiwgInNpZ25JbldpdGhQaG9uZU51bWJlciIsICJsaW5rV2l0aFBob25lTnVtYmVyIiwgInJlc3BvbnNlIiwgIl9tYWtlVGFnZ2VkRXJyb3IiLCAiVkVSSUZZX1BIT05FX05VTUJFUl9GT1JfRVhJU1RJTkdfRVJST1JfTUFQXyIsICJ2ZXJpZnlQaG9uZU51bWJlckZvckV4aXN0aW5nIiwgImFwaVJlcXVlc3QiLCAiUGhvbmVBdXRoQ3JlZGVudGlhbCIsICJfUGhvbmVBdXRoQ3JlZGVudGlhbCIsICJ2ZXJpZmljYXRpb25JZCIsICJ2ZXJpZmljYXRpb25Db2RlIiwgInBob25lTnVtYmVyIiwgInRlbXBvcmFyeVByb29mIiwgInBhcnNlTW9kZSIsICJtb2RlIiwgInBhcnNlRGVlcExpbmsiLCAidXJsIiwgImxpbmsiLCAicXVlcnlzdHJpbmdEZWNvZGUiLCAiZXh0cmFjdFF1ZXJ5c3RyaW5nIiwgImRvdWJsZURlZXBMaW5rIiwgImlPU0RlZXBMaW5rIiwgIkFjdGlvbkNvZGVVUkwiLCAiX0FjdGlvbkNvZGVVUkwiLCAiYWN0aW9uTGluayIsICJzZWFyY2hQYXJhbXMiLCAiYXBpS2V5IiwgIl9hIiwgImNvZGUiLCAiX2IiLCAib3BlcmF0aW9uIiwgIl9jIiwgIl9hc3NlcnQiLCAiX2QiLCAiX2UiLCAiX2YiLCAiRW1haWxBdXRoUHJvdmlkZXIiLCAiX0VtYWlsQXV0aFByb3ZpZGVyIiwgImVtYWlsIiwgInBhc3N3b3JkIiwgIkVtYWlsQXV0aENyZWRlbnRpYWwiLCAiZW1haWxMaW5rIiwgImFjdGlvbkNvZGVVcmwiLCAiQWN0aW9uQ29kZVVSTCIsICJfYXNzZXJ0IiwgIkZlZGVyYXRlZEF1dGhQcm92aWRlciIsICJwcm92aWRlcklkIiwgImxhbmd1YWdlQ29kZSIsICJjdXN0b21PQXV0aFBhcmFtZXRlcnMiLCAiQmFzZU9BdXRoUHJvdmlkZXIiLCAic2NvcGUiLCAiRmFjZWJvb2tBdXRoUHJvdmlkZXIiLCAiX0ZhY2Vib29rQXV0aFByb3ZpZGVyIiwgIkJhc2VPQXV0aFByb3ZpZGVyIiwgImFjY2Vzc1Rva2VuIiwgIk9BdXRoQ3JlZGVudGlhbCIsICJ1c2VyQ3JlZGVudGlhbCIsICJlcnJvciIsICJ0b2tlblJlc3BvbnNlIiwgIkdvb2dsZUF1dGhQcm92aWRlciIsICJfR29vZ2xlQXV0aFByb3ZpZGVyIiwgImlkVG9rZW4iLCAib2F1dGhJZFRva2VuIiwgIm9hdXRoQWNjZXNzVG9rZW4iLCAiR2l0aHViQXV0aFByb3ZpZGVyIiwgIl9HaXRodWJBdXRoUHJvdmlkZXIiLCAiVHdpdHRlckF1dGhQcm92aWRlciIsICJfVHdpdHRlckF1dGhQcm92aWRlciIsICJCYXNlT0F1dGhQcm92aWRlciIsICJ0b2tlbiIsICJzZWNyZXQiLCAiT0F1dGhDcmVkZW50aWFsIiwgInVzZXJDcmVkZW50aWFsIiwgImVycm9yIiwgInRva2VuUmVzcG9uc2UiLCAib2F1dGhBY2Nlc3NUb2tlbiIsICJvYXV0aFRva2VuU2VjcmV0IiwgIlVzZXJDcmVkZW50aWFsSW1wbCIsICJfVXNlckNyZWRlbnRpYWxJbXBsIiwgInBhcmFtcyIsICJhdXRoIiwgIm9wZXJhdGlvblR5cGUiLCAiaWRUb2tlblJlc3BvbnNlIiwgImlzQW5vbnltb3VzIiwgInVzZXIiLCAiVXNlckltcGwiLCAicHJvdmlkZXJJZCIsICJwcm92aWRlcklkRm9yUmVzcG9uc2UiLCAicmVzcG9uc2UiLCAiTXVsdGlGYWN0b3JFcnJvciIsICJfTXVsdGlGYWN0b3JFcnJvciIsICJGaXJlYmFzZUVycm9yIiwgImF1dGgiLCAiZXJyb3IiLCAib3BlcmF0aW9uVHlwZSIsICJ1c2VyIiwgIl9hIiwgIl9wcm9jZXNzQ3JlZGVudGlhbFNhdmluZ01mYUNvbnRleHRJZk5lY2Vzc2FyeSIsICJjcmVkZW50aWFsIiwgIl9saW5rIiwgInVzZXIiLCAiY3JlZGVudGlhbCIsICJieXBhc3NBdXRoU3RhdGUiLCAicmVzcG9uc2UiLCAiX2xvZ291dElmSW52YWxpZGF0ZWQiLCAiVXNlckNyZWRlbnRpYWxJbXBsIiwgIl9yZWF1dGhlbnRpY2F0ZSIsICJ1c2VyIiwgImNyZWRlbnRpYWwiLCAiYnlwYXNzQXV0aFN0YXRlIiwgImF1dGgiLCAib3BlcmF0aW9uVHlwZSIsICJyZXNwb25zZSIsICJfbG9nb3V0SWZJbnZhbGlkYXRlZCIsICJfcHJvY2Vzc0NyZWRlbnRpYWxTYXZpbmdNZmFDb250ZXh0SWZOZWNlc3NhcnkiLCAiX2Fzc2VydCIsICJwYXJzZWQiLCAiX3BhcnNlVG9rZW4iLCAibG9jYWxJZCIsICJVc2VyQ3JlZGVudGlhbEltcGwiLCAiZSIsICJfZmFpbCIsICJfc2lnbkluV2l0aENyZWRlbnRpYWwiLCAidXNlckNyZWRlbnRpYWwiLCAib25JZFRva2VuQ2hhbmdlZCIsICJhdXRoIiwgIm5leHRPck9ic2VydmVyIiwgImVycm9yIiwgImNvbXBsZXRlZCIsICJnZXRNb2R1bGFySW5zdGFuY2UiLCAiYmVmb3JlQXV0aFN0YXRlQ2hhbmdlZCIsICJjYWxsYmFjayIsICJvbkFib3J0IiwgInN0YXJ0RW5yb2xsUGhvbmVNZmEiLCAiYXV0aCIsICJyZXF1ZXN0IiwgIl9wZXJmb3JtQXBpUmVxdWVzdCIsICJfYWRkVGlkSWZOZWNlc3NhcnkiLCAiZmluYWxpemVFbnJvbGxQaG9uZU1mYSIsICJzdGFydEVucm9sbFRvdHBNZmEiLCAiZmluYWxpemVFbnJvbGxUb3RwTWZhIiwgIlNUT1JBR0VfQVZBSUxBQkxFX0tFWSIsICJCcm93c2VyUGVyc2lzdGVuY2VDbGFzcyIsICJzdG9yYWdlUmV0cmlldmVyIiwgInR5cGUiLCAia2V5IiwgInZhbHVlIiwgImpzb24iLCAiX2lmcmFtZUNhbm5vdFN5bmNXZWJTdG9yYWdlIiwgInVhIiwgImdldFVBIiwgIl9pc1NhZmFyaSIsICJfaXNJT1MiLCAiX1BPTExJTkdfSU5URVJWQUxfTVMiLCAiSUUxMF9MT0NBTF9TVE9SQUdFX1NZTkNfREVMQVkiLCAiQnJvd3NlckxvY2FsUGVyc2lzdGVuY2UiLCAiZXZlbnQiLCAicG9sbCIsICJfaXNJZnJhbWUiLCAiX2lzTW9iaWxlQnJvd3NlciIsICJjYiIsICJuZXdWYWx1ZSIsICJvbGRWYWx1ZSIsICJfb2xkVmFsdWUiLCAic3RvcmVkVmFsdWUiLCAidHJpZ2dlckxpc3RlbmVycyIsICJfaXNJRTEwIiwgImxpc3RlbmVycyIsICJsaXN0ZW5lciIsICJicm93c2VyTG9jYWxQZXJzaXN0ZW5jZSIsICJCcm93c2VyU2Vzc2lvblBlcnNpc3RlbmNlIiwgIl9rZXkiLCAiX2xpc3RlbmVyIiwgImJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UiLCAiX2FsbFNldHRsZWQiLCAicHJvbWlzZXMiLCAicHJvbWlzZSIsICJyZWFzb24iLCAiUmVjZWl2ZXIiLCAiX1JlY2VpdmVyIiwgImV2ZW50VGFyZ2V0IiwgImV4aXN0aW5nSW5zdGFuY2UiLCAicmVjZWl2ZXIiLCAibmV3SW5zdGFuY2UiLCAibWVzc2FnZUV2ZW50IiwgImV2ZW50SWQiLCAiZXZlbnRUeXBlIiwgImRhdGEiLCAiaGFuZGxlcnMiLCAiaGFuZGxlciIsICJyZXNwb25zZSIsICJldmVudEhhbmRsZXIiLCAiX2dlbmVyYXRlRXZlbnRJZCIsICJwcmVmaXgiLCAiZGlnaXRzIiwgInJhbmRvbSIsICJpIiwgIlNlbmRlciIsICJ0YXJnZXQiLCAidGltZW91dCIsICJtZXNzYWdlQ2hhbm5lbCIsICJjb21wbGV0aW9uVGltZXIiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAiYWNrVGltZXIiLCAiX3dpbmRvdyIsICJfc2V0V2luZG93TG9jYXRpb24iLCAidXJsIiwgIl9pc1dvcmtlciIsICJfZ2V0QWN0aXZlU2VydmljZVdvcmtlciIsICJfZ2V0U2VydmljZVdvcmtlckNvbnRyb2xsZXIiLCAiX2EiLCAiX2dldFdvcmtlckdsb2JhbFNjb3BlIiwgIkRCX05BTUUiLCAiREJfVkVSU0lPTiIsICJEQl9PQkpFQ1RTVE9SRV9OQU1FIiwgIkRCX0RBVEFfS0VZUEFUSCIsICJEQlByb21pc2UiLCAicmVxdWVzdCIsICJnZXRPYmplY3RTdG9yZSIsICJkYiIsICJpc1JlYWRXcml0ZSIsICJfZGVsZXRlRGF0YWJhc2UiLCAiX29wZW5EYXRhYmFzZSIsICJlIiwgIl9wdXRPYmplY3QiLCAiZ2V0T2JqZWN0IiwgIl9kZWxldGVPYmplY3QiLCAiX1RSQU5TQUNUSU9OX1JFVFJZX0NPVU5UIiwgIkluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UiLCAib3AiLCAibnVtQXR0ZW1wdHMiLCAiX29yaWdpbiIsICJfZGF0YSIsICJyZXN1bHRzIiwgIl9iIiwgIndyaXRlIiwgIm9iaiIsICJyZXN1bHQiLCAiZ2V0QWxsUmVxdWVzdCIsICJrZXlzIiwgImtleXNJblJlc3VsdCIsICJsb2NhbEtleSIsICJpbmRleGVkREJMb2NhbFBlcnNpc3RlbmNlIiwgInN0YXJ0U2lnbkluUGhvbmVNZmEiLCAiYXV0aCIsICJfcGVyZm9ybUFwaVJlcXVlc3QiLCAiX2FkZFRpZElmTmVjZXNzYXJ5IiwgImZpbmFsaXplU2lnbkluUGhvbmVNZmEiLCAiZmluYWxpemVTaWduSW5Ub3RwTWZhIiwgIl9KU0xPQURfQ0FMTEJBQ0siLCAianNIZWxwZXJzLl9nZW5lcmF0ZUNhbGxiYWNrTmFtZSIsICJORVRXT1JLX1RJTUVPVVRfREVMQVkiLCAiRGVsYXkiLCAiUkVDQVBUQ0hBX1ZFUklGSUVSX1RZUEUiLCAiX3ZlcmlmeVBob25lTnVtYmVyIiwgImF1dGgiLCAib3B0aW9ucyIsICJ2ZXJpZmllciIsICJyZWNhcHRjaGFUb2tlbiIsICJfYXNzZXJ0IiwgIlJFQ0FQVENIQV9WRVJJRklFUl9UWVBFIiwgInBob25lSW5mb09wdGlvbnMiLCAic2Vzc2lvbiIsICJzdGFydEVucm9sbFBob25lTWZhIiwgIm1mYUVucm9sbG1lbnRJZCIsICJfYSIsICJzdGFydFNpZ25JblBob25lTWZhIiwgInNlc3Npb25JbmZvIiwgInNlbmRQaG9uZVZlcmlmaWNhdGlvbkNvZGUiLCAiUGhvbmVBdXRoUHJvdmlkZXIiLCAiX1Bob25lQXV0aFByb3ZpZGVyIiwgImF1dGgiLCAiX2Nhc3RBdXRoIiwgInBob25lT3B0aW9ucyIsICJhcHBsaWNhdGlvblZlcmlmaWVyIiwgIl92ZXJpZnlQaG9uZU51bWJlciIsICJnZXRNb2R1bGFySW5zdGFuY2UiLCAidmVyaWZpY2F0aW9uSWQiLCAidmVyaWZpY2F0aW9uQ29kZSIsICJQaG9uZUF1dGhDcmVkZW50aWFsIiwgInVzZXJDcmVkZW50aWFsIiwgImNyZWRlbnRpYWwiLCAiZXJyb3IiLCAidG9rZW5SZXNwb25zZSIsICJwaG9uZU51bWJlciIsICJ0ZW1wb3JhcnlQcm9vZiIsICJfd2l0aERlZmF1bHRSZXNvbHZlciIsICJyZXNvbHZlck92ZXJyaWRlIiwgIl9nZXRJbnN0YW5jZSIsICJfYXNzZXJ0IiwgIklkcENyZWRlbnRpYWwiLCAiQXV0aENyZWRlbnRpYWwiLCAicGFyYW1zIiwgInNpZ25JbldpdGhJZHAiLCAiaWRUb2tlbiIsICJyZXF1ZXN0IiwgIl9zaWduSW4iLCAiX3NpZ25JbldpdGhDcmVkZW50aWFsIiwgIl9yZWF1dGgiLCAidXNlciIsICJfcmVhdXRoZW50aWNhdGUiLCAiX2xpbmsiLCAiX2xpbmtVc2VyIiwgIkFic3RyYWN0UG9wdXBSZWRpcmVjdE9wZXJhdGlvbiIsICJmaWx0ZXIiLCAicmVzb2x2ZXIiLCAiYnlwYXNzQXV0aFN0YXRlIiwgInJlc29sdmUiLCAicmVqZWN0IiwgImUiLCAiZXZlbnQiLCAidXJsUmVzcG9uc2UiLCAic2Vzc2lvbklkIiwgInBvc3RCb2R5IiwgInRlbmFudElkIiwgInR5cGUiLCAiX2ZhaWwiLCAiY3JlZCIsICJkZWJ1Z0Fzc2VydCIsICJfUE9MTF9XSU5ET1dfQ0xPU0VfVElNRU9VVCIsICJEZWxheSIsICJzaWduSW5XaXRoUG9wdXAiLCAicHJvdmlkZXIiLCAiYXV0aEludGVybmFsIiwgIl9hc3NlcnRJbnN0YW5jZU9mIiwgIkZlZGVyYXRlZEF1dGhQcm92aWRlciIsICJyZXNvbHZlckludGVybmFsIiwgIlBvcHVwT3BlcmF0aW9uIiwgIlBvcHVwT3BlcmF0aW9uIiwgIl9Qb3B1cE9wZXJhdGlvbiIsICJBYnN0cmFjdFBvcHVwUmVkaXJlY3RPcGVyYXRpb24iLCAiYXV0aCIsICJmaWx0ZXIiLCAicHJvdmlkZXIiLCAicmVzb2x2ZXIiLCAidXNlciIsICJyZXN1bHQiLCAiX2Fzc2VydCIsICJkZWJ1Z0Fzc2VydCIsICJldmVudElkIiwgIl9nZW5lcmF0ZUV2ZW50SWQiLCAiZSIsICJpc1N1cHBvcnRlZCIsICJfY3JlYXRlRXJyb3IiLCAiX2EiLCAicG9sbCIsICJfYiIsICJfUE9MTF9XSU5ET1dfQ0xPU0VfVElNRU9VVCIsICJQRU5ESU5HX1JFRElSRUNUX0tFWSIsICJyZWRpcmVjdE91dGNvbWVNYXAiLCAiUmVkaXJlY3RBY3Rpb24iLCAiYnlwYXNzQXV0aFN0YXRlIiwgInJlYWR5T3V0Y29tZSIsICJfZ2V0QW5kQ2xlYXJQZW5kaW5nUmVkaXJlY3RTdGF0dXMiLCAiZXZlbnQiLCAia2V5IiwgInBlbmRpbmdSZWRpcmVjdEtleSIsICJwZXJzaXN0ZW5jZSIsICJyZXNvbHZlclBlcnNpc3RlbmNlIiwgImhhc1BlbmRpbmdSZWRpcmVjdCIsICJfb3ZlcnJpZGVSZWRpcmVjdFJlc3VsdCIsICJhdXRoIiwgInJlc3VsdCIsICJyZWRpcmVjdE91dGNvbWVNYXAiLCAicmVzb2x2ZXJQZXJzaXN0ZW5jZSIsICJyZXNvbHZlciIsICJfZ2V0SW5zdGFuY2UiLCAicGVuZGluZ1JlZGlyZWN0S2V5IiwgIl9wZXJzaXN0ZW5jZUtleU5hbWUiLCAiUEVORElOR19SRURJUkVDVF9LRVkiLCAiX2dldFJlZGlyZWN0UmVzdWx0IiwgImF1dGgiLCAicmVzb2x2ZXJFeHRlcm4iLCAiYnlwYXNzQXV0aFN0YXRlIiwgImF1dGhJbnRlcm5hbCIsICJfY2FzdEF1dGgiLCAicmVzb2x2ZXIiLCAiX3dpdGhEZWZhdWx0UmVzb2x2ZXIiLCAicmVzdWx0IiwgIlJlZGlyZWN0QWN0aW9uIiwgIkVWRU5UX0RVUExJQ0FUSU9OX0NBQ0hFX0RVUkFUSU9OX01TIiwgIkF1dGhFdmVudE1hbmFnZXIiLCAiYXV0aCIsICJhdXRoRXZlbnRDb25zdW1lciIsICJldmVudCIsICJoYW5kbGVkIiwgImNvbnN1bWVyIiwgImlzUmVkaXJlY3RFdmVudCIsICJpc051bGxSZWRpcmVjdEV2ZW50IiwgImNvZGUiLCAiX2EiLCAiX2NyZWF0ZUVycm9yIiwgImV2ZW50SWRNYXRjaGVzIiwgImV2ZW50VWlkIiwgImUiLCAidiIsICJ0eXBlIiwgImVycm9yIiwgIl9nZXRQcm9qZWN0Q29uZmlnIiwgInJlcXVlc3QiLCAiX3BlcmZvcm1BcGlSZXF1ZXN0IiwgIklQX0FERFJFU1NfUkVHRVgiLCAiSFRUUF9SRUdFWCIsICJfdmFsaWRhdGVPcmlnaW4iLCAiYXV0aG9yaXplZERvbWFpbnMiLCAiZG9tYWluIiwgIm1hdGNoRG9tYWluIiwgIl9mYWlsIiwgImV4cGVjdGVkIiwgImN1cnJlbnRVcmwiLCAiX2dldEN1cnJlbnRVcmwiLCAicHJvdG9jb2wiLCAiaG9zdG5hbWUiLCAiY2VVcmwiLCAiZXNjYXBlZERvbWFpblBhdHRlcm4iLCAiTkVUV09SS19USU1FT1VUIiwgIkRlbGF5IiwgInJlc2V0VW5sb2FkZWRHYXBpTW9kdWxlcyIsICJiZWFjb24iLCAiX3dpbmRvdyIsICJoaW50IiwgImkiLCAibG9hZEdhcGkiLCAicmVzb2x2ZSIsICJyZWplY3QiLCAibG9hZEdhcGlJZnJhbWUiLCAiX2IiLCAiX2MiLCAiY2JOYW1lIiwgImpzLl9nZW5lcmF0ZUNhbGxiYWNrTmFtZSIsICJqc1xyXG4gICAgICAgICAgICAgICAgLl9sb2FkSlMiLCAiY2FjaGVkR0FwaUxvYWRlciIsICJfbG9hZEdhcGkiLCAiUElOR19USU1FT1VUIiwgIklGUkFNRV9QQVRIIiwgIkVNVUxBVEVEX0lGUkFNRV9QQVRIIiwgIklGUkFNRV9BVFRSSUJVVEVTIiwgIkVJRF9GUk9NX0FQSUhPU1QiLCAiZ2V0SWZyYW1lVXJsIiwgImNvbmZpZyIsICJfYXNzZXJ0IiwgInVybCIsICJfZW11bGF0b3JVcmwiLCAicGFyYW1zIiwgIlNES19WRVJTSU9OIiwgImVpZCIsICJmcmFtZXdvcmtzIiwgInF1ZXJ5c3RyaW5nIiwgIl9vcGVuSWZyYW1lIiwgImNvbnRleHQiLCAiZ2FwaUxvYWRlci5fbG9hZEdhcGkiLCAiZ2FwaSIsICJpZnJhbWUiLCAibmV0d29ya0Vycm9yIiwgIm5ldHdvcmtFcnJvclRpbWVyIiwgImNsZWFyVGltZXJBbmRSZXNvbHZlIiwgIkJBU0VfUE9QVVBfT1BUSU9OUyIsICJERUZBVUxUX1dJRFRIIiwgIkRFRkFVTFRfSEVJR0hUIiwgIlRBUkdFVF9CTEFOSyIsICJGSVJFRk9YX0VNUFRZX1VSTCIsICJBdXRoUG9wdXAiLCAid2luZG93IiwgIl9vcGVuIiwgIm5hbWUiLCAid2lkdGgiLCAiaGVpZ2h0IiwgInRvcCIsICJsZWZ0IiwgInRhcmdldCIsICJvcHRpb25zIiwgInVhIiwgImdldFVBIiwgIl9pc0Nocm9tZUlPUyIsICJfaXNGaXJlZm94IiwgIm9wdGlvbnNTdHJpbmciLCAiYWNjdW0iLCAia2V5IiwgInZhbHVlIiwgIl9pc0lPU1N0YW5kYWxvbmUiLCAib3BlbkFzTmV3V2luZG93SU9TIiwgIm5ld1dpbiIsICJlbCIsICJjbGljayIsICJXSURHRVRfUEFUSCIsICJFTVVMQVRPUl9XSURHRVRfUEFUSCIsICJGSVJFQkFTRV9BUFBfQ0hFQ0tfRlJBR01FTlRfSUQiLCAiX2dldFJlZGlyZWN0VXJsIiwgInByb3ZpZGVyIiwgImF1dGhUeXBlIiwgInJlZGlyZWN0VXJsIiwgImV2ZW50SWQiLCAiYWRkaXRpb25hbFBhcmFtcyIsICJGZWRlcmF0ZWRBdXRoUHJvdmlkZXIiLCAiaXNFbXB0eSIsICJCYXNlT0F1dGhQcm92aWRlciIsICJzY29wZXMiLCAic2NvcGUiLCAicGFyYW1zRGljdCIsICJhcHBDaGVja1Rva2VuIiwgImFwcENoZWNrVG9rZW5GcmFnbWVudCIsICJnZXRIYW5kbGVyQmFzZSIsICJXRUJfU1RPUkFHRV9TVVBQT1JUX0tFWSIsICJCcm93c2VyUG9wdXBSZWRpcmVjdFJlc29sdmVyIiwgImJyb3dzZXJTZXNzaW9uUGVyc2lzdGVuY2UiLCAiX2dldFJlZGlyZWN0UmVzdWx0IiwgIl9vdmVycmlkZVJlZGlyZWN0UmVzdWx0IiwgImRlYnVnQXNzZXJ0IiwgIl9nZW5lcmF0ZUV2ZW50SWQiLCAiX3NldFdpbmRvd0xvY2F0aW9uIiwgIm1hbmFnZXIiLCAicHJvbWlzZSIsICJpZnJhbWVFdmVudCIsICJjYiIsICJyZXN1bHQiLCAiaXNTdXBwb3J0ZWQiLCAiX2lzTW9iaWxlQnJvd3NlciIsICJfaXNTYWZhcmkiLCAiX2lzSU9TIiwgImJyb3dzZXJQb3B1cFJlZGlyZWN0UmVzb2x2ZXIiLCAiTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIiwgImZhY3RvcklkIiwgInNlc3Npb24iLCAiZGlzcGxheU5hbWUiLCAiZGVidWdGYWlsIiwgIlBob25lTXVsdGlGYWN0b3JBc3NlcnRpb25JbXBsIiwgIl9QaG9uZU11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCIsICJjcmVkZW50aWFsIiwgImlkVG9rZW4iLCAiZmluYWxpemVFbnJvbGxQaG9uZU1mYSIsICJtZmFQZW5kaW5nQ3JlZGVudGlhbCIsICJmaW5hbGl6ZVNpZ25JblBob25lTWZhIiwgIlBob25lTXVsdGlGYWN0b3JHZW5lcmF0b3IiLCAiVG90cE11bHRpRmFjdG9yR2VuZXJhdG9yIiwgInNlY3JldCIsICJvbmVUaW1lUGFzc3dvcmQiLCAiVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCIsICJlbnJvbGxtZW50SWQiLCAibWZhU2Vzc2lvbiIsICJyZXNwb25zZSIsICJzdGFydEVucm9sbFRvdHBNZmEiLCAiVG90cFNlY3JldCIsICJfVG90cE11bHRpRmFjdG9yQXNzZXJ0aW9uSW1wbCIsICJvdHAiLCAiZmluYWxpemVFbnJvbGxUb3RwTWZhIiwgInRvdHBWZXJpZmljYXRpb25JbmZvIiwgImZpbmFsaXplU2lnbkluVG90cE1mYSIsICJfVG90cFNlY3JldCIsICJzZWNyZXRLZXkiLCAiaGFzaGluZ0FsZ29yaXRobSIsICJjb2RlTGVuZ3RoIiwgImNvZGVJbnRlcnZhbFNlY29uZHMiLCAiZW5yb2xsbWVudENvbXBsZXRpb25EZWFkbGluZSIsICJzZXNzaW9uSW5mbyIsICJhY2NvdW50TmFtZSIsICJpc3N1ZXIiLCAidXNlRGVmYXVsdHMiLCAiX2lzRW1wdHlTdHJpbmciLCAiaW5wdXQiLCAiQXV0aEludGVyb3AiLCAiZm9yY2VSZWZyZXNoIiwgImxpc3RlbmVyIiwgInVuc3Vic2NyaWJlIiwgInVzZXIiLCAiZ2V0VmVyc2lvbkZvclBsYXRmb3JtIiwgImNsaWVudFBsYXRmb3JtIiwgInJlZ2lzdGVyQXV0aCIsICJfcmVnaXN0ZXJDb21wb25lbnQiLCAiQ29tcG9uZW50IiwgImNvbnRhaW5lciIsICJkZXBzIiwgImFwcCIsICJoZWFydGJlYXRTZXJ2aWNlUHJvdmlkZXIiLCAiYXBwQ2hlY2tTZXJ2aWNlUHJvdmlkZXIiLCAiYXBpS2V5IiwgImF1dGhEb21haW4iLCAiX2dldENsaWVudFZlcnNpb24iLCAiYXV0aEluc3RhbmNlIiwgIkF1dGhJbXBsIiwgIl9pbml0aWFsaXplQXV0aEluc3RhbmNlIiwgIl9pbnN0YW5jZUlkZW50aWZpZXIiLCAiX2luc3RhbmNlIiwgIl9jYXN0QXV0aCIsICJyZWdpc3RlclZlcnNpb24iLCAidmVyc2lvbiIsICJERUZBVUxUX0lEX1RPS0VOX01BWF9BR0UiLCAiYXV0aElkVG9rZW5NYXhBZ2UiLCAiZ2V0RXhwZXJpbWVudGFsU2V0dGluZyIsICJsYXN0UG9zdGVkSWRUb2tlbiIsICJtaW50Q29va2llRmFjdG9yeSIsICJpZFRva2VuUmVzdWx0IiwgImlkVG9rZW5BZ2UiLCAiZ2V0QXV0aCIsICJnZXRBcHAiLCAiX2dldFByb3ZpZGVyIiwgImluaXRpYWxpemVBdXRoIiwgImluZGV4ZWREQkxvY2FsUGVyc2lzdGVuY2UiLCAiYnJvd3NlckxvY2FsUGVyc2lzdGVuY2UiLCAiYXV0aFRva2VuU3luY1VybCIsICJtaW50Q29va2llIiwgImJlZm9yZUF1dGhTdGF0ZUNoYW5nZWQiLCAib25JZFRva2VuQ2hhbmdlZCIsICJhdXRoRW11bGF0b3JIb3N0IiwgImdldERlZmF1bHRFbXVsYXRvckhvc3QiLCAiY29ubmVjdEF1dGhFbXVsYXRvciIsICJNT0RFX0hZRFJBVEUiLCAic2xpY2UiLCAib3B0aW9ucyIsICJ2bm9kZUlkIiwgImlzVmFsaWRFbGVtZW50IiwgInJlcmVuZGVyUXVldWUiLCAicHJldkRlYm91bmNlIiwgImRlZmVyIiwgImRlcHRoU29ydCIsICJpIiwgIkVNUFRZX09CSiIsICJFTVBUWV9BUlIiLCAiSVNfTk9OX0RJTUVOU0lPTkFMIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAiYXNzaWduIiwgIm9iaiIsICJwcm9wcyIsICJyZW1vdmVOb2RlIiwgIm5vZGUiLCAicGFyZW50Tm9kZSIsICJyZW1vdmVDaGlsZCIsICJjcmVhdGVFbGVtZW50IiwgInR5cGUiLCAiY2hpbGRyZW4iLCAia2V5IiwgInJlZiIsICJub3JtYWxpemVkUHJvcHMiLCAiYXJndW1lbnRzIiwgImxlbmd0aCIsICJjYWxsIiwgImRlZmF1bHRQcm9wcyIsICJjcmVhdGVWTm9kZSIsICJvcmlnaW5hbCIsICJ2bm9kZSIsICJfX2siLCAiX18iLCAiX19iIiwgIl9fZSIsICJfX2QiLCAiX19jIiwgImNvbnN0cnVjdG9yIiwgIl9fdiIsICJfX2kiLCAiX191IiwgIkZyYWdtZW50IiwgInByb3BzIiwgImNoaWxkcmVuIiwgIkJhc2VDb21wb25lbnQiLCAiY29udGV4dCIsICJ0aGlzIiwgImdldERvbVNpYmxpbmciLCAidm5vZGUiLCAiY2hpbGRJbmRleCIsICJfXyIsICJzaWJsaW5nIiwgIl9fayIsICJsZW5ndGgiLCAiX19lIiwgInR5cGUiLCAidXBkYXRlUGFyZW50RG9tUG9pbnRlcnMiLCAiaSIsICJjaGlsZCIsICJfX2MiLCAiYmFzZSIsICJlbnF1ZXVlUmVuZGVyIiwgImMiLCAiX19kIiwgInJlcmVuZGVyUXVldWUiLCAicHVzaCIsICJwcm9jZXNzIiwgInByZXZEZWJvdW5jZSIsICJvcHRpb25zIiwgImRlYm91bmNlUmVuZGVyaW5nIiwgImRlZmVyIiwgInJlbmRlclF1ZXVlTGVuZ3RoIiwgImNvbXBvbmVudCIsICJuZXdWTm9kZSIsICJvbGRWTm9kZSIsICJvbGREb20iLCAicGFyZW50RG9tIiwgImNvbW1pdFF1ZXVlIiwgInJlZlF1ZXVlIiwgInNvcnQiLCAiZGVwdGhTb3J0IiwgInNoaWZ0IiwgIl9fdiIsICJfX1AiLCAiYXNzaWduIiwgImRpZmYiLCAiX19uIiwgIm93bmVyU1ZHRWxlbWVudCIsICJfX3UiLCAiX19pIiwgImNvbW1pdFJvb3QiLCAiZGlmZkNoaWxkcmVuIiwgInJlbmRlclJlc3VsdCIsICJuZXdQYXJlbnRWTm9kZSIsICJvbGRQYXJlbnRWTm9kZSIsICJnbG9iYWxDb250ZXh0IiwgImlzU3ZnIiwgImV4Y2Vzc0RvbUNoaWxkcmVuIiwgImlzSHlkcmF0aW5nIiwgImNoaWxkVk5vZGUiLCAibmV3RG9tIiwgImZpcnN0Q2hpbGREb20iLCAib2xkQ2hpbGRyZW4iLCAiRU1QVFlfQVJSIiwgIm5ld0NoaWxkcmVuTGVuZ3RoIiwgImNvbnN0cnVjdE5ld0NoaWxkcmVuQXJyYXkiLCAiRU1QVFlfT0JKIiwgInJlZiIsICJhcHBseVJlZiIsICJpbnNlcnQiLCAibmV4dFNpYmxpbmciLCAic2tld2VkSW5kZXgiLCAibWF0Y2hpbmdJbmRleCIsICJvbGRDaGlsZHJlbkxlbmd0aCIsICJyZW1haW5pbmdPbGRDaGlsZHJlbiIsICJza2V3IiwgImNvbnN0cnVjdG9yIiwgIlN0cmluZyIsICJjcmVhdGVWTm9kZSIsICJpc0FycmF5IiwgImtleSIsICJfX2IiLCAiZmluZE1hdGNoaW5nSW5kZXgiLCAidW5tb3VudCIsICJwYXJlbnRWTm9kZSIsICJpbnNlcnRCZWZvcmUiLCAiZmluZE1hdGNoaW5nSW5kZXgiLCAiY2hpbGRWTm9kZSIsICJvbGRDaGlsZHJlbiIsICJza2V3ZWRJbmRleCIsICJyZW1haW5pbmdPbGRDaGlsZHJlbiIsICJrZXkiLCAidHlwZSIsICJ4IiwgInkiLCAib2xkVk5vZGUiLCAibGVuZ3RoIiwgIl9fdSIsICJzZXRTdHlsZSIsICJzdHlsZSIsICJ2YWx1ZSIsICJzZXRQcm9wZXJ0eSIsICJJU19OT05fRElNRU5TSU9OQUwiLCAidGVzdCIsICJkb20iLCAibmFtZSIsICJvbGRWYWx1ZSIsICJpc1N2ZyIsICJ1c2VDYXB0dXJlIiwgIm8iLCAiY3NzVGV4dCIsICJyZXBsYWNlIiwgInRvTG93ZXJDYXNlIiwgInNsaWNlIiwgImwiLCAiX2F0dGFjaGVkIiwgIkRhdGUiLCAibm93IiwgImFkZEV2ZW50TGlzdGVuZXIiLCAiZXZlbnRQcm94eUNhcHR1cmUiLCAiZXZlbnRQcm94eSIsICJyZW1vdmVFdmVudExpc3RlbmVyIiwgImUiLCAicmVtb3ZlQXR0cmlidXRlIiwgInNldEF0dHJpYnV0ZSIsICJldmVudEhhbmRsZXIiLCAidGhpcyIsICJfZGlzcGF0Y2hlZCIsICJvcHRpb25zIiwgImV2ZW50IiwgImRpZmYiLCAicGFyZW50RG9tIiwgIm5ld1ZOb2RlIiwgImdsb2JhbENvbnRleHQiLCAiZXhjZXNzRG9tQ2hpbGRyZW4iLCAiY29tbWl0UXVldWUiLCAib2xkRG9tIiwgImlzSHlkcmF0aW5nIiwgInJlZlF1ZXVlIiwgInRtcCIsICJjIiwgImlzTmV3IiwgIm9sZFByb3BzIiwgIm9sZFN0YXRlIiwgInNuYXBzaG90IiwgImNsZWFyUHJvY2Vzc2luZ0V4Y2VwdGlvbiIsICJuZXdQcm9wcyIsICJwcm92aWRlciIsICJjb21wb25lbnRDb250ZXh0IiwgImkiLCAicmVuZGVySG9vayIsICJjb3VudCIsICJyZW5kZXJSZXN1bHQiLCAibmV3VHlwZSIsICJjb25zdHJ1Y3RvciIsICJfX2UiLCAiX19iIiwgIm91dGVyIiwgInByb3BzIiwgImNvbnRleHRUeXBlIiwgIl9fYyIsICJfXyIsICJfX0UiLCAicHJvdG90eXBlIiwgInJlbmRlciIsICJCYXNlQ29tcG9uZW50IiwgImRvUmVuZGVyIiwgInN1YiIsICJzdGF0ZSIsICJjb250ZXh0IiwgIl9fbiIsICJfX2QiLCAiX19oIiwgIl9zYiIsICJfX3MiLCAiZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzIiwgImFzc2lnbiIsICJfX3YiLCAiY29tcG9uZW50V2lsbE1vdW50IiwgImNvbXBvbmVudERpZE1vdW50IiwgInB1c2giLCAiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsICJzaG91bGRDb21wb25lbnRVcGRhdGUiLCAiX19rIiwgImZvckVhY2giLCAidm5vZGUiLCAiY29tcG9uZW50V2lsbFVwZGF0ZSIsICJjb21wb25lbnREaWRVcGRhdGUiLCAiX19QIiwgIl9fciIsICJnZXRDaGlsZENvbnRleHQiLCAiZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUiLCAiZGlmZkNoaWxkcmVuIiwgImlzQXJyYXkiLCAiRnJhZ21lbnQiLCAiY2hpbGRyZW4iLCAiYmFzZSIsICJNT0RFX0hZRFJBVEUiLCAiaW5kZXhPZiIsICJkaWZmRWxlbWVudE5vZGVzIiwgImRpZmZlZCIsICJjb21taXRSb290IiwgInJvb3QiLCAiYXBwbHlSZWYiLCAic29tZSIsICJjYiIsICJjYWxsIiwgIm5ld0h0bWwiLCAib2xkSHRtbCIsICJuZXdDaGlsZHJlbiIsICJpbnB1dFZhbHVlIiwgImNoZWNrZWQiLCAibm9kZVR5cGUiLCAibG9jYWxOYW1lIiwgImRvY3VtZW50IiwgImNyZWF0ZVRleHROb2RlIiwgImNyZWF0ZUVsZW1lbnROUyIsICJjcmVhdGVFbGVtZW50IiwgImlzIiwgImRhdGEiLCAiY2hpbGROb2RlcyIsICJFTVBUWV9PQkoiLCAiYXR0cmlidXRlcyIsICJfX2h0bWwiLCAiaW5uZXJIVE1MIiwgImdldERvbVNpYmxpbmciLCAicmVtb3ZlTm9kZSIsICJyZWYiLCAiY3VycmVudCIsICJ1bm1vdW50IiwgInBhcmVudFZOb2RlIiwgInNraXBSZW1vdmUiLCAiciIsICJjb21wb25lbnRXaWxsVW5tb3VudCIsICJyZXBsYWNlTm9kZSIsICJvd25lclNWR0VsZW1lbnQiLCAiZmlyc3RDaGlsZCIsICJzbGljZSIsICJFTVBUWV9BUlIiLCAib3B0aW9ucyIsICJfX2UiLCAiZXJyb3IiLCAidm5vZGUiLCAib2xkVk5vZGUiLCAiZXJyb3JJbmZvIiwgImNvbXBvbmVudCIsICJjdG9yIiwgImhhbmRsZWQiLCAiX18iLCAiX19jIiwgImNvbnN0cnVjdG9yIiwgImdldERlcml2ZWRTdGF0ZUZyb21FcnJvciIsICJzZXRTdGF0ZSIsICJfX2QiLCAiY29tcG9uZW50RGlkQ2F0Y2giLCAiX19FIiwgImUiLCAidm5vZGVJZCIsICJpc1ZhbGlkRWxlbWVudCIsICJ1bmRlZmluZWQiLCAiQmFzZUNvbXBvbmVudCIsICJwcm90b3R5cGUiLCAidXBkYXRlIiwgImNhbGxiYWNrIiwgInMiLCAidGhpcyIsICJfX3MiLCAic3RhdGUiLCAiYXNzaWduIiwgInByb3BzIiwgIl9fdiIsICJfc2IiLCAicHVzaCIsICJlbnF1ZXVlUmVuZGVyIiwgImZvcmNlVXBkYXRlIiwgIl9faCIsICJyZW5kZXIiLCAiRnJhZ21lbnQiLCAicmVyZW5kZXJRdWV1ZSIsICJkZWZlciIsICJQcm9taXNlIiwgInRoZW4iLCAiYmluZCIsICJyZXNvbHZlIiwgInNldFRpbWVvdXQiLCAiZGVwdGhTb3J0IiwgImEiLCAiYiIsICJfX2IiLCAicHJvY2VzcyIsICJfX3IiLCAiaSIsICJjdXJyZW50SW5kZXgiLCAiY3VycmVudENvbXBvbmVudCIsICJwcmV2aW91c0NvbXBvbmVudCIsICJwcmV2UmFmIiwgImN1cnJlbnRIb29rIiwgImFmdGVyUGFpbnRFZmZlY3RzIiwgIkVNUFRZIiwgIm9sZEJlZm9yZURpZmYiLCAib3B0aW9ucyIsICJfX2IiLCAib2xkQmVmb3JlUmVuZGVyIiwgIl9fciIsICJvbGRBZnRlckRpZmYiLCAiZGlmZmVkIiwgIm9sZENvbW1pdCIsICJfX2MiLCAib2xkQmVmb3JlVW5tb3VudCIsICJ1bm1vdW50IiwgImdldEhvb2tTdGF0ZSIsICJpbmRleCIsICJ0eXBlIiwgIl9faCIsICJob29rcyIsICJfX0giLCAiX18iLCAibGVuZ3RoIiwgInB1c2giLCAiX19WIiwgInVzZVN0YXRlIiwgImluaXRpYWxTdGF0ZSIsICJ1c2VSZWR1Y2VyIiwgImludm9rZU9yUmV0dXJuIiwgInJlZHVjZXIiLCAiaW5pdCIsICJob29rU3RhdGUiLCAiX3JlZHVjZXIiLCAiYWN0aW9uIiwgImN1cnJlbnRWYWx1ZSIsICJfX04iLCAibmV4dFZhbHVlIiwgInNldFN0YXRlIiwgIl9oYXNTY3VGcm9tSG9va3MiLCAidXBkYXRlSG9va1N0YXRlIiwgInAiLCAicyIsICJjIiwgInN0YXRlSG9va3MiLCAiZmlsdGVyIiwgIngiLCAiZXZlcnkiLCAicHJldlNjdSIsICJjYWxsIiwgInRoaXMiLCAic2hvdWxkVXBkYXRlIiwgImZvckVhY2giLCAiaG9va0l0ZW0iLCAicHJvcHMiLCAic2hvdWxkQ29tcG9uZW50VXBkYXRlIiwgInByZXZDV1UiLCAiY29tcG9uZW50V2lsbFVwZGF0ZSIsICJfX2UiLCAidG1wIiwgImZsdXNoQWZ0ZXJQYWludEVmZmVjdHMiLCAiY29tcG9uZW50IiwgImFmdGVyUGFpbnRFZmZlY3RzIiwgInNoaWZ0IiwgIl9fUCIsICJfX0giLCAiX19oIiwgImZvckVhY2giLCAiaW52b2tlQ2xlYW51cCIsICJpbnZva2VFZmZlY3QiLCAiZSIsICJvcHRpb25zIiwgIl9fZSIsICJfX3YiLCAiX19iIiwgInZub2RlIiwgImN1cnJlbnRDb21wb25lbnQiLCAib2xkQmVmb3JlRGlmZiIsICJfX3IiLCAib2xkQmVmb3JlUmVuZGVyIiwgImN1cnJlbnRJbmRleCIsICJob29rcyIsICJfX2MiLCAicHJldmlvdXNDb21wb25lbnQiLCAiX18iLCAiaG9va0l0ZW0iLCAiX19OIiwgIkVNUFRZIiwgIl9wZW5kaW5nQXJncyIsICJkaWZmZWQiLCAib2xkQWZ0ZXJEaWZmIiwgImMiLCAibGVuZ3RoIiwgInB1c2giLCAicHJldlJhZiIsICJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCAiYWZ0ZXJOZXh0RnJhbWUiLCAiX19WIiwgImNvbW1pdFF1ZXVlIiwgInNvbWUiLCAiZmlsdGVyIiwgImNiIiwgIm9sZENvbW1pdCIsICJ1bm1vdW50IiwgIm9sZEJlZm9yZVVubW91bnQiLCAiaGFzRXJyb3JlZCIsICJzIiwgIkhBU19SQUYiLCAiY2FsbGJhY2siLCAicmFmIiwgImRvbmUiLCAiY2xlYXJUaW1lb3V0IiwgInRpbWVvdXQiLCAiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCAic2V0VGltZW91dCIsICJob29rIiwgImNvbXAiLCAiY2xlYW51cCIsICJpbnZva2VPclJldHVybiIsICJhcmciLCAiZiIsICJ2bm9kZUlkIiwgImlzQXJyYXkiLCAiQXJyYXkiLCAiY3JlYXRlVk5vZGUiLCAidHlwZSIsICJwcm9wcyIsICJrZXkiLCAiaXNTdGF0aWNDaGlsZHJlbiIsICJfX3NvdXJjZSIsICJfX3NlbGYiLCAicmVmIiwgImkiLCAibm9ybWFsaXplZFByb3BzIiwgInZub2RlIiwgIl9fayIsICJfXyIsICJfX2IiLCAiX19lIiwgIl9fZCIsICJfX2MiLCAiY29uc3RydWN0b3IiLCAiX192IiwgIl9faSIsICJfX3UiLCAiZGVmYXVsdFByb3BzIiwgIm9wdGlvbnMiLCAiU2lnbkluIiwgImVycm9yTXNnIiwgInNldEVycm9yTXNnIiwgImgiLCAidGl0bGUiLCAib25FcnJvciIsICJtc2ciLCAidSIsICJwcm9wcyIsICJnZXRSZXNEYXRhIiwgInJlcyIsICJlcnIiLCAic2lnbkluIiwgInByb3ZpZGVyIiwgIkdvb2dsZUF1dGhQcm92aWRlciIsICJ1c2VyIiwgInNpZ25JbldpdGhQb3B1cCIsICJpZFRva2VuIiwgImRhdGEiLCAiZW1haWwiLCAibG9naW5TdWNjZXNzUmVkaXJlY3QiLCAicmVkaXJlY3RVcmwiLCAiYXBwIiwgImluaXRpYWxpemVBcHAiLCAiYXV0aCIsICJnZXRBdXRoIiwgInJvb3QiLCAicSJdCn0K
|