country-flag-cli 0.0.22 → 0.0.23

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. package/dist/cli.js +1 -1
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -71,4 +71,4 @@ PERFORMANCE OF THIS SOFTWARE.
71
71
  * https://github.com/felixge/node-stack-trace/
72
72
  * @license MIT
73
73
  */
74
- //# sourceMappingURL=cli.js.map
74
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHlwZXMvc3JjL2xvZ2xldmVsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9zZXNzaW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9zZXZlcml0eS50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9zcmMvc3RhdHVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy90cmFuc2FjdGlvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9zcmMvdHJhbnNwb3J0LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvYXN5bmMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL25vZGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2dsb2JhbC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvaXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2Jyb3dzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3BvbHlmaWxsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9lcnJvci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvZHNuLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9sb2dnZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL21lbW8udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3N0YWNrdHJhY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3N0cmluZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvb2JqZWN0LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9zdXBwb3J0cy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvaW5zdHJ1bWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvbWlzYy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvcGF0aC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvc3luY3Byb21pc2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3Byb21pc2VidWZmZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3RpbWUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvc2NvcGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL3NyYy9zZXNzaW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvaHViLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvc2Vzc2lvbmZsdXNoZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9taW5pbWFsL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9hcGkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvaW50ZWdyYXRpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvYmFzZWNsaWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy90cmFuc3BvcnRzL25vb3AudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvYmFzZWJhY2tlbmQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvcmVxdWVzdC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9zZGsudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvdmVyc2lvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9pbnRlZ3JhdGlvbnMvZnVuY3Rpb250b3N0cmluZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9pbnRlZ3JhdGlvbnMvaW5ib3VuZGZpbHRlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9scnVfbWFwL2xydS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy9zdGFja3RyYWNlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3BhcnNlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvdmVyc2lvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy90cmFuc3BvcnRzL2Jhc2UvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvaGFzLWZsYWcvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3N1cHBvcnRzLWNvbG9yL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hZ2VudC1iYXNlL3NyYy9wcm9taXNpZnkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2FnZW50LWJhc2Uvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9odHRwcy1wcm94eS1hZ2VudC9zcmMvcGFyc2UtcHJveHktcmVzcG9uc2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L3NyYy9hZ2VudC50cyIsICIuLi9ub2RlX21vZHVsZXMvaHR0cHMtcHJveHktYWdlbnQvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3RyYW5zcG9ydHMvaHR0cC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy90cmFuc3BvcnRzL2h0dHBzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3RyYW5zcG9ydHMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvYmFja2VuZC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy9jbGllbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2NvbnNvbGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL3V0aWxzL2h0dHAudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2h0dHAudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL3V0aWxzL2Vycm9yaGFuZGxpbmcudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL29udW5jYXVnaHRleGNlcHRpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL29udW5oYW5kbGVkcmVqZWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL2ludGVncmF0aW9ucy9saW5rZWRlcnJvcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL21vZHVsZXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3Nkay50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy91dGlscy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9zcGFuc3RhdHVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Vycm9ycy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9jb25zdGFudHMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvc3Bhbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy90cmFuc2FjdGlvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9pZGxldHJhbnNhY3Rpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvaHViZXh0ZW5zaW9ucy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9pbnRlZ3JhdGlvbnMvbm9kZS9leHByZXNzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL3Bvc3RncmVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL215c3FsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL21vbmdvLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvYmFja2dyb3VuZHRhYi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL2JpbmRSZXBvcnRlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL2dlbmVyYXRlVW5pcXVlSUQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci93ZWItdml0YWxzL2xpYi9pbml0TWV0cmljLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9saWIvb2JzZXJ2ZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL29uSGlkZGVuLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRDTFMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci93ZWItdml0YWxzL2xpYi9nZXRWaXNpYmlsaXR5V2F0Y2hlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvZ2V0RklELnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRMQ1AudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci9tZXRyaWNzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvcmVxdWVzdC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3JvdXRlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL2Jyb3dzZXJ0cmFjaW5nLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9jb29raWUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaGFuZGxlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaW50ZWdyYXRpb25zL3NyYy9hbmd1bGFyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvY2FwdHVyZWNvbnNvbGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaW50ZWdyYXRpb25zL3NyYy9kZWJ1Zy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9pbnRlZ3JhdGlvbnMvc3JjL2RlZHVwZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9pbnRlZ3JhdGlvbnMvc3JjL2VtYmVyLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvZXh0cmFlcnJvcmRhdGEudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2xvY2FsZm9yYWdlL2Rpc3QvbG9jYWxmb3JhZ2UuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaW50ZWdyYXRpb25zL3NyYy9vZmZsaW5lLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvcmVwb3J0aW5nb2JzZXJ2ZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaW50ZWdyYXRpb25zL3NyYy9yZXdyaXRlZnJhbWVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvc2Vzc2lvbnRpbWluZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9pbnRlZ3JhdGlvbnMvc3JjL3RyYW5zYWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvdnVlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2ludGVncmF0aW9ucy9zcmMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC5qcyIsICIuLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmFzZTY0LXZscS5qcyIsICIuLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvdXRpbC5qcyIsICIuLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYXJyYXktc2V0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9tYXBwaW5nLWxpc3QuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9iaW5hcnktc2VhcmNoLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9xdWljay1zb3J0LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2Utbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9zb3VyY2UtbWFwLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9idWZmZXItZnJvbS9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L3NvdXJjZS1tYXAtc3VwcG9ydC5qcyIsICIuLi9zcmMvY2xpLnRzIiwgIi4uL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxudmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoJ2V2ZW50cycpLkV2ZW50RW1pdHRlcjtcbnZhciBzcGF3biA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5zcGF3bjtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xudmFyIGRpcm5hbWUgPSBwYXRoLmRpcm5hbWU7XG52YXIgYmFzZW5hbWUgPSBwYXRoLmJhc2VuYW1lO1xudmFyIGZzID0gcmVxdWlyZSgnZnMnKTtcblxuLyoqXG4gKiBJbmhlcml0IGBDb21tYW5kYCBmcm9tIGBFdmVudEVtaXR0ZXIucHJvdG90eXBlYC5cbiAqL1xuXG5yZXF1aXJlKCd1dGlsJykuaW5oZXJpdHMoQ29tbWFuZCwgRXZlbnRFbWl0dGVyKTtcblxuLyoqXG4gKiBFeHBvc2UgdGhlIHJvb3QgY29tbWFuZC5cbiAqL1xuXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBuZXcgQ29tbWFuZCgpO1xuXG4vKipcbiAqIEV4cG9zZSBgQ29tbWFuZGAuXG4gKi9cblxuZXhwb3J0cy5Db21tYW5kID0gQ29tbWFuZDtcblxuLyoqXG4gKiBFeHBvc2UgYE9wdGlvbmAuXG4gKi9cblxuZXhwb3J0cy5PcHRpb24gPSBPcHRpb247XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgT3B0aW9uYCB3aXRoIHRoZSBnaXZlbiBgZmxhZ3NgIGFuZCBgZGVzY3JpcHRpb25gLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmbGFnc1xuICogQHBhcmFtIHtTdHJpbmd9IGRlc2NyaXB0aW9uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbmZ1bmN0aW9uIE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgdGhpcy5mbGFncyA9IGZsYWdzO1xuICB0aGlzLnJlcXVpcmVkID0gZmxhZ3MuaW5kZXhPZignPCcpID49IDA7XG4gIHRoaXMub3B0aW9uYWwgPSBmbGFncy5pbmRleE9mKCdbJykgPj0gMDtcbiAgdGhpcy5ib29sID0gZmxhZ3MuaW5kZXhPZignLW5vLScpID09PSAtMTtcbiAgZmxhZ3MgPSBmbGFncy5zcGxpdCgvWyAsfF0rLyk7XG4gIGlmIChmbGFncy5sZW5ndGggPiAxICYmICEvXltbPF0vLnRlc3QoZmxhZ3NbMV0pKSB0aGlzLnNob3J0ID0gZmxhZ3Muc2hpZnQoKTtcbiAgdGhpcy5sb25nID0gZmxhZ3Muc2hpZnQoKTtcbiAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICcnO1xufVxuXG4vKipcbiAqIFJldHVybiBvcHRpb24gbmFtZS5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5PcHRpb24ucHJvdG90eXBlLm5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMubG9uZ1xuICAgIC5yZXBsYWNlKCctLScsICcnKVxuICAgIC5yZXBsYWNlKCduby0nLCAnJyk7XG59O1xuXG4vKipcbiAqIFJldHVybiBvcHRpb24gbmFtZSwgaW4gYSBjYW1lbGNhc2UgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWRcbiAqIGFzIGEgb2JqZWN0IGF0dHJpYnV0ZSBrZXkuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuT3B0aW9uLnByb3RvdHlwZS5hdHRyaWJ1dGVOYW1lID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBjYW1lbGNhc2UodGhpcy5uYW1lKCkpO1xufTtcblxuLyoqXG4gKiBDaGVjayBpZiBgYXJnYCBtYXRjaGVzIHRoZSBzaG9ydCBvciBsb25nIGZsYWcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFyZ1xuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk9wdGlvbi5wcm90b3R5cGUuaXMgPSBmdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHRoaXMuc2hvcnQgPT09IGFyZyB8fCB0aGlzLmxvbmcgPT09IGFyZztcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBgQ29tbWFuZGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gQ29tbWFuZChuYW1lKSB7XG4gIHRoaXMuY29tbWFuZHMgPSBbXTtcbiAgdGhpcy5vcHRpb25zID0gW107XG4gIHRoaXMuX2V4ZWNzID0ge307XG4gIHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbiA9IGZhbHNlO1xuICB0aGlzLl9hcmdzID0gW107XG4gIHRoaXMuX25hbWUgPSBuYW1lIHx8ICcnO1xufVxuXG4vKipcbiAqIEFkZCBjb21tYW5kIGBuYW1lYC5cbiAqXG4gKiBUaGUgYC5hY3Rpb24oKWAgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuIHRoZVxuICogY29tbWFuZCBgbmFtZWAgaXMgc3BlY2lmaWVkIHZpYSBfX0FSR1ZfXyxcbiAqIGFuZCB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byB0aGVcbiAqIGZ1bmN0aW9uIGZvciBhY2Nlc3MuXG4gKlxuICogV2hlbiB0aGUgYG5hbWVgIGlzIFwiKlwiIGFuIHVuLW1hdGNoZWQgY29tbWFuZFxuICogd2lsbCBiZSBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZywgZm9sbG93ZWQgYnlcbiAqIHRoZSByZXN0IG9mIF9fQVJHVl9fIHJlbWFpbmluZy5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHByb2dyYW1cbiAqICAgICAgICAudmVyc2lvbignMC4wLjEnKVxuICogICAgICAgIC5vcHRpb24oJy1DLCAtLWNoZGlyIDxwYXRoPicsICdjaGFuZ2UgdGhlIHdvcmtpbmcgZGlyZWN0b3J5JylcbiAqICAgICAgICAub3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ3NldCBjb25maWcgcGF0aC4gZGVmYXVsdHMgdG8gLi9kZXBsb3kuY29uZicpXG4gKiAgICAgICAgLm9wdGlvbignLVQsIC0tbm8tdGVzdHMnLCAnaWdub3JlIHRlc3QgaG9vaycpXG4gKlxuICogICAgICBwcm9ncmFtXG4gKiAgICAgICAgLmNvbW1hbmQoJ3NldHVwJylcbiAqICAgICAgICAuZGVzY3JpcHRpb24oJ3J1biByZW1vdGUgc2V0dXAgY29tbWFuZHMnKVxuICogICAgICAgIC5hY3Rpb24oZnVuY3Rpb24oKSB7XG4gKiAgICAgICAgICBjb25zb2xlLmxvZygnc2V0dXAnKTtcbiAqICAgICAgICB9KTtcbiAqXG4gKiAgICAgIHByb2dyYW1cbiAqICAgICAgICAuY29tbWFuZCgnZXhlYyA8Y21kPicpXG4gKiAgICAgICAgLmRlc2NyaXB0aW9uKCdydW4gdGhlIGdpdmVuIHJlbW90ZSBjb21tYW5kJylcbiAqICAgICAgICAuYWN0aW9uKGZ1bmN0aW9uKGNtZCkge1xuICogICAgICAgICAgY29uc29sZS5sb2coJ2V4ZWMgXCIlc1wiJywgY21kKTtcbiAqICAgICAgICB9KTtcbiAqXG4gKiAgICAgIHByb2dyYW1cbiAqICAgICAgICAuY29tbWFuZCgndGVhcmRvd24gPGRpcj4gW290aGVyRGlycy4uLl0nKVxuICogICAgICAgIC5kZXNjcmlwdGlvbigncnVuIHRlYXJkb3duIGNvbW1hbmRzJylcbiAqICAgICAgICAuYWN0aW9uKGZ1bmN0aW9uKGRpciwgb3RoZXJEaXJzKSB7XG4gKiAgICAgICAgICBjb25zb2xlLmxvZygnZGlyIFwiJXNcIicsIGRpcik7XG4gKiAgICAgICAgICBpZiAob3RoZXJEaXJzKSB7XG4gKiAgICAgICAgICAgIG90aGVyRGlycy5mb3JFYWNoKGZ1bmN0aW9uIChvRGlyKSB7XG4gKiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RpciBcIiVzXCInLCBvRGlyKTtcbiAqICAgICAgICAgICAgfSk7XG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfSk7XG4gKlxuICogICAgICBwcm9ncmFtXG4gKiAgICAgICAgLmNvbW1hbmQoJyonKVxuICogICAgICAgIC5kZXNjcmlwdGlvbignZGVwbG95IHRoZSBnaXZlbiBlbnYnKVxuICogICAgICAgIC5hY3Rpb24oZnVuY3Rpb24oZW52KSB7XG4gKiAgICAgICAgICBjb25zb2xlLmxvZygnZGVwbG95aW5nIFwiJXNcIicsIGVudik7XG4gKiAgICAgICAgfSk7XG4gKlxuICogICAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG4gICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1N0cmluZ30gW2Rlc2NdIGZvciBnaXQtc3R5bGUgc3ViLWNvbW1hbmRzXG4gKiBAcmV0dXJuIHtDb21tYW5kfSB0aGUgbmV3IGNvbW1hbmRcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuY29tbWFuZCA9IGZ1bmN0aW9uKG5hbWUsIGRlc2MsIG9wdHMpIHtcbiAgaWYgKHR5cGVvZiBkZXNjID09PSAnb2JqZWN0JyAmJiBkZXNjICE9PSBudWxsKSB7XG4gICAgb3B0cyA9IGRlc2M7XG4gICAgZGVzYyA9IG51bGw7XG4gIH1cbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciBhcmdzID0gbmFtZS5zcGxpdCgvICsvKTtcbiAgdmFyIGNtZCA9IG5ldyBDb21tYW5kKGFyZ3Muc2hpZnQoKSk7XG5cbiAgaWYgKGRlc2MpIHtcbiAgICBjbWQuZGVzY3JpcHRpb24oZGVzYyk7XG4gICAgdGhpcy5leGVjdXRhYmxlcyA9IHRydWU7XG4gICAgdGhpcy5fZXhlY3NbY21kLl9uYW1lXSA9IHRydWU7XG4gICAgaWYgKG9wdHMuaXNEZWZhdWx0KSB0aGlzLmRlZmF1bHRFeGVjdXRhYmxlID0gY21kLl9uYW1lO1xuICB9XG4gIGNtZC5fbm9IZWxwID0gISFvcHRzLm5vSGVscDtcbiAgdGhpcy5jb21tYW5kcy5wdXNoKGNtZCk7XG4gIGNtZC5wYXJzZUV4cGVjdGVkQXJncyhhcmdzKTtcbiAgY21kLnBhcmVudCA9IHRoaXM7XG5cbiAgaWYgKGRlc2MpIHJldHVybiB0aGlzO1xuICByZXR1cm4gY21kO1xufTtcblxuLyoqXG4gKiBEZWZpbmUgYXJndW1lbnQgc3ludGF4IGZvciB0aGUgdG9wLWxldmVsIGNvbW1hbmQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5hcmd1bWVudHMgPSBmdW5jdGlvbihkZXNjKSB7XG4gIHJldHVybiB0aGlzLnBhcnNlRXhwZWN0ZWRBcmdzKGRlc2Muc3BsaXQoLyArLykpO1xufTtcblxuLyoqXG4gKiBBZGQgYW4gaW1wbGljaXQgYGhlbHAgW2NtZF1gIHN1YmNvbW1hbmRcbiAqIHdoaWNoIGludm9rZXMgYC0taGVscGAgZm9yIHRoZSBnaXZlbiBjb21tYW5kLlxuICpcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmFkZEltcGxpY2l0SGVscENvbW1hbmQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5jb21tYW5kKCdoZWxwIFtjbWRdJywgJ2Rpc3BsYXkgaGVscCBmb3IgW2NtZF0nKTtcbn07XG5cbi8qKlxuICogUGFyc2UgZXhwZWN0ZWQgYGFyZ3NgLlxuICpcbiAqIEZvciBleGFtcGxlIGBbXCJbdHlwZV1cIl1gIGJlY29tZXMgYFt7IHJlcXVpcmVkOiBmYWxzZSwgbmFtZTogJ3R5cGUnIH1dYC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcmV0dXJuIHtDb21tYW5kfSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFyc2VFeHBlY3RlZEFyZ3MgPSBmdW5jdGlvbihhcmdzKSB7XG4gIGlmICghYXJncy5sZW5ndGgpIHJldHVybjtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBhcmdzLmZvckVhY2goZnVuY3Rpb24oYXJnKSB7XG4gICAgdmFyIGFyZ0RldGFpbHMgPSB7XG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBuYW1lOiAnJyxcbiAgICAgIHZhcmlhZGljOiBmYWxzZVxuICAgIH07XG5cbiAgICBzd2l0Y2ggKGFyZ1swXSkge1xuICAgICAgY2FzZSAnPCc6XG4gICAgICAgIGFyZ0RldGFpbHMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICBhcmdEZXRhaWxzLm5hbWUgPSBhcmcuc2xpY2UoMSwgLTEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1snOlxuICAgICAgICBhcmdEZXRhaWxzLm5hbWUgPSBhcmcuc2xpY2UoMSwgLTEpO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAoYXJnRGV0YWlscy5uYW1lLmxlbmd0aCA+IDMgJiYgYXJnRGV0YWlscy5uYW1lLnNsaWNlKC0zKSA9PT0gJy4uLicpIHtcbiAgICAgIGFyZ0RldGFpbHMudmFyaWFkaWMgPSB0cnVlO1xuICAgICAgYXJnRGV0YWlscy5uYW1lID0gYXJnRGV0YWlscy5uYW1lLnNsaWNlKDAsIC0zKTtcbiAgICB9XG4gICAgaWYgKGFyZ0RldGFpbHMubmFtZSkge1xuICAgICAgc2VsZi5fYXJncy5wdXNoKGFyZ0RldGFpbHMpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZWdpc3RlciBjYWxsYmFjayBgZm5gIGZvciB0aGUgY29tbWFuZC5cbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgIHByb2dyYW1cbiAqICAgICAgICAuY29tbWFuZCgnaGVscCcpXG4gKiAgICAgICAgLmRlc2NyaXB0aW9uKCdkaXNwbGF5IHZlcmJvc2UgaGVscCcpXG4gKiAgICAgICAgLmFjdGlvbihmdW5jdGlvbigpIHtcbiAqICAgICAgICAgICAvLyBvdXRwdXQgaGVscCBoZXJlXG4gKiAgICAgICAgfSk7XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm4ge0NvbW1hbmR9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5hY3Rpb24gPSBmdW5jdGlvbihmbikge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGFyZ3MsIHVua25vd24pIHtcbiAgICAvLyBQYXJzZSBhbnkgc28tZmFyIHVua25vd24gb3B0aW9uc1xuICAgIGFyZ3MgPSBhcmdzIHx8IFtdO1xuICAgIHVua25vd24gPSB1bmtub3duIHx8IFtdO1xuXG4gICAgdmFyIHBhcnNlZCA9IHNlbGYucGFyc2VPcHRpb25zKHVua25vd24pO1xuXG4gICAgLy8gT3V0cHV0IGhlbHAgaWYgbmVjZXNzYXJ5XG4gICAgb3V0cHV0SGVscElmTmVjZXNzYXJ5KHNlbGYsIHBhcnNlZC51bmtub3duKTtcblxuICAgIC8vIElmIHRoZXJlIGFyZSBzdGlsbCBhbnkgdW5rbm93biBvcHRpb25zLCB0aGVuIHdlIHNpbXBseVxuICAgIC8vIGRpZSwgdW5sZXNzIHNvbWVvbmUgYXNrZWQgZm9yIGhlbHAsIGluIHdoaWNoIGNhc2Ugd2UgZ2l2ZSBpdFxuICAgIC8vIHRvIHRoZW0sIGFuZCB0aGVuIHdlIGRpZS5cbiAgICBpZiAocGFyc2VkLnVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgc2VsZi51bmtub3duT3B0aW9uKHBhcnNlZC51bmtub3duWzBdKTtcbiAgICB9XG5cbiAgICAvLyBMZWZ0b3ZlciBhcmd1bWVudHMgbmVlZCB0byBiZSBwdXNoZWQgYmFjay4gRml4ZXMgaXNzdWUgIzU2XG4gICAgaWYgKHBhcnNlZC5hcmdzLmxlbmd0aCkgYXJncyA9IHBhcnNlZC5hcmdzLmNvbmNhdChhcmdzKTtcblxuICAgIHNlbGYuX2FyZ3MuZm9yRWFjaChmdW5jdGlvbihhcmcsIGkpIHtcbiAgICAgIGlmIChhcmcucmVxdWlyZWQgJiYgYXJnc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHNlbGYubWlzc2luZ0FyZ3VtZW50KGFyZy5uYW1lKTtcbiAgICAgIH0gZWxzZSBpZiAoYXJnLnZhcmlhZGljKSB7XG4gICAgICAgIGlmIChpICE9PSBzZWxmLl9hcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBzZWxmLnZhcmlhZGljQXJnTm90TGFzdChhcmcubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICBhcmdzW2ldID0gYXJncy5zcGxpY2UoaSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBBbHdheXMgYXBwZW5kIG91cnNlbHZlcyB0byB0aGUgZW5kIG9mIHRoZSBhcmd1bWVudHMsXG4gICAgLy8gdG8gbWFrZSBzdXJlIHdlIG1hdGNoIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZSB1c2VyXG4gICAgLy8gZXhwZWN0c1xuICAgIGlmIChzZWxmLl9hcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tzZWxmLl9hcmdzLmxlbmd0aF0gPSBzZWxmO1xuICAgIH0gZWxzZSB7XG4gICAgICBhcmdzLnB1c2goc2VsZik7XG4gICAgfVxuXG4gICAgZm4uYXBwbHkoc2VsZiwgYXJncyk7XG4gIH07XG4gIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzO1xuICB2YXIgbmFtZSA9IHBhcmVudCA9PT0gdGhpcyA/ICcqJyA6IHRoaXMuX25hbWU7XG4gIHBhcmVudC5vbignY29tbWFuZDonICsgbmFtZSwgbGlzdGVuZXIpO1xuICBpZiAodGhpcy5fYWxpYXMpIHBhcmVudC5vbignY29tbWFuZDonICsgdGhpcy5fYWxpYXMsIGxpc3RlbmVyKTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIERlZmluZSBvcHRpb24gd2l0aCBgZmxhZ3NgLCBgZGVzY3JpcHRpb25gIGFuZCBvcHRpb25hbFxuICogY29lcmNpb24gYGZuYC5cbiAqXG4gKiBUaGUgYGZsYWdzYCBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gYm90aCB0aGUgc2hvcnQgYW5kIGxvbmcgZmxhZ3MsXG4gKiBzZXBhcmF0ZWQgYnkgY29tbWEsIGEgcGlwZSBvciBzcGFjZS4gVGhlIGZvbGxvd2luZyBhcmUgYWxsIHZhbGlkXG4gKiBhbGwgd2lsbCBvdXRwdXQgdGhpcyB3YXkgd2hlbiBgLS1oZWxwYCBpcyB1c2VkLlxuICpcbiAqICAgIFwiLXAsIC0tcGVwcGVyXCJcbiAqICAgIFwiLXB8LS1wZXBwZXJcIlxuICogICAgXCItcCAtLXBlcHBlclwiXG4gKlxuICogRXhhbXBsZXM6XG4gKlxuICogICAgIC8vIHNpbXBsZSBib29sZWFuIGRlZmF1bHRpbmcgdG8gZmFsc2VcbiAqICAgICBwcm9ncmFtLm9wdGlvbignLXAsIC0tcGVwcGVyJywgJ2FkZCBwZXBwZXInKTtcbiAqXG4gKiAgICAgLS1wZXBwZXJcbiAqICAgICBwcm9ncmFtLnBlcHBlclxuICogICAgIC8vID0+IEJvb2xlYW5cbiAqXG4gKiAgICAgLy8gc2ltcGxlIGJvb2xlYW4gZGVmYXVsdGluZyB0byB0cnVlXG4gKiAgICAgcHJvZ3JhbS5vcHRpb24oJy1DLCAtLW5vLWNoZWVzZScsICdyZW1vdmUgY2hlZXNlJyk7XG4gKlxuICogICAgIHByb2dyYW0uY2hlZXNlXG4gKiAgICAgLy8gPT4gdHJ1ZVxuICpcbiAqICAgICAtLW5vLWNoZWVzZVxuICogICAgIHByb2dyYW0uY2hlZXNlXG4gKiAgICAgLy8gPT4gZmFsc2VcbiAqXG4gKiAgICAgLy8gcmVxdWlyZWQgYXJndW1lbnRcbiAqICAgICBwcm9ncmFtLm9wdGlvbignLUMsIC0tY2hkaXIgPHBhdGg+JywgJ2NoYW5nZSB0aGUgd29ya2luZyBkaXJlY3RvcnknKTtcbiAqXG4gKiAgICAgLS1jaGRpciAvdG1wXG4gKiAgICAgcHJvZ3JhbS5jaGRpclxuICogICAgIC8vID0+IFwiL3RtcFwiXG4gKlxuICogICAgIC8vIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiAgICAgcHJvZ3JhbS5vcHRpb24oJy1jLCAtLWNoZWVzZSBbdHlwZV0nLCAnYWRkIGNoZWVzZSBbbWFyYmxlXScpO1xuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmbGFnc1xuICogQHBhcmFtIHtTdHJpbmd9IGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufCp9IFtmbl0gb3IgZGVmYXVsdFxuICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICogQHJldHVybiB7Q29tbWFuZH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLm9wdGlvbiA9IGZ1bmN0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiwgZm4sIGRlZmF1bHRWYWx1ZSkge1xuICB2YXIgc2VsZiA9IHRoaXMsXG4gICAgb3B0aW9uID0gbmV3IE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pLFxuICAgIG9uYW1lID0gb3B0aW9uLm5hbWUoKSxcbiAgICBuYW1lID0gb3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcblxuICAvLyBkZWZhdWx0IGFzIDNyZCBhcmdcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmIChmbiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgdmFyIHJlZ2V4ID0gZm47XG4gICAgICBmbiA9IGZ1bmN0aW9uKHZhbCwgZGVmKSB7XG4gICAgICAgIHZhciBtID0gcmVnZXguZXhlYyh2YWwpO1xuICAgICAgICByZXR1cm4gbSA/IG1bMF0gOiBkZWY7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWZhdWx0VmFsdWUgPSBmbjtcbiAgICAgIGZuID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBwcmVhc3NpZ24gZGVmYXVsdCB2YWx1ZSBvbmx5IGZvciAtLW5vLSosIFtvcHRpb25hbF0sIG9yIDxyZXF1aXJlZD5cbiAgaWYgKCFvcHRpb24uYm9vbCB8fCBvcHRpb24ub3B0aW9uYWwgfHwgb3B0aW9uLnJlcXVpcmVkKSB7XG4gICAgLy8gd2hlbiAtLW5vLSogd2UgbWFrZSBzdXJlIGRlZmF1bHQgaXMgdHJ1ZVxuICAgIGlmICghb3B0aW9uLmJvb2wpIGRlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgLy8gcHJlYXNzaWduIG9ubHkgaWYgd2UgaGF2ZSBhIGRlZmF1bHRcbiAgICBpZiAoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNlbGZbbmFtZV0gPSBkZWZhdWx0VmFsdWU7XG4gICAgICBvcHRpb24uZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlZ2lzdGVyIHRoZSBvcHRpb25cbiAgdGhpcy5vcHRpb25zLnB1c2gob3B0aW9uKTtcblxuICAvLyB3aGVuIGl0J3MgcGFzc2VkIGFzc2lnbiB0aGUgdmFsdWVcbiAgLy8gYW5kIGNvbmRpdGlvbmFsbHkgaW52b2tlIHRoZSBjYWxsYmFja1xuICB0aGlzLm9uKCdvcHRpb246JyArIG9uYW1lLCBmdW5jdGlvbih2YWwpIHtcbiAgICAvLyBjb2VyY2lvblxuICAgIGlmICh2YWwgIT09IG51bGwgJiYgZm4pIHtcbiAgICAgIHZhbCA9IGZuKHZhbCwgc2VsZltuYW1lXSA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogc2VsZltuYW1lXSk7XG4gICAgfVxuXG4gICAgLy8gdW5hc3NpZ25lZCBvciBib29sXG4gICAgaWYgKHR5cGVvZiBzZWxmW25hbWVdID09PSAnYm9vbGVhbicgfHwgdHlwZW9mIHNlbGZbbmFtZV0gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBpZiBubyB2YWx1ZSwgYm9vbCB0cnVlLCBhbmQgd2UgaGF2ZSBhIGRlZmF1bHQsIHRoZW4gdXNlIGl0IVxuICAgICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHNlbGZbbmFtZV0gPSBvcHRpb24uYm9vbFxuICAgICAgICAgID8gZGVmYXVsdFZhbHVlIHx8IHRydWVcbiAgICAgICAgICA6IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VsZltuYW1lXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbCAhPT0gbnVsbCkge1xuICAgICAgLy8gcmVhc3NpZ25cbiAgICAgIHNlbGZbbmFtZV0gPSB2YWw7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWxsb3cgdW5rbm93biBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUuXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBhcmcgaWYgYHRydWVgIG9yIG9taXR0ZWQsIG5vIGVycm9yIHdpbGwgYmUgdGhyb3duXG4gKiBmb3IgdW5rbm93biBvcHRpb25zLlxuICogQGFwaSBwdWJsaWNcbiAqL1xuQ29tbWFuZC5wcm90b3R5cGUuYWxsb3dVbmtub3duT3B0aW9uID0gZnVuY3Rpb24oYXJnKSB7XG4gIHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDAgfHwgYXJnO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUGFyc2UgYGFyZ3ZgLCBzZXR0aW5ncyBvcHRpb25zIGFuZCBpbnZva2luZyBjb21tYW5kcyB3aGVuIGRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJndlxuICogQHJldHVybiB7Q29tbWFuZH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnBhcnNlID0gZnVuY3Rpb24oYXJndikge1xuICAvLyBpbXBsaWNpdCBoZWxwXG4gIGlmICh0aGlzLmV4ZWN1dGFibGVzKSB0aGlzLmFkZEltcGxpY2l0SGVscENvbW1hbmQoKTtcblxuICAvLyBzdG9yZSByYXcgYXJnc1xuICB0aGlzLnJhd0FyZ3MgPSBhcmd2O1xuXG4gIC8vIGd1ZXNzIG5hbWVcbiAgdGhpcy5fbmFtZSA9IHRoaXMuX25hbWUgfHwgYmFzZW5hbWUoYXJndlsxXSwgJy5qcycpO1xuXG4gIC8vIGdpdGh1Yi1zdHlsZSBzdWItY29tbWFuZHMgd2l0aCBubyBzdWItY29tbWFuZFxuICBpZiAodGhpcy5leGVjdXRhYmxlcyAmJiBhcmd2Lmxlbmd0aCA8IDMgJiYgIXRoaXMuZGVmYXVsdEV4ZWN1dGFibGUpIHtcbiAgICAvLyB0aGlzIHVzZXIgbmVlZHMgaGVscFxuICAgIGFyZ3YucHVzaCgnLS1oZWxwJyk7XG4gIH1cblxuICAvLyBwcm9jZXNzIGFyZ3ZcbiAgdmFyIHBhcnNlZCA9IHRoaXMucGFyc2VPcHRpb25zKHRoaXMubm9ybWFsaXplKGFyZ3Yuc2xpY2UoMikpKTtcbiAgdmFyIGFyZ3MgPSB0aGlzLmFyZ3MgPSBwYXJzZWQuYXJncztcblxuICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZUFyZ3ModGhpcy5hcmdzLCBwYXJzZWQudW5rbm93bik7XG5cbiAgLy8gZXhlY3V0YWJsZSBzdWItY29tbWFuZHNcbiAgdmFyIG5hbWUgPSByZXN1bHQuYXJnc1swXTtcblxuICB2YXIgYWxpYXNDb21tYW5kID0gbnVsbDtcbiAgLy8gY2hlY2sgYWxpYXMgb2Ygc3ViIGNvbW1hbmRzXG4gIGlmIChuYW1lKSB7XG4gICAgYWxpYXNDb21tYW5kID0gdGhpcy5jb21tYW5kcy5maWx0ZXIoZnVuY3Rpb24oY29tbWFuZCkge1xuICAgICAgcmV0dXJuIGNvbW1hbmQuYWxpYXMoKSA9PT0gbmFtZTtcbiAgICB9KVswXTtcbiAgfVxuXG4gIGlmICh0aGlzLl9leGVjc1tuYW1lXSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJDb21tYW5kKGFyZ3YsIGFyZ3MsIHBhcnNlZC51bmtub3duKTtcbiAgfSBlbHNlIGlmIChhbGlhc0NvbW1hbmQpIHtcbiAgICAvLyBpcyBhbGlhcyBvZiBhIHN1YkNvbW1hbmRcbiAgICBhcmdzWzBdID0gYWxpYXNDb21tYW5kLl9uYW1lO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJDb21tYW5kKGFyZ3YsIGFyZ3MsIHBhcnNlZC51bmtub3duKTtcbiAgfSBlbHNlIGlmICh0aGlzLmRlZmF1bHRFeGVjdXRhYmxlKSB7XG4gICAgLy8gdXNlIHRoZSBkZWZhdWx0IHN1YmNvbW1hbmRcbiAgICBhcmdzLnVuc2hpZnQodGhpcy5kZWZhdWx0RXhlY3V0YWJsZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YkNvbW1hbmQoYXJndiwgYXJncywgcGFyc2VkLnVua25vd24pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogRXhlY3V0ZSBhIHN1Yi1jb21tYW5kIGV4ZWN1dGFibGUuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJndlxuICogQHBhcmFtIHtBcnJheX0gYXJnc1xuICogQHBhcmFtIHtBcnJheX0gdW5rbm93blxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuZXhlY3V0ZVN1YkNvbW1hbmQgPSBmdW5jdGlvbihhcmd2LCBhcmdzLCB1bmtub3duKSB7XG4gIGFyZ3MgPSBhcmdzLmNvbmNhdCh1bmtub3duKTtcblxuICBpZiAoIWFyZ3MubGVuZ3RoKSB0aGlzLmhlbHAoKTtcbiAgaWYgKGFyZ3NbMF0gPT09ICdoZWxwJyAmJiBhcmdzLmxlbmd0aCA9PT0gMSkgdGhpcy5oZWxwKCk7XG5cbiAgLy8gPGNtZD4gLS1oZWxwXG4gIGlmIChhcmdzWzBdID09PSAnaGVscCcpIHtcbiAgICBhcmdzWzBdID0gYXJnc1sxXTtcbiAgICBhcmdzWzFdID0gJy0taGVscCc7XG4gIH1cblxuICAvLyBleGVjdXRhYmxlXG4gIHZhciBmID0gYXJndlsxXTtcbiAgLy8gbmFtZSBvZiB0aGUgc3ViY29tbWFuZCwgbGluayBgcG0taW5zdGFsbGBcbiAgdmFyIGJpbiA9IGJhc2VuYW1lKGYsIHBhdGguZXh0bmFtZShmKSkgKyAnLScgKyBhcmdzWzBdO1xuXG4gIC8vIEluIGNhc2Ugb2YgZ2xvYmFsbHkgaW5zdGFsbGVkLCBnZXQgdGhlIGJhc2UgZGlyIHdoZXJlIGV4ZWN1dGFibGVcbiAgLy8gIHN1YmNvbW1hbmQgZmlsZSBzaG91bGQgYmUgbG9jYXRlZCBhdFxuICB2YXIgYmFzZURpcjtcblxuICB2YXIgcmVzb2x2ZWRMaW5rID0gZnMucmVhbHBhdGhTeW5jKGYpO1xuXG4gIGJhc2VEaXIgPSBkaXJuYW1lKHJlc29sdmVkTGluayk7XG5cbiAgLy8gcHJlZmVyIGxvY2FsIGAuLzxiaW4+YCB0byBiaW4gaW4gdGhlICRQQVRIXG4gIHZhciBsb2NhbEJpbiA9IHBhdGguam9pbihiYXNlRGlyLCBiaW4pO1xuXG4gIC8vIHdoZXRoZXIgYmluIGZpbGUgaXMgYSBqcyBzY3JpcHQgd2l0aCBleHBsaWNpdCBgLmpzYCBvciBgLnRzYCBleHRlbnNpb25cbiAgdmFyIGlzRXhwbGljaXRKUyA9IGZhbHNlO1xuICBpZiAoZXhpc3RzKGxvY2FsQmluICsgJy5qcycpKSB7XG4gICAgYmluID0gbG9jYWxCaW4gKyAnLmpzJztcbiAgICBpc0V4cGxpY2l0SlMgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGV4aXN0cyhsb2NhbEJpbiArICcudHMnKSkge1xuICAgIGJpbiA9IGxvY2FsQmluICsgJy50cyc7XG4gICAgaXNFeHBsaWNpdEpTID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChleGlzdHMobG9jYWxCaW4pKSB7XG4gICAgYmluID0gbG9jYWxCaW47XG4gIH1cblxuICBhcmdzID0gYXJncy5zbGljZSgxKTtcblxuICB2YXIgcHJvYztcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicpIHtcbiAgICBpZiAoaXNFeHBsaWNpdEpTKSB7XG4gICAgICBhcmdzLnVuc2hpZnQoYmluKTtcbiAgICAgIC8vIGFkZCBleGVjdXRhYmxlIGFyZ3VtZW50cyB0byBzcGF3blxuICAgICAgYXJncyA9IChwcm9jZXNzLmV4ZWNBcmd2IHx8IFtdKS5jb25jYXQoYXJncyk7XG5cbiAgICAgIHByb2MgPSBzcGF3bihwcm9jZXNzLmFyZ3ZbMF0sIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JywgY3VzdG9tRmRzOiBbMCwgMSwgMl0gfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2MgPSBzcGF3bihiaW4sIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JywgY3VzdG9tRmRzOiBbMCwgMSwgMl0gfSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFyZ3MudW5zaGlmdChiaW4pO1xuICAgIHByb2MgPSBzcGF3bihwcm9jZXNzLmV4ZWNQYXRoLCBhcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gIH1cblxuICB2YXIgc2lnbmFscyA9IFsnU0lHVVNSMScsICdTSUdVU1IyJywgJ1NJR1RFUk0nLCAnU0lHSU5UJywgJ1NJR0hVUCddO1xuICBzaWduYWxzLmZvckVhY2goZnVuY3Rpb24oc2lnbmFsKSB7XG4gICAgcHJvY2Vzcy5vbihzaWduYWwsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHByb2Mua2lsbGVkID09PSBmYWxzZSAmJiBwcm9jLmV4aXRDb2RlID09PSBudWxsKSB7XG4gICAgICAgIHByb2Mua2lsbChzaWduYWwpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbiAgcHJvYy5vbignY2xvc2UnLCBwcm9jZXNzLmV4aXQuYmluZChwcm9jZXNzKSk7XG4gIHByb2Mub24oJ2Vycm9yJywgZnVuY3Rpb24oZXJyKSB7XG4gICAgaWYgKGVyci5jb2RlID09PSAnRU5PRU5UJykge1xuICAgICAgY29uc29sZS5lcnJvcignZXJyb3I6ICVzKDEpIGRvZXMgbm90IGV4aXN0LCB0cnkgLS1oZWxwJywgYmluKTtcbiAgICB9IGVsc2UgaWYgKGVyci5jb2RlID09PSAnRUFDQ0VTJykge1xuICAgICAgY29uc29sZS5lcnJvcignZXJyb3I6ICVzKDEpIG5vdCBleGVjdXRhYmxlLiB0cnkgY2htb2Qgb3IgcnVuIHdpdGggcm9vdCcsIGJpbik7XG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfSk7XG5cbiAgLy8gU3RvcmUgdGhlIHJlZmVyZW5jZSB0byB0aGUgY2hpbGQgcHJvY2Vzc1xuICB0aGlzLnJ1bm5pbmdDb21tYW5kID0gcHJvYztcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIGBhcmdzYCwgc3BsaXR0aW5nIGpvaW5lZCBzaG9ydCBmbGFncy4gRm9yIGV4YW1wbGVcbiAqIHRoZSBhcmcgXCItYWJjXCIgaXMgZXF1aXZhbGVudCB0byBcIi1hIC1iIC1jXCIuXG4gKiBUaGlzIGFsc28gbm9ybWFsaXplcyBlcXVhbCBzaWduIGFuZCBzcGxpdHMgXCItLWFiYz1kZWZcIiBpbnRvIFwiLS1hYmMgZGVmXCIuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJnc1xuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbihhcmdzKSB7XG4gIHZhciByZXQgPSBbXSxcbiAgICBhcmcsXG4gICAgbGFzdE9wdCxcbiAgICBpbmRleDtcblxuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGFyZyA9IGFyZ3NbaV07XG4gICAgaWYgKGkgPiAwKSB7XG4gICAgICBsYXN0T3B0ID0gdGhpcy5vcHRpb25Gb3IoYXJnc1tpIC0gMV0pO1xuICAgIH1cblxuICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgIC8vIEhvbm9yIG9wdGlvbiB0ZXJtaW5hdG9yXG4gICAgICByZXQgPSByZXQuY29uY2F0KGFyZ3Muc2xpY2UoaSkpO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmIChsYXN0T3B0ICYmIGxhc3RPcHQucmVxdWlyZWQpIHtcbiAgICAgIHJldC5wdXNoKGFyZyk7XG4gICAgfSBlbHNlIGlmIChhcmcubGVuZ3RoID4gMSAmJiBhcmdbMF0gPT09ICctJyAmJiBhcmdbMV0gIT09ICctJykge1xuICAgICAgYXJnLnNsaWNlKDEpLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgcmV0LnB1c2goJy0nICsgYyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKC9eLS0vLnRlc3QoYXJnKSAmJiB+KGluZGV4ID0gYXJnLmluZGV4T2YoJz0nKSkpIHtcbiAgICAgIHJldC5wdXNoKGFyZy5zbGljZSgwLCBpbmRleCksIGFyZy5zbGljZShpbmRleCArIDEpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0LnB1c2goYXJnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBQYXJzZSBjb21tYW5kIGBhcmdzYC5cbiAqXG4gKiBXaGVuIGxpc3RlbmVyKHMpIGFyZSBhdmFpbGFibGUgdGhvc2VcbiAqIGNhbGxiYWNrcyBhcmUgaW52b2tlZCwgb3RoZXJ3aXNlIHRoZSBcIipcIlxuICogZXZlbnQgaXMgZW1pdHRlZCBhbmQgdGhvc2UgYWN0aW9ucyBhcmUgaW52b2tlZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcmV0dXJuIHtDb21tYW5kfSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnBhcnNlQXJncyA9IGZ1bmN0aW9uKGFyZ3MsIHVua25vd24pIHtcbiAgdmFyIG5hbWU7XG5cbiAgaWYgKGFyZ3MubGVuZ3RoKSB7XG4gICAgbmFtZSA9IGFyZ3NbMF07XG4gICAgaWYgKHRoaXMubGlzdGVuZXJzKCdjb21tYW5kOicgKyBuYW1lKS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDonICsgYXJncy5zaGlmdCgpLCBhcmdzLCB1bmtub3duKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0KCdjb21tYW5kOionLCBhcmdzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0SGVscElmTmVjZXNzYXJ5KHRoaXMsIHVua25vd24pO1xuXG4gICAgLy8gSWYgdGhlcmUgd2VyZSBubyBhcmdzIGFuZCB3ZSBoYXZlIHVua25vd24gb3B0aW9ucyxcbiAgICAvLyB0aGVuIHRoZXkgYXJlIGV4dHJhbmVvdXMgYW5kIHdlIG5lZWQgdG8gZXJyb3IuXG4gICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51bmtub3duT3B0aW9uKHVua25vd25bMF0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgdGhpcy5fYXJncy5maWx0ZXIoZnVuY3Rpb24oYSkgeyByZXR1cm4gYS5yZXF1aXJlZDsgfSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6KicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gb3B0aW9uIG1hdGNoaW5nIGBhcmdgIGlmIGFueS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYXJnXG4gKiBAcmV0dXJuIHtPcHRpb259XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5vcHRpb25Gb3IgPSBmdW5jdGlvbihhcmcpIHtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICAgIGlmICh0aGlzLm9wdGlvbnNbaV0uaXMoYXJnKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9uc1tpXTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUGFyc2Ugb3B0aW9ucyBmcm9tIGBhcmd2YCByZXR1cm5pbmcgYGFyZ3ZgXG4gKiB2b2lkIG9mIHRoZXNlIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJndlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uKGFyZ3YpIHtcbiAgdmFyIGFyZ3MgPSBbXSxcbiAgICBsZW4gPSBhcmd2Lmxlbmd0aCxcbiAgICBsaXRlcmFsLFxuICAgIG9wdGlvbixcbiAgICBhcmc7XG5cbiAgdmFyIHVua25vd25PcHRpb25zID0gW107XG5cbiAgLy8gcGFyc2Ugb3B0aW9uc1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgYXJnID0gYXJndltpXTtcblxuICAgIC8vIGxpdGVyYWwgYXJncyBhZnRlciAtLVxuICAgIGlmIChsaXRlcmFsKSB7XG4gICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChhcmcgPT09ICctLScpIHtcbiAgICAgIGxpdGVyYWwgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gZmluZCBtYXRjaGluZyBPcHRpb25cbiAgICBvcHRpb24gPSB0aGlzLm9wdGlvbkZvcihhcmcpO1xuXG4gICAgLy8gb3B0aW9uIGlzIGRlZmluZWRcbiAgICBpZiAob3B0aW9uKSB7XG4gICAgICAvLyByZXF1aXJlcyBhcmdcbiAgICAgIGlmIChvcHRpb24ucmVxdWlyZWQpIHtcbiAgICAgICAgYXJnID0gYXJndlsrK2ldO1xuICAgICAgICBpZiAoYXJnID09IG51bGwpIHJldHVybiB0aGlzLm9wdGlvbk1pc3NpbmdBcmd1bWVudChvcHRpb24pO1xuICAgICAgICB0aGlzLmVtaXQoJ29wdGlvbjonICsgb3B0aW9uLm5hbWUoKSwgYXJnKTtcbiAgICAgIC8vIG9wdGlvbmFsIGFyZ1xuICAgICAgfSBlbHNlIGlmIChvcHRpb24ub3B0aW9uYWwpIHtcbiAgICAgICAgYXJnID0gYXJndltpICsgMV07XG4gICAgICAgIGlmIChhcmcgPT0gbnVsbCB8fCAoYXJnWzBdID09PSAnLScgJiYgYXJnICE9PSAnLScpKSB7XG4gICAgICAgICAgYXJnID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICArK2k7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdvcHRpb246JyArIG9wdGlvbi5uYW1lKCksIGFyZyk7XG4gICAgICAvLyBib29sXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXQoJ29wdGlvbjonICsgb3B0aW9uLm5hbWUoKSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBsb29rcyBsaWtlIGFuIG9wdGlvblxuICAgIGlmIChhcmcubGVuZ3RoID4gMSAmJiBhcmdbMF0gPT09ICctJykge1xuICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChhcmcpO1xuXG4gICAgICAvLyBJZiB0aGUgbmV4dCBhcmd1bWVudCBsb29rcyBsaWtlIGl0IG1pZ2h0IGJlXG4gICAgICAvLyBhbiBhcmd1bWVudCBmb3IgdGhpcyBvcHRpb24sIHdlIHBhc3MgaXQgb24uXG4gICAgICAvLyBJZiBpdCBpc24ndCwgdGhlbiBpdCdsbCBzaW1wbHkgYmUgaWdub3JlZFxuICAgICAgaWYgKChpICsgMSkgPCBhcmd2Lmxlbmd0aCAmJiBhcmd2W2kgKyAxXVswXSAhPT0gJy0nKSB7XG4gICAgICAgIHVua25vd25PcHRpb25zLnB1c2goYXJndlsrK2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGFyZ1xuICAgIGFyZ3MucHVzaChhcmcpO1xuICB9XG5cbiAgcmV0dXJuIHsgYXJnczogYXJncywgdW5rbm93bjogdW5rbm93bk9wdGlvbnMgfTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIG9wdGlvbnMgYXMga2V5LXZhbHVlIHBhaXJzXG4gKlxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGFwaSBwdWJsaWNcbiAqL1xuQ29tbWFuZC5wcm90b3R5cGUub3B0cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzdWx0ID0ge30sXG4gICAgbGVuID0gdGhpcy5vcHRpb25zLmxlbmd0aDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgdmFyIGtleSA9IHRoaXMub3B0aW9uc1tpXS5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgcmVzdWx0W2tleV0gPSBrZXkgPT09IHRoaXMuX3ZlcnNpb25PcHRpb25OYW1lID8gdGhpcy5fdmVyc2lvbiA6IHRoaXNba2V5XTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBBcmd1bWVudCBgbmFtZWAgaXMgbWlzc2luZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUubWlzc2luZ0FyZ3VtZW50ID0gZnVuY3Rpb24obmFtZSkge1xuICBjb25zb2xlLmVycm9yKFwiZXJyb3I6IG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgYCVzJ1wiLCBuYW1lKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufTtcblxuLyoqXG4gKiBgT3B0aW9uYCBpcyBtaXNzaW5nIGFuIGFyZ3VtZW50LCBidXQgcmVjZWl2ZWQgYGZsYWdgIG9yIG5vdGhpbmcuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG9wdGlvblxuICogQHBhcmFtIHtTdHJpbmd9IGZsYWdcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLm9wdGlvbk1pc3NpbmdBcmd1bWVudCA9IGZ1bmN0aW9uKG9wdGlvbiwgZmxhZykge1xuICBpZiAoZmxhZykge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogb3B0aW9uIGAlcycgYXJndW1lbnQgbWlzc2luZywgZ290IGAlcydcIiwgb3B0aW9uLmZsYWdzLCBmbGFnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmVycm9yKFwiZXJyb3I6IG9wdGlvbiBgJXMnIGFyZ3VtZW50IG1pc3NpbmdcIiwgb3B0aW9uLmZsYWdzKTtcbiAgfVxuICBwcm9jZXNzLmV4aXQoMSk7XG59O1xuXG4vKipcbiAqIFVua25vd24gb3B0aW9uIGBmbGFnYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmxhZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUudW5rbm93bk9wdGlvbiA9IGZ1bmN0aW9uKGZsYWcpIHtcbiAgaWYgKHRoaXMuX2FsbG93VW5rbm93bk9wdGlvbikgcmV0dXJuO1xuICBjb25zb2xlLmVycm9yKFwiZXJyb3I6IHVua25vd24gb3B0aW9uIGAlcydcIiwgZmxhZyk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn07XG5cbi8qKlxuICogVmFyaWFkaWMgYXJndW1lbnQgd2l0aCBgbmFtZWAgaXMgbm90IHRoZSBsYXN0IGFyZ3VtZW50IGFzIHJlcXVpcmVkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS52YXJpYWRpY0FyZ05vdExhc3QgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogdmFyaWFkaWMgYXJndW1lbnRzIG11c3QgYmUgbGFzdCBgJXMnXCIsIG5hbWUpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgcHJvZ3JhbSB2ZXJzaW9uIHRvIGBzdHJgLlxuICpcbiAqIFRoaXMgbWV0aG9kIGF1dG8tcmVnaXN0ZXJzIHRoZSBcIi1WLCAtLXZlcnNpb25cIiBmbGFnXG4gKiB3aGljaCB3aWxsIHByaW50IHRoZSB2ZXJzaW9uIG51bWJlciB3aGVuIHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ZsYWdzXVxuICogQHJldHVybiB7Q29tbWFuZH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnZlcnNpb24gPSBmdW5jdGlvbihzdHIsIGZsYWdzKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgdGhpcy5fdmVyc2lvbiA9IHN0cjtcbiAgZmxhZ3MgPSBmbGFncyB8fCAnLVYsIC0tdmVyc2lvbic7XG4gIHZhciB2ZXJzaW9uT3B0aW9uID0gbmV3IE9wdGlvbihmbGFncywgJ291dHB1dCB0aGUgdmVyc2lvbiBudW1iZXInKTtcbiAgdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPSB2ZXJzaW9uT3B0aW9uLmxvbmcuc3Vic3RyKDIpIHx8ICd2ZXJzaW9uJztcbiAgdGhpcy5vcHRpb25zLnB1c2godmVyc2lvbk9wdGlvbik7XG4gIHRoaXMub24oJ29wdGlvbjonICsgdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUsIGZ1bmN0aW9uKCkge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHN0ciArICdcXG4nKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBkZXNjcmlwdGlvbiB0byBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnc0Rlc2NyaXB0aW9uXG4gKiBAcmV0dXJuIHtTdHJpbmd8Q29tbWFuZH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuZGVzY3JpcHRpb24gPSBmdW5jdGlvbihzdHIsIGFyZ3NEZXNjcmlwdGlvbikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB0aGlzLl9kZXNjcmlwdGlvbiA9IHN0cjtcbiAgdGhpcy5fYXJnc0Rlc2NyaXB0aW9uID0gYXJnc0Rlc2NyaXB0aW9uO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IGFuIGFsaWFzIGZvciB0aGUgY29tbWFuZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhbGlhc1xuICogQHJldHVybiB7U3RyaW5nfENvbW1hbmR9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmFsaWFzID0gZnVuY3Rpb24oYWxpYXMpIHtcbiAgdmFyIGNvbW1hbmQgPSB0aGlzO1xuICBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGggIT09IDApIHtcbiAgICBjb21tYW5kID0gdGhpcy5jb21tYW5kc1t0aGlzLmNvbW1hbmRzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiBjb21tYW5kLl9hbGlhcztcblxuICBpZiAoYWxpYXMgPT09IGNvbW1hbmQuX25hbWUpIHRocm93IG5ldyBFcnJvcignQ29tbWFuZCBhbGlhcyBjYW5cXCd0IGJlIHRoZSBzYW1lIGFzIGl0cyBuYW1lJyk7XG5cbiAgY29tbWFuZC5fYWxpYXMgPSBhbGlhcztcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCAvIGdldCB0aGUgY29tbWFuZCB1c2FnZSBgc3RyYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd8Q29tbWFuZH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUudXNhZ2UgPSBmdW5jdGlvbihzdHIpIHtcbiAgdmFyIGFyZ3MgPSB0aGlzLl9hcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICByZXR1cm4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKTtcbiAgfSk7XG5cbiAgdmFyIHVzYWdlID0gJ1tvcHRpb25zXScgK1xuICAgICh0aGlzLmNvbW1hbmRzLmxlbmd0aCA/ICcgW2NvbW1hbmRdJyA6ICcnKSArXG4gICAgKHRoaXMuX2FyZ3MubGVuZ3RoID8gJyAnICsgYXJncy5qb2luKCcgJykgOiAnJyk7XG5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLl91c2FnZSB8fCB1c2FnZTtcbiAgdGhpcy5fdXNhZ2UgPSBzdHI7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEdldCBvciBzZXQgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtTdHJpbmd8Q29tbWFuZH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uKHN0cikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuX25hbWU7XG4gIHRoaXMuX25hbWUgPSBzdHI7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gcHJlcGFyZWQgY29tbWFuZHMuXG4gKlxuICogQHJldHVybiB7QXJyYXl9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5wcmVwYXJlQ29tbWFuZHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY29tbWFuZHMuZmlsdGVyKGZ1bmN0aW9uKGNtZCkge1xuICAgIHJldHVybiAhY21kLl9ub0hlbHA7XG4gIH0pLm1hcChmdW5jdGlvbihjbWQpIHtcbiAgICB2YXIgYXJncyA9IGNtZC5fYXJncy5tYXAoZnVuY3Rpb24oYXJnKSB7XG4gICAgICByZXR1cm4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKTtcbiAgICB9KS5qb2luKCcgJyk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgY21kLl9uYW1lICtcbiAgICAgICAgKGNtZC5fYWxpYXMgPyAnfCcgKyBjbWQuX2FsaWFzIDogJycpICtcbiAgICAgICAgKGNtZC5vcHRpb25zLmxlbmd0aCA/ICcgW29wdGlvbnNdJyA6ICcnKSArXG4gICAgICAgIChhcmdzID8gJyAnICsgYXJncyA6ICcnKSxcbiAgICAgIGNtZC5fZGVzY3JpcHRpb25cbiAgICBdO1xuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsYXJnZXN0IGNvbW1hbmQgbGVuZ3RoLlxuICpcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmxhcmdlc3RDb21tYW5kTGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gIHZhciBjb21tYW5kcyA9IHRoaXMucHJlcGFyZUNvbW1hbmRzKCk7XG4gIHJldHVybiBjb21tYW5kcy5yZWR1Y2UoZnVuY3Rpb24obWF4LCBjb21tYW5kKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1heCwgY29tbWFuZFswXS5sZW5ndGgpO1xuICB9LCAwKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsYXJnZXN0IG9wdGlvbiBsZW5ndGguXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUubGFyZ2VzdE9wdGlvbkxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgb3B0aW9ucyA9IFtdLnNsaWNlLmNhbGwodGhpcy5vcHRpb25zKTtcbiAgb3B0aW9ucy5wdXNoKHtcbiAgICBmbGFnczogJy1oLCAtLWhlbHAnXG4gIH0pO1xuICByZXR1cm4gb3B0aW9ucy5yZWR1Y2UoZnVuY3Rpb24obWF4LCBvcHRpb24pIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBvcHRpb24uZmxhZ3MubGVuZ3RoKTtcbiAgfSwgMCk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbGFyZ2VzdCBhcmcgbGVuZ3RoLlxuICpcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmxhcmdlc3RBcmdMZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2FyZ3MucmVkdWNlKGZ1bmN0aW9uKG1heCwgYXJnKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KG1heCwgYXJnLm5hbWUubGVuZ3RoKTtcbiAgfSwgMCk7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgcGFkIHdpZHRoLlxuICpcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnBhZFdpZHRoID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3aWR0aCA9IHRoaXMubGFyZ2VzdE9wdGlvbkxlbmd0aCgpO1xuICBpZiAodGhpcy5fYXJnc0Rlc2NyaXB0aW9uICYmIHRoaXMuX2FyZ3MubGVuZ3RoKSB7XG4gICAgaWYgKHRoaXMubGFyZ2VzdEFyZ0xlbmd0aCgpID4gd2lkdGgpIHtcbiAgICAgIHdpZHRoID0gdGhpcy5sYXJnZXN0QXJnTGVuZ3RoKCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRoaXMuY29tbWFuZHMgJiYgdGhpcy5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICBpZiAodGhpcy5sYXJnZXN0Q29tbWFuZExlbmd0aCgpID4gd2lkdGgpIHtcbiAgICAgIHdpZHRoID0gdGhpcy5sYXJnZXN0Q29tbWFuZExlbmd0aCgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3aWR0aDtcbn07XG5cbi8qKlxuICogUmV0dXJuIGhlbHAgZm9yIG9wdGlvbnMuXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUub3B0aW9uSGVscCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd2lkdGggPSB0aGlzLnBhZFdpZHRoKCk7XG5cbiAgLy8gQXBwZW5kIHRoZSBoZWxwIGluZm9ybWF0aW9uXG4gIHJldHVybiB0aGlzLm9wdGlvbnMubWFwKGZ1bmN0aW9uKG9wdGlvbikge1xuICAgIHJldHVybiBwYWQob3B0aW9uLmZsYWdzLCB3aWR0aCkgKyAnICAnICsgb3B0aW9uLmRlc2NyaXB0aW9uICtcbiAgICAgICgob3B0aW9uLmJvb2wgJiYgb3B0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSA/ICcgKGRlZmF1bHQ6ICcgKyBKU09OLnN0cmluZ2lmeShvcHRpb24uZGVmYXVsdFZhbHVlKSArICcpJyA6ICcnKTtcbiAgfSkuY29uY2F0KFtwYWQoJy1oLCAtLWhlbHAnLCB3aWR0aCkgKyAnICAnICsgJ291dHB1dCB1c2FnZSBpbmZvcm1hdGlvbiddKVxuICAgIC5qb2luKCdcXG4nKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIGNvbW1hbmQgaGVscCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmNvbW1hbmRIZWxwID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5jb21tYW5kcy5sZW5ndGgpIHJldHVybiAnJztcblxuICB2YXIgY29tbWFuZHMgPSB0aGlzLnByZXBhcmVDb21tYW5kcygpO1xuICB2YXIgd2lkdGggPSB0aGlzLnBhZFdpZHRoKCk7XG5cbiAgcmV0dXJuIFtcbiAgICAnQ29tbWFuZHM6JyxcbiAgICBjb21tYW5kcy5tYXAoZnVuY3Rpb24oY21kKSB7XG4gICAgICB2YXIgZGVzYyA9IGNtZFsxXSA/ICcgICcgKyBjbWRbMV0gOiAnJztcbiAgICAgIHJldHVybiAoZGVzYyA/IHBhZChjbWRbMF0sIHdpZHRoKSA6IGNtZFswXSkgKyBkZXNjO1xuICAgIH0pLmpvaW4oJ1xcbicpLnJlcGxhY2UoL14vZ20sICcgICcpLFxuICAgICcnXG4gIF0uam9pbignXFxuJyk7XG59O1xuXG4vKipcbiAqIFJldHVybiBwcm9ncmFtIGhlbHAgZG9jdW1lbnRhdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5oZWxwSW5mb3JtYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIGRlc2MgPSBbXTtcbiAgaWYgKHRoaXMuX2Rlc2NyaXB0aW9uKSB7XG4gICAgZGVzYyA9IFtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uLFxuICAgICAgJydcbiAgICBdO1xuXG4gICAgdmFyIGFyZ3NEZXNjcmlwdGlvbiA9IHRoaXMuX2FyZ3NEZXNjcmlwdGlvbjtcbiAgICBpZiAoYXJnc0Rlc2NyaXB0aW9uICYmIHRoaXMuX2FyZ3MubGVuZ3RoKSB7XG4gICAgICB2YXIgd2lkdGggPSB0aGlzLnBhZFdpZHRoKCk7XG4gICAgICBkZXNjLnB1c2goJ0FyZ3VtZW50czonKTtcbiAgICAgIGRlc2MucHVzaCgnJyk7XG4gICAgICB0aGlzLl9hcmdzLmZvckVhY2goZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIGRlc2MucHVzaCgnICAnICsgcGFkKGFyZy5uYW1lLCB3aWR0aCkgKyAnICAnICsgYXJnc0Rlc2NyaXB0aW9uW2FyZy5uYW1lXSk7XG4gICAgICB9KTtcbiAgICAgIGRlc2MucHVzaCgnJyk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNtZE5hbWUgPSB0aGlzLl9uYW1lO1xuICBpZiAodGhpcy5fYWxpYXMpIHtcbiAgICBjbWROYW1lID0gY21kTmFtZSArICd8JyArIHRoaXMuX2FsaWFzO1xuICB9XG4gIHZhciB1c2FnZSA9IFtcbiAgICAnVXNhZ2U6ICcgKyBjbWROYW1lICsgJyAnICsgdGhpcy51c2FnZSgpLFxuICAgICcnXG4gIF07XG5cbiAgdmFyIGNtZHMgPSBbXTtcbiAgdmFyIGNvbW1hbmRIZWxwID0gdGhpcy5jb21tYW5kSGVscCgpO1xuICBpZiAoY29tbWFuZEhlbHApIGNtZHMgPSBbY29tbWFuZEhlbHBdO1xuXG4gIHZhciBvcHRpb25zID0gW1xuICAgICdPcHRpb25zOicsXG4gICAgJycgKyB0aGlzLm9wdGlvbkhlbHAoKS5yZXBsYWNlKC9eL2dtLCAnICAnKSxcbiAgICAnJ1xuICBdO1xuXG4gIHJldHVybiB1c2FnZVxuICAgIC5jb25jYXQoZGVzYylcbiAgICAuY29uY2F0KG9wdGlvbnMpXG4gICAgLmNvbmNhdChjbWRzKVxuICAgIC5qb2luKCdcXG4nKTtcbn07XG5cbi8qKlxuICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoaXMgY29tbWFuZFxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUub3V0cHV0SGVscCA9IGZ1bmN0aW9uKGNiKSB7XG4gIGlmICghY2IpIHtcbiAgICBjYiA9IGZ1bmN0aW9uKHBhc3N0aHJ1KSB7XG4gICAgICByZXR1cm4gcGFzc3RocnU7XG4gICAgfTtcbiAgfVxuICBwcm9jZXNzLnN0ZG91dC53cml0ZShjYih0aGlzLmhlbHBJbmZvcm1hdGlvbigpKSk7XG4gIHRoaXMuZW1pdCgnLS1oZWxwJyk7XG59O1xuXG4vKipcbiAqIE91dHB1dCBoZWxwIGluZm9ybWF0aW9uIGFuZCBleGl0LlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuaGVscCA9IGZ1bmN0aW9uKGNiKSB7XG4gIHRoaXMub3V0cHV0SGVscChjYik7XG4gIHByb2Nlc3MuZXhpdCgpO1xufTtcblxuLyoqXG4gKiBDYW1lbC1jYXNlIHRoZSBnaXZlbiBgZmxhZ2BcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmxhZ1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gY2FtZWxjYXNlKGZsYWcpIHtcbiAgcmV0dXJuIGZsYWcuc3BsaXQoJy0nKS5yZWR1Y2UoZnVuY3Rpb24oc3RyLCB3b3JkKSB7XG4gICAgcmV0dXJuIHN0ciArIHdvcmRbMF0udG9VcHBlckNhc2UoKSArIHdvcmQuc2xpY2UoMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhZCBgc3RyYCB0byBgd2lkdGhgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFkKHN0ciwgd2lkdGgpIHtcbiAgdmFyIGxlbiA9IE1hdGgubWF4KDAsIHdpZHRoIC0gc3RyLmxlbmd0aCk7XG4gIHJldHVybiBzdHIgKyBBcnJheShsZW4gKyAxKS5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gaWYgbmVjZXNzYXJ5XG4gKlxuICogQHBhcmFtIHtDb21tYW5kfSBjb21tYW5kIHRvIG91dHB1dCBoZWxwIGZvclxuICogQHBhcmFtIHtBcnJheX0gYXJyYXkgb2Ygb3B0aW9ucyB0byBzZWFyY2ggZm9yIC1oIG9yIC0taGVscFxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gb3V0cHV0SGVscElmTmVjZXNzYXJ5KGNtZCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCBbXTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG9wdGlvbnNbaV0gPT09ICctLWhlbHAnIHx8IG9wdGlvbnNbaV0gPT09ICctaCcpIHtcbiAgICAgIGNtZC5vdXRwdXRIZWxwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGFrZXMgYW4gYXJndW1lbnQgYW4gcmV0dXJucyBpdHMgaHVtYW4gcmVhZGFibGUgZXF1aXZhbGVudCBmb3IgaGVscCB1c2FnZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJnXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpIHtcbiAgdmFyIG5hbWVPdXRwdXQgPSBhcmcubmFtZSArIChhcmcudmFyaWFkaWMgPT09IHRydWUgPyAnLi4uJyA6ICcnKTtcblxuICByZXR1cm4gYXJnLnJlcXVpcmVkXG4gICAgPyAnPCcgKyBuYW1lT3V0cHV0ICsgJz4nXG4gICAgOiAnWycgKyBuYW1lT3V0cHV0ICsgJ10nO1xufVxuXG4vLyBmb3IgdmVyc2lvbnMgYmVmb3JlIG5vZGUgdjAuOCB3aGVuIHRoZXJlIHdlcmVuJ3QgYGZzLmV4aXN0c1N5bmNgXG5mdW5jdGlvbiBleGlzdHMoZmlsZSkge1xuICB0cnkge1xuICAgIGlmIChmcy5zdGF0U3luYyhmaWxlKS5pc0ZpbGUoKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuXHJcbi8qIGdsb2JhbCBnbG9iYWwsIGRlZmluZSwgU3lzdGVtLCBSZWZsZWN0LCBQcm9taXNlICovXHJcbnZhciBfX2V4dGVuZHM7XHJcbnZhciBfX2Fzc2lnbjtcclxudmFyIF9fcmVzdDtcclxudmFyIF9fZGVjb3JhdGU7XHJcbnZhciBfX3BhcmFtO1xyXG52YXIgX19tZXRhZGF0YTtcclxudmFyIF9fYXdhaXRlcjtcclxudmFyIF9fZ2VuZXJhdG9yO1xyXG52YXIgX19leHBvcnRTdGFyO1xyXG52YXIgX192YWx1ZXM7XHJcbnZhciBfX3JlYWQ7XHJcbnZhciBfX3NwcmVhZDtcclxudmFyIF9fc3ByZWFkQXJyYXlzO1xyXG52YXIgX19hd2FpdDtcclxudmFyIF9fYXN5bmNHZW5lcmF0b3I7XHJcbnZhciBfX2FzeW5jRGVsZWdhdG9yO1xyXG52YXIgX19hc3luY1ZhbHVlcztcclxudmFyIF9fbWFrZVRlbXBsYXRlT2JqZWN0O1xyXG52YXIgX19pbXBvcnRTdGFyO1xyXG52YXIgX19pbXBvcnREZWZhdWx0O1xyXG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZEdldDtcclxudmFyIF9fY2xhc3NQcml2YXRlRmllbGRTZXQ7XHJcbnZhciBfX2NyZWF0ZUJpbmRpbmc7XHJcbihmdW5jdGlvbiAoZmFjdG9yeSkge1xyXG4gICAgdmFyIHJvb3QgPSB0eXBlb2YgZ2xvYmFsID09PSBcIm9iamVjdFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDogdHlwZW9mIHRoaXMgPT09IFwib2JqZWN0XCIgPyB0aGlzIDoge307XHJcbiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcclxuICAgICAgICBkZWZpbmUoXCJ0c2xpYlwiLCBbXCJleHBvcnRzXCJdLCBmdW5jdGlvbiAoZXhwb3J0cykgeyBmYWN0b3J5KGNyZWF0ZUV4cG9ydGVyKHJvb3QsIGNyZWF0ZUV4cG9ydGVyKGV4cG9ydHMpKSk7IH0pO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICBmYWN0b3J5KGNyZWF0ZUV4cG9ydGVyKHJvb3QsIGNyZWF0ZUV4cG9ydGVyKG1vZHVsZS5leHBvcnRzKSkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgICAgZmFjdG9yeShjcmVhdGVFeHBvcnRlcihyb290KSk7XHJcbiAgICB9XHJcbiAgICBmdW5jdGlvbiBjcmVhdGVFeHBvcnRlcihleHBvcnRzLCBwcmV2aW91cykge1xyXG4gICAgICAgIGlmIChleHBvcnRzICE9PSByb290KSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBleHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoaWQsIHYpIHsgcmV0dXJuIGV4cG9ydHNbaWRdID0gcHJldmlvdXMgPyBwcmV2aW91cyhpZCwgdikgOiB2OyB9O1xyXG4gICAgfVxyXG59KVxyXG4oZnVuY3Rpb24gKGV4cG9ydGVyKSB7XHJcbiAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTtcclxuXHJcbiAgICBfX2V4dGVuZHMgPSBmdW5jdGlvbiAoZCwgYikge1xyXG4gICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XHJcbiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcmVzdCA9IGZ1bmN0aW9uIChzLCBlKSB7XHJcbiAgICAgICAgdmFyIHQgPSB7fTtcclxuICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICAgICAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKVxyXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICAgICAgdFtwW2ldXSA9IHNbcFtpXV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH07XHJcblxyXG4gICAgX19kZWNvcmF0ZSA9IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcclxuICAgICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcGFyYW0gPSBmdW5jdGlvbiAocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fbWV0YWRhdGEgPSBmdW5jdGlvbiAobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QubWV0YWRhdGEgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2F3YWl0ZXIgPSBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICAgICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgX19nZW5lcmF0b3IgPSBmdW5jdGlvbiAodGhpc0FyZywgYm9keSkge1xyXG4gICAgICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGc7XHJcbiAgICAgICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksIFwidGhyb3dcIjogdmVyYigxKSwgXCJyZXR1cm5cIjogdmVyYigyKSB9LCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7XHJcbiAgICAgICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChvcCkge1xyXG4gICAgICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XHJcbiAgICAgICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0gb3BbMF0gJiAyID8geVtcInJldHVyblwiXSA6IG9wWzBdID8geVtcInRocm93XCJdIHx8ICgodCA9IHlbXCJyZXR1cm5cIl0pICYmIHQuY2FsbCh5KSwgMCkgOiB5Lm5leHQpICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0O1xyXG4gICAgICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDogY2FzZSAxOiB0ID0gb3A7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNzogb3AgPSBfLm9wcy5wb3AoKTsgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSAzICYmICghdCB8fCAob3BbMV0gPiB0WzBdICYmIG9wWzFdIDwgdFszXSkpKSB7IF8ubGFiZWwgPSBvcFsxXTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRbMl0pIF8ub3BzLnBvcCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgb3AgPSBib2R5LmNhbGwodGhpc0FyZywgXyk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmcgPSBmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICAgICAgb1trMl0gPSBtW2tdO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2V4cG9ydFN0YXIgPSBmdW5jdGlvbiAobSwgZXhwb3J0cykge1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTtcclxuICAgIH07XHJcblxyXG4gICAgX192YWx1ZXMgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XHJcbiAgICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xyXG4gICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fcmVhZCA9IGZ1bmN0aW9uIChvLCBuKSB7XHJcbiAgICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xyXG4gICAgICAgIGlmICghbSkgcmV0dXJuIG87XHJcbiAgICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxyXG4gICAgICAgIGZpbmFsbHkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgX19zcHJlYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgIGFyID0gYXIuY29uY2F0KF9fcmVhZChhcmd1bWVudHNbaV0pKTtcclxuICAgICAgICByZXR1cm4gYXI7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fc3ByZWFkQXJyYXlzID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGZvciAodmFyIHMgPSAwLCBpID0gMCwgaWwgPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgaWw7IGkrKykgcyArPSBhcmd1bWVudHNbaV0ubGVuZ3RoO1xyXG4gICAgICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICAgICAgZm9yICh2YXIgYSA9IGFyZ3VtZW50c1tpXSwgaiA9IDAsIGpsID0gYS5sZW5ndGg7IGogPCBqbDsgaisrLCBrKyspXHJcbiAgICAgICAgICAgICAgICByW2tdID0gYVtqXTtcclxuICAgICAgICByZXR1cm4gcjtcclxuICAgIH07XHJcblxyXG4gICAgX19hd2FpdCA9IGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNHZW5lcmF0b3IgPSBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7XHJcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICAgICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyAgfVxyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKFwidGhyb3dcIiwgdmFsdWUpOyB9XHJcbiAgICAgICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICB2YXIgaSwgcDtcclxuICAgICAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobiwgZikgeyBpW25dID0gb1tuXSA/IGZ1bmN0aW9uICh2KSB7IHJldHVybiAocCA9ICFwKSA/IHsgdmFsdWU6IF9fYXdhaXQob1tuXSh2KSksIGRvbmU6IG4gPT09IFwicmV0dXJuXCIgfSA6IGYgPyBmKHYpIDogdjsgfSA6IGY7IH1cclxuICAgIH07XHJcblxyXG4gICAgX19hc3luY1ZhbHVlcyA9IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9XHJcbiAgICAgICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX21ha2VUZW1wbGF0ZU9iamVjdCA9IGZ1bmN0aW9uIChjb29rZWQsIHJhdykge1xyXG4gICAgICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICAgICAgcmV0dXJuIGNvb2tlZDtcclxuICAgIH07XHJcblxyXG4gICAgX19pbXBvcnRTdGFyID0gZnVuY3Rpb24gKG1vZCkge1xyXG4gICAgICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSByZXN1bHRba10gPSBtb2Rba107XHJcbiAgICAgICAgcmVzdWx0W1wiZGVmYXVsdFwiXSA9IG1vZDtcclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2ltcG9ydERlZmF1bHQgPSBmdW5jdGlvbiAobW9kKSB7XHJcbiAgICAgICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XHJcbiAgICB9O1xyXG5cclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRHZXQgPSBmdW5jdGlvbiAocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcclxuICAgICAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHByaXZhdGVNYXAuZ2V0KHJlY2VpdmVyKTtcclxuICAgIH07XHJcblxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldCA9IGZ1bmN0aW9uIChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcclxuICAgICAgICBpZiAoIXByaXZhdGVNYXAuaGFzKHJlY2VpdmVyKSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJpdmF0ZU1hcC5zZXQocmVjZWl2ZXIsIHZhbHVlKTtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9O1xyXG5cclxuICAgIGV4cG9ydGVyKFwiX19leHRlbmRzXCIsIF9fZXh0ZW5kcyk7XHJcbiAgICBleHBvcnRlcihcIl9fYXNzaWduXCIsIF9fYXNzaWduKTtcclxuICAgIGV4cG9ydGVyKFwiX19yZXN0XCIsIF9fcmVzdCk7XHJcbiAgICBleHBvcnRlcihcIl9fZGVjb3JhdGVcIiwgX19kZWNvcmF0ZSk7XHJcbiAgICBleHBvcnRlcihcIl9fcGFyYW1cIiwgX19wYXJhbSk7XHJcbiAgICBleHBvcnRlcihcIl9fbWV0YWRhdGFcIiwgX19tZXRhZGF0YSk7XHJcbiAgICBleHBvcnRlcihcIl9fYXdhaXRlclwiLCBfX2F3YWl0ZXIpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2dlbmVyYXRvclwiLCBfX2dlbmVyYXRvcik7XHJcbiAgICBleHBvcnRlcihcIl9fZXhwb3J0U3RhclwiLCBfX2V4cG9ydFN0YXIpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2NyZWF0ZUJpbmRpbmdcIiwgX19jcmVhdGVCaW5kaW5nKTtcclxuICAgIGV4cG9ydGVyKFwiX192YWx1ZXNcIiwgX192YWx1ZXMpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3JlYWRcIiwgX19yZWFkKTtcclxuICAgIGV4cG9ydGVyKFwiX19zcHJlYWRcIiwgX19zcHJlYWQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3NwcmVhZEFycmF5c1wiLCBfX3NwcmVhZEFycmF5cyk7XHJcbiAgICBleHBvcnRlcihcIl9fYXdhaXRcIiwgX19hd2FpdCk7XHJcbiAgICBleHBvcnRlcihcIl9fYXN5bmNHZW5lcmF0b3JcIiwgX19hc3luY0dlbmVyYXRvcik7XHJcbiAgICBleHBvcnRlcihcIl9fYXN5bmNEZWxlZ2F0b3JcIiwgX19hc3luY0RlbGVnYXRvcik7XHJcbiAgICBleHBvcnRlcihcIl9fYXN5bmNWYWx1ZXNcIiwgX19hc3luY1ZhbHVlcyk7XHJcbiAgICBleHBvcnRlcihcIl9fbWFrZVRlbXBsYXRlT2JqZWN0XCIsIF9fbWFrZVRlbXBsYXRlT2JqZWN0KTtcclxuICAgIGV4cG9ydGVyKFwiX19pbXBvcnRTdGFyXCIsIF9faW1wb3J0U3Rhcik7XHJcbiAgICBleHBvcnRlcihcIl9faW1wb3J0RGVmYXVsdFwiLCBfX2ltcG9ydERlZmF1bHQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0XCIsIF9fY2xhc3NQcml2YXRlRmllbGRHZXQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0XCIsIF9fY2xhc3NQcml2YXRlRmllbGRTZXQpO1xyXG59KTtcclxuIiwgIi8qKiBDb25zb2xlIGxvZ2dpbmcgdmVyYm9zaXR5IGZvciB0aGUgU0RLLiAqL1xuZXhwb3J0IGVudW0gTG9nTGV2ZWwge1xuICAvKiogTm8gbG9ncyB3aWxsIGJlIGdlbmVyYXRlZC4gKi9cbiAgTm9uZSA9IDAsXG4gIC8qKiBPbmx5IFNESyBpbnRlcm5hbCBlcnJvcnMgd2lsbCBiZSBsb2dnZWQuICovXG4gIEVycm9yID0gMSxcbiAgLyoqIEluZm9ybWF0aW9uIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHRoZSBTREsgd2lsbCBiZSBsb2dnZWQuICovXG4gIERlYnVnID0gMixcbiAgLyoqIEFsbCBTREsgYWN0aW9ucyB3aWxsIGJlIGxvZ2dlZC4gKi9cbiAgVmVyYm9zZSA9IDMsXG59XG4iLCAiaW1wb3J0IHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5cbi8qKlxuICogQGluaGVyaXRkb2NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uIGV4dGVuZHMgU2Vzc2lvbkNvbnRleHQge1xuICAvKiogSlNEb2MgKi9cbiAgdXBkYXRlKGNvbnRleHQ/OiBTZXNzaW9uQ29udGV4dCk6IHZvaWQ7XG5cbiAgLyoqIEpTRG9jICovXG4gIGNsb3NlKHN0YXR1cz86IFNlc3Npb25TdGF0dXMpOiB2b2lkO1xuXG4gIC8qKiBKU0RvYyAqL1xuICB0b0pTT04oKToge1xuICAgIGluaXQ6IGJvb2xlYW47XG4gICAgc2lkOiBzdHJpbmc7XG4gICAgZGlkPzogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIHN0YXJ0ZWQ6IHN0cmluZztcbiAgICBkdXJhdGlvbj86IG51bWJlcjtcbiAgICBzdGF0dXM6IFNlc3Npb25TdGF0dXM7XG4gICAgZXJyb3JzOiBudW1iZXI7XG4gICAgYXR0cnM/OiB7XG4gICAgICByZWxlYXNlPzogc3RyaW5nO1xuICAgICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgICB1c2VyX2FnZW50Pzogc3RyaW5nO1xuICAgICAgaXBfYWRkcmVzcz86IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RTZXNzaW9uIHtcbiAgc3RhdHVzPzogUmVxdWVzdFNlc3Npb25TdGF0dXM7XG59XG5cbi8qKlxuICogU2Vzc2lvbiBDb250ZXh0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkNvbnRleHQge1xuICBzaWQ/OiBzdHJpbmc7XG4gIGRpZD86IHN0cmluZztcbiAgaW5pdD86IGJvb2xlYW47XG4gIC8vIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2hcbiAgdGltZXN0YW1wPzogbnVtYmVyO1xuICAvLyBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoXG4gIHN0YXJ0ZWQ/OiBudW1iZXI7XG4gIGR1cmF0aW9uPzogbnVtYmVyO1xuICBzdGF0dXM/OiBTZXNzaW9uU3RhdHVzO1xuICByZWxlYXNlPzogc3RyaW5nO1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICBpcEFkZHJlc3M/OiBzdHJpbmc7XG4gIGVycm9ycz86IG51bWJlcjtcbiAgdXNlcj86IFVzZXIgfCBudWxsO1xuICBpZ25vcmVEdXJhdGlvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU2Vzc2lvbiBTdGF0dXNcbiAqL1xuZXhwb3J0IGVudW0gU2Vzc2lvblN0YXR1cyB7XG4gIC8qKiBKU0RvYyAqL1xuICBPayA9ICdvaycsXG4gIC8qKiBKU0RvYyAqL1xuICBFeGl0ZWQgPSAnZXhpdGVkJyxcbiAgLyoqIEpTRG9jICovXG4gIENyYXNoZWQgPSAnY3Jhc2hlZCcsXG4gIC8qKiBKU0RvYyAqL1xuICBBYm5vcm1hbCA9ICdhYm5vcm1hbCcsXG59XG5cbmV4cG9ydCBlbnVtIFJlcXVlc3RTZXNzaW9uU3RhdHVzIHtcbiAgLyoqIEpTRG9jICovXG4gIE9rID0gJ29rJyxcbiAgLyoqIEpTRG9jICovXG4gIEVycm9yZWQgPSAnZXJyb3JlZCcsXG4gIC8qKiBKU0RvYyAqL1xuICBDcmFzaGVkID0gJ2NyYXNoZWQnLFxufVxuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkFnZ3JlZ2F0ZXMge1xuICBhdHRycz86IHtcbiAgICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgICByZWxlYXNlPzogc3RyaW5nO1xuICB9O1xuICBhZ2dyZWdhdGVzOiBBcnJheTxBZ2dyZWdhdGlvbkNvdW50cz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkZsdXNoZXJMaWtlIHtcbiAgLyoqXG4gICAqIEluY3JlbWVudHMgdGhlIFNlc3Npb24gU3RhdHVzIGJ1Y2tldCBpbiBTZXNzaW9uQWdncmVnYXRlcyBPYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uXG4gICAqIGNhcHR1cmVkXG4gICAqL1xuICBpbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnQoKTogdm9pZDtcblxuICAvKiogU3VibWl0cyB0aGUgYWdncmVnYXRlcyByZXF1ZXN0IG1vZGUgc2Vzc2lvbnMgdG8gU2VudHJ5ICovXG4gIHNlbmRTZXNzaW9uQWdncmVnYXRlcyhzZXNzaW9uQWdncmVnYXRlczogU2Vzc2lvbkFnZ3JlZ2F0ZXMpOiB2b2lkO1xuXG4gIC8qKiBFbXB0aWVzIEFnZ3JlZ2F0ZSBCdWNrZXRzIGFuZCBTZW5kcyB0aGVtIHRvIFRyYW5zcG9ydCBCdWZmZXIgKi9cbiAgZmx1c2goKTogdm9pZDtcblxuICAvKiogQ2xlYXJzIHNldEludGVydmFsIGFuZCBjYWxscyBmbHVzaCAqL1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZ3JlZ2F0aW9uQ291bnRzIHtcbiAgc3RhcnRlZDogc3RyaW5nO1xuICBlcnJvcmVkPzogbnVtYmVyO1xuICBleGl0ZWQ/OiBudW1iZXI7XG4gIGNyYXNoZWQ/OiBudW1iZXI7XG59XG4iLCAiLyoqIEpTRG9jICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L2V4cG9ydFxuZXhwb3J0IGVudW0gU2V2ZXJpdHkge1xuICAvKiogSlNEb2MgKi9cbiAgRmF0YWwgPSAnZmF0YWwnLFxuICAvKiogSlNEb2MgKi9cbiAgRXJyb3IgPSAnZXJyb3InLFxuICAvKiogSlNEb2MgKi9cbiAgV2FybmluZyA9ICd3YXJuaW5nJyxcbiAgLyoqIEpTRG9jICovXG4gIExvZyA9ICdsb2cnLFxuICAvKiogSlNEb2MgKi9cbiAgSW5mbyA9ICdpbmZvJyxcbiAgLyoqIEpTRG9jICovXG4gIERlYnVnID0gJ2RlYnVnJyxcbiAgLyoqIEpTRG9jICovXG4gIENyaXRpY2FsID0gJ2NyaXRpY2FsJyxcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2UsIGltcG9ydC9leHBvcnRcbmV4cG9ydCBuYW1lc3BhY2UgU2V2ZXJpdHkge1xuICAvKipcbiAgICogQ29udmVydHMgYSBzdHJpbmctYmFzZWQgbGV2ZWwgaW50byBhIHtAbGluayBTZXZlcml0eX0uXG4gICAqXG4gICAqIEBwYXJhbSBsZXZlbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgU2V2ZXJpdHlcbiAgICogQHJldHVybnMgU2V2ZXJpdHlcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBmcm9tU3RyaW5nKGxldmVsOiBzdHJpbmcpOiBTZXZlcml0eSB7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnZGVidWcnOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuRGVidWc7XG4gICAgICBjYXNlICdpbmZvJzpcbiAgICAgICAgcmV0dXJuIFNldmVyaXR5LkluZm87XG4gICAgICBjYXNlICd3YXJuJzpcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuV2FybmluZztcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuIFNldmVyaXR5LkVycm9yO1xuICAgICAgY2FzZSAnZmF0YWwnOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuRmF0YWw7XG4gICAgICBjYXNlICdjcml0aWNhbCc6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5Dcml0aWNhbDtcbiAgICAgIGNhc2UgJ2xvZyc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuTG9nO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qKiBUaGUgc3RhdHVzIG9mIGFuIGV2ZW50LiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9leHBvcnRcbmV4cG9ydCBlbnVtIFN0YXR1cyB7XG4gIC8qKiBUaGUgc3RhdHVzIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLiAqL1xuICBVbmtub3duID0gJ3Vua25vd24nLFxuICAvKiogVGhlIGV2ZW50IHdhcyBza2lwcGVkIGR1ZSB0byBjb25maWd1cmF0aW9uIG9yIGNhbGxiYWNrcy4gKi9cbiAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgLyoqIFRoZSBldmVudCB3YXMgc2VudCB0byBTZW50cnkgc3VjY2Vzc2Z1bGx5LiAqL1xuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAvKiogVGhlIGNsaWVudCBpcyBjdXJyZW50bHkgcmF0ZSBsaW1pdGVkIGFuZCB3aWxsIHRyeSBhZ2FpbiBsYXRlci4gKi9cbiAgUmF0ZUxpbWl0ID0gJ3JhdGVfbGltaXQnLFxuICAvKiogVGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQuICovXG4gIEludmFsaWQgPSAnaW52YWxpZCcsXG4gIC8qKiBBIHNlcnZlci1zaWRlIGVycm9yIG9jY3VycmVkIGR1cmluZyBzdWJtaXNzaW9uLiAqL1xuICBGYWlsZWQgPSAnZmFpbGVkJyxcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2UsIGltcG9ydC9leHBvcnRcbmV4cG9ydCBuYW1lc3BhY2UgU3RhdHVzIHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgSFRUUCBzdGF0dXMgY29kZSBpbnRvIGEge0BsaW5rIFN0YXR1c30uXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlIFRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLlxuICAgKiBAcmV0dXJucyBUaGUgc2VuZCBzdGF0dXMgb3Ige0BsaW5rIFN0YXR1cy5Vbmtub3dufS5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBmcm9tSHR0cENvZGUoY29kZTogbnVtYmVyKTogU3RhdHVzIHtcbiAgICBpZiAoY29kZSA+PSAyMDAgJiYgY29kZSA8IDMwMCkge1xuICAgICAgcmV0dXJuIFN0YXR1cy5TdWNjZXNzO1xuICAgIH1cblxuICAgIGlmIChjb2RlID09PSA0MjkpIHtcbiAgICAgIHJldHVybiBTdGF0dXMuUmF0ZUxpbWl0O1xuICAgIH1cblxuICAgIGlmIChjb2RlID49IDQwMCAmJiBjb2RlIDwgNTAwKSB7XG4gICAgICByZXR1cm4gU3RhdHVzLkludmFsaWQ7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPj0gNTAwKSB7XG4gICAgICByZXR1cm4gU3RhdHVzLkZhaWxlZDtcbiAgICB9XG5cbiAgICByZXR1cm4gU3RhdHVzLlVua25vd247XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFeHRyYWN0ZWROb2RlUmVxdWVzdERhdGEsIFByaW1pdGl2ZSwgV29ya2VyTG9jYXRpb24gfSBmcm9tICcuL21pc2MnO1xuaW1wb3J0IHsgU3BhbiwgU3BhbkNvbnRleHQgfSBmcm9tICcuL3NwYW4nO1xuXG4vKipcbiAqIEludGVyZmFjZSBob2xkaW5nIFRyYW5zYWN0aW9uLXNwZWNpZmljIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbkNvbnRleHQgZXh0ZW5kcyBTcGFuQ29udGV4dCB7XG4gIC8qKlxuICAgKiBIdW1hbi1yZWFkYWJsZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgc2V0cyB0aGUgZW5kIHRpbWVzdGFtcCBvZiB0aGUgdHJhbnNhY3Rpb24gdG8gdGhlIGhpZ2hlc3QgdGltZXN0YW1wIG9mIGNoaWxkIHNwYW5zLCB0cmltbWluZ1xuICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHVzZWZ1bCB0byBkaXNjYXJkIGV4dHJhIHRpbWUgaW4gdGhlIHRyYW5zYWN0aW9uIHRoYXQgaXMgbm90XG4gICAqIGFjY291bnRlZCBmb3IgaW4gY2hpbGQgc3BhbnMsIGxpa2Ugd2hhdCBoYXBwZW5zIGluIHRoZSBpZGxlIHRyYW5zYWN0aW9uIFRyYWNpbmcgaW50ZWdyYXRpb24sIHdoZXJlIHdlIGZpbmlzaCB0aGVcbiAgICogdHJhbnNhY3Rpb24gYWZ0ZXIgYSBnaXZlbiBcImlkbGUgdGltZVwiIGFuZCB3ZSBkb24ndCB3YW50IHRoaXMgXCJpZGxlIHRpbWVcIiB0byBiZSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICovXG4gIHRyaW1FbmQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIHRyYW5zYWN0aW9uIGhhcyBhIHBhcmVudCwgdGhlIHBhcmVudCdzIHNhbXBsaW5nIGRlY2lzaW9uXG4gICAqL1xuICBwYXJlbnRTYW1wbGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiwgZm9yIGludGVybmFsIFNESyB1c2UuXG4gICAqL1xuICBtZXRhZGF0YT86IFRyYW5zYWN0aW9uTWV0YWRhdGE7XG59XG5cbi8qKlxuICogRGF0YSBwdWxsZWQgZnJvbSBhIGBzZW50cnktdHJhY2VgIGhlYWRlclxuICovXG5leHBvcnQgdHlwZSBUcmFjZXBhcmVudERhdGEgPSBQaWNrPFRyYW5zYWN0aW9uQ29udGV4dCwgJ3RyYWNlSWQnIHwgJ3BhcmVudFNwYW5JZCcgfCAncGFyZW50U2FtcGxlZCc+O1xuXG4vKipcbiAqIFRyYW5zYWN0aW9uIFwiQ2xhc3NcIiwgaW5oZXJpdHMgU3BhbiBvbmx5IGhhcyBgc2V0TmFtZWBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uQ29udGV4dCwgU3BhbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgc3BhbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICB0cmFjZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBzdGFydFRpbWVzdGFtcDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgdGFnczogeyBba2V5OiBzdHJpbmddOiBQcmltaXRpdmUgfTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIE1ldGFkYXRhIGFib3V0IHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgbWV0YWRhdGE6IFRyYW5zYWN0aW9uTWV0YWRhdGE7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbmFtZSBvZiB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZDtcblxuICAvKiogUmV0dXJucyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBwcm9wZXJ0aWVzIGFzIGEgYFRyYW5zYWN0aW9uQ29udGV4dGAgKi9cbiAgdG9Db250ZXh0KCk6IFRyYW5zYWN0aW9uQ29udGV4dDtcblxuICAvKiogVXBkYXRlcyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiB3aXRoIGEgbmV3IGBUcmFuc2FjdGlvbkNvbnRleHRgICovXG4gIHVwZGF0ZVdpdGhDb250ZXh0KHRyYW5zYWN0aW9uQ29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0KTogdGhpcztcbn1cblxuLyoqXG4gKiBDb250ZXh0IGRhdGEgcGFzc2VkIGJ5IHRoZSB1c2VyIHdoZW4gc3RhcnRpbmcgYSB0cmFuc2FjdGlvbiwgdG8gYmUgdXNlZCBieSB0aGUgdHJhY2VzU2FtcGxlciBtZXRob2QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tU2FtcGxpbmdDb250ZXh0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIERhdGEgcGFzc2VkIHRvIHRoZSBgdHJhY2VzU2FtcGxlcmAgZnVuY3Rpb24sIHdoaWNoIGZvcm1zIHRoZSBiYXNpcyBmb3Igd2hhdGV2ZXIgZGVjaXNpb25zIGl0IG1pZ2h0IG1ha2UuXG4gKlxuICogQWRkcyBkZWZhdWx0IGRhdGEgdG8gZGF0YSBwcm92aWRlZCBieSB0aGUgdXNlci4gU2VlIHtAbGluayBIdWIuc3RhcnRUcmFuc2FjdGlvbn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW1wbGluZ0NvbnRleHQgZXh0ZW5kcyBDdXN0b21TYW1wbGluZ0NvbnRleHQge1xuICAvKipcbiAgICogQ29udGV4dCBkYXRhIHdpdGggd2hpY2ggdHJhbnNhY3Rpb24gYmVpbmcgc2FtcGxlZCB3YXMgY3JlYXRlZFxuICAgKi9cbiAgdHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFNhbXBsaW5nIGRlY2lzaW9uIGZyb20gdGhlIHBhcmVudCB0cmFuc2FjdGlvbiwgaWYgYW55LlxuICAgKi9cbiAgcGFyZW50U2FtcGxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIFVSTCBvZiB0aGUgY3VycmVudCBwYWdlIG9yIHdvcmtlciBzY3JpcHQuIFBhc3NlZCBieSBkZWZhdWx0IHdoZW4gdXNpbmcgdGhlIGBCcm93c2VyVHJhY2luZ2BcbiAgICogaW50ZWdyYXRpb24uXG4gICAqL1xuICBsb2NhdGlvbj86IFdvcmtlckxvY2F0aW9uO1xuXG4gIC8qKlxuICAgKiBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBpbmNvbWluZyByZXF1ZXN0IHRvIGEgbm9kZSBzZXJ2ZXIuIFBhc3NlZCBieSBkZWZhdWx0IHdoZW4gdXNpbmcgdGhlIFRyYWNpbmdIYW5kbGVyLlxuICAgKi9cbiAgcmVxdWVzdD86IEV4dHJhY3RlZE5vZGVSZXF1ZXN0RGF0YTtcbn1cblxuZXhwb3J0IHR5cGUgTWVhc3VyZW1lbnRzID0gUmVjb3JkPHN0cmluZywgeyB2YWx1ZTogbnVtYmVyIH0+O1xuXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kIHtcbiAgRXhwbGljaXQgPSAnZXhwbGljaXRseV9zZXQnLFxuICBTYW1wbGVyID0gJ2NsaWVudF9zYW1wbGVyJyxcbiAgUmF0ZSA9ICdjbGllbnRfcmF0ZScsXG4gIEluaGVyaXRhbmNlID0gJ2luaGVyaXRhbmNlJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbk1ldGFkYXRhIHtcbiAgdHJhbnNhY3Rpb25TYW1wbGluZz86IHsgcmF0ZT86IG51bWJlcjsgbWV0aG9kPzogc3RyaW5nIH07XG5cbiAgLyoqIFRoZSB0d28gaGFsdmVzIChzZW50cnkgYW5kIHRoaXJkLXBhcnR5KSBvZiBhIHRyYW5zYWN0aW9uJ3MgdHJhY2VzdGF0ZSBoZWFkZXIsIHVzZWQgZm9yIGR5bmFtaWMgc2FtcGxpbmcgKi9cbiAgdHJhY2VzdGF0ZT86IHtcbiAgICBzZW50cnk/OiBzdHJpbmc7XG4gICAgdGhpcmRwYXJ0eT86IHN0cmluZztcbiAgfTtcblxuICAvKiogRm9yIHRyYW5zYWN0aW9ucyB0cmFjaW5nIHNlcnZlci1zaWRlIHJlcXVlc3QgaGFuZGxpbmcsIHRoZSBwYXRoIG9mIHRoZSByZXF1ZXN0IGJlaW5nIHRyYWNrZWQuICovXG4gIHJlcXVlc3RQYXRoPzogc3RyaW5nO1xufVxuIiwgImltcG9ydCB7IERzbkxpa2UgfSBmcm9tICcuL2Rzbic7XG5pbXBvcnQgeyBFdmVudCB9IGZyb20gJy4vZXZlbnQnO1xuaW1wb3J0IHsgU2VudHJ5UmVxdWVzdFR5cGUgfSBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHsgUmVzcG9uc2UgfSBmcm9tICcuL3Jlc3BvbnNlJztcbmltcG9ydCB7IFNka01ldGFkYXRhIH0gZnJvbSAnLi9zZGttZXRhZGF0YSc7XG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uQWdncmVnYXRlcyB9IGZyb20gJy4vc2Vzc2lvbic7XG5cbmV4cG9ydCBlbnVtIE91dGNvbWUge1xuICBCZWZvcmVTZW5kID0gJ2JlZm9yZV9zZW5kJyxcbiAgRXZlbnRQcm9jZXNzb3IgPSAnZXZlbnRfcHJvY2Vzc29yJyxcbiAgTmV0d29ya0Vycm9yID0gJ25ldHdvcmtfZXJyb3InLFxuICBRdWV1ZU92ZXJmbG93ID0gJ3F1ZXVlX292ZXJmbG93JyxcbiAgUmF0ZUxpbWl0QmFja29mZiA9ICdyYXRlbGltaXRfYmFja29mZicsXG4gIFNhbXBsZVJhdGUgPSAnc2FtcGxlX3JhdGUnLFxufVxuXG4vKiogVHJhbnNwb3J0IHVzZWQgc2VuZGluZyBkYXRhIHRvIFNlbnRyeSAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnQge1xuICAvKipcbiAgICogU2VuZHMgdGhlIGV2ZW50IHRvIHRoZSBTdG9yZSBlbmRwb2ludCBpbiBTZW50cnkuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBFdmVudCB0aGF0IHNob3VsZCBiZSBzZW50IHRvIFNlbnRyeS5cbiAgICovXG4gIHNlbmRFdmVudChldmVudDogRXZlbnQpOiBQcm9taXNlTGlrZTxSZXNwb25zZT47XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBzZXNzaW9uIHRvIHRoZSBFbnZlbG9wZSBlbmRwb2ludCBpbiBTZW50cnkuXG4gICAqXG4gICAqIEBwYXJhbSBzZXNzaW9uIFNlc3Npb24gdGhhdCBzaG91bGQgYmUgc2VudCB0byBTZW50cnkgfCBTZXNzaW9uIEFnZ3JlZ2F0ZXMgdGhhdCBzaG91bGQgYmUgc2VudCB0byBTZW50cnkuXG4gICAqL1xuICBzZW5kU2Vzc2lvbj8oc2Vzc2lvbjogU2Vzc2lvbiB8IFNlc3Npb25BZ2dyZWdhdGVzKTogUHJvbWlzZUxpa2U8UmVzcG9uc2U+O1xuXG4gIC8qKlxuICAgKiBXYWl0IGZvciBhbGwgZXZlbnRzIHRvIGJlIHNlbnQgb3IgdGhlIHRpbWVvdXQgdG8gZXhwaXJlLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lb3V0IE1heGltdW0gdGltZSBpbiBtcyB0aGUgdHJhbnNwb3J0IHNob3VsZCB3YWl0IGZvciBldmVudHMgdG8gYmUgZmx1c2hlZC4gT21pdHRpbmcgdGhpcyBwYXJhbWV0ZXIgd2lsbFxuICAgKiAgIGNhdXNlIHRoZSB0cmFuc3BvcnQgdG8gd2FpdCB1bnRpbCBhbGwgZXZlbnRzIGFyZSBzZW50IGJlZm9yZSByZXNvbHZpbmcgdGhlIHByb21pc2UuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB3aXRoIGB0cnVlYCBpZiBhbGwgZXZlbnRzIGFyZSBzZW50IGJlZm9yZSB0aGUgdGltZW91dCwgb3IgYGZhbHNlYCBpZiB0aGVyZSBhcmVcbiAgICogc3RpbGwgZXZlbnRzIGluIHRoZSBxdWV1ZSB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gICAqL1xuICBjbG9zZSh0aW1lb3V0PzogbnVtYmVyKTogUHJvbWlzZUxpa2U8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIEluY3JlbWVudCB0aGUgY291bnRlciBmb3IgdGhlIHNwZWNpZmljIGNsaWVudCBvdXRjb21lXG4gICAqL1xuICByZWNvcmRMb3N0RXZlbnQ/KHR5cGU6IE91dGNvbWUsIGNhdGVnb3J5OiBTZW50cnlSZXF1ZXN0VHlwZSk6IHZvaWQ7XG59XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IHR5cGUgVHJhbnNwb3J0Q2xhc3M8VCBleHRlbmRzIFRyYW5zcG9ydD4gPSBuZXcgKG9wdGlvbnM6IFRyYW5zcG9ydE9wdGlvbnMpID0+IFQ7XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BvcnRPcHRpb25zIHtcbiAgLyoqIFNlbnRyeSBEU04gKi9cbiAgZHNuOiBEc25MaWtlO1xuICAvKiogRGVmaW5lIGN1c3RvbSBoZWFkZXJzICovXG4gIGhlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAvKiogU2V0IGEgSFRUUCBwcm94eSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBvdXRib3VuZCByZXF1ZXN0cy4gKi9cbiAgaHR0cFByb3h5Pzogc3RyaW5nO1xuICAvKiogU2V0IGEgSFRUUFMgcHJveHkgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3Igb3V0Ym91bmQgcmVxdWVzdHMuICovXG4gIGh0dHBzUHJveHk/OiBzdHJpbmc7XG4gIC8qKiBIVFRQUyBwcm94eSBjZXJ0aWZpY2F0ZXMgcGF0aCAqL1xuICBjYUNlcnRzPzogc3RyaW5nO1xuICAvKiogRmV0Y2ggQVBJIGluaXQgcGFyYW1ldGVycyAqL1xuICBmZXRjaFBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAvKiogVGhlIGVudmVsb3BlIHR1bm5lbCB0byB1c2UuICovXG4gIHR1bm5lbD86IHN0cmluZztcbiAgLyoqIFNlbmQgU0RLIENsaWVudCBSZXBvcnRzLiBFbmFibGVkIGJ5IGRlZmF1bHQuICovXG4gIHNlbmRDbGllbnRSZXBvcnRzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNldCBvZiBtZXRhZGF0YSBhYm91dCB0aGUgU0RLIHRoYXQgY2FuIGJlIGludGVybmFsbHkgdXNlZCB0byBlbmhhbmNlIGVudmVsb3BlcyBhbmQgZXZlbnRzLFxuICAgKiBhbmQgcHJvdmlkZSBhZGRpdGlvbmFsIGRhdGEgYWJvdXQgZXZlcnkgcmVxdWVzdC5cbiAgICogKi9cbiAgX21ldGFkYXRhPzogU2RrTWV0YWRhdGE7XG59XG4iLCAiZXhwb3J0IHsgQnJlYWRjcnVtYiwgQnJlYWRjcnVtYkhpbnQgfSBmcm9tICcuL2JyZWFkY3J1bWInO1xuZXhwb3J0IHsgQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0IHsgQ29udGV4dCwgQ29udGV4dHMgfSBmcm9tICcuL2NvbnRleHQnO1xuZXhwb3J0IHsgRHNuLCBEc25Db21wb25lbnRzLCBEc25MaWtlLCBEc25Qcm90b2NvbCB9IGZyb20gJy4vZHNuJztcbmV4cG9ydCB7IERlYnVnSW1hZ2UsIERlYnVnSW1hZ2VUeXBlLCBEZWJ1Z01ldGEgfSBmcm9tICcuL2RlYnVnTWV0YSc7XG5leHBvcnQgeyBFeHRlbmRlZEVycm9yIH0gZnJvbSAnLi9lcnJvcic7XG5leHBvcnQgeyBFdmVudCwgRXZlbnRIaW50IH0gZnJvbSAnLi9ldmVudCc7XG5leHBvcnQgeyBFdmVudFByb2Nlc3NvciB9IGZyb20gJy4vZXZlbnRwcm9jZXNzb3InO1xuZXhwb3J0IHsgRXhjZXB0aW9uIH0gZnJvbSAnLi9leGNlcHRpb24nO1xuZXhwb3J0IHsgRXh0cmEsIEV4dHJhcyB9IGZyb20gJy4vZXh0cmEnO1xuZXhwb3J0IHsgSHViIH0gZnJvbSAnLi9odWInO1xuZXhwb3J0IHsgSW50ZWdyYXRpb24sIEludGVncmF0aW9uQ2xhc3MgfSBmcm9tICcuL2ludGVncmF0aW9uJztcbmV4cG9ydCB7IExvZ0xldmVsIH0gZnJvbSAnLi9sb2dsZXZlbCc7XG5leHBvcnQgeyBNZWNoYW5pc20gfSBmcm9tICcuL21lY2hhbmlzbSc7XG5leHBvcnQgeyBFeHRyYWN0ZWROb2RlUmVxdWVzdERhdGEsIFByaW1pdGl2ZSwgV29ya2VyTG9jYXRpb24gfSBmcm9tICcuL21pc2MnO1xuZXhwb3J0IHsgT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5leHBvcnQgeyBQYWNrYWdlIH0gZnJvbSAnLi9wYWNrYWdlJztcbmV4cG9ydCB7IFF1ZXJ5UGFyYW1zLCBSZXF1ZXN0LCBTZW50cnlSZXF1ZXN0LCBTZW50cnlSZXF1ZXN0VHlwZSB9IGZyb20gJy4vcmVxdWVzdCc7XG5leHBvcnQgeyBSZXNwb25zZSB9IGZyb20gJy4vcmVzcG9uc2UnO1xuZXhwb3J0IHsgUnVudGltZSB9IGZyb20gJy4vcnVudGltZSc7XG5leHBvcnQgeyBDYXB0dXJlQ29udGV4dCwgU2NvcGUsIFNjb3BlQ29udGV4dCB9IGZyb20gJy4vc2NvcGUnO1xuZXhwb3J0IHsgU2RrSW5mbyB9IGZyb20gJy4vc2RraW5mbyc7XG5leHBvcnQgeyBTZGtNZXRhZGF0YSB9IGZyb20gJy4vc2RrbWV0YWRhdGEnO1xuZXhwb3J0IHtcbiAgU2Vzc2lvbkFnZ3JlZ2F0ZXMsXG4gIEFnZ3JlZ2F0aW9uQ291bnRzLFxuICBTZXNzaW9uLFxuICBTZXNzaW9uQ29udGV4dCxcbiAgU2Vzc2lvblN0YXR1cyxcbiAgUmVxdWVzdFNlc3Npb24sXG4gIFJlcXVlc3RTZXNzaW9uU3RhdHVzLFxuICBTZXNzaW9uRmx1c2hlckxpa2UsXG59IGZyb20gJy4vc2Vzc2lvbic7XG5leHBvcnQgeyBTZXZlcml0eSB9IGZyb20gJy4vc2V2ZXJpdHknO1xuZXhwb3J0IHsgU3BhbiwgU3BhbkNvbnRleHQgfSBmcm9tICcuL3NwYW4nO1xuZXhwb3J0IHsgU3RhY2tGcmFtZSB9IGZyb20gJy4vc3RhY2tmcmFtZSc7XG5leHBvcnQgeyBTdGFja3RyYWNlIH0gZnJvbSAnLi9zdGFja3RyYWNlJztcbmV4cG9ydCB7IFN0YXR1cyB9IGZyb20gJy4vc3RhdHVzJztcbmV4cG9ydCB7XG4gIEN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbiAgTWVhc3VyZW1lbnRzLFxuICBTYW1wbGluZ0NvbnRleHQsXG4gIFRyYWNlcGFyZW50RGF0YSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgVHJhbnNhY3Rpb25NZXRhZGF0YSxcbiAgVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZCxcbn0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5leHBvcnQgeyBUaHJlYWQgfSBmcm9tICcuL3RocmVhZCc7XG5leHBvcnQgeyBPdXRjb21lLCBUcmFuc3BvcnQsIFRyYW5zcG9ydE9wdGlvbnMsIFRyYW5zcG9ydENsYXNzIH0gZnJvbSAnLi90cmFuc3BvcnQnO1xuZXhwb3J0IHsgVXNlciB9IGZyb20gJy4vdXNlcic7XG5leHBvcnQgeyBXcmFwcGVkRnVuY3Rpb24gfSBmcm9tICcuL3dyYXBwZWRmdW5jdGlvbic7XG4iLCAiLyoqXG4gKiBDb25zdW1lcyB0aGUgcHJvbWlzZSBhbmQgbG9ncyB0aGUgZXJyb3Igd2hlbiBpdCByZWplY3RzLlxuICogQHBhcmFtIHByb21pc2UgQSBwcm9taXNlIHRvIGZvcmdldC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBmb3JnZXQocHJvbWlzZTogUHJvbWlzZUxpa2U8YW55Pik6IHZvaWQge1xuICB2b2lkIHByb21pc2UudGhlbihudWxsLCBlID0+IHtcbiAgICAvLyBUT0RPOiBVc2UgYSBiZXR0ZXIgbG9nZ2luZyBtZWNoYW5pc21cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gIH0pO1xufVxuIiwgIi8qKlxuICogTk9URTogSW4gb3JkZXIgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLCBpZiB5b3UgYWRkIGEgZnVuY3Rpb24gdG8gdGhpcyBtb2R1bGUgYW5kIGl0IG5lZWRzIHRvIHByaW50IHNvbWV0aGluZyxcbiAqIHlvdSBtdXN0IGVpdGhlciBhKSB1c2UgYGNvbnNvbGUubG9nYCByYXRoZXIgdGhhbiB0aGUgbG9nZ2VyLCBvciBiKSBwdXQgeW91ciBmdW5jdGlvbiBlbHNld2hlcmUuXG4gKi9cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciB3ZSdyZSBpbiB0aGUgTm9kZS5qcyBvciBCcm93c2VyIGVudmlyb25tZW50XG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIGdpdmVuIHF1ZXN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVFbnYoKTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnID8gcHJvY2VzcyA6IDApID09PSAnW29iamVjdCBwcm9jZXNzXSc7XG59XG5cbi8qKlxuICogUmVxdWlyZXMgYSBtb2R1bGUgd2hpY2ggaXMgcHJvdGVjdGVkIGFnYWluc3QgYnVuZGxlciBtaW5pZmljYXRpb24uXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgVGhlIG1vZHVsZSBwYXRoIHRvIHJlc29sdmVcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBkeW5hbWljUmVxdWlyZShtb2Q6IGFueSwgcmVxdWVzdDogc3RyaW5nKTogYW55IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICByZXR1cm4gbW9kLnJlcXVpcmUocmVxdWVzdCk7XG59XG5cbi8qKlxuICogSGVscGVyIGZvciBkeW5hbWljYWxseSBsb2FkaW5nIG1vZHVsZSB0aGF0IHNob3VsZCB3b3JrIHdpdGggbGlua2VkIGRlcGVuZGVuY2llcy5cbiAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgd2UgX3Nob3VsZF8gYmUgdXNpbmcgYHJlcXVpcmUocmVxdWlyZS5yZXNvbHZlKG1vZHVsZU5hbWUsIHsgcGF0aHM6IFtjd2QoKV0gfSkpYFxuICogSG93ZXZlciBpdCdzIF9ub3QgcG9zc2libGVfIHRvIGRvIHRoYXQgd2l0aCBXZWJwYWNrLCBhcyBpdCBoYXMgdG8ga25vdyBhbGwgdGhlIGRlcGVuZGVuY2llcyBkdXJpbmdcbiAqIGJ1aWxkIHRpbWUuIGByZXF1aXJlLnJlc29sdmVgIGlzIGFsc28gbm90IGF2YWlsYWJsZSBpbiBhbnkgb3RoZXIgd2F5LCBzbyB3ZSBjYW5ub3QgY3JlYXRlLFxuICogYSBmYWtlIGhlbHBlciBsaWtlIHdlIGRvIHdpdGggYGR5bmFtaWNSZXF1aXJlYC5cbiAqXG4gKiBXZSBhbHdheXMgcHJlZmVyIHRvIHVzZSBsb2NhbCBwYWNrYWdlLCB0aHVzIHRoZSB2YWx1ZSBpcyBub3QgcmV0dXJuZWQgZWFybHkgZnJvbSBlYWNoIGB0cnkvY2F0Y2hgIGJsb2NrLlxuICogVGhhdCBpcyB0byBtaW1pYyB0aGUgYmVoYXZpb3Igb2YgYHJlcXVpcmUucmVzb2x2ZWAgZXhhY3RseS5cbiAqXG4gKiBAcGFyYW0gbW9kdWxlTmFtZSBtb2R1bGUgbmFtZSB0byByZXF1aXJlXG4gKiBAcmV0dXJucyBwb3NzaWJseSByZXF1aXJlZCBtb2R1bGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRNb2R1bGU8VD4obW9kdWxlTmFtZTogc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG4gIGxldCBtb2Q6IFQgfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBtb2QgPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsIG1vZHVsZU5hbWUpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gbm8tZW1wdHlcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgeyBjd2QgfSA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJ3Byb2Nlc3MnKTtcbiAgICBtb2QgPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsIGAke2N3ZCgpfS9ub2RlX21vZHVsZXMvJHttb2R1bGVOYW1lfWApIGFzIFQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBuby1lbXB0eVxuICB9XG5cbiAgcmV0dXJuIG1vZDtcbn1cbiIsICIvKipcbiAqIE5PVEU6IEluIG9yZGVyIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcywgaWYgeW91IGFkZCBhIGZ1bmN0aW9uIHRvIHRoaXMgbW9kdWxlIGFuZCBpdCBuZWVkcyB0byBwcmludCBzb21ldGhpbmcsXG4gKiB5b3UgbXVzdCBlaXRoZXIgYSkgdXNlIGBjb25zb2xlLmxvZ2AgcmF0aGVyIHRoYW4gdGhlIGxvZ2dlciwgb3IgYikgcHV0IHlvdXIgZnVuY3Rpb24gZWxzZXdoZXJlLlxuICovXG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuaW1wb3J0IHsgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuaW1wb3J0IHsgaXNOb2RlRW52IH0gZnJvbSAnLi9ub2RlJztcblxuLyoqIEludGVybmFsICovXG5pbnRlcmZhY2UgU2VudHJ5R2xvYmFsIHtcbiAgU2VudHJ5Pzoge1xuICAgIEludGVncmF0aW9ucz86IEludGVncmF0aW9uW107XG4gIH07XG4gIFNFTlRSWV9FTlZJUk9OTUVOVD86IHN0cmluZztcbiAgU0VOVFJZX0RTTj86IHN0cmluZztcbiAgU0VOVFJZX1JFTEVBU0U/OiB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gIH07XG4gIF9fU0VOVFJZX186IHtcbiAgICBnbG9iYWxFdmVudFByb2Nlc3NvcnM6IGFueTtcbiAgICBodWI6IGFueTtcbiAgICBsb2dnZXI6IGFueTtcbiAgfTtcbn1cblxuY29uc3QgZmFsbGJhY2tHbG9iYWxPYmplY3QgPSB7fTtcblxuLyoqXG4gKiBTYWZlbHkgZ2V0IGdsb2JhbCBzY29wZSBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyBHbG9iYWwgc2NvcGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxPYmplY3Q8VD4oKTogVCAmIFNlbnRyeUdsb2JhbCB7XG4gIHJldHVybiAoaXNOb2RlRW52KClcbiAgICA/IGdsb2JhbFxuICAgIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgICA/IHdpbmRvdyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnXG4gICAgPyBzZWxmXG4gICAgOiBmYWxsYmFja0dsb2JhbE9iamVjdCkgYXMgVCAmIFNlbnRyeUdsb2JhbDtcbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzICovXG5cbmltcG9ydCB7IFByaW1pdGl2ZSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgb25lIG9mIGEgZmV3IEVycm9yIG9yIEVycm9yLWxpa2VcbiAqIHtAbGluayBpc0Vycm9yfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3Iod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgc3dpdGNoIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSkge1xuICAgIGNhc2UgJ1tvYmplY3QgRXJyb3JdJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJ1tvYmplY3QgRXhjZXB0aW9uXSc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBjYXNlICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBpc0luc3RhbmNlT2Yod2F0LCBFcnJvcik7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgRXJyb3JFdmVudFxuICoge0BsaW5rIGlzRXJyb3JFdmVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Vycm9yRXZlbnQod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBFcnJvckV2ZW50XSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIERPTUVycm9yXG4gKiB7QGxpbmsgaXNET01FcnJvcn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RPTUVycm9yKHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgRE9NRXJyb3JdJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgRE9NRXhjZXB0aW9uXG4gKiB7QGxpbmsgaXNET01FeGNlcHRpb259LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNET01FeGNlcHRpb24od2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBET01FeGNlcHRpb25dJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYSBzdHJpbmdcbiAqIHtAbGluayBpc1N0cmluZ30uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgaXMgYSBwcmltaXRpdmUgKHVuZGVmaW5lZCwgbnVsbCwgbnVtYmVyLCBib29sZWFuLCBzdHJpbmcsIGJpZ2ludCwgc3ltYm9sKVxuICoge0BsaW5rIGlzUHJpbWl0aXZlfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHJpbWl0aXZlKHdhdDogYW55KTogd2F0IGlzIFByaW1pdGl2ZSB7XG4gIHJldHVybiB3YXQgPT09IG51bGwgfHwgKHR5cGVvZiB3YXQgIT09ICdvYmplY3QnICYmIHR5cGVvZiB3YXQgIT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBvYmplY3QgbGl0ZXJhbFxuICoge0BsaW5rIGlzUGxhaW5PYmplY3R9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBFdmVudCBpbnN0YW5jZVxuICoge0BsaW5rIGlzRXZlbnR9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFdmVudCh3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIEV2ZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luc3RhbmNlT2Yod2F0LCBFdmVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIEVsZW1lbnQgaW5zdGFuY2VcbiAqIHtAbGluayBpc0VsZW1lbnR9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGVtZW50KHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJbnN0YW5jZU9mKHdhdCwgRWxlbWVudCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIHJlZ2V4cFxuICoge0BsaW5rIGlzUmVnRXhwfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnRXhwKHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUgaGFzIGEgdGhlbiBmdW5jdGlvbi5cbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUaGVuYWJsZSh3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gIHJldHVybiBCb29sZWFuKHdhdCAmJiB3YXQudGhlbiAmJiB0eXBlb2Ygd2F0LnRoZW4gPT09ICdmdW5jdGlvbicpO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhIFN5bnRoZXRpY0V2ZW50XG4gKiB7QGxpbmsgaXNTeW50aGV0aWNFdmVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N5bnRoZXRpY0V2ZW50KHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1BsYWluT2JqZWN0KHdhdCkgJiYgJ25hdGl2ZUV2ZW50JyBpbiB3YXQgJiYgJ3ByZXZlbnREZWZhdWx0JyBpbiB3YXQgJiYgJ3N0b3BQcm9wYWdhdGlvbicgaW4gd2F0O1xufVxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gaW5zdGFuY2Ugb2YgcHJvdmlkZWQgY29uc3RydWN0b3IuXG4gKiB7QGxpbmsgaXNJbnN0YW5jZU9mfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEBwYXJhbSBiYXNlIEEgY29uc3RydWN0b3IgdG8gYmUgdXNlZCBpbiBhIGNoZWNrLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbnN0YW5jZU9mKHdhdDogYW55LCBiYXNlOiBhbnkpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2F0IGluc3RhbmNlb2YgYmFzZTtcbiAgfSBjYXRjaCAoX2UpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpc1N0cmluZyB9IGZyb20gJy4vaXMnO1xuXG4vKipcbiAqIEdpdmVuIGEgY2hpbGQgRE9NIGVsZW1lbnQsIHJldHVybnMgYSBxdWVyeS1zZWxlY3RvciBzdGF0ZW1lbnQgZGVzY3JpYmluZyB0aGF0XG4gKiBhbmQgaXRzIGFuY2VzdG9yc1xuICogZS5nLiBbSFRNTEVsZW1lbnRdID0+IGJvZHkgPiBkaXYgPiBpbnB1dCNmb28uYnRuW25hbWU9YmF6XVxuICogQHJldHVybnMgZ2VuZXJhdGVkIERPTSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBodG1sVHJlZUFzU3RyaW5nKGVsZW06IHVua25vd24sIGtleUF0dHJzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICB0eXBlIFNpbXBsZU5vZGUgPSB7XG4gICAgcGFyZW50Tm9kZTogU2ltcGxlTm9kZTtcbiAgfSB8IG51bGw7XG5cbiAgLy8gdHJ5L2NhdGNoIGJvdGg6XG4gIC8vIC0gYWNjZXNzaW5nIGV2ZW50LnRhcmdldCAoc2VlIGdldHNlbnRyeS9yYXZlbi1qcyM4MzgsICM3NjgpXG4gIC8vIC0gYGh0bWxUcmVlQXNTdHJpbmdgIGJlY2F1c2UgaXQncyBjb21wbGV4LCBhbmQganVzdCBhY2Nlc3NpbmcgdGhlIERPTSBpbmNvcnJlY3RseVxuICAvLyAtIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSBjaXJjdW1zdGFuY2VzLlxuICB0cnkge1xuICAgIGxldCBjdXJyZW50RWxlbSA9IGVsZW0gYXMgU2ltcGxlTm9kZTtcbiAgICBjb25zdCBNQVhfVFJBVkVSU0VfSEVJR0hUID0gNTtcbiAgICBjb25zdCBNQVhfT1VUUFVUX0xFTiA9IDgwO1xuICAgIGNvbnN0IG91dCA9IFtdO1xuICAgIGxldCBoZWlnaHQgPSAwO1xuICAgIGxldCBsZW4gPSAwO1xuICAgIGNvbnN0IHNlcGFyYXRvciA9ICcgPiAnO1xuICAgIGNvbnN0IHNlcExlbmd0aCA9IHNlcGFyYXRvci5sZW5ndGg7XG4gICAgbGV0IG5leHRTdHI7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICB3aGlsZSAoY3VycmVudEVsZW0gJiYgaGVpZ2h0KysgPCBNQVhfVFJBVkVSU0VfSEVJR0hUKSB7XG4gICAgICBuZXh0U3RyID0gX2h0bWxFbGVtZW50QXNTdHJpbmcoY3VycmVudEVsZW0sIGtleUF0dHJzKTtcbiAgICAgIC8vIGJhaWwgb3V0IGlmXG4gICAgICAvLyAtIG5leHRTdHIgaXMgdGhlICdodG1sJyBlbGVtZW50XG4gICAgICAvLyAtIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB0aGF0IHdvdWxkIGJlIGNyZWF0ZWQgZXhjZWVkcyBNQVhfT1VUUFVUX0xFTlxuICAgICAgLy8gICAoaWdub3JlIHRoaXMgbGltaXQgaWYgd2UgYXJlIG9uIHRoZSBmaXJzdCBpdGVyYXRpb24pXG4gICAgICBpZiAobmV4dFN0ciA9PT0gJ2h0bWwnIHx8IChoZWlnaHQgPiAxICYmIGxlbiArIG91dC5sZW5ndGggKiBzZXBMZW5ndGggKyBuZXh0U3RyLmxlbmd0aCA+PSBNQVhfT1VUUFVUX0xFTikpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIG91dC5wdXNoKG5leHRTdHIpO1xuXG4gICAgICBsZW4gKz0gbmV4dFN0ci5sZW5ndGg7XG4gICAgICBjdXJyZW50RWxlbSA9IGN1cnJlbnRFbGVtLnBhcmVudE5vZGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5yZXZlcnNlKCkuam9pbihzZXBhcmF0b3IpO1xuICB9IGNhdGNoIChfb08pIHtcbiAgICByZXR1cm4gJzx1bmtub3duPic7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc2ltcGxlLCBxdWVyeS1zZWxlY3RvciByZXByZXNlbnRhdGlvbiBvZiBhIERPTSBlbGVtZW50XG4gKiBlLmcuIFtIVE1MRWxlbWVudF0gPT4gaW5wdXQjZm9vLmJ0bltuYW1lPWJhel1cbiAqIEByZXR1cm5zIGdlbmVyYXRlZCBET00gcGF0aFxuICovXG5mdW5jdGlvbiBfaHRtbEVsZW1lbnRBc1N0cmluZyhlbDogdW5rbm93biwga2V5QXR0cnM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGVsZW0gPSBlbCBhcyB7XG4gICAgdGFnTmFtZT86IHN0cmluZztcbiAgICBpZD86IHN0cmluZztcbiAgICBjbGFzc05hbWU/OiBzdHJpbmc7XG4gICAgZ2V0QXR0cmlidXRlKGtleTogc3RyaW5nKTogc3RyaW5nO1xuICB9O1xuXG4gIGNvbnN0IG91dCA9IFtdO1xuICBsZXQgY2xhc3NOYW1lO1xuICBsZXQgY2xhc3NlcztcbiAgbGV0IGtleTtcbiAgbGV0IGF0dHI7XG4gIGxldCBpO1xuXG4gIGlmICghZWxlbSB8fCAhZWxlbS50YWdOYW1lKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgb3V0LnB1c2goZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpO1xuXG4gIC8vIFBhaXJzIG9mIGF0dHJpYnV0ZSBrZXlzIGRlZmluZWQgaW4gYHNlcmlhbGl6ZUF0dHJpYnV0ZWAgYW5kIHRoZWlyIHZhbHVlcyBvbiBlbGVtZW50LlxuICBjb25zdCBrZXlBdHRyUGFpcnMgPSBrZXlBdHRycz8ubGVuZ3RoXG4gICAgPyBrZXlBdHRycy5maWx0ZXIoa2V5QXR0ciA9PiBlbGVtLmdldEF0dHJpYnV0ZShrZXlBdHRyKSkubWFwKGtleUF0dHIgPT4gW2tleUF0dHIsIGVsZW0uZ2V0QXR0cmlidXRlKGtleUF0dHIpXSlcbiAgICA6IG51bGw7XG5cbiAgaWYgKGtleUF0dHJQYWlycz8ubGVuZ3RoKSB7XG4gICAga2V5QXR0clBhaXJzLmZvckVhY2goa2V5QXR0clBhaXIgPT4ge1xuICAgICAgb3V0LnB1c2goYFske2tleUF0dHJQYWlyWzBdfT1cIiR7a2V5QXR0clBhaXJbMV19XCJdYCk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGVsZW0uaWQpIHtcbiAgICAgIG91dC5wdXNoKGAjJHtlbGVtLmlkfWApO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBjbGFzc05hbWUgPSBlbGVtLmNsYXNzTmFtZTtcbiAgICBpZiAoY2xhc3NOYW1lICYmIGlzU3RyaW5nKGNsYXNzTmFtZSkpIHtcbiAgICAgIGNsYXNzZXMgPSBjbGFzc05hbWUuc3BsaXQoL1xccysvKTtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dC5wdXNoKGAuJHtjbGFzc2VzW2ldfWApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBhbGxvd2VkQXR0cnMgPSBbJ3R5cGUnLCAnbmFtZScsICd0aXRsZScsICdhbHQnXTtcbiAgZm9yIChpID0gMDsgaSA8IGFsbG93ZWRBdHRycy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IGFsbG93ZWRBdHRyc1tpXTtcbiAgICBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICBpZiAoYXR0cikge1xuICAgICAgb3V0LnB1c2goYFske2tleX09XCIke2F0dHJ9XCJdYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQuam9pbignJyk7XG59XG5cbi8qKlxuICogQSBzYWZlIGZvcm0gb2YgbG9jYXRpb24uaHJlZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9jYXRpb25IcmVmKCk6IHN0cmluZyB7XG4gIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdsb2JhbC5kb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuICB9IGNhdGNoIChvTykge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBzZXRQcm90b3R5cGVPZiA9XG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSA/IHNldFByb3RvT2YgOiBtaXhpblByb3BlcnRpZXMpO1xuXG4vKipcbiAqIHNldFByb3RvdHlwZU9mIHBvbHlmaWxsIHVzaW5nIF9fcHJvdG9fX1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZnVuY3Rpb24gc2V0UHJvdG9PZjxUVGFyZ2V0IGV4dGVuZHMgb2JqZWN0LCBUUHJvdG8+KG9iajogVFRhcmdldCwgcHJvdG86IFRQcm90byk6IFRUYXJnZXQgJiBUUHJvdG8ge1xuICAvLyBAdHMtaWdub3JlIF9fcHJvdG9fXyBkb2VzIG5vdCBleGlzdCBvbiBvYmpcbiAgb2JqLl9fcHJvdG9fXyA9IHByb3RvO1xuICByZXR1cm4gb2JqIGFzIFRUYXJnZXQgJiBUUHJvdG87XG59XG5cbi8qKlxuICogc2V0UHJvdG90eXBlT2YgcG9seWZpbGwgdXNpbmcgbWl4aW5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbmZ1bmN0aW9uIG1peGluUHJvcGVydGllczxUVGFyZ2V0IGV4dGVuZHMgb2JqZWN0LCBUUHJvdG8+KG9iajogVFRhcmdldCwgcHJvdG86IFRQcm90byk6IFRUYXJnZXQgJiBUUHJvdG8ge1xuICBmb3IgKGNvbnN0IHByb3AgaW4gcHJvdG8pIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSB7XG4gICAgICAvLyBAdHMtaWdub3JlIHR5cGVzY3JpcHQgY29tcGxhaW5zIGFib3V0IGluZGV4aW5nIHNvIHdlIHJlbW92ZVxuICAgICAgb2JqW3Byb3BdID0gcHJvdG9bcHJvcF07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iaiBhcyBUVGFyZ2V0ICYgVFByb3RvO1xufVxuIiwgImltcG9ydCB7IHNldFByb3RvdHlwZU9mIH0gZnJvbSAnLi9wb2x5ZmlsbCc7XG5cbi8qKiBBbiBlcnJvciBlbWl0dGVkIGJ5IFNlbnRyeSBTREtzIGFuZCByZWxhdGVkIHV0aWxpdGllcy4gKi9cbmV4cG9ydCBjbGFzcyBTZW50cnlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqIERpc3BsYXkgbmFtZSBvZiB0aGlzIGVycm9yIGluc3RhbmNlLiAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG5cbiAgICB0aGlzLm5hbWUgPSBuZXcudGFyZ2V0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHNldFByb3RvdHlwZU9mKHRoaXMsIG5ldy50YXJnZXQucHJvdG90eXBlKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IERzbkNvbXBvbmVudHMsIERzbkxpa2UsIERzblByb3RvY29sIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5cbmltcG9ydCB7IFNlbnRyeUVycm9yIH0gZnJvbSAnLi9lcnJvcic7XG5cbi8qKiBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBwYXJzZSBhIERzbi4gKi9cbmNvbnN0IERTTl9SRUdFWCA9IC9eKD86KFxcdyspOilcXC9cXC8oPzooXFx3KykoPzo6KFxcdyspKT9AKShbXFx3Li1dKykoPzo6KFxcZCspKT9cXC8oLispLztcblxuLyoqIEVycm9yIG1lc3NhZ2UgKi9cbmNvbnN0IEVSUk9SX01FU1NBR0UgPSAnSW52YWxpZCBEc24nO1xuXG4vKiogVGhlIFNlbnRyeSBEc24sIGlkZW50aWZ5aW5nIGEgU2VudHJ5IGluc3RhbmNlIGFuZCBwcm9qZWN0LiAqL1xuZXhwb3J0IGNsYXNzIERzbiBpbXBsZW1lbnRzIERzbkNvbXBvbmVudHMge1xuICAvKiogUHJvdG9jb2wgdXNlZCB0byBjb25uZWN0IHRvIFNlbnRyeS4gKi9cbiAgcHVibGljIHByb3RvY29sITogRHNuUHJvdG9jb2w7XG4gIC8qKiBQdWJsaWMgYXV0aG9yaXphdGlvbiBrZXkgKGRlcHJlY2F0ZWQsIHJlbmFtZWQgdG8gcHVibGljS2V5KS4gKi9cbiAgcHVibGljIHVzZXIhOiBzdHJpbmc7XG4gIC8qKiBQdWJsaWMgYXV0aG9yaXphdGlvbiBrZXkuICovXG4gIHB1YmxpYyBwdWJsaWNLZXkhOiBzdHJpbmc7XG4gIC8qKiBQcml2YXRlIGF1dGhvcml6YXRpb24ga2V5IChkZXByZWNhdGVkLCBvcHRpb25hbCkuICovXG4gIHB1YmxpYyBwYXNzITogc3RyaW5nO1xuICAvKiogSG9zdG5hbWUgb2YgdGhlIFNlbnRyeSBpbnN0YW5jZS4gKi9cbiAgcHVibGljIGhvc3QhOiBzdHJpbmc7XG4gIC8qKiBQb3J0IG9mIHRoZSBTZW50cnkgaW5zdGFuY2UuICovXG4gIHB1YmxpYyBwb3J0ITogc3RyaW5nO1xuICAvKiogUGF0aCAqL1xuICBwdWJsaWMgcGF0aCE6IHN0cmluZztcbiAgLyoqIFByb2plY3QgSUQgKi9cbiAgcHVibGljIHByb2plY3RJZCE6IHN0cmluZztcblxuICAvKiogQ3JlYXRlcyBhIG5ldyBEc24gY29tcG9uZW50ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihmcm9tOiBEc25MaWtlKSB7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fZnJvbVN0cmluZyhmcm9tKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZnJvbUNvbXBvbmVudHMoZnJvbSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdmFsaWRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBEc24uXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCByZW5kZXIgdGhlIHB1YmxpYyByZXByZXNlbnRhdGlvbiB3aXRob3V0IHRoZSBwYXNzd29yZFxuICAgKiBjb21wb25lbnQuIFRvIGdldCB0aGUgZGVwcmVjYXRlZCBwcml2YXRlIHJlcHJlc2VudGF0aW9uLCBzZXQgYHdpdGhQYXNzd29yZGBcbiAgICogdG8gdHJ1ZS5cbiAgICpcbiAgICogQHBhcmFtIHdpdGhQYXNzd29yZCBXaGVuIHNldCB0byB0cnVlLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSBpbmNsdWRlZC5cbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZyh3aXRoUGFzc3dvcmQ6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBob3N0LCBwYXRoLCBwYXNzLCBwb3J0LCBwcm9qZWN0SWQsIHByb3RvY29sLCBwdWJsaWNLZXkgfSA9IHRoaXM7XG4gICAgcmV0dXJuIChcbiAgICAgIGAke3Byb3RvY29sfTovLyR7cHVibGljS2V5fSR7d2l0aFBhc3N3b3JkICYmIHBhc3MgPyBgOiR7cGFzc31gIDogJyd9YCArXG4gICAgICBgQCR7aG9zdH0ke3BvcnQgPyBgOiR7cG9ydH1gIDogJyd9LyR7cGF0aCA/IGAke3BhdGh9L2AgOiBwYXRofSR7cHJvamVjdElkfWBcbiAgICApO1xuICB9XG5cbiAgLyoqIFBhcnNlcyBhIHN0cmluZyBpbnRvIHRoaXMgRHNuLiAqL1xuICBwcml2YXRlIF9mcm9tU3RyaW5nKHN0cjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbWF0Y2ggPSBEU05fUkVHRVguZXhlYyhzdHIpO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKEVSUk9SX01FU1NBR0UpO1xuICAgIH1cblxuICAgIGNvbnN0IFtwcm90b2NvbCwgcHVibGljS2V5LCBwYXNzID0gJycsIGhvc3QsIHBvcnQgPSAnJywgbGFzdFBhdGhdID0gbWF0Y2guc2xpY2UoMSk7XG4gICAgbGV0IHBhdGggPSAnJztcbiAgICBsZXQgcHJvamVjdElkID0gbGFzdFBhdGg7XG5cbiAgICBjb25zdCBzcGxpdCA9IHByb2plY3RJZC5zcGxpdCgnLycpO1xuICAgIGlmIChzcGxpdC5sZW5ndGggPiAxKSB7XG4gICAgICBwYXRoID0gc3BsaXQuc2xpY2UoMCwgLTEpLmpvaW4oJy8nKTtcbiAgICAgIHByb2plY3RJZCA9IHNwbGl0LnBvcCgpIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICBpZiAocHJvamVjdElkKSB7XG4gICAgICBjb25zdCBwcm9qZWN0TWF0Y2ggPSBwcm9qZWN0SWQubWF0Y2goL15cXGQrLyk7XG4gICAgICBpZiAocHJvamVjdE1hdGNoKSB7XG4gICAgICAgIHByb2plY3RJZCA9IHByb2plY3RNYXRjaFswXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9mcm9tQ29tcG9uZW50cyh7IGhvc3QsIHBhc3MsIHBhdGgsIHByb2plY3RJZCwgcG9ydCwgcHJvdG9jb2w6IHByb3RvY29sIGFzIERzblByb3RvY29sLCBwdWJsaWNLZXkgfSk7XG4gIH1cblxuICAvKiogTWFwcyBEc24gY29tcG9uZW50cyBpbnRvIHRoaXMgaW5zdGFuY2UuICovXG4gIHByaXZhdGUgX2Zyb21Db21wb25lbnRzKGNvbXBvbmVudHM6IERzbkNvbXBvbmVudHMpOiB2b2lkIHtcbiAgICAvLyBUT0RPIHRoaXMgaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhbmQgY2FuIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvblxuICAgIGlmICgndXNlcicgaW4gY29tcG9uZW50cyAmJiAhKCdwdWJsaWNLZXknIGluIGNvbXBvbmVudHMpKSB7XG4gICAgICBjb21wb25lbnRzLnB1YmxpY0tleSA9IGNvbXBvbmVudHMudXNlcjtcbiAgICB9XG4gICAgdGhpcy51c2VyID0gY29tcG9uZW50cy5wdWJsaWNLZXkgfHwgJyc7XG5cbiAgICB0aGlzLnByb3RvY29sID0gY29tcG9uZW50cy5wcm90b2NvbDtcbiAgICB0aGlzLnB1YmxpY0tleSA9IGNvbXBvbmVudHMucHVibGljS2V5IHx8ICcnO1xuICAgIHRoaXMucGFzcyA9IGNvbXBvbmVudHMucGFzcyB8fCAnJztcbiAgICB0aGlzLmhvc3QgPSBjb21wb25lbnRzLmhvc3Q7XG4gICAgdGhpcy5wb3J0ID0gY29tcG9uZW50cy5wb3J0IHx8ICcnO1xuICAgIHRoaXMucGF0aCA9IGNvbXBvbmVudHMucGF0aCB8fCAnJztcbiAgICB0aGlzLnByb2plY3RJZCA9IGNvbXBvbmVudHMucHJvamVjdElkO1xuICB9XG5cbiAgLyoqIFZhbGlkYXRlcyB0aGlzIERzbiBhbmQgdGhyb3dzIG9uIGVycm9yLiAqL1xuICBwcml2YXRlIF92YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICBbJ3Byb3RvY29sJywgJ3B1YmxpY0tleScsICdob3N0JywgJ3Byb2plY3RJZCddLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgIGlmICghdGhpc1tjb21wb25lbnQgYXMga2V5b2YgRHNuQ29tcG9uZW50c10pIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGAke0VSUk9SX01FU1NBR0V9OiAke2NvbXBvbmVudH0gbWlzc2luZ2ApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKCF0aGlzLnByb2plY3RJZC5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihgJHtFUlJPUl9NRVNTQUdFfTogSW52YWxpZCBwcm9qZWN0SWQgJHt0aGlzLnByb2plY3RJZH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm90b2NvbCAhPT0gJ2h0dHAnICYmIHRoaXMucHJvdG9jb2wgIT09ICdodHRwcycpIHtcbiAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihgJHtFUlJPUl9NRVNTQUdFfTogSW52YWxpZCBwcm90b2NvbCAke3RoaXMucHJvdG9jb2x9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucG9ydCAmJiBpc05hTihwYXJzZUludCh0aGlzLnBvcnQsIDEwKSkpIHtcbiAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihgJHtFUlJPUl9NRVNTQUdFfTogSW52YWxpZCBwb3J0ICR7dGhpcy5wb3J0fWApO1xuICAgIH1cbiAgfVxufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IFdyYXBwZWRGdW5jdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL2dsb2JhbCc7XG5cbi8vIFRPRE86IEltcGxlbWVudCBkaWZmZXJlbnQgbG9nZ2VycyBmb3IgZGlmZmVyZW50IGVudmlyb25tZW50c1xuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdyB8IE5vZGVKUy5HbG9iYWw+KCk7XG5cbi8qKiBQcmVmaXggZm9yIGxvZ2dpbmcgc3RyaW5ncyAqL1xuY29uc3QgUFJFRklYID0gJ1NlbnRyeSBMb2dnZXIgJztcblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgRXh0ZW5zaWJsZUNvbnNvbGUgZXh0ZW5kcyBDb25zb2xlIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIFRlbXBvcmFyaWx5IHVud3JhcCBgY29uc29sZS5sb2dgIGFuZCBmcmllbmRzIGluIG9yZGVyIHRvIHBlcmZvcm0gdGhlIGdpdmVuIGNhbGxiYWNrIHVzaW5nIHRoZSBvcmlnaW5hbCBtZXRob2RzLlxuICogUmVzdG9yZXMgd3JhcHBpbmcgYWZ0ZXIgdGhlIGNhbGxiYWNrIGNvbXBsZXRlcy5cbiAqXG4gKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIHJ1biBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBgY29uc29sZWAgbWVzc2FnZXNcbiAqIEByZXR1cm5zIFRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFja1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29uc29sZVNhbmRib3goY2FsbGJhY2s6ICgpID0+IGFueSk6IGFueSB7XG4gIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG4gIGNvbnN0IGxldmVscyA9IFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2xvZycsICdhc3NlcnQnXTtcblxuICBpZiAoISgnY29uc29sZScgaW4gZ2xvYmFsKSkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICBjb25zdCBvcmlnaW5hbENvbnNvbGUgPSAoZ2xvYmFsIGFzIGFueSkuY29uc29sZSBhcyBFeHRlbnNpYmxlQ29uc29sZTtcbiAgY29uc3Qgd3JhcHBlZExldmVsczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gIC8vIFJlc3RvcmUgYWxsIHdyYXBwZWQgY29uc29sZSBtZXRob2RzXG4gIGxldmVscy5mb3JFYWNoKGxldmVsID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgaWYgKGxldmVsIGluIChnbG9iYWwgYXMgYW55KS5jb25zb2xlICYmIChvcmlnaW5hbENvbnNvbGVbbGV2ZWxdIGFzIFdyYXBwZWRGdW5jdGlvbikuX19zZW50cnlfb3JpZ2luYWxfXykge1xuICAgICAgd3JhcHBlZExldmVsc1tsZXZlbF0gPSBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdIGFzIFdyYXBwZWRGdW5jdGlvbjtcbiAgICAgIG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gPSAob3JpZ2luYWxDb25zb2xlW2xldmVsXSBhcyBXcmFwcGVkRnVuY3Rpb24pLl9fc2VudHJ5X29yaWdpbmFsX187XG4gICAgfVxuICB9KTtcblxuICAvLyBQZXJmb3JtIGNhbGxiYWNrIG1hbmlwdWxhdGlvbnNcbiAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2soKTtcblxuICAvLyBSZXZlcnQgcmVzdG9yYXRpb24gdG8gd3JhcHBlZCBzdGF0ZVxuICBPYmplY3Qua2V5cyh3cmFwcGVkTGV2ZWxzKS5mb3JFYWNoKGxldmVsID0+IHtcbiAgICBvcmlnaW5hbENvbnNvbGVbbGV2ZWxdID0gd3JhcHBlZExldmVsc1tsZXZlbF07XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKiBKU0RvYyAqL1xuY2xhc3MgTG9nZ2VyIHtcbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2VuYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGRpc2FibGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZW5hYmxlZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBlbmFibGUoKTogdm9pZCB7XG4gICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGxvZyguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlU2FuZGJveCgoKSA9PiB7XG4gICAgICBnbG9iYWwuY29uc29sZS5sb2coYCR7UFJFRklYfVtMb2ddOiAke2FyZ3Muam9pbignICcpfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyB3YXJuKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGVTYW5kYm94KCgpID0+IHtcbiAgICAgIGdsb2JhbC5jb25zb2xlLndhcm4oYCR7UFJFRklYfVtXYXJuXTogJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgZXJyb3IoLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZVNhbmRib3goKCkgPT4ge1xuICAgICAgZ2xvYmFsLmNvbnNvbGUuZXJyb3IoYCR7UFJFRklYfVtFcnJvcl06ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLy8gRW5zdXJlIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZSBsb2dnZXIgaW5zdGFuY2UsIGV2ZW4gaWYgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQHNlbnRyeS91dGlscyBhcmUgYmVpbmcgdXNlZFxuZ2xvYmFsLl9fU0VOVFJZX18gPSBnbG9iYWwuX19TRU5UUllfXyB8fCB7fTtcbmNvbnN0IGxvZ2dlciA9IChnbG9iYWwuX19TRU5UUllfXy5sb2dnZXIgYXMgTG9nZ2VyKSB8fCAoZ2xvYmFsLl9fU0VOVFJZX18ubG9nZ2VyID0gbmV3IExvZ2dlcigpKTtcblxuZXhwb3J0IHsgbG9nZ2VyIH07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzICovXG4vKipcbiAqIE1lbW8gY2xhc3MgdXNlZCBmb3IgZGVjeWNsZSBqc29uIG9iamVjdHMuIFVzZXMgV2Vha1NldCBpZiBhdmFpbGFibGUgb3RoZXJ3aXNlIGFycmF5LlxuICovXG5leHBvcnQgY2xhc3MgTWVtbyB7XG4gIC8qKiBEZXRlcm1pbmVzIGlmIFdlYWtTZXQgaXMgYXZhaWxhYmxlICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc1dlYWtTZXQ6IGJvb2xlYW47XG4gIC8qKiBFaXRoZXIgV2Vha1NldCBvciBBcnJheSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9pbm5lcjogYW55O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9oYXNXZWFrU2V0ID0gdHlwZW9mIFdlYWtTZXQgPT09ICdmdW5jdGlvbic7XG4gICAgdGhpcy5faW5uZXIgPSB0aGlzLl9oYXNXZWFrU2V0ID8gbmV3IFdlYWtTZXQoKSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgb2JqIHRvIHJlbWVtYmVyLlxuICAgKiBAcGFyYW0gb2JqIE9iamVjdCB0byByZW1lbWJlclxuICAgKi9cbiAgcHVibGljIG1lbW9pemUob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5faGFzV2Vha1NldCkge1xuICAgICAgaWYgKHRoaXMuX2lubmVyLmhhcyhvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgdGhpcy5faW5uZXIuYWRkKG9iaik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5faW5uZXIubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5faW5uZXJbaV07XG4gICAgICBpZiAodmFsdWUgPT09IG9iaikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faW5uZXIucHVzaChvYmopO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIG9iamVjdCBmcm9tIGludGVybmFsIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIGZvcmdldFxuICAgKi9cbiAgcHVibGljIHVubWVtb2l6ZShvYmo6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9oYXNXZWFrU2V0KSB7XG4gICAgICB0aGlzLl9pbm5lci5kZWxldGUob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGhpcy5faW5uZXJbaV0gPT09IG9iaikge1xuICAgICAgICAgIHRoaXMuX2lubmVyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwgImNvbnN0IGRlZmF1bHRGdW5jdGlvbk5hbWUgPSAnPGFub255bW91cz4nO1xuXG4vKipcbiAqIFNhZmVseSBleHRyYWN0IGZ1bmN0aW9uIG5hbWUgZnJvbSBpdHNlbGZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uTmFtZShmbjogdW5rbm93bik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgaWYgKCFmbiB8fCB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBkZWZhdWx0RnVuY3Rpb25OYW1lO1xuICAgIH1cbiAgICByZXR1cm4gZm4ubmFtZSB8fCBkZWZhdWx0RnVuY3Rpb25OYW1lO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gSnVzdCBhY2Nlc3NpbmcgY3VzdG9tIHByb3BzIGluIHNvbWUgU2VsZW5pdW0gZW52aXJvbm1lbnRzXG4gICAgLy8gY2FuIGNhdXNlIGEgXCJQZXJtaXNzaW9uIGRlbmllZFwiIGV4Y2VwdGlvbiAoc2VlIHJhdmVuLWpzIzQ5NSkuXG4gICAgcmV0dXJuIGRlZmF1bHRGdW5jdGlvbk5hbWU7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBpc1JlZ0V4cCwgaXNTdHJpbmcgfSBmcm9tICcuL2lzJztcblxuLyoqXG4gKiBUcnVuY2F0ZXMgZ2l2ZW4gc3RyaW5nIHRvIHRoZSBtYXhpbXVtIGNoYXJhY3RlcnMgY291bnRcbiAqXG4gKiBAcGFyYW0gc3RyIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHNlcmlhbGl6YWJsZSB2YWx1ZXNcbiAqIEBwYXJhbSBtYXggTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0cnVuY2F0ZWQgc3RyaW5nICgwID0gdW5saW1pdGVkKVxuICogQHJldHVybnMgc3RyaW5nIEVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlKHN0cjogc3RyaW5nLCBtYXg6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycgfHwgbWF4ID09PSAwKSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxuICByZXR1cm4gc3RyLmxlbmd0aCA8PSBtYXggPyBzdHIgOiBgJHtzdHIuc3Vic3RyKDAsIG1heCl9Li4uYDtcbn1cblxuLyoqXG4gKiBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGB0cmltX2xpbmVgIGZyb21cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5L2Jsb2IvbWFzdGVyL3NyYy9zZW50cnkvbGFuZy9qYXZhc2NyaXB0L3Byb2Nlc3Nvci5weSNMNjdcbiAqXG4gKiBAcGFyYW0gc3RyIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHNlcmlhbGl6YWJsZSB2YWx1ZXNcbiAqIEBwYXJhbSBtYXggTWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0cnVuY2F0ZWQgc3RyaW5nXG4gKiBAcmV0dXJucyBzdHJpbmcgRW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc25pcExpbmUobGluZTogc3RyaW5nLCBjb2xubzogbnVtYmVyKTogc3RyaW5nIHtcbiAgbGV0IG5ld0xpbmUgPSBsaW5lO1xuICBjb25zdCBsbCA9IG5ld0xpbmUubGVuZ3RoO1xuICBpZiAobGwgPD0gMTUwKSB7XG4gICAgcmV0dXJuIG5ld0xpbmU7XG4gIH1cbiAgaWYgKGNvbG5vID4gbGwpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBjb2xubyA9IGxsO1xuICB9XG5cbiAgbGV0IHN0YXJ0ID0gTWF0aC5tYXgoY29sbm8gLSA2MCwgMCk7XG4gIGlmIChzdGFydCA8IDUpIHtcbiAgICBzdGFydCA9IDA7XG4gIH1cblxuICBsZXQgZW5kID0gTWF0aC5taW4oc3RhcnQgKyAxNDAsIGxsKTtcbiAgaWYgKGVuZCA+IGxsIC0gNSkge1xuICAgIGVuZCA9IGxsO1xuICB9XG4gIGlmIChlbmQgPT09IGxsKSB7XG4gICAgc3RhcnQgPSBNYXRoLm1heChlbmQgLSAxNDAsIDApO1xuICB9XG5cbiAgbmV3TGluZSA9IG5ld0xpbmUuc2xpY2Uoc3RhcnQsIGVuZCk7XG4gIGlmIChzdGFydCA+IDApIHtcbiAgICBuZXdMaW5lID0gYCd7c25pcH0gJHtuZXdMaW5lfWA7XG4gIH1cbiAgaWYgKGVuZCA8IGxsKSB7XG4gICAgbmV3TGluZSArPSAnIHtzbmlwfSc7XG4gIH1cblxuICByZXR1cm4gbmV3TGluZTtcbn1cblxuLyoqXG4gKiBKb2luIHZhbHVlcyBpbiBhcnJheVxuICogQHBhcmFtIGlucHV0IGFycmF5IG9mIHZhbHVlcyB0byBiZSBqb2luZWQgdG9nZXRoZXJcbiAqIEBwYXJhbSBkZWxpbWl0ZXIgc3RyaW5nIHRvIGJlIHBsYWNlZCBpbi1iZXR3ZWVuIHZhbHVlc1xuICogQHJldHVybnMgSm9pbmVkIHZhbHVlc1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIHNhZmVKb2luKGlucHV0OiBhbnlbXSwgZGVsaW1pdGVyPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IG91dHB1dCA9IFtdO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlID0gaW5wdXRbaV07XG4gICAgdHJ5IHtcbiAgICAgIG91dHB1dC5wdXNoKFN0cmluZyh2YWx1ZSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG91dHB1dC5wdXNoKCdbdmFsdWUgY2Fubm90IGJlIHNlcmlhbGl6ZWRdJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dC5qb2luKGRlbGltaXRlcik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSB2YWx1ZSBtYXRjaGVzIGEgcmVnZXggb3IgaW5jbHVkZXMgdGhlIHN0cmluZ1xuICogQHBhcmFtIHZhbHVlIFRoZSBzdHJpbmcgdmFsdWUgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0XG4gKiBAcGFyYW0gcGF0dGVybiBFaXRoZXIgYSByZWdleCBvciBhIHN0cmluZyB0aGF0IG11c3QgYmUgY29udGFpbmVkIGluIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc01hdGNoaW5nUGF0dGVybih2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuOiBSZWdFeHAgfCBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNSZWdFeHAocGF0dGVybikpIHtcbiAgICByZXR1cm4gKHBhdHRlcm4gYXMgUmVnRXhwKS50ZXN0KHZhbHVlKTtcbiAgfVxuICBpZiAodHlwZW9mIHBhdHRlcm4gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlLmluZGV4T2YocGF0dGVybikgIT09IC0xO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBHaXZlbiBhIHN0cmluZywgZXNjYXBlIGNoYXJhY3RlcnMgd2hpY2ggaGF2ZSBtZWFuaW5nIGluIHRoZSByZWdleCBncmFtbWFyLCBzdWNoIHRoYXQgdGhlIHJlc3VsdCBpcyBzYWZlIHRvIGZlZWQgdG9cbiAqIGBuZXcgUmVnRXhwKClgLlxuICpcbiAqIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZXNjYXBlLXN0cmluZy1yZWdleHAuIFZlbmRvcmVkIHRvIGEpIHJlZHVjZSB0aGUgc2l6ZSBieSBza2lwcGluZyB0aGUgcnVudGltZVxuICogdHlwZS1jaGVja2luZywgYW5kIGIpIGVuc3VyZSBpdCBnZXRzIGRvd24tY29tcGlsZWQgZm9yIG9sZCB2ZXJzaW9ucyBvZiBOb2RlICh0aGUgcHVibGlzaGVkIHBhY2thZ2Ugb25seSBzdXBwb3J0cyBOb2RlXG4gKiAxMispLlxuICpcbiAqIEBwYXJhbSByZWdleFN0cmluZyBUaGUgc3RyaW5nIHRvIGVzY2FwZVxuICogQHJldHVybnMgQW4gdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHNwZWNpYWwgcmVnZXggY2hhcmFjdGVycyBlc2NhcGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVTdHJpbmdGb3JSZWdleChyZWdleFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gZXNjYXBlIHRoZSBoeXBoZW4gc2VwYXJhdGVseSBzbyB3ZSBjYW4gYWxzbyByZXBsYWNlIGl0IHdpdGggYSB1bmljb2RlIGxpdGVyYWwgaHlwaGVuLCB0byBhdm9pZCB0aGUgcHJvYmxlbXNcbiAgLy8gZGlzY3Vzc2VkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZXNjYXBlLXN0cmluZy1yZWdleHAvaXNzdWVzLzIwLlxuICByZXR1cm4gcmVnZXhTdHJpbmcucmVwbGFjZSgvW3xcXFxce30oKVtcXF1eJCsqPy5dL2csICdcXFxcJCYnKS5yZXBsYWNlKC8tL2csICdcXFxceDJkJyk7XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbWF4LWxpbmVzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBFeHRlbmRlZEVycm9yLCBXcmFwcGVkRnVuY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuaW1wb3J0IHsgaHRtbFRyZWVBc1N0cmluZyB9IGZyb20gJy4vYnJvd3Nlcic7XG5pbXBvcnQgeyBpc0VsZW1lbnQsIGlzRXJyb3IsIGlzRXZlbnQsIGlzSW5zdGFuY2VPZiwgaXNQbGFpbk9iamVjdCwgaXNQcmltaXRpdmUsIGlzU3ludGhldGljRXZlbnQgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IE1lbW8gfSBmcm9tICcuL21lbW8nO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25OYW1lIH0gZnJvbSAnLi9zdGFja3RyYWNlJztcbmltcG9ydCB7IHRydW5jYXRlIH0gZnJvbSAnLi9zdHJpbmcnO1xuXG4vKipcbiAqIFJlcGxhY2UgYSBtZXRob2QgaW4gYW4gb2JqZWN0IHdpdGggYSB3cmFwcGVkIHZlcnNpb24gb2YgaXRzZWxmLlxuICpcbiAqIEBwYXJhbSBzb3VyY2UgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBtZXRob2QgdG8gYmUgd3JhcHBlZC5cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gYmUgd3JhcHBlZC5cbiAqIEBwYXJhbSByZXBsYWNlbWVudEZhY3RvcnkgQSBoaWdoZXItb3JkZXIgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgZ2l2ZW4gbWV0aG9kIGFuZCByZXR1cm5zIGFcbiAqIHdyYXBwZWQgdmVyc2lvbi4gTm90ZTogVGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IGByZXBsYWNlbWVudEZhY3RvcnlgIG5lZWRzIHRvIGJlIGEgbm9uLWFycm93IGZ1bmN0aW9uLCBpbiBvcmRlciB0b1xuICogcHJlc2VydmUgdGhlIGNvcnJlY3QgdmFsdWUgb2YgYHRoaXNgLCBhbmQgdGhlIG9yaWdpbmFsIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB1c2luZyBgb3JpZ01ldGhvZC5jYWxsKHRoaXMsIDxvdGhlclxuICogYXJncz4pYCBvciBgb3JpZ01ldGhvZC5hcHBseSh0aGlzLCBbPG90aGVyIGFyZ3M+XSlgIChyYXRoZXIgdGhhbiBiZWluZyBjYWxsZWQgZGlyZWN0bHkpLCBhZ2FpbiB0byBwcmVzZXJ2ZSBgdGhpc2AuXG4gKiBAcmV0dXJucyB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsKHNvdXJjZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgbmFtZTogc3RyaW5nLCByZXBsYWNlbWVudEZhY3Rvcnk6ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55KTogdm9pZCB7XG4gIGlmICghKG5hbWUgaW4gc291cmNlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsID0gc291cmNlW25hbWVdIGFzICgpID0+IGFueTtcbiAgY29uc3Qgd3JhcHBlZCA9IHJlcGxhY2VtZW50RmFjdG9yeShvcmlnaW5hbCkgYXMgV3JhcHBlZEZ1bmN0aW9uO1xuXG4gIC8vIE1ha2Ugc3VyZSBpdCdzIGEgZnVuY3Rpb24gZmlyc3QsIGFzIHdlIG5lZWQgdG8gYXR0YWNoIGFuIGVtcHR5IHByb3RvdHlwZSBmb3IgYGRlZmluZVByb3BlcnRpZXNgIHRvIHdvcmtcbiAgLy8gb3RoZXJ3aXNlIGl0J2xsIHRocm93IFwiVHlwZUVycm9yOiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyBjYWxsZWQgb24gbm9uLW9iamVjdFwiXG4gIGlmICh0eXBlb2Ygd3JhcHBlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRyeSB7XG4gICAgICB3cmFwcGVkLnByb3RvdHlwZSA9IHdyYXBwZWQucHJvdG90eXBlIHx8IHt9O1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod3JhcHBlZCwge1xuICAgICAgICBfX3NlbnRyeV9vcmlnaW5hbF9fOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgdmFsdWU6IG9yaWdpbmFsLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoX09vKSB7XG4gICAgICAvLyBUaGlzIGNhbiB0aHJvdyBpZiBtdWx0aXBsZSBmaWxsIGhhcHBlbnMgb24gYSBnbG9iYWwgb2JqZWN0IGxpa2UgWE1MSHR0cFJlcXVlc3RcbiAgICAgIC8vIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzIwNDNcbiAgICB9XG4gIH1cblxuICBzb3VyY2VbbmFtZV0gPSB3cmFwcGVkO1xufVxuXG4vKipcbiAqIEVuY29kZXMgZ2l2ZW4gb2JqZWN0IGludG8gdXJsLWZyaWVuZGx5IGZvcm1hdFxuICpcbiAqIEBwYXJhbSBvYmplY3QgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHJldHVybnMgc3RyaW5nIEVuY29kZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybEVuY29kZShvYmplY3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqZWN0KVxuICAgIC5tYXAoa2V5ID0+IGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudChvYmplY3Rba2V5XSl9YClcbiAgICAuam9pbignJicpO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW55IG9iamVjdCBpbnRvIGFuIG9iamVjdCBsaXRlcmFsIHdpdGggYWxsIGl0cyBhdHRyaWJ1dGVzXG4gKiBhdHRhY2hlZCB0byBpdC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgSW5pdGlhbCBzb3VyY2UgdGhhdCB3ZSBoYXZlIHRvIHRyYW5zZm9ybSBpbiBvcmRlciBmb3IgaXQgdG8gYmUgdXNhYmxlIGJ5IHRoZSBzZXJpYWxpemVyXG4gKi9cbmZ1bmN0aW9uIGdldFdhbGtTb3VyY2UoXG4gIHZhbHVlOiBhbnksXG4pOiB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn0ge1xuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBjb25zdCBlcnJvciA9IHZhbHVlIGFzIEV4dGVuZGVkRXJyb3I7XG4gICAgY29uc3QgZXJyOiB7XG4gICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICBzdGFjazogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgIH0gPSB7XG4gICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBpIGluIGVycm9yKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVycm9yLCBpKSkge1xuICAgICAgICBlcnJbaV0gPSBlcnJvcltpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZXJyO1xuICB9XG5cbiAgaWYgKGlzRXZlbnQodmFsdWUpKSB7XG4gICAgLyoqXG4gICAgICogRXZlbnQtbGlrZSBpbnRlcmZhY2UgdGhhdCdzIHVzYWJsZSBpbiBicm93c2VyIGFuZCBub2RlXG4gICAgICovXG4gICAgaW50ZXJmYWNlIFNpbXBsZUV2ZW50IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICB0YXJnZXQ/OiB1bmtub3duO1xuICAgICAgY3VycmVudFRhcmdldD86IHVua25vd247XG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnQgPSB2YWx1ZSBhcyBTaW1wbGVFdmVudDtcblxuICAgIGNvbnN0IHNvdXJjZToge1xuICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgIH0gPSB7fTtcblxuICAgIC8vIEFjY2Vzc2luZyBldmVudCBhdHRyaWJ1dGVzIGNhbiB0aHJvdyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzc2OCBhbmRcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy84MzgpLCBidXQgYWNjZXNzaW5nIGB0eXBlYCBoYXNuJ3QgYmVlbiB3cmFwcGVkIGluIGFcbiAgICAvLyB0cnktY2F0Y2ggaW4gYXQgbGVhc3QgdHdvIHllYXJzIGFuZCBubyBvbmUncyBjb21wbGFpbmVkLCBzbyB0aGF0J3MgbGlrZWx5IG5vdCBhbiBpc3N1ZSBhbnltb3JlXG4gICAgc291cmNlLnR5cGUgPSBldmVudC50eXBlO1xuXG4gICAgdHJ5IHtcbiAgICAgIHNvdXJjZS50YXJnZXQgPSBpc0VsZW1lbnQoZXZlbnQudGFyZ2V0KVxuICAgICAgICA/IGh0bWxUcmVlQXNTdHJpbmcoZXZlbnQudGFyZ2V0KVxuICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChldmVudC50YXJnZXQpO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgc291cmNlLnRhcmdldCA9ICc8dW5rbm93bj4nO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBzb3VyY2UuY3VycmVudFRhcmdldCA9IGlzRWxlbWVudChldmVudC5jdXJyZW50VGFyZ2V0KVxuICAgICAgICA/IGh0bWxUcmVlQXNTdHJpbmcoZXZlbnQuY3VycmVudFRhcmdldClcbiAgICAgICAgOiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICBzb3VyY2UuY3VycmVudFRhcmdldCA9ICc8dW5rbm93bj4nO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgQ3VzdG9tRXZlbnQgIT09ICd1bmRlZmluZWQnICYmIGlzSW5zdGFuY2VPZih2YWx1ZSwgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICBzb3VyY2UuZGV0YWlsID0gZXZlbnQuZGV0YWlsO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgYXR0ciBpbiBldmVudCkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChldmVudCwgYXR0cikpIHtcbiAgICAgICAgc291cmNlW2F0dHJdID0gZXZlbnRbYXR0cl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZSBhcyB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xufVxuXG4vKiogQ2FsY3VsYXRlcyBieXRlcyBzaXplIG9mIGlucHV0IHN0cmluZyAqL1xuZnVuY3Rpb24gdXRmOExlbmd0aCh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgcmV0dXJuIH4tZW5jb2RlVVJJKHZhbHVlKS5zcGxpdCgvJS4ufC4vKS5sZW5ndGg7XG59XG5cbi8qKiBDYWxjdWxhdGVzIGJ5dGVzIHNpemUgb2YgaW5wdXQgb2JqZWN0ICovXG5mdW5jdGlvbiBqc29uU2l6ZSh2YWx1ZTogYW55KTogbnVtYmVyIHtcbiAgcmV0dXJuIHV0ZjhMZW5ndGgoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbn1cblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVG9TaXplPFQ+KFxuICBvYmplY3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gIC8vIERlZmF1bHQgTm9kZS5qcyBSRVBMIGRlcHRoXG4gIGRlcHRoOiBudW1iZXIgPSAzLFxuICAvLyAxMDBrQiwgYXMgMjAwa0IgaXMgbWF4IHBheWxvYWQgc2l6ZSwgc28gaGFsZiBzb3VuZHMgcmVhc29uYWJsZVxuICBtYXhTaXplOiBudW1iZXIgPSAxMDAgKiAxMDI0LFxuKTogVCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBub3JtYWxpemUob2JqZWN0LCBkZXB0aCk7XG5cbiAgaWYgKGpzb25TaXplKHNlcmlhbGl6ZWQpID4gbWF4U2l6ZSkge1xuICAgIHJldHVybiBub3JtYWxpemVUb1NpemUob2JqZWN0LCBkZXB0aCAtIDEsIG1heFNpemUpO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWQgYXMgVDtcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW55IG5vbi1wcmltaXRpdmUsIEJpZ0ludCwgb3IgU3ltYm9sLXR5cGUgdmFsdWUgaW50byBhIHN0cmluZy4gQWN0cyBhcyBhIG5vLW9wIG9uIHN0cmluZ3MsIG51bWJlcnMsXG4gKiBib29sZWFucywgbnVsbCwgYW5kIHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHN0cmluZ2lmeVxuICogQHJldHVybnMgRm9yIG5vbi1wcmltaXRpdmUsIEJpZ0ludCwgYW5kIFN5bWJvbC10eXBlIHZhbHVlcywgYSBzdHJpbmcgZGVub3RpbmcgdGhlIHZhbHVlJ3MgdHlwZSwgdHlwZSBhbmQgdmFsdWUsIG9yXG4gKiAgdHlwZSBhbmQgYGRlc2NyaXB0aW9uYCBwcm9wZXJ0eSwgcmVzcGVjdGl2ZWx5LiBGb3Igbm9uLUJpZ0ludCwgbm9uLVN5bWJvbCBwcmltaXRpdmVzLCByZXR1cm5zIHRoZSBvcmlnaW5hbCB2YWx1ZSxcbiAqICB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIHNlcmlhbGl6ZVZhbHVlKHZhbHVlOiBhbnkpOiBhbnkge1xuICBjb25zdCB0eXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcblxuICAvLyBOb2RlLmpzIFJFUEwgbm90YXRpb25cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IE9iamVjdF0nKSB7XG4gICAgcmV0dXJuICdbT2JqZWN0XSc7XG4gIH1cbiAgaWYgKHR5cGUgPT09ICdbb2JqZWN0IEFycmF5XScpIHtcbiAgICByZXR1cm4gJ1tBcnJheV0nO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlKTtcbiAgcmV0dXJuIGlzUHJpbWl0aXZlKG5vcm1hbGl6ZWQpID8gbm9ybWFsaXplZCA6IHR5cGU7XG59XG5cbi8qKlxuICogbm9ybWFsaXplVmFsdWUoKVxuICpcbiAqIFRha2VzIHVuc2VyaWFsaXphYmxlIGlucHV0IGFuZCBtYWtlIGl0IHNlcmlhbGl6YWJsZSBmcmllbmRseVxuICpcbiAqIC0gdHJhbnNsYXRlcyB1bmRlZmluZWQvTmFOIHZhbHVlcyB0byBcIlt1bmRlZmluZWRdXCIvXCJbTmFOXVwiIHJlc3BlY3RpdmVseSxcbiAqIC0gc2VyaWFsaXplcyBFcnJvciBvYmplY3RzXG4gKiAtIGZpbHRlciBnbG9iYWwgb2JqZWN0c1xuICovXG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZTxUPih2YWx1ZTogVCwga2V5PzogYW55KTogVCB8IHN0cmluZyB7XG4gIGlmIChrZXkgPT09ICdkb21haW4nICYmIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgKCh2YWx1ZSBhcyB1bmtub3duKSBhcyB7IF9ldmVudHM6IGFueSB9KS5fZXZlbnRzKSB7XG4gICAgcmV0dXJuICdbRG9tYWluXSc7XG4gIH1cblxuICBpZiAoa2V5ID09PSAnZG9tYWluRW1pdHRlcicpIHtcbiAgICByZXR1cm4gJ1tEb21haW5FbWl0dGVyXSc7XG4gIH1cblxuICBpZiAodHlwZW9mIChnbG9iYWwgYXMgYW55KSAhPT0gJ3VuZGVmaW5lZCcgJiYgKHZhbHVlIGFzIHVua25vd24pID09PSBnbG9iYWwpIHtcbiAgICByZXR1cm4gJ1tHbG9iYWxdJztcbiAgfVxuXG4gIC8vIEl0J3Mgc2FmZSB0byB1c2UgYHdpbmRvd2AgYW5kIGBkb2N1bWVudGAgaGVyZSBpbiB0aGlzIG1hbm5lciwgYXMgd2UgYXJlIGFzc2VydGluZyB1c2luZyBgdHlwZW9mYCBmaXJzdFxuICAvLyB3aGljaCB3b24ndCB0aHJvdyBpZiB0aGV5IGFyZSBub3QgcHJlc2VudC5cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gIGlmICh0eXBlb2YgKHdpbmRvdyBhcyBhbnkpICE9PSAndW5kZWZpbmVkJyAmJiAodmFsdWUgYXMgdW5rbm93bikgPT09IHdpbmRvdykge1xuICAgIHJldHVybiAnW1dpbmRvd10nO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICBpZiAodHlwZW9mIChkb2N1bWVudCBhcyBhbnkpICE9PSAndW5kZWZpbmVkJyAmJiAodmFsdWUgYXMgdW5rbm93bikgPT09IGRvY3VtZW50KSB7XG4gICAgcmV0dXJuICdbRG9jdW1lbnRdJztcbiAgfVxuXG4gIC8vIFJlYWN0J3MgU3ludGhldGljRXZlbnQgdGhpbmd5XG4gIGlmIChpc1N5bnRoZXRpY0V2ZW50KHZhbHVlKSkge1xuICAgIHJldHVybiAnW1N5bnRoZXRpY0V2ZW50XSc7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB2YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICByZXR1cm4gJ1tOYU5dJztcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgcmV0dXJuICdbdW5kZWZpbmVkXSc7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGBbRnVuY3Rpb246ICR7Z2V0RnVuY3Rpb25OYW1lKHZhbHVlKX1dYDtcbiAgfVxuXG4gIC8vIHN5bWJvbHMgYW5kIGJpZ2ludHMgYXJlIGNvbnNpZGVyZWQgcHJpbWl0aXZlcyBieSBUUywgYnV0IGFyZW4ndCBuYXRpdmVseSBKU09OLXNlcmlsYWl6YWJsZVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnKSB7XG4gICAgcmV0dXJuIGBbJHtTdHJpbmcodmFsdWUpfV1gO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYFtCaWdJbnQ6ICR7U3RyaW5nKHZhbHVlKX1dYDtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBXYWxrcyBhbiBvYmplY3QgdG8gcGVyZm9ybSBhIG5vcm1hbGl6YXRpb24gb24gaXRcbiAqXG4gKiBAcGFyYW0ga2V5IG9mIG9iamVjdCB0aGF0J3Mgd2Fsa2VkIGluIGN1cnJlbnQgaXRlcmF0aW9uXG4gKiBAcGFyYW0gdmFsdWUgb2JqZWN0IHRvIGJlIHdhbGtlZFxuICogQHBhcmFtIGRlcHRoIE9wdGlvbmFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBkZWVwIHNob3VsZCB3YWxraW5nIGJlIHBlcmZvcm1lZFxuICogQHBhcmFtIG1lbW8gT3B0aW9uYWwgTWVtbyBjbGFzcyBoYW5kbGluZyBkZWN5Y2xpbmdcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiB3YWxrKGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBkZXB0aDogbnVtYmVyID0gK0luZmluaXR5LCBtZW1vOiBNZW1vID0gbmV3IE1lbW8oKSk6IGFueSB7XG4gIC8vIElmIHdlIHJlYWNoIHRoZSBtYXhpbXVtIGRlcHRoLCBzZXJpYWxpemUgd2hhdGV2ZXIgaGFzIGxlZnRcbiAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZVZhbHVlKHZhbHVlKTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAvLyBJZiB2YWx1ZSBpbXBsZW1lbnRzIGB0b0pTT05gIG1ldGhvZCwgY2FsbCBpdCBhbmQgcmV0dXJuIGVhcmx5XG4gIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZS50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdmFsdWUudG9KU09OKCk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cblxuICAvLyBJZiBub3JtYWxpemVkIHZhbHVlIGlzIGEgcHJpbWl0aXZlLCB0aGVyZSBhcmUgbm8gYnJhbmNoZXMgbGVmdCB0byB3YWxrLCBzbyB3ZSBjYW4ganVzdCBiYWlsIG91dCwgYXMgdGhlcmVzIG5vIHBvaW50IGluIGdvaW5nIGRvd24gdGhhdCBicmFuY2ggYW55IGZ1cnRoZXJcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVZhbHVlKHZhbHVlLCBrZXkpO1xuICBpZiAoaXNQcmltaXRpdmUobm9ybWFsaXplZCkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgfVxuXG4gIC8vIENyZWF0ZSBzb3VyY2UgdGhhdCB3ZSB3aWxsIHVzZSBmb3IgbmV4dCBpdHRlcmF0aW9ucywgZWl0aGVyIG9iamVjdGlmaWVkIGVycm9yIG9iamVjdCAoRXJyb3IgdHlwZSB3aXRoIGV4dHJhY3RlZCBrZXlzOnZhbHVlIHBhaXJzKSBvciB0aGUgaW5wdXQgaXRzZWxmXG4gIGNvbnN0IHNvdXJjZSA9IGdldFdhbGtTb3VyY2UodmFsdWUpO1xuXG4gIC8vIENyZWF0ZSBhbiBhY2N1bXVsYXRvciB0aGF0IHdpbGwgYWN0IGFzIGEgcGFyZW50IGZvciBhbGwgZnV0dXJlIGl0dGVyYXRpb25zIG9mIHRoYXQgYnJhbmNoXG4gIGNvbnN0IGFjYyA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gW10gOiB7fTtcblxuICAvLyBJZiB3ZSBhbHJlYWR5IHdhbGtlZCB0aGF0IGJyYW5jaCwgYmFpbCBvdXQsIGFzIGl0J3MgY2lyY3VsYXIgcmVmZXJlbmNlXG4gIGlmIChtZW1vLm1lbW9pemUodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbQ2lyY3VsYXIgfl0nO1xuICB9XG5cbiAgLy8gV2FsayBhbGwga2V5cyBvZiB0aGUgc291cmNlXG4gIGZvciAoY29uc3QgaW5uZXJLZXkgaW4gc291cmNlKSB7XG4gICAgLy8gQXZvaWQgaXRlcmF0aW5nIG92ZXIgZmllbGRzIGluIHRoZSBwcm90b3R5cGUgaWYgdGhleSd2ZSBzb21laG93IGJlZW4gZXhwb3NlZCB0byBlbnVtZXJhdGlvbi5cbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGlubmVyS2V5KSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIFJlY3Vyc2l2ZWx5IHdhbGsgdGhyb3VnaCBhbGwgdGhlIGNoaWxkIG5vZGVzXG4gICAgKGFjYyBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KVtpbm5lcktleV0gPSB3YWxrKGlubmVyS2V5LCBzb3VyY2VbaW5uZXJLZXldLCBkZXB0aCAtIDEsIG1lbW8pO1xuICB9XG5cbiAgLy8gT25jZSB3YWxrZWQgdGhyb3VnaCBhbGwgdGhlIGJyYW5jaGVzLCByZW1vdmUgdGhlIHBhcmVudCBmcm9tIG1lbW8gc3RvcmFnZVxuICBtZW1vLnVubWVtb2l6ZSh2YWx1ZSk7XG5cbiAgLy8gUmV0dXJuIGFjY3VtdWxhdGVkIHZhbHVlc1xuICByZXR1cm4gYWNjO1xufVxuXG4vKipcbiAqIG5vcm1hbGl6ZSgpXG4gKlxuICogLSBDcmVhdGVzIGEgY29weSB0byBwcmV2ZW50IG9yaWdpbmFsIGlucHV0IG11dGF0aW9uXG4gKiAtIFNraXAgbm9uLWVudW1lcmFibGVyc1xuICogLSBDYWxscyBgdG9KU09OYCBpZiBpbXBsZW1lbnRlZFxuICogLSBSZW1vdmVzIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAqIC0gVHJhbnNsYXRlcyBub24tc2VyaWFsaXplYWJsZSB2YWx1ZXMgKHVuZGVmaW5lZC9OYU4vRnVuY3Rpb25zKSB0byBzZXJpYWxpemFibGUgZm9ybWF0XG4gKiAtIFRyYW5zbGF0ZXMga25vd24gZ2xvYmFsIG9iamVjdHMvQ2xhc3NlcyB0byBhIHN0cmluZyByZXByZXNlbnRhdGlvbnNcbiAqIC0gVGFrZXMgY2FyZSBvZiBFcnJvciBvYmplY3RzIHNlcmlhbGl6YXRpb25cbiAqIC0gT3B0aW9uYWxseSBsaW1pdCBkZXB0aCBvZiBmaW5hbCBvdXRwdXRcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemUoaW5wdXQ6IGFueSwgZGVwdGg/OiBudW1iZXIpOiBhbnkge1xuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGlucHV0LCAoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHdhbGsoa2V5LCB2YWx1ZSwgZGVwdGgpKSk7XG4gIH0gY2F0Y2ggKF9vTykge1xuICAgIHJldHVybiAnKipub24tc2VyaWFsaXphYmxlKionO1xuICB9XG59XG5cbi8qKlxuICogR2l2ZW4gYW55IGNhcHR1cmVkIGV4Y2VwdGlvbiwgZXh0cmFjdCBpdHMga2V5cyBhbmQgY3JlYXRlIGEgc29ydGVkXG4gKiBhbmQgdHJ1bmNhdGVkIGxpc3QgdGhhdCB3aWxsIGJlIHVzZWQgaW5zaWRlIHRoZSBldmVudCBtZXNzYWdlLlxuICogZWcuIGBOb24tZXJyb3IgZXhjZXB0aW9uIGNhcHR1cmVkIHdpdGgga2V5czogZm9vLCBiYXIsIGJhemBcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0RXhjZXB0aW9uS2V5c0Zvck1lc3NhZ2UoZXhjZXB0aW9uOiBhbnksIG1heExlbmd0aDogbnVtYmVyID0gNDApOiBzdHJpbmcge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZ2V0V2Fsa1NvdXJjZShleGNlcHRpb24pKTtcbiAga2V5cy5zb3J0KCk7XG5cbiAgaWYgKCFrZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnW29iamVjdCBoYXMgbm8ga2V5c10nO1xuICB9XG5cbiAgaWYgKGtleXNbMF0ubGVuZ3RoID49IG1heExlbmd0aCkge1xuICAgIHJldHVybiB0cnVuY2F0ZShrZXlzWzBdLCBtYXhMZW5ndGgpO1xuICB9XG5cbiAgZm9yIChsZXQgaW5jbHVkZWRLZXlzID0ga2V5cy5sZW5ndGg7IGluY2x1ZGVkS2V5cyA+IDA7IGluY2x1ZGVkS2V5cy0tKSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGtleXMuc2xpY2UoMCwgaW5jbHVkZWRLZXlzKS5qb2luKCcsICcpO1xuICAgIGlmIChzZXJpYWxpemVkLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChpbmNsdWRlZEtleXMgPT09IGtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgcmV0dXJuIHRydW5jYXRlKHNlcmlhbGl6ZWQsIG1heExlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogR2l2ZW4gYW55IG9iamVjdCwgcmV0dXJuIHRoZSBuZXcgb2JqZWN0IHdpdGggcmVtb3ZlZCBrZXlzIHRoYXQgdmFsdWUgd2FzIGB1bmRlZmluZWRgLlxuICogV29ya3MgcmVjdXJzaXZlbHkgb24gb2JqZWN0cyBhbmQgYXJyYXlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZHJvcFVuZGVmaW5lZEtleXM8VD4odmFsOiBUKTogVCB7XG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbCkpIHtcbiAgICBjb25zdCBvYmogPSB2YWwgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBjb25zdCBydjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgIGlmICh0eXBlb2Ygb2JqW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJ2W2tleV0gPSBkcm9wVW5kZWZpbmVkS2V5cyhvYmpba2V5XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBydiBhcyBUO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHJldHVybiAodmFsIGFzIGFueVtdKS5tYXAoZHJvcFVuZGVmaW5lZEtleXMpIGFzIGFueTtcbiAgfVxuXG4gIHJldHVybiB2YWw7XG59XG5cbi8qKlxuICogRW5zdXJlIHRoYXQgc29tZXRoaW5nIGlzIGFuIG9iamVjdC5cbiAqXG4gKiBUdXJucyBgdW5kZWZpbmVkYCBhbmQgYG51bGxgIGludG8gYFN0cmluZ2BzIGFuZCBhbGwgb3RoZXIgcHJpbWl0aXZlcyBpbnRvIGluc3RhbmNlcyBvZiB0aGVpciByZXNwZWN0aXZlIHdyYXBwZXJcbiAqIGNsYXNzZXMgKFN0cmluZywgQm9vbGVhbiwgTnVtYmVyLCBldGMuKS4gQWN0cyBhcyB0aGUgaWRlbnRpdHkgZnVuY3Rpb24gb24gbm9uLXByaW1pdGl2ZXMuXG4gKlxuICogQHBhcmFtIHdhdCBUaGUgc3ViamVjdCBvZiB0aGUgb2JqZWN0aWZpY2F0aW9uXG4gKiBAcmV0dXJucyBBIHZlcnNpb24gb2YgYHdhdGAgd2hpY2ggY2FuIHNhZmVseSBiZSB1c2VkIHdpdGggYE9iamVjdGAgY2xhc3MgbWV0aG9kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0aWZ5KHdhdDogdW5rbm93bik6IHR5cGVvZiBPYmplY3Qge1xuICBsZXQgb2JqZWN0aWZpZWQ7XG4gIHN3aXRjaCAodHJ1ZSkge1xuICAgIGNhc2Ugd2F0ID09PSB1bmRlZmluZWQgfHwgd2F0ID09PSBudWxsOlxuICAgICAgb2JqZWN0aWZpZWQgPSBuZXcgU3RyaW5nKHdhdCk7XG4gICAgICBicmVhaztcblxuICAgIC8vIFRob3VnaCBzeW1ib2xzIGFuZCBiaWdpbnRzIGRvIGhhdmUgd3JhcHBlciBjbGFzc2VzIChgU3ltYm9sYCBhbmQgYEJpZ0ludGAsIHJlc3BlY3RpdmVseSksIGZvciB3aGF0ZXZlciByZWFzb25cbiAgICAvLyB0aG9zZSBjbGFzc2VzIGRvbid0IGhhdmUgY29uc3RydWN0b3JzIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlIGBuZXdgIGtleXdvcmQuIFdlIHRoZXJlZm9yZSBuZWVkIHRvIGNhc3QgZWFjaCBhc1xuICAgIC8vIGFuIG9iamVjdCBpbiBvcmRlciB0byB3cmFwIGl0LlxuICAgIGNhc2UgdHlwZW9mIHdhdCA9PT0gJ3N5bWJvbCcgfHwgdHlwZW9mIHdhdCA9PT0gJ2JpZ2ludCc6XG4gICAgICBvYmplY3RpZmllZCA9IE9iamVjdCh3YXQpO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyB0aGlzIHdpbGwgY2F0Y2ggdGhlIHJlbWFpbmluZyBwcmltaXRpdmVzOiBgU3RyaW5nYCwgYE51bWJlcmAsIGFuZCBgQm9vbGVhbmBcbiAgICBjYXNlIGlzUHJpbWl0aXZlKHdhdCk6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICBvYmplY3RpZmllZCA9IG5ldyAod2F0IGFzIGFueSkuY29uc3RydWN0b3Iod2F0KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gYnkgcHJvY2VzcyBvZiBlbGltaW5hdGlvbiwgYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgYHdhdGAgbXVzdCBhbHJlYWR5IGJlIGFuIG9iamVjdFxuICAgIGRlZmF1bHQ6XG4gICAgICBvYmplY3RpZmllZCA9IHdhdDtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBvYmplY3RpZmllZDtcbn1cbiIsICJpbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIEVycm9yRXZlbnQgb2JqZWN0c1xuICoge0BsaW5rIHN1cHBvcnRzRXJyb3JFdmVudH0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRXJyb3JFdmVudCgpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBuZXcgRXJyb3JFdmVudCgnJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRE9NRXJyb3Igb2JqZWN0c1xuICoge0BsaW5rIHN1cHBvcnRzRE9NRXJyb3J9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0RPTUVycm9yKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIC8vIENocm9tZTogVk04OToxIFVuY2F1Z2h0IFR5cGVFcnJvcjogRmFpbGVkIHRvIGNvbnN0cnVjdCAnRE9NRXJyb3InOlxuICAgIC8vIDEgYXJndW1lbnQgcmVxdWlyZWQsIGJ1dCBvbmx5IDAgcHJlc2VudC5cbiAgICAvLyBAdHMtaWdub3JlIEl0IHJlYWxseSBuZWVkcyAxIGFyZ3VtZW50LCBub3QgMC5cbiAgICBuZXcgRE9NRXJyb3IoJycpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIERPTUV4Y2VwdGlvbiBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNET01FeGNlcHRpb259LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0RPTUV4Y2VwdGlvbigpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBuZXcgRE9NRXhjZXB0aW9uKCcnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBGZXRjaCBBUElcbiAqIHtAbGluayBzdXBwb3J0c0ZldGNofS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNGZXRjaCgpOiBib29sZWFuIHtcbiAgaWYgKCEoJ2ZldGNoJyBpbiBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbmV3IEhlYWRlcnMoKTtcbiAgICBuZXcgUmVxdWVzdCgnJyk7XG4gICAgbmV3IFJlc3BvbnNlKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbi8qKlxuICogaXNOYXRpdmVGZXRjaCBjaGVja3MgaWYgdGhlIGdpdmVuIGZ1bmN0aW9uIGlzIGEgbmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIGZldGNoKClcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbmV4cG9ydCBmdW5jdGlvbiBpc05hdGl2ZUZldGNoKGZ1bmM6IEZ1bmN0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBmdW5jICYmIC9eZnVuY3Rpb24gZmV0Y2hcXChcXClcXHMrXFx7XFxzK1xcW25hdGl2ZSBjb2RlXFxdXFxzK1xcfSQvLnRlc3QoZnVuYy50b1N0cmluZygpKTtcbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRmV0Y2ggQVBJIG5hdGl2ZWx5XG4gKiB7QGxpbmsgc3VwcG9ydHNOYXRpdmVGZXRjaH0uXG4gKlxuICogQHJldHVybnMgdHJ1ZSBpZiBgd2luZG93LmZldGNoYCBpcyBuYXRpdmVseSBpbXBsZW1lbnRlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c05hdGl2ZUZldGNoKCk6IGJvb2xlYW4ge1xuICBpZiAoIXN1cHBvcnRzRmV0Y2goKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG5cbiAgLy8gRmFzdCBwYXRoIHRvIGF2b2lkIERPTSBJL09cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICBpZiAoaXNOYXRpdmVGZXRjaChnbG9iYWwuZmV0Y2gpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyB3aW5kb3cuZmV0Y2ggaXMgaW1wbGVtZW50ZWQsIGJ1dCBpcyBwb2x5ZmlsbGVkIG9yIGFscmVhZHkgd3JhcHBlZCAoZS5nOiBieSBhIGNocm9tZSBleHRlbnNpb24pXG4gIC8vIHNvIGNyZWF0ZSBhIFwicHVyZVwiIGlmcmFtZSB0byBzZWUgaWYgdGhhdCBoYXMgbmF0aXZlIGZldGNoXG4gIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgY29uc3QgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgaWYgKGRvYyAmJiB0eXBlb2YgKGRvYy5jcmVhdGVFbGVtZW50IGFzIHVua25vd24pID09PSBgZnVuY3Rpb25gKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNhbmRib3ggPSBkb2MuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICBzYW5kYm94LmhpZGRlbiA9IHRydWU7XG4gICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzYW5kYm94KTtcbiAgICAgIGlmIChzYW5kYm94LmNvbnRlbnRXaW5kb3cgJiYgc2FuZGJveC5jb250ZW50V2luZG93LmZldGNoKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICAgICAgcmVzdWx0ID0gaXNOYXRpdmVGZXRjaChzYW5kYm94LmNvbnRlbnRXaW5kb3cuZmV0Y2gpO1xuICAgICAgfVxuICAgICAgZG9jLmhlYWQucmVtb3ZlQ2hpbGQoc2FuZGJveCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybignQ291bGQgbm90IGNyZWF0ZSBzYW5kYm94IGlmcmFtZSBmb3IgcHVyZSBmZXRjaCBjaGVjaywgYmFpbGluZyB0byB3aW5kb3cuZmV0Y2g6ICcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgUmVwb3J0aW5nT2JzZXJ2ZXIgQVBJXG4gKiB7QGxpbmsgc3VwcG9ydHNSZXBvcnRpbmdPYnNlcnZlcn0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVwb3J0aW5nT2JzZXJ2ZXIoKTogYm9vbGVhbiB7XG4gIHJldHVybiAnUmVwb3J0aW5nT2JzZXJ2ZXInIGluIGdldEdsb2JhbE9iamVjdCgpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBSZWZlcnJlciBQb2xpY3kgQVBJXG4gKiB7QGxpbmsgc3VwcG9ydHNSZWZlcnJlclBvbGljeX0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzUmVmZXJyZXJQb2xpY3koKTogYm9vbGVhbiB7XG4gIC8vIERlc3BpdGUgYWxsIHN0YXJzIGluIHRoZSBza3kgc2F5aW5nIHRoYXQgRWRnZSBzdXBwb3J0cyBvbGQgZHJhZnQgc3ludGF4LCBha2EgJ25ldmVyJywgJ2Fsd2F5cycsICdvcmlnaW4nIGFuZCAnZGVmYXVsdFxuICAvLyBodHRwczovL2Nhbml1c2UuY29tLyNmZWF0PXJlZmVycmVyLXBvbGljeVxuICAvLyBJdCBkb2Vzbid0LiBBbmQgaXQgdGhyb3cgZXhjZXB0aW9uIGluc3RlYWQgb2YgaWdub3JpbmcgdGhpcyBwYXJhbWV0ZXIuLi5cbiAgLy8gUkVGOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLWpzL2lzc3Vlcy8xMjMzXG5cbiAgaWYgKCFzdXBwb3J0c0ZldGNoKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIG5ldyBSZXF1ZXN0KCdfJywge1xuICAgICAgcmVmZXJyZXJQb2xpY3k6ICdvcmlnaW4nIGFzIFJlZmVycmVyUG9saWN5LFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIEhpc3RvcnkgQVBJXG4gKiB7QGxpbmsgc3VwcG9ydHNIaXN0b3J5fS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNIaXN0b3J5KCk6IGJvb2xlYW4ge1xuICAvLyBOT1RFOiBpbiBDaHJvbWUgQXBwIGVudmlyb25tZW50LCB0b3VjaGluZyBoaXN0b3J5LnB1c2hTdGF0ZSwgKmV2ZW4gaW5zaWRlXG4gIC8vICAgICAgIGEgdHJ5L2NhdGNoIGJsb2NrKiwgd2lsbCBjYXVzZSBDaHJvbWUgdG8gb3V0cHV0IGFuIGVycm9yIHRvIGNvbnNvbGUuZXJyb3JcbiAgLy8gYm9ycm93ZWQgZnJvbTogaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9wdWxsLzEzOTQ1L2ZpbGVzXG4gIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBjb25zdCBjaHJvbWUgPSAoZ2xvYmFsIGFzIGFueSkuY2hyb21lO1xuICBjb25zdCBpc0Nocm9tZVBhY2thZ2VkQXBwID0gY2hyb21lICYmIGNocm9tZS5hcHAgJiYgY2hyb21lLmFwcC5ydW50aW1lO1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICBjb25zdCBoYXNIaXN0b3J5QXBpID0gJ2hpc3RvcnknIGluIGdsb2JhbCAmJiAhIWdsb2JhbC5oaXN0b3J5LnB1c2hTdGF0ZSAmJiAhIWdsb2JhbC5oaXN0b3J5LnJlcGxhY2VTdGF0ZTtcblxuICByZXR1cm4gIWlzQ2hyb21lUGFja2FnZWRBcHAgJiYgaGFzSGlzdG9yeUFwaTtcbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXMgKi9cbmltcG9ydCB7IFdyYXBwZWRGdW5jdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBpc0luc3RhbmNlT2YsIGlzU3RyaW5nIH0gZnJvbSAnLi9pcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnLi9vYmplY3QnO1xuaW1wb3J0IHsgZ2V0RnVuY3Rpb25OYW1lIH0gZnJvbSAnLi9zdGFja3RyYWNlJztcbmltcG9ydCB7IHN1cHBvcnRzSGlzdG9yeSwgc3VwcG9ydHNOYXRpdmVGZXRjaCB9IGZyb20gJy4vc3VwcG9ydHMnO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuXG4vKiogT2JqZWN0IGRlc2NyaWJpbmcgaGFuZGxlciB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIGZvciBhIGdpdmVuIGB0eXBlYCBvZiBpbnN0cnVtZW50YXRpb24gKi9cbmludGVyZmFjZSBJbnN0cnVtZW50SGFuZGxlciB7XG4gIHR5cGU6IEluc3RydW1lbnRIYW5kbGVyVHlwZTtcbiAgY2FsbGJhY2s6IEluc3RydW1lbnRIYW5kbGVyQ2FsbGJhY2s7XG59XG50eXBlIEluc3RydW1lbnRIYW5kbGVyVHlwZSA9XG4gIHwgJ2NvbnNvbGUnXG4gIHwgJ2RvbSdcbiAgfCAnZmV0Y2gnXG4gIHwgJ2hpc3RvcnknXG4gIHwgJ3NlbnRyeSdcbiAgfCAneGhyJ1xuICB8ICdlcnJvcidcbiAgfCAndW5oYW5kbGVkcmVqZWN0aW9uJztcbnR5cGUgSW5zdHJ1bWVudEhhbmRsZXJDYWxsYmFjayA9IChkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbi8qKlxuICogSW5zdHJ1bWVudCBuYXRpdmUgQVBJcyB0byBjYWxsIGhhbmRsZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGJyZWFkY3J1bWJzLCBBUE0gc3BhbnMgZXRjLlxuICogIC0gQ29uc29sZSBBUElcbiAqICAtIEZldGNoIEFQSVxuICogIC0gWEhSIEFQSVxuICogIC0gSGlzdG9yeSBBUElcbiAqICAtIERPTSBBUEkgKGNsaWNrL3R5cGluZylcbiAqICAtIEVycm9yIEFQSVxuICogIC0gVW5oYW5kbGVkUmVqZWN0aW9uIEFQSVxuICovXG5cbmNvbnN0IGhhbmRsZXJzOiB7IFtrZXkgaW4gSW5zdHJ1bWVudEhhbmRsZXJUeXBlXT86IEluc3RydW1lbnRIYW5kbGVyQ2FsbGJhY2tbXSB9ID0ge307XG5jb25zdCBpbnN0cnVtZW50ZWQ6IHsgW2tleSBpbiBJbnN0cnVtZW50SGFuZGxlclR5cGVdPzogYm9vbGVhbiB9ID0ge307XG5cbi8qKiBJbnN0cnVtZW50cyBnaXZlbiBBUEkgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnQodHlwZTogSW5zdHJ1bWVudEhhbmRsZXJUeXBlKTogdm9pZCB7XG4gIGlmIChpbnN0cnVtZW50ZWRbdHlwZV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbnN0cnVtZW50ZWRbdHlwZV0gPSB0cnVlO1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ2NvbnNvbGUnOlxuICAgICAgaW5zdHJ1bWVudENvbnNvbGUoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2RvbSc6XG4gICAgICBpbnN0cnVtZW50RE9NKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd4aHInOlxuICAgICAgaW5zdHJ1bWVudFhIUigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmV0Y2gnOlxuICAgICAgaW5zdHJ1bWVudEZldGNoKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdoaXN0b3J5JzpcbiAgICAgIGluc3RydW1lbnRIaXN0b3J5KCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdlcnJvcic6XG4gICAgICBpbnN0cnVtZW50RXJyb3IoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3VuaGFuZGxlZHJlamVjdGlvbic6XG4gICAgICBpbnN0cnVtZW50VW5oYW5kbGVkUmVqZWN0aW9uKCk7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbG9nZ2VyLndhcm4oJ3Vua25vd24gaW5zdHJ1bWVudGF0aW9uIHR5cGU6JywgdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBZGQgaGFuZGxlciB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gZ2l2ZW4gdHlwZSBvZiBpbnN0cnVtZW50YXRpb24gdHJpZ2dlcnMuXG4gKiBVc2UgYXQgeW91ciBvd24gcmlzaywgdGhpcyBtaWdodCBicmVhayB3aXRob3V0IGNoYW5nZWxvZyBub3RpY2UsIG9ubHkgdXNlZCBpbnRlcm5hbGx5LlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcihoYW5kbGVyOiBJbnN0cnVtZW50SGFuZGxlcik6IHZvaWQge1xuICBpZiAoIWhhbmRsZXIgfHwgdHlwZW9mIGhhbmRsZXIudHlwZSAhPT0gJ3N0cmluZycgfHwgdHlwZW9mIGhhbmRsZXIuY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaGFuZGxlcnNbaGFuZGxlci50eXBlXSA9IGhhbmRsZXJzW2hhbmRsZXIudHlwZV0gfHwgW107XG4gIChoYW5kbGVyc1toYW5kbGVyLnR5cGVdIGFzIEluc3RydW1lbnRIYW5kbGVyQ2FsbGJhY2tbXSkucHVzaChoYW5kbGVyLmNhbGxiYWNrKTtcbiAgaW5zdHJ1bWVudChoYW5kbGVyLnR5cGUpO1xufVxuXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIHRyaWdnZXJIYW5kbGVycyh0eXBlOiBJbnN0cnVtZW50SGFuZGxlclR5cGUsIGRhdGE6IGFueSk6IHZvaWQge1xuICBpZiAoIXR5cGUgfHwgIWhhbmRsZXJzW3R5cGVdKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzW3R5cGVdIHx8IFtdKSB7XG4gICAgdHJ5IHtcbiAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBgRXJyb3Igd2hpbGUgdHJpZ2dlcmluZyBpbnN0cnVtZW50YXRpb24gaGFuZGxlci5cXG5UeXBlOiAke3R5cGV9XFxuTmFtZTogJHtnZXRGdW5jdGlvbk5hbWUoXG4gICAgICAgICAgaGFuZGxlcixcbiAgICAgICAgKX1cXG5FcnJvcjogJHtlfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRDb25zb2xlKCk6IHZvaWQge1xuICBpZiAoISgnY29uc29sZScgaW4gZ2xvYmFsKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2xvZycsICdhc3NlcnQnXS5mb3JFYWNoKGZ1bmN0aW9uKGxldmVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIShsZXZlbCBpbiBnbG9iYWwuY29uc29sZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWxsKGdsb2JhbC5jb25zb2xlLCBsZXZlbCwgZnVuY3Rpb24ob3JpZ2luYWxDb25zb2xlTGV2ZWw6ICgpID0+IGFueSk6IEZ1bmN0aW9uIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2NvbnNvbGUnLCB7IGFyZ3MsIGxldmVsIH0pO1xuXG4gICAgICAgIC8vIHRoaXMgZmFpbHMgZm9yIHNvbWUgYnJvd3NlcnMuIDooXG4gICAgICAgIGlmIChvcmlnaW5hbENvbnNvbGVMZXZlbCkge1xuICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG9yaWdpbmFsQ29uc29sZUxldmVsLCBnbG9iYWwuY29uc29sZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRGZXRjaCgpOiB2b2lkIHtcbiAgaWYgKCFzdXBwb3J0c05hdGl2ZUZldGNoKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmaWxsKGdsb2JhbCwgJ2ZldGNoJywgZnVuY3Rpb24ob3JpZ2luYWxGZXRjaDogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBmdW5jdGlvbiguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgY29uc3QgaGFuZGxlckRhdGEgPSB7XG4gICAgICAgIGFyZ3MsXG4gICAgICAgIGZldGNoRGF0YToge1xuICAgICAgICAgIG1ldGhvZDogZ2V0RmV0Y2hNZXRob2QoYXJncyksXG4gICAgICAgICAgdXJsOiBnZXRGZXRjaFVybChhcmdzKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICB9O1xuXG4gICAgICB0cmlnZ2VySGFuZGxlcnMoJ2ZldGNoJywge1xuICAgICAgICAuLi5oYW5kbGVyRGF0YSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICByZXR1cm4gb3JpZ2luYWxGZXRjaC5hcHBseShnbG9iYWwsIGFyZ3MpLnRoZW4oXG4gICAgICAgIChyZXNwb25zZTogUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2ZldGNoJywge1xuICAgICAgICAgICAgLi4uaGFuZGxlckRhdGEsXG4gICAgICAgICAgICBlbmRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2ZldGNoJywge1xuICAgICAgICAgICAgLi4uaGFuZGxlckRhdGEsXG4gICAgICAgICAgICBlbmRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICAvLyBOT1RFOiBJZiB5b3UgYXJlIGEgU2VudHJ5IHVzZXIsIGFuZCB5b3UgYXJlIHNlZWluZyB0aGlzIHN0YWNrIGZyYW1lLFxuICAgICAgICAgIC8vICAgICAgIGl0IG1lYW5zIHRoZSBzZW50cnkuamF2YXNjcmlwdCBTREsgY2F1Z2h0IGFuIGVycm9yIGludm9raW5nIHlvdXIgYXBwbGljYXRpb24gY29kZS5cbiAgICAgICAgICAvLyAgICAgICBUaGlzIGlzIGV4cGVjdGVkIGJlaGF2aW9yIGFuZCBOT1QgaW5kaWNhdGl2ZSBvZiBhIGJ1ZyB3aXRoIHNlbnRyeS5qYXZhc2NyaXB0LlxuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuICB9KTtcbn1cblxudHlwZSBYSFJTZW5kSW5wdXQgPSBudWxsIHwgQmxvYiB8IEJ1ZmZlclNvdXJjZSB8IEZvcm1EYXRhIHwgVVJMU2VhcmNoUGFyYW1zIHwgc3RyaW5nO1xuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBTZW50cnlXcmFwcGVkWE1MSHR0cFJlcXVlc3QgZXh0ZW5kcyBYTUxIdHRwUmVxdWVzdCB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgX19zZW50cnlfeGhyX18/OiB7XG4gICAgbWV0aG9kPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBzdGF0dXNfY29kZT86IG51bWJlcjtcbiAgICBib2R5PzogWEhSU2VuZElucHV0O1xuICB9O1xufVxuXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbi8qKiBFeHRyYWN0IGBtZXRob2RgIGZyb20gZmV0Y2ggY2FsbCBhcmd1bWVudHMgKi9cbmZ1bmN0aW9uIGdldEZldGNoTWV0aG9kKGZldGNoQXJnczogYW55W10gPSBbXSk6IHN0cmluZyB7XG4gIGlmICgnUmVxdWVzdCcgaW4gZ2xvYmFsICYmIGlzSW5zdGFuY2VPZihmZXRjaEFyZ3NbMF0sIFJlcXVlc3QpICYmIGZldGNoQXJnc1swXS5tZXRob2QpIHtcbiAgICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1swXS5tZXRob2QpLnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgaWYgKGZldGNoQXJnc1sxXSAmJiBmZXRjaEFyZ3NbMV0ubWV0aG9kKSB7XG4gICAgcmV0dXJuIFN0cmluZyhmZXRjaEFyZ3NbMV0ubWV0aG9kKS50b1VwcGVyQ2FzZSgpO1xuICB9XG4gIHJldHVybiAnR0VUJztcbn1cblxuLyoqIEV4dHJhY3QgYHVybGAgZnJvbSBmZXRjaCBjYWxsIGFyZ3VtZW50cyAqL1xuZnVuY3Rpb24gZ2V0RmV0Y2hVcmwoZmV0Y2hBcmdzOiBhbnlbXSA9IFtdKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBmZXRjaEFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZldGNoQXJnc1swXTtcbiAgfVxuICBpZiAoJ1JlcXVlc3QnIGluIGdsb2JhbCAmJiBpc0luc3RhbmNlT2YoZmV0Y2hBcmdzWzBdLCBSZXF1ZXN0KSkge1xuICAgIHJldHVybiBmZXRjaEFyZ3NbMF0udXJsO1xuICB9XG4gIHJldHVybiBTdHJpbmcoZmV0Y2hBcmdzWzBdKTtcbn1cbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudFhIUigpOiB2b2lkIHtcbiAgaWYgKCEoJ1hNTEh0dHBSZXF1ZXN0JyBpbiBnbG9iYWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUG9vciBtYW4ncyBpbXBsZW1lbnRhdGlvbiBvZiBFUzYgYE1hcGAsIHRyYWNraW5nIGFuZCBrZWVwaW5nIGluIHN5bmMga2V5IGFuZCB2YWx1ZSBzZXBhcmF0ZWx5LlxuICBjb25zdCByZXF1ZXN0S2V5czogWE1MSHR0cFJlcXVlc3RbXSA9IFtdO1xuICBjb25zdCByZXF1ZXN0VmFsdWVzOiBBcnJheTxhbnk+W10gPSBbXTtcbiAgY29uc3QgeGhycHJvdG8gPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7XG5cbiAgZmlsbCh4aHJwcm90bywgJ29wZW4nLCBmdW5jdGlvbihvcmlnaW5hbE9wZW46ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogU2VudHJ5V3JhcHBlZFhNTEh0dHBSZXF1ZXN0LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICBjb25zdCB4aHIgPSB0aGlzO1xuICAgICAgY29uc3QgdXJsID0gYXJnc1sxXTtcbiAgICAgIHhoci5fX3NlbnRyeV94aHJfXyA9IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBtZXRob2Q6IGlzU3RyaW5nKGFyZ3NbMF0pID8gYXJnc1swXS50b1VwcGVyQ2FzZSgpIDogYXJnc1swXSxcbiAgICAgICAgdXJsOiBhcmdzWzFdLFxuICAgICAgfTtcblxuICAgICAgLy8gaWYgU2VudHJ5IGtleSBhcHBlYXJzIGluIFVSTCwgZG9uJ3QgY2FwdHVyZSBpdCBhcyBhIHJlcXVlc3RcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIGlmIChpc1N0cmluZyh1cmwpICYmIHhoci5fX3NlbnRyeV94aHJfXy5tZXRob2QgPT09ICdQT1NUJyAmJiB1cmwubWF0Y2goL3NlbnRyeV9rZXkvKSkge1xuICAgICAgICB4aHIuX19zZW50cnlfb3duX3JlcXVlc3RfXyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9ucmVhZHlzdGF0ZWNoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIHRvdWNoaW5nIHN0YXR1c0NvZGUgaW4gc29tZSBwbGF0Zm9ybXMgdGhyb3dzXG4gICAgICAgICAgICAvLyBhbiBleGNlcHRpb25cbiAgICAgICAgICAgIGlmICh4aHIuX19zZW50cnlfeGhyX18pIHtcbiAgICAgICAgICAgICAgeGhyLl9fc2VudHJ5X3hocl9fLnN0YXR1c19jb2RlID0geGhyLnN0YXR1cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvKiBkbyBub3RoaW5nICovXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RQb3MgPSByZXF1ZXN0S2V5cy5pbmRleE9mKHhocik7XG4gICAgICAgICAgICBpZiAocmVxdWVzdFBvcyAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHBvcCBib3RoIGtleSBhbmQgdmFsdWUgdG8ga2VlcCBpdCBpbiBzeW5jLlxuICAgICAgICAgICAgICByZXF1ZXN0S2V5cy5zcGxpY2UocmVxdWVzdFBvcyk7XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSByZXF1ZXN0VmFsdWVzLnNwbGljZShyZXF1ZXN0UG9zKVswXTtcbiAgICAgICAgICAgICAgaWYgKHhoci5fX3NlbnRyeV94aHJfXyAmJiBhcmdzWzBdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB4aHIuX19zZW50cnlfeGhyX18uYm9keSA9IGFyZ3NbMF0gYXMgWEhSU2VuZElucHV0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLyogZG8gbm90aGluZyAqL1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygneGhyJywge1xuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHN0YXJ0VGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgeGhyLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAoJ29ucmVhZHlzdGF0ZWNoYW5nZScgaW4geGhyICYmIHR5cGVvZiB4aHIub25yZWFkeXN0YXRlY2hhbmdlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGZpbGwoeGhyLCAnb25yZWFkeXN0YXRlY2hhbmdlJywgZnVuY3Rpb24ob3JpZ2luYWw6IFdyYXBwZWRGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oLi4ucmVhZHlTdGF0ZUFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgICAgICBvbnJlYWR5c3RhdGVjaGFuZ2VIYW5kbGVyKCk7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXBwbHkoeGhyLCByZWFkeVN0YXRlQXJncyk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4aHIuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIG9ucmVhZHlzdGF0ZWNoYW5nZUhhbmRsZXIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3JpZ2luYWxPcGVuLmFwcGx5KHhociwgYXJncyk7XG4gICAgfTtcbiAgfSk7XG5cbiAgZmlsbCh4aHJwcm90bywgJ3NlbmQnLCBmdW5jdGlvbihvcmlnaW5hbFNlbmQ6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogU2VudHJ5V3JhcHBlZFhNTEh0dHBSZXF1ZXN0LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgICAgcmVxdWVzdEtleXMucHVzaCh0aGlzKTtcbiAgICAgIHJlcXVlc3RWYWx1ZXMucHVzaChhcmdzKTtcblxuICAgICAgdHJpZ2dlckhhbmRsZXJzKCd4aHInLCB7XG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHN0YXJ0VGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB4aHI6IHRoaXMsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG9yaWdpbmFsU2VuZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9KTtcbn1cblxubGV0IGxhc3RIcmVmOiBzdHJpbmc7XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudEhpc3RvcnkoKTogdm9pZCB7XG4gIGlmICghc3VwcG9ydHNIaXN0b3J5KCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvbGRPblBvcFN0YXRlID0gZ2xvYmFsLm9ucG9wc3RhdGU7XG4gIGdsb2JhbC5vbnBvcHN0YXRlID0gZnVuY3Rpb24odGhpczogV2luZG93RXZlbnRIYW5kbGVycywgLi4uYXJnczogYW55W10pOiBhbnkge1xuICAgIGNvbnN0IHRvID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWY7XG4gICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBVUkwgc3RhdGUsIGFzIHdlIGFsd2F5cyByZWNlaXZlIG9ubHkgdGhlIHVwZGF0ZWQgc3RhdGVcbiAgICBjb25zdCBmcm9tID0gbGFzdEhyZWY7XG4gICAgbGFzdEhyZWYgPSB0bztcbiAgICB0cmlnZ2VySGFuZGxlcnMoJ2hpc3RvcnknLCB7XG4gICAgICBmcm9tLFxuICAgICAgdG8sXG4gICAgfSk7XG4gICAgaWYgKG9sZE9uUG9wU3RhdGUpIHtcbiAgICAgIC8vIEFwcGFyZW50bHkgdGhpcyBjYW4gdGhyb3cgaW4gRmlyZWZveCB3aGVuIGluY29ycmVjdGx5IGltcGxlbWVudGVkIHBsdWdpbiBpcyBpbnN0YWxsZWQuXG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8zMzQ0XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYnVnc25hZy9idWdzbmFnLWpzL2lzc3Vlcy80NjlcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBvbGRPblBvcFN0YXRlLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICAgIC8vIG5vLWVtcHR5XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAaGlkZGVuICovXG4gIGZ1bmN0aW9uIGhpc3RvcnlSZXBsYWNlbWVudEZ1bmN0aW9uKG9yaWdpbmFsSGlzdG9yeUZ1bmN0aW9uOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKHRoaXM6IEhpc3RvcnksIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICBjb25zdCB1cmwgPSBhcmdzLmxlbmd0aCA+IDIgPyBhcmdzWzJdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHVybCkge1xuICAgICAgICAvLyBjb2VyY2UgdG8gc3RyaW5nICh0aGlzIGlzIHdoYXQgcHVzaFN0YXRlIGRvZXMpXG4gICAgICAgIGNvbnN0IGZyb20gPSBsYXN0SHJlZjtcbiAgICAgICAgY29uc3QgdG8gPSBTdHJpbmcodXJsKTtcbiAgICAgICAgLy8ga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBVUkwgc3RhdGUsIGFzIHdlIGFsd2F5cyByZWNlaXZlIG9ubHkgdGhlIHVwZGF0ZWQgc3RhdGVcbiAgICAgICAgbGFzdEhyZWYgPSB0bztcbiAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCdoaXN0b3J5Jywge1xuICAgICAgICAgIGZyb20sXG4gICAgICAgICAgdG8sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9yaWdpbmFsSGlzdG9yeUZ1bmN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH1cblxuICBmaWxsKGdsb2JhbC5oaXN0b3J5LCAncHVzaFN0YXRlJywgaGlzdG9yeVJlcGxhY2VtZW50RnVuY3Rpb24pO1xuICBmaWxsKGdsb2JhbC5oaXN0b3J5LCAncmVwbGFjZVN0YXRlJywgaGlzdG9yeVJlcGxhY2VtZW50RnVuY3Rpb24pO1xufVxuXG5jb25zdCBkZWJvdW5jZUR1cmF0aW9uID0gMTAwMDtcbmxldCBkZWJvdW5jZVRpbWVySUQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbmxldCBsYXN0Q2FwdHVyZWRFdmVudDogRXZlbnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRGVjaWRlIHdoZXRoZXIgdGhlIGN1cnJlbnQgZXZlbnQgc2hvdWxkIGZpbmlzaCB0aGUgZGVib3VuY2Ugb2YgcHJldmlvdXNseSBjYXB0dXJlZCBvbmUuXG4gKiBAcGFyYW0gcHJldmlvdXMgcHJldmlvdXNseSBjYXB0dXJlZCBldmVudFxuICogQHBhcmFtIGN1cnJlbnQgZXZlbnQgdG8gYmUgY2FwdHVyZWRcbiAqL1xuZnVuY3Rpb24gc2hvdWxkU2hvcnRjaXJjdWl0UHJldmlvdXNEZWJvdW5jZShwcmV2aW91czogRXZlbnQgfCB1bmRlZmluZWQsIGN1cnJlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gIC8vIElmIHRoZXJlIHdhcyBubyBwcmV2aW91cyBldmVudCwgaXQgc2hvdWxkIGFsd2F5cyBiZSBzd2FwcGVkIGZvciB0aGUgbmV3IG9uZS5cbiAgaWYgKCFwcmV2aW91cykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gSWYgYm90aCBldmVudHMgaGF2ZSBkaWZmZXJlbnQgdHlwZSwgdGhlbiB1c2VyIGRlZmluaXRlbHkgcGVyZm9ybWVkIHR3byBzZXBhcmF0ZSBhY3Rpb25zLiBlLmcuIGNsaWNrICsga2V5cHJlc3MuXG4gIGlmIChwcmV2aW91cy50eXBlICE9PSBjdXJyZW50LnR5cGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gSWYgYm90aCBldmVudHMgaGF2ZSB0aGUgc2FtZSB0eXBlLCBpdCdzIHN0aWxsIHBvc3NpYmxlIHRoYXQgYWN0aW9ucyB3ZXJlIHBlcmZvcm1lZCBvbiBkaWZmZXJlbnQgdGFyZ2V0cy5cbiAgICAvLyBlLmcuIDIgY2xpY2tzIG9uIGRpZmZlcmVudCBidXR0b25zLlxuICAgIGlmIChwcmV2aW91cy50YXJnZXQgIT09IGN1cnJlbnQudGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBqdXN0IGFjY2Vzc2luZyBgdGFyZ2V0YCBwcm9wZXJ0eSBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIGluIHNvbWUgcmFyZSBjaXJjdW1zdGFuY2VzXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy84MzhcbiAgfVxuXG4gIC8vIElmIGJvdGggZXZlbnRzIGhhdmUgdGhlIHNhbWUgdHlwZSBfYW5kXyBzYW1lIGB0YXJnZXRgIChhbiBlbGVtZW50IHdoaWNoIHRyaWdnZXJlZCBhbiBldmVudCwgX25vdCBuZWNlc3NhcmlseV9cbiAgLy8gdG8gd2hpY2ggYW4gZXZlbnQgbGlzdGVuZXIgd2FzIGF0dGFjaGVkKSwgd2UgdHJlYXQgdGhlbSBhcyB0aGUgc2FtZSBhY3Rpb24sIGFzIHdlIHdhbnQgdG8gY2FwdHVyZVxuICAvLyBvbmx5IG9uZSBicmVhZGNydW1iLiBlLmcuIG11bHRpcGxlIGNsaWNrcyBvbiB0aGUgc2FtZSBidXR0b24sIG9yIHR5cGluZyBpbnNpZGUgYSB1c2VyIGlucHV0IGJveC5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIERlY2lkZSB3aGV0aGVyIGFuIGV2ZW50IHNob3VsZCBiZSBjYXB0dXJlZC5cbiAqIEBwYXJhbSBldmVudCBldmVudCB0byBiZSBjYXB0dXJlZFxuICovXG5mdW5jdGlvbiBzaG91bGRTa2lwRE9NRXZlbnQoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiB7XG4gIC8vIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZmlsdGVyaW5nIGBrZXlwcmVzc2AgZXZlbnRzIGZvciBub3cuXG4gIGlmIChldmVudC50eXBlICE9PSAna2V5cHJlc3MnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LnRhZ05hbWUpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE9ubHkgY29uc2lkZXIga2V5cHJlc3MgZXZlbnRzIG9uIGFjdHVhbCBpbnB1dCBlbGVtZW50cy4gVGhpcyB3aWxsIGRpc3JlZ2FyZCBrZXlwcmVzc2VzIHRhcmdldGluZyBib2R5XG4gICAgLy8gZS5nLnRhYmJpbmcgdGhyb3VnaCBlbGVtZW50cywgaG90a2V5cywgZXRjLlxuICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBqdXN0IGFjY2Vzc2luZyBgdGFyZ2V0YCBwcm9wZXJ0eSBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIGluIHNvbWUgcmFyZSBjaXJjdW1zdGFuY2VzXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy84MzhcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIFdyYXBzIGFkZEV2ZW50TGlzdGVuZXIgdG8gY2FwdHVyZSBVSSBicmVhZGNydW1ic1xuICogQHBhcmFtIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZFxuICogQHBhcmFtIGdsb2JhbExpc3RlbmVyIGluZGljYXRlcyB3aGV0aGVyIGV2ZW50IHdhcyBjYXB0dXJlZCBieSB0aGUgZ2xvYmFsIGV2ZW50IGxpc3RlbmVyXG4gKiBAcmV0dXJucyB3cmFwcGVkIGJyZWFkY3J1bWIgZXZlbnRzIGhhbmRsZXJcbiAqIEBoaWRkZW5cbiAqL1xuZnVuY3Rpb24gbWFrZURPTUV2ZW50SGFuZGxlcihoYW5kbGVyOiBGdW5jdGlvbiwgZ2xvYmFsTGlzdGVuZXI6IGJvb2xlYW4gPSBmYWxzZSk6IChldmVudDogRXZlbnQpID0+IHZvaWQge1xuICByZXR1cm4gKGV2ZW50OiBFdmVudCk6IHZvaWQgPT4ge1xuICAgIC8vIEl0J3MgcG9zc2libGUgdGhpcyBoYW5kbGVyIG1pZ2h0IHRyaWdnZXIgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBzYW1lXG4gICAgLy8gZXZlbnQgKGUuZy4gZXZlbnQgcHJvcGFnYXRpb24gdGhyb3VnaCBub2RlIGFuY2VzdG9ycykuXG4gICAgLy8gSWdub3JlIGlmIHdlJ3ZlIGFscmVhZHkgY2FwdHVyZWQgdGhhdCBldmVudC5cbiAgICBpZiAoIWV2ZW50IHx8IGxhc3RDYXB0dXJlZEV2ZW50ID09PSBldmVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFdlIGFsd2F5cyB3YW50IHRvIHNraXAgX3NvbWVfIGV2ZW50cy5cbiAgICBpZiAoc2hvdWxkU2tpcERPTUV2ZW50KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWUgPSBldmVudC50eXBlID09PSAna2V5cHJlc3MnID8gJ2lucHV0JyA6IGV2ZW50LnR5cGU7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBkZWJvdW5jZSB0aW1lciwgaXQgbWVhbnMgdGhhdCB3ZSBjYW4gc2FmZWx5IGNhcHR1cmUgdGhlIG5ldyBldmVudCBhbmQgc3RvcmUgaXQgZm9yIGZ1dHVyZSBjb21wYXJpc29ucy5cbiAgICBpZiAoZGVib3VuY2VUaW1lcklEID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhbmRsZXIoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGdsb2JhbDogZ2xvYmFsTGlzdGVuZXIsXG4gICAgICB9KTtcbiAgICAgIGxhc3RDYXB0dXJlZEV2ZW50ID0gZXZlbnQ7XG4gICAgfVxuICAgIC8vIElmIHRoZXJlIGlzIGEgZGVib3VuY2UgYXdhaXRpbmcsIHNlZSBpZiB0aGUgbmV3IGV2ZW50IGlzIGRpZmZlcmVudCBlbm91Z2ggdG8gdHJlYXQgaXQgYXMgYSB1bmlxdWUgb25lLlxuICAgIC8vIElmIHRoYXQncyB0aGUgY2FzZSwgZW1pdCB0aGUgcHJldmlvdXMgZXZlbnQgYW5kIHN0b3JlIGxvY2FsbHkgdGhlIG5ld2x5LWNhcHR1cmVkIERPTSBldmVudC5cbiAgICBlbHNlIGlmIChzaG91bGRTaG9ydGNpcmN1aXRQcmV2aW91c0RlYm91bmNlKGxhc3RDYXB0dXJlZEV2ZW50LCBldmVudCkpIHtcbiAgICAgIGhhbmRsZXIoe1xuICAgICAgICBldmVudDogZXZlbnQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGdsb2JhbDogZ2xvYmFsTGlzdGVuZXIsXG4gICAgICB9KTtcbiAgICAgIGxhc3RDYXB0dXJlZEV2ZW50ID0gZXZlbnQ7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgYSBuZXcgZGVib3VuY2UgdGltZXIgdGhhdCB3aWxsIHByZXZlbnQgdXMgZnJvbSBjYXB0dXJpbmcgbXVsdGlwbGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGdyb3VwZWQgdG9nZXRoZXIuXG4gICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlVGltZXJJRCk7XG4gICAgZGVib3VuY2VUaW1lcklEID0gZ2xvYmFsLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZGVib3VuY2VUaW1lcklEID0gdW5kZWZpbmVkO1xuICAgIH0sIGRlYm91bmNlRHVyYXRpb24pO1xuICB9O1xufVxuXG50eXBlIEFkZEV2ZW50TGlzdGVuZXIgPSAoXG4gIHR5cGU6IHN0cmluZyxcbiAgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsXG4gIG9wdGlvbnM/OiBib29sZWFuIHwgQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4pID0+IHZvaWQ7XG50eXBlIFJlbW92ZUV2ZW50TGlzdGVuZXIgPSAoXG4gIHR5cGU6IHN0cmluZyxcbiAgbGlzdGVuZXI6IEV2ZW50TGlzdGVuZXJPckV2ZW50TGlzdGVuZXJPYmplY3QsXG4gIG9wdGlvbnM/OiBib29sZWFuIHwgRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4pID0+IHZvaWQ7XG5cbnR5cGUgSW5zdHJ1bWVudGVkRWxlbWVudCA9IEVsZW1lbnQgJiB7XG4gIF9fc2VudHJ5X2luc3RydW1lbnRhdGlvbl9oYW5kbGVyc19fPzoge1xuICAgIFtrZXkgaW4gJ2NsaWNrJyB8ICdrZXlwcmVzcyddPzoge1xuICAgICAgaGFuZGxlcj86IEZ1bmN0aW9uO1xuICAgICAgLyoqIFRoZSBudW1iZXIgb2YgY3VzdG9tIGxpc3RlbmVycyBhdHRhY2hlZCB0byB0aGlzIGVsZW1lbnQgKi9cbiAgICAgIHJlZkNvdW50OiBudW1iZXI7XG4gICAgfTtcbiAgfTtcbn07XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudERPTSgpOiB2b2lkIHtcbiAgaWYgKCEoJ2RvY3VtZW50JyBpbiBnbG9iYWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gTWFrZSBpdCBzbyB0aGF0IGFueSBjbGljayBvciBrZXlwcmVzcyB0aGF0IGlzIHVuaGFuZGxlZCAvIGJ1YmJsZWQgdXAgYWxsIHRoZSB3YXkgdG8gdGhlIGRvY3VtZW50IHRyaWdnZXJzIG91ciBkb21cbiAgLy8gaGFuZGxlcnMuIChOb3JtYWxseSB3ZSBoYXZlIG9ubHkgb25lLCB3aGljaCBjYXB0dXJlcyBhIGJyZWFkY3J1bWIgZm9yIGVhY2ggY2xpY2sgb3Iga2V5cHJlc3MuKSBEbyB0aGlzIGJlZm9yZVxuICAvLyB3ZSBpbnN0cnVtZW50IGBhZGRFdmVudExpc3RlbmVyYCBzbyB0aGF0IHdlIGRvbid0IGVuZCB1cCBhdHRhY2hpbmcgdGhpcyBoYW5kbGVyIHR3aWNlLlxuICBjb25zdCB0cmlnZ2VyRE9NSGFuZGxlciA9IHRyaWdnZXJIYW5kbGVycy5iaW5kKG51bGwsICdkb20nKTtcbiAgY29uc3QgZ2xvYmFsRE9NRXZlbnRIYW5kbGVyID0gbWFrZURPTUV2ZW50SGFuZGxlcih0cmlnZ2VyRE9NSGFuZGxlciwgdHJ1ZSk7XG4gIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGdsb2JhbERPTUV2ZW50SGFuZGxlciwgZmFsc2UpO1xuICBnbG9iYWwuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5cHJlc3MnLCBnbG9iYWxET01FdmVudEhhbmRsZXIsIGZhbHNlKTtcblxuICAvLyBBZnRlciBob29raW5nIGludG8gY2xpY2sgYW5kIGtleXByZXNzIGV2ZW50cyBidWJibGVkIHVwIHRvIGBkb2N1bWVudGAsIHdlIGFsc28gaG9vayBpbnRvIHVzZXItaGFuZGxlZFxuICAvLyBjbGlja3MgJiBrZXlwcmVzc2VzLCBieSBhZGRpbmcgYW4gZXZlbnQgbGlzdGVuZXIgb2Ygb3VyIG93biB0byBhbnkgZWxlbWVudCB0byB3aGljaCB0aGV5IGFkZCBhIGxpc3RlbmVyLiBUaGF0XG4gIC8vIHdheSwgd2hlbmV2ZXIgb25lIG9mIHRoZWlyIGhhbmRsZXJzIGlzIHRyaWdnZXJlZCwgb3VycyB3aWxsIGJlLCB0b28uIChUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZWlyIGhhbmRsZXJcbiAgLy8gY291bGQgcG90ZW50aWFsbHkgcHJldmVudCB0aGUgZXZlbnQgZnJvbSBidWJibGluZyB1cCB0byBvdXIgZ2xvYmFsIGxpc3RlbmVycy4gVGhpcyB3YXksIG91ciBoYW5kbGVyIGFyZSBzdGlsbFxuICAvLyBndWFyYW50ZWVkIHRvIGZpcmUgYXQgbGVhc3Qgb25jZS4pXG4gIFsnRXZlbnRUYXJnZXQnLCAnTm9kZSddLmZvckVhY2goKHRhcmdldDogc3RyaW5nKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIGNvbnN0IHByb3RvID0gKGdsb2JhbCBhcyBhbnkpW3RhcmdldF0gJiYgKGdsb2JhbCBhcyBhbnkpW3RhcmdldF0ucHJvdG90eXBlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICAgIGlmICghcHJvdG8gfHwgIXByb3RvLmhhc093blByb3BlcnR5IHx8ICFwcm90by5oYXNPd25Qcm9wZXJ0eSgnYWRkRXZlbnRMaXN0ZW5lcicpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsbChwcm90bywgJ2FkZEV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbihvcmlnaW5hbEFkZEV2ZW50TGlzdGVuZXI6IEFkZEV2ZW50TGlzdGVuZXIpOiBBZGRFdmVudExpc3RlbmVyIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihcbiAgICAgICAgdGhpczogRWxlbWVudCxcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCxcbiAgICAgICAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyxcbiAgICAgICk6IEFkZEV2ZW50TGlzdGVuZXIge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2NsaWNrJyB8fCB0eXBlID09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzIGFzIEluc3RydW1lbnRlZEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IChlbC5fX3NlbnRyeV9pbnN0cnVtZW50YXRpb25faGFuZGxlcnNfXyA9IGVsLl9fc2VudHJ5X2luc3RydW1lbnRhdGlvbl9oYW5kbGVyc19fIHx8IHt9KTtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJGb3JUeXBlID0gKGhhbmRsZXJzW3R5cGVdID0gaGFuZGxlcnNbdHlwZV0gfHwgeyByZWZDb3VudDogMCB9KTtcblxuICAgICAgICAgICAgaWYgKCFoYW5kbGVyRm9yVHlwZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtYWtlRE9NRXZlbnRIYW5kbGVyKHRyaWdnZXJET01IYW5kbGVyKTtcbiAgICAgICAgICAgICAgaGFuZGxlckZvclR5cGUuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgICAgICAgICAgIG9yaWdpbmFsQWRkRXZlbnRMaXN0ZW5lci5jYWxsKHRoaXMsIHR5cGUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBoYW5kbGVyRm9yVHlwZS5yZWZDb3VudCArPSAxO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIEFjY2Vzc2luZyBkb20gcHJvcGVydGllcyBpcyBhbHdheXMgZnJhZ2lsZS5cbiAgICAgICAgICAgIC8vIEFsc28gYWxsb3dzIHVzIHRvIHNraXAgYGFkZEV2ZW50TGlzdGVucnNgIGNhbGxzIHdpdGggbm8gcHJvcGVyIGB0aGlzYCBjb250ZXh0LlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnaW5hbEFkZEV2ZW50TGlzdGVuZXIuY2FsbCh0aGlzLCB0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucyk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgZmlsbChwcm90bywgJ3JlbW92ZUV2ZW50TGlzdGVuZXInLCBmdW5jdGlvbihvcmlnaW5hbFJlbW92ZUV2ZW50TGlzdGVuZXI6IFJlbW92ZUV2ZW50TGlzdGVuZXIpOiBSZW1vdmVFdmVudExpc3RlbmVyIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihcbiAgICAgICAgdGhpczogRWxlbWVudCxcbiAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCxcbiAgICAgICAgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyxcbiAgICAgICk6ICgpID0+IHZvaWQge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2NsaWNrJyB8fCB0eXBlID09ICdrZXlwcmVzcycpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzIGFzIEluc3RydW1lbnRlZEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVycyA9IGVsLl9fc2VudHJ5X2luc3RydW1lbnRhdGlvbl9oYW5kbGVyc19fIHx8IHt9O1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlckZvclR5cGUgPSBoYW5kbGVyc1t0eXBlXTtcblxuICAgICAgICAgICAgaWYgKGhhbmRsZXJGb3JUeXBlKSB7XG4gICAgICAgICAgICAgIGhhbmRsZXJGb3JUeXBlLnJlZkNvdW50IC09IDE7XG4gICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IGN1c3RvbSBoYW5kbGVycyBvZiB0aGUgY3VycmVudCB0eXBlIG9uIHRoaXMgZWxlbWVudCwgd2UgY2FuIHJlbW92ZSBvdXJzLCB0b28uXG4gICAgICAgICAgICAgIGlmIChoYW5kbGVyRm9yVHlwZS5yZWZDb3VudCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgb3JpZ2luYWxSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgaGFuZGxlckZvclR5cGUuaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgaGFuZGxlckZvclR5cGUuaGFuZGxlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBkZWxldGUgaGFuZGxlcnNbdHlwZV07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBjdXN0b20gaGFuZGxlcnMgb2YgYW55IHR5cGUgb24gdGhpcyBlbGVtZW50LCBjbGVhbnVwIGV2ZXJ5dGhpbmcuXG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhoYW5kbGVycykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGVsLl9fc2VudHJ5X2luc3RydW1lbnRhdGlvbl9oYW5kbGVyc19fO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gQWNjZXNzaW5nIGRvbSBwcm9wZXJ0aWVzIGlzIGFsd2F5cyBmcmFnaWxlLlxuICAgICAgICAgICAgLy8gQWxzbyBhbGxvd3MgdXMgdG8gc2tpcCBgYWRkRXZlbnRMaXN0ZW5yc2AgY2FsbHMgd2l0aCBubyBwcm9wZXIgYHRoaXNgIGNvbnRleHQuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVtb3ZlRXZlbnRMaXN0ZW5lci5jYWxsKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xufVxuXG5sZXQgX29sZE9uRXJyb3JIYW5kbGVyOiBPbkVycm9yRXZlbnRIYW5kbGVyID0gbnVsbDtcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudEVycm9yKCk6IHZvaWQge1xuICBfb2xkT25FcnJvckhhbmRsZXIgPSBnbG9iYWwub25lcnJvcjtcblxuICBnbG9iYWwub25lcnJvciA9IGZ1bmN0aW9uKG1zZzogYW55LCB1cmw6IGFueSwgbGluZTogYW55LCBjb2x1bW46IGFueSwgZXJyb3I6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyaWdnZXJIYW5kbGVycygnZXJyb3InLCB7XG4gICAgICBjb2x1bW4sXG4gICAgICBlcnJvcixcbiAgICAgIGxpbmUsXG4gICAgICBtc2csXG4gICAgICB1cmwsXG4gICAgfSk7XG5cbiAgICBpZiAoX29sZE9uRXJyb3JIYW5kbGVyKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICByZXR1cm4gX29sZE9uRXJyb3JIYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xufVxuXG5sZXQgX29sZE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlcjogKChlOiBhbnkpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGluc3RydW1lbnRVbmhhbmRsZWRSZWplY3Rpb24oKTogdm9pZCB7XG4gIF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb247XG5cbiAgZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uID0gZnVuY3Rpb24oZTogYW55KTogYm9vbGVhbiB7XG4gICAgdHJpZ2dlckhhbmRsZXJzKCd1bmhhbmRsZWRyZWplY3Rpb24nLCBlKTtcblxuICAgIGlmIChfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLXJlc3QtcGFyYW1zXG4gICAgICByZXR1cm4gX29sZE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEV2ZW50LCBNZWNoYW5pc20sIFN0YWNrRnJhbWUgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgc25pcExpbmUgfSBmcm9tICcuL3N0cmluZyc7XG5cbi8qKlxuICogRXh0ZW5kZWQgV2luZG93IGludGVyZmFjZSB0aGF0IGFsbG93cyBmb3IgQ3J5cHRvIEFQSSB1c2FnZSBpbiBJRSBicm93c2Vyc1xuICovXG5pbnRlcmZhY2UgTXNDcnlwdG9XaW5kb3cgZXh0ZW5kcyBXaW5kb3cge1xuICBtc0NyeXB0bz86IENyeXB0bztcbn1cblxuLyoqXG4gKiBVVUlENCBnZW5lcmF0b3JcbiAqXG4gKiBAcmV0dXJucyBzdHJpbmcgR2VuZXJhdGVkIFVVSUQ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXVpZDQoKTogc3RyaW5nIHtcbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0KCkgYXMgTXNDcnlwdG9XaW5kb3c7XG4gIGNvbnN0IGNyeXB0byA9IGdsb2JhbC5jcnlwdG8gfHwgZ2xvYmFsLm1zQ3J5cHRvO1xuXG4gIGlmICghKGNyeXB0byA9PT0gdm9pZCAwKSAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgLy8gVXNlIHdpbmRvdy5jcnlwdG8gQVBJIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGFyciA9IG5ldyBVaW50MTZBcnJheSg4KTtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGFycik7XG5cbiAgICAvLyBzZXQgNCBpbiBieXRlIDdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGFyclszXSA9IChhcnJbM10gJiAweGZmZikgfCAweDQwMDA7XG4gICAgLy8gc2V0IDIgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIGJ5dGUgOSB0byAnMTAnXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBhcnJbNF0gPSAoYXJyWzRdICYgMHgzZmZmKSB8IDB4ODAwMDtcblxuICAgIGNvbnN0IHBhZCA9IChudW06IG51bWJlcik6IHN0cmluZyA9PiB7XG4gICAgICBsZXQgdiA9IG51bS50b1N0cmluZygxNik7XG4gICAgICB3aGlsZSAodi5sZW5ndGggPCA0KSB7XG4gICAgICAgIHYgPSBgMCR7dn1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHY7XG4gICAgfTtcblxuICAgIHJldHVybiAoXG4gICAgICBwYWQoYXJyWzBdKSArIHBhZChhcnJbMV0pICsgcGFkKGFyclsyXSkgKyBwYWQoYXJyWzNdKSArIHBhZChhcnJbNF0pICsgcGFkKGFycls1XSkgKyBwYWQoYXJyWzZdKSArIHBhZChhcnJbN10pXG4gICAgKTtcbiAgfVxuICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEwNTAzNC9ob3ctdG8tY3JlYXRlLWEtZ3VpZC11dWlkLWluLWphdmFzY3JpcHQvMjExNzUyMyMyMTE3NTIzXG4gIHJldHVybiAneHh4eHh4eHh4eHh4NHh4eHl4eHh4eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgYyA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgY29uc3QgdiA9IGMgPT09ICd4JyA/IHIgOiAociAmIDB4MykgfCAweDg7XG4gICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgc3RyaW5nIGZvcm0gb2YgVVJMIGludG8gYW4gb2JqZWN0XG4gKiAvLyBib3Jyb3dlZCBmcm9tIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I2FwcGVuZGl4LUJcbiAqIC8vIGludGVudGlvbmFsbHkgdXNpbmcgcmVnZXggYW5kIG5vdCA8YS8+IGhyZWYgcGFyc2luZyB0cmljayBiZWNhdXNlIFJlYWN0IE5hdGl2ZSBhbmQgb3RoZXJcbiAqIC8vIGVudmlyb25tZW50cyB3aGVyZSBET00gbWlnaHQgbm90IGJlIGF2YWlsYWJsZVxuICogQHJldHVybnMgcGFyc2VkIFVSTCBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVXJsKFxuICB1cmw6IHN0cmluZyxcbik6IHtcbiAgaG9zdD86IHN0cmluZztcbiAgcGF0aD86IHN0cmluZztcbiAgcHJvdG9jb2w/OiBzdHJpbmc7XG4gIHJlbGF0aXZlPzogc3RyaW5nO1xufSB7XG4gIGlmICghdXJsKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goL14oKFteOi8/I10rKTopPyhcXC9cXC8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/JC8pO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvLyBjb2VyY2UgdG8gdW5kZWZpbmVkIHZhbHVlcyB0byBlbXB0eSBzdHJpbmcgc28gd2UgZG9uJ3QgZ2V0ICd1bmRlZmluZWQnXG4gIGNvbnN0IHF1ZXJ5ID0gbWF0Y2hbNl0gfHwgJyc7XG4gIGNvbnN0IGZyYWdtZW50ID0gbWF0Y2hbOF0gfHwgJyc7XG4gIHJldHVybiB7XG4gICAgaG9zdDogbWF0Y2hbNF0sXG4gICAgcGF0aDogbWF0Y2hbNV0sXG4gICAgcHJvdG9jb2w6IG1hdGNoWzJdLFxuICAgIHJlbGF0aXZlOiBtYXRjaFs1XSArIHF1ZXJ5ICsgZnJhZ21lbnQsIC8vIGV2ZXJ5dGhpbmcgbWludXMgb3JpZ2luXG4gIH07XG59XG5cbi8qKlxuICogRXh0cmFjdHMgZWl0aGVyIG1lc3NhZ2Ugb3IgdHlwZSt2YWx1ZSBmcm9tIGFuIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgZm9yIHVzZXItZmFjaW5nIGxvZ3NcbiAqIEByZXR1cm5zIGV2ZW50J3MgZGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQ6IEV2ZW50KTogc3RyaW5nIHtcbiAgaWYgKGV2ZW50Lm1lc3NhZ2UpIHtcbiAgICByZXR1cm4gZXZlbnQubWVzc2FnZTtcbiAgfVxuICBpZiAoZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSkge1xuICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF07XG5cbiAgICBpZiAoZXhjZXB0aW9uLnR5cGUgJiYgZXhjZXB0aW9uLnZhbHVlKSB7XG4gICAgICByZXR1cm4gYCR7ZXhjZXB0aW9uLnR5cGV9OiAke2V4Y2VwdGlvbi52YWx1ZX1gO1xuICAgIH1cbiAgICByZXR1cm4gZXhjZXB0aW9uLnR5cGUgfHwgZXhjZXB0aW9uLnZhbHVlIHx8IGV2ZW50LmV2ZW50X2lkIHx8ICc8dW5rbm93bj4nO1xuICB9XG4gIHJldHVybiBldmVudC5ldmVudF9pZCB8fCAnPHVua25vd24+Jztcbn1cblxuLyoqXG4gKiBBZGRzIGV4Y2VwdGlvbiB2YWx1ZXMsIHR5cGUgYW5kIHZhbHVlIHRvIGFuIHN5bnRoZXRpYyBFeGNlcHRpb24uXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGUgZXhjZXB0aW9uLlxuICogQHBhcmFtIHR5cGUgVHlwZSBvZiB0aGUgZXhjZXB0aW9uLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRXhjZXB0aW9uVHlwZVZhbHVlKGV2ZW50OiBFdmVudCwgdmFsdWU/OiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgZXZlbnQuZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uIHx8IHt9O1xuICBldmVudC5leGNlcHRpb24udmFsdWVzID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyB8fCBbXTtcbiAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0gfHwge307XG4gIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udmFsdWUgPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnZhbHVlIHx8IHZhbHVlIHx8ICcnO1xuICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnR5cGUgPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnR5cGUgfHwgdHlwZSB8fCAnRXJyb3InO1xufVxuXG4vKipcbiAqIEFkZHMgZXhjZXB0aW9uIG1lY2hhbmlzbSBkYXRhIHRvIGEgZ2l2ZW4gZXZlbnQuIFVzZXMgZGVmYXVsdHMgaWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgbm90IHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBuZXdNZWNoYW5pc20gTWVjaGFuaXNtIGRhdGEgdG8gYWRkIHRvIHRoZSBldmVudC5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudDogRXZlbnQsIG5ld01lY2hhbmlzbT86IFBhcnRpYWw8TWVjaGFuaXNtPik6IHZvaWQge1xuICBpZiAoIWV2ZW50LmV4Y2VwdGlvbiB8fCAhZXZlbnQuZXhjZXB0aW9uLnZhbHVlcykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBleGNlcHRpb25WYWx1ZTAgPSBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuXG4gIGNvbnN0IGRlZmF1bHRNZWNoYW5pc20gPSB7IHR5cGU6ICdnZW5lcmljJywgaGFuZGxlZDogdHJ1ZSB9O1xuICBjb25zdCBjdXJyZW50TWVjaGFuaXNtID0gZXhjZXB0aW9uVmFsdWUwLm1lY2hhbmlzbTtcbiAgZXhjZXB0aW9uVmFsdWUwLm1lY2hhbmlzbSA9IHsgLi4uZGVmYXVsdE1lY2hhbmlzbSwgLi4uY3VycmVudE1lY2hhbmlzbSwgLi4ubmV3TWVjaGFuaXNtIH07XG5cbiAgaWYgKG5ld01lY2hhbmlzbSAmJiAnZGF0YScgaW4gbmV3TWVjaGFuaXNtKSB7XG4gICAgY29uc3QgbWVyZ2VkRGF0YSA9IHsgLi4uY3VycmVudE1lY2hhbmlzbT8uZGF0YSwgLi4ubmV3TWVjaGFuaXNtLmRhdGEgfTtcbiAgICBleGNlcHRpb25WYWx1ZTAubWVjaGFuaXNtLmRhdGEgPSBtZXJnZWREYXRhO1xuICB9XG59XG5cbi8vIGh0dHBzOi8vc2VtdmVyLm9yZy8jaXMtdGhlcmUtYS1zdWdnZXN0ZWQtcmVndWxhci1leHByZXNzaW9uLXJlZ2V4LXRvLWNoZWNrLWEtc2VtdmVyLXN0cmluZ1xuY29uc3QgU0VNVkVSX1JFR0VYUCA9IC9eKDB8WzEtOV1cXGQqKVxcLigwfFsxLTldXFxkKilcXC4oMHxbMS05XVxcZCopKD86LSgoPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikoPzpcXC4oPzowfFsxLTldXFxkKnxcXGQqW2EtekEtWi1dWzAtOWEtekEtWi1dKikpKikpPyg/OlxcKyhbMC05YS16QS1aLV0rKD86XFwuWzAtOWEtekEtWi1dKykqKSk/JC87XG5cbi8qKlxuICogUmVwcmVzZW50cyBTZW1hbnRpYyBWZXJzaW9uaW5nIG9iamVjdFxuICovXG5pbnRlcmZhY2UgU2VtVmVyIHtcbiAgbWFqb3I/OiBudW1iZXI7XG4gIG1pbm9yPzogbnVtYmVyO1xuICBwYXRjaD86IG51bWJlcjtcbiAgcHJlcmVsZWFzZT86IHN0cmluZztcbiAgYnVpbGRtZXRhZGF0YT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJzZXMgaW5wdXQgaW50byBhIFNlbVZlciBpbnRlcmZhY2VcbiAqIEBwYXJhbSBpbnB1dCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBzZW12ZXIgdmVyc2lvblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZW12ZXIoaW5wdXQ6IHN0cmluZyk6IFNlbVZlciB7XG4gIGNvbnN0IG1hdGNoID0gaW5wdXQubWF0Y2goU0VNVkVSX1JFR0VYUCkgfHwgW107XG4gIGNvbnN0IG1ham9yID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgY29uc3QgbWlub3IgPSBwYXJzZUludChtYXRjaFsyXSwgMTApO1xuICBjb25zdCBwYXRjaCA9IHBhcnNlSW50KG1hdGNoWzNdLCAxMCk7XG4gIHJldHVybiB7XG4gICAgYnVpbGRtZXRhZGF0YTogbWF0Y2hbNV0sXG4gICAgbWFqb3I6IGlzTmFOKG1ham9yKSA/IHVuZGVmaW5lZCA6IG1ham9yLFxuICAgIG1pbm9yOiBpc05hTihtaW5vcikgPyB1bmRlZmluZWQgOiBtaW5vcixcbiAgICBwYXRjaDogaXNOYU4ocGF0Y2gpID8gdW5kZWZpbmVkIDogcGF0Y2gsXG4gICAgcHJlcmVsZWFzZTogbWF0Y2hbNF0sXG4gIH07XG59XG5cbmNvbnN0IGRlZmF1bHRSZXRyeUFmdGVyID0gNjAgKiAxMDAwOyAvLyA2MCBzZWNvbmRzXG5cbi8qKlxuICogRXh0cmFjdHMgUmV0cnktQWZ0ZXIgdmFsdWUgZnJvbSB0aGUgcmVxdWVzdCBoZWFkZXIgb3IgcmV0dXJucyBkZWZhdWx0IHZhbHVlXG4gKiBAcGFyYW0gbm93IGN1cnJlbnQgdW5peCB0aW1lc3RhbXBcbiAqIEBwYXJhbSBoZWFkZXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mICdSZXRyeS1BZnRlcicgaGVhZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJldHJ5QWZ0ZXJIZWFkZXIobm93OiBudW1iZXIsIGhlYWRlcj86IHN0cmluZyB8IG51bWJlciB8IG51bGwpOiBudW1iZXIge1xuICBpZiAoIWhlYWRlcikge1xuICAgIHJldHVybiBkZWZhdWx0UmV0cnlBZnRlcjtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlckRlbGF5ID0gcGFyc2VJbnQoYCR7aGVhZGVyfWAsIDEwKTtcbiAgaWYgKCFpc05hTihoZWFkZXJEZWxheSkpIHtcbiAgICByZXR1cm4gaGVhZGVyRGVsYXkgKiAxMDAwO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyRGF0ZSA9IERhdGUucGFyc2UoYCR7aGVhZGVyfWApO1xuICBpZiAoIWlzTmFOKGhlYWRlckRhdGUpKSB7XG4gICAgcmV0dXJuIGhlYWRlckRhdGUgLSBub3c7XG4gIH1cblxuICByZXR1cm4gZGVmYXVsdFJldHJ5QWZ0ZXI7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBhZGRzIGNvbnRleHQgKHByZS9wb3N0L2xpbmUpIGxpbmVzIHRvIHRoZSBwcm92aWRlZCBmcmFtZVxuICpcbiAqIEBwYXJhbSBsaW5lcyBzdHJpbmdbXSBjb250YWluaW5nIGFsbCBsaW5lc1xuICogQHBhcmFtIGZyYW1lIFN0YWNrRnJhbWUgdGhhdCB3aWxsIGJlIG11dGF0ZWRcbiAqIEBwYXJhbSBsaW5lc09mQ29udGV4dCBudW1iZXIgb2YgY29udGV4dCBsaW5lcyB3ZSB3YW50IHRvIGFkZCBwcmUvcG9zdFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQ29udGV4dFRvRnJhbWUobGluZXM6IHN0cmluZ1tdLCBmcmFtZTogU3RhY2tGcmFtZSwgbGluZXNPZkNvbnRleHQ6IG51bWJlciA9IDUpOiB2b2lkIHtcbiAgY29uc3QgbGluZW5vID0gZnJhbWUubGluZW5vIHx8IDA7XG4gIGNvbnN0IG1heExpbmVzID0gbGluZXMubGVuZ3RoO1xuICBjb25zdCBzb3VyY2VMaW5lID0gTWF0aC5tYXgoTWF0aC5taW4obWF4TGluZXMsIGxpbmVubyAtIDEpLCAwKTtcblxuICBmcmFtZS5wcmVfY29udGV4dCA9IGxpbmVzXG4gICAgLnNsaWNlKE1hdGgubWF4KDAsIHNvdXJjZUxpbmUgLSBsaW5lc09mQ29udGV4dCksIHNvdXJjZUxpbmUpXG4gICAgLm1hcCgobGluZTogc3RyaW5nKSA9PiBzbmlwTGluZShsaW5lLCAwKSk7XG5cbiAgZnJhbWUuY29udGV4dF9saW5lID0gc25pcExpbmUobGluZXNbTWF0aC5taW4obWF4TGluZXMgLSAxLCBzb3VyY2VMaW5lKV0sIGZyYW1lLmNvbG5vIHx8IDApO1xuXG4gIGZyYW1lLnBvc3RfY29udGV4dCA9IGxpbmVzXG4gICAgLnNsaWNlKE1hdGgubWluKHNvdXJjZUxpbmUgKyAxLCBtYXhMaW5lcyksIHNvdXJjZUxpbmUgKyAxICsgbGluZXNPZkNvbnRleHQpXG4gICAgLm1hcCgobGluZTogc3RyaW5nKSA9PiBzbmlwTGluZShsaW5lLCAwKSk7XG59XG5cbi8qKlxuICogU3RyaXAgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgZnJhZ21lbnQgb2ZmIG9mIGEgZ2l2ZW4gVVJMIG9yIHBhdGggKGlmIHByZXNlbnQpXG4gKlxuICogQHBhcmFtIHVybFBhdGggRnVsbCBVUkwgb3IgcGF0aCwgaW5jbHVkaW5nIHBvc3NpYmxlIHF1ZXJ5IHN0cmluZyBhbmQvb3IgZnJhZ21lbnRcbiAqIEByZXR1cm5zIFVSTCBvciBwYXRoIHdpdGhvdXQgcXVlcnkgc3RyaW5nIG9yIGZyYWdtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFVybFF1ZXJ5QW5kRnJhZ21lbnQodXJsUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIHJldHVybiB1cmxQYXRoLnNwbGl0KC9bXFw/I10vLCAxKVswXTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBvciBub3Qgd2UndmUgYWxyZWFkeSBjYXB0dXJlZCB0aGUgZ2l2ZW4gZXhjZXB0aW9uIChub3RlOiBub3QgYW4gaWRlbnRpY2FsIGV4Y2VwdGlvbiAtIHRoZSB2ZXJ5IG9iamVjdFxuICogaW4gcXVlc3Rpb24pLCBhbmQgbWFya3MgaXQgY2FwdHVyZWQgaWYgbm90LlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgaXQncyBwb3NzaWJsZSBmb3IgYW4gZXJyb3IgdG8gZ2V0IGNhcHR1cmVkIGJ5IG1vcmUgdGhhbiBvbmUgbWVjaGFuaXNtLiBBZnRlciB3ZSBpbnRlcmNlcHQgYW5kXG4gKiByZWNvcmQgYW4gZXJyb3IsIHdlIHJldGhyb3cgaXQgKGFzc3VtaW5nIHdlJ3ZlIGludGVyY2VwdGVkIGl0IGJlZm9yZSBpdCdzIHJlYWNoZWQgdGhlIHRvcC1sZXZlbCBnbG9iYWwgaGFuZGxlcnMpLCBzb1xuICogdGhhdCB3ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCB3aGF0ZXZlciBlZmZlY3RzIHRoZSBlcnJvciBtaWdodCBoYXZlIGhhZCB3ZXJlIHRoZSBTREsgbm90IHRoZXJlLiBBdCB0aGF0IHBvaW50LCBiZWNhdXNlXG4gKiB0aGUgZXJyb3IgaGFzIGJlZW4gcmV0aHJvd24sIGl0J3MgcG9zc2libGUgZm9yIGl0IHRvIGJ1YmJsZSB1cCB0byBzb21lIG90aGVyIGNvZGUgd2UndmUgaW5zdHJ1bWVudGVkLiBJZiBpdCdzIG5vdFxuICogY2F1Z2h0IGFmdGVyIHRoYXQsIGl0IHdpbGwgYnViYmxlIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSBnbG9iYWwgaGFuZGxlcnMgKHdoaWNoIG9mIGNvdXJzZSB3ZSBhbHNvIGluc3RydW1lbnQpLiBUaGlzXG4gKiBmdW5jdGlvbiBoZWxwcyB1cyBlbnN1cmUgdGhhdCBldmVuIGlmIHdlIGVuY291bnRlciB0aGUgc2FtZSBlcnJvciBtb3JlIHRoYW4gb25jZSwgd2Ugb25seSByZWNvcmQgaXQgdGhlIGZpcnN0IHRpbWUgd2VcbiAqIHNlZSBpdC5cbiAqXG4gKiBOb3RlOiBJdCB3aWxsIGlnbm9yZSBwcmltaXRpdmVzIChhbHdheXMgcmV0dXJuIGBmYWxzZWAgYW5kIG5vdCBtYXJrIHRoZW0gYXMgc2VlbiksIGFzIHByb3BlcnRpZXMgY2FuJ3QgYmUgc2V0IG9uXG4gKiB0aGVtLiB7QGxpbms6IE9iamVjdC5vYmplY3RpZnl9IGNhbiBiZSB1c2VkIG9uIGV4Y2VwdGlvbnMgdG8gY29udmVydCBhbnkgdGhhdCBhcmUgcHJpbWl0aXZlcyBpbnRvIHRoZWlyIGVxdWl2YWxlbnRcbiAqIG9iamVjdCB3cmFwcGVyIGZvcm1zIHNvIHRoYXQgdGhpcyBjaGVjayB3aWxsIGFsd2F5cyB3b3JrLiBIb3dldmVyLCBiZWNhdXNlIHdlIG5lZWQgdG8gZmxhZyB0aGUgZXhhY3Qgb2JqZWN0IHdoaWNoXG4gKiB3aWxsIGdldCByZXRocm93biwgYW5kIGJlY2F1c2UgdGhhdCByZXRocm93aW5nIGhhcHBlbnMgb3V0c2lkZSBvZiB0aGUgZXZlbnQgcHJvY2Vzc2luZyBwaXBlbGluZSwgdGhlIG9iamVjdGlmaWNhdGlvblxuICogbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgZXhjZXB0aW9uIGNhcHR1cmVkLlxuICpcbiAqIEBwYXJhbSBBIHRocm93biBleGNlcHRpb24gdG8gY2hlY2sgb3IgZmxhZyBhcyBoYXZpbmcgYmVlbiBzZWVuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGV4Y2VwdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhcHR1cmVkLCBgZmFsc2VgIGlmIG5vdCAod2l0aCB0aGUgc2lkZSBlZmZlY3Qgb2YgbWFya2luZyBpdCBzZWVuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tPclNldEFscmVhZHlDYXVnaHQoZXhjZXB0aW9uOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgaWYgKChleGNlcHRpb24gYXMgYW55KT8uX19zZW50cnlfY2FwdHVyZWRfXykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBzZXQgaXQgdGhpcyB3YXkgcmF0aGVyIHRoYW4gYnkgYXNzaWdubWVudCBzbyB0aGF0IGl0J3Mgbm90IGVubnVtZXJhYmxlIGFuZCB0aGVyZWZvcmUgaXNuJ3QgcmVjb3JkZWQgYnkgdGhlXG4gICAgLy8gYEV4dHJhRXJyb3JEYXRhYCBpbnRlZ3JhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleGNlcHRpb24sICdfX3NlbnRyeV9jYXB0dXJlZF9fJywge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vIGBleGNlcHRpb25gIGlzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4ndCBtYXJrIGl0IHNlZW5cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cbiIsICIvLyBTbGlnaHRseSBtb2RpZmllZCAobm8gSUU4IHN1cHBvcnQsIEVTNikgYW5kIHRyYW5zY3JpYmVkIHRvIFR5cGVTY3JpcHRcbi8vIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9jYWx2aW5tZXRjYWxmL3JvbGx1cC1wbHVnaW4tbm9kZS1idWlsdGlucy9tYXN0ZXIvc3JjL2VzNi9wYXRoLmpzXG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHM6IHN0cmluZ1tdLCBhbGxvd0Fib3ZlUm9vdD86IGJvb2xlYW4pOiBzdHJpbmdbXSB7XG4gIC8vIGlmIHRoZSBwYXRoIHRyaWVzIHRvIGdvIGFib3ZlIHRoZSByb290LCBgdXBgIGVuZHMgdXAgPiAwXG4gIGxldCB1cCA9IDA7XG4gIGZvciAobGV0IGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGxhc3QgPSBwYXJ0c1tpXTtcbiAgICBpZiAobGFzdCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChsYXN0ID09PSAnLi4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCkge1xuICAgICAgcGFydHMuc3BsaWNlKGksIDEpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG4gICAgICB1cC0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBwYXRoIGlzIGFsbG93ZWQgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIHJlc3RvcmUgbGVhZGluZyAuLnNcbiAgaWYgKGFsbG93QWJvdmVSb290KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG4gICAgZm9yICg7IHVwLS07IHVwKSB7XG4gICAgICBwYXJ0cy51bnNoaWZ0KCcuLicpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwYXJ0cztcbn1cblxuLy8gU3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdLCB1bml4IHZlcnNpb25cbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXG5jb25zdCBzcGxpdFBhdGhSZSA9IC9eKFxcLz98KShbXFxzXFxTXSo/KSgoPzpcXC57MSwyfXxbXi9dKz98KShcXC5bXi4vXSp8KSkoPzpbL10qKSQvO1xuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBzcGxpdFBhdGgoZmlsZW5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGFydHMgPSBzcGxpdFBhdGhSZS5leGVjKGZpbGVuYW1lKTtcbiAgcmV0dXJuIHBhcnRzID8gcGFydHMuc2xpY2UoMSkgOiBbXTtcbn1cblxuLy8gcGF0aC5yZXNvbHZlKFtmcm9tIC4uLl0sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZSguLi5hcmdzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGxldCByZXNvbHZlZFBhdGggPSAnJztcbiAgbGV0IHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gYXJncy5sZW5ndGggLSAxOyBpID49IC0xICYmICFyZXNvbHZlZEFic29sdXRlOyBpLS0pIHtcbiAgICBjb25zdCBwYXRoID0gaSA+PSAwID8gYXJnc1tpXSA6ICcvJztcblxuICAgIC8vIFNraXAgZW1wdHkgZW50cmllc1xuICAgIGlmICghcGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcmVzb2x2ZWRQYXRoID0gYCR7cGF0aH0vJHtyZXNvbHZlZFBhdGh9YDtcbiAgICByZXNvbHZlZEFic29sdXRlID0gcGF0aC5jaGFyQXQoMCkgPT09ICcvJztcbiAgfVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXRcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KFxuICAgIHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLmZpbHRlcihwID0+ICEhcCksXG4gICAgIXJlc29sdmVkQWJzb2x1dGUsXG4gICkuam9pbignLycpO1xuXG4gIHJldHVybiAocmVzb2x2ZWRBYnNvbHV0ZSA/ICcvJyA6ICcnKSArIHJlc29sdmVkUGF0aCB8fCAnLic7XG59XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gdHJpbShhcnI6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICBsZXQgc3RhcnQgPSAwO1xuICBmb3IgKDsgc3RhcnQgPCBhcnIubGVuZ3RoOyBzdGFydCsrKSB7XG4gICAgaWYgKGFycltzdGFydF0gIT09ICcnKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBsZXQgZW5kID0gYXJyLmxlbmd0aCAtIDE7XG4gIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcbiAgICBpZiAoYXJyW2VuZF0gIT09ICcnKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhcnQgPiBlbmQpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIGFyci5zbGljZShzdGFydCwgZW5kIC0gc3RhcnQgKyAxKTtcbn1cblxuLy8gcGF0aC5yZWxhdGl2ZShmcm9tLCB0bylcbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb206IHN0cmluZywgdG86IHN0cmluZyk6IHN0cmluZyB7XG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXBhcmFtLXJlYXNzaWduICovXG4gIGZyb20gPSByZXNvbHZlKGZyb20pLnN1YnN0cigxKTtcbiAgdG8gPSByZXNvbHZlKHRvKS5zdWJzdHIoMSk7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cblxuICBjb25zdCBmcm9tUGFydHMgPSB0cmltKGZyb20uc3BsaXQoJy8nKSk7XG4gIGNvbnN0IHRvUGFydHMgPSB0cmltKHRvLnNwbGl0KCcvJykpO1xuXG4gIGNvbnN0IGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcbiAgbGV0IHNhbWVQYXJ0c0xlbmd0aCA9IGxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBsZXQgb3V0cHV0UGFydHMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IHNhbWVQYXJ0c0xlbmd0aDsgaSA8IGZyb21QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XG4gIH1cblxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xuXG4gIHJldHVybiBvdXRwdXRQYXJ0cy5qb2luKCcvJyk7XG59XG5cbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXG4vLyBwb3NpeCB2ZXJzaW9uXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGlzUGF0aEFic29sdXRlID0gaXNBYnNvbHV0ZShwYXRoKTtcbiAgY29uc3QgdHJhaWxpbmdTbGFzaCA9IHBhdGguc3Vic3RyKC0xKSA9PT0gJy8nO1xuXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICBsZXQgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVBcnJheShcbiAgICBwYXRoLnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gISFwKSxcbiAgICAhaXNQYXRoQWJzb2x1dGUsXG4gICkuam9pbignLycpO1xuXG4gIGlmICghbm9ybWFsaXplZFBhdGggJiYgIWlzUGF0aEFic29sdXRlKSB7XG4gICAgbm9ybWFsaXplZFBhdGggPSAnLic7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRQYXRoICYmIHRyYWlsaW5nU2xhc2gpIHtcbiAgICBub3JtYWxpemVkUGF0aCArPSAnLyc7XG4gIH1cblxuICByZXR1cm4gKGlzUGF0aEFic29sdXRlID8gJy8nIDogJycpICsgbm9ybWFsaXplZFBhdGg7XG59XG5cbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQWJzb2x1dGUocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xufVxuXG4vLyBwb3NpeCB2ZXJzaW9uXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVBhdGgoYXJncy5qb2luKCcvJykpO1xufVxuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJuYW1lKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc3VsdCA9IHNwbGl0UGF0aChwYXRoKTtcbiAgY29uc3Qgcm9vdCA9IHJlc3VsdFswXTtcbiAgbGV0IGRpciA9IHJlc3VsdFsxXTtcblxuICBpZiAoIXJvb3QgJiYgIWRpcikge1xuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxuICAgIHJldHVybiAnLic7XG4gIH1cblxuICBpZiAoZGlyKSB7XG4gICAgLy8gSXQgaGFzIGEgZGlybmFtZSwgc3RyaXAgdHJhaWxpbmcgc2xhc2hcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiByb290ICsgZGlyO1xufVxuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbmFtZShwYXRoOiBzdHJpbmcsIGV4dD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBmID0gc3BsaXRQYXRoKHBhdGgpWzJdO1xuICBpZiAoZXh0ICYmIGYuc3Vic3RyKGV4dC5sZW5ndGggKiAtMSkgPT09IGV4dCkge1xuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBmO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1mdW5jdGlvbi1yZXR1cm4tdHlwZSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVkZWYgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IGlzVGhlbmFibGUgfSBmcm9tICcuL2lzJztcblxuLyoqIFN5bmNQcm9taXNlIGludGVybmFsIHN0YXRlcyAqL1xuY29uc3QgZW51bSBTdGF0ZXMge1xuICAvKiogUGVuZGluZyAqL1xuICBQRU5ESU5HID0gJ1BFTkRJTkcnLFxuICAvKiogUmVzb2x2ZWQgLyBPSyAqL1xuICBSRVNPTFZFRCA9ICdSRVNPTFZFRCcsXG4gIC8qKiBSZWplY3RlZCAvIEVycm9yICovXG4gIFJFSkVDVEVEID0gJ1JFSkVDVEVEJyxcbn1cblxuLyoqXG4gKiBUaGVuYWJsZSBjbGFzcyB0aGF0IGJlaGF2ZXMgbGlrZSBhIFByb21pc2UgYW5kIGZvbGxvd3MgaXQncyBpbnRlcmZhY2VcbiAqIGJ1dCBpcyBub3QgYXN5bmMgaW50ZXJuYWxseVxuICovXG5jbGFzcyBTeW5jUHJvbWlzZTxUPiBpbXBsZW1lbnRzIFByb21pc2VMaWtlPFQ+IHtcbiAgcHJpdmF0ZSBfc3RhdGU6IFN0YXRlcyA9IFN0YXRlcy5QRU5ESU5HO1xuICBwcml2YXRlIF9oYW5kbGVyczogQXJyYXk8e1xuICAgIGRvbmU6IGJvb2xlYW47XG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUIHwgUHJvbWlzZUxpa2U8VD4pIHwgbnVsbDtcbiAgICBvbnJlamVjdGVkPzogKChyZWFzb246IGFueSkgPT4gYW55KSB8IG51bGw7XG4gIH0+ID0gW107XG4gIHByaXZhdGUgX3ZhbHVlOiBhbnk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIGV4ZWN1dG9yOiAocmVzb2x2ZTogKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+IHwgbnVsbCkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PiB2b2lkKSA9PiB2b2lkLFxuICApIHtcbiAgICB0cnkge1xuICAgICAgZXhlY3V0b3IodGhpcy5fcmVzb2x2ZSwgdGhpcy5fcmVqZWN0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl9yZWplY3QoZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBzdGF0aWMgcmVzb2x2ZTxUPih2YWx1ZTogVCB8IFByb21pc2VMaWtlPFQ+KTogUHJvbWlzZUxpa2U8VD4ge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgc3RhdGljIHJlamVjdDxUID0gbmV2ZXI+KHJlYXNvbj86IGFueSk6IFByb21pc2VMaWtlPFQ+IHtcbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKChfLCByZWplY3QpID0+IHtcbiAgICAgIHJlamVjdChyZWFzb24pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBzdGF0aWMgYWxsPFUgPSBhbnk+KGNvbGxlY3Rpb246IEFycmF5PFUgfCBQcm9taXNlTGlrZTxVPj4pOiBQcm9taXNlTGlrZTxVW10+IHtcbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPFVbXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICAgIHJlamVjdChuZXcgVHlwZUVycm9yKGBQcm9taXNlLmFsbCByZXF1aXJlcyBhbiBhcnJheSBhcyBpbnB1dC5gKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbGxlY3Rpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlc29sdmUoW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBjb3VudGVyID0gY29sbGVjdGlvbi5sZW5ndGg7XG4gICAgICBjb25zdCByZXNvbHZlZENvbGxlY3Rpb246IFVbXSA9IFtdO1xuXG4gICAgICBjb2xsZWN0aW9uLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgIHZvaWQgU3luY1Byb21pc2UucmVzb2x2ZShpdGVtKVxuICAgICAgICAgIC50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVkQ29sbGVjdGlvbltpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIGNvdW50ZXIgLT0gMTtcblxuICAgICAgICAgICAgaWYgKGNvdW50ZXIgIT09IDApIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZENvbGxlY3Rpb24pO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4obnVsbCwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyB0aGVuPFRSZXN1bHQxID0gVCwgVFJlc3VsdDIgPSBuZXZlcj4oXG4gICAgb25mdWxmaWxsZWQ/OiAoKHZhbHVlOiBUKSA9PiBUUmVzdWx0MSB8IFByb21pc2VMaWtlPFRSZXN1bHQxPikgfCBudWxsLFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0MiB8IFByb21pc2VMaWtlPFRSZXN1bHQyPikgfCBudWxsLFxuICApOiBQcm9taXNlTGlrZTxUUmVzdWx0MSB8IFRSZXN1bHQyPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLl9hdHRhY2hIYW5kbGVyKHtcbiAgICAgICAgZG9uZTogZmFsc2UsXG4gICAgICAgIG9uZnVsZmlsbGVkOiByZXN1bHQgPT4ge1xuICAgICAgICAgIGlmICghb25mdWxmaWxsZWQpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IFx1MDBBRlxcXyhcdTMwQzQpXy9cdTAwQUZcbiAgICAgICAgICAgIC8vIFRPRE86IEZJWE1FXG4gICAgICAgICAgICByZXNvbHZlKHJlc3VsdCBhcyBhbnkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzb2x2ZShvbmZ1bGZpbGxlZChyZXN1bHQpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbnJlamVjdGVkOiByZWFzb24gPT4ge1xuICAgICAgICAgIGlmICghb25yZWplY3RlZCkge1xuICAgICAgICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlKG9ucmVqZWN0ZWQocmVhc29uKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBjYXRjaDxUUmVzdWx0ID0gbmV2ZXI+KFxuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBUUmVzdWx0IHwgUHJvbWlzZUxpa2U8VFJlc3VsdD4pIHwgbnVsbCxcbiAgKTogUHJvbWlzZUxpa2U8VCB8IFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy50aGVuKHZhbCA9PiB2YWwsIG9ucmVqZWN0ZWQpO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBmaW5hbGx5PFRSZXN1bHQ+KG9uZmluYWxseT86ICgoKSA9PiB2b2lkKSB8IG51bGwpOiBQcm9taXNlTGlrZTxUUmVzdWx0PiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxUUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgdmFsOiBUUmVzdWx0IHwgYW55O1xuICAgICAgbGV0IGlzUmVqZWN0ZWQ6IGJvb2xlYW47XG5cbiAgICAgIHJldHVybiB0aGlzLnRoZW4oXG4gICAgICAgIHZhbHVlID0+IHtcbiAgICAgICAgICBpc1JlamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgdmFsID0gdmFsdWU7XG4gICAgICAgICAgaWYgKG9uZmluYWxseSkge1xuICAgICAgICAgICAgb25maW5hbGx5KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICByZWFzb24gPT4ge1xuICAgICAgICAgIGlzUmVqZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgIHZhbCA9IHJlYXNvbjtcbiAgICAgICAgICBpZiAob25maW5hbGx5KSB7XG4gICAgICAgICAgICBvbmZpbmFsbHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAoaXNSZWplY3RlZCkge1xuICAgICAgICAgIHJlamVjdCh2YWwpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc29sdmUoKHZhbCBhcyB1bmtub3duKSBhcyBhbnkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdbb2JqZWN0IFN5bmNQcm9taXNlXSc7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcmVzb2x2ZSA9ICh2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPiB8IG51bGwpID0+IHtcbiAgICB0aGlzLl9zZXRSZXN1bHQoU3RhdGVzLlJFU09MVkVELCB2YWx1ZSk7XG4gIH07XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JlamVjdCA9IChyZWFzb24/OiBhbnkpID0+IHtcbiAgICB0aGlzLl9zZXRSZXN1bHQoU3RhdGVzLlJFSkVDVEVELCByZWFzb24pO1xuICB9O1xuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9zZXRSZXN1bHQgPSAoc3RhdGU6IFN0YXRlcywgdmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4gfCBhbnkpID0+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUgIT09IFN0YXRlcy5QRU5ESU5HKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICB2b2lkICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbih0aGlzLl9yZXNvbHZlLCB0aGlzLl9yZWplY3QpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXRlID0gc3RhdGU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcblxuICAgIHRoaXMuX2V4ZWN1dGVIYW5kbGVycygpO1xuICB9O1xuXG4gIC8vIFRPRE86IEZJWE1FXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9hdHRhY2hIYW5kbGVyID0gKGhhbmRsZXI6IHtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBkb25lOiBib29sZWFuO1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIG9uZnVsZmlsbGVkPyh2YWx1ZTogVCk6IGFueTtcbiAgICAvKiogSlNEb2MgKi9cbiAgICBvbnJlamVjdGVkPyhyZWFzb246IGFueSk6IGFueTtcbiAgfSkgPT4ge1xuICAgIHRoaXMuX2hhbmRsZXJzID0gdGhpcy5faGFuZGxlcnMuY29uY2F0KGhhbmRsZXIpO1xuICAgIHRoaXMuX2V4ZWN1dGVIYW5kbGVycygpO1xuICB9O1xuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9leGVjdXRlSGFuZGxlcnMgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlID09PSBTdGF0ZXMuUEVORElORykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZEhhbmRsZXJzID0gdGhpcy5faGFuZGxlcnMuc2xpY2UoKTtcbiAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuXG4gICAgY2FjaGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgIGlmIChoYW5kbGVyLmRvbmUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fc3RhdGUgPT09IFN0YXRlcy5SRVNPTFZFRCkge1xuICAgICAgICBpZiAoaGFuZGxlci5vbmZ1bGZpbGxlZCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgICBoYW5kbGVyLm9uZnVsZmlsbGVkKCh0aGlzLl92YWx1ZSBhcyB1bmtub3duKSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU3RhdGVzLlJFSkVDVEVEKSB7XG4gICAgICAgIGlmIChoYW5kbGVyLm9ucmVqZWN0ZWQpIHtcbiAgICAgICAgICBoYW5kbGVyLm9ucmVqZWN0ZWQodGhpcy5fdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZXIuZG9uZSA9IHRydWU7XG4gICAgfSk7XG4gIH07XG59XG5cbmV4cG9ydCB7IFN5bmNQcm9taXNlIH07XG4iLCAiaW1wb3J0IHsgU2VudHJ5RXJyb3IgfSBmcm9tICcuL2Vycm9yJztcbmltcG9ydCB7IFN5bmNQcm9taXNlIH0gZnJvbSAnLi9zeW5jcHJvbWlzZSc7XG5cbi8qKiBBIHNpbXBsZSBxdWV1ZSB0aGF0IGhvbGRzIHByb21pc2VzLiAqL1xuZXhwb3J0IGNsYXNzIFByb21pc2VCdWZmZXI8VD4ge1xuICAvKiogSW50ZXJuYWwgc2V0IG9mIHF1ZXVlZCBQcm9taXNlcyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9idWZmZXI6IEFycmF5PFByb21pc2VMaWtlPFQ+PiA9IFtdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2xpbWl0PzogbnVtYmVyKSB7fVxuXG4gIC8qKlxuICAgKiBTYXlzIGlmIHRoZSBidWZmZXIgaXMgcmVhZHkgdG8gdGFrZSBtb3JlIHJlcXVlc3RzXG4gICAqL1xuICBwdWJsaWMgaXNSZWFkeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbGltaXQgPT09IHVuZGVmaW5lZCB8fCB0aGlzLmxlbmd0aCgpIDwgdGhpcy5fbGltaXQ7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcHJvbWlzZSAocmVwcmVzZW50aW5nIGFuIGluLWZsaWdodCBhY3Rpb24pIHRvIHRoZSBxdWV1ZSwgYW5kIHNldCBpdCB0byByZW1vdmUgaXRzZWxmIG9uIGZ1bGZpbGxtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gdGFza1Byb2R1Y2VyIEEgZnVuY3Rpb24gcHJvZHVjaW5nIGFueSBQcm9taXNlTGlrZTxUPjsgSW4gcHJldmlvdXMgdmVyc2lvbnMgdGhpcyB1c2VkIHRvIGJlIGB0YXNrOlxuICAgKiAgICAgICAgUHJvbWlzZUxpa2U8VD5gLCBidXQgdW5kZXIgdGhhdCBtb2RlbCwgUHJvbWlzZXMgd2VyZSBpbnN0YW50bHkgY3JlYXRlZCBvbiB0aGUgY2FsbC1zaXRlIGFuZCB0aGVpciBleGVjdXRvclxuICAgKiAgICAgICAgZnVuY3Rpb25zIHRoZXJlZm9yZSByYW4gaW1tZWRpYXRlbHkuIFRodXMsIGV2ZW4gaWYgdGhlIGJ1ZmZlciB3YXMgZnVsbCwgdGhlIGFjdGlvbiBzdGlsbCBoYXBwZW5lZC4gQnlcbiAgICogICAgICAgIHJlcXVpcmluZyB0aGUgcHJvbWlzZSB0byBiZSB3cmFwcGVkIGluIGEgZnVuY3Rpb24sIHdlIGNhbiBkZWZlciBwcm9taXNlIGNyZWF0aW9uIHVudGlsIGFmdGVyIHRoZSBidWZmZXJcbiAgICogICAgICAgIGxpbWl0IGNoZWNrLlxuICAgKiBAcmV0dXJucyBUaGUgb3JpZ2luYWwgcHJvbWlzZS5cbiAgICovXG4gIHB1YmxpYyBhZGQodGFza1Byb2R1Y2VyOiAoKSA9PiBQcm9taXNlTGlrZTxUPik6IFByb21pc2VMaWtlPFQ+IHtcbiAgICBpZiAoIXRoaXMuaXNSZWFkeSgpKSB7XG4gICAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KG5ldyBTZW50cnlFcnJvcignTm90IGFkZGluZyBQcm9taXNlIGR1ZSB0byBidWZmZXIgbGltaXQgcmVhY2hlZC4nKSk7XG4gICAgfVxuXG4gICAgLy8gc3RhcnQgdGhlIHRhc2sgYW5kIGFkZCBpdHMgcHJvbWlzZSB0byB0aGUgcXVldWVcbiAgICBjb25zdCB0YXNrID0gdGFza1Byb2R1Y2VyKCk7XG4gICAgaWYgKHRoaXMuX2J1ZmZlci5pbmRleE9mKHRhc2spID09PSAtMSkge1xuICAgICAgdGhpcy5fYnVmZmVyLnB1c2godGFzayk7XG4gICAgfVxuICAgIHZvaWQgdGFza1xuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZW1vdmUodGFzaykpXG4gICAgICAvLyBVc2UgYHRoZW4obnVsbCwgcmVqZWN0aW9uSGFuZGxlcilgIHJhdGhlciB0aGFuIGBjYXRjaChyZWplY3Rpb25IYW5kbGVyKWAgc28gdGhhdCB3ZSBjYW4gdXNlIGBQcm9taXNlTGlrZWBcbiAgICAgIC8vIHJhdGhlciB0aGFuIGBQcm9taXNlYC4gYFByb21pc2VMaWtlYCBkb2Vzbid0IGhhdmUgYSBgLmNhdGNoYCBtZXRob2QsIG1ha2luZyBpdHMgcG9seWZpbGwgc21hbGxlci4gKEVTNSBkaWRuJ3RcbiAgICAgIC8vIGhhdmUgcHJvbWlzZXMsIHNvIFRTIGhhcyB0byBwb2x5ZmlsbCB3aGVuIGRvd24tY29tcGlsaW5nLilcbiAgICAgIC50aGVuKG51bGwsICgpID0+XG4gICAgICAgIHRoaXMucmVtb3ZlKHRhc2spLnRoZW4obnVsbCwgKCkgPT4ge1xuICAgICAgICAgIC8vIFdlIGhhdmUgdG8gYWRkIGFub3RoZXIgY2F0Y2ggaGVyZSBiZWNhdXNlIGB0aGlzLnJlbW92ZSgpYCBzdGFydHMgYSBuZXcgcHJvbWlzZSBjaGFpbi5cbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIHJldHVybiB0YXNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHByb21pc2UgZnJvbSB0aGUgcXVldWUuXG4gICAqXG4gICAqIEBwYXJhbSB0YXNrIENhbiBiZSBhbnkgUHJvbWlzZUxpa2U8VD5cbiAgICogQHJldHVybnMgUmVtb3ZlZCBwcm9taXNlLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZSh0YXNrOiBQcm9taXNlTGlrZTxUPik6IFByb21pc2VMaWtlPFQ+IHtcbiAgICBjb25zdCByZW1vdmVkVGFzayA9IHRoaXMuX2J1ZmZlci5zcGxpY2UodGhpcy5fYnVmZmVyLmluZGV4T2YodGFzayksIDEpWzBdO1xuICAgIHJldHVybiByZW1vdmVkVGFzaztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiB1bnJlc29sdmVkIHByb21pc2VzIGluIHRoZSBxdWV1ZS5cbiAgICovXG4gIHB1YmxpYyBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IGZvciBhbGwgcHJvbWlzZXMgaW4gdGhlIHF1ZXVlIHRvIHJlc29sdmUgb3IgZm9yIHRpbWVvdXQgdG8gZXhwaXJlLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lLCBpbiBtcywgYWZ0ZXIgd2hpY2ggdG8gcmVzb2x2ZSB0byBgZmFsc2VgIGlmIHRoZSBxdWV1ZSBpcyBzdGlsbCBub24tZW1wdHkuIFBhc3NpbmcgYDBgIChvclxuICAgKiBub3QgcGFzc2luZyBhbnl0aGluZykgd2lsbCBtYWtlIHRoZSBwcm9taXNlIHdhaXQgYXMgbG9uZyBhcyBpdCB0YWtlcyBmb3IgdGhlIHF1ZXVlIHRvIGRyYWluIGJlZm9yZSByZXNvbHZpbmcgdG9cbiAgICogYHRydWVgLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHRvIGB0cnVlYCBpZiB0aGUgcXVldWUgaXMgYWxyZWFkeSBlbXB0eSBvciBkcmFpbnMgYmVmb3JlIHRoZSB0aW1lb3V0LCBhbmRcbiAgICogYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIHB1YmxpYyBkcmFpbih0aW1lb3V0PzogbnVtYmVyKTogUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8Ym9vbGVhbj4ocmVzb2x2ZSA9PiB7XG4gICAgICAvLyB3YWl0IGZvciBgdGltZW91dGAgbXMgYW5kIHRoZW4gcmVzb2x2ZSB0byBgZmFsc2VgIChpZiBub3QgY2FuY2VsbGVkIGZpcnN0KVxuICAgICAgY29uc3QgY2FwdHVyZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aW1lb3V0ICYmIHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAvLyBpZiBhbGwgcHJvbWlzZXMgcmVzb2x2ZSBpbiB0aW1lLCBjYW5jZWwgdGhlIHRpbWVyIGFuZCByZXNvbHZlIHRvIGB0cnVlYFxuICAgICAgdm9pZCBTeW5jUHJvbWlzZS5hbGwodGhpcy5fYnVmZmVyKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KGNhcHR1cmVkU2V0VGltZW91dCk7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4obnVsbCwgKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnLi9nbG9iYWwnO1xuaW1wb3J0IHsgZHluYW1pY1JlcXVpcmUsIGlzTm9kZUVudiB9IGZyb20gJy4vbm9kZSc7XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIHJldHVybiB0aGUgY3VycmVudCB0aW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaC5cbiAqL1xuaW50ZXJmYWNlIFRpbWVzdGFtcFNvdXJjZSB7XG4gIG5vd1NlY29uZHMoKTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgVGltZXN0YW1wU291cmNlIGltcGxlbWVudGF0aW9uIGZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGUgUGVyZm9ybWFuY2UgV2ViIEFQSSBuYXRpdmVseS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBUaW1lc3RhbXBTb3VyY2UgZG9lcyBub3QgdXNlIGEgbW9ub3RvbmljIGNsb2NrLiBBIGNhbGwgdG8gYG5vd1NlY29uZHNgIG1heSByZXR1cm4gYSB0aW1lc3RhbXAgZWFybGllclxuICogdGhhbiBhIHByZXZpb3VzbHkgcmV0dXJuZWQgdmFsdWUuIFdlIGRvIG5vdCB0cnkgdG8gZW11bGF0ZSBhIG1vbm90b25pYyBiZWhhdmlvciBpbiBvcmRlciB0byBmYWNpbGl0YXRlIGRlYnVnZ2luZy4gSXRcbiAqIGlzIG1vcmUgb2J2aW91cyB0byBleHBsYWluIFwid2h5IGRvZXMgbXkgc3BhbiBoYXZlIG5lZ2F0aXZlIGR1cmF0aW9uXCIgdGhhbiBcIndoeSBteSBzcGFucyBoYXZlIHplcm8gZHVyYXRpb25cIi5cbiAqL1xuY29uc3QgZGF0ZVRpbWVzdGFtcFNvdXJjZTogVGltZXN0YW1wU291cmNlID0ge1xuICBub3dTZWNvbmRzOiAoKSA9PiBEYXRlLm5vdygpIC8gMTAwMCxcbn07XG5cbi8qKlxuICogQSBwYXJ0aWFsIGRlZmluaXRpb24gb2YgdGhlIFtQZXJmb3JtYW5jZSBXZWIgQVBJXXtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUGVyZm9ybWFuY2V9XG4gKiBmb3IgYWNjZXNzaW5nIGEgaGlnaCByZXNvbHV0aW9uIG1vbm90b25pYyBjbG9jay5cbiAqL1xuaW50ZXJmYWNlIFBlcmZvcm1hbmNlIHtcbiAgLyoqXG4gICAqIFRoZSBtaWxsaXNlY29uZCB0aW1lc3RhbXAgYXQgd2hpY2ggbWVhc3VyZW1lbnQgYmVnYW4sIG1lYXN1cmVkIGluIFVuaXggdGltZS5cbiAgICovXG4gIHRpbWVPcmlnaW46IG51bWJlcjtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbWlsbGlzZWNvbmQgdGltZXN0YW1wLCB3aGVyZSAwIHJlcHJlc2VudHMgdGhlIHN0YXJ0IG9mIG1lYXN1cmVtZW50LlxuICAgKi9cbiAgbm93KCk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgd3JhcHBlciBhcm91bmQgdGhlIG5hdGl2ZSBQZXJmb3JtYW5jZSBBUEkgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiwgb3IgdW5kZWZpbmVkIGZvciBicm93c2VycyB0aGF0IGRvIG5vdFxuICogc3VwcG9ydCB0aGUgQVBJLlxuICpcbiAqIFdyYXBwaW5nIHRoZSBuYXRpdmUgQVBJIHdvcmtzIGFyb3VuZCBkaWZmZXJlbmNlcyBpbiBiZWhhdmlvciBmcm9tIGRpZmZlcmVudCBicm93c2Vycy5cbiAqL1xuZnVuY3Rpb24gZ2V0QnJvd3NlclBlcmZvcm1hbmNlKCk6IFBlcmZvcm1hbmNlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgeyBwZXJmb3JtYW5jZSB9ID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcbiAgaWYgKCFwZXJmb3JtYW5jZSB8fCAhcGVyZm9ybWFuY2Uubm93KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFJlcGxhY2UgcGVyZm9ybWFuY2UudGltZU9yaWdpbiB3aXRoIG91ciBvd24gdGltZU9yaWdpbiBiYXNlZCBvbiBEYXRlLm5vdygpLlxuICAvL1xuICAvLyBUaGlzIGlzIGEgcGFydGlhbCB3b3JrYXJvdW5kIGZvciBicm93c2VycyByZXBvcnRpbmcgcGVyZm9ybWFuY2UudGltZU9yaWdpbiBzdWNoIHRoYXQgcGVyZm9ybWFuY2UudGltZU9yaWdpbiArXG4gIC8vIHBlcmZvcm1hbmNlLm5vdygpIGdpdmVzIGEgZGF0ZSBhcmJpdHJhcmlseSBpbiB0aGUgcGFzdC5cbiAgLy9cbiAgLy8gQWRkaXRpb25hbGx5LCBjb21wdXRpbmcgdGltZU9yaWdpbiBpbiB0aGlzIHdheSBmaWxscyB0aGUgZ2FwIGZvciBicm93c2VycyB3aGVyZSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIGlzXG4gIC8vIHVuZGVmaW5lZC5cbiAgLy9cbiAgLy8gVGhlIGFzc3VtcHRpb24gdGhhdCBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCkgfj0gRGF0ZS5ub3coKSBpcyBmbGF3ZWQsIGJ1dCB3ZSBkZXBlbmQgb24gaXQgdG9cbiAgLy8gaW50ZXJhY3Qgd2l0aCBkYXRhIGNvbWluZyBvdXQgb2YgcGVyZm9ybWFuY2UgZW50cmllcy5cbiAgLy9cbiAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgcmVjb21tZW5kYXRpb25zIGFnYWluc3QgaXQgaW4gdGhlIHNwZWMsIGJyb3dzZXJzIGltcGxlbWVudCB0aGUgUGVyZm9ybWFuY2UgQVBJIHdpdGggYSBjbG9jayB0aGF0XG4gIC8vIG1pZ2h0IHN0b3Agd2hlbiB0aGUgY29tcHV0ZXIgaXMgYXNsZWVwIChhbmQgcGVyaGFwcyB1bmRlciBvdGhlciBjaXJjdW1zdGFuY2VzKS4gU3VjaCBiZWhhdmlvciBjYXVzZXNcbiAgLy8gcGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlLm5vdygpIHRvIGhhdmUgYW4gYXJiaXRyYXJ5IHNrZXcgb3ZlciBEYXRlLm5vdygpLiBJbiBsYXB0b3AgY29tcHV0ZXJzLCB3ZSBoYXZlXG4gIC8vIG9ic2VydmVkIHNrZXdzIHRoYXQgY2FuIGJlIGFzIGxvbmcgYXMgZGF5cywgd2Vla3Mgb3IgbW9udGhzLlxuICAvL1xuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjU5MC5cbiAgLy9cbiAgLy8gQlVHOiBkZXNwaXRlIG91ciBiZXN0IGludGVudGlvbnMsIHRoaXMgd29ya2Fyb3VuZCBoYXMgaXRzIGxpbWl0YXRpb25zLiBJdCBtb3N0bHkgYWRkcmVzc2VzIHRpbWluZ3Mgb2YgcGFnZWxvYWRcbiAgLy8gdHJhbnNhY3Rpb25zLCBidXQgaWdub3JlcyB0aGUgc2tldyBidWlsdCB1cCBvdmVyIHRpbWUgdGhhdCBjYW4gYXZlcnNlbHkgYWZmZWN0IHRpbWVzdGFtcHMgb2YgbmF2aWdhdGlvblxuICAvLyB0cmFuc2FjdGlvbnMgb2YgbG9uZy1saXZlZCB3ZWIgcGFnZXMuXG4gIGNvbnN0IHRpbWVPcmlnaW4gPSBEYXRlLm5vdygpIC0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBub3c6ICgpID0+IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgIHRpbWVPcmlnaW4sXG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmF0aXZlIFBlcmZvcm1hbmNlIEFQSSBpbXBsZW1lbnRhdGlvbiBmcm9tIE5vZGUuanMuIFJldHVybnMgdW5kZWZpbmVkIGluIG9sZCBOb2RlLmpzIHZlcnNpb25zIHRoYXQgZG9uJ3RcbiAqIGltcGxlbWVudCB0aGUgQVBJLlxuICovXG5mdW5jdGlvbiBnZXROb2RlUGVyZm9ybWFuY2UoKTogUGVyZm9ybWFuY2UgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIGNvbnN0IHBlcmZIb29rcyA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJ3BlcmZfaG9va3MnKSBhcyB7IHBlcmZvcm1hbmNlOiBQZXJmb3JtYW5jZSB9O1xuICAgIHJldHVybiBwZXJmSG9va3MucGVyZm9ybWFuY2U7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogVGhlIFBlcmZvcm1hbmNlIEFQSSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0sIGlmIGF2YWlsYWJsZS5cbiAqL1xuY29uc3QgcGxhdGZvcm1QZXJmb3JtYW5jZTogUGVyZm9ybWFuY2UgfCB1bmRlZmluZWQgPSBpc05vZGVFbnYoKSA/IGdldE5vZGVQZXJmb3JtYW5jZSgpIDogZ2V0QnJvd3NlclBlcmZvcm1hbmNlKCk7XG5cbmNvbnN0IHRpbWVzdGFtcFNvdXJjZTogVGltZXN0YW1wU291cmNlID1cbiAgcGxhdGZvcm1QZXJmb3JtYW5jZSA9PT0gdW5kZWZpbmVkXG4gICAgPyBkYXRlVGltZXN0YW1wU291cmNlXG4gICAgOiB7XG4gICAgICAgIG5vd1NlY29uZHM6ICgpID0+IChwbGF0Zm9ybVBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwbGF0Zm9ybVBlcmZvcm1hbmNlLm5vdygpKSAvIDEwMDAsXG4gICAgICB9O1xuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCB1c2luZyB0aGUgRGF0ZSBBUEkuXG4gKi9cbmV4cG9ydCBjb25zdCBkYXRlVGltZXN0YW1wSW5TZWNvbmRzOiAoKSA9PiBudW1iZXIgPSBkYXRlVGltZXN0YW1wU291cmNlLm5vd1NlY29uZHMuYmluZChkYXRlVGltZXN0YW1wU291cmNlKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgdGltZXN0YW1wIGluIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2ggdXNpbmcgZWl0aGVyIHRoZSBQZXJmb3JtYW5jZSBvciBEYXRlIEFQSXMsIGRlcGVuZGluZyBvbiB0aGVcbiAqIGF2YWlsYWJpbGl0eSBvZiB0aGUgUGVyZm9ybWFuY2UgQVBJLlxuICpcbiAqIFNlZSBgdXNpbmdQZXJmb3JtYW5jZUFQSWAgdG8gdGVzdCB3aGV0aGVyIHRoZSBQZXJmb3JtYW5jZSBBUEkgaXMgdXNlZC5cbiAqXG4gKiBCVUc6IE5vdGUgdGhhdCBiZWNhdXNlIG9mIGhvdyBicm93c2VycyBpbXBsZW1lbnQgdGhlIFBlcmZvcm1hbmNlIEFQSSwgdGhlIGNsb2NrIG1pZ2h0IHN0b3Agd2hlbiB0aGUgY29tcHV0ZXIgaXNcbiAqIGFzbGVlcC4gVGhpcyBjcmVhdGVzIGEgc2tldyBiZXR3ZWVuIGBkYXRlVGltZXN0YW1wSW5TZWNvbmRzYCBhbmQgYHRpbWVzdGFtcEluU2Vjb25kc2AuIFRoZVxuICogc2tldyBjYW4gZ3JvdyB0byBhcmJpdHJhcnkgYW1vdW50cyBsaWtlIGRheXMsIHdlZWtzIG9yIG1vbnRocy5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8yNTkwLlxuICovXG5leHBvcnQgY29uc3QgdGltZXN0YW1wSW5TZWNvbmRzOiAoKSA9PiBudW1iZXIgPSB0aW1lc3RhbXBTb3VyY2Uubm93U2Vjb25kcy5iaW5kKHRpbWVzdGFtcFNvdXJjZSk7XG5cbi8vIFJlLWV4cG9ydGVkIHdpdGggYW4gb2xkIG5hbWUgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LlxuZXhwb3J0IGNvbnN0IHRpbWVzdGFtcFdpdGhNcyA9IHRpbWVzdGFtcEluU2Vjb25kcztcblxuLyoqXG4gKiBBIGJvb2xlYW4gdGhhdCBpcyB0cnVlIHdoZW4gdGltZXN0YW1wSW5TZWNvbmRzIHVzZXMgdGhlIFBlcmZvcm1hbmNlIEFQSSB0byBwcm9kdWNlIG1vbm90b25pYyB0aW1lc3RhbXBzLlxuICovXG5leHBvcnQgY29uc3QgdXNpbmdQZXJmb3JtYW5jZUFQSSA9IHBsYXRmb3JtUGVyZm9ybWFuY2UgIT09IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBJbnRlcm5hbCBoZWxwZXIgdG8gc3RvcmUgd2hhdCBpcyB0aGUgc291cmNlIG9mIGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4gYmVsb3cuIEZvciBkZWJ1Z2dpbmcgb25seS5cbiAqL1xuZXhwb3J0IGxldCBfYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbk1vZGU6IHN0cmluZztcblxuLyoqXG4gKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaC4gVGhpcyB2YWx1ZSBpcyBvbmx5IHVzYWJsZSBpbiBhIGJyb3dzZXIsIGFuZCBvbmx5IHdoZW4gdGhlXG4gKiBwZXJmb3JtYW5jZSBBUEkgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgY29uc3QgYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbiA9ICgoKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgLy8gVW5mb3J0dW5hdGVseSBicm93c2VycyBtYXkgcmVwb3J0IGFuIGluYWNjdXJhdGUgdGltZSBvcmlnaW4gZGF0YSwgdGhyb3VnaCBlaXRoZXIgcGVyZm9ybWFuY2UudGltZU9yaWdpbiBvclxuICAvLyBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0LCB3aGljaCByZXN1bHRzIGluIHBvb3IgcmVzdWx0cyBpbiBwZXJmb3JtYW5jZSBkYXRhLiBXZSBvbmx5IHRyZWF0IHRpbWUgb3JpZ2luXG4gIC8vIGRhdGEgYXMgcmVsaWFibGUgaWYgdGhleSBhcmUgd2l0aGluIGEgcmVhc29uYWJsZSB0aHJlc2hvbGQgb2YgdGhlIGN1cnJlbnQgdGltZS5cblxuICBjb25zdCB7IHBlcmZvcm1hbmNlIH0gPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuICBpZiAoIXBlcmZvcm1hbmNlIHx8ICFwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICBfYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbk1vZGUgPSAnbm9uZSc7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHRocmVzaG9sZCA9IDM2MDAgKiAxMDAwO1xuICBjb25zdCBwZXJmb3JtYW5jZU5vdyA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBjb25zdCBkYXRlTm93ID0gRGF0ZS5ub3coKTtcblxuICAvLyBpZiB0aW1lT3JpZ2luIGlzbid0IGF2YWlsYWJsZSBzZXQgZGVsdGEgdG8gdGhyZXNob2xkIHNvIGl0IGlzbid0IHVzZWRcbiAgY29uc3QgdGltZU9yaWdpbkRlbHRhID0gcGVyZm9ybWFuY2UudGltZU9yaWdpblxuICAgID8gTWF0aC5hYnMocGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBlcmZvcm1hbmNlTm93IC0gZGF0ZU5vdylcbiAgICA6IHRocmVzaG9sZDtcbiAgY29uc3QgdGltZU9yaWdpbklzUmVsaWFibGUgPSB0aW1lT3JpZ2luRGVsdGEgPCB0aHJlc2hvbGQ7XG5cbiAgLy8gV2hpbGUgcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydCBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4sIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW5cbiAgLy8gaXMgbm90IGFzIHdpZGVseSBzdXBwb3J0ZWQuIE5hbWVseSwgcGVyZm9ybWFuY2UudGltZU9yaWdpbiBpcyB1bmRlZmluZWQgaW4gU2FmYXJpIGFzIG9mIHdyaXRpbmcuXG4gIC8vIEFsc28gYXMgb2Ygd3JpdGluZywgcGVyZm9ybWFuY2UudGltaW5nIGlzIG5vdCBhdmFpbGFibGUgaW4gV2ViIFdvcmtlcnMgaW4gbWFpbnN0cmVhbSBicm93c2Vycywgc28gaXQgaXMgbm90IGFsd2F5c1xuICAvLyBhIHZhbGlkIGZhbGxiYWNrLiBJbiB0aGUgYWJzZW5jZSBvZiBhbiBpbml0aWFsIHRpbWUgcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIsIGZhbGxiYWNrIHRvIHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGVcbiAgLy8gRGF0ZSBBUEkuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICBjb25zdCBuYXZpZ2F0aW9uU3RhcnQgPSBwZXJmb3JtYW5jZS50aW1pbmcgJiYgcGVyZm9ybWFuY2UudGltaW5nLm5hdmlnYXRpb25TdGFydDtcbiAgY29uc3QgaGFzTmF2aWdhdGlvblN0YXJ0ID0gdHlwZW9mIG5hdmlnYXRpb25TdGFydCA9PT0gJ251bWJlcic7XG4gIC8vIGlmIG5hdmlnYXRpb25TdGFydCBpc24ndCBhdmFpbGFibGUgc2V0IGRlbHRhIHRvIHRocmVzaG9sZCBzbyBpdCBpc24ndCB1c2VkXG4gIGNvbnN0IG5hdmlnYXRpb25TdGFydERlbHRhID0gaGFzTmF2aWdhdGlvblN0YXJ0ID8gTWF0aC5hYnMobmF2aWdhdGlvblN0YXJ0ICsgcGVyZm9ybWFuY2VOb3cgLSBkYXRlTm93KSA6IHRocmVzaG9sZDtcbiAgY29uc3QgbmF2aWdhdGlvblN0YXJ0SXNSZWxpYWJsZSA9IG5hdmlnYXRpb25TdGFydERlbHRhIDwgdGhyZXNob2xkO1xuXG4gIGlmICh0aW1lT3JpZ2luSXNSZWxpYWJsZSB8fCBuYXZpZ2F0aW9uU3RhcnRJc1JlbGlhYmxlKSB7XG4gICAgLy8gVXNlIHRoZSBtb3JlIHJlbGlhYmxlIHRpbWUgb3JpZ2luXG4gICAgaWYgKHRpbWVPcmlnaW5EZWx0YSA8PSBuYXZpZ2F0aW9uU3RhcnREZWx0YSkge1xuICAgICAgX2Jyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW5Nb2RlID0gJ3RpbWVPcmlnaW4nO1xuICAgICAgcmV0dXJuIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW47XG4gICAgfSBlbHNlIHtcbiAgICAgIF9icm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luTW9kZSA9ICduYXZpZ2F0aW9uU3RhcnQnO1xuICAgICAgcmV0dXJuIG5hdmlnYXRpb25TdGFydDtcbiAgICB9XG4gIH1cblxuICAvLyBFaXRoZXIgYm90aCB0aW1lT3JpZ2luIGFuZCBuYXZpZ2F0aW9uU3RhcnQgYXJlIHNrZXdlZCBvciBuZWl0aGVyIGlzIGF2YWlsYWJsZSwgZmFsbGJhY2sgdG8gRGF0ZS5cbiAgX2Jyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW5Nb2RlID0gJ2RhdGVOb3cnO1xuICByZXR1cm4gZGF0ZU5vdztcbn0pKCk7XG4iLCAiZXhwb3J0ICogZnJvbSAnLi9hc3luYyc7XG5leHBvcnQgKiBmcm9tICcuL2Jyb3dzZXInO1xuZXhwb3J0ICogZnJvbSAnLi9kc24nO1xuZXhwb3J0ICogZnJvbSAnLi9lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL2dsb2JhbCc7XG5leHBvcnQgKiBmcm9tICcuL2luc3RydW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9pcyc7XG5leHBvcnQgKiBmcm9tICcuL2xvZ2dlcic7XG5leHBvcnQgKiBmcm9tICcuL21lbW8nO1xuZXhwb3J0ICogZnJvbSAnLi9taXNjJztcbmV4cG9ydCAqIGZyb20gJy4vbm9kZSc7XG5leHBvcnQgKiBmcm9tICcuL29iamVjdCc7XG5leHBvcnQgKiBmcm9tICcuL3BhdGgnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9taXNlYnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2t0cmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0cmluZyc7XG5leHBvcnQgKiBmcm9tICcuL3N1cHBvcnRzJztcbmV4cG9ydCAqIGZyb20gJy4vc3luY3Byb21pc2UnO1xuZXhwb3J0ICogZnJvbSAnLi90aW1lJztcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbmltcG9ydCB7XG4gIEJyZWFkY3J1bWIsXG4gIENhcHR1cmVDb250ZXh0LFxuICBDb250ZXh0LFxuICBDb250ZXh0cyxcbiAgRXZlbnQsXG4gIEV2ZW50SGludCxcbiAgRXZlbnRQcm9jZXNzb3IsXG4gIEV4dHJhLFxuICBFeHRyYXMsXG4gIFByaW1pdGl2ZSxcbiAgUmVxdWVzdFNlc3Npb24sXG4gIFNjb3BlIGFzIFNjb3BlSW50ZXJmYWNlLFxuICBTY29wZUNvbnRleHQsXG4gIFNldmVyaXR5LFxuICBTcGFuLFxuICBUcmFuc2FjdGlvbixcbiAgVXNlcixcbn0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBkYXRlVGltZXN0YW1wSW5TZWNvbmRzLCBnZXRHbG9iYWxPYmplY3QsIGlzUGxhaW5PYmplY3QsIGlzVGhlbmFibGUsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IFNlc3Npb24gfSBmcm9tICcuL3Nlc3Npb24nO1xuXG4vKipcbiAqIEFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIGJyZWFkY3J1bWJzIGFkZGVkIHRvIGFuIGV2ZW50LlxuICogVGhlIGBtYXhCcmVhZGNydW1ic2Agb3B0aW9uIGNhbm5vdCBiZSBoaWdoZXIgdGhhbiB0aGlzIHZhbHVlLlxuICovXG5jb25zdCBNQVhfQlJFQURDUlVNQlMgPSAxMDA7XG5cbi8qKlxuICogSG9sZHMgYWRkaXRpb25hbCBldmVudCBpbmZvcm1hdGlvbi4ge0BsaW5rIFNjb3BlLmFwcGx5VG9FdmVudH0gd2lsbCBiZVxuICogY2FsbGVkIGJ5IHRoZSBjbGllbnQgYmVmb3JlIGFuIGV2ZW50IHdpbGwgYmUgc2VudC5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjb3BlIGltcGxlbWVudHMgU2NvcGVJbnRlcmZhY2Uge1xuICAvKiogRmxhZyBpZiBub3RpZnlpbmcgaXMgaGFwcGVuaW5nLiAqL1xuICBwcm90ZWN0ZWQgX25vdGlmeWluZ0xpc3RlbmVyczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBDYWxsYmFjayBmb3IgY2xpZW50IHRvIHJlY2VpdmUgc2NvcGUgY2hhbmdlcy4gKi9cbiAgcHJvdGVjdGVkIF9zY29wZUxpc3RlbmVyczogQXJyYXk8KHNjb3BlOiBTY29wZSkgPT4gdm9pZD4gPSBbXTtcblxuICAvKiogQ2FsbGJhY2sgbGlzdCB0aGF0IHdpbGwgYmUgY2FsbGVkIGFmdGVyIHtAbGluayBhcHBseVRvRXZlbnR9LiAqL1xuICBwcm90ZWN0ZWQgX2V2ZW50UHJvY2Vzc29yczogRXZlbnRQcm9jZXNzb3JbXSA9IFtdO1xuXG4gIC8qKiBBcnJheSBvZiBicmVhZGNydW1icy4gKi9cbiAgcHJvdGVjdGVkIF9icmVhZGNydW1iczogQnJlYWRjcnVtYltdID0gW107XG5cbiAgLyoqIFVzZXIgKi9cbiAgcHJvdGVjdGVkIF91c2VyOiBVc2VyID0ge307XG5cbiAgLyoqIFRhZ3MgKi9cbiAgcHJvdGVjdGVkIF90YWdzOiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9ID0ge307XG5cbiAgLyoqIEV4dHJhICovXG4gIHByb3RlY3RlZCBfZXh0cmE6IEV4dHJhcyA9IHt9O1xuXG4gIC8qKiBDb250ZXh0cyAqL1xuICBwcm90ZWN0ZWQgX2NvbnRleHRzOiBDb250ZXh0cyA9IHt9O1xuXG4gIC8qKiBGaW5nZXJwcmludCAqL1xuICBwcm90ZWN0ZWQgX2ZpbmdlcnByaW50Pzogc3RyaW5nW107XG5cbiAgLyoqIFNldmVyaXR5ICovXG4gIHByb3RlY3RlZCBfbGV2ZWw/OiBTZXZlcml0eTtcblxuICAvKiogVHJhbnNhY3Rpb24gTmFtZSAqL1xuICBwcm90ZWN0ZWQgX3RyYW5zYWN0aW9uTmFtZT86IHN0cmluZztcblxuICAvKiogU3BhbiAqL1xuICBwcm90ZWN0ZWQgX3NwYW4/OiBTcGFuO1xuXG4gIC8qKiBTZXNzaW9uICovXG4gIHByb3RlY3RlZCBfc2Vzc2lvbj86IFNlc3Npb247XG5cbiAgLyoqIFJlcXVlc3QgTW9kZSBTZXNzaW9uIFN0YXR1cyAqL1xuICBwcm90ZWN0ZWQgX3JlcXVlc3RTZXNzaW9uPzogUmVxdWVzdFNlc3Npb247XG5cbiAgLyoqXG4gICAqIEluaGVyaXQgdmFsdWVzIGZyb20gdGhlIHBhcmVudCBzY29wZS5cbiAgICogQHBhcmFtIHNjb3BlIHRvIGNsb25lLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjbG9uZShzY29wZT86IFNjb3BlKTogU2NvcGUge1xuICAgIGNvbnN0IG5ld1Njb3BlID0gbmV3IFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICBuZXdTY29wZS5fYnJlYWRjcnVtYnMgPSBbLi4uc2NvcGUuX2JyZWFkY3J1bWJzXTtcbiAgICAgIG5ld1Njb3BlLl90YWdzID0geyAuLi5zY29wZS5fdGFncyB9O1xuICAgICAgbmV3U2NvcGUuX2V4dHJhID0geyAuLi5zY29wZS5fZXh0cmEgfTtcbiAgICAgIG5ld1Njb3BlLl9jb250ZXh0cyA9IHsgLi4uc2NvcGUuX2NvbnRleHRzIH07XG4gICAgICBuZXdTY29wZS5fdXNlciA9IHNjb3BlLl91c2VyO1xuICAgICAgbmV3U2NvcGUuX2xldmVsID0gc2NvcGUuX2xldmVsO1xuICAgICAgbmV3U2NvcGUuX3NwYW4gPSBzY29wZS5fc3BhbjtcbiAgICAgIG5ld1Njb3BlLl9zZXNzaW9uID0gc2NvcGUuX3Nlc3Npb247XG4gICAgICBuZXdTY29wZS5fdHJhbnNhY3Rpb25OYW1lID0gc2NvcGUuX3RyYW5zYWN0aW9uTmFtZTtcbiAgICAgIG5ld1Njb3BlLl9maW5nZXJwcmludCA9IHNjb3BlLl9maW5nZXJwcmludDtcbiAgICAgIG5ld1Njb3BlLl9ldmVudFByb2Nlc3NvcnMgPSBbLi4uc2NvcGUuX2V2ZW50UHJvY2Vzc29yc107XG4gICAgICBuZXdTY29wZS5fcmVxdWVzdFNlc3Npb24gPSBzY29wZS5fcmVxdWVzdFNlc3Npb247XG4gICAgfVxuICAgIHJldHVybiBuZXdTY29wZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgaW50ZXJuYWwgb24gY2hhbmdlIGxpc3RlbmVyLiBVc2VkIGZvciBzdWIgU0RLcyB0aGF0IG5lZWQgdG8gc3RvcmUgdGhlIHNjb3BlLlxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBwdWJsaWMgYWRkU2NvcGVMaXN0ZW5lcihjYWxsYmFjazogKHNjb3BlOiBTY29wZSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuX3Njb3BlTGlzdGVuZXJzLnB1c2goY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgYWRkRXZlbnRQcm9jZXNzb3IoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKTogdGhpcyB7XG4gICAgdGhpcy5fZXZlbnRQcm9jZXNzb3JzLnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VXNlcih1c2VyOiBVc2VyIHwgbnVsbCk6IHRoaXMge1xuICAgIHRoaXMuX3VzZXIgPSB1c2VyIHx8IHt9O1xuICAgIGlmICh0aGlzLl9zZXNzaW9uKSB7XG4gICAgICB0aGlzLl9zZXNzaW9uLnVwZGF0ZSh7IHVzZXIgfSk7XG4gICAgfVxuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRVc2VyKCk6IFVzZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0UmVxdWVzdFNlc3Npb24oKTogUmVxdWVzdFNlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0U2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFJlcXVlc3RTZXNzaW9uKHJlcXVlc3RTZXNzaW9uPzogUmVxdWVzdFNlc3Npb24pOiB0aGlzIHtcbiAgICB0aGlzLl9yZXF1ZXN0U2Vzc2lvbiA9IHJlcXVlc3RTZXNzaW9uO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9KTogdGhpcyB7XG4gICAgdGhpcy5fdGFncyA9IHtcbiAgICAgIC4uLnRoaXMuX3RhZ3MsXG4gICAgICAuLi50YWdzLFxuICAgIH07XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFRhZyhrZXk6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSk6IHRoaXMge1xuICAgIHRoaXMuX3RhZ3MgPSB7IC4uLnRoaXMuX3RhZ3MsIFtrZXldOiB2YWx1ZSB9O1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRFeHRyYXMoZXh0cmFzOiBFeHRyYXMpOiB0aGlzIHtcbiAgICB0aGlzLl9leHRyYSA9IHtcbiAgICAgIC4uLnRoaXMuX2V4dHJhLFxuICAgICAgLi4uZXh0cmFzLFxuICAgIH07XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldEV4dHJhKGtleTogc3RyaW5nLCBleHRyYTogRXh0cmEpOiB0aGlzIHtcbiAgICB0aGlzLl9leHRyYSA9IHsgLi4udGhpcy5fZXh0cmEsIFtrZXldOiBleHRyYSB9O1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRGaW5nZXJwcmludChmaW5nZXJwcmludDogc3RyaW5nW10pOiB0aGlzIHtcbiAgICB0aGlzLl9maW5nZXJwcmludCA9IGZpbmdlcnByaW50O1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRMZXZlbChsZXZlbDogU2V2ZXJpdHkpOiB0aGlzIHtcbiAgICB0aGlzLl9sZXZlbCA9IGxldmVsO1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2FjdGlvbk5hbWUobmFtZT86IHN0cmluZyk6IHRoaXMge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uTmFtZSA9IG5hbWU7XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW4gYmUgcmVtb3ZlZCBpbiBtYWpvciB2ZXJzaW9uLlxuICAgKiBAZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB7QGxpbmsgdGhpcy5zZXRUcmFuc2FjdGlvbk5hbWV9XG4gICAqL1xuICBwdWJsaWMgc2V0VHJhbnNhY3Rpb24obmFtZT86IHN0cmluZyk6IHRoaXMge1xuICAgIHJldHVybiB0aGlzLnNldFRyYW5zYWN0aW9uTmFtZShuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldENvbnRleHQoa2V5OiBzdHJpbmcsIGNvbnRleHQ6IENvbnRleHQgfCBudWxsKTogdGhpcyB7XG4gICAgaWYgKGNvbnRleHQgPT09IG51bGwpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSB0aGlzLl9jb250ZXh0c1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jb250ZXh0cyA9IHsgLi4udGhpcy5fY29udGV4dHMsIFtrZXldOiBjb250ZXh0IH07XG4gICAgfVxuXG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFNwYW4oc3Bhbj86IFNwYW4pOiB0aGlzIHtcbiAgICB0aGlzLl9zcGFuID0gc3BhbjtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0U3BhbigpOiBTcGFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc3BhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldFRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBvZnRlbiwgdGhpcyBzcGFuIHdpbGwgYmUgYSB0cmFuc2FjdGlvbiwgYnV0IGl0J3Mgbm90IGd1YXJhbnRlZWQgdG8gYmVcbiAgICBjb25zdCBzcGFuID0gdGhpcy5nZXRTcGFuKCkgYXMgdW5kZWZpbmVkIHwgKFNwYW4gJiB7IHNwYW5SZWNvcmRlcjogeyBzcGFuczogU3BhbltdIH0gfSk7XG5cbiAgICAvLyB0cnkgaXQgdGhlIG5ldyB3YXkgZmlyc3RcbiAgICBpZiAoc3Bhbj8udHJhbnNhY3Rpb24pIHtcbiAgICAgIHJldHVybiBzcGFuPy50cmFuc2FjdGlvbjtcbiAgICB9XG5cbiAgICAvLyBmYWxsYmFjayB0byB0aGUgb2xkIHdheSAoa25vd24gYnVnOiB0aGlzIG9ubHkgZmluZHMgdHJhbnNhY3Rpb25zIHdpdGggc2FtcGxlZCA9IHRydWUpXG4gICAgaWYgKHNwYW4/LnNwYW5SZWNvcmRlcj8uc3BhbnNbMF0pIHtcbiAgICAgIHJldHVybiBzcGFuLnNwYW5SZWNvcmRlci5zcGFuc1swXSBhcyBUcmFuc2FjdGlvbjtcbiAgICB9XG5cbiAgICAvLyBuZWl0aGVyIHdheSBmb3VuZCBhIHRyYW5zYWN0aW9uXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFNlc3Npb24oc2Vzc2lvbj86IFNlc3Npb24pOiB0aGlzIHtcbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIGRlbGV0ZSB0aGlzLl9zZXNzaW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB9XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldFNlc3Npb24oKTogU2Vzc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Nlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB1cGRhdGUoY2FwdHVyZUNvbnRleHQ/OiBDYXB0dXJlQ29udGV4dCk6IHRoaXMge1xuICAgIGlmICghY2FwdHVyZUNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FwdHVyZUNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRTY29wZSA9IChjYXB0dXJlQ29udGV4dCBhcyA8VD4oc2NvcGU6IFQpID0+IFQpKHRoaXMpO1xuICAgICAgcmV0dXJuIHVwZGF0ZWRTY29wZSBpbnN0YW5jZW9mIFNjb3BlID8gdXBkYXRlZFNjb3BlIDogdGhpcztcbiAgICB9XG5cbiAgICBpZiAoY2FwdHVyZUNvbnRleHQgaW5zdGFuY2VvZiBTY29wZSkge1xuICAgICAgdGhpcy5fdGFncyA9IHsgLi4udGhpcy5fdGFncywgLi4uY2FwdHVyZUNvbnRleHQuX3RhZ3MgfTtcbiAgICAgIHRoaXMuX2V4dHJhID0geyAuLi50aGlzLl9leHRyYSwgLi4uY2FwdHVyZUNvbnRleHQuX2V4dHJhIH07XG4gICAgICB0aGlzLl9jb250ZXh0cyA9IHsgLi4udGhpcy5fY29udGV4dHMsIC4uLmNhcHR1cmVDb250ZXh0Ll9jb250ZXh0cyB9O1xuICAgICAgaWYgKGNhcHR1cmVDb250ZXh0Ll91c2VyICYmIE9iamVjdC5rZXlzKGNhcHR1cmVDb250ZXh0Ll91c2VyKS5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fdXNlciA9IGNhcHR1cmVDb250ZXh0Ll91c2VyO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmVDb250ZXh0Ll9sZXZlbCkge1xuICAgICAgICB0aGlzLl9sZXZlbCA9IGNhcHR1cmVDb250ZXh0Ll9sZXZlbDtcbiAgICAgIH1cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5fZmluZ2VycHJpbnQpIHtcbiAgICAgICAgdGhpcy5fZmluZ2VycHJpbnQgPSBjYXB0dXJlQ29udGV4dC5fZmluZ2VycHJpbnQ7XG4gICAgICB9XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX3JlcXVlc3RTZXNzaW9uKSB7XG4gICAgICAgIHRoaXMuX3JlcXVlc3RTZXNzaW9uID0gY2FwdHVyZUNvbnRleHQuX3JlcXVlc3RTZXNzaW9uO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdChjYXB0dXJlQ29udGV4dCkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgY2FwdHVyZUNvbnRleHQgPSBjYXB0dXJlQ29udGV4dCBhcyBTY29wZUNvbnRleHQ7XG4gICAgICB0aGlzLl90YWdzID0geyAuLi50aGlzLl90YWdzLCAuLi5jYXB0dXJlQ29udGV4dC50YWdzIH07XG4gICAgICB0aGlzLl9leHRyYSA9IHsgLi4udGhpcy5fZXh0cmEsIC4uLmNhcHR1cmVDb250ZXh0LmV4dHJhIH07XG4gICAgICB0aGlzLl9jb250ZXh0cyA9IHsgLi4udGhpcy5fY29udGV4dHMsIC4uLmNhcHR1cmVDb250ZXh0LmNvbnRleHRzIH07XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQudXNlcikge1xuICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQudXNlcjtcbiAgICAgIH1cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5sZXZlbCkge1xuICAgICAgICB0aGlzLl9sZXZlbCA9IGNhcHR1cmVDb250ZXh0LmxldmVsO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmVDb250ZXh0LmZpbmdlcnByaW50KSB7XG4gICAgICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gY2FwdHVyZUNvbnRleHQuZmluZ2VycHJpbnQ7XG4gICAgICB9XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQucmVxdWVzdFNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdFNlc3Npb24gPSBjYXB0dXJlQ29udGV4dC5yZXF1ZXN0U2Vzc2lvbjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNsZWFyKCk6IHRoaXMge1xuICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgdGhpcy5fdGFncyA9IHt9O1xuICAgIHRoaXMuX2V4dHJhID0ge307XG4gICAgdGhpcy5fdXNlciA9IHt9O1xuICAgIHRoaXMuX2NvbnRleHRzID0ge307XG4gICAgdGhpcy5fbGV2ZWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25OYW1lID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3JlcXVlc3RTZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3NwYW4gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc2Vzc2lvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgYWRkQnJlYWRjcnVtYihicmVhZGNydW1iOiBCcmVhZGNydW1iLCBtYXhCcmVhZGNydW1icz86IG51bWJlcik6IHRoaXMge1xuICAgIGNvbnN0IG1heENydW1icyA9IHR5cGVvZiBtYXhCcmVhZGNydW1icyA9PT0gJ251bWJlcicgPyBNYXRoLm1pbihtYXhCcmVhZGNydW1icywgTUFYX0JSRUFEQ1JVTUJTKSA6IE1BWF9CUkVBRENSVU1CUztcblxuICAgIC8vIE5vIGRhdGEgaGFzIGJlZW4gY2hhbmdlZCwgc28gZG9uJ3Qgbm90aWZ5IHNjb3BlIGxpc3RlbmVyc1xuICAgIGlmIChtYXhDcnVtYnMgPD0gMCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgbWVyZ2VkQnJlYWRjcnVtYiA9IHtcbiAgICAgIHRpbWVzdGFtcDogZGF0ZVRpbWVzdGFtcEluU2Vjb25kcygpLFxuICAgICAgLi4uYnJlYWRjcnVtYixcbiAgICB9O1xuICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gWy4uLnRoaXMuX2JyZWFkY3J1bWJzLCBtZXJnZWRCcmVhZGNydW1iXS5zbGljZSgtbWF4Q3J1bWJzKTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjbGVhckJyZWFkY3J1bWJzKCk6IHRoaXMge1xuICAgIHRoaXMuX2JyZWFkY3J1bWJzID0gW107XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIGZpbmdlcnByaW50IHRvIHRoZSBldmVudC5cbiAgICogTm90ZSB0aGF0IGJyZWFkY3J1bWJzIHdpbGwgYmUgYWRkZWQgYnkgdGhlIGNsaWVudC5cbiAgICogQWxzbyBpZiB0aGUgZXZlbnQgaGFzIGFscmVhZHkgYnJlYWRjcnVtYnMgb24gaXQsIHdlIGRvIG5vdCBtZXJnZSB0aGVtLlxuICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRcbiAgICogQHBhcmFtIGhpbnQgTWF5IGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLlxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBwdWJsaWMgYXBwbHlUb0V2ZW50KGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCk6IFByb21pc2VMaWtlPEV2ZW50IHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLl9leHRyYSAmJiBPYmplY3Qua2V5cyh0aGlzLl9leHRyYSkubGVuZ3RoKSB7XG4gICAgICBldmVudC5leHRyYSA9IHsgLi4udGhpcy5fZXh0cmEsIC4uLmV2ZW50LmV4dHJhIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdzICYmIE9iamVjdC5rZXlzKHRoaXMuX3RhZ3MpLmxlbmd0aCkge1xuICAgICAgZXZlbnQudGFncyA9IHsgLi4udGhpcy5fdGFncywgLi4uZXZlbnQudGFncyB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdXNlciAmJiBPYmplY3Qua2V5cyh0aGlzLl91c2VyKS5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LnVzZXIgPSB7IC4uLnRoaXMuX3VzZXIsIC4uLmV2ZW50LnVzZXIgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbnRleHRzICYmIE9iamVjdC5rZXlzKHRoaXMuX2NvbnRleHRzKS5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmNvbnRleHRzID0geyAuLi50aGlzLl9jb250ZXh0cywgLi4uZXZlbnQuY29udGV4dHMgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xldmVsKSB7XG4gICAgICBldmVudC5sZXZlbCA9IHRoaXMuX2xldmVsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdHJhbnNhY3Rpb25OYW1lKSB7XG4gICAgICBldmVudC50cmFuc2FjdGlvbiA9IHRoaXMuX3RyYW5zYWN0aW9uTmFtZTtcbiAgICB9XG4gICAgLy8gV2Ugd2FudCB0byBzZXQgdGhlIHRyYWNlIGNvbnRleHQgZm9yIG5vcm1hbCBldmVudHMgb25seSBpZiB0aGVyZSBpc24ndCBhbHJlYWR5XG4gICAgLy8gYSB0cmFjZSBjb250ZXh0IG9uIHRoZSBldmVudC4gVGhlcmUgaXMgYSBwcm9kdWN0IGZlYXR1cmUgaW4gcGxhY2Ugd2hlcmUgd2UgbGlua1xuICAgIC8vIGVycm9ycyB3aXRoIHRyYW5zYWN0aW9uIGFuZCBpdCByZWxpZXMgb24gdGhhdC5cbiAgICBpZiAodGhpcy5fc3Bhbikge1xuICAgICAgZXZlbnQuY29udGV4dHMgPSB7IHRyYWNlOiB0aGlzLl9zcGFuLmdldFRyYWNlQ29udGV4dCgpLCAuLi5ldmVudC5jb250ZXh0cyB9O1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb25OYW1lID0gdGhpcy5fc3Bhbi50cmFuc2FjdGlvbj8ubmFtZTtcbiAgICAgIGlmICh0cmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgICAgZXZlbnQudGFncyA9IHsgdHJhbnNhY3Rpb246IHRyYW5zYWN0aW9uTmFtZSwgLi4uZXZlbnQudGFncyB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5RmluZ2VycHJpbnQoZXZlbnQpO1xuXG4gICAgZXZlbnQuYnJlYWRjcnVtYnMgPSBbLi4uKGV2ZW50LmJyZWFkY3J1bWJzIHx8IFtdKSwgLi4udGhpcy5fYnJlYWRjcnVtYnNdO1xuICAgIGV2ZW50LmJyZWFkY3J1bWJzID0gZXZlbnQuYnJlYWRjcnVtYnMubGVuZ3RoID4gMCA/IGV2ZW50LmJyZWFkY3J1bWJzIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHRoaXMuX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhbLi4uZ2V0R2xvYmFsRXZlbnRQcm9jZXNzb3JzKCksIC4uLnRoaXMuX2V2ZW50UHJvY2Vzc29yc10sIGV2ZW50LCBoaW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHtAbGluayBhcHBseVRvRXZlbnR9IGlzIGZpbmlzaGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9ub3RpZnlFdmVudFByb2Nlc3NvcnMoXG4gICAgcHJvY2Vzc29yczogRXZlbnRQcm9jZXNzb3JbXSxcbiAgICBldmVudDogRXZlbnQgfCBudWxsLFxuICAgIGhpbnQ/OiBFdmVudEhpbnQsXG4gICAgaW5kZXg6IG51bWJlciA9IDAsXG4gICk6IFByb21pc2VMaWtlPEV2ZW50IHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXZlbnQgfCBudWxsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBwcm9jZXNzb3IgPSBwcm9jZXNzb3JzW2luZGV4XTtcbiAgICAgIGlmIChldmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgcHJvY2Vzc29yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJlc29sdmUoZXZlbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcHJvY2Vzc29yKHsgLi4uZXZlbnQgfSwgaGludCkgYXMgRXZlbnQgfCBudWxsO1xuICAgICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgdm9pZCAocmVzdWx0IGFzIFByb21pc2VMaWtlPEV2ZW50IHwgbnVsbD4pXG4gICAgICAgICAgICAudGhlbihmaW5hbCA9PiB0aGlzLl9ub3RpZnlFdmVudFByb2Nlc3NvcnMocHJvY2Vzc29ycywgZmluYWwsIGhpbnQsIGluZGV4ICsgMSkudGhlbihyZXNvbHZlKSlcbiAgICAgICAgICAgIC50aGVuKG51bGwsIHJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdm9pZCB0aGlzLl9ub3RpZnlFdmVudFByb2Nlc3NvcnMocHJvY2Vzc29ycywgcmVzdWx0LCBoaW50LCBpbmRleCArIDEpXG4gICAgICAgICAgICAudGhlbihyZXNvbHZlKVxuICAgICAgICAgICAgLnRoZW4obnVsbCwgcmVqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gZXZlcnkgc2V0IGNhbGwuXG4gICAqL1xuICBwcm90ZWN0ZWQgX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIC8vIFdlIG5lZWQgdGhpcyBjaGVjayBmb3IgdGhpcy5fbm90aWZ5aW5nTGlzdGVuZXJzIHRvIGJlIGFibGUgdG8gd29yayBvbiBzY29wZSBkdXJpbmcgdXBkYXRlc1xuICAgIC8vIElmIHRoaXMgY2hlY2sgaXMgbm90IGhlcmUgd2UnbGwgcHJvZHVjZSBlbmRsZXNzIHJlY3Vyc2lvbiB3aGVuIHNvbWV0aGluZyBpcyBkb25lIHdpdGggdGhlIHNjb3BlXG4gICAgLy8gZHVyaW5nIHRoZSBjYWxsYmFjay5cbiAgICBpZiAoIXRoaXMuX25vdGlmeWluZ0xpc3RlbmVycykge1xuICAgICAgdGhpcy5fbm90aWZ5aW5nTGlzdGVuZXJzID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3Njb3BlTGlzdGVuZXJzLmZvckVhY2goY2FsbGJhY2sgPT4ge1xuICAgICAgICBjYWxsYmFjayh0aGlzKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fbm90aWZ5aW5nTGlzdGVuZXJzID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgZmluZ2VycHJpbnQgZnJvbSB0aGUgc2NvcGUgdG8gdGhlIGV2ZW50IGlmIHRoZXJlJ3Mgb25lLFxuICAgKiB1c2VzIG1lc3NhZ2UgaWYgdGhlcmUncyBvbmUgaW5zdGVhZCBvciBnZXQgcmlkIG9mIGVtcHR5IGZpbmdlcnByaW50XG4gICAqL1xuICBwcml2YXRlIF9hcHBseUZpbmdlcnByaW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIC8vIE1ha2Ugc3VyZSBpdCdzIGFuIGFycmF5IGZpcnN0IGFuZCB3ZSBhY3R1YWxseSBoYXZlIHNvbWV0aGluZyBpbiBwbGFjZVxuICAgIGV2ZW50LmZpbmdlcnByaW50ID0gZXZlbnQuZmluZ2VycHJpbnRcbiAgICAgID8gQXJyYXkuaXNBcnJheShldmVudC5maW5nZXJwcmludClcbiAgICAgICAgPyBldmVudC5maW5nZXJwcmludFxuICAgICAgICA6IFtldmVudC5maW5nZXJwcmludF1cbiAgICAgIDogW107XG5cbiAgICAvLyBJZiB3ZSBoYXZlIHNvbWV0aGluZyBvbiB0aGUgc2NvcGUsIHRoZW4gbWVyZ2UgaXQgd2l0aCBldmVudFxuICAgIGlmICh0aGlzLl9maW5nZXJwcmludCkge1xuICAgICAgZXZlbnQuZmluZ2VycHJpbnQgPSBldmVudC5maW5nZXJwcmludC5jb25jYXQodGhpcy5fZmluZ2VycHJpbnQpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgbm8gZGF0YSBhdCBhbGwsIHJlbW92ZSBlbXB0eSBhcnJheSBkZWZhdWx0XG4gICAgaWYgKGV2ZW50LmZpbmdlcnByaW50ICYmICFldmVudC5maW5nZXJwcmludC5sZW5ndGgpIHtcbiAgICAgIGRlbGV0ZSBldmVudC5maW5nZXJwcmludDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnbG9iYWwgZXZlbnQgcHJvY2Vzc29ycy5cbiAqL1xuZnVuY3Rpb24gZ2V0R2xvYmFsRXZlbnRQcm9jZXNzb3JzKCk6IEV2ZW50UHJvY2Vzc29yW10ge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgICovXG4gIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxhbnk+KCk7XG4gIGdsb2JhbC5fX1NFTlRSWV9fID0gZ2xvYmFsLl9fU0VOVFJZX18gfHwge307XG4gIGdsb2JhbC5fX1NFTlRSWV9fLmdsb2JhbEV2ZW50UHJvY2Vzc29ycyA9IGdsb2JhbC5fX1NFTlRSWV9fLmdsb2JhbEV2ZW50UHJvY2Vzc29ycyB8fCBbXTtcbiAgcmV0dXJuIGdsb2JhbC5fX1NFTlRSWV9fLmdsb2JhbEV2ZW50UHJvY2Vzc29ycztcbiAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbn1cblxuLyoqXG4gKiBBZGQgYSBFdmVudFByb2Nlc3NvciB0byBiZSBrZXB0IGdsb2JhbGx5LlxuICogQHBhcmFtIGNhbGxiYWNrIEV2ZW50UHJvY2Vzc29yIHRvIGFkZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKTogdm9pZCB7XG4gIGdldEdsb2JhbEV2ZW50UHJvY2Vzc29ycygpLnB1c2goY2FsbGJhY2spO1xufVxuIiwgImltcG9ydCB7IFNlc3Npb24gYXMgU2Vzc2lvbkludGVyZmFjZSwgU2Vzc2lvbkNvbnRleHQsIFNlc3Npb25TdGF0dXMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGRyb3BVbmRlZmluZWRLZXlzLCB0aW1lc3RhbXBJblNlY29uZHMsIHV1aWQ0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8qKlxuICogQGluaGVyaXRkb2NcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb24gaW1wbGVtZW50cyBTZXNzaW9uSW50ZXJmYWNlIHtcbiAgcHVibGljIHVzZXJBZ2VudD86IHN0cmluZztcbiAgcHVibGljIGVycm9yczogbnVtYmVyID0gMDtcbiAgcHVibGljIHJlbGVhc2U/OiBzdHJpbmc7XG4gIHB1YmxpYyBzaWQ6IHN0cmluZyA9IHV1aWQ0KCk7XG4gIHB1YmxpYyBkaWQ/OiBzdHJpbmc7XG4gIHB1YmxpYyB0aW1lc3RhbXA6IG51bWJlcjtcbiAgcHVibGljIHN0YXJ0ZWQ6IG51bWJlcjtcbiAgcHVibGljIGR1cmF0aW9uPzogbnVtYmVyID0gMDtcbiAgcHVibGljIHN0YXR1czogU2Vzc2lvblN0YXR1cyA9IFNlc3Npb25TdGF0dXMuT2s7XG4gIHB1YmxpYyBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgcHVibGljIGlwQWRkcmVzcz86IHN0cmluZztcbiAgcHVibGljIGluaXQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwdWJsaWMgaWdub3JlRHVyYXRpb246IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoY29udGV4dD86IE9taXQ8U2Vzc2lvbkNvbnRleHQsICdzdGFydGVkJyB8ICdzdGF0dXMnPikge1xuICAgIC8vIEJvdGggdGltZXN0YW1wIGFuZCBzdGFydGVkIGFyZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoLlxuICAgIGNvbnN0IHN0YXJ0aW5nVGltZSA9IHRpbWVzdGFtcEluU2Vjb25kcygpO1xuICAgIHRoaXMudGltZXN0YW1wID0gc3RhcnRpbmdUaW1lO1xuICAgIHRoaXMuc3RhcnRlZCA9IHN0YXJ0aW5nVGltZTtcbiAgICBpZiAoY29udGV4dCkge1xuICAgICAgdGhpcy51cGRhdGUoY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gIHB1YmxpYyB1cGRhdGUoY29udGV4dDogU2Vzc2lvbkNvbnRleHQgPSB7fSk6IHZvaWQge1xuICAgIGlmIChjb250ZXh0LnVzZXIpIHtcbiAgICAgIGlmICghdGhpcy5pcEFkZHJlc3MgJiYgY29udGV4dC51c2VyLmlwX2FkZHJlc3MpIHtcbiAgICAgICAgdGhpcy5pcEFkZHJlc3MgPSBjb250ZXh0LnVzZXIuaXBfYWRkcmVzcztcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmRpZCAmJiAhY29udGV4dC5kaWQpIHtcbiAgICAgICAgdGhpcy5kaWQgPSBjb250ZXh0LnVzZXIuaWQgfHwgY29udGV4dC51c2VyLmVtYWlsIHx8IGNvbnRleHQudXNlci51c2VybmFtZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnRpbWVzdGFtcCA9IGNvbnRleHQudGltZXN0YW1wIHx8IHRpbWVzdGFtcEluU2Vjb25kcygpO1xuICAgIGlmIChjb250ZXh0Lmlnbm9yZUR1cmF0aW9uKSB7XG4gICAgICB0aGlzLmlnbm9yZUR1cmF0aW9uID0gY29udGV4dC5pZ25vcmVEdXJhdGlvbjtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuc2lkKSB7XG4gICAgICAvLyBHb29kIGVub3VnaCB1dWlkIHZhbGlkYXRpb24uIFx1MjAxNCBLYW1pbFxuICAgICAgdGhpcy5zaWQgPSBjb250ZXh0LnNpZC5sZW5ndGggPT09IDMyID8gY29udGV4dC5zaWQgOiB1dWlkNCgpO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC5pbml0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaW5pdCA9IGNvbnRleHQuaW5pdDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmRpZCAmJiBjb250ZXh0LmRpZCkge1xuICAgICAgdGhpcy5kaWQgPSBgJHtjb250ZXh0LmRpZH1gO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnRleHQuc3RhcnRlZCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuc3RhcnRlZCA9IGNvbnRleHQuc3RhcnRlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuaWdub3JlRHVyYXRpb24pIHtcbiAgICAgIHRoaXMuZHVyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29udGV4dC5kdXJhdGlvbiA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuZHVyYXRpb24gPSBjb250ZXh0LmR1cmF0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IHRoaXMudGltZXN0YW1wIC0gdGhpcy5zdGFydGVkO1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uID49IDAgPyBkdXJhdGlvbiA6IDA7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LnJlbGVhc2UpIHtcbiAgICAgIHRoaXMucmVsZWFzZSA9IGNvbnRleHQucmVsZWFzZTtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuZW52aXJvbm1lbnQpIHtcbiAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBjb250ZXh0LmVudmlyb25tZW50O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaXBBZGRyZXNzICYmIGNvbnRleHQuaXBBZGRyZXNzKSB7XG4gICAgICB0aGlzLmlwQWRkcmVzcyA9IGNvbnRleHQuaXBBZGRyZXNzO1xuICAgIH1cbiAgICBpZiAoIXRoaXMudXNlckFnZW50ICYmIGNvbnRleHQudXNlckFnZW50KSB7XG4gICAgICB0aGlzLnVzZXJBZ2VudCA9IGNvbnRleHQudXNlckFnZW50O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNvbnRleHQuZXJyb3JzID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5lcnJvcnMgPSBjb250ZXh0LmVycm9ycztcbiAgICB9XG4gICAgaWYgKGNvbnRleHQuc3RhdHVzKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IGNvbnRleHQuc3RhdHVzO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgY2xvc2Uoc3RhdHVzPzogRXhjbHVkZTxTZXNzaW9uU3RhdHVzLCBTZXNzaW9uU3RhdHVzLk9rPik6IHZvaWQge1xuICAgIGlmIChzdGF0dXMpIHtcbiAgICAgIHRoaXMudXBkYXRlKHsgc3RhdHVzIH0pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0dXMgPT09IFNlc3Npb25TdGF0dXMuT2spIHtcbiAgICAgIHRoaXMudXBkYXRlKHsgc3RhdHVzOiBTZXNzaW9uU3RhdHVzLkV4aXRlZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHRvSlNPTigpOiB7XG4gICAgaW5pdDogYm9vbGVhbjtcbiAgICBzaWQ6IHN0cmluZztcbiAgICBkaWQ/OiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgc3RhcnRlZDogc3RyaW5nO1xuICAgIGR1cmF0aW9uPzogbnVtYmVyO1xuICAgIHN0YXR1czogU2Vzc2lvblN0YXR1cztcbiAgICBlcnJvcnM6IG51bWJlcjtcbiAgICBhdHRycz86IHtcbiAgICAgIHJlbGVhc2U/OiBzdHJpbmc7XG4gICAgICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmc7XG4gICAgICBpcF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIH07XG4gIH0ge1xuICAgIHJldHVybiBkcm9wVW5kZWZpbmVkS2V5cyh7XG4gICAgICBzaWQ6IGAke3RoaXMuc2lkfWAsXG4gICAgICBpbml0OiB0aGlzLmluaXQsXG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCBzZWMgaXMgY29udmVydGVkIHRvIG1zIGZvciBkYXRlIGNvbnN0cnVjdG9yXG4gICAgICBzdGFydGVkOiBuZXcgRGF0ZSh0aGlzLnN0YXJ0ZWQgKiAxMDAwKS50b0lTT1N0cmluZygpLFxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSh0aGlzLnRpbWVzdGFtcCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgZXJyb3JzOiB0aGlzLmVycm9ycyxcbiAgICAgIGRpZDogdHlwZW9mIHRoaXMuZGlkID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdGhpcy5kaWQgPT09ICdzdHJpbmcnID8gYCR7dGhpcy5kaWR9YCA6IHVuZGVmaW5lZCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgYXR0cnM6IGRyb3BVbmRlZmluZWRLZXlzKHtcbiAgICAgICAgcmVsZWFzZTogdGhpcy5yZWxlYXNlLFxuICAgICAgICBlbnZpcm9ubWVudDogdGhpcy5lbnZpcm9ubWVudCxcbiAgICAgICAgaXBfYWRkcmVzczogdGhpcy5pcEFkZHJlc3MsXG4gICAgICAgIHVzZXJfYWdlbnQ6IHRoaXMudXNlckFnZW50LFxuICAgICAgfSksXG4gICAgfSk7XG4gIH1cbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbmltcG9ydCB7XG4gIEJyZWFkY3J1bWIsXG4gIEJyZWFkY3J1bWJIaW50LFxuICBDbGllbnQsXG4gIEN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbiAgRXZlbnQsXG4gIEV2ZW50SGludCxcbiAgRXh0cmEsXG4gIEV4dHJhcyxcbiAgSHViIGFzIEh1YkludGVyZmFjZSxcbiAgSW50ZWdyYXRpb24sXG4gIEludGVncmF0aW9uQ2xhc3MsXG4gIFByaW1pdGl2ZSxcbiAgU2Vzc2lvbkNvbnRleHQsXG4gIFNlc3Npb25TdGF0dXMsXG4gIFNldmVyaXR5LFxuICBTcGFuLFxuICBTcGFuQ29udGV4dCxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgVXNlcixcbn0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBjb25zb2xlU2FuZGJveCwgZGF0ZVRpbWVzdGFtcEluU2Vjb25kcywgZ2V0R2xvYmFsT2JqZWN0LCBpc05vZGVFbnYsIGxvZ2dlciwgdXVpZDQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbmltcG9ydCB7IFNlc3Npb24gfSBmcm9tICcuL3Nlc3Npb24nO1xuXG4vKipcbiAqIEFQSSBjb21wYXRpYmlsaXR5IHZlcnNpb24gb2YgdGhpcyBodWIuXG4gKlxuICogV0FSTklORzogVGhpcyBudW1iZXIgc2hvdWxkIG9ubHkgYmUgaW5jcmVhc2VkIHdoZW4gdGhlIGdsb2JhbCBpbnRlcmZhY2VcbiAqIGNoYW5nZXMgYW5kIG5ldyBtZXRob2RzIGFyZSBpbnRyb2R1Y2VkLlxuICpcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQSV9WRVJTSU9OID0gNDtcblxuLyoqXG4gKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGJyZWFkY3J1bWJzIGFkZGVkIHRvIGFuIGV2ZW50LiBDYW4gYmUgb3ZlcndyaXR0ZW5cbiAqIHdpdGgge0BsaW5rIE9wdGlvbnMubWF4QnJlYWRjcnVtYnN9LlxuICovXG5jb25zdCBERUZBVUxUX0JSRUFEQ1JVTUJTID0gMTAwO1xuXG4vKipcbiAqIEEgbGF5ZXIgaW4gdGhlIHByb2Nlc3Mgc3RhY2suXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGF5ZXIge1xuICBjbGllbnQ/OiBDbGllbnQ7XG4gIHNjb3BlPzogU2NvcGU7XG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBodWIgYW5kIG1haW50YWlucyBhIHNjb3BlIHN0YWNrLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhcnJpZXIge1xuICBfX1NFTlRSWV9fPzoge1xuICAgIGh1Yj86IEh1YjtcbiAgICAvKipcbiAgICAgKiBFeHRyYSBIdWIgcHJvcGVydGllcyBpbmplY3RlZCBieSB2YXJpb3VzIFNES3NcbiAgICAgKi9cbiAgICBpbnRlZ3JhdGlvbnM/OiBJbnRlZ3JhdGlvbltdO1xuICAgIGV4dGVuc2lvbnM/OiB7XG4gICAgICAvKiogSGFjayB0byBwcmV2ZW50IGJ1bmRsZXJzIGZyb20gYnJlYWtpbmcgb3VyIHVzYWdlIG9mIHRoZSBkb21haW4gcGFja2FnZSBpbiB0aGUgY3Jvc3MtcGxhdGZvcm0gSHViIHBhY2thZ2UgKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICBkb21haW4/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICAgIH0gJiB7XG4gICAgICAvKiogRXh0ZW5zaW9uIG1ldGhvZHMgZm9yIHRoZSBodWIsIHdoaWNoIGFyZSBib3VuZCB0byB0aGUgY3VycmVudCBIdWIgaW5zdGFuY2UgKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgICBba2V5OiBzdHJpbmddOiBGdW5jdGlvbjtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqIEBkZXByZWNhdGVkIENhbiBiZSByZW1vdmVkIG9uY2UgYEh1Yi5nZXRBY3RpdmVEb21haW5gIGlzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9tYWluQXNDYXJyaWVyIGV4dGVuZHMgQ2FycmllciB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIG1lbWJlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH1bXTtcbn1cblxuLyoqXG4gKiBAaW5oZXJpdERvY1xuICovXG5leHBvcnQgY2xhc3MgSHViIGltcGxlbWVudHMgSHViSW50ZXJmYWNlIHtcbiAgLyoqIElzIGEge0BsaW5rIExheWVyfVtdIGNvbnRhaW5pbmcgdGhlIGNsaWVudCBhbmQgc2NvcGUgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfc3RhY2s6IExheWVyW10gPSBbe31dO1xuXG4gIC8qKiBDb250YWlucyB0aGUgbGFzdCBldmVudCBpZCBvZiBhIGNhcHR1cmVkIGV2ZW50LiAgKi9cbiAgcHJpdmF0ZSBfbGFzdEV2ZW50SWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGh1Yiwgd2lsbCBwdXNoIG9uZSB7QGxpbmsgTGF5ZXJ9IGludG8gdGhlXG4gICAqIGludGVybmFsIHN0YWNrIG9uIGNyZWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY2xpZW50IGJvdW5kIHRvIHRoZSBodWIuXG4gICAqIEBwYXJhbSBzY29wZSBib3VuZCB0byB0aGUgaHViLlxuICAgKiBAcGFyYW0gdmVyc2lvbiBudW1iZXIsIGhpZ2hlciBudW1iZXIgbWVhbnMgaGlnaGVyIHByaW9yaXR5LlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGNsaWVudD86IENsaWVudCwgc2NvcGU6IFNjb3BlID0gbmV3IFNjb3BlKCksIHByaXZhdGUgcmVhZG9ubHkgX3ZlcnNpb246IG51bWJlciA9IEFQSV9WRVJTSU9OKSB7XG4gICAgdGhpcy5nZXRTdGFja1RvcCgpLnNjb3BlID0gc2NvcGU7XG4gICAgaWYgKGNsaWVudCkge1xuICAgICAgdGhpcy5iaW5kQ2xpZW50KGNsaWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgaXNPbGRlclRoYW4odmVyc2lvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3ZlcnNpb24gPCB2ZXJzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgYmluZENsaWVudChjbGllbnQ/OiBDbGllbnQpOiB2b2lkIHtcbiAgICBjb25zdCB0b3AgPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgdG9wLmNsaWVudCA9IGNsaWVudDtcbiAgICBpZiAoY2xpZW50ICYmIGNsaWVudC5zZXR1cEludGVncmF0aW9ucykge1xuICAgICAgY2xpZW50LnNldHVwSW50ZWdyYXRpb25zKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcHVzaFNjb3BlKCk6IFNjb3BlIHtcbiAgICAvLyBXZSB3YW50IHRvIGNsb25lIHRoZSBjb250ZW50IG9mIHByZXYgc2NvcGVcbiAgICBjb25zdCBzY29wZSA9IFNjb3BlLmNsb25lKHRoaXMuZ2V0U2NvcGUoKSk7XG4gICAgdGhpcy5nZXRTdGFjaygpLnB1c2goe1xuICAgICAgY2xpZW50OiB0aGlzLmdldENsaWVudCgpLFxuICAgICAgc2NvcGUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHNjb3BlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcG9wU2NvcGUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ2V0U3RhY2soKS5sZW5ndGggPD0gMSkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiAhIXRoaXMuZ2V0U3RhY2soKS5wb3AoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHdpdGhTY29wZShjYWxsYmFjazogKHNjb3BlOiBTY29wZSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5wdXNoU2NvcGUoKTtcbiAgICB0cnkge1xuICAgICAgY2FsbGJhY2soc2NvcGUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnBvcFNjb3BlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2xpZW50PEMgZXh0ZW5kcyBDbGllbnQ+KCk6IEMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuY2xpZW50IGFzIEM7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgc2NvcGUgb2YgdGhlIHRvcCBzdGFjay4gKi9cbiAgcHVibGljIGdldFNjb3BlKCk6IFNjb3BlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdGFja1RvcCgpLnNjb3BlO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHNjb3BlIHN0YWNrIGZvciBkb21haW5zIG9yIHRoZSBwcm9jZXNzLiAqL1xuICBwdWJsaWMgZ2V0U3RhY2soKTogTGF5ZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWNrO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHRvcG1vc3Qgc2NvcGUgbGF5ZXIgaW4gdGhlIG9yZGVyIGRvbWFpbiA+IGxvY2FsID4gcHJvY2Vzcy4gKi9cbiAgcHVibGljIGdldFN0YWNrVG9wKCk6IExheWVyIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoIC0gMV07XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gIHB1YmxpYyBjYXB0dXJlRXhjZXB0aW9uKGV4Y2VwdGlvbjogYW55LCBoaW50PzogRXZlbnRIaW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBldmVudElkID0gKHRoaXMuX2xhc3RFdmVudElkID0gdXVpZDQoKSk7XG4gICAgbGV0IGZpbmFsSGludCA9IGhpbnQ7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGV4cGxpY2l0IGhpbnQgcHJvdmlkZWQsIG1pbWljIHRoZSBzYW1lIHRoaW5nIHRoYXQgd291bGQgaGFwcGVuXG4gICAgLy8gaW4gdGhlIG1pbmltYWwgaXRzZWxmIHRvIGNyZWF0ZSBhIGNvbnNpc3RlbnQgYmVoYXZpb3IuXG4gICAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgY2xpZW50LCBhcyBpdCdzIHRoZSBsb3dlc3QgbGV2ZWwgQVBJLCBhbmQgZG9pbmcgdGhpcyxcbiAgICAvLyB3b3VsZCBwcmV2ZW50IHVzZXIgZnJvbSBoYXZpbmcgZnVsbCBjb250cm9sIG92ZXIgZGlyZWN0IGNhbGxzLlxuICAgIGlmICghaGludCkge1xuICAgICAgbGV0IHN5bnRoZXRpY0V4Y2VwdGlvbjogRXJyb3I7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24nKTtcbiAgICAgIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgICAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb24gYXMgRXJyb3I7XG4gICAgICB9XG4gICAgICBmaW5hbEhpbnQgPSB7XG4gICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBleGNlcHRpb24sXG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlRXhjZXB0aW9uJywgZXhjZXB0aW9uLCB7XG4gICAgICAuLi5maW5hbEhpbnQsXG4gICAgICBldmVudF9pZDogZXZlbnRJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNhcHR1cmVNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgbGV2ZWw/OiBTZXZlcml0eSwgaGludD86IEV2ZW50SGludCk6IHN0cmluZyB7XG4gICAgY29uc3QgZXZlbnRJZCA9ICh0aGlzLl9sYXN0RXZlbnRJZCA9IHV1aWQ0KCkpO1xuICAgIGxldCBmaW5hbEhpbnQgPSBoaW50O1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBleHBsaWNpdCBoaW50IHByb3ZpZGVkLCBtaW1pYyB0aGUgc2FtZSB0aGluZyB0aGF0IHdvdWxkIGhhcHBlblxuICAgIC8vIGluIHRoZSBtaW5pbWFsIGl0c2VsZiB0byBjcmVhdGUgYSBjb25zaXN0ZW50IGJlaGF2aW9yLlxuICAgIC8vIFdlIGRvbid0IGRvIHRoaXMgaW4gdGhlIGNsaWVudCwgYXMgaXQncyB0aGUgbG93ZXN0IGxldmVsIEFQSSwgYW5kIGRvaW5nIHRoaXMsXG4gICAgLy8gd291bGQgcHJldmVudCB1c2VyIGZyb20gaGF2aW5nIGZ1bGwgY29udHJvbCBvdmVyIGRpcmVjdCBjYWxscy5cbiAgICBpZiAoIWhpbnQpIHtcbiAgICAgIGxldCBzeW50aGV0aWNFeGNlcHRpb246IEVycm9yO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbiBhcyBFcnJvcjtcbiAgICAgIH1cbiAgICAgIGZpbmFsSGludCA9IHtcbiAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IG1lc3NhZ2UsXG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlTWVzc2FnZScsIG1lc3NhZ2UsIGxldmVsLCB7XG4gICAgICAuLi5maW5hbEhpbnQsXG4gICAgICBldmVudF9pZDogZXZlbnRJZCxcbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNhcHR1cmVFdmVudChldmVudDogRXZlbnQsIGhpbnQ/OiBFdmVudEhpbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGV2ZW50SWQgPSB1dWlkNCgpO1xuICAgIGlmIChldmVudC50eXBlICE9PSAndHJhbnNhY3Rpb24nKSB7XG4gICAgICB0aGlzLl9sYXN0RXZlbnRJZCA9IGV2ZW50SWQ7XG4gICAgfVxuXG4gICAgdGhpcy5faW52b2tlQ2xpZW50KCdjYXB0dXJlRXZlbnQnLCBldmVudCwge1xuICAgICAgLi4uaGludCxcbiAgICAgIGV2ZW50X2lkOiBldmVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiBldmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbGFzdEV2ZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbGFzdEV2ZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBhZGRCcmVhZGNydW1iKGJyZWFkY3J1bWI6IEJyZWFkY3J1bWIsIGhpbnQ/OiBCcmVhZGNydW1iSGludCk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2NvcGUsIGNsaWVudCB9ID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuXG4gICAgaWYgKCFzY29wZSB8fCAhY2xpZW50KSByZXR1cm47XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3QgeyBiZWZvcmVCcmVhZGNydW1iID0gbnVsbCwgbWF4QnJlYWRjcnVtYnMgPSBERUZBVUxUX0JSRUFEQ1JVTUJTIH0gPVxuICAgICAgKGNsaWVudC5nZXRPcHRpb25zICYmIGNsaWVudC5nZXRPcHRpb25zKCkpIHx8IHt9O1xuXG4gICAgaWYgKG1heEJyZWFkY3J1bWJzIDw9IDApIHJldHVybjtcblxuICAgIGNvbnN0IHRpbWVzdGFtcCA9IGRhdGVUaW1lc3RhbXBJblNlY29uZHMoKTtcbiAgICBjb25zdCBtZXJnZWRCcmVhZGNydW1iID0geyB0aW1lc3RhbXAsIC4uLmJyZWFkY3J1bWIgfTtcbiAgICBjb25zdCBmaW5hbEJyZWFkY3J1bWIgPSBiZWZvcmVCcmVhZGNydW1iXG4gICAgICA/IChjb25zb2xlU2FuZGJveCgoKSA9PiBiZWZvcmVCcmVhZGNydW1iKG1lcmdlZEJyZWFkY3J1bWIsIGhpbnQpKSBhcyBCcmVhZGNydW1iIHwgbnVsbClcbiAgICAgIDogbWVyZ2VkQnJlYWRjcnVtYjtcblxuICAgIGlmIChmaW5hbEJyZWFkY3J1bWIgPT09IG51bGwpIHJldHVybjtcblxuICAgIHNjb3BlLmFkZEJyZWFkY3J1bWIoZmluYWxCcmVhZGNydW1iLCBtYXhCcmVhZGNydW1icyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRVc2VyKHVzZXI6IFVzZXIgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSBzY29wZS5zZXRVc2VyKHVzZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VGFncyh0YWdzOiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9KTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSBzY29wZS5zZXRUYWdzKHRhZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0RXh0cmFzKGV4dHJhczogRXh0cmFzKTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSBzY29wZS5zZXRFeHRyYXMoZXh0cmFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFRhZyhrZXk6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSk6IHZvaWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuICAgIGlmIChzY29wZSkgc2NvcGUuc2V0VGFnKGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0RXh0cmEoa2V5OiBzdHJpbmcsIGV4dHJhOiBFeHRyYSk6IHZvaWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuICAgIGlmIChzY29wZSkgc2NvcGUuc2V0RXh0cmEoa2V5LCBleHRyYSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyBzZXRDb250ZXh0KG5hbWU6IHN0cmluZywgY29udGV4dDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldENvbnRleHQobmFtZSwgY29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25maWd1cmVTY29wZShjYWxsYmFjazogKHNjb3BlOiBTY29wZSkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2NvcGUsIGNsaWVudCB9ID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgIGlmIChzY29wZSAmJiBjbGllbnQpIHtcbiAgICAgIGNhbGxiYWNrKHNjb3BlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBydW4oY2FsbGJhY2s6IChodWI6IEh1YikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IG9sZEh1YiA9IG1ha2VNYWluKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBjYWxsYmFjayh0aGlzKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbWFrZU1haW4ob2xkSHViKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRJbnRlZ3JhdGlvbjxUIGV4dGVuZHMgSW50ZWdyYXRpb24+KGludGVncmF0aW9uOiBJbnRlZ3JhdGlvbkNsYXNzPFQ+KTogVCB8IG51bGwge1xuICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuZ2V0Q2xpZW50KCk7XG4gICAgaWYgKCFjbGllbnQpIHJldHVybiBudWxsO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gY2xpZW50LmdldEludGVncmF0aW9uKGludGVncmF0aW9uKTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIGxvZ2dlci53YXJuKGBDYW5ub3QgcmV0cmlldmUgaW50ZWdyYXRpb24gJHtpbnRlZ3JhdGlvbi5pZH0gZnJvbSB0aGUgY3VycmVudCBIdWJgKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXJ0U3Bhbihjb250ZXh0OiBTcGFuQ29udGV4dCk6IFNwYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYWxsRXh0ZW5zaW9uTWV0aG9kKCdzdGFydFNwYW4nLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXJ0VHJhbnNhY3Rpb24oY29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0LCBjdXN0b21TYW1wbGluZ0NvbnRleHQ/OiBDdXN0b21TYW1wbGluZ0NvbnRleHQpOiBUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxFeHRlbnNpb25NZXRob2QoJ3N0YXJ0VHJhbnNhY3Rpb24nLCBjb250ZXh0LCBjdXN0b21TYW1wbGluZ0NvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgdHJhY2VIZWFkZXJzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB0aGlzLl9jYWxsRXh0ZW5zaW9uTWV0aG9kPHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0+KCd0cmFjZUhlYWRlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNhcHR1cmVTZXNzaW9uKGVuZFNlc3Npb246IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIC8vIGJvdGggc2VuZCB0aGUgdXBkYXRlIGFuZCBwdWxsIHRoZSBzZXNzaW9uIGZyb20gdGhlIHNjb3BlXG4gICAgaWYgKGVuZFNlc3Npb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmVuZFNlc3Npb24oKTtcbiAgICB9XG5cbiAgICAvLyBvbmx5IHNlbmQgdGhlIHVwZGF0ZVxuICAgIHRoaXMuX3NlbmRTZXNzaW9uVXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBlbmRTZXNzaW9uKCk6IHZvaWQge1xuICAgIHRoaXMuZ2V0U3RhY2tUb3AoKVxuICAgICAgPy5zY29wZT8uZ2V0U2Vzc2lvbigpXG4gICAgICA/LmNsb3NlKCk7XG4gICAgdGhpcy5fc2VuZFNlc3Npb25VcGRhdGUoKTtcblxuICAgIC8vIHRoZSBzZXNzaW9uIGlzIG92ZXI7IHRha2UgaXQgb2ZmIG9mIHRoZSBzY29wZVxuICAgIHRoaXMuZ2V0U3RhY2tUb3AoKT8uc2NvcGU/LnNldFNlc3Npb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXJ0U2Vzc2lvbihjb250ZXh0PzogU2Vzc2lvbkNvbnRleHQpOiBTZXNzaW9uIHtcbiAgICBjb25zdCB7IHNjb3BlLCBjbGllbnQgfSA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICBjb25zdCB7IHJlbGVhc2UsIGVudmlyb25tZW50IH0gPSAoY2xpZW50ICYmIGNsaWVudC5nZXRPcHRpb25zKCkpIHx8IHt9O1xuXG4gICAgLy8gV2lsbCBmZXRjaCB1c2VyQWdlbnQgaWYgY2FsbGVkIGZyb20gYnJvd3NlciBzZGtcbiAgICBjb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8eyBuYXZpZ2F0b3I/OiB7IHVzZXJBZ2VudD86IHN0cmluZyB9IH0+KCk7XG4gICAgY29uc3QgeyB1c2VyQWdlbnQgfSA9IGdsb2JhbC5uYXZpZ2F0b3IgfHwge307XG5cbiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFNlc3Npb24oe1xuICAgICAgcmVsZWFzZSxcbiAgICAgIGVudmlyb25tZW50LFxuICAgICAgLi4uKHNjb3BlICYmIHsgdXNlcjogc2NvcGUuZ2V0VXNlcigpIH0pLFxuICAgICAgLi4uKHVzZXJBZ2VudCAmJiB7IHVzZXJBZ2VudCB9KSxcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgfSk7XG5cbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIC8vIEVuZCBleGlzdGluZyBzZXNzaW9uIGlmIHRoZXJlJ3Mgb25lXG4gICAgICBjb25zdCBjdXJyZW50U2Vzc2lvbiA9IHNjb3BlLmdldFNlc3Npb24gJiYgc2NvcGUuZ2V0U2Vzc2lvbigpO1xuICAgICAgaWYgKGN1cnJlbnRTZXNzaW9uICYmIGN1cnJlbnRTZXNzaW9uLnN0YXR1cyA9PT0gU2Vzc2lvblN0YXR1cy5Paykge1xuICAgICAgICBjdXJyZW50U2Vzc2lvbi51cGRhdGUoeyBzdGF0dXM6IFNlc3Npb25TdGF0dXMuRXhpdGVkIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5lbmRTZXNzaW9uKCk7XG5cbiAgICAgIC8vIEFmdGVyd2FyZHMgd2Ugc2V0IHRoZSBuZXcgc2Vzc2lvbiBvbiB0aGUgc2NvcGVcbiAgICAgIHNjb3BlLnNldFNlc3Npb24oc2Vzc2lvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgdGhlIGN1cnJlbnQgU2Vzc2lvbiBvbiB0aGUgc2NvcGVcbiAgICovXG4gIHByaXZhdGUgX3NlbmRTZXNzaW9uVXBkYXRlKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2NvcGUsIGNsaWVudCB9ID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgIGlmICghc2NvcGUpIHJldHVybjtcblxuICAgIGNvbnN0IHNlc3Npb24gPSBzY29wZS5nZXRTZXNzaW9uICYmIHNjb3BlLmdldFNlc3Npb24oKTtcbiAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgaWYgKGNsaWVudCAmJiBjbGllbnQuY2FwdHVyZVNlc3Npb24pIHtcbiAgICAgICAgY2xpZW50LmNhcHR1cmVTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdG8gY2FsbCBhIG1ldGhvZCBvbiB0aGUgdG9wIGNsaWVudCBpZiBpdCBleGlzdHMuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSBjbGllbnQuXG4gICAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjbGllbnQgZnVuY3Rpb24uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIF9pbnZva2VDbGllbnQ8TSBleHRlbmRzIGtleW9mIENsaWVudD4obWV0aG9kOiBNLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGNvbnN0IHsgc2NvcGUsIGNsaWVudCB9ID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgIGlmIChjbGllbnQgJiYgY2xpZW50W21ldGhvZF0pIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIChjbGllbnQgYXMgYW55KVttZXRob2RdKC4uLmFyZ3MsIHNjb3BlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgZ2xvYmFsIGV4dGVuc2lvbiBtZXRob2QgYW5kIGJpbmRpbmcgY3VycmVudCBpbnN0YW5jZSB0byB0aGUgZnVuY3Rpb24gY2FsbFxuICAgKi9cbiAgLy8gQHRzLWlnbm9yZSBGdW5jdGlvbiBsYWNrcyBlbmRpbmcgcmV0dXJuIHN0YXRlbWVudCBhbmQgcmV0dXJuIHR5cGUgZG9lcyBub3QgaW5jbHVkZSAndW5kZWZpbmVkJy4gdHMoMjM2NilcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSBfY2FsbEV4dGVuc2lvbk1ldGhvZDxUPihtZXRob2Q6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBUIHtcbiAgICBjb25zdCBjYXJyaWVyID0gZ2V0TWFpbkNhcnJpZXIoKTtcbiAgICBjb25zdCBzZW50cnkgPSBjYXJyaWVyLl9fU0VOVFJZX187XG4gICAgaWYgKHNlbnRyeSAmJiBzZW50cnkuZXh0ZW5zaW9ucyAmJiB0eXBlb2Ygc2VudHJ5LmV4dGVuc2lvbnNbbWV0aG9kXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHNlbnRyeS5leHRlbnNpb25zW21ldGhvZF0uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICAgIGxvZ2dlci53YXJuKGBFeHRlbnNpb24gbWV0aG9kICR7bWV0aG9kfSBjb3VsZG4ndCBiZSBmb3VuZCwgZG9pbmcgbm90aGluZy5gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGdsb2JhbCBzaGltIHJlZ2lzdHJ5LlxuICpcbiAqIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGlzIHByb2JsZW1hdGljLCBiZWNhdXNlIGRlc3BpdGUgYWx3YXlzIHJldHVybmluZyBhIHZhbGlkIENhcnJpZXIsXG4gKiBpdCBoYXMgYW4gb3B0aW9uYWwgYF9fU0VOVFJZX19gIHByb3BlcnR5LCB3aGljaCB0aGVuIGluIHR1cm4gcmVxdWlyZXMgdXMgdG8gYWx3YXlzIHBlcmZvcm0gYW4gdW5uZWNlc3NhcnkgY2hlY2tcbiAqIGF0IHRoZSBjYWxsLXNpdGUuIFdlIGFsd2F5cyBhY2Nlc3MgdGhlIGNhcnJpZXIgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQgYF9fU0VOVFJZX19gIGlzIHRoZXJlLlxuICoqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1haW5DYXJyaWVyKCk6IENhcnJpZXIge1xuICBjb25zdCBjYXJyaWVyID0gZ2V0R2xvYmFsT2JqZWN0KCk7XG4gIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7XG4gICAgZXh0ZW5zaW9uczoge30sXG4gICAgaHViOiB1bmRlZmluZWQsXG4gIH07XG4gIHJldHVybiBjYXJyaWVyO1xufVxuXG4vKipcbiAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IG1haW4gaHViIHdpdGggdGhlIHBhc3NlZCBvbmUgb24gdGhlIGdsb2JhbCBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyBUaGUgb2xkIHJlcGxhY2VkIGh1YlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZU1haW4oaHViOiBIdWIpOiBIdWIge1xuICBjb25zdCByZWdpc3RyeSA9IGdldE1haW5DYXJyaWVyKCk7XG4gIGNvbnN0IG9sZEh1YiA9IGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbiAgc2V0SHViT25DYXJyaWVyKHJlZ2lzdHJ5LCBodWIpO1xuICByZXR1cm4gb2xkSHViO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGRlZmF1bHQgaHViIGluc3RhbmNlLlxuICpcbiAqIElmIGEgaHViIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBpbiB0aGUgZ2xvYmFsIGNhcnJpZXIgYnV0IHRoaXMgbW9kdWxlXG4gKiBjb250YWlucyBhIG1vcmUgcmVjZW50IHZlcnNpb24sIGl0IHJlcGxhY2VzIHRoZSByZWdpc3RlcmVkIHZlcnNpb24uXG4gKiBPdGhlcndpc2UsIHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBodWIgd2lsbCBiZSByZXR1cm5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEN1cnJlbnRIdWIoKTogSHViIHtcbiAgLy8gR2V0IG1haW4gY2FycmllciAoZ2xvYmFsIGZvciBldmVyeSBlbnZpcm9ubWVudClcbiAgY29uc3QgcmVnaXN0cnkgPSBnZXRNYWluQ2FycmllcigpO1xuXG4gIC8vIElmIHRoZXJlJ3Mgbm8gaHViLCBvciBpdHMgYW4gb2xkIEFQSSwgYXNzaWduIGEgbmV3IG9uZVxuICBpZiAoIWhhc0h1Yk9uQ2FycmllcihyZWdpc3RyeSkgfHwgZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpLmlzT2xkZXJUaGFuKEFQSV9WRVJTSU9OKSkge1xuICAgIHNldEh1Yk9uQ2FycmllcihyZWdpc3RyeSwgbmV3IEh1YigpKTtcbiAgfVxuXG4gIC8vIFByZWZlciBkb21haW5zIG92ZXIgZ2xvYmFsIGlmIHRoZXkgYXJlIHRoZXJlIChhcHBsaWNhYmxlIG9ubHkgdG8gTm9kZSBlbnZpcm9ubWVudClcbiAgaWYgKGlzTm9kZUVudigpKSB7XG4gICAgcmV0dXJuIGdldEh1YkZyb21BY3RpdmVEb21haW4ocmVnaXN0cnkpO1xuICB9XG4gIC8vIFJldHVybiBodWIgdGhhdCBsaXZlcyBvbiBhIGdsb2JhbCBvYmplY3RcbiAgcmV0dXJuIGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhY3RpdmUgZG9tYWluLCBpZiBvbmUgZXhpc3RzXG4gKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgdXNlZDsgcmVtb3ZlIGluIHY3XG4gKiBAcmV0dXJucyBUaGUgZG9tYWluLCBvciB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm8gYWN0aXZlIGRvbWFpblxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVEb21haW4oKTogRG9tYWluQXNDYXJyaWVyIHwgdW5kZWZpbmVkIHtcbiAgbG9nZ2VyLndhcm4oJ0Z1bmN0aW9uIGBnZXRBY3RpdmVEb21haW5gIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLicpO1xuXG4gIGNvbnN0IHNlbnRyeSA9IGdldE1haW5DYXJyaWVyKCkuX19TRU5UUllfXztcblxuICByZXR1cm4gc2VudHJ5ICYmIHNlbnRyeS5leHRlbnNpb25zICYmIHNlbnRyeS5leHRlbnNpb25zLmRvbWFpbiAmJiBzZW50cnkuZXh0ZW5zaW9ucy5kb21haW4uYWN0aXZlO1xufVxuXG4vKipcbiAqIFRyeSB0byByZWFkIHRoZSBodWIgZnJvbSBhbiBhY3RpdmUgZG9tYWluLCBhbmQgZmFsbGJhY2sgdG8gdGhlIHJlZ2lzdHJ5IGlmIG9uZSBkb2Vzbid0IGV4aXN0XG4gKiBAcmV0dXJucyBkaXNjb3ZlcmVkIGh1YlxuICovXG5mdW5jdGlvbiBnZXRIdWJGcm9tQWN0aXZlRG9tYWluKHJlZ2lzdHJ5OiBDYXJyaWVyKTogSHViIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBhY3RpdmVEb21haW4gPSBnZXRNYWluQ2FycmllcigpLl9fU0VOVFJZX18/LmV4dGVuc2lvbnM/LmRvbWFpbj8uYWN0aXZlO1xuXG4gICAgLy8gSWYgdGhlcmUncyBubyBhY3RpdmUgZG9tYWluLCBqdXN0IHJldHVybiBnbG9iYWwgaHViXG4gICAgaWYgKCFhY3RpdmVEb21haW4pIHtcbiAgICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUncyBubyBodWIgb24gY3VycmVudCBkb21haW4sIG9yIGl0J3MgYW4gb2xkIEFQSSwgYXNzaWduIGEgbmV3IG9uZVxuICAgIGlmICghaGFzSHViT25DYXJyaWVyKGFjdGl2ZURvbWFpbikgfHwgZ2V0SHViRnJvbUNhcnJpZXIoYWN0aXZlRG9tYWluKS5pc09sZGVyVGhhbihBUElfVkVSU0lPTikpIHtcbiAgICAgIGNvbnN0IHJlZ2lzdHJ5SHViVG9wU3RhY2sgPSBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSkuZ2V0U3RhY2tUb3AoKTtcbiAgICAgIHNldEh1Yk9uQ2FycmllcihhY3RpdmVEb21haW4sIG5ldyBIdWIocmVnaXN0cnlIdWJUb3BTdGFjay5jbGllbnQsIFNjb3BlLmNsb25lKHJlZ2lzdHJ5SHViVG9wU3RhY2suc2NvcGUpKSk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGh1YiB0aGF0IGxpdmVzIG9uIGEgZG9tYWluXG4gICAgcmV0dXJuIGdldEh1YkZyb21DYXJyaWVyKGFjdGl2ZURvbWFpbik7XG4gIH0gY2F0Y2ggKF9Pbykge1xuICAgIC8vIFJldHVybiBodWIgdGhhdCBsaXZlcyBvbiBhIGdsb2JhbCBvYmplY3RcbiAgICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyB3aWxsIHRlbGwgd2hldGhlciBhIGNhcnJpZXIgaGFzIGEgaHViIG9uIGl0IG9yIG5vdFxuICogQHBhcmFtIGNhcnJpZXIgb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGhhc0h1Yk9uQ2FycmllcihjYXJyaWVyOiBDYXJyaWVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIShjYXJyaWVyICYmIGNhcnJpZXIuX19TRU5UUllfXyAmJiBjYXJyaWVyLl9fU0VOVFJZX18uaHViKTtcbn1cblxuLyoqXG4gKiBUaGlzIHdpbGwgY3JlYXRlIGEgbmV3IHtAbGluayBIdWJ9IGFuZCBhZGQgdG8gdGhlIHBhc3NlZCBvYmplY3Qgb25cbiAqIF9fU0VOVFJZX18uaHViLlxuICogQHBhcmFtIGNhcnJpZXIgb2JqZWN0XG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIdWJGcm9tQ2FycmllcihjYXJyaWVyOiBDYXJyaWVyKTogSHViIHtcbiAgaWYgKGNhcnJpZXIgJiYgY2Fycmllci5fX1NFTlRSWV9fICYmIGNhcnJpZXIuX19TRU5UUllfXy5odWIpIHJldHVybiBjYXJyaWVyLl9fU0VOVFJZX18uaHViO1xuICBjYXJyaWVyLl9fU0VOVFJZX18gPSBjYXJyaWVyLl9fU0VOVFJZX18gfHwge307XG4gIGNhcnJpZXIuX19TRU5UUllfXy5odWIgPSBuZXcgSHViKCk7XG4gIHJldHVybiBjYXJyaWVyLl9fU0VOVFJZX18uaHViO1xufVxuXG4vKipcbiAqIFRoaXMgd2lsbCBzZXQgcGFzc2VkIHtAbGluayBIdWJ9IG9uIHRoZSBwYXNzZWQgb2JqZWN0J3MgX19TRU5UUllfXy5odWIgYXR0cmlidXRlXG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqIEBwYXJhbSBodWIgSHViXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gaW5kaWNhdGluZyBzdWNjZXNzIG9yIGZhaWx1cmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEh1Yk9uQ2FycmllcihjYXJyaWVyOiBDYXJyaWVyLCBodWI6IEh1Yik6IGJvb2xlYW4ge1xuICBpZiAoIWNhcnJpZXIpIHJldHVybiBmYWxzZTtcbiAgY2Fycmllci5fX1NFTlRSWV9fID0gY2Fycmllci5fX1NFTlRSWV9fIHx8IHt9O1xuICBjYXJyaWVyLl9fU0VOVFJZX18uaHViID0gaHViO1xuICByZXR1cm4gdHJ1ZTtcbn1cbiIsICJpbXBvcnQge1xuICBBZ2dyZWdhdGlvbkNvdW50cyxcbiAgUmVxdWVzdFNlc3Npb25TdGF0dXMsXG4gIFNlc3Npb25BZ2dyZWdhdGVzLFxuICBTZXNzaW9uRmx1c2hlckxpa2UsXG4gIFRyYW5zcG9ydCxcbn0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBkcm9wVW5kZWZpbmVkS2V5cywgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICcuL2h1Yic7XG5cbnR5cGUgUmVsZWFzZUhlYWx0aEF0dHJpYnV0ZXMgPSB7XG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICByZWxlYXNlOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEBpbmhlcml0ZG9jXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uRmx1c2hlciBpbXBsZW1lbnRzIFNlc3Npb25GbHVzaGVyTGlrZSB7XG4gIHB1YmxpYyByZWFkb25seSBmbHVzaFRpbWVvdXQ6IG51bWJlciA9IDYwO1xuICBwcml2YXRlIF9wZW5kaW5nQWdncmVnYXRlczogUmVjb3JkPG51bWJlciwgQWdncmVnYXRpb25Db3VudHM+ID0ge307XG4gIHByaXZhdGUgX3Nlc3Npb25BdHRyczogUmVsZWFzZUhlYWx0aEF0dHJpYnV0ZXM7XG4gIHByaXZhdGUgX2ludGVydmFsSWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcbiAgcHJpdmF0ZSBfaXNFbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfdHJhbnNwb3J0OiBUcmFuc3BvcnQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRyYW5zcG9ydDogVHJhbnNwb3J0LCBhdHRyczogUmVsZWFzZUhlYWx0aEF0dHJpYnV0ZXMpIHtcbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0cmFuc3BvcnQ7XG4gICAgLy8gQ2FsbCB0byBzZXRJbnRlcnZhbCwgc28gdGhhdCBmbHVzaCBpcyBjYWxsZWQgZXZlcnkgNjAgc2Vjb25kc1xuICAgIHRoaXMuX2ludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmZsdXNoKCksIHRoaXMuZmx1c2hUaW1lb3V0ICogMTAwMCk7XG4gICAgdGhpcy5fc2Vzc2lvbkF0dHJzID0gYXR0cnM7XG4gIH1cblxuICAvKiogU2VuZHMgc2Vzc2lvbiBhZ2dyZWdhdGVzIHRvIFRyYW5zcG9ydCAqL1xuICBwdWJsaWMgc2VuZFNlc3Npb25BZ2dyZWdhdGVzKHNlc3Npb25BZ2dyZWdhdGVzOiBTZXNzaW9uQWdncmVnYXRlcyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdHJhbnNwb3J0LnNlbmRTZXNzaW9uKSB7XG4gICAgICBsb2dnZXIud2FybihcIkRyb3BwaW5nIHNlc3Npb24gYmVjYXVzZSBjdXN0b20gdHJhbnNwb3J0IGRvZXNuJ3QgaW1wbGVtZW50IHNlbmRTZXNzaW9uXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2b2lkIHRoaXMuX3RyYW5zcG9ydC5zZW5kU2Vzc2lvbihzZXNzaW9uQWdncmVnYXRlcykudGhlbihudWxsLCByZWFzb24gPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciB3aGlsZSBzZW5kaW5nIHNlc3Npb246ICR7cmVhc29ufWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIENoZWNrcyBpZiBgcGVuZGluZ0FnZ3JlZ2F0ZXNgIGhhcyBlbnRyaWVzLCBhbmQgaWYgaXQgZG9lcyBmbHVzaGVzIHRoZW0gYnkgY2FsbGluZyBgc2VuZFNlc3Npb25zYCAqL1xuICBwdWJsaWMgZmx1c2goKTogdm9pZCB7XG4gICAgY29uc3Qgc2Vzc2lvbkFnZ3JlZ2F0ZXMgPSB0aGlzLmdldFNlc3Npb25BZ2dyZWdhdGVzKCk7XG4gICAgaWYgKHNlc3Npb25BZ2dyZWdhdGVzLmFnZ3JlZ2F0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3BlbmRpbmdBZ2dyZWdhdGVzID0ge307XG4gICAgdGhpcy5zZW5kU2Vzc2lvbkFnZ3JlZ2F0ZXMoc2Vzc2lvbkFnZ3JlZ2F0ZXMpO1xuICB9XG5cbiAgLyoqIE1hc3NhZ2VzIHRoZSBlbnRyaWVzIGluIGBwZW5kaW5nQWdncmVnYXRlc2AgYW5kIHJldHVybnMgYWdncmVnYXRlZCBzZXNzaW9ucyAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvbkFnZ3JlZ2F0ZXMoKTogU2Vzc2lvbkFnZ3JlZ2F0ZXMge1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZXM6IEFnZ3JlZ2F0aW9uQ291bnRzW10gPSBPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nQWdncmVnYXRlcykubWFwKChrZXk6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdBZ2dyZWdhdGVzW3BhcnNlSW50KGtleSldO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2Vzc2lvbkFnZ3JlZ2F0ZXM6IFNlc3Npb25BZ2dyZWdhdGVzID0ge1xuICAgICAgYXR0cnM6IHRoaXMuX3Nlc3Npb25BdHRycyxcbiAgICAgIGFnZ3JlZ2F0ZXMsXG4gICAgfTtcbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoc2Vzc2lvbkFnZ3JlZ2F0ZXMpO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsSWQpO1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlO1xuICAgIHRoaXMuZmx1c2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBfaW5jcmVtZW50U2Vzc2lvblN0YXR1c0NvdW50IHRoYXQgY2hlY2tzIGlmIHRoZSBpbnN0YW5jZSBvZiBTZXNzaW9uRmx1c2hlciBpcyBlbmFibGVkIHRoZW5cbiAgICogZmV0Y2hlcyB0aGUgc2Vzc2lvbiBzdGF0dXMgb2YgdGhlIHJlcXVlc3QgZnJvbSBgU2NvcGUuZ2V0UmVxdWVzdFNlc3Npb24oKS5zdGF0dXNgIG9uIHRoZSBzY29wZSBhbmQgcGFzc2VzIHRoZW0gdG9cbiAgICogYF9pbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnRgIGFsb25nIHdpdGggdGhlIHN0YXJ0IGRhdGVcbiAgICovXG4gIHB1YmxpYyBpbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICBjb25zdCByZXF1ZXN0U2Vzc2lvbiA9IHNjb3BlPy5nZXRSZXF1ZXN0U2Vzc2lvbigpO1xuXG4gICAgaWYgKHJlcXVlc3RTZXNzaW9uICYmIHJlcXVlc3RTZXNzaW9uLnN0YXR1cykge1xuICAgICAgdGhpcy5faW5jcmVtZW50U2Vzc2lvblN0YXR1c0NvdW50KHJlcXVlc3RTZXNzaW9uLnN0YXR1cywgbmV3IERhdGUoKSk7XG4gICAgICAvLyBUaGlzIGlzIG5vdCBlbnRpcmVseSBuZWNlc3NhcmlseSBidXQgaXMgYWRkZWQgYXMgYSBzYWZlIGd1YXJkIHRvIGluZGljYXRlIHRoZSBib3VuZHMgb2YgYSByZXF1ZXN0IGFuZCBzbyBpblxuICAgICAgLy8gY2FzZSBjYXB0dXJlUmVxdWVzdFNlc3Npb24gaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHRvIHByZXZlbnQgZG91YmxlIGNvdW50XG4gICAgICBzY29wZT8uc2V0UmVxdWVzdFNlc3Npb24odW5kZWZpbmVkKTtcblxuICAgICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5jcmVtZW50cyBzdGF0dXMgYnVja2V0IGluIHBlbmRpbmdBZ2dyZWdhdGVzIGJ1ZmZlciAoaW50ZXJuYWwgc3RhdGUpIGNvcnJlc3BvbmRpbmcgdG8gc3RhdHVzIG9mXG4gICAqIHRoZSBzZXNzaW9uIHJlY2VpdmVkXG4gICAqL1xuICBwcml2YXRlIF9pbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnQoc3RhdHVzOiBSZXF1ZXN0U2Vzc2lvblN0YXR1cywgZGF0ZTogRGF0ZSk6IG51bWJlciB7XG4gICAgLy8gVHJ1bmNhdGUgbWludXRlcyBhbmQgc2Vjb25kcyBvbiBTZXNzaW9uIFN0YXJ0ZWQgYXR0cmlidXRlIHRvIGhhdmUgb25lIG1pbnV0ZSBidWNrZXQga2V5c1xuICAgIGNvbnN0IHNlc3Npb25TdGFydGVkVHJ1bmMgPSBuZXcgRGF0ZShkYXRlKS5zZXRTZWNvbmRzKDAsIDApO1xuICAgIHRoaXMuX3BlbmRpbmdBZ2dyZWdhdGVzW3Nlc3Npb25TdGFydGVkVHJ1bmNdID0gdGhpcy5fcGVuZGluZ0FnZ3JlZ2F0ZXNbc2Vzc2lvblN0YXJ0ZWRUcnVuY10gfHwge307XG5cbiAgICAvLyBjb3JyZXNwb25kcyB0byBhZ2dyZWdhdGVkIHNlc3Npb25zIGluIG9uZSBzcGVjaWZpYyBtaW51dGUgYnVja2V0XG4gICAgLy8gZm9yIGV4YW1wbGUsIHtcInN0YXJ0ZWRcIjpcIjIwMjEtMDMtMTZUMDg6MDA6MDAuMDAwWlwiLFwiZXhpdGVkXCI6NCwgXCJlcnJvcmVkXCI6IDF9XG4gICAgY29uc3QgYWdncmVnYXRpb25Db3VudHM6IEFnZ3JlZ2F0aW9uQ291bnRzID0gdGhpcy5fcGVuZGluZ0FnZ3JlZ2F0ZXNbc2Vzc2lvblN0YXJ0ZWRUcnVuY107XG4gICAgaWYgKCFhZ2dyZWdhdGlvbkNvdW50cy5zdGFydGVkKSB7XG4gICAgICBhZ2dyZWdhdGlvbkNvdW50cy5zdGFydGVkID0gbmV3IERhdGUoc2Vzc2lvblN0YXJ0ZWRUcnVuYykudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5FcnJvcmVkOlxuICAgICAgICBhZ2dyZWdhdGlvbkNvdW50cy5lcnJvcmVkID0gKGFnZ3JlZ2F0aW9uQ291bnRzLmVycm9yZWQgfHwgMCkgKyAxO1xuICAgICAgICByZXR1cm4gYWdncmVnYXRpb25Db3VudHMuZXJyb3JlZDtcbiAgICAgIGNhc2UgUmVxdWVzdFNlc3Npb25TdGF0dXMuT2s6XG4gICAgICAgIGFnZ3JlZ2F0aW9uQ291bnRzLmV4aXRlZCA9IChhZ2dyZWdhdGlvbkNvdW50cy5leGl0ZWQgfHwgMCkgKyAxO1xuICAgICAgICByZXR1cm4gYWdncmVnYXRpb25Db3VudHMuZXhpdGVkO1xuICAgICAgY2FzZSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5DcmFzaGVkOlxuICAgICAgICBhZ2dyZWdhdGlvbkNvdW50cy5jcmFzaGVkID0gKGFnZ3JlZ2F0aW9uQ291bnRzLmNyYXNoZWQgfHwgMCkgKyAxO1xuICAgICAgICByZXR1cm4gYWdncmVnYXRpb25Db3VudHMuY3Jhc2hlZDtcbiAgICB9XG4gIH1cbn1cbiIsICJleHBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgU2NvcGUgfSBmcm9tICcuL3Njb3BlJztcbmV4cG9ydCB7IFNlc3Npb24gfSBmcm9tICcuL3Nlc3Npb24nO1xuZXhwb3J0IHsgU2Vzc2lvbkZsdXNoZXIgfSBmcm9tICcuL3Nlc3Npb25mbHVzaGVyJztcbmV4cG9ydCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICBnZXRBY3RpdmVEb21haW4sXG4gIGdldEN1cnJlbnRIdWIsXG4gIGdldEh1YkZyb21DYXJyaWVyLFxuICBnZXRNYWluQ2FycmllcixcbiAgSHViLFxuICBtYWtlTWFpbixcbiAgc2V0SHViT25DYXJyaWVyLFxuICBDYXJyaWVyLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgRG9tYWluQXNDYXJyaWVyLFxuICBMYXllcixcbn0gZnJvbSAnLi9odWInO1xuIiwgImltcG9ydCB7IGdldEN1cnJlbnRIdWIsIEh1YiwgU2NvcGUgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQge1xuICBCcmVhZGNydW1iLFxuICBDYXB0dXJlQ29udGV4dCxcbiAgQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICBFdmVudCxcbiAgRXh0cmEsXG4gIEV4dHJhcyxcbiAgUHJpbWl0aXZlLFxuICBTZXZlcml0eSxcbiAgVHJhbnNhY3Rpb24sXG4gIFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgVXNlcixcbn0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5cbi8qKlxuICogVGhpcyBjYWxscyBhIGZ1bmN0aW9uIG9uIHRoZSBjdXJyZW50IGh1Yi5cbiAqIEBwYXJhbSBtZXRob2QgZnVuY3Rpb24gdG8gY2FsbCBvbiBodWIuXG4gKiBAcGFyYW0gYXJncyB0byBwYXNzIHRvIGZ1bmN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gY2FsbE9uSHViPFQ+KG1ldGhvZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICBjb25zdCBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gIGlmIChodWIgJiYgaHViW21ldGhvZCBhcyBrZXlvZiBIdWJdKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICByZXR1cm4gKGh1YlttZXRob2QgYXMga2V5b2YgSHViXSBhcyBhbnkpKC4uLmFyZ3MpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgTm8gaHViIGRlZmluZWQgb3IgJHttZXRob2R9IHdhcyBub3QgZm91bmQgb24gdGhlIGh1YiwgcGxlYXNlIG9wZW4gYSBidWcgcmVwb3J0LmApO1xufVxuXG4vKipcbiAqIENhcHR1cmVzIGFuIGV4Y2VwdGlvbiBldmVudCBhbmQgc2VuZHMgaXQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBleGNlcHRpb24gQW4gZXhjZXB0aW9uLWxpa2Ugb2JqZWN0LlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVFeGNlcHRpb24oZXhjZXB0aW9uOiBhbnksIGNhcHR1cmVDb250ZXh0PzogQ2FwdHVyZUNvbnRleHQpOiBzdHJpbmcge1xuICBsZXQgc3ludGhldGljRXhjZXB0aW9uOiBFcnJvcjtcbiAgdHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlbnRyeSBzeW50aGV0aWNFeGNlcHRpb24nKTtcbiAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgc3ludGhldGljRXhjZXB0aW9uID0gZXhjZXB0aW9uIGFzIEVycm9yO1xuICB9XG4gIHJldHVybiBjYWxsT25IdWIoJ2NhcHR1cmVFeGNlcHRpb24nLCBleGNlcHRpb24sIHtcbiAgICBjYXB0dXJlQ29udGV4dCxcbiAgICBvcmlnaW5hbEV4Y2VwdGlvbjogZXhjZXB0aW9uLFxuICAgIHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgfSk7XG59XG5cbi8qKlxuICogQ2FwdHVyZXMgYSBtZXNzYWdlIGV2ZW50IGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gKlxuICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gc2VuZCB0byBTZW50cnkuXG4gKiBAcGFyYW0gbGV2ZWwgRGVmaW5lIHRoZSBsZXZlbCBvZiB0aGUgbWVzc2FnZS5cbiAqIEByZXR1cm5zIFRoZSBnZW5lcmF0ZWQgZXZlbnRJZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgY2FwdHVyZUNvbnRleHQ/OiBDYXB0dXJlQ29udGV4dCB8IFNldmVyaXR5KTogc3RyaW5nIHtcbiAgbGV0IHN5bnRoZXRpY0V4Y2VwdGlvbjogRXJyb3I7XG4gIHRyeSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb24gYXMgRXJyb3I7XG4gIH1cblxuICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBwcm92aWRlIGV4cGxpY2l0IHNjb3BlcyB1cGdyYWRlLCB3aXRob3V0IGNoYW5naW5nIHRoZSBvcmlnaW5hbFxuICAvLyBhcml0eSBvZiB0aGUgYGNhcHR1cmVNZXNzYWdlKG1lc3NhZ2UsIGxldmVsKWAgbWV0aG9kLlxuICBjb25zdCBsZXZlbCA9IHR5cGVvZiBjYXB0dXJlQ29udGV4dCA9PT0gJ3N0cmluZycgPyBjYXB0dXJlQ29udGV4dCA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29udGV4dCA9IHR5cGVvZiBjYXB0dXJlQ29udGV4dCAhPT0gJ3N0cmluZycgPyB7IGNhcHR1cmVDb250ZXh0IH0gOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZU1lc3NhZ2UnLCBtZXNzYWdlLCBsZXZlbCwge1xuICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBtZXNzYWdlLFxuICAgIHN5bnRoZXRpY0V4Y2VwdGlvbixcbiAgICAuLi5jb250ZXh0LFxuICB9KTtcbn1cblxuLyoqXG4gKiBDYXB0dXJlcyBhIG1hbnVhbGx5IGNyZWF0ZWQgZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRvIHNlbmQgdG8gU2VudHJ5LlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZUV2ZW50KGV2ZW50OiBFdmVudCk6IHN0cmluZyB7XG4gIHJldHVybiBjYWxsT25IdWIoJ2NhcHR1cmVFdmVudCcsIGV2ZW50KTtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0byBzZXQgY29udGV4dCBpbmZvcm1hdGlvbiBvbnRvIHRoZSBzY29wZS5cbiAqIEBwYXJhbSBjYWxsYmFjayBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIFNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uZmlndXJlU2NvcGUoY2FsbGJhY2s6IChzY29wZTogU2NvcGUpID0+IHZvaWQpOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCdjb25maWd1cmVTY29wZScsIGNhbGxiYWNrKTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIGEgbmV3IGJyZWFkY3J1bWIgd2hpY2ggd2lsbCBiZSBhdHRhY2hlZCB0byBmdXR1cmUgZXZlbnRzLlxuICpcbiAqIEJyZWFkY3J1bWJzIHdpbGwgYmUgYWRkZWQgdG8gc3Vic2VxdWVudCBldmVudHMgdG8gcHJvdmlkZSBtb3JlIGNvbnRleHQgb25cbiAqIHVzZXIncyBhY3Rpb25zIHByaW9yIHRvIGFuIGVycm9yIG9yIGNyYXNoLlxuICpcbiAqIEBwYXJhbSBicmVhZGNydW1iIFRoZSBicmVhZGNydW1iIHRvIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEJyZWFkY3J1bWIoYnJlYWRjcnVtYjogQnJlYWRjcnVtYik6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ2FkZEJyZWFkY3J1bWInLCBicmVhZGNydW1iKTtcbn1cblxuLyoqXG4gKiBTZXRzIGNvbnRleHQgZGF0YSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICogQHBhcmFtIG5hbWUgb2YgdGhlIGNvbnRleHRcbiAqIEBwYXJhbSBjb250ZXh0IEFueSBraW5kIG9mIGRhdGEuIFRoaXMgZGF0YSB3aWxsIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gc2V0Q29udGV4dChuYW1lOiBzdHJpbmcsIGNvbnRleHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsKTogdm9pZCB7XG4gIGNhbGxPbkh1Yjx2b2lkPignc2V0Q29udGV4dCcsIG5hbWUsIGNvbnRleHQpO1xufVxuXG4vKipcbiAqIFNldCBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIG1lcmdlZCBzZW50IGFzIGV4dHJhIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0gZXh0cmFzIEV4dHJhcyBvYmplY3QgdG8gbWVyZ2UgaW50byBjdXJyZW50IGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFeHRyYXMoZXh0cmFzOiBFeHRyYXMpOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCdzZXRFeHRyYXMnLCBleHRyYXMpO1xufVxuXG4vKipcbiAqIFNldCBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIG1lcmdlZCBzZW50IGFzIHRhZ3MgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqIEBwYXJhbSB0YWdzIFRhZ3MgY29udGV4dCBvYmplY3QgdG8gbWVyZ2UgaW50byBjdXJyZW50IGNvbnRleHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIH0pOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCdzZXRUYWdzJywgdGFncyk7XG59XG5cbi8qKlxuICogU2V0IGtleTp2YWx1ZSB0aGF0IHdpbGwgYmUgc2VudCBhcyBleHRyYSBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICogQHBhcmFtIGtleSBTdHJpbmcgb2YgZXh0cmFcbiAqIEBwYXJhbSBleHRyYSBBbnkga2luZCBvZiBkYXRhLiBUaGlzIGRhdGEgd2lsbCBiZSBub3JtYWxpemVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RXh0cmEoa2V5OiBzdHJpbmcsIGV4dHJhOiBFeHRyYSk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldEV4dHJhJywga2V5LCBleHRyYSk7XG59XG5cbi8qKlxuICogU2V0IGtleTp2YWx1ZSB0aGF0IHdpbGwgYmUgc2VudCBhcyB0YWdzIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKlxuICogQ2FuIGFsc28gYmUgdXNlZCB0byB1bnNldCBhIHRhZywgYnkgcGFzc2luZyBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcGFyYW0ga2V5IFN0cmluZyBrZXkgb2YgdGFnXG4gKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgdGFnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUYWcoa2V5OiBzdHJpbmcsIHZhbHVlOiBQcmltaXRpdmUpOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCdzZXRUYWcnLCBrZXksIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGVzIHVzZXIgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgZnV0dXJlIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0gdXNlciBVc2VyIGNvbnRleHQgb2JqZWN0IHRvIGJlIHNldCBpbiB0aGUgY3VycmVudCBjb250ZXh0LiBQYXNzIGBudWxsYCB0byB1bnNldCB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFVzZXIodXNlcjogVXNlciB8IG51bGwpOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCdzZXRVc2VyJywgdXNlcik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBzY29wZSB3aXRoIGFuZCBleGVjdXRlcyB0aGUgZ2l2ZW4gb3BlcmF0aW9uIHdpdGhpbi5cbiAqIFRoZSBzY29wZSBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb25jZSB0aGUgb3BlcmF0aW9uXG4gKiBmaW5pc2hlcyBvciB0aHJvd3MuXG4gKlxuICogVGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvcjpcbiAqXG4gKiAgICAgcHVzaFNjb3BlKCk7XG4gKiAgICAgY2FsbGJhY2soKTtcbiAqICAgICBwb3BTY29wZSgpO1xuICpcbiAqIEBwYXJhbSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZW5jbG9zZWQgaW50byBwdXNoL3BvcFNjb3BlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNjb3BlKGNhbGxiYWNrOiAoc2NvcGU6IFNjb3BlKSA9PiB2b2lkKTogdm9pZCB7XG4gIGNhbGxPbkh1Yjx2b2lkPignd2l0aFNjb3BlJywgY2FsbGJhY2spO1xufVxuXG4vKipcbiAqIENhbGxzIGEgZnVuY3Rpb24gb24gdGhlIGxhdGVzdCBjbGllbnQuIFVzZSB0aGlzIHdpdGggY2F1dGlvbiwgaXQncyBtZWFudCBhc1xuICogaW4gXCJpbnRlcm5hbFwiIGhlbHBlciBzbyB3ZSBkb24ndCBuZWVkIHRvIGV4cG9zZSBldmVyeSBwb3NzaWJsZSBmdW5jdGlvbiBpblxuICogdGhlIHNoaW0uIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXQgdGhlIGNsaWVudCBhY3R1YWxseSBpbXBsZW1lbnRzIHRoZVxuICogZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIGNsaWVudC9jbGllbnQuXG4gKiBAcGFyYW0gYXJncyBBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgY2xpZW50L2ZvbnRlbmQuXG4gKiBAaGlkZGVuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gX2NhbGxPbkNsaWVudChtZXRob2Q6IHN0cmluZywgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCdfaW52b2tlQ2xpZW50JywgbWV0aG9kLCAuLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBTdGFydHMgYSBuZXcgYFRyYW5zYWN0aW9uYCBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgdG8gbWFudWFsIHRyYWNpbmcgaW5zdHJ1bWVudGF0aW9uLlxuICpcbiAqIEEgdHJlZSBzdHJ1Y3R1cmUgY2FuIGJlIGJ1aWx0IGJ5IGFkZGluZyBjaGlsZCBzcGFucyB0byB0aGUgdHJhbnNhY3Rpb24sIGFuZCBjaGlsZCBzcGFucyB0byBvdGhlciBzcGFucy4gVG8gc3RhcnQgYVxuICogbmV3IGNoaWxkIHNwYW4gd2l0aGluIHRoZSB0cmFuc2FjdGlvbiBvciBhbnkgc3BhbiwgY2FsbCB0aGUgcmVzcGVjdGl2ZSBgLnN0YXJ0Q2hpbGQoKWAgbWV0aG9kLlxuICpcbiAqIEV2ZXJ5IGNoaWxkIHNwYW4gbXVzdCBiZSBmaW5pc2hlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLCBvdGhlcndpc2UgdGhlIHVuZmluaXNoZWQgc3BhbnMgYXJlIGRpc2NhcmRlZC5cbiAqXG4gKiBUaGUgdHJhbnNhY3Rpb24gbXVzdCBiZSBmaW5pc2hlZCB3aXRoIGEgY2FsbCB0byBpdHMgYC5maW5pc2goKWAgbWV0aG9kLCBhdCB3aGljaCBwb2ludCB0aGUgdHJhbnNhY3Rpb24gd2l0aCBhbGwgaXRzXG4gKiBmaW5pc2hlZCBjaGlsZCBzcGFucyB3aWxsIGJlIHNlbnQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBjb250ZXh0IFByb3BlcnRpZXMgb2YgdGhlIG5ldyBgVHJhbnNhY3Rpb25gLlxuICogQHBhcmFtIGN1c3RvbVNhbXBsaW5nQ29udGV4dCBJbmZvcm1hdGlvbiBnaXZlbiB0byB0aGUgdHJhbnNhY3Rpb24gc2FtcGxpbmcgZnVuY3Rpb24gKGFsb25nIHdpdGggY29udGV4dC1kZXBlbmRlbnRcbiAqIGRlZmF1bHQgdmFsdWVzKS4gU2VlIHtAbGluayBPcHRpb25zLnRyYWNlc1NhbXBsZXJ9LlxuICpcbiAqIEByZXR1cm5zIFRoZSB0cmFuc2FjdGlvbiB3aGljaCB3YXMganVzdCBzdGFydGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydFRyYW5zYWN0aW9uKFxuICBjb250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQsXG4gIGN1c3RvbVNhbXBsaW5nQ29udGV4dD86IEN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbik6IFRyYW5zYWN0aW9uIHtcbiAgcmV0dXJuIGNhbGxPbkh1Yignc3RhcnRUcmFuc2FjdGlvbicsIHsgLi4uY29udGV4dCB9LCBjdXN0b21TYW1wbGluZ0NvbnRleHQpO1xufVxuIiwgImltcG9ydCB7IERzbkxpa2UsIFNka01ldGFkYXRhIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBEc24sIHVybEVuY29kZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5jb25zdCBTRU5UUllfQVBJX1ZFUlNJT04gPSAnNyc7XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIHRvIHByb3ZpZGUgdXJscywgaGVhZGVycyBhbmQgbWV0YWRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBmb3JtXG4gKiBkaWZmZXJlbnQgdHlwZXMgb2YgcmVxdWVzdHMgdG8gU2VudHJ5IGVuZHBvaW50cy5cbiAqIFN1cHBvcnRzIGJvdGggZW52ZWxvcGVzIGFuZCByZWd1bGFyIGV2ZW50IHJlcXVlc3RzLlxuICoqL1xuZXhwb3J0IGNsYXNzIEFQSSB7XG4gIC8qKiBUaGUgRFNOIGFzIHBhc3NlZCB0byBTZW50cnkuaW5pdCgpICovXG4gIHB1YmxpYyBkc246IERzbkxpa2U7XG5cbiAgLyoqIE1ldGFkYXRhIGFib3V0IHRoZSBTREsgKG5hbWUsIHZlcnNpb24sIGV0YykgZm9yIGluY2x1c2lvbiBpbiBlbnZlbG9wZSBoZWFkZXJzICovXG4gIHB1YmxpYyBtZXRhZGF0YTogU2RrTWV0YWRhdGE7XG5cbiAgLyoqIFRoZSBpbnRlcm5hbGx5IHVzZWQgRHNuIG9iamVjdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfZHNuT2JqZWN0OiBEc247XG5cbiAgLyoqIFRoZSBlbnZlbG9wZSB0dW5uZWwgdG8gdXNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90dW5uZWw/OiBzdHJpbmc7XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBUEkgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRzbjogRHNuTGlrZSwgbWV0YWRhdGE6IFNka01ldGFkYXRhID0ge30sIHR1bm5lbD86IHN0cmluZykge1xuICAgIHRoaXMuZHNuID0gZHNuO1xuICAgIHRoaXMuX2Rzbk9iamVjdCA9IG5ldyBEc24oZHNuKTtcbiAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7XG4gICAgdGhpcy5fdHVubmVsID0gdHVubmVsO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIERzbiBvYmplY3QuICovXG4gIHB1YmxpYyBnZXREc24oKTogRHNuIHtcbiAgICByZXR1cm4gdGhpcy5fZHNuT2JqZWN0O1xuICB9XG5cbiAgLyoqIERvZXMgdGhpcyB0cmFuc3BvcnQgZm9yY2UgZW52ZWxvcGVzPyAqL1xuICBwdWJsaWMgZm9yY2VFbnZlbG9wZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl90dW5uZWw7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgcHJlZml4IHRvIGNvbnN0cnVjdCBTZW50cnkgaW5nZXN0aW9uIEFQSSBlbmRwb2ludHMuICovXG4gIHB1YmxpYyBnZXRCYXNlQXBpRW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkc24gPSB0aGlzLmdldERzbigpO1xuICAgIGNvbnN0IHByb3RvY29sID0gZHNuLnByb3RvY29sID8gYCR7ZHNuLnByb3RvY29sfTpgIDogJyc7XG4gICAgY29uc3QgcG9ydCA9IGRzbi5wb3J0ID8gYDoke2Rzbi5wb3J0fWAgOiAnJztcbiAgICByZXR1cm4gYCR7cHJvdG9jb2x9Ly8ke2Rzbi5ob3N0fSR7cG9ydH0ke2Rzbi5wYXRoID8gYC8ke2Rzbi5wYXRofWAgOiAnJ30vYXBpL2A7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgc3RvcmUgZW5kcG9pbnQgVVJMLiAqL1xuICBwdWJsaWMgZ2V0U3RvcmVFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nZXRJbmdlc3RFbmRwb2ludCgnc3RvcmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdG9yZSBlbmRwb2ludCBVUkwgd2l0aCBhdXRoIGluIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAqXG4gICAqIFNlbmRpbmcgYXV0aCBhcyBwYXJ0IG9mIHRoZSBxdWVyeSBzdHJpbmcgYW5kIG5vdCBhcyBjdXN0b20gSFRUUCBoZWFkZXJzIGF2b2lkcyBDT1JTIHByZWZsaWdodCByZXF1ZXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXRTdG9yZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ2V0U3RvcmVFbmRwb2ludCgpfT8ke3RoaXMuX2VuY29kZWRBdXRoKCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlbnZlbG9wZSBlbmRwb2ludCBVUkwgd2l0aCBhdXRoIGluIHRoZSBxdWVyeSBzdHJpbmcuXG4gICAqXG4gICAqIFNlbmRpbmcgYXV0aCBhcyBwYXJ0IG9mIHRoZSBxdWVyeSBzdHJpbmcgYW5kIG5vdCBhcyBjdXN0b20gSFRUUCBoZWFkZXJzIGF2b2lkcyBDT1JTIHByZWZsaWdodCByZXF1ZXN0cy5cbiAgICovXG4gIHB1YmxpYyBnZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZm9yY2VFbnZlbG9wZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHVubmVsIGFzIHN0cmluZztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7dGhpcy5fZ2V0RW52ZWxvcGVFbmRwb2ludCgpfT8ke3RoaXMuX2VuY29kZWRBdXRoKCl9YDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIG9ubHkgdGhlIHBhdGggY29tcG9uZW50IGZvciB0aGUgc3RvcmUgZW5kcG9pbnQuICovXG4gIHB1YmxpYyBnZXRTdG9yZUVuZHBvaW50UGF0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgcmV0dXJuIGAke2Rzbi5wYXRoID8gYC8ke2Rzbi5wYXRofWAgOiAnJ30vYXBpLyR7ZHNuLnByb2plY3RJZH0vc3RvcmUvYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGluIHJlcXVlc3QgaGVhZGVycy5cbiAgICogVGhpcyBpcyBuZWVkZWQgZm9yIG5vZGUgYW5kIHRoZSBvbGQgL3N0b3JlIGVuZHBvaW50IGluIHNlbnRyeVxuICAgKi9cbiAgcHVibGljIGdldFJlcXVlc3RIZWFkZXJzKGNsaWVudE5hbWU6IHN0cmluZywgY2xpZW50VmVyc2lvbjogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgLy8gQ0hBTkdFIFRISVMgdG8gdXNlIG1ldGFkYXRhIGJ1dCBrZWVwIGNsaWVudE5hbWUgYW5kIGNsaWVudFZlcnNpb24gY29tcGF0aWJsZVxuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgY29uc3QgaGVhZGVyID0gW2BTZW50cnkgc2VudHJ5X3ZlcnNpb249JHtTRU5UUllfQVBJX1ZFUlNJT059YF07XG4gICAgaGVhZGVyLnB1c2goYHNlbnRyeV9jbGllbnQ9JHtjbGllbnROYW1lfS8ke2NsaWVudFZlcnNpb259YCk7XG4gICAgaGVhZGVyLnB1c2goYHNlbnRyeV9rZXk9JHtkc24ucHVibGljS2V5fWApO1xuICAgIGlmIChkc24ucGFzcykge1xuICAgICAgaGVhZGVyLnB1c2goYHNlbnRyeV9zZWNyZXQ9JHtkc24ucGFzc31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnWC1TZW50cnktQXV0aCc6IGhlYWRlci5qb2luKCcsICcpLFxuICAgIH07XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgdXJsIHRvIHRoZSByZXBvcnQgZGlhbG9nIGVuZHBvaW50LiAqL1xuICBwdWJsaWMgZ2V0UmVwb3J0RGlhbG9nRW5kcG9pbnQoXG4gICAgZGlhbG9nT3B0aW9uczoge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgIHVzZXI/OiB7IG5hbWU/OiBzdHJpbmc7IGVtYWlsPzogc3RyaW5nIH07XG4gICAgfSA9IHt9LFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgY29uc3QgZW5kcG9pbnQgPSBgJHt0aGlzLmdldEJhc2VBcGlFbmRwb2ludCgpfWVtYmVkL2Vycm9yLXBhZ2UvYDtcblxuICAgIGNvbnN0IGVuY29kZWRPcHRpb25zID0gW107XG4gICAgZW5jb2RlZE9wdGlvbnMucHVzaChgZHNuPSR7ZHNuLnRvU3RyaW5nKCl9YCk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGlhbG9nT3B0aW9ucykge1xuICAgICAgaWYgKGtleSA9PT0gJ2RzbicpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09ICd1c2VyJykge1xuICAgICAgICBpZiAoIWRpYWxvZ09wdGlvbnMudXNlcikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWFsb2dPcHRpb25zLnVzZXIubmFtZSkge1xuICAgICAgICAgIGVuY29kZWRPcHRpb25zLnB1c2goYG5hbWU9JHtlbmNvZGVVUklDb21wb25lbnQoZGlhbG9nT3B0aW9ucy51c2VyLm5hbWUpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWFsb2dPcHRpb25zLnVzZXIuZW1haWwpIHtcbiAgICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKGBlbWFpbD0ke2VuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIuZW1haWwpfWApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKGAke2VuY29kZVVSSUNvbXBvbmVudChrZXkpfT0ke2VuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zW2tleV0gYXMgc3RyaW5nKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kZWRPcHRpb25zLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGAke2VuZHBvaW50fT8ke2VuY29kZWRPcHRpb25zLmpvaW4oJyYnKX1gO1xuICAgIH1cblxuICAgIHJldHVybiBlbmRwb2ludDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBlbnZlbG9wZSBlbmRwb2ludCBVUkwuICovXG4gIHByaXZhdGUgX2dldEVudmVsb3BlRW5kcG9pbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SW5nZXN0RW5kcG9pbnQoJ2VudmVsb3BlJyk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgaW5nZXN0IEFQSSBlbmRwb2ludCBmb3IgdGFyZ2V0LiAqL1xuICBwcml2YXRlIF9nZXRJbmdlc3RFbmRwb2ludCh0YXJnZXQ6ICdzdG9yZScgfCAnZW52ZWxvcGUnKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fdHVubmVsKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHVubmVsO1xuICAgIH1cbiAgICBjb25zdCBiYXNlID0gdGhpcy5nZXRCYXNlQXBpRW5kcG9pbnQoKTtcbiAgICBjb25zdCBkc24gPSB0aGlzLmdldERzbigpO1xuICAgIHJldHVybiBgJHtiYXNlfSR7ZHNuLnByb2plY3RJZH0vJHt0YXJnZXR9L2A7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIFVSTC1lbmNvZGVkIHN0cmluZyB3aXRoIGF1dGggY29uZmlnIHN1aXRhYmxlIGZvciBhIHF1ZXJ5IHN0cmluZy4gKi9cbiAgcHJpdmF0ZSBfZW5jb2RlZEF1dGgoKTogc3RyaW5nIHtcbiAgICBjb25zdCBkc24gPSB0aGlzLmdldERzbigpO1xuICAgIGNvbnN0IGF1dGggPSB7XG4gICAgICAvLyBXZSBzZW5kIG9ubHkgdGhlIG1pbmltdW0gc2V0IG9mIHJlcXVpcmVkIGluZm9ybWF0aW9uLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzI1NzIuXG4gICAgICBzZW50cnlfa2V5OiBkc24ucHVibGljS2V5LFxuICAgICAgc2VudHJ5X3ZlcnNpb246IFNFTlRSWV9BUElfVkVSU0lPTixcbiAgICB9O1xuICAgIHJldHVybiB1cmxFbmNvZGUoYXV0aCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEludGVncmF0aW9uLCBPcHRpb25zIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGluc3RhbGxlZEludGVncmF0aW9uczogc3RyaW5nW10gPSBbXTtcblxuLyoqIE1hcCBvZiBpbnRlZ3JhdGlvbnMgYXNzaWduZWQgdG8gYSBjbGllbnQgKi9cbmV4cG9ydCB0eXBlIEludGVncmF0aW9uSW5kZXggPSB7XG4gIFtrZXk6IHN0cmluZ106IEludGVncmF0aW9uO1xufSAmIHsgaW5pdGlhbGl6ZWQ/OiBib29sZWFuIH07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZmlsdGVyRHVwbGljYXRlcyhpbnRlZ3JhdGlvbnM6IEludGVncmF0aW9uW10pOiBJbnRlZ3JhdGlvbltdIHtcbiAgcmV0dXJuIGludGVncmF0aW9ucy5yZWR1Y2UoKGFjYywgaW50ZWdyYXRpb25zKSA9PiB7XG4gICAgaWYgKGFjYy5ldmVyeShhY2NJbnRlZ3JhdGlvbiA9PiBpbnRlZ3JhdGlvbnMubmFtZSAhPT0gYWNjSW50ZWdyYXRpb24ubmFtZSkpIHtcbiAgICAgIGFjYy5wdXNoKGludGVncmF0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIFtdIGFzIEludGVncmF0aW9uW10pO1xufVxuXG4vKiogR2V0cyBpbnRlZ3JhdGlvbiB0byBpbnN0YWxsICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZWdyYXRpb25zVG9TZXR1cChvcHRpb25zOiBPcHRpb25zKTogSW50ZWdyYXRpb25bXSB7XG4gIGNvbnN0IGRlZmF1bHRJbnRlZ3JhdGlvbnMgPSAob3B0aW9ucy5kZWZhdWx0SW50ZWdyYXRpb25zICYmIFsuLi5vcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnNdKSB8fCBbXTtcbiAgY29uc3QgdXNlckludGVncmF0aW9ucyA9IG9wdGlvbnMuaW50ZWdyYXRpb25zO1xuXG4gIGxldCBpbnRlZ3JhdGlvbnM6IEludGVncmF0aW9uW10gPSBbLi4uZmlsdGVyRHVwbGljYXRlcyhkZWZhdWx0SW50ZWdyYXRpb25zKV07XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodXNlckludGVncmF0aW9ucykpIHtcbiAgICAvLyBGaWx0ZXIgb3V0IGludGVncmF0aW9ucyB0aGF0IGFyZSBhbHNvIGluY2x1ZGVkIGluIHVzZXIgb3B0aW9uc1xuICAgIGludGVncmF0aW9ucyA9IFtcbiAgICAgIC4uLmludGVncmF0aW9ucy5maWx0ZXIoaW50ZWdyYXRpb25zID0+XG4gICAgICAgIHVzZXJJbnRlZ3JhdGlvbnMuZXZlcnkodXNlckludGVncmF0aW9uID0+IHVzZXJJbnRlZ3JhdGlvbi5uYW1lICE9PSBpbnRlZ3JhdGlvbnMubmFtZSksXG4gICAgICApLFxuICAgICAgLy8gQW5kIGZpbHRlciBvdXQgZHVwbGljYXRlZCB1c2VyIG9wdGlvbnMgaW50ZWdyYXRpb25zXG4gICAgICAuLi5maWx0ZXJEdXBsaWNhdGVzKHVzZXJJbnRlZ3JhdGlvbnMpLFxuICAgIF07XG4gIH0gZWxzZSBpZiAodHlwZW9mIHVzZXJJbnRlZ3JhdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpbnRlZ3JhdGlvbnMgPSB1c2VySW50ZWdyYXRpb25zKGludGVncmF0aW9ucyk7XG4gICAgaW50ZWdyYXRpb25zID0gQXJyYXkuaXNBcnJheShpbnRlZ3JhdGlvbnMpID8gaW50ZWdyYXRpb25zIDogW2ludGVncmF0aW9uc107XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgdGhhdCBpZiBwcmVzZW50LCBgRGVidWdgIGludGVncmF0aW9uIHdpbGwgYWx3YXlzIHJ1biBsYXN0XG4gIGNvbnN0IGludGVncmF0aW9uc05hbWVzID0gaW50ZWdyYXRpb25zLm1hcChpID0+IGkubmFtZSk7XG4gIGNvbnN0IGFsd2F5c0xhc3RUb1J1biA9ICdEZWJ1Zyc7XG4gIGlmIChpbnRlZ3JhdGlvbnNOYW1lcy5pbmRleE9mKGFsd2F5c0xhc3RUb1J1bikgIT09IC0xKSB7XG4gICAgaW50ZWdyYXRpb25zLnB1c2goLi4uaW50ZWdyYXRpb25zLnNwbGljZShpbnRlZ3JhdGlvbnNOYW1lcy5pbmRleE9mKGFsd2F5c0xhc3RUb1J1biksIDEpKTtcbiAgfVxuXG4gIHJldHVybiBpbnRlZ3JhdGlvbnM7XG59XG5cbi8qKiBTZXR1cCBnaXZlbiBpbnRlZ3JhdGlvbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW50ZWdyYXRpb24oaW50ZWdyYXRpb246IEludGVncmF0aW9uKTogdm9pZCB7XG4gIGlmIChpbnN0YWxsZWRJbnRlZ3JhdGlvbnMuaW5kZXhPZihpbnRlZ3JhdGlvbi5uYW1lKSAhPT0gLTEpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaW50ZWdyYXRpb24uc2V0dXBPbmNlKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViKTtcbiAgaW5zdGFsbGVkSW50ZWdyYXRpb25zLnB1c2goaW50ZWdyYXRpb24ubmFtZSk7XG4gIGxvZ2dlci5sb2coYEludGVncmF0aW9uIGluc3RhbGxlZDogJHtpbnRlZ3JhdGlvbi5uYW1lfWApO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBpbnRlZ3JhdGlvbiBpbnN0YW5jZXMgdGhpcyBpbnN0YWxscyB0aGVtIGFsbC4gV2hlbiBgd2l0aERlZmF1bHRzYCBpcyBzZXQgdG8gYHRydWVgIHRoZW4gYWxsIGRlZmF1bHRcbiAqIGludGVncmF0aW9ucyBhcmUgYWRkZWQgdW5sZXNzIHRoZXkgd2VyZSBhbHJlYWR5IHByb3ZpZGVkIGJlZm9yZS5cbiAqIEBwYXJhbSBpbnRlZ3JhdGlvbnMgYXJyYXkgb2YgaW50ZWdyYXRpb24gaW5zdGFuY2VzXG4gKiBAcGFyYW0gd2l0aERlZmF1bHQgc2hvdWxkIGVuYWJsZSBkZWZhdWx0IGludGVncmF0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbnRlZ3JhdGlvbnM8TyBleHRlbmRzIE9wdGlvbnM+KG9wdGlvbnM6IE8pOiBJbnRlZ3JhdGlvbkluZGV4IHtcbiAgY29uc3QgaW50ZWdyYXRpb25zOiBJbnRlZ3JhdGlvbkluZGV4ID0ge307XG4gIGdldEludGVncmF0aW9uc1RvU2V0dXAob3B0aW9ucykuZm9yRWFjaChpbnRlZ3JhdGlvbiA9PiB7XG4gICAgaW50ZWdyYXRpb25zW2ludGVncmF0aW9uLm5hbWVdID0gaW50ZWdyYXRpb247XG4gICAgc2V0dXBJbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbik7XG4gIH0pO1xuICAvLyBzZXQgdGhlIGBpbml0aWFsaXplZGAgZmxhZyBzbyB3ZSBkb24ndCBydW4gdGhyb3VnaCB0aGUgcHJvY2VzcyBhZ2FpbiB1bmVjZXNzYXJpbHk7IHVzZSBgT2JqZWN0LmRlZmluZVByb3BlcnR5YFxuICAvLyBiZWNhdXNlIGJ5IGRlZmF1bHQgaXQgY3JlYXRlcyBhIHByb3BlcnR5IHdoaWNoIGlzIG5vbmVudW1lcmFibGUsIHdoaWNoIHdlIHdhbnQgc2luY2UgYGluaXRpYWxpemVkYCBzaG91bGRuJ3QgYmVcbiAgLy8gY29uc2lkZXJlZCBhIG1lbWJlciBvZiB0aGUgaW5kZXggdGhlIHdheSB0aGUgYWN0dWFsIGludGVncmF0aW9ucyBhcmVcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGludGVncmF0aW9ucywgJ2luaXRpYWxpemVkJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIGludGVncmF0aW9ucztcbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbmltcG9ydCB7IFNjb3BlLCBTZXNzaW9uIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHtcbiAgQ2xpZW50LFxuICBFdmVudCxcbiAgRXZlbnRIaW50LFxuICBJbnRlZ3JhdGlvbixcbiAgSW50ZWdyYXRpb25DbGFzcyxcbiAgT3B0aW9ucyxcbiAgT3V0Y29tZSxcbiAgU2Vzc2lvblN0YXR1cyxcbiAgU2V2ZXJpdHksXG4gIFRyYW5zcG9ydCxcbn0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQge1xuICBjaGVja09yU2V0QWxyZWFkeUNhdWdodCxcbiAgZGF0ZVRpbWVzdGFtcEluU2Vjb25kcyxcbiAgRHNuLFxuICBpc1BsYWluT2JqZWN0LFxuICBpc1ByaW1pdGl2ZSxcbiAgaXNUaGVuYWJsZSxcbiAgbG9nZ2VyLFxuICBub3JtYWxpemUsXG4gIFNlbnRyeUVycm9yLFxuICBTeW5jUHJvbWlzZSxcbiAgdHJ1bmNhdGUsXG4gIHV1aWQ0LFxufSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgQmFja2VuZCwgQmFja2VuZENsYXNzIH0gZnJvbSAnLi9iYXNlYmFja2VuZCc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbkluZGV4LCBzZXR1cEludGVncmF0aW9ucyB9IGZyb20gJy4vaW50ZWdyYXRpb24nO1xuXG5jb25zdCBBTFJFQURZX1NFRU5fRVJST1IgPSBcIk5vdCBjYXB0dXJpbmcgZXhjZXB0aW9uIGJlY2F1c2UgaXQncyBhbHJlYWR5IGJlZW4gY2FwdHVyZWQuXCI7XG5cbi8qKlxuICogQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgYWxsIEphdmFTY3JpcHQgU0RLIGNsaWVudHMuXG4gKlxuICogQ2FsbCB0aGUgY29uc3RydWN0b3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBiYWNrZW5kIGNvbnN0cnVjdG9yIGFuZCBvcHRpb25zXG4gKiBzcGVjaWZpYyB0byB0aGUgY2xpZW50IHN1YmNsYXNzLiBUbyBhY2Nlc3MgdGhlc2Ugb3B0aW9ucyBsYXRlciwgdXNlXG4gKiB7QGxpbmsgQ2xpZW50LmdldE9wdGlvbnN9LiBBbHNvLCB0aGUgQmFja2VuZCBpbnN0YW5jZSBpcyBhdmFpbGFibGUgdmlhXG4gKiB7QGxpbmsgQ2xpZW50LmdldEJhY2tlbmR9LlxuICpcbiAqIElmIGEgRHNuIGlzIHNwZWNpZmllZCBpbiB0aGUgb3B0aW9ucywgaXQgd2lsbCBiZSBwYXJzZWQgYW5kIHN0b3JlZC4gVXNlXG4gKiB7QGxpbmsgQ2xpZW50LmdldERzbn0gdG8gcmV0cmlldmUgdGhlIERzbiBhdCBhbnkgbW9tZW50LiBJbiBjYXNlIHRoZSBEc24gaXNcbiAqIGludmFsaWQsIHRoZSBjb25zdHJ1Y3RvciB3aWxsIHRocm93IGEge0BsaW5rIFNlbnRyeUV4Y2VwdGlvbn0uIE5vdGUgdGhhdFxuICogd2l0aG91dCBhIHZhbGlkIERzbiwgdGhlIFNESyB3aWxsIG5vdCBzZW5kIGFueSBldmVudHMgdG8gU2VudHJ5LlxuICpcbiAqIEJlZm9yZSBzZW5kaW5nIGFuIGV2ZW50IHZpYSB0aGUgYmFja2VuZCwgaXQgaXMgcGFzc2VkIHRocm91Z2hcbiAqIHtAbGluayBCYXNlQ2xpZW50Ll9wcmVwYXJlRXZlbnR9IHRvIGFkZCBTREsgaW5mb3JtYXRpb24gYW5kIHNjb3BlIGRhdGFcbiAqIChicmVhZGNydW1icyBhbmQgY29udGV4dCkuIFRvIGFkZCBtb3JlIGN1c3RvbSBpbmZvcm1hdGlvbiwgb3ZlcnJpZGUgdGhpc1xuICogbWV0aG9kIGFuZCBleHRlbmQgdGhlIHJlc3VsdGluZyBwcmVwYXJlZCBldmVudC5cbiAqXG4gKiBUbyBpc3N1ZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgZXZlbnRzIChlLmcuIHZpYSBpbnN0cnVtZW50YXRpb24pLCB1c2VcbiAqIHtAbGluayBDbGllbnQuY2FwdHVyZUV2ZW50fS4gSXQgd2lsbCBwcmVwYXJlIHRoZSBldmVudCBhbmQgcGFzcyBpdCB0aHJvdWdoXG4gKiB0aGUgY2FsbGJhY2sgbGlmZWN5Y2xlLiBUbyBpc3N1ZSBhdXRvLWJyZWFkY3J1bWJzLCB1c2VcbiAqIHtAbGluayBDbGllbnQuYWRkQnJlYWRjcnVtYn0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIE5vZGVDbGllbnQgZXh0ZW5kcyBCYXNlQ2xpZW50PE5vZGVCYWNrZW5kLCBOb2RlT3B0aW9ucz4ge1xuICogICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogTm9kZU9wdGlvbnMpIHtcbiAqICAgICBzdXBlcihOb2RlQmFja2VuZCwgb3B0aW9ucyk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIC4uLlxuICogfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNsaWVudDxCIGV4dGVuZHMgQmFja2VuZCwgTyBleHRlbmRzIE9wdGlvbnM+IGltcGxlbWVudHMgQ2xpZW50PE8+IHtcbiAgLyoqXG4gICAqIFRoZSBiYWNrZW5kIHVzZWQgdG8gcGh5c2ljYWxseSBpbnRlcmFjdCBpbiB0aGUgZW52aXJvbm1lbnQuIFVzdWFsbHksIHRoaXNcbiAgICogd2lsbCBjb3JyZXNwb25kIHRvIHRoZSBjbGllbnQuIFdoZW4gY29tcG9zaW5nIFNES3MsIGhvd2V2ZXIsIHRoZSBCYWNrZW5kXG4gICAqIGZyb20gdGhlIHJvb3QgU0RLIHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfYmFja2VuZDogQjtcblxuICAvKiogT3B0aW9ucyBwYXNzZWQgdG8gdGhlIFNESy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9vcHRpb25zOiBPO1xuXG4gIC8qKiBUaGUgY2xpZW50IERzbiwgaWYgc3BlY2lmaWVkIGluIG9wdGlvbnMuIFdpdGhvdXQgdGhpcyBEc24sIHRoZSBTREsgd2lsbCBiZSBkaXNhYmxlZC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kc24/OiBEc247XG5cbiAgLyoqIEFycmF5IG9mIHVzZWQgaW50ZWdyYXRpb25zLiAqL1xuICBwcm90ZWN0ZWQgX2ludGVncmF0aW9uczogSW50ZWdyYXRpb25JbmRleCA9IHt9O1xuXG4gIC8qKiBOdW1iZXIgb2YgY2FsbHMgYmVpbmcgcHJvY2Vzc2VkICovXG4gIHByb3RlY3RlZCBfbnVtUHJvY2Vzc2luZzogbnVtYmVyID0gMDtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhpcyBjbGllbnQgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBiYWNrZW5kQ2xhc3MgQSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIGJhY2tlbmQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgZm9yIHRoZSBjbGllbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYmFja2VuZENsYXNzOiBCYWNrZW5kQ2xhc3M8QiwgTz4sIG9wdGlvbnM6IE8pIHtcbiAgICB0aGlzLl9iYWNrZW5kID0gbmV3IGJhY2tlbmRDbGFzcyhvcHRpb25zKTtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcblxuICAgIGlmIChvcHRpb25zLmRzbikge1xuICAgICAgdGhpcy5fZHNuID0gbmV3IERzbihvcHRpb25zLmRzbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICBwdWJsaWMgY2FwdHVyZUV4Y2VwdGlvbihleGNlcHRpb246IGFueSwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gZW5zdXJlIHdlIGhhdmVuJ3QgY2FwdHVyZWQgdGhpcyB2ZXJ5IG9iamVjdCBiZWZvcmVcbiAgICBpZiAoY2hlY2tPclNldEFscmVhZHlDYXVnaHQoZXhjZXB0aW9uKSkge1xuICAgICAgbG9nZ2VyLmxvZyhBTFJFQURZX1NFRU5fRVJST1IpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBldmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBoaW50ICYmIGhpbnQuZXZlbnRfaWQ7XG5cbiAgICB0aGlzLl9wcm9jZXNzKFxuICAgICAgdGhpcy5fZ2V0QmFja2VuZCgpXG4gICAgICAgIC5ldmVudEZyb21FeGNlcHRpb24oZXhjZXB0aW9uLCBoaW50KVxuICAgICAgICAudGhlbihldmVudCA9PiB0aGlzLl9jYXB0dXJlRXZlbnQoZXZlbnQsIGhpbnQsIHNjb3BlKSlcbiAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgICBldmVudElkID0gcmVzdWx0O1xuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV2ZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjYXB0dXJlTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIGxldmVsPzogU2V2ZXJpdHksIGhpbnQ/OiBFdmVudEhpbnQsIHNjb3BlPzogU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGxldCBldmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBoaW50ICYmIGhpbnQuZXZlbnRfaWQ7XG5cbiAgICBjb25zdCBwcm9taXNlZEV2ZW50ID0gaXNQcmltaXRpdmUobWVzc2FnZSlcbiAgICAgID8gdGhpcy5fZ2V0QmFja2VuZCgpLmV2ZW50RnJvbU1lc3NhZ2UoU3RyaW5nKG1lc3NhZ2UpLCBsZXZlbCwgaGludClcbiAgICAgIDogdGhpcy5fZ2V0QmFja2VuZCgpLmV2ZW50RnJvbUV4Y2VwdGlvbihtZXNzYWdlLCBoaW50KTtcblxuICAgIHRoaXMuX3Byb2Nlc3MoXG4gICAgICBwcm9taXNlZEV2ZW50XG4gICAgICAgIC50aGVuKGV2ZW50ID0+IHRoaXMuX2NhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGV2ZW50SWQgPSByZXN1bHQ7XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNhcHR1cmVFdmVudChldmVudDogRXZlbnQsIGhpbnQ/OiBFdmVudEhpbnQsIHNjb3BlPzogU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIGVuc3VyZSB3ZSBoYXZlbid0IGNhcHR1cmVkIHRoaXMgdmVyeSBvYmplY3QgYmVmb3JlXG4gICAgaWYgKGhpbnQ/Lm9yaWdpbmFsRXhjZXB0aW9uICYmIGNoZWNrT3JTZXRBbHJlYWR5Q2F1Z2h0KGhpbnQub3JpZ2luYWxFeGNlcHRpb24pKSB7XG4gICAgICBsb2dnZXIubG9nKEFMUkVBRFlfU0VFTl9FUlJPUik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGV2ZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcblxuICAgIHRoaXMuX3Byb2Nlc3MoXG4gICAgICB0aGlzLl9jYXB0dXJlRXZlbnQoZXZlbnQsIGhpbnQsIHNjb3BlKS50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgIGV2ZW50SWQgPSByZXN1bHQ7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGV2ZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjYXB0dXJlU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQoKSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ1NESyBub3QgZW5hYmxlZCwgd2lsbCBub3QgY2FwdHVyZSBzZXNzaW9uLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghKHR5cGVvZiBzZXNzaW9uLnJlbGVhc2UgPT09ICdzdHJpbmcnKSkge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Rpc2NhcmRlZCBzZXNzaW9uIGJlY2F1c2Ugb2YgbWlzc2luZyBvciBub24tc3RyaW5nIHJlbGVhc2UnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2VuZFNlc3Npb24oc2Vzc2lvbik7XG4gICAgICAvLyBBZnRlciBzZW5kaW5nLCB3ZSBzZXQgaW5pdCBmYWxzZSB0byBpbmRpY2F0ZSBpdCdzIG5vdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZVxuICAgICAgc2Vzc2lvbi51cGRhdGUoeyBpbml0OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXREc24oKTogRHNuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZHNuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0T3B0aW9ucygpOiBPIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldFRyYW5zcG9ydCgpOiBUcmFuc3BvcnQge1xuICAgIHJldHVybiB0aGlzLl9nZXRCYWNrZW5kKCkuZ2V0VHJhbnNwb3J0KCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBmbHVzaCh0aW1lb3V0PzogbnVtYmVyKTogUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLl9pc0NsaWVudERvbmVQcm9jZXNzaW5nKHRpbWVvdXQpLnRoZW4oY2xpZW50RmluaXNoZWQgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VHJhbnNwb3J0KClcbiAgICAgICAgLmNsb3NlKHRpbWVvdXQpXG4gICAgICAgIC50aGVuKHRyYW5zcG9ydEZsdXNoZWQgPT4gY2xpZW50RmluaXNoZWQgJiYgdHJhbnNwb3J0Rmx1c2hlZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjbG9zZSh0aW1lb3V0PzogbnVtYmVyKTogUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmZsdXNoKHRpbWVvdXQpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgIHRoaXMuZ2V0T3B0aW9ucygpLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgaW50ZWdyYXRpb25zXG4gICAqL1xuICBwdWJsaWMgc2V0dXBJbnRlZ3JhdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzRW5hYmxlZCgpICYmICF0aGlzLl9pbnRlZ3JhdGlvbnMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX2ludGVncmF0aW9ucyA9IHNldHVwSW50ZWdyYXRpb25zKHRoaXMuX29wdGlvbnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldEludGVncmF0aW9uPFQgZXh0ZW5kcyBJbnRlZ3JhdGlvbj4oaW50ZWdyYXRpb246IEludGVncmF0aW9uQ2xhc3M8VD4pOiBUIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAodGhpcy5faW50ZWdyYXRpb25zW2ludGVncmF0aW9uLmlkXSBhcyBUKSB8fCBudWxsO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgbG9nZ2VyLndhcm4oYENhbm5vdCByZXRyaWV2ZSBpbnRlZ3JhdGlvbiAke2ludGVncmF0aW9uLmlkfSBmcm9tIHRoZSBjdXJyZW50IENsaWVudGApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFVwZGF0ZXMgZXhpc3Rpbmcgc2Vzc2lvbiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgZXZlbnQgKi9cbiAgcHJvdGVjdGVkIF91cGRhdGVTZXNzaW9uRnJvbUV2ZW50KHNlc3Npb246IFNlc3Npb24sIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGxldCBjcmFzaGVkID0gZmFsc2U7XG4gICAgbGV0IGVycm9yZWQgPSBmYWxzZTtcbiAgICBjb25zdCBleGNlcHRpb25zID0gZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXM7XG5cbiAgICBpZiAoZXhjZXB0aW9ucykge1xuICAgICAgZXJyb3JlZCA9IHRydWU7XG5cbiAgICAgIGZvciAoY29uc3QgZXggb2YgZXhjZXB0aW9ucykge1xuICAgICAgICBjb25zdCBtZWNoYW5pc20gPSBleC5tZWNoYW5pc207XG4gICAgICAgIGlmIChtZWNoYW5pc20gJiYgbWVjaGFuaXNtLmhhbmRsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgY3Jhc2hlZCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBIHNlc3Npb24gaXMgdXBkYXRlZCBhbmQgdGhhdCBzZXNzaW9uIHVwZGF0ZSBpcyBzZW50IGluIG9ubHkgb25lIG9mIHRoZSB0d28gZm9sbG93aW5nIHNjZW5hcmlvczpcbiAgICAvLyAxLiBTZXNzaW9uIHdpdGggbm9uIHRlcm1pbmFsIHN0YXR1cyBhbmQgMCBlcnJvcnMgKyBhbiBlcnJvciBvY2N1cnJlZCAtPiBXaWxsIHNldCBlcnJvciBjb3VudCB0byAxIGFuZCBzZW5kIHVwZGF0ZVxuICAgIC8vIDIuIFNlc3Npb24gd2l0aCBub24gdGVybWluYWwgc3RhdHVzIGFuZCAxIGVycm9yICsgYSBjcmFzaCBvY2N1cnJlZCAtPiBXaWxsIHNldCBzdGF0dXMgY3Jhc2hlZCBhbmQgc2VuZCB1cGRhdGVcbiAgICBjb25zdCBzZXNzaW9uTm9uVGVybWluYWwgPSBzZXNzaW9uLnN0YXR1cyA9PT0gU2Vzc2lvblN0YXR1cy5PaztcbiAgICBjb25zdCBzaG91bGRVcGRhdGVBbmRTZW5kID0gKHNlc3Npb25Ob25UZXJtaW5hbCAmJiBzZXNzaW9uLmVycm9ycyA9PT0gMCkgfHwgKHNlc3Npb25Ob25UZXJtaW5hbCAmJiBjcmFzaGVkKTtcblxuICAgIGlmIChzaG91bGRVcGRhdGVBbmRTZW5kKSB7XG4gICAgICBzZXNzaW9uLnVwZGF0ZSh7XG4gICAgICAgIC4uLihjcmFzaGVkICYmIHsgc3RhdHVzOiBTZXNzaW9uU3RhdHVzLkNyYXNoZWQgfSksXG4gICAgICAgIGVycm9yczogc2Vzc2lvbi5lcnJvcnMgfHwgTnVtYmVyKGVycm9yZWQgfHwgY3Jhc2hlZCksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuY2FwdHVyZVNlc3Npb24oc2Vzc2lvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqIERlbGl2ZXIgY2FwdHVyZWQgc2Vzc2lvbiB0byBTZW50cnkgKi9cbiAgcHJvdGVjdGVkIF9zZW5kU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uKTogdm9pZCB7XG4gICAgdGhpcy5fZ2V0QmFja2VuZCgpLnNlbmRTZXNzaW9uKHNlc3Npb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiB0aGUgY2xpZW50IGlzIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFJldHVybnMgYSBwcm9taXNlIGJlY2F1c2UgaXQgd2lsbCB3YWl0IGB0aW1lb3V0YCBtcyBiZWZvcmUgc2F5aW5nXG4gICAqIFwibm9cIiAocmVzb2x2aW5nIHRvIGBmYWxzZWApIGluIG9yZGVyIHRvIGdpdmUgdGhlIGNsaWVudCBhIGNoYW5jZSB0byBwb3RlbnRpYWxseSBmaW5pc2ggZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSB0aW1lb3V0IFRoZSB0aW1lLCBpbiBtcywgYWZ0ZXIgd2hpY2ggdG8gcmVzb2x2ZSB0byBgZmFsc2VgIGlmIHRoZSBjbGllbnQgaXMgc3RpbGwgYnVzeS4gUGFzc2luZyBgMGAgKG9yIG5vdFxuICAgKiBwYXNzaW5nIGFueXRoaW5nKSB3aWxsIG1ha2UgdGhlIHByb21pc2Ugd2FpdCBhcyBsb25nIGFzIGl0IHRha2VzIGZvciBwcm9jZXNzaW5nIHRvIGZpbmlzaCBiZWZvcmUgcmVzb2x2aW5nIHRvXG4gICAqIGB0cnVlYC5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHdpbGwgcmVzb2x2ZSB0byBgdHJ1ZWAgaWYgcHJvY2Vzc2luZyBpcyBhbHJlYWR5IGRvbmUgb3IgZmluaXNoZXMgYmVmb3JlIHRoZSB0aW1lb3V0LCBhbmRcbiAgICogYGZhbHNlYCBvdGhlcndpc2VcbiAgICovXG4gIHByb3RlY3RlZCBfaXNDbGllbnREb25lUHJvY2Vzc2luZyh0aW1lb3V0PzogbnVtYmVyKTogUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBsZXQgdGlja2VkOiBudW1iZXIgPSAwO1xuICAgICAgY29uc3QgdGljazogbnVtYmVyID0gMTtcblxuICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9udW1Qcm9jZXNzaW5nID09IDApIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRpY2tlZCArPSB0aWNrO1xuICAgICAgICAgIGlmICh0aW1lb3V0ICYmIHRpY2tlZCA+PSB0aW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgdGljayk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgY3VycmVudCBiYWNrZW5kLiAqL1xuICBwcm90ZWN0ZWQgX2dldEJhY2tlbmQoKTogQiB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tlbmQ7XG4gIH1cblxuICAvKiogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgU0RLIGlzIGVuYWJsZWQgYW5kIGEgdmFsaWQgRHNuIGlzIHByZXNlbnQuICovXG4gIHByb3RlY3RlZCBfaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldE9wdGlvbnMoKS5lbmFibGVkICE9PSBmYWxzZSAmJiB0aGlzLl9kc24gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGNvbW1vbiBpbmZvcm1hdGlvbiB0byBldmVudHMuXG4gICAqXG4gICAqIFRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlcyByZWxlYXNlIGFuZCBlbnZpcm9ubWVudCBmcm9tIGBvcHRpb25zYCxcbiAgICogYnJlYWRjcnVtYnMgYW5kIGNvbnRleHQgKGV4dHJhLCB0YWdzIGFuZCB1c2VyKSBmcm9tIHRoZSBzY29wZS5cbiAgICpcbiAgICogSW5mb3JtYXRpb24gdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGV2ZW50IGlzIG5ldmVyIG92ZXJ3cml0dGVuLiBGb3JcbiAgICogbmVzdGVkIG9iamVjdHMsIHN1Y2ggYXMgdGhlIGNvbnRleHQsIGtleXMgYXJlIG1lcmdlZC5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBvcmlnaW5hbCBldmVudC5cbiAgICogQHBhcmFtIGhpbnQgTWF5IGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLlxuICAgKiBAcGFyYW0gc2NvcGUgQSBzY29wZSBjb250YWluaW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyBBIG5ldyBldmVudCB3aXRoIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgX3ByZXBhcmVFdmVudChldmVudDogRXZlbnQsIHNjb3BlPzogU2NvcGUsIGhpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+IHtcbiAgICBjb25zdCB7IG5vcm1hbGl6ZURlcHRoID0gMyB9ID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgY29uc3QgcHJlcGFyZWQ6IEV2ZW50ID0ge1xuICAgICAgLi4uZXZlbnQsXG4gICAgICBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQgfHwgKGhpbnQgJiYgaGludC5ldmVudF9pZCA/IGhpbnQuZXZlbnRfaWQgOiB1dWlkNCgpKSxcbiAgICAgIHRpbWVzdGFtcDogZXZlbnQudGltZXN0YW1wIHx8IGRhdGVUaW1lc3RhbXBJblNlY29uZHMoKSxcbiAgICB9O1xuXG4gICAgdGhpcy5fYXBwbHlDbGllbnRPcHRpb25zKHByZXBhcmVkKTtcbiAgICB0aGlzLl9hcHBseUludGVncmF0aW9uc01ldGFkYXRhKHByZXBhcmVkKTtcblxuICAgIC8vIElmIHdlIGhhdmUgc2NvcGUgZ2l2ZW4gdG8gdXMsIHVzZSBpdCBhcyB0aGUgYmFzZSBmb3IgZnVydGhlciBtb2RpZmljYXRpb25zLlxuICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgY29weWluZyBvZiBkYXRhIGlmIGBjYXB0dXJlQ29udGV4dGAgaXMgbm90IHByb3ZpZGVkLlxuICAgIGxldCBmaW5hbFNjb3BlID0gc2NvcGU7XG4gICAgaWYgKGhpbnQgJiYgaGludC5jYXB0dXJlQ29udGV4dCkge1xuICAgICAgZmluYWxTY29wZSA9IFNjb3BlLmNsb25lKGZpbmFsU2NvcGUpLnVwZGF0ZShoaW50LmNhcHR1cmVDb250ZXh0KTtcbiAgICB9XG5cbiAgICAvLyBXZSBwcmVwYXJlIHRoZSByZXN1bHQgaGVyZSB3aXRoIGEgcmVzb2x2ZWQgRXZlbnQuXG4gICAgbGV0IHJlc3VsdCA9IFN5bmNQcm9taXNlLnJlc29sdmU8RXZlbnQgfCBudWxsPihwcmVwYXJlZCk7XG5cbiAgICAvLyBUaGlzIHNob3VsZCBiZSB0aGUgbGFzdCB0aGluZyBjYWxsZWQsIHNpbmNlIHdlIHdhbnQgdGhhdFxuICAgIC8vIHtAbGluayBIdWIuYWRkRXZlbnRQcm9jZXNzb3J9IGdldHMgdGhlIGZpbmlzaGVkIHByZXBhcmVkIGV2ZW50LlxuICAgIGlmIChmaW5hbFNjb3BlKSB7XG4gICAgICAvLyBJbiBjYXNlIHdlIGhhdmUgYSBodWIgd2UgcmVhc3NpZ24gaXQuXG4gICAgICByZXN1bHQgPSBmaW5hbFNjb3BlLmFwcGx5VG9FdmVudChwcmVwYXJlZCwgaGludCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdC50aGVuKGV2dCA9PiB7XG4gICAgICBpZiAodHlwZW9mIG5vcm1hbGl6ZURlcHRoID09PSAnbnVtYmVyJyAmJiBub3JtYWxpemVEZXB0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25vcm1hbGl6ZUV2ZW50KGV2dCwgbm9ybWFsaXplRGVwdGgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2dDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGBub3JtYWxpemVgIGZ1bmN0aW9uIG9uIG5lY2Vzc2FyeSBgRXZlbnRgIGF0dHJpYnV0ZXMgdG8gbWFrZSB0aGVtIHNhZmUgZm9yIHNlcmlhbGl6YXRpb24uXG4gICAqIE5vcm1hbGl6ZWQga2V5czpcbiAgICogLSBgYnJlYWRjcnVtYnMuZGF0YWBcbiAgICogLSBgdXNlcmBcbiAgICogLSBgY29udGV4dHNgXG4gICAqIC0gYGV4dHJhYFxuICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRcbiAgICogQHJldHVybnMgTm9ybWFsaXplZCBldmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIF9ub3JtYWxpemVFdmVudChldmVudDogRXZlbnQgfCBudWxsLCBkZXB0aDogbnVtYmVyKTogRXZlbnQgfCBudWxsIHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkID0ge1xuICAgICAgLi4uZXZlbnQsXG4gICAgICAuLi4oZXZlbnQuYnJlYWRjcnVtYnMgJiYge1xuICAgICAgICBicmVhZGNydW1iczogZXZlbnQuYnJlYWRjcnVtYnMubWFwKGIgPT4gKHtcbiAgICAgICAgICAuLi5iLFxuICAgICAgICAgIC4uLihiLmRhdGEgJiYge1xuICAgICAgICAgICAgZGF0YTogbm9ybWFsaXplKGIuZGF0YSwgZGVwdGgpLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KSksXG4gICAgICB9KSxcbiAgICAgIC4uLihldmVudC51c2VyICYmIHtcbiAgICAgICAgdXNlcjogbm9ybWFsaXplKGV2ZW50LnVzZXIsIGRlcHRoKSxcbiAgICAgIH0pLFxuICAgICAgLi4uKGV2ZW50LmNvbnRleHRzICYmIHtcbiAgICAgICAgY29udGV4dHM6IG5vcm1hbGl6ZShldmVudC5jb250ZXh0cywgZGVwdGgpLFxuICAgICAgfSksXG4gICAgICAuLi4oZXZlbnQuZXh0cmEgJiYge1xuICAgICAgICBleHRyYTogbm9ybWFsaXplKGV2ZW50LmV4dHJhLCBkZXB0aCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIC8vIGV2ZW50LmNvbnRleHRzLnRyYWNlIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBhIFRyYW5zYWN0aW9uLiBTaW1pbGFybHksXG4gICAgLy8gZXZlbnQuc3BhbnNbXSBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgY2hpbGQgU3BhbnMuIEdpdmVuIHRoYXQgYVxuICAgIC8vIFRyYW5zYWN0aW9uIGlzIGNvbmNlcHR1YWxseSBhIFNwYW4sIG5vcm1hbGl6YXRpb24gc2hvdWxkIGFwcGx5IHRvIGJvdGhcbiAgICAvLyBUcmFuc2FjdGlvbnMgYW5kIFNwYW5zIGNvbnNpc3RlbnRseS5cbiAgICAvLyBGb3Igbm93IHRoZSBkZWNpc2lvbiBpcyB0byBza2lwIG5vcm1hbGl6YXRpb24gb2YgVHJhbnNhY3Rpb25zIGFuZCBTcGFucyxcbiAgICAvLyBzbyB0aGlzIGJsb2NrIG92ZXJ3cml0ZXMgdGhlIG5vcm1hbGl6ZWQgZXZlbnQgdG8gYWRkIGJhY2sgdGhlIG9yaWdpbmFsXG4gICAgLy8gVHJhbnNhY3Rpb24gaW5mb3JtYXRpb24gcHJpb3IgdG8gbm9ybWFsaXphdGlvbi5cbiAgICBpZiAoZXZlbnQuY29udGV4dHMgJiYgZXZlbnQuY29udGV4dHMudHJhY2UpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIG5vcm1hbGl6ZWQuY29udGV4dHMudHJhY2UgPSBldmVudC5jb250ZXh0cy50cmFjZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IF9leHBlcmltZW50cyA9IHt9IH0gPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICBpZiAoX2V4cGVyaW1lbnRzLmVuc3VyZU5vQ2lyY3VsYXJTdHJ1Y3R1cmVzKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplKG5vcm1hbGl6ZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgLyoqXG4gICAqICBFbmhhbmNlcyBldmVudCB1c2luZyB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24uXG4gICAqICBJdCB0YWtlcyBjYXJlIG9mIGFsbCBcInN0YXRpY1wiIHZhbHVlcyBsaWtlIGVudmlyb25tZW50LCByZWxlYXNlIGFuZCBgZGlzdGAsXG4gICAqICBhcyB3ZWxsIGFzIHRydW5jYXRpbmcgb3Zlcmx5IGxvbmcgdmFsdWVzLlxuICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgaW5zdGFuY2UgdG8gYmUgZW5oYW5jZWRcbiAgICovXG4gIHByb3RlY3RlZCBfYXBwbHlDbGllbnRPcHRpb25zKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICBjb25zdCB7IGVudmlyb25tZW50LCByZWxlYXNlLCBkaXN0LCBtYXhWYWx1ZUxlbmd0aCA9IDI1MCB9ID0gb3B0aW9ucztcblxuICAgIGlmICghKCdlbnZpcm9ubWVudCcgaW4gZXZlbnQpKSB7XG4gICAgICBldmVudC5lbnZpcm9ubWVudCA9ICdlbnZpcm9ubWVudCcgaW4gb3B0aW9ucyA/IGVudmlyb25tZW50IDogJ3Byb2R1Y3Rpb24nO1xuICAgIH1cblxuICAgIGlmIChldmVudC5yZWxlYXNlID09PSB1bmRlZmluZWQgJiYgcmVsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBldmVudC5yZWxlYXNlID0gcmVsZWFzZTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQuZGlzdCA9PT0gdW5kZWZpbmVkICYmIGRpc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXZlbnQuZGlzdCA9IGRpc3Q7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50Lm1lc3NhZ2UpIHtcbiAgICAgIGV2ZW50Lm1lc3NhZ2UgPSB0cnVuY2F0ZShldmVudC5tZXNzYWdlLCBtYXhWYWx1ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXTtcbiAgICBpZiAoZXhjZXB0aW9uICYmIGV4Y2VwdGlvbi52YWx1ZSkge1xuICAgICAgZXhjZXB0aW9uLnZhbHVlID0gdHJ1bmNhdGUoZXhjZXB0aW9uLnZhbHVlLCBtYXhWYWx1ZUxlbmd0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IGV2ZW50LnJlcXVlc3Q7XG4gICAgaWYgKHJlcXVlc3QgJiYgcmVxdWVzdC51cmwpIHtcbiAgICAgIHJlcXVlc3QudXJsID0gdHJ1bmNhdGUocmVxdWVzdC51cmwsIG1heFZhbHVlTGVuZ3RoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiBhZGRzIGFsbCB1c2VkIGludGVncmF0aW9ucyB0byB0aGUgU0RLIGluZm8gaW4gdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgd2lsbCBiZSBmaWxsZWQgd2l0aCBhbGwgaW50ZWdyYXRpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9hcHBseUludGVncmF0aW9uc01ldGFkYXRhKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGludGVncmF0aW9uc0FycmF5ID0gT2JqZWN0LmtleXModGhpcy5faW50ZWdyYXRpb25zKTtcbiAgICBpZiAoaW50ZWdyYXRpb25zQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgZXZlbnQuc2RrID0gZXZlbnQuc2RrIHx8IHt9O1xuICAgICAgZXZlbnQuc2RrLmludGVncmF0aW9ucyA9IFsuLi4oZXZlbnQuc2RrLmludGVncmF0aW9ucyB8fCBbXSksIC4uLmludGVncmF0aW9uc0FycmF5XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGVsbHMgdGhlIGJhY2tlbmQgdG8gc2VuZCB0aGlzIGV2ZW50XG4gICAqIEBwYXJhbSBldmVudCBUaGUgU2VudHJ5IGV2ZW50IHRvIHNlbmRcbiAgICovXG4gIHByb3RlY3RlZCBfc2VuZEV2ZW50KGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuX2dldEJhY2tlbmQoKS5zZW5kRXZlbnQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb2Nlc3NlcyB0aGUgZXZlbnQgYW5kIGxvZ3MgYW4gZXJyb3IgaW4gY2FzZSBvZiByZWplY3Rpb25cbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSBoaW50XG4gICAqIEBwYXJhbSBzY29wZVxuICAgKi9cbiAgcHJvdGVjdGVkIF9jYXB0dXJlRXZlbnQoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50LCBzY29wZT86IFNjb3BlKTogUHJvbWlzZUxpa2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NFdmVudChldmVudCwgaGludCwgc2NvcGUpLnRoZW4oXG4gICAgICBmaW5hbEV2ZW50ID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbmFsRXZlbnQuZXZlbnRfaWQ7XG4gICAgICB9LFxuICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKHJlYXNvbik7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIGFuIGV2ZW50IChlaXRoZXIgZXJyb3Igb3IgbWVzc2FnZSkgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAgICpcbiAgICogVGhpcyBhbHNvIGFkZHMgYnJlYWRjcnVtYnMgYW5kIGNvbnRleHQgaW5mb3JtYXRpb24gdG8gdGhlIGV2ZW50LiBIb3dldmVyLFxuICAgKiBwbGF0Zm9ybSBzcGVjaWZpYyBtZXRhIGRhdGEgKHN1Y2ggYXMgdGhlIFVzZXIncyBJUCBhZGRyZXNzKSBtdXN0IGJlIGFkZGVkXG4gICAqIGJ5IHRoZSBTREsgaW1wbGVtZW50b3IuXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBTZW50cnkuXG4gICAqIEBwYXJhbSBoaW50IE1heSBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbi5cbiAgICogQHBhcmFtIHNjb3BlIEEgc2NvcGUgY29udGFpbmluZyBldmVudCBtZXRhZGF0YS5cbiAgICogQHJldHVybnMgQSBTeW5jUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGV2ZW50IG9yIHJlamVjdHMgaW4gY2FzZSBldmVudCB3YXMvd2lsbCBub3QgYmUgc2VuZC5cbiAgICovXG4gIHByb3RlY3RlZCBfcHJvY2Vzc0V2ZW50KGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IFByb21pc2VMaWtlPEV2ZW50PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgIGNvbnN0IHsgYmVmb3JlU2VuZCwgc2FtcGxlUmF0ZSB9ID0gdGhpcy5nZXRPcHRpb25zKCk7XG4gICAgY29uc3QgdHJhbnNwb3J0ID0gdGhpcy5nZXRUcmFuc3BvcnQoKTtcblxuICAgIGlmICghdGhpcy5faXNFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QobmV3IFNlbnRyeUVycm9yKCdTREsgbm90IGVuYWJsZWQsIHdpbGwgbm90IGNhcHR1cmUgZXZlbnQuJykpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzVHJhbnNhY3Rpb24gPSBldmVudC50eXBlID09PSAndHJhbnNhY3Rpb24nO1xuICAgIC8vIDEuMCA9PT0gMTAwJSBldmVudHMgYXJlIHNlbnRcbiAgICAvLyAwLjAgPT09IDAlIGV2ZW50cyBhcmUgc2VudFxuICAgIC8vIFNhbXBsaW5nIGZvciB0cmFuc2FjdGlvbiBoYXBwZW5zIHNvbWV3aGVyZSBlbHNlXG4gICAgaWYgKCFpc1RyYW5zYWN0aW9uICYmIHR5cGVvZiBzYW1wbGVSYXRlID09PSAnbnVtYmVyJyAmJiBNYXRoLnJhbmRvbSgpID4gc2FtcGxlUmF0ZSkge1xuICAgICAgdHJhbnNwb3J0LnJlY29yZExvc3RFdmVudD8uKE91dGNvbWUuU2FtcGxlUmF0ZSwgJ2V2ZW50Jyk7XG4gICAgICByZXR1cm4gU3luY1Byb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgU2VudHJ5RXJyb3IoXG4gICAgICAgICAgYERpc2NhcmRpbmcgZXZlbnQgYmVjYXVzZSBpdCdzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZG9tIHNhbXBsZSAoc2FtcGxpbmcgcmF0ZSA9ICR7c2FtcGxlUmF0ZX0pYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVFdmVudChldmVudCwgc2NvcGUsIGhpbnQpXG4gICAgICAudGhlbihwcmVwYXJlZCA9PiB7XG4gICAgICAgIGlmIChwcmVwYXJlZCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRyYW5zcG9ydC5yZWNvcmRMb3N0RXZlbnQ/LihPdXRjb21lLkV2ZW50UHJvY2Vzc29yLCBldmVudC50eXBlIHx8ICdldmVudCcpO1xuICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQW4gZXZlbnQgcHJvY2Vzc29yIHJldHVybmVkIG51bGwsIHdpbGwgbm90IHNlbmQgZXZlbnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0ludGVybmFsRXhjZXB0aW9uID0gaGludCAmJiBoaW50LmRhdGEgJiYgKGhpbnQuZGF0YSBhcyB7IF9fc2VudHJ5X186IGJvb2xlYW4gfSkuX19zZW50cnlfXyA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKGlzSW50ZXJuYWxFeGNlcHRpb24gfHwgaXNUcmFuc2FjdGlvbiB8fCAhYmVmb3JlU2VuZCkge1xuICAgICAgICAgIHJldHVybiBwcmVwYXJlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJlZm9yZVNlbmRSZXN1bHQgPSBiZWZvcmVTZW5kKHByZXBhcmVkLCBoaW50KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vuc3VyZUJlZm9yZVNlbmRSdihiZWZvcmVTZW5kUmVzdWx0KTtcbiAgICAgIH0pXG4gICAgICAudGhlbihwcm9jZXNzZWRFdmVudCA9PiB7XG4gICAgICAgIGlmIChwcm9jZXNzZWRFdmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIHRyYW5zcG9ydC5yZWNvcmRMb3N0RXZlbnQ/LihPdXRjb21lLkJlZm9yZVNlbmQsIGV2ZW50LnR5cGUgfHwgJ2V2ZW50Jyk7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKCdgYmVmb3JlU2VuZGAgcmV0dXJuZWQgYG51bGxgLCB3aWxsIG5vdCBzZW5kIGV2ZW50LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHNjb3BlICYmIHNjb3BlLmdldFNlc3Npb24gJiYgc2NvcGUuZ2V0U2Vzc2lvbigpO1xuICAgICAgICBpZiAoIWlzVHJhbnNhY3Rpb24gJiYgc2Vzc2lvbikge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZVNlc3Npb25Gcm9tRXZlbnQoc2Vzc2lvbiwgcHJvY2Vzc2VkRXZlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2VuZEV2ZW50KHByb2Nlc3NlZEV2ZW50KTtcbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZEV2ZW50O1xuICAgICAgfSlcbiAgICAgIC50aGVuKG51bGwsIHJlYXNvbiA9PiB7XG4gICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBTZW50cnlFcnJvcikge1xuICAgICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FwdHVyZUV4Y2VwdGlvbihyZWFzb24sIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBfX3NlbnRyeV9fOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IHJlYXNvbiBhcyBFcnJvcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihcbiAgICAgICAgICBgRXZlbnQgcHJvY2Vzc2luZyBwaXBlbGluZSB0aHJldyBhbiBlcnJvciwgb3JpZ2luYWwgZXZlbnQgd2lsbCBub3QgYmUgc2VudC4gRGV0YWlscyBoYXZlIGJlZW4gc2VudCBhcyBhIG5ldyBldmVudC5cXG5SZWFzb246ICR7cmVhc29ufWAsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPY2N1cGllcyB0aGUgY2xpZW50IHdpdGggcHJvY2Vzc2luZyBhbmQgZXZlbnRcbiAgICovXG4gIHByb3RlY3RlZCBfcHJvY2VzczxUPihwcm9taXNlOiBQcm9taXNlTGlrZTxUPik6IHZvaWQge1xuICAgIHRoaXMuX251bVByb2Nlc3NpbmcgKz0gMTtcbiAgICB2b2lkIHByb21pc2UudGhlbihcbiAgICAgIHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy5fbnVtUHJvY2Vzc2luZyAtPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9LFxuICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgdGhpcy5fbnVtUHJvY2Vzc2luZyAtPSAxO1xuICAgICAgICByZXR1cm4gcmVhc29uO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgcmV0dXJuIHZhbHVlIG9mIGNvbmZpZ3VyZWQgYGJlZm9yZVNlbmRgIGlzIG9mIGV4cGVjdGVkIHR5cGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2Vuc3VyZUJlZm9yZVNlbmRSdihcbiAgICBydjogUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPiB8IEV2ZW50IHwgbnVsbCxcbiAgKTogUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPiB8IEV2ZW50IHwgbnVsbCB7XG4gICAgY29uc3QgbnVsbEVyciA9ICdgYmVmb3JlU2VuZGAgbWV0aG9kIGhhcyB0byByZXR1cm4gYG51bGxgIG9yIGEgdmFsaWQgZXZlbnQuJztcbiAgICBpZiAoaXNUaGVuYWJsZShydikpIHtcbiAgICAgIHJldHVybiAocnYgYXMgUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPikudGhlbihcbiAgICAgICAgZXZlbnQgPT4ge1xuICAgICAgICAgIGlmICghKGlzUGxhaW5PYmplY3QoZXZlbnQpIHx8IGV2ZW50ID09PSBudWxsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKG51bGxFcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGUgPT4ge1xuICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcihgYmVmb3JlU2VuZCByZWplY3RlZCB3aXRoICR7ZX1gKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmICghKGlzUGxhaW5PYmplY3QocnYpIHx8IHJ2ID09PSBudWxsKSkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKG51bGxFcnIpO1xuICAgIH1cbiAgICByZXR1cm4gcnY7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgUmVzcG9uc2UsIFN0YXR1cywgVHJhbnNwb3J0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBTeW5jUHJvbWlzZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG4vKiogTm9vcCB0cmFuc3BvcnQgKi9cbmV4cG9ydCBjbGFzcyBOb29wVHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZEV2ZW50KF86IEV2ZW50KTogUHJvbWlzZUxpa2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZSh7XG4gICAgICByZWFzb246IGBOb29wVHJhbnNwb3J0OiBFdmVudCBoYXMgYmVlbiBza2lwcGVkIGJlY2F1c2Ugbm8gRHNuIGlzIGNvbmZpZ3VyZWQuYCxcbiAgICAgIHN0YXR1czogU3RhdHVzLlNraXBwZWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjbG9zZShfPzogbnVtYmVyKTogUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnQsIEV2ZW50SGludCwgT3B0aW9ucywgU2Vzc2lvbiwgU2V2ZXJpdHksIFRyYW5zcG9ydCB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyLCBTZW50cnlFcnJvciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBOb29wVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzL25vb3AnO1xuXG4vKipcbiAqIEludGVybmFsIHBsYXRmb3JtLWRlcGVuZGVudCBTZW50cnkgU0RLIEJhY2tlbmQuXG4gKlxuICogV2hpbGUge0BsaW5rIENsaWVudH0gY29udGFpbnMgYnVzaW5lc3MgbG9naWMgc3BlY2lmaWMgdG8gYW4gU0RLLCB0aGVcbiAqIEJhY2tlbmQgb2ZmZXJzIHBsYXRmb3JtIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBmb3IgbG93LWxldmVsIG9wZXJhdGlvbnMuXG4gKiBUaGVzZSBhcmUgcGVyc2lzdGluZyBhbmQgbG9hZGluZyBpbmZvcm1hdGlvbiwgc2VuZGluZyBldmVudHMsIGFuZCBob29raW5nXG4gKiBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAqXG4gKiBCYWNrZW5kcyByZWNlaXZlIGEgaGFuZGxlIHRvIHRoZSBDbGllbnQgaW4gdGhlaXIgY29uc3RydWN0b3IuIFdoZW4gYVxuICogQmFja2VuZCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBldmVudHMsIGl0IG11c3QgcGFzcyB0aGVtIHRvXG4gKiB0aGUgQ2xpZW50IGZvciB2YWxpZGF0aW9uIGFuZCBwcm9jZXNzaW5nIGZpcnN0LlxuICpcbiAqIFVzdWFsbHksIHRoZSBDbGllbnQgd2lsbCBiZSBvZiBjb3JyZXNwb25kaW5nIHR5cGUsIGUuZy4gTm9kZUJhY2tlbmRcbiAqIHJlY2VpdmVzIE5vZGVDbGllbnQuIEhvd2V2ZXIsIGhpZ2hlci1sZXZlbCBTREtzIGNhbiBjaG9vc2UgdG8gaW5zdGFudGlhdGVcbiAqIG11bHRpcGxlIEJhY2tlbmRzIGFuZCBkZWxlZ2F0ZSB0YXNrcyBiZXR3ZWVuIHRoZW0uIEluIHRoaXMgY2FzZSwgYW4gZXZlbnRcbiAqIGdlbmVyYXRlZCBieSBvbmUgYmFja2VuZCBtaWdodCB2ZXJ5IHdlbGwgYmUgc2VudCBieSBhbm90aGVyIG9uZS5cbiAqXG4gKiBUaGUgY2xpZW50IGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIG9wdGlvbnMgdmlhIHtAbGluayBDbGllbnQuZ2V0T3B0aW9uc30uXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2VuZCB7XG4gIC8qKiBDcmVhdGVzIGEge0BsaW5rIEV2ZW50fSBmcm9tIGFuIGV4Y2VwdGlvbi4gKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXZlbnRGcm9tRXhjZXB0aW9uKGV4Y2VwdGlvbjogYW55LCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQ+O1xuXG4gIC8qKiBDcmVhdGVzIGEge0BsaW5rIEV2ZW50fSBmcm9tIGEgcGxhaW4gbWVzc2FnZS4gKi9cbiAgZXZlbnRGcm9tTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIGxldmVsPzogU2V2ZXJpdHksIGhpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD47XG5cbiAgLyoqIFN1Ym1pdHMgdGhlIGV2ZW50IHRvIFNlbnRyeSAqL1xuICBzZW5kRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZDtcblxuICAvKiogU3VibWl0cyB0aGUgc2Vzc2lvbiB0byBTZW50cnkgKi9cbiAgc2VuZFNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRyYW5zcG9ydCB0aGF0IGlzIHVzZWQgYnkgdGhlIGJhY2tlbmQuXG4gICAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIHRyYW5zcG9ydCBnZXRzIGxhenkgaW5pdGlhbGl6ZWQgc28gaXQgd2lsbCBvbmx5IGJlIHRoZXJlIG9uY2UgdGhlIGZpcnN0IGV2ZW50IGhhcyBiZWVuIHNlbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSB0cmFuc3BvcnQuXG4gICAqL1xuICBnZXRUcmFuc3BvcnQoKTogVHJhbnNwb3J0O1xufVxuXG4vKipcbiAqIEEgY2xhc3Mgb2JqZWN0IHRoYXQgY2FuIGluc3RhbnRpYXRlIEJhY2tlbmQgb2JqZWN0cy5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IHR5cGUgQmFja2VuZENsYXNzPEIgZXh0ZW5kcyBCYWNrZW5kLCBPIGV4dGVuZHMgT3B0aW9ucz4gPSBuZXcgKG9wdGlvbnM6IE8pID0+IEI7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgYmFzZSBpbXBsZW1lbnRpb24gb2YgYSBCYWNrZW5kLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUJhY2tlbmQ8TyBleHRlbmRzIE9wdGlvbnM+IGltcGxlbWVudHMgQmFja2VuZCB7XG4gIC8qKiBPcHRpb25zIHBhc3NlZCB0byB0aGUgU0RLLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX29wdGlvbnM6IE87XG5cbiAgLyoqIENhY2hlZCB0cmFuc3BvcnQgdXNlZCBpbnRlcm5hbGx5LiAqL1xuICBwcm90ZWN0ZWQgX3RyYW5zcG9ydDogVHJhbnNwb3J0O1xuXG4gIC8qKiBDcmVhdGVzIGEgbmV3IGJhY2tlbmQgaW5zdGFuY2UuICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBPKSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLmRzbikge1xuICAgICAgbG9nZ2VyLndhcm4oJ05vIERTTiBwcm92aWRlZCwgYmFja2VuZCB3aWxsIG5vdCBkbyBhbnl0aGluZy4nKTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNwb3J0ID0gdGhpcy5fc2V0dXBUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgcHVibGljIGV2ZW50RnJvbUV4Y2VwdGlvbihfZXhjZXB0aW9uOiBhbnksIF9oaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ0JhY2tlbmQgaGFzIHRvIGltcGxlbWVudCBgZXZlbnRGcm9tRXhjZXB0aW9uYCBtZXRob2QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGV2ZW50RnJvbU1lc3NhZ2UoX21lc3NhZ2U6IHN0cmluZywgX2xldmVsPzogU2V2ZXJpdHksIF9oaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ0JhY2tlbmQgaGFzIHRvIGltcGxlbWVudCBgZXZlbnRGcm9tTWVzc2FnZWAgbWV0aG9kJyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLl90cmFuc3BvcnQuc2VuZEV2ZW50KGV2ZW50KS50aGVuKG51bGwsIHJlYXNvbiA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHNlbmRpbmcgZXZlbnQ6ICR7cmVhc29ufWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZFNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fdHJhbnNwb3J0LnNlbmRTZXNzaW9uKSB7XG4gICAgICBsb2dnZXIud2FybihcIkRyb3BwaW5nIHNlc3Npb24gYmVjYXVzZSBjdXN0b20gdHJhbnNwb3J0IGRvZXNuJ3QgaW1wbGVtZW50IHNlbmRTZXNzaW9uXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZvaWQgdGhpcy5fdHJhbnNwb3J0LnNlbmRTZXNzaW9uKHNlc3Npb24pLnRoZW4obnVsbCwgcmVhc29uID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgc2VuZGluZyBzZXNzaW9uOiAke3JlYXNvbn1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldFRyYW5zcG9ydCgpOiBUcmFuc3BvcnQge1xuICAgIHJldHVybiB0aGlzLl90cmFuc3BvcnQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgdHJhbnNwb3J0IHNvIGl0IGNhbiBiZSB1c2VkIGxhdGVyIHRvIHNlbmQgcmVxdWVzdHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3NldHVwVHJhbnNwb3J0KCk6IFRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIG5ldyBOb29wVHJhbnNwb3J0KCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgU2RrSW5mbywgU2VudHJ5UmVxdWVzdCwgU2VudHJ5UmVxdWVzdFR5cGUsIFNlc3Npb24sIFNlc3Npb25BZ2dyZWdhdGVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5cbmltcG9ydCB7IEFQSSB9IGZyb20gJy4vYXBpJztcblxuLyoqIEV4dHJhY3Qgc2RrIGluZm8gZnJvbSBmcm9tIHRoZSBBUEkgbWV0YWRhdGEgKi9cbmZ1bmN0aW9uIGdldFNka01ldGFkYXRhRm9yRW52ZWxvcGVIZWFkZXIoYXBpOiBBUEkpOiBTZGtJbmZvIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFhcGkubWV0YWRhdGEgfHwgIWFwaS5tZXRhZGF0YS5zZGspIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBhcGkubWV0YWRhdGEuc2RrO1xuICByZXR1cm4geyBuYW1lLCB2ZXJzaW9uIH07XG59XG5cbi8qKlxuICogQXBwbHkgU2RrSW5mbyAobmFtZSwgdmVyc2lvbiwgcGFja2FnZXMsIGludGVncmF0aW9ucykgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQga2V5LlxuICogTWVyZ2Ugd2l0aCBleGlzdGluZyBkYXRhIGlmIGFueS5cbiAqKi9cbmZ1bmN0aW9uIGVuaGFuY2VFdmVudFdpdGhTZGtJbmZvKGV2ZW50OiBFdmVudCwgc2RrSW5mbz86IFNka0luZm8pOiBFdmVudCB7XG4gIGlmICghc2RrSW5mbykge1xuICAgIHJldHVybiBldmVudDtcbiAgfVxuICBldmVudC5zZGsgPSBldmVudC5zZGsgfHwge307XG4gIGV2ZW50LnNkay5uYW1lID0gZXZlbnQuc2RrLm5hbWUgfHwgc2RrSW5mby5uYW1lO1xuICBldmVudC5zZGsudmVyc2lvbiA9IGV2ZW50LnNkay52ZXJzaW9uIHx8IHNka0luZm8udmVyc2lvbjtcbiAgZXZlbnQuc2RrLmludGVncmF0aW9ucyA9IFsuLi4oZXZlbnQuc2RrLmludGVncmF0aW9ucyB8fCBbXSksIC4uLihzZGtJbmZvLmludGVncmF0aW9ucyB8fCBbXSldO1xuICBldmVudC5zZGsucGFja2FnZXMgPSBbLi4uKGV2ZW50LnNkay5wYWNrYWdlcyB8fCBbXSksIC4uLihzZGtJbmZvLnBhY2thZ2VzIHx8IFtdKV07XG4gIHJldHVybiBldmVudDtcbn1cblxuLyoqIENyZWF0ZXMgYSBTZW50cnlSZXF1ZXN0IGZyb20gYSBTZXNzaW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlc3Npb25Ub1NlbnRyeVJlcXVlc3Qoc2Vzc2lvbjogU2Vzc2lvbiB8IFNlc3Npb25BZ2dyZWdhdGVzLCBhcGk6IEFQSSk6IFNlbnRyeVJlcXVlc3Qge1xuICBjb25zdCBzZGtJbmZvID0gZ2V0U2RrTWV0YWRhdGFGb3JFbnZlbG9wZUhlYWRlcihhcGkpO1xuICBjb25zdCBlbnZlbG9wZUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgc2VudF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIC4uLihzZGtJbmZvICYmIHsgc2RrOiBzZGtJbmZvIH0pLFxuICAgIC4uLihhcGkuZm9yY2VFbnZlbG9wZSgpICYmIHsgZHNuOiBhcGkuZ2V0RHNuKCkudG9TdHJpbmcoKSB9KSxcbiAgfSk7XG4gIC8vIEkga25vdyB0aGlzIGlzIGhhY2t5IGJ1dCB3ZSBkb24ndCB3YW50IHRvIGFkZCBgc2Vzc2lvbmAgdG8gcmVxdWVzdCB0eXBlIHNpbmNlIGl0J3MgbmV2ZXIgcmF0ZSBsaW1pdGVkXG4gIGNvbnN0IHR5cGU6IFNlbnRyeVJlcXVlc3RUeXBlID0gJ2FnZ3JlZ2F0ZXMnIGluIHNlc3Npb24gPyAoJ3Nlc3Npb25zJyBhcyBTZW50cnlSZXF1ZXN0VHlwZSkgOiAnc2Vzc2lvbic7XG4gIGNvbnN0IGl0ZW1IZWFkZXJzID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHR5cGUsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgYm9keTogYCR7ZW52ZWxvcGVIZWFkZXJzfVxcbiR7aXRlbUhlYWRlcnN9XFxuJHtKU09OLnN0cmluZ2lmeShzZXNzaW9uKX1gLFxuICAgIHR5cGUsXG4gICAgdXJsOiBhcGkuZ2V0RW52ZWxvcGVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpLFxuICB9O1xufVxuXG4vKiogQ3JlYXRlcyBhIFNlbnRyeVJlcXVlc3QgZnJvbSBhbiBldmVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudFRvU2VudHJ5UmVxdWVzdChldmVudDogRXZlbnQsIGFwaTogQVBJKTogU2VudHJ5UmVxdWVzdCB7XG4gIGNvbnN0IHNka0luZm8gPSBnZXRTZGtNZXRhZGF0YUZvckVudmVsb3BlSGVhZGVyKGFwaSk7XG4gIGNvbnN0IGV2ZW50VHlwZSA9IGV2ZW50LnR5cGUgfHwgJ2V2ZW50JztcbiAgY29uc3QgdXNlRW52ZWxvcGUgPSBldmVudFR5cGUgPT09ICd0cmFuc2FjdGlvbicgfHwgYXBpLmZvcmNlRW52ZWxvcGUoKTtcblxuICBjb25zdCB7IHRyYW5zYWN0aW9uU2FtcGxpbmcsIC4uLm1ldGFkYXRhIH0gPSBldmVudC5kZWJ1Z19tZXRhIHx8IHt9O1xuICBjb25zdCB7IG1ldGhvZDogc2FtcGxpbmdNZXRob2QsIHJhdGU6IHNhbXBsZVJhdGUgfSA9IHRyYW5zYWN0aW9uU2FtcGxpbmcgfHwge307XG4gIGlmIChPYmplY3Qua2V5cyhtZXRhZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgZGVsZXRlIGV2ZW50LmRlYnVnX21ldGE7XG4gIH0gZWxzZSB7XG4gICAgZXZlbnQuZGVidWdfbWV0YSA9IG1ldGFkYXRhO1xuICB9XG5cbiAgY29uc3QgcmVxOiBTZW50cnlSZXF1ZXN0ID0ge1xuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHNka0luZm8gPyBlbmhhbmNlRXZlbnRXaXRoU2RrSW5mbyhldmVudCwgYXBpLm1ldGFkYXRhLnNkaykgOiBldmVudCksXG4gICAgdHlwZTogZXZlbnRUeXBlLFxuICAgIHVybDogdXNlRW52ZWxvcGUgPyBhcGkuZ2V0RW52ZWxvcGVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpIDogYXBpLmdldFN0b3JlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKSxcbiAgfTtcblxuICAvLyBodHRwczovL2RldmVsb3Auc2VudHJ5LmRldi9zZGsvZW52ZWxvcGVzL1xuXG4gIC8vIFNpbmNlIHdlIGRvbid0IG5lZWQgdG8gbWFuaXB1bGF0ZSBlbnZlbG9wZXMgbm9yIHN0b3JlIHRoZW0sIHRoZXJlIGlzIG5vXG4gIC8vIGV4cG9ydGVkIGNvbmNlcHQgb2YgYW4gRW52ZWxvcGUgd2l0aCBvcGVyYXRpb25zIGluY2x1ZGluZyBzZXJpYWxpemF0aW9uIGFuZFxuICAvLyBkZXNlcmlhbGl6YXRpb24uIEluc3RlYWQsIHdlIG9ubHkgaW1wbGVtZW50IGEgbWluaW1hbCBzdWJzZXQgb2YgdGhlIHNwZWMgdG9cbiAgLy8gc2VyaWFsaXplIGV2ZW50cyBpbmxpbmUgaGVyZS5cbiAgaWYgKHVzZUVudmVsb3BlKSB7XG4gICAgY29uc3QgZW52ZWxvcGVIZWFkZXJzID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZXZlbnRfaWQ6IGV2ZW50LmV2ZW50X2lkLFxuICAgICAgc2VudF9hdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgLi4uKHNka0luZm8gJiYgeyBzZGs6IHNka0luZm8gfSksXG4gICAgICAuLi4oYXBpLmZvcmNlRW52ZWxvcGUoKSAmJiB7IGRzbjogYXBpLmdldERzbigpLnRvU3RyaW5nKCkgfSksXG4gICAgfSk7XG4gICAgY29uc3QgaXRlbUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICB0eXBlOiBldmVudFR5cGUsXG5cbiAgICAgIC8vIFRPRE86IFJpZ2h0IG5vdywgc2FtcGxlUmF0ZSBtYXkgb3IgbWF5IG5vdCBiZSBkZWZpbmVkIChpdCB3b24ndCBiZSBpbiB0aGUgY2FzZXMgb2YgaW5oZXJpdGFuY2UgYW5kXG4gICAgICAvLyBleHBsaWNpdGx5LXNldCBzYW1wbGluZyBkZWNpc2lvbnMpLiBBcmUgd2UgZ29vZCB3aXRoIHRoYXQ/XG4gICAgICBzYW1wbGVfcmF0ZXM6IFt7IGlkOiBzYW1wbGluZ01ldGhvZCwgcmF0ZTogc2FtcGxlUmF0ZSB9XSxcblxuICAgICAgLy8gVGhlIGNvbnRlbnQtdHlwZSBpcyBhc3N1bWVkIHRvIGJlICdhcHBsaWNhdGlvbi9qc29uJyBhbmQgbm90IHBhcnQgb2ZcbiAgICAgIC8vIHRoZSBjdXJyZW50IHNwZWMgZm9yIHRyYW5zYWN0aW9uIGl0ZW1zLCBzbyB3ZSBkb24ndCBibG9hdCB0aGUgcmVxdWVzdFxuICAgICAgLy8gYm9keSB3aXRoIGl0LlxuICAgICAgLy9cbiAgICAgIC8vIGNvbnRlbnRfdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBsZW5ndGggaXMgb3B0aW9uYWwuIEl0IG11c3QgYmUgdGhlIG51bWJlciBvZiBieXRlcyBpbiByZXEuQm9keVxuICAgICAgLy8gZW5jb2RlZCBhcyBVVEYtOC4gU2luY2UgdGhlIHNlcnZlciBjYW4gZmlndXJlIHRoaXMgb3V0IGFuZCB3b3VsZFxuICAgICAgLy8gb3RoZXJ3aXNlIHJlZnVzZSBldmVudHMgdGhhdCByZXBvcnQgdGhlIGxlbmd0aCBpbmNvcnJlY3RseSwgd2UgZGVjaWRlZFxuICAgICAgLy8gbm90IHRvIHNlbmQgdGhlIGxlbmd0aCB0byBhdm9pZCBwcm9ibGVtcyByZWxhdGVkIHRvIHJlcG9ydGluZyB0aGUgd3JvbmdcbiAgICAgIC8vIHNpemUgYW5kIHRvIHJlZHVjZSByZXF1ZXN0IGJvZHkgc2l6ZS5cbiAgICAgIC8vXG4gICAgICAvLyBsZW5ndGg6IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShyZXEuYm9keSkubGVuZ3RoLFxuICAgIH0pO1xuICAgIC8vIFRoZSB0cmFpbGluZyBuZXdsaW5lIGlzIG9wdGlvbmFsLiBXZSBpbnRlbnRpb25hbGx5IGRvbid0IHNlbmQgaXQgdG8gYXZvaWRcbiAgICAvLyBzZW5kaW5nIHVubmVjZXNzYXJ5IGJ5dGVzLlxuICAgIC8vXG4gICAgLy8gY29uc3QgZW52ZWxvcGUgPSBgJHtlbnZlbG9wZUhlYWRlcnN9XFxuJHtpdGVtSGVhZGVyc31cXG4ke3JlcS5ib2R5fVxcbmA7XG4gICAgY29uc3QgZW52ZWxvcGUgPSBgJHtlbnZlbG9wZUhlYWRlcnN9XFxuJHtpdGVtSGVhZGVyc31cXG4ke3JlcS5ib2R5fWA7XG4gICAgcmVxLmJvZHkgPSBlbnZlbG9wZTtcbiAgfVxuXG4gIHJldHVybiByZXE7XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IENsaWVudCwgT3B0aW9ucyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8qKiBBIGNsYXNzIG9iamVjdCB0aGF0IGNhbiBpbnN0YW50aWF0ZSBDbGllbnQgb2JqZWN0cy4gKi9cbmV4cG9ydCB0eXBlIENsaWVudENsYXNzPEYgZXh0ZW5kcyBDbGllbnQsIE8gZXh0ZW5kcyBPcHRpb25zPiA9IG5ldyAob3B0aW9uczogTykgPT4gRjtcblxuLyoqXG4gKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgU0RLIGNsaWVudCBpbnN0YW5jZS4gVGhlIGNsaWVudCBpc1xuICogaW5zdGFsbGVkIGFuZCB0aGVuIGJvdW5kIHRvIHRoZSBjdXJyZW50IHNjb3BlLlxuICpcbiAqIEBwYXJhbSBjbGllbnRDbGFzcyBUaGUgY2xpZW50IGNsYXNzIHRvIGluc3RhbnRpYXRlLlxuICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBjbGllbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0QW5kQmluZDxGIGV4dGVuZHMgQ2xpZW50LCBPIGV4dGVuZHMgT3B0aW9ucz4oY2xpZW50Q2xhc3M6IENsaWVudENsYXNzPEYsIE8+LCBvcHRpb25zOiBPKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLmRlYnVnID09PSB0cnVlKSB7XG4gICAgbG9nZ2VyLmVuYWJsZSgpO1xuICB9XG4gIGNvbnN0IGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgaHViLmdldFNjb3BlKCk/LnVwZGF0ZShvcHRpb25zLmluaXRpYWxTY29wZSk7XG4gIGNvbnN0IGNsaWVudCA9IG5ldyBjbGllbnRDbGFzcyhvcHRpb25zKTtcbiAgaHViLmJpbmRDbGllbnQoY2xpZW50KTtcbn1cbiIsICJleHBvcnQgY29uc3QgU0RLX1ZFUlNJT04gPSAnNi4xNi4xJztcbiIsICJpbXBvcnQgeyBJbnRlZ3JhdGlvbiwgV3JhcHBlZEZ1bmN0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5cbmxldCBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmc6ICgpID0+IHZvaWQ7XG5cbi8qKiBQYXRjaCB0b1N0cmluZyBjYWxscyB0byByZXR1cm4gcHJvcGVyIG5hbWUgZm9yIHdyYXBwZWQgZnVuY3Rpb25zICovXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25Ub1N0cmluZyBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnRnVuY3Rpb25Ub1N0cmluZyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gRnVuY3Rpb25Ub1N0cmluZy5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoKTogdm9pZCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24odGhpczogV3JhcHBlZEZ1bmN0aW9uLCAuLi5hcmdzOiBhbnlbXSk6IHN0cmluZyB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5fX3NlbnRyeV9vcmlnaW5hbF9fIHx8IHRoaXM7XG4gICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEV2ZW50LCBJbnRlZ3JhdGlvbiwgU3RhY2tGcmFtZSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RXZlbnREZXNjcmlwdGlvbiwgaXNNYXRjaGluZ1BhdHRlcm4sIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG4vLyBcIlNjcmlwdCBlcnJvci5cIiBpcyBoYXJkIGNvZGVkIGludG8gYnJvd3NlcnMgZm9yIGVycm9ycyB0aGF0IGl0IGNhbid0IHJlYWQuXG4vLyB0aGlzIGlzIHRoZSByZXN1bHQgb2YgYSBzY3JpcHQgYmVpbmcgcHVsbGVkIGluIGZyb20gYW4gZXh0ZXJuYWwgZG9tYWluIGFuZCBDT1JTLlxuY29uc3QgREVGQVVMVF9JR05PUkVfRVJST1JTID0gWy9eU2NyaXB0IGVycm9yXFwuPyQvLCAvXkphdmFzY3JpcHQgZXJyb3I6IFNjcmlwdCBlcnJvclxcLj8gb24gbGluZSAwJC9dO1xuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBJbmJvdW5kRmlsdGVyc09wdGlvbnMge1xuICBhbGxvd1VybHM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG4gIGRlbnlVcmxzOiBBcnJheTxzdHJpbmcgfCBSZWdFeHA+O1xuICBpZ25vcmVFcnJvcnM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG4gIGlnbm9yZUludGVybmFsOiBib29sZWFuO1xuXG4gIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEluYm91bmRGaWx0ZXJzT3B0aW9ucy5hbGxvd1VybHN9IGluc3RlYWQuICovXG4gIHdoaXRlbGlzdFVybHM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIEluYm91bmRGaWx0ZXJzT3B0aW9ucy5kZW55VXJsc30gaW5zdGVhZC4gKi9cbiAgYmxhY2tsaXN0VXJsczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbn1cblxuLyoqIEluYm91bmQgZmlsdGVycyBjb25maWd1cmFibGUgYnkgdGhlIHVzZXIgKi9cbmV4cG9ydCBjbGFzcyBJbmJvdW5kRmlsdGVycyBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnSW5ib3VuZEZpbHRlcnMnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IEluYm91bmRGaWx0ZXJzLmlkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBQYXJ0aWFsPEluYm91bmRGaWx0ZXJzT3B0aW9ucz4gPSB7fSkge31cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoKTogdm9pZCB7XG4gICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuICAgICAgaWYgKCFodWIpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgfVxuICAgICAgY29uc3Qgc2VsZiA9IGh1Yi5nZXRJbnRlZ3JhdGlvbihJbmJvdW5kRmlsdGVycyk7XG4gICAgICBpZiAoc2VsZikge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBodWIuZ2V0Q2xpZW50KCk7XG4gICAgICAgIGNvbnN0IGNsaWVudE9wdGlvbnMgPSBjbGllbnQgPyBjbGllbnQuZ2V0T3B0aW9ucygpIDoge307XG4gICAgICAgIC8vIFRoaXMgY2hlY2tzIHByZXZlbnRzIG1vc3Qgb2YgdGhlIG9jY3VycmVuY2VzIG9mIHRoZSBidWcgbGlua2VkIGJlbG93OlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8yNjIyXG4gICAgICAgIC8vIFRoZSBidWcgaXMgY2F1c2VkIGJ5IG11bHRpcGxlIFNESyBpbnN0YW5jZXMsIHdoZXJlIG9uZSBpcyBtaW5pZmllZCBhbmQgb25lIGlzIHVzaW5nIG5vbi1tYW5nbGVkIGNvZGUuXG4gICAgICAgIC8vIFVuZm9ydHVuYXRlbGx5IHdlIGNhbm5vdCBmaXggaXQgcmVsaWFibHkgKHRodXMgcmVzZXJ2ZWQgcHJvcGVydHkgaW4gcm9sbHVwJ3MgdGVyc2VyIGNvbmZpZyksXG4gICAgICAgIC8vIGFzIHdlIGNhbm5vdCBmb3JjZSBwZW9wbGUgdXNpbmcgbXVsdGlwbGUgaW5zdGFuY2VzIGluIHRoZWlyIGFwcHMgdG8gc3luYyBTREsgdmVyc2lvbnMuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0eXBlb2Ygc2VsZi5fbWVyZ2VPcHRpb25zID09PSAnZnVuY3Rpb24nID8gc2VsZi5fbWVyZ2VPcHRpb25zKGNsaWVudE9wdGlvbnMpIDoge307XG4gICAgICAgIGlmICh0eXBlb2Ygc2VsZi5fc2hvdWxkRHJvcEV2ZW50ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZWxmLl9zaG91bGREcm9wRXZlbnQoZXZlbnQsIG9wdGlvbnMpID8gbnVsbCA6IGV2ZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX3Nob3VsZERyb3BFdmVudChldmVudDogRXZlbnQsIG9wdGlvbnM6IFBhcnRpYWw8SW5ib3VuZEZpbHRlcnNPcHRpb25zPik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9pc1NlbnRyeUVycm9yKGV2ZW50LCBvcHRpb25zKSkge1xuICAgICAgbG9nZ2VyLndhcm4oYEV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIGludGVybmFsIFNlbnRyeSBFcnJvci5cXG5FdmVudDogJHtnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KX1gKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNJZ25vcmVkRXJyb3IoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIG1hdGNoZWQgYnkgXFxgaWdub3JlRXJyb3JzXFxgIG9wdGlvbi5cXG5FdmVudDogJHtnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNEZW5pZWRVcmwoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIG1hdGNoZWQgYnkgXFxgZGVueVVybHNcXGAgb3B0aW9uLlxcbkV2ZW50OiAke2dldEV2ZW50RGVzY3JpcHRpb24oXG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICl9LlxcblVybDogJHt0aGlzLl9nZXRFdmVudEZpbHRlclVybChldmVudCl9YCxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLl9pc0FsbG93ZWRVcmwoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYEV2ZW50IGRyb3BwZWQgZHVlIHRvIG5vdCBiZWluZyBtYXRjaGVkIGJ5IFxcYGFsbG93VXJsc1xcYCBvcHRpb24uXFxuRXZlbnQ6ICR7Z2V0RXZlbnREZXNjcmlwdGlvbihcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgKX0uXFxuVXJsOiAke3RoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfaXNTZW50cnlFcnJvcihldmVudDogRXZlbnQsIG9wdGlvbnM6IFBhcnRpYWw8SW5ib3VuZEZpbHRlcnNPcHRpb25zPik6IGJvb2xlYW4ge1xuICAgIGlmICghb3B0aW9ucy5pZ25vcmVJbnRlcm5hbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoZXZlbnQgJiZcbiAgICAgICAgICBldmVudC5leGNlcHRpb24gJiZcbiAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzICYmXG4gICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSAmJlxuICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udHlwZSA9PT0gJ1NlbnRyeUVycm9yJykgfHxcbiAgICAgICAgZmFsc2VcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2lzSWdub3JlZEVycm9yKGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUVycm9ycyB8fCAhb3B0aW9ucy5pZ25vcmVFcnJvcnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dldFBvc3NpYmxlRXZlbnRNZXNzYWdlcyhldmVudCkuc29tZShtZXNzYWdlID0+XG4gICAgICAvLyBOb3Qgc3VyZSB3aHkgVHlwZVNjcmlwdCBjb21wbGFpbnMgaGVyZS4uLlxuICAgICAgKG9wdGlvbnMuaWdub3JlRXJyb3JzIGFzIEFycmF5PFJlZ0V4cCB8IHN0cmluZz4pLnNvbWUocGF0dGVybiA9PiBpc01hdGNoaW5nUGF0dGVybihtZXNzYWdlLCBwYXR0ZXJuKSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9pc0RlbmllZFVybChldmVudDogRXZlbnQsIG9wdGlvbnM6IFBhcnRpYWw8SW5ib3VuZEZpbHRlcnNPcHRpb25zPik6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE86IFVzZSBHbG9iIGluc3RlYWQ/XG4gICAgaWYgKCFvcHRpb25zLmRlbnlVcmxzIHx8ICFvcHRpb25zLmRlbnlVcmxzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLl9nZXRFdmVudEZpbHRlclVybChldmVudCk7XG4gICAgcmV0dXJuICF1cmwgPyBmYWxzZSA6IG9wdGlvbnMuZGVueVVybHMuc29tZShwYXR0ZXJuID0+IGlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgcGF0dGVybikpO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2lzQWxsb3dlZFVybChldmVudDogRXZlbnQsIG9wdGlvbnM6IFBhcnRpYWw8SW5ib3VuZEZpbHRlcnNPcHRpb25zPik6IGJvb2xlYW4ge1xuICAgIC8vIFRPRE86IFVzZSBHbG9iIGluc3RlYWQ/XG4gICAgaWYgKCFvcHRpb25zLmFsbG93VXJscyB8fCAhb3B0aW9ucy5hbGxvd1VybHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gdGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpO1xuICAgIHJldHVybiAhdXJsID8gdHJ1ZSA6IG9wdGlvbnMuYWxsb3dVcmxzLnNvbWUocGF0dGVybiA9PiBpc01hdGNoaW5nUGF0dGVybih1cmwsIHBhdHRlcm4pKTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9tZXJnZU9wdGlvbnMoY2xpZW50T3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+ID0ge30pOiBQYXJ0aWFsPEluYm91bmRGaWx0ZXJzT3B0aW9ucz4ge1xuICAgIHJldHVybiB7XG4gICAgICBhbGxvd1VybHM6IFtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICAgIC4uLih0aGlzLl9vcHRpb25zLndoaXRlbGlzdFVybHMgfHwgW10pLFxuICAgICAgICAuLi4odGhpcy5fb3B0aW9ucy5hbGxvd1VybHMgfHwgW10pLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgICAgLi4uKGNsaWVudE9wdGlvbnMud2hpdGVsaXN0VXJscyB8fCBbXSksXG4gICAgICAgIC4uLihjbGllbnRPcHRpb25zLmFsbG93VXJscyB8fCBbXSksXG4gICAgICBdLFxuICAgICAgZGVueVVybHM6IFtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICAgIC4uLih0aGlzLl9vcHRpb25zLmJsYWNrbGlzdFVybHMgfHwgW10pLFxuICAgICAgICAuLi4odGhpcy5fb3B0aW9ucy5kZW55VXJscyB8fCBbXSksXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgICAgICAuLi4oY2xpZW50T3B0aW9ucy5ibGFja2xpc3RVcmxzIHx8IFtdKSxcbiAgICAgICAgLi4uKGNsaWVudE9wdGlvbnMuZGVueVVybHMgfHwgW10pLFxuICAgICAgXSxcbiAgICAgIGlnbm9yZUVycm9yczogW1xuICAgICAgICAuLi4odGhpcy5fb3B0aW9ucy5pZ25vcmVFcnJvcnMgfHwgW10pLFxuICAgICAgICAuLi4oY2xpZW50T3B0aW9ucy5pZ25vcmVFcnJvcnMgfHwgW10pLFxuICAgICAgICAuLi5ERUZBVUxUX0lHTk9SRV9FUlJPUlMsXG4gICAgICBdLFxuICAgICAgaWdub3JlSW50ZXJuYWw6IHR5cGVvZiB0aGlzLl9vcHRpb25zLmlnbm9yZUludGVybmFsICE9PSAndW5kZWZpbmVkJyA/IHRoaXMuX29wdGlvbnMuaWdub3JlSW50ZXJuYWwgOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfZ2V0UG9zc2libGVFdmVudE1lc3NhZ2VzKGV2ZW50OiBFdmVudCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgICAgcmV0dXJuIFtldmVudC5tZXNzYWdlXTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmV4Y2VwdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyB0eXBlID0gJycsIHZhbHVlID0gJycgfSA9IChldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0pIHx8IHt9O1xuICAgICAgICByZXR1cm4gW2Ake3ZhbHVlfWAsIGAke3R5cGV9OiAke3ZhbHVlfWBdO1xuICAgICAgfSBjYXRjaCAob08pIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGBDYW5ub3QgZXh0cmFjdCBtZXNzYWdlIGZvciBldmVudCAke2dldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpfWApO1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9nZXRMYXN0VmFsaWRVcmwoZnJhbWVzOiBTdGFja0ZyYW1lW10gPSBbXSk6IHN0cmluZyB8IG51bGwge1xuICAgIGZvciAobGV0IGkgPSBmcmFtZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IGZyYW1lID0gZnJhbWVzW2ldO1xuXG4gICAgICBpZiAoZnJhbWU/LmZpbGVuYW1lICE9PSAnPGFub255bW91cz4nICYmIGZyYW1lPy5maWxlbmFtZSAhPT0gJ1tuYXRpdmUgY29kZV0nKSB7XG4gICAgICAgIHJldHVybiBmcmFtZS5maWxlbmFtZSB8fCBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50OiBFdmVudCk6IHN0cmluZyB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBpZiAoZXZlbnQuc3RhY2t0cmFjZSkge1xuICAgICAgICBjb25zdCBmcmFtZXMgPSBldmVudC5zdGFja3RyYWNlLmZyYW1lcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhc3RWYWxpZFVybChmcmFtZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmV4Y2VwdGlvbikge1xuICAgICAgICBjb25zdCBmcmFtZXMgPVxuICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0uc3RhY2t0cmFjZS5mcmFtZXM7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRMYXN0VmFsaWRVcmwoZnJhbWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0gY2F0Y2ggKG9PKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYENhbm5vdCBleHRyYWN0IHVybCBmb3IgZXZlbnQgJHtnZXRFdmVudERlc2NyaXB0aW9uKGV2ZW50KX1gKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCB7IEZ1bmN0aW9uVG9TdHJpbmcgfSBmcm9tICcuL2Z1bmN0aW9udG9zdHJpbmcnO1xuZXhwb3J0IHsgSW5ib3VuZEZpbHRlcnMgfSBmcm9tICcuL2luYm91bmRmaWx0ZXJzJztcbiIsICJleHBvcnQge1xuICBhZGRCcmVhZGNydW1iLFxuICBjYXB0dXJlRXhjZXB0aW9uLFxuICBjYXB0dXJlRXZlbnQsXG4gIGNhcHR1cmVNZXNzYWdlLFxuICBjb25maWd1cmVTY29wZSxcbiAgc3RhcnRUcmFuc2FjdGlvbixcbiAgc2V0Q29udGV4dCxcbiAgc2V0RXh0cmEsXG4gIHNldEV4dHJhcyxcbiAgc2V0VGFnLFxuICBzZXRUYWdzLFxuICBzZXRVc2VyLFxuICB3aXRoU2NvcGUsXG59IGZyb20gJ0BzZW50cnkvbWluaW1hbCc7XG5leHBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiwgZ2V0SHViRnJvbUNhcnJpZXIsIEh1YiwgbWFrZU1haW4sIFNjb3BlIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuZXhwb3J0IHsgQVBJIH0gZnJvbSAnLi9hcGknO1xuZXhwb3J0IHsgQmFzZUNsaWVudCB9IGZyb20gJy4vYmFzZWNsaWVudCc7XG5leHBvcnQgeyBCYWNrZW5kQ2xhc3MsIEJhc2VCYWNrZW5kIH0gZnJvbSAnLi9iYXNlYmFja2VuZCc7XG5leHBvcnQgeyBldmVudFRvU2VudHJ5UmVxdWVzdCwgc2Vzc2lvblRvU2VudHJ5UmVxdWVzdCB9IGZyb20gJy4vcmVxdWVzdCc7XG5leHBvcnQgeyBpbml0QW5kQmluZCwgQ2xpZW50Q2xhc3MgfSBmcm9tICcuL3Nkayc7XG5leHBvcnQgeyBOb29wVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzL25vb3AnO1xuZXhwb3J0IHsgU0RLX1ZFUlNJT04gfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5pbXBvcnQgKiBhcyBJbnRlZ3JhdGlvbnMgZnJvbSAnLi9pbnRlZ3JhdGlvbnMnO1xuXG5leHBvcnQgeyBJbnRlZ3JhdGlvbnMgfTtcbiIsICIvKipcbiAqIEEgZG91Ymx5IGxpbmtlZCBsaXN0LWJhc2VkIExlYXN0IFJlY2VudGx5IFVzZWQgKExSVSkgY2FjaGUuIFdpbGwga2VlcCBtb3N0XG4gKiByZWNlbnRseSB1c2VkIGl0ZW1zIHdoaWxlIGRpc2NhcmRpbmcgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtcyB3aGVuIGl0cyBsaW1pdFxuICogaXMgcmVhY2hlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQuIENvcHlyaWdodCAoYykgMjAxMCBSYXNtdXMgQW5kZXJzc29uIDxodHRwOi8vaHVuY2guc2UvPlxuICogU2VlIFJFQURNRS5tZCBmb3IgZGV0YWlscy5cbiAqXG4gKiBJbGx1c3RyYXRpb24gb2YgdGhlIGRlc2lnbjpcbiAqXG4gKiAgICAgICBlbnRyeSAgICAgICAgICAgICBlbnRyeSAgICAgICAgICAgICBlbnRyeSAgICAgICAgICAgICBlbnRyeVxuICogICAgICAgX19fX19fICAgICAgICAgICAgX19fX19fICAgICAgICAgICAgX19fX19fICAgICAgICAgICAgX19fX19fXG4gKiAgICAgIHwgaGVhZCB8Lm5ld2VyID0+IHwgICAgICB8Lm5ld2VyID0+IHwgICAgICB8Lm5ld2VyID0+IHwgdGFpbCB8XG4gKiAgICAgIHwgIEEgICB8ICAgICAgICAgIHwgIEIgICB8ICAgICAgICAgIHwgIEMgICB8ICAgICAgICAgIHwgIEQgICB8XG4gKiAgICAgIHxfX19fX198IDw9IG9sZGVyLnxfX19fX198IDw9IG9sZGVyLnxfX19fX198IDw9IG9sZGVyLnxfX19fX198XG4gKlxuICogIHJlbW92ZWQgIDwtLSAgPC0tICA8LS0gIDwtLSAgPC0tICA8LS0gIDwtLSAgPC0tICA8LS0gIDwtLSAgPC0tICBhZGRlZFxuICovXG4oZnVuY3Rpb24oZyxmKXtcbiAgY29uc3QgZSA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnID8gZXhwb3J0cyA6IHR5cGVvZiBnID09ICdvYmplY3QnID8gZyA6IHt9O1xuICBmKGUpO1xuICBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsgZGVmaW5lKCdscnUnLCBlKTsgfVxufSkodGhpcywgZnVuY3Rpb24oZXhwb3J0cykge1xuXG5jb25zdCBORVdFUiA9IFN5bWJvbCgnbmV3ZXInKTtcbmNvbnN0IE9MREVSID0gU3ltYm9sKCdvbGRlcicpO1xuXG5mdW5jdGlvbiBMUlVNYXAobGltaXQsIGVudHJpZXMpIHtcbiAgaWYgKHR5cGVvZiBsaW1pdCAhPT0gJ251bWJlcicpIHtcbiAgICAvLyBjYWxsZWQgYXMgKGVudHJpZXMpXG4gICAgZW50cmllcyA9IGxpbWl0O1xuICAgIGxpbWl0ID0gMDtcbiAgfVxuXG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMubGltaXQgPSBsaW1pdDtcbiAgdGhpcy5vbGRlc3QgPSB0aGlzLm5ld2VzdCA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fa2V5bWFwID0gbmV3IE1hcCgpO1xuXG4gIGlmIChlbnRyaWVzKSB7XG4gICAgdGhpcy5hc3NpZ24oZW50cmllcyk7XG4gICAgaWYgKGxpbWl0IDwgMSkge1xuICAgICAgdGhpcy5saW1pdCA9IHRoaXMuc2l6ZTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0cy5MUlVNYXAgPSBMUlVNYXA7XG5cbmZ1bmN0aW9uIEVudHJ5KGtleSwgdmFsdWUpIHtcbiAgdGhpcy5rZXkgPSBrZXk7XG4gIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgdGhpc1tORVdFUl0gPSB1bmRlZmluZWQ7XG4gIHRoaXNbT0xERVJdID0gdW5kZWZpbmVkO1xufVxuXG5cbkxSVU1hcC5wcm90b3R5cGUuX21hcmtFbnRyeUFzVXNlZCA9IGZ1bmN0aW9uKGVudHJ5KSB7XG4gIGlmIChlbnRyeSA9PT0gdGhpcy5uZXdlc3QpIHtcbiAgICAvLyBBbHJlYWR5IHRoZSBtb3N0IHJlY2VubHR5IHVzZWQgZW50cnksIHNvIG5vIG5lZWQgdG8gdXBkYXRlIHRoZSBsaXN0XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIEhFQUQtLS0tLS0tLS0tLS0tLVRBSUxcbiAgLy8gICA8Lm9sZGVyICAgLm5ld2VyPlxuICAvLyAgPC0tLSBhZGQgZGlyZWN0aW9uIC0tXG4gIC8vICAgQSAgQiAgQyAgPEQ+ICBFXG4gIGlmIChlbnRyeVtORVdFUl0pIHtcbiAgICBpZiAoZW50cnkgPT09IHRoaXMub2xkZXN0KSB7XG4gICAgICB0aGlzLm9sZGVzdCA9IGVudHJ5W05FV0VSXTtcbiAgICB9XG4gICAgZW50cnlbTkVXRVJdW09MREVSXSA9IGVudHJ5W09MREVSXTsgLy8gQyA8LS0gRS5cbiAgfVxuICBpZiAoZW50cnlbT0xERVJdKSB7XG4gICAgZW50cnlbT0xERVJdW05FV0VSXSA9IGVudHJ5W05FV0VSXTsgLy8gQy4gLS0+IEVcbiAgfVxuICBlbnRyeVtORVdFUl0gPSB1bmRlZmluZWQ7IC8vIEQgLS14XG4gIGVudHJ5W09MREVSXSA9IHRoaXMubmV3ZXN0OyAvLyBELiAtLT4gRVxuICBpZiAodGhpcy5uZXdlc3QpIHtcbiAgICB0aGlzLm5ld2VzdFtORVdFUl0gPSBlbnRyeTsgLy8gRS4gPC0tIERcbiAgfVxuICB0aGlzLm5ld2VzdCA9IGVudHJ5O1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS5hc3NpZ24gPSBmdW5jdGlvbihlbnRyaWVzKSB7XG4gIGxldCBlbnRyeSwgbGltaXQgPSB0aGlzLmxpbWl0IHx8IE51bWJlci5NQVhfVkFMVUU7XG4gIHRoaXMuX2tleW1hcC5jbGVhcigpO1xuICBsZXQgaXQgPSBlbnRyaWVzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgZm9yIChsZXQgaXR2ID0gaXQubmV4dCgpOyAhaXR2LmRvbmU7IGl0diA9IGl0Lm5leHQoKSkge1xuICAgIGxldCBlID0gbmV3IEVudHJ5KGl0di52YWx1ZVswXSwgaXR2LnZhbHVlWzFdKTtcbiAgICB0aGlzLl9rZXltYXAuc2V0KGUua2V5LCBlKTtcbiAgICBpZiAoIWVudHJ5KSB7XG4gICAgICB0aGlzLm9sZGVzdCA9IGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudHJ5W05FV0VSXSA9IGU7XG4gICAgICBlW09MREVSXSA9IGVudHJ5O1xuICAgIH1cbiAgICBlbnRyeSA9IGU7XG4gICAgaWYgKGxpbWl0LS0gPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdmVyZmxvdycpO1xuICAgIH1cbiAgfVxuICB0aGlzLm5ld2VzdCA9IGVudHJ5O1xuICB0aGlzLnNpemUgPSB0aGlzLl9rZXltYXAuc2l6ZTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24oa2V5KSB7XG4gIC8vIEZpcnN0LCBmaW5kIG91ciBjYWNoZSBlbnRyeVxuICB2YXIgZW50cnkgPSB0aGlzLl9rZXltYXAuZ2V0KGtleSk7XG4gIGlmICghZW50cnkpIHJldHVybjsgLy8gTm90IGNhY2hlZC4gU29ycnkuXG4gIC8vIEFzIDxrZXk+IHdhcyBmb3VuZCBpbiB0aGUgY2FjaGUsIHJlZ2lzdGVyIGl0IGFzIGJlaW5nIHJlcXVlc3RlZCByZWNlbnRseVxuICB0aGlzLl9tYXJrRW50cnlBc1VzZWQoZW50cnkpO1xuICByZXR1cm4gZW50cnkudmFsdWU7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fa2V5bWFwLmdldChrZXkpO1xuXG4gIGlmIChlbnRyeSkge1xuICAgIC8vIHVwZGF0ZSBleGlzdGluZ1xuICAgIGVudHJ5LnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fbWFya0VudHJ5QXNVc2VkKGVudHJ5KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIG5ldyBlbnRyeVxuICB0aGlzLl9rZXltYXAuc2V0KGtleSwgKGVudHJ5ID0gbmV3IEVudHJ5KGtleSwgdmFsdWUpKSk7XG5cbiAgaWYgKHRoaXMubmV3ZXN0KSB7XG4gICAgLy8gbGluayBwcmV2aW91cyB0YWlsIHRvIHRoZSBuZXcgdGFpbCAoZW50cnkpXG4gICAgdGhpcy5uZXdlc3RbTkVXRVJdID0gZW50cnk7XG4gICAgZW50cnlbT0xERVJdID0gdGhpcy5uZXdlc3Q7XG4gIH0gZWxzZSB7XG4gICAgLy8gd2UncmUgZmlyc3QgaW4gLS0geWF5XG4gICAgdGhpcy5vbGRlc3QgPSBlbnRyeTtcbiAgfVxuXG4gIC8vIGFkZCBuZXcgZW50cnkgdG8gdGhlIGVuZCBvZiB0aGUgbGlua2VkIGxpc3QgLS0gaXQncyBub3cgdGhlIGZyZXNoZXN0IGVudHJ5LlxuICB0aGlzLm5ld2VzdCA9IGVudHJ5O1xuICArK3RoaXMuc2l6ZTtcbiAgaWYgKHRoaXMuc2l6ZSA+IHRoaXMubGltaXQpIHtcbiAgICAvLyB3ZSBoaXQgdGhlIGxpbWl0IC0tIHJlbW92ZSB0aGUgaGVhZFxuICAgIHRoaXMuc2hpZnQoKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS5zaGlmdCA9IGZ1bmN0aW9uKCkge1xuICAvLyB0b2RvOiBoYW5kbGUgc3BlY2lhbCBjYXNlIHdoZW4gbGltaXQgPT0gMVxuICB2YXIgZW50cnkgPSB0aGlzLm9sZGVzdDtcbiAgaWYgKGVudHJ5KSB7XG4gICAgaWYgKHRoaXMub2xkZXN0W05FV0VSXSkge1xuICAgICAgLy8gYWR2YW5jZSB0aGUgbGlzdFxuICAgICAgdGhpcy5vbGRlc3QgPSB0aGlzLm9sZGVzdFtORVdFUl07XG4gICAgICB0aGlzLm9sZGVzdFtPTERFUl0gPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBjYWNoZSBpcyBleGhhdXN0ZWRcbiAgICAgIHRoaXMub2xkZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5uZXdlc3QgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBsYXN0IHN0cm9uZyByZWZlcmVuY2UgdG8gPGVudHJ5PiBhbmQgcmVtb3ZlIGxpbmtzIGZyb20gdGhlIHB1cmdlZFxuICAgIC8vIGVudHJ5IGJlaW5nIHJldHVybmVkOlxuICAgIGVudHJ5W05FV0VSXSA9IGVudHJ5W09MREVSXSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9rZXltYXAuZGVsZXRlKGVudHJ5LmtleSk7XG4gICAgLS10aGlzLnNpemU7XG4gICAgcmV0dXJuIFtlbnRyeS5rZXksIGVudHJ5LnZhbHVlXTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRm9sbG93aW5nIGNvZGUgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgYnJlYWtpbmcgdGhlIGNvcmVcbi8vIGZ1bmN0aW9uYWxpdHkuXG5cbkxSVU1hcC5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKGtleSkge1xuICBsZXQgZSA9IHRoaXMuX2tleW1hcC5nZXQoa2V5KTtcbiAgcmV0dXJuIGUgPyBlLnZhbHVlIDogdW5kZWZpbmVkO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHtcbiAgcmV0dXJuIHRoaXMuX2tleW1hcC5oYXMoa2V5KTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gZnVuY3Rpb24oa2V5KSB7XG4gIHZhciBlbnRyeSA9IHRoaXMuX2tleW1hcC5nZXQoa2V5KTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICB0aGlzLl9rZXltYXAuZGVsZXRlKGVudHJ5LmtleSk7XG4gIGlmIChlbnRyeVtORVdFUl0gJiYgZW50cnlbT0xERVJdKSB7XG4gICAgLy8gcmVsaW5rIHRoZSBvbGRlciBlbnRyeSB3aXRoIHRoZSBuZXdlciBlbnRyeVxuICAgIGVudHJ5W09MREVSXVtORVdFUl0gPSBlbnRyeVtORVdFUl07XG4gICAgZW50cnlbTkVXRVJdW09MREVSXSA9IGVudHJ5W09MREVSXTtcbiAgfSBlbHNlIGlmIChlbnRyeVtORVdFUl0pIHtcbiAgICAvLyByZW1vdmUgdGhlIGxpbmsgdG8gdXNcbiAgICBlbnRyeVtORVdFUl1bT0xERVJdID0gdW5kZWZpbmVkO1xuICAgIC8vIGxpbmsgdGhlIG5ld2VyIGVudHJ5IHRvIGhlYWRcbiAgICB0aGlzLm9sZGVzdCA9IGVudHJ5W05FV0VSXTtcbiAgfSBlbHNlIGlmIChlbnRyeVtPTERFUl0pIHtcbiAgICAvLyByZW1vdmUgdGhlIGxpbmsgdG8gdXNcbiAgICBlbnRyeVtPTERFUl1bTkVXRVJdID0gdW5kZWZpbmVkO1xuICAgIC8vIGxpbmsgdGhlIG5ld2VyIGVudHJ5IHRvIGhlYWRcbiAgICB0aGlzLm5ld2VzdCA9IGVudHJ5W09MREVSXTtcbiAgfSBlbHNlIHsvLyBpZihlbnRyeVtPTERFUl0gPT09IHVuZGVmaW5lZCAmJiBlbnRyeS5uZXdlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5vbGRlc3QgPSB0aGlzLm5ld2VzdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRoaXMuc2l6ZS0tO1xuICByZXR1cm4gZW50cnkudmFsdWU7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7XG4gIC8vIE5vdCBjbGVhcmluZyBsaW5rcyBzaG91bGQgYmUgc2FmZSwgYXMgd2UgZG9uJ3QgZXhwb3NlIGxpdmUgbGlua3MgdG8gdXNlclxuICB0aGlzLm9sZGVzdCA9IHRoaXMubmV3ZXN0ID0gdW5kZWZpbmVkO1xuICB0aGlzLnNpemUgPSAwO1xuICB0aGlzLl9rZXltYXAuY2xlYXIoKTtcbn07XG5cblxuZnVuY3Rpb24gRW50cnlJdGVyYXRvcihvbGRlc3RFbnRyeSkgeyB0aGlzLmVudHJ5ID0gb2xkZXN0RW50cnk7IH1cbkVudHJ5SXRlcmF0b3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH1cbkVudHJ5SXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgbGV0IGVudCA9IHRoaXMuZW50cnk7XG4gIGlmIChlbnQpIHtcbiAgICB0aGlzLmVudHJ5ID0gZW50W05FV0VSXTtcbiAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IFtlbnQua2V5LCBlbnQudmFsdWVdIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICB9XG59O1xuXG5cbmZ1bmN0aW9uIEtleUl0ZXJhdG9yKG9sZGVzdEVudHJ5KSB7IHRoaXMuZW50cnkgPSBvbGRlc3RFbnRyeTsgfVxuS2V5SXRlcmF0b3IucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH1cbktleUl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gIGxldCBlbnQgPSB0aGlzLmVudHJ5O1xuICBpZiAoZW50KSB7XG4gICAgdGhpcy5lbnRyeSA9IGVudFtORVdFUl07XG4gICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnQua2V5IH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBWYWx1ZUl0ZXJhdG9yKG9sZGVzdEVudHJ5KSB7IHRoaXMuZW50cnkgPSBvbGRlc3RFbnRyeTsgfVxuVmFsdWVJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfVxuVmFsdWVJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICBsZXQgZW50ID0gdGhpcy5lbnRyeTtcbiAgaWYgKGVudCkge1xuICAgIHRoaXMuZW50cnkgPSBlbnRbTkVXRVJdO1xuICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogZW50LnZhbHVlIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICB9XG59O1xuXG5cbkxSVU1hcC5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IEtleUl0ZXJhdG9yKHRoaXMub2xkZXN0KTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUudmFsdWVzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgVmFsdWVJdGVyYXRvcih0aGlzLm9sZGVzdCk7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLmVudHJpZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKHRoaXMub2xkZXN0KTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUuZm9yRWFjaCA9IGZ1bmN0aW9uKGZ1biwgdGhpc09iaikge1xuICBpZiAodHlwZW9mIHRoaXNPYmogIT09ICdvYmplY3QnKSB7XG4gICAgdGhpc09iaiA9IHRoaXM7XG4gIH1cbiAgbGV0IGVudHJ5ID0gdGhpcy5vbGRlc3Q7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIGZ1bi5jYWxsKHRoaXNPYmosIGVudHJ5LnZhbHVlLCBlbnRyeS5rZXksIHRoaXMpO1xuICAgIGVudHJ5ID0gZW50cnlbTkVXRVJdO1xuICB9XG59O1xuXG4vKiogUmV0dXJucyBhIEpTT04gKGFycmF5KSByZXByZXNlbnRhdGlvbiAqL1xuTFJVTWFwLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHMgPSBuZXcgQXJyYXkodGhpcy5zaXplKSwgaSA9IDAsIGVudHJ5ID0gdGhpcy5vbGRlc3Q7XG4gIHdoaWxlIChlbnRyeSkge1xuICAgIHNbaSsrXSA9IHsga2V5OiBlbnRyeS5rZXksIHZhbHVlOiBlbnRyeS52YWx1ZSB9O1xuICAgIGVudHJ5ID0gZW50cnlbTkVXRVJdO1xuICB9XG4gIHJldHVybiBzO1xufTtcblxuLyoqIFJldHVybnMgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gKi9cbkxSVU1hcC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHMgPSAnJywgZW50cnkgPSB0aGlzLm9sZGVzdDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgcyArPSBTdHJpbmcoZW50cnkua2V5KSsnOicrZW50cnkudmFsdWU7XG4gICAgZW50cnkgPSBlbnRyeVtORVdFUl07XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBzICs9ICcgPCAnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcztcbn07XG5cbn0pO1xuIiwgIi8qKlxuICogc3RhY2stdHJhY2UgLSBQYXJzZXMgbm9kZS5qcyBzdGFjayB0cmFjZXNcbiAqXG4gKiBUaGlzIHdhcyBvcmlnaW5hbGx5IGZvcmtlZCB0byBmaXggdGhpcyBpc3N1ZTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mZWxpeGdlL25vZGUtc3RhY2stdHJhY2UvaXNzdWVzLzMxXG4gKlxuICogTWFyIDE5LDIwMTkgLSAjNGZkMzc5ZVxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9mZWxpeGdlL25vZGUtc3RhY2stdHJhY2UvXG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuXG4vKiogRGVjb2RlZCBTdGFja0ZyYW1lICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YWNrRnJhbWUge1xuICBmaWxlTmFtZTogc3RyaW5nO1xuICBsaW5lTnVtYmVyOiBudW1iZXI7XG4gIGZ1bmN0aW9uTmFtZTogc3RyaW5nO1xuICB0eXBlTmFtZTogc3RyaW5nO1xuICBtZXRob2ROYW1lOiBzdHJpbmc7XG4gIG5hdGl2ZTogYm9vbGVhbjtcbiAgY29sdW1uTnVtYmVyOiBudW1iZXI7XG59XG5cbi8qKiBFeHRyYWN0cyBTdGFja0ZyYW1lcyBmcm9tIHRoZSBFcnJvciAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKGVycjogRXJyb3IpOiBTdGFja0ZyYW1lW10ge1xuICBpZiAoIWVyci5zdGFjaykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzID0gZXJyLnN0YWNrLnNwbGl0KCdcXG4nKS5zbGljZSgxKTtcblxuICByZXR1cm4gbGluZXNcbiAgICAubWFwKGxpbmUgPT4ge1xuICAgICAgaWYgKGxpbmUubWF0Y2goL15cXHMqWy1dezQsfSQvKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbHVtbk51bWJlcjogbnVsbCxcbiAgICAgICAgICBmaWxlTmFtZTogbGluZSxcbiAgICAgICAgICBmdW5jdGlvbk5hbWU6IG51bGwsXG4gICAgICAgICAgbGluZU51bWJlcjogbnVsbCxcbiAgICAgICAgICBtZXRob2ROYW1lOiBudWxsLFxuICAgICAgICAgIG5hdGl2ZTogbnVsbCxcbiAgICAgICAgICB0eXBlTmFtZTogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGluZU1hdGNoID0gbGluZS5tYXRjaCgvYXQgKD86KC4rPylcXHMrXFwoKT8oPzooLis/KTooXFxkKykoPzo6KFxcZCspKT98KFteKV0rKSlcXCk/Lyk7XG4gICAgICBpZiAoIWxpbmVNYXRjaCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBsZXQgb2JqZWN0ID0gbnVsbDtcbiAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgbGV0IGZ1bmN0aW9uTmFtZSA9IG51bGw7XG4gICAgICBsZXQgdHlwZU5hbWUgPSBudWxsO1xuICAgICAgbGV0IG1ldGhvZE5hbWUgPSBudWxsO1xuICAgICAgY29uc3QgaXNOYXRpdmUgPSBsaW5lTWF0Y2hbNV0gPT09ICduYXRpdmUnO1xuXG4gICAgICBpZiAobGluZU1hdGNoWzFdKSB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZSA9IGxpbmVNYXRjaFsxXTtcbiAgICAgICAgbGV0IG1ldGhvZFN0YXJ0ID0gZnVuY3Rpb25OYW1lLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgICAgIGlmIChmdW5jdGlvbk5hbWVbbWV0aG9kU3RhcnQgLSAxXSA9PT0gJy4nKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG4gICAgICAgICAgbWV0aG9kU3RhcnQtLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0aG9kU3RhcnQgPiAwKSB7XG4gICAgICAgICAgb2JqZWN0ID0gZnVuY3Rpb25OYW1lLnN1YnN0cigwLCBtZXRob2RTdGFydCk7XG4gICAgICAgICAgbWV0aG9kID0gZnVuY3Rpb25OYW1lLnN1YnN0cihtZXRob2RTdGFydCArIDEpO1xuICAgICAgICAgIGNvbnN0IG9iamVjdEVuZCA9IG9iamVjdC5pbmRleE9mKCcuTW9kdWxlJyk7XG4gICAgICAgICAgaWYgKG9iamVjdEVuZCA+IDApIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uTmFtZS5zdWJzdHIob2JqZWN0RW5kICsgMSk7XG4gICAgICAgICAgICBvYmplY3QgPSBvYmplY3Quc3Vic3RyKDAsIG9iamVjdEVuZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHR5cGVOYW1lID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICB0eXBlTmFtZSA9IG9iamVjdDtcbiAgICAgICAgbWV0aG9kTmFtZSA9IG1ldGhvZDtcbiAgICAgIH1cblxuICAgICAgaWYgKG1ldGhvZCA9PT0gJzxhbm9ueW1vdXM+Jykge1xuICAgICAgICBtZXRob2ROYW1lID0gbnVsbDtcbiAgICAgICAgZnVuY3Rpb25OYW1lID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJvcGVydGllcyA9IHtcbiAgICAgICAgY29sdW1uTnVtYmVyOiBwYXJzZUludChsaW5lTWF0Y2hbNF0sIDEwKSB8fCBudWxsLFxuICAgICAgICBmaWxlTmFtZTogbGluZU1hdGNoWzJdIHx8IG51bGwsXG4gICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgbGluZU51bWJlcjogcGFyc2VJbnQobGluZU1hdGNoWzNdLCAxMCkgfHwgbnVsbCxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgbmF0aXZlOiBpc05hdGl2ZSxcbiAgICAgICAgdHlwZU5hbWUsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gcHJvcGVydGllcztcbiAgICB9KVxuICAgIC5maWx0ZXIoY2FsbFNpdGUgPT4gISFjYWxsU2l0ZSkgYXMgU3RhY2tGcmFtZVtdO1xufVxuIiwgImltcG9ydCB7IEV2ZW50LCBFeGNlcHRpb24sIEV4dGVuZGVkRXJyb3IsIFN0YWNrRnJhbWUgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGFkZENvbnRleHRUb0ZyYW1lLCBiYXNlbmFtZSwgZGlybmFtZSwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgTFJVTWFwIH0gZnJvbSAnbHJ1X21hcCc7XG5cbmltcG9ydCAqIGFzIHN0YWNrdHJhY2UgZnJvbSAnLi9zdGFja3RyYWNlJztcbmltcG9ydCB7IE5vZGVPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IERFRkFVTFRfTElORVNfT0ZfQ09OVEVYVDogbnVtYmVyID0gNztcbmNvbnN0IEZJTEVfQ09OVEVOVF9DQUNIRSA9IG5ldyBMUlVNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPigxMDApO1xuXG4vKipcbiAqIFJlc2V0cyB0aGUgZmlsZSBjYWNoZS4gRXhpc3RzIGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRGaWxlQ29udGVudENhY2hlKCk6IHZvaWQge1xuICBGSUxFX0NPTlRFTlRfQ0FDSEUuY2xlYXIoKTtcbn1cblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBnZXRGdW5jdGlvbihmcmFtZTogc3RhY2t0cmFjZS5TdGFja0ZyYW1lKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZnJhbWUuZnVuY3Rpb25OYW1lIHx8IGAke2ZyYW1lLnR5cGVOYW1lfS4ke2ZyYW1lLm1ldGhvZE5hbWUgfHwgJzxhbm9ueW1vdXM+J31gO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVGhpcyBzZWVtcyB0byBoYXBwZW4gc29tZXRpbWVzIHdoZW4gdXNpbmcgJ3VzZSBzdHJpY3QnLFxuICAgIC8vIHN0ZW1taW5nIGZyb20gYGdldFR5cGVOYW1lYC5cbiAgICAvLyBbVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0eSAnY29uc3RydWN0b3InIG9mIHVuZGVmaW5lZF1cbiAgICByZXR1cm4gJzxhbm9ueW1vdXM+JztcbiAgfVxufVxuXG5jb25zdCBtYWluTW9kdWxlOiBzdHJpbmcgPSBgJHsocmVxdWlyZS5tYWluICYmIHJlcXVpcmUubWFpbi5maWxlbmFtZSAmJiBkaXJuYW1lKHJlcXVpcmUubWFpbi5maWxlbmFtZSkpIHx8XG4gIGdsb2JhbC5wcm9jZXNzLmN3ZCgpfS9gO1xuXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGdldE1vZHVsZShmaWxlbmFtZTogc3RyaW5nLCBiYXNlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFiYXNlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgYmFzZSA9IG1haW5Nb2R1bGU7XG4gIH1cblxuICAvLyBJdCdzIHNwZWNpZmljYWxseSBhIG1vZHVsZVxuICBjb25zdCBmaWxlID0gYmFzZW5hbWUoZmlsZW5hbWUsICcuanMnKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGZpbGVuYW1lID0gZGlybmFtZShmaWxlbmFtZSk7XG4gIGxldCBuID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy9ub2RlX21vZHVsZXMvJyk7XG4gIGlmIChuID4gLTEpIHtcbiAgICAvLyAvbm9kZV9tb2R1bGVzLyBpcyAxNCBjaGFyc1xuICAgIHJldHVybiBgJHtmaWxlbmFtZS5zdWJzdHIobiArIDE0KS5yZXBsYWNlKC9cXC8vZywgJy4nKX06JHtmaWxlfWA7XG4gIH1cbiAgLy8gTGV0J3Mgc2VlIGlmIGl0J3MgYSBwYXJ0IG9mIHRoZSBtYWluIG1vZHVsZVxuICAvLyBUbyBiZSBhIHBhcnQgb2YgbWFpbiBtb2R1bGUsIGl0IGhhcyB0byBzaGFyZSB0aGUgc2FtZSBiYXNlXG4gIG4gPSBgJHtmaWxlbmFtZX0vYC5sYXN0SW5kZXhPZihiYXNlLCAwKTtcbiAgaWYgKG4gPT09IDApIHtcbiAgICBsZXQgbW9kdWxlTmFtZSA9IGZpbGVuYW1lLnN1YnN0cihiYXNlLmxlbmd0aCkucmVwbGFjZSgvXFwvL2csICcuJyk7XG4gICAgaWYgKG1vZHVsZU5hbWUpIHtcbiAgICAgIG1vZHVsZU5hbWUgKz0gJzonO1xuICAgIH1cbiAgICBtb2R1bGVOYW1lICs9IGZpbGU7XG4gICAgcmV0dXJuIG1vZHVsZU5hbWU7XG4gIH1cbiAgcmV0dXJuIGZpbGU7XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiByZWFkcyBmaWxlIGNvbnRlbnRzIGFuZCBjYWNoZXMgdGhlbSBpbiBhIGdsb2JhbCBMUlUgY2FjaGUuXG4gKiBSZXR1cm5zIGEgUHJvbWlzZSBmaWxlcGF0aCA9PiBjb250ZW50IGFycmF5IGZvciBhbGwgZmlsZXMgdGhhdCB3ZSB3ZXJlIGFibGUgdG8gcmVhZC5cbiAqXG4gKiBAcGFyYW0gZmlsZW5hbWVzIEFycmF5IG9mIGZpbGVwYXRocyB0byByZWFkIGNvbnRlbnQgZnJvbS5cbiAqL1xuZnVuY3Rpb24gcmVhZFNvdXJjZUZpbGVzKGZpbGVuYW1lczogc3RyaW5nW10pOiBQcm9taXNlTGlrZTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bGwgfT4ge1xuICAvLyB3ZSdyZSByZWx5aW5nIG9uIGZpbGVuYW1lcyBiZWluZyBkZS1kdXBlZCBhbHJlYWR5XG4gIGlmIChmaWxlbmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoe30pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTx7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVsbDtcbiAgfT4ocmVzb2x2ZSA9PiB7XG4gICAgY29uc3Qgc291cmNlRmlsZXM6IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bGw7XG4gICAgfSA9IHt9O1xuXG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBmaWxlbmFtZXNbaV07XG5cbiAgICAgIGNvbnN0IGNhY2hlID0gRklMRV9DT05URU5UX0NBQ0hFLmdldChmaWxlbmFtZSk7XG4gICAgICAvLyBXZSBoYXZlIGEgY2FjaGUgaGl0XG4gICAgICBpZiAoY2FjaGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBJZiBpdCdzIG5vdCBudWxsICh3aGljaCBtZWFucyB3ZSBmb3VuZCBhIGZpbGUgYW5kIGhhdmUgYSBjb250ZW50KVxuICAgICAgICAvLyB3ZSBzZXQgdGhlIGNvbnRlbnQgYW5kIHJldHVybiBpdCBsYXRlci5cbiAgICAgICAgaWYgKGNhY2hlICE9PSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZXNbZmlsZW5hbWVdID0gY2FjaGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIC8vIEluIGFueSBjYXNlIHdlIHdhbnQgdG8gc2tpcCBoZXJlIHRoZW4gc2luY2Ugd2UgaGF2ZSBhIGNvbnRlbnQgYWxyZWFkeSBvciB3ZSBjb3VsZG4ndFxuICAgICAgICAvLyByZWFkIHRoZSBmaWxlIGFuZCBkb24ndCB3YW50IHRvIHRyeSBhZ2Fpbi5cbiAgICAgICAgaWYgKGNvdW50ID09PSBmaWxlbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzb2x2ZShzb3VyY2VGaWxlcyk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHJlYWRGaWxlKGZpbGVuYW1lLCAoZXJyOiBFcnJvciB8IG51bGwsIGRhdGE6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gZXJyID8gbnVsbCA6IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgICAgc291cmNlRmlsZXNbZmlsZW5hbWVdID0gY29udGVudDtcblxuICAgICAgICAvLyBXZSBhbHdheXMgd2FudCB0byBzZXQgdGhlIGNhY2hlLCBldmVuIHRvIG51bGwgd2hpY2ggbWVhbnMgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIGZpbGUuXG4gICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIHRyeSB0byByZWFkIHRoZSBmaWxlIGFnYWluLlxuICAgICAgICBGSUxFX0NPTlRFTlRfQ0FDSEUuc2V0KGZpbGVuYW1lLCBjb250ZW50KTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzXG4gICAgICAgIGNvdW50Kys7XG4gICAgICAgIGlmIChjb3VudCA9PT0gZmlsZW5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgIHJlc29sdmUoc291cmNlRmlsZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTdGFja0Zyb21FcnJvcihlcnJvcjogRXJyb3IpOiBzdGFja3RyYWNlLlN0YWNrRnJhbWVbXSB7XG4gIGNvbnN0IHN0YWNrID0gc3RhY2t0cmFjZS5wYXJzZShlcnJvcik7XG4gIGlmICghc3RhY2spIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIHN0YWNrO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RhY2soc3RhY2s6IHN0YWNrdHJhY2UuU3RhY2tGcmFtZVtdLCBvcHRpb25zPzogTm9kZU9wdGlvbnMpOiBQcm9taXNlTGlrZTxTdGFja0ZyYW1lW10+IHtcbiAgY29uc3QgZmlsZXNUb1JlYWQ6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3QgbGluZXNPZkNvbnRleHQgPVxuICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5mcmFtZUNvbnRleHRMaW5lcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5mcmFtZUNvbnRleHRMaW5lcyA6IERFRkFVTFRfTElORVNfT0ZfQ09OVEVYVDtcblxuICBjb25zdCBmcmFtZXM6IFN0YWNrRnJhbWVbXSA9IHN0YWNrLm1hcChmcmFtZSA9PiB7XG4gICAgY29uc3QgcGFyc2VkRnJhbWU6IFN0YWNrRnJhbWUgPSB7XG4gICAgICBjb2xubzogZnJhbWUuY29sdW1uTnVtYmVyLFxuICAgICAgZmlsZW5hbWU6IGZyYW1lLmZpbGVOYW1lPy5zdGFydHNXaXRoKCdmaWxlOi8vJykgPyBmcmFtZS5maWxlTmFtZS5zdWJzdHIoNykgOiBmcmFtZS5maWxlTmFtZSB8fCAnJyxcbiAgICAgIGZ1bmN0aW9uOiBnZXRGdW5jdGlvbihmcmFtZSksXG4gICAgICBsaW5lbm86IGZyYW1lLmxpbmVOdW1iZXIsXG4gICAgfTtcblxuICAgIGNvbnN0IGlzSW50ZXJuYWwgPVxuICAgICAgZnJhbWUubmF0aXZlIHx8XG4gICAgICAocGFyc2VkRnJhbWUuZmlsZW5hbWUgJiZcbiAgICAgICAgIXBhcnNlZEZyYW1lLmZpbGVuYW1lLnN0YXJ0c1dpdGgoJy8nKSAmJlxuICAgICAgICAhcGFyc2VkRnJhbWUuZmlsZW5hbWUuc3RhcnRzV2l0aCgnLicpICYmXG4gICAgICAgIHBhcnNlZEZyYW1lLmZpbGVuYW1lLmluZGV4T2YoJzpcXFxcJykgIT09IDEpO1xuXG4gICAgLy8gaW5fYXBwIGlzIGFsbCB0aGF0J3Mgbm90IGFuIGludGVybmFsIE5vZGUgZnVuY3Rpb24gb3IgYSBtb2R1bGUgd2l0aGluIG5vZGVfbW9kdWxlc1xuICAgIC8vIG5vdGUgdGhhdCBpc05hdGl2ZSBhcHBlYXJzIHRvIHJldHVybiB0cnVlIGV2ZW4gZm9yIG5vZGUgY29yZSBsaWJyYXJpZXNcbiAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9yYXZlbi1ub2RlL2lzc3Vlcy8xNzZcbiAgICBwYXJzZWRGcmFtZS5pbl9hcHAgPVxuICAgICAgIWlzSW50ZXJuYWwgJiYgcGFyc2VkRnJhbWUuZmlsZW5hbWUgIT09IHVuZGVmaW5lZCAmJiBwYXJzZWRGcmFtZS5maWxlbmFtZS5pbmRleE9mKCdub2RlX21vZHVsZXMvJykgPT09IC0xO1xuXG4gICAgLy8gRXh0cmFjdCBhIG1vZHVsZSBuYW1lIGJhc2VkIG9uIHRoZSBmaWxlbmFtZVxuICAgIGlmIChwYXJzZWRGcmFtZS5maWxlbmFtZSkge1xuICAgICAgcGFyc2VkRnJhbWUubW9kdWxlID0gZ2V0TW9kdWxlKHBhcnNlZEZyYW1lLmZpbGVuYW1lKTtcblxuICAgICAgaWYgKCFpc0ludGVybmFsICYmIGxpbmVzT2ZDb250ZXh0ID4gMCAmJiBmaWxlc1RvUmVhZC5pbmRleE9mKHBhcnNlZEZyYW1lLmZpbGVuYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgZmlsZXNUb1JlYWQucHVzaChwYXJzZWRGcmFtZS5maWxlbmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcnNlZEZyYW1lO1xuICB9KTtcblxuICAvLyBXZSBkbyBhbiBlYXJseSByZXR1cm4gaWYgd2UgZG8gbm90IHdhbnQgdG8gZmV0Y2ggY29udGV4dCBsaWVuc1xuICBpZiAobGluZXNPZkNvbnRleHQgPD0gMCkge1xuICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKGZyYW1lcyk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhZGRQcmVQb3N0Q29udGV4dChmaWxlc1RvUmVhZCwgZnJhbWVzLCBsaW5lc09mQ29udGV4dCk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvLyBUaGlzIGhhcHBlbnMgaW4gZWxlY3Ryb24gZm9yIGV4YW1wbGUgd2hlcmUgd2UgYXJlIG5vdCBhYmxlIHRvIHJlYWQgZmlsZXMgZnJvbSBhc2FyLlxuICAgIC8vIFNvIGl0J3MgZmluZSwgd2UgcmVjb3ZlciBiZSBqdXN0IHJldHVybmluZyBhbGwgZnJhbWVzIHdpdGhvdXQgcHJlL3Bvc3QgY29udGV4dC5cbiAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZShmcmFtZXMpO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiB0cmllcyB0byByZWFkIHRoZSBzb3VyY2UgZmlsZXMgKyBhZGRpbmcgcHJlIGFuZCBwb3N0IGNvbnRleHQgKHNvdXJjZSBjb2RlKVxuICogdG8gYSBmcmFtZS5cbiAqIEBwYXJhbSBmaWxlc1RvUmVhZCBzdHJpbmdbXSBvZiBmaWxlcGF0aHNcbiAqIEBwYXJhbSBmcmFtZXMgU3RhY2tGcmFtZVtdIGNvbnRhaW5nIGFsbCBmcmFtZXNcbiAqL1xuZnVuY3Rpb24gYWRkUHJlUG9zdENvbnRleHQoXG4gIGZpbGVzVG9SZWFkOiBzdHJpbmdbXSxcbiAgZnJhbWVzOiBTdGFja0ZyYW1lW10sXG4gIGxpbmVzT2ZDb250ZXh0OiBudW1iZXIsXG4pOiBQcm9taXNlTGlrZTxTdGFja0ZyYW1lW10+IHtcbiAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxTdGFja0ZyYW1lW10+KHJlc29sdmUgPT5cbiAgICByZWFkU291cmNlRmlsZXMoZmlsZXNUb1JlYWQpLnRoZW4oc291cmNlRmlsZXMgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZnJhbWVzLm1hcChmcmFtZSA9PiB7XG4gICAgICAgIGlmIChmcmFtZS5maWxlbmFtZSAmJiBzb3VyY2VGaWxlc1tmcmFtZS5maWxlbmFtZV0pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbGluZXMgPSAoc291cmNlRmlsZXNbZnJhbWUuZmlsZW5hbWVdIGFzIHN0cmluZykuc3BsaXQoJ1xcbicpO1xuXG4gICAgICAgICAgICBhZGRDb250ZXh0VG9GcmFtZShsaW5lcywgZnJhbWUsIGxpbmVzT2ZDb250ZXh0KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBhbm9tYWx5LCBiZWluZyBkZWZlbnNpdmUgaW4gY2FzZVxuICAgICAgICAgICAgLy8gdW5saWtlbHkgdG8gZXZlciBoYXBwZW4gaW4gcHJhY3RpY2UgYnV0IGNhbiBkZWZpbml0ZWx5IGhhcHBlbiBpbiB0aGVvcnlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZyYW1lO1xuICAgICAgfSk7XG5cbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyb3I6IEVycm9yLCBvcHRpb25zPzogTm9kZU9wdGlvbnMpOiBQcm9taXNlTGlrZTxFeGNlcHRpb24+IHtcbiAgY29uc3QgbmFtZSA9IGVycm9yLm5hbWUgfHwgZXJyb3IuY29uc3RydWN0b3IubmFtZTtcbiAgY29uc3Qgc3RhY2sgPSBleHRyYWN0U3RhY2tGcm9tRXJyb3IoZXJyb3IpO1xuICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPEV4Y2VwdGlvbj4ocmVzb2x2ZSA9PlxuICAgIHBhcnNlU3RhY2soc3RhY2ssIG9wdGlvbnMpLnRoZW4oZnJhbWVzID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgc3RhY2t0cmFjZToge1xuICAgICAgICAgIGZyYW1lczogcHJlcGFyZUZyYW1lc0ZvckV2ZW50KGZyYW1lcyksXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IG5hbWUsXG4gICAgICAgIHZhbHVlOiBlcnJvci5tZXNzYWdlLFxuICAgICAgfTtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUVycm9yKGVycm9yOiBFeHRlbmRlZEVycm9yLCBvcHRpb25zPzogTm9kZU9wdGlvbnMpOiBQcm9taXNlTGlrZTxFdmVudD4ge1xuICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPEV2ZW50PihyZXNvbHZlID0+XG4gICAgZ2V0RXhjZXB0aW9uRnJvbUVycm9yKGVycm9yLCBvcHRpb25zKS50aGVuKChleGNlcHRpb246IEV4Y2VwdGlvbikgPT4ge1xuICAgICAgcmVzb2x2ZSh7XG4gICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgIHZhbHVlczogW2V4Y2VwdGlvbl0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KSxcbiAgKTtcbn1cblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoc3RhY2s6IFN0YWNrRnJhbWVbXSk6IFN0YWNrRnJhbWVbXSB7XG4gIGlmICghc3RhY2sgfHwgIXN0YWNrLmxlbmd0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxldCBsb2NhbFN0YWNrID0gc3RhY2s7XG4gIGNvbnN0IGZpcnN0RnJhbWVGdW5jdGlvbiA9IGxvY2FsU3RhY2tbMF0uZnVuY3Rpb24gfHwgJyc7XG5cbiAgaWYgKGZpcnN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdjYXB0dXJlTWVzc2FnZScpICE9PSAtMSB8fCBmaXJzdEZyYW1lRnVuY3Rpb24uaW5kZXhPZignY2FwdHVyZUV4Y2VwdGlvbicpICE9PSAtMSkge1xuICAgIGxvY2FsU3RhY2sgPSBsb2NhbFN0YWNrLnNsaWNlKDEpO1xuICB9XG5cbiAgLy8gVGhlIGZyYW1lIHdoZXJlIHRoZSBjcmFzaCBoYXBwZW5lZCwgc2hvdWxkIGJlIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBhcnJheVxuICByZXR1cm4gbG9jYWxTdGFjay5yZXZlcnNlKCk7XG59XG4iLCAiLy8gVE9ETzogUmVtb3ZlIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UgYW5kIHJlbHkgb25seSBvbiBAc2VudHJ5L2NvcmUgU0RLX1ZFUlNJT04gYW5kIFNka01ldGFkYXRhXG5leHBvcnQgY29uc3QgU0RLX05BTUUgPSAnc2VudHJ5LmphdmFzY3JpcHQubm9kZSc7XG4iLCAiaW1wb3J0IHsgQVBJLCBTREtfVkVSU0lPTiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQge1xuICBEc25Qcm90b2NvbCxcbiAgRXZlbnQsXG4gIFJlc3BvbnNlLFxuICBTZW50cnlSZXF1ZXN0LFxuICBTZW50cnlSZXF1ZXN0VHlwZSxcbiAgU2Vzc2lvbixcbiAgU2Vzc2lvbkFnZ3JlZ2F0ZXMsXG4gIFN0YXR1cyxcbiAgVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRPcHRpb25zLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciwgcGFyc2VSZXRyeUFmdGVySGVhZGVyLCBQcm9taXNlQnVmZmVyLCBTZW50cnlFcnJvciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCB7IFVSTCB9IGZyb20gJ3VybCc7XG5cbmltcG9ydCB7IFNES19OQU1FIH0gZnJvbSAnLi4vLi4vdmVyc2lvbic7XG5pbXBvcnQgeyBIVFRQTW9kdWxlIH0gZnJvbSAnLi9odHRwLW1vZHVsZSc7XG5cbmV4cG9ydCB0eXBlIFVSTFBhcnRzID0gUGljazxVUkwsICdob3N0bmFtZScgfCAncGF0aG5hbWUnIHwgJ3BvcnQnIHwgJ3Byb3RvY29sJz47XG5leHBvcnQgdHlwZSBVcmxQYXJzZXIgPSAodXJsOiBzdHJpbmcpID0+IFVSTFBhcnRzO1xuXG5jb25zdCBDQVRFR09SWV9NQVBQSU5HOiB7XG4gIFtrZXkgaW4gU2VudHJ5UmVxdWVzdFR5cGVdOiBzdHJpbmc7XG59ID0ge1xuICBldmVudDogJ2Vycm9yJyxcbiAgdHJhbnNhY3Rpb246ICd0cmFuc2FjdGlvbicsXG4gIHNlc3Npb246ICdzZXNzaW9uJyxcbiAgYXR0YWNobWVudDogJ2F0dGFjaG1lbnQnLFxufTtcblxuLyoqIEJhc2UgVHJhbnNwb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVRyYW5zcG9ydCBpbXBsZW1lbnRzIFRyYW5zcG9ydCB7XG4gIC8qKiBUaGUgQWdlbnQgdXNlZCBmb3IgY29ycmVzcG9uZGluZyB0cmFuc3BvcnQgKi9cbiAgcHVibGljIG1vZHVsZT86IEhUVFBNb2R1bGU7XG5cbiAgLyoqIFRoZSBBZ2VudCB1c2VkIGZvciBjb3JyZXNwb25kaW5nIHRyYW5zcG9ydCAqL1xuICBwdWJsaWMgY2xpZW50PzogaHR0cC5BZ2VudCB8IGh0dHBzLkFnZW50O1xuXG4gIC8qKiBBUEkgb2JqZWN0ICovXG4gIHByb3RlY3RlZCBfYXBpOiBBUEk7XG5cbiAgLyoqIEEgc2ltcGxlIGJ1ZmZlciBob2xkaW5nIGFsbCByZXF1ZXN0cy4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9idWZmZXI6IFByb21pc2VCdWZmZXI8UmVzcG9uc2U+ID0gbmV3IFByb21pc2VCdWZmZXIoMzApO1xuXG4gIC8qKiBMb2NrcyB0cmFuc3BvcnQgYWZ0ZXIgcmVjZWl2aW5nIHJhdGUgbGltaXRzIGluIGEgcmVzcG9uc2UgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9yYXRlTGltaXRzOiBSZWNvcmQ8c3RyaW5nLCBEYXRlPiA9IHt9O1xuXG4gIC8qKiBDcmVhdGUgaW5zdGFuY2UgYW5kIHNldCB0aGlzLmRzbiAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG9wdGlvbnM6IFRyYW5zcG9ydE9wdGlvbnMpIHtcbiAgICB0aGlzLl9hcGkgPSBuZXcgQVBJKG9wdGlvbnMuZHNuLCBvcHRpb25zLl9tZXRhZGF0YSwgb3B0aW9ucy50dW5uZWwpO1xuICB9XG5cbiAgLyoqIERlZmF1bHQgZnVuY3Rpb24gdXNlZCB0byBwYXJzZSBVUkxzICovXG4gIHB1YmxpYyB1cmxQYXJzZXI6IFVybFBhcnNlciA9IHVybCA9PiBuZXcgVVJMKHVybCk7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZEV2ZW50KF86IEV2ZW50KTogUHJvbWlzZUxpa2U8UmVzcG9uc2U+IHtcbiAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ1RyYW5zcG9ydCBDbGFzcyBoYXMgdG8gaW1wbGVtZW50IGBzZW5kRXZlbnRgIG1ldGhvZC4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNsb3NlKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5kcmFpbih0aW1lb3V0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyBwcm94eSBzZXR0aW5ncyBmcm9tIGNsaWVudCBvcHRpb25zIGFuZCBlbnYgdmFyaWFibGVzLlxuICAgKlxuICAgKiBIb25vcnMgYG5vX3Byb3h5YCBlbnYgdmFyaWFibGUgd2l0aCB0aGUgaGlnaGVzdCBwcmlvcml0eSB0byBhbGxvdyBmb3IgaG9zdHMgZXhjbHVzaW9uLlxuICAgKlxuICAgKiBBbiBvcmRlciBvZiBwcmlvcml0eSBmb3IgYXZhaWxhYmxlIHByb3RvY29scyBpczpcbiAgICogYGh0dHBgICA9PiBgb3B0aW9ucy5odHRwUHJveHlgIHwgYHByb2Nlc3MuZW52Lmh0dHBfcHJveHlgXG4gICAqIGBodHRwc2AgPT4gYG9wdGlvbnMuaHR0cHNQcm94eWAgfCBgb3B0aW9ucy5odHRwUHJveHlgIHwgYHByb2Nlc3MuZW52Lmh0dHBzX3Byb3h5YCB8IGBwcm9jZXNzLmVudi5odHRwX3Byb3h5YFxuICAgKi9cbiAgcHJvdGVjdGVkIF9nZXRQcm94eShwcm90b2NvbDogRHNuUHJvdG9jb2wpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHsgbm9fcHJveHksIGh0dHBfcHJveHksIGh0dHBzX3Byb3h5IH0gPSBwcm9jZXNzLmVudjtcbiAgICBjb25zdCB7IGh0dHBQcm94eSwgaHR0cHNQcm94eSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHByb3h5ID0gcHJvdG9jb2wgPT09ICdodHRwJyA/IGh0dHBQcm94eSB8fCBodHRwX3Byb3h5IDogaHR0cHNQcm94eSB8fCBodHRwUHJveHkgfHwgaHR0cHNfcHJveHkgfHwgaHR0cF9wcm94eTtcblxuICAgIGlmICghbm9fcHJveHkpIHtcbiAgICAgIHJldHVybiBwcm94eTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHRoaXMuX2FwaS5nZXREc24oKTtcbiAgICBmb3IgKGNvbnN0IG5wIG9mIG5vX3Byb3h5LnNwbGl0KCcsJykpIHtcbiAgICAgIGlmIChob3N0LmVuZHNXaXRoKG5wKSB8fCBgJHtob3N0fToke3BvcnR9YC5lbmRzV2l0aChucCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwcm94eTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgYnVpbGQgcmVxdWVzdCBvcHRpb24gb2JqZWN0IHVzZWQgYnkgcmVxdWVzdCAqL1xuICBwcm90ZWN0ZWQgX2dldFJlcXVlc3RPcHRpb25zKHVybFBhcnRzOiBVUkxQYXJ0cyk6IGh0dHAuUmVxdWVzdE9wdGlvbnMgfCBodHRwcy5SZXF1ZXN0T3B0aW9ucyB7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIC4uLnRoaXMuX2FwaS5nZXRSZXF1ZXN0SGVhZGVycyhTREtfTkFNRSwgU0RLX1ZFUlNJT04pLFxuICAgICAgLi4udGhpcy5vcHRpb25zLmhlYWRlcnMsXG4gICAgfTtcbiAgICBjb25zdCB7IGhvc3RuYW1lLCBwYXRobmFtZSwgcG9ydCwgcHJvdG9jb2wgfSA9IHVybFBhcnRzO1xuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi8zODE0NmU3MTdmZWQyZmFiZTNhYWNiNjU0MGQ4Mzk0NzVlMGNlMWM2L2xpYi9pbnRlcm5hbC91cmwuanMjTDEyNjgtTDEyOTBcbiAgICAvLyBXZSBpZ25vcmUgdGhlIHF1ZXJ5IHN0cmluZyBvbiBwdXJwb3NlXG4gICAgY29uc3QgcGF0aCA9IGAke3BhdGhuYW1lfWA7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWdlbnQ6IHRoaXMuY2xpZW50LFxuICAgICAgaGVhZGVycyxcbiAgICAgIGhvc3RuYW1lLFxuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBwYXRoLFxuICAgICAgcG9ydCxcbiAgICAgIHByb3RvY29sLFxuICAgICAgLi4uKHRoaXMub3B0aW9ucy5jYUNlcnRzICYmIHtcbiAgICAgICAgY2E6IGZzLnJlYWRGaWxlU3luYyh0aGlzLm9wdGlvbnMuY2FDZXJ0cyksXG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRpbWUgdGhhdCBnaXZlbiBjYXRlZ29yeSBpcyBkaXNhYmxlZCB1bnRpbCBmb3IgcmF0ZSBsaW1pdGluZ1xuICAgKi9cbiAgcHJvdGVjdGVkIF9kaXNhYmxlZFVudGlsKHJlcXVlc3RUeXBlOiBTZW50cnlSZXF1ZXN0VHlwZSk6IERhdGUge1xuICAgIGNvbnN0IGNhdGVnb3J5ID0gQ0FURUdPUllfTUFQUElOR1tyZXF1ZXN0VHlwZV07XG4gICAgcmV0dXJuIHRoaXMuX3JhdGVMaW1pdHNbY2F0ZWdvcnldIHx8IHRoaXMuX3JhdGVMaW1pdHMuYWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGNhdGVnb3J5IGlzIHJhdGUgbGltaXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIF9pc1JhdGVMaW1pdGVkKHJlcXVlc3RUeXBlOiBTZW50cnlSZXF1ZXN0VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZFVudGlsKHJlcXVlc3RUeXBlKSA+IG5ldyBEYXRlKERhdGUubm93KCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgaW50ZXJuYWwgX3JhdGVMaW1pdHMgZnJvbSBpbmNvbWluZyBoZWFkZXJzLiBSZXR1cm5zIHRydWUgaWYgaGVhZGVycyBjb250YWlucyBhIG5vbi1lbXB0eSByYXRlIGxpbWl0aW5nIGhlYWRlci5cbiAgICovXG4gIHByb3RlY3RlZCBfaGFuZGxlUmF0ZUxpbWl0KGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBybEhlYWRlciA9IGhlYWRlcnNbJ3gtc2VudHJ5LXJhdGUtbGltaXRzJ107XG4gICAgY29uc3QgcmFIZWFkZXIgPSBoZWFkZXJzWydyZXRyeS1hZnRlciddO1xuXG4gICAgaWYgKHJsSGVhZGVyKSB7XG4gICAgICAvLyByYXRlIGxpbWl0IGhlYWRlcnMgYXJlIG9mIHRoZSBmb3JtXG4gICAgICAvLyAgICAgPGhlYWRlcj4sPGhlYWRlcj4sLi5cbiAgICAgIC8vIHdoZXJlIGVhY2ggPGhlYWRlcj4gaXMgb2YgdGhlIGZvcm1cbiAgICAgIC8vICAgICA8cmV0cnlfYWZ0ZXI+OiA8Y2F0ZWdvcmllcz46IDxzY29wZT46IDxyZWFzb25fY29kZT5cbiAgICAgIC8vIHdoZXJlXG4gICAgICAvLyAgICAgPHJldHJ5X2FmdGVyPiBpcyBhIGRlbGF5IGluIG1zXG4gICAgICAvLyAgICAgPGNhdGVnb3JpZXM+IGlzIHRoZSBldmVudCB0eXBlKHMpIChlcnJvciwgdHJhbnNhY3Rpb24sIGV0YykgYmVpbmcgcmF0ZSBsaW1pdGVkIGFuZCBpcyBvZiB0aGUgZm9ybVxuICAgICAgLy8gICAgICAgICA8Y2F0ZWdvcnk+OzxjYXRlZ29yeT47Li4uXG4gICAgICAvLyAgICAgPHNjb3BlPiBpcyB3aGF0J3MgYmVpbmcgbGltaXRlZCAob3JnLCBwcm9qZWN0LCBvciBrZXkpIC0gaWdub3JlZCBieSBTREtcbiAgICAgIC8vICAgICA8cmVhc29uX2NvZGU+IGlzIGFuIGFyYml0cmFyeSBzdHJpbmcgbGlrZSBcIm9yZ19xdW90YVwiIC0gaWdub3JlZCBieSBTREtcbiAgICAgIGZvciAoY29uc3QgbGltaXQgb2YgcmxIZWFkZXIudHJpbSgpLnNwbGl0KCcsJykpIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGxpbWl0LnNwbGl0KCc6JywgMik7XG4gICAgICAgIGNvbnN0IGhlYWRlckRlbGF5ID0gcGFyc2VJbnQocGFyYW1ldGVyc1swXSwgMTApO1xuICAgICAgICBjb25zdCBkZWxheSA9ICghaXNOYU4oaGVhZGVyRGVsYXkpID8gaGVhZGVyRGVsYXkgOiA2MCkgKiAxMDAwOyAvLyA2MHNlYyBkZWZhdWx0XG4gICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgKHBhcmFtZXRlcnNbMV0gJiYgcGFyYW1ldGVyc1sxXS5zcGxpdCgnOycpKSB8fCBbJ2FsbCddKSB7XG4gICAgICAgICAgLy8gY2F0ZWdvcmllc0FsbG93ZWQgaXMgYWRkZWQgaGVyZSB0byBlbnN1cmUgd2UgYXJlIG9ubHkgc3RvcmluZyByYXRlIGxpbWl0cyBmb3IgY2F0ZWdvcmllcyB3ZSBzdXBwb3J0IGluIHRoaXNcbiAgICAgICAgICAvLyBzZGsgYW5kIGFueSBjYXRlZ29yaWVzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgd2lsbCBub3QgYmUgYWRkZWQgcmVkdW5kYW50bHkgdG8gdGhlIHJhdGVMaW1pdHMgb2JqZWN0XG4gICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0FsbG93ZWQgPSBbXG4gICAgICAgICAgICAuLi4oT2JqZWN0LmtleXMoQ0FURUdPUllfTUFQUElORykgYXMgW1NlbnRyeVJlcXVlc3RUeXBlXSkubWFwKGsgPT4gQ0FURUdPUllfTUFQUElOR1trXSksXG4gICAgICAgICAgICAnYWxsJyxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGlmIChjYXRlZ29yaWVzQWxsb3dlZC5pbmNsdWRlcyhjYXRlZ29yeSkpIHRoaXMuX3JhdGVMaW1pdHNbY2F0ZWdvcnldID0gbmV3IERhdGUobm93ICsgZGVsYXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHJhSGVhZGVyKSB7XG4gICAgICB0aGlzLl9yYXRlTGltaXRzLmFsbCA9IG5ldyBEYXRlKG5vdyArIHBhcnNlUmV0cnlBZnRlckhlYWRlcihub3csIHJhSGVhZGVyKSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBfc2VuZChcbiAgICBzZW50cnlSZXF1ZXN0OiBTZW50cnlSZXF1ZXN0LFxuICAgIG9yaWdpbmFsUGF5bG9hZD86IEV2ZW50IHwgU2Vzc2lvbiB8IFNlc3Npb25BZ2dyZWdhdGVzLFxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKCF0aGlzLm1vZHVsZSkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKCdObyBtb2R1bGUgYXZhaWxhYmxlJyk7XG4gICAgfVxuICAgIGlmIChvcmlnaW5hbFBheWxvYWQgJiYgdGhpcy5faXNSYXRlTGltaXRlZChzZW50cnlSZXF1ZXN0LnR5cGUpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3Qoe1xuICAgICAgICBwYXlsb2FkOiBvcmlnaW5hbFBheWxvYWQsXG4gICAgICAgIHR5cGU6IHNlbnRyeVJlcXVlc3QudHlwZSxcbiAgICAgICAgcmVhc29uOiBgVHJhbnNwb3J0IGZvciAke3NlbnRyeVJlcXVlc3QudHlwZX0gcmVxdWVzdHMgbG9ja2VkIHRpbGwgJHt0aGlzLl9kaXNhYmxlZFVudGlsKFxuICAgICAgICAgIHNlbnRyeVJlcXVlc3QudHlwZSxcbiAgICAgICAgKX0gZHVlIHRvIHRvbyBtYW55IHJlcXVlc3RzLmAsXG4gICAgICAgIHN0YXR1czogNDI5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2J1ZmZlci5hZGQoXG4gICAgICAoKSA9PlxuICAgICAgICBuZXcgUHJvbWlzZTxSZXNwb25zZT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5tb2R1bGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignTm8gbW9kdWxlIGF2YWlsYWJsZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5fZ2V0UmVxdWVzdE9wdGlvbnModGhpcy51cmxQYXJzZXIoc2VudHJ5UmVxdWVzdC51cmwpKTtcbiAgICAgICAgICBjb25zdCByZXEgPSB0aGlzLm1vZHVsZS5yZXF1ZXN0KG9wdGlvbnMsIHJlcyA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXNDb2RlID0gcmVzLnN0YXR1c0NvZGUgfHwgNTAwO1xuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gU3RhdHVzLmZyb21IdHRwQ29kZShzdGF0dXNDb2RlKTtcblxuICAgICAgICAgICAgcmVzLnNldEVuY29kaW5nKCd1dGY4Jyk7XG5cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogXCJLZXktdmFsdWUgcGFpcnMgb2YgaGVhZGVyIG5hbWVzIGFuZCB2YWx1ZXMuIEhlYWRlciBuYW1lcyBhcmUgbG93ZXItY2FzZWQuXCJcbiAgICAgICAgICAgICAqIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvaHR0cC5odG1sI2h0dHBfbWVzc2FnZV9oZWFkZXJzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCByZXRyeUFmdGVySGVhZGVyID0gcmVzLmhlYWRlcnMgPyByZXMuaGVhZGVyc1sncmV0cnktYWZ0ZXInXSA6ICcnO1xuICAgICAgICAgICAgcmV0cnlBZnRlckhlYWRlciA9IChBcnJheS5pc0FycmF5KHJldHJ5QWZ0ZXJIZWFkZXIpID8gcmV0cnlBZnRlckhlYWRlclswXSA6IHJldHJ5QWZ0ZXJIZWFkZXIpIGFzIHN0cmluZztcblxuICAgICAgICAgICAgbGV0IHJsSGVhZGVyID0gcmVzLmhlYWRlcnMgPyByZXMuaGVhZGVyc1sneC1zZW50cnktcmF0ZS1saW1pdHMnXSA6ICcnO1xuICAgICAgICAgICAgcmxIZWFkZXIgPSAoQXJyYXkuaXNBcnJheShybEhlYWRlcikgPyBybEhlYWRlclswXSA6IHJsSGVhZGVyKSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAgICAgICAgICd4LXNlbnRyeS1yYXRlLWxpbWl0cyc6IHJsSGVhZGVyLFxuICAgICAgICAgICAgICAncmV0cnktYWZ0ZXInOiByZXRyeUFmdGVySGVhZGVyLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgbGltaXRlZCA9IHRoaXMuX2hhbmRsZVJhdGVMaW1pdChoZWFkZXJzKTtcbiAgICAgICAgICAgIGlmIChsaW1pdGVkKVxuICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBgVG9vIG1hbnkgJHtzZW50cnlSZXF1ZXN0LnR5cGV9IHJlcXVlc3RzLCBiYWNraW5nIG9mZiB1bnRpbDogJHt0aGlzLl9kaXNhYmxlZFVudGlsKFxuICAgICAgICAgICAgICAgICAgc2VudHJ5UmVxdWVzdC50eXBlLFxuICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gU3RhdHVzLlN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IHN0YXR1cyB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxldCByZWplY3Rpb25NZXNzYWdlID0gYEhUVFAgRXJyb3IgKCR7c3RhdHVzQ29kZX0pYDtcbiAgICAgICAgICAgICAgaWYgKHJlcy5oZWFkZXJzICYmIHJlcy5oZWFkZXJzWyd4LXNlbnRyeS1lcnJvciddKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0aW9uTWVzc2FnZSArPSBgOiAke3Jlcy5oZWFkZXJzWyd4LXNlbnRyeS1lcnJvciddfWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBTZW50cnlFcnJvcihyZWplY3Rpb25NZXNzYWdlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEZvcmNlIHRoZSBzb2NrZXQgdG8gZHJhaW5cbiAgICAgICAgICAgIHJlcy5vbignZGF0YScsICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gRHJhaW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIC8vIERyYWluXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgICAgICByZXEuZW5kKHNlbnRyeVJlcXVlc3QuYm9keSk7XG4gICAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cbiIsICIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsICJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGRlYnVnIGluc3RhbmNlIHRvIGJlIGNvbG9yZWRcblx0KiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBBbiBBTlNJIGNvbG9yIGNvZGUgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gc2VsZWN0Q29sb3IobmFtZXNwYWNlKSB7XG5cdFx0bGV0IGhhc2ggPSAwO1xuXG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lc3BhY2UubGVuZ3RoOyBpKyspIHtcblx0XHRcdGhhc2ggPSAoKGhhc2ggPDwgNSkgLSBoYXNoKSArIG5hbWVzcGFjZS5jaGFyQ29kZUF0KGkpO1xuXHRcdFx0aGFzaCB8PSAwOyAvLyBDb252ZXJ0IHRvIDMyYml0IGludGVnZXJcblx0XHR9XG5cblx0XHRyZXR1cm4gY3JlYXRlRGVidWcuY29sb3JzW01hdGguYWJzKGhhc2gpICUgY3JlYXRlRGVidWcuY29sb3JzLmxlbmd0aF07XG5cdH1cblx0Y3JlYXRlRGVidWcuc2VsZWN0Q29sb3IgPSBzZWxlY3RDb2xvcjtcblxuXHQvKipcblx0KiBDcmVhdGUgYSBkZWJ1Z2dlciB3aXRoIHRoZSBnaXZlbiBgbmFtZXNwYWNlYC5cblx0KlxuXHQqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAcmV0dXJuIHtGdW5jdGlvbn1cblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBjcmVhdGVEZWJ1ZyhuYW1lc3BhY2UpIHtcblx0XHRsZXQgcHJldlRpbWU7XG5cdFx0bGV0IGVuYWJsZU92ZXJyaWRlID0gbnVsbDtcblx0XHRsZXQgbmFtZXNwYWNlc0NhY2hlO1xuXHRcdGxldCBlbmFibGVkQ2FjaGU7XG5cblx0XHRmdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG5cdFx0XHQvLyBEaXNhYmxlZD9cblx0XHRcdGlmICghZGVidWcuZW5hYmxlZCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHNlbGYgPSBkZWJ1ZztcblxuXHRcdFx0Ly8gU2V0IGBkaWZmYCB0aW1lc3RhbXBcblx0XHRcdGNvbnN0IGN1cnIgPSBOdW1iZXIobmV3IERhdGUoKSk7XG5cdFx0XHRjb25zdCBtcyA9IGN1cnIgLSAocHJldlRpbWUgfHwgY3Vycik7XG5cdFx0XHRzZWxmLmRpZmYgPSBtcztcblx0XHRcdHNlbGYucHJldiA9IHByZXZUaW1lO1xuXHRcdFx0c2VsZi5jdXJyID0gY3Vycjtcblx0XHRcdHByZXZUaW1lID0gY3VycjtcblxuXHRcdFx0YXJnc1swXSA9IGNyZWF0ZURlYnVnLmNvZXJjZShhcmdzWzBdKTtcblxuXHRcdFx0aWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHQvLyBBbnl0aGluZyBlbHNlIGxldCdzIGluc3BlY3Qgd2l0aCAlT1xuXHRcdFx0XHRhcmdzLnVuc2hpZnQoJyVPJyk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFwcGx5IGFueSBgZm9ybWF0dGVyc2AgdHJhbnNmb3JtYXRpb25zXG5cdFx0XHRsZXQgaW5kZXggPSAwO1xuXHRcdFx0YXJnc1swXSA9IGFyZ3NbMF0ucmVwbGFjZSgvJShbYS16QS1aJV0pL2csIChtYXRjaCwgZm9ybWF0KSA9PiB7XG5cdFx0XHRcdC8vIElmIHdlIGVuY291bnRlciBhbiBlc2NhcGVkICUgdGhlbiBkb24ndCBpbmNyZWFzZSB0aGUgYXJyYXkgaW5kZXhcblx0XHRcdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRcdFx0cmV0dXJuICclJztcblx0XHRcdFx0fVxuXHRcdFx0XHRpbmRleCsrO1xuXHRcdFx0XHRjb25zdCBmb3JtYXR0ZXIgPSBjcmVhdGVEZWJ1Zy5mb3JtYXR0ZXJzW2Zvcm1hdF07XG5cdFx0XHRcdGlmICh0eXBlb2YgZm9ybWF0dGVyID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRcdFx0Y29uc3QgdmFsID0gYXJnc1tpbmRleF07XG5cdFx0XHRcdFx0bWF0Y2ggPSBmb3JtYXR0ZXIuY2FsbChzZWxmLCB2YWwpO1xuXG5cdFx0XHRcdFx0Ly8gTm93IHdlIG5lZWQgdG8gcmVtb3ZlIGBhcmdzW2luZGV4XWAgc2luY2UgaXQncyBpbmxpbmVkIGluIHRoZSBgZm9ybWF0YFxuXHRcdFx0XHRcdGFyZ3Muc3BsaWNlKGluZGV4LCAxKTtcblx0XHRcdFx0XHRpbmRleC0tO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBtYXRjaDtcblx0XHRcdH0pO1xuXG5cdFx0XHQvLyBBcHBseSBlbnYtc3BlY2lmaWMgZm9ybWF0dGluZyAoY29sb3JzLCBldGMuKVxuXHRcdFx0Y3JlYXRlRGVidWcuZm9ybWF0QXJncy5jYWxsKHNlbGYsIGFyZ3MpO1xuXG5cdFx0XHRjb25zdCBsb2dGbiA9IHNlbGYubG9nIHx8IGNyZWF0ZURlYnVnLmxvZztcblx0XHRcdGxvZ0ZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXHRcdH1cblxuXHRcdGRlYnVnLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTtcblx0XHRkZWJ1Zy51c2VDb2xvcnMgPSBjcmVhdGVEZWJ1Zy51c2VDb2xvcnMoKTtcblx0XHRkZWJ1Zy5jb2xvciA9IGNyZWF0ZURlYnVnLnNlbGVjdENvbG9yKG5hbWVzcGFjZSk7XG5cdFx0ZGVidWcuZXh0ZW5kID0gZXh0ZW5kO1xuXHRcdGRlYnVnLmRlc3Ryb3kgPSBjcmVhdGVEZWJ1Zy5kZXN0cm95OyAvLyBYWFggVGVtcG9yYXJ5LiBXaWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkZWJ1ZywgJ2VuYWJsZWQnLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRpZiAoZW5hYmxlT3ZlcnJpZGUgIT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gZW5hYmxlT3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKG5hbWVzcGFjZXNDYWNoZSAhPT0gY3JlYXRlRGVidWcubmFtZXNwYWNlcykge1xuXHRcdFx0XHRcdG5hbWVzcGFjZXNDYWNoZSA9IGNyZWF0ZURlYnVnLm5hbWVzcGFjZXM7XG5cdFx0XHRcdFx0ZW5hYmxlZENhY2hlID0gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVuYWJsZWRDYWNoZTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cdFx0Y3JlYXRlRGVidWcubmFtZXNwYWNlcyA9IG5hbWVzcGFjZXM7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsICIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG5cdFx0Ly8gRG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGFyZ3NbMF0gPSAodGhpcy51c2VDb2xvcnMgPyAnJWMnIDogJycpICtcblx0XHR0aGlzLm5hbWVzcGFjZSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyAlYycgOiAnICcpICtcblx0XHRhcmdzWzBdICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnJWMgJyA6ICcgJykgK1xuXHRcdCcrJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cblx0aWYgKCF0aGlzLnVzZUNvbG9ycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKTtcblxuXHQvLyBUaGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuXHQvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuXHRsZXQgaW5kZXggPSAwO1xuXHRsZXQgbGFzdEMgPSAwO1xuXHRhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgbWF0Y2ggPT4ge1xuXHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpbmRleCsrO1xuXHRcdGlmIChtYXRjaCA9PT0gJyVjJykge1xuXHRcdFx0Ly8gV2Ugb25seSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgKmxhc3QqICVjXG5cdFx0XHQvLyAodGhlIHVzZXIgbWF5IGhhdmUgcHJvdmlkZWQgdGhlaXIgb3duKVxuXHRcdFx0bGFzdEMgPSBpbmRleDtcblx0XHR9XG5cdH0pO1xuXG5cdGFyZ3Muc3BsaWNlKGxhc3RDLCAwLCBjKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGBjb25zb2xlLmRlYnVnKClgIHdoZW4gYXZhaWxhYmxlLlxuICogTm8tb3Agd2hlbiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGEgXCJmdW5jdGlvblwiLlxuICogSWYgYGNvbnNvbGUuZGVidWdgIGlzIG5vdCBhdmFpbGFibGUsIGZhbGxzIGJhY2tcbiAqIHRvIGBjb25zb2xlLmxvZ2AuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuZXhwb3J0cy5sb2cgPSBjb25zb2xlLmRlYnVnIHx8IGNvbnNvbGUubG9nIHx8ICgoKSA9PiB7fSk7XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0dHJ5IHtcblx0XHRpZiAobmFtZXNwYWNlcykge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnNldEl0ZW0oJ2RlYnVnJywgbmFtZXNwYWNlcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGV4cG9ydHMuc3RvcmFnZS5yZW1vdmVJdGVtKCdkZWJ1ZycpO1xuXHRcdH1cblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbG9hZCgpIHtcblx0bGV0IHI7XG5cdHRyeSB7XG5cdFx0ciA9IGV4cG9ydHMuc3RvcmFnZS5nZXRJdGVtKCdkZWJ1ZycpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxuXG5cdC8vIElmIGRlYnVnIGlzbid0IHNldCBpbiBMUywgYW5kIHdlJ3JlIGluIEVsZWN0cm9uLCB0cnkgdG8gbG9hZCAkREVCVUdcblx0aWYgKCFyICYmIHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiAnZW52JyBpbiBwcm9jZXNzKSB7XG5cdFx0ciA9IHByb2Nlc3MuZW52LkRFQlVHO1xuXHR9XG5cblx0cmV0dXJuIHI7XG59XG5cbi8qKlxuICogTG9jYWxzdG9yYWdlIGF0dGVtcHRzIHRvIHJldHVybiB0aGUgbG9jYWxzdG9yYWdlLlxuICpcbiAqIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc2FmYXJpIHRocm93c1xuICogd2hlbiBhIHVzZXIgZGlzYWJsZXMgY29va2llcy9sb2NhbHN0b3JhZ2VcbiAqIGFuZCB5b3UgYXR0ZW1wdCB0byBhY2Nlc3MgaXQuXG4gKlxuICogQHJldHVybiB7TG9jYWxTdG9yYWdlfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gbG9jYWxzdG9yYWdlKCkge1xuXHR0cnkge1xuXHRcdC8vIFRWTUxLaXQgKEFwcGxlIFRWIEpTIFJ1bnRpbWUpIGRvZXMgbm90IGhhdmUgYSB3aW5kb3cgb2JqZWN0LCBqdXN0IGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHRcblx0XHQvLyBUaGUgQnJvd3NlciBhbHNvIGhhcyBsb2NhbFN0b3JhZ2UgaW4gdGhlIGdsb2JhbCBjb250ZXh0LlxuXHRcdHJldHVybiBsb2NhbFN0b3JhZ2U7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVqIHRvIGBKU09OLnN0cmluZ2lmeSgpYCwgc2luY2Ugbm8gV2ViIEluc3BlY3RvcnMgZG8gdGhhdCBieSBkZWZhdWx0LlxuICovXG5cbmZvcm1hdHRlcnMuaiA9IGZ1bmN0aW9uICh2KSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHJldHVybiAnW1VuZXhwZWN0ZWRKU09OUGFyc2VFcnJvcl06ICcgKyBlcnJvci5tZXNzYWdlO1xuXHR9XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSAoZmxhZywgYXJndiA9IHByb2Nlc3MuYXJndikgPT4ge1xuXHRjb25zdCBwcmVmaXggPSBmbGFnLnN0YXJ0c1dpdGgoJy0nKSA/ICcnIDogKGZsYWcubGVuZ3RoID09PSAxID8gJy0nIDogJy0tJyk7XG5cdGNvbnN0IHBvc2l0aW9uID0gYXJndi5pbmRleE9mKHByZWZpeCArIGZsYWcpO1xuXHRjb25zdCB0ZXJtaW5hdG9yUG9zaXRpb24gPSBhcmd2LmluZGV4T2YoJy0tJyk7XG5cdHJldHVybiBwb3NpdGlvbiAhPT0gLTEgJiYgKHRlcm1pbmF0b3JQb3NpdGlvbiA9PT0gLTEgfHwgcG9zaXRpb24gPCB0ZXJtaW5hdG9yUG9zaXRpb24pO1xufTtcbiIsICIndXNlIHN0cmljdCc7XG5jb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IGhhc0ZsYWcgPSByZXF1aXJlKCdoYXMtZmxhZycpO1xuXG5jb25zdCB7ZW52fSA9IHByb2Nlc3M7XG5cbmxldCBmb3JjZUNvbG9yO1xuaWYgKGhhc0ZsYWcoJ25vLWNvbG9yJykgfHxcblx0aGFzRmxhZygnbm8tY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9ZmFsc2UnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1uZXZlcicpKSB7XG5cdGZvcmNlQ29sb3IgPSAwO1xufSBlbHNlIGlmIChoYXNGbGFnKCdjb2xvcicpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9ycycpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPXRydWUnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1hbHdheXMnKSkge1xuXHRmb3JjZUNvbG9yID0gMTtcbn1cblxuaWYgKCdGT1JDRV9DT0xPUicgaW4gZW52KSB7XG5cdGlmIChlbnYuRk9SQ0VfQ09MT1IgPT09ICd0cnVlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAxO1xuXHR9IGVsc2UgaWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ2ZhbHNlJykge1xuXHRcdGZvcmNlQ29sb3IgPSAwO1xuXHR9IGVsc2Uge1xuXHRcdGZvcmNlQ29sb3IgPSBlbnYuRk9SQ0VfQ09MT1IubGVuZ3RoID09PSAwID8gMSA6IE1hdGgubWluKHBhcnNlSW50KGVudi5GT1JDRV9DT0xPUiwgMTApLCAzKTtcblx0fVxufVxuXG5mdW5jdGlvbiB0cmFuc2xhdGVMZXZlbChsZXZlbCkge1xuXHRpZiAobGV2ZWwgPT09IDApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGxldmVsLFxuXHRcdGhhc0Jhc2ljOiB0cnVlLFxuXHRcdGhhczI1NjogbGV2ZWwgPj0gMixcblx0XHRoYXMxNm06IGxldmVsID49IDNcblx0fTtcbn1cblxuZnVuY3Rpb24gc3VwcG9ydHNDb2xvcihoYXZlU3RyZWFtLCBzdHJlYW1Jc1RUWSkge1xuXHRpZiAoZm9yY2VDb2xvciA9PT0gMCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTE2bScpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9ZnVsbCcpIHx8XG5cdFx0aGFzRmxhZygnY29sb3I9dHJ1ZWNvbG9yJykpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmIChoYXNGbGFnKCdjb2xvcj0yNTYnKSkge1xuXHRcdHJldHVybiAyO1xuXHR9XG5cblx0aWYgKGhhdmVTdHJlYW0gJiYgIXN0cmVhbUlzVFRZICYmIGZvcmNlQ29sb3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Y29uc3QgbWluID0gZm9yY2VDb2xvciB8fCAwO1xuXG5cdGlmIChlbnYuVEVSTSA9PT0gJ2R1bWInKSB7XG5cdFx0cmV0dXJuIG1pbjtcblx0fVxuXG5cdGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG5cdFx0Ly8gV2luZG93cyAxMCBidWlsZCAxMDU4NiBpcyB0aGUgZmlyc3QgV2luZG93cyByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMjU2IGNvbG9ycy5cblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDE0OTMxIGlzIHRoZSBmaXJzdCByZWxlYXNlIHRoYXQgc3VwcG9ydHMgMTZtL1RydWVDb2xvci5cblx0XHRjb25zdCBvc1JlbGVhc2UgPSBvcy5yZWxlYXNlKCkuc3BsaXQoJy4nKTtcblx0XHRpZiAoXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzBdKSA+PSAxMCAmJlxuXHRcdFx0TnVtYmVyKG9zUmVsZWFzZVsyXSkgPj0gMTA1ODZcblx0XHQpIHtcblx0XHRcdHJldHVybiBOdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxNDkzMSA/IDMgOiAyO1xuXHRcdH1cblxuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDSScgaW4gZW52KSB7XG5cdFx0aWYgKFsnVFJBVklTJywgJ0NJUkNMRUNJJywgJ0FQUFZFWU9SJywgJ0dJVExBQl9DSScsICdHSVRIVUJfQUNUSU9OUycsICdCVUlMREtJVEUnXS5zb21lKHNpZ24gPT4gc2lnbiBpbiBlbnYpIHx8IGVudi5DSV9OQU1FID09PSAnY29kZXNoaXAnKSB7XG5cdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKCdURUFNQ0lUWV9WRVJTSU9OJyBpbiBlbnYpIHtcblx0XHRyZXR1cm4gL14oOVxcLigwKlsxLTldXFxkKilcXC58XFxkezIsfVxcLikvLnRlc3QoZW52LlRFQU1DSVRZX1ZFUlNJT04pID8gMSA6IDA7XG5cdH1cblxuXHRpZiAoZW52LkNPTE9SVEVSTSA9PT0gJ3RydWVjb2xvcicpIHtcblx0XHRyZXR1cm4gMztcblx0fVxuXG5cdGlmICgnVEVSTV9QUk9HUkFNJyBpbiBlbnYpIHtcblx0XHRjb25zdCB2ZXJzaW9uID0gcGFyc2VJbnQoKGVudi5URVJNX1BST0dSQU1fVkVSU0lPTiB8fCAnJykuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5cdFx0c3dpdGNoIChlbnYuVEVSTV9QUk9HUkFNKSB7XG5cdFx0XHRjYXNlICdpVGVybS5hcHAnOlxuXHRcdFx0XHRyZXR1cm4gdmVyc2lvbiA+PSAzID8gMyA6IDI7XG5cdFx0XHRjYXNlICdBcHBsZV9UZXJtaW5hbCc6XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0Ly8gTm8gZGVmYXVsdFxuXHRcdH1cblx0fVxuXG5cdGlmICgvLTI1Nihjb2xvcik/JC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoL15zY3JlZW58Xnh0ZXJtfF52dDEwMHxednQyMjB8XnJ4dnR8Y29sb3J8YW5zaXxjeWd3aW58bGludXgvaS50ZXN0KGVudi5URVJNKSkge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0aWYgKCdDT0xPUlRFUk0nIGluIGVudikge1xuXHRcdHJldHVybiAxO1xuXHR9XG5cblx0cmV0dXJuIG1pbjtcbn1cblxuZnVuY3Rpb24gZ2V0U3VwcG9ydExldmVsKHN0cmVhbSkge1xuXHRjb25zdCBsZXZlbCA9IHN1cHBvcnRzQ29sb3Ioc3RyZWFtLCBzdHJlYW0gJiYgc3RyZWFtLmlzVFRZKTtcblx0cmV0dXJuIHRyYW5zbGF0ZUxldmVsKGxldmVsKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cdHN1cHBvcnRzQ29sb3I6IGdldFN1cHBvcnRMZXZlbCxcblx0c3Rkb3V0OiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMSkpKSxcblx0c3RkZXJyOiB0cmFuc2xhdGVMZXZlbChzdXBwb3J0c0NvbG9yKHRydWUsIHR0eS5pc2F0dHkoMikpKVxufTtcbiIsICIvKipcbiAqIE1vZHVsZSBkZXBlbmRlbmNpZXMuXG4gKi9cblxuY29uc3QgdHR5ID0gcmVxdWlyZSgndHR5Jyk7XG5jb25zdCB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIE5vZGUuanMgaW1wbGVtZW50YXRpb24gb2YgYGRlYnVnKClgLlxuICovXG5cbmV4cG9ydHMuaW5pdCA9IGluaXQ7XG5leHBvcnRzLmxvZyA9IGxvZztcbmV4cG9ydHMuZm9ybWF0QXJncyA9IGZvcm1hdEFyZ3M7XG5leHBvcnRzLnNhdmUgPSBzYXZlO1xuZXhwb3J0cy5sb2FkID0gbG9hZDtcbmV4cG9ydHMudXNlQ29sb3JzID0gdXNlQ29sb3JzO1xuZXhwb3J0cy5kZXN0cm95ID0gdXRpbC5kZXByZWNhdGUoXG5cdCgpID0+IHt9LFxuXHQnSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLidcbik7XG5cbi8qKlxuICogQ29sb3JzLlxuICovXG5cbmV4cG9ydHMuY29sb3JzID0gWzYsIDIsIDMsIDQsIDUsIDFdO1xuXG50cnkge1xuXHQvLyBPcHRpb25hbCBkZXBlbmRlbmN5IChhcyBpbiwgZG9lc24ndCBuZWVkIHRvIGJlIGluc3RhbGxlZCwgTk9UIGxpa2Ugb3B0aW9uYWxEZXBlbmRlbmNpZXMgaW4gcGFja2FnZS5qc29uKVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5cdGNvbnN0IHN1cHBvcnRzQ29sb3IgPSByZXF1aXJlKCdzdXBwb3J0cy1jb2xvcicpO1xuXG5cdGlmIChzdXBwb3J0c0NvbG9yICYmIChzdXBwb3J0c0NvbG9yLnN0ZGVyciB8fCBzdXBwb3J0c0NvbG9yKS5sZXZlbCA+PSAyKSB7XG5cdFx0ZXhwb3J0cy5jb2xvcnMgPSBbXG5cdFx0XHQyMCxcblx0XHRcdDIxLFxuXHRcdFx0MjYsXG5cdFx0XHQyNyxcblx0XHRcdDMyLFxuXHRcdFx0MzMsXG5cdFx0XHQzOCxcblx0XHRcdDM5LFxuXHRcdFx0NDAsXG5cdFx0XHQ0MSxcblx0XHRcdDQyLFxuXHRcdFx0NDMsXG5cdFx0XHQ0NCxcblx0XHRcdDQ1LFxuXHRcdFx0NTYsXG5cdFx0XHQ1Nyxcblx0XHRcdDYyLFxuXHRcdFx0NjMsXG5cdFx0XHQ2OCxcblx0XHRcdDY5LFxuXHRcdFx0NzQsXG5cdFx0XHQ3NSxcblx0XHRcdDc2LFxuXHRcdFx0NzcsXG5cdFx0XHQ3OCxcblx0XHRcdDc5LFxuXHRcdFx0ODAsXG5cdFx0XHQ4MSxcblx0XHRcdDkyLFxuXHRcdFx0OTMsXG5cdFx0XHQ5OCxcblx0XHRcdDk5LFxuXHRcdFx0MTEyLFxuXHRcdFx0MTEzLFxuXHRcdFx0MTI4LFxuXHRcdFx0MTI5LFxuXHRcdFx0MTM0LFxuXHRcdFx0MTM1LFxuXHRcdFx0MTQ4LFxuXHRcdFx0MTQ5LFxuXHRcdFx0MTYwLFxuXHRcdFx0MTYxLFxuXHRcdFx0MTYyLFxuXHRcdFx0MTYzLFxuXHRcdFx0MTY0LFxuXHRcdFx0MTY1LFxuXHRcdFx0MTY2LFxuXHRcdFx0MTY3LFxuXHRcdFx0MTY4LFxuXHRcdFx0MTY5LFxuXHRcdFx0MTcwLFxuXHRcdFx0MTcxLFxuXHRcdFx0MTcyLFxuXHRcdFx0MTczLFxuXHRcdFx0MTc4LFxuXHRcdFx0MTc5LFxuXHRcdFx0MTg0LFxuXHRcdFx0MTg1LFxuXHRcdFx0MTk2LFxuXHRcdFx0MTk3LFxuXHRcdFx0MTk4LFxuXHRcdFx0MTk5LFxuXHRcdFx0MjAwLFxuXHRcdFx0MjAxLFxuXHRcdFx0MjAyLFxuXHRcdFx0MjAzLFxuXHRcdFx0MjA0LFxuXHRcdFx0MjA1LFxuXHRcdFx0MjA2LFxuXHRcdFx0MjA3LFxuXHRcdFx0MjA4LFxuXHRcdFx0MjA5LFxuXHRcdFx0MjE0LFxuXHRcdFx0MjE1LFxuXHRcdFx0MjIwLFxuXHRcdFx0MjIxXG5cdFx0XTtcblx0fVxufSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gU3dhbGxvdyAtIHdlIG9ubHkgY2FyZSBpZiBgc3VwcG9ydHMtY29sb3JgIGlzIGF2YWlsYWJsZTsgaXQgZG9lc24ndCBoYXZlIHRvIGJlLlxufVxuXG4vKipcbiAqIEJ1aWxkIHVwIHRoZSBkZWZhdWx0IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAqXG4gKiAgICQgREVCVUdfQ09MT1JTPW5vIERFQlVHX0RFUFRIPTEwIERFQlVHX1NIT1dfSElEREVOPWVuYWJsZWQgbm9kZSBzY3JpcHQuanNcbiAqL1xuXG5leHBvcnRzLmluc3BlY3RPcHRzID0gT2JqZWN0LmtleXMocHJvY2Vzcy5lbnYpLmZpbHRlcihrZXkgPT4ge1xuXHRyZXR1cm4gL15kZWJ1Z18vaS50ZXN0KGtleSk7XG59KS5yZWR1Y2UoKG9iaiwga2V5KSA9PiB7XG5cdC8vIENhbWVsLWNhc2Vcblx0Y29uc3QgcHJvcCA9IGtleVxuXHRcdC5zdWJzdHJpbmcoNilcblx0XHQudG9Mb3dlckNhc2UoKVxuXHRcdC5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgaykgPT4ge1xuXHRcdFx0cmV0dXJuIGsudG9VcHBlckNhc2UoKTtcblx0XHR9KTtcblxuXHQvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlIGludG8gSlMgdmFsdWVcblx0bGV0IHZhbCA9IHByb2Nlc3MuZW52W2tleV07XG5cdGlmICgvXih5ZXN8b258dHJ1ZXxlbmFibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSB0cnVlO1xuXHR9IGVsc2UgaWYgKC9eKG5vfG9mZnxmYWxzZXxkaXNhYmxlZCkkL2kudGVzdCh2YWwpKSB7XG5cdFx0dmFsID0gZmFsc2U7XG5cdH0gZWxzZSBpZiAodmFsID09PSAnbnVsbCcpIHtcblx0XHR2YWwgPSBudWxsO1xuXHR9IGVsc2Uge1xuXHRcdHZhbCA9IE51bWJlcih2YWwpO1xuXHR9XG5cblx0b2JqW3Byb3BdID0gdmFsO1xuXHRyZXR1cm4gb2JqO1xufSwge30pO1xuXG4vKipcbiAqIElzIHN0ZG91dCBhIFRUWT8gQ29sb3JlZCBvdXRwdXQgaXMgZW5hYmxlZCB3aGVuIGB0cnVlYC5cbiAqL1xuXG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdHJldHVybiAnY29sb3JzJyBpbiBleHBvcnRzLmluc3BlY3RPcHRzID9cblx0XHRCb29sZWFuKGV4cG9ydHMuaW5zcGVjdE9wdHMuY29sb3JzKSA6XG5cdFx0dHR5LmlzYXR0eShwcm9jZXNzLnN0ZGVyci5mZCk7XG59XG5cbi8qKlxuICogQWRkcyBBTlNJIGNvbG9yIGVzY2FwZSBjb2RlcyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGNvbnN0IHtuYW1lc3BhY2U6IG5hbWUsIHVzZUNvbG9yc30gPSB0aGlzO1xuXG5cdGlmICh1c2VDb2xvcnMpIHtcblx0XHRjb25zdCBjID0gdGhpcy5jb2xvcjtcblx0XHRjb25zdCBjb2xvckNvZGUgPSAnXFx1MDAxQlszJyArIChjIDwgOCA/IGMgOiAnODs1OycgKyBjKTtcblx0XHRjb25zdCBwcmVmaXggPSBgICAke2NvbG9yQ29kZX07MW0ke25hbWV9IFxcdTAwMUJbMG1gO1xuXG5cdFx0YXJnc1swXSA9IHByZWZpeCArIGFyZ3NbMF0uc3BsaXQoJ1xcbicpLmpvaW4oJ1xcbicgKyBwcmVmaXgpO1xuXHRcdGFyZ3MucHVzaChjb2xvckNvZGUgKyAnbSsnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKSArICdcXHUwMDFCWzBtJyk7XG5cdH0gZWxzZSB7XG5cdFx0YXJnc1swXSA9IGdldERhdGUoKSArIG5hbWUgKyAnICcgKyBhcmdzWzBdO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGdldERhdGUoKSB7XG5cdGlmIChleHBvcnRzLmluc3BlY3RPcHRzLmhpZGVEYXRlKSB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cdHJldHVybiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgKyAnICc7XG59XG5cbi8qKlxuICogSW52b2tlcyBgdXRpbC5mb3JtYXQoKWAgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cyBhbmQgd3JpdGVzIHRvIHN0ZGVyci5cbiAqL1xuXG5mdW5jdGlvbiBsb2coLi4uYXJncykge1xuXHRyZXR1cm4gcHJvY2Vzcy5zdGRlcnIud3JpdGUodXRpbC5mb3JtYXQoLi4uYXJncykgKyAnXFxuJyk7XG59XG5cbi8qKlxuICogU2F2ZSBgbmFtZXNwYWNlc2AuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBzYXZlKG5hbWVzcGFjZXMpIHtcblx0aWYgKG5hbWVzcGFjZXMpIHtcblx0XHRwcm9jZXNzLmVudi5ERUJVRyA9IG5hbWVzcGFjZXM7XG5cdH0gZWxzZSB7XG5cdFx0Ly8gSWYgeW91IHNldCBhIHByb2Nlc3MuZW52IGZpZWxkIHRvIG51bGwgb3IgdW5kZWZpbmVkLCBpdCBnZXRzIGNhc3QgdG8gdGhlXG5cdFx0Ly8gc3RyaW5nICdudWxsJyBvciAndW5kZWZpbmVkJy4gSnVzdCBkZWxldGUgaW5zdGVhZC5cblx0XHRkZWxldGUgcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cbn1cblxuLyoqXG4gKiBMb2FkIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9IHJldHVybnMgdGhlIHByZXZpb3VzbHkgcGVyc2lzdGVkIGRlYnVnIG1vZGVzXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRyZXR1cm4gcHJvY2Vzcy5lbnYuREVCVUc7XG59XG5cbi8qKlxuICogSW5pdCBsb2dpYyBmb3IgYGRlYnVnYCBpbnN0YW5jZXMuXG4gKlxuICogQ3JlYXRlIGEgbmV3IGBpbnNwZWN0T3B0c2Agb2JqZWN0IGluIGNhc2UgYHVzZUNvbG9yc2AgaXMgc2V0XG4gKiBkaWZmZXJlbnRseSBmb3IgYSBwYXJ0aWN1bGFyIGBkZWJ1Z2AgaW5zdGFuY2UuXG4gKi9cblxuZnVuY3Rpb24gaW5pdChkZWJ1Zykge1xuXHRkZWJ1Zy5pbnNwZWN0T3B0cyA9IHt9O1xuXG5cdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhleHBvcnRzLmluc3BlY3RPcHRzKTtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0ZGVidWcuaW5zcGVjdE9wdHNba2V5c1tpXV0gPSBleHBvcnRzLmluc3BlY3RPcHRzW2tleXNbaV1dO1xuXHR9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9jb21tb24nKShleHBvcnRzKTtcblxuY29uc3Qge2Zvcm1hdHRlcnN9ID0gbW9kdWxlLmV4cG9ydHM7XG5cbi8qKlxuICogTWFwICVvIHRvIGB1dGlsLmluc3BlY3QoKWAsIGFsbCBvbiBhIHNpbmdsZSBsaW5lLlxuICovXG5cbmZvcm1hdHRlcnMubyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cylcblx0XHQuc3BsaXQoJ1xcbicpXG5cdFx0Lm1hcChzdHIgPT4gc3RyLnRyaW0oKSlcblx0XHQuam9pbignICcpO1xufTtcblxuLyoqXG4gKiBNYXAgJU8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsb3dpbmcgbXVsdGlwbGUgbGluZXMgaWYgbmVlZGVkLlxuICovXG5cbmZvcm1hdHRlcnMuTyA9IGZ1bmN0aW9uICh2KSB7XG5cdHRoaXMuaW5zcGVjdE9wdHMuY29sb3JzID0gdGhpcy51c2VDb2xvcnM7XG5cdHJldHVybiB1dGlsLmluc3BlY3QodiwgdGhpcy5pbnNwZWN0T3B0cyk7XG59O1xuIiwgIi8qKlxuICogRGV0ZWN0IEVsZWN0cm9uIHJlbmRlcmVyIC8gbndqcyBwcm9jZXNzLCB3aGljaCBpcyBub2RlLCBidXQgd2Ugc2hvdWxkXG4gKiB0cmVhdCBhcyBhIGJyb3dzZXIuXG4gKi9cblxuaWYgKHR5cGVvZiBwcm9jZXNzID09PSAndW5kZWZpbmVkJyB8fCBwcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgcHJvY2Vzcy5icm93c2VyID09PSB0cnVlIHx8IHByb2Nlc3MuX19ud2pzKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9icm93c2VyLmpzJyk7XG59IGVsc2Uge1xuXHRtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbm9kZS5qcycpO1xufVxuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgImltcG9ydCB7IGV2ZW50VG9TZW50cnlSZXF1ZXN0LCBzZXNzaW9uVG9TZW50cnlSZXF1ZXN0IH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IEV2ZW50LCBSZXNwb25zZSwgU2Vzc2lvbiwgU2Vzc2lvbkFnZ3JlZ2F0ZXMsIFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5cbmltcG9ydCB7IEJhc2VUcmFuc3BvcnQgfSBmcm9tICcuL2Jhc2UnO1xuXG4vKiogTm9kZSBodHRwIG1vZHVsZSB0cmFuc3BvcnQgKi9cbmV4cG9ydCBjbGFzcyBIVFRQVHJhbnNwb3J0IGV4dGVuZHMgQmFzZVRyYW5zcG9ydCB7XG4gIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgYW5kIHNldCB0aGlzLmFnZW50ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIGNvbnN0IHByb3h5ID0gdGhpcy5fZ2V0UHJveHkoJ2h0dHAnKTtcbiAgICB0aGlzLm1vZHVsZSA9IGh0dHA7XG4gICAgdGhpcy5jbGllbnQgPSBwcm94eVxuICAgICAgPyAobmV3IChyZXF1aXJlKCdodHRwcy1wcm94eS1hZ2VudCcpKShwcm94eSkgYXMgaHR0cC5BZ2VudClcbiAgICAgIDogbmV3IGh0dHAuQWdlbnQoeyBrZWVwQWxpdmU6IGZhbHNlLCBtYXhTb2NrZXRzOiAzMCwgdGltZW91dDogMjAwMCB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNlbmRFdmVudChldmVudDogRXZlbnQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmQoZXZlbnRUb1NlbnRyeVJlcXVlc3QoZXZlbnQsIHRoaXMuX2FwaSksIGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNlbmRTZXNzaW9uKHNlc3Npb246IFNlc3Npb24gfCBTZXNzaW9uQWdncmVnYXRlcyk6IFByb21pc2VMaWtlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmQoc2Vzc2lvblRvU2VudHJ5UmVxdWVzdChzZXNzaW9uLCB0aGlzLl9hcGkpLCBzZXNzaW9uKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGV2ZW50VG9TZW50cnlSZXF1ZXN0LCBzZXNzaW9uVG9TZW50cnlSZXF1ZXN0IH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IEV2ZW50LCBSZXNwb25zZSwgU2Vzc2lvbiwgU2Vzc2lvbkFnZ3JlZ2F0ZXMsIFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcblxuaW1wb3J0IHsgQmFzZVRyYW5zcG9ydCB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKiBOb2RlIGh0dHBzIG1vZHVsZSB0cmFuc3BvcnQgKi9cbmV4cG9ydCBjbGFzcyBIVFRQU1RyYW5zcG9ydCBleHRlbmRzIEJhc2VUcmFuc3BvcnQge1xuICAvKiogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGFuZCBzZXQgdGhpcy5hZ2VudCAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG9wdGlvbnM6IFRyYW5zcG9ydE9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICBjb25zdCBwcm94eSA9IHRoaXMuX2dldFByb3h5KCdodHRwcycpO1xuICAgIHRoaXMubW9kdWxlID0gaHR0cHM7XG4gICAgdGhpcy5jbGllbnQgPSBwcm94eVxuICAgICAgPyAobmV3IChyZXF1aXJlKCdodHRwcy1wcm94eS1hZ2VudCcpKShwcm94eSkgYXMgaHR0cHMuQWdlbnQpXG4gICAgICA6IG5ldyBodHRwcy5BZ2VudCh7IGtlZXBBbGl2ZTogZmFsc2UsIG1heFNvY2tldHM6IDMwLCB0aW1lb3V0OiAyMDAwIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZEV2ZW50KGV2ZW50OiBFdmVudCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZChldmVudFRvU2VudHJ5UmVxdWVzdChldmVudCwgdGhpcy5fYXBpKSwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZFNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbiB8IFNlc3Npb25BZ2dyZWdhdGVzKTogUHJvbWlzZUxpa2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZChzZXNzaW9uVG9TZW50cnlSZXF1ZXN0KHNlc3Npb24sIHRoaXMuX2FwaSksIHNlc3Npb24pO1xuICB9XG59XG4iLCAiZXhwb3J0IHsgQmFzZVRyYW5zcG9ydCB9IGZyb20gJy4vYmFzZSc7XG5leHBvcnQgeyBIVFRQVHJhbnNwb3J0IH0gZnJvbSAnLi9odHRwJztcbmV4cG9ydCB7IEhUVFBTVHJhbnNwb3J0IH0gZnJvbSAnLi9odHRwcyc7XG4iLCAiaW1wb3J0IHsgQmFzZUJhY2tlbmQsIGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgRXZlbnQsIEV2ZW50SGludCwgTWVjaGFuaXNtLCBTZXZlcml0eSwgVHJhbnNwb3J0LCBUcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQge1xuICBhZGRFeGNlcHRpb25NZWNoYW5pc20sXG4gIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZSxcbiAgRHNuLFxuICBleHRyYWN0RXhjZXB0aW9uS2V5c0Zvck1lc3NhZ2UsXG4gIGlzRXJyb3IsXG4gIGlzUGxhaW5PYmplY3QsXG4gIG5vcm1hbGl6ZVRvU2l6ZSxcbiAgU3luY1Byb21pc2UsXG59IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBleHRyYWN0U3RhY2tGcm9tRXJyb3IsIHBhcnNlRXJyb3IsIHBhcnNlU3RhY2ssIHByZXBhcmVGcmFtZXNGb3JFdmVudCB9IGZyb20gJy4vcGFyc2Vycyc7XG5pbXBvcnQgeyBIVFRQU1RyYW5zcG9ydCwgSFRUUFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0cyc7XG5pbXBvcnQgeyBOb2RlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFRoZSBTZW50cnkgTm9kZSBTREsgQmFja2VuZC5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVCYWNrZW5kIGV4dGVuZHMgQmFzZUJhY2tlbmQ8Tm9kZU9wdGlvbnM+IHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICBwdWJsaWMgZXZlbnRGcm9tRXhjZXB0aW9uKGV4Y2VwdGlvbjogYW55LCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGxldCBleDogYW55ID0gZXhjZXB0aW9uO1xuICAgIGNvbnN0IHByb3ZpZGVkTWVjaGFuaXNtOiBNZWNoYW5pc20gfCB1bmRlZmluZWQgPVxuICAgICAgaGludCAmJiBoaW50LmRhdGEgJiYgKGhpbnQuZGF0YSBhcyB7IG1lY2hhbmlzbTogTWVjaGFuaXNtIH0pLm1lY2hhbmlzbTtcbiAgICBjb25zdCBtZWNoYW5pc206IE1lY2hhbmlzbSA9IHByb3ZpZGVkTWVjaGFuaXNtIHx8IHtcbiAgICAgIGhhbmRsZWQ6IHRydWUsXG4gICAgICB0eXBlOiAnZ2VuZXJpYycsXG4gICAgfTtcblxuICAgIGlmICghaXNFcnJvcihleGNlcHRpb24pKSB7XG4gICAgICBpZiAoaXNQbGFpbk9iamVjdChleGNlcHRpb24pKSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBncm91cCBldmVudHMgYmFzZWQgb24gdG9wLWxldmVsIGtleXNcbiAgICAgICAgLy8gd2hpY2ggaXMgbXVjaCBiZXR0ZXIgdGhhbiBjcmVhdGluZyBuZXcgZ3JvdXAgd2hlbiBhbnkga2V5L3ZhbHVlIGNoYW5nZVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gYE5vbi1FcnJvciBleGNlcHRpb24gY2FwdHVyZWQgd2l0aCBrZXlzOiAke2V4dHJhY3RFeGNlcHRpb25LZXlzRm9yTWVzc2FnZShleGNlcHRpb24pfWA7XG5cbiAgICAgICAgZ2V0Q3VycmVudEh1YigpLmNvbmZpZ3VyZVNjb3BlKHNjb3BlID0+IHtcbiAgICAgICAgICBzY29wZS5zZXRFeHRyYSgnX19zZXJpYWxpemVkX18nLCBub3JtYWxpemVUb1NpemUoZXhjZXB0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4ID0gKGhpbnQgJiYgaGludC5zeW50aGV0aWNFeGNlcHRpb24pIHx8IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgKGV4IGFzIEVycm9yKS5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaGFuZGxlcyB3aGVuIHNvbWVvbmUgZG9lczogYHRocm93IFwic29tZXRoaW5nIGF3ZXNvbWVcIjtgXG4gICAgICAgIC8vIFdlIHVzZSBzeW50aGVzaXplZCBFcnJvciBoZXJlIHNvIHdlIGNhbiBleHRyYWN0IGEgKHJvdWdoKSBzdGFjayB0cmFjZS5cbiAgICAgICAgZXggPSAoaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikgfHwgbmV3IEVycm9yKGV4Y2VwdGlvbiBhcyBzdHJpbmcpO1xuICAgICAgICAoZXggYXMgRXJyb3IpLm1lc3NhZ2UgPSBleGNlcHRpb247XG4gICAgICB9XG4gICAgICBtZWNoYW5pc20uc3ludGhldGljID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPEV2ZW50PigocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgICAgcGFyc2VFcnJvcihleCBhcyBFcnJvciwgdGhpcy5fb3B0aW9ucylcbiAgICAgICAgLnRoZW4oZXZlbnQgPT4ge1xuICAgICAgICAgIGFkZEV4Y2VwdGlvblR5cGVWYWx1ZShldmVudCwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgICAgICAgIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbShldmVudCwgbWVjaGFuaXNtKTtcblxuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgICBldmVudF9pZDogaGludCAmJiBoaW50LmV2ZW50X2lkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihudWxsLCByZWplY3QpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBldmVudEZyb21NZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgbGV2ZWw6IFNldmVyaXR5ID0gU2V2ZXJpdHkuSW5mbywgaGludD86IEV2ZW50SGludCk6IFByb21pc2VMaWtlPEV2ZW50PiB7XG4gICAgY29uc3QgZXZlbnQ6IEV2ZW50ID0ge1xuICAgICAgZXZlbnRfaWQ6IGhpbnQgJiYgaGludC5ldmVudF9pZCxcbiAgICAgIGxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxFdmVudD4ocmVzb2x2ZSA9PiB7XG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5hdHRhY2hTdGFja3RyYWNlICYmIGhpbnQgJiYgaGludC5zeW50aGV0aWNFeGNlcHRpb24pIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbiA/IGV4dHJhY3RTdGFja0Zyb21FcnJvcihoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikgOiBbXTtcbiAgICAgICAgdm9pZCBwYXJzZVN0YWNrKHN0YWNrLCB0aGlzLl9vcHRpb25zKVxuICAgICAgICAgIC50aGVuKGZyYW1lcyA9PiB7XG4gICAgICAgICAgICBldmVudC5zdGFja3RyYWNlID0ge1xuICAgICAgICAgICAgICBmcmFtZXM6IHByZXBhcmVGcmFtZXNGb3JFdmVudChmcmFtZXMpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc29sdmUoZXZlbnQpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4obnVsbCwgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJvdGVjdGVkIF9zZXR1cFRyYW5zcG9ydCgpOiBUcmFuc3BvcnQge1xuICAgIGlmICghdGhpcy5fb3B0aW9ucy5kc24pIHtcbiAgICAgIC8vIFdlIHJldHVybiB0aGUgbm9vcCB0cmFuc3BvcnQgaGVyZSBpbiBjYXNlIHRoZXJlIGlzIG5vIERzbi5cbiAgICAgIHJldHVybiBzdXBlci5fc2V0dXBUcmFuc3BvcnQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkc24gPSBuZXcgRHNuKHRoaXMuX29wdGlvbnMuZHNuKTtcblxuICAgIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnM6IFRyYW5zcG9ydE9wdGlvbnMgPSB7XG4gICAgICAuLi50aGlzLl9vcHRpb25zLnRyYW5zcG9ydE9wdGlvbnMsXG4gICAgICAuLi4odGhpcy5fb3B0aW9ucy5odHRwUHJveHkgJiYgeyBodHRwUHJveHk6IHRoaXMuX29wdGlvbnMuaHR0cFByb3h5IH0pLFxuICAgICAgLi4uKHRoaXMuX29wdGlvbnMuaHR0cHNQcm94eSAmJiB7IGh0dHBzUHJveHk6IHRoaXMuX29wdGlvbnMuaHR0cHNQcm94eSB9KSxcbiAgICAgIC4uLih0aGlzLl9vcHRpb25zLmNhQ2VydHMgJiYgeyBjYUNlcnRzOiB0aGlzLl9vcHRpb25zLmNhQ2VydHMgfSksXG4gICAgICBkc246IHRoaXMuX29wdGlvbnMuZHNuLFxuICAgICAgdHVubmVsOiB0aGlzLl9vcHRpb25zLnR1bm5lbCxcbiAgICAgIF9tZXRhZGF0YTogdGhpcy5fb3B0aW9ucy5fbWV0YWRhdGEsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLl9vcHRpb25zLnRyYW5zcG9ydCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLl9vcHRpb25zLnRyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKGRzbi5wcm90b2NvbCA9PT0gJ2h0dHAnKSB7XG4gICAgICByZXR1cm4gbmV3IEhUVFBUcmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSFRUUFNUcmFuc3BvcnQodHJhbnNwb3J0T3B0aW9ucyk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBCYXNlQ2xpZW50LCBTY29wZSwgU0RLX1ZFUlNJT04gfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgU2Vzc2lvbkZsdXNoZXIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBFdmVudCwgRXZlbnRIaW50LCBSZXF1ZXN0U2Vzc2lvblN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IE5vZGVCYWNrZW5kIH0gZnJvbSAnLi9iYWNrZW5kJztcbmltcG9ydCB7IE5vZGVPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIFNlbnRyeSBOb2RlIFNESyBDbGllbnQuXG4gKlxuICogQHNlZSBOb2RlT3B0aW9ucyBmb3IgZG9jdW1lbnRhdGlvbiBvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAc2VlIFNlbnRyeUNsaWVudCBmb3IgdXNhZ2UgZG9jdW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vZGVDbGllbnQgZXh0ZW5kcyBCYXNlQ2xpZW50PE5vZGVCYWNrZW5kLCBOb2RlT3B0aW9ucz4ge1xuICBwcm90ZWN0ZWQgX3Nlc3Npb25GbHVzaGVyOiBTZXNzaW9uRmx1c2hlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBOb2RlIFNESyBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGlzIFNESy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBOb2RlT3B0aW9ucykge1xuICAgIG9wdGlvbnMuX21ldGFkYXRhID0gb3B0aW9ucy5fbWV0YWRhdGEgfHwge307XG4gICAgb3B0aW9ucy5fbWV0YWRhdGEuc2RrID0gb3B0aW9ucy5fbWV0YWRhdGEuc2RrIHx8IHtcbiAgICAgIG5hbWU6ICdzZW50cnkuamF2YXNjcmlwdC5ub2RlJyxcbiAgICAgIHBhY2thZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnbnBtOkBzZW50cnkvbm9kZScsXG4gICAgICAgICAgdmVyc2lvbjogU0RLX1ZFUlNJT04sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdmVyc2lvbjogU0RLX1ZFUlNJT04sXG4gICAgfTtcblxuICAgIHN1cGVyKE5vZGVCYWNrZW5kLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgcHVibGljIGNhcHR1cmVFeGNlcHRpb24oZXhjZXB0aW9uOiBhbnksIGhpbnQ/OiBFdmVudEhpbnQsIHNjb3BlPzogU2NvcGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIC8vIENoZWNrIGlmIHRoZSBmbGFnIGBhdXRvU2Vzc2lvblRyYWNraW5nYCBpcyBlbmFibGVkLCBhbmQgaWYgYF9zZXNzaW9uRmx1c2hlcmAgZXhpc3RzIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGlzZWQgb25seVxuICAgIC8vIHdoZW4gdGhlIGByZXF1ZXN0SGFuZGxlcmAgbWlkZGxld2FyZSBpcyB1c2VkLCBhbmQgaGVuY2UgdGhlIGV4cGVjdGF0aW9uIGlzIHRvIGhhdmUgU2Vzc2lvbkFnZ3JlZ2F0ZXMgcGF5bG9hZFxuICAgIC8vIHNlbnQgdG8gdGhlIFNlcnZlciBvbmx5IHdoZW4gdGhlIGByZXF1ZXN0SGFuZGxlcmAgbWlkZGxld2FyZSBpcyB1c2VkXG4gICAgaWYgKHRoaXMuX29wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZyAmJiB0aGlzLl9zZXNzaW9uRmx1c2hlciAmJiBzY29wZSkge1xuICAgICAgY29uc3QgcmVxdWVzdFNlc3Npb24gPSBzY29wZS5nZXRSZXF1ZXN0U2Vzc2lvbigpO1xuXG4gICAgICAvLyBOZWNlc3NhcnkgY2hlY2tzIHRvIGVuc3VyZSB0aGlzIGlzIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgb25seSB3aXRoaW4gYSByZXF1ZXN0XG4gICAgICAvLyBTaG91bGQgb3ZlcnJpZGUgdGhlIHN0YXR1cyBvbmx5IGlmIGByZXF1ZXN0U2Vzc2lvbi5zdGF0dXNgIGlzIGBPa2AsIHdoaWNoIGlzIGl0cyBpbml0aWFsIHN0YWdlXG4gICAgICBpZiAocmVxdWVzdFNlc3Npb24gJiYgcmVxdWVzdFNlc3Npb24uc3RhdHVzID09PSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5Paykge1xuICAgICAgICByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgPSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5FcnJvcmVkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5jYXB0dXJlRXhjZXB0aW9uKGV4Y2VwdGlvbiwgaGludCwgc2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZUV2ZW50KGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZsYWcgYGF1dG9TZXNzaW9uVHJhY2tpbmdgIGlzIGVuYWJsZWQsIGFuZCBpZiBgX3Nlc3Npb25GbHVzaGVyYCBleGlzdHMgYmVjYXVzZSBpdCBpcyBpbml0aWFsaXNlZCBvbmx5XG4gICAgLy8gd2hlbiB0aGUgYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIHVzZWQsIGFuZCBoZW5jZSB0aGUgZXhwZWN0YXRpb24gaXMgdG8gaGF2ZSBTZXNzaW9uQWdncmVnYXRlcyBwYXlsb2FkXG4gICAgLy8gc2VudCB0byB0aGUgU2VydmVyIG9ubHkgd2hlbiB0aGUgYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIHVzZWRcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5hdXRvU2Vzc2lvblRyYWNraW5nICYmIHRoaXMuX3Nlc3Npb25GbHVzaGVyICYmIHNjb3BlKSB7XG4gICAgICBjb25zdCBldmVudFR5cGUgPSBldmVudC50eXBlIHx8ICdleGNlcHRpb24nO1xuICAgICAgY29uc3QgaXNFeGNlcHRpb24gPVxuICAgICAgICBldmVudFR5cGUgPT09ICdleGNlcHRpb24nICYmIGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMubGVuZ3RoID4gMDtcblxuICAgICAgLy8gSWYgdGhlIGV2ZW50IGlzIG9mIHR5cGUgRXhjZXB0aW9uLCB0aGVuIGEgcmVxdWVzdCBzZXNzaW9uIHNob3VsZCBiZSBjYXB0dXJlZFxuICAgICAgaWYgKGlzRXhjZXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RTZXNzaW9uID0gc2NvcGUuZ2V0UmVxdWVzdFNlc3Npb24oKTtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGlzIGhhcHBlbmluZyB3aXRoaW4gdGhlIGJvdW5kcyBvZiBhIHJlcXVlc3QsIGFuZCBtYWtlIHN1cmUgbm90IHRvIG92ZXJyaWRlXG4gICAgICAgIC8vIFNlc3Npb24gU3RhdHVzIGlmIEVycm9yZWQgLyBDcmFzaGVkXG4gICAgICAgIGlmIChyZXF1ZXN0U2Vzc2lvbiAmJiByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgPT09IFJlcXVlc3RTZXNzaW9uU3RhdHVzLk9rKSB7XG4gICAgICAgICAgcmVxdWVzdFNlc3Npb24uc3RhdHVzID0gUmVxdWVzdFNlc3Npb25TdGF0dXMuRXJyb3JlZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5jYXB0dXJlRXZlbnQoZXZlbnQsIGhpbnQsIHNjb3BlKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAaW5oZXJpdGRvY1xuICAgKi9cbiAgcHVibGljIGNsb3NlKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgdGhpcy5fc2Vzc2lvbkZsdXNoZXI/LmNsb3NlKCk7XG4gICAgcmV0dXJuIHN1cGVyLmNsb3NlKHRpbWVvdXQpO1xuICB9XG5cbiAgLyoqIE1ldGhvZCB0aGF0IGluaXRpYWxpc2VzIGFuIGluc3RhbmNlIG9mIFNlc3Npb25GbHVzaGVyIG9uIENsaWVudCAqL1xuICBwdWJsaWMgaW5pdFNlc3Npb25GbHVzaGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IHsgcmVsZWFzZSwgZW52aXJvbm1lbnQgfSA9IHRoaXMuX29wdGlvbnM7XG4gICAgaWYgKCFyZWxlYXNlKSB7XG4gICAgICBsb2dnZXIud2FybignQ2Fubm90IGluaXRpYWxpc2UgYW4gaW5zdGFuY2Ugb2YgU2Vzc2lvbkZsdXNoZXIgaWYgbm8gcmVsZWFzZSBpcyBwcm92aWRlZCEnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2Vzc2lvbkZsdXNoZXIgPSBuZXcgU2Vzc2lvbkZsdXNoZXIodGhpcy5nZXRUcmFuc3BvcnQoKSwge1xuICAgICAgICByZWxlYXNlLFxuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJvdGVjdGVkIF9wcmVwYXJlRXZlbnQoZXZlbnQ6IEV2ZW50LCBzY29wZT86IFNjb3BlLCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPiB7XG4gICAgZXZlbnQucGxhdGZvcm0gPSBldmVudC5wbGF0Zm9ybSB8fCAnbm9kZSc7XG4gICAgaWYgKHRoaXMuZ2V0T3B0aW9ucygpLnNlcnZlck5hbWUpIHtcbiAgICAgIGV2ZW50LnNlcnZlcl9uYW1lID0gdGhpcy5nZXRPcHRpb25zKCkuc2VydmVyTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLl9wcmVwYXJlRXZlbnQoZXZlbnQsIHNjb3BlLCBoaW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgcmVzcG9uc2libGUgZm9yIGNhcHR1cmluZy9lbmRpbmcgYSByZXF1ZXN0IHNlc3Npb24gYnkgY2FsbGluZyBgaW5jcmVtZW50U2Vzc2lvblN0YXR1c0NvdW50YCB0byBpbmNyZW1lbnRcbiAgICogYXBwcm9wcmlhdGUgc2Vzc2lvbiBhZ2dyZWdhdGVzIGJ1Y2tldFxuICAgKi9cbiAgcHJvdGVjdGVkIF9jYXB0dXJlUmVxdWVzdFNlc3Npb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9zZXNzaW9uRmx1c2hlcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ0Rpc2NhcmRlZCByZXF1ZXN0IG1vZGUgc2Vzc2lvbiBiZWNhdXNlIGF1dG9TZXNzaW9uVHJhY2tpbmcgb3B0aW9uIHdhcyBkaXNhYmxlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRmx1c2hlci5pbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnQoKTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IEludGVncmF0aW9uLCBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICd1dGlsJztcblxuLyoqIENvbnNvbGUgbW9kdWxlIGludGVncmF0aW9uICovXG5leHBvcnQgY2xhc3MgQ29uc29sZSBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnQ29uc29sZSc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gQ29uc29sZS5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBsZXZlbCBvZiBbJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvcicsICdsb2cnXSkge1xuICAgICAgZmlsbChjb25zb2xlLCBsZXZlbCwgY3JlYXRlQ29uc29sZVdyYXBwZXIobGV2ZWwpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcGVyIGZ1bmN0aW9uIHRoYXQnbGwgYmUgdXNlZCBmb3IgZXZlcnkgY29uc29sZSBsZXZlbFxuICovXG5mdW5jdGlvbiBjcmVhdGVDb25zb2xlV3JhcHBlcihsZXZlbDogc3RyaW5nKTogKG9yaWdpbmFsQ29uc29sZU1ldGhvZDogKCkgPT4gdm9pZCkgPT4gdm9pZCB7XG4gIHJldHVybiBmdW5jdGlvbiBjb25zb2xlV3JhcHBlcihvcmlnaW5hbENvbnNvbGVNZXRob2Q6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICBsZXQgc2VudHJ5TGV2ZWw6IFNldmVyaXR5O1xuXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnZGVidWcnOlxuICAgICAgICBzZW50cnlMZXZlbCA9IFNldmVyaXR5LkRlYnVnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgc2VudHJ5TGV2ZWwgPSBTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpbmZvJzpcbiAgICAgICAgc2VudHJ5TGV2ZWwgPSBTZXZlcml0eS5JbmZvO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgICBzZW50cnlMZXZlbCA9IFNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgc2VudHJ5TGV2ZWwgPSBTZXZlcml0eS5Mb2c7XG4gICAgfVxuXG4gICAgLyogZXNsaW50LWRpc2FibGUgcHJlZmVyLXJlc3QtcGFyYW1zICovXG4gICAgcmV0dXJuIGZ1bmN0aW9uKHRoaXM6IHR5cGVvZiBjb25zb2xlKTogdm9pZCB7XG4gICAgICBpZiAoZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKENvbnNvbGUpKSB7XG4gICAgICAgIGdldEN1cnJlbnRIdWIoKS5hZGRCcmVhZGNydW1iKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiAnY29uc29sZScsXG4gICAgICAgICAgICBsZXZlbDogc2VudHJ5TGV2ZWwsXG4gICAgICAgICAgICBtZXNzYWdlOiB1dGlsLmZvcm1hdC5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbnB1dDogWy4uLmFyZ3VtZW50c10sXG4gICAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBvcmlnaW5hbENvbnNvbGVNZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIC8qIGVzbGludC1lbmFibGUgcHJlZmVyLXJlc3QtcGFyYW1zICovXG4gIH07XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBwYXJzZVNlbXZlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCB7IFVSTCB9IGZyb20gJ3VybCc7XG5cbmNvbnN0IE5PREVfVkVSU0lPTiA9IHBhcnNlU2VtdmVyKHByb2Nlc3MudmVyc2lvbnMubm9kZSk7XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdXJsIHBvaW50cyB0byBTZW50cnkgc2VydmVyXG4gKiBAcGFyYW0gdXJsIHVybCB0byB2ZXJpZnlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VudHJ5UmVxdWVzdCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBkc24gPSBnZXRDdXJyZW50SHViKClcbiAgICAuZ2V0Q2xpZW50KClcbiAgICA/LmdldERzbigpO1xuICByZXR1cm4gZHNuID8gdXJsLmluY2x1ZGVzKGRzbi5ob3N0KSA6IGZhbHNlO1xufVxuXG4vKipcbiAqIEFzc2VtYmxlIGEgVVJMIHRvIGJlIHVzZWQgZm9yIGJyZWFkY3J1bWJzIGFuZCBzcGFucy5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgUmVxdWVzdE9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudCBwYXJ0cyBmb3IgYSBVUkxcbiAqIEByZXR1cm5zIEZ1bGx5LWZvcm1lZCBVUkxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RVcmwocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKTogc3RyaW5nIHtcbiAgY29uc3QgcHJvdG9jb2wgPSByZXF1ZXN0T3B0aW9ucy5wcm90b2NvbCB8fCAnJztcbiAgY29uc3QgaG9zdG5hbWUgPSByZXF1ZXN0T3B0aW9ucy5ob3N0bmFtZSB8fCByZXF1ZXN0T3B0aW9ucy5ob3N0IHx8ICcnO1xuICAvLyBEb24ndCBsb2cgc3RhbmRhcmQgOjgwIChodHRwKSBhbmQgOjQ0MyAoaHR0cHMpIHBvcnRzIHRvIHJlZHVjZSB0aGUgbm9pc2VcbiAgY29uc3QgcG9ydCA9XG4gICAgIXJlcXVlc3RPcHRpb25zLnBvcnQgfHwgcmVxdWVzdE9wdGlvbnMucG9ydCA9PT0gODAgfHwgcmVxdWVzdE9wdGlvbnMucG9ydCA9PT0gNDQzID8gJycgOiBgOiR7cmVxdWVzdE9wdGlvbnMucG9ydH1gO1xuICBjb25zdCBwYXRoID0gcmVxdWVzdE9wdGlvbnMucGF0aCA/IHJlcXVlc3RPcHRpb25zLnBhdGggOiAnLyc7XG5cbiAgcmV0dXJuIGAke3Byb3RvY29sfS8vJHtob3N0bmFtZX0ke3BvcnR9JHtwYXRofWA7XG59XG5cbi8qKlxuICogSGFuZGxlIHZhcmlvdXMgZWRnZSBjYXNlcyBpbiB0aGUgc3BhbiBkZXNjcmlwdGlvbiAoZm9yIHNwYW5zIHJlcHJlc2VudGluZyBodHRwKHMpIHJlcXVlc3RzKS5cbiAqXG4gKiBAcGFyYW0gZGVzY3JpcHRpb24gY3VycmVudCBgZGVzY3JpcHRpb25gIHByb3BlcnR5IG9mIHRoZSBzcGFuIHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdFxuICogQHBhcmFtIHJlcXVlc3RPcHRpb25zIENvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIHJlcXVlc3RcbiAqIEBwYXJhbSBSZXF1ZXN0IFJlcXVlc3Qgb2JqZWN0XG4gKlxuICogQHJldHVybnMgVGhlIGNsZWFuZWQgZGVzY3JpcHRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuU3BhbkRlc2NyaXB0aW9uKFxuICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICByZXF1ZXN0T3B0aW9uczogUmVxdWVzdE9wdGlvbnMsXG4gIHJlcXVlc3Q6IGh0dHAuQ2xpZW50UmVxdWVzdCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIG5vdGhpbmcgdG8gY2xlYW5cbiAgaWYgKCFkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiBkZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgbGV0IFttZXRob2QsIHJlcXVlc3RVcmxdID0gZGVzY3JpcHRpb24uc3BsaXQoJyAnKTtcblxuICAvLyBzdXBlcmFnZW50IHN0aWNrcyB0aGUgcHJvdG9jb2wgaW4gYSB3ZWlyZCBwbGFjZSAod2UgY2hlY2sgZm9yIGhvc3QgYmVjYXVzZSBpZiBib3RoIGhvc3QgKmFuZCogcHJvdG9jb2wgYXJlIG1pc3NpbmcsXG4gIC8vIHdlJ3JlIGxpa2VseSBkZWFsaW5nIHdpdGggYW4gaW50ZXJuYWwgcm91dGUgYW5kIHRoaXMgZG9lc24ndCBhcHBseSlcbiAgaWYgKHJlcXVlc3RPcHRpb25zLmhvc3QgJiYgIXJlcXVlc3RPcHRpb25zLnByb3RvY29sKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJlcXVlc3RPcHRpb25zLnByb3RvY29sID0gKHJlcXVlc3QgYXMgYW55KT8uYWdlbnQ/LnByb3RvY29sOyAvLyB3b3JzdCBjb21lcyB0byB3b3JzdCwgdGhpcyBpcyB1bmRlZmluZWQgYW5kIG5vdGhpbmcgY2hhbmdlc1xuICAgIHJlcXVlc3RVcmwgPSBleHRyYWN0VXJsKHJlcXVlc3RPcHRpb25zKTtcbiAgfVxuXG4gIC8vIGludGVybmFsIHJvdXRlcyBjYW4gZW5kIHVwIHN0YXJ0aW5nIHdpdGggYSB0cmlwbGUgc2xhc2ggcmF0aGVyIHRoYW4gYSBzaW5nbGUgb25lXG4gIGlmIChyZXF1ZXN0VXJsPy5zdGFydHNXaXRoKCcvLy8nKSkge1xuICAgIHJlcXVlc3RVcmwgPSByZXF1ZXN0VXJsLnNsaWNlKDIpO1xuICB9XG5cbiAgcmV0dXJuIGAke21ldGhvZH0gJHtyZXF1ZXN0VXJsfWA7XG59XG5cbi8vIHRoZSBub2RlIHR5cGVzIGFyZSBtaXNzaW5nIGEgZmV3IHByb3BlcnRpZXMgd2hpY2ggbm9kZSdzIGB1cmxUb09wdGlvbnNgIGZ1bmN0aW9uIHNwaXRzIG91dFxuZXhwb3J0IHR5cGUgUmVxdWVzdE9wdGlvbnMgPSBodHRwLlJlcXVlc3RPcHRpb25zICYgeyBoYXNoPzogc3RyaW5nOyBzZWFyY2g/OiBzdHJpbmc7IHBhdGhuYW1lPzogc3RyaW5nOyBocmVmPzogc3RyaW5nIH07XG50eXBlIFJlcXVlc3RDYWxsYmFjayA9IChyZXNwb25zZTogaHR0cC5JbmNvbWluZ01lc3NhZ2UpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBSZXF1ZXN0TWV0aG9kQXJncyA9XG4gIHwgW1JlcXVlc3RPcHRpb25zIHwgc3RyaW5nIHwgVVJMLCBSZXF1ZXN0Q2FsbGJhY2s/XVxuICB8IFtzdHJpbmcgfCBVUkwsIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0Q2FsbGJhY2s/XTtcbmV4cG9ydCB0eXBlIFJlcXVlc3RNZXRob2QgPSAoLi4uYXJnczogUmVxdWVzdE1ldGhvZEFyZ3MpID0+IGh0dHAuQ2xpZW50UmVxdWVzdDtcblxuLyoqXG4gKiBDb252ZXJ0IGEgVVJMIG9iamVjdCBpbnRvIGEgUmVxdWVzdE9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIENvcGllZCBmcm9tIE5vZGUncyBpbnRlcm5hbHMgKHdoZXJlIGl0J3MgdXNlZCBpbiBodHRwKHMpLnJlcXVlc3QoKSBhbmQgaHR0cChzKS5nZXQoKSksIG1vZGlmaWVkIG9ubHkgdG8gdXNlIHRoZVxuICogUmVxdWVzdE9wdGlvbnMgdHlwZSBhYm92ZS5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2Jsb2IvbWFzdGVyL2xpYi9pbnRlcm5hbC91cmwuanMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cmxUb09wdGlvbnModXJsOiBVUkwpOiBSZXF1ZXN0T3B0aW9ucyB7XG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zID0ge1xuICAgIHByb3RvY29sOiB1cmwucHJvdG9jb2wsXG4gICAgaG9zdG5hbWU6XG4gICAgICB0eXBlb2YgdXJsLmhvc3RuYW1lID09PSAnc3RyaW5nJyAmJiB1cmwuaG9zdG5hbWUuc3RhcnRzV2l0aCgnWycpID8gdXJsLmhvc3RuYW1lLnNsaWNlKDEsIC0xKSA6IHVybC5ob3N0bmFtZSxcbiAgICBoYXNoOiB1cmwuaGFzaCxcbiAgICBzZWFyY2g6IHVybC5zZWFyY2gsXG4gICAgcGF0aG5hbWU6IHVybC5wYXRobmFtZSxcbiAgICBwYXRoOiBgJHt1cmwucGF0aG5hbWUgfHwgJyd9JHt1cmwuc2VhcmNoIHx8ICcnfWAsXG4gICAgaHJlZjogdXJsLmhyZWYsXG4gIH07XG4gIGlmICh1cmwucG9ydCAhPT0gJycpIHtcbiAgICBvcHRpb25zLnBvcnQgPSBOdW1iZXIodXJsLnBvcnQpO1xuICB9XG4gIGlmICh1cmwudXNlcm5hbWUgfHwgdXJsLnBhc3N3b3JkKSB7XG4gICAgb3B0aW9ucy5hdXRoID0gYCR7dXJsLnVzZXJuYW1lfToke3VybC5wYXNzd29yZH1gO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBpbnB1dHMgdG8gYGh0dHAocykucmVxdWVzdCgpYCBhbmQgYGh0dHAocykuZ2V0KClgLlxuICpcbiAqIExlZ2FsIGlucHV0cyB0byBgaHR0cChzKS5yZXF1ZXN0KClgIGFuZCBgaHR0cChzKS5nZXQoKWAgY2FuIHRha2Ugb25lIG9mIHRlbiBmb3JtczpcbiAqICAgICBbIFJlcXVlc3RPcHRpb25zIHwgc3RyaW5nIHwgVVJMIF0sXG4gKiAgICAgWyBSZXF1ZXN0T3B0aW9ucyB8IHN0cmluZyB8IFVSTCwgUmVxdWVzdENhbGxiYWNrIF0sXG4gKiAgICAgWyBzdHJpbmcgfCBVUkwsIFJlcXVlc3RPcHRpb25zIF0sIGFuZFxuICogICAgIFsgc3RyaW5nIHwgVVJMLCBSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdENhbGxiYWNrIF0uXG4gKlxuICogVGhpcyBzdGFuZGFyZGl6ZXMgdG8gb25lIG9mIHR3byBmb3JtczogWyBSZXF1ZXN0T3B0aW9ucyBdIGFuZCBbIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0Q2FsbGJhY2sgXS4gQSBzaW1pbGFyIHRoaW5nIGlzXG4gKiBkb25lIGFzIHRoZSBmaXJzdCBzdGVwIG9mIGBodHRwKHMpLnJlcXVlc3QoKWAgYW5kIGBodHRwKHMpLmdldCgpYDsgdGhpcyBqdXN0IGRvZXMgaXQgZWFybHkgc28gdGhhdCB3ZSBjYW4gaW50ZXJhY3RcbiAqIHdpdGggdGhlIGFyZ3MgaW4gYSBzdGFuZGFyZCB3YXkuXG4gKlxuICogQHBhcmFtIHJlcXVlc3RBcmdzIFRoZSBpbnB1dHMgdG8gYGh0dHAocykucmVxdWVzdCgpYCBvciBgaHR0cChzKS5nZXQoKWAsIGFzIGFuIGFycmF5LlxuICpcbiAqIEByZXR1cm5zIEVxdWl2YWxlbnQgYXJncyBvZiB0aGUgZm9ybSBbIFJlcXVlc3RPcHRpb25zIF0gb3IgWyBSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdENhbGxiYWNrIF0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVSZXF1ZXN0QXJncyhcbiAgaHR0cE1vZHVsZTogdHlwZW9mIGh0dHAgfCB0eXBlb2YgaHR0cHMsXG4gIHJlcXVlc3RBcmdzOiBSZXF1ZXN0TWV0aG9kQXJncyxcbik6IFtSZXF1ZXN0T3B0aW9uc10gfCBbUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RDYWxsYmFja10ge1xuICBsZXQgY2FsbGJhY2ssIHJlcXVlc3RPcHRpb25zO1xuXG4gIC8vIHBvcCBvZmYgdGhlIGNhbGxiYWNrLCBpZiB0aGVyZSBpcyBvbmVcbiAgaWYgKHR5cGVvZiByZXF1ZXN0QXJnc1tyZXF1ZXN0QXJncy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gcmVxdWVzdEFyZ3MucG9wKCkgYXMgUmVxdWVzdENhbGxiYWNrO1xuICB9XG5cbiAgLy8gY3JlYXRlIGEgUmVxdWVzdE9wdGlvbnMgb2JqZWN0IG9mIHdoYXRldmVyJ3MgYXQgaW5kZXggMFxuICBpZiAodHlwZW9mIHJlcXVlc3RBcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgIHJlcXVlc3RPcHRpb25zID0gdXJsVG9PcHRpb25zKG5ldyBVUkwocmVxdWVzdEFyZ3NbMF0pKTtcbiAgfSBlbHNlIGlmIChyZXF1ZXN0QXJnc1swXSBpbnN0YW5jZW9mIFVSTCkge1xuICAgIHJlcXVlc3RPcHRpb25zID0gdXJsVG9PcHRpb25zKHJlcXVlc3RBcmdzWzBdKTtcbiAgfSBlbHNlIHtcbiAgICByZXF1ZXN0T3B0aW9ucyA9IHJlcXVlc3RBcmdzWzBdO1xuICB9XG5cbiAgLy8gaWYgdGhlIG9wdGlvbnMgd2VyZSBnaXZlbiBzZXBhcmF0ZWx5IGZyb20gdGhlIFVSTCwgZm9sZCB0aGVtIGluXG4gIGlmIChyZXF1ZXN0QXJncy5sZW5ndGggPT09IDIpIHtcbiAgICByZXF1ZXN0T3B0aW9ucyA9IHsgLi4ucmVxdWVzdE9wdGlvbnMsIC4uLnJlcXVlc3RBcmdzWzFdIH07XG4gIH1cblxuICAvLyBGaWd1cmUgb3V0IHRoZSBwcm90b2NvbCBpZiBpdCdzIGN1cnJlbnRseSBtaXNzaW5nXG4gIGlmIChyZXF1ZXN0T3B0aW9ucy5wcm90b2NvbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gV29yc3QgY2FzZSB3ZSBlbmQgdXAgcG9wdWxhdGluZyBwcm90b2NvbCB3aXRoIHVuZGVmaW5lZCwgd2hpY2ggaXQgYWxyZWFkeSBpc1xuICAgIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG4gICAgLy8gTk9URTogUHJpb3IgdG8gTm9kZSA5LCBgaHR0cHNgIHVzZWQgaW50ZXJuYWxzIG9mIGBodHRwYCBtb2R1bGUsIHRodXMgd2UgZG9uJ3QgcGF0Y2ggaXQuXG4gICAgLy8gQmVjYXVzZSBvZiB0aGF0LCB3ZSBjYW5ub3QgcmVseSBvbiBgaHR0cE1vZHVsZWAgdG8gcHJvdmlkZSB1cyB3aXRoIHZhbGlkIHByb3RvY29sLFxuICAgIC8vIGFzIGl0IHdpbGwgYWx3YXlzIHJldHVybiBgaHR0cGAsIGV2ZW4gd2hlbiB1c2luZyBgaHR0cHNgIG1vZHVsZS5cbiAgICAvL1xuICAgIC8vIFNlZSB0ZXN0L2ludGVncmF0aW9ucy9odHRwLnRlc3QudHMgZm9yIG1vcmUgZGV0YWlscyBvbiBOb2RlIDw9djggcHJvdG9jb2wgaXNzdWUuXG4gICAgaWYgKE5PREVfVkVSU0lPTi5tYWpvciAmJiBOT0RFX1ZFUlNJT04ubWFqb3IgPiA4KSB7XG4gICAgICByZXF1ZXN0T3B0aW9ucy5wcm90b2NvbCA9XG4gICAgICAgIChodHRwTW9kdWxlPy5nbG9iYWxBZ2VudCBhcyBhbnkpPy5wcm90b2NvbCB8fFxuICAgICAgICAocmVxdWVzdE9wdGlvbnMuYWdlbnQgYXMgYW55KT8ucHJvdG9jb2wgfHxcbiAgICAgICAgKHJlcXVlc3RPcHRpb25zLl9kZWZhdWx0QWdlbnQgYXMgYW55KT8ucHJvdG9jb2w7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zLnByb3RvY29sID1cbiAgICAgICAgKHJlcXVlc3RPcHRpb25zLmFnZW50IGFzIGFueSk/LnByb3RvY29sIHx8XG4gICAgICAgIChyZXF1ZXN0T3B0aW9ucy5fZGVmYXVsdEFnZW50IGFzIGFueSk/LnByb3RvY29sIHx8XG4gICAgICAgIChodHRwTW9kdWxlPy5nbG9iYWxBZ2VudCBhcyBhbnkpPy5wcm90b2NvbDtcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbiAgfVxuXG4gIC8vIHJldHVybiBhcmdzIGluIHN0YW5kYXJkaXplZCBmb3JtXG4gIGlmIChjYWxsYmFjaykge1xuICAgIHJldHVybiBbcmVxdWVzdE9wdGlvbnMsIGNhbGxiYWNrXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW3JlcXVlc3RPcHRpb25zXTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgSW50ZWdyYXRpb24sIFNwYW4gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGZpbGwsIGxvZ2dlciwgcGFyc2VTZW12ZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tICdodHRwcyc7XG5cbmltcG9ydCB7XG4gIGNsZWFuU3BhbkRlc2NyaXB0aW9uLFxuICBleHRyYWN0VXJsLFxuICBpc1NlbnRyeVJlcXVlc3QsXG4gIG5vcm1hbGl6ZVJlcXVlc3RBcmdzLFxuICBSZXF1ZXN0TWV0aG9kLFxuICBSZXF1ZXN0TWV0aG9kQXJncyxcbn0gZnJvbSAnLi91dGlscy9odHRwJztcblxuY29uc3QgTk9ERV9WRVJTSU9OID0gcGFyc2VTZW12ZXIocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuLyoqIGh0dHAgbW9kdWxlIGludGVncmF0aW9uICovXG5leHBvcnQgY2xhc3MgSHR0cCBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnSHR0cCc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gSHR0cC5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2JyZWFkY3J1bWJzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdHJhY2luZzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGJyZWFkY3J1bWJzPzogYm9vbGVhbjsgdHJhY2luZz86IGJvb2xlYW4gfSA9IHt9KSB7XG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSB0eXBlb2Ygb3B0aW9ucy5icmVhZGNydW1icyA9PT0gJ3VuZGVmaW5lZCcgPyB0cnVlIDogb3B0aW9ucy5icmVhZGNydW1icztcbiAgICB0aGlzLl90cmFjaW5nID0gdHlwZW9mIG9wdGlvbnMudHJhY2luZyA9PT0gJ3VuZGVmaW5lZCcgPyBmYWxzZSA6IG9wdGlvbnMudHJhY2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICAvLyBObyBuZWVkIHRvIGluc3RydW1lbnQgaWYgd2UgZG9uJ3Qgd2FudCB0byB0cmFjayBhbnl0aGluZ1xuICAgIGlmICghdGhpcy5fYnJlYWRjcnVtYnMgJiYgIXRoaXMuX3RyYWNpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGVkSGFuZGxlck1ha2VyID0gX2NyZWF0ZVdyYXBwZWRSZXF1ZXN0TWV0aG9kRmFjdG9yeSh0aGlzLl9icmVhZGNydW1icywgdGhpcy5fdHJhY2luZyk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgIGNvbnN0IGh0dHBNb2R1bGUgPSByZXF1aXJlKCdodHRwJyk7XG4gICAgZmlsbChodHRwTW9kdWxlLCAnZ2V0Jywgd3JhcHBlZEhhbmRsZXJNYWtlcik7XG4gICAgZmlsbChodHRwTW9kdWxlLCAncmVxdWVzdCcsIHdyYXBwZWRIYW5kbGVyTWFrZXIpO1xuXG4gICAgLy8gTk9URTogUHJpb3IgdG8gTm9kZSA5LCBgaHR0cHNgIHVzZWQgaW50ZXJuYWxzIG9mIGBodHRwYCBtb2R1bGUsIHRodXMgd2UgZG9uJ3QgcGF0Y2ggaXQuXG4gICAgLy8gSWYgd2UgZG8sIHdlJ2QgZ2V0IGRvdWJsZSBicmVhZGNydW1icyBhbmQgZG91YmxlIHNwYW5zIGZvciBgaHR0cHNgIGNhbGxzLlxuICAgIC8vIEl0IGhhcyBiZWVuIGNoYW5nZWQgaW4gTm9kZSA5LCBzbyBmb3IgYWxsIHZlcnNpb25zIGVxdWFsIGFuZCBhYm92ZSwgd2UgcGF0Y2ggYGh0dHBzYCBzZXBhcmF0ZWx5LlxuICAgIGlmIChOT0RFX1ZFUlNJT04ubWFqb3IgJiYgTk9ERV9WRVJTSU9OLm1ham9yID4gOCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby12YXItcmVxdWlyZXNcbiAgICAgIGNvbnN0IGh0dHBzTW9kdWxlID0gcmVxdWlyZSgnaHR0cHMnKTtcbiAgICAgIGZpbGwoaHR0cHNNb2R1bGUsICdnZXQnLCB3cmFwcGVkSGFuZGxlck1ha2VyKTtcbiAgICAgIGZpbGwoaHR0cHNNb2R1bGUsICdyZXF1ZXN0Jywgd3JhcHBlZEhhbmRsZXJNYWtlcik7XG4gICAgfVxuICB9XG59XG5cbi8vIGZvciBlYXNlIG9mIHJlYWRpbmcgYmVsb3dcbnR5cGUgT3JpZ2luYWxSZXF1ZXN0TWV0aG9kID0gUmVxdWVzdE1ldGhvZDtcbnR5cGUgV3JhcHBlZFJlcXVlc3RNZXRob2QgPSBSZXF1ZXN0TWV0aG9kO1xudHlwZSBXcmFwcGVkUmVxdWVzdE1ldGhvZEZhY3RvcnkgPSAob3JpZ2luYWw6IE9yaWdpbmFsUmVxdWVzdE1ldGhvZCkgPT4gV3JhcHBlZFJlcXVlc3RNZXRob2Q7XG5cbi8qKlxuICogRnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhIGZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgd3JhcHBlZCB2ZXJzaW9ucyBvZiBpbnRlcm5hbCBgcmVxdWVzdGAgYW5kIGBnZXRgIGNhbGxzIHdpdGhpbiBgaHR0cGBcbiAqIGFuZCBgaHR0cHNgIG1vZHVsZXMuIChOQjogTm90IGEgdHlwbyAtIHRoaXMgaXMgYSBjcmVhdG9yXjIhKVxuICpcbiAqIEBwYXJhbSBicmVhZGNydW1ic0VuYWJsZWQgV2hldGhlciBvciBub3QgdG8gcmVjb3JkIG91dGdvaW5nIHJlcXVlc3RzIGFzIGJyZWFkY3J1bWJzXG4gKiBAcGFyYW0gdHJhY2luZ0VuYWJsZWQgV2hldGhlciBvciBub3QgdG8gcmVjb3JkIG91dGdvaW5nIHJlcXVlc3RzIGFzIHRyYWNpbmcgc3BhbnNcbiAqXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdHMgdGhlIGV4aXRpbmcgaGFuZGxlciBhbmQgcmV0dXJucyBhIHdyYXBwZWQgaGFuZGxlclxuICovXG5mdW5jdGlvbiBfY3JlYXRlV3JhcHBlZFJlcXVlc3RNZXRob2RGYWN0b3J5KFxuICBicmVhZGNydW1ic0VuYWJsZWQ6IGJvb2xlYW4sXG4gIHRyYWNpbmdFbmFibGVkOiBib29sZWFuLFxuKTogV3JhcHBlZFJlcXVlc3RNZXRob2RGYWN0b3J5IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXBwZWRSZXF1ZXN0TWV0aG9kRmFjdG9yeShvcmlnaW5hbFJlcXVlc3RNZXRob2Q6IE9yaWdpbmFsUmVxdWVzdE1ldGhvZCk6IFdyYXBwZWRSZXF1ZXN0TWV0aG9kIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlZE1ldGhvZCh0aGlzOiB0eXBlb2YgaHR0cCB8IHR5cGVvZiBodHRwcywgLi4uYXJnczogUmVxdWVzdE1ldGhvZEFyZ3MpOiBodHRwLkNsaWVudFJlcXVlc3Qge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICBjb25zdCBodHRwTW9kdWxlID0gdGhpcztcblxuICAgICAgY29uc3QgcmVxdWVzdEFyZ3MgPSBub3JtYWxpemVSZXF1ZXN0QXJncyh0aGlzLCBhcmdzKTtcbiAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gcmVxdWVzdEFyZ3NbMF07XG4gICAgICBjb25zdCByZXF1ZXN0VXJsID0gZXh0cmFjdFVybChyZXF1ZXN0T3B0aW9ucyk7XG5cbiAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gcmVjb3JkIHJlcXVlc3RzIHRvIFNlbnRyeSBhcyBlaXRoZXIgYnJlYWRjcnVtYnMgb3Igc3BhbnMsIHNvIGp1c3QgdXNlIHRoZSBvcmlnaW5hbCBtZXRob2RcbiAgICAgIGlmIChpc1NlbnRyeVJlcXVlc3QocmVxdWVzdFVybCkpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsUmVxdWVzdE1ldGhvZC5hcHBseShodHRwTW9kdWxlLCByZXF1ZXN0QXJncyk7XG4gICAgICB9XG5cbiAgICAgIGxldCBzcGFuOiBTcGFuIHwgdW5kZWZpbmVkO1xuICAgICAgbGV0IHBhcmVudFNwYW46IFNwYW4gfCB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudEh1YigpLmdldFNjb3BlKCk7XG4gICAgICBpZiAoc2NvcGUgJiYgdHJhY2luZ0VuYWJsZWQpIHtcbiAgICAgICAgcGFyZW50U3BhbiA9IHNjb3BlLmdldFNwYW4oKTtcbiAgICAgICAgaWYgKHBhcmVudFNwYW4pIHtcbiAgICAgICAgICBzcGFuID0gcGFyZW50U3Bhbi5zdGFydENoaWxkKHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgJHtyZXF1ZXN0T3B0aW9ucy5tZXRob2QgfHwgJ0dFVCd9ICR7cmVxdWVzdFVybH1gLFxuICAgICAgICAgICAgb3A6ICdodHRwLmNsaWVudCcsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCBzZW50cnlUcmFjZUhlYWRlciA9IHNwYW4udG9UcmFjZXBhcmVudCgpO1xuICAgICAgICAgIGxvZ2dlci5sb2coXG4gICAgICAgICAgICBgW1RyYWNpbmddIEFkZGluZyBzZW50cnktdHJhY2UgaGVhZGVyICR7c2VudHJ5VHJhY2VIZWFkZXJ9IHRvIG91dGdvaW5nIHJlcXVlc3QgdG8gJHtyZXF1ZXN0VXJsfTogYCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7IC4uLnJlcXVlc3RPcHRpb25zLmhlYWRlcnMsICdzZW50cnktdHJhY2UnOiBzZW50cnlUcmFjZUhlYWRlciB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIHJldHVybiBvcmlnaW5hbFJlcXVlc3RNZXRob2RcbiAgICAgICAgLmFwcGx5KGh0dHBNb2R1bGUsIHJlcXVlc3RBcmdzKVxuICAgICAgICAub25jZSgncmVzcG9uc2UnLCBmdW5jdGlvbih0aGlzOiBodHRwLkNsaWVudFJlcXVlc3QsIHJlczogaHR0cC5JbmNvbWluZ01lc3NhZ2UpOiB2b2lkIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgICAgICBjb25zdCByZXEgPSB0aGlzO1xuICAgICAgICAgIGlmIChicmVhZGNydW1ic0VuYWJsZWQpIHtcbiAgICAgICAgICAgIGFkZFJlcXVlc3RCcmVhZGNydW1iKCdyZXNwb25zZScsIHJlcXVlc3RVcmwsIHJlcSwgcmVzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyYWNpbmdFbmFibGVkICYmIHNwYW4pIHtcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICBzcGFuLnNldEh0dHBTdGF0dXMocmVzLnN0YXR1c0NvZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bhbi5kZXNjcmlwdGlvbiA9IGNsZWFuU3BhbkRlc2NyaXB0aW9uKHNwYW4uZGVzY3JpcHRpb24sIHJlcXVlc3RPcHRpb25zLCByZXEpO1xuICAgICAgICAgICAgc3Bhbi5maW5pc2goKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbmNlKCdlcnJvcicsIGZ1bmN0aW9uKHRoaXM6IGh0dHAuQ2xpZW50UmVxdWVzdCk6IHZvaWQge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgIGNvbnN0IHJlcSA9IHRoaXM7XG5cbiAgICAgICAgICBpZiAoYnJlYWRjcnVtYnNFbmFibGVkKSB7XG4gICAgICAgICAgICBhZGRSZXF1ZXN0QnJlYWRjcnVtYignZXJyb3InLCByZXF1ZXN0VXJsLCByZXEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJhY2luZ0VuYWJsZWQgJiYgc3Bhbikge1xuICAgICAgICAgICAgc3Bhbi5zZXRIdHRwU3RhdHVzKDUwMCk7XG4gICAgICAgICAgICBzcGFuLmRlc2NyaXB0aW9uID0gY2xlYW5TcGFuRGVzY3JpcHRpb24oc3Bhbi5kZXNjcmlwdGlvbiwgcmVxdWVzdE9wdGlvbnMsIHJlcSk7XG4gICAgICAgICAgICBzcGFuLmZpbmlzaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBDYXB0dXJlcyBCcmVhZGNydW1iIGJhc2VkIG9uIHByb3ZpZGVkIHJlcXVlc3QvcmVzcG9uc2UgcGFpclxuICovXG5mdW5jdGlvbiBhZGRSZXF1ZXN0QnJlYWRjcnVtYihldmVudDogc3RyaW5nLCB1cmw6IHN0cmluZywgcmVxOiBodHRwLkNsaWVudFJlcXVlc3QsIHJlcz86IGh0dHAuSW5jb21pbmdNZXNzYWdlKTogdm9pZCB7XG4gIGlmICghZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKEh0dHApKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoXG4gICAge1xuICAgICAgY2F0ZWdvcnk6ICdodHRwJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgbWV0aG9kOiByZXEubWV0aG9kLFxuICAgICAgICBzdGF0dXNfY29kZTogcmVzICYmIHJlcy5zdGF0dXNDb2RlLFxuICAgICAgICB1cmwsXG4gICAgICB9LFxuICAgICAgdHlwZTogJ2h0dHAnLFxuICAgIH0sXG4gICAge1xuICAgICAgZXZlbnQsXG4gICAgICByZXF1ZXN0OiByZXEsXG4gICAgICByZXNwb25zZTogcmVzLFxuICAgIH0sXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBmb3JnZXQsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBOb2RlQ2xpZW50IH0gZnJvbSAnLi4vLi4vY2xpZW50JztcblxuY29uc3QgREVGQVVMVF9TSFVURE9XTl9USU1FT1VUID0gMjAwMDtcblxuLyoqXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2dBbmRFeGl0UHJvY2VzcyhlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5lcnJvcihlcnJvciAmJiBlcnJvci5zdGFjayA/IGVycm9yLnN0YWNrIDogZXJyb3IpO1xuXG4gIGNvbnN0IGNsaWVudCA9IGdldEN1cnJlbnRIdWIoKS5nZXRDbGllbnQ8Tm9kZUNsaWVudD4oKTtcblxuICBpZiAoY2xpZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICBsb2dnZXIud2FybignTm8gTm9kZUNsaWVudCB3YXMgZGVmaW5lZCwgd2UgYXJlIGV4aXRpbmcgdGhlIHByb2Nlc3Mgbm93LicpO1xuICAgIGdsb2JhbC5wcm9jZXNzLmV4aXQoMSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IGNsaWVudC5nZXRPcHRpb25zKCk7XG4gIGNvbnN0IHRpbWVvdXQgPVxuICAgIChvcHRpb25zICYmIG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0ICYmIG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0ID4gMCAmJiBvcHRpb25zLnNodXRkb3duVGltZW91dCkgfHxcbiAgICBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVQ7XG4gIGZvcmdldChcbiAgICBjbGllbnQuY2xvc2UodGltZW91dCkudGhlbigocmVzdWx0OiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICBsb2dnZXIud2FybignV2UgcmVhY2hlZCB0aGUgdGltZW91dCBmb3IgZW1wdHlpbmcgdGhlIHJlcXVlc3QgYnVmZmVyLCBzdGlsbCBleGl0aW5nIG5vdyEnKTtcbiAgICAgIH1cbiAgICAgIGdsb2JhbC5wcm9jZXNzLmV4aXQoMSk7XG4gICAgfSksXG4gICk7XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgU2NvcGUgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgSW50ZWdyYXRpb24sIFNldmVyaXR5IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgTm9kZUNsaWVudCB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgeyBsb2dBbmRFeGl0UHJvY2VzcyB9IGZyb20gJy4vdXRpbHMvZXJyb3JoYW5kbGluZyc7XG5cbnR5cGUgT25GYXRhbEVycm9ySGFuZGxlciA9IChmaXJzdEVycm9yOiBFcnJvciwgc2Vjb25kRXJyb3I/OiBFcnJvcikgPT4gdm9pZDtcblxuLyoqIEdsb2JhbCBQcm9taXNlIFJlamVjdGlvbiBoYW5kbGVyICovXG5leHBvcnQgY2xhc3MgT25VbmNhdWdodEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnT25VbmNhdWdodEV4Y2VwdGlvbic7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gT25VbmNhdWdodEV4Y2VwdGlvbi5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBoYW5kbGVyOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkID0gdGhpcy5fbWFrZUVycm9ySGFuZGxlcigpO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IHtcbiAgICAgIC8qKlxuICAgICAgICogRGVmYXVsdCBvbkZhdGFsRXJyb3IgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGZpcnN0RXJyb3IgRXJyb3IgdGhhdCBoYXMgYmVlbiB0aHJvd25cbiAgICAgICAqIEBwYXJhbSBzZWNvbmRFcnJvciBJZiB0aGlzIHdhcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdGhpcyB3aWxsIGJlIHNldFxuICAgICAgICovXG4gICAgICBvbkZhdGFsRXJyb3I/KGZpcnN0RXJyb3I6IEVycm9yLCBzZWNvbmRFcnJvcj86IEVycm9yKTogdm9pZDtcbiAgICB9ID0ge30sXG4gICkge31cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKCk6IHZvaWQge1xuICAgIGdsb2JhbC5wcm9jZXNzLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMuaGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBwcml2YXRlIF9tYWtlRXJyb3JIYW5kbGVyKCk6IChlcnJvcjogRXJyb3IpID0+IHZvaWQge1xuICAgIGNvbnN0IHRpbWVvdXQgPSAyMDAwO1xuICAgIGxldCBjYXVnaHRGaXJzdEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IGNhdWdodFNlY29uZEVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gICAgbGV0IGNhbGxlZEZhdGFsRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgZmlyc3RFcnJvcjogRXJyb3I7XG5cbiAgICByZXR1cm4gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgbGV0IG9uRmF0YWxFcnJvcjogT25GYXRhbEVycm9ySGFuZGxlciA9IGxvZ0FuZEV4aXRQcm9jZXNzO1xuICAgICAgY29uc3QgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5vbkZhdGFsRXJyb3IpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICBvbkZhdGFsRXJyb3IgPSB0aGlzLl9vcHRpb25zLm9uRmF0YWxFcnJvcjtcbiAgICAgIH0gZWxzZSBpZiAoY2xpZW50ICYmIGNsaWVudC5nZXRPcHRpb25zKCkub25GYXRhbEVycm9yKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICAgICAgb25GYXRhbEVycm9yID0gY2xpZW50LmdldE9wdGlvbnMoKS5vbkZhdGFsRXJyb3IgYXMgT25GYXRhbEVycm9ySGFuZGxlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjYXVnaHRGaXJzdEVycm9yKSB7XG4gICAgICAgIGNvbnN0IGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcblxuICAgICAgICAvLyB0aGlzIGlzIHRoZSBmaXJzdCB1bmNhdWdodCBlcnJvciBhbmQgdGhlIHVsdGltYXRlIHJlYXNvbiBmb3Igc2h1dHRpbmcgZG93blxuICAgICAgICAvLyB3ZSB3YW50IHRvIGRvIGFic29sdXRlbHkgZXZlcnl0aGluZyBwb3NzaWJsZSB0byBlbnN1cmUgaXQgZ2V0cyBjYXB0dXJlZFxuICAgICAgICAvLyBhbHNvIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGdvIHJlY3Vyc2lvbiBjcmF6eSBpZiBtb3JlIGVycm9ycyBoYXBwZW4gYWZ0ZXIgdGhpcyBvbmVcbiAgICAgICAgZmlyc3RFcnJvciA9IGVycm9yO1xuICAgICAgICBjYXVnaHRGaXJzdEVycm9yID0gdHJ1ZTtcblxuICAgICAgICBpZiAoaHViLmdldEludGVncmF0aW9uKE9uVW5jYXVnaHRFeGNlcHRpb24pKSB7XG4gICAgICAgICAgaHViLndpdGhTY29wZSgoc2NvcGU6IFNjb3BlKSA9PiB7XG4gICAgICAgICAgICBzY29wZS5zZXRMZXZlbChTZXZlcml0eS5GYXRhbCk7XG4gICAgICAgICAgICBodWIuY2FwdHVyZUV4Y2VwdGlvbihlcnJvciwge1xuICAgICAgICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IHsgbWVjaGFuaXNtOiB7IGhhbmRsZWQ6IGZhbHNlLCB0eXBlOiAnb251bmNhdWdodGV4Y2VwdGlvbicgfSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWNhbGxlZEZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FsbGVkRmF0YWxFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgIG9uRmF0YWxFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCFjYWxsZWRGYXRhbEVycm9yKSB7XG4gICAgICAgICAgICBjYWxsZWRGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIG9uRmF0YWxFcnJvcihlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNhbGxlZEZhdGFsRXJyb3IpIHtcbiAgICAgICAgLy8gd2UgaGl0IGFuIGVycm9yICphZnRlciogY2FsbGluZyBvbkZhdGFsRXJyb3IgLSBwcmV0dHkgYm9uZWQgYXQgdGhpcyBwb2ludCwganVzdCBzaHV0IGl0IGRvd25cbiAgICAgICAgbG9nZ2VyLndhcm4oJ3VuY2F1Z2h0IGV4Y2VwdGlvbiBhZnRlciBjYWxsaW5nIGZhdGFsIGVycm9yIHNodXRkb3duIGNhbGxiYWNrIC0gdGhpcyBpcyBiYWQhIGZvcmNpbmcgc2h1dGRvd24nKTtcbiAgICAgICAgbG9nQW5kRXhpdFByb2Nlc3MoZXJyb3IpO1xuICAgICAgfSBlbHNlIGlmICghY2F1Z2h0U2Vjb25kRXJyb3IpIHtcbiAgICAgICAgLy8gdHdvIGNhc2VzIGZvciBob3cgd2UgY2FuIGhpdCB0aGlzIGJyYW5jaDpcbiAgICAgICAgLy8gICAtIGNhcHR1cmluZyBvZiBmaXJzdCBlcnJvciBibGV3IHVwIGFuZCB3ZSBqdXN0IGNhdWdodCB0aGUgZXhjZXB0aW9uIGZyb20gdGhhdFxuICAgICAgICAvLyAgICAgLSBxdWl0IHRyeWluZyB0byBjYXB0dXJlLCBwcm9jZWVkIHdpdGggc2h1dGRvd25cbiAgICAgICAgLy8gICAtIGEgc2Vjb25kIGluZGVwZW5kZW50IGVycm9yIGhhcHBlbmVkIHdoaWxlIHdhaXRpbmcgZm9yIGZpcnN0IGVycm9yIHRvIGNhcHR1cmVcbiAgICAgICAgLy8gICAgIC0gd2FudCB0byBhdm9pZCBjYXVzaW5nIHByZW1hdHVyZSBzaHV0ZG93biBiZWZvcmUgZmlyc3QgZXJyb3IgY2FwdHVyZSBmaW5pc2hlc1xuICAgICAgICAvLyBpdCdzIGhhcmQgdG8gaW1tZWRpYXRlbHkgdGVsbCBjYXNlIDEgZnJvbSBjYXNlIDIgd2l0aG91dCBkb2luZyBzb21lIGZhbmN5L3F1ZXN0aW9uYWJsZSBkb21haW4gc3R1ZmZcbiAgICAgICAgLy8gc28gbGV0J3MgaW5zdGVhZCBqdXN0IGRlbGF5IGEgYml0IGJlZm9yZSB3ZSBwcm9jZWVkIHdpdGggb3VyIGFjdGlvbiBoZXJlXG4gICAgICAgIC8vIGluIGNhc2UgMSwgd2UganVzdCB3YWl0IGEgYml0IHVubmVjZXNzYXJpbHkgYnV0IHVsdGltYXRlbHkgZG8gdGhlIHNhbWUgdGhpbmdcbiAgICAgICAgLy8gaW4gY2FzZSAyLCB0aGUgZGVsYXkgaG9wZWZ1bGx5IG1hZGUgdXMgd2FpdCBsb25nIGVub3VnaCBmb3IgdGhlIGNhcHR1cmUgdG8gZmluaXNoXG4gICAgICAgIC8vIHR3byBwb3RlbnRpYWwgbm9uaWRlYWwgb3V0Y29tZXM6XG4gICAgICAgIC8vICAgbm9uaWRlYWwgY2FzZSAxOiBjYXB0dXJpbmcgZmFpbHMgZmFzdCwgd2Ugc2l0IGFyb3VuZCBmb3IgYSBmZXcgc2Vjb25kcyB1bm5lY2Vzc2FyaWx5IGJlZm9yZSBwcm9jZWVkaW5nIGNvcnJlY3RseSBieSBjYWxsaW5nIG9uRmF0YWxFcnJvclxuICAgICAgICAvLyAgIG5vbmlkZWFsIGNhc2UgMjogY2FzZSAyIGhhcHBlbnMsIDFzdCBlcnJvciBpcyBjYXB0dXJlZCBidXQgc2xvd2x5LCB0aW1lb3V0IGNvbXBsZXRlcyBiZWZvcmUgY2FwdHVyZSBhbmQgd2UgdHJlYXQgc2Vjb25kIGVycm9yIGFzIHRoZSBzZW5kRXJyIG9mIChub25leGlzdGVudCkgZmFpbHVyZSBmcm9tIHRyeWluZyB0byBjYXB0dXJlIGZpcnN0IGVycm9yXG4gICAgICAgIC8vIG5vdGUgdGhhdCBhZnRlciBoaXR0aW5nIHRoaXMgYnJhbmNoLCB3ZSBtaWdodCBjYXRjaCBtb3JlIGVycm9ycyB3aGVyZSAoY2F1Z2h0U2Vjb25kRXJyb3IgJiYgIWNhbGxlZEZhdGFsRXJyb3IpXG4gICAgICAgIC8vICAgd2UgaWdub3JlIHRoZW0gLSB0aGV5IGRvbid0IG1hdHRlciB0byB1cywgd2UncmUganVzdCB3YWl0aW5nIGZvciB0aGUgc2Vjb25kIGVycm9yIHRpbWVvdXQgdG8gZmluaXNoXG4gICAgICAgIGNhdWdodFNlY29uZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjYWxsZWRGYXRhbEVycm9yKSB7XG4gICAgICAgICAgICAvLyBpdCB3YXMgcHJvYmFibHkgY2FzZSAxLCBsZXQncyB0cmVhdCBlcnIgYXMgdGhlIHNlbmRFcnIgYW5kIGNhbGwgb25GYXRhbEVycm9yXG4gICAgICAgICAgICBjYWxsZWRGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIG9uRmF0YWxFcnJvcihmaXJzdEVycm9yLCBlcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGl0IHdhcyBwcm9iYWJseSBjYXNlIDIsIG91ciBmaXJzdCBlcnJvciBmaW5pc2hlZCBjYXB0dXJpbmcgd2hpbGUgd2Ugd2FpdGVkLCBjb29sLCBkbyBub3RoaW5nXG4gICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTsgLy8gY2FwdHVyaW5nIGNvdWxkIHRha2UgYXQgbGVhc3Qgc2VuZFRpbWVvdXQgdG8gZmFpbCwgcGx1cyBhbiBhcmJpdHJhcnkgc2Vjb25kIGZvciBob3cgbG9uZyBpdCB0YWtlcyB0byBjb2xsZWN0IHN1cnJvdW5kaW5nIHNvdXJjZSBldGNcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgU2NvcGUgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGNvbnNvbGVTYW5kYm94IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IGxvZ0FuZEV4aXRQcm9jZXNzIH0gZnJvbSAnLi91dGlscy9lcnJvcmhhbmRsaW5nJztcblxudHlwZSBVbmhhbmRsZWRSZWplY3Rpb25Nb2RlID0gJ25vbmUnIHwgJ3dhcm4nIHwgJ3N0cmljdCc7XG5cbi8qKiBHbG9iYWwgUHJvbWlzZSBSZWplY3Rpb24gaGFuZGxlciAqL1xuZXhwb3J0IGNsYXNzIE9uVW5oYW5kbGVkUmVqZWN0aW9uIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdPblVuaGFuZGxlZFJlamVjdGlvbic7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gT25VbmhhbmRsZWRSZWplY3Rpb24uaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczoge1xuICAgICAgLyoqXG4gICAgICAgKiBPcHRpb24gZGVjaWRpbmcgd2hhdCB0byBkbyBhZnRlciBjYXB0dXJpbmcgdW5oYW5kbGVkUmVqZWN0aW9uLFxuICAgICAgICogdGhhdCBtaW1pY2tzIGJlaGF2aW9yIG9mIG5vZGUncyAtLXVuaGFuZGxlZC1yZWplY3Rpb24gZmxhZy5cbiAgICAgICAqL1xuICAgICAgbW9kZTogVW5oYW5kbGVkUmVqZWN0aW9uTW9kZTtcbiAgICB9ID0geyBtb2RlOiAnd2FybicgfSxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICBnbG9iYWwucHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgdGhpcy5zZW5kVW5oYW5kbGVkUHJvbWlzZS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGFuIGV4Y2VwdGlvbiB3aXRoIHJlYXNvblxuICAgKiBAcGFyYW0gcmVhc29uIHN0cmluZ1xuICAgKiBAcGFyYW0gcHJvbWlzZSBwcm9taXNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgc2VuZFVuaGFuZGxlZFByb21pc2UocmVhc29uOiBhbnksIHByb21pc2U6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcblxuICAgIGlmICghaHViLmdldEludGVncmF0aW9uKE9uVW5oYW5kbGVkUmVqZWN0aW9uKSkge1xuICAgICAgdGhpcy5faGFuZGxlUmVqZWN0aW9uKHJlYXNvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgY29uc3QgY29udGV4dCA9IChwcm9taXNlLmRvbWFpbiAmJiBwcm9taXNlLmRvbWFpbi5zZW50cnlDb250ZXh0KSB8fCB7fTtcblxuICAgIGh1Yi53aXRoU2NvcGUoKHNjb3BlOiBTY29wZSkgPT4ge1xuICAgICAgc2NvcGUuc2V0RXh0cmEoJ3VuaGFuZGxlZFByb21pc2VSZWplY3Rpb24nLCB0cnVlKTtcblxuICAgICAgLy8gUHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCByYXZlbi1ub2RlIGZvciBub3dcbiAgICAgIGlmIChjb250ZXh0LnVzZXIpIHtcbiAgICAgICAgc2NvcGUuc2V0VXNlcihjb250ZXh0LnVzZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRleHQudGFncykge1xuICAgICAgICBzY29wZS5zZXRUYWdzKGNvbnRleHQudGFncyk7XG4gICAgICB9XG4gICAgICBpZiAoY29udGV4dC5leHRyYSkge1xuICAgICAgICBzY29wZS5zZXRFeHRyYXMoY29udGV4dC5leHRyYSk7XG4gICAgICB9XG5cbiAgICAgIGh1Yi5jYXB0dXJlRXhjZXB0aW9uKHJlYXNvbiwge1xuICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogcHJvbWlzZSxcbiAgICAgICAgZGF0YTogeyBtZWNoYW5pc206IHsgaGFuZGxlZDogZmFsc2UsIHR5cGU6ICdvbnVuaGFuZGxlZHJlamVjdGlvbicgfSB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG5cbiAgICB0aGlzLl9oYW5kbGVSZWplY3Rpb24ocmVhc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBgbW9kZWAgb3B0aW9uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIF9oYW5kbGVSZWplY3Rpb24ocmVhc29uOiBhbnkpOiB2b2lkIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi83Y2Y2ZjllOTY0YWEwMDc3Mjk2NTM5MWMyM2FjZGE2ZDcxOTcyYTlhL2xpYi9pbnRlcm5hbC9wcm9jZXNzL3Byb21pc2VzLmpzI0wyMzQtTDI0MFxuICAgIGNvbnN0IHJlamVjdGlvbldhcm5pbmcgPVxuICAgICAgJ1RoaXMgZXJyb3Igb3JpZ2luYXRlZCBlaXRoZXIgYnkgJyArXG4gICAgICAndGhyb3dpbmcgaW5zaWRlIG9mIGFuIGFzeW5jIGZ1bmN0aW9uIHdpdGhvdXQgYSBjYXRjaCBibG9jaywgJyArXG4gICAgICAnb3IgYnkgcmVqZWN0aW5nIGEgcHJvbWlzZSB3aGljaCB3YXMgbm90IGhhbmRsZWQgd2l0aCAuY2F0Y2goKS4nICtcbiAgICAgICcgVGhlIHByb21pc2UgcmVqZWN0ZWQgd2l0aCB0aGUgcmVhc29uOic7XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25zb2xlICovXG4gICAgaWYgKHRoaXMuX29wdGlvbnMubW9kZSA9PT0gJ3dhcm4nKSB7XG4gICAgICBjb25zb2xlU2FuZGJveCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihyZWplY3Rpb25XYXJuaW5nKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBjb25zb2xlLmVycm9yKHJlYXNvbiAmJiByZWFzb24uc3RhY2sgPyByZWFzb24uc3RhY2sgOiByZWFzb24pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9vcHRpb25zLm1vZGUgPT09ICdzdHJpY3QnKSB7XG4gICAgICBjb25zb2xlU2FuZGJveCgoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihyZWplY3Rpb25XYXJuaW5nKTtcbiAgICAgIH0pO1xuICAgICAgbG9nQW5kRXhpdFByb2Nlc3MocmVhc29uKTtcbiAgICB9XG4gICAgLyogZXNsaW50LWVuYWJsZSBuby1jb25zb2xlICovXG4gIH1cbn1cbiIsICJpbXBvcnQgeyBhZGRHbG9iYWxFdmVudFByb2Nlc3NvciwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBFdmVudCwgRXZlbnRIaW50LCBFeGNlcHRpb24sIEV4dGVuZGVkRXJyb3IsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBpc0luc3RhbmNlT2YsIFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IGdldEV4Y2VwdGlvbkZyb21FcnJvciB9IGZyb20gJy4uL3BhcnNlcnMnO1xuXG5jb25zdCBERUZBVUxUX0tFWSA9ICdjYXVzZSc7XG5jb25zdCBERUZBVUxUX0xJTUlUID0gNTtcblxuLyoqIEFkZHMgU0RLIGluZm8gdG8gYW4gZXZlbnQuICovXG5leHBvcnQgY2xhc3MgTGlua2VkRXJyb3JzIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdMaW5rZWRFcnJvcnMnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9IExpbmtlZEVycm9ycy5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2tleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfbGltaXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGtleT86IHN0cmluZzsgbGltaXQ/OiBudW1iZXIgfSA9IHt9KSB7XG4gICAgdGhpcy5fa2V5ID0gb3B0aW9ucy5rZXkgfHwgREVGQVVMVF9LRVk7XG4gICAgdGhpcy5fbGltaXQgPSBvcHRpb25zLmxpbWl0IHx8IERFRkFVTFRfTElNSVQ7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoKTogdm9pZCB7XG4gICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoKGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZiA9IGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihMaW5rZWRFcnJvcnMpO1xuICAgICAgaWYgKHNlbGYpIHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHNlbGYuX2hhbmRsZXIgJiYgc2VsZi5faGFuZGxlci5iaW5kKHNlbGYpO1xuICAgICAgICByZXR1cm4gdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicgPyBoYW5kbGVyKGV2ZW50LCBoaW50KSA6IGV2ZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIF9oYW5kbGVyKGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCk6IFByb21pc2VMaWtlPEV2ZW50PiB7XG4gICAgaWYgKCFldmVudC5leGNlcHRpb24gfHwgIWV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgfHwgIWhpbnQgfHwgIWlzSW5zdGFuY2VPZihoaW50Lm9yaWdpbmFsRXhjZXB0aW9uLCBFcnJvcikpIHtcbiAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKGV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPEV2ZW50PihyZXNvbHZlID0+IHtcbiAgICAgIHZvaWQgdGhpcy5fd2Fsa0Vycm9yVHJlZShoaW50Lm9yaWdpbmFsRXhjZXB0aW9uIGFzIEVycm9yLCB0aGlzLl9rZXkpXG4gICAgICAgIC50aGVuKChsaW5rZWRFcnJvcnM6IEV4Y2VwdGlvbltdKSA9PiB7XG4gICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmV4Y2VwdGlvbiAmJiBldmVudC5leGNlcHRpb24udmFsdWVzKSB7XG4gICAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzID0gWy4uLmxpbmtlZEVycm9ycywgLi4uZXZlbnQuZXhjZXB0aW9uLnZhbHVlc107XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZXZlbnQpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihudWxsLCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIF93YWxrRXJyb3JUcmVlKGVycm9yOiBFeHRlbmRlZEVycm9yLCBrZXk6IHN0cmluZywgc3RhY2s6IEV4Y2VwdGlvbltdID0gW10pOiBQcm9taXNlTGlrZTxFeGNlcHRpb25bXT4ge1xuICAgIGlmICghaXNJbnN0YW5jZU9mKGVycm9yW2tleV0sIEVycm9yKSB8fCBzdGFjay5sZW5ndGggKyAxID49IHRoaXMuX2xpbWl0KSB7XG4gICAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZShzdGFjayk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXhjZXB0aW9uW10+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHZvaWQgZ2V0RXhjZXB0aW9uRnJvbUVycm9yKGVycm9yW2tleV0pXG4gICAgICAgIC50aGVuKChleGNlcHRpb246IEV4Y2VwdGlvbikgPT4ge1xuICAgICAgICAgIHZvaWQgdGhpcy5fd2Fsa0Vycm9yVHJlZShlcnJvcltrZXldLCBrZXksIFtleGNlcHRpb24sIC4uLnN0YWNrXSlcbiAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAudGhlbihudWxsLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKG51bGwsICgpID0+IHtcbiAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudFByb2Nlc3NvciwgSHViLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gJ3BhdGgnO1xuXG5sZXQgbW9kdWxlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbi8qKiBFeHRyYWN0IGluZm9ybWF0aW9uIGFib3V0IHBhdGhzICovXG5mdW5jdGlvbiBnZXRQYXRocygpOiBzdHJpbmdbXSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUuY2FjaGUgPyBPYmplY3Qua2V5cyhyZXF1aXJlLmNhY2hlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA6IFtdO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbi8qKiBFeHRyYWN0IGluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2UuanNvbiBtb2R1bGVzICovXG5mdW5jdGlvbiBjb2xsZWN0TW9kdWxlcygpOiB7XG4gIFtuYW1lOiBzdHJpbmddOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgbWFpblBhdGhzID0gKHJlcXVpcmUubWFpbiAmJiByZXF1aXJlLm1haW4ucGF0aHMpIHx8IFtdO1xuICBjb25zdCBwYXRocyA9IGdldFBhdGhzKCk7XG4gIGNvbnN0IGluZm9zOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHN0cmluZztcbiAgfSA9IHt9O1xuICBjb25zdCBzZWVuOiB7XG4gICAgW3BhdGg6IHN0cmluZ106IGJvb2xlYW47XG4gIH0gPSB7fTtcblxuICBwYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuICAgIGxldCBkaXIgPSBwYXRoO1xuXG4gICAgLyoqIFRyYXZlcnNlIGRpcmVjdG9yaWVzIHVwd2FyZCBpbiB0aGUgc2VhcmNoIG9mIHBhY2thZ2UuanNvbiBmaWxlICovXG4gICAgY29uc3QgdXBkaXIgPSAoKTogdm9pZCB8ICgoKSA9PiB2b2lkKSA9PiB7XG4gICAgICBjb25zdCBvcmlnID0gZGlyO1xuICAgICAgZGlyID0gZGlybmFtZShvcmlnKTtcblxuICAgICAgaWYgKCFkaXIgfHwgb3JpZyA9PT0gZGlyIHx8IHNlZW5bb3JpZ10pIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChtYWluUGF0aHMuaW5kZXhPZihkaXIpIDwgMCkge1xuICAgICAgICByZXR1cm4gdXBkaXIoKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGtnZmlsZSA9IGpvaW4ob3JpZywgJ3BhY2thZ2UuanNvbicpO1xuICAgICAgc2VlbltvcmlnXSA9IHRydWU7XG5cbiAgICAgIGlmICghZXhpc3RzU3luYyhwa2dmaWxlKSkge1xuICAgICAgICByZXR1cm4gdXBkaXIoKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBrZ2ZpbGUsICd1dGY4JykpIGFzIHtcbiAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgdmVyc2lvbjogc3RyaW5nO1xuICAgICAgICB9O1xuICAgICAgICBpbmZvc1tpbmZvLm5hbWVdID0gaW5mby52ZXJzaW9uO1xuICAgICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICAgIC8vIG5vLWVtcHR5XG4gICAgICB9XG4gICAgfTtcblxuICAgIHVwZGlyKCk7XG4gIH0pO1xuXG4gIHJldHVybiBpbmZvcztcbn1cblxuLyoqIEFkZCBub2RlIG1vZHVsZXMgLyBwYWNrYWdlcyB0byB0aGUgZXZlbnQgKi9cbmV4cG9ydCBjbGFzcyBNb2R1bGVzIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdNb2R1bGVzJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBNb2R1bGVzLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShhZGRHbG9iYWxFdmVudFByb2Nlc3NvcjogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoZXZlbnQgPT4ge1xuICAgICAgaWYgKCFnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oTW9kdWxlcykpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIG1vZHVsZXM6IHRoaXMuX2dldE1vZHVsZXMoKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKiogRmV0Y2hlcyB0aGUgbGlzdCBvZiBtb2R1bGVzIGFuZCB0aGUgdmVyc2lvbnMgbG9hZGVkIGJ5IHRoZSBlbnRyeSBmaWxlIGZvciB5b3VyIG5vZGUuanMgYXBwLiAqL1xuICBwcml2YXRlIF9nZXRNb2R1bGVzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGlmICghbW9kdWxlQ2FjaGUpIHtcbiAgICAgIG1vZHVsZUNhY2hlID0gY29sbGVjdE1vZHVsZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIG1vZHVsZUNhY2hlO1xuICB9XG59XG4iLCAiZXhwb3J0IHsgQ29uc29sZSB9IGZyb20gJy4vY29uc29sZSc7XG5leHBvcnQgeyBIdHRwIH0gZnJvbSAnLi9odHRwJztcbmV4cG9ydCB7IE9uVW5jYXVnaHRFeGNlcHRpb24gfSBmcm9tICcuL29udW5jYXVnaHRleGNlcHRpb24nO1xuZXhwb3J0IHsgT25VbmhhbmRsZWRSZWplY3Rpb24gfSBmcm9tICcuL29udW5oYW5kbGVkcmVqZWN0aW9uJztcbmV4cG9ydCB7IExpbmtlZEVycm9ycyB9IGZyb20gJy4vbGlua2VkZXJyb3JzJztcbmV4cG9ydCB7IE1vZHVsZXMgfSBmcm9tICcuL21vZHVsZXMnO1xuIiwgImltcG9ydCB7IGdldEN1cnJlbnRIdWIsIGluaXRBbmRCaW5kLCBJbnRlZ3JhdGlvbnMgYXMgQ29yZUludGVncmF0aW9ucyB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBnZXRNYWluQ2Fycmllciwgc2V0SHViT25DYXJyaWVyIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgU2Vzc2lvblN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCAqIGFzIGRvbWFpbiBmcm9tICdkb21haW4nO1xuXG5pbXBvcnQgeyBOb2RlQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgQ29uc29sZSwgSHR0cCwgTGlua2VkRXJyb3JzLCBPblVuY2F1Z2h0RXhjZXB0aW9uLCBPblVuaGFuZGxlZFJlamVjdGlvbiB9IGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmltcG9ydCB7IE5vZGVPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0SW50ZWdyYXRpb25zID0gW1xuICAvLyBDb21tb25cbiAgbmV3IENvcmVJbnRlZ3JhdGlvbnMuSW5ib3VuZEZpbHRlcnMoKSxcbiAgbmV3IENvcmVJbnRlZ3JhdGlvbnMuRnVuY3Rpb25Ub1N0cmluZygpLFxuICAvLyBOYXRpdmUgV3JhcHBlcnNcbiAgbmV3IENvbnNvbGUoKSxcbiAgbmV3IEh0dHAoKSxcbiAgLy8gR2xvYmFsIEhhbmRsZXJzXG4gIG5ldyBPblVuY2F1Z2h0RXhjZXB0aW9uKCksXG4gIG5ldyBPblVuaGFuZGxlZFJlamVjdGlvbigpLFxuICAvLyBNaXNjXG4gIG5ldyBMaW5rZWRFcnJvcnMoKSxcbl07XG5cbi8qKlxuICogVGhlIFNlbnRyeSBOb2RlIFNESyBDbGllbnQuXG4gKlxuICogVG8gdXNlIHRoaXMgU0RLLCBjYWxsIHRoZSB7QGxpbmsgaW5pdH0gZnVuY3Rpb24gYXMgZWFybHkgYXMgcG9zc2libGUgaW4gdGhlXG4gKiBtYWluIGVudHJ5IG1vZHVsZS4gVG8gc2V0IGNvbnRleHQgaW5mb3JtYXRpb24gb3Igc2VuZCBtYW51YWwgZXZlbnRzLCB1c2UgdGhlXG4gKiBwcm92aWRlZCBtZXRob2RzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqXG4gKiBjb25zdCB7IGluaXQgfSA9IHJlcXVpcmUoJ0BzZW50cnkvbm9kZScpO1xuICpcbiAqIGluaXQoe1xuICogICBkc246ICdfX0RTTl9fJyxcbiAqICAgLy8gLi4uXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqXG4gKiBjb25zdCB7IGNvbmZpZ3VyZVNjb3BlIH0gPSByZXF1aXJlKCdAc2VudHJ5L25vZGUnKTtcbiAqIGNvbmZpZ3VyZVNjb3BlKChzY29wZTogU2NvcGUpID0+IHtcbiAqICAgc2NvcGUuc2V0RXh0cmEoeyBiYXR0ZXJ5OiAwLjcgfSk7XG4gKiAgIHNjb3BlLnNldFRhZyh7IHVzZXJfbW9kZTogJ2FkbWluJyB9KTtcbiAqICAgc2NvcGUuc2V0VXNlcih7IGlkOiAnNDcxMScgfSk7XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqXG4gKiBjb25zdCB7IGFkZEJyZWFkY3J1bWIgfSA9IHJlcXVpcmUoJ0BzZW50cnkvbm9kZScpO1xuICogYWRkQnJlYWRjcnVtYih7XG4gKiAgIG1lc3NhZ2U6ICdNeSBCcmVhZGNydW1iJyxcbiAqICAgLy8gLi4uXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqXG4gKiBjb25zdCBTZW50cnkgPSByZXF1aXJlKCdAc2VudHJ5L25vZGUnKTtcbiAqIFNlbnRyeS5jYXB0dXJlTWVzc2FnZSgnSGVsbG8sIHdvcmxkIScpO1xuICogU2VudHJ5LmNhcHR1cmVFeGNlcHRpb24obmV3IEVycm9yKCdHb29kIGJ5ZScpKTtcbiAqIFNlbnRyeS5jYXB0dXJlRXZlbnQoe1xuICogICBtZXNzYWdlOiAnTWFudWFsJyxcbiAqICAgc3RhY2t0cmFjZTogW1xuICogICAgIC8vIC4uLlxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAc2VlIHtAbGluayBOb2RlT3B0aW9uc30gZm9yIGRvY3VtZW50YXRpb24gb24gY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdChvcHRpb25zOiBOb2RlT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuICBjb25zdCBhdXRvbG9hZGVkSW50ZWdyYXRpb25zID0gY2Fycmllci5fX1NFTlRSWV9fPy5pbnRlZ3JhdGlvbnMgfHwgW107XG5cbiAgb3B0aW9ucy5kZWZhdWx0SW50ZWdyYXRpb25zID1cbiAgICBvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMgPT09IGZhbHNlXG4gICAgICA/IFtdXG4gICAgICA6IFtcbiAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMpID8gb3B0aW9ucy5kZWZhdWx0SW50ZWdyYXRpb25zIDogZGVmYXVsdEludGVncmF0aW9ucyksXG4gICAgICAgICAgLi4uYXV0b2xvYWRlZEludGVncmF0aW9ucyxcbiAgICAgICAgXTtcblxuICBpZiAob3B0aW9ucy5kc24gPT09IHVuZGVmaW5lZCAmJiBwcm9jZXNzLmVudi5TRU5UUllfRFNOKSB7XG4gICAgb3B0aW9ucy5kc24gPSBwcm9jZXNzLmVudi5TRU5UUllfRFNOO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudHJhY2VzU2FtcGxlUmF0ZSA9PT0gdW5kZWZpbmVkICYmIHByb2Nlc3MuZW52LlNFTlRSWV9UUkFDRVNfU0FNUExFX1JBVEUpIHtcbiAgICBjb25zdCB0cmFjZXNTYW1wbGVSYXRlID0gcGFyc2VGbG9hdChwcm9jZXNzLmVudi5TRU5UUllfVFJBQ0VTX1NBTVBMRV9SQVRFKTtcbiAgICBpZiAoaXNGaW5pdGUodHJhY2VzU2FtcGxlUmF0ZSkpIHtcbiAgICAgIG9wdGlvbnMudHJhY2VzU2FtcGxlUmF0ZSA9IHRyYWNlc1NhbXBsZVJhdGU7XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMucmVsZWFzZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZGV0ZWN0ZWRSZWxlYXNlID0gZ2V0U2VudHJ5UmVsZWFzZSgpO1xuICAgIGlmIChkZXRlY3RlZFJlbGVhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5yZWxlYXNlID0gZGV0ZWN0ZWRSZWxlYXNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiByZWxlYXNlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiB3ZSBzaG91bGQgZGlzYWJsZSBhdXRvU2Vzc2lvblRyYWNraW5nXG4gICAgICBvcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5lbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkICYmIHByb2Nlc3MuZW52LlNFTlRSWV9FTlZJUk9OTUVOVCkge1xuICAgIG9wdGlvbnMuZW52aXJvbm1lbnQgPSBwcm9jZXNzLmVudi5TRU5UUllfRU5WSVJPTk1FTlQ7XG4gIH1cblxuICBpZiAob3B0aW9ucy5hdXRvU2Vzc2lvblRyYWNraW5nID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5kc24gIT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZyA9IHRydWU7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGlmICgoZG9tYWluIGFzIGFueSkuYWN0aXZlKSB7XG4gICAgc2V0SHViT25DYXJyaWVyKGNhcnJpZXIsIGdldEN1cnJlbnRIdWIoKSk7XG4gIH1cblxuICBpbml0QW5kQmluZChOb2RlQ2xpZW50LCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucy5hdXRvU2Vzc2lvblRyYWNraW5nKSB7XG4gICAgc3RhcnRTZXNzaW9uVHJhY2tpbmcoKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGdldHRlciBmb3IgbGFzdEV2ZW50SWQuXG4gKlxuICogQHJldHVybnMgVGhlIGxhc3QgZXZlbnQgaWQgb2YgYSBjYXB0dXJlZCBldmVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhc3RFdmVudElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBnZXRDdXJyZW50SHViKCkubGFzdEV2ZW50SWQoKTtcbn1cblxuLyoqXG4gKiBDYWxsIGBmbHVzaCgpYCBvbiB0aGUgY3VycmVudCBjbGllbnQsIGlmIHRoZXJlIGlzIG9uZS4gU2VlIHtAbGluayBDbGllbnQuZmx1c2h9LlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0IE1heGltdW0gdGltZSBpbiBtcyB0aGUgY2xpZW50IHNob3VsZCB3YWl0IHRvIGZsdXNoIGl0cyBldmVudCBxdWV1ZS4gT21pdHRpbmcgdGhpcyBwYXJhbWV0ZXIgd2lsbCBjYXVzZVxuICogdGhlIGNsaWVudCB0byB3YWl0IHVudGlsIGFsbCBldmVudHMgYXJlIHNlbnQgYmVmb3JlIHJlc29sdmluZyB0aGUgcHJvbWlzZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byBgdHJ1ZWAgaWYgdGhlIHF1ZXVlIHN1Y2Nlc3NmdWxseSBkcmFpbnMgYmVmb3JlIHRoZSB0aW1lb3V0LCBvciBgZmFsc2VgIGlmIGl0XG4gKiBkb2Vzbid0IChvciBpZiB0aGVyZSdzIG5vIGNsaWVudCBkZWZpbmVkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuICBpZiAoY2xpZW50KSB7XG4gICAgcmV0dXJuIGNsaWVudC5mbHVzaCh0aW1lb3V0KTtcbiAgfVxuICBsb2dnZXIud2FybignQ2Fubm90IGZsdXNoIGV2ZW50cy4gTm8gY2xpZW50IGRlZmluZWQuJyk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuXG4vKipcbiAqIENhbGwgYGNsb3NlKClgIG9uIHRoZSBjdXJyZW50IGNsaWVudCwgaWYgdGhlcmUgaXMgb25lLiBTZWUge0BsaW5rIENsaWVudC5jbG9zZX0uXG4gKlxuICogQHBhcmFtIHRpbWVvdXQgTWF4aW11bSB0aW1lIGluIG1zIHRoZSBjbGllbnQgc2hvdWxkIHdhaXQgdG8gZmx1c2ggaXRzIGV2ZW50IHF1ZXVlIGJlZm9yZSBzaHV0dGluZyBkb3duLiBPbWl0dGluZyB0aGlzXG4gKiBwYXJhbWV0ZXIgd2lsbCBjYXVzZSB0aGUgY2xpZW50IHRvIHdhaXQgdW50aWwgYWxsIGV2ZW50cyBhcmUgc2VudCBiZWZvcmUgZGlzYWJsaW5nIGl0c2VsZi5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCByZXNvbHZlcyB0byBgdHJ1ZWAgaWYgdGhlIHF1ZXVlIHN1Y2Nlc3NmdWxseSBkcmFpbnMgYmVmb3JlIHRoZSB0aW1lb3V0LCBvciBgZmFsc2VgIGlmIGl0XG4gKiBkb2Vzbid0IChvciBpZiB0aGVyZSdzIG5vIGNsaWVudCBkZWZpbmVkKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuICBpZiAoY2xpZW50KSB7XG4gICAgcmV0dXJuIGNsaWVudC5jbG9zZSh0aW1lb3V0KTtcbiAgfVxuICBsb2dnZXIud2FybignQ2Fubm90IGZsdXNoIGV2ZW50cyBhbmQgZGlzYWJsZSBTREsuIE5vIGNsaWVudCBkZWZpbmVkLicpO1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiB0aGF0IHRha2VzIGFuIGluc3RhbmNlIG9mIE5vZGVDbGllbnQgYW5kIGNoZWNrcyBpZiBhdXRvU2Vzc2lvblRyYWNraW5nIG9wdGlvbiBpcyBlbmFibGVkIGZvciB0aGF0IGNsaWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBdXRvU2Vzc2lvblRyYWNraW5nRW5hYmxlZChjbGllbnQ/OiBOb2RlQ2xpZW50KTogYm9vbGVhbiB7XG4gIGlmIChjbGllbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjbGllbnRPcHRpb25zOiBOb2RlT3B0aW9ucyA9IGNsaWVudCAmJiBjbGllbnQuZ2V0T3B0aW9ucygpO1xuICBpZiAoY2xpZW50T3B0aW9ucyAmJiBjbGllbnRPcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBjbGllbnRPcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByZWxlYXNlIGR5bmFtaWNhbGx5IGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2VudHJ5UmVsZWFzZShmYWxsYmFjaz86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIC8vIEFsd2F5cyByZWFkIGZpcnN0IGFzIFNlbnRyeSB0YWtlcyB0aGlzIGFzIHByZWNlZGVuY2VcbiAgaWYgKHByb2Nlc3MuZW52LlNFTlRSWV9SRUxFQVNFKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZW52LlNFTlRSWV9SRUxFQVNFO1xuICB9XG5cbiAgLy8gVGhpcyBzdXBwb3J0cyB0aGUgdmFyaWFibGUgdGhhdCBzZW50cnktd2VicGFjay1wbHVnaW4gaW5qZWN0c1xuICBjb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgaWYgKGdsb2JhbC5TRU5UUllfUkVMRUFTRSAmJiBnbG9iYWwuU0VOVFJZX1JFTEVBU0UuaWQpIHtcbiAgICByZXR1cm4gZ2xvYmFsLlNFTlRSWV9SRUxFQVNFLmlkO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAvLyBHaXRIdWIgQWN0aW9ucyAtIGh0dHBzOi8vaGVscC5naXRodWIuY29tL2VuL2FjdGlvbnMvY29uZmlndXJpbmctYW5kLW1hbmFnaW5nLXdvcmtmbG93cy91c2luZy1lbnZpcm9ubWVudC12YXJpYWJsZXMjZGVmYXVsdC1lbnZpcm9ubWVudC12YXJpYWJsZXNcbiAgICBwcm9jZXNzLmVudi5HSVRIVUJfU0hBIHx8XG4gICAgLy8gTmV0bGlmeSAtIGh0dHBzOi8vZG9jcy5uZXRsaWZ5LmNvbS9jb25maWd1cmUtYnVpbGRzL2Vudmlyb25tZW50LXZhcmlhYmxlcy8jYnVpbGQtbWV0YWRhdGFcbiAgICBwcm9jZXNzLmVudi5DT01NSVRfUkVGIHx8XG4gICAgLy8gVmVyY2VsIC0gaHR0cHM6Ly92ZXJjZWwuY29tL2RvY3MvdjIvYnVpbGQtc3RlcCNzeXN0ZW0tZW52aXJvbm1lbnQtdmFyaWFibGVzXG4gICAgcHJvY2Vzcy5lbnYuVkVSQ0VMX0dJVF9DT01NSVRfU0hBIHx8XG4gICAgcHJvY2Vzcy5lbnYuVkVSQ0VMX0dJVEhVQl9DT01NSVRfU0hBIHx8XG4gICAgcHJvY2Vzcy5lbnYuVkVSQ0VMX0dJVExBQl9DT01NSVRfU0hBIHx8XG4gICAgcHJvY2Vzcy5lbnYuVkVSQ0VMX0JJVEJVQ0tFVF9DT01NSVRfU0hBIHx8XG4gICAgLy8gWmVpdCAobm93IGtub3duIGFzIFZlcmNlbClcbiAgICBwcm9jZXNzLmVudi5aRUlUX0dJVEhVQl9DT01NSVRfU0hBIHx8XG4gICAgcHJvY2Vzcy5lbnYuWkVJVF9HSVRMQUJfQ09NTUlUX1NIQSB8fFxuICAgIHByb2Nlc3MuZW52LlpFSVRfQklUQlVDS0VUX0NPTU1JVF9TSEEgfHxcbiAgICBmYWxsYmFja1xuICApO1xufVxuXG4vKipcbiAqIEVuYWJsZSBhdXRvbWF0aWMgU2Vzc2lvbiBUcmFja2luZyBmb3IgdGhlIG5vZGUgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc3RhcnRTZXNzaW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gIGNvbnN0IGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgaHViLnN0YXJ0U2Vzc2lvbigpO1xuICAvLyBFbWl0dGVkIGluIHRoZSBjYXNlIG9mIGhlYWx0aHkgc2Vzc2lvbnMsIGVycm9yIG9mIGBtZWNoYW5pc20uaGFuZGxlZDogdHJ1ZWAgYW5kIHVuaGFuZGxlZHJlamVjdGlvbnMgYmVjYXVzZVxuICAvLyBUaGUgJ2JlZm9yZUV4aXQnIGV2ZW50IGlzIG5vdCBlbWl0dGVkIGZvciBjb25kaXRpb25zIGNhdXNpbmcgZXhwbGljaXQgdGVybWluYXRpb24sXG4gIC8vIHN1Y2ggYXMgY2FsbGluZyBwcm9jZXNzLmV4aXQoKSBvciB1bmNhdWdodCBleGNlcHRpb25zLlxuICAvLyBSZWY6IGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvcHJvY2Vzcy5odG1sI3Byb2Nlc3NfZXZlbnRfYmVmb3JlZXhpdFxuICBwcm9jZXNzLm9uKCdiZWZvcmVFeGl0JywgKCkgPT4ge1xuICAgIGNvbnN0IHNlc3Npb24gPSBodWIuZ2V0U2NvcGUoKT8uZ2V0U2Vzc2lvbigpO1xuICAgIGNvbnN0IHRlcm1pbmFsU3RhdGVzID0gW1Nlc3Npb25TdGF0dXMuRXhpdGVkLCBTZXNzaW9uU3RhdHVzLkNyYXNoZWRdO1xuICAgIC8vIE9ubHkgY2FsbCBlbmRTZXNzaW9uLCBpZiB0aGUgU2Vzc2lvbiBleGlzdHMgb24gU2NvcGUgYW5kIFNlc3Npb25TdGF0dXMgaXMgbm90IGFcbiAgICAvLyBUZXJtaW5hbCBTdGF0dXMgaS5lLiBFeGl0ZWQgb3IgQ3Jhc2hlZCBiZWNhdXNlXG4gICAgLy8gXCJXaGVuIGEgc2Vzc2lvbiBpcyBtb3ZlZCBhd2F5IGZyb20gb2sgaXQgbXVzdCBub3QgYmUgdXBkYXRlZCBhbnltb3JlLlwiXG4gICAgLy8gUmVmOiBodHRwczovL2RldmVsb3Auc2VudHJ5LmRldi9zZGsvc2Vzc2lvbnMvXG4gICAgaWYgKHNlc3Npb24gJiYgIXRlcm1pbmFsU3RhdGVzLmluY2x1ZGVzKHNlc3Npb24uc3RhdHVzKSkgaHViLmVuZFNlc3Npb24oKTtcbiAgfSk7XG59XG4iLCAiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuLyoqXG4gKiBSZWN1cnNpdmVseSByZWFkIHRoZSBjb250ZW50cyBvZiBhIGRpcmVjdG9yeS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0RGlyIEFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggb2YgdGhlIGRpcmVjdG9yeSB0byBzY2FuLiBBbGwgcmV0dXJuZWQgcGF0aHMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzXG4gKiBkaXJlY3RvcnkuXG4gKiBAcmV0dXJucyBBcnJheSBob2xkaW5nIGFsbCByZWxhdGl2ZSBwYXRoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVlcFJlYWREaXJTeW5jKHRhcmdldERpcjogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCB0YXJnZXREaXJBYnNQYXRoID0gcGF0aC5yZXNvbHZlKHRhcmdldERpcik7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldERpckFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBjb250ZW50cyBvZiAke3RhcmdldERpckFic1BhdGh9LiBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuYCk7XG4gIH1cblxuICBpZiAoIWZzLnN0YXRTeW5jKHRhcmdldERpckFic1BhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGNvbnRlbnRzIG9mICR7dGFyZ2V0RGlyQWJzUGF0aH0sIGJlY2F1c2UgaXQgaXMgbm90IGEgZGlyZWN0b3J5LmApO1xuICB9XG5cbiAgLy8gVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIGl0cyBjb250YWluaW5nIGZ1bmN0aW9uLCBgZGVlcFJlYWREaXJTeW5jYCAoZXhjZXB0IHRoYXQgLSBwdXJlbHkgZm9yIGNvbnZlbmllbmNlIC0gaXRcbiAgLy8gZGVhbHMgaW4gYWJzb2x1dGUgcGF0aHMgcmF0aGVyIHRoYW4gcmVsYXRpdmUgb25lcykuIFdlIG5lZWQgdGhpcyB0byBiZSBzZXBhcmF0ZSBmcm9tIHRoZSBvdXRlciBmdW5jdGlvbiB0byBwcmVzZXJ2ZVxuICAvLyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGB0YXJnZXREaXJBYnNQYXRoYCBhbmQgYGN1cnJlbnREaXJBYnNQYXRoYC5cbiAgY29uc3QgZGVlcFJlYWRDdXJyZW50RGlyID0gKGN1cnJlbnREaXJBYnNQYXRoOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgcmV0dXJuIGZzLnJlYWRkaXJTeW5jKGN1cnJlbnREaXJBYnNQYXRoKS5yZWR1Y2UoKGFic1BhdGhzOiBzdHJpbmdbXSwgaXRlbU5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgaXRlbUFic1BhdGggPSBwYXRoLmpvaW4oY3VycmVudERpckFic1BhdGgsIGl0ZW1OYW1lKTtcblxuICAgICAgaWYgKGZzLnN0YXRTeW5jKGl0ZW1BYnNQYXRoKS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIHJldHVybiBbLi4uYWJzUGF0aHMsIC4uLmRlZXBSZWFkQ3VycmVudERpcihpdGVtQWJzUGF0aCldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gWy4uLmFic1BhdGhzLCBpdGVtQWJzUGF0aF07XG4gICAgfSwgW10pO1xuICB9O1xuXG4gIHJldHVybiBkZWVwUmVhZEN1cnJlbnREaXIodGFyZ2V0RGlyQWJzUGF0aCkubWFwKGFic1BhdGggPT4gcGF0aC5yZWxhdGl2ZSh0YXJnZXREaXJBYnNQYXRoLCBhYnNQYXRoKSk7XG59XG4iLCAiLyoqIFRoZSBzdGF0dXMgb2YgYW4gU3Bhbi4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvZXhwb3J0XG5leHBvcnQgZW51bSBTcGFuU3RhdHVzIHtcbiAgLyoqIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gKi9cbiAgT2sgPSAnb2snLFxuICAvKiogRGVhZGxpbmUgZXhwaXJlZCBiZWZvcmUgb3BlcmF0aW9uIGNvdWxkIGNvbXBsZXRlLiAqL1xuICBEZWFkbGluZUV4Y2VlZGVkID0gJ2RlYWRsaW5lX2V4Y2VlZGVkJyxcbiAgLyoqIDQwMSBVbmF1dGhvcml6ZWQgKGFjdHVhbGx5IGRvZXMgbWVhbiB1bmF1dGhlbnRpY2F0ZWQgYWNjb3JkaW5nIHRvIFJGQyA3MjM1KSAqL1xuICBVbmF1dGhlbnRpY2F0ZWQgPSAndW5hdXRoZW50aWNhdGVkJyxcbiAgLyoqIDQwMyBGb3JiaWRkZW4gKi9cbiAgUGVybWlzc2lvbkRlbmllZCA9ICdwZXJtaXNzaW9uX2RlbmllZCcsXG4gIC8qKiA0MDQgTm90IEZvdW5kLiBTb21lIHJlcXVlc3RlZCBlbnRpdHkgKGZpbGUgb3IgZGlyZWN0b3J5KSB3YXMgbm90IGZvdW5kLiAqL1xuICBOb3RGb3VuZCA9ICdub3RfZm91bmQnLFxuICAvKiogNDI5IFRvbyBNYW55IFJlcXVlc3RzICovXG4gIFJlc291cmNlRXhoYXVzdGVkID0gJ3Jlc291cmNlX2V4aGF1c3RlZCcsXG4gIC8qKiBDbGllbnQgc3BlY2lmaWVkIGFuIGludmFsaWQgYXJndW1lbnQuIDR4eC4gKi9cbiAgSW52YWxpZEFyZ3VtZW50ID0gJ2ludmFsaWRfYXJndW1lbnQnLFxuICAvKiogNTAxIE5vdCBJbXBsZW1lbnRlZCAqL1xuICBVbmltcGxlbWVudGVkID0gJ3VuaW1wbGVtZW50ZWQnLFxuICAvKiogNTAzIFNlcnZpY2UgVW5hdmFpbGFibGUgKi9cbiAgVW5hdmFpbGFibGUgPSAndW5hdmFpbGFibGUnLFxuICAvKiogT3RoZXIvZ2VuZXJpYyA1eHguICovXG4gIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWxfZXJyb3InLFxuICAvKiogVW5rbm93bi4gQW55IG5vbi1zdGFuZGFyZCBIVFRQIHN0YXR1cyBjb2RlLiAqL1xuICBVbmtub3duRXJyb3IgPSAndW5rbm93bl9lcnJvcicsXG4gIC8qKiBUaGUgb3BlcmF0aW9uIHdhcyBjYW5jZWxsZWQgKHR5cGljYWxseSBieSB0aGUgdXNlcikuICovXG4gIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAvKiogQWxyZWFkeSBleGlzdHMgKDQwOSkgKi9cbiAgQWxyZWFkeUV4aXN0cyA9ICdhbHJlYWR5X2V4aXN0cycsXG4gIC8qKiBPcGVyYXRpb24gd2FzIHJlamVjdGVkIGJlY2F1c2UgdGhlIHN5c3RlbSBpcyBub3QgaW4gYSBzdGF0ZSByZXF1aXJlZCBmb3IgdGhlIG9wZXJhdGlvbidzICovXG4gIEZhaWxlZFByZWNvbmRpdGlvbiA9ICdmYWlsZWRfcHJlY29uZGl0aW9uJyxcbiAgLyoqIFRoZSBvcGVyYXRpb24gd2FzIGFib3J0ZWQsIHR5cGljYWxseSBkdWUgdG8gYSBjb25jdXJyZW5jeSBpc3N1ZS4gKi9cbiAgQWJvcnRlZCA9ICdhYm9ydGVkJyxcbiAgLyoqIE9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHBhc3QgdGhlIHZhbGlkIHJhbmdlLiAqL1xuICBPdXRPZlJhbmdlID0gJ291dF9vZl9yYW5nZScsXG4gIC8qKiBVbnJlY292ZXJhYmxlIGRhdGEgbG9zcyBvciBjb3JydXB0aW9uICovXG4gIERhdGFMb3NzID0gJ2RhdGFfbG9zcycsXG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlLCBpbXBvcnQvZXhwb3J0XG5leHBvcnQgbmFtZXNwYWNlIFNwYW5TdGF0dXMge1xuICAvKipcbiAgICogQ29udmVydHMgYSBIVFRQIHN0YXR1cyBjb2RlIGludG8gYSB7QGxpbmsgU3BhblN0YXR1c30uXG4gICAqXG4gICAqIEBwYXJhbSBodHRwU3RhdHVzIFRoZSBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLlxuICAgKiBAcmV0dXJucyBUaGUgc3BhbiBzdGF0dXMgb3Ige0BsaW5rIFNwYW5TdGF0dXMuVW5rbm93bkVycm9yfS5cbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBmcm9tSHR0cENvZGUoaHR0cFN0YXR1czogbnVtYmVyKTogU3BhblN0YXR1cyB7XG4gICAgaWYgKGh0dHBTdGF0dXMgPCA0MDAgJiYgaHR0cFN0YXR1cyA+PSAxMDApIHtcbiAgICAgIHJldHVybiBTcGFuU3RhdHVzLk9rO1xuICAgIH1cblxuICAgIGlmIChodHRwU3RhdHVzID49IDQwMCAmJiBodHRwU3RhdHVzIDwgNTAwKSB7XG4gICAgICBzd2l0Y2ggKGh0dHBTdGF0dXMpIHtcbiAgICAgICAgY2FzZSA0MDE6XG4gICAgICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuVW5hdXRoZW50aWNhdGVkO1xuICAgICAgICBjYXNlIDQwMzpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5QZXJtaXNzaW9uRGVuaWVkO1xuICAgICAgICBjYXNlIDQwNDpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5Ob3RGb3VuZDtcbiAgICAgICAgY2FzZSA0MDk6XG4gICAgICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuQWxyZWFkeUV4aXN0cztcbiAgICAgICAgY2FzZSA0MTM6XG4gICAgICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuRmFpbGVkUHJlY29uZGl0aW9uO1xuICAgICAgICBjYXNlIDQyOTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5SZXNvdXJjZUV4aGF1c3RlZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5JbnZhbGlkQXJndW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGh0dHBTdGF0dXMgPj0gNTAwICYmIGh0dHBTdGF0dXMgPCA2MDApIHtcbiAgICAgIHN3aXRjaCAoaHR0cFN0YXR1cykge1xuICAgICAgICBjYXNlIDUwMTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5VbmltcGxlbWVudGVkO1xuICAgICAgICBjYXNlIDUwMzpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5VbmF2YWlsYWJsZTtcbiAgICAgICAgY2FzZSA1MDQ6XG4gICAgICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuRGVhZGxpbmVFeGNlZWRlZDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5JbnRlcm5hbEVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBTcGFuU3RhdHVzLlVua25vd25FcnJvcjtcbiAgfVxufVxuIiwgImltcG9ydCB7IGdldEN1cnJlbnRIdWIsIEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IE9wdGlvbnMsIFRyYWNlcGFyZW50RGF0YSwgVHJhbnNhY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IFRSQUNFUEFSRU5UX1JFR0VYUCA9IG5ldyBSZWdFeHAoXG4gICdeWyBcXFxcdF0qJyArIC8vIHdoaXRlc3BhY2VcbiAgJyhbMC05YS1mXXszMn0pPycgKyAvLyB0cmFjZV9pZFxuICAnLT8oWzAtOWEtZl17MTZ9KT8nICsgLy8gc3Bhbl9pZFxuICAnLT8oWzAxXSk/JyArIC8vIHNhbXBsZWRcbiAgICAnWyBcXFxcdF0qJCcsIC8vIHdoaXRlc3BhY2Vcbik7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0cmFjaW5nIGlzIGN1cnJlbnRseSBlbmFibGVkLlxuICpcbiAqIFRyYWNpbmcgaXMgZW5hYmxlZCB3aGVuIGF0IGxlYXN0IG9uZSBvZiBgdHJhY2VzU2FtcGxlUmF0ZWAgYW5kIGB0cmFjZXNTYW1wbGVyYCBpcyBkZWZpbmVkIGluIHRoZSBTREsgY29uZmlnLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzVHJhY2luZ0VuYWJsZWQoXG4gIG9wdGlvbnM6IE9wdGlvbnMgfCB1bmRlZmluZWQgPSBnZXRDdXJyZW50SHViKClcbiAgICAuZ2V0Q2xpZW50KClcbiAgICA/LmdldE9wdGlvbnMoKSxcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gISFvcHRpb25zICYmICgndHJhY2VzU2FtcGxlUmF0ZScgaW4gb3B0aW9ucyB8fCAndHJhY2VzU2FtcGxlcicgaW4gb3B0aW9ucyk7XG59XG5cbi8qKlxuICogRXh0cmFjdCB0cmFuc2FjdGlvbiBjb250ZXh0IGRhdGEgZnJvbSBhIGBzZW50cnktdHJhY2VgIGhlYWRlci5cbiAqXG4gKiBAcGFyYW0gdHJhY2VwYXJlbnQgVHJhY2VwYXJlbnQgc3RyaW5nXG4gKlxuICogQHJldHVybnMgT2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBmcm9tIHRoZSBoZWFkZXIsIG9yIHVuZGVmaW5lZCBpZiB0cmFjZXBhcmVudCBzdHJpbmcgaXMgbWFsZm9ybWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0VHJhY2VwYXJlbnREYXRhKHRyYWNlcGFyZW50OiBzdHJpbmcpOiBUcmFjZXBhcmVudERhdGEgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVzID0gdHJhY2VwYXJlbnQubWF0Y2goVFJBQ0VQQVJFTlRfUkVHRVhQKTtcbiAgaWYgKG1hdGNoZXMpIHtcbiAgICBsZXQgcGFyZW50U2FtcGxlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICBpZiAobWF0Y2hlc1szXSA9PT0gJzEnKSB7XG4gICAgICBwYXJlbnRTYW1wbGVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXNbM10gPT09ICcwJykge1xuICAgICAgcGFyZW50U2FtcGxlZCA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2VJZDogbWF0Y2hlc1sxXSxcbiAgICAgIHBhcmVudFNhbXBsZWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IG1hdGNoZXNbMl0sXG4gICAgfTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogR3JhYnMgYWN0aXZlIHRyYW5zYWN0aW9uIG9mZiBzY29wZSwgaWYgYW55ICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlVHJhbnNhY3Rpb248VCBleHRlbmRzIFRyYW5zYWN0aW9uPihodWI6IEh1YiA9IGdldEN1cnJlbnRIdWIoKSk6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaHViPy5nZXRTY29wZSgpPy5nZXRUcmFuc2FjdGlvbigpIGFzIFQgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBtaWxsaXNlY29uZHMgdG8gc2Vjb25kc1xuICogQHBhcmFtIHRpbWUgdGltZSBpbiBtc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbXNUb1NlYyh0aW1lOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdGltZSAvIDEwMDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBzZWNvbmRzIHRvIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIHRpbWUgdGltZSBpbiBzZWNvbmRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWNUb01zKHRpbWU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0aW1lICogMTAwMDtcbn1cblxuLy8gc28gaXQgY2FuIGJlIHVzZWQgaW4gbWFudWFsIGluc3RydW1lbnRhdGlvbiB3aXRob3V0IG5lY2Vzc2l0YXRpbmcgYSBoYXJkIGRlcGVuZGVuY3kgb24gQHNlbnRyeS91dGlsc1xuZXhwb3J0IHsgc3RyaXBVcmxRdWVyeUFuZEZyYWdtZW50IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG4iLCAiaW1wb3J0IHsgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlciwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuL3NwYW5zdGF0dXMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlVHJhbnNhY3Rpb24gfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBDb25maWd1cmVzIGdsb2JhbCBlcnJvciBsaXN0ZW5lcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyRXJyb3JJbnN0cnVtZW50YXRpb24oKTogdm9pZCB7XG4gIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgIGNhbGxiYWNrOiBlcnJvckNhbGxiYWNrLFxuICAgIHR5cGU6ICdlcnJvcicsXG4gIH0pO1xuICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICBjYWxsYmFjazogZXJyb3JDYWxsYmFjayxcbiAgICB0eXBlOiAndW5oYW5kbGVkcmVqZWN0aW9uJyxcbiAgfSk7XG59XG5cbi8qKlxuICogSWYgYW4gZXJyb3Igb3IgdW5oYW5kbGVkIHByb21pc2Ugb2NjdXJzLCB3ZSBtYXJrIHRoZSBhY3RpdmUgdHJhbnNhY3Rpb24gYXMgZmFpbGVkXG4gKi9cbmZ1bmN0aW9uIGVycm9yQ2FsbGJhY2soKTogdm9pZCB7XG4gIGNvbnN0IGFjdGl2ZVRyYW5zYWN0aW9uID0gZ2V0QWN0aXZlVHJhbnNhY3Rpb24oKTtcbiAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgbG9nZ2VyLmxvZyhgW1RyYWNpbmddIFRyYW5zYWN0aW9uOiAke1NwYW5TdGF0dXMuSW50ZXJuYWxFcnJvcn0gLT4gR2xvYmFsIGVycm9yIG9jY3VyZWRgKTtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5JbnRlcm5hbEVycm9yKTtcbiAgfVxufVxuIiwgIi8vIFN0b3JlIGZpbmlzaCByZWFzb25zIGluIHR1cGxlIHRvIHNhdmUgb24gYnVuZGxlIHNpemVcbi8vIFJlYWRvbmx5IHR5cGUgc2hvdWxkIGVuZm9yY2UgdGhhdCB0aGlzIGlzIG5vdCBtdXRhdGVkLlxuZXhwb3J0IGNvbnN0IEZJTklTSF9SRUFTT05fVEFHID0gJ2ZpbmlzaFJlYXNvbic7XG5cbmV4cG9ydCBjb25zdCBJRExFX1RSQU5TQUNUSU9OX0ZJTklTSF9SRUFTT05TID0gWydoZWFydGJlYXRGYWlsZWQnLCAnaWRsZVRpbWVvdXQnLCAnZG9jdW1lbnRIaWRkZW4nXSBhcyBjb25zdDtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbmltcG9ydCB7IFByaW1pdGl2ZSwgU3BhbiBhcyBTcGFuSW50ZXJmYWNlLCBTcGFuQ29udGV4dCwgVHJhbnNhY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGRyb3BVbmRlZmluZWRLZXlzLCB0aW1lc3RhbXBXaXRoTXMsIHV1aWQ0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuL3NwYW5zdGF0dXMnO1xuXG4vKipcbiAqIEtlZXBzIHRyYWNrIG9mIGZpbmlzaGVkIHNwYW5zIGZvciBhIGdpdmVuIHRyYW5zYWN0aW9uXG4gKiBAaW50ZXJuYWxcbiAqIEBoaWRlY29uc3RydWN0b3JcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNsYXNzIFNwYW5SZWNvcmRlciB7XG4gIHB1YmxpYyBzcGFuczogU3BhbltdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbWF4bGVuOiBudW1iZXI7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG1heGxlbjogbnVtYmVyID0gMTAwMCkge1xuICAgIHRoaXMuX21heGxlbiA9IG1heGxlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGp1c3Qgc28gdGhhdCB3ZSBkb24ndCBydW4gb3V0IG9mIG1lbW9yeSB3aGlsZSByZWNvcmRpbmcgYSBsb3RcbiAgICogb2Ygc3BhbnMuIEF0IHNvbWUgcG9pbnQgd2UganVzdCBzdG9wIGFuZCBmbHVzaCBvdXQgdGhlIHN0YXJ0IG9mIHRoZVxuICAgKiB0cmFjZSB0cmVlIChpLmUudGhlIGZpcnN0IG4gc3BhbnMgd2l0aCB0aGUgc21hbGxlc3RcbiAgICogc3RhcnRfdGltZXN0YW1wKS5cbiAgICovXG4gIHB1YmxpYyBhZGQoc3BhbjogU3Bhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnNwYW5zLmxlbmd0aCA+IHRoaXMuX21heGxlbikge1xuICAgICAgc3Bhbi5zcGFuUmVjb3JkZXIgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3BhbnMucHVzaChzcGFuKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBTcGFuIGNvbnRhaW5zIGFsbCBkYXRhIGFib3V0IGEgc3BhblxuICovXG5leHBvcnQgY2xhc3MgU3BhbiBpbXBsZW1lbnRzIFNwYW5JbnRlcmZhY2Uge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB0cmFjZUlkOiBzdHJpbmcgPSB1dWlkNCgpO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNwYW5JZDogc3RyaW5nID0gdXVpZDQoKS5zdWJzdHJpbmcoMTYpO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHBhcmVudFNwYW5JZD86IHN0cmluZztcblxuICAvKipcbiAgICogSW50ZXJuYWwga2VlcGVyIG9mIHRoZSBzdGF0dXNcbiAgICovXG4gIHB1YmxpYyBzdGF0dXM/OiBTcGFuU3RhdHVzIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNhbXBsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgaW4gc2Vjb25kcyB3aGVuIHRoZSBzcGFuIHdhcyBjcmVhdGVkLlxuICAgKi9cbiAgcHVibGljIHN0YXJ0VGltZXN0YW1wOiBudW1iZXIgPSB0aW1lc3RhbXBXaXRoTXMoKTtcblxuICAvKipcbiAgICogVGltZXN0YW1wIGluIHNlY29uZHMgd2hlbiB0aGUgc3BhbiBlbmRlZC5cbiAgICovXG4gIHB1YmxpYyBlbmRUaW1lc3RhbXA/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgb3A/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgdGFnczogeyBba2V5OiBzdHJpbmddOiBQcmltaXRpdmUgfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAvKipcbiAgICogTGlzdCBvZiBzcGFucyB0aGF0IHdlcmUgZmluYWxpemVkXG4gICAqL1xuICBwdWJsaWMgc3BhblJlY29yZGVyPzogU3BhblJlY29yZGVyO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRyYW5zYWN0aW9uPzogVHJhbnNhY3Rpb247XG5cbiAgLyoqXG4gICAqIFlvdSBzaG91bGQgbmV2ZXIgY2FsbCB0aGUgY29uc3RydWN0b3IgbWFudWFsbHksIGFsd2F5cyB1c2UgYFNlbnRyeS5zdGFydFRyYW5zYWN0aW9uKClgXG4gICAqIG9yIGNhbGwgYHN0YXJ0Q2hpbGQoKWAgb24gYW4gZXhpc3Rpbmcgc3Bhbi5cbiAgICogQGludGVybmFsXG4gICAqIEBoaWRlY29uc3RydWN0b3JcbiAgICogQGhpZGRlblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNwYW5Db250ZXh0PzogU3BhbkNvbnRleHQpIHtcbiAgICBpZiAoIXNwYW5Db250ZXh0KSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LnRyYWNlSWQpIHtcbiAgICAgIHRoaXMudHJhY2VJZCA9IHNwYW5Db250ZXh0LnRyYWNlSWQ7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5zcGFuSWQpIHtcbiAgICAgIHRoaXMuc3BhbklkID0gc3BhbkNvbnRleHQuc3BhbklkO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQucGFyZW50U3BhbklkKSB7XG4gICAgICB0aGlzLnBhcmVudFNwYW5JZCA9IHNwYW5Db250ZXh0LnBhcmVudFNwYW5JZDtcbiAgICB9XG4gICAgLy8gV2Ugd2FudCB0byBpbmNsdWRlIGJvb2xlYW5zIGFzIHdlbGwgaGVyZVxuICAgIGlmICgnc2FtcGxlZCcgaW4gc3BhbkNvbnRleHQpIHtcbiAgICAgIHRoaXMuc2FtcGxlZCA9IHNwYW5Db250ZXh0LnNhbXBsZWQ7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5vcCkge1xuICAgICAgdGhpcy5vcCA9IHNwYW5Db250ZXh0Lm9wO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQuZGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBzcGFuQ29udGV4dC5kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LmRhdGEpIHtcbiAgICAgIHRoaXMuZGF0YSA9IHNwYW5Db250ZXh0LmRhdGE7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC50YWdzKSB7XG4gICAgICB0aGlzLnRhZ3MgPSBzcGFuQ29udGV4dC50YWdzO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQuc3RhdHVzKSB7XG4gICAgICB0aGlzLnN0YXR1cyA9IHNwYW5Db250ZXh0LnN0YXR1cztcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LnN0YXJ0VGltZXN0YW1wKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZXN0YW1wID0gc3BhbkNvbnRleHQuc3RhcnRUaW1lc3RhbXA7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5lbmRUaW1lc3RhbXApIHtcbiAgICAgIHRoaXMuZW5kVGltZXN0YW1wID0gc3BhbkNvbnRleHQuZW5kVGltZXN0YW1wO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcHVibGljIGNoaWxkKFxuICAgIHNwYW5Db250ZXh0PzogUGljazxTcGFuQ29udGV4dCwgRXhjbHVkZTxrZXlvZiBTcGFuQ29udGV4dCwgJ3NwYW5JZCcgfCAnc2FtcGxlZCcgfCAndHJhY2VJZCcgfCAncGFyZW50U3BhbklkJz4+LFxuICApOiBTcGFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydENoaWxkKHNwYW5Db250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXJ0Q2hpbGQoXG4gICAgc3BhbkNvbnRleHQ/OiBQaWNrPFNwYW5Db250ZXh0LCBFeGNsdWRlPGtleW9mIFNwYW5Db250ZXh0LCAnc3BhbklkJyB8ICdzYW1wbGVkJyB8ICd0cmFjZUlkJyB8ICdwYXJlbnRTcGFuSWQnPj4sXG4gICk6IFNwYW4ge1xuICAgIGNvbnN0IGNoaWxkU3BhbiA9IG5ldyBTcGFuKHtcbiAgICAgIC4uLnNwYW5Db250ZXh0LFxuICAgICAgcGFyZW50U3BhbklkOiB0aGlzLnNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuc2FtcGxlZCxcbiAgICAgIHRyYWNlSWQ6IHRoaXMudHJhY2VJZCxcbiAgICB9KTtcblxuICAgIGNoaWxkU3Bhbi5zcGFuUmVjb3JkZXIgPSB0aGlzLnNwYW5SZWNvcmRlcjtcbiAgICBpZiAoY2hpbGRTcGFuLnNwYW5SZWNvcmRlcikge1xuICAgICAgY2hpbGRTcGFuLnNwYW5SZWNvcmRlci5hZGQoY2hpbGRTcGFuKTtcbiAgICB9XG5cbiAgICBjaGlsZFNwYW4udHJhbnNhY3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uO1xuXG4gICAgcmV0dXJuIGNoaWxkU3BhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFRhZyhrZXk6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSk6IHRoaXMge1xuICAgIHRoaXMudGFncyA9IHsgLi4udGhpcy50YWdzLCBba2V5XTogdmFsdWUgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgcHVibGljIHNldERhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB0aGlzIHtcbiAgICB0aGlzLmRhdGEgPSB7IC4uLnRoaXMuZGF0YSwgW2tleV06IHZhbHVlIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRTdGF0dXModmFsdWU6IFNwYW5TdGF0dXMpOiB0aGlzIHtcbiAgICB0aGlzLnN0YXR1cyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0SHR0cFN0YXR1cyhodHRwU3RhdHVzOiBudW1iZXIpOiB0aGlzIHtcbiAgICB0aGlzLnNldFRhZygnaHR0cC5zdGF0dXNfY29kZScsIFN0cmluZyhodHRwU3RhdHVzKSk7XG4gICAgY29uc3Qgc3BhblN0YXR1cyA9IFNwYW5TdGF0dXMuZnJvbUh0dHBDb2RlKGh0dHBTdGF0dXMpO1xuICAgIGlmIChzcGFuU3RhdHVzICE9PSBTcGFuU3RhdHVzLlVua25vd25FcnJvcikge1xuICAgICAgdGhpcy5zZXRTdGF0dXMoc3BhblN0YXR1cyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgaXNTdWNjZXNzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gU3BhblN0YXR1cy5PaztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGZpbmlzaChlbmRUaW1lc3RhbXA/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFRpbWVzdGFtcCA9IHR5cGVvZiBlbmRUaW1lc3RhbXAgPT09ICdudW1iZXInID8gZW5kVGltZXN0YW1wIDogdGltZXN0YW1wV2l0aE1zKCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB0b1RyYWNlcGFyZW50KCk6IHN0cmluZyB7XG4gICAgbGV0IHNhbXBsZWRTdHJpbmcgPSAnJztcbiAgICBpZiAodGhpcy5zYW1wbGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHNhbXBsZWRTdHJpbmcgPSB0aGlzLnNhbXBsZWQgPyAnLTEnIDogJy0wJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMudHJhY2VJZH0tJHt0aGlzLnNwYW5JZH0ke3NhbXBsZWRTdHJpbmd9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRvQ29udGV4dCgpOiBTcGFuQ29udGV4dCB7XG4gICAgcmV0dXJuIGRyb3BVbmRlZmluZWRLZXlzKHtcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgZW5kVGltZXN0YW1wOiB0aGlzLmVuZFRpbWVzdGFtcCxcbiAgICAgIG9wOiB0aGlzLm9wLFxuICAgICAgcGFyZW50U3BhbklkOiB0aGlzLnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IHRoaXMuc2FtcGxlZCxcbiAgICAgIHNwYW5JZDogdGhpcy5zcGFuSWQsXG4gICAgICBzdGFydFRpbWVzdGFtcDogdGhpcy5zdGFydFRpbWVzdGFtcCxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICB0cmFjZUlkOiB0aGlzLnRyYWNlSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVXaXRoQ29udGV4dChzcGFuQ29udGV4dDogU3BhbkNvbnRleHQpOiB0aGlzIHtcbiAgICB0aGlzLmRhdGEgPSBzcGFuQ29udGV4dC5kYXRhID8/IHt9O1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBzcGFuQ29udGV4dC5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLmVuZFRpbWVzdGFtcCA9IHNwYW5Db250ZXh0LmVuZFRpbWVzdGFtcDtcbiAgICB0aGlzLm9wID0gc3BhbkNvbnRleHQub3A7XG4gICAgdGhpcy5wYXJlbnRTcGFuSWQgPSBzcGFuQ29udGV4dC5wYXJlbnRTcGFuSWQ7XG4gICAgdGhpcy5zYW1wbGVkID0gc3BhbkNvbnRleHQuc2FtcGxlZDtcbiAgICB0aGlzLnNwYW5JZCA9IHNwYW5Db250ZXh0LnNwYW5JZCA/PyB0aGlzLnNwYW5JZDtcbiAgICB0aGlzLnN0YXJ0VGltZXN0YW1wID0gc3BhbkNvbnRleHQuc3RhcnRUaW1lc3RhbXAgPz8gdGhpcy5zdGFydFRpbWVzdGFtcDtcbiAgICB0aGlzLnN0YXR1cyA9IHNwYW5Db250ZXh0LnN0YXR1cztcbiAgICB0aGlzLnRhZ3MgPSBzcGFuQ29udGV4dC50YWdzID8/IHt9O1xuICAgIHRoaXMudHJhY2VJZCA9IHNwYW5Db250ZXh0LnRyYWNlSWQgPz8gdGhpcy50cmFjZUlkO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRUcmFjZUNvbnRleHQoKToge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YT86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgb3A/OiBzdHJpbmc7XG4gICAgcGFyZW50X3NwYW5faWQ/OiBzdHJpbmc7XG4gICAgc3Bhbl9pZDogc3RyaW5nO1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBQcmltaXRpdmUgfTtcbiAgICB0cmFjZV9pZDogc3RyaW5nO1xuICB9IHtcbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgZGF0YTogT2JqZWN0LmtleXModGhpcy5kYXRhKS5sZW5ndGggPiAwID8gdGhpcy5kYXRhIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBvcDogdGhpcy5vcCxcbiAgICAgIHBhcmVudF9zcGFuX2lkOiB0aGlzLnBhcmVudFNwYW5JZCxcbiAgICAgIHNwYW5faWQ6IHRoaXMuc3BhbklkLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHRhZ3M6IE9iamVjdC5rZXlzKHRoaXMudGFncykubGVuZ3RoID4gMCA/IHRoaXMudGFncyA6IHVuZGVmaW5lZCxcbiAgICAgIHRyYWNlX2lkOiB0aGlzLnRyYWNlSWQsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB0b0pTT04oKToge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZGF0YT86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgb3A/OiBzdHJpbmc7XG4gICAgcGFyZW50X3NwYW5faWQ/OiBzdHJpbmc7XG4gICAgc3Bhbl9pZDogc3RyaW5nO1xuICAgIHN0YXJ0X3RpbWVzdGFtcDogbnVtYmVyO1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBQcmltaXRpdmUgfTtcbiAgICB0aW1lc3RhbXA/OiBudW1iZXI7XG4gICAgdHJhY2VfaWQ6IHN0cmluZztcbiAgfSB7XG4gICAgcmV0dXJuIGRyb3BVbmRlZmluZWRLZXlzKHtcbiAgICAgIGRhdGE6IE9iamVjdC5rZXlzKHRoaXMuZGF0YSkubGVuZ3RoID4gMCA/IHRoaXMuZGF0YSA6IHVuZGVmaW5lZCxcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgb3A6IHRoaXMub3AsXG4gICAgICBwYXJlbnRfc3Bhbl9pZDogdGhpcy5wYXJlbnRTcGFuSWQsXG4gICAgICBzcGFuX2lkOiB0aGlzLnNwYW5JZCxcbiAgICAgIHN0YXJ0X3RpbWVzdGFtcDogdGhpcy5zdGFydFRpbWVzdGFtcCxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICB0YWdzOiBPYmplY3Qua2V5cyh0aGlzLnRhZ3MpLmxlbmd0aCA+IDAgPyB0aGlzLnRhZ3MgOiB1bmRlZmluZWQsXG4gICAgICB0aW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLFxuICAgICAgdHJhY2VfaWQ6IHRoaXMudHJhY2VJZCxcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGdldEN1cnJlbnRIdWIsIEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7XG4gIEV2ZW50LFxuICBNZWFzdXJlbWVudHMsXG4gIE91dGNvbWUsXG4gIFRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uSW50ZXJmYWNlLFxuICBUcmFuc2FjdGlvbkNvbnRleHQsXG4gIFRyYW5zYWN0aW9uTWV0YWRhdGEsXG59IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZHJvcFVuZGVmaW5lZEtleXMsIGlzSW5zdGFuY2VPZiwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IFNwYW4gYXMgU3BhbkNsYXNzLCBTcGFuUmVjb3JkZXIgfSBmcm9tICcuL3NwYW4nO1xuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbiBleHRlbmRzIFNwYW5DbGFzcyBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uSW50ZXJmYWNlIHtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcblxuICBwdWJsaWMgbWV0YWRhdGE6IFRyYW5zYWN0aW9uTWV0YWRhdGE7XG5cbiAgcHJpdmF0ZSBfbWVhc3VyZW1lbnRzOiBNZWFzdXJlbWVudHMgPSB7fTtcblxuICAvKipcbiAgICogVGhlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBodWIuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9odWI6IEh1YiA9IChnZXRDdXJyZW50SHViKCkgYXMgdW5rbm93bikgYXMgSHViO1xuXG4gIHByaXZhdGUgX3RyaW1FbmQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgbWFudWFsbHkuIFRob3NlIGluc3RydW1lbnRpbmcgdHJhY2luZyBzaG91bGQgdXNlXG4gICAqIGBTZW50cnkuc3RhcnRUcmFuc2FjdGlvbigpYCwgYW5kIGludGVybmFsIG1ldGhvZHMgc2hvdWxkIHVzZSBgaHViLnN0YXJ0VHJhbnNhY3Rpb24oKWAuXG4gICAqIEBpbnRlcm5hbFxuICAgKiBAaGlkZWNvbnN0cnVjdG9yXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0cmFuc2FjdGlvbkNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCwgaHViPzogSHViKSB7XG4gICAgc3VwZXIodHJhbnNhY3Rpb25Db250ZXh0KTtcblxuICAgIGlmIChpc0luc3RhbmNlT2YoaHViLCBIdWIpKSB7XG4gICAgICB0aGlzLl9odWIgPSBodWIgYXMgSHViO1xuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IHRyYW5zYWN0aW9uQ29udGV4dC5uYW1lIHx8ICcnO1xuXG4gICAgdGhpcy5tZXRhZGF0YSA9IHRyYW5zYWN0aW9uQ29udGV4dC5tZXRhZGF0YSB8fCB7fTtcbiAgICB0aGlzLl90cmltRW5kID0gdHJhbnNhY3Rpb25Db250ZXh0LnRyaW1FbmQ7XG5cbiAgICAvLyB0aGlzIGlzIGJlY2F1c2UgdHJhbnNhY3Rpb25zIGFyZSBhbHNvIHNwYW5zLCBhbmQgc3BhbnMgaGF2ZSBhIHRyYW5zYWN0aW9uIHBvaW50ZXJcbiAgICB0aGlzLnRyYW5zYWN0aW9uID0gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBKU0RvY1xuICAgKi9cbiAgcHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBTcGFuUmVjb3JkZXIgdG8gdGhlIHNwYW4gaXRzZWxmXG4gICAqIEBwYXJhbSBtYXhsZW4gbWF4aW11bSBudW1iZXIgb2Ygc3BhbnMgdGhhdCBjYW4gYmUgcmVjb3JkZWRcbiAgICovXG4gIHB1YmxpYyBpbml0U3BhblJlY29yZGVyKG1heGxlbjogbnVtYmVyID0gMTAwMCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zcGFuUmVjb3JkZXIpIHtcbiAgICAgIHRoaXMuc3BhblJlY29yZGVyID0gbmV3IFNwYW5SZWNvcmRlcihtYXhsZW4pO1xuICAgIH1cbiAgICB0aGlzLnNwYW5SZWNvcmRlci5hZGQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IG9ic2VydmVkIG1lYXN1cmVtZW50cyBmb3IgdGhpcyB0cmFuc2FjdGlvbi5cbiAgICogQGhpZGRlblxuICAgKi9cbiAgcHVibGljIHNldE1lYXN1cmVtZW50cyhtZWFzdXJlbWVudHM6IE1lYXN1cmVtZW50cyk6IHZvaWQge1xuICAgIHRoaXMuX21lYXN1cmVtZW50cyA9IHsgLi4ubWVhc3VyZW1lbnRzIH07XG4gIH1cblxuICAvKipcbiAgICogU2V0IG1ldGFkYXRhIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBwdWJsaWMgc2V0TWV0YWRhdGEobmV3TWV0YWRhdGE6IFRyYW5zYWN0aW9uTWV0YWRhdGEpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGFkYXRhID0geyAuLi50aGlzLm1ldGFkYXRhLCAuLi5uZXdNZXRhZGF0YSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZmluaXNoKGVuZFRpbWVzdGFtcD86IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyB0cmFuc2FjdGlvbiBpcyBhbHJlYWR5IGZpbmlzaGVkLCBzbyB3ZSBzaG91bGQgbm90IGZsdXNoIGl0IGFnYWluLlxuICAgIGlmICh0aGlzLmVuZFRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5uYW1lKSB7XG4gICAgICBsb2dnZXIud2FybignVHJhbnNhY3Rpb24gaGFzIG5vIG5hbWUsIGZhbGxpbmcgYmFjayB0byBgPHVubGFiZWxlZCB0cmFuc2FjdGlvbj5gLicpO1xuICAgICAgdGhpcy5uYW1lID0gJzx1bmxhYmVsZWQgdHJhbnNhY3Rpb24+JztcbiAgICB9XG5cbiAgICAvLyBqdXN0IHNldHMgdGhlIGVuZCB0aW1lc3RhbXBcbiAgICBzdXBlci5maW5pc2goZW5kVGltZXN0YW1wKTtcblxuICAgIGlmICh0aGlzLnNhbXBsZWQgIT09IHRydWUpIHtcbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQgaWYgYHNhbXBsZWQgIT09IHRydWVgIHdlIHdhbnQgdG8gZGlzY2FyZCB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICBsb2dnZXIubG9nKCdbVHJhY2luZ10gRGlzY2FyZGluZyB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0cyB0cmFjZSB3YXMgbm90IGNob3NlbiB0byBiZSBzYW1wbGVkLicpO1xuXG4gICAgICB0aGlzLl9odWJcbiAgICAgICAgLmdldENsaWVudCgpXG4gICAgICAgID8uZ2V0VHJhbnNwb3J0Py4oKVxuICAgICAgICAucmVjb3JkTG9zdEV2ZW50Py4oT3V0Y29tZS5TYW1wbGVSYXRlLCAndHJhbnNhY3Rpb24nKTtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBmaW5pc2hlZFNwYW5zID0gdGhpcy5zcGFuUmVjb3JkZXIgPyB0aGlzLnNwYW5SZWNvcmRlci5zcGFucy5maWx0ZXIocyA9PiBzICE9PSB0aGlzICYmIHMuZW5kVGltZXN0YW1wKSA6IFtdO1xuXG4gICAgaWYgKHRoaXMuX3RyaW1FbmQgJiYgZmluaXNoZWRTcGFucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmVuZFRpbWVzdGFtcCA9IGZpbmlzaGVkU3BhbnMucmVkdWNlKChwcmV2OiBTcGFuQ2xhc3MsIGN1cnJlbnQ6IFNwYW5DbGFzcykgPT4ge1xuICAgICAgICBpZiAocHJldi5lbmRUaW1lc3RhbXAgJiYgY3VycmVudC5lbmRUaW1lc3RhbXApIHtcbiAgICAgICAgICByZXR1cm4gcHJldi5lbmRUaW1lc3RhbXAgPiBjdXJyZW50LmVuZFRpbWVzdGFtcCA/IHByZXYgOiBjdXJyZW50O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfSkuZW5kVGltZXN0YW1wO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uOiBFdmVudCA9IHtcbiAgICAgIGNvbnRleHRzOiB7XG4gICAgICAgIHRyYWNlOiB0aGlzLmdldFRyYWNlQ29udGV4dCgpLFxuICAgICAgfSxcbiAgICAgIHNwYW5zOiBmaW5pc2hlZFNwYW5zLFxuICAgICAgc3RhcnRfdGltZXN0YW1wOiB0aGlzLnN0YXJ0VGltZXN0YW1wLFxuICAgICAgdGFnczogdGhpcy50YWdzLFxuICAgICAgdGltZXN0YW1wOiB0aGlzLmVuZFRpbWVzdGFtcCxcbiAgICAgIHRyYW5zYWN0aW9uOiB0aGlzLm5hbWUsXG4gICAgICB0eXBlOiAndHJhbnNhY3Rpb24nLFxuICAgICAgZGVidWdfbWV0YTogdGhpcy5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgY29uc3QgaGFzTWVhc3VyZW1lbnRzID0gT2JqZWN0LmtleXModGhpcy5fbWVhc3VyZW1lbnRzKS5sZW5ndGggPiAwO1xuXG4gICAgaWYgKGhhc01lYXN1cmVtZW50cykge1xuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIG1lYXN1cmVtZW50cyB0byB0cmFuc2FjdGlvbicsIEpTT04uc3RyaW5naWZ5KHRoaXMuX21lYXN1cmVtZW50cywgdW5kZWZpbmVkLCAyKSk7XG4gICAgICB0cmFuc2FjdGlvbi5tZWFzdXJlbWVudHMgPSB0aGlzLl9tZWFzdXJlbWVudHM7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmxvZyhgW1RyYWNpbmddIEZpbmlzaGluZyAke3RoaXMub3B9IHRyYW5zYWN0aW9uOiAke3RoaXMubmFtZX0uYCk7XG5cbiAgICByZXR1cm4gdGhpcy5faHViLmNhcHR1cmVFdmVudCh0cmFuc2FjdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB0b0NvbnRleHQoKTogVHJhbnNhY3Rpb25Db250ZXh0IHtcbiAgICBjb25zdCBzcGFuQ29udGV4dCA9IHN1cGVyLnRvQ29udGV4dCgpO1xuXG4gICAgcmV0dXJuIGRyb3BVbmRlZmluZWRLZXlzKHtcbiAgICAgIC4uLnNwYW5Db250ZXh0LFxuICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgdHJpbUVuZDogdGhpcy5fdHJpbUVuZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZVdpdGhDb250ZXh0KHRyYW5zYWN0aW9uQ29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0KTogdGhpcyB7XG4gICAgc3VwZXIudXBkYXRlV2l0aENvbnRleHQodHJhbnNhY3Rpb25Db250ZXh0KTtcblxuICAgIHRoaXMubmFtZSA9IHRyYW5zYWN0aW9uQ29udGV4dC5uYW1lID8/ICcnO1xuXG4gICAgdGhpcy5fdHJpbUVuZCA9IHRyYW5zYWN0aW9uQ29udGV4dC50cmltRW5kO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNvbnRleHQgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciwgdGltZXN0YW1wV2l0aE1zIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IEZJTklTSF9SRUFTT05fVEFHLCBJRExFX1RSQU5TQUNUSU9OX0ZJTklTSF9SRUFTT05TIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgU3BhbiwgU3BhblJlY29yZGVyIH0gZnJvbSAnLi9zcGFuJztcbmltcG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuL3NwYW5zdGF0dXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfSURMRV9USU1FT1VUID0gMTAwMDtcbmV4cG9ydCBjb25zdCBIRUFSVEJFQVRfSU5URVJWQUwgPSA1MDAwO1xuXG4vKipcbiAqIEBpbmhlcml0RG9jXG4gKi9cbmV4cG9ydCBjbGFzcyBJZGxlVHJhbnNhY3Rpb25TcGFuUmVjb3JkZXIgZXh0ZW5kcyBTcGFuUmVjb3JkZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcHVzaEFjdGl2aXR5OiAoaWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wb3BBY3Rpdml0eTogKGlkOiBzdHJpbmcpID0+IHZvaWQsXG4gICAgcHVibGljIHRyYW5zYWN0aW9uU3BhbklkOiBzdHJpbmcgPSAnJyxcbiAgICBtYXhsZW4/OiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKG1heGxlbik7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBhZGQoc3BhbjogU3Bhbik6IHZvaWQge1xuICAgIC8vIFdlIHNob3VsZCBtYWtlIHN1cmUgd2UgZG8gbm90IHB1c2ggYW5kIHBvcCBhY3Rpdml0aWVzIGZvclxuICAgIC8vIHRoZSB0cmFuc2FjdGlvbiB0aGF0IHRoaXMgc3BhbiByZWNvcmRlciBiZWxvbmdzIHRvLlxuICAgIGlmIChzcGFuLnNwYW5JZCAhPT0gdGhpcy50cmFuc2FjdGlvblNwYW5JZCkge1xuICAgICAgLy8gV2UgcGF0Y2ggc3Bhbi5maW5pc2goKSB0byBwb3AgYW4gYWN0aXZpdHkgYWZ0ZXIgc2V0dGluZyBhbiBlbmRUaW1lc3RhbXAuXG4gICAgICBzcGFuLmZpbmlzaCA9IChlbmRUaW1lc3RhbXA/OiBudW1iZXIpID0+IHtcbiAgICAgICAgc3Bhbi5lbmRUaW1lc3RhbXAgPSB0eXBlb2YgZW5kVGltZXN0YW1wID09PSAnbnVtYmVyJyA/IGVuZFRpbWVzdGFtcCA6IHRpbWVzdGFtcFdpdGhNcygpO1xuICAgICAgICB0aGlzLl9wb3BBY3Rpdml0eShzcGFuLnNwYW5JZCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBXZSBzaG91bGQgb25seSBwdXNoIG5ldyBhY3Rpdml0aWVzIGlmIHRoZSBzcGFuIGRvZXMgbm90IGhhdmUgYW4gZW5kIHRpbWVzdGFtcC5cbiAgICAgIGlmIChzcGFuLmVuZFRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX3B1c2hBY3Rpdml0eShzcGFuLnNwYW5JZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIuYWRkKHNwYW4pO1xuICB9XG59XG5cbmV4cG9ydCB0eXBlIEJlZm9yZUZpbmlzaENhbGxiYWNrID0gKHRyYW5zYWN0aW9uU3BhbjogSWRsZVRyYW5zYWN0aW9uLCBlbmRUaW1lc3RhbXA6IG51bWJlcikgPT4gdm9pZDtcblxuLyoqXG4gKiBBbiBJZGxlVHJhbnNhY3Rpb24gaXMgYSB0cmFuc2FjdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgZmluaXNoZXMuIEl0IGRvZXMgdGhpcyBieSB0cmFja2luZyBjaGlsZCBzcGFucyBhcyBhY3Rpdml0aWVzLlxuICogWW91IGNhbiBoYXZlIG11bHRpcGxlIElkbGVUcmFuc2FjdGlvbnMgYWN0aXZlLCBidXQgaWYgdGhlIGBvblNjb3BlYCBvcHRpb24gaXMgc3BlY2lmaWVkLCB0aGUgaWRsZSB0cmFuc2FjdGlvbiB3aWxsXG4gKiBwdXQgaXRzZWxmIG9uIHRoZSBzY29wZSBvbiBjcmVhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIElkbGVUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uIHtcbiAgLy8gQWN0aXZpdGllcyBzdG9yZSBhIGxpc3Qgb2YgYWN0aXZlIHNwYW5zXG4gIHB1YmxpYyBhY3Rpdml0aWVzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG4gIC8vIFRyYWNrIHN0YXRlIG9mIGFjdGl2aXRpZXMgaW4gcHJldmlvdXMgaGVhcnRiZWF0XG4gIHByaXZhdGUgX3ByZXZIZWFydGJlYXRTdHJpbmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBBbW91bnQgb2YgdGltZXMgaGVhcnRiZWF0IGhhcyBjb3VudGVkLiBXaWxsIGNhdXNlIHRyYW5zYWN0aW9uIHRvIGZpbmlzaCBhZnRlciAzIGJlYXRzLlxuICBwcml2YXRlIF9oZWFydGJlYXRDb3VudGVyOiBudW1iZXIgPSAwO1xuXG4gIC8vIFdlIHNob3VsZCBub3QgdXNlIGhlYXJ0YmVhdCBpZiB3ZSBmaW5pc2hlZCBhIHRyYW5zYWN0aW9uXG4gIHByaXZhdGUgX2ZpbmlzaGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYmVmb3JlRmluaXNoQ2FsbGJhY2tzOiBCZWZvcmVGaW5pc2hDYWxsYmFja1tdID0gW107XG5cbiAgLyoqXG4gICAqIElmIGEgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZCBhbmQgbm8gYWN0aXZpdGllcyBhcmUgYWRkZWQsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXRcbiAgICogaXQgdGltZXMgb3V0IHByb3Blcmx5LiBUaGlzIGlzIGNsZWFyZWQgYW5kIG5vdCB1c2VkIHdoZW4gYWN0aXZpdGllcyBhcmUgYWRkZWQuXG4gICAqL1xuICBwcml2YXRlIF9pbml0VGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHRyYW5zYWN0aW9uQ29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lkbGVIdWI/OiBIdWIsXG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgdG8gd2FpdCBpbiBtcyB1bnRpbCB0aGUgaWRsZSB0cmFuc2FjdGlvbiB3aWxsIGJlIGZpbmlzaGVkLlxuICAgICAqIEBkZWZhdWx0IDEwMDBcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9pZGxlVGltZW91dDogbnVtYmVyID0gREVGQVVMVF9JRExFX1RJTUVPVVQsXG4gICAgLy8gSWYgYW4gaWRsZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcHV0IGl0c2VsZiBvbiBhbmQgb2ZmIHRoZSBzY29wZSBhdXRvbWF0aWNhbGx5LlxuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uU2NvcGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKSB7XG4gICAgc3VwZXIodHJhbnNhY3Rpb25Db250ZXh0LCBfaWRsZUh1Yik7XG5cbiAgICBpZiAoX2lkbGVIdWIgJiYgX29uU2NvcGUpIHtcbiAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBhY3RpdmUgdHJhbnNhY3Rpb24gb24gdGhlIHNjb3BlXG4gICAgICBjbGVhckFjdGl2ZVRyYW5zYWN0aW9uKF9pZGxlSHViKTtcblxuICAgICAgLy8gV2Ugc2V0IHRoZSB0cmFuc2FjdGlvbiBoZXJlIG9uIHRoZSBzY29wZSBzbyBlcnJvciBldmVudHMgcGljayB1cCB0aGUgdHJhY2VcbiAgICAgIC8vIGNvbnRleHQgYW5kIGF0dGFjaCBpdCB0byB0aGUgZXJyb3IuXG4gICAgICBsb2dnZXIubG9nKGBTZXR0aW5nIGlkbGUgdHJhbnNhY3Rpb24gb24gc2NvcGUuIFNwYW4gSUQ6ICR7dGhpcy5zcGFuSWR9YCk7XG4gICAgICBfaWRsZUh1Yi5jb25maWd1cmVTY29wZShzY29wZSA9PiBzY29wZS5zZXRTcGFuKHRoaXMpKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbml0VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9maW5pc2hlZCkge1xuICAgICAgICB0aGlzLmZpbmlzaCgpO1xuICAgICAgfVxuICAgIH0sIHRoaXMuX2lkbGVUaW1lb3V0KTtcbiAgfVxuXG4gIC8qKiB7QGluaGVyaXREb2N9ICovXG4gIHB1YmxpYyBmaW5pc2goZW5kVGltZXN0YW1wOiBudW1iZXIgPSB0aW1lc3RhbXBXaXRoTXMoKSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZpdGllcyA9IHt9O1xuXG4gICAgaWYgKHRoaXMuc3BhblJlY29yZGVyKSB7XG4gICAgICBsb2dnZXIubG9nKCdbVHJhY2luZ10gZmluaXNoaW5nIElkbGVUcmFuc2FjdGlvbicsIG5ldyBEYXRlKGVuZFRpbWVzdGFtcCAqIDEwMDApLnRvSVNPU3RyaW5nKCksIHRoaXMub3ApO1xuXG4gICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuX2JlZm9yZUZpbmlzaENhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFjayh0aGlzLCBlbmRUaW1lc3RhbXApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNwYW5SZWNvcmRlci5zcGFucyA9IHRoaXMuc3BhblJlY29yZGVyLnNwYW5zLmZpbHRlcigoc3BhbjogU3BhbikgPT4ge1xuICAgICAgICAvLyBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBpdHNlbGYsIHdlIGp1c3QgcmV0dXJuIGl0XG4gICAgICAgIGlmIChzcGFuLnNwYW5JZCA9PT0gdGhpcy5zcGFuSWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIGNhbmNlbCBhbGwgcGVuZGluZyBzcGFucyB3aXRoIHN0YXR1cyBcImNhbmNlbGxlZFwiIHRvIGluZGljYXRlIHRoZSBpZGxlIHRyYW5zYWN0aW9uIHdhcyBmaW5pc2hlZCBlYXJseVxuICAgICAgICBpZiAoIXNwYW4uZW5kVGltZXN0YW1wKSB7XG4gICAgICAgICAgc3Bhbi5lbmRUaW1lc3RhbXAgPSBlbmRUaW1lc3RhbXA7XG4gICAgICAgICAgc3Bhbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5DYW5jZWxsZWQpO1xuICAgICAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBjYW5jZWxsaW5nIHNwYW4gc2luY2UgdHJhbnNhY3Rpb24gZW5kZWQgZWFybHknLCBKU09OLnN0cmluZ2lmeShzcGFuLCB1bmRlZmluZWQsIDIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGtlZXBTcGFuID0gc3Bhbi5zdGFydFRpbWVzdGFtcCA8IGVuZFRpbWVzdGFtcDtcbiAgICAgICAgaWYgKCFrZWVwU3Bhbikge1xuICAgICAgICAgIGxvZ2dlci5sb2coXG4gICAgICAgICAgICAnW1RyYWNpbmddIGRpc2NhcmRpbmcgU3BhbiBzaW5jZSBpdCBoYXBwZW5lZCBhZnRlciBUcmFuc2FjdGlvbiB3YXMgZmluaXNoZWQnLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoc3BhbiwgdW5kZWZpbmVkLCAyKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZWVwU3BhbjtcbiAgICAgIH0pO1xuXG4gICAgICBsb2dnZXIubG9nKCdbVHJhY2luZ10gZmx1c2hpbmcgSWRsZVRyYW5zYWN0aW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBObyBhY3RpdmUgSWRsZVRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gdGhpcy5fb25TY29wZSBpcyB0cnVlIGlmIHRoZSB0cmFuc2FjdGlvbiB3YXMgcHJldmlvdXNseSBvbiB0aGUgc2NvcGUuXG4gICAgaWYgKHRoaXMuX29uU2NvcGUpIHtcbiAgICAgIGNsZWFyQWN0aXZlVHJhbnNhY3Rpb24odGhpcy5faWRsZUh1Yik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmZpbmlzaChlbmRUaW1lc3RhbXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBnZXRzIGV4Y2VjdXRlZCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGZpbmlzaGVzLlxuICAgKiBVc2VmdWwgZm9yIGNsZWFudXAgb3IgaWYgeW91IHdhbnQgdG8gYWRkIGFueSBhZGRpdGlvbmFsIHNwYW5zIGJhc2VkIG9uIGN1cnJlbnQgY29udGV4dC5cbiAgICpcbiAgICogVGhpcyBpcyBleHBvc2VkIGJlY2F1c2UgdXNlcnMgaGF2ZSBubyBvdGhlciB3YXkgb2YgcnVubmluZyBzb21ldGhpbmcgYmVmb3JlIGFuIGlkbGUgdHJhbnNhY3Rpb25cbiAgICogZmluaXNoZXMuXG4gICAqL1xuICBwdWJsaWMgcmVnaXN0ZXJCZWZvcmVGaW5pc2hDYWxsYmFjayhjYWxsYmFjazogQmVmb3JlRmluaXNoQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLl9iZWZvcmVGaW5pc2hDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBpbml0U3BhblJlY29yZGVyKG1heGxlbj86IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zcGFuUmVjb3JkZXIpIHtcbiAgICAgIGNvbnN0IHB1c2hBY3Rpdml0eSA9IChpZDogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9maW5pc2hlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wdXNoQWN0aXZpdHkoaWQpO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IHBvcEFjdGl2aXR5ID0gKGlkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3BvcEFjdGl2aXR5KGlkKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc3BhblJlY29yZGVyID0gbmV3IElkbGVUcmFuc2FjdGlvblNwYW5SZWNvcmRlcihwdXNoQWN0aXZpdHksIHBvcEFjdGl2aXR5LCB0aGlzLnNwYW5JZCwgbWF4bGVuKTtcblxuICAgICAgLy8gU3RhcnQgaGVhcnRiZWF0IHNvIHRoYXQgdHJhbnNhY3Rpb25zIGRvIG5vdCBydW4gZm9yZXZlci5cbiAgICAgIGxvZ2dlci5sb2coJ1N0YXJ0aW5nIGhlYXJ0YmVhdCcpO1xuICAgICAgdGhpcy5fcGluZ0hlYXJ0YmVhdCgpO1xuICAgIH1cbiAgICB0aGlzLnNwYW5SZWNvcmRlci5hZGQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdHJhY2tpbmcgYSBzcGVjaWZpYyBhY3Rpdml0eS5cbiAgICogQHBhcmFtIHNwYW5JZCBUaGUgc3BhbiBpZCB0aGF0IHJlcHJlc2VudHMgdGhlIGFjdGl2aXR5XG4gICAqL1xuICBwcml2YXRlIF9wdXNoQWN0aXZpdHkoc3BhbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faW5pdFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9pbml0VGltZW91dCk7XG4gICAgICB0aGlzLl9pbml0VGltZW91dCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbG9nZ2VyLmxvZyhgW1RyYWNpbmddIHB1c2hBY3Rpdml0eTogJHtzcGFuSWR9YCk7XG4gICAgdGhpcy5hY3Rpdml0aWVzW3NwYW5JZF0gPSB0cnVlO1xuICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBuZXcgYWN0aXZpdGllcyBjb3VudCcsIE9iamVjdC5rZXlzKHRoaXMuYWN0aXZpdGllcykubGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gYWN0aXZpdHkgZnJvbSB1c2FnZVxuICAgKiBAcGFyYW0gc3BhbklkIFRoZSBzcGFuIGlkIHRoYXQgcmVwcmVzZW50cyB0aGUgYWN0aXZpdHlcbiAgICovXG4gIHByaXZhdGUgX3BvcEFjdGl2aXR5KHNwYW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWN0aXZpdGllc1tzcGFuSWRdKSB7XG4gICAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gcG9wQWN0aXZpdHkgJHtzcGFuSWR9YCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgdGhpcy5hY3Rpdml0aWVzW3NwYW5JZF07XG4gICAgICBsb2dnZXIubG9nKCdbVHJhY2luZ10gbmV3IGFjdGl2aXRpZXMgY291bnQnLCBPYmplY3Qua2V5cyh0aGlzLmFjdGl2aXRpZXMpLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuYWN0aXZpdGllcykubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5faWRsZVRpbWVvdXQ7XG4gICAgICAvLyBXZSBuZWVkIHRvIGFkZCB0aGUgdGltZW91dCBoZXJlIHRvIGhhdmUgdGhlIHJlYWwgZW5kdGltZXN0YW1wIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgICAgLy8gUmVtZW1iZXIgdGltZXN0YW1wV2l0aE1zIGlzIGluIHNlY29uZHMsIHRpbWVvdXQgaXMgaW4gbXNcbiAgICAgIGNvbnN0IGVuZCA9IHRpbWVzdGFtcFdpdGhNcygpICsgdGltZW91dCAvIDEwMDA7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRUYWcoRklOSVNIX1JFQVNPTl9UQUcsIElETEVfVFJBTlNBQ1RJT05fRklOSVNIX1JFQVNPTlNbMV0pO1xuICAgICAgICAgIHRoaXMuZmluaXNoKGVuZCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hlbiBlbnRyaWVzIG9mIHRoaXMuYWN0aXZpdGllcyBhcmUgbm90IGNoYW5naW5nIGZvciAzIGJlYXRzLlxuICAgKiBJZiB0aGlzIG9jY3VycyB3ZSBmaW5pc2ggdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfYmVhdCgpOiB2b2lkIHtcbiAgICAvLyBXZSBzaG91bGQgbm90IGJlIHJ1bm5pbmcgaGVhcnRiZWF0IGlmIHRoZSBpZGxlIHRyYW5zYWN0aW9uIGlzIGZpbmlzaGVkLlxuICAgIGlmICh0aGlzLl9maW5pc2hlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhlYXJ0YmVhdFN0cmluZyA9IE9iamVjdC5rZXlzKHRoaXMuYWN0aXZpdGllcykuam9pbignJyk7XG5cbiAgICBpZiAoaGVhcnRiZWF0U3RyaW5nID09PSB0aGlzLl9wcmV2SGVhcnRiZWF0U3RyaW5nKSB7XG4gICAgICB0aGlzLl9oZWFydGJlYXRDb3VudGVyICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdENvdW50ZXIgPSAxO1xuICAgIH1cblxuICAgIHRoaXMuX3ByZXZIZWFydGJlYXRTdHJpbmcgPSBoZWFydGJlYXRTdHJpbmc7XG5cbiAgICBpZiAodGhpcy5faGVhcnRiZWF0Q291bnRlciA+PSAzKSB7XG4gICAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gVHJhbnNhY3Rpb24gZmluaXNoZWQgYmVjYXVzZSBvZiBubyBjaGFuZ2UgZm9yIDMgaGVhcnQgYmVhdHNgKTtcbiAgICAgIHRoaXMuc2V0U3RhdHVzKFNwYW5TdGF0dXMuRGVhZGxpbmVFeGNlZWRlZCk7XG4gICAgICB0aGlzLnNldFRhZyhGSU5JU0hfUkVBU09OX1RBRywgSURMRV9UUkFOU0FDVElPTl9GSU5JU0hfUkVBU09OU1swXSk7XG4gICAgICB0aGlzLmZpbmlzaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9waW5nSGVhcnRiZWF0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBpbmdzIHRoZSBoZWFydGJlYXRcbiAgICovXG4gIHByaXZhdGUgX3BpbmdIZWFydGJlYXQoKTogdm9pZCB7XG4gICAgbG9nZ2VyLmxvZyhgcGluZ2luZyBIZWFydGJlYXQgLT4gY3VycmVudCBjb3VudGVyOiAke3RoaXMuX2hlYXJ0YmVhdENvdW50ZXJ9YCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9iZWF0KCk7XG4gICAgfSwgSEVBUlRCRUFUX0lOVEVSVkFMKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc2V0IGFjdGl2ZSB0cmFuc2FjdGlvbiBvbiBzY29wZVxuICovXG5mdW5jdGlvbiBjbGVhckFjdGl2ZVRyYW5zYWN0aW9uKGh1Yj86IEh1Yik6IHZvaWQge1xuICBpZiAoaHViKSB7XG4gICAgY29uc3Qgc2NvcGUgPSBodWIuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gc2NvcGUuZ2V0VHJhbnNhY3Rpb24oKTtcbiAgICAgIGlmICh0cmFuc2FjdGlvbikge1xuICAgICAgICBzY29wZS5zZXRTcGFuKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0TWFpbkNhcnJpZXIsIEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7XG4gIEN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbiAgSW50ZWdyYXRpb24sXG4gIEludGVncmF0aW9uQ2xhc3MsXG4gIE9wdGlvbnMsXG4gIFNhbXBsaW5nQ29udGV4dCxcbiAgVHJhbnNhY3Rpb25Db250ZXh0LFxuICBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGR5bmFtaWNSZXF1aXJlLCBpc05vZGVFbnYsIGxvYWRNb2R1bGUsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyByZWdpc3RlckVycm9ySW5zdHJ1bWVudGF0aW9uIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgSWRsZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi9pZGxldHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IGhhc1RyYWNpbmdFbmFibGVkIH0gZnJvbSAnLi91dGlscyc7XG5cbi8qKiBSZXR1cm5zIGFsbCB0cmFjZSBoZWFkZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBvbiB0aGUgdG9wIHNjb3BlLiAqL1xuZnVuY3Rpb24gdHJhY2VIZWFkZXJzKHRoaXM6IEh1Yik6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgaWYgKHNjb3BlKSB7XG4gICAgY29uc3Qgc3BhbiA9IHNjb3BlLmdldFNwYW4oKTtcbiAgICBpZiAoc3Bhbikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ3NlbnRyeS10cmFjZSc6IHNwYW4udG9UcmFjZXBhcmVudCgpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIE1ha2VzIGEgc2FtcGxpbmcgZGVjaXNpb24gZm9yIHRoZSBnaXZlbiB0cmFuc2FjdGlvbiBhbmQgc3RvcmVzIGl0IG9uIHRoZSB0cmFuc2FjdGlvbi5cbiAqXG4gKiBDYWxsZWQgZXZlcnkgdGltZSBhIHRyYW5zYWN0aW9uIGlzIGNyZWF0ZWQuIE9ubHkgdHJhbnNhY3Rpb25zIHdoaWNoIGVtZXJnZSB3aXRoIGEgYHNhbXBsZWRgIHZhbHVlIG9mIGB0cnVlYCB3aWxsIGJlXG4gKiBzZW50IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gaHViOiBUaGUgaHViIG9mZiBvZiB3aGljaCB0byByZWFkIGNvbmZpZyBvcHRpb25zXG4gKiBAcGFyYW0gdHJhbnNhY3Rpb246IFRoZSB0cmFuc2FjdGlvbiBuZWVkaW5nIGEgc2FtcGxpbmcgZGVjaXNpb25cbiAqIEBwYXJhbSBzYW1wbGluZ0NvbnRleHQ6IERlZmF1bHQgYW5kIHVzZXItcHJvdmlkZWQgZGF0YSB3aGljaCBtYXkgYmUgdXNlZCB0byBoZWxwIG1ha2UgdGhlIGRlY2lzaW9uXG4gKlxuICogQHJldHVybnMgVGhlIGdpdmVuIHRyYW5zYWN0aW9uIHdpdGggaXRzIGBzYW1wbGVkYCB2YWx1ZSBzZXRcbiAqL1xuZnVuY3Rpb24gc2FtcGxlPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbj4odHJhbnNhY3Rpb246IFQsIG9wdGlvbnM6IE9wdGlvbnMsIHNhbXBsaW5nQ29udGV4dDogU2FtcGxpbmdDb250ZXh0KTogVCB7XG4gIC8vIG5vdGhpbmcgdG8gZG8gaWYgdHJhY2luZyBpcyBub3QgZW5hYmxlZFxuICBpZiAoIWhhc1RyYWNpbmdFbmFibGVkKG9wdGlvbnMpKSB7XG4gICAgdHJhbnNhY3Rpb24uc2FtcGxlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8vIGlmIHRoZSB1c2VyIGhhcyBmb3JjZWQgYSBzYW1wbGluZyBkZWNpc2lvbiBieSBwYXNzaW5nIGEgYHNhbXBsZWRgIHZhbHVlIGluIHRoZWlyIHRyYW5zYWN0aW9uIGNvbnRleHQsIGdvIHdpdGggdGhhdFxuICBpZiAodHJhbnNhY3Rpb24uc2FtcGxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJhbnNhY3Rpb24uc2V0TWV0YWRhdGEoe1xuICAgICAgdHJhbnNhY3Rpb25TYW1wbGluZzogeyBtZXRob2Q6IFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QuRXhwbGljaXQgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvLyB3ZSB3b3VsZCBoYXZlIGJhaWxlZCBhbHJlYWR5IGlmIG5laXRoZXIgYHRyYWNlc1NhbXBsZXJgIG5vciBgdHJhY2VzU2FtcGxlUmF0ZWAgd2VyZSBkZWZpbmVkLCBzbyBvbmUgb2YgdGhlc2Ugc2hvdWxkXG4gIC8vIHdvcms7IHByZWZlciB0aGUgaG9vayBpZiBzb1xuICBsZXQgc2FtcGxlUmF0ZTtcbiAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYWNlc1NhbXBsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzYW1wbGVSYXRlID0gb3B0aW9ucy50cmFjZXNTYW1wbGVyKHNhbXBsaW5nQ29udGV4dCk7XG4gICAgdHJhbnNhY3Rpb24uc2V0TWV0YWRhdGEoe1xuICAgICAgdHJhbnNhY3Rpb25TYW1wbGluZzoge1xuICAgICAgICBtZXRob2Q6IFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QuU2FtcGxlcixcbiAgICAgICAgLy8gY2FzdCB0byBudW1iZXIgaW4gY2FzZSBpdCdzIGEgYm9vbGVhblxuICAgICAgICByYXRlOiBOdW1iZXIoc2FtcGxlUmF0ZSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKHNhbXBsaW5nQ29udGV4dC5wYXJlbnRTYW1wbGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBzYW1wbGVSYXRlID0gc2FtcGxpbmdDb250ZXh0LnBhcmVudFNhbXBsZWQ7XG4gICAgdHJhbnNhY3Rpb24uc2V0TWV0YWRhdGEoe1xuICAgICAgdHJhbnNhY3Rpb25TYW1wbGluZzogeyBtZXRob2Q6IFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QuSW5oZXJpdGFuY2UgfSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBzYW1wbGVSYXRlID0gb3B0aW9ucy50cmFjZXNTYW1wbGVSYXRlO1xuICAgIHRyYW5zYWN0aW9uLnNldE1ldGFkYXRhKHtcbiAgICAgIHRyYW5zYWN0aW9uU2FtcGxpbmc6IHtcbiAgICAgICAgbWV0aG9kOiBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kLlJhdGUsXG4gICAgICAgIC8vIGNhc3QgdG8gbnVtYmVyIGluIGNhc2UgaXQncyBhIGJvb2xlYW5cbiAgICAgICAgcmF0ZTogTnVtYmVyKHNhbXBsZVJhdGUpLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNpbmNlIHRoaXMgaXMgY29taW5nIGZyb20gdGhlIHVzZXIgKG9yIGZyb20gYSBmdW5jdGlvbiBwcm92aWRlZCBieSB0aGUgdXNlciksIHdobyBrbm93cyB3aGF0IHdlIG1pZ2h0IGdldC4gKFRoZVxuICAvLyBvbmx5IHZhbGlkIHZhbHVlcyBhcmUgYm9vbGVhbnMgb3IgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDEuKVxuICBpZiAoIWlzVmFsaWRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpKSB7XG4gICAgbG9nZ2VyLndhcm4oYFtUcmFjaW5nXSBEaXNjYXJkaW5nIHRyYW5zYWN0aW9uIGJlY2F1c2Ugb2YgaW52YWxpZCBzYW1wbGUgcmF0ZS5gKTtcbiAgICB0cmFuc2FjdGlvbi5zYW1wbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLy8gaWYgdGhlIGZ1bmN0aW9uIHJldHVybmVkIDAgKG9yIGZhbHNlKSwgb3IgaWYgYHRyYWNlc1NhbXBsZVJhdGVgIGlzIDAsIGl0J3MgYSBzaWduIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgYmUgZHJvcHBlZFxuICBpZiAoIXNhbXBsZVJhdGUpIHtcbiAgICBsb2dnZXIubG9nKFxuICAgICAgYFtUcmFjaW5nXSBEaXNjYXJkaW5nIHRyYW5zYWN0aW9uIGJlY2F1c2UgJHtcbiAgICAgICAgdHlwZW9mIG9wdGlvbnMudHJhY2VzU2FtcGxlciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gJ3RyYWNlc1NhbXBsZXIgcmV0dXJuZWQgMCBvciBmYWxzZSdcbiAgICAgICAgICA6ICdhIG5lZ2F0aXZlIHNhbXBsaW5nIGRlY2lzaW9uIHdhcyBpbmhlcml0ZWQgb3IgdHJhY2VzU2FtcGxlUmF0ZSBpcyBzZXQgdG8gMCdcbiAgICAgIH1gLFxuICAgICk7XG4gICAgdHJhbnNhY3Rpb24uc2FtcGxlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8vIE5vdyB3ZSByb2xsIHRoZSBkaWNlLiBNYXRoLnJhbmRvbSBpcyBpbmNsdXNpdmUgb2YgMCwgYnV0IG5vdCBvZiAxLCBzbyBzdHJpY3QgPCBpcyBzYWZlIGhlcmUuIEluIGNhc2Ugc2FtcGxlUmF0ZSBpc1xuICAvLyBhIGJvb2xlYW4sIHRoZSA8IGNvbXBhcmlzb24gd2lsbCBjYXVzZSBpdCB0byBiZSBhdXRvbWF0aWNhbGx5IGNhc3QgdG8gMSBpZiBpdCdzIHRydWUgYW5kIDAgaWYgaXQncyBmYWxzZS5cbiAgdHJhbnNhY3Rpb24uc2FtcGxlZCA9IE1hdGgucmFuZG9tKCkgPCAoc2FtcGxlUmF0ZSBhcyBudW1iZXIgfCBib29sZWFuKTtcblxuICAvLyBpZiB3ZSdyZSBub3QgZ29pbmcgdG8ga2VlcCBpdCwgd2UncmUgZG9uZVxuICBpZiAoIXRyYW5zYWN0aW9uLnNhbXBsZWQpIHtcbiAgICBsb2dnZXIubG9nKFxuICAgICAgYFtUcmFjaW5nXSBEaXNjYXJkaW5nIHRyYW5zYWN0aW9uIGJlY2F1c2UgaXQncyBub3QgaW5jbHVkZWQgaW4gdGhlIHJhbmRvbSBzYW1wbGUgKHNhbXBsaW5nIHJhdGUgPSAke051bWJlcihcbiAgICAgICAgc2FtcGxlUmF0ZSxcbiAgICAgICl9KWAsXG4gICAgKTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH1cblxuICBsb2dnZXIubG9nKGBbVHJhY2luZ10gc3RhcnRpbmcgJHt0cmFuc2FjdGlvbi5vcH0gdHJhbnNhY3Rpb24gLSAke3RyYW5zYWN0aW9uLm5hbWV9YCk7XG4gIHJldHVybiB0cmFuc2FjdGlvbjtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIGdpdmVuIHNhbXBsZSByYXRlIHRvIG1ha2Ugc3VyZSBpdCBpcyB2YWxpZCB0eXBlIGFuZCB2YWx1ZSAoYSBib29sZWFuLCBvciBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEpLlxuICovXG5mdW5jdGlvbiBpc1ZhbGlkU2FtcGxlUmF0ZShyYXRlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIC8vIHdlIG5lZWQgdG8gY2hlY2sgTmFOIGV4cGxpY2l0bHkgYmVjYXVzZSBpdCdzIG9mIHR5cGUgJ251bWJlcicgYW5kIHRoZXJlZm9yZSB3b3VsZG4ndCBnZXQgY2F1Z2h0IGJ5IHRoaXMgdHlwZWNoZWNrXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGlmIChpc05hTihyYXRlIGFzIGFueSkgfHwgISh0eXBlb2YgcmF0ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHJhdGUgPT09ICdib29sZWFuJykpIHtcbiAgICBsb2dnZXIud2FybihcbiAgICAgIGBbVHJhY2luZ10gR2l2ZW4gc2FtcGxlIHJhdGUgaXMgaW52YWxpZC4gU2FtcGxlIHJhdGUgbXVzdCBiZSBhIGJvb2xlYW4gb3IgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLiBHb3QgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgcmF0ZSxcbiAgICAgICl9IG9mIHR5cGUgJHtKU09OLnN0cmluZ2lmeSh0eXBlb2YgcmF0ZSl9LmAsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBpbiBjYXNlIHNhbXBsZVJhdGUgaXMgYSBib29sZWFuLCBpdCB3aWxsIGdldCBhdXRvbWF0aWNhbGx5IGNhc3QgdG8gMSBpZiBpdCdzIHRydWUgYW5kIDAgaWYgaXQncyBmYWxzZVxuICBpZiAocmF0ZSA8IDAgfHwgcmF0ZSA+IDEpIHtcbiAgICBsb2dnZXIud2FybihgW1RyYWNpbmddIEdpdmVuIHNhbXBsZSByYXRlIGlzIGludmFsaWQuIFNhbXBsZSByYXRlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxLiBHb3QgJHtyYXRlfS5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB0cmFuc2FjdGlvbiBhbmQgYWRkcyBhIHNhbXBsaW5nIGRlY2lzaW9uIGlmIGl0IGRvZXNuJ3QgeWV0IGhhdmUgb25lLlxuICpcbiAqIFRoZSBIdWIuc3RhcnRUcmFuc2FjdGlvbiBtZXRob2QgZGVsZWdhdGVzIHRvIHRoaXMgbWV0aG9kIHRvIGRvIGl0cyB3b3JrLCBwYXNzaW5nIHRoZSBIdWIgaW5zdGFuY2UgaW4gYXMgYHRoaXNgLCBhcyBpZlxuICogaXQgaGFkIGJlZW4gY2FsbGVkIG9uIHRoZSBodWIgZGlyZWN0bHkuIEV4aXN0cyBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIHRoYXQgaXQgY2FuIGJlIGluamVjdGVkIGludG8gdGhlIGNsYXNzIGFzIGFuXG4gKiBcImV4dGVuc2lvbiBtZXRob2QuXCJcbiAqXG4gKiBAcGFyYW0gdGhpczogVGhlIEh1YiBzdGFydGluZyB0aGUgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB0cmFuc2FjdGlvbkNvbnRleHQ6IERhdGEgdXNlZCB0byBjb25maWd1cmUgdGhlIHRyYW5zYWN0aW9uXG4gKiBAcGFyYW0gQ3VzdG9tU2FtcGxpbmdDb250ZXh0OiBPcHRpb25hbCBkYXRhIHRvIGJlIHByb3ZpZGVkIHRvIHRoZSBgdHJhY2VzU2FtcGxlcmAgZnVuY3Rpb24gKGlmIGFueSlcbiAqXG4gKiBAcmV0dXJucyBUaGUgbmV3IHRyYW5zYWN0aW9uXG4gKlxuICogQHNlZSB7QGxpbmsgSHViLnN0YXJ0VHJhbnNhY3Rpb259XG4gKi9cbmZ1bmN0aW9uIF9zdGFydFRyYW5zYWN0aW9uKFxuICB0aGlzOiBIdWIsXG4gIHRyYW5zYWN0aW9uQ29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0LFxuICBjdXN0b21TYW1wbGluZ0NvbnRleHQ/OiBDdXN0b21TYW1wbGluZ0NvbnRleHQsXG4pOiBUcmFuc2FjdGlvbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdldENsaWVudCgpPy5nZXRPcHRpb25zKCkgfHwge307XG5cbiAgbGV0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ29udGV4dCwgdGhpcyk7XG4gIHRyYW5zYWN0aW9uID0gc2FtcGxlKHRyYW5zYWN0aW9uLCBvcHRpb25zLCB7XG4gICAgcGFyZW50U2FtcGxlZDogdHJhbnNhY3Rpb25Db250ZXh0LnBhcmVudFNhbXBsZWQsXG4gICAgdHJhbnNhY3Rpb25Db250ZXh0LFxuICAgIC4uLmN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbiAgfSk7XG4gIGlmICh0cmFuc2FjdGlvbi5zYW1wbGVkKSB7XG4gICAgdHJhbnNhY3Rpb24uaW5pdFNwYW5SZWNvcmRlcihvcHRpb25zLl9leHBlcmltZW50cz8ubWF4U3BhbnMgYXMgbnVtYmVyKTtcbiAgfVxuICByZXR1cm4gdHJhbnNhY3Rpb247XG59XG5cbi8qKlxuICogQ3JlYXRlIG5ldyBpZGxlIHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhcnRJZGxlVHJhbnNhY3Rpb24oXG4gIGh1YjogSHViLFxuICB0cmFuc2FjdGlvbkNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXIsXG4gIG9uU2NvcGU/OiBib29sZWFuLFxuICBjdXN0b21TYW1wbGluZ0NvbnRleHQ/OiBDdXN0b21TYW1wbGluZ0NvbnRleHQsXG4pOiBJZGxlVHJhbnNhY3Rpb24ge1xuICBjb25zdCBvcHRpb25zID0gaHViLmdldENsaWVudCgpPy5nZXRPcHRpb25zKCkgfHwge307XG5cbiAgbGV0IHRyYW5zYWN0aW9uID0gbmV3IElkbGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbkNvbnRleHQsIGh1YiwgaWRsZVRpbWVvdXQsIG9uU2NvcGUpO1xuICB0cmFuc2FjdGlvbiA9IHNhbXBsZSh0cmFuc2FjdGlvbiwgb3B0aW9ucywge1xuICAgIHBhcmVudFNhbXBsZWQ6IHRyYW5zYWN0aW9uQ29udGV4dC5wYXJlbnRTYW1wbGVkLFxuICAgIHRyYW5zYWN0aW9uQ29udGV4dCxcbiAgICAuLi5jdXN0b21TYW1wbGluZ0NvbnRleHQsXG4gIH0pO1xuICBpZiAodHJhbnNhY3Rpb24uc2FtcGxlZCkge1xuICAgIHRyYW5zYWN0aW9uLmluaXRTcGFuUmVjb3JkZXIob3B0aW9ucy5fZXhwZXJpbWVudHM/Lm1heFNwYW5zIGFzIG51bWJlcik7XG4gIH1cbiAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfYWRkVHJhY2luZ0V4dGVuc2lvbnMoKTogdm9pZCB7XG4gIGNvbnN0IGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuICBpZiAoIWNhcnJpZXIuX19TRU5UUllfXykge1xuICAgIHJldHVybjtcbiAgfVxuICBjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucyA9IGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zIHx8IHt9O1xuICBpZiAoIWNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLnN0YXJ0VHJhbnNhY3Rpb24pIHtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucy5zdGFydFRyYW5zYWN0aW9uID0gX3N0YXJ0VHJhbnNhY3Rpb247XG4gIH1cbiAgaWYgKCFjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucy50cmFjZUhlYWRlcnMpIHtcbiAgICBjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucy50cmFjZUhlYWRlcnMgPSB0cmFjZUhlYWRlcnM7XG4gIH1cbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfYXV0b2xvYWREYXRhYmFzZUludGVncmF0aW9ucygpOiB2b2lkIHtcbiAgY29uc3QgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG4gIGlmICghY2Fycmllci5fX1NFTlRSWV9fKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZVRvSW50ZWdyYXRpb25NYXBwaW5nOiBSZWNvcmQ8c3RyaW5nLCAoKSA9PiBJbnRlZ3JhdGlvbj4gPSB7XG4gICAgbW9uZ29kYigpIHtcbiAgICAgIGNvbnN0IGludGVncmF0aW9uID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAnLi9pbnRlZ3JhdGlvbnMvbm9kZS9tb25nbycpIGFzIHtcbiAgICAgICAgTW9uZ286IEludGVncmF0aW9uQ2xhc3M8SW50ZWdyYXRpb24+O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb24uTW9uZ28oKTtcbiAgICB9LFxuICAgIG1vbmdvb3NlKCkge1xuICAgICAgY29uc3QgaW50ZWdyYXRpb24gPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICcuL2ludGVncmF0aW9ucy9ub2RlL21vbmdvJykgYXMge1xuICAgICAgICBNb25nbzogSW50ZWdyYXRpb25DbGFzczxJbnRlZ3JhdGlvbj47XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbi5Nb25nbyh7IG1vbmdvb3NlOiB0cnVlIH0pO1xuICAgIH0sXG4gICAgbXlzcWwoKSB7XG4gICAgICBjb25zdCBpbnRlZ3JhdGlvbiA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJy4vaW50ZWdyYXRpb25zL25vZGUvbXlzcWwnKSBhcyB7XG4gICAgICAgIE15c3FsOiBJbnRlZ3JhdGlvbkNsYXNzPEludGVncmF0aW9uPjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IGludGVncmF0aW9uLk15c3FsKCk7XG4gICAgfSxcbiAgICBwZygpIHtcbiAgICAgIGNvbnN0IGludGVncmF0aW9uID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAnLi9pbnRlZ3JhdGlvbnMvbm9kZS9wb3N0Z3JlcycpIGFzIHtcbiAgICAgICAgUG9zdGdyZXM6IEludGVncmF0aW9uQ2xhc3M8SW50ZWdyYXRpb24+O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb24uUG9zdGdyZXMoKTtcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IG1hcHBlZFBhY2thZ2VzID0gT2JqZWN0LmtleXMocGFja2FnZVRvSW50ZWdyYXRpb25NYXBwaW5nKVxuICAgIC5maWx0ZXIobW9kdWxlTmFtZSA9PiAhIWxvYWRNb2R1bGUobW9kdWxlTmFtZSkpXG4gICAgLm1hcChwa2cgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHBhY2thZ2VUb0ludGVncmF0aW9uTWFwcGluZ1twa2ddKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSlcbiAgICAuZmlsdGVyKHAgPT4gcCkgYXMgSW50ZWdyYXRpb25bXTtcblxuICBpZiAobWFwcGVkUGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgIGNhcnJpZXIuX19TRU5UUllfXy5pbnRlZ3JhdGlvbnMgPSBbLi4uKGNhcnJpZXIuX19TRU5UUllfXy5pbnRlZ3JhdGlvbnMgfHwgW10pLCAuLi5tYXBwZWRQYWNrYWdlc107XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIHBhdGNoZXMgdGhlIGdsb2JhbCBvYmplY3QgYW5kIGluamVjdHMgdGhlIFRyYWNpbmcgZXh0ZW5zaW9ucyBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFeHRlbnNpb25NZXRob2RzKCk6IHZvaWQge1xuICBfYWRkVHJhY2luZ0V4dGVuc2lvbnMoKTtcblxuICAvLyBEZXRlY3QgYW5kIGF1dG9tYXRpY2FsbHkgbG9hZCBzcGVjaWZpZWQgaW50ZWdyYXRpb25zLlxuICBpZiAoaXNOb2RlRW52KCkpIHtcbiAgICBfYXV0b2xvYWREYXRhYmFzZUludGVncmF0aW9ucygpO1xuICB9XG5cbiAgLy8gSWYgYW4gZXJyb3IgaGFwcGVucyBnbG9iYWxseSwgd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0cmFuc2FjdGlvbiBzdGF0dXMgaXMgc2V0IHRvIGVycm9yLlxuICByZWdpc3RlckVycm9ySW5zdHJ1bWVudGF0aW9uKCk7XG59XG4iLCAiaW1wb3J0IHsgSW50ZWdyYXRpb24sIFRyYW5zYWN0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxudHlwZSBNZXRob2QgPVxuICB8ICdhbGwnXG4gIHwgJ2dldCdcbiAgfCAncG9zdCdcbiAgfCAncHV0J1xuICB8ICdkZWxldGUnXG4gIHwgJ3BhdGNoJ1xuICB8ICdvcHRpb25zJ1xuICB8ICdoZWFkJ1xuICB8ICdjaGVja291dCdcbiAgfCAnY29weSdcbiAgfCAnbG9jaydcbiAgfCAnbWVyZ2UnXG4gIHwgJ21rYWN0aXZpdHknXG4gIHwgJ21rY29sJ1xuICB8ICdtb3ZlJ1xuICB8ICdtLXNlYXJjaCdcbiAgfCAnbm90aWZ5J1xuICB8ICdwdXJnZSdcbiAgfCAncmVwb3J0J1xuICB8ICdzZWFyY2gnXG4gIHwgJ3N1YnNjcmliZSdcbiAgfCAndHJhY2UnXG4gIHwgJ3VubG9jaydcbiAgfCAndW5zdWJzY3JpYmUnXG4gIHwgJ3VzZSc7XG5cbnR5cGUgUm91dGVyID0ge1xuICBbbWV0aG9kIGluIE1ldGhvZF06ICguLi5hcmdzOiBhbnkpID0+IGFueTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG59O1xuXG5pbnRlcmZhY2UgRXhwcmVzc1Jlc3BvbnNlIHtcbiAgb25jZShuYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBoZWxwZXIgZm9yIGBfX3NlbnRyeV90cmFuc2FjdGlvbmBcbiAqIEBoaWRkZW5cbiAqL1xuaW50ZXJmYWNlIFNlbnRyeVRyYWNpbmdSZXNwb25zZSB7XG4gIF9fc2VudHJ5X3RyYW5zYWN0aW9uPzogVHJhbnNhY3Rpb247XG59XG5cbi8qKlxuICogRXhwcmVzcyBpbnRlZ3JhdGlvblxuICpcbiAqIFByb3ZpZGVzIGFuIHJlcXVlc3QgYW5kIGVycm9yIGhhbmRsZXIgZm9yIEV4cHJlc3MgZnJhbWV3b3JrIGFzIHdlbGwgYXMgdHJhY2luZyBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGNsYXNzIEV4cHJlc3MgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ0V4cHJlc3MnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IEV4cHJlc3MuaWQ7XG5cbiAgLyoqXG4gICAqIEV4cHJlc3MgQXBwIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXI/OiBSb3V0ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21ldGhvZHM/OiBNZXRob2RbXTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiB7IGFwcD86IFJvdXRlcjsgcm91dGVyPzogUm91dGVyOyBtZXRob2RzPzogTWV0aG9kW10gfSA9IHt9KSB7XG4gICAgdGhpcy5fcm91dGVyID0gb3B0aW9ucy5yb3V0ZXIgfHwgb3B0aW9ucy5hcHA7XG4gICAgdGhpcy5fbWV0aG9kcyA9IChBcnJheS5pc0FycmF5KG9wdGlvbnMubWV0aG9kcykgPyBvcHRpb25zLm1ldGhvZHMgOiBbXSkuY29uY2F0KCd1c2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JvdXRlcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdFeHByZXNzSW50ZWdyYXRpb24gaXMgbWlzc2luZyBhbiBFeHByZXNzIGluc3RhbmNlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGluc3RydW1lbnRNaWRkbGV3YXJlcyh0aGlzLl9yb3V0ZXIsIHRoaXMuX21ldGhvZHMpO1xuICB9XG59XG5cbi8qKlxuICogV3JhcHMgb3JpZ2luYWwgbWlkZGxld2FyZSBmdW5jdGlvbiBpbiBhIHRyYWNpbmcgY2FsbCwgd2hpY2ggc3RvcmVzIHRoZSBpbmZvIGFib3V0IHRoZSBjYWxsIGFzIGEgc3BhbixcbiAqIGFuZCBmaW5pc2hlcyBpdCBvbmNlIHRoZSBtaWRkbGV3YXJlIGlzIGRvbmUgaW52b2tpbmcuXG4gKlxuICogRXhwcmVzcyBtaWRkbGV3YXJlcyBoYXZlIDMgdmFyaW91cyBmb3JtcywgdGh1cyB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiBhbGwgb2YgdGhlbTpcbiAqIC8vIHN5bmNcbiAqIGFwcC51c2UoZnVuY3Rpb24gKHJlcSwgcmVzKSB7IC4uLiB9KVxuICogLy8gYXN5bmNcbiAqIGFwcC51c2UoZnVuY3Rpb24gKHJlcSwgcmVzLCBuZXh0KSB7IC4uLiB9KVxuICogLy8gZXJyb3IgaGFuZGxlclxuICogYXBwLnVzZShmdW5jdGlvbiAoZXJyLCByZXEsIHJlcywgbmV4dCkgeyAuLi4gfSlcbiAqXG4gKiBUaGV5IGFsbCBpbnRlcm5hbGx5IGRlbGVnYXRlIHRvIHRoZSBgcm91dGVyW21ldGhvZF1gIG9mIHRoZSBnaXZlbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXMsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmZ1bmN0aW9uIHdyYXAoZm46IEZ1bmN0aW9uLCBtZXRob2Q6IE1ldGhvZCk6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCB7XG4gIGNvbnN0IGFyaXR5ID0gZm4ubGVuZ3RoO1xuXG4gIHN3aXRjaCAoYXJpdHkpIHtcbiAgICBjYXNlIDI6IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBOb2RlSlMuR2xvYmFsLCByZXE6IHVua25vd24sIHJlczogRXhwcmVzc1Jlc3BvbnNlICYgU2VudHJ5VHJhY2luZ1Jlc3BvbnNlKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcmVzLl9fc2VudHJ5X3RyYW5zYWN0aW9uO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBzcGFuID0gdHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZm4ubmFtZSxcbiAgICAgICAgICAgIG9wOiBgZXhwcmVzcy5taWRkbGV3YXJlLiR7bWV0aG9kfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgICAgIHNwYW4uZmluaXNoKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgcmVxLCByZXMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAzOiB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oXG4gICAgICAgIHRoaXM6IE5vZGVKUy5HbG9iYWwsXG4gICAgICAgIHJlcTogdW5rbm93bixcbiAgICAgICAgcmVzOiBFeHByZXNzUmVzcG9uc2UgJiBTZW50cnlUcmFjaW5nUmVzcG9uc2UsXG4gICAgICAgIG5leHQ6ICgpID0+IHZvaWQsXG4gICAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSByZXMuX19zZW50cnlfdHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHNwYW4gPSB0cmFuc2FjdGlvbj8uc3RhcnRDaGlsZCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGZuLm5hbWUsXG4gICAgICAgICAgb3A6IGBleHByZXNzLm1pZGRsZXdhcmUuJHttZXRob2R9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZuLmNhbGwodGhpcywgcmVxLCByZXMsIGZ1bmN0aW9uKHRoaXM6IE5vZGVKUy5HbG9iYWwsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgIG5leHQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIDQ6IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihcbiAgICAgICAgdGhpczogTm9kZUpTLkdsb2JhbCxcbiAgICAgICAgZXJyOiBFcnJvcixcbiAgICAgICAgcmVxOiBSZXF1ZXN0LFxuICAgICAgICByZXM6IFJlc3BvbnNlICYgU2VudHJ5VHJhY2luZ1Jlc3BvbnNlLFxuICAgICAgICBuZXh0OiAoKSA9PiB2b2lkLFxuICAgICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gcmVzLl9fc2VudHJ5X3RyYW5zYWN0aW9uO1xuICAgICAgICBjb25zdCBzcGFuID0gdHJhbnNhY3Rpb24/LnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBmbi5uYW1lLFxuICAgICAgICAgIG9wOiBgZXhwcmVzcy5taWRkbGV3YXJlLiR7bWV0aG9kfWAsXG4gICAgICAgIH0pO1xuICAgICAgICBmbi5jYWxsKHRoaXMsIGVyciwgcmVxLCByZXMsIGZ1bmN0aW9uKHRoaXM6IE5vZGVKUy5HbG9iYWwsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgIG5leHQuY2FsbCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cHJlc3MgbWlkZGxld2FyZSB0YWtlcyAyLTQgYXJndW1lbnRzLiBHb3Q6ICR7YXJpdHl9YCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGFrZXMgYWxsIHRoZSBmdW5jdGlvbiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBvcmlnaW5hbCBgYXBwYCBvciBgcm91dGVyYCBtZXRob2QsIGVnLiBgYXBwLnVzZWAgb3IgYHJvdXRlci51c2VgXG4gKiBhbmQgd3JhcHMgZXZlcnkgZnVuY3Rpb24sIGFzIHdlbGwgYXMgYXJyYXkgb2YgZnVuY3Rpb25zIHdpdGggYSBjYWxsIHRvIG91ciBgd3JhcGAgbWV0aG9kLlxuICogV2UgaGF2ZSB0byB0YWtlIGNhcmUgb2YgdGhlIGFycmF5cyBhcyB3ZWxsIGFzIGl0ZXJhdGUgb3ZlciBhbGwgb2YgdGhlIGFyZ3VtZW50cyxcbiAqIGFzIGBhcHAudXNlYCBjYW4gYWNjZXB0IG1pZGRsZXdhcmVzIGluIGZldyB2YXJpb3VzIGZvcm1zLlxuICpcbiAqIGFwcC51c2UoWzxwYXRoPl0sIDxmbj4pXG4gKiBhcHAudXNlKFs8cGF0aD5dLCA8Zm4+LCAuLi48Zm4+KVxuICogYXBwLnVzZShbPHBhdGg+XSwgLi4uPGZuPltdKVxuICovXG5mdW5jdGlvbiB3cmFwTWlkZGxld2FyZUFyZ3MoYXJnczogdW5rbm93bltdLCBtZXRob2Q6IE1ldGhvZCk6IHVua25vd25bXSB7XG4gIHJldHVybiBhcmdzLm1hcCgoYXJnOiB1bmtub3duKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiB3cmFwKGFyZywgbWV0aG9kKTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG4gICAgICByZXR1cm4gYXJnLm1hcCgoYTogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gd3JhcChhLCBtZXRob2QpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZztcbiAgfSk7XG59XG5cbi8qKlxuICogUGF0Y2hlcyBvcmlnaW5hbCByb3V0ZXIgdG8gdXRpbGl6ZSBvdXIgdHJhY2luZyBmdW5jdGlvbmFsaXR5XG4gKi9cbmZ1bmN0aW9uIHBhdGNoTWlkZGxld2FyZShyb3V0ZXI6IFJvdXRlciwgbWV0aG9kOiBNZXRob2QpOiBSb3V0ZXIge1xuICBjb25zdCBvcmlnaW5hbENhbGxiYWNrID0gcm91dGVyW21ldGhvZF07XG5cbiAgcm91dGVyW21ldGhvZF0gPSBmdW5jdGlvbiguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICByZXR1cm4gb3JpZ2luYWxDYWxsYmFjay5jYWxsKHRoaXMsIC4uLndyYXBNaWRkbGV3YXJlQXJncyhhcmdzLCBtZXRob2QpKTtcbiAgfTtcblxuICByZXR1cm4gcm91dGVyO1xufVxuXG4vKipcbiAqIFBhdGNoZXMgb3JpZ2luYWwgcm91dGVyIG1ldGhvZHNcbiAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudE1pZGRsZXdhcmVzKHJvdXRlcjogUm91dGVyLCBtZXRob2RzOiBNZXRob2RbXSA9IFtdKTogdm9pZCB7XG4gIG1ldGhvZHMuZm9yRWFjaCgobWV0aG9kOiBNZXRob2QpID0+IHBhdGNoTWlkZGxld2FyZShyb3V0ZXIsIG1ldGhvZCkpO1xufVxuIiwgImltcG9ydCB7IEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZmlsbCwgaXNUaGVuYWJsZSwgbG9hZE1vZHVsZSwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmludGVyZmFjZSBQZ0NsaWVudCB7XG4gIHByb3RvdHlwZToge1xuICAgIHF1ZXJ5OiAoKSA9PiB2b2lkIHwgUHJvbWlzZTx1bmtub3duPjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFBnT3B0aW9ucyB7XG4gIHVzZVBnTmF0aXZlPzogYm9vbGVhbjtcbn1cblxuLyoqIFRyYWNpbmcgaW50ZWdyYXRpb24gZm9yIG5vZGUtcG9zdGdyZXMgcGFja2FnZSAqL1xuZXhwb3J0IGNsYXNzIFBvc3RncmVzIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdQb3N0Z3Jlcyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gUG9zdGdyZXMuaWQ7XG5cbiAgcHJpdmF0ZSBfdXNlUGdOYXRpdmU6IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFBnT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5fdXNlUGdOYXRpdmUgPSAhIW9wdGlvbnMudXNlUGdOYXRpdmU7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoXzogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgY29uc3QgcGtnID0gbG9hZE1vZHVsZTx7IENsaWVudDogUGdDbGllbnQ7IG5hdGl2ZTogeyBDbGllbnQ6IFBnQ2xpZW50IH0gfT4oJ3BnJyk7XG5cbiAgICBpZiAoIXBrZykge1xuICAgICAgbG9nZ2VyLmVycm9yKCdQb3N0Z3JlcyBJbnRlZ3JhdGlvbiB3YXMgdW5hYmxlIHRvIHJlcXVpcmUgYHBnYCBwYWNrYWdlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl91c2VQZ05hdGl2ZSAmJiAhcGtnLm5hdGl2ZT8uQ2xpZW50KSB7XG4gICAgICBsb2dnZXIuZXJyb3IoYFBvc3RncmVzIEludGVncmF0aW9uIHdhcyB1bmFibGUgdG8gYWNjZXNzICdwZy1uYXRpdmUnIGJpbmRpbmdzLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHsgQ2xpZW50IH0gPSB0aGlzLl91c2VQZ05hdGl2ZSA/IHBrZy5uYXRpdmUgOiBwa2c7XG5cbiAgICAvKipcbiAgICAgKiBmdW5jdGlvbiAocXVlcnksIGNhbGxiYWNrKSA9PiB2b2lkXG4gICAgICogZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbXMsIGNhbGxiYWNrKSA9PiB2b2lkXG4gICAgICogZnVuY3Rpb24gKHF1ZXJ5KSA9PiBQcm9taXNlXG4gICAgICogZnVuY3Rpb24gKHF1ZXJ5LCBwYXJhbXMpID0+IFByb21pc2VcbiAgICAgKiBmdW5jdGlvbiAocGcuQ3Vyc29yKSA9PiBwZy5DdXJzb3JcbiAgICAgKi9cbiAgICBmaWxsKENsaWVudC5wcm90b3R5cGUsICdxdWVyeScsIGZ1bmN0aW9uKG9yaWc6ICgpID0+IHZvaWQgfCBQcm9taXNlPHVua25vd24+KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogdW5rbm93biwgY29uZmlnOiB1bmtub3duLCB2YWx1ZXM6IHVua25vd24sIGNhbGxiYWNrOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudEh1YigpLmdldFNjb3BlKCk7XG4gICAgICAgIGNvbnN0IHBhcmVudFNwYW4gPSBzY29wZT8uZ2V0U3BhbigpO1xuICAgICAgICBjb25zdCBzcGFuID0gcGFyZW50U3Bhbj8uc3RhcnRDaGlsZCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnID8gY29uZmlnIDogKGNvbmZpZyBhcyB7IHRleHQ6IHN0cmluZyB9KS50ZXh0LFxuICAgICAgICAgIG9wOiBgZGJgLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCBjb25maWcsIHZhbHVlcywgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duKSB7XG4gICAgICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCBjb25maWcsIGZ1bmN0aW9uKGVycjogRXJyb3IsIHJlc3VsdDogdW5rbm93bikge1xuICAgICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgICB2YWx1ZXMoZXJyLCByZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcnYgPSB0eXBlb2YgdmFsdWVzICE9PSAndW5kZWZpbmVkJyA/IG9yaWcuY2FsbCh0aGlzLCBjb25maWcsIHZhbHVlcykgOiBvcmlnLmNhbGwodGhpcywgY29uZmlnKTtcblxuICAgICAgICBpZiAoaXNUaGVuYWJsZShydikpIHtcbiAgICAgICAgICByZXR1cm4gKHJ2IGFzIFByb21pc2U8dW5rbm93bj4pLnRoZW4oKHJlczogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgIHJldHVybiBydjtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBFdmVudFByb2Nlc3NvciwgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGZpbGwsIGxvYWRNb2R1bGUsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbnRlcmZhY2UgTXlzcWxDb25uZWN0aW9uIHtcbiAgY3JlYXRlUXVlcnk6ICgpID0+IHZvaWQ7XG59XG5cbi8qKiBUcmFjaW5nIGludGVncmF0aW9uIGZvciBub2RlLW15c3FsIHBhY2thZ2UgKi9cbmV4cG9ydCBjbGFzcyBNeXNxbCBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnTXlzcWwnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IE15c3FsLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShfOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBjb25zdCBwa2cgPSBsb2FkTW9kdWxlPE15c3FsQ29ubmVjdGlvbj4oJ215c3FsL2xpYi9Db25uZWN0aW9uLmpzJyk7XG5cbiAgICBpZiAoIXBrZykge1xuICAgICAgbG9nZ2VyLmVycm9yKCdNeXNxbCBJbnRlZ3JhdGlvbiB3YXMgdW5hYmxlIHRvIHJlcXVpcmUgYG15c3FsYCBwYWNrYWdlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBvcmlnaW5hbCBmdW5jdGlvbiB3aWxsIGhhdmUgb25lIG9mIHRoZXNlIHNpZ25hdHVyZXM6XG4gICAgLy8gICAgZnVuY3Rpb24gKGNhbGxiYWNrKSA9PiB2b2lkXG4gICAgLy8gICAgZnVuY3Rpb24gKG9wdGlvbnMsIGNhbGxiYWNrKSA9PiB2b2lkXG4gICAgLy8gICAgZnVuY3Rpb24gKG9wdGlvbnMsIHZhbHVlcywgY2FsbGJhY2spID0+IHZvaWRcbiAgICBmaWxsKHBrZywgJ2NyZWF0ZVF1ZXJ5JywgZnVuY3Rpb24ob3JpZzogKCkgPT4gdm9pZCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRoaXM6IHVua25vd24sIG9wdGlvbnM6IHVua25vd24sIHZhbHVlczogdW5rbm93biwgY2FsbGJhY2s6IHVua25vd24pIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgICAgY29uc3QgcGFyZW50U3BhbiA9IHNjb3BlPy5nZXRTcGFuKCk7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBwYXJlbnRTcGFuPy5zdGFydENoaWxkKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnID8gb3B0aW9ucyA6IChvcHRpb25zIGFzIHsgc3FsOiBzdHJpbmcgfSkuc3FsLFxuICAgICAgICAgIG9wOiBgZGJgLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCBvcHRpb25zLCB2YWx1ZXMsIGZ1bmN0aW9uKGVycjogRXJyb3IsIHJlc3VsdDogdW5rbm93biwgZmllbGRzOiB1bmtub3duKSB7XG4gICAgICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKGVyciwgcmVzdWx0LCBmaWVsZHMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZy5jYWxsKHRoaXMsIG9wdGlvbnMsIGZ1bmN0aW9uKGVycjogRXJyb3IsIHJlc3VsdDogdW5rbm93biwgZmllbGRzOiB1bmtub3duKSB7XG4gICAgICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgICAgIHZhbHVlcyhlcnIsIHJlc3VsdCwgZmllbGRzKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmlnLmNhbGwodGhpcywgb3B0aW9ucywgdmFsdWVzLCBjYWxsYmFjayk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgRXZlbnRQcm9jZXNzb3IsIEludGVncmF0aW9uLCBTcGFuQ29udGV4dCB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZmlsbCwgaXNUaGVuYWJsZSwgbG9hZE1vZHVsZSwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8vIFRoaXMgYWxsb3dzIHVzIHRvIHVzZSB0aGUgc2FtZSBhcnJheSBmb3IgYm90aCBkZWZhdWx0cyBvcHRpb25zIGFuZCB0aGUgdHlwZSBpdHNlbGYuXG4vLyAobm90ZSBgYXMgY29uc3RgIGF0IHRoZSBlbmQgdG8gbWFrZSBpdCBhIHVuaW9uIG9mIHN0cmluZyBsaXRlcmFsIHR5cGVzIChpLmUuIFwiYVwiIHwgXCJiXCIgfCAuLi4gKVxuLy8gYW5kIG5vdCBqdXN0IGEgc3RyaW5nW10pXG50eXBlIE9wZXJhdGlvbiA9IHR5cGVvZiBPUEVSQVRJT05TW251bWJlcl07XG5jb25zdCBPUEVSQVRJT05TID0gW1xuICAnYWdncmVnYXRlJywgLy8gYWdncmVnYXRlKHBpcGVsaW5lLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2J1bGtXcml0ZScsIC8vIGJ1bGtXcml0ZShvcGVyYXRpb25zLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2NvdW50RG9jdW1lbnRzJywgLy8gY291bnREb2N1bWVudHMocXVlcnksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnY3JlYXRlSW5kZXgnLCAvLyBjcmVhdGVJbmRleChmaWVsZE9yU3BlYywgb3B0aW9ucywgY2FsbGJhY2spXG4gICdjcmVhdGVJbmRleGVzJywgLy8gY3JlYXRlSW5kZXhlcyhpbmRleFNwZWNzLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2RlbGV0ZU1hbnknLCAvLyBkZWxldGVNYW55KGZpbHRlciwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdkZWxldGVPbmUnLCAvLyBkZWxldGVPbmUoZmlsdGVyLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2Rpc3RpbmN0JywgLy8gZGlzdGluY3Qoa2V5LCBxdWVyeSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdkcm9wJywgLy8gZHJvcChvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2Ryb3BJbmRleCcsIC8vIGRyb3BJbmRleChpbmRleE5hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZHJvcEluZGV4ZXMnLCAvLyBkcm9wSW5kZXhlcyhvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2VzdGltYXRlZERvY3VtZW50Q291bnQnLCAvLyBlc3RpbWF0ZWREb2N1bWVudENvdW50KG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZmluZCcsIC8vIGZpbmQocXVlcnksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZmluZE9uZScsIC8vIGZpbmRPbmUocXVlcnksIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZmluZE9uZUFuZERlbGV0ZScsIC8vIGZpbmRPbmVBbmREZWxldGUoZmlsdGVyLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2ZpbmRPbmVBbmRSZXBsYWNlJywgLy8gZmluZE9uZUFuZFJlcGxhY2UoZmlsdGVyLCByZXBsYWNlbWVudCwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdmaW5kT25lQW5kVXBkYXRlJywgLy8gZmluZE9uZUFuZFVwZGF0ZShmaWx0ZXIsIHVwZGF0ZSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdpbmRleGVzJywgLy8gaW5kZXhlcyhvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luZGV4RXhpc3RzJywgLy8gaW5kZXhFeGlzdHMoaW5kZXhlcywgb3B0aW9ucywgY2FsbGJhY2spXG4gICdpbmRleEluZm9ybWF0aW9uJywgLy8gaW5kZXhJbmZvcm1hdGlvbihvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luaXRpYWxpemVPcmRlcmVkQnVsa09wJywgLy8gaW5pdGlhbGl6ZU9yZGVyZWRCdWxrT3Aob3B0aW9ucywgY2FsbGJhY2spXG4gICdpbnNlcnRNYW55JywgLy8gaW5zZXJ0TWFueShkb2NzLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luc2VydE9uZScsIC8vIGluc2VydE9uZShkb2MsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnaXNDYXBwZWQnLCAvLyBpc0NhcHBlZChvcHRpb25zLCBjYWxsYmFjaylcbiAgJ21hcFJlZHVjZScsIC8vIG1hcFJlZHVjZShtYXAsIHJlZHVjZSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdvcHRpb25zJywgLy8gb3B0aW9ucyhvcHRpb25zLCBjYWxsYmFjaylcbiAgJ3BhcmFsbGVsQ29sbGVjdGlvblNjYW4nLCAvLyBwYXJhbGxlbENvbGxlY3Rpb25TY2FuKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAncmVuYW1lJywgLy8gcmVuYW1lKG5ld05hbWUsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAncmVwbGFjZU9uZScsIC8vIHJlcGxhY2VPbmUoZmlsdGVyLCBkb2MsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnc3RhdHMnLCAvLyBzdGF0cyhvcHRpb25zLCBjYWxsYmFjaylcbiAgJ3VwZGF0ZU1hbnknLCAvLyB1cGRhdGVNYW55KGZpbHRlciwgdXBkYXRlLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ3VwZGF0ZU9uZScsIC8vIHVwZGF0ZU9uZShmaWx0ZXIsIHVwZGF0ZSwgb3B0aW9ucywgY2FsbGJhY2spXG5dIGFzIGNvbnN0O1xuXG4vLyBBbGwgb2YgdGhlIG9wZXJhdGlvbnMgYWJvdmUgdGFrZSBgb3B0aW9uc2AgYW5kIGBjYWxsYmFja2AgYXMgdGhlaXIgZmluYWwgcGFyYW1ldGVycywgYnV0IHNvbWUgb2YgdGhlbVxuLy8gdGFrZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXMgd2VsbC4gRm9yIHRob3NlIG9wZXJhdGlvbnMsIHRoaXMgaXMgYSBtYXAgb2Zcbi8vIHsgPG9wZXJhdGlvbiBuYW1lPjogIFs8bmFtZXMgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzPl0gfSwgYXMgYSB3YXkgdG8ga25vdyB3aGF0IHRvIGNhbGwgdGhlIG9wZXJhdGlvbidzXG4vLyBwb3NpdGlvbmFsIGFyZ3VtZW50cyB3aGVuIHdlIGFkZCB0aGVtIHRvIHRoZSBzcGFuJ3MgYGRhdGFgIG9iamVjdCBsYXRlclxuY29uc3QgT1BFUkFUSU9OX1NJR05BVFVSRVM6IHtcbiAgW29wIGluIE9wZXJhdGlvbl0/OiBzdHJpbmdbXTtcbn0gPSB7XG4gIC8vIGFnZ3JlZ2F0ZSBpbnRlbnRpb25hbGx5IG5vdCBpbmNsdWRlZCBiZWNhdXNlIGBwaXBlbGluZWAgYXJndW1lbnRzIGFyZSB0b28gY29tcGxleCB0byBzZXJpYWxpemUgd2VsbFxuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9wdWxsLzMxMDJcbiAgYnVsa1dyaXRlOiBbJ29wZXJhdGlvbnMnXSxcbiAgY291bnREb2N1bWVudHM6IFsncXVlcnknXSxcbiAgY3JlYXRlSW5kZXg6IFsnZmllbGRPclNwZWMnXSxcbiAgY3JlYXRlSW5kZXhlczogWydpbmRleFNwZWNzJ10sXG4gIGRlbGV0ZU1hbnk6IFsnZmlsdGVyJ10sXG4gIGRlbGV0ZU9uZTogWydmaWx0ZXInXSxcbiAgZGlzdGluY3Q6IFsna2V5JywgJ3F1ZXJ5J10sXG4gIGRyb3BJbmRleDogWydpbmRleE5hbWUnXSxcbiAgZmluZDogWydxdWVyeSddLFxuICBmaW5kT25lOiBbJ3F1ZXJ5J10sXG4gIGZpbmRPbmVBbmREZWxldGU6IFsnZmlsdGVyJ10sXG4gIGZpbmRPbmVBbmRSZXBsYWNlOiBbJ2ZpbHRlcicsICdyZXBsYWNlbWVudCddLFxuICBmaW5kT25lQW5kVXBkYXRlOiBbJ2ZpbHRlcicsICd1cGRhdGUnXSxcbiAgaW5kZXhFeGlzdHM6IFsnaW5kZXhlcyddLFxuICBpbnNlcnRNYW55OiBbJ2RvY3MnXSxcbiAgaW5zZXJ0T25lOiBbJ2RvYyddLFxuICBtYXBSZWR1Y2U6IFsnbWFwJywgJ3JlZHVjZSddLFxuICByZW5hbWU6IFsnbmV3TmFtZSddLFxuICByZXBsYWNlT25lOiBbJ2ZpbHRlcicsICdkb2MnXSxcbiAgdXBkYXRlTWFueTogWydmaWx0ZXInLCAndXBkYXRlJ10sXG4gIHVwZGF0ZU9uZTogWydmaWx0ZXInLCAndXBkYXRlJ10sXG59O1xuXG5pbnRlcmZhY2UgTW9uZ29Db2xsZWN0aW9uIHtcbiAgY29sbGVjdGlvbk5hbWU6IHN0cmluZztcbiAgZGJOYW1lOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICBwcm90b3R5cGU6IHtcbiAgICBbb3BlcmF0aW9uIGluIE9wZXJhdGlvbl06ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gIH07XG59XG5cbmludGVyZmFjZSBNb25nb09wdGlvbnMge1xuICBvcGVyYXRpb25zPzogT3BlcmF0aW9uW107XG4gIGRlc2NyaWJlT3BlcmF0aW9ucz86IGJvb2xlYW4gfCBPcGVyYXRpb25bXTtcbiAgdXNlTW9uZ29vc2U/OiBib29sZWFuO1xufVxuXG4vKiogVHJhY2luZyBpbnRlZ3JhdGlvbiBmb3IgbW9uZ28gcGFja2FnZSAqL1xuZXhwb3J0IGNsYXNzIE1vbmdvIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdNb25nbyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gTW9uZ28uaWQ7XG5cbiAgcHJpdmF0ZSBfb3BlcmF0aW9uczogT3BlcmF0aW9uW107XG4gIHByaXZhdGUgX2Rlc2NyaWJlT3BlcmF0aW9ucz86IGJvb2xlYW4gfCBPcGVyYXRpb25bXTtcbiAgcHJpdmF0ZSBfdXNlTW9uZ29vc2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogTW9uZ29PcHRpb25zID0ge30pIHtcbiAgICB0aGlzLl9vcGVyYXRpb25zID0gQXJyYXkuaXNBcnJheShvcHRpb25zLm9wZXJhdGlvbnMpXG4gICAgICA/IG9wdGlvbnMub3BlcmF0aW9uc1xuICAgICAgOiAoKE9QRVJBVElPTlMgYXMgdW5rbm93bikgYXMgT3BlcmF0aW9uW10pO1xuICAgIHRoaXMuX2Rlc2NyaWJlT3BlcmF0aW9ucyA9ICdkZXNjcmliZU9wZXJhdGlvbnMnIGluIG9wdGlvbnMgPyBvcHRpb25zLmRlc2NyaWJlT3BlcmF0aW9ucyA6IHRydWU7XG4gICAgdGhpcy5fdXNlTW9uZ29vc2UgPSAhIW9wdGlvbnMudXNlTW9uZ29vc2U7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoXzogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IHRoaXMuX3VzZU1vbmdvb3NlID8gJ21vbmdvb3NlJyA6ICdtb25nb2RiJztcbiAgICBjb25zdCBwa2cgPSBsb2FkTW9kdWxlPHsgQ29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uIH0+KG1vZHVsZU5hbWUpO1xuXG4gICAgaWYgKCFwa2cpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgTW9uZ28gSW50ZWdyYXRpb24gd2FzIHVuYWJsZSB0byByZXF1aXJlIFxcYCR7bW9kdWxlTmFtZX1cXGAgcGFja2FnZS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnN0cnVtZW50T3BlcmF0aW9ucyhwa2cuQ29sbGVjdGlvbiwgdGhpcy5fb3BlcmF0aW9ucywgZ2V0Q3VycmVudEh1Yik7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyBvcmlnaW5hbCBjb2xsZWN0aW9uIG1ldGhvZHNcbiAgICovXG4gIHByaXZhdGUgX2luc3RydW1lbnRPcGVyYXRpb25zKGNvbGxlY3Rpb246IE1vbmdvQ29sbGVjdGlvbiwgb3BlcmF0aW9uczogT3BlcmF0aW9uW10sIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIG9wZXJhdGlvbnMuZm9yRWFjaCgob3BlcmF0aW9uOiBPcGVyYXRpb24pID0+IHRoaXMuX3BhdGNoT3BlcmF0aW9uKGNvbGxlY3Rpb24sIG9wZXJhdGlvbiwgZ2V0Q3VycmVudEh1YikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhdGNoZXMgb3JpZ2luYWwgY29sbGVjdGlvbiB0byB1dGlsaXplIG91ciB0cmFjaW5nIGZ1bmN0aW9uYWxpdHlcbiAgICovXG4gIHByaXZhdGUgX3BhdGNoT3BlcmF0aW9uKGNvbGxlY3Rpb246IE1vbmdvQ29sbGVjdGlvbiwgb3BlcmF0aW9uOiBPcGVyYXRpb24sIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGlmICghKG9wZXJhdGlvbiBpbiBjb2xsZWN0aW9uLnByb3RvdHlwZSkpIHJldHVybjtcblxuICAgIGNvbnN0IGdldFNwYW5Db250ZXh0ID0gdGhpcy5fZ2V0U3BhbkNvbnRleHRGcm9tT3BlcmF0aW9uQXJndW1lbnRzLmJpbmQodGhpcyk7XG5cbiAgICBmaWxsKGNvbGxlY3Rpb24ucHJvdG90eXBlLCBvcGVyYXRpb24sIGZ1bmN0aW9uKG9yaWc6ICgpID0+IHZvaWQgfCBQcm9taXNlPHVua25vd24+KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgIGNvbnN0IGxhc3RBcmcgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGNvbnN0IHNjb3BlID0gZ2V0Q3VycmVudEh1YigpLmdldFNjb3BlKCk7XG4gICAgICAgIGNvbnN0IHBhcmVudFNwYW4gPSBzY29wZT8uZ2V0U3BhbigpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBvcGVyYXRpb24gd2FzIHBhc3NlZCBhIGNhbGxiYWNrLiAobWFwUmVkdWNlIHJlcXVpcmVzIGEgZGlmZmVyZW50IGNoZWNrLCBhc1xuICAgICAgICAvLyBpdHMgKG5vbi1jYWxsYmFjaykgYXJndW1lbnRzIGNhbiBhbHNvIGJlIGZ1bmN0aW9ucy4pXG4gICAgICAgIGlmICh0eXBlb2YgbGFzdEFyZyAhPT0gJ2Z1bmN0aW9uJyB8fCAob3BlcmF0aW9uID09PSAnbWFwUmVkdWNlJyAmJiBhcmdzLmxlbmd0aCA9PT0gMikpIHtcbiAgICAgICAgICBjb25zdCBzcGFuID0gcGFyZW50U3Bhbj8uc3RhcnRDaGlsZChnZXRTcGFuQ29udGV4dCh0aGlzLCBvcGVyYXRpb24sIGFyZ3MpKTtcbiAgICAgICAgICBjb25zdCBtYXliZVByb21pc2UgPSBvcmlnLmNhbGwodGhpcywgLi4uYXJncykgYXMgUHJvbWlzZTx1bmtub3duPjtcblxuICAgICAgICAgIGlmIChpc1RoZW5hYmxlKG1heWJlUHJvbWlzZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBtYXliZVByb21pc2UudGhlbigocmVzOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgICAgcmV0dXJuIG1heWJlUHJvbWlzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGFuID0gcGFyZW50U3Bhbj8uc3RhcnRDaGlsZChnZXRTcGFuQ29udGV4dCh0aGlzLCBvcGVyYXRpb24sIGFyZ3Muc2xpY2UoMCwgLTEpKSk7XG4gICAgICAgIHJldHVybiBvcmlnLmNhbGwodGhpcywgLi4uYXJncy5zbGljZSgwLCAtMSksIGZ1bmN0aW9uKGVycjogRXJyb3IsIHJlc3VsdDogdW5rbm93bikge1xuICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgIGxhc3RBcmcoZXJyLCByZXN1bHQpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybSBhIFNwYW5Db250ZXh0IGJhc2VkIG9uIHRoZSB1c2VyIGlucHV0IHRvIGEgZ2l2ZW4gb3BlcmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0U3BhbkNvbnRleHRGcm9tT3BlcmF0aW9uQXJndW1lbnRzKFxuICAgIGNvbGxlY3Rpb246IE1vbmdvQ29sbGVjdGlvbixcbiAgICBvcGVyYXRpb246IE9wZXJhdGlvbixcbiAgICBhcmdzOiB1bmtub3duW10sXG4gICk6IFNwYW5Db250ZXh0IHtcbiAgICBjb25zdCBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgY29sbGVjdGlvbk5hbWU6IGNvbGxlY3Rpb24uY29sbGVjdGlvbk5hbWUsXG4gICAgICBkYk5hbWU6IGNvbGxlY3Rpb24uZGJOYW1lLFxuICAgICAgbmFtZXNwYWNlOiBjb2xsZWN0aW9uLm5hbWVzcGFjZSxcbiAgICB9O1xuICAgIGNvbnN0IHNwYW5Db250ZXh0OiBTcGFuQ29udGV4dCA9IHtcbiAgICAgIG9wOiBgZGJgLFxuICAgICAgZGVzY3JpcHRpb246IG9wZXJhdGlvbixcbiAgICAgIGRhdGEsXG4gICAgfTtcblxuICAgIC8vIElmIHRoZSBvcGVyYXRpb24gdGFrZXMgbm8gYXJndW1lbnRzIGJlc2lkZXMgYG9wdGlvbnNgIGFuZCBgY2FsbGJhY2tgLCBvciBpZiBhcmd1bWVudFxuICAgIC8vIGNvbGxlY3Rpb24gaXMgZGlzYWJsZWQgZm9yIHRoaXMgb3BlcmF0aW9uLCBqdXN0IHJldHVybiBlYXJseS5cbiAgICBjb25zdCBzaWduYXR1cmUgPSBPUEVSQVRJT05fU0lHTkFUVVJFU1tvcGVyYXRpb25dO1xuICAgIGNvbnN0IHNob3VsZERlc2NyaWJlID0gQXJyYXkuaXNBcnJheSh0aGlzLl9kZXNjcmliZU9wZXJhdGlvbnMpXG4gICAgICA/IHRoaXMuX2Rlc2NyaWJlT3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb24pXG4gICAgICA6IHRoaXMuX2Rlc2NyaWJlT3BlcmF0aW9ucztcblxuICAgIGlmICghc2lnbmF0dXJlIHx8ICFzaG91bGREZXNjcmliZSkge1xuICAgICAgcmV0dXJuIHNwYW5Db250ZXh0O1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGBtYXBSZWR1Y2VgLCBhcyB0aGUgb25seSBvbmUgYWNjZXB0aW5nIGZ1bmN0aW9ucyBhcyBhcmd1bWVudHMuXG4gICAgICBpZiAob3BlcmF0aW9uID09PSAnbWFwUmVkdWNlJykge1xuICAgICAgICBjb25zdCBbbWFwLCByZWR1Y2VdID0gYXJncyBhcyB7IG5hbWU/OiBzdHJpbmcgfVtdO1xuICAgICAgICBkYXRhW3NpZ25hdHVyZVswXV0gPSB0eXBlb2YgbWFwID09PSAnc3RyaW5nJyA/IG1hcCA6IG1hcC5uYW1lIHx8ICc8YW5vbnltb3VzPic7XG4gICAgICAgIGRhdGFbc2lnbmF0dXJlWzFdXSA9IHR5cGVvZiByZWR1Y2UgPT09ICdzdHJpbmcnID8gcmVkdWNlIDogcmVkdWNlLm5hbWUgfHwgJzxhbm9ueW1vdXM+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2lnbmF0dXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgZGF0YVtzaWduYXR1cmVbaV1dID0gSlNPTi5zdHJpbmdpZnkoYXJnc1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIC8vIG5vLWVtcHR5XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwYW5Db250ZXh0O1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgRklOSVNIX1JFQVNPTl9UQUcsIElETEVfVFJBTlNBQ1RJT05fRklOSVNIX1JFQVNPTlMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSWRsZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaWRsZXRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuLi9zcGFuc3RhdHVzJztcbmltcG9ydCB7IGdldEFjdGl2ZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgY2FuY2VscyBhbmQgZmluaXNoZXMgYSB0cmFuc2FjdGlvbiB3aGVuIHRoZSBnbG9iYWxcbiAqIGRvY3VtZW50IGlzIGhpZGRlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQmFja2dyb3VuZFRhYkRldGVjdGlvbigpOiB2b2lkIHtcbiAgaWYgKGdsb2JhbCAmJiBnbG9iYWwuZG9jdW1lbnQpIHtcbiAgICBnbG9iYWwuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZVRyYW5zYWN0aW9uID0gZ2V0QWN0aXZlVHJhbnNhY3Rpb24oKSBhcyBJZGxlVHJhbnNhY3Rpb247XG4gICAgICBpZiAoZ2xvYmFsLmRvY3VtZW50LmhpZGRlbiAmJiBhY3RpdmVUcmFuc2FjdGlvbikge1xuICAgICAgICBsb2dnZXIubG9nKFxuICAgICAgICAgIGBbVHJhY2luZ10gVHJhbnNhY3Rpb246ICR7U3BhblN0YXR1cy5DYW5jZWxsZWR9IC0+IHNpbmNlIHRhYiBtb3ZlZCB0byB0aGUgYmFja2dyb3VuZCwgb3A6ICR7YWN0aXZlVHJhbnNhY3Rpb24ub3B9YCxcbiAgICAgICAgKTtcbiAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCBzZXQgc3RhdHVzIGlmIGl0IGlzIGFscmVhZHkgc2V0LCB0aGlzIHByZXZlbnQgaW1wb3J0YW50IHN0YXR1c2VzIGxpa2VcbiAgICAgICAgLy8gZXJyb3Igb3IgZGF0YSBsb3NzIGZyb20gYmVpbmcgb3ZlcndyaXR0ZW4gb24gdHJhbnNhY3Rpb24uXG4gICAgICAgIGlmICghYWN0aXZlVHJhbnNhY3Rpb24uc3RhdHVzKSB7XG4gICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uc2V0U3RhdHVzKFNwYW5TdGF0dXMuQ2FuY2VsbGVkKTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbi5zZXRUYWcoJ3Zpc2liaWxpdHljaGFuZ2UnLCAnZG9jdW1lbnQuaGlkZGVuJyk7XG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uLnNldFRhZyhGSU5JU0hfUkVBU09OX1RBRywgSURMRV9UUkFOU0FDVElPTl9GSU5JU0hfUkVBU09OU1syXSk7XG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uLmZpbmlzaCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci53YXJuKCdbVHJhY2luZ10gQ291bGQgbm90IHNldCB1cCBiYWNrZ3JvdW5kIHRhYiBkZXRlY3Rpb24gZHVlIHRvIGxhY2sgb2YgZ2xvYmFsIGRvY3VtZW50Jyk7XG4gIH1cbn1cbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgTWV0cmljLCBSZXBvcnRIYW5kbGVyIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgYmluZFJlcG9ydGVyID0gKFxuICBjYWxsYmFjazogUmVwb3J0SGFuZGxlcixcbiAgbWV0cmljOiBNZXRyaWMsXG4gIHJlcG9ydEFsbENoYW5nZXM/OiBib29sZWFuLFxuKTogKChmb3JjZVJlcG9ydD86IGJvb2xlYW4pID0+IHZvaWQpID0+IHtcbiAgbGV0IHByZXZWYWx1ZTogbnVtYmVyO1xuICByZXR1cm4gKGZvcmNlUmVwb3J0PzogYm9vbGVhbikgPT4ge1xuICAgIGlmIChtZXRyaWMudmFsdWUgPj0gMCkge1xuICAgICAgaWYgKGZvcmNlUmVwb3J0IHx8IHJlcG9ydEFsbENoYW5nZXMpIHtcbiAgICAgICAgbWV0cmljLmRlbHRhID0gbWV0cmljLnZhbHVlIC0gKHByZXZWYWx1ZSB8fCAwKTtcblxuICAgICAgICAvLyBSZXBvcnQgdGhlIG1ldHJpYyBpZiB0aGVyZSdzIGEgbm9uLXplcm8gZGVsdGEgb3IgaWYgbm8gcHJldmlvdXNcbiAgICAgICAgLy8gdmFsdWUgZXhpc3RzICh3aGljaCBjYW4gaGFwcGVuIGluIHRoZSBjYXNlIG9mIHRoZSBkb2N1bWVudCBiZWNvbWluZ1xuICAgICAgICAvLyBoaWRkZW4gd2hlbiB0aGUgbWV0cmljIHZhbHVlIGlzIDApLlxuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWUvd2ViLXZpdGFscy9pc3N1ZXMvMTRcbiAgICAgICAgaWYgKG1ldHJpYy5kZWx0YSB8fCBwcmV2VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHByZXZWYWx1ZSA9IG1ldHJpYy52YWx1ZTtcbiAgICAgICAgICBjYWxsYmFjayhtZXRyaWMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuLyoqXG4gKiBQZXJmb3JtYW50bHkgZ2VuZXJhdGUgYSB1bmlxdWUsIDMwLWNoYXIgc3RyaW5nIGJ5IGNvbWJpbmluZyBhIHZlcnNpb25cbiAqIG51bWJlciwgdGhlIGN1cnJlbnQgdGltZXN0YW1wIHdpdGggYSAxMy1kaWdpdCBudW1iZXIgaW50ZWdlci5cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGdlbmVyYXRlVW5pcXVlSUQgPSAoKTogc3RyaW5nID0+IHtcbiAgcmV0dXJuIGB2Mi0ke0RhdGUubm93KCl9LSR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKDllMTIgLSAxKSkgKyAxZTEyfWA7XG59O1xuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBNZXRyaWMgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVVuaXF1ZUlEIH0gZnJvbSAnLi9nZW5lcmF0ZVVuaXF1ZUlEJztcblxuZXhwb3J0IGNvbnN0IGluaXRNZXRyaWMgPSAobmFtZTogTWV0cmljWyduYW1lJ10sIHZhbHVlPzogbnVtYmVyKTogTWV0cmljID0+IHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZhbHVlOiB2YWx1ZSA/PyAtMSxcbiAgICBkZWx0YTogMCxcbiAgICBlbnRyaWVzOiBbXSxcbiAgICBpZDogZ2VuZXJhdGVVbmlxdWVJRCgpLFxuICB9O1xufTtcbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlciB7XG4gIChlbnRyeTogUGVyZm9ybWFuY2VFbnRyeSk6IHZvaWQ7XG59XG5cbi8qKlxuICogVGFrZXMgYSBwZXJmb3JtYW5jZSBlbnRyeSB0eXBlIGFuZCBhIGNhbGxiYWNrIGZ1bmN0aW9uLCBhbmQgY3JlYXRlcyBhXG4gKiBgUGVyZm9ybWFuY2VPYnNlcnZlcmAgaW5zdGFuY2UgdGhhdCB3aWxsIG9ic2VydmUgdGhlIHNwZWNpZmllZCBlbnRyeSB0eXBlXG4gKiB3aXRoIGJ1ZmZlcmluZyBlbmFibGVkIGFuZCBjYWxsIHRoZSBjYWxsYmFjayBfZm9yIGVhY2ggZW50cnlfLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmZWF0dXJlLWRldGVjdHMgZW50cnkgc3VwcG9ydCBhbmQgd3JhcHMgdGhlIGxvZ2ljIGluIGFcbiAqIHRyeS9jYXRjaCB0byBhdm9pZCBlcnJvcnMgaW4gdW5zdXBwb3J0aW5nIGJyb3dzZXJzLlxuICovXG5leHBvcnQgY29uc3Qgb2JzZXJ2ZSA9ICh0eXBlOiBzdHJpbmcsIGNhbGxiYWNrOiBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlcik6IFBlcmZvcm1hbmNlT2JzZXJ2ZXIgfCB1bmRlZmluZWQgPT4ge1xuICB0cnkge1xuICAgIGlmIChQZXJmb3JtYW5jZU9ic2VydmVyLnN1cHBvcnRlZEVudHJ5VHlwZXMuaW5jbHVkZXModHlwZSkpIHtcbiAgICAgIC8vIE1vcmUgZXh0ZW5zaXZlIGZlYXR1cmUgZGV0ZWN0IG5lZWRlZCBmb3IgRmlyZWZveCBkdWUgdG86XG4gICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lL3dlYi12aXRhbHMvaXNzdWVzLzE0MlxuICAgICAgaWYgKHR5cGUgPT09ICdmaXJzdC1pbnB1dCcgJiYgISgnUGVyZm9ybWFuY2VFdmVudFRpbWluZycgaW4gc2VsZikpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwbzogUGVyZm9ybWFuY2VPYnNlcnZlciA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGwgPT4gbC5nZXRFbnRyaWVzKCkubWFwKGNhbGxiYWNrKSk7XG5cbiAgICAgIHBvLm9ic2VydmUoeyB0eXBlLCBidWZmZXJlZDogdHJ1ZSB9KTtcbiAgICAgIHJldHVybiBwbztcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBEbyBub3RoaW5nLlxuICB9XG4gIHJldHVybjtcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9uSGlkZGVuQ2FsbGJhY2sge1xuICAoZXZlbnQ6IEV2ZW50KTogdm9pZDtcbn1cblxuZXhwb3J0IGNvbnN0IG9uSGlkZGVuID0gKGNiOiBPbkhpZGRlbkNhbGxiYWNrLCBvbmNlPzogYm9vbGVhbik6IHZvaWQgPT4ge1xuICBjb25zdCBvbkhpZGRlbk9yUGFnZUhpZGUgPSAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdwYWdlaGlkZScgfHwgZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKS5kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nKSB7XG4gICAgICBjYihldmVudCk7XG4gICAgICBpZiAob25jZSkge1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25IaWRkZW5PclBhZ2VIaWRlLCB0cnVlKTtcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCBvbkhpZGRlbk9yUGFnZUhpZGUsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIG9uSGlkZGVuT3JQYWdlSGlkZSwgdHJ1ZSk7XG4gIC8vIFNvbWUgYnJvd3NlcnMgaGF2ZSBidWdneSBpbXBsZW1lbnRhdGlvbnMgb2YgdmlzaWJpbGl0eWNoYW5nZSxcbiAgLy8gc28gd2UgdXNlIHBhZ2VoaWRlIGluIGFkZGl0aW9uLCBqdXN0IHRvIGJlIHNhZmUuXG4gIGFkZEV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgb25IaWRkZW5PclBhZ2VIaWRlLCB0cnVlKTtcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGJpbmRSZXBvcnRlciB9IGZyb20gJy4vbGliL2JpbmRSZXBvcnRlcic7XG5pbXBvcnQgeyBpbml0TWV0cmljIH0gZnJvbSAnLi9saWIvaW5pdE1ldHJpYyc7XG5pbXBvcnQgeyBvYnNlcnZlLCBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlciB9IGZyb20gJy4vbGliL29ic2VydmUnO1xuaW1wb3J0IHsgb25IaWRkZW4gfSBmcm9tICcuL2xpYi9vbkhpZGRlbic7XG5pbXBvcnQgeyBSZXBvcnRIYW5kbGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vbGF5b3V0LWluc3RhYmlsaXR5LyNzZWMtbGF5b3V0LXNoaWZ0XG5leHBvcnQgaW50ZXJmYWNlIExheW91dFNoaWZ0IGV4dGVuZHMgUGVyZm9ybWFuY2VFbnRyeSB7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGhhZFJlY2VudElucHV0OiBib29sZWFuO1xuICBzb3VyY2VzOiBBcnJheTxMYXlvdXRTaGlmdEF0dHJpYnV0aW9uPjtcbiAgdG9KU09OKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dFNoaWZ0QXR0cmlidXRpb24ge1xuICBub2RlPzogTm9kZTtcbiAgcHJldmlvdXNSZWN0OiBET01SZWN0UmVhZE9ubHk7XG4gIGN1cnJlbnRSZWN0OiBET01SZWN0UmVhZE9ubHk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDTFMgPSAob25SZXBvcnQ6IFJlcG9ydEhhbmRsZXIsIHJlcG9ydEFsbENoYW5nZXM/OiBib29sZWFuKTogdm9pZCA9PiB7XG4gIGNvbnN0IG1ldHJpYyA9IGluaXRNZXRyaWMoJ0NMUycsIDApO1xuICBsZXQgcmVwb3J0OiBSZXR1cm5UeXBlPHR5cGVvZiBiaW5kUmVwb3J0ZXI+O1xuXG4gIGxldCBzZXNzaW9uVmFsdWUgPSAwO1xuICBsZXQgc2Vzc2lvbkVudHJpZXM6IFBlcmZvcm1hbmNlRW50cnlbXSA9IFtdO1xuXG4gIGNvbnN0IGVudHJ5SGFuZGxlciA9IChlbnRyeTogTGF5b3V0U2hpZnQpOiB2b2lkID0+IHtcbiAgICAvLyBPbmx5IGNvdW50IGxheW91dCBzaGlmdHMgd2l0aG91dCByZWNlbnQgdXNlciBpbnB1dC5cbiAgICAvLyBUT0RPOiBGaWd1cmUgb3V0IHdoeSBlbnRyeSBjYW4gYmUgdW5kZWZpbmVkXG4gICAgaWYgKGVudHJ5ICYmICFlbnRyeS5oYWRSZWNlbnRJbnB1dCkge1xuICAgICAgY29uc3QgZmlyc3RTZXNzaW9uRW50cnkgPSBzZXNzaW9uRW50cmllc1swXTtcbiAgICAgIGNvbnN0IGxhc3RTZXNzaW9uRW50cnkgPSBzZXNzaW9uRW50cmllc1tzZXNzaW9uRW50cmllcy5sZW5ndGggLSAxXTtcblxuICAgICAgLy8gSWYgdGhlIGVudHJ5IG9jY3VycmVkIGxlc3MgdGhhbiAxIHNlY29uZCBhZnRlciB0aGUgcHJldmlvdXMgZW50cnkgYW5kXG4gICAgICAvLyBsZXNzIHRoYW4gNSBzZWNvbmRzIGFmdGVyIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgc2Vzc2lvbiwgaW5jbHVkZSB0aGVcbiAgICAgIC8vIGVudHJ5IGluIHRoZSBjdXJyZW50IHNlc3Npb24uIE90aGVyd2lzZSwgc3RhcnQgYSBuZXcgc2Vzc2lvbi5cbiAgICAgIGlmIChcbiAgICAgICAgc2Vzc2lvblZhbHVlICYmXG4gICAgICAgIHNlc3Npb25FbnRyaWVzLmxlbmd0aCAhPT0gMCAmJlxuICAgICAgICBlbnRyeS5zdGFydFRpbWUgLSBsYXN0U2Vzc2lvbkVudHJ5LnN0YXJ0VGltZSA8IDEwMDAgJiZcbiAgICAgICAgZW50cnkuc3RhcnRUaW1lIC0gZmlyc3RTZXNzaW9uRW50cnkuc3RhcnRUaW1lIDwgNTAwMFxuICAgICAgKSB7XG4gICAgICAgIHNlc3Npb25WYWx1ZSArPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgc2Vzc2lvbkVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXNzaW9uVmFsdWUgPSBlbnRyeS52YWx1ZTtcbiAgICAgICAgc2Vzc2lvbkVudHJpZXMgPSBbZW50cnldO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgY3VycmVudCBzZXNzaW9uIHZhbHVlIGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IENMUyB2YWx1ZSxcbiAgICAgIC8vIHVwZGF0ZSBDTFMgYW5kIHRoZSBlbnRyaWVzIGNvbnRyaWJ1dGluZyB0byBpdC5cbiAgICAgIGlmIChzZXNzaW9uVmFsdWUgPiBtZXRyaWMudmFsdWUpIHtcbiAgICAgICAgbWV0cmljLnZhbHVlID0gc2Vzc2lvblZhbHVlO1xuICAgICAgICBtZXRyaWMuZW50cmllcyA9IHNlc3Npb25FbnRyaWVzO1xuICAgICAgICBpZiAocmVwb3J0KSB7XG4gICAgICAgICAgcmVwb3J0KCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcG8gPSBvYnNlcnZlKCdsYXlvdXQtc2hpZnQnLCBlbnRyeUhhbmRsZXIgYXMgUGVyZm9ybWFuY2VFbnRyeUhhbmRsZXIpO1xuICBpZiAocG8pIHtcbiAgICByZXBvcnQgPSBiaW5kUmVwb3J0ZXIob25SZXBvcnQsIG1ldHJpYywgcmVwb3J0QWxsQ2hhbmdlcyk7XG5cbiAgICBvbkhpZGRlbigoKSA9PiB7XG4gICAgICBwby50YWtlUmVjb3JkcygpLm1hcChlbnRyeUhhbmRsZXIgYXMgUGVyZm9ybWFuY2VFbnRyeUhhbmRsZXIpO1xuICAgICAgcmVwb3J0KHRydWUpO1xuICAgIH0pO1xuICB9XG59O1xuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgb25IaWRkZW4gfSBmcm9tICcuL29uSGlkZGVuJztcblxubGV0IGZpcnN0SGlkZGVuVGltZSA9IC0xO1xuXG5jb25zdCBpbml0SGlkZGVuVGltZSA9ICgpOiBudW1iZXIgPT4ge1xuICByZXR1cm4gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKS5kb2N1bWVudC52aXNpYmlsaXR5U3RhdGUgPT09ICdoaWRkZW4nID8gMCA6IEluZmluaXR5O1xufTtcblxuY29uc3QgdHJhY2tDaGFuZ2VzID0gKCk6IHZvaWQgPT4ge1xuICAvLyBVcGRhdGUgdGhlIHRpbWUgaWYvd2hlbiB0aGUgZG9jdW1lbnQgYmVjb21lcyBoaWRkZW4uXG4gIG9uSGlkZGVuKCh7IHRpbWVTdGFtcCB9KSA9PiB7XG4gICAgZmlyc3RIaWRkZW5UaW1lID0gdGltZVN0YW1wO1xuICB9LCB0cnVlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWaXNpYmlsaXR5V2F0Y2hlciA9ICgpOiB7XG4gIHJlYWRvbmx5IGZpcnN0SGlkZGVuVGltZTogbnVtYmVyO1xufSA9PiB7XG4gIGlmIChmaXJzdEhpZGRlblRpbWUgPCAwKSB7XG4gICAgLy8gSWYgdGhlIGRvY3VtZW50IGlzIGhpZGRlbiB3aGVuIHRoaXMgY29kZSBydW5zLCBhc3N1bWUgaXQgd2FzIGhpZGRlblxuICAgIC8vIHNpbmNlIG5hdmlnYXRpb24gc3RhcnQuIFRoaXMgaXNuJ3QgYSBwZXJmZWN0IGhldXJpc3RpYywgYnV0IGl0J3MgdGhlXG4gICAgLy8gYmVzdCB3ZSBjYW4gZG8gdW50aWwgYW4gQVBJIGlzIGF2YWlsYWJsZSB0byBzdXBwb3J0IHF1ZXJ5aW5nIHBhc3RcbiAgICAvLyB2aXNpYmlsaXR5U3RhdGUuXG4gICAgZmlyc3RIaWRkZW5UaW1lID0gaW5pdEhpZGRlblRpbWUoKTtcbiAgICB0cmFja0NoYW5nZXMoKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldCBmaXJzdEhpZGRlblRpbWUoKSB7XG4gICAgICByZXR1cm4gZmlyc3RIaWRkZW5UaW1lO1xuICAgIH0sXG4gIH07XG59O1xuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBiaW5kUmVwb3J0ZXIgfSBmcm9tICcuL2xpYi9iaW5kUmVwb3J0ZXInO1xuaW1wb3J0IHsgZ2V0VmlzaWJpbGl0eVdhdGNoZXIgfSBmcm9tICcuL2xpYi9nZXRWaXNpYmlsaXR5V2F0Y2hlcic7XG5pbXBvcnQgeyBpbml0TWV0cmljIH0gZnJvbSAnLi9saWIvaW5pdE1ldHJpYyc7XG5pbXBvcnQgeyBvYnNlcnZlLCBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlciB9IGZyb20gJy4vbGliL29ic2VydmUnO1xuaW1wb3J0IHsgb25IaWRkZW4gfSBmcm9tICcuL2xpYi9vbkhpZGRlbic7XG5pbXBvcnQgeyBQZXJmb3JtYW5jZUV2ZW50VGltaW5nLCBSZXBvcnRIYW5kbGVyIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBnZXRGSUQgPSAob25SZXBvcnQ6IFJlcG9ydEhhbmRsZXIsIHJlcG9ydEFsbENoYW5nZXM/OiBib29sZWFuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHZpc2liaWxpdHlXYXRjaGVyID0gZ2V0VmlzaWJpbGl0eVdhdGNoZXIoKTtcbiAgY29uc3QgbWV0cmljID0gaW5pdE1ldHJpYygnRklEJyk7XG4gIGxldCByZXBvcnQ6IFJldHVyblR5cGU8dHlwZW9mIGJpbmRSZXBvcnRlcj47XG5cbiAgY29uc3QgZW50cnlIYW5kbGVyID0gKGVudHJ5OiBQZXJmb3JtYW5jZUV2ZW50VGltaW5nKTogdm9pZCA9PiB7XG4gICAgLy8gT25seSByZXBvcnQgaWYgdGhlIHBhZ2Ugd2Fzbid0IGhpZGRlbiBwcmlvciB0byB0aGUgZmlyc3QgaW5wdXQuXG4gICAgaWYgKHJlcG9ydCAmJiBlbnRyeS5zdGFydFRpbWUgPCB2aXNpYmlsaXR5V2F0Y2hlci5maXJzdEhpZGRlblRpbWUpIHtcbiAgICAgIG1ldHJpYy52YWx1ZSA9IGVudHJ5LnByb2Nlc3NpbmdTdGFydCAtIGVudHJ5LnN0YXJ0VGltZTtcbiAgICAgIG1ldHJpYy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgICAgcmVwb3J0KHRydWUpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBwbyA9IG9ic2VydmUoJ2ZpcnN0LWlucHV0JywgZW50cnlIYW5kbGVyIGFzIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyKTtcbiAgaWYgKHBvKSB7XG4gICAgcmVwb3J0ID0gYmluZFJlcG9ydGVyKG9uUmVwb3J0LCBtZXRyaWMsIHJlcG9ydEFsbENoYW5nZXMpO1xuICAgIG9uSGlkZGVuKCgpID0+IHtcbiAgICAgIHBvLnRha2VSZWNvcmRzKCkubWFwKGVudHJ5SGFuZGxlciBhcyBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlcik7XG4gICAgICBwby5kaXNjb25uZWN0KCk7XG4gICAgfSwgdHJ1ZSk7XG4gIH1cbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGJpbmRSZXBvcnRlciB9IGZyb20gJy4vbGliL2JpbmRSZXBvcnRlcic7XG5pbXBvcnQgeyBnZXRWaXNpYmlsaXR5V2F0Y2hlciB9IGZyb20gJy4vbGliL2dldFZpc2liaWxpdHlXYXRjaGVyJztcbmltcG9ydCB7IGluaXRNZXRyaWMgfSBmcm9tICcuL2xpYi9pbml0TWV0cmljJztcbmltcG9ydCB7IG9ic2VydmUsIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyIH0gZnJvbSAnLi9saWIvb2JzZXJ2ZSc7XG5pbXBvcnQgeyBvbkhpZGRlbiB9IGZyb20gJy4vbGliL29uSGlkZGVuJztcbmltcG9ydCB7IFJlcG9ydEhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9sYXJnZXN0LWNvbnRlbnRmdWwtcGFpbnQvI3NlYy1sYXJnZXN0LWNvbnRlbnRmdWwtcGFpbnQtaW50ZXJmYWNlXG5leHBvcnQgaW50ZXJmYWNlIExhcmdlc3RDb250ZW50ZnVsUGFpbnQgZXh0ZW5kcyBQZXJmb3JtYW5jZUVudHJ5IHtcbiAgcmVuZGVyVGltZTogRE9NSGlnaFJlc1RpbWVTdGFtcDtcbiAgbG9hZFRpbWU6IERPTUhpZ2hSZXNUaW1lU3RhbXA7XG4gIHNpemU6IG51bWJlcjtcbiAgaWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGVsZW1lbnQ/OiBFbGVtZW50O1xuICB0b0pTT04oKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cblxuY29uc3QgcmVwb3J0ZWRNZXRyaWNJRHM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cbmV4cG9ydCBjb25zdCBnZXRMQ1AgPSAob25SZXBvcnQ6IFJlcG9ydEhhbmRsZXIsIHJlcG9ydEFsbENoYW5nZXM/OiBib29sZWFuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHZpc2liaWxpdHlXYXRjaGVyID0gZ2V0VmlzaWJpbGl0eVdhdGNoZXIoKTtcbiAgY29uc3QgbWV0cmljID0gaW5pdE1ldHJpYygnTENQJyk7XG4gIGxldCByZXBvcnQ6IFJldHVyblR5cGU8dHlwZW9mIGJpbmRSZXBvcnRlcj47XG5cbiAgY29uc3QgZW50cnlIYW5kbGVyID0gKGVudHJ5OiBQZXJmb3JtYW5jZUVudHJ5KTogdm9pZCA9PiB7XG4gICAgLy8gVGhlIHN0YXJ0VGltZSBhdHRyaWJ1dGUgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHJlbmRlclRpbWUgaWYgaXQgaXMgbm90IDAsXG4gICAgLy8gYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbG9hZFRpbWUgb3RoZXJ3aXNlLlxuICAgIGNvbnN0IHZhbHVlID0gZW50cnkuc3RhcnRUaW1lO1xuXG4gICAgLy8gSWYgdGhlIHBhZ2Ugd2FzIGhpZGRlbiBwcmlvciB0byBwYWludCB0aW1lIG9mIHRoZSBlbnRyeSxcbiAgICAvLyBpZ25vcmUgaXQgYW5kIG1hcmsgdGhlIG1ldHJpYyBhcyBmaW5hbCwgb3RoZXJ3aXNlIGFkZCB0aGUgZW50cnkuXG4gICAgaWYgKHZhbHVlIDwgdmlzaWJpbGl0eVdhdGNoZXIuZmlyc3RIaWRkZW5UaW1lKSB7XG4gICAgICBtZXRyaWMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIG1ldHJpYy5lbnRyaWVzLnB1c2goZW50cnkpO1xuICAgIH1cblxuICAgIGlmIChyZXBvcnQpIHtcbiAgICAgIHJlcG9ydCgpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBwbyA9IG9ic2VydmUoJ2xhcmdlc3QtY29udGVudGZ1bC1wYWludCcsIGVudHJ5SGFuZGxlcik7XG5cbiAgaWYgKHBvKSB7XG4gICAgcmVwb3J0ID0gYmluZFJlcG9ydGVyKG9uUmVwb3J0LCBtZXRyaWMsIHJlcG9ydEFsbENoYW5nZXMpO1xuXG4gICAgY29uc3Qgc3RvcExpc3RlbmluZyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghcmVwb3J0ZWRNZXRyaWNJRHNbbWV0cmljLmlkXSkge1xuICAgICAgICBwby50YWtlUmVjb3JkcygpLm1hcChlbnRyeUhhbmRsZXIgYXMgUGVyZm9ybWFuY2VFbnRyeUhhbmRsZXIpO1xuICAgICAgICBwby5kaXNjb25uZWN0KCk7XG4gICAgICAgIHJlcG9ydGVkTWV0cmljSURzW21ldHJpYy5pZF0gPSB0cnVlO1xuICAgICAgICByZXBvcnQodHJ1ZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN0b3AgbGlzdGVuaW5nIGFmdGVyIGlucHV0LiBOb3RlOiB3aGlsZSBzY3JvbGxpbmcgaXMgYW4gaW5wdXQgdGhhdFxuICAgIC8vIHN0b3AgTENQIG9ic2VydmF0aW9uLCBpdCdzIHVucmVsaWFibGUgc2luY2UgaXQgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHlcbiAgICAvLyBnZW5lcmF0ZWQuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS93ZWItdml0YWxzL2lzc3Vlcy83NVxuICAgIFsna2V5ZG93bicsICdjbGljayddLmZvckVhY2godHlwZSA9PiB7XG4gICAgICBhZGRFdmVudExpc3RlbmVyKHR5cGUsIHN0b3BMaXN0ZW5pbmcsIHsgb25jZTogdHJ1ZSwgY2FwdHVyZTogdHJ1ZSB9KTtcbiAgICB9KTtcblxuICAgIG9uSGlkZGVuKHN0b3BMaXN0ZW5pbmcsIHRydWUpO1xuICB9XG59O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgTWVhc3VyZW1lbnRzLCBTcGFuQ29udGV4dCB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbiwgZ2V0R2xvYmFsT2JqZWN0LCBodG1sVHJlZUFzU3RyaW5nLCBpc05vZGVFbnYsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBTcGFuIH0gZnJvbSAnLi4vc3Bhbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3RyYW5zYWN0aW9uJztcbmltcG9ydCB7IG1zVG9TZWMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBnZXRDTFMsIExheW91dFNoaWZ0IH0gZnJvbSAnLi93ZWItdml0YWxzL2dldENMUyc7XG5pbXBvcnQgeyBnZXRGSUQgfSBmcm9tICcuL3dlYi12aXRhbHMvZ2V0RklEJztcbmltcG9ydCB7IGdldExDUCwgTGFyZ2VzdENvbnRlbnRmdWxQYWludCB9IGZyb20gJy4vd2ViLXZpdGFscy9nZXRMQ1AnO1xuaW1wb3J0IHsgZ2V0VmlzaWJpbGl0eVdhdGNoZXIgfSBmcm9tICcuL3dlYi12aXRhbHMvbGliL2dldFZpc2liaWxpdHlXYXRjaGVyJztcbmltcG9ydCB7IE5hdmlnYXRvckRldmljZU1lbW9yeSwgTmF2aWdhdG9yTmV0d29ya0luZm9ybWF0aW9uIH0gZnJvbSAnLi93ZWItdml0YWxzL3R5cGVzJztcblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcblxuLyoqIENsYXNzIHRyYWNraW5nIG1ldHJpY3MgICovXG5leHBvcnQgY2xhc3MgTWV0cmljc0luc3RydW1lbnRhdGlvbiB7XG4gIHByaXZhdGUgX21lYXN1cmVtZW50czogTWVhc3VyZW1lbnRzID0ge307XG5cbiAgcHJpdmF0ZSBfcGVyZm9ybWFuY2VDdXJzb3I6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2xjcEVudHJ5OiBMYXJnZXN0Q29udGVudGZ1bFBhaW50IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jbHNFbnRyeTogTGF5b3V0U2hpZnQgfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlcG9ydEFsbENoYW5nZXM6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICghaXNOb2RlRW52KCkgJiYgZ2xvYmFsPy5wZXJmb3JtYW5jZSAmJiBnbG9iYWw/LmRvY3VtZW50KSB7XG4gICAgICBpZiAoZ2xvYmFsLnBlcmZvcm1hbmNlLm1hcmspIHtcbiAgICAgICAgZ2xvYmFsLnBlcmZvcm1hbmNlLm1hcmsoJ3NlbnRyeS10cmFjaW5nLWluaXQnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fdHJhY2tDTFMoKTtcbiAgICAgIHRoaXMuX3RyYWNrTENQKCk7XG4gICAgICB0aGlzLl90cmFja0ZJRCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBBZGQgcGVyZm9ybWFuY2UgcmVsYXRlZCBzcGFucyB0byBhIHRyYW5zYWN0aW9uICovXG4gIHB1YmxpYyBhZGRQZXJmb3JtYW5jZUVudHJpZXModHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCFnbG9iYWwgfHwgIWdsb2JhbC5wZXJmb3JtYW5jZSB8fCAhZ2xvYmFsLnBlcmZvcm1hbmNlLmdldEVudHJpZXMgfHwgIWJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4pIHtcbiAgICAgIC8vIEdhdGVrZWVwZXIgaWYgcGVyZm9ybWFuY2UgQVBJIG5vdCBhdmFpbGFibGVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKCdbVHJhY2luZ10gQWRkaW5nICYgYWRqdXN0aW5nIHNwYW5zIHVzaW5nIFBlcmZvcm1hbmNlIEFQSScpO1xuXG4gICAgY29uc3QgdGltZU9yaWdpbiA9IG1zVG9TZWMoYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbik7XG4gICAgbGV0IGVudHJ5U2NyaXB0U3JjOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoZ2xvYmFsLmRvY3VtZW50ICYmIGdsb2JhbC5kb2N1bWVudC5zY3JpcHRzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci1mb3Itb2ZcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ2xvYmFsLmRvY3VtZW50LnNjcmlwdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gV2UgZ28gdGhyb3VnaCBhbGwgc2NyaXB0cyBvbiB0aGUgcGFnZSBhbmQgbG9vayBmb3IgJ2RhdGEtZW50cnknXG4gICAgICAgIC8vIFdlIHJlbWVtYmVyIHRoZSBuYW1lIGFuZCBtZWFzdXJlIHRoZSB0aW1lIGJldHdlZW4gdGhpcyBzY3JpcHQgZmluaXNoZWQgbG9hZGluZyBhbmRcbiAgICAgICAgLy8gb3VyIG1hcmsgJ3NlbnRyeS10cmFjaW5nLWluaXQnXG4gICAgICAgIGlmIChnbG9iYWwuZG9jdW1lbnQuc2NyaXB0c1tpXS5kYXRhc2V0LmVudHJ5ID09PSAndHJ1ZScpIHtcbiAgICAgICAgICBlbnRyeVNjcmlwdFNyYyA9IGdsb2JhbC5kb2N1bWVudC5zY3JpcHRzW2ldLnNyYztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBlbnRyeVNjcmlwdFN0YXJ0VGltZXN0YW1wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZTogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZXNwb25zZVN0YXJ0VGltZXN0YW1wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlcXVlc3RTdGFydFRpbWVzdGFtcDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICAgZ2xvYmFsLnBlcmZvcm1hbmNlXG4gICAgICAuZ2V0RW50cmllcygpXG4gICAgICAuc2xpY2UodGhpcy5fcGVyZm9ybWFuY2VDdXJzb3IpXG4gICAgICAuZm9yRWFjaCgoZW50cnk6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbXNUb1NlYyhlbnRyeS5zdGFydFRpbWUgYXMgbnVtYmVyKTtcbiAgICAgICAgY29uc3QgZHVyYXRpb24gPSBtc1RvU2VjKGVudHJ5LmR1cmF0aW9uIGFzIG51bWJlcik7XG5cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLm9wID09PSAnbmF2aWdhdGlvbicgJiYgdGltZU9yaWdpbiArIHN0YXJ0VGltZSA8IHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChlbnRyeS5lbnRyeVR5cGUpIHtcbiAgICAgICAgICBjYXNlICduYXZpZ2F0aW9uJzoge1xuICAgICAgICAgICAgYWRkTmF2aWdhdGlvblNwYW5zKHRyYW5zYWN0aW9uLCBlbnRyeSwgdGltZU9yaWdpbik7XG4gICAgICAgICAgICByZXNwb25zZVN0YXJ0VGltZXN0YW1wID0gdGltZU9yaWdpbiArIG1zVG9TZWMoZW50cnkucmVzcG9uc2VTdGFydCBhcyBudW1iZXIpO1xuICAgICAgICAgICAgcmVxdWVzdFN0YXJ0VGltZXN0YW1wID0gdGltZU9yaWdpbiArIG1zVG9TZWMoZW50cnkucmVxdWVzdFN0YXJ0IGFzIG51bWJlcik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbWFyayc6XG4gICAgICAgICAgY2FzZSAncGFpbnQnOlxuICAgICAgICAgIGNhc2UgJ21lYXN1cmUnOiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydFRpbWVzdGFtcCA9IGFkZE1lYXN1cmVTcGFucyh0cmFuc2FjdGlvbiwgZW50cnksIHN0YXJ0VGltZSwgZHVyYXRpb24sIHRpbWVPcmlnaW4pO1xuICAgICAgICAgICAgaWYgKHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSA9PT0gdW5kZWZpbmVkICYmIGVudHJ5Lm5hbWUgPT09ICdzZW50cnktdHJhY2luZy1pbml0Jykge1xuICAgICAgICAgICAgICB0cmFjaW5nSW5pdE1hcmtTdGFydFRpbWUgPSBzdGFydFRpbWVzdGFtcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FwdHVyZSB3ZWIgdml0YWxzXG5cbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SGlkZGVuID0gZ2V0VmlzaWJpbGl0eVdhdGNoZXIoKTtcbiAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IGlmIHRoZSBwYWdlIHdhc24ndCBoaWRkZW4gcHJpb3IgdG8gdGhlIHdlYiB2aXRhbC5cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFJlY29yZCA9IGVudHJ5LnN0YXJ0VGltZSA8IGZpcnN0SGlkZGVuLmZpcnN0SGlkZGVuVGltZTtcblxuICAgICAgICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09ICdmaXJzdC1wYWludCcgJiYgc2hvdWxkUmVjb3JkKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBGUCcpO1xuICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2ZwJ10gPSB7IHZhbHVlOiBlbnRyeS5zdGFydFRpbWUgfTtcbiAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydtYXJrLmZwJ10gPSB7IHZhbHVlOiBzdGFydFRpbWVzdGFtcCB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZW50cnkubmFtZSA9PT0gJ2ZpcnN0LWNvbnRlbnRmdWwtcGFpbnQnICYmIHNob3VsZFJlY29yZCkge1xuICAgICAgICAgICAgICBsb2dnZXIubG9nKCdbTWVhc3VyZW1lbnRzXSBBZGRpbmcgRkNQJyk7XG4gICAgICAgICAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snZmNwJ10gPSB7IHZhbHVlOiBlbnRyeS5zdGFydFRpbWUgfTtcbiAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydtYXJrLmZjcCddID0geyB2YWx1ZTogc3RhcnRUaW1lc3RhbXAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3Jlc291cmNlJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VOYW1lID0gKGVudHJ5Lm5hbWUgYXMgc3RyaW5nKS5yZXBsYWNlKGdsb2JhbC5sb2NhdGlvbi5vcmlnaW4sICcnKTtcbiAgICAgICAgICAgIGNvbnN0IGVuZFRpbWVzdGFtcCA9IGFkZFJlc291cmNlU3BhbnModHJhbnNhY3Rpb24sIGVudHJ5LCByZXNvdXJjZU5hbWUsIHN0YXJ0VGltZSwgZHVyYXRpb24sIHRpbWVPcmlnaW4pO1xuICAgICAgICAgICAgLy8gV2UgcmVtZW1iZXIgdGhlIGVudHJ5IHNjcmlwdCBlbmQgdGltZSB0byBjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgdG8gdGhlIGZpcnN0IGluaXQgbWFya1xuICAgICAgICAgICAgaWYgKGVudHJ5U2NyaXB0U3RhcnRUaW1lc3RhbXAgPT09IHVuZGVmaW5lZCAmJiAoZW50cnlTY3JpcHRTcmMgfHwgJycpLmluZGV4T2YocmVzb3VyY2VOYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgIGVudHJ5U2NyaXB0U3RhcnRUaW1lc3RhbXAgPSBlbmRUaW1lc3RhbXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBJZ25vcmUgb3RoZXIgZW50cnkgdHlwZXMuXG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgaWYgKGVudHJ5U2NyaXB0U3RhcnRUaW1lc3RhbXAgIT09IHVuZGVmaW5lZCAmJiB0cmFjaW5nSW5pdE1hcmtTdGFydFRpbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICAgICAgZGVzY3JpcHRpb246ICdldmFsdWF0aW9uJyxcbiAgICAgICAgZW5kVGltZXN0YW1wOiB0cmFjaW5nSW5pdE1hcmtTdGFydFRpbWUsXG4gICAgICAgIG9wOiAnc2NyaXB0JyxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IGVudHJ5U2NyaXB0U3RhcnRUaW1lc3RhbXAsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9wZXJmb3JtYW5jZUN1cnNvciA9IE1hdGgubWF4KHBlcmZvcm1hbmNlLmdldEVudHJpZXMoKS5sZW5ndGggLSAxLCAwKTtcblxuICAgIHRoaXMuX3RyYWNrTmF2aWdhdG9yKHRyYW5zYWN0aW9uKTtcblxuICAgIC8vIE1lYXN1cmVtZW50cyBhcmUgb25seSBhdmFpbGFibGUgZm9yIHBhZ2Vsb2FkIHRyYW5zYWN0aW9uc1xuICAgIGlmICh0cmFuc2FjdGlvbi5vcCA9PT0gJ3BhZ2Vsb2FkJykge1xuICAgICAgLy8gbm9ybWFsaXplIGFwcGxpY2FibGUgd2ViIHZpdGFsIHZhbHVlcyB0byBiZSByZWxhdGl2ZSB0byB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcFxuXG4gICAgICBjb25zdCB0aW1lT3JpZ2luID0gbXNUb1NlYyhicm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luKTtcblxuICAgICAgLy8gR2VuZXJhdGUgVFRGQiAoVGltZSB0byBGaXJzdCBCeXRlKSwgd2hpY2ggbWVhc3VyZWQgYXMgdGhlIHRpbWUgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0cmFuc2FjdGlvbiBhbmQgdGhlXG4gICAgICAvLyBzdGFydCBvZiB0aGUgcmVzcG9uc2UgaW4gbWlsbGlzZWNvbmRzXG4gICAgICBpZiAodHlwZW9mIHJlc3BvbnNlU3RhcnRUaW1lc3RhbXAgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBUVEZCJyk7XG4gICAgICAgIHRoaXMuX21lYXN1cmVtZW50c1sndHRmYiddID0geyB2YWx1ZTogKHJlc3BvbnNlU3RhcnRUaW1lc3RhbXAgLSB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcCkgKiAxMDAwIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0U3RhcnRUaW1lc3RhbXAgPT09ICdudW1iZXInICYmIHJlcXVlc3RTdGFydFRpbWVzdGFtcCA8PSByZXNwb25zZVN0YXJ0VGltZXN0YW1wKSB7XG4gICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgdGltZSBzcGVudCBtYWtpbmcgdGhlIHJlcXVlc3QgYW5kIHJlY2VpdmluZyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgdGltZSBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgcmVxdWVzdCBhbmQgdGhlIHN0YXJ0IG9mIHRoZSByZXNwb25zZSBpbiBtaWxsaXNlY29uZHMuXG4gICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWyd0dGZiLnJlcXVlc3RUaW1lJ10gPSB7IHZhbHVlOiAocmVzcG9uc2VTdGFydFRpbWVzdGFtcCAtIHJlcXVlc3RTdGFydFRpbWVzdGFtcCkgKiAxMDAwIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgWydmY3AnLCAnZnAnLCAnbGNwJ10uZm9yRWFjaChuYW1lID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9tZWFzdXJlbWVudHNbbmFtZV0gfHwgdGltZU9yaWdpbiA+PSB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSB3ZWIgdml0YWxzLCBmY3AsIGZwLCBsY3AsIGFuZCB0dGZiLCBhbGwgbWVhc3VyZSByZWxhdGl2ZSB0byB0aW1lT3JpZ2luLlxuICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aW1lT3JpZ2luIGlzIG5vdCBjYXB0dXJlZCB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIHNwYW4gZGF0YSwgc28gdGhlc2Ugd2ViIHZpdGFscyB3aWxsIG5lZWRcbiAgICAgICAgLy8gdG8gYmUgYWRqdXN0ZWQgdG8gYmUgcmVsYXRpdmUgdG8gdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXAuXG5cbiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLl9tZWFzdXJlbWVudHNbbmFtZV0udmFsdWU7XG4gICAgICAgIGNvbnN0IG1lYXN1cmVtZW50VGltZXN0YW1wID0gdGltZU9yaWdpbiArIG1zVG9TZWMob2xkVmFsdWUpO1xuICAgICAgICAvLyBub3JtYWxpemVkVmFsdWUgc2hvdWxkIGJlIGluIG1pbGxpc2Vjb25kc1xuICAgICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBNYXRoLmFicygobWVhc3VyZW1lbnRUaW1lc3RhbXAgLSB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcCkgKiAxMDAwKTtcblxuICAgICAgICBjb25zdCBkZWx0YSA9IG5vcm1hbGl6ZWRWYWx1ZSAtIG9sZFZhbHVlO1xuICAgICAgICBsb2dnZXIubG9nKGBbTWVhc3VyZW1lbnRzXSBOb3JtYWxpemVkICR7bmFtZX0gZnJvbSAke29sZFZhbHVlfSB0byAke25vcm1hbGl6ZWRWYWx1ZX0gKCR7ZGVsdGF9KWApO1xuXG4gICAgICAgIHRoaXMuX21lYXN1cmVtZW50c1tuYW1lXS52YWx1ZSA9IG5vcm1hbGl6ZWRWYWx1ZTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy5fbWVhc3VyZW1lbnRzWydtYXJrLmZpZCddICYmIHRoaXMuX21lYXN1cmVtZW50c1snZmlkJ10pIHtcbiAgICAgICAgLy8gY3JlYXRlIHNwYW4gZm9yIEZJRFxuXG4gICAgICAgIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uLCB7XG4gICAgICAgICAgZGVzY3JpcHRpb246ICdmaXJzdCBpbnB1dCBkZWxheScsXG4gICAgICAgICAgZW5kVGltZXN0YW1wOiB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmlkJ10udmFsdWUgKyBtc1RvU2VjKHRoaXMuX21lYXN1cmVtZW50c1snZmlkJ10udmFsdWUpLFxuICAgICAgICAgIG9wOiAnd2ViLnZpdGFscycsXG4gICAgICAgICAgc3RhcnRUaW1lc3RhbXA6IHRoaXMuX21lYXN1cmVtZW50c1snbWFyay5maWQnXS52YWx1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIEZDUCBpcyBub3QgcmVjb3JkZWQgd2Ugc2hvdWxkIG5vdCByZWNvcmQgdGhlIGNscyB2YWx1ZVxuICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBuZXcgZGVmaW5pdGlvbiBvZiBDTFMuXG4gICAgICBpZiAoISgnZmNwJyBpbiB0aGlzLl9tZWFzdXJlbWVudHMpKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9tZWFzdXJlbWVudHMuY2xzO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2FjdGlvbi5zZXRNZWFzdXJlbWVudHModGhpcy5fbWVhc3VyZW1lbnRzKTtcbiAgICAgIHRoaXMuX3RhZ01ldHJpY0luZm8odHJhbnNhY3Rpb24pO1xuXG4gICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ3NlbnRyeV9yZXBvcnRBbGxDaGFuZ2VzJywgdGhpcy5fcmVwb3J0QWxsQ2hhbmdlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFkZCBMQ1AgLyBDTFMgZGF0YSB0byB0cmFuc2FjdGlvbiB0byBhbGxvdyBkZWJ1Z2dpbmcgKi9cbiAgcHJpdmF0ZSBfdGFnTWV0cmljSW5mbyh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbGNwRW50cnkpIHtcbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBMQ1AgRGF0YScpO1xuICAgICAgLy8gQ2FwdHVyZSBQcm9wZXJ0aWVzIG9mIHRoZSBMQ1AgZWxlbWVudCB0aGF0IGNvbnRyaWJ1dGVzIHRvIHRoZSBMQ1AuXG5cbiAgICAgIGlmICh0aGlzLl9sY3BFbnRyeS5lbGVtZW50KSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnbGNwLmVsZW1lbnQnLCBodG1sVHJlZUFzU3RyaW5nKHRoaXMuX2xjcEVudHJ5LmVsZW1lbnQpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2xjcEVudHJ5LmlkKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnbGNwLmlkJywgdGhpcy5fbGNwRW50cnkuaWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fbGNwRW50cnkudXJsKSB7XG4gICAgICAgIC8vIFRyaW0gVVJMIHRvIHRoZSBmaXJzdCAyMDAgY2hhcmFjdGVycy5cbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdsY3AudXJsJywgdGhpcy5fbGNwRW50cnkudXJsLnRyaW0oKS5zbGljZSgwLCAyMDApKTtcbiAgICAgIH1cblxuICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdsY3Auc2l6ZScsIHRoaXMuX2xjcEVudHJ5LnNpemUpO1xuICAgIH1cblxuICAgIC8vIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0xheW91dFNoaWZ0XG4gICAgaWYgKHRoaXMuX2Nsc0VudHJ5ICYmIHRoaXMuX2Nsc0VudHJ5LnNvdXJjZXMpIHtcbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBDTFMgRGF0YScpO1xuICAgICAgdGhpcy5fY2xzRW50cnkuc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGluZGV4KSA9PlxuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoYGNscy5zb3VyY2UuJHtpbmRleCArIDF9YCwgaHRtbFRyZWVBc1N0cmluZyhzb3VyY2Uubm9kZSkpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKiogU3RhcnRzIHRyYWNraW5nIHRoZSBDdW11bGF0aXZlIExheW91dCBTaGlmdCBvbiB0aGUgY3VycmVudCBwYWdlLiAqL1xuICBwcml2YXRlIF90cmFja0NMUygpOiB2b2lkIHtcbiAgICAvLyBTZWU6XG4gICAgLy8gaHR0cHM6Ly93ZWIuZGV2L2V2b2x2aW5nLWNscy9cbiAgICAvLyBodHRwczovL3dlYi5kZXYvY2xzLXdlYi10b29saW5nL1xuICAgIGdldENMUyhtZXRyaWMgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSBtZXRyaWMuZW50cmllcy5wb3AoKTtcbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsb2dnZXIubG9nKCdbTWVhc3VyZW1lbnRzXSBBZGRpbmcgQ0xTJyk7XG4gICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2NscyddID0geyB2YWx1ZTogbWV0cmljLnZhbHVlIH07XG4gICAgICB0aGlzLl9jbHNFbnRyeSA9IGVudHJ5IGFzIExheW91dFNoaWZ0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhcHR1cmUgdGhlIGluZm9ybWF0aW9uIG9mIHRoZSB1c2VyIGFnZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBfdHJhY2tOYXZpZ2F0b3IodHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgbmF2aWdhdG9yID0gZ2xvYmFsLm5hdmlnYXRvciBhcyBudWxsIHwgKE5hdmlnYXRvciAmIE5hdmlnYXRvck5ldHdvcmtJbmZvcm1hdGlvbiAmIE5hdmlnYXRvckRldmljZU1lbW9yeSk7XG4gICAgaWYgKCFuYXZpZ2F0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB0cmFjayBuZXR3b3JrIGNvbm5lY3Rpdml0eVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuYXZpZ2F0b3IuY29ubmVjdGlvbjtcbiAgICBpZiAoY29ubmVjdGlvbikge1xuICAgICAgaWYgKGNvbm5lY3Rpb24uZWZmZWN0aXZlVHlwZSkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2VmZmVjdGl2ZUNvbm5lY3Rpb25UeXBlJywgY29ubmVjdGlvbi5lZmZlY3RpdmVUeXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbm5lY3Rpb24udHlwZSkge1xuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2Nvbm5lY3Rpb25UeXBlJywgY29ubmVjdGlvbi50eXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWVhc3VyZW1lbnRWYWx1ZShjb25uZWN0aW9uLnJ0dCkpIHtcbiAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydjb25uZWN0aW9uLnJ0dCddID0geyB2YWx1ZTogY29ubmVjdGlvbi5ydHQgYXMgbnVtYmVyIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChpc01lYXN1cmVtZW50VmFsdWUoY29ubmVjdGlvbi5kb3dubGluaykpIHtcbiAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydjb25uZWN0aW9uLmRvd25saW5rJ10gPSB7IHZhbHVlOiBjb25uZWN0aW9uLmRvd25saW5rIGFzIG51bWJlciB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc01lYXN1cmVtZW50VmFsdWUobmF2aWdhdG9yLmRldmljZU1lbW9yeSkpIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnZGV2aWNlTWVtb3J5JywgU3RyaW5nKG5hdmlnYXRvci5kZXZpY2VNZW1vcnkpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNZWFzdXJlbWVudFZhbHVlKG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5KSkge1xuICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdoYXJkd2FyZUNvbmN1cnJlbmN5JywgU3RyaW5nKG5hdmlnYXRvci5oYXJkd2FyZUNvbmN1cnJlbmN5KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0YXJ0cyB0cmFja2luZyB0aGUgTGFyZ2VzdCBDb250ZW50ZnVsIFBhaW50IG9uIHRoZSBjdXJyZW50IHBhZ2UuICovXG4gIHByaXZhdGUgX3RyYWNrTENQKCk6IHZvaWQge1xuICAgIGdldExDUChtZXRyaWMgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSBtZXRyaWMuZW50cmllcy5wb3AoKTtcblxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWVPcmlnaW4gPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4gYXMgbnVtYmVyKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG1zVG9TZWMoZW50cnkuc3RhcnRUaW1lIGFzIG51bWJlcik7XG4gICAgICBsb2dnZXIubG9nKCdbTWVhc3VyZW1lbnRzXSBBZGRpbmcgTENQJyk7XG4gICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2xjcCddID0geyB2YWx1ZTogbWV0cmljLnZhbHVlIH07XG4gICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsubGNwJ10gPSB7IHZhbHVlOiB0aW1lT3JpZ2luICsgc3RhcnRUaW1lIH07XG4gICAgICB0aGlzLl9sY3BFbnRyeSA9IGVudHJ5IGFzIExhcmdlc3RDb250ZW50ZnVsUGFpbnQ7XG4gICAgfSwgdGhpcy5fcmVwb3J0QWxsQ2hhbmdlcyk7XG4gIH1cblxuICAvKiogU3RhcnRzIHRyYWNraW5nIHRoZSBGaXJzdCBJbnB1dCBEZWxheSBvbiB0aGUgY3VycmVudCBwYWdlLiAqL1xuICBwcml2YXRlIF90cmFja0ZJRCgpOiB2b2lkIHtcbiAgICBnZXRGSUQobWV0cmljID0+IHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gbWV0cmljLmVudHJpZXMucG9wKCk7XG5cbiAgICAgIGlmICghZW50cnkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0aW1lT3JpZ2luID0gbXNUb1NlYyhicm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luIGFzIG51bWJlcik7XG4gICAgICBjb25zdCBzdGFydFRpbWUgPSBtc1RvU2VjKGVudHJ5LnN0YXJ0VGltZSBhcyBudW1iZXIpO1xuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIEZJRCcpO1xuICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydmaWQnXSA9IHsgdmFsdWU6IG1ldHJpYy52YWx1ZSB9O1xuICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydtYXJrLmZpZCddID0geyB2YWx1ZTogdGltZU9yaWdpbiArIHN0YXJ0VGltZSB9O1xuICAgIH0pO1xuICB9XG59XG5cbi8qKiBJbnN0cnVtZW50IG5hdmlnYXRpb24gZW50cmllcyAqL1xuZnVuY3Rpb24gYWRkTmF2aWdhdGlvblNwYW5zKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiwgZW50cnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIHRpbWVPcmlnaW46IG51bWJlcik6IHZvaWQge1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50OiAndW5sb2FkRXZlbnQnLCB0aW1lT3JpZ2luIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50OiAncmVkaXJlY3QnLCB0aW1lT3JpZ2luIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50OiAnZG9tQ29udGVudExvYWRlZEV2ZW50JywgdGltZU9yaWdpbiB9KTtcbiAgYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHsgdHJhbnNhY3Rpb24sIGVudHJ5LCBldmVudDogJ2xvYWRFdmVudCcsIHRpbWVPcmlnaW4gfSk7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7IHRyYW5zYWN0aW9uLCBlbnRyeSwgZXZlbnQ6ICdjb25uZWN0JywgdGltZU9yaWdpbiB9KTtcbiAgYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHtcbiAgICB0cmFuc2FjdGlvbixcbiAgICBlbnRyeSxcbiAgICBldmVudDogJ3NlY3VyZUNvbm5lY3Rpb24nLFxuICAgIHRpbWVPcmlnaW4sXG4gICAgZXZlbnRFbmQ6ICdjb25uZWN0RW5kJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RMUy9TU0wnLFxuICB9KTtcbiAgYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHtcbiAgICB0cmFuc2FjdGlvbixcbiAgICBlbnRyeSxcbiAgICBldmVudDogJ2ZldGNoJyxcbiAgICB0aW1lT3JpZ2luLFxuICAgIGV2ZW50RW5kOiAnZG9tYWluTG9va3VwU3RhcnQnLFxuICAgIGRlc2NyaXB0aW9uOiAnY2FjaGUnLFxuICB9KTtcbiAgYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHsgdHJhbnNhY3Rpb24sIGVudHJ5LCBldmVudDogJ2RvbWFpbkxvb2t1cCcsIHRpbWVPcmlnaW4sIGRlc2NyaXB0aW9uOiAnRE5TJyB9KTtcbiAgYWRkUmVxdWVzdCh0cmFuc2FjdGlvbiwgZW50cnksIHRpbWVPcmlnaW4pO1xufVxuXG4vKiogQ3JlYXRlIG1lYXN1cmUgcmVsYXRlZCBzcGFucyAqL1xuZnVuY3Rpb24gYWRkTWVhc3VyZVNwYW5zKFxuICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24sXG4gIGVudHJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBzdGFydFRpbWU6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgdGltZU9yaWdpbjogbnVtYmVyLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgbWVhc3VyZVN0YXJ0VGltZXN0YW1wID0gdGltZU9yaWdpbiArIHN0YXJ0VGltZTtcbiAgY29uc3QgbWVhc3VyZUVuZFRpbWVzdGFtcCA9IG1lYXN1cmVTdGFydFRpbWVzdGFtcCArIGR1cmF0aW9uO1xuXG4gIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uLCB7XG4gICAgZGVzY3JpcHRpb246IGVudHJ5Lm5hbWUgYXMgc3RyaW5nLFxuICAgIGVuZFRpbWVzdGFtcDogbWVhc3VyZUVuZFRpbWVzdGFtcCxcbiAgICBvcDogZW50cnkuZW50cnlUeXBlIGFzIHN0cmluZyxcbiAgICBzdGFydFRpbWVzdGFtcDogbWVhc3VyZVN0YXJ0VGltZXN0YW1wLFxuICB9KTtcblxuICByZXR1cm4gbWVhc3VyZVN0YXJ0VGltZXN0YW1wO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlRW50cnkgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGluaXRpYXRvclR5cGU/OiBzdHJpbmc7XG4gIHRyYW5zZmVyU2l6ZT86IG51bWJlcjtcbiAgZW5jb2RlZEJvZHlTaXplPzogbnVtYmVyO1xuICBkZWNvZGVkQm9keVNpemU/OiBudW1iZXI7XG59XG5cbi8qKiBDcmVhdGUgcmVzb3VyY2UtcmVsYXRlZCBzcGFucyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFJlc291cmNlU3BhbnMoXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbixcbiAgZW50cnk6IFJlc291cmNlRW50cnksXG4gIHJlc291cmNlTmFtZTogc3RyaW5nLFxuICBzdGFydFRpbWU6IG51bWJlcixcbiAgZHVyYXRpb246IG51bWJlcixcbiAgdGltZU9yaWdpbjogbnVtYmVyLFxuKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgLy8gd2UgYWxyZWFkeSBpbnN0cnVtZW50IGJhc2VkIG9uIGZldGNoIGFuZCB4aHIsIHNvIHdlIGRvbid0IG5lZWQgdG9cbiAgLy8gZHVwbGljYXRlIHNwYW5zIGhlcmUuXG4gIGlmIChlbnRyeS5pbml0aWF0b3JUeXBlID09PSAneG1saHR0cHJlcXVlc3QnIHx8IGVudHJ5LmluaXRpYXRvclR5cGUgPT09ICdmZXRjaCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBpZiAoJ3RyYW5zZmVyU2l6ZScgaW4gZW50cnkpIHtcbiAgICBkYXRhWydUcmFuc2ZlciBTaXplJ10gPSBlbnRyeS50cmFuc2ZlclNpemU7XG4gIH1cbiAgaWYgKCdlbmNvZGVkQm9keVNpemUnIGluIGVudHJ5KSB7XG4gICAgZGF0YVsnRW5jb2RlZCBCb2R5IFNpemUnXSA9IGVudHJ5LmVuY29kZWRCb2R5U2l6ZTtcbiAgfVxuICBpZiAoJ2RlY29kZWRCb2R5U2l6ZScgaW4gZW50cnkpIHtcbiAgICBkYXRhWydEZWNvZGVkIEJvZHkgU2l6ZSddID0gZW50cnkuZGVjb2RlZEJvZHlTaXplO1xuICB9XG5cbiAgY29uc3Qgc3RhcnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgc3RhcnRUaW1lO1xuICBjb25zdCBlbmRUaW1lc3RhbXAgPSBzdGFydFRpbWVzdGFtcCArIGR1cmF0aW9uO1xuXG4gIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uLCB7XG4gICAgZGVzY3JpcHRpb246IHJlc291cmNlTmFtZSxcbiAgICBlbmRUaW1lc3RhbXAsXG4gICAgb3A6IGVudHJ5LmluaXRpYXRvclR5cGUgPyBgcmVzb3VyY2UuJHtlbnRyeS5pbml0aWF0b3JUeXBlfWAgOiAncmVzb3VyY2UnLFxuICAgIHN0YXJ0VGltZXN0YW1wLFxuICAgIGRhdGEsXG4gIH0pO1xuXG4gIHJldHVybiBlbmRUaW1lc3RhbXA7XG59XG5cbi8qKiBDcmVhdGUgcGVyZm9ybWFuY2UgbmF2aWdhdGlvbiByZWxhdGVkIHNwYW5zICovXG5mdW5jdGlvbiBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcocHJvcHM6IHtcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uO1xuICBlbnRyeTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgZXZlbnQ6IHN0cmluZztcbiAgdGltZU9yaWdpbjogbnVtYmVyO1xuICBldmVudEVuZD86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59KTogdm9pZCB7XG4gIGNvbnN0IHsgdHJhbnNhY3Rpb24sIGVudHJ5LCBldmVudCwgdGltZU9yaWdpbiwgZXZlbnRFbmQsIGRlc2NyaXB0aW9uIH0gPSBwcm9wcztcblxuICBjb25zdCBlbmQgPSBldmVudEVuZCA/IChlbnRyeVtldmVudEVuZF0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkKSA6IChlbnRyeVtgJHtldmVudH1FbmRgXSBhcyBudW1iZXIgfCB1bmRlZmluZWQpO1xuICBjb25zdCBzdGFydCA9IGVudHJ5W2Ake2V2ZW50fVN0YXJ0YF0gYXMgbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICBvcDogJ2Jyb3dzZXInLFxuICAgIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbiA/PyBldmVudCxcbiAgICBzdGFydFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoc3RhcnQpLFxuICAgIGVuZFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoZW5kKSxcbiAgfSk7XG59XG5cbi8qKiBDcmVhdGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmVsYXRlZCBzcGFucyAqL1xuZnVuY3Rpb24gYWRkUmVxdWVzdCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24sIGVudHJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCB0aW1lT3JpZ2luOiBudW1iZXIpOiB2b2lkIHtcbiAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICBvcDogJ2Jyb3dzZXInLFxuICAgIGRlc2NyaXB0aW9uOiAncmVxdWVzdCcsXG4gICAgc3RhcnRUaW1lc3RhbXA6IHRpbWVPcmlnaW4gKyBtc1RvU2VjKGVudHJ5LnJlcXVlc3RTdGFydCBhcyBudW1iZXIpLFxuICAgIGVuZFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoZW50cnkucmVzcG9uc2VFbmQgYXMgbnVtYmVyKSxcbiAgfSk7XG5cbiAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICBvcDogJ2Jyb3dzZXInLFxuICAgIGRlc2NyaXB0aW9uOiAncmVzcG9uc2UnLFxuICAgIHN0YXJ0VGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXNwb25zZVN0YXJ0IGFzIG51bWJlciksXG4gICAgZW5kVGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXNwb25zZUVuZCBhcyBudW1iZXIpLFxuICB9KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gc3RhcnQgY2hpbGQgb24gdHJhbnNhY3Rpb25zLiBUaGlzIGZ1bmN0aW9uIHdpbGwgbWFrZSBzdXJlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdpbGxcbiAqIHVzZSB0aGUgc3RhcnQgdGltZXN0YW1wIG9mIHRoZSBjcmVhdGVkIGNoaWxkIHNwYW4gaWYgaXQgaXMgZWFybGllciB0aGFuIHRoZSB0cmFuc2FjdGlvbnMgYWN0dWFsXG4gKiBzdGFydCB0aW1lc3RhbXAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24sIHsgc3RhcnRUaW1lc3RhbXAsIC4uLmN0eCB9OiBTcGFuQ29udGV4dCk6IFNwYW4ge1xuICBpZiAoc3RhcnRUaW1lc3RhbXAgJiYgdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXAgPiBzdGFydFRpbWVzdGFtcCkge1xuICAgIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wID0gc3RhcnRUaW1lc3RhbXA7XG4gIH1cblxuICByZXR1cm4gdHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgc3RhcnRUaW1lc3RhbXAsXG4gICAgLi4uY3R4LFxuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYSBnaXZlbiB2YWx1ZSBpcyBhIHZhbGlkIG1lYXN1cmVtZW50IHZhbHVlLlxuICovXG5mdW5jdGlvbiBpc01lYXN1cmVtZW50VmFsdWUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWx1ZSk7XG59XG4iLCAiaW1wb3J0IHsgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlciwgaXNJbnN0YW5jZU9mLCBpc01hdGNoaW5nUGF0dGVybiB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBTcGFuIH0gZnJvbSAnLi4vc3Bhbic7XG5pbXBvcnQgeyBTcGFuU3RhdHVzIH0gZnJvbSAnLi4vc3BhbnN0YXR1cyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVUcmFuc2FjdGlvbiwgaGFzVHJhY2luZ0VuYWJsZWQgfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RSQUNJTkdfT1JJR0lOUyA9IFsnbG9jYWxob3N0JywgL15cXC8vXTtcblxuLyoqIE9wdGlvbnMgZm9yIFJlcXVlc3QgSW5zdHJ1bWVudGF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIExpc3Qgb2Ygc3RyaW5ncyAvIHJlZ2V4IHdoZXJlIHRoZSBpbnRlZ3JhdGlvbiBzaG91bGQgY3JlYXRlIFNwYW5zIG91dCBvZi4gQWRkaXRpb25hbGx5IHRoaXMgd2lsbCBiZSB1c2VkXG4gICAqIHRvIGRlZmluZSB3aGljaCBvdXRnb2luZyByZXF1ZXN0cyB0aGUgYHNlbnRyeS10cmFjZWAgaGVhZGVyIHdpbGwgYmUgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqIERlZmF1bHQ6IFsnbG9jYWxob3N0JywgL15cXC8vXSB7QHNlZSBERUZBVUxUX1RSQUNJTkdfT1JJR0lOU31cbiAgICovXG4gIHRyYWNpbmdPcmlnaW5zOiBBcnJheTxzdHJpbmcgfCBSZWdFeHA+O1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGRpc2FibGUgcGF0Y2hpbmcgYWxsIHRvZ2V0aGVyIGZvciBmZXRjaCByZXF1ZXN0cy5cbiAgICpcbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgdHJhY2VGZXRjaDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRmxhZyB0byBkaXNhYmxlIHBhdGNoaW5nIGFsbCB0b2dldGhlciBmb3IgeGhyIHJlcXVlc3RzLlxuICAgKlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICB0cmFjZVhIUjogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgY3JlYXRpbmcgYSBzcGFuIGZvciBhIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gdXJsLlxuICAgKiBSZXR1cm4gZmFsc2UgaWYgeW91IGRvbid0IHdhbnQgYSBzcGFuIGZvciB0aGUgZ2l2ZW4gdXJsLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0IGl0IHVzZXMgdGhlIGB0cmFjaW5nT3JpZ2luc2Agb3B0aW9ucyBhcyBhIHVybCBtYXRjaC5cbiAgICovXG4gIHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0Pyh1cmw6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbi8qKiBEYXRhIHJldHVybmVkIGZyb20gZmV0Y2ggY2FsbGJhY2sgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hEYXRhIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgYXJnczogYW55W107IC8vIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBmZXRjaCBjYWxsIGl0c2VsZlxuICBmZXRjaERhdGE/OiB7XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLy8gc3Bhbl9pZFxuICAgIF9fc3Bhbj86IHN0cmluZztcbiAgfTtcblxuICAvLyBUT0RPIFNob3VsZCB0aGlzIGJlIHVua25vd24gaW5zdGVhZD8gSWYgd2UgdmVuZG9yIHR5cGVzLCBtYWtlIGl0IGEgUmVzcG9uc2VcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcmVzcG9uc2U/OiBhbnk7XG4gIGVycm9yPzogdW5rbm93bjtcblxuICBzdGFydFRpbWVzdGFtcDogbnVtYmVyO1xuICBlbmRUaW1lc3RhbXA/OiBudW1iZXI7XG59XG5cbi8qKiBEYXRhIHJldHVybmVkIGZyb20gWEhSIHJlcXVlc3QgKi9cbmV4cG9ydCBpbnRlcmZhY2UgWEhSRGF0YSB7XG4gIHhocj86IHtcbiAgICBfX3NlbnRyeV94aHJfXz86IHtcbiAgICAgIG1ldGhvZDogc3RyaW5nO1xuICAgICAgdXJsOiBzdHJpbmc7XG4gICAgICBzdGF0dXNfY29kZTogbnVtYmVyO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgfTtcbiAgICBfX3NlbnRyeV94aHJfc3Bhbl9pZF9fPzogc3RyaW5nO1xuICAgIHNldFJlcXVlc3RIZWFkZXI/OiAoa2V5OiBzdHJpbmcsIHZhbDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIF9fc2VudHJ5X293bl9yZXF1ZXN0X18/OiBib29sZWFuO1xuICB9O1xuICBzdGFydFRpbWVzdGFtcDogbnVtYmVyO1xuICBlbmRUaW1lc3RhbXA/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnM6IFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zID0ge1xuICB0cmFjZUZldGNoOiB0cnVlLFxuICB0cmFjZVhIUjogdHJ1ZSxcbiAgdHJhY2luZ09yaWdpbnM6IERFRkFVTFRfVFJBQ0lOR19PUklHSU5TLFxufTtcblxuLyoqIFJlZ2lzdGVycyBzcGFuIGNyZWF0b3JzIGZvciB4aHIgYW5kIGZldGNoIHJlcXVlc3RzICAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydW1lbnRPdXRnb2luZ1JlcXVlc3RzKF9vcHRpb25zPzogUGFydGlhbDxSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucz4pOiB2b2lkIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICBjb25zdCB7IHRyYWNlRmV0Y2gsIHRyYWNlWEhSLCB0cmFjaW5nT3JpZ2lucywgc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3QgfSA9IHtcbiAgICAuLi5kZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMsXG4gICAgLi4uX29wdGlvbnMsXG4gIH07XG5cbiAgLy8gV2Ugc2hvdWxkIGNhY2hlIHVybCAtPiBkZWNpc2lvbiBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gY29tcHV0ZVxuICAvLyByZWdleHAgZXZlcnl0aW1lIHdlIGNyZWF0ZSBhIHJlcXVlc3QuXG4gIGNvbnN0IHVybE1hcDogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblxuICBjb25zdCBkZWZhdWx0U2hvdWxkQ3JlYXRlU3BhbiA9ICh1cmw6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICAgIGlmICh1cmxNYXBbdXJsXSkge1xuICAgICAgcmV0dXJuIHVybE1hcFt1cmxdO1xuICAgIH1cbiAgICBjb25zdCBvcmlnaW5zID0gdHJhY2luZ09yaWdpbnM7XG4gICAgdXJsTWFwW3VybF0gPVxuICAgICAgb3JpZ2lucy5zb21lKChvcmlnaW46IHN0cmluZyB8IFJlZ0V4cCkgPT4gaXNNYXRjaGluZ1BhdHRlcm4odXJsLCBvcmlnaW4pKSAmJlxuICAgICAgIWlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgJ3NlbnRyeV9rZXknKTtcbiAgICByZXR1cm4gdXJsTWFwW3VybF07XG4gIH07XG5cbiAgLy8gV2Ugd2FudCB0aGF0IG91ciB1c2VycyBkb24ndCBoYXZlIHRvIHJlLWltcGxlbWVudCBzaG91bGRDcmVhdGVTcGFuRm9yUmVxdWVzdCB0aGVtc2VsdmVzXG4gIC8vIFRoYXQncyB3aHkgd2UgZmlsdGVyIG91dCBhbHJlYWR5IHVud2FudGVkIFNwYW5zIGZyb20gdHJhY2luZ09yaWdpbnNcbiAgbGV0IHNob3VsZENyZWF0ZVNwYW4gPSBkZWZhdWx0U2hvdWxkQ3JlYXRlU3BhbjtcbiAgaWYgKHR5cGVvZiBzaG91bGRDcmVhdGVTcGFuRm9yUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNob3VsZENyZWF0ZVNwYW4gPSAodXJsOiBzdHJpbmcpID0+IHtcbiAgICAgIHJldHVybiBkZWZhdWx0U2hvdWxkQ3JlYXRlU3Bhbih1cmwpICYmIHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0KHVybCk7XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHNwYW5zOiBSZWNvcmQ8c3RyaW5nLCBTcGFuPiA9IHt9O1xuXG4gIGlmICh0cmFjZUZldGNoKSB7XG4gICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICBjYWxsYmFjazogKGhhbmRsZXJEYXRhOiBGZXRjaERhdGEpID0+IHtcbiAgICAgICAgZmV0Y2hDYWxsYmFjayhoYW5kbGVyRGF0YSwgc2hvdWxkQ3JlYXRlU3Bhbiwgc3BhbnMpO1xuICAgICAgfSxcbiAgICAgIHR5cGU6ICdmZXRjaCcsXG4gICAgfSk7XG4gIH1cblxuICBpZiAodHJhY2VYSFIpIHtcbiAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgIGNhbGxiYWNrOiAoaGFuZGxlckRhdGE6IFhIUkRhdGEpID0+IHtcbiAgICAgICAgeGhyQ2FsbGJhY2soaGFuZGxlckRhdGEsIHNob3VsZENyZWF0ZVNwYW4sIHNwYW5zKTtcbiAgICAgIH0sXG4gICAgICB0eXBlOiAneGhyJyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgdHJhY2sgZmV0Y2ggcmVxdWVzdCBzcGFuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmV0Y2hDYWxsYmFjayhcbiAgaGFuZGxlckRhdGE6IEZldGNoRGF0YSxcbiAgc2hvdWxkQ3JlYXRlU3BhbjogKHVybDogc3RyaW5nKSA9PiBib29sZWFuLFxuICBzcGFuczogUmVjb3JkPHN0cmluZywgU3Bhbj4sXG4pOiB2b2lkIHtcbiAgaWYgKCFoYXNUcmFjaW5nRW5hYmxlZCgpIHx8ICEoaGFuZGxlckRhdGEuZmV0Y2hEYXRhICYmIHNob3VsZENyZWF0ZVNwYW4oaGFuZGxlckRhdGEuZmV0Y2hEYXRhLnVybCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhbmRsZXJEYXRhLmVuZFRpbWVzdGFtcCAmJiBoYW5kbGVyRGF0YS5mZXRjaERhdGEuX19zcGFuKSB7XG4gICAgY29uc3Qgc3BhbiA9IHNwYW5zW2hhbmRsZXJEYXRhLmZldGNoRGF0YS5fX3NwYW5dO1xuICAgIGlmIChzcGFuKSB7XG4gICAgICBpZiAoaGFuZGxlckRhdGEucmVzcG9uc2UpIHtcbiAgICAgICAgLy8gVE9ETyAoa21jbGIpIHJlbW92ZSB0aGlzIG9uY2UgdHlwZXMgUFIgZ29lcyB0aHJvdWdoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgc3Bhbi5zZXRIdHRwU3RhdHVzKGhhbmRsZXJEYXRhLnJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICB9IGVsc2UgaWYgKGhhbmRsZXJEYXRhLmVycm9yKSB7XG4gICAgICAgIHNwYW4uc2V0U3RhdHVzKFNwYW5TdGF0dXMuSW50ZXJuYWxFcnJvcik7XG4gICAgICB9XG4gICAgICBzcGFuLmZpbmlzaCgpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc3BhbnNbaGFuZGxlckRhdGEuZmV0Y2hEYXRhLl9fc3Bhbl07XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZVRyYW5zYWN0aW9uID0gZ2V0QWN0aXZlVHJhbnNhY3Rpb24oKTtcbiAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgY29uc3Qgc3BhbiA9IGFjdGl2ZVRyYW5zYWN0aW9uLnN0YXJ0Q2hpbGQoe1xuICAgICAgZGF0YToge1xuICAgICAgICAuLi5oYW5kbGVyRGF0YS5mZXRjaERhdGEsXG4gICAgICAgIHR5cGU6ICdmZXRjaCcsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IGAke2hhbmRsZXJEYXRhLmZldGNoRGF0YS5tZXRob2R9ICR7aGFuZGxlckRhdGEuZmV0Y2hEYXRhLnVybH1gLFxuICAgICAgb3A6ICdodHRwLmNsaWVudCcsXG4gICAgfSk7XG5cbiAgICBoYW5kbGVyRGF0YS5mZXRjaERhdGEuX19zcGFuID0gc3Bhbi5zcGFuSWQ7XG4gICAgc3BhbnNbc3Bhbi5zcGFuSWRdID0gc3BhbjtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSAoaGFuZGxlckRhdGEuYXJnc1swXSA9IGhhbmRsZXJEYXRhLmFyZ3NbMF0gYXMgc3RyaW5nIHwgUmVxdWVzdCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBjb25zdCBvcHRpb25zID0gKGhhbmRsZXJEYXRhLmFyZ3NbMV0gPSAoaGFuZGxlckRhdGEuYXJnc1sxXSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB8fCB7fSk7XG4gICAgbGV0IGhlYWRlcnMgPSBvcHRpb25zLmhlYWRlcnM7XG4gICAgaWYgKGlzSW5zdGFuY2VPZihyZXF1ZXN0LCBSZXF1ZXN0KSkge1xuICAgICAgaGVhZGVycyA9IChyZXF1ZXN0IGFzIFJlcXVlc3QpLmhlYWRlcnM7XG4gICAgfVxuICAgIGlmIChoZWFkZXJzKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICBpZiAodHlwZW9mIGhlYWRlcnMuYXBwZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgaGVhZGVycy5hcHBlbmQoJ3NlbnRyeS10cmFjZScsIHNwYW4udG9UcmFjZXBhcmVudCgpKTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShoZWFkZXJzKSkge1xuICAgICAgICBoZWFkZXJzID0gWy4uLmhlYWRlcnMsIFsnc2VudHJ5LXRyYWNlJywgc3Bhbi50b1RyYWNlcGFyZW50KCldXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlYWRlcnMgPSB7IC4uLmhlYWRlcnMsICdzZW50cnktdHJhY2UnOiBzcGFuLnRvVHJhY2VwYXJlbnQoKSB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXJzID0geyAnc2VudHJ5LXRyYWNlJzogc3Bhbi50b1RyYWNlcGFyZW50KCkgfTtcbiAgICB9XG4gICAgb3B0aW9ucy5oZWFkZXJzID0gaGVhZGVycztcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhbmQgdHJhY2sgeGhyIHJlcXVlc3Qgc3BhbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHhockNhbGxiYWNrKFxuICBoYW5kbGVyRGF0YTogWEhSRGF0YSxcbiAgc2hvdWxkQ3JlYXRlU3BhbjogKHVybDogc3RyaW5nKSA9PiBib29sZWFuLFxuICBzcGFuczogUmVjb3JkPHN0cmluZywgU3Bhbj4sXG4pOiB2b2lkIHtcbiAgaWYgKFxuICAgICFoYXNUcmFjaW5nRW5hYmxlZCgpIHx8XG4gICAgaGFuZGxlckRhdGEueGhyPy5fX3NlbnRyeV9vd25fcmVxdWVzdF9fIHx8XG4gICAgIShoYW5kbGVyRGF0YS54aHI/Ll9fc2VudHJ5X3hocl9fICYmIHNob3VsZENyZWF0ZVNwYW4oaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9fLnVybCkpXG4gICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHhociA9IGhhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV94aHJfXztcblxuICAvLyBjaGVjayBmaXJzdCBpZiB0aGUgcmVxdWVzdCBoYXMgZmluaXNoZWQgYW5kIGlzIHRyYWNrZWQgYnkgYW4gZXhpc3Rpbmcgc3BhbiB3aGljaCBzaG91bGQgbm93IGVuZFxuICBpZiAoaGFuZGxlckRhdGEuZW5kVGltZXN0YW1wICYmIGhhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV94aHJfc3Bhbl9pZF9fKSB7XG4gICAgY29uc3Qgc3BhbiA9IHNwYW5zW2hhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV94aHJfc3Bhbl9pZF9fXTtcbiAgICBpZiAoc3Bhbikge1xuICAgICAgc3Bhbi5zZXRIdHRwU3RhdHVzKHhoci5zdGF0dXNfY29kZSk7XG4gICAgICBzcGFuLmZpbmlzaCgpO1xuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWR5bmFtaWMtZGVsZXRlXG4gICAgICBkZWxldGUgc3BhbnNbaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX19dO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBpZiBub3QsIGNyZWF0ZSBhIG5ldyBzcGFuIHRvIHRyYWNrIGl0XG4gIGNvbnN0IGFjdGl2ZVRyYW5zYWN0aW9uID0gZ2V0QWN0aXZlVHJhbnNhY3Rpb24oKTtcbiAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgY29uc3Qgc3BhbiA9IGFjdGl2ZVRyYW5zYWN0aW9uLnN0YXJ0Q2hpbGQoe1xuICAgICAgZGF0YToge1xuICAgICAgICAuLi54aHIuZGF0YSxcbiAgICAgICAgdHlwZTogJ3hocicsXG4gICAgICAgIG1ldGhvZDogeGhyLm1ldGhvZCxcbiAgICAgICAgdXJsOiB4aHIudXJsLFxuICAgICAgfSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgJHt4aHIubWV0aG9kfSAke3hoci51cmx9YCxcbiAgICAgIG9wOiAnaHR0cC5jbGllbnQnLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX18gPSBzcGFuLnNwYW5JZDtcbiAgICBzcGFuc1toYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX3NwYW5faWRfX10gPSBzcGFuO1xuXG4gICAgaWYgKGhhbmRsZXJEYXRhLnhoci5zZXRSZXF1ZXN0SGVhZGVyKSB7XG4gICAgICB0cnkge1xuICAgICAgICBoYW5kbGVyRGF0YS54aHIuc2V0UmVxdWVzdEhlYWRlcignc2VudHJ5LXRyYWNlJywgc3Bhbi50b1RyYWNlcGFyZW50KCkpO1xuICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAvLyBFcnJvcjogSW52YWxpZFN0YXRlRXJyb3I6IEZhaWxlZCB0byBleGVjdXRlICdzZXRSZXF1ZXN0SGVhZGVyJyBvbiAnWE1MSHR0cFJlcXVlc3QnOiBUaGUgb2JqZWN0J3Mgc3RhdGUgbXVzdCBiZSBPUEVORUQuXG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uQ29udGV4dCB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlciwgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcblxuLyoqXG4gKiBEZWZhdWx0IGZ1bmN0aW9uIGltcGxlbWVudGluZyBwYWdlbG9hZCBhbmQgbmF2aWdhdGlvbiB0cmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydW1lbnRSb3V0aW5nV2l0aERlZmF1bHRzPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbj4oXG4gIGN1c3RvbVN0YXJ0VHJhbnNhY3Rpb246IChjb250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQpID0+IFQgfCB1bmRlZmluZWQsXG4gIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkOiBib29sZWFuID0gdHJ1ZSxcbiAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2U6IGJvb2xlYW4gPSB0cnVlLFxuKTogdm9pZCB7XG4gIGlmICghZ2xvYmFsIHx8ICFnbG9iYWwubG9jYXRpb24pIHtcbiAgICBsb2dnZXIud2FybignQ291bGQgbm90IGluaXRpYWxpemUgcm91dGluZyBpbnN0cnVtZW50YXRpb24gZHVlIHRvIGludmFsaWQgbG9jYXRpb24nKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBsZXQgc3RhcnRpbmdVcmw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGdsb2JhbC5sb2NhdGlvbi5ocmVmO1xuXG4gIGxldCBhY3RpdmVUcmFuc2FjdGlvbjogVCB8IHVuZGVmaW5lZDtcbiAgaWYgKHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkKSB7XG4gICAgYWN0aXZlVHJhbnNhY3Rpb24gPSBjdXN0b21TdGFydFRyYW5zYWN0aW9uKHsgbmFtZTogZ2xvYmFsLmxvY2F0aW9uLnBhdGhuYW1lLCBvcDogJ3BhZ2Vsb2FkJyB9KTtcbiAgfVxuXG4gIGlmIChzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSkge1xuICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgY2FsbGJhY2s6ICh7IHRvLCBmcm9tIH06IHsgdG86IHN0cmluZzsgZnJvbT86IHN0cmluZyB9KSA9PiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVhcmx5IHJldHVybiBpcyB0aGVyZSB0byBhY2NvdW50IGZvciBzb21lIGNhc2VzIHdoZXJlIGEgbmF2aWdhdGlvbiB0cmFuc2FjdGlvbiBzdGFydHMgcmlnaHQgYWZ0ZXJcbiAgICAgICAgICogbG9uZy1ydW5uaW5nIHBhZ2Vsb2FkLiBXZSBtYWtlIHN1cmUgdGhhdCBpZiBgZnJvbWAgaXMgdW5kZWZpbmVkIGFuZCBhIHZhbGlkIGBzdGFydGluZ1VSTGAgZXhpc3RzLCB3ZSBkb24ndFxuICAgICAgICAgKiBjcmVhdGUgYW4gdW5lY2Nlc3NhcnkgbmF2aWdhdGlvbiB0cmFuc2FjdGlvbi5cbiAgICAgICAgICpcbiAgICAgICAgICogVGhpcyB3YXMgaGFyZCB0byBkdXBsaWNhdGUsIGJ1dCB0aGlzIGJlaGF2aW9yIHN0b3BwZWQgYXMgc29vbiBhcyB0aGlzIGZpeCB3YXMgYXBwbGllZC4gVGhpcyBpc3N1ZSBtaWdodCBhbHNvXG4gICAgICAgICAqIG9ubHkgYmUgY2F1c2VkIGluIGNlcnRhaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzIHdoZXJlIHRoZSB1c2FnZSBvZiBhIGhvdCBtb2R1bGUgcmVsb2FkZXIgaXMgY2F1c2luZ1xuICAgICAgICAgKiBlcnJvcnMuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoZnJvbSA9PT0gdW5kZWZpbmVkICYmIHN0YXJ0aW5nVXJsICYmIHN0YXJ0aW5nVXJsLmluZGV4T2YodG8pICE9PSAtMSkge1xuICAgICAgICAgIHN0YXJ0aW5nVXJsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmcm9tICE9PSB0bykge1xuICAgICAgICAgIHN0YXJ0aW5nVXJsID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChhY3RpdmVUcmFuc2FjdGlvbikge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhgW1RyYWNpbmddIEZpbmlzaGluZyBjdXJyZW50IHRyYW5zYWN0aW9uIHdpdGggb3A6ICR7YWN0aXZlVHJhbnNhY3Rpb24ub3B9YCk7XG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIG9wZW4gdHJhbnNhY3Rpb24gb24gdGhlIHNjb3BlLCB3ZSBuZWVkIHRvIGZpbmlzaCBpdCBiZWZvcmUgY3JlYXRpbmcgYW4gbmV3IG9uZS5cbiAgICAgICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uLmZpbmlzaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbiA9IGN1c3RvbVN0YXJ0VHJhbnNhY3Rpb24oeyBuYW1lOiBnbG9iYWwubG9jYXRpb24ucGF0aG5hbWUsIG9wOiAnbmF2aWdhdGlvbicgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB0eXBlOiAnaGlzdG9yeScsXG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBFdmVudFByb2Nlc3NvciwgSW50ZWdyYXRpb24sIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkNvbnRleHQgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IHN0YXJ0SWRsZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaHViZXh0ZW5zaW9ucyc7XG5pbXBvcnQgeyBERUZBVUxUX0lETEVfVElNRU9VVCwgSWRsZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vaWRsZXRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuLi9zcGFuc3RhdHVzJztcbmltcG9ydCB7IGV4dHJhY3RUcmFjZXBhcmVudERhdGEsIHNlY1RvTXMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyByZWdpc3RlckJhY2tncm91bmRUYWJEZXRlY3Rpb24gfSBmcm9tICcuL2JhY2tncm91bmR0YWInO1xuaW1wb3J0IHsgTWV0cmljc0luc3RydW1lbnRhdGlvbiB9IGZyb20gJy4vbWV0cmljcyc7XG5pbXBvcnQge1xuICBkZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMsXG4gIGluc3RydW1lbnRPdXRnb2luZ1JlcXVlc3RzLFxuICBSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbn0gZnJvbSAnLi9yZXF1ZXN0JztcbmltcG9ydCB7IGluc3RydW1lbnRSb3V0aW5nV2l0aERlZmF1bHRzIH0gZnJvbSAnLi9yb3V0ZXInO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9NQVhfVFJBTlNBQ1RJT05fRFVSQVRJT05fU0VDT05EUyA9IDYwMDtcblxuLyoqIE9wdGlvbnMgZm9yIEJyb3dzZXIgVHJhY2luZyBpbnRlZ3JhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcm93c2VyVHJhY2luZ09wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdGltZSB0byB3YWl0IGluIG1zIHVudGlsIHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIGZpbmlzaGVkLiBUaGUgdHJhbnNhY3Rpb24gd2lsbCB1c2UgdGhlIGVuZCB0aW1lc3RhbXAgb2ZcbiAgICogdGhlIGxhc3QgZmluaXNoZWQgc3BhbiBhcyB0aGUgZW5kdGltZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgKiBUaW1lIGlzIGluIG1zLlxuICAgKlxuICAgKiBEZWZhdWx0OiAxMDAwXG4gICAqL1xuICBpZGxlVGltZW91dDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGVuYWJsZS9kaXNhYmxlIGNyZWF0aW9uIG9mIGBuYXZpZ2F0aW9uYCB0cmFuc2FjdGlvbiBvbiBoaXN0b3J5IGNoYW5nZXMuXG4gICAqXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGVuYWJsZS9kaXNhYmxlIGNyZWF0aW9uIG9mIGBwYWdlbG9hZGAgdHJhbnNhY3Rpb24gb24gZmlyc3QgcGFnZWxvYWQuXG4gICAqXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBkdXJhdGlvbiBvZiBhIHRyYW5zYWN0aW9uIGJlZm9yZSBpdCB3aWxsIGJlIG1hcmtlZCBhcyBcImRlYWRsaW5lX2V4Y2VlZGVkXCIuXG4gICAqIElmIHlvdSBuZXZlciB3YW50IHRvIG1hcmsgYSB0cmFuc2FjdGlvbiBzZXQgaXQgdG8gMC5cbiAgICogVGltZSBpcyBpbiBzZWNvbmRzLlxuICAgKlxuICAgKiBEZWZhdWx0OiA2MDBcbiAgICovXG4gIG1heFRyYW5zYWN0aW9uRHVyYXRpb246IG51bWJlcjtcblxuICAvKipcbiAgICogRmxhZyBUcmFuc2FjdGlvbnMgd2hlcmUgdGFicyBtb3ZlZCB0byBiYWNrZ3JvdW5kIHdpdGggXCJjYW5jZWxsZWRcIi4gQnJvd3NlciBiYWNrZ3JvdW5kIHRhYiB0aW1pbmcgaXNcbiAgICogbm90IHN1aXRlZCB0b3dhcmRzIGRvaW5nIHByZWNpc2UgbWVhc3VyZW1lbnRzIG9mIG9wZXJhdGlvbnMuIEJ5IGRlZmF1bHQsIHdlIHJlY29tbWVuZCB0aGF0IHRoaXMgb3B0aW9uXG4gICAqIGJlIGVuYWJsZWQgYXMgYmFja2dyb3VuZCB0cmFuc2FjdGlvbnMgY2FuIG1lc3MgdXAgeW91ciBzdGF0aXN0aWNzIGluIG5vbmRldGVybWluaXN0aWMgd2F5cy5cbiAgICpcbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgbWFya0JhY2tncm91bmRUcmFuc2FjdGlvbnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIF9tZXRyaWNPcHRpb25zIGFsbG93cyB0aGUgdXNlciB0byBzZW5kIG9wdGlvbnMgdG8gY2hhbmdlIGhvdyBtZXRyaWNzIGFyZSBjb2xsZWN0ZWQuXG4gICAqXG4gICAqIF9tZXRyaWNPcHRpb25zIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwuXG4gICAqXG4gICAqIERlZmF1bHQ6IHVuZGVmaW5lZFxuICAgKi9cbiAgX21ldHJpY09wdGlvbnM/OiBQYXJ0aWFsPHsgX3JlcG9ydEFsbENoYW5nZXM6IGJvb2xlYW4gfT47XG5cbiAgLyoqXG4gICAqIGJlZm9yZU5hdmlnYXRlIGlzIGNhbGxlZCBiZWZvcmUgYSBwYWdlbG9hZC9uYXZpZ2F0aW9uIHRyYW5zYWN0aW9uIGlzIGNyZWF0ZWQgYW5kIGFsbG93cyB1c2VycyB0byBtb2RpZnkgdHJhbnNhY3Rpb25cbiAgICogY29udGV4dCBkYXRhLCBvciBkcm9wIHRoZSB0cmFuc2FjdGlvbiBlbnRpcmVseSAoYnkgc2V0dGluZyBgc2FtcGxlZCA9IGZhbHNlYCBpbiB0aGUgY29udGV4dCkuXG4gICAqXG4gICAqIE5vdGU6IEZvciBsZWdhY3kgcmVhc29ucywgdHJhbnNhY3Rpb25zIGNhbiBhbHNvIGJlIGRyb3BwZWQgYnkgcmV0dXJuaW5nIGB1bmRlZmluZWRgLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dDogVGhlIGNvbnRleHQgZGF0YSB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBgc3RhcnRUcmFuc2FjdGlvbmAgYnkgZGVmYXVsdFxuICAgKlxuICAgKiBAcmV0dXJucyBBIChwb3RlbnRpYWxseSkgbW9kaWZpZWQgY29udGV4dCBvYmplY3QsIHdpdGggYHNhbXBsZWQgPSBmYWxzZWAgaWYgdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBkcm9wcGVkLlxuICAgKi9cbiAgYmVmb3JlTmF2aWdhdGU/KGNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCk6IFRyYW5zYWN0aW9uQ29udGV4dCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSW5zdHJ1bWVudGF0aW9uIHRoYXQgY3JlYXRlcyByb3V0aW5nIGNoYW5nZSB0cmFuc2FjdGlvbnMuIEJ5IGRlZmF1bHQgY3JlYXRlc1xuICAgKiBwYWdlbG9hZCBhbmQgbmF2aWdhdGlvbiB0cmFuc2FjdGlvbnMuXG4gICAqL1xuICByb3V0aW5nSW5zdHJ1bWVudGF0aW9uPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbj4oXG4gICAgY3VzdG9tU3RhcnRUcmFuc2FjdGlvbjogKGNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCxcbiAgICBzdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZD86IGJvb2xlYW4sXG4gICAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2U/OiBib29sZWFuLFxuICApOiB2b2lkO1xufVxuXG5jb25zdCBERUZBVUxUX0JST1dTRVJfVFJBQ0lOR19PUFRJT05TID0ge1xuICBpZGxlVGltZW91dDogREVGQVVMVF9JRExFX1RJTUVPVVQsXG4gIG1hcmtCYWNrZ3JvdW5kVHJhbnNhY3Rpb25zOiB0cnVlLFxuICBtYXhUcmFuc2FjdGlvbkR1cmF0aW9uOiBERUZBVUxUX01BWF9UUkFOU0FDVElPTl9EVVJBVElPTl9TRUNPTkRTLFxuICByb3V0aW5nSW5zdHJ1bWVudGF0aW9uOiBpbnN0cnVtZW50Um91dGluZ1dpdGhEZWZhdWx0cyxcbiAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2U6IHRydWUsXG4gIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkOiB0cnVlLFxuICAuLi5kZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMsXG59O1xuXG4vKipcbiAqIFRoZSBCcm93c2VyIFRyYWNpbmcgaW50ZWdyYXRpb24gYXV0b21hdGljYWxseSBpbnN0cnVtZW50cyBicm93c2VyIHBhZ2Vsb2FkL25hdmlnYXRpb25cbiAqIGFjdGlvbnMgYXMgdHJhbnNhY3Rpb25zLCBhbmQgY2FwdHVyZXMgcmVxdWVzdHMsIG1ldHJpY3MgYW5kIGVycm9ycyBhcyBzcGFucy5cbiAqXG4gKiBUaGUgaW50ZWdyYXRpb24gY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIHZhcmlldHkgb2Ygb3B0aW9ucywgYW5kIGNhbiBiZSBleHRlbmRlZCB0byB1c2VcbiAqIGFueSByb3V0aW5nIGxpYnJhcnkuIFRoaXMgaW50ZWdyYXRpb24gdXNlcyB7QHNlZSBJZGxlVHJhbnNhY3Rpb259IHRvIGNyZWF0ZSB0cmFuc2FjdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCcm93c2VyVHJhY2luZyBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnQnJvd3NlclRyYWNpbmcnO1xuXG4gIC8qKiBCcm93c2VyIFRyYWNpbmcgaW50ZWdyYXRpb24gb3B0aW9ucyAqL1xuICBwdWJsaWMgb3B0aW9uczogQnJvd3NlclRyYWNpbmdPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IEJyb3dzZXJUcmFjaW5nLmlkO1xuXG4gIHByaXZhdGUgX2dldEN1cnJlbnRIdWI/OiAoKSA9PiBIdWI7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbWV0cmljczogTWV0cmljc0luc3RydW1lbnRhdGlvbjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9lbWl0T3B0aW9uc1dhcm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogU3RvcmUgY29uZmlndXJlZCBpZGxlIHRpbWVvdXQgc28gdGhhdCBpdCBjYW4gYmUgYWRkZWQgYXMgYSB0YWcgdG8gdHJhbnNhY3Rpb25zICovXG4gIHByaXZhdGUgX2NvbmZpZ3VyZWRJZGxlVGltZW91dDogQnJvd3NlclRyYWNpbmdPcHRpb25zWydpZGxlVGltZW91dCddIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihfb3B0aW9ucz86IFBhcnRpYWw8QnJvd3NlclRyYWNpbmdPcHRpb25zPikge1xuICAgIGxldCB0cmFjaW5nT3JpZ2lucyA9IGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucy50cmFjaW5nT3JpZ2lucztcbiAgICAvLyBOT1RFOiBMb2dnZXIgZG9lc24ndCB3b3JrIGluIGNvbnN0cnVjdG9ycywgYXMgaXQncyBpbml0aWFsaXplZCBhZnRlciBpbnRlZ3JhdGlvbnMgaW5zdGFuY2VzXG4gICAgaWYgKF9vcHRpb25zKSB7XG4gICAgICB0aGlzLl9jb25maWd1cmVkSWRsZVRpbWVvdXQgPSBfb3B0aW9ucy5pZGxlVGltZW91dDtcbiAgICAgIGlmIChfb3B0aW9ucy50cmFjaW5nT3JpZ2lucyAmJiBBcnJheS5pc0FycmF5KF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zKSAmJiBfb3B0aW9ucy50cmFjaW5nT3JpZ2lucy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgdHJhY2luZ09yaWdpbnMgPSBfb3B0aW9ucy50cmFjaW5nT3JpZ2lucztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2VtaXRPcHRpb25zV2FybmluZyA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4uREVGQVVMVF9CUk9XU0VSX1RSQUNJTkdfT1BUSU9OUyxcbiAgICAgIC4uLl9vcHRpb25zLFxuICAgICAgdHJhY2luZ09yaWdpbnMsXG4gICAgfTtcblxuICAgIGNvbnN0IHsgX21ldHJpY09wdGlvbnMgfSA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLl9tZXRyaWNzID0gbmV3IE1ldHJpY3NJbnN0cnVtZW50YXRpb24oX21ldHJpY09wdGlvbnMgJiYgX21ldHJpY09wdGlvbnMuX3JlcG9ydEFsbENoYW5nZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKF86IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIHRoaXMuX2dldEN1cnJlbnRIdWIgPSBnZXRDdXJyZW50SHViO1xuXG4gICAgaWYgKHRoaXMuX2VtaXRPcHRpb25zV2FybmluZykge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgICdbVHJhY2luZ10gWW91IG5lZWQgdG8gZGVmaW5lIGB0cmFjaW5nT3JpZ2luc2AgaW4gdGhlIG9wdGlvbnMuIFNldCBhbiBhcnJheSBvZiB1cmxzIG9yIHBhdHRlcm5zIHRvIHRyYWNlLicsXG4gICAgICApO1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbVHJhY2luZ10gV2UgYWRkZWQgYSByZWFzb25hYmxlIGRlZmF1bHQgZm9yIHlvdTogJHtkZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMudHJhY2luZ09yaWdpbnN9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgIGNvbnN0IHtcbiAgICAgIHJvdXRpbmdJbnN0cnVtZW50YXRpb246IGluc3RydW1lbnRSb3V0aW5nLFxuICAgICAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2UsXG4gICAgICBzdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZCxcbiAgICAgIG1hcmtCYWNrZ3JvdW5kVHJhbnNhY3Rpb25zLFxuICAgICAgdHJhY2VGZXRjaCxcbiAgICAgIHRyYWNlWEhSLFxuICAgICAgdHJhY2luZ09yaWdpbnMsXG4gICAgICBzaG91bGRDcmVhdGVTcGFuRm9yUmVxdWVzdCxcbiAgICB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgaW5zdHJ1bWVudFJvdXRpbmcoXG4gICAgICAoY29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0KSA9PiB0aGlzLl9jcmVhdGVSb3V0ZVRyYW5zYWN0aW9uKGNvbnRleHQpLFxuICAgICAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQsXG4gICAgICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSxcbiAgICApO1xuXG4gICAgaWYgKG1hcmtCYWNrZ3JvdW5kVHJhbnNhY3Rpb25zKSB7XG4gICAgICByZWdpc3RlckJhY2tncm91bmRUYWJEZXRlY3Rpb24oKTtcbiAgICB9XG5cbiAgICBpbnN0cnVtZW50T3V0Z29pbmdSZXF1ZXN0cyh7IHRyYWNlRmV0Y2gsIHRyYWNlWEhSLCB0cmFjaW5nT3JpZ2lucywgc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3QgfSk7XG4gIH1cblxuICAvKiogQ3JlYXRlIHJvdXRpbmcgaWRsZSB0cmFuc2FjdGlvbi4gKi9cbiAgcHJpdmF0ZSBfY3JlYXRlUm91dGVUcmFuc2FjdGlvbihjb250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQpOiBUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLl9nZXRDdXJyZW50SHViKSB7XG4gICAgICBsb2dnZXIud2FybihgW1RyYWNpbmddIERpZCBub3QgY3JlYXRlICR7Y29udGV4dC5vcH0gdHJhbnNhY3Rpb24gYmVjYXVzZSBfZ2V0Q3VycmVudEh1YiBpcyBpbnZhbGlkLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3QgeyBiZWZvcmVOYXZpZ2F0ZSwgaWRsZVRpbWVvdXQsIG1heFRyYW5zYWN0aW9uRHVyYXRpb24gfSA9IHRoaXMub3B0aW9ucztcblxuICAgIGNvbnN0IHBhcmVudENvbnRleHRGcm9tSGVhZGVyID0gY29udGV4dC5vcCA9PT0gJ3BhZ2Vsb2FkJyA/IGdldEhlYWRlckNvbnRleHQoKSA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGV4cGFuZGVkQ29udGV4dCA9IHtcbiAgICAgIC4uLmNvbnRleHQsXG4gICAgICAuLi5wYXJlbnRDb250ZXh0RnJvbUhlYWRlcixcbiAgICAgIHRyaW1FbmQ6IHRydWUsXG4gICAgfTtcbiAgICBjb25zdCBtb2RpZmllZENvbnRleHQgPSB0eXBlb2YgYmVmb3JlTmF2aWdhdGUgPT09ICdmdW5jdGlvbicgPyBiZWZvcmVOYXZpZ2F0ZShleHBhbmRlZENvbnRleHQpIDogZXhwYW5kZWRDb250ZXh0O1xuXG4gICAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIGJlZm9yZU5hdmlnYXRlIGNhbiByZXR1cm4gdW5kZWZpbmVkIHRvIFwiZHJvcFwiIHRoZSB0cmFuc2FjdGlvbiAocHJldmVudCBpdFxuICAgIC8vIGZyb20gYmVpbmcgc2VudCB0byBTZW50cnkpLlxuICAgIGNvbnN0IGZpbmFsQ29udGV4dCA9IG1vZGlmaWVkQ29udGV4dCA9PT0gdW5kZWZpbmVkID8geyAuLi5leHBhbmRlZENvbnRleHQsIHNhbXBsZWQ6IGZhbHNlIH0gOiBtb2RpZmllZENvbnRleHQ7XG5cbiAgICBpZiAoZmluYWxDb250ZXh0LnNhbXBsZWQgPT09IGZhbHNlKSB7XG4gICAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gV2lsbCBub3Qgc2VuZCAke2ZpbmFsQ29udGV4dC5vcH0gdHJhbnNhY3Rpb24gYmVjYXVzZSBvZiBiZWZvcmVOYXZpZ2F0ZS5gKTtcbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gU3RhcnRpbmcgJHtmaW5hbENvbnRleHQub3B9IHRyYW5zYWN0aW9uIG9uIHNjb3BlYCk7XG5cbiAgICBjb25zdCBodWIgPSB0aGlzLl9nZXRDdXJyZW50SHViKCk7XG4gICAgY29uc3QgeyBsb2NhdGlvbiB9ID0gZ2V0R2xvYmFsT2JqZWN0KCkgYXMgV2luZG93T3JXb3JrZXJHbG9iYWxTY29wZSAmIHsgbG9jYXRpb246IExvY2F0aW9uIH07XG5cbiAgICBjb25zdCBpZGxlVHJhbnNhY3Rpb24gPSBzdGFydElkbGVUcmFuc2FjdGlvbihcbiAgICAgIGh1YixcbiAgICAgIGZpbmFsQ29udGV4dCxcbiAgICAgIGlkbGVUaW1lb3V0LFxuICAgICAgdHJ1ZSxcbiAgICAgIHsgbG9jYXRpb24gfSwgLy8gZm9yIHVzZSBpbiB0aGUgdHJhY2VzU2FtcGxlclxuICAgICk7XG4gICAgaWRsZVRyYW5zYWN0aW9uLnJlZ2lzdGVyQmVmb3JlRmluaXNoQ2FsbGJhY2soKHRyYW5zYWN0aW9uLCBlbmRUaW1lc3RhbXApID0+IHtcbiAgICAgIHRoaXMuX21ldHJpY3MuYWRkUGVyZm9ybWFuY2VFbnRyaWVzKHRyYW5zYWN0aW9uKTtcbiAgICAgIGFkanVzdFRyYW5zYWN0aW9uRHVyYXRpb24oc2VjVG9NcyhtYXhUcmFuc2FjdGlvbkR1cmF0aW9uKSwgdHJhbnNhY3Rpb24sIGVuZFRpbWVzdGFtcCk7XG4gICAgfSk7XG5cbiAgICBpZGxlVHJhbnNhY3Rpb24uc2V0VGFnKCdpZGxlVGltZW91dCcsIHRoaXMuX2NvbmZpZ3VyZWRJZGxlVGltZW91dCk7XG5cbiAgICByZXR1cm4gaWRsZVRyYW5zYWN0aW9uIGFzIFRyYW5zYWN0aW9uO1xuICB9XG59XG5cbi8qKlxuICogR2V0cyB0cmFuc2FjdGlvbiBjb250ZXh0IGZyb20gYSBzZW50cnktdHJhY2UgbWV0YS5cbiAqXG4gKiBAcmV0dXJucyBUcmFuc2FjdGlvbiBjb250ZXh0IGRhdGEgZnJvbSB0aGUgaGVhZGVyIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSdzIG5vIGhlYWRlciBvciB0aGUgaGVhZGVyIGlzIG1hbGZvcm1lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SGVhZGVyQ29udGV4dCgpOiBQYXJ0aWFsPFRyYW5zYWN0aW9uQ29udGV4dD4gfCB1bmRlZmluZWQge1xuICBjb25zdCBoZWFkZXIgPSBnZXRNZXRhQ29udGVudCgnc2VudHJ5LXRyYWNlJyk7XG4gIGlmIChoZWFkZXIpIHtcbiAgICByZXR1cm4gZXh0cmFjdFRyYWNlcGFyZW50RGF0YShoZWFkZXIpO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIFJldHVybnMgdGhlIHZhbHVlIG9mIGEgbWV0YSB0YWcgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXRhQ29udGVudChtZXRhTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGVsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKS5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBtZXRhW25hbWU9JHttZXRhTmFtZX1dYCk7XG4gIHJldHVybiBlbCA/IGVsLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIDogbnVsbDtcbn1cblxuLyoqIEFkanVzdHMgdHJhbnNhY3Rpb24gdmFsdWUgYmFzZWQgb24gbWF4IHRyYW5zYWN0aW9uIGR1cmF0aW9uICovXG5mdW5jdGlvbiBhZGp1c3RUcmFuc2FjdGlvbkR1cmF0aW9uKG1heER1cmF0aW9uOiBudW1iZXIsIHRyYW5zYWN0aW9uOiBJZGxlVHJhbnNhY3Rpb24sIGVuZFRpbWVzdGFtcDogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IGRpZmYgPSBlbmRUaW1lc3RhbXAgLSB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcDtcbiAgY29uc3QgaXNPdXRkYXRlZFRyYW5zYWN0aW9uID0gZW5kVGltZXN0YW1wICYmIChkaWZmID4gbWF4RHVyYXRpb24gfHwgZGlmZiA8IDApO1xuICBpZiAoaXNPdXRkYXRlZFRyYW5zYWN0aW9uKSB7XG4gICAgdHJhbnNhY3Rpb24uc2V0U3RhdHVzKFNwYW5TdGF0dXMuRGVhZGxpbmVFeGNlZWRlZCk7XG4gICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdtYXhUcmFuc2FjdGlvbkR1cmF0aW9uRXhjZWVkZWQnLCAndHJ1ZScpO1xuICB9XG59XG4iLCAiZXhwb3J0IHsgQnJvd3NlclRyYWNpbmcgfSBmcm9tICcuL2Jyb3dzZXJ0cmFjaW5nJztcbmV4cG9ydCB7XG4gIGluc3RydW1lbnRPdXRnb2luZ1JlcXVlc3RzLFxuICBSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbiAgZGVmYXVsdFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLFxufSBmcm9tICcuL3JlcXVlc3QnO1xuIiwgImV4cG9ydCB7IEV4cHJlc3MgfSBmcm9tICcuL25vZGUvZXhwcmVzcyc7XG5leHBvcnQgeyBQb3N0Z3JlcyB9IGZyb20gJy4vbm9kZS9wb3N0Z3Jlcyc7XG5leHBvcnQgeyBNeXNxbCB9IGZyb20gJy4vbm9kZS9teXNxbCc7XG5leHBvcnQgeyBNb25nbyB9IGZyb20gJy4vbm9kZS9tb25nbyc7XG5cbi8vIFRPRE8odjcpOiBSZW1vdmUgdGhpcyBleHBvcnRcbi8vIFBsZWFzZSBzZWUgYHNyYy9pbmRleC50c2AgZm9yIG1vcmUgZGV0YWlscy5cbmV4cG9ydCB7IEJyb3dzZXJUcmFjaW5nIH0gZnJvbSAnLi4vYnJvd3Nlcic7XG4iLCAiaW1wb3J0IHsgYWRkRXh0ZW5zaW9uTWV0aG9kcyB9IGZyb20gJy4vaHViZXh0ZW5zaW9ucyc7XG5pbXBvcnQgKiBhcyBJbnRlZ3JhdGlvbnMgZnJvbSAnLi9pbnRlZ3JhdGlvbnMnO1xuXG5leHBvcnQgeyBJbnRlZ3JhdGlvbnMgfTtcblxuLy8gVGhpcyBpcyBhbHJlYWR5IGV4cG9ydGVkIGFzIHBhcnQgb2YgYEludGVncmF0aW9uc2AgYWJvdmUgKGFuZCBmb3IgdGhlIG1vbWVudCB3aWxsIHJlbWFpbiBzbyBmb3Jcbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KSwgYnV0IHRoYXQgaW50ZXJmZXJlcyB3aXRoIHRyZWVzaGFraW5nLCBzbyB3ZSBhbHNvIGV4cG9ydCBpdCBzZXBhcmF0ZWx5XG4vLyBoZXJlLlxuLy9cbi8vIFByZXZpb3VzbHkgd2UgZXhwZWN0ZWQgdXNlcnMgdG8gaW1wb3J0IHRyYWNpbmcgaW50ZWdyYXRpb25zIGxpa2Vcbi8vXG4vLyBpbXBvcnQgeyBJbnRlZ3JhdGlvbnMgfSBmcm9tICdAc2VudHJ5L3RyYWNpbmcnO1xuLy8gY29uc3QgaW5zdGFuY2UgPSBuZXcgSW50ZWdyYXRpb25zLkJyb3dzZXJUcmFjaW5nKCk7XG4vL1xuLy8gVGhpcyBtYWtlcyB0aGUgaW50ZWdyYXRpb25zIHVuYWJsZSB0byBiZSB0cmVlc2hha2VuIHRob3VnaC4gVG8gYWRkcmVzcyB0aGlzLCB3ZSBub3cgaGF2ZVxuLy8gdGhpcyBpbmRpdmlkdWFsIGV4cG9ydC4gV2Ugbm93IGV4cGVjdCB1c2VycyB0byBjb25zdW1lIEJyb3dzZXJUcmFjaW5nIGxpa2Ugc286XG4vL1xuLy8gaW1wb3J0IHsgQnJvd3NlclRyYWNpbmcgfSBmcm9tICdAc2VudHJ5L3RyYWNpbmcnO1xuLy8gY29uc3QgaW5zdGFuY2UgPSBuZXcgQnJvd3NlclRyYWNpbmcoKTtcbi8vXG4vLyBGb3IgYW4gZXhhbXBsZSBvZiBvZiB0aGUgbmV3IHVzYWdlIG9mIEJyb3dzZXJUcmFjaW5nLCBzZWUgQHNlbnRyeS9uZXh0anMgaW5kZXguY2xpZW50LnRzXG5leHBvcnQgeyBCcm93c2VyVHJhY2luZyB9IGZyb20gJy4vYnJvd3Nlcic7XG5cbmV4cG9ydCB7IFNwYW4gfSBmcm9tICcuL3NwYW4nO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmV4cG9ydCB7XG4gIC8vIFRPRE8gZGVwcmVjYXRlIG9sZCBuYW1lIGluIHY3XG4gIGluc3RydW1lbnRPdXRnb2luZ1JlcXVlc3RzIGFzIHJlZ2lzdGVyUmVxdWVzdEluc3RydW1lbnRhdGlvbixcbiAgUmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMsXG4gIGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbn0gZnJvbSAnLi9icm93c2VyJztcbmV4cG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuL3NwYW5zdGF0dXMnO1xuZXhwb3J0IHsgSWRsZVRyYW5zYWN0aW9uIH0gZnJvbSAnLi9pZGxldHJhbnNhY3Rpb24nO1xuZXhwb3J0IHsgc3RhcnRJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuL2h1YmV4dGVuc2lvbnMnO1xuXG4vLyBXZSBhcmUgcGF0Y2hpbmcgdGhlIGdsb2JhbCBvYmplY3Qgd2l0aCBvdXIgaHViIGV4dGVuc2lvbiBtZXRob2RzXG5hZGRFeHRlbnNpb25NZXRob2RzKCk7XG5cbmV4cG9ydCB7IGFkZEV4dGVuc2lvbk1ldGhvZHMgfTtcblxuZXhwb3J0IHtcbiAgZXh0cmFjdFRyYWNlcGFyZW50RGF0YSxcbiAgZ2V0QWN0aXZlVHJhbnNhY3Rpb24sXG4gIGhhc1RyYWNpbmdFbmFibGVkLFxuICBzdHJpcFVybFF1ZXJ5QW5kRnJhZ21lbnQsXG4gIFRSQUNFUEFSRU5UX1JFR0VYUCxcbn0gZnJvbSAnLi91dGlscyc7XG4iLCAiLyohXG4gKiBjb29raWVcbiAqIENvcHlyaWdodChjKSAyMDEyLTIwMTQgUm9tYW4gU2h0eWxtYW5cbiAqIENvcHlyaWdodChjKSAyMDE1IERvdWdsYXMgQ2hyaXN0b3BoZXIgV2lsc29uXG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxuZXhwb3J0cy5wYXJzZSA9IHBhcnNlO1xuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIGRlY29kZSA9IGRlY29kZVVSSUNvbXBvbmVudDtcbnZhciBlbmNvZGUgPSBlbmNvZGVVUklDb21wb25lbnQ7XG52YXIgcGFpclNwbGl0UmVnRXhwID0gLzsgKi87XG5cbi8qKlxuICogUmVnRXhwIHRvIG1hdGNoIGZpZWxkLWNvbnRlbnQgaW4gUkZDIDcyMzAgc2VjIDMuMlxuICpcbiAqIGZpZWxkLWNvbnRlbnQgPSBmaWVsZC12Y2hhciBbIDEqKCBTUCAvIEhUQUIgKSBmaWVsZC12Y2hhciBdXG4gKiBmaWVsZC12Y2hhciAgID0gVkNIQVIgLyBvYnMtdGV4dFxuICogb2JzLXRleHQgICAgICA9ICV4ODAtRkZcbiAqL1xuXG52YXIgZmllbGRDb250ZW50UmVnRXhwID0gL15bXFx1MDAwOVxcdTAwMjAtXFx1MDA3ZVxcdTAwODAtXFx1MDBmZl0rJC87XG5cbi8qKlxuICogUGFyc2UgYSBjb29raWUgaGVhZGVyLlxuICpcbiAqIFBhcnNlIHRoZSBnaXZlbiBjb29raWUgaGVhZGVyIHN0cmluZyBpbnRvIGFuIG9iamVjdFxuICogVGhlIG9iamVjdCBoYXMgdGhlIHZhcmlvdXMgY29va2llcyBhcyBrZXlzKG5hbWVzKSA9PiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtvYmplY3R9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHN0ciBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gIH1cblxuICB2YXIgb2JqID0ge31cbiAgdmFyIG9wdCA9IG9wdGlvbnMgfHwge307XG4gIHZhciBwYWlycyA9IHN0ci5zcGxpdChwYWlyU3BsaXRSZWdFeHApO1xuICB2YXIgZGVjID0gb3B0LmRlY29kZSB8fCBkZWNvZGU7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBwYWlyID0gcGFpcnNbaV07XG4gICAgdmFyIGVxX2lkeCA9IHBhaXIuaW5kZXhPZignPScpO1xuXG4gICAgLy8gc2tpcCB0aGluZ3MgdGhhdCBkb24ndCBsb29rIGxpa2Uga2V5PXZhbHVlXG4gICAgaWYgKGVxX2lkeCA8IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBwYWlyLnN1YnN0cigwLCBlcV9pZHgpLnRyaW0oKVxuICAgIHZhciB2YWwgPSBwYWlyLnN1YnN0cigrK2VxX2lkeCwgcGFpci5sZW5ndGgpLnRyaW0oKTtcblxuICAgIC8vIHF1b3RlZCB2YWx1ZXNcbiAgICBpZiAoJ1wiJyA9PSB2YWxbMF0pIHtcbiAgICAgIHZhbCA9IHZhbC5zbGljZSgxLCAtMSk7XG4gICAgfVxuXG4gICAgLy8gb25seSBhc3NpZ24gb25jZVxuICAgIGlmICh1bmRlZmluZWQgPT0gb2JqW2tleV0pIHtcbiAgICAgIG9ialtrZXldID0gdHJ5RGVjb2RlKHZhbCwgZGVjKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIFNlcmlhbGl6ZSBkYXRhIGludG8gYSBjb29raWUgaGVhZGVyLlxuICpcbiAqIFNlcmlhbGl6ZSB0aGUgYSBuYW1lIHZhbHVlIHBhaXIgaW50byBhIGNvb2tpZSBzdHJpbmcgc3VpdGFibGUgZm9yXG4gKiBodHRwIGhlYWRlcnMuIEFuIG9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHNwZWNpZmllZCBjb29raWUgcGFyYW1ldGVycy5cbiAqXG4gKiBzZXJpYWxpemUoJ2ZvbycsICdiYXInLCB7IGh0dHBPbmx5OiB0cnVlIH0pXG4gKiAgID0+IFwiZm9vPWJhcjsgaHR0cE9ubHlcIlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gc2VyaWFsaXplKG5hbWUsIHZhbCwgb3B0aW9ucykge1xuICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIGVuYyA9IG9wdC5lbmNvZGUgfHwgZW5jb2RlO1xuXG4gIGlmICh0eXBlb2YgZW5jICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIGVuY29kZSBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgbmFtZSBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICB2YXIgdmFsdWUgPSBlbmModmFsKTtcblxuICBpZiAodmFsdWUgJiYgIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FyZ3VtZW50IHZhbCBpcyBpbnZhbGlkJyk7XG4gIH1cblxuICB2YXIgc3RyID0gbmFtZSArICc9JyArIHZhbHVlO1xuXG4gIGlmIChudWxsICE9IG9wdC5tYXhBZ2UpIHtcbiAgICB2YXIgbWF4QWdlID0gb3B0Lm1heEFnZSAtIDA7XG5cbiAgICBpZiAoaXNOYU4obWF4QWdlKSB8fCAhaXNGaW5pdGUobWF4QWdlKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIG1heEFnZSBpcyBpbnZhbGlkJylcbiAgICB9XG5cbiAgICBzdHIgKz0gJzsgTWF4LUFnZT0nICsgTWF0aC5mbG9vcihtYXhBZ2UpO1xuICB9XG5cbiAgaWYgKG9wdC5kb21haW4pIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5kb21haW4pKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZG9tYWluIGlzIGludmFsaWQnKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gJzsgRG9tYWluPScgKyBvcHQuZG9tYWluO1xuICB9XG5cbiAgaWYgKG9wdC5wYXRoKSB7XG4gICAgaWYgKCFmaWVsZENvbnRlbnRSZWdFeHAudGVzdChvcHQucGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBwYXRoIGlzIGludmFsaWQnKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gJzsgUGF0aD0nICsgb3B0LnBhdGg7XG4gIH1cblxuICBpZiAob3B0LmV4cGlyZXMpIHtcbiAgICBpZiAodHlwZW9mIG9wdC5leHBpcmVzLnRvVVRDU3RyaW5nICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZXhwaXJlcyBpcyBpbnZhbGlkJyk7XG4gICAgfVxuXG4gICAgc3RyICs9ICc7IEV4cGlyZXM9JyArIG9wdC5leHBpcmVzLnRvVVRDU3RyaW5nKCk7XG4gIH1cblxuICBpZiAob3B0Lmh0dHBPbmx5KSB7XG4gICAgc3RyICs9ICc7IEh0dHBPbmx5JztcbiAgfVxuXG4gIGlmIChvcHQuc2VjdXJlKSB7XG4gICAgc3RyICs9ICc7IFNlY3VyZSc7XG4gIH1cblxuICBpZiAob3B0LnNhbWVTaXRlKSB7XG4gICAgdmFyIHNhbWVTaXRlID0gdHlwZW9mIG9wdC5zYW1lU2l0ZSA9PT0gJ3N0cmluZydcbiAgICAgID8gb3B0LnNhbWVTaXRlLnRvTG93ZXJDYXNlKCkgOiBvcHQuc2FtZVNpdGU7XG5cbiAgICBzd2l0Y2ggKHNhbWVTaXRlKSB7XG4gICAgICBjYXNlIHRydWU6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1TdHJpY3QnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2xheCc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1MYXgnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3N0cmljdCc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1TdHJpY3QnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICBzdHIgKz0gJzsgU2FtZVNpdGU9Tm9uZSc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHNhbWVTaXRlIGlzIGludmFsaWQnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc3RyO1xufVxuXG4vKipcbiAqIFRyeSBkZWNvZGluZyBhIHN0cmluZyB1c2luZyBhIGRlY29kaW5nIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGRlY29kZVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiB0cnlEZWNvZGUoc3RyLCBkZWNvZGUpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlKHN0cik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbWF4LWxpbmVzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBjYXB0dXJlRXhjZXB0aW9uLCBnZXRDdXJyZW50SHViLCBzdGFydFRyYW5zYWN0aW9uLCB3aXRoU2NvcGUgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgZXh0cmFjdFRyYWNlcGFyZW50RGF0YSwgU3BhbiB9IGZyb20gJ0BzZW50cnkvdHJhY2luZyc7XG5pbXBvcnQgeyBFdmVudCwgRXh0cmFjdGVkTm9kZVJlcXVlc3REYXRhLCBSZXF1ZXN0U2Vzc2lvblN0YXR1cywgVHJhbnNhY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGlzUGxhaW5PYmplY3QsIGlzU3RyaW5nLCBsb2dnZXIsIG5vcm1hbGl6ZSwgc3RyaXBVcmxRdWVyeUFuZEZyYWdtZW50IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgKiBhcyBjb29raWUgZnJvbSAnY29va2llJztcbmltcG9ydCAqIGFzIGRvbWFpbiBmcm9tICdkb21haW4nO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHVybCBmcm9tICd1cmwnO1xuXG5pbXBvcnQgeyBOb2RlQ2xpZW50IH0gZnJvbSAnLi9jbGllbnQnO1xuaW1wb3J0IHsgZmx1c2gsIGlzQXV0b1Nlc3Npb25UcmFja2luZ0VuYWJsZWQgfSBmcm9tICcuL3Nkayc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwcmVzc1JlcXVlc3Qge1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICBjb25uZWN0aW9uPzoge1xuICAgIHJlbW90ZUFkZHJlc3M/OiBzdHJpbmc7XG4gIH07XG4gIGlwPzogc3RyaW5nO1xuICBtZXRob2Q/OiBzdHJpbmc7XG4gIG9yaWdpbmFsVXJsPzogc3RyaW5nO1xuICByb3V0ZT86IHtcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgc3RhY2s6IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgfSxcbiAgICBdO1xuICB9O1xuICBxdWVyeT86IHtcbiAgICAvLyBJdCBjYW4gYmU6IHVuZGVmaW5lZCB8IHN0cmluZyB8IHN0cmluZ1tdIHwgUGFyc2VkUXMgfCBQYXJzZWRRc1tdIChmcm9tIGBxc2AgcGFja2FnZSksIGJ1dCB3ZSBkb250IHdhbnQgdG8gcHVsbCBpdC5cbiAgICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xuICB9O1xuICB1cmw/OiBzdHJpbmc7XG4gIHVzZXI/OiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9O1xufVxuXG4vKipcbiAqIEV4cHJlc3MtY29tcGF0aWJsZSB0cmFjaW5nIGhhbmRsZXIuXG4gKiBAc2VlIEV4cG9zZWQgYXMgYEhhbmRsZXJzLnRyYWNpbmdIYW5kbGVyYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhY2luZ0hhbmRsZXIoKTogKFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsXG4gIG5leHQ6IChlcnJvcj86IGFueSkgPT4gdm9pZCxcbikgPT4gdm9pZCB7XG4gIHJldHVybiBmdW5jdGlvbiBzZW50cnlUcmFjaW5nTWlkZGxld2FyZShcbiAgICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgICBuZXh0OiAoZXJyb3I/OiBhbnkpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIC8vIElmIHRoZXJlIGlzIGEgdHJhY2UgaGVhZGVyIHNldCwgd2UgZXh0cmFjdCB0aGUgZGF0YSBmcm9tIGl0IChwYXJlbnRTcGFuSWQsIHRyYWNlSWQsIGFuZCBzYW1wbGluZyBkZWNpc2lvbilcbiAgICBsZXQgdHJhY2VwYXJlbnREYXRhO1xuICAgIGlmIChyZXEuaGVhZGVycyAmJiBpc1N0cmluZyhyZXEuaGVhZGVyc1snc2VudHJ5LXRyYWNlJ10pKSB7XG4gICAgICB0cmFjZXBhcmVudERhdGEgPSBleHRyYWN0VHJhY2VwYXJlbnREYXRhKHJlcS5oZWFkZXJzWydzZW50cnktdHJhY2UnXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gc3RhcnRUcmFuc2FjdGlvbihcbiAgICAgIHtcbiAgICAgICAgbmFtZTogZXh0cmFjdEV4cHJlc3NUcmFuc2FjdGlvbk5hbWUocmVxLCB7IHBhdGg6IHRydWUsIG1ldGhvZDogdHJ1ZSB9KSxcbiAgICAgICAgb3A6ICdodHRwLnNlcnZlcicsXG4gICAgICAgIC4uLnRyYWNlcGFyZW50RGF0YSxcbiAgICAgIH0sXG4gICAgICAvLyBleHRyYSBjb250ZXh0IHBhc3NlZCB0byB0aGUgdHJhY2VzU2FtcGxlclxuICAgICAgeyByZXF1ZXN0OiBleHRyYWN0UmVxdWVzdERhdGEocmVxKSB9LFxuICAgICk7XG5cbiAgICAvLyBXZSBwdXQgdGhlIHRyYW5zYWN0aW9uIG9uIHRoZSBzY29wZSBzbyB1c2VycyBjYW4gYXR0YWNoIGNoaWxkcmVuIHRvIGl0XG4gICAgZ2V0Q3VycmVudEh1YigpLmNvbmZpZ3VyZVNjb3BlKHNjb3BlID0+IHtcbiAgICAgIHNjb3BlLnNldFNwYW4odHJhbnNhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgLy8gV2UgYWxzbyBzZXQgX19zZW50cnlfdHJhbnNhY3Rpb24gb24gdGhlIHJlc3BvbnNlIHNvIHBlb3BsZSBjYW4gZ3JhYiB0aGUgdHJhbnNhY3Rpb24gdGhlcmUgdG8gYWRkXG4gICAgLy8gc3BhbnMgdG8gaXQgbGF0ZXIuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIChyZXMgYXMgYW55KS5fX3NlbnRyeV90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uO1xuXG4gICAgcmVzLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgIC8vIFB1c2ggYHRyYW5zYWN0aW9uLmZpbmlzaGAgdG8gdGhlIG5leHQgZXZlbnQgbG9vcCBzbyBvcGVuIHNwYW5zIGhhdmUgYSBjaGFuY2UgdG8gZmluaXNoIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb25cbiAgICAgIC8vIGNsb3Nlc1xuICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgYWRkRXhwcmVzc1JlcVRvVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIHJlcSk7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldEh0dHBTdGF0dXMocmVzLnN0YXR1c0NvZGUpO1xuICAgICAgICB0cmFuc2FjdGlvbi5maW5pc2goKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgbmV4dCgpO1xuICB9O1xufVxuXG4vKipcbiAqIFNldCBwYXJhbWV0ZXJpemVkIGFzIHRyYW5zYWN0aW9uIG5hbWUgZS5nLjogYEdFVCAvdXNlcnMvOmlkYFxuICogQWxzbyBhZGRzIG1vcmUgY29udGV4dCBkYXRhIG9uIHRoZSB0cmFuc2FjdGlvbiBmcm9tIHRoZSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGFkZEV4cHJlc3NSZXFUb1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiB8IHVuZGVmaW5lZCwgcmVxOiBFeHByZXNzUmVxdWVzdCk6IHZvaWQge1xuICBpZiAoIXRyYW5zYWN0aW9uKSByZXR1cm47XG4gIHRyYW5zYWN0aW9uLm5hbWUgPSBleHRyYWN0RXhwcmVzc1RyYW5zYWN0aW9uTmFtZShyZXEsIHsgcGF0aDogdHJ1ZSwgbWV0aG9kOiB0cnVlIH0pO1xuICB0cmFuc2FjdGlvbi5zZXREYXRhKCd1cmwnLCByZXEub3JpZ2luYWxVcmwpO1xuICB0cmFuc2FjdGlvbi5zZXREYXRhKCdiYXNlVXJsJywgcmVxLmJhc2VVcmwpO1xuICB0cmFuc2FjdGlvbi5zZXREYXRhKCdxdWVyeScsIHJlcS5xdWVyeSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgY29tcGxldGUgZ2VuZXJhbGl6ZWQgcGF0aCBmcm9tIHRoZSByZXF1ZXN0IG9iamVjdCBhbmQgdXNlcyBpdCB0byBjb25zdHJ1Y3QgdHJhbnNhY3Rpb24gbmFtZS5cbiAqXG4gKiBlZy4gR0VUIC9tb3VudHBvaW50L3VzZXIvOmlkXG4gKlxuICogQHBhcmFtIHJlcSBUaGUgRXhwcmVzc1JlcXVlc3Qgb2JqZWN0XG4gKiBAcGFyYW0gb3B0aW9ucyBXaGF0IHRvIGluY2x1ZGUgaW4gdGhlIHRyYW5zYWN0aW9uIG5hbWUgKG1ldGhvZCwgcGF0aCwgb3IgYm90aClcbiAqXG4gKiBAcmV0dXJucyBUaGUgZnVsbHkgY29uc3RydWN0ZWQgdHJhbnNhY3Rpb24gbmFtZVxuICovXG5mdW5jdGlvbiBleHRyYWN0RXhwcmVzc1RyYW5zYWN0aW9uTmFtZShcbiAgcmVxOiBFeHByZXNzUmVxdWVzdCxcbiAgb3B0aW9uczogeyBwYXRoPzogYm9vbGVhbjsgbWV0aG9kPzogYm9vbGVhbiB9ID0ge30sXG4pOiBzdHJpbmcge1xuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kPy50b1VwcGVyQ2FzZSgpO1xuXG4gIGxldCBwYXRoID0gJyc7XG4gIGlmIChyZXEucm91dGUpIHtcbiAgICBwYXRoID0gYCR7cmVxLmJhc2VVcmwgfHwgJyd9JHtyZXEucm91dGUucGF0aH1gO1xuICB9IGVsc2UgaWYgKHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsKSB7XG4gICAgcGF0aCA9IHN0cmlwVXJsUXVlcnlBbmRGcmFnbWVudChyZXEub3JpZ2luYWxVcmwgfHwgcmVxLnVybCB8fCAnJyk7XG4gIH1cblxuICBsZXQgaW5mbyA9ICcnO1xuICBpZiAob3B0aW9ucy5tZXRob2QgJiYgbWV0aG9kKSB7XG4gICAgaW5mbyArPSBtZXRob2Q7XG4gIH1cbiAgaWYgKG9wdGlvbnMubWV0aG9kICYmIG9wdGlvbnMucGF0aCkge1xuICAgIGluZm8gKz0gYCBgO1xuICB9XG4gIGlmIChvcHRpb25zLnBhdGggJiYgcGF0aCkge1xuICAgIGluZm8gKz0gcGF0aDtcbiAgfVxuXG4gIHJldHVybiBpbmZvO1xufVxuXG50eXBlIFRyYW5zYWN0aW9uTmFtaW5nU2NoZW1lID0gJ3BhdGgnIHwgJ21ldGhvZFBhdGgnIHwgJ2hhbmRsZXInO1xuXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGV4dHJhY3RUcmFuc2FjdGlvbihyZXE6IEV4cHJlc3NSZXF1ZXN0LCB0eXBlOiBib29sZWFuIHwgVHJhbnNhY3Rpb25OYW1pbmdTY2hlbWUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdwYXRoJzoge1xuICAgICAgcmV0dXJuIGV4dHJhY3RFeHByZXNzVHJhbnNhY3Rpb25OYW1lKHJlcSwgeyBwYXRoOiB0cnVlIH0pO1xuICAgIH1cbiAgICBjYXNlICdoYW5kbGVyJzoge1xuICAgICAgcmV0dXJuIHJlcS5yb3V0ZT8uc3RhY2tbMF0ubmFtZSB8fCAnPGFub255bW91cz4nO1xuICAgIH1cbiAgICBjYXNlICdtZXRob2RQYXRoJzpcbiAgICBkZWZhdWx0OiB7XG4gICAgICByZXR1cm4gZXh0cmFjdEV4cHJlc3NUcmFuc2FjdGlvbk5hbWUocmVxLCB7IHBhdGg6IHRydWUsIG1ldGhvZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIERlZmF1bHQgdXNlciBrZXlzIHRoYXQnbGwgYmUgdXNlZCB0byBleHRyYWN0IGRhdGEgZnJvbSB0aGUgcmVxdWVzdCAqL1xuY29uc3QgREVGQVVMVF9VU0VSX0tFWVMgPSBbJ2lkJywgJ3VzZXJuYW1lJywgJ2VtYWlsJ107XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gZXh0cmFjdFVzZXJEYXRhKFxuICB1c2VyOiB7XG4gICAgW2tleTogc3RyaW5nXTogYW55O1xuICB9LFxuICBrZXlzOiBib29sZWFuIHwgc3RyaW5nW10sXG4pOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgY29uc3QgZXh0cmFjdGVkVXNlcjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuaXNBcnJheShrZXlzKSA/IGtleXMgOiBERUZBVUxUX1VTRVJfS0VZUztcblxuICBhdHRyaWJ1dGVzLmZvckVhY2goa2V5ID0+IHtcbiAgICBpZiAodXNlciAmJiBrZXkgaW4gdXNlcikge1xuICAgICAgZXh0cmFjdGVkVXNlcltrZXldID0gdXNlcltrZXldO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGV4dHJhY3RlZFVzZXI7XG59XG5cbi8qKiBEZWZhdWx0IHJlcXVlc3Qga2V5cyB0aGF0J2xsIGJlIHVzZWQgdG8gZXh0cmFjdCBkYXRhIGZyb20gdGhlIHJlcXVlc3QgKi9cbmNvbnN0IERFRkFVTFRfUkVRVUVTVF9LRVlTID0gWydjb29raWVzJywgJ2RhdGEnLCAnaGVhZGVycycsICdtZXRob2QnLCAncXVlcnlfc3RyaW5nJywgJ3VybCddO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgZGF0YSBmcm9tIHRoZSByZXF1ZXN0IG9iamVjdCwgYWNjb3VudGluZyBmb3IgZnJhbWV3b3JrIGRpZmZlcmVuY2VzLlxuICpcbiAqIEBwYXJhbSByZXEgVGhlIHJlcXVlc3Qgb2JqZWN0IGZyb20gd2hpY2ggdG8gZXh0cmFjdCBkYXRhXG4gKiBAcGFyYW0ga2V5cyBBbiBvcHRpb25hbCBhcnJheSBvZiBrZXlzIHRvIGluY2x1ZGUgaW4gdGhlIG5vcm1hbGl6ZWQgZGF0YS4gRGVmYXVsdHMgdG8gREVGQVVMVF9SRVFVRVNUX0tFWVMgaWYgbm90XG4gKiBwcm92aWRlZC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIG5vcm1hbGl6ZWQgcmVxdWVzdCBkYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UmVxdWVzdERhdGEoXG4gIHJlcTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbiAga2V5czogc3RyaW5nW10gPSBERUZBVUxUX1JFUVVFU1RfS0VZUyxcbik6IEV4dHJhY3RlZE5vZGVSZXF1ZXN0RGF0YSB7XG4gIGNvbnN0IHJlcXVlc3REYXRhOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG5cbiAgLy8gaGVhZGVyczpcbiAgLy8gICBub2RlLCBleHByZXNzLCBuZXh0anM6IHJlcS5oZWFkZXJzXG4gIC8vICAga29hOiByZXEuaGVhZGVyXG4gIGNvbnN0IGhlYWRlcnMgPSAocmVxLmhlYWRlcnMgfHwgcmVxLmhlYWRlciB8fCB7fSkgYXMge1xuICAgIGhvc3Q/OiBzdHJpbmc7XG4gICAgY29va2llPzogc3RyaW5nO1xuICB9O1xuICAvLyBtZXRob2Q6XG4gIC8vICAgbm9kZSwgZXhwcmVzcywga29hLCBuZXh0anM6IHJlcS5tZXRob2RcbiAgY29uc3QgbWV0aG9kID0gcmVxLm1ldGhvZDtcbiAgLy8gaG9zdDpcbiAgLy8gICBleHByZXNzOiByZXEuaG9zdG5hbWUgaW4gPiA0IGFuZCByZXEuaG9zdCBpbiA8IDRcbiAgLy8gICBrb2E6IHJlcS5ob3N0XG4gIC8vICAgbm9kZSwgbmV4dGpzOiByZXEuaGVhZGVycy5ob3N0XG4gIGNvbnN0IGhvc3QgPSByZXEuaG9zdG5hbWUgfHwgcmVxLmhvc3QgfHwgaGVhZGVycy5ob3N0IHx8ICc8bm8gaG9zdD4nO1xuICAvLyBwcm90b2NvbDpcbiAgLy8gICBub2RlLCBuZXh0anM6IDxuL2E+XG4gIC8vICAgZXhwcmVzcywga29hOiByZXEucHJvdG9jb2xcbiAgY29uc3QgcHJvdG9jb2wgPVxuICAgIHJlcS5wcm90b2NvbCA9PT0gJ2h0dHBzJyB8fCByZXEuc2VjdXJlIHx8ICgocmVxLnNvY2tldCB8fCB7fSkgYXMgeyBlbmNyeXB0ZWQ/OiBib29sZWFuIH0pLmVuY3J5cHRlZFxuICAgICAgPyAnaHR0cHMnXG4gICAgICA6ICdodHRwJztcbiAgLy8gdXJsIChpbmNsdWRpbmcgcGF0aCBhbmQgcXVlcnkgc3RyaW5nKTpcbiAgLy8gICBub2RlLCBleHByZXNzOiByZXEub3JpZ2luYWxVcmxcbiAgLy8gICBrb2EsIG5leHRqczogcmVxLnVybFxuICBjb25zdCBvcmlnaW5hbFVybCA9IChyZXEub3JpZ2luYWxVcmwgfHwgcmVxLnVybCB8fCAnJykgYXMgc3RyaW5nO1xuICAvLyBhYnNvbHV0ZSB1cmxcbiAgY29uc3QgYWJzb2x1dGVVcmwgPSBgJHtwcm90b2NvbH06Ly8ke2hvc3R9JHtvcmlnaW5hbFVybH1gO1xuXG4gIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICBjYXNlICdoZWFkZXJzJzpcbiAgICAgICAgcmVxdWVzdERhdGEuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbWV0aG9kJzpcbiAgICAgICAgcmVxdWVzdERhdGEubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3VybCc6XG4gICAgICAgIHJlcXVlc3REYXRhLnVybCA9IGFic29sdXRlVXJsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2Nvb2tpZXMnOlxuICAgICAgICAvLyBjb29raWVzOlxuICAgICAgICAvLyAgIG5vZGUsIGV4cHJlc3MsIGtvYTogcmVxLmhlYWRlcnMuY29va2llXG4gICAgICAgIC8vICAgdmVyY2VsLCBzYWlscy5qcywgZXhwcmVzcyAody8gY29va2llIG1pZGRsZXdhcmUpLCBuZXh0anM6IHJlcS5jb29raWVzXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgcmVxdWVzdERhdGEuY29va2llcyA9IHJlcS5jb29raWVzIHx8IGNvb2tpZS5wYXJzZShoZWFkZXJzLmNvb2tpZSB8fCAnJyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncXVlcnlfc3RyaW5nJzpcbiAgICAgICAgLy8gcXVlcnkgc3RyaW5nOlxuICAgICAgICAvLyAgIG5vZGU6IHJlcS51cmwgKHJhdylcbiAgICAgICAgLy8gICBleHByZXNzLCBrb2EsIG5leHRqczogcmVxLnF1ZXJ5XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgcmVxdWVzdERhdGEucXVlcnlfc3RyaW5nID0gcmVxLnF1ZXJ5IHx8IHVybC5wYXJzZShvcmlnaW5hbFVybCB8fCAnJywgZmFsc2UpLnF1ZXJ5O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RhdGEnOlxuICAgICAgICBpZiAobWV0aG9kID09PSAnR0VUJyB8fCBtZXRob2QgPT09ICdIRUFEJykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vIGJvZHkgZGF0YTpcbiAgICAgICAgLy8gICBleHByZXNzLCBrb2EsIG5leHRqczogcmVxLmJvZHlcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICB3aGVuIHVzaW5nIG5vZGUgYnkgaXRzZWxmLCB5b3UgaGF2ZSB0byByZWFkIHRoZSBpbmNvbWluZyBzdHJlYW0oc2VlXG4gICAgICAgIC8vICAgaHR0cHM6Ly9ub2RlanMuZGV2L2xlYXJuL2dldC1odHRwLXJlcXVlc3QtYm9keS1kYXRhLXVzaW5nLW5vZGVqcyk7IGlmIGEgdXNlciBpcyBkb2luZyB0aGF0LCB3ZSBjYW4ndCBrbm93XG4gICAgICAgIC8vICAgd2hlcmUgdGhleSdyZSBnb2luZyB0byBzdG9yZSB0aGUgZmluYWwgcmVzdWx0LCBzbyB0aGV5J2xsIGhhdmUgdG8gY2FwdHVyZSB0aGlzIGRhdGEgdGhlbXNlbHZlc1xuICAgICAgICBpZiAocmVxLmJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlcXVlc3REYXRhLmRhdGEgPSBpc1N0cmluZyhyZXEuYm9keSkgPyByZXEuYm9keSA6IEpTT04uc3RyaW5naWZ5KG5vcm1hbGl6ZShyZXEuYm9keSkpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwocmVxLCBrZXkpKSB7XG4gICAgICAgICAgcmVxdWVzdERhdGFba2V5XSA9IChyZXEgYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfSlba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlcXVlc3REYXRhO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZGVjaWRpbmcgd2hhdCBwYXJ0cyBvZiB0aGUgcmVxdWVzdCB0byB1c2Ugd2hlbiBlbmhhbmNpbmcgYW4gZXZlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJzZVJlcXVlc3RPcHRpb25zIHtcbiAgaXA/OiBib29sZWFuO1xuICByZXF1ZXN0PzogYm9vbGVhbiB8IHN0cmluZ1tdO1xuICBzZXJ2ZXJOYW1lPzogYm9vbGVhbjtcbiAgdHJhbnNhY3Rpb24/OiBib29sZWFuIHwgVHJhbnNhY3Rpb25OYW1pbmdTY2hlbWU7XG4gIHVzZXI/OiBib29sZWFuIHwgc3RyaW5nW107XG4gIHZlcnNpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEVucmljaGVzIHBhc3NlZCBldmVudCB3aXRoIHJlcXVlc3QgZGF0YS5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgV2lsbCBiZSBtdXRhdGVkIGFuZCBlbnJpY2hlZCB3aXRoIHJlcSBkYXRhXG4gKiBAcGFyYW0gcmVxIFJlcXVlc3Qgb2JqZWN0XG4gKiBAcGFyYW0gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBmbGFncyB0byBlbmFibGUgZnVuY3Rpb25hbGl0eVxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSZXF1ZXN0KGV2ZW50OiBFdmVudCwgcmVxOiBFeHByZXNzUmVxdWVzdCwgb3B0aW9ucz86IFBhcnNlUmVxdWVzdE9wdGlvbnMpOiBFdmVudCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICBvcHRpb25zID0ge1xuICAgIGlwOiBmYWxzZSxcbiAgICByZXF1ZXN0OiB0cnVlLFxuICAgIHNlcnZlck5hbWU6IHRydWUsXG4gICAgdHJhbnNhY3Rpb246IHRydWUsXG4gICAgdXNlcjogdHJ1ZSxcbiAgICB2ZXJzaW9uOiB0cnVlLFxuICAgIC4uLm9wdGlvbnMsXG4gIH07XG5cbiAgaWYgKG9wdGlvbnMudmVyc2lvbikge1xuICAgIGV2ZW50LmNvbnRleHRzID0ge1xuICAgICAgLi4uZXZlbnQuY29udGV4dHMsXG4gICAgICBydW50aW1lOiB7XG4gICAgICAgIG5hbWU6ICdub2RlJyxcbiAgICAgICAgdmVyc2lvbjogZ2xvYmFsLnByb2Nlc3MudmVyc2lvbixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnJlcXVlc3QpIHtcbiAgICAvLyBpZiB0aGUgb3B0aW9uIHZhbHVlIGlzIGB0cnVlYCwgdXNlIHRoZSBkZWZhdWx0IHNldCBvZiBrZXlzIGJ5IG5vdCBwYXNzaW5nIGFueXRoaW5nIHRvIGBleHRyYWN0UmVxdWVzdERhdGEoKWBcbiAgICBjb25zdCBleHRyYWN0ZWRSZXF1ZXN0RGF0YSA9IEFycmF5LmlzQXJyYXkob3B0aW9ucy5yZXF1ZXN0KVxuICAgICAgPyBleHRyYWN0UmVxdWVzdERhdGEocmVxLCBvcHRpb25zLnJlcXVlc3QpXG4gICAgICA6IGV4dHJhY3RSZXF1ZXN0RGF0YShyZXEpO1xuICAgIGV2ZW50LnJlcXVlc3QgPSB7XG4gICAgICAuLi5ldmVudC5yZXF1ZXN0LFxuICAgICAgLi4uZXh0cmFjdGVkUmVxdWVzdERhdGEsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnNlcnZlck5hbWUgJiYgIWV2ZW50LnNlcnZlcl9uYW1lKSB7XG4gICAgZXZlbnQuc2VydmVyX25hbWUgPSBnbG9iYWwucHJvY2Vzcy5lbnYuU0VOVFJZX05BTUUgfHwgb3MuaG9zdG5hbWUoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLnVzZXIpIHtcbiAgICBjb25zdCBleHRyYWN0ZWRVc2VyID0gcmVxLnVzZXIgJiYgaXNQbGFpbk9iamVjdChyZXEudXNlcikgPyBleHRyYWN0VXNlckRhdGEocmVxLnVzZXIsIG9wdGlvbnMudXNlcikgOiB7fTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhleHRyYWN0ZWRVc2VyKSkge1xuICAgICAgZXZlbnQudXNlciA9IHtcbiAgICAgICAgLi4uZXZlbnQudXNlcixcbiAgICAgICAgLi4uZXh0cmFjdGVkVXNlcixcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gY2xpZW50IGlwOlxuICAvLyAgIG5vZGUsIG5leHRqczogcmVxLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzc1xuICAvLyAgIGV4cHJlc3MsIGtvYTogcmVxLmlwXG4gIGlmIChvcHRpb25zLmlwKSB7XG4gICAgY29uc3QgaXAgPSByZXEuaXAgfHwgKHJlcS5jb25uZWN0aW9uICYmIHJlcS5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3MpO1xuICAgIGlmIChpcCkge1xuICAgICAgZXZlbnQudXNlciA9IHtcbiAgICAgICAgLi4uZXZlbnQudXNlcixcbiAgICAgICAgaXBfYWRkcmVzczogaXAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnRyYW5zYWN0aW9uICYmICFldmVudC50cmFuc2FjdGlvbikge1xuICAgIC8vIFRPRE8gZG8gd2UgZXZlbiBuZWVkIHRoaXMgYW55bW9yZT9cbiAgICAvLyBUT0RPIG1ha2UgdGhpcyB3b3JrIGZvciBuZXh0anNcbiAgICBldmVudC50cmFuc2FjdGlvbiA9IGV4dHJhY3RUcmFuc2FjdGlvbihyZXEsIG9wdGlvbnMudHJhbnNhY3Rpb24pO1xuICB9XG5cbiAgcmV0dXJuIGV2ZW50O1xufVxuXG5leHBvcnQgdHlwZSBSZXF1ZXN0SGFuZGxlck9wdGlvbnMgPSBQYXJzZVJlcXVlc3RPcHRpb25zICYge1xuICBmbHVzaFRpbWVvdXQ/OiBudW1iZXI7XG59O1xuXG4vKipcbiAqIEV4cHJlc3MgY29tcGF0aWJsZSByZXF1ZXN0IGhhbmRsZXIuXG4gKiBAc2VlIEV4cG9zZWQgYXMgYEhhbmRsZXJzLnJlcXVlc3RIYW5kbGVyYFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdEhhbmRsZXIoXG4gIG9wdGlvbnM/OiBSZXF1ZXN0SGFuZGxlck9wdGlvbnMsXG4pOiAocmVxOiBodHRwLkluY29taW5nTWVzc2FnZSwgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLCBuZXh0OiAoZXJyb3I/OiBhbnkpID0+IHZvaWQpID0+IHZvaWQge1xuICBjb25zdCBjdXJyZW50SHViID0gZ2V0Q3VycmVudEh1YigpO1xuICBjb25zdCBjbGllbnQgPSBjdXJyZW50SHViLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuICAvLyBJbml0aWFsaXNlIGFuIGluc3RhbmNlIG9mIFNlc3Npb25GbHVzaGVyIG9uIHRoZSBjbGllbnQgd2hlbiBgYXV0b1Nlc3Npb25UcmFja2luZ2AgaXMgZW5hYmxlZCBhbmQgdGhlXG4gIC8vIGByZXF1ZXN0SGFuZGxlcmAgbWlkZGxld2FyZSBpcyB1c2VkIGluZGljYXRpbmcgdGhhdCB3ZSBhcmUgcnVubmluZyBpbiBTZXNzaW9uQWdncmVnYXRlcyBtb2RlXG4gIGlmIChjbGllbnQgJiYgaXNBdXRvU2Vzc2lvblRyYWNraW5nRW5hYmxlZChjbGllbnQpKSB7XG4gICAgY2xpZW50LmluaXRTZXNzaW9uRmx1c2hlcigpO1xuXG4gICAgLy8gSWYgU2NvcGUgY29udGFpbnMgYSBTaW5nbGUgbW9kZSBTZXNzaW9uLCBpdCBpcyByZW1vdmVkIGluIGZhdm9yIG9mIHVzaW5nIFNlc3Npb24gQWdncmVnYXRlcyBtb2RlXG4gICAgY29uc3Qgc2NvcGUgPSBjdXJyZW50SHViLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlICYmIHNjb3BlLmdldFNlc3Npb24oKSkge1xuICAgICAgc2NvcGUuc2V0U2Vzc2lvbigpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gc2VudHJ5UmVxdWVzdE1pZGRsZXdhcmUoXG4gICAgcmVxOiBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsXG4gICAgbmV4dDogKGVycm9yPzogYW55KSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZsdXNoVGltZW91dCAmJiBvcHRpb25zLmZsdXNoVGltZW91dCA+IDApIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICAgIGNvbnN0IF9lbmQgPSByZXMuZW5kO1xuICAgICAgcmVzLmVuZCA9IGZ1bmN0aW9uKGNodW5rPzogYW55IHwgKCgpID0+IHZvaWQpLCBlbmNvZGluZz86IHN0cmluZyB8ICgoKSA9PiB2b2lkKSwgY2I/OiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHZvaWQgZmx1c2gob3B0aW9ucy5mbHVzaFRpbWVvdXQpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgX2VuZC5jYWxsKHRoaXMsIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4obnVsbCwgZSA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBsb2NhbCA9IGRvbWFpbi5jcmVhdGUoKTtcbiAgICBsb2NhbC5hZGQocmVxKTtcbiAgICBsb2NhbC5hZGQocmVzKTtcbiAgICBsb2NhbC5vbignZXJyb3InLCBuZXh0KTtcblxuICAgIGxvY2FsLnJ1bigoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50SHViID0gZ2V0Q3VycmVudEh1YigpO1xuXG4gICAgICBjdXJyZW50SHViLmNvbmZpZ3VyZVNjb3BlKHNjb3BlID0+IHtcbiAgICAgICAgc2NvcGUuYWRkRXZlbnRQcm9jZXNzb3IoKGV2ZW50OiBFdmVudCkgPT4gcGFyc2VSZXF1ZXN0KGV2ZW50LCByZXEsIG9wdGlvbnMpKTtcbiAgICAgICAgY29uc3QgY2xpZW50ID0gY3VycmVudEh1Yi5nZXRDbGllbnQ8Tm9kZUNsaWVudD4oKTtcbiAgICAgICAgaWYgKGlzQXV0b1Nlc3Npb25UcmFja2luZ0VuYWJsZWQoY2xpZW50KSkge1xuICAgICAgICAgIGNvbnN0IHNjb3BlID0gY3VycmVudEh1Yi5nZXRTY29wZSgpO1xuICAgICAgICAgIGlmIChzY29wZSkge1xuICAgICAgICAgICAgLy8gU2V0IGBzdGF0dXNgIG9mIGBSZXF1ZXN0U2Vzc2lvbmAgdG8gT2ssIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlcXVlc3RcbiAgICAgICAgICAgIHNjb3BlLnNldFJlcXVlc3RTZXNzaW9uKHsgc3RhdHVzOiBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5PayB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXMub25jZSgnZmluaXNoJywgKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBjdXJyZW50SHViLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuICAgICAgICBpZiAoaXNBdXRvU2Vzc2lvblRyYWNraW5nRW5hYmxlZChjbGllbnQpKSB7XG4gICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgIGlmIChjbGllbnQgJiYgKGNsaWVudCBhcyBhbnkpLl9jYXB0dXJlUmVxdWVzdFNlc3Npb24pIHtcbiAgICAgICAgICAgICAgLy8gQ2FsbGluZyBfY2FwdHVyZVJlcXVlc3RTZXNzaW9uIHRvIGNhcHR1cmUgcmVxdWVzdCBzZXNzaW9uIGF0IHRoZSBlbmQgb2YgdGhlIHJlcXVlc3QgYnkgaW5jcmVtZW50aW5nXG4gICAgICAgICAgICAgIC8vIHRoZSBjb3JyZWN0IFNlc3Npb25BZ2dyZWdhdGVzIGJ1Y2tldCBpLmUuIGNyYXNoZWQsIGVycm9yZWQgb3IgZXhpdGVkXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgKGNsaWVudCBhcyBhbnkpLl9jYXB0dXJlUmVxdWVzdFNlc3Npb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH07XG59XG5cbi8qKiBKU0RvYyAqL1xuaW50ZXJmYWNlIE1pZGRsZXdhcmVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgc3RhdHVzPzogbnVtYmVyIHwgc3RyaW5nO1xuICBzdGF0dXNDb2RlPzogbnVtYmVyIHwgc3RyaW5nO1xuICBzdGF0dXNfY29kZT86IG51bWJlciB8IHN0cmluZztcbiAgb3V0cHV0Pzoge1xuICAgIHN0YXR1c0NvZGU/OiBudW1iZXIgfCBzdHJpbmc7XG4gIH07XG59XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZUZyb21SZXNwb25zZShlcnJvcjogTWlkZGxld2FyZUVycm9yKTogbnVtYmVyIHtcbiAgY29uc3Qgc3RhdHVzQ29kZSA9IGVycm9yLnN0YXR1cyB8fCBlcnJvci5zdGF0dXNDb2RlIHx8IGVycm9yLnN0YXR1c19jb2RlIHx8IChlcnJvci5vdXRwdXQgJiYgZXJyb3Iub3V0cHV0LnN0YXR1c0NvZGUpO1xuICByZXR1cm4gc3RhdHVzQ29kZSA/IHBhcnNlSW50KHN0YXR1c0NvZGUgYXMgc3RyaW5nLCAxMCkgOiA1MDA7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgcmVzcG9uc2UgY29kZSBpcyBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3IgKi9cbmZ1bmN0aW9uIGRlZmF1bHRTaG91bGRIYW5kbGVFcnJvcihlcnJvcjogTWlkZGxld2FyZUVycm9yKTogYm9vbGVhbiB7XG4gIGNvbnN0IHN0YXR1cyA9IGdldFN0YXR1c0NvZGVGcm9tUmVzcG9uc2UoZXJyb3IpO1xuICByZXR1cm4gc3RhdHVzID49IDUwMDtcbn1cblxuLyoqXG4gKiBFeHByZXNzIGNvbXBhdGlibGUgZXJyb3IgaGFuZGxlci5cbiAqIEBzZWUgRXhwb3NlZCBhcyBgSGFuZGxlcnMuZXJyb3JIYW5kbGVyYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXJyb3JIYW5kbGVyKG9wdGlvbnM/OiB7XG4gIC8qKlxuICAgKiBDYWxsYmFjayBtZXRob2QgZGVjaWRpbmcgd2hldGhlciBlcnJvciBzaG91bGQgYmUgY2FwdHVyZWQgYW5kIHNlbnQgdG8gU2VudHJ5XG4gICAqIEBwYXJhbSBlcnJvciBDYXB0dXJlZCBtaWRkbGV3YXJlIGVycm9yXG4gICAqL1xuICBzaG91bGRIYW5kbGVFcnJvcj8oZXJyb3I6IE1pZGRsZXdhcmVFcnJvcik6IGJvb2xlYW47XG59KTogKFxuICBlcnJvcjogTWlkZGxld2FyZUVycm9yLFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsXG4gIG5leHQ6IChlcnJvcjogTWlkZGxld2FyZUVycm9yKSA9PiB2b2lkLFxuKSA9PiB2b2lkIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlbnRyeUVycm9yTWlkZGxld2FyZShcbiAgICBlcnJvcjogTWlkZGxld2FyZUVycm9yLFxuICAgIF9yZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgICBuZXh0OiAoZXJyb3I6IE1pZGRsZXdhcmVFcnJvcikgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgIGNvbnN0IHNob3VsZEhhbmRsZUVycm9yID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5zaG91bGRIYW5kbGVFcnJvcikgfHwgZGVmYXVsdFNob3VsZEhhbmRsZUVycm9yO1xuXG4gICAgaWYgKHNob3VsZEhhbmRsZUVycm9yKGVycm9yKSkge1xuICAgICAgd2l0aFNjb3BlKF9zY29wZSA9PiB7XG4gICAgICAgIC8vIEZvciBzb21lIHJlYXNvbiB3ZSBuZWVkIHRvIHNldCB0aGUgdHJhbnNhY3Rpb24gb24gdGhlIHNjb3BlIGFnYWluXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSAocmVzIGFzIGFueSkuX19zZW50cnlfdHJhbnNhY3Rpb24gYXMgU3BhbjtcbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uICYmIF9zY29wZS5nZXRTcGFuKCkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIF9zY29wZS5zZXRTcGFuKHRyYW5zYWN0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGdldEN1cnJlbnRIdWIoKS5nZXRDbGllbnQ8Tm9kZUNsaWVudD4oKTtcbiAgICAgICAgaWYgKGNsaWVudCAmJiBpc0F1dG9TZXNzaW9uVHJhY2tpbmdFbmFibGVkKGNsaWVudCkpIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYFNlc3Npb25GbHVzaGVyYCBpcyBpbnN0YW50aWF0ZWQgb24gdGhlIGNsaWVudCB0byBnbyBpbnRvIHRoaXMgYnJhbmNoIHRoYXQgbWFya3MgdGhlXG4gICAgICAgICAgLy8gYHJlcXVlc3RTZXNzaW9uLnN0YXR1c2AgYXMgYENyYXNoZWRgLCBhbmQgdGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgYFNlc3Npb25GbHVzaGVyYCBpcyBvbmx5XG4gICAgICAgICAgLy8gaW5zdGFudGlhdGVkIHdoZW4gdGhlIHRoZWByZXF1ZXN0SGFuZGxlcmAgbWlkZGxld2FyZSBpcyBpbml0aWFsaXNlZCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgd2Ugc2hvdWxkIGJlXG4gICAgICAgICAgLy8gcnVubmluZyBpbiBTZXNzaW9uQWdncmVnYXRlcyBtb2RlXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgIGNvbnN0IGlzU2Vzc2lvbkFnZ3JlZ2F0ZXNNb2RlID0gKGNsaWVudCBhcyBhbnkpLl9zZXNzaW9uRmx1c2hlciAhPT0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmIChpc1Nlc3Npb25BZ2dyZWdhdGVzTW9kZSkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFNlc3Npb24gPSBfc2NvcGUuZ2V0UmVxdWVzdFNlc3Npb24oKTtcbiAgICAgICAgICAgIC8vIElmIGFuIGVycm9yIGJ1YmJsZXMgdG8gdGhlIGBlcnJvckhhbmRsZXJgLCB0aGVuIHRoaXMgaXMgYW4gdW5oYW5kbGVkIGVycm9yLCBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkIGFzIGFcbiAgICAgICAgICAgIC8vIENyYXNoZWQgc2Vzc2lvbi4gVGhlIGBfcmVxdWVzdFNlc3Npb24uc3RhdHVzYCBpcyBjaGVja2VkIHRvIGVuc3VyZSB0aGF0IHRoaXMgZXJyb3IgaXMgaGFwcGVuaW5nIHdpdGhpblxuICAgICAgICAgICAgLy8gdGhlIGJvdW5kcyBvZiBhIHJlcXVlc3QsIGFuZCBpZiBzbyB0aGUgc3RhdHVzIGlzIHVwZGF0ZWRcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0U2Vzc2lvbiAmJiByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgcmVxdWVzdFNlc3Npb24uc3RhdHVzID0gUmVxdWVzdFNlc3Npb25TdGF0dXMuQ3Jhc2hlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBldmVudElkID0gY2FwdHVyZUV4Y2VwdGlvbihlcnJvcik7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgKHJlcyBhcyBhbnkpLnNlbnRyeSA9IGV2ZW50SWQ7XG4gICAgICAgIG5leHQoZXJyb3IpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0KGVycm9yKTtcbiAgfTtcbn1cbiIsICJleHBvcnQge1xuICBCcmVhZGNydW1iLFxuICBCcmVhZGNydW1iSGludCxcbiAgUmVxdWVzdCxcbiAgU2RrSW5mbyxcbiAgRXZlbnQsXG4gIEV2ZW50SGludCxcbiAgRXhjZXB0aW9uLFxuICBSZXNwb25zZSxcbiAgU2V2ZXJpdHksXG4gIFN0YWNrRnJhbWUsXG4gIFN0YWNrdHJhY2UsXG4gIFN0YXR1cyxcbiAgVGhyZWFkLFxuICBVc2VyLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuZXhwb3J0IHtcbiAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsXG4gIGFkZEJyZWFkY3J1bWIsXG4gIGNhcHR1cmVFeGNlcHRpb24sXG4gIGNhcHR1cmVFdmVudCxcbiAgY2FwdHVyZU1lc3NhZ2UsXG4gIGNvbmZpZ3VyZVNjb3BlLFxuICBnZXRIdWJGcm9tQ2FycmllcixcbiAgZ2V0Q3VycmVudEh1YixcbiAgSHViLFxuICBtYWtlTWFpbixcbiAgU2NvcGUsXG4gIHN0YXJ0VHJhbnNhY3Rpb24sXG4gIFNES19WRVJTSU9OLFxuICBzZXRDb250ZXh0LFxuICBzZXRFeHRyYSxcbiAgc2V0RXh0cmFzLFxuICBzZXRUYWcsXG4gIHNldFRhZ3MsXG4gIHNldFVzZXIsXG4gIHdpdGhTY29wZSxcbn0gZnJvbSAnQHNlbnRyeS9jb3JlJztcblxuZXhwb3J0IHsgTm9kZU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCB7IE5vZGVCYWNrZW5kIH0gZnJvbSAnLi9iYWNrZW5kJztcbmV4cG9ydCB7IE5vZGVDbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5leHBvcnQgeyBkZWZhdWx0SW50ZWdyYXRpb25zLCBpbml0LCBsYXN0RXZlbnRJZCwgZmx1c2gsIGNsb3NlLCBnZXRTZW50cnlSZWxlYXNlIH0gZnJvbSAnLi9zZGsnO1xuZXhwb3J0IHsgZGVlcFJlYWREaXJTeW5jIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgeyBTREtfTkFNRSB9IGZyb20gJy4vdmVyc2lvbic7XG5cbmltcG9ydCB7IEludGVncmF0aW9ucyBhcyBDb3JlSW50ZWdyYXRpb25zIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGdldE1haW5DYXJyaWVyIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0ICogYXMgZG9tYWluIGZyb20gJ2RvbWFpbic7XG5cbmltcG9ydCAqIGFzIEhhbmRsZXJzIGZyb20gJy4vaGFuZGxlcnMnO1xuaW1wb3J0ICogYXMgTm9kZUludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBUcmFuc3BvcnRzIGZyb20gJy4vdHJhbnNwb3J0cyc7XG5cbmNvbnN0IElOVEVHUkFUSU9OUyA9IHtcbiAgLi4uQ29yZUludGVncmF0aW9ucyxcbiAgLi4uTm9kZUludGVncmF0aW9ucyxcbn07XG5cbmV4cG9ydCB7IElOVEVHUkFUSU9OUyBhcyBJbnRlZ3JhdGlvbnMsIFRyYW5zcG9ydHMsIEhhbmRsZXJzIH07XG5cbi8vIFdlIG5lZWQgdG8gcGF0Y2ggZG9tYWluIG9uIHRoZSBnbG9iYWwgX19TRU5UUllfXyBvYmplY3QgdG8gbWFrZSBpdCB3b3JrIGZvciBub2RlIGluIGNyb3NzLXBsYXRmb3JtIHBhY2thZ2VzIGxpa2Vcbi8vIEBzZW50cnkvaHViLiBJZiB3ZSBkb24ndCBkbyB0aGlzLCBicm93c2VyIGJ1bmRsZXJzIHdpbGwgaGF2ZSB0cm91YmxlcyByZXNvbHZpbmcgYHJlcXVpcmUoJ2RvbWFpbicpYC5cbmNvbnN0IGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuaWYgKGNhcnJpZXIuX19TRU5UUllfXykge1xuICBjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucyA9IGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zIHx8IHt9O1xuICBjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucy5kb21haW4gPSBjYXJyaWVyLl9fU0VOVFJZX18uZXh0ZW5zaW9ucy5kb21haW4gfHwgZG9tYWluO1xufVxuIiwgImltcG9ydCB7IEV2ZW50LCBFdmVudFByb2Nlc3NvciwgSHViLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvYmxvYi92MS40Ljcvc3JjL21pbkVyci5qc1xuY29uc3QgYW5ndWxhclBhdHRlcm4gPSAvXlxcWygoPzpbJGEtekEtWjAtOV0rOik/KD86WyRhLXpBLVowLTldKykpXFxdICguKj8pXFxuPyhcXFMrKSQvO1xuXG4vKipcbiAqIEFuZ3VsYXJKUyBpbnRlZ3JhdGlvblxuICpcbiAqIFByb3ZpZGVzIGFuICRleGNlcHRpb25IYW5kbGVyIGZvciBBbmd1bGFySlNcbiAqL1xuZXhwb3J0IGNsYXNzIEFuZ3VsYXIgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ0FuZ3VsYXJKUyc7XG5cbiAgLyoqXG4gICAqIG1vZHVsZU5hbWUgdXNlZCBpbiBBbmd1bGFyJ3MgREkgcmVzb2x1dGlvbiBhbGdvcml0aG1cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbW9kdWxlTmFtZTogc3RyaW5nID0gJ25nU2VudHJ5JztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBBbmd1bGFyLmlkO1xuXG4gIC8qKlxuICAgKiBBbmd1bGFyJ3MgaW5zdGFuY2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FuZ3VsYXI6IGFueTtcblxuICAvKipcbiAgICogbmdTZW50cnkgbW9kdWxlIGluc3RhbmNlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHJlYWRvbmx5IF9tb2R1bGU6IGFueTtcblxuICAvKipcbiAgICogUmV0dXJucyBjdXJyZW50IGh1Yi5cbiAgICovXG4gIHByaXZhdGUgX2dldEN1cnJlbnRIdWI/OiAoKSA9PiBIdWI7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogeyBhbmd1bGFyPzogYW55IH0gPSB7fSkge1xuICAgIGxvZ2dlci5sb2coJ1lvdSBhcmUgc3RpbGwgdXNpbmcgdGhlIEFuZ3VsYXIgaW50ZWdyYXRpb24sIGNvbnNpZGVyIG1vdmluZyB0byBAc2VudHJ5L2FuZ3VsYXInKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICB0aGlzLl9hbmd1bGFyID0gb3B0aW9ucy5hbmd1bGFyIHx8IGdldEdsb2JhbE9iamVjdDxhbnk+KCkuYW5ndWxhcjtcblxuICAgIGlmICghdGhpcy5fYW5ndWxhcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdBbmd1bGFySW50ZWdyYXRpb24gaXMgbWlzc2luZyBhbiBBbmd1bGFyIGluc3RhbmNlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIHRoaXMuX21vZHVsZSA9IHRoaXMuX2FuZ3VsYXIubW9kdWxlKEFuZ3VsYXIubW9kdWxlTmFtZSwgW10pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKF86IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fbW9kdWxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0Q3VycmVudEh1YiA9IGdldEN1cnJlbnRIdWI7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgdGhpcy5fbW9kdWxlLmNvbmZpZyhbXG4gICAgICAnJHByb3ZpZGUnLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICgkcHJvdmlkZTogYW55KTogdm9pZCA9PiB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgJHByb3ZpZGUuZGVjb3JhdG9yKCckZXhjZXB0aW9uSGFuZGxlcicsIFsnJGRlbGVnYXRlJywgdGhpcy5fJGV4Y2VwdGlvbkhhbmRsZXJEZWNvcmF0b3IuYmluZCh0aGlzKV0pO1xuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbmd1bGFyJ3MgZXhjZXB0aW9uSGFuZGxlciBmb3IgU2VudHJ5IGludGVncmF0aW9uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIF8kZXhjZXB0aW9uSGFuZGxlckRlY29yYXRvcigkZGVsZWdhdGU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIChleGNlcHRpb246IEVycm9yLCBjYXVzZT86IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgaHViID0gdGhpcy5fZ2V0Q3VycmVudEh1YiAmJiB0aGlzLl9nZXRDdXJyZW50SHViKCk7XG5cbiAgICAgIGlmIChodWIgJiYgaHViLmdldEludGVncmF0aW9uKEFuZ3VsYXIpKSB7XG4gICAgICAgIGh1Yi53aXRoU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICAgIGlmIChjYXVzZSkge1xuICAgICAgICAgICAgc2NvcGUuc2V0RXh0cmEoJ2NhdXNlJywgY2F1c2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjb3BlLmFkZEV2ZW50UHJvY2Vzc29yKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4ID0gZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXTtcblxuICAgICAgICAgICAgaWYgKGV4KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBhbmd1bGFyUGF0dGVybi5leGVjKGV4LnZhbHVlIHx8ICcnKTtcblxuICAgICAgICAgICAgICBpZiAobWF0Y2hlcykge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgdHlwZSBub3cgYmVjb21lcyBzb21ldGhpbmcgbGlrZTogJHJvb3RTY29wZTppbnByb2dcbiAgICAgICAgICAgICAgICBleC50eXBlID0gbWF0Y2hlc1sxXTtcbiAgICAgICAgICAgICAgICBleC52YWx1ZSA9IG1hdGNoZXNbMl07XG4gICAgICAgICAgICAgICAgZXZlbnQubWVzc2FnZSA9IGAke2V4LnR5cGV9OiAke2V4LnZhbHVlfWA7XG4gICAgICAgICAgICAgICAgLy8gYXV0byBzZXQgYSBuZXcgdGFnIHNwZWNpZmljYWxseSBmb3IgdGhlIGFuZ3VsYXIgZXJyb3IgdXJsXG4gICAgICAgICAgICAgICAgZXZlbnQuZXh0cmEgPSB7XG4gICAgICAgICAgICAgICAgICAuLi5ldmVudC5leHRyYSxcbiAgICAgICAgICAgICAgICAgIGFuZ3VsYXJEb2NzOiBtYXRjaGVzWzNdLnN1YnN0cigwLCAyNTApLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGV2ZW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaHViLmNhcHR1cmVFeGNlcHRpb24oZXhjZXB0aW9uKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAkZGVsZWdhdGUoZXhjZXB0aW9uLCBjYXVzZSk7XG4gICAgfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBIdWIsIEludGVncmF0aW9uLCBTZXZlcml0eSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZmlsbCwgZ2V0R2xvYmFsT2JqZWN0LCBzYWZlSm9pbiB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93IHwgTm9kZUpTLkdsb2JhbD4oKTtcblxuLyoqIFNlbmQgQ29uc29sZSBBUEkgY2FsbHMgYXMgU2VudHJ5IEV2ZW50cyAqL1xuZXhwb3J0IGNsYXNzIENhcHR1cmVDb25zb2xlIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdDYXB0dXJlQ29uc29sZSc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gQ2FwdHVyZUNvbnNvbGUuaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9sZXZlbHM6IHN0cmluZ1tdID0gWydsb2cnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2RlYnVnJywgJ2Fzc2VydCddO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgbGV2ZWxzPzogc3RyaW5nW10gfSA9IHt9KSB7XG4gICAgaWYgKG9wdGlvbnMubGV2ZWxzKSB7XG4gICAgICB0aGlzLl9sZXZlbHMgPSBvcHRpb25zLmxldmVscztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoXzogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgaWYgKCEoJ2NvbnNvbGUnIGluIGdsb2JhbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9sZXZlbHMuZm9yRWFjaCgobGV2ZWw6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCEobGV2ZWwgaW4gZ2xvYmFsLmNvbnNvbGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGZpbGwoZ2xvYmFsLmNvbnNvbGUsIGxldmVsLCAob3JpZ2luYWxDb25zb2xlTGV2ZWw6ICgpID0+IGFueSkgPT4gKC4uLmFyZ3M6IGFueVtdKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcblxuICAgICAgICBpZiAoaHViLmdldEludGVncmF0aW9uKENhcHR1cmVDb25zb2xlKSkge1xuICAgICAgICAgIGh1Yi53aXRoU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICAgICAgc2NvcGUuc2V0TGV2ZWwoU2V2ZXJpdHkuZnJvbVN0cmluZyhsZXZlbCkpO1xuICAgICAgICAgICAgc2NvcGUuc2V0RXh0cmEoJ2FyZ3VtZW50cycsIGFyZ3MpO1xuICAgICAgICAgICAgc2NvcGUuYWRkRXZlbnRQcm9jZXNzb3IoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICBldmVudC5sb2dnZXIgPSAnY29uc29sZSc7XG4gICAgICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IHNhZmVKb2luKGFyZ3MsICcgJyk7XG4gICAgICAgICAgICBpZiAobGV2ZWwgPT09ICdhc3NlcnQnKSB7XG4gICAgICAgICAgICAgIGlmIChhcmdzWzBdID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQXNzZXJ0aW9uIGZhaWxlZDogJHtzYWZlSm9pbihhcmdzLnNsaWNlKDEpLCAnICcpIHx8ICdjb25zb2xlLmFzc2VydCd9YDtcbiAgICAgICAgICAgICAgICBzY29wZS5zZXRFeHRyYSgnYXJndW1lbnRzJywgYXJncy5zbGljZSgxKSk7XG4gICAgICAgICAgICAgICAgaHViLmNhcHR1cmVNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsID09PSAnZXJyb3InICYmIGFyZ3NbMF0gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICBodWIuY2FwdHVyZUV4Y2VwdGlvbihhcmdzWzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGh1Yi5jYXB0dXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMgZmFpbHMgZm9yIHNvbWUgYnJvd3NlcnMuIDooXG4gICAgICAgIGlmIChvcmlnaW5hbENvbnNvbGVMZXZlbCkge1xuICAgICAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKG9yaWdpbmFsQ29uc29sZUxldmVsLCBnbG9iYWwuY29uc29sZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnQsIEV2ZW50SGludCwgRXZlbnRQcm9jZXNzb3IsIEh1YiwgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGNvbnNvbGVTYW5kYm94IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8qKiBKU0RvYyAqL1xuaW50ZXJmYWNlIERlYnVnT3B0aW9ucyB7XG4gIHN0cmluZ2lmeT86IGJvb2xlYW47XG4gIGRlYnVnZ2VyPzogYm9vbGVhbjtcbn1cblxuLyoqIEpTRG9jICovXG5leHBvcnQgY2xhc3MgRGVidWcgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ0RlYnVnJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBEZWJ1Zy5pZDtcblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczogRGVidWdPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM/OiBEZWJ1Z09wdGlvbnMpIHtcbiAgICB0aGlzLl9vcHRpb25zID0ge1xuICAgICAgZGVidWdnZXI6IGZhbHNlLFxuICAgICAgc3RyaW5naWZ5OiBmYWxzZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShhZGRHbG9iYWxFdmVudFByb2Nlc3NvcjogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IoKGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZiA9IGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihEZWJ1Zyk7XG4gICAgICBpZiAoc2VsZikge1xuICAgICAgICBpZiAoc2VsZi5fb3B0aW9ucy5kZWJ1Z2dlcikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlclxuICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tY29uc29sZSAqL1xuICAgICAgICBjb25zb2xlU2FuZGJveCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHNlbGYuX29wdGlvbnMuc3RyaW5naWZ5KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuICAgICAgICAgICAgaWYgKGhpbnQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoaGludCwgbnVsbCwgMikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XG4gICAgICAgICAgICBpZiAoaGludCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhoaW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50LCBFdmVudFByb2Nlc3NvciwgRXhjZXB0aW9uLCBIdWIsIEludGVncmF0aW9uLCBTdGFja0ZyYW1lIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqIERlZHVwbGljYXRpb24gZmlsdGVyICovXG5leHBvcnQgY2xhc3MgRGVkdXBlIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdEZWR1cGUnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IERlZHVwZS5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgX3ByZXZpb3VzRXZlbnQ/OiBFdmVudDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3I6IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKChjdXJyZW50RXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKERlZHVwZSk7XG4gICAgICBpZiAoc2VsZikge1xuICAgICAgICAvLyBKdXV1c3QgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZ1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChzZWxmLl9zaG91bGREcm9wRXZlbnQoY3VycmVudEV2ZW50LCBzZWxmLl9wcmV2aW91c0V2ZW50KSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV2ZW50IGRyb3BwZWQgZHVlIHRvIGJlaW5nIGEgZHVwbGljYXRlIG9mIHByZXZpb3VzbHkgY2FwdHVyZWQgZXZlbnQuYCk7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgICAgIHJldHVybiAoc2VsZi5fcHJldmlvdXNFdmVudCA9IGN1cnJlbnRFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKHNlbGYuX3ByZXZpb3VzRXZlbnQgPSBjdXJyZW50RXZlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGN1cnJlbnRFdmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9zaG91bGREcm9wRXZlbnQoY3VycmVudEV2ZW50OiBFdmVudCwgcHJldmlvdXNFdmVudD86IEV2ZW50KTogYm9vbGVhbiB7XG4gICAgaWYgKCFwcmV2aW91c0V2ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2FtZU1lc3NhZ2VFdmVudChjdXJyZW50RXZlbnQsIHByZXZpb3VzRXZlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5faXNTYW1lRXhjZXB0aW9uRXZlbnQoY3VycmVudEV2ZW50LCBwcmV2aW91c0V2ZW50KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2lzU2FtZU1lc3NhZ2VFdmVudChjdXJyZW50RXZlbnQ6IEV2ZW50LCBwcmV2aW91c0V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGN1cnJlbnRNZXNzYWdlID0gY3VycmVudEV2ZW50Lm1lc3NhZ2U7XG4gICAgY29uc3QgcHJldmlvdXNNZXNzYWdlID0gcHJldmlvdXNFdmVudC5tZXNzYWdlO1xuXG4gICAgLy8gSWYgbmVpdGhlciBldmVudCBoYXMgYSBtZXNzYWdlIHByb3BlcnR5LCB0aGV5IHdlcmUgYm90aCBleGNlcHRpb25zLCBzbyBiYWlsIG91dFxuICAgIGlmICghY3VycmVudE1lc3NhZ2UgJiYgIXByZXZpb3VzTWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIElmIG9ubHkgb25lIGV2ZW50IGhhcyBhIHN0YWNrdHJhY2UsIGJ1dCBub3QgdGhlIG90aGVyIG9uZSwgdGhleSBhcmUgbm90IHRoZSBzYW1lXG4gICAgaWYgKChjdXJyZW50TWVzc2FnZSAmJiAhcHJldmlvdXNNZXNzYWdlKSB8fCAoIWN1cnJlbnRNZXNzYWdlICYmIHByZXZpb3VzTWVzc2FnZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudE1lc3NhZ2UgIT09IHByZXZpb3VzTWVzc2FnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNTYW1lRmluZ2VycHJpbnQoY3VycmVudEV2ZW50LCBwcmV2aW91c0V2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5faXNTYW1lU3RhY2t0cmFjZShjdXJyZW50RXZlbnQsIHByZXZpb3VzRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfZ2V0RnJhbWVzRnJvbUV2ZW50KGV2ZW50OiBFdmVudCk6IFN0YWNrRnJhbWVbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uO1xuXG4gICAgaWYgKGV4Y2VwdGlvbikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBPYmplY3QgY291bGQgYmUgdW5kZWZpbmVkXG4gICAgICAgIHJldHVybiBleGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UuZnJhbWVzO1xuICAgICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudC5zdGFja3RyYWNlKSB7XG4gICAgICByZXR1cm4gZXZlbnQuc3RhY2t0cmFjZS5mcmFtZXM7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfaXNTYW1lU3RhY2t0cmFjZShjdXJyZW50RXZlbnQ6IEV2ZW50LCBwcmV2aW91c0V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBjdXJyZW50RnJhbWVzID0gdGhpcy5fZ2V0RnJhbWVzRnJvbUV2ZW50KGN1cnJlbnRFdmVudCk7XG4gICAgbGV0IHByZXZpb3VzRnJhbWVzID0gdGhpcy5fZ2V0RnJhbWVzRnJvbUV2ZW50KHByZXZpb3VzRXZlbnQpO1xuXG4gICAgLy8gSWYgbmVpdGhlciBldmVudCBoYXMgYSBzdGFja3RyYWNlLCB0aGV5IGFyZSBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lXG4gICAgaWYgKCFjdXJyZW50RnJhbWVzICYmICFwcmV2aW91c0ZyYW1lcykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gSWYgb25seSBvbmUgZXZlbnQgaGFzIGEgc3RhY2t0cmFjZSwgYnV0IG5vdCB0aGUgb3RoZXIgb25lLCB0aGV5IGFyZSBub3QgdGhlIHNhbWVcbiAgICBpZiAoKGN1cnJlbnRGcmFtZXMgJiYgIXByZXZpb3VzRnJhbWVzKSB8fCAoIWN1cnJlbnRGcmFtZXMgJiYgcHJldmlvdXNGcmFtZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY3VycmVudEZyYW1lcyA9IGN1cnJlbnRGcmFtZXMgYXMgU3RhY2tGcmFtZVtdO1xuICAgIHByZXZpb3VzRnJhbWVzID0gcHJldmlvdXNGcmFtZXMgYXMgU3RhY2tGcmFtZVtdO1xuXG4gICAgLy8gSWYgbnVtYmVyIG9mIGZyYW1lcyBkaWZmZXIsIHRoZXkgYXJlIG5vdCB0aGUgc2FtZVxuICAgIGlmIChwcmV2aW91c0ZyYW1lcy5sZW5ndGggIT09IGN1cnJlbnRGcmFtZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gT3RoZXJ3aXNlLCBjb21wYXJlIHRoZSB0d29cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzRnJhbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmcmFtZUEgPSBwcmV2aW91c0ZyYW1lc1tpXTtcbiAgICAgIGNvbnN0IGZyYW1lQiA9IGN1cnJlbnRGcmFtZXNbaV07XG5cbiAgICAgIGlmIChcbiAgICAgICAgZnJhbWVBLmZpbGVuYW1lICE9PSBmcmFtZUIuZmlsZW5hbWUgfHxcbiAgICAgICAgZnJhbWVBLmxpbmVubyAhPT0gZnJhbWVCLmxpbmVubyB8fFxuICAgICAgICBmcmFtZUEuY29sbm8gIT09IGZyYW1lQi5jb2xubyB8fFxuICAgICAgICBmcmFtZUEuZnVuY3Rpb24gIT09IGZyYW1lQi5mdW5jdGlvblxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9nZXRFeGNlcHRpb25Gcm9tRXZlbnQoZXZlbnQ6IEV2ZW50KTogRXhjZXB0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9pc1NhbWVFeGNlcHRpb25FdmVudChjdXJyZW50RXZlbnQ6IEV2ZW50LCBwcmV2aW91c0V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHByZXZpb3VzRXhjZXB0aW9uID0gdGhpcy5fZ2V0RXhjZXB0aW9uRnJvbUV2ZW50KHByZXZpb3VzRXZlbnQpO1xuICAgIGNvbnN0IGN1cnJlbnRFeGNlcHRpb24gPSB0aGlzLl9nZXRFeGNlcHRpb25Gcm9tRXZlbnQoY3VycmVudEV2ZW50KTtcblxuICAgIGlmICghcHJldmlvdXNFeGNlcHRpb24gfHwgIWN1cnJlbnRFeGNlcHRpb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJldmlvdXNFeGNlcHRpb24udHlwZSAhPT0gY3VycmVudEV4Y2VwdGlvbi50eXBlIHx8IHByZXZpb3VzRXhjZXB0aW9uLnZhbHVlICE9PSBjdXJyZW50RXhjZXB0aW9uLnZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc1NhbWVGaW5nZXJwcmludChjdXJyZW50RXZlbnQsIHByZXZpb3VzRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9pc1NhbWVTdGFja3RyYWNlKGN1cnJlbnRFdmVudCwgcHJldmlvdXNFdmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9pc1NhbWVGaW5nZXJwcmludChjdXJyZW50RXZlbnQ6IEV2ZW50LCBwcmV2aW91c0V2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgIGxldCBjdXJyZW50RmluZ2VycHJpbnQgPSBjdXJyZW50RXZlbnQuZmluZ2VycHJpbnQ7XG4gICAgbGV0IHByZXZpb3VzRmluZ2VycHJpbnQgPSBwcmV2aW91c0V2ZW50LmZpbmdlcnByaW50O1xuXG4gICAgLy8gSWYgbmVpdGhlciBldmVudCBoYXMgYSBmaW5nZXJwcmludCwgdGhleSBhcmUgYXNzdW1lZCB0byBiZSB0aGUgc2FtZVxuICAgIGlmICghY3VycmVudEZpbmdlcnByaW50ICYmICFwcmV2aW91c0ZpbmdlcnByaW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBJZiBvbmx5IG9uZSBldmVudCBoYXMgYSBmaW5nZXJwcmludCwgYnV0IG5vdCB0aGUgb3RoZXIgb25lLCB0aGV5IGFyZSBub3QgdGhlIHNhbWVcbiAgICBpZiAoKGN1cnJlbnRGaW5nZXJwcmludCAmJiAhcHJldmlvdXNGaW5nZXJwcmludCkgfHwgKCFjdXJyZW50RmluZ2VycHJpbnQgJiYgcHJldmlvdXNGaW5nZXJwcmludCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjdXJyZW50RmluZ2VycHJpbnQgPSBjdXJyZW50RmluZ2VycHJpbnQgYXMgc3RyaW5nW107XG4gICAgcHJldmlvdXNGaW5nZXJwcmludCA9IHByZXZpb3VzRmluZ2VycHJpbnQgYXMgc3RyaW5nW107XG5cbiAgICAvLyBPdGhlcndpc2UsIGNvbXBhcmUgdGhlIHR3b1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISEoY3VycmVudEZpbmdlcnByaW50LmpvaW4oJycpID09PSBwcmV2aW91c0ZpbmdlcnByaW50LmpvaW4oJycpKTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudFByb2Nlc3NvciwgSHViLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBpc0luc3RhbmNlT2YsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBjbGFzcyBFbWJlciBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnRW1iZXInO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IEVtYmVyLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvbiwgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIHJlYWRvbmx5IF9FbWJlcjogYW55O1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgRW1iZXI/OiBhbnkgfSA9IHt9KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgIHRoaXMuX0VtYmVyID0gb3B0aW9ucy5FbWJlciB8fCBnZXRHbG9iYWxPYmplY3Q8YW55PigpLkVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKF86IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fRW1iZXIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignRW1iZXJJbnRlZ3JhdGlvbiBpcyBtaXNzaW5nIGFuIEVtYmVyIGluc3RhbmNlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgY29uc3Qgb2xkT25FcnJvciA9IHRoaXMuX0VtYmVyLm9uZXJyb3I7XG5cbiAgICB0aGlzLl9FbWJlci5vbmVycm9yID0gKGVycm9yOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgaWYgKGdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihFbWJlcikpIHtcbiAgICAgICAgZ2V0Q3VycmVudEh1YigpLmNhcHR1cmVFeGNlcHRpb24oZXJyb3IsIHsgb3JpZ2luYWxFeGNlcHRpb246IGVycm9yIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9sZE9uRXJyb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2xkT25FcnJvci5jYWxsKHRoaXMuX0VtYmVyLCBlcnJvcik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuX0VtYmVyLnRlc3RpbmcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdGhpcy5fRW1iZXIuUlNWUC5vbignZXJyb3InLCAocmVhc29uOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICBpZiAoZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKEVtYmVyKSkge1xuICAgICAgICBnZXRDdXJyZW50SHViKCkud2l0aFNjb3BlKHNjb3BlID0+IHtcbiAgICAgICAgICBpZiAoaXNJbnN0YW5jZU9mKHJlYXNvbiwgRXJyb3IpKSB7XG4gICAgICAgICAgICBzY29wZS5zZXRFeHRyYSgnY29udGV4dCcsICdVbmhhbmRsZWQgUHJvbWlzZSBlcnJvciBkZXRlY3RlZCcpO1xuICAgICAgICAgICAgZ2V0Q3VycmVudEh1YigpLmNhcHR1cmVFeGNlcHRpb24ocmVhc29uLCB7IG9yaWdpbmFsRXhjZXB0aW9uOiByZWFzb24gYXMgRXJyb3IgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjb3BlLnNldEV4dHJhKCdyZWFzb24nLCByZWFzb24pO1xuICAgICAgICAgICAgZ2V0Q3VycmVudEh1YigpLmNhcHR1cmVNZXNzYWdlKCdVbmhhbmRsZWQgUHJvbWlzZSBlcnJvciBkZXRlY3RlZCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgRXZlbnRIaW50LCBFdmVudFByb2Nlc3NvciwgRXh0ZW5kZWRFcnJvciwgSHViLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgaXNFcnJvciwgaXNQbGFpbk9iamVjdCwgbG9nZ2VyLCBub3JtYWxpemUgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgRXh0cmFFcnJvckRhdGFPcHRpb25zIHtcbiAgZGVwdGg/OiBudW1iZXI7XG59XG5cbi8qKiBQYXRjaCB0b1N0cmluZyBjYWxscyB0byByZXR1cm4gcHJvcGVyIG5hbWUgZm9yIHdyYXBwZWQgZnVuY3Rpb25zICovXG5leHBvcnQgY2xhc3MgRXh0cmFFcnJvckRhdGEgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ0V4dHJhRXJyb3JEYXRhJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBFeHRyYUVycm9yRGF0YS5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiBFeHRyYUVycm9yRGF0YU9wdGlvbnMgPSB7IGRlcHRoOiAzIH0pIHt9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KSA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKEV4dHJhRXJyb3JEYXRhKTtcbiAgICAgIGlmICghc2VsZikge1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VsZi5lbmhhbmNlRXZlbnRXaXRoRXJyb3JEYXRhKGV2ZW50LCBoaW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyBleHRyYWN0ZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgRXJyb3Igb2JqZWN0IHRvIGV4dHJhIGZpZWxkIGluIHRoZSBFdmVudFxuICAgKi9cbiAgcHVibGljIGVuaGFuY2VFdmVudFdpdGhFcnJvckRhdGEoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KTogRXZlbnQge1xuICAgIGlmICghaGludCB8fCAhaGludC5vcmlnaW5hbEV4Y2VwdGlvbiB8fCAhaXNFcnJvcihoaW50Lm9yaWdpbmFsRXhjZXB0aW9uKSkge1xuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH1cbiAgICBjb25zdCBuYW1lID0gKGhpbnQub3JpZ2luYWxFeGNlcHRpb24gYXMgRXh0ZW5kZWRFcnJvcikubmFtZSB8fCBoaW50Lm9yaWdpbmFsRXhjZXB0aW9uLmNvbnN0cnVjdG9yLm5hbWU7XG5cbiAgICBjb25zdCBlcnJvckRhdGEgPSB0aGlzLl9leHRyYWN0RXJyb3JEYXRhKGhpbnQub3JpZ2luYWxFeGNlcHRpb24gYXMgRXh0ZW5kZWRFcnJvcik7XG5cbiAgICBpZiAoZXJyb3JEYXRhKSB7XG4gICAgICBsZXQgY29udGV4dHMgPSB7XG4gICAgICAgIC4uLmV2ZW50LmNvbnRleHRzLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yRGF0YSA9IG5vcm1hbGl6ZShlcnJvckRhdGEsIHRoaXMuX29wdGlvbnMuZGVwdGgpO1xuICAgICAgaWYgKGlzUGxhaW5PYmplY3Qobm9ybWFsaXplZEVycm9yRGF0YSkpIHtcbiAgICAgICAgY29udGV4dHMgPSB7XG4gICAgICAgICAgLi4uZXZlbnQuY29udGV4dHMsXG4gICAgICAgICAgW25hbWVdOiB7XG4gICAgICAgICAgICAuLi5ub3JtYWxpemVkRXJyb3JEYXRhLFxuICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBjb250ZXh0cyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3QgZXh0cmEgaW5mb3JtYXRpb24gZnJvbSB0aGUgRXJyb3Igb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIF9leHRyYWN0RXJyb3JEYXRhKGVycm9yOiBFeHRlbmRlZEVycm9yKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsIHtcbiAgICAvLyBXZSBhcmUgdHJ5aW5nIHRvIGVuaGFuY2UgYWxyZWFkeSBleGlzdGluZyBldmVudCwgc28gbm8gaGFybSBkb25lIGlmIGl0IHdvbid0IHN1Y2NlZWRcbiAgICB0cnkge1xuICAgICAgY29uc3QgbmF0aXZlS2V5cyA9IFtcbiAgICAgICAgJ25hbWUnLFxuICAgICAgICAnbWVzc2FnZScsXG4gICAgICAgICdzdGFjaycsXG4gICAgICAgICdsaW5lJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdmaWxlTmFtZScsXG4gICAgICAgICdsaW5lTnVtYmVyJyxcbiAgICAgICAgJ2NvbHVtbk51bWJlcicsXG4gICAgICAgICd0b0pTT04nLFxuICAgICAgXTtcblxuICAgICAgY29uc3QgZXh0cmFFcnJvckluZm86IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgICAgIC8vIFdlIHdhbnQgb25seSBlbnVtZXJhYmxlIHByb3BlcnRpZXMsIHRodXMgYGdldE93blByb3BlcnR5TmFtZXNgIGlzIHJlZHVuZGFudCBoZXJlLCBhcyB3ZSBmaWx0ZXIga2V5cyBhbnl3YXkuXG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhlcnJvcikpIHtcbiAgICAgICAgaWYgKG5hdGl2ZUtleXMuaW5kZXhPZihrZXkpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZXJyb3Jba2V5XTtcbiAgICAgICAgZXh0cmFFcnJvckluZm9ba2V5XSA9IGlzRXJyb3IodmFsdWUpID8gKHZhbHVlIGFzIEVycm9yKS50b1N0cmluZygpIDogdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHNvbWVvbmUgYXR0YWNoZWQgYHRvSlNPTmAgbWV0aG9kIHRvIGdyYWIgZXZlbiBtb3JlIHByb3BlcnRpZXMgKGVnLiBheGlvcyBpcyBkb2luZyB0aGF0KVxuICAgICAgaWYgKHR5cGVvZiBlcnJvci50b0pTT04gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZEVycm9yID0gZXJyb3IudG9KU09OKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2VyaWFsaXplZEVycm9yKSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc2VyaWFsaXplZEVycm9yW2tleV07XG4gICAgICAgICAgZXh0cmFFcnJvckluZm9ba2V5XSA9IGlzRXJyb3IodmFsdWUpID8gKHZhbHVlIGFzIEVycm9yKS50b1N0cmluZygpIDogdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV4dHJhRXJyb3JJbmZvO1xuICAgIH0gY2F0Y2ggKG9PKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1VuYWJsZSB0byBleHRyYWN0IGV4dHJhIGRhdGEgZnJvbSB0aGUgRXJyb3Igb2JqZWN0OicsIG9PKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIiwgIi8qIVxuICAgIGxvY2FsRm9yYWdlIC0tIE9mZmxpbmUgU3RvcmFnZSwgSW1wcm92ZWRcbiAgICBWZXJzaW9uIDEuMTAuMFxuICAgIGh0dHBzOi8vbG9jYWxmb3JhZ2UuZ2l0aHViLmlvL2xvY2FsRm9yYWdlXG4gICAgKGMpIDIwMTMtMjAxNyBNb3ppbGxhLCBBcGFjaGUgTGljZW5zZSAyLjBcbiovXG4oZnVuY3Rpb24oZil7aWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiJiZ0eXBlb2YgbW9kdWxlIT09XCJ1bmRlZmluZWRcIil7bW9kdWxlLmV4cG9ydHM9ZigpfWVsc2UgaWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKFtdLGYpfWVsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PVwidW5kZWZpbmVkXCIpe2c9d2luZG93fWVsc2UgaWYodHlwZW9mIGdsb2JhbCE9PVwidW5kZWZpbmVkXCIpe2c9Z2xvYmFsfWVsc2UgaWYodHlwZW9mIHNlbGYhPT1cInVuZGVmaW5lZFwiKXtnPXNlbGZ9ZWxzZXtnPXRoaXN9Zy5sb2NhbGZvcmFnZSA9IGYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIChmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyAoZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLCBmKX12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pKHsxOltmdW5jdGlvbihfZGVyZXFfLG1vZHVsZSxleHBvcnRzKXtcbihmdW5jdGlvbiAoZ2xvYmFsKXtcbid1c2Ugc3RyaWN0JztcbnZhciBNdXRhdGlvbiA9IGdsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IGdsb2JhbC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG52YXIgc2NoZWR1bGVEcmFpbjtcblxue1xuICBpZiAoTXV0YXRpb24pIHtcbiAgICB2YXIgY2FsbGVkID0gMDtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb24obmV4dFRpY2spO1xuICAgIHZhciBlbGVtZW50ID0gZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHtcbiAgICAgIGNoYXJhY3RlckRhdGE6IHRydWVcbiAgICB9KTtcbiAgICBzY2hlZHVsZURyYWluID0gZnVuY3Rpb24gKCkge1xuICAgICAgZWxlbWVudC5kYXRhID0gKGNhbGxlZCA9ICsrY2FsbGVkICUgMik7XG4gICAgfTtcbiAgfSBlbHNlIGlmICghZ2xvYmFsLnNldEltbWVkaWF0ZSAmJiB0eXBlb2YgZ2xvYmFsLk1lc3NhZ2VDaGFubmVsICE9PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBjaGFubmVsID0gbmV3IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbCgpO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbmV4dFRpY2s7XG4gICAgc2NoZWR1bGVEcmFpbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4gICAgfTtcbiAgfSBlbHNlIGlmICgnZG9jdW1lbnQnIGluIGdsb2JhbCAmJiAnb25yZWFkeXN0YXRlY2hhbmdlJyBpbiBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpIHtcbiAgICBzY2hlZHVsZURyYWluID0gZnVuY3Rpb24gKCkge1xuXG4gICAgICAvLyBDcmVhdGUgYSA8c2NyaXB0PiBlbGVtZW50OyBpdHMgcmVhZHlzdGF0ZWNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIGFzeW5jaHJvbm91c2x5IG9uY2UgaXQgaXMgaW5zZXJ0ZWRcbiAgICAgIC8vIGludG8gdGhlIGRvY3VtZW50LiBEbyBzbywgdGh1cyBxdWV1aW5nIHVwIHRoZSB0YXNrLiBSZW1lbWJlciB0byBjbGVhbiB1cCBvbmNlIGl0J3MgYmVlbiBjYWxsZWQuXG4gICAgICB2YXIgc2NyaXB0RWwgPSBnbG9iYWwuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIG5leHRUaWNrKCk7XG5cbiAgICAgICAgc2NyaXB0RWwub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcbiAgICAgICAgc2NyaXB0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHRFbCk7XG4gICAgICAgIHNjcmlwdEVsID0gbnVsbDtcbiAgICAgIH07XG4gICAgICBnbG9iYWwuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKHNjcmlwdEVsKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHNjaGVkdWxlRHJhaW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBzZXRUaW1lb3V0KG5leHRUaWNrLCAwKTtcbiAgICB9O1xuICB9XG59XG5cbnZhciBkcmFpbmluZztcbnZhciBxdWV1ZSA9IFtdO1xuLy9uYW1lZCBuZXh0VGljayBmb3IgbGVzcyBjb25mdXNpbmcgc3RhY2sgdHJhY2VzXG5mdW5jdGlvbiBuZXh0VGljaygpIHtcbiAgZHJhaW5pbmcgPSB0cnVlO1xuICB2YXIgaSwgb2xkUXVldWU7XG4gIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gIHdoaWxlIChsZW4pIHtcbiAgICBvbGRRdWV1ZSA9IHF1ZXVlO1xuICAgIHF1ZXVlID0gW107XG4gICAgaSA9IC0xO1xuICAgIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICAgIG9sZFF1ZXVlW2ldKCk7XG4gICAgfVxuICAgIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgfVxuICBkcmFpbmluZyA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGltbWVkaWF0ZTtcbmZ1bmN0aW9uIGltbWVkaWF0ZSh0YXNrKSB7XG4gIGlmIChxdWV1ZS5wdXNoKHRhc2spID09PSAxICYmICFkcmFpbmluZykge1xuICAgIHNjaGVkdWxlRHJhaW4oKTtcbiAgfVxufVxuXG59KS5jYWxsKHRoaXMsdHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSBcInVuZGVmaW5lZFwiID8gc2VsZiA6IHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB7fSlcbn0se31dLDI6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xudmFyIGltbWVkaWF0ZSA9IF9kZXJlcV8oMSk7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5mdW5jdGlvbiBJTlRFUk5BTCgpIHt9XG5cbnZhciBoYW5kbGVycyA9IHt9O1xuXG52YXIgUkVKRUNURUQgPSBbJ1JFSkVDVEVEJ107XG52YXIgRlVMRklMTEVEID0gWydGVUxGSUxMRUQnXTtcbnZhciBQRU5ESU5HID0gWydQRU5ESU5HJ107XG5cbm1vZHVsZS5leHBvcnRzID0gUHJvbWlzZTtcblxuZnVuY3Rpb24gUHJvbWlzZShyZXNvbHZlcikge1xuICBpZiAodHlwZW9mIHJlc29sdmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVzb2x2ZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cbiAgdGhpcy5zdGF0ZSA9IFBFTkRJTkc7XG4gIHRoaXMucXVldWUgPSBbXTtcbiAgdGhpcy5vdXRjb21lID0gdm9pZCAwO1xuICBpZiAocmVzb2x2ZXIgIT09IElOVEVSTkFMKSB7XG4gICAgc2FmZWx5UmVzb2x2ZVRoZW5hYmxlKHRoaXMsIHJlc29sdmVyKTtcbiAgfVxufVxuXG5Qcm9taXNlLnByb3RvdHlwZVtcImNhdGNoXCJdID0gZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgcmV0dXJuIHRoaXMudGhlbihudWxsLCBvblJlamVjdGVkKTtcbn07XG5Qcm9taXNlLnByb3RvdHlwZS50aGVuID0gZnVuY3Rpb24gKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gIGlmICh0eXBlb2Ygb25GdWxmaWxsZWQgIT09ICdmdW5jdGlvbicgJiYgdGhpcy5zdGF0ZSA9PT0gRlVMRklMTEVEIHx8XG4gICAgdHlwZW9mIG9uUmVqZWN0ZWQgIT09ICdmdW5jdGlvbicgJiYgdGhpcy5zdGF0ZSA9PT0gUkVKRUNURUQpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB2YXIgcHJvbWlzZSA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKElOVEVSTkFMKTtcbiAgaWYgKHRoaXMuc3RhdGUgIT09IFBFTkRJTkcpIHtcbiAgICB2YXIgcmVzb2x2ZXIgPSB0aGlzLnN0YXRlID09PSBGVUxGSUxMRUQgPyBvbkZ1bGZpbGxlZCA6IG9uUmVqZWN0ZWQ7XG4gICAgdW53cmFwKHByb21pc2UsIHJlc29sdmVyLCB0aGlzLm91dGNvbWUpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMucXVldWUucHVzaChuZXcgUXVldWVJdGVtKHByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSk7XG4gIH1cblxuICByZXR1cm4gcHJvbWlzZTtcbn07XG5mdW5jdGlvbiBRdWV1ZUl0ZW0ocHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgaWYgKHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRoaXMub25GdWxmaWxsZWQgPSBvbkZ1bGZpbGxlZDtcbiAgICB0aGlzLmNhbGxGdWxmaWxsZWQgPSB0aGlzLm90aGVyQ2FsbEZ1bGZpbGxlZDtcbiAgfVxuICBpZiAodHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0aGlzLm9uUmVqZWN0ZWQgPSBvblJlamVjdGVkO1xuICAgIHRoaXMuY2FsbFJlamVjdGVkID0gdGhpcy5vdGhlckNhbGxSZWplY3RlZDtcbiAgfVxufVxuUXVldWVJdGVtLnByb3RvdHlwZS5jYWxsRnVsZmlsbGVkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGhhbmRsZXJzLnJlc29sdmUodGhpcy5wcm9taXNlLCB2YWx1ZSk7XG59O1xuUXVldWVJdGVtLnByb3RvdHlwZS5vdGhlckNhbGxGdWxmaWxsZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdW53cmFwKHRoaXMucHJvbWlzZSwgdGhpcy5vbkZ1bGZpbGxlZCwgdmFsdWUpO1xufTtcblF1ZXVlSXRlbS5wcm90b3R5cGUuY2FsbFJlamVjdGVkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGhhbmRsZXJzLnJlamVjdCh0aGlzLnByb21pc2UsIHZhbHVlKTtcbn07XG5RdWV1ZUl0ZW0ucHJvdG90eXBlLm90aGVyQ2FsbFJlamVjdGVkID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIHVud3JhcCh0aGlzLnByb21pc2UsIHRoaXMub25SZWplY3RlZCwgdmFsdWUpO1xufTtcblxuZnVuY3Rpb24gdW53cmFwKHByb21pc2UsIGZ1bmMsIHZhbHVlKSB7XG4gIGltbWVkaWF0ZShmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJldHVyblZhbHVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGZ1bmModmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBoYW5kbGVycy5yZWplY3QocHJvbWlzZSwgZSk7XG4gICAgfVxuICAgIGlmIChyZXR1cm5WYWx1ZSA9PT0gcHJvbWlzZSkge1xuICAgICAgaGFuZGxlcnMucmVqZWN0KHByb21pc2UsIG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCByZXNvbHZlIHByb21pc2Ugd2l0aCBpdHNlbGYnKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGhhbmRsZXJzLnJlc29sdmUocHJvbWlzZSwgcmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmhhbmRsZXJzLnJlc29sdmUgPSBmdW5jdGlvbiAoc2VsZiwgdmFsdWUpIHtcbiAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKGdldFRoZW4sIHZhbHVlKTtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICByZXR1cm4gaGFuZGxlcnMucmVqZWN0KHNlbGYsIHJlc3VsdC52YWx1ZSk7XG4gIH1cbiAgdmFyIHRoZW5hYmxlID0gcmVzdWx0LnZhbHVlO1xuXG4gIGlmICh0aGVuYWJsZSkge1xuICAgIHNhZmVseVJlc29sdmVUaGVuYWJsZShzZWxmLCB0aGVuYWJsZSk7XG4gIH0gZWxzZSB7XG4gICAgc2VsZi5zdGF0ZSA9IEZVTEZJTExFRDtcbiAgICBzZWxmLm91dGNvbWUgPSB2YWx1ZTtcbiAgICB2YXIgaSA9IC0xO1xuICAgIHZhciBsZW4gPSBzZWxmLnF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgICBzZWxmLnF1ZXVlW2ldLmNhbGxGdWxmaWxsZWQodmFsdWUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2VsZjtcbn07XG5oYW5kbGVycy5yZWplY3QgPSBmdW5jdGlvbiAoc2VsZiwgZXJyb3IpIHtcbiAgc2VsZi5zdGF0ZSA9IFJFSkVDVEVEO1xuICBzZWxmLm91dGNvbWUgPSBlcnJvcjtcbiAgdmFyIGkgPSAtMTtcbiAgdmFyIGxlbiA9IHNlbGYucXVldWUubGVuZ3RoO1xuICB3aGlsZSAoKytpIDwgbGVuKSB7XG4gICAgc2VsZi5xdWV1ZVtpXS5jYWxsUmVqZWN0ZWQoZXJyb3IpO1xuICB9XG4gIHJldHVybiBzZWxmO1xufTtcblxuZnVuY3Rpb24gZ2V0VGhlbihvYmopIHtcbiAgLy8gTWFrZSBzdXJlIHdlIG9ubHkgYWNjZXNzIHRoZSBhY2Nlc3NvciBvbmNlIGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjXG4gIHZhciB0aGVuID0gb2JqICYmIG9iai50aGVuO1xuICBpZiAob2JqICYmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygb2JqID09PSAnZnVuY3Rpb24nKSAmJiB0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmdW5jdGlvbiBhcHB5VGhlbigpIHtcbiAgICAgIHRoZW4uYXBwbHkob2JqLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gc2FmZWx5UmVzb2x2ZVRoZW5hYmxlKHNlbGYsIHRoZW5hYmxlKSB7XG4gIC8vIEVpdGhlciBmdWxmaWxsLCByZWplY3Qgb3IgcmVqZWN0IHdpdGggZXJyb3JcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBvbkVycm9yKHZhbHVlKSB7XG4gICAgaWYgKGNhbGxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsZWQgPSB0cnVlO1xuICAgIGhhbmRsZXJzLnJlamVjdChzZWxmLCB2YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiBvblN1Y2Nlc3ModmFsdWUpIHtcbiAgICBpZiAoY2FsbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNhbGxlZCA9IHRydWU7XG4gICAgaGFuZGxlcnMucmVzb2x2ZShzZWxmLCB2YWx1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlUb1Vud3JhcCgpIHtcbiAgICB0aGVuYWJsZShvblN1Y2Nlc3MsIG9uRXJyb3IpO1xuICB9XG5cbiAgdmFyIHJlc3VsdCA9IHRyeUNhdGNoKHRyeVRvVW53cmFwKTtcbiAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICBvbkVycm9yKHJlc3VsdC52YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdHJ5Q2F0Y2goZnVuYywgdmFsdWUpIHtcbiAgdmFyIG91dCA9IHt9O1xuICB0cnkge1xuICAgIG91dC52YWx1ZSA9IGZ1bmModmFsdWUpO1xuICAgIG91dC5zdGF0dXMgPSAnc3VjY2Vzcyc7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBvdXQuc3RhdHVzID0gJ2Vycm9yJztcbiAgICBvdXQudmFsdWUgPSBlO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cblByb21pc2UucmVzb2x2ZSA9IHJlc29sdmU7XG5mdW5jdGlvbiByZXNvbHZlKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHRoaXMpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXJzLnJlc29sdmUobmV3IHRoaXMoSU5URVJOQUwpLCB2YWx1ZSk7XG59XG5cblByb21pc2UucmVqZWN0ID0gcmVqZWN0O1xuZnVuY3Rpb24gcmVqZWN0KHJlYXNvbikge1xuICB2YXIgcHJvbWlzZSA9IG5ldyB0aGlzKElOVEVSTkFMKTtcbiAgcmV0dXJuIGhhbmRsZXJzLnJlamVjdChwcm9taXNlLCByZWFzb24pO1xufVxuXG5Qcm9taXNlLmFsbCA9IGFsbDtcbmZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlcmFibGUpICE9PSAnW29iamVjdCBBcnJheV0nKSB7XG4gICAgcmV0dXJuIHRoaXMucmVqZWN0KG5ldyBUeXBlRXJyb3IoJ211c3QgYmUgYW4gYXJyYXknKSk7XG4gIH1cblxuICB2YXIgbGVuID0gaXRlcmFibGUubGVuZ3RoO1xuICB2YXIgY2FsbGVkID0gZmFsc2U7XG4gIGlmICghbGVuKSB7XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZShbXSk7XG4gIH1cblxuICB2YXIgdmFsdWVzID0gbmV3IEFycmF5KGxlbik7XG4gIHZhciByZXNvbHZlZCA9IDA7XG4gIHZhciBpID0gLTE7XG4gIHZhciBwcm9taXNlID0gbmV3IHRoaXMoSU5URVJOQUwpO1xuXG4gIHdoaWxlICgrK2kgPCBsZW4pIHtcbiAgICBhbGxSZXNvbHZlcihpdGVyYWJsZVtpXSwgaSk7XG4gIH1cbiAgcmV0dXJuIHByb21pc2U7XG4gIGZ1bmN0aW9uIGFsbFJlc29sdmVyKHZhbHVlLCBpKSB7XG4gICAgc2VsZi5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmVGcm9tQWxsLCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIGhhbmRsZXJzLnJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgZnVuY3Rpb24gcmVzb2x2ZUZyb21BbGwob3V0VmFsdWUpIHtcbiAgICAgIHZhbHVlc1tpXSA9IG91dFZhbHVlO1xuICAgICAgaWYgKCsrcmVzb2x2ZWQgPT09IGxlbiAmJiAhY2FsbGVkKSB7XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIGhhbmRsZXJzLnJlc29sdmUocHJvbWlzZSwgdmFsdWVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuUHJvbWlzZS5yYWNlID0gcmFjZTtcbmZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGl0ZXJhYmxlKSAhPT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgIHJldHVybiB0aGlzLnJlamVjdChuZXcgVHlwZUVycm9yKCdtdXN0IGJlIGFuIGFycmF5JykpO1xuICB9XG5cbiAgdmFyIGxlbiA9IGl0ZXJhYmxlLmxlbmd0aDtcbiAgdmFyIGNhbGxlZCA9IGZhbHNlO1xuICBpZiAoIWxlbikge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmUoW10pO1xuICB9XG5cbiAgdmFyIGkgPSAtMTtcbiAgdmFyIHByb21pc2UgPSBuZXcgdGhpcyhJTlRFUk5BTCk7XG5cbiAgd2hpbGUgKCsraSA8IGxlbikge1xuICAgIHJlc29sdmVyKGl0ZXJhYmxlW2ldKTtcbiAgfVxuICByZXR1cm4gcHJvbWlzZTtcbiAgZnVuY3Rpb24gcmVzb2x2ZXIodmFsdWUpIHtcbiAgICBzZWxmLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICBjYWxsZWQgPSB0cnVlO1xuICAgICAgICBoYW5kbGVycy5yZXNvbHZlKHByb21pc2UsIHJlc3BvbnNlKTtcbiAgICAgIH1cbiAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmICghY2FsbGVkKSB7XG4gICAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICAgIGhhbmRsZXJzLnJlamVjdChwcm9taXNlLCBlcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxufSx7XCIxXCI6MX1dLDM6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuKGZ1bmN0aW9uIChnbG9iYWwpe1xuJ3VzZSBzdHJpY3QnO1xuaWYgKHR5cGVvZiBnbG9iYWwuUHJvbWlzZSAhPT0gJ2Z1bmN0aW9uJykge1xuICBnbG9iYWwuUHJvbWlzZSA9IF9kZXJlcV8oMik7XG59XG5cbn0pLmNhbGwodGhpcyx0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgPyBzZWxmIDogdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHt9KVxufSx7XCIyXCI6Mn1dLDQ6W2Z1bmN0aW9uKF9kZXJlcV8sbW9kdWxlLGV4cG9ydHMpe1xuJ3VzZSBzdHJpY3QnO1xuXG52YXIgX3R5cGVvZiA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSBcInN5bWJvbFwiID8gZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gdHlwZW9mIG9iajsgfSA6IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7IH07XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbmZ1bmN0aW9uIGdldElEQigpIHtcbiAgICAvKiBnbG9iYWwgaW5kZXhlZERCLHdlYmtpdEluZGV4ZWREQixtb3pJbmRleGVkREIsT0luZGV4ZWREQixtc0luZGV4ZWREQiAqL1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5kZXhlZERCICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIGluZGV4ZWREQjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdlYmtpdEluZGV4ZWREQiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB3ZWJraXRJbmRleGVkREI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtb3pJbmRleGVkREIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbW96SW5kZXhlZERCO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgT0luZGV4ZWREQiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiBPSW5kZXhlZERCO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbXNJbmRleGVkREIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gbXNJbmRleGVkREI7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG59XG5cbnZhciBpZGIgPSBnZXRJREIoKTtcblxuZnVuY3Rpb24gaXNJbmRleGVkREJWYWxpZCgpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBJbml0aWFsaXplIEluZGV4ZWREQjsgZmFsbCBiYWNrIHRvIHZlbmRvci1wcmVmaXhlZCB2ZXJzaW9uc1xuICAgICAgICAvLyBpZiBuZWVkZWQuXG4gICAgICAgIGlmICghaWRiIHx8ICFpZGIub3Blbikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIG1pbWljIFBvdWNoREIgaGVyZTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgdGVzdCBmb3Igb3BlbkRhdGFiYXNlIGJlY2F1c2UgSUUgTW9iaWxlIGlkZW50aWZpZXMgaXRzZWxmXG4gICAgICAgIC8vIGFzIFNhZmFyaS4gT2ggdGhlIGx1bHouLi5cbiAgICAgICAgdmFyIGlzU2FmYXJpID0gdHlwZW9mIG9wZW5EYXRhYmFzZSAhPT0gJ3VuZGVmaW5lZCcgJiYgLyhTYWZhcml8aVBob25lfGlQYWR8aVBvZCkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIS9DaHJvbWUvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgIS9CbGFja0JlcnJ5Ly50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSk7XG5cbiAgICAgICAgdmFyIGhhc0ZldGNoID0gdHlwZW9mIGZldGNoID09PSAnZnVuY3Rpb24nICYmIGZldGNoLnRvU3RyaW5nKCkuaW5kZXhPZignW25hdGl2ZSBjb2RlJykgIT09IC0xO1xuXG4gICAgICAgIC8vIFNhZmFyaSA8MTAuMSBkb2VzIG5vdCBtZWV0IG91ciByZXF1aXJlbWVudHMgZm9yIElEQiBzdXBwb3J0XG4gICAgICAgIC8vIChzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wb3VjaGRiL3BvdWNoZGIvaXNzdWVzLzU1NzIpLlxuICAgICAgICAvLyBTYWZhcmkgMTAuMSBzaGlwcGVkIHdpdGggZmV0Y2gsIHdlIGNhbiB1c2UgdGhhdCB0byBkZXRlY3QgaXQuXG4gICAgICAgIC8vIE5vdGU6IHRoaXMgY3JlYXRlcyBpc3N1ZXMgd2l0aCBgd2luZG93LmZldGNoYCBwb2x5ZmlsbHMgYW5kXG4gICAgICAgIC8vIG92ZXJyaWRlczsgc2VlOlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbG9jYWxGb3JhZ2UvbG9jYWxGb3JhZ2UvaXNzdWVzLzg1NlxuICAgICAgICByZXR1cm4gKCFpc1NhZmFyaSB8fCBoYXNGZXRjaCkgJiYgdHlwZW9mIGluZGV4ZWREQiAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgLy8gc29tZSBvdXRkYXRlZCBpbXBsZW1lbnRhdGlvbnMgb2YgSURCIHRoYXQgYXBwZWFyIG9uIFNhbXN1bmdcbiAgICAgICAgLy8gYW5kIEhUQyBBbmRyb2lkIGRldmljZXMgPDQuNCBhcmUgbWlzc2luZyBJREJLZXlSYW5nZVxuICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2xvY2FsRm9yYWdlL2lzc3Vlcy8xMjhcbiAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9sb2NhbEZvcmFnZS9pc3N1ZXMvMjcyXG4gICAgICAgIHR5cGVvZiBJREJLZXlSYW5nZSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBBYnN0cmFjdHMgY29uc3RydWN0aW5nIGEgQmxvYiBvYmplY3QsIHNvIGl0IGFsc28gd29ya3MgaW4gb2xkZXJcbi8vIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgbmF0aXZlIEJsb2IgY29uc3RydWN0b3IuIChpLmUuXG4vLyBvbGQgUXRXZWJLaXQgdmVyc2lvbnMsIGF0IGxlYXN0KS5cbi8vIEFic3RyYWN0cyBjb25zdHJ1Y3RpbmcgYSBCbG9iIG9iamVjdCwgc28gaXQgYWxzbyB3b3JrcyBpbiBvbGRlclxuLy8gYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBuYXRpdmUgQmxvYiBjb25zdHJ1Y3Rvci4gKGkuZS5cbi8vIG9sZCBRdFdlYktpdCB2ZXJzaW9ucywgYXQgbGVhc3QpLlxuZnVuY3Rpb24gY3JlYXRlQmxvYihwYXJ0cywgcHJvcGVydGllcykge1xuICAgIC8qIGdsb2JhbCBCbG9iQnVpbGRlcixNU0Jsb2JCdWlsZGVyLE1vekJsb2JCdWlsZGVyLFdlYktpdEJsb2JCdWlsZGVyICovXG4gICAgcGFydHMgPSBwYXJ0cyB8fCBbXTtcbiAgICBwcm9wZXJ0aWVzID0gcHJvcGVydGllcyB8fCB7fTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IEJsb2IocGFydHMsIHByb3BlcnRpZXMpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGUubmFtZSAhPT0gJ1R5cGVFcnJvcicpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIEJ1aWxkZXIgPSB0eXBlb2YgQmxvYkJ1aWxkZXIgIT09ICd1bmRlZmluZWQnID8gQmxvYkJ1aWxkZXIgOiB0eXBlb2YgTVNCbG9iQnVpbGRlciAhPT0gJ3VuZGVmaW5lZCcgPyBNU0Jsb2JCdWlsZGVyIDogdHlwZW9mIE1vekJsb2JCdWlsZGVyICE9PSAndW5kZWZpbmVkJyA/IE1vekJsb2JCdWlsZGVyIDogV2ViS2l0QmxvYkJ1aWxkZXI7XG4gICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQocGFydHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IocHJvcGVydGllcy50eXBlKTtcbiAgICB9XG59XG5cbi8vIFRoaXMgaXMgQ29tbW9uSlMgYmVjYXVzZSBsaWUgaXMgYW4gZXh0ZXJuYWwgZGVwZW5kZW5jeSwgc28gUm9sbHVwXG4vLyBjYW4ganVzdCBpZ25vcmUgaXQuXG5pZiAodHlwZW9mIFByb21pc2UgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gSW4gdGhlIFwibm9wcm9taXNlc1wiIGJ1aWxkIHRoaXMgd2lsbCBqdXN0IHRocm93IGlmIHlvdSBkb24ndCBoYXZlXG4gICAgLy8gYSBnbG9iYWwgcHJvbWlzZSBvYmplY3QsIGJ1dCBpdCB3b3VsZCB0aHJvdyBhbnl3YXkgbGF0ZXIuXG4gICAgX2RlcmVxXygzKTtcbn1cbnZhciBQcm9taXNlJDEgPSBQcm9taXNlO1xuXG5mdW5jdGlvbiBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgcHJvbWlzZS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIHJlc3VsdCk7XG4gICAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGV4ZWN1dGVUd29DYWxsYmFja3MocHJvbWlzZSwgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb21pc2UudGhlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBlcnJvckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb21pc2VbXCJjYXRjaFwiXShlcnJvckNhbGxiYWNrKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUtleShrZXkpIHtcbiAgICAvLyBDYXN0IHRoZSBrZXkgdG8gYSBzdHJpbmcsIGFzIHRoYXQncyBhbGwgd2UgY2FuIHNldCBhcyBhIGtleS5cbiAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGtleSArICcgdXNlZCBhcyBhIGtleSwgYnV0IGl0IGlzIG5vdCBhIHN0cmluZy4nKTtcbiAgICAgICAga2V5ID0gU3RyaW5nKGtleSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2FsbGJhY2soKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggJiYgdHlwZW9mIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07XG4gICAgfVxufVxuXG4vLyBTb21lIGNvZGUgb3JpZ2luYWxseSBmcm9tIGFzeW5jX3N0b3JhZ2UuanMgaW5cbi8vIFtHYWlhXShodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS1iMmcvZ2FpYSkuXG5cbnZhciBERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFID0gJ2xvY2FsLWZvcmFnZS1kZXRlY3QtYmxvYi1zdXBwb3J0JztcbnZhciBzdXBwb3J0c0Jsb2JzID0gdm9pZCAwO1xudmFyIGRiQ29udGV4dHMgPSB7fTtcbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8vIFRyYW5zYWN0aW9uIE1vZGVzXG52YXIgUkVBRF9PTkxZID0gJ3JlYWRvbmx5JztcbnZhciBSRUFEX1dSSVRFID0gJ3JlYWR3cml0ZSc7XG5cbi8vIFRyYW5zZm9ybSBhIGJpbmFyeSBzdHJpbmcgdG8gYW4gYXJyYXkgYnVmZmVyLCBiZWNhdXNlIG90aGVyd2lzZVxuLy8gd2VpcmQgc3R1ZmYgaGFwcGVucyB3aGVuIHlvdSB0cnkgdG8gd29yayB3aXRoIHRoZSBiaW5hcnkgc3RyaW5nIGRpcmVjdGx5LlxuLy8gSXQgaXMga25vd24uXG4vLyBGcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTQ5Njc2NDcvIChjb250aW51ZXMgb24gbmV4dCBsaW5lKVxuLy8gZW5jb2RlLWRlY29kZS1pbWFnZS13aXRoLWJhc2U2NC1icmVha3MtaW1hZ2UgKDIwMTMtMDQtMjEpXG5mdW5jdGlvbiBfYmluU3RyaW5nVG9BcnJheUJ1ZmZlcihiaW4pIHtcbiAgICB2YXIgbGVuZ3RoID0gYmluLmxlbmd0aDtcbiAgICB2YXIgYnVmID0gbmV3IEFycmF5QnVmZmVyKGxlbmd0aCk7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJbaV0gPSBiaW4uY2hhckNvZGVBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxuLy9cbi8vIEJsb2JzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGFsbCB2ZXJzaW9ucyBvZiBJbmRleGVkREIsIG5vdGFibHlcbi8vIENocm9tZSA8MzcgYW5kIEFuZHJvaWQgPDUuIEluIHRob3NlIHZlcnNpb25zLCBzdG9yaW5nIGEgYmxvYiB3aWxsIHRocm93LlxuLy9cbi8vIFZhcmlvdXMgb3RoZXIgYmxvYiBidWdzIGV4aXN0IGluIENocm9tZSB2MzctNDIgKGluY2x1c2l2ZSkuXG4vLyBEZXRlY3RpbmcgdGhlbSBpcyBleHBlbnNpdmUgYW5kIGNvbmZ1c2luZyB0byB1c2VycywgYW5kIENocm9tZSAzNy00MlxuLy8gaXMgYXQgdmVyeSBsb3cgdXNhZ2Ugd29ybGR3aWRlLCBzbyB3ZSBkbyBhIGhhY2t5IHVzZXJBZ2VudCBjaGVjayBpbnN0ZWFkLlxuLy9cbi8vIGNvbnRlbnQtdHlwZSBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00MDgxMjBcbi8vIDQwNCBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NDc5MTZcbi8vIEZpbGVSZWFkZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ3ODM2XG4vL1xuLy8gQ29kZSBib3Jyb3dlZCBmcm9tIFBvdWNoREIuIFNlZTpcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3VjaGRiL3BvdWNoZGIvYmxvYi9tYXN0ZXIvcGFja2FnZXMvbm9kZV9tb2R1bGVzL3BvdWNoZGItYWRhcHRlci1pZGIvc3JjL2Jsb2JTdXBwb3J0LmpzXG4vL1xuZnVuY3Rpb24gX2NoZWNrQmxvYlN1cHBvcnRXaXRob3V0Q2FjaGluZyhpZGIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICB2YXIgdHhuID0gaWRiLnRyYW5zYWN0aW9uKERFVEVDVF9CTE9CX1NVUFBPUlRfU1RPUkUsIFJFQURfV1JJVEUpO1xuICAgICAgICB2YXIgYmxvYiA9IGNyZWF0ZUJsb2IoWycnXSk7XG4gICAgICAgIHR4bi5vYmplY3RTdG9yZShERVRFQ1RfQkxPQl9TVVBQT1JUX1NUT1JFKS5wdXQoYmxvYiwgJ2tleScpO1xuXG4gICAgICAgIHR4bi5vbmFib3J0ID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIC8vIElmIHRoZSB0cmFuc2FjdGlvbiBhYm9ydHMgbm93IGl0cyBkdWUgdG8gbm90IGJlaW5nIGFibGUgdG9cbiAgICAgICAgICAgIC8vIHdyaXRlIHRvIHRoZSBkYXRhYmFzZSwgbGlrZWx5IGR1ZSB0byB0aGUgZGlzayBiZWluZyBmdWxsXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdHhuLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWF0Y2hlZENocm9tZSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0Nocm9tZVxcLyhcXGQrKS8pO1xuICAgICAgICAgICAgdmFyIG1hdGNoZWRFZGdlID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZVxcLy8pO1xuICAgICAgICAgICAgLy8gTVMgRWRnZSBwcmV0ZW5kcyB0byBiZSBDaHJvbWUgNDI6XG4gICAgICAgICAgICAvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2hoODY5MzAxJTI4dj12cy44NSUyOS5hc3B4XG4gICAgICAgICAgICByZXNvbHZlKG1hdGNoZWRFZGdlIHx8ICFtYXRjaGVkQ2hyb21lIHx8IHBhcnNlSW50KG1hdGNoZWRDaHJvbWVbMV0sIDEwKSA+PSA0Myk7XG4gICAgICAgIH07XG4gICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTsgLy8gZXJyb3IsIHNvIGFzc3VtZSB1bnN1cHBvcnRlZFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfY2hlY2tCbG9iU3VwcG9ydChpZGIpIHtcbiAgICBpZiAodHlwZW9mIHN1cHBvcnRzQmxvYnMgPT09ICdib29sZWFuJykge1xuICAgICAgICByZXR1cm4gUHJvbWlzZSQxLnJlc29sdmUoc3VwcG9ydHNCbG9icyk7XG4gICAgfVxuICAgIHJldHVybiBfY2hlY2tCbG9iU3VwcG9ydFdpdGhvdXRDYWNoaW5nKGlkYikudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgc3VwcG9ydHNCbG9icyA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gc3VwcG9ydHNCbG9icztcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gX2RlZmVyUmVhZGluZXNzKGRiSW5mbykge1xuICAgIHZhciBkYkNvbnRleHQgPSBkYkNvbnRleHRzW2RiSW5mby5uYW1lXTtcblxuICAgIC8vIENyZWF0ZSBhIGRlZmVycmVkIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgZGF0YWJhc2Ugb3BlcmF0aW9uLlxuICAgIHZhciBkZWZlcnJlZE9wZXJhdGlvbiA9IHt9O1xuXG4gICAgZGVmZXJyZWRPcGVyYXRpb24ucHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBkZWZlcnJlZE9wZXJhdGlvbi5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgICAgICAgZGVmZXJyZWRPcGVyYXRpb24ucmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgLy8gRW5xdWV1ZSB0aGUgZGVmZXJyZWQgb3BlcmF0aW9uLlxuICAgIGRiQ29udGV4dC5kZWZlcnJlZE9wZXJhdGlvbnMucHVzaChkZWZlcnJlZE9wZXJhdGlvbik7XG5cbiAgICAvLyBDaGFpbiBpdHMgcHJvbWlzZSB0byB0aGUgZGF0YWJhc2UgcmVhZGluZXNzLlxuICAgIGlmICghZGJDb250ZXh0LmRiUmVhZHkpIHtcbiAgICAgICAgZGJDb250ZXh0LmRiUmVhZHkgPSBkZWZlcnJlZE9wZXJhdGlvbi5wcm9taXNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGRiQ29udGV4dC5kYlJlYWR5ID0gZGJDb250ZXh0LmRiUmVhZHkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWRPcGVyYXRpb24ucHJvbWlzZTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfYWR2YW5jZVJlYWRpbmVzcyhkYkluZm8pIHtcbiAgICB2YXIgZGJDb250ZXh0ID0gZGJDb250ZXh0c1tkYkluZm8ubmFtZV07XG5cbiAgICAvLyBEZXF1ZXVlIGEgZGVmZXJyZWQgb3BlcmF0aW9uLlxuICAgIHZhciBkZWZlcnJlZE9wZXJhdGlvbiA9IGRiQ29udGV4dC5kZWZlcnJlZE9wZXJhdGlvbnMucG9wKCk7XG5cbiAgICAvLyBSZXNvbHZlIGl0cyBwcm9taXNlICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBkYXRhYmFzZSByZWFkaW5lc3NcbiAgICAvLyBjaGFpbiBvZiBwcm9taXNlcykuXG4gICAgaWYgKGRlZmVycmVkT3BlcmF0aW9uKSB7XG4gICAgICAgIGRlZmVycmVkT3BlcmF0aW9uLnJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIGRlZmVycmVkT3BlcmF0aW9uLnByb21pc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfcmVqZWN0UmVhZGluZXNzKGRiSW5mbywgZXJyKSB7XG4gICAgdmFyIGRiQ29udGV4dCA9IGRiQ29udGV4dHNbZGJJbmZvLm5hbWVdO1xuXG4gICAgLy8gRGVxdWV1ZSBhIGRlZmVycmVkIG9wZXJhdGlvbi5cbiAgICB2YXIgZGVmZXJyZWRPcGVyYXRpb24gPSBkYkNvbnRleHQuZGVmZXJyZWRPcGVyYXRpb25zLnBvcCgpO1xuXG4gICAgLy8gUmVqZWN0IGl0cyBwcm9taXNlICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBkYXRhYmFzZSByZWFkaW5lc3NcbiAgICAvLyBjaGFpbiBvZiBwcm9taXNlcykuXG4gICAgaWYgKGRlZmVycmVkT3BlcmF0aW9uKSB7XG4gICAgICAgIGRlZmVycmVkT3BlcmF0aW9uLnJlamVjdChlcnIpO1xuICAgICAgICByZXR1cm4gZGVmZXJyZWRPcGVyYXRpb24ucHJvbWlzZTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIF9nZXRDb25uZWN0aW9uKGRiSW5mbywgdXBncmFkZU5lZWRlZCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZGJDb250ZXh0c1tkYkluZm8ubmFtZV0gPSBkYkNvbnRleHRzW2RiSW5mby5uYW1lXSB8fCBjcmVhdGVEYkNvbnRleHQoKTtcblxuICAgICAgICBpZiAoZGJJbmZvLmRiKSB7XG4gICAgICAgICAgICBpZiAodXBncmFkZU5lZWRlZCkge1xuICAgICAgICAgICAgICAgIF9kZWZlclJlYWRpbmVzcyhkYkluZm8pO1xuICAgICAgICAgICAgICAgIGRiSW5mby5kYi5jbG9zZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShkYkluZm8uZGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGRiQXJncyA9IFtkYkluZm8ubmFtZV07XG5cbiAgICAgICAgaWYgKHVwZ3JhZGVOZWVkZWQpIHtcbiAgICAgICAgICAgIGRiQXJncy5wdXNoKGRiSW5mby52ZXJzaW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvcGVucmVxID0gaWRiLm9wZW4uYXBwbHkoaWRiLCBkYkFyZ3MpO1xuXG4gICAgICAgIGlmICh1cGdyYWRlTmVlZGVkKSB7XG4gICAgICAgICAgICBvcGVucmVxLm9udXBncmFkZW5lZWRlZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRiID0gb3BlbnJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoZGJJbmZvLnN0b3JlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlLm9sZFZlcnNpb24gPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkZWQgd2hlbiBzdXBwb3J0IGZvciBibG9iIHNoaW1zIHdhcyBhZGRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoREVURUNUX0JMT0JfU1VQUE9SVF9TVE9SRSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXgubmFtZSA9PT0gJ0NvbnN0cmFpbnRFcnJvcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIGRhdGFiYXNlIFwiJyArIGRiSW5mby5uYW1lICsgJ1wiJyArICcgaGFzIGJlZW4gdXBncmFkZWQgZnJvbSB2ZXJzaW9uICcgKyBlLm9sZFZlcnNpb24gKyAnIHRvIHZlcnNpb24gJyArIGUubmV3VmVyc2lvbiArICcsIGJ1dCB0aGUgc3RvcmFnZSBcIicgKyBkYkluZm8uc3RvcmVOYW1lICsgJ1wiIGFscmVhZHkgZXhpc3RzLicpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3BlbnJlcS5vbmVycm9yID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHJlamVjdChvcGVucmVxLmVycm9yKTtcbiAgICAgICAgfTtcblxuICAgICAgICBvcGVucmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYiA9IG9wZW5yZXEucmVzdWx0O1xuICAgICAgICAgICAgZGIub252ZXJzaW9uY2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyZWQgd2hlbiB0aGUgZGF0YWJhc2UgaXMgbW9kaWZpZWQgKGUuZy4gYWRkaW5nIGFuIG9iamVjdFN0b3JlKSBvclxuICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWQgKGV2ZW4gd2hlbiBpbml0aWF0ZWQgYnkgb3RoZXIgc2Vzc2lvbnMgaW4gZGlmZmVyZW50IHRhYnMpLlxuICAgICAgICAgICAgICAgIC8vIENsb3NpbmcgdGhlIGNvbm5lY3Rpb24gaGVyZSBwcmV2ZW50cyB0aG9zZSBvcGVyYXRpb25zIGZyb20gYmVpbmcgYmxvY2tlZC5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZGF0YWJhc2UgaXMgYWNjZXNzZWQgYWdhaW4gbGF0ZXIgYnkgdGhpcyBpbnN0YW5jZSwgdGhlIGNvbm5lY3Rpb25cbiAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIHJlb3BlbmVkIG9yIHRoZSBkYXRhYmFzZSByZWNyZWF0ZWQgYXMgbmVlZGVkLlxuICAgICAgICAgICAgICAgIGUudGFyZ2V0LmNsb3NlKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzb2x2ZShkYik7XG4gICAgICAgICAgICBfYWR2YW5jZVJlYWRpbmVzcyhkYkluZm8pO1xuICAgICAgICB9O1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBfZ2V0T3JpZ2luYWxDb25uZWN0aW9uKGRiSW5mbykge1xuICAgIHJldHVybiBfZ2V0Q29ubmVjdGlvbihkYkluZm8sIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gX2dldFVwZ3JhZGVkQ29ubmVjdGlvbihkYkluZm8pIHtcbiAgICByZXR1cm4gX2dldENvbm5lY3Rpb24oZGJJbmZvLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gX2lzVXBncmFkZU5lZWRlZChkYkluZm8sIGRlZmF1bHRWZXJzaW9uKSB7XG4gICAgaWYgKCFkYkluZm8uZGIpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIGlzTmV3U3RvcmUgPSAhZGJJbmZvLmRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoZGJJbmZvLnN0b3JlTmFtZSk7XG4gICAgdmFyIGlzRG93bmdyYWRlID0gZGJJbmZvLnZlcnNpb24gPCBkYkluZm8uZGIudmVyc2lvbjtcbiAgICB2YXIgaXNVcGdyYWRlID0gZGJJbmZvLnZlcnNpb24gPiBkYkluZm8uZGIudmVyc2lvbjtcblxuICAgIGlmIChpc0Rvd25ncmFkZSkge1xuICAgICAgICAvLyBJZiB0aGUgdmVyc2lvbiBpcyBub3QgdGhlIGRlZmF1bHQgb25lXG4gICAgICAgIC8vIHRoZW4gd2FybiBmb3IgaW1wb3NzaWJsZSBkb3duZ3JhZGUuXG4gICAgICAgIGlmIChkYkluZm8udmVyc2lvbiAhPT0gZGVmYXVsdFZlcnNpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIGRhdGFiYXNlIFwiJyArIGRiSW5mby5uYW1lICsgJ1wiJyArIFwiIGNhbid0IGJlIGRvd25ncmFkZWQgZnJvbSB2ZXJzaW9uIFwiICsgZGJJbmZvLmRiLnZlcnNpb24gKyAnIHRvIHZlcnNpb24gJyArIGRiSW5mby52ZXJzaW9uICsgJy4nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbGlnbiB0aGUgdmVyc2lvbnMgdG8gcHJldmVudCBlcnJvcnMuXG4gICAgICAgIGRiSW5mby52ZXJzaW9uID0gZGJJbmZvLmRiLnZlcnNpb247XG4gICAgfVxuXG4gICAgaWYgKGlzVXBncmFkZSB8fCBpc05ld1N0b3JlKSB7XG4gICAgICAgIC8vIElmIHRoZSBzdG9yZSBpcyBuZXcgdGhlbiBpbmNyZW1lbnQgdGhlIHZlcnNpb24gKGlmIG5lZWRlZCkuXG4gICAgICAgIC8vIFRoaXMgd2lsbCB0cmlnZ2VyIGFuIFwidXBncmFkZW5lZWRlZFwiIGV2ZW50IHdoaWNoIGlzIHJlcXVpcmVkXG4gICAgICAgIC8vIGZvciBjcmVhdGluZyBhIHN0b3JlLlxuICAgICAgICBpZiAoaXNOZXdTdG9yZSkge1xuICAgICAgICAgICAgdmFyIGluY1ZlcnNpb24gPSBkYkluZm8uZGIudmVyc2lvbiArIDE7XG4gICAgICAgICAgICBpZiAoaW5jVmVyc2lvbiA+IGRiSW5mby52ZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgZGJJbmZvLnZlcnNpb24gPSBpbmNWZXJzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBlbmNvZGUgYSBibG9iIGZvciBpbmRleGVkZGIgZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnQgYmxvYnNcbmZ1bmN0aW9uIF9lbmNvZGVCbG9iKGJsb2IpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIub25lcnJvciA9IHJlamVjdDtcbiAgICAgICAgcmVhZGVyLm9ubG9hZGVuZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2YXIgYmFzZTY0ID0gYnRvYShlLnRhcmdldC5yZXN1bHQgfHwgJycpO1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgX19sb2NhbF9mb3JhZ2VfZW5jb2RlZF9ibG9iOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRhdGE6IGJhc2U2NCxcbiAgICAgICAgICAgICAgICB0eXBlOiBibG9iLnR5cGVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIucmVhZEFzQmluYXJ5U3RyaW5nKGJsb2IpO1xuICAgIH0pO1xufVxuXG4vLyBkZWNvZGUgYW4gZW5jb2RlZCBibG9iXG5mdW5jdGlvbiBfZGVjb2RlQmxvYihlbmNvZGVkQmxvYikge1xuICAgIHZhciBhcnJheUJ1ZmYgPSBfYmluU3RyaW5nVG9BcnJheUJ1ZmZlcihhdG9iKGVuY29kZWRCbG9iLmRhdGEpKTtcbiAgICByZXR1cm4gY3JlYXRlQmxvYihbYXJyYXlCdWZmXSwgeyB0eXBlOiBlbmNvZGVkQmxvYi50eXBlIH0pO1xufVxuXG4vLyBpcyB0aGlzIG9uZSBvZiBvdXIgZmFuY3kgZW5jb2RlZCBibG9icz9cbmZ1bmN0aW9uIF9pc0VuY29kZWRCbG9iKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLl9fbG9jYWxfZm9yYWdlX2VuY29kZWRfYmxvYjtcbn1cblxuLy8gU3BlY2lhbGl6ZSB0aGUgZGVmYXVsdCBgcmVhZHkoKWAgZnVuY3Rpb24gYnkgbWFraW5nIGl0IGRlcGVuZGVudFxuLy8gb24gdGhlIGN1cnJlbnQgZGF0YWJhc2Ugb3BlcmF0aW9ucy4gVGh1cywgdGhlIGRyaXZlciB3aWxsIGJlIGFjdHVhbGx5XG4vLyByZWFkeSB3aGVuIGl0J3MgYmVlbiBpbml0aWFsaXplZCAoZGVmYXVsdCkgKmFuZCogdGhlcmUgYXJlIG5vIHBlbmRpbmdcbi8vIG9wZXJhdGlvbnMgb24gdGhlIGRhdGFiYXNlIChpbml0aWF0ZWQgYnkgc29tZSBvdGhlciBpbnN0YW5jZXMpLlxuZnVuY3Rpb24gX2Z1bGx5UmVhZHkoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IHNlbGYuX2luaXRSZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGJDb250ZXh0ID0gZGJDb250ZXh0c1tzZWxmLl9kYkluZm8ubmFtZV07XG5cbiAgICAgICAgaWYgKGRiQ29udGV4dCAmJiBkYkNvbnRleHQuZGJSZWFkeSkge1xuICAgICAgICAgICAgcmV0dXJuIGRiQ29udGV4dC5kYlJlYWR5O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleGVjdXRlVHdvQ2FsbGJhY2tzKHByb21pc2UsIGNhbGxiYWNrLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIFRyeSB0byBlc3RhYmxpc2ggYSBuZXcgZGIgY29ubmVjdGlvbiB0byByZXBsYWNlIHRoZVxuLy8gY3VycmVudCBvbmUgd2hpY2ggaXMgYnJva2VuIChpLmUuIGV4cGVyaWVuY2luZ1xuLy8gSW52YWxpZFN0YXRlRXJyb3Igd2hpbGUgY3JlYXRpbmcgYSB0cmFuc2FjdGlvbikuXG5mdW5jdGlvbiBfdHJ5UmVjb25uZWN0KGRiSW5mbykge1xuICAgIF9kZWZlclJlYWRpbmVzcyhkYkluZm8pO1xuXG4gICAgdmFyIGRiQ29udGV4dCA9IGRiQ29udGV4dHNbZGJJbmZvLm5hbWVdO1xuICAgIHZhciBmb3JhZ2VzID0gZGJDb250ZXh0LmZvcmFnZXM7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZvcmFnZSA9IGZvcmFnZXNbaV07XG4gICAgICAgIGlmIChmb3JhZ2UuX2RiSW5mby5kYikge1xuICAgICAgICAgICAgZm9yYWdlLl9kYkluZm8uZGIuY2xvc2UoKTtcbiAgICAgICAgICAgIGZvcmFnZS5fZGJJbmZvLmRiID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkYkluZm8uZGIgPSBudWxsO1xuXG4gICAgcmV0dXJuIF9nZXRPcmlnaW5hbENvbm5lY3Rpb24oZGJJbmZvKS50aGVuKGZ1bmN0aW9uIChkYikge1xuICAgICAgICBkYkluZm8uZGIgPSBkYjtcbiAgICAgICAgaWYgKF9pc1VwZ3JhZGVOZWVkZWQoZGJJbmZvKSkge1xuICAgICAgICAgICAgLy8gUmVvcGVuIHRoZSBkYXRhYmFzZSBmb3IgdXBncmFkaW5nLlxuICAgICAgICAgICAgcmV0dXJuIF9nZXRVcGdyYWRlZENvbm5lY3Rpb24oZGJJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGI7XG4gICAgfSkudGhlbihmdW5jdGlvbiAoZGIpIHtcbiAgICAgICAgLy8gc3RvcmUgdGhlIGxhdGVzdCBkYiByZWZlcmVuY2VcbiAgICAgICAgLy8gaW4gY2FzZSB0aGUgZGIgd2FzIHVwZ3JhZGVkXG4gICAgICAgIGRiSW5mby5kYiA9IGRiQ29udGV4dC5kYiA9IGRiO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZvcmFnZXNbaV0uX2RiSW5mby5kYiA9IGRiO1xuICAgICAgICB9XG4gICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgIF9yZWplY3RSZWFkaW5lc3MoZGJJbmZvLCBlcnIpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfSk7XG59XG5cbi8vIEZGIGRvZXNuJ3QgbGlrZSBQcm9taXNlcyAobWljcm8tdGFza3MpIGFuZCBJRERCIHN0b3JlIG9wZXJhdGlvbnMsXG4vLyBzbyB3ZSBoYXZlIHRvIGRvIGl0IHdpdGggY2FsbGJhY2tzXG5mdW5jdGlvbiBjcmVhdGVUcmFuc2FjdGlvbihkYkluZm8sIG1vZGUsIGNhbGxiYWNrLCByZXRyaWVzKSB7XG4gICAgaWYgKHJldHJpZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXRyaWVzID0gMTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgICB2YXIgdHggPSBkYkluZm8uZGIudHJhbnNhY3Rpb24oZGJJbmZvLnN0b3JlTmFtZSwgbW9kZSk7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHR4KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHJldHJpZXMgPiAwICYmICghZGJJbmZvLmRiIHx8IGVyci5uYW1lID09PSAnSW52YWxpZFN0YXRlRXJyb3InIHx8IGVyci5uYW1lID09PSAnTm90Rm91bmRFcnJvcicpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZSQxLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWRiSW5mby5kYiB8fCBlcnIubmFtZSA9PT0gJ05vdEZvdW5kRXJyb3InICYmICFkYkluZm8uZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhkYkluZm8uc3RvcmVOYW1lKSAmJiBkYkluZm8udmVyc2lvbiA8PSBkYkluZm8uZGIudmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgZGIgdmVyc2lvbiwgdG8gY3JlYXRlIHRoZSBuZXcgT2JqZWN0U3RvcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRiSW5mby5kYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGJJbmZvLnZlcnNpb24gPSBkYkluZm8uZGIudmVyc2lvbiArIDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVvcGVuIHRoZSBkYXRhYmFzZSBmb3IgdXBncmFkaW5nLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2dldFVwZ3JhZGVkQ29ubmVjdGlvbihkYkluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfdHJ5UmVjb25uZWN0KGRiSW5mbykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uKGRiSW5mbywgbW9kZSwgY2FsbGJhY2ssIHJldHJpZXMgLSAxKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pW1wiY2F0Y2hcIl0oY2FsbGJhY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZURiQ29udGV4dCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvLyBSdW5uaW5nIGxvY2FsRm9yYWdlcyBzaGFyaW5nIGEgZGF0YWJhc2UuXG4gICAgICAgIGZvcmFnZXM6IFtdLFxuICAgICAgICAvLyBTaGFyZWQgZGF0YWJhc2UuXG4gICAgICAgIGRiOiBudWxsLFxuICAgICAgICAvLyBEYXRhYmFzZSByZWFkaW5lc3MgKHByb21pc2UpLlxuICAgICAgICBkYlJlYWR5OiBudWxsLFxuICAgICAgICAvLyBEZWZlcnJlZCBvcGVyYXRpb25zIG9uIHRoZSBkYXRhYmFzZS5cbiAgICAgICAgZGVmZXJyZWRPcGVyYXRpb25zOiBbXVxuICAgIH07XG59XG5cbi8vIE9wZW4gdGhlIEluZGV4ZWREQiBkYXRhYmFzZSAoYXV0b21hdGljYWxseSBjcmVhdGVzIG9uZSBpZiBvbmUgZGlkbid0XG4vLyBwcmV2aW91c2x5IGV4aXN0KSwgdXNpbmcgYW55IG9wdGlvbnMgc2V0IGluIHRoZSBjb25maWcuXG5mdW5jdGlvbiBfaW5pdFN0b3JhZ2Uob3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGJJbmZvID0ge1xuICAgICAgICBkYjogbnVsbFxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBmb3IgKHZhciBpIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGRiSW5mb1tpXSA9IG9wdGlvbnNbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgZGF0YWJhc2U7XG4gICAgdmFyIGRiQ29udGV4dCA9IGRiQ29udGV4dHNbZGJJbmZvLm5hbWVdO1xuXG4gICAgLy8gLi4ub3IgY3JlYXRlIGEgbmV3IGNvbnRleHQuXG4gICAgaWYgKCFkYkNvbnRleHQpIHtcbiAgICAgICAgZGJDb250ZXh0ID0gY3JlYXRlRGJDb250ZXh0KCk7XG4gICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBuZXcgY29udGV4dCBpbiB0aGUgZ2xvYmFsIGNvbnRhaW5lci5cbiAgICAgICAgZGJDb250ZXh0c1tkYkluZm8ubmFtZV0gPSBkYkNvbnRleHQ7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgaXRzZWxmIGFzIGEgcnVubmluZyBsb2NhbEZvcmFnZSBpbiB0aGUgY3VycmVudCBjb250ZXh0LlxuICAgIGRiQ29udGV4dC5mb3JhZ2VzLnB1c2goc2VsZik7XG5cbiAgICAvLyBSZXBsYWNlIHRoZSBkZWZhdWx0IGByZWFkeSgpYCBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWFsaXplZCBvbmUuXG4gICAgaWYgKCFzZWxmLl9pbml0UmVhZHkpIHtcbiAgICAgICAgc2VsZi5faW5pdFJlYWR5ID0gc2VsZi5yZWFkeTtcbiAgICAgICAgc2VsZi5yZWFkeSA9IF9mdWxseVJlYWR5O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBpbml0aWFsaXphdGlvbiBzdGF0ZXMgb2YgdGhlIHJlbGF0ZWQgbG9jYWxGb3JhZ2VzLlxuICAgIHZhciBpbml0UHJvbWlzZXMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGlnbm9yZUVycm9ycygpIHtcbiAgICAgICAgLy8gRG9uJ3QgaGFuZGxlIGVycm9ycyBoZXJlLFxuICAgICAgICAvLyBqdXN0IG1ha2VzIHN1cmUgcmVsYXRlZCBsb2NhbEZvcmFnZXMgYXJlbid0IHBlbmRpbmcuXG4gICAgICAgIHJldHVybiBQcm9taXNlJDEucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGJDb250ZXh0LmZvcmFnZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgdmFyIGZvcmFnZSA9IGRiQ29udGV4dC5mb3JhZ2VzW2pdO1xuICAgICAgICBpZiAoZm9yYWdlICE9PSBzZWxmKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB3YWl0IGZvciBpdHNlbGYuLi5cbiAgICAgICAgICAgIGluaXRQcm9taXNlcy5wdXNoKGZvcmFnZS5faW5pdFJlYWR5KClbXCJjYXRjaFwiXShpZ25vcmVFcnJvcnMpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRha2UgYSBzbmFwc2hvdCBvZiB0aGUgcmVsYXRlZCBsb2NhbEZvcmFnZXMuXG4gICAgdmFyIGZvcmFnZXMgPSBkYkNvbnRleHQuZm9yYWdlcy5zbGljZSgwKTtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGNvbm5lY3Rpb24gcHJvY2VzcyBvbmx5IHdoZW5cbiAgICAvLyBhbGwgdGhlIHJlbGF0ZWQgbG9jYWxGb3JhZ2VzIGFyZW4ndCBwZW5kaW5nLlxuICAgIHJldHVybiBQcm9taXNlJDEuYWxsKGluaXRQcm9taXNlcykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRiSW5mby5kYiA9IGRiQ29udGV4dC5kYjtcbiAgICAgICAgLy8gR2V0IHRoZSBjb25uZWN0aW9uIG9yIG9wZW4gYSBuZXcgb25lIHdpdGhvdXQgdXBncmFkZS5cbiAgICAgICAgcmV0dXJuIF9nZXRPcmlnaW5hbENvbm5lY3Rpb24oZGJJbmZvKTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYikge1xuICAgICAgICBkYkluZm8uZGIgPSBkYjtcbiAgICAgICAgaWYgKF9pc1VwZ3JhZGVOZWVkZWQoZGJJbmZvLCBzZWxmLl9kZWZhdWx0Q29uZmlnLnZlcnNpb24pKSB7XG4gICAgICAgICAgICAvLyBSZW9wZW4gdGhlIGRhdGFiYXNlIGZvciB1cGdyYWRpbmcuXG4gICAgICAgICAgICByZXR1cm4gX2dldFVwZ3JhZGVkQ29ubmVjdGlvbihkYkluZm8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYjtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChkYikge1xuICAgICAgICBkYkluZm8uZGIgPSBkYkNvbnRleHQuZGIgPSBkYjtcbiAgICAgICAgc2VsZi5fZGJJbmZvID0gZGJJbmZvO1xuICAgICAgICAvLyBTaGFyZSB0aGUgZmluYWwgY29ubmVjdGlvbiBhbW9uZ3N0IHJlbGF0ZWQgbG9jYWxGb3JhZ2VzLlxuICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGZvcmFnZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIHZhciBmb3JhZ2UgPSBmb3JhZ2VzW2tdO1xuICAgICAgICAgICAgaWYgKGZvcmFnZSAhPT0gc2VsZikge1xuICAgICAgICAgICAgICAgIC8vIFNlbGYgaXMgYWxyZWFkeSB1cC10by1kYXRlLlxuICAgICAgICAgICAgICAgIGZvcmFnZS5fZGJJbmZvLmRiID0gZGJJbmZvLmRiO1xuICAgICAgICAgICAgICAgIGZvcmFnZS5fZGJJbmZvLnZlcnNpb24gPSBkYkluZm8udmVyc2lvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRJdGVtKGtleSwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uKHNlbGYuX2RiSW5mbywgUkVBRF9PTkxZLCBmdW5jdGlvbiAoZXJyLCB0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuX2RiSW5mby5zdG9yZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gc3RvcmUuZ2V0KGtleSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaXNFbmNvZGVkQmxvYih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IF9kZWNvZGVCbG9iKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIEl0ZXJhdGUgb3ZlciBhbGwgaXRlbXMgc3RvcmVkIGluIGRhdGFiYXNlLlxuZnVuY3Rpb24gaXRlcmF0ZShpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjcmVhdGVUcmFuc2FjdGlvbihzZWxmLl9kYkluZm8sIFJFQURfT05MWSwgZnVuY3Rpb24gKGVyciwgdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzZWxmLl9kYkluZm8uc3RvcmVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlLm9wZW5DdXJzb3IoKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZXJhdGlvbk51bWJlciA9IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSByZXEucmVzdWx0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gY3Vyc29yLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfaXNFbmNvZGVkQmxvYih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfZGVjb2RlQmxvYih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBpdGVyYXRvcih2YWx1ZSwgY3Vyc29yLmtleSwgaXRlcmF0aW9uTnVtYmVyKyspO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiB0aGUgaXRlcmF0b3IgY2FsbGJhY2sgcmV0dXJucyBhbnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobm9uLWB1bmRlZmluZWRgKSB2YWx1ZSwgdGhlbiB3ZSBzdG9wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGl0ZXJhdGlvbiBpbW1lZGlhdGVseVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yW1wiY29udGludWVcIl0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIHNldEl0ZW0oa2V5LCB2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBkYkluZm87XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgICAgIGlmICh0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQmxvYl0nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jaGVja0Jsb2JTdXBwb3J0KGRiSW5mby5kYikudGhlbihmdW5jdGlvbiAoYmxvYlN1cHBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb2JTdXBwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9lbmNvZGVCbG9iKHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uKHNlbGYuX2RiSW5mbywgUkVBRF9XUklURSwgZnVuY3Rpb24gKGVyciwgdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzZWxmLl9kYkluZm8uc3RvcmVOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVhc29uIHdlIGRvbid0IF9zYXZlXyBudWxsIGlzIGJlY2F1c2UgSUUgMTAgZG9lc1xuICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc3VwcG9ydCBzYXZpbmcgdGhlIGBudWxsYCB0eXBlIGluIEluZGV4ZWREQi4gSG93XG4gICAgICAgICAgICAgICAgICAgIC8vIGlyb25pYywgZ2l2ZW4gdGhlIGJ1ZyBiZWxvdyFcbiAgICAgICAgICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9sb2NhbEZvcmFnZS9pc3N1ZXMvMTYxXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gc3RvcmUucHV0KHZhbHVlLCBrZXkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYXN0IHRvIHVuZGVmaW5lZCBzbyB0aGUgdmFsdWUgcGFzc2VkIHRvXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxsYmFjay9wcm9taXNlIGlzIHRoZSBzYW1lIGFzIHdoYXQgb25lIHdvdWxkIGdldCBvdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGBnZXRJdGVtKClgIGxhdGVyLiBUaGlzIGxlYWRzIHRvIHNvbWUgd2VpcmRuZXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoc2V0SXRlbSgnZm9vJywgdW5kZWZpbmVkKSB3aWxsIHJldHVybiBgbnVsbGApLCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IG15IGZhdWx0IGxvY2FsU3RvcmFnZSBpcyBvdXIgYmFzZWxpbmUgYW5kIHRoYXRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3Mgd2VpcmQuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9uYWJvcnQgPSB0cmFuc2FjdGlvbi5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVyciA9IHJlcS5lcnJvciA/IHJlcS5lcnJvciA6IHJlcS50cmFuc2FjdGlvbi5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiByZW1vdmVJdGVtKGtleSwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uKHNlbGYuX2RiSW5mbywgUkVBRF9XUklURSwgZnVuY3Rpb24gKGVyciwgdHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3RvcmUgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzZWxmLl9kYkluZm8uc3RvcmVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXNlIGEgR3J1bnQgdGFzayB0byBtYWtlIHRoaXMgc2FmZSBmb3IgSUUgYW5kIHNvbWVcbiAgICAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbnMgb2YgQW5kcm9pZCAoaW5jbHVkaW5nIHRob3NlIHVzZWQgYnkgQ29yZG92YSkuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbGx5IElFIHdvbid0IGxpa2UgYC5kZWxldGUoKWAgYW5kIHdpbGwgaW5zaXN0IG9uXG4gICAgICAgICAgICAgICAgICAgIC8vIHVzaW5nIGBbJ2RlbGV0ZSddKClgLCBidXQgd2UgaGF2ZSBhIGJ1aWxkIHN0ZXAgdGhhdFxuICAgICAgICAgICAgICAgICAgICAvLyBmaXhlcyB0aGlzIGZvciB1cyBub3cuXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZVtcImRlbGV0ZVwiXShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdCB3aWxsIGJlIGFsc28gYmUgYWJvcnRlZCBpZiB3ZSd2ZSBleGNlZWRlZCBvdXIgc3RvcmFnZVxuICAgICAgICAgICAgICAgICAgICAvLyBzcGFjZS5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24ub25hYm9ydCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlcnIgPSByZXEuZXJyb3IgPyByZXEuZXJyb3IgOiByZXEudHJhbnNhY3Rpb24uZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlbXCJjYXRjaFwiXShyZWplY3QpO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24gY2xlYXIoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjcmVhdGVUcmFuc2FjdGlvbihzZWxmLl9kYkluZm8sIFJFQURfV1JJVEUsIGZ1bmN0aW9uIChlcnIsIHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc2VsZi5fZGJJbmZvLnN0b3JlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5jbGVhcigpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24ub25hYm9ydCA9IHRyYW5zYWN0aW9uLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXJyID0gcmVxLmVycm9yID8gcmVxLmVycm9yIDogcmVxLnRyYW5zYWN0aW9uLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGxlbmd0aChjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uKHNlbGYuX2RiSW5mbywgUkVBRF9PTkxZLCBmdW5jdGlvbiAoZXJyLCB0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuX2RiSW5mby5zdG9yZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gc3RvcmUuY291bnQoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXEucmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBrZXkobiwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBpZiAobiA8IDApIHtcbiAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNyZWF0ZVRyYW5zYWN0aW9uKHNlbGYuX2RiSW5mbywgUkVBRF9PTkxZLCBmdW5jdGlvbiAoZXJyLCB0cmFuc2FjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZSA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHNlbGYuX2RiSW5mby5zdG9yZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYWR2YW5jZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IHN0b3JlLm9wZW5LZXlDdXJzb3IoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IHJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhlcmUgd2VyZW4ndCBlbm91Z2gga2V5c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0aGUgZmlyc3Qga2V5LCByZXR1cm4gaXQgaWYgdGhhdCdzIHdoYXQgdGhleVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhbnRlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGN1cnNvci5rZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkdmFuY2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYXNrIHRoZSBjdXJzb3IgdG8gc2tpcCBhaGVhZCBuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZHMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdmFuY2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yLmFkdmFuY2Uobik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB3ZSBnZXQgaGVyZSwgd2UndmUgZ290IHRoZSBudGgga2V5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGN1cnNvci5rZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChyZXEuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBrZXlzKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgY3JlYXRlVHJhbnNhY3Rpb24oc2VsZi5fZGJJbmZvLCBSRUFEX09OTFksIGZ1bmN0aW9uIChlcnIsIHRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc2VsZi5fZGJJbmZvLnN0b3JlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXEgPSBzdG9yZS5vcGVuS2V5Q3Vyc29yKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXlzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJzb3IgPSByZXEucmVzdWx0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWN1cnNvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoa2V5cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2goY3Vyc29yLmtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JbXCJjb250aW51ZVwiXSgpO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KHJlcS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGRyb3BJbnN0YW5jZShvcHRpb25zLCBjYWxsYmFjaykge1xuICAgIGNhbGxiYWNrID0gZ2V0Q2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgIHZhciBjdXJyZW50Q29uZmlnID0gdGhpcy5jb25maWcoKTtcbiAgICBvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgIT09ICdmdW5jdGlvbicgJiYgb3B0aW9ucyB8fCB7fTtcbiAgICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgICAgICBvcHRpb25zLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgY3VycmVudENvbmZpZy5uYW1lO1xuICAgICAgICBvcHRpb25zLnN0b3JlTmFtZSA9IG9wdGlvbnMuc3RvcmVOYW1lIHx8IGN1cnJlbnRDb25maWcuc3RvcmVOYW1lO1xuICAgIH1cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcHJvbWlzZTtcbiAgICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgICAgICBwcm9taXNlID0gUHJvbWlzZSQxLnJlamVjdCgnSW52YWxpZCBhcmd1bWVudHMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaXNDdXJyZW50RGIgPSBvcHRpb25zLm5hbWUgPT09IGN1cnJlbnRDb25maWcubmFtZSAmJiBzZWxmLl9kYkluZm8uZGI7XG5cbiAgICAgICAgdmFyIGRiUHJvbWlzZSA9IGlzQ3VycmVudERiID8gUHJvbWlzZSQxLnJlc29sdmUoc2VsZi5fZGJJbmZvLmRiKSA6IF9nZXRPcmlnaW5hbENvbm5lY3Rpb24ob3B0aW9ucykudGhlbihmdW5jdGlvbiAoZGIpIHtcbiAgICAgICAgICAgIHZhciBkYkNvbnRleHQgPSBkYkNvbnRleHRzW29wdGlvbnMubmFtZV07XG4gICAgICAgICAgICB2YXIgZm9yYWdlcyA9IGRiQ29udGV4dC5mb3JhZ2VzO1xuICAgICAgICAgICAgZGJDb250ZXh0LmRiID0gZGI7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBmb3JhZ2VzW2ldLl9kYkluZm8uZGIgPSBkYjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLnN0b3JlTmFtZSkge1xuICAgICAgICAgICAgcHJvbWlzZSA9IGRiUHJvbWlzZS50aGVuKGZ1bmN0aW9uIChkYikge1xuICAgICAgICAgICAgICAgIF9kZWZlclJlYWRpbmVzcyhvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIHZhciBkYkNvbnRleHQgPSBkYkNvbnRleHRzW29wdGlvbnMubmFtZV07XG4gICAgICAgICAgICAgICAgdmFyIGZvcmFnZXMgPSBkYkNvbnRleHQuZm9yYWdlcztcblxuICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmb3JhZ2UgPSBmb3JhZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBmb3JhZ2UuX2RiSW5mby5kYiA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGRyb3BEQlByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcSA9IGlkYi5kZWxldGVEYXRhYmFzZShvcHRpb25zLm5hbWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QocmVxLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25ibG9ja2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2luZyBhbGwgb3BlbiBjb25uZWN0aW9ucyBpbiBvbnZlcnNpb25jaGFuZ2UgaGFuZGxlciBzaG91bGQgcHJldmVudCB0aGlzIHNpdHVhdGlvbiwgYnV0IGlmXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyBnZXQgaGVyZSwgaXQganVzdCBtZWFucyB0aGUgcmVxdWVzdCByZW1haW5zIHBlbmRpbmcgLSBldmVudHVhbGx5IGl0IHdpbGwgc3VjY2VlZCBvciBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdkcm9wSW5zdGFuY2UgYmxvY2tlZCBmb3IgZGF0YWJhc2UgXCInICsgb3B0aW9ucy5uYW1lICsgJ1wiIHVudGlsIGFsbCBvcGVuIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25zdWNjZXNzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRiID0gcmVxLnJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRiKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBkcm9wREJQcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRiKSB7XG4gICAgICAgICAgICAgICAgICAgIGRiQ29udGV4dC5kYiA9IGRiO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZvcmFnZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfZm9yYWdlID0gZm9yYWdlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hZHZhbmNlUmVhZGluZXNzKF9mb3JhZ2UuX2RiSW5mbyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVtcImNhdGNoXCJdKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgKF9yZWplY3RSZWFkaW5lc3Mob3B0aW9ucywgZXJyKSB8fCBQcm9taXNlJDEucmVzb2x2ZSgpKVtcImNhdGNoXCJdKGZ1bmN0aW9uICgpIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwcm9taXNlID0gZGJQcm9taXNlLnRoZW4oZnVuY3Rpb24gKGRiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKG9wdGlvbnMuc3RvcmVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIG5ld1ZlcnNpb24gPSBkYi52ZXJzaW9uICsgMTtcblxuICAgICAgICAgICAgICAgIF9kZWZlclJlYWRpbmVzcyhvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIHZhciBkYkNvbnRleHQgPSBkYkNvbnRleHRzW29wdGlvbnMubmFtZV07XG4gICAgICAgICAgICAgICAgdmFyIGZvcmFnZXMgPSBkYkNvbnRleHQuZm9yYWdlcztcblxuICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmb3JhZ2UgPSBmb3JhZ2VzW2ldO1xuICAgICAgICAgICAgICAgICAgICBmb3JhZ2UuX2RiSW5mby5kYiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGZvcmFnZS5fZGJJbmZvLnZlcnNpb24gPSBuZXdWZXJzaW9uO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBkcm9wT2JqZWN0UHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVxID0gaWRiLm9wZW4ob3B0aW9ucy5uYW1lLCBuZXdWZXJzaW9uKTtcblxuICAgICAgICAgICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYiA9IHJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9udXBncmFkZW5lZWRlZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYiA9IHJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5kZWxldGVPYmplY3RTdG9yZShvcHRpb25zLnN0b3JlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgcmVxLm9uc3VjY2VzcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYiA9IHJlcS5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYik7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZHJvcE9iamVjdFByb21pc2UudGhlbihmdW5jdGlvbiAoZGIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGJDb250ZXh0LmRiID0gZGI7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZm9yYWdlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9mb3JhZ2UyID0gZm9yYWdlc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9mb3JhZ2UyLl9kYkluZm8uZGIgPSBkYjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9hZHZhbmNlUmVhZGluZXNzKF9mb3JhZ2UyLl9kYkluZm8pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIChfcmVqZWN0UmVhZGluZXNzKG9wdGlvbnMsIGVycikgfHwgUHJvbWlzZSQxLnJlc29sdmUoKSlbXCJjYXRjaFwiXShmdW5jdGlvbiAoKSB7fSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxudmFyIGFzeW5jU3RvcmFnZSA9IHtcbiAgICBfZHJpdmVyOiAnYXN5bmNTdG9yYWdlJyxcbiAgICBfaW5pdFN0b3JhZ2U6IF9pbml0U3RvcmFnZSxcbiAgICBfc3VwcG9ydDogaXNJbmRleGVkREJWYWxpZCgpLFxuICAgIGl0ZXJhdGU6IGl0ZXJhdGUsXG4gICAgZ2V0SXRlbTogZ2V0SXRlbSxcbiAgICBzZXRJdGVtOiBzZXRJdGVtLFxuICAgIHJlbW92ZUl0ZW06IHJlbW92ZUl0ZW0sXG4gICAgY2xlYXI6IGNsZWFyLFxuICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgIGtleToga2V5LFxuICAgIGtleXM6IGtleXMsXG4gICAgZHJvcEluc3RhbmNlOiBkcm9wSW5zdGFuY2Vcbn07XG5cbmZ1bmN0aW9uIGlzV2ViU1FMVmFsaWQoKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvcGVuRGF0YWJhc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbi8vIFNhZGx5LCB0aGUgYmVzdCB3YXkgdG8gc2F2ZSBiaW5hcnkgZGF0YSBpbiBXZWJTUUwvbG9jYWxTdG9yYWdlIGlzIHNlcmlhbGl6aW5nXG4vLyBpdCB0byBCYXNlNjQsIHNvIHRoaXMgaXMgaG93IHdlIHN0b3JlIGl0IHRvIHByZXZlbnQgdmVyeSBzdHJhbmdlIGVycm9ycyB3aXRoIGxlc3Ncbi8vIHZlcmJvc2Ugd2F5cyBvZiBiaW5hcnkgPC0+IHN0cmluZyBkYXRhIHN0b3JhZ2UuXG52YXIgQkFTRV9DSEFSUyA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxudmFyIEJMT0JfVFlQRV9QUkVGSVggPSAnfn5sb2NhbF9mb3JhZ2VfdHlwZX4nO1xudmFyIEJMT0JfVFlQRV9QUkVGSVhfUkVHRVggPSAvXn5+bG9jYWxfZm9yYWdlX3R5cGV+KFtefl0rKX4vO1xuXG52YXIgU0VSSUFMSVpFRF9NQVJLRVIgPSAnX19sZnNjX186JztcbnZhciBTRVJJQUxJWkVEX01BUktFUl9MRU5HVEggPSBTRVJJQUxJWkVEX01BUktFUi5sZW5ndGg7XG5cbi8vIE9NRyB0aGUgc2VyaWFsaXphdGlvbnMhXG52YXIgVFlQRV9BUlJBWUJVRkZFUiA9ICdhcmJmJztcbnZhciBUWVBFX0JMT0IgPSAnYmxvYic7XG52YXIgVFlQRV9JTlQ4QVJSQVkgPSAnc2kwOCc7XG52YXIgVFlQRV9VSU5UOEFSUkFZID0gJ3VpMDgnO1xudmFyIFRZUEVfVUlOVDhDTEFNUEVEQVJSQVkgPSAndWljOCc7XG52YXIgVFlQRV9JTlQxNkFSUkFZID0gJ3NpMTYnO1xudmFyIFRZUEVfSU5UMzJBUlJBWSA9ICdzaTMyJztcbnZhciBUWVBFX1VJTlQxNkFSUkFZID0gJ3VyMTYnO1xudmFyIFRZUEVfVUlOVDMyQVJSQVkgPSAndWkzMic7XG52YXIgVFlQRV9GTE9BVDMyQVJSQVkgPSAnZmwzMic7XG52YXIgVFlQRV9GTE9BVDY0QVJSQVkgPSAnZmw2NCc7XG52YXIgVFlQRV9TRVJJQUxJWkVEX01BUktFUl9MRU5HVEggPSBTRVJJQUxJWkVEX01BUktFUl9MRU5HVEggKyBUWVBFX0FSUkFZQlVGRkVSLmxlbmd0aDtcblxudmFyIHRvU3RyaW5nJDEgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiBzdHJpbmdUb0J1ZmZlcihzZXJpYWxpemVkU3RyaW5nKSB7XG4gICAgLy8gRmlsbCB0aGUgc3RyaW5nIGludG8gYSBBcnJheUJ1ZmZlci5cbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gc2VyaWFsaXplZFN0cmluZy5sZW5ndGggKiAwLjc1O1xuICAgIHZhciBsZW4gPSBzZXJpYWxpemVkU3RyaW5nLmxlbmd0aDtcbiAgICB2YXIgaTtcbiAgICB2YXIgcCA9IDA7XG4gICAgdmFyIGVuY29kZWQxLCBlbmNvZGVkMiwgZW5jb2RlZDMsIGVuY29kZWQ0O1xuXG4gICAgaWYgKHNlcmlhbGl6ZWRTdHJpbmdbc2VyaWFsaXplZFN0cmluZy5sZW5ndGggLSAxXSA9PT0gJz0nKSB7XG4gICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICBpZiAoc2VyaWFsaXplZFN0cmluZ1tzZXJpYWxpemVkU3RyaW5nLmxlbmd0aCAtIDJdID09PSAnPScpIHtcbiAgICAgICAgICAgIGJ1ZmZlckxlbmd0aC0tO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihidWZmZXJMZW5ndGgpO1xuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICAgICAgZW5jb2RlZDEgPSBCQVNFX0NIQVJTLmluZGV4T2Yoc2VyaWFsaXplZFN0cmluZ1tpXSk7XG4gICAgICAgIGVuY29kZWQyID0gQkFTRV9DSEFSUy5pbmRleE9mKHNlcmlhbGl6ZWRTdHJpbmdbaSArIDFdKTtcbiAgICAgICAgZW5jb2RlZDMgPSBCQVNFX0NIQVJTLmluZGV4T2Yoc2VyaWFsaXplZFN0cmluZ1tpICsgMl0pO1xuICAgICAgICBlbmNvZGVkNCA9IEJBU0VfQ0hBUlMuaW5kZXhPZihzZXJpYWxpemVkU3RyaW5nW2kgKyAzXSk7XG5cbiAgICAgICAgLypqc2xpbnQgYml0d2lzZTogdHJ1ZSAqL1xuICAgICAgICBieXRlc1twKytdID0gZW5jb2RlZDEgPDwgMiB8IGVuY29kZWQyID4+IDQ7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDIgJiAxNSkgPDwgNCB8IGVuY29kZWQzID4+IDI7XG4gICAgICAgIGJ5dGVzW3ArK10gPSAoZW5jb2RlZDMgJiAzKSA8PCA2IHwgZW5jb2RlZDQgJiA2MztcbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuLy8gQ29udmVydHMgYSBidWZmZXIgdG8gYSBzdHJpbmcgdG8gc3RvcmUsIHNlcmlhbGl6ZWQsIGluIHRoZSBiYWNrZW5kXG4vLyBzdG9yYWdlIGxpYnJhcnkuXG5mdW5jdGlvbiBidWZmZXJUb1N0cmluZyhidWZmZXIpIHtcbiAgICAvLyBiYXNlNjQtYXJyYXlidWZmZXJcbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIHZhciBiYXNlNjRTdHJpbmcgPSAnJztcbiAgICB2YXIgaTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICAvKmpzbGludCBiaXR3aXNlOiB0cnVlICovXG4gICAgICAgIGJhc2U2NFN0cmluZyArPSBCQVNFX0NIQVJTW2J5dGVzW2ldID4+IDJdO1xuICAgICAgICBiYXNlNjRTdHJpbmcgKz0gQkFTRV9DSEFSU1soYnl0ZXNbaV0gJiAzKSA8PCA0IHwgYnl0ZXNbaSArIDFdID4+IDRdO1xuICAgICAgICBiYXNlNjRTdHJpbmcgKz0gQkFTRV9DSEFSU1soYnl0ZXNbaSArIDFdICYgMTUpIDw8IDIgfCBieXRlc1tpICsgMl0gPj4gNl07XG4gICAgICAgIGJhc2U2NFN0cmluZyArPSBCQVNFX0NIQVJTW2J5dGVzW2kgKyAyXSAmIDYzXTtcbiAgICB9XG5cbiAgICBpZiAoYnl0ZXMubGVuZ3RoICUgMyA9PT0gMikge1xuICAgICAgICBiYXNlNjRTdHJpbmcgPSBiYXNlNjRTdHJpbmcuc3Vic3RyaW5nKDAsIGJhc2U2NFN0cmluZy5sZW5ndGggLSAxKSArICc9JztcbiAgICB9IGVsc2UgaWYgKGJ5dGVzLmxlbmd0aCAlIDMgPT09IDEpIHtcbiAgICAgICAgYmFzZTY0U3RyaW5nID0gYmFzZTY0U3RyaW5nLnN1YnN0cmluZygwLCBiYXNlNjRTdHJpbmcubGVuZ3RoIC0gMikgKyAnPT0nO1xuICAgIH1cblxuICAgIHJldHVybiBiYXNlNjRTdHJpbmc7XG59XG5cbi8vIFNlcmlhbGl6ZSBhIHZhbHVlLCBhZnRlcndhcmRzIGV4ZWN1dGluZyBhIGNhbGxiYWNrICh3aGljaCB1c3VhbGx5XG4vLyBpbnN0cnVjdHMgdGhlIGBzZXRJdGVtKClgIGNhbGxiYWNrL3Byb21pc2UgdG8gYmUgZXhlY3V0ZWQpLiBUaGlzIGlzIGhvd1xuLy8gd2Ugc3RvcmUgYmluYXJ5IGRhdGEgd2l0aCBsb2NhbFN0b3JhZ2UuXG5mdW5jdGlvbiBzZXJpYWxpemUodmFsdWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHZhbHVlVHlwZSA9ICcnO1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB2YWx1ZVR5cGUgPSB0b1N0cmluZyQxLmNhbGwodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIENhbm5vdCB1c2UgYHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJgIG9yIHN1Y2ggaGVyZSwgYXMgdGhlc2VcbiAgICAvLyBjaGVja3MgZmFpbCB3aGVuIHJ1bm5pbmcgdGhlIHRlc3RzIHVzaW5nIGNhc3Blci5qcy4uLlxuICAgIC8vXG4gICAgLy8gVE9ETzogU2VlIHdoeSB0aG9zZSB0ZXN0cyBmYWlsIGFuZCB1c2UgYSBiZXR0ZXIgc29sdXRpb24uXG4gICAgaWYgKHZhbHVlICYmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScgfHwgdmFsdWUuYnVmZmVyICYmIHRvU3RyaW5nJDEuY2FsbCh2YWx1ZS5idWZmZXIpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSkge1xuICAgICAgICAvLyBDb252ZXJ0IGJpbmFyeSBhcnJheXMgdG8gYSBzdHJpbmcgYW5kIHByZWZpeCB0aGUgc3RyaW5nIHdpdGhcbiAgICAgICAgLy8gYSBzcGVjaWFsIG1hcmtlci5cbiAgICAgICAgdmFyIGJ1ZmZlcjtcbiAgICAgICAgdmFyIG1hcmtlciA9IFNFUklBTElaRURfTUFSS0VSO1xuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBidWZmZXIgPSB2YWx1ZTtcbiAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX0FSUkFZQlVGRkVSO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnVmZmVyID0gdmFsdWUuYnVmZmVyO1xuXG4gICAgICAgICAgICBpZiAodmFsdWVUeXBlID09PSAnW29iamVjdCBJbnQ4QXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX0lOVDhBUlJBWTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSAnW29iamVjdCBVaW50OEFycmF5XScpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgKz0gVFlQRV9VSU5UOEFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XScpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgKz0gVFlQRV9VSU5UOENMQU1QRURBUlJBWTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSAnW29iamVjdCBJbnQxNkFycmF5XScpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgKz0gVFlQRV9JTlQxNkFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IFVpbnQxNkFycmF5XScpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgKz0gVFlQRV9VSU5UMTZBUlJBWTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSAnW29iamVjdCBJbnQzMkFycmF5XScpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgKz0gVFlQRV9JTlQzMkFSUkFZO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IFVpbnQzMkFycmF5XScpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXIgKz0gVFlQRV9VSU5UMzJBUlJBWTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSAnW29iamVjdCBGbG9hdDMyQXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX0ZMT0FUMzJBUlJBWTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVUeXBlID09PSAnW29iamVjdCBGbG9hdDY0QXJyYXldJykge1xuICAgICAgICAgICAgICAgIG1hcmtlciArPSBUWVBFX0ZMT0FUNjRBUlJBWTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IHR5cGUgZm9yIEJpbmFyeUFycmF5JykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2FsbGJhY2sobWFya2VyICsgYnVmZmVyVG9TdHJpbmcoYnVmZmVyKSk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZVR5cGUgPT09ICdbb2JqZWN0IEJsb2JdJykge1xuICAgICAgICAvLyBDb252ZXIgdGhlIGJsb2IgdG8gYSBiaW5hcnlBcnJheSBhbmQgdGhlbiB0byBhIHN0cmluZy5cbiAgICAgICAgdmFyIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuXG4gICAgICAgIGZpbGVSZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gQmFja3dhcmRzLWNvbXBhdGlibGUgcHJlZml4IGZvciB0aGUgYmxvYiB0eXBlLlxuICAgICAgICAgICAgdmFyIHN0ciA9IEJMT0JfVFlQRV9QUkVGSVggKyB2YWx1ZS50eXBlICsgJ34nICsgYnVmZmVyVG9TdHJpbmcodGhpcy5yZXN1bHQpO1xuXG4gICAgICAgICAgICBjYWxsYmFjayhTRVJJQUxJWkVEX01BUktFUiArIFRZUEVfQkxPQiArIHN0cik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcih2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNhbGxiYWNrKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZG4ndCBjb252ZXJ0IHZhbHVlIGludG8gYSBKU09OIHN0cmluZzogXCIsIHZhbHVlKTtcblxuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIERlc2VyaWFsaXplIGRhdGEgd2UndmUgaW5zZXJ0ZWQgaW50byBhIHZhbHVlIGNvbHVtbi9maWVsZC4gV2UgcGxhY2Vcbi8vIHNwZWNpYWwgbWFya2VycyBpbnRvIG91ciBzdHJpbmdzIHRvIG1hcmsgdGhlbSBhcyBlbmNvZGVkOyB0aGlzIGlzbid0XG4vLyBhcyBuaWNlIGFzIGEgbWV0YSBmaWVsZCwgYnV0IGl0J3MgdGhlIG9ubHkgc2FuZSB0aGluZyB3ZSBjYW4gZG8gd2hpbHN0XG4vLyBrZWVwaW5nIGxvY2FsU3RvcmFnZSBzdXBwb3J0IGludGFjdC5cbi8vXG4vLyBPZnRlbnRpbWVzIHRoaXMgd2lsbCBqdXN0IGRlc2VyaWFsaXplIEpTT04gY29udGVudCwgYnV0IGlmIHdlIGhhdmUgYVxuLy8gc3BlY2lhbCBtYXJrZXIgKFNFUklBTElaRURfTUFSS0VSLCBkZWZpbmVkIGFib3ZlKSwgd2Ugd2lsbCBleHRyYWN0XG4vLyBzb21lIGtpbmQgb2YgYXJyYXlidWZmZXIvYmluYXJ5IGRhdGEvdHlwZWQgYXJyYXkgb3V0IG9mIHRoZSBzdHJpbmcuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZSh2YWx1ZSkge1xuICAgIC8vIElmIHdlIGhhdmVuJ3QgbWFya2VkIHRoaXMgc3RyaW5nIGFzIGJlaW5nIHNwZWNpYWxseSBzZXJpYWxpemVkIChpLmUuXG4gICAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gc2VyaWFsaXplZCBKU09OKSwgd2UgY2FuIGp1c3QgcmV0dXJuIGl0IGFuZCBiZVxuICAgIC8vIGRvbmUgd2l0aCBpdC5cbiAgICBpZiAodmFsdWUuc3Vic3RyaW5nKDAsIFNFUklBTElaRURfTUFSS0VSX0xFTkdUSCkgIT09IFNFUklBTElaRURfTUFSS0VSKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZm9sbG93aW5nIGNvZGUgZGVhbHMgd2l0aCBkZXNlcmlhbGl6aW5nIHNvbWUga2luZCBvZiBCbG9iIG9yXG4gICAgLy8gVHlwZWRBcnJheS4gRmlyc3Qgd2Ugc2VwYXJhdGUgb3V0IHRoZSB0eXBlIG9mIGRhdGEgd2UncmUgZGVhbGluZ1xuICAgIC8vIHdpdGggZnJvbSB0aGUgZGF0YSBpdHNlbGYuXG4gICAgdmFyIHNlcmlhbGl6ZWRTdHJpbmcgPSB2YWx1ZS5zdWJzdHJpbmcoVFlQRV9TRVJJQUxJWkVEX01BUktFUl9MRU5HVEgpO1xuICAgIHZhciB0eXBlID0gdmFsdWUuc3Vic3RyaW5nKFNFUklBTElaRURfTUFSS0VSX0xFTkdUSCwgVFlQRV9TRVJJQUxJWkVEX01BUktFUl9MRU5HVEgpO1xuXG4gICAgdmFyIGJsb2JUeXBlO1xuICAgIC8vIEJhY2t3YXJkcy1jb21wYXRpYmxlIGJsb2IgdHlwZSBzZXJpYWxpemF0aW9uIHN0cmF0ZWd5LlxuICAgIC8vIERCcyBjcmVhdGVkIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgbG9jYWxGb3JhZ2Ugd2lsbCBzaW1wbHkgbm90IGhhdmUgdGhlIGJsb2IgdHlwZS5cbiAgICBpZiAodHlwZSA9PT0gVFlQRV9CTE9CICYmIEJMT0JfVFlQRV9QUkVGSVhfUkVHRVgudGVzdChzZXJpYWxpemVkU3RyaW5nKSkge1xuICAgICAgICB2YXIgbWF0Y2hlciA9IHNlcmlhbGl6ZWRTdHJpbmcubWF0Y2goQkxPQl9UWVBFX1BSRUZJWF9SRUdFWCk7XG4gICAgICAgIGJsb2JUeXBlID0gbWF0Y2hlclsxXTtcbiAgICAgICAgc2VyaWFsaXplZFN0cmluZyA9IHNlcmlhbGl6ZWRTdHJpbmcuc3Vic3RyaW5nKG1hdGNoZXJbMF0ubGVuZ3RoKTtcbiAgICB9XG4gICAgdmFyIGJ1ZmZlciA9IHN0cmluZ1RvQnVmZmVyKHNlcmlhbGl6ZWRTdHJpbmcpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSByaWdodCB0eXBlIGJhc2VkIG9uIHRoZSBjb2RlL3R5cGUgc2V0IGR1cmluZ1xuICAgIC8vIHNlcmlhbGl6YXRpb24uXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgVFlQRV9BUlJBWUJVRkZFUjpcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIGNhc2UgVFlQRV9CTE9COlxuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUJsb2IoW2J1ZmZlcl0sIHsgdHlwZTogYmxvYlR5cGUgfSk7XG4gICAgICAgIGNhc2UgVFlQRV9JTlQ4QVJSQVk6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludDhBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlIFRZUEVfVUlOVDhBUlJBWTpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlIFRZUEVfVUlOVDhDTEFNUEVEQVJSQVk6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGNhc2UgVFlQRV9JTlQxNkFSUkFZOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnQxNkFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGNhc2UgVFlQRV9VSU5UMTZBUlJBWTpcbiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDE2QXJyYXkoYnVmZmVyKTtcbiAgICAgICAgY2FzZSBUWVBFX0lOVDMyQVJSQVk6XG4gICAgICAgICAgICByZXR1cm4gbmV3IEludDMyQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgY2FzZSBUWVBFX1VJTlQzMkFSUkFZOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShidWZmZXIpO1xuICAgICAgICBjYXNlIFRZUEVfRkxPQVQzMkFSUkFZOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoYnVmZmVyKTtcbiAgICAgICAgY2FzZSBUWVBFX0ZMT0FUNjRBUlJBWTpcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXQ2NEFycmF5KGJ1ZmZlcik7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua293biB0eXBlOiAnICsgdHlwZSk7XG4gICAgfVxufVxuXG52YXIgbG9jYWxmb3JhZ2VTZXJpYWxpemVyID0ge1xuICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxuICAgIGRlc2VyaWFsaXplOiBkZXNlcmlhbGl6ZSxcbiAgICBzdHJpbmdUb0J1ZmZlcjogc3RyaW5nVG9CdWZmZXIsXG4gICAgYnVmZmVyVG9TdHJpbmc6IGJ1ZmZlclRvU3RyaW5nXG59O1xuXG4vKlxuICogSW5jbHVkZXMgY29kZSBmcm9tOlxuICpcbiAqIGJhc2U2NC1hcnJheWJ1ZmZlclxuICogaHR0cHM6Ly9naXRodWIuY29tL25pa2xhc3ZoL2Jhc2U2NC1hcnJheWJ1ZmZlclxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxMiBOaWtsYXMgdm9uIEhlcnR6ZW5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG5mdW5jdGlvbiBjcmVhdGVEYlRhYmxlKHQsIGRiSW5mbywgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHtcbiAgICB0LmV4ZWN1dGVTcWwoJ0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICcgKyBkYkluZm8uc3RvcmVOYW1lICsgJyAnICsgJyhpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBrZXkgdW5pcXVlLCB2YWx1ZSknLCBbXSwgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xufVxuXG4vLyBPcGVuIHRoZSBXZWJTUUwgZGF0YWJhc2UgKGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBvbmUgaWYgb25lIGRpZG4ndFxuLy8gcHJldmlvdXNseSBleGlzdCksIHVzaW5nIGFueSBvcHRpb25zIHNldCBpbiB0aGUgY29uZmlnLlxuZnVuY3Rpb24gX2luaXRTdG9yYWdlJDEob3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGJJbmZvID0ge1xuICAgICAgICBkYjogbnVsbFxuICAgIH07XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgICBmb3IgKHZhciBpIGluIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGRiSW5mb1tpXSA9IHR5cGVvZiBvcHRpb25zW2ldICE9PSAnc3RyaW5nJyA/IG9wdGlvbnNbaV0udG9TdHJpbmcoKSA6IG9wdGlvbnNbaV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGJJbmZvUHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAvLyBPcGVuIHRoZSBkYXRhYmFzZTsgdGhlIG9wZW5EYXRhYmFzZSBBUEkgd2lsbCBhdXRvbWF0aWNhbGx5XG4gICAgICAgIC8vIGNyZWF0ZSBpdCBmb3IgdXMgaWYgaXQgZG9lc24ndCBleGlzdC5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRiSW5mby5kYiA9IG9wZW5EYXRhYmFzZShkYkluZm8ubmFtZSwgU3RyaW5nKGRiSW5mby52ZXJzaW9uKSwgZGJJbmZvLmRlc2NyaXB0aW9uLCBkYkluZm8uc2l6ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgb3VyIGtleS92YWx1ZSB0YWJsZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgICAgICBkYkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIGNyZWF0ZURiVGFibGUodCwgZGJJbmZvLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5fZGJJbmZvID0gZGJJbmZvO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGRiSW5mby5zZXJpYWxpemVyID0gbG9jYWxmb3JhZ2VTZXJpYWxpemVyO1xuICAgIHJldHVybiBkYkluZm9Qcm9taXNlO1xufVxuXG5mdW5jdGlvbiB0cnlFeGVjdXRlU3FsKHQsIGRiSW5mbywgc3FsU3RhdGVtZW50LCBhcmdzLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaykge1xuICAgIHQuZXhlY3V0ZVNxbChzcWxTdGF0ZW1lbnQsIGFyZ3MsIGNhbGxiYWNrLCBmdW5jdGlvbiAodCwgZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09IGVycm9yLlNZTlRBWF9FUlIpIHtcbiAgICAgICAgICAgIHQuZXhlY3V0ZVNxbCgnU0VMRUNUIG5hbWUgRlJPTSBzcWxpdGVfbWFzdGVyICcgKyBcIldIRVJFIHR5cGU9J3RhYmxlJyBBTkQgbmFtZSA9ID9cIiwgW2RiSW5mby5zdG9yZU5hbWVdLCBmdW5jdGlvbiAodCwgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0cy5yb3dzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFibGUgaXMgbWlzc2luZyAod2FzIGRlbGV0ZWQpXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlLWNyZWF0ZSBpdCB0YWJsZSBhbmQgcmV0cnlcbiAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGJUYWJsZSh0LCBkYkluZm8sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQuZXhlY3V0ZVNxbChzcWxTdGF0ZW1lbnQsIGFyZ3MsIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjayh0LCBlcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZXJyb3JDYWxsYmFjayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrKHQsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sIGVycm9yQ2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBnZXRJdGVtJDEoa2V5LCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgICAgIGRiSW5mby5kYi50cmFuc2FjdGlvbihmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHRyeUV4ZWN1dGVTcWwodCwgZGJJbmZvLCAnU0VMRUNUICogRlJPTSAnICsgZGJJbmZvLnN0b3JlTmFtZSArICcgV0hFUkUga2V5ID0gPyBMSU1JVCAxJywgW2tleV0sIGZ1bmN0aW9uICh0LCByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSByZXN1bHRzLnJvd3MubGVuZ3RoID8gcmVzdWx0cy5yb3dzLml0ZW0oMCkudmFsdWUgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHNlcmlhbGl6ZWQgY29udGVudCB3ZSBuZWVkIHRvXG4gICAgICAgICAgICAgICAgICAgIC8vIHVucGFjay5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGJJbmZvLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBpdGVyYXRlJDEoaXRlcmF0b3IsIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcblxuICAgICAgICAgICAgZGJJbmZvLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdHJ5RXhlY3V0ZVNxbCh0LCBkYkluZm8sICdTRUxFQ1QgKiBGUk9NICcgKyBkYkluZm8uc3RvcmVOYW1lLCBbXSwgZnVuY3Rpb24gKHQsIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSByZXN1bHRzLnJvd3M7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSByb3dzLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IHJvd3MuaXRlbShpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBpdGVtLnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBzZXJpYWxpemVkIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gdW5wYWNrLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRiSW5mby5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGl0ZXJhdG9yKHJlc3VsdCwgaXRlbS5rZXksIGkgKyAxKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9pZCgwKSBwcmV2ZW50cyBwcm9ibGVtcyB3aXRoIHJlZGVmaW5pdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgYHVuZGVmaW5lZGAuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIF9zZXRJdGVtKGtleSwgdmFsdWUsIGNhbGxiYWNrLCByZXRyaWVzTGVmdCkge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIGtleSA9IG5vcm1hbGl6ZUtleShrZXkpO1xuXG4gICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gVGhlIGxvY2FsU3RvcmFnZSBBUEkgZG9lc24ndCByZXR1cm4gdW5kZWZpbmVkIHZhbHVlcyBpbiBhblxuICAgICAgICAgICAgLy8gXCJleHBlY3RlZFwiIHdheSwgc28gdW5kZWZpbmVkIGlzIGFsd2F5cyBjYXN0IHRvIG51bGwgaW4gYWxsXG4gICAgICAgICAgICAvLyBkcml2ZXJzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL2xvY2FsRm9yYWdlL3B1bGwvNDJcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCB2YWx1ZSB0byBwYXNzIHRvIHRoZSBjYWxsYmFjay5cbiAgICAgICAgICAgIHZhciBvcmlnaW5hbFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgICAgIHZhciBkYkluZm8gPSBzZWxmLl9kYkluZm87XG4gICAgICAgICAgICBkYkluZm8uc2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUsIGZ1bmN0aW9uICh2YWx1ZSwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkYkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeUV4ZWN1dGVTcWwodCwgZGJJbmZvLCAnSU5TRVJUIE9SIFJFUExBQ0UgSU5UTyAnICsgZGJJbmZvLnN0b3JlTmFtZSArICcgJyArICcoa2V5LCB2YWx1ZSkgVkFMVUVTICg/LCA/KScsIFtrZXksIHZhbHVlXSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUob3JpZ2luYWxWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uIChzcWxFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRyYW5zYWN0aW9uIGZhaWxlZDsgY2hlY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHNlZSBpZiBpdCdzIGEgcXVvdGEgZXJyb3IuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3FsRXJyb3IuY29kZSA9PT0gc3FsRXJyb3IuUVVPVEFfRVJSKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgcmVqZWN0IHRoZSBjYWxsYmFjayBvdXRyaWdodCBmb3Igbm93LCBidXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIHdvcnRoIHRyeWluZyB0byByZS1ydW4gdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW4gaWYgdGhlIHVzZXIgYWNjZXB0cyB0aGUgcHJvbXB0IHRvIHVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgc3RvcmFnZSBvbiBTYWZhcmksIHRoaXMgZXJyb3Igd2lsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIGNhbGxlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyeSB0byByZS1ydW4gdGhlIHRyYW5zYWN0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXRyaWVzTGVmdCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShfc2V0SXRlbS5hcHBseShzZWxmLCBba2V5LCBvcmlnaW5hbFZhbHVlLCBjYWxsYmFjaywgcmV0cmllc0xlZnQgLSAxXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChzcWxFcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBzZXRJdGVtJDEoa2V5LCB2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICByZXR1cm4gX3NldEl0ZW0uYXBwbHkodGhpcywgW2tleSwgdmFsdWUsIGNhbGxiYWNrLCAxXSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUl0ZW0kMShrZXksIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAga2V5ID0gbm9ybWFsaXplS2V5KGtleSk7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICAgICAgZGJJbmZvLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdHJ5RXhlY3V0ZVNxbCh0LCBkYkluZm8sICdERUxFVEUgRlJPTSAnICsgZGJJbmZvLnN0b3JlTmFtZSArICcgV0hFUkUga2V5ID0gPycsIFtrZXldLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG4vLyBEZWxldGVzIGV2ZXJ5IGl0ZW0gaW4gdGhlIHRhYmxlLlxuLy8gVE9ETzogRmluZCBvdXQgaWYgdGhpcyByZXNldHMgdGhlIEFVVE9fSU5DUkVNRU5UIG51bWJlci5cbmZ1bmN0aW9uIGNsZWFyJDEoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICAgICAgZGJJbmZvLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdHJ5RXhlY3V0ZVNxbCh0LCBkYkluZm8sICdERUxFVEUgRlJPTSAnICsgZGJJbmZvLnN0b3JlTmFtZSwgW10sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0ocmVqZWN0KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIERvZXMgYSBzaW1wbGUgYENPVU5UKGtleSlgIHRvIGdldCB0aGUgbnVtYmVyIG9mIGl0ZW1zIHN0b3JlZCBpblxuLy8gbG9jYWxGb3JhZ2UuXG5mdW5jdGlvbiBsZW5ndGgkMShjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYkluZm8gPSBzZWxmLl9kYkluZm87XG4gICAgICAgICAgICBkYkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAvLyBBaGhoLCBTUUwgbWFrZXMgdGhpcyBvbmUgc29vb29vbyBlYXN5LlxuICAgICAgICAgICAgICAgIHRyeUV4ZWN1dGVTcWwodCwgZGJJbmZvLCAnU0VMRUNUIENPVU5UKGtleSkgYXMgYyBGUk9NICcgKyBkYkluZm8uc3RvcmVOYW1lLCBbXSwgZnVuY3Rpb24gKHQsIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHMucm93cy5pdGVtKDApLmM7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG4vLyBSZXR1cm4gdGhlIGtleSBsb2NhdGVkIGF0IGtleSBpbmRleCBYOyBlc3NlbnRpYWxseSBnZXRzIHRoZSBrZXkgZnJvbSBhXG4vLyBgV0hFUkUgaWQgPSA/YC4gVGhpcyBpcyB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IEkgY2FuIHRoaW5rIHRvIGltcGxlbWVudFxuLy8gdGhpcyByYXJlbHktdXNlZCAoaW4gbXkgZXhwZXJpZW5jZSkgcGFydCBvZiB0aGUgQVBJLCBidXQgaXQgY2FuIHNlZW1cbi8vIGluY29uc2lzdGVudCwgYmVjYXVzZSB3ZSBkbyBgSU5TRVJUIE9SIFJFUExBQ0UgSU5UT2Agb24gYHNldEl0ZW0oKWAsIHNvXG4vLyB0aGUgSUQgb2YgZWFjaCBrZXkgd2lsbCBjaGFuZ2UgZXZlcnkgdGltZSBpdCdzIHVwZGF0ZWQuIFBlcmhhcHMgYSBzdG9yZWRcbi8vIHByb2NlZHVyZSBmb3IgdGhlIGBzZXRJdGVtKClgIFNRTCB3b3VsZCBzb2x2ZSB0aGlzIHByb2JsZW0/XG4vLyBUT0RPOiBEb24ndCBjaGFuZ2UgSUQgb24gYHNldEl0ZW0oKWAuXG5mdW5jdGlvbiBrZXkkMShuLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkYkluZm8gPSBzZWxmLl9kYkluZm87XG4gICAgICAgICAgICBkYkluZm8uZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICB0cnlFeGVjdXRlU3FsKHQsIGRiSW5mbywgJ1NFTEVDVCBrZXkgRlJPTSAnICsgZGJJbmZvLnN0b3JlTmFtZSArICcgV0hFUkUgaWQgPSA/IExJTUlUIDEnLCBbbiArIDFdLCBmdW5jdGlvbiAodCwgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gcmVzdWx0cy5yb3dzLmxlbmd0aCA/IHJlc3VsdHMucm93cy5pdGVtKDApLmtleSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVtcImNhdGNoXCJdKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG5mdW5jdGlvbiBrZXlzJDEoY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBzZWxmLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICAgICAgZGJJbmZvLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgdHJ5RXhlY3V0ZVNxbCh0LCBkYkluZm8sICdTRUxFQ1Qga2V5IEZST00gJyArIGRiSW5mby5zdG9yZU5hbWUsIFtdLCBmdW5jdGlvbiAodCwgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5yb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnB1c2gocmVzdWx0cy5yb3dzLml0ZW0oaSkua2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoa2V5cyk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHQsIGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlbXCJjYXRjaFwiXShyZWplY3QpO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmRhdGFiYXNlLyNkYXRhYmFzZXNcbi8vID4gVGhlcmUgaXMgbm8gd2F5IHRvIGVudW1lcmF0ZSBvciBkZWxldGUgdGhlIGRhdGFiYXNlcyBhdmFpbGFibGUgZm9yIGFuIG9yaWdpbiBmcm9tIHRoaXMgQVBJLlxuZnVuY3Rpb24gZ2V0QWxsU3RvcmVOYW1lcyhkYikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZGIudHJhbnNhY3Rpb24oZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgIHQuZXhlY3V0ZVNxbCgnU0VMRUNUIG5hbWUgRlJPTSBzcWxpdGVfbWFzdGVyICcgKyBcIldIRVJFIHR5cGU9J3RhYmxlJyBBTkQgbmFtZSA8PiAnX19XZWJLaXREYXRhYmFzZUluZm9UYWJsZV9fJ1wiLCBbXSwgZnVuY3Rpb24gKHQsIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgc3RvcmVOYW1lcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLnJvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmVOYW1lcy5wdXNoKHJlc3VsdHMucm93cy5pdGVtKGkpLm5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgICAgICAgICBkYjogZGIsXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlTmFtZXM6IHN0b3JlTmFtZXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIGZ1bmN0aW9uICh0LCBlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKHNxbEVycm9yKSB7XG4gICAgICAgICAgICByZWplY3Qoc3FsRXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gZHJvcEluc3RhbmNlJDEob3B0aW9ucywgY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjayA9IGdldENhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICB2YXIgY3VycmVudENvbmZpZyA9IHRoaXMuY29uZmlnKCk7XG4gICAgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zICE9PSAnZnVuY3Rpb24nICYmIG9wdGlvbnMgfHwge307XG4gICAgaWYgKCFvcHRpb25zLm5hbWUpIHtcbiAgICAgICAgb3B0aW9ucy5uYW1lID0gb3B0aW9ucy5uYW1lIHx8IGN1cnJlbnRDb25maWcubmFtZTtcbiAgICAgICAgb3B0aW9ucy5zdG9yZU5hbWUgPSBvcHRpb25zLnN0b3JlTmFtZSB8fCBjdXJyZW50Q29uZmlnLnN0b3JlTmFtZTtcbiAgICB9XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdmFyIHByb21pc2U7XG4gICAgaWYgKCFvcHRpb25zLm5hbWUpIHtcbiAgICAgICAgcHJvbWlzZSA9IFByb21pc2UkMS5yZWplY3QoJ0ludmFsaWQgYXJndW1lbnRzJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICAgIHZhciBkYjtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLm5hbWUgPT09IGN1cnJlbnRDb25maWcubmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZGIgcmVmZXJlbmNlIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlXG4gICAgICAgICAgICAgICAgZGIgPSBzZWxmLl9kYkluZm8uZGI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRiID0gb3BlbkRhdGFiYXNlKG9wdGlvbnMubmFtZSwgJycsICcnLCAwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnN0b3JlTmFtZSkge1xuICAgICAgICAgICAgICAgIC8vIGRyb3AgYWxsIGRhdGFiYXNlIHRhYmxlc1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZ2V0QWxsU3RvcmVOYW1lcyhkYikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgICAgICAgZGI6IGRiLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZU5hbWVzOiBbb3B0aW9ucy5zdG9yZU5hbWVdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKG9wZXJhdGlvbkluZm8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25JbmZvLmRiLnRyYW5zYWN0aW9uKGZ1bmN0aW9uICh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRyb3BUYWJsZShzdG9yZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmV4ZWN1dGVTcWwoJ0RST1AgVEFCTEUgSUYgRVhJU1RTICcgKyBzdG9yZU5hbWUsIFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAodCwgZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG9wZXJhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IG9wZXJhdGlvbkluZm8uc3RvcmVOYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy5wdXNoKGRyb3BUYWJsZShvcGVyYXRpb25JbmZvLnN0b3JlTmFtZXNbaV0pKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UkMS5hbGwob3BlcmF0aW9ucykudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKHNxbEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChzcWxFcnJvcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxudmFyIHdlYlNRTFN0b3JhZ2UgPSB7XG4gICAgX2RyaXZlcjogJ3dlYlNRTFN0b3JhZ2UnLFxuICAgIF9pbml0U3RvcmFnZTogX2luaXRTdG9yYWdlJDEsXG4gICAgX3N1cHBvcnQ6IGlzV2ViU1FMVmFsaWQoKSxcbiAgICBpdGVyYXRlOiBpdGVyYXRlJDEsXG4gICAgZ2V0SXRlbTogZ2V0SXRlbSQxLFxuICAgIHNldEl0ZW06IHNldEl0ZW0kMSxcbiAgICByZW1vdmVJdGVtOiByZW1vdmVJdGVtJDEsXG4gICAgY2xlYXI6IGNsZWFyJDEsXG4gICAgbGVuZ3RoOiBsZW5ndGgkMSxcbiAgICBrZXk6IGtleSQxLFxuICAgIGtleXM6IGtleXMkMSxcbiAgICBkcm9wSW5zdGFuY2U6IGRyb3BJbnN0YW5jZSQxXG59O1xuXG5mdW5jdGlvbiBpc0xvY2FsU3RvcmFnZVZhbGlkKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgbG9jYWxTdG9yYWdlICE9PSAndW5kZWZpbmVkJyAmJiAnc2V0SXRlbScgaW4gbG9jYWxTdG9yYWdlICYmXG4gICAgICAgIC8vIGluIElFOCB0eXBlb2YgbG9jYWxTdG9yYWdlLnNldEl0ZW0gPT09ICdvYmplY3QnXG4gICAgICAgICEhbG9jYWxTdG9yYWdlLnNldEl0ZW07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBfZ2V0S2V5UHJlZml4KG9wdGlvbnMsIGRlZmF1bHRDb25maWcpIHtcbiAgICB2YXIga2V5UHJlZml4ID0gb3B0aW9ucy5uYW1lICsgJy8nO1xuXG4gICAgaWYgKG9wdGlvbnMuc3RvcmVOYW1lICE9PSBkZWZhdWx0Q29uZmlnLnN0b3JlTmFtZSkge1xuICAgICAgICBrZXlQcmVmaXggKz0gb3B0aW9ucy5zdG9yZU5hbWUgKyAnLyc7XG4gICAgfVxuICAgIHJldHVybiBrZXlQcmVmaXg7XG59XG5cbi8vIENoZWNrIGlmIGxvY2FsU3RvcmFnZSB0aHJvd3Mgd2hlbiBzYXZpbmcgYW4gaXRlbVxuZnVuY3Rpb24gY2hlY2tJZkxvY2FsU3RvcmFnZVRocm93cygpIHtcbiAgICB2YXIgbG9jYWxTdG9yYWdlVGVzdEtleSA9ICdfbG9jYWxmb3JhZ2Vfc3VwcG9ydF90ZXN0JztcblxuICAgIHRyeSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGxvY2FsU3RvcmFnZVRlc3RLZXksIHRydWUpO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShsb2NhbFN0b3JhZ2VUZXN0S2V5KTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59XG5cbi8vIENoZWNrIGlmIGxvY2FsU3RvcmFnZSBpcyB1c2FibGUgYW5kIGFsbG93cyB0byBzYXZlIGFuIGl0ZW1cbi8vIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiBsb2NhbFN0b3JhZ2UgaXMgdXNhYmxlIGluIFNhZmFyaSBQcml2YXRlIEJyb3dzaW5nXG4vLyBtb2RlLCBvciBpbiBhbnkgb3RoZXIgY2FzZSB3aGVyZSB0aGUgYXZhaWxhYmxlIHF1b3RhIGZvciBsb2NhbFN0b3JhZ2Vcbi8vIGlzIDAgYW5kIHRoZXJlIHdhc24ndCBhbnkgc2F2ZWQgaXRlbXMgeWV0LlxuZnVuY3Rpb24gX2lzTG9jYWxTdG9yYWdlVXNhYmxlKCkge1xuICAgIHJldHVybiAhY2hlY2tJZkxvY2FsU3RvcmFnZVRocm93cygpIHx8IGxvY2FsU3RvcmFnZS5sZW5ndGggPiAwO1xufVxuXG4vLyBDb25maWcgdGhlIGxvY2FsU3RvcmFnZSBiYWNrZW5kLCB1c2luZyBvcHRpb25zIHNldCBpbiB0aGUgY29uZmlnLlxuZnVuY3Rpb24gX2luaXRTdG9yYWdlJDIob3B0aW9ucykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgZGJJbmZvID0ge307XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgZm9yICh2YXIgaSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICBkYkluZm9baV0gPSBvcHRpb25zW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGJJbmZvLmtleVByZWZpeCA9IF9nZXRLZXlQcmVmaXgob3B0aW9ucywgc2VsZi5fZGVmYXVsdENvbmZpZyk7XG5cbiAgICBpZiAoIV9pc0xvY2FsU3RvcmFnZVVzYWJsZSgpKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlJDEucmVqZWN0KCk7XG4gICAgfVxuXG4gICAgc2VsZi5fZGJJbmZvID0gZGJJbmZvO1xuICAgIGRiSW5mby5zZXJpYWxpemVyID0gbG9jYWxmb3JhZ2VTZXJpYWxpemVyO1xuXG4gICAgcmV0dXJuIFByb21pc2UkMS5yZXNvbHZlKCk7XG59XG5cbi8vIFJlbW92ZSBhbGwga2V5cyBmcm9tIHRoZSBkYXRhc3RvcmUsIGVmZmVjdGl2ZWx5IGRlc3Ryb3lpbmcgYWxsIGRhdGEgaW5cbi8vIHRoZSBhcHAncyBrZXkvdmFsdWUgc3RvcmUhXG5mdW5jdGlvbiBjbGVhciQyKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBwcm9taXNlID0gc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIga2V5UHJlZml4ID0gc2VsZi5fZGJJbmZvLmtleVByZWZpeDtcblxuICAgICAgICBmb3IgKHZhciBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcblxuICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKGtleVByZWZpeCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG4vLyBSZXRyaWV2ZSBhbiBpdGVtIGZyb20gdGhlIHN0b3JlLiBVbmxpa2UgdGhlIG9yaWdpbmFsIGFzeW5jX3N0b3JhZ2Vcbi8vIGxpYnJhcnkgaW4gR2FpYSwgd2UgZG9uJ3QgbW9kaWZ5IHJldHVybiB2YWx1ZXMgYXQgYWxsLiBJZiBhIGtleSdzIHZhbHVlXG4vLyBpcyBgdW5kZWZpbmVkYCwgd2UgcGFzcyB0aGF0IHZhbHVlIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbmZ1bmN0aW9uIGdldEl0ZW0kMihrZXksIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAga2V5ID0gbm9ybWFsaXplS2V5KGtleSk7XG5cbiAgICB2YXIgcHJvbWlzZSA9IHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgdmFyIHJlc3VsdCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKGRiSW5mby5rZXlQcmVmaXggKyBrZXkpO1xuXG4gICAgICAgIC8vIElmIGEgcmVzdWx0IHdhcyBmb3VuZCwgcGFyc2UgaXQgZnJvbSB0aGUgc2VyaWFsaXplZFxuICAgICAgICAvLyBzdHJpbmcgaW50byBhIEpTIG9iamVjdC4gSWYgcmVzdWx0IGlzbid0IHRydXRoeSwgdGhlIGtleVxuICAgICAgICAvLyBpcyBsaWtlbHkgdW5kZWZpbmVkIGFuZCB3ZSdsbCBwYXNzIGl0IHN0cmFpZ2h0IHRvIHRoZVxuICAgICAgICAvLyBjYWxsYmFjay5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZGJJbmZvLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocmVzdWx0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG4vLyBJdGVyYXRlIG92ZXIgYWxsIGl0ZW1zIGluIHRoZSBzdG9yZS5cbmZ1bmN0aW9uIGl0ZXJhdGUkMihpdGVyYXRvciwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICB2YXIgcHJvbWlzZSA9IHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgdmFyIGtleVByZWZpeCA9IGRiSW5mby5rZXlQcmVmaXg7XG4gICAgICAgIHZhciBrZXlQcmVmaXhMZW5ndGggPSBrZXlQcmVmaXgubGVuZ3RoO1xuICAgICAgICB2YXIgbGVuZ3RoID0gbG9jYWxTdG9yYWdlLmxlbmd0aDtcblxuICAgICAgICAvLyBXZSB1c2UgYSBkZWRpY2F0ZWQgaXRlcmF0b3IgaW5zdGVhZCBvZiB0aGUgYGlgIHZhcmlhYmxlIGJlbG93XG4gICAgICAgIC8vIHNvIG90aGVyIGtleXMgd2UgZmV0Y2ggaW4gbG9jYWxTdG9yYWdlIGFyZW4ndCBjb3VudGVkIGluXG4gICAgICAgIC8vIHRoZSBgaXRlcmF0aW9uTnVtYmVyYCBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGBpdGVyYXRlKClgXG4gICAgICAgIC8vIGNhbGxiYWNrLlxuICAgICAgICAvL1xuICAgICAgICAvLyBTZWU6IGdpdGh1Yi5jb20vbW96aWxsYS9sb2NhbEZvcmFnZS9wdWxsLzQzNSNkaXNjdXNzaW9uX3IzODA2MTUzMFxuICAgICAgICB2YXIgaXRlcmF0aW9uTnVtYmVyID0gMTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0gbG9jYWxTdG9yYWdlLmtleShpKTtcbiAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZihrZXlQcmVmaXgpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdmFsdWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgICAgICAvLyBJZiBhIHJlc3VsdCB3YXMgZm91bmQsIHBhcnNlIGl0IGZyb20gdGhlIHNlcmlhbGl6ZWRcbiAgICAgICAgICAgIC8vIHN0cmluZyBpbnRvIGEgSlMgb2JqZWN0LiBJZiByZXN1bHQgaXNuJ3QgdHJ1dGh5LCB0aGVcbiAgICAgICAgICAgIC8vIGtleSBpcyBsaWtlbHkgdW5kZWZpbmVkIGFuZCB3ZSdsbCBwYXNzIGl0IHN0cmFpZ2h0XG4gICAgICAgICAgICAvLyB0byB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGRiSW5mby5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHZhbHVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFsdWUgPSBpdGVyYXRvcih2YWx1ZSwga2V5LnN1YnN0cmluZyhrZXlQcmVmaXhMZW5ndGgpLCBpdGVyYXRpb25OdW1iZXIrKyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG4vLyBTYW1lIGFzIGxvY2FsU3RvcmFnZSdzIGtleSgpIG1ldGhvZCwgZXhjZXB0IHRha2VzIGEgY2FsbGJhY2suXG5mdW5jdGlvbiBrZXkkMihuLCBjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcHJvbWlzZSA9IHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGxvY2FsU3RvcmFnZS5rZXkobik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBwcmVmaXggZnJvbSB0aGUga2V5LCBpZiBhIGtleSBpcyBmb3VuZC5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN1YnN0cmluZyhkYkluZm8ua2V5UHJlZml4Lmxlbmd0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuZnVuY3Rpb24ga2V5cyQyKGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHZhciBwcm9taXNlID0gc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZGJJbmZvID0gc2VsZi5fZGJJbmZvO1xuICAgICAgICB2YXIgbGVuZ3RoID0gbG9jYWxTdG9yYWdlLmxlbmd0aDtcbiAgICAgICAgdmFyIGtleXMgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaXRlbUtleSA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG4gICAgICAgICAgICBpZiAoaXRlbUtleS5pbmRleE9mKGRiSW5mby5rZXlQcmVmaXgpID09PSAwKSB7XG4gICAgICAgICAgICAgICAga2V5cy5wdXNoKGl0ZW1LZXkuc3Vic3RyaW5nKGRiSW5mby5rZXlQcmVmaXgubGVuZ3RoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ga2V5cztcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbi8vIFN1cHBseSB0aGUgbnVtYmVyIG9mIGtleXMgaW4gdGhlIGRhdGFzdG9yZSB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG5mdW5jdGlvbiBsZW5ndGgkMihjYWxsYmFjaykge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcHJvbWlzZSA9IHNlbGYua2V5cygpLnRoZW4oZnVuY3Rpb24gKGtleXMpIHtcbiAgICAgICAgcmV0dXJuIGtleXMubGVuZ3RoO1xuICAgIH0pO1xuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLy8gUmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgc3RvcmUsIG5pY2UgYW5kIHNpbXBsZS5cbmZ1bmN0aW9uIHJlbW92ZUl0ZW0kMihrZXksIGNhbGxiYWNrKSB7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAga2V5ID0gbm9ybWFsaXplS2V5KGtleSk7XG5cbiAgICB2YXIgcHJvbWlzZSA9IHNlbGYucmVhZHkoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oZGJJbmZvLmtleVByZWZpeCArIGtleSk7XG4gICAgfSk7XG5cbiAgICBleGVjdXRlQ2FsbGJhY2socHJvbWlzZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiBwcm9taXNlO1xufVxuXG4vLyBTZXQgYSBrZXkncyB2YWx1ZSBhbmQgcnVuIGFuIG9wdGlvbmFsIGNhbGxiYWNrIG9uY2UgdGhlIHZhbHVlIGlzIHNldC5cbi8vIFVubGlrZSBHYWlhJ3MgaW1wbGVtZW50YXRpb24sIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBwYXNzZWQgdGhlIHZhbHVlLFxuLy8gaW4gY2FzZSB5b3Ugd2FudCB0byBvcGVyYXRlIG9uIHRoYXQgdmFsdWUgb25seSBhZnRlciB5b3UncmUgc3VyZSBpdFxuLy8gc2F2ZWQsIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuXG5mdW5jdGlvbiBzZXRJdGVtJDIoa2V5LCB2YWx1ZSwgY2FsbGJhY2spIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICBrZXkgPSBub3JtYWxpemVLZXkoa2V5KTtcblxuICAgIHZhciBwcm9taXNlID0gc2VsZi5yZWFkeSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBDb252ZXJ0IHVuZGVmaW5lZCB2YWx1ZXMgdG8gbnVsbC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvbG9jYWxGb3JhZ2UvcHVsbC80MlxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdmFsdWUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgb3JpZ2luYWwgdmFsdWUgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2suXG4gICAgICAgIHZhciBvcmlnaW5hbFZhbHVlID0gdmFsdWU7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlJDEoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIGRiSW5mbyA9IHNlbGYuX2RiSW5mbztcbiAgICAgICAgICAgIGRiSW5mby5zZXJpYWxpemVyLnNlcmlhbGl6ZSh2YWx1ZSwgZnVuY3Rpb24gKHZhbHVlLCBlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShkYkluZm8ua2V5UHJlZml4ICsga2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG9yaWdpbmFsVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2NhbFN0b3JhZ2UgY2FwYWNpdHkgZXhjZWVkZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYWtlIHRoaXMgYSBzcGVjaWZpYyBlcnJvci9ldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdRdW90YUV4Y2VlZGVkRXJyb3InIHx8IGUubmFtZSA9PT0gJ05TX0VSUk9SX0RPTV9RVU9UQV9SRUFDSEVEJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG5cbmZ1bmN0aW9uIGRyb3BJbnN0YW5jZSQyKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gICAgY2FsbGJhY2sgPSBnZXRDYWxsYmFjay5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgb3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zICE9PSAnZnVuY3Rpb24nICYmIG9wdGlvbnMgfHwge307XG4gICAgaWYgKCFvcHRpb25zLm5hbWUpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRDb25maWcgPSB0aGlzLmNvbmZpZygpO1xuICAgICAgICBvcHRpb25zLm5hbWUgPSBvcHRpb25zLm5hbWUgfHwgY3VycmVudENvbmZpZy5uYW1lO1xuICAgICAgICBvcHRpb25zLnN0b3JlTmFtZSA9IG9wdGlvbnMuc3RvcmVOYW1lIHx8IGN1cnJlbnRDb25maWcuc3RvcmVOYW1lO1xuICAgIH1cblxuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB2YXIgcHJvbWlzZTtcbiAgICBpZiAoIW9wdGlvbnMubmFtZSkge1xuICAgICAgICBwcm9taXNlID0gUHJvbWlzZSQxLnJlamVjdCgnSW52YWxpZCBhcmd1bWVudHMnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlID0gbmV3IFByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnN0b3JlTmFtZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUob3B0aW9ucy5uYW1lICsgJy8nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShfZ2V0S2V5UHJlZml4KG9wdGlvbnMsIHNlbGYuX2RlZmF1bHRDb25maWcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoa2V5UHJlZml4KSB7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gbG9jYWxTdG9yYWdlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGxvY2FsU3RvcmFnZS5rZXkoaSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2Yoa2V5UHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZXhlY3V0ZUNhbGxiYWNrKHByb21pc2UsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbn1cblxudmFyIGxvY2FsU3RvcmFnZVdyYXBwZXIgPSB7XG4gICAgX2RyaXZlcjogJ2xvY2FsU3RvcmFnZVdyYXBwZXInLFxuICAgIF9pbml0U3RvcmFnZTogX2luaXRTdG9yYWdlJDIsXG4gICAgX3N1cHBvcnQ6IGlzTG9jYWxTdG9yYWdlVmFsaWQoKSxcbiAgICBpdGVyYXRlOiBpdGVyYXRlJDIsXG4gICAgZ2V0SXRlbTogZ2V0SXRlbSQyLFxuICAgIHNldEl0ZW06IHNldEl0ZW0kMixcbiAgICByZW1vdmVJdGVtOiByZW1vdmVJdGVtJDIsXG4gICAgY2xlYXI6IGNsZWFyJDIsXG4gICAgbGVuZ3RoOiBsZW5ndGgkMixcbiAgICBrZXk6IGtleSQyLFxuICAgIGtleXM6IGtleXMkMixcbiAgICBkcm9wSW5zdGFuY2U6IGRyb3BJbnN0YW5jZSQyXG59O1xuXG52YXIgc2FtZVZhbHVlID0gZnVuY3Rpb24gc2FtZVZhbHVlKHgsIHkpIHtcbiAgICByZXR1cm4geCA9PT0geSB8fCB0eXBlb2YgeCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIHkgPT09ICdudW1iZXInICYmIGlzTmFOKHgpICYmIGlzTmFOKHkpO1xufTtcblxudmFyIGluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMoYXJyYXksIHNlYXJjaEVsZW1lbnQpIHtcbiAgICB2YXIgbGVuID0gYXJyYXkubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGxlbikge1xuICAgICAgICBpZiAoc2FtZVZhbHVlKGFycmF5W2ldLCBzZWFyY2hFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbnZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiAoYXJnKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuLy8gRHJpdmVycyBhcmUgc3RvcmVkIGhlcmUgd2hlbiBgZGVmaW5lRHJpdmVyKClgIGlzIGNhbGxlZC5cbi8vIFRoZXkgYXJlIHNoYXJlZCBhY3Jvc3MgYWxsIGluc3RhbmNlcyBvZiBsb2NhbEZvcmFnZS5cbnZhciBEZWZpbmVkRHJpdmVycyA9IHt9O1xuXG52YXIgRHJpdmVyU3VwcG9ydCA9IHt9O1xuXG52YXIgRGVmYXVsdERyaXZlcnMgPSB7XG4gICAgSU5ERVhFRERCOiBhc3luY1N0b3JhZ2UsXG4gICAgV0VCU1FMOiB3ZWJTUUxTdG9yYWdlLFxuICAgIExPQ0FMU1RPUkFHRTogbG9jYWxTdG9yYWdlV3JhcHBlclxufTtcblxudmFyIERlZmF1bHREcml2ZXJPcmRlciA9IFtEZWZhdWx0RHJpdmVycy5JTkRFWEVEREIuX2RyaXZlciwgRGVmYXVsdERyaXZlcnMuV0VCU1FMLl9kcml2ZXIsIERlZmF1bHREcml2ZXJzLkxPQ0FMU1RPUkFHRS5fZHJpdmVyXTtcblxudmFyIE9wdGlvbmFsRHJpdmVyTWV0aG9kcyA9IFsnZHJvcEluc3RhbmNlJ107XG5cbnZhciBMaWJyYXJ5TWV0aG9kcyA9IFsnY2xlYXInLCAnZ2V0SXRlbScsICdpdGVyYXRlJywgJ2tleScsICdrZXlzJywgJ2xlbmd0aCcsICdyZW1vdmVJdGVtJywgJ3NldEl0ZW0nXS5jb25jYXQoT3B0aW9uYWxEcml2ZXJNZXRob2RzKTtcblxudmFyIERlZmF1bHRDb25maWcgPSB7XG4gICAgZGVzY3JpcHRpb246ICcnLFxuICAgIGRyaXZlcjogRGVmYXVsdERyaXZlck9yZGVyLnNsaWNlKCksXG4gICAgbmFtZTogJ2xvY2FsZm9yYWdlJyxcbiAgICAvLyBEZWZhdWx0IERCIHNpemUgaXMgX0pVU1QgVU5ERVJfIDVNQiwgYXMgaXQncyB0aGUgaGlnaGVzdCBzaXplXG4gICAgLy8gd2UgY2FuIHVzZSB3aXRob3V0IGEgcHJvbXB0LlxuICAgIHNpemU6IDQ5ODA3MzYsXG4gICAgc3RvcmVOYW1lOiAna2V5dmFsdWVwYWlycycsXG4gICAgdmVyc2lvbjogMS4wXG59O1xuXG5mdW5jdGlvbiBjYWxsV2hlblJlYWR5KGxvY2FsRm9yYWdlSW5zdGFuY2UsIGxpYnJhcnlNZXRob2QpIHtcbiAgICBsb2NhbEZvcmFnZUluc3RhbmNlW2xpYnJhcnlNZXRob2RdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX2FyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIHJldHVybiBsb2NhbEZvcmFnZUluc3RhbmNlLnJlYWR5KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxGb3JhZ2VJbnN0YW5jZVtsaWJyYXJ5TWV0aG9kXS5hcHBseShsb2NhbEZvcmFnZUluc3RhbmNlLCBfYXJncyk7XG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbmZ1bmN0aW9uIGV4dGVuZCgpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYXJnID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICAgIGlmIChhcmcpIHtcbiAgICAgICAgICAgIGZvciAodmFyIF9rZXkgaW4gYXJnKSB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5oYXNPd25Qcm9wZXJ0eShfa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShhcmdbX2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNbMF1bX2tleV0gPSBhcmdbX2tleV0uc2xpY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50c1swXVtfa2V5XSA9IGFyZ1tfa2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhcmd1bWVudHNbMF07XG59XG5cbnZhciBMb2NhbEZvcmFnZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBMb2NhbEZvcmFnZShvcHRpb25zKSB7XG4gICAgICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBMb2NhbEZvcmFnZSk7XG5cbiAgICAgICAgZm9yICh2YXIgZHJpdmVyVHlwZUtleSBpbiBEZWZhdWx0RHJpdmVycykge1xuICAgICAgICAgICAgaWYgKERlZmF1bHREcml2ZXJzLmhhc093blByb3BlcnR5KGRyaXZlclR5cGVLZXkpKSB7XG4gICAgICAgICAgICAgICAgdmFyIGRyaXZlciA9IERlZmF1bHREcml2ZXJzW2RyaXZlclR5cGVLZXldO1xuICAgICAgICAgICAgICAgIHZhciBkcml2ZXJOYW1lID0gZHJpdmVyLl9kcml2ZXI7XG4gICAgICAgICAgICAgICAgdGhpc1tkcml2ZXJUeXBlS2V5XSA9IGRyaXZlck5hbWU7XG5cbiAgICAgICAgICAgICAgICBpZiAoIURlZmluZWREcml2ZXJzW2RyaXZlck5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gd2FpdCBmb3IgdGhlIHByb21pc2UsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBkZWZhdWx0IGRyaXZlcnMgY2FuIGJlIGRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gaW4gYSBibG9ja2luZyBtYW5uZXJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmVEcml2ZXIoZHJpdmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kZWZhdWx0Q29uZmlnID0gZXh0ZW5kKHt9LCBEZWZhdWx0Q29uZmlnKTtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gZXh0ZW5kKHt9LCB0aGlzLl9kZWZhdWx0Q29uZmlnLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5fZHJpdmVyU2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5faW5pdERyaXZlciA9IG51bGw7XG4gICAgICAgIHRoaXMuX3JlYWR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2RiSW5mbyA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5fd3JhcExpYnJhcnlNZXRob2RzV2l0aFJlYWR5KCk7XG4gICAgICAgIHRoaXMuc2V0RHJpdmVyKHRoaXMuX2NvbmZpZy5kcml2ZXIpW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKCkge30pO1xuICAgIH1cblxuICAgIC8vIFNldCBhbnkgY29uZmlnIHZhbHVlcyBmb3IgbG9jYWxGb3JhZ2U7IGNhbiBiZSBjYWxsZWQgYW55dGltZSBiZWZvcmVcbiAgICAvLyB0aGUgZmlyc3QgQVBJIGNhbGwgKGUuZy4gYGdldEl0ZW1gLCBgc2V0SXRlbWApLlxuICAgIC8vIFdlIGxvb3AgdGhyb3VnaCBvcHRpb25zIHNvIHdlIGRvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBjb25maWdcbiAgICAvLyB2YWx1ZXMuXG5cblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5jb25maWcgPSBmdW5jdGlvbiBjb25maWcob3B0aW9ucykge1xuICAgICAgICAvLyBJZiB0aGUgb3B0aW9ucyBhcmd1bWVudCBpcyBhbiBvYmplY3QsIHdlIHVzZSBpdCB0byBzZXQgdmFsdWVzLlxuICAgICAgICAvLyBPdGhlcndpc2UsIHdlIHJldHVybiBlaXRoZXIgYSBzcGVjaWZpZWQgY29uZmlnIHZhbHVlIG9yIGFsbFxuICAgICAgICAvLyBjb25maWcgdmFsdWVzLlxuICAgICAgICBpZiAoKHR5cGVvZiBvcHRpb25zID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvcHRpb25zKSkgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBJZiBsb2NhbGZvcmFnZSBpcyByZWFkeSBhbmQgZnVsbHkgaW5pdGlhbGl6ZWQsIHdlIGNhbid0IHNldFxuICAgICAgICAgICAgLy8gYW55IG5ldyBjb25maWd1cmF0aW9uIHZhbHVlcy4gSW5zdGVhZCwgd2UgcmV0dXJuIGFuIGVycm9yLlxuICAgICAgICAgICAgaWYgKHRoaXMuX3JlYWR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihcIkNhbid0IGNhbGwgY29uZmlnKCkgYWZ0ZXIgbG9jYWxmb3JhZ2UgXCIgKyAnaGFzIGJlZW4gdXNlZC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSBpbiBvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPT09ICdzdG9yZU5hbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbaV0gPSBvcHRpb25zW2ldLnJlcGxhY2UoL1xcVy9nLCAnXycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChpID09PSAndmVyc2lvbicgJiYgdHlwZW9mIG9wdGlvbnNbaV0gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoJ0RhdGFiYXNlIHZlcnNpb24gbXVzdCBiZSBhIG51bWJlci4nKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLl9jb25maWdbaV0gPSBvcHRpb25zW2ldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZnRlciBhbGwgY29uZmlnIG9wdGlvbnMgYXJlIHNldCBhbmRcbiAgICAgICAgICAgIC8vIHRoZSBkcml2ZXIgb3B0aW9uIGlzIHVzZWQsIHRyeSBzZXR0aW5nIGl0XG4gICAgICAgICAgICBpZiAoJ2RyaXZlcicgaW4gb3B0aW9ucyAmJiBvcHRpb25zLmRyaXZlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNldERyaXZlcih0aGlzLl9jb25maWcuZHJpdmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnW29wdGlvbnNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVc2VkIHRvIGRlZmluZSBhIGN1c3RvbSBkcml2ZXIsIHNoYXJlZCBhY3Jvc3MgYWxsIGluc3RhbmNlcyBvZlxuICAgIC8vIGxvY2FsRm9yYWdlLlxuXG5cbiAgICBMb2NhbEZvcmFnZS5wcm90b3R5cGUuZGVmaW5lRHJpdmVyID0gZnVuY3Rpb24gZGVmaW5lRHJpdmVyKGRyaXZlck9iamVjdCwgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSQxKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdmFyIGRyaXZlck5hbWUgPSBkcml2ZXJPYmplY3QuX2RyaXZlcjtcbiAgICAgICAgICAgICAgICB2YXIgY29tcGxpYW5jZUVycm9yID0gbmV3IEVycm9yKCdDdXN0b20gZHJpdmVyIG5vdCBjb21wbGlhbnQ7IHNlZSAnICsgJ2h0dHBzOi8vbW96aWxsYS5naXRodWIuaW8vbG9jYWxGb3JhZ2UvI2RlZmluZWRyaXZlcicpO1xuXG4gICAgICAgICAgICAgICAgLy8gQSBkcml2ZXIgbmFtZSBzaG91bGQgYmUgZGVmaW5lZCBhbmQgbm90IG92ZXJsYXAgd2l0aCB0aGVcbiAgICAgICAgICAgICAgICAvLyBsaWJyYXJ5LWRlZmluZWQsIGRlZmF1bHQgZHJpdmVycy5cbiAgICAgICAgICAgICAgICBpZiAoIWRyaXZlck9iamVjdC5fZHJpdmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChjb21wbGlhbmNlRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGRyaXZlck1ldGhvZHMgPSBMaWJyYXJ5TWV0aG9kcy5jb25jYXQoJ19pbml0U3RvcmFnZScpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBkcml2ZXJNZXRob2RzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkcml2ZXJNZXRob2ROYW1lID0gZHJpdmVyTWV0aG9kc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBwcm9wZXJ0eSBpcyB0aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgc2hvdWxkIGJlIGEgbWV0aG9kIGV2ZW4gd2hlbiBvcHRpb25hbFxuICAgICAgICAgICAgICAgICAgICB2YXIgaXNSZXF1aXJlZCA9ICFpbmNsdWRlcyhPcHRpb25hbERyaXZlck1ldGhvZHMsIGRyaXZlck1ldGhvZE5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGlzUmVxdWlyZWQgfHwgZHJpdmVyT2JqZWN0W2RyaXZlck1ldGhvZE5hbWVdKSAmJiB0eXBlb2YgZHJpdmVyT2JqZWN0W2RyaXZlck1ldGhvZE5hbWVdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoY29tcGxpYW5jZUVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBjb25maWd1cmVNaXNzaW5nTWV0aG9kcyA9IGZ1bmN0aW9uIGNvbmZpZ3VyZU1pc3NpbmdNZXRob2RzKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWV0aG9kTm90SW1wbGVtZW50ZWRGYWN0b3J5ID0gZnVuY3Rpb24gbWV0aG9kTm90SW1wbGVtZW50ZWRGYWN0b3J5KG1ldGhvZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gbmV3IEVycm9yKCdNZXRob2QgJyArIG1ldGhvZE5hbWUgKyAnIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGUgY3VycmVudCBkcml2ZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UkMS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFjayhwcm9taXNlLCBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfbGVuID0gT3B0aW9uYWxEcml2ZXJNZXRob2RzLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9uYWxEcml2ZXJNZXRob2QgPSBPcHRpb25hbERyaXZlck1ldGhvZHNbX2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkcml2ZXJPYmplY3Rbb3B0aW9uYWxEcml2ZXJNZXRob2RdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyT2JqZWN0W29wdGlvbmFsRHJpdmVyTWV0aG9kXSA9IG1ldGhvZE5vdEltcGxlbWVudGVkRmFjdG9yeShvcHRpb25hbERyaXZlck1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgY29uZmlndXJlTWlzc2luZ01ldGhvZHMoKTtcblxuICAgICAgICAgICAgICAgIHZhciBzZXREcml2ZXJTdXBwb3J0ID0gZnVuY3Rpb24gc2V0RHJpdmVyU3VwcG9ydChzdXBwb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChEZWZpbmVkRHJpdmVyc1tkcml2ZXJOYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKCdSZWRlZmluaW5nIExvY2FsRm9yYWdlIGRyaXZlcjogJyArIGRyaXZlck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIERlZmluZWREcml2ZXJzW2RyaXZlck5hbWVdID0gZHJpdmVyT2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICBEcml2ZXJTdXBwb3J0W2RyaXZlck5hbWVdID0gc3VwcG9ydDtcbiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIGEgdGhlbiwgc28gdGhhdCB3ZSBjYW4gZGVmaW5lXG4gICAgICAgICAgICAgICAgICAgIC8vIGRyaXZlcnMgdGhhdCBoYXZlIHNpbXBsZSBfc3VwcG9ydCBtZXRob2RzXG4gICAgICAgICAgICAgICAgICAgIC8vIGluIGEgYmxvY2tpbmcgbWFubmVyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKCdfc3VwcG9ydCcgaW4gZHJpdmVyT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkcml2ZXJPYmplY3QuX3N1cHBvcnQgJiYgdHlwZW9mIGRyaXZlck9iamVjdC5fc3VwcG9ydCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyT2JqZWN0Ll9zdXBwb3J0KCkudGhlbihzZXREcml2ZXJTdXBwb3J0LCByZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RHJpdmVyU3VwcG9ydCghIWRyaXZlck9iamVjdC5fc3VwcG9ydCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXREcml2ZXJTdXBwb3J0KHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4ZWN1dGVUd29DYWxsYmFja3MocHJvbWlzZSwgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgTG9jYWxGb3JhZ2UucHJvdG90eXBlLmRyaXZlciA9IGZ1bmN0aW9uIGRyaXZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RyaXZlciB8fCBudWxsO1xuICAgIH07XG5cbiAgICBMb2NhbEZvcmFnZS5wcm90b3R5cGUuZ2V0RHJpdmVyID0gZnVuY3Rpb24gZ2V0RHJpdmVyKGRyaXZlck5hbWUsIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBnZXREcml2ZXJQcm9taXNlID0gRGVmaW5lZERyaXZlcnNbZHJpdmVyTmFtZV0gPyBQcm9taXNlJDEucmVzb2x2ZShEZWZpbmVkRHJpdmVyc1tkcml2ZXJOYW1lXSkgOiBQcm9taXNlJDEucmVqZWN0KG5ldyBFcnJvcignRHJpdmVyIG5vdCBmb3VuZC4nKSk7XG5cbiAgICAgICAgZXhlY3V0ZVR3b0NhbGxiYWNrcyhnZXREcml2ZXJQcm9taXNlLCBjYWxsYmFjaywgZXJyb3JDYWxsYmFjayk7XG4gICAgICAgIHJldHVybiBnZXREcml2ZXJQcm9taXNlO1xuICAgIH07XG5cbiAgICBMb2NhbEZvcmFnZS5wcm90b3R5cGUuZ2V0U2VyaWFsaXplciA9IGZ1bmN0aW9uIGdldFNlcmlhbGl6ZXIoY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNlcmlhbGl6ZXJQcm9taXNlID0gUHJvbWlzZSQxLnJlc29sdmUobG9jYWxmb3JhZ2VTZXJpYWxpemVyKTtcbiAgICAgICAgZXhlY3V0ZVR3b0NhbGxiYWNrcyhzZXJpYWxpemVyUHJvbWlzZSwgY2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gc2VyaWFsaXplclByb21pc2U7XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5yZWFkeSA9IGZ1bmN0aW9uIHJlYWR5KGNhbGxiYWNrKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgICB2YXIgcHJvbWlzZSA9IHNlbGYuX2RyaXZlclNldC50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChzZWxmLl9yZWFkeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gc2VsZi5faW5pdERyaXZlcigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZHk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4ZWN1dGVUd29DYWxsYmFja3MocHJvbWlzZSwgY2FsbGJhY2ssIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5zZXREcml2ZXIgPSBmdW5jdGlvbiBzZXREcml2ZXIoZHJpdmVycywgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgIGlmICghaXNBcnJheShkcml2ZXJzKSkge1xuICAgICAgICAgICAgZHJpdmVycyA9IFtkcml2ZXJzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdXBwb3J0ZWREcml2ZXJzID0gdGhpcy5fZ2V0U3VwcG9ydGVkRHJpdmVycyhkcml2ZXJzKTtcblxuICAgICAgICBmdW5jdGlvbiBzZXREcml2ZXJUb0NvbmZpZygpIHtcbiAgICAgICAgICAgIHNlbGYuX2NvbmZpZy5kcml2ZXIgPSBzZWxmLmRyaXZlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gZXh0ZW5kU2VsZldpdGhEcml2ZXIoZHJpdmVyKSB7XG4gICAgICAgICAgICBzZWxmLl9leHRlbmQoZHJpdmVyKTtcbiAgICAgICAgICAgIHNldERyaXZlclRvQ29uZmlnKCk7XG5cbiAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gc2VsZi5faW5pdFN0b3JhZ2Uoc2VsZi5fY29uZmlnKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkeTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGluaXREcml2ZXIoc3VwcG9ydGVkRHJpdmVycykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudERyaXZlckluZGV4ID0gMDtcblxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGRyaXZlclByb21pc2VMb29wKCkge1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudERyaXZlckluZGV4IDwgc3VwcG9ydGVkRHJpdmVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkcml2ZXJOYW1lID0gc3VwcG9ydGVkRHJpdmVyc1tjdXJyZW50RHJpdmVySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERyaXZlckluZGV4Kys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiSW5mbyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkeSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldERyaXZlcihkcml2ZXJOYW1lKS50aGVuKGV4dGVuZFNlbGZXaXRoRHJpdmVyKVtcImNhdGNoXCJdKGRyaXZlclByb21pc2VMb29wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNldERyaXZlclRvQ29uZmlnKCk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignTm8gYXZhaWxhYmxlIHN0b3JhZ2UgbWV0aG9kIGZvdW5kLicpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9kcml2ZXJTZXQgPSBQcm9taXNlJDEucmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RyaXZlclNldDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZHJpdmVyUHJvbWlzZUxvb3AoKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBhIGRyaXZlciBpbml0aWFsaXphdGlvbiBpbiBwcm9ncmVzc1xuICAgICAgICAvLyBzbyB3YWl0IGZvciBpdCB0byBmaW5pc2ggaW4gb3JkZXIgdG8gYXZvaWQgYSBwb3NzaWJsZVxuICAgICAgICAvLyByYWNlIGNvbmRpdGlvbiB0byBzZXQgX2RiSW5mb1xuICAgICAgICB2YXIgb2xkRHJpdmVyU2V0RG9uZSA9IHRoaXMuX2RyaXZlclNldCAhPT0gbnVsbCA/IHRoaXMuX2RyaXZlclNldFtcImNhdGNoXCJdKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlJDEucmVzb2x2ZSgpO1xuICAgICAgICB9KSA6IFByb21pc2UkMS5yZXNvbHZlKCk7XG5cbiAgICAgICAgdGhpcy5fZHJpdmVyU2V0ID0gb2xkRHJpdmVyU2V0RG9uZS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBkcml2ZXJOYW1lID0gc3VwcG9ydGVkRHJpdmVyc1swXTtcbiAgICAgICAgICAgIHNlbGYuX2RiSW5mbyA9IG51bGw7XG4gICAgICAgICAgICBzZWxmLl9yZWFkeSA9IG51bGw7XG5cbiAgICAgICAgICAgIHJldHVybiBzZWxmLmdldERyaXZlcihkcml2ZXJOYW1lKS50aGVuKGZ1bmN0aW9uIChkcml2ZXIpIHtcbiAgICAgICAgICAgICAgICBzZWxmLl9kcml2ZXIgPSBkcml2ZXIuX2RyaXZlcjtcbiAgICAgICAgICAgICAgICBzZXREcml2ZXJUb0NvbmZpZygpO1xuICAgICAgICAgICAgICAgIHNlbGYuX3dyYXBMaWJyYXJ5TWV0aG9kc1dpdGhSZWFkeSgpO1xuICAgICAgICAgICAgICAgIHNlbGYuX2luaXREcml2ZXIgPSBpbml0RHJpdmVyKHN1cHBvcnRlZERyaXZlcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pW1wiY2F0Y2hcIl0oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgc2V0RHJpdmVyVG9Db25maWcoKTtcbiAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignTm8gYXZhaWxhYmxlIHN0b3JhZ2UgbWV0aG9kIGZvdW5kLicpO1xuICAgICAgICAgICAgc2VsZi5fZHJpdmVyU2V0ID0gUHJvbWlzZSQxLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5fZHJpdmVyU2V0O1xuICAgICAgICB9KTtcblxuICAgICAgICBleGVjdXRlVHdvQ2FsbGJhY2tzKHRoaXMuX2RyaXZlclNldCwgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xuICAgICAgICByZXR1cm4gdGhpcy5fZHJpdmVyU2V0O1xuICAgIH07XG5cbiAgICBMb2NhbEZvcmFnZS5wcm90b3R5cGUuc3VwcG9ydHMgPSBmdW5jdGlvbiBzdXBwb3J0cyhkcml2ZXJOYW1lKSB7XG4gICAgICAgIHJldHVybiAhIURyaXZlclN1cHBvcnRbZHJpdmVyTmFtZV07XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5fZXh0ZW5kID0gZnVuY3Rpb24gX2V4dGVuZChsaWJyYXJ5TWV0aG9kc0FuZFByb3BlcnRpZXMpIHtcbiAgICAgICAgZXh0ZW5kKHRoaXMsIGxpYnJhcnlNZXRob2RzQW5kUHJvcGVydGllcyk7XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5fZ2V0U3VwcG9ydGVkRHJpdmVycyA9IGZ1bmN0aW9uIF9nZXRTdXBwb3J0ZWREcml2ZXJzKGRyaXZlcnMpIHtcbiAgICAgICAgdmFyIHN1cHBvcnRlZERyaXZlcnMgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGRyaXZlcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBkcml2ZXJOYW1lID0gZHJpdmVyc1tpXTtcbiAgICAgICAgICAgIGlmICh0aGlzLnN1cHBvcnRzKGRyaXZlck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgc3VwcG9ydGVkRHJpdmVycy5wdXNoKGRyaXZlck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBwb3J0ZWREcml2ZXJzO1xuICAgIH07XG5cbiAgICBMb2NhbEZvcmFnZS5wcm90b3R5cGUuX3dyYXBMaWJyYXJ5TWV0aG9kc1dpdGhSZWFkeSA9IGZ1bmN0aW9uIF93cmFwTGlicmFyeU1ldGhvZHNXaXRoUmVhZHkoKSB7XG4gICAgICAgIC8vIEFkZCBhIHN0dWIgZm9yIGVhY2ggZHJpdmVyIEFQSSBtZXRob2QgdGhhdCBkZWxheXMgdGhlIGNhbGwgdG8gdGhlXG4gICAgICAgIC8vIGNvcnJlc3BvbmRpbmcgZHJpdmVyIG1ldGhvZCB1bnRpbCBsb2NhbEZvcmFnZSBpcyByZWFkeS4gVGhlc2Ugc3R1YnNcbiAgICAgICAgLy8gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZHJpdmVyIG1ldGhvZHMgYXMgc29vbiBhcyB0aGUgZHJpdmVyIGlzXG4gICAgICAgIC8vIGxvYWRlZCwgc28gdGhlcmUgaXMgbm8gcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gTGlicmFyeU1ldGhvZHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGNhbGxXaGVuUmVhZHkodGhpcywgTGlicmFyeU1ldGhvZHNbaV0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIExvY2FsRm9yYWdlLnByb3RvdHlwZS5jcmVhdGVJbnN0YW5jZSA9IGZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2NhbEZvcmFnZShvcHRpb25zKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIExvY2FsRm9yYWdlO1xufSgpO1xuXG4vLyBUaGUgYWN0dWFsIGxvY2FsRm9yYWdlIG9iamVjdCB0aGF0IHdlIGV4cG9zZSBhcyBhIG1vZHVsZSBvciB2aWEgYVxuLy8gZ2xvYmFsLiBJdCdzIGV4dGVuZGVkIGJ5IHB1bGxpbmcgaW4gb25lIG9mIG91ciBvdGhlciBsaWJyYXJpZXMuXG5cblxudmFyIGxvY2FsZm9yYWdlX2pzID0gbmV3IExvY2FsRm9yYWdlKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gbG9jYWxmb3JhZ2VfanM7XG5cbn0se1wiM1wiOjN9XX0se30sWzRdKSg0KVxufSk7XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG5pbXBvcnQgeyBFdmVudCwgRXZlbnRQcm9jZXNzb3IsIEh1YiwgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCwgbG9nZ2VyLCBub3JtYWxpemUsIHV1aWQ0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgbG9jYWxGb3JhZ2UgZnJvbSAnbG9jYWxmb3JhZ2UnO1xuXG50eXBlIExvY2FsRm9yYWdlID0ge1xuICBzZXRJdGVtPFQ+KGtleTogc3RyaW5nLCB2YWx1ZTogVCwgY2FsbGJhY2s/OiAoZXJyOiBhbnksIHZhbHVlOiBUKSA9PiB2b2lkKTogUHJvbWlzZTxUPjtcbiAgaXRlcmF0ZTxULCBVPihcbiAgICBpdGVyYXRlZTogKHZhbHVlOiBULCBrZXk6IHN0cmluZywgaXRlcmF0aW9uTnVtYmVyOiBudW1iZXIpID0+IFUsXG4gICAgY2FsbGJhY2s/OiAoZXJyOiBhbnksIHJlc3VsdDogVSkgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxVPjtcbiAgcmVtb3ZlSXRlbShrZXk6IHN0cmluZywgY2FsbGJhY2s/OiAoZXJyOiBhbnkpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+O1xufTtcblxuLyoqXG4gKiBjYWNoZSBvZmZsaW5lIGVycm9ycyBhbmQgc2VuZCB3aGVuIGNvbm5lY3RlZFxuICovXG5leHBvcnQgY2xhc3MgT2ZmbGluZSBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnT2ZmbGluZSc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gT2ZmbGluZS5pZDtcblxuICAvKipcbiAgICogdGhlIGdsb2JhbCBpbnN0YW5jZVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIGdsb2JhbDogYW55O1xuXG4gIC8qKlxuICAgKiB0aGUgY3VycmVudCBodWIgaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBodWI/OiBIdWI7XG5cbiAgLyoqXG4gICAqIG1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyB0byBzdG9yZSB3aGlsZSBvZmZsaW5lXG4gICAqL1xuICBwdWJsaWMgbWF4U3RvcmVkRXZlbnRzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGV2ZW50IGNhY2hlXG4gICAqL1xuICBwdWJsaWMgb2ZmbGluZUV2ZW50U3RvcmU6IExvY2FsRm9yYWdlO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgbWF4U3RvcmVkRXZlbnRzPzogbnVtYmVyIH0gPSB7fSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgdGhpcy5nbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8YW55PigpO1xuICAgIHRoaXMubWF4U3RvcmVkRXZlbnRzID0gb3B0aW9ucy5tYXhTdG9yZWRFdmVudHMgfHwgMzA7IC8vIHNldCBhIHJlYXNvbmFibGUgZGVmYXVsdFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICB0aGlzLm9mZmxpbmVFdmVudFN0b3JlID0gbG9jYWxGb3JhZ2UuY3JlYXRlSW5zdGFuY2Uoe1xuICAgICAgbmFtZTogJ3NlbnRyeS9vZmZsaW5lRXZlbnRTdG9yZScsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3I6IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIHRoaXMuaHViID0gZ2V0Q3VycmVudEh1YigpO1xuXG4gICAgaWYgKCdhZGRFdmVudExpc3RlbmVyJyBpbiB0aGlzLmdsb2JhbCkge1xuICAgICAgdGhpcy5nbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgKCkgPT4ge1xuICAgICAgICB2b2lkIHRoaXMuX3NlbmRFdmVudHMoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ2NvdWxkIG5vdCBzZW5kIGNhY2hlZCBldmVudHMnKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBpZiAodGhpcy5odWIgJiYgdGhpcy5odWIuZ2V0SW50ZWdyYXRpb24oT2ZmbGluZSkpIHtcbiAgICAgICAgLy8gY2FjaGUgaWYgd2UgYXJlIHBvc2l0aXZlbHkgb2ZmbGluZVxuICAgICAgICBpZiAoJ25hdmlnYXRvcicgaW4gdGhpcy5nbG9iYWwgJiYgJ29uTGluZScgaW4gdGhpcy5nbG9iYWwubmF2aWdhdG9yICYmICF0aGlzLmdsb2JhbC5uYXZpZ2F0b3Iub25MaW5lKSB7XG4gICAgICAgICAgdm9pZCB0aGlzLl9jYWNoZUV2ZW50KGV2ZW50KVxuICAgICAgICAgICAgLnRoZW4oKF9ldmVudDogRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHRoaXMuX2VuZm9yY2VNYXhFdmVudHMoKSlcbiAgICAgICAgICAgIC5jYXRjaCgoX2Vycm9yKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdjb3VsZCBub3QgY2FjaGUgZXZlbnQgd2hpbGUgb2ZmbGluZScpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyByZXR1cm4gbnVsbCBvbiBzdWNjZXNzIG9yIGZhaWx1cmUsIGJlY2F1c2UgYmVpbmcgb2ZmbGluZSB3aWxsIHN0aWxsIHJlc3VsdCBpbiBhbiBlcnJvclxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9KTtcblxuICAgIC8vIGlmIG9ubGluZSBub3csIHNlbmQgYW55IGV2ZW50cyBzdG9yZWQgaW4gYSBwcmV2aW91cyBvZmZsaW5lIHNlc3Npb25cbiAgICBpZiAoJ25hdmlnYXRvcicgaW4gdGhpcy5nbG9iYWwgJiYgJ29uTGluZScgaW4gdGhpcy5nbG9iYWwubmF2aWdhdG9yICYmIHRoaXMuZ2xvYmFsLm5hdmlnYXRvci5vbkxpbmUpIHtcbiAgICAgIHZvaWQgdGhpcy5fc2VuZEV2ZW50cygpLmNhdGNoKCgpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ2NvdWxkIG5vdCBzZW5kIGNhY2hlZCBldmVudHMnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjYWNoZSBhbiBldmVudCB0byBzZW5kIGxhdGVyXG4gICAqIEBwYXJhbSBldmVudCBhbiBldmVudFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfY2FjaGVFdmVudChldmVudDogRXZlbnQpOiBQcm9taXNlPEV2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMub2ZmbGluZUV2ZW50U3RvcmUuc2V0SXRlbTxFdmVudD4odXVpZDQoKSwgbm9ybWFsaXplKGV2ZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogcHVyZ2UgZXhjZXNzIGV2ZW50cyBpZiBuZWNlc3NhcnlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2VuZm9yY2VNYXhFdmVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZXZlbnRzOiBBcnJheTx7IGV2ZW50OiBFdmVudDsgY2FjaGVLZXk6IHN0cmluZyB9PiA9IFtdO1xuXG4gICAgcmV0dXJuIHRoaXMub2ZmbGluZUV2ZW50U3RvcmVcbiAgICAgIC5pdGVyYXRlPEV2ZW50LCB2b2lkPigoZXZlbnQ6IEV2ZW50LCBjYWNoZUtleTogc3RyaW5nLCBfaW5kZXg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgICAgICAvLyBhZ2dyZWdhdGUgZXZlbnRzXG4gICAgICAgIGV2ZW50cy5wdXNoKHsgY2FjaGVLZXksIGV2ZW50IH0pO1xuICAgICAgfSlcbiAgICAgIC50aGVuKFxuICAgICAgICAoKTogUHJvbWlzZTx2b2lkPiA9PlxuICAgICAgICAgIC8vIHRoaXMgcHJvbWlzZSByZXNvbHZlcyB3aGVuIHRoZSBpdGVyYXRpb24gaXMgZmluaXNoZWRcbiAgICAgICAgICB0aGlzLl9wdXJnZUV2ZW50cyhcbiAgICAgICAgICAgIC8vIHB1cmdlIGFsbCBldmVudHMgcGFzdCBtYXhTdG9yZWRFdmVudHMgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyXG4gICAgICAgICAgICBldmVudHNcbiAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IChiLmV2ZW50LnRpbWVzdGFtcCB8fCAwKSAtIChhLmV2ZW50LnRpbWVzdGFtcCB8fCAwKSlcbiAgICAgICAgICAgICAgLnNsaWNlKHRoaXMubWF4U3RvcmVkRXZlbnRzIDwgZXZlbnRzLmxlbmd0aCA/IHRoaXMubWF4U3RvcmVkRXZlbnRzIDogZXZlbnRzLmxlbmd0aClcbiAgICAgICAgICAgICAgLm1hcChldmVudCA9PiBldmVudC5jYWNoZUtleSksXG4gICAgICAgICAgKSxcbiAgICAgIClcbiAgICAgIC5jYXRjaCgoX2Vycm9yKTogdm9pZCA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdjb3VsZCBub3QgZW5mb3JjZSBtYXggZXZlbnRzJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwdXJnZSBldmVudCBmcm9tIGNhY2hlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIF9wdXJnZUV2ZW50KGNhY2hlS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5vZmZsaW5lRXZlbnRTdG9yZS5yZW1vdmVJdGVtKGNhY2hlS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBwdXJnZSBldmVudHMgZnJvbSBjYWNoZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcHVyZ2VFdmVudHMoY2FjaGVLZXlzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIHRyYWlsIHdpdGggLnRoZW4gdG8gZW5zdXJlIHRoZSByZXR1cm4gdHlwZSBhcyB2b2lkIGFuZCBub3Qgdm9pZHx2b2lkW11cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoY2FjaGVLZXlzLm1hcChjYWNoZUtleSA9PiB0aGlzLl9wdXJnZUV2ZW50KGNhY2hlS2V5KSkpLnRoZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzZW5kIGFsbCBldmVudHNcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3NlbmRFdmVudHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMub2ZmbGluZUV2ZW50U3RvcmUuaXRlcmF0ZTxFdmVudCwgdm9pZD4oKGV2ZW50OiBFdmVudCwgY2FjaGVLZXk6IHN0cmluZywgX2luZGV4OiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLmh1Yikge1xuICAgICAgICB0aGlzLmh1Yi5jYXB0dXJlRXZlbnQoZXZlbnQpO1xuXG4gICAgICAgIHZvaWQgdGhpcy5fcHVyZ2VFdmVudChjYWNoZUtleSkuY2F0Y2goKF9lcnJvcik6IHZvaWQgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdjb3VsZCBub3QgcHVyZ2UgZXZlbnQgZnJvbSBjYWNoZScpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdubyBodWIgZm91bmQgLSBjb3VsZCBub3Qgc2VuZCBjYWNoZWQgZXZlbnQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBIdWIsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIHN1cHBvcnRzUmVwb3J0aW5nT2JzZXJ2ZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgUmVwb3J0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICB0eXBlOiBSZXBvcnRUeXBlcztcbiAgdXJsOiBzdHJpbmc7XG4gIGJvZHk/OiBSZXBvcnRCb2R5O1xufVxuXG4vKiogSlNEb2MgKi9cbmNvbnN0IGVudW0gUmVwb3J0VHlwZXMge1xuICAvKiogSlNEb2MgKi9cbiAgQ3Jhc2ggPSAnY3Jhc2gnLFxuICAvKiogSlNEb2MgKi9cbiAgRGVwcmVjYXRpb24gPSAnZGVwcmVjYXRpb24nLFxuICAvKiogSlNEb2MgKi9cbiAgSW50ZXJ2ZW50aW9uID0gJ2ludGVydmVudGlvbicsXG59XG5cbi8qKiBKU0RvYyAqL1xudHlwZSBSZXBvcnRCb2R5ID0gQ3Jhc2hSZXBvcnRCb2R5IHwgRGVwcmVjYXRpb25SZXBvcnRCb2R5IHwgSW50ZXJ2ZW50aW9uUmVwb3J0Qm9keTtcblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgQ3Jhc2hSZXBvcnRCb2R5IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBjcmFzaElkOiBzdHJpbmc7XG4gIHJlYXNvbj86IHN0cmluZztcbn1cblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgRGVwcmVjYXRpb25SZXBvcnRCb2R5IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBpZDogc3RyaW5nO1xuICBhbnRpY2lwYXRlZFJlbW92YWw/OiBEYXRlO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIHNvdXJjZUZpbGU/OiBzdHJpbmc7XG4gIGxpbmVOdW1iZXI/OiBudW1iZXI7XG4gIGNvbHVtbk51bWJlcj86IG51bWJlcjtcbn1cblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgSW50ZXJ2ZW50aW9uUmVwb3J0Qm9keSB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbiAgaWQ6IHN0cmluZztcbiAgbWVzc2FnZTogc3RyaW5nO1xuICBzb3VyY2VGaWxlPzogc3RyaW5nO1xuICBsaW5lTnVtYmVyPzogbnVtYmVyO1xuICBjb2x1bW5OdW1iZXI/OiBudW1iZXI7XG59XG5cbi8qKiBSZXBvcnRpbmcgQVBJIGludGVncmF0aW9uIC0gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3JlcG9ydGluZy8gKi9cbmV4cG9ydCBjbGFzcyBSZXBvcnRpbmdPYnNlcnZlciBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnUmVwb3J0aW5nT2JzZXJ2ZXInO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyA9IFJlcG9ydGluZ09ic2VydmVyLmlkO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGN1cnJlbnQgaHViLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q3VycmVudEh1Yj86ICgpID0+IEh1YjtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiB7XG4gICAgICB0eXBlcz86IFJlcG9ydFR5cGVzW107XG4gICAgfSA9IHtcbiAgICAgIHR5cGVzOiBbUmVwb3J0VHlwZXMuQ3Jhc2gsIFJlcG9ydFR5cGVzLkRlcHJlY2F0aW9uLCBSZXBvcnRUeXBlcy5JbnRlcnZlbnRpb25dLFxuICAgIH0sXG4gICkge31cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoXzogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgaWYgKCFzdXBwb3J0c1JlcG9ydGluZ09ic2VydmVyKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRDdXJyZW50SHViID0gZ2V0Q3VycmVudEh1YjtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyAoZ2V0R2xvYmFsT2JqZWN0PGFueT4oKS5SZXBvcnRpbmdPYnNlcnZlcikodGhpcy5oYW5kbGVyLmJpbmQodGhpcyksIHtcbiAgICAgIGJ1ZmZlcmVkOiB0cnVlLFxuICAgICAgdHlwZXM6IHRoaXMuX29wdGlvbnMudHlwZXMsXG4gICAgfSk7XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgaGFuZGxlcihyZXBvcnRzOiBSZXBvcnRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGh1YiA9IHRoaXMuX2dldEN1cnJlbnRIdWIgJiYgdGhpcy5fZ2V0Q3VycmVudEh1YigpO1xuICAgIGlmICghaHViIHx8ICFodWIuZ2V0SW50ZWdyYXRpb24oUmVwb3J0aW5nT2JzZXJ2ZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgcmVwb3J0IG9mIHJlcG9ydHMpIHtcbiAgICAgIGh1Yi53aXRoU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICBzY29wZS5zZXRFeHRyYSgndXJsJywgcmVwb3J0LnVybCk7XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSBgUmVwb3J0aW5nT2JzZXJ2ZXIgWyR7cmVwb3J0LnR5cGV9XWA7XG4gICAgICAgIGxldCBkZXRhaWxzID0gJ05vIGRldGFpbHMgYXZhaWxhYmxlJztcblxuICAgICAgICBpZiAocmVwb3J0LmJvZHkpIHtcbiAgICAgICAgICAvLyBPYmplY3Qua2V5cyBkb2Vzbid0IHdvcmsgb24gUmVwb3J0Qm9keSwgYXMgYWxsIHByb3BlcnRpZXMgYXJlIGluaGVpcnRlZFxuICAgICAgICAgIGNvbnN0IHBsYWluQm9keToge1xuICAgICAgICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgICAgIH0gPSB7fTtcblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBndWFyZC1mb3ItaW5cbiAgICAgICAgICBmb3IgKGNvbnN0IHByb3AgaW4gcmVwb3J0LmJvZHkpIHtcbiAgICAgICAgICAgIHBsYWluQm9keVtwcm9wXSA9IHJlcG9ydC5ib2R5W3Byb3BdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHNjb3BlLnNldEV4dHJhKCdib2R5JywgcGxhaW5Cb2R5KTtcblxuICAgICAgICAgIGlmIChyZXBvcnQudHlwZSA9PT0gUmVwb3J0VHlwZXMuQ3Jhc2gpIHtcbiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSByZXBvcnQuYm9keSBhcyBDcmFzaFJlcG9ydEJvZHk7XG4gICAgICAgICAgICAvLyBBIGZhbmN5IHdheSB0byBjcmVhdGUgYSBtZXNzYWdlIG91dCBvZiBjcmFzaElkIE9SIHJlYXNvbiBPUiBib3RoIE9SIGZhbGxiYWNrXG4gICAgICAgICAgICBkZXRhaWxzID0gW2JvZHkuY3Jhc2hJZCB8fCAnJywgYm9keS5yZWFzb24gfHwgJyddLmpvaW4oJyAnKS50cmltKCkgfHwgZGV0YWlscztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlcG9ydC5ib2R5IGFzIERlcHJlY2F0aW9uUmVwb3J0Qm9keSB8IEludGVydmVudGlvblJlcG9ydEJvZHk7XG4gICAgICAgICAgICBkZXRhaWxzID0gYm9keS5tZXNzYWdlIHx8IGRldGFpbHM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaHViLmNhcHR1cmVNZXNzYWdlKGAke2xhYmVsfTogJHtkZXRhaWxzfWApO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCAiaW1wb3J0IHsgRXZlbnQsIEV2ZW50UHJvY2Vzc29yLCBIdWIsIEludGVncmF0aW9uLCBTdGFja0ZyYW1lLCBTdGFja3RyYWNlIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBiYXNlbmFtZSwgcmVsYXRpdmUgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxudHlwZSBTdGFja0ZyYW1lSXRlcmF0ZWUgPSAoZnJhbWU6IFN0YWNrRnJhbWUpID0+IFN0YWNrRnJhbWU7XG5cbi8qKiBSZXdyaXRlIGV2ZW50IGZyYW1lcyBwYXRocyAqL1xuZXhwb3J0IGNsYXNzIFJld3JpdGVGcmFtZXMgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ1Jld3JpdGVGcmFtZXMnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IFJld3JpdGVGcmFtZXMuaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb290Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcHJlZml4OiBzdHJpbmcgPSAnYXBwOi8vLyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogeyByb290Pzogc3RyaW5nOyBwcmVmaXg/OiBzdHJpbmc7IGl0ZXJhdGVlPzogU3RhY2tGcmFtZUl0ZXJhdGVlIH0gPSB7fSkge1xuICAgIGlmIChvcHRpb25zLnJvb3QpIHtcbiAgICAgIHRoaXMuX3Jvb3QgPSBvcHRpb25zLnJvb3Q7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnByZWZpeCkge1xuICAgICAgdGhpcy5fcHJlZml4ID0gb3B0aW9ucy5wcmVmaXg7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLml0ZXJhdGVlKSB7XG4gICAgICB0aGlzLl9pdGVyYXRlZSA9IG9wdGlvbnMuaXRlcmF0ZWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihldmVudCA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKFJld3JpdGVGcmFtZXMpO1xuICAgICAgaWYgKHNlbGYpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYucHJvY2VzcyhldmVudCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHByb2Nlc3Mob3JpZ2luYWxFdmVudDogRXZlbnQpOiBFdmVudCB7XG4gICAgbGV0IHByb2Nlc3NlZEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcblxuICAgIGlmIChvcmlnaW5hbEV2ZW50LmV4Y2VwdGlvbiAmJiBBcnJheS5pc0FycmF5KG9yaWdpbmFsRXZlbnQuZXhjZXB0aW9uLnZhbHVlcykpIHtcbiAgICAgIHByb2Nlc3NlZEV2ZW50ID0gdGhpcy5fcHJvY2Vzc0V4Y2VwdGlvbnNFdmVudChwcm9jZXNzZWRFdmVudCk7XG4gICAgfVxuXG4gICAgaWYgKG9yaWdpbmFsRXZlbnQuc3RhY2t0cmFjZSkge1xuICAgICAgcHJvY2Vzc2VkRXZlbnQgPSB0aGlzLl9wcm9jZXNzU3RhY2t0cmFjZUV2ZW50KHByb2Nlc3NlZEV2ZW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnQ7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2l0ZXJhdGVlOiBTdGFja0ZyYW1lSXRlcmF0ZWUgPSAoZnJhbWU6IFN0YWNrRnJhbWUpID0+IHtcbiAgICBpZiAoIWZyYW1lLmZpbGVuYW1lKSB7XG4gICAgICByZXR1cm4gZnJhbWU7XG4gICAgfVxuICAgIC8vIENoZWNrIGlmIHRoZSBmcmFtZSBmaWxlbmFtZSBiZWdpbnMgd2l0aCBgL2Agb3IgYSBXaW5kb3dzLXN0eWxlIHByZWZpeCBzdWNoIGFzIGBDOlxcYFxuICAgIGNvbnN0IGlzV2luZG93c0ZyYW1lID0gL15bQS1aXTpcXFxcLy50ZXN0KGZyYW1lLmZpbGVuYW1lKTtcbiAgICBjb25zdCBzdGFydHNXaXRoU2xhc2ggPSAvXlxcLy8udGVzdChmcmFtZS5maWxlbmFtZSk7XG4gICAgaWYgKGlzV2luZG93c0ZyYW1lIHx8IHN0YXJ0c1dpdGhTbGFzaCkge1xuICAgICAgY29uc3QgZmlsZW5hbWUgPSBpc1dpbmRvd3NGcmFtZVxuICAgICAgICA/IGZyYW1lLmZpbGVuYW1lXG4gICAgICAgICAgICAucmVwbGFjZSgvXltBLVpdOi8sICcnKSAvLyByZW1vdmUgV2luZG93cy1zdHlsZSBwcmVmaXhcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcL2csICcvJykgLy8gcmVwbGFjZSBhbGwgYFxcXFxgIGluc3RhbmNlcyB3aXRoIGAvYFxuICAgICAgICA6IGZyYW1lLmZpbGVuYW1lO1xuICAgICAgY29uc3QgYmFzZSA9IHRoaXMuX3Jvb3QgPyByZWxhdGl2ZSh0aGlzLl9yb290LCBmaWxlbmFtZSkgOiBiYXNlbmFtZShmaWxlbmFtZSk7XG4gICAgICBmcmFtZS5maWxlbmFtZSA9IGAke3RoaXMuX3ByZWZpeH0ke2Jhc2V9YDtcbiAgICB9XG4gICAgcmV0dXJuIGZyYW1lO1xuICB9O1xuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9wcm9jZXNzRXhjZXB0aW9uc0V2ZW50KGV2ZW50OiBFdmVudCk6IEV2ZW50IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICAgIC4uLmV2ZW50LmV4Y2VwdGlvbixcbiAgICAgICAgICAvLyBUaGUgY2hlY2sgZm9yIHRoaXMgaXMgcGVyZm9ybWVkIGluc2lkZSBgcHJvY2Vzc2AgY2FsbCBpdHNlbGYsIHNhZmUgdG8gc2tpcCBoZXJlXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgICB2YWx1ZXM6IGV2ZW50LmV4Y2VwdGlvbiEudmFsdWVzIS5tYXAodmFsdWUgPT4gKHtcbiAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgc3RhY2t0cmFjZTogdGhpcy5fcHJvY2Vzc1N0YWNrdHJhY2UodmFsdWUuc3RhY2t0cmFjZSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfcHJvY2Vzc1N0YWNrdHJhY2VFdmVudChldmVudDogRXZlbnQpOiBFdmVudCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBzdGFja3RyYWNlOiB0aGlzLl9wcm9jZXNzU3RhY2t0cmFjZShldmVudC5zdGFja3RyYWNlKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX3Byb2Nlc3NTdGFja3RyYWNlKHN0YWNrdHJhY2U/OiBTdGFja3RyYWNlKTogU3RhY2t0cmFjZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YWNrdHJhY2UsXG4gICAgICBmcmFtZXM6IHN0YWNrdHJhY2UgJiYgc3RhY2t0cmFjZS5mcmFtZXMgJiYgc3RhY2t0cmFjZS5mcmFtZXMubWFwKGYgPT4gdGhpcy5faXRlcmF0ZWUoZikpLFxuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgRXZlbnRQcm9jZXNzb3IsIEh1YiwgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuLyoqIFRoaXMgZnVuY3Rpb24gYWRkcyBkdXJhdGlvbiBzaW5jZSBTZW50cnkgd2FzIGluaXRpYWxpemVkIHRpbGwgdGhlIHRpbWUgZXZlbnQgd2FzIHNlbnQgKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uVGltaW5nIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdTZXNzaW9uVGltaW5nJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBTZXNzaW9uVGltaW5nLmlkO1xuXG4gIC8qKiBFeGFjdCB0aW1lIENsaWVudCB3YXMgaW5pdGlhbGl6ZWQgZXhwcmVzc2VkIGluIG1pbGxpc2Vjb25kcyBzaW5jZSBVbml4IEVwb2NoLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3N0YXJ0VGltZTogbnVtYmVyID0gRGF0ZS5ub3coKTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3I6IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oU2Vzc2lvblRpbWluZyk7XG4gICAgICBpZiAoc2VsZikge1xuICAgICAgICByZXR1cm4gc2VsZi5wcm9jZXNzKGV2ZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBldmVudDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHByb2Nlc3MoZXZlbnQ6IEV2ZW50KTogRXZlbnQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZXZlbnQsXG4gICAgICBleHRyYToge1xuICAgICAgICAuLi5ldmVudC5leHRyYSxcbiAgICAgICAgWydzZXNzaW9uOnN0YXJ0J106IHRoaXMuX3N0YXJ0VGltZSxcbiAgICAgICAgWydzZXNzaW9uOmR1cmF0aW9uJ106IG5vdyAtIHRoaXMuX3N0YXJ0VGltZSxcbiAgICAgICAgWydzZXNzaW9uOmVuZCddOiBub3csXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgRXZlbnRQcm9jZXNzb3IsIEh1YiwgSW50ZWdyYXRpb24sIFN0YWNrRnJhbWUgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuLyoqIEFkZCBub2RlIHRyYW5zYWN0aW9uIHRvIHRoZSBldmVudCAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdUcmFuc2FjdGlvbic7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gVHJhbnNhY3Rpb24uaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihldmVudCA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKFRyYW5zYWN0aW9uKTtcbiAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgIHJldHVybiBzZWxmLnByb2Nlc3MoZXZlbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2ZW50O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcHJvY2VzcyhldmVudDogRXZlbnQpOiBFdmVudCB7XG4gICAgY29uc3QgZnJhbWVzID0gdGhpcy5fZ2V0RnJhbWVzRnJvbUV2ZW50KGV2ZW50KTtcblxuICAgIC8vIHVzZSBmb3IgbG9vcCBzbyB3ZSBkb24ndCBoYXZlIHRvIHJldmVyc2Ugd2hvbGUgZnJhbWVzIGFycmF5XG4gICAgZm9yIChsZXQgaSA9IGZyYW1lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZnJhbWUgPSBmcmFtZXNbaV07XG5cbiAgICAgIGlmIChmcmFtZS5pbl9hcHAgPT09IHRydWUpIHtcbiAgICAgICAgZXZlbnQudHJhbnNhY3Rpb24gPSB0aGlzLl9nZXRUcmFuc2FjdGlvbihmcmFtZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBldmVudDtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9nZXRGcmFtZXNGcm9tRXZlbnQoZXZlbnQ6IEV2ZW50KTogU3RhY2tGcmFtZVtdIHtcbiAgICBjb25zdCBleGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuICAgIHJldHVybiAoZXhjZXB0aW9uICYmIGV4Y2VwdGlvbi5zdGFja3RyYWNlICYmIGV4Y2VwdGlvbi5zdGFja3RyYWNlLmZyYW1lcykgfHwgW107XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfZ2V0VHJhbnNhY3Rpb24oZnJhbWU6IFN0YWNrRnJhbWUpOiBzdHJpbmcge1xuICAgIHJldHVybiBmcmFtZS5tb2R1bGUgfHwgZnJhbWUuZnVuY3Rpb24gPyBgJHtmcmFtZS5tb2R1bGUgfHwgJz8nfS8ke2ZyYW1lLmZ1bmN0aW9uIHx8ICc/J31gIDogJzx1bmtub3duPic7XG4gIH1cbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBIdWIsIEludGVncmF0aW9uLCBJbnRlZ3JhdGlvbkNsYXNzLCBTY29wZSwgU3BhbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGJhc2VuYW1lLCBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciwgdGltZXN0YW1wV2l0aE1zIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8qKlxuICogVXNlZCB0byBleHRyYWN0IFRyYWNpbmcgaW50ZWdyYXRpb24gZnJvbSB0aGUgY3VycmVudCBjbGllbnQsXG4gKiB3aXRob3V0IHRoZSBuZWVkIHRvIGltcG9ydCBgVHJhY2luZ2AgaXRzZWxmIGZyb20gdGhlIEBzZW50cnkvYXBtIHBhY2thZ2UuXG4gKiBAZGVwcmVjYXRlZCBhcyBAc2VudHJ5L3RyYWNpbmcgc2hvdWxkIGJlIHVzZWQgb3ZlciBAc2VudHJ5L2FwbS5cbiAqL1xuY29uc3QgVFJBQ0lOR19HRVRURVIgPSAoe1xuICBpZDogJ1RyYWNpbmcnLFxufSBhcyBhbnkpIGFzIEludGVncmF0aW9uQ2xhc3M8SW50ZWdyYXRpb24+O1xuXG4vKipcbiAqIFVzZWQgdG8gZXh0cmFjdCBCcm93c2VyVHJhY2luZyBpbnRlZ3JhdGlvbiBmcm9tIEBzZW50cnkvdHJhY2luZ1xuICovXG5jb25zdCBCUk9XU0VSX1RSQUNJTkdfR0VUVEVSID0gKHtcbiAgaWQ6ICdCcm93c2VyVHJhY2luZycsXG59IGFzIGFueSkgYXMgSW50ZWdyYXRpb25DbGFzczxJbnRlZ3JhdGlvbj47XG5cbmNvbnN0IFZVRV9PUCA9ICd1aS52dWUnO1xuXG4vKiogR2xvYmFsIFZ1ZSBvYmplY3QgbGltaXRlZCB0byB0aGUgbWV0aG9kcy9hdHRyaWJ1dGVzIHdlIHJlcXVpcmUgKi9cbmludGVyZmFjZSBWdWVJbnN0YW5jZSB7XG4gIGNvbmZpZzoge1xuICAgIGVycm9ySGFuZGxlcj8oZXJyb3I6IEVycm9yLCB2bT86IFZpZXdNb2RlbCwgaW5mbz86IHN0cmluZyk6IHZvaWQ7XG4gIH07XG4gIHV0aWw/OiB7XG4gICAgd2FybiguLi5pbnB1dDogYW55KTogdm9pZDtcbiAgfTtcbiAgbWl4aW4oaG9va3M6IHsgW2tleTogc3RyaW5nXTogKCkgPT4gdm9pZCB9KTogdm9pZDtcbn1cblxuLyoqIFJlcHJlc2VudGF0aW9uIG9mIFZ1ZSBjb21wb25lbnQgaW50ZXJuYWxzICovXG5pbnRlcmZhY2UgVmlld01vZGVsIHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuICAkcm9vdDogb2JqZWN0O1xuICAkb3B0aW9uczoge1xuICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIHByb3BzRGF0YT86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgX2NvbXBvbmVudFRhZz86IHN0cmluZztcbiAgICBfX2ZpbGU/OiBzdHJpbmc7XG4gICAgJF9zZW50cnlQZXJmSG9vaz86IGJvb2xlYW47XG4gIH07XG4gICRvbmNlKGhvb2s6IHN0cmluZywgY2I6ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG4vKiogVnVlIEludGVncmF0aW9uIGNvbmZpZ3VyYXRpb24gKi9cbmludGVyZmFjZSBJbnRlZ3JhdGlvbk9wdGlvbnMge1xuICAvKiogVnVlIGluc3RhbmNlIHRvIGJlIHVzZWQgaW5zaWRlIHRoZSBpbnRlZ3JhdGlvbiAqL1xuICBWdWU6IFZ1ZUluc3RhbmNlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCB0byBgZmFsc2VgLCBTZW50cnkgd2lsbCBzdXBwcmVzcyByZXBvcnRpbmcgb2YgYWxsIHByb3BzIGRhdGFcbiAgICogZnJvbSB5b3VyIFZ1ZSBjb21wb25lbnRzIGZvciBwcml2YWN5IGNvbmNlcm5zLlxuICAgKi9cbiAgYXR0YWNoUHJvcHM6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGVuIHNldCB0byBgdHJ1ZWAsIG9yaWdpbmFsIFZ1ZSdzIGBsb2dFcnJvcmAgd2lsbCBiZSBjYWxsZWQgYXMgd2VsbC5cbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3Z1ZWpzL3Z1ZS9ibG9iL2MyYjFjZmU5Y2NkMDg4MzVmMmQ5OWY2Y2U2MGY2N2I0ZGU1NTE4N2Yvc3JjL2NvcmUvdXRpbC9lcnJvci5qcyNMMzgtTDQ4XG4gICAqL1xuICBsb2dFcnJvcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZW5hYmxlcyB0cmFja2luZyBvZiBjb21wb25lbnRzIGxpZmVjeWNsZSBwZXJmb3JtYW5jZS5cbiAgICogSXQgcmVxdWlyZXMgYFRyYWNpbmdgIGludGVncmF0aW9uIHRvIGJlIGFsc28gZW5hYmxlZC5cbiAgICovXG4gIHRyYWNpbmc6IGJvb2xlYW47XG5cbiAgLyoqIHtAbGluayBUcmFjaW5nT3B0aW9uc30gKi9cbiAgdHJhY2luZ09wdGlvbnM6IFRyYWNpbmdPcHRpb25zO1xufVxuXG4vKiogVnVlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIFRyYWNpbmcgSW50ZWdyYXRpb24gICovXG5pbnRlcmZhY2UgVHJhY2luZ09wdGlvbnMge1xuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIHRvIHRyYWNrIGNvbXBvbmVudHMgYnkgaG9va2luZyBpbnRvIGl0cyBsaWZlY3ljbGUgbWV0aG9kcy5cbiAgICogQ2FuIGJlIGVpdGhlciBzZXQgdG8gYGJvb2xlYW5gIHRvIGVuYWJsZS9kaXNhYmxlIHRyYWNraW5nIGZvciBhbGwgb2YgdGhlbS5cbiAgICogT3IgdG8gYW4gYXJyYXkgb2Ygc3BlY2lmaWMgY29tcG9uZW50IG5hbWVzIChjYXNlLXNlbnNpdGl2ZSkuXG4gICAqL1xuICB0cmFja0NvbXBvbmVudHM6IGJvb2xlYW4gfCBzdHJpbmdbXTtcbiAgLyoqIEhvdyBsb25nIHRvIHdhaXQgdW50aWwgdGhlIHRyYWNrZWQgcm9vdCBhY3Rpdml0eSBpcyBtYXJrZWQgYXMgZmluaXNoZWQgYW5kIHNlbnQgb2YgdG8gU2VudHJ5ICovXG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIExpc3Qgb2YgaG9va3MgdG8ga2VlcCB0cmFjayBvZiBkdXJpbmcgY29tcG9uZW50IGxpZmVjeWNsZS5cbiAgICogQXZhaWxhYmxlIGhvb2tzOiAnYWN0aXZhdGUnIHwgJ2NyZWF0ZScgfCAnZGVzdHJveScgfCAnbW91bnQnIHwgJ3VwZGF0ZSdcbiAgICogQmFzZWQgb24gaHR0cHM6Ly92dWVqcy5vcmcvdjIvYXBpLyNPcHRpb25zLUxpZmVjeWNsZS1Ib29rc1xuICAgKi9cbiAgaG9va3M6IE9wZXJhdGlvbltdO1xufVxuXG4vKiogT3B0aW9uYWwgbWV0YWRhdGEgYXR0YWNoZWQgdG8gU2VudHJ5IEV2ZW50ICovXG5pbnRlcmZhY2UgTWV0YWRhdGEge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIGNvbXBvbmVudE5hbWU/OiBzdHJpbmc7XG4gIHByb3BzRGF0YT86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIGxpZmVjeWNsZUhvb2s/OiBzdHJpbmc7XG59XG5cbi8vIGh0dHBzOi8vdnVlanMub3JnL3YyL2FwaS8jT3B0aW9ucy1MaWZlY3ljbGUtSG9va3NcbnR5cGUgSG9vayA9XG4gIHwgJ2FjdGl2YXRlZCdcbiAgfCAnYmVmb3JlQ3JlYXRlJ1xuICB8ICdiZWZvcmVEZXN0cm95J1xuICB8ICdiZWZvcmVNb3VudCdcbiAgfCAnYmVmb3JlVXBkYXRlJ1xuICB8ICdjcmVhdGVkJ1xuICB8ICdkZWFjdGl2YXRlZCdcbiAgfCAnZGVzdHJveWVkJ1xuICB8ICdtb3VudGVkJ1xuICB8ICd1cGRhdGVkJztcblxudHlwZSBPcGVyYXRpb24gPSAnYWN0aXZhdGUnIHwgJ2NyZWF0ZScgfCAnZGVzdHJveScgfCAnbW91bnQnIHwgJ3VwZGF0ZSc7XG5cbi8vIE1hcHBpbmdzIGZyb20gb3BlcmF0aW9uIHRvIGNvcnJlc3BvbmRpbmcgbGlmZWN5Y2xlIGhvb2suXG5jb25zdCBIT09LUzogeyBba2V5IGluIE9wZXJhdGlvbl06IEhvb2tbXSB9ID0ge1xuICBhY3RpdmF0ZTogWydhY3RpdmF0ZWQnLCAnZGVhY3RpdmF0ZWQnXSxcbiAgY3JlYXRlOiBbJ2JlZm9yZUNyZWF0ZScsICdjcmVhdGVkJ10sXG4gIGRlc3Ryb3k6IFsnYmVmb3JlRGVzdHJveScsICdkZXN0cm95ZWQnXSxcbiAgbW91bnQ6IFsnYmVmb3JlTW91bnQnLCAnbW91bnRlZCddLFxuICB1cGRhdGU6IFsnYmVmb3JlVXBkYXRlJywgJ3VwZGF0ZWQnXSxcbn07XG5cbmNvbnN0IENPTVBPTkVOVF9OQU1FX1JFR0VYUCA9IC8oPzpefFstXy9dKShcXHcpL2c7XG5jb25zdCBST09UX0NPTVBPTkVOVF9OQU1FID0gJ3Jvb3QnO1xuY29uc3QgQU5PTllNT1VTX0NPTVBPTkVOVF9OQU1FID0gJ2Fub255bW91cyBjb21wb25lbnQnO1xuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBjbGFzcyBWdWUgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ1Z1ZSc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gVnVlLmlkO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IEludGVncmF0aW9uT3B0aW9ucztcblxuICAvKipcbiAgICogQ2FjaGUgaG9sZGluZyBhbHJlYWR5IHByb2Nlc3NlZCBjb21wb25lbnQgbmFtZXNcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvbXBvbmVudHNDYWNoZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuICBwcml2YXRlIF9yb290U3Bhbj86IFNwYW47XG4gIHByaXZhdGUgX3Jvb3RTcGFuVGltZXI/OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PjtcbiAgcHJpdmF0ZSBfdHJhY2luZ0FjdGl2aXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIG9wdGlvbnM6IFBhcnRpYWw8T21pdDxJbnRlZ3JhdGlvbk9wdGlvbnMsICd0cmFjaW5nT3B0aW9ucyc+ICYgeyB0cmFjaW5nT3B0aW9uczogUGFydGlhbDxUcmFjaW5nT3B0aW9ucz4gfT4sXG4gICkge1xuICAgIGxvZ2dlci5sb2coJ1lvdSBhcmUgc3RpbGwgdXNpbmcgdGhlIFZ1ZS5qcyBpbnRlZ3JhdGlvbiwgY29uc2lkZXIgbW92aW5nIHRvIEBzZW50cnkvdnVlJyk7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIFZ1ZTogZ2V0R2xvYmFsT2JqZWN0PGFueT4oKS5WdWUsXG4gICAgICBhdHRhY2hQcm9wczogdHJ1ZSxcbiAgICAgIGxvZ0Vycm9yczogZmFsc2UsXG4gICAgICB0cmFjaW5nOiBmYWxzZSxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0cmFjaW5nT3B0aW9uczoge1xuICAgICAgICBob29rczogWydtb3VudCcsICd1cGRhdGUnXSxcbiAgICAgICAgdGltZW91dDogMjAwMCxcbiAgICAgICAgdHJhY2tDb21wb25lbnRzOiBmYWxzZSxcbiAgICAgICAgLi4ub3B0aW9ucy50cmFjaW5nT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShfOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuVnVlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1Z1ZSBpbnRlZ3JhdGlvbiBpcyBtaXNzaW5nIGEgVnVlIGluc3RhbmNlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fYXR0YWNoRXJyb3JIYW5kbGVyKGdldEN1cnJlbnRIdWIpO1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMudHJhY2luZykge1xuICAgICAgdGhpcy5fc3RhcnRUcmFjaW5nKGdldEN1cnJlbnRIdWIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IGNvbXBvbmVudCBuYW1lIGZyb20gdGhlIFZpZXdNb2RlbFxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0Q29tcG9uZW50TmFtZSh2bTogVmlld01vZGVsKTogc3RyaW5nIHtcbiAgICAvLyBTdWNoIGxldmVsIG9mIGdyYW51bGFyaXR5IGlzIG1vc3QgbGlrZWx5IG5vdCBuZWNlc3NhcnksIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5LiBcdTIwMTQgS2FtaWxcbiAgICBpZiAoIXZtKSB7XG4gICAgICByZXR1cm4gQU5PTllNT1VTX0NPTVBPTkVOVF9OQU1FO1xuICAgIH1cblxuICAgIGlmICh2bS4kcm9vdCA9PT0gdm0pIHtcbiAgICAgIHJldHVybiBST09UX0NPTVBPTkVOVF9OQU1FO1xuICAgIH1cblxuICAgIGlmICghdm0uJG9wdGlvbnMpIHtcbiAgICAgIHJldHVybiBBTk9OWU1PVVNfQ09NUE9ORU5UX05BTUU7XG4gICAgfVxuXG4gICAgaWYgKHZtLiRvcHRpb25zLm5hbWUpIHtcbiAgICAgIHJldHVybiB2bS4kb3B0aW9ucy5uYW1lO1xuICAgIH1cblxuICAgIGlmICh2bS4kb3B0aW9ucy5fY29tcG9uZW50VGFnKSB7XG4gICAgICByZXR1cm4gdm0uJG9wdGlvbnMuX2NvbXBvbmVudFRhZztcbiAgICB9XG5cbiAgICAvLyBpbmplY3RlZCBieSB2dWUtbG9hZGVyXG4gICAgaWYgKHZtLiRvcHRpb25zLl9fZmlsZSkge1xuICAgICAgY29uc3QgdW5pZmllZEZpbGUgPSB2bS4kb3B0aW9ucy5fX2ZpbGUucmVwbGFjZSgvXlthLXpBLVpdOi8sICcnKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGJhc2VuYW1lKHVuaWZpZWRGaWxlLCAnLnZ1ZScpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGhpcy5fY29tcG9uZW50c0NhY2hlW2ZpbGVuYW1lXSB8fFxuICAgICAgICAodGhpcy5fY29tcG9uZW50c0NhY2hlW2ZpbGVuYW1lXSA9IGZpbGVuYW1lLnJlcGxhY2UoQ09NUE9ORU5UX05BTUVfUkVHRVhQLCAoXywgYzogc3RyaW5nKSA9PlxuICAgICAgICAgIGMgPyBjLnRvVXBwZXJDYXNlKCkgOiAnJyxcbiAgICAgICAgKSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFOT05ZTU9VU19DT01QT05FTlRfTkFNRTtcbiAgfVxuXG4gIC8qKiBLZWVwIGl0IGFzIGF0dHJpYnV0ZSBmdW5jdGlvbiwgdG8ga2VlcCBjb3JyZWN0IGB0aGlzYCBiaW5kaW5nIGluc2lkZSB0aGUgaG9va3MgY2FsbGJhY2tzICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3R5cGVkZWZcbiAgcHJpdmF0ZSByZWFkb25seSBfYXBwbHlUcmFjaW5nSG9va3MgPSAodm06IFZpZXdNb2RlbCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCA9PiB7XG4gICAgLy8gRG9uJ3QgYXR0YWNoIHR3aWNlLCBqdXN0IGluIGNhc2VcbiAgICBpZiAodm0uJG9wdGlvbnMuJF9zZW50cnlQZXJmSG9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2bS4kb3B0aW9ucy4kX3NlbnRyeVBlcmZIb29rID0gdHJ1ZTtcblxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9nZXRDb21wb25lbnROYW1lKHZtKTtcbiAgICBjb25zdCByb290TW91bnQgPSBuYW1lID09PSBST09UX0NPTVBPTkVOVF9OQU1FO1xuICAgIGNvbnN0IHNwYW5zOiB7IFtrZXk6IHN0cmluZ106IFNwYW4gfSA9IHt9O1xuXG4gICAgLy8gUmVuZGVyIGhvb2sgc3RhcnRzIGFmdGVyIG9uY2UgZXZlbnQgaXMgZW1pdHRlZCxcbiAgICAvLyBidXQgaXQgZW5kcyBiZWZvcmUgdGhlIHNlY29uZCBldmVudCBvZiB0aGUgc2FtZSB0eXBlLlxuICAgIC8vXG4gICAgLy8gQmVjYXVzZSBvZiB0aGlzLCB3ZSBzdGFydCBtZWFzdXJpbmcgaW5zaWRlIHRoZSBmaXJzdCBldmVudCxcbiAgICAvLyBidXQgZmluaXNoIGl0IGJlZm9yZSBpdCB0cmlnZ2VycywgdG8gc2tpcCB0aGUgZXZlbnQgZW1pdHRlciB0aW1pbmcgaXRzZWxmLlxuICAgIGNvbnN0IHJvb3RIYW5kbGVyID0gKGhvb2s6IEhvb2spOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IHRpbWVzdGFtcFdpdGhNcygpO1xuXG4gICAgICAvLyBPbiB0aGUgZmlyc3QgaGFuZGxlciBjYWxsIChiZWZvcmUpLCBpdCdsbCBiZSB1bmRlZmluZWQsIGFzIGAkb25jZWAgd2lsbCBhZGQgaXQgaW4gdGhlIGZ1dHVyZS5cbiAgICAgIC8vIEhvd2V2ZXIsIG9uIHRoZSBzZWNvbmQgY2FsbCAoYWZ0ZXIpLCBpdCdsbCBiZSBhbHJlYWR5IGluIHBsYWNlLlxuICAgICAgaWYgKHRoaXMuX3Jvb3RTcGFuKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaFJvb3RTcGFuKG5vdywgZ2V0Q3VycmVudEh1Yik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bS4kb25jZShgaG9vazoke2hvb2t9YCwgKCkgPT4ge1xuICAgICAgICAgIC8vIENyZWF0ZSBhbiBhY3Rpdml0eSBvbiB0aGUgZmlyc3QgZXZlbnQgY2FsbC4gVGhlcmUnbGwgYmUgbm8gc2Vjb25kIGNhbGwsIGFzIHJvb3RTcGFuIHdpbGwgYmUgaW4gcGxhY2UsXG4gICAgICAgICAgLy8gdGh1cyBuZXcgZXZlbnQgaGFuZGxlciB3b24ndCBiZSBhdHRhY2hlZC5cblxuICAgICAgICAgIC8vIFdlIGRvIHRoaXMgd2hvbGUgZGFuY2Ugd2l0aCBgVFJBQ0lOR19HRVRURVJgIHRvIHByZXZlbnQgYEBzZW50cnkvYXBtYCBmcm9tIGJlY29taW5nIGEgcGVlckRlcGVuZGVuY3kuXG4gICAgICAgICAgLy8gV2UgYWxzbyBuZWVkIHRvIGFzayBmb3IgdGhlIGAuY29uc3RydWN0b3JgLCBhcyBgcHVzaEFjdGl2aXR5YCBhbmQgYHBvcEFjdGl2aXR5YCBhcmUgc3RhdGljLCBub3QgaW5zdGFuY2UgbWV0aG9kcy5cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgICAgICBjb25zdCB0cmFjaW5nSW50ZWdyYXRpb24gPSBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oVFJBQ0lOR19HRVRURVIpO1xuICAgICAgICAgIGlmICh0cmFjaW5nSW50ZWdyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX3RyYWNpbmdBY3Rpdml0eSA9ICh0cmFjaW5nSW50ZWdyYXRpb24gYXMgYW55KS5jb25zdHJ1Y3Rvci5wdXNoQWN0aXZpdHkoJ1Z1ZSBBcHBsaWNhdGlvbiBSZW5kZXInKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gKHRyYWNpbmdJbnRlZ3JhdGlvbiBhcyBhbnkpLmNvbnN0cnVjdG9yLmdldFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdFNwYW4gPSB0cmFuc2FjdGlvbi5zdGFydENoaWxkKHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGxpY2F0aW9uIFJlbmRlcicsXG4gICAgICAgICAgICAgICAgb3A6IFZVRV9PUCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBVc2UgZnVuY3Rpb25hbGl0eSBmcm9tIEBzZW50cnkvdHJhY2luZ1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhY3RpdmVUcmFuc2FjdGlvbiA9IGdldEFjdGl2ZVRyYW5zYWN0aW9uKGdldEN1cnJlbnRIdWIoKSk7XG4gICAgICAgICAgICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICAgICAgICAgICAgdGhpcy5fcm9vdFNwYW4gPSBhY3RpdmVUcmFuc2FjdGlvbi5zdGFydENoaWxkKHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0FwcGxpY2F0aW9uIFJlbmRlcicsXG4gICAgICAgICAgICAgICAgb3A6IFZVRV9PUCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjaGlsZEhhbmRsZXIgPSAoaG9vazogSG9vaywgb3BlcmF0aW9uOiBPcGVyYXRpb24pOiB2b2lkID0+IHtcbiAgICAgIC8vIFNraXAgY29tcG9uZW50cyB0aGF0IHdlIGRvbid0IHdhbnQgdG8gdHJhY2sgdG8gbWluaW1pemUgdGhlIG5vaXNlIGFuZCBnaXZlIGEgbW9yZSBncmFudWxhciBjb250cm9sIHRvIHRoZSB1c2VyXG4gICAgICBjb25zdCBzaG91bGRUcmFjayA9IEFycmF5LmlzQXJyYXkodGhpcy5fb3B0aW9ucy50cmFjaW5nT3B0aW9ucy50cmFja0NvbXBvbmVudHMpXG4gICAgICAgID8gdGhpcy5fb3B0aW9ucy50cmFjaW5nT3B0aW9ucy50cmFja0NvbXBvbmVudHMuaW5kZXhPZihuYW1lKSA+IC0xXG4gICAgICAgIDogdGhpcy5fb3B0aW9ucy50cmFjaW5nT3B0aW9ucy50cmFja0NvbXBvbmVudHM7XG5cbiAgICAgIGlmICghdGhpcy5fcm9vdFNwYW4gfHwgIXNob3VsZFRyYWNrKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgbm93ID0gdGltZXN0YW1wV2l0aE1zKCk7XG4gICAgICBjb25zdCBzcGFuID0gc3BhbnNbb3BlcmF0aW9uXTtcblxuICAgICAgLy8gT24gdGhlIGZpcnN0IGhhbmRsZXIgY2FsbCAoYmVmb3JlKSwgaXQnbGwgYmUgdW5kZWZpbmVkLCBhcyBgJG9uY2VgIHdpbGwgYWRkIGl0IGluIHRoZSBmdXR1cmUuXG4gICAgICAvLyBIb3dldmVyLCBvbiB0aGUgc2Vjb25kIGNhbGwgKGFmdGVyKSwgaXQnbGwgYmUgYWxyZWFkeSBpbiBwbGFjZS5cbiAgICAgIGlmIChzcGFuKSB7XG4gICAgICAgIHNwYW4uZmluaXNoKCk7XG4gICAgICAgIHRoaXMuX2ZpbmlzaFJvb3RTcGFuKG5vdywgZ2V0Q3VycmVudEh1Yik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2bS4kb25jZShgaG9vazoke2hvb2t9YCwgKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9yb290U3Bhbikge1xuICAgICAgICAgICAgc3BhbnNbb3BlcmF0aW9uXSA9IHRoaXMuX3Jvb3RTcGFuLnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogYFZ1ZSA8JHtuYW1lfT5gLFxuICAgICAgICAgICAgICBvcDogYCR7VlVFX09QfS4ke29wZXJhdGlvbn1gLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRWFjaCBjb21wb25lbnQgaGFzIGl0J3Mgb3duIHNjb3BlLCBzbyBhbGwgYWN0aXZpdGllcyBhcmUgb25seSByZWxhdGVkIHRvIG9uZSBvZiB0aGVtXG4gICAgdGhpcy5fb3B0aW9ucy50cmFjaW5nT3B0aW9ucy5ob29rcy5mb3JFYWNoKG9wZXJhdGlvbiA9PiB7XG4gICAgICAvLyBSZXRyaWV2ZSBjb3JyZXNwb25kaW5nIGhvb2tzIGZyb20gVnVlIGxpZmVjeWNsZS5cbiAgICAgIC8vIGVnLiBtb3VudCA9PiBbJ2JlZm9yZU1vdW50JywgJ21vdW50ZWQnXVxuICAgICAgY29uc3QgaW50ZXJuYWxIb29rcyA9IEhPT0tTW29wZXJhdGlvbl07XG5cbiAgICAgIGlmICghaW50ZXJuYWxIb29rcykge1xuICAgICAgICBsb2dnZXIud2FybihgVW5rbm93biBob29rOiAke29wZXJhdGlvbn1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpbnRlcm5hbEhvb2tzLmZvckVhY2goaW50ZXJuYWxIb29rID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHJvb3RNb3VudFxuICAgICAgICAgID8gcm9vdEhhbmRsZXIuYmluZCh0aGlzLCBpbnRlcm5hbEhvb2spXG4gICAgICAgICAgOiBjaGlsZEhhbmRsZXIuYmluZCh0aGlzLCBpbnRlcm5hbEhvb2ssIG9wZXJhdGlvbik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHZtLiRvcHRpb25zW2ludGVybmFsSG9va107XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudFZhbHVlKSkge1xuICAgICAgICAgIHZtLiRvcHRpb25zW2ludGVybmFsSG9va10gPSBbaGFuZGxlciwgLi4uY3VycmVudFZhbHVlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY3VycmVudFZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdm0uJG9wdGlvbnNbaW50ZXJuYWxIb29rXSA9IFtoYW5kbGVyLCBjdXJyZW50VmFsdWVdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZtLiRvcHRpb25zW2ludGVybmFsSG9va10gPSBbaGFuZGxlcl07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKiBGaW5pc2ggdG9wLWxldmVsIHNwYW4gYW5kIGFjdGl2aXR5IHdpdGggYSBkZWJvdW5jZSBjb25maWd1cmVkIHVzaW5nIGB0aW1lb3V0YCBvcHRpb24gKi9cbiAgcHJpdmF0ZSBfZmluaXNoUm9vdFNwYW4odGltZXN0YW1wOiBudW1iZXIsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9yb290U3BhblRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcm9vdFNwYW5UaW1lcik7XG4gICAgfVxuXG4gICAgdGhpcy5fcm9vdFNwYW5UaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX3RyYWNpbmdBY3Rpdml0eSkge1xuICAgICAgICAvLyBXZSBkbyB0aGlzIHdob2xlIGRhbmNlIHdpdGggYFRSQUNJTkdfR0VUVEVSYCB0byBwcmV2ZW50IGBAc2VudHJ5L2FwbWAgZnJvbSBiZWNvbWluZyBhIHBlZXJEZXBlbmRlbmN5LlxuICAgICAgICAvLyBXZSBhbHNvIG5lZWQgdG8gYXNrIGZvciB0aGUgYC5jb25zdHJ1Y3RvcmAsIGFzIGBwdXNoQWN0aXZpdHlgIGFuZCBgcG9wQWN0aXZpdHlgIGFyZSBzdGF0aWMsIG5vdCBpbnN0YW5jZSBtZXRob2RzLlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgICAgY29uc3QgdHJhY2luZ0ludGVncmF0aW9uID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKFRSQUNJTkdfR0VUVEVSKTtcbiAgICAgICAgaWYgKHRyYWNpbmdJbnRlZ3JhdGlvbikge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAodHJhY2luZ0ludGVncmF0aW9uIGFzIGFueSkuY29uc3RydWN0b3IucG9wQWN0aXZpdHkodGhpcy5fdHJhY2luZ0FjdGl2aXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIGZpbmlzaCB0aGUgc3Bhbiwgb25seSBzaG91bGQgcG9wIGFjdGl2aXR5IGlmIHVzaW5nIEBzZW50cnkvYXBtXG4gICAgICBpZiAodGhpcy5fcm9vdFNwYW4pIHtcbiAgICAgICAgdGhpcy5fcm9vdFNwYW4uZmluaXNoKHRpbWVzdGFtcCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5fb3B0aW9ucy50cmFjaW5nT3B0aW9ucy50aW1lb3V0KTtcbiAgfVxuXG4gIC8qKiBJbmplY3QgY29uZmlndXJlZCB0cmFjaW5nIGhvb2tzIGludG8gVnVlJ3MgY29tcG9uZW50IGxpZmVjeWNsZXMgKi9cbiAgcHJpdmF0ZSBfc3RhcnRUcmFjaW5nKGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGNvbnN0IGFwcGx5VHJhY2luZ0hvb2tzID0gdGhpcy5fYXBwbHlUcmFjaW5nSG9va3M7XG5cbiAgICB0aGlzLl9vcHRpb25zLlZ1ZS5taXhpbih7XG4gICAgICBiZWZvcmVDcmVhdGUodGhpczogVmlld01vZGVsKTogdm9pZCB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgICAgICBpZiAoZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKFRSQUNJTkdfR0VUVEVSKSB8fCBnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oQlJPV1NFUl9UUkFDSU5HX0dFVFRFUikpIHtcbiAgICAgICAgICAvLyBgdGhpc2AgcG9pbnRzIHRvIGN1cnJlbnRseSByZW5kZXJlZCBjb21wb25lbnRcbiAgICAgICAgICBhcHBseVRyYWNpbmdIb29rcyh0aGlzLCBnZXRDdXJyZW50SHViKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1Z1ZSBpbnRlZ3JhdGlvbiBoYXMgdHJhY2luZyBlbmFibGVkLCBidXQgVHJhY2luZyBpbnRlZ3JhdGlvbiBpcyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEluamVjdCBTZW50cnkncyBoYW5kbGVyIGludG8gb3ducyBWdWUncyBlcnJvciBoYW5kbGVyICAqL1xuICBwcml2YXRlIF9hdHRhY2hFcnJvckhhbmRsZXIoZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgIGNvbnN0IGN1cnJlbnRFcnJvckhhbmRsZXIgPSB0aGlzLl9vcHRpb25zLlZ1ZS5jb25maWcuZXJyb3JIYW5kbGVyO1xuXG4gICAgdGhpcy5fb3B0aW9ucy5WdWUuY29uZmlnLmVycm9ySGFuZGxlciA9IChlcnJvcjogRXJyb3IsIHZtPzogVmlld01vZGVsLCBpbmZvPzogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBtZXRhZGF0YTogTWV0YWRhdGEgPSB7fTtcblxuICAgICAgaWYgKHZtKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWV0YWRhdGEuY29tcG9uZW50TmFtZSA9IHRoaXMuX2dldENvbXBvbmVudE5hbWUodm0pO1xuXG4gICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMuYXR0YWNoUHJvcHMpIHtcbiAgICAgICAgICAgIG1ldGFkYXRhLnByb3BzRGF0YSA9IHZtLiRvcHRpb25zLnByb3BzRGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdVbmFibGUgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tIFZ1ZSBjb21wb25lbnQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgbWV0YWRhdGEubGlmZWN5Y2xlSG9vayA9IGluZm87XG4gICAgICB9XG5cbiAgICAgIGlmIChnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oVnVlKSkge1xuICAgICAgICAvLyBDYXB0dXJlIGV4Y2VwdGlvbiBpbiB0aGUgbmV4dCBldmVudCBsb29wLCB0byBtYWtlIHN1cmUgdGhhdCBhbGwgYnJlYWRjcnVtYnMgYXJlIHJlY29yZGVkIGluIHRpbWUuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGdldEN1cnJlbnRIdWIoKS53aXRoU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICAgICAgc2NvcGUuc2V0Q29udGV4dCgndnVlJywgbWV0YWRhdGEpO1xuICAgICAgICAgICAgZ2V0Q3VycmVudEh1YigpLmNhcHR1cmVFeGNlcHRpb24oZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjdXJyZW50RXJyb3JIYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGN1cnJlbnRFcnJvckhhbmRsZXIuY2FsbCh0aGlzLl9vcHRpb25zLlZ1ZSwgZXJyb3IsIHZtLCBpbmZvKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMubG9nRXJyb3JzKSB7XG4gICAgICAgIGlmICh0aGlzLl9vcHRpb25zLlZ1ZS51dGlsKSB7XG4gICAgICAgICAgdGhpcy5fb3B0aW9ucy5WdWUudXRpbC53YXJuKGBFcnJvciBpbiAke2luZm99OiBcIiR7ZXJyb3IgJiYgZXJyb3IudG9TdHJpbmcoKX1cImAsIHZtKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5cbmludGVyZmFjZSBIdWJUeXBlIGV4dGVuZHMgSHViIHtcbiAgZ2V0U2NvcGU/KCk6IFNjb3BlIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogR3JhYnMgYWN0aXZlIHRyYW5zYWN0aW9uIG9mZiBzY29wZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZVRyYW5zYWN0aW9uPFQgZXh0ZW5kcyBUcmFuc2FjdGlvbj4oaHViOiBIdWJUeXBlKTogVCB8IHVuZGVmaW5lZCB7XG4gIGlmIChodWIgJiYgaHViLmdldFNjb3BlKSB7XG4gICAgY29uc3Qgc2NvcGUgPSBodWIuZ2V0U2NvcGUoKSBhcyBTY29wZTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIHJldHVybiBzY29wZS5nZXRUcmFuc2FjdGlvbigpIGFzIFQgfCB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJleHBvcnQgeyBBbmd1bGFyIH0gZnJvbSAnLi9hbmd1bGFyJztcbmV4cG9ydCB7IENhcHR1cmVDb25zb2xlIH0gZnJvbSAnLi9jYXB0dXJlY29uc29sZSc7XG5leHBvcnQgeyBEZWJ1ZyB9IGZyb20gJy4vZGVidWcnO1xuZXhwb3J0IHsgRGVkdXBlIH0gZnJvbSAnLi9kZWR1cGUnO1xuZXhwb3J0IHsgRW1iZXIgfSBmcm9tICcuL2VtYmVyJztcbmV4cG9ydCB7IEV4dHJhRXJyb3JEYXRhIH0gZnJvbSAnLi9leHRyYWVycm9yZGF0YSc7XG5leHBvcnQgeyBPZmZsaW5lIH0gZnJvbSAnLi9vZmZsaW5lJztcbmV4cG9ydCB7IFJlcG9ydGluZ09ic2VydmVyIH0gZnJvbSAnLi9yZXBvcnRpbmdvYnNlcnZlcic7XG5leHBvcnQgeyBSZXdyaXRlRnJhbWVzIH0gZnJvbSAnLi9yZXdyaXRlZnJhbWVzJztcbmV4cG9ydCB7IFNlc3Npb25UaW1pbmcgfSBmcm9tICcuL3Nlc3Npb250aW1pbmcnO1xuZXhwb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmV4cG9ydCB7IFZ1ZSB9IGZyb20gJy4vdnVlJztcbiIsICIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBpbnRUb0NoYXJNYXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuXG4vKipcbiAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gKi9cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG51bWJlcikge1xuICBpZiAoMCA8PSBudW1iZXIgJiYgbnVtYmVyIDwgaW50VG9DaGFyTWFwLmxlbmd0aCkge1xuICAgIHJldHVybiBpbnRUb0NoYXJNYXBbbnVtYmVyXTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiBcIiArIG51bWJlcik7XG59O1xuXG4vKipcbiAqIERlY29kZSBhIHNpbmdsZSBiYXNlIDY0IGNoYXJhY3RlciBjb2RlIGRpZ2l0IHRvIGFuIGludGVnZXIuIFJldHVybnMgLTEgb25cbiAqIGZhaWx1cmUuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gIHZhciBiaWdBID0gNjU7ICAgICAvLyAnQSdcbiAgdmFyIGJpZ1ogPSA5MDsgICAgIC8vICdaJ1xuXG4gIHZhciBsaXR0bGVBID0gOTc7ICAvLyAnYSdcbiAgdmFyIGxpdHRsZVogPSAxMjI7IC8vICd6J1xuXG4gIHZhciB6ZXJvID0gNDg7ICAgICAvLyAnMCdcbiAgdmFyIG5pbmUgPSA1NzsgICAgIC8vICc5J1xuXG4gIHZhciBwbHVzID0gNDM7ICAgICAvLyAnKydcbiAgdmFyIHNsYXNoID0gNDc7ICAgIC8vICcvJ1xuXG4gIHZhciBsaXR0bGVPZmZzZXQgPSAyNjtcbiAgdmFyIG51bWJlck9mZnNldCA9IDUyO1xuXG4gIC8vIDAgLSAyNTogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcbiAgaWYgKGJpZ0EgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gYmlnWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBiaWdBKTtcbiAgfVxuXG4gIC8vIDI2IC0gNTE6IGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XG4gIGlmIChsaXR0bGVBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGxpdHRsZVopIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gbGl0dGxlQSArIGxpdHRsZU9mZnNldCk7XG4gIH1cblxuICAvLyA1MiAtIDYxOiAwMTIzNDU2Nzg5XG4gIGlmICh6ZXJvIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IG5pbmUpIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gemVybyArIG51bWJlck9mZnNldCk7XG4gIH1cblxuICAvLyA2MjogK1xuICBpZiAoY2hhckNvZGUgPT0gcGx1cykge1xuICAgIHJldHVybiA2MjtcbiAgfVxuXG4gIC8vIDYzOiAvXG4gIGlmIChjaGFyQ29kZSA9PSBzbGFzaCkge1xuICAgIHJldHVybiA2MztcbiAgfVxuXG4gIC8vIEludmFsaWQgYmFzZTY0IGRpZ2l0LlxuICByZXR1cm4gLTE7XG59O1xuIiwgIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKlxuICogQmFzZWQgb24gdGhlIEJhc2UgNjQgVkxRIGltcGxlbWVudGF0aW9uIGluIENsb3N1cmUgQ29tcGlsZXI6XG4gKiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nsb3N1cmUtY29tcGlsZXIvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvY29tL2dvb2dsZS9kZWJ1Z2dpbmcvc291cmNlbWFwL0Jhc2U2NFZMUS5qYXZhXG4gKlxuICogQ29weXJpZ2h0IDIwMTEgVGhlIENsb3N1cmUgQ29tcGlsZXIgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dFxuICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZVxuICogbWV0OlxuICpcbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0XG4gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlXG4gKiAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZ1xuICogICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkXG4gKiAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzXG4gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWRcbiAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi5cbiAqXG4gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4gKiBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1JcbiAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0VcbiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4gKi9cblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJy4vYmFzZTY0Jyk7XG5cbi8vIEEgc2luZ2xlIGJhc2UgNjQgZGlnaXQgY2FuIGNvbnRhaW4gNiBiaXRzIG9mIGRhdGEuIEZvciB0aGUgYmFzZSA2NCB2YXJpYWJsZVxuLy8gbGVuZ3RoIHF1YW50aXRpZXMgd2UgdXNlIGluIHRoZSBzb3VyY2UgbWFwIHNwZWMsIHRoZSBmaXJzdCBiaXQgaXMgdGhlIHNpZ24sXG4vLyB0aGUgbmV4dCBmb3VyIGJpdHMgYXJlIHRoZSBhY3R1YWwgdmFsdWUsIGFuZCB0aGUgNnRoIGJpdCBpcyB0aGVcbi8vIGNvbnRpbnVhdGlvbiBiaXQuIFRoZSBjb250aW51YXRpb24gYml0IHRlbGxzIHVzIHdoZXRoZXIgdGhlcmUgYXJlIG1vcmVcbi8vIGRpZ2l0cyBpbiB0aGlzIHZhbHVlIGZvbGxvd2luZyB0aGlzIGRpZ2l0LlxuLy9cbi8vICAgQ29udGludWF0aW9uXG4vLyAgIHwgICAgU2lnblxuLy8gICB8ICAgIHxcbi8vICAgViAgICBWXG4vLyAgIDEwMTAxMVxuXG52YXIgVkxRX0JBU0VfU0hJRlQgPSA1O1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9CQVNFID0gMSA8PCBWTFFfQkFTRV9TSElGVDtcblxuLy8gYmluYXJ5OiAwMTExMTFcbnZhciBWTFFfQkFTRV9NQVNLID0gVkxRX0JBU0UgLSAxO1xuXG4vLyBiaW5hcnk6IDEwMDAwMFxudmFyIFZMUV9DT05USU5VQVRJT05fQklUID0gVkxRX0JBU0U7XG5cbi8qKlxuICogQ29udmVydHMgZnJvbSBhIHR3by1jb21wbGVtZW50IHZhbHVlIHRvIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMSBiZWNvbWVzIDIgKDEwIGJpbmFyeSksIC0xIGJlY29tZXMgMyAoMTEgYmluYXJ5KVxuICogICAyIGJlY29tZXMgNCAoMTAwIGJpbmFyeSksIC0yIGJlY29tZXMgNSAoMTAxIGJpbmFyeSlcbiAqL1xuZnVuY3Rpb24gdG9WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHJldHVybiBhVmFsdWUgPCAwXG4gICAgPyAoKC1hVmFsdWUpIDw8IDEpICsgMVxuICAgIDogKGFWYWx1ZSA8PCAxKSArIDA7XG59XG5cbi8qKlxuICogQ29udmVydHMgdG8gYSB0d28tY29tcGxlbWVudCB2YWx1ZSBmcm9tIGEgdmFsdWUgd2hlcmUgdGhlIHNpZ24gYml0IGlzXG4gKiBwbGFjZWQgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4gIEZvciBleGFtcGxlLCBhcyBkZWNpbWFsczpcbiAqICAgMiAoMTAgYmluYXJ5KSBiZWNvbWVzIDEsIDMgKDExIGJpbmFyeSkgYmVjb21lcyAtMVxuICogICA0ICgxMDAgYmluYXJ5KSBiZWNvbWVzIDIsIDUgKDEwMSBiaW5hcnkpIGJlY29tZXMgLTJcbiAqL1xuZnVuY3Rpb24gZnJvbVZMUVNpZ25lZChhVmFsdWUpIHtcbiAgdmFyIGlzTmVnYXRpdmUgPSAoYVZhbHVlICYgMSkgPT09IDE7XG4gIHZhciBzaGlmdGVkID0gYVZhbHVlID4+IDE7XG4gIHJldHVybiBpc05lZ2F0aXZlXG4gICAgPyAtc2hpZnRlZFxuICAgIDogc2hpZnRlZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBiYXNlIDY0IFZMUSBlbmNvZGVkIHZhbHVlLlxuICovXG5leHBvcnRzLmVuY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9lbmNvZGUoYVZhbHVlKSB7XG4gIHZhciBlbmNvZGVkID0gXCJcIjtcbiAgdmFyIGRpZ2l0O1xuXG4gIHZhciB2bHEgPSB0b1ZMUVNpZ25lZChhVmFsdWUpO1xuXG4gIGRvIHtcbiAgICBkaWdpdCA9IHZscSAmIFZMUV9CQVNFX01BU0s7XG4gICAgdmxxID4+Pj0gVkxRX0JBU0VfU0hJRlQ7XG4gICAgaWYgKHZscSA+IDApIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBzdGlsbCBtb3JlIGRpZ2l0cyBpbiB0aGlzIHZhbHVlLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGVcbiAgICAgIC8vIGNvbnRpbnVhdGlvbiBiaXQgaXMgbWFya2VkLlxuICAgICAgZGlnaXQgfD0gVkxRX0NPTlRJTlVBVElPTl9CSVQ7XG4gICAgfVxuICAgIGVuY29kZWQgKz0gYmFzZTY0LmVuY29kZShkaWdpdCk7XG4gIH0gd2hpbGUgKHZscSA+IDApO1xuXG4gIHJldHVybiBlbmNvZGVkO1xufTtcblxuLyoqXG4gKiBEZWNvZGVzIHRoZSBuZXh0IGJhc2UgNjQgVkxRIHZhbHVlIGZyb20gdGhlIGdpdmVuIHN0cmluZyBhbmQgcmV0dXJucyB0aGVcbiAqIHZhbHVlIGFuZCB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHZpYSB0aGUgb3V0IHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZGVjb2RlKGFTdHIsIGFJbmRleCwgYU91dFBhcmFtKSB7XG4gIHZhciBzdHJMZW4gPSBhU3RyLmxlbmd0aDtcbiAgdmFyIHJlc3VsdCA9IDA7XG4gIHZhciBzaGlmdCA9IDA7XG4gIHZhciBjb250aW51YXRpb24sIGRpZ2l0O1xuXG4gIGRvIHtcbiAgICBpZiAoYUluZGV4ID49IHN0ckxlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgbW9yZSBkaWdpdHMgaW4gYmFzZSA2NCBWTFEgdmFsdWUuXCIpO1xuICAgIH1cblxuICAgIGRpZ2l0ID0gYmFzZTY0LmRlY29kZShhU3RyLmNoYXJDb2RlQXQoYUluZGV4KyspKTtcbiAgICBpZiAoZGlnaXQgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJhc2U2NCBkaWdpdDogXCIgKyBhU3RyLmNoYXJBdChhSW5kZXggLSAxKSk7XG4gICAgfVxuXG4gICAgY29udGludWF0aW9uID0gISEoZGlnaXQgJiBWTFFfQ09OVElOVUFUSU9OX0JJVCk7XG4gICAgZGlnaXQgJj0gVkxRX0JBU0VfTUFTSztcbiAgICByZXN1bHQgPSByZXN1bHQgKyAoZGlnaXQgPDwgc2hpZnQpO1xuICAgIHNoaWZ0ICs9IFZMUV9CQVNFX1NISUZUO1xuICB9IHdoaWxlIChjb250aW51YXRpb24pO1xuXG4gIGFPdXRQYXJhbS52YWx1ZSA9IGZyb21WTFFTaWduZWQocmVzdWx0KTtcbiAgYU91dFBhcmFtLnJlc3QgPSBhSW5kZXg7XG59O1xuIiwgIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIHBhcmFtZXRlci9vcHRpb25zXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBhcmdzIFRoZSBvYmplY3Qgd2UgYXJlIGV4dHJhY3RpbmcgdmFsdWVzIGZyb21cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3ZSBhcmUgZ2V0dGluZy5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgQW4gb3B0aW9uYWwgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nXG4gKiBmcm9tIHRoZSBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcsIGFuXG4gKiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqL1xuZnVuY3Rpb24gZ2V0QXJnKGFBcmdzLCBhTmFtZSwgYURlZmF1bHRWYWx1ZSkge1xuICBpZiAoYU5hbWUgaW4gYUFyZ3MpIHtcbiAgICByZXR1cm4gYUFyZ3NbYU5hbWVdO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYURlZmF1bHRWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFOYW1lICsgJ1wiIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7XG4gIH1cbn1cbmV4cG9ydHMuZ2V0QXJnID0gZ2V0QXJnO1xuXG52YXIgdXJsUmVnZXhwID0gL14oPzooW1xcdytcXC0uXSspOik/XFwvXFwvKD86KFxcdys6XFx3KylAKT8oW1xcdy4tXSopKD86OihcXGQrKSk/KC4qKSQvO1xudmFyIGRhdGFVcmxSZWdleHAgPSAvXmRhdGE6LitcXCwuKyQvO1xuXG5mdW5jdGlvbiB1cmxQYXJzZShhVXJsKSB7XG4gIHZhciBtYXRjaCA9IGFVcmwubWF0Y2godXJsUmVnZXhwKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgc2NoZW1lOiBtYXRjaFsxXSxcbiAgICBhdXRoOiBtYXRjaFsyXSxcbiAgICBob3N0OiBtYXRjaFszXSxcbiAgICBwb3J0OiBtYXRjaFs0XSxcbiAgICBwYXRoOiBtYXRjaFs1XVxuICB9O1xufVxuZXhwb3J0cy51cmxQYXJzZSA9IHVybFBhcnNlO1xuXG5mdW5jdGlvbiB1cmxHZW5lcmF0ZShhUGFyc2VkVXJsKSB7XG4gIHZhciB1cmwgPSAnJztcbiAgaWYgKGFQYXJzZWRVcmwuc2NoZW1lKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuc2NoZW1lICsgJzonO1xuICB9XG4gIHVybCArPSAnLy8nO1xuICBpZiAoYVBhcnNlZFVybC5hdXRoKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuYXV0aCArICdAJztcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5ob3N0KSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuaG9zdDtcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5wb3J0KSB7XG4gICAgdXJsICs9IFwiOlwiICsgYVBhcnNlZFVybC5wb3J0XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucGF0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnBhdGg7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cbmV4cG9ydHMudXJsR2VuZXJhdGUgPSB1cmxHZW5lcmF0ZTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGF0aCwgb3IgdGhlIHBhdGggcG9ydGlvbiBvZiBhIFVSTDpcbiAqXG4gKiAtIFJlcGxhY2VzIGNvbnNlY3V0aXZlIHNsYXNoZXMgd2l0aCBvbmUgc2xhc2guXG4gKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJy4nIHBhcnRzLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICc8ZGlyPi8uLicgcGFydHMuXG4gKlxuICogQmFzZWQgb24gY29kZSBpbiB0aGUgTm9kZS5qcyAncGF0aCcgY29yZSBtb2R1bGUuXG4gKlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIHVybCB0byBub3JtYWxpemUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZShhUGF0aCkge1xuICB2YXIgcGF0aCA9IGFQYXRoO1xuICB2YXIgdXJsID0gdXJsUGFyc2UoYVBhdGgpO1xuICBpZiAodXJsKSB7XG4gICAgaWYgKCF1cmwucGF0aCkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cbiAgICBwYXRoID0gdXJsLnBhdGg7XG4gIH1cbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCk7XG5cbiAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgvXFwvKy8pO1xuICBmb3IgKHZhciBwYXJ0LCB1cCA9IDAsIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAocGFydCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXAgPiAwKSB7XG4gICAgICBpZiAocGFydCA9PT0gJycpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHBhcnQgaXMgYmxhbmsgaWYgdGhlIHBhdGggaXMgYWJzb2x1dGUuIFRyeWluZyB0byBnb1xuICAgICAgICAvLyBhYm92ZSB0aGUgcm9vdCBpcyBhIG5vLW9wLiBUaGVyZWZvcmUgd2UgY2FuIHJlbW92ZSBhbGwgJy4uJyBwYXJ0c1xuICAgICAgICAvLyBkaXJlY3RseSBhZnRlciB0aGUgcm9vdC5cbiAgICAgICAgcGFydHMuc3BsaWNlKGkgKyAxLCB1cCk7XG4gICAgICAgIHVwID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnNwbGljZShpLCAyKTtcbiAgICAgICAgdXAtLTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKTtcblxuICBpZiAocGF0aCA9PT0gJycpIHtcbiAgICBwYXRoID0gaXNBYnNvbHV0ZSA/ICcvJyA6ICcuJztcbiAgfVxuXG4gIGlmICh1cmwpIHtcbiAgICB1cmwucGF0aCA9IHBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKHVybCk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5leHBvcnRzLm5vcm1hbGl6ZSA9IG5vcm1hbGl6ZTtcblxuLyoqXG4gKiBKb2lucyB0d28gcGF0aHMvVVJMcy5cbiAqXG4gKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIGpvaW5lZCB3aXRoIHRoZSByb290LlxuICpcbiAqIC0gSWYgYVBhdGggaXMgYSBVUkwgb3IgYSBkYXRhIFVSSSwgYVBhdGggaXMgcmV0dXJuZWQsIHVubGVzcyBhUGF0aCBpcyBhXG4gKiAgIHNjaGVtZS1yZWxhdGl2ZSBVUkw6IFRoZW4gdGhlIHNjaGVtZSBvZiBhUm9vdCwgaWYgYW55LCBpcyBwcmVwZW5kZWRcbiAqICAgZmlyc3QuXG4gKiAtIE90aGVyd2lzZSBhUGF0aCBpcyBhIHBhdGguIElmIGFSb290IGlzIGEgVVJMLCB0aGVuIGl0cyBwYXRoIHBvcnRpb25cbiAqICAgaXMgdXBkYXRlZCB3aXRoIHRoZSByZXN1bHQgYW5kIGFSb290IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIHJlc3VsdFxuICogICBpcyByZXR1cm5lZC5cbiAqICAgLSBJZiBhUGF0aCBpcyBhYnNvbHV0ZSwgdGhlIHJlc3VsdCBpcyBhUGF0aC5cbiAqICAgLSBPdGhlcndpc2UgdGhlIHR3byBwYXRocyBhcmUgam9pbmVkIHdpdGggYSBzbGFzaC5cbiAqIC0gSm9pbmluZyBmb3IgZXhhbXBsZSAnaHR0cDovLycgYW5kICd3d3cuZXhhbXBsZS5jb20nIGlzIGFsc28gc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBqb2luKGFSb290LCBhUGF0aCkge1xuICBpZiAoYVJvb3QgPT09IFwiXCIpIHtcbiAgICBhUm9vdCA9IFwiLlwiO1xuICB9XG4gIGlmIChhUGF0aCA9PT0gXCJcIikge1xuICAgIGFQYXRoID0gXCIuXCI7XG4gIH1cbiAgdmFyIGFQYXRoVXJsID0gdXJsUGFyc2UoYVBhdGgpO1xuICB2YXIgYVJvb3RVcmwgPSB1cmxQYXJzZShhUm9vdCk7XG4gIGlmIChhUm9vdFVybCkge1xuICAgIGFSb290ID0gYVJvb3RVcmwucGF0aCB8fCAnLyc7XG4gIH1cblxuICAvLyBgam9pbihmb28sICcvL3d3dy5leGFtcGxlLm9yZycpYFxuICBpZiAoYVBhdGhVcmwgJiYgIWFQYXRoVXJsLnNjaGVtZSkge1xuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVBhdGhVcmwuc2NoZW1lID0gYVJvb3RVcmwuc2NoZW1lO1xuICAgIH1cbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVBhdGhVcmwpO1xuICB9XG5cbiAgaWYgKGFQYXRoVXJsIHx8IGFQYXRoLm1hdGNoKGRhdGFVcmxSZWdleHApKSB7XG4gICAgcmV0dXJuIGFQYXRoO1xuICB9XG5cbiAgLy8gYGpvaW4oJ2h0dHA6Ly8nLCAnd3d3LmV4YW1wbGUuY29tJylgXG4gIGlmIChhUm9vdFVybCAmJiAhYVJvb3RVcmwuaG9zdCAmJiAhYVJvb3RVcmwucGF0aCkge1xuICAgIGFSb290VXJsLmhvc3QgPSBhUGF0aDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICB9XG5cbiAgdmFyIGpvaW5lZCA9IGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgPyBhUGF0aFxuICAgIDogbm9ybWFsaXplKGFSb290LnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgYVBhdGgpO1xuXG4gIGlmIChhUm9vdFVybCkge1xuICAgIGFSb290VXJsLnBhdGggPSBqb2luZWQ7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuICByZXR1cm4gam9pbmVkO1xufVxuZXhwb3J0cy5qb2luID0gam9pbjtcblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24gKGFQYXRoKSB7XG4gIHJldHVybiBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJyB8fCB1cmxSZWdleHAudGVzdChhUGF0aCk7XG59O1xuXG4vKipcbiAqIE1ha2UgYSBwYXRoIHJlbGF0aXZlIHRvIGEgVVJMIG9yIGFub3RoZXIgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIG1hZGUgcmVsYXRpdmUgdG8gYVJvb3QuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aXZlKGFSb290LCBhUGF0aCkge1xuICBpZiAoYVJvb3QgPT09IFwiXCIpIHtcbiAgICBhUm9vdCA9IFwiLlwiO1xuICB9XG5cbiAgYVJvb3QgPSBhUm9vdC5yZXBsYWNlKC9cXC8kLywgJycpO1xuXG4gIC8vIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcGF0aCB0byBiZSBhYm92ZSB0aGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBzaW1wbHlcbiAgLy8gY2hlY2tpbmcgd2hldGhlciB0aGUgcm9vdCBpcyBhIHByZWZpeCBvZiB0aGUgcGF0aCB3b24ndCB3b3JrLiBJbnN0ZWFkLCB3ZVxuICAvLyBuZWVkIHRvIHJlbW92ZSBjb21wb25lbnRzIGZyb20gdGhlIHJvb3Qgb25lIGJ5IG9uZSwgdW50aWwgZWl0aGVyIHdlIGZpbmRcbiAgLy8gYSBwcmVmaXggdGhhdCBmaXRzLCBvciB3ZSBydW4gb3V0IG9mIGNvbXBvbmVudHMgdG8gcmVtb3ZlLlxuICB2YXIgbGV2ZWwgPSAwO1xuICB3aGlsZSAoYVBhdGguaW5kZXhPZihhUm9vdCArICcvJykgIT09IDApIHtcbiAgICB2YXIgaW5kZXggPSBhUm9vdC5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBvbmx5IHBhcnQgb2YgdGhlIHJvb3QgdGhhdCBpcyBsZWZ0IGlzIHRoZSBzY2hlbWUgKGkuZS4gaHR0cDovLyxcbiAgICAvLyBmaWxlOi8vLywgZXRjLiksIG9uZSBvciBtb3JlIHNsYXNoZXMgKC8pLCBvciBzaW1wbHkgbm90aGluZyBhdCBhbGwsIHdlXG4gICAgLy8gaGF2ZSBleGhhdXN0ZWQgYWxsIGNvbXBvbmVudHMsIHNvIHRoZSBwYXRoIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcm9vdC5cbiAgICBhUm9vdCA9IGFSb290LnNsaWNlKDAsIGluZGV4KTtcbiAgICBpZiAoYVJvb3QubWF0Y2goL14oW15cXC9dKzpcXC8pP1xcLyokLykpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICArK2xldmVsO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGFkZCBhIFwiLi4vXCIgZm9yIGVhY2ggY29tcG9uZW50IHdlIHJlbW92ZWQgZnJvbSB0aGUgcm9vdC5cbiAgcmV0dXJuIEFycmF5KGxldmVsICsgMSkuam9pbihcIi4uL1wiKSArIGFQYXRoLnN1YnN0cihhUm9vdC5sZW5ndGggKyAxKTtcbn1cbmV4cG9ydHMucmVsYXRpdmUgPSByZWxhdGl2ZTtcblxudmFyIHN1cHBvcnRzTnVsbFByb3RvID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAhKCdfX3Byb3RvX18nIGluIG9iaik7XG59KCkpO1xuXG5mdW5jdGlvbiBpZGVudGl0eSAocykge1xuICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBCZWNhdXNlIGJlaGF2aW9yIGdvZXMgd2Fja3kgd2hlbiB5b3Ugc2V0IGBfX3Byb3RvX19gIG9uIG9iamVjdHMsIHdlXG4gKiBoYXZlIHRvIHByZWZpeCBhbGwgdGhlIHN0cmluZ3MgaW4gb3VyIHNldCB3aXRoIGFuIGFyYml0cmFyeSBjaGFyYWN0ZXIuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvcHVsbC8zMSBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvaXNzdWVzLzMwXG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbmZ1bmN0aW9uIHRvU2V0U3RyaW5nKGFTdHIpIHtcbiAgaWYgKGlzUHJvdG9TdHJpbmcoYVN0cikpIHtcbiAgICByZXR1cm4gJyQnICsgYVN0cjtcbiAgfVxuXG4gIHJldHVybiBhU3RyO1xufVxuZXhwb3J0cy50b1NldFN0cmluZyA9IHN1cHBvcnRzTnVsbFByb3RvID8gaWRlbnRpdHkgOiB0b1NldFN0cmluZztcblxuZnVuY3Rpb24gZnJvbVNldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuIGFTdHIuc2xpY2UoMSk7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMuZnJvbVNldFN0cmluZyA9IHN1cHBvcnRzTnVsbFByb3RvID8gaWRlbnRpdHkgOiBmcm9tU2V0U3RyaW5nO1xuXG5mdW5jdGlvbiBpc1Byb3RvU3RyaW5nKHMpIHtcbiAgaWYgKCFzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGxlbmd0aCA9IHMubGVuZ3RoO1xuXG4gIGlmIChsZW5ndGggPCA5IC8qIFwiX19wcm90b19fXCIubGVuZ3RoICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHMuY2hhckNvZGVBdChsZW5ndGggLSAxKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDIpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMykgIT09IDExMSAvKiAnbycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA0KSAhPT0gMTE2IC8qICd0JyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDUpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNikgIT09IDExNCAvKiAncicgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA3KSAhPT0gMTEyIC8qICdwJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDgpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gOSkgIT09IDk1ICAvKiAnXycgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gbGVuZ3RoIC0gMTA7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKHMuY2hhckNvZGVBdChpKSAhPT0gMzYgLyogJyQnICovKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aGVyZSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAqXG4gKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gKiBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIG9yaWdpbmFsIHNvdXJjZS9saW5lL2NvbHVtbiwgYnV0IGRpZmZlcmVudCBnZW5lcmF0ZWRcbiAqIGxpbmUgYW5kIGNvbHVtbiB0aGUgc2FtZS4gVXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBhIG1hcHBpbmcgd2l0aCBhXG4gKiBzdHViYmVkIG91dCBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyhtYXBwaW5nQSwgbWFwcGluZ0IsIG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgdmFyIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDAgfHwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMgPSBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucztcblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdpdGggZGVmbGF0ZWQgc291cmNlIGFuZCBuYW1lIGluZGljZXMgd2hlcmVcbiAqIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAqXG4gKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gKiBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4sIGJ1dCBkaWZmZXJlbnRcbiAqIHNvdXJjZS9uYW1lL29yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiB0aGUgc2FtZS4gVXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBhXG4gKiBtYXBwaW5nIHdpdGggYSBzdHViYmVkIG91dCBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IsIG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gIHZhciBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDAgfHwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkO1xuXG5mdW5jdGlvbiBzdHJjbXAoYVN0cjEsIGFTdHIyKSB7XG4gIGlmIChhU3RyMSA9PT0gYVN0cjIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhU3RyMSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAxOyAvLyBhU3RyMiAhPT0gbnVsbFxuICB9XG5cbiAgaWYgKGFTdHIyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIC0xOyAvLyBhU3RyMSAhPT0gbnVsbFxuICB9XG5cbiAgaWYgKGFTdHIxID4gYVN0cjIpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdpdGggaW5mbGF0ZWQgc291cmNlIGFuZCBuYW1lIHN0cmluZ3Mgd2hlcmVcbiAqIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIHZhciBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkO1xuXG4vKipcbiAqIFN0cmlwIGFueSBKU09OIFhTU0kgYXZvaWRhbmNlIHByZWZpeCBmcm9tIHRoZSBzdHJpbmcgKGFzIGRvY3VtZW50ZWRcbiAqIGluIHRoZSBzb3VyY2UgbWFwcyBzcGVjaWZpY2F0aW9uKSwgYW5kIHRoZW4gcGFyc2UgdGhlIHN0cmluZyBhc1xuICogSlNPTi5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTb3VyY2VNYXBJbnB1dChzdHIpIHtcbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyLnJlcGxhY2UoL15cXCldfSdbXlxcbl0qXFxuLywgJycpKTtcbn1cbmV4cG9ydHMucGFyc2VTb3VyY2VNYXBJbnB1dCA9IHBhcnNlU291cmNlTWFwSW5wdXQ7XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgVVJMIG9mIGEgc291cmNlIGdpdmVuIHRoZSB0aGUgc291cmNlIHJvb3QsIHRoZSBzb3VyY2Unc1xuICogVVJMLCBhbmQgdGhlIHNvdXJjZSBtYXAncyBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpIHtcbiAgc291cmNlVVJMID0gc291cmNlVVJMIHx8ICcnO1xuXG4gIGlmIChzb3VyY2VSb290KSB7XG4gICAgLy8gVGhpcyBmb2xsb3dzIHdoYXQgQ2hyb21lIGRvZXMuXG4gICAgaWYgKHNvdXJjZVJvb3Rbc291cmNlUm9vdC5sZW5ndGggLSAxXSAhPT0gJy8nICYmIHNvdXJjZVVSTFswXSAhPT0gJy8nKSB7XG4gICAgICBzb3VyY2VSb290ICs9ICcvJztcbiAgICB9XG4gICAgLy8gVGhlIHNwZWMgc2F5czpcbiAgICAvLyAgIExpbmUgNDogQW4gb3B0aW9uYWwgc291cmNlIHJvb3QsIHVzZWZ1bCBmb3IgcmVsb2NhdGluZyBzb3VyY2VcbiAgICAvLyAgIGZpbGVzIG9uIGEgc2VydmVyIG9yIHJlbW92aW5nIHJlcGVhdGVkIHZhbHVlcyBpbiB0aGVcbiAgICAvLyAgIFx1MjAxQ3NvdXJjZXNcdTIwMUQgZW50cnkuICBUaGlzIHZhbHVlIGlzIHByZXBlbmRlZCB0byB0aGUgaW5kaXZpZHVhbFxuICAgIC8vICAgZW50cmllcyBpbiB0aGUgXHUyMDFDc291cmNlXHUyMDFEIGZpZWxkLlxuICAgIHNvdXJjZVVSTCA9IHNvdXJjZVJvb3QgKyBzb3VyY2VVUkw7XG4gIH1cblxuICAvLyBIaXN0b3JpY2FsbHksIFNvdXJjZU1hcENvbnN1bWVyIGRpZCBub3QgdGFrZSB0aGUgc291cmNlTWFwVVJMIGFzXG4gIC8vIGEgcGFyYW1ldGVyLiAgVGhpcyBtb2RlIGlzIHN0aWxsIHNvbWV3aGF0IHN1cHBvcnRlZCwgd2hpY2ggaXMgd2h5XG4gIC8vIHRoaXMgY29kZSBibG9jayBpcyBjb25kaXRpb25hbC4gIEhvd2V2ZXIsIGl0J3MgcHJlZmVyYWJsZSB0byBwYXNzXG4gIC8vIHRoZSBzb3VyY2UgbWFwIFVSTCB0byBTb3VyY2VNYXBDb25zdW1lciwgc28gdGhhdCB0aGlzIGZ1bmN0aW9uXG4gIC8vIGNhbiBpbXBsZW1lbnQgdGhlIHNvdXJjZSBVUkwgcmVzb2x1dGlvbiBhbGdvcml0aG0gYXMgb3V0bGluZWQgaW5cbiAgLy8gdGhlIHNwZWMuICBUaGlzIGJsb2NrIGlzIGJhc2ljYWxseSB0aGUgZXF1aXZhbGVudCBvZjpcbiAgLy8gICAgbmV3IFVSTChzb3VyY2VVUkwsIHNvdXJjZU1hcFVSTCkudG9TdHJpbmcoKVxuICAvLyAuLi4gZXhjZXB0IGl0IGF2b2lkcyB1c2luZyBVUkwsIHdoaWNoIHdhc24ndCBhdmFpbGFibGUgaW4gdGhlXG4gIC8vIG9sZGVyIHJlbGVhc2VzIG9mIG5vZGUgc3RpbGwgc3VwcG9ydGVkIGJ5IHRoaXMgbGlicmFyeS5cbiAgLy9cbiAgLy8gVGhlIHNwZWMgc2F5czpcbiAgLy8gICBJZiB0aGUgc291cmNlcyBhcmUgbm90IGFic29sdXRlIFVSTHMgYWZ0ZXIgcHJlcGVuZGluZyBvZiB0aGVcbiAgLy8gICBcdTIwMUNzb3VyY2VSb290XHUyMDFELCB0aGUgc291cmNlcyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlXG4gIC8vICAgU291cmNlTWFwIChsaWtlIHJlc29sdmluZyBzY3JpcHQgc3JjIGluIGEgaHRtbCBkb2N1bWVudCkuXG4gIGlmIChzb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgcGFyc2VkID0gdXJsUGFyc2Uoc291cmNlTWFwVVJMKTtcbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic291cmNlTWFwVVJMIGNvdWxkIG5vdCBiZSBwYXJzZWRcIik7XG4gICAgfVxuICAgIGlmIChwYXJzZWQucGF0aCkge1xuICAgICAgLy8gU3RyaXAgdGhlIGxhc3QgcGF0aCBjb21wb25lbnQsIGJ1dCBrZWVwIHRoZSBcIi9cIi5cbiAgICAgIHZhciBpbmRleCA9IHBhcnNlZC5wYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICBwYXJzZWQucGF0aCA9IHBhcnNlZC5wYXRoLnN1YnN0cmluZygwLCBpbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VVUkwgPSBqb2luKHVybEdlbmVyYXRlKHBhcnNlZCksIHNvdXJjZVVSTCk7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplKHNvdXJjZVVSTCk7XG59XG5leHBvcnRzLmNvbXB1dGVTb3VyY2VVUkwgPSBjb21wdXRlU291cmNlVVJMO1xuIiwgIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGhhc05hdGl2ZU1hcCA9IHR5cGVvZiBNYXAgIT09IFwidW5kZWZpbmVkXCI7XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGFuIGFycmF5IGFuZCBhIHNldC4gQWRkaW5nIGEgbmV3XG4gKiBtZW1iZXIgaXMgTygxKSwgdGVzdGluZyBmb3IgbWVtYmVyc2hpcCBpcyBPKDEpLCBhbmQgZmluZGluZyB0aGUgaW5kZXggb2YgYW5cbiAqIGVsZW1lbnQgaXMgTygxKS4gUmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgc2V0IGlzIG5vdCBzdXBwb3J0ZWQuIE9ubHlcbiAqIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgbWVtYmVyc2hpcC5cbiAqL1xuZnVuY3Rpb24gQXJyYXlTZXQoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NldCA9IGhhc05hdGl2ZU1hcCA/IG5ldyBNYXAoKSA6IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbi8qKlxuICogU3RhdGljIG1ldGhvZCBmb3IgY3JlYXRpbmcgQXJyYXlTZXQgaW5zdGFuY2VzIGZyb20gYW4gZXhpc3RpbmcgYXJyYXkuXG4gKi9cbkFycmF5U2V0LmZyb21BcnJheSA9IGZ1bmN0aW9uIEFycmF5U2V0X2Zyb21BcnJheShhQXJyYXksIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgdmFyIHNldCA9IG5ldyBBcnJheVNldCgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYUFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc2V0LmFkZChhQXJyYXlbaV0sIGFBbGxvd0R1cGxpY2F0ZXMpO1xuICB9XG4gIHJldHVybiBzZXQ7XG59O1xuXG4vKipcbiAqIFJldHVybiBob3cgbWFueSB1bmlxdWUgaXRlbXMgYXJlIGluIHRoaXMgQXJyYXlTZXQuIElmIGR1cGxpY2F0ZXMgaGF2ZSBiZWVuXG4gKiBhZGRlZCwgdGhhbiB0aG9zZSBkbyBub3QgY291bnQgdG93YXJkcyB0aGUgc2l6ZS5cbiAqXG4gKiBAcmV0dXJucyBOdW1iZXJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiBBcnJheVNldF9zaXplKCkge1xuICByZXR1cm4gaGFzTmF0aXZlTWFwID8gdGhpcy5fc2V0LnNpemUgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9zZXQpLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQWRkIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBzZXQuXG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBBcnJheVNldF9hZGQoYVN0ciwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc1N0ciA9IGhhc05hdGl2ZU1hcCA/IGFTdHIgOiB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICB2YXIgaXNEdXBsaWNhdGUgPSBoYXNOYXRpdmVNYXAgPyB0aGlzLmhhcyhhU3RyKSA6IGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cik7XG4gIHZhciBpZHggPSB0aGlzLl9hcnJheS5sZW5ndGg7XG4gIGlmICghaXNEdXBsaWNhdGUgfHwgYUFsbG93RHVwbGljYXRlcykge1xuICAgIHRoaXMuX2FycmF5LnB1c2goYVN0cik7XG4gIH1cbiAgaWYgKCFpc0R1cGxpY2F0ZSkge1xuICAgIGlmIChoYXNOYXRpdmVNYXApIHtcbiAgICAgIHRoaXMuX3NldC5zZXQoYVN0ciwgaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2V0W3NTdHJdID0gaWR4O1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBJcyB0aGUgZ2l2ZW4gc3RyaW5nIGEgbWVtYmVyIG9mIHRoaXMgc2V0P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gQXJyYXlTZXRfaGFzKGFTdHIpIHtcbiAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKGFTdHIpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICByZXR1cm4gaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGluIHRoZSBhcnJheT9cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBBcnJheVNldF9pbmRleE9mKGFTdHIpIHtcbiAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgIHZhciBpZHggPSB0aGlzLl9zZXQuZ2V0KGFTdHIpO1xuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgc1N0ciA9IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gICAgaWYgKGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXRbc1N0cl07XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU3RyICsgJ1wiIGlzIG5vdCBpbiB0aGUgc2V0LicpO1xufTtcblxuLyoqXG4gKiBXaGF0IGlzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleD9cbiAqXG4gKiBAcGFyYW0gTnVtYmVyIGFJZHhcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gQXJyYXlTZXRfYXQoYUlkeCkge1xuICBpZiAoYUlkeCA+PSAwICYmIGFJZHggPCB0aGlzLl9hcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXlbYUlkeF07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IGluZGV4ZWQgYnkgJyArIGFJZHgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNldCAod2hpY2ggaGFzIHRoZSBwcm9wZXIgaW5kaWNlc1xuICogaW5kaWNhdGVkIGJ5IGluZGV4T2YpLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGFycmF5IHVzZWRcbiAqIGZvciBzdG9yaW5nIHRoZSBtZW1iZXJzIHNvIHRoYXQgbm8gb25lIGNhbiBtZXNzIHdpdGggaW50ZXJuYWwgc3RhdGUuXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfdG9BcnJheSgpIHtcbiAgcmV0dXJuIHRoaXMuX2FycmF5LnNsaWNlKCk7XG59O1xuXG5leHBvcnRzLkFycmF5U2V0ID0gQXJyYXlTZXQ7XG4iLCAiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIG1hcHBpbmdCIGlzIGFmdGVyIG1hcHBpbmdBIHdpdGggcmVzcGVjdCB0byBnZW5lcmF0ZWRcbiAqIHBvc2l0aW9uLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICAvLyBPcHRpbWl6ZWQgZm9yIG1vc3QgY29tbW9uIGNhc2VcbiAgdmFyIGxpbmVBID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZTtcbiAgdmFyIGxpbmVCID0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgdmFyIGNvbHVtbkEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW47XG4gIHZhciBjb2x1bW5CID0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICByZXR1cm4gbGluZUIgPiBsaW5lQSB8fCBsaW5lQiA9PSBsaW5lQSAmJiBjb2x1bW5CID49IGNvbHVtbkEgfHxcbiAgICAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSA8PSAwO1xufVxuXG4vKipcbiAqIEEgZGF0YSBzdHJ1Y3R1cmUgdG8gcHJvdmlkZSBhIHNvcnRlZCB2aWV3IG9mIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIGFcbiAqIHBlcmZvcm1hbmNlIGNvbnNjaW91cyBtYW5uZXIuIEl0IHRyYWRlcyBhIG5lZ2xpYmFibGUgb3ZlcmhlYWQgaW4gZ2VuZXJhbFxuICogY2FzZSBmb3IgYSBsYXJnZSBzcGVlZHVwIGluIGNhc2Ugb2YgbWFwcGluZ3MgYmVpbmcgYWRkZWQgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmdMaXN0KCkge1xuICB0aGlzLl9hcnJheSA9IFtdO1xuICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICAvLyBTZXJ2ZXMgYXMgaW5maW11bVxuICB0aGlzLl9sYXN0ID0ge2dlbmVyYXRlZExpbmU6IC0xLCBnZW5lcmF0ZWRDb2x1bW46IDB9O1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgdGhyb3VnaCBpbnRlcm5hbCBpdGVtcy4gVGhpcyBtZXRob2QgdGFrZXMgdGhlIHNhbWUgYXJndW1lbnRzIHRoYXRcbiAqIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgdGFrZXMuXG4gKlxuICogTk9URTogVGhlIG9yZGVyIG9mIHRoZSBtYXBwaW5ncyBpcyBOT1QgZ3VhcmFudGVlZC5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnVuc29ydGVkRm9yRWFjaCA9XG4gIGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2ZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZykge1xuICAgIHRoaXMuX2FycmF5LmZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZyk7XG4gIH07XG5cbi8qKlxuICogQWRkIHRoZSBnaXZlbiBzb3VyY2UgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0gT2JqZWN0IGFNYXBwaW5nXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF9hZGQoYU1hcHBpbmcpIHtcbiAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIodGhpcy5fbGFzdCwgYU1hcHBpbmcpKSB7XG4gICAgdGhpcy5fbGFzdCA9IGFNYXBwaW5nO1xuICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX3NvcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZsYXQsIHNvcnRlZCBhcnJheSBvZiBtYXBwaW5ncy4gVGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQgYnlcbiAqIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCByZXR1cm5zIGludGVybmFsIGRhdGEgd2l0aG91dCBjb3B5aW5nLCBmb3JcbiAqIHBlcmZvcm1hbmNlLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgTk9UIGJlIG11dGF0ZWQsIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBhc1xuICogYW4gaW1tdXRhYmxlIGJvcnJvdy4gSWYgeW91IHdhbnQgdG8gdGFrZSBvd25lcnNoaXAsIHlvdSBtdXN0IG1ha2UgeW91ciBvd25cbiAqIGNvcHkuXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfdG9BcnJheSgpIHtcbiAgaWYgKCF0aGlzLl9zb3J0ZWQpIHtcbiAgICB0aGlzLl9hcnJheS5zb3J0KHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQpO1xuICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FycmF5O1xufTtcblxuZXhwb3J0cy5NYXBwaW5nTGlzdCA9IE1hcHBpbmdMaXN0O1xuIiwgIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG4iLCAiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG5leHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcbmV4cG9ydHMuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoLlxuICpcbiAqIEBwYXJhbSBhTG93IEluZGljZXMgaGVyZSBhbmQgbG93ZXIgZG8gbm90IGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAqIEBwYXJhbSBhSGlnaCBJbmRpY2VzIGhlcmUgYW5kIGhpZ2hlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgYmVpbmcgc2VhcmNoZWQgZm9yLlxuICogQHBhcmFtIGFIYXlzdGFjayBUaGUgbm9uLWVtcHR5IGFycmF5IGJlaW5nIHNlYXJjaGVkLlxuICogQHBhcmFtIGFDb21wYXJlIEZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBlbGVtZW50cyBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gcmVjdXJzaXZlU2VhcmNoKGFMb3csIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcykge1xuICAvLyBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAvL1xuICAvLyAgIDEuIFdlIGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAvL1xuICAvLyAgIDIuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYnV0IHdlIGNhbiByZXR1cm4gdGhlIGluZGV4IG9mXG4gIC8vICAgICAgdGhlIG5leHQtY2xvc2VzdCBlbGVtZW50LlxuICAvL1xuICAvLyAgIDMuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYW5kIHRoZXJlIGlzIG5vIG5leHQtY2xvc2VzdFxuICAvLyAgICAgIGVsZW1lbnQgdGhhbiB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCBzbyB3ZSByZXR1cm4gLTEuXG4gIHZhciBtaWQgPSBNYXRoLmZsb29yKChhSGlnaCAtIGFMb3cpIC8gMikgKyBhTG93O1xuICB2YXIgY21wID0gYUNvbXBhcmUoYU5lZWRsZSwgYUhheXN0YWNrW21pZF0sIHRydWUpO1xuICBpZiAoY21wID09PSAwKSB7XG4gICAgLy8gRm91bmQgdGhlIGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgIHJldHVybiBtaWQ7XG4gIH1cbiAgZWxzZSBpZiAoY21wID4gMCkge1xuICAgIC8vIE91ciBuZWVkbGUgaXMgZ3JlYXRlciB0aGFuIGFIYXlzdGFja1ttaWRdLlxuICAgIGlmIChhSGlnaCAtIG1pZCA+IDEpIHtcbiAgICAgIC8vIFRoZSBlbGVtZW50IGlzIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaChtaWQsIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGV4YWN0IG5lZWRsZSBlbGVtZW50IHdhcyBub3QgZm91bmQgaW4gdGhpcyBoYXlzdGFjay4gRGV0ZXJtaW5lIGlmXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIGFIaWdoIDwgYUhheXN0YWNrLmxlbmd0aCA/IGFIaWdoIDogLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIE91ciBuZWVkbGUgaXMgbGVzcyB0aGFuIGFIYXlzdGFja1ttaWRdLlxuICAgIGlmIChtaWQgLSBhTG93ID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxvd2VyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKGFMb3csIG1pZCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpO1xuICAgIH1cblxuICAgIC8vIHdlIGFyZSBpbiB0ZXJtaW5hdGlvbiBjYXNlICgzKSBvciAoMikgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcuXG4gICAgaWYgKGFCaWFzID09IGV4cG9ydHMuTEVBU1RfVVBQRVJfQk9VTkQpIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhTG93IDwgMCA/IC0xIDogYUxvdztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2ggd2hpY2ggd2lsbCBhbHdheXMgdHJ5IGFuZCByZXR1cm5cbiAqIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBlbGVtZW50IGlmIHRoZXJlIGlzIG5vIGV4YWN0IGhpdC4gVGhpcyBpcyBiZWNhdXNlXG4gKiBtYXBwaW5ncyBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBnZW5lcmF0ZWQgbGluZS9jb2wgcGFpcnMgYXJlIHNpbmdsZSBwb2ludHMsXG4gKiBhbmQgdGhlcmUgaXMgYW4gaW1wbGljaXQgcmVnaW9uIGJldHdlZW4gZWFjaCBvZiB0aGVtLCBzbyBhIG1pc3MganVzdCBtZWFuc1xuICogdGhhdCB5b3UgYXJlbid0IG9uIHRoZSB2ZXJ5IHN0YXJ0IG9mIGEgcmVnaW9uLlxuICpcbiAqIEBwYXJhbSBhTmVlZGxlIFRoZSBlbGVtZW50IHlvdSBhcmUgbG9va2luZyBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBhcnJheSB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkLlxuICogQHBhcmFtIGFDb21wYXJlIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdGhlIG5lZWRsZSBhbmQgYW4gZWxlbWVudCBpbiB0aGVcbiAqICAgICBhcnJheSBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmVlZGxlIGlzIGxlc3NcbiAqICAgICB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBlbGVtZW50LCByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0gYUJpYXMgRWl0aGVyICdiaW5hcnlTZWFyY2guR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ2JpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKi9cbmV4cG9ydHMuc2VhcmNoID0gZnVuY3Rpb24gc2VhcmNoKGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIGlmIChhSGF5c3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gcmVjdXJzaXZlU2VhcmNoKC0xLCBhSGF5c3RhY2subGVuZ3RoLCBhTmVlZGxlLCBhSGF5c3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ29tcGFyZSwgYUJpYXMgfHwgZXhwb3J0cy5HUkVBVEVTVF9MT1dFUl9CT1VORCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBXZSBoYXZlIGZvdW5kIGVpdGhlciB0aGUgZXhhY3QgZWxlbWVudCwgb3IgdGhlIG5leHQtY2xvc2VzdCBlbGVtZW50IHRoYW5cbiAgLy8gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gSG93ZXZlciwgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgc3VjaFxuICAvLyBlbGVtZW50LiBNYWtlIHN1cmUgd2UgYWx3YXlzIHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlc2UuXG4gIHdoaWxlIChpbmRleCAtIDEgPj0gMCkge1xuICAgIGlmIChhQ29tcGFyZShhSGF5c3RhY2tbaW5kZXhdLCBhSGF5c3RhY2tbaW5kZXggLSAxXSwgdHJ1ZSkgIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAtLWluZGV4O1xuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufTtcbiIsICIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbi8vIEl0IHR1cm5zIG91dCB0aGF0IHNvbWUgKG1vc3Q/KSBKYXZhU2NyaXB0IGVuZ2luZXMgZG9uJ3Qgc2VsZi1ob3N0XG4vLyBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgQysrIHdpbGwgbGlrZWx5IHJlbWFpblxuLy8gZmFzdGVyIHRoYW4gSlMgd2hlbiBkb2luZyByYXcgQ1BVLWludGVuc2l2ZSBzb3J0aW5nLiBIb3dldmVyLCB3aGVuIHVzaW5nIGFcbi8vIGN1c3RvbSBjb21wYXJhdG9yIGZ1bmN0aW9uLCBjYWxsaW5nIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIFZNJ3MgQysrIGFuZFxuLy8gSklUJ2QgSlMgaXMgcmF0aGVyIHNsb3cgKmFuZCogbG9zZXMgSklUIHR5cGUgaW5mb3JtYXRpb24sIHJlc3VsdGluZyBpblxuLy8gd29yc2UgZ2VuZXJhdGVkIGNvZGUgZm9yIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uIHRoYW4gd291bGQgYmUgb3B0aW1hbC4gSW5cbi8vIGZhY3QsIHdoZW4gc29ydGluZyB3aXRoIGEgY29tcGFyYXRvciwgdGhlc2UgY29zdHMgb3V0d2VpZ2ggdGhlIGJlbmVmaXRzIG9mXG4vLyBzb3J0aW5nIGluIEMrKy4gQnkgdXNpbmcgb3VyIG93biBKUy1pbXBsZW1lbnRlZCBRdWljayBTb3J0IChiZWxvdyksIHdlIGdldFxuLy8gYSB+MzUwMG1zIG1lYW4gc3BlZWQtdXAgaW4gYGJlbmNoL2JlbmNoLmh0bWxgLlxuXG4vKipcbiAqIFN3YXAgdGhlIGVsZW1lbnRzIGluZGV4ZWQgYnkgYHhgIGFuZCBgeWAgaW4gdGhlIGFycmF5IGBhcnlgLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIFRoZSBhcnJheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBpdGVtLlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIHNlY29uZCBpdGVtLlxuICovXG5mdW5jdGlvbiBzd2FwKGFyeSwgeCwgeSkge1xuICB2YXIgdGVtcCA9IGFyeVt4XTtcbiAgYXJ5W3hdID0gYXJ5W3ldO1xuICBhcnlbeV0gPSB0ZW1wO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSByYW5kb20gaW50ZWdlciB3aXRoaW4gdGhlIHJhbmdlIGBsb3cgLi4gaGlnaGAgaW5jbHVzaXZlLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBsb3dcbiAqICAgICAgICBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICogQHBhcmFtIHtOdW1iZXJ9IGhpZ2hcbiAqICAgICAgICBUaGUgdXBwZXIgYm91bmQgb24gdGhlIHJhbmdlLlxuICovXG5mdW5jdGlvbiByYW5kb21JbnRJblJhbmdlKGxvdywgaGlnaCkge1xuICByZXR1cm4gTWF0aC5yb3VuZChsb3cgKyAoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93KSkpO1xufVxuXG4vKipcbiAqIFRoZSBRdWljayBTb3J0IGFsZ29yaXRobS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwXG4gKiAgICAgICAgU3RhcnQgaW5kZXggb2YgdGhlIGFycmF5XG4gKiBAcGFyYW0ge051bWJlcn0gclxuICogICAgICAgIEVuZCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqL1xuZnVuY3Rpb24gZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCByKSB7XG4gIC8vIElmIG91ciBsb3dlciBib3VuZCBpcyBsZXNzIHRoYW4gb3VyIHVwcGVyIGJvdW5kLCB3ZSAoMSkgcGFydGl0aW9uIHRoZVxuICAvLyBhcnJheSBpbnRvIHR3byBwaWVjZXMgYW5kICgyKSByZWN1cnNlIG9uIGVhY2ggaGFsZi4gSWYgaXQgaXMgbm90LCB0aGlzIGlzXG4gIC8vIHRoZSBlbXB0eSBhcnJheSBhbmQgb3VyIGJhc2UgY2FzZS5cblxuICBpZiAocCA8IHIpIHtcbiAgICAvLyAoMSkgUGFydGl0aW9uaW5nLlxuICAgIC8vXG4gICAgLy8gVGhlIHBhcnRpdGlvbmluZyBjaG9vc2VzIGEgcGl2b3QgYmV0d2VlbiBgcGAgYW5kIGByYCBhbmQgbW92ZXMgYWxsXG4gICAgLy8gZWxlbWVudHMgdGhhdCBhcmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdCB0byB0aGUgYmVmb3JlIGl0LCBhbmRcbiAgICAvLyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBpdCBhZnRlciBpdC4gVGhlIGVmZmVjdCBpcyB0aGF0XG4gICAgLy8gb25jZSBwYXJ0aXRpb24gaXMgZG9uZSwgdGhlIHBpdm90IGlzIGluIHRoZSBleGFjdCBwbGFjZSBpdCB3aWxsIGJlIHdoZW5cbiAgICAvLyB0aGUgYXJyYXkgaXMgcHV0IGluIHNvcnRlZCBvcmRlciwgYW5kIGl0IHdpbGwgbm90IG5lZWQgdG8gYmUgbW92ZWRcbiAgICAvLyBhZ2Fpbi4gVGhpcyBydW5zIGluIE8obikgdGltZS5cblxuICAgIC8vIEFsd2F5cyBjaG9vc2UgYSByYW5kb20gcGl2b3Qgc28gdGhhdCBhbiBpbnB1dCBhcnJheSB3aGljaCBpcyByZXZlcnNlXG4gICAgLy8gc29ydGVkIGRvZXMgbm90IGNhdXNlIE8obl4yKSBydW5uaW5nIHRpbWUuXG4gICAgdmFyIHBpdm90SW5kZXggPSByYW5kb21JbnRJblJhbmdlKHAsIHIpO1xuICAgIHZhciBpID0gcCAtIDE7XG5cbiAgICBzd2FwKGFyeSwgcGl2b3RJbmRleCwgcik7XG4gICAgdmFyIHBpdm90ID0gYXJ5W3JdO1xuXG4gICAgLy8gSW1tZWRpYXRlbHkgYWZ0ZXIgYGpgIGlzIGluY3JlbWVudGVkIGluIHRoaXMgbG9vcCwgdGhlIGZvbGxvd2luZyBob2xkXG4gICAgLy8gdHJ1ZTpcbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbcCAuLiBpXWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBwaXZvdC5cbiAgICAvL1xuICAgIC8vICAgKiBFdmVyeSBlbGVtZW50IGluIGBhcnlbaSsxIC4uIGotMV1gIGlzIGdyZWF0ZXIgdGhhbiB0aGUgcGl2b3QuXG4gICAgZm9yICh2YXIgaiA9IHA7IGogPCByOyBqKyspIHtcbiAgICAgIGlmIChjb21wYXJhdG9yKGFyeVtqXSwgcGl2b3QpIDw9IDApIHtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBzd2FwKGFyeSwgaSwgaik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3dhcChhcnksIGkgKyAxLCBqKTtcbiAgICB2YXIgcSA9IGkgKyAxO1xuXG4gICAgLy8gKDIpIFJlY3Vyc2Ugb24gZWFjaCBoYWxmLlxuXG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBwLCBxIC0gMSk7XG4gICAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCBxICsgMSwgcik7XG4gIH1cbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBnaXZlbiBhcnJheSBpbi1wbGFjZSB3aXRoIHRoZSBnaXZlbiBjb21wYXJhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICovXG5leHBvcnRzLnF1aWNrU29ydCA9IGZ1bmN0aW9uIChhcnksIGNvbXBhcmF0b3IpIHtcbiAgZG9RdWlja1NvcnQoYXJ5LCBjb21wYXJhdG9yLCAwLCBhcnkubGVuZ3RoIC0gMSk7XG59O1xuIiwgIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBiaW5hcnlTZWFyY2ggPSByZXF1aXJlKCcuL2JpbmFyeS1zZWFyY2gnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgcXVpY2tTb3J0ID0gcmVxdWlyZSgnLi9xdWljay1zb3J0JykucXVpY2tTb3J0O1xuXG5mdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTClcbiAgICA6IG5ldyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7XG59XG5cblNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHJldHVybiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbi8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4vLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbi8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuLy9cbi8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4vL1xuLy8gICAgIHtcbi8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbi8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4vLyAgICAgICAgICAgICBjb2RlLlxuLy8gICAgIH1cbi8vXG4vLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4vLyBgbnVsbGAuXG4vL1xuLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbi8vXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncykge1xuICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzO1xuICB9XG59KTtcblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX29yaWdpbmFsTWFwcGluZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncykge1xuICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX29yaWdpbmFsTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGluZGV4KSB7XG4gICAgdmFyIGMgPSBhU3RyLmNoYXJBdChpbmRleCk7XG4gICAgcmV0dXJuIGMgPT09IFwiO1wiIHx8IGMgPT09IFwiLFwiO1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgX3BhcnNlTWFwcGluZ3NcIik7XG4gIH07XG5cblNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUiA9IDE7XG5Tb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUiA9IDI7XG5cblNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EID0gMjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZWFjaCBtYXBwaW5nIGJldHdlZW4gYW4gb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uIGFuZCBhXG4gKiBnZW5lcmF0ZWQgbGluZS9jb2x1bW4gaW4gdGhpcyBzb3VyY2UgbWFwLlxuICpcbiAqIEBwYXJhbSBGdW5jdGlvbiBhQ2FsbGJhY2tcbiAqICAgICAgICBUaGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2l0aCBlYWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0gT2JqZWN0IGFDb250ZXh0XG4gKiAgICAgICAgT3B0aW9uYWwuIElmIHNwZWNpZmllZCwgdGhpcyBvYmplY3Qgd2lsbCBiZSB0aGUgdmFsdWUgb2YgYHRoaXNgIGV2ZXJ5XG4gKiAgICAgICAgdGltZSB0aGF0IGBhQ2FsbGJhY2tgIGlzIGNhbGxlZC5cbiAqIEBwYXJhbSBhT3JkZXJcbiAqICAgICAgICBFaXRoZXIgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAgb3JcbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVJgLiBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0b1xuICogICAgICAgIGl0ZXJhdGUgb3ZlciB0aGUgbWFwcGluZ3Mgc29ydGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmlsZSdzIGxpbmUvY29sdW1uXG4gKiAgICAgICAgb3JkZXIgb3IgdGhlIG9yaWdpbmFsJ3Mgc291cmNlL2xpbmUvY29sdW1uIG9yZGVyLCByZXNwZWN0aXZlbHkuIERlZmF1bHRzIHRvXG4gKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5lYWNoTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2VhY2hNYXBwaW5nKGFDYWxsYmFjaywgYUNvbnRleHQsIGFPcmRlcikge1xuICAgIHZhciBjb250ZXh0ID0gYUNvbnRleHQgfHwgbnVsbDtcbiAgICB2YXIgb3JkZXIgPSBhT3JkZXIgfHwgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSO1xuXG4gICAgdmFyIG1hcHBpbmdzO1xuICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjpcbiAgICAgIG1hcHBpbmdzID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3JkZXIgb2YgaXRlcmF0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuc291cmNlUm9vdDtcbiAgICBtYXBwaW5ncy5tYXAoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgIHNvdXJjZSA9IHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLFxuICAgICAgICBvcmlnaW5hbExpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgbmFtZTogbWFwcGluZy5uYW1lID09PSBudWxsID8gbnVsbCA6IHRoaXMuX25hbWVzLmF0KG1hcHBpbmcubmFtZSlcbiAgICAgIH07XG4gICAgfSwgdGhpcykuZm9yRWFjaChhQ2FsbGJhY2ssIGNvbnRleHQpO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgYWxsIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHByb3ZpZGVkLiBJZiBubyBjb2x1bW4gaXMgcHJvdmlkZWQsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gKiBjb3JyZXNwb25kaW5nIHRvIGEgZWl0aGVyIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yIG9yIHRoZSBuZXh0XG4gKiBjbG9zZXN0IGxpbmUgdGhhdCBoYXMgYW55IG1hcHBpbmdzLiBPdGhlcndpc2UsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaW5lIGFuZCBlaXRoZXIgdGhlIGNvbHVtbiB3ZSBhcmUgc2VhcmNoaW5nIGZvclxuICogb3IgdGhlIG5leHQgY2xvc2VzdCBjb2x1bW4gdGhhdCBoYXMgYW55IG9mZnNldHMuXG4gKlxuICogVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcmV0dXJuZWQsIGVhY2ggd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmFsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2FsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvcihhQXJncykge1xuICAgIHZhciBsaW5lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyk7XG5cbiAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoLCBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmdcbiAgICAvLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBtYXBwaW5nIGxlc3MgdGhhbiB0aGUgbmVlZGxlLiBCeVxuICAgIC8vIHNldHRpbmcgbmVlZGxlLm9yaWdpbmFsQ29sdW1uIHRvIDAsIHdlIHRodXMgZmluZCB0aGUgbGFzdCBtYXBwaW5nIGZvclxuICAgIC8vIHRoZSBnaXZlbiBsaW5lLCBwcm92aWRlZCBzdWNoIGEgbWFwcGluZyBleGlzdHMuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSxcbiAgICAgIG9yaWdpbmFsTGluZTogbGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicsIDApXG4gICAgfTtcblxuICAgIG5lZWRsZS5zb3VyY2UgPSB0aGlzLl9maW5kU291cmNlSW5kZXgobmVlZGxlLnNvdXJjZSk7XG4gICAgaWYgKG5lZWRsZS5zb3VyY2UgPCAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIG1hcHBpbmdzID0gW107XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhuZWVkbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChhQXJncy5jb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgb3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSBmb3VuZC4gU2luY2VcbiAgICAgICAgLy8gbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBmb3VuZC5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IG9yaWdpbmFsTGluZSkge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSB3ZXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgIC8vIFNpbmNlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gbGluZSAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9PSBvcmlnaW5hbENvbHVtbikge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGluZ3M7XG4gIH07XG5cbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBBIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBhcnNlZCBzb3VyY2UgbWFwIHdoaWNoIHdlIGNhblxuICogcXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBmaWxlIHBvc2l0aW9ucyBieSBnaXZpbmcgaXQgYSBmaWxlXG4gKiBwb3NpdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqXG4gKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gKlxuICogICAgIHtcbiAqICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAqICAgICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0P3BsaT0xI1xuICovXG5mdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgaWYgKHNvdXJjZVJvb3QpIHtcbiAgICBzb3VyY2VSb290ID0gdXRpbC5ub3JtYWxpemUoc291cmNlUm9vdCk7XG4gIH1cblxuICBzb3VyY2VzID0gc291cmNlc1xuICAgIC5tYXAoU3RyaW5nKVxuICAgIC8vIFNvbWUgc291cmNlIG1hcHMgcHJvZHVjZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbGlrZSBcIi4vZm9vLmpzXCIgaW5zdGVhZCBvZlxuICAgIC8vIFwiZm9vLmpzXCIuICBOb3JtYWxpemUgdGhlc2UgZmlyc3Qgc28gdGhhdCBmdXR1cmUgY29tcGFyaXNvbnMgd2lsbCBzdWNjZWVkLlxuICAgIC8vIFNlZSBidWd6aWwubGEvMTA5MDc2OC5cbiAgICAubWFwKHV0aWwubm9ybWFsaXplKVxuICAgIC8vIEFsd2F5cyBlbnN1cmUgdGhhdCBhYnNvbHV0ZSBzb3VyY2VzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCByZWxhdGl2ZSB0b1xuICAgIC8vIHRoZSBzb3VyY2Ugcm9vdCwgaWYgdGhlIHNvdXJjZSByb290IGlzIGFic29sdXRlLiBOb3QgZG9pbmcgdGhpcyB3b3VsZFxuICAgIC8vIGJlIHBhcnRpY3VsYXJseSBwcm9ibGVtYXRpYyB3aGVuIHRoZSBzb3VyY2Ugcm9vdCBpcyBhIHByZWZpeCBvZiB0aGVcbiAgICAvLyBzb3VyY2UgKHZhbGlkLCBidXQgd2h5Pz8pLiBTZWUgZ2l0aHViIGlzc3VlICMxOTkgYW5kIGJ1Z3ppbC5sYS8xMTg4OTgyLlxuICAgIC5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZVJvb3QgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZVJvb3QpICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2UpXG4gICAgICAgID8gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2UpXG4gICAgICAgIDogc291cmNlO1xuICAgIH0pO1xuXG4gIC8vIFBhc3MgYHRydWVgIGJlbG93IHRvIGFsbG93IGR1cGxpY2F0ZSBuYW1lcyBhbmQgc291cmNlcy4gV2hpbGUgc291cmNlIG1hcHNcbiAgLy8gYXJlIGludGVuZGVkIHRvIGJlIGNvbXByZXNzZWQgYW5kIGRlZHVwbGljYXRlZCwgdGhlIFR5cGVTY3JpcHQgY29tcGlsZXJcbiAgLy8gc29tZXRpbWVzIGdlbmVyYXRlcyBzb3VyY2UgbWFwcyB3aXRoIGR1cGxpY2F0ZXMgaW4gdGhlbS4gU2VlIEdpdGh1YiBpc3N1ZVxuICAvLyAjNzIgYW5kIGJ1Z3ppbC5sYS84ODk0OTIuXG4gIHRoaXMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KG5hbWVzLm1hcChTdHJpbmcpLCB0cnVlKTtcbiAgdGhpcy5fc291cmNlcyA9IEFycmF5U2V0LmZyb21BcnJheShzb3VyY2VzLCB0cnVlKTtcblxuICB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMgPSB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHMsIGFTb3VyY2VNYXBVUkwpO1xuICB9KTtcblxuICB0aGlzLnNvdXJjZVJvb3QgPSBzb3VyY2VSb290O1xuICB0aGlzLnNvdXJjZXNDb250ZW50ID0gc291cmNlc0NvbnRlbnQ7XG4gIHRoaXMuX21hcHBpbmdzID0gbWFwcGluZ3M7XG4gIHRoaXMuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7XG4gIHRoaXMuZmlsZSA9IGZpbGU7XG59XG5cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGluZGV4IG9mIGEgc291cmNlLiAgUmV0dXJucyAtMSBpZiBub3RcbiAqIGZvdW5kLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZFNvdXJjZUluZGV4ID0gZnVuY3Rpb24oYVNvdXJjZSkge1xuICB2YXIgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlO1xuICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gIH1cblxuICBpZiAodGhpcy5fc291cmNlcy5oYXMocmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMuaW5kZXhPZihyZWxhdGl2ZVNvdXJjZSk7XG4gIH1cblxuICAvLyBNYXliZSBhU291cmNlIGlzIGFuIGFic29sdXRlIFVSTCBhcyByZXR1cm5lZCBieSB8c291cmNlc3wuICBJblxuICAvLyB0aGlzIGNhc2Ugd2UgY2FuJ3Qgc2ltcGx5IHVuZG8gdGhlIHRyYW5zZm9ybS5cbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodGhpcy5fYWJzb2x1dGVTb3VyY2VzW2ldID09IGFTb3VyY2UpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAqIEBwYXJhbSBTdHJpbmcgYVNvdXJjZU1hcFVSTFxuICogICAgICAgIFRoZSBVUkwgYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgY2FuIGJlIGZvdW5kIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEJhc2ljU291cmNlTWFwQ29uc3VtZXJcbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgIHZhciBzb3VyY2VzID0gc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcbiAgICBzbWMuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7XG4gICAgc21jLl9hYnNvbHV0ZVNvdXJjZXMgPSBzbWMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzbWMuc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBCZWNhdXNlIHdlIGFyZSBtb2RpZnlpbmcgdGhlIGVudHJpZXMgKGJ5IGNvbnZlcnRpbmcgc3RyaW5nIHNvdXJjZXMgYW5kXG4gICAgLy8gbmFtZXMgdG8gaW5kaWNlcyBpbnRvIHRoZSBzb3VyY2VzIGFuZCBuYW1lcyBBcnJheVNldHMpLCB3ZSBoYXZlIHRvIG1ha2VcbiAgICAvLyBhIGNvcHkgb2YgdGhlIGVudHJ5IG9yIGVsc2UgYmFkIHRoaW5ncyBoYXBwZW4uIFNoYXJlZCBtdXRhYmxlIHN0YXRlXG4gICAgLy8gc3RyaWtlcyBhZ2FpbiEgU2VlIGdpdGh1YiBpc3N1ZSAjMTkxLlxuXG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gYVNvdXJjZU1hcC5fbWFwcGluZ3MudG9BcnJheSgpLnNsaWNlKCk7XG4gICAgdmFyIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncyA9IHNtYy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIGRlc3RPcmlnaW5hbE1hcHBpbmdzID0gc21jLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3JjTWFwcGluZyA9IGdlbmVyYXRlZE1hcHBpbmdzW2ldO1xuICAgICAgdmFyIGRlc3RNYXBwaW5nID0gbmV3IE1hcHBpbmc7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRMaW5lO1xuICAgICAgZGVzdE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgIGlmIChzcmNNYXBwaW5nLnNvdXJjZSkge1xuICAgICAgICBkZXN0TWFwcGluZy5zb3VyY2UgPSBzb3VyY2VzLmluZGV4T2Yoc3JjTWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbExpbmUgPSBzcmNNYXBwaW5nLm9yaWdpbmFsTGluZTtcbiAgICAgICAgZGVzdE1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBzcmNNYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChzcmNNYXBwaW5nLm5hbWUpIHtcbiAgICAgICAgICBkZXN0TWFwcGluZy5uYW1lID0gbmFtZXMuaW5kZXhPZihzcmNNYXBwaW5nLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzdE9yaWdpbmFsTWFwcGluZ3MucHVzaChkZXN0TWFwcGluZyk7XG4gICAgICB9XG5cbiAgICAgIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICB9XG5cbiAgICBxdWlja1NvcnQoc21jLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICByZXR1cm4gc21jO1xuICB9O1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ3NvdXJjZXMnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMuc2xpY2UoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogUHJvdmlkZSB0aGUgSklUIHdpdGggYSBuaWNlIHNoYXBlIC8gaGlkZGVuIGNsYXNzLlxuICovXG5mdW5jdGlvbiBNYXBwaW5nKCkge1xuICB0aGlzLmdlbmVyYXRlZExpbmUgPSAwO1xuICB0aGlzLmdlbmVyYXRlZENvbHVtbiA9IDA7XG4gIHRoaXMuc291cmNlID0gbnVsbDtcbiAgdGhpcy5vcmlnaW5hbExpbmUgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsQ29sdW1uID0gbnVsbDtcbiAgdGhpcy5uYW1lID0gbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHZhciBnZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsTGluZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzTmFtZSA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGFTdHIubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNhY2hlZFNlZ21lbnRzID0ge307XG4gICAgdmFyIHRlbXAgPSB7fTtcbiAgICB2YXIgb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBnZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBtYXBwaW5nLCBzdHIsIHNlZ21lbnQsIGVuZCwgdmFsdWU7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhU3RyLmNoYXJBdChpbmRleCkgPT09ICc7Jykge1xuICAgICAgICBnZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJywnKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbWFwcGluZyA9IG5ldyBNYXBwaW5nKCk7XG4gICAgICAgIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9IGdlbmVyYXRlZExpbmU7XG5cbiAgICAgICAgLy8gQmVjYXVzZSBlYWNoIG9mZnNldCBpcyBlbmNvZGVkIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBvbmUsXG4gICAgICAgIC8vIG1hbnkgc2VnbWVudHMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBlbmNvZGluZy4gV2UgY2FuIGV4cGxvaXQgdGhpc1xuICAgICAgICAvLyBmYWN0IGJ5IGNhY2hpbmcgdGhlIHBhcnNlZCB2YXJpYWJsZSBsZW5ndGggZmllbGRzIG9mIGVhY2ggc2VnbWVudCxcbiAgICAgICAgLy8gYWxsb3dpbmcgdXMgdG8gYXZvaWQgYSBzZWNvbmQgcGFyc2UgaWYgd2UgZW5jb3VudGVyIHRoZSBzYW1lXG4gICAgICAgIC8vIHNlZ21lbnQgYWdhaW4uXG4gICAgICAgIGZvciAoZW5kID0gaW5kZXg7IGVuZCA8IGxlbmd0aDsgZW5kKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5fY2hhcklzTWFwcGluZ1NlcGFyYXRvcihhU3RyLCBlbmQpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gYVN0ci5zbGljZShpbmRleCwgZW5kKTtcblxuICAgICAgICBzZWdtZW50ID0gY2FjaGVkU2VnbWVudHNbc3RyXTtcbiAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICBpbmRleCArPSBzdHIubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlZ21lbnQgPSBbXTtcbiAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHtcbiAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoYVN0ciwgaW5kZXgsIHRlbXApO1xuICAgICAgICAgICAgdmFsdWUgPSB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgaW5kZXggPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICBzZWdtZW50LnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSwgYnV0IG5vIGxpbmUgYW5kIGNvbHVtbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSBhbmQgbGluZSwgYnV0IG5vIGNvbHVtbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhY2hlZFNlZ21lbnRzW3N0cl0gPSBzZWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGVkIGNvbHVtbi5cbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiArIHNlZ21lbnRbMF07XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIE9yaWdpbmFsIHNvdXJjZS5cbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHByZXZpb3VzU291cmNlICsgc2VnbWVudFsxXTtcbiAgICAgICAgICBwcmV2aW91c1NvdXJjZSArPSBzZWdtZW50WzFdO1xuXG4gICAgICAgICAgLy8gT3JpZ2luYWwgbGluZS5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IHByZXZpb3VzT3JpZ2luYWxMaW5lICsgc2VnbWVudFsyXTtcbiAgICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICAgIC8vIExpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZFxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lICs9IDE7XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBjb2x1bW4uXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gKyBzZWdtZW50WzNdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgLy8gT3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAgIG1hcHBpbmcubmFtZSA9IHByZXZpb3VzTmFtZSArIHNlZ21lbnRbNF07XG4gICAgICAgICAgICBwcmV2aW91c05hbWUgKz0gc2VnbWVudFs0XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICBpZiAodHlwZW9mIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIG9yaWdpbmFsTWFwcGluZ3MucHVzaChtYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydChnZW5lcmF0ZWRNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCk7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gZ2VuZXJhdGVkTWFwcGluZ3M7XG5cbiAgICBxdWlja1NvcnQob3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBvcmlnaW5hbE1hcHBpbmdzO1xuICB9O1xuXG4vKipcbiAqIEZpbmQgdGhlIG1hcHBpbmcgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIGh5cG90aGV0aWNhbCBcIm5lZWRsZVwiIG1hcHBpbmcgdGhhdFxuICogd2UgYXJlIHNlYXJjaGluZyBmb3IgaW4gdGhlIGdpdmVuIFwiaGF5c3RhY2tcIiBvZiBtYXBwaW5ncy5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZmluZE1hcHBpbmcoYU5lZWRsZSwgYU1hcHBpbmdzLCBhTGluZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb2x1bW5OYW1lLCBhQ29tcGFyYXRvciwgYUJpYXMpIHtcbiAgICAvLyBUbyByZXR1cm4gdGhlIHBvc2l0aW9uIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCB3ZSBtdXN0IGZpcnN0IGZpbmQgdGhlXG4gICAgLy8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aGVuIHJldHVybiB0aGUgb3Bwb3NpdGUgcG9zaXRpb24gaXRcbiAgICAvLyBwb2ludHMgdG8uIEJlY2F1c2UgdGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaCB0b1xuICAgIC8vIGZpbmQgdGhlIGJlc3QgbWFwcGluZy5cblxuICAgIGlmIChhTmVlZGxlW2FMaW5lTmFtZV0gPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUxpbmVOYW1lXSk7XG4gICAgfVxuICAgIGlmIChhTmVlZGxlW2FDb2x1bW5OYW1lXSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbHVtbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUNvbHVtbk5hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmluYXJ5U2VhcmNoLnNlYXJjaChhTmVlZGxlLCBhTWFwcGluZ3MsIGFDb21wYXJhdG9yLCBhQmlhcyk7XG4gIH07XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGFzdCBjb2x1bW4gZm9yIGVhY2ggZ2VuZXJhdGVkIG1hcHBpbmcuIFRoZSBsYXN0IGNvbHVtbiBpc1xuICogaW5jbHVzaXZlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb21wdXRlQ29sdW1uU3BhbnMgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jb21wdXRlQ29sdW1uU3BhbnMoKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIC8vIE1hcHBpbmdzIGRvIG5vdCBjb250YWluIGEgZmllbGQgZm9yIHRoZSBsYXN0IGdlbmVyYXRlZCBjb2x1bW50LiBXZVxuICAgICAgLy8gY2FuIGNvbWUgdXAgd2l0aCBhbiBvcHRpbWlzdGljIGVzdGltYXRlLCBob3dldmVyLCBieSBhc3N1bWluZyB0aGF0XG4gICAgICAvLyBtYXBwaW5ncyBhcmUgY29udGlndW91cyAoaS5lLiBnaXZlbiB0d28gY29uc2VjdXRpdmUgbWFwcGluZ3MsIHRoZVxuICAgICAgLy8gZmlyc3QgbWFwcGluZyBlbmRzIHdoZXJlIHRoZSBzZWNvbmQgb25lIHN0YXJ0cykuXG4gICAgICBpZiAoaW5kZXggKyAxIDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBuZXh0TWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4ICsgMV07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IG5leHRNYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtIDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGxhc3QgbWFwcGluZyBmb3IgZWFjaCBsaW5lIHNwYW5zIHRoZSBlbnRpcmUgbGluZS5cbiAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IEluZmluaXR5O1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHRoaXMuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcobWFwcGluZywgJ25hbWUnLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuYXQobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGwsXG4gICAgICBuYW1lOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXJfaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50Lmxlbmd0aCA+PSB0aGlzLl9zb3VyY2VzLnNpemUoKSAmJlxuICAgICAgIXRoaXMuc291cmNlc0NvbnRlbnQuc29tZShmdW5jdGlvbiAoc2MpIHsgcmV0dXJuIHNjID09IG51bGw7IH0pO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICogb3JpZ2luYWwgc291cmNlIGZpbGUuIFJldHVybnMgbnVsbCBpZiBubyBvcmlnaW5hbCBzb3VyY2UgY29udGVudCBpc1xuICogYXZhaWxhYmxlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfc291cmNlQ29udGVudEZvcihhU291cmNlLCBudWxsT25NaXNzaW5nKSB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kU291cmNlSW5kZXgoYVNvdXJjZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W2luZGV4XTtcbiAgICB9XG5cbiAgICB2YXIgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgcmVsYXRpdmVTb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgcmVsYXRpdmVTb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciB1cmw7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsXG4gICAgICAgICYmICh1cmwgPSB1dGlsLnVybFBhcnNlKHRoaXMuc291cmNlUm9vdCkpKSB7XG4gICAgICAvLyBYWFg6IGZpbGU6Ly8gVVJJcyBhbmQgYWJzb2x1dGUgcGF0aHMgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIGZvclxuICAgICAgLy8gbWFueSB1c2Vycy4gV2UgY2FuIGhlbHAgdGhlbSBvdXQgd2hlbiB0aGV5IGV4cGVjdCBmaWxlOi8vIFVSSXMgdG9cbiAgICAgIC8vIGJlaGF2ZSBsaWtlIGl0IHdvdWxkIGlmIHRoZXkgd2VyZSBydW5uaW5nIGEgbG9jYWwgSFRUUCBzZXJ2ZXIuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NTk3LlxuICAgICAgdmFyIGZpbGVVcmlBYnNQYXRoID0gcmVsYXRpdmVTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgfVxuXG4gICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIHJlbGF0aXZlU291cmNlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoXCIvXCIgKyByZWxhdGl2ZVNvdXJjZSldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCByZWN1cnNpdmVseSBmcm9tXG4gICAgLy8gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yLiBJbiB0aGF0IGNhc2UsIHdlXG4gICAgLy8gZG9uJ3Qgd2FudCB0byB0aHJvdyBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBzb3VyY2UgLSB3ZSBqdXN0IHdhbnQgdG9cbiAgICAvLyByZXR1cm4gbnVsbCwgc28gd2UgcHJvdmlkZSBhIGZsYWcgdG8gZXhpdCBncmFjZWZ1bGx5LlxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIHJlbGF0aXZlU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpO1xuICAgIHNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChzb3VyY2UpO1xuICAgIGlmIChzb3VyY2UgPCAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IG5lZWRsZS5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG5leHBvcnRzLkJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAqIHdlIGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24uIEl0IGRpZmZlcnMgZnJvbSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluXG4gKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAqIGlucHV0LlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yIGFscmVhZHlcbiAqIHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMgZm9yIGluZGV4ZWQgc291cmNlIG1hcHMsIHRoZXlcbiAqIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIGZpbGU6IE9wdGlvbmFsLiBUaGUgZ2VuZXJhdGVkIGZpbGUgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqICAgLSBzZWN0aW9uczogQSBsaXN0IG9mIHNlY3Rpb24gZGVmaW5pdGlvbnMuXG4gKlxuICogRWFjaCB2YWx1ZSB1bmRlciB0aGUgXCJzZWN0aW9uc1wiIGZpZWxkIGhhcyB0d28gZmllbGRzOlxuICogICAtIG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQgYXQgd2hpY2ggdGhpcyBzZWN0aW9uXG4gKiAgICAgICBiZWdpbnMgdG8gYXBwbHksIGRlZmluZWQgYXMgYW4gb2JqZWN0IHdpdGggYSBcImxpbmVcIiBhbmQgXCJjb2x1bW5cIlxuICogICAgICAgZmllbGQuXG4gKiAgIC0gbWFwOiBBIHNvdXJjZSBtYXAgZGVmaW5pdGlvbi4gVGhpcyBzb3VyY2UgbWFwIGNvdWxkIGFsc28gYmUgaW5kZXhlZCxcbiAqICAgICAgIGJ1dCBkb2Vzbid0IGhhdmUgdG8gYmUuXG4gKlxuICogSW5zdGVhZCBvZiB0aGUgXCJtYXBcIiBmaWVsZCwgaXQncyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgYSBcInVybFwiIGZpZWxkXG4gKiBzcGVjaWZ5aW5nIGEgVVJMIHRvIHJldHJpZXZlIGEgc291cmNlIG1hcCBmcm9tLCBidXQgdGhhdCdzIGN1cnJlbnRseVxuICogdW5zdXBwb3J0ZWQuXG4gKlxuICogSGVyZSdzIGFuIGV4YW1wbGUgc291cmNlIG1hcCwgdGFrZW4gZnJvbSB0aGUgc291cmNlIG1hcCBzcGVjWzBdLCBidXRcbiAqIG1vZGlmaWVkIHRvIG9taXQgYSBzZWN0aW9uIHdoaWNoIHVzZXMgdGhlIFwidXJsXCIgZmllbGQuXG4gKlxuICogIHtcbiAqICAgIHZlcnNpb24gOiAzLFxuICogICAgZmlsZTogXCJhcHAuanNcIixcbiAqICAgIHNlY3Rpb25zOiBbe1xuICogICAgICBvZmZzZXQ6IHtsaW5lOjEwMCwgY29sdW1uOjEwfSxcbiAqICAgICAgbWFwOiB7XG4gKiAgICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICAgZmlsZTogXCJzZWN0aW9uLmpzXCIsXG4gKiAgICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgIG5hbWVzOiBbXCJzcmNcIiwgXCJtYXBzXCIsIFwiYXJlXCIsIFwiZnVuXCJdLFxuICogICAgICAgIG1hcHBpbmdzOiBcIkFBQUEsRTs7QUJDREU7XCJcbiAqICAgICAgfVxuICogICAgfV0sXG4gKiAgfVxuICpcbiAqIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpZiBnaXZlbiwgaXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgdGhlIFVSTFxuICogYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgd2FzIGZvdW5kLiAgVGhpcyBVUkwgaXMgdXNlZCB0byBjb21wdXRlIHRoZVxuICogc291cmNlcyBhcnJheS5cbiAqXG4gKiBbMF06IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdCNoZWFkaW5nPWguNTM1ZXMzeGVwcmd0XG4gKi9cbmZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgdmFyIHZlcnNpb24gPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICd2ZXJzaW9uJyk7XG4gIHZhciBzZWN0aW9ucyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NlY3Rpb25zJyk7XG5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgdGhpcy5fc291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICB0aGlzLl9uYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gIHZhciBsYXN0T2Zmc2V0ID0ge1xuICAgIGxpbmU6IC0xLFxuICAgIGNvbHVtbjogMFxuICB9O1xuICB0aGlzLl9zZWN0aW9ucyA9IHNlY3Rpb25zLm1hcChmdW5jdGlvbiAocykge1xuICAgIGlmIChzLnVybCkge1xuICAgICAgLy8gVGhlIHVybCBmaWVsZCB3aWxsIHJlcXVpcmUgc3VwcG9ydCBmb3IgYXN5bmNocm9uaWNpdHkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMTZcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3VwcG9ydCBmb3IgdXJsIGZpZWxkIGluIHNlY3Rpb25zIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG4gICAgdmFyIG9mZnNldCA9IHV0aWwuZ2V0QXJnKHMsICdvZmZzZXQnKTtcbiAgICB2YXIgb2Zmc2V0TGluZSA9IHV0aWwuZ2V0QXJnKG9mZnNldCwgJ2xpbmUnKTtcbiAgICB2YXIgb2Zmc2V0Q29sdW1uID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnY29sdW1uJyk7XG5cbiAgICBpZiAob2Zmc2V0TGluZSA8IGxhc3RPZmZzZXQubGluZSB8fFxuICAgICAgICAob2Zmc2V0TGluZSA9PT0gbGFzdE9mZnNldC5saW5lICYmIG9mZnNldENvbHVtbiA8IGxhc3RPZmZzZXQuY29sdW1uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWN0aW9uIG9mZnNldHMgbXVzdCBiZSBvcmRlcmVkIGFuZCBub24tb3ZlcmxhcHBpbmcuJyk7XG4gICAgfVxuICAgIGxhc3RPZmZzZXQgPSBvZmZzZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2VuZXJhdGVkT2Zmc2V0OiB7XG4gICAgICAgIC8vIFRoZSBvZmZzZXQgZmllbGRzIGFyZSAwLWJhc2VkLCBidXQgd2UgdXNlIDEtYmFzZWQgaW5kaWNlcyB3aGVuXG4gICAgICAgIC8vIGVuY29kaW5nL2RlY29kaW5nIGZyb20gVkxRLlxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBvZmZzZXRMaW5lICsgMSxcbiAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBvZmZzZXRDb2x1bW4gKyAxXG4gICAgICB9LFxuICAgICAgY29uc3VtZXI6IG5ldyBTb3VyY2VNYXBDb25zdW1lcih1dGlsLmdldEFyZyhzLCAnbWFwJyksIGFTb3VyY2VNYXBVUkwpXG4gICAgfVxuICB9KTtcbn1cblxuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc291cmNlcy5wdXNoKHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlcztcbiAgfVxufSk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkXG4gKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3RcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgY29sdW1uXG4gKiAgICAgbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgIHZhciBzZWN0aW9uSW5kZXggPSBiaW5hcnlTZWFyY2guc2VhcmNoKG5lZWRsZSwgdGhpcy5fc2VjdGlvbnMsXG4gICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICB9KTtcbiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZWN0aW9uLmNvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgY29sdW1uOiBuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgIDogMCksXG4gICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzLmNvbnN1bWVyLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCk7XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICB2YXIgY29udGVudCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlQ29udGVudEZvcihhU291cmNlLCB0cnVlKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLiBcbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICAvLyBPbmx5IGNvbnNpZGVyIHRoaXMgc2VjdGlvbiBpZiB0aGUgcmVxdWVzdGVkIHNvdXJjZSBpcyBpbiB0aGUgbGlzdCBvZlxuICAgICAgLy8gc291cmNlcyBvZiB0aGUgY29uc3VtZXIuXG4gICAgICBpZiAoc2VjdGlvbi5jb25zdW1lci5fZmluZFNvdXJjZUluZGV4KHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICAgOiAwKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcbiAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gc2VjdGlvbk1hcHBpbmdzW2pdO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWN0aW9uLmNvbnN1bWVyLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgICB0aGlzLl9zb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmluZGV4T2Yoc291cmNlKTtcblxuICAgICAgICB2YXIgbmFtZSA9IG51bGw7XG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gc2VjdGlvbi5jb25zdW1lci5fbmFtZXMuYXQobWFwcGluZy5uYW1lKTtcbiAgICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgbWFwcGluZ3MgY29taW5nIGZyb20gdGhlIGNvbnN1bWVyIGZvciB0aGUgc2VjdGlvbiBoYXZlXG4gICAgICAgIC8vIGdlbmVyYXRlZCBwb3NpdGlvbnMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBzbyB3ZVxuICAgICAgICAvLyBuZWVkIHRvIG9mZnNldCB0aGVtIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29uY2F0ZW5hdGVkXG4gICAgICAgIC8vIGdlbmVyYXRlZCBmaWxlLlxuICAgICAgICB2YXIgYWRqdXN0ZWRNYXBwaW5nID0ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZVxuICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICA6IDApLFxuICAgICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgb3JpZ2luYWxDb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgYWRqdXN0ZWRNYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWlja1NvcnQodGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICBxdWlja1NvcnQodGhpcy5fX29yaWdpbmFsTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuICB9O1xuXG5leHBvcnRzLkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciA9IEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcjtcbiIsICIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAwOS0yMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRS50eHQgb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1nZW5lcmF0b3InKS5Tb3VyY2VNYXBHZW5lcmF0b3I7XG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW1hcC1jb25zdW1lcicpLlNvdXJjZU1hcENvbnN1bWVyO1xuZXhwb3J0cy5Tb3VyY2VOb2RlID0gcmVxdWlyZSgnLi9saWIvc291cmNlLW5vZGUnKS5Tb3VyY2VOb2RlO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuXG52YXIgaXNNb2Rlcm4gPSAoXG4gIHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBCdWZmZXIuYWxsb2MgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIEJ1ZmZlci5hbGxvY1Vuc2FmZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgQnVmZmVyLmZyb20gPT09ICdmdW5jdGlvbidcbilcblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlciAoaW5wdXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaW5wdXQpLnNsaWNlKDgsIC0xKSA9PT0gJ0FycmF5QnVmZmVyJ1xufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKG9iaiwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGJ5dGVPZmZzZXQgPj4+PSAwXG5cbiAgdmFyIG1heExlbmd0aCA9IG9iai5ieXRlTGVuZ3RoIC0gYnl0ZU9mZnNldFxuXG4gIGlmIChtYXhMZW5ndGggPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzXCIpXG4gIH1cblxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSBtYXhMZW5ndGhcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPj4+PSAwXG5cbiAgICBpZiAobGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHNcIilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNNb2Rlcm5cbiAgICA/IEJ1ZmZlci5mcm9tKG9iai5zbGljZShieXRlT2Zmc2V0LCBieXRlT2Zmc2V0ICsgbGVuZ3RoKSlcbiAgICA6IG5ldyBCdWZmZXIobmV3IFVpbnQ4QXJyYXkob2JqLnNsaWNlKGJ5dGVPZmZzZXQsIGJ5dGVPZmZzZXQgKyBsZW5ndGgpKSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICByZXR1cm4gaXNNb2Rlcm5cbiAgICA/IEJ1ZmZlci5mcm9tKHN0cmluZywgZW5jb2RpbmcpXG4gICAgOiBuZXcgQnVmZmVyKHN0cmluZywgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlckZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKGlzQXJyYXlCdWZmZXIodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBpc01vZGVyblxuICAgID8gQnVmZmVyLmZyb20odmFsdWUpXG4gICAgOiBuZXcgQnVmZmVyKHZhbHVlKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlckZyb21cbiIsICJ2YXIgU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCdzb3VyY2UtbWFwJykuU291cmNlTWFwQ29uc3VtZXI7XG52YXIgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcblxudmFyIGZzO1xudHJ5IHtcbiAgZnMgPSByZXF1aXJlKCdmcycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMgfHwgIWZzLnJlYWRGaWxlU3luYykge1xuICAgIC8vIGZzIGRvZXNuJ3QgaGF2ZSBhbGwgbWV0aG9kcyB3ZSBuZWVkXG4gICAgZnMgPSBudWxsO1xuICB9XG59IGNhdGNoIChlcnIpIHtcbiAgLyogbm9wICovXG59XG5cbnZhciBidWZmZXJGcm9tID0gcmVxdWlyZSgnYnVmZmVyLWZyb20nKTtcblxuLyoqXG4gKiBSZXF1aXJlcyBhIG1vZHVsZSB3aGljaCBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBidW5kbGVyIG1pbmlmaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge05vZGVNb2R1bGV9IG1vZFxuICogQHBhcmFtIHtzdHJpbmd9IHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gZHluYW1pY1JlcXVpcmUobW9kLCByZXF1ZXN0KSB7XG4gIHJldHVybiBtb2QucmVxdWlyZShyZXF1ZXN0KTtcbn1cblxuLy8gT25seSBpbnN0YWxsIG9uY2UgaWYgY2FsbGVkIG11bHRpcGxlIHRpbWVzXG52YXIgZXJyb3JGb3JtYXR0ZXJJbnN0YWxsZWQgPSBmYWxzZTtcbnZhciB1bmNhdWdodFNoaW1JbnN0YWxsZWQgPSBmYWxzZTtcblxuLy8gSWYgdHJ1ZSwgdGhlIGNhY2hlcyBhcmUgcmVzZXQgYmVmb3JlIGEgc3RhY2sgdHJhY2UgZm9ybWF0dGluZyBvcGVyYXRpb25cbnZhciBlbXB0eUNhY2hlQmV0d2Vlbk9wZXJhdGlvbnMgPSBmYWxzZTtcblxuLy8gU3VwcG9ydHMge2Jyb3dzZXIsIG5vZGUsIGF1dG99XG52YXIgZW52aXJvbm1lbnQgPSBcImF1dG9cIjtcblxuLy8gTWFwcyBhIGZpbGUgcGF0aCB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlIGNvbnRlbnRzXG52YXIgZmlsZUNvbnRlbnRzQ2FjaGUgPSB7fTtcblxuLy8gTWFwcyBhIGZpbGUgcGF0aCB0byBhIHNvdXJjZSBtYXAgZm9yIHRoYXQgZmlsZVxudmFyIHNvdXJjZU1hcENhY2hlID0ge307XG5cbi8vIFJlZ2V4IGZvciBkZXRlY3Rpbmcgc291cmNlIG1hcHNcbnZhciByZVNvdXJjZU1hcCA9IC9eZGF0YTphcHBsaWNhdGlvblxcL2pzb25bXixdK2Jhc2U2NCwvO1xuXG4vLyBQcmlvcml0eSBsaXN0IG9mIHJldHJpZXZlIGhhbmRsZXJzXG52YXIgcmV0cmlldmVGaWxlSGFuZGxlcnMgPSBbXTtcbnZhciByZXRyaWV2ZU1hcEhhbmRsZXJzID0gW107XG5cbmZ1bmN0aW9uIGlzSW5Ccm93c2VyKCkge1xuICBpZiAoZW52aXJvbm1lbnQgPT09IFwiYnJvd3NlclwiKVxuICAgIHJldHVybiB0cnVlO1xuICBpZiAoZW52aXJvbm1lbnQgPT09IFwibm9kZVwiKVxuICAgIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICgodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgPT09ICdmdW5jdGlvbicpICYmICEod2luZG93LnJlcXVpcmUgJiYgd2luZG93Lm1vZHVsZSAmJiB3aW5kb3cucHJvY2VzcyAmJiB3aW5kb3cucHJvY2Vzcy50eXBlID09PSBcInJlbmRlcmVyXCIpKTtcbn1cblxuZnVuY3Rpb24gaGFzR2xvYmFsUHJvY2Vzc0V2ZW50RW1pdHRlcigpIHtcbiAgcmV0dXJuICgodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnKSAmJiAocHJvY2VzcyAhPT0gbnVsbCkgJiYgKHR5cGVvZiBwcm9jZXNzLm9uID09PSAnZnVuY3Rpb24nKSk7XG59XG5cbmZ1bmN0aW9uIGdsb2JhbFByb2Nlc3NWZXJzaW9uKCkge1xuICBpZiAoKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JykgJiYgKHByb2Nlc3MgIT09IG51bGwpKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MudmVyc2lvbjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2xvYmFsUHJvY2Vzc1N0ZGVycigpIHtcbiAgaWYgKCh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcpICYmIChwcm9jZXNzICE9PSBudWxsKSkge1xuICAgIHJldHVybiBwcm9jZXNzLnN0ZGVycjtcbiAgfVxufVxuXG5mdW5jdGlvbiBnbG9iYWxQcm9jZXNzRXhpdChjb2RlKSB7XG4gIGlmICgodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnKSAmJiAocHJvY2VzcyAhPT0gbnVsbCkgJiYgKHR5cGVvZiBwcm9jZXNzLmV4aXQgPT09ICdmdW5jdGlvbicpKSB7XG4gICAgcmV0dXJuIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVyRXhlYyhsaXN0KSB7XG4gIHJldHVybiBmdW5jdGlvbihhcmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciByZXQgPSBsaXN0W2ldKGFyZyk7XG4gICAgICBpZiAocmV0KSB7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xufVxuXG52YXIgcmV0cmlldmVGaWxlID0gaGFuZGxlckV4ZWMocmV0cmlldmVGaWxlSGFuZGxlcnMpO1xuXG5yZXRyaWV2ZUZpbGVIYW5kbGVycy5wdXNoKGZ1bmN0aW9uKHBhdGgpIHtcbiAgLy8gVHJpbSB0aGUgcGF0aCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gZXh0cmEgd2hpdGVzcGFjZS5cbiAgcGF0aCA9IHBhdGgudHJpbSgpO1xuICBpZiAoL15maWxlOi8udGVzdChwYXRoKSkge1xuICAgIC8vIGV4aXN0c1N5bmMvcmVhZEZpbGVTeW5jIGNhbid0IGhhbmRsZSBmaWxlIHByb3RvY29sLCBidXQgb25jZSBzdHJpcHBlZCwgaXQgd29ya3NcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9maWxlOlxcL1xcL1xcLyhcXHc6KT8vLCBmdW5jdGlvbihwcm90b2NvbCwgZHJpdmUpIHtcbiAgICAgIHJldHVybiBkcml2ZSA/XG4gICAgICAgICcnIDogLy8gZmlsZTovLy9DOi9kaXIvZmlsZSAtPiBDOi9kaXIvZmlsZVxuICAgICAgICAnLyc7IC8vIGZpbGU6Ly8vcm9vdC1kaXIvZmlsZSAtPiAvcm9vdC1kaXIvZmlsZVxuICAgIH0pO1xuICB9XG4gIGlmIChwYXRoIGluIGZpbGVDb250ZW50c0NhY2hlKSB7XG4gICAgcmV0dXJuIGZpbGVDb250ZW50c0NhY2hlW3BhdGhdO1xuICB9XG5cbiAgdmFyIGNvbnRlbnRzID0gJyc7XG4gIHRyeSB7XG4gICAgaWYgKCFmcykge1xuICAgICAgLy8gVXNlIFNKQVggaWYgd2UgYXJlIGluIHRoZSBicm93c2VyXG4gICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICB4aHIub3BlbignR0VUJywgcGF0aCwgLyoqIGFzeW5jICovIGZhbHNlKTtcbiAgICAgIHhoci5zZW5kKG51bGwpO1xuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0ICYmIHhoci5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICBjb250ZW50cyA9IHhoci5yZXNwb25zZVRleHQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChmcy5leGlzdHNTeW5jKHBhdGgpKSB7XG4gICAgICAvLyBPdGhlcndpc2UsIHVzZSB0aGUgZmlsZXN5c3RlbVxuICAgICAgY29udGVudHMgPSBmcy5yZWFkRmlsZVN5bmMocGF0aCwgJ3V0ZjgnKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgLyogaWdub3JlIGFueSBlcnJvcnMgKi9cbiAgfVxuXG4gIHJldHVybiBmaWxlQ29udGVudHNDYWNoZVtwYXRoXSA9IGNvbnRlbnRzO1xufSk7XG5cbi8vIFN1cHBvcnQgVVJMcyByZWxhdGl2ZSB0byBhIGRpcmVjdG9yeSwgYnV0IGJlIGNhcmVmdWwgYWJvdXQgYSBwcm90b2NvbCBwcmVmaXhcbi8vIGluIGNhc2Ugd2UgYXJlIGluIHRoZSBicm93c2VyIChpLmUuIGRpcmVjdG9yaWVzIG1heSBzdGFydCB3aXRoIFwiaHR0cDovL1wiIG9yIFwiZmlsZTovLy9cIilcbmZ1bmN0aW9uIHN1cHBvcnRSZWxhdGl2ZVVSTChmaWxlLCB1cmwpIHtcbiAgaWYgKCFmaWxlKSByZXR1cm4gdXJsO1xuICB2YXIgZGlyID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICB2YXIgbWF0Y2ggPSAvXlxcdys6XFwvXFwvW15cXC9dKi8uZXhlYyhkaXIpO1xuICB2YXIgcHJvdG9jb2wgPSBtYXRjaCA/IG1hdGNoWzBdIDogJyc7XG4gIHZhciBzdGFydFBhdGggPSBkaXIuc2xpY2UocHJvdG9jb2wubGVuZ3RoKTtcbiAgaWYgKHByb3RvY29sICYmIC9eXFwvXFx3XFw6Ly50ZXN0KHN0YXJ0UGF0aCkpIHtcbiAgICAvLyBoYW5kbGUgZmlsZTovLy9DOi8gcGF0aHNcbiAgICBwcm90b2NvbCArPSAnLyc7XG4gICAgcmV0dXJuIHByb3RvY29sICsgcGF0aC5yZXNvbHZlKGRpci5zbGljZShwcm90b2NvbC5sZW5ndGgpLCB1cmwpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgfVxuICByZXR1cm4gcHJvdG9jb2wgKyBwYXRoLnJlc29sdmUoZGlyLnNsaWNlKHByb3RvY29sLmxlbmd0aCksIHVybCk7XG59XG5cbmZ1bmN0aW9uIHJldHJpZXZlU291cmNlTWFwVVJMKHNvdXJjZSkge1xuICB2YXIgZmlsZURhdGE7XG5cbiAgaWYgKGlzSW5Ccm93c2VyKCkpIHtcbiAgICAgdHJ5IHtcbiAgICAgICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgeGhyLm9wZW4oJ0dFVCcsIHNvdXJjZSwgZmFsc2UpO1xuICAgICAgIHhoci5zZW5kKG51bGwpO1xuICAgICAgIGZpbGVEYXRhID0geGhyLnJlYWR5U3RhdGUgPT09IDQgPyB4aHIucmVzcG9uc2VUZXh0IDogbnVsbDtcblxuICAgICAgIC8vIFN1cHBvcnQgcHJvdmlkaW5nIGEgc291cmNlTWFwcGluZ1VSTCB2aWEgdGhlIFNvdXJjZU1hcCBoZWFkZXJcbiAgICAgICB2YXIgc291cmNlTWFwSGVhZGVyID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiU291cmNlTWFwXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci5nZXRSZXNwb25zZUhlYWRlcihcIlgtU291cmNlTWFwXCIpO1xuICAgICAgIGlmIChzb3VyY2VNYXBIZWFkZXIpIHtcbiAgICAgICAgIHJldHVybiBzb3VyY2VNYXBIZWFkZXI7XG4gICAgICAgfVxuICAgICB9IGNhdGNoIChlKSB7XG4gICAgIH1cbiAgfVxuXG4gIC8vIEdldCB0aGUgVVJMIG9mIHRoZSBzb3VyY2UgbWFwXG4gIGZpbGVEYXRhID0gcmV0cmlldmVGaWxlKHNvdXJjZSk7XG4gIHZhciByZSA9IC8oPzpcXC9cXC9bQCNdW1xcc10qc291cmNlTWFwcGluZ1VSTD0oW15cXHMnXCJdKylbXFxzXSokKXwoPzpcXC9cXCpbQCNdW1xcc10qc291cmNlTWFwcGluZ1VSTD0oW15cXHMqJ1wiXSspW1xcc10qKD86XFwqXFwvKVtcXHNdKiQpL21nO1xuICAvLyBLZWVwIGV4ZWN1dGluZyB0aGUgc2VhcmNoIHRvIGZpbmQgdGhlICpsYXN0KiBzb3VyY2VNYXBwaW5nVVJMIHRvIGF2b2lkXG4gIC8vIHBpY2tpbmcgdXAgc291cmNlTWFwcGluZ1VSTHMgZnJvbSBjb21tZW50cywgc3RyaW5ncywgZXRjLlxuICB2YXIgbGFzdE1hdGNoLCBtYXRjaDtcbiAgd2hpbGUgKG1hdGNoID0gcmUuZXhlYyhmaWxlRGF0YSkpIGxhc3RNYXRjaCA9IG1hdGNoO1xuICBpZiAoIWxhc3RNYXRjaCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBsYXN0TWF0Y2hbMV07XG59O1xuXG4vLyBDYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgcmV0cmlldmVTb3VyY2VNYXAgb3B0aW9uIHRvIGluc3RhbGwuIFRha2VzIGFcbi8vIGdlbmVyYXRlZCBzb3VyY2UgZmlsZW5hbWU7IHJldHVybnMgYSB7bWFwLCBvcHRpb25hbCB1cmx9IG9iamVjdCwgb3IgbnVsbCBpZlxuLy8gdGhlcmUgaXMgbm8gc291cmNlIG1hcC4gIFRoZSBtYXAgZmllbGQgbWF5IGJlIGVpdGhlciBhIHN0cmluZyBvciB0aGUgcGFyc2VkXG4vLyBKU09OIG9iamVjdCAoaWUsIGl0IG11c3QgYmUgYSB2YWxpZCBhcmd1bWVudCB0byB0aGUgU291cmNlTWFwQ29uc3VtZXJcbi8vIGNvbnN0cnVjdG9yKS5cbnZhciByZXRyaWV2ZVNvdXJjZU1hcCA9IGhhbmRsZXJFeGVjKHJldHJpZXZlTWFwSGFuZGxlcnMpO1xucmV0cmlldmVNYXBIYW5kbGVycy5wdXNoKGZ1bmN0aW9uKHNvdXJjZSkge1xuICB2YXIgc291cmNlTWFwcGluZ1VSTCA9IHJldHJpZXZlU291cmNlTWFwVVJMKHNvdXJjZSk7XG4gIGlmICghc291cmNlTWFwcGluZ1VSTCkgcmV0dXJuIG51bGw7XG5cbiAgLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIHNvdXJjZSBtYXBcbiAgdmFyIHNvdXJjZU1hcERhdGE7XG4gIGlmIChyZVNvdXJjZU1hcC50ZXN0KHNvdXJjZU1hcHBpbmdVUkwpKSB7XG4gICAgLy8gU3VwcG9ydCBzb3VyY2UgbWFwIFVSTCBhcyBhIGRhdGEgdXJsXG4gICAgdmFyIHJhd0RhdGEgPSBzb3VyY2VNYXBwaW5nVVJMLnNsaWNlKHNvdXJjZU1hcHBpbmdVUkwuaW5kZXhPZignLCcpICsgMSk7XG4gICAgc291cmNlTWFwRGF0YSA9IGJ1ZmZlckZyb20ocmF3RGF0YSwgXCJiYXNlNjRcIikudG9TdHJpbmcoKTtcbiAgICBzb3VyY2VNYXBwaW5nVVJMID0gc291cmNlO1xuICB9IGVsc2Uge1xuICAgIC8vIFN1cHBvcnQgc291cmNlIG1hcCBVUkxzIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgVVJMXG4gICAgc291cmNlTWFwcGluZ1VSTCA9IHN1cHBvcnRSZWxhdGl2ZVVSTChzb3VyY2UsIHNvdXJjZU1hcHBpbmdVUkwpO1xuICAgIHNvdXJjZU1hcERhdGEgPSByZXRyaWV2ZUZpbGUoc291cmNlTWFwcGluZ1VSTCk7XG4gIH1cblxuICBpZiAoIXNvdXJjZU1hcERhdGEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdXJsOiBzb3VyY2VNYXBwaW5nVVJMLFxuICAgIG1hcDogc291cmNlTWFwRGF0YVxuICB9O1xufSk7XG5cbmZ1bmN0aW9uIG1hcFNvdXJjZVBvc2l0aW9uKHBvc2l0aW9uKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBzb3VyY2VNYXBDYWNoZVtwb3NpdGlvbi5zb3VyY2VdO1xuICBpZiAoIXNvdXJjZU1hcCkge1xuICAgIC8vIENhbGwgdGhlIChvdmVycmlkZWFibGUpIHJldHJpZXZlU291cmNlTWFwIGZ1bmN0aW9uIHRvIGdldCB0aGUgc291cmNlIG1hcC5cbiAgICB2YXIgdXJsQW5kTWFwID0gcmV0cmlldmVTb3VyY2VNYXAocG9zaXRpb24uc291cmNlKTtcbiAgICBpZiAodXJsQW5kTWFwKSB7XG4gICAgICBzb3VyY2VNYXAgPSBzb3VyY2VNYXBDYWNoZVtwb3NpdGlvbi5zb3VyY2VdID0ge1xuICAgICAgICB1cmw6IHVybEFuZE1hcC51cmwsXG4gICAgICAgIG1hcDogbmV3IFNvdXJjZU1hcENvbnN1bWVyKHVybEFuZE1hcC5tYXApXG4gICAgICB9O1xuXG4gICAgICAvLyBMb2FkIGFsbCBzb3VyY2VzIHN0b3JlZCBpbmxpbmUgd2l0aCB0aGUgc291cmNlIG1hcCBpbnRvIHRoZSBmaWxlIGNhY2hlXG4gICAgICAvLyB0byBwcmV0ZW5kIGxpa2UgdGhleSBhcmUgYWxyZWFkeSBsb2FkZWQuIFRoZXkgbWF5IG5vdCBleGlzdCBvbiBkaXNrLlxuICAgICAgaWYgKHNvdXJjZU1hcC5tYXAuc291cmNlc0NvbnRlbnQpIHtcbiAgICAgICAgc291cmNlTWFwLm1hcC5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24oc291cmNlLCBpKSB7XG4gICAgICAgICAgdmFyIGNvbnRlbnRzID0gc291cmNlTWFwLm1hcC5zb3VyY2VzQ29udGVudFtpXTtcbiAgICAgICAgICBpZiAoY29udGVudHMpIHtcbiAgICAgICAgICAgIHZhciB1cmwgPSBzdXBwb3J0UmVsYXRpdmVVUkwoc291cmNlTWFwLnVybCwgc291cmNlKTtcbiAgICAgICAgICAgIGZpbGVDb250ZW50c0NhY2hlW3VybF0gPSBjb250ZW50cztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VNYXAgPSBzb3VyY2VNYXBDYWNoZVtwb3NpdGlvbi5zb3VyY2VdID0ge1xuICAgICAgICB1cmw6IG51bGwsXG4gICAgICAgIG1hcDogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBzb3VyY2UgVVJMIHJlbGF0aXZlIHRvIHRoZSBVUkwgb2YgdGhlIHNvdXJjZSBtYXBcbiAgaWYgKHNvdXJjZU1hcCAmJiBzb3VyY2VNYXAubWFwICYmIHR5cGVvZiBzb3VyY2VNYXAubWFwLm9yaWdpbmFsUG9zaXRpb25Gb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgb3JpZ2luYWxQb3NpdGlvbiA9IHNvdXJjZU1hcC5tYXAub3JpZ2luYWxQb3NpdGlvbkZvcihwb3NpdGlvbik7XG5cbiAgICAvLyBPbmx5IHJldHVybiB0aGUgb3JpZ2luYWwgcG9zaXRpb24gaWYgYSBtYXRjaGluZyBsaW5lIHdhcyBmb3VuZC4gSWYgbm9cbiAgICAvLyBtYXRjaGluZyBsaW5lIGlzIGZvdW5kIHRoZW4gd2UgcmV0dXJuIHBvc2l0aW9uIGluc3RlYWQsIHdoaWNoIHdpbGwgY2F1c2VcbiAgICAvLyB0aGUgc3RhY2sgdHJhY2UgdG8gcHJpbnQgdGhlIHBhdGggYW5kIGxpbmUgZm9yIHRoZSBjb21waWxlZCBmaWxlLiBJdCBpc1xuICAgIC8vIGJldHRlciB0byBnaXZlIGEgcHJlY2lzZSBsb2NhdGlvbiBpbiB0aGUgY29tcGlsZWQgZmlsZSB0aGFuIGEgdmFndWVcbiAgICAvLyBsb2NhdGlvbiBpbiB0aGUgb3JpZ2luYWwgZmlsZS5cbiAgICBpZiAob3JpZ2luYWxQb3NpdGlvbi5zb3VyY2UgIT09IG51bGwpIHtcbiAgICAgIG9yaWdpbmFsUG9zaXRpb24uc291cmNlID0gc3VwcG9ydFJlbGF0aXZlVVJMKFxuICAgICAgICBzb3VyY2VNYXAudXJsLCBvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSk7XG4gICAgICByZXR1cm4gb3JpZ2luYWxQb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcG9zaXRpb247XG59XG5cbi8vIFBhcnNlcyBjb2RlIGdlbmVyYXRlZCBieSBGb3JtYXRFdmFsT3JpZ2luKCksIGEgZnVuY3Rpb24gaW5zaWRlIFY4OlxuLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9zb3VyY2UvYnJvd3NlL3RydW5rL3NyYy9tZXNzYWdlcy5qc1xuZnVuY3Rpb24gbWFwRXZhbE9yaWdpbihvcmlnaW4pIHtcbiAgLy8gTW9zdCBldmFsKCkgY2FsbHMgYXJlIGluIHRoaXMgZm9ybWF0XG4gIHZhciBtYXRjaCA9IC9eZXZhbCBhdCAoW14oXSspIFxcKCguKyk6KFxcZCspOihcXGQrKVxcKSQvLmV4ZWMob3JpZ2luKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgdmFyIHBvc2l0aW9uID0gbWFwU291cmNlUG9zaXRpb24oe1xuICAgICAgc291cmNlOiBtYXRjaFsyXSxcbiAgICAgIGxpbmU6ICttYXRjaFszXSxcbiAgICAgIGNvbHVtbjogbWF0Y2hbNF0gLSAxXG4gICAgfSk7XG4gICAgcmV0dXJuICdldmFsIGF0ICcgKyBtYXRjaFsxXSArICcgKCcgKyBwb3NpdGlvbi5zb3VyY2UgKyAnOicgK1xuICAgICAgcG9zaXRpb24ubGluZSArICc6JyArIChwb3NpdGlvbi5jb2x1bW4gKyAxKSArICcpJztcbiAgfVxuXG4gIC8vIFBhcnNlIG5lc3RlZCBldmFsKCkgY2FsbHMgdXNpbmcgcmVjdXJzaW9uXG4gIG1hdGNoID0gL15ldmFsIGF0IChbXihdKykgXFwoKC4rKVxcKSQvLmV4ZWMob3JpZ2luKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuICdldmFsIGF0ICcgKyBtYXRjaFsxXSArICcgKCcgKyBtYXBFdmFsT3JpZ2luKG1hdGNoWzJdKSArICcpJztcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB3ZSBzdGlsbCByZXR1cm4gdXNlZnVsIGluZm9ybWF0aW9uIGlmIHdlIGRpZG4ndCBmaW5kIGFueXRoaW5nXG4gIHJldHVybiBvcmlnaW47XG59XG5cbi8vIFRoaXMgaXMgY29waWVkIGFsbW9zdCB2ZXJiYXRpbSBmcm9tIHRoZSBWOCBzb3VyY2UgY29kZSBhdFxuLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9zb3VyY2UvYnJvd3NlL3RydW5rL3NyYy9tZXNzYWdlcy5qcy4gVGhlXG4vLyBpbXBsZW1lbnRhdGlvbiBvZiB3cmFwQ2FsbFNpdGUoKSB1c2VkIHRvIGp1c3QgZm9yd2FyZCB0byB0aGUgYWN0dWFsIHNvdXJjZVxuLy8gY29kZSBvZiBDYWxsU2l0ZS5wcm90b3R5cGUudG9TdHJpbmcgYnV0IHVuZm9ydHVuYXRlbHkgYSBuZXcgcmVsZWFzZSBvZiBWOFxuLy8gZGlkIHNvbWV0aGluZyB0byB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBicm9rZSB0aGUgc2hpbS4gVGhlIG9ubHkgZml4IElcbi8vIGNvdWxkIGZpbmQgd2FzIGNvcHkvcGFzdGUuXG5mdW5jdGlvbiBDYWxsU2l0ZVRvU3RyaW5nKCkge1xuICB2YXIgZmlsZU5hbWU7XG4gIHZhciBmaWxlTG9jYXRpb24gPSBcIlwiO1xuICBpZiAodGhpcy5pc05hdGl2ZSgpKSB7XG4gICAgZmlsZUxvY2F0aW9uID0gXCJuYXRpdmVcIjtcbiAgfSBlbHNlIHtcbiAgICBmaWxlTmFtZSA9IHRoaXMuZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMKCk7XG4gICAgaWYgKCFmaWxlTmFtZSAmJiB0aGlzLmlzRXZhbCgpKSB7XG4gICAgICBmaWxlTG9jYXRpb24gPSB0aGlzLmdldEV2YWxPcmlnaW4oKTtcbiAgICAgIGZpbGVMb2NhdGlvbiArPSBcIiwgXCI7ICAvLyBFeHBlY3Rpbmcgc291cmNlIHBvc2l0aW9uIHRvIGZvbGxvdy5cbiAgICB9XG5cbiAgICBpZiAoZmlsZU5hbWUpIHtcbiAgICAgIGZpbGVMb2NhdGlvbiArPSBmaWxlTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU291cmNlIGNvZGUgZG9lcyBub3Qgb3JpZ2luYXRlIGZyb20gYSBmaWxlIGFuZCBpcyBub3QgbmF0aXZlLCBidXQgd2VcbiAgICAgIC8vIGNhbiBzdGlsbCBnZXQgdGhlIHNvdXJjZSBwb3NpdGlvbiBpbnNpZGUgdGhlIHNvdXJjZSBzdHJpbmcsIGUuZy4gaW5cbiAgICAgIC8vIGFuIGV2YWwgc3RyaW5nLlxuICAgICAgZmlsZUxvY2F0aW9uICs9IFwiPGFub255bW91cz5cIjtcbiAgICB9XG4gICAgdmFyIGxpbmVOdW1iZXIgPSB0aGlzLmdldExpbmVOdW1iZXIoKTtcbiAgICBpZiAobGluZU51bWJlciAhPSBudWxsKSB7XG4gICAgICBmaWxlTG9jYXRpb24gKz0gXCI6XCIgKyBsaW5lTnVtYmVyO1xuICAgICAgdmFyIGNvbHVtbk51bWJlciA9IHRoaXMuZ2V0Q29sdW1uTnVtYmVyKCk7XG4gICAgICBpZiAoY29sdW1uTnVtYmVyKSB7XG4gICAgICAgIGZpbGVMb2NhdGlvbiArPSBcIjpcIiArIGNvbHVtbk51bWJlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2YXIgbGluZSA9IFwiXCI7XG4gIHZhciBmdW5jdGlvbk5hbWUgPSB0aGlzLmdldEZ1bmN0aW9uTmFtZSgpO1xuICB2YXIgYWRkU3VmZml4ID0gdHJ1ZTtcbiAgdmFyIGlzQ29uc3RydWN0b3IgPSB0aGlzLmlzQ29uc3RydWN0b3IoKTtcbiAgdmFyIGlzTWV0aG9kQ2FsbCA9ICEodGhpcy5pc1RvcGxldmVsKCkgfHwgaXNDb25zdHJ1Y3Rvcik7XG4gIGlmIChpc01ldGhvZENhbGwpIHtcbiAgICB2YXIgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7XG4gICAgLy8gRml4ZXMgc2hpbSB0byBiZSBiYWNrd2FyZCBjb21wYXRhYmxlIHdpdGggTm9kZSB2MCB0byB2NFxuICAgIGlmICh0eXBlTmFtZSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgdHlwZU5hbWUgPSBcIm51bGxcIjtcbiAgICB9XG4gICAgdmFyIG1ldGhvZE5hbWUgPSB0aGlzLmdldE1ldGhvZE5hbWUoKTtcbiAgICBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgICBpZiAodHlwZU5hbWUgJiYgZnVuY3Rpb25OYW1lLmluZGV4T2YodHlwZU5hbWUpICE9IDApIHtcbiAgICAgICAgbGluZSArPSB0eXBlTmFtZSArIFwiLlwiO1xuICAgICAgfVxuICAgICAgbGluZSArPSBmdW5jdGlvbk5hbWU7XG4gICAgICBpZiAobWV0aG9kTmFtZSAmJiBmdW5jdGlvbk5hbWUuaW5kZXhPZihcIi5cIiArIG1ldGhvZE5hbWUpICE9IGZ1bmN0aW9uTmFtZS5sZW5ndGggLSBtZXRob2ROYW1lLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbGluZSArPSBcIiBbYXMgXCIgKyBtZXRob2ROYW1lICsgXCJdXCI7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpbmUgKz0gdHlwZU5hbWUgKyBcIi5cIiArIChtZXRob2ROYW1lIHx8IFwiPGFub255bW91cz5cIik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzQ29uc3RydWN0b3IpIHtcbiAgICBsaW5lICs9IFwibmV3IFwiICsgKGZ1bmN0aW9uTmFtZSB8fCBcIjxhbm9ueW1vdXM+XCIpO1xuICB9IGVsc2UgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgIGxpbmUgKz0gZnVuY3Rpb25OYW1lO1xuICB9IGVsc2Uge1xuICAgIGxpbmUgKz0gZmlsZUxvY2F0aW9uO1xuICAgIGFkZFN1ZmZpeCA9IGZhbHNlO1xuICB9XG4gIGlmIChhZGRTdWZmaXgpIHtcbiAgICBsaW5lICs9IFwiIChcIiArIGZpbGVMb2NhdGlvbiArIFwiKVwiO1xuICB9XG4gIHJldHVybiBsaW5lO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNhbGxTaXRlKGZyYW1lKSB7XG4gIHZhciBvYmplY3QgPSB7fTtcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT2JqZWN0LmdldFByb3RvdHlwZU9mKGZyYW1lKSkuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgb2JqZWN0W25hbWVdID0gL14oPzppc3xnZXQpLy50ZXN0KG5hbWUpID8gZnVuY3Rpb24oKSB7IHJldHVybiBmcmFtZVtuYW1lXS5jYWxsKGZyYW1lKTsgfSA6IGZyYW1lW25hbWVdO1xuICB9KTtcbiAgb2JqZWN0LnRvU3RyaW5nID0gQ2FsbFNpdGVUb1N0cmluZztcbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gd3JhcENhbGxTaXRlKGZyYW1lLCBzdGF0ZSkge1xuICAvLyBwcm92aWRlcyBpbnRlcmZhY2UgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBpZiAoc3RhdGUgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXRlID0geyBuZXh0UG9zaXRpb246IG51bGwsIGN1clBvc2l0aW9uOiBudWxsIH1cbiAgfVxuICBpZihmcmFtZS5pc05hdGl2ZSgpKSB7XG4gICAgc3RhdGUuY3VyUG9zaXRpb24gPSBudWxsO1xuICAgIHJldHVybiBmcmFtZTtcbiAgfVxuXG4gIC8vIE1vc3QgY2FsbCBzaXRlcyB3aWxsIHJldHVybiB0aGUgc291cmNlIGZpbGUgZnJvbSBnZXRGaWxlTmFtZSgpLCBidXQgY29kZVxuICAvLyBwYXNzZWQgdG8gZXZhbCgpIGVuZGluZyBpbiBcIi8vIyBzb3VyY2VVUkw9Li4uXCIgd2lsbCByZXR1cm4gdGhlIHNvdXJjZSBmaWxlXG4gIC8vIGZyb20gZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMKCkgaW5zdGVhZFxuICB2YXIgc291cmNlID0gZnJhbWUuZ2V0RmlsZU5hbWUoKSB8fCBmcmFtZS5nZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwoKTtcbiAgaWYgKHNvdXJjZSkge1xuICAgIHZhciBsaW5lID0gZnJhbWUuZ2V0TGluZU51bWJlcigpO1xuICAgIHZhciBjb2x1bW4gPSBmcmFtZS5nZXRDb2x1bW5OdW1iZXIoKSAtIDE7XG5cbiAgICAvLyBGaXggcG9zaXRpb24gaW4gTm9kZSB3aGVyZSBzb21lIChpbnRlcm5hbCkgY29kZSBpcyBwcmVwZW5kZWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ldmFudy9ub2RlLXNvdXJjZS1tYXAtc3VwcG9ydC9pc3N1ZXMvMzZcbiAgICAvLyBIZWFkZXIgcmVtb3ZlZCBpbiBub2RlIGF0IF4xMC4xNiB8fCA+PTExLjExLjBcbiAgICAvLyB2MTEgaXMgbm90IGFuIExUUyBjYW5kaWRhdGUsIHdlIGNhbiBqdXN0IHRlc3QgdGhlIG9uZSB2ZXJzaW9uIHdpdGggaXQuXG4gICAgLy8gVGVzdCBub2RlIHZlcnNpb25zIGZvcjogMTAuMTYtMTksIDEwLjIwKywgMTItMTksIDIwLTk5LCAxMDArLCBvciAxMS4xMVxuICAgIHZhciBub0hlYWRlciA9IC9edigxMFxcLjFbNi05XXwxMFxcLlsyLTldWzAtOV18MTBcXC5bMC05XXszLH18MVsyLTldXFxkKnxbMi05XVxcZHxcXGR7Myx9fDExXFwuMTEpLztcbiAgICB2YXIgaGVhZGVyTGVuZ3RoID0gbm9IZWFkZXIudGVzdChnbG9iYWxQcm9jZXNzVmVyc2lvbigpKSA/IDAgOiA2MjtcbiAgICBpZiAobGluZSA9PT0gMSAmJiBjb2x1bW4gPiBoZWFkZXJMZW5ndGggJiYgIWlzSW5Ccm93c2VyKCkgJiYgIWZyYW1lLmlzRXZhbCgpKSB7XG4gICAgICBjb2x1bW4gLT0gaGVhZGVyTGVuZ3RoO1xuICAgIH1cblxuICAgIHZhciBwb3NpdGlvbiA9IG1hcFNvdXJjZVBvc2l0aW9uKHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbGluZTogbGluZSxcbiAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgfSk7XG4gICAgc3RhdGUuY3VyUG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICBmcmFtZSA9IGNsb25lQ2FsbFNpdGUoZnJhbWUpO1xuICAgIHZhciBvcmlnaW5hbEZ1bmN0aW9uTmFtZSA9IGZyYW1lLmdldEZ1bmN0aW9uTmFtZTtcbiAgICBmcmFtZS5nZXRGdW5jdGlvbk5hbWUgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmIChzdGF0ZS5uZXh0UG9zaXRpb24gPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvbk5hbWUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdGF0ZS5uZXh0UG9zaXRpb24ubmFtZSB8fCBvcmlnaW5hbEZ1bmN0aW9uTmFtZSgpO1xuICAgIH07XG4gICAgZnJhbWUuZ2V0RmlsZU5hbWUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHBvc2l0aW9uLnNvdXJjZTsgfTtcbiAgICBmcmFtZS5nZXRMaW5lTnVtYmVyID0gZnVuY3Rpb24oKSB7IHJldHVybiBwb3NpdGlvbi5saW5lOyB9O1xuICAgIGZyYW1lLmdldENvbHVtbk51bWJlciA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcG9zaXRpb24uY29sdW1uICsgMTsgfTtcbiAgICBmcmFtZS5nZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHBvc2l0aW9uLnNvdXJjZTsgfTtcbiAgICByZXR1cm4gZnJhbWU7XG4gIH1cblxuICAvLyBDb2RlIGNhbGxlZCB1c2luZyBldmFsKCkgbmVlZHMgc3BlY2lhbCBoYW5kbGluZ1xuICB2YXIgb3JpZ2luID0gZnJhbWUuaXNFdmFsKCkgJiYgZnJhbWUuZ2V0RXZhbE9yaWdpbigpO1xuICBpZiAob3JpZ2luKSB7XG4gICAgb3JpZ2luID0gbWFwRXZhbE9yaWdpbihvcmlnaW4pO1xuICAgIGZyYW1lID0gY2xvbmVDYWxsU2l0ZShmcmFtZSk7XG4gICAgZnJhbWUuZ2V0RXZhbE9yaWdpbiA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gb3JpZ2luOyB9O1xuICAgIHJldHVybiBmcmFtZTtcbiAgfVxuXG4gIC8vIElmIHdlIGdldCBoZXJlIHRoZW4gd2Ugd2VyZSB1bmFibGUgdG8gY2hhbmdlIHRoZSBzb3VyY2UgcG9zaXRpb25cbiAgcmV0dXJuIGZyYW1lO1xufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHBhcnQgb2YgdGhlIFY4IHN0YWNrIHRyYWNlIEFQSSwgZm9yIG1vcmUgaW5mbyBzZWU6XG4vLyBodHRwczovL3Y4LmRldi9kb2NzL3N0YWNrLXRyYWNlLWFwaVxuZnVuY3Rpb24gcHJlcGFyZVN0YWNrVHJhY2UoZXJyb3IsIHN0YWNrKSB7XG4gIGlmIChlbXB0eUNhY2hlQmV0d2Vlbk9wZXJhdGlvbnMpIHtcbiAgICBmaWxlQ29udGVudHNDYWNoZSA9IHt9O1xuICAgIHNvdXJjZU1hcENhY2hlID0ge307XG4gIH1cblxuICB2YXIgbmFtZSA9IGVycm9yLm5hbWUgfHwgJ0Vycm9yJztcbiAgdmFyIG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlIHx8ICcnO1xuICB2YXIgZXJyb3JTdHJpbmcgPSBuYW1lICsgXCI6IFwiICsgbWVzc2FnZTtcblxuICB2YXIgc3RhdGUgPSB7IG5leHRQb3NpdGlvbjogbnVsbCwgY3VyUG9zaXRpb246IG51bGwgfTtcbiAgdmFyIHByb2Nlc3NlZFN0YWNrID0gW107XG4gIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHByb2Nlc3NlZFN0YWNrLnB1c2goJ1xcbiAgICBhdCAnICsgd3JhcENhbGxTaXRlKHN0YWNrW2ldLCBzdGF0ZSkpO1xuICAgIHN0YXRlLm5leHRQb3NpdGlvbiA9IHN0YXRlLmN1clBvc2l0aW9uO1xuICB9XG4gIHN0YXRlLmN1clBvc2l0aW9uID0gc3RhdGUubmV4dFBvc2l0aW9uID0gbnVsbDtcbiAgcmV0dXJuIGVycm9yU3RyaW5nICsgcHJvY2Vzc2VkU3RhY2sucmV2ZXJzZSgpLmpvaW4oJycpO1xufVxuXG4vLyBHZW5lcmF0ZSBwb3NpdGlvbiBhbmQgc25pcHBldCBvZiBvcmlnaW5hbCBzb3VyY2Ugd2l0aCBwb2ludGVyXG5mdW5jdGlvbiBnZXRFcnJvclNvdXJjZShlcnJvcikge1xuICB2YXIgbWF0Y2ggPSAvXFxuICAgIGF0IFteKF0rIFxcKCguKik6KFxcZCspOihcXGQrKVxcKS8uZXhlYyhlcnJvci5zdGFjayk7XG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBzb3VyY2UgPSBtYXRjaFsxXTtcbiAgICB2YXIgbGluZSA9ICttYXRjaFsyXTtcbiAgICB2YXIgY29sdW1uID0gK21hdGNoWzNdO1xuXG4gICAgLy8gU3VwcG9ydCB0aGUgaW5saW5lIHNvdXJjZUNvbnRlbnRzIGluc2lkZSB0aGUgc291cmNlIG1hcFxuICAgIHZhciBjb250ZW50cyA9IGZpbGVDb250ZW50c0NhY2hlW3NvdXJjZV07XG5cbiAgICAvLyBTdXBwb3J0IGZpbGVzIG9uIGRpc2tcbiAgICBpZiAoIWNvbnRlbnRzICYmIGZzICYmIGZzLmV4aXN0c1N5bmMoc291cmNlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29udGVudHMgPSBmcy5yZWFkRmlsZVN5bmMoc291cmNlLCAndXRmOCcpO1xuICAgICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgICAgY29udGVudHMgPSAnJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGb3JtYXQgdGhlIGxpbmUgZnJvbSB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUgbGlrZSBub2RlIGRvZXNcbiAgICBpZiAoY29udGVudHMpIHtcbiAgICAgIHZhciBjb2RlID0gY29udGVudHMuc3BsaXQoLyg/OlxcclxcbnxcXHJ8XFxuKS8pW2xpbmUgLSAxXTtcbiAgICAgIGlmIChjb2RlKSB7XG4gICAgICAgIHJldHVybiBzb3VyY2UgKyAnOicgKyBsaW5lICsgJ1xcbicgKyBjb2RlICsgJ1xcbicgK1xuICAgICAgICAgIG5ldyBBcnJheShjb2x1bW4pLmpvaW4oJyAnKSArICdeJztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIHByaW50RXJyb3JBbmRFeGl0IChlcnJvcikge1xuICB2YXIgc291cmNlID0gZ2V0RXJyb3JTb3VyY2UoZXJyb3IpO1xuXG4gIC8vIEVuc3VyZSBlcnJvciBpcyBwcmludGVkIHN5bmNocm9ub3VzbHkgYW5kIG5vdCB0cnVuY2F0ZWRcbiAgdmFyIHN0ZGVyciA9IGdsb2JhbFByb2Nlc3NTdGRlcnIoKTtcbiAgaWYgKHN0ZGVyciAmJiBzdGRlcnIuX2hhbmRsZSAmJiBzdGRlcnIuX2hhbmRsZS5zZXRCbG9ja2luZykge1xuICAgIHN0ZGVyci5faGFuZGxlLnNldEJsb2NraW5nKHRydWUpO1xuICB9XG5cbiAgaWYgKHNvdXJjZSkge1xuICAgIGNvbnNvbGUuZXJyb3IoKTtcbiAgICBjb25zb2xlLmVycm9yKHNvdXJjZSk7XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcbiAgZ2xvYmFsUHJvY2Vzc0V4aXQoMSk7XG59XG5cbmZ1bmN0aW9uIHNoaW1FbWl0VW5jYXVnaHRFeGNlcHRpb24gKCkge1xuICB2YXIgb3JpZ0VtaXQgPSBwcm9jZXNzLmVtaXQ7XG5cbiAgcHJvY2Vzcy5lbWl0ID0gZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3VuY2F1Z2h0RXhjZXB0aW9uJykge1xuICAgICAgdmFyIGhhc1N0YWNrID0gKGFyZ3VtZW50c1sxXSAmJiBhcmd1bWVudHNbMV0uc3RhY2spO1xuICAgICAgdmFyIGhhc0xpc3RlbmVycyA9ICh0aGlzLmxpc3RlbmVycyh0eXBlKS5sZW5ndGggPiAwKTtcblxuICAgICAgaWYgKGhhc1N0YWNrICYmICFoYXNMaXN0ZW5lcnMpIHtcbiAgICAgICAgcmV0dXJuIHByaW50RXJyb3JBbmRFeGl0KGFyZ3VtZW50c1sxXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yaWdFbWl0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH07XG59XG5cbnZhciBvcmlnaW5hbFJldHJpZXZlRmlsZUhhbmRsZXJzID0gcmV0cmlldmVGaWxlSGFuZGxlcnMuc2xpY2UoMCk7XG52YXIgb3JpZ2luYWxSZXRyaWV2ZU1hcEhhbmRsZXJzID0gcmV0cmlldmVNYXBIYW5kbGVycy5zbGljZSgwKTtcblxuZXhwb3J0cy53cmFwQ2FsbFNpdGUgPSB3cmFwQ2FsbFNpdGU7XG5leHBvcnRzLmdldEVycm9yU291cmNlID0gZ2V0RXJyb3JTb3VyY2U7XG5leHBvcnRzLm1hcFNvdXJjZVBvc2l0aW9uID0gbWFwU291cmNlUG9zaXRpb247XG5leHBvcnRzLnJldHJpZXZlU291cmNlTWFwID0gcmV0cmlldmVTb3VyY2VNYXA7XG5cbmV4cG9ydHMuaW5zdGFsbCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgaWYgKG9wdGlvbnMuZW52aXJvbm1lbnQpIHtcbiAgICBlbnZpcm9ubWVudCA9IG9wdGlvbnMuZW52aXJvbm1lbnQ7XG4gICAgaWYgKFtcIm5vZGVcIiwgXCJicm93c2VyXCIsIFwiYXV0b1wiXS5pbmRleE9mKGVudmlyb25tZW50KSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImVudmlyb25tZW50IFwiICsgZW52aXJvbm1lbnQgKyBcIiB3YXMgdW5rbm93bi4gQXZhaWxhYmxlIG9wdGlvbnMgYXJlIHthdXRvLCBicm93c2VyLCBub2RlfVwiKVxuICAgIH1cbiAgfVxuXG4gIC8vIEFsbG93IHNvdXJjZXMgdG8gYmUgZm91bmQgYnkgbWV0aG9kcyBvdGhlciB0aGFuIHJlYWRpbmcgdGhlIGZpbGVzXG4gIC8vIGRpcmVjdGx5IGZyb20gZGlzay5cbiAgaWYgKG9wdGlvbnMucmV0cmlldmVGaWxlKSB7XG4gICAgaWYgKG9wdGlvbnMub3ZlcnJpZGVSZXRyaWV2ZUZpbGUpIHtcbiAgICAgIHJldHJpZXZlRmlsZUhhbmRsZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgcmV0cmlldmVGaWxlSGFuZGxlcnMudW5zaGlmdChvcHRpb25zLnJldHJpZXZlRmlsZSk7XG4gIH1cblxuICAvLyBBbGxvdyBzb3VyY2UgbWFwcyB0byBiZSBmb3VuZCBieSBtZXRob2RzIG90aGVyIHRoYW4gcmVhZGluZyB0aGUgZmlsZXNcbiAgLy8gZGlyZWN0bHkgZnJvbSBkaXNrLlxuICBpZiAob3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCkge1xuICAgIGlmIChvcHRpb25zLm92ZXJyaWRlUmV0cmlldmVTb3VyY2VNYXApIHtcbiAgICAgIHJldHJpZXZlTWFwSGFuZGxlcnMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICByZXRyaWV2ZU1hcEhhbmRsZXJzLnVuc2hpZnQob3B0aW9ucy5yZXRyaWV2ZVNvdXJjZU1hcCk7XG4gIH1cblxuICAvLyBTdXBwb3J0IHJ1bnRpbWUgdHJhbnNwaWxlcnMgdGhhdCBpbmNsdWRlIGlubGluZSBzb3VyY2UgbWFwc1xuICBpZiAob3B0aW9ucy5ob29rUmVxdWlyZSAmJiAhaXNJbkJyb3dzZXIoKSkge1xuICAgIC8vIFVzZSBkeW5hbWljUmVxdWlyZSB0byBhdm9pZCBpbmNsdWRpbmcgaW4gYnJvd3NlciBidW5kbGVzXG4gICAgdmFyIE1vZHVsZSA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJ21vZHVsZScpO1xuICAgIHZhciAkY29tcGlsZSA9IE1vZHVsZS5wcm90b3R5cGUuX2NvbXBpbGU7XG5cbiAgICBpZiAoISRjb21waWxlLl9fc291cmNlTWFwU3VwcG9ydCkge1xuICAgICAgTW9kdWxlLnByb3RvdHlwZS5fY29tcGlsZSA9IGZ1bmN0aW9uKGNvbnRlbnQsIGZpbGVuYW1lKSB7XG4gICAgICAgIGZpbGVDb250ZW50c0NhY2hlW2ZpbGVuYW1lXSA9IGNvbnRlbnQ7XG4gICAgICAgIHNvdXJjZU1hcENhY2hlW2ZpbGVuYW1lXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuICRjb21waWxlLmNhbGwodGhpcywgY29udGVudCwgZmlsZW5hbWUpO1xuICAgICAgfTtcblxuICAgICAgTW9kdWxlLnByb3RvdHlwZS5fY29tcGlsZS5fX3NvdXJjZU1hcFN1cHBvcnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIENvbmZpZ3VyZSBvcHRpb25zXG4gIGlmICghZW1wdHlDYWNoZUJldHdlZW5PcGVyYXRpb25zKSB7XG4gICAgZW1wdHlDYWNoZUJldHdlZW5PcGVyYXRpb25zID0gJ2VtcHR5Q2FjaGVCZXR3ZWVuT3BlcmF0aW9ucycgaW4gb3B0aW9ucyA/XG4gICAgICBvcHRpb25zLmVtcHR5Q2FjaGVCZXR3ZWVuT3BlcmF0aW9ucyA6IGZhbHNlO1xuICB9XG5cbiAgLy8gSW5zdGFsbCB0aGUgZXJyb3IgcmVmb3JtYXR0ZXJcbiAgaWYgKCFlcnJvckZvcm1hdHRlckluc3RhbGxlZCkge1xuICAgIGVycm9yRm9ybWF0dGVySW5zdGFsbGVkID0gdHJ1ZTtcbiAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHByZXBhcmVTdGFja1RyYWNlO1xuICB9XG5cbiAgaWYgKCF1bmNhdWdodFNoaW1JbnN0YWxsZWQpIHtcbiAgICB2YXIgaW5zdGFsbEhhbmRsZXIgPSAnaGFuZGxlVW5jYXVnaHRFeGNlcHRpb25zJyBpbiBvcHRpb25zID9cbiAgICAgIG9wdGlvbnMuaGFuZGxlVW5jYXVnaHRFeGNlcHRpb25zIDogdHJ1ZTtcblxuICAgIC8vIERvIG5vdCBvdmVycmlkZSAndW5jYXVnaHRFeGNlcHRpb24nIHdpdGggb3VyIG93biBoYW5kbGVyIGluIE5vZGUuanNcbiAgICAvLyBXb3JrZXIgdGhyZWFkcy4gV29ya2VycyBwYXNzIHRoZSBlcnJvciB0byB0aGUgbWFpbiB0aHJlYWQgYXMgYW4gZXZlbnQsXG4gICAgLy8gcmF0aGVyIHRoYW4gcHJpbnRpbmcgc29tZXRoaW5nIHRvIHN0ZGVyciBhbmQgZXhpdGluZy5cbiAgICB0cnkge1xuICAgICAgLy8gV2UgbmVlZCB0byB1c2UgYGR5bmFtaWNSZXF1aXJlYCBiZWNhdXNlIGByZXF1aXJlYCBvbiBpdCdzIG93biB3aWxsIGJlIG9wdGltaXplZCBieSBXZWJQYWNrL0Jyb3dzZXJpZnkuXG4gICAgICB2YXIgd29ya2VyX3RocmVhZHMgPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICd3b3JrZXJfdGhyZWFkcycpO1xuICAgICAgaWYgKHdvcmtlcl90aHJlYWRzLmlzTWFpblRocmVhZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgaW5zdGFsbEhhbmRsZXIgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGUpIHt9XG5cbiAgICAvLyBQcm92aWRlIHRoZSBvcHRpb24gdG8gbm90IGluc3RhbGwgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyLiBUaGlzIGlzXG4gICAgLy8gdG8gc3VwcG9ydCBvdGhlciB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlcnMgKGluIHRlc3QgZnJhbWV3b3JrcywgZm9yXG4gICAgLy8gZXhhbXBsZSkuIElmIHRoaXMgaGFuZGxlciBpcyBub3QgaW5zdGFsbGVkIGFuZCB0aGVyZSBhcmUgbm8gb3RoZXIgdW5jYXVnaHRcbiAgICAvLyBleGNlcHRpb24gaGFuZGxlcnMsIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgd2lsbCBiZSBjYXVnaHQgYnkgbm9kZSdzIGJ1aWx0LWluXG4gICAgLy8gZXhjZXB0aW9uIGhhbmRsZXIgYW5kIHRoZSBwcm9jZXNzIHdpbGwgc3RpbGwgYmUgdGVybWluYXRlZC4gSG93ZXZlciwgdGhlXG4gICAgLy8gZ2VuZXJhdGVkIEphdmFTY3JpcHQgY29kZSB3aWxsIGJlIHNob3duIGFib3ZlIHRoZSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mXG4gICAgLy8gdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICAgIGlmIChpbnN0YWxsSGFuZGxlciAmJiBoYXNHbG9iYWxQcm9jZXNzRXZlbnRFbWl0dGVyKCkpIHtcbiAgICAgIHVuY2F1Z2h0U2hpbUluc3RhbGxlZCA9IHRydWU7XG4gICAgICBzaGltRW1pdFVuY2F1Z2h0RXhjZXB0aW9uKCk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnRzLnJlc2V0UmV0cmlldmVIYW5kbGVycyA9IGZ1bmN0aW9uKCkge1xuICByZXRyaWV2ZUZpbGVIYW5kbGVycy5sZW5ndGggPSAwO1xuICByZXRyaWV2ZU1hcEhhbmRsZXJzLmxlbmd0aCA9IDA7XG5cbiAgcmV0cmlldmVGaWxlSGFuZGxlcnMgPSBvcmlnaW5hbFJldHJpZXZlRmlsZUhhbmRsZXJzLnNsaWNlKDApO1xuICByZXRyaWV2ZU1hcEhhbmRsZXJzID0gb3JpZ2luYWxSZXRyaWV2ZU1hcEhhbmRsZXJzLnNsaWNlKDApO1xuXG4gIHJldHJpZXZlU291cmNlTWFwID0gaGFuZGxlckV4ZWMocmV0cmlldmVNYXBIYW5kbGVycyk7XG4gIHJldHJpZXZlRmlsZSA9IGhhbmRsZXJFeGVjKHJldHJpZXZlRmlsZUhhbmRsZXJzKTtcbn1cbiIsICIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCBwcm9ncmFtIGZyb20gJ2NvbW1hbmRlcidcblxuaW1wb3J0IHsgZ2V0Q291bnRyeUZsYWcgfSBmcm9tICcuL2luZGV4J1xuaW1wb3J0ICogYXMgU2VudHJ5IGZyb20gXCJAc2VudHJ5L25vZGVcIjtcblxuLy8gSW1wb3J0aW5nIEBzZW50cnkvdHJhY2luZyBwYXRjaGVzIHRoZSBnbG9iYWwgaHViIGZvciB0cmFjaW5nIHRvIHdvcmsuXG5pbXBvcnQgKiBhcyBUcmFjaW5nIGZyb20gXCJAc2VudHJ5L3RyYWNpbmdcIjtcbmltcG9ydCB7IFJld3JpdGVGcmFtZXMgfSBmcm9tICdAc2VudHJ5L2ludGVncmF0aW9ucyc7XG5pbXBvcnQgJ3NvdXJjZS1tYXAtc3VwcG9ydC9yZWdpc3Rlcic7XG5cblNlbnRyeS5pbml0KHtcbiAgZHNuOiBcImh0dHBzOi8vYWVjMDg3M2U3NTBjNDliMDgyZmUzNTk0ZGVmMTVhZjFAbzExMTYxMzIuaW5nZXN0LnNlbnRyeS5pby82MTQ5MjgwXCIsXG5cbiAgLy8gV2UgcmVjb21tZW5kIGFkanVzdGluZyB0aGlzIHZhbHVlIGluIHByb2R1Y3Rpb24sIG9yIHVzaW5nIHRyYWNlc1NhbXBsZXJcbiAgLy8gZm9yIGZpbmVyIGNvbnRyb2xcbiAgdHJhY2VzU2FtcGxlUmF0ZTogMS4wLFxuICBpbnRlZ3JhdGlvbnM6IFtuZXcgUmV3cml0ZUZyYW1lcyh7cm9vdDogZ2xvYmFsLl9fcm9vdGRpcl9ffSldXG59KTtcblxucHJvZ3JhbVxuICAudmVyc2lvbignMC4xLjAnKVxuICAubmFtZSgnY291bnRyeS1mbGFnLWNsaScpXG4gIC5jb21tYW5kKCdnZXQgPGZsYWc+JylcbiAgLmFjdGlvbigoZmxhZykgPT4ge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gU2VudHJ5LnN0YXJ0VHJhbnNhY3Rpb24oe1xuICAgICAgb3A6IFwiZ2V0IGZsYWcgZnJvbSAyIGFscGhhIGNvZGVcIixcbiAgICAgIG5hbWU6IFwiR0VUIGZsYWcgZnJvbSAyIGFscGhhIGNvZGVcIlxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGdldENvdW50cnlGbGFnKGZsYWcpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYEZsYWc6ICR7ZmxhZ30gXFxuUmVzdWx0OiAke3Jlc3VsdH1cXG5gKVxuICAgICAgY29uc29sZS5sb2cocmVzdWx0KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgU2VudHJ5LmNhcHR1cmVFeGNlcHRpb24oZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyYW5zYWN0aW9uLmZpbmlzaCgpXG4gICAgfVxuICB9KVxuXG5wcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndilcbiIsICJleHBvcnQgZnVuY3Rpb24gZ2V0Q291bnRyeUZsYWcgKGNvdW50cnlDb2RlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoY291bnRyeUNvZGUubGVuZ3RoICE9IDIpIHsgcmV0dXJuIHVuZGVmaW5lZH1cbiAgcmV0dXJuIGNvdW50cnlDb2RlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLi9nLCBjaGFyID0+IFxuICAgICAgU3RyaW5nLmZyb21Db2RlUG9pbnQoMTI3Mzk3ICsgY2hhci5jaGFyQ29kZUF0KDApKSk7XG59XG4gICIsICJyZXF1aXJlKCcuLycpLmluc3RhbGwoKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7cW1CQUFBLG1CQUlBLEdBQUksSUFBZSxRQUFRLFVBQVUsYUFDakMsR0FBUSxRQUFRLGlCQUFpQixNQUNqQyxHQUFPLFFBQVEsUUFDZixHQUFVLEdBQUssUUFDZixHQUFXLEdBQUssU0FDaEIsR0FBSyxRQUFRLE1BTWpCLFFBQVEsUUFBUSxTQUFTLEVBQVMsSUFNbEMsR0FBVSxHQUFPLFFBQVUsR0FBSSxHQU0vQixHQUFRLFFBQVUsRUFNbEIsR0FBUSxPQUFTLEdBVWpCLFlBQWdCLEVBQU8sRUFBYSxDQUNsQyxLQUFLLE1BQVEsRUFDYixLQUFLLFNBQVcsRUFBTSxRQUFRLE1BQVEsRUFDdEMsS0FBSyxTQUFXLEVBQU0sUUFBUSxNQUFRLEVBQ3RDLEtBQUssS0FBTyxFQUFNLFFBQVEsVUFBWSxHQUN0QyxFQUFRLEVBQU0sTUFBTSxVQUNoQixFQUFNLE9BQVMsR0FBSyxDQUFDLFFBQVEsS0FBSyxFQUFNLEtBQUssTUFBSyxNQUFRLEVBQU0sU0FDcEUsS0FBSyxLQUFPLEVBQU0sUUFDbEIsS0FBSyxZQUFjLEdBQWUsR0FVcEMsR0FBTyxVQUFVLEtBQU8sVUFBVyxDQUNqQyxNQUFPLE1BQUssS0FDVCxRQUFRLEtBQU0sSUFDZCxRQUFRLE1BQU8sS0FXcEIsR0FBTyxVQUFVLGNBQWdCLFVBQVcsQ0FDMUMsTUFBTyxJQUFVLEtBQUssU0FXeEIsR0FBTyxVQUFVLEdBQUssU0FBUyxFQUFLLENBQ2xDLE1BQU8sTUFBSyxRQUFVLEdBQU8sS0FBSyxPQUFTLEdBVTdDLFdBQWlCLEVBQU0sQ0FDckIsS0FBSyxTQUFXLEdBQ2hCLEtBQUssUUFBVSxHQUNmLEtBQUssT0FBUyxHQUNkLEtBQUssb0JBQXNCLEdBQzNCLEtBQUssTUFBUSxHQUNiLEtBQUssTUFBUSxHQUFRLEdBZ0V2QixFQUFRLFVBQVUsUUFBVSxTQUFTLEVBQU0sRUFBTSxFQUFNLENBQ3JELEFBQUksTUFBTyxJQUFTLFVBQVksSUFBUyxNQUN2QyxHQUFPLEVBQ1AsRUFBTyxNQUVULEVBQU8sR0FBUSxHQUNmLEdBQUksR0FBTyxFQUFLLE1BQU0sTUFDbEIsRUFBTSxHQUFJLEdBQVEsRUFBSyxTQWEzQixNQVhJLElBQ0YsR0FBSSxZQUFZLEdBQ2hCLEtBQUssWUFBYyxHQUNuQixLQUFLLE9BQU8sRUFBSSxPQUFTLEdBQ3JCLEVBQUssV0FBVyxNQUFLLGtCQUFvQixFQUFJLFFBRW5ELEVBQUksUUFBVSxDQUFDLENBQUMsRUFBSyxPQUNyQixLQUFLLFNBQVMsS0FBSyxHQUNuQixFQUFJLGtCQUFrQixHQUN0QixFQUFJLE9BQVMsS0FFVCxFQUFhLEtBQ1YsR0FTVCxFQUFRLFVBQVUsVUFBWSxTQUFTLEVBQU0sQ0FDM0MsTUFBTyxNQUFLLGtCQUFrQixFQUFLLE1BQU0sUUFVM0MsRUFBUSxVQUFVLHVCQUF5QixVQUFXLENBQ3BELEtBQUssUUFBUSxhQUFjLDJCQWE3QixFQUFRLFVBQVUsa0JBQW9CLFNBQVMsRUFBTSxDQUNuRCxHQUFJLEVBQUMsRUFBSyxPQUNWLElBQUksR0FBTyxLQUNYLFNBQUssUUFBUSxTQUFTLEVBQUssQ0FDekIsR0FBSSxHQUFhLENBQ2YsU0FBVSxHQUNWLEtBQU0sR0FDTixTQUFVLElBR1osT0FBUSxFQUFJLFFBQ0wsSUFDSCxFQUFXLFNBQVcsR0FDdEIsRUFBVyxLQUFPLEVBQUksTUFBTSxFQUFHLElBQy9CLFVBQ0csSUFDSCxFQUFXLEtBQU8sRUFBSSxNQUFNLEVBQUcsSUFDL0IsTUFHSixBQUFJLEVBQVcsS0FBSyxPQUFTLEdBQUssRUFBVyxLQUFLLE1BQU0sTUFBUSxPQUM5RCxHQUFXLFNBQVcsR0FDdEIsRUFBVyxLQUFPLEVBQVcsS0FBSyxNQUFNLEVBQUcsS0FFekMsRUFBVyxNQUNiLEVBQUssTUFBTSxLQUFLLEtBR2IsT0FvQlQsRUFBUSxVQUFVLE9BQVMsU0FBUyxFQUFJLENBQ3RDLEdBQUksR0FBTyxLQUNQLEVBQVcsU0FBUyxFQUFNLEVBQVMsQ0FFckMsRUFBTyxHQUFRLEdBQ2YsRUFBVSxHQUFXLEdBRXJCLEdBQUksR0FBUyxFQUFLLGFBQWEsR0FHL0IsR0FBc0IsRUFBTSxFQUFPLFNBSy9CLEVBQU8sUUFBUSxPQUFTLEdBQzFCLEVBQUssY0FBYyxFQUFPLFFBQVEsSUFJaEMsRUFBTyxLQUFLLFFBQVEsR0FBTyxFQUFPLEtBQUssT0FBTyxJQUVsRCxFQUFLLE1BQU0sUUFBUSxTQUFTLEVBQUssRUFBRyxDQUNsQyxBQUFJLEVBQUksVUFBWSxFQUFLLElBQU0sS0FDN0IsRUFBSyxnQkFBZ0IsRUFBSSxNQUNoQixFQUFJLFVBQ1QsS0FBTSxFQUFLLE1BQU0sT0FBUyxHQUM1QixFQUFLLG1CQUFtQixFQUFJLE1BRzlCLEVBQUssR0FBSyxFQUFLLE9BQU8sTUFPMUIsQUFBSSxFQUFLLE1BQU0sT0FDYixFQUFLLEVBQUssTUFBTSxRQUFVLEVBRTFCLEVBQUssS0FBSyxHQUdaLEVBQUcsTUFBTSxFQUFNLElBRWIsRUFBUyxLQUFLLFFBQVUsS0FDeEIsRUFBTyxJQUFXLEtBQU8sSUFBTSxLQUFLLE1BQ3hDLFNBQU8sR0FBRyxXQUFhLEVBQU0sR0FDekIsS0FBSyxRQUFRLEVBQU8sR0FBRyxXQUFhLEtBQUssT0FBUSxHQUM5QyxNQW9EVCxFQUFRLFVBQVUsT0FBUyxTQUFTLEVBQU8sRUFBYSxFQUFJLEVBQWMsQ0FDeEUsR0FBSSxHQUFPLEtBQ1QsRUFBUyxHQUFJLElBQU8sRUFBTyxHQUMzQixFQUFRLEVBQU8sT0FDZixFQUFPLEVBQU8sZ0JBR2hCLEdBQUksTUFBTyxJQUFPLFdBQ2hCLEdBQUksWUFBYyxRQUFRLENBQ3hCLEdBQUksR0FBUSxFQUNaLEVBQUssU0FBUyxFQUFLLEVBQUssQ0FDdEIsR0FBSSxHQUFJLEVBQU0sS0FBSyxHQUNuQixNQUFPLEdBQUksRUFBRSxHQUFLLE9BR3BCLEdBQWUsRUFDZixFQUFLLEtBS1QsTUFBSSxFQUFDLEVBQU8sTUFBUSxFQUFPLFVBQVksRUFBTyxXQUV2QyxHQUFPLE1BQU0sR0FBZSxJQUU3QixJQUFpQixRQUNuQixHQUFLLEdBQVEsRUFDYixFQUFPLGFBQWUsSUFLMUIsS0FBSyxRQUFRLEtBQUssR0FJbEIsS0FBSyxHQUFHLFVBQVksRUFBTyxTQUFTLEVBQUssQ0FFdkMsQUFBSSxJQUFRLE1BQVEsR0FDbEIsR0FBTSxFQUFHLEVBQUssRUFBSyxLQUFVLE9BQVksRUFBZSxFQUFLLEtBSS9ELEFBQUksTUFBTyxHQUFLLElBQVUsV0FBYSxNQUFPLEdBQUssSUFBVSxZQUUzRCxBQUFJLEdBQU8sS0FDVCxFQUFLLEdBQVEsRUFBTyxLQUNoQixHQUFnQixHQUNoQixHQUVKLEVBQUssR0FBUSxFQUVOLElBQVEsTUFFakIsR0FBSyxHQUFRLEtBSVYsTUFVVCxFQUFRLFVBQVUsbUJBQXFCLFNBQVMsRUFBSyxDQUNuRCxZQUFLLG9CQUFzQixVQUFVLFNBQVcsR0FBSyxFQUM5QyxNQVdULEVBQVEsVUFBVSxNQUFRLFNBQVMsRUFBTSxDQUV2QyxBQUFJLEtBQUssYUFBYSxLQUFLLHlCQUczQixLQUFLLFFBQVUsRUFHZixLQUFLLE1BQVEsS0FBSyxPQUFTLEdBQVMsRUFBSyxHQUFJLE9BR3pDLEtBQUssYUFBZSxFQUFLLE9BQVMsR0FBSyxDQUFDLEtBQUssbUJBRS9DLEVBQUssS0FBSyxVQUlaLEdBQUksR0FBUyxLQUFLLGFBQWEsS0FBSyxVQUFVLEVBQUssTUFBTSxLQUNyRCxFQUFPLEtBQUssS0FBTyxFQUFPLEtBRTFCLEVBQVMsS0FBSyxVQUFVLEtBQUssS0FBTSxFQUFPLFNBRzFDLEVBQU8sRUFBTyxLQUFLLEdBRW5CLEVBQWUsS0FRbkIsTUFOSSxJQUNGLEdBQWUsS0FBSyxTQUFTLE9BQU8sU0FBUyxFQUFTLENBQ3BELE1BQU8sR0FBUSxVQUFZLElBQzFCLElBR0QsS0FBSyxPQUFPLEtBQVUsR0FDakIsS0FBSyxrQkFBa0IsRUFBTSxFQUFNLEVBQU8sU0FDeEMsRUFFVCxHQUFLLEdBQUssRUFBYSxNQUNoQixLQUFLLGtCQUFrQixFQUFNLEVBQU0sRUFBTyxVQUN4QyxLQUFLLGtCQUVkLEdBQUssUUFBUSxLQUFLLG1CQUNYLEtBQUssa0JBQWtCLEVBQU0sRUFBTSxFQUFPLFVBRzVDLEdBWVQsRUFBUSxVQUFVLGtCQUFvQixTQUFTLEVBQU0sRUFBTSxFQUFTLENBQ2xFLEVBQU8sRUFBSyxPQUFPLEdBRWQsRUFBSyxRQUFRLEtBQUssT0FDbkIsRUFBSyxLQUFPLFFBQVUsRUFBSyxTQUFXLEdBQUcsS0FBSyxPQUc5QyxFQUFLLEtBQU8sUUFDZCxHQUFLLEdBQUssRUFBSyxHQUNmLEVBQUssR0FBSyxVQUlaLEdBQUksR0FBSSxFQUFLLEdBRVQsRUFBTSxHQUFTLEVBQUcsR0FBSyxRQUFRLElBQU0sSUFBTSxFQUFLLEdBSWhELEVBRUEsRUFBZSxHQUFHLGFBQWEsR0FFbkMsRUFBVSxHQUFRLEdBR2xCLEdBQUksR0FBVyxHQUFLLEtBQUssRUFBUyxHQUc5QixFQUFlLEdBQ25CLEFBQUksR0FBTyxFQUFXLE9BQ3BCLEdBQU0sRUFBVyxNQUNqQixFQUFlLElBQ1YsQUFBSSxHQUFPLEVBQVcsT0FDM0IsR0FBTSxFQUFXLE1BQ2pCLEVBQWUsSUFDTixHQUFPLElBQ2hCLEdBQU0sR0FHUixFQUFPLEVBQUssTUFBTSxHQUVsQixHQUFJLEdBQ0osQUFBSSxRQUFRLFdBQWEsUUFDdkIsQUFBSSxFQUNGLEdBQUssUUFBUSxHQUViLEVBQVEsU0FBUSxVQUFZLElBQUksT0FBTyxHQUV2QyxFQUFPLEdBQU0sUUFBUSxLQUFLLEdBQUksRUFBTSxDQUFFLE1BQU8sVUFBVyxVQUFXLENBQUMsRUFBRyxFQUFHLE1BRTFFLEVBQU8sR0FBTSxFQUFLLEVBQU0sQ0FBRSxNQUFPLFVBQVcsVUFBVyxDQUFDLEVBQUcsRUFBRyxLQUdoRSxHQUFLLFFBQVEsR0FDYixFQUFPLEdBQU0sUUFBUSxTQUFVLEVBQU0sQ0FBRSxNQUFPLGFBR2hELEdBQUksR0FBVSxDQUFDLFVBQVcsVUFBVyxVQUFXLFNBQVUsVUFDMUQsRUFBUSxRQUFRLFNBQVMsRUFBUSxDQUMvQixRQUFRLEdBQUcsRUFBUSxVQUFXLENBQzVCLEFBQUksRUFBSyxTQUFXLElBQVMsRUFBSyxXQUFhLE1BQzdDLEVBQUssS0FBSyxPQUloQixFQUFLLEdBQUcsUUFBUyxRQUFRLEtBQUssS0FBSyxVQUNuQyxFQUFLLEdBQUcsUUFBUyxTQUFTLEVBQUssQ0FDN0IsQUFBSSxFQUFJLE9BQVMsU0FDZixRQUFRLE1BQU0sMENBQTJDLEdBQ2hELEVBQUksT0FBUyxVQUN0QixRQUFRLE1BQU0sMERBQTJELEdBRTNFLFFBQVEsS0FBSyxLQUlmLEtBQUssZUFBaUIsR0FheEIsRUFBUSxVQUFVLFVBQVksU0FBUyxFQUFNLENBTTNDLE9BTEksR0FBTSxHQUNSLEVBQ0EsRUFDQSxFQUVPLEVBQUksRUFBRyxFQUFNLEVBQUssT0FBUSxFQUFJLEVBQUssRUFBRSxFQU01QyxHQUxBLEVBQU0sRUFBSyxHQUNQLEVBQUksR0FDTixHQUFVLEtBQUssVUFBVSxFQUFLLEVBQUksS0FHaEMsSUFBUSxLQUFNLENBRWhCLEVBQU0sRUFBSSxPQUFPLEVBQUssTUFBTSxJQUM1QixVQUNLLEFBQUksSUFBVyxFQUFRLFNBQzVCLEVBQUksS0FBSyxHQUNKLEFBQUksRUFBSSxPQUFTLEdBQUssRUFBSSxLQUFPLEtBQU8sRUFBSSxLQUFPLElBQ3hELEVBQUksTUFBTSxHQUFHLE1BQU0sSUFBSSxRQUFRLFNBQVMsRUFBRyxDQUN6QyxFQUFJLEtBQUssSUFBTSxLQUVaLEFBQUksTUFBTSxLQUFLLElBQVEsQ0FBRSxHQUFRLEVBQUksUUFBUSxNQUNsRCxFQUFJLEtBQUssRUFBSSxNQUFNLEVBQUcsR0FBUSxFQUFJLE1BQU0sRUFBUSxJQUVoRCxFQUFJLEtBQUssR0FJYixNQUFPLElBZVQsRUFBUSxVQUFVLFVBQVksU0FBUyxFQUFNLEVBQVMsQ0FDcEQsR0FBSSxHQUVKLE1BQUksR0FBSyxPQUNQLEdBQU8sRUFBSyxHQUNaLEFBQUksS0FBSyxVQUFVLFdBQWEsR0FBTSxPQUNwQyxLQUFLLEtBQUssV0FBYSxFQUFLLFFBQVMsRUFBTSxHQUUzQyxLQUFLLEtBQUssWUFBYSxJQUd6QixJQUFzQixLQUFNLEdBSXhCLEVBQVEsT0FBUyxHQUNuQixLQUFLLGNBQWMsRUFBUSxJQUV6QixLQUFLLFNBQVMsU0FBVyxHQUN6QixLQUFLLE1BQU0sT0FBTyxTQUFTLEVBQUcsQ0FBRSxNQUFPLEdBQUUsV0FBYSxTQUFXLEdBQ25FLEtBQUssS0FBSyxjQUlQLE1BV1QsRUFBUSxVQUFVLFVBQVksU0FBUyxFQUFLLENBQzFDLE9BQVMsR0FBSSxFQUFHLEVBQU0sS0FBSyxRQUFRLE9BQVEsRUFBSSxFQUFLLEVBQUUsRUFDcEQsR0FBSSxLQUFLLFFBQVEsR0FBRyxHQUFHLEdBQ3JCLE1BQU8sTUFBSyxRQUFRLElBYzFCLEVBQVEsVUFBVSxhQUFlLFNBQVMsRUFBTSxDQVU5QyxPQVRJLEdBQU8sR0FDVCxFQUFNLEVBQUssT0FDWCxFQUNBLEVBQ0EsRUFFRSxFQUFpQixHQUdaLEVBQUksRUFBRyxFQUFJLEVBQUssRUFBRSxFQUFHLENBSTVCLEdBSEEsRUFBTSxFQUFLLEdBR1AsRUFBUyxDQUNYLEVBQUssS0FBSyxHQUNWLFNBR0YsR0FBSSxJQUFRLEtBQU0sQ0FDaEIsRUFBVSxHQUNWLFNBT0YsR0FIQSxFQUFTLEtBQUssVUFBVSxHQUdwQixFQUFRLENBRVYsR0FBSSxFQUFPLFNBQVUsQ0FFbkIsR0FEQSxFQUFNLEVBQUssRUFBRSxHQUNULEdBQU8sS0FBTSxNQUFPLE1BQUssc0JBQXNCLEdBQ25ELEtBQUssS0FBSyxVQUFZLEVBQU8sT0FBUSxPQUVoQyxBQUFJLEdBQU8sU0FDaEIsR0FBTSxFQUFLLEVBQUksR0FDZixBQUFJLEdBQU8sTUFBUyxFQUFJLEtBQU8sS0FBTyxJQUFRLElBQzVDLEVBQU0sS0FFTixFQUFFLEVBRUosS0FBSyxLQUFLLFVBQVksRUFBTyxPQUFRLElBR3JDLEtBQUssS0FBSyxVQUFZLEVBQU8sUUFFL0IsU0FJRixHQUFJLEVBQUksT0FBUyxHQUFLLEVBQUksS0FBTyxJQUFLLENBQ3BDLEVBQWUsS0FBSyxHQUtmLEVBQUksRUFBSyxFQUFLLFFBQVUsRUFBSyxFQUFJLEdBQUcsS0FBTyxLQUM5QyxFQUFlLEtBQUssRUFBSyxFQUFFLElBRTdCLFNBSUYsRUFBSyxLQUFLLEdBR1osTUFBTyxDQUFFLEtBQU0sRUFBTSxRQUFTLElBU2hDLEVBQVEsVUFBVSxLQUFPLFVBQVcsQ0FJbEMsT0FISSxHQUFTLEdBQ1gsRUFBTSxLQUFLLFFBQVEsT0FFWixFQUFJLEVBQUcsRUFBSSxFQUFLLElBQUssQ0FDNUIsR0FBSSxHQUFNLEtBQUssUUFBUSxHQUFHLGdCQUMxQixFQUFPLEdBQU8sSUFBUSxLQUFLLG1CQUFxQixLQUFLLFNBQVcsS0FBSyxHQUV2RSxNQUFPLElBVVQsRUFBUSxVQUFVLGdCQUFrQixTQUFTLEVBQU0sQ0FDakQsUUFBUSxNQUFNLHdDQUF5QyxHQUN2RCxRQUFRLEtBQUssSUFXZixFQUFRLFVBQVUsc0JBQXdCLFNBQVMsRUFBUSxFQUFNLENBQy9ELEFBQUksRUFDRixRQUFRLE1BQU0sZ0RBQWlELEVBQU8sTUFBTyxHQUU3RSxRQUFRLE1BQU0sc0NBQXVDLEVBQU8sT0FFOUQsUUFBUSxLQUFLLElBVWYsRUFBUSxVQUFVLGNBQWdCLFNBQVMsRUFBTSxDQUMvQyxBQUFJLEtBQUsscUJBQ1QsU0FBUSxNQUFNLDZCQUE4QixHQUM1QyxRQUFRLEtBQUssS0FVZixFQUFRLFVBQVUsbUJBQXFCLFNBQVMsRUFBTSxDQUNwRCxRQUFRLE1BQU0sOENBQStDLEdBQzdELFFBQVEsS0FBSyxJQWVmLEVBQVEsVUFBVSxRQUFVLFNBQVMsRUFBSyxFQUFPLENBQy9DLEdBQUksVUFBVSxTQUFXLEVBQUcsTUFBTyxNQUFLLFNBQ3hDLEtBQUssU0FBVyxFQUNoQixFQUFRLEdBQVMsZ0JBQ2pCLEdBQUksR0FBZ0IsR0FBSSxJQUFPLEVBQU8sNkJBQ3RDLFlBQUssbUJBQXFCLEVBQWMsS0FBSyxPQUFPLElBQU0sVUFDMUQsS0FBSyxRQUFRLEtBQUssR0FDbEIsS0FBSyxHQUFHLFVBQVksS0FBSyxtQkFBb0IsVUFBVyxDQUN0RCxRQUFRLE9BQU8sTUFBTSxFQUFNO0FBQUEsR0FDM0IsUUFBUSxLQUFLLEtBRVIsTUFZVCxFQUFRLFVBQVUsWUFBYyxTQUFTLEVBQUssRUFBaUIsQ0FDN0QsTUFBSSxXQUFVLFNBQVcsRUFBVSxLQUFLLGFBQ3hDLE1BQUssYUFBZSxFQUNwQixLQUFLLGlCQUFtQixFQUNqQixPQVdULEVBQVEsVUFBVSxNQUFRLFNBQVMsRUFBTyxDQUN4QyxHQUFJLEdBQVUsS0FLZCxHQUpJLEtBQUssU0FBUyxTQUFXLEdBQzNCLEdBQVUsS0FBSyxTQUFTLEtBQUssU0FBUyxPQUFTLElBRzdDLFVBQVUsU0FBVyxFQUFHLE1BQU8sR0FBUSxPQUUzQyxHQUFJLElBQVUsRUFBUSxNQUFPLEtBQU0sSUFBSSxPQUFNLCtDQUU3QyxTQUFRLE9BQVMsRUFDVixNQVdULEVBQVEsVUFBVSxNQUFRLFNBQVMsRUFBSyxDQUN0QyxHQUFJLEdBQU8sS0FBSyxNQUFNLElBQUksU0FBUyxFQUFLLENBQ3RDLE1BQU8sSUFBcUIsS0FHMUIsRUFBUSxZQUNULE1BQUssU0FBUyxPQUFTLGFBQWUsSUFDdEMsTUFBSyxNQUFNLE9BQVMsSUFBTSxFQUFLLEtBQUssS0FBTyxJQUU5QyxNQUFJLFdBQVUsU0FBVyxFQUFVLEtBQUssUUFBVSxFQUNsRCxNQUFLLE9BQVMsRUFFUCxPQVdULEVBQVEsVUFBVSxLQUFPLFNBQVMsRUFBSyxDQUNyQyxNQUFJLFdBQVUsU0FBVyxFQUFVLEtBQUssTUFDeEMsTUFBSyxNQUFRLEVBQ04sT0FVVCxFQUFRLFVBQVUsZ0JBQWtCLFVBQVcsQ0FDN0MsTUFBTyxNQUFLLFNBQVMsT0FBTyxTQUFTLEVBQUssQ0FDeEMsTUFBTyxDQUFDLEVBQUksVUFDWCxJQUFJLFNBQVMsRUFBSyxDQUNuQixHQUFJLEdBQU8sRUFBSSxNQUFNLElBQUksU0FBUyxFQUFLLENBQ3JDLE1BQU8sSUFBcUIsS0FDM0IsS0FBSyxLQUVSLE1BQU8sQ0FDTCxFQUFJLE1BQ0QsR0FBSSxPQUFTLElBQU0sRUFBSSxPQUFTLElBQ2hDLEdBQUksUUFBUSxPQUFTLGFBQWUsSUFDcEMsR0FBTyxJQUFNLEVBQU8sSUFDdkIsRUFBSSxpQkFZVixFQUFRLFVBQVUscUJBQXVCLFVBQVcsQ0FDbEQsR0FBSSxHQUFXLEtBQUssa0JBQ3BCLE1BQU8sR0FBUyxPQUFPLFNBQVMsRUFBSyxFQUFTLENBQzVDLE1BQU8sTUFBSyxJQUFJLEVBQUssRUFBUSxHQUFHLFNBQy9CLElBVUwsRUFBUSxVQUFVLG9CQUFzQixVQUFXLENBQ2pELEdBQUksR0FBVSxHQUFHLE1BQU0sS0FBSyxLQUFLLFNBQ2pDLFNBQVEsS0FBSyxDQUNYLE1BQU8sZUFFRixFQUFRLE9BQU8sU0FBUyxFQUFLLEVBQVEsQ0FDMUMsTUFBTyxNQUFLLElBQUksRUFBSyxFQUFPLE1BQU0sU0FDakMsSUFVTCxFQUFRLFVBQVUsaUJBQW1CLFVBQVcsQ0FDOUMsTUFBTyxNQUFLLE1BQU0sT0FBTyxTQUFTLEVBQUssRUFBSyxDQUMxQyxNQUFPLE1BQUssSUFBSSxFQUFLLEVBQUksS0FBSyxTQUM3QixJQVVMLEVBQVEsVUFBVSxTQUFXLFVBQVcsQ0FDdEMsR0FBSSxHQUFRLEtBQUssc0JBQ2pCLE1BQUksTUFBSyxrQkFBb0IsS0FBSyxNQUFNLFFBQ2xDLEtBQUssbUJBQXFCLEdBQzVCLEdBQVEsS0FBSyxvQkFJYixLQUFLLFVBQVksS0FBSyxTQUFTLFFBQzdCLEtBQUssdUJBQXlCLEdBQ2hDLEdBQVEsS0FBSyx3QkFJVixHQVVULEVBQVEsVUFBVSxXQUFhLFVBQVcsQ0FDeEMsR0FBSSxHQUFRLEtBQUssV0FHakIsTUFBTyxNQUFLLFFBQVEsSUFBSSxTQUFTLEVBQVEsQ0FDdkMsTUFBTyxJQUFJLEVBQU8sTUFBTyxHQUFTLEtBQU8sRUFBTyxZQUM1QyxHQUFPLE1BQVEsRUFBTyxlQUFpQixPQUFhLGNBQWdCLEtBQUssVUFBVSxFQUFPLGNBQWdCLElBQU0sTUFDbkgsT0FBTyxDQUFDLEdBQUksYUFBYyxHQUFTLCtCQUNuQyxLQUFLO0FBQUEsSUFVVixFQUFRLFVBQVUsWUFBYyxVQUFXLENBQ3pDLEdBQUksQ0FBQyxLQUFLLFNBQVMsT0FBUSxNQUFPLEdBRWxDLEdBQUksR0FBVyxLQUFLLGtCQUNoQixFQUFRLEtBQUssV0FFakIsTUFBTyxDQUNMLFlBQ0EsRUFBUyxJQUFJLFNBQVMsRUFBSyxDQUN6QixHQUFJLEdBQU8sRUFBSSxHQUFLLEtBQU8sRUFBSSxHQUFLLEdBQ3BDLE1BQVEsR0FBTyxHQUFJLEVBQUksR0FBSSxHQUFTLEVBQUksSUFBTSxJQUM3QyxLQUFLO0FBQUEsR0FBTSxRQUFRLE1BQU8sTUFDN0IsSUFDQSxLQUFLO0FBQUEsSUFVVCxFQUFRLFVBQVUsZ0JBQWtCLFVBQVcsQ0FDN0MsR0FBSSxHQUFPLEdBQ1gsR0FBSSxLQUFLLGFBQWMsQ0FDckIsRUFBTyxDQUNMLEtBQUssYUFDTCxJQUdGLEdBQUksR0FBa0IsS0FBSyxpQkFDM0IsR0FBSSxHQUFtQixLQUFLLE1BQU0sT0FBUSxDQUN4QyxHQUFJLEdBQVEsS0FBSyxXQUNqQixFQUFLLEtBQUssY0FDVixFQUFLLEtBQUssSUFDVixLQUFLLE1BQU0sUUFBUSxTQUFTLEVBQUssQ0FDL0IsRUFBSyxLQUFLLEtBQU8sR0FBSSxFQUFJLEtBQU0sR0FBUyxLQUFPLEVBQWdCLEVBQUksU0FFckUsRUFBSyxLQUFLLEtBSWQsR0FBSSxHQUFVLEtBQUssTUFDbkIsQUFBSSxLQUFLLFFBQ1AsR0FBVSxFQUFVLElBQU0sS0FBSyxRQUVqQyxHQUFJLEdBQVEsQ0FDVixVQUFZLEVBQVUsSUFBTSxLQUFLLFFBQ2pDLElBR0UsRUFBTyxHQUNQLEVBQWMsS0FBSyxjQUN2QixBQUFJLEdBQWEsR0FBTyxDQUFDLElBRXpCLEdBQUksR0FBVSxDQUNaLFdBQ0EsR0FBSyxLQUFLLGFBQWEsUUFBUSxNQUFPLE1BQ3RDLElBR0YsTUFBTyxHQUNKLE9BQU8sR0FDUCxPQUFPLEdBQ1AsT0FBTyxHQUNQLEtBQUs7QUFBQSxJQVNWLEVBQVEsVUFBVSxXQUFhLFNBQVMsRUFBSSxDQUMxQyxBQUFLLEdBQ0gsR0FBSyxTQUFTLEVBQVUsQ0FDdEIsTUFBTyxLQUdYLFFBQVEsT0FBTyxNQUFNLEVBQUcsS0FBSyxvQkFDN0IsS0FBSyxLQUFLLFdBU1osRUFBUSxVQUFVLEtBQU8sU0FBUyxFQUFJLENBQ3BDLEtBQUssV0FBVyxHQUNoQixRQUFRLFFBV1YsWUFBbUIsRUFBTSxDQUN2QixNQUFPLEdBQUssTUFBTSxLQUFLLE9BQU8sU0FBUyxFQUFLLEVBQU0sQ0FDaEQsTUFBTyxHQUFNLEVBQUssR0FBRyxjQUFnQixFQUFLLE1BQU0sS0FhcEQsWUFBYSxFQUFLLEVBQU8sQ0FDdkIsR0FBSSxHQUFNLEtBQUssSUFBSSxFQUFHLEVBQVEsRUFBSSxRQUNsQyxNQUFPLEdBQU0sTUFBTSxFQUFNLEdBQUcsS0FBSyxLQVduQyxZQUErQixFQUFLLEVBQVMsQ0FDM0MsRUFBVSxHQUFXLEdBQ3JCLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBUSxPQUFRLElBQ2xDLEFBQUksR0FBUSxLQUFPLFVBQVksRUFBUSxLQUFPLE9BQzVDLEdBQUksYUFDSixRQUFRLEtBQUssSUFhbkIsWUFBOEIsRUFBSyxDQUNqQyxHQUFJLEdBQWEsRUFBSSxLQUFRLEdBQUksV0FBYSxHQUFPLE1BQVEsSUFFN0QsTUFBTyxHQUFJLFNBQ1AsSUFBTSxFQUFhLElBQ25CLElBQU0sRUFBYSxJQUl6QixZQUFnQixFQUFNLENBQ3BCLEdBQUksQ0FDRixHQUFJLEdBQUcsU0FBUyxHQUFNLFNBQ3BCLE1BQU8sUUFFVCxDQUNBLE1BQU8sT0Nyc0NYLGtCQWdCQSxHQUFJLElBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDSixBQUFDLFVBQVUsRUFBUyxDQUNoQixHQUFJLEdBQU8sTUFBTyxTQUFXLFNBQVcsT0FBUyxNQUFPLE9BQVMsU0FBVyxLQUFPLE1BQU8sT0FBUyxTQUFXLEtBQU8sR0FDckgsQUFBSSxNQUFPLFNBQVcsWUFBYyxPQUFPLElBQ3ZDLE9BQU8sUUFBUyxDQUFDLFdBQVksU0FBVSxFQUFTLENBQUUsRUFBUSxFQUFlLEVBQU0sRUFBZSxPQUU3RixBQUFJLE1BQU8sS0FBVyxVQUFZLE1BQU8sSUFBTyxTQUFZLFNBQzdELEVBQVEsRUFBZSxFQUFNLEVBQWUsR0FBTyxXQUduRCxFQUFRLEVBQWUsSUFFM0IsV0FBd0IsRUFBUyxFQUFVLENBQ3ZDLE1BQUksS0FBWSxHQUNaLENBQUksTUFBTyxRQUFPLFFBQVcsV0FDekIsT0FBTyxlQUFlLEVBQVMsYUFBYyxDQUFFLE1BQU8sS0FHdEQsRUFBUSxXQUFhLElBR3RCLFNBQVUsRUFBSSxFQUFHLENBQUUsTUFBTyxHQUFRLEdBQU0sRUFBVyxFQUFTLEVBQUksR0FBSyxNQUduRixTQUFVLEVBQVUsQ0FDakIsR0FBSSxHQUFnQixPQUFPLGdCQUN0QixDQUFFLFVBQVcsYUFBZ0IsUUFBUyxTQUFVLEVBQUcsRUFBRyxDQUFFLEVBQUUsVUFBWSxJQUN2RSxTQUFVLEVBQUcsRUFBRyxDQUFFLE9BQVMsS0FBSyxHQUFHLEFBQUksRUFBRSxlQUFlLElBQUksR0FBRSxHQUFLLEVBQUUsS0FFekUsR0FBWSxTQUFVLEVBQUcsRUFBRyxDQUN4QixFQUFjLEVBQUcsR0FDakIsWUFBYyxDQUFFLEtBQUssWUFBYyxFQUNuQyxFQUFFLFVBQVksSUFBTSxLQUFPLE9BQU8sT0FBTyxHQUFNLEdBQUcsVUFBWSxFQUFFLFVBQVcsR0FBSSxLQUduRixHQUFXLE9BQU8sUUFBVSxTQUFVLEVBQUcsQ0FDckMsT0FBUyxHQUFHLEVBQUksRUFBRyxFQUFJLFVBQVUsT0FBUSxFQUFJLEVBQUcsSUFBSyxDQUNqRCxFQUFJLFVBQVUsR0FDZCxPQUFTLEtBQUssR0FBRyxBQUFJLE9BQU8sVUFBVSxlQUFlLEtBQUssRUFBRyxJQUFJLEdBQUUsR0FBSyxFQUFFLElBRTlFLE1BQU8sSUFHWCxHQUFTLFNBQVUsRUFBRyxFQUFHLENBQ3JCLEdBQUksR0FBSSxHQUNSLE9BQVMsS0FBSyxHQUFHLEFBQUksT0FBTyxVQUFVLGVBQWUsS0FBSyxFQUFHLElBQU0sRUFBRSxRQUFRLEdBQUssR0FDOUUsR0FBRSxHQUFLLEVBQUUsSUFDYixHQUFJLEdBQUssTUFBUSxNQUFPLFFBQU8sdUJBQTBCLFdBQ3JELE9BQVMsR0FBSSxFQUFHLEVBQUksT0FBTyxzQkFBc0IsR0FBSSxFQUFJLEVBQUUsT0FBUSxJQUMvRCxBQUFJLEVBQUUsUUFBUSxFQUFFLElBQU0sR0FBSyxPQUFPLFVBQVUscUJBQXFCLEtBQUssRUFBRyxFQUFFLEtBQ3ZFLEdBQUUsRUFBRSxJQUFNLEVBQUUsRUFBRSxLQUUxQixNQUFPLElBR1gsR0FBYSxTQUFVLEVBQVksRUFBUSxFQUFLLEVBQU0sQ0FDbEQsR0FBSSxHQUFJLFVBQVUsT0FBUSxFQUFJLEVBQUksRUFBSSxFQUFTLElBQVMsS0FBTyxFQUFPLE9BQU8seUJBQXlCLEVBQVEsR0FBTyxFQUFNLEVBQzNILEdBQUksTUFBTyxVQUFZLFVBQVksTUFBTyxTQUFRLFVBQWEsV0FBWSxFQUFJLFFBQVEsU0FBUyxFQUFZLEVBQVEsRUFBSyxPQUNwSCxRQUFTLEdBQUksRUFBVyxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQUssQUFBSSxHQUFJLEVBQVcsS0FBSSxHQUFLLEdBQUksRUFBSSxFQUFFLEdBQUssRUFBSSxFQUFJLEVBQUUsRUFBUSxFQUFLLEdBQUssRUFBRSxFQUFRLEtBQVMsR0FDaEosTUFBTyxHQUFJLEdBQUssR0FBSyxPQUFPLGVBQWUsRUFBUSxFQUFLLEdBQUksR0FHaEUsR0FBVSxTQUFVLEVBQVksRUFBVyxDQUN2QyxNQUFPLFVBQVUsRUFBUSxFQUFLLENBQUUsRUFBVSxFQUFRLEVBQUssS0FHM0QsR0FBYSxTQUFVLEVBQWEsRUFBZSxDQUMvQyxHQUFJLE1BQU8sVUFBWSxVQUFZLE1BQU8sU0FBUSxVQUFhLFdBQVksTUFBTyxTQUFRLFNBQVMsRUFBYSxJQUdwSCxHQUFZLFNBQVUsRUFBUyxFQUFZLEVBQUcsRUFBVyxDQUNyRCxXQUFlLEVBQU8sQ0FBRSxNQUFPLGFBQWlCLEdBQUksRUFBUSxHQUFJLEdBQUUsU0FBVSxFQUFTLENBQUUsRUFBUSxLQUMvRixNQUFPLElBQUssSUFBTSxHQUFJLFVBQVUsU0FBVSxFQUFTLEVBQVEsQ0FDdkQsV0FBbUIsRUFBTyxDQUFFLEdBQUksQ0FBRSxFQUFLLEVBQVUsS0FBSyxVQUFrQixFQUFQLENBQVksRUFBTyxJQUNwRixXQUFrQixFQUFPLENBQUUsR0FBSSxDQUFFLEVBQUssRUFBVSxNQUFTLFVBQWtCLEVBQVAsQ0FBWSxFQUFPLElBQ3ZGLFdBQWMsRUFBUSxDQUFFLEVBQU8sS0FBTyxFQUFRLEVBQU8sT0FBUyxFQUFNLEVBQU8sT0FBTyxLQUFLLEVBQVcsR0FDbEcsRUFBTSxHQUFZLEVBQVUsTUFBTSxFQUFTLEdBQWMsS0FBSyxXQUl0RSxHQUFjLFNBQVUsRUFBUyxFQUFNLENBQ25DLEdBQUksR0FBSSxDQUFFLE1BQU8sRUFBRyxLQUFNLFVBQVcsQ0FBRSxHQUFJLEVBQUUsR0FBSyxFQUFHLEtBQU0sR0FBRSxHQUFJLE1BQU8sR0FBRSxJQUFPLEtBQU0sR0FBSSxJQUFLLElBQU0sRUFBRyxFQUFHLEVBQUcsRUFDL0csTUFBTyxHQUFJLENBQUUsS0FBTSxFQUFLLEdBQUksTUFBUyxFQUFLLEdBQUksT0FBVSxFQUFLLElBQU0sTUFBTyxTQUFXLFlBQWUsR0FBRSxPQUFPLFVBQVksVUFBVyxDQUFFLE1BQU8sUUFBVSxFQUN2SixXQUFjLEVBQUcsQ0FBRSxNQUFPLFVBQVUsRUFBRyxDQUFFLE1BQU8sR0FBSyxDQUFDLEVBQUcsS0FDekQsV0FBYyxFQUFJLENBQ2QsR0FBSSxFQUFHLEtBQU0sSUFBSSxXQUFVLG1DQUMzQixLQUFPLEdBQUcsR0FBSSxDQUNWLEdBQUksRUFBSSxFQUFHLEdBQU0sR0FBSSxFQUFHLEdBQUssRUFBSSxFQUFFLE9BQVksRUFBRyxHQUFLLEVBQUUsT0FBYyxJQUFJLEVBQUUsU0FBYyxFQUFFLEtBQUssR0FBSSxHQUFLLEVBQUUsT0FBUyxDQUFFLEdBQUksRUFBRSxLQUFLLEVBQUcsRUFBRyxLQUFLLEtBQU0sTUFBTyxHQUUzSixPQURJLEVBQUksRUFBRyxHQUFHLEdBQUssQ0FBQyxFQUFHLEdBQUssRUFBRyxFQUFFLFFBQ3pCLEVBQUcsUUFDRixPQUFRLEdBQUcsRUFBSSxFQUFJLFVBQ25CLEdBQUcsU0FBRSxRQUFnQixDQUFFLE1BQU8sRUFBRyxHQUFJLEtBQU0sUUFDM0MsR0FBRyxFQUFFLFFBQVMsRUFBSSxFQUFHLEdBQUksRUFBSyxDQUFDLEdBQUksYUFDbkMsR0FBRyxFQUFLLEVBQUUsSUFBSSxNQUFPLEVBQUUsS0FBSyxNQUFPLGlCQUVwQyxHQUFNLEVBQUksRUFBRSxLQUFNLElBQUksRUFBRSxPQUFTLEdBQUssRUFBRSxFQUFFLE9BQVMsS0FBUSxHQUFHLEtBQU8sR0FBSyxFQUFHLEtBQU8sR0FBSSxDQUFFLEVBQUksRUFBRyxTQUNqRyxHQUFJLEVBQUcsS0FBTyxHQUFNLEVBQUMsR0FBTSxFQUFHLEdBQUssRUFBRSxJQUFNLEVBQUcsR0FBSyxFQUFFLElBQU0sQ0FBRSxFQUFFLE1BQVEsRUFBRyxHQUFJLE1BQzlFLEdBQUksRUFBRyxLQUFPLEdBQUssRUFBRSxNQUFRLEVBQUUsR0FBSSxDQUFFLEVBQUUsTUFBUSxFQUFFLEdBQUksRUFBSSxFQUFJLE1BQzdELEdBQUksR0FBSyxFQUFFLE1BQVEsRUFBRSxHQUFJLENBQUUsRUFBRSxNQUFRLEVBQUUsR0FBSSxFQUFFLElBQUksS0FBSyxHQUFLLE1BQzNELEFBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxNQUNoQixFQUFFLEtBQUssTUFBTyxTQUV0QixFQUFLLEVBQUssS0FBSyxFQUFTLFNBQ25CLEVBQVAsQ0FBWSxFQUFLLENBQUMsRUFBRyxHQUFJLEVBQUksU0FBSyxDQUFVLEVBQUksRUFBSSxFQUN0RCxHQUFJLEVBQUcsR0FBSyxFQUFHLEtBQU0sR0FBRyxHQUFJLE1BQU8sQ0FBRSxNQUFPLEVBQUcsR0FBSyxFQUFHLEdBQUssT0FBUSxLQUFNLE1BSWxGLEdBQWtCLFNBQVMsRUFBRyxFQUFHLEVBQUcsRUFBSSxDQUNwQyxBQUFJLElBQU8sUUFBVyxHQUFLLEdBQzNCLEVBQUUsR0FBTSxFQUFFLElBR2QsR0FBZSxTQUFVLEVBQUcsRUFBUyxDQUNqQyxPQUFTLEtBQUssR0FBRyxBQUFJLElBQU0sV0FBYSxDQUFDLEVBQVEsZUFBZSxJQUFJLEdBQVEsR0FBSyxFQUFFLEtBR3ZGLEdBQVcsU0FBVSxFQUFHLENBQ3BCLEdBQUksR0FBSSxNQUFPLFNBQVcsWUFBYyxPQUFPLFNBQVUsRUFBSSxHQUFLLEVBQUUsR0FBSSxFQUFJLEVBQzVFLEdBQUksRUFBRyxNQUFPLEdBQUUsS0FBSyxHQUNyQixHQUFJLEdBQUssTUFBTyxHQUFFLFFBQVcsU0FBVSxNQUFPLENBQzFDLEtBQU0sVUFBWSxDQUNkLE1BQUksSUFBSyxHQUFLLEVBQUUsUUFBUSxHQUFJLFFBQ3JCLENBQUUsTUFBTyxHQUFLLEVBQUUsS0FBTSxLQUFNLENBQUMsS0FHNUMsS0FBTSxJQUFJLFdBQVUsRUFBSSwwQkFBNEIsb0NBR3hELEdBQVMsU0FBVSxFQUFHLEVBQUcsQ0FDckIsR0FBSSxHQUFJLE1BQU8sU0FBVyxZQUFjLEVBQUUsT0FBTyxVQUNqRCxHQUFJLENBQUMsRUFBRyxNQUFPLEdBQ2YsR0FBSSxHQUFJLEVBQUUsS0FBSyxHQUFJLEVBQUcsRUFBSyxHQUFJLEVBQy9CLEdBQUksQ0FDQSxLQUFRLEtBQU0sUUFBVSxLQUFNLElBQU0sQ0FBRSxHQUFJLEVBQUUsUUFBUSxNQUFNLEVBQUcsS0FBSyxFQUFFLGFBRWpFLEVBQVAsQ0FBZ0IsRUFBSSxDQUFFLE1BQU8sVUFDN0IsQ0FDSSxHQUFJLENBQ0EsQUFBSSxHQUFLLENBQUMsRUFBRSxNQUFTLEdBQUksRUFBRSxTQUFZLEVBQUUsS0FBSyxVQUVsRCxDQUFVLEdBQUksRUFBRyxLQUFNLEdBQUUsT0FFN0IsTUFBTyxJQUdYLEdBQVcsVUFBWSxDQUNuQixPQUFTLEdBQUssR0FBSSxFQUFJLEVBQUcsRUFBSSxVQUFVLE9BQVEsSUFDM0MsRUFBSyxFQUFHLE9BQU8sR0FBTyxVQUFVLEtBQ3BDLE1BQU8sSUFHWCxHQUFpQixVQUFZLENBQ3pCLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBRyxFQUFLLFVBQVUsT0FBUSxFQUFJLEVBQUksSUFBSyxHQUFLLFVBQVUsR0FBRyxPQUM3RSxPQUFTLEdBQUksTUFBTSxHQUFJLEVBQUksRUFBRyxFQUFJLEVBQUcsRUFBSSxFQUFJLElBQ3pDLE9BQVMsR0FBSSxVQUFVLEdBQUksRUFBSSxFQUFHLEVBQUssRUFBRSxPQUFRLEVBQUksRUFBSSxJQUFLLElBQzFELEVBQUUsR0FBSyxFQUFFLEdBQ2pCLE1BQU8sSUFHWCxHQUFVLFNBQVUsRUFBRyxDQUNuQixNQUFPLGdCQUFnQixJQUFXLE1BQUssRUFBSSxFQUFHLE1BQVEsR0FBSSxJQUFRLElBR3RFLEdBQW1CLFNBQVUsRUFBUyxFQUFZLEVBQVcsQ0FDekQsR0FBSSxDQUFDLE9BQU8sY0FBZSxLQUFNLElBQUksV0FBVSx3Q0FDL0MsR0FBSSxHQUFJLEVBQVUsTUFBTSxFQUFTLEdBQWMsSUFBSyxFQUFHLEVBQUksR0FDM0QsTUFBTyxHQUFJLEdBQUksRUFBSyxRQUFTLEVBQUssU0FBVSxFQUFLLFVBQVcsRUFBRSxPQUFPLGVBQWlCLFVBQVksQ0FBRSxNQUFPLE9BQVMsRUFDcEgsV0FBYyxFQUFHLENBQUUsQUFBSSxFQUFFLElBQUksR0FBRSxHQUFLLFNBQVUsRUFBRyxDQUFFLE1BQU8sSUFBSSxTQUFRLFNBQVUsRUFBRyxFQUFHLENBQUUsRUFBRSxLQUFLLENBQUMsRUFBRyxFQUFHLEVBQUcsSUFBTSxHQUFLLEVBQU8sRUFBRyxPQUM5SCxXQUFnQixFQUFHLEVBQUcsQ0FBRSxHQUFJLENBQUUsRUFBSyxFQUFFLEdBQUcsVUFBYyxFQUFQLENBQVksRUFBTyxFQUFFLEdBQUcsR0FBSSxJQUMzRSxXQUFjLEVBQUcsQ0FBRSxFQUFFLGdCQUFpQixJQUFVLFFBQVEsUUFBUSxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQVMsR0FBVSxFQUFPLEVBQUUsR0FBRyxHQUFJLEdBQ25ILFdBQWlCLEVBQU8sQ0FBRSxFQUFPLE9BQVEsR0FDekMsV0FBZ0IsRUFBTyxDQUFFLEVBQU8sUUFBUyxHQUN6QyxXQUFnQixFQUFHLEVBQUcsQ0FBRSxBQUFJLEVBQUUsR0FBSSxFQUFFLFFBQVMsRUFBRSxRQUFRLEVBQU8sRUFBRSxHQUFHLEdBQUksRUFBRSxHQUFHLE1BR2hGLEdBQW1CLFNBQVUsRUFBRyxDQUM1QixHQUFJLEdBQUcsRUFDUCxNQUFPLEdBQUksR0FBSSxFQUFLLFFBQVMsRUFBSyxRQUFTLFNBQVUsRUFBRyxDQUFFLEtBQU0sS0FBTyxFQUFLLFVBQVcsRUFBRSxPQUFPLFVBQVksVUFBWSxDQUFFLE1BQU8sT0FBUyxFQUMxSSxXQUFjLEVBQUcsRUFBRyxDQUFFLEVBQUUsR0FBSyxFQUFFLEdBQUssU0FBVSxFQUFHLENBQUUsTUFBUSxHQUFJLENBQUMsR0FBSyxDQUFFLE1BQU8sR0FBUSxFQUFFLEdBQUcsSUFBSyxLQUFNLElBQU0sVUFBYSxFQUFJLEVBQUUsR0FBSyxHQUFPLElBRy9JLEdBQWdCLFNBQVUsRUFBRyxDQUN6QixHQUFJLENBQUMsT0FBTyxjQUFlLEtBQU0sSUFBSSxXQUFVLHdDQUMvQyxHQUFJLEdBQUksRUFBRSxPQUFPLGVBQWdCLEVBQ2pDLE1BQU8sR0FBSSxFQUFFLEtBQUssR0FBTSxHQUFJLE1BQU8sS0FBYSxXQUFhLEdBQVMsR0FBSyxFQUFFLE9BQU8sWUFBYSxFQUFJLEdBQUksRUFBSyxRQUFTLEVBQUssU0FBVSxFQUFLLFVBQVcsRUFBRSxPQUFPLGVBQWlCLFVBQVksQ0FBRSxNQUFPLE9BQVMsR0FDOU0sV0FBYyxFQUFHLENBQUUsRUFBRSxHQUFLLEVBQUUsSUFBTSxTQUFVLEVBQUcsQ0FBRSxNQUFPLElBQUksU0FBUSxTQUFVLEVBQVMsRUFBUSxDQUFFLEVBQUksRUFBRSxHQUFHLEdBQUksRUFBTyxFQUFTLEVBQVEsRUFBRSxLQUFNLEVBQUUsVUFDaEosV0FBZ0IsRUFBUyxFQUFRLEVBQUcsRUFBRyxDQUFFLFFBQVEsUUFBUSxHQUFHLEtBQUssU0FBUyxFQUFHLENBQUUsRUFBUSxDQUFFLE1BQU8sRUFBRyxLQUFNLEtBQVMsS0FHdEgsR0FBdUIsU0FBVSxFQUFRLEVBQUssQ0FDMUMsTUFBSSxRQUFPLGVBQWtCLE9BQU8sZUFBZSxFQUFRLE1BQU8sQ0FBRSxNQUFPLElBQWlCLEVBQU8sSUFBTSxFQUNsRyxHQUdYLEdBQWUsU0FBVSxFQUFLLENBQzFCLEdBQUksR0FBTyxFQUFJLFdBQVksTUFBTyxHQUNsQyxHQUFJLEdBQVMsR0FDYixHQUFJLEdBQU8sS0FBTSxPQUFTLEtBQUssR0FBSyxBQUFJLE9BQU8sZUFBZSxLQUFLLEVBQUssSUFBSSxHQUFPLEdBQUssRUFBSSxJQUM1RixTQUFPLFFBQWEsRUFDYixHQUdYLEdBQWtCLFNBQVUsRUFBSyxDQUM3QixNQUFRLElBQU8sRUFBSSxXQUFjLEVBQU0sQ0FBRSxRQUFXLElBR3hELEdBQXlCLFNBQVUsRUFBVSxFQUFZLENBQ3JELEdBQUksQ0FBQyxFQUFXLElBQUksR0FDaEIsS0FBTSxJQUFJLFdBQVUsa0RBRXhCLE1BQU8sR0FBVyxJQUFJLElBRzFCLEdBQXlCLFNBQVUsRUFBVSxFQUFZLEVBQU8sQ0FDNUQsR0FBSSxDQUFDLEVBQVcsSUFBSSxHQUNoQixLQUFNLElBQUksV0FBVSxrREFFeEIsU0FBVyxJQUFJLEVBQVUsR0FDbEIsR0FHWCxFQUFTLFlBQWEsSUFDdEIsRUFBUyxXQUFZLElBQ3JCLEVBQVMsU0FBVSxJQUNuQixFQUFTLGFBQWMsSUFDdkIsRUFBUyxVQUFXLElBQ3BCLEVBQVMsYUFBYyxJQUN2QixFQUFTLFlBQWEsSUFDdEIsRUFBUyxjQUFlLElBQ3hCLEVBQVMsZUFBZ0IsSUFDekIsRUFBUyxrQkFBbUIsSUFDNUIsRUFBUyxXQUFZLElBQ3JCLEVBQVMsU0FBVSxJQUNuQixFQUFTLFdBQVksSUFDckIsRUFBUyxpQkFBa0IsSUFDM0IsRUFBUyxVQUFXLElBQ3BCLEVBQVMsbUJBQW9CLElBQzdCLEVBQVMsbUJBQW9CLElBQzdCLEVBQVMsZ0JBQWlCLElBQzFCLEVBQVMsdUJBQXdCLElBQ2pDLEVBQVMsZUFBZ0IsSUFDekIsRUFBUyxrQkFBbUIsSUFDNUIsRUFBUyx5QkFBMEIsSUFDbkMsRUFBUyx5QkFBMEIsd0VDelJ2QyxHQUFZLElBQVosQUFBQSxVQUFZLEVBQVEsQ0FFbEIsRUFBQSxFQUFBLEtBQUEsR0FBQSxPQUVBLEVBQUEsRUFBQSxNQUFBLEdBQUEsUUFFQSxFQUFBLEVBQUEsTUFBQSxHQUFBLFFBRUEsRUFBQSxFQUFBLFFBQUEsR0FBQSxZQVJVLEdBQUEsR0FBQSxVQUFBLElBQUEsU0FBUSx1RUMyRHBCLEdBQVksSUFBWixBQUFBLFVBQVksRUFBYSxDQUV2QixFQUFBLEdBQUEsS0FFQSxFQUFBLE9BQUEsU0FFQSxFQUFBLFFBQUEsVUFFQSxFQUFBLFNBQUEsYUFSVSxHQUFBLEdBQUEsZUFBQSxJQUFBLGNBQWEsS0FXekIsR0FBWSxJQUFaLEFBQUEsVUFBWSxFQUFvQixDQUU5QixFQUFBLEdBQUEsS0FFQSxFQUFBLFFBQUEsVUFFQSxFQUFBLFFBQUEsWUFOVSxHQUFBLEdBQUEsc0JBQUEsSUFBQSxxQkFBb0IsdUVDckVoQyxHQUFZLElBQVosQUFBQSxVQUFZLEVBQVEsQ0FFbEIsRUFBQSxNQUFBLFFBRUEsRUFBQSxNQUFBLFFBRUEsRUFBQSxRQUFBLFVBRUEsRUFBQSxJQUFBLE1BRUEsRUFBQSxLQUFBLE9BRUEsRUFBQSxNQUFBLFFBRUEsRUFBQSxTQUFBLGFBZFUsR0FBQSxHQUFBLFVBQUEsSUFBQSxTQUFRLEtBa0JwQixBQUFBLFVBQWlCLEVBQVEsQ0FPdkIsV0FBMkIsRUFBYSxDQUN0QyxPQUFRLE9BQ0QsUUFDSCxNQUFPLEdBQVMsVUFDYixPQUNILE1BQU8sR0FBUyxTQUNiLFdBQ0EsVUFDSCxNQUFPLEdBQVMsWUFDYixRQUNILE1BQU8sR0FBUyxVQUNiLFFBQ0gsTUFBTyxHQUFTLFVBQ2IsV0FDSCxNQUFPLEdBQVMsYUFDYixjQUVILE1BQU8sR0FBUyxLQWpCTixFQUFBLFdBQVUsSUFQWCxHQUFBLEdBQUEsVUFBQSxJQUFBLFNBQVEsdUVDbEJ6QixHQUFZLElBQVosQUFBQSxVQUFZLEVBQU0sQ0FFaEIsRUFBQSxRQUFBLFVBRUEsRUFBQSxRQUFBLFVBRUEsRUFBQSxRQUFBLFVBRUEsRUFBQSxVQUFBLGFBRUEsRUFBQSxRQUFBLFVBRUEsRUFBQSxPQUFBLFdBWlUsR0FBQSxHQUFBLFFBQUEsSUFBQSxPQUFNLEtBZ0JsQixBQUFBLFVBQWlCLEVBQU0sQ0FPckIsV0FBNkIsRUFBWSxDQUN2QyxNQUFJLElBQVEsS0FBTyxFQUFPLElBQ2pCLEVBQU8sUUFHWixJQUFTLElBQ0osRUFBTyxVQUdaLEdBQVEsS0FBTyxFQUFPLElBQ2pCLEVBQU8sUUFHWixHQUFRLElBQ0gsRUFBTyxPQUdULEVBQU8sUUFqQkEsRUFBQSxhQUFZLElBUGIsR0FBQSxHQUFBLFFBQUEsSUFBQSxPQUFNLHVFQ3FHdkIsR0FBWSxJQUFaLEFBQUEsVUFBWSxFQUF5QixDQUNuQyxFQUFBLFNBQUEsaUJBQ0EsRUFBQSxRQUFBLGlCQUNBLEVBQUEsS0FBQSxjQUNBLEVBQUEsWUFBQSxnQkFKVSxHQUFBLEdBQUEsMkJBQUEsSUFBQSwwQkFBeUIsdUVDaEhyQyxHQUFZLElBQVosQUFBQSxVQUFZLEVBQU8sQ0FDakIsRUFBQSxXQUFBLGNBQ0EsRUFBQSxlQUFBLGtCQUNBLEVBQUEsYUFBQSxnQkFDQSxFQUFBLGNBQUEsaUJBQ0EsRUFBQSxpQkFBQSxvQkFDQSxFQUFBLFdBQUEsZ0JBTlUsR0FBQSxHQUFBLFNBQUEsSUFBQSxRQUFPLHVFQ0tuQixHQUFBLElBQUEsS0FBUyxHQUFBLFNBQUEsR0FBQSxTQVdULEdBQUEsSUFBQSxLQUtFLEdBQUEsY0FBQSxHQUFBLGNBRUEsR0FBQSxxQkFBQSxHQUFBLHFCQUdGLEdBQUEsSUFBQSxLQUFTLEdBQUEsU0FBQSxHQUFBLFNBSVQsR0FBQSxJQUFBLEtBQVMsR0FBQSxPQUFBLEdBQUEsT0FDVCxHQUFBLElBQUEsS0FRRSxHQUFBLDBCQUFBLEdBQUEsMEJBR0YsR0FBQSxJQUFBLEtBQVMsR0FBQSxRQUFBLEdBQUEsMEVDNUNULFlBQXVCLEVBQXlCLENBQzlDLEFBQUssRUFBUSxLQUFLLEtBQU0sU0FBQSxFQUFDLENBR3ZCLFFBQVEsTUFBTSxLQUpsQixHQUFBLE9BQUEsS0NMQSxxRUFVQSxhQUF5QixDQUN2QixNQUFPLFFBQU8sVUFBVSxTQUFTLEtBQUssTUFBTyxVQUFZLFlBQWMsUUFBVSxLQUFPLG1CQUQxRixHQUFBLFVBQUEsR0FVQSxZQUErQixFQUFVLEVBQWUsQ0FFdEQsTUFBTyxHQUFJLFFBQVEsR0FGckIsR0FBQSxlQUFBLEdBa0JBLFlBQThCLEVBQWtCLENBQzlDLEdBQUksR0FFSixHQUFJLENBQ0YsRUFBTSxHQUFlLEdBQVEsUUFDN0IsRUFJRixHQUFJLENBQ00sR0FBQSxHQUFBLEdBQUEsR0FBQSxXQUFBLElBQ1IsRUFBTSxHQUFlLEdBQVcsSUFBSyxpQkFBaUIsUUFDdEQsRUFJRixNQUFPLEdBaEJULEdBQUEsV0FBQSxLQ3RDQSxnRUFTQSxHQUFBLElBQUEsS0FtQk0sR0FBdUIsR0FPN0IsYUFBK0IsQ0FDN0IsTUFBUSxJQUFBLFlBQ0osT0FDQSxNQUFPLFNBQVcsWUFDbEIsT0FDQSxNQUFPLE9BQVMsWUFDaEIsS0FDQSxHQVBOLEdBQUEsZ0JBQUEsS0NuQ0EsZ0VBV0EsWUFBd0IsRUFBUSxDQUM5QixPQUFRLE9BQU8sVUFBVSxTQUFTLEtBQUssUUFDaEMsaUJBQ0gsTUFBTyxPQUNKLHFCQUNILE1BQU8sT0FDSix3QkFDSCxNQUFPLFdBRVAsTUFBTyxJQUFhLEVBQUssUUFUL0IsR0FBQSxRQUFBLEdBb0JBLFlBQTZCLEVBQVEsQ0FDbkMsTUFBTyxRQUFPLFVBQVUsU0FBUyxLQUFLLEtBQVMsc0JBRGpELEdBQUEsYUFBQSxHQVdBLFlBQTJCLEVBQVEsQ0FDakMsTUFBTyxRQUFPLFVBQVUsU0FBUyxLQUFLLEtBQVMsb0JBRGpELEdBQUEsV0FBQSxHQVdBLFlBQStCLEVBQVEsQ0FDckMsTUFBTyxRQUFPLFVBQVUsU0FBUyxLQUFLLEtBQVMsd0JBRGpELEdBQUEsZUFBQSxHQVdBLFlBQXlCLEVBQVEsQ0FDL0IsTUFBTyxRQUFPLFVBQVUsU0FBUyxLQUFLLEtBQVMsa0JBRGpELEdBQUEsU0FBQSxHQVdBLFlBQTRCLEVBQVEsQ0FDbEMsTUFBTyxLQUFRLE1BQVMsTUFBTyxJQUFRLFVBQVksTUFBTyxJQUFRLFdBRHBFLEdBQUEsWUFBQSxHQVdBLFlBQThCLEVBQVEsQ0FDcEMsTUFBTyxRQUFPLFVBQVUsU0FBUyxLQUFLLEtBQVMsa0JBRGpELEdBQUEsY0FBQSxHQVdBLFlBQXdCLEVBQVEsQ0FDOUIsTUFBTyxPQUFPLFFBQVUsYUFBZSxHQUFhLEVBQUssT0FEM0QsR0FBQSxRQUFBLEdBV0EsWUFBMEIsRUFBUSxDQUNoQyxNQUFPLE9BQU8sVUFBWSxhQUFlLEdBQWEsRUFBSyxTQUQ3RCxHQUFBLFVBQUEsR0FXQSxZQUF5QixFQUFRLENBQy9CLE1BQU8sUUFBTyxVQUFVLFNBQVMsS0FBSyxLQUFTLGtCQURqRCxHQUFBLFNBQUEsR0FRQSxZQUEyQixFQUFRLENBRWpDLE1BQU8sU0FBUSxHQUFPLEVBQUksTUFBUSxNQUFPLEdBQUksTUFBUyxZQUZ4RCxHQUFBLFdBQUEsR0FZQSxZQUFpQyxFQUFRLENBQ3ZDLE1BQU8sSUFBYyxJQUFRLGVBQWlCLElBQU8sa0JBQW9CLElBQU8sbUJBQXFCLEdBRHZHLEdBQUEsaUJBQUEsR0FXQSxZQUE2QixFQUFVLEVBQVMsQ0FDOUMsR0FBSSxDQUNGLE1BQU8sYUFBZSxRQUN0QixDQUNBLE1BQU8sSUFKWCxHQUFBLGFBQUEscUVDdEpBLEdBQUEsSUFBQSxLQUNBLEdBQUEsS0FRQSxZQUFpQyxFQUFlLEVBQW1CLENBU2pFLEdBQUksQ0FZRixPQVhJLEdBQWMsRUFDWixFQUFzQixFQUN0QixFQUFpQixHQUNqQixFQUFNLEdBQ1IsRUFBUyxFQUNULEVBQU0sRUFDSixFQUFZLE1BQ1osRUFBWSxFQUFVLE9BQ3hCLEVBQU8sT0FHSixHQUFlLElBQVcsR0FDL0IsR0FBVSxHQUFxQixFQUFhLEdBS3hDLE1BQVksUUFBVyxFQUFTLEdBQUssRUFBTSxFQUFJLE9BQVMsRUFBWSxFQUFRLFFBQVUsS0FJMUYsRUFBSSxLQUFLLEdBRVQsR0FBTyxFQUFRLE9BQ2YsRUFBYyxFQUFZLFdBRzVCLE1BQU8sR0FBSSxVQUFVLEtBQUssUUFDMUIsQ0FDQSxNQUFPLGFBdkNYLEdBQUEsaUJBQUEsR0FnREEsWUFBOEIsRUFBYSxFQUFtQixTQUN0RCxFQUFPLEVBT1AsRUFBTSxHQUNSLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFFSixHQUFJLENBQUMsR0FBUSxDQUFDLEVBQUssUUFDakIsTUFBTyxHQUdULEVBQUksS0FBSyxFQUFLLFFBQVEsZUFHdEIsR0FBTSxHQUFlLElBQUEsS0FBUSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsUUFDM0IsRUFBUyxPQUFPLFNBQUEsRUFBTyxDQUFJLE1BQUEsR0FBSyxhQUFhLEtBQVUsSUFBSSxTQUFBLEVBQU8sQ0FBSSxNQUFBLENBQUMsRUFBUyxFQUFLLGFBQWEsTUFDbEcsS0FFSixHQUFBLEdBQUksS0FBWSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsT0FDaEIsRUFBYSxRQUFRLFNBQUEsRUFBVyxDQUM5QixFQUFJLEtBQUssSUFBSSxFQUFZLEdBQUUsS0FBSyxFQUFZLEdBQUUsZ0JBRzVDLEVBQUssSUFDUCxFQUFJLEtBQUssSUFBSSxFQUFLLElBSXBCLEVBQVksRUFBSyxVQUNiLEdBQWEsR0FBQSxTQUFTLEdBRXhCLElBREEsRUFBVSxFQUFVLE1BQU0sT0FDckIsRUFBSSxFQUFHLEVBQUksRUFBUSxPQUFRLElBQzlCLEVBQUksS0FBSyxJQUFJLEVBQVEsSUFJM0IsR0FBTSxHQUFlLENBQUMsT0FBUSxPQUFRLFFBQVMsT0FDL0MsSUFBSyxFQUFJLEVBQUcsRUFBSSxFQUFhLE9BQVEsSUFDbkMsRUFBTSxFQUFhLEdBQ25CLEVBQU8sRUFBSyxhQUFhLEdBQ3JCLEdBQ0YsRUFBSSxLQUFLLElBQUksRUFBRyxLQUFLLEVBQUksTUFHN0IsTUFBTyxHQUFJLEtBQUssSUFNbEIsYUFBK0IsQ0FDN0IsR0FBTSxHQUFTLEdBQUEsa0JBQ2YsR0FBSSxDQUNGLE1BQU8sR0FBTyxTQUFTLFNBQVMsVUFDaEMsQ0FDQSxNQUFPLElBTFgsR0FBQSxnQkFBQSxxRUNuSGEsR0FBQSxlQUNYLE9BQU8sZ0JBQW1CLEVBQUUsVUFBVyxhQUFnQixPQUFRLEdBQWEsSUFNOUUsWUFBb0QsRUFBYyxFQUFhLENBRTdFLFNBQUksVUFBWSxFQUNULEVBT1QsWUFBeUQsRUFBYyxFQUFhLENBQ2xGLE9BQVcsS0FBUSxHQUNqQixBQUFLLE9BQU8sVUFBVSxlQUFlLEtBQUssRUFBSyxJQUU3QyxHQUFJLEdBQVEsRUFBTSxJQUl0QixNQUFPLGlGQ3pCVCxHQUFBLEtBR0EsR0FBQSxTQUFBLEVBQUEsQ0FBaUMsR0FBQSxVQUFBLEVBQUEsR0FJL0IsV0FBMEIsRUFBZSx3QkFBekMsRUFDRSxFQUFBLEtBQUEsS0FBTSxJQUFRLEtBRFUsU0FBQSxRQUFBLEVBR3hCLEVBQUssS0FBTyxFQUFXLFVBQVUsWUFBWSxLQUM3QyxHQUFBLGVBQWUsRUFBTSxFQUFXLGFBRXBDLE1BQUEsSUFWaUMsT0FBcEIsR0FBQSxZQUFBLGdGQ0RiLEdBQUEsS0FHTSxHQUFZLGlFQUdaLEdBQWdCLGNBR3RCLEdBQUEsVUFBQSxDQW1CRSxXQUFtQixFQUFhLENBQzlCLEFBQUksTUFBTyxJQUFTLFNBQ2xCLEtBQUssWUFBWSxHQUVqQixLQUFLLGdCQUFnQixHQUd2QixLQUFLLFlBWUEsU0FBQSxVQUFBLFNBQVAsU0FBZ0IsRUFBNkIsQ0FBN0IsQUFBQSxJQUFBLFFBQUEsR0FBQSxJQUNSLEdBQUEsR0FBQSxLQUFFLEVBQUEsRUFBQSxLQUFNLEVBQUEsRUFBQSxLQUFNLEVBQUEsRUFBQSxLQUFNLEVBQUEsRUFBQSxLQUFNLEVBQUEsRUFBQSxVQUFXLEVBQUEsRUFBQSxTQUFVLEVBQUEsRUFBQSxVQUNyRCxNQUNLLEdBQVEsTUFBTSxFQUFZLElBQWdCLEVBQU8sSUFBSSxFQUFTLElBQ2pFLEtBQUksRUFBTyxHQUFPLElBQUksRUFBUyxJQUFFLElBQUksSUFBVSxFQUFJLEtBQWEsSUFLNUQsRUFBQSxVQUFBLFlBQVIsU0FBb0IsRUFBVyxDQUM3QixHQUFNLEdBQVEsR0FBVSxLQUFLLEdBRTdCLEdBQUksQ0FBQyxFQUNILEtBQU0sSUFBSSxJQUFBLFlBQVksSUFHbEIsR0FBQSxHQUFBLEdBQUEsT0FBQSxFQUFBLE1BQUEsR0FBQSxHQUFDLEVBQUEsRUFBQSxHQUFVLEVBQUEsRUFBQSxHQUFXLEVBQUEsRUFBQSxHQUFBLEVBQUEsSUFBQSxPQUFBLEdBQUEsRUFBVyxFQUFBLEVBQUEsR0FBTSxFQUFBLEVBQUEsR0FBQSxFQUFBLElBQUEsT0FBQSxHQUFBLEVBQVcsRUFBQSxFQUFBLEdBQ3BELEVBQU8sR0FDUCxFQUFZLEVBRVYsRUFBUSxFQUFVLE1BQU0sS0FNOUIsR0FMSSxFQUFNLE9BQVMsR0FDakIsR0FBTyxFQUFNLE1BQU0sRUFBRyxJQUFJLEtBQUssS0FDL0IsRUFBWSxFQUFNLE9BR2hCLEVBQVcsQ0FDYixHQUFNLEdBQWUsRUFBVSxNQUFNLFFBQ3JDLEFBQUksR0FDRixHQUFZLEVBQWEsSUFJN0IsS0FBSyxnQkFBZ0IsQ0FBRSxLQUFJLEVBQUUsS0FBSSxFQUFFLEtBQUksRUFBRSxVQUFTLEVBQUUsS0FBSSxFQUFFLFNBQVUsRUFBeUIsVUFBUyxLQUloRyxFQUFBLFVBQUEsZ0JBQVIsU0FBd0IsRUFBeUIsQ0FFL0MsQUFBSSxRQUFVLElBQWMsQ0FBRSxjQUFlLEtBQzNDLEdBQVcsVUFBWSxFQUFXLE1BRXBDLEtBQUssS0FBTyxFQUFXLFdBQWEsR0FFcEMsS0FBSyxTQUFXLEVBQVcsU0FDM0IsS0FBSyxVQUFZLEVBQVcsV0FBYSxHQUN6QyxLQUFLLEtBQU8sRUFBVyxNQUFRLEdBQy9CLEtBQUssS0FBTyxFQUFXLEtBQ3ZCLEtBQUssS0FBTyxFQUFXLE1BQVEsR0FDL0IsS0FBSyxLQUFPLEVBQVcsTUFBUSxHQUMvQixLQUFLLFVBQVksRUFBVyxXQUl0QixFQUFBLFVBQUEsVUFBUixVQUFBLENBQUEsR0FBQSxHQUFBLEtBT0UsR0FOQSxDQUFDLFdBQVksWUFBYSxPQUFRLGFBQWEsUUFBUSxTQUFBLEVBQVMsQ0FDOUQsR0FBSSxDQUFDLEVBQUssR0FDUixLQUFNLElBQUksSUFBQSxZQUFlLEdBQWEsS0FBSyxFQUFTLGNBSXBELENBQUMsS0FBSyxVQUFVLE1BQU0sU0FDeEIsS0FBTSxJQUFJLElBQUEsWUFBZSxHQUFhLHVCQUF1QixLQUFLLFdBR3BFLEdBQUksS0FBSyxXQUFhLFFBQVUsS0FBSyxXQUFhLFFBQ2hELEtBQU0sSUFBSSxJQUFBLFlBQWUsR0FBYSxzQkFBc0IsS0FBSyxVQUduRSxHQUFJLEtBQUssTUFBUSxNQUFNLFNBQVMsS0FBSyxLQUFNLEtBQ3pDLEtBQU0sSUFBSSxJQUFBLFlBQWUsR0FBYSxrQkFBa0IsS0FBSyxPQUduRSxLQS9HYSxHQUFBLElBQUEscUVDUmIsR0FBQSxJQUFBLEtBR00sR0FBUyxHQUFBLGtCQUdULEdBQVMsaUJBY2YsWUFBK0IsRUFBbUIsQ0FDaEQsR0FBTSxHQUFTLEdBQUEsa0JBQ1QsRUFBUyxDQUFDLFFBQVMsT0FBUSxPQUFRLFFBQVMsTUFBTyxVQUV6RCxHQUFJLENBQUUsWUFBYSxJQUNqQixNQUFPLEtBSVQsR0FBTSxHQUFtQixFQUFlLFFBQ2xDLEVBQXdDLEdBRzlDLEVBQU8sUUFBUSxTQUFBLEVBQUssQ0FFbEIsQUFBSSxJQUFVLEdBQWUsU0FBWSxFQUFnQixHQUEyQixxQkFDbEYsR0FBYyxHQUFTLEVBQWdCLEdBQ3ZDLEVBQWdCLEdBQVUsRUFBZ0IsR0FBMkIsdUJBS3pFLEdBQU0sR0FBUyxJQUdmLGNBQU8sS0FBSyxHQUFlLFFBQVEsU0FBQSxFQUFLLENBQ3RDLEVBQWdCLEdBQVMsRUFBYyxLQUdsQyxFQTdCVCxHQUFBLGVBQUEsR0FpQ0EsR0FBQSxJQUFBLFVBQUEsQ0FLRSxZQUFBLENBQ0UsS0FBSyxTQUFXLEdBSVgsU0FBQSxVQUFBLFFBQVAsVUFBQSxDQUNFLEtBQUssU0FBVyxJQUlYLEVBQUEsVUFBQSxPQUFQLFVBQUEsQ0FDRSxLQUFLLFNBQVcsSUFJWCxFQUFBLFVBQUEsSUFBUCxVQUFBLFFBQVcsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsR0FBQSxVQUFBLEdBQ1QsQUFBSSxDQUFDLEtBQUssVUFHVixHQUFlLFVBQUEsQ0FDYixHQUFPLFFBQVEsSUFBTyxHQUFNLFVBQVUsRUFBSyxLQUFLLFNBSzdDLEVBQUEsVUFBQSxLQUFQLFVBQUEsUUFBWSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsVUFBQSxPQUFBLElBQUEsRUFBQSxHQUFBLFVBQUEsR0FDVixBQUFJLENBQUMsS0FBSyxVQUdWLEdBQWUsVUFBQSxDQUNiLEdBQU8sUUFBUSxLQUFRLEdBQU0sV0FBVyxFQUFLLEtBQUssU0FLL0MsRUFBQSxVQUFBLE1BQVAsVUFBQSxRQUFhLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxVQUFBLE9BQUEsSUFBQSxFQUFBLEdBQUEsVUFBQSxHQUNYLEFBQUksQ0FBQyxLQUFLLFVBR1YsR0FBZSxVQUFBLENBQ2IsR0FBTyxRQUFRLE1BQVMsR0FBTSxZQUFZLEVBQUssS0FBSyxTQUcxRCxLQUdBLEdBQU8sV0FBYSxHQUFPLFlBQWMsR0FDekMsR0FBTSxJQUFVLEdBQU8sV0FBVyxRQUFzQixJQUFPLFdBQVcsT0FBUyxHQUFJLEtBRTlFLEdBQUEsT0FBQSxxRUN4R1QsR0FBQSxJQUFBLFVBQUEsQ0FNRSxZQUFBLENBQ0UsS0FBSyxZQUFjLE1BQU8sVUFBWSxXQUN0QyxLQUFLLE9BQVMsS0FBSyxZQUFjLEdBQUksU0FBWSxHQU81QyxTQUFBLFVBQUEsUUFBUCxTQUFlLEVBQVEsQ0FDckIsR0FBSSxLQUFLLFlBQ1AsTUFBSSxNQUFLLE9BQU8sSUFBSSxHQUNYLEdBRVQsTUFBSyxPQUFPLElBQUksR0FDVCxJQUdULE9BQVMsR0FBSSxFQUFHLEVBQUksS0FBSyxPQUFPLE9BQVEsSUFBSyxDQUMzQyxHQUFNLEdBQVEsS0FBSyxPQUFPLEdBQzFCLEdBQUksSUFBVSxFQUNaLE1BQU8sR0FHWCxZQUFLLE9BQU8sS0FBSyxHQUNWLElBT0YsRUFBQSxVQUFBLFVBQVAsU0FBaUIsRUFBUSxDQUN2QixHQUFJLEtBQUssWUFDUCxLQUFLLE9BQU8sT0FBTyxPQUVuQixRQUFTLEdBQUksRUFBRyxFQUFJLEtBQUssT0FBTyxPQUFRLElBQ3RDLEdBQUksS0FBSyxPQUFPLEtBQU8sRUFBSyxDQUMxQixLQUFLLE9BQU8sT0FBTyxFQUFHLEdBQ3RCLFFBS1YsS0FsRGEsR0FBQSxLQUFBLHFFQ05iLEdBQU0sSUFBc0IsY0FLNUIsWUFBZ0MsRUFBVyxDQUN6QyxHQUFJLENBQ0YsTUFBSSxDQUFDLEdBQU0sTUFBTyxJQUFPLFdBQ2hCLEdBRUYsRUFBRyxNQUFRLFFBQ2xCLENBR0EsTUFBTyxLQVRYLEdBQUEsZ0JBQUEscUVDTEEsR0FBQSxJQUFBLEtBU0EsWUFBeUIsRUFBYSxFQUFlLENBQ25ELE1BRG9DLEtBQUEsUUFBQSxHQUFBLEdBQ2hDLE1BQU8sSUFBUSxVQUFZLElBQVEsR0FHaEMsRUFBSSxRQUFVLEVBRlosRUFFMkIsRUFBSSxPQUFPLEVBQUcsR0FBSSxNQUp4RCxHQUFBLFNBQUEsR0FlQSxZQUF5QixFQUFjLEVBQWEsQ0FDbEQsR0FBSSxHQUFVLEVBQ1IsRUFBSyxFQUFRLE9BQ25CLEdBQUksR0FBTSxJQUNSLE1BQU8sR0FFVCxBQUFJLEVBQVEsR0FFVixHQUFRLEdBR1YsR0FBSSxHQUFRLEtBQUssSUFBSSxFQUFRLEdBQUksR0FDakMsQUFBSSxFQUFRLEdBQ1YsR0FBUSxHQUdWLEdBQUksR0FBTSxLQUFLLElBQUksRUFBUSxJQUFLLEdBQ2hDLE1BQUksR0FBTSxFQUFLLEdBQ2IsR0FBTSxHQUVKLElBQVEsR0FDVixHQUFRLEtBQUssSUFBSSxFQUFNLElBQUssSUFHOUIsRUFBVSxFQUFRLE1BQU0sRUFBTyxHQUMzQixFQUFRLEdBQ1YsR0FBVSxXQUFXLEdBRW5CLEVBQU0sR0FDUixJQUFXLFdBR04sRUFoQ1QsR0FBQSxTQUFBLEdBMENBLFlBQXlCLEVBQWMsRUFBa0IsQ0FDdkQsR0FBSSxDQUFDLE1BQU0sUUFBUSxHQUNqQixNQUFPLEdBS1QsT0FGTSxHQUFTLEdBRU4sRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLElBQUssQ0FDckMsR0FBTSxHQUFRLEVBQU0sR0FDcEIsR0FBSSxDQUNGLEVBQU8sS0FBSyxPQUFPLFNBQ25CLENBQ0EsRUFBTyxLQUFLLGlDQUloQixNQUFPLEdBQU8sS0FBSyxHQWhCckIsR0FBQSxTQUFBLEdBd0JBLFlBQWtDLEVBQWUsRUFBd0IsQ0FDdkUsTUFBSyxJQUFBLFNBQVMsR0FJVixHQUFBLFNBQVMsR0FDSCxFQUFtQixLQUFLLEdBRTlCLE1BQU8sSUFBWSxTQUNkLEVBQU0sUUFBUSxLQUFhLEdBRTdCLEdBVEUsR0FGWCxHQUFBLGtCQUFBLEdBeUJBLFlBQXFDLEVBQW1CLENBR3RELE1BQU8sR0FBWSxRQUFRLHNCQUF1QixRQUFRLFFBQVEsS0FBTSxTQUgxRSxHQUFBLHFCQUFBLGdGQy9HQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQWFBLFlBQXFCLEVBQWdDLEVBQWMsRUFBMkMsQ0FDNUcsR0FBTSxJQUFRLEdBSWQsSUFBTSxHQUFXLEVBQU8sR0FDbEIsRUFBVSxFQUFtQixHQUluQyxHQUFJLE1BQU8sSUFBWSxXQUNyQixHQUFJLENBQ0YsRUFBUSxVQUFZLEVBQVEsV0FBYSxHQUN6QyxPQUFPLGlCQUFpQixFQUFTLENBQy9CLG9CQUFxQixDQUNuQixXQUFZLEdBQ1osTUFBTyxVQUdYLEVBTUosRUFBTyxHQUFRLEdBekJqQixHQUFBLEtBQUEsR0FrQ0EsWUFBMEIsRUFBOEIsQ0FDdEQsTUFBTyxRQUFPLEtBQUssR0FDaEIsSUFBSSxTQUFBLEVBQUcsQ0FBSSxNQUFHLG9CQUFtQixHQUFJLElBQUksbUJBQW1CLEVBQU8sTUFDbkUsS0FBSyxLQUhWLEdBQUEsVUFBQSxHQVlBLFlBQ0UsRUFBVSxDQUlWLEdBQUksR0FBQSxRQUFRLEdBQVEsQ0FDbEIsR0FBTSxHQUFRLEVBQ1IsRUFLRixDQUNGLFFBQVMsRUFBTSxRQUNmLEtBQU0sRUFBTSxLQUNaLE1BQU8sRUFBTSxPQUdmLE9BQVcsS0FBSyxHQUNkLEFBQUksT0FBTyxVQUFVLGVBQWUsS0FBSyxFQUFPLElBQzlDLEdBQUksR0FBSyxFQUFNLElBSW5CLE1BQU8sR0FHVCxHQUFJLEdBQUEsUUFBUSxHQUFRLENBV2xCLEdBQU0sR0FBUSxFQUVSLEVBRUYsR0FLSixFQUFPLEtBQU8sRUFBTSxLQUVwQixHQUFJLENBQ0YsRUFBTyxPQUFTLEdBQUEsVUFBVSxFQUFNLFFBQzVCLEdBQUEsaUJBQWlCLEVBQU0sUUFDdkIsT0FBTyxVQUFVLFNBQVMsS0FBSyxFQUFNLGFBQ3pDLENBQ0EsRUFBTyxPQUFTLFlBR2xCLEdBQUksQ0FDRixFQUFPLGNBQWdCLEdBQUEsVUFBVSxFQUFNLGVBQ25DLEdBQUEsaUJBQWlCLEVBQU0sZUFDdkIsT0FBTyxVQUFVLFNBQVMsS0FBSyxFQUFNLG9CQUN6QyxDQUNBLEVBQU8sY0FBZ0IsWUFHekIsQUFBSSxNQUFPLGNBQWdCLGFBQWUsR0FBQSxhQUFhLEVBQU8sY0FDNUQsR0FBTyxPQUFTLEVBQU0sUUFHeEIsT0FBVyxLQUFRLEdBQ2pCLEFBQUksT0FBTyxVQUFVLGVBQWUsS0FBSyxFQUFPLElBQzlDLEdBQU8sR0FBUSxFQUFNLElBSXpCLE1BQU8sR0FHVCxNQUFPLEdBTVQsWUFBb0IsRUFBYSxDQUUvQixNQUFPLENBQUMsQ0FBQyxVQUFVLEdBQU8sTUFBTSxTQUFTLE9BSTNDLFlBQWtCLEVBQVUsQ0FDMUIsTUFBTyxJQUFXLEtBQUssVUFBVSxJQUluQyxZQUNFLEVBRUEsRUFFQSxFQUE0QixDQUY1QixBQUFBLElBQUEsUUFBQSxHQUFBLEdBRUEsSUFBQSxRQUFBLEdBQWtCLElBQU0sTUFFeEIsR0FBTSxHQUFhLEdBQVUsRUFBUSxHQUVyQyxNQUFJLElBQVMsR0FBYyxFQUNsQixHQUFnQixFQUFRLEVBQVEsRUFBRyxHQUdyQyxFQWJULEdBQUEsZ0JBQUEsR0F5QkEsWUFBd0IsRUFBVSxDQUNoQyxHQUFNLEdBQU8sT0FBTyxVQUFVLFNBQVMsS0FBSyxHQUc1QyxHQUFJLE1BQU8sSUFBVSxTQUNuQixNQUFPLEdBRVQsR0FBSSxJQUFTLGtCQUNYLE1BQU8sV0FFVCxHQUFJLElBQVMsaUJBQ1gsTUFBTyxVQUdULEdBQU0sR0FBYSxHQUFlLEdBQ2xDLE1BQU8sSUFBQSxZQUFZLEdBQWMsRUFBYSxFQVloRCxZQUEyQixFQUFVLEVBQVMsQ0FDNUMsTUFBSSxLQUFRLFVBQVksR0FBUyxNQUFPLElBQVUsVUFBYyxFQUF1QyxRQUM5RixXQUdMLElBQVEsZ0JBQ0gsa0JBR0wsTUFBUSxTQUFtQixhQUFnQixJQUFzQixPQUM1RCxXQU9MLE1BQVEsU0FBbUIsYUFBZ0IsSUFBc0IsT0FDNUQsV0FJTCxNQUFRLFdBQXFCLGFBQWdCLElBQXNCLFNBQzlELGFBSUwsR0FBQSxpQkFBaUIsR0FDWixtQkFHTCxNQUFPLElBQVUsVUFBWSxJQUFVLEVBQ2xDLFFBR0wsSUFBVSxPQUNMLGNBR0wsTUFBTyxJQUFVLFdBQ1osY0FBYyxHQUFBLGdCQUFnQixHQUFNLElBS3pDLE1BQU8sSUFBVSxTQUNaLElBQUksT0FBTyxHQUFNLElBR3RCLE1BQU8sSUFBVSxTQUNaLFlBQVksT0FBTyxHQUFNLElBRzNCLEVBWVQsWUFBcUIsRUFBYSxFQUFZLEVBQTJCLEVBQXVCLENBRTlGLEdBRjRDLElBQUEsUUFBQSxHQUFBLEtBQTJCLElBQUEsUUFBQSxHQUFBLEdBQWlCLElBQUEsTUFFcEYsSUFBVSxFQUNaLE1BQU8sSUFBZSxHQUt4QixHQUFJLEdBQVUsTUFBK0IsTUFBTyxHQUFNLFFBQVcsV0FDbkUsTUFBTyxHQUFNLFNBS2YsR0FBTSxHQUFhLEdBQWUsRUFBTyxHQUN6QyxHQUFJLEdBQUEsWUFBWSxHQUNkLE1BQU8sR0FJVCxHQUFNLEdBQVMsR0FBYyxHQUd2QixFQUFNLE1BQU0sUUFBUSxHQUFTLEdBQUssR0FHeEMsR0FBSSxFQUFLLFFBQVEsR0FDZixNQUFPLGVBSVQsT0FBVyxLQUFZLEdBRXJCLEFBQUksQ0FBQyxPQUFPLFVBQVUsZUFBZSxLQUFLLEVBQVEsSUFJakQsR0FBK0IsR0FBWSxHQUFLLEVBQVUsRUFBTyxHQUFXLEVBQVEsRUFBRyxJQUkxRixTQUFLLFVBQVUsR0FHUixFQTVDVCxHQUFBLEtBQUEsR0E0REEsWUFBMEIsRUFBWSxFQUFjLENBQ2xELEdBQUksQ0FDRixNQUFPLE1BQUssTUFBTSxLQUFLLFVBQVUsRUFBTyxTQUFDLEVBQWEsRUFBVSxDQUFLLE1BQUEsSUFBSyxFQUFLLEVBQU8sV0FDdEYsQ0FDQSxNQUFPLHdCQUpYLEdBQUEsVUFBQSxHQWNBLFlBQStDLEVBQWdCLEVBQXNCLENBQXRCLEFBQUEsSUFBQSxRQUFBLEdBQUEsSUFDN0QsR0FBTSxHQUFPLE9BQU8sS0FBSyxHQUFjLElBR3ZDLEdBRkEsRUFBSyxPQUVELENBQUMsRUFBSyxPQUNSLE1BQU8sdUJBR1QsR0FBSSxFQUFLLEdBQUcsUUFBVSxFQUNwQixNQUFPLElBQUEsU0FBUyxFQUFLLEdBQUksR0FHM0IsT0FBUyxHQUFlLEVBQUssT0FBUSxFQUFlLEVBQUcsSUFBZ0IsQ0FDckUsR0FBTSxHQUFhLEVBQUssTUFBTSxFQUFHLEdBQWMsS0FBSyxNQUNwRCxHQUFJLElBQVcsT0FBUyxHQUd4QixNQUFJLEtBQWlCLEVBQUssT0FDakIsRUFFRixHQUFBLFNBQVMsRUFBWSxHQUc5QixNQUFPLEdBdkJULEdBQUEsK0JBQUEsR0E4QkEsWUFBcUMsRUFBTSxTQUN6QyxHQUFJLEdBQUEsY0FBYyxHQUFNLENBQ3RCLEdBQU0sR0FBTSxFQUNOLEVBQTZCLE9BQ25DLE9BQWtCLEdBQUEsR0FBQSxTQUFBLE9BQU8sS0FBSyxJQUFJLEVBQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxLQUFBLEVBQUEsRUFBQSxPQUFFLENBQS9CLEdBQU0sR0FBRyxFQUFBLE1BQ1osQUFBSSxNQUFPLEdBQUksSUFBUyxhQUN0QixHQUFHLEdBQU8sR0FBa0IsRUFBSSx1R0FHcEMsTUFBTyxHQUdULE1BQUksT0FBTSxRQUFRLEdBQ1IsRUFBYyxJQUFJLElBR3JCLEVBaEJULEdBQUEsa0JBQUEsR0E0QkEsWUFBMEIsRUFBWSxDQUNwQyxHQUFJLEdBQ0osT0FBUSxRQUNELEFBQXFCLElBQVEsS0FDaEMsRUFBYyxHQUFJLFFBQU8sR0FDekIsVUFLRyxPQUFPLElBQVEsVUFBWSxNQUFPLElBQVEsVUFDN0MsRUFBYyxPQUFPLEdBQ3JCLFVBR0csSUFBQSxZQUFZLEdBRWYsRUFBYyxHQUFLLEdBQVksWUFBWSxHQUMzQyxjQUlBLEVBQWMsRUFDZCxNQUVKLE1BQU8sR0F6QlQsR0FBQSxVQUFBLHFFQzNaQSxHQUFBLElBQUEsS0FDQSxHQUFBLEtBUUEsYUFBa0MsQ0FDaEMsR0FBSSxDQUNGLFVBQUksWUFBVyxJQUNSLFFBQ1AsQ0FDQSxNQUFPLElBTFgsR0FBQSxtQkFBQSxHQWVBLGFBQWdDLENBQzlCLEdBQUksQ0FJRixVQUFJLFVBQVMsSUFDTixRQUNQLENBQ0EsTUFBTyxJQVJYLEdBQUEsaUJBQUEsR0FrQkEsYUFBb0MsQ0FDbEMsR0FBSSxDQUNGLFVBQUksY0FBYSxJQUNWLFFBQ1AsQ0FDQSxNQUFPLElBTFgsR0FBQSxxQkFBQSxHQWVBLGFBQTZCLENBQzNCLEdBQUksQ0FBRSxVQUFXLElBQUEsbUJBQ2YsTUFBTyxHQUdULEdBQUksQ0FDRixVQUFJLFNBQ0osR0FBSSxTQUFRLElBQ1osR0FBSSxVQUNHLFFBQ1AsQ0FDQSxNQUFPLElBWFgsR0FBQSxjQUFBLEdBa0JBLFlBQThCLEVBQWMsQ0FDMUMsTUFBTyxJQUFRLG1EQUFtRCxLQUFLLEVBQUssWUFEOUUsR0FBQSxjQUFBLEdBVUEsYUFBbUMsQ0FDakMsR0FBSSxDQUFDLEtBQ0gsTUFBTyxHQUdULEdBQU0sR0FBUyxHQUFBLGtCQUlmLEdBQUksR0FBYyxFQUFPLE9BQ3ZCLE1BQU8sR0FLVCxHQUFJLEdBQVMsR0FDUCxFQUFNLEVBQU8sU0FFbkIsR0FBSSxHQUFPLE1BQVEsR0FBSSxlQUE4QixXQUNuRCxHQUFJLENBQ0YsR0FBTSxHQUFVLEVBQUksY0FBYyxVQUNsQyxFQUFRLE9BQVMsR0FDakIsRUFBSSxLQUFLLFlBQVksR0FDakIsRUFBUSxlQUFpQixFQUFRLGNBQWMsT0FFakQsR0FBUyxHQUFjLEVBQVEsY0FBYyxRQUUvQyxFQUFJLEtBQUssWUFBWSxTQUNkLEVBQVAsQ0FDQSxHQUFBLE9BQU8sS0FBSyxrRkFBbUYsR0FJbkcsTUFBTyxHQWpDVCxHQUFBLG9CQUFBLEdBMENBLGFBQXlDLENBQ3ZDLE1BQU8scUJBQXVCLElBQUEsa0JBRGhDLEdBQUEsMEJBQUEsR0FVQSxhQUFzQyxDQU1wQyxHQUFJLENBQUMsS0FDSCxNQUFPLEdBR1QsR0FBSSxDQUNGLFVBQUksU0FBUSxJQUFLLENBQ2YsZUFBZ0IsV0FFWCxRQUNQLENBQ0EsTUFBTyxJQWhCWCxHQUFBLHVCQUFBLEdBMEJBLGFBQStCLENBSTdCLEdBQU0sR0FBUyxHQUFBLGtCQUdULEVBQVUsRUFBZSxPQUN6QixFQUFzQixHQUFVLEVBQU8sS0FBTyxFQUFPLElBQUksUUFFekQsRUFBZ0IsV0FBYSxJQUFVLENBQUMsQ0FBQyxFQUFPLFFBQVEsV0FBYSxDQUFDLENBQUMsRUFBTyxRQUFRLGFBRTVGLE1BQU8sQ0FBQyxHQUF1QixFQVpqQyxHQUFBLGdCQUFBLGdGQzlKQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FFTSxFQUFTLEdBQUEsa0JBNkJULEdBQTZFLEdBQzdFLEdBQTZELEdBR25FLFlBQW9CLEVBQTJCLENBQzdDLEdBQUksSUFBYSxHQU1qQixPQUZBLEdBQWEsR0FBUSxHQUViLE9BQ0QsVUFDSCxLQUNBLFVBQ0csTUFDSCxLQUNBLFVBQ0csTUFDSCxLQUNBLFVBQ0csUUFDSCxLQUNBLFVBQ0csVUFDSCxLQUNBLFVBQ0csUUFDSCxLQUNBLFVBQ0cscUJBQ0gsS0FDQSxjQUVBLEdBQUEsT0FBTyxLQUFLLGdDQUFpQyxJQVNuRCxZQUEwQyxFQUEwQixDQUNsRSxBQUFJLENBQUMsR0FBVyxNQUFPLEdBQVEsTUFBUyxVQUFZLE1BQU8sR0FBUSxVQUFhLFlBR2hGLElBQVMsRUFBUSxNQUFRLEdBQVMsRUFBUSxPQUFTLEdBQ2xELEdBQVMsRUFBUSxNQUFzQyxLQUFLLEVBQVEsVUFDckUsR0FBVyxFQUFRLE9BTnJCLEdBQUEsMEJBQUEsR0FVQSxZQUF5QixFQUE2QixFQUFTLFNBQzdELEdBQUksR0FBQyxHQUFRLENBQUMsR0FBUyxRQUl2QixPQUFzQixHQUFBLEdBQUEsU0FBQSxHQUFTLElBQVMsSUFBRSxFQUFBLEVBQUEsT0FBQSxDQUFBLEVBQUEsS0FBQSxFQUFBLEVBQUEsT0FBRSxDQUF2QyxHQUFNLEdBQU8sRUFBQSxNQUNoQixHQUFJLENBQ0YsRUFBUSxTQUNELEVBQVAsQ0FDQSxHQUFBLE9BQU8sTUFDTDtRQUEwRCxFQUFJO1FBQVcsR0FBQSxnQkFDdkUsR0FDRDtTQUFZLHVHQU9yQixhQUEwQixDQUN4QixBQUFNLFdBQWEsSUFJbkIsQ0FBQyxRQUFTLE9BQVEsT0FBUSxRQUFTLE1BQU8sVUFBVSxRQUFRLFNBQVMsRUFBYSxDQUNoRixBQUFNLElBQVMsR0FBTyxTQUl0QixHQUFBLEtBQUssRUFBTyxRQUFTLEVBQU8sU0FBUyxFQUErQixDQUNsRSxNQUFPLFdBQUEsUUFBUyxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsVUFBQSxPQUFBLElBQUEsRUFBQSxHQUFBLFVBQUEsR0FDZCxHQUFnQixVQUFXLENBQUUsS0FBSSxFQUFFLE1BQUssSUFHcEMsR0FDRixTQUFTLFVBQVUsTUFBTSxLQUFLLEVBQXNCLEVBQU8sUUFBUyxRQVE5RSxhQUF3QixDQUN0QixBQUFJLENBQUMsR0FBQSx1QkFJTCxHQUFBLEtBQUssRUFBUSxRQUFTLFNBQVMsRUFBeUIsQ0FDdEQsTUFBTyxXQUFBLFFBQVMsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsR0FBQSxVQUFBLEdBQ2QsR0FBTSxHQUFjLENBQ2xCLEtBQUksRUFDSixVQUFXLENBQ1QsT0FBUSxHQUFlLEdBQ3ZCLElBQUssR0FBWSxJQUVuQixlQUFnQixLQUFLLE9BR3ZCLFVBQWdCLFFBQU8sR0FBQSxTQUFBLEdBQ2xCLElBSUUsRUFBYyxNQUFNLEVBQVEsR0FBTSxLQUN2QyxTQUFDLEVBQWtCLENBQ2pCLFVBQWdCLFFBQU8sR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNsQixHQUFXLENBQ2QsYUFBYyxLQUFLLE1BQ25CLFNBQVEsS0FFSCxHQUVULFNBQUMsRUFBWSxDQUNYLFNBQWdCLFFBQU8sR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNsQixHQUFXLENBQ2QsYUFBYyxLQUFLLE1BQ25CLE1BQUssS0FLRCxPQXNCaEIsWUFBd0IsRUFBcUIsQ0FDM0MsTUFEc0IsS0FBQSxRQUFBLEdBQUEsSUFDbEIsV0FBYSxJQUFVLEdBQUEsYUFBYSxFQUFVLEdBQUksVUFBWSxFQUFVLEdBQUcsT0FDdEUsT0FBTyxFQUFVLEdBQUcsUUFBUSxjQUVqQyxFQUFVLElBQU0sRUFBVSxHQUFHLE9BQ3hCLE9BQU8sRUFBVSxHQUFHLFFBQVEsY0FFOUIsTUFJVCxZQUFxQixFQUFxQixDQUN4QyxNQURtQixLQUFBLFFBQUEsR0FBQSxJQUNmLE1BQU8sR0FBVSxJQUFPLFNBQ25CLEVBQVUsR0FFZixXQUFhLElBQVUsR0FBQSxhQUFhLEVBQVUsR0FBSSxTQUM3QyxFQUFVLEdBQUcsSUFFZixPQUFPLEVBQVUsSUFLMUIsYUFBc0IsQ0FDcEIsR0FBTSxrQkFBb0IsR0FLMUIsSUFBTSxHQUFnQyxHQUNoQyxFQUE4QixHQUM5QixFQUFXLGVBQWUsVUFFaEMsR0FBQSxLQUFLLEVBQVUsT0FBUSxTQUFTLEVBQXdCLENBQ3RELE1BQU8sV0FBQSxRQUE0QyxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsVUFBQSxPQUFBLElBQUEsRUFBQSxHQUFBLFVBQUEsR0FFakQsR0FBTSxHQUFNLEtBQ04sRUFBTSxFQUFLLEdBQ2pCLEVBQUksZUFBaUIsQ0FFbkIsT0FBUSxHQUFBLFNBQVMsRUFBSyxJQUFNLEVBQUssR0FBRyxjQUFnQixFQUFLLEdBQ3pELElBQUssRUFBSyxJQUtSLEdBQUEsU0FBUyxJQUFRLEVBQUksZUFBZSxTQUFXLFFBQVUsRUFBSSxNQUFNLGVBQ3JFLEdBQUksdUJBQXlCLElBRy9CLEdBQU0sR0FBNEIsVUFBQSxDQUNoQyxHQUFJLEVBQUksYUFBZSxFQUFHLENBQ3hCLEdBQUksQ0FHRixBQUFJLEVBQUksZ0JBQ04sR0FBSSxlQUFlLFlBQWMsRUFBSSxhQUV2QyxFQUlGLEdBQUksQ0FDRixHQUFNLEdBQWEsRUFBWSxRQUFRLEdBQ3ZDLEdBQUksSUFBZSxHQUFJLENBRXJCLEVBQVksT0FBTyxHQUNuQixHQUFNLEdBQU8sRUFBYyxPQUFPLEdBQVksR0FDOUMsQUFBSSxFQUFJLGdCQUFrQixFQUFLLEtBQU8sUUFDcEMsR0FBSSxlQUFlLEtBQU8sRUFBSyxVQUduQyxFQUlGLEdBQWdCLE1BQU8sQ0FDckIsS0FBSSxFQUNKLGFBQWMsS0FBSyxNQUNuQixlQUFnQixLQUFLLE1BQ3JCLElBQUcsTUFLVCxNQUFJLHNCQUF3QixJQUFPLE1BQU8sR0FBSSxvQkFBdUIsV0FDbkUsR0FBQSxLQUFLLEVBQUsscUJBQXNCLFNBQVMsRUFBeUIsQ0FDaEUsTUFBTyxXQUFBLFFBQVMsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsR0FBQSxVQUFBLEdBQ2QsV0FDTyxFQUFTLE1BQU0sRUFBSyxNQUkvQixFQUFJLGlCQUFpQixtQkFBb0IsR0FHcEMsRUFBYSxNQUFNLEVBQUssTUFJbkMsR0FBQSxLQUFLLEVBQVUsT0FBUSxTQUFTLEVBQXdCLENBQ3RELE1BQU8sV0FBQSxRQUE0QyxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsVUFBQSxPQUFBLElBQUEsRUFBQSxHQUFBLFVBQUEsR0FDakQsU0FBWSxLQUFLLE1BQ2pCLEVBQWMsS0FBSyxHQUVuQixHQUFnQixNQUFPLENBQ3JCLEtBQUksRUFDSixlQUFnQixLQUFLLE1BQ3JCLElBQUssT0FHQSxFQUFhLE1BQU0sS0FBTSxPQUt0QyxHQUFJLElBR0osYUFBMEIsQ0FDeEIsR0FBSSxDQUFDLEdBQUEsa0JBQ0gsT0FHRixHQUFNLEdBQWdCLEVBQU8sV0FDN0IsRUFBTyxXQUFhLFVBQUEsUUFBb0MsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsR0FBQSxVQUFBLEdBQ3RELEdBQU0sR0FBSyxFQUFPLFNBQVMsS0FFckIsRUFBTyxHQU1iLEdBTEEsR0FBVyxFQUNYLEdBQWdCLFVBQVcsQ0FDekIsS0FBSSxFQUNKLEdBQUUsSUFFQSxFQUlGLEdBQUksQ0FDRixNQUFPLEdBQWMsTUFBTSxLQUFNLFFBQ2pDLElBT04sV0FBb0MsRUFBbUMsQ0FDckUsTUFBTyxXQUFBLFFBQXdCLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxVQUFBLE9BQUEsSUFBQSxFQUFBLEdBQUEsVUFBQSxHQUM3QixHQUFNLEdBQU0sRUFBSyxPQUFTLEVBQUksRUFBSyxHQUFLLE9BQ3hDLEdBQUksRUFBSyxDQUVQLEdBQU0sR0FBTyxHQUNQLEVBQUssT0FBTyxHQUVsQixHQUFXLEVBQ1gsR0FBZ0IsVUFBVyxDQUN6QixLQUFJLEVBQ0osR0FBRSxJQUdOLE1BQU8sR0FBd0IsTUFBTSxLQUFNLElBSS9DLEdBQUEsS0FBSyxFQUFPLFFBQVMsWUFBYSxHQUNsQyxHQUFBLEtBQUssRUFBTyxRQUFTLGVBQWdCLEdBR3ZDLEdBQU0sSUFBbUIsSUFDckIsR0FDQSxHQU9KLFlBQTRDLEVBQTZCLEVBQWMsQ0FPckYsR0FMSSxDQUFDLEdBS0QsRUFBUyxPQUFTLEVBQVEsS0FDNUIsTUFBTyxHQUdULEdBQUksQ0FHRixHQUFJLEVBQVMsU0FBVyxFQUFRLE9BQzlCLE1BQU8sUUFFVCxFQVFGLE1BQU8sR0FPVCxZQUE0QixFQUFZLENBRXRDLEdBQUksRUFBTSxPQUFTLFdBQ2pCLE1BQU8sR0FHVCxHQUFJLENBQ0YsR0FBTSxHQUFTLEVBQU0sT0FFckIsR0FBSSxDQUFDLEdBQVUsQ0FBQyxFQUFPLFFBQ3JCLE1BQU8sR0FLVCxHQUFJLEVBQU8sVUFBWSxTQUFXLEVBQU8sVUFBWSxZQUFjLEVBQU8sa0JBQ3hFLE1BQU8sUUFFVCxFQUtGLE1BQU8sR0FVVCxZQUE2QixFQUFtQixFQUErQixDQUEvQixNQUFBLEtBQUEsUUFBQSxHQUFBLElBQ3ZDLFNBQUMsRUFBWSxDQUlsQixHQUFJLEdBQUMsR0FBUyxLQUFzQixJQUtoQyxJQUFtQixHQUl2QixJQUFNLEdBQU8sRUFBTSxPQUFTLFdBQWEsUUFBVSxFQUFNLEtBR3pELEFBQUksS0FBb0IsT0FDdEIsR0FBUSxDQUNOLE1BQU8sRUFDUCxLQUFJLEVBQ0osT0FBUSxJQUVWLEdBQW9CLEdBSWIsR0FBbUMsR0FBbUIsSUFDN0QsR0FBUSxDQUNOLE1BQU8sRUFDUCxLQUFJLEVBQ0osT0FBUSxJQUVWLEdBQW9CLEdBSXRCLGFBQWEsSUFDYixHQUFrQixFQUFPLFdBQVcsVUFBQSxDQUNsQyxHQUFrQixRQUNqQixNQTBCUCxhQUFzQixDQUNwQixHQUFNLFlBQWMsR0FPcEIsSUFBTSxHQUFvQixHQUFnQixLQUFLLEtBQU0sT0FDL0MsRUFBd0IsR0FBb0IsRUFBbUIsSUFDckUsRUFBTyxTQUFTLGlCQUFpQixRQUFTLEVBQXVCLElBQ2pFLEVBQU8sU0FBUyxpQkFBaUIsV0FBWSxFQUF1QixJQU9wRSxDQUFDLGNBQWUsUUFBUSxRQUFRLFNBQUMsRUFBYyxDQUU3QyxHQUFNLEdBQVMsRUFBZSxJQUFZLEVBQWUsR0FBUSxVQUVqRSxBQUFJLENBQUMsR0FBUyxDQUFDLEVBQU0sZ0JBQWtCLENBQUMsRUFBTSxlQUFlLHFCQUk3RCxJQUFBLEtBQUssRUFBTyxtQkFBb0IsU0FBUyxFQUEwQyxDQUNqRixNQUFPLFVBRUwsRUFDQSxFQUNBLEVBQTJDLENBRTNDLEdBQUksSUFBUyxTQUFXLEdBQVEsV0FDOUIsR0FBSSxDQUNGLEdBQU0sR0FBSyxLQUNMLEVBQVksRUFBRyxvQ0FBc0MsRUFBRyxxQ0FBdUMsR0FDL0YsRUFBa0IsRUFBUyxHQUFRLEVBQVMsSUFBUyxDQUFFLFNBQVUsR0FFdkUsR0FBSSxDQUFDLEVBQWUsUUFBUyxDQUMzQixHQUFNLEdBQVUsR0FBb0IsR0FDcEMsRUFBZSxRQUFVLEVBQ3pCLEVBQXlCLEtBQUssS0FBTSxFQUFNLEVBQVMsR0FHckQsRUFBZSxVQUFZLE9BQzNCLEVBTUosTUFBTyxHQUF5QixLQUFLLEtBQU0sRUFBTSxFQUFVLE1BSS9ELEdBQUEsS0FBSyxFQUFPLHNCQUF1QixTQUFTLEVBQWdELENBQzFGLE1BQU8sVUFFTCxFQUNBLEVBQ0EsRUFBd0MsQ0FFeEMsR0FBSSxJQUFTLFNBQVcsR0FBUSxXQUM5QixHQUFJLENBQ0YsR0FBTSxHQUFLLEtBQ0wsRUFBVyxFQUFHLHFDQUF1QyxHQUNyRCxFQUFpQixFQUFTLEdBRWhDLEFBQUksR0FDRixHQUFlLFVBQVksRUFFdkIsRUFBZSxVQUFZLEdBQzdCLEdBQTRCLEtBQUssS0FBTSxFQUFNLEVBQWUsUUFBUyxHQUNyRSxFQUFlLFFBQVUsT0FDekIsTUFBTyxHQUFTLElBSWQsT0FBTyxLQUFLLEdBQVUsU0FBVyxHQUNuQyxNQUFPLEdBQUcsMENBR2QsRUFNSixNQUFPLEdBQTRCLEtBQUssS0FBTSxFQUFNLEVBQVUsVUFNdEUsR0FBSSxJQUEwQyxLQUU5QyxhQUF3QixDQUN0QixHQUFxQixFQUFPLFFBRTVCLEVBQU8sUUFBVSxTQUFTLEVBQVUsRUFBVSxFQUFXLEVBQWEsRUFBVSxDQVM5RSxNQVJBLElBQWdCLFFBQVMsQ0FDdkIsT0FBTSxFQUNOLE1BQUssRUFDTCxLQUFJLEVBQ0osSUFBRyxFQUNILElBQUcsSUFHRCxHQUVLLEdBQW1CLE1BQU0sS0FBTSxXQUdqQyxJQUlYLEdBQUksSUFBNkQsS0FFakUsYUFBcUMsQ0FDbkMsR0FBa0MsRUFBTyxxQkFFekMsRUFBTyxxQkFBdUIsU0FBUyxFQUFNLENBRzNDLE1BRkEsSUFBZ0IscUJBQXNCLEdBRWxDLEdBRUssR0FBZ0MsTUFBTSxLQUFNLFdBRzlDLGtGQzNuQlgsR0FBQSxLQUNBLEdBQUEsS0FjQSxhQUFxQixDQUNuQixHQUFNLEdBQVMsR0FBQSxrQkFDVCxFQUFTLEVBQU8sUUFBVSxFQUFPLFNBRXZDLEdBQUksQUFBRSxJQUFXLFFBQVcsRUFBTyxnQkFBaUIsQ0FFbEQsR0FBTSxHQUFNLEdBQUksYUFBWSxHQUM1QixFQUFPLGdCQUFnQixHQUl2QixFQUFJLEdBQU0sRUFBSSxHQUFLLEtBQVMsTUFHNUIsRUFBSSxHQUFNLEVBQUksR0FBSyxNQUFVLE1BRTdCLEdBQU0sR0FBTSxTQUFDLEVBQVcsQ0FFdEIsT0FESSxHQUFJLEVBQUksU0FBUyxJQUNkLEVBQUUsT0FBUyxHQUNoQixFQUFJLElBQUksRUFFVixNQUFPLElBR1QsTUFDRSxHQUFJLEVBQUksSUFBTSxFQUFJLEVBQUksSUFBTSxFQUFJLEVBQUksSUFBTSxFQUFJLEVBQUksSUFBTSxFQUFJLEVBQUksSUFBTSxFQUFJLEVBQUksSUFBTSxFQUFJLEVBQUksSUFBTSxFQUFJLEVBQUksSUFJOUcsTUFBTyxtQ0FBbUMsUUFBUSxRQUFTLFNBQUEsRUFBQyxDQUUxRCxHQUFNLEdBQUssS0FBSyxTQUFXLEdBQU0sRUFFM0IsRUFBSSxJQUFNLElBQU0sRUFBSyxFQUFJLEVBQU8sRUFDdEMsTUFBTyxHQUFFLFNBQVMsTUFsQ3RCLEdBQUEsTUFBQSxHQTZDQSxZQUNFLEVBQVcsQ0FPWCxHQUFJLENBQUMsRUFDSCxNQUFPLEdBR1QsR0FBTSxHQUFRLEVBQUksTUFBTSxnRUFFeEIsR0FBSSxDQUFDLEVBQ0gsTUFBTyxHQUlULEdBQU0sR0FBUSxFQUFNLElBQU0sR0FDcEIsRUFBVyxFQUFNLElBQU0sR0FDN0IsTUFBTyxDQUNMLEtBQU0sRUFBTSxHQUNaLEtBQU0sRUFBTSxHQUNaLFNBQVUsRUFBTSxHQUNoQixTQUFVLEVBQU0sR0FBSyxFQUFRLEdBekJqQyxHQUFBLFNBQUEsR0FpQ0EsWUFBb0MsRUFBWSxDQUM5QyxHQUFJLEVBQU0sUUFDUixNQUFPLEdBQU0sUUFFZixHQUFJLEVBQU0sV0FBYSxFQUFNLFVBQVUsUUFBVSxFQUFNLFVBQVUsT0FBTyxHQUFJLENBQzFFLEdBQU0sR0FBWSxFQUFNLFVBQVUsT0FBTyxHQUV6QyxNQUFJLEdBQVUsTUFBUSxFQUFVLE1BQ3BCLEVBQVUsS0FBSSxLQUFLLEVBQVUsTUFFbEMsRUFBVSxNQUFRLEVBQVUsT0FBUyxFQUFNLFVBQVksWUFFaEUsTUFBTyxHQUFNLFVBQVksWUFaM0IsR0FBQSxvQkFBQSxHQXNCQSxZQUFzQyxFQUFjLEVBQWdCLEVBQWEsQ0FDL0UsRUFBTSxVQUFZLEVBQU0sV0FBYSxHQUNyQyxFQUFNLFVBQVUsT0FBUyxFQUFNLFVBQVUsUUFBVSxHQUNuRCxFQUFNLFVBQVUsT0FBTyxHQUFLLEVBQU0sVUFBVSxPQUFPLElBQU0sR0FDekQsRUFBTSxVQUFVLE9BQU8sR0FBRyxNQUFRLEVBQU0sVUFBVSxPQUFPLEdBQUcsT0FBUyxHQUFTLEdBQzlFLEVBQU0sVUFBVSxPQUFPLEdBQUcsS0FBTyxFQUFNLFVBQVUsT0FBTyxHQUFHLE1BQVEsR0FBUSxRQUw3RSxHQUFBLHNCQUFBLEdBZUEsWUFBc0MsRUFBYyxFQUFpQyxPQUNuRixHQUFJLEdBQUMsRUFBTSxXQUFhLENBQUMsRUFBTSxVQUFVLFFBR3pDLElBQU0sR0FBa0IsRUFBTSxVQUFVLE9BQU8sR0FFekMsRUFBbUIsQ0FBRSxLQUFNLFVBQVcsUUFBUyxJQUMvQyxFQUFtQixFQUFnQixVQUd6QyxHQUZBLEVBQWdCLFVBQVMsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FBUSxHQUFxQixHQUFxQixHQUV2RSxHQUFnQixRQUFVLEdBQWMsQ0FDMUMsR0FBTSxHQUFVLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FBQSxHQUFRLEtBQWdCLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxNQUFTLEVBQWEsTUFDaEUsRUFBZ0IsVUFBVSxLQUFPLElBWnJDLEdBQUEsc0JBQUEsR0FpQkEsR0FBTSxJQUFnQixzTEFpQnRCLFlBQTRCLEVBQWEsQ0FDdkMsR0FBTSxHQUFRLEVBQU0sTUFBTSxLQUFrQixHQUN0QyxFQUFRLFNBQVMsRUFBTSxHQUFJLElBQzNCLEVBQVEsU0FBUyxFQUFNLEdBQUksSUFDM0IsRUFBUSxTQUFTLEVBQU0sR0FBSSxJQUNqQyxNQUFPLENBQ0wsY0FBZSxFQUFNLEdBQ3JCLE1BQU8sTUFBTSxHQUFTLE9BQVksRUFDbEMsTUFBTyxNQUFNLEdBQVMsT0FBWSxFQUNsQyxNQUFPLE1BQU0sR0FBUyxPQUFZLEVBQ2xDLFdBQVksRUFBTSxJQVZ0QixHQUFBLFlBQUEsR0FjQSxHQUFNLElBQW9CLEdBQUssSUFPL0IsWUFBc0MsRUFBYSxFQUErQixDQUNoRixHQUFJLENBQUMsRUFDSCxNQUFPLElBR1QsR0FBTSxHQUFjLFNBQVMsR0FBRyxFQUFVLElBQzFDLEdBQUksQ0FBQyxNQUFNLEdBQ1QsTUFBTyxHQUFjLElBR3ZCLEdBQU0sR0FBYSxLQUFLLE1BQU0sR0FBRyxHQUNqQyxNQUFLLE9BQU0sR0FJSixHQUhFLEVBQWEsRUFaeEIsR0FBQSxzQkFBQSxHQXlCQSxZQUFrQyxFQUFpQixFQUFtQixFQUEwQixDQUExQixBQUFBLElBQUEsUUFBQSxHQUFBLEdBQ3BFLEdBQU0sR0FBUyxFQUFNLFFBQVUsRUFDekIsRUFBVyxFQUFNLE9BQ2pCLEVBQWEsS0FBSyxJQUFJLEtBQUssSUFBSSxFQUFVLEVBQVMsR0FBSSxHQUU1RCxFQUFNLFlBQWMsRUFDakIsTUFBTSxLQUFLLElBQUksRUFBRyxFQUFhLEdBQWlCLEdBQ2hELElBQUksU0FBQyxFQUFZLENBQUssTUFBQSxJQUFBLFNBQVMsRUFBTSxLQUV4QyxFQUFNLGFBQWUsR0FBQSxTQUFTLEVBQU0sS0FBSyxJQUFJLEVBQVcsRUFBRyxJQUFjLEVBQU0sT0FBUyxHQUV4RixFQUFNLGFBQWUsRUFDbEIsTUFBTSxLQUFLLElBQUksRUFBYSxFQUFHLEdBQVcsRUFBYSxFQUFJLEdBQzNELElBQUksU0FBQyxFQUFZLENBQUssTUFBQSxJQUFBLFNBQVMsRUFBTSxLQWIxQyxHQUFBLGtCQUFBLEdBc0JBLFlBQXlDLEVBQWUsQ0FFdEQsTUFBTyxHQUFRLE1BQU0sUUFBUyxHQUFHLEdBRm5DLEdBQUEseUJBQUEsR0EwQkEsWUFBd0MsRUFBa0IsT0FFeEQsR0FBQSxHQUFLLEtBQWlCLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxvQkFDdEIsTUFBTyxHQUdULEdBQUksQ0FHRixPQUFPLGVBQWUsRUFBVyxzQkFBdUIsQ0FDdEQsTUFBTyxVQUVULEVBSUYsTUFBTyxHQWhCVCxHQUFBLHdCQUFBLEtDclFBLGdFQUlBLFlBQXdCLEVBQWlCLEVBQXdCLENBRy9ELE9BREksR0FBSyxFQUNBLEVBQUksRUFBTSxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQUssQ0FDMUMsR0FBTSxHQUFPLEVBQU0sR0FDbkIsQUFBSSxJQUFTLElBQ1gsRUFBTSxPQUFPLEVBQUcsR0FDWCxBQUFJLElBQVMsS0FDbEIsR0FBTSxPQUFPLEVBQUcsR0FFaEIsS0FDUyxHQUNULEdBQU0sT0FBTyxFQUFHLEdBRWhCLEtBS0osR0FBSSxFQUVGLEtBQU8sSUFBTSxFQUNYLEVBQU0sUUFBUSxNQUlsQixNQUFPLEdBS1QsR0FBTSxJQUFjLDZEQUVwQixZQUFtQixFQUFnQixDQUNqQyxHQUFNLEdBQVEsR0FBWSxLQUFLLEdBQy9CLE1BQU8sR0FBUSxFQUFNLE1BQU0sR0FBSyxHQU1sQyxhQUF1QixRQUFDLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxVQUFBLE9BQUEsSUFBQSxFQUFBLEdBQUEsVUFBQSxHQUl0QixPQUhJLEdBQWUsR0FDZixFQUFtQixHQUVkLEVBQUksRUFBSyxPQUFTLEVBQUcsR0FBSyxJQUFNLENBQUMsRUFBa0IsSUFBSyxDQUMvRCxHQUFNLEdBQU8sR0FBSyxFQUFJLEVBQUssR0FBSyxJQUdoQyxBQUFJLENBQUMsR0FJTCxHQUFrQixFQUFJLElBQUksRUFDMUIsRUFBbUIsRUFBSyxPQUFPLEtBQU8sS0FPeEMsU0FBZSxHQUNiLEVBQWEsTUFBTSxLQUFLLE9BQU8sU0FBQSxFQUFDLENBQUksTUFBQSxDQUFDLENBQUMsSUFDdEMsQ0FBQyxHQUNELEtBQUssS0FFQyxHQUFtQixJQUFNLElBQU0sR0FBZ0IsSUF6QnpELEdBQUEsUUFBQSxHQTZCQSxZQUFjLEVBQWEsQ0FFekIsT0FESSxHQUFRLEVBQ0wsRUFBUSxFQUFJLFFBQ2IsRUFBSSxLQUFXLEdBRE0sSUFDekIsQ0FNRixPQURJLEdBQU0sRUFBSSxPQUFTLEVBQ2hCLEdBQU8sR0FDUixFQUFJLEtBQVMsR0FERixJQUNmLENBS0YsTUFBSSxHQUFRLEVBQ0gsR0FFRixFQUFJLE1BQU0sRUFBTyxFQUFNLEVBQVEsR0FNeEMsWUFBeUIsRUFBYyxFQUFVLENBRS9DLEVBQU8sR0FBUSxHQUFNLE9BQU8sR0FDNUIsRUFBSyxHQUFRLEdBQUksT0FBTyxHQVF4QixPQUxNLEdBQVksR0FBSyxFQUFLLE1BQU0sTUFDNUIsRUFBVSxHQUFLLEVBQUcsTUFBTSxNQUV4QixFQUFTLEtBQUssSUFBSSxFQUFVLE9BQVEsRUFBUSxRQUM5QyxFQUFrQixFQUNiLEVBQUksRUFBRyxFQUFJLEVBQVEsSUFDMUIsR0FBSSxFQUFVLEtBQU8sRUFBUSxHQUFJLENBQy9CLEVBQWtCLEVBQ2xCLE1BS0osT0FESSxHQUFjLEdBQ1QsRUFBSSxFQUFpQixFQUFJLEVBQVUsT0FBUSxJQUNsRCxFQUFZLEtBQUssTUFHbkIsU0FBYyxFQUFZLE9BQU8sRUFBUSxNQUFNLElBRXhDLEVBQVksS0FBSyxLQXpCMUIsR0FBQSxTQUFBLEdBK0JBLFlBQThCLEVBQVksQ0FDeEMsR0FBTSxHQUFpQixHQUFXLEdBQzVCLEVBQWdCLEVBQUssT0FBTyxNQUFRLElBR3RDLEVBQWlCLEdBQ25CLEVBQUssTUFBTSxLQUFLLE9BQU8sU0FBQSxFQUFDLENBQUksTUFBQSxDQUFDLENBQUMsSUFDOUIsQ0FBQyxHQUNELEtBQUssS0FFUCxNQUFJLENBQUMsR0FBa0IsQ0FBQyxHQUN0QixHQUFpQixLQUVmLEdBQWtCLEdBQ3BCLElBQWtCLEtBR1osR0FBaUIsSUFBTSxJQUFNLEVBakJ2QyxHQUFBLGNBQUEsR0FzQkEsWUFBMkIsRUFBWSxDQUNyQyxNQUFPLEdBQUssT0FBTyxLQUFPLElBRDVCLEdBQUEsV0FBQSxHQU1BLGFBQW9CLFFBQUMsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsR0FBQSxVQUFBLEdBQ25CLE1BQU8sSUFBYyxFQUFLLEtBQUssTUFEakMsR0FBQSxLQUFBLEdBS0EsWUFBd0IsRUFBWSxDQUNsQyxHQUFNLEdBQVMsR0FBVSxHQUNuQixFQUFPLEVBQU8sR0FDaEIsRUFBTSxFQUFPLEdBRWpCLE1BQUksQ0FBQyxHQUFRLENBQUMsRUFFTCxJQUdMLElBRUYsR0FBTSxFQUFJLE9BQU8sRUFBRyxFQUFJLE9BQVMsSUFHNUIsRUFBTyxHQWZoQixHQUFBLFFBQUEsR0FtQkEsWUFBeUIsRUFBYyxFQUFZLENBQ2pELEdBQUksR0FBSSxHQUFVLEdBQU0sR0FDeEIsTUFBSSxJQUFPLEVBQUUsT0FBTyxFQUFJLE9BQVMsTUFBUSxHQUN2QyxHQUFJLEVBQUUsT0FBTyxFQUFHLEVBQUUsT0FBUyxFQUFJLFNBRTFCLEVBTFQsR0FBQSxTQUFBLHFFQ2pMQSxHQUFBLElBQUEsS0FnQkEsR0FBQSxVQUFBLENBU0UsV0FDRSxFQUF3RyxDQUQxRyxHQUFBLEdBQUEsS0FSUSxLQUFBLE9BQU0sVUFDTixLQUFBLFVBSUgsR0FnSlksS0FBQSxTQUFXLFNBQUMsRUFBaUMsQ0FDNUQsRUFBSyxXQUFVLFdBQWtCLElBSWxCLEtBQUEsUUFBVSxTQUFDLEVBQVksQ0FDdEMsRUFBSyxXQUFVLFdBQWtCLElBSWxCLEtBQUEsV0FBYSxTQUFDLEVBQWUsRUFBZ0MsQ0FDNUUsR0FBSSxFQUFLLFNBQU0sVUFJZixJQUFJLEdBQUEsV0FBVyxHQUFRLENBQ3JCLEFBQU0sRUFBeUIsS0FBSyxFQUFLLFNBQVUsRUFBSyxTQUN4RCxPQUdGLEVBQUssT0FBUyxFQUNkLEVBQUssT0FBUyxFQUVkLEVBQUsscUJBS1UsS0FBQSxlQUFpQixTQUFDLEVBT2xDLENBQ0MsRUFBSyxVQUFZLEVBQUssVUFBVSxPQUFPLEdBQ3ZDLEVBQUssb0JBSVUsS0FBQSxpQkFBbUIsVUFBQSxDQUNsQyxHQUFJLEVBQUssU0FBTSxVQUlmLElBQU0sR0FBaUIsRUFBSyxVQUFVLFFBQ3RDLEVBQUssVUFBWSxHQUVqQixFQUFlLFFBQVEsU0FBQSxFQUFPLENBQzVCLEFBQUksRUFBUSxNQUlSLEdBQUssU0FBTSxZQUNULEVBQVEsYUFFVixFQUFRLFlBQWEsRUFBSyxRQUkxQixFQUFLLFNBQU0sWUFDVCxFQUFRLFlBQ1YsRUFBUSxXQUFXLEVBQUssUUFJNUIsRUFBUSxLQUFPLFFBN01qQixHQUFJLENBQ0YsRUFBUyxLQUFLLFNBQVUsS0FBSyxlQUN0QixFQUFQLENBQ0EsS0FBSyxRQUFRLElBS0gsU0FBQSxRQUFkLFNBQXlCLEVBQXlCLENBQ2hELE1BQU8sSUFBSSxHQUFZLFNBQUEsRUFBTyxDQUM1QixFQUFRLE1BS0UsRUFBQSxPQUFkLFNBQWdDLEVBQVksQ0FDMUMsTUFBTyxJQUFJLEdBQVksU0FBQyxFQUFHLEVBQU0sQ0FDL0IsRUFBTyxNQUtHLEVBQUEsSUFBZCxTQUEyQixFQUFxQyxDQUM5RCxNQUFPLElBQUksR0FBaUIsU0FBQyxFQUFTLEVBQU0sQ0FDMUMsR0FBSSxDQUFDLE1BQU0sUUFBUSxHQUFhLENBQzlCLEVBQU8sR0FBSSxXQUFVLDRDQUNyQixPQUdGLEdBQUksRUFBVyxTQUFXLEVBQUcsQ0FDM0IsRUFBUSxJQUNSLE9BR0YsR0FBSSxHQUFVLEVBQVcsT0FDbkIsRUFBMEIsR0FFaEMsRUFBVyxRQUFRLFNBQUMsRUFBTSxFQUFLLENBQzdCLEFBQUssRUFBWSxRQUFRLEdBQ3RCLEtBQUssU0FBQSxFQUFLLENBSVQsQUFIQSxFQUFtQixHQUFTLEVBQzVCLEdBQVcsRUFFUCxJQUFZLEdBR2hCLEVBQVEsS0FFVCxLQUFLLEtBQU0sUUFNYixFQUFBLFVBQUEsS0FBUCxTQUNFLEVBQ0EsRUFBdUUsQ0FGekUsR0FBQSxHQUFBLEtBSUUsTUFBTyxJQUFJLEdBQVksU0FBQyxFQUFTLEVBQU0sQ0FDckMsRUFBSyxlQUFlLENBQ2xCLEtBQU0sR0FDTixZQUFhLFNBQUEsRUFBTSxDQUNqQixHQUFJLENBQUMsRUFBYSxDQUdoQixFQUFRLEdBQ1IsT0FFRixHQUFJLENBQ0YsRUFBUSxFQUFZLElBQ3BCLGFBQ08sRUFBUCxDQUNBLEVBQU8sR0FDUCxTQUdKLFdBQVksU0FBQSxFQUFNLENBQ2hCLEdBQUksQ0FBQyxFQUFZLENBQ2YsRUFBTyxHQUNQLE9BRUYsR0FBSSxDQUNGLEVBQVEsRUFBVyxJQUNuQixhQUNPLEVBQVAsQ0FDQSxFQUFPLEdBQ1AsY0FRSCxFQUFBLFVBQUEsTUFBUCxTQUNFLEVBQXFFLENBRXJFLE1BQU8sTUFBSyxLQUFLLFNBQUEsRUFBRyxDQUFJLE1BQUEsSUFBSyxJQUl4QixFQUFBLFVBQUEsUUFBUCxTQUF3QixFQUErQixDQUF2RCxHQUFBLEdBQUEsS0FDRSxNQUFPLElBQUksR0FBcUIsU0FBQyxFQUFTLEVBQU0sQ0FDOUMsR0FBSSxHQUNBLEVBRUosTUFBTyxHQUFLLEtBQ1YsU0FBQSxFQUFLLENBQ0gsRUFBYSxHQUNiLEVBQU0sRUFDRixHQUNGLEtBR0osU0FBQSxFQUFNLENBQ0osRUFBYSxHQUNiLEVBQU0sRUFDRixHQUNGLE1BR0osS0FBSyxVQUFBLENBQ0wsR0FBSSxFQUFZLENBQ2QsRUFBTyxHQUNQLE9BR0YsRUFBUyxRQU1SLEVBQUEsVUFBQSxTQUFQLFVBQUEsQ0FDRSxNQUFPLHdCQTBFWCxLQUVTLEdBQUEsWUFBQSxxRUNsUFQsR0FBQSxJQUFBLEtBQ0EsR0FBQSxLQUdBLEdBQUEsVUFBQSxDQUlFLFdBQTZCLEVBQWUsQ0FBZixLQUFBLE9BQUEsRUFGWixLQUFBLFFBQWlDLEdBTzNDLFNBQUEsVUFBQSxRQUFQLFVBQUEsQ0FDRSxNQUFPLE1BQUssU0FBVyxRQUFhLEtBQUssU0FBVyxLQUFLLFFBYXBELEVBQUEsVUFBQSxJQUFQLFNBQVcsRUFBa0MsQ0FBN0MsR0FBQSxHQUFBLEtBQ0UsR0FBSSxDQUFDLEtBQUssVUFDUixNQUFPLElBQUEsWUFBWSxPQUFPLEdBQUksSUFBQSxZQUFZLG9EQUk1QyxHQUFNLEdBQU8sSUFDYixNQUFJLE1BQUssUUFBUSxRQUFRLEtBQVUsSUFDakMsS0FBSyxRQUFRLEtBQUssR0FFZixFQUNGLEtBQUssVUFBQSxDQUFNLE1BQUEsR0FBSyxPQUFPLEtBSXZCLEtBQUssS0FBTSxVQUFBLENBQ1YsTUFBQSxHQUFLLE9BQU8sR0FBTSxLQUFLLEtBQU0sVUFBQSxNQUkxQixHQVNGLEVBQUEsVUFBQSxPQUFQLFNBQWMsRUFBb0IsQ0FDaEMsR0FBTSxHQUFjLEtBQUssUUFBUSxPQUFPLEtBQUssUUFBUSxRQUFRLEdBQU8sR0FBRyxHQUN2RSxNQUFPLElBTUYsRUFBQSxVQUFBLE9BQVAsVUFBQSxDQUNFLE1BQU8sTUFBSyxRQUFRLFFBWWYsRUFBQSxVQUFBLE1BQVAsU0FBYSxFQUFnQixDQUE3QixHQUFBLEdBQUEsS0FDRSxNQUFPLElBQUksSUFBQSxZQUFxQixTQUFBLEVBQU8sQ0FFckMsR0FBTSxHQUFxQixXQUFXLFVBQUEsQ0FDcEMsQUFBSSxHQUFXLEVBQVUsR0FDdkIsRUFBUSxLQUVULEdBR0gsQUFBSyxHQUFBLFlBQVksSUFBSSxFQUFLLFNBQ3ZCLEtBQUssVUFBQSxDQUNKLGFBQWEsR0FDYixFQUFRLE1BRVQsS0FBSyxLQUFNLFVBQUEsQ0FDVixFQUFRLFNBSWxCLEtBN0ZhLEdBQUEsY0FBQSwwRUNKYixHQUFBLElBQUEsS0FDQSxHQUFBLEtBZ0JNLEdBQXVDLENBQzNDLFdBQVksVUFBQSxDQUFNLE1BQUEsTUFBSyxNQUFRLE1Bd0JqQyxhQUE4QixDQUNwQixHQUFBLEdBQUEsR0FBQSxrQkFBQSxZQUNSLEdBQUksR0FBQyxHQUFlLENBQUMsRUFBWSxLQXlCakMsSUFBTSxHQUFhLEtBQUssTUFBUSxFQUFZLE1BRTVDLE1BQU8sQ0FDTCxJQUFLLFVBQUEsQ0FBTSxNQUFBLEdBQVksT0FDdkIsV0FBVSxJQVFkLGFBQTJCLENBQ3pCLEdBQUksQ0FDRixHQUFNLEdBQVksR0FBQSxlQUFlLEdBQVEsY0FDekMsTUFBTyxHQUFVLGlCQUNqQixDQUNBLFFBT0osR0FBTSxJQUErQyxHQUFBLFlBQWMsS0FBdUIsS0FFcEYsR0FDSixLQUF3QixPQUNwQixHQUNBLENBQ0UsV0FBWSxVQUFBLENBQU0sTUFBQyxJQUFvQixXQUFhLEdBQW9CLE9BQVMsTUFNNUUsR0FBQSx1QkFBdUMsR0FBb0IsV0FBVyxLQUFLLElBYTNFLEdBQUEsbUJBQW1DLEdBQWdCLFdBQVcsS0FBSyxJQUduRSxHQUFBLGdCQUFrQixHQUFBLG1CQUtsQixHQUFBLG9CQUFzQixLQUF3QixPQVc5QyxHQUFBLDZCQUFnQyxVQUFBLENBS25DLEdBQUEsR0FBQSxHQUFBLGtCQUFBLFlBQ1IsR0FBSSxDQUFDLEdBQWUsQ0FBQyxFQUFZLElBQUssQ0FDcEMsR0FBQSxrQ0FBb0MsT0FDcEMsT0FHRixHQUFNLEdBQVksS0FBTyxJQUNuQixFQUFpQixFQUFZLE1BQzdCLEVBQVUsS0FBSyxNQUdmLEVBQWtCLEVBQVksV0FDaEMsS0FBSyxJQUFJLEVBQVksV0FBYSxFQUFpQixHQUNuRCxFQUNFLEVBQXVCLEVBQWtCLEVBUXpDLEVBQWtCLEVBQVksUUFBVSxFQUFZLE9BQU8sZ0JBQzNELEVBQXFCLE1BQU8sSUFBb0IsU0FFaEQsRUFBdUIsRUFBcUIsS0FBSyxJQUFJLEVBQWtCLEVBQWlCLEdBQVcsRUFDbkcsRUFBNEIsRUFBdUIsRUFFekQsTUFBSSxJQUF3QixFQUV0QixHQUFtQixFQUNyQixJQUFBLGtDQUFvQyxhQUM3QixFQUFZLFlBRW5CLElBQUEsa0NBQW9DLGtCQUM3QixHQUtYLElBQUEsa0NBQW9DLFVBQzdCLGdGQ3ZMVCxHQUFBLGFBQUEsS0FBQSxHQUNBLEdBQUEsYUFBQSxLQUFBLEdBQ0EsR0FBQSxhQUFBLEtBQUEsR0FDQSxHQUFBLGFBQUEsS0FBQSxHQUNBLEdBQUEsYUFBQSxLQUFBLEdBQ0EsR0FBQSxhQUFBLEtBQUEsR0FDQSxHQUFBLGFBQUEsS0FBQSxHQUNBLEdBQUEsYUFBQSxLQUFBLEdBQ0EsR0FBQSxhQUFBLEtBQUEsR0FDQSxHQUFBLGFBQUEsS0FBQSxHQUNBLEdBQUEsYUFBQSxLQUFBLEdBQ0EsR0FBQSxhQUFBLEtBQUEsR0FDQSxHQUFBLGFBQUEsS0FBQSxHQUNBLEdBQUEsYUFBQSxLQUFBLEdBQ0EsR0FBQSxhQUFBLEtBQUEsR0FDQSxHQUFBLGFBQUEsS0FBQSxHQUNBLEdBQUEsYUFBQSxLQUFBLEdBQ0EsR0FBQSxhQUFBLEtBQUEsR0FDQSxHQUFBLGFBQUEsS0FBQSwrRUNFQSxHQUFBLElBUU0sR0FBa0IsSUFNeEIsR0FBQSxVQUFBLENBQUEsWUFBQSxDQUVZLEtBQUEsb0JBQStCLEdBRy9CLEtBQUEsZ0JBQWlELEdBR2pELEtBQUEsaUJBQXFDLEdBR3JDLEtBQUEsYUFBNkIsR0FHN0IsS0FBQSxNQUFjLEdBR2QsS0FBQSxNQUFzQyxHQUd0QyxLQUFBLE9BQWlCLEdBR2pCLEtBQUEsVUFBc0IsR0F3QmxCLFNBQUEsTUFBZCxTQUFvQixFQUFhLENBQy9CLEdBQU0sR0FBVyxHQUFJLEdBQ3JCLE1BQUksSUFDRixHQUFTLGFBQVksRUFBQSxTQUFPLEVBQU0sY0FDbEMsRUFBUyxNQUFLLEVBQUEsU0FBQSxHQUFRLEVBQU0sT0FDNUIsRUFBUyxPQUFNLEVBQUEsU0FBQSxHQUFRLEVBQU0sUUFDN0IsRUFBUyxVQUFTLEVBQUEsU0FBQSxHQUFRLEVBQU0sV0FDaEMsRUFBUyxNQUFRLEVBQU0sTUFDdkIsRUFBUyxPQUFTLEVBQU0sT0FDeEIsRUFBUyxNQUFRLEVBQU0sTUFDdkIsRUFBUyxTQUFXLEVBQU0sU0FDMUIsRUFBUyxpQkFBbUIsRUFBTSxpQkFDbEMsRUFBUyxhQUFlLEVBQU0sYUFDOUIsRUFBUyxpQkFBZ0IsRUFBQSxTQUFPLEVBQU0sa0JBQ3RDLEVBQVMsZ0JBQWtCLEVBQU0saUJBRTVCLEdBT0YsRUFBQSxVQUFBLGlCQUFQLFNBQXdCLEVBQWdDLENBQ3RELEtBQUssZ0JBQWdCLEtBQUssSUFNckIsRUFBQSxVQUFBLGtCQUFQLFNBQXlCLEVBQXdCLENBQy9DLFlBQUssaUJBQWlCLEtBQUssR0FDcEIsTUFNRixFQUFBLFVBQUEsUUFBUCxTQUFlLEVBQWlCLENBQzlCLFlBQUssTUFBUSxHQUFRLEdBQ2pCLEtBQUssVUFDUCxLQUFLLFNBQVMsT0FBTyxDQUFFLEtBQUksSUFFN0IsS0FBSyx3QkFDRSxNQU1GLEVBQUEsVUFBQSxRQUFQLFVBQUEsQ0FDRSxNQUFPLE1BQUssT0FNUCxFQUFBLFVBQUEsa0JBQVAsVUFBQSxDQUNFLE1BQU8sTUFBSyxpQkFNUCxFQUFBLFVBQUEsa0JBQVAsU0FBeUIsRUFBK0IsQ0FDdEQsWUFBSyxnQkFBa0IsRUFDaEIsTUFNRixFQUFBLFVBQUEsUUFBUCxTQUFlLEVBQWtDLENBQy9DLFlBQUssTUFBSyxFQUFBLFNBQUEsRUFBQSxTQUFBLEdBQ0wsS0FBSyxPQUNMLEdBRUwsS0FBSyx3QkFDRSxNQU1GLEVBQUEsVUFBQSxPQUFQLFNBQWMsRUFBYSxFQUFnQixPQUN6QyxZQUFLLE1BQUssRUFBQSxTQUFBLEVBQUEsU0FBQSxHQUFRLEtBQUssT0FBSyxHQUFBLEdBQUEsRUFBRyxHQUFNLEVBQUssSUFDMUMsS0FBSyx3QkFDRSxNQU1GLEVBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQWMsQ0FDN0IsWUFBSyxPQUFNLEVBQUEsU0FBQSxFQUFBLFNBQUEsR0FDTixLQUFLLFFBQ0wsR0FFTCxLQUFLLHdCQUNFLE1BTUYsRUFBQSxVQUFBLFNBQVAsU0FBZ0IsRUFBYSxFQUFZLE9BQ3ZDLFlBQUssT0FBTSxFQUFBLFNBQUEsRUFBQSxTQUFBLEdBQVEsS0FBSyxRQUFNLEdBQUEsR0FBQSxFQUFHLEdBQU0sRUFBSyxJQUM1QyxLQUFLLHdCQUNFLE1BTUYsRUFBQSxVQUFBLGVBQVAsU0FBc0IsRUFBcUIsQ0FDekMsWUFBSyxhQUFlLEVBQ3BCLEtBQUssd0JBQ0UsTUFNRixFQUFBLFVBQUEsU0FBUCxTQUFnQixFQUFlLENBQzdCLFlBQUssT0FBUyxFQUNkLEtBQUssd0JBQ0UsTUFNRixFQUFBLFVBQUEsbUJBQVAsU0FBMEIsRUFBYSxDQUNyQyxZQUFLLGlCQUFtQixFQUN4QixLQUFLLHdCQUNFLE1BT0YsRUFBQSxVQUFBLGVBQVAsU0FBc0IsRUFBYSxDQUNqQyxNQUFPLE1BQUssbUJBQW1CLElBTTFCLEVBQUEsVUFBQSxXQUFQLFNBQWtCLEVBQWEsRUFBdUIsT0FDcEQsTUFBSSxLQUFZLEtBRWQsTUFBTyxNQUFLLFVBQVUsR0FFdEIsS0FBSyxVQUFTLEVBQUEsU0FBQSxFQUFBLFNBQUEsR0FBUSxLQUFLLFdBQVMsR0FBQSxHQUFBLEVBQUcsR0FBTSxFQUFPLElBR3RELEtBQUssd0JBQ0UsTUFNRixFQUFBLFVBQUEsUUFBUCxTQUFlLEVBQVcsQ0FDeEIsWUFBSyxNQUFRLEVBQ2IsS0FBSyx3QkFDRSxNQU1GLEVBQUEsVUFBQSxRQUFQLFVBQUEsQ0FDRSxNQUFPLE1BQUssT0FNUCxFQUFBLFVBQUEsZUFBUCxVQUFBLGFBRVEsRUFBTyxLQUFLLFVBR2xCLEdBQUEsR0FBSSxLQUFJLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxZQUNSLE1BQUEsR0FBTyxLQUFJLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxZQUlmLEdBQUEsR0FBQSxHQUFJLEtBQUksTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGdCQUFZLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxNQUFNLEdBQzVCLE1BQU8sR0FBSyxhQUFhLE1BQU0sSUFVNUIsRUFBQSxVQUFBLFdBQVAsU0FBa0IsRUFBaUIsQ0FDakMsTUFBSyxHQUdILEtBQUssU0FBVyxFQUZoQixNQUFPLE1BQUssU0FJZCxLQUFLLHdCQUNFLE1BTUYsRUFBQSxVQUFBLFdBQVAsVUFBQSxDQUNFLE1BQU8sTUFBSyxVQU1QLEVBQUEsVUFBQSxPQUFQLFNBQWMsRUFBK0IsQ0FDM0MsR0FBSSxDQUFDLEVBQ0gsTUFBTyxNQUdULEdBQUksTUFBTyxJQUFtQixXQUFZLENBQ3hDLEdBQU0sR0FBZ0IsRUFBc0MsTUFDNUQsTUFBTyxhQUF3QixHQUFRLEVBQWUsS0FHeEQsTUFBSSxhQUEwQixHQUM1QixNQUFLLE1BQUssRUFBQSxTQUFBLEVBQUEsU0FBQSxHQUFRLEtBQUssT0FBVSxFQUFlLE9BQ2hELEtBQUssT0FBTSxFQUFBLFNBQUEsRUFBQSxTQUFBLEdBQVEsS0FBSyxRQUFXLEVBQWUsUUFDbEQsS0FBSyxVQUFTLEVBQUEsU0FBQSxFQUFBLFNBQUEsR0FBUSxLQUFLLFdBQWMsRUFBZSxXQUNwRCxFQUFlLE9BQVMsT0FBTyxLQUFLLEVBQWUsT0FBTyxRQUM1RCxNQUFLLE1BQVEsRUFBZSxPQUUxQixFQUFlLFFBQ2pCLE1BQUssT0FBUyxFQUFlLFFBRTNCLEVBQWUsY0FDakIsTUFBSyxhQUFlLEVBQWUsY0FFakMsRUFBZSxpQkFDakIsTUFBSyxnQkFBa0IsRUFBZSxrQkFFL0IsR0FBQSxjQUFjLElBRXZCLEdBQWlCLEVBQ2pCLEtBQUssTUFBSyxFQUFBLFNBQUEsRUFBQSxTQUFBLEdBQVEsS0FBSyxPQUFVLEVBQWUsTUFDaEQsS0FBSyxPQUFNLEVBQUEsU0FBQSxFQUFBLFNBQUEsR0FBUSxLQUFLLFFBQVcsRUFBZSxPQUNsRCxLQUFLLFVBQVMsRUFBQSxTQUFBLEVBQUEsU0FBQSxHQUFRLEtBQUssV0FBYyxFQUFlLFVBQ3BELEVBQWUsTUFDakIsTUFBSyxNQUFRLEVBQWUsTUFFMUIsRUFBZSxPQUNqQixNQUFLLE9BQVMsRUFBZSxPQUUzQixFQUFlLGFBQ2pCLE1BQUssYUFBZSxFQUFlLGFBRWpDLEVBQWUsZ0JBQ2pCLE1BQUssZ0JBQWtCLEVBQWUsaUJBSW5DLE1BTUYsRUFBQSxVQUFBLE1BQVAsVUFBQSxDQUNFLFlBQUssYUFBZSxHQUNwQixLQUFLLE1BQVEsR0FDYixLQUFLLE9BQVMsR0FDZCxLQUFLLE1BQVEsR0FDYixLQUFLLFVBQVksR0FDakIsS0FBSyxPQUFTLE9BQ2QsS0FBSyxpQkFBbUIsT0FDeEIsS0FBSyxhQUFlLE9BQ3BCLEtBQUssZ0JBQWtCLE9BQ3ZCLEtBQUssTUFBUSxPQUNiLEtBQUssU0FBVyxPQUNoQixLQUFLLHdCQUNFLE1BTUYsRUFBQSxVQUFBLGNBQVAsU0FBcUIsRUFBd0IsRUFBdUIsQ0FDbEUsR0FBTSxHQUFZLE1BQU8sSUFBbUIsU0FBVyxLQUFLLElBQUksRUFBZ0IsSUFBbUIsR0FHbkcsR0FBSSxHQUFhLEVBQ2YsTUFBTyxNQUdULEdBQU0sR0FBZ0IsRUFBQSxTQUFBLENBQ3BCLFVBQVcsR0FBQSwwQkFDUixHQUVMLFlBQUssYUFBZSxFQUFBLFNBQUksS0FBSyxhQUFZLENBQUUsSUFBa0IsTUFBTSxDQUFDLEdBQ3BFLEtBQUssd0JBRUUsTUFNRixFQUFBLFVBQUEsaUJBQVAsVUFBQSxDQUNFLFlBQUssYUFBZSxHQUNwQixLQUFLLHdCQUNFLE1BV0YsRUFBQSxVQUFBLGFBQVAsU0FBb0IsRUFBYyxFQUFnQixPQXNCaEQsR0FyQkksS0FBSyxRQUFVLE9BQU8sS0FBSyxLQUFLLFFBQVEsUUFDMUMsR0FBTSxNQUFLLEVBQUEsU0FBQSxFQUFBLFNBQUEsR0FBUSxLQUFLLFFBQVcsRUFBTSxRQUV2QyxLQUFLLE9BQVMsT0FBTyxLQUFLLEtBQUssT0FBTyxRQUN4QyxHQUFNLEtBQUksRUFBQSxTQUFBLEVBQUEsU0FBQSxHQUFRLEtBQUssT0FBVSxFQUFNLE9BRXJDLEtBQUssT0FBUyxPQUFPLEtBQUssS0FBSyxPQUFPLFFBQ3hDLEdBQU0sS0FBSSxFQUFBLFNBQUEsRUFBQSxTQUFBLEdBQVEsS0FBSyxPQUFVLEVBQU0sT0FFckMsS0FBSyxXQUFhLE9BQU8sS0FBSyxLQUFLLFdBQVcsUUFDaEQsR0FBTSxTQUFRLEVBQUEsU0FBQSxFQUFBLFNBQUEsR0FBUSxLQUFLLFdBQWMsRUFBTSxXQUU3QyxLQUFLLFFBQ1AsR0FBTSxNQUFRLEtBQUssUUFFakIsS0FBSyxrQkFDUCxHQUFNLFlBQWMsS0FBSyxrQkFLdkIsS0FBSyxNQUFPLENBQ2QsRUFBTSxTQUFRLEVBQUEsU0FBQSxDQUFLLE1BQU8sS0FBSyxNQUFNLG1CQUFzQixFQUFNLFVBQ2pFLEdBQU0sR0FBZSxHQUFHLEtBQUssTUFBTSxlQUFXLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxLQUNoRCxBQUFJLEdBQ0YsR0FBTSxLQUFJLEVBQUEsU0FBQSxDQUFLLFlBQWEsR0FBb0IsRUFBTSxPQUkxRCxZQUFLLGtCQUFrQixHQUV2QixFQUFNLFlBQVcsRUFBQSxTQUFRLEVBQU0sYUFBZSxHQUFRLEtBQUssY0FDM0QsRUFBTSxZQUFjLEVBQU0sWUFBWSxPQUFTLEVBQUksRUFBTSxZQUFjLE9BRWhFLEtBQUssdUJBQXNCLEVBQUEsU0FBSyxLQUErQixLQUFLLGtCQUFtQixFQUFPLElBTTdGLEVBQUEsVUFBQSx1QkFBVixTQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQWlCLENBSm5CLEdBQUEsR0FBQSxLQUlFLE1BQUEsS0FBQSxRQUFBLEdBQUEsR0FFTyxHQUFJLElBQUEsWUFBMEIsU0FBQyxFQUFTLEVBQU0sQ0FDbkQsR0FBTSxHQUFZLEVBQVcsR0FDN0IsR0FBSSxJQUFVLE1BQVEsTUFBTyxJQUFjLFdBQ3pDLEVBQVEsT0FDSCxDQUNMLEdBQU0sR0FBUyxFQUFTLEVBQUEsU0FBQSxHQUFNLEdBQVMsR0FDdkMsQUFBSSxHQUFBLFdBQVcsR0FDUCxFQUNILEtBQUssU0FBQSxFQUFLLENBQUksTUFBQSxHQUFLLHVCQUF1QixFQUFZLEVBQU8sRUFBTSxFQUFRLEdBQUcsS0FBSyxLQUNuRixLQUFLLEtBQU0sR0FFVCxFQUFLLHVCQUF1QixFQUFZLEVBQVEsRUFBTSxFQUFRLEdBQ2hFLEtBQUssR0FDTCxLQUFLLEtBQU0sT0FTWixFQUFBLFVBQUEsc0JBQVYsVUFBQSxDQUFBLEdBQUEsR0FBQSxLQUlFLEFBQUssS0FBSyxxQkFDUixNQUFLLG9CQUFzQixHQUMzQixLQUFLLGdCQUFnQixRQUFRLFNBQUEsRUFBUSxDQUNuQyxFQUFTLEtBRVgsS0FBSyxvQkFBc0IsS0FRdkIsRUFBQSxVQUFBLGtCQUFSLFNBQTBCLEVBQVksQ0FFcEMsRUFBTSxZQUFjLEVBQU0sWUFDdEIsTUFBTSxRQUFRLEVBQU0sYUFDbEIsRUFBTSxZQUNOLENBQUMsRUFBTSxhQUNULEdBR0EsS0FBSyxjQUNQLEdBQU0sWUFBYyxFQUFNLFlBQVksT0FBTyxLQUFLLGVBSWhELEVBQU0sYUFBZSxDQUFDLEVBQU0sWUFBWSxRQUMxQyxNQUFPLEdBQU0sYUFHbkIsS0E5ZGEsR0FBQSxNQUFBLEdBbWViLGFBQWlDLENBRS9CLEdBQU0sR0FBUyxHQUFBLGtCQUNmLFNBQU8sV0FBYSxFQUFPLFlBQWMsR0FDekMsRUFBTyxXQUFXLHNCQUF3QixFQUFPLFdBQVcsdUJBQXlCLEdBQzlFLEVBQU8sV0FBVyxzQkFRM0IsWUFBd0MsRUFBd0IsQ0FDOUQsS0FBMkIsS0FBSyxHQURsQyxHQUFBLHdCQUFBLHFFQ2xoQkEsR0FBQSxJQUFBLEtBQ0EsR0FBQSxJQUtBLEdBQUEsVUFBQSxDQWVFLFdBQW1CLEVBQW9ELENBYmhFLEtBQUEsT0FBaUIsRUFFakIsS0FBQSxJQUFjLEdBQUEsUUFJZCxLQUFBLFNBQW9CLEVBQ3BCLEtBQUEsT0FBd0IsR0FBQSxjQUFjLEdBR3RDLEtBQUEsS0FBZ0IsR0FDaEIsS0FBQSxlQUEwQixHQUkvQixHQUFNLEdBQWUsR0FBQSxxQkFDckIsS0FBSyxVQUFZLEVBQ2pCLEtBQUssUUFBVSxFQUNYLEdBQ0YsS0FBSyxPQUFPLEdBTVQsU0FBQSxVQUFBLE9BQVAsU0FBYyxFQUE0QixDQTRCeEMsR0E1QlksSUFBQSxRQUFBLEdBQUEsSUFDUixFQUFRLE1BQ04sRUFBQyxLQUFLLFdBQWEsRUFBUSxLQUFLLFlBQ2xDLE1BQUssVUFBWSxFQUFRLEtBQUssWUFHNUIsQ0FBQyxLQUFLLEtBQU8sQ0FBQyxFQUFRLEtBQ3hCLE1BQUssSUFBTSxFQUFRLEtBQUssSUFBTSxFQUFRLEtBQUssT0FBUyxFQUFRLEtBQUssV0FJckUsS0FBSyxVQUFZLEVBQVEsV0FBYSxHQUFBLHFCQUNsQyxFQUFRLGdCQUNWLE1BQUssZUFBaUIsRUFBUSxnQkFFNUIsRUFBUSxLQUVWLE1BQUssSUFBTSxFQUFRLElBQUksU0FBVyxHQUFLLEVBQVEsSUFBTSxHQUFBLFNBRW5ELEVBQVEsT0FBUyxRQUNuQixNQUFLLEtBQU8sRUFBUSxNQUVsQixDQUFDLEtBQUssS0FBTyxFQUFRLEtBQ3ZCLE1BQUssSUFBTSxHQUFHLEVBQVEsS0FFcEIsTUFBTyxHQUFRLFNBQVksVUFDN0IsTUFBSyxRQUFVLEVBQVEsU0FFckIsS0FBSyxlQUNQLEtBQUssU0FBVyxlQUNQLE1BQU8sR0FBUSxVQUFhLFNBQ3JDLEtBQUssU0FBVyxFQUFRLGFBQ25CLENBQ0wsR0FBTSxHQUFXLEtBQUssVUFBWSxLQUFLLFFBQ3ZDLEtBQUssU0FBVyxHQUFZLEVBQUksRUFBVyxFQUU3QyxBQUFJLEVBQVEsU0FDVixNQUFLLFFBQVUsRUFBUSxTQUVyQixFQUFRLGFBQ1YsTUFBSyxZQUFjLEVBQVEsYUFFekIsQ0FBQyxLQUFLLFdBQWEsRUFBUSxXQUM3QixNQUFLLFVBQVksRUFBUSxXQUV2QixDQUFDLEtBQUssV0FBYSxFQUFRLFdBQzdCLE1BQUssVUFBWSxFQUFRLFdBRXZCLE1BQU8sR0FBUSxRQUFXLFVBQzVCLE1BQUssT0FBUyxFQUFRLFFBRXBCLEVBQVEsUUFDVixNQUFLLE9BQVMsRUFBUSxTQUtuQixFQUFBLFVBQUEsTUFBUCxTQUFhLEVBQWlELENBQzVELEFBQUksRUFDRixLQUFLLE9BQU8sQ0FBRSxPQUFNLElBQ2YsQUFBSSxLQUFLLFNBQVcsR0FBQSxjQUFjLEdBQ3ZDLEtBQUssT0FBTyxDQUFFLE9BQVEsR0FBQSxjQUFjLFNBRXBDLEtBQUssVUFLRixFQUFBLFVBQUEsT0FBUCxVQUFBLENBZ0JFLE1BQU8sSUFBQSxrQkFBa0IsQ0FDdkIsSUFBSyxHQUFHLEtBQUssSUFDYixLQUFNLEtBQUssS0FFWCxRQUFTLEdBQUksTUFBSyxLQUFLLFFBQVUsS0FBTSxjQUN2QyxVQUFXLEdBQUksTUFBSyxLQUFLLFVBQVksS0FBTSxjQUMzQyxPQUFRLEtBQUssT0FDYixPQUFRLEtBQUssT0FDYixJQUFLLE1BQU8sTUFBSyxLQUFRLFVBQVksTUFBTyxNQUFLLEtBQVEsU0FBVyxHQUFHLEtBQUssSUFBUSxPQUNwRixTQUFVLEtBQUssU0FDZixNQUFPLEdBQUEsa0JBQWtCLENBQ3ZCLFFBQVMsS0FBSyxRQUNkLFlBQWEsS0FBSyxZQUNsQixXQUFZLEtBQUssVUFDakIsV0FBWSxLQUFLLGVBSXpCLEtBaklhLEdBQUEsUUFBQSxnRkNMYixHQUFBLEtBc0JBLEdBQUEsSUFFQSxHQUFBLEtBQ0EsR0FBQSxLQVVhLEdBQUEsWUFBYyxFQU0zQixHQUFNLElBQXNCLElBOEM1QixHQUFBLFVBQUEsQ0FlRSxXQUFtQixFQUFpQixFQUE2QyxFQUE4QixDQUEzRSxBQUFBLElBQUEsUUFBQSxHQUFBLEdBQW1CLElBQUEsT0FBMEIsSUFBQSxRQUFBLEdBQW1CLEdBQUEsYUFBbkIsS0FBQSxTQUFBLEVBYmhFLEtBQUEsT0FBa0IsQ0FBQyxJQWNsQyxLQUFLLGNBQWMsTUFBUSxFQUN2QixHQUNGLEtBQUssV0FBVyxHQU9iLFNBQUEsVUFBQSxZQUFQLFNBQW1CLEVBQWUsQ0FDaEMsTUFBTyxNQUFLLFNBQVcsR0FNbEIsRUFBQSxVQUFBLFdBQVAsU0FBa0IsRUFBZSxDQUMvQixHQUFNLEdBQU0sS0FBSyxjQUNqQixFQUFJLE9BQVMsRUFDVCxHQUFVLEVBQU8sbUJBQ25CLEVBQU8scUJBT0osRUFBQSxVQUFBLFVBQVAsVUFBQSxDQUVFLEdBQU0sR0FBUSxHQUFBLE1BQU0sTUFBTSxLQUFLLFlBQy9CLFlBQUssV0FBVyxLQUFLLENBQ25CLE9BQVEsS0FBSyxZQUNiLE1BQUssSUFFQSxHQU1GLEVBQUEsVUFBQSxTQUFQLFVBQUEsQ0FDRSxNQUFJLE1BQUssV0FBVyxRQUFVLEVBQVUsR0FDakMsQ0FBQyxDQUFDLEtBQUssV0FBVyxPQU1wQixFQUFBLFVBQUEsVUFBUCxTQUFpQixFQUFnQyxDQUMvQyxHQUFNLEdBQVEsS0FBSyxZQUNuQixHQUFJLENBQ0YsRUFBUyxXQUVULEtBQUssYUFPRixFQUFBLFVBQUEsVUFBUCxVQUFBLENBQ0UsTUFBTyxNQUFLLGNBQWMsUUFJckIsRUFBQSxVQUFBLFNBQVAsVUFBQSxDQUNFLE1BQU8sTUFBSyxjQUFjLE9BSXJCLEVBQUEsVUFBQSxTQUFQLFVBQUEsQ0FDRSxNQUFPLE1BQUssUUFJUCxFQUFBLFVBQUEsWUFBUCxVQUFBLENBQ0UsTUFBTyxNQUFLLE9BQU8sS0FBSyxPQUFPLE9BQVMsSUFPbkMsRUFBQSxVQUFBLGlCQUFQLFNBQXdCLEVBQWdCLEVBQWdCLENBQ3RELEdBQU0sR0FBVyxLQUFLLGFBQWUsR0FBQSxRQUNqQyxFQUFZLEVBTWhCLEdBQUksQ0FBQyxFQUFNLENBQ1QsR0FBSSxHQUFrQixPQUN0QixHQUFJLENBQ0YsS0FBTSxJQUFJLE9BQU0sbUNBQ1QsRUFBUCxDQUNBLEVBQXFCLEVBRXZCLEVBQVksQ0FDVixrQkFBbUIsRUFDbkIsbUJBQWtCLEdBSXRCLFlBQUssY0FBYyxtQkFBb0IsRUFBUyxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQzNDLEdBQVMsQ0FDWixTQUFVLEtBRUwsR0FNRixFQUFBLFVBQUEsZUFBUCxTQUFzQixFQUFpQixFQUFrQixFQUFnQixDQUN2RSxHQUFNLEdBQVcsS0FBSyxhQUFlLEdBQUEsUUFDakMsRUFBWSxFQU1oQixHQUFJLENBQUMsRUFBTSxDQUNULEdBQUksR0FBa0IsT0FDdEIsR0FBSSxDQUNGLEtBQU0sSUFBSSxPQUFNLFNBQ1QsRUFBUCxDQUNBLEVBQXFCLEVBRXZCLEVBQVksQ0FDVixrQkFBbUIsRUFDbkIsbUJBQWtCLEdBSXRCLFlBQUssY0FBYyxpQkFBa0IsRUFBUyxFQUFLLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FDOUMsR0FBUyxDQUNaLFNBQVUsS0FFTCxHQU1GLEVBQUEsVUFBQSxhQUFQLFNBQW9CLEVBQWMsRUFBZ0IsQ0FDaEQsR0FBTSxHQUFVLEdBQUEsUUFDaEIsTUFBSSxHQUFNLE9BQVMsZUFDakIsTUFBSyxhQUFlLEdBR3RCLEtBQUssY0FBYyxlQUFnQixFQUFLLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FDbkMsR0FBSSxDQUNQLFNBQVUsS0FFTCxHQU1GLEVBQUEsVUFBQSxZQUFQLFVBQUEsQ0FDRSxNQUFPLE1BQUssY0FNUCxFQUFBLFVBQUEsY0FBUCxTQUFxQixFQUF3QixFQUFxQixDQUMxRCxHQUFBLEdBQUEsS0FBQSxjQUFFLEVBQUEsRUFBQSxNQUFPLEVBQUEsRUFBQSxPQUVmLEdBQUksR0FBQyxHQUFTLENBQUMsR0FHVCxJQUFBLEdBQUEsRUFBQSxZQUFBLEVBQUEsY0FBQSxHQUFFLEVBQUEsRUFBQSxpQkFBQSxFQUFBLElBQUEsT0FBQSxLQUFBLEVBQXlCLEVBQUEsRUFBQSxlQUFBLEVBQUEsSUFBQSxPQUFBLEdBQUEsRUFHakMsR0FBSSxLQUFrQixHQUV0QixJQUFNLEdBQVksR0FBQSx5QkFDWixFQUFnQixHQUFBLFNBQUEsQ0FBSyxVQUFTLEdBQUssR0FDbkMsRUFBa0IsRUFDbkIsR0FBQSxlQUFlLFVBQUEsQ0FBTSxNQUFBLEdBQWlCLEVBQWtCLEtBQ3pELEVBRUosQUFBSSxJQUFvQixNQUV4QixFQUFNLGNBQWMsRUFBaUIsTUFNaEMsRUFBQSxVQUFBLFFBQVAsU0FBZSxFQUFpQixDQUM5QixHQUFNLEdBQVEsS0FBSyxXQUNuQixBQUFJLEdBQU8sRUFBTSxRQUFRLElBTXBCLEVBQUEsVUFBQSxRQUFQLFNBQWUsRUFBa0MsQ0FDL0MsR0FBTSxHQUFRLEtBQUssV0FDbkIsQUFBSSxHQUFPLEVBQU0sUUFBUSxJQU1wQixFQUFBLFVBQUEsVUFBUCxTQUFpQixFQUFjLENBQzdCLEdBQU0sR0FBUSxLQUFLLFdBQ25CLEFBQUksR0FBTyxFQUFNLFVBQVUsSUFNdEIsRUFBQSxVQUFBLE9BQVAsU0FBYyxFQUFhLEVBQWdCLENBQ3pDLEdBQU0sR0FBUSxLQUFLLFdBQ25CLEFBQUksR0FBTyxFQUFNLE9BQU8sRUFBSyxJQU14QixFQUFBLFVBQUEsU0FBUCxTQUFnQixFQUFhLEVBQVksQ0FDdkMsR0FBTSxHQUFRLEtBQUssV0FDbkIsQUFBSSxHQUFPLEVBQU0sU0FBUyxFQUFLLElBTzFCLEVBQUEsVUFBQSxXQUFQLFNBQWtCLEVBQWMsRUFBc0MsQ0FDcEUsR0FBTSxHQUFRLEtBQUssV0FDbkIsQUFBSSxHQUFPLEVBQU0sV0FBVyxFQUFNLElBTTdCLEVBQUEsVUFBQSxlQUFQLFNBQXNCLEVBQWdDLENBQzlDLEdBQUEsR0FBQSxLQUFBLGNBQUUsRUFBQSxFQUFBLE1BQU8sRUFBQSxFQUFBLE9BQ2YsQUFBSSxHQUFTLEdBQ1gsRUFBUyxJQU9OLEVBQUEsVUFBQSxJQUFQLFNBQVcsRUFBNEIsQ0FDckMsR0FBTSxHQUFTLEdBQVMsTUFDeEIsR0FBSSxDQUNGLEVBQVMsY0FFVCxHQUFTLEtBT04sRUFBQSxVQUFBLGVBQVAsU0FBNkMsRUFBZ0MsQ0FDM0UsR0FBTSxHQUFTLEtBQUssWUFDcEIsR0FBSSxDQUFDLEVBQVEsTUFBTyxNQUNwQixHQUFJLENBQ0YsTUFBTyxHQUFPLGVBQWUsUUFDN0IsQ0FDQSxVQUFBLE9BQU8sS0FBSywrQkFBK0IsRUFBWSxHQUFFLHlCQUNsRCxPQU9KLEVBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQW9CLENBQ25DLE1BQU8sTUFBSyxxQkFBcUIsWUFBYSxJQU16QyxFQUFBLFVBQUEsaUJBQVAsU0FBd0IsRUFBNkIsRUFBNkMsQ0FDaEcsTUFBTyxNQUFLLHFCQUFxQixtQkFBb0IsRUFBUyxJQU16RCxFQUFBLFVBQUEsYUFBUCxVQUFBLENBQ0UsTUFBTyxNQUFLLHFCQUFnRCxpQkFNdkQsRUFBQSxVQUFBLGVBQVAsU0FBc0IsRUFBMkIsQ0FFL0MsR0FGb0IsSUFBQSxRQUFBLEdBQUEsSUFFaEIsRUFDRixNQUFPLE1BQUssYUFJZCxLQUFLLHNCQU1BLEVBQUEsVUFBQSxXQUFQLFVBQUEsZUFDRSxBQUFBLEdBQUEsR0FBQSxHQUFBLEtBQUssaUJBQWEsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUNkLFNBQUssTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGdCQUFVLE1BQUEsSUFBQSxRQUFBLEVBQ2pCLFFBQ0osS0FBSyxxQkFHTCxHQUFBLEdBQUEsS0FBSyxpQkFBYSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsU0FBSyxNQUFBLElBQUEsUUFBQSxFQUFFLGNBTXRCLEVBQUEsVUFBQSxhQUFQLFNBQW9CLEVBQXdCLENBQ3BDLEdBQUEsR0FBQSxLQUFBLGNBQUUsRUFBQSxFQUFBLE1BQU8sRUFBQSxFQUFBLE9BQ1QsRUFBQSxHQUFBLEVBQUEsY0FBQSxHQUFFLEVBQUEsRUFBQSxRQUFTLEVBQUEsRUFBQSxZQUdYLEVBQVMsR0FBQSxrQkFDUCxFQUFBLEdBQUEsV0FBQSxJQUFBLFVBRUYsRUFBVSxHQUFJLElBQUEsUUFBTyxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQUEsU0FBQSxDQUN6QixRQUFPLEVBQ1AsWUFBVyxHQUNQLEdBQVMsQ0FBRSxLQUFNLEVBQU0sWUFDdkIsR0FBYSxDQUFFLFVBQVMsSUFDekIsSUFHTCxHQUFJLEVBQU8sQ0FFVCxHQUFNLEdBQWlCLEVBQU0sWUFBYyxFQUFNLGFBQ2pELEFBQUksR0FBa0IsRUFBZSxTQUFXLEdBQUEsY0FBYyxJQUM1RCxFQUFlLE9BQU8sQ0FBRSxPQUFRLEdBQUEsY0FBYyxTQUVoRCxLQUFLLGFBR0wsRUFBTSxXQUFXLEdBR25CLE1BQU8sSUFNRCxFQUFBLFVBQUEsbUJBQVIsVUFBQSxDQUNRLEdBQUEsR0FBQSxLQUFBLGNBQUUsRUFBQSxFQUFBLE1BQU8sRUFBQSxFQUFBLE9BQ2YsR0FBSSxFQUFDLEVBRUwsSUFBTSxHQUFVLEVBQU0sWUFBYyxFQUFNLGFBQzFDLEFBQUksR0FDRSxHQUFVLEVBQU8sZ0JBQ25CLEVBQU8sZUFBZSxLQVlwQixFQUFBLFVBQUEsY0FBUixTQUE4QyxFQUFTLFdBQUUsRUFBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsRUFBQSxHQUFBLFVBQUEsR0FDakQsR0FBQSxHQUFBLEtBQUEsY0FBRSxFQUFBLEVBQUEsTUFBTyxFQUFBLEVBQUEsT0FDZixBQUFJLEdBQVUsRUFBTyxJQUVuQixHQUFDLEdBQWUsR0FBTyxNQUFBLEVBQUEsR0FBQSxTQUFJLEVBQUksQ0FBRSxNQVM3QixFQUFBLFVBQUEscUJBQVIsU0FBZ0MsRUFBYyxRQUFFLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxVQUFBLE9BQUEsSUFBQSxFQUFBLEVBQUEsR0FBQSxVQUFBLEdBQzlDLEdBQU0sR0FBVSxLQUNWLEVBQVMsRUFBUSxXQUN2QixHQUFJLEdBQVUsRUFBTyxZQUFjLE1BQU8sR0FBTyxXQUFXLElBQVksV0FDdEUsTUFBTyxHQUFPLFdBQVcsR0FBUSxNQUFNLEtBQU0sR0FFL0MsR0FBQSxPQUFPLEtBQUssb0JBQW9CLEVBQU0sdUNBRTFDLEtBL1phLEdBQUEsSUFBQSxHQXdhYixhQUE4QixDQUM1QixHQUFNLEdBQVUsR0FBQSxrQkFDaEIsU0FBUSxXQUFhLEVBQVEsWUFBYyxDQUN6QyxXQUFZLEdBQ1osSUFBSyxRQUVBLEVBTlQsR0FBQSxlQUFBLEdBY0EsWUFBeUIsRUFBUSxDQUMvQixHQUFNLEdBQVcsS0FDWCxFQUFTLEdBQWtCLEdBQ2pDLFVBQWdCLEVBQVUsR0FDbkIsRUFKVCxHQUFBLFNBQUEsR0FjQSxhQUE2QixDQUUzQixHQUFNLEdBQVcsS0FRakIsTUFMSSxFQUFDLEdBQWdCLElBQWEsR0FBa0IsR0FBVSxZQUFZLEdBQUEsZUFDeEUsR0FBZ0IsRUFBVSxHQUFJLEtBSTVCLEdBQUEsWUFDSyxHQUF1QixHQUd6QixHQUFrQixHQWQzQixHQUFBLGNBQUEsR0F1QkEsYUFBK0IsQ0FDN0IsR0FBQSxPQUFPLEtBQUsscUZBRVosR0FBTSxHQUFTLEtBQWlCLFdBRWhDLE1BQU8sSUFBVSxFQUFPLFlBQWMsRUFBTyxXQUFXLFFBQVUsRUFBTyxXQUFXLE9BQU8sT0FMN0YsR0FBQSxnQkFBQSxHQVlBLFlBQWdDLEVBQWlCLFdBQy9DLEdBQUksQ0FDRixHQUFNLEdBQVksR0FBQSxHQUFBLEdBQUcsS0FBaUIsY0FBVSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsY0FBVSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsVUFBTSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsT0FHdEUsR0FBSSxDQUFDLEVBQ0gsTUFBTyxJQUFrQixHQUkzQixHQUFJLENBQUMsR0FBZ0IsSUFBaUIsR0FBa0IsR0FBYyxZQUFZLEdBQUEsYUFBYyxDQUM5RixHQUFNLEdBQXNCLEdBQWtCLEdBQVUsY0FDeEQsR0FBZ0IsRUFBYyxHQUFJLElBQUksRUFBb0IsT0FBUSxHQUFBLE1BQU0sTUFBTSxFQUFvQixTQUlwRyxNQUFPLElBQWtCLFFBQ3pCLENBRUEsTUFBTyxJQUFrQixJQVE3QixZQUF5QixFQUFnQixDQUN2QyxNQUFPLENBQUMsQ0FBRSxJQUFXLEVBQVEsWUFBYyxFQUFRLFdBQVcsS0FTaEUsWUFBa0MsRUFBZ0IsQ0FDaEQsTUFBSSxJQUFXLEVBQVEsWUFBYyxFQUFRLFdBQVcsS0FDeEQsR0FBUSxXQUFhLEVBQVEsWUFBYyxHQUMzQyxFQUFRLFdBQVcsSUFBTSxHQUFJLEtBQ3RCLEVBQVEsV0FBVyxJQUo1QixHQUFBLGtCQUFBLEdBYUEsWUFBZ0MsRUFBa0IsRUFBUSxDQUN4RCxNQUFLLEdBQ0wsR0FBUSxXQUFhLEVBQVEsWUFBYyxHQUMzQyxFQUFRLFdBQVcsSUFBTSxFQUNsQixJQUhjLEdBRHZCLEdBQUEsZ0JBQUEscUVDam5CQSxHQUFBLElBQUEsS0FPQSxHQUFBLElBRUEsR0FBQSxLQVVBLEdBQUEsVUFBQSxDQVFFLFdBQW1CLEVBQXNCLEVBQThCLENBQXZFLEdBQUEsR0FBQSxLQVBnQixLQUFBLGFBQXVCLEdBQy9CLEtBQUEsbUJBQXdELEdBR3hELEtBQUEsV0FBc0IsR0FJNUIsS0FBSyxXQUFhLEVBRWxCLEtBQUssWUFBYyxZQUFZLFVBQUEsQ0FBTSxNQUFBLEdBQUssU0FBUyxLQUFLLGFBQWUsS0FDdkUsS0FBSyxjQUFnQixFQUloQixTQUFBLFVBQUEsc0JBQVAsU0FBNkIsRUFBb0MsQ0FDL0QsR0FBSSxDQUFDLEtBQUssV0FBVyxZQUFhLENBQ2hDLEdBQUEsT0FBTyxLQUFLLDJFQUNaLE9BRUYsQUFBSyxLQUFLLFdBQVcsWUFBWSxHQUFtQixLQUFLLEtBQU0sU0FBQSxFQUFNLENBQ25FLEdBQUEsT0FBTyxNQUFNLGdDQUFnQyxNQUsxQyxFQUFBLFVBQUEsTUFBUCxVQUFBLENBQ0UsR0FBTSxHQUFvQixLQUFLLHVCQUMvQixBQUFJLEVBQWtCLFdBQVcsU0FBVyxHQUc1QyxNQUFLLG1CQUFxQixHQUMxQixLQUFLLHNCQUFzQixLQUl0QixFQUFBLFVBQUEscUJBQVAsVUFBQSxDQUFBLEdBQUEsR0FBQSxLQUNRLEVBQWtDLE9BQU8sS0FBSyxLQUFLLG9CQUFvQixJQUFJLFNBQUMsRUFBVyxDQUMzRixNQUFPLEdBQUssbUJBQW1CLFNBQVMsTUFHcEMsRUFBdUMsQ0FDM0MsTUFBTyxLQUFLLGNBQ1osV0FBVSxHQUVaLE1BQU8sSUFBQSxrQkFBa0IsSUFJcEIsRUFBQSxVQUFBLE1BQVAsVUFBQSxDQUNFLGNBQWMsS0FBSyxhQUNuQixLQUFLLFdBQWEsR0FDbEIsS0FBSyxTQVFBLEVBQUEsVUFBQSw0QkFBUCxVQUFBLFNBQ0UsR0FBSSxFQUFDLEtBQUssV0FHVixJQUFNLEdBQVEsR0FBQSxnQkFBZ0IsV0FDeEIsRUFBYyxHQUFHLEtBQUssTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLG9CQUU5QixBQUFJLEdBQWtCLEVBQWUsUUFDbkMsTUFBSyw2QkFBNkIsRUFBZSxPQUFRLEdBQUksT0FHN0QsR0FBQSxLQUFLLE1BQUEsSUFBQSxRQUFBLEVBQUUsa0JBQWtCLFdBVXJCLEVBQUEsVUFBQSw2QkFBUixTQUFxQyxFQUE4QixFQUFVLENBRTNFLEdBQU0sR0FBc0IsR0FBSSxNQUFLLEdBQU0sV0FBVyxFQUFHLEdBQ3pELEtBQUssbUJBQW1CLEdBQXVCLEtBQUssbUJBQW1CLElBQXdCLEdBSS9GLEdBQU0sR0FBdUMsS0FBSyxtQkFBbUIsR0FLckUsT0FKSyxFQUFrQixTQUNyQixHQUFrQixRQUFVLEdBQUksTUFBSyxHQUFxQixlQUdwRCxPQUNELElBQUEscUJBQXFCLFFBQ3hCLFNBQWtCLFFBQVcsR0FBa0IsU0FBVyxHQUFLLEVBQ3hELEVBQWtCLFlBQ3RCLElBQUEscUJBQXFCLEdBQ3hCLFNBQWtCLE9BQVUsR0FBa0IsUUFBVSxHQUFLLEVBQ3RELEVBQWtCLFdBQ3RCLElBQUEscUJBQXFCLFFBQ3hCLFNBQWtCLFFBQVcsR0FBa0IsU0FBVyxHQUFLLEVBQ3hELEVBQWtCLFVBR2pDLEtBMUdhLEdBQUEsZUFBQSxxRUNuQmIsR0FBQSxJQUFBLEtBQVMsR0FBQSx3QkFBQSxHQUFBLHdCQUF5QixHQUFBLE1BQUEsR0FBQSxNQUNsQyxHQUFBLElBQUEsS0FBUyxHQUFBLFFBQUEsR0FBQSxRQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsZUFBQSxHQUFBLGVBQ1QsR0FBQSxJQUFBLEtBRUUsR0FBQSxnQkFBQSxHQUFBLGdCQUNBLEdBQUEsY0FBQSxHQUFBLGNBQ0EsR0FBQSxrQkFBQSxHQUFBLGtCQUNBLEdBQUEsZUFBQSxHQUFBLGVBQ0EsR0FBQSxJQUFBLEdBQUEsSUFDQSxHQUFBLFNBQUEsR0FBQSxTQUNBLEdBQUEsZ0JBQUEsR0FBQSw2RkNYRixHQUFBLEtBcUJBLFlBQXNCLEVBQWMsUUFBRSxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsVUFBQSxPQUFBLElBQUEsRUFBQSxFQUFBLEdBQUEsVUFBQSxHQUNwQyxHQUFNLEdBQU0sR0FBQSxnQkFDWixHQUFJLEdBQU8sRUFBSSxHQUViLE1BQVEsR0FBSSxHQUFvQixNQUF4QixFQUFHLEdBQUEsU0FBaUMsSUFFOUMsS0FBTSxJQUFJLE9BQU0scUJBQXFCLEVBQU0sd0RBVTdDLFlBQWlDLEVBQWdCLEVBQStCLENBQzlFLEdBQUksR0FDSixHQUFJLENBQ0YsS0FBTSxJQUFJLE9BQU0sbUNBQ1QsRUFBUCxDQUNBLEVBQXFCLEVBRXZCLE1BQU8sSUFBVSxtQkFBb0IsRUFBVyxDQUM5QyxlQUFjLEVBQ2Qsa0JBQW1CLEVBQ25CLG1CQUFrQixJQVZ0QixHQUFBLGlCQUFBLEdBcUJBLFlBQStCLEVBQWlCLEVBQTBDLENBQ3hGLEdBQUksR0FDSixHQUFJLENBQ0YsS0FBTSxJQUFJLE9BQU0sU0FDVCxFQUFQLENBQ0EsRUFBcUIsRUFLdkIsR0FBTSxHQUFRLE1BQU8sSUFBbUIsU0FBVyxFQUFpQixPQUM5RCxFQUFVLE1BQU8sSUFBbUIsU0FBVyxDQUFFLGVBQWMsR0FBSyxPQUUxRSxNQUFPLElBQVUsaUJBQWtCLEVBQVMsRUFBSyxHQUFBLFNBQUEsQ0FDL0Msa0JBQW1CLEVBQ25CLG1CQUFrQixHQUNmLElBaEJQLEdBQUEsZUFBQSxHQTBCQSxZQUE2QixFQUFZLENBQ3ZDLE1BQU8sSUFBVSxlQUFnQixHQURuQyxHQUFBLGFBQUEsR0FRQSxZQUErQixFQUFnQyxDQUM3RCxHQUFnQixpQkFBa0IsR0FEcEMsR0FBQSxlQUFBLEdBWUEsWUFBOEIsRUFBc0IsQ0FDbEQsR0FBZ0IsZ0JBQWlCLEdBRG5DLEdBQUEsY0FBQSxHQVVBLFlBQTJCLEVBQWMsRUFBc0MsQ0FDN0UsR0FBZ0IsYUFBYyxFQUFNLEdBRHRDLEdBQUEsV0FBQSxHQVFBLFlBQTBCLEVBQWMsQ0FDdEMsR0FBZ0IsWUFBYSxHQUQvQixHQUFBLFVBQUEsR0FRQSxZQUF3QixFQUFrQyxDQUN4RCxHQUFnQixVQUFXLEdBRDdCLEdBQUEsUUFBQSxHQVNBLFlBQXlCLEVBQWEsRUFBWSxDQUNoRCxHQUFnQixXQUFZLEVBQUssR0FEbkMsR0FBQSxTQUFBLEdBWUEsWUFBdUIsRUFBYSxFQUFnQixDQUNsRCxHQUFnQixTQUFVLEVBQUssR0FEakMsR0FBQSxPQUFBLEdBU0EsWUFBd0IsRUFBaUIsQ0FDdkMsR0FBZ0IsVUFBVyxHQUQ3QixHQUFBLFFBQUEsR0FpQkEsWUFBMEIsRUFBZ0MsQ0FDeEQsR0FBZ0IsWUFBYSxHQUQvQixHQUFBLFVBQUEsR0FlQSxZQUE4QixFQUFjLFFBQUUsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsRUFBQSxHQUFBLFVBQUEsR0FDNUMsR0FBUyxNQUFBLE9BQUEsR0FBQSxTQUFBLENBQU8sZ0JBQWlCLEdBQVcsSUFEOUMsR0FBQSxjQUFBLEdBcUJBLFlBQ0UsRUFDQSxFQUE2QyxDQUU3QyxNQUFPLElBQVUsbUJBQWtCLEdBQUEsU0FBQSxHQUFPLEdBQVcsR0FKdkQsR0FBQSxpQkFBQSxxRUNwTkEsR0FBQSxJQUFBLElBRU0sR0FBcUIsSUFPM0IsR0FBQSxVQUFBLENBY0UsV0FBbUIsRUFBYyxFQUE0QixFQUFlLENBQTNDLEFBQUEsSUFBQSxRQUFBLEdBQUEsSUFDL0IsS0FBSyxJQUFNLEVBQ1gsS0FBSyxXQUFhLEdBQUksSUFBQSxJQUFJLEdBQzFCLEtBQUssU0FBVyxFQUNoQixLQUFLLFFBQVUsRUFJVixTQUFBLFVBQUEsT0FBUCxVQUFBLENBQ0UsTUFBTyxNQUFLLFlBSVAsRUFBQSxVQUFBLGNBQVAsVUFBQSxDQUNFLE1BQU8sQ0FBQyxDQUFDLEtBQUssU0FJVCxFQUFBLFVBQUEsbUJBQVAsVUFBQSxDQUNFLEdBQU0sR0FBTSxLQUFLLFNBQ1gsRUFBVyxFQUFJLFNBQWMsRUFBSSxTQUFRLElBQU0sR0FDL0MsRUFBTyxFQUFJLEtBQU8sSUFBSSxFQUFJLEtBQVMsR0FDekMsTUFBVSxHQUFRLEtBQUssRUFBSSxLQUFPLEVBQU8sR0FBSSxLQUFPLElBQUksRUFBSSxLQUFTLElBQUUsU0FJbEUsRUFBQSxVQUFBLGlCQUFQLFVBQUEsQ0FDRSxNQUFPLE1BQUssbUJBQW1CLFVBUTFCLEVBQUEsVUFBQSxtQ0FBUCxVQUFBLENBQ0UsTUFBVSxNQUFLLG1CQUFrQixJQUFJLEtBQUssZ0JBUXJDLEVBQUEsVUFBQSxzQ0FBUCxVQUFBLENBQ0UsTUFBSSxNQUFLLGdCQUNBLEtBQUssUUFHSixLQUFLLHVCQUFzQixJQUFJLEtBQUssZ0JBSXpDLEVBQUEsVUFBQSxxQkFBUCxVQUFBLENBQ0UsR0FBTSxHQUFNLEtBQUssU0FDakIsTUFBVSxHQUFJLEtBQU8sSUFBSSxFQUFJLEtBQVMsSUFBRSxRQUFRLEVBQUksVUFBUyxXQU94RCxFQUFBLFVBQUEsa0JBQVAsU0FBeUIsRUFBb0IsRUFBcUIsQ0FFaEUsR0FBTSxHQUFNLEtBQUssU0FDWCxFQUFTLENBQUMseUJBQXlCLElBQ3pDLFNBQU8sS0FBSyxpQkFBaUIsRUFBVSxJQUFJLEdBQzNDLEVBQU8sS0FBSyxjQUFjLEVBQUksV0FDMUIsRUFBSSxNQUNOLEVBQU8sS0FBSyxpQkFBaUIsRUFBSSxNQUU1QixDQUNMLGVBQWdCLG1CQUNoQixnQkFBaUIsRUFBTyxLQUFLLFFBSzFCLEVBQUEsVUFBQSx3QkFBUCxTQUNFLEVBSU0sQ0FKTixBQUFBLElBQUEsUUFBQSxHQUFBLElBTUEsR0FBTSxHQUFNLEtBQUssU0FDWCxFQUFjLEtBQUsscUJBQW9CLG9CQUV2QyxFQUFpQixHQUN2QixFQUFlLEtBQUssT0FBTyxFQUFJLFlBQy9CLE9BQVcsS0FBTyxHQUNoQixHQUFJLElBQVEsTUFJWixHQUFJLElBQVEsT0FBUSxDQUNsQixHQUFJLENBQUMsRUFBYyxLQUNqQixTQUVGLEFBQUksRUFBYyxLQUFLLE1BQ3JCLEVBQWUsS0FBSyxRQUFRLG1CQUFtQixFQUFjLEtBQUssT0FFaEUsRUFBYyxLQUFLLE9BQ3JCLEVBQWUsS0FBSyxTQUFTLG1CQUFtQixFQUFjLEtBQUssWUFHckUsR0FBZSxLQUFRLG1CQUFtQixHQUFJLElBQUksbUJBQW1CLEVBQWMsS0FHdkYsTUFBSSxHQUFlLE9BQ1AsRUFBUSxJQUFJLEVBQWUsS0FBSyxLQUdyQyxHQUlELEVBQUEsVUFBQSxxQkFBUixVQUFBLENBQ0UsTUFBTyxNQUFLLG1CQUFtQixhQUl6QixFQUFBLFVBQUEsbUJBQVIsU0FBMkIsRUFBNEIsQ0FDckQsR0FBSSxLQUFLLFFBQ1AsTUFBTyxNQUFLLFFBRWQsR0FBTSxHQUFPLEtBQUsscUJBQ1osRUFBTSxLQUFLLFNBQ2pCLE1BQU8sR0FBRyxFQUFPLEVBQUksVUFBUyxJQUFJLEVBQU0sS0FJbEMsRUFBQSxVQUFBLGFBQVIsVUFBQSxDQUNFLEdBQU0sR0FBTSxLQUFLLFNBQ1gsRUFBTyxDQUdYLFdBQVksRUFBSSxVQUNoQixlQUFnQixJQUVsQixNQUFPLElBQUEsVUFBVSxJQUVyQixLQTVKYSxHQUFBLElBQUEsZ0ZDVmIsR0FBQSxLQUVBLEdBQUEsSUFFYSxHQUFBLHNCQUFrQyxHQVUvQyxZQUEwQixFQUEyQixDQUNuRCxNQUFPLEdBQWEsT0FBTyxTQUFDLEVBQUssRUFBWSxDQUMzQyxNQUFJLEdBQUksTUFBTSxTQUFBLEVBQWMsQ0FBSSxNQUFBLEdBQWEsT0FBUyxFQUFlLFFBQ25FLEVBQUksS0FBSyxHQUVKLEdBQ04sSUFJTCxZQUF1QyxFQUFnQixDQUNyRCxHQUFNLEdBQXVCLEVBQVEscUJBQW1CLEdBQUEsU0FBUSxFQUFRLHNCQUF5QixHQUMzRixFQUFtQixFQUFRLGFBRTdCLEVBQVksR0FBQSxTQUFzQixHQUFpQixJQUV2RCxBQUFJLE1BQU0sUUFBUSxHQUVoQixFQUFZLEdBQUEsU0FDUCxFQUFhLE9BQU8sU0FBQSxFQUFZLENBQ2pDLE1BQUEsR0FBaUIsTUFBTSxTQUFBLEVBQWUsQ0FBSSxNQUFBLEdBQWdCLE9BQVMsRUFBYSxTQUcvRSxHQUFpQixJQUViLE1BQU8sSUFBcUIsWUFDckMsR0FBZSxFQUFpQixHQUNoQyxFQUFlLE1BQU0sUUFBUSxHQUFnQixFQUFlLENBQUMsSUFJL0QsR0FBTSxHQUFvQixFQUFhLElBQUksU0FBQSxFQUFDLENBQUksTUFBQSxHQUFFLE9BQzVDLEVBQWtCLFFBQ3hCLE1BQUksR0FBa0IsUUFBUSxLQUFxQixJQUNqRCxFQUFhLEtBQUksTUFBakIsRUFBWSxHQUFBLFNBQVMsRUFBYSxPQUFPLEVBQWtCLFFBQVEsR0FBa0IsS0FHaEYsRUEzQlQsR0FBQSx1QkFBQSxHQStCQSxZQUFpQyxFQUF3QixDQUN2RCxBQUFJLEdBQUEsc0JBQXNCLFFBQVEsRUFBWSxRQUFVLElBR3hELEdBQVksVUFBVSxHQUFBLHdCQUF5QixHQUFBLGVBQy9DLEdBQUEsc0JBQXNCLEtBQUssRUFBWSxNQUN2QyxHQUFBLE9BQU8sSUFBSSwwQkFBMEIsRUFBWSxPQU5uRCxHQUFBLGlCQUFBLEdBZUEsWUFBcUQsRUFBVSxDQUM3RCxHQUFNLEdBQWlDLEdBQ3ZDLFVBQXVCLEdBQVMsUUFBUSxTQUFBLEVBQVcsQ0FDakQsRUFBYSxFQUFZLE1BQVEsRUFDakMsR0FBaUIsS0FLbkIsT0FBTyxlQUFlLEVBQWMsY0FBZSxDQUFFLE1BQU8sS0FDckQsRUFWVCxHQUFBLGtCQUFBLGdGQ3JFQSxHQUFBLEtBQ0EsR0FBQSxLQVlBLEVBQUEsSUFnQkEsR0FBQSxLQUVNLEdBQXFCLDhEQWtDM0IsR0FBQSxVQUFBLENBMEJFLFdBQXNCLEVBQWtDLEVBQVUsQ0FYeEQsS0FBQSxjQUFrQyxHQUdsQyxLQUFBLGVBQXlCLEVBU2pDLEtBQUssU0FBVyxHQUFJLEdBQWEsR0FDakMsS0FBSyxTQUFXLEVBRVosRUFBUSxLQUNWLE1BQUssS0FBTyxHQUFJLEdBQUEsSUFBSSxFQUFRLE1BUXpCLFNBQUEsVUFBQSxpQkFBUCxTQUF3QixFQUFnQixFQUFrQixFQUFhLENBQXZFLEdBQUEsR0FBQSxLQUVFLEdBQUksRUFBQSx3QkFBd0IsR0FBWSxDQUN0QyxFQUFBLE9BQU8sSUFBSSxJQUNYLE9BR0YsR0FBSSxHQUE4QixHQUFRLEVBQUssU0FFL0MsWUFBSyxTQUNILEtBQUssY0FDRixtQkFBbUIsRUFBVyxHQUM5QixLQUFLLFNBQUEsRUFBSyxDQUFJLE1BQUEsR0FBSyxjQUFjLEVBQU8sRUFBTSxLQUM5QyxLQUFLLFNBQUEsRUFBTSxDQUNWLEVBQVUsS0FJVCxHQU1GLEVBQUEsVUFBQSxlQUFQLFNBQXNCLEVBQWlCLEVBQWtCLEVBQWtCLEVBQWEsQ0FBeEYsR0FBQSxHQUFBLEtBQ00sRUFBOEIsR0FBUSxFQUFLLFNBRXpDLEVBQWdCLEVBQUEsWUFBWSxHQUM5QixLQUFLLGNBQWMsaUJBQWlCLE9BQU8sR0FBVSxFQUFPLEdBQzVELEtBQUssY0FBYyxtQkFBbUIsRUFBUyxHQUVuRCxZQUFLLFNBQ0gsRUFDRyxLQUFLLFNBQUEsRUFBSyxDQUFJLE1BQUEsR0FBSyxjQUFjLEVBQU8sRUFBTSxLQUM5QyxLQUFLLFNBQUEsRUFBTSxDQUNWLEVBQVUsS0FJVCxHQU1GLEVBQUEsVUFBQSxhQUFQLFNBQW9CLEVBQWMsRUFBa0IsRUFBYSxPQUUvRCxHQUFJLElBQUEsS0FBSSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsb0JBQXFCLEVBQUEsd0JBQXdCLEVBQUssbUJBQW9CLENBQzlFLEVBQUEsT0FBTyxJQUFJLElBQ1gsT0FHRixHQUFJLEdBQThCLEdBQVEsRUFBSyxTQUUvQyxZQUFLLFNBQ0gsS0FBSyxjQUFjLEVBQU8sRUFBTSxHQUFPLEtBQUssU0FBQSxFQUFNLENBQ2hELEVBQVUsS0FJUCxHQU1GLEVBQUEsVUFBQSxlQUFQLFNBQXNCLEVBQWdCLENBQ3BDLEdBQUksQ0FBQyxLQUFLLGFBQWMsQ0FDdEIsRUFBQSxPQUFPLEtBQUssOENBQ1osT0FHRixBQUFNLE1BQU8sR0FBUSxTQUFZLFNBQy9CLEVBQUEsT0FBTyxLQUFLLDhEQUVaLE1BQUssYUFBYSxHQUVsQixFQUFRLE9BQU8sQ0FBRSxLQUFNLE9BT3BCLEVBQUEsVUFBQSxPQUFQLFVBQUEsQ0FDRSxNQUFPLE1BQUssTUFNUCxFQUFBLFVBQUEsV0FBUCxVQUFBLENBQ0UsTUFBTyxNQUFLLFVBTVAsRUFBQSxVQUFBLGFBQVAsVUFBQSxDQUNFLE1BQU8sTUFBSyxjQUFjLGdCQU1yQixFQUFBLFVBQUEsTUFBUCxTQUFhLEVBQWdCLENBQTdCLEdBQUEsR0FBQSxLQUNFLE1BQU8sTUFBSyx3QkFBd0IsR0FBUyxLQUFLLFNBQUEsRUFBYyxDQUM5RCxNQUFPLEdBQUssZUFDVCxNQUFNLEdBQ04sS0FBSyxTQUFBLEVBQWdCLENBQUksTUFBQSxJQUFrQixPQU8zQyxFQUFBLFVBQUEsTUFBUCxTQUFhLEVBQWdCLENBQTdCLEdBQUEsR0FBQSxLQUNFLE1BQU8sTUFBSyxNQUFNLEdBQVMsS0FBSyxTQUFBLEVBQU0sQ0FDcEMsU0FBSyxhQUFhLFFBQVUsR0FDckIsS0FPSixFQUFBLFVBQUEsa0JBQVAsVUFBQSxDQUNFLEFBQUksS0FBSyxjQUFnQixDQUFDLEtBQUssY0FBYyxhQUMzQyxNQUFLLGNBQWdCLEdBQUEsa0JBQWtCLEtBQUssWUFPekMsRUFBQSxVQUFBLGVBQVAsU0FBNkMsRUFBZ0MsQ0FDM0UsR0FBSSxDQUNGLE1BQVEsTUFBSyxjQUFjLEVBQVksS0FBYSxVQUNwRCxDQUNBLFNBQUEsT0FBTyxLQUFLLCtCQUErQixFQUFZLEdBQUUsNEJBQ2xELE9BS0QsRUFBQSxVQUFBLHdCQUFWLFNBQWtDLEVBQWtCLEVBQVksU0FDMUQsRUFBVSxHQUNWLEVBQVUsR0FDUixFQUFhLEVBQU0sV0FBYSxFQUFNLFVBQVUsT0FFdEQsR0FBSSxFQUFZLENBQ2QsRUFBVSxPQUVWLE9BQWlCLEdBQUEsR0FBQSxTQUFBLEdBQVUsRUFBQSxFQUFBLE9BQUEsQ0FBQSxFQUFBLEtBQUEsRUFBQSxFQUFBLE9BQUUsQ0FBeEIsR0FBTSxHQUFFLEVBQUEsTUFDTCxFQUFZLEVBQUcsVUFDckIsR0FBSSxHQUFhLEVBQVUsVUFBWSxHQUFPLENBQzVDLEVBQVUsR0FDViwwR0FRTixHQUFNLEdBQXFCLEVBQVEsU0FBVyxHQUFBLGNBQWMsR0FDdEQsRUFBdUIsR0FBc0IsRUFBUSxTQUFXLEdBQU8sR0FBc0IsRUFFbkcsQUFBSSxHQUNGLEdBQVEsT0FBTSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ1IsR0FBVyxDQUFFLE9BQVEsR0FBQSxjQUFjLFVBQVUsQ0FDakQsT0FBUSxFQUFRLFFBQVUsT0FBTyxHQUFXLE1BRTlDLEtBQUssZUFBZSxLQUtkLEVBQUEsVUFBQSxhQUFWLFNBQXVCLEVBQWdCLENBQ3JDLEtBQUssY0FBYyxZQUFZLElBYXZCLEVBQUEsVUFBQSx3QkFBVixTQUFrQyxFQUFnQixDQUFsRCxHQUFBLEdBQUEsS0FDRSxNQUFPLElBQUksR0FBQSxZQUFZLFNBQUEsRUFBTyxDQUM1QixHQUFJLEdBQWlCLEVBQ2YsRUFBZSxFQUVmLEVBQVcsWUFBWSxVQUFBLENBQzNCLEFBQUksRUFBSyxnQkFBa0IsRUFDekIsZUFBYyxHQUNkLEVBQVEsS0FFUixJQUFVLEVBQ04sR0FBVyxHQUFVLEdBQ3ZCLGVBQWMsR0FDZCxFQUFRLE9BR1gsTUFLRyxFQUFBLFVBQUEsWUFBVixVQUFBLENBQ0UsTUFBTyxNQUFLLFVBSUosRUFBQSxVQUFBLFdBQVYsVUFBQSxDQUNFLE1BQU8sTUFBSyxhQUFhLFVBQVksSUFBUyxLQUFLLE9BQVMsUUFpQnBELEVBQUEsVUFBQSxjQUFWLFNBQXdCLEVBQWMsRUFBZSxFQUFnQixDQUFyRSxHQUFBLEdBQUEsS0FDVSxFQUFBLEtBQUEsYUFBQSxlQUFBLEVBQUEsSUFBQSxPQUFBLEVBQUEsRUFDRixFQUFRLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FDVCxHQUFLLENBQ1IsU0FBVSxFQUFNLFVBQWEsSUFBUSxFQUFLLFNBQVcsRUFBSyxTQUFXLEVBQUEsU0FDckUsVUFBVyxFQUFNLFdBQWEsRUFBQSwyQkFHaEMsS0FBSyxvQkFBb0IsR0FDekIsS0FBSywyQkFBMkIsR0FJaEMsR0FBSSxHQUFhLEVBQ2pCLEFBQUksR0FBUSxFQUFLLGdCQUNmLEdBQWEsR0FBQSxNQUFNLE1BQU0sR0FBWSxPQUFPLEVBQUssaUJBSW5ELEdBQUksR0FBUyxFQUFBLFlBQVksUUFBc0IsR0FJL0MsTUFBSSxJQUVGLEdBQVMsRUFBVyxhQUFhLEVBQVUsSUFHdEMsRUFBTyxLQUFLLFNBQUEsRUFBRyxDQUNwQixNQUFJLE9BQU8sSUFBbUIsVUFBWSxFQUFpQixFQUNsRCxFQUFLLGdCQUFnQixFQUFLLEdBRTVCLEtBY0QsRUFBQSxVQUFBLGdCQUFWLFNBQTBCLEVBQXFCLEVBQWEsQ0FDMUQsR0FBSSxDQUFDLEVBQ0gsTUFBTyxNQUdULEdBQU0sR0FBVSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ1gsR0FDQyxFQUFNLGFBQWUsQ0FDdkIsWUFBYSxFQUFNLFlBQVksSUFBSSxTQUFBLEVBQUMsQ0FBSSxNQUFBLElBQUEsU0FBQSxHQUFBLFNBQUEsR0FDbkMsR0FDQyxFQUFFLE1BQVEsQ0FDWixLQUFNLEVBQUEsVUFBVSxFQUFFLEtBQU0sU0FJMUIsRUFBTSxNQUFRLENBQ2hCLEtBQU0sRUFBQSxVQUFVLEVBQU0sS0FBTSxLQUUxQixFQUFNLFVBQVksQ0FDcEIsU0FBVSxFQUFBLFVBQVUsRUFBTSxTQUFVLEtBRWxDLEVBQU0sT0FBUyxDQUNqQixNQUFPLEVBQUEsVUFBVSxFQUFNLE1BQU8sS0FVbEMsQUFBSSxFQUFNLFVBQVksRUFBTSxTQUFTLE9BRW5DLEdBQVcsU0FBUyxNQUFRLEVBQU0sU0FBUyxPQUdyQyxHQUFBLEdBQUEsS0FBQSxhQUFBLGFBQUEsRUFBQSxJQUFBLE9BQUEsR0FBQSxFQUNSLE1BQUksR0FBYSwyQkFDUixFQUFBLFVBQVUsR0FHWixHQVNDLEVBQUEsVUFBQSxvQkFBVixTQUE4QixFQUFZLENBQ3hDLEdBQU0sR0FBVSxLQUFLLGFBQ2IsRUFBQSxFQUFBLFlBQWEsRUFBQSxFQUFBLFFBQVMsRUFBQSxFQUFBLEtBQU0sRUFBQSxFQUFBLGVBQUEsRUFBQSxJQUFBLE9BQUEsSUFBQSxFQUVwQyxBQUFNLGVBQWlCLElBQ3JCLEdBQU0sWUFBYyxlQUFpQixHQUFVLEVBQWMsY0FHM0QsRUFBTSxVQUFZLFFBQWEsSUFBWSxRQUM3QyxHQUFNLFFBQVUsR0FHZCxFQUFNLE9BQVMsUUFBYSxJQUFTLFFBQ3ZDLEdBQU0sS0FBTyxHQUdYLEVBQU0sU0FDUixHQUFNLFFBQVUsRUFBQSxTQUFTLEVBQU0sUUFBUyxJQUcxQyxHQUFNLEdBQVksRUFBTSxXQUFhLEVBQU0sVUFBVSxRQUFVLEVBQU0sVUFBVSxPQUFPLEdBQ3RGLEFBQUksR0FBYSxFQUFVLE9BQ3pCLEdBQVUsTUFBUSxFQUFBLFNBQVMsRUFBVSxNQUFPLElBRzlDLEdBQU0sR0FBVSxFQUFNLFFBQ3RCLEFBQUksR0FBVyxFQUFRLEtBQ3JCLEdBQVEsSUFBTSxFQUFBLFNBQVMsRUFBUSxJQUFLLEtBUTlCLEVBQUEsVUFBQSwyQkFBVixTQUFxQyxFQUFZLENBQy9DLEdBQU0sR0FBb0IsT0FBTyxLQUFLLEtBQUssZUFDM0MsQUFBSSxFQUFrQixPQUFTLEdBQzdCLEdBQU0sSUFBTSxFQUFNLEtBQU8sR0FDekIsRUFBTSxJQUFJLGFBQVksR0FBQSxTQUFRLEVBQU0sSUFBSSxjQUFnQixHQUFRLEtBUTFELEVBQUEsVUFBQSxXQUFWLFNBQXFCLEVBQVksQ0FDL0IsS0FBSyxjQUFjLFVBQVUsSUFTckIsRUFBQSxVQUFBLGNBQVYsU0FBd0IsRUFBYyxFQUFrQixFQUFhLENBQ25FLE1BQU8sTUFBSyxjQUFjLEVBQU8sRUFBTSxHQUFPLEtBQzVDLFNBQUEsRUFBVSxDQUNSLE1BQU8sR0FBVyxVQUVwQixTQUFBLEVBQU0sQ0FDSixFQUFBLE9BQU8sTUFBTSxNQW1CVCxFQUFBLFVBQUEsY0FBVixTQUF3QixFQUFjLEVBQWtCLEVBQWEsQ0FBckUsR0FBQSxHQUFBLFNBRVEsRUFBQSxLQUFBLGFBQUUsRUFBQSxFQUFBLFdBQVksRUFBQSxFQUFBLFdBQ2QsRUFBWSxLQUFLLGVBRXZCLEdBQUksQ0FBQyxLQUFLLGFBQ1IsTUFBTyxHQUFBLFlBQVksT0FBTyxHQUFJLEdBQUEsWUFBWSw2Q0FHNUMsR0FBTSxHQUFnQixFQUFNLE9BQVMsY0FJckMsTUFBSSxDQUFDLEdBQWlCLE1BQU8sSUFBZSxVQUFZLEtBQUssU0FBVyxFQUN0RSxJQUFBLEdBQUEsR0FBVSxtQkFBZSxNQUFBLElBQUEsUUFBQSxFQUFBLEtBQUEsRUFBRyxHQUFBLFFBQVEsV0FBWSxTQUN6QyxFQUFBLFlBQVksT0FDakIsR0FBSSxHQUFBLFlBQ0Ysb0ZBQW9GLEVBQVUsT0FLN0YsS0FBSyxjQUFjLEVBQU8sRUFBTyxHQUNyQyxLQUFLLFNBQUEsRUFBUSxTQUNaLEdBQUksSUFBYSxLQUNmLEtBQUEsR0FBQSxHQUFBLEdBQVUsbUJBQWUsTUFBQSxJQUFBLFFBQUEsRUFBQSxLQUFBLEVBQUcsR0FBQSxRQUFRLGVBQWdCLEVBQU0sTUFBUSxTQUM1RCxHQUFJLEdBQUEsWUFBWSwwREFHeEIsR0FBTSxHQUFzQixHQUFRLEVBQUssTUFBUyxFQUFLLEtBQWlDLGFBQWUsR0FDdkcsR0FBSSxHQUF1QixHQUFpQixDQUFDLEVBQzNDLE1BQU8sR0FHVCxHQUFNLEdBQW1CLEVBQVcsRUFBVSxHQUM5QyxNQUFPLEdBQUssb0JBQW9CLEtBRWpDLEtBQUssU0FBQSxFQUFjLFNBQ2xCLEdBQUksSUFBbUIsS0FDckIsS0FBQSxHQUFBLEdBQUEsR0FBVSxtQkFBZSxNQUFBLElBQUEsUUFBQSxFQUFBLEtBQUEsRUFBRyxHQUFBLFFBQVEsV0FBWSxFQUFNLE1BQVEsU0FDeEQsR0FBSSxHQUFBLFlBQVksc0RBR3hCLEdBQU0sR0FBVSxHQUFTLEVBQU0sWUFBYyxFQUFNLGFBQ25ELE1BQUksQ0FBQyxHQUFpQixHQUNwQixFQUFLLHdCQUF3QixFQUFTLEdBR3hDLEVBQUssV0FBVyxHQUNULElBRVIsS0FBSyxLQUFNLFNBQUEsRUFBTSxDQUNoQixLQUFJLGFBQWtCLEdBQUEsWUFDZCxFQUdSLEdBQUssaUJBQWlCLEVBQVEsQ0FDNUIsS0FBTSxDQUNKLFdBQVksSUFFZCxrQkFBbUIsSUFFZixHQUFJLEdBQUEsWUFDUjtVQUE4SCxPQVE1SCxFQUFBLFVBQUEsU0FBVixTQUFzQixFQUF1QixDQUE3QyxHQUFBLEdBQUEsS0FDRSxLQUFLLGdCQUFrQixFQUNsQixFQUFRLEtBQ1gsU0FBQSxFQUFLLENBQ0gsU0FBSyxnQkFBa0IsRUFDaEIsR0FFVCxTQUFBLEVBQU0sQ0FDSixTQUFLLGdCQUFrQixFQUNoQixLQVFILEVBQUEsVUFBQSxvQkFBVixTQUNFLEVBQTRDLENBRTVDLEdBQU0sR0FBVSw2REFDaEIsR0FBSSxFQUFBLFdBQVcsR0FDYixNQUFRLEdBQWlDLEtBQ3ZDLFNBQUEsRUFBSyxDQUNILEdBQUksQ0FBRSxHQUFBLGNBQWMsSUFBVSxJQUFVLE1BQ3RDLEtBQU0sSUFBSSxHQUFBLFlBQVksR0FFeEIsTUFBTyxJQUVULFNBQUEsRUFBQyxDQUNDLEtBQU0sSUFBSSxHQUFBLFlBQVksNEJBQTRCLEtBR2pELEdBQUksQ0FBRSxHQUFBLGNBQWMsSUFBTyxJQUFPLE1BQ3ZDLEtBQU0sSUFBSSxHQUFBLFlBQVksR0FFeEIsTUFBTyxJQUVYLEtBbmpCc0IsR0FBQSxXQUFBLHFFQ2xFdEIsR0FBQSxJQUFBLEtBQ0EsR0FBQSxJQUdBLEdBQUEsVUFBQSxDQUFBLFlBQUEsRUFJUyxTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUFRLENBQ3ZCLE1BQU8sSUFBQSxZQUFZLFFBQVEsQ0FDekIsT0FBUSxzRUFDUixPQUFRLEdBQUEsT0FBTyxXQU9aLEVBQUEsVUFBQSxNQUFQLFNBQWEsRUFBVSxDQUNyQixNQUFPLElBQUEsWUFBWSxRQUFRLEtBRS9CLEtBakJhLEdBQUEsY0FBQSxxRUNIYixHQUFBLElBQUEsSUFFQSxHQUFBLEtBdURBLEdBQUEsVUFBQSxDQVFFLFdBQW1CLEVBQVUsQ0FDM0IsS0FBSyxTQUFXLEVBQ1gsS0FBSyxTQUFTLEtBQ2pCLEdBQUEsT0FBTyxLQUFLLGtEQUVkLEtBQUssV0FBYSxLQUFLLGtCQU9sQixTQUFBLFVBQUEsbUJBQVAsU0FBMEIsRUFBaUIsRUFBaUIsQ0FDMUQsS0FBTSxJQUFJLElBQUEsWUFBWSx5REFNakIsRUFBQSxVQUFBLGlCQUFQLFNBQXdCLEVBQWtCLEVBQW1CLEVBQWlCLENBQzVFLEtBQU0sSUFBSSxJQUFBLFlBQVksdURBTWpCLEVBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQVksQ0FDM0IsQUFBSyxLQUFLLFdBQVcsVUFBVSxHQUFPLEtBQUssS0FBTSxTQUFBLEVBQU0sQ0FDckQsR0FBQSxPQUFPLE1BQU0sOEJBQThCLE1BT3hDLEVBQUEsVUFBQSxZQUFQLFNBQW1CLEVBQWdCLENBQ2pDLEdBQUksQ0FBQyxLQUFLLFdBQVcsWUFBYSxDQUNoQyxHQUFBLE9BQU8sS0FBSywyRUFDWixPQUdGLEFBQUssS0FBSyxXQUFXLFlBQVksR0FBUyxLQUFLLEtBQU0sU0FBQSxFQUFNLENBQ3pELEdBQUEsT0FBTyxNQUFNLGdDQUFnQyxNQU8xQyxFQUFBLFVBQUEsYUFBUCxVQUFBLENBQ0UsTUFBTyxNQUFLLFlBTUosRUFBQSxVQUFBLGdCQUFWLFVBQUEsQ0FDRSxNQUFPLElBQUksSUFBQSxlQUVmLEtBbkVzQixHQUFBLFlBQUEsZ0ZDckR0QixZQUF5QyxFQUFRLENBQy9DLEdBQUksR0FBQyxFQUFJLFVBQVksQ0FBQyxFQUFJLFNBQVMsS0FHN0IsSUFBQSxHQUFBLEVBQUEsU0FBQSxJQUFFLEVBQUEsRUFBQSxLQUFNLEVBQUEsRUFBQSxRQUNkLE1BQU8sQ0FBRSxLQUFJLEVBQUUsUUFBTyxJQU94QixZQUFpQyxFQUFjLEVBQWlCLENBQzlELE1BQUssSUFHTCxHQUFNLElBQU0sRUFBTSxLQUFPLEdBQ3pCLEVBQU0sSUFBSSxLQUFPLEVBQU0sSUFBSSxNQUFRLEVBQVEsS0FDM0MsRUFBTSxJQUFJLFFBQVUsRUFBTSxJQUFJLFNBQVcsRUFBUSxRQUNqRCxFQUFNLElBQUksYUFBWSxHQUFBLFNBQVEsRUFBTSxJQUFJLGNBQWdCLEdBQVMsRUFBUSxjQUFnQixJQUN6RixFQUFNLElBQUksU0FBUSxHQUFBLFNBQVEsRUFBTSxJQUFJLFVBQVksR0FBUyxFQUFRLFVBQVksS0FDdEUsRUFJVCxZQUF1QyxFQUFzQyxFQUFRLENBQ25GLEdBQU0sR0FBVSxHQUFnQyxHQUMxQyxFQUFrQixLQUFLLFVBQVMsR0FBQSxTQUFBLEdBQUEsU0FBQSxDQUNwQyxRQUFTLEdBQUksUUFBTyxlQUNoQixHQUFXLENBQUUsSUFBSyxJQUNsQixFQUFJLGlCQUFtQixDQUFFLElBQUssRUFBSSxTQUFTLGNBRzNDLEVBQTBCLGNBQWdCLEdBQVcsV0FBbUMsVUFDeEYsRUFBYyxLQUFLLFVBQVUsQ0FDakMsS0FBSSxJQUdOLE1BQU8sQ0FDTCxLQUFTLEVBQWU7RUFBSyxFQUFXO0VBQUssS0FBSyxVQUFVLEdBQzVELEtBQUksRUFDSixJQUFLLEVBQUkseUNBaEJiLEdBQUEsdUJBQUEsR0FxQkEsWUFBcUMsRUFBYyxFQUFRLENBQ3pELEdBQU0sR0FBVSxHQUFnQyxHQUMxQyxFQUFZLEVBQU0sTUFBUSxRQUMxQixFQUFjLElBQWMsZUFBaUIsRUFBSSxnQkFFakQsRUFBQSxFQUFBLFlBQUEsR0FBRSxFQUFBLEVBQUEsb0JBQXFCLEVBQUEsR0FBQSxPQUFBLEVBQUEsQ0FBQSx3QkFDdkIsRUFBQSxHQUFBLEdBQUUsRUFBQSxFQUFBLE9BQXdCLEVBQUEsRUFBQSxLQUNoQyxBQUFJLE9BQU8sS0FBSyxHQUFVLFNBQVcsRUFDbkMsTUFBTyxHQUFNLFdBRWIsRUFBTSxXQUFhLEVBR3JCLEdBQU0sR0FBcUIsQ0FDekIsS0FBTSxLQUFLLFVBQVUsRUFBVSxHQUF3QixFQUFPLEVBQUksU0FBUyxLQUFPLEdBQ2xGLEtBQU0sRUFDTixJQUFLLEVBQWMsRUFBSSx3Q0FBMEMsRUFBSSxzQ0FTdkUsR0FBSSxFQUFhLENBQ2YsR0FBTSxHQUFrQixLQUFLLFVBQVMsR0FBQSxTQUFBLEdBQUEsU0FBQSxDQUNwQyxTQUFVLEVBQU0sU0FDaEIsUUFBUyxHQUFJLFFBQU8sZUFDaEIsR0FBVyxDQUFFLElBQUssSUFDbEIsRUFBSSxpQkFBbUIsQ0FBRSxJQUFLLEVBQUksU0FBUyxjQUUzQyxFQUFjLEtBQUssVUFBVSxDQUNqQyxLQUFNLEVBSU4sYUFBYyxDQUFDLENBQUUsR0FBSSxFQUFnQixLQUFNLE1Bb0J2QyxFQUFjLEVBQWU7RUFBSyxFQUFXO0VBQUssRUFBSSxLQUM1RCxFQUFJLEtBQU8sRUFHYixNQUFPLEdBN0RULEdBQUEscUJBQUEscUVDbkRBLEdBQUEsSUFBQSxLQUVBLEdBQUEsSUFZQSxZQUFpRSxFQUFnQyxFQUFVLE9BQ3pHLEFBQUksRUFBUSxRQUFVLElBQ3BCLEdBQUEsT0FBTyxTQUVULEdBQU0sR0FBTSxHQUFBLGdCQUNaLEFBQUEsR0FBQSxFQUFJLGNBQVUsTUFBQSxJQUFBLFFBQUEsRUFBRSxPQUFPLEVBQVEsY0FDL0IsR0FBTSxHQUFTLEdBQUksR0FBWSxHQUMvQixFQUFJLFdBQVcsR0FQakIsR0FBQSxZQUFBLHFFQ2RhLEdBQUEsWUFBYywyRUNFM0IsR0FBSSxJQUdKLEdBQUEsVUFBQSxDQUFBLFlBQUEsQ0FTUyxLQUFBLEtBQWUsRUFBaUIsR0FLaEMsU0FBQSxVQUFBLFVBQVAsVUFBQSxDQUVFLEdBQTJCLFNBQVMsVUFBVSxTQUc5QyxTQUFTLFVBQVUsU0FBVyxVQUFBLFFBQWdDLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxVQUFBLE9BQUEsSUFBQSxFQUFBLEdBQUEsVUFBQSxHQUM1RCxHQUFNLEdBQVUsS0FBSyxxQkFBdUIsS0FDNUMsTUFBTyxJQUF5QixNQUFNLEVBQVMsS0FqQnJDLEVBQUEsR0FBYSxtQkFvQjdCLEtBeEJhLEdBQUEsaUJBQUEsZ0ZDTGIsR0FBQSxLQUVBLEdBQUEsSUFJTSxHQUF3QixDQUFDLG9CQUFxQixpREFnQnBELEdBQUEsVUFBQSxDQVdFLFdBQW9DLEVBQTZDLENBQTdDLEFBQUEsSUFBQSxRQUFBLEdBQUEsSUFBQSxLQUFBLFNBQUEsRUFGN0IsS0FBQSxLQUFlLEVBQWUsR0FPOUIsU0FBQSxVQUFBLFVBQVAsVUFBQSxDQUNFLEdBQUEsd0JBQXdCLFNBQUMsRUFBWSxDQUNuQyxHQUFNLEdBQU0sR0FBQSxnQkFDWixHQUFJLENBQUMsRUFDSCxNQUFPLEdBRVQsR0FBTSxHQUFPLEVBQUksZUFBZSxHQUNoQyxHQUFJLEVBQU0sQ0FDUixHQUFNLEdBQVMsRUFBSSxZQUNiLEVBQWdCLEVBQVMsRUFBTyxhQUFlLEdBTS9DLEVBQVUsTUFBTyxHQUFLLGVBQWtCLFdBQWEsRUFBSyxjQUFjLEdBQWlCLEdBQy9GLE1BQUksT0FBTyxHQUFLLGtCQUFxQixXQUM1QixFQUVGLEVBQUssaUJBQWlCLEVBQU8sR0FBVyxLQUFPLEVBRXhELE1BQU8sTUFLSCxFQUFBLFVBQUEsaUJBQVIsU0FBeUIsRUFBYyxFQUF1QyxDQUM1RSxNQUFJLE1BQUssZUFBZSxFQUFPLEdBQzdCLElBQUEsT0FBTyxLQUFLO1NBQTZELEdBQUEsb0JBQW9CLElBQ3RGLElBRUwsS0FBSyxnQkFBZ0IsRUFBTyxHQUM5QixJQUFBLE9BQU8sS0FDTCx3RUFBMEUsR0FBQSxvQkFBb0IsSUFFekYsSUFFTCxLQUFLLGFBQWEsRUFBTyxHQUMzQixJQUFBLE9BQU8sS0FDTCxvRUFBc0UsR0FBQSxvQkFDcEUsR0FDRDtPQUFXLEtBQUssbUJBQW1CLElBRS9CLElBRUosS0FBSyxjQUFjLEVBQU8sR0FReEIsR0FQTCxJQUFBLE9BQU8sS0FDTCx5RUFBMkUsR0FBQSxvQkFDekUsR0FDRDtPQUFXLEtBQUssbUJBQW1CLElBRS9CLEtBTUgsRUFBQSxVQUFBLGVBQVIsU0FBdUIsRUFBYyxFQUF1QyxDQUMxRSxHQUFJLENBQUMsRUFBUSxlQUNYLE1BQU8sR0FHVCxHQUFJLENBQ0YsTUFDRyxJQUNDLEVBQU0sV0FDTixFQUFNLFVBQVUsUUFDaEIsRUFBTSxVQUFVLE9BQU8sSUFDdkIsRUFBTSxVQUFVLE9BQU8sR0FBRyxPQUFTLGVBQ3JDLFFBRUYsQ0FDQSxNQUFPLEtBS0gsRUFBQSxVQUFBLGdCQUFSLFNBQXdCLEVBQWMsRUFBdUMsQ0FDM0UsTUFBSSxDQUFDLEVBQVEsY0FBZ0IsQ0FBQyxFQUFRLGFBQWEsT0FDMUMsR0FHRixLQUFLLDBCQUEwQixHQUFPLEtBQUssU0FBQSxFQUFPLENBRXZELE1BQUMsR0FBUSxhQUF3QyxLQUFLLFNBQUEsRUFBTyxDQUFJLE1BQUEsSUFBQSxrQkFBa0IsRUFBUyxRQUt4RixFQUFBLFVBQUEsYUFBUixTQUFxQixFQUFjLEVBQXVDLENBRXhFLEdBQUksQ0FBQyxFQUFRLFVBQVksQ0FBQyxFQUFRLFNBQVMsT0FDekMsTUFBTyxHQUVULEdBQU0sR0FBTSxLQUFLLG1CQUFtQixHQUNwQyxNQUFPLEFBQUMsR0FBYyxFQUFRLFNBQVMsS0FBSyxTQUFBLEVBQU8sQ0FBSSxNQUFBLElBQUEsa0JBQWtCLEVBQUssS0FBaEUsSUFJUixFQUFBLFVBQUEsY0FBUixTQUFzQixFQUFjLEVBQXVDLENBRXpFLEdBQUksQ0FBQyxFQUFRLFdBQWEsQ0FBQyxFQUFRLFVBQVUsT0FDM0MsTUFBTyxHQUVULEdBQU0sR0FBTSxLQUFLLG1CQUFtQixHQUNwQyxNQUFPLEFBQUMsR0FBYSxFQUFRLFVBQVUsS0FBSyxTQUFBLEVBQU8sQ0FBSSxNQUFBLElBQUEsa0JBQWtCLEVBQUssS0FBaEUsSUFJUixFQUFBLFVBQUEsY0FBUixTQUFzQixFQUFrRCxDQUFsRCxNQUFBLEtBQUEsUUFBQSxHQUFBLElBQ2IsQ0FDTCxVQUFTLEdBQUEsU0FFSCxLQUFLLFNBQVMsZUFBaUIsR0FDL0IsS0FBSyxTQUFTLFdBQWEsR0FFM0IsRUFBYyxlQUFpQixHQUMvQixFQUFjLFdBQWEsSUFFakMsU0FBUSxHQUFBLFNBRUYsS0FBSyxTQUFTLGVBQWlCLEdBQy9CLEtBQUssU0FBUyxVQUFZLEdBRTFCLEVBQWMsZUFBaUIsR0FDL0IsRUFBYyxVQUFZLElBRWhDLGFBQVksR0FBQSxTQUNOLEtBQUssU0FBUyxjQUFnQixHQUM5QixFQUFjLGNBQWdCLEdBQy9CLElBRUwsZUFBZ0IsTUFBTyxNQUFLLFNBQVMsZ0JBQW1CLFlBQWMsS0FBSyxTQUFTLGVBQWlCLEtBS2pHLEVBQUEsVUFBQSwwQkFBUixTQUFrQyxFQUFZLENBQzVDLEdBQUksRUFBTSxRQUNSLE1BQU8sQ0FBQyxFQUFNLFNBRWhCLEdBQUksRUFBTSxVQUNSLEdBQUksQ0FDSSxHQUFBLEdBQUEsRUFBQSxVQUFBLFFBQUEsRUFBQSxVQUFBLE9BQUEsSUFBQSxHQUFFLEVBQUEsRUFBQSxLQUFBLEVBQUEsSUFBQSxPQUFBLEdBQUEsRUFBVyxFQUFBLEVBQUEsTUFBQSxFQUFBLElBQUEsT0FBQSxHQUFBLEVBQ25CLE1BQU8sQ0FBQyxHQUFHLEVBQVksRUFBSSxLQUFLLFFBQ2hDLENBQ0EsVUFBQSxPQUFPLE1BQU0sb0NBQW9DLEdBQUEsb0JBQW9CLElBQzlELEdBR1gsTUFBTyxJQUlELEVBQUEsVUFBQSxpQkFBUixTQUF5QixFQUF5QixDQUF6QixBQUFBLElBQUEsUUFBQSxHQUFBLElBQ3ZCLFlBQVMsRUFBSSxFQUFPLE9BQVMsRUFBRyxHQUFLLEVBQUcsSUFBSyxDQUMzQyxHQUFNLEdBQVEsRUFBTyxHQUVyQixHQUFJLElBQUEsS0FBSyxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsWUFBYSxlQUFpQixJQUFBLEtBQUssTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFlBQWEsZ0JBQzNELE1BQU8sR0FBTSxVQUFZLEtBSTdCLE1BQU8sT0FJRCxFQUFBLFVBQUEsbUJBQVIsU0FBMkIsRUFBWSxDQUNyQyxHQUFJLENBQ0YsR0FBSSxFQUFNLFdBQVksQ0FDcEIsR0FBTSxHQUFTLEVBQU0sV0FBVyxPQUNoQyxNQUFPLE1BQUssaUJBQWlCLEdBRS9CLEdBQUksRUFBTSxVQUFXLENBQ25CLEdBQU0sR0FDSixFQUFNLFVBQVUsUUFBVSxFQUFNLFVBQVUsT0FBTyxHQUFHLFlBQWMsRUFBTSxVQUFVLE9BQU8sR0FBRyxXQUFXLE9BQ3pHLE1BQU8sTUFBSyxpQkFBaUIsR0FFL0IsTUFBTyxXQUNQLENBQ0EsVUFBQSxPQUFPLE1BQU0sZ0NBQWdDLEdBQUEsb0JBQW9CLElBQzFELE9Bak1HLEVBQUEsR0FBYSxpQkFvTTdCLEtBeE1hLEdBQUEsZUFBQSxxRUN0QmIsR0FBQSxJQUFBLEtBQVMsR0FBQSxpQkFBQSxHQUFBLGlCQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsZUFBQSxHQUFBLCtFQ0RULEdBQUEsSUFBQSxLQUNFLEVBQUEsY0FBQSxHQUFBLGNBQ0EsRUFBQSxpQkFBQSxHQUFBLGlCQUNBLEVBQUEsYUFBQSxHQUFBLGFBQ0EsRUFBQSxlQUFBLEdBQUEsZUFDQSxFQUFBLGVBQUEsR0FBQSxlQUNBLEVBQUEsaUJBQUEsR0FBQSxpQkFDQSxFQUFBLFdBQUEsR0FBQSxXQUNBLEVBQUEsU0FBQSxHQUFBLFNBQ0EsRUFBQSxVQUFBLEdBQUEsVUFDQSxFQUFBLE9BQUEsR0FBQSxPQUNBLEVBQUEsUUFBQSxHQUFBLFFBQ0EsRUFBQSxRQUFBLEdBQUEsUUFDQSxFQUFBLFVBQUEsR0FBQSxVQUVGLEdBQUEsSUFBQSxLQUFTLEVBQUEsd0JBQUEsR0FBQSx3QkFBeUIsRUFBQSxjQUFBLEdBQUEsY0FBZSxFQUFBLGtCQUFBLEdBQUEsa0JBQW1CLEVBQUEsSUFBQSxHQUFBLElBQUssRUFBQSxTQUFBLEdBQUEsU0FBVSxFQUFBLE1BQUEsR0FBQSxNQUNuRixHQUFBLElBQUEsS0FBUyxFQUFBLElBQUEsR0FBQSxJQUNULEdBQUEsSUFBQSxLQUFTLEVBQUEsV0FBQSxHQUFBLFdBQ1QsR0FBQSxJQUFBLEtBQXVCLEVBQUEsWUFBQSxHQUFBLFlBQ3ZCLEdBQUEsSUFBQSxLQUFTLEVBQUEscUJBQUEsR0FBQSxxQkFBc0IsRUFBQSx1QkFBQSxHQUFBLHVCQUMvQixHQUFBLElBQUEsS0FBUyxFQUFBLFlBQUEsR0FBQSxZQUNULEdBQUEsSUFBQSxLQUFTLEVBQUEsY0FBQSxHQUFBLGNBQ1QsR0FBQSxJQUFBLEtBQVMsRUFBQSxZQUFBLEdBQUEsWUFFVCxHQUFBLElBQUEsS0FFUyxFQUFBLGFBQUEsS0MxQlQsY0FrQkEsQUFBQyxVQUFTLEVBQUUsRUFBRSxDQUNaLEdBQU0sR0FBSSxNQUFPLEtBQVcsU0FBVyxHQUFVLE1BQU8sSUFBSyxTQUFXLEVBQUksR0FDNUUsRUFBRSxHQUNFLE1BQU8sU0FBVSxZQUFjLE9BQU8sS0FBTyxPQUFPLE1BQU8sS0FDOUQsR0FBTSxTQUFTLEVBQVMsQ0FFM0IsR0FBTSxHQUFRLE9BQU8sU0FDZixFQUFRLE9BQU8sU0FFckIsV0FBZ0IsRUFBTyxFQUFTLENBQzlCLEFBQUksTUFBTyxJQUFVLFVBRW5CLEdBQVUsRUFDVixFQUFRLEdBR1YsS0FBSyxLQUFPLEVBQ1osS0FBSyxNQUFRLEVBQ2IsS0FBSyxPQUFTLEtBQUssT0FBUyxPQUM1QixLQUFLLFFBQVUsR0FBSSxLQUVmLEdBQ0YsTUFBSyxPQUFPLEdBQ1IsRUFBUSxHQUNWLE1BQUssTUFBUSxLQUFLLE9BS3hCLEVBQVEsT0FBUyxFQUVqQixXQUFlLEVBQUssRUFBTyxDQUN6QixLQUFLLElBQU0sRUFDWCxLQUFLLE1BQVEsRUFDYixLQUFLLEdBQVMsT0FDZCxLQUFLLEdBQVMsT0FJaEIsRUFBTyxVQUFVLGlCQUFtQixTQUFTLEVBQU8sQ0FDbEQsQUFBSSxJQUFVLEtBQUssUUFRZixHQUFNLElBQ0osS0FBVSxLQUFLLFFBQ2pCLE1BQUssT0FBUyxFQUFNLElBRXRCLEVBQU0sR0FBTyxHQUFTLEVBQU0sSUFFMUIsRUFBTSxJQUNSLEdBQU0sR0FBTyxHQUFTLEVBQU0sSUFFOUIsRUFBTSxHQUFTLE9BQ2YsRUFBTSxHQUFTLEtBQUssT0FDaEIsS0FBSyxRQUNQLE1BQUssT0FBTyxHQUFTLEdBRXZCLEtBQUssT0FBUyxJQUdoQixFQUFPLFVBQVUsT0FBUyxTQUFTLEVBQVMsQ0FDMUMsR0FBSSxHQUFPLEVBQVEsS0FBSyxPQUFTLE9BQU8sVUFDeEMsS0FBSyxRQUFRLFFBQ2IsR0FBSSxHQUFLLEVBQVEsT0FBTyxZQUN4QixPQUFTLEdBQU0sRUFBRyxPQUFRLENBQUMsRUFBSSxLQUFNLEVBQU0sRUFBRyxPQUFRLENBQ3BELEdBQUksR0FBSSxHQUFJLEdBQU0sRUFBSSxNQUFNLEdBQUksRUFBSSxNQUFNLElBUzFDLEdBUkEsS0FBSyxRQUFRLElBQUksRUFBRSxJQUFLLEdBQ3hCLEFBQUssRUFHSCxHQUFNLEdBQVMsRUFDZixFQUFFLEdBQVMsR0FIWCxLQUFLLE9BQVMsRUFLaEIsRUFBUSxFQUNKLEtBQVcsRUFDYixLQUFNLElBQUksT0FBTSxZQUdwQixLQUFLLE9BQVMsRUFDZCxLQUFLLEtBQU8sS0FBSyxRQUFRLE1BRzNCLEVBQU8sVUFBVSxJQUFNLFNBQVMsRUFBSyxDQUVuQyxHQUFJLEdBQVEsS0FBSyxRQUFRLElBQUksR0FDN0IsR0FBSSxFQUFDLEVBRUwsWUFBSyxpQkFBaUIsR0FDZixFQUFNLE9BR2YsRUFBTyxVQUFVLElBQU0sU0FBUyxFQUFLLEVBQU8sQ0FDMUMsR0FBSSxHQUFRLEtBQUssUUFBUSxJQUFJLEdBRTdCLE1BQUksR0FFRixHQUFNLE1BQVEsRUFDZCxLQUFLLGlCQUFpQixHQUNmLE1BSVQsTUFBSyxRQUFRLElBQUksRUFBTSxFQUFRLEdBQUksR0FBTSxFQUFLLElBRTlDLEFBQUksS0FBSyxPQUVQLE1BQUssT0FBTyxHQUFTLEVBQ3JCLEVBQU0sR0FBUyxLQUFLLFFBR3BCLEtBQUssT0FBUyxFQUloQixLQUFLLE9BQVMsRUFDZCxFQUFFLEtBQUssS0FDSCxLQUFLLEtBQU8sS0FBSyxPQUVuQixLQUFLLFFBR0EsT0FHVCxFQUFPLFVBQVUsTUFBUSxVQUFXLENBRWxDLEdBQUksR0FBUSxLQUFLLE9BQ2pCLEdBQUksRUFDRixNQUFJLE1BQUssT0FBTyxHQUVkLE1BQUssT0FBUyxLQUFLLE9BQU8sR0FDMUIsS0FBSyxPQUFPLEdBQVMsUUFHckIsTUFBSyxPQUFTLE9BQ2QsS0FBSyxPQUFTLFFBSWhCLEVBQU0sR0FBUyxFQUFNLEdBQVMsT0FDOUIsS0FBSyxRQUFRLE9BQU8sRUFBTSxLQUMxQixFQUFFLEtBQUssS0FDQSxDQUFDLEVBQU0sSUFBSyxFQUFNLFFBUTdCLEVBQU8sVUFBVSxLQUFPLFNBQVMsRUFBSyxDQUNwQyxHQUFJLEdBQUksS0FBSyxRQUFRLElBQUksR0FDekIsTUFBTyxHQUFJLEVBQUUsTUFBUSxRQUd2QixFQUFPLFVBQVUsSUFBTSxTQUFTLEVBQUssQ0FDbkMsTUFBTyxNQUFLLFFBQVEsSUFBSSxJQUcxQixFQUFPLFVBQVUsT0FBWSxTQUFTLEVBQUssQ0FDekMsR0FBSSxHQUFRLEtBQUssUUFBUSxJQUFJLEdBQzdCLEdBQUksRUFBQyxFQUNMLFlBQUssUUFBUSxPQUFPLEVBQU0sS0FDMUIsQUFBSSxFQUFNLElBQVUsRUFBTSxHQUV4QixHQUFNLEdBQU8sR0FBUyxFQUFNLEdBQzVCLEVBQU0sR0FBTyxHQUFTLEVBQU0sSUFDdkIsQUFBSSxFQUFNLEdBRWYsR0FBTSxHQUFPLEdBQVMsT0FFdEIsS0FBSyxPQUFTLEVBQU0sSUFDZixBQUFJLEVBQU0sR0FFZixHQUFNLEdBQU8sR0FBUyxPQUV0QixLQUFLLE9BQVMsRUFBTSxJQUVwQixLQUFLLE9BQVMsS0FBSyxPQUFTLE9BRzlCLEtBQUssT0FDRSxFQUFNLE9BR2YsRUFBTyxVQUFVLE1BQVEsVUFBVyxDQUVsQyxLQUFLLE9BQVMsS0FBSyxPQUFTLE9BQzVCLEtBQUssS0FBTyxFQUNaLEtBQUssUUFBUSxTQUlmLFdBQXVCLEVBQWEsQ0FBRSxLQUFLLE1BQVEsRUFDbkQsRUFBYyxVQUFVLE9BQU8sVUFBWSxVQUFXLENBQUUsTUFBTyxPQUMvRCxFQUFjLFVBQVUsS0FBTyxVQUFXLENBQ3hDLEdBQUksR0FBTSxLQUFLLE1BQ2YsTUFBSSxHQUNGLE1BQUssTUFBUSxFQUFJLEdBQ1YsQ0FBRSxLQUFNLEdBQU8sTUFBTyxDQUFDLEVBQUksSUFBSyxFQUFJLFNBRXBDLENBQUUsS0FBTSxHQUFNLE1BQU8sU0FLaEMsV0FBcUIsRUFBYSxDQUFFLEtBQUssTUFBUSxFQUNqRCxFQUFZLFVBQVUsT0FBTyxVQUFZLFVBQVcsQ0FBRSxNQUFPLE9BQzdELEVBQVksVUFBVSxLQUFPLFVBQVcsQ0FDdEMsR0FBSSxHQUFNLEtBQUssTUFDZixNQUFJLEdBQ0YsTUFBSyxNQUFRLEVBQUksR0FDVixDQUFFLEtBQU0sR0FBTyxNQUFPLEVBQUksTUFFMUIsQ0FBRSxLQUFNLEdBQU0sTUFBTyxTQUloQyxXQUF1QixFQUFhLENBQUUsS0FBSyxNQUFRLEVBQ25ELEVBQWMsVUFBVSxPQUFPLFVBQVksVUFBVyxDQUFFLE1BQU8sT0FDL0QsRUFBYyxVQUFVLEtBQU8sVUFBVyxDQUN4QyxHQUFJLEdBQU0sS0FBSyxNQUNmLE1BQUksR0FDRixNQUFLLE1BQVEsRUFBSSxHQUNWLENBQUUsS0FBTSxHQUFPLE1BQU8sRUFBSSxRQUUxQixDQUFFLEtBQU0sR0FBTSxNQUFPLFNBS2hDLEVBQU8sVUFBVSxLQUFPLFVBQVcsQ0FDakMsTUFBTyxJQUFJLEdBQVksS0FBSyxTQUc5QixFQUFPLFVBQVUsT0FBUyxVQUFXLENBQ25DLE1BQU8sSUFBSSxHQUFjLEtBQUssU0FHaEMsRUFBTyxVQUFVLFFBQVUsVUFBVyxDQUNwQyxNQUFPLE9BR1QsRUFBTyxVQUFVLE9BQU8sVUFBWSxVQUFXLENBQzdDLE1BQU8sSUFBSSxHQUFjLEtBQUssU0FHaEMsRUFBTyxVQUFVLFFBQVUsU0FBUyxFQUFLLEVBQVMsQ0FDaEQsQUFBSSxNQUFPLElBQVksVUFDckIsR0FBVSxNQUVaLEdBQUksR0FBUSxLQUFLLE9BQ2pCLEtBQU8sR0FDTCxFQUFJLEtBQUssRUFBUyxFQUFNLE1BQU8sRUFBTSxJQUFLLE1BQzFDLEVBQVEsRUFBTSxJQUtsQixFQUFPLFVBQVUsT0FBUyxVQUFXLENBRW5DLE9BREksR0FBSSxHQUFJLE9BQU0sS0FBSyxNQUFPLEVBQUksRUFBRyxFQUFRLEtBQUssT0FDM0MsR0FDTCxFQUFFLEtBQU8sQ0FBRSxJQUFLLEVBQU0sSUFBSyxNQUFPLEVBQU0sT0FDeEMsRUFBUSxFQUFNLEdBRWhCLE1BQU8sSUFJVCxFQUFPLFVBQVUsU0FBVyxVQUFXLENBRXJDLE9BREksR0FBSSxHQUFJLEVBQVEsS0FBSyxPQUNsQixHQUNMLEdBQUssT0FBTyxFQUFNLEtBQUssSUFBSSxFQUFNLE1BQ2pDLEVBQVEsRUFBTSxHQUNWLEdBQ0YsSUFBSyxPQUdULE1BQU8sUUM3U1QsZ0VBd0JBLFlBQXNCLEVBQVUsQ0FDOUIsR0FBSSxDQUFDLEVBQUksTUFDUCxNQUFPLEdBR1QsR0FBTSxHQUFRLEVBQUksTUFBTSxNQUFNO0dBQU0sTUFBTSxHQUUxQyxNQUFPLEdBQ0osSUFBSSxTQUFBLEVBQUksQ0FDUCxHQUFJLEVBQUssTUFBTSxnQkFDYixNQUFPLENBQ0wsYUFBYyxLQUNkLFNBQVUsRUFDVixhQUFjLEtBQ2QsV0FBWSxLQUNaLFdBQVksS0FDWixPQUFRLEtBQ1IsU0FBVSxNQUlkLEdBQU0sR0FBWSxFQUFLLE1BQU0sMkRBQzdCLEdBQUksRUFBQyxFQUlMLElBQUksR0FBUyxLQUNULEVBQVMsS0FDVCxFQUFlLEtBQ2YsRUFBVyxLQUNYLEVBQWEsS0FDWCxFQUFXLEVBQVUsS0FBTyxTQUVsQyxHQUFJLEVBQVUsR0FBSSxDQUNoQixFQUFlLEVBQVUsR0FDekIsR0FBSSxHQUFjLEVBQWEsWUFBWSxLQUszQyxHQUpJLEVBQWEsRUFBYyxLQUFPLEtBRXBDLElBRUUsRUFBYyxFQUFHLENBQ25CLEVBQVMsRUFBYSxPQUFPLEVBQUcsR0FDaEMsRUFBUyxFQUFhLE9BQU8sRUFBYyxHQUMzQyxHQUFNLEdBQVksRUFBTyxRQUFRLFdBQ2pDLEFBQUksRUFBWSxHQUNkLEdBQWUsRUFBYSxPQUFPLEVBQVksR0FDL0MsRUFBUyxFQUFPLE9BQU8sRUFBRyxJQUc5QixFQUFXLEtBR2IsQUFBSSxHQUNGLEdBQVcsRUFDWCxFQUFhLEdBR1gsSUFBVyxlQUNiLEdBQWEsS0FDYixFQUFlLE1BR2pCLEdBQU0sR0FBYSxDQUNqQixhQUFjLFNBQVMsRUFBVSxHQUFJLEtBQU8sS0FDNUMsU0FBVSxFQUFVLElBQU0sS0FDMUIsYUFBWSxFQUNaLFdBQVksU0FBUyxFQUFVLEdBQUksS0FBTyxLQUMxQyxXQUFVLEVBQ1YsT0FBUSxFQUNSLFNBQVEsR0FHVixNQUFPLE1BRVIsT0FBTyxTQUFBLEVBQVEsQ0FBSSxNQUFBLENBQUMsQ0FBQyxJQTFFMUIsR0FBQSxNQUFBLHFFQ3ZCQSxHQUFBLElBQUEsSUFDQSxHQUFBLFFBQUEsTUFDQSxHQUFBLEtBRUEsR0FBQSxLQUdNLEdBQW1DLEVBQ25DLEdBQXFCLEdBQUksSUFBQSxPQUE4QixLQU03RCxhQUFxQyxDQUNuQyxHQUFtQixRQURyQixHQUFBLHNCQUFBLEdBS0EsWUFBcUIsRUFBNEIsQ0FDL0MsR0FBSSxDQUNGLE1BQU8sR0FBTSxjQUFtQixFQUFNLFNBQVEsSUFBSSxHQUFNLFlBQWMsb0JBQ3RFLENBSUEsTUFBTyxlQUlYLEdBQU0sSUFBeUIsU0FBUSxNQUFRLFFBQVEsS0FBSyxVQUFZLEdBQUEsUUFBUSxRQUFRLEtBQUssV0FDM0YsT0FBTyxRQUFRLE9BQUssSUFHdEIsWUFBbUIsRUFBa0IsRUFBYSxDQUNoRCxBQUFLLEdBRUgsR0FBTyxJQUlULEdBQU0sR0FBTyxHQUFBLFNBQVMsRUFBVSxPQUVoQyxFQUFXLEdBQUEsUUFBUSxHQUNuQixHQUFJLEdBQUksRUFBUyxZQUFZLGtCQUM3QixHQUFJLEVBQUksR0FFTixNQUFVLEdBQVMsT0FBTyxFQUFJLElBQUksUUFBUSxNQUFPLEtBQUksSUFBSSxFQUszRCxHQURBLEVBQU8sR0FBUSxLQUFJLFlBQVksRUFBTSxHQUNqQyxJQUFNLEVBQUcsQ0FDWCxHQUFJLEdBQWEsRUFBUyxPQUFPLEVBQUssUUFBUSxRQUFRLE1BQU8sS0FDN0QsTUFBSSxJQUNGLElBQWMsS0FFaEIsR0FBYyxFQUNQLEVBRVQsTUFBTyxHQVNULFlBQXlCLEVBQW1CLENBRTFDLE1BQUksR0FBVSxTQUFXLEVBQ2hCLEdBQUEsWUFBWSxRQUFRLElBR3RCLEdBQUksSUFBQSxZQUVSLFNBQUEsRUFBTyxDQU9SLE9BTk0sR0FFRixHQUVBLEVBQVEsYUFFSCxFQUFDLENBQ1IsR0FBTSxHQUFXLEVBQVUsR0FFckIsRUFBUSxHQUFtQixJQUFJLEdBRXJDLEdBQUksSUFBVSxPQUdaLE1BQUksS0FBVSxNQUNaLEdBQVksR0FBWSxHQUcxQixJQUdJLElBQVUsRUFBVSxRQUN0QixFQUFRLGNBS1osR0FBQSxTQUFTLEVBQVUsU0FBQyxFQUFtQixFQUFZLENBQ2pELEdBQU0sR0FBVSxFQUFNLEtBQU8sRUFBSyxXQUNsQyxFQUFZLEdBQVksRUFJeEIsR0FBbUIsSUFBSSxFQUFVLEdBRWpDLElBQ0ksSUFBVSxFQUFVLFFBQ3RCLEVBQVEsTUEvQkwsRUFBSSxFQUFHLEVBQUksRUFBVSxPQUFRLE1BQTdCLEtBeUNiLFlBQXNDLEVBQVksQ0FDaEQsR0FBTSxHQUFRLEdBQVcsTUFBTSxHQUMvQixNQUFLLElBQ0ksR0FIWCxHQUFBLHNCQUFBLEdBV0EsWUFBMkIsRUFBZ0MsRUFBcUIsQ0FDOUUsR0FBTSxHQUF3QixHQUV4QixFQUNKLEdBQVcsRUFBUSxvQkFBc0IsT0FBWSxFQUFRLGtCQUFvQixHQUU3RSxFQUF1QixFQUFNLElBQUksU0FBQSxFQUFLLE9BQ3BDLEVBQTBCLENBQzlCLE1BQU8sRUFBTSxhQUNiLFNBQVUsSUFBQSxFQUFNLFlBQVEsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFdBQVcsWUFBYSxFQUFNLFNBQVMsT0FBTyxHQUFLLEVBQU0sVUFBWSxHQUMvRixTQUFVLEdBQVksR0FDdEIsT0FBUSxFQUFNLFlBR1YsRUFDSixFQUFNLFFBQ0wsRUFBWSxVQUNYLENBQUMsRUFBWSxTQUFTLFdBQVcsTUFDakMsQ0FBQyxFQUFZLFNBQVMsV0FBVyxNQUNqQyxFQUFZLFNBQVMsUUFBUSxTQUFXLEVBSzVDLFNBQVksT0FDVixDQUFDLEdBQWMsRUFBWSxXQUFhLFFBQWEsRUFBWSxTQUFTLFFBQVEsbUJBQXFCLEdBR3JHLEVBQVksVUFDZCxHQUFZLE9BQVMsR0FBVSxFQUFZLFVBRXZDLENBQUMsR0FBYyxFQUFpQixHQUFLLEVBQVksUUFBUSxFQUFZLFlBQWMsSUFDckYsRUFBWSxLQUFLLEVBQVksV0FJMUIsSUFJVCxHQUFJLEdBQWtCLEVBQ3BCLE1BQU8sSUFBQSxZQUFZLFFBQVEsR0FHN0IsR0FBSSxDQUNGLE1BQU8sSUFBa0IsRUFBYSxFQUFRLFFBQzlDLENBR0EsTUFBTyxJQUFBLFlBQVksUUFBUSxJQWpEL0IsR0FBQSxXQUFBLEdBMkRBLFlBQ0UsRUFDQSxFQUNBLEVBQXNCLENBRXRCLE1BQU8sSUFBSSxJQUFBLFlBQTBCLFNBQUEsRUFBTyxDQUMxQyxNQUFBLElBQWdCLEdBQWEsS0FBSyxTQUFBLEVBQVcsQ0FDM0MsR0FBTSxHQUFTLEVBQU8sSUFBSSxTQUFBLEVBQUssQ0FDN0IsR0FBSSxFQUFNLFVBQVksRUFBWSxFQUFNLFVBQ3RDLEdBQUksQ0FDRixHQUFNLEdBQVMsRUFBWSxFQUFNLFVBQXFCLE1BQU07R0FFNUQsR0FBQSxrQkFBa0IsRUFBTyxFQUFPLFFBQ2hDLEVBS0osTUFBTyxLQUdULEVBQVEsT0FRZCxZQUFzQyxFQUFjLEVBQXFCLENBQ3ZFLEdBQU0sR0FBTyxFQUFNLE1BQVEsRUFBTSxZQUFZLEtBQ3ZDLEVBQVEsR0FBc0IsR0FDcEMsTUFBTyxJQUFJLElBQUEsWUFBdUIsU0FBQSxFQUFPLENBQ3ZDLE1BQUEsSUFBVyxFQUFPLEdBQVMsS0FBSyxTQUFBLEVBQU0sQ0FDcEMsR0FBTSxHQUFTLENBQ2IsV0FBWSxDQUNWLE9BQVEsR0FBc0IsSUFFaEMsS0FBTSxFQUNOLE1BQU8sRUFBTSxTQUVmLEVBQVEsT0FaZCxHQUFBLHNCQUFBLEdBb0JBLFlBQTJCLEVBQXNCLEVBQXFCLENBQ3BFLE1BQU8sSUFBSSxJQUFBLFlBQW1CLFNBQUEsRUFBTyxDQUNuQyxNQUFBLElBQXNCLEVBQU8sR0FBUyxLQUFLLFNBQUMsRUFBb0IsQ0FDOUQsRUFBUSxDQUNOLFVBQVcsQ0FDVCxPQUFRLENBQUMsVUFMbkIsR0FBQSxXQUFBLEdBZUEsWUFBc0MsRUFBbUIsQ0FDdkQsR0FBSSxDQUFDLEdBQVMsQ0FBQyxFQUFNLE9BQ25CLE1BQU8sR0FHVCxHQUFJLEdBQWEsRUFDWCxFQUFxQixFQUFXLEdBQUcsVUFBWSxHQUVyRCxNQUFJLEdBQW1CLFFBQVEsb0JBQXNCLElBQU0sRUFBbUIsUUFBUSxzQkFBd0IsS0FDNUcsR0FBYSxFQUFXLE1BQU0sSUFJekIsRUFBVyxVQWJwQixHQUFBLHNCQUFBLHFFQ25RYSxHQUFBLFNBQVcsc0dDRHhCLEdBQUEsS0FDQSxHQUFBLEtBWUEsR0FBQSxJQUNBLEdBQUEsUUFBQSxNQUdBLEdBQUEsUUFBQSxPQUVBLEdBQUEsS0FNTSxHQUVGLENBQ0YsTUFBTyxRQUNQLFlBQWEsY0FDYixRQUFTLFVBQ1QsV0FBWSxjQUlkLEdBQUEsVUFBQSxDQWlCRSxXQUEwQixFQUF5QixDQUF6QixLQUFBLFFBQUEsRUFOUCxLQUFBLFFBQW1DLEdBQUksSUFBQSxjQUFjLElBR3JELEtBQUEsWUFBb0MsR0FRaEQsS0FBQSxVQUF1QixTQUFBLEVBQUcsQ0FBSSxNQUFBLElBQUksSUFBQSxJQUFJLElBSjNDLEtBQUssS0FBTyxHQUFJLElBQUEsSUFBSSxFQUFRLElBQUssRUFBUSxVQUFXLEVBQVEsUUFTdkQsU0FBQSxVQUFBLFVBQVAsU0FBaUIsRUFBUSxDQUN2QixLQUFNLElBQUksSUFBQSxZQUFZLHlEQU1qQixFQUFBLFVBQUEsTUFBUCxTQUFhLEVBQWdCLENBQzNCLE1BQU8sTUFBSyxRQUFRLE1BQU0sSUFZbEIsRUFBQSxVQUFBLFVBQVYsU0FBb0IsRUFBcUIsU0FDakMsRUFBQSxRQUFBLElBQUUsRUFBQSxFQUFBLFNBQVUsRUFBQSxFQUFBLFdBQVksRUFBQSxFQUFBLFlBQ3hCLEVBQUEsS0FBQSxRQUFFLEVBQUEsRUFBQSxVQUFXLEVBQUEsRUFBQSxXQUNiLEVBQVEsSUFBYSxPQUFTLEdBQWEsRUFBYSxHQUFjLEdBQWEsR0FBZSxFQUV4RyxHQUFJLENBQUMsRUFDSCxNQUFPLEdBR0gsR0FBQSxHQUFBLEtBQUEsS0FBQSxTQUFFLEVBQUEsRUFBQSxLQUFNLEVBQUEsRUFBQSxTQUNkLE9BQWlCLEdBQUEsR0FBQSxTQUFBLEVBQVMsTUFBTSxNQUFJLEVBQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxLQUFBLEVBQUEsRUFBQSxPQUFFLENBQWpDLEdBQU0sR0FBRSxFQUFBLE1BQ1gsR0FBSSxFQUFLLFNBQVMsSUFBVSxHQUFJLElBQUksR0FBTyxTQUFTLEdBQ2xELHlHQUlKLE1BQU8sSUFJQyxFQUFBLFVBQUEsbUJBQVYsU0FBNkIsRUFBa0IsQ0FDN0MsR0FBTSxHQUFPLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FDUixLQUFLLEtBQUssa0JBQWtCLEdBQUEsU0FBVSxHQUFBLGNBQ3RDLEtBQUssUUFBUSxTQUVWLEVBQUEsRUFBQSxTQUFVLEVBQUEsRUFBQSxTQUFVLEVBQUEsRUFBQSxLQUFNLEVBQUEsRUFBQSxTQUc1QixFQUFPLEdBQUcsRUFFaEIsTUFBQSxJQUFBLFNBQUEsQ0FDRSxNQUFPLEtBQUssT0FDWixRQUFPLEVBQ1AsU0FBUSxFQUNSLE9BQVEsT0FDUixLQUFJLEVBQ0osS0FBSSxFQUNKLFNBQVEsR0FDSixLQUFLLFFBQVEsU0FBVyxDQUMxQixHQUFJLEdBQUcsYUFBYSxLQUFLLFFBQVEsWUFRN0IsRUFBQSxVQUFBLGVBQVYsU0FBeUIsRUFBOEIsQ0FDckQsR0FBTSxHQUFXLEdBQWlCLEdBQ2xDLE1BQU8sTUFBSyxZQUFZLElBQWEsS0FBSyxZQUFZLEtBTTlDLEVBQUEsVUFBQSxlQUFWLFNBQXlCLEVBQThCLENBQ3JELE1BQU8sTUFBSyxlQUFlLEdBQWUsR0FBSSxNQUFLLEtBQUssUUFNaEQsRUFBQSxVQUFBLGlCQUFWLFNBQTJCLEVBQXNDLGFBQ3pELEVBQU0sS0FBSyxNQUNYLEVBQVcsRUFBUSx3QkFDbkIsRUFBVyxFQUFRLGVBRXpCLEdBQUksRUFBVSxLQVdaLE9BQW9CLEdBQUEsR0FBQSxTQUFBLEVBQVMsT0FBTyxNQUFNLE1BQUksRUFBQSxFQUFBLE9BQUEsQ0FBQSxFQUFBLEtBQUEsRUFBQSxFQUFBLE9BQUUsQ0FBM0MsR0FBTSxHQUFLLEVBQUEsTUFDUixFQUFhLEVBQU0sTUFBTSxJQUFLLEdBQzlCLEVBQWMsU0FBUyxFQUFXLEdBQUksSUFDdEMsRUFBUyxDQUFDLE1BQU0sR0FBNkIsR0FBZCxHQUFvQixRQUN6RCxPQUF1QixHQUFBLEdBQUEsT0FBQSxHQUFBLFNBQUMsRUFBVyxJQUFNLEVBQVcsR0FBRyxNQUFNLE1BQVMsQ0FBQyxTQUFNLEVBQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxLQUFBLEVBQUEsRUFBQSxPQUFFLENBQTFFLEdBQU0sR0FBUSxFQUFBLE1BR1gsRUFBaUIsR0FBQSxTQUNqQixPQUFPLEtBQUssSUFBMEMsSUFBSSxTQUFBLEVBQUMsQ0FBSSxNQUFBLElBQWlCLEtBQUcsQ0FDdkYsUUFFRixBQUFJLEVBQWtCLFNBQVMsSUFBVyxNQUFLLFlBQVksR0FBWSxHQUFJLE1BQUssRUFBTSx5TUFHMUYsTUFBTyxXQUNFLEVBQ1QsWUFBSyxZQUFZLElBQU0sR0FBSSxNQUFLLEVBQU0sR0FBQSxzQkFBc0IsRUFBSyxJQUMxRCxHQUVULE1BQU8sSUFJTyxFQUFBLFVBQUEsTUFBaEIsU0FDRSxFQUNBLEVBQXFELHFHQUVyRCxHQUFJLENBQUMsS0FBSyxPQUNSLEtBQU0sSUFBSSxJQUFBLFlBQVksdUJBRXhCLE1BQUksSUFBbUIsS0FBSyxlQUFlLEVBQWMsTUFDdkQsQ0FBQSxFQUFPLFFBQVEsT0FBTyxDQUNwQixRQUFTLEVBQ1QsS0FBTSxFQUFjLEtBQ3BCLE9BQVEsaUJBQWlCLEVBQWMsS0FBSSx5QkFBeUIsS0FBSyxlQUN2RSxFQUFjLE1BQ2YsNkJBQ0QsT0FBUSxPQUlaLENBQUEsRUFBTyxLQUFLLFFBQVEsSUFDbEIsVUFBQSxDQUNFLE1BQUEsSUFBSSxTQUFrQixTQUFDLEVBQVMsRUFBTSxDQUNwQyxHQUFJLENBQUMsRUFBSyxPQUNSLEtBQU0sSUFBSSxJQUFBLFlBQVksdUJBRXhCLEdBQU0sR0FBVSxFQUFLLG1CQUFtQixFQUFLLFVBQVUsRUFBYyxNQUMvRCxFQUFNLEVBQUssT0FBTyxRQUFRLEVBQVMsU0FBQSxFQUFHLENBQzFDLEdBQU0sR0FBYSxFQUFJLFlBQWMsSUFDL0IsRUFBUyxHQUFBLE9BQU8sYUFBYSxHQUVuQyxFQUFJLFlBQVksUUFNaEIsR0FBSSxHQUFtQixFQUFJLFFBQVUsRUFBSSxRQUFRLGVBQWlCLEdBQ2xFLEVBQW9CLE1BQU0sUUFBUSxHQUFvQixFQUFpQixHQUFLLEVBRTVFLEdBQUksR0FBVyxFQUFJLFFBQVUsRUFBSSxRQUFRLHdCQUEwQixHQUNuRSxFQUFZLE1BQU0sUUFBUSxHQUFZLEVBQVMsR0FBSyxFQUVwRCxHQUFNLEdBQVUsQ0FDZCx1QkFBd0IsRUFDeEIsY0FBZSxHQUdYLEVBQVUsRUFBSyxpQkFBaUIsR0FRdEMsR0FQSSxHQUNGLEdBQUEsT0FBTyxLQUNMLFlBQVksRUFBYyxLQUFJLGlDQUFpQyxFQUFLLGVBQ2xFLEVBQWMsT0FJaEIsSUFBVyxHQUFBLE9BQU8sUUFDcEIsRUFBUSxDQUFFLE9BQU0sUUFDWCxDQUNMLEdBQUksR0FBbUIsZUFBZSxFQUFVLElBQ2hELEFBQUksRUFBSSxTQUFXLEVBQUksUUFBUSxtQkFDN0IsSUFBb0IsS0FBSyxFQUFJLFFBQVEsbUJBRXZDLEVBQU8sR0FBSSxJQUFBLFlBQVksSUFJekIsRUFBSSxHQUFHLE9BQVEsVUFBQSxJQUdmLEVBQUksR0FBRyxNQUFPLFVBQUEsTUFJaEIsRUFBSSxHQUFHLFFBQVMsR0FDaEIsRUFBSSxJQUFJLEVBQWMsZ0JBSWhDLEtBak9zQixHQUFBLGNBQUEsS0NuQ3RCLG1CQUlBLEdBQUksSUFBSSxJQUNKLEdBQUksR0FBSSxHQUNSLEdBQUksR0FBSSxHQUNSLEdBQUksR0FBSSxHQUNSLEdBQUksR0FBSSxFQUNSLEdBQUksR0FBSSxPQWdCWixHQUFPLFFBQVUsU0FBUyxFQUFLLEVBQVMsQ0FDdEMsRUFBVSxHQUFXLEdBQ3JCLEdBQUksR0FBTyxNQUFPLEdBQ2xCLEdBQUksSUFBUyxVQUFZLEVBQUksT0FBUyxFQUNwQyxNQUFPLElBQU0sR0FDUixHQUFJLElBQVMsVUFBWSxTQUFTLEdBQ3ZDLE1BQU8sR0FBUSxLQUFPLEdBQVEsR0FBTyxHQUFTLEdBRWhELEtBQU0sSUFBSSxPQUNSLHdEQUNFLEtBQUssVUFBVSxLQVlyQixZQUFlLEVBQUssQ0FFbEIsR0FEQSxFQUFNLE9BQU8sR0FDVCxJQUFJLE9BQVMsS0FHakIsSUFBSSxHQUFRLG1JQUFtSSxLQUM3SSxHQUVGLEdBQUksRUFBQyxFQUdMLElBQUksR0FBSSxXQUFXLEVBQU0sSUFDckIsRUFBUSxHQUFNLElBQU0sTUFBTSxjQUM5QixPQUFRLE9BQ0QsWUFDQSxXQUNBLFVBQ0EsU0FDQSxJQUNILE1BQU8sR0FBSSxPQUNSLFlBQ0EsV0FDQSxJQUNILE1BQU8sR0FBSSxPQUNSLFdBQ0EsVUFDQSxJQUNILE1BQU8sR0FBSSxPQUNSLFlBQ0EsV0FDQSxVQUNBLFNBQ0EsSUFDSCxNQUFPLEdBQUksT0FDUixjQUNBLGFBQ0EsV0FDQSxVQUNBLElBQ0gsTUFBTyxHQUFJLE9BQ1IsY0FDQSxhQUNBLFdBQ0EsVUFDQSxJQUNILE1BQU8sR0FBSSxPQUNSLG1CQUNBLGtCQUNBLFlBQ0EsV0FDQSxLQUNILE1BQU8sV0FFUCxVQVlOLFlBQWtCLEVBQUksQ0FDcEIsR0FBSSxHQUFRLEtBQUssSUFBSSxHQUNyQixNQUFJLElBQVMsR0FDSixLQUFLLE1BQU0sRUFBSyxJQUFLLElBRTFCLEdBQVMsR0FDSixLQUFLLE1BQU0sRUFBSyxJQUFLLElBRTFCLEdBQVMsR0FDSixLQUFLLE1BQU0sRUFBSyxJQUFLLElBRTFCLEdBQVMsR0FDSixLQUFLLE1BQU0sRUFBSyxJQUFLLElBRXZCLEVBQUssS0FXZCxZQUFpQixFQUFJLENBQ25CLEdBQUksR0FBUSxLQUFLLElBQUksR0FDckIsTUFBSSxJQUFTLEdBQ0osR0FBTyxFQUFJLEVBQU8sR0FBRyxPQUUxQixHQUFTLEdBQ0osR0FBTyxFQUFJLEVBQU8sR0FBRyxRQUUxQixHQUFTLEdBQ0osR0FBTyxFQUFJLEVBQU8sR0FBRyxVQUUxQixHQUFTLEdBQ0osR0FBTyxFQUFJLEVBQU8sR0FBRyxVQUV2QixFQUFLLE1BT2QsWUFBZ0IsRUFBSSxFQUFPLEVBQUcsRUFBTSxDQUNsQyxHQUFJLEdBQVcsR0FBUyxFQUFJLElBQzVCLE1BQU8sTUFBSyxNQUFNLEVBQUssR0FBSyxJQUFNLEVBQVEsR0FBVyxJQUFNLE9DaEs3RCxtQkFNQSxZQUFlLEVBQUssQ0FDbkIsRUFBWSxNQUFRLEVBQ3BCLEVBQVksUUFBVSxFQUN0QixFQUFZLE9BQVMsRUFDckIsRUFBWSxRQUFVLEVBQ3RCLEVBQVksT0FBUyxFQUNyQixFQUFZLFFBQVUsRUFDdEIsRUFBWSxTQUFXLEtBQ3ZCLEVBQVksUUFBVSxFQUV0QixPQUFPLEtBQUssR0FBSyxRQUFRLEdBQU8sQ0FDL0IsRUFBWSxHQUFPLEVBQUksS0FPeEIsRUFBWSxNQUFRLEdBQ3BCLEVBQVksTUFBUSxHQU9wQixFQUFZLFdBQWEsR0FRekIsV0FBcUIsRUFBVyxDQUMvQixHQUFJLEdBQU8sRUFFWCxPQUFTLEdBQUksRUFBRyxFQUFJLEVBQVUsT0FBUSxJQUNyQyxFQUFTLElBQVEsR0FBSyxFQUFRLEVBQVUsV0FBVyxHQUNuRCxHQUFRLEVBR1QsTUFBTyxHQUFZLE9BQU8sS0FBSyxJQUFJLEdBQVEsRUFBWSxPQUFPLFFBRS9ELEVBQVksWUFBYyxFQVMxQixXQUFxQixFQUFXLENBQy9CLEdBQUksR0FDQSxFQUFpQixLQUNqQixFQUNBLEVBRUosY0FBa0IsRUFBTSxDQUV2QixHQUFJLENBQUMsRUFBTSxRQUNWLE9BR0QsR0FBTSxHQUFPLEVBR1AsRUFBTyxPQUFPLEdBQUksT0FDbEIsRUFBSyxFQUFRLElBQVksR0FDL0IsRUFBSyxLQUFPLEVBQ1osRUFBSyxLQUFPLEVBQ1osRUFBSyxLQUFPLEVBQ1osRUFBVyxFQUVYLEVBQUssR0FBSyxFQUFZLE9BQU8sRUFBSyxJQUU5QixNQUFPLEdBQUssSUFBTyxVQUV0QixFQUFLLFFBQVEsTUFJZCxHQUFJLElBQVEsRUFDWixFQUFLLEdBQUssRUFBSyxHQUFHLFFBQVEsZ0JBQWlCLENBQUMsRUFBTyxJQUFXLENBRTdELEdBQUksSUFBVSxLQUNiLE1BQU8sSUFFUixLQUNBLEdBQU0sR0FBWSxFQUFZLFdBQVcsR0FDekMsR0FBSSxNQUFPLElBQWMsV0FBWSxDQUNwQyxHQUFNLEdBQU0sRUFBSyxJQUNqQixFQUFRLEVBQVUsS0FBSyxFQUFNLEdBRzdCLEVBQUssT0FBTyxHQUFPLEdBQ25CLEtBRUQsTUFBTyxLQUlSLEVBQVksV0FBVyxLQUFLLEVBQU0sR0FHbEMsQUFEYyxHQUFLLEtBQU8sRUFBWSxLQUNoQyxNQUFNLEVBQU0sR0FHbkIsU0FBTSxVQUFZLEVBQ2xCLEVBQU0sVUFBWSxFQUFZLFlBQzlCLEVBQU0sTUFBUSxFQUFZLFlBQVksR0FDdEMsRUFBTSxPQUFTLEVBQ2YsRUFBTSxRQUFVLEVBQVksUUFFNUIsT0FBTyxlQUFlLEVBQU8sVUFBVyxDQUN2QyxXQUFZLEdBQ1osYUFBYyxHQUNkLElBQUssSUFDQSxJQUFtQixLQUNmLEVBRUosS0FBb0IsRUFBWSxZQUNuQyxHQUFrQixFQUFZLFdBQzlCLEVBQWUsRUFBWSxRQUFRLElBRzdCLEdBRVIsSUFBSyxHQUFLLENBQ1QsRUFBaUIsS0FLZixNQUFPLEdBQVksTUFBUyxZQUMvQixFQUFZLEtBQUssR0FHWCxFQUdSLFdBQWdCLEVBQVcsRUFBVyxDQUNyQyxHQUFNLEdBQVcsRUFBWSxLQUFLLFVBQWEsT0FBTyxJQUFjLFlBQWMsSUFBTSxHQUFhLEdBQ3JHLFNBQVMsSUFBTSxLQUFLLElBQ2IsRUFVUixXQUFnQixFQUFZLENBQzNCLEVBQVksS0FBSyxHQUNqQixFQUFZLFdBQWEsRUFFekIsRUFBWSxNQUFRLEdBQ3BCLEVBQVksTUFBUSxHQUVwQixHQUFJLEdBQ0UsRUFBUyxPQUFPLElBQWUsU0FBVyxFQUFhLElBQUksTUFBTSxVQUNqRSxFQUFNLEVBQU0sT0FFbEIsSUFBSyxFQUFJLEVBQUcsRUFBSSxFQUFLLElBQ3BCLEFBQUksQ0FBQyxFQUFNLElBS1gsR0FBYSxFQUFNLEdBQUcsUUFBUSxNQUFPLE9BRXJDLEFBQUksRUFBVyxLQUFPLElBQ3JCLEVBQVksTUFBTSxLQUFLLEdBQUksUUFBTyxJQUFNLEVBQVcsT0FBTyxHQUFLLE1BRS9ELEVBQVksTUFBTSxLQUFLLEdBQUksUUFBTyxJQUFNLEVBQWEsT0FXeEQsWUFBbUIsQ0FDbEIsR0FBTSxHQUFhLENBQ2xCLEdBQUcsRUFBWSxNQUFNLElBQUksR0FDekIsR0FBRyxFQUFZLE1BQU0sSUFBSSxHQUFhLElBQUksR0FBYSxJQUFNLElBQzVELEtBQUssS0FDUCxTQUFZLE9BQU8sSUFDWixFQVVSLFdBQWlCLEVBQU0sQ0FDdEIsR0FBSSxFQUFLLEVBQUssT0FBUyxLQUFPLElBQzdCLE1BQU8sR0FHUixHQUFJLEdBQ0EsRUFFSixJQUFLLEVBQUksRUFBRyxFQUFNLEVBQVksTUFBTSxPQUFRLEVBQUksRUFBSyxJQUNwRCxHQUFJLEVBQVksTUFBTSxHQUFHLEtBQUssR0FDN0IsTUFBTyxHQUlULElBQUssRUFBSSxFQUFHLEVBQU0sRUFBWSxNQUFNLE9BQVEsRUFBSSxFQUFLLElBQ3BELEdBQUksRUFBWSxNQUFNLEdBQUcsS0FBSyxHQUM3QixNQUFPLEdBSVQsTUFBTyxHQVVSLFdBQXFCLEVBQVEsQ0FDNUIsTUFBTyxHQUFPLFdBQ1osVUFBVSxFQUFHLEVBQU8sV0FBVyxPQUFTLEdBQ3hDLFFBQVEsVUFBVyxLQVV0QixXQUFnQixFQUFLLENBQ3BCLE1BQUksYUFBZSxPQUNYLEVBQUksT0FBUyxFQUFJLFFBRWxCLEVBT1IsWUFBbUIsQ0FDbEIsUUFBUSxLQUFLLHlJQUdkLFNBQVksT0FBTyxFQUFZLFFBRXhCLEVBR1IsR0FBTyxRQUFVLEtDalJqQixtQkFNQSxHQUFRLFdBQWEsR0FDckIsR0FBUSxLQUFPLEdBQ2YsR0FBUSxLQUFPLEdBQ2YsR0FBUSxVQUFZLEdBQ3BCLEdBQVEsUUFBVSxLQUNsQixHQUFRLFFBQVcsS0FBTSxDQUN4QixHQUFJLEdBQVMsR0FFYixNQUFPLElBQU0sQ0FDWixBQUFLLEdBQ0osR0FBUyxHQUNULFFBQVEsS0FBSywrSUFTaEIsR0FBUSxPQUFTLENBQ2hCLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFVBQ0EsVUFDQSxVQUNBLFdBWUQsYUFBcUIsQ0FJcEIsTUFBSSxPQUFPLFNBQVcsYUFBZSxPQUFPLFNBQVksUUFBTyxRQUFRLE9BQVMsWUFBYyxPQUFPLFFBQVEsUUFDckcsR0FJSixNQUFPLFlBQWMsYUFBZSxVQUFVLFdBQWEsVUFBVSxVQUFVLGNBQWMsTUFBTSx5QkFDL0YsR0FLQSxNQUFPLFdBQWEsYUFBZSxTQUFTLGlCQUFtQixTQUFTLGdCQUFnQixPQUFTLFNBQVMsZ0JBQWdCLE1BQU0sa0JBRXRJLE1BQU8sU0FBVyxhQUFlLE9BQU8sU0FBWSxRQUFPLFFBQVEsU0FBWSxPQUFPLFFBQVEsV0FBYSxPQUFPLFFBQVEsUUFHMUgsTUFBTyxZQUFjLGFBQWUsVUFBVSxXQUFhLFVBQVUsVUFBVSxjQUFjLE1BQU0sbUJBQXFCLFNBQVMsT0FBTyxHQUFJLEtBQU8sSUFFbkosTUFBTyxZQUFjLGFBQWUsVUFBVSxXQUFhLFVBQVUsVUFBVSxjQUFjLE1BQU0sc0JBU3RHLFlBQW9CLEVBQU0sQ0FRekIsR0FQQSxFQUFLLEdBQU0sTUFBSyxVQUFZLEtBQU8sSUFDbEMsS0FBSyxVQUNKLE1BQUssVUFBWSxNQUFRLEtBQzFCLEVBQUssR0FDSixNQUFLLFVBQVksTUFBUSxLQUMxQixJQUFNLEdBQU8sUUFBUSxTQUFTLEtBQUssTUFFaEMsQ0FBQyxLQUFLLFVBQ1QsT0FHRCxHQUFNLEdBQUksVUFBWSxLQUFLLE1BQzNCLEVBQUssT0FBTyxFQUFHLEVBQUcsRUFBRyxrQkFLckIsR0FBSSxHQUFRLEVBQ1IsRUFBUSxFQUNaLEVBQUssR0FBRyxRQUFRLGNBQWUsR0FBUyxDQUN2QyxBQUFJLElBQVUsTUFHZCxLQUNJLElBQVUsTUFHYixHQUFRLE1BSVYsRUFBSyxPQUFPLEVBQU8sRUFBRyxHQVd2QixHQUFRLElBQU0sUUFBUSxPQUFTLFFBQVEsS0FBUSxLQUFNLElBUXJELFlBQWMsRUFBWSxDQUN6QixHQUFJLENBQ0gsQUFBSSxFQUNILEdBQVEsUUFBUSxRQUFRLFFBQVMsR0FFakMsR0FBUSxRQUFRLFdBQVcsY0FFM0IsR0FZSCxhQUFnQixDQUNmLEdBQUksR0FDSixHQUFJLENBQ0gsRUFBSSxHQUFRLFFBQVEsUUFBUSxjQUMzQixFQU1GLE1BQUksQ0FBQyxHQUFLLE1BQU8sVUFBWSxhQUFlLE9BQVMsVUFDcEQsR0FBSSxRQUFRLElBQUksT0FHVixFQWNSLGFBQXdCLENBQ3ZCLEdBQUksQ0FHSCxNQUFPLG1CQUNOLEdBTUgsR0FBTyxRQUFVLEtBQW9CLElBRXJDLEdBQU0sQ0FBQyxlQUFjLEdBQU8sUUFNNUIsR0FBVyxFQUFJLFNBQVUsRUFBRyxDQUMzQixHQUFJLENBQ0gsTUFBTyxNQUFLLFVBQVUsU0FDZCxFQUFQLENBQ0QsTUFBTywrQkFBaUMsRUFBTSxZQzFRaEQsZ0NBRUEsR0FBTyxRQUFVLENBQUMsRUFBTSxFQUFPLFFBQVEsT0FBUyxDQUMvQyxHQUFNLEdBQVMsRUFBSyxXQUFXLEtBQU8sR0FBTSxFQUFLLFNBQVcsRUFBSSxJQUFNLEtBQ2hFLEVBQVcsRUFBSyxRQUFRLEVBQVMsR0FDakMsRUFBcUIsRUFBSyxRQUFRLE1BQ3hDLE1BQU8sS0FBYSxJQUFPLEtBQXVCLElBQU0sRUFBVyxNQ05wRSxnQ0FDQSxHQUFNLElBQUssUUFBUSxNQUNiLEdBQU0sUUFBUSxPQUNkLEdBQVUsS0FFVixDQUFDLFFBQU8sUUFFVixHQUNKLEFBQUksR0FBUSxhQUNYLEdBQVEsY0FDUixHQUFRLGdCQUNSLEdBQVEsZUFDUixHQUFhLEVBQ0gsSUFBUSxVQUNsQixHQUFRLFdBQ1IsR0FBUSxlQUNSLEdBQVEsa0JBQ1IsSUFBYSxHQUdkLEFBQUksZUFBaUIsS0FDcEIsQ0FBSSxHQUFJLGNBQWdCLE9BQ3ZCLEdBQWEsRUFDUCxBQUFJLEdBQUksY0FBZ0IsUUFDOUIsR0FBYSxFQUViLEdBQWEsR0FBSSxZQUFZLFNBQVcsRUFBSSxFQUFJLEtBQUssSUFBSSxTQUFTLEdBQUksWUFBYSxJQUFLLElBSTFGLFlBQXdCLEVBQU8sQ0FDOUIsTUFBSSxLQUFVLEVBQ04sR0FHRCxDQUNOLFFBQ0EsU0FBVSxHQUNWLE9BQVEsR0FBUyxFQUNqQixPQUFRLEdBQVMsR0FJbkIsWUFBdUIsRUFBWSxFQUFhLENBQy9DLEdBQUksS0FBZSxFQUNsQixNQUFPLEdBR1IsR0FBSSxHQUFRLGNBQ1gsR0FBUSxlQUNSLEdBQVEsbUJBQ1IsTUFBTyxHQUdSLEdBQUksR0FBUSxhQUNYLE1BQU8sR0FHUixHQUFJLEdBQWMsQ0FBQyxHQUFlLEtBQWUsT0FDaEQsTUFBTyxHQUdSLEdBQU0sR0FBTSxJQUFjLEVBRTFCLEdBQUksR0FBSSxPQUFTLE9BQ2hCLE1BQU8sR0FHUixHQUFJLFFBQVEsV0FBYSxRQUFTLENBR2pDLEdBQU0sR0FBWSxHQUFHLFVBQVUsTUFBTSxLQUNyQyxNQUNDLFFBQU8sRUFBVSxLQUFPLElBQ3hCLE9BQU8sRUFBVSxLQUFPLE1BRWpCLE9BQU8sRUFBVSxLQUFPLE1BQVEsRUFBSSxFQUdyQyxFQUdSLEdBQUksTUFBUSxJQUNYLE1BQUksQ0FBQyxTQUFVLFdBQVksV0FBWSxZQUFhLGlCQUFrQixhQUFhLEtBQUssR0FBUSxJQUFRLE1BQVEsR0FBSSxVQUFZLFdBQ3hILEVBR0QsRUFHUixHQUFJLG9CQUFzQixJQUN6QixNQUFPLGdDQUFnQyxLQUFLLEdBQUksa0JBQW9CLEVBQUksRUFHekUsR0FBSSxHQUFJLFlBQWMsWUFDckIsTUFBTyxHQUdSLEdBQUksZ0JBQWtCLElBQUssQ0FDMUIsR0FBTSxHQUFVLFNBQVUsSUFBSSxzQkFBd0IsSUFBSSxNQUFNLEtBQUssR0FBSSxJQUV6RSxPQUFRLEdBQUksa0JBQ04sWUFDSixNQUFPLElBQVcsRUFBSSxFQUFJLE1BQ3RCLGlCQUNKLE1BQU8sSUFLVixNQUFJLGlCQUFpQixLQUFLLEdBQUksTUFDdEIsRUFHSiw4REFBOEQsS0FBSyxHQUFJLE9BSXZFLGFBQWUsSUFDWCxFQUdELEVBR1IsWUFBeUIsRUFBUSxDQUNoQyxHQUFNLEdBQVEsR0FBYyxFQUFRLEdBQVUsRUFBTyxPQUNyRCxNQUFPLElBQWUsR0FHdkIsR0FBTyxRQUFVLENBQ2hCLGNBQWUsR0FDZixPQUFRLEdBQWUsR0FBYyxHQUFNLEdBQUksT0FBTyxLQUN0RCxPQUFRLEdBQWUsR0FBYyxHQUFNLEdBQUksT0FBTyxRQ3JJdkQsbUJBSUEsR0FBTSxJQUFNLFFBQVEsT0FDZCxHQUFPLFFBQVEsUUFNckIsR0FBUSxLQUFPLEdBQ2YsR0FBUSxJQUFNLEdBQ2QsR0FBUSxXQUFhLEdBQ3JCLEdBQVEsS0FBTyxHQUNmLEdBQVEsS0FBTyxHQUNmLEdBQVEsVUFBWSxHQUNwQixHQUFRLFFBQVUsR0FBSyxVQUN0QixJQUFNLEdBQ04seUlBT0QsR0FBUSxPQUFTLENBQUMsRUFBRyxFQUFHLEVBQUcsRUFBRyxFQUFHLEdBRWpDLEdBQUksQ0FHSCxHQUFNLEdBQWdCLEtBRXRCLEFBQUksR0FBa0IsR0FBYyxRQUFVLEdBQWUsT0FBUyxHQUNyRSxJQUFRLE9BQVMsQ0FDaEIsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLEdBQ0EsR0FDQSxHQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsSUFDQSxJQUNBLElBQ0EsV0FHRCxFQVVGLEdBQVEsWUFBYyxPQUFPLEtBQUssUUFBUSxLQUFLLE9BQU8sR0FDOUMsV0FBVyxLQUFLLElBQ3JCLE9BQU8sQ0FBQyxFQUFLLElBQVEsQ0FFdkIsR0FBTSxHQUFPLEVBQ1gsVUFBVSxHQUNWLGNBQ0EsUUFBUSxZQUFhLENBQUMsRUFBRyxJQUNsQixFQUFFLGVBSVAsRUFBTSxRQUFRLElBQUksR0FDdEIsTUFBSSwyQkFBMkIsS0FBSyxHQUNuQyxFQUFNLEdBQ0EsQUFBSSw2QkFBNkIsS0FBSyxHQUM1QyxFQUFNLEdBQ0EsQUFBSSxJQUFRLE9BQ2xCLEVBQU0sS0FFTixFQUFNLE9BQU8sR0FHZCxFQUFJLEdBQVEsRUFDTCxHQUNMLElBTUgsYUFBcUIsQ0FDcEIsTUFBTyxVQUFZLElBQVEsWUFDMUIsUUFBUSxHQUFRLFlBQVksUUFDNUIsR0FBSSxPQUFPLFFBQVEsT0FBTyxJQVM1QixZQUFvQixFQUFNLENBQ3pCLEdBQU0sQ0FBQyxVQUFXLEVBQU0sYUFBYSxLQUVyQyxHQUFJLEVBQVcsQ0FDZCxHQUFNLEdBQUksS0FBSyxNQUNULEVBQVksU0FBYyxHQUFJLEVBQUksRUFBSSxPQUFTLEdBQy9DLEVBQVMsS0FBSyxPQUFlLFlBRW5DLEVBQUssR0FBSyxFQUFTLEVBQUssR0FBRyxNQUFNO0FBQUEsR0FBTSxLQUFLO0FBQUEsRUFBTyxHQUNuRCxFQUFLLEtBQUssRUFBWSxLQUFPLEdBQU8sUUFBUSxTQUFTLEtBQUssTUFBUSxlQUVsRSxHQUFLLEdBQUssS0FBWSxFQUFPLElBQU0sRUFBSyxHQUkxQyxhQUFtQixDQUNsQixNQUFJLElBQVEsWUFBWSxTQUNoQixHQUVELEdBQUksUUFBTyxjQUFnQixJQU9uQyxlQUFnQixFQUFNLENBQ3JCLE1BQU8sU0FBUSxPQUFPLE1BQU0sR0FBSyxPQUFPLEdBQUcsR0FBUTtBQUFBLEdBU3BELFlBQWMsRUFBWSxDQUN6QixBQUFJLEVBQ0gsUUFBUSxJQUFJLE1BQVEsRUFJcEIsTUFBTyxTQUFRLElBQUksTUFXckIsYUFBZ0IsQ0FDZixNQUFPLFNBQVEsSUFBSSxNQVVwQixZQUFjLEVBQU8sQ0FDcEIsRUFBTSxZQUFjLEdBRXBCLEdBQU0sR0FBTyxPQUFPLEtBQUssR0FBUSxhQUNqQyxPQUFTLEdBQUksRUFBRyxFQUFJLEVBQUssT0FBUSxJQUNoQyxFQUFNLFlBQVksRUFBSyxJQUFNLEdBQVEsWUFBWSxFQUFLLElBSXhELEdBQU8sUUFBVSxLQUFvQixJQUVyQyxHQUFNLENBQUMsZUFBYyxHQUFPLFFBTTVCLEdBQVcsRUFBSSxTQUFVLEVBQUcsQ0FDM0IsWUFBSyxZQUFZLE9BQVMsS0FBSyxVQUN4QixHQUFLLFFBQVEsRUFBRyxLQUFLLGFBQzFCLE1BQU07QUFBQSxHQUNOLElBQUksR0FBTyxFQUFJLFFBQ2YsS0FBSyxNQU9SLEdBQVcsRUFBSSxTQUFVLEVBQUcsQ0FDM0IsWUFBSyxZQUFZLE9BQVMsS0FBSyxVQUN4QixHQUFLLFFBQVEsRUFBRyxLQUFLLGdCQ3JRN0IsbUJBS0EsQUFBSSxNQUFPLFVBQVksYUFBZSxRQUFRLE9BQVMsWUFBYyxRQUFRLFVBQVksSUFBUSxRQUFRLE9BQ3hHLEdBQU8sUUFBVSxLQUVqQixHQUFPLFFBQVUsb0ZDT2xCLFlBQWtDLEVBQWtCLENBQ25ELE1BQU8sVUFBc0IsRUFBb0IsRUFBb0IsQ0FDcEUsTUFBTyxJQUFJLFNBQVEsQ0FBQyxFQUFTLElBQVUsQ0FDdEMsRUFBRyxLQUNGLEtBQ0EsRUFDQSxFQUNBLENBQUMsRUFBK0IsSUFBNkIsQ0FDNUQsQUFBSSxFQUNILEVBQU8sR0FFUCxFQUFRLFFBWGQsR0FBQSxRQUFBLHNIQ1hBLEdBQUEsUUFBQSxVQUNBLEdBQUEsR0FBQSxNQUNBLEdBQUEsR0FBQSxNQUVNLEdBQVEsR0FBQSxRQUFZLGNBRTFCLFlBQWlCLEVBQU0sQ0FDdEIsTUFBTyxTQUFRLElBQU0sTUFBTyxHQUFFLFlBQWUsV0FHOUMsYUFBeUIsQ0FDeEIsR0FBTSxDQUFFLFNBQVUsR0FBSSxPQUN0QixNQUFJLE9BQU8sSUFBVSxTQUFpQixHQUMvQixFQUFNLE1BQU07R0FBTSxLQUFLLEdBQUssRUFBRSxRQUFRLGdCQUFrQixJQUFPLEVBQUUsUUFBUSxpQkFBbUIsSUFRcEcsWUFDQyxFQUNBLEVBQStCLENBRS9CLE1BQU8sSUFBSSxJQUFZLE1BQU0sRUFBVSxHQUd4QyxBQUFBLFVBQVUsRUFBVyxDQTBEcEIsZUFBMkIsSUFBQSxZQUFZLENBbUJ0QyxZQUNDLEVBQ0EsRUFBZ0MsQ0FFaEMsUUFFQSxHQUFJLEdBQU8sRUFDWCxBQUFJLE1BQU8sSUFBYSxXQUN2QixLQUFLLFNBQVcsRUFDTixHQUNWLEdBQU8sR0FJUixLQUFLLFFBQVUsS0FDWCxHQUFRLE1BQU8sR0FBSyxTQUFZLFVBQ25DLE1BQUssUUFBVSxFQUFLLFNBS3JCLEtBQUssZUFBaUIsRUFDdEIsS0FBSyxXQUFhLEVBQ2xCLEtBQUssZ0JBQWtCLElBQ3ZCLEtBQUssUUFBVSxHQUNmLEtBQUssWUFBYyxHQUNuQixLQUFLLFNBQVcsR0FDaEIsS0FBSyxRQUFVLE1BR1osY0FBVyxDQUNkLE1BQUksT0FBTyxNQUFLLHFCQUF3QixTQUNoQyxLQUFLLG9CQUVOLEtBQXFCLElBQU0sTUFHL0IsYUFBWSxFQUFTLENBQ3hCLEtBQUssb0JBQXNCLEtBR3hCLFdBQVEsQ0FDWCxNQUFJLE9BQU8sTUFBSyxrQkFBcUIsU0FDN0IsS0FBSyxpQkFFTixLQUFxQixTQUFXLFdBR3BDLFVBQVMsRUFBUyxDQUNyQixLQUFLLGlCQUFtQixFQWN6QixTQUNDLEVBQ0EsRUFDQSxFQUFzQyxDQUt0QyxLQUFNLElBQUksT0FDVCwyRkFVRixXQUFXLEVBQW9CLEVBQXFCLENBQ25ELEdBQU0sR0FBSSxPQUFBLE9BQUEsR0FBd0IsR0FFbEMsQUFBSSxNQUFPLEdBQUssZ0JBQW1CLFdBQ2xDLEdBQUssZUFBaUIsTUFHbkIsRUFBSyxNQUFRLE1BQ2hCLEdBQUssS0FBTyxhQUdULEVBQUssTUFBUSxNQUNoQixHQUFLLEtBQU8sRUFBSyxlQUFpQixJQUFNLElBR3JDLEVBQUssVUFBWSxNQUNwQixHQUFLLFNBQVcsRUFBSyxlQUFpQixTQUFXLFNBRzlDLEVBQUssTUFBUSxFQUFLLE1BS3JCLE1BQU8sR0FBSyxLQUdiLE1BQU8sR0FBSyxNQUNaLE1BQU8sR0FBSyxTQUNaLE1BQU8sR0FBSyxjQUNaLE1BQU8sR0FBSyxZQUNaLE1BQU8sR0FBSyxpQkFJWixFQUFJLE1BQVEsR0FDWixFQUFJLGdCQUFrQixHQUV0QixHQUFJLEdBQVcsR0FDWCxFQUFrRCxLQUNoRCxFQUFZLEVBQUssU0FBVyxLQUFLLFFBRWpDLEVBQVUsQUFBQyxHQUE4QixDQUM5QyxBQUFJLEVBQUksV0FDUixHQUFJLEtBQUssUUFBUyxHQUdsQixFQUFJLFVBQVksS0FHWCxFQUFZLElBQUssQ0FDdEIsRUFBWSxLQUNaLEVBQVcsR0FDWCxHQUFNLEdBQTZCLEdBQUksT0FDdEMsc0RBQXNELE9BRXZELEVBQUksS0FBTyxXQUNYLEVBQVEsSUFHSCxFQUFnQixBQUFDLEdBQThCLENBQ3BELEFBQUksR0FDQSxLQUFjLE1BQ2pCLGNBQWEsR0FDYixFQUFZLE1BRWIsRUFBUSxLQUdILEVBQVcsQUFBQyxHQUErQixDQUNoRCxHQUFJLEVBQVUsT0FNZCxHQUxJLEdBQWEsTUFDaEIsY0FBYSxHQUNiLEVBQVksTUFHVCxHQUFRLEdBQVMsQ0FJcEIsR0FDQyw4Q0FDQSxFQUFPLFlBQVksTUFFbkIsRUFBNkIsV0FBVyxFQUFLLEdBQzlDLE9BR0QsR0FBSSxFQUFRLENBQ1gsRUFBTyxLQUFLLE9BQVEsSUFBSyxDQUN4QixLQUFLLFdBQVcsRUFBc0IsS0FFdkMsRUFBSSxTQUFTLEdBQ2IsT0FHRCxHQUFNLEdBQU0sR0FBSSxPQUNmLHFEQUFxRCxFQUFJLFVBQVUsRUFBSSxVQUV4RSxFQUFRLElBR1QsR0FBSSxNQUFPLE1BQUssVUFBYSxXQUFZLENBQ3hDLEVBQVEsR0FBSSxPQUFNLDhCQUNsQixPQUdELEFBQUssS0FBSyxxQkFDVCxDQUFJLEtBQUssU0FBUyxRQUFVLEVBQzNCLElBQU0sa0RBQ04sS0FBSyxvQkFBc0IsR0FBQSxRQUFVLEtBQUssV0FFMUMsS0FBSyxvQkFBc0IsS0FBSyxVQUk5QixNQUFPLElBQWMsVUFBWSxFQUFZLEdBQ2hELEdBQVksV0FBVyxFQUFXLElBRy9CLFFBQVUsSUFBUSxNQUFPLEdBQUssTUFBUyxVQUMxQyxHQUFLLEtBQU8sT0FBTyxFQUFLLE9BR3pCLEdBQUksQ0FDSCxHQUNDLHNDQUNBLEVBQUssU0FDTCxHQUFHLEVBQUksVUFBVSxFQUFJLFFBRXRCLFFBQVEsUUFBUSxLQUFLLG9CQUFvQixFQUFLLElBQU8sS0FDcEQsRUFDQSxTQUVPLEVBQVAsQ0FDRCxRQUFRLE9BQU8sR0FBSyxNQUFNLElBSTVCLFdBQVcsRUFBb0IsRUFBa0IsQ0FDaEQsR0FBTSx1QkFBd0IsRUFBTyxZQUFZLEtBQU0sR0FDdkQsRUFBTyxVQUdSLFNBQU8sQ0FDTixHQUFNLHNCQUF1QixLQUFLLFlBQVksT0F0UG5DLEVBQUEsTUFBSyxFQTJQbEIsRUFBWSxVQUFZLEVBQVksTUFBTSxZQXJUakMsSUFBQSxJQUFXLEtBd1RyQixHQUFBLFFBQVMsbUtDeFZULEdBQUEsSUFBQSxHQUFBLE1BR00sR0FBUSxHQUFBLFFBQVksMENBTzFCLFlBQ0MsRUFBZ0IsQ0FFaEIsTUFBTyxJQUFJLFNBQVEsQ0FBQyxFQUFTLElBQVUsQ0FLdEMsR0FBSSxHQUFnQixFQUNkLEVBQW9CLEdBRTFCLFlBQWEsQ0FDWixHQUFNLEdBQUksRUFBTyxPQUNqQixBQUFJLEVBQUcsRUFBTyxHQUNULEVBQU8sS0FBSyxXQUFZLEdBRzlCLFlBQWdCLENBQ2YsRUFBTyxlQUFlLE1BQU8sR0FDN0IsRUFBTyxlQUFlLFFBQVMsR0FDL0IsRUFBTyxlQUFlLFFBQVMsR0FDL0IsRUFBTyxlQUFlLFdBQVksR0FHbkMsV0FBaUIsRUFBVyxDQUMzQixHQUFNLHVCQUF3QixHQUcvQixZQUFjLENBQ2IsR0FBTSxTQUdQLFdBQWlCLEVBQVUsQ0FDMUIsSUFDQSxHQUFNLGFBQWMsR0FDcEIsRUFBTyxHQUdSLFdBQWdCLEVBQVMsQ0FDeEIsRUFBUSxLQUFLLEdBQ2IsR0FBaUIsRUFBRSxPQUVuQixHQUFNLEdBQVcsT0FBTyxPQUFPLEVBQVMsR0FHeEMsR0FBSSxBQUZpQixFQUFTLFFBQVE7O0tBRWpCLEdBQUksQ0FFeEIsR0FBTSxnREFDTixJQUNBLE9BR0QsR0FBTSxHQUFZLEVBQVMsU0FDMUIsUUFDQSxFQUNBLEVBQVMsUUFBUTtJQUVaLEVBQWEsQ0FBQyxFQUFVLE1BQU0sS0FBSyxHQUN6QyxHQUFNLGdDQUFpQyxHQUN2QyxFQUFRLENBQ1AsYUFDQSxhQUlGLEVBQU8sR0FBRyxRQUFTLEdBQ25CLEVBQU8sR0FBRyxRQUFTLEdBQ25CLEVBQU8sR0FBRyxNQUFPLEdBRWpCLE1BckVGLEdBQUEsUUFBQSxzZUNWQSxHQUFBLElBQUEsR0FBQSxRQUFBLFFBQ0EsR0FBQSxHQUFBLFFBQUEsUUFDQSxHQUFBLEdBQUEsUUFBQSxRQUNBLEdBQUEsR0FBQSxRQUFBLFdBQ0EsR0FBQSxHQUFBLE1BRUEsR0FBQSxLQUVBLEdBQUEsR0FBQSxNQUVNLEdBQVEsR0FBQSxRQUFZLDJCQWdCMUIsZ0JBQTZDLElBQUEsS0FBSyxDQUlqRCxZQUFZLEVBQXNDLENBQ2pELEdBQUksR0FNSixHQUxBLEFBQUksTUFBTyxJQUFVLFNBQ3BCLEVBQU8sR0FBQSxRQUFJLE1BQU0sR0FFakIsRUFBTyxFQUVKLENBQUMsRUFDSixLQUFNLElBQUksT0FDVCxnRUFHRixHQUFNLDRDQUE2QyxHQUNuRCxNQUFNLEdBRU4sR0FBTSxHQUFLLE9BQUEsT0FBQSxHQUFnQyxHQUkzQyxLQUFLLFlBQWMsRUFBSyxhQUFlLEdBQVEsRUFBTSxVQUdyRCxFQUFNLEtBQU8sRUFBTSxVQUFZLEVBQU0sS0FDakMsTUFBTyxHQUFNLE1BQVMsVUFDekIsR0FBTSxLQUFPLFNBQVMsRUFBTSxLQUFNLEtBRS9CLENBQUMsRUFBTSxNQUFRLEVBQU0sTUFDeEIsR0FBTSxLQUFPLEtBQUssWUFBYyxJQUFNLElBS25DLEtBQUssYUFBZSxDQUFFLGtCQUFtQixLQUM1QyxHQUFNLGNBQWdCLENBQUMsYUFHcEIsRUFBTSxNQUFRLEVBQU0sTUFLdkIsT0FBTyxHQUFNLEtBQ2IsTUFBTyxHQUFNLFVBR2QsS0FBSyxNQUFRLEVBU1IsU0FDTCxFQUNBLEVBQW9CLDBDQUVwQixHQUFNLENBQUUsUUFBTyxlQUFnQixLQUczQixFQUNKLEFBQUksRUFDSCxJQUFNLDRCQUE2QixHQUNuQyxFQUFTLEdBQUEsUUFBSSxRQUFRLElBRXJCLElBQU0sNEJBQTZCLEdBQ25DLEVBQVMsR0FBQSxRQUFJLFFBQVEsSUFHdEIsR0FBTSxHQUFPLE9BQUEsT0FBQSxHQUE2QixFQUFNLFNBRTVDLEVBQVUsV0FERyxHQUFHLEVBQUssUUFBUSxFQUFLO0VBSXRDLEFBQUksRUFBTSxNQUNULEdBQVEsdUJBQXlCLFNBQVMsT0FBTyxLQUNoRCxFQUFNLE1BQ0wsU0FBUyxhQUtaLEdBQUksQ0FBRSxPQUFNLE9BQU0sa0JBQW1CLEVBQ3JDLEFBQUssR0FBYyxFQUFNLElBQ3hCLElBQVEsSUFBSSxLQUViLEVBQVEsS0FBTyxFQUVmLEVBQVEsV0FBYSxRQUNyQixPQUFXLEtBQVEsUUFBTyxLQUFLLEdBQzlCLEdBQVcsR0FBRyxNQUFTLEVBQVE7RUFHaEMsR0FBTSxHQUF1QixHQUFBLFFBQW1CLEdBRWhELEVBQU8sTUFBTSxHQUFHO0dBRWhCLEdBQU0sQ0FDTCxhQUNBLFlBQ0csS0FBTSxHQUVWLEdBQUksSUFBZSxJQUFLLENBR3ZCLEdBRkEsRUFBSSxLQUFLLFNBQVUsSUFFZixFQUFLLGVBQWdCLENBQ3hCLEdBQU0sR0FBYSxFQUFLLFlBQWMsRUFBSyxLQUMzQyxHQUFJLENBQUMsRUFDSixLQUFNLElBQUksT0FBTSxvQ0FJakIsVUFBTSxzQ0FDQyxHQUFBLFFBQUksUUFBTyxPQUFBLE9BQUEsT0FBQSxPQUFBLEdBQ2QsR0FBSyxFQUFNLE9BQVEsV0FBWSxPQUFRLFNBQU8sQ0FDakQsU0FDQSxnQkFJRixNQUFPLEdBY1IsRUFBTyxVQUVQLEdBQU0sR0FBYSxHQUFJLElBQUEsUUFBSSxPQUMzQixTQUFXLFNBQVcsR0FHdEIsRUFBSSxLQUFLLFNBQVUsQUFBQyxHQUFpQixDQUNwQyxHQUFNLDZDQUNOLEdBQUEsUUFBTyxFQUFFLGNBQWMsUUFBVSxHQUtqQyxFQUFFLEtBQUssR0FDUCxFQUFFLEtBQUssUUFHRCxNQTVKVCxHQUFBLFFBQUEsR0FnS0EsWUFBZ0IsRUFBa0MsQ0FDakQsRUFBTyxTQUdSLFlBQXVCLEVBQWMsRUFBZSxDQUNuRCxNQUFPLFNBQVMsQ0FBQyxHQUFVLElBQVMsSUFBUSxHQUFVLElBQVMsS0FHaEUsWUFBaUIsRUFBd0IsQ0FDeEMsTUFBTyxPQUFPLElBQWEsU0FBVyxhQUFhLEtBQUssR0FBWSxHQUdyRSxZQUNDLEtBQ0csRUFBTyxDQUlWLEdBQU0sR0FBTSxHQUdSLEVBQ0osSUFBSyxJQUFPLEdBQ1gsQUFBSyxFQUFLLFNBQVMsSUFDbEIsR0FBSSxHQUFPLEVBQUksSUFHakIsTUFBTyx1SENoTlIsR0FBQSxHQUFBLE1BRUEsWUFDQyxFQUEyRCxDQUUzRCxNQUFPLElBQUksSUFBQSxRQUFpQixHQUc3QixBQUFBLFVBQVUsRUFBcUIsQ0FvQmpCLEVBQUEsZ0JBQWtCLEdBQUEsUUFFL0IsRUFBc0IsVUFBWSxHQUFBLFFBQWlCLFlBdEIxQyxJQUFBLElBQXFCLEtBeUIvQixHQUFBLFFBQVMsZ0ZDdENULEdBQUEsS0FFQSxHQUFBLFFBQUEsUUFFQSxHQUFBLEtBR0EsR0FBQSxTQUFBLEVBQUEsQ0FBbUMsR0FBQSxVQUFBLEVBQUEsR0FFakMsV0FBMEIsRUFBeUIsQ0FBbkQsR0FBQSxHQUNFLEVBQUEsS0FBQSxLQUFNLElBQVEsS0FEVSxFQUFBLFFBQUEsRUFFeEIsR0FBTSxHQUFRLEVBQUssVUFBVSxRQUM3QixTQUFLLE9BQVMsR0FDZCxFQUFLLE9BQVMsRUFDVCxHQUFLLE9BQThCLEdBQ3BDLEdBQUksSUFBSyxNQUFNLENBQUUsVUFBVyxHQUFPLFdBQVksR0FBSSxRQUFTLFFBTTNELFNBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQVksQ0FDM0IsTUFBTyxNQUFLLE1BQU0sR0FBQSxxQkFBcUIsRUFBTyxLQUFLLE1BQU8sSUFNckQsRUFBQSxVQUFBLFlBQVAsU0FBbUIsRUFBb0MsQ0FDckQsTUFBTyxNQUFLLE1BQU0sR0FBQSx1QkFBdUIsRUFBUyxLQUFLLE1BQU8sSUFFbEUsR0F4Qm1DLEdBQUEsZUFBdEIsR0FBQSxjQUFBLGdGQ1BiLEdBQUEsS0FFQSxHQUFBLFFBQUEsU0FFQSxHQUFBLEtBR0EsR0FBQSxTQUFBLEVBQUEsQ0FBb0MsR0FBQSxVQUFBLEVBQUEsR0FFbEMsV0FBMEIsRUFBeUIsQ0FBbkQsR0FBQSxHQUNFLEVBQUEsS0FBQSxLQUFNLElBQVEsS0FEVSxFQUFBLFFBQUEsRUFFeEIsR0FBTSxHQUFRLEVBQUssVUFBVSxTQUM3QixTQUFLLE9BQVMsR0FDZCxFQUFLLE9BQVMsRUFDVCxHQUFLLE9BQThCLEdBQ3BDLEdBQUksSUFBTSxNQUFNLENBQUUsVUFBVyxHQUFPLFdBQVksR0FBSSxRQUFTLFFBTTVELFNBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQVksQ0FDM0IsTUFBTyxNQUFLLE1BQU0sR0FBQSxxQkFBcUIsRUFBTyxLQUFLLE1BQU8sSUFNckQsRUFBQSxVQUFBLFlBQVAsU0FBbUIsRUFBb0MsQ0FDckQsTUFBTyxNQUFLLE1BQU0sR0FBQSx1QkFBdUIsRUFBUyxLQUFLLE1BQU8sSUFFbEUsR0F4Qm9DLEdBQUEsZUFBdkIsR0FBQSxlQUFBLHFFQ1BiLEdBQUEsSUFBQSxLQUFTLEdBQUEsY0FBQSxHQUFBLGNBQ1QsR0FBQSxJQUFBLEtBQVMsR0FBQSxjQUFBLEdBQUEsY0FDVCxHQUFBLElBQUEsS0FBUyxHQUFBLGVBQUEsR0FBQSw0RkNGVCxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsSUFXQSxHQUFBLEtBQ0EsR0FBQSxLQU9BLEdBQUEsU0FBQSxFQUFBLENBQWlDLEdBQUEsVUFBQSxFQUFBLEdBQWpDLFlBQUEsZ0RBS1MsU0FBQSxVQUFBLG1CQUFQLFNBQTBCLEVBQWdCLEVBQWdCLENBQTFELEdBQUEsR0FBQSxLQUVNLEVBQVUsRUFDUixFQUNKLEdBQVEsRUFBSyxNQUFTLEVBQUssS0FBa0MsVUFDekQsRUFBdUIsR0FBcUIsQ0FDaEQsUUFBUyxHQUNULEtBQU0sV0FHUixHQUFJLENBQUMsR0FBQSxRQUFRLEdBQVksQ0FDdkIsR0FBSSxHQUFBLGNBQWMsR0FBWSxDQUc1QixHQUFNLEdBQVUsMkNBQTJDLEdBQUEsK0JBQStCLEdBRTFGLEdBQUEsZ0JBQWdCLGVBQWUsU0FBQSxFQUFLLENBQ2xDLEVBQU0sU0FBUyxpQkFBa0IsR0FBQSxnQkFBZ0IsTUFHbkQsRUFBTSxHQUFRLEVBQUssb0JBQXVCLEdBQUksT0FBTSxHQUNuRCxFQUFhLFFBQVUsTUFJeEIsR0FBTSxHQUFRLEVBQUssb0JBQXVCLEdBQUksT0FBTSxHQUNuRCxFQUFhLFFBQVUsRUFFMUIsRUFBVSxVQUFZLEdBR3hCLE1BQU8sSUFBSSxJQUFBLFlBQW1CLFNBQUMsRUFBUyxFQUFNLENBQzVDLE1BQUEsSUFBQSxXQUFXLEVBQWEsRUFBSyxVQUMxQixLQUFLLFNBQUEsRUFBSyxDQUNULEdBQUEsc0JBQXNCLEVBQU8sT0FBVyxRQUN4QyxHQUFBLHNCQUFzQixFQUFPLEdBRTdCLEVBQU8sR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNGLEdBQUssQ0FDUixTQUFVLEdBQVEsRUFBSyxjQUcxQixLQUFLLEtBQU0sTUFPWCxFQUFBLFVBQUEsaUJBQVAsU0FBd0IsRUFBaUIsRUFBaUMsRUFBZ0IsQ0FBMUYsR0FBQSxHQUFBLEtBQXlDLEFBQUEsSUFBQSxRQUFBLEdBQWtCLEdBQUEsU0FBUyxNQUNsRSxHQUFNLEdBQWUsQ0FDbkIsU0FBVSxHQUFRLEVBQUssU0FDdkIsTUFBSyxFQUNMLFFBQU8sR0FHVCxNQUFPLElBQUksSUFBQSxZQUFtQixTQUFBLEVBQU8sQ0FDbkMsR0FBSSxFQUFLLFNBQVMsa0JBQW9CLEdBQVEsRUFBSyxtQkFBb0IsQ0FDckUsR0FBTSxHQUFRLEVBQUssbUJBQXFCLEdBQUEsc0JBQXNCLEVBQUssb0JBQXNCLEdBQ3pGLEFBQUssR0FBQSxXQUFXLEVBQU8sRUFBSyxVQUN6QixLQUFLLFNBQUEsRUFBTSxDQUNWLEVBQU0sV0FBYSxDQUNqQixPQUFRLEdBQUEsc0JBQXNCLElBRWhDLEVBQVEsS0FFVCxLQUFLLEtBQU0sVUFBQSxDQUNWLEVBQVEsU0FHWixHQUFRLE1BUUosRUFBQSxVQUFBLGdCQUFWLFVBQUEsQ0FDRSxHQUFJLENBQUMsS0FBSyxTQUFTLElBRWpCLE1BQU8sR0FBQSxVQUFNLGdCQUFlLEtBQUEsTUFHOUIsR0FBTSxHQUFNLEdBQUksSUFBQSxJQUFJLEtBQUssU0FBUyxLQUU1QixFQUFnQixHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ2pCLEtBQUssU0FBUyxrQkFDYixLQUFLLFNBQVMsV0FBYSxDQUFFLFVBQVcsS0FBSyxTQUFTLFlBQ3RELEtBQUssU0FBUyxZQUFjLENBQUUsV0FBWSxLQUFLLFNBQVMsYUFDeEQsS0FBSyxTQUFTLFNBQVcsQ0FBRSxRQUFTLEtBQUssU0FBUyxVQUFVLENBQ2hFLElBQUssS0FBSyxTQUFTLElBQ25CLE9BQVEsS0FBSyxTQUFTLE9BQ3RCLFVBQVcsS0FBSyxTQUFTLFlBRzNCLE1BQUksTUFBSyxTQUFTLFVBQ1QsR0FBSSxNQUFLLFNBQVMsVUFBVSxHQUVqQyxFQUFJLFdBQWEsT0FDWixHQUFJLElBQUEsY0FBYyxHQUVwQixHQUFJLElBQUEsZUFBZSxJQUU5QixHQTdHaUMsR0FBQSxhQUFwQixHQUFBLFlBQUEsZ0ZDckJiLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsSUFFQSxHQUFBLEtBU0EsR0FBQSxTQUFBLEVBQUEsQ0FBZ0MsR0FBQSxVQUFBLEVBQUEsR0FPOUIsV0FBbUIsRUFBb0IsQ0FBdkMsR0FBQSxHQUFBLEtBQ0UsU0FBUSxVQUFZLEVBQVEsV0FBYSxHQUN6QyxFQUFRLFVBQVUsSUFBTSxFQUFRLFVBQVUsS0FBTyxDQUMvQyxLQUFNLHlCQUNOLFNBQVUsQ0FDUixDQUNFLEtBQU0sbUJBQ04sUUFBUyxHQUFBLGNBR2IsUUFBUyxHQUFBLGFBR1gsRUFBQSxFQUFBLEtBQUEsS0FBTSxHQUFBLFlBQWEsSUFBUSxPQU90QixTQUFBLFVBQUEsaUJBQVAsU0FBd0IsRUFBZ0IsRUFBa0IsRUFBYSxDQUlyRSxHQUFJLEtBQUssU0FBUyxxQkFBdUIsS0FBSyxpQkFBbUIsRUFBTyxDQUN0RSxHQUFNLEdBQWlCLEVBQU0sb0JBSTdCLEFBQUksR0FBa0IsRUFBZSxTQUFXLEdBQUEscUJBQXFCLElBQ25FLEdBQWUsT0FBUyxHQUFBLHFCQUFxQixTQUlqRCxNQUFPLEdBQUEsVUFBTSxpQkFBZ0IsS0FBQSxLQUFDLEVBQVcsRUFBTSxJQU0xQyxFQUFBLFVBQUEsYUFBUCxTQUFvQixFQUFjLEVBQWtCLEVBQWEsQ0FJL0QsR0FBSSxLQUFLLFNBQVMscUJBQXVCLEtBQUssaUJBQW1CLEVBQU8sQ0FDdEUsR0FBTSxHQUFZLEVBQU0sTUFBUSxZQUMxQixFQUNKLElBQWMsYUFBZSxFQUFNLFdBQWEsRUFBTSxVQUFVLFFBQVUsRUFBTSxVQUFVLE9BQU8sT0FBUyxFQUc1RyxHQUFJLEVBQWEsQ0FDZixHQUFNLEdBQWlCLEVBQU0sb0JBSTdCLEFBQUksR0FBa0IsRUFBZSxTQUFXLEdBQUEscUJBQXFCLElBQ25FLEdBQWUsT0FBUyxHQUFBLHFCQUFxQixVQUtuRCxNQUFPLEdBQUEsVUFBTSxhQUFZLEtBQUEsS0FBQyxFQUFPLEVBQU0sSUFPbEMsRUFBQSxVQUFBLE1BQVAsU0FBYSxFQUFnQixPQUMzQixNQUFBLEdBQUEsS0FBSyxtQkFBZSxNQUFBLElBQUEsUUFBQSxFQUFFLFFBQ2YsRUFBQSxVQUFNLE1BQUssS0FBQSxLQUFDLElBSWQsRUFBQSxVQUFBLG1CQUFQLFVBQUEsQ0FDUSxHQUFBLEdBQUEsS0FBQSxTQUFFLEVBQUEsRUFBQSxRQUFTLEVBQUEsRUFBQSxZQUNqQixBQUFLLEVBR0gsS0FBSyxnQkFBa0IsR0FBSSxJQUFBLGVBQWUsS0FBSyxlQUFnQixDQUM3RCxRQUFPLEVBQ1AsWUFBVyxJQUpiLEdBQUEsT0FBTyxLQUFLLCtFQVlOLEVBQUEsVUFBQSxjQUFWLFNBQXdCLEVBQWMsRUFBZSxFQUFnQixDQUNuRSxTQUFNLFNBQVcsRUFBTSxVQUFZLE9BQy9CLEtBQUssYUFBYSxZQUNwQixHQUFNLFlBQWMsS0FBSyxhQUFhLFlBRWpDLEVBQUEsVUFBTSxjQUFhLEtBQUEsS0FBQyxFQUFPLEVBQU8sSUFPakMsRUFBQSxVQUFBLHVCQUFWLFVBQUEsQ0FDRSxBQUFLLEtBQUssZ0JBR1IsS0FBSyxnQkFBZ0IsOEJBRnJCLEdBQUEsT0FBTyxLQUFLLG1GQUtsQixHQW5IZ0MsR0FBQSxZQUFuQixHQUFBLFdBQUEsZ0ZDZGIsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLElBQ0EsR0FBQSxRQUFBLFFBR0EsR0FBQSxVQUFBLENBQUEsWUFBQSxDQVNTLEtBQUEsS0FBZSxFQUFRLEdBS3ZCLFNBQUEsVUFBQSxVQUFQLFVBQUEsYUFDRSxPQUFvQixHQUFBLEdBQUEsU0FBQSxDQUFDLFFBQVMsT0FBUSxPQUFRLFFBQVMsUUFBTSxFQUFBLEVBQUEsT0FBQSxDQUFBLEVBQUEsS0FBQSxFQUFBLEVBQUEsT0FBRSxDQUExRCxHQUFNLEdBQUssRUFBQSxNQUNkLEdBQUEsS0FBSyxRQUFTLEVBQU8sR0FBcUIsd0dBWmhDLEVBQUEsR0FBYSxVQWU3QixLQW5CYSxHQUFBLFFBQUEsR0F3QmIsWUFBOEIsRUFBYSxDQUN6QyxNQUFPLFVBQXdCLEVBQWlDLENBQzlELEdBQUksR0FFSixPQUFRLE9BQ0QsUUFDSCxFQUFjLEdBQUEsU0FBUyxNQUN2QixVQUNHLFFBQ0gsRUFBYyxHQUFBLFNBQVMsTUFDdkIsVUFDRyxPQUNILEVBQWMsR0FBQSxTQUFTLEtBQ3ZCLFVBQ0csT0FDSCxFQUFjLEdBQUEsU0FBUyxRQUN2QixjQUVBLEVBQWMsR0FBQSxTQUFTLElBSTNCLE1BQU8sV0FBQSxDQUNMLEFBQUksR0FBQSxnQkFBZ0IsZUFBZSxLQUNqQyxHQUFBLGdCQUFnQixjQUNkLENBQ0UsU0FBVSxVQUNWLE1BQU8sRUFDUCxRQUFTLEdBQUssT0FBTyxNQUFNLE9BQVcsWUFFeEMsQ0FDRSxNQUFLLEdBQUEsU0FBTSxXQUNYLE1BQUssSUFLWCxFQUFzQixNQUFNLEtBQU0sMkZDbkV4QyxHQUFBLEtBQ0EsR0FBQSxJQUdBLEdBQUEsUUFBQSxPQUVNLEdBQWUsR0FBQSxZQUFZLFFBQVEsU0FBUyxNQU1sRCxZQUFnQyxFQUFXLE9BQ25DLEVBQUcsR0FBRyxHQUFBLGdCQUNULGVBQVcsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUNWLFNBQ0osTUFBTyxHQUFNLEVBQUksU0FBUyxFQUFJLE1BQVEsR0FKeEMsR0FBQSxnQkFBQSxHQWFBLFlBQTJCLEVBQThCLENBQ3ZELEdBQU0sR0FBVyxFQUFlLFVBQVksR0FDdEMsRUFBVyxFQUFlLFVBQVksRUFBZSxNQUFRLEdBRTdELEVBQ0osQ0FBQyxFQUFlLE1BQVEsRUFBZSxPQUFTLElBQU0sRUFBZSxPQUFTLElBQU0sR0FBSyxJQUFJLEVBQWUsS0FDeEcsRUFBTyxFQUFlLEtBQU8sRUFBZSxLQUFPLElBRXpELE1BQVUsR0FBUSxLQUFLLEVBQVcsRUFBTyxFQVIzQyxHQUFBLFdBQUEsR0FvQkEsWUFDRSxFQUNBLEVBQ0EsRUFBMkIsV0FHM0IsR0FBSSxDQUFDLEVBQ0gsTUFBTyxHQUlMLEdBQUEsR0FBQSxHQUFBLE9BQUEsRUFBQSxNQUFBLEtBQUEsR0FBQyxFQUFBLEVBQUEsR0FBUSxFQUFBLEVBQUEsR0FJYixNQUFJLEdBQWUsTUFBUSxDQUFDLEVBQWUsVUFFekMsR0FBZSxTQUFRLEdBQUEsR0FBSSxLQUFlLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxTQUFLLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxTQUNuRCxFQUFhLEdBQVcsSUFJMUIsSUFBSSxLQUFVLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxXQUFXLFNBQ3pCLEdBQWEsRUFBVyxNQUFNLElBR3RCLEVBQU0sSUFBSSxFQTFCdEIsR0FBQSxxQkFBQSxHQTZDQSxZQUE2QixFQUFRLENBQ25DLEdBQU0sR0FBMEIsQ0FDOUIsU0FBVSxFQUFJLFNBQ2QsU0FDRSxNQUFPLEdBQUksVUFBYSxVQUFZLEVBQUksU0FBUyxXQUFXLEtBQU8sRUFBSSxTQUFTLE1BQU0sRUFBRyxJQUFNLEVBQUksU0FDckcsS0FBTSxFQUFJLEtBQ1YsT0FBUSxFQUFJLE9BQ1osU0FBVSxFQUFJLFNBQ2QsS0FBTSxHQUFHLEdBQUksVUFBWSxJQUFLLEdBQUksUUFBVSxJQUM1QyxLQUFNLEVBQUksTUFFWixNQUFJLEdBQUksT0FBUyxJQUNmLEdBQVEsS0FBTyxPQUFPLEVBQUksT0FFeEIsR0FBSSxVQUFZLEVBQUksV0FDdEIsR0FBUSxLQUFVLEVBQUksU0FBUSxJQUFJLEVBQUksVUFFakMsRUFqQlQsR0FBQSxhQUFBLEdBcUNBLFlBQ0UsRUFDQSxFQUE4QixxQkFFMUIsRUFBVSxFQThDZCxNQTNDSSxPQUFPLEdBQVksRUFBWSxPQUFTLElBQU8sWUFDakQsR0FBVyxFQUFZLE9BSXpCLEFBQUksTUFBTyxHQUFZLElBQU8sU0FDNUIsRUFBaUIsR0FBYSxHQUFJLElBQUEsSUFBSSxFQUFZLEtBQzdDLEFBQUksRUFBWSxZQUFjLElBQUEsSUFDbkMsRUFBaUIsR0FBYSxFQUFZLElBRTFDLEVBQWlCLEVBQVksR0FJM0IsRUFBWSxTQUFXLEdBQ3pCLEdBQWMsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUFRLEdBQW1CLEVBQVksS0FJbkQsRUFBZSxXQUFhLFFBUzlCLENBQUksR0FBYSxPQUFTLEdBQWEsTUFBUSxFQUM3QyxFQUFlLFNBQ2IsSUFBQyxHQUFBLEtBQVUsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGVBQW1CLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxXQUFRLElBQ3pDLEVBQWUsU0FBYSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsV0FBUSxJQUN0QyxFQUFlLGlCQUFxQixNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsVUFFekMsRUFBZSxTQUNiLElBQUMsRUFBZSxTQUFhLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxXQUFRLElBQ3RDLEVBQWUsaUJBQXFCLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxXQUFRLElBQzlDLEdBQUEsS0FBVSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsZUFBbUIsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFdBTXBDLEVBQ0ssQ0FBQyxFQUFnQixHQUVqQixDQUFDLEdBckRaLEdBQUEscUJBQUEsZ0ZDL0hBLEdBQUEsS0FFQSxHQUFBLElBSUEsR0FBQSxLQVNNLEdBQWUsR0FBQSxZQUFZLFFBQVEsU0FBUyxNQUdsRCxHQUFBLFVBQUEsQ0F3QkUsV0FBbUIsRUFBMEQsQ0FBMUQsQUFBQSxJQUFBLFFBQUEsR0FBQSxJQWZaLEtBQUEsS0FBZSxFQUFLLEdBZ0J6QixLQUFLLGFBQWUsTUFBTyxHQUFRLGFBQWdCLFlBQWMsR0FBTyxFQUFRLFlBQ2hGLEtBQUssU0FBVyxNQUFPLEdBQVEsU0FBWSxZQUFjLEdBQVEsRUFBUSxRQU1wRSxTQUFBLFVBQUEsVUFBUCxVQUFBLENBRUUsR0FBSSxHQUFDLEtBQUssY0FBZ0IsQ0FBQyxLQUFLLFVBSWhDLElBQU0sR0FBc0IsR0FBbUMsS0FBSyxhQUFjLEtBQUssVUFHakYsRUFBYSxRQUFRLFFBTzNCLEdBTkEsR0FBQSxLQUFLLEVBQVksTUFBTyxHQUN4QixHQUFBLEtBQUssRUFBWSxVQUFXLEdBS3hCLEdBQWEsT0FBUyxHQUFhLE1BQVEsRUFBRyxDQUVoRCxHQUFNLEdBQWMsUUFBUSxTQUM1QixHQUFBLEtBQUssRUFBYSxNQUFPLEdBQ3pCLEdBQUEsS0FBSyxFQUFhLFVBQVcsTUFoRG5CLEVBQUEsR0FBYSxPQW1EN0IsS0F2RGEsR0FBQSxLQUFBLEdBdUViLFlBQ0UsRUFDQSxFQUF1QixDQUV2QixNQUFPLFVBQXFDLEVBQTRDLENBQ3RGLE1BQU8sV0FBc0IsUUFBbUMsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsR0FBQSxVQUFBLEdBRTlELEdBQU0sR0FBYSxLQUViLEVBQWMsR0FBQSxxQkFBcUIsS0FBTSxHQUN6QyxFQUFpQixFQUFZLEdBQzdCLEVBQWEsR0FBQSxXQUFXLEdBRzlCLEdBQUksR0FBQSxnQkFBZ0IsR0FDbEIsTUFBTyxHQUFzQixNQUFNLEVBQVksR0FHakQsR0FBSSxHQUNBLEVBRUUsRUFBUSxHQUFBLGdCQUFnQixXQUM5QixHQUFJLEdBQVMsR0FDWCxHQUFhLEVBQU0sVUFDZixHQUFZLENBQ2QsRUFBTyxFQUFXLFdBQVcsQ0FDM0IsWUFBZ0IsR0FBZSxRQUFVLE9BQUssSUFBSSxFQUNsRCxHQUFJLGdCQUdOLEdBQU0sR0FBb0IsRUFBSyxnQkFDL0IsR0FBQSxPQUFPLElBQ0wsd0NBQXdDLEVBQWlCLDJCQUEyQixFQUFVLE1BRWhHLEVBQWUsUUFBTyxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQVEsRUFBZSxTQUFPLENBQUUsZUFBZ0IsSUFLMUUsTUFBTyxHQUNKLE1BQU0sRUFBWSxHQUNsQixLQUFLLFdBQVksU0FBbUMsRUFBeUIsQ0FFNUUsR0FBTSxHQUFNLEtBQ1osQUFBSSxHQUNGLEdBQXFCLFdBQVksRUFBWSxFQUFLLEdBRWhELEdBQWtCLEdBQ2hCLEdBQUksWUFDTixFQUFLLGNBQWMsRUFBSSxZQUV6QixFQUFLLFlBQWMsR0FBQSxxQkFBcUIsRUFBSyxZQUFhLEVBQWdCLEdBQzFFLEVBQUssWUFHUixLQUFLLFFBQVMsVUFBQSxDQUViLEdBQU0sR0FBTSxLQUVaLEFBQUksR0FDRixHQUFxQixRQUFTLEVBQVksR0FFeEMsR0FBa0IsR0FDcEIsR0FBSyxjQUFjLEtBQ25CLEVBQUssWUFBYyxHQUFBLHFCQUFxQixFQUFLLFlBQWEsRUFBZ0IsR0FDMUUsRUFBSyxjQVVqQixZQUE4QixFQUFlLEVBQWEsRUFBeUIsRUFBMEIsQ0FDM0csQUFBSSxDQUFDLEdBQUEsZ0JBQWdCLGVBQWUsS0FJcEMsR0FBQSxnQkFBZ0IsY0FDZCxDQUNFLFNBQVUsT0FDVixLQUFNLENBQ0osT0FBUSxFQUFJLE9BQ1osWUFBYSxHQUFPLEVBQUksV0FDeEIsSUFBRyxHQUVMLEtBQU0sUUFFUixDQUNFLE1BQUssRUFDTCxRQUFTLEVBQ1QsU0FBVSx1RUN0TGhCLEdBQUEsSUFBQSxLQUNBLEdBQUEsSUFJTSxHQUEyQixJQUtqQyxZQUFrQyxFQUFZLENBRTVDLFFBQVEsTUFBTSxHQUFTLEVBQU0sTUFBUSxFQUFNLE1BQVEsR0FFbkQsR0FBTSxHQUFTLEdBQUEsZ0JBQWdCLFlBRS9CLEdBQUksSUFBVyxPQUFXLENBQ3hCLEdBQUEsT0FBTyxLQUFLLDhEQUNaLE9BQU8sUUFBUSxLQUFLLEdBQ3BCLE9BR0YsR0FBTSxHQUFVLEVBQU8sYUFDakIsRUFDSCxHQUFXLEVBQVEsaUJBQW1CLEVBQVEsZ0JBQWtCLEdBQUssRUFBUSxpQkFDOUUsR0FDRixHQUFBLE9BQ0UsRUFBTyxNQUFNLEdBQVMsS0FBSyxTQUFDLEVBQWUsQ0FDekMsQUFBSyxHQUNILEdBQUEsT0FBTyxLQUFLLDhFQUVkLE9BQU8sUUFBUSxLQUFLLE1BckIxQixHQUFBLGtCQUFBLHFFQ1ZBLEdBQUEsSUFBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLElBR0EsR0FBQSxLQUtBLEdBQUEsVUFBQSxDQW1CRSxXQUNtQixFQU9YLENBUFcsQUFBQSxJQUFBLFFBQUEsR0FBQSxJQUFBLEtBQUEsU0FBQSxFQVhaLEtBQUEsS0FBZSxFQUFvQixHQUsxQixLQUFBLFFBQWtDLEtBQUssb0JBa0JoRCxTQUFBLFVBQUEsVUFBUCxVQUFBLENBQ0UsT0FBTyxRQUFRLEdBQUcsb0JBQXFCLEtBQUssUUFBUSxLQUFLLFFBTW5ELEVBQUEsVUFBQSxrQkFBUixVQUFBLENBQUEsR0FBQSxHQUFBLEtBQ1EsRUFBVSxJQUNaLEVBQTRCLEdBQzVCLEVBQTZCLEdBQzdCLEVBQTRCLEdBQzVCLEVBRUosTUFBTyxVQUFDLEVBQVksQ0FDbEIsR0FBSSxHQUFvQyxHQUFBLGtCQUNsQyxFQUFTLEdBQUEsZ0JBQWdCLFlBVS9CLEdBUkEsQUFBSSxFQUFLLFNBQVMsYUFFaEIsRUFBZSxFQUFLLFNBQVMsYUFDcEIsR0FBVSxFQUFPLGFBQWEsY0FFdkMsR0FBZSxFQUFPLGFBQWEsY0FHaEMsRUEyQkUsQUFBSSxFQUVULElBQUEsT0FBTyxLQUFLLGtHQUNaLEdBQUEsa0JBQWtCLElBQ1IsR0FlVixHQUFvQixHQUNwQixXQUFXLFVBQUEsQ0FDVCxBQUFLLEdBRUgsR0FBbUIsR0FDbkIsRUFBYSxFQUFZLEtBSTFCLFFBdkRrQixDQUNyQixHQUFNLEdBQU0sR0FBQSxnQkFLWixFQUFhLEVBQ2IsRUFBbUIsR0FFbkIsQUFBSSxFQUFJLGVBQWUsR0FDckIsRUFBSSxVQUFVLFNBQUMsRUFBWSxDQUN6QixFQUFNLFNBQVMsR0FBQSxTQUFTLE9BQ3hCLEVBQUksaUJBQWlCLEVBQU8sQ0FDMUIsa0JBQW1CLEVBQ25CLEtBQU0sQ0FBRSxVQUFXLENBQUUsUUFBUyxHQUFPLEtBQU0sMEJBRXhDLEdBQ0gsR0FBbUIsR0FDbkIsRUFBYSxNQUlaLEdBQ0gsR0FBbUIsR0FDbkIsRUFBYSxPQTlFVCxFQUFBLEdBQWEsc0JBaUg3QixLQXJIYSxHQUFBLG9CQUFBLHFFQ1ZiLEdBQUEsSUFBQSxLQUVBLEdBQUEsSUFFQSxHQUFBLEtBS0EsR0FBQSxVQUFBLENBY0UsV0FDbUIsRUFNRyxDQU5ILEFBQUEsSUFBQSxRQUFBLEdBQUEsQ0FNWCxLQUFNLFNBTkssS0FBQSxTQUFBLEVBTlosS0FBQSxLQUFlLEVBQXFCLEdBa0JwQyxTQUFBLFVBQUEsVUFBUCxVQUFBLENBQ0UsT0FBTyxRQUFRLEdBQUcscUJBQXNCLEtBQUsscUJBQXFCLEtBQUssUUFTbEUsRUFBQSxVQUFBLHFCQUFQLFNBQTRCLEVBQWEsRUFBWSxDQUNuRCxHQUFNLEdBQU0sR0FBQSxnQkFFWixHQUFJLENBQUMsRUFBSSxlQUFlLEdBQXVCLENBQzdDLEtBQUssaUJBQWlCLEdBQ3RCLE9BSUYsR0FBTSxHQUFXLEVBQVEsUUFBVSxFQUFRLE9BQU8sZUFBa0IsR0FFcEUsRUFBSSxVQUFVLFNBQUMsRUFBWSxDQUN6QixFQUFNLFNBQVMsNEJBQTZCLElBR3hDLEVBQVEsTUFDVixFQUFNLFFBQVEsRUFBUSxNQUVwQixFQUFRLE1BQ1YsRUFBTSxRQUFRLEVBQVEsTUFFcEIsRUFBUSxPQUNWLEVBQU0sVUFBVSxFQUFRLE9BRzFCLEVBQUksaUJBQWlCLEVBQVEsQ0FDM0Isa0JBQW1CLEVBQ25CLEtBQU0sQ0FBRSxVQUFXLENBQUUsUUFBUyxHQUFPLEtBQU0sNkJBSy9DLEtBQUssaUJBQWlCLElBT2hCLEVBQUEsVUFBQSxpQkFBUixTQUF5QixFQUFXLENBRWxDLEdBQU0sR0FDSixtTUFNRixBQUFJLEtBQUssU0FBUyxPQUFTLE9BQ3pCLEdBQUEsZUFBZSxVQUFBLENBQ2IsUUFBUSxLQUFLLEdBRWIsUUFBUSxNQUFNLEdBQVUsRUFBTyxNQUFRLEVBQU8sTUFBUSxLQUUvQyxLQUFLLFNBQVMsT0FBUyxVQUNoQyxJQUFBLGVBQWUsVUFBQSxDQUNiLFFBQVEsS0FBSyxLQUVmLEdBQUEsa0JBQWtCLEtBM0ZSLEVBQUEsR0FBYSx1QkErRjdCLEtBbkdhLEdBQUEscUJBQUEsZ0ZDVGIsR0FBQSxLQUVBLEdBQUEsSUFFQSxHQUFBLEtBRU0sR0FBYyxRQUNkLEdBQWdCLEVBR3RCLEdBQUEsVUFBQSxDQXdCRSxXQUFtQixFQUE4QyxDQUE5QyxBQUFBLElBQUEsUUFBQSxHQUFBLElBZkgsS0FBQSxLQUFlLEVBQWEsR0FnQjFDLEtBQUssS0FBTyxFQUFRLEtBQU8sR0FDM0IsS0FBSyxPQUFTLEVBQVEsT0FBUyxHQU0xQixTQUFBLFVBQUEsVUFBUCxVQUFBLENBQ0UsR0FBQSx3QkFBd0IsU0FBQyxFQUFjLEVBQWdCLENBQ3JELEdBQU0sR0FBTyxHQUFBLGdCQUFnQixlQUFlLEdBQzVDLEdBQUksRUFBTSxDQUNSLEdBQU0sR0FBVSxFQUFLLFVBQVksRUFBSyxTQUFTLEtBQUssR0FDcEQsTUFBTyxPQUFPLElBQVksV0FBYSxFQUFRLEVBQU8sR0FBUSxFQUVoRSxNQUFPLE1BT0gsRUFBQSxVQUFBLFNBQVIsU0FBaUIsRUFBYyxFQUFnQixDQUEvQyxHQUFBLEdBQUEsS0FDRSxNQUFJLENBQUMsRUFBTSxXQUFhLENBQUMsRUFBTSxVQUFVLFFBQVUsQ0FBQyxHQUFRLENBQUMsR0FBQSxhQUFhLEVBQUssa0JBQW1CLE9BQ3pGLEdBQUEsWUFBWSxRQUFRLEdBR3RCLEdBQUksSUFBQSxZQUFtQixTQUFBLEVBQU8sQ0FDbkMsQUFBSyxFQUFLLGVBQWUsRUFBSyxrQkFBNEIsRUFBSyxNQUM1RCxLQUFLLFNBQUMsRUFBeUIsQ0FDOUIsQUFBSSxHQUFTLEVBQU0sV0FBYSxFQUFNLFVBQVUsUUFDOUMsR0FBTSxVQUFVLE9BQU0sR0FBQSxTQUFPLEVBQWlCLEVBQU0sVUFBVSxTQUVoRSxFQUFRLEtBRVQsS0FBSyxLQUFNLFVBQUEsQ0FDVixFQUFRLFFBUVIsRUFBQSxVQUFBLGVBQVIsU0FBdUIsRUFBc0IsRUFBYSxFQUF1QixDQUFqRixHQUFBLEdBQUEsS0FDRSxNQUR3RCxLQUFBLFFBQUEsR0FBQSxJQUNwRCxDQUFDLEdBQUEsYUFBYSxFQUFNLEdBQU0sUUFBVSxFQUFNLE9BQVMsR0FBSyxLQUFLLE9BQ3hELEdBQUEsWUFBWSxRQUFRLEdBRXRCLEdBQUksSUFBQSxZQUF5QixTQUFDLEVBQVMsRUFBTSxDQUNsRCxBQUFLLEdBQUEsc0JBQXNCLEVBQU0sSUFDOUIsS0FBSyxTQUFDLEVBQW9CLENBQ3pCLEFBQUssRUFBSyxlQUFlLEVBQU0sR0FBTSxFQUFHLEdBQUEsU0FBQSxDQUFHLEdBQWMsSUFDdEQsS0FBSyxHQUNMLEtBQUssS0FBTSxVQUFBLENBQ1YsUUFHTCxLQUFLLEtBQU0sVUFBQSxDQUNWLFNBOUVNLEVBQUEsR0FBYSxlQWtGN0IsS0F0RmEsR0FBQSxhQUFBLGdGQ1RiLEdBQUEsUUFBQSxNQUNBLEdBQUEsUUFBQSxRQUVJLEdBR0osYUFBaUIsQ0FDZixHQUFJLENBQ0YsTUFBTyxTQUFRLE1BQVEsT0FBTyxLQUFLLFFBQVEsT0FBb0MsUUFDL0UsQ0FDQSxNQUFPLElBS1gsYUFBdUIsQ0FHckIsR0FBTSxHQUFhLFFBQVEsTUFBUSxRQUFRLEtBQUssT0FBVSxHQUNwRCxFQUFRLEtBQ1IsRUFFRixHQUNFLEVBRUYsR0FFSixTQUFNLFFBQVEsU0FBQSxFQUFJLENBQ2hCLEdBQUksR0FBTSxFQUdKLEVBQVEsVUFBQSxDQUNaLEdBQU0sR0FBTyxFQUdiLEdBRkEsRUFBTSxHQUFBLFFBQVEsR0FFVixHQUFDLEdBQU8sSUFBUyxHQUFPLEVBQUssSUFHakMsSUFBSSxFQUFVLFFBQVEsR0FBTyxFQUMzQixNQUFPLEtBR1QsR0FBTSxHQUFVLEdBQUEsS0FBSyxFQUFNLGdCQUczQixHQUZBLEVBQUssR0FBUSxHQUVULENBQUMsR0FBQSxXQUFXLEdBQ2QsTUFBTyxLQUdULEdBQUksQ0FDRixHQUFNLEdBQU8sS0FBSyxNQUFNLEdBQUEsYUFBYSxFQUFTLFNBSTlDLEVBQU0sRUFBSyxNQUFRLEVBQUssYUFDeEIsS0FLSixNQUdLLEVBSVQsR0FBQSxJQUFBLFVBQUEsQ0FBQSxZQUFBLENBU1MsS0FBQSxLQUFlLEVBQVEsR0FLdkIsU0FBQSxVQUFBLFVBQVAsU0FBaUIsRUFBNkQsRUFBd0IsQ0FBdEcsR0FBQSxHQUFBLEtBQ0UsRUFBd0IsU0FBQSxFQUFLLENBQzNCLE1BQUssS0FBZ0IsZUFBZSxHQUdwQyxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ0ssR0FBSyxDQUNSLFFBQVMsRUFBSyxnQkFKUCxLQVVMLEVBQUEsVUFBQSxZQUFSLFVBQUEsQ0FDRSxNQUFLLEtBQ0gsSUFBYyxNQUVULElBM0JLLEVBQUEsR0FBYSxVQTZCN0IsS0FqQ2EsR0FBQSxRQUFBLHFFQ3BFYixHQUFBLElBQUEsS0FBUyxHQUFBLFFBQUEsR0FBQSxRQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsS0FBQSxHQUFBLEtBQ1QsR0FBQSxJQUFBLEtBQVMsR0FBQSxvQkFBQSxHQUFBLG9CQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEscUJBQUEsR0FBQSxxQkFDVCxHQUFBLElBQUEsS0FBUyxHQUFBLGFBQUEsR0FBQSxhQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsUUFBQSxHQUFBLHFGQ0xULEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsSUFDQSxHQUFBLFFBQUEsVUFFQSxHQUFBLEtBQ0EsR0FBQSxLQUdhLEdBQUEsb0JBQXNCLENBRWpDLEdBQUksSUFBQSxhQUFpQixlQUNyQixHQUFJLElBQUEsYUFBaUIsaUJBRXJCLEdBQUksSUFBQSxRQUNKLEdBQUksSUFBQSxLQUVKLEdBQUksSUFBQSxvQkFDSixHQUFJLElBQUEscUJBRUosR0FBSSxJQUFBLGNBMEROLFlBQXFCLEVBQXlCLENBQXpCLEFBQUEsSUFBQSxRQUFBLEdBQUEsVUFDYixFQUFVLEdBQUEsaUJBQ1YsRUFBeUIsSUFBQSxFQUFRLGNBQVUsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGVBQWdCLEdBY25FLEdBWkEsRUFBUSxvQkFDTixFQUFRLHNCQUF3QixHQUM1QixHQUNELEdBQUEsU0FDTyxNQUFNLFFBQVEsRUFBUSxxQkFBdUIsRUFBUSxvQkFBc0IsR0FBQSxvQkFDNUUsR0FHUCxFQUFRLE1BQVEsUUFBYSxRQUFRLElBQUksWUFDM0MsR0FBUSxJQUFNLFFBQVEsSUFBSSxZQUd4QixFQUFRLG1CQUFxQixRQUFhLFFBQVEsSUFBSSwwQkFBMkIsQ0FDbkYsR0FBTSxHQUFtQixXQUFXLFFBQVEsSUFBSSwyQkFDaEQsQUFBSSxTQUFTLElBQ1gsR0FBUSxpQkFBbUIsR0FJL0IsR0FBSSxFQUFRLFVBQVksT0FBVyxDQUNqQyxHQUFNLEdBQWtCLEtBQ3hCLEFBQUksSUFBb0IsT0FDdEIsRUFBUSxRQUFVLEVBR2xCLEVBQVEsb0JBQXNCLEdBSWxDLEFBQUksRUFBUSxjQUFnQixRQUFhLFFBQVEsSUFBSSxvQkFDbkQsR0FBUSxZQUFjLFFBQVEsSUFBSSxvQkFHaEMsRUFBUSxzQkFBd0IsUUFBYSxFQUFRLE1BQVEsUUFDL0QsR0FBUSxvQkFBc0IsSUFJM0IsR0FBZSxRQUNsQixHQUFBLGdCQUFnQixFQUFTLEdBQUEsaUJBRzNCLEdBQUEsWUFBWSxHQUFBLFdBQVksR0FFcEIsRUFBUSxxQkFDVixLQWpESixHQUFBLEtBQUEsR0EwREEsYUFBMkIsQ0FDekIsTUFBTyxJQUFBLGdCQUFnQixjQUR6QixHQUFBLFlBQUEsR0FZQSxZQUE0QixFQUFnQixnR0FFMUMsTUFETSxHQUFTLEdBQUEsZ0JBQWdCLFlBQzNCLEVBQ0YsQ0FBQSxFQUFPLEVBQU8sTUFBTSxJQUV0QixJQUFBLE9BQU8sS0FBSywyQ0FDWixDQUFBLEVBQU8sUUFBUSxRQUFRLFVBTnpCLEdBQUEsTUFBQSxHQWlCQSxZQUE0QixFQUFnQixnR0FFMUMsTUFETSxHQUFTLEdBQUEsZ0JBQWdCLFlBQzNCLEVBQ0YsQ0FBQSxFQUFPLEVBQU8sTUFBTSxJQUV0QixJQUFBLE9BQU8sS0FBSywyREFDWixDQUFBLEVBQU8sUUFBUSxRQUFRLFVBTnpCLEdBQUEsTUFBQSxHQVlBLFlBQTZDLEVBQW1CLENBQzlELEdBQUksSUFBVyxPQUNiLE1BQU8sR0FFVCxHQUFNLEdBQTZCLEdBQVUsRUFBTyxhQUNwRCxNQUFJLElBQWlCLEVBQWMsc0JBQXdCLE9BQ2xELEVBQWMsb0JBRWhCLEdBUlQsR0FBQSw2QkFBQSxHQWNBLFlBQWlDLEVBQWlCLENBRWhELEdBQUksUUFBUSxJQUFJLGVBQ2QsTUFBTyxTQUFRLElBQUksZUFJckIsR0FBTSxHQUFTLEdBQUEsa0JBQ2YsTUFBSSxHQUFPLGdCQUFrQixFQUFPLGVBQWUsR0FDMUMsRUFBTyxlQUFlLEdBSzdCLFFBQVEsSUFBSSxZQUVaLFFBQVEsSUFBSSxZQUVaLFFBQVEsSUFBSSx1QkFDWixRQUFRLElBQUksMEJBQ1osUUFBUSxJQUFJLDBCQUNaLFFBQVEsSUFBSSw2QkFFWixRQUFRLElBQUksd0JBQ1osUUFBUSxJQUFJLHdCQUNaLFFBQVEsSUFBSSwyQkFDWixFQTFCSixHQUFBLGlCQUFBLEdBaUNBLGFBQTZCLENBQzNCLEdBQU0sR0FBTSxHQUFBLGdCQUNaLEVBQUksZUFLSixRQUFRLEdBQUcsYUFBYyxVQUFBLE9BQ2pCLEVBQU8sR0FBRyxFQUFJLGNBQVUsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGFBQzFCLEVBQWlCLENBQUMsR0FBQSxjQUFjLE9BQVEsR0FBQSxjQUFjLFNBSzVELEFBQUksR0FBVyxDQUFDLEVBQWUsU0FBUyxFQUFRLFNBQVMsRUFBSSw2RkMvT2pFLEdBQUEsUUFBQSxNQUNBLEdBQUEsUUFBQSxRQVNBLFlBQWdDLEVBQWlCLENBQy9DLEdBQU0sR0FBbUIsR0FBSyxRQUFRLEdBRXRDLEdBQUksQ0FBQyxHQUFHLFdBQVcsR0FDakIsS0FBTSxJQUFJLE9BQU0sMkJBQTJCLEVBQWdCLCtCQUc3RCxHQUFJLENBQUMsR0FBRyxTQUFTLEdBQWtCLGNBQ2pDLEtBQU0sSUFBSSxPQUFNLDJCQUEyQixFQUFnQixvQ0FNN0QsR0FBTSxHQUFxQixTQUFDLEVBQXlCLENBQ25ELE1BQU8sSUFBRyxZQUFZLEdBQW1CLE9BQU8sU0FBQyxFQUFvQixFQUFnQixDQUNuRixHQUFNLEdBQWMsR0FBSyxLQUFLLEVBQW1CLEdBRWpELE1BQUksSUFBRyxTQUFTLEdBQWEsY0FDM0IsR0FBQSxTQUFXLEVBQWEsRUFBbUIsSUFHN0MsR0FBQSxTQUFXLEVBQVEsQ0FBRSxLQUNwQixLQUdMLE1BQU8sR0FBbUIsR0FBa0IsSUFBSSxTQUFBLEVBQU8sQ0FBSSxNQUFBLElBQUssU0FBUyxFQUFrQixLQTFCN0YsR0FBQSxnQkFBQSxxRUNSQSxHQUFZLElBQVosQUFBQSxVQUFZLEVBQVUsQ0FFcEIsRUFBQSxHQUFBLEtBRUEsRUFBQSxpQkFBQSxvQkFFQSxFQUFBLGdCQUFBLGtCQUVBLEVBQUEsaUJBQUEsb0JBRUEsRUFBQSxTQUFBLFlBRUEsRUFBQSxrQkFBQSxxQkFFQSxFQUFBLGdCQUFBLG1CQUVBLEVBQUEsY0FBQSxnQkFFQSxFQUFBLFlBQUEsY0FFQSxFQUFBLGNBQUEsaUJBRUEsRUFBQSxhQUFBLGdCQUVBLEVBQUEsVUFBQSxZQUVBLEVBQUEsY0FBQSxpQkFFQSxFQUFBLG1CQUFBLHNCQUVBLEVBQUEsUUFBQSxVQUVBLEVBQUEsV0FBQSxlQUVBLEVBQUEsU0FBQSxjQWxDVSxHQUFBLEdBQUEsWUFBQSxJQUFBLFdBQVUsS0FzQ3RCLEFBQUEsVUFBaUIsRUFBVSxDQU96QixXQUE2QixFQUFrQixDQUM3QyxHQUFJLEVBQWEsS0FBTyxHQUFjLElBQ3BDLE1BQU8sR0FBVyxHQUdwQixHQUFJLEdBQWMsS0FBTyxFQUFhLElBQ3BDLE9BQVEsT0FDRCxLQUNILE1BQU8sR0FBVyxvQkFDZixLQUNILE1BQU8sR0FBVyxxQkFDZixLQUNILE1BQU8sR0FBVyxhQUNmLEtBQ0gsTUFBTyxHQUFXLGtCQUNmLEtBQ0gsTUFBTyxHQUFXLHVCQUNmLEtBQ0gsTUFBTyxHQUFXLDBCQUVsQixNQUFPLEdBQVcsZ0JBSXhCLEdBQUksR0FBYyxLQUFPLEVBQWEsSUFDcEMsT0FBUSxPQUNELEtBQ0gsTUFBTyxHQUFXLGtCQUNmLEtBQ0gsTUFBTyxHQUFXLGdCQUNmLEtBQ0gsTUFBTyxHQUFXLHlCQUVsQixNQUFPLEdBQVcsY0FJeEIsTUFBTyxHQUFXLGFBckNKLEVBQUEsYUFBWSxJQVBiLEdBQUEsR0FBQSxZQUFBLElBQUEsV0FBVSx1RUN4QzNCLEdBQUEsSUFBQSxLQUdhLEdBQUEsbUJBQXFCLEdBQUksUUFDcEMsNkRBWUYsWUFDRSxFQUVnQixDQUZoQixBQUFBLElBQUEsUUFBQSxHQUFBLEdBQStCLEdBQUEsZ0JBQzVCLGVBQVcsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUNWLG9CQUVKLE1BQU8sQ0FBQyxDQUFDLEdBQVkscUJBQXNCLElBQVcsaUJBQW1CLElBTDNFLEdBQUEsa0JBQUEsR0FlQSxZQUF1QyxFQUFtQixDQUN4RCxHQUFNLEdBQVUsRUFBWSxNQUFNLEdBQUEsb0JBQ2xDLEdBQUksRUFBUyxDQUNYLEdBQUksR0FBYSxPQUNqQixNQUFJLEdBQVEsS0FBTyxJQUNqQixFQUFnQixHQUNQLEVBQVEsS0FBTyxLQUN4QixHQUFnQixJQUVYLENBQ0wsUUFBUyxFQUFRLEdBQ2pCLGNBQWEsRUFDYixhQUFjLEVBQVEsS0FaNUIsR0FBQSx1QkFBQSxHQW1CQSxZQUE0RCxFQUEwQixDQUExQixBQUFBLElBQUEsUUFBQSxHQUFXLEdBQUEseUJBQ3JFLE1BQU8sR0FBQSxHQUFBLEtBQUcsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGNBQVEsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFJLGlCQUQxQixHQUFBLHFCQUFBLEdBUUEsWUFBd0IsRUFBWSxDQUNsQyxNQUFPLEdBQU8sSUFEaEIsR0FBQSxRQUFBLEdBUUEsWUFBd0IsRUFBWSxDQUNsQyxNQUFPLEdBQU8sSUFEaEIsR0FBQSxRQUFBLEdBS0EsR0FBQSxJQUFBLElBQVMsR0FBQSx5QkFBQSxHQUFBLDJGQ3ZFVCxHQUFBLElBQUEsSUFFQSxHQUFBLEtBQ0EsR0FBQSxLQUtBLGFBQTRDLENBQzFDLEdBQUEsMEJBQTBCLENBQ3hCLFNBQVUsR0FDVixLQUFNLFVBRVIsR0FBQSwwQkFBMEIsQ0FDeEIsU0FBVSxHQUNWLEtBQU0sdUJBUFYsR0FBQSw2QkFBQSxHQWNBLGFBQXNCLENBQ3BCLEdBQU0sR0FBb0IsR0FBQSx1QkFDMUIsQUFBSSxHQUNGLElBQUEsT0FBTyxJQUFJLDBCQUEwQixHQUFBLFdBQVcsY0FBYSw0QkFDN0QsRUFBa0IsVUFBVSxHQUFBLFdBQVcsbUZDeEI5QixHQUFBLGtCQUFvQixlQUVwQixHQUFBLGdDQUFrQyxDQUFDLGtCQUFtQixjQUFlLCtGQ0ZsRixHQUFBLElBRUEsR0FBQSxLQVFBLEdBQUEsVUFBQSxDQUtFLFdBQW1CLEVBQXFCLENBQXJCLEFBQUEsSUFBQSxRQUFBLEdBQUEsS0FKWixLQUFBLE1BQWdCLEdBS3JCLEtBQUssUUFBVSxFQVNWLFNBQUEsVUFBQSxJQUFQLFNBQVcsRUFBVSxDQUNuQixBQUFJLEtBQUssTUFBTSxPQUFTLEtBQUssUUFDM0IsRUFBSyxhQUFlLE9BRXBCLEtBQUssTUFBTSxLQUFLLElBR3RCLEtBdEJhLEdBQUEsYUFBQSxHQTJCYixHQUFBLElBQUEsVUFBQSxDQTBFRSxXQUFtQixFQUF5QixDQUMxQyxHQXZFSyxLQUFBLFFBQWtCLEdBQUEsUUFLbEIsS0FBQSxPQUFpQixHQUFBLFFBQVEsVUFBVSxJQW9CbkMsS0FBQSxlQUF5QixHQUFBLGtCQW9CekIsS0FBQSxLQUFxQyxHQU1yQyxLQUFBLEtBQStCLEdBb0JoQyxDQUFDLEVBQ0gsTUFBTyxNQUVULEFBQUksRUFBWSxTQUNkLE1BQUssUUFBVSxFQUFZLFNBRXpCLEVBQVksUUFDZCxNQUFLLE9BQVMsRUFBWSxRQUV4QixFQUFZLGNBQ2QsTUFBSyxhQUFlLEVBQVksY0FHOUIsV0FBYSxJQUNmLE1BQUssUUFBVSxFQUFZLFNBRXpCLEVBQVksSUFDZCxNQUFLLEdBQUssRUFBWSxJQUVwQixFQUFZLGFBQ2QsTUFBSyxZQUFjLEVBQVksYUFFN0IsRUFBWSxNQUNkLE1BQUssS0FBTyxFQUFZLE1BRXRCLEVBQVksTUFDZCxNQUFLLEtBQU8sRUFBWSxNQUV0QixFQUFZLFFBQ2QsTUFBSyxPQUFTLEVBQVksUUFFeEIsRUFBWSxnQkFDZCxNQUFLLGVBQWlCLEVBQVksZ0JBRWhDLEVBQVksY0FDZCxNQUFLLGFBQWUsRUFBWSxjQVE3QixTQUFBLFVBQUEsTUFBUCxTQUNFLEVBQThHLENBRTlHLE1BQU8sTUFBSyxXQUFXLElBTWxCLEVBQUEsVUFBQSxXQUFQLFNBQ0UsRUFBOEcsQ0FFOUcsR0FBTSxHQUFZLEdBQUksR0FBSSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ3JCLEdBQVcsQ0FDZCxhQUFjLEtBQUssT0FDbkIsUUFBUyxLQUFLLFFBQ2QsUUFBUyxLQUFLLFdBR2hCLFNBQVUsYUFBZSxLQUFLLGFBQzFCLEVBQVUsY0FDWixFQUFVLGFBQWEsSUFBSSxHQUc3QixFQUFVLFlBQWMsS0FBSyxZQUV0QixHQU1GLEVBQUEsVUFBQSxPQUFQLFNBQWMsRUFBYSxFQUFnQixPQUN6QyxZQUFLLEtBQUksR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUFRLEtBQUssTUFBSSxHQUFBLEdBQUEsRUFBRyxHQUFNLEVBQUssSUFDakMsTUFPRixFQUFBLFVBQUEsUUFBUCxTQUFlLEVBQWEsRUFBVSxPQUNwQyxZQUFLLEtBQUksR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUFRLEtBQUssTUFBSSxHQUFBLEdBQUEsRUFBRyxHQUFNLEVBQUssSUFDakMsTUFNRixFQUFBLFVBQUEsVUFBUCxTQUFpQixFQUFpQixDQUNoQyxZQUFLLE9BQVMsRUFDUCxNQU1GLEVBQUEsVUFBQSxjQUFQLFNBQXFCLEVBQWtCLENBQ3JDLEtBQUssT0FBTyxtQkFBb0IsT0FBTyxJQUN2QyxHQUFNLEdBQWEsR0FBQSxXQUFXLGFBQWEsR0FDM0MsTUFBSSxLQUFlLEdBQUEsV0FBVyxjQUM1QixLQUFLLFVBQVUsR0FFVixNQU1GLEVBQUEsVUFBQSxVQUFQLFVBQUEsQ0FDRSxNQUFPLE1BQUssU0FBVyxHQUFBLFdBQVcsSUFNN0IsRUFBQSxVQUFBLE9BQVAsU0FBYyxFQUFxQixDQUNqQyxLQUFLLGFBQWUsTUFBTyxJQUFpQixTQUFXLEVBQWUsR0FBQSxtQkFNakUsRUFBQSxVQUFBLGNBQVAsVUFBQSxDQUNFLEdBQUksR0FBZ0IsR0FDcEIsTUFBSSxNQUFLLFVBQVksUUFDbkIsR0FBZ0IsS0FBSyxRQUFVLEtBQU8sTUFFOUIsS0FBSyxRQUFPLElBQUksS0FBSyxPQUFTLEdBTW5DLEVBQUEsVUFBQSxVQUFQLFVBQUEsQ0FDRSxNQUFPLElBQUEsa0JBQWtCLENBQ3ZCLEtBQU0sS0FBSyxLQUNYLFlBQWEsS0FBSyxZQUNsQixhQUFjLEtBQUssYUFDbkIsR0FBSSxLQUFLLEdBQ1QsYUFBYyxLQUFLLGFBQ25CLFFBQVMsS0FBSyxRQUNkLE9BQVEsS0FBSyxPQUNiLGVBQWdCLEtBQUssZUFDckIsT0FBUSxLQUFLLE9BQ2IsS0FBTSxLQUFLLEtBQ1gsUUFBUyxLQUFLLFdBT1gsRUFBQSxVQUFBLGtCQUFQLFNBQXlCLEVBQXdCLGVBQy9DLFlBQUssS0FBSSxHQUFHLEVBQVksS0FBSSxHQUFJLElBQ2hDLEtBQUssWUFBYyxFQUFZLFlBQy9CLEtBQUssYUFBZSxFQUFZLGFBQ2hDLEtBQUssR0FBSyxFQUFZLEdBQ3RCLEtBQUssYUFBZSxFQUFZLGFBQ2hDLEtBQUssUUFBVSxFQUFZLFFBQzNCLEtBQUssT0FBTSxHQUFHLEVBQVksT0FBTSxHQUFJLEtBQUssUUFDekMsS0FBSyxlQUFjLEdBQUcsRUFBWSxlQUFjLEdBQUksS0FBSyxnQkFDekQsS0FBSyxPQUFTLEVBQVksT0FDMUIsS0FBSyxLQUFJLEdBQUcsRUFBWSxLQUFJLEdBQUksSUFDaEMsS0FBSyxRQUFPLEdBQUcsRUFBWSxRQUFPLEdBQUksS0FBSyxTQUVwQyxNQU1GLEVBQUEsVUFBQSxnQkFBUCxVQUFBLENBV0UsTUFBTyxJQUFBLGtCQUFrQixDQUN2QixLQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBUyxFQUFJLEtBQUssS0FBTyxPQUN0RCxZQUFhLEtBQUssWUFDbEIsR0FBSSxLQUFLLEdBQ1QsZUFBZ0IsS0FBSyxhQUNyQixRQUFTLEtBQUssT0FDZCxPQUFRLEtBQUssT0FDYixLQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBUyxFQUFJLEtBQUssS0FBTyxPQUN0RCxTQUFVLEtBQUssV0FPWixFQUFBLFVBQUEsT0FBUCxVQUFBLENBYUUsTUFBTyxJQUFBLGtCQUFrQixDQUN2QixLQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBUyxFQUFJLEtBQUssS0FBTyxPQUN0RCxZQUFhLEtBQUssWUFDbEIsR0FBSSxLQUFLLEdBQ1QsZUFBZ0IsS0FBSyxhQUNyQixRQUFTLEtBQUssT0FDZCxnQkFBaUIsS0FBSyxlQUN0QixPQUFRLEtBQUssT0FDYixLQUFNLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBUyxFQUFJLEtBQUssS0FBTyxPQUN0RCxVQUFXLEtBQUssYUFDaEIsU0FBVSxLQUFLLFdBR3JCLEtBOVNhLEdBQUEsS0FBQSxnRkN2Q2IsR0FBQSxLQUNBLEdBQUEsS0FRQSxHQUFBLElBRUEsR0FBQSxLQUdBLEdBQUEsU0FBQSxFQUFBLENBQWlDLEdBQUEsVUFBQSxFQUFBLEdBcUIvQixXQUFtQixFQUF3QyxFQUFTLENBQXBFLEdBQUEsR0FDRSxFQUFBLEtBQUEsS0FBTSxJQUFtQixLQWpCbkIsU0FBQSxjQUE4QixHQUtyQixFQUFBLEtBQWEsR0FBQSxnQkFjeEIsR0FBQSxhQUFhLEVBQUssR0FBQSxNQUNwQixHQUFLLEtBQU8sR0FHZCxFQUFLLEtBQU8sRUFBbUIsTUFBUSxHQUV2QyxFQUFLLFNBQVcsRUFBbUIsVUFBWSxHQUMvQyxFQUFLLFNBQVcsRUFBbUIsUUFHbkMsRUFBSyxZQUFjLElBTWQsU0FBQSxVQUFBLFFBQVAsU0FBZSxFQUFZLENBQ3pCLEtBQUssS0FBTyxHQU9QLEVBQUEsVUFBQSxpQkFBUCxTQUF3QixFQUFxQixDQUFyQixBQUFBLElBQUEsUUFBQSxHQUFBLEtBQ2pCLEtBQUssY0FDUixNQUFLLGFBQWUsR0FBSSxJQUFBLGFBQWEsSUFFdkMsS0FBSyxhQUFhLElBQUksT0FPakIsRUFBQSxVQUFBLGdCQUFQLFNBQXVCLEVBQTBCLENBQy9DLEtBQUssY0FBYSxHQUFBLFNBQUEsR0FBUSxJQU9yQixFQUFBLFVBQUEsWUFBUCxTQUFtQixFQUFnQyxDQUNqRCxLQUFLLFNBQVEsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUFRLEtBQUssVUFBYSxJQU1sQyxFQUFBLFVBQUEsT0FBUCxTQUFjLEVBQXFCLENBQW5DLEdBQUEsR0FBQSxlQUVFLEdBQUksS0FBSyxlQUFpQixPQVkxQixJQVJLLEtBQUssTUFDUixJQUFBLE9BQU8sS0FBSyx1RUFDWixLQUFLLEtBQU8sMkJBSWQsRUFBQSxVQUFNLE9BQU0sS0FBQSxLQUFDLEdBRVQsS0FBSyxVQUFZLEdBQU0sQ0FFekIsR0FBQSxPQUFPLElBQUksb0ZBRVgsR0FBQSxHQUFBLEdBQUEsS0FBSyxLQUNGLGVBQVcsTUFBQSxJQUFBLE9BQUEsT0FBQSxHQUFBLEdBQ1YsZ0JBQVksTUFBQSxJQUFBLE9BQUEsT0FBQSxHQUFBLEVBQUEsS0FBQSxJQUNiLG1CQUFlLE1BQUEsSUFBQSxRQUFBLEVBQUEsS0FBQSxFQUFHLEdBQUEsUUFBUSxXQUFZLGVBRXpDLE9BR0YsR0FBTSxHQUFnQixLQUFLLGFBQWUsS0FBSyxhQUFhLE1BQU0sT0FBTyxTQUFBLEVBQUMsQ0FBSSxNQUFBLEtBQU0sR0FBUSxFQUFFLGVBQWdCLEdBRTlHLEFBQUksS0FBSyxVQUFZLEVBQWMsT0FBUyxHQUMxQyxNQUFLLGFBQWUsRUFBYyxPQUFPLFNBQUMsRUFBaUIsRUFBa0IsQ0FDM0UsTUFBSSxHQUFLLGNBQWdCLEVBQVEsYUFDeEIsRUFBSyxhQUFlLEVBQVEsYUFBZSxFQUFPLEVBRXBELElBQ04sY0FHTCxHQUFNLEdBQXFCLENBQ3pCLFNBQVUsQ0FDUixNQUFPLEtBQUssbUJBRWQsTUFBTyxFQUNQLGdCQUFpQixLQUFLLGVBQ3RCLEtBQU0sS0FBSyxLQUNYLFVBQVcsS0FBSyxhQUNoQixZQUFhLEtBQUssS0FDbEIsS0FBTSxjQUNOLFdBQVksS0FBSyxVQUdiLEVBQWtCLE9BQU8sS0FBSyxLQUFLLGVBQWUsT0FBUyxFQUVqRSxNQUFJLElBQ0YsSUFBQSxPQUFPLElBQUksb0RBQXFELEtBQUssVUFBVSxLQUFLLGNBQWUsT0FBVyxJQUM5RyxFQUFZLGFBQWUsS0FBSyxlQUdsQyxHQUFBLE9BQU8sSUFBSSx1QkFBdUIsS0FBSyxHQUFFLGlCQUFpQixLQUFLLEtBQUksS0FFNUQsS0FBSyxLQUFLLGFBQWEsS0FNekIsRUFBQSxVQUFBLFVBQVAsVUFBQSxDQUNFLEdBQU0sR0FBYyxFQUFBLFVBQU0sVUFBUyxLQUFBLE1BRW5DLE1BQU8sSUFBQSxrQkFBaUIsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNuQixHQUFXLENBQ2QsS0FBTSxLQUFLLEtBQ1gsUUFBUyxLQUFLLGFBT1gsRUFBQSxVQUFBLGtCQUFQLFNBQXlCLEVBQXNDLE9BQzdELFNBQUEsVUFBTSxrQkFBaUIsS0FBQSxLQUFDLEdBRXhCLEtBQUssS0FBSSxHQUFHLEVBQW1CLEtBQUksR0FBSSxJQUV2QyxLQUFLLFNBQVcsRUFBbUIsUUFFNUIsTUFFWCxHQWpLaUMsR0FBQSxNQUFwQixHQUFBLFlBQUEsZ0ZDWmIsR0FBQSxJQUVBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FFYSxHQUFBLHFCQUF1QixJQUN2QixHQUFBLG1CQUFxQixJQUtsQyxHQUFBLElBQUEsU0FBQSxFQUFBLENBQWlELEdBQUEsVUFBQSxFQUFBLEdBQy9DLFdBQ21CLEVBQ0EsRUFDVixFQUNQLEVBQWUsQ0FEUixBQUFBLElBQUEsUUFBQSxHQUFBLElBSFQsR0FBQSxHQU1FLEVBQUEsS0FBQSxLQUFNLElBQU8sS0FMSSxTQUFBLGNBQUEsRUFDQSxFQUFBLGFBQUEsRUFDVixFQUFBLGtCQUFBLElBU0YsU0FBQSxVQUFBLElBQVAsU0FBVyxFQUFVLENBQXJCLEdBQUEsR0FBQSxLQUdFLEFBQUksRUFBSyxTQUFXLEtBQUssbUJBRXZCLEdBQUssT0FBUyxTQUFDLEVBQXFCLENBQ2xDLEVBQUssYUFBZSxNQUFPLElBQWlCLFNBQVcsRUFBZSxHQUFBLGtCQUN0RSxFQUFLLGFBQWEsRUFBSyxTQUlyQixFQUFLLGVBQWlCLFFBQ3hCLEtBQUssY0FBYyxFQUFLLFNBSTVCLEVBQUEsVUFBTSxJQUFHLEtBQUEsS0FBQyxJQUVkLEdBL0JpRCxHQUFBLGNBQXBDLEdBQUEsNEJBQUEsR0F3Q2IsR0FBQSxJQUFBLFNBQUEsRUFBQSxDQUFxQyxHQUFBLFVBQUEsRUFBQSxHQXFCbkMsV0FDRSxFQUNpQixFQUtBLEVBRUEsRUFBeUIsQ0FGekIsQUFBQSxJQUFBLFFBQUEsR0FBdUIsR0FBQSxzQkFFdkIsSUFBQSxRQUFBLEdBQUEsSUFUbkIsR0FBQSxHQVdFLEVBQUEsS0FBQSxLQUFNLEVBQW9CLElBQVMsS0FUbEIsU0FBQSxTQUFBLEVBS0EsRUFBQSxhQUFBLEVBRUEsRUFBQSxTQUFBLEVBNUJaLEVBQUEsV0FBc0MsR0FNckMsRUFBQSxrQkFBNEIsRUFHNUIsRUFBQSxVQUFxQixHQUVaLEVBQUEsdUJBQWlELEdBcUI1RCxHQUFZLEdBRWQsSUFBdUIsR0FJdkIsR0FBQSxPQUFPLElBQUksK0NBQStDLEVBQUssUUFDL0QsRUFBUyxlQUFlLFNBQUEsRUFBSyxDQUFJLE1BQUEsR0FBTSxRQUFRLE1BR2pELEVBQUssYUFBZSxXQUFXLFVBQUEsQ0FDN0IsQUFBSyxFQUFLLFdBQ1IsRUFBSyxVQUVOLEVBQUssZ0JBSUgsU0FBQSxVQUFBLE9BQVAsU0FBYyxFQUF3QyxTQUF0RCxFQUFBLEtBSUUsR0FKWSxJQUFBLFFBQUEsR0FBdUIsR0FBQSxtQkFDbkMsS0FBSyxVQUFZLEdBQ2pCLEtBQUssV0FBYSxHQUVkLEtBQUssYUFBYyxDQUNyQixHQUFBLE9BQU8sSUFBSSxzQ0FBdUMsR0FBSSxNQUFLLEVBQWUsS0FBTSxjQUFlLEtBQUssUUFFcEcsT0FBdUIsR0FBQSxHQUFBLFNBQUEsS0FBSyx3QkFBc0IsRUFBQSxFQUFBLE9BQUEsQ0FBQSxFQUFBLEtBQUEsRUFBQSxFQUFBLE9BQUUsQ0FBL0MsR0FBTSxHQUFRLEVBQUEsTUFDakIsRUFBUyxLQUFNLHFHQUdqQixLQUFLLGFBQWEsTUFBUSxLQUFLLGFBQWEsTUFBTSxPQUFPLFNBQUMsRUFBVSxDQUVsRSxHQUFJLEVBQUssU0FBVyxFQUFLLE9BQ3ZCLE1BQU8sR0FJVCxBQUFLLEVBQUssY0FDUixHQUFLLGFBQWUsRUFDcEIsRUFBSyxVQUFVLEdBQUEsV0FBVyxXQUMxQixHQUFBLE9BQU8sSUFBSSwwREFBMkQsS0FBSyxVQUFVLEVBQU0sT0FBVyxLQUd4RyxHQUFNLEdBQVcsRUFBSyxlQUFpQixFQUN2QyxNQUFLLElBQ0gsR0FBQSxPQUFPLElBQ0wsNkVBQ0EsS0FBSyxVQUFVLEVBQU0sT0FBVyxJQUc3QixJQUdULEdBQUEsT0FBTyxJQUFJLDBDQUVYLElBQUEsT0FBTyxJQUFJLHVDQUliLE1BQUksTUFBSyxVQUNQLEdBQXVCLEtBQUssVUFHdkIsRUFBQSxVQUFNLE9BQU0sS0FBQSxLQUFDLElBVWYsRUFBQSxVQUFBLDZCQUFQLFNBQW9DLEVBQThCLENBQ2hFLEtBQUssdUJBQXVCLEtBQUssSUFNNUIsRUFBQSxVQUFBLGlCQUFQLFNBQXdCLEVBQWUsQ0FBdkMsR0FBQSxHQUFBLEtBQ0UsR0FBSSxDQUFDLEtBQUssYUFBYyxDQUN0QixHQUFNLEdBQWUsU0FBQyxFQUFVLENBQzlCLEFBQUksRUFBSyxXQUdULEVBQUssY0FBYyxJQUVmLEVBQWMsU0FBQyxFQUFVLENBQzdCLEFBQUksRUFBSyxXQUdULEVBQUssYUFBYSxJQUdwQixLQUFLLGFBQWUsR0FBSSxJQUE0QixFQUFjLEVBQWEsS0FBSyxPQUFRLEdBRzVGLEdBQUEsT0FBTyxJQUFJLHNCQUNYLEtBQUssaUJBRVAsS0FBSyxhQUFhLElBQUksT0FPaEIsRUFBQSxVQUFBLGNBQVIsU0FBc0IsRUFBYyxDQUNsQyxBQUFJLEtBQUssY0FDUCxjQUFhLEtBQUssY0FDbEIsS0FBSyxhQUFlLFFBRXRCLEdBQUEsT0FBTyxJQUFJLDJCQUEyQixHQUN0QyxLQUFLLFdBQVcsR0FBVSxHQUMxQixHQUFBLE9BQU8sSUFBSSxpQ0FBa0MsT0FBTyxLQUFLLEtBQUssWUFBWSxTQU9wRSxFQUFBLFVBQUEsYUFBUixTQUFxQixFQUFjLENBQW5DLEdBQUEsR0FBQSxLQVFFLEdBUEksS0FBSyxXQUFXLElBQ2xCLElBQUEsT0FBTyxJQUFJLHlCQUF5QixHQUVwQyxNQUFPLE1BQUssV0FBVyxHQUN2QixHQUFBLE9BQU8sSUFBSSxpQ0FBa0MsT0FBTyxLQUFLLEtBQUssWUFBWSxTQUd4RSxPQUFPLEtBQUssS0FBSyxZQUFZLFNBQVcsRUFBRyxDQUM3QyxHQUFNLEdBQVUsS0FBSyxhQUdmLEVBQU0sR0FBQSxrQkFBb0IsRUFBVSxJQUUxQyxXQUFXLFVBQUEsQ0FDVCxBQUFLLEVBQUssV0FDUixHQUFLLE9BQU8sR0FBQSxrQkFBbUIsR0FBQSxnQ0FBZ0MsSUFDL0QsRUFBSyxPQUFPLEtBRWIsS0FRQyxFQUFBLFVBQUEsTUFBUixVQUFBLENBRUUsR0FBSSxNQUFLLFVBSVQsSUFBTSxHQUFrQixPQUFPLEtBQUssS0FBSyxZQUFZLEtBQUssSUFFMUQsQUFBSSxJQUFvQixLQUFLLHFCQUMzQixLQUFLLG1CQUFxQixFQUUxQixLQUFLLGtCQUFvQixFQUczQixLQUFLLHFCQUF1QixFQUU1QixBQUFJLEtBQUssbUJBQXFCLEVBQzVCLElBQUEsT0FBTyxJQUFJLHlFQUNYLEtBQUssVUFBVSxHQUFBLFdBQVcsa0JBQzFCLEtBQUssT0FBTyxHQUFBLGtCQUFtQixHQUFBLGdDQUFnQyxJQUMvRCxLQUFLLFVBRUwsS0FBSyxtQkFPRCxFQUFBLFVBQUEsZUFBUixVQUFBLENBQUEsR0FBQSxHQUFBLEtBQ0UsR0FBQSxPQUFPLElBQUkseUNBQXlDLEtBQUssbUJBQ3pELFdBQVcsVUFBQSxDQUNULEVBQUssU0FDSixHQUFBLHFCQUVQLEdBek5xQyxHQUFBLGFBQXhCLEdBQUEsZ0JBQUEsR0E4TmIsWUFBZ0MsRUFBUyxDQUN2QyxHQUFJLEVBQUssQ0FDUCxHQUFNLEdBQVEsRUFBSSxXQUNsQixHQUFJLEVBQU8sQ0FDVCxHQUFNLEdBQWMsRUFBTSxpQkFDMUIsQUFBSSxHQUNGLEVBQU0sUUFBUSw2RkMzUnRCLEdBQUEsS0FDQSxHQUFBLEtBU0EsR0FBQSxJQUVBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FHQSxhQUFxQixDQUNuQixHQUFNLEdBQVEsS0FBSyxXQUNuQixHQUFJLEVBQU8sQ0FDVCxHQUFNLEdBQU8sRUFBTSxVQUNuQixHQUFJLEVBQ0YsTUFBTyxDQUNMLGVBQWdCLEVBQUssaUJBSTNCLE1BQU8sR0FlVCxZQUF1QyxFQUFnQixFQUFrQixFQUFnQyxDQUV2RyxHQUFJLENBQUMsR0FBQSxrQkFBa0IsR0FDckIsU0FBWSxRQUFVLEdBQ2YsRUFJVCxHQUFJLEVBQVksVUFBWSxPQUMxQixTQUFZLFlBQVksQ0FDdEIsb0JBQXFCLENBQUUsT0FBUSxHQUFBLDBCQUEwQixZQUVwRCxFQUtULEdBQUksR0E0QkosTUEzQkEsQUFBSSxPQUFPLEdBQVEsZUFBa0IsV0FDbkMsR0FBYSxFQUFRLGNBQWMsR0FDbkMsRUFBWSxZQUFZLENBQ3RCLG9CQUFxQixDQUNuQixPQUFRLEdBQUEsMEJBQTBCLFFBRWxDLEtBQU0sT0FBTyxPQUdaLEFBQUksRUFBZ0IsZ0JBQWtCLE9BQzNDLEdBQWEsRUFBZ0IsY0FDN0IsRUFBWSxZQUFZLENBQ3RCLG9CQUFxQixDQUFFLE9BQVEsR0FBQSwwQkFBMEIsZ0JBRzNELEdBQWEsRUFBUSxpQkFDckIsRUFBWSxZQUFZLENBQ3RCLG9CQUFxQixDQUNuQixPQUFRLEdBQUEsMEJBQTBCLEtBRWxDLEtBQU0sT0FBTyxPQU9mLEFBQUMsR0FBa0IsR0FPbEIsRUFjTCxHQUFZLFFBQVUsS0FBSyxTQUFZLEVBR25DLEFBQUMsRUFBWSxRQVNqQixJQUFBLE9BQU8sSUFBSSxzQkFBc0IsRUFBWSxHQUFFLGtCQUFrQixFQUFZLE1BQ3RFLEdBVEwsSUFBQSxPQUFPLElBQ0wsb0dBQW9HLE9BQ2xHLEdBQ0QsS0FFSSxJQXRCUCxJQUFBLE9BQU8sSUFDTCw0Q0FDRSxPQUFPLEdBQVEsZUFBa0IsV0FDN0Isb0NBQ0EsK0VBR1IsRUFBWSxRQUFVLEdBQ2YsR0FmUCxJQUFBLE9BQU8sS0FBSyxvRUFDWixFQUFZLFFBQVUsR0FDZixHQXFDWCxZQUEyQixFQUFhLENBR3RDLE1BQUksT0FBTSxJQUFnQixDQUFFLE9BQU8sSUFBUyxVQUFZLE1BQU8sSUFBUyxXQUN0RSxJQUFBLE9BQU8sS0FDTCwwR0FBMEcsS0FBSyxVQUM3RyxHQUNELFlBQVksS0FBSyxVQUFVLE1BQU8sSUFBSyxLQUVuQyxJQUlMLEVBQU8sR0FBSyxFQUFPLEVBQ3JCLElBQUEsT0FBTyxLQUFLLG9GQUFvRixFQUFJLEtBQzdGLElBRUYsR0FrQlQsWUFFRSxFQUNBLEVBQTZDLFNBRXZDLEVBQVUsSUFBQSxLQUFLLGVBQVcsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGVBQWdCLEdBRTlDLEVBQWMsR0FBSSxJQUFBLFlBQVksRUFBb0IsTUFDdEQsU0FBYyxHQUFPLEVBQWEsRUFBTyxHQUFBLFNBQUEsQ0FDdkMsY0FBZSxFQUFtQixjQUNsQyxtQkFBa0IsR0FDZixJQUVELEVBQVksU0FDZCxFQUFZLGlCQUFpQixHQUFBLEVBQVEsZ0JBQVksTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFVBRTlDLEVBTVQsWUFDRSxFQUNBLEVBQ0EsRUFDQSxFQUNBLEVBQTZDLFNBRXZDLEVBQVUsSUFBQSxFQUFJLGVBQVcsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGVBQWdCLEdBRTdDLEVBQWMsR0FBSSxJQUFBLGdCQUFnQixFQUFvQixFQUFLLEVBQWEsR0FDNUUsU0FBYyxHQUFPLEVBQWEsRUFBTyxHQUFBLFNBQUEsQ0FDdkMsY0FBZSxFQUFtQixjQUNsQyxtQkFBa0IsR0FDZixJQUVELEVBQVksU0FDZCxFQUFZLGlCQUFpQixHQUFBLEVBQVEsZ0JBQVksTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFVBRTlDLEVBbEJULEdBQUEscUJBQUEsR0F3QkEsYUFBcUMsQ0FDbkMsR0FBTSxHQUFVLEdBQUEsaUJBQ2hCLEFBQUksQ0FBQyxFQUFRLFlBR2IsR0FBUSxXQUFXLFdBQWEsRUFBUSxXQUFXLFlBQWMsR0FDNUQsRUFBUSxXQUFXLFdBQVcsa0JBQ2pDLEdBQVEsV0FBVyxXQUFXLGlCQUFtQixJQUU5QyxFQUFRLFdBQVcsV0FBVyxjQUNqQyxHQUFRLFdBQVcsV0FBVyxhQUFlLEtBVmpELEdBQUEsc0JBQUEsR0FpQkEsYUFBc0MsQ0FDcEMsR0FBTSxHQUFVLEdBQUEsaUJBQ2hCLEdBQUksRUFBQyxFQUFRLFdBSWIsSUFBTSxHQUFpRSxDQUNyRSxRQUFBLFVBQUEsQ0FDRSxHQUFNLEdBQWMsR0FBQSxlQUFlLEdBQVEsNkJBRzNDLE1BQU8sSUFBSSxHQUFZLE9BRXpCLFNBQUEsVUFBQSxDQUNFLEdBQU0sR0FBYyxHQUFBLGVBQWUsR0FBUSw2QkFHM0MsTUFBTyxJQUFJLEdBQVksTUFBTSxDQUFFLFNBQVUsTUFFM0MsTUFBQSxVQUFBLENBQ0UsR0FBTSxHQUFjLEdBQUEsZUFBZSxHQUFRLDZCQUczQyxNQUFPLElBQUksR0FBWSxPQUV6QixHQUFBLFVBQUEsQ0FDRSxHQUFNLEdBQWMsR0FBQSxlQUFlLEdBQVEsZ0NBRzNDLE1BQU8sSUFBSSxHQUFZLFdBSXJCLEVBQWlCLE9BQU8sS0FBSyxHQUNoQyxPQUFPLFNBQUEsRUFBVSxDQUFJLE1BQUEsQ0FBQyxDQUFDLEdBQUEsV0FBVyxLQUNsQyxJQUFJLFNBQUEsRUFBRyxDQUNOLEdBQUksQ0FDRixNQUFPLEdBQTRCLFVBQ25DLENBQ0EsVUFHSCxPQUFPLFNBQUEsRUFBQyxDQUFJLE1BQUEsS0FFZixBQUFJLEVBQWUsT0FBUyxHQUMxQixHQUFRLFdBQVcsYUFBWSxHQUFBLFNBQVEsRUFBUSxXQUFXLGNBQWdCLEdBQVEsS0FPdEYsYUFBbUMsQ0FDakMsS0FHSSxHQUFBLGFBQ0YsS0FJRixHQUFBLCtCQVRGLEdBQUEsb0JBQUEsZ0ZDclJBLEdBQUEsSUFrREEsR0FBQSxVQUFBLENBb0JFLFdBQW1CLEVBQW1FLENBQW5FLEFBQUEsSUFBQSxRQUFBLEdBQUEsSUFYWixLQUFBLEtBQWUsRUFBUSxHQVk1QixLQUFLLFFBQVUsRUFBUSxRQUFVLEVBQVEsSUFDekMsS0FBSyxTQUFZLE9BQU0sUUFBUSxFQUFRLFNBQVcsRUFBUSxRQUFVLElBQUksT0FBTyxPQU0xRSxTQUFBLFVBQUEsVUFBUCxVQUFBLENBQ0UsR0FBSSxDQUFDLEtBQUssUUFBUyxDQUNqQixHQUFBLE9BQU8sTUFBTSxxREFDYixPQUVGLEdBQXNCLEtBQUssUUFBUyxLQUFLLFdBN0I3QixFQUFBLEdBQWEsVUErQjdCLEtBbkNhLEdBQUEsUUFBQSxHQW9EYixZQUFjLEVBQWMsRUFBYyxDQUN4QyxHQUFNLEdBQVEsRUFBRyxPQUVqQixPQUFRLE9BQ0QsR0FDSCxNQUFPLFVBQThCLEVBQWMsRUFBNEMsQ0FDN0YsR0FBTSxHQUFjLEVBQUkscUJBQ3hCLEdBQUksRUFBYSxDQUNmLEdBQU0sR0FBTyxFQUFZLFdBQVcsQ0FDbEMsWUFBYSxFQUFHLEtBQ2hCLEdBQUksc0JBQXNCLElBRTVCLEVBQUksS0FBSyxTQUFVLFVBQUEsQ0FDakIsRUFBSyxXQUdULE1BQU8sR0FBRyxLQUFLLEtBQU0sRUFBSyxRQUd6QixHQUNILE1BQU8sVUFFTCxFQUNBLEVBQ0EsRUFBZ0IsT0FFVixFQUFjLEVBQUkscUJBQ2xCLEVBQUksR0FBRyxLQUFXLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxXQUFXLENBQ25DLFlBQWEsRUFBRyxLQUNoQixHQUFJLHNCQUFzQixJQUU1QixFQUFHLEtBQUssS0FBTSxFQUFLLEVBQUssVUFBQSxRQUE4QixHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsVUFBQSxPQUFBLElBQUEsRUFBQSxHQUFBLFVBQUEsU0FDcEQsQUFBQSxHQUFBLEtBQUksTUFBQSxJQUFBLFFBQUEsRUFBRSxTQUNOLEVBQUssS0FBSSxNQUFULEVBQUksR0FBQSxTQUFBLENBQU0sTUFBUyxXQUlwQixHQUNILE1BQU8sVUFFTCxFQUNBLEVBQ0EsRUFDQSxFQUFnQixPQUVWLEVBQWMsRUFBSSxxQkFDbEIsRUFBSSxHQUFHLEtBQVcsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFdBQVcsQ0FDbkMsWUFBYSxFQUFHLEtBQ2hCLEdBQUksc0JBQXNCLElBRTVCLEVBQUcsS0FBSyxLQUFNLEVBQUssRUFBSyxFQUFLLFVBQUEsUUFBOEIsR0FBQSxHQUFBLEVBQUEsRUFBQSxFQUFBLFVBQUEsT0FBQSxJQUFBLEVBQUEsR0FBQSxVQUFBLFNBQ3pELEFBQUEsR0FBQSxLQUFJLE1BQUEsSUFBQSxRQUFBLEVBQUUsU0FDTixFQUFLLEtBQUksTUFBVCxFQUFJLEdBQUEsU0FBQSxDQUFNLE1BQVMsZUFLdkIsS0FBTSxJQUFJLE9BQU0sZ0RBQWdELElBZXRFLFlBQTRCLEVBQWlCLEVBQWMsQ0FDekQsTUFBTyxHQUFLLElBQUksU0FBQyxFQUFZLENBQzNCLE1BQUksT0FBTyxJQUFRLFdBQ1YsR0FBSyxFQUFLLEdBR2YsTUFBTSxRQUFRLEdBQ1QsRUFBSSxJQUFJLFNBQUMsRUFBVSxDQUN4QixNQUFJLE9BQU8sSUFBTSxXQUNSLEdBQUssRUFBRyxHQUVWLElBSUosSUFPWCxZQUF5QixFQUFnQixFQUFjLENBQ3JELEdBQU0sR0FBbUIsRUFBTyxHQUVoQyxTQUFPLEdBQVUsVUFBQSxRQUFTLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxVQUFBLE9BQUEsSUFBQSxFQUFBLEdBQUEsVUFBQSxHQUN4QixNQUFPLEdBQWlCLEtBQUksTUFBckIsRUFBZ0IsR0FBQSxTQUFBLENBQU0sTUFBUyxHQUFtQixFQUFNLE1BRzFELEVBTVQsWUFBK0IsRUFBZ0IsRUFBc0IsQ0FBdEIsQUFBQSxJQUFBLFFBQUEsR0FBQSxJQUM3QyxFQUFRLFFBQVEsU0FBQyxFQUFjLENBQUssTUFBQSxJQUFnQixFQUFRLHdFQ2pOOUQsR0FBQSxJQUFBLElBYUEsR0FBQSxVQUFBLENBYUUsV0FBbUIsRUFBdUIsQ0FBdkIsQUFBQSxJQUFBLFFBQUEsR0FBQSxJQUpaLEtBQUEsS0FBZSxFQUFTLEdBSzdCLEtBQUssYUFBZSxDQUFDLENBQUMsRUFBUSxZQU16QixTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUF1QyxFQUF3QixPQUN4RSxFQUFNLEdBQUEsV0FBK0QsTUFFM0UsR0FBSSxDQUFDLEVBQUssQ0FDUixHQUFBLE9BQU8sTUFBTSw0REFDYixPQUdGLEdBQUksS0FBSyxjQUFnQixDQUFBLElBQUMsRUFBSSxVQUFNLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxRQUFRLENBQzVDLEdBQUEsT0FBTyxNQUFNLG1FQUNiLE9BR00sR0FBQSxHQUFBLE1BQUEsYUFBQSxFQUFBLE9BQUEsR0FBQSxPQVNSLEdBQUEsS0FBSyxFQUFPLFVBQVcsUUFBUyxTQUFTLEVBQW1DLENBQzFFLE1BQU8sVUFBd0IsRUFBaUIsRUFBaUIsRUFBaUIsV0FDMUUsRUFBUSxJQUFnQixXQUN4QixFQUFVLEdBQUcsS0FBSyxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsVUFDcEIsRUFBSSxHQUFHLEtBQVUsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFdBQVcsQ0FDbEMsWUFBYSxNQUFPLElBQVcsU0FBVyxFQUFVLEVBQTRCLEtBQ2hGLEdBQUksT0FHTixHQUFJLE1BQU8sSUFBYSxXQUN0QixNQUFPLEdBQUssS0FBSyxLQUFNLEVBQVEsRUFBUSxTQUFTLEVBQVksRUFBZSxPQUN6RSxBQUFBLEdBQUEsS0FBSSxNQUFBLElBQUEsUUFBQSxFQUFFLFNBQ04sRUFBUyxFQUFLLEtBSWxCLEdBQUksTUFBTyxJQUFXLFdBQ3BCLE1BQU8sR0FBSyxLQUFLLEtBQU0sRUFBUSxTQUFTLEVBQVksRUFBZSxPQUNqRSxBQUFBLEdBQUEsS0FBSSxNQUFBLElBQUEsUUFBQSxFQUFFLFNBQ04sRUFBTyxFQUFLLEtBSWhCLEdBQU0sR0FBSyxNQUFPLElBQVcsWUFBYyxFQUFLLEtBQUssS0FBTSxFQUFRLEdBQVUsRUFBSyxLQUFLLEtBQU0sR0FFN0YsTUFBSSxJQUFBLFdBQVcsR0FDTCxFQUF3QixLQUFLLFNBQUMsRUFBWSxPQUNoRCxNQUFBLEdBQUEsS0FBSSxNQUFBLElBQUEsUUFBQSxFQUFFLFNBQ0MsSUFJWCxJQUFBLEtBQUksTUFBQSxJQUFBLFFBQUEsRUFBRSxTQUNDLE9BdkVDLEVBQUEsR0FBYSxXQTJFN0IsS0EvRWEsR0FBQSxTQUFBLHFFQ2JiLEdBQUEsSUFBQSxJQU9BLEdBQUEsVUFBQSxDQUFBLFlBQUEsQ0FTUyxLQUFBLEtBQWUsRUFBTSxHQUtyQixTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUF1QyxFQUF3QixDQUM5RSxHQUFNLEdBQU0sR0FBQSxXQUE0QiwyQkFFeEMsR0FBSSxDQUFDLEVBQUssQ0FDUixHQUFBLE9BQU8sTUFBTSw0REFDYixPQU9GLEdBQUEsS0FBSyxFQUFLLGNBQWUsU0FBUyxFQUFnQixDQUNoRCxNQUFPLFVBQXdCLEVBQWtCLEVBQWlCLEVBQWlCLFNBQzNFLEVBQVEsSUFBZ0IsV0FDeEIsRUFBVSxHQUFHLEtBQUssTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFVBQ3BCLEVBQUksR0FBRyxLQUFVLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxXQUFXLENBQ2xDLFlBQWEsTUFBTyxJQUFZLFNBQVcsRUFBVyxFQUE0QixJQUNsRixHQUFJLE9BR04sTUFBSSxPQUFPLElBQWEsV0FDZixFQUFLLEtBQUssS0FBTSxFQUFTLEVBQVEsU0FBUyxFQUFZLEVBQWlCLEVBQWUsT0FDM0YsQUFBQSxHQUFBLEtBQUksTUFBQSxJQUFBLFFBQUEsRUFBRSxTQUNOLEVBQVMsRUFBSyxFQUFRLEtBSXRCLE1BQU8sSUFBVyxXQUNiLEVBQUssS0FBSyxLQUFNLEVBQVMsU0FBUyxFQUFZLEVBQWlCLEVBQWUsT0FDbkYsQUFBQSxHQUFBLEtBQUksTUFBQSxJQUFBLFFBQUEsRUFBRSxTQUNOLEVBQU8sRUFBSyxFQUFRLEtBSWpCLEVBQUssS0FBSyxLQUFNLEVBQVMsRUFBUSxPQTdDaEMsRUFBQSxHQUFhLFFBaUQ3QixLQXJEYSxHQUFBLE1BQUEsZ0ZDUGIsR0FBQSxJQU1NLEdBQWEsQ0FDakIsWUFDQSxZQUNBLGlCQUNBLGNBQ0EsZ0JBQ0EsYUFDQSxZQUNBLFdBQ0EsT0FDQSxZQUNBLGNBQ0EseUJBQ0EsT0FDQSxVQUNBLG1CQUNBLG9CQUNBLG1CQUNBLFVBQ0EsY0FDQSxtQkFDQSwwQkFDQSxhQUNBLFlBQ0EsV0FDQSxZQUNBLFVBQ0EseUJBQ0EsU0FDQSxhQUNBLFFBQ0EsYUFDQSxhQU9JLEdBRUYsQ0FHRixVQUFXLENBQUMsY0FDWixlQUFnQixDQUFDLFNBQ2pCLFlBQWEsQ0FBQyxlQUNkLGNBQWUsQ0FBQyxjQUNoQixXQUFZLENBQUMsVUFDYixVQUFXLENBQUMsVUFDWixTQUFVLENBQUMsTUFBTyxTQUNsQixVQUFXLENBQUMsYUFDWixLQUFNLENBQUMsU0FDUCxRQUFTLENBQUMsU0FDVixpQkFBa0IsQ0FBQyxVQUNuQixrQkFBbUIsQ0FBQyxTQUFVLGVBQzlCLGlCQUFrQixDQUFDLFNBQVUsVUFDN0IsWUFBYSxDQUFDLFdBQ2QsV0FBWSxDQUFDLFFBQ2IsVUFBVyxDQUFDLE9BQ1osVUFBVyxDQUFDLE1BQU8sVUFDbkIsT0FBUSxDQUFDLFdBQ1QsV0FBWSxDQUFDLFNBQVUsT0FDdkIsV0FBWSxDQUFDLFNBQVUsVUFDdkIsVUFBVyxDQUFDLFNBQVUsV0FtQnhCLEdBQUEsVUFBQSxDQWtCRSxXQUFtQixFQUEwQixDQUExQixBQUFBLElBQUEsUUFBQSxHQUFBLElBVFosS0FBQSxLQUFlLEVBQU0sR0FVMUIsS0FBSyxZQUFjLE1BQU0sUUFBUSxFQUFRLFlBQ3JDLEVBQVEsV0FDTixHQUNOLEtBQUssb0JBQXNCLHNCQUF3QixHQUFVLEVBQVEsbUJBQXFCLEdBQzFGLEtBQUssYUFBZSxDQUFDLENBQUMsRUFBUSxZQU16QixTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUF1QyxFQUF3QixDQUM5RSxHQUFNLEdBQWEsS0FBSyxhQUFlLFdBQWEsVUFDOUMsRUFBTSxHQUFBLFdBQTRDLEdBRXhELEdBQUksQ0FBQyxFQUFLLENBQ1IsR0FBQSxPQUFPLE1BQU0sNENBQTZDLEVBQVUsY0FDcEUsT0FHRixLQUFLLHNCQUFzQixFQUFJLFdBQVksS0FBSyxZQUFhLElBTXZELEVBQUEsVUFBQSxzQkFBUixTQUE4QixFQUE2QixFQUF5QixFQUF3QixDQUE1RyxHQUFBLEdBQUEsS0FDRSxFQUFXLFFBQVEsU0FBQyxFQUFvQixDQUFLLE1BQUEsR0FBSyxnQkFBZ0IsRUFBWSxFQUFXLE1BTW5GLEVBQUEsVUFBQSxnQkFBUixTQUF3QixFQUE2QixFQUFzQixFQUF3QixDQUNqRyxHQUFNLElBQWEsR0FBVyxVQUU5QixJQUFNLEdBQWlCLEtBQUssc0NBQXNDLEtBQUssTUFFdkUsR0FBQSxLQUFLLEVBQVcsVUFBVyxFQUFXLFNBQVMsRUFBbUMsQ0FDaEYsTUFBTyxXQUFBLFFBQXdCLEdBQUEsR0FBQSxFQUFBLEVBQUEsRUFBQSxVQUFBLE9BQUEsSUFBQSxFQUFBLEdBQUEsVUFBQSxlQUN2QixFQUFVLEVBQUssRUFBSyxPQUFTLEdBQzdCLEVBQVEsSUFBZ0IsV0FDeEIsRUFBVSxHQUFHLEtBQUssTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFVBSTFCLEdBQUksTUFBTyxJQUFZLFlBQWUsSUFBYyxhQUFlLEVBQUssU0FBVyxFQUFJLENBQ3JGLEdBQU0sR0FBSSxHQUFHLEtBQVUsTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLFdBQVcsRUFBZSxLQUFNLEVBQVcsSUFDOUQsRUFBZSxFQUFLLEtBQUksTUFBVCxFQUFJLEdBQUEsU0FBQSxDQUFNLE1BQVMsSUFFeEMsTUFBSSxJQUFBLFdBQVcsR0FDTixFQUFhLEtBQUssU0FBQyxFQUFZLE9BQ3BDLE1BQUEsR0FBQSxLQUFJLE1BQUEsSUFBQSxRQUFBLEVBQUUsU0FDQyxJQUdULElBQUEsS0FBSSxNQUFBLElBQUEsUUFBQSxFQUFFLFNBQ0MsR0FJWCxHQUFNLEdBQUksR0FBRyxLQUFVLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxXQUFXLEVBQWUsS0FBTSxFQUFXLEVBQUssTUFBTSxFQUFHLE1BQ2xGLE1BQU8sR0FBSyxLQUFJLE1BQVQsRUFBSSxHQUFBLFNBQUEsQ0FBTSxNQUFTLEVBQUssTUFBTSxFQUFHLElBQUcsQ0FBRSxTQUFTLEVBQVksRUFBZSxRQUMvRSxBQUFBLElBQUEsS0FBSSxNQUFBLEtBQUEsUUFBQSxHQUFFLFNBQ04sRUFBUSxFQUFLLFlBU2IsRUFBQSxVQUFBLHNDQUFSLFNBQ0UsRUFDQSxFQUNBLEVBQWUsQ0FFZixHQUFNLEdBQWtDLENBQ3RDLGVBQWdCLEVBQVcsZUFDM0IsT0FBUSxFQUFXLE9BQ25CLFVBQVcsRUFBVyxXQUVsQixFQUEyQixDQUMvQixHQUFJLEtBQ0osWUFBYSxFQUNiLEtBQUksR0FLQSxFQUFZLEdBQXFCLEdBQ2pDLEVBQWlCLE1BQU0sUUFBUSxLQUFLLHFCQUN0QyxLQUFLLG9CQUFvQixTQUFTLEdBQ2xDLEtBQUssb0JBRVQsR0FBSSxDQUFDLEdBQWEsQ0FBQyxFQUNqQixNQUFPLEdBR1QsR0FBSSxDQUVGLEdBQUksSUFBYyxZQUFhLENBQ3ZCLEdBQUEsR0FBQSxHQUFBLE9BQUEsRUFBQSxHQUFDLEVBQUEsRUFBQSxHQUFLLEVBQUEsRUFBQSxHQUNaLEVBQUssRUFBVSxJQUFNLE1BQU8sSUFBUSxTQUFXLEVBQU0sRUFBSSxNQUFRLGNBQ2pFLEVBQUssRUFBVSxJQUFNLE1BQU8sSUFBVyxTQUFXLEVBQVMsRUFBTyxNQUFRLGtCQUUxRSxRQUFTLEdBQUksRUFBRyxFQUFJLEVBQVUsT0FBUSxJQUNwQyxFQUFLLEVBQVUsSUFBTSxLQUFLLFVBQVUsRUFBSyxTQUc3QyxFQUlGLE1BQU8sSUFqSUssRUFBQSxHQUFhLFFBbUk3QixLQXZJYSxHQUFBLE1BQUEscUVDM0ZiLEdBQUEsSUFBQSxJQUVBLEdBQUEsS0FFQSxHQUFBLEtBQ0EsR0FBQSxLQUVNLEdBQVMsR0FBQSxrQkFNZixhQUE4QyxDQUM1QyxBQUFJLElBQVUsR0FBTyxTQUNuQixHQUFPLFNBQVMsaUJBQWlCLG1CQUFvQixVQUFBLENBQ25ELEdBQU0sR0FBb0IsR0FBQSx1QkFDMUIsQUFBSSxHQUFPLFNBQVMsUUFBVSxHQUM1QixJQUFBLE9BQU8sSUFDTCwwQkFBMEIsR0FBQSxXQUFXLFVBQVMsOENBQThDLEVBQWtCLElBSTNHLEVBQWtCLFFBQ3JCLEVBQWtCLFVBQVUsR0FBQSxXQUFXLFdBRXpDLEVBQWtCLE9BQU8sbUJBQW9CLG1CQUM3QyxFQUFrQixPQUFPLEdBQUEsa0JBQW1CLEdBQUEsZ0NBQWdDLElBQzVFLEVBQWtCLFlBSXRCLEdBQUEsT0FBTyxLQUFLLHNGQW5CaEIsR0FBQSwrQkFBQSxLQ2JBLGdFQWtCYSxHQUFBLGFBQWUsU0FDMUIsRUFDQSxFQUNBLEVBQTBCLENBRTFCLEdBQUksR0FDSixNQUFPLFVBQUMsRUFBcUIsQ0FDM0IsQUFBSSxFQUFPLE9BQVMsR0FDZCxJQUFlLElBQ2pCLEdBQU8sTUFBUSxFQUFPLE1BQVMsSUFBYSxHQU14QyxHQUFPLE9BQVMsSUFBYyxTQUNoQyxHQUFZLEVBQU8sTUFDbkIsRUFBUyxTQ25DbkIsZ0VBcUJhLEdBQUEsaUJBQW1CLFVBQUEsQ0FDOUIsTUFBTyxNQUFNLEtBQUssTUFBSyxJQUFJLE1BQUssTUFBTSxLQUFLLFNBQVksTUFBTyxJQUFNLFNDdEJ0RSxnRUFpQkEsR0FBQSxJQUFBLEtBRWEsR0FBQSxXQUFhLFNBQUMsRUFBc0IsRUFBYyxDQUM3RCxNQUFPLENBQ0wsS0FBSSxFQUNKLE1BQU8sR0FBUyxHQUNoQixNQUFPLEVBQ1AsUUFBUyxHQUNULEdBQUksR0FBQSx1QkN6QlIsZ0VBNEJhLEdBQUEsUUFBVSxTQUFDLEVBQWMsRUFBaUMsQ0FDckUsR0FBSSxDQUNGLEdBQUksb0JBQW9CLG9CQUFvQixTQUFTLEdBQU8sQ0FHMUQsR0FBSSxJQUFTLGVBQWlCLENBQUUsMkJBQTRCLE9BQzFELE9BR0YsR0FBTSxHQUEwQixHQUFJLHFCQUFvQixTQUFBLEVBQUMsQ0FBSSxNQUFBLEdBQUUsYUFBYSxJQUFJLEtBRWhGLFNBQUcsUUFBUSxDQUFFLEtBQUksRUFBRSxTQUFVLEtBQ3RCLFFBRVQsTUMxQ0osZ0VBZ0JBLEdBQUEsSUFBQSxJQU1hLEdBQUEsU0FBVyxTQUFDLEVBQXNCLEVBQWMsQ0FDM0QsR0FBTSxHQUFxQixTQUFDLEVBQVksQ0FDdEMsQUFBSSxHQUFNLE9BQVMsWUFBYyxHQUFBLGtCQUEwQixTQUFTLGtCQUFvQixXQUN0RixHQUFHLEdBQ0MsR0FDRixxQkFBb0IsbUJBQW9CLEVBQW9CLElBQzVELG9CQUFvQixXQUFZLEVBQW9CLE9BSTFELGlCQUFpQixtQkFBb0IsRUFBb0IsSUFHekQsaUJBQWlCLFdBQVksRUFBb0IsT0NuQ25ELGdFQWdCQSxHQUFBLElBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FpQmEsR0FBQSxPQUFTLFNBQUMsRUFBeUIsRUFBMEIsQ0FDeEUsR0FBTSxHQUFTLEdBQUEsV0FBVyxNQUFPLEdBQzdCLEVBRUEsRUFBZSxFQUNmLEVBQXFDLEdBRW5DLEVBQWUsU0FBQyxFQUFrQixDQUd0QyxHQUFJLEdBQVMsQ0FBQyxFQUFNLGVBQWdCLENBQ2xDLEdBQU0sR0FBb0IsRUFBZSxHQUNuQyxFQUFtQixFQUFlLEVBQWUsT0FBUyxHQUtoRSxBQUNFLEdBQ0EsRUFBZSxTQUFXLEdBQzFCLEVBQU0sVUFBWSxFQUFpQixVQUFZLEtBQy9DLEVBQU0sVUFBWSxFQUFrQixVQUFZLElBRWhELElBQWdCLEVBQU0sTUFDdEIsRUFBZSxLQUFLLElBRXBCLEdBQWUsRUFBTSxNQUNyQixFQUFpQixDQUFDLElBS2hCLEVBQWUsRUFBTyxPQUN4QixHQUFPLE1BQVEsRUFDZixFQUFPLFFBQVUsRUFDYixHQUNGLE9BTUYsRUFBSyxHQUFBLFFBQVEsZUFBZ0IsR0FDbkMsQUFBSSxHQUNGLEdBQVMsR0FBQSxhQUFhLEVBQVUsRUFBUSxHQUV4QyxHQUFBLFNBQVMsVUFBQSxDQUNQLEVBQUcsY0FBYyxJQUFJLEdBQ3JCLEVBQU8sVUNwRmIsZ0VBZ0JBLEdBQUEsSUFBQSxJQUVBLEdBQUEsS0FFSSxHQUFrQixHQUVoQixHQUFpQixVQUFBLENBQ3JCLE1BQU8sSUFBQSxrQkFBMEIsU0FBUyxrQkFBb0IsU0FBVyxFQUFJLEtBR3pFLEdBQWUsVUFBQSxDQUVuQixHQUFBLFNBQVMsU0FBQyxFQUFhLElBQVgsR0FBQSxFQUFBLFVBQ1YsR0FBa0IsR0FDakIsS0FHUSxHQUFBLHFCQUF1QixVQUFBLENBR2xDLE1BQUksSUFBa0IsR0FLcEIsSUFBa0IsS0FDbEIsTUFFSyxJQUNELGtCQUFlLENBQ2pCLE1BQU8sU0M5Q2IsZ0VBZ0JBLEdBQUEsSUFBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FHYSxHQUFBLE9BQVMsU0FBQyxFQUF5QixFQUEwQixDQUN4RSxHQUFNLEdBQW9CLEdBQUEsdUJBQ3BCLEVBQVMsR0FBQSxXQUFXLE9BQ3RCLEVBRUUsRUFBZSxTQUFDLEVBQTZCLENBRWpELEFBQUksR0FBVSxFQUFNLFVBQVksRUFBa0IsaUJBQ2hELEdBQU8sTUFBUSxFQUFNLGdCQUFrQixFQUFNLFVBQzdDLEVBQU8sUUFBUSxLQUFLLEdBQ3BCLEVBQU8sTUFJTCxFQUFLLEdBQUEsUUFBUSxjQUFlLEdBQ2xDLEFBQUksR0FDRixHQUFTLEdBQUEsYUFBYSxFQUFVLEVBQVEsR0FDeEMsR0FBQSxTQUFTLFVBQUEsQ0FDUCxFQUFHLGNBQWMsSUFBSSxHQUNyQixFQUFHLGNBQ0YsUUMzQ1AsZ0VBZ0JBLEdBQUEsSUFBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FjTSxHQUE2QyxHQUV0QyxHQUFBLE9BQVMsU0FBQyxFQUF5QixFQUEwQixDQUN4RSxHQUFNLEdBQW9CLEdBQUEsdUJBQ3BCLEVBQVMsR0FBQSxXQUFXLE9BQ3RCLEVBRUUsRUFBZSxTQUFDLEVBQXVCLENBRzNDLEdBQU0sR0FBUSxFQUFNLFVBSXBCLEFBQUksRUFBUSxFQUFrQixpQkFDNUIsR0FBTyxNQUFRLEVBQ2YsRUFBTyxRQUFRLEtBQUssSUFHbEIsR0FDRixLQUlFLEVBQUssR0FBQSxRQUFRLDJCQUE0QixHQUUvQyxHQUFJLEVBQUksQ0FDTixFQUFTLEdBQUEsYUFBYSxFQUFVLEVBQVEsR0FFeEMsR0FBTSxHQUFnQixVQUFBLENBQ3BCLEFBQUssR0FBa0IsRUFBTyxLQUM1QixHQUFHLGNBQWMsSUFBSSxHQUNyQixFQUFHLGFBQ0gsR0FBa0IsRUFBTyxJQUFNLEdBQy9CLEVBQU8sTUFPWCxDQUFDLFVBQVcsU0FBUyxRQUFRLFNBQUEsRUFBSSxDQUMvQixpQkFBaUIsRUFBTSxFQUFlLENBQUUsS0FBTSxHQUFNLFFBQVMsT0FHL0QsR0FBQSxTQUFTLEVBQWUsbUZDNUU1QixHQUFBLElBSUEsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FHTSxHQUFTLEdBQUEsa0JBR2YsR0FBQSxVQUFBLENBT0UsV0FBMkIsRUFBa0MsQ0FBbEMsQUFBQSxJQUFBLFFBQUEsR0FBQSxZQUFBLEtBQUEsa0JBQUEsRUFObkIsS0FBQSxjQUE4QixHQUU5QixLQUFBLG1CQUE2QixFQUsvQixDQUFDLEdBQUEsYUFBVyxJQUFJLE1BQU0sTUFBQSxJQUFBLE9BQUEsT0FBQSxFQUFFLGNBQVcsSUFBSSxNQUFNLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxXQUM3QyxJQUFPLFlBQVksTUFDckIsR0FBTyxZQUFZLEtBQUssdUJBRzFCLEtBQUssWUFDTCxLQUFLLFlBQ0wsS0FBSyxhQUtGLFNBQUEsVUFBQSxzQkFBUCxTQUE2QixFQUF3QixDQUFyRCxHQUFBLEdBQUEsS0FDRSxHQUFJLEdBQUMsSUFBVSxDQUFDLEdBQU8sYUFBZSxDQUFDLEdBQU8sWUFBWSxZQUFjLENBQUMsR0FBQSw4QkFLekUsSUFBQSxPQUFPLElBQUksNERBRVgsR0FBTSxHQUFhLEdBQUEsUUFBUSxHQUFBLDhCQUN2QixFQUVKLEdBQUksR0FBTyxVQUFZLEdBQU8sU0FBUyxTQUVyQyxPQUFTLEdBQUksRUFBRyxFQUFJLEdBQU8sU0FBUyxRQUFRLE9BQVEsSUFJbEQsR0FBSSxHQUFPLFNBQVMsUUFBUSxHQUFHLFFBQVEsUUFBVSxPQUFRLENBQ3ZELEVBQWlCLEdBQU8sU0FBUyxRQUFRLEdBQUcsSUFDNUMsT0FLTixHQUFJLEdBQ0EsRUFDQSxFQUNBLEVBNEVKLEdBMUVBLEdBQU8sWUFDSixhQUNBLE1BQU0sS0FBSyxvQkFDWCxRQUFRLFNBQUMsRUFBMEIsQ0FDbEMsR0FBTSxHQUFZLEdBQUEsUUFBUSxFQUFNLFdBQzFCLEVBQVcsR0FBQSxRQUFRLEVBQU0sVUFFL0IsR0FBSSxJQUFZLEtBQU8sY0FBZ0IsRUFBYSxFQUFZLEVBQVksZ0JBSTVFLE9BQVEsRUFBTSxlQUNQLGFBQWMsQ0FDakIsR0FBbUIsRUFBYSxFQUFPLEdBQ3ZDLEVBQXlCLEVBQWEsR0FBQSxRQUFRLEVBQU0sZUFDcEQsRUFBd0IsRUFBYSxHQUFBLFFBQVEsRUFBTSxjQUNuRCxVQUVHLFdBQ0EsWUFDQSxVQUFXLENBQ2QsR0FBTSxHQUFpQixHQUFnQixFQUFhLEVBQU8sRUFBVyxFQUFVLEdBQ2hGLEFBQUksSUFBNkIsUUFBYSxFQUFNLE9BQVMsdUJBQzNELEdBQTJCLEdBSzdCLEdBQU0sR0FBYyxHQUFBLHVCQUVkLEVBQWUsRUFBTSxVQUFZLEVBQVksZ0JBRW5ELEFBQUksRUFBTSxPQUFTLGVBQWlCLEdBQ2xDLElBQUEsT0FBTyxJQUFJLDRCQUNYLEVBQUssY0FBYyxHQUFRLENBQUUsTUFBTyxFQUFNLFdBQzFDLEVBQUssY0FBYyxXQUFhLENBQUUsTUFBTyxJQUd2QyxFQUFNLE9BQVMsMEJBQTRCLEdBQzdDLElBQUEsT0FBTyxJQUFJLDZCQUNYLEVBQUssY0FBYyxJQUFTLENBQUUsTUFBTyxFQUFNLFdBQzNDLEVBQUssY0FBYyxZQUFjLENBQUUsTUFBTyxJQUc1QyxVQUVHLFdBQVksQ0FDZixHQUFNLEdBQWdCLEVBQU0sS0FBZ0IsUUFBUSxHQUFPLFNBQVMsT0FBUSxJQUN0RSxFQUFlLEdBQWlCLEVBQWEsRUFBTyxFQUFjLEVBQVcsRUFBVSxHQUU3RixBQUFJLElBQThCLFFBQWMsSUFBa0IsSUFBSSxRQUFRLEdBQWdCLElBQzVGLEdBQTRCLEdBRTlCLGtCQU9KLElBQThCLFFBQWEsSUFBNkIsUUFDMUUsR0FBWSxFQUFhLENBQ3ZCLFlBQWEsYUFDYixhQUFjLEVBQ2QsR0FBSSxTQUNKLGVBQWdCLElBSXBCLEtBQUssbUJBQXFCLEtBQUssSUFBSSxZQUFZLGFBQWEsT0FBUyxFQUFHLEdBRXhFLEtBQUssZ0JBQWdCLEdBR2pCLEVBQVksS0FBTyxXQUFZLENBR2pDLEdBQU0sR0FBYSxHQUFBLFFBQVEsR0FBQSw4QkFJM0IsQUFBSSxNQUFPLElBQTJCLFVBQ3BDLElBQUEsT0FBTyxJQUFJLDhCQUNYLEtBQUssY0FBYyxLQUFVLENBQUUsTUFBUSxHQUF5QixFQUFZLGdCQUFrQixLQUUxRixNQUFPLElBQTBCLFVBQVksR0FBeUIsR0FHeEUsTUFBSyxjQUFjLG9CQUFzQixDQUFFLE1BQVEsR0FBeUIsR0FBeUIsT0FJekcsQ0FBQyxNQUFPLEtBQU0sT0FBTyxRQUFRLFNBQUEsRUFBSSxDQUMvQixHQUFJLEdBQUMsRUFBSyxjQUFjLElBQVMsR0FBYyxFQUFZLGdCQVEzRCxJQUFNLEdBQVcsRUFBSyxjQUFjLEdBQU0sTUFDcEMsRUFBdUIsRUFBYSxHQUFBLFFBQVEsR0FFNUMsRUFBa0IsS0FBSyxJQUFLLEdBQXVCLEVBQVksZ0JBQWtCLEtBRWpGLEVBQVEsRUFBa0IsRUFDaEMsR0FBQSxPQUFPLElBQUksNkJBQTZCLEVBQUksU0FBUyxFQUFRLE9BQU8sRUFBZSxLQUFLLEVBQUssS0FFN0YsRUFBSyxjQUFjLEdBQU0sTUFBUSxLQUcvQixLQUFLLGNBQWMsYUFBZSxLQUFLLGNBQWMsS0FHdkQsR0FBWSxFQUFhLENBQ3ZCLFlBQWEsb0JBQ2IsYUFBYyxLQUFLLGNBQWMsWUFBWSxNQUFRLEdBQUEsUUFBUSxLQUFLLGNBQWMsSUFBTyxPQUN2RixHQUFJLGFBQ0osZUFBZ0IsS0FBSyxjQUFjLFlBQVksUUFNN0MsT0FBUyxNQUFLLGVBQ2xCLE1BQU8sTUFBSyxjQUFjLElBRzVCLEVBQVksZ0JBQWdCLEtBQUssZUFDakMsS0FBSyxlQUFlLEdBRXBCLEVBQVksT0FBTywwQkFBMkIsS0FBSyxzQkFLL0MsRUFBQSxVQUFBLGVBQVIsU0FBdUIsRUFBd0IsQ0FDN0MsQUFBSSxLQUFLLFdBQ1AsSUFBQSxPQUFPLElBQUksa0NBR1AsS0FBSyxVQUFVLFNBQ2pCLEVBQVksT0FBTyxjQUFlLEdBQUEsaUJBQWlCLEtBQUssVUFBVSxVQUdoRSxLQUFLLFVBQVUsSUFDakIsRUFBWSxPQUFPLFNBQVUsS0FBSyxVQUFVLElBRzFDLEtBQUssVUFBVSxLQUVqQixFQUFZLE9BQU8sVUFBVyxLQUFLLFVBQVUsSUFBSSxPQUFPLE1BQU0sRUFBRyxNQUduRSxFQUFZLE9BQU8sV0FBWSxLQUFLLFVBQVUsT0FJNUMsS0FBSyxXQUFhLEtBQUssVUFBVSxTQUNuQyxJQUFBLE9BQU8sSUFBSSxrQ0FDWCxLQUFLLFVBQVUsUUFBUSxRQUFRLFNBQUMsRUFBUSxFQUFLLENBQzNDLE1BQUEsR0FBWSxPQUFPLGNBQWMsR0FBUSxHQUFLLEdBQUEsaUJBQWlCLEVBQU8sV0FNcEUsRUFBQSxVQUFBLFVBQVIsVUFBQSxDQUFBLEdBQUEsR0FBQSxLQUlFLEdBQUEsT0FBTyxTQUFBLEVBQU0sQ0FDWCxHQUFNLEdBQVEsRUFBTyxRQUFRLE1BQzdCLEFBQUksQ0FBQyxHQUlMLElBQUEsT0FBTyxJQUFJLDZCQUNYLEVBQUssY0FBYyxJQUFTLENBQUUsTUFBTyxFQUFPLE9BQzVDLEVBQUssVUFBWSxNQU9iLEVBQUEsVUFBQSxnQkFBUixTQUF3QixFQUF3QixDQUM5QyxHQUFNLEdBQVksR0FBTyxVQUN6QixHQUFJLEVBQUMsRUFLTCxJQUFNLEdBQWEsRUFBVSxXQUM3QixBQUFJLEdBQ0UsR0FBVyxlQUNiLEVBQVksT0FBTywwQkFBMkIsRUFBVyxlQUd2RCxFQUFXLE1BQ2IsRUFBWSxPQUFPLGlCQUFrQixFQUFXLE1BRzlDLEdBQW1CLEVBQVcsTUFDaEMsTUFBSyxjQUFjLGtCQUFvQixDQUFFLE1BQU8sRUFBVyxNQUd6RCxHQUFtQixFQUFXLFdBQ2hDLE1BQUssY0FBYyx1QkFBeUIsQ0FBRSxNQUFPLEVBQVcsWUFJaEUsR0FBbUIsRUFBVSxlQUMvQixFQUFZLE9BQU8sZUFBZ0IsT0FBTyxFQUFVLGVBR2xELEdBQW1CLEVBQVUsc0JBQy9CLEVBQVksT0FBTyxzQkFBdUIsT0FBTyxFQUFVLHdCQUt2RCxFQUFBLFVBQUEsVUFBUixVQUFBLENBQUEsR0FBQSxHQUFBLEtBQ0UsR0FBQSxPQUFPLFNBQUEsRUFBTSxDQUNYLEdBQU0sR0FBUSxFQUFPLFFBQVEsTUFFN0IsR0FBSSxFQUFDLEVBSUwsSUFBTSxHQUFhLEdBQUEsUUFBUSxHQUFBLDhCQUNyQixFQUFZLEdBQUEsUUFBUSxFQUFNLFdBQ2hDLEdBQUEsT0FBTyxJQUFJLDZCQUNYLEVBQUssY0FBYyxJQUFTLENBQUUsTUFBTyxFQUFPLE9BQzVDLEVBQUssY0FBYyxZQUFjLENBQUUsTUFBTyxFQUFhLEdBQ3ZELEVBQUssVUFBWSxJQUNoQixLQUFLLG9CQUlGLEVBQUEsVUFBQSxVQUFSLFVBQUEsQ0FBQSxHQUFBLEdBQUEsS0FDRSxHQUFBLE9BQU8sU0FBQSxFQUFNLENBQ1gsR0FBTSxHQUFRLEVBQU8sUUFBUSxNQUU3QixHQUFJLEVBQUMsRUFJTCxJQUFNLEdBQWEsR0FBQSxRQUFRLEdBQUEsOEJBQ3JCLEVBQVksR0FBQSxRQUFRLEVBQU0sV0FDaEMsR0FBQSxPQUFPLElBQUksNkJBQ1gsRUFBSyxjQUFjLElBQVMsQ0FBRSxNQUFPLEVBQU8sT0FDNUMsRUFBSyxjQUFjLFlBQWMsQ0FBRSxNQUFPLEVBQWEsT0FHN0QsS0FqVGEsR0FBQSx1QkFBQSxHQW9UYixZQUE0QixFQUEwQixFQUE0QixFQUFrQixDQUNsRyxHQUErQixDQUFFLFlBQVcsRUFBRSxNQUFLLEVBQUUsTUFBTyxjQUFlLFdBQVUsSUFDckYsR0FBK0IsQ0FBRSxZQUFXLEVBQUUsTUFBSyxFQUFFLE1BQU8sV0FBWSxXQUFVLElBQ2xGLEdBQStCLENBQUUsWUFBVyxFQUFFLE1BQUssRUFBRSxNQUFPLHdCQUF5QixXQUFVLElBQy9GLEdBQStCLENBQUUsWUFBVyxFQUFFLE1BQUssRUFBRSxNQUFPLFlBQWEsV0FBVSxJQUNuRixHQUErQixDQUFFLFlBQVcsRUFBRSxNQUFLLEVBQUUsTUFBTyxVQUFXLFdBQVUsSUFDakYsR0FBK0IsQ0FDN0IsWUFBVyxFQUNYLE1BQUssRUFDTCxNQUFPLG1CQUNQLFdBQVUsRUFDVixTQUFVLGFBQ1YsWUFBYSxZQUVmLEdBQStCLENBQzdCLFlBQVcsRUFDWCxNQUFLLEVBQ0wsTUFBTyxRQUNQLFdBQVUsRUFDVixTQUFVLG9CQUNWLFlBQWEsVUFFZixHQUErQixDQUFFLFlBQVcsRUFBRSxNQUFLLEVBQUUsTUFBTyxlQUFnQixXQUFVLEVBQUUsWUFBYSxRQUNyRyxHQUFXLEVBQWEsRUFBTyxHQUlqQyxZQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFBa0IsQ0FFbEIsR0FBTSxHQUF3QixFQUFhLEVBQ3JDLEVBQXNCLEVBQXdCLEVBRXBELFVBQVksRUFBYSxDQUN2QixZQUFhLEVBQU0sS0FDbkIsYUFBYyxFQUNkLEdBQUksRUFBTSxVQUNWLGVBQWdCLElBR1gsRUFXVCxZQUNFLEVBQ0EsRUFDQSxFQUNBLEVBQ0EsRUFDQSxFQUFrQixDQUlsQixHQUFJLElBQU0sZ0JBQWtCLGtCQUFvQixFQUFNLGdCQUFrQixTQUl4RSxJQUFNLEdBQTRCLEdBQ2xDLEFBQUksZ0JBQWtCLElBQ3BCLEdBQUssaUJBQW1CLEVBQU0sY0FFNUIsbUJBQXFCLElBQ3ZCLEdBQUsscUJBQXVCLEVBQU0saUJBRWhDLG1CQUFxQixJQUN2QixHQUFLLHFCQUF1QixFQUFNLGlCQUdwQyxHQUFNLEdBQWlCLEVBQWEsRUFDOUIsRUFBZSxFQUFpQixFQUV0QyxVQUFZLEVBQWEsQ0FDdkIsWUFBYSxFQUNiLGFBQVksRUFDWixHQUFJLEVBQU0sY0FBZ0IsWUFBWSxFQUFNLGNBQWtCLFdBQzlELGVBQWMsRUFDZCxLQUFJLElBR0MsR0FwQ1QsR0FBQSxpQkFBQSxHQXdDQSxZQUF3QyxFQU92QyxDQUNTLEdBQUEsR0FBQSxFQUFBLFlBQWEsRUFBQSxFQUFBLE1BQU8sRUFBQSxFQUFBLE1BQU8sRUFBQSxFQUFBLFdBQVksRUFBQSxFQUFBLFNBQVUsRUFBQSxFQUFBLFlBRW5ELEVBQU0sRUFBWSxFQUFNLEdBQW9DLEVBQVMsRUFBSyxPQUMxRSxFQUFRLEVBQVMsRUFBSyxTQUM1QixBQUFJLENBQUMsR0FBUyxDQUFDLEdBR2YsR0FBWSxFQUFhLENBQ3ZCLEdBQUksVUFDSixZQUFhLEdBQWUsRUFDNUIsZUFBZ0IsRUFBYSxHQUFBLFFBQVEsR0FDckMsYUFBYyxFQUFhLEdBQUEsUUFBUSxLQUt2QyxZQUFvQixFQUEwQixFQUE0QixFQUFrQixDQUMxRixHQUFZLEVBQWEsQ0FDdkIsR0FBSSxVQUNKLFlBQWEsVUFDYixlQUFnQixFQUFhLEdBQUEsUUFBUSxFQUFNLGNBQzNDLGFBQWMsRUFBYSxHQUFBLFFBQVEsRUFBTSxlQUczQyxHQUFZLEVBQWEsQ0FDdkIsR0FBSSxVQUNKLFlBQWEsV0FDYixlQUFnQixFQUFhLEdBQUEsUUFBUSxFQUFNLGVBQzNDLGFBQWMsRUFBYSxHQUFBLFFBQVEsRUFBTSxlQVM3QyxZQUE0QixFQUEwQixFQUF1QyxDQUFyQyxHQUFBLEdBQUEsRUFBQSxlQUFnQixFQUFBLEdBQUEsT0FBQSxFQUFBLENBQUEsbUJBQ3RFLE1BQUksSUFBa0IsRUFBWSxlQUFpQixHQUNqRCxHQUFZLGVBQWlCLEdBR3hCLEVBQVksV0FBVSxHQUFBLFNBQUEsQ0FDM0IsZUFBYyxHQUNYLElBUFAsR0FBQSxZQUFBLEdBY0EsWUFBNEIsRUFBVSxDQUNwQyxNQUFPLE9BQU8sSUFBVSxVQUFZLFNBQVMsaUZDaGUvQyxHQUFBLElBR0EsR0FBQSxLQUNBLEdBQUEsS0FFYSxHQUFBLHdCQUEwQixDQUFDLFlBQWEsT0F5RXhDLEdBQUEscUNBQXNFLENBQ2pGLFdBQVksR0FDWixTQUFVLEdBQ1YsZUFBZ0IsR0FBQSx5QkFJbEIsWUFBMkMsRUFBaUQsQ0FFcEYsR0FBQSxHQUFBLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FBQSxHQUFBLHNDQUFBLEdBQUUsRUFBQSxFQUFBLFdBQVksRUFBQSxFQUFBLFNBQVUsRUFBQSxFQUFBLGVBQWdCLEVBQUEsRUFBQSwyQkFPeEMsRUFBa0MsR0FFbEMsRUFBMEIsU0FBQyxFQUFXLENBQzFDLEdBQUksRUFBTyxHQUNULE1BQU8sR0FBTyxHQUVoQixHQUFNLEdBQVUsRUFDaEIsU0FBTyxHQUNMLEVBQVEsS0FBSyxTQUFDLEVBQXVCLENBQUssTUFBQSxJQUFBLGtCQUFrQixFQUFLLE1BQ2pFLENBQUMsR0FBQSxrQkFBa0IsRUFBSyxjQUNuQixFQUFPLElBS1osRUFBbUIsRUFDdkIsQUFBSSxNQUFPLElBQStCLFlBQ3hDLEdBQW1CLFNBQUMsRUFBVyxDQUM3QixNQUFPLEdBQXdCLElBQVEsRUFBMkIsS0FJdEUsR0FBTSxHQUE4QixHQUVwQyxBQUFJLEdBQ0YsR0FBQSwwQkFBMEIsQ0FDeEIsU0FBVSxTQUFDLEVBQXNCLENBQy9CLEdBQWMsRUFBYSxFQUFrQixJQUUvQyxLQUFNLFVBSU4sR0FDRixHQUFBLDBCQUEwQixDQUN4QixTQUFVLFNBQUMsRUFBb0IsQ0FDN0IsR0FBWSxFQUFhLEVBQWtCLElBRTdDLEtBQU0sUUEvQ1osR0FBQSwyQkFBQSxHQXVEQSxZQUNFLEVBQ0EsRUFDQSxFQUEyQixDQUUzQixHQUFJLEdBQUMsR0FBQSxxQkFBdUIsQ0FBRSxHQUFZLFdBQWEsRUFBaUIsRUFBWSxVQUFVLE9BSTlGLElBQUksRUFBWSxjQUFnQixFQUFZLFVBQVUsT0FBUSxDQUM1RCxHQUFNLEdBQU8sRUFBTSxFQUFZLFVBQVUsUUFDekMsQUFBSSxHQUNGLENBQUksRUFBWSxTQUdkLEVBQUssY0FBYyxFQUFZLFNBQVMsUUFDL0IsRUFBWSxPQUNyQixFQUFLLFVBQVUsR0FBQSxXQUFXLGVBRTVCLEVBQUssU0FHTCxNQUFPLEdBQU0sRUFBWSxVQUFVLFNBRXJDLE9BR0YsR0FBTSxHQUFvQixHQUFBLHVCQUMxQixHQUFJLEVBQW1CLENBQ3JCLEdBQU0sR0FBTyxFQUFrQixXQUFXLENBQ3hDLEtBQUksR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNDLEVBQVksV0FBUyxDQUN4QixLQUFNLFVBRVIsWUFBZ0IsRUFBWSxVQUFVLE9BQU0sSUFBSSxFQUFZLFVBQVUsSUFDdEUsR0FBSSxnQkFHTixFQUFZLFVBQVUsT0FBUyxFQUFLLE9BQ3BDLEVBQU0sRUFBSyxRQUFVLEVBRXJCLEdBQU0sR0FBVyxFQUFZLEtBQUssR0FBSyxFQUFZLEtBQUssR0FFbEQsRUFBVyxFQUFZLEtBQUssR0FBTSxFQUFZLEtBQUssSUFBaUMsR0FDdEYsRUFBVSxFQUFRLFFBQ3RCLEFBQUksR0FBQSxhQUFhLEVBQVMsVUFDeEIsR0FBVyxFQUFvQixTQUVqQyxBQUFJLEVBRUYsQUFBSSxNQUFPLEdBQVEsUUFBVyxXQUU1QixFQUFRLE9BQU8sZUFBZ0IsRUFBSyxpQkFDL0IsQUFBSSxNQUFNLFFBQVEsR0FDdkIsRUFBTyxHQUFBLFNBQU8sRUFBTyxDQUFFLENBQUMsZUFBZ0IsRUFBSyxtQkFFN0MsRUFBTyxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQVEsR0FBTyxDQUFFLGVBQWdCLEVBQUssa0JBRy9DLEVBQVUsQ0FBRSxlQUFnQixFQUFLLGlCQUVuQyxFQUFRLFFBQVUsSUE3RHRCLEdBQUEsY0FBQSxHQW9FQSxZQUNFLEVBQ0EsRUFDQSxFQUEyQixTQUUzQixHQUNFLEdBQUMsR0FBQSxxQkFBbUIsSUFDcEIsRUFBWSxPQUFHLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSx5QkFDakIsQ0FBRSxLQUFBLEVBQVksT0FBRyxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsaUJBQWtCLEVBQWlCLEVBQVksSUFBSSxlQUFlLE9BS3ZGLElBQU0sR0FBTSxFQUFZLElBQUksZUFHNUIsR0FBSSxFQUFZLGNBQWdCLEVBQVksSUFBSSx1QkFBd0IsQ0FDdEUsR0FBTSxHQUFPLEVBQU0sRUFBWSxJQUFJLHdCQUNuQyxBQUFJLEdBQ0YsR0FBSyxjQUFjLEVBQUksYUFDdkIsRUFBSyxTQUdMLE1BQU8sR0FBTSxFQUFZLElBQUkseUJBRS9CLE9BSUYsR0FBTSxHQUFvQixHQUFBLHVCQUMxQixHQUFJLEVBQW1CLENBQ3JCLEdBQU0sR0FBTyxFQUFrQixXQUFXLENBQ3hDLEtBQUksR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNDLEVBQUksTUFBSSxDQUNYLEtBQU0sTUFDTixPQUFRLEVBQUksT0FDWixJQUFLLEVBQUksTUFFWCxZQUFnQixFQUFJLE9BQU0sSUFBSSxFQUFJLElBQ2xDLEdBQUksZ0JBTU4sR0FIQSxFQUFZLElBQUksdUJBQXlCLEVBQUssT0FDOUMsRUFBTSxFQUFZLElBQUksd0JBQTBCLEVBRTVDLEVBQVksSUFBSSxpQkFDbEIsR0FBSSxDQUNGLEVBQVksSUFBSSxpQkFBaUIsZUFBZ0IsRUFBSyxzQkFDdEQsS0FoRFIsR0FBQSxZQUFBLHFFQ2hOQSxHQUFBLElBQUEsSUFFTSxHQUFTLEdBQUEsa0JBS2YsWUFDRSxFQUNBLEVBQ0EsRUFBZ0QsQ0FFaEQsR0FIQSxJQUFBLFFBQUEsR0FBQSxJQUNBLElBQUEsUUFBQSxHQUFBLElBRUksQ0FBQyxJQUFVLENBQUMsR0FBTyxTQUFVLENBQy9CLEdBQUEsT0FBTyxLQUFLLHdFQUNaLE9BR0YsR0FBSSxHQUFrQyxHQUFPLFNBQVMsS0FFbEQsRUFDSixBQUFJLEdBQ0YsR0FBb0IsRUFBdUIsQ0FBRSxLQUFNLEdBQU8sU0FBUyxTQUFVLEdBQUksY0FHL0UsR0FDRixHQUFBLDBCQUEwQixDQUN4QixTQUFVLFNBQUMsRUFBMkMsSUFBekMsR0FBQSxFQUFBLEdBQUksRUFBQSxFQUFBLEtBVWYsR0FBSSxJQUFTLFFBQWEsR0FBZSxFQUFZLFFBQVEsS0FBUSxHQUFJLENBQ3ZFLEVBQWMsT0FDZCxPQUdGLEFBQUksSUFBUyxHQUNYLEdBQWMsT0FDVixHQUNGLElBQUEsT0FBTyxJQUFJLG9EQUFvRCxFQUFrQixJQUVqRixFQUFrQixVQUVwQixFQUFvQixFQUF1QixDQUFFLEtBQU0sR0FBTyxTQUFTLFNBQVUsR0FBSSxpQkFHckYsS0FBTSxZQTVDWixHQUFBLDhCQUFBLGdGQ05BLEdBQUEsSUFFQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsS0FDQSxHQUFBLEtBS0EsR0FBQSxLQUVhLEdBQUEseUNBQTJDLElBNkV4RCxHQUFNLElBQStCLEdBQUEsU0FBQSxDQUNuQyxZQUFhLEdBQUEscUJBQ2IsMkJBQTRCLEdBQzVCLHVCQUF3QixHQUFBLHlDQUN4Qix1QkFBd0IsR0FBQSw4QkFDeEIsaUNBQWtDLEdBQ2xDLDJCQUE0QixJQUN6QixHQUFBLHNDQVVMLEdBQUEsVUFBQSxDQXVCRSxXQUFtQixFQUF5QyxDQVhyRCxLQUFBLEtBQWUsRUFBZSxHQU1wQixLQUFBLG9CQUErQixHQUd4QyxLQUFBLHVCQUEyRSxPQUdqRixHQUFJLEdBQWlCLEdBQUEscUNBQXFDLGVBRTFELEFBQUksR0FDRixNQUFLLHVCQUF5QixFQUFTLFlBQ3ZDLEFBQUksRUFBUyxnQkFBa0IsTUFBTSxRQUFRLEVBQVMsaUJBQW1CLEVBQVMsZUFBZSxTQUFXLEVBQzFHLEVBQWlCLEVBQVMsZUFFMUIsS0FBSyxvQkFBc0IsSUFJL0IsS0FBSyxRQUFPLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ1AsSUFDQSxHQUFRLENBQ1gsZUFBYyxJQUdSLEdBQUEsR0FBQSxLQUFBLFFBQUEsZUFDUixLQUFLLFNBQVcsR0FBSSxJQUFBLHVCQUF1QixHQUFrQixFQUFlLG1CQU12RSxTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUF1QyxFQUF3QixDQUFoRixHQUFBLEdBQUEsS0FDRSxLQUFLLGVBQWlCLEVBRWxCLEtBQUsscUJBQ1AsSUFBQSxPQUFPLEtBQ0wsNEdBRUYsR0FBQSxPQUFPLEtBQ0wsb0RBQW9ELEdBQUEscUNBQXFDLGlCQUt2RixHQUFBLEdBQUEsS0FBQSxRQUNKLEVBQUEsRUFBQSx1QkFDQSxFQUFBLEVBQUEsaUNBQ0EsRUFBQSxFQUFBLDJCQUNBLEVBQUEsRUFBQSwyQkFDQSxFQUFBLEVBQUEsV0FDQSxFQUFBLEVBQUEsU0FDQSxFQUFBLEVBQUEsZUFDQSxFQUFBLEVBQUEsMkJBR0YsRUFDRSxTQUFDLEVBQTJCLENBQUssTUFBQSxHQUFLLHdCQUF3QixJQUM5RCxFQUNBLEdBR0UsR0FDRixHQUFBLGlDQUdGLEdBQUEsMkJBQTJCLENBQUUsV0FBVSxFQUFFLFNBQVEsRUFBRSxlQUFjLEVBQUUsMkJBQTBCLEtBSXZGLEVBQUEsVUFBQSx3QkFBUixTQUFnQyxFQUEyQixDQUEzRCxHQUFBLEdBQUEsS0FDRSxHQUFJLENBQUMsS0FBSyxlQUFnQixDQUN4QixHQUFBLE9BQU8sS0FBSyw0QkFBNEIsRUFBUSxHQUFFLG1EQUNsRCxPQUlJLEdBQUEsR0FBQSxLQUFBLFFBQUUsRUFBQSxFQUFBLGVBQWdCLEVBQUEsRUFBQSxZQUFhLEVBQUEsRUFBQSx1QkFFL0IsRUFBMEIsRUFBUSxLQUFPLFdBQWEsS0FBcUIsT0FFM0UsRUFBZSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNoQixHQUNBLEdBQXVCLENBQzFCLFFBQVMsS0FFTCxFQUFrQixNQUFPLElBQW1CLFdBQWEsRUFBZSxHQUFtQixFQUkzRixFQUFlLElBQW9CLE9BQVcsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUFNLEdBQWUsQ0FBRSxRQUFTLEtBQVUsRUFFOUYsQUFBSSxFQUFhLFVBQVksSUFDM0IsR0FBQSxPQUFPLElBQUksMkJBQTJCLEVBQWEsR0FBRSwyQ0FHdkQsR0FBQSxPQUFPLElBQUksc0JBQXNCLEVBQWEsR0FBRSx5QkFFaEQsR0FBTSxHQUFNLEtBQUssaUJBQ1QsRUFBQSxHQUFBLGtCQUFBLFNBRUYsRUFBa0IsR0FBQSxxQkFDdEIsRUFDQSxFQUNBLEVBQ0EsR0FDQSxDQUFFLFNBQVEsSUFFWixTQUFnQiw2QkFBNkIsU0FBQyxFQUFhLEVBQVksQ0FDckUsRUFBSyxTQUFTLHNCQUFzQixHQUNwQyxHQUEwQixHQUFBLFFBQVEsR0FBeUIsRUFBYSxLQUcxRSxFQUFnQixPQUFPLGNBQWUsS0FBSyx3QkFFcEMsR0EvSEssRUFBQSxHQUFhLGlCQWlJN0IsS0FySWEsR0FBQSxlQUFBLEdBNEliLGFBQWdDLENBQzlCLEdBQU0sR0FBUyxHQUFlLGdCQUM5QixHQUFJLEVBQ0YsTUFBTyxJQUFBLHVCQUF1QixHQUhsQyxHQUFBLGlCQUFBLEdBVUEsWUFBK0IsRUFBZ0IsQ0FDN0MsR0FBTSxHQUFLLEdBQUEsa0JBQTBCLFNBQVMsY0FBYyxhQUFhLEVBQVEsS0FDakYsTUFBTyxHQUFLLEVBQUcsYUFBYSxXQUFhLEtBRjNDLEdBQUEsZUFBQSxHQU1BLFlBQW1DLEVBQXFCLEVBQThCLEVBQW9CLENBQ3hHLEdBQU0sR0FBTyxFQUFlLEVBQVksZUFDbEMsRUFBd0IsR0FBaUIsR0FBTyxHQUFlLEVBQU8sR0FDNUUsQUFBSSxHQUNGLEdBQVksVUFBVSxHQUFBLFdBQVcsa0JBQ2pDLEVBQVksT0FBTyxpQ0FBa0MsNEVDaFJ6RCxHQUFBLElBQUEsS0FBUyxHQUFBLGVBQUEsR0FBQSxlQUNULEdBQUEsSUFBQSxLQUNFLEdBQUEsMkJBQUEsR0FBQSwyQkFFQSxHQUFBLHFDQUFBLEdBQUEsdUdDSkYsR0FBQSxJQUFBLEtBQVMsR0FBQSxRQUFBLEdBQUEsUUFDVCxHQUFBLElBQUEsS0FBUyxHQUFBLFNBQUEsR0FBQSxTQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsTUFBQSxHQUFBLE1BQ1QsR0FBQSxJQUFBLEtBQVMsR0FBQSxNQUFBLEdBQUEsTUFJVCxHQUFBLElBQUEsS0FBUyxHQUFBLGVBQUEsR0FBQSxpRkNQVCxHQUFBLElBQUEsS0FzQ1MsR0FBQSxvQkF0Q0EsR0FBQSxvQkFDVCxHQUFBLElBQUEsS0FFUyxHQUFBLGFBQUEsR0FrQlQsR0FBQSxJQUFBLEtBQVMsR0FBQSxlQUFBLEdBQUEsZUFFVCxHQUFBLElBQUEsS0FBUyxHQUFBLEtBQUEsR0FBQSxLQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsWUFBQSxHQUFBLFlBQ1QsR0FBQSxJQUFBLEtBRUUsR0FBQSwrQkFBQSxHQUFBLDJCQUVBLEdBQUEscUNBQUEsR0FBQSxxQ0FFRixHQUFBLElBQUEsS0FBUyxHQUFBLFdBQUEsR0FBQSxXQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsZ0JBQUEsR0FBQSxnQkFDVCxHQUFBLElBQUEsS0FBUyxHQUFBLHFCQUFBLEdBQUEscUJBR1QsR0FBQSxzQkFJQSxHQUFBLElBQUEsS0FDRSxHQUFBLHVCQUFBLEdBQUEsdUJBQ0EsR0FBQSxxQkFBQSxHQUFBLHFCQUNBLEdBQUEsa0JBQUEsR0FBQSxrQkFDQSxHQUFBLHlCQUFBLEdBQUEseUJBQ0EsR0FBQSxtQkFBQSxHQUFBLHFCQzdDRiwyQkFjQSxHQUFRLE1BQVEsR0FDaEIsR0FBUSxVQUFZLEdBT3BCLEdBQUksSUFBUyxtQkFDVCxHQUFTLG1CQUNULEdBQWtCLE1BVWxCLEdBQXFCLHdDQWN6QixZQUFlLEVBQUssRUFBUyxDQUMzQixHQUFJLE1BQU8sSUFBUSxTQUNqQixLQUFNLElBQUksV0FBVSxpQ0FRdEIsT0FMSSxHQUFNLEdBQ04sRUFBTSxHQUFXLEdBQ2pCLEVBQVEsRUFBSSxNQUFNLElBQ2xCLEVBQU0sRUFBSSxRQUFVLEdBRWYsRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLElBQUssQ0FDckMsR0FBSSxHQUFPLEVBQU0sR0FDYixFQUFTLEVBQUssUUFBUSxLQUcxQixHQUFJLElBQVMsR0FJYixJQUFJLEdBQU0sRUFBSyxPQUFPLEVBQUcsR0FBUSxPQUM3QixFQUFNLEVBQUssT0FBTyxFQUFFLEVBQVEsRUFBSyxRQUFRLE9BRzdDLEFBQUksQUFBTyxFQUFJLElBQVgsS0FDRixHQUFNLEVBQUksTUFBTSxFQUFHLEtBSWpCLEFBQWEsRUFBSSxJQUFqQixNQUNGLEdBQUksR0FBTyxHQUFVLEVBQUssS0FJOUIsTUFBTyxHQW1CVCxZQUFtQixFQUFNLEVBQUssRUFBUyxDQUNyQyxHQUFJLEdBQU0sR0FBVyxHQUNqQixFQUFNLEVBQUksUUFBVSxHQUV4QixHQUFJLE1BQU8sSUFBUSxXQUNqQixLQUFNLElBQUksV0FBVSw0QkFHdEIsR0FBSSxDQUFDLEdBQW1CLEtBQUssR0FDM0IsS0FBTSxJQUFJLFdBQVUsNEJBR3RCLEdBQUksR0FBUSxFQUFJLEdBRWhCLEdBQUksR0FBUyxDQUFDLEdBQW1CLEtBQUssR0FDcEMsS0FBTSxJQUFJLFdBQVUsMkJBR3RCLEdBQUksR0FBTSxFQUFPLElBQU0sRUFFdkIsR0FBSSxBQUFRLEVBQUksUUFBWixLQUFvQixDQUN0QixHQUFJLEdBQVMsRUFBSSxPQUFTLEVBRTFCLEdBQUksTUFBTSxJQUFXLENBQUMsU0FBUyxHQUM3QixLQUFNLElBQUksV0FBVSw0QkFHdEIsR0FBTyxhQUFlLEtBQUssTUFBTSxHQUduQyxHQUFJLEVBQUksT0FBUSxDQUNkLEdBQUksQ0FBQyxHQUFtQixLQUFLLEVBQUksUUFDL0IsS0FBTSxJQUFJLFdBQVUsNEJBR3RCLEdBQU8sWUFBYyxFQUFJLE9BRzNCLEdBQUksRUFBSSxLQUFNLENBQ1osR0FBSSxDQUFDLEdBQW1CLEtBQUssRUFBSSxNQUMvQixLQUFNLElBQUksV0FBVSwwQkFHdEIsR0FBTyxVQUFZLEVBQUksS0FHekIsR0FBSSxFQUFJLFFBQVMsQ0FDZixHQUFJLE1BQU8sR0FBSSxRQUFRLGFBQWdCLFdBQ3JDLEtBQU0sSUFBSSxXQUFVLDZCQUd0QixHQUFPLGFBQWUsRUFBSSxRQUFRLGNBV3BDLEdBUkksRUFBSSxVQUNOLElBQU8sY0FHTCxFQUFJLFFBQ04sSUFBTyxZQUdMLEVBQUksU0FBVSxDQUNoQixHQUFJLEdBQVcsTUFBTyxHQUFJLFVBQWEsU0FDbkMsRUFBSSxTQUFTLGNBQWdCLEVBQUksU0FFckMsT0FBUSxPQUNELEdBQ0gsR0FBTyxvQkFDUCxVQUNHLE1BQ0gsR0FBTyxpQkFDUCxVQUNHLFNBQ0gsR0FBTyxvQkFDUCxVQUNHLE9BQ0gsR0FBTyxrQkFDUCxjQUVBLEtBQU0sSUFBSSxXQUFVLCtCQUkxQixNQUFPLEdBV1QsWUFBbUIsRUFBSyxFQUFRLENBQzlCLEdBQUksQ0FDRixNQUFPLEdBQU8sUUFDZCxDQUNBLE1BQU8sa0ZDck1YLEdBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxLQUNBLEdBQUEsSUFDQSxHQUFBLEtBQ0EsR0FBQSxRQUFBLFVBRUEsR0FBQSxRQUFBLE1BQ0EsR0FBQSxRQUFBLE9BR0EsR0FBQSxLQWdDQSxhQUE4QixDQUs1QixNQUFPLFVBQ0wsRUFDQSxFQUNBLEVBQTJCLENBRzNCLEdBQUksR0FDSixBQUFJLEVBQUksU0FBVyxHQUFBLFNBQVMsRUFBSSxRQUFRLGtCQUN0QyxHQUFrQixHQUFBLHVCQUF1QixFQUFJLFFBQVEsa0JBR3ZELEdBQU0sR0FBYyxHQUFBLGlCQUFnQixHQUFBLFNBQUEsQ0FFaEMsS0FBTSxHQUE4QixFQUFLLENBQUUsS0FBTSxHQUFNLE9BQVEsS0FDL0QsR0FBSSxlQUNELEdBR0wsQ0FBRSxRQUFTLEdBQW1CLEtBSWhDLEdBQUEsZ0JBQWdCLGVBQWUsU0FBQSxFQUFLLENBQ2xDLEVBQU0sUUFBUSxLQU1mLEVBQVkscUJBQXVCLEVBRXBDLEVBQUksS0FBSyxTQUFVLFVBQUEsQ0FHakIsYUFBYSxVQUFBLENBQ1gsR0FBMkIsRUFBYSxHQUN4QyxFQUFZLGNBQWMsRUFBSSxZQUM5QixFQUFZLGFBSWhCLEtBOUNKLEdBQUEsZUFBQSxHQXNEQSxZQUFvQyxFQUFzQyxFQUFtQixDQUMzRixBQUFJLENBQUMsR0FDTCxHQUFZLEtBQU8sR0FBOEIsRUFBSyxDQUFFLEtBQU0sR0FBTSxPQUFRLEtBQzVFLEVBQVksUUFBUSxNQUFPLEVBQUksYUFDL0IsRUFBWSxRQUFRLFVBQVcsRUFBSSxTQUNuQyxFQUFZLFFBQVEsUUFBUyxFQUFJLFFBYW5DLFlBQ0UsRUFDQSxFQUFrRCxDQUFsRCxBQUFBLElBQUEsUUFBQSxHQUFBLFVBRU0sRUFBTSxHQUFHLEVBQUksVUFBTSxNQUFBLElBQUEsT0FBQSxPQUFBLEVBQUUsY0FFdkIsRUFBTyxHQUNYLEFBQUksRUFBSSxNQUNOLEVBQU8sR0FBRyxHQUFJLFNBQVcsSUFBSyxFQUFJLE1BQU0sS0FDL0IsR0FBSSxhQUFlLEVBQUksTUFDaEMsR0FBTyxHQUFBLHlCQUF5QixFQUFJLGFBQWUsRUFBSSxLQUFPLEtBR2hFLEdBQUksR0FBTyxHQUNYLE1BQUksR0FBUSxRQUFVLEdBQ3BCLElBQVEsR0FFTixFQUFRLFFBQVUsRUFBUSxNQUM1QixJQUFRLEtBRU4sRUFBUSxNQUFRLEdBQ2xCLElBQVEsR0FHSCxFQU1ULFlBQTRCLEVBQXFCLEVBQXVDLE9BQ3RGLE9BQVEsT0FDRCxPQUNILE1BQU8sSUFBOEIsRUFBSyxDQUFFLEtBQU0sU0FFL0MsVUFDSCxNQUFPLElBQUEsRUFBSSxTQUFLLE1BQUEsSUFBQSxPQUFBLE9BQUEsRUFBRSxNQUFNLEdBQUcsT0FBUSxrQkFFaEMscUJBRUgsTUFBTyxJQUE4QixFQUFLLENBQUUsS0FBTSxHQUFNLE9BQVEsTUFNdEUsR0FBTSxJQUFvQixDQUFDLEtBQU0sV0FBWSxTQUc3QyxZQUNFLEVBR0EsRUFBd0IsQ0FFeEIsR0FBTSxHQUF3QyxHQUN4QyxFQUFhLE1BQU0sUUFBUSxHQUFRLEVBQU8sR0FFaEQsU0FBVyxRQUFRLFNBQUEsRUFBRyxDQUNwQixBQUFJLEdBQVEsSUFBTyxJQUNqQixHQUFjLEdBQU8sRUFBSyxNQUl2QixFQUlULEdBQU0sSUFBdUIsQ0FBQyxVQUFXLE9BQVEsVUFBVyxTQUFVLGVBQWdCLE9BVXRGLFlBQ0UsRUFDQSxFQUFxQyxDQUFyQyxBQUFBLElBQUEsUUFBQSxHQUFBLElBRUEsR0FBTSxHQUFzQyxHQUt0QyxFQUFXLEVBQUksU0FBVyxFQUFJLFFBQVUsR0FNeEMsRUFBUyxFQUFJLE9BS2IsRUFBTyxFQUFJLFVBQVksRUFBSSxNQUFRLEVBQVEsTUFBUSxZQUluRCxFQUNKLEVBQUksV0FBYSxTQUFXLEVBQUksUUFBWSxHQUFJLFFBQVUsSUFBZ0MsVUFDdEYsUUFDQSxPQUlBLEVBQWUsRUFBSSxhQUFlLEVBQUksS0FBTyxHQUU3QyxFQUFpQixFQUFRLE1BQU0sRUFBTyxFQUU1QyxTQUFLLFFBQVEsU0FBQSxFQUFHLENBQ2QsT0FBUSxPQUNELFVBQ0gsRUFBWSxRQUFVLEVBQ3RCLFVBQ0csU0FDSCxFQUFZLE9BQVMsRUFDckIsVUFDRyxNQUNILEVBQVksSUFBTSxFQUNsQixVQUNHLFVBS0gsRUFBWSxRQUFVLEVBQUksU0FBVyxHQUFPLE1BQU0sRUFBUSxRQUFVLElBQ3BFLFVBQ0csZUFLSCxFQUFZLGFBQWUsRUFBSSxPQUFTLEdBQUksTUFBTSxHQUFlLEdBQUksSUFBTyxNQUM1RSxVQUNHLE9BQ0gsR0FBSSxJQUFXLE9BQVMsSUFBVyxPQUNqQyxNQVFGLEFBQUksRUFBSSxPQUFTLFFBQ2YsR0FBWSxLQUFPLEdBQUEsU0FBUyxFQUFJLE1BQVEsRUFBSSxLQUFPLEtBQUssVUFBVSxHQUFBLFVBQVUsRUFBSSxRQUVsRixjQUVBLEFBQUksS0FBRyxlQUFlLEtBQUssRUFBSyxJQUM5QixHQUFZLEdBQVEsRUFBK0IsT0FLcEQsRUFqRlQsR0FBQSxtQkFBQSxHQXdHQSxZQUE2QixFQUFjLEVBQXFCLEVBQTZCLENBc0IzRixHQXBCQSxFQUFPLEdBQUEsU0FBQSxDQUNMLEdBQUksR0FDSixRQUFTLEdBQ1QsV0FBWSxHQUNaLFlBQWEsR0FDYixLQUFNLEdBQ04sUUFBUyxJQUNOLEdBR0QsRUFBUSxTQUNWLEdBQU0sU0FBUSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ1QsRUFBTSxVQUFRLENBQ2pCLFFBQVMsQ0FDUCxLQUFNLE9BQ04sUUFBUyxPQUFPLFFBQVEsWUFLMUIsRUFBUSxRQUFTLENBRW5CLEdBQU0sR0FBdUIsTUFBTSxRQUFRLEVBQVEsU0FDL0MsR0FBbUIsRUFBSyxFQUFRLFNBQ2hDLEdBQW1CLEdBQ3ZCLEVBQU0sUUFBTyxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ1IsRUFBTSxTQUNOLEdBUVAsR0FKSSxFQUFRLFlBQWMsQ0FBQyxFQUFNLGFBQy9CLEdBQU0sWUFBYyxPQUFPLFFBQVEsSUFBSSxhQUFlLEdBQUcsWUFHdkQsRUFBUSxLQUFNLENBQ2hCLEdBQU0sR0FBZ0IsRUFBSSxNQUFRLEdBQUEsY0FBYyxFQUFJLE1BQVEsR0FBZ0IsRUFBSSxLQUFNLEVBQVEsTUFBUSxHQUV0RyxBQUFJLE9BQU8sS0FBSyxJQUNkLEdBQU0sS0FBSSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ0wsRUFBTSxNQUNOLElBUVQsR0FBSSxFQUFRLEdBQUksQ0FDZCxHQUFNLEdBQUssRUFBSSxJQUFPLEVBQUksWUFBYyxFQUFJLFdBQVcsY0FDdkQsQUFBSSxHQUNGLEdBQU0sS0FBSSxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ0wsRUFBTSxNQUFJLENBQ2IsV0FBWSxLQUtsQixNQUFJLEdBQVEsYUFBZSxDQUFDLEVBQU0sYUFHaEMsR0FBTSxZQUFjLEdBQW1CLEVBQUssRUFBUSxjQUcvQyxFQW5FVCxHQUFBLGFBQUEsR0E4RUEsWUFDRSxFQUErQixDQUUvQixHQUFNLEdBQWEsR0FBQSxnQkFDYixFQUFTLEVBQVcsWUFHMUIsR0FBSSxHQUFVLEdBQUEsNkJBQTZCLEdBQVMsQ0FDbEQsRUFBTyxxQkFHUCxHQUFNLEdBQVEsRUFBVyxXQUN6QixBQUFJLEdBQVMsRUFBTSxjQUNqQixFQUFNLGFBR1YsTUFBTyxVQUNMLEVBQ0EsRUFDQSxFQUEyQixDQUUzQixHQUFJLEdBQVcsRUFBUSxjQUFnQixFQUFRLGFBQWUsRUFBRyxDQUUvRCxHQUFNLEdBQU8sRUFBSSxJQUNqQixFQUFJLElBQU0sU0FBUyxFQUE0QixFQUFrQyxFQUFlLENBQXRGLEdBQUEsR0FBQSxLQUNSLEFBQUssR0FBQSxNQUFNLEVBQVEsY0FDaEIsS0FBSyxVQUFBLENBQ0osRUFBSyxLQUFLLEVBQU0sRUFBTyxFQUFVLEtBRWxDLEtBQUssS0FBTSxTQUFBLEVBQUMsQ0FDWCxHQUFBLE9BQU8sTUFBTSxNQUlyQixHQUFNLEdBQVEsR0FBTyxTQUNyQixFQUFNLElBQUksR0FDVixFQUFNLElBQUksR0FDVixFQUFNLEdBQUcsUUFBUyxHQUVsQixFQUFNLElBQUksVUFBQSxDQUNSLEdBQU0sR0FBYSxHQUFBLGdCQUVuQixFQUFXLGVBQWUsU0FBQSxFQUFLLENBQzdCLEVBQU0sa0JBQWtCLFNBQUMsRUFBWSxDQUFLLE1BQUEsSUFBYSxFQUFPLEVBQUssS0FDbkUsR0FBTSxHQUFTLEVBQVcsWUFDMUIsR0FBSSxHQUFBLDZCQUE2QixHQUFTLENBQ3hDLEdBQU0sR0FBUSxFQUFXLFdBQ3pCLEFBQUksR0FFRixFQUFNLGtCQUFrQixDQUFFLE9BQVEsR0FBQSxxQkFBcUIsUUFLN0QsRUFBSSxLQUFLLFNBQVUsVUFBQSxDQUNqQixHQUFNLEdBQVMsRUFBVyxZQUMxQixBQUFJLEdBQUEsNkJBQTZCLElBQy9CLGFBQWEsVUFBQSxDQUVYLEFBQUksR0FBVyxFQUFlLHdCQUkzQixFQUFlLDZCQUt4QixPQXBFTixHQUFBLGVBQUEsR0FvRkEsWUFBbUMsRUFBc0IsQ0FDdkQsR0FBTSxHQUFhLEVBQU0sUUFBVSxFQUFNLFlBQWMsRUFBTSxhQUFnQixFQUFNLFFBQVUsRUFBTSxPQUFPLFdBQzFHLE1BQU8sR0FBYSxTQUFTLEVBQXNCLElBQU0sSUFJM0QsWUFBa0MsRUFBc0IsQ0FDdEQsR0FBTSxHQUFTLEdBQTBCLEdBQ3pDLE1BQU8sSUFBVSxJQU9uQixZQUE2QixFQU01QixDQU1DLE1BQU8sVUFDTCxFQUNBLEVBQ0EsRUFDQSxFQUFzQyxDQUd0QyxHQUFNLEdBQXFCLEdBQVcsRUFBUSxtQkFBc0IsR0FFcEUsR0FBSSxFQUFrQixHQUFRLENBQzVCLEdBQUEsVUFBVSxTQUFBLEVBQU0sQ0FHZCxHQUFNLEdBQWUsRUFBWSxxQkFDakMsQUFBSSxHQUFlLEVBQU8sWUFBYyxRQUN0QyxFQUFPLFFBQVEsR0FHakIsR0FBTSxHQUFTLEdBQUEsZ0JBQWdCLFlBQy9CLEdBQUksR0FBVSxHQUFBLDZCQUE2QixHQUFTLENBTWxELEdBQU0sR0FBMkIsRUFBZSxrQkFBb0IsT0FDcEUsR0FBSSxFQUF5QixDQUMzQixHQUFNLEdBQWlCLEVBQU8sb0JBSTlCLEFBQUksR0FBa0IsRUFBZSxTQUFXLFFBQzlDLEdBQWUsT0FBUyxHQUFBLHFCQUFxQixVQUluRCxHQUFNLEdBQVUsR0FBQSxpQkFBaUIsR0FFaEMsRUFBWSxPQUFTLEVBQ3RCLEVBQUssS0FHUCxPQUdGLEVBQUssSUF6RFQsR0FBQSxhQUFBLDhFQzVkQSxHQUFBLEtBU0UsRUFBQSxTQUFBLEdBQUEsU0FHQSxFQUFBLE9BQUEsR0FBQSxPQUtGLEdBQUEsR0FBQSxLQUNFLEVBQUEsd0JBQUEsRUFBQSx3QkFDQSxFQUFBLGNBQUEsRUFBQSxjQUNBLEVBQUEsaUJBQUEsRUFBQSxpQkFDQSxFQUFBLGFBQUEsRUFBQSxhQUNBLEVBQUEsZUFBQSxFQUFBLGVBQ0EsRUFBQSxlQUFBLEVBQUEsZUFDQSxFQUFBLGtCQUFBLEVBQUEsa0JBQ0EsRUFBQSxjQUFBLEVBQUEsY0FDQSxFQUFBLElBQUEsRUFBQSxJQUNBLEVBQUEsU0FBQSxFQUFBLFNBQ0EsRUFBQSxNQUFBLEVBQUEsTUFDQSxFQUFBLGlCQUFBLEVBQUEsaUJBQ0EsRUFBQSxZQUFBLEVBQUEsWUFDQSxFQUFBLFdBQUEsRUFBQSxXQUNBLEVBQUEsU0FBQSxFQUFBLFNBQ0EsRUFBQSxVQUFBLEVBQUEsVUFDQSxFQUFBLE9BQUEsRUFBQSxPQUNBLEVBQUEsUUFBQSxFQUFBLFFBQ0EsRUFBQSxRQUFBLEVBQUEsUUFDQSxFQUFBLFVBQUEsRUFBQSxVQUlGLEdBQUEsSUFBQSxLQUFTLEVBQUEsWUFBQSxHQUFBLFlBQ1QsR0FBQSxJQUFBLEtBQVMsRUFBQSxXQUFBLEdBQUEsV0FDVCxHQUFBLElBQUEsS0FBUyxFQUFBLG9CQUFBLEdBQUEsb0JBQXFCLEVBQUEsS0FBQSxHQUFBLEtBQU0sRUFBQSxZQUFBLEdBQUEsWUFBYSxFQUFBLE1BQUEsR0FBQSxNQUFPLEVBQUEsTUFBQSxHQUFBLE1BQU8sRUFBQSxpQkFBQSxHQUFBLGlCQUMvRCxHQUFBLElBQUEsS0FBUyxFQUFBLGdCQUFBLEdBQUEsZ0JBQ1QsR0FBQSxJQUFBLEtBQVMsRUFBQSxTQUFBLEdBQUEsU0FFVCxHQUFBLElBQUEsS0FDQSxHQUFBLEtBQ0EsR0FBQSxRQUFBLFVBRUEsR0FBQSxLQVNtRCxFQUFBLFNBQUEsR0FSbkQsR0FBQSxJQUFBLEtBQ0EsR0FBQSxLQU91QyxFQUFBLFdBQUEsR0FMdkMsR0FBTSxJQUFZLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FDYixHQUFBLGNBQ0EsSUFHb0IsRUFBQSxhQUFBLEdBSXpCLEdBQU0sSUFBVSxHQUFBLGlCQUNoQixBQUFJLEdBQVEsWUFDVixJQUFRLFdBQVcsV0FBYSxHQUFRLFdBQVcsWUFBYyxHQUNqRSxHQUFRLFdBQVcsV0FBVyxPQUFTLEdBQVEsV0FBVyxXQUFXLFFBQVUsaUZDbEVqRixHQUFBLElBR00sR0FBaUIsNkRBT3ZCLEdBQUEsVUFBQSxDQXFDRSxXQUFtQixFQUErQixDQU1oRCxHQU5pQixJQUFBLFFBQUEsR0FBQSxJQXZCWixLQUFBLEtBQWUsRUFBUSxHQXdCNUIsR0FBQSxPQUFPLElBQUksbUZBR1gsS0FBSyxTQUFXLEVBQVEsU0FBVyxHQUFBLGtCQUF1QixRQUV0RCxDQUFDLEtBQUssU0FBVSxDQUNsQixHQUFBLE9BQU8sTUFBTSxxREFDYixPQUlGLEtBQUssUUFBVSxLQUFLLFNBQVMsT0FBTyxFQUFRLFdBQVksSUFNbkQsU0FBQSxVQUFBLFVBQVAsU0FBaUIsRUFBdUMsRUFBd0IsQ0FBaEYsR0FBQSxHQUFBLEtBQ0UsQUFBSSxDQUFDLEtBQUssU0FJVixNQUFLLGVBQWlCLEVBR3RCLEtBQUssUUFBUSxPQUFPLENBQ2xCLFdBRUEsU0FBQyxFQUFhLENBRVosRUFBUyxVQUFVLG9CQUFxQixDQUFDLFlBQWEsRUFBSyw0QkFBNEIsS0FBSyxVQVMxRixFQUFBLFVBQUEsNEJBQVIsU0FBb0MsRUFBYyxDQUFsRCxHQUFBLEdBQUEsS0FDRSxNQUFPLFVBQUMsRUFBa0IsRUFBYyxDQUN0QyxHQUFNLEdBQU0sRUFBSyxnQkFBa0IsRUFBSyxpQkFFeEMsQUFBSSxHQUFPLEVBQUksZUFBZSxJQUM1QixFQUFJLFVBQVUsU0FBQSxFQUFLLENBQ2pCLEFBQUksR0FDRixFQUFNLFNBQVMsUUFBUyxHQUcxQixFQUFNLGtCQUFrQixTQUFDLEVBQVksQ0FDbkMsR0FBTSxHQUFLLEVBQU0sV0FBYSxFQUFNLFVBQVUsUUFBVSxFQUFNLFVBQVUsT0FBTyxHQUUvRSxHQUFJLEVBQUksQ0FDTixHQUFNLEdBQVUsR0FBZSxLQUFLLEVBQUcsT0FBUyxJQUVoRCxBQUFJLEdBRUYsR0FBRyxLQUFPLEVBQVEsR0FDbEIsRUFBRyxNQUFRLEVBQVEsR0FDbkIsRUFBTSxRQUFhLEVBQUcsS0FBSSxLQUFLLEVBQUcsTUFFbEMsRUFBTSxNQUFLLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FDTixFQUFNLE9BQUssQ0FDZCxZQUFhLEVBQVEsR0FBRyxPQUFPLEVBQUcsUUFLeEMsTUFBTyxLQUdULEVBQUksaUJBQWlCLEtBR3pCLEVBQVUsRUFBVyxLQTVHWCxFQUFBLEdBQWEsWUFLYixFQUFBLFdBQXFCLFdBMEdyQyxLQW5IYSxHQUFBLFFBQUEscUVDWGIsR0FBQSxJQUFBLEtBQ0EsR0FBQSxJQUVNLEdBQVMsR0FBQSxrQkFHZixHQUFBLFVBQUEsQ0FtQkUsV0FBbUIsRUFBbUMsQ0FBbkMsQUFBQSxJQUFBLFFBQUEsR0FBQSxJQVZaLEtBQUEsS0FBZSxFQUFlLEdBS3BCLEtBQUEsUUFBb0IsQ0FBQyxNQUFPLE9BQVEsT0FBUSxRQUFTLFFBQVMsVUFNekUsRUFBUSxRQUNWLE1BQUssUUFBVSxFQUFRLFFBT3BCLFNBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQXVDLEVBQXdCLENBQzlFLEFBQU0sV0FBYSxLQUluQixLQUFLLFFBQVEsUUFBUSxTQUFDLEVBQWEsQ0FDakMsQUFBTSxJQUFTLElBQU8sU0FLdEIsR0FBQSxLQUFLLEdBQU8sUUFBUyxFQUFPLFNBQUMsRUFBK0IsQ0FBSyxNQUFBLFdBQUEsUUFBQyxHQUFBLEdBQUEsRUFBQSxFQUFBLEVBQUEsVUFBQSxPQUFBLElBQUEsRUFBQSxHQUFBLFVBQUEsR0FDaEUsR0FBTSxHQUFNLElBRVosQUFBSSxFQUFJLGVBQWUsSUFDckIsRUFBSSxVQUFVLFNBQUEsRUFBSyxDQUNqQixFQUFNLFNBQVMsR0FBQSxTQUFTLFdBQVcsSUFDbkMsRUFBTSxTQUFTLFlBQWEsR0FDNUIsRUFBTSxrQkFBa0IsU0FBQSxFQUFLLENBQzNCLFNBQU0sT0FBUyxVQUNSLElBR1QsR0FBSSxHQUFVLEdBQUEsU0FBUyxFQUFNLEtBQzdCLEFBQUksSUFBVSxTQUNSLEVBQUssS0FBTyxJQUNkLEdBQVUscUJBQXFCLElBQUEsU0FBUyxFQUFLLE1BQU0sR0FBSSxNQUFRLGtCQUMvRCxFQUFNLFNBQVMsWUFBYSxFQUFLLE1BQU0sSUFDdkMsRUFBSSxlQUFlLElBRWhCLEFBQUksSUFBVSxTQUFXLEVBQUssWUFBYyxPQUNqRCxFQUFJLGlCQUFpQixFQUFLLElBRTFCLEVBQUksZUFBZSxLQU1yQixHQUNGLFNBQVMsVUFBVSxNQUFNLEtBQUssRUFBc0IsR0FBTyxRQUFTLFNBaEU5RCxFQUFBLEdBQWEsaUJBcUU3QixLQXpFYSxHQUFBLGVBQUEsZ0ZDTGIsR0FBQSxJQVNBLEdBQUEsVUFBQSxDQWlCRSxXQUFtQixFQUFzQixDQVJsQyxLQUFBLEtBQWUsRUFBTSxHQVMxQixLQUFLLFNBQVEsR0FBQSxTQUFBLENBQ1gsU0FBVSxHQUNWLFVBQVcsSUFDUixHQU9BLFNBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQTZELEVBQXdCLENBQ3BHLEVBQXdCLFNBQUMsRUFBYyxFQUFnQixDQUNyRCxHQUFNLEdBQU8sSUFBZ0IsZUFBZSxHQUM1QyxHQUFJLEVBQU0sQ0FDUixHQUFJLEVBQUssU0FBUyxTQUVoQixTQUlGLEdBQUEsZUFBZSxVQUFBLENBQ2IsQUFBSSxFQUFLLFNBQVMsVUFDaEIsU0FBUSxJQUFJLEtBQUssVUFBVSxFQUFPLEtBQU0sSUFDcEMsR0FDRixRQUFRLElBQUksS0FBSyxVQUFVLEVBQU0sS0FBTSxLQUd6QyxTQUFRLElBQUksR0FDUixHQUNGLFFBQVEsSUFBSSxNQU1wQixNQUFPLE1BakRHLEVBQUEsR0FBYSxRQW9EN0IsS0F4RGEsR0FBQSxNQUFBLHFFQ1RiLEdBQUEsSUFBQSxJQUdBLEdBQUEsVUFBQSxDQUFBLFlBQUEsQ0FTUyxLQUFBLEtBQWUsRUFBTyxHQVV0QixTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUE2RCxFQUF3QixDQUNwRyxFQUF3QixTQUFDLEVBQW1CLENBQzFDLEdBQU0sR0FBTyxJQUFnQixlQUFlLEdBQzVDLEdBQUksRUFBTSxDQUVSLEdBQUksQ0FDRixHQUFJLEVBQUssaUJBQWlCLEVBQWMsRUFBSyxnQkFDM0MsVUFBQSxPQUFPLEtBQUssd0VBQ0wsVUFFVCxDQUNBLE1BQVEsR0FBSyxlQUFpQixFQUdoQyxNQUFRLEdBQUssZUFBaUIsRUFFaEMsTUFBTyxNQUtILEVBQUEsVUFBQSxpQkFBUixTQUF5QixFQUFxQixFQUFxQixDQUNqRSxNQUFLLEdBSUQsUUFBSyxvQkFBb0IsRUFBYyxJQUl2QyxLQUFLLHNCQUFzQixFQUFjLElBUHBDLElBZUgsRUFBQSxVQUFBLG9CQUFSLFNBQTRCLEVBQXFCLEVBQW9CLENBQ25FLEdBQU0sR0FBaUIsRUFBYSxRQUM5QixFQUFrQixFQUFjLFFBb0J0QyxNQWpCSSxHQUFDLEdBQWtCLENBQUMsR0FLbkIsR0FBa0IsQ0FBQyxHQUFxQixDQUFDLEdBQWtCLEdBSTVELElBQW1CLEdBSW5CLENBQUMsS0FBSyxtQkFBbUIsRUFBYyxJQUl2QyxDQUFDLEtBQUssa0JBQWtCLEVBQWMsS0FRcEMsRUFBQSxVQUFBLG9CQUFSLFNBQTRCLEVBQVksQ0FDdEMsR0FBTSxHQUFZLEVBQU0sVUFFeEIsR0FBSSxFQUNGLEdBQUksQ0FFRixNQUFPLEdBQVUsT0FBTyxHQUFHLFdBQVcsWUFDdEMsQ0FDQSxlQUVPLEVBQU0sV0FDZixNQUFPLEdBQU0sV0FBVyxRQU1wQixFQUFBLFVBQUEsa0JBQVIsU0FBMEIsRUFBcUIsRUFBb0IsQ0FDakUsR0FBSSxHQUFnQixLQUFLLG9CQUFvQixHQUN6QyxFQUFpQixLQUFLLG9CQUFvQixHQUc5QyxHQUFJLENBQUMsR0FBaUIsQ0FBQyxFQUNyQixNQUFPLEdBWVQsR0FSSyxHQUFpQixDQUFDLEdBQW9CLENBQUMsR0FBaUIsR0FJN0QsR0FBZ0IsRUFDaEIsRUFBaUIsRUFHYixFQUFlLFNBQVcsRUFBYyxRQUMxQyxNQUFPLEdBSVQsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFlLE9BQVEsSUFBSyxDQUM5QyxHQUFNLEdBQVMsRUFBZSxHQUN4QixFQUFTLEVBQWMsR0FFN0IsR0FDRSxFQUFPLFdBQWEsRUFBTyxVQUMzQixFQUFPLFNBQVcsRUFBTyxRQUN6QixFQUFPLFFBQVUsRUFBTyxPQUN4QixFQUFPLFdBQWEsRUFBTyxTQUUzQixNQUFPLEdBSVgsTUFBTyxJQUlELEVBQUEsVUFBQSx1QkFBUixTQUErQixFQUFZLENBQ3pDLE1BQU8sR0FBTSxXQUFhLEVBQU0sVUFBVSxRQUFVLEVBQU0sVUFBVSxPQUFPLElBSXJFLEVBQUEsVUFBQSxzQkFBUixTQUE4QixFQUFxQixFQUFvQixDQUNyRSxHQUFNLEdBQW9CLEtBQUssdUJBQXVCLEdBQ2hELEVBQW1CLEtBQUssdUJBQXVCLEdBY3JELE1BWkksR0FBQyxHQUFxQixDQUFDLEdBSXZCLEVBQWtCLE9BQVMsRUFBaUIsTUFBUSxFQUFrQixRQUFVLEVBQWlCLE9BSWpHLENBQUMsS0FBSyxtQkFBbUIsRUFBYyxJQUl2QyxDQUFDLEtBQUssa0JBQWtCLEVBQWMsS0FRcEMsRUFBQSxVQUFBLG1CQUFSLFNBQTJCLEVBQXFCLEVBQW9CLENBQ2xFLEdBQUksR0FBcUIsRUFBYSxZQUNsQyxFQUFzQixFQUFjLFlBR3hDLEdBQUksQ0FBQyxHQUFzQixDQUFDLEVBQzFCLE1BQU8sR0FJVCxHQUFLLEdBQXNCLENBQUMsR0FBeUIsQ0FBQyxHQUFzQixFQUMxRSxNQUFPLEdBR1QsRUFBcUIsRUFDckIsRUFBc0IsRUFHdEIsR0FBSSxDQUNGLE1BQVUsR0FBbUIsS0FBSyxNQUFRLEVBQW9CLEtBQUssU0FDbkUsQ0FDQSxNQUFPLEtBL0xHLEVBQUEsR0FBYSxTQWtNN0IsS0F0TWEsR0FBQSxPQUFBLHFFQ0hiLEdBQUEsSUFBQSxJQUdBLEdBQUEsVUFBQSxDQXFCRSxXQUFtQixFQUE2QixDQUE3QixBQUFBLElBQUEsUUFBQSxHQUFBLElBWlosS0FBQSxLQUFlLEVBQU0sR0FjMUIsS0FBSyxPQUFTLEVBQVEsT0FBUyxHQUFBLGtCQUF1QixNQU1qRCxTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUF1QyxFQUF3QixDQUFoRixHQUFBLEdBQUEsS0FDRSxHQUFJLENBQUMsS0FBSyxPQUFRLENBQ2hCLEdBQUEsT0FBTyxNQUFNLGlEQUNiLE9BSUYsR0FBTSxHQUFhLEtBQUssT0FBTyxRQUUvQixLQUFLLE9BQU8sUUFBVSxTQUFDLEVBQVksQ0FLakMsR0FKSSxJQUFnQixlQUFlLElBQ2pDLElBQWdCLGlCQUFpQixFQUFPLENBQUUsa0JBQW1CLElBRzNELE1BQU8sSUFBZSxXQUN4QixFQUFXLEtBQUssRUFBSyxPQUFRLFdBQ3BCLEVBQUssT0FBTyxRQUNyQixLQUFNLElBS1YsS0FBSyxPQUFPLEtBQUssR0FBRyxRQUFTLFNBQUMsRUFBZSxDQUMzQyxBQUFJLElBQWdCLGVBQWUsSUFDakMsSUFBZ0IsVUFBVSxTQUFBLEVBQUssQ0FDN0IsQUFBSSxHQUFBLGFBQWEsRUFBUSxPQUN2QixHQUFNLFNBQVMsVUFBVyxvQ0FDMUIsSUFBZ0IsaUJBQWlCLEVBQVEsQ0FBRSxrQkFBbUIsS0FFOUQsR0FBTSxTQUFTLFNBQVUsR0FDekIsSUFBZ0IsZUFBZSwwQ0F2RDNCLEVBQUEsR0FBYSxRQThEN0IsS0FsRWEsR0FBQSxNQUFBLGdGQ0hiLEdBQUEsSUFRQSxHQUFBLFVBQUEsQ0FjRSxXQUFvQyxFQUE4QyxDQUE5QyxBQUFBLElBQUEsUUFBQSxHQUFBLENBQW9DLE1BQU8sSUFBM0MsS0FBQSxTQUFBLEVBTDdCLEtBQUEsS0FBZSxFQUFlLEdBVTlCLFNBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQTZELEVBQXdCLENBQ3BHLEVBQXdCLFNBQUMsRUFBYyxFQUFnQixDQUNyRCxHQUFNLEdBQU8sSUFBZ0IsZUFBZSxHQUM1QyxNQUFLLEdBR0UsRUFBSywwQkFBMEIsRUFBTyxHQUZwQyxLQVNOLEVBQUEsVUFBQSwwQkFBUCxTQUFpQyxFQUFjLEVBQWdCLE9BQzdELEdBQUksQ0FBQyxHQUFRLENBQUMsRUFBSyxtQkFBcUIsQ0FBQyxHQUFBLFFBQVEsRUFBSyxtQkFDcEQsTUFBTyxHQUVULEdBQU0sR0FBUSxFQUFLLGtCQUFvQyxNQUFRLEVBQUssa0JBQWtCLFlBQVksS0FFNUYsRUFBWSxLQUFLLGtCQUFrQixFQUFLLG1CQUU5QyxHQUFJLEVBQVcsQ0FDYixHQUFJLEdBQVEsR0FBQSxTQUFBLEdBQ1AsRUFBTSxVQUdMLEVBQXNCLEdBQUEsVUFBVSxFQUFXLEtBQUssU0FBUyxPQUMvRCxNQUFJLElBQUEsY0FBYyxJQUNoQixHQUFRLEdBQUEsU0FBQSxHQUFBLFNBQUEsR0FDSCxFQUFNLFVBQVEsR0FBQSxHQUFBLEVBQ2hCLEdBQUksR0FBQSxTQUFBLEdBQ0EsR0FBbUIsS0FLNUIsR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNLLEdBQUssQ0FDUixTQUFRLElBSVosTUFBTyxJQU1ELEVBQUEsVUFBQSxrQkFBUixTQUEwQixFQUFvQixhQUU1QyxHQUFJLENBQ0YsR0FBTSxHQUFhLENBQ2pCLE9BQ0EsVUFDQSxRQUNBLE9BQ0EsU0FDQSxXQUNBLGFBQ0EsZUFDQSxVQUdJLEVBQTBDLE9BR2hELE9BQWtCLEdBQUEsR0FBQSxTQUFBLE9BQU8sS0FBSyxJQUFNLEVBQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxLQUFBLEVBQUEsRUFBQSxPQUFFLENBQWpDLEdBQU0sR0FBRyxFQUFBLE1BQ1osR0FBSSxFQUFXLFFBQVEsS0FBUyxHQUdoQyxJQUFNLEdBQVEsRUFBTSxHQUNwQixFQUFlLEdBQU8sR0FBQSxRQUFRLEdBQVUsRUFBZ0IsV0FBYSxxR0FJdkUsR0FBSSxNQUFPLEdBQU0sUUFBVyxXQUFZLENBQ3RDLEdBQU0sR0FBa0IsRUFBTSxhQUU5QixPQUFrQixHQUFBLEdBQUEsU0FBQSxPQUFPLEtBQUssSUFBZ0IsRUFBQSxFQUFBLE9BQUEsQ0FBQSxFQUFBLEtBQUEsRUFBQSxFQUFBLE9BQUUsQ0FBM0MsR0FBTSxHQUFHLEVBQUEsTUFDTixFQUFRLEVBQWdCLEdBQzlCLEVBQWUsR0FBTyxHQUFBLFFBQVEsR0FBVSxFQUFnQixXQUFhLHFHQUl6RSxNQUFPLFNBQ0EsRUFBUCxDQUNBLEdBQUEsT0FBTyxNQUFNLHNEQUF1RCxHQUd0RSxNQUFPLE9BeEdLLEVBQUEsR0FBYSxpQkEwRzdCLEtBOUdhLEdBQUEsZUFBQSxLQ1RiLG1CQU1BLEFBQUMsVUFBUyxFQUFFLENBQUMsR0FBRyxNQUFPLEtBQVUsVUFBVSxNQUFPLEtBQVMsWUFBYSxHQUFPLFFBQVEsWUFBWSxNQUFPLFNBQVMsWUFBWSxPQUFPLElBQUssT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFJLEdBQUUsQUFBRyxNQUFPLFNBQVMsWUFBYSxFQUFFLE9BQVksQUFBRyxNQUFPLFNBQVMsWUFBYSxFQUFFLE9BQVksQUFBRyxNQUFPLE9BQU8sWUFBYSxFQUFFLEtBQVUsRUFBRSxLQUFLLEVBQUUsWUFBYyxPQUFPLFVBQVUsQ0FBQyxHQUFJLEdBQU8sRUFBTyxFQUFRLE1BQVEsWUFBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFJLEdBQUUsTUFBTyxVQUFTLFlBQVksUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU8sR0FBRSxFQUFFLElBQUksR0FBRyxFQUFFLE1BQU8sR0FBRSxFQUFFLElBQUksR0FBSSxHQUFFLEdBQUksT0FBTSx1QkFBdUIsRUFBRSxLQUFLLEtBQU8sR0FBRSxLQUFLLG1CQUFvQixFQUFHLEdBQUksR0FBRSxFQUFFLEdBQUcsQ0FBQyxRQUFRLElBQUksRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFFLFFBQVEsU0FBUyxFQUFFLENBQUMsR0FBSSxHQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTyxHQUFFLEdBQUksSUFBSSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxHQUFHLE1BQU8sR0FBRSxHQUFHLFFBQWtELE9BQXRDLEdBQUUsTUFBTyxVQUFTLFlBQVksUUFBZ0IsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLElBQUksRUFBRSxFQUFFLElBQUksTUFBTyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBUSxFQUFPLEVBQVEsQ0FDcjFCLEFBQUMsVUFBVSxFQUFPLENBQ2xCLGFBQ0EsR0FBSSxHQUFXLEVBQU8sa0JBQW9CLEVBQU8sdUJBRTdDLEVBR0YsR0FBSSxFQUFVLENBQ1osR0FBSSxHQUFTLEVBQ1QsRUFBVyxHQUFJLEdBQVMsR0FDeEIsRUFBVSxFQUFPLFNBQVMsZUFBZSxJQUM3QyxFQUFTLFFBQVEsRUFBUyxDQUN4QixjQUFlLEtBRWpCLEVBQWdCLFVBQVksQ0FDMUIsRUFBUSxLQUFRLEVBQVMsRUFBRSxFQUFTLFdBRTdCLENBQUMsRUFBTyxjQUFnQixNQUFPLEdBQU8sZ0JBQW1CLFlBQWEsQ0FDL0UsR0FBSSxHQUFVLEdBQUksR0FBTyxlQUN6QixFQUFRLE1BQU0sVUFBWSxFQUMxQixFQUFnQixVQUFZLENBQzFCLEVBQVEsTUFBTSxZQUFZLFFBRXZCLEFBQUksWUFBYyxJQUFVLHNCQUF3QixHQUFPLFNBQVMsY0FBYyxVQUN2RixFQUFnQixVQUFZLENBSTFCLEdBQUksR0FBVyxFQUFPLFNBQVMsY0FBYyxVQUM3QyxFQUFTLG1CQUFxQixVQUFZLENBQ3hDLElBRUEsRUFBUyxtQkFBcUIsS0FDOUIsRUFBUyxXQUFXLFlBQVksR0FDaEMsRUFBVyxNQUViLEVBQU8sU0FBUyxnQkFBZ0IsWUFBWSxJQUc5QyxFQUFnQixVQUFZLENBQzFCLFdBQVcsRUFBVSxJQUszQixHQUFJLEdBQ0EsRUFBUSxHQUVaLFlBQW9CLENBQ2xCLEVBQVcsR0FHWCxPQUZJLEdBQUcsRUFDSCxFQUFNLEVBQU0sT0FDVCxHQUFLLENBSVYsSUFIQSxFQUFXLEVBQ1gsRUFBUSxHQUNSLEVBQUksR0FDRyxFQUFFLEVBQUksR0FDWCxFQUFTLEtBRVgsRUFBTSxFQUFNLE9BRWQsRUFBVyxHQUdiLEVBQU8sUUFBVSxFQUNqQixXQUFtQixFQUFNLENBQ3ZCLEFBQUksRUFBTSxLQUFLLEtBQVUsR0FBSyxDQUFDLEdBQzdCLE9BSUQsS0FBSyxLQUFLLE1BQU8sU0FBVyxZQUFjLE9BQVMsTUFBTyxPQUFTLFlBQWMsS0FBTyxNQUFPLFNBQVcsWUFBYyxPQUFTLEtBQ2xJLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBUSxFQUFPLEVBQVEsQ0FDekMsYUFDQSxHQUFJLEdBQVksRUFBUSxHQUd4QixZQUFvQixFQUVwQixHQUFJLEdBQVcsR0FFWCxFQUFXLENBQUMsWUFDWixFQUFZLENBQUMsYUFDYixFQUFVLENBQUMsV0FFZixFQUFPLFFBQVUsRUFFakIsV0FBaUIsRUFBVSxDQUN6QixHQUFJLE1BQU8sSUFBYSxXQUN0QixLQUFNLElBQUksV0FBVSwrQkFFdEIsS0FBSyxNQUFRLEVBQ2IsS0FBSyxNQUFRLEdBQ2IsS0FBSyxRQUFVLE9BQ1gsSUFBYSxHQUNmLEVBQXNCLEtBQU0sR0FJaEMsRUFBUSxVQUFVLE1BQVcsU0FBVSxFQUFZLENBQ2pELE1BQU8sTUFBSyxLQUFLLEtBQU0sSUFFekIsRUFBUSxVQUFVLEtBQU8sU0FBVSxFQUFhLEVBQVksQ0FDMUQsR0FBSSxNQUFPLElBQWdCLFlBQWMsS0FBSyxRQUFVLEdBQ3RELE1BQU8sSUFBZSxZQUFjLEtBQUssUUFBVSxFQUNuRCxNQUFPLE1BRVQsR0FBSSxHQUFVLEdBQUksTUFBSyxZQUFZLEdBQ25DLEdBQUksS0FBSyxRQUFVLEVBQVMsQ0FDMUIsR0FBSSxHQUFXLEtBQUssUUFBVSxFQUFZLEVBQWMsRUFDeEQsRUFBTyxFQUFTLEVBQVUsS0FBSyxhQUUvQixNQUFLLE1BQU0sS0FBSyxHQUFJLEdBQVUsRUFBUyxFQUFhLElBR3RELE1BQU8sSUFFVCxXQUFtQixFQUFTLEVBQWEsRUFBWSxDQUNuRCxLQUFLLFFBQVUsRUFDWCxNQUFPLElBQWdCLFlBQ3pCLE1BQUssWUFBYyxFQUNuQixLQUFLLGNBQWdCLEtBQUssb0JBRXhCLE1BQU8sSUFBZSxZQUN4QixNQUFLLFdBQWEsRUFDbEIsS0FBSyxhQUFlLEtBQUssbUJBRzdCLEVBQVUsVUFBVSxjQUFnQixTQUFVLEVBQU8sQ0FDbkQsRUFBUyxRQUFRLEtBQUssUUFBUyxJQUVqQyxFQUFVLFVBQVUsbUJBQXFCLFNBQVUsRUFBTyxDQUN4RCxFQUFPLEtBQUssUUFBUyxLQUFLLFlBQWEsSUFFekMsRUFBVSxVQUFVLGFBQWUsU0FBVSxFQUFPLENBQ2xELEVBQVMsT0FBTyxLQUFLLFFBQVMsSUFFaEMsRUFBVSxVQUFVLGtCQUFvQixTQUFVLEVBQU8sQ0FDdkQsRUFBTyxLQUFLLFFBQVMsS0FBSyxXQUFZLElBR3hDLFdBQWdCLEVBQVMsRUFBTSxFQUFPLENBQ3BDLEVBQVUsVUFBWSxDQUNwQixHQUFJLEdBQ0osR0FBSSxDQUNGLEVBQWMsRUFBSyxTQUNaLEdBQVAsQ0FDQSxNQUFPLEdBQVMsT0FBTyxFQUFTLElBRWxDLEFBQUksSUFBZ0IsRUFDbEIsRUFBUyxPQUFPLEVBQVMsR0FBSSxXQUFVLHVDQUV2QyxFQUFTLFFBQVEsRUFBUyxLQUtoQyxFQUFTLFFBQVUsU0FBVSxFQUFNLEVBQU8sQ0FDeEMsR0FBSSxHQUFTLEVBQVMsRUFBUyxHQUMvQixHQUFJLEVBQU8sU0FBVyxRQUNwQixNQUFPLEdBQVMsT0FBTyxFQUFNLEVBQU8sT0FFdEMsR0FBSSxHQUFXLEVBQU8sTUFFdEIsR0FBSSxFQUNGLEVBQXNCLEVBQU0sT0FDdkIsQ0FDTCxFQUFLLE1BQVEsRUFDYixFQUFLLFFBQVUsRUFHZixPQUZJLElBQUksR0FDSixHQUFNLEVBQUssTUFBTSxPQUNkLEVBQUUsR0FBSSxJQUNYLEVBQUssTUFBTSxJQUFHLGNBQWMsR0FHaEMsTUFBTyxJQUVULEVBQVMsT0FBUyxTQUFVLEVBQU0sRUFBTyxDQUN2QyxFQUFLLE1BQVEsRUFDYixFQUFLLFFBQVUsRUFHZixPQUZJLEdBQUksR0FDSixFQUFNLEVBQUssTUFBTSxPQUNkLEVBQUUsRUFBSSxHQUNYLEVBQUssTUFBTSxHQUFHLGFBQWEsR0FFN0IsTUFBTyxJQUdULFdBQWlCLEVBQUssQ0FFcEIsR0FBSSxHQUFPLEdBQU8sRUFBSSxLQUN0QixHQUFJLEdBQVEsT0FBTyxJQUFRLFVBQVksTUFBTyxJQUFRLGFBQWUsTUFBTyxJQUFTLFdBQ25GLE1BQU8sV0FBb0IsQ0FDekIsRUFBSyxNQUFNLEVBQUssWUFLdEIsV0FBK0IsRUFBTSxFQUFVLENBRTdDLEdBQUksR0FBUyxHQUNiLFdBQWlCLEdBQU8sQ0FDdEIsQUFBSSxHQUdKLEdBQVMsR0FDVCxFQUFTLE9BQU8sRUFBTSxLQUd4QixZQUFtQixHQUFPLENBQ3hCLEFBQUksR0FHSixHQUFTLEdBQ1QsRUFBUyxRQUFRLEVBQU0sS0FHekIsYUFBdUIsQ0FDckIsRUFBUyxHQUFXLEdBR3RCLEdBQUksSUFBUyxFQUFTLElBQ3RCLEFBQUksR0FBTyxTQUFXLFNBQ3BCLEVBQVEsR0FBTyxPQUluQixXQUFrQixFQUFNLEVBQU8sQ0FDN0IsR0FBSSxHQUFNLEdBQ1YsR0FBSSxDQUNGLEVBQUksTUFBUSxFQUFLLEdBQ2pCLEVBQUksT0FBUyxnQkFDTixFQUFQLENBQ0EsRUFBSSxPQUFTLFFBQ2IsRUFBSSxNQUFRLEVBRWQsTUFBTyxHQUdULEVBQVEsUUFBVSxFQUNsQixXQUFpQixFQUFPLENBQ3RCLE1BQUksYUFBaUIsTUFDWixFQUVGLEVBQVMsUUFBUSxHQUFJLE1BQUssR0FBVyxHQUc5QyxFQUFRLE9BQVMsRUFDakIsV0FBZ0IsRUFBUSxDQUN0QixHQUFJLEdBQVUsR0FBSSxNQUFLLEdBQ3ZCLE1BQU8sR0FBUyxPQUFPLEVBQVMsR0FHbEMsRUFBUSxJQUFNLEdBQ2QsWUFBYSxFQUFVLENBQ3JCLEdBQUksR0FBTyxLQUNYLEdBQUksT0FBTyxVQUFVLFNBQVMsS0FBSyxLQUFjLGlCQUMvQyxNQUFPLE1BQUssT0FBTyxHQUFJLFdBQVUscUJBR25DLEdBQUksR0FBTSxFQUFTLE9BQ2YsRUFBUyxHQUNiLEdBQUksQ0FBQyxFQUNILE1BQU8sTUFBSyxRQUFRLElBUXRCLE9BTEksSUFBUyxHQUFJLE9BQU0sR0FDbkIsR0FBVyxFQUNYLEdBQUksR0FDSixHQUFVLEdBQUksTUFBSyxHQUVoQixFQUFFLEdBQUksR0FDWCxHQUFZLEVBQVMsSUFBSSxJQUUzQixNQUFPLElBQ1AsWUFBcUIsR0FBTyxHQUFHLENBQzdCLEVBQUssUUFBUSxJQUFPLEtBQUssR0FBZ0IsU0FBVSxHQUFPLENBQ3hELEFBQUssR0FDSCxHQUFTLEdBQ1QsRUFBUyxPQUFPLEdBQVMsT0FHN0IsWUFBd0IsR0FBVSxDQUNoQyxHQUFPLElBQUssR0FDUixFQUFFLEtBQWEsR0FBTyxDQUFDLEdBQ3pCLEdBQVMsR0FDVCxFQUFTLFFBQVEsR0FBUyxPQU1sQyxFQUFRLEtBQU8sR0FDZixZQUFjLEVBQVUsQ0FDdEIsR0FBSSxHQUFPLEtBQ1gsR0FBSSxPQUFPLFVBQVUsU0FBUyxLQUFLLEtBQWMsaUJBQy9DLE1BQU8sTUFBSyxPQUFPLEdBQUksV0FBVSxxQkFHbkMsR0FBSSxHQUFNLEVBQVMsT0FDZixFQUFTLEdBQ2IsR0FBSSxDQUFDLEVBQ0gsTUFBTyxNQUFLLFFBQVEsSUFNdEIsT0FISSxJQUFJLEdBQ0osR0FBVSxHQUFJLE1BQUssR0FFaEIsRUFBRSxHQUFJLEdBQ1gsR0FBUyxFQUFTLEtBRXBCLE1BQU8sSUFDUCxZQUFrQixHQUFPLENBQ3ZCLEVBQUssUUFBUSxJQUFPLEtBQUssU0FBVSxHQUFVLENBQzNDLEFBQUssR0FDSCxHQUFTLEdBQ1QsRUFBUyxRQUFRLEdBQVMsTUFFM0IsU0FBVSxHQUFPLENBQ2xCLEFBQUssR0FDSCxHQUFTLEdBQ1QsRUFBUyxPQUFPLEdBQVMsVUFNL0IsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBUSxFQUFPLEVBQVEsQ0FDOUMsQUFBQyxVQUFVLEVBQU8sQ0FDbEIsYUFDQSxBQUFJLE1BQU8sR0FBTyxTQUFZLFlBQzVCLEdBQU8sUUFBVSxFQUFRLE1BR3hCLEtBQUssS0FBSyxNQUFPLFNBQVcsWUFBYyxPQUFTLE1BQU8sT0FBUyxZQUFjLEtBQU8sTUFBTyxTQUFXLFlBQWMsT0FBUyxLQUNsSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFRLEVBQU8sRUFBUSxDQUM5QyxhQUVBLEdBQUksR0FBVSxNQUFPLFNBQVcsWUFBYyxNQUFPLFFBQU8sVUFBYSxTQUFXLFNBQVUsRUFBSyxDQUFFLE1BQU8sT0FBTyxJQUFTLFNBQVUsRUFBSyxDQUFFLE1BQU8sSUFBTyxNQUFPLFNBQVcsWUFBYyxFQUFJLGNBQWdCLFFBQVUsSUFBUSxPQUFPLFVBQVksU0FBVyxNQUFPLElBRXRRLFdBQXlCLEVBQVUsRUFBYSxDQUFFLEdBQUksQ0FBRSxhQUFvQixJQUFnQixLQUFNLElBQUksV0FBVSxxQ0FFaEgsWUFBa0IsQ0FFZCxHQUFJLENBQ0EsR0FBSSxNQUFPLFlBQWMsWUFDckIsTUFBTyxXQUVYLEdBQUksTUFBTyxrQkFBb0IsWUFDM0IsTUFBTyxpQkFFWCxHQUFJLE1BQU8sZUFBaUIsWUFDeEIsTUFBTyxjQUVYLEdBQUksTUFBTyxhQUFlLFlBQ3RCLE1BQU8sWUFFWCxHQUFJLE1BQU8sY0FBZ0IsWUFDdkIsTUFBTyxrQkFFYixDQUNFLFFBSVIsR0FBSSxHQUFNLElBRVYsWUFBNEIsQ0FDeEIsR0FBSSxDQUdBLEdBQUksQ0FBQyxHQUFPLENBQUMsRUFBSSxLQUNiLE1BQU8sR0FNWCxHQUFJLEdBQVcsTUFBTyxlQUFpQixhQUFlLDRCQUE0QixLQUFLLFVBQVUsWUFBYyxDQUFDLFNBQVMsS0FBSyxVQUFVLFlBQWMsQ0FBQyxhQUFhLEtBQUssVUFBVSxVQUUvSyxFQUFXLE1BQU8sUUFBVSxZQUFjLE1BQU0sV0FBVyxRQUFRLGtCQUFvQixHQVEzRixNQUFRLEVBQUMsR0FBWSxJQUFhLE1BQU8sWUFBYyxhQUt2RCxNQUFPLGNBQWdCLGlCQUN6QixDQUNFLE1BQU8sSUFVZixXQUFvQixFQUFPLEVBQVksQ0FFbkMsRUFBUSxHQUFTLEdBQ2pCLEVBQWEsR0FBYyxHQUMzQixHQUFJLENBQ0EsTUFBTyxJQUFJLE1BQUssRUFBTyxTQUNsQixFQUFQLENBQ0UsR0FBSSxFQUFFLE9BQVMsWUFDWCxLQUFNLEdBSVYsT0FGSSxHQUFVLE1BQU8sY0FBZ0IsWUFBYyxZQUFjLE1BQU8sZ0JBQWtCLFlBQWMsY0FBZ0IsTUFBTyxpQkFBbUIsWUFBYyxlQUFpQixrQkFDN0ssRUFBVSxHQUFJLEdBQ1QsRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLEdBQUssRUFDbkMsRUFBUSxPQUFPLEVBQU0sSUFFekIsTUFBTyxHQUFRLFFBQVEsRUFBVyxPQU0xQyxBQUFJLE1BQU8sVUFBWSxhQUduQixFQUFRLEdBRVosR0FBSSxHQUFZLFFBRWhCLFdBQXlCLEVBQVMsRUFBVSxDQUN4QyxBQUFJLEdBQ0EsRUFBUSxLQUFLLFNBQVUsRUFBUSxDQUMzQixFQUFTLEtBQU0sSUFDaEIsU0FBVSxFQUFPLENBQ2hCLEVBQVMsS0FLckIsV0FBNkIsRUFBUyxFQUFVLEVBQWUsQ0FDM0QsQUFBSSxNQUFPLElBQWEsWUFDcEIsRUFBUSxLQUFLLEdBR2IsTUFBTyxJQUFrQixZQUN6QixFQUFRLE1BQVMsR0FJekIsV0FBc0IsRUFBSyxDQUV2QixNQUFJLE9BQU8sSUFBUSxVQUNmLFNBQVEsS0FBSyxFQUFNLDJDQUNuQixFQUFNLE9BQU8sSUFHVixFQUdYLFlBQXVCLENBQ25CLEdBQUksVUFBVSxRQUFVLE1BQU8sV0FBVSxVQUFVLE9BQVMsSUFBTyxXQUMvRCxNQUFPLFdBQVUsVUFBVSxPQUFTLEdBTzVDLEdBQUksR0FBNEIsbUNBQzVCLEVBQWdCLE9BQ2hCLEVBQWEsR0FDYixHQUFXLE9BQU8sVUFBVSxTQUc1QixHQUFZLFdBQ1osRUFBYSxZQU9qQixXQUFpQyxFQUFLLENBSWxDLE9BSEksR0FBUyxFQUFJLE9BQ2IsRUFBTSxHQUFJLGFBQVksR0FDdEIsRUFBTSxHQUFJLFlBQVcsR0FDaEIsRUFBSSxFQUFHLEVBQUksRUFBUSxJQUN4QixFQUFJLEdBQUssRUFBSSxXQUFXLEdBRTVCLE1BQU8sR0FrQlgsV0FBeUMsRUFBSyxDQUMxQyxNQUFPLElBQUksR0FBVSxTQUFVLEVBQVMsQ0FDcEMsR0FBSSxHQUFNLEVBQUksWUFBWSxFQUEyQixHQUNqRCxFQUFPLEVBQVcsQ0FBQyxLQUN2QixFQUFJLFlBQVksR0FBMkIsSUFBSSxFQUFNLE9BRXJELEVBQUksUUFBVSxTQUFVLEVBQUcsQ0FHdkIsRUFBRSxpQkFDRixFQUFFLGtCQUNGLEVBQVEsS0FHWixFQUFJLFdBQWEsVUFBWSxDQUN6QixHQUFJLEdBQWdCLFVBQVUsVUFBVSxNQUFNLGlCQUMxQyxFQUFjLFVBQVUsVUFBVSxNQUFNLFVBRzVDLEVBQVEsR0FBZSxDQUFDLEdBQWlCLFNBQVMsRUFBYyxHQUFJLEtBQU8sT0FFaEYsTUFBUyxVQUFZLENBQ3BCLE1BQU8sS0FJZixXQUEyQixFQUFLLENBQzVCLE1BQUksT0FBTyxJQUFrQixVQUNsQixFQUFVLFFBQVEsR0FFdEIsRUFBZ0MsR0FBSyxLQUFLLFNBQVUsRUFBTyxDQUM5RCxTQUFnQixFQUNULElBSWYsWUFBeUIsRUFBUSxDQUM3QixHQUFJLEdBQVksRUFBVyxFQUFPLE1BRzlCLEVBQW9CLEdBRXhCLEVBQWtCLFFBQVUsR0FBSSxHQUFVLFNBQVUsRUFBUyxFQUFRLENBQ2pFLEVBQWtCLFFBQVUsRUFDNUIsRUFBa0IsT0FBUyxJQUkvQixFQUFVLG1CQUFtQixLQUFLLEdBR2xDLEFBQUssRUFBVSxRQUdYLEVBQVUsUUFBVSxFQUFVLFFBQVEsS0FBSyxVQUFZLENBQ25ELE1BQU8sR0FBa0IsVUFIN0IsRUFBVSxRQUFVLEVBQWtCLFFBUTlDLFlBQTJCLEVBQVEsQ0FDL0IsR0FBSSxHQUFZLEVBQVcsRUFBTyxNQUc5QixFQUFvQixFQUFVLG1CQUFtQixNQUlyRCxHQUFJLEVBQ0EsU0FBa0IsVUFDWCxFQUFrQixRQUlqQyxZQUEwQixFQUFRLEVBQUssQ0FDbkMsR0FBSSxHQUFZLEVBQVcsRUFBTyxNQUc5QixFQUFvQixFQUFVLG1CQUFtQixNQUlyRCxHQUFJLEVBQ0EsU0FBa0IsT0FBTyxHQUNsQixFQUFrQixRQUlqQyxZQUF3QixFQUFRLEVBQWUsQ0FDM0MsTUFBTyxJQUFJLEdBQVUsU0FBVSxFQUFTLEVBQVEsQ0FHNUMsR0FGQSxFQUFXLEVBQU8sTUFBUSxFQUFXLEVBQU8sT0FBUyxLQUVqRCxFQUFPLEdBQ1AsR0FBSSxFQUNBLEdBQWdCLEdBQ2hCLEVBQU8sR0FBRyxZQUVWLE9BQU8sR0FBUSxFQUFPLElBSTlCLEdBQUksR0FBUyxDQUFDLEVBQU8sTUFFckIsQUFBSSxHQUNBLEVBQU8sS0FBSyxFQUFPLFNBR3ZCLEdBQUksR0FBVSxFQUFJLEtBQUssTUFBTSxFQUFLLEdBRWxDLEFBQUksR0FDQSxHQUFRLGdCQUFrQixTQUFVLEVBQUcsQ0FDbkMsR0FBSSxHQUFLLEVBQVEsT0FDakIsR0FBSSxDQUNBLEVBQUcsa0JBQWtCLEVBQU8sV0FDeEIsRUFBRSxZQUFjLEdBRWhCLEVBQUcsa0JBQWtCLFNBRXBCLEVBQVAsQ0FDRSxHQUFJLEVBQUcsT0FBUyxrQkFDWixRQUFRLEtBQUssaUJBQW1CLEVBQU8sS0FBTyxvQ0FBMkMsRUFBRSxXQUFhLGVBQWlCLEVBQUUsV0FBYSxzQkFBd0IsRUFBTyxVQUFZLHlCQUVuTCxNQUFNLE1BTXRCLEVBQVEsUUFBVSxTQUFVLEVBQUcsQ0FDM0IsRUFBRSxpQkFDRixFQUFPLEVBQVEsUUFHbkIsRUFBUSxVQUFZLFVBQVksQ0FDNUIsR0FBSSxHQUFLLEVBQVEsT0FDakIsRUFBRyxnQkFBa0IsU0FBVSxFQUFHLENBTTlCLEVBQUUsT0FBTyxTQUViLEVBQVEsR0FDUixHQUFrQixNQUs5QixZQUFnQyxFQUFRLENBQ3BDLE1BQU8sSUFBZSxFQUFRLElBR2xDLFlBQWdDLEVBQVEsQ0FDcEMsTUFBTyxJQUFlLEVBQVEsSUFHbEMsWUFBMEIsRUFBUSxFQUFnQixDQUM5QyxHQUFJLENBQUMsRUFBTyxHQUNSLE1BQU8sR0FHWCxHQUFJLEdBQWEsQ0FBQyxFQUFPLEdBQUcsaUJBQWlCLFNBQVMsRUFBTyxXQUN6RCxFQUFjLEVBQU8sUUFBVSxFQUFPLEdBQUcsUUFDekMsRUFBWSxFQUFPLFFBQVUsRUFBTyxHQUFHLFFBWTNDLEdBVkksR0FHSSxHQUFPLFVBQVksR0FDbkIsUUFBUSxLQUFLLGlCQUFtQixFQUFPLEtBQU8sc0NBQTZDLEVBQU8sR0FBRyxRQUFVLGVBQWlCLEVBQU8sUUFBVSxLQUdySixFQUFPLFFBQVUsRUFBTyxHQUFHLFNBRzNCLEdBQWEsRUFBWSxDQUl6QixHQUFJLEVBQVksQ0FDWixHQUFJLEdBQWEsRUFBTyxHQUFHLFFBQVUsRUFDckMsQUFBSSxFQUFhLEVBQU8sU0FDcEIsR0FBTyxRQUFVLEdBSXpCLE1BQU8sR0FHWCxNQUFPLEdBSVgsWUFBcUIsRUFBTSxDQUN2QixNQUFPLElBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUM1QyxHQUFJLEdBQVMsR0FBSSxZQUNqQixFQUFPLFFBQVUsRUFDakIsRUFBTyxVQUFZLFNBQVUsRUFBRyxDQUM1QixHQUFJLEdBQVMsS0FBSyxFQUFFLE9BQU8sUUFBVSxJQUNyQyxFQUFRLENBQ0osNEJBQTZCLEdBQzdCLEtBQU0sRUFDTixLQUFNLEVBQUssUUFHbkIsRUFBTyxtQkFBbUIsS0FLbEMsWUFBcUIsRUFBYSxDQUM5QixHQUFJLEdBQVksRUFBd0IsS0FBSyxFQUFZLE9BQ3pELE1BQU8sR0FBVyxDQUFDLEdBQVksQ0FBRSxLQUFNLEVBQVksT0FJdkQsWUFBd0IsRUFBTyxDQUMzQixNQUFPLElBQVMsRUFBTSw0QkFPMUIsWUFBcUIsRUFBVSxDQUMzQixHQUFJLEdBQU8sS0FFUCxFQUFVLEVBQUssYUFBYSxLQUFLLFVBQVksQ0FDN0MsR0FBSSxHQUFZLEVBQVcsRUFBSyxRQUFRLE1BRXhDLEdBQUksR0FBYSxFQUFVLFFBQ3ZCLE1BQU8sR0FBVSxVQUl6QixTQUFvQixFQUFTLEVBQVUsR0FDaEMsRUFNWCxZQUF1QixFQUFRLENBQzNCLEdBQWdCLEdBS2hCLE9BSEksR0FBWSxFQUFXLEVBQU8sTUFDOUIsRUFBVSxFQUFVLFFBRWYsRUFBSSxFQUFHLEVBQUksRUFBUSxPQUFRLElBQUssQ0FDckMsR0FBSSxHQUFTLEVBQVEsR0FDckIsQUFBSSxFQUFPLFFBQVEsSUFDZixHQUFPLFFBQVEsR0FBRyxRQUNsQixFQUFPLFFBQVEsR0FBSyxNQUc1QixTQUFPLEdBQUssS0FFTCxHQUF1QixHQUFRLEtBQUssU0FBVSxFQUFJLENBRXJELE1BREEsR0FBTyxHQUFLLEVBQ1IsR0FBaUIsR0FFVixHQUF1QixHQUUzQixJQUNSLEtBQUssU0FBVSxFQUFJLENBR2xCLEVBQU8sR0FBSyxFQUFVLEdBQUssRUFDM0IsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFRLE9BQVEsSUFDaEMsRUFBUSxHQUFHLFFBQVEsR0FBSyxJQUU3QixNQUFTLFNBQVUsRUFBSyxDQUN2QixTQUFpQixFQUFRLEdBQ25CLElBTWQsWUFBMkIsRUFBUSxFQUFNLEVBQVUsRUFBUyxDQUN4RCxBQUFJLElBQVksUUFDWixHQUFVLEdBR2QsR0FBSSxDQUNBLEdBQUksR0FBSyxFQUFPLEdBQUcsWUFBWSxFQUFPLFVBQVcsR0FDakQsRUFBUyxLQUFNLFNBQ1YsRUFBUCxDQUNFLEdBQUksRUFBVSxHQUFNLEVBQUMsRUFBTyxJQUFNLEVBQUksT0FBUyxxQkFBdUIsRUFBSSxPQUFTLGlCQUMvRSxNQUFPLEdBQVUsVUFBVSxLQUFLLFVBQVksQ0FDeEMsR0FBSSxDQUFDLEVBQU8sSUFBTSxFQUFJLE9BQVMsaUJBQW1CLENBQUMsRUFBTyxHQUFHLGlCQUFpQixTQUFTLEVBQU8sWUFBYyxFQUFPLFNBQVcsRUFBTyxHQUFHLFFBRXBJLE1BQUksR0FBTyxJQUNQLEdBQU8sUUFBVSxFQUFPLEdBQUcsUUFBVSxHQUdsQyxHQUF1QixLQUVuQyxLQUFLLFVBQVksQ0FDaEIsTUFBTyxJQUFjLEdBQVEsS0FBSyxVQUFZLENBQzFDLEdBQWtCLEVBQVEsRUFBTSxFQUFVLEVBQVUsT0FFekQsTUFBUyxHQUdoQixFQUFTLElBSWpCLGFBQTJCLENBQ3ZCLE1BQU8sQ0FFSCxRQUFTLEdBRVQsR0FBSSxLQUVKLFFBQVMsS0FFVCxtQkFBb0IsSUFNNUIsWUFBc0IsRUFBUyxDQUMzQixHQUFJLEdBQU8sS0FDUCxFQUFTLENBQ1QsR0FBSSxNQUdSLEdBQUksRUFDQSxPQUFTLEtBQUssR0FDVixFQUFPLEdBQUssRUFBUSxHQUs1QixHQUFJLEdBQVksRUFBVyxFQUFPLE1BR2xDLEFBQUssR0FDRCxHQUFZLEtBRVosRUFBVyxFQUFPLE1BQVEsR0FJOUIsRUFBVSxRQUFRLEtBQUssR0FHbEIsRUFBSyxZQUNOLEdBQUssV0FBYSxFQUFLLE1BQ3ZCLEVBQUssTUFBUSxJQUlqQixHQUFJLEdBQWUsR0FFbkIsWUFBd0IsQ0FHcEIsTUFBTyxHQUFVLFVBR3JCLE9BQVMsR0FBSSxFQUFHLEVBQUksRUFBVSxRQUFRLE9BQVEsSUFBSyxDQUMvQyxHQUFJLEdBQVMsRUFBVSxRQUFRLEdBQy9CLEFBQUksSUFBVyxHQUVYLEVBQWEsS0FBSyxFQUFPLGFBQWEsTUFBUyxJQUt2RCxHQUFJLEdBQVUsRUFBVSxRQUFRLE1BQU0sR0FJdEMsTUFBTyxHQUFVLElBQUksR0FBYyxLQUFLLFVBQVksQ0FDaEQsU0FBTyxHQUFLLEVBQVUsR0FFZixHQUF1QixLQUMvQixLQUFLLFNBQVUsRUFBSSxDQUVsQixNQURBLEdBQU8sR0FBSyxFQUNSLEdBQWlCLEVBQVEsRUFBSyxlQUFlLFNBRXRDLEdBQXVCLEdBRTNCLElBQ1IsS0FBSyxTQUFVLEVBQUksQ0FDbEIsRUFBTyxHQUFLLEVBQVUsR0FBSyxFQUMzQixFQUFLLFFBQVUsRUFFZixPQUFTLEdBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxJQUFLLENBQ3JDLEdBQUksR0FBUyxFQUFRLEdBQ3JCLEFBQUksSUFBVyxHQUVYLEdBQU8sUUFBUSxHQUFLLEVBQU8sR0FDM0IsRUFBTyxRQUFRLFFBQVUsRUFBTyxZQU1oRCxZQUFpQixFQUFLLEVBQVUsQ0FDNUIsR0FBSSxHQUFPLEtBRVgsRUFBTSxFQUFhLEdBRW5CLEdBQUksR0FBVSxHQUFJLEdBQVUsU0FBVSxFQUFTLEVBQVEsQ0FDbkQsRUFBSyxRQUFRLEtBQUssVUFBWSxDQUMxQixHQUFrQixFQUFLLFFBQVMsR0FBVyxTQUFVLEVBQUssRUFBYSxDQUNuRSxHQUFJLEVBQ0EsTUFBTyxHQUFPLEdBR2xCLEdBQUksQ0FDQSxHQUFJLEdBQVEsRUFBWSxZQUFZLEVBQUssUUFBUSxXQUM3QyxFQUFNLEVBQU0sSUFBSSxHQUVwQixFQUFJLFVBQVksVUFBWSxDQUN4QixHQUFJLEdBQVEsRUFBSSxPQUNoQixBQUFJLElBQVUsUUFDVixHQUFRLE1BRVIsR0FBZSxJQUNmLEdBQVEsR0FBWSxJQUV4QixFQUFRLElBR1osRUFBSSxRQUFVLFVBQVksQ0FDdEIsRUFBTyxFQUFJLGNBRVYsRUFBUCxDQUNFLEVBQU8sUUFHaEIsTUFBUyxLQUdoQixTQUFnQixFQUFTLEdBQ2xCLEVBSVgsWUFBaUIsRUFBVSxFQUFVLENBQ2pDLEdBQUksR0FBTyxLQUVQLEVBQVUsR0FBSSxHQUFVLFNBQVUsRUFBUyxFQUFRLENBQ25ELEVBQUssUUFBUSxLQUFLLFVBQVksQ0FDMUIsR0FBa0IsRUFBSyxRQUFTLEdBQVcsU0FBVSxFQUFLLEVBQWEsQ0FDbkUsR0FBSSxFQUNBLE1BQU8sR0FBTyxHQUdsQixHQUFJLENBQ0EsR0FBSSxHQUFRLEVBQVksWUFBWSxFQUFLLFFBQVEsV0FDN0MsRUFBTSxFQUFNLGFBQ1osRUFBa0IsRUFFdEIsRUFBSSxVQUFZLFVBQVksQ0FDeEIsR0FBSSxHQUFTLEVBQUksT0FFakIsR0FBSSxFQUFRLENBQ1IsR0FBSSxHQUFRLEVBQU8sTUFDbkIsQUFBSSxHQUFlLElBQ2YsR0FBUSxHQUFZLElBRXhCLEdBQUksR0FBUyxFQUFTLEVBQU8sRUFBTyxJQUFLLEtBS3pDLEFBQUksSUFBVyxPQUNYLEVBQVEsR0FFUixFQUFPLGVBR1gsTUFJUixFQUFJLFFBQVUsVUFBWSxDQUN0QixFQUFPLEVBQUksY0FFVixFQUFQLENBQ0UsRUFBTyxRQUdoQixNQUFTLEtBR2hCLFNBQWdCLEVBQVMsR0FFbEIsRUFHWCxZQUFpQixFQUFLLEVBQU8sRUFBVSxDQUNuQyxHQUFJLEdBQU8sS0FFWCxFQUFNLEVBQWEsR0FFbkIsR0FBSSxHQUFVLEdBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUNuRCxHQUFJLEdBQ0osRUFBSyxRQUFRLEtBQUssVUFBWSxDQUUxQixNQURBLEdBQVMsRUFBSyxRQUNWLEdBQVMsS0FBSyxLQUFXLGdCQUNsQixFQUFrQixFQUFPLElBQUksS0FBSyxTQUFVLEVBQWEsQ0FDNUQsTUFBSSxHQUNPLEVBRUosR0FBWSxLQUdwQixJQUNSLEtBQUssU0FBVSxFQUFPLENBQ3JCLEdBQWtCLEVBQUssUUFBUyxFQUFZLFNBQVUsRUFBSyxFQUFhLENBQ3BFLEdBQUksRUFDQSxNQUFPLEdBQU8sR0FHbEIsR0FBSSxDQUNBLEdBQUksR0FBUSxFQUFZLFlBQVksRUFBSyxRQUFRLFdBTWpELEFBQUksSUFBVSxNQUNWLEdBQVEsUUFHWixHQUFJLEdBQU0sRUFBTSxJQUFJLEVBQU8sR0FFM0IsRUFBWSxXQUFhLFVBQVksQ0FPakMsQUFBSSxJQUFVLFFBQ1YsR0FBUSxNQUdaLEVBQVEsSUFFWixFQUFZLFFBQVUsRUFBWSxRQUFVLFVBQVksQ0FDcEQsR0FBSSxHQUFNLEVBQUksTUFBUSxFQUFJLE1BQVEsRUFBSSxZQUFZLE1BQ2xELEVBQU8sVUFFTixFQUFQLENBQ0UsRUFBTyxRQUdoQixNQUFTLEtBR2hCLFNBQWdCLEVBQVMsR0FDbEIsRUFHWCxZQUFvQixFQUFLLEVBQVUsQ0FDL0IsR0FBSSxHQUFPLEtBRVgsRUFBTSxFQUFhLEdBRW5CLEdBQUksR0FBVSxHQUFJLEdBQVUsU0FBVSxFQUFTLEVBQVEsQ0FDbkQsRUFBSyxRQUFRLEtBQUssVUFBWSxDQUMxQixHQUFrQixFQUFLLFFBQVMsRUFBWSxTQUFVLEVBQUssRUFBYSxDQUNwRSxHQUFJLEVBQ0EsTUFBTyxHQUFPLEdBR2xCLEdBQUksQ0FDQSxHQUFJLEdBQVEsRUFBWSxZQUFZLEVBQUssUUFBUSxXQU03QyxFQUFNLEVBQU0sT0FBVSxHQUMxQixFQUFZLFdBQWEsVUFBWSxDQUNqQyxLQUdKLEVBQVksUUFBVSxVQUFZLENBQzlCLEVBQU8sRUFBSSxRQUtmLEVBQVksUUFBVSxVQUFZLENBQzlCLEdBQUksR0FBTSxFQUFJLE1BQVEsRUFBSSxNQUFRLEVBQUksWUFBWSxNQUNsRCxFQUFPLFVBRU4sRUFBUCxDQUNFLEVBQU8sUUFHaEIsTUFBUyxLQUdoQixTQUFnQixFQUFTLEdBQ2xCLEVBR1gsWUFBZSxFQUFVLENBQ3JCLEdBQUksR0FBTyxLQUVQLEVBQVUsR0FBSSxHQUFVLFNBQVUsRUFBUyxFQUFRLENBQ25ELEVBQUssUUFBUSxLQUFLLFVBQVksQ0FDMUIsR0FBa0IsRUFBSyxRQUFTLEVBQVksU0FBVSxFQUFLLEVBQWEsQ0FDcEUsR0FBSSxFQUNBLE1BQU8sR0FBTyxHQUdsQixHQUFJLENBQ0EsR0FBSSxHQUFRLEVBQVksWUFBWSxFQUFLLFFBQVEsV0FDN0MsRUFBTSxFQUFNLFFBRWhCLEVBQVksV0FBYSxVQUFZLENBQ2pDLEtBR0osRUFBWSxRQUFVLEVBQVksUUFBVSxVQUFZLENBQ3BELEdBQUksR0FBTSxFQUFJLE1BQVEsRUFBSSxNQUFRLEVBQUksWUFBWSxNQUNsRCxFQUFPLFVBRU4sRUFBUCxDQUNFLEVBQU8sUUFHaEIsTUFBUyxLQUdoQixTQUFnQixFQUFTLEdBQ2xCLEVBR1gsWUFBZ0IsRUFBVSxDQUN0QixHQUFJLEdBQU8sS0FFUCxFQUFVLEdBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUNuRCxFQUFLLFFBQVEsS0FBSyxVQUFZLENBQzFCLEdBQWtCLEVBQUssUUFBUyxHQUFXLFNBQVUsRUFBSyxFQUFhLENBQ25FLEdBQUksRUFDQSxNQUFPLEdBQU8sR0FHbEIsR0FBSSxDQUNBLEdBQUksR0FBUSxFQUFZLFlBQVksRUFBSyxRQUFRLFdBQzdDLEVBQU0sRUFBTSxRQUVoQixFQUFJLFVBQVksVUFBWSxDQUN4QixFQUFRLEVBQUksU0FHaEIsRUFBSSxRQUFVLFVBQVksQ0FDdEIsRUFBTyxFQUFJLGNBRVYsRUFBUCxDQUNFLEVBQU8sUUFHaEIsTUFBUyxLQUdoQixTQUFnQixFQUFTLEdBQ2xCLEVBR1gsWUFBYSxFQUFHLEVBQVUsQ0FDdEIsR0FBSSxHQUFPLEtBRVAsRUFBVSxHQUFJLEdBQVUsU0FBVSxFQUFTLEVBQVEsQ0FDbkQsR0FBSSxFQUFJLEVBQUcsQ0FDUCxFQUFRLE1BRVIsT0FHSixFQUFLLFFBQVEsS0FBSyxVQUFZLENBQzFCLEdBQWtCLEVBQUssUUFBUyxHQUFXLFNBQVUsRUFBSyxFQUFhLENBQ25FLEdBQUksRUFDQSxNQUFPLEdBQU8sR0FHbEIsR0FBSSxDQUNBLEdBQUksR0FBUSxFQUFZLFlBQVksRUFBSyxRQUFRLFdBQzdDLEVBQVcsR0FDWCxFQUFNLEVBQU0sZ0JBRWhCLEVBQUksVUFBWSxVQUFZLENBQ3hCLEdBQUksR0FBUyxFQUFJLE9BQ2pCLEdBQUksQ0FBQyxFQUFRLENBRVQsRUFBUSxNQUVSLE9BR0osQUFBSSxJQUFNLEdBS0QsRUFGTCxFQUFRLEVBQU8sS0FLWCxHQUFXLEdBQ1gsRUFBTyxRQUFRLEtBUTNCLEVBQUksUUFBVSxVQUFZLENBQ3RCLEVBQU8sRUFBSSxjQUVWLEVBQVAsQ0FDRSxFQUFPLFFBR2hCLE1BQVMsS0FHaEIsU0FBZ0IsRUFBUyxHQUNsQixFQUdYLFlBQWMsRUFBVSxDQUNwQixHQUFJLEdBQU8sS0FFUCxFQUFVLEdBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUNuRCxFQUFLLFFBQVEsS0FBSyxVQUFZLENBQzFCLEdBQWtCLEVBQUssUUFBUyxHQUFXLFNBQVUsRUFBSyxFQUFhLENBQ25FLEdBQUksRUFDQSxNQUFPLEdBQU8sR0FHbEIsR0FBSSxDQUNBLEdBQUksR0FBUSxFQUFZLFlBQVksRUFBSyxRQUFRLFdBQzdDLEVBQU0sRUFBTSxnQkFDWixFQUFPLEdBRVgsRUFBSSxVQUFZLFVBQVksQ0FDeEIsR0FBSSxHQUFTLEVBQUksT0FFakIsR0FBSSxDQUFDLEVBQVEsQ0FDVCxFQUFRLEdBQ1IsT0FHSixFQUFLLEtBQUssRUFBTyxLQUNqQixFQUFPLFlBR1gsRUFBSSxRQUFVLFVBQVksQ0FDdEIsRUFBTyxFQUFJLGNBRVYsRUFBUCxDQUNFLEVBQU8sUUFHaEIsTUFBUyxLQUdoQixTQUFnQixFQUFTLEdBQ2xCLEVBR1gsWUFBc0IsRUFBUyxFQUFVLENBQ3JDLEVBQVcsRUFBWSxNQUFNLEtBQU0sV0FFbkMsR0FBSSxHQUFnQixLQUFLLFNBQ3pCLEVBQVUsTUFBTyxJQUFZLFlBQWMsR0FBVyxHQUNqRCxFQUFRLE1BQ1QsR0FBUSxLQUFPLEVBQVEsTUFBUSxFQUFjLEtBQzdDLEVBQVEsVUFBWSxFQUFRLFdBQWEsRUFBYyxXQUczRCxHQUFJLEdBQU8sS0FDUCxFQUNKLEdBQUksQ0FBQyxFQUFRLEtBQ1QsRUFBVSxFQUFVLE9BQU8seUJBQ3hCLENBQ0gsR0FBSSxHQUFjLEVBQVEsT0FBUyxFQUFjLE1BQVEsRUFBSyxRQUFRLEdBRWxFLEVBQVksRUFBYyxFQUFVLFFBQVEsRUFBSyxRQUFRLElBQU0sR0FBdUIsR0FBUyxLQUFLLFNBQVUsRUFBSSxDQUNsSCxHQUFJLEdBQVksRUFBVyxFQUFRLE1BQy9CLEVBQVUsRUFBVSxRQUN4QixFQUFVLEdBQUssRUFDZixPQUFTLEdBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxJQUNoQyxFQUFRLEdBQUcsUUFBUSxHQUFLLEVBRTVCLE1BQU8sS0FHWCxBQUFLLEVBQVEsVUFtRFQsRUFBVSxFQUFVLEtBQUssU0FBVSxFQUFJLENBQ25DLEdBQUksRUFBQyxFQUFHLGlCQUFpQixTQUFTLEVBQVEsV0FJMUMsSUFBSSxHQUFhLEVBQUcsUUFBVSxFQUU5QixHQUFnQixHQUVoQixHQUFJLEdBQVksRUFBVyxFQUFRLE1BQy9CLEVBQVUsRUFBVSxRQUV4QixFQUFHLFFBQ0gsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFRLE9BQVEsSUFBSyxDQUNyQyxHQUFJLEdBQVMsRUFBUSxHQUNyQixFQUFPLFFBQVEsR0FBSyxLQUNwQixFQUFPLFFBQVEsUUFBVSxFQUc3QixHQUFJLEdBQW9CLEdBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUM3RCxHQUFJLEdBQU0sRUFBSSxLQUFLLEVBQVEsS0FBTSxHQUVqQyxFQUFJLFFBQVUsU0FBVSxHQUFLLENBQ3pCLEdBQUksSUFBSyxFQUFJLE9BQ2IsR0FBRyxRQUNILEVBQU8sS0FHWCxFQUFJLGdCQUFrQixVQUFZLENBQzlCLEdBQUksSUFBSyxFQUFJLE9BQ2IsR0FBRyxrQkFBa0IsRUFBUSxZQUdqQyxFQUFJLFVBQVksVUFBWSxDQUN4QixHQUFJLElBQUssRUFBSSxPQUNiLEdBQUcsUUFDSCxFQUFRLE9BSWhCLE1BQU8sR0FBa0IsS0FBSyxTQUFVLEVBQUksQ0FDeEMsRUFBVSxHQUFLLEVBQ2YsT0FBUyxHQUFJLEVBQUcsRUFBSSxFQUFRLE9BQVEsSUFBSyxDQUNyQyxHQUFJLEdBQVcsRUFBUSxHQUN2QixFQUFTLFFBQVEsR0FBSyxFQUN0QixHQUFrQixFQUFTLFlBRWhDLE1BQVMsU0FBVSxFQUFLLENBQ3ZCLEtBQUMsSUFBaUIsRUFBUyxJQUFRLEVBQVUsV0FBVyxNQUFTLFVBQVksSUFDdkUsT0FuR2QsRUFBVSxFQUFVLEtBQUssU0FBVSxFQUFJLENBQ25DLEdBQWdCLEdBRWhCLEdBQUksR0FBWSxFQUFXLEVBQVEsTUFDL0IsRUFBVSxFQUFVLFFBRXhCLEVBQUcsUUFDSCxPQUFTLEdBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxJQUFLLENBQ3JDLEdBQUksR0FBUyxFQUFRLEdBQ3JCLEVBQU8sUUFBUSxHQUFLLEtBR3hCLEdBQUksR0FBZ0IsR0FBSSxHQUFVLFNBQVUsRUFBUyxFQUFRLENBQ3pELEdBQUksR0FBTSxFQUFJLGVBQWUsRUFBUSxNQUVyQyxFQUFJLFFBQVUsVUFBWSxDQUN0QixHQUFJLEdBQUssRUFBSSxPQUNiLEFBQUksR0FDQSxFQUFHLFFBRVAsRUFBTyxFQUFJLFFBR2YsRUFBSSxVQUFZLFVBQVksQ0FHeEIsUUFBUSxLQUFLLHNDQUF3QyxFQUFRLEtBQU8sNENBR3hFLEVBQUksVUFBWSxVQUFZLENBQ3hCLEdBQUksR0FBSyxFQUFJLE9BQ2IsQUFBSSxHQUNBLEVBQUcsUUFFUCxFQUFRLE1BSWhCLE1BQU8sR0FBYyxLQUFLLFNBQVUsRUFBSSxDQUNwQyxFQUFVLEdBQUssRUFDZixPQUFTLEdBQUksRUFBRyxFQUFJLEVBQVEsT0FBUSxJQUFLLENBQ3JDLEdBQUksR0FBVSxFQUFRLEdBQ3RCLEdBQWtCLEVBQVEsWUFFL0IsTUFBUyxTQUFVLEVBQUssQ0FDdkIsS0FBQyxJQUFpQixFQUFTLElBQVEsRUFBVSxXQUFXLE1BQVMsVUFBWSxJQUN2RSxNQTJEdEIsU0FBZ0IsRUFBUyxHQUNsQixFQUdYLEdBQUksSUFBZSxDQUNmLFFBQVMsZUFDVCxhQUFjLEdBQ2QsU0FBVSxJQUNWLFFBQVMsR0FDVCxRQUFTLEdBQ1QsUUFBUyxHQUNULFdBQVksR0FDWixNQUFPLEdBQ1AsT0FBUSxHQUNSLElBQUssR0FDTCxLQUFNLEdBQ04sYUFBYyxJQUdsQixhQUF5QixDQUNyQixNQUFPLE9BQU8sZUFBaUIsV0FNbkMsR0FBSSxJQUFhLG1FQUViLEdBQW1CLHVCQUNuQixHQUF5QixnQ0FFekIsR0FBb0IsWUFDcEIsR0FBMkIsR0FBa0IsT0FHN0MsR0FBbUIsT0FDbkIsR0FBWSxPQUNaLEdBQWlCLE9BQ2pCLEdBQWtCLE9BQ2xCLEdBQXlCLE9BQ3pCLEdBQWtCLE9BQ2xCLEdBQWtCLE9BQ2xCLEdBQW1CLE9BQ25CLEdBQW1CLE9BQ25CLEdBQW9CLE9BQ3BCLEdBQW9CLE9BQ3BCLEdBQWdDLEdBQTJCLEdBQWlCLE9BRTVFLEdBQWEsT0FBTyxVQUFVLFNBRWxDLFlBQXdCLEVBQWtCLENBRXRDLEdBQUksR0FBZSxFQUFpQixPQUFTLElBQ3pDLEVBQU0sRUFBaUIsT0FDdkIsRUFDQSxFQUFJLEVBQ0osRUFBVSxFQUFVLEVBQVUsRUFFbEMsQUFBSSxFQUFpQixFQUFpQixPQUFTLEtBQU8sS0FDbEQsS0FDSSxFQUFpQixFQUFpQixPQUFTLEtBQU8sS0FDbEQsS0FJUixHQUFJLEdBQVMsR0FBSSxhQUFZLEdBQ3pCLEVBQVEsR0FBSSxZQUFXLEdBRTNCLElBQUssRUFBSSxFQUFHLEVBQUksRUFBSyxHQUFLLEVBQ3RCLEVBQVcsR0FBVyxRQUFRLEVBQWlCLElBQy9DLEVBQVcsR0FBVyxRQUFRLEVBQWlCLEVBQUksSUFDbkQsRUFBVyxHQUFXLFFBQVEsRUFBaUIsRUFBSSxJQUNuRCxFQUFXLEdBQVcsUUFBUSxFQUFpQixFQUFJLElBR25ELEVBQU0sS0FBTyxHQUFZLEVBQUksR0FBWSxFQUN6QyxFQUFNLEtBQVEsR0FBVyxLQUFPLEVBQUksR0FBWSxFQUNoRCxFQUFNLEtBQVEsR0FBVyxJQUFNLEVBQUksRUFBVyxHQUVsRCxNQUFPLEdBS1gsWUFBd0IsRUFBUSxDQUU1QixHQUFJLEdBQVEsR0FBSSxZQUFXLEdBQ3ZCLEVBQWUsR0FDZixFQUVKLElBQUssRUFBSSxFQUFHLEVBQUksRUFBTSxPQUFRLEdBQUssRUFFL0IsR0FBZ0IsR0FBVyxFQUFNLElBQU0sR0FDdkMsR0FBZ0IsR0FBWSxHQUFNLEdBQUssSUFBTSxFQUFJLEVBQU0sRUFBSSxJQUFNLEdBQ2pFLEdBQWdCLEdBQVksR0FBTSxFQUFJLEdBQUssS0FBTyxFQUFJLEVBQU0sRUFBSSxJQUFNLEdBQ3RFLEdBQWdCLEdBQVcsRUFBTSxFQUFJLEdBQUssSUFHOUMsTUFBSSxHQUFNLE9BQVMsSUFBTSxFQUNyQixFQUFlLEVBQWEsVUFBVSxFQUFHLEVBQWEsT0FBUyxHQUFLLElBQzdELEVBQU0sT0FBUyxJQUFNLEdBQzVCLEdBQWUsRUFBYSxVQUFVLEVBQUcsRUFBYSxPQUFTLEdBQUssTUFHakUsRUFNWCxZQUFtQixFQUFPLEVBQVUsQ0FDaEMsR0FBSSxHQUFZLEdBU2hCLEdBUkksR0FDQSxHQUFZLEdBQVcsS0FBSyxJQU81QixHQUFVLEtBQWMsd0JBQTBCLEVBQU0sUUFBVSxHQUFXLEtBQUssRUFBTSxVQUFZLHdCQUF5QixDQUc3SCxHQUFJLEdBQ0EsRUFBUyxHQUViLEFBQUksWUFBaUIsYUFDakIsR0FBUyxFQUNULEdBQVUsSUFFVixHQUFTLEVBQU0sT0FFZixBQUFJLElBQWMscUJBQ2QsR0FBVSxHQUNQLEFBQUksSUFBYyxzQkFDckIsR0FBVSxHQUNQLEFBQUksSUFBYyw2QkFDckIsR0FBVSxHQUNQLEFBQUksSUFBYyxzQkFDckIsR0FBVSxHQUNQLEFBQUksSUFBYyx1QkFDckIsR0FBVSxHQUNQLEFBQUksSUFBYyxzQkFDckIsR0FBVSxHQUNQLEFBQUksSUFBYyx1QkFDckIsR0FBVSxHQUNQLEFBQUksSUFBYyx3QkFDckIsR0FBVSxHQUNQLEFBQUksSUFBYyx3QkFDckIsR0FBVSxHQUVWLEVBQVMsR0FBSSxPQUFNLHdDQUkzQixFQUFTLEVBQVMsR0FBZSxZQUMxQixJQUFjLGdCQUFpQixDQUV0QyxHQUFJLEdBQWEsR0FBSSxZQUVyQixFQUFXLE9BQVMsVUFBWSxDQUU1QixHQUFJLEdBQU0sR0FBbUIsRUFBTSxLQUFPLElBQU0sR0FBZSxLQUFLLFFBRXBFLEVBQVMsR0FBb0IsR0FBWSxJQUc3QyxFQUFXLGtCQUFrQixPQUU3QixJQUFJLENBQ0EsRUFBUyxLQUFLLFVBQVUsVUFDbkIsRUFBUCxDQUNFLFFBQVEsTUFBTSw4Q0FBK0MsR0FFN0QsRUFBUyxLQUFNLElBYTNCLFlBQXFCLEVBQU8sQ0FJeEIsR0FBSSxFQUFNLFVBQVUsRUFBRyxNQUE4QixHQUNqRCxNQUFPLE1BQUssTUFBTSxHQU10QixHQUFJLEdBQW1CLEVBQU0sVUFBVSxJQUNuQyxFQUFPLEVBQU0sVUFBVSxHQUEwQixJQUVqRCxFQUdKLEdBQUksSUFBUyxJQUFhLEdBQXVCLEtBQUssR0FBbUIsQ0FDckUsR0FBSSxHQUFVLEVBQWlCLE1BQU0sSUFDckMsRUFBVyxFQUFRLEdBQ25CLEVBQW1CLEVBQWlCLFVBQVUsRUFBUSxHQUFHLFFBRTdELEdBQUksR0FBUyxHQUFlLEdBSTVCLE9BQVEsT0FDQyxJQUNELE1BQU8sT0FDTixJQUNELE1BQU8sR0FBVyxDQUFDLEdBQVMsQ0FBRSxLQUFNLFFBQ25DLElBQ0QsTUFBTyxJQUFJLFdBQVUsT0FDcEIsSUFDRCxNQUFPLElBQUksWUFBVyxPQUNyQixJQUNELE1BQU8sSUFBSSxtQkFBa0IsT0FDNUIsSUFDRCxNQUFPLElBQUksWUFBVyxPQUNyQixJQUNELE1BQU8sSUFBSSxhQUFZLE9BQ3RCLElBQ0QsTUFBTyxJQUFJLFlBQVcsT0FDckIsSUFDRCxNQUFPLElBQUksYUFBWSxPQUN0QixJQUNELE1BQU8sSUFBSSxjQUFhLE9BQ3ZCLElBQ0QsTUFBTyxJQUFJLGNBQWEsV0FFeEIsS0FBTSxJQUFJLE9BQU0sZ0JBQWtCLElBSTlDLEdBQUksSUFBd0IsQ0FDeEIsVUFBVyxHQUNYLFlBQWEsR0FDYixlQUFnQixHQUNoQixlQUFnQixJQWFwQixZQUF1QixFQUFHLEVBQVEsRUFBVSxFQUFlLENBQ3ZELEVBQUUsV0FBVyw4QkFBZ0MsRUFBTyxVQUFZLCtDQUFxRCxHQUFJLEVBQVUsR0FLdkksWUFBd0IsRUFBUyxDQUM3QixHQUFJLEdBQU8sS0FDUCxFQUFTLENBQ1QsR0FBSSxNQUdSLEdBQUksRUFDQSxPQUFTLEtBQUssR0FDVixFQUFPLEdBQUssTUFBTyxHQUFRLElBQU8sU0FBVyxFQUFRLEdBQUcsV0FBYSxFQUFRLEdBSXJGLEdBQUksR0FBZ0IsR0FBSSxHQUFVLFNBQVUsRUFBUyxFQUFRLENBR3pELEdBQUksQ0FDQSxFQUFPLEdBQUssYUFBYSxFQUFPLEtBQU0sT0FBTyxFQUFPLFNBQVUsRUFBTyxZQUFhLEVBQU8sWUFDcEYsRUFBUCxDQUNFLE1BQU8sR0FBTyxHQUlsQixFQUFPLEdBQUcsWUFBWSxTQUFVLEVBQUcsQ0FDL0IsR0FBYyxFQUFHLEVBQVEsVUFBWSxDQUNqQyxFQUFLLFFBQVUsRUFDZixLQUNELFNBQVUsRUFBRyxFQUFPLENBQ25CLEVBQU8sTUFFWixLQUdQLFNBQU8sV0FBYSxHQUNiLEVBR1gsWUFBdUIsRUFBRyxFQUFRLEVBQWMsRUFBTSxFQUFVLEVBQWUsQ0FDM0UsRUFBRSxXQUFXLEVBQWMsRUFBTSxFQUFVLFNBQVUsRUFBRyxFQUFPLENBQzNELEFBQUksRUFBTSxPQUFTLEVBQU0sV0FDckIsRUFBRSxXQUFXLGlFQUF1RSxDQUFDLEVBQU8sV0FBWSxTQUFVLEVBQUcsRUFBUyxDQUMxSCxBQUFLLEVBQVEsS0FBSyxPQU9kLEVBQWMsRUFBRyxHQUpqQixHQUFjLEVBQUcsRUFBUSxVQUFZLENBQ2pDLEVBQUUsV0FBVyxFQUFjLEVBQU0sRUFBVSxJQUM1QyxJQUlSLEdBRUgsRUFBYyxFQUFHLElBRXRCLEdBR1AsWUFBbUIsRUFBSyxFQUFVLENBQzlCLEdBQUksR0FBTyxLQUVYLEVBQU0sRUFBYSxHQUVuQixHQUFJLEdBQVUsR0FBSSxHQUFVLFNBQVUsRUFBUyxFQUFRLENBQ25ELEVBQUssUUFBUSxLQUFLLFVBQVksQ0FDMUIsR0FBSSxHQUFTLEVBQUssUUFDbEIsRUFBTyxHQUFHLFlBQVksU0FBVSxFQUFHLENBQy9CLEdBQWMsRUFBRyxFQUFRLGlCQUFtQixFQUFPLFVBQVkseUJBQTBCLENBQUMsR0FBTSxTQUFVLEVBQUcsRUFBUyxDQUNsSCxHQUFJLEdBQVMsRUFBUSxLQUFLLE9BQVMsRUFBUSxLQUFLLEtBQUssR0FBRyxNQUFRLEtBSWhFLEFBQUksR0FDQSxHQUFTLEVBQU8sV0FBVyxZQUFZLElBRzNDLEVBQVEsSUFDVCxTQUFVLEVBQUcsRUFBTyxDQUNuQixFQUFPLFNBR2hCLE1BQVMsS0FHaEIsU0FBZ0IsRUFBUyxHQUNsQixFQUdYLFlBQW1CLEVBQVUsRUFBVSxDQUNuQyxHQUFJLEdBQU8sS0FFUCxFQUFVLEdBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUNuRCxFQUFLLFFBQVEsS0FBSyxVQUFZLENBQzFCLEdBQUksR0FBUyxFQUFLLFFBRWxCLEVBQU8sR0FBRyxZQUFZLFNBQVUsRUFBRyxDQUMvQixHQUFjLEVBQUcsRUFBUSxpQkFBbUIsRUFBTyxVQUFXLEdBQUksU0FBVSxFQUFHLEVBQVMsQ0FJcEYsT0FISSxHQUFPLEVBQVEsS0FDZixFQUFTLEVBQUssT0FFVCxFQUFJLEVBQUcsRUFBSSxFQUFRLElBQUssQ0FDN0IsR0FBSSxHQUFPLEVBQUssS0FBSyxHQUNqQixFQUFTLEVBQUssTUFZbEIsR0FSSSxHQUNBLEdBQVMsRUFBTyxXQUFXLFlBQVksSUFHM0MsRUFBUyxFQUFTLEVBQVEsRUFBSyxJQUFLLEVBQUksR0FJcEMsSUFBVyxPQUFRLENBQ25CLEVBQVEsR0FDUixRQUlSLEtBQ0QsU0FBVSxFQUFHLEVBQU8sQ0FDbkIsRUFBTyxTQUdoQixNQUFTLEtBR2hCLFNBQWdCLEVBQVMsR0FDbEIsRUFHWCxZQUFrQixFQUFLLEVBQU8sRUFBVSxFQUFhLENBQ2pELEdBQUksR0FBTyxLQUVYLEVBQU0sRUFBYSxHQUVuQixHQUFJLEdBQVUsR0FBSSxHQUFVLFNBQVUsRUFBUyxFQUFRLENBQ25ELEVBQUssUUFBUSxLQUFLLFVBQVksQ0FJMUIsQUFBSSxJQUFVLFFBQ1YsR0FBUSxNQUlaLEdBQUksR0FBZ0IsRUFFaEIsRUFBUyxFQUFLLFFBQ2xCLEVBQU8sV0FBVyxVQUFVLEVBQU8sU0FBVSxFQUFPLEVBQU8sQ0FDdkQsQUFBSSxFQUNBLEVBQU8sR0FFUCxFQUFPLEdBQUcsWUFBWSxTQUFVLEVBQUcsQ0FDL0IsR0FBYyxFQUFHLEVBQVEsMEJBQTRCLEVBQU8sVUFBWSw4QkFBb0MsQ0FBQyxFQUFLLEdBQVEsVUFBWSxDQUNsSSxFQUFRLElBQ1QsU0FBVSxFQUFHLEVBQU8sQ0FDbkIsRUFBTyxNQUVaLFNBQVUsRUFBVSxDQUduQixHQUFJLEVBQVMsT0FBUyxFQUFTLFVBQVcsQ0FRdEMsR0FBSSxFQUFjLEVBQUcsQ0FDakIsRUFBUSxHQUFTLE1BQU0sRUFBTSxDQUFDLEVBQUssRUFBZSxFQUFVLEVBQWMsS0FDMUUsT0FFSixFQUFPLFVBS3hCLE1BQVMsS0FHaEIsU0FBZ0IsRUFBUyxHQUNsQixFQUdYLFlBQW1CLEVBQUssRUFBTyxFQUFVLENBQ3JDLE1BQU8sSUFBUyxNQUFNLEtBQU0sQ0FBQyxFQUFLLEVBQU8sRUFBVSxJQUd2RCxZQUFzQixFQUFLLEVBQVUsQ0FDakMsR0FBSSxHQUFPLEtBRVgsRUFBTSxFQUFhLEdBRW5CLEdBQUksR0FBVSxHQUFJLEdBQVUsU0FBVSxFQUFTLEVBQVEsQ0FDbkQsRUFBSyxRQUFRLEtBQUssVUFBWSxDQUMxQixHQUFJLEdBQVMsRUFBSyxRQUNsQixFQUFPLEdBQUcsWUFBWSxTQUFVLEVBQUcsQ0FDL0IsR0FBYyxFQUFHLEVBQVEsZUFBaUIsRUFBTyxVQUFZLGlCQUFrQixDQUFDLEdBQU0sVUFBWSxDQUM5RixLQUNELFNBQVUsRUFBRyxFQUFPLENBQ25CLEVBQU8sU0FHaEIsTUFBUyxLQUdoQixTQUFnQixFQUFTLEdBQ2xCLEVBS1gsWUFBaUIsRUFBVSxDQUN2QixHQUFJLEdBQU8sS0FFUCxFQUFVLEdBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUNuRCxFQUFLLFFBQVEsS0FBSyxVQUFZLENBQzFCLEdBQUksR0FBUyxFQUFLLFFBQ2xCLEVBQU8sR0FBRyxZQUFZLFNBQVUsRUFBRyxDQUMvQixHQUFjLEVBQUcsRUFBUSxlQUFpQixFQUFPLFVBQVcsR0FBSSxVQUFZLENBQ3hFLEtBQ0QsU0FBVSxFQUFHLEVBQU8sQ0FDbkIsRUFBTyxTQUdoQixNQUFTLEtBR2hCLFNBQWdCLEVBQVMsR0FDbEIsRUFLWCxZQUFrQixFQUFVLENBQ3hCLEdBQUksR0FBTyxLQUVQLEVBQVUsR0FBSSxHQUFVLFNBQVUsRUFBUyxFQUFRLENBQ25ELEVBQUssUUFBUSxLQUFLLFVBQVksQ0FDMUIsR0FBSSxHQUFTLEVBQUssUUFDbEIsRUFBTyxHQUFHLFlBQVksU0FBVSxFQUFHLENBRS9CLEdBQWMsRUFBRyxFQUFRLCtCQUFpQyxFQUFPLFVBQVcsR0FBSSxTQUFVLEVBQUcsRUFBUyxDQUNsRyxHQUFJLEdBQVMsRUFBUSxLQUFLLEtBQUssR0FBRyxFQUNsQyxFQUFRLElBQ1QsU0FBVSxFQUFHLEVBQU8sQ0FDbkIsRUFBTyxTQUdoQixNQUFTLEtBR2hCLFNBQWdCLEVBQVMsR0FDbEIsRUFVWCxZQUFlLEVBQUcsRUFBVSxDQUN4QixHQUFJLEdBQU8sS0FFUCxFQUFVLEdBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUNuRCxFQUFLLFFBQVEsS0FBSyxVQUFZLENBQzFCLEdBQUksR0FBUyxFQUFLLFFBQ2xCLEVBQU8sR0FBRyxZQUFZLFNBQVUsRUFBRyxDQUMvQixHQUFjLEVBQUcsRUFBUSxtQkFBcUIsRUFBTyxVQUFZLHdCQUF5QixDQUFDLEVBQUksR0FBSSxTQUFVLEVBQUcsRUFBUyxDQUNySCxHQUFJLEdBQVMsRUFBUSxLQUFLLE9BQVMsRUFBUSxLQUFLLEtBQUssR0FBRyxJQUFNLEtBQzlELEVBQVEsSUFDVCxTQUFVLEVBQUcsRUFBTyxDQUNuQixFQUFPLFNBR2hCLE1BQVMsS0FHaEIsU0FBZ0IsRUFBUyxHQUNsQixFQUdYLFlBQWdCLEVBQVUsQ0FDdEIsR0FBSSxHQUFPLEtBRVAsRUFBVSxHQUFJLEdBQVUsU0FBVSxFQUFTLEVBQVEsQ0FDbkQsRUFBSyxRQUFRLEtBQUssVUFBWSxDQUMxQixHQUFJLEdBQVMsRUFBSyxRQUNsQixFQUFPLEdBQUcsWUFBWSxTQUFVLEVBQUcsQ0FDL0IsR0FBYyxFQUFHLEVBQVEsbUJBQXFCLEVBQU8sVUFBVyxHQUFJLFNBQVUsRUFBRyxFQUFTLENBR3RGLE9BRkksR0FBTyxHQUVGLEVBQUksRUFBRyxFQUFJLEVBQVEsS0FBSyxPQUFRLElBQ3JDLEVBQUssS0FBSyxFQUFRLEtBQUssS0FBSyxHQUFHLEtBR25DLEVBQVEsSUFDVCxTQUFVLEVBQUcsRUFBTyxDQUNuQixFQUFPLFNBR2hCLE1BQVMsS0FHaEIsU0FBZ0IsRUFBUyxHQUNsQixFQUtYLFlBQTBCLEVBQUksQ0FDMUIsTUFBTyxJQUFJLEdBQVUsU0FBVSxFQUFTLEVBQVEsQ0FDNUMsRUFBRyxZQUFZLFNBQVUsRUFBRyxDQUN4QixFQUFFLFdBQVcsOEZBQW9HLEdBQUksU0FBVSxFQUFHLEVBQVMsQ0FHdkksT0FGSSxHQUFhLEdBRVIsRUFBSSxFQUFHLEVBQUksRUFBUSxLQUFLLE9BQVEsSUFDckMsRUFBVyxLQUFLLEVBQVEsS0FBSyxLQUFLLEdBQUcsTUFHekMsRUFBUSxDQUNKLEdBQUksRUFDSixXQUFZLEtBRWpCLFNBQVUsRUFBRyxFQUFPLENBQ25CLEVBQU8sTUFFWixTQUFVLEVBQVUsQ0FDbkIsRUFBTyxPQUtuQixZQUF3QixFQUFTLEVBQVUsQ0FDdkMsRUFBVyxFQUFZLE1BQU0sS0FBTSxXQUVuQyxHQUFJLEdBQWdCLEtBQUssU0FDekIsRUFBVSxNQUFPLElBQVksWUFBYyxHQUFXLEdBQ2pELEVBQVEsTUFDVCxHQUFRLEtBQU8sRUFBUSxNQUFRLEVBQWMsS0FDN0MsRUFBUSxVQUFZLEVBQVEsV0FBYSxFQUFjLFdBRzNELEdBQUksR0FBTyxLQUNQLEVBQ0osTUFBSyxHQUFRLEtBR1QsRUFBVSxHQUFJLEdBQVUsU0FBVSxFQUFTLENBQ3ZDLEdBQUksR0FDSixBQUFJLEVBQVEsT0FBUyxFQUFjLEtBRS9CLEVBQUssRUFBSyxRQUFRLEdBRWxCLEVBQUssYUFBYSxFQUFRLEtBQU0sR0FBSSxHQUFJLEdBRzVDLEFBQUssRUFBUSxVQUlULEVBQVEsQ0FDSixHQUFJLEVBQ0osV0FBWSxDQUFDLEVBQVEsYUFKekIsRUFBUSxHQUFpQixNQU85QixLQUFLLFNBQVUsRUFBZSxDQUM3QixNQUFPLElBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUM1QyxFQUFjLEdBQUcsWUFBWSxTQUFVLEVBQUcsQ0FDdEMsV0FBbUIsRUFBVyxDQUMxQixNQUFPLElBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUM1QyxFQUFFLFdBQVcsd0JBQTBCLEVBQVcsR0FBSSxVQUFZLENBQzlELEtBQ0QsU0FBVSxFQUFHLEdBQU8sQ0FDbkIsRUFBTyxRQU1uQixPQURJLEdBQWEsR0FDUixFQUFJLEVBQUcsRUFBTSxFQUFjLFdBQVcsT0FBUSxFQUFJLEVBQUssSUFDNUQsRUFBVyxLQUFLLEVBQVUsRUFBYyxXQUFXLEtBR3ZELEVBQVUsSUFBSSxHQUFZLEtBQUssVUFBWSxDQUN2QyxNQUNELE1BQVMsU0FBVSxFQUFHLENBQ3JCLEVBQU8sTUFFWixTQUFVLEVBQVUsQ0FDbkIsRUFBTyxTQTVDbkIsRUFBVSxFQUFVLE9BQU8scUJBa0QvQixFQUFnQixFQUFTLEdBQ2xCLEVBR1gsR0FBSSxJQUFnQixDQUNoQixRQUFTLGdCQUNULGFBQWMsR0FDZCxTQUFVLEtBQ1YsUUFBUyxHQUNULFFBQVMsR0FDVCxRQUFTLEdBQ1QsV0FBWSxHQUNaLE1BQU8sR0FDUCxPQUFRLEdBQ1IsSUFBSyxHQUNMLEtBQU0sR0FDTixhQUFjLElBR2xCLGFBQStCLENBQzNCLEdBQUksQ0FDQSxNQUFPLE9BQU8sZUFBaUIsYUFBZSxXQUFhLGVBRTNELENBQUMsQ0FBQyxhQUFhLGFBQ2pCLENBQ0UsTUFBTyxJQUlmLFlBQXVCLEVBQVMsRUFBZSxDQUMzQyxHQUFJLEdBQVksRUFBUSxLQUFPLElBRS9CLE1BQUksR0FBUSxZQUFjLEVBQWMsV0FDcEMsSUFBYSxFQUFRLFVBQVksS0FFOUIsRUFJWCxhQUFxQyxDQUNqQyxHQUFJLEdBQXNCLDRCQUUxQixHQUFJLENBQ0Esb0JBQWEsUUFBUSxFQUFxQixJQUMxQyxhQUFhLFdBQVcsR0FFakIsUUFDVCxDQUNFLE1BQU8sSUFRZixhQUFpQyxDQUM3QixNQUFPLENBQUMsTUFBK0IsYUFBYSxPQUFTLEVBSWpFLFlBQXdCLEVBQVMsQ0FDN0IsR0FBSSxHQUFPLEtBQ1AsRUFBUyxHQUNiLEdBQUksRUFDQSxPQUFTLEtBQUssR0FDVixFQUFPLEdBQUssRUFBUSxHQU01QixNQUZBLEdBQU8sVUFBWSxHQUFjLEVBQVMsRUFBSyxnQkFFM0MsQUFBQyxLQUlMLEdBQUssUUFBVSxFQUNmLEVBQU8sV0FBYSxHQUViLEVBQVUsV0FOTixFQUFVLFNBV3pCLFlBQWlCLEVBQVUsQ0FDdkIsR0FBSSxHQUFPLEtBQ1AsRUFBVSxFQUFLLFFBQVEsS0FBSyxVQUFZLENBR3hDLE9BRkksR0FBWSxFQUFLLFFBQVEsVUFFcEIsRUFBSSxhQUFhLE9BQVMsRUFBRyxHQUFLLEVBQUcsSUFBSyxDQUMvQyxHQUFJLEdBQU0sYUFBYSxJQUFJLEdBRTNCLEFBQUksRUFBSSxRQUFRLEtBQWUsR0FDM0IsYUFBYSxXQUFXLE1BS3BDLFNBQWdCLEVBQVMsR0FDbEIsRUFNWCxZQUFtQixFQUFLLEVBQVUsQ0FDOUIsR0FBSSxHQUFPLEtBRVgsRUFBTSxFQUFhLEdBRW5CLEdBQUksR0FBVSxFQUFLLFFBQVEsS0FBSyxVQUFZLENBQ3hDLEdBQUksR0FBUyxFQUFLLFFBQ2QsRUFBUyxhQUFhLFFBQVEsRUFBTyxVQUFZLEdBTXJELE1BQUksSUFDQSxHQUFTLEVBQU8sV0FBVyxZQUFZLElBR3BDLElBR1gsU0FBZ0IsRUFBUyxHQUNsQixFQUlYLFlBQW1CLEVBQVUsRUFBVSxDQUNuQyxHQUFJLEdBQU8sS0FFUCxFQUFVLEVBQUssUUFBUSxLQUFLLFVBQVksQ0FjeEMsT0FiSSxHQUFTLEVBQUssUUFDZCxFQUFZLEVBQU8sVUFDbkIsRUFBa0IsRUFBVSxPQUM1QixFQUFTLGFBQWEsT0FRdEIsRUFBa0IsRUFFYixFQUFJLEVBQUcsRUFBSSxFQUFRLElBQUssQ0FDN0IsR0FBSSxHQUFNLGFBQWEsSUFBSSxHQUMzQixHQUFJLEVBQUksUUFBUSxLQUFlLEVBRy9CLElBQUksR0FBUSxhQUFhLFFBQVEsR0FZakMsR0FOSSxHQUNBLEdBQVEsRUFBTyxXQUFXLFlBQVksSUFHMUMsRUFBUSxFQUFTLEVBQU8sRUFBSSxVQUFVLEdBQWtCLEtBRXBELElBQVUsT0FDVixNQUFPLE9BS25CLFNBQWdCLEVBQVMsR0FDbEIsRUFJWCxZQUFlLEVBQUcsRUFBVSxDQUN4QixHQUFJLEdBQU8sS0FDUCxFQUFVLEVBQUssUUFBUSxLQUFLLFVBQVksQ0FDeEMsR0FBSSxHQUFTLEVBQUssUUFDZCxFQUNKLEdBQUksQ0FDQSxFQUFTLGFBQWEsSUFBSSxRQUM1QixDQUNFLEVBQVMsS0FJYixNQUFJLElBQ0EsR0FBUyxFQUFPLFVBQVUsRUFBTyxVQUFVLFNBR3hDLElBR1gsU0FBZ0IsRUFBUyxHQUNsQixFQUdYLFlBQWdCLEVBQVUsQ0FDdEIsR0FBSSxHQUFPLEtBQ1AsRUFBVSxFQUFLLFFBQVEsS0FBSyxVQUFZLENBS3hDLE9BSkksR0FBUyxFQUFLLFFBQ2QsRUFBUyxhQUFhLE9BQ3RCLEVBQU8sR0FFRixFQUFJLEVBQUcsRUFBSSxFQUFRLElBQUssQ0FDN0IsR0FBSSxHQUFVLGFBQWEsSUFBSSxHQUMvQixBQUFJLEVBQVEsUUFBUSxFQUFPLGFBQWUsR0FDdEMsRUFBSyxLQUFLLEVBQVEsVUFBVSxFQUFPLFVBQVUsU0FJckQsTUFBTyxLQUdYLFNBQWdCLEVBQVMsR0FDbEIsRUFJWCxZQUFrQixFQUFVLENBQ3hCLEdBQUksR0FBTyxLQUNQLEVBQVUsRUFBSyxPQUFPLEtBQUssU0FBVSxFQUFNLENBQzNDLE1BQU8sR0FBSyxTQUdoQixTQUFnQixFQUFTLEdBQ2xCLEVBSVgsWUFBc0IsRUFBSyxFQUFVLENBQ2pDLEdBQUksR0FBTyxLQUVYLEVBQU0sRUFBYSxHQUVuQixHQUFJLEdBQVUsRUFBSyxRQUFRLEtBQUssVUFBWSxDQUN4QyxHQUFJLEdBQVMsRUFBSyxRQUNsQixhQUFhLFdBQVcsRUFBTyxVQUFZLEtBRy9DLFNBQWdCLEVBQVMsR0FDbEIsRUFPWCxZQUFtQixFQUFLLEVBQU8sRUFBVSxDQUNyQyxHQUFJLEdBQU8sS0FFWCxFQUFNLEVBQWEsR0FFbkIsR0FBSSxHQUFVLEVBQUssUUFBUSxLQUFLLFVBQVksQ0FHeEMsQUFBSSxJQUFVLFFBQ1YsR0FBUSxNQUlaLEdBQUksR0FBZ0IsRUFFcEIsTUFBTyxJQUFJLEdBQVUsU0FBVSxFQUFTLEVBQVEsQ0FDNUMsR0FBSSxHQUFTLEVBQUssUUFDbEIsRUFBTyxXQUFXLFVBQVUsRUFBTyxTQUFVLEVBQU8sRUFBTyxDQUN2RCxHQUFJLEVBQ0EsRUFBTyxPQUVQLElBQUksQ0FDQSxhQUFhLFFBQVEsRUFBTyxVQUFZLEVBQUssR0FDN0MsRUFBUSxTQUNILEVBQVAsQ0FHRSxBQUFJLEdBQUUsT0FBUyxzQkFBd0IsRUFBRSxPQUFTLCtCQUM5QyxFQUFPLEdBRVgsRUFBTyxVQU8zQixTQUFnQixFQUFTLEdBQ2xCLEVBR1gsWUFBd0IsRUFBUyxFQUFVLENBSXZDLEdBSEEsRUFBVyxFQUFZLE1BQU0sS0FBTSxXQUVuQyxFQUFVLE1BQU8sSUFBWSxZQUFjLEdBQVcsR0FDbEQsQ0FBQyxFQUFRLEtBQU0sQ0FDZixHQUFJLEdBQWdCLEtBQUssU0FDekIsRUFBUSxLQUFPLEVBQVEsTUFBUSxFQUFjLEtBQzdDLEVBQVEsVUFBWSxFQUFRLFdBQWEsRUFBYyxVQUczRCxHQUFJLEdBQU8sS0FDUCxFQUNKLE1BQUssR0FBUSxLQUdULEVBQVUsR0FBSSxHQUFVLFNBQVUsRUFBUyxDQUN2QyxBQUFLLEVBQVEsVUFHVCxFQUFRLEdBQWMsRUFBUyxFQUFLLGlCQUZwQyxFQUFRLEVBQVEsS0FBTyxPQUk1QixLQUFLLFNBQVUsRUFBVyxDQUN6QixPQUFTLEdBQUksYUFBYSxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQUssQ0FDL0MsR0FBSSxHQUFNLGFBQWEsSUFBSSxHQUUzQixBQUFJLEVBQUksUUFBUSxLQUFlLEdBQzNCLGFBQWEsV0FBVyxNQWJwQyxFQUFVLEVBQVUsT0FBTyxxQkFtQi9CLEVBQWdCLEVBQVMsR0FDbEIsRUFHWCxHQUFJLElBQXNCLENBQ3RCLFFBQVMsc0JBQ1QsYUFBYyxHQUNkLFNBQVUsS0FDVixRQUFTLEdBQ1QsUUFBUyxHQUNULFFBQVMsR0FDVCxXQUFZLEdBQ1osTUFBTyxHQUNQLE9BQVEsR0FDUixJQUFLLEdBQ0wsS0FBTSxHQUNOLGFBQWMsSUFHZCxHQUFZLFNBQW1CLEVBQUcsRUFBRyxDQUNyQyxNQUFPLEtBQU0sR0FBSyxNQUFPLElBQU0sVUFBWSxNQUFPLElBQU0sVUFBWSxNQUFNLElBQU0sTUFBTSxJQUd0RixHQUFXLFNBQWtCLEVBQU8sRUFBZSxDQUduRCxPQUZJLEdBQU0sRUFBTSxPQUNaLEVBQUksRUFDRCxFQUFJLEdBQUssQ0FDWixHQUFJLEdBQVUsRUFBTSxHQUFJLEdBQ3BCLE1BQU8sR0FFWCxJQUdKLE1BQU8sSUFHUCxHQUFVLE1BQU0sU0FBVyxTQUFVLEVBQUssQ0FDMUMsTUFBTyxRQUFPLFVBQVUsU0FBUyxLQUFLLEtBQVMsa0JBSy9DLEdBQWlCLEdBRWpCLEdBQWdCLEdBRWhCLEdBQWlCLENBQ2pCLFVBQVcsR0FDWCxPQUFRLEdBQ1IsYUFBYyxJQUdkLEdBQXFCLENBQUMsR0FBZSxVQUFVLFFBQVMsR0FBZSxPQUFPLFFBQVMsR0FBZSxhQUFhLFNBRW5ILEdBQXdCLENBQUMsZ0JBRXpCLEdBQWlCLENBQUMsUUFBUyxVQUFXLFVBQVcsTUFBTyxPQUFRLFNBQVUsYUFBYyxXQUFXLE9BQU8sSUFFMUcsR0FBZ0IsQ0FDaEIsWUFBYSxHQUNiLE9BQVEsR0FBbUIsUUFDM0IsS0FBTSxjQUdOLEtBQU0sUUFDTixVQUFXLGdCQUNYLFFBQVMsR0FHYixZQUF1QixFQUFxQixFQUFlLENBQ3ZELEVBQW9CLEdBQWlCLFVBQVksQ0FDN0MsR0FBSSxHQUFRLFVBQ1osTUFBTyxHQUFvQixRQUFRLEtBQUssVUFBWSxDQUNoRCxNQUFPLEdBQW9CLEdBQWUsTUFBTSxFQUFxQixNQUtqRixhQUFrQixDQUNkLE9BQVMsR0FBSSxFQUFHLEVBQUksVUFBVSxPQUFRLElBQUssQ0FDdkMsR0FBSSxHQUFNLFVBQVUsR0FFcEIsR0FBSSxFQUNBLE9BQVMsS0FBUSxHQUNiLEFBQUksRUFBSSxlQUFlLElBQ25CLENBQUksR0FBUSxFQUFJLElBQ1osVUFBVSxHQUFHLEdBQVEsRUFBSSxHQUFNLFFBRS9CLFVBQVUsR0FBRyxHQUFRLEVBQUksSUFPN0MsTUFBTyxXQUFVLEdBR3JCLEdBQUksSUFBYyxVQUFZLENBQzFCLFdBQXFCLEVBQVMsQ0FDMUIsRUFBZ0IsS0FBTSxHQUV0QixPQUFTLEtBQWlCLElBQ3RCLEdBQUksR0FBZSxlQUFlLEdBQWdCLENBQzlDLEdBQUksR0FBUyxHQUFlLEdBQ3hCLEVBQWEsRUFBTyxRQUN4QixLQUFLLEdBQWlCLEVBRWpCLEdBQWUsSUFJaEIsS0FBSyxhQUFhLEdBSzlCLEtBQUssZUFBaUIsR0FBTyxHQUFJLElBQ2pDLEtBQUssUUFBVSxHQUFPLEdBQUksS0FBSyxlQUFnQixHQUMvQyxLQUFLLFdBQWEsS0FDbEIsS0FBSyxZQUFjLEtBQ25CLEtBQUssT0FBUyxHQUNkLEtBQUssUUFBVSxLQUVmLEtBQUssK0JBQ0wsS0FBSyxVQUFVLEtBQUssUUFBUSxRQUFRLE1BQVMsVUFBWSxJQVM3RCxTQUFZLFVBQVUsT0FBUyxTQUFnQixFQUFTLENBSXBELEdBQUssT0FBTyxJQUFZLFlBQWMsWUFBYyxFQUFRLE1BQWMsU0FBVSxDQUdoRixHQUFJLEtBQUssT0FDTCxNQUFPLElBQUksT0FBTSx3REFHckIsT0FBUyxLQUFLLEdBQVMsQ0FLbkIsR0FKSSxJQUFNLGFBQ04sR0FBUSxHQUFLLEVBQVEsR0FBRyxRQUFRLE1BQU8sTUFHdkMsSUFBTSxXQUFhLE1BQU8sR0FBUSxJQUFPLFNBQ3pDLE1BQU8sSUFBSSxPQUFNLHNDQUdyQixLQUFLLFFBQVEsR0FBSyxFQUFRLEdBSzlCLE1BQUksVUFBWSxJQUFXLEVBQVEsT0FDeEIsS0FBSyxVQUFVLEtBQUssUUFBUSxRQUdoQyxPQUNKLE9BQUksT0FBTyxJQUFZLFNBQ25CLEtBQUssUUFBUSxHQUViLEtBQUssU0FRcEIsRUFBWSxVQUFVLGFBQWUsU0FBc0IsRUFBYyxFQUFVLEVBQWUsQ0FDOUYsR0FBSSxHQUFVLEdBQUksR0FBVSxTQUFVLEVBQVMsRUFBUSxDQUNuRCxHQUFJLENBQ0EsR0FBSSxHQUFhLEVBQWEsUUFDMUIsRUFBa0IsR0FBSSxPQUFNLHdGQUloQyxHQUFJLENBQUMsRUFBYSxRQUFTLENBQ3ZCLEVBQU8sR0FDUCxPQUlKLE9BREksR0FBZ0IsR0FBZSxPQUFPLGdCQUNqQyxFQUFJLEVBQUcsRUFBTSxFQUFjLE9BQVEsRUFBSSxFQUFLLElBQUssQ0FDdEQsR0FBSSxHQUFtQixFQUFjLEdBSWpDLEVBQWEsQ0FBQyxHQUFTLEdBQXVCLEdBQ2xELEdBQUssSUFBYyxFQUFhLEtBQXNCLE1BQU8sR0FBYSxJQUFzQixXQUFZLENBQ3hHLEVBQU8sR0FDUCxRQUlSLEdBQUksR0FBMEIsVUFBbUMsQ0FVN0QsT0FUSSxJQUE4QixTQUFxQyxHQUFZLENBQy9FLE1BQU8sV0FBWSxDQUNmLEdBQUksSUFBUSxHQUFJLE9BQU0sVUFBWSxHQUFhLDZDQUMzQyxHQUFVLEVBQVUsT0FBTyxJQUMvQixTQUFnQixHQUFTLFVBQVUsVUFBVSxPQUFTLElBQy9DLEtBSU4sR0FBSyxFQUFHLEdBQU8sR0FBc0IsT0FBUSxHQUFLLEdBQU0sS0FBTSxDQUNuRSxHQUFJLElBQXVCLEdBQXNCLElBQ2pELEFBQUssRUFBYSxLQUNkLEdBQWEsSUFBd0IsR0FBNEIsT0FLN0UsSUFFQSxHQUFJLEdBQW1CLFNBQTBCLEdBQVMsQ0FDdEQsQUFBSSxHQUFlLElBQ2YsUUFBUSxLQUFLLGtDQUFvQyxHQUVyRCxHQUFlLEdBQWMsRUFDN0IsR0FBYyxHQUFjLEdBSTVCLEtBR0osQUFBSSxZQUFjLEdBQ2QsQUFBSSxFQUFhLFVBQVksTUFBTyxHQUFhLFVBQWEsV0FDMUQsRUFBYSxXQUFXLEtBQUssRUFBa0IsR0FFL0MsRUFBaUIsQ0FBQyxDQUFDLEVBQWEsVUFHcEMsRUFBaUIsVUFFaEIsR0FBUCxDQUNFLEVBQU8sT0FJZixTQUFvQixFQUFTLEVBQVUsR0FDaEMsR0FHWCxFQUFZLFVBQVUsT0FBUyxVQUFrQixDQUM3QyxNQUFPLE1BQUssU0FBVyxNQUczQixFQUFZLFVBQVUsVUFBWSxTQUFtQixFQUFZLEVBQVUsRUFBZSxDQUN0RixHQUFJLEdBQW1CLEdBQWUsR0FBYyxFQUFVLFFBQVEsR0FBZSxJQUFlLEVBQVUsT0FBTyxHQUFJLE9BQU0sc0JBRS9ILFNBQW9CLEVBQWtCLEVBQVUsR0FDekMsR0FHWCxFQUFZLFVBQVUsY0FBZ0IsU0FBdUIsRUFBVSxDQUNuRSxHQUFJLEdBQW9CLEVBQVUsUUFBUSxJQUMxQyxTQUFvQixFQUFtQixHQUNoQyxHQUdYLEVBQVksVUFBVSxNQUFRLFNBQWUsRUFBVSxDQUNuRCxHQUFJLEdBQU8sS0FFUCxFQUFVLEVBQUssV0FBVyxLQUFLLFVBQVksQ0FDM0MsTUFBSSxHQUFLLFNBQVcsTUFDaEIsR0FBSyxPQUFTLEVBQUssZUFHaEIsRUFBSyxTQUdoQixTQUFvQixFQUFTLEVBQVUsR0FDaEMsR0FHWCxFQUFZLFVBQVUsVUFBWSxTQUFtQixFQUFTLEVBQVUsRUFBZSxDQUNuRixHQUFJLEdBQU8sS0FFWCxBQUFLLEdBQVEsSUFDVCxHQUFVLENBQUMsSUFHZixHQUFJLEdBQW1CLEtBQUsscUJBQXFCLEdBRWpELFlBQTZCLENBQ3pCLEVBQUssUUFBUSxPQUFTLEVBQUssU0FHL0IsV0FBOEIsRUFBUSxDQUNsQyxTQUFLLFFBQVEsR0FDYixJQUVBLEVBQUssT0FBUyxFQUFLLGFBQWEsRUFBSyxTQUM5QixFQUFLLE9BR2hCLFdBQW9CLEVBQWtCLENBQ2xDLE1BQU8sV0FBWSxDQUNmLEdBQUksR0FBcUIsRUFFekIsWUFBNkIsQ0FDekIsS0FBTyxFQUFxQixFQUFpQixRQUFRLENBQ2pELEdBQUksR0FBYSxFQUFpQixHQUNsQyxXQUVBLEVBQUssUUFBVSxLQUNmLEVBQUssT0FBUyxLQUVQLEVBQUssVUFBVSxHQUFZLEtBQUssR0FBc0IsTUFBUyxHQUcxRSxJQUNBLEdBQUksR0FBUSxHQUFJLE9BQU0sc0NBQ3RCLFNBQUssV0FBYSxFQUFVLE9BQU8sR0FDNUIsRUFBSyxXQUdoQixNQUFPLE1BT2YsR0FBSSxHQUFtQixLQUFLLGFBQWUsS0FBTyxLQUFLLFdBQVcsTUFBUyxVQUFZLENBQ25GLE1BQU8sR0FBVSxZQUNoQixFQUFVLFVBRWYsWUFBSyxXQUFhLEVBQWlCLEtBQUssVUFBWSxDQUNoRCxHQUFJLEdBQWEsRUFBaUIsR0FDbEMsU0FBSyxRQUFVLEtBQ2YsRUFBSyxPQUFTLEtBRVAsRUFBSyxVQUFVLEdBQVksS0FBSyxTQUFVLEVBQVEsQ0FDckQsRUFBSyxRQUFVLEVBQU8sUUFDdEIsSUFDQSxFQUFLLCtCQUNMLEVBQUssWUFBYyxFQUFXLE9BRW5DLE1BQVMsVUFBWSxDQUNwQixJQUNBLEdBQUksR0FBUSxHQUFJLE9BQU0sc0NBQ3RCLFNBQUssV0FBYSxFQUFVLE9BQU8sR0FDNUIsRUFBSyxhQUdoQixFQUFvQixLQUFLLFdBQVksRUFBVSxHQUN4QyxLQUFLLFlBR2hCLEVBQVksVUFBVSxTQUFXLFNBQWtCLEVBQVksQ0FDM0QsTUFBTyxDQUFDLENBQUMsR0FBYyxJQUczQixFQUFZLFVBQVUsUUFBVSxTQUFpQixFQUE2QixDQUMxRSxHQUFPLEtBQU0sSUFHakIsRUFBWSxVQUFVLHFCQUF1QixTQUE4QixFQUFTLENBRWhGLE9BREksR0FBbUIsR0FDZCxFQUFJLEVBQUcsRUFBTSxFQUFRLE9BQVEsRUFBSSxFQUFLLElBQUssQ0FDaEQsR0FBSSxHQUFhLEVBQVEsR0FDekIsQUFBSSxLQUFLLFNBQVMsSUFDZCxFQUFpQixLQUFLLEdBRzlCLE1BQU8sSUFHWCxFQUFZLFVBQVUsNkJBQStCLFVBQXdDLENBS3pGLE9BQVMsR0FBSSxFQUFHLEVBQU0sR0FBZSxPQUFRLEVBQUksRUFBSyxJQUNsRCxHQUFjLEtBQU0sR0FBZSxLQUkzQyxFQUFZLFVBQVUsZUFBaUIsU0FBd0IsRUFBUyxDQUNwRSxNQUFPLElBQUksR0FBWSxJQUdwQixLQU9QLEdBQWlCLEdBQUksSUFFekIsRUFBTyxRQUFVLElBRWYsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksa0ZDM3ZGcEIsR0FBQSxJQUNBLEdBQUEsR0FBQSxnQkFBQSxNQWNBLEdBQUEsVUFBQSxDQW1DRSxXQUFtQixFQUEwQyxDQUExQyxBQUFBLElBQUEsUUFBQSxHQUFBLElBMUJILEtBQUEsS0FBZSxFQUFRLEdBNEJyQyxLQUFLLE9BQVMsR0FBQSxrQkFDZCxLQUFLLGdCQUFrQixFQUFRLGlCQUFtQixHQUVsRCxLQUFLLGtCQUFvQixHQUFBLFFBQVksZUFBZSxDQUNsRCxLQUFNLDZCQU9ILFNBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQTZELEVBQXdCLENBQXRHLEdBQUEsR0FBQSxLQUNFLEtBQUssSUFBTSxJQUVQLG9CQUFzQixNQUFLLFFBQzdCLEtBQUssT0FBTyxpQkFBaUIsU0FBVSxVQUFBLENBQ3JDLEFBQUssRUFBSyxjQUFjLE1BQU0sVUFBQSxDQUM1QixHQUFBLE9BQU8sS0FBSyxvQ0FLbEIsRUFBd0IsU0FBQyxFQUFZLENBQ25DLE1BQUksR0FBSyxLQUFPLEVBQUssSUFBSSxlQUFlLElBRWxDLGFBQWUsR0FBSyxRQUFVLFVBQVksR0FBSyxPQUFPLFdBQWEsQ0FBQyxFQUFLLE9BQU8sVUFBVSxPQUN2RixHQUFLLFlBQVksR0FDbkIsS0FBSyxTQUFDLEVBQWEsQ0FBb0IsTUFBQSxHQUFLLHNCQUM1QyxNQUFNLFNBQUMsRUFBTSxDQUNaLEdBQUEsT0FBTyxLQUFLLHlDQUlULE1BSUosSUFJTCxhQUFlLE1BQUssUUFBVSxVQUFZLE1BQUssT0FBTyxXQUFhLEtBQUssT0FBTyxVQUFVLFFBQ3RGLEtBQUssY0FBYyxNQUFNLFVBQUEsQ0FDNUIsR0FBQSxPQUFPLEtBQUssbUNBU0osRUFBQSxVQUFBLFlBQWQsU0FBMEIsRUFBWSwwRkFDcEMsTUFBQSxDQUFBLEVBQU8sS0FBSyxrQkFBa0IsUUFBZSxHQUFBLFFBQVMsR0FBQSxVQUFVLFVBTXBELEVBQUEsVUFBQSxrQkFBZCxVQUFBLHVHQUNRLFNBQW9ELEdBRTFELENBQUEsRUFBTyxLQUFLLGtCQUNULFFBQXFCLFNBQUMsRUFBYyxFQUFrQixFQUFjLENBRW5FLEVBQU8sS0FBSyxDQUFFLFNBQVEsRUFBRSxNQUFLLE1BRTlCLEtBQ0MsVUFBQSxDQUVFLE1BQUEsR0FBSyxhQUVILEVBQ0csS0FBSyxTQUFDLEVBQUcsRUFBQyxDQUFLLE1BQUMsR0FBRSxNQUFNLFdBQWEsR0FBTSxHQUFFLE1BQU0sV0FBYSxLQUNoRSxNQUFNLEVBQUssZ0JBQWtCLEVBQU8sT0FBUyxFQUFLLGdCQUFrQixFQUFPLFFBQzNFLElBQUksU0FBQSxFQUFLLENBQUksTUFBQSxHQUFNLGNBRzNCLE1BQU0sU0FBQyxFQUFNLENBQ1osR0FBQSxPQUFPLEtBQUssd0NBT0osRUFBQSxVQUFBLFlBQWQsU0FBMEIsRUFBZ0IsMEZBQ3hDLE1BQUEsQ0FBQSxFQUFPLEtBQUssa0JBQWtCLFdBQVcsU0FNN0IsRUFBQSxVQUFBLGFBQWQsU0FBMkIsRUFBbUIscUdBRTVDLE1BQUEsQ0FBQSxFQUFPLFFBQVEsSUFBSSxFQUFVLElBQUksU0FBQSxFQUFRLENBQUksTUFBQSxHQUFLLFlBQVksTUFBWSxhQU05RCxFQUFBLFVBQUEsWUFBZCxVQUFBLHFHQUNFLE1BQUEsQ0FBQSxFQUFPLEtBQUssa0JBQWtCLFFBQXFCLFNBQUMsRUFBYyxFQUFrQixFQUFjLENBQ2hHLEFBQUksRUFBSyxJQUNQLEdBQUssSUFBSSxhQUFhLEdBRWpCLEVBQUssWUFBWSxHQUFVLE1BQU0sU0FBQyxFQUFNLENBQzNDLEdBQUEsT0FBTyxLQUFLLHVDQUdkLEdBQUEsT0FBTyxLQUFLLHNEQS9JSixFQUFBLEdBQWEsVUFtSjdCLEtBdkphLEdBQUEsUUFBQSxnRkNoQmIsR0FBQSxJQW9EQSxHQUFBLFVBQUEsQ0FtQkUsV0FDbUIsRUFJaEIsQ0FKZ0IsQUFBQSxJQUFBLFFBQUEsR0FBQSxDQUdmLE1BQU8sQ0FBQSxRQUFBLGNBQUEsa0JBSFEsS0FBQSxTQUFBLEVBWEgsS0FBQSxLQUFlLEVBQWtCLEdBcUIxQyxTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUF1QyxFQUF3QixDQUM5RSxHQUFJLEVBQUMsR0FBQSw0QkFJTCxNQUFLLGVBQWlCLEVBR3RCLEdBQU0sR0FBVyxHQUFLLElBQUEsbUJBQXVCLGtCQUFtQixLQUFLLFFBQVEsS0FBSyxNQUFPLENBQ3ZGLFNBQVUsR0FDVixNQUFPLEtBQUssU0FBUyxRQUl2QixFQUFTLFlBTUosRUFBQSxVQUFBLFFBQVAsU0FBZSxFQUFpQixTQUN4QixFQUFNLEtBQUssZ0JBQWtCLEtBQUssaUJBQ3hDLEdBQUksR0FBQyxHQUFPLENBQUMsRUFBSSxlQUFlLG9CQUdyQixFQUFNLENBQ2YsRUFBSSxVQUFVLFNBQUEsRUFBSyxDQUNqQixFQUFNLFNBQVMsTUFBTyxFQUFPLEtBRTdCLEdBQU0sR0FBUSxzQkFBc0IsRUFBTyxLQUFJLElBQzNDLEVBQVUsdUJBRWQsR0FBSSxFQUFPLEtBQU0sQ0FFZixHQUFNLEdBRUYsR0FHSixPQUFXLEtBQVEsR0FBTyxLQUN4QixFQUFVLEdBQVEsRUFBTyxLQUFLLEdBS2hDLEdBRkEsRUFBTSxTQUFTLE9BQVEsR0FFbkIsRUFBTyxPQUFJLFFBQXdCLENBQ3JDLEdBQU0sR0FBTyxFQUFPLEtBRXBCLEVBQVUsQ0FBQyxFQUFLLFNBQVcsR0FBSSxFQUFLLFFBQVUsSUFBSSxLQUFLLEtBQUssUUFBVSxNQUNqRSxDQUNMLEdBQU0sR0FBTyxFQUFPLEtBQ3BCLEVBQVUsRUFBSyxTQUFXLEdBSTlCLEVBQUksZUFBa0IsRUFBSyxLQUFLLFVBOUJwQyxPQUFxQixHQUFBLEdBQUEsU0FBQSxHQUFPLEVBQUEsRUFBQSxPQUFBLENBQUEsRUFBQSxLQUFBLEVBQUEsRUFBQSxPQUFBLENBQXZCLEdBQU0sR0FBTSxFQUFBLFFBQU4sd0dBbkRDLEVBQUEsR0FBYSxvQkFxRjdCLEtBekZhLEdBQUEsa0JBQUEsZ0ZDckRiLEdBQUEsSUFLQSxHQUFBLFVBQUEsQ0F3QkUsV0FBbUIsRUFBK0UsQ0FBbEcsR0FBQSxHQUFBLEtBQW1CLEFBQUEsSUFBQSxRQUFBLEdBQUEsSUFmWixLQUFBLEtBQWUsRUFBYyxHQVVuQixLQUFBLFFBQWtCLFVBZ0RsQixLQUFBLFVBQWdDLFNBQUMsRUFBaUIsQ0FDakUsR0FBSSxDQUFDLEVBQU0sU0FDVCxNQUFPLEdBR1QsR0FBTSxHQUFpQixZQUFZLEtBQUssRUFBTSxVQUN4QyxFQUFrQixNQUFNLEtBQUssRUFBTSxVQUN6QyxHQUFJLEdBQWtCLEVBQWlCLENBQ3JDLEdBQU0sR0FBVyxFQUNiLEVBQU0sU0FDSCxRQUFRLFVBQVcsSUFDbkIsUUFBUSxNQUFPLEtBQ2xCLEVBQU0sU0FDSixFQUFPLEVBQUssTUFBUSxHQUFBLFNBQVMsRUFBSyxNQUFPLEdBQVksR0FBQSxTQUFTLEdBQ3BFLEVBQU0sU0FBVyxHQUFHLEVBQUssUUFBVSxFQUVyQyxNQUFPLElBMURILEVBQVEsTUFDVixNQUFLLE1BQVEsRUFBUSxNQUVuQixFQUFRLFFBQ1YsTUFBSyxRQUFVLEVBQVEsUUFFckIsRUFBUSxVQUNWLE1BQUssVUFBWSxFQUFRLFVBT3RCLFNBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQTZELEVBQXdCLENBQ3BHLEVBQXdCLFNBQUEsRUFBSyxDQUMzQixHQUFNLEdBQU8sSUFBZ0IsZUFBZSxHQUM1QyxNQUFJLEdBQ0ssRUFBSyxRQUFRLEdBRWYsS0FLSixFQUFBLFVBQUEsUUFBUCxTQUFlLEVBQW9CLENBQ2pDLEdBQUksR0FBaUIsRUFFckIsTUFBSSxHQUFjLFdBQWEsTUFBTSxRQUFRLEVBQWMsVUFBVSxTQUNuRSxHQUFpQixLQUFLLHdCQUF3QixJQUc1QyxFQUFjLFlBQ2hCLEdBQWlCLEtBQUssd0JBQXdCLElBR3pDLEdBMEJELEVBQUEsVUFBQSx3QkFBUixTQUFnQyxFQUFZLENBQTVDLEdBQUEsR0FBQSxLQUNFLEdBQUksQ0FDRixNQUFBLElBQUEsU0FBQSxHQUFBLFNBQUEsR0FDSyxHQUFLLENBQ1IsVUFBUyxHQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ0osRUFBTSxXQUFTLENBR2xCLE9BQVEsRUFBTSxVQUFXLE9BQVEsSUFBSSxTQUFBLEVBQUssQ0FBSSxNQUFBLElBQUEsU0FBQSxHQUFBLFNBQUEsR0FDekMsR0FBSyxDQUNSLFdBQVksRUFBSyxtQkFBbUIsRUFBTSx5QkFJaEQsQ0FDQSxNQUFPLEtBS0gsRUFBQSxVQUFBLHdCQUFSLFNBQWdDLEVBQVksQ0FDMUMsR0FBSSxDQUNGLE1BQUEsSUFBQSxTQUFBLEdBQUEsU0FBQSxHQUNLLEdBQUssQ0FDUixXQUFZLEtBQUssbUJBQW1CLEVBQU0sbUJBRTVDLENBQ0EsTUFBTyxLQUtILEVBQUEsVUFBQSxtQkFBUixTQUEyQixFQUF1QixDQUFsRCxHQUFBLEdBQUEsS0FDRSxNQUFBLElBQUEsU0FBQSxHQUFBLFNBQUEsR0FDSyxHQUFVLENBQ2IsT0FBUSxHQUFjLEVBQVcsUUFBVSxFQUFXLE9BQU8sSUFBSSxTQUFBLEVBQUMsQ0FBSSxNQUFBLEdBQUssVUFBVSxRQXRIM0UsRUFBQSxHQUFhLGdCQXlIN0IsS0E3SGEsR0FBQSxjQUFBLGdGQ0hiLEdBQUEsVUFBQSxDQUFBLFlBQUEsQ0FTUyxLQUFBLEtBQWUsRUFBYyxHQUdqQixLQUFBLFdBQXFCLEtBQUssTUFLdEMsU0FBQSxVQUFBLFVBQVAsU0FBaUIsRUFBNkQsRUFBd0IsQ0FDcEcsRUFBd0IsU0FBQSxFQUFLLENBQzNCLEdBQU0sR0FBTyxJQUFnQixlQUFlLEdBQzVDLE1BQUksR0FDSyxFQUFLLFFBQVEsR0FFZixLQU9KLEVBQUEsVUFBQSxRQUFQLFNBQWUsRUFBWSxPQUNuQixFQUFNLEtBQUssTUFFakIsTUFBQSxJQUFBLFNBQUEsR0FBQSxTQUFBLEdBQ0ssR0FBSyxDQUNSLE1BQUssR0FBQSxTQUFBLEdBQUEsU0FBQSxHQUNBLEVBQU0sT0FBSyxHQUFBLEdBQUEsRUFDYixpQkFBa0IsS0FBSyxXQUFVLEVBQ2pDLG9CQUFxQixFQUFNLEtBQUssV0FBVSxFQUMxQyxlQUFnQixFQUFHLE9BbkNaLEVBQUEsR0FBYSxnQkF1QzdCLEtBM0NhLEdBQUEsY0FBQSxxRUNBYixHQUFBLElBQUEsVUFBQSxDQUFBLFlBQUEsQ0FTUyxLQUFBLEtBQWUsRUFBWSxHQUszQixTQUFBLFVBQUEsVUFBUCxTQUFpQixFQUE2RCxFQUF3QixDQUNwRyxFQUF3QixTQUFBLEVBQUssQ0FDM0IsR0FBTSxHQUFPLElBQWdCLGVBQWUsR0FDNUMsTUFBSSxHQUNLLEVBQUssUUFBUSxHQUVmLEtBT0osRUFBQSxVQUFBLFFBQVAsU0FBZSxFQUFZLENBSXpCLE9BSE0sR0FBUyxLQUFLLG9CQUFvQixHQUcvQixFQUFJLEVBQU8sT0FBUyxFQUFHLEdBQUssRUFBRyxJQUFLLENBQzNDLEdBQU0sR0FBUSxFQUFPLEdBRXJCLEdBQUksRUFBTSxTQUFXLEdBQU0sQ0FDekIsRUFBTSxZQUFjLEtBQUssZ0JBQWdCLEdBQ3pDLE9BSUosTUFBTyxJQUlELEVBQUEsVUFBQSxvQkFBUixTQUE0QixFQUFZLENBQ3RDLEdBQU0sR0FBWSxFQUFNLFdBQWEsRUFBTSxVQUFVLFFBQVUsRUFBTSxVQUFVLE9BQU8sR0FDdEYsTUFBUSxJQUFhLEVBQVUsWUFBYyxFQUFVLFdBQVcsUUFBVyxJQUl2RSxFQUFBLFVBQUEsZ0JBQVIsU0FBd0IsRUFBaUIsQ0FDdkMsTUFBTyxHQUFNLFFBQVUsRUFBTSxTQUFjLEdBQU0sUUFBVSxLQUFHLElBQUksR0FBTSxVQUFZLEtBQVEsYUEvQ2hGLEVBQUEsR0FBYSxjQWlEN0IsS0FyRGEsR0FBQSxZQUFBLGdGQ0FiLEdBQUEsSUFPTSxHQUFrQixDQUN0QixHQUFJLFdBTUEsR0FBMEIsQ0FDOUIsR0FBSSxrQkFHQSxHQUFTLFNBaUdULEdBQXdDLENBQzVDLFNBQVUsQ0FBQyxZQUFhLGVBQ3hCLE9BQVEsQ0FBQyxlQUFnQixXQUN6QixRQUFTLENBQUMsZ0JBQWlCLGFBQzNCLE1BQU8sQ0FBQyxjQUFlLFdBQ3ZCLE9BQVEsQ0FBQyxlQUFnQixZQUdyQixHQUF3QixtQkFDeEIsR0FBc0IsT0FDdEIsR0FBMkIsc0JBR2pDLEdBQUEsVUFBQSxDQXdCRSxXQUNFLEVBQTBHLENBRDVHLEdBQUEsR0FBQSxLQWZPLEtBQUEsS0FBZSxFQUFJLEdBT1QsS0FBQSxpQkFBOEMsR0FzRjlDLEtBQUEsbUJBQXFCLFNBQUMsRUFBZSxFQUF3QixDQUU1RSxHQUFJLEdBQUcsU0FBUyxpQkFHaEIsR0FBRyxTQUFTLGlCQUFtQixHQUUvQixHQUFNLEdBQU8sRUFBSyxrQkFBa0IsR0FDOUIsRUFBWSxJQUFTLEdBQ3JCLEVBQWlDLEdBT2pDLEVBQWMsU0FBQyxFQUFVLENBQzdCLEdBQU0sR0FBTSxHQUFBLGtCQUlaLEFBQUksRUFBSyxVQUNQLEVBQUssZ0JBQWdCLEVBQUssR0FFMUIsRUFBRyxNQUFNLFFBQVEsRUFBUSxVQUFBLENBUXZCLEdBQU0sR0FBcUIsSUFBZ0IsZUFBZSxJQUMxRCxHQUFJLEVBQW9CLENBQ3RCLEVBQUssaUJBQW9CLEVBQTJCLFlBQVksYUFBYSwwQkFDN0UsR0FBTSxHQUFlLEVBQTJCLFlBQVksaUJBQzVELEFBQUksR0FDRixHQUFLLFVBQVksRUFBWSxXQUFXLENBQ3RDLFlBQWEscUJBQ2IsR0FBSSxVQUlILENBQ0wsR0FBTSxHQUFvQixHQUFxQixLQUMvQyxBQUFJLEdBQ0YsR0FBSyxVQUFZLEVBQWtCLFdBQVcsQ0FDNUMsWUFBYSxxQkFDYixHQUFJLFVBU1YsRUFBZSxTQUFDLEVBQVksRUFBb0IsQ0FFcEQsR0FBTSxHQUFjLE1BQU0sUUFBUSxFQUFLLFNBQVMsZUFBZSxpQkFDM0QsRUFBSyxTQUFTLGVBQWUsZ0JBQWdCLFFBQVEsR0FBUSxHQUM3RCxFQUFLLFNBQVMsZUFBZSxnQkFFakMsR0FBSSxHQUFDLEVBQUssV0FBYSxDQUFDLEdBSXhCLElBQU0sR0FBTSxHQUFBLGtCQUNOLEVBQU8sRUFBTSxHQUluQixBQUFJLEVBQ0YsR0FBSyxTQUNMLEVBQUssZ0JBQWdCLEVBQUssSUFFMUIsRUFBRyxNQUFNLFFBQVEsRUFBUSxVQUFBLENBQ3ZCLEFBQUksRUFBSyxXQUNQLEdBQU0sR0FBYSxFQUFLLFVBQVUsV0FBVyxDQUMzQyxZQUFhLFFBQVEsRUFBSSxJQUN6QixHQUFPLEdBQU0sSUFBSSxTQVEzQixFQUFLLFNBQVMsZUFBZSxNQUFNLFFBQVEsU0FBQSxFQUFTLENBR2xELEdBQU0sR0FBZ0IsR0FBTSxHQUU1QixHQUFJLENBQUMsRUFBZSxDQUNsQixHQUFBLE9BQU8sS0FBSyxpQkFBaUIsR0FDN0IsT0FHRixFQUFjLFFBQVEsU0FBQSxFQUFZLENBQ2hDLEdBQU0sR0FBVSxFQUNaLEVBQVksS0FBSyxFQUFNLEdBQ3ZCLEVBQWEsS0FBSyxFQUFNLEVBQWMsR0FDcEMsRUFBZSxFQUFHLFNBQVMsR0FFakMsQUFBSSxNQUFNLFFBQVEsR0FDaEIsRUFBRyxTQUFTLEdBQWEsR0FBQSxTQUFBLENBQUksR0FBWSxHQUNwQyxBQUFJLE1BQU8sSUFBaUIsV0FDakMsRUFBRyxTQUFTLEdBQWdCLENBQUMsRUFBUyxHQUV0QyxFQUFHLFNBQVMsR0FBZ0IsQ0FBQyxTQXhMbkMsR0FBQSxPQUFPLElBQUksOEVBQ1gsS0FBSyxTQUFRLEdBQUEsU0FBQSxHQUFBLFNBQUEsQ0FFWCxJQUFLLEdBQUEsa0JBQXVCLElBQzVCLFlBQWEsR0FDYixVQUFXLEdBQ1gsUUFBUyxJQUNOLEdBQU8sQ0FDVixlQUFjLEdBQUEsU0FBQSxDQUNaLE1BQU8sQ0FBQyxRQUFTLFVBQ2pCLFFBQVMsSUFDVCxnQkFBaUIsSUFDZCxFQUFRLGtCQVFWLFNBQUEsVUFBQSxVQUFQLFNBQWlCLEVBQXVDLEVBQXdCLENBQzlFLEdBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSyxDQUN0QixHQUFBLE9BQU8sTUFBTSw2Q0FDYixPQUdGLEtBQUssb0JBQW9CLEdBRXJCLEtBQUssU0FBUyxTQUNoQixLQUFLLGNBQWMsSUFPZixFQUFBLFVBQUEsa0JBQVIsU0FBMEIsRUFBYSxDQUVyQyxHQUFJLENBQUMsRUFDSCxNQUFPLElBR1QsR0FBSSxFQUFHLFFBQVUsRUFDZixNQUFPLElBR1QsR0FBSSxDQUFDLEVBQUcsU0FDTixNQUFPLElBR1QsR0FBSSxFQUFHLFNBQVMsS0FDZCxNQUFPLEdBQUcsU0FBUyxLQUdyQixHQUFJLEVBQUcsU0FBUyxjQUNkLE1BQU8sR0FBRyxTQUFTLGNBSXJCLEdBQUksRUFBRyxTQUFTLE9BQVEsQ0FDdEIsR0FBTSxHQUFjLEVBQUcsU0FBUyxPQUFPLFFBQVEsYUFBYyxJQUFJLFFBQVEsTUFBTyxLQUMxRSxFQUFXLEdBQUEsU0FBUyxFQUFhLFFBQ3ZDLE1BQ0UsTUFBSyxpQkFBaUIsSUFDckIsTUFBSyxpQkFBaUIsR0FBWSxFQUFTLFFBQVEsR0FBdUIsU0FBQyxFQUFHLEVBQVMsQ0FDdEYsTUFBQSxHQUFJLEVBQUUsY0FBZ0IsTUFLNUIsTUFBTyxLQXlIRCxFQUFBLFVBQUEsZ0JBQVIsU0FBd0IsRUFBbUIsRUFBd0IsQ0FBbkUsR0FBQSxHQUFBLEtBQ0UsQUFBSSxLQUFLLGdCQUNQLGFBQWEsS0FBSyxnQkFHcEIsS0FBSyxlQUFpQixXQUFXLFVBQUEsQ0FDL0IsR0FBSSxFQUFLLGlCQUFrQixDQUl6QixHQUFNLEdBQXFCLElBQWdCLGVBQWUsSUFDMUQsQUFBSSxHQUVELEVBQTJCLFlBQVksWUFBWSxFQUFLLGtCQUs3RCxBQUFJLEVBQUssV0FDUCxFQUFLLFVBQVUsT0FBTyxJQUV2QixLQUFLLFNBQVMsZUFBZSxVQUkxQixFQUFBLFVBQUEsY0FBUixTQUFzQixFQUF3QixDQUM1QyxHQUFNLEdBQW9CLEtBQUssbUJBRS9CLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FDdEIsYUFBQSxVQUFBLENBRUUsQUFBSSxJQUFnQixlQUFlLEtBQW1CLElBQWdCLGVBQWUsSUFFbkYsRUFBa0IsS0FBTSxHQUV4QixHQUFBLE9BQU8sTUFBTSxzRkFPYixFQUFBLFVBQUEsb0JBQVIsU0FBNEIsRUFBd0IsQ0FBcEQsR0FBQSxHQUFBLEtBRVEsRUFBc0IsS0FBSyxTQUFTLElBQUksT0FBTyxhQUVyRCxLQUFLLFNBQVMsSUFBSSxPQUFPLGFBQWUsU0FBQyxFQUFjLEVBQWdCLEVBQWEsQ0FDbEYsR0FBTSxHQUFxQixHQUUzQixHQUFJLEVBQ0YsR0FBSSxDQUNGLEVBQVMsY0FBZ0IsRUFBSyxrQkFBa0IsR0FFNUMsRUFBSyxTQUFTLGFBQ2hCLEdBQVMsVUFBWSxFQUFHLFNBQVMsZ0JBRW5DLENBQ0EsR0FBQSxPQUFPLEtBQUssa0RBSWhCLEFBQUksR0FDRixHQUFTLGNBQWdCLEdBR3ZCLElBQWdCLGVBQWUsSUFFakMsV0FBVyxVQUFBLENBQ1QsSUFBZ0IsVUFBVSxTQUFBLEVBQUssQ0FDN0IsRUFBTSxXQUFXLE1BQU8sR0FDeEIsSUFBZ0IsaUJBQWlCLE9BS25DLE1BQU8sSUFBd0IsWUFDakMsRUFBb0IsS0FBSyxFQUFLLFNBQVMsSUFBSyxFQUFPLEVBQUksR0FHckQsRUFBSyxTQUFTLFdBQ1osR0FBSyxTQUFTLElBQUksTUFDcEIsRUFBSyxTQUFTLElBQUksS0FBSyxLQUFLLFlBQVksRUFBSSxNQUFNLElBQVMsRUFBTSxZQUFVLElBQUssR0FHbEYsUUFBUSxNQUFNLE1BMVNOLEVBQUEsR0FBYSxNQThTN0IsS0FsVGEsR0FBQSxJQUFBLEdBeVRiLFlBQTRELEVBQVksQ0FDdEUsR0FBSSxHQUFPLEVBQUksU0FBVSxDQUN2QixHQUFNLEdBQVEsRUFBSSxXQUNsQixHQUFJLEVBQ0YsTUFBTyxHQUFNLGtCQUpuQixHQUFBLHFCQUFBLHFFQzViQSxHQUFBLElBQUEsS0FBUyxHQUFBLFFBQUEsR0FBQSxRQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsZUFBQSxHQUFBLGVBQ1QsR0FBQSxJQUFBLEtBQVMsR0FBQSxNQUFBLEdBQUEsTUFDVCxHQUFBLElBQUEsS0FBUyxHQUFBLE9BQUEsR0FBQSxPQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsTUFBQSxHQUFBLE1BQ1QsR0FBQSxJQUFBLEtBQVMsR0FBQSxlQUFBLEdBQUEsZUFDVCxHQUFBLElBQUEsS0FBUyxHQUFBLFFBQUEsR0FBQSxRQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsa0JBQUEsR0FBQSxrQkFDVCxHQUFBLElBQUEsS0FBUyxHQUFBLGNBQUEsR0FBQSxjQUNULEdBQUEsSUFBQSxLQUFTLEdBQUEsY0FBQSxHQUFBLGNBQ1QsR0FBQSxJQUFBLEtBQVMsR0FBQSxZQUFBLEdBQUEsWUFDVCxHQUFBLElBQUEsS0FBUyxHQUFBLElBQUEsR0FBQSxNQ1hULGNBT0EsR0FBSSxJQUFlLG1FQUFtRSxNQUFNLElBSzVGLEdBQVEsT0FBUyxTQUFVLEVBQVEsQ0FDakMsR0FBSSxHQUFLLEdBQVUsRUFBUyxHQUFhLE9BQ3ZDLE1BQU8sSUFBYSxHQUV0QixLQUFNLElBQUksV0FBVSw2QkFBK0IsSUFPckQsR0FBUSxPQUFTLFNBQVUsRUFBVSxDQUNuQyxHQUFJLEdBQU8sR0FDUCxFQUFPLEdBRVAsRUFBVSxHQUNWLEVBQVUsSUFFVixFQUFPLEdBQ1AsRUFBTyxHQUVQLEVBQU8sR0FDUCxFQUFRLEdBRVIsRUFBZSxHQUNmLEVBQWUsR0FHbkIsTUFBSSxJQUFRLEdBQVksR0FBWSxFQUMxQixFQUFXLEVBSWpCLEdBQVcsR0FBWSxHQUFZLEVBQzdCLEVBQVcsRUFBVSxFQUkzQixHQUFRLEdBQVksR0FBWSxFQUMxQixFQUFXLEVBQU8sRUFJeEIsR0FBWSxFQUNQLEdBSUwsR0FBWSxFQUNQLEdBSUYsTUNqRVQsY0FxQ0EsR0FBSSxJQUFTLEtBY1QsR0FBaUIsRUFHakIsR0FBVyxHQUFLLEdBR2hCLEdBQWdCLEdBQVcsRUFHM0IsR0FBdUIsR0FRM0IsWUFBcUIsRUFBUSxDQUMzQixNQUFPLEdBQVMsRUFDVixFQUFDLEdBQVcsR0FBSyxFQUNsQixJQUFVLEdBQUssRUFTdEIsWUFBdUIsRUFBUSxDQUM3QixHQUFJLEdBQWMsR0FBUyxLQUFPLEVBQzlCLEVBQVUsR0FBVSxFQUN4QixNQUFPLEdBQ0gsQ0FBQyxFQUNELEVBTU4sR0FBUSxPQUFTLFNBQTBCLEVBQVEsQ0FDakQsR0FBSSxHQUFVLEdBQ1YsRUFFQSxFQUFNLEdBQVksR0FFdEIsRUFDRSxHQUFRLEVBQU0sR0FDZCxLQUFTLEdBQ0wsRUFBTSxHQUdSLElBQVMsSUFFWCxHQUFXLEdBQU8sT0FBTyxTQUNsQixFQUFNLEdBRWYsTUFBTyxJQU9ULEdBQVEsT0FBUyxTQUEwQixFQUFNLEVBQVEsRUFBVyxDQUNsRSxHQUFJLEdBQVMsRUFBSyxPQUNkLEVBQVMsRUFDVCxFQUFRLEVBQ1IsRUFBYyxFQUVsQixFQUFHLENBQ0QsR0FBSSxHQUFVLEVBQ1osS0FBTSxJQUFJLE9BQU0sOENBSWxCLEdBREEsRUFBUSxHQUFPLE9BQU8sRUFBSyxXQUFXLE1BQ2xDLElBQVUsR0FDWixLQUFNLElBQUksT0FBTSx5QkFBMkIsRUFBSyxPQUFPLEVBQVMsSUFHbEUsRUFBZSxDQUFDLENBQUUsR0FBUSxJQUMxQixHQUFTLEdBQ1QsRUFBUyxFQUFVLElBQVMsR0FDNUIsR0FBUyxTQUNGLEdBRVQsRUFBVSxNQUFRLEdBQWMsR0FDaEMsRUFBVSxLQUFPLEtDMUluQixjQWlCQSxZQUFnQixFQUFPLEVBQU8sRUFBZSxDQUMzQyxHQUFJLElBQVMsR0FDWCxNQUFPLEdBQU0sR0FDUixHQUFJLFVBQVUsU0FBVyxFQUM5QixNQUFPLEdBRVAsS0FBTSxJQUFJLE9BQU0sSUFBTSxFQUFRLDZCQUdsQyxHQUFRLE9BQVMsR0FFakIsR0FBSSxJQUFZLGlFQUNaLEdBQWdCLGdCQUVwQixZQUFrQixFQUFNLENBQ3RCLEdBQUksR0FBUSxFQUFLLE1BQU0sSUFDdkIsTUFBSyxHQUdFLENBQ0wsT0FBUSxFQUFNLEdBQ2QsS0FBTSxFQUFNLEdBQ1osS0FBTSxFQUFNLEdBQ1osS0FBTSxFQUFNLEdBQ1osS0FBTSxFQUFNLElBUEwsS0FVWCxHQUFRLFNBQVcsR0FFbkIsWUFBcUIsRUFBWSxDQUMvQixHQUFJLEdBQU0sR0FDVixNQUFJLEdBQVcsUUFDYixJQUFPLEVBQVcsT0FBUyxLQUU3QixHQUFPLEtBQ0gsRUFBVyxNQUNiLElBQU8sRUFBVyxLQUFPLEtBRXZCLEVBQVcsTUFDYixJQUFPLEVBQVcsTUFFaEIsRUFBVyxNQUNiLElBQU8sSUFBTSxFQUFXLE1BRXRCLEVBQVcsTUFDYixJQUFPLEVBQVcsTUFFYixFQUVULEdBQVEsWUFBYyxHQWF0QixZQUFtQixFQUFPLENBQ3hCLEdBQUksR0FBTyxFQUNQLEVBQU0sR0FBUyxHQUNuQixHQUFJLEVBQUssQ0FDUCxHQUFJLENBQUMsRUFBSSxLQUNQLE1BQU8sR0FFVCxFQUFPLEVBQUksS0FLYixPQUhJLEdBQWEsR0FBUSxXQUFXLEdBRWhDLEVBQVEsRUFBSyxNQUFNLE9BQ2QsRUFBTSxFQUFLLEVBQUcsRUFBSSxFQUFNLE9BQVMsRUFBRyxHQUFLLEVBQUcsSUFDbkQsRUFBTyxFQUFNLEdBQ2IsQUFBSSxJQUFTLElBQ1gsRUFBTSxPQUFPLEVBQUcsR0FDWCxBQUFJLElBQVMsS0FDbEIsSUFDUyxFQUFLLEdBQ2QsQ0FBSSxJQUFTLEdBSVgsR0FBTSxPQUFPLEVBQUksRUFBRyxHQUNwQixFQUFLLEdBRUwsR0FBTSxPQUFPLEVBQUcsR0FDaEIsTUFVTixNQU5BLEdBQU8sRUFBTSxLQUFLLEtBRWQsSUFBUyxJQUNYLEdBQU8sRUFBYSxJQUFNLEtBR3hCLEVBQ0YsR0FBSSxLQUFPLEVBQ0osR0FBWSxJQUVkLEVBRVQsR0FBUSxVQUFZLEdBa0JwQixZQUFjLEVBQU8sRUFBTyxDQUMxQixBQUFJLElBQVUsSUFDWixHQUFRLEtBRU4sSUFBVSxJQUNaLEdBQVEsS0FFVixHQUFJLEdBQVcsR0FBUyxHQUNwQixFQUFXLEdBQVMsR0FNeEIsR0FMSSxHQUNGLEdBQVEsRUFBUyxNQUFRLEtBSXZCLEdBQVksQ0FBQyxFQUFTLE9BQ3hCLE1BQUksSUFDRixHQUFTLE9BQVMsRUFBUyxRQUV0QixHQUFZLEdBR3JCLEdBQUksR0FBWSxFQUFNLE1BQU0sSUFDMUIsTUFBTyxHQUlULEdBQUksR0FBWSxDQUFDLEVBQVMsTUFBUSxDQUFDLEVBQVMsS0FDMUMsU0FBUyxLQUFPLEVBQ1QsR0FBWSxHQUdyQixHQUFJLEdBQVMsRUFBTSxPQUFPLEtBQU8sSUFDN0IsRUFDQSxHQUFVLEVBQU0sUUFBUSxPQUFRLElBQU0sSUFBTSxHQUVoRCxNQUFJLEdBQ0YsR0FBUyxLQUFPLEVBQ1QsR0FBWSxJQUVkLEVBRVQsR0FBUSxLQUFPLEdBRWYsR0FBUSxXQUFhLFNBQVUsRUFBTyxDQUNwQyxNQUFPLEdBQU0sT0FBTyxLQUFPLEtBQU8sR0FBVSxLQUFLLElBU25ELFlBQWtCLEVBQU8sRUFBTyxDQUM5QixBQUFJLElBQVUsSUFDWixHQUFRLEtBR1YsRUFBUSxFQUFNLFFBQVEsTUFBTyxJQU83QixPQURJLEdBQVEsRUFDTCxFQUFNLFFBQVEsRUFBUSxPQUFTLEdBQUcsQ0FDdkMsR0FBSSxHQUFRLEVBQU0sWUFBWSxLQVM5QixHQVJJLEVBQVEsR0FPWixHQUFRLEVBQU0sTUFBTSxFQUFHLEdBQ25CLEVBQU0sTUFBTSxzQkFDZCxNQUFPLEdBR1QsRUFBRSxFQUlKLE1BQU8sT0FBTSxFQUFRLEdBQUcsS0FBSyxPQUFTLEVBQU0sT0FBTyxFQUFNLE9BQVMsR0FFcEUsR0FBUSxTQUFXLEdBRW5CLEdBQUksSUFBcUIsVUFBWSxDQUNuQyxHQUFJLEdBQU0sT0FBTyxPQUFPLE1BQ3hCLE1BQU8sQ0FBRSxjQUFlLE9BRzFCLFlBQW1CLEVBQUcsQ0FDcEIsTUFBTyxHQVlULFlBQXFCLEVBQU0sQ0FDekIsTUFBSSxJQUFjLEdBQ1QsSUFBTSxFQUdSLEVBRVQsR0FBUSxZQUFjLEdBQW9CLEdBQVcsR0FFckQsWUFBdUIsRUFBTSxDQUMzQixNQUFJLElBQWMsR0FDVCxFQUFLLE1BQU0sR0FHYixFQUVULEdBQVEsY0FBZ0IsR0FBb0IsR0FBVyxHQUV2RCxZQUF1QixFQUFHLENBQ3hCLEdBQUksQ0FBQyxFQUNILE1BQU8sR0FHVCxHQUFJLEdBQVMsRUFBRSxPQU1mLEdBSkksRUFBUyxHQUlULEVBQUUsV0FBVyxFQUFTLEtBQU8sSUFDN0IsRUFBRSxXQUFXLEVBQVMsS0FBTyxJQUM3QixFQUFFLFdBQVcsRUFBUyxLQUFPLEtBQzdCLEVBQUUsV0FBVyxFQUFTLEtBQU8sS0FDN0IsRUFBRSxXQUFXLEVBQVMsS0FBTyxLQUM3QixFQUFFLFdBQVcsRUFBUyxLQUFPLEtBQzdCLEVBQUUsV0FBVyxFQUFTLEtBQU8sS0FDN0IsRUFBRSxXQUFXLEVBQVMsS0FBTyxJQUM3QixFQUFFLFdBQVcsRUFBUyxLQUFPLEdBQy9CLE1BQU8sR0FHVCxPQUFTLEdBQUksRUFBUyxHQUFJLEdBQUssRUFBRyxJQUNoQyxHQUFJLEVBQUUsV0FBVyxLQUFPLEdBQ3RCLE1BQU8sR0FJWCxNQUFPLEdBV1QsWUFBb0MsRUFBVSxFQUFVLEVBQXFCLENBQzNFLEdBQUksR0FBTSxHQUFPLEVBQVMsT0FBUSxFQUFTLFFBcUIzQyxNQXBCSSxLQUFRLEdBSVosR0FBTSxFQUFTLGFBQWUsRUFBUyxhQUNuQyxJQUFRLElBSVosR0FBTSxFQUFTLGVBQWlCLEVBQVMsZUFDckMsSUFBUSxHQUFLLElBSWpCLEdBQU0sRUFBUyxnQkFBa0IsRUFBUyxnQkFDdEMsSUFBUSxJQUlaLEdBQU0sRUFBUyxjQUFnQixFQUFTLGNBQ3BDLElBQVEsR0FDSCxFQUdGLEdBQU8sRUFBUyxLQUFNLEVBQVMsTUFFeEMsR0FBUSwyQkFBNkIsR0FXckMsWUFBNkMsRUFBVSxFQUFVLEVBQXNCLENBQ3JGLEdBQUksR0FBTSxFQUFTLGNBQWdCLEVBQVMsY0FxQjVDLE1BcEJJLEtBQVEsR0FJWixHQUFNLEVBQVMsZ0JBQWtCLEVBQVMsZ0JBQ3RDLElBQVEsR0FBSyxJQUlqQixHQUFNLEdBQU8sRUFBUyxPQUFRLEVBQVMsUUFDbkMsSUFBUSxJQUlaLEdBQU0sRUFBUyxhQUFlLEVBQVMsYUFDbkMsSUFBUSxJQUlaLEdBQU0sRUFBUyxlQUFpQixFQUFTLGVBQ3JDLElBQVEsR0FDSCxFQUdGLEdBQU8sRUFBUyxLQUFNLEVBQVMsTUFFeEMsR0FBUSxvQ0FBc0MsR0FFOUMsWUFBZ0IsRUFBTyxFQUFPLENBQzVCLE1BQUksS0FBVSxFQUNMLEVBR0wsSUFBVSxLQUNMLEVBR0wsSUFBVSxLQUNMLEdBR0wsRUFBUSxFQUNILEVBR0YsR0FPVCxZQUE2QyxFQUFVLEVBQVUsQ0FDL0QsR0FBSSxHQUFNLEVBQVMsY0FBZ0IsRUFBUyxjQXFCNUMsTUFwQkksS0FBUSxHQUlaLEdBQU0sRUFBUyxnQkFBa0IsRUFBUyxnQkFDdEMsSUFBUSxJQUlaLEdBQU0sR0FBTyxFQUFTLE9BQVEsRUFBUyxRQUNuQyxJQUFRLElBSVosR0FBTSxFQUFTLGFBQWUsRUFBUyxhQUNuQyxJQUFRLElBSVosR0FBTSxFQUFTLGVBQWlCLEVBQVMsZUFDckMsSUFBUSxHQUNILEVBR0YsR0FBTyxFQUFTLEtBQU0sRUFBUyxNQUV4QyxHQUFRLG9DQUFzQyxHQU85QyxZQUE2QixFQUFLLENBQ2hDLE1BQU8sTUFBSyxNQUFNLEVBQUksUUFBUSxpQkFBa0IsS0FFbEQsR0FBUSxvQkFBc0IsR0FNOUIsWUFBMEIsRUFBWSxFQUFXLEVBQWMsQ0E4QjdELEdBN0JBLEVBQVksR0FBYSxHQUVyQixHQUVFLEdBQVcsRUFBVyxPQUFTLEtBQU8sS0FBTyxFQUFVLEtBQU8sS0FDaEUsSUFBYyxLQU9oQixFQUFZLEVBQWEsR0FpQnZCLEVBQWMsQ0FDaEIsR0FBSSxHQUFTLEdBQVMsR0FDdEIsR0FBSSxDQUFDLEVBQ0gsS0FBTSxJQUFJLE9BQU0sb0NBRWxCLEdBQUksRUFBTyxLQUFNLENBRWYsR0FBSSxHQUFRLEVBQU8sS0FBSyxZQUFZLEtBQ3BDLEFBQUksR0FBUyxHQUNYLEdBQU8sS0FBTyxFQUFPLEtBQUssVUFBVSxFQUFHLEVBQVEsSUFHbkQsRUFBWSxHQUFLLEdBQVksR0FBUyxHQUd4QyxNQUFPLElBQVUsR0FFbkIsR0FBUSxpQkFBbUIsS0N2ZTNCLGNBT0EsR0FBSSxJQUFPLEtBQ1AsR0FBTSxPQUFPLFVBQVUsZUFDdkIsR0FBZSxNQUFPLE1BQVEsWUFRbEMsYUFBb0IsQ0FDbEIsS0FBSyxPQUFTLEdBQ2QsS0FBSyxLQUFPLEdBQWUsR0FBSSxLQUFRLE9BQU8sT0FBTyxNQU12RCxHQUFTLFVBQVksU0FBNEIsRUFBUSxFQUFrQixDQUV6RSxPQURJLEdBQU0sR0FBSSxJQUNMLEVBQUksRUFBRyxFQUFNLEVBQU8sT0FBUSxFQUFJLEVBQUssSUFDNUMsRUFBSSxJQUFJLEVBQU8sR0FBSSxHQUVyQixNQUFPLElBU1QsR0FBUyxVQUFVLEtBQU8sVUFBeUIsQ0FDakQsTUFBTyxJQUFlLEtBQUssS0FBSyxLQUFPLE9BQU8sb0JBQW9CLEtBQUssTUFBTSxRQVEvRSxHQUFTLFVBQVUsSUFBTSxTQUFzQixFQUFNLEVBQWtCLENBQ3JFLEdBQUksR0FBTyxHQUFlLEVBQU8sR0FBSyxZQUFZLEdBQzlDLEVBQWMsR0FBZSxLQUFLLElBQUksR0FBUSxHQUFJLEtBQUssS0FBSyxLQUFNLEdBQ2xFLEVBQU0sS0FBSyxPQUFPLE9BQ3RCLEFBQUksRUFBQyxHQUFlLElBQ2xCLEtBQUssT0FBTyxLQUFLLEdBRWQsR0FDSCxDQUFJLEdBQ0YsS0FBSyxLQUFLLElBQUksRUFBTSxHQUVwQixLQUFLLEtBQUssR0FBUSxJQVV4QixHQUFTLFVBQVUsSUFBTSxTQUFzQixFQUFNLENBQ25ELEdBQUksR0FDRixNQUFPLE1BQUssS0FBSyxJQUFJLEdBRXJCLEdBQUksR0FBTyxHQUFLLFlBQVksR0FDNUIsTUFBTyxJQUFJLEtBQUssS0FBSyxLQUFNLElBUy9CLEdBQVMsVUFBVSxRQUFVLFNBQTBCLEVBQU0sQ0FDM0QsR0FBSSxHQUFjLENBQ2hCLEdBQUksR0FBTSxLQUFLLEtBQUssSUFBSSxHQUN4QixHQUFJLEdBQU8sRUFDUCxNQUFPLE9BRU4sQ0FDTCxHQUFJLEdBQU8sR0FBSyxZQUFZLEdBQzVCLEdBQUksR0FBSSxLQUFLLEtBQUssS0FBTSxHQUN0QixNQUFPLE1BQUssS0FBSyxHQUlyQixLQUFNLElBQUksT0FBTSxJQUFNLEVBQU8seUJBUS9CLEdBQVMsVUFBVSxHQUFLLFNBQXFCLEVBQU0sQ0FDakQsR0FBSSxHQUFRLEdBQUssRUFBTyxLQUFLLE9BQU8sT0FDbEMsTUFBTyxNQUFLLE9BQU8sR0FFckIsS0FBTSxJQUFJLE9BQU0seUJBQTJCLElBUTdDLEdBQVMsVUFBVSxRQUFVLFVBQTRCLENBQ3ZELE1BQU8sTUFBSyxPQUFPLFNBR3JCLEdBQVEsU0FBVyxLQ3hIbkIsY0FPQSxHQUFJLElBQU8sS0FNWCxZQUFnQyxFQUFVLEVBQVUsQ0FFbEQsR0FBSSxHQUFRLEVBQVMsY0FDakIsRUFBUSxFQUFTLGNBQ2pCLEVBQVUsRUFBUyxnQkFDbkIsRUFBVSxFQUFTLGdCQUN2QixNQUFPLEdBQVEsR0FBUyxHQUFTLEdBQVMsR0FBVyxHQUM5QyxHQUFLLG9DQUFvQyxFQUFVLElBQWEsRUFRekUsYUFBdUIsQ0FDckIsS0FBSyxPQUFTLEdBQ2QsS0FBSyxRQUFVLEdBRWYsS0FBSyxNQUFRLENBQUMsY0FBZSxHQUFJLGdCQUFpQixHQVNwRCxHQUFZLFVBQVUsZ0JBQ3BCLFNBQTZCLEVBQVcsRUFBVSxDQUNoRCxLQUFLLE9BQU8sUUFBUSxFQUFXLElBUW5DLEdBQVksVUFBVSxJQUFNLFNBQXlCLEVBQVUsQ0FDN0QsQUFBSSxHQUF1QixLQUFLLE1BQU8sR0FDckMsTUFBSyxNQUFRLEVBQ2IsS0FBSyxPQUFPLEtBQUssSUFFakIsTUFBSyxRQUFVLEdBQ2YsS0FBSyxPQUFPLEtBQUssS0FhckIsR0FBWSxVQUFVLFFBQVUsVUFBK0IsQ0FDN0QsTUFBSyxNQUFLLFNBQ1IsTUFBSyxPQUFPLEtBQUssR0FBSyxxQ0FDdEIsS0FBSyxRQUFVLElBRVYsS0FBSyxRQUdkLEdBQVEsWUFBYyxLQzlFdEIsY0FPQSxHQUFJLElBQVksS0FDWixHQUFPLEtBQ1AsR0FBVyxLQUF1QixTQUNsQyxHQUFjLEtBQTBCLFlBVTVDLFlBQTRCLEVBQU8sQ0FDakMsQUFBSyxHQUNILEdBQVEsSUFFVixLQUFLLE1BQVEsR0FBSyxPQUFPLEVBQU8sT0FBUSxNQUN4QyxLQUFLLFlBQWMsR0FBSyxPQUFPLEVBQU8sYUFBYyxNQUNwRCxLQUFLLGdCQUFrQixHQUFLLE9BQU8sRUFBTyxpQkFBa0IsSUFDNUQsS0FBSyxTQUFXLEdBQUksSUFDcEIsS0FBSyxPQUFTLEdBQUksSUFDbEIsS0FBSyxVQUFZLEdBQUksSUFDckIsS0FBSyxpQkFBbUIsS0FHMUIsR0FBbUIsVUFBVSxTQUFXLEVBT3hDLEdBQW1CLGNBQ2pCLFNBQTBDLEVBQW9CLENBQzVELEdBQUksR0FBYSxFQUFtQixXQUNoQyxFQUFZLEdBQUksSUFBbUIsQ0FDckMsS0FBTSxFQUFtQixLQUN6QixXQUFZLElBRWQsU0FBbUIsWUFBWSxTQUFVLEVBQVMsQ0FDaEQsR0FBSSxHQUFhLENBQ2YsVUFBVyxDQUNULEtBQU0sRUFBUSxjQUNkLE9BQVEsRUFBUSxrQkFJcEIsQUFBSSxFQUFRLFFBQVUsTUFDcEIsR0FBVyxPQUFTLEVBQVEsT0FDeEIsR0FBYyxNQUNoQixHQUFXLE9BQVMsR0FBSyxTQUFTLEVBQVksRUFBVyxTQUczRCxFQUFXLFNBQVcsQ0FDcEIsS0FBTSxFQUFRLGFBQ2QsT0FBUSxFQUFRLGdCQUdkLEVBQVEsTUFBUSxNQUNsQixHQUFXLEtBQU8sRUFBUSxPQUk5QixFQUFVLFdBQVcsS0FFdkIsRUFBbUIsUUFBUSxRQUFRLFNBQVUsRUFBWSxDQUN2RCxHQUFJLEdBQWlCLEVBQ3JCLEFBQUksSUFBZSxNQUNqQixHQUFpQixHQUFLLFNBQVMsRUFBWSxJQUd4QyxFQUFVLFNBQVMsSUFBSSxJQUMxQixFQUFVLFNBQVMsSUFBSSxHQUd6QixHQUFJLEdBQVUsRUFBbUIsaUJBQWlCLEdBQ2xELEFBQUksR0FBVyxNQUNiLEVBQVUsaUJBQWlCLEVBQVksS0FHcEMsR0FhWCxHQUFtQixVQUFVLFdBQzNCLFNBQXVDLEVBQU8sQ0FDNUMsR0FBSSxHQUFZLEdBQUssT0FBTyxFQUFPLGFBQy9CLEVBQVcsR0FBSyxPQUFPLEVBQU8sV0FBWSxNQUMxQyxFQUFTLEdBQUssT0FBTyxFQUFPLFNBQVUsTUFDdEMsRUFBTyxHQUFLLE9BQU8sRUFBTyxPQUFRLE1BRXRDLEFBQUssS0FBSyxpQkFDUixLQUFLLGlCQUFpQixFQUFXLEVBQVUsRUFBUSxHQUdqRCxHQUFVLE1BQ1osR0FBUyxPQUFPLEdBQ1gsS0FBSyxTQUFTLElBQUksSUFDckIsS0FBSyxTQUFTLElBQUksSUFJbEIsR0FBUSxNQUNWLEdBQU8sT0FBTyxHQUNULEtBQUssT0FBTyxJQUFJLElBQ25CLEtBQUssT0FBTyxJQUFJLElBSXBCLEtBQUssVUFBVSxJQUFJLENBQ2pCLGNBQWUsRUFBVSxLQUN6QixnQkFBaUIsRUFBVSxPQUMzQixhQUFjLEdBQVksTUFBUSxFQUFTLEtBQzNDLGVBQWdCLEdBQVksTUFBUSxFQUFTLE9BQzdDLE9BQVEsRUFDUixLQUFNLEtBT1osR0FBbUIsVUFBVSxpQkFDM0IsU0FBNkMsRUFBYSxFQUFnQixDQUN4RSxHQUFJLEdBQVMsRUFDYixBQUFJLEtBQUssYUFBZSxNQUN0QixHQUFTLEdBQUssU0FBUyxLQUFLLFlBQWEsSUFHM0MsQUFBSSxHQUFrQixLQUdmLE1BQUssa0JBQ1IsTUFBSyxpQkFBbUIsT0FBTyxPQUFPLE9BRXhDLEtBQUssaUJBQWlCLEdBQUssWUFBWSxJQUFXLEdBQ3pDLEtBQUssa0JBR2QsT0FBTyxNQUFLLGlCQUFpQixHQUFLLFlBQVksSUFDMUMsT0FBTyxLQUFLLEtBQUssa0JBQWtCLFNBQVcsR0FDaEQsTUFBSyxpQkFBbUIsUUFxQmhDLEdBQW1CLFVBQVUsZUFDM0IsU0FBMkMsRUFBb0IsRUFBYSxFQUFnQixDQUMxRixHQUFJLEdBQWEsRUFFakIsR0FBSSxHQUFlLEtBQU0sQ0FDdkIsR0FBSSxFQUFtQixNQUFRLEtBQzdCLEtBQU0sSUFBSSxPQUNSLGdKQUlKLEVBQWEsRUFBbUIsS0FFbEMsR0FBSSxHQUFhLEtBQUssWUFFdEIsQUFBSSxHQUFjLE1BQ2hCLEdBQWEsR0FBSyxTQUFTLEVBQVksSUFJekMsR0FBSSxHQUFhLEdBQUksSUFDakIsRUFBVyxHQUFJLElBR25CLEtBQUssVUFBVSxnQkFBZ0IsU0FBVSxFQUFTLENBQ2hELEdBQUksRUFBUSxTQUFXLEdBQWMsRUFBUSxjQUFnQixLQUFNLENBRWpFLEdBQUksR0FBVyxFQUFtQixvQkFBb0IsQ0FDcEQsS0FBTSxFQUFRLGFBQ2QsT0FBUSxFQUFRLGlCQUVsQixBQUFJLEVBQVMsUUFBVSxNQUVyQixHQUFRLE9BQVMsRUFBUyxPQUN0QixHQUFrQixNQUNwQixHQUFRLE9BQVMsR0FBSyxLQUFLLEVBQWdCLEVBQVEsU0FFakQsR0FBYyxNQUNoQixHQUFRLE9BQVMsR0FBSyxTQUFTLEVBQVksRUFBUSxTQUVyRCxFQUFRLGFBQWUsRUFBUyxLQUNoQyxFQUFRLGVBQWlCLEVBQVMsT0FDOUIsRUFBUyxNQUFRLE1BQ25CLEdBQVEsS0FBTyxFQUFTLE9BSzlCLEdBQUksR0FBUyxFQUFRLE9BQ3JCLEFBQUksR0FBVSxNQUFRLENBQUMsRUFBVyxJQUFJLElBQ3BDLEVBQVcsSUFBSSxHQUdqQixHQUFJLEdBQU8sRUFBUSxLQUNuQixBQUFJLEdBQVEsTUFBUSxDQUFDLEVBQVMsSUFBSSxJQUNoQyxFQUFTLElBQUksSUFHZCxNQUNILEtBQUssU0FBVyxFQUNoQixLQUFLLE9BQVMsRUFHZCxFQUFtQixRQUFRLFFBQVEsU0FBVSxFQUFZLENBQ3ZELEdBQUksR0FBVSxFQUFtQixpQkFBaUIsR0FDbEQsQUFBSSxHQUFXLE1BQ1QsSUFBa0IsTUFDcEIsR0FBYSxHQUFLLEtBQUssRUFBZ0IsSUFFckMsR0FBYyxNQUNoQixHQUFhLEdBQUssU0FBUyxFQUFZLElBRXpDLEtBQUssaUJBQWlCLEVBQVksS0FFbkMsT0FjUCxHQUFtQixVQUFVLGlCQUMzQixTQUE0QyxFQUFZLEVBQVcsRUFDdkIsRUFBTyxDQUtqRCxHQUFJLEdBQWEsTUFBTyxHQUFVLE1BQVMsVUFBWSxNQUFPLEdBQVUsUUFBVyxTQUMvRSxLQUFNLElBQUksT0FDTixnUEFNUixHQUFJLEtBQWMsUUFBVSxJQUFjLFVBQVksSUFDL0MsRUFBVyxLQUFPLEdBQUssRUFBVyxRQUFVLEdBQzVDLENBQUMsR0FBYSxDQUFDLEdBQVcsQ0FBQyxHQUk3QixJQUFJLEdBQWMsUUFBVSxJQUFjLFVBQVksSUFDL0MsR0FBYSxRQUFVLElBQWEsVUFBWSxJQUNoRCxFQUFXLEtBQU8sR0FBSyxFQUFXLFFBQVUsR0FDNUMsRUFBVSxLQUFPLEdBQUssRUFBVSxRQUFVLEdBQzFDLEVBRVYsT0FHQSxLQUFNLElBQUksT0FBTSxvQkFBc0IsS0FBSyxVQUFVLENBQ25ELFVBQVcsRUFDWCxPQUFRLEVBQ1IsU0FBVSxFQUNWLEtBQU0sT0FTZCxHQUFtQixVQUFVLG1CQUMzQixVQUFnRCxDQWM5QyxPQWJJLEdBQTBCLEVBQzFCLEVBQXdCLEVBQ3hCLEVBQXlCLEVBQ3pCLEVBQXVCLEVBQ3ZCLEVBQWUsRUFDZixFQUFpQixFQUNqQixFQUFTLEdBQ1QsRUFDQSxFQUNBLEVBQ0EsRUFFQSxFQUFXLEtBQUssVUFBVSxVQUNyQixFQUFJLEVBQUcsRUFBTSxFQUFTLE9BQVEsRUFBSSxFQUFLLElBQUssQ0FJbkQsR0FIQSxFQUFVLEVBQVMsR0FDbkIsRUFBTyxHQUVILEVBQVEsZ0JBQWtCLEVBRTVCLElBREEsRUFBMEIsRUFDbkIsRUFBUSxnQkFBa0IsR0FDL0IsR0FBUSxJQUNSLFlBSUUsRUFBSSxFQUFHLENBQ1QsR0FBSSxDQUFDLEdBQUssb0NBQW9DLEVBQVMsRUFBUyxFQUFJLElBQ2xFLFNBRUYsR0FBUSxJQUlaLEdBQVEsR0FBVSxPQUFPLEVBQVEsZ0JBQ0osR0FDN0IsRUFBMEIsRUFBUSxnQkFFOUIsRUFBUSxRQUFVLE1BQ3BCLEdBQVksS0FBSyxTQUFTLFFBQVEsRUFBUSxRQUMxQyxHQUFRLEdBQVUsT0FBTyxFQUFZLEdBQ3JDLEVBQWlCLEVBR2pCLEdBQVEsR0FBVSxPQUFPLEVBQVEsYUFBZSxFQUNuQixHQUM3QixFQUF1QixFQUFRLGFBQWUsRUFFOUMsR0FBUSxHQUFVLE9BQU8sRUFBUSxlQUNKLEdBQzdCLEVBQXlCLEVBQVEsZUFFN0IsRUFBUSxNQUFRLE1BQ2xCLEdBQVUsS0FBSyxPQUFPLFFBQVEsRUFBUSxNQUN0QyxHQUFRLEdBQVUsT0FBTyxFQUFVLEdBQ25DLEVBQWUsSUFJbkIsR0FBVSxFQUdaLE1BQU8sSUFHWCxHQUFtQixVQUFVLHdCQUMzQixTQUFtRCxFQUFVLEVBQWEsQ0FDeEUsTUFBTyxHQUFTLElBQUksU0FBVSxFQUFRLENBQ3BDLEdBQUksQ0FBQyxLQUFLLGlCQUNSLE1BQU8sTUFFVCxBQUFJLEdBQWUsTUFDakIsR0FBUyxHQUFLLFNBQVMsRUFBYSxJQUV0QyxHQUFJLEdBQU0sR0FBSyxZQUFZLEdBQzNCLE1BQU8sUUFBTyxVQUFVLGVBQWUsS0FBSyxLQUFLLGlCQUFrQixHQUMvRCxLQUFLLGlCQUFpQixHQUN0QixNQUNILE9BTVAsR0FBbUIsVUFBVSxPQUMzQixVQUFxQyxDQUNuQyxHQUFJLEdBQU0sQ0FDUixRQUFTLEtBQUssU0FDZCxRQUFTLEtBQUssU0FBUyxVQUN2QixNQUFPLEtBQUssT0FBTyxVQUNuQixTQUFVLEtBQUssc0JBRWpCLE1BQUksTUFBSyxPQUFTLE1BQ2hCLEdBQUksS0FBTyxLQUFLLE9BRWQsS0FBSyxhQUFlLE1BQ3RCLEdBQUksV0FBYSxLQUFLLGFBRXBCLEtBQUssa0JBQ1AsR0FBSSxlQUFpQixLQUFLLHdCQUF3QixFQUFJLFFBQVMsRUFBSSxhQUc5RCxHQU1YLEdBQW1CLFVBQVUsU0FDM0IsVUFBdUMsQ0FDckMsTUFBTyxNQUFLLFVBQVUsS0FBSyxXQUcvQixHQUFRLG1CQUFxQixLQ3hhN0IsY0FPQSxHQUFRLHFCQUF1QixFQUMvQixHQUFRLGtCQUFvQixFQWU1QixZQUF5QixFQUFNLEVBQU8sRUFBUyxFQUFXLEVBQVUsRUFBTyxDQVV6RSxHQUFJLEdBQU0sS0FBSyxNQUFPLEdBQVEsR0FBUSxHQUFLLEVBQ3ZDLEVBQU0sRUFBUyxFQUFTLEVBQVUsR0FBTSxJQUM1QyxNQUFJLEtBQVEsRUFFSCxFQUVBLEVBQU0sRUFFVCxFQUFRLEVBQU0sRUFFVCxHQUFnQixFQUFLLEVBQU8sRUFBUyxFQUFXLEVBQVUsR0FLL0QsR0FBUyxHQUFRLGtCQUNaLEVBQVEsRUFBVSxPQUFTLEVBQVEsR0FFbkMsRUFLTCxFQUFNLEVBQU8sRUFFUixHQUFnQixFQUFNLEVBQUssRUFBUyxFQUFXLEVBQVUsR0FJOUQsR0FBUyxHQUFRLGtCQUNaLEVBRUEsRUFBTyxFQUFJLEdBQUssRUF1QjdCLEdBQVEsT0FBUyxTQUFnQixFQUFTLEVBQVcsRUFBVSxFQUFPLENBQ3BFLEdBQUksRUFBVSxTQUFXLEVBQ3ZCLE1BQU8sR0FHVCxHQUFJLEdBQVEsR0FBZ0IsR0FBSSxFQUFVLE9BQVEsRUFBUyxFQUMvQixFQUFVLEdBQVMsR0FBUSxzQkFDdkQsR0FBSSxFQUFRLEVBQ1YsTUFBTyxHQU1ULEtBQU8sRUFBUSxHQUFLLEdBQ2QsRUFBUyxFQUFVLEdBQVEsRUFBVSxFQUFRLEdBQUksTUFBVSxHQUcvRCxFQUFFLEVBR0osTUFBTyxNQzdHVCxjQTJCQSxZQUFjLEVBQUssRUFBRyxFQUFHLENBQ3ZCLEdBQUksR0FBTyxFQUFJLEdBQ2YsRUFBSSxHQUFLLEVBQUksR0FDYixFQUFJLEdBQUssRUFXWCxZQUEwQixFQUFLLEVBQU0sQ0FDbkMsTUFBTyxNQUFLLE1BQU0sRUFBTyxLQUFLLFNBQVksR0FBTyxJQWVuRCxZQUFxQixFQUFLLEVBQVksRUFBRyxFQUFHLENBSzFDLEdBQUksRUFBSSxFQUFHLENBWVQsR0FBSSxHQUFhLEdBQWlCLEVBQUcsR0FDakMsRUFBSSxFQUFJLEVBRVosR0FBSyxFQUFLLEVBQVksR0FTdEIsT0FSSSxHQUFRLEVBQUksR0FRUCxFQUFJLEVBQUcsRUFBSSxFQUFHLElBQ3JCLEFBQUksRUFBVyxFQUFJLEdBQUksSUFBVSxHQUMvQixJQUFLLEVBQ0wsR0FBSyxFQUFLLEVBQUcsSUFJakIsR0FBSyxFQUFLLEVBQUksRUFBRyxHQUNqQixHQUFJLEdBQUksRUFBSSxFQUlaLEdBQVksRUFBSyxFQUFZLEVBQUcsRUFBSSxHQUNwQyxHQUFZLEVBQUssRUFBWSxFQUFJLEVBQUcsSUFZeEMsR0FBUSxVQUFZLFNBQVUsRUFBSyxFQUFZLENBQzdDLEdBQVksRUFBSyxFQUFZLEVBQUcsRUFBSSxPQUFTLE1DaEgvQyxjQU9BLEdBQUksR0FBTyxLQUNQLEdBQWUsS0FDZixHQUFXLEtBQXVCLFNBQ2xDLEdBQVksS0FDWixHQUFZLEtBQXdCLFVBRXhDLFdBQTJCLEVBQVksRUFBZSxDQUNwRCxHQUFJLEdBQVksRUFDaEIsTUFBSSxPQUFPLElBQWUsVUFDeEIsR0FBWSxFQUFLLG9CQUFvQixJQUdoQyxFQUFVLFVBQVksS0FDekIsR0FBSSxJQUF5QixFQUFXLEdBQ3hDLEdBQUksSUFBdUIsRUFBVyxHQUc1QyxFQUFrQixjQUFnQixTQUFTLEVBQVksRUFBZSxDQUNwRSxNQUFPLElBQXVCLGNBQWMsRUFBWSxJQU0xRCxFQUFrQixVQUFVLFNBQVcsRUFnQ3ZDLEVBQWtCLFVBQVUsb0JBQXNCLEtBQ2xELE9BQU8sZUFBZSxFQUFrQixVQUFXLHFCQUFzQixDQUN2RSxhQUFjLEdBQ2QsV0FBWSxHQUNaLElBQUssVUFBWSxDQUNmLE1BQUssTUFBSyxxQkFDUixLQUFLLGVBQWUsS0FBSyxVQUFXLEtBQUssWUFHcEMsS0FBSyx1QkFJaEIsRUFBa0IsVUFBVSxtQkFBcUIsS0FDakQsT0FBTyxlQUFlLEVBQWtCLFVBQVcsb0JBQXFCLENBQ3RFLGFBQWMsR0FDZCxXQUFZLEdBQ1osSUFBSyxVQUFZLENBQ2YsTUFBSyxNQUFLLG9CQUNSLEtBQUssZUFBZSxLQUFLLFVBQVcsS0FBSyxZQUdwQyxLQUFLLHNCQUloQixFQUFrQixVQUFVLHdCQUMxQixTQUFrRCxFQUFNLEVBQU8sQ0FDN0QsR0FBSSxHQUFJLEVBQUssT0FBTyxHQUNwQixNQUFPLEtBQU0sS0FBTyxJQUFNLEtBUTlCLEVBQWtCLFVBQVUsZUFDMUIsU0FBeUMsRUFBTSxFQUFhLENBQzFELEtBQU0sSUFBSSxPQUFNLDZDQUdwQixFQUFrQixnQkFBa0IsRUFDcEMsRUFBa0IsZUFBaUIsRUFFbkMsRUFBa0IscUJBQXVCLEVBQ3pDLEVBQWtCLGtCQUFvQixFQWtCdEMsRUFBa0IsVUFBVSxZQUMxQixTQUF1QyxFQUFXLEVBQVUsRUFBUSxDQUNsRSxHQUFJLEdBQVUsR0FBWSxLQUN0QixFQUFRLEdBQVUsRUFBa0IsZ0JBRXBDLEVBQ0osT0FBUSxPQUNILEdBQWtCLGdCQUNyQixFQUFXLEtBQUssbUJBQ2hCLFVBQ0csR0FBa0IsZUFDckIsRUFBVyxLQUFLLGtCQUNoQixjQUVBLEtBQU0sSUFBSSxPQUFNLCtCQUdsQixHQUFJLEdBQWEsS0FBSyxXQUN0QixFQUFTLElBQUksU0FBVSxFQUFTLENBQzlCLEdBQUksR0FBUyxFQUFRLFNBQVcsS0FBTyxLQUFPLEtBQUssU0FBUyxHQUFHLEVBQVEsUUFDdkUsU0FBUyxFQUFLLGlCQUFpQixFQUFZLEVBQVEsS0FBSyxlQUNqRCxDQUNMLE9BQVEsRUFDUixjQUFlLEVBQVEsY0FDdkIsZ0JBQWlCLEVBQVEsZ0JBQ3pCLGFBQWMsRUFBUSxhQUN0QixlQUFnQixFQUFRLGVBQ3hCLEtBQU0sRUFBUSxPQUFTLEtBQU8sS0FBTyxLQUFLLE9BQU8sR0FBRyxFQUFRLFFBRTdELE1BQU0sUUFBUSxFQUFXLElBeUJoQyxFQUFrQixVQUFVLHlCQUMxQixTQUFvRCxFQUFPLENBQ3pELEdBQUksR0FBTyxFQUFLLE9BQU8sRUFBTyxRQU0xQixFQUFTLENBQ1gsT0FBUSxFQUFLLE9BQU8sRUFBTyxVQUMzQixhQUFjLEVBQ2QsZUFBZ0IsRUFBSyxPQUFPLEVBQU8sU0FBVSxJQUkvQyxHQURBLEVBQU8sT0FBUyxLQUFLLGlCQUFpQixFQUFPLFFBQ3pDLEVBQU8sT0FBUyxFQUNsQixNQUFPLEdBR1QsR0FBSSxHQUFXLEdBRVgsRUFBUSxLQUFLLGFBQWEsRUFDQSxLQUFLLGtCQUNMLGVBQ0EsaUJBQ0EsRUFBSywyQkFDTCxHQUFhLG1CQUMzQyxHQUFJLEdBQVMsRUFBRyxDQUNkLEdBQUksR0FBVSxLQUFLLGtCQUFrQixHQUVyQyxHQUFJLEVBQU0sU0FBVyxPQU9uQixPQU5JLEdBQWUsRUFBUSxhQU1wQixHQUFXLEVBQVEsZUFBaUIsR0FDekMsRUFBUyxLQUFLLENBQ1osS0FBTSxFQUFLLE9BQU8sRUFBUyxnQkFBaUIsTUFDNUMsT0FBUSxFQUFLLE9BQU8sRUFBUyxrQkFBbUIsTUFDaEQsV0FBWSxFQUFLLE9BQU8sRUFBUyxzQkFBdUIsUUFHMUQsRUFBVSxLQUFLLGtCQUFrQixFQUFFLE9BU3JDLFFBTkksR0FBaUIsRUFBUSxlQU10QixHQUNBLEVBQVEsZUFBaUIsR0FDekIsRUFBUSxnQkFBa0IsR0FDL0IsRUFBUyxLQUFLLENBQ1osS0FBTSxFQUFLLE9BQU8sRUFBUyxnQkFBaUIsTUFDNUMsT0FBUSxFQUFLLE9BQU8sRUFBUyxrQkFBbUIsTUFDaEQsV0FBWSxFQUFLLE9BQU8sRUFBUyxzQkFBdUIsUUFHMUQsRUFBVSxLQUFLLGtCQUFrQixFQUFFLEdBS3pDLE1BQU8sSUFHWCxHQUFRLGtCQUFvQixFQW9DNUIsWUFBZ0MsRUFBWSxFQUFlLENBQ3pELEdBQUksR0FBWSxFQUNoQixBQUFJLE1BQU8sSUFBZSxVQUN4QixHQUFZLEVBQUssb0JBQW9CLElBR3ZDLEdBQUksR0FBVSxFQUFLLE9BQU8sRUFBVyxXQUNqQyxFQUFVLEVBQUssT0FBTyxFQUFXLFdBR2pDLEVBQVEsRUFBSyxPQUFPLEVBQVcsUUFBUyxJQUN4QyxFQUFhLEVBQUssT0FBTyxFQUFXLGFBQWMsTUFDbEQsRUFBaUIsRUFBSyxPQUFPLEVBQVcsaUJBQWtCLE1BQzFELEVBQVcsRUFBSyxPQUFPLEVBQVcsWUFDbEMsRUFBTyxFQUFLLE9BQU8sRUFBVyxPQUFRLE1BSTFDLEdBQUksR0FBVyxLQUFLLFNBQ2xCLEtBQU0sSUFBSSxPQUFNLHdCQUEwQixHQUc1QyxBQUFJLEdBQ0YsR0FBYSxFQUFLLFVBQVUsSUFHOUIsRUFBVSxFQUNQLElBQUksUUFJSixJQUFJLEVBQUssV0FLVCxJQUFJLFNBQVUsRUFBUSxDQUNyQixNQUFPLElBQWMsRUFBSyxXQUFXLElBQWUsRUFBSyxXQUFXLEdBQ2hFLEVBQUssU0FBUyxFQUFZLEdBQzFCLElBT1IsS0FBSyxPQUFTLEdBQVMsVUFBVSxFQUFNLElBQUksUUFBUyxJQUNwRCxLQUFLLFNBQVcsR0FBUyxVQUFVLEVBQVMsSUFFNUMsS0FBSyxpQkFBbUIsS0FBSyxTQUFTLFVBQVUsSUFBSSxTQUFVLEVBQUcsQ0FDL0QsTUFBTyxHQUFLLGlCQUFpQixFQUFZLEVBQUcsS0FHOUMsS0FBSyxXQUFhLEVBQ2xCLEtBQUssZUFBaUIsRUFDdEIsS0FBSyxVQUFZLEVBQ2pCLEtBQUssY0FBZ0IsRUFDckIsS0FBSyxLQUFPLEVBR2QsR0FBdUIsVUFBWSxPQUFPLE9BQU8sRUFBa0IsV0FDbkUsR0FBdUIsVUFBVSxTQUFXLEVBTTVDLEdBQXVCLFVBQVUsaUJBQW1CLFNBQVMsRUFBUyxDQUNwRSxHQUFJLEdBQWlCLEVBS3JCLEdBSkksS0FBSyxZQUFjLE1BQ3JCLEdBQWlCLEVBQUssU0FBUyxLQUFLLFdBQVksSUFHOUMsS0FBSyxTQUFTLElBQUksR0FDcEIsTUFBTyxNQUFLLFNBQVMsUUFBUSxHQUsvQixHQUFJLEdBQ0osSUFBSyxFQUFJLEVBQUcsRUFBSSxLQUFLLGlCQUFpQixPQUFRLEVBQUUsRUFDOUMsR0FBSSxLQUFLLGlCQUFpQixJQUFNLEVBQzlCLE1BQU8sR0FJWCxNQUFPLElBWVQsR0FBdUIsY0FDckIsU0FBeUMsRUFBWSxFQUFlLENBQ2xFLEdBQUksR0FBTSxPQUFPLE9BQU8sR0FBdUIsV0FFM0MsRUFBUSxFQUFJLE9BQVMsR0FBUyxVQUFVLEVBQVcsT0FBTyxVQUFXLElBQ3JFLEVBQVUsRUFBSSxTQUFXLEdBQVMsVUFBVSxFQUFXLFNBQVMsVUFBVyxJQUMvRSxFQUFJLFdBQWEsRUFBVyxZQUM1QixFQUFJLGVBQWlCLEVBQVcsd0JBQXdCLEVBQUksU0FBUyxVQUNiLEVBQUksWUFDNUQsRUFBSSxLQUFPLEVBQVcsTUFDdEIsRUFBSSxjQUFnQixFQUNwQixFQUFJLGlCQUFtQixFQUFJLFNBQVMsVUFBVSxJQUFJLFNBQVUsRUFBRyxDQUM3RCxNQUFPLEdBQUssaUJBQWlCLEVBQUksV0FBWSxFQUFHLEtBWWxELE9BSkksR0FBb0IsRUFBVyxVQUFVLFVBQVUsUUFDbkQsRUFBd0IsRUFBSSxvQkFBc0IsR0FDbEQsRUFBdUIsRUFBSSxtQkFBcUIsR0FFM0MsRUFBSSxFQUFHLEVBQVMsRUFBa0IsT0FBUSxFQUFJLEVBQVEsSUFBSyxDQUNsRSxHQUFJLEdBQWEsRUFBa0IsR0FDL0IsRUFBYyxHQUFJLElBQ3RCLEVBQVksY0FBZ0IsRUFBVyxjQUN2QyxFQUFZLGdCQUFrQixFQUFXLGdCQUVyQyxFQUFXLFFBQ2IsR0FBWSxPQUFTLEVBQVEsUUFBUSxFQUFXLFFBQ2hELEVBQVksYUFBZSxFQUFXLGFBQ3RDLEVBQVksZUFBaUIsRUFBVyxlQUVwQyxFQUFXLE1BQ2IsR0FBWSxLQUFPLEVBQU0sUUFBUSxFQUFXLE9BRzlDLEVBQXFCLEtBQUssSUFHNUIsRUFBc0IsS0FBSyxHQUc3QixVQUFVLEVBQUksbUJBQW9CLEVBQUssNEJBRWhDLEdBTVgsR0FBdUIsVUFBVSxTQUFXLEVBSzVDLE9BQU8sZUFBZSxHQUF1QixVQUFXLFVBQVcsQ0FDakUsSUFBSyxVQUFZLENBQ2YsTUFBTyxNQUFLLGlCQUFpQixXQU9qQyxhQUFtQixDQUNqQixLQUFLLGNBQWdCLEVBQ3JCLEtBQUssZ0JBQWtCLEVBQ3ZCLEtBQUssT0FBUyxLQUNkLEtBQUssYUFBZSxLQUNwQixLQUFLLGVBQWlCLEtBQ3RCLEtBQUssS0FBTyxLQVFkLEdBQXVCLFVBQVUsZUFDL0IsU0FBeUMsRUFBTSxFQUFhLENBZTFELE9BZEksR0FBZ0IsRUFDaEIsRUFBMEIsRUFDMUIsRUFBdUIsRUFDdkIsRUFBeUIsRUFDekIsRUFBaUIsRUFDakIsRUFBZSxFQUNmLEVBQVMsRUFBSyxPQUNkLEVBQVEsRUFDUixFQUFpQixHQUNqQixFQUFPLEdBQ1AsRUFBbUIsR0FDbkIsRUFBb0IsR0FDcEIsRUFBUyxFQUFLLEVBQVMsRUFBSyxFQUV6QixFQUFRLEdBQ2IsR0FBSSxFQUFLLE9BQU8sS0FBVyxJQUN6QixJQUNBLElBQ0EsRUFBMEIsVUFFbkIsRUFBSyxPQUFPLEtBQVcsSUFDOUIsUUFFRyxDQVNILElBUkEsRUFBVSxHQUFJLElBQ2QsRUFBUSxjQUFnQixFQU9uQixFQUFNLEVBQU8sRUFBTSxHQUNsQixNQUFLLHdCQUF3QixFQUFNLEdBRFQsSUFDOUIsQ0FPRixHQUhBLEVBQU0sRUFBSyxNQUFNLEVBQU8sR0FFeEIsRUFBVSxFQUFlLEdBQ3JCLEVBQ0YsR0FBUyxFQUFJLFdBQ1IsQ0FFTCxJQURBLEVBQVUsR0FDSCxFQUFRLEdBQ2IsR0FBVSxPQUFPLEVBQU0sRUFBTyxHQUM5QixFQUFRLEVBQUssTUFDYixFQUFRLEVBQUssS0FDYixFQUFRLEtBQUssR0FHZixHQUFJLEVBQVEsU0FBVyxFQUNyQixLQUFNLElBQUksT0FBTSwwQ0FHbEIsR0FBSSxFQUFRLFNBQVcsRUFDckIsS0FBTSxJQUFJLE9BQU0sMENBR2xCLEVBQWUsR0FBTyxFQUl4QixFQUFRLGdCQUFrQixFQUEwQixFQUFRLEdBQzVELEVBQTBCLEVBQVEsZ0JBRTlCLEVBQVEsT0FBUyxHQUVuQixHQUFRLE9BQVMsRUFBaUIsRUFBUSxHQUMxQyxHQUFrQixFQUFRLEdBRzFCLEVBQVEsYUFBZSxFQUF1QixFQUFRLEdBQ3RELEVBQXVCLEVBQVEsYUFFL0IsRUFBUSxjQUFnQixFQUd4QixFQUFRLGVBQWlCLEVBQXlCLEVBQVEsR0FDMUQsRUFBeUIsRUFBUSxlQUU3QixFQUFRLE9BQVMsR0FFbkIsR0FBUSxLQUFPLEVBQWUsRUFBUSxHQUN0QyxHQUFnQixFQUFRLEtBSTVCLEVBQWtCLEtBQUssR0FDbkIsTUFBTyxHQUFRLGNBQWlCLFVBQ2xDLEVBQWlCLEtBQUssR0FLNUIsR0FBVSxFQUFtQixFQUFLLHFDQUNsQyxLQUFLLG9CQUFzQixFQUUzQixHQUFVLEVBQWtCLEVBQUssNEJBQ2pDLEtBQUssbUJBQXFCLEdBTzlCLEdBQXVCLFVBQVUsYUFDL0IsU0FBdUMsRUFBUyxFQUFXLEVBQ3BCLEVBQWEsRUFBYSxFQUFPLENBTXRFLEdBQUksRUFBUSxJQUFjLEVBQ3hCLEtBQU0sSUFBSSxXQUFVLGdEQUNFLEVBQVEsSUFFaEMsR0FBSSxFQUFRLEdBQWUsRUFDekIsS0FBTSxJQUFJLFdBQVUsa0RBQ0UsRUFBUSxJQUdoQyxNQUFPLElBQWEsT0FBTyxFQUFTLEVBQVcsRUFBYSxJQU9oRSxHQUF1QixVQUFVLG1CQUMvQixVQUFnRCxDQUM5QyxPQUFTLEdBQVEsRUFBRyxFQUFRLEtBQUssbUJBQW1CLE9BQVEsRUFBRSxFQUFPLENBQ25FLEdBQUksR0FBVSxLQUFLLG1CQUFtQixHQU10QyxHQUFJLEVBQVEsRUFBSSxLQUFLLG1CQUFtQixPQUFRLENBQzlDLEdBQUksR0FBYyxLQUFLLG1CQUFtQixFQUFRLEdBRWxELEdBQUksRUFBUSxnQkFBa0IsRUFBWSxjQUFlLENBQ3ZELEVBQVEsb0JBQXNCLEVBQVksZ0JBQWtCLEVBQzVELFVBS0osRUFBUSxvQkFBc0IsTUE0QnBDLEdBQXVCLFVBQVUsb0JBQy9CLFNBQStDLEVBQU8sQ0FDcEQsR0FBSSxHQUFTLENBQ1gsY0FBZSxFQUFLLE9BQU8sRUFBTyxRQUNsQyxnQkFBaUIsRUFBSyxPQUFPLEVBQU8sV0FHbEMsRUFBUSxLQUFLLGFBQ2YsRUFDQSxLQUFLLG1CQUNMLGdCQUNBLGtCQUNBLEVBQUssb0NBQ0wsRUFBSyxPQUFPLEVBQU8sT0FBUSxFQUFrQix1QkFHL0MsR0FBSSxHQUFTLEVBQUcsQ0FDZCxHQUFJLEdBQVUsS0FBSyxtQkFBbUIsR0FFdEMsR0FBSSxFQUFRLGdCQUFrQixFQUFPLGNBQWUsQ0FDbEQsR0FBSSxHQUFTLEVBQUssT0FBTyxFQUFTLFNBQVUsTUFDNUMsQUFBSSxJQUFXLE1BQ2IsR0FBUyxLQUFLLFNBQVMsR0FBRyxHQUMxQixFQUFTLEVBQUssaUJBQWlCLEtBQUssV0FBWSxFQUFRLEtBQUssZ0JBRS9ELEdBQUksR0FBTyxFQUFLLE9BQU8sRUFBUyxPQUFRLE1BQ3hDLE1BQUksS0FBUyxNQUNYLEdBQU8sS0FBSyxPQUFPLEdBQUcsSUFFakIsQ0FDTCxPQUFRLEVBQ1IsS0FBTSxFQUFLLE9BQU8sRUFBUyxlQUFnQixNQUMzQyxPQUFRLEVBQUssT0FBTyxFQUFTLGlCQUFrQixNQUMvQyxLQUFNLElBS1osTUFBTyxDQUNMLE9BQVEsS0FDUixLQUFNLEtBQ04sT0FBUSxLQUNSLEtBQU0sT0FRWixHQUF1QixVQUFVLHdCQUMvQixVQUEwRCxDQUN4RCxNQUFLLE1BQUssZUFHSCxLQUFLLGVBQWUsUUFBVSxLQUFLLFNBQVMsUUFDakQsQ0FBQyxLQUFLLGVBQWUsS0FBSyxTQUFVLEVBQUksQ0FBRSxNQUFPLElBQU0sT0FIaEQsSUFXYixHQUF1QixVQUFVLGlCQUMvQixTQUE0QyxFQUFTLEVBQWUsQ0FDbEUsR0FBSSxDQUFDLEtBQUssZUFDUixNQUFPLE1BR1QsR0FBSSxHQUFRLEtBQUssaUJBQWlCLEdBQ2xDLEdBQUksR0FBUyxFQUNYLE1BQU8sTUFBSyxlQUFlLEdBRzdCLEdBQUksR0FBaUIsRUFDckIsQUFBSSxLQUFLLFlBQWMsTUFDckIsR0FBaUIsRUFBSyxTQUFTLEtBQUssV0FBWSxJQUdsRCxHQUFJLEdBQ0osR0FBSSxLQUFLLFlBQWMsTUFDZixHQUFNLEVBQUssU0FBUyxLQUFLLGFBQWMsQ0FLN0MsR0FBSSxHQUFpQixFQUFlLFFBQVEsYUFBYyxJQUMxRCxHQUFJLEVBQUksUUFBVSxRQUNYLEtBQUssU0FBUyxJQUFJLEdBQ3ZCLE1BQU8sTUFBSyxlQUFlLEtBQUssU0FBUyxRQUFRLElBR25ELEdBQUssRUFBQyxFQUFJLE1BQVEsRUFBSSxNQUFRLE1BQ3ZCLEtBQUssU0FBUyxJQUFJLElBQU0sR0FDN0IsTUFBTyxNQUFLLGVBQWUsS0FBSyxTQUFTLFFBQVEsSUFBTSxJQVEzRCxHQUFJLEVBQ0YsTUFBTyxNQUdQLEtBQU0sSUFBSSxPQUFNLElBQU0sRUFBaUIsK0JBMkI3QyxHQUF1QixVQUFVLHFCQUMvQixTQUFnRCxFQUFPLENBQ3JELEdBQUksR0FBUyxFQUFLLE9BQU8sRUFBTyxVQUVoQyxHQURBLEVBQVMsS0FBSyxpQkFBaUIsR0FDM0IsRUFBUyxFQUNYLE1BQU8sQ0FDTCxLQUFNLEtBQ04sT0FBUSxLQUNSLFdBQVksTUFJaEIsR0FBSSxHQUFTLENBQ1gsT0FBUSxFQUNSLGFBQWMsRUFBSyxPQUFPLEVBQU8sUUFDakMsZUFBZ0IsRUFBSyxPQUFPLEVBQU8sV0FHakMsRUFBUSxLQUFLLGFBQ2YsRUFDQSxLQUFLLGtCQUNMLGVBQ0EsaUJBQ0EsRUFBSywyQkFDTCxFQUFLLE9BQU8sRUFBTyxPQUFRLEVBQWtCLHVCQUcvQyxHQUFJLEdBQVMsRUFBRyxDQUNkLEdBQUksR0FBVSxLQUFLLGtCQUFrQixHQUVyQyxHQUFJLEVBQVEsU0FBVyxFQUFPLE9BQzVCLE1BQU8sQ0FDTCxLQUFNLEVBQUssT0FBTyxFQUFTLGdCQUFpQixNQUM1QyxPQUFRLEVBQUssT0FBTyxFQUFTLGtCQUFtQixNQUNoRCxXQUFZLEVBQUssT0FBTyxFQUFTLHNCQUF1QixPQUs5RCxNQUFPLENBQ0wsS0FBTSxLQUNOLE9BQVEsS0FDUixXQUFZLE9BSWxCLEdBQVEsdUJBQXlCLEdBbURqQyxZQUFrQyxFQUFZLEVBQWUsQ0FDM0QsR0FBSSxHQUFZLEVBQ2hCLEFBQUksTUFBTyxJQUFlLFVBQ3hCLEdBQVksRUFBSyxvQkFBb0IsSUFHdkMsR0FBSSxHQUFVLEVBQUssT0FBTyxFQUFXLFdBQ2pDLEVBQVcsRUFBSyxPQUFPLEVBQVcsWUFFdEMsR0FBSSxHQUFXLEtBQUssU0FDbEIsS0FBTSxJQUFJLE9BQU0sd0JBQTBCLEdBRzVDLEtBQUssU0FBVyxHQUFJLElBQ3BCLEtBQUssT0FBUyxHQUFJLElBRWxCLEdBQUksR0FBYSxDQUNmLEtBQU0sR0FDTixPQUFRLEdBRVYsS0FBSyxVQUFZLEVBQVMsSUFBSSxTQUFVLEVBQUcsQ0FDekMsR0FBSSxFQUFFLElBR0osS0FBTSxJQUFJLE9BQU0sc0RBRWxCLEdBQUksR0FBUyxFQUFLLE9BQU8sRUFBRyxVQUN4QixFQUFhLEVBQUssT0FBTyxFQUFRLFFBQ2pDLEVBQWUsRUFBSyxPQUFPLEVBQVEsVUFFdkMsR0FBSSxFQUFhLEVBQVcsTUFDdkIsSUFBZSxFQUFXLE1BQVEsRUFBZSxFQUFXLE9BQy9ELEtBQU0sSUFBSSxPQUFNLHdEQUVsQixTQUFhLEVBRU4sQ0FDTCxnQkFBaUIsQ0FHZixjQUFlLEVBQWEsRUFDNUIsZ0JBQWlCLEVBQWUsR0FFbEMsU0FBVSxHQUFJLEdBQWtCLEVBQUssT0FBTyxFQUFHLE9BQVEsTUFLN0QsR0FBeUIsVUFBWSxPQUFPLE9BQU8sRUFBa0IsV0FDckUsR0FBeUIsVUFBVSxZQUFjLEVBS2pELEdBQXlCLFVBQVUsU0FBVyxFQUs5QyxPQUFPLGVBQWUsR0FBeUIsVUFBVyxVQUFXLENBQ25FLElBQUssVUFBWSxDQUVmLE9BREksR0FBVSxHQUNMLEVBQUksRUFBRyxFQUFJLEtBQUssVUFBVSxPQUFRLElBQ3pDLE9BQVMsR0FBSSxFQUFHLEVBQUksS0FBSyxVQUFVLEdBQUcsU0FBUyxRQUFRLE9BQVEsSUFDN0QsRUFBUSxLQUFLLEtBQUssVUFBVSxHQUFHLFNBQVMsUUFBUSxJQUdwRCxNQUFPLE1BdUJYLEdBQXlCLFVBQVUsb0JBQ2pDLFNBQXNELEVBQU8sQ0FDM0QsR0FBSSxHQUFTLENBQ1gsY0FBZSxFQUFLLE9BQU8sRUFBTyxRQUNsQyxnQkFBaUIsRUFBSyxPQUFPLEVBQU8sV0FLbEMsRUFBZSxHQUFhLE9BQU8sRUFBUSxLQUFLLFVBQ2xELFNBQVMsRUFBUSxFQUFTLENBQ3hCLEdBQUksR0FBTSxFQUFPLGNBQWdCLEVBQVEsZ0JBQWdCLGNBQ3pELE1BQUksSUFJSSxFQUFPLGdCQUNQLEVBQVEsZ0JBQWdCLGtCQUVoQyxFQUFVLEtBQUssVUFBVSxHQUU3QixNQUFLLEdBU0UsRUFBUSxTQUFTLG9CQUFvQixDQUMxQyxLQUFNLEVBQU8sY0FDVixHQUFRLGdCQUFnQixjQUFnQixHQUMzQyxPQUFRLEVBQU8sZ0JBQ1osR0FBUSxnQkFBZ0IsZ0JBQWtCLEVBQU8sY0FDL0MsRUFBUSxnQkFBZ0IsZ0JBQWtCLEVBQzFDLEdBQ0wsS0FBTSxFQUFNLE9BZkwsQ0FDTCxPQUFRLEtBQ1IsS0FBTSxLQUNOLE9BQVEsS0FDUixLQUFNLE9BbUJkLEdBQXlCLFVBQVUsd0JBQ2pDLFVBQTRELENBQzFELE1BQU8sTUFBSyxVQUFVLE1BQU0sU0FBVSxFQUFHLENBQ3ZDLE1BQU8sR0FBRSxTQUFTLDZCQVN4QixHQUF5QixVQUFVLGlCQUNqQyxTQUFtRCxFQUFTLEVBQWUsQ0FDekUsT0FBUyxHQUFJLEVBQUcsRUFBSSxLQUFLLFVBQVUsT0FBUSxJQUFLLENBQzlDLEdBQUksR0FBVSxLQUFLLFVBQVUsR0FFekIsRUFBVSxFQUFRLFNBQVMsaUJBQWlCLEVBQVMsSUFDekQsR0FBSSxFQUNGLE1BQU8sR0FHWCxHQUFJLEVBQ0YsTUFBTyxNQUdQLEtBQU0sSUFBSSxPQUFNLElBQU0sRUFBVSwrQkFzQnRDLEdBQXlCLFVBQVUscUJBQ2pDLFNBQXVELEVBQU8sQ0FDNUQsT0FBUyxHQUFJLEVBQUcsRUFBSSxLQUFLLFVBQVUsT0FBUSxJQUFLLENBQzlDLEdBQUksR0FBVSxLQUFLLFVBQVUsR0FJN0IsR0FBSSxFQUFRLFNBQVMsaUJBQWlCLEVBQUssT0FBTyxFQUFPLGFBQWUsR0FHeEUsSUFBSSxHQUFvQixFQUFRLFNBQVMscUJBQXFCLEdBQzlELEdBQUksRUFBbUIsQ0FDckIsR0FBSSxHQUFNLENBQ1IsS0FBTSxFQUFrQixLQUNyQixHQUFRLGdCQUFnQixjQUFnQixHQUMzQyxPQUFRLEVBQWtCLE9BQ3ZCLEdBQVEsZ0JBQWdCLGdCQUFrQixFQUFrQixLQUMxRCxFQUFRLGdCQUFnQixnQkFBa0IsRUFDMUMsSUFFUCxNQUFPLEtBSVgsTUFBTyxDQUNMLEtBQU0sS0FDTixPQUFRLE9BU2QsR0FBeUIsVUFBVSxlQUNqQyxTQUFnRCxFQUFNLEVBQWEsQ0FDakUsS0FBSyxvQkFBc0IsR0FDM0IsS0FBSyxtQkFBcUIsR0FDMUIsT0FBUyxHQUFJLEVBQUcsRUFBSSxLQUFLLFVBQVUsT0FBUSxJQUd6QyxPQUZJLEdBQVUsS0FBSyxVQUFVLEdBQ3pCLEVBQWtCLEVBQVEsU0FBUyxtQkFDOUIsRUFBSSxFQUFHLEVBQUksRUFBZ0IsT0FBUSxJQUFLLENBQy9DLEdBQUksR0FBVSxFQUFnQixHQUUxQixFQUFTLEVBQVEsU0FBUyxTQUFTLEdBQUcsRUFBUSxRQUNsRCxFQUFTLEVBQUssaUJBQWlCLEVBQVEsU0FBUyxXQUFZLEVBQVEsS0FBSyxlQUN6RSxLQUFLLFNBQVMsSUFBSSxHQUNsQixFQUFTLEtBQUssU0FBUyxRQUFRLEdBRS9CLEdBQUksR0FBTyxLQUNYLEFBQUksRUFBUSxNQUNWLEdBQU8sRUFBUSxTQUFTLE9BQU8sR0FBRyxFQUFRLE1BQzFDLEtBQUssT0FBTyxJQUFJLEdBQ2hCLEVBQU8sS0FBSyxPQUFPLFFBQVEsSUFPN0IsR0FBSSxHQUFrQixDQUNwQixPQUFRLEVBQ1IsY0FBZSxFQUFRLGNBQ3BCLEdBQVEsZ0JBQWdCLGNBQWdCLEdBQzNDLGdCQUFpQixFQUFRLGdCQUN0QixHQUFRLGdCQUFnQixnQkFBa0IsRUFBUSxjQUNqRCxFQUFRLGdCQUFnQixnQkFBa0IsRUFDMUMsR0FDSixhQUFjLEVBQVEsYUFDdEIsZUFBZ0IsRUFBUSxlQUN4QixLQUFNLEdBR1IsS0FBSyxvQkFBb0IsS0FBSyxHQUMxQixNQUFPLEdBQWdCLGNBQWlCLFVBQzFDLEtBQUssbUJBQW1CLEtBQUssR0FLbkMsR0FBVSxLQUFLLG9CQUFxQixFQUFLLHFDQUN6QyxHQUFVLEtBQUssbUJBQW9CLEVBQUssNkJBRzVDLEdBQVEseUJBQTJCLEtDeG5DbkMsY0FPQSxHQUFJLElBQXFCLEtBQWtDLG1CQUN2RCxHQUFPLEtBSVAsR0FBZ0IsVUFHaEIsR0FBZSxHQUtmLEdBQWUscUJBY25CLFlBQW9CLEVBQU8sRUFBUyxFQUFTLEVBQVMsRUFBTyxDQUMzRCxLQUFLLFNBQVcsR0FDaEIsS0FBSyxlQUFpQixHQUN0QixLQUFLLEtBQU8sR0FBZ0IsS0FDNUIsS0FBSyxPQUFTLEdBQWtCLEtBQ2hDLEtBQUssT0FBUyxHQUFrQixLQUNoQyxLQUFLLEtBQU8sR0FBZ0IsS0FDNUIsS0FBSyxJQUFnQixHQUNqQixHQUFXLE1BQU0sS0FBSyxJQUFJLEdBV2hDLEdBQVcsd0JBQ1QsU0FBNEMsRUFBZ0IsRUFBb0IsRUFBZSxDQUc3RixHQUFJLEdBQU8sR0FBSSxJQU1YLEVBQWlCLEVBQWUsTUFBTSxJQUN0QyxFQUFzQixFQUN0QixFQUFnQixVQUFXLENBQzdCLEdBQUksR0FBZSxJQUVmLEVBQVUsS0FBaUIsR0FDL0IsTUFBTyxHQUFlLEVBRXRCLFlBQXVCLENBQ3JCLE1BQU8sR0FBc0IsRUFBZSxPQUN4QyxFQUFlLEtBQXlCLFNBSzVDLEVBQW9CLEVBQUcsRUFBc0IsRUFLN0MsRUFBYyxLQUVsQixTQUFtQixZQUFZLFNBQVUsRUFBUyxDQUNoRCxHQUFJLElBQWdCLEtBR2xCLEdBQUksRUFBb0IsRUFBUSxjQUU5QixFQUFtQixFQUFhLEtBQ2hDLElBQ0EsRUFBc0IsTUFFakIsQ0FJTCxHQUFJLEdBQVcsRUFBZSxJQUF3QixHQUNsRCxFQUFPLEVBQVMsT0FBTyxFQUFHLEVBQVEsZ0JBQ1IsR0FDOUIsRUFBZSxHQUF1QixFQUFTLE9BQU8sRUFBUSxnQkFDMUIsR0FDcEMsRUFBc0IsRUFBUSxnQkFDOUIsRUFBbUIsRUFBYSxHQUVoQyxFQUFjLEVBQ2QsT0FNSixLQUFPLEVBQW9CLEVBQVEsZUFDakMsRUFBSyxJQUFJLEtBQ1QsSUFFRixHQUFJLEVBQXNCLEVBQVEsZ0JBQWlCLENBQ2pELEdBQUksR0FBVyxFQUFlLElBQXdCLEdBQ3RELEVBQUssSUFBSSxFQUFTLE9BQU8sRUFBRyxFQUFRLGtCQUNwQyxFQUFlLEdBQXVCLEVBQVMsT0FBTyxFQUFRLGlCQUM5RCxFQUFzQixFQUFRLGdCQUVoQyxFQUFjLEdBQ2IsTUFFQyxFQUFzQixFQUFlLFFBQ25DLElBRUYsRUFBbUIsRUFBYSxLQUdsQyxFQUFLLElBQUksRUFBZSxPQUFPLEdBQXFCLEtBQUssTUFJM0QsRUFBbUIsUUFBUSxRQUFRLFNBQVUsRUFBWSxDQUN2RCxHQUFJLEdBQVUsRUFBbUIsaUJBQWlCLEdBQ2xELEFBQUksR0FBVyxNQUNULElBQWlCLE1BQ25CLEdBQWEsR0FBSyxLQUFLLEVBQWUsSUFFeEMsRUFBSyxpQkFBaUIsRUFBWSxNQUkvQixFQUVQLFdBQTRCLEVBQVMsRUFBTSxDQUN6QyxHQUFJLElBQVksTUFBUSxFQUFRLFNBQVcsT0FDekMsRUFBSyxJQUFJLE9BQ0osQ0FDTCxHQUFJLEdBQVMsRUFDVCxHQUFLLEtBQUssRUFBZSxFQUFRLFFBQ2pDLEVBQVEsT0FDWixFQUFLLElBQUksR0FBSSxJQUFXLEVBQVEsYUFDUixFQUFRLGVBQ1IsRUFDQSxFQUNBLEVBQVEsVUFXeEMsR0FBVyxVQUFVLElBQU0sU0FBd0IsRUFBUSxDQUN6RCxHQUFJLE1BQU0sUUFBUSxHQUNoQixFQUFPLFFBQVEsU0FBVSxFQUFPLENBQzlCLEtBQUssSUFBSSxJQUNSLGNBRUksRUFBTyxLQUFpQixNQUFPLElBQVcsU0FDakQsQUFBSSxHQUNGLEtBQUssU0FBUyxLQUFLLE9BSXJCLE1BQU0sSUFBSSxXQUNSLDhFQUFnRixHQUdwRixNQUFPLE9BU1QsR0FBVyxVQUFVLFFBQVUsU0FBNEIsRUFBUSxDQUNqRSxHQUFJLE1BQU0sUUFBUSxHQUNoQixPQUFTLEdBQUksRUFBTyxPQUFPLEVBQUcsR0FBSyxFQUFHLElBQ3BDLEtBQUssUUFBUSxFQUFPLFlBR2YsRUFBTyxLQUFpQixNQUFPLElBQVcsU0FDakQsS0FBSyxTQUFTLFFBQVEsT0FHdEIsTUFBTSxJQUFJLFdBQ1IsOEVBQWdGLEdBR3BGLE1BQU8sT0FVVCxHQUFXLFVBQVUsS0FBTyxTQUF5QixFQUFLLENBRXhELE9BREksR0FDSyxFQUFJLEVBQUcsRUFBTSxLQUFLLFNBQVMsT0FBUSxFQUFJLEVBQUssSUFDbkQsRUFBUSxLQUFLLFNBQVMsR0FDdEIsQUFBSSxFQUFNLElBQ1IsRUFBTSxLQUFLLEdBR1AsSUFBVSxJQUNaLEVBQUksRUFBTyxDQUFFLE9BQVEsS0FBSyxPQUNiLEtBQU0sS0FBSyxLQUNYLE9BQVEsS0FBSyxPQUNiLEtBQU0sS0FBSyxRQVloQyxHQUFXLFVBQVUsS0FBTyxTQUF5QixFQUFNLENBQ3pELEdBQUksR0FDQSxFQUNBLEVBQU0sS0FBSyxTQUFTLE9BQ3hCLEdBQUksRUFBTSxFQUFHLENBRVgsSUFEQSxFQUFjLEdBQ1QsRUFBSSxFQUFHLEVBQUksRUFBSSxFQUFHLElBQ3JCLEVBQVksS0FBSyxLQUFLLFNBQVMsSUFDL0IsRUFBWSxLQUFLLEdBRW5CLEVBQVksS0FBSyxLQUFLLFNBQVMsSUFDL0IsS0FBSyxTQUFXLEVBRWxCLE1BQU8sT0FVVCxHQUFXLFVBQVUsYUFBZSxTQUFpQyxFQUFVLEVBQWMsQ0FDM0YsR0FBSSxHQUFZLEtBQUssU0FBUyxLQUFLLFNBQVMsT0FBUyxHQUNyRCxNQUFJLEdBQVUsSUFDWixFQUFVLGFBQWEsRUFBVSxHQUU5QixBQUFJLE1BQU8sSUFBYyxTQUM1QixLQUFLLFNBQVMsS0FBSyxTQUFTLE9BQVMsR0FBSyxFQUFVLFFBQVEsRUFBVSxHQUd0RSxLQUFLLFNBQVMsS0FBSyxHQUFHLFFBQVEsRUFBVSxJQUVuQyxNQVVULEdBQVcsVUFBVSxpQkFDbkIsU0FBcUMsRUFBYSxFQUFnQixDQUNoRSxLQUFLLGVBQWUsR0FBSyxZQUFZLElBQWdCLEdBU3pELEdBQVcsVUFBVSxtQkFDbkIsU0FBdUMsRUFBSyxDQUMxQyxPQUFTLEdBQUksRUFBRyxFQUFNLEtBQUssU0FBUyxPQUFRLEVBQUksRUFBSyxJQUNuRCxBQUFJLEtBQUssU0FBUyxHQUFHLEtBQ25CLEtBQUssU0FBUyxHQUFHLG1CQUFtQixHQUt4QyxPQURJLEdBQVUsT0FBTyxLQUFLLEtBQUssZ0JBQ3RCLEVBQUksRUFBRyxFQUFNLEVBQVEsT0FBUSxFQUFJLEVBQUssSUFDN0MsRUFBSSxHQUFLLGNBQWMsRUFBUSxJQUFLLEtBQUssZUFBZSxFQUFRLE1BUXRFLEdBQVcsVUFBVSxTQUFXLFVBQStCLENBQzdELEdBQUksR0FBTSxHQUNWLFlBQUssS0FBSyxTQUFVLEVBQU8sQ0FDekIsR0FBTyxJQUVGLEdBT1QsR0FBVyxVQUFVLHNCQUF3QixTQUEwQyxFQUFPLENBQzVGLEdBQUksR0FBWSxDQUNkLEtBQU0sR0FDTixLQUFNLEVBQ04sT0FBUSxHQUVOLEVBQU0sR0FBSSxJQUFtQixHQUM3QixFQUFzQixHQUN0QixFQUFxQixLQUNyQixFQUFtQixLQUNuQixFQUFxQixLQUNyQixFQUFtQixLQUN2QixZQUFLLEtBQUssU0FBVSxFQUFPLEVBQVUsQ0FDbkMsRUFBVSxNQUFRLEVBQ2xCLEFBQUksRUFBUyxTQUFXLE1BQ2pCLEVBQVMsT0FBUyxNQUNsQixFQUFTLFNBQVcsS0FDdEIsTUFBdUIsRUFBUyxRQUM3QixJQUFxQixFQUFTLE1BQzlCLElBQXVCLEVBQVMsUUFDaEMsSUFBcUIsRUFBUyxPQUNsQyxFQUFJLFdBQVcsQ0FDYixPQUFRLEVBQVMsT0FDakIsU0FBVSxDQUNSLEtBQU0sRUFBUyxLQUNmLE9BQVEsRUFBUyxRQUVuQixVQUFXLENBQ1QsS0FBTSxFQUFVLEtBQ2hCLE9BQVEsRUFBVSxRQUVwQixLQUFNLEVBQVMsT0FHbkIsRUFBcUIsRUFBUyxPQUM5QixFQUFtQixFQUFTLEtBQzVCLEVBQXFCLEVBQVMsT0FDOUIsRUFBbUIsRUFBUyxLQUM1QixFQUFzQixJQUNiLEdBQ1QsR0FBSSxXQUFXLENBQ2IsVUFBVyxDQUNULEtBQU0sRUFBVSxLQUNoQixPQUFRLEVBQVUsVUFHdEIsRUFBcUIsS0FDckIsRUFBc0IsSUFFeEIsT0FBUyxHQUFNLEVBQUcsRUFBUyxFQUFNLE9BQVEsRUFBTSxFQUFRLElBQ3JELEFBQUksRUFBTSxXQUFXLEtBQVMsR0FDNUIsR0FBVSxPQUNWLEVBQVUsT0FBUyxFQUVuQixBQUFJLEVBQU0sSUFBTSxFQUNkLEdBQXFCLEtBQ3JCLEVBQXNCLElBQ2IsR0FDVCxFQUFJLFdBQVcsQ0FDYixPQUFRLEVBQVMsT0FDakIsU0FBVSxDQUNSLEtBQU0sRUFBUyxLQUNmLE9BQVEsRUFBUyxRQUVuQixVQUFXLENBQ1QsS0FBTSxFQUFVLEtBQ2hCLE9BQVEsRUFBVSxRQUVwQixLQUFNLEVBQVMsUUFJbkIsRUFBVSxXQUloQixLQUFLLG1CQUFtQixTQUFVLEVBQVksRUFBZSxDQUMzRCxFQUFJLGlCQUFpQixFQUFZLEtBRzVCLENBQUUsS0FBTSxFQUFVLEtBQU0sSUFBSyxJQUd0QyxHQUFRLFdBQWEsS0M1WnJCLGNBS0EsR0FBUSxtQkFBcUIsS0FBc0MsbUJBQ25FLEdBQVEsa0JBQW9CLEtBQXFDLGtCQUNqRSxHQUFRLFdBQWEsS0FBNkIsYUNQbEQsbUJBRUEsR0FBSSxJQUFXLE9BQU8sVUFBVSxTQUU1QixHQUNGLE1BQU8sU0FBVyxhQUNsQixNQUFPLFFBQU8sT0FBVSxZQUN4QixNQUFPLFFBQU8sYUFBZ0IsWUFDOUIsTUFBTyxRQUFPLE1BQVMsV0FHekIsWUFBd0IsRUFBTyxDQUM3QixNQUFPLElBQVMsS0FBSyxHQUFPLE1BQU0sRUFBRyxNQUFRLGNBRy9DLFlBQTBCLEVBQUssRUFBWSxFQUFRLENBQ2pELEtBQWdCLEVBRWhCLEdBQUksR0FBWSxFQUFJLFdBQWEsRUFFakMsR0FBSSxFQUFZLEVBQ2QsS0FBTSxJQUFJLFlBQVcsNkJBR3ZCLEdBQUksSUFBVyxPQUNiLEVBQVMsVUFFVCxLQUFZLEVBRVIsRUFBUyxFQUNYLEtBQU0sSUFBSSxZQUFXLDZCQUl6QixNQUFPLElBQ0gsT0FBTyxLQUFLLEVBQUksTUFBTSxFQUFZLEVBQWEsSUFDL0MsR0FBSSxRQUFPLEdBQUksWUFBVyxFQUFJLE1BQU0sRUFBWSxFQUFhLEtBR25FLFlBQXFCLEVBQVEsRUFBVSxDQUtyQyxHQUpJLE9BQU8sSUFBYSxVQUFZLElBQWEsS0FDL0MsR0FBVyxRQUdULENBQUMsT0FBTyxXQUFXLEdBQ3JCLEtBQU0sSUFBSSxXQUFVLDhDQUd0QixNQUFPLElBQ0gsT0FBTyxLQUFLLEVBQVEsR0FDcEIsR0FBSSxRQUFPLEVBQVEsR0FHekIsWUFBcUIsRUFBTyxFQUFrQixFQUFRLENBQ3BELEdBQUksTUFBTyxJQUFVLFNBQ25CLEtBQU0sSUFBSSxXQUFVLHlDQUd0QixNQUFJLElBQWMsR0FDVCxHQUFnQixFQUFPLEVBQWtCLEdBRzlDLE1BQU8sSUFBVSxTQUNaLEdBQVcsRUFBTyxHQUdwQixHQUNILE9BQU8sS0FBSyxHQUNaLEdBQUksUUFBTyxHQUdqQixHQUFPLFFBQVUsS0N2RWpCLHNCQUFJLElBQW9CLEtBQXNCLGtCQUMxQyxHQUFPLFFBQVEsUUFFZixHQUNKLEdBQUksQ0FDRixHQUFLLFFBQVEsTUFDVCxFQUFDLEdBQUcsWUFBYyxDQUFDLEdBQUcsZUFFeEIsSUFBSyxXQUVQLEVBSUYsR0FBSSxJQUFhLEtBUWpCLFlBQXdCLEVBQUssRUFBUyxDQUNwQyxNQUFPLEdBQUksUUFBUSxHQUlyQixHQUFJLElBQTBCLEdBQzFCLEdBQXdCLEdBR3hCLEdBQThCLEdBRzlCLEdBQWMsT0FHZCxHQUFvQixHQUdwQixHQUFpQixHQUdqQixHQUFjLHNDQUdkLEdBQXVCLEdBQ3ZCLEdBQXNCLEdBRTFCLGFBQXVCLENBQ3JCLE1BQUksTUFBZ0IsVUFDWCxHQUNMLEtBQWdCLE9BQ1gsR0FDQSxNQUFPLFNBQVcsYUFBaUIsTUFBTyxpQkFBbUIsWUFBZSxDQUFFLFFBQU8sU0FBVyxPQUFPLFFBQVUsT0FBTyxTQUFXLE9BQU8sUUFBUSxPQUFTLFlBR3RLLGFBQXdDLENBQ3RDLE1BQVMsT0FBTyxVQUFZLFVBQWMsVUFBWSxNQUFVLE1BQU8sU0FBUSxJQUFPLFdBR3hGLGFBQWdDLENBQzlCLE1BQUssT0FBTyxVQUFZLFVBQWMsVUFBWSxLQUN6QyxRQUFRLFFBRVIsR0FJWCxhQUErQixDQUM3QixHQUFLLE1BQU8sVUFBWSxVQUFjLFVBQVksS0FDaEQsTUFBTyxTQUFRLE9BSW5CLFlBQTJCLEVBQU0sQ0FDL0IsR0FBSyxNQUFPLFVBQVksVUFBYyxVQUFZLE1BQVUsTUFBTyxTQUFRLE1BQVMsV0FDbEYsTUFBTyxTQUFRLEtBQUssR0FJeEIsWUFBcUIsRUFBTSxDQUN6QixNQUFPLFVBQVMsRUFBSyxDQUNuQixPQUFTLEdBQUksRUFBRyxFQUFJLEVBQUssT0FBUSxJQUFLLENBQ3BDLEdBQUksR0FBTSxFQUFLLEdBQUcsR0FDbEIsR0FBSSxFQUNGLE1BQU8sR0FHWCxNQUFPLE9BSVgsR0FBSSxJQUFlLEdBQVksSUFFL0IsR0FBcUIsS0FBSyxTQUFTLEVBQU0sQ0FXdkMsR0FUQSxFQUFPLEVBQUssT0FDUixTQUFTLEtBQUssSUFFaEIsR0FBTyxFQUFLLFFBQVEsb0JBQXFCLFNBQVMsRUFBVSxFQUFPLENBQ2pFLE1BQU8sR0FDTCxHQUNBLE9BR0YsSUFBUSxJQUNWLE1BQU8sSUFBa0IsR0FHM0IsR0FBSSxHQUFXLEdBQ2YsR0FBSSxDQUNGLEdBQUssR0FRRSxBQUFJLEdBQUcsV0FBVyxJQUV2QixHQUFXLEdBQUcsYUFBYSxFQUFNLGFBVjFCLENBRVAsR0FBSSxHQUFNLEdBQUksZ0JBQ2QsRUFBSSxLQUFLLE1BQU8sRUFBbUIsSUFDbkMsRUFBSSxLQUFLLE1BQ0wsRUFBSSxhQUFlLEdBQUssRUFBSSxTQUFXLEtBQ3pDLEdBQVcsRUFBSSxvQkFNbkIsRUFJRixNQUFPLElBQWtCLEdBQVEsSUFLbkMsWUFBNEIsRUFBTSxFQUFLLENBQ3JDLEdBQUksQ0FBQyxFQUFNLE1BQU8sR0FDbEIsR0FBSSxHQUFNLEdBQUssUUFBUSxHQUNuQixFQUFRLGtCQUFrQixLQUFLLEdBQy9CLEVBQVcsRUFBUSxFQUFNLEdBQUssR0FDOUIsRUFBWSxFQUFJLE1BQU0sRUFBUyxRQUNuQyxNQUFJLElBQVksVUFBVSxLQUFLLEdBRTdCLElBQVksSUFDTCxFQUFXLEdBQUssUUFBUSxFQUFJLE1BQU0sRUFBUyxRQUFTLEdBQUssUUFBUSxNQUFPLE1BRTFFLEVBQVcsR0FBSyxRQUFRLEVBQUksTUFBTSxFQUFTLFFBQVMsR0FHN0QsWUFBOEIsRUFBUSxDQUNwQyxHQUFJLEdBRUosR0FBSSxLQUNELEdBQUksQ0FDRixHQUFJLEdBQU0sR0FBSSxnQkFDZCxFQUFJLEtBQUssTUFBTyxFQUFRLElBQ3hCLEVBQUksS0FBSyxNQUNULEVBQVcsRUFBSSxhQUFlLEVBQUksRUFBSSxhQUFlLEtBR3JELEdBQUksR0FBa0IsRUFBSSxrQkFBa0IsY0FDdEIsRUFBSSxrQkFBa0IsZUFDNUMsR0FBSSxFQUNGLE1BQU8sUUFFVCxFQUtMLEVBQVcsR0FBYSxHQUt4QixPQUpJLEdBQUssd0hBR0wsRUFBVyxFQUNSLEVBQVEsRUFBRyxLQUFLLElBQVcsRUFBWSxFQUM5QyxNQUFLLEdBQ0UsRUFBVSxHQURNLEtBU3pCLEdBQUksSUFBb0IsR0FBWSxJQUNwQyxHQUFvQixLQUFLLFNBQVMsRUFBUSxDQUN4QyxHQUFJLEdBQW1CLEdBQXFCLEdBQzVDLEdBQUksQ0FBQyxFQUFrQixNQUFPLE1BRzlCLEdBQUksR0FDSixHQUFJLEdBQVksS0FBSyxHQUFtQixDQUV0QyxHQUFJLEdBQVUsRUFBaUIsTUFBTSxFQUFpQixRQUFRLEtBQU8sR0FDckUsRUFBZ0IsR0FBVyxFQUFTLFVBQVUsV0FDOUMsRUFBbUIsTUFHbkIsR0FBbUIsR0FBbUIsRUFBUSxHQUM5QyxFQUFnQixHQUFhLEdBRy9CLE1BQUssR0FJRSxDQUNMLElBQUssRUFDTCxJQUFLLEdBTEUsT0FTWCxZQUEyQixFQUFVLENBQ25DLEdBQUksR0FBWSxHQUFlLEVBQVMsUUFDeEMsR0FBSSxDQUFDLEVBQVcsQ0FFZCxHQUFJLEdBQVksR0FBa0IsRUFBUyxRQUMzQyxBQUFJLEVBQ0YsR0FBWSxHQUFlLEVBQVMsUUFBVSxDQUM1QyxJQUFLLEVBQVUsSUFDZixJQUFLLEdBQUksSUFBa0IsRUFBVSxNQUtuQyxFQUFVLElBQUksZ0JBQ2hCLEVBQVUsSUFBSSxRQUFRLFFBQVEsU0FBUyxFQUFRLEVBQUcsQ0FDaEQsR0FBSSxHQUFXLEVBQVUsSUFBSSxlQUFlLEdBQzVDLEdBQUksRUFBVSxDQUNaLEdBQUksR0FBTSxHQUFtQixFQUFVLElBQUssR0FDNUMsR0FBa0IsR0FBTyxNQUsvQixFQUFZLEdBQWUsRUFBUyxRQUFVLENBQzVDLElBQUssS0FDTCxJQUFLLE1BTVgsR0FBSSxHQUFhLEVBQVUsS0FBTyxNQUFPLEdBQVUsSUFBSSxxQkFBd0IsV0FBWSxDQUN6RixHQUFJLEdBQW1CLEVBQVUsSUFBSSxvQkFBb0IsR0FPekQsR0FBSSxFQUFpQixTQUFXLEtBQzlCLFNBQWlCLE9BQVMsR0FDeEIsRUFBVSxJQUFLLEVBQWlCLFFBQzNCLEVBSVgsTUFBTyxHQUtULFlBQXVCLEVBQVEsQ0FFN0IsR0FBSSxHQUFRLHlDQUF5QyxLQUFLLEdBQzFELEdBQUksRUFBTyxDQUNULEdBQUksR0FBVyxHQUFrQixDQUMvQixPQUFRLEVBQU0sR0FDZCxLQUFNLENBQUMsRUFBTSxHQUNiLE9BQVEsRUFBTSxHQUFLLElBRXJCLE1BQU8sV0FBYSxFQUFNLEdBQUssS0FBTyxFQUFTLE9BQVMsSUFDdEQsRUFBUyxLQUFPLElBQU8sR0FBUyxPQUFTLEdBQUssSUFLbEQsTUFEQSxHQUFRLDZCQUE2QixLQUFLLEdBQ3RDLEVBQ0ssV0FBYSxFQUFNLEdBQUssS0FBTyxHQUFjLEVBQU0sSUFBTSxJQUkzRCxFQVNULGFBQTRCLENBQzFCLEdBQUksR0FDQSxFQUFlLEdBQ25CLEdBQUksS0FBSyxXQUNQLEVBQWUsYUFDVixDQUNMLEVBQVcsS0FBSywyQkFDWixDQUFDLEdBQVksS0FBSyxVQUNwQixHQUFlLEtBQUssZ0JBQ3BCLEdBQWdCLE1BR2xCLEFBQUksRUFDRixHQUFnQixFQUtoQixHQUFnQixjQUVsQixHQUFJLEdBQWEsS0FBSyxnQkFDdEIsR0FBSSxHQUFjLEtBQU0sQ0FDdEIsR0FBZ0IsSUFBTSxFQUN0QixHQUFJLEdBQWUsS0FBSyxrQkFDeEIsQUFBSSxHQUNGLElBQWdCLElBQU0sSUFLNUIsR0FBSSxHQUFPLEdBQ1AsRUFBZSxLQUFLLGtCQUNwQixFQUFZLEdBQ1osRUFBZ0IsS0FBSyxnQkFDckIsRUFBZSxDQUFFLE1BQUssY0FBZ0IsR0FDMUMsR0FBSSxFQUFjLENBQ2hCLEdBQUksR0FBVyxLQUFLLGNBRXBCLEFBQUksSUFBYSxtQkFDZixHQUFXLFFBRWIsR0FBSSxHQUFhLEtBQUssZ0JBQ3RCLEFBQUksRUFDRSxJQUFZLEVBQWEsUUFBUSxJQUFhLEdBQ2hELElBQVEsRUFBVyxLQUVyQixHQUFRLEVBQ0osR0FBYyxFQUFhLFFBQVEsSUFBTSxJQUFlLEVBQWEsT0FBUyxFQUFXLE9BQVMsR0FDcEcsSUFBUSxRQUFVLEVBQWEsTUFHakMsR0FBUSxFQUFXLElBQU8sSUFBYyxtQkFFckMsQUFBSSxHQUNULEdBQVEsT0FBVSxJQUFnQixlQUM3QixBQUFJLEVBQ1QsR0FBUSxFQUVSLElBQVEsRUFDUixFQUFZLElBRWQsTUFBSSxJQUNGLElBQVEsS0FBTyxFQUFlLEtBRXpCLEVBR1QsWUFBdUIsRUFBTyxDQUM1QixHQUFJLEdBQVMsR0FDYixjQUFPLG9CQUFvQixPQUFPLGVBQWUsSUFBUSxRQUFRLFNBQVMsRUFBTSxDQUM5RSxFQUFPLEdBQVEsY0FBYyxLQUFLLEdBQVEsVUFBVyxDQUFFLE1BQU8sR0FBTSxHQUFNLEtBQUssSUFBWSxFQUFNLEtBRW5HLEVBQU8sU0FBVyxHQUNYLEVBR1QsWUFBc0IsRUFBTyxFQUFPLENBS2xDLEdBSEksSUFBVSxRQUNaLEdBQVEsQ0FBRSxhQUFjLEtBQU0sWUFBYSxPQUUxQyxFQUFNLFdBQ1AsU0FBTSxZQUFjLEtBQ2IsRUFNVCxHQUFJLEdBQVMsRUFBTSxlQUFpQixFQUFNLDJCQUMxQyxHQUFJLEVBQVEsQ0FDVixHQUFJLEdBQU8sRUFBTSxnQkFDYixFQUFTLEVBQU0sa0JBQW9CLEVBT25DLEVBQVcsOEVBQ1gsRUFBZSxFQUFTLEtBQUssTUFBMEIsRUFBSSxHQUMvRCxBQUFJLElBQVMsR0FBSyxFQUFTLEdBQWdCLENBQUMsTUFBaUIsQ0FBQyxFQUFNLFVBQ2xFLElBQVUsR0FHWixHQUFJLEdBQVcsR0FBa0IsQ0FDL0IsT0FBUSxFQUNSLEtBQU0sRUFDTixPQUFRLElBRVYsRUFBTSxZQUFjLEVBQ3BCLEVBQVEsR0FBYyxHQUN0QixHQUFJLEdBQXVCLEVBQU0sZ0JBQ2pDLFNBQU0sZ0JBQWtCLFVBQVcsQ0FDakMsTUFBSSxHQUFNLGNBQWdCLEtBQ2pCLElBRUYsRUFBTSxhQUFhLE1BQVEsS0FFcEMsRUFBTSxZQUFjLFVBQVcsQ0FBRSxNQUFPLEdBQVMsUUFDakQsRUFBTSxjQUFnQixVQUFXLENBQUUsTUFBTyxHQUFTLE1BQ25ELEVBQU0sZ0JBQWtCLFVBQVcsQ0FBRSxNQUFPLEdBQVMsT0FBUyxHQUM5RCxFQUFNLHlCQUEyQixVQUFXLENBQUUsTUFBTyxHQUFTLFFBQ3ZELEVBSVQsR0FBSSxHQUFTLEVBQU0sVUFBWSxFQUFNLGdCQUNyQyxNQUFJLElBQ0YsR0FBUyxHQUFjLEdBQ3ZCLEVBQVEsR0FBYyxHQUN0QixFQUFNLGNBQWdCLFVBQVcsQ0FBRSxNQUFPLEtBQ25DLEVBU1gsWUFBMkIsRUFBTyxFQUFPLENBQ3ZDLEFBQUksSUFDRixJQUFvQixHQUNwQixHQUFpQixJQVNuQixPQU5JLEdBQU8sRUFBTSxNQUFRLFFBQ3JCLEVBQVUsRUFBTSxTQUFXLEdBQzNCLEVBQWMsRUFBTyxLQUFPLEVBRTVCLEVBQVEsQ0FBRSxhQUFjLEtBQU0sWUFBYSxNQUMzQyxFQUFpQixHQUNaLEVBQUksRUFBTSxPQUFTLEVBQUcsR0FBSyxFQUFHLElBQ3JDLEVBQWUsS0FBSztBQUFBLFNBQWMsR0FBYSxFQUFNLEdBQUksSUFDekQsRUFBTSxhQUFlLEVBQU0sWUFFN0IsU0FBTSxZQUFjLEVBQU0sYUFBZSxLQUNsQyxFQUFjLEVBQWUsVUFBVSxLQUFLLElBSXJELFlBQXdCLEVBQU8sQ0FDN0IsR0FBSSxHQUFRLHNDQUFzQyxLQUFLLEVBQU0sT0FDN0QsR0FBSSxFQUFPLENBQ1QsR0FBSSxHQUFTLEVBQU0sR0FDZixFQUFPLENBQUMsRUFBTSxHQUNkLEVBQVMsQ0FBQyxFQUFNLEdBR2hCLEVBQVcsR0FBa0IsR0FHakMsR0FBSSxDQUFDLEdBQVksSUFBTSxHQUFHLFdBQVcsR0FDbkMsR0FBSSxDQUNGLEVBQVcsR0FBRyxhQUFhLEVBQVEsYUFDbkMsQ0FDQSxFQUFXLEdBS2YsR0FBSSxFQUFVLENBQ1osR0FBSSxHQUFPLEVBQVMsTUFBTSxrQkFBa0IsRUFBTyxHQUNuRCxHQUFJLEVBQ0YsTUFBTyxHQUFTLElBQU0sRUFBTztBQUFBLEVBQU8sRUFBTztBQUFBLEVBQ3pDLEdBQUksT0FBTSxHQUFRLEtBQUssS0FBTyxLQUl0QyxNQUFPLE1BR1QsWUFBNEIsRUFBTyxDQUNqQyxHQUFJLEdBQVMsR0FBZSxHQUd4QixFQUFTLEtBQ2IsQUFBSSxHQUFVLEVBQU8sU0FBVyxFQUFPLFFBQVEsYUFDN0MsRUFBTyxRQUFRLFlBQVksSUFHekIsR0FDRixTQUFRLFFBQ1IsUUFBUSxNQUFNLElBR2hCLFFBQVEsTUFBTSxFQUFNLE9BQ3BCLEdBQWtCLEdBR3BCLGFBQXNDLENBQ3BDLEdBQUksR0FBVyxRQUFRLEtBRXZCLFFBQVEsS0FBTyxTQUFVLEVBQU0sQ0FDN0IsR0FBSSxJQUFTLG9CQUFxQixDQUNoQyxHQUFJLEdBQVksVUFBVSxJQUFNLFVBQVUsR0FBRyxNQUN6QyxFQUFnQixLQUFLLFVBQVUsR0FBTSxPQUFTLEVBRWxELEdBQUksR0FBWSxDQUFDLEVBQ2YsTUFBTyxJQUFrQixVQUFVLElBSXZDLE1BQU8sR0FBUyxNQUFNLEtBQU0sWUFJaEMsR0FBSSxJQUErQixHQUFxQixNQUFNLEdBQzFELEdBQThCLEdBQW9CLE1BQU0sR0FFNUQsR0FBUSxhQUFlLEdBQ3ZCLEdBQVEsZUFBaUIsR0FDekIsR0FBUSxrQkFBb0IsR0FDNUIsR0FBUSxrQkFBb0IsR0FFNUIsR0FBUSxRQUFVLFNBQVMsRUFBUyxDQUdsQyxHQUZBLEVBQVUsR0FBVyxHQUVqQixFQUFRLGFBQ1YsSUFBYyxFQUFRLFlBQ2xCLENBQUMsT0FBUSxVQUFXLFFBQVEsUUFBUSxNQUFpQixJQUN2RCxLQUFNLElBQUksT0FBTSxlQUFpQixHQUFjLDZEQXlCbkQsR0FuQkksRUFBUSxjQUNOLEdBQVEsc0JBQ1YsSUFBcUIsT0FBUyxHQUdoQyxHQUFxQixRQUFRLEVBQVEsZUFLbkMsRUFBUSxtQkFDTixHQUFRLDJCQUNWLElBQW9CLE9BQVMsR0FHL0IsR0FBb0IsUUFBUSxFQUFRLG9CQUlsQyxFQUFRLGFBQWUsQ0FBQyxLQUFlLENBRXpDLEdBQUksR0FBUyxHQUFlLEdBQVEsVUFDaEMsRUFBVyxFQUFPLFVBQVUsU0FFaEMsQUFBSyxFQUFTLG9CQUNaLEdBQU8sVUFBVSxTQUFXLFNBQVMsRUFBUyxFQUFVLENBQ3RELFVBQWtCLEdBQVksRUFDOUIsR0FBZSxHQUFZLE9BQ3BCLEVBQVMsS0FBSyxLQUFNLEVBQVMsSUFHdEMsRUFBTyxVQUFVLFNBQVMsbUJBQXFCLElBZ0JuRCxHQVhLLElBQ0gsSUFBOEIsK0JBQWlDLEdBQzdELEVBQVEsNEJBQThCLElBSXJDLElBQ0gsSUFBMEIsR0FDMUIsTUFBTSxrQkFBb0IsSUFHeEIsQ0FBQyxHQUF1QixDQUMxQixHQUFJLEdBQWlCLDRCQUE4QixHQUNqRCxFQUFRLHlCQUEyQixHQUtyQyxHQUFJLENBRUYsR0FBSSxHQUFpQixHQUFlLEdBQVEsa0JBQzVDLEFBQUksRUFBZSxlQUFpQixJQUNsQyxHQUFpQixTQUVuQixFQVNGLEFBQUksR0FBa0IsTUFDcEIsSUFBd0IsR0FDeEIsUUFLTixHQUFRLHNCQUF3QixVQUFXLENBQ3pDLEdBQXFCLE9BQVMsRUFDOUIsR0FBb0IsT0FBUyxFQUU3QixHQUF1QixHQUE2QixNQUFNLEdBQzFELEdBQXNCLEdBQTRCLE1BQU0sR0FFeEQsR0FBb0IsR0FBWSxJQUNoQyxHQUFlLEdBQVksT0M3bUI3QixPQUFvQixTQ0ZiLFlBQXlCLEVBQXlDLENBQ3ZFLEdBQUksRUFBWSxRQUFVLEVBQzFCLE1BQU8sR0FBWSxjQUFjLFFBQVEsS0FBTSxHQUMzQyxPQUFPLGNBQWMsT0FBUyxFQUFLLFdBQVcsS0RFcEQsT0FBd0IsU0FJeEIsR0FBOEIsU0VUOUIsS0FBYyxVRllkLEFBQU8sUUFBSyxDQUNWLElBQUssNkVBSUwsaUJBQWtCLEVBQ2xCLGFBQWMsQ0FBQyxHQUFJLGtCQUFjLENBQUMsS0FBTSxPQUFPLGlCQUdqRCxXQUNHLFFBQVEsU0FDUixLQUFLLG9CQUNMLFFBQVEsY0FDUixPQUFPLEFBQUMsR0FBUyxDQUNoQixHQUFNLEdBQWMsQUFBTyxvQkFBaUIsQ0FDMUMsR0FBSSw2QkFDSixLQUFNLCtCQUVSLEdBQUksQ0FDRixHQUFNLEdBQVMsR0FBZSxHQUM5QixHQUFJLElBQVcsT0FBVyxLQUFNLElBQUksT0FBTSxTQUFTO0FBQUEsVUFBa0I7QUFBQSxHQUNyRSxRQUFRLElBQUksU0FDTCxFQUFQLENBQ0EsUUFBUSxNQUFNLEdBQ2QsQUFBTyxvQkFBaUIsVUFDeEIsQ0FDQSxFQUFZLFlBSWxCLFdBQVEsTUFBTSxRQUFRIiwKICAibmFtZXMiOiBbXQp9Cg==