country-flag-cli 0.0.9 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/cli.js +1 -0
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -62,3 +62,4 @@ PERFORMANCE OF THIS SOFTWARE.
62
62
  * https://github.com/felixge/node-stack-trace/
63
63
  * @license MIT
64
64
  */
65
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL2NvbW1hbmRlci9pbmRleC5qcyIsICIuLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHlwZXMvc3JjL2xvZ2xldmVsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9zZXNzaW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9zZXZlcml0eS50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9zcmMvc3RhdHVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy90cmFuc2FjdGlvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90eXBlcy9zcmMvdHJhbnNwb3J0LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3R5cGVzL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvYXN5bmMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL25vZGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2dsb2JhbC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvaXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2Jyb3dzZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3BvbHlmaWxsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9lcnJvci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvZHNuLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9sb2dnZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL21lbW8udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3N0YWNrdHJhY2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3N0cmluZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvb2JqZWN0LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3V0aWxzL3NyYy9zdXBwb3J0cy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvaW5zdHJ1bWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvbWlzYy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvcGF0aC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS91dGlscy9zcmMvc3luY3Byb21pc2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3Byb21pc2VidWZmZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL3RpbWUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdXRpbHMvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvc2NvcGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL3NyYy9zZXNzaW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvaHViLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2h1Yi9zcmMvc2Vzc2lvbmZsdXNoZXIudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvaHViL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9taW5pbWFsL3NyYy9pbmRleC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9hcGkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvaW50ZWdyYXRpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvYmFzZWNsaWVudC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy90cmFuc3BvcnRzL25vb3AudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvYmFzZWJhY2tlbmQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvcmVxdWVzdC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9zZGsudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvdmVyc2lvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9pbnRlZ3JhdGlvbnMvZnVuY3Rpb250b3N0cmluZy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9jb3JlL3NyYy9pbnRlZ3JhdGlvbnMvaW5ib3VuZGZpbHRlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvY29yZS9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L2NvcmUvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9scnVfbWFwL2xydS5qcyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy9zdGFja3RyYWNlLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3BhcnNlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvdmVyc2lvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy90cmFuc3BvcnRzL2Jhc2UvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvY29tbW9uLmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvYnJvd3Nlci5qcyIsICIuLi9ub2RlX21vZHVsZXMvaGFzLWZsYWcvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL3N1cHBvcnRzLWNvbG9yL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9kZWJ1Zy9zcmMvbm9kZS5qcyIsICIuLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2luZGV4LmpzIiwgIi4uL25vZGVfbW9kdWxlcy9hZ2VudC1iYXNlL3NyYy9wcm9taXNpZnkudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2FnZW50LWJhc2Uvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9odHRwcy1wcm94eS1hZ2VudC9zcmMvcGFyc2UtcHJveHktcmVzcG9uc2UudHMiLCAiLi4vbm9kZV9tb2R1bGVzL2h0dHBzLXByb3h5LWFnZW50L3NyYy9hZ2VudC50cyIsICIuLi9ub2RlX21vZHVsZXMvaHR0cHMtcHJveHktYWdlbnQvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3RyYW5zcG9ydHMvaHR0cC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy90cmFuc3BvcnRzL2h0dHBzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3RyYW5zcG9ydHMvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvYmFja2VuZC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy9jbGllbnQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2NvbnNvbGUudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL3V0aWxzL2h0dHAudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2h0dHAudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL3V0aWxzL2Vycm9yaGFuZGxpbmcudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL29udW5jYXVnaHRleGNlcHRpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL29udW5oYW5kbGVkcmVqZWN0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL2ludGVncmF0aW9ucy9saW5rZWRlcnJvcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL21vZHVsZXMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L25vZGUvc3JjL3Nkay50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS9ub2RlL3NyYy91dGlscy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9zcGFuc3RhdHVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL3V0aWxzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Vycm9ycy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9jb25zdGFudHMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvc3Bhbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy90cmFuc2FjdGlvbi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9pZGxldHJhbnNhY3Rpb24udHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvaHViZXh0ZW5zaW9ucy50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9pbnRlZ3JhdGlvbnMvbm9kZS9leHByZXNzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL3Bvc3RncmVzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL215c3FsLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2ludGVncmF0aW9ucy9ub2RlL21vbmdvLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvYmFja2dyb3VuZHRhYi50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL2JpbmRSZXBvcnRlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL2dlbmVyYXRlVW5pcXVlSUQudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci93ZWItdml0YWxzL2xpYi9pbml0TWV0cmljLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9saWIvb2JzZXJ2ZS50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvbGliL29uSGlkZGVuLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRDTFMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci93ZWItdml0YWxzL2xpYi9nZXRWaXNpYmlsaXR5V2F0Y2hlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3dlYi12aXRhbHMvZ2V0RklELnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvd2ViLXZpdGFscy9nZXRMQ1AudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvYnJvd3Nlci9tZXRyaWNzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvcmVxdWVzdC50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL3JvdXRlci50cyIsICIuLi9ub2RlX21vZHVsZXMvQHNlbnRyeS90cmFjaW5nL3NyYy9icm93c2VyL2Jyb3dzZXJ0cmFjaW5nLnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2Jyb3dzZXIvaW5kZXgudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvdHJhY2luZy9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9Ac2VudHJ5L3RyYWNpbmcvc3JjL2luZGV4LnRzIiwgIi4uL25vZGVfbW9kdWxlcy9jb29raWUvaW5kZXguanMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaGFuZGxlcnMudHMiLCAiLi4vbm9kZV9tb2R1bGVzL0BzZW50cnkvbm9kZS9zcmMvaW5kZXgudHMiLCAiLi4vc3JjL2NsaS50cyIsICIuLi9zcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG52YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnZXZlbnRzJykuRXZlbnRFbWl0dGVyO1xudmFyIHNwYXduID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLnNwYXduO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG52YXIgZGlybmFtZSA9IHBhdGguZGlybmFtZTtcbnZhciBiYXNlbmFtZSA9IHBhdGguYmFzZW5hbWU7XG52YXIgZnMgPSByZXF1aXJlKCdmcycpO1xuXG4vKipcbiAqIEluaGVyaXQgYENvbW1hbmRgIGZyb20gYEV2ZW50RW1pdHRlci5wcm90b3R5cGVgLlxuICovXG5cbnJlcXVpcmUoJ3V0aWwnKS5pbmhlcml0cyhDb21tYW5kLCBFdmVudEVtaXR0ZXIpO1xuXG4vKipcbiAqIEV4cG9zZSB0aGUgcm9vdCBjb21tYW5kLlxuICovXG5cbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IG5ldyBDb21tYW5kKCk7XG5cbi8qKlxuICogRXhwb3NlIGBDb21tYW5kYC5cbiAqL1xuXG5leHBvcnRzLkNvbW1hbmQgPSBDb21tYW5kO1xuXG4vKipcbiAqIEV4cG9zZSBgT3B0aW9uYC5cbiAqL1xuXG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBPcHRpb25gIHdpdGggdGhlIGdpdmVuIGBmbGFnc2AgYW5kIGBkZXNjcmlwdGlvbmAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZsYWdzXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbikge1xuICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gIHRoaXMucmVxdWlyZWQgPSBmbGFncy5pbmRleE9mKCc8JykgPj0gMDtcbiAgdGhpcy5vcHRpb25hbCA9IGZsYWdzLmluZGV4T2YoJ1snKSA+PSAwO1xuICB0aGlzLmJvb2wgPSBmbGFncy5pbmRleE9mKCctbm8tJykgPT09IC0xO1xuICBmbGFncyA9IGZsYWdzLnNwbGl0KC9bICx8XSsvKTtcbiAgaWYgKGZsYWdzLmxlbmd0aCA+IDEgJiYgIS9eW1s8XS8udGVzdChmbGFnc1sxXSkpIHRoaXMuc2hvcnQgPSBmbGFncy5zaGlmdCgpO1xuICB0aGlzLmxvbmcgPSBmbGFncy5zaGlmdCgpO1xuICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG59XG5cbi8qKlxuICogUmV0dXJuIG9wdGlvbiBuYW1lLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbk9wdGlvbi5wcm90b3R5cGUubmFtZSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5sb25nXG4gICAgLnJlcGxhY2UoJy0tJywgJycpXG4gICAgLnJlcGxhY2UoJ25vLScsICcnKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIG9wdGlvbiBuYW1lLCBpbiBhIGNhbWVsY2FzZSBmb3JtYXQgdGhhdCBjYW4gYmUgdXNlZFxuICogYXMgYSBvYmplY3QgYXR0cmlidXRlIGtleS5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5PcHRpb24ucHJvdG90eXBlLmF0dHJpYnV0ZU5hbWUgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGNhbWVsY2FzZSh0aGlzLm5hbWUoKSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIGBhcmdgIG1hdGNoZXMgdGhlIHNob3J0IG9yIGxvbmcgZmxhZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gYXJnXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuT3B0aW9uLnByb3RvdHlwZS5pcyA9IGZ1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdGhpcy5zaG9ydCA9PT0gYXJnIHx8IHRoaXMubG9uZyA9PT0gYXJnO1xufTtcblxuLyoqXG4gKiBJbml0aWFsaXplIGEgbmV3IGBDb21tYW5kYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBDb21tYW5kKG5hbWUpIHtcbiAgdGhpcy5jb21tYW5kcyA9IFtdO1xuICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgdGhpcy5fZXhlY3MgPSB7fTtcbiAgdGhpcy5fYWxsb3dVbmtub3duT3B0aW9uID0gZmFsc2U7XG4gIHRoaXMuX2FyZ3MgPSBbXTtcbiAgdGhpcy5fbmFtZSA9IG5hbWUgfHwgJyc7XG59XG5cbi8qKlxuICogQWRkIGNvbW1hbmQgYG5hbWVgLlxuICpcbiAqIFRoZSBgLmFjdGlvbigpYCBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gdGhlXG4gKiBjb21tYW5kIGBuYW1lYCBpcyBzcGVjaWZpZWQgdmlhIF9fQVJHVl9fLFxuICogYW5kIHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIHRoZVxuICogZnVuY3Rpb24gZm9yIGFjY2Vzcy5cbiAqXG4gKiBXaGVuIHRoZSBgbmFtZWAgaXMgXCIqXCIgYW4gdW4tbWF0Y2hlZCBjb21tYW5kXG4gKiB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJnLCBmb2xsb3dlZCBieVxuICogdGhlIHJlc3Qgb2YgX19BUkdWX18gcmVtYWluaW5nLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcHJvZ3JhbVxuICogICAgICAgIC52ZXJzaW9uKCcwLjAuMScpXG4gKiAgICAgICAgLm9wdGlvbignLUMsIC0tY2hkaXIgPHBhdGg+JywgJ2NoYW5nZSB0aGUgd29ya2luZyBkaXJlY3RvcnknKVxuICogICAgICAgIC5vcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnc2V0IGNvbmZpZyBwYXRoLiBkZWZhdWx0cyB0byAuL2RlcGxveS5jb25mJylcbiAqICAgICAgICAub3B0aW9uKCctVCwgLS1uby10ZXN0cycsICdpZ25vcmUgdGVzdCBob29rJylcbiAqXG4gKiAgICAgIHByb2dyYW1cbiAqICAgICAgICAuY29tbWFuZCgnc2V0dXAnKVxuICogICAgICAgIC5kZXNjcmlwdGlvbigncnVuIHJlbW90ZSBzZXR1cCBjb21tYW5kcycpXG4gKiAgICAgICAgLmFjdGlvbihmdW5jdGlvbigpIHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdzZXR1cCcpO1xuICogICAgICAgIH0pO1xuICpcbiAqICAgICAgcHJvZ3JhbVxuICogICAgICAgIC5jb21tYW5kKCdleGVjIDxjbWQ+JylcbiAqICAgICAgICAuZGVzY3JpcHRpb24oJ3J1biB0aGUgZ2l2ZW4gcmVtb3RlIGNvbW1hbmQnKVxuICogICAgICAgIC5hY3Rpb24oZnVuY3Rpb24oY21kKSB7XG4gKiAgICAgICAgICBjb25zb2xlLmxvZygnZXhlYyBcIiVzXCInLCBjbWQpO1xuICogICAgICAgIH0pO1xuICpcbiAqICAgICAgcHJvZ3JhbVxuICogICAgICAgIC5jb21tYW5kKCd0ZWFyZG93biA8ZGlyPiBbb3RoZXJEaXJzLi4uXScpXG4gKiAgICAgICAgLmRlc2NyaXB0aW9uKCdydW4gdGVhcmRvd24gY29tbWFuZHMnKVxuICogICAgICAgIC5hY3Rpb24oZnVuY3Rpb24oZGlyLCBvdGhlckRpcnMpIHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdkaXIgXCIlc1wiJywgZGlyKTtcbiAqICAgICAgICAgIGlmIChvdGhlckRpcnMpIHtcbiAqICAgICAgICAgICAgb3RoZXJEaXJzLmZvckVhY2goZnVuY3Rpb24gKG9EaXIpIHtcbiAqICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGlyIFwiJXNcIicsIG9EaXIpO1xuICogICAgICAgICAgICB9KTtcbiAqICAgICAgICAgIH1cbiAqICAgICAgICB9KTtcbiAqXG4gKiAgICAgIHByb2dyYW1cbiAqICAgICAgICAuY29tbWFuZCgnKicpXG4gKiAgICAgICAgLmRlc2NyaXB0aW9uKCdkZXBsb3kgdGhlIGdpdmVuIGVudicpXG4gKiAgICAgICAgLmFjdGlvbihmdW5jdGlvbihlbnYpIHtcbiAqICAgICAgICAgIGNvbnNvbGUubG9nKCdkZXBsb3lpbmcgXCIlc1wiJywgZW52KTtcbiAqICAgICAgICB9KTtcbiAqXG4gKiAgICAgIHByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcbiAgKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZGVzY10gZm9yIGdpdC1zdHlsZSBzdWItY29tbWFuZHNcbiAqIEByZXR1cm4ge0NvbW1hbmR9IHRoZSBuZXcgY29tbWFuZFxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5jb21tYW5kID0gZnVuY3Rpb24obmFtZSwgZGVzYywgb3B0cykge1xuICBpZiAodHlwZW9mIGRlc2MgPT09ICdvYmplY3QnICYmIGRlc2MgIT09IG51bGwpIHtcbiAgICBvcHRzID0gZGVzYztcbiAgICBkZXNjID0gbnVsbDtcbiAgfVxuICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgdmFyIGFyZ3MgPSBuYW1lLnNwbGl0KC8gKy8pO1xuICB2YXIgY21kID0gbmV3IENvbW1hbmQoYXJncy5zaGlmdCgpKTtcblxuICBpZiAoZGVzYykge1xuICAgIGNtZC5kZXNjcmlwdGlvbihkZXNjKTtcbiAgICB0aGlzLmV4ZWN1dGFibGVzID0gdHJ1ZTtcbiAgICB0aGlzLl9leGVjc1tjbWQuX25hbWVdID0gdHJ1ZTtcbiAgICBpZiAob3B0cy5pc0RlZmF1bHQpIHRoaXMuZGVmYXVsdEV4ZWN1dGFibGUgPSBjbWQuX25hbWU7XG4gIH1cbiAgY21kLl9ub0hlbHAgPSAhIW9wdHMubm9IZWxwO1xuICB0aGlzLmNvbW1hbmRzLnB1c2goY21kKTtcbiAgY21kLnBhcnNlRXhwZWN0ZWRBcmdzKGFyZ3MpO1xuICBjbWQucGFyZW50ID0gdGhpcztcblxuICBpZiAoZGVzYykgcmV0dXJuIHRoaXM7XG4gIHJldHVybiBjbWQ7XG59O1xuXG4vKipcbiAqIERlZmluZSBhcmd1bWVudCBzeW50YXggZm9yIHRoZSB0b3AtbGV2ZWwgY29tbWFuZC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmFyZ3VtZW50cyA9IGZ1bmN0aW9uKGRlc2MpIHtcbiAgcmV0dXJuIHRoaXMucGFyc2VFeHBlY3RlZEFyZ3MoZGVzYy5zcGxpdCgvICsvKSk7XG59O1xuXG4vKipcbiAqIEFkZCBhbiBpbXBsaWNpdCBgaGVscCBbY21kXWAgc3ViY29tbWFuZFxuICogd2hpY2ggaW52b2tlcyBgLS1oZWxwYCBmb3IgdGhlIGdpdmVuIGNvbW1hbmQuXG4gKlxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNvbW1hbmQoJ2hlbHAgW2NtZF0nLCAnZGlzcGxheSBoZWxwIGZvciBbY21kXScpO1xufTtcblxuLyoqXG4gKiBQYXJzZSBleHBlY3RlZCBgYXJnc2AuXG4gKlxuICogRm9yIGV4YW1wbGUgYFtcIlt0eXBlXVwiXWAgYmVjb21lcyBgW3sgcmVxdWlyZWQ6IGZhbHNlLCBuYW1lOiAndHlwZScgfV1gLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge0NvbW1hbmR9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5wYXJzZUV4cGVjdGVkQXJncyA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgaWYgKCFhcmdzLmxlbmd0aCkgcmV0dXJuO1xuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGFyZ3MuZm9yRWFjaChmdW5jdGlvbihhcmcpIHtcbiAgICB2YXIgYXJnRGV0YWlscyA9IHtcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgdmFyaWFkaWM6IGZhbHNlXG4gICAgfTtcblxuICAgIHN3aXRjaCAoYXJnWzBdKSB7XG4gICAgICBjYXNlICc8JzpcbiAgICAgICAgYXJnRGV0YWlscy5yZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIGFyZ0RldGFpbHMubmFtZSA9IGFyZy5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWyc6XG4gICAgICAgIGFyZ0RldGFpbHMubmFtZSA9IGFyZy5zbGljZSgxLCAtMSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlmIChhcmdEZXRhaWxzLm5hbWUubGVuZ3RoID4gMyAmJiBhcmdEZXRhaWxzLm5hbWUuc2xpY2UoLTMpID09PSAnLi4uJykge1xuICAgICAgYXJnRGV0YWlscy52YXJpYWRpYyA9IHRydWU7XG4gICAgICBhcmdEZXRhaWxzLm5hbWUgPSBhcmdEZXRhaWxzLm5hbWUuc2xpY2UoMCwgLTMpO1xuICAgIH1cbiAgICBpZiAoYXJnRGV0YWlscy5uYW1lKSB7XG4gICAgICBzZWxmLl9hcmdzLnB1c2goYXJnRGV0YWlscyk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJlZ2lzdGVyIGNhbGxiYWNrIGBmbmAgZm9yIHRoZSBjb21tYW5kLlxuICpcbiAqIEV4YW1wbGVzOlxuICpcbiAqICAgICAgcHJvZ3JhbVxuICogICAgICAgIC5jb21tYW5kKCdoZWxwJylcbiAqICAgICAgICAuZGVzY3JpcHRpb24oJ2Rpc3BsYXkgdmVyYm9zZSBoZWxwJylcbiAqICAgICAgICAuYWN0aW9uKGZ1bmN0aW9uKCkge1xuICogICAgICAgICAgIC8vIG91dHB1dCBoZWxwIGhlcmVcbiAqICAgICAgICB9KTtcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7Q29tbWFuZH0gZm9yIGNoYWluaW5nXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmFjdGlvbiA9IGZ1bmN0aW9uKGZuKSB7XG4gIHZhciBzZWxmID0gdGhpcztcbiAgdmFyIGxpc3RlbmVyID0gZnVuY3Rpb24oYXJncywgdW5rbm93bikge1xuICAgIC8vIFBhcnNlIGFueSBzby1mYXIgdW5rbm93biBvcHRpb25zXG4gICAgYXJncyA9IGFyZ3MgfHwgW107XG4gICAgdW5rbm93biA9IHVua25vd24gfHwgW107XG5cbiAgICB2YXIgcGFyc2VkID0gc2VsZi5wYXJzZU9wdGlvbnModW5rbm93bik7XG5cbiAgICAvLyBPdXRwdXQgaGVscCBpZiBuZWNlc3NhcnlcbiAgICBvdXRwdXRIZWxwSWZOZWNlc3Nhcnkoc2VsZiwgcGFyc2VkLnVua25vd24pO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIHN0aWxsIGFueSB1bmtub3duIG9wdGlvbnMsIHRoZW4gd2Ugc2ltcGx5XG4gICAgLy8gZGllLCB1bmxlc3Mgc29tZW9uZSBhc2tlZCBmb3IgaGVscCwgaW4gd2hpY2ggY2FzZSB3ZSBnaXZlIGl0XG4gICAgLy8gdG8gdGhlbSwgYW5kIHRoZW4gd2UgZGllLlxuICAgIGlmIChwYXJzZWQudW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICBzZWxmLnVua25vd25PcHRpb24ocGFyc2VkLnVua25vd25bMF0pO1xuICAgIH1cblxuICAgIC8vIExlZnRvdmVyIGFyZ3VtZW50cyBuZWVkIHRvIGJlIHB1c2hlZCBiYWNrLiBGaXhlcyBpc3N1ZSAjNTZcbiAgICBpZiAocGFyc2VkLmFyZ3MubGVuZ3RoKSBhcmdzID0gcGFyc2VkLmFyZ3MuY29uY2F0KGFyZ3MpO1xuXG4gICAgc2VsZi5fYXJncy5mb3JFYWNoKGZ1bmN0aW9uKGFyZywgaSkge1xuICAgICAgaWYgKGFyZy5yZXF1aXJlZCAmJiBhcmdzW2ldID09IG51bGwpIHtcbiAgICAgICAgc2VsZi5taXNzaW5nQXJndW1lbnQoYXJnLm5hbWUpO1xuICAgICAgfSBlbHNlIGlmIChhcmcudmFyaWFkaWMpIHtcbiAgICAgICAgaWYgKGkgIT09IHNlbGYuX2FyZ3MubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIHNlbGYudmFyaWFkaWNBcmdOb3RMYXN0KGFyZy5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFyZ3NbaV0gPSBhcmdzLnNwbGljZShpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFsd2F5cyBhcHBlbmQgb3Vyc2VsdmVzIHRvIHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50cyxcbiAgICAvLyB0byBtYWtlIHN1cmUgd2UgbWF0Y2ggdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhlIHVzZXJcbiAgICAvLyBleHBlY3RzXG4gICAgaWYgKHNlbGYuX2FyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW3NlbGYuX2FyZ3MubGVuZ3RoXSA9IHNlbGY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MucHVzaChzZWxmKTtcbiAgICB9XG5cbiAgICBmbi5hcHBseShzZWxmLCBhcmdzKTtcbiAgfTtcbiAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50IHx8IHRoaXM7XG4gIHZhciBuYW1lID0gcGFyZW50ID09PSB0aGlzID8gJyonIDogdGhpcy5fbmFtZTtcbiAgcGFyZW50Lm9uKCdjb21tYW5kOicgKyBuYW1lLCBsaXN0ZW5lcik7XG4gIGlmICh0aGlzLl9hbGlhcykgcGFyZW50Lm9uKCdjb21tYW5kOicgKyB0aGlzLl9hbGlhcywgbGlzdGVuZXIpO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogRGVmaW5lIG9wdGlvbiB3aXRoIGBmbGFnc2AsIGBkZXNjcmlwdGlvbmAgYW5kIG9wdGlvbmFsXG4gKiBjb2VyY2lvbiBgZm5gLlxuICpcbiAqIFRoZSBgZmxhZ3NgIHN0cmluZyBzaG91bGQgY29udGFpbiBib3RoIHRoZSBzaG9ydCBhbmQgbG9uZyBmbGFncyxcbiAqIHNlcGFyYXRlZCBieSBjb21tYSwgYSBwaXBlIG9yIHNwYWNlLiBUaGUgZm9sbG93aW5nIGFyZSBhbGwgdmFsaWRcbiAqIGFsbCB3aWxsIG91dHB1dCB0aGlzIHdheSB3aGVuIGAtLWhlbHBgIGlzIHVzZWQuXG4gKlxuICogICAgXCItcCwgLS1wZXBwZXJcIlxuICogICAgXCItcHwtLXBlcHBlclwiXG4gKiAgICBcIi1wIC0tcGVwcGVyXCJcbiAqXG4gKiBFeGFtcGxlczpcbiAqXG4gKiAgICAgLy8gc2ltcGxlIGJvb2xlYW4gZGVmYXVsdGluZyB0byBmYWxzZVxuICogICAgIHByb2dyYW0ub3B0aW9uKCctcCwgLS1wZXBwZXInLCAnYWRkIHBlcHBlcicpO1xuICpcbiAqICAgICAtLXBlcHBlclxuICogICAgIHByb2dyYW0ucGVwcGVyXG4gKiAgICAgLy8gPT4gQm9vbGVhblxuICpcbiAqICAgICAvLyBzaW1wbGUgYm9vbGVhbiBkZWZhdWx0aW5nIHRvIHRydWVcbiAqICAgICBwcm9ncmFtLm9wdGlvbignLUMsIC0tbm8tY2hlZXNlJywgJ3JlbW92ZSBjaGVlc2UnKTtcbiAqXG4gKiAgICAgcHJvZ3JhbS5jaGVlc2VcbiAqICAgICAvLyA9PiB0cnVlXG4gKlxuICogICAgIC0tbm8tY2hlZXNlXG4gKiAgICAgcHJvZ3JhbS5jaGVlc2VcbiAqICAgICAvLyA9PiBmYWxzZVxuICpcbiAqICAgICAvLyByZXF1aXJlZCBhcmd1bWVudFxuICogICAgIHByb2dyYW0ub3B0aW9uKCctQywgLS1jaGRpciA8cGF0aD4nLCAnY2hhbmdlIHRoZSB3b3JraW5nIGRpcmVjdG9yeScpO1xuICpcbiAqICAgICAtLWNoZGlyIC90bXBcbiAqICAgICBwcm9ncmFtLmNoZGlyXG4gKiAgICAgLy8gPT4gXCIvdG1wXCJcbiAqXG4gKiAgICAgLy8gb3B0aW9uYWwgYXJndW1lbnRcbiAqICAgICBwcm9ncmFtLm9wdGlvbignLWMsIC0tY2hlZXNlIFt0eXBlXScsICdhZGQgY2hlZXNlIFttYXJibGVdJyk7XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZsYWdzXG4gKiBAcGFyYW0ge1N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb258Kn0gW2ZuXSBvciBkZWZhdWx0XG4gKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdXG4gKiBAcmV0dXJuIHtDb21tYW5kfSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUub3B0aW9uID0gZnVuY3Rpb24oZmxhZ3MsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gIHZhciBzZWxmID0gdGhpcyxcbiAgICBvcHRpb24gPSBuZXcgT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiksXG4gICAgb25hbWUgPSBvcHRpb24ubmFtZSgpLFxuICAgIG5hbWUgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuXG4gIC8vIGRlZmF1bHQgYXMgM3JkIGFyZ1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKGZuIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgICB2YXIgcmVnZXggPSBmbjtcbiAgICAgIGZuID0gZnVuY3Rpb24odmFsLCBkZWYpIHtcbiAgICAgICAgdmFyIG0gPSByZWdleC5leGVjKHZhbCk7XG4gICAgICAgIHJldHVybiBtID8gbVswXSA6IGRlZjtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IGZuO1xuICAgICAgZm4gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByZWFzc2lnbiBkZWZhdWx0IHZhbHVlIG9ubHkgZm9yIC0tbm8tKiwgW29wdGlvbmFsXSwgb3IgPHJlcXVpcmVkPlxuICBpZiAoIW9wdGlvbi5ib29sIHx8IG9wdGlvbi5vcHRpb25hbCB8fCBvcHRpb24ucmVxdWlyZWQpIHtcbiAgICAvLyB3aGVuIC0tbm8tKiB3ZSBtYWtlIHN1cmUgZGVmYXVsdCBpcyB0cnVlXG4gICAgaWYgKCFvcHRpb24uYm9vbCkgZGVmYXVsdFZhbHVlID0gdHJ1ZTtcbiAgICAvLyBwcmVhc3NpZ24gb25seSBpZiB3ZSBoYXZlIGEgZGVmYXVsdFxuICAgIGlmIChkZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2VsZltuYW1lXSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIG9wdGlvbi5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gcmVnaXN0ZXIgdGhlIG9wdGlvblxuICB0aGlzLm9wdGlvbnMucHVzaChvcHRpb24pO1xuXG4gIC8vIHdoZW4gaXQncyBwYXNzZWQgYXNzaWduIHRoZSB2YWx1ZVxuICAvLyBhbmQgY29uZGl0aW9uYWxseSBpbnZva2UgdGhlIGNhbGxiYWNrXG4gIHRoaXMub24oJ29wdGlvbjonICsgb25hbWUsIGZ1bmN0aW9uKHZhbCkge1xuICAgIC8vIGNvZXJjaW9uXG4gICAgaWYgKHZhbCAhPT0gbnVsbCAmJiBmbikge1xuICAgICAgdmFsID0gZm4odmFsLCBzZWxmW25hbWVdID09PSB1bmRlZmluZWQgPyBkZWZhdWx0VmFsdWUgOiBzZWxmW25hbWVdKTtcbiAgICB9XG5cbiAgICAvLyB1bmFzc2lnbmVkIG9yIGJvb2xcbiAgICBpZiAodHlwZW9mIHNlbGZbbmFtZV0gPT09ICdib29sZWFuJyB8fCB0eXBlb2Ygc2VsZltuYW1lXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGlmIG5vIHZhbHVlLCBib29sIHRydWUsIGFuZCB3ZSBoYXZlIGEgZGVmYXVsdCwgdGhlbiB1c2UgaXQhXG4gICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgc2VsZltuYW1lXSA9IG9wdGlvbi5ib29sXG4gICAgICAgICAgPyBkZWZhdWx0VmFsdWUgfHwgdHJ1ZVxuICAgICAgICAgIDogZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxmW25hbWVdID0gdmFsO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsICE9PSBudWxsKSB7XG4gICAgICAvLyByZWFzc2lnblxuICAgICAgc2VsZltuYW1lXSA9IHZhbDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBbGxvdyB1bmtub3duIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZS5cbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGFyZyBpZiBgdHJ1ZWAgb3Igb21pdHRlZCwgbm8gZXJyb3Igd2lsbCBiZSB0aHJvd25cbiAqIGZvciB1bmtub3duIG9wdGlvbnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5Db21tYW5kLnByb3RvdHlwZS5hbGxvd1Vua25vd25PcHRpb24gPSBmdW5jdGlvbihhcmcpIHtcbiAgdGhpcy5fYWxsb3dVbmtub3duT3B0aW9uID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCB8fCBhcmc7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBQYXJzZSBgYXJndmAsIHNldHRpbmdzIG9wdGlvbnMgYW5kIGludm9raW5nIGNvbW1hbmRzIHdoZW4gZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmd2XG4gKiBAcmV0dXJuIHtDb21tYW5kfSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbihhcmd2KSB7XG4gIC8vIGltcGxpY2l0IGhlbHBcbiAgaWYgKHRoaXMuZXhlY3V0YWJsZXMpIHRoaXMuYWRkSW1wbGljaXRIZWxwQ29tbWFuZCgpO1xuXG4gIC8vIHN0b3JlIHJhdyBhcmdzXG4gIHRoaXMucmF3QXJncyA9IGFyZ3Y7XG5cbiAgLy8gZ3Vlc3MgbmFtZVxuICB0aGlzLl9uYW1lID0gdGhpcy5fbmFtZSB8fCBiYXNlbmFtZShhcmd2WzFdLCAnLmpzJyk7XG5cbiAgLy8gZ2l0aHViLXN0eWxlIHN1Yi1jb21tYW5kcyB3aXRoIG5vIHN1Yi1jb21tYW5kXG4gIGlmICh0aGlzLmV4ZWN1dGFibGVzICYmIGFyZ3YubGVuZ3RoIDwgMyAmJiAhdGhpcy5kZWZhdWx0RXhlY3V0YWJsZSkge1xuICAgIC8vIHRoaXMgdXNlciBuZWVkcyBoZWxwXG4gICAgYXJndi5wdXNoKCctLWhlbHAnKTtcbiAgfVxuXG4gIC8vIHByb2Nlc3MgYXJndlxuICB2YXIgcGFyc2VkID0gdGhpcy5wYXJzZU9wdGlvbnModGhpcy5ub3JtYWxpemUoYXJndi5zbGljZSgyKSkpO1xuICB2YXIgYXJncyA9IHRoaXMuYXJncyA9IHBhcnNlZC5hcmdzO1xuXG4gIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlQXJncyh0aGlzLmFyZ3MsIHBhcnNlZC51bmtub3duKTtcblxuICAvLyBleGVjdXRhYmxlIHN1Yi1jb21tYW5kc1xuICB2YXIgbmFtZSA9IHJlc3VsdC5hcmdzWzBdO1xuXG4gIHZhciBhbGlhc0NvbW1hbmQgPSBudWxsO1xuICAvLyBjaGVjayBhbGlhcyBvZiBzdWIgY29tbWFuZHNcbiAgaWYgKG5hbWUpIHtcbiAgICBhbGlhc0NvbW1hbmQgPSB0aGlzLmNvbW1hbmRzLmZpbHRlcihmdW5jdGlvbihjb21tYW5kKSB7XG4gICAgICByZXR1cm4gY29tbWFuZC5hbGlhcygpID09PSBuYW1lO1xuICAgIH0pWzBdO1xuICB9XG5cbiAgaWYgKHRoaXMuX2V4ZWNzW25hbWVdID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YkNvbW1hbmQoYXJndiwgYXJncywgcGFyc2VkLnVua25vd24pO1xuICB9IGVsc2UgaWYgKGFsaWFzQ29tbWFuZCkge1xuICAgIC8vIGlzIGFsaWFzIG9mIGEgc3ViQ29tbWFuZFxuICAgIGFyZ3NbMF0gPSBhbGlhc0NvbW1hbmQuX25hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YkNvbW1hbmQoYXJndiwgYXJncywgcGFyc2VkLnVua25vd24pO1xuICB9IGVsc2UgaWYgKHRoaXMuZGVmYXVsdEV4ZWN1dGFibGUpIHtcbiAgICAvLyB1c2UgdGhlIGRlZmF1bHQgc3ViY29tbWFuZFxuICAgIGFyZ3MudW5zaGlmdCh0aGlzLmRlZmF1bHRFeGVjdXRhYmxlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlU3ViQ29tbWFuZChhcmd2LCBhcmdzLCBwYXJzZWQudW5rbm93bik7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBFeGVjdXRlIGEgc3ViLWNvbW1hbmQgZXhlY3V0YWJsZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmd2XG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcGFyYW0ge0FycmF5fSB1bmtub3duXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5leGVjdXRlU3ViQ29tbWFuZCA9IGZ1bmN0aW9uKGFyZ3YsIGFyZ3MsIHVua25vd24pIHtcbiAgYXJncyA9IGFyZ3MuY29uY2F0KHVua25vd24pO1xuXG4gIGlmICghYXJncy5sZW5ndGgpIHRoaXMuaGVscCgpO1xuICBpZiAoYXJnc1swXSA9PT0gJ2hlbHAnICYmIGFyZ3MubGVuZ3RoID09PSAxKSB0aGlzLmhlbHAoKTtcblxuICAvLyA8Y21kPiAtLWhlbHBcbiAgaWYgKGFyZ3NbMF0gPT09ICdoZWxwJykge1xuICAgIGFyZ3NbMF0gPSBhcmdzWzFdO1xuICAgIGFyZ3NbMV0gPSAnLS1oZWxwJztcbiAgfVxuXG4gIC8vIGV4ZWN1dGFibGVcbiAgdmFyIGYgPSBhcmd2WzFdO1xuICAvLyBuYW1lIG9mIHRoZSBzdWJjb21tYW5kLCBsaW5rIGBwbS1pbnN0YWxsYFxuICB2YXIgYmluID0gYmFzZW5hbWUoZiwgcGF0aC5leHRuYW1lKGYpKSArICctJyArIGFyZ3NbMF07XG5cbiAgLy8gSW4gY2FzZSBvZiBnbG9iYWxseSBpbnN0YWxsZWQsIGdldCB0aGUgYmFzZSBkaXIgd2hlcmUgZXhlY3V0YWJsZVxuICAvLyAgc3ViY29tbWFuZCBmaWxlIHNob3VsZCBiZSBsb2NhdGVkIGF0XG4gIHZhciBiYXNlRGlyO1xuXG4gIHZhciByZXNvbHZlZExpbmsgPSBmcy5yZWFscGF0aFN5bmMoZik7XG5cbiAgYmFzZURpciA9IGRpcm5hbWUocmVzb2x2ZWRMaW5rKTtcblxuICAvLyBwcmVmZXIgbG9jYWwgYC4vPGJpbj5gIHRvIGJpbiBpbiB0aGUgJFBBVEhcbiAgdmFyIGxvY2FsQmluID0gcGF0aC5qb2luKGJhc2VEaXIsIGJpbik7XG5cbiAgLy8gd2hldGhlciBiaW4gZmlsZSBpcyBhIGpzIHNjcmlwdCB3aXRoIGV4cGxpY2l0IGAuanNgIG9yIGAudHNgIGV4dGVuc2lvblxuICB2YXIgaXNFeHBsaWNpdEpTID0gZmFsc2U7XG4gIGlmIChleGlzdHMobG9jYWxCaW4gKyAnLmpzJykpIHtcbiAgICBiaW4gPSBsb2NhbEJpbiArICcuanMnO1xuICAgIGlzRXhwbGljaXRKUyA9IHRydWU7XG4gIH0gZWxzZSBpZiAoZXhpc3RzKGxvY2FsQmluICsgJy50cycpKSB7XG4gICAgYmluID0gbG9jYWxCaW4gKyAnLnRzJztcbiAgICBpc0V4cGxpY2l0SlMgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGV4aXN0cyhsb2NhbEJpbikpIHtcbiAgICBiaW4gPSBsb2NhbEJpbjtcbiAgfVxuXG4gIGFyZ3MgPSBhcmdzLnNsaWNlKDEpO1xuXG4gIHZhciBwcm9jO1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgIGlmIChpc0V4cGxpY2l0SlMpIHtcbiAgICAgIGFyZ3MudW5zaGlmdChiaW4pO1xuICAgICAgLy8gYWRkIGV4ZWN1dGFibGUgYXJndW1lbnRzIHRvIHNwYXduXG4gICAgICBhcmdzID0gKHByb2Nlc3MuZXhlY0FyZ3YgfHwgW10pLmNvbmNhdChhcmdzKTtcblxuICAgICAgcHJvYyA9IHNwYXduKHByb2Nlc3MuYXJndlswXSwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnLCBjdXN0b21GZHM6IFswLCAxLCAyXSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvYyA9IHNwYXduKGJpbiwgYXJncywgeyBzdGRpbzogJ2luaGVyaXQnLCBjdXN0b21GZHM6IFswLCAxLCAyXSB9KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXJncy51bnNoaWZ0KGJpbik7XG4gICAgcHJvYyA9IHNwYXduKHByb2Nlc3MuZXhlY1BhdGgsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgfVxuXG4gIHZhciBzaWduYWxzID0gWydTSUdVU1IxJywgJ1NJR1VTUjInLCAnU0lHVEVSTScsICdTSUdJTlQnLCAnU0lHSFVQJ107XG4gIHNpZ25hbHMuZm9yRWFjaChmdW5jdGlvbihzaWduYWwpIHtcbiAgICBwcm9jZXNzLm9uKHNpZ25hbCwgZnVuY3Rpb24oKSB7XG4gICAgICBpZiAocHJvYy5raWxsZWQgPT09IGZhbHNlICYmIHByb2MuZXhpdENvZGUgPT09IG51bGwpIHtcbiAgICAgICAgcHJvYy5raWxsKHNpZ25hbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBwcm9jLm9uKCdjbG9zZScsIHByb2Nlc3MuZXhpdC5iaW5kKHByb2Nlc3MpKTtcbiAgcHJvYy5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjogJXMoMSkgZG9lcyBub3QgZXhpc3QsIHRyeSAtLWhlbHAnLCBiaW4pO1xuICAgIH0gZWxzZSBpZiAoZXJyLmNvZGUgPT09ICdFQUNDRVMnKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdlcnJvcjogJXMoMSkgbm90IGV4ZWN1dGFibGUuIHRyeSBjaG1vZCBvciBydW4gd2l0aCByb290JywgYmluKTtcbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9KTtcblxuICAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCBwcm9jZXNzXG4gIHRoaXMucnVubmluZ0NvbW1hbmQgPSBwcm9jO1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYGFyZ3NgLCBzcGxpdHRpbmcgam9pbmVkIHNob3J0IGZsYWdzLiBGb3IgZXhhbXBsZVxuICogdGhlIGFyZyBcIi1hYmNcIiBpcyBlcXVpdmFsZW50IHRvIFwiLWEgLWIgLWNcIi5cbiAqIFRoaXMgYWxzbyBub3JtYWxpemVzIGVxdWFsIHNpZ24gYW5kIHNwbGl0cyBcIi0tYWJjPWRlZlwiIGludG8gXCItLWFiYyBkZWZcIi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKGFyZ3MpIHtcbiAgdmFyIHJldCA9IFtdLFxuICAgIGFyZyxcbiAgICBsYXN0T3B0LFxuICAgIGluZGV4O1xuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBhcmdzLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgYXJnID0gYXJnc1tpXTtcbiAgICBpZiAoaSA+IDApIHtcbiAgICAgIGxhc3RPcHQgPSB0aGlzLm9wdGlvbkZvcihhcmdzW2kgLSAxXSk7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgLy8gSG9ub3Igb3B0aW9uIHRlcm1pbmF0b3JcbiAgICAgIHJldCA9IHJldC5jb25jYXQoYXJncy5zbGljZShpKSk7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKGxhc3RPcHQgJiYgbGFzdE9wdC5yZXF1aXJlZCkge1xuICAgICAgcmV0LnB1c2goYXJnKTtcbiAgICB9IGVsc2UgaWYgKGFyZy5sZW5ndGggPiAxICYmIGFyZ1swXSA9PT0gJy0nICYmIGFyZ1sxXSAhPT0gJy0nKSB7XG4gICAgICBhcmcuc2xpY2UoMSkuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24oYykge1xuICAgICAgICByZXQucHVzaCgnLScgKyBjKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoL14tLS8udGVzdChhcmcpICYmIH4oaW5kZXggPSBhcmcuaW5kZXhPZignPScpKSkge1xuICAgICAgcmV0LnB1c2goYXJnLnNsaWNlKDAsIGluZGV4KSwgYXJnLnNsaWNlKGluZGV4ICsgMSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXQucHVzaChhcmcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXQ7XG59O1xuXG4vKipcbiAqIFBhcnNlIGNvbW1hbmQgYGFyZ3NgLlxuICpcbiAqIFdoZW4gbGlzdGVuZXIocykgYXJlIGF2YWlsYWJsZSB0aG9zZVxuICogY2FsbGJhY2tzIGFyZSBpbnZva2VkLCBvdGhlcndpc2UgdGhlIFwiKlwiXG4gKiBldmVudCBpcyBlbWl0dGVkIGFuZCB0aG9zZSBhY3Rpb25zIGFyZSBpbnZva2VkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3NcbiAqIEByZXR1cm4ge0NvbW1hbmR9IGZvciBjaGFpbmluZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFyc2VBcmdzID0gZnVuY3Rpb24oYXJncywgdW5rbm93bikge1xuICB2YXIgbmFtZTtcblxuICBpZiAoYXJncy5sZW5ndGgpIHtcbiAgICBuYW1lID0gYXJnc1swXTtcbiAgICBpZiAodGhpcy5saXN0ZW5lcnMoJ2NvbW1hbmQ6JyArIG5hbWUpLmxlbmd0aCkge1xuICAgICAgdGhpcy5lbWl0KCdjb21tYW5kOicgKyBhcmdzLnNoaWZ0KCksIGFyZ3MsIHVua25vd24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoJ2NvbW1hbmQ6KicsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXRwdXRIZWxwSWZOZWNlc3NhcnkodGhpcywgdW5rbm93bik7XG5cbiAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vIGFyZ3MgYW5kIHdlIGhhdmUgdW5rbm93biBvcHRpb25zLFxuICAgIC8vIHRoZW4gdGhleSBhcmUgZXh0cmFuZW91cyBhbmQgd2UgbmVlZCB0byBlcnJvci5cbiAgICBpZiAodW5rbm93bi5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnVua25vd25PcHRpb24odW5rbm93blswXSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICB0aGlzLl9hcmdzLmZpbHRlcihmdW5jdGlvbihhKSB7IHJldHVybiBhLnJlcXVpcmVkOyB9KS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuZW1pdCgnY29tbWFuZDoqJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhbiBvcHRpb24gbWF0Y2hpbmcgYGFyZ2AgaWYgYW55LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBhcmdcbiAqIEByZXR1cm4ge09wdGlvbn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLm9wdGlvbkZvciA9IGZ1bmN0aW9uKGFyZykge1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5vcHRpb25zLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXMub3B0aW9uc1tpXS5pcyhhcmcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2ldO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBQYXJzZSBvcHRpb25zIGZyb20gYGFyZ3ZgIHJldHVybmluZyBgYXJndmBcbiAqIHZvaWQgb2YgdGhlc2Ugb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcmd2XG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFyc2VPcHRpb25zID0gZnVuY3Rpb24oYXJndikge1xuICB2YXIgYXJncyA9IFtdLFxuICAgIGxlbiA9IGFyZ3YubGVuZ3RoLFxuICAgIGxpdGVyYWwsXG4gICAgb3B0aW9uLFxuICAgIGFyZztcblxuICB2YXIgdW5rbm93bk9wdGlvbnMgPSBbXTtcblxuICAvLyBwYXJzZSBvcHRpb25zXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBhcmcgPSBhcmd2W2ldO1xuXG4gICAgLy8gbGl0ZXJhbCBhcmdzIGFmdGVyIC0tXG4gICAgaWYgKGxpdGVyYWwpIHtcbiAgICAgIGFyZ3MucHVzaChhcmcpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGFyZyA9PT0gJy0tJykge1xuICAgICAgbGl0ZXJhbCA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIG1hdGNoaW5nIE9wdGlvblxuICAgIG9wdGlvbiA9IHRoaXMub3B0aW9uRm9yKGFyZyk7XG5cbiAgICAvLyBvcHRpb24gaXMgZGVmaW5lZFxuICAgIGlmIChvcHRpb24pIHtcbiAgICAgIC8vIHJlcXVpcmVzIGFyZ1xuICAgICAgaWYgKG9wdGlvbi5yZXF1aXJlZCkge1xuICAgICAgICBhcmcgPSBhcmd2WysraV07XG4gICAgICAgIGlmIChhcmcgPT0gbnVsbCkgcmV0dXJuIHRoaXMub3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbik7XG4gICAgICAgIHRoaXMuZW1pdCgnb3B0aW9uOicgKyBvcHRpb24ubmFtZSgpLCBhcmcpO1xuICAgICAgLy8gb3B0aW9uYWwgYXJnXG4gICAgICB9IGVsc2UgaWYgKG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgICBhcmcgPSBhcmd2W2kgKyAxXTtcbiAgICAgICAgaWYgKGFyZyA9PSBudWxsIHx8IChhcmdbMF0gPT09ICctJyAmJiBhcmcgIT09ICctJykpIHtcbiAgICAgICAgICBhcmcgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICsraTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVtaXQoJ29wdGlvbjonICsgb3B0aW9uLm5hbWUoKSwgYXJnKTtcbiAgICAgIC8vIGJvb2xcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZW1pdCgnb3B0aW9uOicgKyBvcHRpb24ubmFtZSgpKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGxvb2tzIGxpa2UgYW4gb3B0aW9uXG4gICAgaWYgKGFyZy5sZW5ndGggPiAxICYmIGFyZ1swXSA9PT0gJy0nKSB7XG4gICAgICB1bmtub3duT3B0aW9ucy5wdXNoKGFyZyk7XG5cbiAgICAgIC8vIElmIHRoZSBuZXh0IGFyZ3VtZW50IGxvb2tzIGxpa2UgaXQgbWlnaHQgYmVcbiAgICAgIC8vIGFuIGFyZ3VtZW50IGZvciB0aGlzIG9wdGlvbiwgd2UgcGFzcyBpdCBvbi5cbiAgICAgIC8vIElmIGl0IGlzbid0LCB0aGVuIGl0J2xsIHNpbXBseSBiZSBpZ25vcmVkXG4gICAgICBpZiAoKGkgKyAxKSA8IGFyZ3YubGVuZ3RoICYmIGFyZ3ZbaSArIDFdWzBdICE9PSAnLScpIHtcbiAgICAgICAgdW5rbm93bk9wdGlvbnMucHVzaChhcmd2WysraV0pO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gYXJnXG4gICAgYXJncy5wdXNoKGFyZyk7XG4gIH1cblxuICByZXR1cm4geyBhcmdzOiBhcmdzLCB1bmtub3duOiB1bmtub3duT3B0aW9ucyB9O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgb3B0aW9ucyBhcyBrZXktdmFsdWUgcGFpcnNcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAYXBpIHB1YmxpY1xuICovXG5Db21tYW5kLnByb3RvdHlwZS5vcHRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZXN1bHQgPSB7fSxcbiAgICBsZW4gPSB0aGlzLm9wdGlvbnMubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICB2YXIga2V5ID0gdGhpcy5vcHRpb25zW2ldLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICByZXN1bHRba2V5XSA9IGtleSA9PT0gdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPyB0aGlzLl92ZXJzaW9uIDogdGhpc1trZXldO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEFyZ3VtZW50IGBuYW1lYCBpcyBtaXNzaW5nLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5taXNzaW5nQXJndW1lbnQgPSBmdW5jdGlvbihuYW1lKSB7XG4gIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogbWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCBgJXMnXCIsIG5hbWUpO1xuICBwcm9jZXNzLmV4aXQoMSk7XG59O1xuXG4vKipcbiAqIGBPcHRpb25gIGlzIG1pc3NpbmcgYW4gYXJndW1lbnQsIGJ1dCByZWNlaXZlZCBgZmxhZ2Agb3Igbm90aGluZy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gb3B0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gZmxhZ1xuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUub3B0aW9uTWlzc2luZ0FyZ3VtZW50ID0gZnVuY3Rpb24ob3B0aW9uLCBmbGFnKSB7XG4gIGlmIChmbGFnKSB7XG4gICAgY29uc29sZS5lcnJvcihcImVycm9yOiBvcHRpb24gYCVzJyBhcmd1bWVudCBtaXNzaW5nLCBnb3QgYCVzJ1wiLCBvcHRpb24uZmxhZ3MsIGZsYWcpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogb3B0aW9uIGAlcycgYXJndW1lbnQgbWlzc2luZ1wiLCBvcHRpb24uZmxhZ3MpO1xuICB9XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn07XG5cbi8qKlxuICogVW5rbm93biBvcHRpb24gYGZsYWdgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmbGFnXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS51bmtub3duT3B0aW9uID0gZnVuY3Rpb24oZmxhZykge1xuICBpZiAodGhpcy5fYWxsb3dVbmtub3duT3B0aW9uKSByZXR1cm47XG4gIGNvbnNvbGUuZXJyb3IoXCJlcnJvcjogdW5rbm93biBvcHRpb24gYCVzJ1wiLCBmbGFnKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufTtcblxuLyoqXG4gKiBWYXJpYWRpYyBhcmd1bWVudCB3aXRoIGBuYW1lYCBpcyBub3QgdGhlIGxhc3QgYXJndW1lbnQgYXMgcmVxdWlyZWQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnZhcmlhZGljQXJnTm90TGFzdCA9IGZ1bmN0aW9uKG5hbWUpIHtcbiAgY29uc29sZS5lcnJvcihcImVycm9yOiB2YXJpYWRpYyBhcmd1bWVudHMgbXVzdCBiZSBsYXN0IGAlcydcIiwgbmFtZSk7XG4gIHByb2Nlc3MuZXhpdCgxKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBwcm9ncmFtIHZlcnNpb24gdG8gYHN0cmAuXG4gKlxuICogVGhpcyBtZXRob2QgYXV0by1yZWdpc3RlcnMgdGhlIFwiLVYsIC0tdmVyc2lvblwiIGZsYWdcbiAqIHdoaWNoIHdpbGwgcHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIHdoZW4gcGFzc2VkLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7U3RyaW5nfSBbZmxhZ3NdXG4gKiBAcmV0dXJuIHtDb21tYW5kfSBmb3IgY2hhaW5pbmdcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUudmVyc2lvbiA9IGZ1bmN0aW9uKHN0ciwgZmxhZ3MpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICB0aGlzLl92ZXJzaW9uID0gc3RyO1xuICBmbGFncyA9IGZsYWdzIHx8ICctViwgLS12ZXJzaW9uJztcbiAgdmFyIHZlcnNpb25PcHRpb24gPSBuZXcgT3B0aW9uKGZsYWdzLCAnb3V0cHV0IHRoZSB2ZXJzaW9uIG51bWJlcicpO1xuICB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSA9IHZlcnNpb25PcHRpb24ubG9uZy5zdWJzdHIoMikgfHwgJ3ZlcnNpb24nO1xuICB0aGlzLm9wdGlvbnMucHVzaCh2ZXJzaW9uT3B0aW9uKTtcbiAgdGhpcy5vbignb3B0aW9uOicgKyB0aGlzLl92ZXJzaW9uT3B0aW9uTmFtZSwgZnVuY3Rpb24oKSB7XG4gICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoc3RyICsgJ1xcbicpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSk7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGRlc2NyaXB0aW9uIHRvIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzRGVzY3JpcHRpb25cbiAqIEByZXR1cm4ge1N0cmluZ3xDb21tYW5kfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5kZXNjcmlwdGlvbiA9IGZ1bmN0aW9uKHN0ciwgYXJnc0Rlc2NyaXB0aW9uKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gIHRoaXMuX2Rlc2NyaXB0aW9uID0gc3RyO1xuICB0aGlzLl9hcmdzRGVzY3JpcHRpb24gPSBhcmdzRGVzY3JpcHRpb247XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBTZXQgYW4gYWxpYXMgZm9yIHRoZSBjb21tYW5kXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGFsaWFzXG4gKiBAcmV0dXJuIHtTdHJpbmd8Q29tbWFuZH1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuYWxpYXMgPSBmdW5jdGlvbihhbGlhcykge1xuICB2YXIgY29tbWFuZCA9IHRoaXM7XG4gIGlmICh0aGlzLmNvbW1hbmRzLmxlbmd0aCAhPT0gMCkge1xuICAgIGNvbW1hbmQgPSB0aGlzLmNvbW1hbmRzW3RoaXMuY29tbWFuZHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGNvbW1hbmQuX2FsaWFzO1xuXG4gIGlmIChhbGlhcyA9PT0gY29tbWFuZC5fbmFtZSkgdGhyb3cgbmV3IEVycm9yKCdDb21tYW5kIGFsaWFzIGNhblxcJ3QgYmUgdGhlIHNhbWUgYXMgaXRzIG5hbWUnKTtcblxuICBjb21tYW5kLl9hbGlhcyA9IGFsaWFzO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IC8gZ2V0IHRoZSBjb21tYW5kIHVzYWdlIGBzdHJgLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ3xDb21tYW5kfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS51c2FnZSA9IGZ1bmN0aW9uKHN0cikge1xuICB2YXIgYXJncyA9IHRoaXMuX2FyZ3MubWFwKGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpO1xuICB9KTtcblxuICB2YXIgdXNhZ2UgPSAnW29wdGlvbnNdJyArXG4gICAgKHRoaXMuY29tbWFuZHMubGVuZ3RoID8gJyBbY29tbWFuZF0nIDogJycpICtcbiAgICAodGhpcy5fYXJncy5sZW5ndGggPyAnICcgKyBhcmdzLmpvaW4oJyAnKSA6ICcnKTtcblxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMuX3VzYWdlIHx8IHVzYWdlO1xuICB0aGlzLl91c2FnZSA9IHN0cjtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2V0IG9yIHNldCB0aGUgbmFtZSBvZiB0aGUgY29tbWFuZFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge1N0cmluZ3xDb21tYW5kfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5uYW1lID0gZnVuY3Rpb24oc3RyKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5fbmFtZTtcbiAgdGhpcy5fbmFtZSA9IHN0cjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBwcmVwYXJlZCBjb21tYW5kcy5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLnByZXBhcmVDb21tYW5kcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jb21tYW5kcy5maWx0ZXIoZnVuY3Rpb24oY21kKSB7XG4gICAgcmV0dXJuICFjbWQuX25vSGVscDtcbiAgfSkubWFwKGZ1bmN0aW9uKGNtZCkge1xuICAgIHZhciBhcmdzID0gY21kLl9hcmdzLm1hcChmdW5jdGlvbihhcmcpIHtcbiAgICAgIHJldHVybiBodW1hblJlYWRhYmxlQXJnTmFtZShhcmcpO1xuICAgIH0pLmpvaW4oJyAnKTtcblxuICAgIHJldHVybiBbXG4gICAgICBjbWQuX25hbWUgK1xuICAgICAgICAoY21kLl9hbGlhcyA/ICd8JyArIGNtZC5fYWxpYXMgOiAnJykgK1xuICAgICAgICAoY21kLm9wdGlvbnMubGVuZ3RoID8gJyBbb3B0aW9uc10nIDogJycpICtcbiAgICAgICAgKGFyZ3MgPyAnICcgKyBhcmdzIDogJycpLFxuICAgICAgY21kLl9kZXNjcmlwdGlvblxuICAgIF07XG4gIH0pO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxhcmdlc3QgY29tbWFuZCBsZW5ndGguXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUubGFyZ2VzdENvbW1hbmRMZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgdmFyIGNvbW1hbmRzID0gdGhpcy5wcmVwYXJlQ29tbWFuZHMoKTtcbiAgcmV0dXJuIGNvbW1hbmRzLnJlZHVjZShmdW5jdGlvbihtYXgsIGNvbW1hbmQpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBjb21tYW5kWzBdLmxlbmd0aCk7XG4gIH0sIDApO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGxhcmdlc3Qgb3B0aW9uIGxlbmd0aC5cbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5sYXJnZXN0T3B0aW9uTGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gIHZhciBvcHRpb25zID0gW10uc2xpY2UuY2FsbCh0aGlzLm9wdGlvbnMpO1xuICBvcHRpb25zLnB1c2goe1xuICAgIGZsYWdzOiAnLWgsIC0taGVscCdcbiAgfSk7XG4gIHJldHVybiBvcHRpb25zLnJlZHVjZShmdW5jdGlvbihtYXgsIG9wdGlvbikge1xuICAgIHJldHVybiBNYXRoLm1heChtYXgsIG9wdGlvbi5mbGFncy5sZW5ndGgpO1xuICB9LCAwKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBsYXJnZXN0IGFyZyBsZW5ndGguXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUubGFyZ2VzdEFyZ0xlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXJncy5yZWR1Y2UoZnVuY3Rpb24obWF4LCBhcmcpIHtcbiAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBhcmcubmFtZS5sZW5ndGgpO1xuICB9LCAwKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBwYWQgd2lkdGguXG4gKlxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUucGFkV2lkdGggPSBmdW5jdGlvbigpIHtcbiAgdmFyIHdpZHRoID0gdGhpcy5sYXJnZXN0T3B0aW9uTGVuZ3RoKCk7XG4gIGlmICh0aGlzLl9hcmdzRGVzY3JpcHRpb24gJiYgdGhpcy5fYXJncy5sZW5ndGgpIHtcbiAgICBpZiAodGhpcy5sYXJnZXN0QXJnTGVuZ3RoKCkgPiB3aWR0aCkge1xuICAgICAgd2lkdGggPSB0aGlzLmxhcmdlc3RBcmdMZW5ndGgoKTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcy5jb21tYW5kcyAmJiB0aGlzLmNvbW1hbmRzLmxlbmd0aCkge1xuICAgIGlmICh0aGlzLmxhcmdlc3RDb21tYW5kTGVuZ3RoKCkgPiB3aWR0aCkge1xuICAgICAgd2lkdGggPSB0aGlzLmxhcmdlc3RDb21tYW5kTGVuZ3RoKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gaGVscCBmb3Igb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5vcHRpb25IZWxwID0gZnVuY3Rpb24oKSB7XG4gIHZhciB3aWR0aCA9IHRoaXMucGFkV2lkdGgoKTtcblxuICAvLyBBcHBlbmQgdGhlIGhlbHAgaW5mb3JtYXRpb25cbiAgcmV0dXJuIHRoaXMub3B0aW9ucy5tYXAoZnVuY3Rpb24ob3B0aW9uKSB7XG4gICAgcmV0dXJuIHBhZChvcHRpb24uZmxhZ3MsIHdpZHRoKSArICcgICcgKyBvcHRpb24uZGVzY3JpcHRpb24gK1xuICAgICAgKChvcHRpb24uYm9vbCAmJiBvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpID8gJyAoZGVmYXVsdDogJyArIEpTT04uc3RyaW5naWZ5KG9wdGlvbi5kZWZhdWx0VmFsdWUpICsgJyknIDogJycpO1xuICB9KS5jb25jYXQoW3BhZCgnLWgsIC0taGVscCcsIHdpZHRoKSArICcgICcgKyAnb3V0cHV0IHVzYWdlIGluZm9ybWF0aW9uJ10pXG4gICAgLmpvaW4oJ1xcbicpO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gY29tbWFuZCBoZWxwIGRvY3VtZW50YXRpb24uXG4gKlxuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuQ29tbWFuZC5wcm90b3R5cGUuY29tbWFuZEhlbHAgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmNvbW1hbmRzLmxlbmd0aCkgcmV0dXJuICcnO1xuXG4gIHZhciBjb21tYW5kcyA9IHRoaXMucHJlcGFyZUNvbW1hbmRzKCk7XG4gIHZhciB3aWR0aCA9IHRoaXMucGFkV2lkdGgoKTtcblxuICByZXR1cm4gW1xuICAgICdDb21tYW5kczonLFxuICAgIGNvbW1hbmRzLm1hcChmdW5jdGlvbihjbWQpIHtcbiAgICAgIHZhciBkZXNjID0gY21kWzFdID8gJyAgJyArIGNtZFsxXSA6ICcnO1xuICAgICAgcmV0dXJuIChkZXNjID8gcGFkKGNtZFswXSwgd2lkdGgpIDogY21kWzBdKSArIGRlc2M7XG4gICAgfSkuam9pbignXFxuJykucmVwbGFjZSgvXi9nbSwgJyAgJyksXG4gICAgJydcbiAgXS5qb2luKCdcXG4nKTtcbn07XG5cbi8qKlxuICogUmV0dXJuIHByb2dyYW0gaGVscCBkb2N1bWVudGF0aW9uLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbkNvbW1hbmQucHJvdG90eXBlLmhlbHBJbmZvcm1hdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZGVzYyA9IFtdO1xuICBpZiAodGhpcy5fZGVzY3JpcHRpb24pIHtcbiAgICBkZXNjID0gW1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb24sXG4gICAgICAnJ1xuICAgIF07XG5cbiAgICB2YXIgYXJnc0Rlc2NyaXB0aW9uID0gdGhpcy5fYXJnc0Rlc2NyaXB0aW9uO1xuICAgIGlmIChhcmdzRGVzY3JpcHRpb24gJiYgdGhpcy5fYXJncy5sZW5ndGgpIHtcbiAgICAgIHZhciB3aWR0aCA9IHRoaXMucGFkV2lkdGgoKTtcbiAgICAgIGRlc2MucHVzaCgnQXJndW1lbnRzOicpO1xuICAgICAgZGVzYy5wdXNoKCcnKTtcbiAgICAgIHRoaXMuX2FyZ3MuZm9yRWFjaChmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgZGVzYy5wdXNoKCcgICcgKyBwYWQoYXJnLm5hbWUsIHdpZHRoKSArICcgICcgKyBhcmdzRGVzY3JpcHRpb25bYXJnLm5hbWVdKTtcbiAgICAgIH0pO1xuICAgICAgZGVzYy5wdXNoKCcnKTtcbiAgICB9XG4gIH1cblxuICB2YXIgY21kTmFtZSA9IHRoaXMuX25hbWU7XG4gIGlmICh0aGlzLl9hbGlhcykge1xuICAgIGNtZE5hbWUgPSBjbWROYW1lICsgJ3wnICsgdGhpcy5fYWxpYXM7XG4gIH1cbiAgdmFyIHVzYWdlID0gW1xuICAgICdVc2FnZTogJyArIGNtZE5hbWUgKyAnICcgKyB0aGlzLnVzYWdlKCksXG4gICAgJydcbiAgXTtcblxuICB2YXIgY21kcyA9IFtdO1xuICB2YXIgY29tbWFuZEhlbHAgPSB0aGlzLmNvbW1hbmRIZWxwKCk7XG4gIGlmIChjb21tYW5kSGVscCkgY21kcyA9IFtjb21tYW5kSGVscF07XG5cbiAgdmFyIG9wdGlvbnMgPSBbXG4gICAgJ09wdGlvbnM6JyxcbiAgICAnJyArIHRoaXMub3B0aW9uSGVscCgpLnJlcGxhY2UoL14vZ20sICcgICcpLFxuICAgICcnXG4gIF07XG5cbiAgcmV0dXJuIHVzYWdlXG4gICAgLmNvbmNhdChkZXNjKVxuICAgIC5jb25jYXQob3B0aW9ucylcbiAgICAuY29uY2F0KGNtZHMpXG4gICAgLmpvaW4oJ1xcbicpO1xufTtcblxuLyoqXG4gKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21tYW5kXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5vdXRwdXRIZWxwID0gZnVuY3Rpb24oY2IpIHtcbiAgaWYgKCFjYikge1xuICAgIGNiID0gZnVuY3Rpb24ocGFzc3RocnUpIHtcbiAgICAgIHJldHVybiBwYXNzdGhydTtcbiAgICB9O1xuICB9XG4gIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNiKHRoaXMuaGVscEluZm9ybWF0aW9uKCkpKTtcbiAgdGhpcy5lbWl0KCctLWhlbHAnKTtcbn07XG5cbi8qKlxuICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gYW5kIGV4aXQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5Db21tYW5kLnByb3RvdHlwZS5oZWxwID0gZnVuY3Rpb24oY2IpIHtcbiAgdGhpcy5vdXRwdXRIZWxwKGNiKTtcbiAgcHJvY2Vzcy5leGl0KCk7XG59O1xuXG4vKipcbiAqIENhbWVsLWNhc2UgdGhlIGdpdmVuIGBmbGFnYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmbGFnXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjYW1lbGNhc2UoZmxhZykge1xuICByZXR1cm4gZmxhZy5zcGxpdCgnLScpLnJlZHVjZShmdW5jdGlvbihzdHIsIHdvcmQpIHtcbiAgICByZXR1cm4gc3RyICsgd29yZFswXS50b1VwcGVyQ2FzZSgpICsgd29yZC5zbGljZSgxKTtcbiAgfSk7XG59XG5cbi8qKlxuICogUGFkIGBzdHJgIHRvIGB3aWR0aGAuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBwYWQoc3RyLCB3aWR0aCkge1xuICB2YXIgbGVuID0gTWF0aC5tYXgoMCwgd2lkdGggLSBzdHIubGVuZ3RoKTtcbiAgcmV0dXJuIHN0ciArIEFycmF5KGxlbiArIDEpLmpvaW4oJyAnKTtcbn1cblxuLyoqXG4gKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBpZiBuZWNlc3NhcnlcbiAqXG4gKiBAcGFyYW0ge0NvbW1hbmR9IGNvbW1hbmQgdG8gb3V0cHV0IGhlbHAgZm9yXG4gKiBAcGFyYW0ge0FycmF5fSBhcnJheSBvZiBvcHRpb25zIHRvIHNlYXJjaCBmb3IgLWggb3IgLS1oZWxwXG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBvdXRwdXRIZWxwSWZOZWNlc3NhcnkoY21kLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAob3B0aW9uc1tpXSA9PT0gJy0taGVscCcgfHwgb3B0aW9uc1tpXSA9PT0gJy1oJykge1xuICAgICAgY21kLm91dHB1dEhlbHAoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyBhbiBhcmd1bWVudCBhbiByZXR1cm5zIGl0cyBodW1hbiByZWFkYWJsZSBlcXVpdmFsZW50IGZvciBoZWxwIHVzYWdlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykge1xuICB2YXIgbmFtZU91dHB1dCA9IGFyZy5uYW1lICsgKGFyZy52YXJpYWRpYyA9PT0gdHJ1ZSA/ICcuLi4nIDogJycpO1xuXG4gIHJldHVybiBhcmcucmVxdWlyZWRcbiAgICA/ICc8JyArIG5hbWVPdXRwdXQgKyAnPidcbiAgICA6ICdbJyArIG5hbWVPdXRwdXQgKyAnXSc7XG59XG5cbi8vIGZvciB2ZXJzaW9ucyBiZWZvcmUgbm9kZSB2MC44IHdoZW4gdGhlcmUgd2VyZW4ndCBgZnMuZXhpc3RzU3luY2BcbmZ1bmN0aW9uIGV4aXN0cyhmaWxlKSB7XG4gIHRyeSB7XG4gICAgaWYgKGZzLnN0YXRTeW5jKGZpbGUpLmlzRmlsZSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICIvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG5cclxuLyogZ2xvYmFsIGdsb2JhbCwgZGVmaW5lLCBTeXN0ZW0sIFJlZmxlY3QsIFByb21pc2UgKi9cclxudmFyIF9fZXh0ZW5kcztcclxudmFyIF9fYXNzaWduO1xyXG52YXIgX19yZXN0O1xyXG52YXIgX19kZWNvcmF0ZTtcclxudmFyIF9fcGFyYW07XHJcbnZhciBfX21ldGFkYXRhO1xyXG52YXIgX19hd2FpdGVyO1xyXG52YXIgX19nZW5lcmF0b3I7XHJcbnZhciBfX2V4cG9ydFN0YXI7XHJcbnZhciBfX3ZhbHVlcztcclxudmFyIF9fcmVhZDtcclxudmFyIF9fc3ByZWFkO1xyXG52YXIgX19zcHJlYWRBcnJheXM7XHJcbnZhciBfX2F3YWl0O1xyXG52YXIgX19hc3luY0dlbmVyYXRvcjtcclxudmFyIF9fYXN5bmNEZWxlZ2F0b3I7XHJcbnZhciBfX2FzeW5jVmFsdWVzO1xyXG52YXIgX19tYWtlVGVtcGxhdGVPYmplY3Q7XHJcbnZhciBfX2ltcG9ydFN0YXI7XHJcbnZhciBfX2ltcG9ydERlZmF1bHQ7XHJcbnZhciBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0O1xyXG52YXIgX19jbGFzc1ByaXZhdGVGaWVsZFNldDtcclxudmFyIF9fY3JlYXRlQmluZGluZztcclxuKGZ1bmN0aW9uIChmYWN0b3J5KSB7XHJcbiAgICB2YXIgcm9vdCA9IHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOiB0eXBlb2Ygc2VsZiA9PT0gXCJvYmplY3RcIiA/IHNlbGYgOiB0eXBlb2YgdGhpcyA9PT0gXCJvYmplY3RcIiA/IHRoaXMgOiB7fTtcclxuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCkge1xyXG4gICAgICAgIGRlZmluZShcInRzbGliXCIsIFtcImV4cG9ydHNcIl0sIGZ1bmN0aW9uIChleHBvcnRzKSB7IGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCwgY3JlYXRlRXhwb3J0ZXIoZXhwb3J0cykpKTsgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgIGZhY3RvcnkoY3JlYXRlRXhwb3J0ZXIocm9vdCwgY3JlYXRlRXhwb3J0ZXIobW9kdWxlLmV4cG9ydHMpKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBmYWN0b3J5KGNyZWF0ZUV4cG9ydGVyKHJvb3QpKTtcclxuICAgIH1cclxuICAgIGZ1bmN0aW9uIGNyZWF0ZUV4cG9ydGVyKGV4cG9ydHMsIHByZXZpb3VzKSB7XHJcbiAgICAgICAgaWYgKGV4cG9ydHMgIT09IHJvb3QpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChpZCwgdikgeyByZXR1cm4gZXhwb3J0c1tpZF0gPSBwcmV2aW91cyA/IHByZXZpb3VzKGlkLCB2KSA6IHY7IH07XHJcbiAgICB9XHJcbn0pXHJcbihmdW5jdGlvbiAoZXhwb3J0ZXIpIHtcclxuICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8XHJcbiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxyXG4gICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9O1xyXG5cclxuICAgIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uIChkLCBiKSB7XHJcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH07XHJcblxyXG4gICAgX19yZXN0ID0gZnVuY3Rpb24gKHMsIGUpIHtcclxuICAgICAgICB2YXIgdCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKVxyXG4gICAgICAgICAgICB0W3BdID0gc1twXTtcclxuICAgICAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0O1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2RlY29yYXRlID0gZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XHJcbiAgICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XHJcbiAgICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxuICAgIH07XHJcblxyXG4gICAgX19wYXJhbSA9IGZ1bmN0aW9uIChwYXJhbUluZGV4LCBkZWNvcmF0b3IpIHtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxuICAgIH07XHJcblxyXG4gICAgX19tZXRhZGF0YSA9IGZ1bmN0aW9uIChtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXdhaXRlciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcclxuICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cclxuICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XHJcbiAgICAgICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgICAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcclxuICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcclxuICAgICAgICAgICAgd2hpbGUgKF8pIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxyXG4gICAgICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fY3JlYXRlQmluZGluZyA9IGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICAgICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgICAgICBvW2syXSA9IG1ba107XHJcbiAgICB9O1xyXG5cclxuICAgIF9fZXhwb3J0U3RhciA9IGZ1bmN0aW9uIChtLCBleHBvcnRzKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3ZhbHVlcyA9IGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcclxuICAgICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcclxuICAgICAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIH07XHJcblxyXG4gICAgX19yZWFkID0gZnVuY3Rpb24gKG8sIG4pIHtcclxuICAgICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICAgICAgaWYgKCFtKSByZXR1cm4gbztcclxuICAgICAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICAgICAgZmluYWxseSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGFyO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX3NwcmVhZCA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgYXIgPSBhci5jb25jYXQoX19yZWFkKGFyZ3VtZW50c1tpXSkpO1xyXG4gICAgICAgIHJldHVybiBhcjtcclxuICAgIH07XHJcblxyXG4gICAgX19zcHJlYWRBcnJheXMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgZm9yICh2YXIgcyA9IDAsIGkgPSAwLCBpbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBpbDsgaSsrKSBzICs9IGFyZ3VtZW50c1tpXS5sZW5ndGg7XHJcbiAgICAgICAgZm9yICh2YXIgciA9IEFycmF5KHMpLCBrID0gMCwgaSA9IDA7IGkgPCBpbDsgaSsrKVxyXG4gICAgICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgICAgIHJba10gPSBhW2pdO1xyXG4gICAgICAgIHJldHVybiByO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2F3YWl0ID0gZnVuY3Rpb24gKHYpIHtcclxuICAgICAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIF9fYXdhaXQgPyAodGhpcy52ID0gdiwgdGhpcykgOiBuZXcgX19hd2FpdCh2KTtcclxuICAgIH07XHJcblxyXG4gICAgX19hc3luY0dlbmVyYXRvciA9IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICAgICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7ICB9XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fYXN5bmNEZWxlZ2F0b3IgPSBmdW5jdGlvbiAobykge1xyXG4gICAgICAgIHZhciBpLCBwO1xyXG4gICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICAgICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG4gICAgfTtcclxuXHJcbiAgICBfX2FzeW5jVmFsdWVzID0gZnVuY3Rpb24gKG8pIHtcclxuICAgICAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgIHZhciBtID0gb1tTeW1ib2wuYXN5bmNJdGVyYXRvcl0sIGk7XHJcbiAgICAgICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgICAgICBmdW5jdGlvbiBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCBkLCB2KSB7IFByb21pc2UucmVzb2x2ZSh2KS50aGVuKGZ1bmN0aW9uKHYpIHsgcmVzb2x2ZSh7IHZhbHVlOiB2LCBkb25lOiBkIH0pOyB9LCByZWplY3QpOyB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0ID0gZnVuY3Rpb24gKGNvb2tlZCwgcmF3KSB7XHJcbiAgICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCBcInJhd1wiLCB7IHZhbHVlOiByYXcgfSk7IH0gZWxzZSB7IGNvb2tlZC5yYXcgPSByYXc7IH1cclxuICAgICAgICByZXR1cm4gY29va2VkO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2ltcG9ydFN0YXIgPSBmdW5jdGlvbiAobW9kKSB7XHJcbiAgICAgICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgICAgICB2YXIgcmVzdWx0ID0ge307XHJcbiAgICAgICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcclxuICAgICAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG5cclxuICAgIF9faW1wb3J0RGVmYXVsdCA9IGZ1bmN0aW9uIChtb2QpIHtcclxuICAgICAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcclxuICAgIH07XHJcblxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZEdldCA9IGZ1bmN0aW9uIChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gZ2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcHJpdmF0ZU1hcC5nZXQocmVjZWl2ZXIpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0ID0gZnVuY3Rpb24gKHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICghcHJpdmF0ZU1hcC5oYXMocmVjZWl2ZXIpKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gc2V0IHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwcml2YXRlTWFwLnNldChyZWNlaXZlciwgdmFsdWUpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH07XHJcblxyXG4gICAgZXhwb3J0ZXIoXCJfX2V4dGVuZHNcIiwgX19leHRlbmRzKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3NpZ25cIiwgX19hc3NpZ24pO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3Jlc3RcIiwgX19yZXN0KTtcclxuICAgIGV4cG9ydGVyKFwiX19kZWNvcmF0ZVwiLCBfX2RlY29yYXRlKTtcclxuICAgIGV4cG9ydGVyKFwiX19wYXJhbVwiLCBfX3BhcmFtKTtcclxuICAgIGV4cG9ydGVyKFwiX19tZXRhZGF0YVwiLCBfX21ldGFkYXRhKTtcclxuICAgIGV4cG9ydGVyKFwiX19hd2FpdGVyXCIsIF9fYXdhaXRlcik7XHJcbiAgICBleHBvcnRlcihcIl9fZ2VuZXJhdG9yXCIsIF9fZ2VuZXJhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19leHBvcnRTdGFyXCIsIF9fZXhwb3J0U3Rhcik7XHJcbiAgICBleHBvcnRlcihcIl9fY3JlYXRlQmluZGluZ1wiLCBfX2NyZWF0ZUJpbmRpbmcpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3ZhbHVlc1wiLCBfX3ZhbHVlcyk7XHJcbiAgICBleHBvcnRlcihcIl9fcmVhZFwiLCBfX3JlYWQpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX3NwcmVhZFwiLCBfX3NwcmVhZCk7XHJcbiAgICBleHBvcnRlcihcIl9fc3ByZWFkQXJyYXlzXCIsIF9fc3ByZWFkQXJyYXlzKTtcclxuICAgIGV4cG9ydGVyKFwiX19hd2FpdFwiLCBfX2F3YWl0KTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY0dlbmVyYXRvclwiLCBfX2FzeW5jR2VuZXJhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY0RlbGVnYXRvclwiLCBfX2FzeW5jRGVsZWdhdG9yKTtcclxuICAgIGV4cG9ydGVyKFwiX19hc3luY1ZhbHVlc1wiLCBfX2FzeW5jVmFsdWVzKTtcclxuICAgIGV4cG9ydGVyKFwiX19tYWtlVGVtcGxhdGVPYmplY3RcIiwgX19tYWtlVGVtcGxhdGVPYmplY3QpO1xyXG4gICAgZXhwb3J0ZXIoXCJfX2ltcG9ydFN0YXJcIiwgX19pbXBvcnRTdGFyKTtcclxuICAgIGV4cG9ydGVyKFwiX19pbXBvcnREZWZhdWx0XCIsIF9faW1wb3J0RGVmYXVsdCk7XHJcbiAgICBleHBvcnRlcihcIl9fY2xhc3NQcml2YXRlRmllbGRHZXRcIiwgX19jbGFzc1ByaXZhdGVGaWVsZEdldCk7XHJcbiAgICBleHBvcnRlcihcIl9fY2xhc3NQcml2YXRlRmllbGRTZXRcIiwgX19jbGFzc1ByaXZhdGVGaWVsZFNldCk7XHJcbn0pO1xyXG4iLCAiLyoqIENvbnNvbGUgbG9nZ2luZyB2ZXJib3NpdHkgZm9yIHRoZSBTREsuICovXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gIC8qKiBObyBsb2dzIHdpbGwgYmUgZ2VuZXJhdGVkLiAqL1xuICBOb25lID0gMCxcbiAgLyoqIE9ubHkgU0RLIGludGVybmFsIGVycm9ycyB3aWxsIGJlIGxvZ2dlZC4gKi9cbiAgRXJyb3IgPSAxLFxuICAvKiogSW5mb3JtYXRpb24gdXNlZnVsIGZvciBkZWJ1Z2dpbmcgdGhlIFNESyB3aWxsIGJlIGxvZ2dlZC4gKi9cbiAgRGVidWcgPSAyLFxuICAvKiogQWxsIFNESyBhY3Rpb25zIHdpbGwgYmUgbG9nZ2VkLiAqL1xuICBWZXJib3NlID0gMyxcbn1cbiIsICJpbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi91c2VyJztcblxuLyoqXG4gKiBAaW5oZXJpdGRvY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb24gZXh0ZW5kcyBTZXNzaW9uQ29udGV4dCB7XG4gIC8qKiBKU0RvYyAqL1xuICB1cGRhdGUoY29udGV4dD86IFNlc3Npb25Db250ZXh0KTogdm9pZDtcblxuICAvKiogSlNEb2MgKi9cbiAgY2xvc2Uoc3RhdHVzPzogU2Vzc2lvblN0YXR1cyk6IHZvaWQ7XG5cbiAgLyoqIEpTRG9jICovXG4gIHRvSlNPTigpOiB7XG4gICAgaW5pdDogYm9vbGVhbjtcbiAgICBzaWQ6IHN0cmluZztcbiAgICBkaWQ/OiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgc3RhcnRlZDogc3RyaW5nO1xuICAgIGR1cmF0aW9uPzogbnVtYmVyO1xuICAgIHN0YXR1czogU2Vzc2lvblN0YXR1cztcbiAgICBlcnJvcnM6IG51bWJlcjtcbiAgICBhdHRycz86IHtcbiAgICAgIHJlbGVhc2U/OiBzdHJpbmc7XG4gICAgICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmc7XG4gICAgICBpcF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdFNlc3Npb24ge1xuICBzdGF0dXM/OiBSZXF1ZXN0U2Vzc2lvblN0YXR1cztcbn1cblxuLyoqXG4gKiBTZXNzaW9uIENvbnRleHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uQ29udGV4dCB7XG4gIHNpZD86IHN0cmluZztcbiAgZGlkPzogc3RyaW5nO1xuICBpbml0PzogYm9vbGVhbjtcbiAgLy8gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaFxuICB0aW1lc3RhbXA/OiBudW1iZXI7XG4gIC8vIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2hcbiAgc3RhcnRlZD86IG51bWJlcjtcbiAgZHVyYXRpb24/OiBudW1iZXI7XG4gIHN0YXR1cz86IFNlc3Npb25TdGF0dXM7XG4gIHJlbGVhc2U/OiBzdHJpbmc7XG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICB1c2VyQWdlbnQ/OiBzdHJpbmc7XG4gIGlwQWRkcmVzcz86IHN0cmluZztcbiAgZXJyb3JzPzogbnVtYmVyO1xuICB1c2VyPzogVXNlciB8IG51bGw7XG4gIGlnbm9yZUR1cmF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZXNzaW9uIFN0YXR1c1xuICovXG5leHBvcnQgZW51bSBTZXNzaW9uU3RhdHVzIHtcbiAgLyoqIEpTRG9jICovXG4gIE9rID0gJ29rJyxcbiAgLyoqIEpTRG9jICovXG4gIEV4aXRlZCA9ICdleGl0ZWQnLFxuICAvKiogSlNEb2MgKi9cbiAgQ3Jhc2hlZCA9ICdjcmFzaGVkJyxcbiAgLyoqIEpTRG9jICovXG4gIEFibm9ybWFsID0gJ2Fibm9ybWFsJyxcbn1cblxuZXhwb3J0IGVudW0gUmVxdWVzdFNlc3Npb25TdGF0dXMge1xuICAvKiogSlNEb2MgKi9cbiAgT2sgPSAnb2snLFxuICAvKiogSlNEb2MgKi9cbiAgRXJyb3JlZCA9ICdlcnJvcmVkJyxcbiAgLyoqIEpTRG9jICovXG4gIENyYXNoZWQgPSAnY3Jhc2hlZCcsXG59XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uQWdncmVnYXRlcyB7XG4gIGF0dHJzPzoge1xuICAgIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAgIHJlbGVhc2U/OiBzdHJpbmc7XG4gIH07XG4gIGFnZ3JlZ2F0ZXM6IEFycmF5PEFnZ3JlZ2F0aW9uQ291bnRzPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uRmx1c2hlckxpa2Uge1xuICAvKipcbiAgICogSW5jcmVtZW50cyB0aGUgU2Vzc2lvbiBTdGF0dXMgYnVja2V0IGluIFNlc3Npb25BZ2dyZWdhdGVzIE9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdGF0dXMgb2YgdGhlIHNlc3Npb25cbiAgICogY2FwdHVyZWRcbiAgICovXG4gIGluY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudCgpOiB2b2lkO1xuXG4gIC8qKiBTdWJtaXRzIHRoZSBhZ2dyZWdhdGVzIHJlcXVlc3QgbW9kZSBzZXNzaW9ucyB0byBTZW50cnkgKi9cbiAgc2VuZFNlc3Npb25BZ2dyZWdhdGVzKHNlc3Npb25BZ2dyZWdhdGVzOiBTZXNzaW9uQWdncmVnYXRlcyk6IHZvaWQ7XG5cbiAgLyoqIEVtcHRpZXMgQWdncmVnYXRlIEJ1Y2tldHMgYW5kIFNlbmRzIHRoZW0gdG8gVHJhbnNwb3J0IEJ1ZmZlciAqL1xuICBmbHVzaCgpOiB2b2lkO1xuXG4gIC8qKiBDbGVhcnMgc2V0SW50ZXJ2YWwgYW5kIGNhbGxzIGZsdXNoICovXG4gIGNsb3NlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWdncmVnYXRpb25Db3VudHMge1xuICBzdGFydGVkOiBzdHJpbmc7XG4gIGVycm9yZWQ/OiBudW1iZXI7XG4gIGV4aXRlZD86IG51bWJlcjtcbiAgY3Jhc2hlZD86IG51bWJlcjtcbn1cbiIsICIvKiogSlNEb2MgKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvZXhwb3J0XG5leHBvcnQgZW51bSBTZXZlcml0eSB7XG4gIC8qKiBKU0RvYyAqL1xuICBGYXRhbCA9ICdmYXRhbCcsXG4gIC8qKiBKU0RvYyAqL1xuICBFcnJvciA9ICdlcnJvcicsXG4gIC8qKiBKU0RvYyAqL1xuICBXYXJuaW5nID0gJ3dhcm5pbmcnLFxuICAvKiogSlNEb2MgKi9cbiAgTG9nID0gJ2xvZycsXG4gIC8qKiBKU0RvYyAqL1xuICBJbmZvID0gJ2luZm8nLFxuICAvKiogSlNEb2MgKi9cbiAgRGVidWcgPSAnZGVidWcnLFxuICAvKiogSlNEb2MgKi9cbiAgQ3JpdGljYWwgPSAnY3JpdGljYWwnLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZSwgaW1wb3J0L2V4cG9ydFxuZXhwb3J0IG5hbWVzcGFjZSBTZXZlcml0eSB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHN0cmluZy1iYXNlZCBsZXZlbCBpbnRvIGEge0BsaW5rIFNldmVyaXR5fS5cbiAgICpcbiAgICogQHBhcmFtIGxldmVsIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBTZXZlcml0eVxuICAgKiBAcmV0dXJucyBTZXZlcml0eVxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmcobGV2ZWw6IHN0cmluZyk6IFNldmVyaXR5IHtcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlICdkZWJ1Zyc6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5EZWJ1ZztcbiAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuSW5mbztcbiAgICAgIGNhc2UgJ3dhcm4nOlxuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gU2V2ZXJpdHkuRXJyb3I7XG4gICAgICBjYXNlICdmYXRhbCc6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5GYXRhbDtcbiAgICAgIGNhc2UgJ2NyaXRpY2FsJzpcbiAgICAgICAgcmV0dXJuIFNldmVyaXR5LkNyaXRpY2FsO1xuICAgICAgY2FzZSAnbG9nJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBTZXZlcml0eS5Mb2c7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqIFRoZSBzdGF0dXMgb2YgYW4gZXZlbnQuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L2V4cG9ydFxuZXhwb3J0IGVudW0gU3RhdHVzIHtcbiAgLyoqIFRoZSBzdGF0dXMgY291bGQgbm90IGJlIGRldGVybWluZWQuICovXG4gIFVua25vd24gPSAndW5rbm93bicsXG4gIC8qKiBUaGUgZXZlbnQgd2FzIHNraXBwZWQgZHVlIHRvIGNvbmZpZ3VyYXRpb24gb3IgY2FsbGJhY2tzLiAqL1xuICBTa2lwcGVkID0gJ3NraXBwZWQnLFxuICAvKiogVGhlIGV2ZW50IHdhcyBzZW50IHRvIFNlbnRyeSBzdWNjZXNzZnVsbHkuICovXG4gIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gIC8qKiBUaGUgY2xpZW50IGlzIGN1cnJlbnRseSByYXRlIGxpbWl0ZWQgYW5kIHdpbGwgdHJ5IGFnYWluIGxhdGVyLiAqL1xuICBSYXRlTGltaXQgPSAncmF0ZV9saW1pdCcsXG4gIC8qKiBUaGUgZXZlbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gKi9cbiAgSW52YWxpZCA9ICdpbnZhbGlkJyxcbiAgLyoqIEEgc2VydmVyLXNpZGUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHN1Ym1pc3Npb24uICovXG4gIEZhaWxlZCA9ICdmYWlsZWQnLFxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5hbWVzcGFjZSwgaW1wb3J0L2V4cG9ydFxuZXhwb3J0IG5hbWVzcGFjZSBTdGF0dXMge1xuICAvKipcbiAgICogQ29udmVydHMgYSBIVFRQIHN0YXR1cyBjb2RlIGludG8gYSB7QGxpbmsgU3RhdHVzfS5cbiAgICpcbiAgICogQHBhcmFtIGNvZGUgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBzZW5kIHN0YXR1cyBvciB7QGxpbmsgU3RhdHVzLlVua25vd259LlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGZyb21IdHRwQ29kZShjb2RlOiBudW1iZXIpOiBTdGF0dXMge1xuICAgIGlmIChjb2RlID49IDIwMCAmJiBjb2RlIDwgMzAwKSB7XG4gICAgICByZXR1cm4gU3RhdHVzLlN1Y2Nlc3M7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPT09IDQyOSkge1xuICAgICAgcmV0dXJuIFN0YXR1cy5SYXRlTGltaXQ7XG4gICAgfVxuXG4gICAgaWYgKGNvZGUgPj0gNDAwICYmIGNvZGUgPCA1MDApIHtcbiAgICAgIHJldHVybiBTdGF0dXMuSW52YWxpZDtcbiAgICB9XG5cbiAgICBpZiAoY29kZSA+PSA1MDApIHtcbiAgICAgIHJldHVybiBTdGF0dXMuRmFpbGVkO1xuICAgIH1cblxuICAgIHJldHVybiBTdGF0dXMuVW5rbm93bjtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV4dHJhY3RlZE5vZGVSZXF1ZXN0RGF0YSwgUHJpbWl0aXZlLCBXb3JrZXJMb2NhdGlvbiB9IGZyb20gJy4vbWlzYyc7XG5pbXBvcnQgeyBTcGFuLCBTcGFuQ29udGV4dCB9IGZyb20gJy4vc3Bhbic7XG5cbi8qKlxuICogSW50ZXJmYWNlIGhvbGRpbmcgVHJhbnNhY3Rpb24tc3BlY2lmaWMgcHJvcGVydGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ29udGV4dCBleHRlbmRzIFNwYW5Db250ZXh0IHtcbiAgLyoqXG4gICAqIEh1bWFuLXJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzZXRzIHRoZSBlbmQgdGltZXN0YW1wIG9mIHRoZSB0cmFuc2FjdGlvbiB0byB0aGUgaGlnaGVzdCB0aW1lc3RhbXAgb2YgY2hpbGQgc3BhbnMsIHRyaW1taW5nXG4gICAqIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgaXMgdXNlZnVsIHRvIGRpc2NhcmQgZXh0cmEgdGltZSBpbiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBpcyBub3RcbiAgICogYWNjb3VudGVkIGZvciBpbiBjaGlsZCBzcGFucywgbGlrZSB3aGF0IGhhcHBlbnMgaW4gdGhlIGlkbGUgdHJhbnNhY3Rpb24gVHJhY2luZyBpbnRlZ3JhdGlvbiwgd2hlcmUgd2UgZmluaXNoIHRoZVxuICAgKiB0cmFuc2FjdGlvbiBhZnRlciBhIGdpdmVuIFwiaWRsZSB0aW1lXCIgYW5kIHdlIGRvbid0IHdhbnQgdGhpcyBcImlkbGUgdGltZVwiIHRvIGJlIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgdHJpbUVuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgdHJhbnNhY3Rpb24gaGFzIGEgcGFyZW50LCB0aGUgcGFyZW50J3Mgc2FtcGxpbmcgZGVjaXNpb25cbiAgICovXG4gIHBhcmVudFNhbXBsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLCBmb3IgaW50ZXJuYWwgU0RLIHVzZS5cbiAgICovXG4gIG1ldGFkYXRhPzogVHJhbnNhY3Rpb25NZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBEYXRhIHB1bGxlZCBmcm9tIGEgYHNlbnRyeS10cmFjZWAgaGVhZGVyXG4gKi9cbmV4cG9ydCB0eXBlIFRyYWNlcGFyZW50RGF0YSA9IFBpY2s8VHJhbnNhY3Rpb25Db250ZXh0LCAndHJhY2VJZCcgfCAncGFyZW50U3BhbklkJyB8ICdwYXJlbnRTYW1wbGVkJz47XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gXCJDbGFzc1wiLCBpbmhlcml0cyBTcGFuIG9ubHkgaGFzIGBzZXROYW1lYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb25Db250ZXh0LCBTcGFuIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBzcGFuSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHRyYWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHN0YXJ0VGltZXN0YW1wOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICB0YWdzOiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9O1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxuICAvKipcbiAgICogTWV0YWRhdGEgYWJvdXQgdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBtZXRhZGF0YTogVHJhbnNhY3Rpb25NZXRhZGF0YTtcblxuICAvKipcbiAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgc2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHByb3BlcnRpZXMgYXMgYSBgVHJhbnNhY3Rpb25Db250ZXh0YCAqL1xuICB0b0NvbnRleHQoKTogVHJhbnNhY3Rpb25Db250ZXh0O1xuXG4gIC8qKiBVcGRhdGVzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIHdpdGggYSBuZXcgYFRyYW5zYWN0aW9uQ29udGV4dGAgKi9cbiAgdXBkYXRlV2l0aENvbnRleHQodHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQpOiB0aGlzO1xufVxuXG4vKipcbiAqIENvbnRleHQgZGF0YSBwYXNzZWQgYnkgdGhlIHVzZXIgd2hlbiBzdGFydGluZyBhIHRyYW5zYWN0aW9uLCB0byBiZSB1c2VkIGJ5IHRoZSB0cmFjZXNTYW1wbGVyIG1ldGhvZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21TYW1wbGluZ0NvbnRleHQge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogRGF0YSBwYXNzZWQgdG8gdGhlIGB0cmFjZXNTYW1wbGVyYCBmdW5jdGlvbiwgd2hpY2ggZm9ybXMgdGhlIGJhc2lzIGZvciB3aGF0ZXZlciBkZWNpc2lvbnMgaXQgbWlnaHQgbWFrZS5cbiAqXG4gKiBBZGRzIGRlZmF1bHQgZGF0YSB0byBkYXRhIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBTZWUge0BsaW5rIEh1Yi5zdGFydFRyYW5zYWN0aW9ufVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbXBsaW5nQ29udGV4dCBleHRlbmRzIEN1c3RvbVNhbXBsaW5nQ29udGV4dCB7XG4gIC8qKlxuICAgKiBDb250ZXh0IGRhdGEgd2l0aCB3aGljaCB0cmFuc2FjdGlvbiBiZWluZyBzYW1wbGVkIHdhcyBjcmVhdGVkXG4gICAqL1xuICB0cmFuc2FjdGlvbkNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dDtcblxuICAvKipcbiAgICogU2FtcGxpbmcgZGVjaXNpb24gZnJvbSB0aGUgcGFyZW50IHRyYW5zYWN0aW9uLCBpZiBhbnkuXG4gICAqL1xuICBwYXJlbnRTYW1wbGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVVJMIG9mIHRoZSBjdXJyZW50IHBhZ2Ugb3Igd29ya2VyIHNjcmlwdC4gUGFzc2VkIGJ5IGRlZmF1bHQgd2hlbiB1c2luZyB0aGUgYEJyb3dzZXJUcmFjaW5nYFxuICAgKiBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIGxvY2F0aW9uPzogV29ya2VyTG9jYXRpb247XG5cbiAgLyoqXG4gICAqIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGluY29taW5nIHJlcXVlc3QgdG8gYSBub2RlIHNlcnZlci4gUGFzc2VkIGJ5IGRlZmF1bHQgd2hlbiB1c2luZyB0aGUgVHJhY2luZ0hhbmRsZXIuXG4gICAqL1xuICByZXF1ZXN0PzogRXh0cmFjdGVkTm9kZVJlcXVlc3REYXRhO1xufVxuXG5leHBvcnQgdHlwZSBNZWFzdXJlbWVudHMgPSBSZWNvcmQ8c3RyaW5nLCB7IHZhbHVlOiBudW1iZXIgfT47XG5cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2Qge1xuICBFeHBsaWNpdCA9ICdleHBsaWNpdGx5X3NldCcsXG4gIFNhbXBsZXIgPSAnY2xpZW50X3NhbXBsZXInLFxuICBSYXRlID0gJ2NsaWVudF9yYXRlJyxcbiAgSW5oZXJpdGFuY2UgPSAnaW5oZXJpdGFuY2UnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uTWV0YWRhdGEge1xuICB0cmFuc2FjdGlvblNhbXBsaW5nPzogeyByYXRlPzogbnVtYmVyOyBtZXRob2Q/OiBzdHJpbmcgfTtcblxuICAvKiogVGhlIHR3byBoYWx2ZXMgKHNlbnRyeSBhbmQgdGhpcmQtcGFydHkpIG9mIGEgdHJhbnNhY3Rpb24ncyB0cmFjZXN0YXRlIGhlYWRlciwgdXNlZCBmb3IgZHluYW1pYyBzYW1wbGluZyAqL1xuICB0cmFjZXN0YXRlPzoge1xuICAgIHNlbnRyeT86IHN0cmluZztcbiAgICB0aGlyZHBhcnR5Pzogc3RyaW5nO1xuICB9O1xuXG4gIC8qKiBGb3IgdHJhbnNhY3Rpb25zIHRyYWNpbmcgc2VydmVyLXNpZGUgcmVxdWVzdCBoYW5kbGluZywgdGhlIHBhdGggb2YgdGhlIHJlcXVlc3QgYmVpbmcgdHJhY2tlZC4gKi9cbiAgcmVxdWVzdFBhdGg/OiBzdHJpbmc7XG59XG4iLCAiaW1wb3J0IHsgRHNuTGlrZSB9IGZyb20gJy4vZHNuJztcbmltcG9ydCB7IEV2ZW50IH0gZnJvbSAnLi9ldmVudCc7XG5pbXBvcnQgeyBTZW50cnlSZXF1ZXN0VHlwZSB9IGZyb20gJy4vcmVxdWVzdCc7XG5pbXBvcnQgeyBSZXNwb25zZSB9IGZyb20gJy4vcmVzcG9uc2UnO1xuaW1wb3J0IHsgU2RrTWV0YWRhdGEgfSBmcm9tICcuL3Nka21ldGFkYXRhJztcbmltcG9ydCB7IFNlc3Npb24sIFNlc3Npb25BZ2dyZWdhdGVzIH0gZnJvbSAnLi9zZXNzaW9uJztcblxuZXhwb3J0IGVudW0gT3V0Y29tZSB7XG4gIEJlZm9yZVNlbmQgPSAnYmVmb3JlX3NlbmQnLFxuICBFdmVudFByb2Nlc3NvciA9ICdldmVudF9wcm9jZXNzb3InLFxuICBOZXR3b3JrRXJyb3IgPSAnbmV0d29ya19lcnJvcicsXG4gIFF1ZXVlT3ZlcmZsb3cgPSAncXVldWVfb3ZlcmZsb3cnLFxuICBSYXRlTGltaXRCYWNrb2ZmID0gJ3JhdGVsaW1pdF9iYWNrb2ZmJyxcbiAgU2FtcGxlUmF0ZSA9ICdzYW1wbGVfcmF0ZScsXG59XG5cbi8qKiBUcmFuc3BvcnQgdXNlZCBzZW5kaW5nIGRhdGEgdG8gU2VudHJ5ICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydCB7XG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgZXZlbnQgdG8gdGhlIFN0b3JlIGVuZHBvaW50IGluIFNlbnRyeS5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IEV2ZW50IHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8gU2VudHJ5LlxuICAgKi9cbiAgc2VuZEV2ZW50KGV2ZW50OiBFdmVudCk6IFByb21pc2VMaWtlPFJlc3BvbnNlPjtcblxuICAvKipcbiAgICogU2VuZHMgdGhlIHNlc3Npb24gdG8gdGhlIEVudmVsb3BlIGVuZHBvaW50IGluIFNlbnRyeS5cbiAgICpcbiAgICogQHBhcmFtIHNlc3Npb24gU2Vzc2lvbiB0aGF0IHNob3VsZCBiZSBzZW50IHRvIFNlbnRyeSB8IFNlc3Npb24gQWdncmVnYXRlcyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIFNlbnRyeS5cbiAgICovXG4gIHNlbmRTZXNzaW9uPyhzZXNzaW9uOiBTZXNzaW9uIHwgU2Vzc2lvbkFnZ3JlZ2F0ZXMpOiBQcm9taXNlTGlrZTxSZXNwb25zZT47XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIGFsbCBldmVudHMgdG8gYmUgc2VudCBvciB0aGUgdGltZW91dCB0byBleHBpcmUsIHdoaWNoZXZlciBjb21lcyBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgTWF4aW11bSB0aW1lIGluIG1zIHRoZSB0cmFuc3BvcnQgc2hvdWxkIHdhaXQgZm9yIGV2ZW50cyB0byBiZSBmbHVzaGVkLiBPbWl0dGluZyB0aGlzIHBhcmFtZXRlciB3aWxsXG4gICAqICAgY2F1c2UgdGhlIHRyYW5zcG9ydCB0byB3YWl0IHVudGlsIGFsbCBldmVudHMgYXJlIHNlbnQgYmVmb3JlIHJlc29sdmluZyB0aGUgcHJvbWlzZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgd2lsbCByZXNvbHZlIHdpdGggYHRydWVgIGlmIGFsbCBldmVudHMgYXJlIHNlbnQgYmVmb3JlIHRoZSB0aW1lb3V0LCBvciBgZmFsc2VgIGlmIHRoZXJlIGFyZVxuICAgKiBzdGlsbCBldmVudHMgaW4gdGhlIHF1ZXVlIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAgICovXG4gIGNsb3NlKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPjtcblxuICAvKipcbiAgICogSW5jcmVtZW50IHRoZSBjb3VudGVyIGZvciB0aGUgc3BlY2lmaWMgY2xpZW50IG91dGNvbWVcbiAgICovXG4gIHJlY29yZExvc3RFdmVudD8odHlwZTogT3V0Y29tZSwgY2F0ZWdvcnk6IFNlbnRyeVJlcXVlc3RUeXBlKTogdm9pZDtcbn1cblxuLyoqIEpTRG9jICovXG5leHBvcnQgdHlwZSBUcmFuc3BvcnRDbGFzczxUIGV4dGVuZHMgVHJhbnNwb3J0PiA9IG5ldyAob3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucykgPT4gVDtcblxuLyoqIEpTRG9jICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9ydE9wdGlvbnMge1xuICAvKiogU2VudHJ5IERTTiAqL1xuICBkc246IERzbkxpa2U7XG4gIC8qKiBEZWZpbmUgY3VzdG9tIGhlYWRlcnMgKi9cbiAgaGVhZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBTZXQgYSBIVFRQIHByb3h5IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIG91dGJvdW5kIHJlcXVlc3RzLiAqL1xuICBodHRwUHJveHk/OiBzdHJpbmc7XG4gIC8qKiBTZXQgYSBIVFRQUyBwcm94eSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBvdXRib3VuZCByZXF1ZXN0cy4gKi9cbiAgaHR0cHNQcm94eT86IHN0cmluZztcbiAgLyoqIEhUVFBTIHByb3h5IGNlcnRpZmljYXRlcyBwYXRoICovXG4gIGNhQ2VydHM/OiBzdHJpbmc7XG4gIC8qKiBGZXRjaCBBUEkgaW5pdCBwYXJhbWV0ZXJzICovXG4gIGZldGNoUGFyYW1ldGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKiBUaGUgZW52ZWxvcGUgdHVubmVsIHRvIHVzZS4gKi9cbiAgdHVubmVsPzogc3RyaW5nO1xuICAvKiogU2VuZCBTREsgQ2xpZW50IFJlcG9ydHMuIEVuYWJsZWQgYnkgZGVmYXVsdC4gKi9cbiAgc2VuZENsaWVudFJlcG9ydHM/OiBib29sZWFuO1xuICAvKipcbiAgICogU2V0IG9mIG1ldGFkYXRhIGFib3V0IHRoZSBTREsgdGhhdCBjYW4gYmUgaW50ZXJuYWxseSB1c2VkIHRvIGVuaGFuY2UgZW52ZWxvcGVzIGFuZCBldmVudHMsXG4gICAqIGFuZCBwcm92aWRlIGFkZGl0aW9uYWwgZGF0YSBhYm91dCBldmVyeSByZXF1ZXN0LlxuICAgKiAqL1xuICBfbWV0YWRhdGE/OiBTZGtNZXRhZGF0YTtcbn1cbiIsICJleHBvcnQgeyBCcmVhZGNydW1iLCBCcmVhZGNydW1iSGludCB9IGZyb20gJy4vYnJlYWRjcnVtYic7XG5leHBvcnQgeyBDbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5leHBvcnQgeyBDb250ZXh0LCBDb250ZXh0cyB9IGZyb20gJy4vY29udGV4dCc7XG5leHBvcnQgeyBEc24sIERzbkNvbXBvbmVudHMsIERzbkxpa2UsIERzblByb3RvY29sIH0gZnJvbSAnLi9kc24nO1xuZXhwb3J0IHsgRGVidWdJbWFnZSwgRGVidWdJbWFnZVR5cGUsIERlYnVnTWV0YSB9IGZyb20gJy4vZGVidWdNZXRhJztcbmV4cG9ydCB7IEV4dGVuZGVkRXJyb3IgfSBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCB7IEV2ZW50LCBFdmVudEhpbnQgfSBmcm9tICcuL2V2ZW50JztcbmV4cG9ydCB7IEV2ZW50UHJvY2Vzc29yIH0gZnJvbSAnLi9ldmVudHByb2Nlc3Nvcic7XG5leHBvcnQgeyBFeGNlcHRpb24gfSBmcm9tICcuL2V4Y2VwdGlvbic7XG5leHBvcnQgeyBFeHRyYSwgRXh0cmFzIH0gZnJvbSAnLi9leHRyYSc7XG5leHBvcnQgeyBIdWIgfSBmcm9tICcuL2h1Yic7XG5leHBvcnQgeyBJbnRlZ3JhdGlvbiwgSW50ZWdyYXRpb25DbGFzcyB9IGZyb20gJy4vaW50ZWdyYXRpb24nO1xuZXhwb3J0IHsgTG9nTGV2ZWwgfSBmcm9tICcuL2xvZ2xldmVsJztcbmV4cG9ydCB7IE1lY2hhbmlzbSB9IGZyb20gJy4vbWVjaGFuaXNtJztcbmV4cG9ydCB7IEV4dHJhY3RlZE5vZGVSZXF1ZXN0RGF0YSwgUHJpbWl0aXZlLCBXb3JrZXJMb2NhdGlvbiB9IGZyb20gJy4vbWlzYyc7XG5leHBvcnQgeyBPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcbmV4cG9ydCB7IFBhY2thZ2UgfSBmcm9tICcuL3BhY2thZ2UnO1xuZXhwb3J0IHsgUXVlcnlQYXJhbXMsIFJlcXVlc3QsIFNlbnRyeVJlcXVlc3QsIFNlbnRyeVJlcXVlc3RUeXBlIH0gZnJvbSAnLi9yZXF1ZXN0JztcbmV4cG9ydCB7IFJlc3BvbnNlIH0gZnJvbSAnLi9yZXNwb25zZSc7XG5leHBvcnQgeyBSdW50aW1lIH0gZnJvbSAnLi9ydW50aW1lJztcbmV4cG9ydCB7IENhcHR1cmVDb250ZXh0LCBTY29wZSwgU2NvcGVDb250ZXh0IH0gZnJvbSAnLi9zY29wZSc7XG5leHBvcnQgeyBTZGtJbmZvIH0gZnJvbSAnLi9zZGtpbmZvJztcbmV4cG9ydCB7IFNka01ldGFkYXRhIH0gZnJvbSAnLi9zZGttZXRhZGF0YSc7XG5leHBvcnQge1xuICBTZXNzaW9uQWdncmVnYXRlcyxcbiAgQWdncmVnYXRpb25Db3VudHMsXG4gIFNlc3Npb24sXG4gIFNlc3Npb25Db250ZXh0LFxuICBTZXNzaW9uU3RhdHVzLFxuICBSZXF1ZXN0U2Vzc2lvbixcbiAgUmVxdWVzdFNlc3Npb25TdGF0dXMsXG4gIFNlc3Npb25GbHVzaGVyTGlrZSxcbn0gZnJvbSAnLi9zZXNzaW9uJztcbmV4cG9ydCB7IFNldmVyaXR5IH0gZnJvbSAnLi9zZXZlcml0eSc7XG5leHBvcnQgeyBTcGFuLCBTcGFuQ29udGV4dCB9IGZyb20gJy4vc3Bhbic7XG5leHBvcnQgeyBTdGFja0ZyYW1lIH0gZnJvbSAnLi9zdGFja2ZyYW1lJztcbmV4cG9ydCB7IFN0YWNrdHJhY2UgfSBmcm9tICcuL3N0YWNrdHJhY2UnO1xuZXhwb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi9zdGF0dXMnO1xuZXhwb3J0IHtcbiAgQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICBNZWFzdXJlbWVudHMsXG4gIFNhbXBsaW5nQ29udGV4dCxcbiAgVHJhY2VwYXJlbnREYXRhLFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Db250ZXh0LFxuICBUcmFuc2FjdGlvbk1ldGFkYXRhLFxuICBUcmFuc2FjdGlvblNhbXBsaW5nTWV0aG9kLFxufSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmV4cG9ydCB7IFRocmVhZCB9IGZyb20gJy4vdGhyZWFkJztcbmV4cG9ydCB7IE91dGNvbWUsIFRyYW5zcG9ydCwgVHJhbnNwb3J0T3B0aW9ucywgVHJhbnNwb3J0Q2xhc3MgfSBmcm9tICcuL3RyYW5zcG9ydCc7XG5leHBvcnQgeyBVc2VyIH0gZnJvbSAnLi91c2VyJztcbmV4cG9ydCB7IFdyYXBwZWRGdW5jdGlvbiB9IGZyb20gJy4vd3JhcHBlZGZ1bmN0aW9uJztcbiIsICIvKipcbiAqIENvbnN1bWVzIHRoZSBwcm9taXNlIGFuZCBsb2dzIHRoZSBlcnJvciB3aGVuIGl0IHJlamVjdHMuXG4gKiBAcGFyYW0gcHJvbWlzZSBBIHByb21pc2UgdG8gZm9yZ2V0LlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGZvcmdldChwcm9taXNlOiBQcm9taXNlTGlrZTxhbnk+KTogdm9pZCB7XG4gIHZvaWQgcHJvbWlzZS50aGVuKG51bGwsIGUgPT4ge1xuICAgIC8vIFRPRE86IFVzZSBhIGJldHRlciBsb2dnaW5nIG1lY2hhbmlzbVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihlKTtcbiAgfSk7XG59XG4iLCAiLyoqXG4gKiBOT1RFOiBJbiBvcmRlciB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmNpZXMsIGlmIHlvdSBhZGQgYSBmdW5jdGlvbiB0byB0aGlzIG1vZHVsZSBhbmQgaXQgbmVlZHMgdG8gcHJpbnQgc29tZXRoaW5nLFxuICogeW91IG11c3QgZWl0aGVyIGEpIHVzZSBgY29uc29sZS5sb2dgIHJhdGhlciB0aGFuIHRoZSBsb2dnZXIsIG9yIGIpIHB1dCB5b3VyIGZ1bmN0aW9uIGVsc2V3aGVyZS5cbiAqL1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHdlJ3JlIGluIHRoZSBOb2RlLmpzIG9yIEJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gZ2l2ZW4gcXVlc3Rpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZUVudigpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyBwcm9jZXNzIDogMCkgPT09ICdbb2JqZWN0IHByb2Nlc3NdJztcbn1cblxuLyoqXG4gKiBSZXF1aXJlcyBhIG1vZHVsZSB3aGljaCBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBidW5kbGVyIG1pbmlmaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCBUaGUgbW9kdWxlIHBhdGggdG8gcmVzb2x2ZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGZ1bmN0aW9uIGR5bmFtaWNSZXF1aXJlKG1vZDogYW55LCByZXF1ZXN0OiBzdHJpbmcpOiBhbnkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gIHJldHVybiBtb2QucmVxdWlyZShyZXF1ZXN0KTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgbW9kdWxlIHRoYXQgc2hvdWxkIHdvcmsgd2l0aCBsaW5rZWQgZGVwZW5kZW5jaWVzLlxuICogVGhlIHByb2JsZW0gaXMgdGhhdCB3ZSBfc2hvdWxkXyBiZSB1c2luZyBgcmVxdWlyZShyZXF1aXJlLnJlc29sdmUobW9kdWxlTmFtZSwgeyBwYXRoczogW2N3ZCgpXSB9KSlgXG4gKiBIb3dldmVyIGl0J3MgX25vdCBwb3NzaWJsZV8gdG8gZG8gdGhhdCB3aXRoIFdlYnBhY2ssIGFzIGl0IGhhcyB0byBrbm93IGFsbCB0aGUgZGVwZW5kZW5jaWVzIGR1cmluZ1xuICogYnVpbGQgdGltZS4gYHJlcXVpcmUucmVzb2x2ZWAgaXMgYWxzbyBub3QgYXZhaWxhYmxlIGluIGFueSBvdGhlciB3YXksIHNvIHdlIGNhbm5vdCBjcmVhdGUsXG4gKiBhIGZha2UgaGVscGVyIGxpa2Ugd2UgZG8gd2l0aCBgZHluYW1pY1JlcXVpcmVgLlxuICpcbiAqIFdlIGFsd2F5cyBwcmVmZXIgdG8gdXNlIGxvY2FsIHBhY2thZ2UsIHRodXMgdGhlIHZhbHVlIGlzIG5vdCByZXR1cm5lZCBlYXJseSBmcm9tIGVhY2ggYHRyeS9jYXRjaGAgYmxvY2suXG4gKiBUaGF0IGlzIHRvIG1pbWljIHRoZSBiZWhhdmlvciBvZiBgcmVxdWlyZS5yZXNvbHZlYCBleGFjdGx5LlxuICpcbiAqIEBwYXJhbSBtb2R1bGVOYW1lIG1vZHVsZSBuYW1lIHRvIHJlcXVpcmVcbiAqIEByZXR1cm5zIHBvc3NpYmx5IHJlcXVpcmVkIG1vZHVsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZE1vZHVsZTxUPihtb2R1bGVOYW1lOiBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcbiAgbGV0IG1vZDogVCB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIG1vZCA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgbW9kdWxlTmFtZSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBuby1lbXB0eVxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7IGN3ZCB9ID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAncHJvY2VzcycpO1xuICAgIG1vZCA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgYCR7Y3dkKCl9L25vZGVfbW9kdWxlcy8ke21vZHVsZU5hbWV9YCkgYXMgVDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIG5vLWVtcHR5XG4gIH1cblxuICByZXR1cm4gbW9kO1xufVxuIiwgIi8qKlxuICogTk9URTogSW4gb3JkZXIgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLCBpZiB5b3UgYWRkIGEgZnVuY3Rpb24gdG8gdGhpcyBtb2R1bGUgYW5kIGl0IG5lZWRzIHRvIHByaW50IHNvbWV0aGluZyxcbiAqIHlvdSBtdXN0IGVpdGhlciBhKSB1c2UgYGNvbnNvbGUubG9nYCByYXRoZXIgdGhhbiB0aGUgbG9nZ2VyLCBvciBiKSBwdXQgeW91ciBmdW5jdGlvbiBlbHNld2hlcmUuXG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuXG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5pbXBvcnQgeyBpc05vZGVFbnYgfSBmcm9tICcuL25vZGUnO1xuXG4vKiogSW50ZXJuYWwgKi9cbmludGVyZmFjZSBTZW50cnlHbG9iYWwge1xuICBTZW50cnk/OiB7XG4gICAgSW50ZWdyYXRpb25zPzogSW50ZWdyYXRpb25bXTtcbiAgfTtcbiAgU0VOVFJZX0VOVklST05NRU5UPzogc3RyaW5nO1xuICBTRU5UUllfRFNOPzogc3RyaW5nO1xuICBTRU5UUllfUkVMRUFTRT86IHtcbiAgICBpZD86IHN0cmluZztcbiAgfTtcbiAgX19TRU5UUllfXzoge1xuICAgIGdsb2JhbEV2ZW50UHJvY2Vzc29yczogYW55O1xuICAgIGh1YjogYW55O1xuICAgIGxvZ2dlcjogYW55O1xuICB9O1xufVxuXG5jb25zdCBmYWxsYmFja0dsb2JhbE9iamVjdCA9IHt9O1xuXG4vKipcbiAqIFNhZmVseSBnZXQgZ2xvYmFsIHNjb3BlIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIEdsb2JhbCBzY29wZSBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdsb2JhbE9iamVjdDxUPigpOiBUICYgU2VudHJ5R2xvYmFsIHtcbiAgcmV0dXJuIChpc05vZGVFbnYoKVxuICAgID8gZ2xvYmFsXG4gICAgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFsc1xuICAgID8gd2luZG93IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gICAgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCdcbiAgICA/IHNlbGZcbiAgICA6IGZhbGxiYWNrR2xvYmFsT2JqZWN0KSBhcyBUICYgU2VudHJ5R2xvYmFsO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXMgKi9cblxuaW1wb3J0IHsgUHJpbWl0aXZlIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBvbmUgb2YgYSBmZXcgRXJyb3Igb3IgRXJyb3ItbGlrZVxuICoge0BsaW5rIGlzRXJyb3J9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFcnJvcih3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICBzd2l0Y2ggKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpKSB7XG4gICAgY2FzZSAnW29iamVjdCBFcnJvcl0nOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgY2FzZSAnW29iamVjdCBFeGNlcHRpb25dJzpcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIGNhc2UgJ1tvYmplY3QgRE9NRXhjZXB0aW9uXSc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGlzSW5zdGFuY2VPZih3YXQsIEVycm9yKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBFcnJvckV2ZW50XG4gKiB7QGxpbmsgaXNFcnJvckV2ZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXJyb3JFdmVudCh3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IEVycm9yRXZlbnRdJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgRE9NRXJyb3JcbiAqIHtAbGluayBpc0RPTUVycm9yfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRE9NRXJyb3Iod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBET01FcnJvcl0nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBET01FeGNlcHRpb25cbiAqIHtAbGluayBpc0RPTUV4Y2VwdGlvbn0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RPTUV4Y2VwdGlvbih3YXQ6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdhdCkgPT09ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhIHN0cmluZ1xuICoge0BsaW5rIGlzU3RyaW5nfS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyBpcyBhIHByaW1pdGl2ZSAodW5kZWZpbmVkLCBudWxsLCBudW1iZXIsIGJvb2xlYW4sIHN0cmluZywgYmlnaW50LCBzeW1ib2wpXG4gKiB7QGxpbmsgaXNQcmltaXRpdmV9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNQcmltaXRpdmUod2F0OiBhbnkpOiB3YXQgaXMgUHJpbWl0aXZlIHtcbiAgcmV0dXJuIHdhdCA9PT0gbnVsbCB8fCAodHlwZW9mIHdhdCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHdhdCAhPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIG9iamVjdCBsaXRlcmFsXG4gKiB7QGxpbmsgaXNQbGFpbk9iamVjdH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwod2F0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGFuIEV2ZW50IGluc3RhbmNlXG4gKiB7QGxpbmsgaXNFdmVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V2ZW50KHdhdDogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgRXZlbnQgIT09ICd1bmRlZmluZWQnICYmIGlzSW5zdGFuY2VPZih3YXQsIEV2ZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gRWxlbWVudCBpbnN0YW5jZVxuICoge0BsaW5rIGlzRWxlbWVudH0uXG4gKlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnQod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpc0luc3RhbmNlT2Yod2F0LCBFbGVtZW50KTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSdzIHR5cGUgaXMgYW4gcmVnZXhwXG4gKiB7QGxpbmsgaXNSZWdFeHB9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHJldHVybnMgQSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZWdFeHAod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3YXQpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB2YWx1ZSBoYXMgYSB0aGVuIGZ1bmN0aW9uLlxuICogQHBhcmFtIHdhdCBBIHZhbHVlIHRvIGJlIGNoZWNrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RoZW5hYmxlKHdhdDogYW55KTogYm9vbGVhbiB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgcmV0dXJuIEJvb2xlYW4od2F0ICYmIHdhdC50aGVuICYmIHR5cGVvZiB3YXQudGhlbiA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgZ2l2ZW4gdmFsdWUncyB0eXBlIGlzIGEgU3ludGhldGljRXZlbnRcbiAqIHtAbGluayBpc1N5bnRoZXRpY0V2ZW50fS5cbiAqXG4gKiBAcGFyYW0gd2F0IEEgdmFsdWUgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3ludGhldGljRXZlbnQod2F0OiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzUGxhaW5PYmplY3Qod2F0KSAmJiAnbmF0aXZlRXZlbnQnIGluIHdhdCAmJiAncHJldmVudERlZmF1bHQnIGluIHdhdCAmJiAnc3RvcFByb3BhZ2F0aW9uJyBpbiB3YXQ7XG59XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGdpdmVuIHZhbHVlJ3MgdHlwZSBpcyBhbiBpbnN0YW5jZSBvZiBwcm92aWRlZCBjb25zdHJ1Y3Rvci5cbiAqIHtAbGluayBpc0luc3RhbmNlT2Z9LlxuICpcbiAqIEBwYXJhbSB3YXQgQSB2YWx1ZSB0byBiZSBjaGVja2VkLlxuICogQHBhcmFtIGJhc2UgQSBjb25zdHJ1Y3RvciB0byBiZSB1c2VkIGluIGEgY2hlY2suXG4gKiBAcmV0dXJucyBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHRoZSByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0luc3RhbmNlT2Yod2F0OiBhbnksIGJhc2U6IGFueSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB3YXQgaW5zdGFuY2VvZiBiYXNlO1xuICB9IGNhdGNoIChfZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnLi9pcyc7XG5cbi8qKlxuICogR2l2ZW4gYSBjaGlsZCBET00gZWxlbWVudCwgcmV0dXJucyBhIHF1ZXJ5LXNlbGVjdG9yIHN0YXRlbWVudCBkZXNjcmliaW5nIHRoYXRcbiAqIGFuZCBpdHMgYW5jZXN0b3JzXG4gKiBlLmcuIFtIVE1MRWxlbWVudF0gPT4gYm9keSA+IGRpdiA+IGlucHV0I2Zvby5idG5bbmFtZT1iYXpdXG4gKiBAcmV0dXJucyBnZW5lcmF0ZWQgRE9NIHBhdGhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh0bWxUcmVlQXNTdHJpbmcoZWxlbTogdW5rbm93biwga2V5QXR0cnM/OiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHR5cGUgU2ltcGxlTm9kZSA9IHtcbiAgICBwYXJlbnROb2RlOiBTaW1wbGVOb2RlO1xuICB9IHwgbnVsbDtcblxuICAvLyB0cnkvY2F0Y2ggYm90aDpcbiAgLy8gLSBhY2Nlc3NpbmcgZXZlbnQudGFyZ2V0IChzZWUgZ2V0c2VudHJ5L3JhdmVuLWpzIzgzOCwgIzc2OClcbiAgLy8gLSBgaHRtbFRyZWVBc1N0cmluZ2AgYmVjYXVzZSBpdCdzIGNvbXBsZXgsIGFuZCBqdXN0IGFjY2Vzc2luZyB0aGUgRE9NIGluY29ycmVjdGx5XG4gIC8vIC0gY2FuIHRocm93IGFuIGV4Y2VwdGlvbiBpbiBzb21lIGNpcmN1bXN0YW5jZXMuXG4gIHRyeSB7XG4gICAgbGV0IGN1cnJlbnRFbGVtID0gZWxlbSBhcyBTaW1wbGVOb2RlO1xuICAgIGNvbnN0IE1BWF9UUkFWRVJTRV9IRUlHSFQgPSA1O1xuICAgIGNvbnN0IE1BWF9PVVRQVVRfTEVOID0gODA7XG4gICAgY29uc3Qgb3V0ID0gW107XG4gICAgbGV0IGhlaWdodCA9IDA7XG4gICAgbGV0IGxlbiA9IDA7XG4gICAgY29uc3Qgc2VwYXJhdG9yID0gJyA+ICc7XG4gICAgY29uc3Qgc2VwTGVuZ3RoID0gc2VwYXJhdG9yLmxlbmd0aDtcbiAgICBsZXQgbmV4dFN0cjtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1c1xuICAgIHdoaWxlIChjdXJyZW50RWxlbSAmJiBoZWlnaHQrKyA8IE1BWF9UUkFWRVJTRV9IRUlHSFQpIHtcbiAgICAgIG5leHRTdHIgPSBfaHRtbEVsZW1lbnRBc1N0cmluZyhjdXJyZW50RWxlbSwga2V5QXR0cnMpO1xuICAgICAgLy8gYmFpbCBvdXQgaWZcbiAgICAgIC8vIC0gbmV4dFN0ciBpcyB0aGUgJ2h0bWwnIGVsZW1lbnRcbiAgICAgIC8vIC0gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoYXQgd291bGQgYmUgY3JlYXRlZCBleGNlZWRzIE1BWF9PVVRQVVRfTEVOXG4gICAgICAvLyAgIChpZ25vcmUgdGhpcyBsaW1pdCBpZiB3ZSBhcmUgb24gdGhlIGZpcnN0IGl0ZXJhdGlvbilcbiAgICAgIGlmIChuZXh0U3RyID09PSAnaHRtbCcgfHwgKGhlaWdodCA+IDEgJiYgbGVuICsgb3V0Lmxlbmd0aCAqIHNlcExlbmd0aCArIG5leHRTdHIubGVuZ3RoID49IE1BWF9PVVRQVVRfTEVOKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgb3V0LnB1c2gobmV4dFN0cik7XG5cbiAgICAgIGxlbiArPSBuZXh0U3RyLmxlbmd0aDtcbiAgICAgIGN1cnJlbnRFbGVtID0gY3VycmVudEVsZW0ucGFyZW50Tm9kZTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0LnJldmVyc2UoKS5qb2luKHNlcGFyYXRvcik7XG4gIH0gY2F0Y2ggKF9vTykge1xuICAgIHJldHVybiAnPHVua25vd24+JztcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBzaW1wbGUsIHF1ZXJ5LXNlbGVjdG9yIHJlcHJlc2VudGF0aW9uIG9mIGEgRE9NIGVsZW1lbnRcbiAqIGUuZy4gW0hUTUxFbGVtZW50XSA9PiBpbnB1dCNmb28uYnRuW25hbWU9YmF6XVxuICogQHJldHVybnMgZ2VuZXJhdGVkIERPTSBwYXRoXG4gKi9cbmZ1bmN0aW9uIF9odG1sRWxlbWVudEFzU3RyaW5nKGVsOiB1bmtub3duLCBrZXlBdHRycz86IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgZWxlbSA9IGVsIGFzIHtcbiAgICB0YWdOYW1lPzogc3RyaW5nO1xuICAgIGlkPzogc3RyaW5nO1xuICAgIGNsYXNzTmFtZT86IHN0cmluZztcbiAgICBnZXRBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBzdHJpbmc7XG4gIH07XG5cbiAgY29uc3Qgb3V0ID0gW107XG4gIGxldCBjbGFzc05hbWU7XG4gIGxldCBjbGFzc2VzO1xuICBsZXQga2V5O1xuICBsZXQgYXR0cjtcbiAgbGV0IGk7XG5cbiAgaWYgKCFlbGVtIHx8ICFlbGVtLnRhZ05hbWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBvdXQucHVzaChlbGVtLnRhZ05hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgLy8gUGFpcnMgb2YgYXR0cmlidXRlIGtleXMgZGVmaW5lZCBpbiBgc2VyaWFsaXplQXR0cmlidXRlYCBhbmQgdGhlaXIgdmFsdWVzIG9uIGVsZW1lbnQuXG4gIGNvbnN0IGtleUF0dHJQYWlycyA9IGtleUF0dHJzPy5sZW5ndGhcbiAgICA/IGtleUF0dHJzLmZpbHRlcihrZXlBdHRyID0+IGVsZW0uZ2V0QXR0cmlidXRlKGtleUF0dHIpKS5tYXAoa2V5QXR0ciA9PiBba2V5QXR0ciwgZWxlbS5nZXRBdHRyaWJ1dGUoa2V5QXR0cildKVxuICAgIDogbnVsbDtcblxuICBpZiAoa2V5QXR0clBhaXJzPy5sZW5ndGgpIHtcbiAgICBrZXlBdHRyUGFpcnMuZm9yRWFjaChrZXlBdHRyUGFpciA9PiB7XG4gICAgICBvdXQucHVzaChgWyR7a2V5QXR0clBhaXJbMF19PVwiJHtrZXlBdHRyUGFpclsxXX1cIl1gKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoZWxlbS5pZCkge1xuICAgICAgb3V0LnB1c2goYCMke2VsZW0uaWR9YCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGNsYXNzTmFtZSA9IGVsZW0uY2xhc3NOYW1lO1xuICAgIGlmIChjbGFzc05hbWUgJiYgaXNTdHJpbmcoY2xhc3NOYW1lKSkge1xuICAgICAgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgvXFxzKy8pO1xuICAgICAgZm9yIChpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0LnB1c2goYC4ke2NsYXNzZXNbaV19YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGFsbG93ZWRBdHRycyA9IFsndHlwZScsICduYW1lJywgJ3RpdGxlJywgJ2FsdCddO1xuICBmb3IgKGkgPSAwOyBpIDwgYWxsb3dlZEF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gYWxsb3dlZEF0dHJzW2ldO1xuICAgIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShrZXkpO1xuICAgIGlmIChhdHRyKSB7XG4gICAgICBvdXQucHVzaChgWyR7a2V5fT1cIiR7YXR0cn1cIl1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dC5qb2luKCcnKTtcbn1cblxuLyoqXG4gKiBBIHNhZmUgZm9ybSBvZiBsb2NhdGlvbi5ocmVmXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2NhdGlvbkhyZWYoKTogc3RyaW5nIHtcbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2xvYmFsLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG4gIH0gY2F0Y2ggKG9PKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IHNldFByb3RvdHlwZU9mID1cbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ID8gc2V0UHJvdG9PZiA6IG1peGluUHJvcGVydGllcyk7XG5cbi8qKlxuICogc2V0UHJvdG90eXBlT2YgcG9seWZpbGwgdXNpbmcgX19wcm90b19fXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG5mdW5jdGlvbiBzZXRQcm90b09mPFRUYXJnZXQgZXh0ZW5kcyBvYmplY3QsIFRQcm90bz4ob2JqOiBUVGFyZ2V0LCBwcm90bzogVFByb3RvKTogVFRhcmdldCAmIFRQcm90byB7XG4gIC8vIEB0cy1pZ25vcmUgX19wcm90b19fIGRvZXMgbm90IGV4aXN0IG9uIG9ialxuICBvYmouX19wcm90b19fID0gcHJvdG87XG4gIHJldHVybiBvYmogYXMgVFRhcmdldCAmIFRQcm90bztcbn1cblxuLyoqXG4gKiBzZXRQcm90b3R5cGVPZiBwb2x5ZmlsbCB1c2luZyBtaXhpblxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZnVuY3Rpb24gbWl4aW5Qcm9wZXJ0aWVzPFRUYXJnZXQgZXh0ZW5kcyBvYmplY3QsIFRQcm90bz4ob2JqOiBUVGFyZ2V0LCBwcm90bzogVFByb3RvKTogVFRhcmdldCAmIFRQcm90byB7XG4gIGZvciAoY29uc3QgcHJvcCBpbiBwcm90bykge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmUgdHlwZXNjcmlwdCBjb21wbGFpbnMgYWJvdXQgaW5kZXhpbmcgc28gd2UgcmVtb3ZlXG4gICAgICBvYmpbcHJvcF0gPSBwcm90b1twcm9wXTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqIGFzIFRUYXJnZXQgJiBUUHJvdG87XG59XG4iLCAiaW1wb3J0IHsgc2V0UHJvdG90eXBlT2YgfSBmcm9tICcuL3BvbHlmaWxsJztcblxuLyoqIEFuIGVycm9yIGVtaXR0ZWQgYnkgU2VudHJ5IFNES3MgYW5kIHJlbGF0ZWQgdXRpbGl0aWVzLiAqL1xuZXhwb3J0IGNsYXNzIFNlbnRyeUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKiogRGlzcGxheSBuYW1lIG9mIHRoaXMgZXJyb3IgaW5zdGFuY2UuICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcblxuICAgIHRoaXMubmFtZSA9IG5ldy50YXJnZXQucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgc2V0UHJvdG90eXBlT2YodGhpcywgbmV3LnRhcmdldC5wcm90b3R5cGUpO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgRHNuQ29tcG9uZW50cywgRHNuTGlrZSwgRHNuUHJvdG9jb2wgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuaW1wb3J0IHsgU2VudHJ5RXJyb3IgfSBmcm9tICcuL2Vycm9yJztcblxuLyoqIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIHBhcnNlIGEgRHNuLiAqL1xuY29uc3QgRFNOX1JFR0VYID0gL14oPzooXFx3Kyk6KVxcL1xcLyg/OihcXHcrKSg/OjooXFx3KykpP0ApKFtcXHcuLV0rKSg/OjooXFxkKykpP1xcLyguKykvO1xuXG4vKiogRXJyb3IgbWVzc2FnZSAqL1xuY29uc3QgRVJST1JfTUVTU0FHRSA9ICdJbnZhbGlkIERzbic7XG5cbi8qKiBUaGUgU2VudHJ5IERzbiwgaWRlbnRpZnlpbmcgYSBTZW50cnkgaW5zdGFuY2UgYW5kIHByb2plY3QuICovXG5leHBvcnQgY2xhc3MgRHNuIGltcGxlbWVudHMgRHNuQ29tcG9uZW50cyB7XG4gIC8qKiBQcm90b2NvbCB1c2VkIHRvIGNvbm5lY3QgdG8gU2VudHJ5LiAqL1xuICBwdWJsaWMgcHJvdG9jb2whOiBEc25Qcm90b2NvbDtcbiAgLyoqIFB1YmxpYyBhdXRob3JpemF0aW9uIGtleSAoZGVwcmVjYXRlZCwgcmVuYW1lZCB0byBwdWJsaWNLZXkpLiAqL1xuICBwdWJsaWMgdXNlciE6IHN0cmluZztcbiAgLyoqIFB1YmxpYyBhdXRob3JpemF0aW9uIGtleS4gKi9cbiAgcHVibGljIHB1YmxpY0tleSE6IHN0cmluZztcbiAgLyoqIFByaXZhdGUgYXV0aG9yaXphdGlvbiBrZXkgKGRlcHJlY2F0ZWQsIG9wdGlvbmFsKS4gKi9cbiAgcHVibGljIHBhc3MhOiBzdHJpbmc7XG4gIC8qKiBIb3N0bmFtZSBvZiB0aGUgU2VudHJ5IGluc3RhbmNlLiAqL1xuICBwdWJsaWMgaG9zdCE6IHN0cmluZztcbiAgLyoqIFBvcnQgb2YgdGhlIFNlbnRyeSBpbnN0YW5jZS4gKi9cbiAgcHVibGljIHBvcnQhOiBzdHJpbmc7XG4gIC8qKiBQYXRoICovXG4gIHB1YmxpYyBwYXRoITogc3RyaW5nO1xuICAvKiogUHJvamVjdCBJRCAqL1xuICBwdWJsaWMgcHJvamVjdElkITogc3RyaW5nO1xuXG4gIC8qKiBDcmVhdGVzIGEgbmV3IERzbiBjb21wb25lbnQgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGZyb206IERzbkxpa2UpIHtcbiAgICBpZiAodHlwZW9mIGZyb20gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLl9mcm9tU3RyaW5nKGZyb20pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9mcm9tQ29tcG9uZW50cyhmcm9tKTtcbiAgICB9XG5cbiAgICB0aGlzLl92YWxpZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIERzbi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHJlbmRlciB0aGUgcHVibGljIHJlcHJlc2VudGF0aW9uIHdpdGhvdXQgdGhlIHBhc3N3b3JkXG4gICAqIGNvbXBvbmVudC4gVG8gZ2V0IHRoZSBkZXByZWNhdGVkIHByaXZhdGUgcmVwcmVzZW50YXRpb24sIHNldCBgd2l0aFBhc3N3b3JkYFxuICAgKiB0byB0cnVlLlxuICAgKlxuICAgKiBAcGFyYW0gd2l0aFBhc3N3b3JkIFdoZW4gc2V0IHRvIHRydWUsIHRoZSBwYXNzd29yZCB3aWxsIGJlIGluY2x1ZGVkLlxuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKHdpdGhQYXNzd29yZDogYm9vbGVhbiA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IGhvc3QsIHBhdGgsIHBhc3MsIHBvcnQsIHByb2plY3RJZCwgcHJvdG9jb2wsIHB1YmxpY0tleSB9ID0gdGhpcztcbiAgICByZXR1cm4gKFxuICAgICAgYCR7cHJvdG9jb2x9Oi8vJHtwdWJsaWNLZXl9JHt3aXRoUGFzc3dvcmQgJiYgcGFzcyA/IGA6JHtwYXNzfWAgOiAnJ31gICtcbiAgICAgIGBAJHtob3N0fSR7cG9ydCA/IGA6JHtwb3J0fWAgOiAnJ30vJHtwYXRoID8gYCR7cGF0aH0vYCA6IHBhdGh9JHtwcm9qZWN0SWR9YFxuICAgICk7XG4gIH1cblxuICAvKiogUGFyc2VzIGEgc3RyaW5nIGludG8gdGhpcyBEc24uICovXG4gIHByaXZhdGUgX2Zyb21TdHJpbmcoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtYXRjaCA9IERTTl9SRUdFWC5leGVjKHN0cik7XG5cbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoRVJST1JfTUVTU0FHRSk7XG4gICAgfVxuXG4gICAgY29uc3QgW3Byb3RvY29sLCBwdWJsaWNLZXksIHBhc3MgPSAnJywgaG9zdCwgcG9ydCA9ICcnLCBsYXN0UGF0aF0gPSBtYXRjaC5zbGljZSgxKTtcbiAgICBsZXQgcGF0aCA9ICcnO1xuICAgIGxldCBwcm9qZWN0SWQgPSBsYXN0UGF0aDtcblxuICAgIGNvbnN0IHNwbGl0ID0gcHJvamVjdElkLnNwbGl0KCcvJyk7XG4gICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHBhdGggPSBzcGxpdC5zbGljZSgwLCAtMSkuam9pbignLycpO1xuICAgICAgcHJvamVjdElkID0gc3BsaXQucG9wKCkgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIGlmIChwcm9qZWN0SWQpIHtcbiAgICAgIGNvbnN0IHByb2plY3RNYXRjaCA9IHByb2plY3RJZC5tYXRjaCgvXlxcZCsvKTtcbiAgICAgIGlmIChwcm9qZWN0TWF0Y2gpIHtcbiAgICAgICAgcHJvamVjdElkID0gcHJvamVjdE1hdGNoWzBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2Zyb21Db21wb25lbnRzKHsgaG9zdCwgcGFzcywgcGF0aCwgcHJvamVjdElkLCBwb3J0LCBwcm90b2NvbDogcHJvdG9jb2wgYXMgRHNuUHJvdG9jb2wsIHB1YmxpY0tleSB9KTtcbiAgfVxuXG4gIC8qKiBNYXBzIERzbiBjb21wb25lbnRzIGludG8gdGhpcyBpbnN0YW5jZS4gKi9cbiAgcHJpdmF0ZSBfZnJvbUNvbXBvbmVudHMoY29tcG9uZW50czogRHNuQ29tcG9uZW50cyk6IHZvaWQge1xuICAgIC8vIFRPRE8gdGhpcyBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGFuZCBjYW4gYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uXG4gICAgaWYgKCd1c2VyJyBpbiBjb21wb25lbnRzICYmICEoJ3B1YmxpY0tleScgaW4gY29tcG9uZW50cykpIHtcbiAgICAgIGNvbXBvbmVudHMucHVibGljS2V5ID0gY29tcG9uZW50cy51c2VyO1xuICAgIH1cbiAgICB0aGlzLnVzZXIgPSBjb21wb25lbnRzLnB1YmxpY0tleSB8fCAnJztcblxuICAgIHRoaXMucHJvdG9jb2wgPSBjb21wb25lbnRzLnByb3RvY29sO1xuICAgIHRoaXMucHVibGljS2V5ID0gY29tcG9uZW50cy5wdWJsaWNLZXkgfHwgJyc7XG4gICAgdGhpcy5wYXNzID0gY29tcG9uZW50cy5wYXNzIHx8ICcnO1xuICAgIHRoaXMuaG9zdCA9IGNvbXBvbmVudHMuaG9zdDtcbiAgICB0aGlzLnBvcnQgPSBjb21wb25lbnRzLnBvcnQgfHwgJyc7XG4gICAgdGhpcy5wYXRoID0gY29tcG9uZW50cy5wYXRoIHx8ICcnO1xuICAgIHRoaXMucHJvamVjdElkID0gY29tcG9uZW50cy5wcm9qZWN0SWQ7XG4gIH1cblxuICAvKiogVmFsaWRhdGVzIHRoaXMgRHNuIGFuZCB0aHJvd3Mgb24gZXJyb3IuICovXG4gIHByaXZhdGUgX3ZhbGlkYXRlKCk6IHZvaWQge1xuICAgIFsncHJvdG9jb2wnLCAncHVibGljS2V5JywgJ2hvc3QnLCAncHJvamVjdElkJ10uZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgaWYgKCF0aGlzW2NvbXBvbmVudCBhcyBrZXlvZiBEc25Db21wb25lbnRzXSkge1xuICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoYCR7RVJST1JfTUVTU0FHRX06ICR7Y29tcG9uZW50fSBtaXNzaW5nYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIXRoaXMucHJvamVjdElkLm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGAke0VSUk9SX01FU1NBR0V9OiBJbnZhbGlkIHByb2plY3RJZCAke3RoaXMucHJvamVjdElkfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb3RvY29sICE9PSAnaHR0cCcgJiYgdGhpcy5wcm90b2NvbCAhPT0gJ2h0dHBzJykge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGAke0VSUk9SX01FU1NBR0V9OiBJbnZhbGlkIHByb3RvY29sICR7dGhpcy5wcm90b2NvbH1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb3J0ICYmIGlzTmFOKHBhcnNlSW50KHRoaXMucG9ydCwgMTApKSkge1xuICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGAke0VSUk9SX01FU1NBR0V9OiBJbnZhbGlkIHBvcnQgJHt0aGlzLnBvcnR9YCk7XG4gICAgfVxuICB9XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgV3JhcHBlZEZ1bmN0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5cbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vZ2xvYmFsJztcblxuLy8gVE9ETzogSW1wbGVtZW50IGRpZmZlcmVudCBsb2dnZXJzIGZvciBkaWZmZXJlbnQgZW52aXJvbm1lbnRzXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93IHwgTm9kZUpTLkdsb2JhbD4oKTtcblxuLyoqIFByZWZpeCBmb3IgbG9nZ2luZyBzdHJpbmdzICovXG5jb25zdCBQUkVGSVggPSAnU2VudHJ5IExvZ2dlciAnO1xuXG4vKiogSlNEb2MgKi9cbmludGVyZmFjZSBFeHRlbnNpYmxlQ29uc29sZSBleHRlbmRzIENvbnNvbGUge1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogVGVtcG9yYXJpbHkgdW53cmFwIGBjb25zb2xlLmxvZ2AgYW5kIGZyaWVuZHMgaW4gb3JkZXIgdG8gcGVyZm9ybSB0aGUgZ2l2ZW4gY2FsbGJhY2sgdXNpbmcgdGhlIG9yaWdpbmFsIG1ldGhvZHMuXG4gKiBSZXN0b3JlcyB3cmFwcGluZyBhZnRlciB0aGUgY2FsbGJhY2sgY29tcGxldGVzLlxuICpcbiAqIEBwYXJhbSBjYWxsYmFjayBUaGUgZnVuY3Rpb24gdG8gcnVuIGFnYWluc3QgdGhlIG9yaWdpbmFsIGBjb25zb2xlYCBtZXNzYWdlc1xuICogQHJldHVybnMgVGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zb2xlU2FuZGJveChjYWxsYmFjazogKCkgPT4gYW55KTogYW55IHtcbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcbiAgY29uc3QgbGV2ZWxzID0gWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnbG9nJywgJ2Fzc2VydCddO1xuXG4gIGlmICghKCdjb25zb2xlJyBpbiBnbG9iYWwpKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gIGNvbnN0IG9yaWdpbmFsQ29uc29sZSA9IChnbG9iYWwgYXMgYW55KS5jb25zb2xlIGFzIEV4dGVuc2libGVDb25zb2xlO1xuICBjb25zdCB3cmFwcGVkTGV2ZWxzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG5cbiAgLy8gUmVzdG9yZSBhbGwgd3JhcHBlZCBjb25zb2xlIG1ldGhvZHNcbiAgbGV2ZWxzLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICBpZiAobGV2ZWwgaW4gKGdsb2JhbCBhcyBhbnkpLmNvbnNvbGUgJiYgKG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gYXMgV3JhcHBlZEZ1bmN0aW9uKS5fX3NlbnRyeV9vcmlnaW5hbF9fKSB7XG4gICAgICB3cmFwcGVkTGV2ZWxzW2xldmVsXSA9IG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gYXMgV3JhcHBlZEZ1bmN0aW9uO1xuICAgICAgb3JpZ2luYWxDb25zb2xlW2xldmVsXSA9IChvcmlnaW5hbENvbnNvbGVbbGV2ZWxdIGFzIFdyYXBwZWRGdW5jdGlvbikuX19zZW50cnlfb3JpZ2luYWxfXztcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFBlcmZvcm0gY2FsbGJhY2sgbWFuaXB1bGF0aW9uc1xuICBjb25zdCByZXN1bHQgPSBjYWxsYmFjaygpO1xuXG4gIC8vIFJldmVydCByZXN0b3JhdGlvbiB0byB3cmFwcGVkIHN0YXRlXG4gIE9iamVjdC5rZXlzKHdyYXBwZWRMZXZlbHMpLmZvckVhY2gobGV2ZWwgPT4ge1xuICAgIG9yaWdpbmFsQ29uc29sZVtsZXZlbF0gPSB3cmFwcGVkTGV2ZWxzW2xldmVsXTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIEpTRG9jICovXG5jbGFzcyBMb2dnZXIge1xuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfZW5hYmxlZDogYm9vbGVhbjtcblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgZGlzYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGVuYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgbG9nKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9lbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnNvbGVTYW5kYm94KCgpID0+IHtcbiAgICAgIGdsb2JhbC5jb25zb2xlLmxvZyhgJHtQUkVGSVh9W0xvZ106ICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHdhcm4oLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc29sZVNhbmRib3goKCkgPT4ge1xuICAgICAgZ2xvYmFsLmNvbnNvbGUud2FybihgJHtQUkVGSVh9W1dhcm5dOiAke2FyZ3Muam9pbignICcpfWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBlcnJvciguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlU2FuZGJveCgoKSA9PiB7XG4gICAgICBnbG9iYWwuY29uc29sZS5lcnJvcihgJHtQUkVGSVh9W0Vycm9yXTogJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBFbnN1cmUgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGxvZ2dlciBpbnN0YW5jZSwgZXZlbiBpZiBtdWx0aXBsZSB2ZXJzaW9ucyBvZiBAc2VudHJ5L3V0aWxzIGFyZSBiZWluZyB1c2VkXG5nbG9iYWwuX19TRU5UUllfXyA9IGdsb2JhbC5fX1NFTlRSWV9fIHx8IHt9O1xuY29uc3QgbG9nZ2VyID0gKGdsb2JhbC5fX1NFTlRSWV9fLmxvZ2dlciBhcyBMb2dnZXIpIHx8IChnbG9iYWwuX19TRU5UUllfXy5sb2dnZXIgPSBuZXcgTG9nZ2VyKCkpO1xuXG5leHBvcnQgeyBsb2dnZXIgfTtcbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXMgKi9cbi8qKlxuICogTWVtbyBjbGFzcyB1c2VkIGZvciBkZWN5Y2xlIGpzb24gb2JqZWN0cy4gVXNlcyBXZWFrU2V0IGlmIGF2YWlsYWJsZSBvdGhlcndpc2UgYXJyYXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBNZW1vIHtcbiAgLyoqIERldGVybWluZXMgaWYgV2Vha1NldCBpcyBhdmFpbGFibGUgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfaGFzV2Vha1NldDogYm9vbGVhbjtcbiAgLyoqIEVpdGhlciBXZWFrU2V0IG9yIEFycmF5ICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2lubmVyOiBhbnk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX2hhc1dlYWtTZXQgPSB0eXBlb2YgV2Vha1NldCA9PT0gJ2Z1bmN0aW9uJztcbiAgICB0aGlzLl9pbm5lciA9IHRoaXMuX2hhc1dlYWtTZXQgPyBuZXcgV2Vha1NldCgpIDogW107XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBvYmogdG8gcmVtZW1iZXIuXG4gICAqIEBwYXJhbSBvYmogT2JqZWN0IHRvIHJlbWVtYmVyXG4gICAqL1xuICBwdWJsaWMgbWVtb2l6ZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9oYXNXZWFrU2V0KSB7XG4gICAgICBpZiAodGhpcy5faW5uZXIuaGFzKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICB0aGlzLl9pbm5lci5hZGQob2JqKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItZm9yLW9mXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9pbm5lci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9pbm5lcltpXTtcbiAgICAgIGlmICh2YWx1ZSA9PT0gb2JqKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9pbm5lci5wdXNoKG9iaik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgb2JqZWN0IGZyb20gaW50ZXJuYWwgc3RvcmFnZS5cbiAgICogQHBhcmFtIG9iaiBPYmplY3QgdG8gZm9yZ2V0XG4gICAqL1xuICBwdWJsaWMgdW5tZW1vaXplKG9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2hhc1dlYWtTZXQpIHtcbiAgICAgIHRoaXMuX2lubmVyLmRlbGV0ZShvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX2lubmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0aGlzLl9pbm5lcltpXSA9PT0gb2JqKSB7XG4gICAgICAgICAgdGhpcy5faW5uZXIuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCAiY29uc3QgZGVmYXVsdEZ1bmN0aW9uTmFtZSA9ICc8YW5vbnltb3VzPic7XG5cbi8qKlxuICogU2FmZWx5IGV4dHJhY3QgZnVuY3Rpb24gbmFtZSBmcm9tIGl0c2VsZlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnVuY3Rpb25OYW1lKGZuOiB1bmtub3duKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBpZiAoIWZuIHx8IHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGRlZmF1bHRGdW5jdGlvbk5hbWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5uYW1lIHx8IGRlZmF1bHRGdW5jdGlvbk5hbWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBKdXN0IGFjY2Vzc2luZyBjdXN0b20gcHJvcHMgaW4gc29tZSBTZWxlbml1bSBlbnZpcm9ubWVudHNcbiAgICAvLyBjYW4gY2F1c2UgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXhjZXB0aW9uIChzZWUgcmF2ZW4tanMjNDk1KS5cbiAgICByZXR1cm4gZGVmYXVsdEZ1bmN0aW9uTmFtZTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGlzUmVnRXhwLCBpc1N0cmluZyB9IGZyb20gJy4vaXMnO1xuXG4vKipcbiAqIFRydW5jYXRlcyBnaXZlbiBzdHJpbmcgdG8gdGhlIG1heGltdW0gY2hhcmFjdGVycyBjb3VudFxuICpcbiAqIEBwYXJhbSBzdHIgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHBhcmFtIG1heCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRydW5jYXRlZCBzdHJpbmcgKDAgPSB1bmxpbWl0ZWQpXG4gKiBAcmV0dXJucyBzdHJpbmcgRW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJ1bmNhdGUoc3RyOiBzdHJpbmcsIG1heDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJyB8fCBtYXggPT09IDApIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoIDw9IG1heCA/IHN0ciA6IGAke3N0ci5zdWJzdHIoMCwgbWF4KX0uLi5gO1xufVxuXG4vKipcbiAqIFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgYHRyaW1fbGluZWAgZnJvbVxuICogaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnkvYmxvYi9tYXN0ZXIvc3JjL3NlbnRyeS9sYW5nL2phdmFzY3JpcHQvcHJvY2Vzc29yLnB5I0w2N1xuICpcbiAqIEBwYXJhbSBzdHIgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgc2VyaWFsaXphYmxlIHZhbHVlc1xuICogQHBhcmFtIG1heCBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRydW5jYXRlZCBzdHJpbmdcbiAqIEByZXR1cm5zIHN0cmluZyBFbmNvZGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbmlwTGluZShsaW5lOiBzdHJpbmcsIGNvbG5vOiBudW1iZXIpOiBzdHJpbmcge1xuICBsZXQgbmV3TGluZSA9IGxpbmU7XG4gIGNvbnN0IGxsID0gbmV3TGluZS5sZW5ndGg7XG4gIGlmIChsbCA8PSAxNTApIHtcbiAgICByZXR1cm4gbmV3TGluZTtcbiAgfVxuICBpZiAoY29sbm8gPiBsbCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgIGNvbG5vID0gbGw7XG4gIH1cblxuICBsZXQgc3RhcnQgPSBNYXRoLm1heChjb2xubyAtIDYwLCAwKTtcbiAgaWYgKHN0YXJ0IDwgNSkge1xuICAgIHN0YXJ0ID0gMDtcbiAgfVxuXG4gIGxldCBlbmQgPSBNYXRoLm1pbihzdGFydCArIDE0MCwgbGwpO1xuICBpZiAoZW5kID4gbGwgLSA1KSB7XG4gICAgZW5kID0gbGw7XG4gIH1cbiAgaWYgKGVuZCA9PT0gbGwpIHtcbiAgICBzdGFydCA9IE1hdGgubWF4KGVuZCAtIDE0MCwgMCk7XG4gIH1cblxuICBuZXdMaW5lID0gbmV3TGluZS5zbGljZShzdGFydCwgZW5kKTtcbiAgaWYgKHN0YXJ0ID4gMCkge1xuICAgIG5ld0xpbmUgPSBgJ3tzbmlwfSAke25ld0xpbmV9YDtcbiAgfVxuICBpZiAoZW5kIDwgbGwpIHtcbiAgICBuZXdMaW5lICs9ICcge3NuaXB9JztcbiAgfVxuXG4gIHJldHVybiBuZXdMaW5lO1xufVxuXG4vKipcbiAqIEpvaW4gdmFsdWVzIGluIGFycmF5XG4gKiBAcGFyYW0gaW5wdXQgYXJyYXkgb2YgdmFsdWVzIHRvIGJlIGpvaW5lZCB0b2dldGhlclxuICogQHBhcmFtIGRlbGltaXRlciBzdHJpbmcgdG8gYmUgcGxhY2VkIGluLWJldHdlZW4gdmFsdWVzXG4gKiBAcmV0dXJucyBKb2luZWQgdmFsdWVzXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5leHBvcnQgZnVuY3Rpb24gc2FmZUpvaW4oaW5wdXQ6IGFueVtdLCBkZWxpbWl0ZXI/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gW107XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICB0cnkge1xuICAgICAgb3V0cHV0LnB1c2goU3RyaW5nKHZhbHVlKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgb3V0cHV0LnB1c2goJ1t2YWx1ZSBjYW5ub3QgYmUgc2VyaWFsaXplZF0nKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LmpvaW4oZGVsaW1pdGVyKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHZhbHVlIG1hdGNoZXMgYSByZWdleCBvciBpbmNsdWRlcyB0aGUgc3RyaW5nXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB2YWx1ZSB0byBiZSBjaGVja2VkIGFnYWluc3RcbiAqIEBwYXJhbSBwYXR0ZXJuIEVpdGhlciBhIHJlZ2V4IG9yIGEgc3RyaW5nIHRoYXQgbXVzdCBiZSBjb250YWluZWQgaW4gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hpbmdQYXR0ZXJuKHZhbHVlOiBzdHJpbmcsIHBhdHRlcm46IFJlZ0V4cCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIWlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChpc1JlZ0V4cChwYXR0ZXJuKSkge1xuICAgIHJldHVybiAocGF0dGVybiBhcyBSZWdFeHApLnRlc3QodmFsdWUpO1xuICB9XG4gIGlmICh0eXBlb2YgcGF0dGVybiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5kZXhPZihwYXR0ZXJuKSAhPT0gLTE7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEdpdmVuIGEgc3RyaW5nLCBlc2NhcGUgY2hhcmFjdGVycyB3aGljaCBoYXZlIG1lYW5pbmcgaW4gdGhlIHJlZ2V4IGdyYW1tYXIsIHN1Y2ggdGhhdCB0aGUgcmVzdWx0IGlzIHNhZmUgdG8gZmVlZCB0b1xuICogYG5ldyBSZWdFeHAoKWAuXG4gKlxuICogQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC4gVmVuZG9yZWQgdG8gYSkgcmVkdWNlIHRoZSBzaXplIGJ5IHNraXBwaW5nIHRoZSBydW50aW1lXG4gKiB0eXBlLWNoZWNraW5nLCBhbmQgYikgZW5zdXJlIGl0IGdldHMgZG93bi1jb21waWxlZCBmb3Igb2xkIHZlcnNpb25zIG9mIE5vZGUgKHRoZSBwdWJsaXNoZWQgcGFja2FnZSBvbmx5IHN1cHBvcnRzIE5vZGVcbiAqIDEyKykuXG4gKlxuICogQHBhcmFtIHJlZ2V4U3RyaW5nIFRoZSBzdHJpbmcgdG8gZXNjYXBlXG4gKiBAcmV0dXJucyBBbiB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgc3BlY2lhbCByZWdleCBjaGFyYWN0ZXJzIGVzY2FwZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZVN0cmluZ0ZvclJlZ2V4KHJlZ2V4U3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBlc2NhcGUgdGhlIGh5cGhlbiBzZXBhcmF0ZWx5IHNvIHdlIGNhbiBhbHNvIHJlcGxhY2UgaXQgd2l0aCBhIHVuaWNvZGUgbGl0ZXJhbCBoeXBoZW4sIHRvIGF2b2lkIHRoZSBwcm9ibGVtc1xuICAvLyBkaXNjdXNzZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9lc2NhcGUtc3RyaW5nLXJlZ2V4cC9pc3N1ZXMvMjAuXG4gIHJldHVybiByZWdleFN0cmluZy5yZXBsYWNlKC9bfFxcXFx7fSgpW1xcXV4kKyo/Ll0vZywgJ1xcXFwkJicpLnJlcGxhY2UoLy0vZywgJ1xcXFx4MmQnKTtcbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IEV4dGVuZGVkRXJyb3IsIFdyYXBwZWRGdW5jdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5pbXBvcnQgeyBodG1sVHJlZUFzU3RyaW5nIH0gZnJvbSAnLi9icm93c2VyJztcbmltcG9ydCB7IGlzRWxlbWVudCwgaXNFcnJvciwgaXNFdmVudCwgaXNJbnN0YW5jZU9mLCBpc1BsYWluT2JqZWN0LCBpc1ByaW1pdGl2ZSwgaXNTeW50aGV0aWNFdmVudCB9IGZyb20gJy4vaXMnO1xuaW1wb3J0IHsgTWVtbyB9IGZyb20gJy4vbWVtbyc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbk5hbWUgfSBmcm9tICcuL3N0YWNrdHJhY2UnO1xuaW1wb3J0IHsgdHJ1bmNhdGUgfSBmcm9tICcuL3N0cmluZyc7XG5cbi8qKlxuICogUmVwbGFjZSBhIG1ldGhvZCBpbiBhbiBvYmplY3Qgd2l0aCBhIHdyYXBwZWQgdmVyc2lvbiBvZiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHNvdXJjZSBBbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG1ldGhvZCB0byBiZSB3cmFwcGVkLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSB3cmFwcGVkLlxuICogQHBhcmFtIHJlcGxhY2VtZW50RmFjdG9yeSBBIGhpZ2hlci1vcmRlciBmdW5jdGlvbiB0aGF0IHRha2VzIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBtZXRob2QgYW5kIHJldHVybnMgYVxuICogd3JhcHBlZCB2ZXJzaW9uLiBOb3RlOiBUaGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgYHJlcGxhY2VtZW50RmFjdG9yeWAgbmVlZHMgdG8gYmUgYSBub24tYXJyb3cgZnVuY3Rpb24sIGluIG9yZGVyIHRvXG4gKiBwcmVzZXJ2ZSB0aGUgY29ycmVjdCB2YWx1ZSBvZiBgdGhpc2AsIGFuZCB0aGUgb3JpZ2luYWwgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHVzaW5nIGBvcmlnTWV0aG9kLmNhbGwodGhpcywgPG90aGVyXG4gKiBhcmdzPilgIG9yIGBvcmlnTWV0aG9kLmFwcGx5KHRoaXMsIFs8b3RoZXIgYXJncz5dKWAgKHJhdGhlciB0aGFuIGJlaW5nIGNhbGxlZCBkaXJlY3RseSksIGFnYWluIHRvIHByZXNlcnZlIGB0aGlzYC5cbiAqIEByZXR1cm5zIHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoc291cmNlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBuYW1lOiBzdHJpbmcsIHJlcGxhY2VtZW50RmFjdG9yeTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiB2b2lkIHtcbiAgaWYgKCEobmFtZSBpbiBzb3VyY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWwgPSBzb3VyY2VbbmFtZV0gYXMgKCkgPT4gYW55O1xuICBjb25zdCB3cmFwcGVkID0gcmVwbGFjZW1lbnRGYWN0b3J5KG9yaWdpbmFsKSBhcyBXcmFwcGVkRnVuY3Rpb247XG5cbiAgLy8gTWFrZSBzdXJlIGl0J3MgYSBmdW5jdGlvbiBmaXJzdCwgYXMgd2UgbmVlZCB0byBhdHRhY2ggYW4gZW1wdHkgcHJvdG90eXBlIGZvciBgZGVmaW5lUHJvcGVydGllc2AgdG8gd29ya1xuICAvLyBvdGhlcndpc2UgaXQnbGwgdGhyb3cgXCJUeXBlRXJyb3I6IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzIGNhbGxlZCBvbiBub24tb2JqZWN0XCJcbiAgaWYgKHR5cGVvZiB3cmFwcGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHdyYXBwZWQucHJvdG90eXBlID0gd3JhcHBlZC5wcm90b3R5cGUgfHwge307XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3cmFwcGVkLCB7XG4gICAgICAgIF9fc2VudHJ5X29yaWdpbmFsX186IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2YWx1ZTogb3JpZ2luYWwsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChfT28pIHtcbiAgICAgIC8vIFRoaXMgY2FuIHRocm93IGlmIG11bHRpcGxlIGZpbGwgaGFwcGVucyBvbiBhIGdsb2JhbCBvYmplY3QgbGlrZSBYTUxIdHRwUmVxdWVzdFxuICAgICAgLy8gRml4ZXMgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjA0M1xuICAgIH1cbiAgfVxuXG4gIHNvdXJjZVtuYW1lXSA9IHdyYXBwZWQ7XG59XG5cbi8qKlxuICogRW5jb2RlcyBnaXZlbiBvYmplY3QgaW50byB1cmwtZnJpZW5kbHkgZm9ybWF0XG4gKlxuICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdGhhdCBjb250YWlucyBzZXJpYWxpemFibGUgdmFsdWVzXG4gKiBAcmV0dXJucyBzdHJpbmcgRW5jb2RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsRW5jb2RlKG9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvYmplY3QpXG4gICAgLm1hcChrZXkgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KG9iamVjdFtrZXldKX1gKVxuICAgIC5qb2luKCcmJyk7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhbnkgb2JqZWN0IGludG8gYW4gb2JqZWN0IGxpdGVyYWwgd2l0aCBhbGwgaXRzIGF0dHJpYnV0ZXNcbiAqIGF0dGFjaGVkIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBJbml0aWFsIHNvdXJjZSB0aGF0IHdlIGhhdmUgdG8gdHJhbnNmb3JtIGluIG9yZGVyIGZvciBpdCB0byBiZSB1c2FibGUgYnkgdGhlIHNlcmlhbGl6ZXJcbiAqL1xuZnVuY3Rpb24gZ2V0V2Fsa1NvdXJjZShcbiAgdmFsdWU6IGFueSxcbik6IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufSB7XG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGNvbnN0IGVycm9yID0gdmFsdWUgYXMgRXh0ZW5kZWRFcnJvcjtcbiAgICBjb25zdCBlcnI6IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IGFueTtcbiAgICAgIHN0YWNrOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgICBuYW1lOiBzdHJpbmc7XG4gICAgfSA9IHtcbiAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgICAgc3RhY2s6IGVycm9yLnN0YWNrLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGkgaW4gZXJyb3IpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZXJyb3IsIGkpKSB7XG4gICAgICAgIGVycltpXSA9IGVycm9yW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBlcnI7XG4gIH1cblxuICBpZiAoaXNFdmVudCh2YWx1ZSkpIHtcbiAgICAvKipcbiAgICAgKiBFdmVudC1saWtlIGludGVyZmFjZSB0aGF0J3MgdXNhYmxlIGluIGJyb3dzZXIgYW5kIG5vZGVcbiAgICAgKi9cbiAgICBpbnRlcmZhY2UgU2ltcGxlRXZlbnQge1xuICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgIHRhcmdldD86IHVua25vd247XG4gICAgICBjdXJyZW50VGFyZ2V0PzogdW5rbm93bjtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudCA9IHZhbHVlIGFzIFNpbXBsZUV2ZW50O1xuXG4gICAgY29uc3Qgc291cmNlOiB7XG4gICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgfSA9IHt9O1xuXG4gICAgLy8gQWNjZXNzaW5nIGV2ZW50IGF0dHJpYnV0ZXMgY2FuIHRocm93IChzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvNzY4IGFuZFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzgzOCksIGJ1dCBhY2Nlc3NpbmcgYHR5cGVgIGhhc24ndCBiZWVuIHdyYXBwZWQgaW4gYVxuICAgIC8vIHRyeS1jYXRjaCBpbiBhdCBsZWFzdCB0d28geWVhcnMgYW5kIG5vIG9uZSdzIGNvbXBsYWluZWQsIHNvIHRoYXQncyBsaWtlbHkgbm90IGFuIGlzc3VlIGFueW1vcmVcbiAgICBzb3VyY2UudHlwZSA9IGV2ZW50LnR5cGU7XG5cbiAgICB0cnkge1xuICAgICAgc291cmNlLnRhcmdldCA9IGlzRWxlbWVudChldmVudC50YXJnZXQpXG4gICAgICAgID8gaHRtbFRyZWVBc1N0cmluZyhldmVudC50YXJnZXQpXG4gICAgICAgIDogT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGV2ZW50LnRhcmdldCk7XG4gICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICBzb3VyY2UudGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHNvdXJjZS5jdXJyZW50VGFyZ2V0ID0gaXNFbGVtZW50KGV2ZW50LmN1cnJlbnRUYXJnZXQpXG4gICAgICAgID8gaHRtbFRyZWVBc1N0cmluZyhldmVudC5jdXJyZW50VGFyZ2V0KVxuICAgICAgICA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIHNvdXJjZS5jdXJyZW50VGFyZ2V0ID0gJzx1bmtub3duPic7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBDdXN0b21FdmVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaXNJbnN0YW5jZU9mKHZhbHVlLCBDdXN0b21FdmVudCkpIHtcbiAgICAgIHNvdXJjZS5kZXRhaWwgPSBldmVudC5kZXRhaWw7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhdHRyIGluIGV2ZW50KSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGV2ZW50LCBhdHRyKSkge1xuICAgICAgICBzb3VyY2VbYXR0cl0gPSBldmVudFthdHRyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlIGFzIHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH07XG59XG5cbi8qKiBDYWxjdWxhdGVzIGJ5dGVzIHNpemUgb2YgaW5wdXQgc3RyaW5nICovXG5mdW5jdGlvbiB1dGY4TGVuZ3RoKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICByZXR1cm4gfi1lbmNvZGVVUkkodmFsdWUpLnNwbGl0KC8lLi58Li8pLmxlbmd0aDtcbn1cblxuLyoqIENhbGN1bGF0ZXMgYnl0ZXMgc2l6ZSBvZiBpbnB1dCBvYmplY3QgKi9cbmZ1bmN0aW9uIGpzb25TaXplKHZhbHVlOiBhbnkpOiBudW1iZXIge1xuICByZXR1cm4gdXRmOExlbmd0aChKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xufVxuXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUb1NpemU8VD4oXG4gIG9iamVjdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSxcbiAgLy8gRGVmYXVsdCBOb2RlLmpzIFJFUEwgZGVwdGhcbiAgZGVwdGg6IG51bWJlciA9IDMsXG4gIC8vIDEwMGtCLCBhcyAyMDBrQiBpcyBtYXggcGF5bG9hZCBzaXplLCBzbyBoYWxmIHNvdW5kcyByZWFzb25hYmxlXG4gIG1heFNpemU6IG51bWJlciA9IDEwMCAqIDEwMjQsXG4pOiBUIHtcbiAgY29uc3Qgc2VyaWFsaXplZCA9IG5vcm1hbGl6ZShvYmplY3QsIGRlcHRoKTtcblxuICBpZiAoanNvblNpemUoc2VyaWFsaXplZCkgPiBtYXhTaXplKSB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZVRvU2l6ZShvYmplY3QsIGRlcHRoIC0gMSwgbWF4U2l6ZSk7XG4gIH1cblxuICByZXR1cm4gc2VyaWFsaXplZCBhcyBUO1xufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBhbnkgbm9uLXByaW1pdGl2ZSwgQmlnSW50LCBvciBTeW1ib2wtdHlwZSB2YWx1ZSBpbnRvIGEgc3RyaW5nLiBBY3RzIGFzIGEgbm8tb3Agb24gc3RyaW5ncywgbnVtYmVycyxcbiAqIGJvb2xlYW5zLCBudWxsLCBhbmQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gc3RyaW5naWZ5XG4gKiBAcmV0dXJucyBGb3Igbm9uLXByaW1pdGl2ZSwgQmlnSW50LCBhbmQgU3ltYm9sLXR5cGUgdmFsdWVzLCBhIHN0cmluZyBkZW5vdGluZyB0aGUgdmFsdWUncyB0eXBlLCB0eXBlIGFuZCB2YWx1ZSwgb3JcbiAqICB0eXBlIGFuZCBgZGVzY3JpcHRpb25gIHByb3BlcnR5LCByZXNwZWN0aXZlbHkuIEZvciBub24tQmlnSW50LCBub24tU3ltYm9sIHByaW1pdGl2ZXMsIHJldHVybnMgdGhlIG9yaWdpbmFsIHZhbHVlLFxuICogIHVuY2hhbmdlZC5cbiAqL1xuZnVuY3Rpb24gc2VyaWFsaXplVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gIGNvbnN0IHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuXG4gIC8vIE5vZGUuanMgUkVQTCBub3RhdGlvblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICByZXR1cm4gJ1tPYmplY3RdJztcbiAgfVxuICBpZiAodHlwZSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgIHJldHVybiAnW0FycmF5XSc7XG4gIH1cblxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUodmFsdWUpO1xuICByZXR1cm4gaXNQcmltaXRpdmUobm9ybWFsaXplZCkgPyBub3JtYWxpemVkIDogdHlwZTtcbn1cblxuLyoqXG4gKiBub3JtYWxpemVWYWx1ZSgpXG4gKlxuICogVGFrZXMgdW5zZXJpYWxpemFibGUgaW5wdXQgYW5kIG1ha2UgaXQgc2VyaWFsaXphYmxlIGZyaWVuZGx5XG4gKlxuICogLSB0cmFuc2xhdGVzIHVuZGVmaW5lZC9OYU4gdmFsdWVzIHRvIFwiW3VuZGVmaW5lZF1cIi9cIltOYU5dXCIgcmVzcGVjdGl2ZWx5LFxuICogLSBzZXJpYWxpemVzIEVycm9yIG9iamVjdHNcbiAqIC0gZmlsdGVyIGdsb2JhbCBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVZhbHVlPFQ+KHZhbHVlOiBULCBrZXk/OiBhbnkpOiBUIHwgc3RyaW5nIHtcbiAgaWYgKGtleSA9PT0gJ2RvbWFpbicgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAoKHZhbHVlIGFzIHVua25vd24pIGFzIHsgX2V2ZW50czogYW55IH0pLl9ldmVudHMpIHtcbiAgICByZXR1cm4gJ1tEb21haW5dJztcbiAgfVxuXG4gIGlmIChrZXkgPT09ICdkb21haW5FbWl0dGVyJykge1xuICAgIHJldHVybiAnW0RvbWFpbkVtaXR0ZXJdJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgKGdsb2JhbCBhcyBhbnkpICE9PSAndW5kZWZpbmVkJyAmJiAodmFsdWUgYXMgdW5rbm93bikgPT09IGdsb2JhbCkge1xuICAgIHJldHVybiAnW0dsb2JhbF0nO1xuICB9XG5cbiAgLy8gSXQncyBzYWZlIHRvIHVzZSBgd2luZG93YCBhbmQgYGRvY3VtZW50YCBoZXJlIGluIHRoaXMgbWFubmVyLCBhcyB3ZSBhcmUgYXNzZXJ0aW5nIHVzaW5nIGB0eXBlb2ZgIGZpcnN0XG4gIC8vIHdoaWNoIHdvbid0IHRocm93IGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50LlxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHNcbiAgaWYgKHR5cGVvZiAod2luZG93IGFzIGFueSkgIT09ICd1bmRlZmluZWQnICYmICh2YWx1ZSBhcyB1bmtub3duKSA9PT0gd2luZG93KSB7XG4gICAgcmV0dXJuICdbV2luZG93XSc7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzXG4gIGlmICh0eXBlb2YgKGRvY3VtZW50IGFzIGFueSkgIT09ICd1bmRlZmluZWQnICYmICh2YWx1ZSBhcyB1bmtub3duKSA9PT0gZG9jdW1lbnQpIHtcbiAgICByZXR1cm4gJ1tEb2N1bWVudF0nO1xuICB9XG5cbiAgLy8gUmVhY3QncyBTeW50aGV0aWNFdmVudCB0aGluZ3lcbiAgaWYgKGlzU3ludGhldGljRXZlbnQodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbU3ludGhldGljRXZlbnRdJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHZhbHVlICE9PSB2YWx1ZSkge1xuICAgIHJldHVybiAnW05hTl0nO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4gJ1t1bmRlZmluZWRdJztcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gYFtGdW5jdGlvbjogJHtnZXRGdW5jdGlvbk5hbWUodmFsdWUpfV1gO1xuICB9XG5cbiAgLy8gc3ltYm9scyBhbmQgYmlnaW50cyBhcmUgY29uc2lkZXJlZCBwcmltaXRpdmVzIGJ5IFRTLCBidXQgYXJlbid0IG5hdGl2ZWx5IEpTT04tc2VyaWxhaXphYmxlXG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N5bWJvbCcpIHtcbiAgICByZXR1cm4gYFske1N0cmluZyh2YWx1ZSl9XWA7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBgW0JpZ0ludDogJHtTdHJpbmcodmFsdWUpfV1gO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFdhbGtzIGFuIG9iamVjdCB0byBwZXJmb3JtIGEgbm9ybWFsaXphdGlvbiBvbiBpdFxuICpcbiAqIEBwYXJhbSBrZXkgb2Ygb2JqZWN0IHRoYXQncyB3YWxrZWQgaW4gY3VycmVudCBpdGVyYXRpb25cbiAqIEBwYXJhbSB2YWx1ZSBvYmplY3QgdG8gYmUgd2Fsa2VkXG4gKiBAcGFyYW0gZGVwdGggT3B0aW9uYWwgbnVtYmVyIGluZGljYXRpbmcgaG93IGRlZXAgc2hvdWxkIHdhbGtpbmcgYmUgcGVyZm9ybWVkXG4gKiBAcGFyYW0gbWVtbyBPcHRpb25hbCBNZW1vIGNsYXNzIGhhbmRsaW5nIGRlY3ljbGluZ1xuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIHdhbGsoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIGRlcHRoOiBudW1iZXIgPSArSW5maW5pdHksIG1lbW86IE1lbW8gPSBuZXcgTWVtbygpKTogYW55IHtcbiAgLy8gSWYgd2UgcmVhY2ggdGhlIG1heGltdW0gZGVwdGgsIHNlcmlhbGl6ZSB3aGF0ZXZlciBoYXMgbGVmdFxuICBpZiAoZGVwdGggPT09IDApIHtcbiAgICByZXR1cm4gc2VyaWFsaXplVmFsdWUodmFsdWUpO1xuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gIC8vIElmIHZhbHVlIGltcGxlbWVudHMgYHRvSlNPTmAgbWV0aG9kLCBjYWxsIGl0IGFuZCByZXR1cm4gZWFybHlcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlLnRvSlNPTiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiB2YWx1ZS50b0pTT04oKTtcbiAgfVxuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuXG4gIC8vIElmIG5vcm1hbGl6ZWQgdmFsdWUgaXMgYSBwcmltaXRpdmUsIHRoZXJlIGFyZSBubyBicmFuY2hlcyBsZWZ0IHRvIHdhbGssIHNvIHdlIGNhbiBqdXN0IGJhaWwgb3V0LCBhcyB0aGVyZXMgbm8gcG9pbnQgaW4gZ29pbmcgZG93biB0aGF0IGJyYW5jaCBhbnkgZnVydGhlclxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplVmFsdWUodmFsdWUsIGtleSk7XG4gIGlmIChpc1ByaW1pdGl2ZShub3JtYWxpemVkKSkge1xuICAgIHJldHVybiBub3JtYWxpemVkO1xuICB9XG5cbiAgLy8gQ3JlYXRlIHNvdXJjZSB0aGF0IHdlIHdpbGwgdXNlIGZvciBuZXh0IGl0dGVyYXRpb25zLCBlaXRoZXIgb2JqZWN0aWZpZWQgZXJyb3Igb2JqZWN0IChFcnJvciB0eXBlIHdpdGggZXh0cmFjdGVkIGtleXM6dmFsdWUgcGFpcnMpIG9yIHRoZSBpbnB1dCBpdHNlbGZcbiAgY29uc3Qgc291cmNlID0gZ2V0V2Fsa1NvdXJjZSh2YWx1ZSk7XG5cbiAgLy8gQ3JlYXRlIGFuIGFjY3VtdWxhdG9yIHRoYXQgd2lsbCBhY3QgYXMgYSBwYXJlbnQgZm9yIGFsbCBmdXR1cmUgaXR0ZXJhdGlvbnMgb2YgdGhhdCBicmFuY2hcbiAgY29uc3QgYWNjID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBbXSA6IHt9O1xuXG4gIC8vIElmIHdlIGFscmVhZHkgd2Fsa2VkIHRoYXQgYnJhbmNoLCBiYWlsIG91dCwgYXMgaXQncyBjaXJjdWxhciByZWZlcmVuY2VcbiAgaWYgKG1lbW8ubWVtb2l6ZSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gJ1tDaXJjdWxhciB+XSc7XG4gIH1cblxuICAvLyBXYWxrIGFsbCBrZXlzIG9mIHRoZSBzb3VyY2VcbiAgZm9yIChjb25zdCBpbm5lcktleSBpbiBzb3VyY2UpIHtcbiAgICAvLyBBdm9pZCBpdGVyYXRpbmcgb3ZlciBmaWVsZHMgaW4gdGhlIHByb3RvdHlwZSBpZiB0aGV5J3ZlIHNvbWVob3cgYmVlbiBleHBvc2VkIHRvIGVudW1lcmF0aW9uLlxuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwgaW5uZXJLZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gUmVjdXJzaXZlbHkgd2FsayB0aHJvdWdoIGFsbCB0aGUgY2hpbGQgbm9kZXNcbiAgICAoYWNjIGFzIHsgW2tleTogc3RyaW5nXTogYW55IH0pW2lubmVyS2V5XSA9IHdhbGsoaW5uZXJLZXksIHNvdXJjZVtpbm5lcktleV0sIGRlcHRoIC0gMSwgbWVtbyk7XG4gIH1cblxuICAvLyBPbmNlIHdhbGtlZCB0aHJvdWdoIGFsbCB0aGUgYnJhbmNoZXMsIHJlbW92ZSB0aGUgcGFyZW50IGZyb20gbWVtbyBzdG9yYWdlXG4gIG1lbW8udW5tZW1vaXplKHZhbHVlKTtcblxuICAvLyBSZXR1cm4gYWNjdW11bGF0ZWQgdmFsdWVzXG4gIHJldHVybiBhY2M7XG59XG5cbi8qKlxuICogbm9ybWFsaXplKClcbiAqXG4gKiAtIENyZWF0ZXMgYSBjb3B5IHRvIHByZXZlbnQgb3JpZ2luYWwgaW5wdXQgbXV0YXRpb25cbiAqIC0gU2tpcCBub24tZW51bWVyYWJsZXJzXG4gKiAtIENhbGxzIGB0b0pTT05gIGlmIGltcGxlbWVudGVkXG4gKiAtIFJlbW92ZXMgY2lyY3VsYXIgcmVmZXJlbmNlc1xuICogLSBUcmFuc2xhdGVzIG5vbi1zZXJpYWxpemVhYmxlIHZhbHVlcyAodW5kZWZpbmVkL05hTi9GdW5jdGlvbnMpIHRvIHNlcmlhbGl6YWJsZSBmb3JtYXRcbiAqIC0gVHJhbnNsYXRlcyBrbm93biBnbG9iYWwgb2JqZWN0cy9DbGFzc2VzIHRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uc1xuICogLSBUYWtlcyBjYXJlIG9mIEVycm9yIG9iamVjdHMgc2VyaWFsaXphdGlvblxuICogLSBPcHRpb25hbGx5IGxpbWl0IGRlcHRoIG9mIGZpbmFsIG91dHB1dFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZShpbnB1dDogYW55LCBkZXB0aD86IG51bWJlcik6IGFueSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5wdXQsIChrZXk6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gd2FsayhrZXksIHZhbHVlLCBkZXB0aCkpKTtcbiAgfSBjYXRjaCAoX29PKSB7XG4gICAgcmV0dXJuICcqKm5vbi1zZXJpYWxpemFibGUqKic7XG4gIH1cbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgY2FwdHVyZWQgZXhjZXB0aW9uLCBleHRyYWN0IGl0cyBrZXlzIGFuZCBjcmVhdGUgYSBzb3J0ZWRcbiAqIGFuZCB0cnVuY2F0ZWQgbGlzdCB0aGF0IHdpbGwgYmUgdXNlZCBpbnNpZGUgdGhlIGV2ZW50IG1lc3NhZ2UuXG4gKiBlZy4gYE5vbi1lcnJvciBleGNlcHRpb24gY2FwdHVyZWQgd2l0aCBrZXlzOiBmb28sIGJhciwgYmF6YFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RFeGNlcHRpb25LZXlzRm9yTWVzc2FnZShleGNlcHRpb246IGFueSwgbWF4TGVuZ3RoOiBudW1iZXIgPSA0MCk6IHN0cmluZyB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhnZXRXYWxrU291cmNlKGV4Y2VwdGlvbikpO1xuICBrZXlzLnNvcnQoKTtcblxuICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICdbb2JqZWN0IGhhcyBubyBrZXlzXSc7XG4gIH1cblxuICBpZiAoa2V5c1swXS5sZW5ndGggPj0gbWF4TGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRydW5jYXRlKGtleXNbMF0sIG1heExlbmd0aCk7XG4gIH1cblxuICBmb3IgKGxldCBpbmNsdWRlZEtleXMgPSBrZXlzLmxlbmd0aDsgaW5jbHVkZWRLZXlzID4gMDsgaW5jbHVkZWRLZXlzLS0pIHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0ga2V5cy5zbGljZSgwLCBpbmNsdWRlZEtleXMpLmpvaW4oJywgJyk7XG4gICAgaWYgKHNlcmlhbGl6ZWQubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGluY2x1ZGVkS2V5cyA9PT0ga2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1bmNhdGUoc2VyaWFsaXplZCwgbWF4TGVuZ3RoKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn1cblxuLyoqXG4gKiBHaXZlbiBhbnkgb2JqZWN0LCByZXR1cm4gdGhlIG5ldyBvYmplY3Qgd2l0aCByZW1vdmVkIGtleXMgdGhhdCB2YWx1ZSB3YXMgYHVuZGVmaW5lZGAuXG4gKiBXb3JrcyByZWN1cnNpdmVseSBvbiBvYmplY3RzIGFuZCBhcnJheXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcm9wVW5kZWZpbmVkS2V5czxUPih2YWw6IFQpOiBUIHtcbiAgaWYgKGlzUGxhaW5PYmplY3QodmFsKSkge1xuICAgIGNvbnN0IG9iaiA9IHZhbCBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuICAgIGNvbnN0IHJ2OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob2JqKSkge1xuICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcnZba2V5XSA9IGRyb3BVbmRlZmluZWRLZXlzKG9ialtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJ2IGFzIFQ7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgcmV0dXJuICh2YWwgYXMgYW55W10pLm1hcChkcm9wVW5kZWZpbmVkS2V5cykgYXMgYW55O1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhhdCBzb21ldGhpbmcgaXMgYW4gb2JqZWN0LlxuICpcbiAqIFR1cm5zIGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgaW50byBgU3RyaW5nYHMgYW5kIGFsbCBvdGhlciBwcmltaXRpdmVzIGludG8gaW5zdGFuY2VzIG9mIHRoZWlyIHJlc3BlY3RpdmUgd3JhcHBlclxuICogY2xhc3NlcyAoU3RyaW5nLCBCb29sZWFuLCBOdW1iZXIsIGV0Yy4pLiBBY3RzIGFzIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBvbiBub24tcHJpbWl0aXZlcy5cbiAqXG4gKiBAcGFyYW0gd2F0IFRoZSBzdWJqZWN0IG9mIHRoZSBvYmplY3RpZmljYXRpb25cbiAqIEByZXR1cm5zIEEgdmVyc2lvbiBvZiBgd2F0YCB3aGljaCBjYW4gc2FmZWx5IGJlIHVzZWQgd2l0aCBgT2JqZWN0YCBjbGFzcyBtZXRob2RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYmplY3RpZnkod2F0OiB1bmtub3duKTogdHlwZW9mIE9iamVjdCB7XG4gIGxldCBvYmplY3RpZmllZDtcbiAgc3dpdGNoICh0cnVlKSB7XG4gICAgY2FzZSB3YXQgPT09IHVuZGVmaW5lZCB8fCB3YXQgPT09IG51bGw6XG4gICAgICBvYmplY3RpZmllZCA9IG5ldyBTdHJpbmcod2F0KTtcbiAgICAgIGJyZWFrO1xuXG4gICAgLy8gVGhvdWdoIHN5bWJvbHMgYW5kIGJpZ2ludHMgZG8gaGF2ZSB3cmFwcGVyIGNsYXNzZXMgKGBTeW1ib2xgIGFuZCBgQmlnSW50YCwgcmVzcGVjdGl2ZWx5KSwgZm9yIHdoYXRldmVyIHJlYXNvblxuICAgIC8vIHRob3NlIGNsYXNzZXMgZG9uJ3QgaGF2ZSBjb25zdHJ1Y3RvcnMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCB0aGUgYG5ld2Aga2V5d29yZC4gV2UgdGhlcmVmb3JlIG5lZWQgdG8gY2FzdCBlYWNoIGFzXG4gICAgLy8gYW4gb2JqZWN0IGluIG9yZGVyIHRvIHdyYXAgaXQuXG4gICAgY2FzZSB0eXBlb2Ygd2F0ID09PSAnc3ltYm9sJyB8fCB0eXBlb2Ygd2F0ID09PSAnYmlnaW50JzpcbiAgICAgIG9iamVjdGlmaWVkID0gT2JqZWN0KHdhdCk7XG4gICAgICBicmVhaztcblxuICAgIC8vIHRoaXMgd2lsbCBjYXRjaCB0aGUgcmVtYWluaW5nIHByaW1pdGl2ZXM6IGBTdHJpbmdgLCBgTnVtYmVyYCwgYW5kIGBCb29sZWFuYFxuICAgIGNhc2UgaXNQcmltaXRpdmUod2F0KTpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIG9iamVjdGlmaWVkID0gbmV3ICh3YXQgYXMgYW55KS5jb25zdHJ1Y3Rvcih3YXQpO1xuICAgICAgYnJlYWs7XG5cbiAgICAvLyBieSBwcm9jZXNzIG9mIGVsaW1pbmF0aW9uLCBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBgd2F0YCBtdXN0IGFscmVhZHkgYmUgYW4gb2JqZWN0XG4gICAgZGVmYXVsdDpcbiAgICAgIG9iamVjdGlmaWVkID0gd2F0O1xuICAgICAgYnJlYWs7XG4gIH1cbiAgcmV0dXJuIG9iamVjdGlmaWVkO1xufVxuIiwgImltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRXJyb3JFdmVudCBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNFcnJvckV2ZW50fS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNFcnJvckV2ZW50KCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIG5ldyBFcnJvckV2ZW50KCcnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBET01FcnJvciBvYmplY3RzXG4gKiB7QGxpbmsgc3VwcG9ydHNET01FcnJvcn0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRE9NRXJyb3IoKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgLy8gQ2hyb21lOiBWTTg5OjEgVW5jYXVnaHQgVHlwZUVycm9yOiBGYWlsZWQgdG8gY29uc3RydWN0ICdET01FcnJvcic6XG4gICAgLy8gMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LlxuICAgIC8vIEB0cy1pZ25vcmUgSXQgcmVhbGx5IG5lZWRzIDEgYXJndW1lbnQsIG5vdCAwLlxuICAgIG5ldyBET01FcnJvcignJyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgRE9NRXhjZXB0aW9uIG9iamVjdHNcbiAqIHtAbGluayBzdXBwb3J0c0RPTUV4Y2VwdGlvbn0uXG4gKlxuICogQHJldHVybnMgQW5zd2VyIHRvIHRoZSBnaXZlbiBxdWVzdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzRE9NRXhjZXB0aW9uKCk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIG5ldyBET01FeGNlcHRpb24oJycpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIEZldGNoIEFQSVxuICoge0BsaW5rIHN1cHBvcnRzRmV0Y2h9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0ZldGNoKCk6IGJvb2xlYW4ge1xuICBpZiAoISgnZmV0Y2gnIGluIGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBuZXcgSGVhZGVycygpO1xuICAgIG5ldyBSZXF1ZXN0KCcnKTtcbiAgICBuZXcgUmVzcG9uc2UoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuLyoqXG4gKiBpc05hdGl2ZUZldGNoIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZmV0Y2goKVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGZ1bmN0aW9uIGlzTmF0aXZlRmV0Y2goZnVuYzogRnVuY3Rpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGZ1bmMgJiYgL15mdW5jdGlvbiBmZXRjaFxcKFxcKVxccytcXHtcXHMrXFxbbmF0aXZlIGNvZGVcXF1cXHMrXFx9JC8udGVzdChmdW5jLnRvU3RyaW5nKCkpO1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBGZXRjaCBBUEkgbmF0aXZlbHlcbiAqIHtAbGluayBzdXBwb3J0c05hdGl2ZUZldGNofS5cbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIGB3aW5kb3cuZmV0Y2hgIGlzIG5hdGl2ZWx5IGltcGxlbWVudGVkLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHBvcnRzTmF0aXZlRmV0Y2goKTogYm9vbGVhbiB7XG4gIGlmICghc3VwcG9ydHNGZXRjaCgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcblxuICAvLyBGYXN0IHBhdGggdG8gYXZvaWQgRE9NIEkvT1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gIGlmIChpc05hdGl2ZUZldGNoKGdsb2JhbC5mZXRjaCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHdpbmRvdy5mZXRjaCBpcyBpbXBsZW1lbnRlZCwgYnV0IGlzIHBvbHlmaWxsZWQgb3IgYWxyZWFkeSB3cmFwcGVkIChlLmc6IGJ5IGEgY2hyb21lIGV4dGVuc2lvbilcbiAgLy8gc28gY3JlYXRlIGEgXCJwdXJlXCIgaWZyYW1lIHRvIHNlZSBpZiB0aGF0IGhhcyBuYXRpdmUgZmV0Y2hcbiAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICBjb25zdCBkb2MgPSBnbG9iYWwuZG9jdW1lbnQ7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICBpZiAoZG9jICYmIHR5cGVvZiAoZG9jLmNyZWF0ZUVsZW1lbnQgYXMgdW5rbm93bikgPT09IGBmdW5jdGlvbmApIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuZGJveCA9IGRvYy5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgIHNhbmRib3guaGlkZGVuID0gdHJ1ZTtcbiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNhbmRib3gpO1xuICAgICAgaWYgKHNhbmRib3guY29udGVudFdpbmRvdyAmJiBzYW5kYm94LmNvbnRlbnRXaW5kb3cuZmV0Y2gpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICByZXN1bHQgPSBpc05hdGl2ZUZldGNoKHNhbmRib3guY29udGVudFdpbmRvdy5mZXRjaCk7XG4gICAgICB9XG4gICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzYW5kYm94KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDb3VsZCBub3QgY3JlYXRlIHNhbmRib3ggaWZyYW1lIGZvciBwdXJlIGZldGNoIGNoZWNrLCBiYWlsaW5nIHRvIHdpbmRvdy5mZXRjaDogJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFRlbGxzIHdoZXRoZXIgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cyBSZXBvcnRpbmdPYnNlcnZlciBBUElcbiAqIHtAbGluayBzdXBwb3J0c1JlcG9ydGluZ09ic2VydmVyfS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNSZXBvcnRpbmdPYnNlcnZlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuICdSZXBvcnRpbmdPYnNlcnZlcicgaW4gZ2V0R2xvYmFsT2JqZWN0KCk7XG59XG5cbi8qKlxuICogVGVsbHMgd2hldGhlciBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzIFJlZmVycmVyIFBvbGljeSBBUElcbiAqIHtAbGluayBzdXBwb3J0c1JlZmVycmVyUG9saWN5fS5cbiAqXG4gKiBAcmV0dXJucyBBbnN3ZXIgdG8gdGhlIGdpdmVuIHF1ZXN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VwcG9ydHNSZWZlcnJlclBvbGljeSgpOiBib29sZWFuIHtcbiAgLy8gRGVzcGl0ZSBhbGwgc3RhcnMgaW4gdGhlIHNreSBzYXlpbmcgdGhhdCBFZGdlIHN1cHBvcnRzIG9sZCBkcmFmdCBzeW50YXgsIGFrYSAnbmV2ZXInLCAnYWx3YXlzJywgJ29yaWdpbicgYW5kICdkZWZhdWx0XG4gIC8vIGh0dHBzOi8vY2FuaXVzZS5jb20vI2ZlYXQ9cmVmZXJyZXItcG9saWN5XG4gIC8vIEl0IGRvZXNuJ3QuIEFuZCBpdCB0aHJvdyBleGNlcHRpb24gaW5zdGVhZCBvZiBpZ25vcmluZyB0aGlzIHBhcmFtZXRlci4uLlxuICAvLyBSRUY6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvcmF2ZW4tanMvaXNzdWVzLzEyMzNcblxuICBpZiAoIXN1cHBvcnRzRmV0Y2goKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbmV3IFJlcXVlc3QoJ18nLCB7XG4gICAgICByZWZlcnJlclBvbGljeTogJ29yaWdpbicgYXMgUmVmZXJyZXJQb2xpY3ksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUZWxscyB3aGV0aGVyIGN1cnJlbnQgZW52aXJvbm1lbnQgc3VwcG9ydHMgSGlzdG9yeSBBUElcbiAqIHtAbGluayBzdXBwb3J0c0hpc3Rvcnl9LlxuICpcbiAqIEByZXR1cm5zIEFuc3dlciB0byB0aGUgZ2l2ZW4gcXVlc3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdXBwb3J0c0hpc3RvcnkoKTogYm9vbGVhbiB7XG4gIC8vIE5PVEU6IGluIENocm9tZSBBcHAgZW52aXJvbm1lbnQsIHRvdWNoaW5nIGhpc3RvcnkucHVzaFN0YXRlLCAqZXZlbiBpbnNpZGVcbiAgLy8gICAgICAgYSB0cnkvY2F0Y2ggYmxvY2sqLCB3aWxsIGNhdXNlIENocm9tZSB0byBvdXRwdXQgYW4gZXJyb3IgdG8gY29uc29sZS5lcnJvclxuICAvLyBib3Jyb3dlZCBmcm9tOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLmpzL3B1bGwvMTM5NDUvZmlsZXNcbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PFdpbmRvdz4oKTtcbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGNvbnN0IGNocm9tZSA9IChnbG9iYWwgYXMgYW55KS5jaHJvbWU7XG4gIGNvbnN0IGlzQ2hyb21lUGFja2FnZWRBcHAgPSBjaHJvbWUgJiYgY2hyb21lLmFwcCAmJiBjaHJvbWUuYXBwLnJ1bnRpbWU7XG4gIC8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzICovXG4gIGNvbnN0IGhhc0hpc3RvcnlBcGkgPSAnaGlzdG9yeScgaW4gZ2xvYmFsICYmICEhZ2xvYmFsLmhpc3RvcnkucHVzaFN0YXRlICYmICEhZ2xvYmFsLmhpc3RvcnkucmVwbGFjZVN0YXRlO1xuXG4gIHJldHVybiAhaXNDaHJvbWVQYWNrYWdlZEFwcCAmJiBoYXNIaXN0b3J5QXBpO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlcyAqL1xuaW1wb3J0IHsgV3JhcHBlZEZ1bmN0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5cbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJy4vZ2xvYmFsJztcbmltcG9ydCB7IGlzSW5zdGFuY2VPZiwgaXNTdHJpbmcgfSBmcm9tICcuL2lzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGZpbGwgfSBmcm9tICcuL29iamVjdCc7XG5pbXBvcnQgeyBnZXRGdW5jdGlvbk5hbWUgfSBmcm9tICcuL3N0YWNrdHJhY2UnO1xuaW1wb3J0IHsgc3VwcG9ydHNIaXN0b3J5LCBzdXBwb3J0c05hdGl2ZUZldGNoIH0gZnJvbSAnLi9zdXBwb3J0cyc7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG5cbi8qKiBPYmplY3QgZGVzY3JpYmluZyBoYW5kbGVyIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgZm9yIGEgZ2l2ZW4gYHR5cGVgIG9mIGluc3RydW1lbnRhdGlvbiAqL1xuaW50ZXJmYWNlIEluc3RydW1lbnRIYW5kbGVyIHtcbiAgdHlwZTogSW5zdHJ1bWVudEhhbmRsZXJUeXBlO1xuICBjYWxsYmFjazogSW5zdHJ1bWVudEhhbmRsZXJDYWxsYmFjaztcbn1cbnR5cGUgSW5zdHJ1bWVudEhhbmRsZXJUeXBlID1cbiAgfCAnY29uc29sZSdcbiAgfCAnZG9tJ1xuICB8ICdmZXRjaCdcbiAgfCAnaGlzdG9yeSdcbiAgfCAnc2VudHJ5J1xuICB8ICd4aHInXG4gIHwgJ2Vycm9yJ1xuICB8ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudHlwZSBJbnN0cnVtZW50SGFuZGxlckNhbGxiYWNrID0gKGRhdGE6IGFueSkgPT4gdm9pZDtcblxuLyoqXG4gKiBJbnN0cnVtZW50IG5hdGl2ZSBBUElzIHRvIGNhbGwgaGFuZGxlcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYnJlYWRjcnVtYnMsIEFQTSBzcGFucyBldGMuXG4gKiAgLSBDb25zb2xlIEFQSVxuICogIC0gRmV0Y2ggQVBJXG4gKiAgLSBYSFIgQVBJXG4gKiAgLSBIaXN0b3J5IEFQSVxuICogIC0gRE9NIEFQSSAoY2xpY2svdHlwaW5nKVxuICogIC0gRXJyb3IgQVBJXG4gKiAgLSBVbmhhbmRsZWRSZWplY3Rpb24gQVBJXG4gKi9cblxuY29uc3QgaGFuZGxlcnM6IHsgW2tleSBpbiBJbnN0cnVtZW50SGFuZGxlclR5cGVdPzogSW5zdHJ1bWVudEhhbmRsZXJDYWxsYmFja1tdIH0gPSB7fTtcbmNvbnN0IGluc3RydW1lbnRlZDogeyBba2V5IGluIEluc3RydW1lbnRIYW5kbGVyVHlwZV0/OiBib29sZWFuIH0gPSB7fTtcblxuLyoqIEluc3RydW1lbnRzIGdpdmVuIEFQSSAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudCh0eXBlOiBJbnN0cnVtZW50SGFuZGxlclR5cGUpOiB2b2lkIHtcbiAgaWYgKGluc3RydW1lbnRlZFt0eXBlXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGluc3RydW1lbnRlZFt0eXBlXSA9IHRydWU7XG5cbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAnY29uc29sZSc6XG4gICAgICBpbnN0cnVtZW50Q29uc29sZSgpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZG9tJzpcbiAgICAgIGluc3RydW1lbnRET00oKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3hocic6XG4gICAgICBpbnN0cnVtZW50WEhSKCk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmZXRjaCc6XG4gICAgICBpbnN0cnVtZW50RmV0Y2goKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2hpc3RvcnknOlxuICAgICAgaW5zdHJ1bWVudEhpc3RvcnkoKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGluc3RydW1lbnRFcnJvcigpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndW5oYW5kbGVkcmVqZWN0aW9uJzpcbiAgICAgIGluc3RydW1lbnRVbmhhbmRsZWRSZWplY3Rpb24oKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBsb2dnZXIud2FybigndW5rbm93biBpbnN0cnVtZW50YXRpb24gdHlwZTonLCB0eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkZCBoYW5kbGVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBnaXZlbiB0eXBlIG9mIGluc3RydW1lbnRhdGlvbiB0cmlnZ2Vycy5cbiAqIFVzZSBhdCB5b3VyIG93biByaXNrLCB0aGlzIG1pZ2h0IGJyZWFrIHdpdGhvdXQgY2hhbmdlbG9nIG5vdGljZSwgb25seSB1c2VkIGludGVybmFsbHkuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKGhhbmRsZXI6IEluc3RydW1lbnRIYW5kbGVyKTogdm9pZCB7XG4gIGlmICghaGFuZGxlciB8fCB0eXBlb2YgaGFuZGxlci50eXBlICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgaGFuZGxlci5jYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybjtcbiAgfVxuICBoYW5kbGVyc1toYW5kbGVyLnR5cGVdID0gaGFuZGxlcnNbaGFuZGxlci50eXBlXSB8fCBbXTtcbiAgKGhhbmRsZXJzW2hhbmRsZXIudHlwZV0gYXMgSW5zdHJ1bWVudEhhbmRsZXJDYWxsYmFja1tdKS5wdXNoKGhhbmRsZXIuY2FsbGJhY2spO1xuICBpbnN0cnVtZW50KGhhbmRsZXIudHlwZSk7XG59XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gdHJpZ2dlckhhbmRsZXJzKHR5cGU6IEluc3RydW1lbnRIYW5kbGVyVHlwZSwgZGF0YTogYW55KTogdm9pZCB7XG4gIGlmICghdHlwZSB8fCAhaGFuZGxlcnNbdHlwZV0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnNbdHlwZV0gfHwgW10pIHtcbiAgICB0cnkge1xuICAgICAgaGFuZGxlcihkYXRhKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBFcnJvciB3aGlsZSB0cmlnZ2VyaW5nIGluc3RydW1lbnRhdGlvbiBoYW5kbGVyLlxcblR5cGU6ICR7dHlwZX1cXG5OYW1lOiAke2dldEZ1bmN0aW9uTmFtZShcbiAgICAgICAgICBoYW5kbGVyLFxuICAgICAgICApfVxcbkVycm9yOiAke2V9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudENvbnNvbGUoKTogdm9pZCB7XG4gIGlmICghKCdjb25zb2xlJyBpbiBnbG9iYWwpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InLCAnbG9nJywgJ2Fzc2VydCddLmZvckVhY2goZnVuY3Rpb24obGV2ZWw6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghKGxldmVsIGluIGdsb2JhbC5jb25zb2xlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZpbGwoZ2xvYmFsLmNvbnNvbGUsIGxldmVsLCBmdW5jdGlvbihvcmlnaW5hbENvbnNvbGVMZXZlbDogKCkgPT4gYW55KTogRnVuY3Rpb24ge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAgIHRyaWdnZXJIYW5kbGVycygnY29uc29sZScsIHsgYXJncywgbGV2ZWwgfSk7XG5cbiAgICAgICAgLy8gdGhpcyBmYWlscyBmb3Igc29tZSBicm93c2Vycy4gOihcbiAgICAgICAgaWYgKG9yaWdpbmFsQ29uc29sZUxldmVsKSB7XG4gICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwob3JpZ2luYWxDb25zb2xlTGV2ZWwsIGdsb2JhbC5jb25zb2xlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudEZldGNoKCk6IHZvaWQge1xuICBpZiAoIXN1cHBvcnRzTmF0aXZlRmV0Y2goKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZpbGwoZ2xvYmFsLCAnZmV0Y2gnLCBmdW5jdGlvbihvcmlnaW5hbEZldGNoOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICBjb25zdCBoYW5kbGVyRGF0YSA9IHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgZmV0Y2hEYXRhOiB7XG4gICAgICAgICAgbWV0aG9kOiBnZXRGZXRjaE1ldGhvZChhcmdzKSxcbiAgICAgICAgICB1cmw6IGdldEZldGNoVXJsKGFyZ3MpLFxuICAgICAgICB9LFxuICAgICAgICBzdGFydFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIH07XG5cbiAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB7XG4gICAgICAgIC4uLmhhbmRsZXJEYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIHJldHVybiBvcmlnaW5hbEZldGNoLmFwcGx5KGdsb2JhbCwgYXJncykudGhlbihcbiAgICAgICAgKHJlc3BvbnNlOiBSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB7XG4gICAgICAgICAgICAuLi5oYW5kbGVyRGF0YSxcbiAgICAgICAgICAgIGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgICAgICAgIHRyaWdnZXJIYW5kbGVycygnZmV0Y2gnLCB7XG4gICAgICAgICAgICAuLi5oYW5kbGVyRGF0YSxcbiAgICAgICAgICAgIGVuZFRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIC8vIE5PVEU6IElmIHlvdSBhcmUgYSBTZW50cnkgdXNlciwgYW5kIHlvdSBhcmUgc2VlaW5nIHRoaXMgc3RhY2sgZnJhbWUsXG4gICAgICAgICAgLy8gICAgICAgaXQgbWVhbnMgdGhlIHNlbnRyeS5qYXZhc2NyaXB0IFNESyBjYXVnaHQgYW4gZXJyb3IgaW52b2tpbmcgeW91ciBhcHBsaWNhdGlvbiBjb2RlLlxuICAgICAgICAgIC8vICAgICAgIFRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IgYW5kIE5PVCBpbmRpY2F0aXZlIG9mIGEgYnVnIHdpdGggc2VudHJ5LmphdmFzY3JpcHQuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH07XG4gIH0pO1xufVxuXG50eXBlIFhIUlNlbmRJbnB1dCA9IG51bGwgfCBCbG9iIHwgQnVmZmVyU291cmNlIHwgRm9ybURhdGEgfCBVUkxTZWFyY2hQYXJhbXMgfCBzdHJpbmc7XG5cbi8qKiBKU0RvYyAqL1xuaW50ZXJmYWNlIFNlbnRyeVdyYXBwZWRYTUxIdHRwUmVxdWVzdCBleHRlbmRzIFhNTEh0dHBSZXF1ZXN0IHtcbiAgW2tleTogc3RyaW5nXTogYW55O1xuICBfX3NlbnRyeV94aHJfXz86IHtcbiAgICBtZXRob2Q/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIHN0YXR1c19jb2RlPzogbnVtYmVyO1xuICAgIGJvZHk/OiBYSFJTZW5kSW5wdXQ7XG4gIH07XG59XG5cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuLyoqIEV4dHJhY3QgYG1ldGhvZGAgZnJvbSBmZXRjaCBjYWxsIGFyZ3VtZW50cyAqL1xuZnVuY3Rpb24gZ2V0RmV0Y2hNZXRob2QoZmV0Y2hBcmdzOiBhbnlbXSA9IFtdKTogc3RyaW5nIHtcbiAgaWYgKCdSZXF1ZXN0JyBpbiBnbG9iYWwgJiYgaXNJbnN0YW5jZU9mKGZldGNoQXJnc1swXSwgUmVxdWVzdCkgJiYgZmV0Y2hBcmdzWzBdLm1ldGhvZCkge1xuICAgIHJldHVybiBTdHJpbmcoZmV0Y2hBcmdzWzBdLm1ldGhvZCkudG9VcHBlckNhc2UoKTtcbiAgfVxuICBpZiAoZmV0Y2hBcmdzWzFdICYmIGZldGNoQXJnc1sxXS5tZXRob2QpIHtcbiAgICByZXR1cm4gU3RyaW5nKGZldGNoQXJnc1sxXS5tZXRob2QpLnRvVXBwZXJDYXNlKCk7XG4gIH1cbiAgcmV0dXJuICdHRVQnO1xufVxuXG4vKiogRXh0cmFjdCBgdXJsYCBmcm9tIGZldGNoIGNhbGwgYXJndW1lbnRzICovXG5mdW5jdGlvbiBnZXRGZXRjaFVybChmZXRjaEFyZ3M6IGFueVtdID0gW10pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGZldGNoQXJnc1swXSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmV0Y2hBcmdzWzBdO1xuICB9XG4gIGlmICgnUmVxdWVzdCcgaW4gZ2xvYmFsICYmIGlzSW5zdGFuY2VPZihmZXRjaEFyZ3NbMF0sIFJlcXVlc3QpKSB7XG4gICAgcmV0dXJuIGZldGNoQXJnc1swXS51cmw7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyhmZXRjaEFyZ3NbMF0pO1xufVxuLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50WEhSKCk6IHZvaWQge1xuICBpZiAoISgnWE1MSHR0cFJlcXVlc3QnIGluIGdsb2JhbCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBQb29yIG1hbidzIGltcGxlbWVudGF0aW9uIG9mIEVTNiBgTWFwYCwgdHJhY2tpbmcgYW5kIGtlZXBpbmcgaW4gc3luYyBrZXkgYW5kIHZhbHVlIHNlcGFyYXRlbHkuXG4gIGNvbnN0IHJlcXVlc3RLZXlzOiBYTUxIdHRwUmVxdWVzdFtdID0gW107XG4gIGNvbnN0IHJlcXVlc3RWYWx1ZXM6IEFycmF5PGFueT5bXSA9IFtdO1xuICBjb25zdCB4aHJwcm90byA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZTtcblxuICBmaWxsKHhocnByb3RvLCAnb3BlbicsIGZ1bmN0aW9uKG9yaWdpbmFsT3BlbjogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBTZW50cnlXcmFwcGVkWE1MSHR0cFJlcXVlc3QsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IHhociA9IHRoaXM7XG4gICAgICBjb25zdCB1cmwgPSBhcmdzWzFdO1xuICAgICAgeGhyLl9fc2VudHJ5X3hocl9fID0ge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIG1ldGhvZDogaXNTdHJpbmcoYXJnc1swXSkgPyBhcmdzWzBdLnRvVXBwZXJDYXNlKCkgOiBhcmdzWzBdLFxuICAgICAgICB1cmw6IGFyZ3NbMV0sXG4gICAgICB9O1xuXG4gICAgICAvLyBpZiBTZW50cnkga2V5IGFwcGVhcnMgaW4gVVJMLCBkb24ndCBjYXB0dXJlIGl0IGFzIGEgcmVxdWVzdFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgaWYgKGlzU3RyaW5nKHVybCkgJiYgeGhyLl9fc2VudHJ5X3hocl9fLm1ldGhvZCA9PT0gJ1BPU1QnICYmIHVybC5tYXRjaCgvc2VudHJ5X2tleS8pKSB7XG4gICAgICAgIHhoci5fX3NlbnRyeV9vd25fcmVxdWVzdF9fID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb25yZWFkeXN0YXRlY2hhbmdlSGFuZGxlciA9IGZ1bmN0aW9uKCk6IHZvaWQge1xuICAgICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gdG91Y2hpbmcgc3RhdHVzQ29kZSBpbiBzb21lIHBsYXRmb3JtcyB0aHJvd3NcbiAgICAgICAgICAgIC8vIGFuIGV4Y2VwdGlvblxuICAgICAgICAgICAgaWYgKHhoci5fX3NlbnRyeV94aHJfXykge1xuICAgICAgICAgICAgICB4aHIuX19zZW50cnlfeGhyX18uc3RhdHVzX2NvZGUgPSB4aHIuc3RhdHVzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi9cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFBvcyA9IHJlcXVlc3RLZXlzLmluZGV4T2YoeGhyKTtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0UG9zICE9PSAtMSkge1xuICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gcG9wIGJvdGgga2V5IGFuZCB2YWx1ZSB0byBrZWVwIGl0IGluIHN5bmMuXG4gICAgICAgICAgICAgIHJlcXVlc3RLZXlzLnNwbGljZShyZXF1ZXN0UG9zKTtcbiAgICAgICAgICAgICAgY29uc3QgYXJncyA9IHJlcXVlc3RWYWx1ZXMuc3BsaWNlKHJlcXVlc3RQb3MpWzBdO1xuICAgICAgICAgICAgICBpZiAoeGhyLl9fc2VudHJ5X3hocl9fICYmIGFyZ3NbMF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHhoci5fX3NlbnRyeV94aHJfXy5ib2R5ID0gYXJnc1swXSBhcyBYSFJTZW5kSW5wdXQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvKiBkbyBub3RoaW5nICovXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJpZ2dlckhhbmRsZXJzKCd4aHInLCB7XG4gICAgICAgICAgICBhcmdzLFxuICAgICAgICAgICAgZW5kVGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgc3RhcnRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICB4aHIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmICgnb25yZWFkeXN0YXRlY2hhbmdlJyBpbiB4aHIgJiYgdHlwZW9mIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZmlsbCh4aHIsICdvbnJlYWR5c3RhdGVjaGFuZ2UnLCBmdW5jdGlvbihvcmlnaW5hbDogV3JhcHBlZEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbiguLi5yZWFkeVN0YXRlQXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgICAgICAgIG9ucmVhZHlzdGF0ZWNoYW5nZUhhbmRsZXIoKTtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5hcHBseSh4aHIsIHJlYWR5U3RhdGVBcmdzKTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHhoci5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgb25yZWFkeXN0YXRlY2hhbmdlSGFuZGxlcik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcmlnaW5hbE9wZW4uYXBwbHkoeGhyLCBhcmdzKTtcbiAgICB9O1xuICB9KTtcblxuICBmaWxsKHhocnByb3RvLCAnc2VuZCcsIGZ1bmN0aW9uKG9yaWdpbmFsU2VuZDogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiBTZW50cnlXcmFwcGVkWE1MSHR0cFJlcXVlc3QsIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgICByZXF1ZXN0S2V5cy5wdXNoKHRoaXMpO1xuICAgICAgcmVxdWVzdFZhbHVlcy5wdXNoKGFyZ3MpO1xuXG4gICAgICB0cmlnZ2VySGFuZGxlcnMoJ3hocicsIHtcbiAgICAgICAgYXJncyxcbiAgICAgICAgc3RhcnRUaW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgIHhocjogdGhpcyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gb3JpZ2luYWxTZW5kLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH07XG4gIH0pO1xufVxuXG5sZXQgbGFzdEhyZWY6IHN0cmluZztcblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50SGlzdG9yeSgpOiB2b2lkIHtcbiAgaWYgKCFzdXBwb3J0c0hpc3RvcnkoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9sZE9uUG9wU3RhdGUgPSBnbG9iYWwub25wb3BzdGF0ZTtcbiAgZ2xvYmFsLm9ucG9wc3RhdGUgPSBmdW5jdGlvbih0aGlzOiBXaW5kb3dFdmVudEhhbmRsZXJzLCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgdG8gPSBnbG9iYWwubG9jYXRpb24uaHJlZjtcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IFVSTCBzdGF0ZSwgYXMgd2UgYWx3YXlzIHJlY2VpdmUgb25seSB0aGUgdXBkYXRlZCBzdGF0ZVxuICAgIGNvbnN0IGZyb20gPSBsYXN0SHJlZjtcbiAgICBsYXN0SHJlZiA9IHRvO1xuICAgIHRyaWdnZXJIYW5kbGVycygnaGlzdG9yeScsIHtcbiAgICAgIGZyb20sXG4gICAgICB0byxcbiAgICB9KTtcbiAgICBpZiAob2xkT25Qb3BTdGF0ZSkge1xuICAgICAgLy8gQXBwYXJlbnRseSB0aGlzIGNhbiB0aHJvdyBpbiBGaXJlZm94IHdoZW4gaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgcGx1Z2luIGlzIGluc3RhbGxlZC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzMzNDRcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9idWdzbmFnL2J1Z3NuYWctanMvaXNzdWVzLzQ2OVxuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIG9sZE9uUG9wU3RhdGUuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgICAgLy8gbm8tZW1wdHlcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqIEBoaWRkZW4gKi9cbiAgZnVuY3Rpb24gaGlzdG9yeVJlcGxhY2VtZW50RnVuY3Rpb24ob3JpZ2luYWxIaXN0b3J5RnVuY3Rpb246ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogSGlzdG9yeSwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICAgIGNvbnN0IHVybCA9IGFyZ3MubGVuZ3RoID4gMiA/IGFyZ3NbMl0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIC8vIGNvZXJjZSB0byBzdHJpbmcgKHRoaXMgaXMgd2hhdCBwdXNoU3RhdGUgZG9lcylcbiAgICAgICAgY29uc3QgZnJvbSA9IGxhc3RIcmVmO1xuICAgICAgICBjb25zdCB0byA9IFN0cmluZyh1cmwpO1xuICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IFVSTCBzdGF0ZSwgYXMgd2UgYWx3YXlzIHJlY2VpdmUgb25seSB0aGUgdXBkYXRlZCBzdGF0ZVxuICAgICAgICBsYXN0SHJlZiA9IHRvO1xuICAgICAgICB0cmlnZ2VySGFuZGxlcnMoJ2hpc3RvcnknLCB7XG4gICAgICAgICAgZnJvbSxcbiAgICAgICAgICB0byxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3JpZ2luYWxIaXN0b3J5RnVuY3Rpb24uYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfVxuXG4gIGZpbGwoZ2xvYmFsLmhpc3RvcnksICdwdXNoU3RhdGUnLCBoaXN0b3J5UmVwbGFjZW1lbnRGdW5jdGlvbik7XG4gIGZpbGwoZ2xvYmFsLmhpc3RvcnksICdyZXBsYWNlU3RhdGUnLCBoaXN0b3J5UmVwbGFjZW1lbnRGdW5jdGlvbik7XG59XG5cbmNvbnN0IGRlYm91bmNlRHVyYXRpb24gPSAxMDAwO1xubGV0IGRlYm91bmNlVGltZXJJRDogbnVtYmVyIHwgdW5kZWZpbmVkO1xubGV0IGxhc3RDYXB0dXJlZEV2ZW50OiBFdmVudCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBEZWNpZGUgd2hldGhlciB0aGUgY3VycmVudCBldmVudCBzaG91bGQgZmluaXNoIHRoZSBkZWJvdW5jZSBvZiBwcmV2aW91c2x5IGNhcHR1cmVkIG9uZS5cbiAqIEBwYXJhbSBwcmV2aW91cyBwcmV2aW91c2x5IGNhcHR1cmVkIGV2ZW50XG4gKiBAcGFyYW0gY3VycmVudCBldmVudCB0byBiZSBjYXB0dXJlZFxuICovXG5mdW5jdGlvbiBzaG91bGRTaG9ydGNpcmN1aXRQcmV2aW91c0RlYm91bmNlKHByZXZpb3VzOiBFdmVudCB8IHVuZGVmaW5lZCwgY3VycmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgLy8gSWYgdGhlcmUgd2FzIG5vIHByZXZpb3VzIGV2ZW50LCBpdCBzaG91bGQgYWx3YXlzIGJlIHN3YXBwZWQgZm9yIHRoZSBuZXcgb25lLlxuICBpZiAoIXByZXZpb3VzKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBJZiBib3RoIGV2ZW50cyBoYXZlIGRpZmZlcmVudCB0eXBlLCB0aGVuIHVzZXIgZGVmaW5pdGVseSBwZXJmb3JtZWQgdHdvIHNlcGFyYXRlIGFjdGlvbnMuIGUuZy4gY2xpY2sgKyBrZXlwcmVzcy5cbiAgaWYgKHByZXZpb3VzLnR5cGUgIT09IGN1cnJlbnQudHlwZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBJZiBib3RoIGV2ZW50cyBoYXZlIHRoZSBzYW1lIHR5cGUsIGl0J3Mgc3RpbGwgcG9zc2libGUgdGhhdCBhY3Rpb25zIHdlcmUgcGVyZm9ybWVkIG9uIGRpZmZlcmVudCB0YXJnZXRzLlxuICAgIC8vIGUuZy4gMiBjbGlja3Mgb24gZGlmZmVyZW50IGJ1dHRvbnMuXG4gICAgaWYgKHByZXZpb3VzLnRhcmdldCAhPT0gY3VycmVudC50YXJnZXQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGp1c3QgYWNjZXNzaW5nIGB0YXJnZXRgIHByb3BlcnR5IGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSByYXJlIGNpcmN1bXN0YW5jZXNcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzgzOFxuICB9XG5cbiAgLy8gSWYgYm90aCBldmVudHMgaGF2ZSB0aGUgc2FtZSB0eXBlIF9hbmRfIHNhbWUgYHRhcmdldGAgKGFuIGVsZW1lbnQgd2hpY2ggdHJpZ2dlcmVkIGFuIGV2ZW50LCBfbm90IG5lY2Vzc2FyaWx5X1xuICAvLyB0byB3aGljaCBhbiBldmVudCBsaXN0ZW5lciB3YXMgYXR0YWNoZWQpLCB3ZSB0cmVhdCB0aGVtIGFzIHRoZSBzYW1lIGFjdGlvbiwgYXMgd2Ugd2FudCB0byBjYXB0dXJlXG4gIC8vIG9ubHkgb25lIGJyZWFkY3J1bWIuIGUuZy4gbXVsdGlwbGUgY2xpY2tzIG9uIHRoZSBzYW1lIGJ1dHRvbiwgb3IgdHlwaW5nIGluc2lkZSBhIHVzZXIgaW5wdXQgYm94LlxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogRGVjaWRlIHdoZXRoZXIgYW4gZXZlbnQgc2hvdWxkIGJlIGNhcHR1cmVkLlxuICogQHBhcmFtIGV2ZW50IGV2ZW50IHRvIGJlIGNhcHR1cmVkXG4gKi9cbmZ1bmN0aW9uIHNob3VsZFNraXBET01FdmVudChldmVudDogRXZlbnQpOiBib29sZWFuIHtcbiAgLy8gV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBmaWx0ZXJpbmcgYGtleXByZXNzYCBldmVudHMgZm9yIG5vdy5cbiAgaWYgKGV2ZW50LnR5cGUgIT09ICdrZXlwcmVzcycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICghdGFyZ2V0IHx8ICF0YXJnZXQudGFnTmFtZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gT25seSBjb25zaWRlciBrZXlwcmVzcyBldmVudHMgb24gYWN0dWFsIGlucHV0IGVsZW1lbnRzLiBUaGlzIHdpbGwgZGlzcmVnYXJkIGtleXByZXNzZXMgdGFyZ2V0aW5nIGJvZHlcbiAgICAvLyBlLmcudGFiYmluZyB0aHJvdWdoIGVsZW1lbnRzLCBob3RrZXlzLCBldGMuXG4gICAgaWYgKHRhcmdldC50YWdOYW1lID09PSAnSU5QVVQnIHx8IHRhcmdldC50YWdOYW1lID09PSAnVEVYVEFSRUEnIHx8IHRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIGp1c3QgYWNjZXNzaW5nIGB0YXJnZXRgIHByb3BlcnR5IGNhbiB0aHJvdyBhbiBleGNlcHRpb24gaW4gc29tZSByYXJlIGNpcmN1bXN0YW5jZXNcbiAgICAvLyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzgzOFxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogV3JhcHMgYWRkRXZlbnRMaXN0ZW5lciB0byBjYXB0dXJlIFVJIGJyZWFkY3J1bWJzXG4gKiBAcGFyYW0gaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkXG4gKiBAcGFyYW0gZ2xvYmFsTGlzdGVuZXIgaW5kaWNhdGVzIHdoZXRoZXIgZXZlbnQgd2FzIGNhcHR1cmVkIGJ5IHRoZSBnbG9iYWwgZXZlbnQgbGlzdGVuZXJcbiAqIEByZXR1cm5zIHdyYXBwZWQgYnJlYWRjcnVtYiBldmVudHMgaGFuZGxlclxuICogQGhpZGRlblxuICovXG5mdW5jdGlvbiBtYWtlRE9NRXZlbnRIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uLCBnbG9iYWxMaXN0ZW5lcjogYm9vbGVhbiA9IGZhbHNlKTogKGV2ZW50OiBFdmVudCkgPT4gdm9pZCB7XG4gIHJldHVybiAoZXZlbnQ6IEV2ZW50KTogdm9pZCA9PiB7XG4gICAgLy8gSXQncyBwb3NzaWJsZSB0aGlzIGhhbmRsZXIgbWlnaHQgdHJpZ2dlciBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWVcbiAgICAvLyBldmVudCAoZS5nLiBldmVudCBwcm9wYWdhdGlvbiB0aHJvdWdoIG5vZGUgYW5jZXN0b3JzKS5cbiAgICAvLyBJZ25vcmUgaWYgd2UndmUgYWxyZWFkeSBjYXB0dXJlZCB0aGF0IGV2ZW50LlxuICAgIGlmICghZXZlbnQgfHwgbGFzdENhcHR1cmVkRXZlbnQgPT09IGV2ZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV2UgYWx3YXlzIHdhbnQgdG8gc2tpcCBfc29tZV8gZXZlbnRzLlxuICAgIGlmIChzaG91bGRTa2lwRE9NRXZlbnQoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZSA9IGV2ZW50LnR5cGUgPT09ICdrZXlwcmVzcycgPyAnaW5wdXQnIDogZXZlbnQudHlwZTtcblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGRlYm91bmNlIHRpbWVyLCBpdCBtZWFucyB0aGF0IHdlIGNhbiBzYWZlbHkgY2FwdHVyZSB0aGUgbmV3IGV2ZW50IGFuZCBzdG9yZSBpdCBmb3IgZnV0dXJlIGNvbXBhcmlzb25zLlxuICAgIGlmIChkZWJvdW5jZVRpbWVySUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFuZGxlcih7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZ2xvYmFsOiBnbG9iYWxMaXN0ZW5lcixcbiAgICAgIH0pO1xuICAgICAgbGFzdENhcHR1cmVkRXZlbnQgPSBldmVudDtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUgaXMgYSBkZWJvdW5jZSBhd2FpdGluZywgc2VlIGlmIHRoZSBuZXcgZXZlbnQgaXMgZGlmZmVyZW50IGVub3VnaCB0byB0cmVhdCBpdCBhcyBhIHVuaXF1ZSBvbmUuXG4gICAgLy8gSWYgdGhhdCdzIHRoZSBjYXNlLCBlbWl0IHRoZSBwcmV2aW91cyBldmVudCBhbmQgc3RvcmUgbG9jYWxseSB0aGUgbmV3bHktY2FwdHVyZWQgRE9NIGV2ZW50LlxuICAgIGVsc2UgaWYgKHNob3VsZFNob3J0Y2lyY3VpdFByZXZpb3VzRGVib3VuY2UobGFzdENhcHR1cmVkRXZlbnQsIGV2ZW50KSkge1xuICAgICAgaGFuZGxlcih7XG4gICAgICAgIGV2ZW50OiBldmVudCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZ2xvYmFsOiBnbG9iYWxMaXN0ZW5lcixcbiAgICAgIH0pO1xuICAgICAgbGFzdENhcHR1cmVkRXZlbnQgPSBldmVudDtcbiAgICB9XG5cbiAgICAvLyBTdGFydCBhIG5ldyBkZWJvdW5jZSB0aW1lciB0aGF0IHdpbGwgcHJldmVudCB1cyBmcm9tIGNhcHR1cmluZyBtdWx0aXBsZSBldmVudHMgdGhhdCBzaG91bGQgYmUgZ3JvdXBlZCB0b2dldGhlci5cbiAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lcklEKTtcbiAgICBkZWJvdW5jZVRpbWVySUQgPSBnbG9iYWwuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkZWJvdW5jZVRpbWVySUQgPSB1bmRlZmluZWQ7XG4gICAgfSwgZGVib3VuY2VEdXJhdGlvbik7XG4gIH07XG59XG5cbnR5cGUgQWRkRXZlbnRMaXN0ZW5lciA9IChcbiAgdHlwZTogc3RyaW5nLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCxcbiAgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyxcbikgPT4gdm9pZDtcbnR5cGUgUmVtb3ZlRXZlbnRMaXN0ZW5lciA9IChcbiAgdHlwZTogc3RyaW5nLFxuICBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCxcbiAgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyxcbikgPT4gdm9pZDtcblxudHlwZSBJbnN0cnVtZW50ZWRFbGVtZW50ID0gRWxlbWVudCAmIHtcbiAgX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX18/OiB7XG4gICAgW2tleSBpbiAnY2xpY2snIHwgJ2tleXByZXNzJ10/OiB7XG4gICAgICBoYW5kbGVyPzogRnVuY3Rpb247XG4gICAgICAvKiogVGhlIG51bWJlciBvZiBjdXN0b20gbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudCAqL1xuICAgICAgcmVmQ291bnQ6IG51bWJlcjtcbiAgICB9O1xuICB9O1xufTtcblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50RE9NKCk6IHZvaWQge1xuICBpZiAoISgnZG9jdW1lbnQnIGluIGdsb2JhbCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBNYWtlIGl0IHNvIHRoYXQgYW55IGNsaWNrIG9yIGtleXByZXNzIHRoYXQgaXMgdW5oYW5kbGVkIC8gYnViYmxlZCB1cCBhbGwgdGhlIHdheSB0byB0aGUgZG9jdW1lbnQgdHJpZ2dlcnMgb3VyIGRvbVxuICAvLyBoYW5kbGVycy4gKE5vcm1hbGx5IHdlIGhhdmUgb25seSBvbmUsIHdoaWNoIGNhcHR1cmVzIGEgYnJlYWRjcnVtYiBmb3IgZWFjaCBjbGljayBvciBrZXlwcmVzcy4pIERvIHRoaXMgYmVmb3JlXG4gIC8vIHdlIGluc3RydW1lbnQgYGFkZEV2ZW50TGlzdGVuZXJgIHNvIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIGF0dGFjaGluZyB0aGlzIGhhbmRsZXIgdHdpY2UuXG4gIGNvbnN0IHRyaWdnZXJET01IYW5kbGVyID0gdHJpZ2dlckhhbmRsZXJzLmJpbmQobnVsbCwgJ2RvbScpO1xuICBjb25zdCBnbG9iYWxET01FdmVudEhhbmRsZXIgPSBtYWtlRE9NRXZlbnRIYW5kbGVyKHRyaWdnZXJET01IYW5kbGVyLCB0cnVlKTtcbiAgZ2xvYmFsLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZ2xvYmFsRE9NRXZlbnRIYW5kbGVyLCBmYWxzZSk7XG4gIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlwcmVzcycsIGdsb2JhbERPTUV2ZW50SGFuZGxlciwgZmFsc2UpO1xuXG4gIC8vIEFmdGVyIGhvb2tpbmcgaW50byBjbGljayBhbmQga2V5cHJlc3MgZXZlbnRzIGJ1YmJsZWQgdXAgdG8gYGRvY3VtZW50YCwgd2UgYWxzbyBob29rIGludG8gdXNlci1oYW5kbGVkXG4gIC8vIGNsaWNrcyAmIGtleXByZXNzZXMsIGJ5IGFkZGluZyBhbiBldmVudCBsaXN0ZW5lciBvZiBvdXIgb3duIHRvIGFueSBlbGVtZW50IHRvIHdoaWNoIHRoZXkgYWRkIGEgbGlzdGVuZXIuIFRoYXRcbiAgLy8gd2F5LCB3aGVuZXZlciBvbmUgb2YgdGhlaXIgaGFuZGxlcnMgaXMgdHJpZ2dlcmVkLCBvdXJzIHdpbGwgYmUsIHRvby4gKFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlaXIgaGFuZGxlclxuICAvLyBjb3VsZCBwb3RlbnRpYWxseSBwcmV2ZW50IHRoZSBldmVudCBmcm9tIGJ1YmJsaW5nIHVwIHRvIG91ciBnbG9iYWwgbGlzdGVuZXJzLiBUaGlzIHdheSwgb3VyIGhhbmRsZXIgYXJlIHN0aWxsXG4gIC8vIGd1YXJhbnRlZWQgdG8gZmlyZSBhdCBsZWFzdCBvbmNlLilcbiAgWydFdmVudFRhcmdldCcsICdOb2RlJ10uZm9yRWFjaCgodGFyZ2V0OiBzdHJpbmcpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgY29uc3QgcHJvdG8gPSAoZ2xvYmFsIGFzIGFueSlbdGFyZ2V0XSAmJiAoZ2xvYmFsIGFzIGFueSlbdGFyZ2V0XS5wcm90b3R5cGU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzcywgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgaWYgKCFwcm90byB8fCAhcHJvdG8uaGFzT3duUHJvcGVydHkgfHwgIXByb3RvLmhhc093blByb3BlcnR5KCdhZGRFdmVudExpc3RlbmVyJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWxsKHByb3RvLCAnYWRkRXZlbnRMaXN0ZW5lcicsIGZ1bmN0aW9uKG9yaWdpbmFsQWRkRXZlbnRMaXN0ZW5lcjogQWRkRXZlbnRMaXN0ZW5lcik6IEFkZEV2ZW50TGlzdGVuZXIge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKFxuICAgICAgICB0aGlzOiBFbGVtZW50LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LFxuICAgICAgICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICAgICAgKTogQWRkRXZlbnRMaXN0ZW5lciB7XG4gICAgICAgIGlmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT0gJ2tleXByZXNzJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMgYXMgSW5zdHJ1bWVudGVkRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gKGVsLl9fc2VudHJ5X2luc3RydW1lbnRhdGlvbl9oYW5kbGVyc19fID0gZWwuX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX18gfHwge30pO1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlckZvclR5cGUgPSAoaGFuZGxlcnNbdHlwZV0gPSBoYW5kbGVyc1t0eXBlXSB8fCB7IHJlZkNvdW50OiAwIH0pO1xuXG4gICAgICAgICAgICBpZiAoIWhhbmRsZXJGb3JUeXBlLmhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IG1ha2VET01FdmVudEhhbmRsZXIodHJpZ2dlckRPTUhhbmRsZXIpO1xuICAgICAgICAgICAgICBoYW5kbGVyRm9yVHlwZS5oYW5kbGVyID0gaGFuZGxlcjtcbiAgICAgICAgICAgICAgb3JpZ2luYWxBZGRFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhhbmRsZXJGb3JUeXBlLnJlZkNvdW50ICs9IDE7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gQWNjZXNzaW5nIGRvbSBwcm9wZXJ0aWVzIGlzIGFsd2F5cyBmcmFnaWxlLlxuICAgICAgICAgICAgLy8gQWxzbyBhbGxvd3MgdXMgdG8gc2tpcCBgYWRkRXZlbnRMaXN0ZW5yc2AgY2FsbHMgd2l0aCBubyBwcm9wZXIgYHRoaXNgIGNvbnRleHQuXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsQWRkRXZlbnRMaXN0ZW5lci5jYWxsKHRoaXMsIHR5cGUsIGxpc3RlbmVyLCBvcHRpb25zKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBmaWxsKHByb3RvLCAncmVtb3ZlRXZlbnRMaXN0ZW5lcicsIGZ1bmN0aW9uKG9yaWdpbmFsUmVtb3ZlRXZlbnRMaXN0ZW5lcjogUmVtb3ZlRXZlbnRMaXN0ZW5lcik6IFJlbW92ZUV2ZW50TGlzdGVuZXIge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKFxuICAgICAgICB0aGlzOiBFbGVtZW50LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIGxpc3RlbmVyOiBFdmVudExpc3RlbmVyT3JFdmVudExpc3RlbmVyT2JqZWN0LFxuICAgICAgICBvcHRpb25zPzogYm9vbGVhbiB8IEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICAgICAgKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIGlmICh0eXBlID09PSAnY2xpY2snIHx8IHR5cGUgPT0gJ2tleXByZXNzJykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMgYXMgSW5zdHJ1bWVudGVkRWxlbWVudDtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXJzID0gZWwuX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX18gfHwge307XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyRm9yVHlwZSA9IGhhbmRsZXJzW3R5cGVdO1xuXG4gICAgICAgICAgICBpZiAoaGFuZGxlckZvclR5cGUpIHtcbiAgICAgICAgICAgICAgaGFuZGxlckZvclR5cGUucmVmQ291bnQgLT0gMTtcbiAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGxvbmdlciBhbnkgY3VzdG9tIGhhbmRsZXJzIG9mIHRoZSBjdXJyZW50IHR5cGUgb24gdGhpcyBlbGVtZW50LCB3ZSBjYW4gcmVtb3ZlIG91cnMsIHRvby5cbiAgICAgICAgICAgICAgaWYgKGhhbmRsZXJGb3JUeXBlLnJlZkNvdW50IDw9IDApIHtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFJlbW92ZUV2ZW50TGlzdGVuZXIuY2FsbCh0aGlzLCB0eXBlLCBoYW5kbGVyRm9yVHlwZS5oYW5kbGVyLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyRm9yVHlwZS5oYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGVyc1t0eXBlXTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IGN1c3RvbSBoYW5kbGVycyBvZiBhbnkgdHlwZSBvbiB0aGlzIGVsZW1lbnQsIGNsZWFudXAgZXZlcnl0aGluZy5cbiAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKGhhbmRsZXJzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgZWwuX19zZW50cnlfaW5zdHJ1bWVudGF0aW9uX2hhbmRsZXJzX187XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBBY2Nlc3NpbmcgZG9tIHByb3BlcnRpZXMgaXMgYWx3YXlzIGZyYWdpbGUuXG4gICAgICAgICAgICAvLyBBbHNvIGFsbG93cyB1cyB0byBza2lwIGBhZGRFdmVudExpc3RlbnJzYCBjYWxscyB3aXRoIG5vIHByb3BlciBgdGhpc2AgY29udGV4dC5cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGhpcywgdHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmxldCBfb2xkT25FcnJvckhhbmRsZXI6IE9uRXJyb3JFdmVudEhhbmRsZXIgPSBudWxsO1xuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBpbnN0cnVtZW50RXJyb3IoKTogdm9pZCB7XG4gIF9vbGRPbkVycm9ySGFuZGxlciA9IGdsb2JhbC5vbmVycm9yO1xuXG4gIGdsb2JhbC5vbmVycm9yID0gZnVuY3Rpb24obXNnOiBhbnksIHVybDogYW55LCBsaW5lOiBhbnksIGNvbHVtbjogYW55LCBlcnJvcjogYW55KTogYm9vbGVhbiB7XG4gICAgdHJpZ2dlckhhbmRsZXJzKCdlcnJvcicsIHtcbiAgICAgIGNvbHVtbixcbiAgICAgIGVycm9yLFxuICAgICAgbGluZSxcbiAgICAgIG1zZyxcbiAgICAgIHVybCxcbiAgICB9KTtcblxuICAgIGlmIChfb2xkT25FcnJvckhhbmRsZXIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgIHJldHVybiBfb2xkT25FcnJvckhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbmxldCBfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyOiAoKGU6IGFueSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gaW5zdHJ1bWVudFVuaGFuZGxlZFJlamVjdGlvbigpOiB2b2lkIHtcbiAgX29sZE9uVW5oYW5kbGVkUmVqZWN0aW9uSGFuZGxlciA9IGdsb2JhbC5vbnVuaGFuZGxlZHJlamVjdGlvbjtcblxuICBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24gPSBmdW5jdGlvbihlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cmlnZ2VySGFuZGxlcnMoJ3VuaGFuZGxlZHJlamVjdGlvbicsIGUpO1xuXG4gICAgaWYgKF9vbGRPblVuaGFuZGxlZFJlamVjdGlvbkhhbmRsZXIpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgIHJldHVybiBfb2xkT25VbmhhbmRsZWRSZWplY3Rpb25IYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgRXZlbnQsIE1lY2hhbmlzbSwgU3RhY2tGcmFtZSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBzbmlwTGluZSB9IGZyb20gJy4vc3RyaW5nJztcblxuLyoqXG4gKiBFeHRlbmRlZCBXaW5kb3cgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIGZvciBDcnlwdG8gQVBJIHVzYWdlIGluIElFIGJyb3dzZXJzXG4gKi9cbmludGVyZmFjZSBNc0NyeXB0b1dpbmRvdyBleHRlbmRzIFdpbmRvdyB7XG4gIG1zQ3J5cHRvPzogQ3J5cHRvO1xufVxuXG4vKipcbiAqIFVVSUQ0IGdlbmVyYXRvclxuICpcbiAqIEByZXR1cm5zIHN0cmluZyBHZW5lcmF0ZWQgVVVJRDQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1dWlkNCgpOiBzdHJpbmcge1xuICBjb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3QoKSBhcyBNc0NyeXB0b1dpbmRvdztcbiAgY29uc3QgY3J5cHRvID0gZ2xvYmFsLmNyeXB0byB8fCBnbG9iYWwubXNDcnlwdG87XG5cbiAgaWYgKCEoY3J5cHRvID09PSB2b2lkIDApICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBVc2Ugd2luZG93LmNyeXB0byBBUEkgaWYgYXZhaWxhYmxlXG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQxNkFycmF5KDgpO1xuICAgIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoYXJyKTtcblxuICAgIC8vIHNldCA0IGluIGJ5dGUgN1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgYXJyWzNdID0gKGFyclszXSAmIDB4ZmZmKSB8IDB4NDAwMDtcbiAgICAvLyBzZXQgMiBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgYnl0ZSA5IHRvICcxMCdcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGFycls0XSA9IChhcnJbNF0gJiAweDNmZmYpIHwgMHg4MDAwO1xuXG4gICAgY29uc3QgcGFkID0gKG51bTogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICAgIGxldCB2ID0gbnVtLnRvU3RyaW5nKDE2KTtcbiAgICAgIHdoaWxlICh2Lmxlbmd0aCA8IDQpIHtcbiAgICAgICAgdiA9IGAwJHt2fWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gdjtcbiAgICB9O1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHBhZChhcnJbMF0pICsgcGFkKGFyclsxXSkgKyBwYWQoYXJyWzJdKSArIHBhZChhcnJbM10pICsgcGFkKGFycls0XSkgKyBwYWQoYXJyWzVdKSArIHBhZChhcnJbNl0pICsgcGFkKGFycls3XSlcbiAgICApO1xuICB9XG4gIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTE3NTIzIzIxMTc1MjNcbiAgcmV0dXJuICd4eHh4eHh4eHh4eHg0eHh4eXh4eHh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBjID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYml0d2lzZVxuICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2KSB8IDA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBzdHJpbmcgZm9ybSBvZiBVUkwgaW50byBhbiBvYmplY3RcbiAqIC8vIGJvcnJvd2VkIGZyb20gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQlxuICogLy8gaW50ZW50aW9uYWxseSB1c2luZyByZWdleCBhbmQgbm90IDxhLz4gaHJlZiBwYXJzaW5nIHRyaWNrIGJlY2F1c2UgUmVhY3QgTmF0aXZlIGFuZCBvdGhlclxuICogLy8gZW52aXJvbm1lbnRzIHdoZXJlIERPTSBtaWdodCBub3QgYmUgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyBwYXJzZWQgVVJMIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmwoXG4gIHVybDogc3RyaW5nLFxuKToge1xuICBob3N0Pzogc3RyaW5nO1xuICBwYXRoPzogc3RyaW5nO1xuICBwcm90b2NvbD86IHN0cmluZztcbiAgcmVsYXRpdmU/OiBzdHJpbmc7XG59IHtcbiAgaWYgKCF1cmwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCgvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoLiopKT8kLyk7XG5cbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8vIGNvZXJjZSB0byB1bmRlZmluZWQgdmFsdWVzIHRvIGVtcHR5IHN0cmluZyBzbyB3ZSBkb24ndCBnZXQgJ3VuZGVmaW5lZCdcbiAgY29uc3QgcXVlcnkgPSBtYXRjaFs2XSB8fCAnJztcbiAgY29uc3QgZnJhZ21lbnQgPSBtYXRjaFs4XSB8fCAnJztcbiAgcmV0dXJuIHtcbiAgICBob3N0OiBtYXRjaFs0XSxcbiAgICBwYXRoOiBtYXRjaFs1XSxcbiAgICBwcm90b2NvbDogbWF0Y2hbMl0sXG4gICAgcmVsYXRpdmU6IG1hdGNoWzVdICsgcXVlcnkgKyBmcmFnbWVudCwgLy8gZXZlcnl0aGluZyBtaW51cyBvcmlnaW5cbiAgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBlaXRoZXIgbWVzc2FnZSBvciB0eXBlK3ZhbHVlIGZyb20gYW4gZXZlbnQgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdXNlci1mYWNpbmcgbG9nc1xuICogQHJldHVybnMgZXZlbnQncyBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXZlbnREZXNjcmlwdGlvbihldmVudDogRXZlbnQpOiBzdHJpbmcge1xuICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgIHJldHVybiBldmVudC5tZXNzYWdlO1xuICB9XG4gIGlmIChldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdKSB7XG4gICAgY29uc3QgZXhjZXB0aW9uID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXTtcblxuICAgIGlmIChleGNlcHRpb24udHlwZSAmJiBleGNlcHRpb24udmFsdWUpIHtcbiAgICAgIHJldHVybiBgJHtleGNlcHRpb24udHlwZX06ICR7ZXhjZXB0aW9uLnZhbHVlfWA7XG4gICAgfVxuICAgIHJldHVybiBleGNlcHRpb24udHlwZSB8fCBleGNlcHRpb24udmFsdWUgfHwgZXZlbnQuZXZlbnRfaWQgfHwgJzx1bmtub3duPic7XG4gIH1cbiAgcmV0dXJuIGV2ZW50LmV2ZW50X2lkIHx8ICc8dW5rbm93bj4nO1xufVxuXG4vKipcbiAqIEFkZHMgZXhjZXB0aW9uIHZhbHVlcywgdHlwZSBhbmQgdmFsdWUgdG8gYW4gc3ludGhldGljIEV4Y2VwdGlvbi5cbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIHZhbHVlIFZhbHVlIG9mIHRoZSBleGNlcHRpb24uXG4gKiBAcGFyYW0gdHlwZSBUeXBlIG9mIHRoZSBleGNlcHRpb24uXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRFeGNlcHRpb25UeXBlVmFsdWUoZXZlbnQ6IEV2ZW50LCB2YWx1ZT86IHN0cmluZywgdHlwZT86IHN0cmluZyk6IHZvaWQge1xuICBldmVudC5leGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gfHwge307XG4gIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBldmVudC5leGNlcHRpb24udmFsdWVzIHx8IFtdO1xuICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSB8fCB7fTtcbiAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS52YWx1ZSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udmFsdWUgfHwgdmFsdWUgfHwgJyc7XG4gIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udHlwZSA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF0udHlwZSB8fCB0eXBlIHx8ICdFcnJvcic7XG59XG5cbi8qKlxuICogQWRkcyBleGNlcHRpb24gbWVjaGFuaXNtIGRhdGEgdG8gYSBnaXZlbiBldmVudC4gVXNlcyBkZWZhdWx0cyBpZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBub3QgcGFzc2VkLlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIG5ld01lY2hhbmlzbSBNZWNoYW5pc20gZGF0YSB0byBhZGQgdG8gdGhlIGV2ZW50LlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50OiBFdmVudCwgbmV3TWVjaGFuaXNtPzogUGFydGlhbDxNZWNoYW5pc20+KTogdm9pZCB7XG4gIGlmICghZXZlbnQuZXhjZXB0aW9uIHx8ICFldmVudC5leGNlcHRpb24udmFsdWVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGV4Y2VwdGlvblZhbHVlMCA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXNbMF07XG5cbiAgY29uc3QgZGVmYXVsdE1lY2hhbmlzbSA9IHsgdHlwZTogJ2dlbmVyaWMnLCBoYW5kbGVkOiB0cnVlIH07XG4gIGNvbnN0IGN1cnJlbnRNZWNoYW5pc20gPSBleGNlcHRpb25WYWx1ZTAubWVjaGFuaXNtO1xuICBleGNlcHRpb25WYWx1ZTAubWVjaGFuaXNtID0geyAuLi5kZWZhdWx0TWVjaGFuaXNtLCAuLi5jdXJyZW50TWVjaGFuaXNtLCAuLi5uZXdNZWNoYW5pc20gfTtcblxuICBpZiAobmV3TWVjaGFuaXNtICYmICdkYXRhJyBpbiBuZXdNZWNoYW5pc20pIHtcbiAgICBjb25zdCBtZXJnZWREYXRhID0geyAuLi5jdXJyZW50TWVjaGFuaXNtPy5kYXRhLCAuLi5uZXdNZWNoYW5pc20uZGF0YSB9O1xuICAgIGV4Y2VwdGlvblZhbHVlMC5tZWNoYW5pc20uZGF0YSA9IG1lcmdlZERhdGE7XG4gIH1cbn1cblxuLy8gaHR0cHM6Ly9zZW12ZXIub3JnLyNpcy10aGVyZS1hLXN1Z2dlc3RlZC1yZWd1bGFyLWV4cHJlc3Npb24tcmVnZXgtdG8tY2hlY2stYS1zZW12ZXItc3RyaW5nXG5jb25zdCBTRU1WRVJfUkVHRVhQID0gL14oMHxbMS05XVxcZCopXFwuKDB8WzEtOV1cXGQqKVxcLigwfFsxLTldXFxkKikoPzotKCg/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSg/OlxcLig/OjB8WzEtOV1cXGQqfFxcZCpbYS16QS1aLV1bMC05YS16QS1aLV0qKSkqKSk/KD86XFwrKFswLTlhLXpBLVotXSsoPzpcXC5bMC05YS16QS1aLV0rKSopKT8kLztcblxuLyoqXG4gKiBSZXByZXNlbnRzIFNlbWFudGljIFZlcnNpb25pbmcgb2JqZWN0XG4gKi9cbmludGVyZmFjZSBTZW1WZXIge1xuICBtYWpvcj86IG51bWJlcjtcbiAgbWlub3I/OiBudW1iZXI7XG4gIHBhdGNoPzogbnVtYmVyO1xuICBwcmVyZWxlYXNlPzogc3RyaW5nO1xuICBidWlsZG1ldGFkYXRhPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcnNlcyBpbnB1dCBpbnRvIGEgU2VtVmVyIGludGVyZmFjZVxuICogQHBhcmFtIGlucHV0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNlbXZlciB2ZXJzaW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbXZlcihpbnB1dDogc3RyaW5nKTogU2VtVmVyIHtcbiAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaChTRU1WRVJfUkVHRVhQKSB8fCBbXTtcbiAgY29uc3QgbWFqb3IgPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICBjb25zdCBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG4gIGNvbnN0IHBhdGNoID0gcGFyc2VJbnQobWF0Y2hbM10sIDEwKTtcbiAgcmV0dXJuIHtcbiAgICBidWlsZG1ldGFkYXRhOiBtYXRjaFs1XSxcbiAgICBtYWpvcjogaXNOYU4obWFqb3IpID8gdW5kZWZpbmVkIDogbWFqb3IsXG4gICAgbWlub3I6IGlzTmFOKG1pbm9yKSA/IHVuZGVmaW5lZCA6IG1pbm9yLFxuICAgIHBhdGNoOiBpc05hTihwYXRjaCkgPyB1bmRlZmluZWQgOiBwYXRjaCxcbiAgICBwcmVyZWxlYXNlOiBtYXRjaFs0XSxcbiAgfTtcbn1cblxuY29uc3QgZGVmYXVsdFJldHJ5QWZ0ZXIgPSA2MCAqIDEwMDA7IC8vIDYwIHNlY29uZHNcblxuLyoqXG4gKiBFeHRyYWN0cyBSZXRyeS1BZnRlciB2YWx1ZSBmcm9tIHRoZSByZXF1ZXN0IGhlYWRlciBvciByZXR1cm5zIGRlZmF1bHQgdmFsdWVcbiAqIEBwYXJhbSBub3cgY3VycmVudCB1bml4IHRpbWVzdGFtcFxuICogQHBhcmFtIGhlYWRlciBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgJ1JldHJ5LUFmdGVyJyBoZWFkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlckhlYWRlcihub3c6IG51bWJlciwgaGVhZGVyPzogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCk6IG51bWJlciB7XG4gIGlmICghaGVhZGVyKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRSZXRyeUFmdGVyO1xuICB9XG5cbiAgY29uc3QgaGVhZGVyRGVsYXkgPSBwYXJzZUludChgJHtoZWFkZXJ9YCwgMTApO1xuICBpZiAoIWlzTmFOKGhlYWRlckRlbGF5KSkge1xuICAgIHJldHVybiBoZWFkZXJEZWxheSAqIDEwMDA7XG4gIH1cblxuICBjb25zdCBoZWFkZXJEYXRlID0gRGF0ZS5wYXJzZShgJHtoZWFkZXJ9YCk7XG4gIGlmICghaXNOYU4oaGVhZGVyRGF0ZSkpIHtcbiAgICByZXR1cm4gaGVhZGVyRGF0ZSAtIG5vdztcbiAgfVxuXG4gIHJldHVybiBkZWZhdWx0UmV0cnlBZnRlcjtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGFkZHMgY29udGV4dCAocHJlL3Bvc3QvbGluZSkgbGluZXMgdG8gdGhlIHByb3ZpZGVkIGZyYW1lXG4gKlxuICogQHBhcmFtIGxpbmVzIHN0cmluZ1tdIGNvbnRhaW5pbmcgYWxsIGxpbmVzXG4gKiBAcGFyYW0gZnJhbWUgU3RhY2tGcmFtZSB0aGF0IHdpbGwgYmUgbXV0YXRlZFxuICogQHBhcmFtIGxpbmVzT2ZDb250ZXh0IG51bWJlciBvZiBjb250ZXh0IGxpbmVzIHdlIHdhbnQgdG8gYWRkIHByZS9wb3N0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRDb250ZXh0VG9GcmFtZShsaW5lczogc3RyaW5nW10sIGZyYW1lOiBTdGFja0ZyYW1lLCBsaW5lc09mQ29udGV4dDogbnVtYmVyID0gNSk6IHZvaWQge1xuICBjb25zdCBsaW5lbm8gPSBmcmFtZS5saW5lbm8gfHwgMDtcbiAgY29uc3QgbWF4TGluZXMgPSBsaW5lcy5sZW5ndGg7XG4gIGNvbnN0IHNvdXJjZUxpbmUgPSBNYXRoLm1heChNYXRoLm1pbihtYXhMaW5lcywgbGluZW5vIC0gMSksIDApO1xuXG4gIGZyYW1lLnByZV9jb250ZXh0ID0gbGluZXNcbiAgICAuc2xpY2UoTWF0aC5tYXgoMCwgc291cmNlTGluZSAtIGxpbmVzT2ZDb250ZXh0KSwgc291cmNlTGluZSlcbiAgICAubWFwKChsaW5lOiBzdHJpbmcpID0+IHNuaXBMaW5lKGxpbmUsIDApKTtcblxuICBmcmFtZS5jb250ZXh0X2xpbmUgPSBzbmlwTGluZShsaW5lc1tNYXRoLm1pbihtYXhMaW5lcyAtIDEsIHNvdXJjZUxpbmUpXSwgZnJhbWUuY29sbm8gfHwgMCk7XG5cbiAgZnJhbWUucG9zdF9jb250ZXh0ID0gbGluZXNcbiAgICAuc2xpY2UoTWF0aC5taW4oc291cmNlTGluZSArIDEsIG1heExpbmVzKSwgc291cmNlTGluZSArIDEgKyBsaW5lc09mQ29udGV4dClcbiAgICAubWFwKChsaW5lOiBzdHJpbmcpID0+IHNuaXBMaW5lKGxpbmUsIDApKTtcbn1cblxuLyoqXG4gKiBTdHJpcCB0aGUgcXVlcnkgc3RyaW5nIGFuZCBmcmFnbWVudCBvZmYgb2YgYSBnaXZlbiBVUkwgb3IgcGF0aCAoaWYgcHJlc2VudClcbiAqXG4gKiBAcGFyYW0gdXJsUGF0aCBGdWxsIFVSTCBvciBwYXRoLCBpbmNsdWRpbmcgcG9zc2libGUgcXVlcnkgc3RyaW5nIGFuZC9vciBmcmFnbWVudFxuICogQHJldHVybnMgVVJMIG9yIHBhdGggd2l0aG91dCBxdWVyeSBzdHJpbmcgb3IgZnJhZ21lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwVXJsUXVlcnlBbmRGcmFnbWVudCh1cmxQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgcmV0dXJuIHVybFBhdGguc3BsaXQoL1tcXD8jXS8sIDEpWzBdO1xufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIG9yIG5vdCB3ZSd2ZSBhbHJlYWR5IGNhcHR1cmVkIHRoZSBnaXZlbiBleGNlcHRpb24gKG5vdGU6IG5vdCBhbiBpZGVudGljYWwgZXhjZXB0aW9uIC0gdGhlIHZlcnkgb2JqZWN0XG4gKiBpbiBxdWVzdGlvbiksIGFuZCBtYXJrcyBpdCBjYXB0dXJlZCBpZiBub3QuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIGZvciBhbiBlcnJvciB0byBnZXQgY2FwdHVyZWQgYnkgbW9yZSB0aGFuIG9uZSBtZWNoYW5pc20uIEFmdGVyIHdlIGludGVyY2VwdCBhbmRcbiAqIHJlY29yZCBhbiBlcnJvciwgd2UgcmV0aHJvdyBpdCAoYXNzdW1pbmcgd2UndmUgaW50ZXJjZXB0ZWQgaXQgYmVmb3JlIGl0J3MgcmVhY2hlZCB0aGUgdG9wLWxldmVsIGdsb2JhbCBoYW5kbGVycyksIHNvXG4gKiB0aGF0IHdlIGRvbid0IGludGVyZmVyZSB3aXRoIHdoYXRldmVyIGVmZmVjdHMgdGhlIGVycm9yIG1pZ2h0IGhhdmUgaGFkIHdlcmUgdGhlIFNESyBub3QgdGhlcmUuIEF0IHRoYXQgcG9pbnQsIGJlY2F1c2VcbiAqIHRoZSBlcnJvciBoYXMgYmVlbiByZXRocm93biwgaXQncyBwb3NzaWJsZSBmb3IgaXQgdG8gYnViYmxlIHVwIHRvIHNvbWUgb3RoZXIgY29kZSB3ZSd2ZSBpbnN0cnVtZW50ZWQuIElmIGl0J3Mgbm90XG4gKiBjYXVnaHQgYWZ0ZXIgdGhhdCwgaXQgd2lsbCBidWJibGUgYWxsIHRoZSB3YXkgdXAgdG8gdGhlIGdsb2JhbCBoYW5kbGVycyAod2hpY2ggb2YgY291cnNlIHdlIGFsc28gaW5zdHJ1bWVudCkuIFRoaXNcbiAqIGZ1bmN0aW9uIGhlbHBzIHVzIGVuc3VyZSB0aGF0IGV2ZW4gaWYgd2UgZW5jb3VudGVyIHRoZSBzYW1lIGVycm9yIG1vcmUgdGhhbiBvbmNlLCB3ZSBvbmx5IHJlY29yZCBpdCB0aGUgZmlyc3QgdGltZSB3ZVxuICogc2VlIGl0LlxuICpcbiAqIE5vdGU6IEl0IHdpbGwgaWdub3JlIHByaW1pdGl2ZXMgKGFsd2F5cyByZXR1cm4gYGZhbHNlYCBhbmQgbm90IG1hcmsgdGhlbSBhcyBzZWVuKSwgYXMgcHJvcGVydGllcyBjYW4ndCBiZSBzZXQgb25cbiAqIHRoZW0uIHtAbGluazogT2JqZWN0Lm9iamVjdGlmeX0gY2FuIGJlIHVzZWQgb24gZXhjZXB0aW9ucyB0byBjb252ZXJ0IGFueSB0aGF0IGFyZSBwcmltaXRpdmVzIGludG8gdGhlaXIgZXF1aXZhbGVudFxuICogb2JqZWN0IHdyYXBwZXIgZm9ybXMgc28gdGhhdCB0aGlzIGNoZWNrIHdpbGwgYWx3YXlzIHdvcmsuIEhvd2V2ZXIsIGJlY2F1c2Ugd2UgbmVlZCB0byBmbGFnIHRoZSBleGFjdCBvYmplY3Qgd2hpY2hcbiAqIHdpbGwgZ2V0IHJldGhyb3duLCBhbmQgYmVjYXVzZSB0aGF0IHJldGhyb3dpbmcgaGFwcGVucyBvdXRzaWRlIG9mIHRoZSBldmVudCBwcm9jZXNzaW5nIHBpcGVsaW5lLCB0aGUgb2JqZWN0aWZpY2F0aW9uXG4gKiBtdXN0IGJlIGRvbmUgYmVmb3JlIHRoZSBleGNlcHRpb24gY2FwdHVyZWQuXG4gKlxuICogQHBhcmFtIEEgdGhyb3duIGV4Y2VwdGlvbiB0byBjaGVjayBvciBmbGFnIGFzIGhhdmluZyBiZWVuIHNlZW5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgZXhjZXB0aW9uIGhhcyBhbHJlYWR5IGJlZW4gY2FwdHVyZWQsIGBmYWxzZWAgaWYgbm90ICh3aXRoIHRoZSBzaWRlIGVmZmVjdCBvZiBtYXJraW5nIGl0IHNlZW4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja09yU2V0QWxyZWFkeUNhdWdodChleGNlcHRpb246IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICBpZiAoKGV4Y2VwdGlvbiBhcyBhbnkpPy5fX3NlbnRyeV9jYXB0dXJlZF9fKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIHNldCBpdCB0aGlzIHdheSByYXRoZXIgdGhhbiBieSBhc3NpZ25tZW50IHNvIHRoYXQgaXQncyBub3QgZW5udW1lcmFibGUgYW5kIHRoZXJlZm9yZSBpc24ndCByZWNvcmRlZCBieSB0aGVcbiAgICAvLyBgRXh0cmFFcnJvckRhdGFgIGludGVncmF0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4Y2VwdGlvbiwgJ19fc2VudHJ5X2NhcHR1cmVkX18nLCB7XG4gICAgICB2YWx1ZTogdHJ1ZSxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gYGV4Y2VwdGlvbmAgaXMgYSBwcmltaXRpdmUsIHNvIHdlIGNhbid0IG1hcmsgaXQgc2VlblxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIiwgIi8vIFNsaWdodGx5IG1vZGlmaWVkIChubyBJRTggc3VwcG9ydCwgRVM2KSBhbmQgdHJhbnNjcmliZWQgdG8gVHlwZVNjcmlwdFxuLy8gaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2NhbHZpbm1ldGNhbGYvcm9sbHVwLXBsdWdpbi1ub2RlLWJ1aWx0aW5zL21hc3Rlci9zcmMvZXM2L3BhdGguanNcblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBub3JtYWxpemVBcnJheShwYXJ0czogc3RyaW5nW10sIGFsbG93QWJvdmVSb290PzogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgLy8gaWYgdGhlIHBhdGggdHJpZXMgdG8gZ28gYWJvdmUgdGhlIHJvb3QsIGB1cGAgZW5kcyB1cCA+IDBcbiAgbGV0IHVwID0gMDtcbiAgZm9yIChsZXQgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgbGFzdCA9IHBhcnRzW2ldO1xuICAgIGlmIChsYXN0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKGxhc3QgPT09ICcuLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1c1xuICAgICAgdXArKztcbiAgICB9IGVsc2UgaWYgKHVwKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgIHVwLS07XG4gICAgfVxuICB9XG5cbiAgLy8gaWYgdGhlIHBhdGggaXMgYWxsb3dlZCB0byBnbyBhYm92ZSB0aGUgcm9vdCwgcmVzdG9yZSBsZWFkaW5nIC4uc1xuICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICBmb3IgKDsgdXAtLTsgdXApIHtcbiAgICAgIHBhcnRzLnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBhcnRzO1xufVxuXG4vLyBTcGxpdCBhIGZpbGVuYW1lIGludG8gW3Jvb3QsIGRpciwgYmFzZW5hbWUsIGV4dF0sIHVuaXggdmVyc2lvblxuLy8gJ3Jvb3QnIGlzIGp1c3QgYSBzbGFzaCwgb3Igbm90aGluZy5cbmNvbnN0IHNwbGl0UGF0aFJlID0gL14oXFwvP3wpKFtcXHNcXFNdKj8pKCg/OlxcLnsxLDJ9fFteL10rP3wpKFxcLlteLi9dKnwpKSg/OlsvXSopJC87XG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIHNwbGl0UGF0aChmaWxlbmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJ0cyA9IHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpO1xuICByZXR1cm4gcGFydHMgPyBwYXJ0cy5zbGljZSgxKSA6IFtdO1xufVxuXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4vLyBwb3NpeCB2ZXJzaW9uXG4vKiogSlNEb2MgKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlKC4uLmFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgbGV0IHJlc29sdmVkUGF0aCA9ICcnO1xuICBsZXQgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xuXG4gIGZvciAobGV0IGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xuICAgIGNvbnN0IHBhdGggPSBpID49IDAgPyBhcmdzW2ldIDogJy8nO1xuXG4gICAgLy8gU2tpcCBlbXB0eSBlbnRyaWVzXG4gICAgaWYgKCFwYXRoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFBhdGggPSBgJHtwYXRofS8ke3Jlc29sdmVkUGF0aH1gO1xuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xuICB9XG5cbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAvLyBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKSBmYWlscylcblxuICAvLyBOb3JtYWxpemUgdGhlIHBhdGhcbiAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplQXJyYXkoXG4gICAgcmVzb2x2ZWRQYXRoLnNwbGl0KCcvJykuZmlsdGVyKHAgPT4gISFwKSxcbiAgICAhcmVzb2x2ZWRBYnNvbHV0ZSxcbiAgKS5qb2luKCcvJyk7XG5cbiAgcmV0dXJuIChyZXNvbHZlZEFic29sdXRlID8gJy8nIDogJycpICsgcmVzb2x2ZWRQYXRoIHx8ICcuJztcbn1cblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiB0cmltKGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGxldCBzdGFydCA9IDA7XG4gIGZvciAoOyBzdGFydCA8IGFyci5sZW5ndGg7IHN0YXJ0KyspIHtcbiAgICBpZiAoYXJyW3N0YXJ0XSAhPT0gJycpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGxldCBlbmQgPSBhcnIubGVuZ3RoIC0gMTtcbiAgZm9yICg7IGVuZCA+PSAwOyBlbmQtLSkge1xuICAgIGlmIChhcnJbZW5kXSAhPT0gJycpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChzdGFydCA+IGVuZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgLSBzdGFydCArIDEpO1xufVxuXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmUoZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKTogc3RyaW5nIHtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tcGFyYW0tcmVhc3NpZ24gKi9cbiAgZnJvbSA9IHJlc29sdmUoZnJvbSkuc3Vic3RyKDEpO1xuICB0byA9IHJlc29sdmUodG8pLnN1YnN0cigxKTtcbiAgLyogZXNsaW50LWVuYWJsZSBuby1wYXJhbS1yZWFzc2lnbiAqL1xuXG4gIGNvbnN0IGZyb21QYXJ0cyA9IHRyaW0oZnJvbS5zcGxpdCgnLycpKTtcbiAgY29uc3QgdG9QYXJ0cyA9IHRyaW0odG8uc3BsaXQoJy8nKSk7XG5cbiAgY29uc3QgbGVuZ3RoID0gTWF0aC5taW4oZnJvbVBhcnRzLmxlbmd0aCwgdG9QYXJ0cy5sZW5ndGgpO1xuICBsZXQgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGZyb21QYXJ0c1tpXSAhPT0gdG9QYXJ0c1tpXSkge1xuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGxldCBvdXRwdXRQYXJ0cyA9IFtdO1xuICBmb3IgKGxldCBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0UGFydHMucHVzaCgnLi4nKTtcbiAgfVxuXG4gIG91dHB1dFBhcnRzID0gb3V0cHV0UGFydHMuY29uY2F0KHRvUGFydHMuc2xpY2Uoc2FtZVBhcnRzTGVuZ3RoKSk7XG5cbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcbn1cblxuLy8gcGF0aC5ub3JtYWxpemUocGF0aClcbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaXNQYXRoQWJzb2x1dGUgPSBpc0Fic29sdXRlKHBhdGgpO1xuICBjb25zdCB0cmFpbGluZ1NsYXNoID0gcGF0aC5zdWJzdHIoLTEpID09PSAnLyc7XG5cbiAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gIGxldCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KFxuICAgIHBhdGguc3BsaXQoJy8nKS5maWx0ZXIocCA9PiAhIXApLFxuICAgICFpc1BhdGhBYnNvbHV0ZSxcbiAgKS5qb2luKCcvJyk7XG5cbiAgaWYgKCFub3JtYWxpemVkUGF0aCAmJiAhaXNQYXRoQWJzb2x1dGUpIHtcbiAgICBub3JtYWxpemVkUGF0aCA9ICcuJztcbiAgfVxuICBpZiAobm9ybWFsaXplZFBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xuICAgIG5vcm1hbGl6ZWRQYXRoICs9ICcvJztcbiAgfVxuXG4gIHJldHVybiAoaXNQYXRoQWJzb2x1dGUgPyAnLycgOiAnJykgKyBub3JtYWxpemVkUGF0aDtcbn1cblxuLy8gcG9zaXggdmVyc2lvblxuLyoqIEpTRG9jICovXG5leHBvcnQgZnVuY3Rpb24gaXNBYnNvbHV0ZShwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhdGguY2hhckF0KDApID09PSAnLyc7XG59XG5cbi8vIHBvc2l4IHZlcnNpb25cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpvaW4oLi4uYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gbm9ybWFsaXplUGF0aChhcmdzLmpvaW4oJy8nKSk7XG59XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcm5hbWUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdWx0ID0gc3BsaXRQYXRoKHBhdGgpO1xuICBjb25zdCByb290ID0gcmVzdWx0WzBdO1xuICBsZXQgZGlyID0gcmVzdWx0WzFdO1xuXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XG4gICAgLy8gTm8gZGlybmFtZSB3aGF0c29ldmVyXG4gICAgcmV0dXJuICcuJztcbiAgfVxuXG4gIGlmIChkaXIpIHtcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxuICAgIGRpciA9IGRpci5zdWJzdHIoMCwgZGlyLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgcmV0dXJuIHJvb3QgKyBkaXI7XG59XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2VuYW1lKHBhdGg6IHN0cmluZywgZXh0Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGYgPSBzcGxpdFBhdGgocGF0aClbMl07XG4gIGlmIChleHQgJiYgZi5zdWJzdHIoZXh0Lmxlbmd0aCAqIC0xKSA9PT0gZXh0KSB7XG4gICAgZiA9IGYuc3Vic3RyKDAsIGYubGVuZ3RoIC0gZXh0Lmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIGY7XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LWZ1bmN0aW9uLXJldHVybi10eXBlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvdHlwZWRlZiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlcyAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgaXNUaGVuYWJsZSB9IGZyb20gJy4vaXMnO1xuXG4vKiogU3luY1Byb21pc2UgaW50ZXJuYWwgc3RhdGVzICovXG5jb25zdCBlbnVtIFN0YXRlcyB7XG4gIC8qKiBQZW5kaW5nICovXG4gIFBFTkRJTkcgPSAnUEVORElORycsXG4gIC8qKiBSZXNvbHZlZCAvIE9LICovXG4gIFJFU09MVkVEID0gJ1JFU09MVkVEJyxcbiAgLyoqIFJlamVjdGVkIC8gRXJyb3IgKi9cbiAgUkVKRUNURUQgPSAnUkVKRUNURUQnLFxufVxuXG4vKipcbiAqIFRoZW5hYmxlIGNsYXNzIHRoYXQgYmVoYXZlcyBsaWtlIGEgUHJvbWlzZSBhbmQgZm9sbG93cyBpdCdzIGludGVyZmFjZVxuICogYnV0IGlzIG5vdCBhc3luYyBpbnRlcm5hbGx5XG4gKi9cbmNsYXNzIFN5bmNQcm9taXNlPFQ+IGltcGxlbWVudHMgUHJvbWlzZUxpa2U8VD4ge1xuICBwcml2YXRlIF9zdGF0ZTogU3RhdGVzID0gU3RhdGVzLlBFTkRJTkc7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiBBcnJheTx7XG4gICAgZG9uZTogYm9vbGVhbjtcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFQgfCBQcm9taXNlTGlrZTxUPikgfCBudWxsO1xuICAgIG9ucmVqZWN0ZWQ/OiAoKHJlYXNvbjogYW55KSA9PiBhbnkpIHwgbnVsbDtcbiAgfT4gPSBbXTtcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgZXhlY3V0b3I6IChyZXNvbHZlOiAodmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4gfCBudWxsKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQpID0+IHZvaWQsXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcih0aGlzLl9yZXNvbHZlLCB0aGlzLl9yZWplY3QpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3JlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHN0YXRpYyByZXNvbHZlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZUxpa2U8VD4pOiBQcm9taXNlTGlrZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBzdGF0aWMgcmVqZWN0PFQgPSBuZXZlcj4ocmVhc29uPzogYW55KTogUHJvbWlzZUxpa2U8VD4ge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2UoKF8sIHJlamVjdCkgPT4ge1xuICAgICAgcmVqZWN0KHJlYXNvbik7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHN0YXRpYyBhbGw8VSA9IGFueT4oY29sbGVjdGlvbjogQXJyYXk8VSB8IFByb21pc2VMaWtlPFU+Pik6IFByb21pc2VMaWtlPFVbXT4ge1xuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8VVtdPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoYFByb21pc2UuYWxsIHJlcXVpcmVzIGFuIGFycmF5IGFzIGlucHV0LmApKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sbGVjdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmVzb2x2ZShbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGNvdW50ZXIgPSBjb2xsZWN0aW9uLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ29sbGVjdGlvbjogVVtdID0gW107XG5cbiAgICAgIGNvbGxlY3Rpb24uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgdm9pZCBTeW5jUHJvbWlzZS5yZXNvbHZlKGl0ZW0pXG4gICAgICAgICAgLnRoZW4odmFsdWUgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZWRDb2xsZWN0aW9uW2luZGV4XSA9IHZhbHVlO1xuICAgICAgICAgICAgY291bnRlciAtPSAxO1xuXG4gICAgICAgICAgICBpZiAoY291bnRlciAhPT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkQ29sbGVjdGlvbik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIHRoZW48VFJlc3VsdDEgPSBULCBUUmVzdWx0MiA9IG5ldmVyPihcbiAgICBvbmZ1bGZpbGxlZD86ICgodmFsdWU6IFQpID0+IFRSZXN1bHQxIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDE+KSB8IG51bGwsXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQyIHwgUHJvbWlzZUxpa2U8VFJlc3VsdDI+KSB8IG51bGwsXG4gICk6IFByb21pc2VMaWtlPFRSZXN1bHQxIHwgVFJlc3VsdDI+IHtcbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX2F0dGFjaEhhbmRsZXIoe1xuICAgICAgICBkb25lOiBmYWxzZSxcbiAgICAgICAgb25mdWxmaWxsZWQ6IHJlc3VsdCA9PiB7XG4gICAgICAgICAgaWYgKCFvbmZ1bGZpbGxlZCkge1xuICAgICAgICAgICAgLy8gVE9ETzogXHUwMEFGXFxfKFx1MzBDNClfL1x1MDBBRlxuICAgICAgICAgICAgLy8gVE9ETzogRklYTUVcbiAgICAgICAgICAgIHJlc29sdmUocmVzdWx0IGFzIGFueSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXNvbHZlKG9uZnVsZmlsbGVkKHJlc3VsdCkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG9ucmVqZWN0ZWQ6IHJlYXNvbiA9PiB7XG4gICAgICAgICAgaWYgKCFvbnJlamVjdGVkKSB7XG4gICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmUob25yZWplY3RlZChyZWFzb24pKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGNhdGNoPFRSZXN1bHQgPSBuZXZlcj4oXG4gICAgb25yZWplY3RlZD86ICgocmVhc29uOiBhbnkpID0+IFRSZXN1bHQgfCBQcm9taXNlTGlrZTxUUmVzdWx0PikgfCBudWxsLFxuICApOiBQcm9taXNlTGlrZTxUIHwgVFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRoZW4odmFsID0+IHZhbCwgb25yZWplY3RlZCk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGZpbmFsbHk8VFJlc3VsdD4ob25maW5hbGx5PzogKCgpID0+IHZvaWQpIHwgbnVsbCk6IFByb21pc2VMaWtlPFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPFRSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCB2YWw6IFRSZXN1bHQgfCBhbnk7XG4gICAgICBsZXQgaXNSZWplY3RlZDogYm9vbGVhbjtcblxuICAgICAgcmV0dXJuIHRoaXMudGhlbihcbiAgICAgICAgdmFsdWUgPT4ge1xuICAgICAgICAgIGlzUmVqZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB2YWwgPSB2YWx1ZTtcbiAgICAgICAgICBpZiAob25maW5hbGx5KSB7XG4gICAgICAgICAgICBvbmZpbmFsbHkoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbiA9PiB7XG4gICAgICAgICAgaXNSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgdmFsID0gcmVhc29uO1xuICAgICAgICAgIGlmIChvbmZpbmFsbHkpIHtcbiAgICAgICAgICAgIG9uZmluYWxseSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmIChpc1JlamVjdGVkKSB7XG4gICAgICAgICAgcmVqZWN0KHZhbCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzb2x2ZSgodmFsIGFzIHVua25vd24pIGFzIGFueSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJ1tvYmplY3QgU3luY1Byb21pc2VdJztcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXNvbHZlID0gKHZhbHVlPzogVCB8IFByb21pc2VMaWtlPFQ+IHwgbnVsbCkgPT4ge1xuICAgIHRoaXMuX3NldFJlc3VsdChTdGF0ZXMuUkVTT0xWRUQsIHZhbHVlKTtcbiAgfTtcblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfcmVqZWN0ID0gKHJlYXNvbj86IGFueSkgPT4ge1xuICAgIHRoaXMuX3NldFJlc3VsdChTdGF0ZXMuUkVKRUNURUQsIHJlYXNvbik7XG4gIH07XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3NldFJlc3VsdCA9IChzdGF0ZTogU3RhdGVzLCB2YWx1ZT86IFQgfCBQcm9taXNlTGlrZTxUPiB8IGFueSkgPT4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gU3RhdGVzLlBFTkRJTkcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIHZvaWQgKHZhbHVlIGFzIFByb21pc2VMaWtlPFQ+KS50aGVuKHRoaXMuX3Jlc29sdmUsIHRoaXMuX3JlamVjdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXG4gICAgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzKCk7XG4gIH07XG5cbiAgLy8gVE9ETzogRklYTUVcbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2F0dGFjaEhhbmRsZXIgPSAoaGFuZGxlcjoge1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIGRvbmU6IGJvb2xlYW47XG4gICAgLyoqIEpTRG9jICovXG4gICAgb25mdWxmaWxsZWQ/KHZhbHVlOiBUKTogYW55O1xuICAgIC8qKiBKU0RvYyAqL1xuICAgIG9ucmVqZWN0ZWQ/KHJlYXNvbjogYW55KTogYW55O1xuICB9KSA9PiB7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5jb25jYXQoaGFuZGxlcik7XG4gICAgdGhpcy5fZXhlY3V0ZUhhbmRsZXJzKCk7XG4gIH07XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2V4ZWN1dGVIYW5kbGVycyA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUgPT09IFN0YXRlcy5QRU5ESU5HKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGVkSGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5zbGljZSgpO1xuICAgIHRoaXMuX2hhbmRsZXJzID0gW107XG5cbiAgICBjYWNoZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgaWYgKGhhbmRsZXIuZG9uZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gU3RhdGVzLlJFU09MVkVEKSB7XG4gICAgICAgIGlmIChoYW5kbGVyLm9uZnVsZmlsbGVkKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1mbG9hdGluZy1wcm9taXNlc1xuICAgICAgICAgIGhhbmRsZXIub25mdWxmaWxsZWQoKHRoaXMuX3ZhbHVlIGFzIHVua25vd24pIGFzIGFueSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX3N0YXRlID09PSBTdGF0ZXMuUkVKRUNURUQpIHtcbiAgICAgICAgaWYgKGhhbmRsZXIub25yZWplY3RlZCkge1xuICAgICAgICAgIGhhbmRsZXIub25yZWplY3RlZCh0aGlzLl92YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaGFuZGxlci5kb25lID0gdHJ1ZTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgU3luY1Byb21pc2UgfTtcbiIsICJpbXBvcnQgeyBTZW50cnlFcnJvciB9IGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHsgU3luY1Byb21pc2UgfSBmcm9tICcuL3N5bmNwcm9taXNlJztcblxuLyoqIEEgc2ltcGxlIHF1ZXVlIHRoYXQgaG9sZHMgcHJvbWlzZXMuICovXG5leHBvcnQgY2xhc3MgUHJvbWlzZUJ1ZmZlcjxUPiB7XG4gIC8qKiBJbnRlcm5hbCBzZXQgb2YgcXVldWVkIFByb21pc2VzICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2J1ZmZlcjogQXJyYXk8UHJvbWlzZUxpa2U8VD4+ID0gW107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBfbGltaXQ/OiBudW1iZXIpIHt9XG5cbiAgLyoqXG4gICAqIFNheXMgaWYgdGhlIGJ1ZmZlciBpcyByZWFkeSB0byB0YWtlIG1vcmUgcmVxdWVzdHNcbiAgICovXG4gIHB1YmxpYyBpc1JlYWR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9saW1pdCA9PT0gdW5kZWZpbmVkIHx8IHRoaXMubGVuZ3RoKCkgPCB0aGlzLl9saW1pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwcm9taXNlIChyZXByZXNlbnRpbmcgYW4gaW4tZmxpZ2h0IGFjdGlvbikgdG8gdGhlIHF1ZXVlLCBhbmQgc2V0IGl0IHRvIHJlbW92ZSBpdHNlbGYgb24gZnVsZmlsbG1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB0YXNrUHJvZHVjZXIgQSBmdW5jdGlvbiBwcm9kdWNpbmcgYW55IFByb21pc2VMaWtlPFQ+OyBJbiBwcmV2aW91cyB2ZXJzaW9ucyB0aGlzIHVzZWQgdG8gYmUgYHRhc2s6XG4gICAqICAgICAgICBQcm9taXNlTGlrZTxUPmAsIGJ1dCB1bmRlciB0aGF0IG1vZGVsLCBQcm9taXNlcyB3ZXJlIGluc3RhbnRseSBjcmVhdGVkIG9uIHRoZSBjYWxsLXNpdGUgYW5kIHRoZWlyIGV4ZWN1dG9yXG4gICAqICAgICAgICBmdW5jdGlvbnMgdGhlcmVmb3JlIHJhbiBpbW1lZGlhdGVseS4gVGh1cywgZXZlbiBpZiB0aGUgYnVmZmVyIHdhcyBmdWxsLCB0aGUgYWN0aW9uIHN0aWxsIGhhcHBlbmVkLiBCeVxuICAgKiAgICAgICAgcmVxdWlyaW5nIHRoZSBwcm9taXNlIHRvIGJlIHdyYXBwZWQgaW4gYSBmdW5jdGlvbiwgd2UgY2FuIGRlZmVyIHByb21pc2UgY3JlYXRpb24gdW50aWwgYWZ0ZXIgdGhlIGJ1ZmZlclxuICAgKiAgICAgICAgbGltaXQgY2hlY2suXG4gICAqIEByZXR1cm5zIFRoZSBvcmlnaW5hbCBwcm9taXNlLlxuICAgKi9cbiAgcHVibGljIGFkZCh0YXNrUHJvZHVjZXI6ICgpID0+IFByb21pc2VMaWtlPFQ+KTogUHJvbWlzZUxpa2U8VD4ge1xuICAgIGlmICghdGhpcy5pc1JlYWR5KCkpIHtcbiAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QobmV3IFNlbnRyeUVycm9yKCdOb3QgYWRkaW5nIFByb21pc2UgZHVlIHRvIGJ1ZmZlciBsaW1pdCByZWFjaGVkLicpKTtcbiAgICB9XG5cbiAgICAvLyBzdGFydCB0aGUgdGFzayBhbmQgYWRkIGl0cyBwcm9taXNlIHRvIHRoZSBxdWV1ZVxuICAgIGNvbnN0IHRhc2sgPSB0YXNrUHJvZHVjZXIoKTtcbiAgICBpZiAodGhpcy5fYnVmZmVyLmluZGV4T2YodGFzaykgPT09IC0xKSB7XG4gICAgICB0aGlzLl9idWZmZXIucHVzaCh0YXNrKTtcbiAgICB9XG4gICAgdm9pZCB0YXNrXG4gICAgICAudGhlbigoKSA9PiB0aGlzLnJlbW92ZSh0YXNrKSlcbiAgICAgIC8vIFVzZSBgdGhlbihudWxsLCByZWplY3Rpb25IYW5kbGVyKWAgcmF0aGVyIHRoYW4gYGNhdGNoKHJlamVjdGlvbkhhbmRsZXIpYCBzbyB0aGF0IHdlIGNhbiB1c2UgYFByb21pc2VMaWtlYFxuICAgICAgLy8gcmF0aGVyIHRoYW4gYFByb21pc2VgLiBgUHJvbWlzZUxpa2VgIGRvZXNuJ3QgaGF2ZSBhIGAuY2F0Y2hgIG1ldGhvZCwgbWFraW5nIGl0cyBwb2x5ZmlsbCBzbWFsbGVyLiAoRVM1IGRpZG4ndFxuICAgICAgLy8gaGF2ZSBwcm9taXNlcywgc28gVFMgaGFzIHRvIHBvbHlmaWxsIHdoZW4gZG93bi1jb21waWxpbmcuKVxuICAgICAgLnRoZW4obnVsbCwgKCkgPT5cbiAgICAgICAgdGhpcy5yZW1vdmUodGFzaykudGhlbihudWxsLCAoKSA9PiB7XG4gICAgICAgICAgLy8gV2UgaGF2ZSB0byBhZGQgYW5vdGhlciBjYXRjaCBoZXJlIGJlY2F1c2UgYHRoaXMucmVtb3ZlKClgIHN0YXJ0cyBhIG5ldyBwcm9taXNlIGNoYWluLlxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRhc2s7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgcHJvbWlzZSBmcm9tIHRoZSBxdWV1ZS5cbiAgICpcbiAgICogQHBhcmFtIHRhc2sgQ2FuIGJlIGFueSBQcm9taXNlTGlrZTxUPlxuICAgKiBAcmV0dXJucyBSZW1vdmVkIHByb21pc2UuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlKHRhc2s6IFByb21pc2VMaWtlPFQ+KTogUHJvbWlzZUxpa2U8VD4ge1xuICAgIGNvbnN0IHJlbW92ZWRUYXNrID0gdGhpcy5fYnVmZmVyLnNwbGljZSh0aGlzLl9idWZmZXIuaW5kZXhPZih0YXNrKSwgMSlbMF07XG4gICAgcmV0dXJuIHJlbW92ZWRUYXNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVucmVzb2x2ZWQgcHJvbWlzZXMgaW4gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcHVibGljIGxlbmd0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9idWZmZXIubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgZm9yIGFsbCBwcm9taXNlcyBpbiB0aGUgcXVldWUgdG8gcmVzb2x2ZSBvciBmb3IgdGltZW91dCB0byBleHBpcmUsIHdoaWNoZXZlciBjb21lcyBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWUsIGluIG1zLCBhZnRlciB3aGljaCB0byByZXNvbHZlIHRvIGBmYWxzZWAgaWYgdGhlIHF1ZXVlIGlzIHN0aWxsIG5vbi1lbXB0eS4gUGFzc2luZyBgMGAgKG9yXG4gICAqIG5vdCBwYXNzaW5nIGFueXRoaW5nKSB3aWxsIG1ha2UgdGhlIHByb21pc2Ugd2FpdCBhcyBsb25nIGFzIGl0IHRha2VzIGZvciB0aGUgcXVldWUgdG8gZHJhaW4gYmVmb3JlIHJlc29sdmluZyB0b1xuICAgKiBgdHJ1ZWAuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCB3aWxsIHJlc29sdmUgdG8gYHRydWVgIGlmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGVtcHR5IG9yIGRyYWlucyBiZWZvcmUgdGhlIHRpbWVvdXQsIGFuZFxuICAgKiBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgcHVibGljIGRyYWluKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxib29sZWFuPihyZXNvbHZlID0+IHtcbiAgICAgIC8vIHdhaXQgZm9yIGB0aW1lb3V0YCBtcyBhbmQgdGhlbiByZXNvbHZlIHRvIGBmYWxzZWAgKGlmIG5vdCBjYW5jZWxsZWQgZmlyc3QpXG4gICAgICBjb25zdCBjYXB0dXJlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRpbWVvdXQgJiYgdGltZW91dCA+IDApIHtcbiAgICAgICAgICByZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGltZW91dCk7XG5cbiAgICAgIC8vIGlmIGFsbCBwcm9taXNlcyByZXNvbHZlIGluIHRpbWUsIGNhbmNlbCB0aGUgdGltZXIgYW5kIHJlc29sdmUgdG8gYHRydWVgXG4gICAgICB2b2lkIFN5bmNQcm9taXNlLmFsbCh0aGlzLl9idWZmZXIpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoY2FwdHVyZWRTZXRUaW1lb3V0KTtcbiAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihudWxsLCAoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QgfSBmcm9tICcuL2dsb2JhbCc7XG5pbXBvcnQgeyBkeW5hbWljUmVxdWlyZSwgaXNOb2RlRW52IH0gZnJvbSAnLi9ub2RlJztcblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjYW4gcmV0dXJuIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoLlxuICovXG5pbnRlcmZhY2UgVGltZXN0YW1wU291cmNlIHtcbiAgbm93U2Vjb25kcygpOiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBUaW1lc3RhbXBTb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBQZXJmb3JtYW5jZSBXZWIgQVBJIG5hdGl2ZWx5LlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIFRpbWVzdGFtcFNvdXJjZSBkb2VzIG5vdCB1c2UgYSBtb25vdG9uaWMgY2xvY2suIEEgY2FsbCB0byBgbm93U2Vjb25kc2AgbWF5IHJldHVybiBhIHRpbWVzdGFtcCBlYXJsaWVyXG4gKiB0aGFuIGEgcHJldmlvdXNseSByZXR1cm5lZCB2YWx1ZS4gV2UgZG8gbm90IHRyeSB0byBlbXVsYXRlIGEgbW9ub3RvbmljIGJlaGF2aW9yIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgZGVidWdnaW5nLiBJdFxuICogaXMgbW9yZSBvYnZpb3VzIHRvIGV4cGxhaW4gXCJ3aHkgZG9lcyBteSBzcGFuIGhhdmUgbmVnYXRpdmUgZHVyYXRpb25cIiB0aGFuIFwid2h5IG15IHNwYW5zIGhhdmUgemVybyBkdXJhdGlvblwiLlxuICovXG5jb25zdCBkYXRlVGltZXN0YW1wU291cmNlOiBUaW1lc3RhbXBTb3VyY2UgPSB7XG4gIG5vd1NlY29uZHM6ICgpID0+IERhdGUubm93KCkgLyAxMDAwLFxufTtcblxuLyoqXG4gKiBBIHBhcnRpYWwgZGVmaW5pdGlvbiBvZiB0aGUgW1BlcmZvcm1hbmNlIFdlYiBBUElde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9QZXJmb3JtYW5jZX1cbiAqIGZvciBhY2Nlc3NpbmcgYSBoaWdoIHJlc29sdXRpb24gbW9ub3RvbmljIGNsb2NrLlxuICovXG5pbnRlcmZhY2UgUGVyZm9ybWFuY2Uge1xuICAvKipcbiAgICogVGhlIG1pbGxpc2Vjb25kIHRpbWVzdGFtcCBhdCB3aGljaCBtZWFzdXJlbWVudCBiZWdhbiwgbWVhc3VyZWQgaW4gVW5peCB0aW1lLlxuICAgKi9cbiAgdGltZU9yaWdpbjogbnVtYmVyO1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBtaWxsaXNlY29uZCB0aW1lc3RhbXAsIHdoZXJlIDAgcmVwcmVzZW50cyB0aGUgc3RhcnQgb2YgbWVhc3VyZW1lbnQuXG4gICAqL1xuICBub3coKTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIFBlcmZvcm1hbmNlIEFQSSBicm93c2VyIGltcGxlbWVudGF0aW9uLCBvciB1bmRlZmluZWQgZm9yIGJyb3dzZXJzIHRoYXQgZG8gbm90XG4gKiBzdXBwb3J0IHRoZSBBUEkuXG4gKlxuICogV3JhcHBpbmcgdGhlIG5hdGl2ZSBBUEkgd29ya3MgYXJvdW5kIGRpZmZlcmVuY2VzIGluIGJlaGF2aW9yIGZyb20gZGlmZmVyZW50IGJyb3dzZXJzLlxuICovXG5mdW5jdGlvbiBnZXRCcm93c2VyUGVyZm9ybWFuY2UoKTogUGVyZm9ybWFuY2UgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IHBlcmZvcm1hbmNlIH0gPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuICBpZiAoIXBlcmZvcm1hbmNlIHx8ICFwZXJmb3JtYW5jZS5ub3cpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8gUmVwbGFjZSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIHdpdGggb3VyIG93biB0aW1lT3JpZ2luIGJhc2VkIG9uIERhdGUubm93KCkuXG4gIC8vXG4gIC8vIFRoaXMgaXMgYSBwYXJ0aWFsIHdvcmthcm91bmQgZm9yIGJyb3dzZXJzIHJlcG9ydGluZyBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIHN1Y2ggdGhhdCBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICtcbiAgLy8gcGVyZm9ybWFuY2Uubm93KCkgZ2l2ZXMgYSBkYXRlIGFyYml0cmFyaWx5IGluIHRoZSBwYXN0LlxuICAvL1xuICAvLyBBZGRpdGlvbmFsbHksIGNvbXB1dGluZyB0aW1lT3JpZ2luIGluIHRoaXMgd2F5IGZpbGxzIHRoZSBnYXAgZm9yIGJyb3dzZXJzIHdoZXJlIHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gaXNcbiAgLy8gdW5kZWZpbmVkLlxuICAvL1xuICAvLyBUaGUgYXNzdW1wdGlvbiB0aGF0IHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKyBwZXJmb3JtYW5jZS5ub3coKSB+PSBEYXRlLm5vdygpIGlzIGZsYXdlZCwgYnV0IHdlIGRlcGVuZCBvbiBpdCB0b1xuICAvLyBpbnRlcmFjdCB3aXRoIGRhdGEgY29taW5nIG91dCBvZiBwZXJmb3JtYW5jZSBlbnRyaWVzLlxuICAvL1xuICAvLyBOb3RlIHRoYXQgZGVzcGl0ZSByZWNvbW1lbmRhdGlvbnMgYWdhaW5zdCBpdCBpbiB0aGUgc3BlYywgYnJvd3NlcnMgaW1wbGVtZW50IHRoZSBQZXJmb3JtYW5jZSBBUEkgd2l0aCBhIGNsb2NrIHRoYXRcbiAgLy8gbWlnaHQgc3RvcCB3aGVuIHRoZSBjb21wdXRlciBpcyBhc2xlZXAgKGFuZCBwZXJoYXBzIHVuZGVyIG90aGVyIGNpcmN1bXN0YW5jZXMpLiBTdWNoIGJlaGF2aW9yIGNhdXNlc1xuICAvLyBwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2Uubm93KCkgdG8gaGF2ZSBhbiBhcmJpdHJhcnkgc2tldyBvdmVyIERhdGUubm93KCkuIEluIGxhcHRvcCBjb21wdXRlcnMsIHdlIGhhdmVcbiAgLy8gb2JzZXJ2ZWQgc2tld3MgdGhhdCBjYW4gYmUgYXMgbG9uZyBhcyBkYXlzLCB3ZWVrcyBvciBtb250aHMuXG4gIC8vXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L2lzc3Vlcy8yNTkwLlxuICAvL1xuICAvLyBCVUc6IGRlc3BpdGUgb3VyIGJlc3QgaW50ZW50aW9ucywgdGhpcyB3b3JrYXJvdW5kIGhhcyBpdHMgbGltaXRhdGlvbnMuIEl0IG1vc3RseSBhZGRyZXNzZXMgdGltaW5ncyBvZiBwYWdlbG9hZFxuICAvLyB0cmFuc2FjdGlvbnMsIGJ1dCBpZ25vcmVzIHRoZSBza2V3IGJ1aWx0IHVwIG92ZXIgdGltZSB0aGF0IGNhbiBhdmVyc2VseSBhZmZlY3QgdGltZXN0YW1wcyBvZiBuYXZpZ2F0aW9uXG4gIC8vIHRyYW5zYWN0aW9ucyBvZiBsb25nLWxpdmVkIHdlYiBwYWdlcy5cbiAgY29uc3QgdGltZU9yaWdpbiA9IERhdGUubm93KCkgLSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICByZXR1cm4ge1xuICAgIG5vdzogKCkgPT4gcGVyZm9ybWFuY2Uubm93KCksXG4gICAgdGltZU9yaWdpbixcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuYXRpdmUgUGVyZm9ybWFuY2UgQVBJIGltcGxlbWVudGF0aW9uIGZyb20gTm9kZS5qcy4gUmV0dXJucyB1bmRlZmluZWQgaW4gb2xkIE5vZGUuanMgdmVyc2lvbnMgdGhhdCBkb24ndFxuICogaW1wbGVtZW50IHRoZSBBUEkuXG4gKi9cbmZ1bmN0aW9uIGdldE5vZGVQZXJmb3JtYW5jZSgpOiBQZXJmb3JtYW5jZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGVyZkhvb2tzID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAncGVyZl9ob29rcycpIGFzIHsgcGVyZm9ybWFuY2U6IFBlcmZvcm1hbmNlIH07XG4gICAgcmV0dXJuIHBlcmZIb29rcy5wZXJmb3JtYW5jZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgUGVyZm9ybWFuY2UgQVBJIGltcGxlbWVudGF0aW9uIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybSwgaWYgYXZhaWxhYmxlLlxuICovXG5jb25zdCBwbGF0Zm9ybVBlcmZvcm1hbmNlOiBQZXJmb3JtYW5jZSB8IHVuZGVmaW5lZCA9IGlzTm9kZUVudigpID8gZ2V0Tm9kZVBlcmZvcm1hbmNlKCkgOiBnZXRCcm93c2VyUGVyZm9ybWFuY2UoKTtcblxuY29uc3QgdGltZXN0YW1wU291cmNlOiBUaW1lc3RhbXBTb3VyY2UgPVxuICBwbGF0Zm9ybVBlcmZvcm1hbmNlID09PSB1bmRlZmluZWRcbiAgICA/IGRhdGVUaW1lc3RhbXBTb3VyY2VcbiAgICA6IHtcbiAgICAgICAgbm93U2Vjb25kczogKCkgPT4gKHBsYXRmb3JtUGVyZm9ybWFuY2UudGltZU9yaWdpbiArIHBsYXRmb3JtUGVyZm9ybWFuY2Uubm93KCkpIC8gMTAwMCxcbiAgICAgIH07XG5cbi8qKlxuICogUmV0dXJucyBhIHRpbWVzdGFtcCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoIHVzaW5nIHRoZSBEYXRlIEFQSS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRhdGVUaW1lc3RhbXBJblNlY29uZHM6ICgpID0+IG51bWJlciA9IGRhdGVUaW1lc3RhbXBTb3VyY2Uubm93U2Vjb25kcy5iaW5kKGRhdGVUaW1lc3RhbXBTb3VyY2UpO1xuXG4vKipcbiAqIFJldHVybnMgYSB0aW1lc3RhbXAgaW4gc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCB1c2luZyBlaXRoZXIgdGhlIFBlcmZvcm1hbmNlIG9yIERhdGUgQVBJcywgZGVwZW5kaW5nIG9uIHRoZVxuICogYXZhaWxhYmlsaXR5IG9mIHRoZSBQZXJmb3JtYW5jZSBBUEkuXG4gKlxuICogU2VlIGB1c2luZ1BlcmZvcm1hbmNlQVBJYCB0byB0ZXN0IHdoZXRoZXIgdGhlIFBlcmZvcm1hbmNlIEFQSSBpcyB1c2VkLlxuICpcbiAqIEJVRzogTm90ZSB0aGF0IGJlY2F1c2Ugb2YgaG93IGJyb3dzZXJzIGltcGxlbWVudCB0aGUgUGVyZm9ybWFuY2UgQVBJLCB0aGUgY2xvY2sgbWlnaHQgc3RvcCB3aGVuIHRoZSBjb21wdXRlciBpc1xuICogYXNsZWVwLiBUaGlzIGNyZWF0ZXMgYSBza2V3IGJldHdlZW4gYGRhdGVUaW1lc3RhbXBJblNlY29uZHNgIGFuZCBgdGltZXN0YW1wSW5TZWNvbmRzYC4gVGhlXG4gKiBza2V3IGNhbiBncm93IHRvIGFyYml0cmFyeSBhbW91bnRzIGxpa2UgZGF5cywgd2Vla3Mgb3IgbW9udGhzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzI1OTAuXG4gKi9cbmV4cG9ydCBjb25zdCB0aW1lc3RhbXBJblNlY29uZHM6ICgpID0+IG51bWJlciA9IHRpbWVzdGFtcFNvdXJjZS5ub3dTZWNvbmRzLmJpbmQodGltZXN0YW1wU291cmNlKTtcblxuLy8gUmUtZXhwb3J0ZWQgd2l0aCBhbiBvbGQgbmFtZSBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgdGltZXN0YW1wV2l0aE1zID0gdGltZXN0YW1wSW5TZWNvbmRzO1xuXG4vKipcbiAqIEEgYm9vbGVhbiB0aGF0IGlzIHRydWUgd2hlbiB0aW1lc3RhbXBJblNlY29uZHMgdXNlcyB0aGUgUGVyZm9ybWFuY2UgQVBJIHRvIHByb2R1Y2UgbW9ub3RvbmljIHRpbWVzdGFtcHMuXG4gKi9cbmV4cG9ydCBjb25zdCB1c2luZ1BlcmZvcm1hbmNlQVBJID0gcGxhdGZvcm1QZXJmb3JtYW5jZSAhPT0gdW5kZWZpbmVkO1xuXG4vKipcbiAqIEludGVybmFsIGhlbHBlciB0byBzdG9yZSB3aGF0IGlzIHRoZSBzb3VyY2Ugb2YgYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbiBiZWxvdy4gRm9yIGRlYnVnZ2luZyBvbmx5LlxuICovXG5leHBvcnQgbGV0IF9icm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luTW9kZTogc3RyaW5nO1xuXG4vKipcbiAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2NoLiBUaGlzIHZhbHVlIGlzIG9ubHkgdXNhYmxlIGluIGEgYnJvd3NlciwgYW5kIG9ubHkgd2hlbiB0aGVcbiAqIHBlcmZvcm1hbmNlIEFQSSBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBjb25zdCBicm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luID0gKCgpOiBudW1iZXIgfCB1bmRlZmluZWQgPT4ge1xuICAvLyBVbmZvcnR1bmF0ZWx5IGJyb3dzZXJzIG1heSByZXBvcnQgYW4gaW5hY2N1cmF0ZSB0aW1lIG9yaWdpbiBkYXRhLCB0aHJvdWdoIGVpdGhlciBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIG9yXG4gIC8vIHBlcmZvcm1hbmNlLnRpbWluZy5uYXZpZ2F0aW9uU3RhcnQsIHdoaWNoIHJlc3VsdHMgaW4gcG9vciByZXN1bHRzIGluIHBlcmZvcm1hbmNlIGRhdGEuIFdlIG9ubHkgdHJlYXQgdGltZSBvcmlnaW5cbiAgLy8gZGF0YSBhcyByZWxpYWJsZSBpZiB0aGV5IGFyZSB3aXRoaW4gYSByZWFzb25hYmxlIHRocmVzaG9sZCBvZiB0aGUgY3VycmVudCB0aW1lLlxuXG4gIGNvbnN0IHsgcGVyZm9ybWFuY2UgfSA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG4gIGlmICghcGVyZm9ybWFuY2UgfHwgIXBlcmZvcm1hbmNlLm5vdykge1xuICAgIF9icm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luTW9kZSA9ICdub25lJztcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgdGhyZXNob2xkID0gMzYwMCAqIDEwMDA7XG4gIGNvbnN0IHBlcmZvcm1hbmNlTm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IGRhdGVOb3cgPSBEYXRlLm5vdygpO1xuXG4gIC8vIGlmIHRpbWVPcmlnaW4gaXNuJ3QgYXZhaWxhYmxlIHNldCBkZWx0YSB0byB0aHJlc2hvbGQgc28gaXQgaXNuJ3QgdXNlZFxuICBjb25zdCB0aW1lT3JpZ2luRGVsdGEgPSBwZXJmb3JtYW5jZS50aW1lT3JpZ2luXG4gICAgPyBNYXRoLmFicyhwZXJmb3JtYW5jZS50aW1lT3JpZ2luICsgcGVyZm9ybWFuY2VOb3cgLSBkYXRlTm93KVxuICAgIDogdGhyZXNob2xkO1xuICBjb25zdCB0aW1lT3JpZ2luSXNSZWxpYWJsZSA9IHRpbWVPcmlnaW5EZWx0YSA8IHRocmVzaG9sZDtcblxuICAvLyBXaGlsZSBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0IGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgcGVyZm9ybWFuY2UudGltZU9yaWdpbiwgcGVyZm9ybWFuY2UudGltZU9yaWdpblxuICAvLyBpcyBub3QgYXMgd2lkZWx5IHN1cHBvcnRlZC4gTmFtZWx5LCBwZXJmb3JtYW5jZS50aW1lT3JpZ2luIGlzIHVuZGVmaW5lZCBpbiBTYWZhcmkgYXMgb2Ygd3JpdGluZy5cbiAgLy8gQWxzbyBhcyBvZiB3cml0aW5nLCBwZXJmb3JtYW5jZS50aW1pbmcgaXMgbm90IGF2YWlsYWJsZSBpbiBXZWIgV29ya2VycyBpbiBtYWluc3RyZWFtIGJyb3dzZXJzLCBzbyBpdCBpcyBub3QgYWx3YXlzXG4gIC8vIGEgdmFsaWQgZmFsbGJhY2suIEluIHRoZSBhYnNlbmNlIG9mIGFuIGluaXRpYWwgdGltZSBwcm92aWRlZCBieSB0aGUgYnJvd3NlciwgZmFsbGJhY2sgdG8gdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZVxuICAvLyBEYXRlIEFQSS5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gIGNvbnN0IG5hdmlnYXRpb25TdGFydCA9IHBlcmZvcm1hbmNlLnRpbWluZyAmJiBwZXJmb3JtYW5jZS50aW1pbmcubmF2aWdhdGlvblN0YXJ0O1xuICBjb25zdCBoYXNOYXZpZ2F0aW9uU3RhcnQgPSB0eXBlb2YgbmF2aWdhdGlvblN0YXJ0ID09PSAnbnVtYmVyJztcbiAgLy8gaWYgbmF2aWdhdGlvblN0YXJ0IGlzbid0IGF2YWlsYWJsZSBzZXQgZGVsdGEgdG8gdGhyZXNob2xkIHNvIGl0IGlzbid0IHVzZWRcbiAgY29uc3QgbmF2aWdhdGlvblN0YXJ0RGVsdGEgPSBoYXNOYXZpZ2F0aW9uU3RhcnQgPyBNYXRoLmFicyhuYXZpZ2F0aW9uU3RhcnQgKyBwZXJmb3JtYW5jZU5vdyAtIGRhdGVOb3cpIDogdGhyZXNob2xkO1xuICBjb25zdCBuYXZpZ2F0aW9uU3RhcnRJc1JlbGlhYmxlID0gbmF2aWdhdGlvblN0YXJ0RGVsdGEgPCB0aHJlc2hvbGQ7XG5cbiAgaWYgKHRpbWVPcmlnaW5Jc1JlbGlhYmxlIHx8IG5hdmlnYXRpb25TdGFydElzUmVsaWFibGUpIHtcbiAgICAvLyBVc2UgdGhlIG1vcmUgcmVsaWFibGUgdGltZSBvcmlnaW5cbiAgICBpZiAodGltZU9yaWdpbkRlbHRhIDw9IG5hdmlnYXRpb25TdGFydERlbHRhKSB7XG4gICAgICBfYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbk1vZGUgPSAndGltZU9yaWdpbic7XG4gICAgICByZXR1cm4gcGVyZm9ybWFuY2UudGltZU9yaWdpbjtcbiAgICB9IGVsc2Uge1xuICAgICAgX2Jyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW5Nb2RlID0gJ25hdmlnYXRpb25TdGFydCc7XG4gICAgICByZXR1cm4gbmF2aWdhdGlvblN0YXJ0O1xuICAgIH1cbiAgfVxuXG4gIC8vIEVpdGhlciBib3RoIHRpbWVPcmlnaW4gYW5kIG5hdmlnYXRpb25TdGFydCBhcmUgc2tld2VkIG9yIG5laXRoZXIgaXMgYXZhaWxhYmxlLCBmYWxsYmFjayB0byBEYXRlLlxuICBfYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbk1vZGUgPSAnZGF0ZU5vdyc7XG4gIHJldHVybiBkYXRlTm93O1xufSkoKTtcbiIsICJleHBvcnQgKiBmcm9tICcuL2FzeW5jJztcbmV4cG9ydCAqIGZyb20gJy4vYnJvd3Nlcic7XG5leHBvcnQgKiBmcm9tICcuL2Rzbic7XG5leHBvcnQgKiBmcm9tICcuL2Vycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vZ2xvYmFsJztcbmV4cG9ydCAqIGZyb20gJy4vaW5zdHJ1bWVudCc7XG5leHBvcnQgKiBmcm9tICcuL2lzJztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVtbyc7XG5leHBvcnQgKiBmcm9tICcuL21pc2MnO1xuZXhwb3J0ICogZnJvbSAnLi9ub2RlJztcbmV4cG9ydCAqIGZyb20gJy4vb2JqZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vcGF0aCc7XG5leHBvcnQgKiBmcm9tICcuL3Byb21pc2VidWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFja3RyYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RyaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vc3VwcG9ydHMnO1xuZXhwb3J0ICogZnJvbSAnLi9zeW5jcHJvbWlzZSc7XG5leHBvcnQgKiBmcm9tICcuL3RpbWUnO1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuaW1wb3J0IHtcbiAgQnJlYWRjcnVtYixcbiAgQ2FwdHVyZUNvbnRleHQsXG4gIENvbnRleHQsXG4gIENvbnRleHRzLFxuICBFdmVudCxcbiAgRXZlbnRIaW50LFxuICBFdmVudFByb2Nlc3NvcixcbiAgRXh0cmEsXG4gIEV4dHJhcyxcbiAgUHJpbWl0aXZlLFxuICBSZXF1ZXN0U2Vzc2lvbixcbiAgU2NvcGUgYXMgU2NvcGVJbnRlcmZhY2UsXG4gIFNjb3BlQ29udGV4dCxcbiAgU2V2ZXJpdHksXG4gIFNwYW4sXG4gIFRyYW5zYWN0aW9uLFxuICBVc2VyLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGRhdGVUaW1lc3RhbXBJblNlY29uZHMsIGdldEdsb2JhbE9iamVjdCwgaXNQbGFpbk9iamVjdCwgaXNUaGVuYWJsZSwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4vc2Vzc2lvbic7XG5cbi8qKlxuICogQWJzb2x1dGUgbWF4aW11bSBudW1iZXIgb2YgYnJlYWRjcnVtYnMgYWRkZWQgdG8gYW4gZXZlbnQuXG4gKiBUaGUgYG1heEJyZWFkY3J1bWJzYCBvcHRpb24gY2Fubm90IGJlIGhpZ2hlciB0aGFuIHRoaXMgdmFsdWUuXG4gKi9cbmNvbnN0IE1BWF9CUkVBRENSVU1CUyA9IDEwMDtcblxuLyoqXG4gKiBIb2xkcyBhZGRpdGlvbmFsIGV2ZW50IGluZm9ybWF0aW9uLiB7QGxpbmsgU2NvcGUuYXBwbHlUb0V2ZW50fSB3aWxsIGJlXG4gKiBjYWxsZWQgYnkgdGhlIGNsaWVudCBiZWZvcmUgYW4gZXZlbnQgd2lsbCBiZSBzZW50LlxuICovXG5leHBvcnQgY2xhc3MgU2NvcGUgaW1wbGVtZW50cyBTY29wZUludGVyZmFjZSB7XG4gIC8qKiBGbGFnIGlmIG5vdGlmeWluZyBpcyBoYXBwZW5pbmcuICovXG4gIHByb3RlY3RlZCBfbm90aWZ5aW5nTGlzdGVuZXJzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIENhbGxiYWNrIGZvciBjbGllbnQgdG8gcmVjZWl2ZSBzY29wZSBjaGFuZ2VzLiAqL1xuICBwcm90ZWN0ZWQgX3Njb3BlTGlzdGVuZXJzOiBBcnJheTwoc2NvcGU6IFNjb3BlKSA9PiB2b2lkPiA9IFtdO1xuXG4gIC8qKiBDYWxsYmFjayBsaXN0IHRoYXQgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rIGFwcGx5VG9FdmVudH0uICovXG4gIHByb3RlY3RlZCBfZXZlbnRQcm9jZXNzb3JzOiBFdmVudFByb2Nlc3NvcltdID0gW107XG5cbiAgLyoqIEFycmF5IG9mIGJyZWFkY3J1bWJzLiAqL1xuICBwcm90ZWN0ZWQgX2JyZWFkY3J1bWJzOiBCcmVhZGNydW1iW10gPSBbXTtcblxuICAvKiogVXNlciAqL1xuICBwcm90ZWN0ZWQgX3VzZXI6IFVzZXIgPSB7fTtcblxuICAvKiogVGFncyAqL1xuICBwcm90ZWN0ZWQgX3RhZ3M6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIH0gPSB7fTtcblxuICAvKiogRXh0cmEgKi9cbiAgcHJvdGVjdGVkIF9leHRyYTogRXh0cmFzID0ge307XG5cbiAgLyoqIENvbnRleHRzICovXG4gIHByb3RlY3RlZCBfY29udGV4dHM6IENvbnRleHRzID0ge307XG5cbiAgLyoqIEZpbmdlcnByaW50ICovXG4gIHByb3RlY3RlZCBfZmluZ2VycHJpbnQ/OiBzdHJpbmdbXTtcblxuICAvKiogU2V2ZXJpdHkgKi9cbiAgcHJvdGVjdGVkIF9sZXZlbD86IFNldmVyaXR5O1xuXG4gIC8qKiBUcmFuc2FjdGlvbiBOYW1lICovXG4gIHByb3RlY3RlZCBfdHJhbnNhY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKiBTcGFuICovXG4gIHByb3RlY3RlZCBfc3Bhbj86IFNwYW47XG5cbiAgLyoqIFNlc3Npb24gKi9cbiAgcHJvdGVjdGVkIF9zZXNzaW9uPzogU2Vzc2lvbjtcblxuICAvKiogUmVxdWVzdCBNb2RlIFNlc3Npb24gU3RhdHVzICovXG4gIHByb3RlY3RlZCBfcmVxdWVzdFNlc3Npb24/OiBSZXF1ZXN0U2Vzc2lvbjtcblxuICAvKipcbiAgICogSW5oZXJpdCB2YWx1ZXMgZnJvbSB0aGUgcGFyZW50IHNjb3BlLlxuICAgKiBAcGFyYW0gc2NvcGUgdG8gY2xvbmUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNsb25lKHNjb3BlPzogU2NvcGUpOiBTY29wZSB7XG4gICAgY29uc3QgbmV3U2NvcGUgPSBuZXcgU2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIG5ld1Njb3BlLl9icmVhZGNydW1icyA9IFsuLi5zY29wZS5fYnJlYWRjcnVtYnNdO1xuICAgICAgbmV3U2NvcGUuX3RhZ3MgPSB7IC4uLnNjb3BlLl90YWdzIH07XG4gICAgICBuZXdTY29wZS5fZXh0cmEgPSB7IC4uLnNjb3BlLl9leHRyYSB9O1xuICAgICAgbmV3U2NvcGUuX2NvbnRleHRzID0geyAuLi5zY29wZS5fY29udGV4dHMgfTtcbiAgICAgIG5ld1Njb3BlLl91c2VyID0gc2NvcGUuX3VzZXI7XG4gICAgICBuZXdTY29wZS5fbGV2ZWwgPSBzY29wZS5fbGV2ZWw7XG4gICAgICBuZXdTY29wZS5fc3BhbiA9IHNjb3BlLl9zcGFuO1xuICAgICAgbmV3U2NvcGUuX3Nlc3Npb24gPSBzY29wZS5fc2Vzc2lvbjtcbiAgICAgIG5ld1Njb3BlLl90cmFuc2FjdGlvbk5hbWUgPSBzY29wZS5fdHJhbnNhY3Rpb25OYW1lO1xuICAgICAgbmV3U2NvcGUuX2ZpbmdlcnByaW50ID0gc2NvcGUuX2ZpbmdlcnByaW50O1xuICAgICAgbmV3U2NvcGUuX2V2ZW50UHJvY2Vzc29ycyA9IFsuLi5zY29wZS5fZXZlbnRQcm9jZXNzb3JzXTtcbiAgICAgIG5ld1Njb3BlLl9yZXF1ZXN0U2Vzc2lvbiA9IHNjb3BlLl9yZXF1ZXN0U2Vzc2lvbjtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1Njb3BlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBpbnRlcm5hbCBvbiBjaGFuZ2UgbGlzdGVuZXIuIFVzZWQgZm9yIHN1YiBTREtzIHRoYXQgbmVlZCB0byBzdG9yZSB0aGUgc2NvcGUuXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHB1YmxpYyBhZGRTY29wZUxpc3RlbmVyKGNhbGxiYWNrOiAoc2NvcGU6IFNjb3BlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fc2NvcGVMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBhZGRFdmVudFByb2Nlc3NvcihjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpOiB0aGlzIHtcbiAgICB0aGlzLl9ldmVudFByb2Nlc3NvcnMucHVzaChjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRVc2VyKHVzZXI6IFVzZXIgfCBudWxsKTogdGhpcyB7XG4gICAgdGhpcy5fdXNlciA9IHVzZXIgfHwge307XG4gICAgaWYgKHRoaXMuX3Nlc3Npb24pIHtcbiAgICAgIHRoaXMuX3Nlc3Npb24udXBkYXRlKHsgdXNlciB9KTtcbiAgICB9XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldFVzZXIoKTogVXNlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZXI7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRSZXF1ZXN0U2Vzc2lvbigpOiBSZXF1ZXN0U2Vzc2lvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RTZXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0UmVxdWVzdFNlc3Npb24ocmVxdWVzdFNlc3Npb24/OiBSZXF1ZXN0U2Vzc2lvbik6IHRoaXMge1xuICAgIHRoaXMuX3JlcXVlc3RTZXNzaW9uID0gcmVxdWVzdFNlc3Npb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIH0pOiB0aGlzIHtcbiAgICB0aGlzLl90YWdzID0ge1xuICAgICAgLi4udGhpcy5fdGFncyxcbiAgICAgIC4uLnRhZ3MsXG4gICAgfTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VGFnKGtleTogc3RyaW5nLCB2YWx1ZTogUHJpbWl0aXZlKTogdGhpcyB7XG4gICAgdGhpcy5fdGFncyA9IHsgLi4udGhpcy5fdGFncywgW2tleV06IHZhbHVlIH07XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldEV4dHJhcyhleHRyYXM6IEV4dHJhcyk6IHRoaXMge1xuICAgIHRoaXMuX2V4dHJhID0ge1xuICAgICAgLi4udGhpcy5fZXh0cmEsXG4gICAgICAuLi5leHRyYXMsXG4gICAgfTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0RXh0cmEoa2V5OiBzdHJpbmcsIGV4dHJhOiBFeHRyYSk6IHRoaXMge1xuICAgIHRoaXMuX2V4dHJhID0geyAuLi50aGlzLl9leHRyYSwgW2tleV06IGV4dHJhIH07XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldEZpbmdlcnByaW50KGZpbmdlcnByaW50OiBzdHJpbmdbXSk6IHRoaXMge1xuICAgIHRoaXMuX2ZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldExldmVsKGxldmVsOiBTZXZlcml0eSk6IHRoaXMge1xuICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XG4gICAgdGhpcy5fbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFRyYW5zYWN0aW9uTmFtZShuYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbiBiZSByZW1vdmVkIGluIG1ham9yIHZlcnNpb24uXG4gICAqIEBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHtAbGluayB0aGlzLnNldFRyYW5zYWN0aW9uTmFtZX1cbiAgICovXG4gIHB1YmxpYyBzZXRUcmFuc2FjdGlvbihuYW1lPzogc3RyaW5nKTogdGhpcyB7XG4gICAgcmV0dXJuIHRoaXMuc2V0VHJhbnNhY3Rpb25OYW1lKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0Q29udGV4dChrZXk6IHN0cmluZywgY29udGV4dDogQ29udGV4dCB8IG51bGwpOiB0aGlzIHtcbiAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1keW5hbWljLWRlbGV0ZVxuICAgICAgZGVsZXRlIHRoaXMuX2NvbnRleHRzW2tleV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0geyAuLi50aGlzLl9jb250ZXh0cywgW2tleV06IGNvbnRleHQgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0U3BhbihzcGFuPzogU3Bhbik6IHRoaXMge1xuICAgIHRoaXMuX3NwYW4gPSBzcGFuO1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRTcGFuKCk6IFNwYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zcGFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIC8vIG9mdGVuLCB0aGlzIHNwYW4gd2lsbCBiZSBhIHRyYW5zYWN0aW9uLCBidXQgaXQncyBub3QgZ3VhcmFudGVlZCB0byBiZVxuICAgIGNvbnN0IHNwYW4gPSB0aGlzLmdldFNwYW4oKSBhcyB1bmRlZmluZWQgfCAoU3BhbiAmIHsgc3BhblJlY29yZGVyOiB7IHNwYW5zOiBTcGFuW10gfSB9KTtcblxuICAgIC8vIHRyeSBpdCB0aGUgbmV3IHdheSBmaXJzdFxuICAgIGlmIChzcGFuPy50cmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuIHNwYW4/LnRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIC8vIGZhbGxiYWNrIHRvIHRoZSBvbGQgd2F5IChrbm93biBidWc6IHRoaXMgb25seSBmaW5kcyB0cmFuc2FjdGlvbnMgd2l0aCBzYW1wbGVkID0gdHJ1ZSlcbiAgICBpZiAoc3Bhbj8uc3BhblJlY29yZGVyPy5zcGFuc1swXSkge1xuICAgICAgcmV0dXJuIHNwYW4uc3BhblJlY29yZGVyLnNwYW5zWzBdIGFzIFRyYW5zYWN0aW9uO1xuICAgIH1cblxuICAgIC8vIG5laXRoZXIgd2F5IGZvdW5kIGEgdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0U2Vzc2lvbihzZXNzaW9uPzogU2Vzc2lvbik6IHRoaXMge1xuICAgIGlmICghc2Vzc2lvbikge1xuICAgICAgZGVsZXRlIHRoaXMuX3Nlc3Npb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nlc3Npb24gPSBzZXNzaW9uO1xuICAgIH1cbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0U2Vzc2lvbigpOiBTZXNzaW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZShjYXB0dXJlQ29udGV4dD86IENhcHR1cmVDb250ZXh0KTogdGhpcyB7XG4gICAgaWYgKCFjYXB0dXJlQ29udGV4dCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjYXB0dXJlQ29udGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY29uc3QgdXBkYXRlZFNjb3BlID0gKGNhcHR1cmVDb250ZXh0IGFzIDxUPihzY29wZTogVCkgPT4gVCkodGhpcyk7XG4gICAgICByZXR1cm4gdXBkYXRlZFNjb3BlIGluc3RhbmNlb2YgU2NvcGUgPyB1cGRhdGVkU2NvcGUgOiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChjYXB0dXJlQ29udGV4dCBpbnN0YW5jZW9mIFNjb3BlKSB7XG4gICAgICB0aGlzLl90YWdzID0geyAuLi50aGlzLl90YWdzLCAuLi5jYXB0dXJlQ29udGV4dC5fdGFncyB9O1xuICAgICAgdGhpcy5fZXh0cmEgPSB7IC4uLnRoaXMuX2V4dHJhLCAuLi5jYXB0dXJlQ29udGV4dC5fZXh0cmEgfTtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0geyAuLi50aGlzLl9jb250ZXh0cywgLi4uY2FwdHVyZUNvbnRleHQuX2NvbnRleHRzIH07XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX3VzZXIgJiYgT2JqZWN0LmtleXMoY2FwdHVyZUNvbnRleHQuX3VzZXIpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLl91c2VyID0gY2FwdHVyZUNvbnRleHQuX3VzZXI7XG4gICAgICB9XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQuX2xldmVsKSB7XG4gICAgICAgIHRoaXMuX2xldmVsID0gY2FwdHVyZUNvbnRleHQuX2xldmVsO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmVDb250ZXh0Ll9maW5nZXJwcmludCkge1xuICAgICAgICB0aGlzLl9maW5nZXJwcmludCA9IGNhcHR1cmVDb250ZXh0Ll9maW5nZXJwcmludDtcbiAgICAgIH1cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5fcmVxdWVzdFNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5fcmVxdWVzdFNlc3Npb24gPSBjYXB0dXJlQ29udGV4dC5fcmVxdWVzdFNlc3Npb247XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGNhcHR1cmVDb250ZXh0KSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICBjYXB0dXJlQ29udGV4dCA9IGNhcHR1cmVDb250ZXh0IGFzIFNjb3BlQ29udGV4dDtcbiAgICAgIHRoaXMuX3RhZ3MgPSB7IC4uLnRoaXMuX3RhZ3MsIC4uLmNhcHR1cmVDb250ZXh0LnRhZ3MgfTtcbiAgICAgIHRoaXMuX2V4dHJhID0geyAuLi50aGlzLl9leHRyYSwgLi4uY2FwdHVyZUNvbnRleHQuZXh0cmEgfTtcbiAgICAgIHRoaXMuX2NvbnRleHRzID0geyAuLi50aGlzLl9jb250ZXh0cywgLi4uY2FwdHVyZUNvbnRleHQuY29udGV4dHMgfTtcbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC51c2VyKSB7XG4gICAgICAgIHRoaXMuX3VzZXIgPSBjYXB0dXJlQ29udGV4dC51c2VyO1xuICAgICAgfVxuICAgICAgaWYgKGNhcHR1cmVDb250ZXh0LmxldmVsKSB7XG4gICAgICAgIHRoaXMuX2xldmVsID0gY2FwdHVyZUNvbnRleHQubGV2ZWw7XG4gICAgICB9XG4gICAgICBpZiAoY2FwdHVyZUNvbnRleHQuZmluZ2VycHJpbnQpIHtcbiAgICAgICAgdGhpcy5fZmluZ2VycHJpbnQgPSBjYXB0dXJlQ29udGV4dC5maW5nZXJwcmludDtcbiAgICAgIH1cbiAgICAgIGlmIChjYXB0dXJlQ29udGV4dC5yZXF1ZXN0U2Vzc2lvbikge1xuICAgICAgICB0aGlzLl9yZXF1ZXN0U2Vzc2lvbiA9IGNhcHR1cmVDb250ZXh0LnJlcXVlc3RTZXNzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2xlYXIoKTogdGhpcyB7XG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbXTtcbiAgICB0aGlzLl90YWdzID0ge307XG4gICAgdGhpcy5fZXh0cmEgPSB7fTtcbiAgICB0aGlzLl91c2VyID0ge307XG4gICAgdGhpcy5fY29udGV4dHMgPSB7fTtcbiAgICB0aGlzLl9sZXZlbCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl90cmFuc2FjdGlvbk5hbWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZmluZ2VycHJpbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fcmVxdWVzdFNlc3Npb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fc3BhbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9zZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBhZGRCcmVhZGNydW1iKGJyZWFkY3J1bWI6IEJyZWFkY3J1bWIsIG1heEJyZWFkY3J1bWJzPzogbnVtYmVyKTogdGhpcyB7XG4gICAgY29uc3QgbWF4Q3J1bWJzID0gdHlwZW9mIG1heEJyZWFkY3J1bWJzID09PSAnbnVtYmVyJyA/IE1hdGgubWluKG1heEJyZWFkY3J1bWJzLCBNQVhfQlJFQURDUlVNQlMpIDogTUFYX0JSRUFEQ1JVTUJTO1xuXG4gICAgLy8gTm8gZGF0YSBoYXMgYmVlbiBjaGFuZ2VkLCBzbyBkb24ndCBub3RpZnkgc2NvcGUgbGlzdGVuZXJzXG4gICAgaWYgKG1heENydW1icyA8PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBjb25zdCBtZXJnZWRCcmVhZGNydW1iID0ge1xuICAgICAgdGltZXN0YW1wOiBkYXRlVGltZXN0YW1wSW5TZWNvbmRzKCksXG4gICAgICAuLi5icmVhZGNydW1iLFxuICAgIH07XG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbLi4udGhpcy5fYnJlYWRjcnVtYnMsIG1lcmdlZEJyZWFkY3J1bWJdLnNsaWNlKC1tYXhDcnVtYnMpO1xuICAgIHRoaXMuX25vdGlmeVNjb3BlTGlzdGVuZXJzKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNsZWFyQnJlYWRjcnVtYnMoKTogdGhpcyB7XG4gICAgdGhpcy5fYnJlYWRjcnVtYnMgPSBbXTtcbiAgICB0aGlzLl9ub3RpZnlTY29wZUxpc3RlbmVycygpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgZmluZ2VycHJpbnQgdG8gdGhlIGV2ZW50LlxuICAgKiBOb3RlIHRoYXQgYnJlYWRjcnVtYnMgd2lsbCBiZSBhZGRlZCBieSB0aGUgY2xpZW50LlxuICAgKiBBbHNvIGlmIHRoZSBldmVudCBoYXMgYWxyZWFkeSBicmVhZGNydW1icyBvbiBpdCwgd2UgZG8gbm90IG1lcmdlIHRoZW0uXG4gICAqIEBwYXJhbSBldmVudCBFdmVudFxuICAgKiBAcGFyYW0gaGludCBNYXkgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHB1YmxpYyBhcHBseVRvRXZlbnQoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPiB7XG4gICAgaWYgKHRoaXMuX2V4dHJhICYmIE9iamVjdC5rZXlzKHRoaXMuX2V4dHJhKS5sZW5ndGgpIHtcbiAgICAgIGV2ZW50LmV4dHJhID0geyAuLi50aGlzLl9leHRyYSwgLi4uZXZlbnQuZXh0cmEgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ3MgJiYgT2JqZWN0LmtleXModGhpcy5fdGFncykubGVuZ3RoKSB7XG4gICAgICBldmVudC50YWdzID0geyAuLi50aGlzLl90YWdzLCAuLi5ldmVudC50YWdzIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl91c2VyICYmIE9iamVjdC5rZXlzKHRoaXMuX3VzZXIpLmxlbmd0aCkge1xuICAgICAgZXZlbnQudXNlciA9IHsgLi4udGhpcy5fdXNlciwgLi4uZXZlbnQudXNlciB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29udGV4dHMgJiYgT2JqZWN0LmtleXModGhpcy5fY29udGV4dHMpLmxlbmd0aCkge1xuICAgICAgZXZlbnQuY29udGV4dHMgPSB7IC4uLnRoaXMuX2NvbnRleHRzLCAuLi5ldmVudC5jb250ZXh0cyB9O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGV2ZWwpIHtcbiAgICAgIGV2ZW50LmxldmVsID0gdGhpcy5fbGV2ZWw7XG4gICAgfVxuICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgIGV2ZW50LnRyYW5zYWN0aW9uID0gdGhpcy5fdHJhbnNhY3Rpb25OYW1lO1xuICAgIH1cbiAgICAvLyBXZSB3YW50IHRvIHNldCB0aGUgdHJhY2UgY29udGV4dCBmb3Igbm9ybWFsIGV2ZW50cyBvbmx5IGlmIHRoZXJlIGlzbid0IGFscmVhZHlcbiAgICAvLyBhIHRyYWNlIGNvbnRleHQgb24gdGhlIGV2ZW50LiBUaGVyZSBpcyBhIHByb2R1Y3QgZmVhdHVyZSBpbiBwbGFjZSB3aGVyZSB3ZSBsaW5rXG4gICAgLy8gZXJyb3JzIHdpdGggdHJhbnNhY3Rpb24gYW5kIGl0IHJlbGllcyBvbiB0aGF0LlxuICAgIGlmICh0aGlzLl9zcGFuKSB7XG4gICAgICBldmVudC5jb250ZXh0cyA9IHsgdHJhY2U6IHRoaXMuX3NwYW4uZ2V0VHJhY2VDb250ZXh0KCksIC4uLmV2ZW50LmNvbnRleHRzIH07XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbk5hbWUgPSB0aGlzLl9zcGFuLnRyYW5zYWN0aW9uPy5uYW1lO1xuICAgICAgaWYgKHRyYW5zYWN0aW9uTmFtZSkge1xuICAgICAgICBldmVudC50YWdzID0geyB0cmFuc2FjdGlvbjogdHJhbnNhY3Rpb25OYW1lLCAuLi5ldmVudC50YWdzIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fYXBwbHlGaW5nZXJwcmludChldmVudCk7XG5cbiAgICBldmVudC5icmVhZGNydW1icyA9IFsuLi4oZXZlbnQuYnJlYWRjcnVtYnMgfHwgW10pLCAuLi50aGlzLl9icmVhZGNydW1ic107XG4gICAgZXZlbnQuYnJlYWRjcnVtYnMgPSBldmVudC5icmVhZGNydW1icy5sZW5ndGggPiAwID8gZXZlbnQuYnJlYWRjcnVtYnMgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gdGhpcy5fbm90aWZ5RXZlbnRQcm9jZXNzb3JzKFsuLi5nZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKSwgLi4udGhpcy5fZXZlbnRQcm9jZXNzb3JzXSwgZXZlbnQsIGhpbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rIGFwcGx5VG9FdmVudH0gaXMgZmluaXNoZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhcbiAgICBwcm9jZXNzb3JzOiBFdmVudFByb2Nlc3NvcltdLFxuICAgIGV2ZW50OiBFdmVudCB8IG51bGwsXG4gICAgaGludD86IEV2ZW50SGludCxcbiAgICBpbmRleDogbnVtYmVyID0gMCxcbiAgKTogUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxFdmVudCB8IG51bGw+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHByb2Nlc3NvciA9IHByb2Nlc3NvcnNbaW5kZXhdO1xuICAgICAgaWYgKGV2ZW50ID09PSBudWxsIHx8IHR5cGVvZiBwcm9jZXNzb3IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzb3IoeyAuLi5ldmVudCB9LCBoaW50KSBhcyBFdmVudCB8IG51bGw7XG4gICAgICAgIGlmIChpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICB2b2lkIChyZXN1bHQgYXMgUHJvbWlzZUxpa2U8RXZlbnQgfCBudWxsPilcbiAgICAgICAgICAgIC50aGVuKGZpbmFsID0+IHRoaXMuX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhwcm9jZXNzb3JzLCBmaW5hbCwgaGludCwgaW5kZXggKyAxKS50aGVuKHJlc29sdmUpKVxuICAgICAgICAgICAgLnRoZW4obnVsbCwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2b2lkIHRoaXMuX25vdGlmeUV2ZW50UHJvY2Vzc29ycyhwcm9jZXNzb3JzLCByZXN1bHQsIGhpbnQsIGluZGV4ICsgMSlcbiAgICAgICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgICAgICAudGhlbihudWxsLCByZWplY3QpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyB3aWxsIGJlIGNhbGxlZCBvbiBldmVyeSBzZXQgY2FsbC5cbiAgICovXG4gIHByb3RlY3RlZCBfbm90aWZ5U2NvcGVMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gV2UgbmVlZCB0aGlzIGNoZWNrIGZvciB0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgdG8gYmUgYWJsZSB0byB3b3JrIG9uIHNjb3BlIGR1cmluZyB1cGRhdGVzXG4gICAgLy8gSWYgdGhpcyBjaGVjayBpcyBub3QgaGVyZSB3ZSdsbCBwcm9kdWNlIGVuZGxlc3MgcmVjdXJzaW9uIHdoZW4gc29tZXRoaW5nIGlzIGRvbmUgd2l0aCB0aGUgc2NvcGVcbiAgICAvLyBkdXJpbmcgdGhlIGNhbGxiYWNrLlxuICAgIGlmICghdGhpcy5fbm90aWZ5aW5nTGlzdGVuZXJzKSB7XG4gICAgICB0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgPSB0cnVlO1xuICAgICAgdGhpcy5fc2NvcGVMaXN0ZW5lcnMuZm9yRWFjaChjYWxsYmFjayA9PiB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9ub3RpZnlpbmdMaXN0ZW5lcnMgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBmaW5nZXJwcmludCBmcm9tIHRoZSBzY29wZSB0byB0aGUgZXZlbnQgaWYgdGhlcmUncyBvbmUsXG4gICAqIHVzZXMgbWVzc2FnZSBpZiB0aGVyZSdzIG9uZSBpbnN0ZWFkIG9yIGdldCByaWQgb2YgZW1wdHkgZmluZ2VycHJpbnRcbiAgICovXG4gIHByaXZhdGUgX2FwcGx5RmluZ2VycHJpbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgLy8gTWFrZSBzdXJlIGl0J3MgYW4gYXJyYXkgZmlyc3QgYW5kIHdlIGFjdHVhbGx5IGhhdmUgc29tZXRoaW5nIGluIHBsYWNlXG4gICAgZXZlbnQuZmluZ2VycHJpbnQgPSBldmVudC5maW5nZXJwcmludFxuICAgICAgPyBBcnJheS5pc0FycmF5KGV2ZW50LmZpbmdlcnByaW50KVxuICAgICAgICA/IGV2ZW50LmZpbmdlcnByaW50XG4gICAgICAgIDogW2V2ZW50LmZpbmdlcnByaW50XVxuICAgICAgOiBbXTtcblxuICAgIC8vIElmIHdlIGhhdmUgc29tZXRoaW5nIG9uIHRoZSBzY29wZSwgdGhlbiBtZXJnZSBpdCB3aXRoIGV2ZW50XG4gICAgaWYgKHRoaXMuX2ZpbmdlcnByaW50KSB7XG4gICAgICBldmVudC5maW5nZXJwcmludCA9IGV2ZW50LmZpbmdlcnByaW50LmNvbmNhdCh0aGlzLl9maW5nZXJwcmludCk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBubyBkYXRhIGF0IGFsbCwgcmVtb3ZlIGVtcHR5IGFycmF5IGRlZmF1bHRcbiAgICBpZiAoZXZlbnQuZmluZ2VycHJpbnQgJiYgIWV2ZW50LmZpbmdlcnByaW50Lmxlbmd0aCkge1xuICAgICAgZGVsZXRlIGV2ZW50LmZpbmdlcnByaW50O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGdsb2JhbCBldmVudCBwcm9jZXNzb3JzLlxuICovXG5mdW5jdGlvbiBnZXRHbG9iYWxFdmVudFByb2Nlc3NvcnMoKTogRXZlbnRQcm9jZXNzb3JbXSB7XG4gIC8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAgKi9cbiAgY29uc3QgZ2xvYmFsID0gZ2V0R2xvYmFsT2JqZWN0PGFueT4oKTtcbiAgZ2xvYmFsLl9fU0VOVFJZX18gPSBnbG9iYWwuX19TRU5UUllfXyB8fCB7fTtcbiAgZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzID0gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzIHx8IFtdO1xuICByZXR1cm4gZ2xvYmFsLl9fU0VOVFJZX18uZ2xvYmFsRXZlbnRQcm9jZXNzb3JzO1xuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xufVxuXG4vKipcbiAqIEFkZCBhIEV2ZW50UHJvY2Vzc29yIHRvIGJlIGtlcHQgZ2xvYmFsbHkuXG4gKiBAcGFyYW0gY2FsbGJhY2sgRXZlbnRQcm9jZXNzb3IgdG8gYWRkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpOiB2b2lkIHtcbiAgZ2V0R2xvYmFsRXZlbnRQcm9jZXNzb3JzKCkucHVzaChjYWxsYmFjayk7XG59XG4iLCAiaW1wb3J0IHsgU2Vzc2lvbiBhcyBTZXNzaW9uSW50ZXJmYWNlLCBTZXNzaW9uQ29udGV4dCwgU2Vzc2lvblN0YXR1cyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZHJvcFVuZGVmaW5lZEtleXMsIHRpbWVzdGFtcEluU2Vjb25kcywgdXVpZDQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqXG4gKiBAaW5oZXJpdGRvY1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbiBpbXBsZW1lbnRzIFNlc3Npb25JbnRlcmZhY2Uge1xuICBwdWJsaWMgdXNlckFnZW50Pzogc3RyaW5nO1xuICBwdWJsaWMgZXJyb3JzOiBudW1iZXIgPSAwO1xuICBwdWJsaWMgcmVsZWFzZT86IHN0cmluZztcbiAgcHVibGljIHNpZDogc3RyaW5nID0gdXVpZDQoKTtcbiAgcHVibGljIGRpZD86IHN0cmluZztcbiAgcHVibGljIHRpbWVzdGFtcDogbnVtYmVyO1xuICBwdWJsaWMgc3RhcnRlZDogbnVtYmVyO1xuICBwdWJsaWMgZHVyYXRpb24/OiBudW1iZXIgPSAwO1xuICBwdWJsaWMgc3RhdHVzOiBTZXNzaW9uU3RhdHVzID0gU2Vzc2lvblN0YXR1cy5PaztcbiAgcHVibGljIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBwdWJsaWMgaXBBZGRyZXNzPzogc3RyaW5nO1xuICBwdWJsaWMgaW5pdDogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBpZ25vcmVEdXJhdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihjb250ZXh0PzogT21pdDxTZXNzaW9uQ29udGV4dCwgJ3N0YXJ0ZWQnIHwgJ3N0YXR1cyc+KSB7XG4gICAgLy8gQm90aCB0aW1lc3RhbXAgYW5kIHN0YXJ0ZWQgYXJlIGluIHNlY29uZHMgc2luY2UgdGhlIFVOSVggZXBvY2guXG4gICAgY29uc3Qgc3RhcnRpbmdUaW1lID0gdGltZXN0YW1wSW5TZWNvbmRzKCk7XG4gICAgdGhpcy50aW1lc3RhbXAgPSBzdGFydGluZ1RpbWU7XG4gICAgdGhpcy5zdGFydGVkID0gc3RhcnRpbmdUaW1lO1xuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICB0aGlzLnVwZGF0ZShjb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgcHVibGljIHVwZGF0ZShjb250ZXh0OiBTZXNzaW9uQ29udGV4dCA9IHt9KTogdm9pZCB7XG4gICAgaWYgKGNvbnRleHQudXNlcikge1xuICAgICAgaWYgKCF0aGlzLmlwQWRkcmVzcyAmJiBjb250ZXh0LnVzZXIuaXBfYWRkcmVzcykge1xuICAgICAgICB0aGlzLmlwQWRkcmVzcyA9IGNvbnRleHQudXNlci5pcF9hZGRyZXNzO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuZGlkICYmICFjb250ZXh0LmRpZCkge1xuICAgICAgICB0aGlzLmRpZCA9IGNvbnRleHQudXNlci5pZCB8fCBjb250ZXh0LnVzZXIuZW1haWwgfHwgY29udGV4dC51c2VyLnVzZXJuYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudGltZXN0YW1wID0gY29udGV4dC50aW1lc3RhbXAgfHwgdGltZXN0YW1wSW5TZWNvbmRzKCk7XG4gICAgaWYgKGNvbnRleHQuaWdub3JlRHVyYXRpb24pIHtcbiAgICAgIHRoaXMuaWdub3JlRHVyYXRpb24gPSBjb250ZXh0Lmlnbm9yZUR1cmF0aW9uO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC5zaWQpIHtcbiAgICAgIC8vIEdvb2QgZW5vdWdoIHV1aWQgdmFsaWRhdGlvbi4gXHUyMDE0IEthbWlsXG4gICAgICB0aGlzLnNpZCA9IGNvbnRleHQuc2lkLmxlbmd0aCA9PT0gMzIgPyBjb250ZXh0LnNpZCA6IHV1aWQ0KCk7XG4gICAgfVxuICAgIGlmIChjb250ZXh0LmluaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pbml0ID0gY29udGV4dC5pbml0O1xuICAgIH1cbiAgICBpZiAoIXRoaXMuZGlkICYmIGNvbnRleHQuZGlkKSB7XG4gICAgICB0aGlzLmRpZCA9IGAke2NvbnRleHQuZGlkfWA7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29udGV4dC5zdGFydGVkID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5zdGFydGVkID0gY29udGV4dC5zdGFydGVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5pZ25vcmVEdXJhdGlvbikge1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb250ZXh0LmR1cmF0aW9uID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5kdXJhdGlvbiA9IGNvbnRleHQuZHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy50aW1lc3RhbXAgLSB0aGlzLnN0YXJ0ZWQ7XG4gICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb24gPj0gMCA/IGR1cmF0aW9uIDogMDtcbiAgICB9XG4gICAgaWYgKGNvbnRleHQucmVsZWFzZSkge1xuICAgICAgdGhpcy5yZWxlYXNlID0gY29udGV4dC5yZWxlYXNlO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC5lbnZpcm9ubWVudCkge1xuICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGNvbnRleHQuZW52aXJvbm1lbnQ7XG4gICAgfVxuICAgIGlmICghdGhpcy5pcEFkZHJlc3MgJiYgY29udGV4dC5pcEFkZHJlc3MpIHtcbiAgICAgIHRoaXMuaXBBZGRyZXNzID0gY29udGV4dC5pcEFkZHJlc3M7XG4gICAgfVxuICAgIGlmICghdGhpcy51c2VyQWdlbnQgJiYgY29udGV4dC51c2VyQWdlbnQpIHtcbiAgICAgIHRoaXMudXNlckFnZW50ID0gY29udGV4dC51c2VyQWdlbnQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY29udGV4dC5lcnJvcnMgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmVycm9ycyA9IGNvbnRleHQuZXJyb3JzO1xuICAgIH1cbiAgICBpZiAoY29udGV4dC5zdGF0dXMpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gY29udGV4dC5zdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHB1YmxpYyBjbG9zZShzdGF0dXM/OiBFeGNsdWRlPFNlc3Npb25TdGF0dXMsIFNlc3Npb25TdGF0dXMuT2s+KTogdm9pZCB7XG4gICAgaWYgKHN0YXR1cykge1xuICAgICAgdGhpcy51cGRhdGUoeyBzdGF0dXMgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnN0YXR1cyA9PT0gU2Vzc2lvblN0YXR1cy5Paykge1xuICAgICAgdGhpcy51cGRhdGUoeyBzdGF0dXM6IFNlc3Npb25TdGF0dXMuRXhpdGVkIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwdWJsaWMgdG9KU09OKCk6IHtcbiAgICBpbml0OiBib29sZWFuO1xuICAgIHNpZDogc3RyaW5nO1xuICAgIGRpZD86IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbiAgICBzdGFydGVkOiBzdHJpbmc7XG4gICAgZHVyYXRpb24/OiBudW1iZXI7XG4gICAgc3RhdHVzOiBTZXNzaW9uU3RhdHVzO1xuICAgIGVycm9yczogbnVtYmVyO1xuICAgIGF0dHJzPzoge1xuICAgICAgcmVsZWFzZT86IHN0cmluZztcbiAgICAgIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAgICAgdXNlcl9hZ2VudD86IHN0cmluZztcbiAgICAgIGlwX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgfTtcbiAgfSB7XG4gICAgcmV0dXJuIGRyb3BVbmRlZmluZWRLZXlzKHtcbiAgICAgIHNpZDogYCR7dGhpcy5zaWR9YCxcbiAgICAgIGluaXQ6IHRoaXMuaW5pdCxcbiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlYyBpcyBjb252ZXJ0ZWQgdG8gbXMgZm9yIGRhdGUgY29uc3RydWN0b3JcbiAgICAgIHN0YXJ0ZWQ6IG5ldyBEYXRlKHRoaXMuc3RhcnRlZCAqIDEwMDApLnRvSVNPU3RyaW5nKCksXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKHRoaXMudGltZXN0YW1wICogMTAwMCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBlcnJvcnM6IHRoaXMuZXJyb3JzLFxuICAgICAgZGlkOiB0eXBlb2YgdGhpcy5kaWQgPT09ICdudW1iZXInIHx8IHR5cGVvZiB0aGlzLmRpZCA9PT0gJ3N0cmluZycgPyBgJHt0aGlzLmRpZH1gIDogdW5kZWZpbmVkLFxuICAgICAgZHVyYXRpb246IHRoaXMuZHVyYXRpb24sXG4gICAgICBhdHRyczogZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgICByZWxlYXNlOiB0aGlzLnJlbGVhc2UsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50LFxuICAgICAgICBpcF9hZGRyZXNzOiB0aGlzLmlwQWRkcmVzcyxcbiAgICAgICAgdXNlcl9hZ2VudDogdGhpcy51c2VyQWdlbnQsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgfVxufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuaW1wb3J0IHtcbiAgQnJlYWRjcnVtYixcbiAgQnJlYWRjcnVtYkhpbnQsXG4gIENsaWVudCxcbiAgQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICBFdmVudCxcbiAgRXZlbnRIaW50LFxuICBFeHRyYSxcbiAgRXh0cmFzLFxuICBIdWIgYXMgSHViSW50ZXJmYWNlLFxuICBJbnRlZ3JhdGlvbixcbiAgSW50ZWdyYXRpb25DbGFzcyxcbiAgUHJpbWl0aXZlLFxuICBTZXNzaW9uQ29udGV4dCxcbiAgU2Vzc2lvblN0YXR1cyxcbiAgU2V2ZXJpdHksXG4gIFNwYW4sXG4gIFNwYW5Db250ZXh0LFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Db250ZXh0LFxuICBVc2VyLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGNvbnNvbGVTYW5kYm94LCBkYXRlVGltZXN0YW1wSW5TZWNvbmRzLCBnZXRHbG9iYWxPYmplY3QsIGlzTm9kZUVudiwgbG9nZ2VyLCB1dWlkNCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuaW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4vc2Vzc2lvbic7XG5cbi8qKlxuICogQVBJIGNvbXBhdGliaWxpdHkgdmVyc2lvbiBvZiB0aGlzIGh1Yi5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIG51bWJlciBzaG91bGQgb25seSBiZSBpbmNyZWFzZWQgd2hlbiB0aGUgZ2xvYmFsIGludGVyZmFjZVxuICogY2hhbmdlcyBhbmQgbmV3IG1ldGhvZHMgYXJlIGludHJvZHVjZWQuXG4gKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgQVBJX1ZFUlNJT04gPSA0O1xuXG4vKipcbiAqIERlZmF1bHQgbWF4aW11bSBudW1iZXIgb2YgYnJlYWRjcnVtYnMgYWRkZWQgdG8gYW4gZXZlbnQuIENhbiBiZSBvdmVyd3JpdHRlblxuICogd2l0aCB7QGxpbmsgT3B0aW9ucy5tYXhCcmVhZGNydW1ic30uXG4gKi9cbmNvbnN0IERFRkFVTFRfQlJFQURDUlVNQlMgPSAxMDA7XG5cbi8qKlxuICogQSBsYXllciBpbiB0aGUgcHJvY2VzcyBzdGFjay5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXllciB7XG4gIGNsaWVudD86IENsaWVudDtcbiAgc2NvcGU/OiBTY29wZTtcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBjb250YWlucyBhIGh1YiBhbmQgbWFpbnRhaW5zIGEgc2NvcGUgc3RhY2suXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FycmllciB7XG4gIF9fU0VOVFJZX18/OiB7XG4gICAgaHViPzogSHViO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIEh1YiBwcm9wZXJ0aWVzIGluamVjdGVkIGJ5IHZhcmlvdXMgU0RLc1xuICAgICAqL1xuICAgIGludGVncmF0aW9ucz86IEludGVncmF0aW9uW107XG4gICAgZXh0ZW5zaW9ucz86IHtcbiAgICAgIC8qKiBIYWNrIHRvIHByZXZlbnQgYnVuZGxlcnMgZnJvbSBicmVha2luZyBvdXIgdXNhZ2Ugb2YgdGhlIGRvbWFpbiBwYWNrYWdlIGluIHRoZSBjcm9zcy1wbGF0Zm9ybSBIdWIgcGFja2FnZSAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgIGRvbWFpbj86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gICAgfSAmIHtcbiAgICAgIC8qKiBFeHRlbnNpb24gbWV0aG9kcyBmb3IgdGhlIGh1Yiwgd2hpY2ggYXJlIGJvdW5kIHRvIHRoZSBjdXJyZW50IEh1YiBpbnN0YW5jZSAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHlwZXNcbiAgICAgIFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uO1xuICAgIH07XG4gIH07XG59XG5cbi8qKlxuICogQGhpZGRlblxuICogQGRlcHJlY2F0ZWQgQ2FuIGJlIHJlbW92ZWQgb25jZSBgSHViLmdldEFjdGl2ZURvbWFpbmAgaXMgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb21haW5Bc0NhcnJpZXIgZXh0ZW5kcyBDYXJyaWVyIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgbWVtYmVyczogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdO1xufVxuXG4vKipcbiAqIEBpbmhlcml0RG9jXG4gKi9cbmV4cG9ydCBjbGFzcyBIdWIgaW1wbGVtZW50cyBIdWJJbnRlcmZhY2Uge1xuICAvKiogSXMgYSB7QGxpbmsgTGF5ZXJ9W10gY29udGFpbmluZyB0aGUgY2xpZW50IGFuZCBzY29wZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9zdGFjazogTGF5ZXJbXSA9IFt7fV07XG5cbiAgLyoqIENvbnRhaW5zIHRoZSBsYXN0IGV2ZW50IGlkIG9mIGEgY2FwdHVyZWQgZXZlbnQuICAqL1xuICBwcml2YXRlIF9sYXN0RXZlbnRJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgaHViLCB3aWxsIHB1c2ggb25lIHtAbGluayBMYXllcn0gaW50byB0aGVcbiAgICogaW50ZXJuYWwgc3RhY2sgb24gY3JlYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnQgYm91bmQgdG8gdGhlIGh1Yi5cbiAgICogQHBhcmFtIHNjb3BlIGJvdW5kIHRvIHRoZSBodWIuXG4gICAqIEBwYXJhbSB2ZXJzaW9uIG51bWJlciwgaGlnaGVyIG51bWJlciBtZWFucyBoaWdoZXIgcHJpb3JpdHkuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoY2xpZW50PzogQ2xpZW50LCBzY29wZTogU2NvcGUgPSBuZXcgU2NvcGUoKSwgcHJpdmF0ZSByZWFkb25seSBfdmVyc2lvbjogbnVtYmVyID0gQVBJX1ZFUlNJT04pIHtcbiAgICB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGUgPSBzY29wZTtcbiAgICBpZiAoY2xpZW50KSB7XG4gICAgICB0aGlzLmJpbmRDbGllbnQoY2xpZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBpc09sZGVyVGhhbih2ZXJzaW9uOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdmVyc2lvbiA8IHZlcnNpb247XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBiaW5kQ2xpZW50KGNsaWVudD86IENsaWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuZ2V0U3RhY2tUb3AoKTtcbiAgICB0b3AuY2xpZW50ID0gY2xpZW50O1xuICAgIGlmIChjbGllbnQgJiYgY2xpZW50LnNldHVwSW50ZWdyYXRpb25zKSB7XG4gICAgICBjbGllbnQuc2V0dXBJbnRlZ3JhdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBwdXNoU2NvcGUoKTogU2NvcGUge1xuICAgIC8vIFdlIHdhbnQgdG8gY2xvbmUgdGhlIGNvbnRlbnQgb2YgcHJldiBzY29wZVxuICAgIGNvbnN0IHNjb3BlID0gU2NvcGUuY2xvbmUodGhpcy5nZXRTY29wZSgpKTtcbiAgICB0aGlzLmdldFN0YWNrKCkucHVzaCh7XG4gICAgICBjbGllbnQ6IHRoaXMuZ2V0Q2xpZW50KCksXG4gICAgICBzY29wZSxcbiAgICB9KTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBwb3BTY29wZSgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5nZXRTdGFjaygpLmxlbmd0aCA8PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRTdGFjaygpLnBvcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgd2l0aFNjb3BlKGNhbGxiYWNrOiAoc2NvcGU6IFNjb3BlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLnB1c2hTY29wZSgpO1xuICAgIHRyeSB7XG4gICAgICBjYWxsYmFjayhzY29wZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucG9wU2NvcGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRDbGllbnQ8QyBleHRlbmRzIENsaWVudD4oKTogQyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RhY2tUb3AoKS5jbGllbnQgYXMgQztcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzY29wZSBvZiB0aGUgdG9wIHN0YWNrLiAqL1xuICBwdWJsaWMgZ2V0U2NvcGUoKTogU2NvcGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmdldFN0YWNrVG9wKCkuc2NvcGU7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgc2NvcGUgc3RhY2sgZm9yIGRvbWFpbnMgb3IgdGhlIHByb2Nlc3MuICovXG4gIHB1YmxpYyBnZXRTdGFjaygpOiBMYXllcltdIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhY2s7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgdG9wbW9zdCBzY29wZSBsYXllciBpbiB0aGUgb3JkZXIgZG9tYWluID4gbG9jYWwgPiBwcm9jZXNzLiAqL1xuICBwdWJsaWMgZ2V0U3RhY2tUb3AoKTogTGF5ZXIge1xuICAgIHJldHVybiB0aGlzLl9zdGFja1t0aGlzLl9zdGFjay5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnksIEB0eXBlc2NyaXB0LWVzbGludC9leHBsaWNpdC1tb2R1bGUtYm91bmRhcnktdHlwZXNcbiAgcHVibGljIGNhcHR1cmVFeGNlcHRpb24oZXhjZXB0aW9uOiBhbnksIGhpbnQ/OiBFdmVudEhpbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGV2ZW50SWQgPSAodGhpcy5fbGFzdEV2ZW50SWQgPSB1dWlkNCgpKTtcbiAgICBsZXQgZmluYWxIaW50ID0gaGludDtcblxuICAgIC8vIElmIHRoZXJlJ3Mgbm8gZXhwbGljaXQgaGludCBwcm92aWRlZCwgbWltaWMgdGhlIHNhbWUgdGhpbmcgdGhhdCB3b3VsZCBoYXBwZW5cbiAgICAvLyBpbiB0aGUgbWluaW1hbCBpdHNlbGYgdG8gY3JlYXRlIGEgY29uc2lzdGVudCBiZWhhdmlvci5cbiAgICAvLyBXZSBkb24ndCBkbyB0aGlzIGluIHRoZSBjbGllbnQsIGFzIGl0J3MgdGhlIGxvd2VzdCBsZXZlbCBBUEksIGFuZCBkb2luZyB0aGlzLFxuICAgIC8vIHdvdWxkIHByZXZlbnQgdXNlciBmcm9tIGhhdmluZyBmdWxsIGNvbnRyb2wgb3ZlciBkaXJlY3QgY2FsbHMuXG4gICAgaWYgKCFoaW50KSB7XG4gICAgICBsZXQgc3ludGhldGljRXhjZXB0aW9uOiBFcnJvcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbicpO1xuICAgICAgfSBjYXRjaCAoZXhjZXB0aW9uKSB7XG4gICAgICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbiBhcyBFcnJvcjtcbiAgICAgIH1cbiAgICAgIGZpbmFsSGludCA9IHtcbiAgICAgICAgb3JpZ2luYWxFeGNlcHRpb246IGV4Y2VwdGlvbixcbiAgICAgICAgc3ludGhldGljRXhjZXB0aW9uLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVFeGNlcHRpb24nLCBleGNlcHRpb24sIHtcbiAgICAgIC4uLmZpbmFsSGludCxcbiAgICAgIGV2ZW50X2lkOiBldmVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiBldmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBsZXZlbD86IFNldmVyaXR5LCBoaW50PzogRXZlbnRIaW50KTogc3RyaW5nIHtcbiAgICBjb25zdCBldmVudElkID0gKHRoaXMuX2xhc3RFdmVudElkID0gdXVpZDQoKSk7XG4gICAgbGV0IGZpbmFsSGludCA9IGhpbnQ7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGV4cGxpY2l0IGhpbnQgcHJvdmlkZWQsIG1pbWljIHRoZSBzYW1lIHRoaW5nIHRoYXQgd291bGQgaGFwcGVuXG4gICAgLy8gaW4gdGhlIG1pbmltYWwgaXRzZWxmIHRvIGNyZWF0ZSBhIGNvbnNpc3RlbnQgYmVoYXZpb3IuXG4gICAgLy8gV2UgZG9uJ3QgZG8gdGhpcyBpbiB0aGUgY2xpZW50LCBhcyBpdCdzIHRoZSBsb3dlc3QgbGV2ZWwgQVBJLCBhbmQgZG9pbmcgdGhpcyxcbiAgICAvLyB3b3VsZCBwcmV2ZW50IHVzZXIgZnJvbSBoYXZpbmcgZnVsbCBjb250cm9sIG92ZXIgZGlyZWN0IGNhbGxzLlxuICAgIGlmICghaGludCkge1xuICAgICAgbGV0IHN5bnRoZXRpY0V4Y2VwdGlvbjogRXJyb3I7XG4gICAgICB0cnkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICAgICAgc3ludGhldGljRXhjZXB0aW9uID0gZXhjZXB0aW9uIGFzIEVycm9yO1xuICAgICAgfVxuICAgICAgZmluYWxIaW50ID0ge1xuICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogbWVzc2FnZSxcbiAgICAgICAgc3ludGhldGljRXhjZXB0aW9uLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVNZXNzYWdlJywgbWVzc2FnZSwgbGV2ZWwsIHtcbiAgICAgIC4uLmZpbmFsSGludCxcbiAgICAgIGV2ZW50X2lkOiBldmVudElkLFxuICAgIH0pO1xuICAgIHJldHVybiBldmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZUV2ZW50KGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCk6IHN0cmluZyB7XG4gICAgY29uc3QgZXZlbnRJZCA9IHV1aWQ0KCk7XG4gICAgaWYgKGV2ZW50LnR5cGUgIT09ICd0cmFuc2FjdGlvbicpIHtcbiAgICAgIHRoaXMuX2xhc3RFdmVudElkID0gZXZlbnRJZDtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnZva2VDbGllbnQoJ2NhcHR1cmVFdmVudCcsIGV2ZW50LCB7XG4gICAgICAuLi5oaW50LFxuICAgICAgZXZlbnRfaWQ6IGV2ZW50SWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIGV2ZW50SWQ7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBsYXN0RXZlbnRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9sYXN0RXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGFkZEJyZWFkY3J1bWIoYnJlYWRjcnVtYjogQnJlYWRjcnVtYiwgaGludD86IEJyZWFkY3J1bWJIaW50KTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29wZSwgY2xpZW50IH0gPSB0aGlzLmdldFN0YWNrVG9wKCk7XG5cbiAgICBpZiAoIXNjb3BlIHx8ICFjbGllbnQpIHJldHVybjtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICBjb25zdCB7IGJlZm9yZUJyZWFkY3J1bWIgPSBudWxsLCBtYXhCcmVhZGNydW1icyA9IERFRkFVTFRfQlJFQURDUlVNQlMgfSA9XG4gICAgICAoY2xpZW50LmdldE9wdGlvbnMgJiYgY2xpZW50LmdldE9wdGlvbnMoKSkgfHwge307XG5cbiAgICBpZiAobWF4QnJlYWRjcnVtYnMgPD0gMCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdGltZXN0YW1wID0gZGF0ZVRpbWVzdGFtcEluU2Vjb25kcygpO1xuICAgIGNvbnN0IG1lcmdlZEJyZWFkY3J1bWIgPSB7IHRpbWVzdGFtcCwgLi4uYnJlYWRjcnVtYiB9O1xuICAgIGNvbnN0IGZpbmFsQnJlYWRjcnVtYiA9IGJlZm9yZUJyZWFkY3J1bWJcbiAgICAgID8gKGNvbnNvbGVTYW5kYm94KCgpID0+IGJlZm9yZUJyZWFkY3J1bWIobWVyZ2VkQnJlYWRjcnVtYiwgaGludCkpIGFzIEJyZWFkY3J1bWIgfCBudWxsKVxuICAgICAgOiBtZXJnZWRCcmVhZGNydW1iO1xuXG4gICAgaWYgKGZpbmFsQnJlYWRjcnVtYiA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgc2NvcGUuYWRkQnJlYWRjcnVtYihmaW5hbEJyZWFkY3J1bWIsIG1heEJyZWFkY3J1bWJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFVzZXIodXNlcjogVXNlciB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldFVzZXIodXNlcik7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRUYWdzKHRhZ3M6IHsgW2tleTogc3RyaW5nXTogUHJpbWl0aXZlIH0pOiB2b2lkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldFRhZ3ModGFncyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRFeHRyYXMoZXh0cmFzOiBFeHRyYXMpOiB2b2lkIHtcbiAgICBjb25zdCBzY29wZSA9IHRoaXMuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUpIHNjb3BlLnNldEV4dHJhcyhleHRyYXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VGFnKGtleTogc3RyaW5nLCB2YWx1ZTogUHJpbWl0aXZlKTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSBzY29wZS5zZXRUYWcoa2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRFeHRyYShrZXk6IHN0cmluZywgZXh0cmE6IEV4dHJhKTogdm9pZCB7XG4gICAgY29uc3Qgc2NvcGUgPSB0aGlzLmdldFNjb3BlKCk7XG4gICAgaWYgKHNjb3BlKSBzY29wZS5zZXRFeHRyYShrZXksIGV4dHJhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHVibGljIHNldENvbnRleHQobmFtZTogc3RyaW5nLCBjb250ZXh0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuICAgIGlmIChzY29wZSkgc2NvcGUuc2V0Q29udGV4dChuYW1lLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbmZpZ3VyZVNjb3BlKGNhbGxiYWNrOiAoc2NvcGU6IFNjb3BlKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29wZSwgY2xpZW50IH0gPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgaWYgKHNjb3BlICYmIGNsaWVudCkge1xuICAgICAgY2FsbGJhY2soc2NvcGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHJ1bihjYWxsYmFjazogKGh1YjogSHViKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkSHViID0gbWFrZU1haW4odGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGNhbGxiYWNrKHRoaXMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBtYWtlTWFpbihvbGRIdWIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldEludGVncmF0aW9uPFQgZXh0ZW5kcyBJbnRlZ3JhdGlvbj4oaW50ZWdyYXRpb246IEludGVncmF0aW9uQ2xhc3M8VD4pOiBUIHwgbnVsbCB7XG4gICAgY29uc3QgY2xpZW50ID0gdGhpcy5nZXRDbGllbnQoKTtcbiAgICBpZiAoIWNsaWVudCkgcmV0dXJuIG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBjbGllbnQuZ2V0SW50ZWdyYXRpb24oaW50ZWdyYXRpb24pO1xuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgbG9nZ2VyLndhcm4oYENhbm5vdCByZXRyaWV2ZSBpbnRlZ3JhdGlvbiAke2ludGVncmF0aW9uLmlkfSBmcm9tIHRoZSBjdXJyZW50IEh1YmApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhcnRTcGFuKGNvbnRleHQ6IFNwYW5Db250ZXh0KTogU3BhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxFeHRlbnNpb25NZXRob2QoJ3N0YXJ0U3BhbicsIGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhcnRUcmFuc2FjdGlvbihjb250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQsIGN1c3RvbVNhbXBsaW5nQ29udGV4dD86IEN1c3RvbVNhbXBsaW5nQ29udGV4dCk6IFRyYW5zYWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fY2FsbEV4dGVuc2lvbk1ldGhvZCgnc3RhcnRUcmFuc2FjdGlvbicsIGNvbnRleHQsIGN1c3RvbVNhbXBsaW5nQ29udGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB0cmFjZUhlYWRlcnMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhbGxFeHRlbnNpb25NZXRob2Q8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4oJ3RyYWNlSGVhZGVycycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZVNlc3Npb24oZW5kU2Vzc2lvbjogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgLy8gYm90aCBzZW5kIHRoZSB1cGRhdGUgYW5kIHB1bGwgdGhlIHNlc3Npb24gZnJvbSB0aGUgc2NvcGVcbiAgICBpZiAoZW5kU2Vzc2lvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZW5kU2Vzc2lvbigpO1xuICAgIH1cblxuICAgIC8vIG9ubHkgc2VuZCB0aGUgdXBkYXRlXG4gICAgdGhpcy5fc2VuZFNlc3Npb25VcGRhdGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGVuZFNlc3Npb24oKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdGFja1RvcCgpXG4gICAgICA/LnNjb3BlPy5nZXRTZXNzaW9uKClcbiAgICAgID8uY2xvc2UoKTtcbiAgICB0aGlzLl9zZW5kU2Vzc2lvblVwZGF0ZSgpO1xuXG4gICAgLy8gdGhlIHNlc3Npb24gaXMgb3ZlcjsgdGFrZSBpdCBvZmYgb2YgdGhlIHNjb3BlXG4gICAgdGhpcy5nZXRTdGFja1RvcCgpPy5zY29wZT8uc2V0U2Vzc2lvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhcnRTZXNzaW9uKGNvbnRleHQ/OiBTZXNzaW9uQ29udGV4dCk6IFNlc3Npb24ge1xuICAgIGNvbnN0IHsgc2NvcGUsIGNsaWVudCB9ID0gdGhpcy5nZXRTdGFja1RvcCgpO1xuICAgIGNvbnN0IHsgcmVsZWFzZSwgZW52aXJvbm1lbnQgfSA9IChjbGllbnQgJiYgY2xpZW50LmdldE9wdGlvbnMoKSkgfHwge307XG5cbiAgICAvLyBXaWxsIGZldGNoIHVzZXJBZ2VudCBpZiBjYWxsZWQgZnJvbSBicm93c2VyIHNka1xuICAgIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDx7IG5hdmlnYXRvcj86IHsgdXNlckFnZW50Pzogc3RyaW5nIH0gfT4oKTtcbiAgICBjb25zdCB7IHVzZXJBZ2VudCB9ID0gZ2xvYmFsLm5hdmlnYXRvciB8fCB7fTtcblxuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgU2Vzc2lvbih7XG4gICAgICByZWxlYXNlLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAuLi4oc2NvcGUgJiYgeyB1c2VyOiBzY29wZS5nZXRVc2VyKCkgfSksXG4gICAgICAuLi4odXNlckFnZW50ICYmIHsgdXNlckFnZW50IH0pLFxuICAgICAgLi4uY29udGV4dCxcbiAgICB9KTtcblxuICAgIGlmIChzY29wZSkge1xuICAgICAgLy8gRW5kIGV4aXN0aW5nIHNlc3Npb24gaWYgdGhlcmUncyBvbmVcbiAgICAgIGNvbnN0IGN1cnJlbnRTZXNzaW9uID0gc2NvcGUuZ2V0U2Vzc2lvbiAmJiBzY29wZS5nZXRTZXNzaW9uKCk7XG4gICAgICBpZiAoY3VycmVudFNlc3Npb24gJiYgY3VycmVudFNlc3Npb24uc3RhdHVzID09PSBTZXNzaW9uU3RhdHVzLk9rKSB7XG4gICAgICAgIGN1cnJlbnRTZXNzaW9uLnVwZGF0ZSh7IHN0YXR1czogU2Vzc2lvblN0YXR1cy5FeGl0ZWQgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLmVuZFNlc3Npb24oKTtcblxuICAgICAgLy8gQWZ0ZXJ3YXJkcyB3ZSBzZXQgdGhlIG5ldyBzZXNzaW9uIG9uIHRoZSBzY29wZVxuICAgICAgc2NvcGUuc2V0U2Vzc2lvbihzZXNzaW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2Vzc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyB0aGUgY3VycmVudCBTZXNzaW9uIG9uIHRoZSBzY29wZVxuICAgKi9cbiAgcHJpdmF0ZSBfc2VuZFNlc3Npb25VcGRhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29wZSwgY2xpZW50IH0gPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgaWYgKCFzY29wZSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2Vzc2lvbiA9IHNjb3BlLmdldFNlc3Npb24gJiYgc2NvcGUuZ2V0U2Vzc2lvbigpO1xuICAgIGlmIChzZXNzaW9uKSB7XG4gICAgICBpZiAoY2xpZW50ICYmIGNsaWVudC5jYXB0dXJlU2Vzc2lvbikge1xuICAgICAgICBjbGllbnQuY2FwdHVyZVNlc3Npb24oc2Vzc2lvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIGhlbHBlciBmdW5jdGlvbiB0byBjYWxsIGEgbWV0aG9kIG9uIHRoZSB0b3AgY2xpZW50IGlmIGl0IGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIGNsaWVudC5cbiAgICogQHBhcmFtIGFyZ3MgQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNsaWVudCBmdW5jdGlvbi5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgX2ludm9rZUNsaWVudDxNIGV4dGVuZHMga2V5b2YgQ2xpZW50PihtZXRob2Q6IE0sIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgY29uc3QgeyBzY29wZSwgY2xpZW50IH0gPSB0aGlzLmdldFN0YWNrVG9wKCk7XG4gICAgaWYgKGNsaWVudCAmJiBjbGllbnRbbWV0aG9kXSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgKGNsaWVudCBhcyBhbnkpW21ldGhvZF0oLi4uYXJncywgc2NvcGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBnbG9iYWwgZXh0ZW5zaW9uIG1ldGhvZCBhbmQgYmluZGluZyBjdXJyZW50IGluc3RhbmNlIHRvIHRoZSBmdW5jdGlvbiBjYWxsXG4gICAqL1xuICAvLyBAdHMtaWdub3JlIEZ1bmN0aW9uIGxhY2tzIGVuZGluZyByZXR1cm4gc3RhdGVtZW50IGFuZCByZXR1cm4gdHlwZSBkb2VzIG5vdCBpbmNsdWRlICd1bmRlZmluZWQnLiB0cygyMzY2KVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwcml2YXRlIF9jYWxsRXh0ZW5zaW9uTWV0aG9kPFQ+KG1ldGhvZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIGNvbnN0IGNhcnJpZXIgPSBnZXRNYWluQ2FycmllcigpO1xuICAgIGNvbnN0IHNlbnRyeSA9IGNhcnJpZXIuX19TRU5UUllfXztcbiAgICBpZiAoc2VudHJ5ICYmIHNlbnRyeS5leHRlbnNpb25zICYmIHR5cGVvZiBzZW50cnkuZXh0ZW5zaW9uc1ttZXRob2RdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gc2VudHJ5LmV4dGVuc2lvbnNbbWV0aG9kXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oYEV4dGVuc2lvbiBtZXRob2QgJHttZXRob2R9IGNvdWxkbid0IGJlIGZvdW5kLCBkb2luZyBub3RoaW5nLmApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZ2xvYmFsIHNoaW0gcmVnaXN0cnkuXG4gKlxuICogRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgcHJvYmxlbWF0aWMsIGJlY2F1c2UgZGVzcGl0ZSBhbHdheXMgcmV0dXJuaW5nIGEgdmFsaWQgQ2FycmllcixcbiAqIGl0IGhhcyBhbiBvcHRpb25hbCBgX19TRU5UUllfX2AgcHJvcGVydHksIHdoaWNoIHRoZW4gaW4gdHVybiByZXF1aXJlcyB1cyB0byBhbHdheXMgcGVyZm9ybSBhbiB1bm5lY2Vzc2FyeSBjaGVja1xuICogYXQgdGhlIGNhbGwtc2l0ZS4gV2UgYWx3YXlzIGFjY2VzcyB0aGUgY2FycmllciB0aHJvdWdoIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGNhbiBndWFyYW50ZWUgdGhhdCBgX19TRU5UUllfX2AgaXMgdGhlcmUuXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFpbkNhcnJpZXIoKTogQ2FycmllciB7XG4gIGNvbnN0IGNhcnJpZXIgPSBnZXRHbG9iYWxPYmplY3QoKTtcbiAgY2Fycmllci5fX1NFTlRSWV9fID0gY2Fycmllci5fX1NFTlRSWV9fIHx8IHtcbiAgICBleHRlbnNpb25zOiB7fSxcbiAgICBodWI6IHVuZGVmaW5lZCxcbiAgfTtcbiAgcmV0dXJuIGNhcnJpZXI7XG59XG5cbi8qKlxuICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgbWFpbiBodWIgd2l0aCB0aGUgcGFzc2VkIG9uZSBvbiB0aGUgZ2xvYmFsIG9iamVjdFxuICpcbiAqIEByZXR1cm5zIFRoZSBvbGQgcmVwbGFjZWQgaHViXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTWFpbihodWI6IEh1Yik6IEh1YiB7XG4gIGNvbnN0IHJlZ2lzdHJ5ID0gZ2V0TWFpbkNhcnJpZXIoKTtcbiAgY29uc3Qgb2xkSHViID0gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpO1xuICBzZXRIdWJPbkNhcnJpZXIocmVnaXN0cnksIGh1Yik7XG4gIHJldHVybiBvbGRIdWI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVmYXVsdCBodWIgaW5zdGFuY2UuXG4gKlxuICogSWYgYSBodWIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGluIHRoZSBnbG9iYWwgY2FycmllciBidXQgdGhpcyBtb2R1bGVcbiAqIGNvbnRhaW5zIGEgbW9yZSByZWNlbnQgdmVyc2lvbiwgaXQgcmVwbGFjZXMgdGhlIHJlZ2lzdGVyZWQgdmVyc2lvbi5cbiAqIE90aGVyd2lzZSwgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIGh1YiB3aWxsIGJlIHJldHVybmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3VycmVudEh1YigpOiBIdWIge1xuICAvLyBHZXQgbWFpbiBjYXJyaWVyIChnbG9iYWwgZm9yIGV2ZXJ5IGVudmlyb25tZW50KVxuICBjb25zdCByZWdpc3RyeSA9IGdldE1haW5DYXJyaWVyKCk7XG5cbiAgLy8gSWYgdGhlcmUncyBubyBodWIsIG9yIGl0cyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG4gIGlmICghaGFzSHViT25DYXJyaWVyKHJlZ2lzdHJ5KSB8fCBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSkuaXNPbGRlclRoYW4oQVBJX1ZFUlNJT04pKSB7XG4gICAgc2V0SHViT25DYXJyaWVyKHJlZ2lzdHJ5LCBuZXcgSHViKCkpO1xuICB9XG5cbiAgLy8gUHJlZmVyIGRvbWFpbnMgb3ZlciBnbG9iYWwgaWYgdGhleSBhcmUgdGhlcmUgKGFwcGxpY2FibGUgb25seSB0byBOb2RlIGVudmlyb25tZW50KVxuICBpZiAoaXNOb2RlRW52KCkpIHtcbiAgICByZXR1cm4gZ2V0SHViRnJvbUFjdGl2ZURvbWFpbihyZWdpc3RyeSk7XG4gIH1cbiAgLy8gUmV0dXJuIGh1YiB0aGF0IGxpdmVzIG9uIGEgZ2xvYmFsIG9iamVjdFxuICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIocmVnaXN0cnkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGFjdGl2ZSBkb21haW4sIGlmIG9uZSBleGlzdHNcbiAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciB1c2VkOyByZW1vdmUgaW4gdjdcbiAqIEByZXR1cm5zIFRoZSBkb21haW4sIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBhY3RpdmUgZG9tYWluXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZURvbWFpbigpOiBEb21haW5Bc0NhcnJpZXIgfCB1bmRlZmluZWQge1xuICBsb2dnZXIud2FybignRnVuY3Rpb24gYGdldEFjdGl2ZURvbWFpbmAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uJyk7XG5cbiAgY29uc3Qgc2VudHJ5ID0gZ2V0TWFpbkNhcnJpZXIoKS5fX1NFTlRSWV9fO1xuXG4gIHJldHVybiBzZW50cnkgJiYgc2VudHJ5LmV4dGVuc2lvbnMgJiYgc2VudHJ5LmV4dGVuc2lvbnMuZG9tYWluICYmIHNlbnRyeS5leHRlbnNpb25zLmRvbWFpbi5hY3RpdmU7XG59XG5cbi8qKlxuICogVHJ5IHRvIHJlYWQgdGhlIGh1YiBmcm9tIGFuIGFjdGl2ZSBkb21haW4sIGFuZCBmYWxsYmFjayB0byB0aGUgcmVnaXN0cnkgaWYgb25lIGRvZXNuJ3QgZXhpc3RcbiAqIEByZXR1cm5zIGRpc2NvdmVyZWQgaHViXG4gKi9cbmZ1bmN0aW9uIGdldEh1YkZyb21BY3RpdmVEb21haW4ocmVnaXN0cnk6IENhcnJpZXIpOiBIdWIge1xuICB0cnkge1xuICAgIGNvbnN0IGFjdGl2ZURvbWFpbiA9IGdldE1haW5DYXJyaWVyKCkuX19TRU5UUllfXz8uZXh0ZW5zaW9ucz8uZG9tYWluPy5hY3RpdmU7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGFjdGl2ZSBkb21haW4sIGp1c3QgcmV0dXJuIGdsb2JhbCBodWJcbiAgICBpZiAoIWFjdGl2ZURvbWFpbikge1xuICAgICAgcmV0dXJuIGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGh1YiBvbiBjdXJyZW50IGRvbWFpbiwgb3IgaXQncyBhbiBvbGQgQVBJLCBhc3NpZ24gYSBuZXcgb25lXG4gICAgaWYgKCFoYXNIdWJPbkNhcnJpZXIoYWN0aXZlRG9tYWluKSB8fCBnZXRIdWJGcm9tQ2FycmllcihhY3RpdmVEb21haW4pLmlzT2xkZXJUaGFuKEFQSV9WRVJTSU9OKSkge1xuICAgICAgY29uc3QgcmVnaXN0cnlIdWJUb3BTdGFjayA9IGdldEh1YkZyb21DYXJyaWVyKHJlZ2lzdHJ5KS5nZXRTdGFja1RvcCgpO1xuICAgICAgc2V0SHViT25DYXJyaWVyKGFjdGl2ZURvbWFpbiwgbmV3IEh1YihyZWdpc3RyeUh1YlRvcFN0YWNrLmNsaWVudCwgU2NvcGUuY2xvbmUocmVnaXN0cnlIdWJUb3BTdGFjay5zY29wZSkpKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gaHViIHRoYXQgbGl2ZXMgb24gYSBkb21haW5cbiAgICByZXR1cm4gZ2V0SHViRnJvbUNhcnJpZXIoYWN0aXZlRG9tYWluKTtcbiAgfSBjYXRjaCAoX09vKSB7XG4gICAgLy8gUmV0dXJuIGh1YiB0aGF0IGxpdmVzIG9uIGEgZ2xvYmFsIG9iamVjdFxuICAgIHJldHVybiBnZXRIdWJGcm9tQ2FycmllcihyZWdpc3RyeSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIHdpbGwgdGVsbCB3aGV0aGVyIGEgY2FycmllciBoYXMgYSBodWIgb24gaXQgb3Igbm90XG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqL1xuZnVuY3Rpb24gaGFzSHViT25DYXJyaWVyKGNhcnJpZXI6IENhcnJpZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhKGNhcnJpZXIgJiYgY2Fycmllci5fX1NFTlRSWV9fICYmIGNhcnJpZXIuX19TRU5UUllfXy5odWIpO1xufVxuXG4vKipcbiAqIFRoaXMgd2lsbCBjcmVhdGUgYSBuZXcge0BsaW5rIEh1Yn0gYW5kIGFkZCB0byB0aGUgcGFzc2VkIG9iamVjdCBvblxuICogX19TRU5UUllfXy5odWIuXG4gKiBAcGFyYW0gY2FycmllciBvYmplY3RcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEh1YkZyb21DYXJyaWVyKGNhcnJpZXI6IENhcnJpZXIpOiBIdWIge1xuICBpZiAoY2FycmllciAmJiBjYXJyaWVyLl9fU0VOVFJZX18gJiYgY2Fycmllci5fX1NFTlRSWV9fLmh1YikgcmV0dXJuIGNhcnJpZXIuX19TRU5UUllfXy5odWI7XG4gIGNhcnJpZXIuX19TRU5UUllfXyA9IGNhcnJpZXIuX19TRU5UUllfXyB8fCB7fTtcbiAgY2Fycmllci5fX1NFTlRSWV9fLmh1YiA9IG5ldyBIdWIoKTtcbiAgcmV0dXJuIGNhcnJpZXIuX19TRU5UUllfXy5odWI7XG59XG5cbi8qKlxuICogVGhpcyB3aWxsIHNldCBwYXNzZWQge0BsaW5rIEh1Yn0gb24gdGhlIHBhc3NlZCBvYmplY3QncyBfX1NFTlRSWV9fLmh1YiBhdHRyaWJ1dGVcbiAqIEBwYXJhbSBjYXJyaWVyIG9iamVjdFxuICogQHBhcmFtIGh1YiBIdWJcbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SHViT25DYXJyaWVyKGNhcnJpZXI6IENhcnJpZXIsIGh1YjogSHViKTogYm9vbGVhbiB7XG4gIGlmICghY2FycmllcikgcmV0dXJuIGZhbHNlO1xuICBjYXJyaWVyLl9fU0VOVFJZX18gPSBjYXJyaWVyLl9fU0VOVFJZX18gfHwge307XG4gIGNhcnJpZXIuX19TRU5UUllfXy5odWIgPSBodWI7XG4gIHJldHVybiB0cnVlO1xufVxuIiwgImltcG9ydCB7XG4gIEFnZ3JlZ2F0aW9uQ291bnRzLFxuICBSZXF1ZXN0U2Vzc2lvblN0YXR1cyxcbiAgU2Vzc2lvbkFnZ3JlZ2F0ZXMsXG4gIFNlc3Npb25GbHVzaGVyTGlrZSxcbiAgVHJhbnNwb3J0LFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGRyb3BVbmRlZmluZWRLZXlzLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJy4vaHViJztcblxudHlwZSBSZWxlYXNlSGVhbHRoQXR0cmlidXRlcyA9IHtcbiAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIHJlbGVhc2U6IHN0cmluZztcbn07XG5cbi8qKlxuICogQGluaGVyaXRkb2NcbiAqL1xuZXhwb3J0IGNsYXNzIFNlc3Npb25GbHVzaGVyIGltcGxlbWVudHMgU2Vzc2lvbkZsdXNoZXJMaWtlIHtcbiAgcHVibGljIHJlYWRvbmx5IGZsdXNoVGltZW91dDogbnVtYmVyID0gNjA7XG4gIHByaXZhdGUgX3BlbmRpbmdBZ2dyZWdhdGVzOiBSZWNvcmQ8bnVtYmVyLCBBZ2dyZWdhdGlvbkNvdW50cz4gPSB7fTtcbiAgcHJpdmF0ZSBfc2Vzc2lvbkF0dHJzOiBSZWxlYXNlSGVhbHRoQXR0cmlidXRlcztcbiAgcHJpdmF0ZSBfaW50ZXJ2YWxJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+O1xuICBwcml2YXRlIF9pc0VuYWJsZWQ6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF90cmFuc3BvcnQ6IFRyYW5zcG9ydDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IodHJhbnNwb3J0OiBUcmFuc3BvcnQsIGF0dHJzOiBSZWxlYXNlSGVhbHRoQXR0cmlidXRlcykge1xuICAgIHRoaXMuX3RyYW5zcG9ydCA9IHRyYW5zcG9ydDtcbiAgICAvLyBDYWxsIHRvIHNldEludGVydmFsLCBzbyB0aGF0IGZsdXNoIGlzIGNhbGxlZCBldmVyeSA2MCBzZWNvbmRzXG4gICAgdGhpcy5faW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuZmx1c2goKSwgdGhpcy5mbHVzaFRpbWVvdXQgKiAxMDAwKTtcbiAgICB0aGlzLl9zZXNzaW9uQXR0cnMgPSBhdHRycztcbiAgfVxuXG4gIC8qKiBTZW5kcyBzZXNzaW9uIGFnZ3JlZ2F0ZXMgdG8gVHJhbnNwb3J0ICovXG4gIHB1YmxpYyBzZW5kU2Vzc2lvbkFnZ3JlZ2F0ZXMoc2Vzc2lvbkFnZ3JlZ2F0ZXM6IFNlc3Npb25BZ2dyZWdhdGVzKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl90cmFuc3BvcnQuc2VuZFNlc3Npb24pIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiRHJvcHBpbmcgc2Vzc2lvbiBiZWNhdXNlIGN1c3RvbSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgc2VuZFNlc3Npb25cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZvaWQgdGhpcy5fdHJhbnNwb3J0LnNlbmRTZXNzaW9uKHNlc3Npb25BZ2dyZWdhdGVzKS50aGVuKG51bGwsIHJlYXNvbiA9PiB7XG4gICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIHdoaWxlIHNlbmRpbmcgc2Vzc2lvbjogJHtyZWFzb259YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2hlY2tzIGlmIGBwZW5kaW5nQWdncmVnYXRlc2AgaGFzIGVudHJpZXMsIGFuZCBpZiBpdCBkb2VzIGZsdXNoZXMgdGhlbSBieSBjYWxsaW5nIGBzZW5kU2Vzc2lvbnNgICovXG4gIHB1YmxpYyBmbHVzaCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXNzaW9uQWdncmVnYXRlcyA9IHRoaXMuZ2V0U2Vzc2lvbkFnZ3JlZ2F0ZXMoKTtcbiAgICBpZiAoc2Vzc2lvbkFnZ3JlZ2F0ZXMuYWdncmVnYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fcGVuZGluZ0FnZ3JlZ2F0ZXMgPSB7fTtcbiAgICB0aGlzLnNlbmRTZXNzaW9uQWdncmVnYXRlcyhzZXNzaW9uQWdncmVnYXRlcyk7XG4gIH1cblxuICAvKiogTWFzc2FnZXMgdGhlIGVudHJpZXMgaW4gYHBlbmRpbmdBZ2dyZWdhdGVzYCBhbmQgcmV0dXJucyBhZ2dyZWdhdGVkIHNlc3Npb25zICovXG4gIHB1YmxpYyBnZXRTZXNzaW9uQWdncmVnYXRlcygpOiBTZXNzaW9uQWdncmVnYXRlcyB7XG4gICAgY29uc3QgYWdncmVnYXRlczogQWdncmVnYXRpb25Db3VudHNbXSA9IE9iamVjdC5rZXlzKHRoaXMuX3BlbmRpbmdBZ2dyZWdhdGVzKS5tYXAoKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0FnZ3JlZ2F0ZXNbcGFyc2VJbnQoa2V5KV07XG4gICAgfSk7XG5cbiAgICBjb25zdCBzZXNzaW9uQWdncmVnYXRlczogU2Vzc2lvbkFnZ3JlZ2F0ZXMgPSB7XG4gICAgICBhdHRyczogdGhpcy5fc2Vzc2lvbkF0dHJzLFxuICAgICAgYWdncmVnYXRlcyxcbiAgICB9O1xuICAgIHJldHVybiBkcm9wVW5kZWZpbmVkS2V5cyhzZXNzaW9uQWdncmVnYXRlcyk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWxJZCk7XG4gICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5mbHVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIF9pbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnQgdGhhdCBjaGVja3MgaWYgdGhlIGluc3RhbmNlIG9mIFNlc3Npb25GbHVzaGVyIGlzIGVuYWJsZWQgdGhlblxuICAgKiBmZXRjaGVzIHRoZSBzZXNzaW9uIHN0YXR1cyBvZiB0aGUgcmVxdWVzdCBmcm9tIGBTY29wZS5nZXRSZXF1ZXN0U2Vzc2lvbigpLnN0YXR1c2Agb24gdGhlIHNjb3BlIGFuZCBwYXNzZXMgdGhlbSB0b1xuICAgKiBgX2luY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudGAgYWxvbmcgd2l0aCB0aGUgc3RhcnQgZGF0ZVxuICAgKi9cbiAgcHVibGljIGluY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzY29wZSA9IGdldEN1cnJlbnRIdWIoKS5nZXRTY29wZSgpO1xuICAgIGNvbnN0IHJlcXVlc3RTZXNzaW9uID0gc2NvcGU/LmdldFJlcXVlc3RTZXNzaW9uKCk7XG5cbiAgICBpZiAocmVxdWVzdFNlc3Npb24gJiYgcmVxdWVzdFNlc3Npb24uc3RhdHVzKSB7XG4gICAgICB0aGlzLl9pbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnQocmVxdWVzdFNlc3Npb24uc3RhdHVzLCBuZXcgRGF0ZSgpKTtcbiAgICAgIC8vIFRoaXMgaXMgbm90IGVudGlyZWx5IG5lY2Vzc2FyaWx5IGJ1dCBpcyBhZGRlZCBhcyBhIHNhZmUgZ3VhcmQgdG8gaW5kaWNhdGUgdGhlIGJvdW5kcyBvZiBhIHJlcXVlc3QgYW5kIHNvIGluXG4gICAgICAvLyBjYXNlIGNhcHR1cmVSZXF1ZXN0U2Vzc2lvbiBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgdG8gcHJldmVudCBkb3VibGUgY291bnRcbiAgICAgIHNjb3BlPy5zZXRSZXF1ZXN0U2Vzc2lvbih1bmRlZmluZWQpO1xuXG4gICAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcyAqL1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnRzIHN0YXR1cyBidWNrZXQgaW4gcGVuZGluZ0FnZ3JlZ2F0ZXMgYnVmZmVyIChpbnRlcm5hbCBzdGF0ZSkgY29ycmVzcG9uZGluZyB0byBzdGF0dXMgb2ZcbiAgICogdGhlIHNlc3Npb24gcmVjZWl2ZWRcbiAgICovXG4gIHByaXZhdGUgX2luY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudChzdGF0dXM6IFJlcXVlc3RTZXNzaW9uU3RhdHVzLCBkYXRlOiBEYXRlKTogbnVtYmVyIHtcbiAgICAvLyBUcnVuY2F0ZSBtaW51dGVzIGFuZCBzZWNvbmRzIG9uIFNlc3Npb24gU3RhcnRlZCBhdHRyaWJ1dGUgdG8gaGF2ZSBvbmUgbWludXRlIGJ1Y2tldCBrZXlzXG4gICAgY29uc3Qgc2Vzc2lvblN0YXJ0ZWRUcnVuYyA9IG5ldyBEYXRlKGRhdGUpLnNldFNlY29uZHMoMCwgMCk7XG4gICAgdGhpcy5fcGVuZGluZ0FnZ3JlZ2F0ZXNbc2Vzc2lvblN0YXJ0ZWRUcnVuY10gPSB0aGlzLl9wZW5kaW5nQWdncmVnYXRlc1tzZXNzaW9uU3RhcnRlZFRydW5jXSB8fCB7fTtcblxuICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFnZ3JlZ2F0ZWQgc2Vzc2lvbnMgaW4gb25lIHNwZWNpZmljIG1pbnV0ZSBidWNrZXRcbiAgICAvLyBmb3IgZXhhbXBsZSwge1wic3RhcnRlZFwiOlwiMjAyMS0wMy0xNlQwODowMDowMC4wMDBaXCIsXCJleGl0ZWRcIjo0LCBcImVycm9yZWRcIjogMX1cbiAgICBjb25zdCBhZ2dyZWdhdGlvbkNvdW50czogQWdncmVnYXRpb25Db3VudHMgPSB0aGlzLl9wZW5kaW5nQWdncmVnYXRlc1tzZXNzaW9uU3RhcnRlZFRydW5jXTtcbiAgICBpZiAoIWFnZ3JlZ2F0aW9uQ291bnRzLnN0YXJ0ZWQpIHtcbiAgICAgIGFnZ3JlZ2F0aW9uQ291bnRzLnN0YXJ0ZWQgPSBuZXcgRGF0ZShzZXNzaW9uU3RhcnRlZFRydW5jKS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc3RhdHVzKSB7XG4gICAgICBjYXNlIFJlcXVlc3RTZXNzaW9uU3RhdHVzLkVycm9yZWQ6XG4gICAgICAgIGFnZ3JlZ2F0aW9uQ291bnRzLmVycm9yZWQgPSAoYWdncmVnYXRpb25Db3VudHMuZXJyb3JlZCB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGlvbkNvdW50cy5lcnJvcmVkO1xuICAgICAgY2FzZSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5PazpcbiAgICAgICAgYWdncmVnYXRpb25Db3VudHMuZXhpdGVkID0gKGFnZ3JlZ2F0aW9uQ291bnRzLmV4aXRlZCB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGlvbkNvdW50cy5leGl0ZWQ7XG4gICAgICBjYXNlIFJlcXVlc3RTZXNzaW9uU3RhdHVzLkNyYXNoZWQ6XG4gICAgICAgIGFnZ3JlZ2F0aW9uQ291bnRzLmNyYXNoZWQgPSAoYWdncmVnYXRpb25Db3VudHMuY3Jhc2hlZCB8fCAwKSArIDE7XG4gICAgICAgIHJldHVybiBhZ2dyZWdhdGlvbkNvdW50cy5jcmFzaGVkO1xuICAgIH1cbiAgfVxufVxuIiwgImV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBTY29wZSB9IGZyb20gJy4vc2NvcGUnO1xuZXhwb3J0IHsgU2Vzc2lvbiB9IGZyb20gJy4vc2Vzc2lvbic7XG5leHBvcnQgeyBTZXNzaW9uRmx1c2hlciB9IGZyb20gJy4vc2Vzc2lvbmZsdXNoZXInO1xuZXhwb3J0IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gIGdldEFjdGl2ZURvbWFpbixcbiAgZ2V0Q3VycmVudEh1YixcbiAgZ2V0SHViRnJvbUNhcnJpZXIsXG4gIGdldE1haW5DYXJyaWVyLFxuICBIdWIsXG4gIG1ha2VNYWluLFxuICBzZXRIdWJPbkNhcnJpZXIsXG4gIENhcnJpZXIsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICBEb21haW5Bc0NhcnJpZXIsXG4gIExheWVyLFxufSBmcm9tICcuL2h1Yic7XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgSHViLCBTY29wZSB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7XG4gIEJyZWFkY3J1bWIsXG4gIENhcHR1cmVDb250ZXh0LFxuICBDdXN0b21TYW1wbGluZ0NvbnRleHQsXG4gIEV2ZW50LFxuICBFeHRyYSxcbiAgRXh0cmFzLFxuICBQcmltaXRpdmUsXG4gIFNldmVyaXR5LFxuICBUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Db250ZXh0LFxuICBVc2VyLFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuLyoqXG4gKiBUaGlzIGNhbGxzIGEgZnVuY3Rpb24gb24gdGhlIGN1cnJlbnQgaHViLlxuICogQHBhcmFtIG1ldGhvZCBmdW5jdGlvbiB0byBjYWxsIG9uIGh1Yi5cbiAqIEBwYXJhbSBhcmdzIHRvIHBhc3MgdG8gZnVuY3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5mdW5jdGlvbiBjYWxsT25IdWI8VD4obWV0aG9kOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gIGNvbnN0IGh1YiA9IGdldEN1cnJlbnRIdWIoKTtcbiAgaWYgKGh1YiAmJiBodWJbbWV0aG9kIGFzIGtleW9mIEh1Yl0pIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHJldHVybiAoaHViW21ldGhvZCBhcyBrZXlvZiBIdWJdIGFzIGFueSkoLi4uYXJncyk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBObyBodWIgZGVmaW5lZCBvciAke21ldGhvZH0gd2FzIG5vdCBmb3VuZCBvbiB0aGUgaHViLCBwbGVhc2Ugb3BlbiBhIGJ1ZyByZXBvcnQuYCk7XG59XG5cbi8qKlxuICogQ2FwdHVyZXMgYW4gZXhjZXB0aW9uIGV2ZW50IGFuZCBzZW5kcyBpdCB0byBTZW50cnkuXG4gKlxuICogQHBhcmFtIGV4Y2VwdGlvbiBBbiBleGNlcHRpb24tbGlrZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIGV2ZW50SWQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZUV4Y2VwdGlvbihleGNlcHRpb246IGFueSwgY2FwdHVyZUNvbnRleHQ/OiBDYXB0dXJlQ29udGV4dCk6IHN0cmluZyB7XG4gIGxldCBzeW50aGV0aWNFeGNlcHRpb246IEVycm9yO1xuICB0cnkge1xuICAgIHRocm93IG5ldyBFcnJvcignU2VudHJ5IHN5bnRoZXRpY0V4Y2VwdGlvbicpO1xuICB9IGNhdGNoIChleGNlcHRpb24pIHtcbiAgICBzeW50aGV0aWNFeGNlcHRpb24gPSBleGNlcHRpb24gYXMgRXJyb3I7XG4gIH1cbiAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV4Y2VwdGlvbicsIGV4Y2VwdGlvbiwge1xuICAgIGNhcHR1cmVDb250ZXh0LFxuICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBleGNlcHRpb24sXG4gICAgc3ludGhldGljRXhjZXB0aW9uLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDYXB0dXJlcyBhIG1lc3NhZ2UgZXZlbnQgYW5kIHNlbmRzIGl0IHRvIFNlbnRyeS5cbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZW5kIHRvIFNlbnRyeS5cbiAqIEBwYXJhbSBsZXZlbCBEZWZpbmUgdGhlIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICogQHJldHVybnMgVGhlIGdlbmVyYXRlZCBldmVudElkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBjYXB0dXJlQ29udGV4dD86IENhcHR1cmVDb250ZXh0IHwgU2V2ZXJpdHkpOiBzdHJpbmcge1xuICBsZXQgc3ludGhldGljRXhjZXB0aW9uOiBFcnJvcjtcbiAgdHJ5IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIHN5bnRoZXRpY0V4Y2VwdGlvbiA9IGV4Y2VwdGlvbiBhcyBFcnJvcjtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByb3ZpZGUgZXhwbGljaXQgc2NvcGVzIHVwZ3JhZGUsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yaWdpbmFsXG4gIC8vIGFyaXR5IG9mIHRoZSBgY2FwdHVyZU1lc3NhZ2UobWVzc2FnZSwgbGV2ZWwpYCBtZXRob2QuXG4gIGNvbnN0IGxldmVsID0gdHlwZW9mIGNhcHR1cmVDb250ZXh0ID09PSAnc3RyaW5nJyA/IGNhcHR1cmVDb250ZXh0IDogdW5kZWZpbmVkO1xuICBjb25zdCBjb250ZXh0ID0gdHlwZW9mIGNhcHR1cmVDb250ZXh0ICE9PSAnc3RyaW5nJyA/IHsgY2FwdHVyZUNvbnRleHQgfSA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gY2FsbE9uSHViKCdjYXB0dXJlTWVzc2FnZScsIG1lc3NhZ2UsIGxldmVsLCB7XG4gICAgb3JpZ2luYWxFeGNlcHRpb246IG1lc3NhZ2UsXG4gICAgc3ludGhldGljRXhjZXB0aW9uLFxuICAgIC4uLmNvbnRleHQsXG4gIH0pO1xufVxuXG4vKipcbiAqIENhcHR1cmVzIGEgbWFudWFsbHkgY3JlYXRlZCBldmVudCBhbmQgc2VuZHMgaXQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdG8gc2VuZCB0byBTZW50cnkuXG4gKiBAcmV0dXJucyBUaGUgZ2VuZXJhdGVkIGV2ZW50SWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYXB0dXJlRXZlbnQoZXZlbnQ6IEV2ZW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGNhbGxPbkh1YignY2FwdHVyZUV2ZW50JywgZXZlbnQpO1xufVxuXG4vKipcbiAqIENhbGxiYWNrIHRvIHNldCBjb250ZXh0IGluZm9ybWF0aW9uIG9udG8gdGhlIHNjb3BlLlxuICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgcmVjZWl2ZXMgU2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVTY29wZShjYWxsYmFjazogKHNjb3BlOiBTY29wZSkgPT4gdm9pZCk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ2NvbmZpZ3VyZVNjb3BlJywgY2FsbGJhY2spO1xufVxuXG4vKipcbiAqIFJlY29yZHMgYSBuZXcgYnJlYWRjcnVtYiB3aGljaCB3aWxsIGJlIGF0dGFjaGVkIHRvIGZ1dHVyZSBldmVudHMuXG4gKlxuICogQnJlYWRjcnVtYnMgd2lsbCBiZSBhZGRlZCB0byBzdWJzZXF1ZW50IGV2ZW50cyB0byBwcm92aWRlIG1vcmUgY29udGV4dCBvblxuICogdXNlcidzIGFjdGlvbnMgcHJpb3IgdG8gYW4gZXJyb3Igb3IgY3Jhc2guXG4gKlxuICogQHBhcmFtIGJyZWFkY3J1bWIgVGhlIGJyZWFkY3J1bWIgdG8gcmVjb3JkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkQnJlYWRjcnVtYihicmVhZGNydW1iOiBCcmVhZGNydW1iKTogdm9pZCB7XG4gIGNhbGxPbkh1Yjx2b2lkPignYWRkQnJlYWRjcnVtYicsIGJyZWFkY3J1bWIpO1xufVxuXG4vKipcbiAqIFNldHMgY29udGV4dCBkYXRhIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gKiBAcGFyYW0gbmFtZSBvZiB0aGUgY29udGV4dFxuICogQHBhcmFtIGNvbnRleHQgQW55IGtpbmQgb2YgZGF0YS4gVGhpcyBkYXRhIHdpbGwgYmUgbm9ybWFsaXplZC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250ZXh0KG5hbWU6IHN0cmluZywgY29udGV4dDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwpOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCdzZXRDb250ZXh0JywgbmFtZSwgY29udGV4dCk7XG59XG5cbi8qKlxuICogU2V0IGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHNlbnQgYXMgZXh0cmEgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqIEBwYXJhbSBleHRyYXMgRXh0cmFzIG9iamVjdCB0byBtZXJnZSBpbnRvIGN1cnJlbnQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEV4dHJhcyhleHRyYXM6IEV4dHJhcyk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldEV4dHJhcycsIGV4dHJhcyk7XG59XG5cbi8qKlxuICogU2V0IGFuIG9iamVjdCB0aGF0IHdpbGwgYmUgbWVyZ2VkIHNlbnQgYXMgdGFncyBkYXRhIHdpdGggdGhlIGV2ZW50LlxuICogQHBhcmFtIHRhZ3MgVGFncyBjb250ZXh0IG9iamVjdCB0byBtZXJnZSBpbnRvIGN1cnJlbnQgY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRhZ3ModGFnczogeyBba2V5OiBzdHJpbmddOiBQcmltaXRpdmUgfSk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldFRhZ3MnLCB0YWdzKTtcbn1cblxuLyoqXG4gKiBTZXQga2V5OnZhbHVlIHRoYXQgd2lsbCBiZSBzZW50IGFzIGV4dHJhIGRhdGEgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ga2V5IFN0cmluZyBvZiBleHRyYVxuICogQHBhcmFtIGV4dHJhIEFueSBraW5kIG9mIGRhdGEuIFRoaXMgZGF0YSB3aWxsIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFeHRyYShrZXk6IHN0cmluZywgZXh0cmE6IEV4dHJhKTogdm9pZCB7XG4gIGNhbGxPbkh1Yjx2b2lkPignc2V0RXh0cmEnLCBrZXksIGV4dHJhKTtcbn1cblxuLyoqXG4gKiBTZXQga2V5OnZhbHVlIHRoYXQgd2lsbCBiZSBzZW50IGFzIHRhZ3MgZGF0YSB3aXRoIHRoZSBldmVudC5cbiAqXG4gKiBDYW4gYWxzbyBiZSB1c2VkIHRvIHVuc2V0IGEgdGFnLCBieSBwYXNzaW5nIGB1bmRlZmluZWRgLlxuICpcbiAqIEBwYXJhbSBrZXkgU3RyaW5nIGtleSBvZiB0YWdcbiAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0YWdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRhZyhrZXk6IHN0cmluZywgdmFsdWU6IFByaW1pdGl2ZSk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldFRhZycsIGtleSwgdmFsdWUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdXNlciBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBmdXR1cmUgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB1c2VyIFVzZXIgY29udGV4dCBvYmplY3QgdG8gYmUgc2V0IGluIHRoZSBjdXJyZW50IGNvbnRleHQuIFBhc3MgYG51bGxgIHRvIHVuc2V0IHRoZSB1c2VyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VXNlcih1c2VyOiBVc2VyIHwgbnVsbCk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ3NldFVzZXInLCB1c2VyKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNjb3BlIHdpdGggYW5kIGV4ZWN1dGVzIHRoZSBnaXZlbiBvcGVyYXRpb24gd2l0aGluLlxuICogVGhlIHNjb3BlIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBvbmNlIHRoZSBvcGVyYXRpb25cbiAqIGZpbmlzaGVzIG9yIHRocm93cy5cbiAqXG4gKiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yOlxuICpcbiAqICAgICBwdXNoU2NvcGUoKTtcbiAqICAgICBjYWxsYmFjaygpO1xuICogICAgIHBvcFNjb3BlKCk7XG4gKlxuICogQHBhcmFtIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBlbmNsb3NlZCBpbnRvIHB1c2gvcG9wU2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2NvcGUoY2FsbGJhY2s6IChzY29wZTogU2NvcGUpID0+IHZvaWQpOiB2b2lkIHtcbiAgY2FsbE9uSHViPHZvaWQ+KCd3aXRoU2NvcGUnLCBjYWxsYmFjayk7XG59XG5cbi8qKlxuICogQ2FsbHMgYSBmdW5jdGlvbiBvbiB0aGUgbGF0ZXN0IGNsaWVudC4gVXNlIHRoaXMgd2l0aCBjYXV0aW9uLCBpdCdzIG1lYW50IGFzXG4gKiBpbiBcImludGVybmFsXCIgaGVscGVyIHNvIHdlIGRvbid0IG5lZWQgdG8gZXhwb3NlIGV2ZXJ5IHBvc3NpYmxlIGZ1bmN0aW9uIGluXG4gKiB0aGUgc2hpbS4gSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGUgY2xpZW50IGFjdHVhbGx5IGltcGxlbWVudHMgdGhlXG4gKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gbWV0aG9kIFRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgY2xpZW50L2NsaWVudC5cbiAqIEBwYXJhbSBhcmdzIEFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjbGllbnQvZm9udGVuZC5cbiAqIEBoaWRkZW5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBmdW5jdGlvbiBfY2FsbE9uQ2xpZW50KG1ldGhvZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICBjYWxsT25IdWI8dm9pZD4oJ19pbnZva2VDbGllbnQnLCBtZXRob2QsIC4uLmFyZ3MpO1xufVxuXG4vKipcbiAqIFN0YXJ0cyBhIG5ldyBgVHJhbnNhY3Rpb25gIGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byBtYW51YWwgdHJhY2luZyBpbnN0cnVtZW50YXRpb24uXG4gKlxuICogQSB0cmVlIHN0cnVjdHVyZSBjYW4gYmUgYnVpbHQgYnkgYWRkaW5nIGNoaWxkIHNwYW5zIHRvIHRoZSB0cmFuc2FjdGlvbiwgYW5kIGNoaWxkIHNwYW5zIHRvIG90aGVyIHNwYW5zLiBUbyBzdGFydCBhXG4gKiBuZXcgY2hpbGQgc3BhbiB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIG9yIGFueSBzcGFuLCBjYWxsIHRoZSByZXNwZWN0aXZlIGAuc3RhcnRDaGlsZCgpYCBtZXRob2QuXG4gKlxuICogRXZlcnkgY2hpbGQgc3BhbiBtdXN0IGJlIGZpbmlzaGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsIG90aGVyd2lzZSB0aGUgdW5maW5pc2hlZCBzcGFucyBhcmUgZGlzY2FyZGVkLlxuICpcbiAqIFRoZSB0cmFuc2FjdGlvbiBtdXN0IGJlIGZpbmlzaGVkIHdpdGggYSBjYWxsIHRvIGl0cyBgLmZpbmlzaCgpYCBtZXRob2QsIGF0IHdoaWNoIHBvaW50IHRoZSB0cmFuc2FjdGlvbiB3aXRoIGFsbCBpdHNcbiAqIGZpbmlzaGVkIGNoaWxkIHNwYW5zIHdpbGwgYmUgc2VudCB0byBTZW50cnkuXG4gKlxuICogQHBhcmFtIGNvbnRleHQgUHJvcGVydGllcyBvZiB0aGUgbmV3IGBUcmFuc2FjdGlvbmAuXG4gKiBAcGFyYW0gY3VzdG9tU2FtcGxpbmdDb250ZXh0IEluZm9ybWF0aW9uIGdpdmVuIHRvIHRoZSB0cmFuc2FjdGlvbiBzYW1wbGluZyBmdW5jdGlvbiAoYWxvbmcgd2l0aCBjb250ZXh0LWRlcGVuZGVudFxuICogZGVmYXVsdCB2YWx1ZXMpLiBTZWUge0BsaW5rIE9wdGlvbnMudHJhY2VzU2FtcGxlcn0uXG4gKlxuICogQHJldHVybnMgVGhlIHRyYW5zYWN0aW9uIHdoaWNoIHdhcyBqdXN0IHN0YXJ0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24oXG4gIGNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgY3VzdG9tU2FtcGxpbmdDb250ZXh0PzogQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuKTogVHJhbnNhY3Rpb24ge1xuICByZXR1cm4gY2FsbE9uSHViKCdzdGFydFRyYW5zYWN0aW9uJywgeyAuLi5jb250ZXh0IH0sIGN1c3RvbVNhbXBsaW5nQ29udGV4dCk7XG59XG4iLCAiaW1wb3J0IHsgRHNuTGlrZSwgU2RrTWV0YWRhdGEgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IERzbiwgdXJsRW5jb2RlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmNvbnN0IFNFTlRSWV9BUElfVkVSU0lPTiA9ICc3JztcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgdG8gcHJvdmlkZSB1cmxzLCBoZWFkZXJzIGFuZCBtZXRhZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGZvcm1cbiAqIGRpZmZlcmVudCB0eXBlcyBvZiByZXF1ZXN0cyB0byBTZW50cnkgZW5kcG9pbnRzLlxuICogU3VwcG9ydHMgYm90aCBlbnZlbG9wZXMgYW5kIHJlZ3VsYXIgZXZlbnQgcmVxdWVzdHMuXG4gKiovXG5leHBvcnQgY2xhc3MgQVBJIHtcbiAgLyoqIFRoZSBEU04gYXMgcGFzc2VkIHRvIFNlbnRyeS5pbml0KCkgKi9cbiAgcHVibGljIGRzbjogRHNuTGlrZTtcblxuICAvKiogTWV0YWRhdGEgYWJvdXQgdGhlIFNESyAobmFtZSwgdmVyc2lvbiwgZXRjKSBmb3IgaW5jbHVzaW9uIGluIGVudmVsb3BlIGhlYWRlcnMgKi9cbiAgcHVibGljIG1ldGFkYXRhOiBTZGtNZXRhZGF0YTtcblxuICAvKiogVGhlIGludGVybmFsbHkgdXNlZCBEc24gb2JqZWN0LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9kc25PYmplY3Q6IERzbjtcblxuICAvKiogVGhlIGVudmVsb3BlIHR1bm5lbCB0byB1c2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3R1bm5lbD86IHN0cmluZztcblxuICAvKiogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIEFQSSAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoZHNuOiBEc25MaWtlLCBtZXRhZGF0YTogU2RrTWV0YWRhdGEgPSB7fSwgdHVubmVsPzogc3RyaW5nKSB7XG4gICAgdGhpcy5kc24gPSBkc247XG4gICAgdGhpcy5fZHNuT2JqZWN0ID0gbmV3IERzbihkc24pO1xuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTtcbiAgICB0aGlzLl90dW5uZWwgPSB0dW5uZWw7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgRHNuIG9iamVjdC4gKi9cbiAgcHVibGljIGdldERzbigpOiBEc24ge1xuICAgIHJldHVybiB0aGlzLl9kc25PYmplY3Q7XG4gIH1cblxuICAvKiogRG9lcyB0aGlzIHRyYW5zcG9ydCBmb3JjZSBlbnZlbG9wZXM/ICovXG4gIHB1YmxpYyBmb3JjZUVudmVsb3BlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuX3R1bm5lbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBwcmVmaXggdG8gY29uc3RydWN0IFNlbnRyeSBpbmdlc3Rpb24gQVBJIGVuZHBvaW50cy4gKi9cbiAgcHVibGljIGdldEJhc2VBcGlFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgY29uc3QgcHJvdG9jb2wgPSBkc24ucHJvdG9jb2wgPyBgJHtkc24ucHJvdG9jb2x9OmAgOiAnJztcbiAgICBjb25zdCBwb3J0ID0gZHNuLnBvcnQgPyBgOiR7ZHNuLnBvcnR9YCA6ICcnO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH0vLyR7ZHNuLmhvc3R9JHtwb3J0fSR7ZHNuLnBhdGggPyBgLyR7ZHNuLnBhdGh9YCA6ICcnfS9hcGkvYDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzdG9yZSBlbmRwb2ludCBVUkwuICovXG4gIHB1YmxpYyBnZXRTdG9yZUVuZHBvaW50KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEluZ2VzdEVuZHBvaW50KCdzdG9yZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0b3JlIGVuZHBvaW50IFVSTCB3aXRoIGF1dGggaW4gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICpcbiAgICogU2VuZGluZyBhdXRoIGFzIHBhcnQgb2YgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgbm90IGFzIGN1c3RvbSBIVFRQIGhlYWRlcnMgYXZvaWRzIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgKi9cbiAgcHVibGljIGdldFN0b3JlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5nZXRTdG9yZUVuZHBvaW50KCl9PyR7dGhpcy5fZW5jb2RlZEF1dGgoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGVudmVsb3BlIGVuZHBvaW50IFVSTCB3aXRoIGF1dGggaW4gdGhlIHF1ZXJ5IHN0cmluZy5cbiAgICpcbiAgICogU2VuZGluZyBhdXRoIGFzIHBhcnQgb2YgdGhlIHF1ZXJ5IHN0cmluZyBhbmQgbm90IGFzIGN1c3RvbSBIVFRQIGhlYWRlcnMgYXZvaWRzIENPUlMgcHJlZmxpZ2h0IHJlcXVlc3RzLlxuICAgKi9cbiAgcHVibGljIGdldEVudmVsb3BlRW5kcG9pbnRXaXRoVXJsRW5jb2RlZEF1dGgoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5mb3JjZUVudmVsb3BlKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl90dW5uZWwgYXMgc3RyaW5nO1xuICAgIH1cblxuICAgIHJldHVybiBgJHt0aGlzLl9nZXRFbnZlbG9wZUVuZHBvaW50KCl9PyR7dGhpcy5fZW5jb2RlZEF1dGgoKX1gO1xuICB9XG5cbiAgLyoqIFJldHVybnMgb25seSB0aGUgcGF0aCBjb21wb25lbnQgZm9yIHRoZSBzdG9yZSBlbmRwb2ludC4gKi9cbiAgcHVibGljIGdldFN0b3JlRW5kcG9pbnRQYXRoKCk6IHN0cmluZyB7XG4gICAgY29uc3QgZHNuID0gdGhpcy5nZXREc24oKTtcbiAgICByZXR1cm4gYCR7ZHNuLnBhdGggPyBgLyR7ZHNuLnBhdGh9YCA6ICcnfS9hcGkvJHtkc24ucHJvamVjdElkfS9zdG9yZS9gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gcmVxdWVzdCBoZWFkZXJzLlxuICAgKiBUaGlzIGlzIG5lZWRlZCBmb3Igbm9kZSBhbmQgdGhlIG9sZCAvc3RvcmUgZW5kcG9pbnQgaW4gc2VudHJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0UmVxdWVzdEhlYWRlcnMoY2xpZW50TmFtZTogc3RyaW5nLCBjbGllbnRWZXJzaW9uOiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICAvLyBDSEFOR0UgVEhJUyB0byB1c2UgbWV0YWRhdGEgYnV0IGtlZXAgY2xpZW50TmFtZSBhbmQgY2xpZW50VmVyc2lvbiBjb21wYXRpYmxlXG4gICAgY29uc3QgZHNuID0gdGhpcy5nZXREc24oKTtcbiAgICBjb25zdCBoZWFkZXIgPSBbYFNlbnRyeSBzZW50cnlfdmVyc2lvbj0ke1NFTlRSWV9BUElfVkVSU0lPTn1gXTtcbiAgICBoZWFkZXIucHVzaChgc2VudHJ5X2NsaWVudD0ke2NsaWVudE5hbWV9LyR7Y2xpZW50VmVyc2lvbn1gKTtcbiAgICBoZWFkZXIucHVzaChgc2VudHJ5X2tleT0ke2Rzbi5wdWJsaWNLZXl9YCk7XG4gICAgaWYgKGRzbi5wYXNzKSB7XG4gICAgICBoZWFkZXIucHVzaChgc2VudHJ5X3NlY3JldD0ke2Rzbi5wYXNzfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICdYLVNlbnRyeS1BdXRoJzogaGVhZGVyLmpvaW4oJywgJyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSB1cmwgdG8gdGhlIHJlcG9ydCBkaWFsb2cgZW5kcG9pbnQuICovXG4gIHB1YmxpYyBnZXRSZXBvcnREaWFsb2dFbmRwb2ludChcbiAgICBkaWFsb2dPcHRpb25zOiB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgW2tleTogc3RyaW5nXTogYW55O1xuICAgICAgdXNlcj86IHsgbmFtZT86IHN0cmluZzsgZW1haWw/OiBzdHJpbmcgfTtcbiAgICB9ID0ge30sXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZHNuID0gdGhpcy5nZXREc24oKTtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAke3RoaXMuZ2V0QmFzZUFwaUVuZHBvaW50KCl9ZW1iZWQvZXJyb3ItcGFnZS9gO1xuXG4gICAgY29uc3QgZW5jb2RlZE9wdGlvbnMgPSBbXTtcbiAgICBlbmNvZGVkT3B0aW9ucy5wdXNoKGBkc249JHtkc24udG9TdHJpbmcoKX1gKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBkaWFsb2dPcHRpb25zKSB7XG4gICAgICBpZiAoa2V5ID09PSAnZHNuJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSA9PT0gJ3VzZXInKSB7XG4gICAgICAgIGlmICghZGlhbG9nT3B0aW9ucy51c2VyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpYWxvZ09wdGlvbnMudXNlci5uYW1lKSB7XG4gICAgICAgICAgZW5jb2RlZE9wdGlvbnMucHVzaChgbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChkaWFsb2dPcHRpb25zLnVzZXIubmFtZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpYWxvZ09wdGlvbnMudXNlci5lbWFpbCkge1xuICAgICAgICAgIGVuY29kZWRPcHRpb25zLnB1c2goYGVtYWlsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpYWxvZ09wdGlvbnMudXNlci5lbWFpbCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVuY29kZWRPcHRpb25zLnB1c2goYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGRpYWxvZ09wdGlvbnNba2V5XSBhcyBzdHJpbmcpfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RlZE9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gYCR7ZW5kcG9pbnR9PyR7ZW5jb2RlZE9wdGlvbnMuam9pbignJicpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuZHBvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGVudmVsb3BlIGVuZHBvaW50IFVSTC4gKi9cbiAgcHJpdmF0ZSBfZ2V0RW52ZWxvcGVFbmRwb2ludCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nZXRJbmdlc3RFbmRwb2ludCgnZW52ZWxvcGUnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBpbmdlc3QgQVBJIGVuZHBvaW50IGZvciB0YXJnZXQuICovXG4gIHByaXZhdGUgX2dldEluZ2VzdEVuZHBvaW50KHRhcmdldDogJ3N0b3JlJyB8ICdlbnZlbG9wZScpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl90dW5uZWwpIHtcbiAgICAgIHJldHVybiB0aGlzLl90dW5uZWw7XG4gICAgfVxuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmdldEJhc2VBcGlFbmRwb2ludCgpO1xuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgcmV0dXJuIGAke2Jhc2V9JHtkc24ucHJvamVjdElkfS8ke3RhcmdldH0vYDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgVVJMLWVuY29kZWQgc3RyaW5nIHdpdGggYXV0aCBjb25maWcgc3VpdGFibGUgZm9yIGEgcXVlcnkgc3RyaW5nLiAqL1xuICBwcml2YXRlIF9lbmNvZGVkQXV0aCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRzbiA9IHRoaXMuZ2V0RHNuKCk7XG4gICAgY29uc3QgYXV0aCA9IHtcbiAgICAgIC8vIFdlIHNlbmQgb25seSB0aGUgbWluaW11bSBzZXQgb2YgcmVxdWlyZWQgaW5mb3JtYXRpb24uIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2dldHNlbnRyeS9zZW50cnktamF2YXNjcmlwdC9pc3N1ZXMvMjU3Mi5cbiAgICAgIHNlbnRyeV9rZXk6IGRzbi5wdWJsaWNLZXksXG4gICAgICBzZW50cnlfdmVyc2lvbjogU0VOVFJZX0FQSV9WRVJTSU9OLFxuICAgIH07XG4gICAgcmV0dXJuIHVybEVuY29kZShhdXRoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgSW50ZWdyYXRpb24sIE9wdGlvbnMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgaW5zdGFsbGVkSW50ZWdyYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4vKiogTWFwIG9mIGludGVncmF0aW9ucyBhc3NpZ25lZCB0byBhIGNsaWVudCAqL1xuZXhwb3J0IHR5cGUgSW50ZWdyYXRpb25JbmRleCA9IHtcbiAgW2tleTogc3RyaW5nXTogSW50ZWdyYXRpb247XG59ICYgeyBpbml0aWFsaXplZD86IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBmaWx0ZXJEdXBsaWNhdGVzKGludGVncmF0aW9uczogSW50ZWdyYXRpb25bXSk6IEludGVncmF0aW9uW10ge1xuICByZXR1cm4gaW50ZWdyYXRpb25zLnJlZHVjZSgoYWNjLCBpbnRlZ3JhdGlvbnMpID0+IHtcbiAgICBpZiAoYWNjLmV2ZXJ5KGFjY0ludGVncmF0aW9uID0+IGludGVncmF0aW9ucy5uYW1lICE9PSBhY2NJbnRlZ3JhdGlvbi5uYW1lKSkge1xuICAgICAgYWNjLnB1c2goaW50ZWdyYXRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgW10gYXMgSW50ZWdyYXRpb25bXSk7XG59XG5cbi8qKiBHZXRzIGludGVncmF0aW9uIHRvIGluc3RhbGwgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlZ3JhdGlvbnNUb1NldHVwKG9wdGlvbnM6IE9wdGlvbnMpOiBJbnRlZ3JhdGlvbltdIHtcbiAgY29uc3QgZGVmYXVsdEludGVncmF0aW9ucyA9IChvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMgJiYgWy4uLm9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9uc10pIHx8IFtdO1xuICBjb25zdCB1c2VySW50ZWdyYXRpb25zID0gb3B0aW9ucy5pbnRlZ3JhdGlvbnM7XG5cbiAgbGV0IGludGVncmF0aW9uczogSW50ZWdyYXRpb25bXSA9IFsuLi5maWx0ZXJEdXBsaWNhdGVzKGRlZmF1bHRJbnRlZ3JhdGlvbnMpXTtcblxuICBpZiAoQXJyYXkuaXNBcnJheSh1c2VySW50ZWdyYXRpb25zKSkge1xuICAgIC8vIEZpbHRlciBvdXQgaW50ZWdyYXRpb25zIHRoYXQgYXJlIGFsc28gaW5jbHVkZWQgaW4gdXNlciBvcHRpb25zXG4gICAgaW50ZWdyYXRpb25zID0gW1xuICAgICAgLi4uaW50ZWdyYXRpb25zLmZpbHRlcihpbnRlZ3JhdGlvbnMgPT5cbiAgICAgICAgdXNlckludGVncmF0aW9ucy5ldmVyeSh1c2VySW50ZWdyYXRpb24gPT4gdXNlckludGVncmF0aW9uLm5hbWUgIT09IGludGVncmF0aW9ucy5uYW1lKSxcbiAgICAgICksXG4gICAgICAvLyBBbmQgZmlsdGVyIG91dCBkdXBsaWNhdGVkIHVzZXIgb3B0aW9ucyBpbnRlZ3JhdGlvbnNcbiAgICAgIC4uLmZpbHRlckR1cGxpY2F0ZXModXNlckludGVncmF0aW9ucyksXG4gICAgXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdXNlckludGVncmF0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGludGVncmF0aW9ucyA9IHVzZXJJbnRlZ3JhdGlvbnMoaW50ZWdyYXRpb25zKTtcbiAgICBpbnRlZ3JhdGlvbnMgPSBBcnJheS5pc0FycmF5KGludGVncmF0aW9ucykgPyBpbnRlZ3JhdGlvbnMgOiBbaW50ZWdyYXRpb25zXTtcbiAgfVxuXG4gIC8vIE1ha2Ugc3VyZSB0aGF0IGlmIHByZXNlbnQsIGBEZWJ1Z2AgaW50ZWdyYXRpb24gd2lsbCBhbHdheXMgcnVuIGxhc3RcbiAgY29uc3QgaW50ZWdyYXRpb25zTmFtZXMgPSBpbnRlZ3JhdGlvbnMubWFwKGkgPT4gaS5uYW1lKTtcbiAgY29uc3QgYWx3YXlzTGFzdFRvUnVuID0gJ0RlYnVnJztcbiAgaWYgKGludGVncmF0aW9uc05hbWVzLmluZGV4T2YoYWx3YXlzTGFzdFRvUnVuKSAhPT0gLTEpIHtcbiAgICBpbnRlZ3JhdGlvbnMucHVzaCguLi5pbnRlZ3JhdGlvbnMuc3BsaWNlKGludGVncmF0aW9uc05hbWVzLmluZGV4T2YoYWx3YXlzTGFzdFRvUnVuKSwgMSkpO1xuICB9XG5cbiAgcmV0dXJuIGludGVncmF0aW9ucztcbn1cblxuLyoqIFNldHVwIGdpdmVuIGludGVncmF0aW9uICovXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbjogSW50ZWdyYXRpb24pOiB2b2lkIHtcbiAgaWYgKGluc3RhbGxlZEludGVncmF0aW9ucy5pbmRleE9mKGludGVncmF0aW9uLm5hbWUpICE9PSAtMSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpbnRlZ3JhdGlvbi5zZXR1cE9uY2UoYWRkR2xvYmFsRXZlbnRQcm9jZXNzb3IsIGdldEN1cnJlbnRIdWIpO1xuICBpbnN0YWxsZWRJbnRlZ3JhdGlvbnMucHVzaChpbnRlZ3JhdGlvbi5uYW1lKTtcbiAgbG9nZ2VyLmxvZyhgSW50ZWdyYXRpb24gaW5zdGFsbGVkOiAke2ludGVncmF0aW9uLm5hbWV9YCk7XG59XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGludGVncmF0aW9uIGluc3RhbmNlcyB0aGlzIGluc3RhbGxzIHRoZW0gYWxsLiBXaGVuIGB3aXRoRGVmYXVsdHNgIGlzIHNldCB0byBgdHJ1ZWAgdGhlbiBhbGwgZGVmYXVsdFxuICogaW50ZWdyYXRpb25zIGFyZSBhZGRlZCB1bmxlc3MgdGhleSB3ZXJlIGFscmVhZHkgcHJvdmlkZWQgYmVmb3JlLlxuICogQHBhcmFtIGludGVncmF0aW9ucyBhcnJheSBvZiBpbnRlZ3JhdGlvbiBpbnN0YW5jZXNcbiAqIEBwYXJhbSB3aXRoRGVmYXVsdCBzaG91bGQgZW5hYmxlIGRlZmF1bHQgaW50ZWdyYXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEludGVncmF0aW9uczxPIGV4dGVuZHMgT3B0aW9ucz4ob3B0aW9uczogTyk6IEludGVncmF0aW9uSW5kZXgge1xuICBjb25zdCBpbnRlZ3JhdGlvbnM6IEludGVncmF0aW9uSW5kZXggPSB7fTtcbiAgZ2V0SW50ZWdyYXRpb25zVG9TZXR1cChvcHRpb25zKS5mb3JFYWNoKGludGVncmF0aW9uID0+IHtcbiAgICBpbnRlZ3JhdGlvbnNbaW50ZWdyYXRpb24ubmFtZV0gPSBpbnRlZ3JhdGlvbjtcbiAgICBzZXR1cEludGVncmF0aW9uKGludGVncmF0aW9uKTtcbiAgfSk7XG4gIC8vIHNldCB0aGUgYGluaXRpYWxpemVkYCBmbGFnIHNvIHdlIGRvbid0IHJ1biB0aHJvdWdoIHRoZSBwcm9jZXNzIGFnYWluIHVuZWNlc3NhcmlseTsgdXNlIGBPYmplY3QuZGVmaW5lUHJvcGVydHlgXG4gIC8vIGJlY2F1c2UgYnkgZGVmYXVsdCBpdCBjcmVhdGVzIGEgcHJvcGVydHkgd2hpY2ggaXMgbm9uZW51bWVyYWJsZSwgd2hpY2ggd2Ugd2FudCBzaW5jZSBgaW5pdGlhbGl6ZWRgIHNob3VsZG4ndCBiZVxuICAvLyBjb25zaWRlcmVkIGEgbWVtYmVyIG9mIHRoZSBpbmRleCB0aGUgd2F5IHRoZSBhY3R1YWwgaW50ZWdyYXRpb25zIGFyZVxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoaW50ZWdyYXRpb25zLCAnaW5pdGlhbGl6ZWQnLCB7IHZhbHVlOiB0cnVlIH0pO1xuICByZXR1cm4gaW50ZWdyYXRpb25zO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuaW1wb3J0IHsgU2NvcGUsIFNlc3Npb24gfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQge1xuICBDbGllbnQsXG4gIEV2ZW50LFxuICBFdmVudEhpbnQsXG4gIEludGVncmF0aW9uLFxuICBJbnRlZ3JhdGlvbkNsYXNzLFxuICBPcHRpb25zLFxuICBPdXRjb21lLFxuICBTZXNzaW9uU3RhdHVzLFxuICBTZXZlcml0eSxcbiAgVHJhbnNwb3J0LFxufSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7XG4gIGNoZWNrT3JTZXRBbHJlYWR5Q2F1Z2h0LFxuICBkYXRlVGltZXN0YW1wSW5TZWNvbmRzLFxuICBEc24sXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzUHJpbWl0aXZlLFxuICBpc1RoZW5hYmxlLFxuICBsb2dnZXIsXG4gIG5vcm1hbGl6ZSxcbiAgU2VudHJ5RXJyb3IsXG4gIFN5bmNQcm9taXNlLFxuICB0cnVuY2F0ZSxcbiAgdXVpZDQsXG59IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBCYWNrZW5kLCBCYWNrZW5kQ2xhc3MgfSBmcm9tICcuL2Jhc2ViYWNrZW5kJztcbmltcG9ydCB7IEludGVncmF0aW9uSW5kZXgsIHNldHVwSW50ZWdyYXRpb25zIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbic7XG5cbmNvbnN0IEFMUkVBRFlfU0VFTl9FUlJPUiA9IFwiTm90IGNhcHR1cmluZyBleGNlcHRpb24gYmVjYXVzZSBpdCdzIGFscmVhZHkgYmVlbiBjYXB0dXJlZC5cIjtcblxuLyoqXG4gKiBCYXNlIGltcGxlbWVudGF0aW9uIGZvciBhbGwgSmF2YVNjcmlwdCBTREsgY2xpZW50cy5cbiAqXG4gKiBDYWxsIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGJhY2tlbmQgY29uc3RydWN0b3IgYW5kIG9wdGlvbnNcbiAqIHNwZWNpZmljIHRvIHRoZSBjbGllbnQgc3ViY2xhc3MuIFRvIGFjY2VzcyB0aGVzZSBvcHRpb25zIGxhdGVyLCB1c2VcbiAqIHtAbGluayBDbGllbnQuZ2V0T3B0aW9uc30uIEFsc28sIHRoZSBCYWNrZW5kIGluc3RhbmNlIGlzIGF2YWlsYWJsZSB2aWFcbiAqIHtAbGluayBDbGllbnQuZ2V0QmFja2VuZH0uXG4gKlxuICogSWYgYSBEc24gaXMgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zLCBpdCB3aWxsIGJlIHBhcnNlZCBhbmQgc3RvcmVkLiBVc2VcbiAqIHtAbGluayBDbGllbnQuZ2V0RHNufSB0byByZXRyaWV2ZSB0aGUgRHNuIGF0IGFueSBtb21lbnQuIEluIGNhc2UgdGhlIERzbiBpc1xuICogaW52YWxpZCwgdGhlIGNvbnN0cnVjdG9yIHdpbGwgdGhyb3cgYSB7QGxpbmsgU2VudHJ5RXhjZXB0aW9ufS4gTm90ZSB0aGF0XG4gKiB3aXRob3V0IGEgdmFsaWQgRHNuLCB0aGUgU0RLIHdpbGwgbm90IHNlbmQgYW55IGV2ZW50cyB0byBTZW50cnkuXG4gKlxuICogQmVmb3JlIHNlbmRpbmcgYW4gZXZlbnQgdmlhIHRoZSBiYWNrZW5kLCBpdCBpcyBwYXNzZWQgdGhyb3VnaFxuICoge0BsaW5rIEJhc2VDbGllbnQuX3ByZXBhcmVFdmVudH0gdG8gYWRkIFNESyBpbmZvcm1hdGlvbiBhbmQgc2NvcGUgZGF0YVxuICogKGJyZWFkY3J1bWJzIGFuZCBjb250ZXh0KS4gVG8gYWRkIG1vcmUgY3VzdG9tIGluZm9ybWF0aW9uLCBvdmVycmlkZSB0aGlzXG4gKiBtZXRob2QgYW5kIGV4dGVuZCB0aGUgcmVzdWx0aW5nIHByZXBhcmVkIGV2ZW50LlxuICpcbiAqIFRvIGlzc3VlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBldmVudHMgKGUuZy4gdmlhIGluc3RydW1lbnRhdGlvbiksIHVzZVxuICoge0BsaW5rIENsaWVudC5jYXB0dXJlRXZlbnR9LiBJdCB3aWxsIHByZXBhcmUgdGhlIGV2ZW50IGFuZCBwYXNzIGl0IHRocm91Z2hcbiAqIHRoZSBjYWxsYmFjayBsaWZlY3ljbGUuIFRvIGlzc3VlIGF1dG8tYnJlYWRjcnVtYnMsIHVzZVxuICoge0BsaW5rIENsaWVudC5hZGRCcmVhZGNydW1ifS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY2xhc3MgTm9kZUNsaWVudCBleHRlbmRzIEJhc2VDbGllbnQ8Tm9kZUJhY2tlbmQsIE5vZGVPcHRpb25zPiB7XG4gKiAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBOb2RlT3B0aW9ucykge1xuICogICAgIHN1cGVyKE5vZGVCYWNrZW5kLCBvcHRpb25zKTtcbiAqICAgfVxuICpcbiAqICAgLy8gLi4uXG4gKiB9XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ2xpZW50PEIgZXh0ZW5kcyBCYWNrZW5kLCBPIGV4dGVuZHMgT3B0aW9ucz4gaW1wbGVtZW50cyBDbGllbnQ8Tz4ge1xuICAvKipcbiAgICogVGhlIGJhY2tlbmQgdXNlZCB0byBwaHlzaWNhbGx5IGludGVyYWN0IGluIHRoZSBlbnZpcm9ubWVudC4gVXN1YWxseSwgdGhpc1xuICAgKiB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGNsaWVudC4gV2hlbiBjb21wb3NpbmcgU0RLcywgaG93ZXZlciwgdGhlIEJhY2tlbmRcbiAgICogZnJvbSB0aGUgcm9vdCBTREsgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9iYWNrZW5kOiBCO1xuXG4gIC8qKiBPcHRpb25zIHBhc3NlZCB0byB0aGUgU0RLLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX29wdGlvbnM6IE87XG5cbiAgLyoqIFRoZSBjbGllbnQgRHNuLCBpZiBzcGVjaWZpZWQgaW4gb3B0aW9ucy4gV2l0aG91dCB0aGlzIERzbiwgdGhlIFNESyB3aWxsIGJlIGRpc2FibGVkLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2Rzbj86IERzbjtcblxuICAvKiogQXJyYXkgb2YgdXNlZCBpbnRlZ3JhdGlvbnMuICovXG4gIHByb3RlY3RlZCBfaW50ZWdyYXRpb25zOiBJbnRlZ3JhdGlvbkluZGV4ID0ge307XG5cbiAgLyoqIE51bWJlciBvZiBjYWxscyBiZWluZyBwcm9jZXNzZWQgKi9cbiAgcHJvdGVjdGVkIF9udW1Qcm9jZXNzaW5nOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGlzIGNsaWVudCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGJhY2tlbmRDbGFzcyBBIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYmFja2VuZC5cbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyBmb3IgdGhlIGNsaWVudC5cbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiYWNrZW5kQ2xhc3M6IEJhY2tlbmRDbGFzczxCLCBPPiwgb3B0aW9uczogTykge1xuICAgIHRoaXMuX2JhY2tlbmQgPSBuZXcgYmFja2VuZENsYXNzKG9wdGlvbnMpO1xuICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgaWYgKG9wdGlvbnMuZHNuKSB7XG4gICAgICB0aGlzLl9kc24gPSBuZXcgRHNuKG9wdGlvbnMuZHNuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gIHB1YmxpYyBjYXB0dXJlRXhjZXB0aW9uKGV4Y2VwdGlvbjogYW55LCBoaW50PzogRXZlbnRIaW50LCBzY29wZT86IFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBlbnN1cmUgd2UgaGF2ZW4ndCBjYXB0dXJlZCB0aGlzIHZlcnkgb2JqZWN0IGJlZm9yZVxuICAgIGlmIChjaGVja09yU2V0QWxyZWFkeUNhdWdodChleGNlcHRpb24pKSB7XG4gICAgICBsb2dnZXIubG9nKEFMUkVBRFlfU0VFTl9FUlJPUik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGV2ZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcblxuICAgIHRoaXMuX3Byb2Nlc3MoXG4gICAgICB0aGlzLl9nZXRCYWNrZW5kKClcbiAgICAgICAgLmV2ZW50RnJvbUV4Y2VwdGlvbihleGNlcHRpb24sIGhpbnQpXG4gICAgICAgIC50aGVuKGV2ZW50ID0+IHRoaXMuX2NhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpKVxuICAgICAgICAudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgIGV2ZW50SWQgPSByZXN1bHQ7XG4gICAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNhcHR1cmVNZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgbGV2ZWw/OiBTZXZlcml0eSwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGV2ZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGhpbnQgJiYgaGludC5ldmVudF9pZDtcblxuICAgIGNvbnN0IHByb21pc2VkRXZlbnQgPSBpc1ByaW1pdGl2ZShtZXNzYWdlKVxuICAgICAgPyB0aGlzLl9nZXRCYWNrZW5kKCkuZXZlbnRGcm9tTWVzc2FnZShTdHJpbmcobWVzc2FnZSksIGxldmVsLCBoaW50KVxuICAgICAgOiB0aGlzLl9nZXRCYWNrZW5kKCkuZXZlbnRGcm9tRXhjZXB0aW9uKG1lc3NhZ2UsIGhpbnQpO1xuXG4gICAgdGhpcy5fcHJvY2VzcyhcbiAgICAgIHByb21pc2VkRXZlbnRcbiAgICAgICAgLnRoZW4oZXZlbnQgPT4gdGhpcy5fY2FwdHVyZUV2ZW50KGV2ZW50LCBoaW50LCBzY29wZSkpXG4gICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgZXZlbnRJZCA9IHJlc3VsdDtcbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIHJldHVybiBldmVudElkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2FwdHVyZUV2ZW50KGV2ZW50OiBFdmVudCwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gZW5zdXJlIHdlIGhhdmVuJ3QgY2FwdHVyZWQgdGhpcyB2ZXJ5IG9iamVjdCBiZWZvcmVcbiAgICBpZiAoaGludD8ub3JpZ2luYWxFeGNlcHRpb24gJiYgY2hlY2tPclNldEFscmVhZHlDYXVnaHQoaGludC5vcmlnaW5hbEV4Y2VwdGlvbikpIHtcbiAgICAgIGxvZ2dlci5sb2coQUxSRUFEWV9TRUVOX0VSUk9SKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZXZlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gaGludCAmJiBoaW50LmV2ZW50X2lkO1xuXG4gICAgdGhpcy5fcHJvY2VzcyhcbiAgICAgIHRoaXMuX2NhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpLnRoZW4ocmVzdWx0ID0+IHtcbiAgICAgICAgZXZlbnRJZCA9IHJlc3VsdDtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICByZXR1cm4gZXZlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNhcHR1cmVTZXNzaW9uKHNlc3Npb246IFNlc3Npb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2lzRW5hYmxlZCgpKSB7XG4gICAgICBsb2dnZXIud2FybignU0RLIG5vdCBlbmFibGVkLCB3aWxsIG5vdCBjYXB0dXJlIHNlc3Npb24uJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEodHlwZW9mIHNlc3Npb24ucmVsZWFzZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICBsb2dnZXIud2FybignRGlzY2FyZGVkIHNlc3Npb24gYmVjYXVzZSBvZiBtaXNzaW5nIG9yIG5vbi1zdHJpbmcgcmVsZWFzZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZW5kU2Vzc2lvbihzZXNzaW9uKTtcbiAgICAgIC8vIEFmdGVyIHNlbmRpbmcsIHdlIHNldCBpbml0IGZhbHNlIHRvIGluZGljYXRlIGl0J3Mgbm90IHRoZSBmaXJzdCBvY2N1cnJlbmNlXG4gICAgICBzZXNzaW9uLnVwZGF0ZSh7IGluaXQ6IGZhbHNlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldERzbigpOiBEc24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kc247XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBnZXRPcHRpb25zKCk6IE8ge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhbnNwb3J0KCk6IFRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEJhY2tlbmQoKS5nZXRUcmFuc3BvcnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGZsdXNoKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQ2xpZW50RG9uZVByb2Nlc3NpbmcodGltZW91dCkudGhlbihjbGllbnRGaW5pc2hlZCA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRUcmFuc3BvcnQoKVxuICAgICAgICAuY2xvc2UodGltZW91dClcbiAgICAgICAgLnRoZW4odHJhbnNwb3J0Rmx1c2hlZCA9PiBjbGllbnRGaW5pc2hlZCAmJiB0cmFuc3BvcnRGbHVzaGVkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNsb3NlKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuZmx1c2godGltZW91dCkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgdGhpcy5nZXRPcHRpb25zKCkuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSBpbnRlZ3JhdGlvbnNcbiAgICovXG4gIHB1YmxpYyBzZXR1cEludGVncmF0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNFbmFibGVkKCkgJiYgIXRoaXMuX2ludGVncmF0aW9ucy5pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5faW50ZWdyYXRpb25zID0gc2V0dXBJbnRlZ3JhdGlvbnModGhpcy5fb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0SW50ZWdyYXRpb248VCBleHRlbmRzIEludGVncmF0aW9uPihpbnRlZ3JhdGlvbjogSW50ZWdyYXRpb25DbGFzczxUPik6IFQgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICh0aGlzLl9pbnRlZ3JhdGlvbnNbaW50ZWdyYXRpb24uaWRdIGFzIFQpIHx8IG51bGw7XG4gICAgfSBjYXRjaCAoX29PKSB7XG4gICAgICBsb2dnZXIud2FybihgQ2Fubm90IHJldHJpZXZlIGludGVncmF0aW9uICR7aW50ZWdyYXRpb24uaWR9IGZyb20gdGhlIGN1cnJlbnQgQ2xpZW50YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogVXBkYXRlcyBleGlzdGluZyBzZXNzaW9uIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBldmVudCAqL1xuICBwcm90ZWN0ZWQgX3VwZGF0ZVNlc3Npb25Gcm9tRXZlbnQoc2Vzc2lvbjogU2Vzc2lvbiwgZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgbGV0IGNyYXNoZWQgPSBmYWxzZTtcbiAgICBsZXQgZXJyb3JlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGV4Y2VwdGlvbnMgPSBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcztcblxuICAgIGlmIChleGNlcHRpb25zKSB7XG4gICAgICBlcnJvcmVkID0gdHJ1ZTtcblxuICAgICAgZm9yIChjb25zdCBleCBvZiBleGNlcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IG1lY2hhbmlzbSA9IGV4Lm1lY2hhbmlzbTtcbiAgICAgICAgaWYgKG1lY2hhbmlzbSAmJiBtZWNoYW5pc20uaGFuZGxlZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBjcmFzaGVkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEEgc2Vzc2lvbiBpcyB1cGRhdGVkIGFuZCB0aGF0IHNlc3Npb24gdXBkYXRlIGlzIHNlbnQgaW4gb25seSBvbmUgb2YgdGhlIHR3byBmb2xsb3dpbmcgc2NlbmFyaW9zOlxuICAgIC8vIDEuIFNlc3Npb24gd2l0aCBub24gdGVybWluYWwgc3RhdHVzIGFuZCAwIGVycm9ycyArIGFuIGVycm9yIG9jY3VycmVkIC0+IFdpbGwgc2V0IGVycm9yIGNvdW50IHRvIDEgYW5kIHNlbmQgdXBkYXRlXG4gICAgLy8gMi4gU2Vzc2lvbiB3aXRoIG5vbiB0ZXJtaW5hbCBzdGF0dXMgYW5kIDEgZXJyb3IgKyBhIGNyYXNoIG9jY3VycmVkIC0+IFdpbGwgc2V0IHN0YXR1cyBjcmFzaGVkIGFuZCBzZW5kIHVwZGF0ZVxuICAgIGNvbnN0IHNlc3Npb25Ob25UZXJtaW5hbCA9IHNlc3Npb24uc3RhdHVzID09PSBTZXNzaW9uU3RhdHVzLk9rO1xuICAgIGNvbnN0IHNob3VsZFVwZGF0ZUFuZFNlbmQgPSAoc2Vzc2lvbk5vblRlcm1pbmFsICYmIHNlc3Npb24uZXJyb3JzID09PSAwKSB8fCAoc2Vzc2lvbk5vblRlcm1pbmFsICYmIGNyYXNoZWQpO1xuXG4gICAgaWYgKHNob3VsZFVwZGF0ZUFuZFNlbmQpIHtcbiAgICAgIHNlc3Npb24udXBkYXRlKHtcbiAgICAgICAgLi4uKGNyYXNoZWQgJiYgeyBzdGF0dXM6IFNlc3Npb25TdGF0dXMuQ3Jhc2hlZCB9KSxcbiAgICAgICAgZXJyb3JzOiBzZXNzaW9uLmVycm9ycyB8fCBOdW1iZXIoZXJyb3JlZCB8fCBjcmFzaGVkKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jYXB0dXJlU2Vzc2lvbihzZXNzaW9uKTtcbiAgICB9XG4gIH1cblxuICAvKiogRGVsaXZlciBjYXB0dXJlZCBzZXNzaW9uIHRvIFNlbnRyeSAqL1xuICBwcm90ZWN0ZWQgX3NlbmRTZXNzaW9uKHNlc3Npb246IFNlc3Npb24pOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRCYWNrZW5kKCkuc2VuZFNlc3Npb24oc2Vzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIHRoZSBjbGllbnQgaXMgZmluaXNoZWQgcHJvY2Vzc2luZy4gUmV0dXJucyBhIHByb21pc2UgYmVjYXVzZSBpdCB3aWxsIHdhaXQgYHRpbWVvdXRgIG1zIGJlZm9yZSBzYXlpbmdcbiAgICogXCJub1wiIChyZXNvbHZpbmcgdG8gYGZhbHNlYCkgaW4gb3JkZXIgdG8gZ2l2ZSB0aGUgY2xpZW50IGEgY2hhbmNlIHRvIHBvdGVudGlhbGx5IGZpbmlzaCBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIHRpbWUsIGluIG1zLCBhZnRlciB3aGljaCB0byByZXNvbHZlIHRvIGBmYWxzZWAgaWYgdGhlIGNsaWVudCBpcyBzdGlsbCBidXN5LiBQYXNzaW5nIGAwYCAob3Igbm90XG4gICAqIHBhc3NpbmcgYW55dGhpbmcpIHdpbGwgbWFrZSB0aGUgcHJvbWlzZSB3YWl0IGFzIGxvbmcgYXMgaXQgdGFrZXMgZm9yIHByb2Nlc3NpbmcgdG8gZmluaXNoIGJlZm9yZSByZXNvbHZpbmcgdG9cbiAgICogYHRydWVgLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHRvIGB0cnVlYCBpZiBwcm9jZXNzaW5nIGlzIGFscmVhZHkgZG9uZSBvciBmaW5pc2hlcyBiZWZvcmUgdGhlIHRpbWVvdXQsIGFuZFxuICAgKiBgZmFsc2VgIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIF9pc0NsaWVudERvbmVQcm9jZXNzaW5nKHRpbWVvdXQ/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxldCB0aWNrZWQ6IG51bWJlciA9IDA7XG4gICAgICBjb25zdCB0aWNrOiBudW1iZXIgPSAxO1xuXG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX251bVByb2Nlc3NpbmcgPT0gMCkge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGlja2VkICs9IHRpY2s7XG4gICAgICAgICAgaWYgKHRpbWVvdXQgJiYgdGlja2VkID49IHRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCB0aWNrKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjdXJyZW50IGJhY2tlbmQuICovXG4gIHByb3RlY3RlZCBfZ2V0QmFja2VuZCgpOiBCIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja2VuZDtcbiAgfVxuXG4gIC8qKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyBTREsgaXMgZW5hYmxlZCBhbmQgYSB2YWxpZCBEc24gaXMgcHJlc2VudC4gKi9cbiAgcHJvdGVjdGVkIF9pc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9ucygpLmVuYWJsZWQgIT09IGZhbHNlICYmIHRoaXMuX2RzbiAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29tbW9uIGluZm9ybWF0aW9uIHRvIGV2ZW50cy5cbiAgICpcbiAgICogVGhlIGluZm9ybWF0aW9uIGluY2x1ZGVzIHJlbGVhc2UgYW5kIGVudmlyb25tZW50IGZyb20gYG9wdGlvbnNgLFxuICAgKiBicmVhZGNydW1icyBhbmQgY29udGV4dCAoZXh0cmEsIHRhZ3MgYW5kIHVzZXIpIGZyb20gdGhlIHNjb3BlLlxuICAgKlxuICAgKiBJbmZvcm1hdGlvbiB0aGF0IGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgZXZlbnQgaXMgbmV2ZXIgb3ZlcndyaXR0ZW4uIEZvclxuICAgKiBuZXN0ZWQgb2JqZWN0cywgc3VjaCBhcyB0aGUgY29udGV4dCwga2V5cyBhcmUgbWVyZ2VkLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIG9yaWdpbmFsIGV2ZW50LlxuICAgKiBAcGFyYW0gaGludCBNYXkgY29udGFpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBleGNlcHRpb24uXG4gICAqIEBwYXJhbSBzY29wZSBBIHNjb3BlIGNvbnRhaW5pbmcgZXZlbnQgbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIEEgbmV3IGV2ZW50IHdpdGggbW9yZSBpbmZvcm1hdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBfcHJlcGFyZUV2ZW50KGV2ZW50OiBFdmVudCwgc2NvcGU/OiBTY29wZSwgaGludD86IEV2ZW50SGludCk6IFByb21pc2VMaWtlPEV2ZW50IHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgbm9ybWFsaXplRGVwdGggPSAzIH0gPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICBjb25zdCBwcmVwYXJlZDogRXZlbnQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGV2ZW50X2lkOiBldmVudC5ldmVudF9pZCB8fCAoaGludCAmJiBoaW50LmV2ZW50X2lkID8gaGludC5ldmVudF9pZCA6IHV1aWQ0KCkpLFxuICAgICAgdGltZXN0YW1wOiBldmVudC50aW1lc3RhbXAgfHwgZGF0ZVRpbWVzdGFtcEluU2Vjb25kcygpLFxuICAgIH07XG5cbiAgICB0aGlzLl9hcHBseUNsaWVudE9wdGlvbnMocHJlcGFyZWQpO1xuICAgIHRoaXMuX2FwcGx5SW50ZWdyYXRpb25zTWV0YWRhdGEocHJlcGFyZWQpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBzY29wZSBnaXZlbiB0byB1cywgdXNlIGl0IGFzIHRoZSBiYXNlIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMuXG4gICAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSBjb3B5aW5nIG9mIGRhdGEgaWYgYGNhcHR1cmVDb250ZXh0YCBpcyBub3QgcHJvdmlkZWQuXG4gICAgbGV0IGZpbmFsU2NvcGUgPSBzY29wZTtcbiAgICBpZiAoaGludCAmJiBoaW50LmNhcHR1cmVDb250ZXh0KSB7XG4gICAgICBmaW5hbFNjb3BlID0gU2NvcGUuY2xvbmUoZmluYWxTY29wZSkudXBkYXRlKGhpbnQuY2FwdHVyZUNvbnRleHQpO1xuICAgIH1cblxuICAgIC8vIFdlIHByZXBhcmUgdGhlIHJlc3VsdCBoZXJlIHdpdGggYSByZXNvbHZlZCBFdmVudC5cbiAgICBsZXQgcmVzdWx0ID0gU3luY1Byb21pc2UucmVzb2x2ZTxFdmVudCB8IG51bGw+KHByZXBhcmVkKTtcblxuICAgIC8vIFRoaXMgc2hvdWxkIGJlIHRoZSBsYXN0IHRoaW5nIGNhbGxlZCwgc2luY2Ugd2Ugd2FudCB0aGF0XG4gICAgLy8ge0BsaW5rIEh1Yi5hZGRFdmVudFByb2Nlc3Nvcn0gZ2V0cyB0aGUgZmluaXNoZWQgcHJlcGFyZWQgZXZlbnQuXG4gICAgaWYgKGZpbmFsU2NvcGUpIHtcbiAgICAgIC8vIEluIGNhc2Ugd2UgaGF2ZSBhIGh1YiB3ZSByZWFzc2lnbiBpdC5cbiAgICAgIHJlc3VsdCA9IGZpbmFsU2NvcGUuYXBwbHlUb0V2ZW50KHByZXBhcmVkLCBoaW50KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LnRoZW4oZXZ0ID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplRGVwdGggPT09ICdudW1iZXInICYmIG5vcm1hbGl6ZURlcHRoID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9ybWFsaXplRXZlbnQoZXZ0LCBub3JtYWxpemVEZXB0aCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZ0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYG5vcm1hbGl6ZWAgZnVuY3Rpb24gb24gbmVjZXNzYXJ5IGBFdmVudGAgYXR0cmlidXRlcyB0byBtYWtlIHRoZW0gc2FmZSBmb3Igc2VyaWFsaXphdGlvbi5cbiAgICogTm9ybWFsaXplZCBrZXlzOlxuICAgKiAtIGBicmVhZGNydW1icy5kYXRhYFxuICAgKiAtIGB1c2VyYFxuICAgKiAtIGBjb250ZXh0c2BcbiAgICogLSBgZXh0cmFgXG4gICAqIEBwYXJhbSBldmVudCBFdmVudFxuICAgKiBAcmV0dXJucyBOb3JtYWxpemVkIGV2ZW50XG4gICAqL1xuICBwcm90ZWN0ZWQgX25vcm1hbGl6ZUV2ZW50KGV2ZW50OiBFdmVudCB8IG51bGwsIGRlcHRoOiBudW1iZXIpOiBFdmVudCB8IG51bGwge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIC4uLihldmVudC5icmVhZGNydW1icyAmJiB7XG4gICAgICAgIGJyZWFkY3J1bWJzOiBldmVudC5icmVhZGNydW1icy5tYXAoYiA9PiAoe1xuICAgICAgICAgIC4uLmIsXG4gICAgICAgICAgLi4uKGIuZGF0YSAmJiB7XG4gICAgICAgICAgICBkYXRhOiBub3JtYWxpemUoYi5kYXRhLCBkZXB0aCksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pKSxcbiAgICAgIH0pLFxuICAgICAgLi4uKGV2ZW50LnVzZXIgJiYge1xuICAgICAgICB1c2VyOiBub3JtYWxpemUoZXZlbnQudXNlciwgZGVwdGgpLFxuICAgICAgfSksXG4gICAgICAuLi4oZXZlbnQuY29udGV4dHMgJiYge1xuICAgICAgICBjb250ZXh0czogbm9ybWFsaXplKGV2ZW50LmNvbnRleHRzLCBkZXB0aCksXG4gICAgICB9KSxcbiAgICAgIC4uLihldmVudC5leHRyYSAmJiB7XG4gICAgICAgIGV4dHJhOiBub3JtYWxpemUoZXZlbnQuZXh0cmEsIGRlcHRoKSxcbiAgICAgIH0pLFxuICAgIH07XG4gICAgLy8gZXZlbnQuY29udGV4dHMudHJhY2Ugc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgVHJhbnNhY3Rpb24uIFNpbWlsYXJseSxcbiAgICAvLyBldmVudC5zcGFuc1tdIHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBjaGlsZCBTcGFucy4gR2l2ZW4gdGhhdCBhXG4gICAgLy8gVHJhbnNhY3Rpb24gaXMgY29uY2VwdHVhbGx5IGEgU3Bhbiwgbm9ybWFsaXphdGlvbiBzaG91bGQgYXBwbHkgdG8gYm90aFxuICAgIC8vIFRyYW5zYWN0aW9ucyBhbmQgU3BhbnMgY29uc2lzdGVudGx5LlxuICAgIC8vIEZvciBub3cgdGhlIGRlY2lzaW9uIGlzIHRvIHNraXAgbm9ybWFsaXphdGlvbiBvZiBUcmFuc2FjdGlvbnMgYW5kIFNwYW5zLFxuICAgIC8vIHNvIHRoaXMgYmxvY2sgb3ZlcndyaXRlcyB0aGUgbm9ybWFsaXplZCBldmVudCB0byBhZGQgYmFjayB0aGUgb3JpZ2luYWxcbiAgICAvLyBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBwcmlvciB0byBub3JtYWxpemF0aW9uLlxuICAgIGlmIChldmVudC5jb250ZXh0cyAmJiBldmVudC5jb250ZXh0cy50cmFjZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgbm9ybWFsaXplZC5jb250ZXh0cy50cmFjZSA9IGV2ZW50LmNvbnRleHRzLnRyYWNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgX2V4cGVyaW1lbnRzID0ge30gfSA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgIGlmIChfZXhwZXJpbWVudHMuZW5zdXJlTm9DaXJjdWxhclN0cnVjdHVyZXMpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemUobm9ybWFsaXplZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZWQ7XG4gIH1cblxuICAvKipcbiAgICogIEVuaGFuY2VzIGV2ZW50IHVzaW5nIHRoZSBjbGllbnQgY29uZmlndXJhdGlvbi5cbiAgICogIEl0IHRha2VzIGNhcmUgb2YgYWxsIFwic3RhdGljXCIgdmFsdWVzIGxpa2UgZW52aXJvbm1lbnQsIHJlbGVhc2UgYW5kIGBkaXN0YCxcbiAgICogIGFzIHdlbGwgYXMgdHJ1bmNhdGluZyBvdmVybHkgbG9uZyB2YWx1ZXMuXG4gICAqIEBwYXJhbSBldmVudCBldmVudCBpbnN0YW5jZSB0byBiZSBlbmhhbmNlZFxuICAgKi9cbiAgcHJvdGVjdGVkIF9hcHBseUNsaWVudE9wdGlvbnMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICAgIGNvbnN0IHsgZW52aXJvbm1lbnQsIHJlbGVhc2UsIGRpc3QsIG1heFZhbHVlTGVuZ3RoID0gMjUwIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKCEoJ2Vudmlyb25tZW50JyBpbiBldmVudCkpIHtcbiAgICAgIGV2ZW50LmVudmlyb25tZW50ID0gJ2Vudmlyb25tZW50JyBpbiBvcHRpb25zID8gZW52aXJvbm1lbnQgOiAncHJvZHVjdGlvbic7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnJlbGVhc2UgPT09IHVuZGVmaW5lZCAmJiByZWxlYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV2ZW50LnJlbGVhc2UgPSByZWxlYXNlO1xuICAgIH1cblxuICAgIGlmIChldmVudC5kaXN0ID09PSB1bmRlZmluZWQgJiYgZGlzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBldmVudC5kaXN0ID0gZGlzdDtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQubWVzc2FnZSkge1xuICAgICAgZXZlbnQubWVzc2FnZSA9IHRydW5jYXRlKGV2ZW50Lm1lc3NhZ2UsIG1heFZhbHVlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjb25zdCBleGNlcHRpb24gPSBldmVudC5leGNlcHRpb24gJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdO1xuICAgIGlmIChleGNlcHRpb24gJiYgZXhjZXB0aW9uLnZhbHVlKSB7XG4gICAgICBleGNlcHRpb24udmFsdWUgPSB0cnVuY2F0ZShleGNlcHRpb24udmFsdWUsIG1heFZhbHVlTGVuZ3RoKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXF1ZXN0ID0gZXZlbnQucmVxdWVzdDtcbiAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LnVybCkge1xuICAgICAgcmVxdWVzdC51cmwgPSB0cnVuY2F0ZShyZXF1ZXN0LnVybCwgbWF4VmFsdWVMZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGFkZHMgYWxsIHVzZWQgaW50ZWdyYXRpb25zIHRvIHRoZSBTREsgaW5mbyBpbiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIGFsbCBpbnRlZ3JhdGlvbnMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2FwcGx5SW50ZWdyYXRpb25zTWV0YWRhdGEoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW50ZWdyYXRpb25zQXJyYXkgPSBPYmplY3Qua2V5cyh0aGlzLl9pbnRlZ3JhdGlvbnMpO1xuICAgIGlmIChpbnRlZ3JhdGlvbnNBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICBldmVudC5zZGsgPSBldmVudC5zZGsgfHwge307XG4gICAgICBldmVudC5zZGsuaW50ZWdyYXRpb25zID0gWy4uLihldmVudC5zZGsuaW50ZWdyYXRpb25zIHx8IFtdKSwgLi4uaW50ZWdyYXRpb25zQXJyYXldO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUZWxscyB0aGUgYmFja2VuZCB0byBzZW5kIHRoaXMgZXZlbnRcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBTZW50cnkgZXZlbnQgdG8gc2VuZFxuICAgKi9cbiAgcHJvdGVjdGVkIF9zZW5kRXZlbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fZ2V0QmFja2VuZCgpLnNlbmRFdmVudChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvY2Vzc2VzIHRoZSBldmVudCBhbmQgbG9ncyBhbiBlcnJvciBpbiBjYXNlIG9mIHJlamVjdGlvblxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHBhcmFtIGhpbnRcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqL1xuICBwcm90ZWN0ZWQgX2NhcHR1cmVFdmVudChldmVudDogRXZlbnQsIGhpbnQ/OiBFdmVudEhpbnQsIHNjb3BlPzogU2NvcGUpOiBQcm9taXNlTGlrZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc0V2ZW50KGV2ZW50LCBoaW50LCBzY29wZSkudGhlbihcbiAgICAgIGZpbmFsRXZlbnQgPT4ge1xuICAgICAgICByZXR1cm4gZmluYWxFdmVudC5ldmVudF9pZDtcbiAgICAgIH0sXG4gICAgICByZWFzb24gPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IocmVhc29uKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgYW4gZXZlbnQgKGVpdGhlciBlcnJvciBvciBtZXNzYWdlKSBhbmQgc2VuZHMgaXQgdG8gU2VudHJ5LlxuICAgKlxuICAgKiBUaGlzIGFsc28gYWRkcyBicmVhZGNydW1icyBhbmQgY29udGV4dCBpbmZvcm1hdGlvbiB0byB0aGUgZXZlbnQuIEhvd2V2ZXIsXG4gICAqIHBsYXRmb3JtIHNwZWNpZmljIG1ldGEgZGF0YSAoc3VjaCBhcyB0aGUgVXNlcidzIElQIGFkZHJlc3MpIG11c3QgYmUgYWRkZWRcbiAgICogYnkgdGhlIFNESyBpbXBsZW1lbnRvci5cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0byBzZW5kIHRvIFNlbnRyeS5cbiAgICogQHBhcmFtIGhpbnQgTWF5IGNvbnRhaW4gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uLlxuICAgKiBAcGFyYW0gc2NvcGUgQSBzY29wZSBjb250YWluaW5nIGV2ZW50IG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyBBIFN5bmNQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZXZlbnQgb3IgcmVqZWN0cyBpbiBjYXNlIGV2ZW50IHdhcy93aWxsIG5vdCBiZSBzZW5kLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9wcm9jZXNzRXZlbnQoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50LCBzY29wZT86IFNjb3BlKTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3QgeyBiZWZvcmVTZW5kLCBzYW1wbGVSYXRlIH0gPSB0aGlzLmdldE9wdGlvbnMoKTtcbiAgICBjb25zdCB0cmFuc3BvcnQgPSB0aGlzLmdldFRyYW5zcG9ydCgpO1xuXG4gICAgaWYgKCF0aGlzLl9pc0VuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlamVjdChuZXcgU2VudHJ5RXJyb3IoJ1NESyBub3QgZW5hYmxlZCwgd2lsbCBub3QgY2FwdHVyZSBldmVudC4nKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNUcmFuc2FjdGlvbiA9IGV2ZW50LnR5cGUgPT09ICd0cmFuc2FjdGlvbic7XG4gICAgLy8gMS4wID09PSAxMDAlIGV2ZW50cyBhcmUgc2VudFxuICAgIC8vIDAuMCA9PT0gMCUgZXZlbnRzIGFyZSBzZW50XG4gICAgLy8gU2FtcGxpbmcgZm9yIHRyYW5zYWN0aW9uIGhhcHBlbnMgc29tZXdoZXJlIGVsc2VcbiAgICBpZiAoIWlzVHJhbnNhY3Rpb24gJiYgdHlwZW9mIHNhbXBsZVJhdGUgPT09ICdudW1iZXInICYmIE1hdGgucmFuZG9tKCkgPiBzYW1wbGVSYXRlKSB7XG4gICAgICB0cmFuc3BvcnQucmVjb3JkTG9zdEV2ZW50Py4oT3V0Y29tZS5TYW1wbGVSYXRlLCAnZXZlbnQnKTtcbiAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBTZW50cnlFcnJvcihcbiAgICAgICAgICBgRGlzY2FyZGluZyBldmVudCBiZWNhdXNlIGl0J3Mgbm90IGluY2x1ZGVkIGluIHRoZSByYW5kb20gc2FtcGxlIChzYW1wbGluZyByYXRlID0gJHtzYW1wbGVSYXRlfSlgLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcHJlcGFyZUV2ZW50KGV2ZW50LCBzY29wZSwgaGludClcbiAgICAgIC50aGVuKHByZXBhcmVkID0+IHtcbiAgICAgICAgaWYgKHByZXBhcmVkID09PSBudWxsKSB7XG4gICAgICAgICAgdHJhbnNwb3J0LnJlY29yZExvc3RFdmVudD8uKE91dGNvbWUuRXZlbnRQcm9jZXNzb3IsIGV2ZW50LnR5cGUgfHwgJ2V2ZW50Jyk7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKCdBbiBldmVudCBwcm9jZXNzb3IgcmV0dXJuZWQgbnVsbCwgd2lsbCBub3Qgc2VuZCBldmVudC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzSW50ZXJuYWxFeGNlcHRpb24gPSBoaW50ICYmIGhpbnQuZGF0YSAmJiAoaGludC5kYXRhIGFzIHsgX19zZW50cnlfXzogYm9vbGVhbiB9KS5fX3NlbnRyeV9fID09PSB0cnVlO1xuICAgICAgICBpZiAoaXNJbnRlcm5hbEV4Y2VwdGlvbiB8fCBpc1RyYW5zYWN0aW9uIHx8ICFiZWZvcmVTZW5kKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXBhcmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmVmb3JlU2VuZFJlc3VsdCA9IGJlZm9yZVNlbmQocHJlcGFyZWQsIGhpbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5zdXJlQmVmb3JlU2VuZFJ2KGJlZm9yZVNlbmRSZXN1bHQpO1xuICAgICAgfSlcbiAgICAgIC50aGVuKHByb2Nlc3NlZEV2ZW50ID0+IHtcbiAgICAgICAgaWYgKHByb2Nlc3NlZEV2ZW50ID09PSBudWxsKSB7XG4gICAgICAgICAgdHJhbnNwb3J0LnJlY29yZExvc3RFdmVudD8uKE91dGNvbWUuQmVmb3JlU2VuZCwgZXZlbnQudHlwZSB8fCAnZXZlbnQnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ2BiZWZvcmVTZW5kYCByZXR1cm5lZCBgbnVsbGAsIHdpbGwgbm90IHNlbmQgZXZlbnQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZXNzaW9uID0gc2NvcGUgJiYgc2NvcGUuZ2V0U2Vzc2lvbiAmJiBzY29wZS5nZXRTZXNzaW9uKCk7XG4gICAgICAgIGlmICghaXNUcmFuc2FjdGlvbiAmJiBzZXNzaW9uKSB7XG4gICAgICAgICAgdGhpcy5fdXBkYXRlU2Vzc2lvbkZyb21FdmVudChzZXNzaW9uLCBwcm9jZXNzZWRFdmVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9zZW5kRXZlbnQocHJvY2Vzc2VkRXZlbnQpO1xuICAgICAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnQ7XG4gICAgICB9KVxuICAgICAgLnRoZW4obnVsbCwgcmVhc29uID0+IHtcbiAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFNlbnRyeUVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgcmVhc29uO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYXB0dXJlRXhjZXB0aW9uKHJlYXNvbiwge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIF9fc2VudHJ5X186IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvcmlnaW5hbEV4Y2VwdGlvbjogcmVhc29uIGFzIEVycm9yLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKFxuICAgICAgICAgIGBFdmVudCBwcm9jZXNzaW5nIHBpcGVsaW5lIHRocmV3IGFuIGVycm9yLCBvcmlnaW5hbCBldmVudCB3aWxsIG5vdCBiZSBzZW50LiBEZXRhaWxzIGhhdmUgYmVlbiBzZW50IGFzIGEgbmV3IGV2ZW50LlxcblJlYXNvbjogJHtyZWFzb259YCxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE9jY3VwaWVzIHRoZSBjbGllbnQgd2l0aCBwcm9jZXNzaW5nIGFuZCBldmVudFxuICAgKi9cbiAgcHJvdGVjdGVkIF9wcm9jZXNzPFQ+KHByb21pc2U6IFByb21pc2VMaWtlPFQ+KTogdm9pZCB7XG4gICAgdGhpcy5fbnVtUHJvY2Vzc2luZyArPSAxO1xuICAgIHZvaWQgcHJvbWlzZS50aGVuKFxuICAgICAgdmFsdWUgPT4ge1xuICAgICAgICB0aGlzLl9udW1Qcm9jZXNzaW5nIC09IDE7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgIH0sXG4gICAgICByZWFzb24gPT4ge1xuICAgICAgICB0aGlzLl9udW1Qcm9jZXNzaW5nIC09IDE7XG4gICAgICAgIHJldHVybiByZWFzb247XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCByZXR1cm4gdmFsdWUgb2YgY29uZmlndXJlZCBgYmVmb3JlU2VuZGAgaXMgb2YgZXhwZWN0ZWQgdHlwZS5cbiAgICovXG4gIHByb3RlY3RlZCBfZW5zdXJlQmVmb3JlU2VuZFJ2KFxuICAgIHJ2OiBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+IHwgRXZlbnQgfCBudWxsLFxuICApOiBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+IHwgRXZlbnQgfCBudWxsIHtcbiAgICBjb25zdCBudWxsRXJyID0gJ2BiZWZvcmVTZW5kYCBtZXRob2QgaGFzIHRvIHJldHVybiBgbnVsbGAgb3IgYSB2YWxpZCBldmVudC4nO1xuICAgIGlmIChpc1RoZW5hYmxlKHJ2KSkge1xuICAgICAgcmV0dXJuIChydiBhcyBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+KS50aGVuKFxuICAgICAgICBldmVudCA9PiB7XG4gICAgICAgICAgaWYgKCEoaXNQbGFpbk9iamVjdChldmVudCkgfHwgZXZlbnQgPT09IG51bGwpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IobnVsbEVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBldmVudDtcbiAgICAgICAgfSxcbiAgICAgICAgZSA9PiB7XG4gICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKGBiZWZvcmVTZW5kIHJlamVjdGVkIHdpdGggJHtlfWApO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCEoaXNQbGFpbk9iamVjdChydikgfHwgcnYgPT09IG51bGwpKSB7XG4gICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IobnVsbEVycik7XG4gICAgfVxuICAgIHJldHVybiBydjtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50LCBSZXNwb25zZSwgU3RhdHVzLCBUcmFuc3BvcnQgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IFN5bmNQcm9taXNlIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8qKiBOb29wIHRyYW5zcG9ydCAqL1xuZXhwb3J0IGNsYXNzIE5vb3BUcmFuc3BvcnQgaW1wbGVtZW50cyBUcmFuc3BvcnQge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kRXZlbnQoXzogRXZlbnQpOiBQcm9taXNlTGlrZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgIHJlYXNvbjogYE5vb3BUcmFuc3BvcnQ6IEV2ZW50IGhhcyBiZWVuIHNraXBwZWQgYmVjYXVzZSBubyBEc24gaXMgY29uZmlndXJlZC5gLFxuICAgICAgc3RhdHVzOiBTdGF0dXMuU2tpcHBlZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNsb3NlKF8/OiBudW1iZXIpOiBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBFdmVudCwgRXZlbnRIaW50LCBPcHRpb25zLCBTZXNzaW9uLCBTZXZlcml0eSwgVHJhbnNwb3J0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIsIFNlbnRyeUVycm9yIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IE5vb3BUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydHMvbm9vcCc7XG5cbi8qKlxuICogSW50ZXJuYWwgcGxhdGZvcm0tZGVwZW5kZW50IFNlbnRyeSBTREsgQmFja2VuZC5cbiAqXG4gKiBXaGlsZSB7QGxpbmsgQ2xpZW50fSBjb250YWlucyBidXNpbmVzcyBsb2dpYyBzcGVjaWZpYyB0byBhbiBTREssIHRoZVxuICogQmFja2VuZCBvZmZlcnMgcGxhdGZvcm0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIGZvciBsb3ctbGV2ZWwgb3BlcmF0aW9ucy5cbiAqIFRoZXNlIGFyZSBwZXJzaXN0aW5nIGFuZCBsb2FkaW5nIGluZm9ybWF0aW9uLCBzZW5kaW5nIGV2ZW50cywgYW5kIGhvb2tpbmdcbiAqIGludG8gdGhlIGVudmlyb25tZW50LlxuICpcbiAqIEJhY2tlbmRzIHJlY2VpdmUgYSBoYW5kbGUgdG8gdGhlIENsaWVudCBpbiB0aGVpciBjb25zdHJ1Y3Rvci4gV2hlbiBhXG4gKiBCYWNrZW5kIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGV2ZW50cywgaXQgbXVzdCBwYXNzIHRoZW0gdG9cbiAqIHRoZSBDbGllbnQgZm9yIHZhbGlkYXRpb24gYW5kIHByb2Nlc3NpbmcgZmlyc3QuXG4gKlxuICogVXN1YWxseSwgdGhlIENsaWVudCB3aWxsIGJlIG9mIGNvcnJlc3BvbmRpbmcgdHlwZSwgZS5nLiBOb2RlQmFja2VuZFxuICogcmVjZWl2ZXMgTm9kZUNsaWVudC4gSG93ZXZlciwgaGlnaGVyLWxldmVsIFNES3MgY2FuIGNob29zZSB0byBpbnN0YW50aWF0ZVxuICogbXVsdGlwbGUgQmFja2VuZHMgYW5kIGRlbGVnYXRlIHRhc2tzIGJldHdlZW4gdGhlbS4gSW4gdGhpcyBjYXNlLCBhbiBldmVudFxuICogZ2VuZXJhdGVkIGJ5IG9uZSBiYWNrZW5kIG1pZ2h0IHZlcnkgd2VsbCBiZSBzZW50IGJ5IGFub3RoZXIgb25lLlxuICpcbiAqIFRoZSBjbGllbnQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8gb3B0aW9ucyB2aWEge0BsaW5rIENsaWVudC5nZXRPcHRpb25zfS5cbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYWNrZW5kIHtcbiAgLyoqIENyZWF0ZXMgYSB7QGxpbmsgRXZlbnR9IGZyb20gYW4gZXhjZXB0aW9uLiAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBldmVudEZyb21FeGNlcHRpb24oZXhjZXB0aW9uOiBhbnksIGhpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD47XG5cbiAgLyoqIENyZWF0ZXMgYSB7QGxpbmsgRXZlbnR9IGZyb20gYSBwbGFpbiBtZXNzYWdlLiAqL1xuICBldmVudEZyb21NZXNzYWdlKG1lc3NhZ2U6IHN0cmluZywgbGV2ZWw/OiBTZXZlcml0eSwgaGludD86IEV2ZW50SGludCk6IFByb21pc2VMaWtlPEV2ZW50PjtcblxuICAvKiogU3VibWl0cyB0aGUgZXZlbnQgdG8gU2VudHJ5ICovXG4gIHNlbmRFdmVudChldmVudDogRXZlbnQpOiB2b2lkO1xuXG4gIC8qKiBTdWJtaXRzIHRoZSBzZXNzaW9uIHRvIFNlbnRyeSAqL1xuICBzZW5kU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdHJhbnNwb3J0IHRoYXQgaXMgdXNlZCBieSB0aGUgYmFja2VuZC5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCB0aGUgdHJhbnNwb3J0IGdldHMgbGF6eSBpbml0aWFsaXplZCBzbyBpdCB3aWxsIG9ubHkgYmUgdGhlcmUgb25jZSB0aGUgZmlyc3QgZXZlbnQgaGFzIGJlZW4gc2VudC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHRyYW5zcG9ydC5cbiAgICovXG4gIGdldFRyYW5zcG9ydCgpOiBUcmFuc3BvcnQ7XG59XG5cbi8qKlxuICogQSBjbGFzcyBvYmplY3QgdGhhdCBjYW4gaW5zdGFudGlhdGUgQmFja2VuZCBvYmplY3RzLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgdHlwZSBCYWNrZW5kQ2xhc3M8QiBleHRlbmRzIEJhY2tlbmQsIE8gZXh0ZW5kcyBPcHRpb25zPiA9IG5ldyAob3B0aW9uczogTykgPT4gQjtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBiYXNlIGltcGxlbWVudGlvbiBvZiBhIEJhY2tlbmQuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQmFja2VuZDxPIGV4dGVuZHMgT3B0aW9ucz4gaW1wbGVtZW50cyBCYWNrZW5kIHtcbiAgLyoqIE9wdGlvbnMgcGFzc2VkIHRvIHRoZSBTREsuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBfb3B0aW9uczogTztcblxuICAvKiogQ2FjaGVkIHRyYW5zcG9ydCB1c2VkIGludGVybmFsbHkuICovXG4gIHByb3RlY3RlZCBfdHJhbnNwb3J0OiBUcmFuc3BvcnQ7XG5cbiAgLyoqIENyZWF0ZXMgYSBuZXcgYmFja2VuZCBpbnN0YW5jZS4gKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE8pIHtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMuZHNuKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gRFNOIHByb3ZpZGVkLCBiYWNrZW5kIHdpbGwgbm90IGRvIGFueXRoaW5nLicpO1xuICAgIH1cbiAgICB0aGlzLl90cmFuc3BvcnQgPSB0aGlzLl9zZXR1cFRyYW5zcG9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICBwdWJsaWMgZXZlbnRGcm9tRXhjZXB0aW9uKF9leGNlcHRpb246IGFueSwgX2hpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD4ge1xuICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21FeGNlcHRpb25gIG1ldGhvZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZXZlbnRGcm9tTWVzc2FnZShfbWVzc2FnZTogc3RyaW5nLCBfbGV2ZWw/OiBTZXZlcml0eSwgX2hpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD4ge1xuICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignQmFja2VuZCBoYXMgdG8gaW1wbGVtZW50IGBldmVudEZyb21NZXNzYWdlYCBtZXRob2QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNlbmRFdmVudChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICB2b2lkIHRoaXMuX3RyYW5zcG9ydC5zZW5kRXZlbnQoZXZlbnQpLnRoZW4obnVsbCwgcmVhc29uID0+IHtcbiAgICAgIGxvZ2dlci5lcnJvcihgRXJyb3Igd2hpbGUgc2VuZGluZyBldmVudDogJHtyZWFzb259YCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl90cmFuc3BvcnQuc2VuZFNlc3Npb24pIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiRHJvcHBpbmcgc2Vzc2lvbiBiZWNhdXNlIGN1c3RvbSB0cmFuc3BvcnQgZG9lc24ndCBpbXBsZW1lbnQgc2VuZFNlc3Npb25cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdm9pZCB0aGlzLl90cmFuc3BvcnQuc2VuZFNlc3Npb24oc2Vzc2lvbikudGhlbihudWxsLCByZWFzb24gPT4ge1xuICAgICAgbG9nZ2VyLmVycm9yKGBFcnJvciB3aGlsZSBzZW5kaW5nIHNlc3Npb246ICR7cmVhc29ufWApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZ2V0VHJhbnNwb3J0KCk6IFRyYW5zcG9ydCB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHVwIHRoZSB0cmFuc3BvcnQgc28gaXQgY2FuIGJlIHVzZWQgbGF0ZXIgdG8gc2VuZCByZXF1ZXN0cy5cbiAgICovXG4gIHByb3RlY3RlZCBfc2V0dXBUcmFuc3BvcnQoKTogVHJhbnNwb3J0IHtcbiAgICByZXR1cm4gbmV3IE5vb3BUcmFuc3BvcnQoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50LCBTZGtJbmZvLCBTZW50cnlSZXF1ZXN0LCBTZW50cnlSZXF1ZXN0VHlwZSwgU2Vzc2lvbiwgU2Vzc2lvbkFnZ3JlZ2F0ZXMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxuaW1wb3J0IHsgQVBJIH0gZnJvbSAnLi9hcGknO1xuXG4vKiogRXh0cmFjdCBzZGsgaW5mbyBmcm9tIGZyb20gdGhlIEFQSSBtZXRhZGF0YSAqL1xuZnVuY3Rpb24gZ2V0U2RrTWV0YWRhdGFGb3JFbnZlbG9wZUhlYWRlcihhcGk6IEFQSSk6IFNka0luZm8gfCB1bmRlZmluZWQge1xuICBpZiAoIWFwaS5tZXRhZGF0YSB8fCAhYXBpLm1ldGFkYXRhLnNkaykge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IGFwaS5tZXRhZGF0YS5zZGs7XG4gIHJldHVybiB7IG5hbWUsIHZlcnNpb24gfTtcbn1cblxuLyoqXG4gKiBBcHBseSBTZGtJbmZvIChuYW1lLCB2ZXJzaW9uLCBwYWNrYWdlcywgaW50ZWdyYXRpb25zKSB0byB0aGUgY29ycmVzcG9uZGluZyBldmVudCBrZXkuXG4gKiBNZXJnZSB3aXRoIGV4aXN0aW5nIGRhdGEgaWYgYW55LlxuICoqL1xuZnVuY3Rpb24gZW5oYW5jZUV2ZW50V2l0aFNka0luZm8oZXZlbnQ6IEV2ZW50LCBzZGtJbmZvPzogU2RrSW5mbyk6IEV2ZW50IHtcbiAgaWYgKCFzZGtJbmZvKSB7XG4gICAgcmV0dXJuIGV2ZW50O1xuICB9XG4gIGV2ZW50LnNkayA9IGV2ZW50LnNkayB8fCB7fTtcbiAgZXZlbnQuc2RrLm5hbWUgPSBldmVudC5zZGsubmFtZSB8fCBzZGtJbmZvLm5hbWU7XG4gIGV2ZW50LnNkay52ZXJzaW9uID0gZXZlbnQuc2RrLnZlcnNpb24gfHwgc2RrSW5mby52ZXJzaW9uO1xuICBldmVudC5zZGsuaW50ZWdyYXRpb25zID0gWy4uLihldmVudC5zZGsuaW50ZWdyYXRpb25zIHx8IFtdKSwgLi4uKHNka0luZm8uaW50ZWdyYXRpb25zIHx8IFtdKV07XG4gIGV2ZW50LnNkay5wYWNrYWdlcyA9IFsuLi4oZXZlbnQuc2RrLnBhY2thZ2VzIHx8IFtdKSwgLi4uKHNka0luZm8ucGFja2FnZXMgfHwgW10pXTtcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKiogQ3JlYXRlcyBhIFNlbnRyeVJlcXVlc3QgZnJvbSBhIFNlc3Npb24uICovXG5leHBvcnQgZnVuY3Rpb24gc2Vzc2lvblRvU2VudHJ5UmVxdWVzdChzZXNzaW9uOiBTZXNzaW9uIHwgU2Vzc2lvbkFnZ3JlZ2F0ZXMsIGFwaTogQVBJKTogU2VudHJ5UmVxdWVzdCB7XG4gIGNvbnN0IHNka0luZm8gPSBnZXRTZGtNZXRhZGF0YUZvckVudmVsb3BlSGVhZGVyKGFwaSk7XG4gIGNvbnN0IGVudmVsb3BlSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBzZW50X2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgLi4uKHNka0luZm8gJiYgeyBzZGs6IHNka0luZm8gfSksXG4gICAgLi4uKGFwaS5mb3JjZUVudmVsb3BlKCkgJiYgeyBkc246IGFwaS5nZXREc24oKS50b1N0cmluZygpIH0pLFxuICB9KTtcbiAgLy8gSSBrbm93IHRoaXMgaXMgaGFja3kgYnV0IHdlIGRvbid0IHdhbnQgdG8gYWRkIGBzZXNzaW9uYCB0byByZXF1ZXN0IHR5cGUgc2luY2UgaXQncyBuZXZlciByYXRlIGxpbWl0ZWRcbiAgY29uc3QgdHlwZTogU2VudHJ5UmVxdWVzdFR5cGUgPSAnYWdncmVnYXRlcycgaW4gc2Vzc2lvbiA/ICgnc2Vzc2lvbnMnIGFzIFNlbnRyeVJlcXVlc3RUeXBlKSA6ICdzZXNzaW9uJztcbiAgY29uc3QgaXRlbUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgdHlwZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBib2R5OiBgJHtlbnZlbG9wZUhlYWRlcnN9XFxuJHtpdGVtSGVhZGVyc31cXG4ke0pTT04uc3RyaW5naWZ5KHNlc3Npb24pfWAsXG4gICAgdHlwZSxcbiAgICB1cmw6IGFwaS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCksXG4gIH07XG59XG5cbi8qKiBDcmVhdGVzIGEgU2VudHJ5UmVxdWVzdCBmcm9tIGFuIGV2ZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50VG9TZW50cnlSZXF1ZXN0KGV2ZW50OiBFdmVudCwgYXBpOiBBUEkpOiBTZW50cnlSZXF1ZXN0IHtcbiAgY29uc3Qgc2RrSW5mbyA9IGdldFNka01ldGFkYXRhRm9yRW52ZWxvcGVIZWFkZXIoYXBpKTtcbiAgY29uc3QgZXZlbnRUeXBlID0gZXZlbnQudHlwZSB8fCAnZXZlbnQnO1xuICBjb25zdCB1c2VFbnZlbG9wZSA9IGV2ZW50VHlwZSA9PT0gJ3RyYW5zYWN0aW9uJyB8fCBhcGkuZm9yY2VFbnZlbG9wZSgpO1xuXG4gIGNvbnN0IHsgdHJhbnNhY3Rpb25TYW1wbGluZywgLi4ubWV0YWRhdGEgfSA9IGV2ZW50LmRlYnVnX21ldGEgfHwge307XG4gIGNvbnN0IHsgbWV0aG9kOiBzYW1wbGluZ01ldGhvZCwgcmF0ZTogc2FtcGxlUmF0ZSB9ID0gdHJhbnNhY3Rpb25TYW1wbGluZyB8fCB7fTtcbiAgaWYgKE9iamVjdC5rZXlzKG1ldGFkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICBkZWxldGUgZXZlbnQuZGVidWdfbWV0YTtcbiAgfSBlbHNlIHtcbiAgICBldmVudC5kZWJ1Z19tZXRhID0gbWV0YWRhdGE7XG4gIH1cblxuICBjb25zdCByZXE6IFNlbnRyeVJlcXVlc3QgPSB7XG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoc2RrSW5mbyA/IGVuaGFuY2VFdmVudFdpdGhTZGtJbmZvKGV2ZW50LCBhcGkubWV0YWRhdGEuc2RrKSA6IGV2ZW50KSxcbiAgICB0eXBlOiBldmVudFR5cGUsXG4gICAgdXJsOiB1c2VFbnZlbG9wZSA/IGFwaS5nZXRFbnZlbG9wZUVuZHBvaW50V2l0aFVybEVuY29kZWRBdXRoKCkgOiBhcGkuZ2V0U3RvcmVFbmRwb2ludFdpdGhVcmxFbmNvZGVkQXV0aCgpLFxuICB9O1xuXG4gIC8vIGh0dHBzOi8vZGV2ZWxvcC5zZW50cnkuZGV2L3Nkay9lbnZlbG9wZXMvXG5cbiAgLy8gU2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBtYW5pcHVsYXRlIGVudmVsb3BlcyBub3Igc3RvcmUgdGhlbSwgdGhlcmUgaXMgbm9cbiAgLy8gZXhwb3J0ZWQgY29uY2VwdCBvZiBhbiBFbnZlbG9wZSB3aXRoIG9wZXJhdGlvbnMgaW5jbHVkaW5nIHNlcmlhbGl6YXRpb24gYW5kXG4gIC8vIGRlc2VyaWFsaXphdGlvbi4gSW5zdGVhZCwgd2Ugb25seSBpbXBsZW1lbnQgYSBtaW5pbWFsIHN1YnNldCBvZiB0aGUgc3BlYyB0b1xuICAvLyBzZXJpYWxpemUgZXZlbnRzIGlubGluZSBoZXJlLlxuICBpZiAodXNlRW52ZWxvcGUpIHtcbiAgICBjb25zdCBlbnZlbG9wZUhlYWRlcnMgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBldmVudF9pZDogZXZlbnQuZXZlbnRfaWQsXG4gICAgICBzZW50X2F0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAuLi4oc2RrSW5mbyAmJiB7IHNkazogc2RrSW5mbyB9KSxcbiAgICAgIC4uLihhcGkuZm9yY2VFbnZlbG9wZSgpICYmIHsgZHNuOiBhcGkuZ2V0RHNuKCkudG9TdHJpbmcoKSB9KSxcbiAgICB9KTtcbiAgICBjb25zdCBpdGVtSGVhZGVycyA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIHR5cGU6IGV2ZW50VHlwZSxcblxuICAgICAgLy8gVE9ETzogUmlnaHQgbm93LCBzYW1wbGVSYXRlIG1heSBvciBtYXkgbm90IGJlIGRlZmluZWQgKGl0IHdvbid0IGJlIGluIHRoZSBjYXNlcyBvZiBpbmhlcml0YW5jZSBhbmRcbiAgICAgIC8vIGV4cGxpY2l0bHktc2V0IHNhbXBsaW5nIGRlY2lzaW9ucykuIEFyZSB3ZSBnb29kIHdpdGggdGhhdD9cbiAgICAgIHNhbXBsZV9yYXRlczogW3sgaWQ6IHNhbXBsaW5nTWV0aG9kLCByYXRlOiBzYW1wbGVSYXRlIH1dLFxuXG4gICAgICAvLyBUaGUgY29udGVudC10eXBlIGlzIGFzc3VtZWQgdG8gYmUgJ2FwcGxpY2F0aW9uL2pzb24nIGFuZCBub3QgcGFydCBvZlxuICAgICAgLy8gdGhlIGN1cnJlbnQgc3BlYyBmb3IgdHJhbnNhY3Rpb24gaXRlbXMsIHNvIHdlIGRvbid0IGJsb2F0IHRoZSByZXF1ZXN0XG4gICAgICAvLyBib2R5IHdpdGggaXQuXG4gICAgICAvL1xuICAgICAgLy8gY29udGVudF90eXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAvL1xuICAgICAgLy8gVGhlIGxlbmd0aCBpcyBvcHRpb25hbC4gSXQgbXVzdCBiZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHJlcS5Cb2R5XG4gICAgICAvLyBlbmNvZGVkIGFzIFVURi04LiBTaW5jZSB0aGUgc2VydmVyIGNhbiBmaWd1cmUgdGhpcyBvdXQgYW5kIHdvdWxkXG4gICAgICAvLyBvdGhlcndpc2UgcmVmdXNlIGV2ZW50cyB0aGF0IHJlcG9ydCB0aGUgbGVuZ3RoIGluY29ycmVjdGx5LCB3ZSBkZWNpZGVkXG4gICAgICAvLyBub3QgdG8gc2VuZCB0aGUgbGVuZ3RoIHRvIGF2b2lkIHByb2JsZW1zIHJlbGF0ZWQgdG8gcmVwb3J0aW5nIHRoZSB3cm9uZ1xuICAgICAgLy8gc2l6ZSBhbmQgdG8gcmVkdWNlIHJlcXVlc3QgYm9keSBzaXplLlxuICAgICAgLy9cbiAgICAgIC8vIGxlbmd0aDogbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHJlcS5ib2R5KS5sZW5ndGgsXG4gICAgfSk7XG4gICAgLy8gVGhlIHRyYWlsaW5nIG5ld2xpbmUgaXMgb3B0aW9uYWwuIFdlIGludGVudGlvbmFsbHkgZG9uJ3Qgc2VuZCBpdCB0byBhdm9pZFxuICAgIC8vIHNlbmRpbmcgdW5uZWNlc3NhcnkgYnl0ZXMuXG4gICAgLy9cbiAgICAvLyBjb25zdCBlbnZlbG9wZSA9IGAke2VudmVsb3BlSGVhZGVyc31cXG4ke2l0ZW1IZWFkZXJzfVxcbiR7cmVxLmJvZHl9XFxuYDtcbiAgICBjb25zdCBlbnZlbG9wZSA9IGAke2VudmVsb3BlSGVhZGVyc31cXG4ke2l0ZW1IZWFkZXJzfVxcbiR7cmVxLmJvZHl9YDtcbiAgICByZXEuYm9keSA9IGVudmVsb3BlO1xuICB9XG5cbiAgcmV0dXJuIHJlcTtcbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgQ2xpZW50LCBPcHRpb25zIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLyoqIEEgY2xhc3Mgb2JqZWN0IHRoYXQgY2FuIGluc3RhbnRpYXRlIENsaWVudCBvYmplY3RzLiAqL1xuZXhwb3J0IHR5cGUgQ2xpZW50Q2xhc3M8RiBleHRlbmRzIENsaWVudCwgTyBleHRlbmRzIE9wdGlvbnM+ID0gbmV3IChvcHRpb25zOiBPKSA9PiBGO1xuXG4vKipcbiAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBTREsgY2xpZW50IGluc3RhbmNlLiBUaGUgY2xpZW50IGlzXG4gKiBpbnN0YWxsZWQgYW5kIHRoZW4gYm91bmQgdG8gdGhlIGN1cnJlbnQgc2NvcGUuXG4gKlxuICogQHBhcmFtIGNsaWVudENsYXNzIFRoZSBjbGllbnQgY2xhc3MgdG8gaW5zdGFudGlhdGUuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIGNsaWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRBbmRCaW5kPEYgZXh0ZW5kcyBDbGllbnQsIE8gZXh0ZW5kcyBPcHRpb25zPihjbGllbnRDbGFzczogQ2xpZW50Q2xhc3M8RiwgTz4sIG9wdGlvbnM6IE8pOiB2b2lkIHtcbiAgaWYgKG9wdGlvbnMuZGVidWcgPT09IHRydWUpIHtcbiAgICBsb2dnZXIuZW5hYmxlKCk7XG4gIH1cbiAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuICBodWIuZ2V0U2NvcGUoKT8udXBkYXRlKG9wdGlvbnMuaW5pdGlhbFNjb3BlKTtcbiAgY29uc3QgY2xpZW50ID0gbmV3IGNsaWVudENsYXNzKG9wdGlvbnMpO1xuICBodWIuYmluZENsaWVudChjbGllbnQpO1xufVxuIiwgImV4cG9ydCBjb25zdCBTREtfVkVSU0lPTiA9ICc2LjE2LjEnO1xuIiwgImltcG9ydCB7IEludGVncmF0aW9uLCBXcmFwcGVkRnVuY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcblxubGV0IG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZzogKCkgPT4gdm9pZDtcblxuLyoqIFBhdGNoIHRvU3RyaW5nIGNhbGxzIHRvIHJldHVybiBwcm9wZXIgbmFtZSBmb3Igd3JhcHBlZCBmdW5jdGlvbnMgKi9cbmV4cG9ydCBjbGFzcyBGdW5jdGlvblRvU3RyaW5nIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdGdW5jdGlvblRvU3RyaW5nJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBGdW5jdGlvblRvU3RyaW5nLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBGdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbih0aGlzOiBXcmFwcGVkRnVuY3Rpb24sIC4uLmFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9fc2VudHJ5X29yaWdpbmFsX18gfHwgdGhpcztcbiAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgRXZlbnQsIEludGVncmF0aW9uLCBTdGFja0ZyYW1lIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBnZXRFdmVudERlc2NyaXB0aW9uLCBpc01hdGNoaW5nUGF0dGVybiwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbi8vIFwiU2NyaXB0IGVycm9yLlwiIGlzIGhhcmQgY29kZWQgaW50byBicm93c2VycyBmb3IgZXJyb3JzIHRoYXQgaXQgY2FuJ3QgcmVhZC5cbi8vIHRoaXMgaXMgdGhlIHJlc3VsdCBvZiBhIHNjcmlwdCBiZWluZyBwdWxsZWQgaW4gZnJvbSBhbiBleHRlcm5hbCBkb21haW4gYW5kIENPUlMuXG5jb25zdCBERUZBVUxUX0lHTk9SRV9FUlJPUlMgPSBbL15TY3JpcHQgZXJyb3JcXC4/JC8sIC9eSmF2YXNjcmlwdCBlcnJvcjogU2NyaXB0IGVycm9yXFwuPyBvbiBsaW5lIDAkL107XG5cbi8qKiBKU0RvYyAqL1xuaW50ZXJmYWNlIEluYm91bmRGaWx0ZXJzT3B0aW9ucyB7XG4gIGFsbG93VXJsczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgZGVueVVybHM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG4gIGlnbm9yZUVycm9yczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgaWdub3JlSW50ZXJuYWw6IGJvb2xlYW47XG5cbiAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSW5ib3VuZEZpbHRlcnNPcHRpb25zLmFsbG93VXJsc30gaW5zdGVhZC4gKi9cbiAgd2hpdGVsaXN0VXJsczogQXJyYXk8c3RyaW5nIHwgUmVnRXhwPjtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgSW5ib3VuZEZpbHRlcnNPcHRpb25zLmRlbnlVcmxzfSBpbnN0ZWFkLiAqL1xuICBibGFja2xpc3RVcmxzOiBBcnJheTxzdHJpbmcgfCBSZWdFeHA+O1xufVxuXG4vKiogSW5ib3VuZCBmaWx0ZXJzIGNvbmZpZ3VyYWJsZSBieSB0aGUgdXNlciAqL1xuZXhwb3J0IGNsYXNzIEluYm91bmRGaWx0ZXJzIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdJbmJvdW5kRmlsdGVycyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gSW5ib3VuZEZpbHRlcnMuaWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX29wdGlvbnM6IFBhcnRpYWw8SW5ib3VuZEZpbHRlcnNPcHRpb25zPiA9IHt9KSB7fVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBodWIgPSBnZXRDdXJyZW50SHViKCk7XG4gICAgICBpZiAoIWh1Yikge1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWxmID0gaHViLmdldEludGVncmF0aW9uKEluYm91bmRGaWx0ZXJzKTtcbiAgICAgIGlmIChzZWxmKSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGh1Yi5nZXRDbGllbnQoKTtcbiAgICAgICAgY29uc3QgY2xpZW50T3B0aW9ucyA9IGNsaWVudCA/IGNsaWVudC5nZXRPcHRpb25zKCkgOiB7fTtcbiAgICAgICAgLy8gVGhpcyBjaGVja3MgcHJldmVudHMgbW9zdCBvZiB0aGUgb2NjdXJyZW5jZXMgb2YgdGhlIGJ1ZyBsaW5rZWQgYmVsb3c6XG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9nZXRzZW50cnkvc2VudHJ5LWphdmFzY3JpcHQvaXNzdWVzLzI2MjJcbiAgICAgICAgLy8gVGhlIGJ1ZyBpcyBjYXVzZWQgYnkgbXVsdGlwbGUgU0RLIGluc3RhbmNlcywgd2hlcmUgb25lIGlzIG1pbmlmaWVkIGFuZCBvbmUgaXMgdXNpbmcgbm9uLW1hbmdsZWQgY29kZS5cbiAgICAgICAgLy8gVW5mb3J0dW5hdGVsbHkgd2UgY2Fubm90IGZpeCBpdCByZWxpYWJseSAodGh1cyByZXNlcnZlZCBwcm9wZXJ0eSBpbiByb2xsdXAncyB0ZXJzZXIgY29uZmlnKSxcbiAgICAgICAgLy8gYXMgd2UgY2Fubm90IGZvcmNlIHBlb3BsZSB1c2luZyBtdWx0aXBsZSBpbnN0YW5jZXMgaW4gdGhlaXIgYXBwcyB0byBzeW5jIFNESyB2ZXJzaW9ucy5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBzZWxmLl9tZXJnZU9wdGlvbnMgPT09ICdmdW5jdGlvbicgPyBzZWxmLl9tZXJnZU9wdGlvbnMoY2xpZW50T3B0aW9ucykgOiB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWxmLl9zaG91bGREcm9wRXZlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3VsZERyb3BFdmVudChldmVudCwgb3B0aW9ucykgPyBudWxsIDogZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfc2hvdWxkRHJvcEV2ZW50KGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuX2lzU2VudHJ5RXJyb3IoZXZlbnQsIG9wdGlvbnMpKSB7XG4gICAgICBsb2dnZXIud2FybihgRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgaW50ZXJuYWwgU2VudHJ5IEVycm9yLlxcbkV2ZW50OiAke2dldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpfWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc0lnbm9yZWRFcnJvcihldmVudCwgb3B0aW9ucykpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgbWF0Y2hlZCBieSBcXGBpZ25vcmVFcnJvcnNcXGAgb3B0aW9uLlxcbkV2ZW50OiAke2dldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc0RlbmllZFVybChldmVudCwgb3B0aW9ucykpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgRXZlbnQgZHJvcHBlZCBkdWUgdG8gYmVpbmcgbWF0Y2hlZCBieSBcXGBkZW55VXJsc1xcYCBvcHRpb24uXFxuRXZlbnQ6ICR7Z2V0RXZlbnREZXNjcmlwdGlvbihcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgKX0uXFxuVXJsOiAke3RoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KX1gLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuX2lzQWxsb3dlZFVybChldmVudCwgb3B0aW9ucykpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgRXZlbnQgZHJvcHBlZCBkdWUgdG8gbm90IGJlaW5nIG1hdGNoZWQgYnkgXFxgYWxsb3dVcmxzXFxgIG9wdGlvbi5cXG5FdmVudDogJHtnZXRFdmVudERlc2NyaXB0aW9uKFxuICAgICAgICAgIGV2ZW50LFxuICAgICAgICApfS5cXG5Vcmw6ICR7dGhpcy5fZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQpfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9pc1NlbnRyeUVycm9yKGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgaWYgKCFvcHRpb25zLmlnbm9yZUludGVybmFsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChldmVudCAmJlxuICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbiAmJlxuICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiZcbiAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzWzBdICYmXG4gICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS50eXBlID09PSAnU2VudHJ5RXJyb3InKSB8fFxuICAgICAgICBmYWxzZVxuICAgICAgKTtcbiAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfaXNJZ25vcmVkRXJyb3IoZXZlbnQ6IEV2ZW50LCBvcHRpb25zOiBQYXJ0aWFsPEluYm91bmRGaWx0ZXJzT3B0aW9ucz4pOiBib29sZWFuIHtcbiAgICBpZiAoIW9wdGlvbnMuaWdub3JlRXJyb3JzIHx8ICFvcHRpb25zLmlnbm9yZUVycm9ycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0UG9zc2libGVFdmVudE1lc3NhZ2VzKGV2ZW50KS5zb21lKG1lc3NhZ2UgPT5cbiAgICAgIC8vIE5vdCBzdXJlIHdoeSBUeXBlU2NyaXB0IGNvbXBsYWlucyBoZXJlLi4uXG4gICAgICAob3B0aW9ucy5pZ25vcmVFcnJvcnMgYXMgQXJyYXk8UmVnRXhwIHwgc3RyaW5nPikuc29tZShwYXR0ZXJuID0+IGlzTWF0Y2hpbmdQYXR0ZXJuKG1lc3NhZ2UsIHBhdHRlcm4pKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2lzRGVuaWVkVXJsKGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETzogVXNlIEdsb2IgaW5zdGVhZD9cbiAgICBpZiAoIW9wdGlvbnMuZGVueVVybHMgfHwgIW9wdGlvbnMuZGVueVVybHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMuX2dldEV2ZW50RmlsdGVyVXJsKGV2ZW50KTtcbiAgICByZXR1cm4gIXVybCA/IGZhbHNlIDogb3B0aW9ucy5kZW55VXJscy5zb21lKHBhdHRlcm4gPT4gaXNNYXRjaGluZ1BhdHRlcm4odXJsLCBwYXR0ZXJuKSk7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfaXNBbGxvd2VkVXJsKGV2ZW50OiBFdmVudCwgb3B0aW9uczogUGFydGlhbDxJbmJvdW5kRmlsdGVyc09wdGlvbnM+KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETzogVXNlIEdsb2IgaW5zdGVhZD9cbiAgICBpZiAoIW9wdGlvbnMuYWxsb3dVcmxzIHx8ICFvcHRpb25zLmFsbG93VXJscy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCB1cmwgPSB0aGlzLl9nZXRFdmVudEZpbHRlclVybChldmVudCk7XG4gICAgcmV0dXJuICF1cmwgPyB0cnVlIDogb3B0aW9ucy5hbGxvd1VybHMuc29tZShwYXR0ZXJuID0+IGlzTWF0Y2hpbmdQYXR0ZXJuKHVybCwgcGF0dGVybikpO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX21lcmdlT3B0aW9ucyhjbGllbnRPcHRpb25zOiBQYXJ0aWFsPEluYm91bmRGaWx0ZXJzT3B0aW9ucz4gPSB7fSk6IFBhcnRpYWw8SW5ib3VuZEZpbHRlcnNPcHRpb25zPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93VXJsczogW1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgICAgLi4uKHRoaXMuX29wdGlvbnMud2hpdGVsaXN0VXJscyB8fCBbXSksXG4gICAgICAgIC4uLih0aGlzLl9vcHRpb25zLmFsbG93VXJscyB8fCBbXSksXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkZXByZWNhdGlvbi9kZXByZWNhdGlvblxuICAgICAgICAuLi4oY2xpZW50T3B0aW9ucy53aGl0ZWxpc3RVcmxzIHx8IFtdKSxcbiAgICAgICAgLi4uKGNsaWVudE9wdGlvbnMuYWxsb3dVcmxzIHx8IFtdKSxcbiAgICAgIF0sXG4gICAgICBkZW55VXJsczogW1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgICAgLi4uKHRoaXMuX29wdGlvbnMuYmxhY2tsaXN0VXJscyB8fCBbXSksXG4gICAgICAgIC4uLih0aGlzLl9vcHRpb25zLmRlbnlVcmxzIHx8IFtdKSxcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uXG4gICAgICAgIC4uLihjbGllbnRPcHRpb25zLmJsYWNrbGlzdFVybHMgfHwgW10pLFxuICAgICAgICAuLi4oY2xpZW50T3B0aW9ucy5kZW55VXJscyB8fCBbXSksXG4gICAgICBdLFxuICAgICAgaWdub3JlRXJyb3JzOiBbXG4gICAgICAgIC4uLih0aGlzLl9vcHRpb25zLmlnbm9yZUVycm9ycyB8fCBbXSksXG4gICAgICAgIC4uLihjbGllbnRPcHRpb25zLmlnbm9yZUVycm9ycyB8fCBbXSksXG4gICAgICAgIC4uLkRFRkFVTFRfSUdOT1JFX0VSUk9SUyxcbiAgICAgIF0sXG4gICAgICBpZ25vcmVJbnRlcm5hbDogdHlwZW9mIHRoaXMuX29wdGlvbnMuaWdub3JlSW50ZXJuYWwgIT09ICd1bmRlZmluZWQnID8gdGhpcy5fb3B0aW9ucy5pZ25vcmVJbnRlcm5hbCA6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBKU0RvYyAqL1xuICBwcml2YXRlIF9nZXRQb3NzaWJsZUV2ZW50TWVzc2FnZXMoZXZlbnQ6IEV2ZW50KTogc3RyaW5nW10ge1xuICAgIGlmIChldmVudC5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gW2V2ZW50Lm1lc3NhZ2VdO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuZXhjZXB0aW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IHR5cGUgPSAnJywgdmFsdWUgPSAnJyB9ID0gKGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXSkgfHwge307XG4gICAgICAgIHJldHVybiBbYCR7dmFsdWV9YCwgYCR7dHlwZX06ICR7dmFsdWV9YF07XG4gICAgICB9IGNhdGNoIChvTykge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYENhbm5vdCBleHRyYWN0IG1lc3NhZ2UgZm9yIGV2ZW50ICR7Z2V0RXZlbnREZXNjcmlwdGlvbihldmVudCl9YCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLyoqIEpTRG9jICovXG4gIHByaXZhdGUgX2dldExhc3RWYWxpZFVybChmcmFtZXM6IFN0YWNrRnJhbWVbXSA9IFtdKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgZm9yIChsZXQgaSA9IGZyYW1lcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgY29uc3QgZnJhbWUgPSBmcmFtZXNbaV07XG5cbiAgICAgIGlmIChmcmFtZT8uZmlsZW5hbWUgIT09ICc8YW5vbnltb3VzPicgJiYgZnJhbWU/LmZpbGVuYW1lICE9PSAnW25hdGl2ZSBjb2RlXScpIHtcbiAgICAgICAgcmV0dXJuIGZyYW1lLmZpbGVuYW1lIHx8IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJpdmF0ZSBfZ2V0RXZlbnRGaWx0ZXJVcmwoZXZlbnQ6IEV2ZW50KTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChldmVudC5zdGFja3RyYWNlKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lcyA9IGV2ZW50LnN0YWNrdHJhY2UuZnJhbWVzO1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0TGFzdFZhbGlkVXJsKGZyYW1lcyk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQuZXhjZXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IGZyYW1lcyA9XG4gICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyAmJiBldmVudC5leGNlcHRpb24udmFsdWVzWzBdLnN0YWNrdHJhY2UgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlc1swXS5zdGFja3RyYWNlLmZyYW1lcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhc3RWYWxpZFVybChmcmFtZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCAob08pIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgQ2Fubm90IGV4dHJhY3QgdXJsIGZvciBldmVudCAke2dldEV2ZW50RGVzY3JpcHRpb24oZXZlbnQpfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG4iLCAiZXhwb3J0IHsgRnVuY3Rpb25Ub1N0cmluZyB9IGZyb20gJy4vZnVuY3Rpb250b3N0cmluZyc7XG5leHBvcnQgeyBJbmJvdW5kRmlsdGVycyB9IGZyb20gJy4vaW5ib3VuZGZpbHRlcnMnO1xuIiwgImV4cG9ydCB7XG4gIGFkZEJyZWFkY3J1bWIsXG4gIGNhcHR1cmVFeGNlcHRpb24sXG4gIGNhcHR1cmVFdmVudCxcbiAgY2FwdHVyZU1lc3NhZ2UsXG4gIGNvbmZpZ3VyZVNjb3BlLFxuICBzdGFydFRyYW5zYWN0aW9uLFxuICBzZXRDb250ZXh0LFxuICBzZXRFeHRyYSxcbiAgc2V0RXh0cmFzLFxuICBzZXRUYWcsXG4gIHNldFRhZ3MsXG4gIHNldFVzZXIsXG4gIHdpdGhTY29wZSxcbn0gZnJvbSAnQHNlbnRyeS9taW5pbWFsJztcbmV4cG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViLCBnZXRIdWJGcm9tQ2FycmllciwgSHViLCBtYWtlTWFpbiwgU2NvcGUgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5leHBvcnQgeyBBUEkgfSBmcm9tICcuL2FwaSc7XG5leHBvcnQgeyBCYXNlQ2xpZW50IH0gZnJvbSAnLi9iYXNlY2xpZW50JztcbmV4cG9ydCB7IEJhY2tlbmRDbGFzcywgQmFzZUJhY2tlbmQgfSBmcm9tICcuL2Jhc2ViYWNrZW5kJztcbmV4cG9ydCB7IGV2ZW50VG9TZW50cnlSZXF1ZXN0LCBzZXNzaW9uVG9TZW50cnlSZXF1ZXN0IH0gZnJvbSAnLi9yZXF1ZXN0JztcbmV4cG9ydCB7IGluaXRBbmRCaW5kLCBDbGllbnRDbGFzcyB9IGZyb20gJy4vc2RrJztcbmV4cG9ydCB7IE5vb3BUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydHMvbm9vcCc7XG5leHBvcnQgeyBTREtfVkVSU0lPTiB9IGZyb20gJy4vdmVyc2lvbic7XG5cbmltcG9ydCAqIGFzIEludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5cbmV4cG9ydCB7IEludGVncmF0aW9ucyB9O1xuIiwgIi8qKlxuICogQSBkb3VibHkgbGlua2VkIGxpc3QtYmFzZWQgTGVhc3QgUmVjZW50bHkgVXNlZCAoTFJVKSBjYWNoZS4gV2lsbCBrZWVwIG1vc3RcbiAqIHJlY2VudGx5IHVzZWQgaXRlbXMgd2hpbGUgZGlzY2FyZGluZyBsZWFzdCByZWNlbnRseSB1c2VkIGl0ZW1zIHdoZW4gaXRzIGxpbWl0XG4gKiBpcyByZWFjaGVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVC4gQ29weXJpZ2h0IChjKSAyMDEwIFJhc211cyBBbmRlcnNzb24gPGh0dHA6Ly9odW5jaC5zZS8+XG4gKiBTZWUgUkVBRE1FLm1kIGZvciBkZXRhaWxzLlxuICpcbiAqIElsbHVzdHJhdGlvbiBvZiB0aGUgZGVzaWduOlxuICpcbiAqICAgICAgIGVudHJ5ICAgICAgICAgICAgIGVudHJ5ICAgICAgICAgICAgIGVudHJ5ICAgICAgICAgICAgIGVudHJ5XG4gKiAgICAgICBfX19fX18gICAgICAgICAgICBfX19fX18gICAgICAgICAgICBfX19fX18gICAgICAgICAgICBfX19fX19cbiAqICAgICAgfCBoZWFkIHwubmV3ZXIgPT4gfCAgICAgIHwubmV3ZXIgPT4gfCAgICAgIHwubmV3ZXIgPT4gfCB0YWlsIHxcbiAqICAgICAgfCAgQSAgIHwgICAgICAgICAgfCAgQiAgIHwgICAgICAgICAgfCAgQyAgIHwgICAgICAgICAgfCAgRCAgIHxcbiAqICAgICAgfF9fX19fX3wgPD0gb2xkZXIufF9fX19fX3wgPD0gb2xkZXIufF9fX19fX3wgPD0gb2xkZXIufF9fX19fX3xcbiAqXG4gKiAgcmVtb3ZlZCAgPC0tICA8LS0gIDwtLSAgPC0tICA8LS0gIDwtLSAgPC0tICA8LS0gIDwtLSAgPC0tICA8LS0gIGFkZGVkXG4gKi9cbihmdW5jdGlvbihnLGYpe1xuICBjb25zdCBlID0gdHlwZW9mIGV4cG9ydHMgPT0gJ29iamVjdCcgPyBleHBvcnRzIDogdHlwZW9mIGcgPT0gJ29iamVjdCcgPyBnIDoge307XG4gIGYoZSk7XG4gIGlmICh0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgeyBkZWZpbmUoJ2xydScsIGUpOyB9XG59KSh0aGlzLCBmdW5jdGlvbihleHBvcnRzKSB7XG5cbmNvbnN0IE5FV0VSID0gU3ltYm9sKCduZXdlcicpO1xuY29uc3QgT0xERVIgPSBTeW1ib2woJ29sZGVyJyk7XG5cbmZ1bmN0aW9uIExSVU1hcChsaW1pdCwgZW50cmllcykge1xuICBpZiAodHlwZW9mIGxpbWl0ICE9PSAnbnVtYmVyJykge1xuICAgIC8vIGNhbGxlZCBhcyAoZW50cmllcylcbiAgICBlbnRyaWVzID0gbGltaXQ7XG4gICAgbGltaXQgPSAwO1xuICB9XG5cbiAgdGhpcy5zaXplID0gMDtcbiAgdGhpcy5saW1pdCA9IGxpbWl0O1xuICB0aGlzLm9sZGVzdCA9IHRoaXMubmV3ZXN0ID0gdW5kZWZpbmVkO1xuICB0aGlzLl9rZXltYXAgPSBuZXcgTWFwKCk7XG5cbiAgaWYgKGVudHJpZXMpIHtcbiAgICB0aGlzLmFzc2lnbihlbnRyaWVzKTtcbiAgICBpZiAobGltaXQgPCAxKSB7XG4gICAgICB0aGlzLmxpbWl0ID0gdGhpcy5zaXplO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnRzLkxSVU1hcCA9IExSVU1hcDtcblxuZnVuY3Rpb24gRW50cnkoa2V5LCB2YWx1ZSkge1xuICB0aGlzLmtleSA9IGtleTtcbiAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB0aGlzW05FV0VSXSA9IHVuZGVmaW5lZDtcbiAgdGhpc1tPTERFUl0gPSB1bmRlZmluZWQ7XG59XG5cblxuTFJVTWFwLnByb3RvdHlwZS5fbWFya0VudHJ5QXNVc2VkID0gZnVuY3Rpb24oZW50cnkpIHtcbiAgaWYgKGVudHJ5ID09PSB0aGlzLm5ld2VzdCkge1xuICAgIC8vIEFscmVhZHkgdGhlIG1vc3QgcmVjZW5sdHkgdXNlZCBlbnRyeSwgc28gbm8gbmVlZCB0byB1cGRhdGUgdGhlIGxpc3RcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gSEVBRC0tLS0tLS0tLS0tLS0tVEFJTFxuICAvLyAgIDwub2xkZXIgICAubmV3ZXI+XG4gIC8vICA8LS0tIGFkZCBkaXJlY3Rpb24gLS1cbiAgLy8gICBBICBCICBDICA8RD4gIEVcbiAgaWYgKGVudHJ5W05FV0VSXSkge1xuICAgIGlmIChlbnRyeSA9PT0gdGhpcy5vbGRlc3QpIHtcbiAgICAgIHRoaXMub2xkZXN0ID0gZW50cnlbTkVXRVJdO1xuICAgIH1cbiAgICBlbnRyeVtORVdFUl1bT0xERVJdID0gZW50cnlbT0xERVJdOyAvLyBDIDwtLSBFLlxuICB9XG4gIGlmIChlbnRyeVtPTERFUl0pIHtcbiAgICBlbnRyeVtPTERFUl1bTkVXRVJdID0gZW50cnlbTkVXRVJdOyAvLyBDLiAtLT4gRVxuICB9XG4gIGVudHJ5W05FV0VSXSA9IHVuZGVmaW5lZDsgLy8gRCAtLXhcbiAgZW50cnlbT0xERVJdID0gdGhpcy5uZXdlc3Q7IC8vIEQuIC0tPiBFXG4gIGlmICh0aGlzLm5ld2VzdCkge1xuICAgIHRoaXMubmV3ZXN0W05FV0VSXSA9IGVudHJ5OyAvLyBFLiA8LS0gRFxuICB9XG4gIHRoaXMubmV3ZXN0ID0gZW50cnk7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLmFzc2lnbiA9IGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgbGV0IGVudHJ5LCBsaW1pdCA9IHRoaXMubGltaXQgfHwgTnVtYmVyLk1BWF9WQUxVRTtcbiAgdGhpcy5fa2V5bWFwLmNsZWFyKCk7XG4gIGxldCBpdCA9IGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICBmb3IgKGxldCBpdHYgPSBpdC5uZXh0KCk7ICFpdHYuZG9uZTsgaXR2ID0gaXQubmV4dCgpKSB7XG4gICAgbGV0IGUgPSBuZXcgRW50cnkoaXR2LnZhbHVlWzBdLCBpdHYudmFsdWVbMV0pO1xuICAgIHRoaXMuX2tleW1hcC5zZXQoZS5rZXksIGUpO1xuICAgIGlmICghZW50cnkpIHtcbiAgICAgIHRoaXMub2xkZXN0ID0gZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW50cnlbTkVXRVJdID0gZTtcbiAgICAgIGVbT0xERVJdID0gZW50cnk7XG4gICAgfVxuICAgIGVudHJ5ID0gZTtcbiAgICBpZiAobGltaXQtLSA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ292ZXJmbG93Jyk7XG4gICAgfVxuICB9XG4gIHRoaXMubmV3ZXN0ID0gZW50cnk7XG4gIHRoaXMuc2l6ZSA9IHRoaXMuX2tleW1hcC5zaXplO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbihrZXkpIHtcbiAgLy8gRmlyc3QsIGZpbmQgb3VyIGNhY2hlIGVudHJ5XG4gIHZhciBlbnRyeSA9IHRoaXMuX2tleW1hcC5nZXQoa2V5KTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuOyAvLyBOb3QgY2FjaGVkLiBTb3JyeS5cbiAgLy8gQXMgPGtleT4gd2FzIGZvdW5kIGluIHRoZSBjYWNoZSwgcmVnaXN0ZXIgaXQgYXMgYmVpbmcgcmVxdWVzdGVkIHJlY2VudGx5XG4gIHRoaXMuX21hcmtFbnRyeUFzVXNlZChlbnRyeSk7XG4gIHJldHVybiBlbnRyeS52YWx1ZTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICB2YXIgZW50cnkgPSB0aGlzLl9rZXltYXAuZ2V0KGtleSk7XG5cbiAgaWYgKGVudHJ5KSB7XG4gICAgLy8gdXBkYXRlIGV4aXN0aW5nXG4gICAgZW50cnkudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLl9tYXJrRW50cnlBc1VzZWQoZW50cnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gbmV3IGVudHJ5XG4gIHRoaXMuX2tleW1hcC5zZXQoa2V5LCAoZW50cnkgPSBuZXcgRW50cnkoa2V5LCB2YWx1ZSkpKTtcblxuICBpZiAodGhpcy5uZXdlc3QpIHtcbiAgICAvLyBsaW5rIHByZXZpb3VzIHRhaWwgdG8gdGhlIG5ldyB0YWlsIChlbnRyeSlcbiAgICB0aGlzLm5ld2VzdFtORVdFUl0gPSBlbnRyeTtcbiAgICBlbnRyeVtPTERFUl0gPSB0aGlzLm5ld2VzdDtcbiAgfSBlbHNlIHtcbiAgICAvLyB3ZSdyZSBmaXJzdCBpbiAtLSB5YXlcbiAgICB0aGlzLm9sZGVzdCA9IGVudHJ5O1xuICB9XG5cbiAgLy8gYWRkIG5ldyBlbnRyeSB0byB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdCAtLSBpdCdzIG5vdyB0aGUgZnJlc2hlc3QgZW50cnkuXG4gIHRoaXMubmV3ZXN0ID0gZW50cnk7XG4gICsrdGhpcy5zaXplO1xuICBpZiAodGhpcy5zaXplID4gdGhpcy5saW1pdCkge1xuICAgIC8vIHdlIGhpdCB0aGUgbGltaXQgLS0gcmVtb3ZlIHRoZSBoZWFkXG4gICAgdGhpcy5zaGlmdCgpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLnNoaWZ0ID0gZnVuY3Rpb24oKSB7XG4gIC8vIHRvZG86IGhhbmRsZSBzcGVjaWFsIGNhc2Ugd2hlbiBsaW1pdCA9PSAxXG4gIHZhciBlbnRyeSA9IHRoaXMub2xkZXN0O1xuICBpZiAoZW50cnkpIHtcbiAgICBpZiAodGhpcy5vbGRlc3RbTkVXRVJdKSB7XG4gICAgICAvLyBhZHZhbmNlIHRoZSBsaXN0XG4gICAgICB0aGlzLm9sZGVzdCA9IHRoaXMub2xkZXN0W05FV0VSXTtcbiAgICAgIHRoaXMub2xkZXN0W09MREVSXSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdGhlIGNhY2hlIGlzIGV4aGF1c3RlZFxuICAgICAgdGhpcy5vbGRlc3QgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLm5ld2VzdCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSB0byA8ZW50cnk+IGFuZCByZW1vdmUgbGlua3MgZnJvbSB0aGUgcHVyZ2VkXG4gICAgLy8gZW50cnkgYmVpbmcgcmV0dXJuZWQ6XG4gICAgZW50cnlbTkVXRVJdID0gZW50cnlbT0xERVJdID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2tleW1hcC5kZWxldGUoZW50cnkua2V5KTtcbiAgICAtLXRoaXMuc2l6ZTtcbiAgICByZXR1cm4gW2VudHJ5LmtleSwgZW50cnkudmFsdWVdO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGb2xsb3dpbmcgY29kZSBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHJlbW92ZWQgd2l0aG91dCBicmVha2luZyB0aGUgY29yZVxuLy8gZnVuY3Rpb25hbGl0eS5cblxuTFJVTWFwLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24oa2V5KSB7XG4gIGxldCBlID0gdGhpcy5fa2V5bWFwLmdldChrZXkpO1xuICByZXR1cm4gZSA/IGUudmFsdWUgOiB1bmRlZmluZWQ7XG59O1xuXG5MUlVNYXAucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKGtleSkge1xuICByZXR1cm4gdGhpcy5fa2V5bWFwLmhhcyhrZXkpO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBmdW5jdGlvbihrZXkpIHtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fa2V5bWFwLmdldChrZXkpO1xuICBpZiAoIWVudHJ5KSByZXR1cm47XG4gIHRoaXMuX2tleW1hcC5kZWxldGUoZW50cnkua2V5KTtcbiAgaWYgKGVudHJ5W05FV0VSXSAmJiBlbnRyeVtPTERFUl0pIHtcbiAgICAvLyByZWxpbmsgdGhlIG9sZGVyIGVudHJ5IHdpdGggdGhlIG5ld2VyIGVudHJ5XG4gICAgZW50cnlbT0xERVJdW05FV0VSXSA9IGVudHJ5W05FV0VSXTtcbiAgICBlbnRyeVtORVdFUl1bT0xERVJdID0gZW50cnlbT0xERVJdO1xuICB9IGVsc2UgaWYgKGVudHJ5W05FV0VSXSkge1xuICAgIC8vIHJlbW92ZSB0aGUgbGluayB0byB1c1xuICAgIGVudHJ5W05FV0VSXVtPTERFUl0gPSB1bmRlZmluZWQ7XG4gICAgLy8gbGluayB0aGUgbmV3ZXIgZW50cnkgdG8gaGVhZFxuICAgIHRoaXMub2xkZXN0ID0gZW50cnlbTkVXRVJdO1xuICB9IGVsc2UgaWYgKGVudHJ5W09MREVSXSkge1xuICAgIC8vIHJlbW92ZSB0aGUgbGluayB0byB1c1xuICAgIGVudHJ5W09MREVSXVtORVdFUl0gPSB1bmRlZmluZWQ7XG4gICAgLy8gbGluayB0aGUgbmV3ZXIgZW50cnkgdG8gaGVhZFxuICAgIHRoaXMubmV3ZXN0ID0gZW50cnlbT0xERVJdO1xuICB9IGVsc2Ugey8vIGlmKGVudHJ5W09MREVSXSA9PT0gdW5kZWZpbmVkICYmIGVudHJ5Lm5ld2VyID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm9sZGVzdCA9IHRoaXMubmV3ZXN0ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgdGhpcy5zaXplLS07XG4gIHJldHVybiBlbnRyeS52YWx1ZTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHtcbiAgLy8gTm90IGNsZWFyaW5nIGxpbmtzIHNob3VsZCBiZSBzYWZlLCBhcyB3ZSBkb24ndCBleHBvc2UgbGl2ZSBsaW5rcyB0byB1c2VyXG4gIHRoaXMub2xkZXN0ID0gdGhpcy5uZXdlc3QgPSB1bmRlZmluZWQ7XG4gIHRoaXMuc2l6ZSA9IDA7XG4gIHRoaXMuX2tleW1hcC5jbGVhcigpO1xufTtcblxuXG5mdW5jdGlvbiBFbnRyeUl0ZXJhdG9yKG9sZGVzdEVudHJ5KSB7IHRoaXMuZW50cnkgPSBvbGRlc3RFbnRyeTsgfVxuRW50cnlJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfVxuRW50cnlJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKCkge1xuICBsZXQgZW50ID0gdGhpcy5lbnRyeTtcbiAgaWYgKGVudCkge1xuICAgIHRoaXMuZW50cnkgPSBlbnRbTkVXRVJdO1xuICAgIHJldHVybiB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogW2VudC5rZXksIGVudC52YWx1ZV0gfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gIH1cbn07XG5cblxuZnVuY3Rpb24gS2V5SXRlcmF0b3Iob2xkZXN0RW50cnkpIHsgdGhpcy5lbnRyeSA9IG9sZGVzdEVudHJ5OyB9XG5LZXlJdGVyYXRvci5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfVxuS2V5SXRlcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbigpIHtcbiAgbGV0IGVudCA9IHRoaXMuZW50cnk7XG4gIGlmIChlbnQpIHtcbiAgICB0aGlzLmVudHJ5ID0gZW50W05FV0VSXTtcbiAgICByZXR1cm4geyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudC5rZXkgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIFZhbHVlSXRlcmF0b3Iob2xkZXN0RW50cnkpIHsgdGhpcy5lbnRyeSA9IG9sZGVzdEVudHJ5OyB9XG5WYWx1ZUl0ZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9XG5WYWx1ZUl0ZXJhdG9yLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oKSB7XG4gIGxldCBlbnQgPSB0aGlzLmVudHJ5O1xuICBpZiAoZW50KSB7XG4gICAgdGhpcy5lbnRyeSA9IGVudFtORVdFUl07XG4gICAgcmV0dXJuIHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnQudmFsdWUgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gIH1cbn07XG5cblxuTFJVTWFwLnByb3RvdHlwZS5rZXlzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBuZXcgS2V5SXRlcmF0b3IodGhpcy5vbGRlc3QpO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS52YWx1ZXMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBWYWx1ZUl0ZXJhdG9yKHRoaXMub2xkZXN0KTtcbn07XG5cbkxSVU1hcC5wcm90b3R5cGUuZW50cmllcyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcztcbn07XG5cbkxSVU1hcC5wcm90b3R5cGVbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IodGhpcy5vbGRlc3QpO1xufTtcblxuTFJVTWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24oZnVuLCB0aGlzT2JqKSB7XG4gIGlmICh0eXBlb2YgdGhpc09iaiAhPT0gJ29iamVjdCcpIHtcbiAgICB0aGlzT2JqID0gdGhpcztcbiAgfVxuICBsZXQgZW50cnkgPSB0aGlzLm9sZGVzdDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgZnVuLmNhbGwodGhpc09iaiwgZW50cnkudmFsdWUsIGVudHJ5LmtleSwgdGhpcyk7XG4gICAgZW50cnkgPSBlbnRyeVtORVdFUl07XG4gIH1cbn07XG5cbi8qKiBSZXR1cm5zIGEgSlNPTiAoYXJyYXkpIHJlcHJlc2VudGF0aW9uICovXG5MUlVNYXAucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcyA9IG5ldyBBcnJheSh0aGlzLnNpemUpLCBpID0gMCwgZW50cnkgPSB0aGlzLm9sZGVzdDtcbiAgd2hpbGUgKGVudHJ5KSB7XG4gICAgc1tpKytdID0geyBrZXk6IGVudHJ5LmtleSwgdmFsdWU6IGVudHJ5LnZhbHVlIH07XG4gICAgZW50cnkgPSBlbnRyeVtORVdFUl07XG4gIH1cbiAgcmV0dXJuIHM7XG59O1xuXG4vKiogUmV0dXJucyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiAqL1xuTFJVTWFwLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcyA9ICcnLCBlbnRyeSA9IHRoaXMub2xkZXN0O1xuICB3aGlsZSAoZW50cnkpIHtcbiAgICBzICs9IFN0cmluZyhlbnRyeS5rZXkpKyc6JytlbnRyeS52YWx1ZTtcbiAgICBlbnRyeSA9IGVudHJ5W05FV0VSXTtcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIHMgKz0gJyA8ICc7XG4gICAgfVxuICB9XG4gIHJldHVybiBzO1xufTtcblxufSk7XG4iLCAiLyoqXG4gKiBzdGFjay10cmFjZSAtIFBhcnNlcyBub2RlLmpzIHN0YWNrIHRyYWNlc1xuICpcbiAqIFRoaXMgd2FzIG9yaWdpbmFsbHkgZm9ya2VkIHRvIGZpeCB0aGlzIGlzc3VlOlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZlbGl4Z2Uvbm9kZS1zdGFjay10cmFjZS9pc3N1ZXMvMzFcbiAqXG4gKiBNYXIgMTksMjAxOSAtICM0ZmQzNzllXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL2ZlbGl4Z2Uvbm9kZS1zdGFjay10cmFjZS9cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5cbi8qKiBEZWNvZGVkIFN0YWNrRnJhbWUgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tGcmFtZSB7XG4gIGZpbGVOYW1lOiBzdHJpbmc7XG4gIGxpbmVOdW1iZXI6IG51bWJlcjtcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHR5cGVOYW1lOiBzdHJpbmc7XG4gIG1ldGhvZE5hbWU6IHN0cmluZztcbiAgbmF0aXZlOiBib29sZWFuO1xuICBjb2x1bW5OdW1iZXI6IG51bWJlcjtcbn1cblxuLyoqIEV4dHJhY3RzIFN0YWNrRnJhbWVzIGZyb20gdGhlIEVycm9yICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2UoZXJyOiBFcnJvcik6IFN0YWNrRnJhbWVbXSB7XG4gIGlmICghZXJyLnN0YWNrKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgbGluZXMgPSBlcnIuc3RhY2suc3BsaXQoJ1xcbicpLnNsaWNlKDEpO1xuXG4gIHJldHVybiBsaW5lc1xuICAgIC5tYXAobGluZSA9PiB7XG4gICAgICBpZiAobGluZS5tYXRjaCgvXlxccypbLV17NCx9JC8pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29sdW1uTnVtYmVyOiBudWxsLFxuICAgICAgICAgIGZpbGVOYW1lOiBsaW5lLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbnVsbCxcbiAgICAgICAgICBsaW5lTnVtYmVyOiBudWxsLFxuICAgICAgICAgIG1ldGhvZE5hbWU6IG51bGwsXG4gICAgICAgICAgbmF0aXZlOiBudWxsLFxuICAgICAgICAgIHR5cGVOYW1lOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5lTWF0Y2ggPSBsaW5lLm1hdGNoKC9hdCAoPzooLis/KVxccytcXCgpPyg/OiguKz8pOihcXGQrKSg/OjooXFxkKykpP3woW14pXSspKVxcKT8vKTtcbiAgICAgIGlmICghbGluZU1hdGNoKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGxldCBvYmplY3QgPSBudWxsO1xuICAgICAgbGV0IG1ldGhvZCA9IG51bGw7XG4gICAgICBsZXQgZnVuY3Rpb25OYW1lID0gbnVsbDtcbiAgICAgIGxldCB0eXBlTmFtZSA9IG51bGw7XG4gICAgICBsZXQgbWV0aG9kTmFtZSA9IG51bGw7XG4gICAgICBjb25zdCBpc05hdGl2ZSA9IGxpbmVNYXRjaFs1XSA9PT0gJ25hdGl2ZSc7XG5cbiAgICAgIGlmIChsaW5lTWF0Y2hbMV0pIHtcbiAgICAgICAgZnVuY3Rpb25OYW1lID0gbGluZU1hdGNoWzFdO1xuICAgICAgICBsZXQgbWV0aG9kU3RhcnQgPSBmdW5jdGlvbk5hbWUubGFzdEluZGV4T2YoJy4nKTtcbiAgICAgICAgaWYgKGZ1bmN0aW9uTmFtZVttZXRob2RTdGFydCAtIDFdID09PSAnLicpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgICAgICBtZXRob2RTdGFydC0tO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZXRob2RTdGFydCA+IDApIHtcbiAgICAgICAgICBvYmplY3QgPSBmdW5jdGlvbk5hbWUuc3Vic3RyKDAsIG1ldGhvZFN0YXJ0KTtcbiAgICAgICAgICBtZXRob2QgPSBmdW5jdGlvbk5hbWUuc3Vic3RyKG1ldGhvZFN0YXJ0ICsgMSk7XG4gICAgICAgICAgY29uc3Qgb2JqZWN0RW5kID0gb2JqZWN0LmluZGV4T2YoJy5Nb2R1bGUnKTtcbiAgICAgICAgICBpZiAob2JqZWN0RW5kID4gMCkge1xuICAgICAgICAgICAgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25OYW1lLnN1YnN0cihvYmplY3RFbmQgKyAxKTtcbiAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5zdWJzdHIoMCwgb2JqZWN0RW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdHlwZU5hbWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgIHR5cGVOYW1lID0gb2JqZWN0O1xuICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kO1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0aG9kID09PSAnPGFub255bW91cz4nKSB7XG4gICAgICAgIG1ldGhvZE5hbWUgPSBudWxsO1xuICAgICAgICBmdW5jdGlvbk5hbWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wZXJ0aWVzID0ge1xuICAgICAgICBjb2x1bW5OdW1iZXI6IHBhcnNlSW50KGxpbmVNYXRjaFs0XSwgMTApIHx8IG51bGwsXG4gICAgICAgIGZpbGVOYW1lOiBsaW5lTWF0Y2hbMl0gfHwgbnVsbCxcbiAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICBsaW5lTnVtYmVyOiBwYXJzZUludChsaW5lTWF0Y2hbM10sIDEwKSB8fCBudWxsLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICBuYXRpdmU6IGlzTmF0aXZlLFxuICAgICAgICB0eXBlTmFtZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICAgIH0pXG4gICAgLmZpbHRlcihjYWxsU2l0ZSA9PiAhIWNhbGxTaXRlKSBhcyBTdGFja0ZyYW1lW107XG59XG4iLCAiaW1wb3J0IHsgRXZlbnQsIEV4Y2VwdGlvbiwgRXh0ZW5kZWRFcnJvciwgU3RhY2tGcmFtZSB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgYWRkQ29udGV4dFRvRnJhbWUsIGJhc2VuYW1lLCBkaXJuYW1lLCBTeW5jUHJvbWlzZSB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBMUlVNYXAgfSBmcm9tICdscnVfbWFwJztcblxuaW1wb3J0ICogYXMgc3RhY2t0cmFjZSBmcm9tICcuL3N0YWNrdHJhY2UnO1xuaW1wb3J0IHsgTm9kZU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgREVGQVVMVF9MSU5FU19PRl9DT05URVhUOiBudW1iZXIgPSA3O1xuY29uc3QgRklMRV9DT05URU5UX0NBQ0hFID0gbmV3IExSVU1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KDEwMCk7XG5cbi8qKlxuICogUmVzZXRzIHRoZSBmaWxlIGNhY2hlLiBFeGlzdHMgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldEZpbGVDb250ZW50Q2FjaGUoKTogdm9pZCB7XG4gIEZJTEVfQ09OVEVOVF9DQUNIRS5jbGVhcigpO1xufVxuXG4vKiogSlNEb2MgKi9cbmZ1bmN0aW9uIGdldEZ1bmN0aW9uKGZyYW1lOiBzdGFja3RyYWNlLlN0YWNrRnJhbWUpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIHJldHVybiBmcmFtZS5mdW5jdGlvbk5hbWUgfHwgYCR7ZnJhbWUudHlwZU5hbWV9LiR7ZnJhbWUubWV0aG9kTmFtZSB8fCAnPGFub255bW91cz4nfWA7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBUaGlzIHNlZW1zIHRvIGhhcHBlbiBzb21ldGltZXMgd2hlbiB1c2luZyAndXNlIHN0cmljdCcsXG4gICAgLy8gc3RlbW1pbmcgZnJvbSBgZ2V0VHlwZU5hbWVgLlxuICAgIC8vIFtUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5ICdjb25zdHJ1Y3Rvcicgb2YgdW5kZWZpbmVkXVxuICAgIHJldHVybiAnPGFub255bW91cz4nO1xuICB9XG59XG5cbmNvbnN0IG1haW5Nb2R1bGU6IHN0cmluZyA9IGAkeyhyZXF1aXJlLm1haW4gJiYgcmVxdWlyZS5tYWluLmZpbGVuYW1lICYmIGRpcm5hbWUocmVxdWlyZS5tYWluLmZpbGVuYW1lKSkgfHxcbiAgZ2xvYmFsLnByb2Nlc3MuY3dkKCl9L2A7XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gZ2V0TW9kdWxlKGZpbGVuYW1lOiBzdHJpbmcsIGJhc2U/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWJhc2UpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICBiYXNlID0gbWFpbk1vZHVsZTtcbiAgfVxuXG4gIC8vIEl0J3Mgc3BlY2lmaWNhbGx5IGEgbW9kdWxlXG4gIGNvbnN0IGZpbGUgPSBiYXNlbmFtZShmaWxlbmFtZSwgJy5qcycpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgZmlsZW5hbWUgPSBkaXJuYW1lKGZpbGVuYW1lKTtcbiAgbGV0IG4gPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignL25vZGVfbW9kdWxlcy8nKTtcbiAgaWYgKG4gPiAtMSkge1xuICAgIC8vIC9ub2RlX21vZHVsZXMvIGlzIDE0IGNoYXJzXG4gICAgcmV0dXJuIGAke2ZpbGVuYW1lLnN1YnN0cihuICsgMTQpLnJlcGxhY2UoL1xcLy9nLCAnLicpfToke2ZpbGV9YDtcbiAgfVxuICAvLyBMZXQncyBzZWUgaWYgaXQncyBhIHBhcnQgb2YgdGhlIG1haW4gbW9kdWxlXG4gIC8vIFRvIGJlIGEgcGFydCBvZiBtYWluIG1vZHVsZSwgaXQgaGFzIHRvIHNoYXJlIHRoZSBzYW1lIGJhc2VcbiAgbiA9IGAke2ZpbGVuYW1lfS9gLmxhc3RJbmRleE9mKGJhc2UsIDApO1xuICBpZiAobiA9PT0gMCkge1xuICAgIGxldCBtb2R1bGVOYW1lID0gZmlsZW5hbWUuc3Vic3RyKGJhc2UubGVuZ3RoKS5yZXBsYWNlKC9cXC8vZywgJy4nKTtcbiAgICBpZiAobW9kdWxlTmFtZSkge1xuICAgICAgbW9kdWxlTmFtZSArPSAnOic7XG4gICAgfVxuICAgIG1vZHVsZU5hbWUgKz0gZmlsZTtcbiAgICByZXR1cm4gbW9kdWxlTmFtZTtcbiAgfVxuICByZXR1cm4gZmlsZTtcbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGZpbGUgY29udGVudHMgYW5kIGNhY2hlcyB0aGVtIGluIGEgZ2xvYmFsIExSVSBjYWNoZS5cbiAqIFJldHVybnMgYSBQcm9taXNlIGZpbGVwYXRoID0+IGNvbnRlbnQgYXJyYXkgZm9yIGFsbCBmaWxlcyB0aGF0IHdlIHdlcmUgYWJsZSB0byByZWFkLlxuICpcbiAqIEBwYXJhbSBmaWxlbmFtZXMgQXJyYXkgb2YgZmlsZXBhdGhzIHRvIHJlYWQgY29udGVudCBmcm9tLlxuICovXG5mdW5jdGlvbiByZWFkU291cmNlRmlsZXMoZmlsZW5hbWVzOiBzdHJpbmdbXSk6IFByb21pc2VMaWtlPHsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVsbCB9PiB7XG4gIC8vIHdlJ3JlIHJlbHlpbmcgb24gZmlsZW5hbWVzIGJlaW5nIGRlLWR1cGVkIGFscmVhZHlcbiAgaWYgKGZpbGVuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gU3luY1Byb21pc2UucmVzb2x2ZSh7fSk7XG4gIH1cblxuICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudWxsO1xuICB9PihyZXNvbHZlID0+IHtcbiAgICBjb25zdCBzb3VyY2VGaWxlczoge1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVsbDtcbiAgICB9ID0ge307XG5cbiAgICBsZXQgY291bnQgPSAwO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBmaWxlbmFtZSA9IGZpbGVuYW1lc1tpXTtcblxuICAgICAgY29uc3QgY2FjaGUgPSBGSUxFX0NPTlRFTlRfQ0FDSEUuZ2V0KGZpbGVuYW1lKTtcbiAgICAgIC8vIFdlIGhhdmUgYSBjYWNoZSBoaXRcbiAgICAgIGlmIChjYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIElmIGl0J3Mgbm90IG51bGwgKHdoaWNoIG1lYW5zIHdlIGZvdW5kIGEgZmlsZSBhbmQgaGF2ZSBhIGNvbnRlbnQpXG4gICAgICAgIC8vIHdlIHNldCB0aGUgY29udGVudCBhbmQgcmV0dXJuIGl0IGxhdGVyLlxuICAgICAgICBpZiAoY2FjaGUgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlc1tmaWxlbmFtZV0gPSBjYWNoZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgLy8gSW4gYW55IGNhc2Ugd2Ugd2FudCB0byBza2lwIGhlcmUgdGhlbiBzaW5jZSB3ZSBoYXZlIGEgY29udGVudCBhbHJlYWR5IG9yIHdlIGNvdWxkbid0XG4gICAgICAgIC8vIHJlYWQgdGhlIGZpbGUgYW5kIGRvbid0IHdhbnQgdG8gdHJ5IGFnYWluLlxuICAgICAgICBpZiAoY291bnQgPT09IGZpbGVuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgICByZXNvbHZlKHNvdXJjZUZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgcmVhZEZpbGUoZmlsZW5hbWUsIChlcnI6IEVycm9yIHwgbnVsbCwgZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBlcnIgPyBudWxsIDogZGF0YS50b1N0cmluZygpO1xuICAgICAgICBzb3VyY2VGaWxlc1tmaWxlbmFtZV0gPSBjb250ZW50O1xuXG4gICAgICAgIC8vIFdlIGFsd2F5cyB3YW50IHRvIHNldCB0aGUgY2FjaGUsIGV2ZW4gdG8gbnVsbCB3aGljaCBtZWFucyB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgZmlsZS5cbiAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdG8gdHJ5IHRvIHJlYWQgdGhlIGZpbGUgYWdhaW4uXG4gICAgICAgIEZJTEVfQ09OVEVOVF9DQUNIRS5zZXQoZmlsZW5hbWUsIGNvbnRlbnQpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXNcbiAgICAgICAgY291bnQrKztcbiAgICAgICAgaWYgKGNvdW50ID09PSBmaWxlbmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgcmVzb2x2ZShzb3VyY2VGaWxlcyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFN0YWNrRnJvbUVycm9yKGVycm9yOiBFcnJvcik6IHN0YWNrdHJhY2UuU3RhY2tGcmFtZVtdIHtcbiAgY29uc3Qgc3RhY2sgPSBzdGFja3RyYWNlLnBhcnNlKGVycm9yKTtcbiAgaWYgKCFzdGFjaykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gc3RhY2s7XG59XG5cbi8qKlxuICogQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdGFjayhzdGFjazogc3RhY2t0cmFjZS5TdGFja0ZyYW1lW10sIG9wdGlvbnM/OiBOb2RlT3B0aW9ucyk6IFByb21pc2VMaWtlPFN0YWNrRnJhbWVbXT4ge1xuICBjb25zdCBmaWxlc1RvUmVhZDogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdCBsaW5lc09mQ29udGV4dCA9XG4gICAgb3B0aW9ucyAmJiBvcHRpb25zLmZyYW1lQ29udGV4dExpbmVzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmZyYW1lQ29udGV4dExpbmVzIDogREVGQVVMVF9MSU5FU19PRl9DT05URVhUO1xuXG4gIGNvbnN0IGZyYW1lczogU3RhY2tGcmFtZVtdID0gc3RhY2subWFwKGZyYW1lID0+IHtcbiAgICBjb25zdCBwYXJzZWRGcmFtZTogU3RhY2tGcmFtZSA9IHtcbiAgICAgIGNvbG5vOiBmcmFtZS5jb2x1bW5OdW1iZXIsXG4gICAgICBmaWxlbmFtZTogZnJhbWUuZmlsZU5hbWU/LnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSA/IGZyYW1lLmZpbGVOYW1lLnN1YnN0cig3KSA6IGZyYW1lLmZpbGVOYW1lIHx8ICcnLFxuICAgICAgZnVuY3Rpb246IGdldEZ1bmN0aW9uKGZyYW1lKSxcbiAgICAgIGxpbmVubzogZnJhbWUubGluZU51bWJlcixcbiAgICB9O1xuXG4gICAgY29uc3QgaXNJbnRlcm5hbCA9XG4gICAgICBmcmFtZS5uYXRpdmUgfHxcbiAgICAgIChwYXJzZWRGcmFtZS5maWxlbmFtZSAmJlxuICAgICAgICAhcGFyc2VkRnJhbWUuZmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpICYmXG4gICAgICAgICFwYXJzZWRGcmFtZS5maWxlbmFtZS5zdGFydHNXaXRoKCcuJykgJiZcbiAgICAgICAgcGFyc2VkRnJhbWUuZmlsZW5hbWUuaW5kZXhPZignOlxcXFwnKSAhPT0gMSk7XG5cbiAgICAvLyBpbl9hcHAgaXMgYWxsIHRoYXQncyBub3QgYW4gaW50ZXJuYWwgTm9kZSBmdW5jdGlvbiBvciBhIG1vZHVsZSB3aXRoaW4gbm9kZV9tb2R1bGVzXG4gICAgLy8gbm90ZSB0aGF0IGlzTmF0aXZlIGFwcGVhcnMgdG8gcmV0dXJuIHRydWUgZXZlbiBmb3Igbm9kZSBjb3JlIGxpYnJhcmllc1xuICAgIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3JhdmVuLW5vZGUvaXNzdWVzLzE3NlxuICAgIHBhcnNlZEZyYW1lLmluX2FwcCA9XG4gICAgICAhaXNJbnRlcm5hbCAmJiBwYXJzZWRGcmFtZS5maWxlbmFtZSAhPT0gdW5kZWZpbmVkICYmIHBhcnNlZEZyYW1lLmZpbGVuYW1lLmluZGV4T2YoJ25vZGVfbW9kdWxlcy8nKSA9PT0gLTE7XG5cbiAgICAvLyBFeHRyYWN0IGEgbW9kdWxlIG5hbWUgYmFzZWQgb24gdGhlIGZpbGVuYW1lXG4gICAgaWYgKHBhcnNlZEZyYW1lLmZpbGVuYW1lKSB7XG4gICAgICBwYXJzZWRGcmFtZS5tb2R1bGUgPSBnZXRNb2R1bGUocGFyc2VkRnJhbWUuZmlsZW5hbWUpO1xuXG4gICAgICBpZiAoIWlzSW50ZXJuYWwgJiYgbGluZXNPZkNvbnRleHQgPiAwICYmIGZpbGVzVG9SZWFkLmluZGV4T2YocGFyc2VkRnJhbWUuZmlsZW5hbWUpID09PSAtMSkge1xuICAgICAgICBmaWxlc1RvUmVhZC5wdXNoKHBhcnNlZEZyYW1lLmZpbGVuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcGFyc2VkRnJhbWU7XG4gIH0pO1xuXG4gIC8vIFdlIGRvIGFuIGVhcmx5IHJldHVybiBpZiB3ZSBkbyBub3Qgd2FudCB0byBmZXRjaCBjb250ZXh0IGxpZW5zXG4gIGlmIChsaW5lc09mQ29udGV4dCA8PSAwKSB7XG4gICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoZnJhbWVzKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGFkZFByZVBvc3RDb250ZXh0KGZpbGVzVG9SZWFkLCBmcmFtZXMsIGxpbmVzT2ZDb250ZXh0KTtcbiAgfSBjYXRjaCAoXykge1xuICAgIC8vIFRoaXMgaGFwcGVucyBpbiBlbGVjdHJvbiBmb3IgZXhhbXBsZSB3aGVyZSB3ZSBhcmUgbm90IGFibGUgdG8gcmVhZCBmaWxlcyBmcm9tIGFzYXIuXG4gICAgLy8gU28gaXQncyBmaW5lLCB3ZSByZWNvdmVyIGJlIGp1c3QgcmV0dXJuaW5nIGFsbCBmcmFtZXMgd2l0aG91dCBwcmUvcG9zdCBjb250ZXh0LlxuICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKGZyYW1lcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIHJlYWQgdGhlIHNvdXJjZSBmaWxlcyArIGFkZGluZyBwcmUgYW5kIHBvc3QgY29udGV4dCAoc291cmNlIGNvZGUpXG4gKiB0byBhIGZyYW1lLlxuICogQHBhcmFtIGZpbGVzVG9SZWFkIHN0cmluZ1tdIG9mIGZpbGVwYXRoc1xuICogQHBhcmFtIGZyYW1lcyBTdGFja0ZyYW1lW10gY29udGFpbmcgYWxsIGZyYW1lc1xuICovXG5mdW5jdGlvbiBhZGRQcmVQb3N0Q29udGV4dChcbiAgZmlsZXNUb1JlYWQ6IHN0cmluZ1tdLFxuICBmcmFtZXM6IFN0YWNrRnJhbWVbXSxcbiAgbGluZXNPZkNvbnRleHQ6IG51bWJlcixcbik6IFByb21pc2VMaWtlPFN0YWNrRnJhbWVbXT4ge1xuICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPFN0YWNrRnJhbWVbXT4ocmVzb2x2ZSA9PlxuICAgIHJlYWRTb3VyY2VGaWxlcyhmaWxlc1RvUmVhZCkudGhlbihzb3VyY2VGaWxlcyA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBmcmFtZXMubWFwKGZyYW1lID0+IHtcbiAgICAgICAgaWYgKGZyYW1lLmZpbGVuYW1lICYmIHNvdXJjZUZpbGVzW2ZyYW1lLmZpbGVuYW1lXSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBsaW5lcyA9IChzb3VyY2VGaWxlc1tmcmFtZS5maWxlbmFtZV0gYXMgc3RyaW5nKS5zcGxpdCgnXFxuJyk7XG5cbiAgICAgICAgICAgIGFkZENvbnRleHRUb0ZyYW1lKGxpbmVzLCBmcmFtZSwgbGluZXNPZkNvbnRleHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIGFub21hbHksIGJlaW5nIGRlZmVuc2l2ZSBpbiBjYXNlXG4gICAgICAgICAgICAvLyB1bmxpa2VseSB0byBldmVyIGhhcHBlbiBpbiBwcmFjdGljZSBidXQgY2FuIGRlZmluaXRlbHkgaGFwcGVuIGluIHRoZW9yeVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnJhbWU7XG4gICAgICB9KTtcblxuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4Y2VwdGlvbkZyb21FcnJvcihlcnJvcjogRXJyb3IsIG9wdGlvbnM/OiBOb2RlT3B0aW9ucyk6IFByb21pc2VMaWtlPEV4Y2VwdGlvbj4ge1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZSB8fCBlcnJvci5jb25zdHJ1Y3Rvci5uYW1lO1xuICBjb25zdCBzdGFjayA9IGV4dHJhY3RTdGFja0Zyb21FcnJvcihlcnJvcik7XG4gIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXhjZXB0aW9uPihyZXNvbHZlID0+XG4gICAgcGFyc2VTdGFjayhzdGFjaywgb3B0aW9ucykudGhlbihmcmFtZXMgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBzdGFja3RyYWNlOiB7XG4gICAgICAgICAgZnJhbWVzOiBwcmVwYXJlRnJhbWVzRm9yRXZlbnQoZnJhbWVzKSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogbmFtZSxcbiAgICAgICAgdmFsdWU6IGVycm9yLm1lc3NhZ2UsXG4gICAgICB9O1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRXJyb3IoZXJyb3I6IEV4dGVuZGVkRXJyb3IsIG9wdGlvbnM/OiBOb2RlT3B0aW9ucyk6IFByb21pc2VMaWtlPEV2ZW50PiB7XG4gIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXZlbnQ+KHJlc29sdmUgPT5cbiAgICBnZXRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyb3IsIG9wdGlvbnMpLnRoZW4oKGV4Y2VwdGlvbjogRXhjZXB0aW9uKSA9PiB7XG4gICAgICByZXNvbHZlKHtcbiAgICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgICAgdmFsdWVzOiBbZXhjZXB0aW9uXSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pLFxuICApO1xufVxuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVGcmFtZXNGb3JFdmVudChzdGFjazogU3RhY2tGcmFtZVtdKTogU3RhY2tGcmFtZVtdIHtcbiAgaWYgKCFzdGFjayB8fCAhc3RhY2subGVuZ3RoKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbGV0IGxvY2FsU3RhY2sgPSBzdGFjaztcbiAgY29uc3QgZmlyc3RGcmFtZUZ1bmN0aW9uID0gbG9jYWxTdGFja1swXS5mdW5jdGlvbiB8fCAnJztcblxuICBpZiAoZmlyc3RGcmFtZUZ1bmN0aW9uLmluZGV4T2YoJ2NhcHR1cmVNZXNzYWdlJykgIT09IC0xIHx8IGZpcnN0RnJhbWVGdW5jdGlvbi5pbmRleE9mKCdjYXB0dXJlRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgbG9jYWxTdGFjayA9IGxvY2FsU3RhY2suc2xpY2UoMSk7XG4gIH1cblxuICAvLyBUaGUgZnJhbWUgd2hlcmUgdGhlIGNyYXNoIGhhcHBlbmVkLCBzaG91bGQgYmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGFycmF5XG4gIHJldHVybiBsb2NhbFN0YWNrLnJldmVyc2UoKTtcbn1cbiIsICIvLyBUT0RPOiBSZW1vdmUgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZSBhbmQgcmVseSBvbmx5IG9uIEBzZW50cnkvY29yZSBTREtfVkVSU0lPTiBhbmQgU2RrTWV0YWRhdGFcbmV4cG9ydCBjb25zdCBTREtfTkFNRSA9ICdzZW50cnkuamF2YXNjcmlwdC5ub2RlJztcbiIsICJpbXBvcnQgeyBBUEksIFNES19WRVJTSU9OIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7XG4gIERzblByb3RvY29sLFxuICBFdmVudCxcbiAgUmVzcG9uc2UsXG4gIFNlbnRyeVJlcXVlc3QsXG4gIFNlbnRyeVJlcXVlc3RUeXBlLFxuICBTZXNzaW9uLFxuICBTZXNzaW9uQWdncmVnYXRlcyxcbiAgU3RhdHVzLFxuICBUcmFuc3BvcnQsXG4gIFRyYW5zcG9ydE9wdGlvbnMsXG59IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyLCBwYXJzZVJldHJ5QWZ0ZXJIZWFkZXIsIFByb21pc2VCdWZmZXIsIFNlbnRyeUVycm9yIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcblxuaW1wb3J0IHsgU0RLX05BTUUgfSBmcm9tICcuLi8uLi92ZXJzaW9uJztcbmltcG9ydCB7IEhUVFBNb2R1bGUgfSBmcm9tICcuL2h0dHAtbW9kdWxlJztcblxuZXhwb3J0IHR5cGUgVVJMUGFydHMgPSBQaWNrPFVSTCwgJ2hvc3RuYW1lJyB8ICdwYXRobmFtZScgfCAncG9ydCcgfCAncHJvdG9jb2wnPjtcbmV4cG9ydCB0eXBlIFVybFBhcnNlciA9ICh1cmw6IHN0cmluZykgPT4gVVJMUGFydHM7XG5cbmNvbnN0IENBVEVHT1JZX01BUFBJTkc6IHtcbiAgW2tleSBpbiBTZW50cnlSZXF1ZXN0VHlwZV06IHN0cmluZztcbn0gPSB7XG4gIGV2ZW50OiAnZXJyb3InLFxuICB0cmFuc2FjdGlvbjogJ3RyYW5zYWN0aW9uJyxcbiAgc2Vzc2lvbjogJ3Nlc3Npb24nLFxuICBhdHRhY2htZW50OiAnYXR0YWNobWVudCcsXG59O1xuXG4vKiogQmFzZSBUcmFuc3BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlVHJhbnNwb3J0IGltcGxlbWVudHMgVHJhbnNwb3J0IHtcbiAgLyoqIFRoZSBBZ2VudCB1c2VkIGZvciBjb3JyZXNwb25kaW5nIHRyYW5zcG9ydCAqL1xuICBwdWJsaWMgbW9kdWxlPzogSFRUUE1vZHVsZTtcblxuICAvKiogVGhlIEFnZW50IHVzZWQgZm9yIGNvcnJlc3BvbmRpbmcgdHJhbnNwb3J0ICovXG4gIHB1YmxpYyBjbGllbnQ/OiBodHRwLkFnZW50IHwgaHR0cHMuQWdlbnQ7XG5cbiAgLyoqIEFQSSBvYmplY3QgKi9cbiAgcHJvdGVjdGVkIF9hcGk6IEFQSTtcblxuICAvKiogQSBzaW1wbGUgYnVmZmVyIGhvbGRpbmcgYWxsIHJlcXVlc3RzLiAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2J1ZmZlcjogUHJvbWlzZUJ1ZmZlcjxSZXNwb25zZT4gPSBuZXcgUHJvbWlzZUJ1ZmZlcigzMCk7XG5cbiAgLyoqIExvY2tzIHRyYW5zcG9ydCBhZnRlciByZWNlaXZpbmcgcmF0ZSBsaW1pdHMgaW4gYSByZXNwb25zZSAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgX3JhdGVMaW1pdHM6IFJlY29yZDxzdHJpbmcsIERhdGU+ID0ge307XG5cbiAgLyoqIENyZWF0ZSBpbnN0YW5jZSBhbmQgc2V0IHRoaXMuZHNuICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuX2FwaSA9IG5ldyBBUEkob3B0aW9ucy5kc24sIG9wdGlvbnMuX21ldGFkYXRhLCBvcHRpb25zLnR1bm5lbCk7XG4gIH1cblxuICAvKiogRGVmYXVsdCBmdW5jdGlvbiB1c2VkIHRvIHBhcnNlIFVSTHMgKi9cbiAgcHVibGljIHVybFBhcnNlcjogVXJsUGFyc2VyID0gdXJsID0+IG5ldyBVUkwodXJsKTtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kRXZlbnQoXzogRXZlbnQpOiBQcm9taXNlTGlrZTxSZXNwb25zZT4ge1xuICAgIHRocm93IG5ldyBTZW50cnlFcnJvcignVHJhbnNwb3J0IENsYXNzIGhhcyB0byBpbXBsZW1lbnQgYHNlbmRFdmVudGAgbWV0aG9kLicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY2xvc2UodGltZW91dD86IG51bWJlcik6IFByb21pc2VMaWtlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmRyYWluKHRpbWVvdXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3RzIHByb3h5IHNldHRpbmdzIGZyb20gY2xpZW50IG9wdGlvbnMgYW5kIGVudiB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEhvbm9ycyBgbm9fcHJveHlgIGVudiB2YXJpYWJsZSB3aXRoIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRvIGFsbG93IGZvciBob3N0cyBleGNsdXNpb24uXG4gICAqXG4gICAqIEFuIG9yZGVyIG9mIHByaW9yaXR5IGZvciBhdmFpbGFibGUgcHJvdG9jb2xzIGlzOlxuICAgKiBgaHR0cGAgID0+IGBvcHRpb25zLmh0dHBQcm94eWAgfCBgcHJvY2Vzcy5lbnYuaHR0cF9wcm94eWBcbiAgICogYGh0dHBzYCA9PiBgb3B0aW9ucy5odHRwc1Byb3h5YCB8IGBvcHRpb25zLmh0dHBQcm94eWAgfCBgcHJvY2Vzcy5lbnYuaHR0cHNfcHJveHlgIHwgYHByb2Nlc3MuZW52Lmh0dHBfcHJveHlgXG4gICAqL1xuICBwcm90ZWN0ZWQgX2dldFByb3h5KHByb3RvY29sOiBEc25Qcm90b2NvbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgeyBub19wcm94eSwgaHR0cF9wcm94eSwgaHR0cHNfcHJveHkgfSA9IHByb2Nlc3MuZW52O1xuICAgIGNvbnN0IHsgaHR0cFByb3h5LCBodHRwc1Byb3h5IH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgY29uc3QgcHJveHkgPSBwcm90b2NvbCA9PT0gJ2h0dHAnID8gaHR0cFByb3h5IHx8IGh0dHBfcHJveHkgOiBodHRwc1Byb3h5IHx8IGh0dHBQcm94eSB8fCBodHRwc19wcm94eSB8fCBodHRwX3Byb3h5O1xuXG4gICAgaWYgKCFub19wcm94eSkge1xuICAgICAgcmV0dXJuIHByb3h5O1xuICAgIH1cblxuICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gdGhpcy5fYXBpLmdldERzbigpO1xuICAgIGZvciAoY29uc3QgbnAgb2Ygbm9fcHJveHkuc3BsaXQoJywnKSkge1xuICAgICAgaWYgKGhvc3QuZW5kc1dpdGgobnApIHx8IGAke2hvc3R9OiR7cG9ydH1gLmVuZHNXaXRoKG5wKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3h5O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBidWlsZCByZXF1ZXN0IG9wdGlvbiBvYmplY3QgdXNlZCBieSByZXF1ZXN0ICovXG4gIHByb3RlY3RlZCBfZ2V0UmVxdWVzdE9wdGlvbnModXJsUGFydHM6IFVSTFBhcnRzKTogaHR0cC5SZXF1ZXN0T3B0aW9ucyB8IGh0dHBzLlJlcXVlc3RPcHRpb25zIHtcbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgLi4udGhpcy5fYXBpLmdldFJlcXVlc3RIZWFkZXJzKFNES19OQU1FLCBTREtfVkVSU0lPTiksXG4gICAgICAuLi50aGlzLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9O1xuICAgIGNvbnN0IHsgaG9zdG5hbWUsIHBhdGhuYW1lLCBwb3J0LCBwcm90b2NvbCB9ID0gdXJsUGFydHM7XG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iLzM4MTQ2ZTcxN2ZlZDJmYWJlM2FhY2I2NTQwZDgzOTQ3NWUwY2UxYzYvbGliL2ludGVybmFsL3VybC5qcyNMMTI2OC1MMTI5MFxuICAgIC8vIFdlIGlnbm9yZSB0aGUgcXVlcnkgc3RyaW5nIG9uIHB1cnBvc2VcbiAgICBjb25zdCBwYXRoID0gYCR7cGF0aG5hbWV9YDtcblxuICAgIHJldHVybiB7XG4gICAgICBhZ2VudDogdGhpcy5jbGllbnQsXG4gICAgICBoZWFkZXJzLFxuICAgICAgaG9zdG5hbWUsXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIHBhdGgsXG4gICAgICBwb3J0LFxuICAgICAgcHJvdG9jb2wsXG4gICAgICAuLi4odGhpcy5vcHRpb25zLmNhQ2VydHMgJiYge1xuICAgICAgICBjYTogZnMucmVhZEZpbGVTeW5jKHRoaXMub3B0aW9ucy5jYUNlcnRzKSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGltZSB0aGF0IGdpdmVuIGNhdGVnb3J5IGlzIGRpc2FibGVkIHVudGlsIGZvciByYXRlIGxpbWl0aW5nXG4gICAqL1xuICBwcm90ZWN0ZWQgX2Rpc2FibGVkVW50aWwocmVxdWVzdFR5cGU6IFNlbnRyeVJlcXVlc3RUeXBlKTogRGF0ZSB7XG4gICAgY29uc3QgY2F0ZWdvcnkgPSBDQVRFR09SWV9NQVBQSU5HW3JlcXVlc3RUeXBlXTtcbiAgICByZXR1cm4gdGhpcy5fcmF0ZUxpbWl0c1tjYXRlZ29yeV0gfHwgdGhpcy5fcmF0ZUxpbWl0cy5hbGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgY2F0ZWdvcnkgaXMgcmF0ZSBsaW1pdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgX2lzUmF0ZUxpbWl0ZWQocmVxdWVzdFR5cGU6IFNlbnRyeVJlcXVlc3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkVW50aWwocmVxdWVzdFR5cGUpID4gbmV3IERhdGUoRGF0ZS5ub3coKSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBpbnRlcm5hbCBfcmF0ZUxpbWl0cyBmcm9tIGluY29taW5nIGhlYWRlcnMuIFJldHVybnMgdHJ1ZSBpZiBoZWFkZXJzIGNvbnRhaW5zIGEgbm9uLWVtcHR5IHJhdGUgbGltaXRpbmcgaGVhZGVyLlxuICAgKi9cbiAgcHJvdGVjdGVkIF9oYW5kbGVSYXRlTGltaXQoaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4pOiBib29sZWFuIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJsSGVhZGVyID0gaGVhZGVyc1sneC1zZW50cnktcmF0ZS1saW1pdHMnXTtcbiAgICBjb25zdCByYUhlYWRlciA9IGhlYWRlcnNbJ3JldHJ5LWFmdGVyJ107XG5cbiAgICBpZiAocmxIZWFkZXIpIHtcbiAgICAgIC8vIHJhdGUgbGltaXQgaGVhZGVycyBhcmUgb2YgdGhlIGZvcm1cbiAgICAgIC8vICAgICA8aGVhZGVyPiw8aGVhZGVyPiwuLlxuICAgICAgLy8gd2hlcmUgZWFjaCA8aGVhZGVyPiBpcyBvZiB0aGUgZm9ybVxuICAgICAgLy8gICAgIDxyZXRyeV9hZnRlcj46IDxjYXRlZ29yaWVzPjogPHNjb3BlPjogPHJlYXNvbl9jb2RlPlxuICAgICAgLy8gd2hlcmVcbiAgICAgIC8vICAgICA8cmV0cnlfYWZ0ZXI+IGlzIGEgZGVsYXkgaW4gbXNcbiAgICAgIC8vICAgICA8Y2F0ZWdvcmllcz4gaXMgdGhlIGV2ZW50IHR5cGUocykgKGVycm9yLCB0cmFuc2FjdGlvbiwgZXRjKSBiZWluZyByYXRlIGxpbWl0ZWQgYW5kIGlzIG9mIHRoZSBmb3JtXG4gICAgICAvLyAgICAgICAgIDxjYXRlZ29yeT47PGNhdGVnb3J5PjsuLi5cbiAgICAgIC8vICAgICA8c2NvcGU+IGlzIHdoYXQncyBiZWluZyBsaW1pdGVkIChvcmcsIHByb2plY3QsIG9yIGtleSkgLSBpZ25vcmVkIGJ5IFNES1xuICAgICAgLy8gICAgIDxyZWFzb25fY29kZT4gaXMgYW4gYXJiaXRyYXJ5IHN0cmluZyBsaWtlIFwib3JnX3F1b3RhXCIgLSBpZ25vcmVkIGJ5IFNES1xuICAgICAgZm9yIChjb25zdCBsaW1pdCBvZiBybEhlYWRlci50cmltKCkuc3BsaXQoJywnKSkge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gbGltaXQuc3BsaXQoJzonLCAyKTtcbiAgICAgICAgY29uc3QgaGVhZGVyRGVsYXkgPSBwYXJzZUludChwYXJhbWV0ZXJzWzBdLCAxMCk7XG4gICAgICAgIGNvbnN0IGRlbGF5ID0gKCFpc05hTihoZWFkZXJEZWxheSkgPyBoZWFkZXJEZWxheSA6IDYwKSAqIDEwMDA7IC8vIDYwc2VjIGRlZmF1bHRcbiAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiAocGFyYW1ldGVyc1sxXSAmJiBwYXJhbWV0ZXJzWzFdLnNwbGl0KCc7JykpIHx8IFsnYWxsJ10pIHtcbiAgICAgICAgICAvLyBjYXRlZ29yaWVzQWxsb3dlZCBpcyBhZGRlZCBoZXJlIHRvIGVuc3VyZSB3ZSBhcmUgb25seSBzdG9yaW5nIHJhdGUgbGltaXRzIGZvciBjYXRlZ29yaWVzIHdlIHN1cHBvcnQgaW4gdGhpc1xuICAgICAgICAgIC8vIHNkayBhbmQgYW55IGNhdGVnb3JpZXMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCB3aWxsIG5vdCBiZSBhZGRlZCByZWR1bmRhbnRseSB0byB0aGUgcmF0ZUxpbWl0cyBvYmplY3RcbiAgICAgICAgICBjb25zdCBjYXRlZ29yaWVzQWxsb3dlZCA9IFtcbiAgICAgICAgICAgIC4uLihPYmplY3Qua2V5cyhDQVRFR09SWV9NQVBQSU5HKSBhcyBbU2VudHJ5UmVxdWVzdFR5cGVdKS5tYXAoayA9PiBDQVRFR09SWV9NQVBQSU5HW2tdKSxcbiAgICAgICAgICAgICdhbGwnLFxuICAgICAgICAgIF07XG4gICAgICAgICAgaWYgKGNhdGVnb3JpZXNBbGxvd2VkLmluY2x1ZGVzKGNhdGVnb3J5KSkgdGhpcy5fcmF0ZUxpbWl0c1tjYXRlZ29yeV0gPSBuZXcgRGF0ZShub3cgKyBkZWxheSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAocmFIZWFkZXIpIHtcbiAgICAgIHRoaXMuX3JhdGVMaW1pdHMuYWxsID0gbmV3IERhdGUobm93ICsgcGFyc2VSZXRyeUFmdGVySGVhZGVyKG5vdywgcmFIZWFkZXIpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogSlNEb2MgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIF9zZW5kKFxuICAgIHNlbnRyeVJlcXVlc3Q6IFNlbnRyeVJlcXVlc3QsXG4gICAgb3JpZ2luYWxQYXlsb2FkPzogRXZlbnQgfCBTZXNzaW9uIHwgU2Vzc2lvbkFnZ3JlZ2F0ZXMsXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBpZiAoIXRoaXMubW9kdWxlKSB7XG4gICAgICB0aHJvdyBuZXcgU2VudHJ5RXJyb3IoJ05vIG1vZHVsZSBhdmFpbGFibGUnKTtcbiAgICB9XG4gICAgaWYgKG9yaWdpbmFsUGF5bG9hZCAmJiB0aGlzLl9pc1JhdGVMaW1pdGVkKHNlbnRyeVJlcXVlc3QudHlwZSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7XG4gICAgICAgIHBheWxvYWQ6IG9yaWdpbmFsUGF5bG9hZCxcbiAgICAgICAgdHlwZTogc2VudHJ5UmVxdWVzdC50eXBlLFxuICAgICAgICByZWFzb246IGBUcmFuc3BvcnQgZm9yICR7c2VudHJ5UmVxdWVzdC50eXBlfSByZXF1ZXN0cyBsb2NrZWQgdGlsbCAke3RoaXMuX2Rpc2FibGVkVW50aWwoXG4gICAgICAgICAgc2VudHJ5UmVxdWVzdC50eXBlLFxuICAgICAgICApfSBkdWUgdG8gdG9vIG1hbnkgcmVxdWVzdHMuYCxcbiAgICAgICAgc3RhdHVzOiA0MjksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyLmFkZChcbiAgICAgICgpID0+XG4gICAgICAgIG5ldyBQcm9taXNlPFJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLm1vZHVsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlbnRyeUVycm9yKCdObyBtb2R1bGUgYXZhaWxhYmxlJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9nZXRSZXF1ZXN0T3B0aW9ucyh0aGlzLnVybFBhcnNlcihzZW50cnlSZXF1ZXN0LnVybCkpO1xuICAgICAgICAgIGNvbnN0IHJlcSA9IHRoaXMubW9kdWxlLnJlcXVlc3Qob3B0aW9ucywgcmVzID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXMuc3RhdHVzQ29kZSB8fCA1MDA7XG4gICAgICAgICAgICBjb25zdCBzdGF0dXMgPSBTdGF0dXMuZnJvbUh0dHBDb2RlKHN0YXR1c0NvZGUpO1xuXG4gICAgICAgICAgICByZXMuc2V0RW5jb2RpbmcoJ3V0ZjgnKTtcblxuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBcIktleS12YWx1ZSBwYWlycyBvZiBoZWFkZXIgbmFtZXMgYW5kIHZhbHVlcy4gSGVhZGVyIG5hbWVzIGFyZSBsb3dlci1jYXNlZC5cIlxuICAgICAgICAgICAgICogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9odHRwLmh0bWwjaHR0cF9tZXNzYWdlX2hlYWRlcnNcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGV0IHJldHJ5QWZ0ZXJIZWFkZXIgPSByZXMuaGVhZGVycyA/IHJlcy5oZWFkZXJzWydyZXRyeS1hZnRlciddIDogJyc7XG4gICAgICAgICAgICByZXRyeUFmdGVySGVhZGVyID0gKEFycmF5LmlzQXJyYXkocmV0cnlBZnRlckhlYWRlcikgPyByZXRyeUFmdGVySGVhZGVyWzBdIDogcmV0cnlBZnRlckhlYWRlcikgYXMgc3RyaW5nO1xuXG4gICAgICAgICAgICBsZXQgcmxIZWFkZXIgPSByZXMuaGVhZGVycyA/IHJlcy5oZWFkZXJzWyd4LXNlbnRyeS1yYXRlLWxpbWl0cyddIDogJyc7XG4gICAgICAgICAgICBybEhlYWRlciA9IChBcnJheS5pc0FycmF5KHJsSGVhZGVyKSA/IHJsSGVhZGVyWzBdIDogcmxIZWFkZXIpIGFzIHN0cmluZztcblxuICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgICAgICAgICAgJ3gtc2VudHJ5LXJhdGUtbGltaXRzJzogcmxIZWFkZXIsXG4gICAgICAgICAgICAgICdyZXRyeS1hZnRlcic6IHJldHJ5QWZ0ZXJIZWFkZXIsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCBsaW1pdGVkID0gdGhpcy5faGFuZGxlUmF0ZUxpbWl0KGhlYWRlcnMpO1xuICAgICAgICAgICAgaWYgKGxpbWl0ZWQpXG4gICAgICAgICAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICAgIGBUb28gbWFueSAke3NlbnRyeVJlcXVlc3QudHlwZX0gcmVxdWVzdHMsIGJhY2tpbmcgb2ZmIHVudGlsOiAke3RoaXMuX2Rpc2FibGVkVW50aWwoXG4gICAgICAgICAgICAgICAgICBzZW50cnlSZXF1ZXN0LnR5cGUsXG4gICAgICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoc3RhdHVzID09PSBTdGF0dXMuU3VjY2Vzcykge1xuICAgICAgICAgICAgICByZXNvbHZlKHsgc3RhdHVzIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGV0IHJlamVjdGlvbk1lc3NhZ2UgPSBgSFRUUCBFcnJvciAoJHtzdGF0dXNDb2RlfSlgO1xuICAgICAgICAgICAgICBpZiAocmVzLmhlYWRlcnMgJiYgcmVzLmhlYWRlcnNbJ3gtc2VudHJ5LWVycm9yJ10pIHtcbiAgICAgICAgICAgICAgICByZWplY3Rpb25NZXNzYWdlICs9IGA6ICR7cmVzLmhlYWRlcnNbJ3gtc2VudHJ5LWVycm9yJ119YDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZWplY3QobmV3IFNlbnRyeUVycm9yKHJlamVjdGlvbk1lc3NhZ2UpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgdGhlIHNvY2tldCB0byBkcmFpblxuICAgICAgICAgICAgcmVzLm9uKCdkYXRhJywgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBEcmFpblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgLy8gRHJhaW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICAgIHJlcS5lbmQoc2VudHJ5UmVxdWVzdC5ib2R5KTtcbiAgICAgICAgfSksXG4gICAgKTtcbiAgfVxufVxuIiwgIi8qKlxuICogSGVscGVycy5cbiAqL1xuXG52YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuXG4vKipcbiAqIFBhcnNlIG9yIGZvcm1hdCB0aGUgZ2l2ZW4gYHZhbGAuXG4gKlxuICogT3B0aW9uczpcbiAqXG4gKiAgLSBgbG9uZ2AgdmVyYm9zZSBmb3JtYXR0aW5nIFtmYWxzZV1cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IHZhbFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHRocm93cyB7RXJyb3J9IHRocm93IGFuIGVycm9yIGlmIHZhbCBpcyBub3QgYSBub24tZW1wdHkgc3RyaW5nIG9yIGEgbnVtYmVyXG4gKiBAcmV0dXJuIHtTdHJpbmd8TnVtYmVyfVxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKHZhbCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsO1xuICBpZiAodHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gcGFyc2UodmFsKTtcbiAgfSBlbHNlIGlmICh0eXBlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSh2YWwpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMubG9uZyA/IGZtdExvbmcodmFsKSA6IGZtdFNob3J0KHZhbCk7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkodmFsKVxuICApO1xufTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgZ2l2ZW4gYHN0cmAgYW5kIHJldHVybiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0clxuICogQHJldHVybiB7TnVtYmVyfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gcGFyc2Uoc3RyKSB7XG4gIHN0ciA9IFN0cmluZyhzdHIpO1xuICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbWF0Y2ggPSAvXigtPyg/OlxcZCspP1xcLj9cXGQrKSAqKG1pbGxpc2Vjb25kcz98bXNlY3M/fG1zfHNlY29uZHM/fHNlY3M/fHN8bWludXRlcz98bWlucz98bXxob3Vycz98aHJzP3xofGRheXM/fGR8d2Vla3M/fHd8eWVhcnM/fHlycz98eSk/JC9pLmV4ZWMoXG4gICAgc3RyXG4gICk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG4gPSBwYXJzZUZsb2F0KG1hdGNoWzFdKTtcbiAgdmFyIHR5cGUgPSAobWF0Y2hbMl0gfHwgJ21zJykudG9Mb3dlckNhc2UoKTtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSAneWVhcnMnOlxuICAgIGNhc2UgJ3llYXInOlxuICAgIGNhc2UgJ3lycyc6XG4gICAgY2FzZSAneXInOlxuICAgIGNhc2UgJ3knOlxuICAgICAgcmV0dXJuIG4gKiB5O1xuICAgIGNhc2UgJ3dlZWtzJzpcbiAgICBjYXNlICd3ZWVrJzpcbiAgICBjYXNlICd3JzpcbiAgICAgIHJldHVybiBuICogdztcbiAgICBjYXNlICdkYXlzJzpcbiAgICBjYXNlICdkYXknOlxuICAgIGNhc2UgJ2QnOlxuICAgICAgcmV0dXJuIG4gKiBkO1xuICAgIGNhc2UgJ2hvdXJzJzpcbiAgICBjYXNlICdob3VyJzpcbiAgICBjYXNlICdocnMnOlxuICAgIGNhc2UgJ2hyJzpcbiAgICBjYXNlICdoJzpcbiAgICAgIHJldHVybiBuICogaDtcbiAgICBjYXNlICdtaW51dGVzJzpcbiAgICBjYXNlICdtaW51dGUnOlxuICAgIGNhc2UgJ21pbnMnOlxuICAgIGNhc2UgJ21pbic6XG4gICAgY2FzZSAnbSc6XG4gICAgICByZXR1cm4gbiAqIG07XG4gICAgY2FzZSAnc2Vjb25kcyc6XG4gICAgY2FzZSAnc2Vjb25kJzpcbiAgICBjYXNlICdzZWNzJzpcbiAgICBjYXNlICdzZWMnOlxuICAgIGNhc2UgJ3MnOlxuICAgICAgcmV0dXJuIG4gKiBzO1xuICAgIGNhc2UgJ21pbGxpc2Vjb25kcyc6XG4gICAgY2FzZSAnbWlsbGlzZWNvbmQnOlxuICAgIGNhc2UgJ21zZWNzJzpcbiAgICBjYXNlICdtc2VjJzpcbiAgICBjYXNlICdtcyc6XG4gICAgICByZXR1cm4gbjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIGQpICsgJ2QnO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBoKSArICdoJztcbiAgfVxuICBpZiAobXNBYnMgPj0gbSkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gIH1cbiAgaWYgKG1zQWJzID49IHMpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIHMpICsgJ3MnO1xuICB9XG4gIHJldHVybiBtcyArICdtcyc7XG59XG5cbi8qKlxuICogTG9uZyBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRMb25nKG1zKSB7XG4gIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgaWYgKG1zQWJzID49IGQpIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBoKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGgsICdob3VyJyk7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgbSwgJ21pbnV0ZScpO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgfVxuICByZXR1cm4gbXMgKyAnIG1zJztcbn1cblxuLyoqXG4gKiBQbHVyYWxpemF0aW9uIGhlbHBlci5cbiAqL1xuXG5mdW5jdGlvbiBwbHVyYWwobXMsIG1zQWJzLCBuLCBuYW1lKSB7XG4gIHZhciBpc1BsdXJhbCA9IG1zQWJzID49IG4gKiAxLjU7XG4gIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIlxuLyoqXG4gKiBUaGlzIGlzIHRoZSBjb21tb24gbG9naWMgZm9yIGJvdGggdGhlIE5vZGUuanMgYW5kIHdlYiBicm93c2VyXG4gKiBpbXBsZW1lbnRhdGlvbnMgb2YgYGRlYnVnKClgLlxuICovXG5cbmZ1bmN0aW9uIHNldHVwKGVudikge1xuXHRjcmVhdGVEZWJ1Zy5kZWJ1ZyA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5kZWZhdWx0ID0gY3JlYXRlRGVidWc7XG5cdGNyZWF0ZURlYnVnLmNvZXJjZSA9IGNvZXJjZTtcblx0Y3JlYXRlRGVidWcuZGlzYWJsZSA9IGRpc2FibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZSA9IGVuYWJsZTtcblx0Y3JlYXRlRGVidWcuZW5hYmxlZCA9IGVuYWJsZWQ7XG5cdGNyZWF0ZURlYnVnLmh1bWFuaXplID0gcmVxdWlyZSgnbXMnKTtcblx0Y3JlYXRlRGVidWcuZGVzdHJveSA9IGRlc3Ryb3k7XG5cblx0T2JqZWN0LmtleXMoZW52KS5mb3JFYWNoKGtleSA9PiB7XG5cdFx0Y3JlYXRlRGVidWdba2V5XSA9IGVudltrZXldO1xuXHR9KTtcblxuXHQvKipcblx0KiBUaGUgY3VycmVudGx5IGFjdGl2ZSBkZWJ1ZyBtb2RlIG5hbWVzLCBhbmQgbmFtZXMgdG8gc2tpcC5cblx0Ki9cblxuXHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRjcmVhdGVEZWJ1Zy5za2lwcyA9IFtdO1xuXG5cdC8qKlxuXHQqIE1hcCBvZiBzcGVjaWFsIFwiJW5cIiBoYW5kbGluZyBmdW5jdGlvbnMsIGZvciB0aGUgZGVidWcgXCJmb3JtYXRcIiBhcmd1bWVudC5cblx0KlxuXHQqIFZhbGlkIGtleSBuYW1lcyBhcmUgYSBzaW5nbGUsIGxvd2VyIG9yIHVwcGVyLWNhc2UgbGV0dGVyLCBpLmUuIFwiblwiIGFuZCBcIk5cIi5cblx0Ki9cblx0Y3JlYXRlRGVidWcuZm9ybWF0dGVycyA9IHt9O1xuXG5cdC8qKlxuXHQqIFNlbGVjdHMgYSBjb2xvciBmb3IgYSBkZWJ1ZyBuYW1lc3BhY2Vcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugc3RyaW5nIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXHRcdGxldCBuYW1lc3BhY2VzQ2FjaGU7XG5cdFx0bGV0IGVuYWJsZWRDYWNoZTtcblxuXHRcdGZ1bmN0aW9uIGRlYnVnKC4uLmFyZ3MpIHtcblx0XHRcdC8vIERpc2FibGVkP1xuXHRcdFx0aWYgKCFkZWJ1Zy5lbmFibGVkKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3Qgc2VsZiA9IGRlYnVnO1xuXG5cdFx0XHQvLyBTZXQgYGRpZmZgIHRpbWVzdGFtcFxuXHRcdFx0Y29uc3QgY3VyciA9IE51bWJlcihuZXcgRGF0ZSgpKTtcblx0XHRcdGNvbnN0IG1zID0gY3VyciAtIChwcmV2VGltZSB8fCBjdXJyKTtcblx0XHRcdHNlbGYuZGlmZiA9IG1zO1xuXHRcdFx0c2VsZi5wcmV2ID0gcHJldlRpbWU7XG5cdFx0XHRzZWxmLmN1cnIgPSBjdXJyO1xuXHRcdFx0cHJldlRpbWUgPSBjdXJyO1xuXG5cdFx0XHRhcmdzWzBdID0gY3JlYXRlRGVidWcuY29lcmNlKGFyZ3NbMF0pO1xuXG5cdFx0XHRpZiAodHlwZW9mIGFyZ3NbMF0gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdC8vIEFueXRoaW5nIGVsc2UgbGV0J3MgaW5zcGVjdCB3aXRoICVPXG5cdFx0XHRcdGFyZ3MudW5zaGlmdCgnJU8nKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQXBwbHkgYW55IGBmb3JtYXR0ZXJzYCB0cmFuc2Zvcm1hdGlvbnNcblx0XHRcdGxldCBpbmRleCA9IDA7XG5cdFx0XHRhcmdzWzBdID0gYXJnc1swXS5yZXBsYWNlKC8lKFthLXpBLVolXSkvZywgKG1hdGNoLCBmb3JtYXQpID0+IHtcblx0XHRcdFx0Ly8gSWYgd2UgZW5jb3VudGVyIGFuIGVzY2FwZWQgJSB0aGVuIGRvbid0IGluY3JlYXNlIHRoZSBhcnJheSBpbmRleFxuXHRcdFx0XHRpZiAobWF0Y2ggPT09ICclJScpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGluZGV4Kys7XG5cdFx0XHRcdGNvbnN0IGZvcm1hdHRlciA9IGNyZWF0ZURlYnVnLmZvcm1hdHRlcnNbZm9ybWF0XTtcblx0XHRcdFx0aWYgKHR5cGVvZiBmb3JtYXR0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0XHRjb25zdCB2YWwgPSBhcmdzW2luZGV4XTtcblx0XHRcdFx0XHRtYXRjaCA9IGZvcm1hdHRlci5jYWxsKHNlbGYsIHZhbCk7XG5cblx0XHRcdFx0XHQvLyBOb3cgd2UgbmVlZCB0byByZW1vdmUgYGFyZ3NbaW5kZXhdYCBzaW5jZSBpdCdzIGlubGluZWQgaW4gdGhlIGBmb3JtYXRgXG5cdFx0XHRcdFx0YXJncy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0XHRcdGluZGV4LS07XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0fSk7XG5cblx0XHRcdC8vIEFwcGx5IGVudi1zcGVjaWZpYyBmb3JtYXR0aW5nIChjb2xvcnMsIGV0Yy4pXG5cdFx0XHRjcmVhdGVEZWJ1Zy5mb3JtYXRBcmdzLmNhbGwoc2VsZiwgYXJncyk7XG5cblx0XHRcdGNvbnN0IGxvZ0ZuID0gc2VsZi5sb2cgfHwgY3JlYXRlRGVidWcubG9nO1xuXHRcdFx0bG9nRm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cdFx0fVxuXG5cdFx0ZGVidWcubmFtZXNwYWNlID0gbmFtZXNwYWNlO1xuXHRcdGRlYnVnLnVzZUNvbG9ycyA9IGNyZWF0ZURlYnVnLnVzZUNvbG9ycygpO1xuXHRcdGRlYnVnLmNvbG9yID0gY3JlYXRlRGVidWcuc2VsZWN0Q29sb3IobmFtZXNwYWNlKTtcblx0XHRkZWJ1Zy5leHRlbmQgPSBleHRlbmQ7XG5cdFx0ZGVidWcuZGVzdHJveSA9IGNyZWF0ZURlYnVnLmRlc3Ryb3k7IC8vIFhYWCBUZW1wb3JhcnkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGRlYnVnLCAnZW5hYmxlZCcsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuXHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdGlmIChlbmFibGVPdmVycmlkZSAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybiBlbmFibGVPdmVycmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAobmFtZXNwYWNlc0NhY2hlICE9PSBjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzKSB7XG5cdFx0XHRcdFx0bmFtZXNwYWNlc0NhY2hlID0gY3JlYXRlRGVidWcubmFtZXNwYWNlcztcblx0XHRcdFx0XHRlbmFibGVkQ2FjaGUgPSBjcmVhdGVEZWJ1Zy5lbmFibGVkKG5hbWVzcGFjZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZW5hYmxlZENhY2hlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogdiA9PiB7XG5cdFx0XHRcdGVuYWJsZU92ZXJyaWRlID0gdjtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdC8vIEVudi1zcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYyBmb3IgZGVidWcgaW5zdGFuY2VzXG5cdFx0aWYgKHR5cGVvZiBjcmVhdGVEZWJ1Zy5pbml0ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRjcmVhdGVEZWJ1Zy5pbml0KGRlYnVnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVidWc7XG5cdH1cblxuXHRmdW5jdGlvbiBleHRlbmQobmFtZXNwYWNlLCBkZWxpbWl0ZXIpIHtcblx0XHRjb25zdCBuZXdEZWJ1ZyA9IGNyZWF0ZURlYnVnKHRoaXMubmFtZXNwYWNlICsgKHR5cGVvZiBkZWxpbWl0ZXIgPT09ICd1bmRlZmluZWQnID8gJzonIDogZGVsaW1pdGVyKSArIG5hbWVzcGFjZSk7XG5cdFx0bmV3RGVidWcubG9nID0gdGhpcy5sb2c7XG5cdFx0cmV0dXJuIG5ld0RlYnVnO1xuXHR9XG5cblx0LyoqXG5cdCogRW5hYmxlcyBhIGRlYnVnIG1vZGUgYnkgbmFtZXNwYWNlcy4gVGhpcyBjYW4gaW5jbHVkZSBtb2Rlc1xuXHQqIHNlcGFyYXRlZCBieSBhIGNvbG9uIGFuZCB3aWxkY2FyZHMuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZShuYW1lc3BhY2VzKSB7XG5cdFx0Y3JlYXRlRGVidWcuc2F2ZShuYW1lc3BhY2VzKTtcblx0XHRjcmVhdGVEZWJ1Zy5uYW1lc3BhY2VzID0gbmFtZXNwYWNlcztcblxuXHRcdGNyZWF0ZURlYnVnLm5hbWVzID0gW107XG5cdFx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHRcdGxldCBpO1xuXHRcdGNvbnN0IHNwbGl0ID0gKHR5cGVvZiBuYW1lc3BhY2VzID09PSAnc3RyaW5nJyA/IG5hbWVzcGFjZXMgOiAnJykuc3BsaXQoL1tcXHMsXSsvKTtcblx0XHRjb25zdCBsZW4gPSBzcGxpdC5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmICghc3BsaXRbaV0pIHtcblx0XHRcdFx0Ly8gaWdub3JlIGVtcHR5IHN0cmluZ3Ncblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdG5hbWVzcGFjZXMgPSBzcGxpdFtpXS5yZXBsYWNlKC9cXCovZywgJy4qPycpO1xuXG5cdFx0XHRpZiAobmFtZXNwYWNlc1swXSA9PT0gJy0nKSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLnNraXBzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzLnN1YnN0cigxKSArICckJykpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y3JlYXRlRGVidWcubmFtZXMucHVzaChuZXcgUmVnRXhwKCdeJyArIG5hbWVzcGFjZXMgKyAnJCcpKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0KiBEaXNhYmxlIGRlYnVnIG91dHB1dC5cblx0KlxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlc1xuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGRpc2FibGUoKSB7XG5cdFx0Y29uc3QgbmFtZXNwYWNlcyA9IFtcblx0XHRcdC4uLmNyZWF0ZURlYnVnLm5hbWVzLm1hcCh0b05hbWVzcGFjZSksXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5za2lwcy5tYXAodG9OYW1lc3BhY2UpLm1hcChuYW1lc3BhY2UgPT4gJy0nICsgbmFtZXNwYWNlKVxuXHRcdF0uam9pbignLCcpO1xuXHRcdGNyZWF0ZURlYnVnLmVuYWJsZSgnJyk7XG5cdFx0cmV0dXJuIG5hbWVzcGFjZXM7XG5cdH1cblxuXHQvKipcblx0KiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIG1vZGUgbmFtZSBpcyBlbmFibGVkLCBmYWxzZSBvdGhlcndpc2UuXG5cdCpcblx0KiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuXHQqIEByZXR1cm4ge0Jvb2xlYW59XG5cdCogQGFwaSBwdWJsaWNcblx0Ki9cblx0ZnVuY3Rpb24gZW5hYmxlZChuYW1lKSB7XG5cdFx0aWYgKG5hbWVbbmFtZS5sZW5ndGggLSAxXSA9PT0gJyonKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRsZXQgaTtcblx0XHRsZXQgbGVuO1xuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcuc2tpcHMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5za2lwc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGkgPSAwLCBsZW4gPSBjcmVhdGVEZWJ1Zy5uYW1lcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdFx0aWYgKGNyZWF0ZURlYnVnLm5hbWVzW2ldLnRlc3QobmFtZSkpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCogQ29udmVydCByZWdleHAgdG8gbmFtZXNwYWNlXG5cdCpcblx0KiBAcGFyYW0ge1JlZ0V4cH0gcmVneGVwXG5cdCogQHJldHVybiB7U3RyaW5nfSBuYW1lc3BhY2Vcblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gdG9OYW1lc3BhY2UocmVnZXhwKSB7XG5cdFx0cmV0dXJuIHJlZ2V4cC50b1N0cmluZygpXG5cdFx0XHQuc3Vic3RyaW5nKDIsIHJlZ2V4cC50b1N0cmluZygpLmxlbmd0aCAtIDIpXG5cdFx0XHQucmVwbGFjZSgvXFwuXFwqXFw/JC8sICcqJyk7XG5cdH1cblxuXHQvKipcblx0KiBDb2VyY2UgYHZhbGAuXG5cdCpcblx0KiBAcGFyYW0ge01peGVkfSB2YWxcblx0KiBAcmV0dXJuIHtNaXhlZH1cblx0KiBAYXBpIHByaXZhdGVcblx0Ki9cblx0ZnVuY3Rpb24gY29lcmNlKHZhbCkge1xuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0cmV0dXJuIHZhbC5zdGFjayB8fCB2YWwubWVzc2FnZTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhbDtcblx0fVxuXG5cdC8qKlxuXHQqIFhYWCBETyBOT1QgVVNFLiBUaGlzIGlzIGEgdGVtcG9yYXJ5IHN0dWIgZnVuY3Rpb24uXG5cdCogWFhYIEl0IFdJTEwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciByZWxlYXNlLlxuXHQqL1xuXHRmdW5jdGlvbiBkZXN0cm95KCkge1xuXHRcdGNvbnNvbGUud2FybignSW5zdGFuY2UgbWV0aG9kIGBkZWJ1Zy5kZXN0cm95KClgIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBkb2VzIGFueXRoaW5nLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBgZGVidWdgLicpO1xuXHR9XG5cblx0Y3JlYXRlRGVidWcuZW5hYmxlKGNyZWF0ZURlYnVnLmxvYWQoKSk7XG5cblx0cmV0dXJuIGNyZWF0ZURlYnVnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNldHVwO1xuIiwgIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCAiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IChmbGFnLCBhcmd2ID0gcHJvY2Vzcy5hcmd2KSA9PiB7XG5cdGNvbnN0IHByZWZpeCA9IGZsYWcuc3RhcnRzV2l0aCgnLScpID8gJycgOiAoZmxhZy5sZW5ndGggPT09IDEgPyAnLScgOiAnLS0nKTtcblx0Y29uc3QgcG9zaXRpb24gPSBhcmd2LmluZGV4T2YocHJlZml4ICsgZmxhZyk7XG5cdGNvbnN0IHRlcm1pbmF0b3JQb3NpdGlvbiA9IGFyZ3YuaW5kZXhPZignLS0nKTtcblx0cmV0dXJuIHBvc2l0aW9uICE9PSAtMSAmJiAodGVybWluYXRvclBvc2l0aW9uID09PSAtMSB8fCBwb3NpdGlvbiA8IHRlcm1pbmF0b3JQb3NpdGlvbik7XG59O1xuIiwgIid1c2Ugc3RyaWN0JztcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbmNvbnN0IHR0eSA9IHJlcXVpcmUoJ3R0eScpO1xuY29uc3QgaGFzRmxhZyA9IHJlcXVpcmUoJ2hhcy1mbGFnJyk7XG5cbmNvbnN0IHtlbnZ9ID0gcHJvY2VzcztcblxubGV0IGZvcmNlQ29sb3I7XG5pZiAoaGFzRmxhZygnbm8tY29sb3InKSB8fFxuXHRoYXNGbGFnKCduby1jb2xvcnMnKSB8fFxuXHRoYXNGbGFnKCdjb2xvcj1mYWxzZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPW5ldmVyJykpIHtcblx0Zm9yY2VDb2xvciA9IDA7XG59IGVsc2UgaWYgKGhhc0ZsYWcoJ2NvbG9yJykgfHxcblx0aGFzRmxhZygnY29sb3JzJykgfHxcblx0aGFzRmxhZygnY29sb3I9dHJ1ZScpIHx8XG5cdGhhc0ZsYWcoJ2NvbG9yPWFsd2F5cycpKSB7XG5cdGZvcmNlQ29sb3IgPSAxO1xufVxuXG5pZiAoJ0ZPUkNFX0NPTE9SJyBpbiBlbnYpIHtcblx0aWYgKGVudi5GT1JDRV9DT0xPUiA9PT0gJ3RydWUnKSB7XG5cdFx0Zm9yY2VDb2xvciA9IDE7XG5cdH0gZWxzZSBpZiAoZW52LkZPUkNFX0NPTE9SID09PSAnZmFsc2UnKSB7XG5cdFx0Zm9yY2VDb2xvciA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0Zm9yY2VDb2xvciA9IGVudi5GT1JDRV9DT0xPUi5sZW5ndGggPT09IDAgPyAxIDogTWF0aC5taW4ocGFyc2VJbnQoZW52LkZPUkNFX0NPTE9SLCAxMCksIDMpO1xuXHR9XG59XG5cbmZ1bmN0aW9uIHRyYW5zbGF0ZUxldmVsKGxldmVsKSB7XG5cdGlmIChsZXZlbCA9PT0gMCkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bGV2ZWwsXG5cdFx0aGFzQmFzaWM6IHRydWUsXG5cdFx0aGFzMjU2OiBsZXZlbCA+PSAyLFxuXHRcdGhhczE2bTogbGV2ZWwgPj0gM1xuXHR9O1xufVxuXG5mdW5jdGlvbiBzdXBwb3J0c0NvbG9yKGhhdmVTdHJlYW0sIHN0cmVhbUlzVFRZKSB7XG5cdGlmIChmb3JjZUNvbG9yID09PSAwKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoaGFzRmxhZygnY29sb3I9MTZtJykgfHxcblx0XHRoYXNGbGFnKCdjb2xvcj1mdWxsJykgfHxcblx0XHRoYXNGbGFnKCdjb2xvcj10cnVlY29sb3InKSkge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKGhhc0ZsYWcoJ2NvbG9yPTI1NicpKSB7XG5cdFx0cmV0dXJuIDI7XG5cdH1cblxuXHRpZiAoaGF2ZVN0cmVhbSAmJiAhc3RyZWFtSXNUVFkgJiYgZm9yY2VDb2xvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRjb25zdCBtaW4gPSBmb3JjZUNvbG9yIHx8IDA7XG5cblx0aWYgKGVudi5URVJNID09PSAnZHVtYicpIHtcblx0XHRyZXR1cm4gbWluO1xuXHR9XG5cblx0aWYgKHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicpIHtcblx0XHQvLyBXaW5kb3dzIDEwIGJ1aWxkIDEwNTg2IGlzIHRoZSBmaXJzdCBXaW5kb3dzIHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAyNTYgY29sb3JzLlxuXHRcdC8vIFdpbmRvd3MgMTAgYnVpbGQgMTQ5MzEgaXMgdGhlIGZpcnN0IHJlbGVhc2UgdGhhdCBzdXBwb3J0cyAxNm0vVHJ1ZUNvbG9yLlxuXHRcdGNvbnN0IG9zUmVsZWFzZSA9IG9zLnJlbGVhc2UoKS5zcGxpdCgnLicpO1xuXHRcdGlmIChcblx0XHRcdE51bWJlcihvc1JlbGVhc2VbMF0pID49IDEwICYmXG5cdFx0XHROdW1iZXIob3NSZWxlYXNlWzJdKSA+PSAxMDU4NlxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIE51bWJlcihvc1JlbGVhc2VbMl0pID49IDE0OTMxID8gMyA6IDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NJJyBpbiBlbnYpIHtcblx0XHRpZiAoWydUUkFWSVMnLCAnQ0lSQ0xFQ0knLCAnQVBQVkVZT1InLCAnR0lUTEFCX0NJJywgJ0dJVEhVQl9BQ1RJT05TJywgJ0JVSUxES0lURSddLnNvbWUoc2lnbiA9PiBzaWduIGluIGVudikgfHwgZW52LkNJX05BTUUgPT09ICdjb2Rlc2hpcCcpIHtcblx0XHRcdHJldHVybiAxO1xuXHRcdH1cblxuXHRcdHJldHVybiBtaW47XG5cdH1cblxuXHRpZiAoJ1RFQU1DSVRZX1ZFUlNJT04nIGluIGVudikge1xuXHRcdHJldHVybiAvXig5XFwuKDAqWzEtOV1cXGQqKVxcLnxcXGR7Mix9XFwuKS8udGVzdChlbnYuVEVBTUNJVFlfVkVSU0lPTikgPyAxIDogMDtcblx0fVxuXG5cdGlmIChlbnYuQ09MT1JURVJNID09PSAndHJ1ZWNvbG9yJykge1xuXHRcdHJldHVybiAzO1xuXHR9XG5cblx0aWYgKCdURVJNX1BST0dSQU0nIGluIGVudikge1xuXHRcdGNvbnN0IHZlcnNpb24gPSBwYXJzZUludCgoZW52LlRFUk1fUFJPR1JBTV9WRVJTSU9OIHx8ICcnKS5zcGxpdCgnLicpWzBdLCAxMCk7XG5cblx0XHRzd2l0Y2ggKGVudi5URVJNX1BST0dSQU0pIHtcblx0XHRcdGNhc2UgJ2lUZXJtLmFwcCc6XG5cdFx0XHRcdHJldHVybiB2ZXJzaW9uID49IDMgPyAzIDogMjtcblx0XHRcdGNhc2UgJ0FwcGxlX1Rlcm1pbmFsJzpcblx0XHRcdFx0cmV0dXJuIDI7XG5cdFx0XHQvLyBObyBkZWZhdWx0XG5cdFx0fVxuXHR9XG5cblx0aWYgKC8tMjU2KGNvbG9yKT8kL2kudGVzdChlbnYuVEVSTSkpIHtcblx0XHRyZXR1cm4gMjtcblx0fVxuXG5cdGlmICgvXnNjcmVlbnxeeHRlcm18XnZ0MTAwfF52dDIyMHxecnh2dHxjb2xvcnxhbnNpfGN5Z3dpbnxsaW51eC9pLnRlc3QoZW52LlRFUk0pKSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRpZiAoJ0NPTE9SVEVSTScgaW4gZW52KSB7XG5cdFx0cmV0dXJuIDE7XG5cdH1cblxuXHRyZXR1cm4gbWluO1xufVxuXG5mdW5jdGlvbiBnZXRTdXBwb3J0TGV2ZWwoc3RyZWFtKSB7XG5cdGNvbnN0IGxldmVsID0gc3VwcG9ydHNDb2xvcihzdHJlYW0sIHN0cmVhbSAmJiBzdHJlYW0uaXNUVFkpO1xuXHRyZXR1cm4gdHJhbnNsYXRlTGV2ZWwobGV2ZWwpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0c3VwcG9ydHNDb2xvcjogZ2V0U3VwcG9ydExldmVsLFxuXHRzdGRvdXQ6IHRyYW5zbGF0ZUxldmVsKHN1cHBvcnRzQ29sb3IodHJ1ZSwgdHR5LmlzYXR0eSgxKSkpLFxuXHRzdGRlcnI6IHRyYW5zbGF0ZUxldmVsKHN1cHBvcnRzQ29sb3IodHJ1ZSwgdHR5LmlzYXR0eSgyKSkpXG59O1xuIiwgIi8qKlxuICogTW9kdWxlIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5jb25zdCB0dHkgPSByZXF1aXJlKCd0dHknKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgTm9kZS5qcyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbmV4cG9ydHMubG9nID0gbG9nO1xuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLmRlc3Ryb3kgPSB1dGlsLmRlcHJlY2F0ZShcblx0KCkgPT4ge30sXG5cdCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJ1xuKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbNiwgMiwgMywgNCwgNSwgMV07XG5cbnRyeSB7XG5cdC8vIE9wdGlvbmFsIGRlcGVuZGVuY3kgKGFzIGluLCBkb2Vzbid0IG5lZWQgdG8gYmUgaW5zdGFsbGVkLCBOT1QgbGlrZSBvcHRpb25hbERlcGVuZGVuY2llcyBpbiBwYWNrYWdlLmpzb24pXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcblx0Y29uc3Qgc3VwcG9ydHNDb2xvciA9IHJlcXVpcmUoJ3N1cHBvcnRzLWNvbG9yJyk7XG5cblx0aWYgKHN1cHBvcnRzQ29sb3IgJiYgKHN1cHBvcnRzQ29sb3Iuc3RkZXJyIHx8IHN1cHBvcnRzQ29sb3IpLmxldmVsID49IDIpIHtcblx0XHRleHBvcnRzLmNvbG9ycyA9IFtcblx0XHRcdDIwLFxuXHRcdFx0MjEsXG5cdFx0XHQyNixcblx0XHRcdDI3LFxuXHRcdFx0MzIsXG5cdFx0XHQzMyxcblx0XHRcdDM4LFxuXHRcdFx0MzksXG5cdFx0XHQ0MCxcblx0XHRcdDQxLFxuXHRcdFx0NDIsXG5cdFx0XHQ0Myxcblx0XHRcdDQ0LFxuXHRcdFx0NDUsXG5cdFx0XHQ1Nixcblx0XHRcdDU3LFxuXHRcdFx0NjIsXG5cdFx0XHQ2Myxcblx0XHRcdDY4LFxuXHRcdFx0NjksXG5cdFx0XHQ3NCxcblx0XHRcdDc1LFxuXHRcdFx0NzYsXG5cdFx0XHQ3Nyxcblx0XHRcdDc4LFxuXHRcdFx0NzksXG5cdFx0XHQ4MCxcblx0XHRcdDgxLFxuXHRcdFx0OTIsXG5cdFx0XHQ5Myxcblx0XHRcdDk4LFxuXHRcdFx0OTksXG5cdFx0XHQxMTIsXG5cdFx0XHQxMTMsXG5cdFx0XHQxMjgsXG5cdFx0XHQxMjksXG5cdFx0XHQxMzQsXG5cdFx0XHQxMzUsXG5cdFx0XHQxNDgsXG5cdFx0XHQxNDksXG5cdFx0XHQxNjAsXG5cdFx0XHQxNjEsXG5cdFx0XHQxNjIsXG5cdFx0XHQxNjMsXG5cdFx0XHQxNjQsXG5cdFx0XHQxNjUsXG5cdFx0XHQxNjYsXG5cdFx0XHQxNjcsXG5cdFx0XHQxNjgsXG5cdFx0XHQxNjksXG5cdFx0XHQxNzAsXG5cdFx0XHQxNzEsXG5cdFx0XHQxNzIsXG5cdFx0XHQxNzMsXG5cdFx0XHQxNzgsXG5cdFx0XHQxNzksXG5cdFx0XHQxODQsXG5cdFx0XHQxODUsXG5cdFx0XHQxOTYsXG5cdFx0XHQxOTcsXG5cdFx0XHQxOTgsXG5cdFx0XHQxOTksXG5cdFx0XHQyMDAsXG5cdFx0XHQyMDEsXG5cdFx0XHQyMDIsXG5cdFx0XHQyMDMsXG5cdFx0XHQyMDQsXG5cdFx0XHQyMDUsXG5cdFx0XHQyMDYsXG5cdFx0XHQyMDcsXG5cdFx0XHQyMDgsXG5cdFx0XHQyMDksXG5cdFx0XHQyMTQsXG5cdFx0XHQyMTUsXG5cdFx0XHQyMjAsXG5cdFx0XHQyMjFcblx0XHRdO1xuXHR9XG59IGNhdGNoIChlcnJvcikge1xuXHQvLyBTd2FsbG93IC0gd2Ugb25seSBjYXJlIGlmIGBzdXBwb3J0cy1jb2xvcmAgaXMgYXZhaWxhYmxlOyBpdCBkb2Vzbid0IGhhdmUgdG8gYmUuXG59XG5cbi8qKlxuICogQnVpbGQgdXAgdGhlIGRlZmF1bHQgYGluc3BlY3RPcHRzYCBvYmplY3QgZnJvbSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICpcbiAqICAgJCBERUJVR19DT0xPUlM9bm8gREVCVUdfREVQVEg9MTAgREVCVUdfU0hPV19ISURERU49ZW5hYmxlZCBub2RlIHNjcmlwdC5qc1xuICovXG5cbmV4cG9ydHMuaW5zcGVjdE9wdHMgPSBPYmplY3Qua2V5cyhwcm9jZXNzLmVudikuZmlsdGVyKGtleSA9PiB7XG5cdHJldHVybiAvXmRlYnVnXy9pLnRlc3Qoa2V5KTtcbn0pLnJlZHVjZSgob2JqLCBrZXkpID0+IHtcblx0Ly8gQ2FtZWwtY2FzZVxuXHRjb25zdCBwcm9wID0ga2V5XG5cdFx0LnN1YnN0cmluZyg2KVxuXHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0LnJlcGxhY2UoL18oW2Etel0pL2csIChfLCBrKSA9PiB7XG5cdFx0XHRyZXR1cm4gay50b1VwcGVyQ2FzZSgpO1xuXHRcdH0pO1xuXG5cdC8vIENvZXJjZSBzdHJpbmcgdmFsdWUgaW50byBKUyB2YWx1ZVxuXHRsZXQgdmFsID0gcHJvY2Vzcy5lbnZba2V5XTtcblx0aWYgKC9eKHllc3xvbnx0cnVlfGVuYWJsZWQpJC9pLnRlc3QodmFsKSkge1xuXHRcdHZhbCA9IHRydWU7XG5cdH0gZWxzZSBpZiAoL14obm98b2ZmfGZhbHNlfGRpc2FibGVkKSQvaS50ZXN0KHZhbCkpIHtcblx0XHR2YWwgPSBmYWxzZTtcblx0fSBlbHNlIGlmICh2YWwgPT09ICdudWxsJykge1xuXHRcdHZhbCA9IG51bGw7XG5cdH0gZWxzZSB7XG5cdFx0dmFsID0gTnVtYmVyKHZhbCk7XG5cdH1cblxuXHRvYmpbcHJvcF0gPSB2YWw7XG5cdHJldHVybiBvYmo7XG59LCB7fSk7XG5cbi8qKlxuICogSXMgc3Rkb3V0IGEgVFRZPyBDb2xvcmVkIG91dHB1dCBpcyBlbmFibGVkIHdoZW4gYHRydWVgLlxuICovXG5cbmZ1bmN0aW9uIHVzZUNvbG9ycygpIHtcblx0cmV0dXJuICdjb2xvcnMnIGluIGV4cG9ydHMuaW5zcGVjdE9wdHMgP1xuXHRcdEJvb2xlYW4oZXhwb3J0cy5pbnNwZWN0T3B0cy5jb2xvcnMpIDpcblx0XHR0dHkuaXNhdHR5KHByb2Nlc3Muc3RkZXJyLmZkKTtcbn1cblxuLyoqXG4gKiBBZGRzIEFOU0kgY29sb3IgZXNjYXBlIGNvZGVzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0Y29uc3Qge25hbWVzcGFjZTogbmFtZSwgdXNlQ29sb3JzfSA9IHRoaXM7XG5cblx0aWYgKHVzZUNvbG9ycykge1xuXHRcdGNvbnN0IGMgPSB0aGlzLmNvbG9yO1xuXHRcdGNvbnN0IGNvbG9yQ29kZSA9ICdcXHUwMDFCWzMnICsgKGMgPCA4ID8gYyA6ICc4OzU7JyArIGMpO1xuXHRcdGNvbnN0IHByZWZpeCA9IGAgICR7Y29sb3JDb2RlfTsxbSR7bmFtZX0gXFx1MDAxQlswbWA7XG5cblx0XHRhcmdzWzBdID0gcHJlZml4ICsgYXJnc1swXS5zcGxpdCgnXFxuJykuam9pbignXFxuJyArIHByZWZpeCk7XG5cdFx0YXJncy5wdXNoKGNvbG9yQ29kZSArICdtKycgKyBtb2R1bGUuZXhwb3J0cy5odW1hbml6ZSh0aGlzLmRpZmYpICsgJ1xcdTAwMUJbMG0nKTtcblx0fSBlbHNlIHtcblx0XHRhcmdzWzBdID0gZ2V0RGF0ZSgpICsgbmFtZSArICcgJyArIGFyZ3NbMF07XG5cdH1cbn1cblxuZnVuY3Rpb24gZ2V0RGF0ZSgpIHtcblx0aWYgKGV4cG9ydHMuaW5zcGVjdE9wdHMuaGlkZURhdGUpIHtcblx0XHRyZXR1cm4gJyc7XG5cdH1cblx0cmV0dXJuIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSArICcgJztcbn1cblxuLyoqXG4gKiBJbnZva2VzIGB1dGlsLmZvcm1hdCgpYCB3aXRoIHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIGFuZCB3cml0ZXMgdG8gc3RkZXJyLlxuICovXG5cbmZ1bmN0aW9uIGxvZyguLi5hcmdzKSB7XG5cdHJldHVybiBwcm9jZXNzLnN0ZGVyci53cml0ZSh1dGlsLmZvcm1hdCguLi5hcmdzKSArICdcXG4nKTtcbn1cblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHRpZiAobmFtZXNwYWNlcykge1xuXHRcdHByb2Nlc3MuZW52LkRFQlVHID0gbmFtZXNwYWNlcztcblx0fSBlbHNlIHtcblx0XHQvLyBJZiB5b3Ugc2V0IGEgcHJvY2Vzcy5lbnYgZmllbGQgdG8gbnVsbCBvciB1bmRlZmluZWQsIGl0IGdldHMgY2FzdCB0byB0aGVcblx0XHQvLyBzdHJpbmcgJ251bGwnIG9yICd1bmRlZmluZWQnLiBKdXN0IGRlbGV0ZSBpbnN0ZWFkLlxuXHRcdGRlbGV0ZSBwcm9jZXNzLmVudi5ERUJVRztcblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGxvYWQoKSB7XG5cdHJldHVybiBwcm9jZXNzLmVudi5ERUJVRztcbn1cblxuLyoqXG4gKiBJbml0IGxvZ2ljIGZvciBgZGVidWdgIGluc3RhbmNlcy5cbiAqXG4gKiBDcmVhdGUgYSBuZXcgYGluc3BlY3RPcHRzYCBvYmplY3QgaW4gY2FzZSBgdXNlQ29sb3JzYCBpcyBzZXRcbiAqIGRpZmZlcmVudGx5IGZvciBhIHBhcnRpY3VsYXIgYGRlYnVnYCBpbnN0YW5jZS5cbiAqL1xuXG5mdW5jdGlvbiBpbml0KGRlYnVnKSB7XG5cdGRlYnVnLmluc3BlY3RPcHRzID0ge307XG5cblx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGV4cG9ydHMuaW5zcGVjdE9wdHMpO1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRkZWJ1Zy5pbnNwZWN0T3B0c1trZXlzW2ldXSA9IGV4cG9ydHMuaW5zcGVjdE9wdHNba2V5c1tpXV07XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJW8gdG8gYHV0aWwuaW5zcGVjdCgpYCwgYWxsIG9uIGEgc2luZ2xlIGxpbmUuXG4gKi9cblxuZm9ybWF0dGVycy5vID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKVxuXHRcdC5zcGxpdCgnXFxuJylcblx0XHQubWFwKHN0ciA9PiBzdHIudHJpbSgpKVxuXHRcdC5qb2luKCcgJyk7XG59O1xuXG4vKipcbiAqIE1hcCAlTyB0byBgdXRpbC5pbnNwZWN0KClgLCBhbGxvd2luZyBtdWx0aXBsZSBsaW5lcyBpZiBuZWVkZWQuXG4gKi9cblxuZm9ybWF0dGVycy5PID0gZnVuY3Rpb24gKHYpIHtcblx0dGhpcy5pbnNwZWN0T3B0cy5jb2xvcnMgPSB0aGlzLnVzZUNvbG9ycztcblx0cmV0dXJuIHV0aWwuaW5zcGVjdCh2LCB0aGlzLmluc3BlY3RPcHRzKTtcbn07XG4iLCAiLyoqXG4gKiBEZXRlY3QgRWxlY3Ryb24gcmVuZGVyZXIgLyBud2pzIHByb2Nlc3MsIHdoaWNoIGlzIG5vZGUsIGJ1dCB3ZSBzaG91bGRcbiAqIHRyZWF0IGFzIGEgYnJvd3Nlci5cbiAqL1xuXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICd1bmRlZmluZWQnIHx8IHByb2Nlc3MudHlwZSA9PT0gJ3JlbmRlcmVyJyB8fCBwcm9jZXNzLmJyb3dzZXIgPT09IHRydWUgfHwgcHJvY2Vzcy5fX253anMpIHtcblx0bW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2Jyb3dzZXIuanMnKTtcbn0gZWxzZSB7XG5cdG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9ub2RlLmpzJyk7XG59XG4iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiaW1wb3J0IHsgZXZlbnRUb1NlbnRyeVJlcXVlc3QsIHNlc3Npb25Ub1NlbnRyeVJlcXVlc3QgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgRXZlbnQsIFJlc3BvbnNlLCBTZXNzaW9uLCBTZXNzaW9uQWdncmVnYXRlcywgVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcblxuaW1wb3J0IHsgQmFzZVRyYW5zcG9ydCB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKiBOb2RlIGh0dHAgbW9kdWxlIHRyYW5zcG9ydCAqL1xuZXhwb3J0IGNsYXNzIEhUVFBUcmFuc3BvcnQgZXh0ZW5kcyBCYXNlVHJhbnNwb3J0IHtcbiAgLyoqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBhbmQgc2V0IHRoaXMuYWdlbnQgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBvcHRpb25zOiBUcmFuc3BvcnRPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgY29uc3QgcHJveHkgPSB0aGlzLl9nZXRQcm94eSgnaHR0cCcpO1xuICAgIHRoaXMubW9kdWxlID0gaHR0cDtcbiAgICB0aGlzLmNsaWVudCA9IHByb3h5XG4gICAgICA/IChuZXcgKHJlcXVpcmUoJ2h0dHBzLXByb3h5LWFnZW50JykpKHByb3h5KSBhcyBodHRwLkFnZW50KVxuICAgICAgOiBuZXcgaHR0cC5BZ2VudCh7IGtlZXBBbGl2ZTogZmFsc2UsIG1heFNvY2tldHM6IDMwLCB0aW1lb3V0OiAyMDAwIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZEV2ZW50KGV2ZW50OiBFdmVudCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZChldmVudFRvU2VudHJ5UmVxdWVzdChldmVudCwgdGhpcy5fYXBpKSwgZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2VuZFNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbiB8IFNlc3Npb25BZ2dyZWdhdGVzKTogUHJvbWlzZUxpa2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZChzZXNzaW9uVG9TZW50cnlSZXF1ZXN0KHNlc3Npb24sIHRoaXMuX2FwaSksIHNlc3Npb24pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZXZlbnRUb1NlbnRyeVJlcXVlc3QsIHNlc3Npb25Ub1NlbnRyeVJlcXVlc3QgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgRXZlbnQsIFJlc3BvbnNlLCBTZXNzaW9uLCBTZXNzaW9uQWdncmVnYXRlcywgVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuXG5pbXBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcblxuLyoqIE5vZGUgaHR0cHMgbW9kdWxlIHRyYW5zcG9ydCAqL1xuZXhwb3J0IGNsYXNzIEhUVFBTVHJhbnNwb3J0IGV4dGVuZHMgQmFzZVRyYW5zcG9ydCB7XG4gIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgYW5kIHNldCB0aGlzLmFnZW50ICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgb3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIGNvbnN0IHByb3h5ID0gdGhpcy5fZ2V0UHJveHkoJ2h0dHBzJyk7XG4gICAgdGhpcy5tb2R1bGUgPSBodHRwcztcbiAgICB0aGlzLmNsaWVudCA9IHByb3h5XG4gICAgICA/IChuZXcgKHJlcXVpcmUoJ2h0dHBzLXByb3h5LWFnZW50JykpKHByb3h5KSBhcyBodHRwcy5BZ2VudClcbiAgICAgIDogbmV3IGh0dHBzLkFnZW50KHsga2VlcEFsaXZlOiBmYWxzZSwgbWF4U29ja2V0czogMzAsIHRpbWVvdXQ6IDIwMDAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kRXZlbnQoZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9zZW5kKGV2ZW50VG9TZW50cnlSZXF1ZXN0KGV2ZW50LCB0aGlzLl9hcGkpLCBldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZW5kU2Vzc2lvbihzZXNzaW9uOiBTZXNzaW9uIHwgU2Vzc2lvbkFnZ3JlZ2F0ZXMpOiBQcm9taXNlTGlrZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLl9zZW5kKHNlc3Npb25Ub1NlbnRyeVJlcXVlc3Qoc2Vzc2lvbiwgdGhpcy5fYXBpKSwgc2Vzc2lvbik7XG4gIH1cbn1cbiIsICJleHBvcnQgeyBCYXNlVHJhbnNwb3J0IH0gZnJvbSAnLi9iYXNlJztcbmV4cG9ydCB7IEhUVFBUcmFuc3BvcnQgfSBmcm9tICcuL2h0dHAnO1xuZXhwb3J0IHsgSFRUUFNUcmFuc3BvcnQgfSBmcm9tICcuL2h0dHBzJztcbiIsICJpbXBvcnQgeyBCYXNlQmFja2VuZCwgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBFdmVudCwgRXZlbnRIaW50LCBNZWNoYW5pc20sIFNldmVyaXR5LCBUcmFuc3BvcnQsIFRyYW5zcG9ydE9wdGlvbnMgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7XG4gIGFkZEV4Y2VwdGlvbk1lY2hhbmlzbSxcbiAgYWRkRXhjZXB0aW9uVHlwZVZhbHVlLFxuICBEc24sXG4gIGV4dHJhY3RFeGNlcHRpb25LZXlzRm9yTWVzc2FnZSxcbiAgaXNFcnJvcixcbiAgaXNQbGFpbk9iamVjdCxcbiAgbm9ybWFsaXplVG9TaXplLFxuICBTeW5jUHJvbWlzZSxcbn0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IGV4dHJhY3RTdGFja0Zyb21FcnJvciwgcGFyc2VFcnJvciwgcGFyc2VTdGFjaywgcHJlcGFyZUZyYW1lc0ZvckV2ZW50IH0gZnJvbSAnLi9wYXJzZXJzJztcbmltcG9ydCB7IEhUVFBTVHJhbnNwb3J0LCBIVFRQVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnRzJztcbmltcG9ydCB7IE5vZGVPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIFNlbnRyeSBOb2RlIFNESyBCYWNrZW5kLlxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgTm9kZUJhY2tlbmQgZXh0ZW5kcyBCYXNlQmFja2VuZDxOb2RlT3B0aW9ucz4ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55LCBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG4gIHB1YmxpYyBldmVudEZyb21FeGNlcHRpb24oZXhjZXB0aW9uOiBhbnksIGhpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudD4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgbGV0IGV4OiBhbnkgPSBleGNlcHRpb247XG4gICAgY29uc3QgcHJvdmlkZWRNZWNoYW5pc206IE1lY2hhbmlzbSB8IHVuZGVmaW5lZCA9XG4gICAgICBoaW50ICYmIGhpbnQuZGF0YSAmJiAoaGludC5kYXRhIGFzIHsgbWVjaGFuaXNtOiBNZWNoYW5pc20gfSkubWVjaGFuaXNtO1xuICAgIGNvbnN0IG1lY2hhbmlzbTogTWVjaGFuaXNtID0gcHJvdmlkZWRNZWNoYW5pc20gfHwge1xuICAgICAgaGFuZGxlZDogdHJ1ZSxcbiAgICAgIHR5cGU6ICdnZW5lcmljJyxcbiAgICB9O1xuXG4gICAgaWYgKCFpc0Vycm9yKGV4Y2VwdGlvbikpIHtcbiAgICAgIGlmIChpc1BsYWluT2JqZWN0KGV4Y2VwdGlvbikpIHtcbiAgICAgICAgLy8gVGhpcyB3aWxsIGFsbG93IHVzIHRvIGdyb3VwIGV2ZW50cyBiYXNlZCBvbiB0b3AtbGV2ZWwga2V5c1xuICAgICAgICAvLyB3aGljaCBpcyBtdWNoIGJldHRlciB0aGFuIGNyZWF0aW5nIG5ldyBncm91cCB3aGVuIGFueSBrZXkvdmFsdWUgY2hhbmdlXG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgTm9uLUVycm9yIGV4Y2VwdGlvbiBjYXB0dXJlZCB3aXRoIGtleXM6ICR7ZXh0cmFjdEV4Y2VwdGlvbktleXNGb3JNZXNzYWdlKGV4Y2VwdGlvbil9YDtcblxuICAgICAgICBnZXRDdXJyZW50SHViKCkuY29uZmlndXJlU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICAgIHNjb3BlLnNldEV4dHJhKCdfX3NlcmlhbGl6ZWRfXycsIG5vcm1hbGl6ZVRvU2l6ZShleGNlcHRpb24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXggPSAoaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikgfHwgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAoZXggYXMgRXJyb3IpLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBoYW5kbGVzIHdoZW4gc29tZW9uZSBkb2VzOiBgdGhyb3cgXCJzb21ldGhpbmcgYXdlc29tZVwiO2BcbiAgICAgICAgLy8gV2UgdXNlIHN5bnRoZXNpemVkIEVycm9yIGhlcmUgc28gd2UgY2FuIGV4dHJhY3QgYSAocm91Z2gpIHN0YWNrIHRyYWNlLlxuICAgICAgICBleCA9IChoaW50ICYmIGhpbnQuc3ludGhldGljRXhjZXB0aW9uKSB8fCBuZXcgRXJyb3IoZXhjZXB0aW9uIGFzIHN0cmluZyk7XG4gICAgICAgIChleCBhcyBFcnJvcikubWVzc2FnZSA9IGV4Y2VwdGlvbjtcbiAgICAgIH1cbiAgICAgIG1lY2hhbmlzbS5zeW50aGV0aWMgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXZlbnQ+KChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICBwYXJzZUVycm9yKGV4IGFzIEVycm9yLCB0aGlzLl9vcHRpb25zKVxuICAgICAgICAudGhlbihldmVudCA9PiB7XG4gICAgICAgICAgYWRkRXhjZXB0aW9uVHlwZVZhbHVlKGV2ZW50LCB1bmRlZmluZWQsIHVuZGVmaW5lZCk7XG4gICAgICAgICAgYWRkRXhjZXB0aW9uTWVjaGFuaXNtKGV2ZW50LCBtZWNoYW5pc20pO1xuXG4gICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICAgIGV2ZW50X2lkOiBoaW50ICYmIGhpbnQuZXZlbnRfaWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKG51bGwsIHJlamVjdCksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGV2ZW50RnJvbU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCBsZXZlbDogU2V2ZXJpdHkgPSBTZXZlcml0eS5JbmZvLCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICBjb25zdCBldmVudDogRXZlbnQgPSB7XG4gICAgICBldmVudF9pZDogaGludCAmJiBoaW50LmV2ZW50X2lkLFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlLFxuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFN5bmNQcm9taXNlPEV2ZW50PihyZXNvbHZlID0+IHtcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmF0dGFjaFN0YWNrdHJhY2UgJiYgaGludCAmJiBoaW50LnN5bnRoZXRpY0V4Y2VwdGlvbikge1xuICAgICAgICBjb25zdCBzdGFjayA9IGhpbnQuc3ludGhldGljRXhjZXB0aW9uID8gZXh0cmFjdFN0YWNrRnJvbUVycm9yKGhpbnQuc3ludGhldGljRXhjZXB0aW9uKSA6IFtdO1xuICAgICAgICB2b2lkIHBhcnNlU3RhY2soc3RhY2ssIHRoaXMuX29wdGlvbnMpXG4gICAgICAgICAgLnRoZW4oZnJhbWVzID0+IHtcbiAgICAgICAgICAgIGV2ZW50LnN0YWNrdHJhY2UgPSB7XG4gICAgICAgICAgICAgIGZyYW1lczogcHJlcGFyZUZyYW1lc0ZvckV2ZW50KGZyYW1lcyksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihudWxsLCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcm90ZWN0ZWQgX3NldHVwVHJhbnNwb3J0KCk6IFRyYW5zcG9ydCB7XG4gICAgaWYgKCF0aGlzLl9vcHRpb25zLmRzbikge1xuICAgICAgLy8gV2UgcmV0dXJuIHRoZSBub29wIHRyYW5zcG9ydCBoZXJlIGluIGNhc2UgdGhlcmUgaXMgbm8gRHNuLlxuICAgICAgcmV0dXJuIHN1cGVyLl9zZXR1cFRyYW5zcG9ydCgpO1xuICAgIH1cblxuICAgIGNvbnN0IGRzbiA9IG5ldyBEc24odGhpcy5fb3B0aW9ucy5kc24pO1xuXG4gICAgY29uc3QgdHJhbnNwb3J0T3B0aW9uczogVHJhbnNwb3J0T3B0aW9ucyA9IHtcbiAgICAgIC4uLnRoaXMuX29wdGlvbnMudHJhbnNwb3J0T3B0aW9ucyxcbiAgICAgIC4uLih0aGlzLl9vcHRpb25zLmh0dHBQcm94eSAmJiB7IGh0dHBQcm94eTogdGhpcy5fb3B0aW9ucy5odHRwUHJveHkgfSksXG4gICAgICAuLi4odGhpcy5fb3B0aW9ucy5odHRwc1Byb3h5ICYmIHsgaHR0cHNQcm94eTogdGhpcy5fb3B0aW9ucy5odHRwc1Byb3h5IH0pLFxuICAgICAgLi4uKHRoaXMuX29wdGlvbnMuY2FDZXJ0cyAmJiB7IGNhQ2VydHM6IHRoaXMuX29wdGlvbnMuY2FDZXJ0cyB9KSxcbiAgICAgIGRzbjogdGhpcy5fb3B0aW9ucy5kc24sXG4gICAgICB0dW5uZWw6IHRoaXMuX29wdGlvbnMudHVubmVsLFxuICAgICAgX21ldGFkYXRhOiB0aGlzLl9vcHRpb25zLl9tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuX29wdGlvbnMudHJhbnNwb3J0KSB7XG4gICAgICByZXR1cm4gbmV3IHRoaXMuX29wdGlvbnMudHJhbnNwb3J0KHRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAoZHNuLnByb3RvY29sID09PSAnaHR0cCcpIHtcbiAgICAgIHJldHVybiBuZXcgSFRUUFRyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIVFRQU1RyYW5zcG9ydCh0cmFuc3BvcnRPcHRpb25zKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEJhc2VDbGllbnQsIFNjb3BlLCBTREtfVkVSU0lPTiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBTZXNzaW9uRmx1c2hlciB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEV2ZW50LCBFdmVudEhpbnQsIFJlcXVlc3RTZXNzaW9uU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgTm9kZUJhY2tlbmQgfSBmcm9tICcuL2JhY2tlbmQnO1xuaW1wb3J0IHsgTm9kZU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgU2VudHJ5IE5vZGUgU0RLIENsaWVudC5cbiAqXG4gKiBAc2VlIE5vZGVPcHRpb25zIGZvciBkb2N1bWVudGF0aW9uIG9uIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBzZWUgU2VudHJ5Q2xpZW50IGZvciB1c2FnZSBkb2N1bWVudGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgTm9kZUNsaWVudCBleHRlbmRzIEJhc2VDbGllbnQ8Tm9kZUJhY2tlbmQsIE5vZGVPcHRpb25zPiB7XG4gIHByb3RlY3RlZCBfc2Vzc2lvbkZsdXNoZXI6IFNlc3Npb25GbHVzaGVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IE5vZGUgU0RLIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoaXMgU0RLLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE5vZGVPcHRpb25zKSB7XG4gICAgb3B0aW9ucy5fbWV0YWRhdGEgPSBvcHRpb25zLl9tZXRhZGF0YSB8fCB7fTtcbiAgICBvcHRpb25zLl9tZXRhZGF0YS5zZGsgPSBvcHRpb25zLl9tZXRhZGF0YS5zZGsgfHwge1xuICAgICAgbmFtZTogJ3NlbnRyeS5qYXZhc2NyaXB0Lm5vZGUnLFxuICAgICAgcGFja2FnZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICducG06QHNlbnRyeS9ub2RlJyxcbiAgICAgICAgICB2ZXJzaW9uOiBTREtfVkVSU0lPTixcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICB2ZXJzaW9uOiBTREtfVkVSU0lPTixcbiAgICB9O1xuXG4gICAgc3VwZXIoTm9kZUJhY2tlbmQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICBwdWJsaWMgY2FwdHVyZUV4Y2VwdGlvbihleGNlcHRpb246IGFueSwgaGludD86IEV2ZW50SGludCwgc2NvcGU/OiBTY29wZSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGZsYWcgYGF1dG9TZXNzaW9uVHJhY2tpbmdgIGlzIGVuYWJsZWQsIGFuZCBpZiBgX3Nlc3Npb25GbHVzaGVyYCBleGlzdHMgYmVjYXVzZSBpdCBpcyBpbml0aWFsaXNlZCBvbmx5XG4gICAgLy8gd2hlbiB0aGUgYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIHVzZWQsIGFuZCBoZW5jZSB0aGUgZXhwZWN0YXRpb24gaXMgdG8gaGF2ZSBTZXNzaW9uQWdncmVnYXRlcyBwYXlsb2FkXG4gICAgLy8gc2VudCB0byB0aGUgU2VydmVyIG9ubHkgd2hlbiB0aGUgYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIHVzZWRcbiAgICBpZiAodGhpcy5fb3B0aW9ucy5hdXRvU2Vzc2lvblRyYWNraW5nICYmIHRoaXMuX3Nlc3Npb25GbHVzaGVyICYmIHNjb3BlKSB7XG4gICAgICBjb25zdCByZXF1ZXN0U2Vzc2lvbiA9IHNjb3BlLmdldFJlcXVlc3RTZXNzaW9uKCk7XG5cbiAgICAgIC8vIE5lY2Vzc2FyeSBjaGVja3MgdG8gZW5zdXJlIHRoaXMgaXMgY29kZSBibG9jayBpcyBleGVjdXRlZCBvbmx5IHdpdGhpbiBhIHJlcXVlc3RcbiAgICAgIC8vIFNob3VsZCBvdmVycmlkZSB0aGUgc3RhdHVzIG9ubHkgaWYgYHJlcXVlc3RTZXNzaW9uLnN0YXR1c2AgaXMgYE9rYCwgd2hpY2ggaXMgaXRzIGluaXRpYWwgc3RhZ2VcbiAgICAgIGlmIChyZXF1ZXN0U2Vzc2lvbiAmJiByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgPT09IFJlcXVlc3RTZXNzaW9uU3RhdHVzLk9rKSB7XG4gICAgICAgIHJlcXVlc3RTZXNzaW9uLnN0YXR1cyA9IFJlcXVlc3RTZXNzaW9uU3RhdHVzLkVycm9yZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmNhcHR1cmVFeGNlcHRpb24oZXhjZXB0aW9uLCBoaW50LCBzY29wZSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjYXB0dXJlRXZlbnQoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50LCBzY29wZT86IFNjb3BlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBDaGVjayBpZiB0aGUgZmxhZyBgYXV0b1Nlc3Npb25UcmFja2luZ2AgaXMgZW5hYmxlZCwgYW5kIGlmIGBfc2Vzc2lvbkZsdXNoZXJgIGV4aXN0cyBiZWNhdXNlIGl0IGlzIGluaXRpYWxpc2VkIG9ubHlcbiAgICAvLyB3aGVuIHRoZSBgcmVxdWVzdEhhbmRsZXJgIG1pZGRsZXdhcmUgaXMgdXNlZCwgYW5kIGhlbmNlIHRoZSBleHBlY3RhdGlvbiBpcyB0byBoYXZlIFNlc3Npb25BZ2dyZWdhdGVzIHBheWxvYWRcbiAgICAvLyBzZW50IHRvIHRoZSBTZXJ2ZXIgb25seSB3aGVuIHRoZSBgcmVxdWVzdEhhbmRsZXJgIG1pZGRsZXdhcmUgaXMgdXNlZFxuICAgIGlmICh0aGlzLl9vcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcgJiYgdGhpcy5fc2Vzc2lvbkZsdXNoZXIgJiYgc2NvcGUpIHtcbiAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGV2ZW50LnR5cGUgfHwgJ2V4Y2VwdGlvbic7XG4gICAgICBjb25zdCBpc0V4Y2VwdGlvbiA9XG4gICAgICAgIGV2ZW50VHlwZSA9PT0gJ2V4Y2VwdGlvbicgJiYgZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgJiYgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcy5sZW5ndGggPiAwO1xuXG4gICAgICAvLyBJZiB0aGUgZXZlbnQgaXMgb2YgdHlwZSBFeGNlcHRpb24sIHRoZW4gYSByZXF1ZXN0IHNlc3Npb24gc2hvdWxkIGJlIGNhcHR1cmVkXG4gICAgICBpZiAoaXNFeGNlcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdFNlc3Npb24gPSBzY29wZS5nZXRSZXF1ZXN0U2Vzc2lvbigpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoaXMgaXMgaGFwcGVuaW5nIHdpdGhpbiB0aGUgYm91bmRzIG9mIGEgcmVxdWVzdCwgYW5kIG1ha2Ugc3VyZSBub3QgdG8gb3ZlcnJpZGVcbiAgICAgICAgLy8gU2Vzc2lvbiBTdGF0dXMgaWYgRXJyb3JlZCAvIENyYXNoZWRcbiAgICAgICAgaWYgKHJlcXVlc3RTZXNzaW9uICYmIHJlcXVlc3RTZXNzaW9uLnN0YXR1cyA9PT0gUmVxdWVzdFNlc3Npb25TdGF0dXMuT2spIHtcbiAgICAgICAgICByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgPSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5FcnJvcmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmNhcHR1cmVFdmVudChldmVudCwgaGludCwgc2NvcGUpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBpbmhlcml0ZG9jXG4gICAqL1xuICBwdWJsaWMgY2xvc2UodGltZW91dD86IG51bWJlcik6IFByb21pc2VMaWtlPGJvb2xlYW4+IHtcbiAgICB0aGlzLl9zZXNzaW9uRmx1c2hlcj8uY2xvc2UoKTtcbiAgICByZXR1cm4gc3VwZXIuY2xvc2UodGltZW91dCk7XG4gIH1cblxuICAvKiogTWV0aG9kIHRoYXQgaW5pdGlhbGlzZXMgYW4gaW5zdGFuY2Ugb2YgU2Vzc2lvbkZsdXNoZXIgb24gQ2xpZW50ICovXG4gIHB1YmxpYyBpbml0U2Vzc2lvbkZsdXNoZXIoKTogdm9pZCB7XG4gICAgY29uc3QgeyByZWxlYXNlLCBlbnZpcm9ubWVudCB9ID0gdGhpcy5fb3B0aW9ucztcbiAgICBpZiAoIXJlbGVhc2UpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdDYW5ub3QgaW5pdGlhbGlzZSBhbiBpbnN0YW5jZSBvZiBTZXNzaW9uRmx1c2hlciBpZiBubyByZWxlYXNlIGlzIHByb3ZpZGVkIScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9zZXNzaW9uRmx1c2hlciA9IG5ldyBTZXNzaW9uRmx1c2hlcih0aGlzLmdldFRyYW5zcG9ydCgpLCB7XG4gICAgICAgIHJlbGVhc2UsXG4gICAgICAgIGVudmlyb25tZW50LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcm90ZWN0ZWQgX3ByZXBhcmVFdmVudChldmVudDogRXZlbnQsIHNjb3BlPzogU2NvcGUsIGhpbnQ/OiBFdmVudEhpbnQpOiBQcm9taXNlTGlrZTxFdmVudCB8IG51bGw+IHtcbiAgICBldmVudC5wbGF0Zm9ybSA9IGV2ZW50LnBsYXRmb3JtIHx8ICdub2RlJztcbiAgICBpZiAodGhpcy5nZXRPcHRpb25zKCkuc2VydmVyTmFtZSkge1xuICAgICAgZXZlbnQuc2VydmVyX25hbWUgPSB0aGlzLmdldE9wdGlvbnMoKS5zZXJ2ZXJOYW1lO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuX3ByZXBhcmVFdmVudChldmVudCwgc2NvcGUsIGhpbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCByZXNwb25zaWJsZSBmb3IgY2FwdHVyaW5nL2VuZGluZyBhIHJlcXVlc3Qgc2Vzc2lvbiBieSBjYWxsaW5nIGBpbmNyZW1lbnRTZXNzaW9uU3RhdHVzQ291bnRgIHRvIGluY3JlbWVudFxuICAgKiBhcHByb3ByaWF0ZSBzZXNzaW9uIGFnZ3JlZ2F0ZXMgYnVja2V0XG4gICAqL1xuICBwcm90ZWN0ZWQgX2NhcHR1cmVSZXF1ZXN0U2Vzc2lvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3Nlc3Npb25GbHVzaGVyKSB7XG4gICAgICBsb2dnZXIud2FybignRGlzY2FyZGVkIHJlcXVlc3QgbW9kZSBzZXNzaW9uIGJlY2F1c2UgYXV0b1Nlc3Npb25UcmFja2luZyBvcHRpb24gd2FzIGRpc2FibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Nlc3Npb25GbHVzaGVyLmluY3JlbWVudFNlc3Npb25TdGF0dXNDb3VudCgpO1xuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7IGdldEN1cnJlbnRIdWIgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgSW50ZWdyYXRpb24sIFNldmVyaXR5IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBmaWxsIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJ3V0aWwnO1xuXG4vKiogQ29uc29sZSBtb2R1bGUgaW50ZWdyYXRpb24gKi9cbmV4cG9ydCBjbGFzcyBDb25zb2xlIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdDb25zb2xlJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBDb25zb2xlLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGxldmVsIG9mIFsnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJywgJ2xvZyddKSB7XG4gICAgICBmaWxsKGNvbnNvbGUsIGxldmVsLCBjcmVhdGVDb25zb2xlV3JhcHBlcihsZXZlbCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFdyYXBwZXIgZnVuY3Rpb24gdGhhdCdsbCBiZSB1c2VkIGZvciBldmVyeSBjb25zb2xlIGxldmVsXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbnNvbGVXcmFwcGVyKGxldmVsOiBzdHJpbmcpOiAob3JpZ2luYWxDb25zb2xlTWV0aG9kOiAoKSA9PiB2b2lkKSA9PiB2b2lkIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbnNvbGVXcmFwcGVyKG9yaWdpbmFsQ29uc29sZU1ldGhvZDogKCkgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBzZW50cnlMZXZlbDogU2V2ZXJpdHk7XG5cbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlICdkZWJ1Zyc6XG4gICAgICAgIHNlbnRyeUxldmVsID0gU2V2ZXJpdHkuRGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICBzZW50cnlMZXZlbCA9IFNldmVyaXR5LkVycm9yO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICBzZW50cnlMZXZlbCA9IFNldmVyaXR5LkluZm87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd2Fybic6XG4gICAgICAgIHNlbnRyeUxldmVsID0gU2V2ZXJpdHkuV2FybmluZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBzZW50cnlMZXZlbCA9IFNldmVyaXR5LkxvZztcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cbiAgICByZXR1cm4gZnVuY3Rpb24odGhpczogdHlwZW9mIGNvbnNvbGUpOiB2b2lkIHtcbiAgICAgIGlmIChnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oQ29uc29sZSkpIHtcbiAgICAgICAgZ2V0Q3VycmVudEh1YigpLmFkZEJyZWFkY3J1bWIoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2F0ZWdvcnk6ICdjb25zb2xlJyxcbiAgICAgICAgICAgIGxldmVsOiBzZW50cnlMZXZlbCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHV0aWwuZm9ybWF0LmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlucHV0OiBbLi4uYXJndW1lbnRzXSxcbiAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIG9yaWdpbmFsQ29uc29sZU1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gICAgLyogZXNsaW50LWVuYWJsZSBwcmVmZXItcmVzdC1wYXJhbXMgKi9cbiAgfTtcbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IHBhcnNlU2VtdmVyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcblxuY29uc3QgTk9ERV9WRVJTSU9OID0gcGFyc2VTZW12ZXIocHJvY2Vzcy52ZXJzaW9ucy5ub2RlKTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBnaXZlbiB1cmwgcG9pbnRzIHRvIFNlbnRyeSBzZXJ2ZXJcbiAqIEBwYXJhbSB1cmwgdXJsIHRvIHZlcmlmeVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTZW50cnlSZXF1ZXN0KHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGRzbiA9IGdldEN1cnJlbnRIdWIoKVxuICAgIC5nZXRDbGllbnQoKVxuICAgID8uZ2V0RHNuKCk7XG4gIHJldHVybiBkc24gPyB1cmwuaW5jbHVkZXMoZHNuLmhvc3QpIDogZmFsc2U7XG59XG5cbi8qKlxuICogQXNzZW1ibGUgYSBVUkwgdG8gYmUgdXNlZCBmb3IgYnJlYWRjcnVtYnMgYW5kIHNwYW5zLlxuICpcbiAqIEBwYXJhbSByZXF1ZXN0T3B0aW9ucyBSZXF1ZXN0T3B0aW9ucyBvYmplY3QgY29udGFpbmluZyB0aGUgY29tcG9uZW50IHBhcnRzIGZvciBhIFVSTFxuICogQHJldHVybnMgRnVsbHktZm9ybWVkIFVSTFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFVybChyZXF1ZXN0T3B0aW9uczogUmVxdWVzdE9wdGlvbnMpOiBzdHJpbmcge1xuICBjb25zdCBwcm90b2NvbCA9IHJlcXVlc3RPcHRpb25zLnByb3RvY29sIHx8ICcnO1xuICBjb25zdCBob3N0bmFtZSA9IHJlcXVlc3RPcHRpb25zLmhvc3RuYW1lIHx8IHJlcXVlc3RPcHRpb25zLmhvc3QgfHwgJyc7XG4gIC8vIERvbid0IGxvZyBzdGFuZGFyZCA6ODAgKGh0dHApIGFuZCA6NDQzIChodHRwcykgcG9ydHMgdG8gcmVkdWNlIHRoZSBub2lzZVxuICBjb25zdCBwb3J0ID1cbiAgICAhcmVxdWVzdE9wdGlvbnMucG9ydCB8fCByZXF1ZXN0T3B0aW9ucy5wb3J0ID09PSA4MCB8fCByZXF1ZXN0T3B0aW9ucy5wb3J0ID09PSA0NDMgPyAnJyA6IGA6JHtyZXF1ZXN0T3B0aW9ucy5wb3J0fWA7XG4gIGNvbnN0IHBhdGggPSByZXF1ZXN0T3B0aW9ucy5wYXRoID8gcmVxdWVzdE9wdGlvbnMucGF0aCA6ICcvJztcblxuICByZXR1cm4gYCR7cHJvdG9jb2x9Ly8ke2hvc3RuYW1lfSR7cG9ydH0ke3BhdGh9YDtcbn1cblxuLyoqXG4gKiBIYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIGluIHRoZSBzcGFuIGRlc2NyaXB0aW9uIChmb3Igc3BhbnMgcmVwcmVzZW50aW5nIGh0dHAocykgcmVxdWVzdHMpLlxuICpcbiAqIEBwYXJhbSBkZXNjcmlwdGlvbiBjdXJyZW50IGBkZXNjcmlwdGlvbmAgcHJvcGVydHkgb2YgdGhlIHNwYW4gcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0XG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgQ29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGUgcmVxdWVzdFxuICogQHBhcmFtIFJlcXVlc3QgUmVxdWVzdCBvYmplY3RcbiAqXG4gKiBAcmV0dXJucyBUaGUgY2xlYW5lZCBkZXNjcmlwdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5TcGFuRGVzY3JpcHRpb24oXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RPcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyxcbiAgcmVxdWVzdDogaHR0cC5DbGllbnRSZXF1ZXN0LFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gbm90aGluZyB0byBjbGVhblxuICBpZiAoIWRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICBsZXQgW21ldGhvZCwgcmVxdWVzdFVybF0gPSBkZXNjcmlwdGlvbi5zcGxpdCgnICcpO1xuXG4gIC8vIHN1cGVyYWdlbnQgc3RpY2tzIHRoZSBwcm90b2NvbCBpbiBhIHdlaXJkIHBsYWNlICh3ZSBjaGVjayBmb3IgaG9zdCBiZWNhdXNlIGlmIGJvdGggaG9zdCAqYW5kKiBwcm90b2NvbCBhcmUgbWlzc2luZyxcbiAgLy8gd2UncmUgbGlrZWx5IGRlYWxpbmcgd2l0aCBhbiBpbnRlcm5hbCByb3V0ZSBhbmQgdGhpcyBkb2Vzbid0IGFwcGx5KVxuICBpZiAocmVxdWVzdE9wdGlvbnMuaG9zdCAmJiAhcmVxdWVzdE9wdGlvbnMucHJvdG9jb2wpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcmVxdWVzdE9wdGlvbnMucHJvdG9jb2wgPSAocmVxdWVzdCBhcyBhbnkpPy5hZ2VudD8ucHJvdG9jb2w7IC8vIHdvcnN0IGNvbWVzIHRvIHdvcnN0LCB0aGlzIGlzIHVuZGVmaW5lZCBhbmQgbm90aGluZyBjaGFuZ2VzXG4gICAgcmVxdWVzdFVybCA9IGV4dHJhY3RVcmwocmVxdWVzdE9wdGlvbnMpO1xuICB9XG5cbiAgLy8gaW50ZXJuYWwgcm91dGVzIGNhbiBlbmQgdXAgc3RhcnRpbmcgd2l0aCBhIHRyaXBsZSBzbGFzaCByYXRoZXIgdGhhbiBhIHNpbmdsZSBvbmVcbiAgaWYgKHJlcXVlc3RVcmw/LnN0YXJ0c1dpdGgoJy8vLycpKSB7XG4gICAgcmVxdWVzdFVybCA9IHJlcXVlc3RVcmwuc2xpY2UoMik7XG4gIH1cblxuICByZXR1cm4gYCR7bWV0aG9kfSAke3JlcXVlc3RVcmx9YDtcbn1cblxuLy8gdGhlIG5vZGUgdHlwZXMgYXJlIG1pc3NpbmcgYSBmZXcgcHJvcGVydGllcyB3aGljaCBub2RlJ3MgYHVybFRvT3B0aW9uc2AgZnVuY3Rpb24gc3BpdHMgb3V0XG5leHBvcnQgdHlwZSBSZXF1ZXN0T3B0aW9ucyA9IGh0dHAuUmVxdWVzdE9wdGlvbnMgJiB7IGhhc2g/OiBzdHJpbmc7IHNlYXJjaD86IHN0cmluZzsgcGF0aG5hbWU/OiBzdHJpbmc7IGhyZWY/OiBzdHJpbmcgfTtcbnR5cGUgUmVxdWVzdENhbGxiYWNrID0gKHJlc3BvbnNlOiBodHRwLkluY29taW5nTWVzc2FnZSkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIFJlcXVlc3RNZXRob2RBcmdzID1cbiAgfCBbUmVxdWVzdE9wdGlvbnMgfCBzdHJpbmcgfCBVUkwsIFJlcXVlc3RDYWxsYmFjaz9dXG4gIHwgW3N0cmluZyB8IFVSTCwgUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RDYWxsYmFjaz9dO1xuZXhwb3J0IHR5cGUgUmVxdWVzdE1ldGhvZCA9ICguLi5hcmdzOiBSZXF1ZXN0TWV0aG9kQXJncykgPT4gaHR0cC5DbGllbnRSZXF1ZXN0O1xuXG4vKipcbiAqIENvbnZlcnQgYSBVUkwgb2JqZWN0IGludG8gYSBSZXF1ZXN0T3B0aW9ucyBvYmplY3QuXG4gKlxuICogQ29waWVkIGZyb20gTm9kZSdzIGludGVybmFscyAod2hlcmUgaXQncyB1c2VkIGluIGh0dHAocykucmVxdWVzdCgpIGFuZCBodHRwKHMpLmdldCgpKSwgbW9kaWZpZWQgb25seSB0byB1c2UgdGhlXG4gKiBSZXF1ZXN0T3B0aW9ucyB0eXBlIGFib3ZlLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvYmxvYi9tYXN0ZXIvbGliL2ludGVybmFsL3VybC5qcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybFRvT3B0aW9ucyh1cmw6IFVSTCk6IFJlcXVlc3RPcHRpb25zIHtcbiAgY29uc3Qgb3B0aW9uczogUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgcHJvdG9jb2w6IHVybC5wcm90b2NvbCxcbiAgICBob3N0bmFtZTpcbiAgICAgIHR5cGVvZiB1cmwuaG9zdG5hbWUgPT09ICdzdHJpbmcnICYmIHVybC5ob3N0bmFtZS5zdGFydHNXaXRoKCdbJykgPyB1cmwuaG9zdG5hbWUuc2xpY2UoMSwgLTEpIDogdXJsLmhvc3RuYW1lLFxuICAgIGhhc2g6IHVybC5oYXNoLFxuICAgIHNlYXJjaDogdXJsLnNlYXJjaCxcbiAgICBwYXRobmFtZTogdXJsLnBhdGhuYW1lLFxuICAgIHBhdGg6IGAke3VybC5wYXRobmFtZSB8fCAnJ30ke3VybC5zZWFyY2ggfHwgJyd9YCxcbiAgICBocmVmOiB1cmwuaHJlZixcbiAgfTtcbiAgaWYgKHVybC5wb3J0ICE9PSAnJykge1xuICAgIG9wdGlvbnMucG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gIH1cbiAgaWYgKHVybC51c2VybmFtZSB8fCB1cmwucGFzc3dvcmQpIHtcbiAgICBvcHRpb25zLmF1dGggPSBgJHt1cmwudXNlcm5hbWV9OiR7dXJsLnBhc3N3b3JkfWA7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGlucHV0cyB0byBgaHR0cChzKS5yZXF1ZXN0KClgIGFuZCBgaHR0cChzKS5nZXQoKWAuXG4gKlxuICogTGVnYWwgaW5wdXRzIHRvIGBodHRwKHMpLnJlcXVlc3QoKWAgYW5kIGBodHRwKHMpLmdldCgpYCBjYW4gdGFrZSBvbmUgb2YgdGVuIGZvcm1zOlxuICogICAgIFsgUmVxdWVzdE9wdGlvbnMgfCBzdHJpbmcgfCBVUkwgXSxcbiAqICAgICBbIFJlcXVlc3RPcHRpb25zIHwgc3RyaW5nIHwgVVJMLCBSZXF1ZXN0Q2FsbGJhY2sgXSxcbiAqICAgICBbIHN0cmluZyB8IFVSTCwgUmVxdWVzdE9wdGlvbnMgXSwgYW5kXG4gKiAgICAgWyBzdHJpbmcgfCBVUkwsIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0Q2FsbGJhY2sgXS5cbiAqXG4gKiBUaGlzIHN0YW5kYXJkaXplcyB0byBvbmUgb2YgdHdvIGZvcm1zOiBbIFJlcXVlc3RPcHRpb25zIF0gYW5kIFsgUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RDYWxsYmFjayBdLiBBIHNpbWlsYXIgdGhpbmcgaXNcbiAqIGRvbmUgYXMgdGhlIGZpcnN0IHN0ZXAgb2YgYGh0dHAocykucmVxdWVzdCgpYCBhbmQgYGh0dHAocykuZ2V0KClgOyB0aGlzIGp1c3QgZG9lcyBpdCBlYXJseSBzbyB0aGF0IHdlIGNhbiBpbnRlcmFjdFxuICogd2l0aCB0aGUgYXJncyBpbiBhIHN0YW5kYXJkIHdheS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdEFyZ3MgVGhlIGlucHV0cyB0byBgaHR0cChzKS5yZXF1ZXN0KClgIG9yIGBodHRwKHMpLmdldCgpYCwgYXMgYW4gYXJyYXkuXG4gKlxuICogQHJldHVybnMgRXF1aXZhbGVudCBhcmdzIG9mIHRoZSBmb3JtIFsgUmVxdWVzdE9wdGlvbnMgXSBvciBbIFJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0Q2FsbGJhY2sgXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJlcXVlc3RBcmdzKFxuICBodHRwTW9kdWxlOiB0eXBlb2YgaHR0cCB8IHR5cGVvZiBodHRwcyxcbiAgcmVxdWVzdEFyZ3M6IFJlcXVlc3RNZXRob2RBcmdzLFxuKTogW1JlcXVlc3RPcHRpb25zXSB8IFtSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdENhbGxiYWNrXSB7XG4gIGxldCBjYWxsYmFjaywgcmVxdWVzdE9wdGlvbnM7XG5cbiAgLy8gcG9wIG9mZiB0aGUgY2FsbGJhY2ssIGlmIHRoZXJlIGlzIG9uZVxuICBpZiAodHlwZW9mIHJlcXVlc3RBcmdzW3JlcXVlc3RBcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSByZXF1ZXN0QXJncy5wb3AoKSBhcyBSZXF1ZXN0Q2FsbGJhY2s7XG4gIH1cblxuICAvLyBjcmVhdGUgYSBSZXF1ZXN0T3B0aW9ucyBvYmplY3Qgb2Ygd2hhdGV2ZXIncyBhdCBpbmRleCAwXG4gIGlmICh0eXBlb2YgcmVxdWVzdEFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMgPSB1cmxUb09wdGlvbnMobmV3IFVSTChyZXF1ZXN0QXJnc1swXSkpO1xuICB9IGVsc2UgaWYgKHJlcXVlc3RBcmdzWzBdIGluc3RhbmNlb2YgVVJMKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMgPSB1cmxUb09wdGlvbnMocmVxdWVzdEFyZ3NbMF0pO1xuICB9IGVsc2Uge1xuICAgIHJlcXVlc3RPcHRpb25zID0gcmVxdWVzdEFyZ3NbMF07XG4gIH1cblxuICAvLyBpZiB0aGUgb3B0aW9ucyB3ZXJlIGdpdmVuIHNlcGFyYXRlbHkgZnJvbSB0aGUgVVJMLCBmb2xkIHRoZW0gaW5cbiAgaWYgKHJlcXVlc3RBcmdzLmxlbmd0aCA9PT0gMikge1xuICAgIHJlcXVlc3RPcHRpb25zID0geyAuLi5yZXF1ZXN0T3B0aW9ucywgLi4ucmVxdWVzdEFyZ3NbMV0gfTtcbiAgfVxuXG4gIC8vIEZpZ3VyZSBvdXQgdGhlIHByb3RvY29sIGlmIGl0J3MgY3VycmVudGx5IG1pc3NpbmdcbiAgaWYgKHJlcXVlc3RPcHRpb25zLnByb3RvY29sID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBXb3JzdCBjYXNlIHdlIGVuZCB1cCBwb3B1bGF0aW5nIHByb3RvY29sIHdpdGggdW5kZWZpbmVkLCB3aGljaCBpdCBhbHJlYWR5IGlzXG4gICAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5cbiAgICAvLyBOT1RFOiBQcmlvciB0byBOb2RlIDksIGBodHRwc2AgdXNlZCBpbnRlcm5hbHMgb2YgYGh0dHBgIG1vZHVsZSwgdGh1cyB3ZSBkb24ndCBwYXRjaCBpdC5cbiAgICAvLyBCZWNhdXNlIG9mIHRoYXQsIHdlIGNhbm5vdCByZWx5IG9uIGBodHRwTW9kdWxlYCB0byBwcm92aWRlIHVzIHdpdGggdmFsaWQgcHJvdG9jb2wsXG4gICAgLy8gYXMgaXQgd2lsbCBhbHdheXMgcmV0dXJuIGBodHRwYCwgZXZlbiB3aGVuIHVzaW5nIGBodHRwc2AgbW9kdWxlLlxuICAgIC8vXG4gICAgLy8gU2VlIHRlc3QvaW50ZWdyYXRpb25zL2h0dHAudGVzdC50cyBmb3IgbW9yZSBkZXRhaWxzIG9uIE5vZGUgPD12OCBwcm90b2NvbCBpc3N1ZS5cbiAgICBpZiAoTk9ERV9WRVJTSU9OLm1ham9yICYmIE5PREVfVkVSU0lPTi5tYWpvciA+IDgpIHtcbiAgICAgIHJlcXVlc3RPcHRpb25zLnByb3RvY29sID1cbiAgICAgICAgKGh0dHBNb2R1bGU/Lmdsb2JhbEFnZW50IGFzIGFueSk/LnByb3RvY29sIHx8XG4gICAgICAgIChyZXF1ZXN0T3B0aW9ucy5hZ2VudCBhcyBhbnkpPy5wcm90b2NvbCB8fFxuICAgICAgICAocmVxdWVzdE9wdGlvbnMuX2RlZmF1bHRBZ2VudCBhcyBhbnkpPy5wcm90b2NvbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdE9wdGlvbnMucHJvdG9jb2wgPVxuICAgICAgICAocmVxdWVzdE9wdGlvbnMuYWdlbnQgYXMgYW55KT8ucHJvdG9jb2wgfHxcbiAgICAgICAgKHJlcXVlc3RPcHRpb25zLl9kZWZhdWx0QWdlbnQgYXMgYW55KT8ucHJvdG9jb2wgfHxcbiAgICAgICAgKGh0dHBNb2R1bGU/Lmdsb2JhbEFnZW50IGFzIGFueSk/LnByb3RvY29sO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2VzcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuICB9XG5cbiAgLy8gcmV0dXJuIGFyZ3MgaW4gc3RhbmRhcmRpemVkIGZvcm1cbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIFtyZXF1ZXN0T3B0aW9ucywgY2FsbGJhY2tdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbcmVxdWVzdE9wdGlvbnNdO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiwgU3BhbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZmlsbCwgbG9nZ2VyLCBwYXJzZVNlbXZlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcblxuaW1wb3J0IHtcbiAgY2xlYW5TcGFuRGVzY3JpcHRpb24sXG4gIGV4dHJhY3RVcmwsXG4gIGlzU2VudHJ5UmVxdWVzdCxcbiAgbm9ybWFsaXplUmVxdWVzdEFyZ3MsXG4gIFJlcXVlc3RNZXRob2QsXG4gIFJlcXVlc3RNZXRob2RBcmdzLFxufSBmcm9tICcuL3V0aWxzL2h0dHAnO1xuXG5jb25zdCBOT0RFX1ZFUlNJT04gPSBwYXJzZVNlbXZlcihwcm9jZXNzLnZlcnNpb25zLm5vZGUpO1xuXG4vKiogaHR0cCBtb2R1bGUgaW50ZWdyYXRpb24gKi9cbmV4cG9ydCBjbGFzcyBIdHRwIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdIdHRwJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBIdHRwLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfYnJlYWRjcnVtYnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF90cmFjaW5nOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgYnJlYWRjcnVtYnM/OiBib29sZWFuOyB0cmFjaW5nPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICB0aGlzLl9icmVhZGNydW1icyA9IHR5cGVvZiBvcHRpb25zLmJyZWFkY3J1bWJzID09PSAndW5kZWZpbmVkJyA/IHRydWUgOiBvcHRpb25zLmJyZWFkY3J1bWJzO1xuICAgIHRoaXMuX3RyYWNpbmcgPSB0eXBlb2Ygb3B0aW9ucy50cmFjaW5nID09PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogb3B0aW9ucy50cmFjaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKCk6IHZvaWQge1xuICAgIC8vIE5vIG5lZWQgdG8gaW5zdHJ1bWVudCBpZiB3ZSBkb24ndCB3YW50IHRvIHRyYWNrIGFueXRoaW5nXG4gICAgaWYgKCF0aGlzLl9icmVhZGNydW1icyAmJiAhdGhpcy5fdHJhY2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyTWFrZXIgPSBfY3JlYXRlV3JhcHBlZFJlcXVlc3RNZXRob2RGYWN0b3J5KHRoaXMuX2JyZWFkY3J1bWJzLCB0aGlzLl90cmFjaW5nKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdmFyLXJlcXVpcmVzXG4gICAgY29uc3QgaHR0cE1vZHVsZSA9IHJlcXVpcmUoJ2h0dHAnKTtcbiAgICBmaWxsKGh0dHBNb2R1bGUsICdnZXQnLCB3cmFwcGVkSGFuZGxlck1ha2VyKTtcbiAgICBmaWxsKGh0dHBNb2R1bGUsICdyZXF1ZXN0Jywgd3JhcHBlZEhhbmRsZXJNYWtlcik7XG5cbiAgICAvLyBOT1RFOiBQcmlvciB0byBOb2RlIDksIGBodHRwc2AgdXNlZCBpbnRlcm5hbHMgb2YgYGh0dHBgIG1vZHVsZSwgdGh1cyB3ZSBkb24ndCBwYXRjaCBpdC5cbiAgICAvLyBJZiB3ZSBkbywgd2UnZCBnZXQgZG91YmxlIGJyZWFkY3J1bWJzIGFuZCBkb3VibGUgc3BhbnMgZm9yIGBodHRwc2AgY2FsbHMuXG4gICAgLy8gSXQgaGFzIGJlZW4gY2hhbmdlZCBpbiBOb2RlIDksIHNvIGZvciBhbGwgdmVyc2lvbnMgZXF1YWwgYW5kIGFib3ZlLCB3ZSBwYXRjaCBgaHR0cHNgIHNlcGFyYXRlbHkuXG4gICAgaWYgKE5PREVfVkVSU0lPTi5tYWpvciAmJiBOT0RFX1ZFUlNJT04ubWFqb3IgPiA4KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuICAgICAgY29uc3QgaHR0cHNNb2R1bGUgPSByZXF1aXJlKCdodHRwcycpO1xuICAgICAgZmlsbChodHRwc01vZHVsZSwgJ2dldCcsIHdyYXBwZWRIYW5kbGVyTWFrZXIpO1xuICAgICAgZmlsbChodHRwc01vZHVsZSwgJ3JlcXVlc3QnLCB3cmFwcGVkSGFuZGxlck1ha2VyKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gZm9yIGVhc2Ugb2YgcmVhZGluZyBiZWxvd1xudHlwZSBPcmlnaW5hbFJlcXVlc3RNZXRob2QgPSBSZXF1ZXN0TWV0aG9kO1xudHlwZSBXcmFwcGVkUmVxdWVzdE1ldGhvZCA9IFJlcXVlc3RNZXRob2Q7XG50eXBlIFdyYXBwZWRSZXF1ZXN0TWV0aG9kRmFjdG9yeSA9IChvcmlnaW5hbDogT3JpZ2luYWxSZXF1ZXN0TWV0aG9kKSA9PiBXcmFwcGVkUmVxdWVzdE1ldGhvZDtcblxuLyoqXG4gKiBGdW5jdGlvbiB3aGljaCBjcmVhdGVzIGEgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyB3cmFwcGVkIHZlcnNpb25zIG9mIGludGVybmFsIGByZXF1ZXN0YCBhbmQgYGdldGAgY2FsbHMgd2l0aGluIGBodHRwYFxuICogYW5kIGBodHRwc2AgbW9kdWxlcy4gKE5COiBOb3QgYSB0eXBvIC0gdGhpcyBpcyBhIGNyZWF0b3JeMiEpXG4gKlxuICogQHBhcmFtIGJyZWFkY3J1bWJzRW5hYmxlZCBXaGV0aGVyIG9yIG5vdCB0byByZWNvcmQgb3V0Z29pbmcgcmVxdWVzdHMgYXMgYnJlYWRjcnVtYnNcbiAqIEBwYXJhbSB0cmFjaW5nRW5hYmxlZCBXaGV0aGVyIG9yIG5vdCB0byByZWNvcmQgb3V0Z29pbmcgcmVxdWVzdHMgYXMgdHJhY2luZyBzcGFuc1xuICpcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0cyB0aGUgZXhpdGluZyBoYW5kbGVyIGFuZCByZXR1cm5zIGEgd3JhcHBlZCBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIF9jcmVhdGVXcmFwcGVkUmVxdWVzdE1ldGhvZEZhY3RvcnkoXG4gIGJyZWFkY3J1bWJzRW5hYmxlZDogYm9vbGVhbixcbiAgdHJhY2luZ0VuYWJsZWQ6IGJvb2xlYW4sXG4pOiBXcmFwcGVkUmVxdWVzdE1ldGhvZEZhY3Rvcnkge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlZFJlcXVlc3RNZXRob2RGYWN0b3J5KG9yaWdpbmFsUmVxdWVzdE1ldGhvZDogT3JpZ2luYWxSZXF1ZXN0TWV0aG9kKTogV3JhcHBlZFJlcXVlc3RNZXRob2Qge1xuICAgIHJldHVybiBmdW5jdGlvbiB3cmFwcGVkTWV0aG9kKHRoaXM6IHR5cGVvZiBodHRwIHwgdHlwZW9mIGh0dHBzLCAuLi5hcmdzOiBSZXF1ZXN0TWV0aG9kQXJncyk6IGh0dHAuQ2xpZW50UmVxdWVzdCB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGNvbnN0IGh0dHBNb2R1bGUgPSB0aGlzO1xuXG4gICAgICBjb25zdCByZXF1ZXN0QXJncyA9IG5vcm1hbGl6ZVJlcXVlc3RBcmdzKHRoaXMsIGFyZ3MpO1xuICAgICAgY29uc3QgcmVxdWVzdE9wdGlvbnMgPSByZXF1ZXN0QXJnc1swXTtcbiAgICAgIGNvbnN0IHJlcXVlc3RVcmwgPSBleHRyYWN0VXJsKHJlcXVlc3RPcHRpb25zKTtcblxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byByZWNvcmQgcmVxdWVzdHMgdG8gU2VudHJ5IGFzIGVpdGhlciBicmVhZGNydW1icyBvciBzcGFucywgc28ganVzdCB1c2UgdGhlIG9yaWdpbmFsIG1ldGhvZFxuICAgICAgaWYgKGlzU2VudHJ5UmVxdWVzdChyZXF1ZXN0VXJsKSkge1xuICAgICAgICByZXR1cm4gb3JpZ2luYWxSZXF1ZXN0TWV0aG9kLmFwcGx5KGh0dHBNb2R1bGUsIHJlcXVlc3RBcmdzKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHNwYW46IFNwYW4gfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcGFyZW50U3BhbjogU3BhbiB8IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgIGlmIChzY29wZSAmJiB0cmFjaW5nRW5hYmxlZCkge1xuICAgICAgICBwYXJlbnRTcGFuID0gc2NvcGUuZ2V0U3BhbigpO1xuICAgICAgICBpZiAocGFyZW50U3Bhbikge1xuICAgICAgICAgIHNwYW4gPSBwYXJlbnRTcGFuLnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgICAgZGVzY3JpcHRpb246IGAke3JlcXVlc3RPcHRpb25zLm1ldGhvZCB8fCAnR0VUJ30gJHtyZXF1ZXN0VXJsfWAsXG4gICAgICAgICAgICBvcDogJ2h0dHAuY2xpZW50JyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHNlbnRyeVRyYWNlSGVhZGVyID0gc3Bhbi50b1RyYWNlcGFyZW50KCk7XG4gICAgICAgICAgbG9nZ2VyLmxvZyhcbiAgICAgICAgICAgIGBbVHJhY2luZ10gQWRkaW5nIHNlbnRyeS10cmFjZSBoZWFkZXIgJHtzZW50cnlUcmFjZUhlYWRlcn0gdG8gb3V0Z29pbmcgcmVxdWVzdCB0byAke3JlcXVlc3RVcmx9OiBgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsgLi4ucmVxdWVzdE9wdGlvbnMuaGVhZGVycywgJ3NlbnRyeS10cmFjZSc6IHNlbnRyeVRyYWNlSGVhZGVyIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgcmV0dXJuIG9yaWdpbmFsUmVxdWVzdE1ldGhvZFxuICAgICAgICAuYXBwbHkoaHR0cE1vZHVsZSwgcmVxdWVzdEFyZ3MpXG4gICAgICAgIC5vbmNlKCdyZXNwb25zZScsIGZ1bmN0aW9uKHRoaXM6IGh0dHAuQ2xpZW50UmVxdWVzdCwgcmVzOiBodHRwLkluY29taW5nTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgIGNvbnN0IHJlcSA9IHRoaXM7XG4gICAgICAgICAgaWYgKGJyZWFkY3J1bWJzRW5hYmxlZCkge1xuICAgICAgICAgICAgYWRkUmVxdWVzdEJyZWFkY3J1bWIoJ3Jlc3BvbnNlJywgcmVxdWVzdFVybCwgcmVxLCByZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJhY2luZ0VuYWJsZWQgJiYgc3Bhbikge1xuICAgICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlKSB7XG4gICAgICAgICAgICAgIHNwYW4uc2V0SHR0cFN0YXR1cyhyZXMuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzcGFuLmRlc2NyaXB0aW9uID0gY2xlYW5TcGFuRGVzY3JpcHRpb24oc3Bhbi5kZXNjcmlwdGlvbiwgcmVxdWVzdE9wdGlvbnMsIHJlcSk7XG4gICAgICAgICAgICBzcGFuLmZpbmlzaCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLm9uY2UoJ2Vycm9yJywgZnVuY3Rpb24odGhpczogaHR0cC5DbGllbnRSZXF1ZXN0KTogdm9pZCB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgY29uc3QgcmVxID0gdGhpcztcblxuICAgICAgICAgIGlmIChicmVhZGNydW1ic0VuYWJsZWQpIHtcbiAgICAgICAgICAgIGFkZFJlcXVlc3RCcmVhZGNydW1iKCdlcnJvcicsIHJlcXVlc3RVcmwsIHJlcSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmFjaW5nRW5hYmxlZCAmJiBzcGFuKSB7XG4gICAgICAgICAgICBzcGFuLnNldEh0dHBTdGF0dXMoNTAwKTtcbiAgICAgICAgICAgIHNwYW4uZGVzY3JpcHRpb24gPSBjbGVhblNwYW5EZXNjcmlwdGlvbihzcGFuLmRlc2NyaXB0aW9uLCByZXF1ZXN0T3B0aW9ucywgcmVxKTtcbiAgICAgICAgICAgIHNwYW4uZmluaXNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIENhcHR1cmVzIEJyZWFkY3J1bWIgYmFzZWQgb24gcHJvdmlkZWQgcmVxdWVzdC9yZXNwb25zZSBwYWlyXG4gKi9cbmZ1bmN0aW9uIGFkZFJlcXVlc3RCcmVhZGNydW1iKGV2ZW50OiBzdHJpbmcsIHVybDogc3RyaW5nLCByZXE6IGh0dHAuQ2xpZW50UmVxdWVzdCwgcmVzPzogaHR0cC5JbmNvbWluZ01lc3NhZ2UpOiB2b2lkIHtcbiAgaWYgKCFnZXRDdXJyZW50SHViKCkuZ2V0SW50ZWdyYXRpb24oSHR0cCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBnZXRDdXJyZW50SHViKCkuYWRkQnJlYWRjcnVtYihcbiAgICB7XG4gICAgICBjYXRlZ29yeTogJ2h0dHAnLFxuICAgICAgZGF0YToge1xuICAgICAgICBtZXRob2Q6IHJlcS5tZXRob2QsXG4gICAgICAgIHN0YXR1c19jb2RlOiByZXMgJiYgcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgIHVybCxcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnaHR0cCcsXG4gICAgfSxcbiAgICB7XG4gICAgICBldmVudCxcbiAgICAgIHJlcXVlc3Q6IHJlcSxcbiAgICAgIHJlc3BvbnNlOiByZXMsXG4gICAgfSxcbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGZvcmdldCwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IE5vZGVDbGllbnQgfSBmcm9tICcuLi8uLi9jbGllbnQnO1xuXG5jb25zdCBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVQgPSAyMDAwO1xuXG4vKipcbiAqIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvZ0FuZEV4aXRQcm9jZXNzKGVycm9yOiBFcnJvcik6IHZvaWQge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmVycm9yKGVycm9yICYmIGVycm9yLnN0YWNrID8gZXJyb3Iuc3RhY2sgOiBlcnJvcik7XG5cbiAgY29uc3QgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuXG4gIGlmIChjbGllbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBOb2RlQ2xpZW50IHdhcyBkZWZpbmVkLCB3ZSBhcmUgZXhpdGluZyB0aGUgcHJvY2VzcyBub3cuJyk7XG4gICAgZ2xvYmFsLnByb2Nlc3MuZXhpdCgxKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcHRpb25zID0gY2xpZW50LmdldE9wdGlvbnMoKTtcbiAgY29uc3QgdGltZW91dCA9XG4gICAgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaHV0ZG93blRpbWVvdXQgJiYgb3B0aW9ucy5zaHV0ZG93blRpbWVvdXQgPiAwICYmIG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0KSB8fFxuICAgIERFRkFVTFRfU0hVVERPV05fVElNRU9VVDtcbiAgZm9yZ2V0KFxuICAgIGNsaWVudC5jbG9zZSh0aW1lb3V0KS50aGVuKChyZXN1bHQ6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIGxvZ2dlci53YXJuKCdXZSByZWFjaGVkIHRoZSB0aW1lb3V0IGZvciBlbXB0eWluZyB0aGUgcmVxdWVzdCBidWZmZXIsIHN0aWxsIGV4aXRpbmcgbm93IScpO1xuICAgICAgfVxuICAgICAgZ2xvYmFsLnByb2Nlc3MuZXhpdCgxKTtcbiAgICB9KSxcbiAgKTtcbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViLCBTY29wZSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiwgU2V2ZXJpdHkgfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBOb2RlQ2xpZW50IH0gZnJvbSAnLi4vY2xpZW50JztcbmltcG9ydCB7IGxvZ0FuZEV4aXRQcm9jZXNzIH0gZnJvbSAnLi91dGlscy9lcnJvcmhhbmRsaW5nJztcblxudHlwZSBPbkZhdGFsRXJyb3JIYW5kbGVyID0gKGZpcnN0RXJyb3I6IEVycm9yLCBzZWNvbmRFcnJvcj86IEVycm9yKSA9PiB2b2lkO1xuXG4vKiogR2xvYmFsIFByb21pc2UgUmVqZWN0aW9uIGhhbmRsZXIgKi9cbmV4cG9ydCBjbGFzcyBPblVuY2F1Z2h0RXhjZXB0aW9uIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdPblVuY2F1Z2h0RXhjZXB0aW9uJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBPblVuY2F1Z2h0RXhjZXB0aW9uLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGhhbmRsZXI6IChlcnJvcjogRXJyb3IpID0+IHZvaWQgPSB0aGlzLl9tYWtlRXJyb3JIYW5kbGVyKCk7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb3B0aW9uczoge1xuICAgICAgLyoqXG4gICAgICAgKiBEZWZhdWx0IG9uRmF0YWxFcnJvciBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gZmlyc3RFcnJvciBFcnJvciB0aGF0IGhhcyBiZWVuIHRocm93blxuICAgICAgICogQHBhcmFtIHNlY29uZEVycm9yIElmIHRoaXMgd2FzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB0aGlzIHdpbGwgYmUgc2V0XG4gICAgICAgKi9cbiAgICAgIG9uRmF0YWxFcnJvcj8oZmlyc3RFcnJvcjogRXJyb3IsIHNlY29uZEVycm9yPzogRXJyb3IpOiB2b2lkO1xuICAgIH0gPSB7fSxcbiAgKSB7fVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoKTogdm9pZCB7XG4gICAgZ2xvYmFsLnByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy5oYW5kbGVyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHByaXZhdGUgX21ha2VFcnJvckhhbmRsZXIoKTogKGVycm9yOiBFcnJvcikgPT4gdm9pZCB7XG4gICAgY29uc3QgdGltZW91dCA9IDIwMDA7XG4gICAgbGV0IGNhdWdodEZpcnN0RXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgY2F1Z2h0U2Vjb25kRXJyb3I6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBsZXQgY2FsbGVkRmF0YWxFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGxldCBmaXJzdEVycm9yOiBFcnJvcjtcblxuICAgIHJldHVybiAoZXJyb3I6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICBsZXQgb25GYXRhbEVycm9yOiBPbkZhdGFsRXJyb3JIYW5kbGVyID0gbG9nQW5kRXhpdFByb2Nlc3M7XG4gICAgICBjb25zdCBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG5cbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLm9uRmF0YWxFcnJvcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgICAgIG9uRmF0YWxFcnJvciA9IHRoaXMuX29wdGlvbnMub25GYXRhbEVycm9yO1xuICAgICAgfSBlbHNlIGlmIChjbGllbnQgJiYgY2xpZW50LmdldE9wdGlvbnMoKS5vbkZhdGFsRXJyb3IpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgICBvbkZhdGFsRXJyb3IgPSBjbGllbnQuZ2V0T3B0aW9ucygpLm9uRmF0YWxFcnJvciBhcyBPbkZhdGFsRXJyb3JIYW5kbGVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWNhdWdodEZpcnN0RXJyb3IpIHtcbiAgICAgICAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuXG4gICAgICAgIC8vIHRoaXMgaXMgdGhlIGZpcnN0IHVuY2F1Z2h0IGVycm9yIGFuZCB0aGUgdWx0aW1hdGUgcmVhc29uIGZvciBzaHV0dGluZyBkb3duXG4gICAgICAgIC8vIHdlIHdhbnQgdG8gZG8gYWJzb2x1dGVseSBldmVyeXRoaW5nIHBvc3NpYmxlIHRvIGVuc3VyZSBpdCBnZXRzIGNhcHR1cmVkXG4gICAgICAgIC8vIGFsc28gd2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgZ28gcmVjdXJzaW9uIGNyYXp5IGlmIG1vcmUgZXJyb3JzIGhhcHBlbiBhZnRlciB0aGlzIG9uZVxuICAgICAgICBmaXJzdEVycm9yID0gZXJyb3I7XG4gICAgICAgIGNhdWdodEZpcnN0RXJyb3IgPSB0cnVlO1xuXG4gICAgICAgIGlmIChodWIuZ2V0SW50ZWdyYXRpb24oT25VbmNhdWdodEV4Y2VwdGlvbikpIHtcbiAgICAgICAgICBodWIud2l0aFNjb3BlKChzY29wZTogU2NvcGUpID0+IHtcbiAgICAgICAgICAgIHNjb3BlLnNldExldmVsKFNldmVyaXR5LkZhdGFsKTtcbiAgICAgICAgICAgIGh1Yi5jYXB0dXJlRXhjZXB0aW9uKGVycm9yLCB7XG4gICAgICAgICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBlcnJvcixcbiAgICAgICAgICAgICAgZGF0YTogeyBtZWNoYW5pc206IHsgaGFuZGxlZDogZmFsc2UsIHR5cGU6ICdvbnVuY2F1Z2h0ZXhjZXB0aW9uJyB9IH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghY2FsbGVkRmF0YWxFcnJvcikge1xuICAgICAgICAgICAgICBjYWxsZWRGYXRhbEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgb25GYXRhbEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoIWNhbGxlZEZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgIGNhbGxlZEZhdGFsRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgb25GYXRhbEVycm9yKGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2FsbGVkRmF0YWxFcnJvcikge1xuICAgICAgICAvLyB3ZSBoaXQgYW4gZXJyb3IgKmFmdGVyKiBjYWxsaW5nIG9uRmF0YWxFcnJvciAtIHByZXR0eSBib25lZCBhdCB0aGlzIHBvaW50LCBqdXN0IHNodXQgaXQgZG93blxuICAgICAgICBsb2dnZXIud2FybigndW5jYXVnaHQgZXhjZXB0aW9uIGFmdGVyIGNhbGxpbmcgZmF0YWwgZXJyb3Igc2h1dGRvd24gY2FsbGJhY2sgLSB0aGlzIGlzIGJhZCEgZm9yY2luZyBzaHV0ZG93bicpO1xuICAgICAgICBsb2dBbmRFeGl0UHJvY2VzcyhlcnJvcik7XG4gICAgICB9IGVsc2UgaWYgKCFjYXVnaHRTZWNvbmRFcnJvcikge1xuICAgICAgICAvLyB0d28gY2FzZXMgZm9yIGhvdyB3ZSBjYW4gaGl0IHRoaXMgYnJhbmNoOlxuICAgICAgICAvLyAgIC0gY2FwdHVyaW5nIG9mIGZpcnN0IGVycm9yIGJsZXcgdXAgYW5kIHdlIGp1c3QgY2F1Z2h0IHRoZSBleGNlcHRpb24gZnJvbSB0aGF0XG4gICAgICAgIC8vICAgICAtIHF1aXQgdHJ5aW5nIHRvIGNhcHR1cmUsIHByb2NlZWQgd2l0aCBzaHV0ZG93blxuICAgICAgICAvLyAgIC0gYSBzZWNvbmQgaW5kZXBlbmRlbnQgZXJyb3IgaGFwcGVuZWQgd2hpbGUgd2FpdGluZyBmb3IgZmlyc3QgZXJyb3IgdG8gY2FwdHVyZVxuICAgICAgICAvLyAgICAgLSB3YW50IHRvIGF2b2lkIGNhdXNpbmcgcHJlbWF0dXJlIHNodXRkb3duIGJlZm9yZSBmaXJzdCBlcnJvciBjYXB0dXJlIGZpbmlzaGVzXG4gICAgICAgIC8vIGl0J3MgaGFyZCB0byBpbW1lZGlhdGVseSB0ZWxsIGNhc2UgMSBmcm9tIGNhc2UgMiB3aXRob3V0IGRvaW5nIHNvbWUgZmFuY3kvcXVlc3Rpb25hYmxlIGRvbWFpbiBzdHVmZlxuICAgICAgICAvLyBzbyBsZXQncyBpbnN0ZWFkIGp1c3QgZGVsYXkgYSBiaXQgYmVmb3JlIHdlIHByb2NlZWQgd2l0aCBvdXIgYWN0aW9uIGhlcmVcbiAgICAgICAgLy8gaW4gY2FzZSAxLCB3ZSBqdXN0IHdhaXQgYSBiaXQgdW5uZWNlc3NhcmlseSBidXQgdWx0aW1hdGVseSBkbyB0aGUgc2FtZSB0aGluZ1xuICAgICAgICAvLyBpbiBjYXNlIDIsIHRoZSBkZWxheSBob3BlZnVsbHkgbWFkZSB1cyB3YWl0IGxvbmcgZW5vdWdoIGZvciB0aGUgY2FwdHVyZSB0byBmaW5pc2hcbiAgICAgICAgLy8gdHdvIHBvdGVudGlhbCBub25pZGVhbCBvdXRjb21lczpcbiAgICAgICAgLy8gICBub25pZGVhbCBjYXNlIDE6IGNhcHR1cmluZyBmYWlscyBmYXN0LCB3ZSBzaXQgYXJvdW5kIGZvciBhIGZldyBzZWNvbmRzIHVubmVjZXNzYXJpbHkgYmVmb3JlIHByb2NlZWRpbmcgY29ycmVjdGx5IGJ5IGNhbGxpbmcgb25GYXRhbEVycm9yXG4gICAgICAgIC8vICAgbm9uaWRlYWwgY2FzZSAyOiBjYXNlIDIgaGFwcGVucywgMXN0IGVycm9yIGlzIGNhcHR1cmVkIGJ1dCBzbG93bHksIHRpbWVvdXQgY29tcGxldGVzIGJlZm9yZSBjYXB0dXJlIGFuZCB3ZSB0cmVhdCBzZWNvbmQgZXJyb3IgYXMgdGhlIHNlbmRFcnIgb2YgKG5vbmV4aXN0ZW50KSBmYWlsdXJlIGZyb20gdHJ5aW5nIHRvIGNhcHR1cmUgZmlyc3QgZXJyb3JcbiAgICAgICAgLy8gbm90ZSB0aGF0IGFmdGVyIGhpdHRpbmcgdGhpcyBicmFuY2gsIHdlIG1pZ2h0IGNhdGNoIG1vcmUgZXJyb3JzIHdoZXJlIChjYXVnaHRTZWNvbmRFcnJvciAmJiAhY2FsbGVkRmF0YWxFcnJvcilcbiAgICAgICAgLy8gICB3ZSBpZ25vcmUgdGhlbSAtIHRoZXkgZG9uJ3QgbWF0dGVyIHRvIHVzLCB3ZSdyZSBqdXN0IHdhaXRpbmcgZm9yIHRoZSBzZWNvbmQgZXJyb3IgdGltZW91dCB0byBmaW5pc2hcbiAgICAgICAgY2F1Z2h0U2Vjb25kRXJyb3IgPSB0cnVlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAoIWNhbGxlZEZhdGFsRXJyb3IpIHtcbiAgICAgICAgICAgIC8vIGl0IHdhcyBwcm9iYWJseSBjYXNlIDEsIGxldCdzIHRyZWF0IGVyciBhcyB0aGUgc2VuZEVyciBhbmQgY2FsbCBvbkZhdGFsRXJyb3JcbiAgICAgICAgICAgIGNhbGxlZEZhdGFsRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgb25GYXRhbEVycm9yKGZpcnN0RXJyb3IsIGVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaXQgd2FzIHByb2JhYmx5IGNhc2UgMiwgb3VyIGZpcnN0IGVycm9yIGZpbmlzaGVkIGNhcHR1cmluZyB3aGlsZSB3ZSB3YWl0ZWQsIGNvb2wsIGRvIG5vdGhpbmdcbiAgICAgICAgICB9XG4gICAgICAgIH0sIHRpbWVvdXQpOyAvLyBjYXB0dXJpbmcgY291bGQgdGFrZSBhdCBsZWFzdCBzZW5kVGltZW91dCB0byBmYWlsLCBwbHVzIGFuIGFyYml0cmFyeSBzZWNvbmQgZm9yIGhvdyBsb25nIGl0IHRha2VzIHRvIGNvbGxlY3Qgc3Vycm91bmRpbmcgc291cmNlIGV0Y1xuICAgICAgfVxuICAgIH07XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRDdXJyZW50SHViLCBTY29wZSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgY29uc29sZVNhbmRib3ggfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgbG9nQW5kRXhpdFByb2Nlc3MgfSBmcm9tICcuL3V0aWxzL2Vycm9yaGFuZGxpbmcnO1xuXG50eXBlIFVuaGFuZGxlZFJlamVjdGlvbk1vZGUgPSAnbm9uZScgfCAnd2FybicgfCAnc3RyaWN0JztcblxuLyoqIEdsb2JhbCBQcm9taXNlIFJlamVjdGlvbiBoYW5kbGVyICovXG5leHBvcnQgY2xhc3MgT25VbmhhbmRsZWRSZWplY3Rpb24gaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ09uVW5oYW5kbGVkUmVqZWN0aW9uJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBPblVuaGFuZGxlZFJlamVjdGlvbi5pZDtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vcHRpb25zOiB7XG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbiBkZWNpZGluZyB3aGF0IHRvIGRvIGFmdGVyIGNhcHR1cmluZyB1bmhhbmRsZWRSZWplY3Rpb24sXG4gICAgICAgKiB0aGF0IG1pbWlja3MgYmVoYXZpb3Igb2Ygbm9kZSdzIC0tdW5oYW5kbGVkLXJlamVjdGlvbiBmbGFnLlxuICAgICAgICovXG4gICAgICBtb2RlOiBVbmhhbmRsZWRSZWplY3Rpb25Nb2RlO1xuICAgIH0gPSB7IG1vZGU6ICd3YXJuJyB9LFxuICApIHt9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKCk6IHZvaWQge1xuICAgIGdsb2JhbC5wcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCB0aGlzLnNlbmRVbmhhbmRsZWRQcm9taXNlLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYW4gZXhjZXB0aW9uIHdpdGggcmVhc29uXG4gICAqIEBwYXJhbSByZWFzb24gc3RyaW5nXG4gICAqIEBwYXJhbSBwcm9taXNlIHByb21pc2VcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHB1YmxpYyBzZW5kVW5oYW5kbGVkUHJvbWlzZShyZWFzb246IGFueSwgcHJvbWlzZTogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuXG4gICAgaWYgKCFodWIuZ2V0SW50ZWdyYXRpb24oT25VbmhhbmRsZWRSZWplY3Rpb24pKSB7XG4gICAgICB0aGlzLl9oYW5kbGVSZWplY3Rpb24ocmVhc29uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cbiAgICBjb25zdCBjb250ZXh0ID0gKHByb21pc2UuZG9tYWluICYmIHByb21pc2UuZG9tYWluLnNlbnRyeUNvbnRleHQpIHx8IHt9O1xuXG4gICAgaHViLndpdGhTY29wZSgoc2NvcGU6IFNjb3BlKSA9PiB7XG4gICAgICBzY29wZS5zZXRFeHRyYSgndW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbicsIHRydWUpO1xuXG4gICAgICAvLyBQcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHJhdmVuLW5vZGUgZm9yIG5vd1xuICAgICAgaWYgKGNvbnRleHQudXNlcikge1xuICAgICAgICBzY29wZS5zZXRVc2VyKGNvbnRleHQudXNlcik7XG4gICAgICB9XG4gICAgICBpZiAoY29udGV4dC50YWdzKSB7XG4gICAgICAgIHNjb3BlLnNldFRhZ3MoY29udGV4dC50YWdzKTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZXh0LmV4dHJhKSB7XG4gICAgICAgIHNjb3BlLnNldEV4dHJhcyhjb250ZXh0LmV4dHJhKTtcbiAgICAgIH1cblxuICAgICAgaHViLmNhcHR1cmVFeGNlcHRpb24ocmVhc29uLCB7XG4gICAgICAgIG9yaWdpbmFsRXhjZXB0aW9uOiBwcm9taXNlLFxuICAgICAgICBkYXRhOiB7IG1lY2hhbmlzbTogeyBoYW5kbGVkOiBmYWxzZSwgdHlwZTogJ29udW5oYW5kbGVkcmVqZWN0aW9uJyB9IH0sXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MgKi9cblxuICAgIHRoaXMuX2hhbmRsZVJlamVjdGlvbihyZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIGBtb2RlYCBvcHRpb25cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHByaXZhdGUgX2hhbmRsZVJlamVjdGlvbihyZWFzb246IGFueSk6IHZvaWQge1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9ibG9iLzdjZjZmOWU5NjRhYTAwNzcyOTY1MzkxYzIzYWNkYTZkNzE5NzJhOWEvbGliL2ludGVybmFsL3Byb2Nlc3MvcHJvbWlzZXMuanMjTDIzNC1MMjQwXG4gICAgY29uc3QgcmVqZWN0aW9uV2FybmluZyA9XG4gICAgICAnVGhpcyBlcnJvciBvcmlnaW5hdGVkIGVpdGhlciBieSAnICtcbiAgICAgICd0aHJvd2luZyBpbnNpZGUgb2YgYW4gYXN5bmMgZnVuY3Rpb24gd2l0aG91dCBhIGNhdGNoIGJsb2NrLCAnICtcbiAgICAgICdvciBieSByZWplY3RpbmcgYSBwcm9taXNlIHdoaWNoIHdhcyBub3QgaGFuZGxlZCB3aXRoIC5jYXRjaCgpLicgK1xuICAgICAgJyBUaGUgcHJvbWlzZSByZWplY3RlZCB3aXRoIHRoZSByZWFzb246JztcblxuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbnNvbGUgKi9cbiAgICBpZiAodGhpcy5fb3B0aW9ucy5tb2RlID09PSAnd2FybicpIHtcbiAgICAgIGNvbnNvbGVTYW5kYm94KCgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKHJlamVjdGlvbldhcm5pbmcpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgIGNvbnNvbGUuZXJyb3IocmVhc29uICYmIHJlYXNvbi5zdGFjayA/IHJlYXNvbi5zdGFjayA6IHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX29wdGlvbnMubW9kZSA9PT0gJ3N0cmljdCcpIHtcbiAgICAgIGNvbnNvbGVTYW5kYm94KCgpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKHJlamVjdGlvbldhcm5pbmcpO1xuICAgICAgfSk7XG4gICAgICBsb2dBbmRFeGl0UHJvY2VzcyhyZWFzb24pO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbnNvbGUgKi9cbiAgfVxufVxuIiwgImltcG9ydCB7IGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yLCBnZXRDdXJyZW50SHViIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IEV2ZW50LCBFdmVudEhpbnQsIEV4Y2VwdGlvbiwgRXh0ZW5kZWRFcnJvciwgSW50ZWdyYXRpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGlzSW5zdGFuY2VPZiwgU3luY1Byb21pc2UgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgZ2V0RXhjZXB0aW9uRnJvbUVycm9yIH0gZnJvbSAnLi4vcGFyc2Vycyc7XG5cbmNvbnN0IERFRkFVTFRfS0VZID0gJ2NhdXNlJztcbmNvbnN0IERFRkFVTFRfTElNSVQgPSA1O1xuXG4vKiogQWRkcyBTREsgaW5mbyB0byBhbiBldmVudC4gKi9cbmV4cG9ydCBjbGFzcyBMaW5rZWRFcnJvcnMgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ0xpbmtlZEVycm9ycyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nID0gTGlua2VkRXJyb3JzLmlkO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfa2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9saW1pdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsga2V5Pzogc3RyaW5nOyBsaW1pdD86IG51bWJlciB9ID0ge30pIHtcbiAgICB0aGlzLl9rZXkgPSBvcHRpb25zLmtleSB8fCBERUZBVUxUX0tFWTtcbiAgICB0aGlzLl9saW1pdCA9IG9wdGlvbnMubGltaXQgfHwgREVGQVVMVF9MSU1JVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZSgpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KSA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gZ2V0Q3VycmVudEh1YigpLmdldEludGVncmF0aW9uKExpbmtlZEVycm9ycyk7XG4gICAgICBpZiAoc2VsZikge1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gc2VsZi5faGFuZGxlciAmJiBzZWxmLl9oYW5kbGVyLmJpbmQoc2VsZik7XG4gICAgICAgIHJldHVybiB0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJyA/IGhhbmRsZXIoZXZlbnQsIGhpbnQpIDogZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgX2hhbmRsZXIoZXZlbnQ6IEV2ZW50LCBoaW50PzogRXZlbnRIaW50KTogUHJvbWlzZUxpa2U8RXZlbnQ+IHtcbiAgICBpZiAoIWV2ZW50LmV4Y2VwdGlvbiB8fCAhZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyB8fCAhaGludCB8fCAhaXNJbnN0YW5jZU9mKGhpbnQub3JpZ2luYWxFeGNlcHRpb24sIEVycm9yKSkge1xuICAgICAgcmV0dXJuIFN5bmNQcm9taXNlLnJlc29sdmUoZXZlbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgU3luY1Byb21pc2U8RXZlbnQ+KHJlc29sdmUgPT4ge1xuICAgICAgdm9pZCB0aGlzLl93YWxrRXJyb3JUcmVlKGhpbnQub3JpZ2luYWxFeGNlcHRpb24gYXMgRXJyb3IsIHRoaXMuX2tleSlcbiAgICAgICAgLnRoZW4oKGxpbmtlZEVycm9yczogRXhjZXB0aW9uW10pID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQuZXhjZXB0aW9uICYmIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBbLi4ubGlua2VkRXJyb3JzLCAuLi5ldmVudC5leGNlcHRpb24udmFsdWVzXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShldmVudCk7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKG51bGwsICgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHByaXZhdGUgX3dhbGtFcnJvclRyZWUoZXJyb3I6IEV4dGVuZGVkRXJyb3IsIGtleTogc3RyaW5nLCBzdGFjazogRXhjZXB0aW9uW10gPSBbXSk6IFByb21pc2VMaWtlPEV4Y2VwdGlvbltdPiB7XG4gICAgaWYgKCFpc0luc3RhbmNlT2YoZXJyb3Jba2V5XSwgRXJyb3IpIHx8IHN0YWNrLmxlbmd0aCArIDEgPj0gdGhpcy5fbGltaXQpIHtcbiAgICAgIHJldHVybiBTeW5jUHJvbWlzZS5yZXNvbHZlKHN0YWNrKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTeW5jUHJvbWlzZTxFeGNlcHRpb25bXT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdm9pZCBnZXRFeGNlcHRpb25Gcm9tRXJyb3IoZXJyb3Jba2V5XSlcbiAgICAgICAgLnRoZW4oKGV4Y2VwdGlvbjogRXhjZXB0aW9uKSA9PiB7XG4gICAgICAgICAgdm9pZCB0aGlzLl93YWxrRXJyb3JUcmVlKGVycm9yW2tleV0sIGtleSwgW2V4Y2VwdGlvbiwgLi4uc3RhY2tdKVxuICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgICAgIC50aGVuKG51bGwsICgpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4obnVsbCwgKCkgPT4ge1xuICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBIdWIsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5cbmxldCBtb2R1bGVDYWNoZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuLyoqIEV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgcGF0aHMgKi9cbmZ1bmN0aW9uIGdldFBhdGhzKCk6IHN0cmluZ1tdIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcmVxdWlyZS5jYWNoZSA/IE9iamVjdC5rZXlzKHJlcXVpcmUuY2FjaGUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIDogW107XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbn1cblxuLyoqIEV4dHJhY3QgaW5mb3JtYXRpb24gYWJvdXQgcGFja2FnZS5qc29uIG1vZHVsZXMgKi9cbmZ1bmN0aW9uIGNvbGxlY3RNb2R1bGVzKCk6IHtcbiAgW25hbWU6IHN0cmluZ106IHN0cmluZztcbn0ge1xuICBjb25zdCBtYWluUGF0aHMgPSAocmVxdWlyZS5tYWluICYmIHJlcXVpcmUubWFpbi5wYXRocykgfHwgW107XG4gIGNvbnN0IHBhdGhzID0gZ2V0UGF0aHMoKTtcbiAgY29uc3QgaW5mb3M6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogc3RyaW5nO1xuICB9ID0ge307XG4gIGNvbnN0IHNlZW46IHtcbiAgICBbcGF0aDogc3RyaW5nXTogYm9vbGVhbjtcbiAgfSA9IHt9O1xuXG4gIHBhdGhzLmZvckVhY2gocGF0aCA9PiB7XG4gICAgbGV0IGRpciA9IHBhdGg7XG5cbiAgICAvKiogVHJhdmVyc2UgZGlyZWN0b3JpZXMgdXB3YXJkIGluIHRoZSBzZWFyY2ggb2YgcGFja2FnZS5qc29uIGZpbGUgKi9cbiAgICBjb25zdCB1cGRpciA9ICgpOiB2b2lkIHwgKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGNvbnN0IG9yaWcgPSBkaXI7XG4gICAgICBkaXIgPSBkaXJuYW1lKG9yaWcpO1xuXG4gICAgICBpZiAoIWRpciB8fCBvcmlnID09PSBkaXIgfHwgc2VlbltvcmlnXSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKG1haW5QYXRocy5pbmRleE9mKGRpcikgPCAwKSB7XG4gICAgICAgIHJldHVybiB1cGRpcigpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwa2dmaWxlID0gam9pbihvcmlnLCAncGFja2FnZS5qc29uJyk7XG4gICAgICBzZWVuW29yaWddID0gdHJ1ZTtcblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHBrZ2ZpbGUpKSB7XG4gICAgICAgIHJldHVybiB1cGRpcigpO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpbmZvID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGtnZmlsZSwgJ3V0ZjgnKSkgYXMge1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgICAgIGluZm9zW2luZm8ubmFtZV0gPSBpbmZvLnZlcnNpb247XG4gICAgICB9IGNhdGNoIChfb08pIHtcbiAgICAgICAgLy8gbm8tZW1wdHlcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdXBkaXIoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGluZm9zO1xufVxuXG4vKiogQWRkIG5vZGUgbW9kdWxlcyAvIHBhY2thZ2VzIHRvIHRoZSBldmVudCAqL1xuZXhwb3J0IGNsYXNzIE1vZHVsZXMgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ01vZHVsZXMnO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIG5hbWU6IHN0cmluZyA9IE1vZHVsZXMuaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKGFkZEdsb2JhbEV2ZW50UHJvY2Vzc29yOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcihldmVudCA9PiB7XG4gICAgICBpZiAoIWdldEN1cnJlbnRIdWIoKS5nZXRJbnRlZ3JhdGlvbihNb2R1bGVzKSkge1xuICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgbW9kdWxlczogdGhpcy5fZ2V0TW9kdWxlcygpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBGZXRjaGVzIHRoZSBsaXN0IG9mIG1vZHVsZXMgYW5kIHRoZSB2ZXJzaW9ucyBsb2FkZWQgYnkgdGhlIGVudHJ5IGZpbGUgZm9yIHlvdXIgbm9kZS5qcyBhcHAuICovXG4gIHByaXZhdGUgX2dldE1vZHVsZXMoKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgaWYgKCFtb2R1bGVDYWNoZSkge1xuICAgICAgbW9kdWxlQ2FjaGUgPSBjb2xsZWN0TW9kdWxlcygpO1xuICAgIH1cbiAgICByZXR1cm4gbW9kdWxlQ2FjaGU7XG4gIH1cbn1cbiIsICJleHBvcnQgeyBDb25zb2xlIH0gZnJvbSAnLi9jb25zb2xlJztcbmV4cG9ydCB7IEh0dHAgfSBmcm9tICcuL2h0dHAnO1xuZXhwb3J0IHsgT25VbmNhdWdodEV4Y2VwdGlvbiB9IGZyb20gJy4vb251bmNhdWdodGV4Y2VwdGlvbic7XG5leHBvcnQgeyBPblVuaGFuZGxlZFJlamVjdGlvbiB9IGZyb20gJy4vb251bmhhbmRsZWRyZWplY3Rpb24nO1xuZXhwb3J0IHsgTGlua2VkRXJyb3JzIH0gZnJvbSAnLi9saW5rZWRlcnJvcnMnO1xuZXhwb3J0IHsgTW9kdWxlcyB9IGZyb20gJy4vbW9kdWxlcyc7XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgaW5pdEFuZEJpbmQsIEludGVncmF0aW9ucyBhcyBDb3JlSW50ZWdyYXRpb25zIH0gZnJvbSAnQHNlbnRyeS9jb3JlJztcbmltcG9ydCB7IGdldE1haW5DYXJyaWVyLCBzZXRIdWJPbkNhcnJpZXIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBTZXNzaW9uU3RhdHVzIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuaW1wb3J0ICogYXMgZG9tYWluIGZyb20gJ2RvbWFpbic7XG5cbmltcG9ydCB7IE5vZGVDbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyBDb25zb2xlLCBIdHRwLCBMaW5rZWRFcnJvcnMsIE9uVW5jYXVnaHRFeGNlcHRpb24sIE9uVW5oYW5kbGVkUmVqZWN0aW9uIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbnMnO1xuaW1wb3J0IHsgTm9kZU9wdGlvbnMgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRJbnRlZ3JhdGlvbnMgPSBbXG4gIC8vIENvbW1vblxuICBuZXcgQ29yZUludGVncmF0aW9ucy5JbmJvdW5kRmlsdGVycygpLFxuICBuZXcgQ29yZUludGVncmF0aW9ucy5GdW5jdGlvblRvU3RyaW5nKCksXG4gIC8vIE5hdGl2ZSBXcmFwcGVyc1xuICBuZXcgQ29uc29sZSgpLFxuICBuZXcgSHR0cCgpLFxuICAvLyBHbG9iYWwgSGFuZGxlcnNcbiAgbmV3IE9uVW5jYXVnaHRFeGNlcHRpb24oKSxcbiAgbmV3IE9uVW5oYW5kbGVkUmVqZWN0aW9uKCksXG4gIC8vIE1pc2NcbiAgbmV3IExpbmtlZEVycm9ycygpLFxuXTtcblxuLyoqXG4gKiBUaGUgU2VudHJ5IE5vZGUgU0RLIENsaWVudC5cbiAqXG4gKiBUbyB1c2UgdGhpcyBTREssIGNhbGwgdGhlIHtAbGluayBpbml0fSBmdW5jdGlvbiBhcyBlYXJseSBhcyBwb3NzaWJsZSBpbiB0aGVcbiAqIG1haW4gZW50cnkgbW9kdWxlLiBUbyBzZXQgY29udGV4dCBpbmZvcm1hdGlvbiBvciBzZW5kIG1hbnVhbCBldmVudHMsIHVzZSB0aGVcbiAqIHByb3ZpZGVkIG1ldGhvZHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGNvbnN0IHsgaW5pdCB9ID0gcmVxdWlyZSgnQHNlbnRyeS9ub2RlJyk7XG4gKlxuICogaW5pdCh7XG4gKiAgIGRzbjogJ19fRFNOX18nLFxuICogICAvLyAuLi5cbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGNvbnN0IHsgY29uZmlndXJlU2NvcGUgfSA9IHJlcXVpcmUoJ0BzZW50cnkvbm9kZScpO1xuICogY29uZmlndXJlU2NvcGUoKHNjb3BlOiBTY29wZSkgPT4ge1xuICogICBzY29wZS5zZXRFeHRyYSh7IGJhdHRlcnk6IDAuNyB9KTtcbiAqICAgc2NvcGUuc2V0VGFnKHsgdXNlcl9tb2RlOiAnYWRtaW4nIH0pO1xuICogICBzY29wZS5zZXRVc2VyKHsgaWQ6ICc0NzExJyB9KTtcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGNvbnN0IHsgYWRkQnJlYWRjcnVtYiB9ID0gcmVxdWlyZSgnQHNlbnRyeS9ub2RlJyk7XG4gKiBhZGRCcmVhZGNydW1iKHtcbiAqICAgbWVzc2FnZTogJ015IEJyZWFkY3J1bWInLFxuICogICAvLyAuLi5cbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYFxuICpcbiAqIGNvbnN0IFNlbnRyeSA9IHJlcXVpcmUoJ0BzZW50cnkvbm9kZScpO1xuICogU2VudHJ5LmNhcHR1cmVNZXNzYWdlKCdIZWxsbywgd29ybGQhJyk7XG4gKiBTZW50cnkuY2FwdHVyZUV4Y2VwdGlvbihuZXcgRXJyb3IoJ0dvb2QgYnllJykpO1xuICogU2VudHJ5LmNhcHR1cmVFdmVudCh7XG4gKiAgIG1lc3NhZ2U6ICdNYW51YWwnLFxuICogICBzdGFja3RyYWNlOiBbXG4gKiAgICAgLy8gLi4uXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBzZWUge0BsaW5rIE5vZGVPcHRpb25zfSBmb3IgZG9jdW1lbnRhdGlvbiBvbiBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0KG9wdGlvbnM6IE5vZGVPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgY29uc3QgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG4gIGNvbnN0IGF1dG9sb2FkZWRJbnRlZ3JhdGlvbnMgPSBjYXJyaWVyLl9fU0VOVFJZX18/LmludGVncmF0aW9ucyB8fCBbXTtcblxuICBvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMgPVxuICAgIG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucyA9PT0gZmFsc2VcbiAgICAgID8gW11cbiAgICAgIDogW1xuICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KG9wdGlvbnMuZGVmYXVsdEludGVncmF0aW9ucykgPyBvcHRpb25zLmRlZmF1bHRJbnRlZ3JhdGlvbnMgOiBkZWZhdWx0SW50ZWdyYXRpb25zKSxcbiAgICAgICAgICAuLi5hdXRvbG9hZGVkSW50ZWdyYXRpb25zLFxuICAgICAgICBdO1xuXG4gIGlmIChvcHRpb25zLmRzbiA9PT0gdW5kZWZpbmVkICYmIHByb2Nlc3MuZW52LlNFTlRSWV9EU04pIHtcbiAgICBvcHRpb25zLmRzbiA9IHByb2Nlc3MuZW52LlNFTlRSWV9EU047XG4gIH1cblxuICBpZiAob3B0aW9ucy50cmFjZXNTYW1wbGVSYXRlID09PSB1bmRlZmluZWQgJiYgcHJvY2Vzcy5lbnYuU0VOVFJZX1RSQUNFU19TQU1QTEVfUkFURSkge1xuICAgIGNvbnN0IHRyYWNlc1NhbXBsZVJhdGUgPSBwYXJzZUZsb2F0KHByb2Nlc3MuZW52LlNFTlRSWV9UUkFDRVNfU0FNUExFX1JBVEUpO1xuICAgIGlmIChpc0Zpbml0ZSh0cmFjZXNTYW1wbGVSYXRlKSkge1xuICAgICAgb3B0aW9ucy50cmFjZXNTYW1wbGVSYXRlID0gdHJhY2VzU2FtcGxlUmF0ZTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5yZWxlYXNlID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBkZXRlY3RlZFJlbGVhc2UgPSBnZXRTZW50cnlSZWxlYXNlKCk7XG4gICAgaWYgKGRldGVjdGVkUmVsZWFzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcHRpb25zLnJlbGVhc2UgPSBkZXRlY3RlZFJlbGVhc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHJlbGVhc2UgaXMgbm90IHByb3ZpZGVkLCB0aGVuIHdlIHNob3VsZCBkaXNhYmxlIGF1dG9TZXNzaW9uVHJhY2tpbmdcbiAgICAgIG9wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLmVudmlyb25tZW50ID09PSB1bmRlZmluZWQgJiYgcHJvY2Vzcy5lbnYuU0VOVFJZX0VOVklST05NRU5UKSB7XG4gICAgb3B0aW9ucy5lbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LlNFTlRSWV9FTlZJUk9OTUVOVDtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRzbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgb3B0aW9ucy5hdXRvU2Vzc2lvblRyYWNraW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3MsIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgaWYgKChkb21haW4gYXMgYW55KS5hY3RpdmUpIHtcbiAgICBzZXRIdWJPbkNhcnJpZXIoY2FycmllciwgZ2V0Q3VycmVudEh1YigpKTtcbiAgfVxuXG4gIGluaXRBbmRCaW5kKE5vZGVDbGllbnQsIG9wdGlvbnMpO1xuXG4gIGlmIChvcHRpb25zLmF1dG9TZXNzaW9uVHJhY2tpbmcpIHtcbiAgICBzdGFydFNlc3Npb25UcmFja2luZygpO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZ2V0dGVyIGZvciBsYXN0RXZlbnRJZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgbGFzdCBldmVudCBpZCBvZiBhIGNhcHR1cmVkIGV2ZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGFzdEV2ZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGdldEN1cnJlbnRIdWIoKS5sYXN0RXZlbnRJZCgpO1xufVxuXG4vKipcbiAqIENhbGwgYGZsdXNoKClgIG9uIHRoZSBjdXJyZW50IGNsaWVudCwgaWYgdGhlcmUgaXMgb25lLiBTZWUge0BsaW5rIENsaWVudC5mbHVzaH0uXG4gKlxuICogQHBhcmFtIHRpbWVvdXQgTWF4aW11bSB0aW1lIGluIG1zIHRoZSBjbGllbnQgc2hvdWxkIHdhaXQgdG8gZmx1c2ggaXRzIGV2ZW50IHF1ZXVlLiBPbWl0dGluZyB0aGlzIHBhcmFtZXRlciB3aWxsIGNhdXNlXG4gKiB0aGUgY2xpZW50IHRvIHdhaXQgdW50aWwgYWxsIGV2ZW50cyBhcmUgc2VudCBiZWZvcmUgcmVzb2x2aW5nIHRoZSBwcm9taXNlLlxuICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgcXVldWUgc3VjY2Vzc2Z1bGx5IGRyYWlucyBiZWZvcmUgdGhlIHRpbWVvdXQsIG9yIGBmYWxzZWAgaWYgaXRcbiAqIGRvZXNuJ3QgKG9yIGlmIHRoZXJlJ3Mgbm8gY2xpZW50IGRlZmluZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmx1c2godGltZW91dD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG4gIGlmIChjbGllbnQpIHtcbiAgICByZXR1cm4gY2xpZW50LmZsdXNoKHRpbWVvdXQpO1xuICB9XG4gIGxvZ2dlci53YXJuKCdDYW5ub3QgZmx1c2ggZXZlbnRzLiBObyBjbGllbnQgZGVmaW5lZC4nKTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XG59XG5cbi8qKlxuICogQ2FsbCBgY2xvc2UoKWAgb24gdGhlIGN1cnJlbnQgY2xpZW50LCBpZiB0aGVyZSBpcyBvbmUuIFNlZSB7QGxpbmsgQ2xpZW50LmNsb3NlfS5cbiAqXG4gKiBAcGFyYW0gdGltZW91dCBNYXhpbXVtIHRpbWUgaW4gbXMgdGhlIGNsaWVudCBzaG91bGQgd2FpdCB0byBmbHVzaCBpdHMgZXZlbnQgcXVldWUgYmVmb3JlIHNodXR0aW5nIGRvd24uIE9taXR0aW5nIHRoaXNcbiAqIHBhcmFtZXRlciB3aWxsIGNhdXNlIHRoZSBjbGllbnQgdG8gd2FpdCB1bnRpbCBhbGwgZXZlbnRzIGFyZSBzZW50IGJlZm9yZSBkaXNhYmxpbmcgaXRzZWxmLlxuICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHRvIGB0cnVlYCBpZiB0aGUgcXVldWUgc3VjY2Vzc2Z1bGx5IGRyYWlucyBiZWZvcmUgdGhlIHRpbWVvdXQsIG9yIGBmYWxzZWAgaWYgaXRcbiAqIGRvZXNuJ3QgKG9yIGlmIHRoZXJlJ3Mgbm8gY2xpZW50IGRlZmluZWQpLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xvc2UodGltZW91dD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBjbGllbnQgPSBnZXRDdXJyZW50SHViKCkuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG4gIGlmIChjbGllbnQpIHtcbiAgICByZXR1cm4gY2xpZW50LmNsb3NlKHRpbWVvdXQpO1xuICB9XG4gIGxvZ2dlci53YXJuKCdDYW5ub3QgZmx1c2ggZXZlbnRzIGFuZCBkaXNhYmxlIFNESy4gTm8gY2xpZW50IGRlZmluZWQuJyk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xufVxuXG4vKipcbiAqIEZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gaW5zdGFuY2Ugb2YgTm9kZUNsaWVudCBhbmQgY2hlY2tzIGlmIGF1dG9TZXNzaW9uVHJhY2tpbmcgb3B0aW9uIGlzIGVuYWJsZWQgZm9yIHRoYXQgY2xpZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0F1dG9TZXNzaW9uVHJhY2tpbmdFbmFibGVkKGNsaWVudD86IE5vZGVDbGllbnQpOiBib29sZWFuIHtcbiAgaWYgKGNsaWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGNsaWVudE9wdGlvbnM6IE5vZGVPcHRpb25zID0gY2xpZW50ICYmIGNsaWVudC5nZXRPcHRpb25zKCk7XG4gIGlmIChjbGllbnRPcHRpb25zICYmIGNsaWVudE9wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNsaWVudE9wdGlvbnMuYXV0b1Nlc3Npb25UcmFja2luZztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJlbGVhc2UgZHluYW1pY2FsbHkgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTZW50cnlSZWxlYXNlKGZhbGxiYWNrPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gQWx3YXlzIHJlYWQgZmlyc3QgYXMgU2VudHJ5IHRha2VzIHRoaXMgYXMgcHJlY2VkZW5jZVxuICBpZiAocHJvY2Vzcy5lbnYuU0VOVFJZX1JFTEVBU0UpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5lbnYuU0VOVFJZX1JFTEVBU0U7XG4gIH1cblxuICAvLyBUaGlzIHN1cHBvcnRzIHRoZSB2YXJpYWJsZSB0aGF0IHNlbnRyeS13ZWJwYWNrLXBsdWdpbiBpbmplY3RzXG4gIGNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdCgpO1xuICBpZiAoZ2xvYmFsLlNFTlRSWV9SRUxFQVNFICYmIGdsb2JhbC5TRU5UUllfUkVMRUFTRS5pZCkge1xuICAgIHJldHVybiBnbG9iYWwuU0VOVFJZX1JFTEVBU0UuaWQ7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8vIEdpdEh1YiBBY3Rpb25zIC0gaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vZW4vYWN0aW9ucy9jb25maWd1cmluZy1hbmQtbWFuYWdpbmctd29ya2Zsb3dzL3VzaW5nLWVudmlyb25tZW50LXZhcmlhYmxlcyNkZWZhdWx0LWVudmlyb25tZW50LXZhcmlhYmxlc1xuICAgIHByb2Nlc3MuZW52LkdJVEhVQl9TSEEgfHxcbiAgICAvLyBOZXRsaWZ5IC0gaHR0cHM6Ly9kb2NzLm5ldGxpZnkuY29tL2NvbmZpZ3VyZS1idWlsZHMvZW52aXJvbm1lbnQtdmFyaWFibGVzLyNidWlsZC1tZXRhZGF0YVxuICAgIHByb2Nlc3MuZW52LkNPTU1JVF9SRUYgfHxcbiAgICAvLyBWZXJjZWwgLSBodHRwczovL3ZlcmNlbC5jb20vZG9jcy92Mi9idWlsZC1zdGVwI3N5c3RlbS1lbnZpcm9ubWVudC12YXJpYWJsZXNcbiAgICBwcm9jZXNzLmVudi5WRVJDRUxfR0lUX0NPTU1JVF9TSEEgfHxcbiAgICBwcm9jZXNzLmVudi5WRVJDRUxfR0lUSFVCX0NPTU1JVF9TSEEgfHxcbiAgICBwcm9jZXNzLmVudi5WRVJDRUxfR0lUTEFCX0NPTU1JVF9TSEEgfHxcbiAgICBwcm9jZXNzLmVudi5WRVJDRUxfQklUQlVDS0VUX0NPTU1JVF9TSEEgfHxcbiAgICAvLyBaZWl0IChub3cga25vd24gYXMgVmVyY2VsKVxuICAgIHByb2Nlc3MuZW52LlpFSVRfR0lUSFVCX0NPTU1JVF9TSEEgfHxcbiAgICBwcm9jZXNzLmVudi5aRUlUX0dJVExBQl9DT01NSVRfU0hBIHx8XG4gICAgcHJvY2Vzcy5lbnYuWkVJVF9CSVRCVUNLRVRfQ09NTUlUX1NIQSB8fFxuICAgIGZhbGxiYWNrXG4gICk7XG59XG5cbi8qKlxuICogRW5hYmxlIGF1dG9tYXRpYyBTZXNzaW9uIFRyYWNraW5nIGZvciB0aGUgbm9kZSBwcm9jZXNzLlxuICovXG5mdW5jdGlvbiBzdGFydFNlc3Npb25UcmFja2luZygpOiB2b2lkIHtcbiAgY29uc3QgaHViID0gZ2V0Q3VycmVudEh1YigpO1xuICBodWIuc3RhcnRTZXNzaW9uKCk7XG4gIC8vIEVtaXR0ZWQgaW4gdGhlIGNhc2Ugb2YgaGVhbHRoeSBzZXNzaW9ucywgZXJyb3Igb2YgYG1lY2hhbmlzbS5oYW5kbGVkOiB0cnVlYCBhbmQgdW5oYW5kbGVkcmVqZWN0aW9ucyBiZWNhdXNlXG4gIC8vIFRoZSAnYmVmb3JlRXhpdCcgZXZlbnQgaXMgbm90IGVtaXR0ZWQgZm9yIGNvbmRpdGlvbnMgY2F1c2luZyBleHBsaWNpdCB0ZXJtaW5hdGlvbixcbiAgLy8gc3VjaCBhcyBjYWxsaW5nIHByb2Nlc3MuZXhpdCgpIG9yIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuXG4gIC8vIFJlZjogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9wcm9jZXNzLmh0bWwjcHJvY2Vzc19ldmVudF9iZWZvcmVleGl0XG4gIHByb2Nlc3Mub24oJ2JlZm9yZUV4aXQnLCAoKSA9PiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGh1Yi5nZXRTY29wZSgpPy5nZXRTZXNzaW9uKCk7XG4gICAgY29uc3QgdGVybWluYWxTdGF0ZXMgPSBbU2Vzc2lvblN0YXR1cy5FeGl0ZWQsIFNlc3Npb25TdGF0dXMuQ3Jhc2hlZF07XG4gICAgLy8gT25seSBjYWxsIGVuZFNlc3Npb24sIGlmIHRoZSBTZXNzaW9uIGV4aXN0cyBvbiBTY29wZSBhbmQgU2Vzc2lvblN0YXR1cyBpcyBub3QgYVxuICAgIC8vIFRlcm1pbmFsIFN0YXR1cyBpLmUuIEV4aXRlZCBvciBDcmFzaGVkIGJlY2F1c2VcbiAgICAvLyBcIldoZW4gYSBzZXNzaW9uIGlzIG1vdmVkIGF3YXkgZnJvbSBvayBpdCBtdXN0IG5vdCBiZSB1cGRhdGVkIGFueW1vcmUuXCJcbiAgICAvLyBSZWY6IGh0dHBzOi8vZGV2ZWxvcC5zZW50cnkuZGV2L3Nkay9zZXNzaW9ucy9cbiAgICBpZiAoc2Vzc2lvbiAmJiAhdGVybWluYWxTdGF0ZXMuaW5jbHVkZXMoc2Vzc2lvbi5zdGF0dXMpKSBodWIuZW5kU2Vzc2lvbigpO1xuICB9KTtcbn1cbiIsICJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5LlxuICpcbiAqIEBwYXJhbSB0YXJnZXREaXIgQWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5IHRvIHNjYW4uIEFsbCByZXR1cm5lZCBwYXRocyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoaXNcbiAqIGRpcmVjdG9yeS5cbiAqIEByZXR1cm5zIEFycmF5IGhvbGRpbmcgYWxsIHJlbGF0aXZlIHBhdGhzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwUmVhZERpclN5bmModGFyZ2V0RGlyOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHRhcmdldERpckFic1BhdGggPSBwYXRoLnJlc29sdmUodGFyZ2V0RGlyKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0RGlyQWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZWFkIGNvbnRlbnRzIG9mICR7dGFyZ2V0RGlyQWJzUGF0aH0uIERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC5gKTtcbiAgfVxuXG4gIGlmICghZnMuc3RhdFN5bmModGFyZ2V0RGlyQWJzUGF0aCkuaXNEaXJlY3RvcnkoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJlYWQgY29udGVudHMgb2YgJHt0YXJnZXREaXJBYnNQYXRofSwgYmVjYXVzZSBpdCBpcyBub3QgYSBkaXJlY3RvcnkuYCk7XG4gIH1cblxuICAvLyBUaGlzIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgaXRzIGNvbnRhaW5pbmcgZnVuY3Rpb24sIGBkZWVwUmVhZERpclN5bmNgIChleGNlcHQgdGhhdCAtIHB1cmVseSBmb3IgY29udmVuaWVuY2UgLSBpdFxuICAvLyBkZWFscyBpbiBhYnNvbHV0ZSBwYXRocyByYXRoZXIgdGhhbiByZWxhdGl2ZSBvbmVzKS4gV2UgbmVlZCB0aGlzIHRvIGJlIHNlcGFyYXRlIGZyb20gdGhlIG91dGVyIGZ1bmN0aW9uIHRvIHByZXNlcnZlXG4gIC8vIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYHRhcmdldERpckFic1BhdGhgIGFuZCBgY3VycmVudERpckFic1BhdGhgLlxuICBjb25zdCBkZWVwUmVhZEN1cnJlbnREaXIgPSAoY3VycmVudERpckFic1BhdGg6IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgICByZXR1cm4gZnMucmVhZGRpclN5bmMoY3VycmVudERpckFic1BhdGgpLnJlZHVjZSgoYWJzUGF0aHM6IHN0cmluZ1tdLCBpdGVtTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBpdGVtQWJzUGF0aCA9IHBhdGguam9pbihjdXJyZW50RGlyQWJzUGF0aCwgaXRlbU5hbWUpO1xuXG4gICAgICBpZiAoZnMuc3RhdFN5bmMoaXRlbUFic1BhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuIFsuLi5hYnNQYXRocywgLi4uZGVlcFJlYWRDdXJyZW50RGlyKGl0ZW1BYnNQYXRoKV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbLi4uYWJzUGF0aHMsIGl0ZW1BYnNQYXRoXTtcbiAgICB9LCBbXSk7XG4gIH07XG5cbiAgcmV0dXJuIGRlZXBSZWFkQ3VycmVudERpcih0YXJnZXREaXJBYnNQYXRoKS5tYXAoYWJzUGF0aCA9PiBwYXRoLnJlbGF0aXZlKHRhcmdldERpckFic1BhdGgsIGFic1BhdGgpKTtcbn1cbiIsICIvKiogVGhlIHN0YXR1cyBvZiBhbiBTcGFuLiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9leHBvcnRcbmV4cG9ydCBlbnVtIFNwYW5TdGF0dXMge1xuICAvKiogVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiAqL1xuICBPayA9ICdvaycsXG4gIC8qKiBEZWFkbGluZSBleHBpcmVkIGJlZm9yZSBvcGVyYXRpb24gY291bGQgY29tcGxldGUuICovXG4gIERlYWRsaW5lRXhjZWVkZWQgPSAnZGVhZGxpbmVfZXhjZWVkZWQnLFxuICAvKiogNDAxIFVuYXV0aG9yaXplZCAoYWN0dWFsbHkgZG9lcyBtZWFuIHVuYXV0aGVudGljYXRlZCBhY2NvcmRpbmcgdG8gUkZDIDcyMzUpICovXG4gIFVuYXV0aGVudGljYXRlZCA9ICd1bmF1dGhlbnRpY2F0ZWQnLFxuICAvKiogNDAzIEZvcmJpZGRlbiAqL1xuICBQZXJtaXNzaW9uRGVuaWVkID0gJ3Blcm1pc3Npb25fZGVuaWVkJyxcbiAgLyoqIDQwNCBOb3QgRm91bmQuIFNvbWUgcmVxdWVzdGVkIGVudGl0eSAoZmlsZSBvciBkaXJlY3RvcnkpIHdhcyBub3QgZm91bmQuICovXG4gIE5vdEZvdW5kID0gJ25vdF9mb3VuZCcsXG4gIC8qKiA0MjkgVG9vIE1hbnkgUmVxdWVzdHMgKi9cbiAgUmVzb3VyY2VFeGhhdXN0ZWQgPSAncmVzb3VyY2VfZXhoYXVzdGVkJyxcbiAgLyoqIENsaWVudCBzcGVjaWZpZWQgYW4gaW52YWxpZCBhcmd1bWVudC4gNHh4LiAqL1xuICBJbnZhbGlkQXJndW1lbnQgPSAnaW52YWxpZF9hcmd1bWVudCcsXG4gIC8qKiA1MDEgTm90IEltcGxlbWVudGVkICovXG4gIFVuaW1wbGVtZW50ZWQgPSAndW5pbXBsZW1lbnRlZCcsXG4gIC8qKiA1MDMgU2VydmljZSBVbmF2YWlsYWJsZSAqL1xuICBVbmF2YWlsYWJsZSA9ICd1bmF2YWlsYWJsZScsXG4gIC8qKiBPdGhlci9nZW5lcmljIDV4eC4gKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbF9lcnJvcicsXG4gIC8qKiBVbmtub3duLiBBbnkgbm9uLXN0YW5kYXJkIEhUVFAgc3RhdHVzIGNvZGUuICovXG4gIFVua25vd25FcnJvciA9ICd1bmtub3duX2Vycm9yJyxcbiAgLyoqIFRoZSBvcGVyYXRpb24gd2FzIGNhbmNlbGxlZCAodHlwaWNhbGx5IGJ5IHRoZSB1c2VyKS4gKi9cbiAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gIC8qKiBBbHJlYWR5IGV4aXN0cyAoNDA5KSAqL1xuICBBbHJlYWR5RXhpc3RzID0gJ2FscmVhZHlfZXhpc3RzJyxcbiAgLyoqIE9wZXJhdGlvbiB3YXMgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgc3lzdGVtIGlzIG5vdCBpbiBhIHN0YXRlIHJlcXVpcmVkIGZvciB0aGUgb3BlcmF0aW9uJ3MgKi9cbiAgRmFpbGVkUHJlY29uZGl0aW9uID0gJ2ZhaWxlZF9wcmVjb25kaXRpb24nLFxuICAvKiogVGhlIG9wZXJhdGlvbiB3YXMgYWJvcnRlZCwgdHlwaWNhbGx5IGR1ZSB0byBhIGNvbmN1cnJlbmN5IGlzc3VlLiAqL1xuICBBYm9ydGVkID0gJ2Fib3J0ZWQnLFxuICAvKiogT3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgcGFzdCB0aGUgdmFsaWQgcmFuZ2UuICovXG4gIE91dE9mUmFuZ2UgPSAnb3V0X29mX3JhbmdlJyxcbiAgLyoqIFVucmVjb3ZlcmFibGUgZGF0YSBsb3NzIG9yIGNvcnJ1cHRpb24gKi9cbiAgRGF0YUxvc3MgPSAnZGF0YV9sb3NzJyxcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1uYW1lc3BhY2UsIGltcG9ydC9leHBvcnRcbmV4cG9ydCBuYW1lc3BhY2UgU3BhblN0YXR1cyB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIEhUVFAgc3RhdHVzIGNvZGUgaW50byBhIHtAbGluayBTcGFuU3RhdHVzfS5cbiAgICpcbiAgICogQHBhcmFtIGh0dHBTdGF0dXMgVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuXG4gICAqIEByZXR1cm5zIFRoZSBzcGFuIHN0YXR1cyBvciB7QGxpbmsgU3BhblN0YXR1cy5Vbmtub3duRXJyb3J9LlxuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGZyb21IdHRwQ29kZShodHRwU3RhdHVzOiBudW1iZXIpOiBTcGFuU3RhdHVzIHtcbiAgICBpZiAoaHR0cFN0YXR1cyA8IDQwMCAmJiBodHRwU3RhdHVzID49IDEwMCkge1xuICAgICAgcmV0dXJuIFNwYW5TdGF0dXMuT2s7XG4gICAgfVxuXG4gICAgaWYgKGh0dHBTdGF0dXMgPj0gNDAwICYmIGh0dHBTdGF0dXMgPCA1MDApIHtcbiAgICAgIHN3aXRjaCAoaHR0cFN0YXR1cykge1xuICAgICAgICBjYXNlIDQwMTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5VbmF1dGhlbnRpY2F0ZWQ7XG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlBlcm1pc3Npb25EZW5pZWQ7XG4gICAgICAgIGNhc2UgNDA0OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLk5vdEZvdW5kO1xuICAgICAgICBjYXNlIDQwOTpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5BbHJlYWR5RXhpc3RzO1xuICAgICAgICBjYXNlIDQxMzpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5GYWlsZWRQcmVjb25kaXRpb247XG4gICAgICAgIGNhc2UgNDI5OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlJlc291cmNlRXhoYXVzdGVkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLkludmFsaWRBcmd1bWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaHR0cFN0YXR1cyA+PSA1MDAgJiYgaHR0cFN0YXR1cyA8IDYwMCkge1xuICAgICAgc3dpdGNoIChodHRwU3RhdHVzKSB7XG4gICAgICAgIGNhc2UgNTAxOlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlVuaW1wbGVtZW50ZWQ7XG4gICAgICAgIGNhc2UgNTAzOlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLlVuYXZhaWxhYmxlO1xuICAgICAgICBjYXNlIDUwNDpcbiAgICAgICAgICByZXR1cm4gU3BhblN0YXR1cy5EZWFkbGluZUV4Y2VlZGVkO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHJldHVybiBTcGFuU3RhdHVzLkludGVybmFsRXJyb3I7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFNwYW5TdGF0dXMuVW5rbm93bkVycm9yO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgT3B0aW9ucywgVHJhY2VwYXJlbnREYXRhLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgVFJBQ0VQQVJFTlRfUkVHRVhQID0gbmV3IFJlZ0V4cChcbiAgJ15bIFxcXFx0XSonICsgLy8gd2hpdGVzcGFjZVxuICAnKFswLTlhLWZdezMyfSk/JyArIC8vIHRyYWNlX2lkXG4gICctPyhbMC05YS1mXXsxNn0pPycgKyAvLyBzcGFuX2lkXG4gICctPyhbMDFdKT8nICsgLy8gc2FtcGxlZFxuICAgICdbIFxcXFx0XSokJywgLy8gd2hpdGVzcGFjZVxuKTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIGlmIHRyYWNpbmcgaXMgY3VycmVudGx5IGVuYWJsZWQuXG4gKlxuICogVHJhY2luZyBpcyBlbmFibGVkIHdoZW4gYXQgbGVhc3Qgb25lIG9mIGB0cmFjZXNTYW1wbGVSYXRlYCBhbmQgYHRyYWNlc1NhbXBsZXJgIGlzIGRlZmluZWQgaW4gdGhlIFNESyBjb25maWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNUcmFjaW5nRW5hYmxlZChcbiAgb3B0aW9uczogT3B0aW9ucyB8IHVuZGVmaW5lZCA9IGdldEN1cnJlbnRIdWIoKVxuICAgIC5nZXRDbGllbnQoKVxuICAgID8uZ2V0T3B0aW9ucygpLFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIW9wdGlvbnMgJiYgKCd0cmFjZXNTYW1wbGVSYXRlJyBpbiBvcHRpb25zIHx8ICd0cmFjZXNTYW1wbGVyJyBpbiBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRyYW5zYWN0aW9uIGNvbnRleHQgZGF0YSBmcm9tIGEgYHNlbnRyeS10cmFjZWAgaGVhZGVyLlxuICpcbiAqIEBwYXJhbSB0cmFjZXBhcmVudCBUcmFjZXBhcmVudCBzdHJpbmdcbiAqXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyBkYXRhIGZyb20gdGhlIGhlYWRlciwgb3IgdW5kZWZpbmVkIGlmIHRyYWNlcGFyZW50IHN0cmluZyBpcyBtYWxmb3JtZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RUcmFjZXBhcmVudERhdGEodHJhY2VwYXJlbnQ6IHN0cmluZyk6IFRyYWNlcGFyZW50RGF0YSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hdGNoZXMgPSB0cmFjZXBhcmVudC5tYXRjaChUUkFDRVBBUkVOVF9SRUdFWFApO1xuICBpZiAobWF0Y2hlcykge1xuICAgIGxldCBwYXJlbnRTYW1wbGVkOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuICAgIGlmIChtYXRjaGVzWzNdID09PSAnMScpIHtcbiAgICAgIHBhcmVudFNhbXBsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAobWF0Y2hlc1szXSA9PT0gJzAnKSB7XG4gICAgICBwYXJlbnRTYW1wbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0cmFjZUlkOiBtYXRjaGVzWzFdLFxuICAgICAgcGFyZW50U2FtcGxlZCxcbiAgICAgIHBhcmVudFNwYW5JZDogbWF0Y2hlc1syXSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBHcmFicyBhY3RpdmUgdHJhbnNhY3Rpb24gb2ZmIHNjb3BlLCBpZiBhbnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBY3RpdmVUcmFuc2FjdGlvbjxUIGV4dGVuZHMgVHJhbnNhY3Rpb24+KGh1YjogSHViID0gZ2V0Q3VycmVudEh1YigpKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBodWI/LmdldFNjb3BlKCk/LmdldFRyYW5zYWN0aW9uKCkgYXMgVCB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIG1pbGxpc2Vjb25kcyB0byBzZWNvbmRzXG4gKiBAcGFyYW0gdGltZSB0aW1lIGluIG1zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtc1RvU2VjKHRpbWU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiB0aW1lIC8gMTAwMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIHNlY29uZHMgdG8gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gdGltZSB0aW1lIGluIHNlY29uZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlY1RvTXModGltZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRpbWUgKiAxMDAwO1xufVxuXG4vLyBzbyBpdCBjYW4gYmUgdXNlZCBpbiBtYW51YWwgaW5zdHJ1bWVudGF0aW9uIHdpdGhvdXQgbmVjZXNzaXRhdGluZyBhIGhhcmQgZGVwZW5kZW5jeSBvbiBAc2VudHJ5L3V0aWxzXG5leHBvcnQgeyBzdHJpcFVybFF1ZXJ5QW5kRnJhZ21lbnQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbiIsICJpbXBvcnQgeyBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5pbXBvcnQgeyBnZXRBY3RpdmVUcmFuc2FjdGlvbiB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIENvbmZpZ3VyZXMgZ2xvYmFsIGVycm9yIGxpc3RlbmVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJFcnJvckluc3RydW1lbnRhdGlvbigpOiB2b2lkIHtcbiAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgY2FsbGJhY2s6IGVycm9yQ2FsbGJhY2ssXG4gICAgdHlwZTogJ2Vycm9yJyxcbiAgfSk7XG4gIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgIGNhbGxiYWNrOiBlcnJvckNhbGxiYWNrLFxuICAgIHR5cGU6ICd1bmhhbmRsZWRyZWplY3Rpb24nLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJZiBhbiBlcnJvciBvciB1bmhhbmRsZWQgcHJvbWlzZSBvY2N1cnMsIHdlIG1hcmsgdGhlIGFjdGl2ZSB0cmFuc2FjdGlvbiBhcyBmYWlsZWRcbiAqL1xuZnVuY3Rpb24gZXJyb3JDYWxsYmFjaygpOiB2b2lkIHtcbiAgY29uc3QgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gVHJhbnNhY3Rpb246ICR7U3BhblN0YXR1cy5JbnRlcm5hbEVycm9yfSAtPiBHbG9iYWwgZXJyb3Igb2NjdXJlZGApO1xuICAgIGFjdGl2ZVRyYW5zYWN0aW9uLnNldFN0YXR1cyhTcGFuU3RhdHVzLkludGVybmFsRXJyb3IpO1xuICB9XG59XG4iLCAiLy8gU3RvcmUgZmluaXNoIHJlYXNvbnMgaW4gdHVwbGUgdG8gc2F2ZSBvbiBidW5kbGUgc2l6ZVxuLy8gUmVhZG9ubHkgdHlwZSBzaG91bGQgZW5mb3JjZSB0aGF0IHRoaXMgaXMgbm90IG11dGF0ZWQuXG5leHBvcnQgY29uc3QgRklOSVNIX1JFQVNPTl9UQUcgPSAnZmluaXNoUmVhc29uJztcblxuZXhwb3J0IGNvbnN0IElETEVfVFJBTlNBQ1RJT05fRklOSVNIX1JFQVNPTlMgPSBbJ2hlYXJ0YmVhdEZhaWxlZCcsICdpZGxlVGltZW91dCcsICdkb2N1bWVudEhpZGRlbiddIGFzIGNvbnN0O1xuIiwgIi8qIGVzbGludC1kaXNhYmxlIG1heC1saW5lcyAqL1xuaW1wb3J0IHsgUHJpbWl0aXZlLCBTcGFuIGFzIFNwYW5JbnRlcmZhY2UsIFNwYW5Db250ZXh0LCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZHJvcFVuZGVmaW5lZEtleXMsIHRpbWVzdGFtcFdpdGhNcywgdXVpZDQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5cbi8qKlxuICogS2VlcHMgdHJhY2sgb2YgZmluaXNoZWQgc3BhbnMgZm9yIGEgZ2l2ZW4gdHJhbnNhY3Rpb25cbiAqIEBpbnRlcm5hbFxuICogQGhpZGVjb25zdHJ1Y3RvclxuICogQGhpZGRlblxuICovXG5leHBvcnQgY2xhc3MgU3BhblJlY29yZGVyIHtcbiAgcHVibGljIHNwYW5zOiBTcGFuW10gPSBbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tYXhsZW46IG51bWJlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IobWF4bGVuOiBudW1iZXIgPSAxMDAwKSB7XG4gICAgdGhpcy5fbWF4bGVuID0gbWF4bGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMganVzdCBzbyB0aGF0IHdlIGRvbid0IHJ1biBvdXQgb2YgbWVtb3J5IHdoaWxlIHJlY29yZGluZyBhIGxvdFxuICAgKiBvZiBzcGFucy4gQXQgc29tZSBwb2ludCB3ZSBqdXN0IHN0b3AgYW5kIGZsdXNoIG91dCB0aGUgc3RhcnQgb2YgdGhlXG4gICAqIHRyYWNlIHRyZWUgKGkuZS50aGUgZmlyc3QgbiBzcGFucyB3aXRoIHRoZSBzbWFsbGVzdFxuICAgKiBzdGFydF90aW1lc3RhbXApLlxuICAgKi9cbiAgcHVibGljIGFkZChzcGFuOiBTcGFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3BhbnMubGVuZ3RoID4gdGhpcy5fbWF4bGVuKSB7XG4gICAgICBzcGFuLnNwYW5SZWNvcmRlciA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zcGFucy5wdXNoKHNwYW4pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNwYW4gY29udGFpbnMgYWxsIGRhdGEgYWJvdXQgYSBzcGFuXG4gKi9cbmV4cG9ydCBjbGFzcyBTcGFuIGltcGxlbWVudHMgU3BhbkludGVyZmFjZSB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRyYWNlSWQ6IHN0cmluZyA9IHV1aWQ0KCk7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3BhbklkOiBzdHJpbmcgPSB1dWlkNCgpLnN1YnN0cmluZygxNik7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBrZWVwZXIgb2YgdGhlIHN0YXR1c1xuICAgKi9cbiAgcHVibGljIHN0YXR1cz86IFNwYW5TdGF0dXMgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2FtcGxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRpbWVzdGFtcCBpbiBzZWNvbmRzIHdoZW4gdGhlIHNwYW4gd2FzIGNyZWF0ZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhcnRUaW1lc3RhbXA6IG51bWJlciA9IHRpbWVzdGFtcFdpdGhNcygpO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgaW4gc2Vjb25kcyB3aGVuIHRoZSBzcGFuIGVuZGVkLlxuICAgKi9cbiAgcHVibGljIGVuZFRpbWVzdGFtcD86IG51bWJlcjtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBvcD86IHN0cmluZztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyB0YWdzOiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9ID0ge307XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBwdWJsaWMgZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIHNwYW5zIHRoYXQgd2VyZSBmaW5hbGl6ZWRcbiAgICovXG4gIHB1YmxpYyBzcGFuUmVjb3JkZXI/OiBTcGFuUmVjb3JkZXI7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgdHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbjtcblxuICAvKipcbiAgICogWW91IHNob3VsZCBuZXZlciBjYWxsIHRoZSBjb25zdHJ1Y3RvciBtYW51YWxseSwgYWx3YXlzIHVzZSBgU2VudHJ5LnN0YXJ0VHJhbnNhY3Rpb24oKWBcbiAgICogb3IgY2FsbCBgc3RhcnRDaGlsZCgpYCBvbiBhbiBleGlzdGluZyBzcGFuLlxuICAgKiBAaW50ZXJuYWxcbiAgICogQGhpZGVjb25zdHJ1Y3RvclxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc3BhbkNvbnRleHQ/OiBTcGFuQ29udGV4dCkge1xuICAgIGlmICghc3BhbkNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQudHJhY2VJZCkge1xuICAgICAgdGhpcy50cmFjZUlkID0gc3BhbkNvbnRleHQudHJhY2VJZDtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LnNwYW5JZCkge1xuICAgICAgdGhpcy5zcGFuSWQgPSBzcGFuQ29udGV4dC5zcGFuSWQ7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5wYXJlbnRTcGFuSWQpIHtcbiAgICAgIHRoaXMucGFyZW50U3BhbklkID0gc3BhbkNvbnRleHQucGFyZW50U3BhbklkO1xuICAgIH1cbiAgICAvLyBXZSB3YW50IHRvIGluY2x1ZGUgYm9vbGVhbnMgYXMgd2VsbCBoZXJlXG4gICAgaWYgKCdzYW1wbGVkJyBpbiBzcGFuQ29udGV4dCkge1xuICAgICAgdGhpcy5zYW1wbGVkID0gc3BhbkNvbnRleHQuc2FtcGxlZDtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0Lm9wKSB7XG4gICAgICB0aGlzLm9wID0gc3BhbkNvbnRleHQub3A7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5kZXNjcmlwdGlvbikge1xuICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IHNwYW5Db250ZXh0LmRlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhID0gc3BhbkNvbnRleHQuZGF0YTtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LnRhZ3MpIHtcbiAgICAgIHRoaXMudGFncyA9IHNwYW5Db250ZXh0LnRhZ3M7XG4gICAgfVxuICAgIGlmIChzcGFuQ29udGV4dC5zdGF0dXMpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gc3BhbkNvbnRleHQuc3RhdHVzO1xuICAgIH1cbiAgICBpZiAoc3BhbkNvbnRleHQuc3RhcnRUaW1lc3RhbXApIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lc3RhbXAgPSBzcGFuQ29udGV4dC5zdGFydFRpbWVzdGFtcDtcbiAgICB9XG4gICAgaWYgKHNwYW5Db250ZXh0LmVuZFRpbWVzdGFtcCkge1xuICAgICAgdGhpcy5lbmRUaW1lc3RhbXAgPSBzcGFuQ29udGV4dC5lbmRUaW1lc3RhbXA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBwdWJsaWMgY2hpbGQoXG4gICAgc3BhbkNvbnRleHQ/OiBQaWNrPFNwYW5Db250ZXh0LCBFeGNsdWRlPGtleW9mIFNwYW5Db250ZXh0LCAnc3BhbklkJyB8ICdzYW1wbGVkJyB8ICd0cmFjZUlkJyB8ICdwYXJlbnRTcGFuSWQnPj4sXG4gICk6IFNwYW4ge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0Q2hpbGQoc3BhbkNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhcnRDaGlsZChcbiAgICBzcGFuQ29udGV4dD86IFBpY2s8U3BhbkNvbnRleHQsIEV4Y2x1ZGU8a2V5b2YgU3BhbkNvbnRleHQsICdzcGFuSWQnIHwgJ3NhbXBsZWQnIHwgJ3RyYWNlSWQnIHwgJ3BhcmVudFNwYW5JZCc+PixcbiAgKTogU3BhbiB7XG4gICAgY29uc3QgY2hpbGRTcGFuID0gbmV3IFNwYW4oe1xuICAgICAgLi4uc3BhbkNvbnRleHQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMuc3BhbklkLFxuICAgICAgc2FtcGxlZDogdGhpcy5zYW1wbGVkLFxuICAgICAgdHJhY2VJZDogdGhpcy50cmFjZUlkLFxuICAgIH0pO1xuXG4gICAgY2hpbGRTcGFuLnNwYW5SZWNvcmRlciA9IHRoaXMuc3BhblJlY29yZGVyO1xuICAgIGlmIChjaGlsZFNwYW4uc3BhblJlY29yZGVyKSB7XG4gICAgICBjaGlsZFNwYW4uc3BhblJlY29yZGVyLmFkZChjaGlsZFNwYW4pO1xuICAgIH1cblxuICAgIGNoaWxkU3Bhbi50cmFuc2FjdGlvbiA9IHRoaXMudHJhbnNhY3Rpb247XG5cbiAgICByZXR1cm4gY2hpbGRTcGFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0VGFnKGtleTogc3RyaW5nLCB2YWx1ZTogUHJpbWl0aXZlKTogdGhpcyB7XG4gICAgdGhpcy50YWdzID0geyAuLi50aGlzLnRhZ3MsIFtrZXldOiB2YWx1ZSB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSwgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICBwdWJsaWMgc2V0RGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IHRoaXMge1xuICAgIHRoaXMuZGF0YSA9IHsgLi4udGhpcy5kYXRhLCBba2V5XTogdmFsdWUgfTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldFN0YXR1cyh2YWx1ZTogU3BhblN0YXR1cyk6IHRoaXMge1xuICAgIHRoaXMuc3RhdHVzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXRIdHRwU3RhdHVzKGh0dHBTdGF0dXM6IG51bWJlcik6IHRoaXMge1xuICAgIHRoaXMuc2V0VGFnKCdodHRwLnN0YXR1c19jb2RlJywgU3RyaW5nKGh0dHBTdGF0dXMpKTtcbiAgICBjb25zdCBzcGFuU3RhdHVzID0gU3BhblN0YXR1cy5mcm9tSHR0cENvZGUoaHR0cFN0YXR1cyk7XG4gICAgaWYgKHNwYW5TdGF0dXMgIT09IFNwYW5TdGF0dXMuVW5rbm93bkVycm9yKSB7XG4gICAgICB0aGlzLnNldFN0YXR1cyhzcGFuU3RhdHVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBpc1N1Y2Nlc3MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzID09PSBTcGFuU3RhdHVzLk9rO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgZmluaXNoKGVuZFRpbWVzdGFtcD86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZW5kVGltZXN0YW1wID0gdHlwZW9mIGVuZFRpbWVzdGFtcCA9PT0gJ251bWJlcicgPyBlbmRUaW1lc3RhbXAgOiB0aW1lc3RhbXBXaXRoTXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRvVHJhY2VwYXJlbnQoKTogc3RyaW5nIHtcbiAgICBsZXQgc2FtcGxlZFN0cmluZyA9ICcnO1xuICAgIGlmICh0aGlzLnNhbXBsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2FtcGxlZFN0cmluZyA9IHRoaXMuc2FtcGxlZCA/ICctMScgOiAnLTAnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50cmFjZUlkfS0ke3RoaXMuc3BhbklkfSR7c2FtcGxlZFN0cmluZ31gO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgdG9Db250ZXh0KCk6IFNwYW5Db250ZXh0IHtcbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBlbmRUaW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLFxuICAgICAgb3A6IHRoaXMub3AsXG4gICAgICBwYXJlbnRTcGFuSWQ6IHRoaXMucGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogdGhpcy5zYW1wbGVkLFxuICAgICAgc3BhbklkOiB0aGlzLnNwYW5JZCxcbiAgICAgIHN0YXJ0VGltZXN0YW1wOiB0aGlzLnN0YXJ0VGltZXN0YW1wLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHRhZ3M6IHRoaXMudGFncyxcbiAgICAgIHRyYWNlSWQ6IHRoaXMudHJhY2VJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHVwZGF0ZVdpdGhDb250ZXh0KHNwYW5Db250ZXh0OiBTcGFuQ29udGV4dCk6IHRoaXMge1xuICAgIHRoaXMuZGF0YSA9IHNwYW5Db250ZXh0LmRhdGEgPz8ge307XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHNwYW5Db250ZXh0LmRlc2NyaXB0aW9uO1xuICAgIHRoaXMuZW5kVGltZXN0YW1wID0gc3BhbkNvbnRleHQuZW5kVGltZXN0YW1wO1xuICAgIHRoaXMub3AgPSBzcGFuQ29udGV4dC5vcDtcbiAgICB0aGlzLnBhcmVudFNwYW5JZCA9IHNwYW5Db250ZXh0LnBhcmVudFNwYW5JZDtcbiAgICB0aGlzLnNhbXBsZWQgPSBzcGFuQ29udGV4dC5zYW1wbGVkO1xuICAgIHRoaXMuc3BhbklkID0gc3BhbkNvbnRleHQuc3BhbklkID8/IHRoaXMuc3BhbklkO1xuICAgIHRoaXMuc3RhcnRUaW1lc3RhbXAgPSBzcGFuQ29udGV4dC5zdGFydFRpbWVzdGFtcCA/PyB0aGlzLnN0YXJ0VGltZXN0YW1wO1xuICAgIHRoaXMuc3RhdHVzID0gc3BhbkNvbnRleHQuc3RhdHVzO1xuICAgIHRoaXMudGFncyA9IHNwYW5Db250ZXh0LnRhZ3MgPz8ge307XG4gICAgdGhpcy50cmFjZUlkID0gc3BhbkNvbnRleHQudHJhY2VJZCA/PyB0aGlzLnRyYWNlSWQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGdldFRyYWNlQ29udGV4dCgpOiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBvcD86IHN0cmluZztcbiAgICBwYXJlbnRfc3Bhbl9pZD86IHN0cmluZztcbiAgICBzcGFuX2lkOiBzdHJpbmc7XG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9O1xuICAgIHRyYWNlX2lkOiBzdHJpbmc7XG4gIH0ge1xuICAgIHJldHVybiBkcm9wVW5kZWZpbmVkS2V5cyh7XG4gICAgICBkYXRhOiBPYmplY3Qua2V5cyh0aGlzLmRhdGEpLmxlbmd0aCA+IDAgPyB0aGlzLmRhdGEgOiB1bmRlZmluZWQsXG4gICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgIG9wOiB0aGlzLm9wLFxuICAgICAgcGFyZW50X3NwYW5faWQ6IHRoaXMucGFyZW50U3BhbklkLFxuICAgICAgc3Bhbl9pZDogdGhpcy5zcGFuSWQsXG4gICAgICBzdGF0dXM6IHRoaXMuc3RhdHVzLFxuICAgICAgdGFnczogT2JqZWN0LmtleXModGhpcy50YWdzKS5sZW5ndGggPiAwID8gdGhpcy50YWdzIDogdW5kZWZpbmVkLFxuICAgICAgdHJhY2VfaWQ6IHRoaXMudHJhY2VJZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRvSlNPTigpOiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBkYXRhPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBvcD86IHN0cmluZztcbiAgICBwYXJlbnRfc3Bhbl9pZD86IHN0cmluZztcbiAgICBzcGFuX2lkOiBzdHJpbmc7XG4gICAgc3RhcnRfdGltZXN0YW1wOiBudW1iZXI7XG4gICAgc3RhdHVzPzogc3RyaW5nO1xuICAgIHRhZ3M/OiB7IFtrZXk6IHN0cmluZ106IFByaW1pdGl2ZSB9O1xuICAgIHRpbWVzdGFtcD86IG51bWJlcjtcbiAgICB0cmFjZV9pZDogc3RyaW5nO1xuICB9IHtcbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgZGF0YTogT2JqZWN0LmtleXModGhpcy5kYXRhKS5sZW5ndGggPiAwID8gdGhpcy5kYXRhIDogdW5kZWZpbmVkLFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBvcDogdGhpcy5vcCxcbiAgICAgIHBhcmVudF9zcGFuX2lkOiB0aGlzLnBhcmVudFNwYW5JZCxcbiAgICAgIHNwYW5faWQ6IHRoaXMuc3BhbklkLFxuICAgICAgc3RhcnRfdGltZXN0YW1wOiB0aGlzLnN0YXJ0VGltZXN0YW1wLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIHRhZ3M6IE9iamVjdC5rZXlzKHRoaXMudGFncykubGVuZ3RoID4gMCA/IHRoaXMudGFncyA6IHVuZGVmaW5lZCxcbiAgICAgIHRpbWVzdGFtcDogdGhpcy5lbmRUaW1lc3RhbXAsXG4gICAgICB0cmFjZV9pZDogdGhpcy50cmFjZUlkLFxuICAgIH0pO1xuICB9XG59XG4iLCAiaW1wb3J0IHsgZ2V0Q3VycmVudEh1YiwgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHtcbiAgRXZlbnQsXG4gIE1lYXN1cmVtZW50cyxcbiAgT3V0Y29tZSxcbiAgVHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb25JbnRlcmZhY2UsXG4gIFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgVHJhbnNhY3Rpb25NZXRhZGF0YSxcbn0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBkcm9wVW5kZWZpbmVkS2V5cywgaXNJbnN0YW5jZU9mLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgU3BhbiBhcyBTcGFuQ2xhc3MsIFNwYW5SZWNvcmRlciB9IGZyb20gJy4vc3Bhbic7XG5cbi8qKiBKU0RvYyAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uIGV4dGVuZHMgU3BhbkNsYXNzIGltcGxlbWVudHMgVHJhbnNhY3Rpb25JbnRlcmZhY2Uge1xuICBwdWJsaWMgbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBtZXRhZGF0YTogVHJhbnNhY3Rpb25NZXRhZGF0YTtcblxuICBwcml2YXRlIF9tZWFzdXJlbWVudHM6IE1lYXN1cmVtZW50cyA9IHt9O1xuXG4gIC8qKlxuICAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGh1Yi5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX2h1YjogSHViID0gKGdldEN1cnJlbnRIdWIoKSBhcyB1bmtub3duKSBhcyBIdWI7XG5cbiAgcHJpdmF0ZSBfdHJpbUVuZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBtYW51YWxseS4gVGhvc2UgaW5zdHJ1bWVudGluZyB0cmFjaW5nIHNob3VsZCB1c2VcbiAgICogYFNlbnRyeS5zdGFydFRyYW5zYWN0aW9uKClgLCBhbmQgaW50ZXJuYWwgbWV0aG9kcyBzaG91bGQgdXNlIGBodWIuc3RhcnRUcmFuc2FjdGlvbigpYC5cbiAgICogQGludGVybmFsXG4gICAqIEBoaWRlY29uc3RydWN0b3JcbiAgICogQGhpZGRlblxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRyYW5zYWN0aW9uQ29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0LCBodWI/OiBIdWIpIHtcbiAgICBzdXBlcih0cmFuc2FjdGlvbkNvbnRleHQpO1xuXG4gICAgaWYgKGlzSW5zdGFuY2VPZihodWIsIEh1YikpIHtcbiAgICAgIHRoaXMuX2h1YiA9IGh1YiBhcyBIdWI7XG4gICAgfVxuXG4gICAgdGhpcy5uYW1lID0gdHJhbnNhY3Rpb25Db250ZXh0Lm5hbWUgfHwgJyc7XG5cbiAgICB0aGlzLm1ldGFkYXRhID0gdHJhbnNhY3Rpb25Db250ZXh0Lm1ldGFkYXRhIHx8IHt9O1xuICAgIHRoaXMuX3RyaW1FbmQgPSB0cmFuc2FjdGlvbkNvbnRleHQudHJpbUVuZDtcblxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSB0cmFuc2FjdGlvbnMgYXJlIGFsc28gc3BhbnMsIGFuZCBzcGFucyBoYXZlIGEgdHJhbnNhY3Rpb24gcG9pbnRlclxuICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTRG9jXG4gICAqL1xuICBwdWJsaWMgc2V0TmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaGVzIFNwYW5SZWNvcmRlciB0byB0aGUgc3BhbiBpdHNlbGZcbiAgICogQHBhcmFtIG1heGxlbiBtYXhpbXVtIG51bWJlciBvZiBzcGFucyB0aGF0IGNhbiBiZSByZWNvcmRlZFxuICAgKi9cbiAgcHVibGljIGluaXRTcGFuUmVjb3JkZXIobWF4bGVuOiBudW1iZXIgPSAxMDAwKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNwYW5SZWNvcmRlcikge1xuICAgICAgdGhpcy5zcGFuUmVjb3JkZXIgPSBuZXcgU3BhblJlY29yZGVyKG1heGxlbik7XG4gICAgfVxuICAgIHRoaXMuc3BhblJlY29yZGVyLmFkZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb2JzZXJ2ZWQgbWVhc3VyZW1lbnRzIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgKiBAaGlkZGVuXG4gICAqL1xuICBwdWJsaWMgc2V0TWVhc3VyZW1lbnRzKG1lYXN1cmVtZW50czogTWVhc3VyZW1lbnRzKTogdm9pZCB7XG4gICAgdGhpcy5fbWVhc3VyZW1lbnRzID0geyAuLi5tZWFzdXJlbWVudHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgbWV0YWRhdGEgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAqIEBoaWRkZW5cbiAgICovXG4gIHB1YmxpYyBzZXRNZXRhZGF0YShuZXdNZXRhZGF0YTogVHJhbnNhY3Rpb25NZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMubWV0YWRhdGEgPSB7IC4uLnRoaXMubWV0YWRhdGEsIC4uLm5ld01ldGFkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBmaW5pc2goZW5kVGltZXN0YW1wPzogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgZmluaXNoZWQsIHNvIHdlIHNob3VsZCBub3QgZmx1c2ggaXQgYWdhaW4uXG4gICAgaWYgKHRoaXMuZW5kVGltZXN0YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm5hbWUpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdUcmFuc2FjdGlvbiBoYXMgbm8gbmFtZSwgZmFsbGluZyBiYWNrIHRvIGA8dW5sYWJlbGVkIHRyYW5zYWN0aW9uPmAuJyk7XG4gICAgICB0aGlzLm5hbWUgPSAnPHVubGFiZWxlZCB0cmFuc2FjdGlvbj4nO1xuICAgIH1cblxuICAgIC8vIGp1c3Qgc2V0cyB0aGUgZW5kIHRpbWVzdGFtcFxuICAgIHN1cGVyLmZpbmlzaChlbmRUaW1lc3RhbXApO1xuXG4gICAgaWYgKHRoaXMuc2FtcGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgLy8gQXQgdGhpcyBwb2ludCBpZiBgc2FtcGxlZCAhPT0gdHJ1ZWAgd2Ugd2FudCB0byBkaXNjYXJkIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBEaXNjYXJkaW5nIHRyYW5zYWN0aW9uIGJlY2F1c2UgaXRzIHRyYWNlIHdhcyBub3QgY2hvc2VuIHRvIGJlIHNhbXBsZWQuJyk7XG5cbiAgICAgIHRoaXMuX2h1YlxuICAgICAgICAuZ2V0Q2xpZW50KClcbiAgICAgICAgPy5nZXRUcmFuc3BvcnQ/LigpXG4gICAgICAgIC5yZWNvcmRMb3N0RXZlbnQ/LihPdXRjb21lLlNhbXBsZVJhdGUsICd0cmFuc2FjdGlvbicpO1xuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmlzaGVkU3BhbnMgPSB0aGlzLnNwYW5SZWNvcmRlciA/IHRoaXMuc3BhblJlY29yZGVyLnNwYW5zLmZpbHRlcihzID0+IHMgIT09IHRoaXMgJiYgcy5lbmRUaW1lc3RhbXApIDogW107XG5cbiAgICBpZiAodGhpcy5fdHJpbUVuZCAmJiBmaW5pc2hlZFNwYW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZW5kVGltZXN0YW1wID0gZmluaXNoZWRTcGFucy5yZWR1Y2UoKHByZXY6IFNwYW5DbGFzcywgY3VycmVudDogU3BhbkNsYXNzKSA9PiB7XG4gICAgICAgIGlmIChwcmV2LmVuZFRpbWVzdGFtcCAmJiBjdXJyZW50LmVuZFRpbWVzdGFtcCkge1xuICAgICAgICAgIHJldHVybiBwcmV2LmVuZFRpbWVzdGFtcCA+IGN1cnJlbnQuZW5kVGltZXN0YW1wID8gcHJldiA6IGN1cnJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICB9KS5lbmRUaW1lc3RhbXA7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb246IEV2ZW50ID0ge1xuICAgICAgY29udGV4dHM6IHtcbiAgICAgICAgdHJhY2U6IHRoaXMuZ2V0VHJhY2VDb250ZXh0KCksXG4gICAgICB9LFxuICAgICAgc3BhbnM6IGZpbmlzaGVkU3BhbnMsXG4gICAgICBzdGFydF90aW1lc3RhbXA6IHRoaXMuc3RhcnRUaW1lc3RhbXAsXG4gICAgICB0YWdzOiB0aGlzLnRhZ3MsXG4gICAgICB0aW1lc3RhbXA6IHRoaXMuZW5kVGltZXN0YW1wLFxuICAgICAgdHJhbnNhY3Rpb246IHRoaXMubmFtZSxcbiAgICAgIHR5cGU6ICd0cmFuc2FjdGlvbicsXG4gICAgICBkZWJ1Z19tZXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgIH07XG5cbiAgICBjb25zdCBoYXNNZWFzdXJlbWVudHMgPSBPYmplY3Qua2V5cyh0aGlzLl9tZWFzdXJlbWVudHMpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoaGFzTWVhc3VyZW1lbnRzKSB7XG4gICAgICBsb2dnZXIubG9nKCdbTWVhc3VyZW1lbnRzXSBBZGRpbmcgbWVhc3VyZW1lbnRzIHRvIHRyYW5zYWN0aW9uJywgSlNPTi5zdHJpbmdpZnkodGhpcy5fbWVhc3VyZW1lbnRzLCB1bmRlZmluZWQsIDIpKTtcbiAgICAgIHRyYW5zYWN0aW9uLm1lYXN1cmVtZW50cyA9IHRoaXMuX21lYXN1cmVtZW50cztcbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gRmluaXNoaW5nICR7dGhpcy5vcH0gdHJhbnNhY3Rpb246ICR7dGhpcy5uYW1lfS5gKTtcblxuICAgIHJldHVybiB0aGlzLl9odWIuY2FwdHVyZUV2ZW50KHRyYW5zYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHRvQ29udGV4dCgpOiBUcmFuc2FjdGlvbkNvbnRleHQge1xuICAgIGNvbnN0IHNwYW5Db250ZXh0ID0gc3VwZXIudG9Db250ZXh0KCk7XG5cbiAgICByZXR1cm4gZHJvcFVuZGVmaW5lZEtleXMoe1xuICAgICAgLi4uc3BhbkNvbnRleHQsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICB0cmltRW5kOiB0aGlzLl90cmltRW5kLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlV2l0aENvbnRleHQodHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQpOiB0aGlzIHtcbiAgICBzdXBlci51cGRhdGVXaXRoQ29udGV4dCh0cmFuc2FjdGlvbkNvbnRleHQpO1xuXG4gICAgdGhpcy5uYW1lID0gdHJhbnNhY3Rpb25Db250ZXh0Lm5hbWUgPz8gJyc7XG5cbiAgICB0aGlzLl90cmltRW5kID0gdHJhbnNhY3Rpb25Db250ZXh0LnRyaW1FbmQ7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufVxuIiwgImltcG9ydCB7IEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29udGV4dCB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgbG9nZ2VyLCB0aW1lc3RhbXBXaXRoTXMgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgRklOSVNIX1JFQVNPTl9UQUcsIElETEVfVFJBTlNBQ1RJT05fRklOSVNIX1JFQVNPTlMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBTcGFuLCBTcGFuUmVjb3JkZXIgfSBmcm9tICcuL3NwYW4nO1xuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9JRExFX1RJTUVPVVQgPSAxMDAwO1xuZXhwb3J0IGNvbnN0IEhFQVJUQkVBVF9JTlRFUlZBTCA9IDUwMDA7XG5cbi8qKlxuICogQGluaGVyaXREb2NcbiAqL1xuZXhwb3J0IGNsYXNzIElkbGVUcmFuc2FjdGlvblNwYW5SZWNvcmRlciBleHRlbmRzIFNwYW5SZWNvcmRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9wdXNoQWN0aXZpdHk6IChpZDogc3RyaW5nKSA9PiB2b2lkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3BvcEFjdGl2aXR5OiAoaWQ6IHN0cmluZykgPT4gdm9pZCxcbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25TcGFuSWQ6IHN0cmluZyA9ICcnLFxuICAgIG1heGxlbj86IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIobWF4bGVuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGFkZChzcGFuOiBTcGFuKTogdm9pZCB7XG4gICAgLy8gV2Ugc2hvdWxkIG1ha2Ugc3VyZSB3ZSBkbyBub3QgcHVzaCBhbmQgcG9wIGFjdGl2aXRpZXMgZm9yXG4gICAgLy8gdGhlIHRyYW5zYWN0aW9uIHRoYXQgdGhpcyBzcGFuIHJlY29yZGVyIGJlbG9uZ3MgdG8uXG4gICAgaWYgKHNwYW4uc3BhbklkICE9PSB0aGlzLnRyYW5zYWN0aW9uU3BhbklkKSB7XG4gICAgICAvLyBXZSBwYXRjaCBzcGFuLmZpbmlzaCgpIHRvIHBvcCBhbiBhY3Rpdml0eSBhZnRlciBzZXR0aW5nIGFuIGVuZFRpbWVzdGFtcC5cbiAgICAgIHNwYW4uZmluaXNoID0gKGVuZFRpbWVzdGFtcD86IG51bWJlcikgPT4ge1xuICAgICAgICBzcGFuLmVuZFRpbWVzdGFtcCA9IHR5cGVvZiBlbmRUaW1lc3RhbXAgPT09ICdudW1iZXInID8gZW5kVGltZXN0YW1wIDogdGltZXN0YW1wV2l0aE1zKCk7XG4gICAgICAgIHRoaXMuX3BvcEFjdGl2aXR5KHNwYW4uc3BhbklkKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIHNob3VsZCBvbmx5IHB1c2ggbmV3IGFjdGl2aXRpZXMgaWYgdGhlIHNwYW4gZG9lcyBub3QgaGF2ZSBhbiBlbmQgdGltZXN0YW1wLlxuICAgICAgaWYgKHNwYW4uZW5kVGltZXN0YW1wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fcHVzaEFjdGl2aXR5KHNwYW4uc3BhbklkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdXBlci5hZGQoc3Bhbik7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQmVmb3JlRmluaXNoQ2FsbGJhY2sgPSAodHJhbnNhY3Rpb25TcGFuOiBJZGxlVHJhbnNhY3Rpb24sIGVuZFRpbWVzdGFtcDogbnVtYmVyKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFuIElkbGVUcmFuc2FjdGlvbiBpcyBhIHRyYW5zYWN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBmaW5pc2hlcy4gSXQgZG9lcyB0aGlzIGJ5IHRyYWNraW5nIGNoaWxkIHNwYW5zIGFzIGFjdGl2aXRpZXMuXG4gKiBZb3UgY2FuIGhhdmUgbXVsdGlwbGUgSWRsZVRyYW5zYWN0aW9ucyBhY3RpdmUsIGJ1dCBpZiB0aGUgYG9uU2NvcGVgIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHRoZSBpZGxlIHRyYW5zYWN0aW9uIHdpbGxcbiAqIHB1dCBpdHNlbGYgb24gdGhlIHNjb3BlIG9uIGNyZWF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgSWRsZVRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb24ge1xuICAvLyBBY3Rpdml0aWVzIHN0b3JlIGEgbGlzdCBvZiBhY3RpdmUgc3BhbnNcbiAgcHVibGljIGFjdGl2aXRpZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+ID0ge307XG5cbiAgLy8gVHJhY2sgc3RhdGUgb2YgYWN0aXZpdGllcyBpbiBwcmV2aW91cyBoZWFydGJlYXRcbiAgcHJpdmF0ZSBfcHJldkhlYXJ0YmVhdFN0cmluZzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEFtb3VudCBvZiB0aW1lcyBoZWFydGJlYXQgaGFzIGNvdW50ZWQuIFdpbGwgY2F1c2UgdHJhbnNhY3Rpb24gdG8gZmluaXNoIGFmdGVyIDMgYmVhdHMuXG4gIHByaXZhdGUgX2hlYXJ0YmVhdENvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgLy8gV2Ugc2hvdWxkIG5vdCB1c2UgaGVhcnRiZWF0IGlmIHdlIGZpbmlzaGVkIGEgdHJhbnNhY3Rpb25cbiAgcHJpdmF0ZSBfZmluaXNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9iZWZvcmVGaW5pc2hDYWxsYmFja3M6IEJlZm9yZUZpbmlzaENhbGxiYWNrW10gPSBbXTtcblxuICAvKipcbiAgICogSWYgYSB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkIGFuZCBubyBhY3Rpdml0aWVzIGFyZSBhZGRlZCwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdFxuICAgKiBpdCB0aW1lcyBvdXQgcHJvcGVybHkuIFRoaXMgaXMgY2xlYXJlZCBhbmQgbm90IHVzZWQgd2hlbiBhY3Rpdml0aWVzIGFyZSBhZGRlZC5cbiAgICovXG4gIHByaXZhdGUgX2luaXRUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgdHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfaWRsZUh1Yj86IEh1YixcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB0byB3YWl0IGluIG1zIHVudGlsIHRoZSBpZGxlIHRyYW5zYWN0aW9uIHdpbGwgYmUgZmluaXNoZWQuXG4gICAgICogQGRlZmF1bHQgMTAwMFxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2lkbGVUaW1lb3V0OiBudW1iZXIgPSBERUZBVUxUX0lETEVfVElNRU9VVCxcbiAgICAvLyBJZiBhbiBpZGxlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBwdXQgaXRzZWxmIG9uIGFuZCBvZmYgdGhlIHNjb3BlIGF1dG9tYXRpY2FsbHkuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25TY29wZTogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICBzdXBlcih0cmFuc2FjdGlvbkNvbnRleHQsIF9pZGxlSHViKTtcblxuICAgIGlmIChfaWRsZUh1YiAmJiBfb25TY29wZSkge1xuICAgICAgLy8gVGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGFjdGl2ZSB0cmFuc2FjdGlvbiBvbiB0aGUgc2NvcGVcbiAgICAgIGNsZWFyQWN0aXZlVHJhbnNhY3Rpb24oX2lkbGVIdWIpO1xuXG4gICAgICAvLyBXZSBzZXQgdGhlIHRyYW5zYWN0aW9uIGhlcmUgb24gdGhlIHNjb3BlIHNvIGVycm9yIGV2ZW50cyBwaWNrIHVwIHRoZSB0cmFjZVxuICAgICAgLy8gY29udGV4dCBhbmQgYXR0YWNoIGl0IHRvIHRoZSBlcnJvci5cbiAgICAgIGxvZ2dlci5sb2coYFNldHRpbmcgaWRsZSB0cmFuc2FjdGlvbiBvbiBzY29wZS4gU3BhbiBJRDogJHt0aGlzLnNwYW5JZH1gKTtcbiAgICAgIF9pZGxlSHViLmNvbmZpZ3VyZVNjb3BlKHNjb3BlID0+IHNjb3BlLnNldFNwYW4odGhpcykpO1xuICAgIH1cblxuICAgIHRoaXMuX2luaXRUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5faWRsZVRpbWVvdXQpO1xuICB9XG5cbiAgLyoqIHtAaW5oZXJpdERvY30gKi9cbiAgcHVibGljIGZpbmlzaChlbmRUaW1lc3RhbXA6IG51bWJlciA9IHRpbWVzdGFtcFdpdGhNcygpKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICB0aGlzLl9maW5pc2hlZCA9IHRydWU7XG4gICAgdGhpcy5hY3Rpdml0aWVzID0ge307XG5cbiAgICBpZiAodGhpcy5zcGFuUmVjb3JkZXIpIHtcbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBmaW5pc2hpbmcgSWRsZVRyYW5zYWN0aW9uJywgbmV3IERhdGUoZW5kVGltZXN0YW1wICogMTAwMCkudG9JU09TdHJpbmcoKSwgdGhpcy5vcCk7XG5cbiAgICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5fYmVmb3JlRmluaXNoQ2FsbGJhY2tzKSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMsIGVuZFRpbWVzdGFtcCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3BhblJlY29yZGVyLnNwYW5zID0gdGhpcy5zcGFuUmVjb3JkZXIuc3BhbnMuZmlsdGVyKChzcGFuOiBTcGFuKSA9PiB7XG4gICAgICAgIC8vIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIGl0c2VsZiwgd2UganVzdCByZXR1cm4gaXRcbiAgICAgICAgaWYgKHNwYW4uc3BhbklkID09PSB0aGlzLnNwYW5JZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgY2FuY2VsIGFsbCBwZW5kaW5nIHNwYW5zIHdpdGggc3RhdHVzIFwiY2FuY2VsbGVkXCIgdG8gaW5kaWNhdGUgdGhlIGlkbGUgdHJhbnNhY3Rpb24gd2FzIGZpbmlzaGVkIGVhcmx5XG4gICAgICAgIGlmICghc3Bhbi5lbmRUaW1lc3RhbXApIHtcbiAgICAgICAgICBzcGFuLmVuZFRpbWVzdGFtcCA9IGVuZFRpbWVzdGFtcDtcbiAgICAgICAgICBzcGFuLnNldFN0YXR1cyhTcGFuU3RhdHVzLkNhbmNlbGxlZCk7XG4gICAgICAgICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIGNhbmNlbGxpbmcgc3BhbiBzaW5jZSB0cmFuc2FjdGlvbiBlbmRlZCBlYXJseScsIEpTT04uc3RyaW5naWZ5KHNwYW4sIHVuZGVmaW5lZCwgMikpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qga2VlcFNwYW4gPSBzcGFuLnN0YXJ0VGltZXN0YW1wIDwgZW5kVGltZXN0YW1wO1xuICAgICAgICBpZiAoIWtlZXBTcGFuKSB7XG4gICAgICAgICAgbG9nZ2VyLmxvZyhcbiAgICAgICAgICAgICdbVHJhY2luZ10gZGlzY2FyZGluZyBTcGFuIHNpbmNlIGl0IGhhcHBlbmVkIGFmdGVyIFRyYW5zYWN0aW9uIHdhcyBmaW5pc2hlZCcsXG4gICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzcGFuLCB1bmRlZmluZWQsIDIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtlZXBTcGFuO1xuICAgICAgfSk7XG5cbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBmbHVzaGluZyBJZGxlVHJhbnNhY3Rpb24nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIE5vIGFjdGl2ZSBJZGxlVHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzLl9vblNjb3BlIGlzIHRydWUgaWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBwcmV2aW91c2x5IG9uIHRoZSBzY29wZS5cbiAgICBpZiAodGhpcy5fb25TY29wZSkge1xuICAgICAgY2xlYXJBY3RpdmVUcmFuc2FjdGlvbih0aGlzLl9pZGxlSHViKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZmluaXNoKGVuZFRpbWVzdGFtcCk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGdldHMgZXhjZWN1dGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gZmluaXNoZXMuXG4gICAqIFVzZWZ1bCBmb3IgY2xlYW51cCBvciBpZiB5b3Ugd2FudCB0byBhZGQgYW55IGFkZGl0aW9uYWwgc3BhbnMgYmFzZWQgb24gY3VycmVudCBjb250ZXh0LlxuICAgKlxuICAgKiBUaGlzIGlzIGV4cG9zZWQgYmVjYXVzZSB1c2VycyBoYXZlIG5vIG90aGVyIHdheSBvZiBydW5uaW5nIHNvbWV0aGluZyBiZWZvcmUgYW4gaWRsZSB0cmFuc2FjdGlvblxuICAgKiBmaW5pc2hlcy5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckJlZm9yZUZpbmlzaENhbGxiYWNrKGNhbGxiYWNrOiBCZWZvcmVGaW5pc2hDYWxsYmFjayk6IHZvaWQge1xuICAgIHRoaXMuX2JlZm9yZUZpbmlzaENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGluaXRTcGFuUmVjb3JkZXIobWF4bGVuPzogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNwYW5SZWNvcmRlcikge1xuICAgICAgY29uc3QgcHVzaEFjdGl2aXR5ID0gKGlkOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3B1c2hBY3Rpdml0eShpZCk7XG4gICAgICB9O1xuICAgICAgY29uc3QgcG9wQWN0aXZpdHkgPSAoaWQ6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fcG9wQWN0aXZpdHkoaWQpO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zcGFuUmVjb3JkZXIgPSBuZXcgSWRsZVRyYW5zYWN0aW9uU3BhblJlY29yZGVyKHB1c2hBY3Rpdml0eSwgcG9wQWN0aXZpdHksIHRoaXMuc3BhbklkLCBtYXhsZW4pO1xuXG4gICAgICAvLyBTdGFydCBoZWFydGJlYXQgc28gdGhhdCB0cmFuc2FjdGlvbnMgZG8gbm90IHJ1biBmb3JldmVyLlxuICAgICAgbG9nZ2VyLmxvZygnU3RhcnRpbmcgaGVhcnRiZWF0Jyk7XG4gICAgICB0aGlzLl9waW5nSGVhcnRiZWF0KCk7XG4gICAgfVxuICAgIHRoaXMuc3BhblJlY29yZGVyLmFkZCh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCB0cmFja2luZyBhIHNwZWNpZmljIGFjdGl2aXR5LlxuICAgKiBAcGFyYW0gc3BhbklkIFRoZSBzcGFuIGlkIHRoYXQgcmVwcmVzZW50cyB0aGUgYWN0aXZpdHlcbiAgICovXG4gIHByaXZhdGUgX3B1c2hBY3Rpdml0eShzcGFuSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pbml0VGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX2luaXRUaW1lb3V0KTtcbiAgICAgIHRoaXMuX2luaXRUaW1lb3V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gcHVzaEFjdGl2aXR5OiAke3NwYW5JZH1gKTtcbiAgICB0aGlzLmFjdGl2aXRpZXNbc3BhbklkXSA9IHRydWU7XG4gICAgbG9nZ2VyLmxvZygnW1RyYWNpbmddIG5ldyBhY3Rpdml0aWVzIGNvdW50JywgT2JqZWN0LmtleXModGhpcy5hY3Rpdml0aWVzKS5sZW5ndGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBhY3Rpdml0eSBmcm9tIHVzYWdlXG4gICAqIEBwYXJhbSBzcGFuSWQgVGhlIHNwYW4gaWQgdGhhdCByZXByZXNlbnRzIHRoZSBhY3Rpdml0eVxuICAgKi9cbiAgcHJpdmF0ZSBfcG9wQWN0aXZpdHkoc3BhbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY3Rpdml0aWVzW3NwYW5JZF0pIHtcbiAgICAgIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBwb3BBY3Rpdml0eSAke3NwYW5JZH1gKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSB0aGlzLmFjdGl2aXRpZXNbc3BhbklkXTtcbiAgICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBuZXcgYWN0aXZpdGllcyBjb3VudCcsIE9iamVjdC5rZXlzKHRoaXMuYWN0aXZpdGllcykubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5hY3Rpdml0aWVzKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLl9pZGxlVGltZW91dDtcbiAgICAgIC8vIFdlIG5lZWQgdG8gYWRkIHRoZSB0aW1lb3V0IGhlcmUgdG8gaGF2ZSB0aGUgcmVhbCBlbmR0aW1lc3RhbXAgb2YgdGhlIHRyYW5zYWN0aW9uXG4gICAgICAvLyBSZW1lbWJlciB0aW1lc3RhbXBXaXRoTXMgaXMgaW4gc2Vjb25kcywgdGltZW91dCBpcyBpbiBtc1xuICAgICAgY29uc3QgZW5kID0gdGltZXN0YW1wV2l0aE1zKCkgKyB0aW1lb3V0IC8gMTAwMDtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFRhZyhGSU5JU0hfUkVBU09OX1RBRywgSURMRV9UUkFOU0FDVElPTl9GSU5JU0hfUkVBU09OU1sxXSk7XG4gICAgICAgICAgdGhpcy5maW5pc2goZW5kKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGVuIGVudHJpZXMgb2YgdGhpcy5hY3Rpdml0aWVzIGFyZSBub3QgY2hhbmdpbmcgZm9yIDMgYmVhdHMuXG4gICAqIElmIHRoaXMgb2NjdXJzIHdlIGZpbmlzaCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBwcml2YXRlIF9iZWF0KCk6IHZvaWQge1xuICAgIC8vIFdlIHNob3VsZCBub3QgYmUgcnVubmluZyBoZWFydGJlYXQgaWYgdGhlIGlkbGUgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQuXG4gICAgaWYgKHRoaXMuX2ZpbmlzaGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVhcnRiZWF0U3RyaW5nID0gT2JqZWN0LmtleXModGhpcy5hY3Rpdml0aWVzKS5qb2luKCcnKTtcblxuICAgIGlmIChoZWFydGJlYXRTdHJpbmcgPT09IHRoaXMuX3ByZXZIZWFydGJlYXRTdHJpbmcpIHtcbiAgICAgIHRoaXMuX2hlYXJ0YmVhdENvdW50ZXIgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5faGVhcnRiZWF0Q291bnRlciA9IDE7XG4gICAgfVxuXG4gICAgdGhpcy5fcHJldkhlYXJ0YmVhdFN0cmluZyA9IGhlYXJ0YmVhdFN0cmluZztcblxuICAgIGlmICh0aGlzLl9oZWFydGJlYXRDb3VudGVyID49IDMpIHtcbiAgICAgIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBUcmFuc2FjdGlvbiBmaW5pc2hlZCBiZWNhdXNlIG9mIG5vIGNoYW5nZSBmb3IgMyBoZWFydCBiZWF0c2ApO1xuICAgICAgdGhpcy5zZXRTdGF0dXMoU3BhblN0YXR1cy5EZWFkbGluZUV4Y2VlZGVkKTtcbiAgICAgIHRoaXMuc2V0VGFnKEZJTklTSF9SRUFTT05fVEFHLCBJRExFX1RSQU5TQUNUSU9OX0ZJTklTSF9SRUFTT05TWzBdKTtcbiAgICAgIHRoaXMuZmluaXNoKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3BpbmdIZWFydGJlYXQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGluZ3MgdGhlIGhlYXJ0YmVhdFxuICAgKi9cbiAgcHJpdmF0ZSBfcGluZ0hlYXJ0YmVhdCgpOiB2b2lkIHtcbiAgICBsb2dnZXIubG9nKGBwaW5naW5nIEhlYXJ0YmVhdCAtPiBjdXJyZW50IGNvdW50ZXI6ICR7dGhpcy5faGVhcnRiZWF0Q291bnRlcn1gKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2JlYXQoKTtcbiAgICB9LCBIRUFSVEJFQVRfSU5URVJWQUwpO1xuICB9XG59XG5cbi8qKlxuICogUmVzZXQgYWN0aXZlIHRyYW5zYWN0aW9uIG9uIHNjb3BlXG4gKi9cbmZ1bmN0aW9uIGNsZWFyQWN0aXZlVHJhbnNhY3Rpb24oaHViPzogSHViKTogdm9pZCB7XG4gIGlmIChodWIpIHtcbiAgICBjb25zdCBzY29wZSA9IGh1Yi5nZXRTY29wZSgpO1xuICAgIGlmIChzY29wZSkge1xuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSBzY29wZS5nZXRUcmFuc2FjdGlvbigpO1xuICAgICAgaWYgKHRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHNjb3BlLnNldFNwYW4odW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRNYWluQ2FycmllciwgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHtcbiAgQ3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICBJbnRlZ3JhdGlvbixcbiAgSW50ZWdyYXRpb25DbGFzcyxcbiAgT3B0aW9ucyxcbiAgU2FtcGxpbmdDb250ZXh0LFxuICBUcmFuc2FjdGlvbkNvbnRleHQsXG4gIFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QsXG59IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZHluYW1pY1JlcXVpcmUsIGlzTm9kZUVudiwgbG9hZE1vZHVsZSwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyRXJyb3JJbnN0cnVtZW50YXRpb24gfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuL2lkbGV0cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgaGFzVHJhY2luZ0VuYWJsZWQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqIFJldHVybnMgYWxsIHRyYWNlIGhlYWRlcnMgdGhhdCBhcmUgY3VycmVudGx5IG9uIHRoZSB0b3Agc2NvcGUuICovXG5mdW5jdGlvbiB0cmFjZUhlYWRlcnModGhpczogSHViKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHNjb3BlID0gdGhpcy5nZXRTY29wZSgpO1xuICBpZiAoc2NvcGUpIHtcbiAgICBjb25zdCBzcGFuID0gc2NvcGUuZ2V0U3BhbigpO1xuICAgIGlmIChzcGFuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAnc2VudHJ5LXRyYWNlJzogc3Bhbi50b1RyYWNlcGFyZW50KCksXG4gICAgICB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogTWFrZXMgYSBzYW1wbGluZyBkZWNpc2lvbiBmb3IgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIGFuZCBzdG9yZXMgaXQgb24gdGhlIHRyYW5zYWN0aW9uLlxuICpcbiAqIENhbGxlZCBldmVyeSB0aW1lIGEgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gT25seSB0cmFuc2FjdGlvbnMgd2hpY2ggZW1lcmdlIHdpdGggYSBgc2FtcGxlZGAgdmFsdWUgb2YgYHRydWVgIHdpbGwgYmVcbiAqIHNlbnQgdG8gU2VudHJ5LlxuICpcbiAqIEBwYXJhbSBodWI6IFRoZSBodWIgb2ZmIG9mIHdoaWNoIHRvIHJlYWQgY29uZmlnIG9wdGlvbnNcbiAqIEBwYXJhbSB0cmFuc2FjdGlvbjogVGhlIHRyYW5zYWN0aW9uIG5lZWRpbmcgYSBzYW1wbGluZyBkZWNpc2lvblxuICogQHBhcmFtIHNhbXBsaW5nQ29udGV4dDogRGVmYXVsdCBhbmQgdXNlci1wcm92aWRlZCBkYXRhIHdoaWNoIG1heSBiZSB1c2VkIHRvIGhlbHAgbWFrZSB0aGUgZGVjaXNpb25cbiAqXG4gKiBAcmV0dXJucyBUaGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2l0aCBpdHMgYHNhbXBsZWRgIHZhbHVlIHNldFxuICovXG5mdW5jdGlvbiBzYW1wbGU8VCBleHRlbmRzIFRyYW5zYWN0aW9uPih0cmFuc2FjdGlvbjogVCwgb3B0aW9uczogT3B0aW9ucywgc2FtcGxpbmdDb250ZXh0OiBTYW1wbGluZ0NvbnRleHQpOiBUIHtcbiAgLy8gbm90aGluZyB0byBkbyBpZiB0cmFjaW5nIGlzIG5vdCBlbmFibGVkXG4gIGlmICghaGFzVHJhY2luZ0VuYWJsZWQob3B0aW9ucykpIHtcbiAgICB0cmFuc2FjdGlvbi5zYW1wbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLy8gaWYgdGhlIHVzZXIgaGFzIGZvcmNlZCBhIHNhbXBsaW5nIGRlY2lzaW9uIGJ5IHBhc3NpbmcgYSBgc2FtcGxlZGAgdmFsdWUgaW4gdGhlaXIgdHJhbnNhY3Rpb24gY29udGV4dCwgZ28gd2l0aCB0aGF0XG4gIGlmICh0cmFuc2FjdGlvbi5zYW1wbGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICB0cmFuc2FjdGlvbi5zZXRNZXRhZGF0YSh7XG4gICAgICB0cmFuc2FjdGlvblNhbXBsaW5nOiB7IG1ldGhvZDogVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZC5FeHBsaWNpdCB9LFxuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8vIHdlIHdvdWxkIGhhdmUgYmFpbGVkIGFscmVhZHkgaWYgbmVpdGhlciBgdHJhY2VzU2FtcGxlcmAgbm9yIGB0cmFjZXNTYW1wbGVSYXRlYCB3ZXJlIGRlZmluZWQsIHNvIG9uZSBvZiB0aGVzZSBzaG91bGRcbiAgLy8gd29yazsgcHJlZmVyIHRoZSBob29rIGlmIHNvXG4gIGxldCBzYW1wbGVSYXRlO1xuICBpZiAodHlwZW9mIG9wdGlvbnMudHJhY2VzU2FtcGxlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHNhbXBsZVJhdGUgPSBvcHRpb25zLnRyYWNlc1NhbXBsZXIoc2FtcGxpbmdDb250ZXh0KTtcbiAgICB0cmFuc2FjdGlvbi5zZXRNZXRhZGF0YSh7XG4gICAgICB0cmFuc2FjdGlvblNhbXBsaW5nOiB7XG4gICAgICAgIG1ldGhvZDogVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZC5TYW1wbGVyLFxuICAgICAgICAvLyBjYXN0IHRvIG51bWJlciBpbiBjYXNlIGl0J3MgYSBib29sZWFuXG4gICAgICAgIHJhdGU6IE51bWJlcihzYW1wbGVSYXRlKSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoc2FtcGxpbmdDb250ZXh0LnBhcmVudFNhbXBsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgIHNhbXBsZVJhdGUgPSBzYW1wbGluZ0NvbnRleHQucGFyZW50U2FtcGxlZDtcbiAgICB0cmFuc2FjdGlvbi5zZXRNZXRhZGF0YSh7XG4gICAgICB0cmFuc2FjdGlvblNhbXBsaW5nOiB7IG1ldGhvZDogVHJhbnNhY3Rpb25TYW1wbGluZ01ldGhvZC5Jbmhlcml0YW5jZSB9LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHNhbXBsZVJhdGUgPSBvcHRpb25zLnRyYWNlc1NhbXBsZVJhdGU7XG4gICAgdHJhbnNhY3Rpb24uc2V0TWV0YWRhdGEoe1xuICAgICAgdHJhbnNhY3Rpb25TYW1wbGluZzoge1xuICAgICAgICBtZXRob2Q6IFRyYW5zYWN0aW9uU2FtcGxpbmdNZXRob2QuUmF0ZSxcbiAgICAgICAgLy8gY2FzdCB0byBudW1iZXIgaW4gY2FzZSBpdCdzIGEgYm9vbGVhblxuICAgICAgICByYXRlOiBOdW1iZXIoc2FtcGxlUmF0ZSksXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLy8gU2luY2UgdGhpcyBpcyBjb21pbmcgZnJvbSB0aGUgdXNlciAob3IgZnJvbSBhIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoZSB1c2VyKSwgd2hvIGtub3dzIHdoYXQgd2UgbWlnaHQgZ2V0LiAoVGhlXG4gIC8vIG9ubHkgdmFsaWQgdmFsdWVzIGFyZSBib29sZWFucyBvciBudW1iZXJzIGJldHdlZW4gMCBhbmQgMS4pXG4gIGlmICghaXNWYWxpZFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkpIHtcbiAgICBsb2dnZXIud2FybihgW1RyYWNpbmddIERpc2NhcmRpbmcgdHJhbnNhY3Rpb24gYmVjYXVzZSBvZiBpbnZhbGlkIHNhbXBsZSByYXRlLmApO1xuICAgIHRyYW5zYWN0aW9uLnNhbXBsZWQgPSBmYWxzZTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH1cblxuICAvLyBpZiB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgMCAob3IgZmFsc2UpLCBvciBpZiBgdHJhY2VzU2FtcGxlUmF0ZWAgaXMgMCwgaXQncyBhIHNpZ24gdGhlIHRyYW5zYWN0aW9uIHNob3VsZCBiZSBkcm9wcGVkXG4gIGlmICghc2FtcGxlUmF0ZSkge1xuICAgIGxvZ2dlci5sb2coXG4gICAgICBgW1RyYWNpbmddIERpc2NhcmRpbmcgdHJhbnNhY3Rpb24gYmVjYXVzZSAke1xuICAgICAgICB0eXBlb2Ygb3B0aW9ucy50cmFjZXNTYW1wbGVyID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyAndHJhY2VzU2FtcGxlciByZXR1cm5lZCAwIG9yIGZhbHNlJ1xuICAgICAgICAgIDogJ2EgbmVnYXRpdmUgc2FtcGxpbmcgZGVjaXNpb24gd2FzIGluaGVyaXRlZCBvciB0cmFjZXNTYW1wbGVSYXRlIGlzIHNldCB0byAwJ1xuICAgICAgfWAsXG4gICAgKTtcbiAgICB0cmFuc2FjdGlvbi5zYW1wbGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICB9XG5cbiAgLy8gTm93IHdlIHJvbGwgdGhlIGRpY2UuIE1hdGgucmFuZG9tIGlzIGluY2x1c2l2ZSBvZiAwLCBidXQgbm90IG9mIDEsIHNvIHN0cmljdCA8IGlzIHNhZmUgaGVyZS4gSW4gY2FzZSBzYW1wbGVSYXRlIGlzXG4gIC8vIGEgYm9vbGVhbiwgdGhlIDwgY29tcGFyaXNvbiB3aWxsIGNhdXNlIGl0IHRvIGJlIGF1dG9tYXRpY2FsbHkgY2FzdCB0byAxIGlmIGl0J3MgdHJ1ZSBhbmQgMCBpZiBpdCdzIGZhbHNlLlxuICB0cmFuc2FjdGlvbi5zYW1wbGVkID0gTWF0aC5yYW5kb20oKSA8IChzYW1wbGVSYXRlIGFzIG51bWJlciB8IGJvb2xlYW4pO1xuXG4gIC8vIGlmIHdlJ3JlIG5vdCBnb2luZyB0byBrZWVwIGl0LCB3ZSdyZSBkb25lXG4gIGlmICghdHJhbnNhY3Rpb24uc2FtcGxlZCkge1xuICAgIGxvZ2dlci5sb2coXG4gICAgICBgW1RyYWNpbmddIERpc2NhcmRpbmcgdHJhbnNhY3Rpb24gYmVjYXVzZSBpdCdzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmFuZG9tIHNhbXBsZSAoc2FtcGxpbmcgcmF0ZSA9ICR7TnVtYmVyKFxuICAgICAgICBzYW1wbGVSYXRlLFxuICAgICAgKX0pYCxcbiAgICApO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBzdGFydGluZyAke3RyYW5zYWN0aW9uLm9wfSB0cmFuc2FjdGlvbiAtICR7dHJhbnNhY3Rpb24ubmFtZX1gKTtcbiAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuXG4vKipcbiAqIENoZWNrcyB0aGUgZ2l2ZW4gc2FtcGxlIHJhdGUgdG8gbWFrZSBzdXJlIGl0IGlzIHZhbGlkIHR5cGUgYW5kIHZhbHVlIChhIGJvb2xlYW4sIG9yIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSkuXG4gKi9cbmZ1bmN0aW9uIGlzVmFsaWRTYW1wbGVSYXRlKHJhdGU6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gd2UgbmVlZCB0byBjaGVjayBOYU4gZXhwbGljaXRseSBiZWNhdXNlIGl0J3Mgb2YgdHlwZSAnbnVtYmVyJyBhbmQgdGhlcmVmb3JlIHdvdWxkbid0IGdldCBjYXVnaHQgYnkgdGhpcyB0eXBlY2hlY2tcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgaWYgKGlzTmFOKHJhdGUgYXMgYW55KSB8fCAhKHR5cGVvZiByYXRlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgcmF0ZSA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgIGxvZ2dlci53YXJuKFxuICAgICAgYFtUcmFjaW5nXSBHaXZlbiBzYW1wbGUgcmF0ZSBpcyBpbnZhbGlkLiBTYW1wbGUgcmF0ZSBtdXN0IGJlIGEgYm9vbGVhbiBvciBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIEdvdCAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICByYXRlLFxuICAgICAgKX0gb2YgdHlwZSAke0pTT04uc3RyaW5naWZ5KHR5cGVvZiByYXRlKX0uYCxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIGluIGNhc2Ugc2FtcGxlUmF0ZSBpcyBhIGJvb2xlYW4sIGl0IHdpbGwgZ2V0IGF1dG9tYXRpY2FsbHkgY2FzdCB0byAxIGlmIGl0J3MgdHJ1ZSBhbmQgMCBpZiBpdCdzIGZhbHNlXG4gIGlmIChyYXRlIDwgMCB8fCByYXRlID4gMSkge1xuICAgIGxvZ2dlci53YXJuKGBbVHJhY2luZ10gR2l2ZW4gc2FtcGxlIHJhdGUgaXMgaW52YWxpZC4gU2FtcGxlIHJhdGUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuIEdvdCAke3JhdGV9LmApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zYWN0aW9uIGFuZCBhZGRzIGEgc2FtcGxpbmcgZGVjaXNpb24gaWYgaXQgZG9lc24ndCB5ZXQgaGF2ZSBvbmUuXG4gKlxuICogVGhlIEh1Yi5zdGFydFRyYW5zYWN0aW9uIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhpcyBtZXRob2QgdG8gZG8gaXRzIHdvcmssIHBhc3NpbmcgdGhlIEh1YiBpbnN0YW5jZSBpbiBhcyBgdGhpc2AsIGFzIGlmXG4gKiBpdCBoYWQgYmVlbiBjYWxsZWQgb24gdGhlIGh1YiBkaXJlY3RseS4gRXhpc3RzIGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgaW5qZWN0ZWQgaW50byB0aGUgY2xhc3MgYXMgYW5cbiAqIFwiZXh0ZW5zaW9uIG1ldGhvZC5cIlxuICpcbiAqIEBwYXJhbSB0aGlzOiBUaGUgSHViIHN0YXJ0aW5nIHRoZSB0cmFuc2FjdGlvblxuICogQHBhcmFtIHRyYW5zYWN0aW9uQ29udGV4dDogRGF0YSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBDdXN0b21TYW1wbGluZ0NvbnRleHQ6IE9wdGlvbmFsIGRhdGEgdG8gYmUgcHJvdmlkZWQgdG8gdGhlIGB0cmFjZXNTYW1wbGVyYCBmdW5jdGlvbiAoaWYgYW55KVxuICpcbiAqIEByZXR1cm5zIFRoZSBuZXcgdHJhbnNhY3Rpb25cbiAqXG4gKiBAc2VlIHtAbGluayBIdWIuc3RhcnRUcmFuc2FjdGlvbn1cbiAqL1xuZnVuY3Rpb24gX3N0YXJ0VHJhbnNhY3Rpb24oXG4gIHRoaXM6IEh1YixcbiAgdHJhbnNhY3Rpb25Db250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQsXG4gIGN1c3RvbVNhbXBsaW5nQ29udGV4dD86IEN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbik6IFRyYW5zYWN0aW9uIHtcbiAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2V0Q2xpZW50KCk/LmdldE9wdGlvbnMoKSB8fCB7fTtcblxuICBsZXQgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25Db250ZXh0LCB0aGlzKTtcbiAgdHJhbnNhY3Rpb24gPSBzYW1wbGUodHJhbnNhY3Rpb24sIG9wdGlvbnMsIHtcbiAgICBwYXJlbnRTYW1wbGVkOiB0cmFuc2FjdGlvbkNvbnRleHQucGFyZW50U2FtcGxlZCxcbiAgICB0cmFuc2FjdGlvbkNvbnRleHQsXG4gICAgLi4uY3VzdG9tU2FtcGxpbmdDb250ZXh0LFxuICB9KTtcbiAgaWYgKHRyYW5zYWN0aW9uLnNhbXBsZWQpIHtcbiAgICB0cmFuc2FjdGlvbi5pbml0U3BhblJlY29yZGVyKG9wdGlvbnMuX2V4cGVyaW1lbnRzPy5tYXhTcGFucyBhcyBudW1iZXIpO1xuICB9XG4gIHJldHVybiB0cmFuc2FjdGlvbjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgbmV3IGlkbGUgdHJhbnNhY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydElkbGVUcmFuc2FjdGlvbihcbiAgaHViOiBIdWIsXG4gIHRyYW5zYWN0aW9uQ29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0LFxuICBpZGxlVGltZW91dD86IG51bWJlcixcbiAgb25TY29wZT86IGJvb2xlYW4sXG4gIGN1c3RvbVNhbXBsaW5nQ29udGV4dD86IEN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbik6IElkbGVUcmFuc2FjdGlvbiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBodWIuZ2V0Q2xpZW50KCk/LmdldE9wdGlvbnMoKSB8fCB7fTtcblxuICBsZXQgdHJhbnNhY3Rpb24gPSBuZXcgSWRsZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uQ29udGV4dCwgaHViLCBpZGxlVGltZW91dCwgb25TY29wZSk7XG4gIHRyYW5zYWN0aW9uID0gc2FtcGxlKHRyYW5zYWN0aW9uLCBvcHRpb25zLCB7XG4gICAgcGFyZW50U2FtcGxlZDogdHJhbnNhY3Rpb25Db250ZXh0LnBhcmVudFNhbXBsZWQsXG4gICAgdHJhbnNhY3Rpb25Db250ZXh0LFxuICAgIC4uLmN1c3RvbVNhbXBsaW5nQ29udGV4dCxcbiAgfSk7XG4gIGlmICh0cmFuc2FjdGlvbi5zYW1wbGVkKSB7XG4gICAgdHJhbnNhY3Rpb24uaW5pdFNwYW5SZWNvcmRlcihvcHRpb25zLl9leHBlcmltZW50cz8ubWF4U3BhbnMgYXMgbnVtYmVyKTtcbiAgfVxuICByZXR1cm4gdHJhbnNhY3Rpb247XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hZGRUcmFjaW5nRXh0ZW5zaW9ucygpOiB2b2lkIHtcbiAgY29uc3QgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG4gIGlmICghY2Fycmllci5fX1NFTlRSWV9fKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zID0gY2Fycmllci5fX1NFTlRSWV9fLmV4dGVuc2lvbnMgfHwge307XG4gIGlmICghY2Fycmllci5fX1NFTlRSWV9fLmV4dGVuc2lvbnMuc3RhcnRUcmFuc2FjdGlvbikge1xuICAgIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLnN0YXJ0VHJhbnNhY3Rpb24gPSBfc3RhcnRUcmFuc2FjdGlvbjtcbiAgfVxuICBpZiAoIWNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLnRyYWNlSGVhZGVycykge1xuICAgIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLnRyYWNlSGVhZGVycyA9IHRyYWNlSGVhZGVycztcbiAgfVxufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIF9hdXRvbG9hZERhdGFiYXNlSW50ZWdyYXRpb25zKCk6IHZvaWQge1xuICBjb25zdCBjYXJyaWVyID0gZ2V0TWFpbkNhcnJpZXIoKTtcbiAgaWYgKCFjYXJyaWVyLl9fU0VOVFJZX18pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBwYWNrYWdlVG9JbnRlZ3JhdGlvbk1hcHBpbmc6IFJlY29yZDxzdHJpbmcsICgpID0+IEludGVncmF0aW9uPiA9IHtcbiAgICBtb25nb2RiKCkge1xuICAgICAgY29uc3QgaW50ZWdyYXRpb24gPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICcuL2ludGVncmF0aW9ucy9ub2RlL21vbmdvJykgYXMge1xuICAgICAgICBNb25nbzogSW50ZWdyYXRpb25DbGFzczxJbnRlZ3JhdGlvbj47XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbi5Nb25nbygpO1xuICAgIH0sXG4gICAgbW9uZ29vc2UoKSB7XG4gICAgICBjb25zdCBpbnRlZ3JhdGlvbiA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJy4vaW50ZWdyYXRpb25zL25vZGUvbW9uZ28nKSBhcyB7XG4gICAgICAgIE1vbmdvOiBJbnRlZ3JhdGlvbkNsYXNzPEludGVncmF0aW9uPjtcbiAgICAgIH07XG4gICAgICByZXR1cm4gbmV3IGludGVncmF0aW9uLk1vbmdvKHsgbW9uZ29vc2U6IHRydWUgfSk7XG4gICAgfSxcbiAgICBteXNxbCgpIHtcbiAgICAgIGNvbnN0IGludGVncmF0aW9uID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAnLi9pbnRlZ3JhdGlvbnMvbm9kZS9teXNxbCcpIGFzIHtcbiAgICAgICAgTXlzcWw6IEludGVncmF0aW9uQ2xhc3M8SW50ZWdyYXRpb24+O1xuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgaW50ZWdyYXRpb24uTXlzcWwoKTtcbiAgICB9LFxuICAgIHBnKCkge1xuICAgICAgY29uc3QgaW50ZWdyYXRpb24gPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICcuL2ludGVncmF0aW9ucy9ub2RlL3Bvc3RncmVzJykgYXMge1xuICAgICAgICBQb3N0Z3JlczogSW50ZWdyYXRpb25DbGFzczxJbnRlZ3JhdGlvbj47XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBpbnRlZ3JhdGlvbi5Qb3N0Z3JlcygpO1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgbWFwcGVkUGFja2FnZXMgPSBPYmplY3Qua2V5cyhwYWNrYWdlVG9JbnRlZ3JhdGlvbk1hcHBpbmcpXG4gICAgLmZpbHRlcihtb2R1bGVOYW1lID0+ICEhbG9hZE1vZHVsZShtb2R1bGVOYW1lKSlcbiAgICAubWFwKHBrZyA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcGFja2FnZVRvSW50ZWdyYXRpb25NYXBwaW5nW3BrZ10oKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9KVxuICAgIC5maWx0ZXIocCA9PiBwKSBhcyBJbnRlZ3JhdGlvbltdO1xuXG4gIGlmIChtYXBwZWRQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgY2Fycmllci5fX1NFTlRSWV9fLmludGVncmF0aW9ucyA9IFsuLi4oY2Fycmllci5fX1NFTlRSWV9fLmludGVncmF0aW9ucyB8fCBbXSksIC4uLm1hcHBlZFBhY2thZ2VzXTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgcGF0Y2hlcyB0aGUgZ2xvYmFsIG9iamVjdCBhbmQgaW5qZWN0cyB0aGUgVHJhY2luZyBleHRlbnNpb25zIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEV4dGVuc2lvbk1ldGhvZHMoKTogdm9pZCB7XG4gIF9hZGRUcmFjaW5nRXh0ZW5zaW9ucygpO1xuXG4gIC8vIERldGVjdCBhbmQgYXV0b21hdGljYWxseSBsb2FkIHNwZWNpZmllZCBpbnRlZ3JhdGlvbnMuXG4gIGlmIChpc05vZGVFbnYoKSkge1xuICAgIF9hdXRvbG9hZERhdGFiYXNlSW50ZWdyYXRpb25zKCk7XG4gIH1cblxuICAvLyBJZiBhbiBlcnJvciBoYXBwZW5zIGdsb2JhbGx5LCB3ZSBzaG91bGQgbWFrZSBzdXJlIHRyYW5zYWN0aW9uIHN0YXR1cyBpcyBzZXQgdG8gZXJyb3IuXG4gIHJlZ2lzdGVyRXJyb3JJbnN0cnVtZW50YXRpb24oKTtcbn1cbiIsICJpbXBvcnQgeyBJbnRlZ3JhdGlvbiwgVHJhbnNhY3Rpb24gfSBmcm9tICdAc2VudHJ5L3R5cGVzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG50eXBlIE1ldGhvZCA9XG4gIHwgJ2FsbCdcbiAgfCAnZ2V0J1xuICB8ICdwb3N0J1xuICB8ICdwdXQnXG4gIHwgJ2RlbGV0ZSdcbiAgfCAncGF0Y2gnXG4gIHwgJ29wdGlvbnMnXG4gIHwgJ2hlYWQnXG4gIHwgJ2NoZWNrb3V0J1xuICB8ICdjb3B5J1xuICB8ICdsb2NrJ1xuICB8ICdtZXJnZSdcbiAgfCAnbWthY3Rpdml0eSdcbiAgfCAnbWtjb2wnXG4gIHwgJ21vdmUnXG4gIHwgJ20tc2VhcmNoJ1xuICB8ICdub3RpZnknXG4gIHwgJ3B1cmdlJ1xuICB8ICdyZXBvcnQnXG4gIHwgJ3NlYXJjaCdcbiAgfCAnc3Vic2NyaWJlJ1xuICB8ICd0cmFjZSdcbiAgfCAndW5sb2NrJ1xuICB8ICd1bnN1YnNjcmliZSdcbiAgfCAndXNlJztcblxudHlwZSBSb3V0ZXIgPSB7XG4gIFttZXRob2QgaW4gTWV0aG9kXTogKC4uLmFyZ3M6IGFueSkgPT4gYW55OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn07XG5cbmludGVyZmFjZSBFeHByZXNzUmVzcG9uc2Uge1xuICBvbmNlKG5hbWU6IHN0cmluZywgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkO1xufVxuXG4vKipcbiAqIEludGVybmFsIGhlbHBlciBmb3IgYF9fc2VudHJ5X3RyYW5zYWN0aW9uYFxuICogQGhpZGRlblxuICovXG5pbnRlcmZhY2UgU2VudHJ5VHJhY2luZ1Jlc3BvbnNlIHtcbiAgX19zZW50cnlfdHJhbnNhY3Rpb24/OiBUcmFuc2FjdGlvbjtcbn1cblxuLyoqXG4gKiBFeHByZXNzIGludGVncmF0aW9uXG4gKlxuICogUHJvdmlkZXMgYW4gcmVxdWVzdCBhbmQgZXJyb3IgaGFuZGxlciBmb3IgRXhwcmVzcyBmcmFtZXdvcmsgYXMgd2VsbCBhcyB0cmFjaW5nIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgY2xhc3MgRXhwcmVzcyBpbXBsZW1lbnRzIEludGVncmF0aW9uIHtcbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGlkOiBzdHJpbmcgPSAnRXhwcmVzcyc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gRXhwcmVzcy5pZDtcblxuICAvKipcbiAgICogRXhwcmVzcyBBcHAgaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3JvdXRlcj86IFJvdXRlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBfbWV0aG9kcz86IE1ldGhvZFtdO1xuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHsgYXBwPzogUm91dGVyOyByb3V0ZXI/OiBSb3V0ZXI7IG1ldGhvZHM/OiBNZXRob2RbXSB9ID0ge30pIHtcbiAgICB0aGlzLl9yb3V0ZXIgPSBvcHRpb25zLnJvdXRlciB8fCBvcHRpb25zLmFwcDtcbiAgICB0aGlzLl9tZXRob2RzID0gKEFycmF5LmlzQXJyYXkob3B0aW9ucy5tZXRob2RzKSA/IG9wdGlvbnMubWV0aG9kcyA6IFtdKS5jb25jYXQoJ3VzZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcm91dGVyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0V4cHJlc3NJbnRlZ3JhdGlvbiBpcyBtaXNzaW5nIGFuIEV4cHJlc3MgaW5zdGFuY2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5zdHJ1bWVudE1pZGRsZXdhcmVzKHRoaXMuX3JvdXRlciwgdGhpcy5fbWV0aG9kcyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcyBvcmlnaW5hbCBtaWRkbGV3YXJlIGZ1bmN0aW9uIGluIGEgdHJhY2luZyBjYWxsLCB3aGljaCBzdG9yZXMgdGhlIGluZm8gYWJvdXQgdGhlIGNhbGwgYXMgYSBzcGFuLFxuICogYW5kIGZpbmlzaGVzIGl0IG9uY2UgdGhlIG1pZGRsZXdhcmUgaXMgZG9uZSBpbnZva2luZy5cbiAqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmVzIGhhdmUgMyB2YXJpb3VzIGZvcm1zLCB0aHVzIHdlIGhhdmUgdG8gdGFrZSBjYXJlIG9mIGFsbCBvZiB0aGVtOlxuICogLy8gc3luY1xuICogYXBwLnVzZShmdW5jdGlvbiAocmVxLCByZXMpIHsgLi4uIH0pXG4gKiAvLyBhc3luY1xuICogYXBwLnVzZShmdW5jdGlvbiAocmVxLCByZXMsIG5leHQpIHsgLi4uIH0pXG4gKiAvLyBlcnJvciBoYW5kbGVyXG4gKiBhcHAudXNlKGZ1bmN0aW9uIChlcnIsIHJlcSwgcmVzLCBuZXh0KSB7IC4uLiB9KVxuICpcbiAqIFRoZXkgYWxsIGludGVybmFsbHkgZGVsZWdhdGUgdG8gdGhlIGByb3V0ZXJbbWV0aG9kXWAgb2YgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZnVuY3Rpb24gd3JhcChmbjogRnVuY3Rpb24sIG1ldGhvZDogTWV0aG9kKTogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkIHtcbiAgY29uc3QgYXJpdHkgPSBmbi5sZW5ndGg7XG5cbiAgc3dpdGNoIChhcml0eSkge1xuICAgIGNhc2UgMjoge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRoaXM6IE5vZGVKUy5HbG9iYWwsIHJlcTogdW5rbm93biwgcmVzOiBFeHByZXNzUmVzcG9uc2UgJiBTZW50cnlUcmFjaW5nUmVzcG9uc2UpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSByZXMuX19zZW50cnlfdHJhbnNhY3Rpb247XG4gICAgICAgIGlmICh0cmFuc2FjdGlvbikge1xuICAgICAgICAgIGNvbnN0IHNwYW4gPSB0cmFuc2FjdGlvbi5zdGFydENoaWxkKHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBmbi5uYW1lLFxuICAgICAgICAgICAgb3A6IGBleHByZXNzLm1pZGRsZXdhcmUuJHttZXRob2R9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXMub25jZSgnZmluaXNoJywgKCkgPT4ge1xuICAgICAgICAgICAgc3Bhbi5maW5pc2goKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCByZXEsIHJlcyk7XG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIDM6IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbihcbiAgICAgICAgdGhpczogTm9kZUpTLkdsb2JhbCxcbiAgICAgICAgcmVxOiB1bmtub3duLFxuICAgICAgICByZXM6IEV4cHJlc3NSZXNwb25zZSAmIFNlbnRyeVRyYWNpbmdSZXNwb25zZSxcbiAgICAgICAgbmV4dDogKCkgPT4gdm9pZCxcbiAgICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHJlcy5fX3NlbnRyeV90cmFuc2FjdGlvbjtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRyYW5zYWN0aW9uPy5zdGFydENoaWxkKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogZm4ubmFtZSxcbiAgICAgICAgICBvcDogYGV4cHJlc3MubWlkZGxld2FyZS4ke21ldGhvZH1gLFxuICAgICAgICB9KTtcbiAgICAgICAgZm4uY2FsbCh0aGlzLCByZXEsIHJlcywgZnVuY3Rpb24odGhpczogTm9kZUpTLkdsb2JhbCwgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgbmV4dC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgNDoge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKFxuICAgICAgICB0aGlzOiBOb2RlSlMuR2xvYmFsLFxuICAgICAgICBlcnI6IEVycm9yLFxuICAgICAgICByZXE6IFJlcXVlc3QsXG4gICAgICAgIHJlczogUmVzcG9uc2UgJiBTZW50cnlUcmFjaW5nUmVzcG9uc2UsXG4gICAgICAgIG5leHQ6ICgpID0+IHZvaWQsXG4gICAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSByZXMuX19zZW50cnlfdHJhbnNhY3Rpb247XG4gICAgICAgIGNvbnN0IHNwYW4gPSB0cmFuc2FjdGlvbj8uc3RhcnRDaGlsZCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IGZuLm5hbWUsXG4gICAgICAgICAgb3A6IGBleHByZXNzLm1pZGRsZXdhcmUuJHttZXRob2R9YCxcbiAgICAgICAgfSk7XG4gICAgICAgIGZuLmNhbGwodGhpcywgZXJyLCByZXEsIHJlcywgZnVuY3Rpb24odGhpczogTm9kZUpTLkdsb2JhbCwgLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG4gICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgbmV4dC5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwcmVzcyBtaWRkbGV3YXJlIHRha2VzIDItNCBhcmd1bWVudHMuIEdvdDogJHthcml0eX1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyBhbGwgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIG9yaWdpbmFsIGBhcHBgIG9yIGByb3V0ZXJgIG1ldGhvZCwgZWcuIGBhcHAudXNlYCBvciBgcm91dGVyLnVzZWBcbiAqIGFuZCB3cmFwcyBldmVyeSBmdW5jdGlvbiwgYXMgd2VsbCBhcyBhcnJheSBvZiBmdW5jdGlvbnMgd2l0aCBhIGNhbGwgdG8gb3VyIGB3cmFwYCBtZXRob2QuXG4gKiBXZSBoYXZlIHRvIHRha2UgY2FyZSBvZiB0aGUgYXJyYXlzIGFzIHdlbGwgYXMgaXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgYXJndW1lbnRzLFxuICogYXMgYGFwcC51c2VgIGNhbiBhY2NlcHQgbWlkZGxld2FyZXMgaW4gZmV3IHZhcmlvdXMgZm9ybXMuXG4gKlxuICogYXBwLnVzZShbPHBhdGg+XSwgPGZuPilcbiAqIGFwcC51c2UoWzxwYXRoPl0sIDxmbj4sIC4uLjxmbj4pXG4gKiBhcHAudXNlKFs8cGF0aD5dLCAuLi48Zm4+W10pXG4gKi9cbmZ1bmN0aW9uIHdyYXBNaWRkbGV3YXJlQXJncyhhcmdzOiB1bmtub3duW10sIG1ldGhvZDogTWV0aG9kKTogdW5rbm93bltdIHtcbiAgcmV0dXJuIGFyZ3MubWFwKChhcmc6IHVua25vd24pID0+IHtcbiAgICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHdyYXAoYXJnLCBtZXRob2QpO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICAgIHJldHVybiBhcmcubWFwKChhOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB3cmFwKGEsIG1ldGhvZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJnO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYXRjaGVzIG9yaWdpbmFsIHJvdXRlciB0byB1dGlsaXplIG91ciB0cmFjaW5nIGZ1bmN0aW9uYWxpdHlcbiAqL1xuZnVuY3Rpb24gcGF0Y2hNaWRkbGV3YXJlKHJvdXRlcjogUm91dGVyLCBtZXRob2Q6IE1ldGhvZCk6IFJvdXRlciB7XG4gIGNvbnN0IG9yaWdpbmFsQ2FsbGJhY2sgPSByb3V0ZXJbbWV0aG9kXTtcblxuICByb3V0ZXJbbWV0aG9kXSA9IGZ1bmN0aW9uKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIHJldHVybiBvcmlnaW5hbENhbGxiYWNrLmNhbGwodGhpcywgLi4ud3JhcE1pZGRsZXdhcmVBcmdzKGFyZ3MsIG1ldGhvZCkpO1xuICB9O1xuXG4gIHJldHVybiByb3V0ZXI7XG59XG5cbi8qKlxuICogUGF0Y2hlcyBvcmlnaW5hbCByb3V0ZXIgbWV0aG9kc1xuICovXG5mdW5jdGlvbiBpbnN0cnVtZW50TWlkZGxld2FyZXMocm91dGVyOiBSb3V0ZXIsIG1ldGhvZHM6IE1ldGhvZFtdID0gW10pOiB2b2lkIHtcbiAgbWV0aG9kcy5mb3JFYWNoKChtZXRob2Q6IE1ldGhvZCkgPT4gcGF0Y2hNaWRkbGV3YXJlKHJvdXRlciwgbWV0aG9kKSk7XG59XG4iLCAiaW1wb3J0IHsgSHViIH0gZnJvbSAnQHNlbnRyeS9odWInO1xuaW1wb3J0IHsgRXZlbnRQcm9jZXNzb3IsIEludGVncmF0aW9uIH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBmaWxsLCBpc1RoZW5hYmxlLCBsb2FkTW9kdWxlLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW50ZXJmYWNlIFBnQ2xpZW50IHtcbiAgcHJvdG90eXBlOiB7XG4gICAgcXVlcnk6ICgpID0+IHZvaWQgfCBQcm9taXNlPHVua25vd24+O1xuICB9O1xufVxuXG5pbnRlcmZhY2UgUGdPcHRpb25zIHtcbiAgdXNlUGdOYXRpdmU/OiBib29sZWFuO1xufVxuXG4vKiogVHJhY2luZyBpbnRlZ3JhdGlvbiBmb3Igbm9kZS1wb3N0Z3JlcyBwYWNrYWdlICovXG5leHBvcnQgY2xhc3MgUG9zdGdyZXMgaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ1Bvc3RncmVzJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBQb3N0Z3Jlcy5pZDtcblxuICBwcml2YXRlIF91c2VQZ05hdGl2ZTogYm9vbGVhbjtcblxuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogUGdPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLl91c2VQZ05hdGl2ZSA9ICEhb3B0aW9ucy51c2VQZ05hdGl2ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShfOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBjb25zdCBwa2cgPSBsb2FkTW9kdWxlPHsgQ2xpZW50OiBQZ0NsaWVudDsgbmF0aXZlOiB7IENsaWVudDogUGdDbGllbnQgfSB9PigncGcnKTtcblxuICAgIGlmICghcGtnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1Bvc3RncmVzIEludGVncmF0aW9uIHdhcyB1bmFibGUgdG8gcmVxdWlyZSBgcGdgIHBhY2thZ2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3VzZVBnTmF0aXZlICYmICFwa2cubmF0aXZlPy5DbGllbnQpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihgUG9zdGdyZXMgSW50ZWdyYXRpb24gd2FzIHVuYWJsZSB0byBhY2Nlc3MgJ3BnLW5hdGl2ZScgYmluZGluZ3MuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgeyBDbGllbnQgfSA9IHRoaXMuX3VzZVBnTmF0aXZlID8gcGtnLm5hdGl2ZSA6IHBrZztcblxuICAgIC8qKlxuICAgICAqIGZ1bmN0aW9uIChxdWVyeSwgY2FsbGJhY2spID0+IHZvaWRcbiAgICAgKiBmdW5jdGlvbiAocXVlcnksIHBhcmFtcywgY2FsbGJhY2spID0+IHZvaWRcbiAgICAgKiBmdW5jdGlvbiAocXVlcnkpID0+IFByb21pc2VcbiAgICAgKiBmdW5jdGlvbiAocXVlcnksIHBhcmFtcykgPT4gUHJvbWlzZVxuICAgICAqIGZ1bmN0aW9uIChwZy5DdXJzb3IpID0+IHBnLkN1cnNvclxuICAgICAqL1xuICAgIGZpbGwoQ2xpZW50LnByb3RvdHlwZSwgJ3F1ZXJ5JywgZnVuY3Rpb24ob3JpZzogKCkgPT4gdm9pZCB8IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiB1bmtub3duLCBjb25maWc6IHVua25vd24sIHZhbHVlczogdW5rbm93biwgY2FsbGJhY2s6IHVua25vd24pIHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgICAgY29uc3QgcGFyZW50U3BhbiA9IHNjb3BlPy5nZXRTcGFuKCk7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBwYXJlbnRTcGFuPy5zdGFydENoaWxkKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogdHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycgPyBjb25maWcgOiAoY29uZmlnIGFzIHsgdGV4dDogc3RyaW5nIH0pLnRleHQsXG4gICAgICAgICAgb3A6IGBkYmAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZy5jYWxsKHRoaXMsIGNvbmZpZywgdmFsdWVzLCBmdW5jdGlvbihlcnI6IEVycm9yLCByZXN1bHQ6IHVua25vd24pIHtcbiAgICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZy5jYWxsKHRoaXMsIGNvbmZpZywgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duKSB7XG4gICAgICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgICAgIHZhbHVlcyhlcnIsIHJlc3VsdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBydiA9IHR5cGVvZiB2YWx1ZXMgIT09ICd1bmRlZmluZWQnID8gb3JpZy5jYWxsKHRoaXMsIGNvbmZpZywgdmFsdWVzKSA6IG9yaWcuY2FsbCh0aGlzLCBjb25maWcpO1xuXG4gICAgICAgIGlmIChpc1RoZW5hYmxlKHJ2KSkge1xuICAgICAgICAgIHJldHVybiAocnYgYXMgUHJvbWlzZTx1bmtub3duPikudGhlbigocmVzOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBzcGFuPy5maW5pc2goKTtcbiAgICAgICAgcmV0dXJuIHJ2O1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBJbnRlZ3JhdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZmlsbCwgbG9hZE1vZHVsZSwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmludGVyZmFjZSBNeXNxbENvbm5lY3Rpb24ge1xuICBjcmVhdGVRdWVyeTogKCkgPT4gdm9pZDtcbn1cblxuLyoqIFRyYWNpbmcgaW50ZWdyYXRpb24gZm9yIG5vZGUtbXlzcWwgcGFja2FnZSAqL1xuZXhwb3J0IGNsYXNzIE15c3FsIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdNeXNxbCc7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gTXlzcWwuaWQ7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgc2V0dXBPbmNlKF86IChjYWxsYmFjazogRXZlbnRQcm9jZXNzb3IpID0+IHZvaWQsIGdldEN1cnJlbnRIdWI6ICgpID0+IEh1Yik6IHZvaWQge1xuICAgIGNvbnN0IHBrZyA9IGxvYWRNb2R1bGU8TXlzcWxDb25uZWN0aW9uPignbXlzcWwvbGliL0Nvbm5lY3Rpb24uanMnKTtcblxuICAgIGlmICghcGtnKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ015c3FsIEludGVncmF0aW9uIHdhcyB1bmFibGUgdG8gcmVxdWlyZSBgbXlzcWxgIHBhY2thZ2UuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHdpbGwgaGF2ZSBvbmUgb2YgdGhlc2Ugc2lnbmF0dXJlczpcbiAgICAvLyAgICBmdW5jdGlvbiAoY2FsbGJhY2spID0+IHZvaWRcbiAgICAvLyAgICBmdW5jdGlvbiAob3B0aW9ucywgY2FsbGJhY2spID0+IHZvaWRcbiAgICAvLyAgICBmdW5jdGlvbiAob3B0aW9ucywgdmFsdWVzLCBjYWxsYmFjaykgPT4gdm9pZFxuICAgIGZpbGwocGtnLCAnY3JlYXRlUXVlcnknLCBmdW5jdGlvbihvcmlnOiAoKSA9PiB2b2lkKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24odGhpczogdW5rbm93biwgb3B0aW9uczogdW5rbm93biwgdmFsdWVzOiB1bmtub3duLCBjYWxsYmFjazogdW5rbm93bikge1xuICAgICAgICBjb25zdCBzY29wZSA9IGdldEN1cnJlbnRIdWIoKS5nZXRTY29wZSgpO1xuICAgICAgICBjb25zdCBwYXJlbnRTcGFuID0gc2NvcGU/LmdldFNwYW4oKTtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHBhcmVudFNwYW4/LnN0YXJ0Q2hpbGQoe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ3N0cmluZycgPyBvcHRpb25zIDogKG9wdGlvbnMgYXMgeyBzcWw6IHN0cmluZyB9KS5zcWwsXG4gICAgICAgICAgb3A6IGBkYmAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gb3JpZy5jYWxsKHRoaXMsIG9wdGlvbnMsIHZhbHVlcywgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duLCBmaWVsZHM6IHVua25vd24pIHtcbiAgICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgICAgY2FsbGJhY2soZXJyLCByZXN1bHQsIGZpZWxkcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiBvcmlnLmNhbGwodGhpcywgb3B0aW9ucywgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duLCBmaWVsZHM6IHVua25vd24pIHtcbiAgICAgICAgICAgIHNwYW4/LmZpbmlzaCgpO1xuICAgICAgICAgICAgdmFsdWVzKGVyciwgcmVzdWx0LCBmaWVsZHMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCBvcHRpb25zLCB2YWx1ZXMsIGNhbGxiYWNrKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBIdWIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgeyBFdmVudFByb2Nlc3NvciwgSW50ZWdyYXRpb24sIFNwYW5Db250ZXh0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBmaWxsLCBpc1RoZW5hYmxlLCBsb2FkTW9kdWxlLCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuLy8gVGhpcyBhbGxvd3MgdXMgdG8gdXNlIHRoZSBzYW1lIGFycmF5IGZvciBib3RoIGRlZmF1bHRzIG9wdGlvbnMgYW5kIHRoZSB0eXBlIGl0c2VsZi5cbi8vIChub3RlIGBhcyBjb25zdGAgYXQgdGhlIGVuZCB0byBtYWtlIGl0IGEgdW5pb24gb2Ygc3RyaW5nIGxpdGVyYWwgdHlwZXMgKGkuZS4gXCJhXCIgfCBcImJcIiB8IC4uLiApXG4vLyBhbmQgbm90IGp1c3QgYSBzdHJpbmdbXSlcbnR5cGUgT3BlcmF0aW9uID0gdHlwZW9mIE9QRVJBVElPTlNbbnVtYmVyXTtcbmNvbnN0IE9QRVJBVElPTlMgPSBbXG4gICdhZ2dyZWdhdGUnLCAvLyBhZ2dyZWdhdGUocGlwZWxpbmUsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnYnVsa1dyaXRlJywgLy8gYnVsa1dyaXRlKG9wZXJhdGlvbnMsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnY291bnREb2N1bWVudHMnLCAvLyBjb3VudERvY3VtZW50cyhxdWVyeSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdjcmVhdGVJbmRleCcsIC8vIGNyZWF0ZUluZGV4KGZpZWxkT3JTcGVjLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2NyZWF0ZUluZGV4ZXMnLCAvLyBjcmVhdGVJbmRleGVzKGluZGV4U3BlY3MsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZGVsZXRlTWFueScsIC8vIGRlbGV0ZU1hbnkoZmlsdGVyLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2RlbGV0ZU9uZScsIC8vIGRlbGV0ZU9uZShmaWx0ZXIsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZGlzdGluY3QnLCAvLyBkaXN0aW5jdChrZXksIHF1ZXJ5LCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2Ryb3AnLCAvLyBkcm9wKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZHJvcEluZGV4JywgLy8gZHJvcEluZGV4KGluZGV4TmFtZSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdkcm9wSW5kZXhlcycsIC8vIGRyb3BJbmRleGVzKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZXN0aW1hdGVkRG9jdW1lbnRDb3VudCcsIC8vIGVzdGltYXRlZERvY3VtZW50Q291bnQob3B0aW9ucywgY2FsbGJhY2spXG4gICdmaW5kJywgLy8gZmluZChxdWVyeSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdmaW5kT25lJywgLy8gZmluZE9uZShxdWVyeSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdmaW5kT25lQW5kRGVsZXRlJywgLy8gZmluZE9uZUFuZERlbGV0ZShmaWx0ZXIsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnZmluZE9uZUFuZFJlcGxhY2UnLCAvLyBmaW5kT25lQW5kUmVwbGFjZShmaWx0ZXIsIHJlcGxhY2VtZW50LCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2ZpbmRPbmVBbmRVcGRhdGUnLCAvLyBmaW5kT25lQW5kVXBkYXRlKGZpbHRlciwgdXBkYXRlLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luZGV4ZXMnLCAvLyBpbmRleGVzKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnaW5kZXhFeGlzdHMnLCAvLyBpbmRleEV4aXN0cyhpbmRleGVzLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luZGV4SW5mb3JtYXRpb24nLCAvLyBpbmRleEluZm9ybWF0aW9uKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnaW5pdGlhbGl6ZU9yZGVyZWRCdWxrT3AnLCAvLyBpbml0aWFsaXplT3JkZXJlZEJ1bGtPcChvcHRpb25zLCBjYWxsYmFjaylcbiAgJ2luc2VydE1hbnknLCAvLyBpbnNlcnRNYW55KGRvY3MsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnaW5zZXJ0T25lJywgLy8gaW5zZXJ0T25lKGRvYywgb3B0aW9ucywgY2FsbGJhY2spXG4gICdpc0NhcHBlZCcsIC8vIGlzQ2FwcGVkKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAnbWFwUmVkdWNlJywgLy8gbWFwUmVkdWNlKG1hcCwgcmVkdWNlLCBvcHRpb25zLCBjYWxsYmFjaylcbiAgJ29wdGlvbnMnLCAvLyBvcHRpb25zKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAncGFyYWxsZWxDb2xsZWN0aW9uU2NhbicsIC8vIHBhcmFsbGVsQ29sbGVjdGlvblNjYW4ob3B0aW9ucywgY2FsbGJhY2spXG4gICdyZW5hbWUnLCAvLyByZW5hbWUobmV3TmFtZSwgb3B0aW9ucywgY2FsbGJhY2spXG4gICdyZXBsYWNlT25lJywgLy8gcmVwbGFjZU9uZShmaWx0ZXIsIGRvYywgb3B0aW9ucywgY2FsbGJhY2spXG4gICdzdGF0cycsIC8vIHN0YXRzKG9wdGlvbnMsIGNhbGxiYWNrKVxuICAndXBkYXRlTWFueScsIC8vIHVwZGF0ZU1hbnkoZmlsdGVyLCB1cGRhdGUsIG9wdGlvbnMsIGNhbGxiYWNrKVxuICAndXBkYXRlT25lJywgLy8gdXBkYXRlT25lKGZpbHRlciwgdXBkYXRlLCBvcHRpb25zLCBjYWxsYmFjaylcbl0gYXMgY29uc3Q7XG5cbi8vIEFsbCBvZiB0aGUgb3BlcmF0aW9ucyBhYm92ZSB0YWtlIGBvcHRpb25zYCBhbmQgYGNhbGxiYWNrYCBhcyB0aGVpciBmaW5hbCBwYXJhbWV0ZXJzLCBidXQgc29tZSBvZiB0aGVtXG4vLyB0YWtlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcyB3ZWxsLiBGb3IgdGhvc2Ugb3BlcmF0aW9ucywgdGhpcyBpcyBhIG1hcCBvZlxuLy8geyA8b3BlcmF0aW9uIG5hbWU+OiAgWzxuYW1lcyBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnM+XSB9LCBhcyBhIHdheSB0byBrbm93IHdoYXQgdG8gY2FsbCB0aGUgb3BlcmF0aW9uJ3Ncbi8vIHBvc2l0aW9uYWwgYXJndW1lbnRzIHdoZW4gd2UgYWRkIHRoZW0gdG8gdGhlIHNwYW4ncyBgZGF0YWAgb2JqZWN0IGxhdGVyXG5jb25zdCBPUEVSQVRJT05fU0lHTkFUVVJFUzoge1xuICBbb3AgaW4gT3BlcmF0aW9uXT86IHN0cmluZ1tdO1xufSA9IHtcbiAgLy8gYWdncmVnYXRlIGludGVudGlvbmFsbHkgbm90IGluY2x1ZGVkIGJlY2F1c2UgYHBpcGVsaW5lYCBhcmd1bWVudHMgYXJlIHRvbyBjb21wbGV4IHRvIHNlcmlhbGl6ZSB3ZWxsXG4gIC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ2V0c2VudHJ5L3NlbnRyeS1qYXZhc2NyaXB0L3B1bGwvMzEwMlxuICBidWxrV3JpdGU6IFsnb3BlcmF0aW9ucyddLFxuICBjb3VudERvY3VtZW50czogWydxdWVyeSddLFxuICBjcmVhdGVJbmRleDogWydmaWVsZE9yU3BlYyddLFxuICBjcmVhdGVJbmRleGVzOiBbJ2luZGV4U3BlY3MnXSxcbiAgZGVsZXRlTWFueTogWydmaWx0ZXInXSxcbiAgZGVsZXRlT25lOiBbJ2ZpbHRlciddLFxuICBkaXN0aW5jdDogWydrZXknLCAncXVlcnknXSxcbiAgZHJvcEluZGV4OiBbJ2luZGV4TmFtZSddLFxuICBmaW5kOiBbJ3F1ZXJ5J10sXG4gIGZpbmRPbmU6IFsncXVlcnknXSxcbiAgZmluZE9uZUFuZERlbGV0ZTogWydmaWx0ZXInXSxcbiAgZmluZE9uZUFuZFJlcGxhY2U6IFsnZmlsdGVyJywgJ3JlcGxhY2VtZW50J10sXG4gIGZpbmRPbmVBbmRVcGRhdGU6IFsnZmlsdGVyJywgJ3VwZGF0ZSddLFxuICBpbmRleEV4aXN0czogWydpbmRleGVzJ10sXG4gIGluc2VydE1hbnk6IFsnZG9jcyddLFxuICBpbnNlcnRPbmU6IFsnZG9jJ10sXG4gIG1hcFJlZHVjZTogWydtYXAnLCAncmVkdWNlJ10sXG4gIHJlbmFtZTogWyduZXdOYW1lJ10sXG4gIHJlcGxhY2VPbmU6IFsnZmlsdGVyJywgJ2RvYyddLFxuICB1cGRhdGVNYW55OiBbJ2ZpbHRlcicsICd1cGRhdGUnXSxcbiAgdXBkYXRlT25lOiBbJ2ZpbHRlcicsICd1cGRhdGUnXSxcbn07XG5cbmludGVyZmFjZSBNb25nb0NvbGxlY3Rpb24ge1xuICBjb2xsZWN0aW9uTmFtZTogc3RyaW5nO1xuICBkYk5hbWU6IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIHByb3RvdHlwZToge1xuICAgIFtvcGVyYXRpb24gaW4gT3BlcmF0aW9uXTogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgfTtcbn1cblxuaW50ZXJmYWNlIE1vbmdvT3B0aW9ucyB7XG4gIG9wZXJhdGlvbnM/OiBPcGVyYXRpb25bXTtcbiAgZGVzY3JpYmVPcGVyYXRpb25zPzogYm9vbGVhbiB8IE9wZXJhdGlvbltdO1xuICB1c2VNb25nb29zZT86IGJvb2xlYW47XG59XG5cbi8qKiBUcmFjaW5nIGludGVncmF0aW9uIGZvciBtb25nbyBwYWNrYWdlICovXG5leHBvcnQgY2xhc3MgTW9uZ28gaW1wbGVtZW50cyBJbnRlZ3JhdGlvbiB7XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBpZDogc3RyaW5nID0gJ01vbmdvJztcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBuYW1lOiBzdHJpbmcgPSBNb25nby5pZDtcblxuICBwcml2YXRlIF9vcGVyYXRpb25zOiBPcGVyYXRpb25bXTtcbiAgcHJpdmF0ZSBfZGVzY3JpYmVPcGVyYXRpb25zPzogYm9vbGVhbiB8IE9wZXJhdGlvbltdO1xuICBwcml2YXRlIF91c2VNb25nb29zZTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBNb25nb09wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuX29wZXJhdGlvbnMgPSBBcnJheS5pc0FycmF5KG9wdGlvbnMub3BlcmF0aW9ucylcbiAgICAgID8gb3B0aW9ucy5vcGVyYXRpb25zXG4gICAgICA6ICgoT1BFUkFUSU9OUyBhcyB1bmtub3duKSBhcyBPcGVyYXRpb25bXSk7XG4gICAgdGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zID0gJ2Rlc2NyaWJlT3BlcmF0aW9ucycgaW4gb3B0aW9ucyA/IG9wdGlvbnMuZGVzY3JpYmVPcGVyYXRpb25zIDogdHJ1ZTtcbiAgICB0aGlzLl91c2VNb25nb29zZSA9ICEhb3B0aW9ucy51c2VNb25nb29zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcHVibGljIHNldHVwT25jZShfOiAoY2FsbGJhY2s6IEV2ZW50UHJvY2Vzc29yKSA9PiB2b2lkLCBnZXRDdXJyZW50SHViOiAoKSA9PiBIdWIpOiB2b2lkIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gdGhpcy5fdXNlTW9uZ29vc2UgPyAnbW9uZ29vc2UnIDogJ21vbmdvZGInO1xuICAgIGNvbnN0IHBrZyA9IGxvYWRNb2R1bGU8eyBDb2xsZWN0aW9uOiBNb25nb0NvbGxlY3Rpb24gfT4obW9kdWxlTmFtZSk7XG5cbiAgICBpZiAoIXBrZykge1xuICAgICAgbG9nZ2VyLmVycm9yKGBNb25nbyBJbnRlZ3JhdGlvbiB3YXMgdW5hYmxlIHRvIHJlcXVpcmUgXFxgJHttb2R1bGVOYW1lfVxcYCBwYWNrYWdlLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2luc3RydW1lbnRPcGVyYXRpb25zKHBrZy5Db2xsZWN0aW9uLCB0aGlzLl9vcGVyYXRpb25zLCBnZXRDdXJyZW50SHViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXRjaGVzIG9yaWdpbmFsIGNvbGxlY3Rpb24gbWV0aG9kc1xuICAgKi9cbiAgcHJpdmF0ZSBfaW5zdHJ1bWVudE9wZXJhdGlvbnMoY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uLCBvcGVyYXRpb25zOiBPcGVyYXRpb25bXSwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgb3BlcmF0aW9ucy5mb3JFYWNoKChvcGVyYXRpb246IE9wZXJhdGlvbikgPT4gdGhpcy5fcGF0Y2hPcGVyYXRpb24oY29sbGVjdGlvbiwgb3BlcmF0aW9uLCBnZXRDdXJyZW50SHViKSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0Y2hlcyBvcmlnaW5hbCBjb2xsZWN0aW9uIHRvIHV0aWxpemUgb3VyIHRyYWNpbmcgZnVuY3Rpb25hbGl0eVxuICAgKi9cbiAgcHJpdmF0ZSBfcGF0Y2hPcGVyYXRpb24oY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uLCBvcGVyYXRpb246IE9wZXJhdGlvbiwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgaWYgKCEob3BlcmF0aW9uIGluIGNvbGxlY3Rpb24ucHJvdG90eXBlKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgZ2V0U3BhbkNvbnRleHQgPSB0aGlzLl9nZXRTcGFuQ29udGV4dEZyb21PcGVyYXRpb25Bcmd1bWVudHMuYmluZCh0aGlzKTtcblxuICAgIGZpbGwoY29sbGVjdGlvbi5wcm90b3R5cGUsIG9wZXJhdGlvbiwgZnVuY3Rpb24ob3JpZzogKCkgPT4gdm9pZCB8IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbih0aGlzOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgY29uc3QgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSBnZXRDdXJyZW50SHViKCkuZ2V0U2NvcGUoKTtcbiAgICAgICAgY29uc3QgcGFyZW50U3BhbiA9IHNjb3BlPy5nZXRTcGFuKCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9wZXJhdGlvbiB3YXMgcGFzc2VkIGEgY2FsbGJhY2suIChtYXBSZWR1Y2UgcmVxdWlyZXMgYSBkaWZmZXJlbnQgY2hlY2ssIGFzXG4gICAgICAgIC8vIGl0cyAobm9uLWNhbGxiYWNrKSBhcmd1bWVudHMgY2FuIGFsc28gYmUgZnVuY3Rpb25zLilcbiAgICAgICAgaWYgKHR5cGVvZiBsYXN0QXJnICE9PSAnZnVuY3Rpb24nIHx8IChvcGVyYXRpb24gPT09ICdtYXBSZWR1Y2UnICYmIGFyZ3MubGVuZ3RoID09PSAyKSkge1xuICAgICAgICAgIGNvbnN0IHNwYW4gPSBwYXJlbnRTcGFuPy5zdGFydENoaWxkKGdldFNwYW5Db250ZXh0KHRoaXMsIG9wZXJhdGlvbiwgYXJncykpO1xuICAgICAgICAgIGNvbnN0IG1heWJlUHJvbWlzZSA9IG9yaWcuY2FsbCh0aGlzLCAuLi5hcmdzKSBhcyBQcm9taXNlPHVua25vd24+O1xuXG4gICAgICAgICAgaWYgKGlzVGhlbmFibGUobWF5YmVQcm9taXNlKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1heWJlUHJvbWlzZS50aGVuKChyZXM6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgICByZXR1cm4gbWF5YmVQcm9taXNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwYW4gPSBwYXJlbnRTcGFuPy5zdGFydENoaWxkKGdldFNwYW5Db250ZXh0KHRoaXMsIG9wZXJhdGlvbiwgYXJncy5zbGljZSgwLCAtMSkpKTtcbiAgICAgICAgcmV0dXJuIG9yaWcuY2FsbCh0aGlzLCAuLi5hcmdzLnNsaWNlKDAsIC0xKSwgZnVuY3Rpb24oZXJyOiBFcnJvciwgcmVzdWx0OiB1bmtub3duKSB7XG4gICAgICAgICAgc3Bhbj8uZmluaXNoKCk7XG4gICAgICAgICAgbGFzdEFyZyhlcnIsIHJlc3VsdCk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtIGEgU3BhbkNvbnRleHQgYmFzZWQgb24gdGhlIHVzZXIgaW5wdXQgdG8gYSBnaXZlbiBvcGVyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIF9nZXRTcGFuQ29udGV4dEZyb21PcGVyYXRpb25Bcmd1bWVudHMoXG4gICAgY29sbGVjdGlvbjogTW9uZ29Db2xsZWN0aW9uLFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgKTogU3BhbkNvbnRleHQge1xuICAgIGNvbnN0IGRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICBjb2xsZWN0aW9uTmFtZTogY29sbGVjdGlvbi5jb2xsZWN0aW9uTmFtZSxcbiAgICAgIGRiTmFtZTogY29sbGVjdGlvbi5kYk5hbWUsXG4gICAgICBuYW1lc3BhY2U6IGNvbGxlY3Rpb24ubmFtZXNwYWNlLFxuICAgIH07XG4gICAgY29uc3Qgc3BhbkNvbnRleHQ6IFNwYW5Db250ZXh0ID0ge1xuICAgICAgb3A6IGBkYmAsXG4gICAgICBkZXNjcmlwdGlvbjogb3BlcmF0aW9uLFxuICAgICAgZGF0YSxcbiAgICB9O1xuXG4gICAgLy8gSWYgdGhlIG9wZXJhdGlvbiB0YWtlcyBubyBhcmd1bWVudHMgYmVzaWRlcyBgb3B0aW9uc2AgYW5kIGBjYWxsYmFja2AsIG9yIGlmIGFyZ3VtZW50XG4gICAgLy8gY29sbGVjdGlvbiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBvcGVyYXRpb24sIGp1c3QgcmV0dXJuIGVhcmx5LlxuICAgIGNvbnN0IHNpZ25hdHVyZSA9IE9QRVJBVElPTl9TSUdOQVRVUkVTW29wZXJhdGlvbl07XG4gICAgY29uc3Qgc2hvdWxkRGVzY3JpYmUgPSBBcnJheS5pc0FycmF5KHRoaXMuX2Rlc2NyaWJlT3BlcmF0aW9ucylcbiAgICAgID8gdGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zLmluY2x1ZGVzKG9wZXJhdGlvbilcbiAgICAgIDogdGhpcy5fZGVzY3JpYmVPcGVyYXRpb25zO1xuXG4gICAgaWYgKCFzaWduYXR1cmUgfHwgIXNob3VsZERlc2NyaWJlKSB7XG4gICAgICByZXR1cm4gc3BhbkNvbnRleHQ7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgYG1hcFJlZHVjZWAsIGFzIHRoZSBvbmx5IG9uZSBhY2NlcHRpbmcgZnVuY3Rpb25zIGFzIGFyZ3VtZW50cy5cbiAgICAgIGlmIChvcGVyYXRpb24gPT09ICdtYXBSZWR1Y2UnKSB7XG4gICAgICAgIGNvbnN0IFttYXAsIHJlZHVjZV0gPSBhcmdzIGFzIHsgbmFtZT86IHN0cmluZyB9W107XG4gICAgICAgIGRhdGFbc2lnbmF0dXJlWzBdXSA9IHR5cGVvZiBtYXAgPT09ICdzdHJpbmcnID8gbWFwIDogbWFwLm5hbWUgfHwgJzxhbm9ueW1vdXM+JztcbiAgICAgICAgZGF0YVtzaWduYXR1cmVbMV1dID0gdHlwZW9mIHJlZHVjZSA9PT0gJ3N0cmluZycgPyByZWR1Y2UgOiByZWR1Y2UubmFtZSB8fCAnPGFub255bW91cz4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWduYXR1cmUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBkYXRhW3NpZ25hdHVyZVtpXV0gPSBKU09OLnN0cmluZ2lmeShhcmdzW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKF9vTykge1xuICAgICAgLy8gbm8tZW1wdHlcbiAgICB9XG5cbiAgICByZXR1cm4gc3BhbkNvbnRleHQ7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBGSU5JU0hfUkVBU09OX1RBRywgSURMRV9UUkFOU0FDVElPTl9GSU5JU0hfUkVBU09OUyB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9pZGxldHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4uL3NwYW5zdGF0dXMnO1xuaW1wb3J0IHsgZ2V0QWN0aXZlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi91dGlscyc7XG5cbmNvbnN0IGdsb2JhbCA9IGdldEdsb2JhbE9iamVjdDxXaW5kb3c+KCk7XG5cbi8qKlxuICogQWRkIGEgbGlzdGVuZXIgdGhhdCBjYW5jZWxzIGFuZCBmaW5pc2hlcyBhIHRyYW5zYWN0aW9uIHdoZW4gdGhlIGdsb2JhbFxuICogZG9jdW1lbnQgaXMgaGlkZGVuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJCYWNrZ3JvdW5kVGFiRGV0ZWN0aW9uKCk6IHZvaWQge1xuICBpZiAoZ2xvYmFsICYmIGdsb2JhbC5kb2N1bWVudCkge1xuICAgIGdsb2JhbC5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgKCkgPT4ge1xuICAgICAgY29uc3QgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpIGFzIElkbGVUcmFuc2FjdGlvbjtcbiAgICAgIGlmIChnbG9iYWwuZG9jdW1lbnQuaGlkZGVuICYmIGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICAgIGxvZ2dlci5sb2coXG4gICAgICAgICAgYFtUcmFjaW5nXSBUcmFuc2FjdGlvbjogJHtTcGFuU3RhdHVzLkNhbmNlbGxlZH0gLT4gc2luY2UgdGFiIG1vdmVkIHRvIHRoZSBiYWNrZ3JvdW5kLCBvcDogJHthY3RpdmVUcmFuc2FjdGlvbi5vcH1gLFxuICAgICAgICApO1xuICAgICAgICAvLyBXZSBzaG91bGQgbm90IHNldCBzdGF0dXMgaWYgaXQgaXMgYWxyZWFkeSBzZXQsIHRoaXMgcHJldmVudCBpbXBvcnRhbnQgc3RhdHVzZXMgbGlrZVxuICAgICAgICAvLyBlcnJvciBvciBkYXRhIGxvc3MgZnJvbSBiZWluZyBvdmVyd3JpdHRlbiBvbiB0cmFuc2FjdGlvbi5cbiAgICAgICAgaWYgKCFhY3RpdmVUcmFuc2FjdGlvbi5zdGF0dXMpIHtcbiAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5DYW5jZWxsZWQpO1xuICAgICAgICB9XG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uLnNldFRhZygndmlzaWJpbGl0eWNoYW5nZScsICdkb2N1bWVudC5oaWRkZW4nKTtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uc2V0VGFnKEZJTklTSF9SRUFTT05fVEFHLCBJRExFX1RSQU5TQUNUSU9OX0ZJTklTSF9SRUFTT05TWzJdKTtcbiAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uZmluaXNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLndhcm4oJ1tUcmFjaW5nXSBDb3VsZCBub3Qgc2V0IHVwIGJhY2tncm91bmQgdGFiIGRldGVjdGlvbiBkdWUgdG8gbGFjayBvZiBnbG9iYWwgZG9jdW1lbnQnKTtcbiAgfVxufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBNZXRyaWMsIFJlcG9ydEhhbmRsZXIgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBiaW5kUmVwb3J0ZXIgPSAoXG4gIGNhbGxiYWNrOiBSZXBvcnRIYW5kbGVyLFxuICBtZXRyaWM6IE1ldHJpYyxcbiAgcmVwb3J0QWxsQ2hhbmdlcz86IGJvb2xlYW4sXG4pOiAoKGZvcmNlUmVwb3J0PzogYm9vbGVhbikgPT4gdm9pZCkgPT4ge1xuICBsZXQgcHJldlZhbHVlOiBudW1iZXI7XG4gIHJldHVybiAoZm9yY2VSZXBvcnQ/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKG1ldHJpYy52YWx1ZSA+PSAwKSB7XG4gICAgICBpZiAoZm9yY2VSZXBvcnQgfHwgcmVwb3J0QWxsQ2hhbmdlcykge1xuICAgICAgICBtZXRyaWMuZGVsdGEgPSBtZXRyaWMudmFsdWUgLSAocHJldlZhbHVlIHx8IDApO1xuXG4gICAgICAgIC8vIFJlcG9ydCB0aGUgbWV0cmljIGlmIHRoZXJlJ3MgYSBub24temVybyBkZWx0YSBvciBpZiBubyBwcmV2aW91c1xuICAgICAgICAvLyB2YWx1ZSBleGlzdHMgKHdoaWNoIGNhbiBoYXBwZW4gaW4gdGhlIGNhc2Ugb2YgdGhlIGRvY3VtZW50IGJlY29taW5nXG4gICAgICAgIC8vIGhpZGRlbiB3aGVuIHRoZSBtZXRyaWMgdmFsdWUgaXMgMCkuXG4gICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL0dvb2dsZUNocm9tZS93ZWItdml0YWxzL2lzc3Vlcy8xNFxuICAgICAgICBpZiAobWV0cmljLmRlbHRhIHx8IHByZXZWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcHJldlZhbHVlID0gbWV0cmljLnZhbHVlO1xuICAgICAgICAgIGNhbGxiYWNrKG1ldHJpYyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG4vKipcbiAqIFBlcmZvcm1hbnRseSBnZW5lcmF0ZSBhIHVuaXF1ZSwgMzAtY2hhciBzdHJpbmcgYnkgY29tYmluaW5nIGEgdmVyc2lvblxuICogbnVtYmVyLCB0aGUgY3VycmVudCB0aW1lc3RhbXAgd2l0aCBhIDEzLWRpZ2l0IG51bWJlciBpbnRlZ2VyLlxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVVbmlxdWVJRCA9ICgpOiBzdHJpbmcgPT4ge1xuICByZXR1cm4gYHYyLSR7RGF0ZS5ub3coKX0tJHtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAoOWUxMiAtIDEpKSArIDFlMTJ9YDtcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IE1ldHJpYyB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSUQgfSBmcm9tICcuL2dlbmVyYXRlVW5pcXVlSUQnO1xuXG5leHBvcnQgY29uc3QgaW5pdE1ldHJpYyA9IChuYW1lOiBNZXRyaWNbJ25hbWUnXSwgdmFsdWU/OiBudW1iZXIpOiBNZXRyaWMgPT4ge1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdmFsdWU6IHZhbHVlID8/IC0xLFxuICAgIGRlbHRhOiAwLFxuICAgIGVudHJpZXM6IFtdLFxuICAgIGlkOiBnZW5lcmF0ZVVuaXF1ZUlEKCksXG4gIH07XG59O1xuIiwgIi8qXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyIHtcbiAgKGVudHJ5OiBQZXJmb3JtYW5jZUVudHJ5KTogdm9pZDtcbn1cblxuLyoqXG4gKiBUYWtlcyBhIHBlcmZvcm1hbmNlIGVudHJ5IHR5cGUgYW5kIGEgY2FsbGJhY2sgZnVuY3Rpb24sIGFuZCBjcmVhdGVzIGFcbiAqIGBQZXJmb3JtYW5jZU9ic2VydmVyYCBpbnN0YW5jZSB0aGF0IHdpbGwgb2JzZXJ2ZSB0aGUgc3BlY2lmaWVkIGVudHJ5IHR5cGVcbiAqIHdpdGggYnVmZmVyaW5nIGVuYWJsZWQgYW5kIGNhbGwgdGhlIGNhbGxiYWNrIF9mb3IgZWFjaCBlbnRyeV8uXG4gKlxuICogVGhpcyBmdW5jdGlvbiBhbHNvIGZlYXR1cmUtZGV0ZWN0cyBlbnRyeSBzdXBwb3J0IGFuZCB3cmFwcyB0aGUgbG9naWMgaW4gYVxuICogdHJ5L2NhdGNoIHRvIGF2b2lkIGVycm9ycyBpbiB1bnN1cHBvcnRpbmcgYnJvd3NlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNlcnZlID0gKHR5cGU6IHN0cmluZywgY2FsbGJhY2s6IFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyKTogUGVyZm9ybWFuY2VPYnNlcnZlciB8IHVuZGVmaW5lZCA9PiB7XG4gIHRyeSB7XG4gICAgaWYgKFBlcmZvcm1hbmNlT2JzZXJ2ZXIuc3VwcG9ydGVkRW50cnlUeXBlcy5pbmNsdWRlcyh0eXBlKSkge1xuICAgICAgLy8gTW9yZSBleHRlbnNpdmUgZmVhdHVyZSBkZXRlY3QgbmVlZGVkIGZvciBGaXJlZm94IGR1ZSB0bzpcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Hb29nbGVDaHJvbWUvd2ViLXZpdGFscy9pc3N1ZXMvMTQyXG4gICAgICBpZiAodHlwZSA9PT0gJ2ZpcnN0LWlucHV0JyAmJiAhKCdQZXJmb3JtYW5jZUV2ZW50VGltaW5nJyBpbiBzZWxmKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBvOiBQZXJmb3JtYW5jZU9ic2VydmVyID0gbmV3IFBlcmZvcm1hbmNlT2JzZXJ2ZXIobCA9PiBsLmdldEVudHJpZXMoKS5tYXAoY2FsbGJhY2spKTtcblxuICAgICAgcG8ub2JzZXJ2ZSh7IHR5cGUsIGJ1ZmZlcmVkOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIHBvO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIERvIG5vdGhpbmcuXG4gIH1cbiAgcmV0dXJuO1xufTtcbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0IH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT25IaWRkZW5DYWxsYmFjayB7XG4gIChldmVudDogRXZlbnQpOiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3Qgb25IaWRkZW4gPSAoY2I6IE9uSGlkZGVuQ2FsbGJhY2ssIG9uY2U/OiBib29sZWFuKTogdm9pZCA9PiB7XG4gIGNvbnN0IG9uSGlkZGVuT3JQYWdlSGlkZSA9IChldmVudDogRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3BhZ2VoaWRlJyB8fCBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgIGNiKGV2ZW50KTtcbiAgICAgIGlmIChvbmNlKSB7XG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCBvbkhpZGRlbk9yUGFnZUhpZGUsIHRydWUpO1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIG9uSGlkZGVuT3JQYWdlSGlkZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBhZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgb25IaWRkZW5PclBhZ2VIaWRlLCB0cnVlKTtcbiAgLy8gU29tZSBicm93c2VycyBoYXZlIGJ1Z2d5IGltcGxlbWVudGF0aW9ucyBvZiB2aXNpYmlsaXR5Y2hhbmdlLFxuICAvLyBzbyB3ZSB1c2UgcGFnZWhpZGUgaW4gYWRkaXRpb24sIGp1c3QgdG8gYmUgc2FmZS5cbiAgYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCBvbkhpZGRlbk9yUGFnZUhpZGUsIHRydWUpO1xufTtcbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgYmluZFJlcG9ydGVyIH0gZnJvbSAnLi9saWIvYmluZFJlcG9ydGVyJztcbmltcG9ydCB7IGluaXRNZXRyaWMgfSBmcm9tICcuL2xpYi9pbml0TWV0cmljJztcbmltcG9ydCB7IG9ic2VydmUsIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyIH0gZnJvbSAnLi9saWIvb2JzZXJ2ZSc7XG5pbXBvcnQgeyBvbkhpZGRlbiB9IGZyb20gJy4vbGliL29uSGlkZGVuJztcbmltcG9ydCB7IFJlcG9ydEhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9sYXlvdXQtaW5zdGFiaWxpdHkvI3NlYy1sYXlvdXQtc2hpZnRcbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0U2hpZnQgZXh0ZW5kcyBQZXJmb3JtYW5jZUVudHJ5IHtcbiAgdmFsdWU6IG51bWJlcjtcbiAgaGFkUmVjZW50SW5wdXQ6IGJvb2xlYW47XG4gIHNvdXJjZXM6IEFycmF5PExheW91dFNoaWZ0QXR0cmlidXRpb24+O1xuICB0b0pTT04oKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0U2hpZnRBdHRyaWJ1dGlvbiB7XG4gIG5vZGU/OiBOb2RlO1xuICBwcmV2aW91c1JlY3Q6IERPTVJlY3RSZWFkT25seTtcbiAgY3VycmVudFJlY3Q6IERPTVJlY3RSZWFkT25seTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldENMUyA9IChvblJlcG9ydDogUmVwb3J0SGFuZGxlciwgcmVwb3J0QWxsQ2hhbmdlcz86IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgY29uc3QgbWV0cmljID0gaW5pdE1ldHJpYygnQ0xTJywgMCk7XG4gIGxldCByZXBvcnQ6IFJldHVyblR5cGU8dHlwZW9mIGJpbmRSZXBvcnRlcj47XG5cbiAgbGV0IHNlc3Npb25WYWx1ZSA9IDA7XG4gIGxldCBzZXNzaW9uRW50cmllczogUGVyZm9ybWFuY2VFbnRyeVtdID0gW107XG5cbiAgY29uc3QgZW50cnlIYW5kbGVyID0gKGVudHJ5OiBMYXlvdXRTaGlmdCk6IHZvaWQgPT4ge1xuICAgIC8vIE9ubHkgY291bnQgbGF5b3V0IHNoaWZ0cyB3aXRob3V0IHJlY2VudCB1c2VyIGlucHV0LlxuICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgd2h5IGVudHJ5IGNhbiBiZSB1bmRlZmluZWRcbiAgICBpZiAoZW50cnkgJiYgIWVudHJ5LmhhZFJlY2VudElucHV0KSB7XG4gICAgICBjb25zdCBmaXJzdFNlc3Npb25FbnRyeSA9IHNlc3Npb25FbnRyaWVzWzBdO1xuICAgICAgY29uc3QgbGFzdFNlc3Npb25FbnRyeSA9IHNlc3Npb25FbnRyaWVzW3Nlc3Npb25FbnRyaWVzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAvLyBJZiB0aGUgZW50cnkgb2NjdXJyZWQgbGVzcyB0aGFuIDEgc2Vjb25kIGFmdGVyIHRoZSBwcmV2aW91cyBlbnRyeSBhbmRcbiAgICAgIC8vIGxlc3MgdGhhbiA1IHNlY29uZHMgYWZ0ZXIgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzZXNzaW9uLCBpbmNsdWRlIHRoZVxuICAgICAgLy8gZW50cnkgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gT3RoZXJ3aXNlLCBzdGFydCBhIG5ldyBzZXNzaW9uLlxuICAgICAgaWYgKFxuICAgICAgICBzZXNzaW9uVmFsdWUgJiZcbiAgICAgICAgc2Vzc2lvbkVudHJpZXMubGVuZ3RoICE9PSAwICYmXG4gICAgICAgIGVudHJ5LnN0YXJ0VGltZSAtIGxhc3RTZXNzaW9uRW50cnkuc3RhcnRUaW1lIDwgMTAwMCAmJlxuICAgICAgICBlbnRyeS5zdGFydFRpbWUgLSBmaXJzdFNlc3Npb25FbnRyeS5zdGFydFRpbWUgPCA1MDAwXG4gICAgICApIHtcbiAgICAgICAgc2Vzc2lvblZhbHVlICs9IGVudHJ5LnZhbHVlO1xuICAgICAgICBzZXNzaW9uRW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlc3Npb25WYWx1ZSA9IGVudHJ5LnZhbHVlO1xuICAgICAgICBzZXNzaW9uRW50cmllcyA9IFtlbnRyeV07XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBjdXJyZW50IHNlc3Npb24gdmFsdWUgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgQ0xTIHZhbHVlLFxuICAgICAgLy8gdXBkYXRlIENMUyBhbmQgdGhlIGVudHJpZXMgY29udHJpYnV0aW5nIHRvIGl0LlxuICAgICAgaWYgKHNlc3Npb25WYWx1ZSA+IG1ldHJpYy52YWx1ZSkge1xuICAgICAgICBtZXRyaWMudmFsdWUgPSBzZXNzaW9uVmFsdWU7XG4gICAgICAgIG1ldHJpYy5lbnRyaWVzID0gc2Vzc2lvbkVudHJpZXM7XG4gICAgICAgIGlmIChyZXBvcnQpIHtcbiAgICAgICAgICByZXBvcnQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBwbyA9IG9ic2VydmUoJ2xheW91dC1zaGlmdCcsIGVudHJ5SGFuZGxlciBhcyBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlcik7XG4gIGlmIChwbykge1xuICAgIHJlcG9ydCA9IGJpbmRSZXBvcnRlcihvblJlcG9ydCwgbWV0cmljLCByZXBvcnRBbGxDaGFuZ2VzKTtcblxuICAgIG9uSGlkZGVuKCgpID0+IHtcbiAgICAgIHBvLnRha2VSZWNvcmRzKCkubWFwKGVudHJ5SGFuZGxlciBhcyBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlcik7XG4gICAgICByZXBvcnQodHJ1ZSk7XG4gICAgfSk7XG4gIH1cbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGdldEdsb2JhbE9iamVjdCB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5pbXBvcnQgeyBvbkhpZGRlbiB9IGZyb20gJy4vb25IaWRkZW4nO1xuXG5sZXQgZmlyc3RIaWRkZW5UaW1lID0gLTE7XG5cbmNvbnN0IGluaXRIaWRkZW5UaW1lID0gKCk6IG51bWJlciA9PiB7XG4gIHJldHVybiBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicgPyAwIDogSW5maW5pdHk7XG59O1xuXG5jb25zdCB0cmFja0NoYW5nZXMgPSAoKTogdm9pZCA9PiB7XG4gIC8vIFVwZGF0ZSB0aGUgdGltZSBpZi93aGVuIHRoZSBkb2N1bWVudCBiZWNvbWVzIGhpZGRlbi5cbiAgb25IaWRkZW4oKHsgdGltZVN0YW1wIH0pID0+IHtcbiAgICBmaXJzdEhpZGRlblRpbWUgPSB0aW1lU3RhbXA7XG4gIH0sIHRydWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZpc2liaWxpdHlXYXRjaGVyID0gKCk6IHtcbiAgcmVhZG9ubHkgZmlyc3RIaWRkZW5UaW1lOiBudW1iZXI7XG59ID0+IHtcbiAgaWYgKGZpcnN0SGlkZGVuVGltZSA8IDApIHtcbiAgICAvLyBJZiB0aGUgZG9jdW1lbnQgaXMgaGlkZGVuIHdoZW4gdGhpcyBjb2RlIHJ1bnMsIGFzc3VtZSBpdCB3YXMgaGlkZGVuXG4gICAgLy8gc2luY2UgbmF2aWdhdGlvbiBzdGFydC4gVGhpcyBpc24ndCBhIHBlcmZlY3QgaGV1cmlzdGljLCBidXQgaXQncyB0aGVcbiAgICAvLyBiZXN0IHdlIGNhbiBkbyB1bnRpbCBhbiBBUEkgaXMgYXZhaWxhYmxlIHRvIHN1cHBvcnQgcXVlcnlpbmcgcGFzdFxuICAgIC8vIHZpc2liaWxpdHlTdGF0ZS5cbiAgICBmaXJzdEhpZGRlblRpbWUgPSBpbml0SGlkZGVuVGltZSgpO1xuICAgIHRyYWNrQ2hhbmdlcygpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZ2V0IGZpcnN0SGlkZGVuVGltZSgpIHtcbiAgICAgIHJldHVybiBmaXJzdEhpZGRlblRpbWU7XG4gICAgfSxcbiAgfTtcbn07XG4iLCAiLypcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTENcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IGJpbmRSZXBvcnRlciB9IGZyb20gJy4vbGliL2JpbmRSZXBvcnRlcic7XG5pbXBvcnQgeyBnZXRWaXNpYmlsaXR5V2F0Y2hlciB9IGZyb20gJy4vbGliL2dldFZpc2liaWxpdHlXYXRjaGVyJztcbmltcG9ydCB7IGluaXRNZXRyaWMgfSBmcm9tICcuL2xpYi9pbml0TWV0cmljJztcbmltcG9ydCB7IG9ic2VydmUsIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyIH0gZnJvbSAnLi9saWIvb2JzZXJ2ZSc7XG5pbXBvcnQgeyBvbkhpZGRlbiB9IGZyb20gJy4vbGliL29uSGlkZGVuJztcbmltcG9ydCB7IFBlcmZvcm1hbmNlRXZlbnRUaW1pbmcsIFJlcG9ydEhhbmRsZXIgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGdldEZJRCA9IChvblJlcG9ydDogUmVwb3J0SGFuZGxlciwgcmVwb3J0QWxsQ2hhbmdlcz86IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgY29uc3QgdmlzaWJpbGl0eVdhdGNoZXIgPSBnZXRWaXNpYmlsaXR5V2F0Y2hlcigpO1xuICBjb25zdCBtZXRyaWMgPSBpbml0TWV0cmljKCdGSUQnKTtcbiAgbGV0IHJlcG9ydDogUmV0dXJuVHlwZTx0eXBlb2YgYmluZFJlcG9ydGVyPjtcblxuICBjb25zdCBlbnRyeUhhbmRsZXIgPSAoZW50cnk6IFBlcmZvcm1hbmNlRXZlbnRUaW1pbmcpOiB2b2lkID0+IHtcbiAgICAvLyBPbmx5IHJlcG9ydCBpZiB0aGUgcGFnZSB3YXNuJ3QgaGlkZGVuIHByaW9yIHRvIHRoZSBmaXJzdCBpbnB1dC5cbiAgICBpZiAocmVwb3J0ICYmIGVudHJ5LnN0YXJ0VGltZSA8IHZpc2liaWxpdHlXYXRjaGVyLmZpcnN0SGlkZGVuVGltZSkge1xuICAgICAgbWV0cmljLnZhbHVlID0gZW50cnkucHJvY2Vzc2luZ1N0YXJ0IC0gZW50cnkuc3RhcnRUaW1lO1xuICAgICAgbWV0cmljLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgICByZXBvcnQodHJ1ZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHBvID0gb2JzZXJ2ZSgnZmlyc3QtaW5wdXQnLCBlbnRyeUhhbmRsZXIgYXMgUGVyZm9ybWFuY2VFbnRyeUhhbmRsZXIpO1xuICBpZiAocG8pIHtcbiAgICByZXBvcnQgPSBiaW5kUmVwb3J0ZXIob25SZXBvcnQsIG1ldHJpYywgcmVwb3J0QWxsQ2hhbmdlcyk7XG4gICAgb25IaWRkZW4oKCkgPT4ge1xuICAgICAgcG8udGFrZVJlY29yZHMoKS5tYXAoZW50cnlIYW5kbGVyIGFzIFBlcmZvcm1hbmNlRW50cnlIYW5kbGVyKTtcbiAgICAgIHBvLmRpc2Nvbm5lY3QoKTtcbiAgICB9LCB0cnVlKTtcbiAgfVxufTtcbiIsICIvKlxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgYmluZFJlcG9ydGVyIH0gZnJvbSAnLi9saWIvYmluZFJlcG9ydGVyJztcbmltcG9ydCB7IGdldFZpc2liaWxpdHlXYXRjaGVyIH0gZnJvbSAnLi9saWIvZ2V0VmlzaWJpbGl0eVdhdGNoZXInO1xuaW1wb3J0IHsgaW5pdE1ldHJpYyB9IGZyb20gJy4vbGliL2luaXRNZXRyaWMnO1xuaW1wb3J0IHsgb2JzZXJ2ZSwgUGVyZm9ybWFuY2VFbnRyeUhhbmRsZXIgfSBmcm9tICcuL2xpYi9vYnNlcnZlJztcbmltcG9ydCB7IG9uSGlkZGVuIH0gZnJvbSAnLi9saWIvb25IaWRkZW4nO1xuaW1wb3J0IHsgUmVwb3J0SGFuZGxlciB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL2xhcmdlc3QtY29udGVudGZ1bC1wYWludC8jc2VjLWxhcmdlc3QtY29udGVudGZ1bC1wYWludC1pbnRlcmZhY2VcbmV4cG9ydCBpbnRlcmZhY2UgTGFyZ2VzdENvbnRlbnRmdWxQYWludCBleHRlbmRzIFBlcmZvcm1hbmNlRW50cnkge1xuICByZW5kZXJUaW1lOiBET01IaWdoUmVzVGltZVN0YW1wO1xuICBsb2FkVGltZTogRE9NSGlnaFJlc1RpbWVTdGFtcDtcbiAgc2l6ZTogbnVtYmVyO1xuICBpZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgZWxlbWVudD86IEVsZW1lbnQ7XG4gIHRvSlNPTigpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG5jb25zdCByZXBvcnRlZE1ldHJpY0lEczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7fTtcblxuZXhwb3J0IGNvbnN0IGdldExDUCA9IChvblJlcG9ydDogUmVwb3J0SGFuZGxlciwgcmVwb3J0QWxsQ2hhbmdlcz86IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgY29uc3QgdmlzaWJpbGl0eVdhdGNoZXIgPSBnZXRWaXNpYmlsaXR5V2F0Y2hlcigpO1xuICBjb25zdCBtZXRyaWMgPSBpbml0TWV0cmljKCdMQ1AnKTtcbiAgbGV0IHJlcG9ydDogUmV0dXJuVHlwZTx0eXBlb2YgYmluZFJlcG9ydGVyPjtcblxuICBjb25zdCBlbnRyeUhhbmRsZXIgPSAoZW50cnk6IFBlcmZvcm1hbmNlRW50cnkpOiB2b2lkID0+IHtcbiAgICAvLyBUaGUgc3RhcnRUaW1lIGF0dHJpYnV0ZSByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcmVuZGVyVGltZSBpZiBpdCBpcyBub3QgMCxcbiAgICAvLyBhbmQgdGhlIHZhbHVlIG9mIHRoZSBsb2FkVGltZSBvdGhlcndpc2UuXG4gICAgY29uc3QgdmFsdWUgPSBlbnRyeS5zdGFydFRpbWU7XG5cbiAgICAvLyBJZiB0aGUgcGFnZSB3YXMgaGlkZGVuIHByaW9yIHRvIHBhaW50IHRpbWUgb2YgdGhlIGVudHJ5LFxuICAgIC8vIGlnbm9yZSBpdCBhbmQgbWFyayB0aGUgbWV0cmljIGFzIGZpbmFsLCBvdGhlcndpc2UgYWRkIHRoZSBlbnRyeS5cbiAgICBpZiAodmFsdWUgPCB2aXNpYmlsaXR5V2F0Y2hlci5maXJzdEhpZGRlblRpbWUpIHtcbiAgICAgIG1ldHJpYy52YWx1ZSA9IHZhbHVlO1xuICAgICAgbWV0cmljLmVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuXG4gICAgaWYgKHJlcG9ydCkge1xuICAgICAgcmVwb3J0KCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHBvID0gb2JzZXJ2ZSgnbGFyZ2VzdC1jb250ZW50ZnVsLXBhaW50JywgZW50cnlIYW5kbGVyKTtcblxuICBpZiAocG8pIHtcbiAgICByZXBvcnQgPSBiaW5kUmVwb3J0ZXIob25SZXBvcnQsIG1ldHJpYywgcmVwb3J0QWxsQ2hhbmdlcyk7XG5cbiAgICBjb25zdCBzdG9wTGlzdGVuaW5nID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFyZXBvcnRlZE1ldHJpY0lEc1ttZXRyaWMuaWRdKSB7XG4gICAgICAgIHBvLnRha2VSZWNvcmRzKCkubWFwKGVudHJ5SGFuZGxlciBhcyBQZXJmb3JtYW5jZUVudHJ5SGFuZGxlcik7XG4gICAgICAgIHBvLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgcmVwb3J0ZWRNZXRyaWNJRHNbbWV0cmljLmlkXSA9IHRydWU7XG4gICAgICAgIHJlcG9ydCh0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RvcCBsaXN0ZW5pbmcgYWZ0ZXIgaW5wdXQuIE5vdGU6IHdoaWxlIHNjcm9sbGluZyBpcyBhbiBpbnB1dCB0aGF0XG4gICAgLy8gc3RvcCBMQ1Agb2JzZXJ2YXRpb24sIGl0J3MgdW5yZWxpYWJsZSBzaW5jZSBpdCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseVxuICAgIC8vIGdlbmVyYXRlZC4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vR29vZ2xlQ2hyb21lL3dlYi12aXRhbHMvaXNzdWVzLzc1XG4gICAgWydrZXlkb3duJywgJ2NsaWNrJ10uZm9yRWFjaCh0eXBlID0+IHtcbiAgICAgIGFkZEV2ZW50TGlzdGVuZXIodHlwZSwgc3RvcExpc3RlbmluZywgeyBvbmNlOiB0cnVlLCBjYXB0dXJlOiB0cnVlIH0pO1xuICAgIH0pO1xuXG4gICAgb25IaWRkZW4oc3RvcExpc3RlbmluZywgdHJ1ZSk7XG4gIH1cbn07XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbWF4LWxpbmVzICovXG4vKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55ICovXG5pbXBvcnQgeyBNZWFzdXJlbWVudHMsIFNwYW5Db250ZXh0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBicm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luLCBnZXRHbG9iYWxPYmplY3QsIGh0bWxUcmVlQXNTdHJpbmcsIGlzTm9kZUVudiwgbG9nZ2VyIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IFNwYW4gfSBmcm9tICcuLi9zcGFuJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgbXNUb1NlYyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGdldENMUywgTGF5b3V0U2hpZnQgfSBmcm9tICcuL3dlYi12aXRhbHMvZ2V0Q0xTJztcbmltcG9ydCB7IGdldEZJRCB9IGZyb20gJy4vd2ViLXZpdGFscy9nZXRGSUQnO1xuaW1wb3J0IHsgZ2V0TENQLCBMYXJnZXN0Q29udGVudGZ1bFBhaW50IH0gZnJvbSAnLi93ZWItdml0YWxzL2dldExDUCc7XG5pbXBvcnQgeyBnZXRWaXNpYmlsaXR5V2F0Y2hlciB9IGZyb20gJy4vd2ViLXZpdGFscy9saWIvZ2V0VmlzaWJpbGl0eVdhdGNoZXInO1xuaW1wb3J0IHsgTmF2aWdhdG9yRGV2aWNlTWVtb3J5LCBOYXZpZ2F0b3JOZXR3b3JrSW5mb3JtYXRpb24gfSBmcm9tICcuL3dlYi12aXRhbHMvdHlwZXMnO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuXG4vKiogQ2xhc3MgdHJhY2tpbmcgbWV0cmljcyAgKi9cbmV4cG9ydCBjbGFzcyBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uIHtcbiAgcHJpdmF0ZSBfbWVhc3VyZW1lbnRzOiBNZWFzdXJlbWVudHMgPSB7fTtcblxuICBwcml2YXRlIF9wZXJmb3JtYW5jZUN1cnNvcjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfbGNwRW50cnk6IExhcmdlc3RDb250ZW50ZnVsUGFpbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX2Nsc0VudHJ5OiBMYXlvdXRTaGlmdCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVwb3J0QWxsQ2hhbmdlczogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaWYgKCFpc05vZGVFbnYoKSAmJiBnbG9iYWw/LnBlcmZvcm1hbmNlICYmIGdsb2JhbD8uZG9jdW1lbnQpIHtcbiAgICAgIGlmIChnbG9iYWwucGVyZm9ybWFuY2UubWFyaykge1xuICAgICAgICBnbG9iYWwucGVyZm9ybWFuY2UubWFyaygnc2VudHJ5LXRyYWNpbmctaW5pdCcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl90cmFja0NMUygpO1xuICAgICAgdGhpcy5fdHJhY2tMQ1AoKTtcbiAgICAgIHRoaXMuX3RyYWNrRklEKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEFkZCBwZXJmb3JtYW5jZSByZWxhdGVkIHNwYW5zIHRvIGEgdHJhbnNhY3Rpb24gKi9cbiAgcHVibGljIGFkZFBlcmZvcm1hbmNlRW50cmllcyh0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBpZiAoIWdsb2JhbCB8fCAhZ2xvYmFsLnBlcmZvcm1hbmNlIHx8ICFnbG9iYWwucGVyZm9ybWFuY2UuZ2V0RW50cmllcyB8fCAhYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbikge1xuICAgICAgLy8gR2F0ZWtlZXBlciBpZiBwZXJmb3JtYW5jZSBBUEkgbm90IGF2YWlsYWJsZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxvZ2dlci5sb2coJ1tUcmFjaW5nXSBBZGRpbmcgJiBhZGp1c3Rpbmcgc3BhbnMgdXNpbmcgUGVyZm9ybWFuY2UgQVBJJyk7XG5cbiAgICBjb25zdCB0aW1lT3JpZ2luID0gbXNUb1NlYyhicm93c2VyUGVyZm9ybWFuY2VUaW1lT3JpZ2luKTtcbiAgICBsZXQgZW50cnlTY3JpcHRTcmM6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChnbG9iYWwuZG9jdW1lbnQgJiYgZ2xvYmFsLmRvY3VtZW50LnNjcmlwdHMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLWZvci1vZlxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBnbG9iYWwuZG9jdW1lbnQuc2NyaXB0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyBXZSBnbyB0aHJvdWdoIGFsbCBzY3JpcHRzIG9uIHRoZSBwYWdlIGFuZCBsb29rIGZvciAnZGF0YS1lbnRyeSdcbiAgICAgICAgLy8gV2UgcmVtZW1iZXIgdGhlIG5hbWUgYW5kIG1lYXN1cmUgdGhlIHRpbWUgYmV0d2VlbiB0aGlzIHNjcmlwdCBmaW5pc2hlZCBsb2FkaW5nIGFuZFxuICAgICAgICAvLyBvdXIgbWFyayAnc2VudHJ5LXRyYWNpbmctaW5pdCdcbiAgICAgICAgaWYgKGdsb2JhbC5kb2N1bWVudC5zY3JpcHRzW2ldLmRhdGFzZXQuZW50cnkgPT09ICd0cnVlJykge1xuICAgICAgICAgIGVudHJ5U2NyaXB0U3JjID0gZ2xvYmFsLmRvY3VtZW50LnNjcmlwdHNbaV0uc3JjO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGVudHJ5U2NyaXB0U3RhcnRUaW1lc3RhbXA6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHJhY2luZ0luaXRNYXJrU3RhcnRUaW1lOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlc3BvbnNlU3RhcnRUaW1lc3RhbXA6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgcmVxdWVzdFN0YXJ0VGltZXN0YW1wOiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgICBnbG9iYWwucGVyZm9ybWFuY2VcbiAgICAgIC5nZXRFbnRyaWVzKClcbiAgICAgIC5zbGljZSh0aGlzLl9wZXJmb3JtYW5jZUN1cnNvcilcbiAgICAgIC5mb3JFYWNoKChlbnRyeTogUmVjb3JkPHN0cmluZywgYW55PikgPT4ge1xuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBtc1RvU2VjKGVudHJ5LnN0YXJ0VGltZSBhcyBudW1iZXIpO1xuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG1zVG9TZWMoZW50cnkuZHVyYXRpb24gYXMgbnVtYmVyKTtcblxuICAgICAgICBpZiAodHJhbnNhY3Rpb24ub3AgPT09ICduYXZpZ2F0aW9uJyAmJiB0aW1lT3JpZ2luICsgc3RhcnRUaW1lIDwgdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGVudHJ5LmVudHJ5VHlwZSkge1xuICAgICAgICAgIGNhc2UgJ25hdmlnYXRpb24nOiB7XG4gICAgICAgICAgICBhZGROYXZpZ2F0aW9uU3BhbnModHJhbnNhY3Rpb24sIGVudHJ5LCB0aW1lT3JpZ2luKTtcbiAgICAgICAgICAgIHJlc3BvbnNlU3RhcnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXNwb25zZVN0YXJ0IGFzIG51bWJlcik7XG4gICAgICAgICAgICByZXF1ZXN0U3RhcnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXF1ZXN0U3RhcnQgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdtYXJrJzpcbiAgICAgICAgICBjYXNlICdwYWludCc6XG4gICAgICAgICAgY2FzZSAnbWVhc3VyZSc6IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZXN0YW1wID0gYWRkTWVhc3VyZVNwYW5zKHRyYW5zYWN0aW9uLCBlbnRyeSwgc3RhcnRUaW1lLCBkdXJhdGlvbiwgdGltZU9yaWdpbik7XG4gICAgICAgICAgICBpZiAodHJhY2luZ0luaXRNYXJrU3RhcnRUaW1lID09PSB1bmRlZmluZWQgJiYgZW50cnkubmFtZSA9PT0gJ3NlbnRyeS10cmFjaW5nLWluaXQnKSB7XG4gICAgICAgICAgICAgIHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSA9IHN0YXJ0VGltZXN0YW1wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjYXB0dXJlIHdlYiB2aXRhbHNcblxuICAgICAgICAgICAgY29uc3QgZmlyc3RIaWRkZW4gPSBnZXRWaXNpYmlsaXR5V2F0Y2hlcigpO1xuICAgICAgICAgICAgLy8gT25seSByZXBvcnQgaWYgdGhlIHBhZ2Ugd2Fzbid0IGhpZGRlbiBwcmlvciB0byB0aGUgd2ViIHZpdGFsLlxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVjb3JkID0gZW50cnkuc3RhcnRUaW1lIDwgZmlyc3RIaWRkZW4uZmlyc3RIaWRkZW5UaW1lO1xuXG4gICAgICAgICAgICBpZiAoZW50cnkubmFtZSA9PT0gJ2ZpcnN0LXBhaW50JyAmJiBzaG91bGRSZWNvcmQpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIEZQJyk7XG4gICAgICAgICAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snZnAnXSA9IHsgdmFsdWU6IGVudHJ5LnN0YXJ0VGltZSB9O1xuICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZnAnXSA9IHsgdmFsdWU6IHN0YXJ0VGltZXN0YW1wIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbnRyeS5uYW1lID09PSAnZmlyc3QtY29udGVudGZ1bC1wYWludCcgJiYgc2hvdWxkUmVjb3JkKSB7XG4gICAgICAgICAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBGQ1AnKTtcbiAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWydmY3AnXSA9IHsgdmFsdWU6IGVudHJ5LnN0YXJ0VGltZSB9O1xuICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmNwJ10gPSB7IHZhbHVlOiBzdGFydFRpbWVzdGFtcCB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAncmVzb3VyY2UnOiB7XG4gICAgICAgICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSAoZW50cnkubmFtZSBhcyBzdHJpbmcpLnJlcGxhY2UoZ2xvYmFsLmxvY2F0aW9uLm9yaWdpbiwgJycpO1xuICAgICAgICAgICAgY29uc3QgZW5kVGltZXN0YW1wID0gYWRkUmVzb3VyY2VTcGFucyh0cmFuc2FjdGlvbiwgZW50cnksIHJlc291cmNlTmFtZSwgc3RhcnRUaW1lLCBkdXJhdGlvbiwgdGltZU9yaWdpbik7XG4gICAgICAgICAgICAvLyBXZSByZW1lbWJlciB0aGUgZW50cnkgc2NyaXB0IGVuZCB0aW1lIHRvIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZSB0byB0aGUgZmlyc3QgaW5pdCBtYXJrXG4gICAgICAgICAgICBpZiAoZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCA9PT0gdW5kZWZpbmVkICYmIChlbnRyeVNjcmlwdFNyYyB8fCAnJykuaW5kZXhPZihyZXNvdXJjZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCA9IGVuZFRpbWVzdGFtcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIC8vIElnbm9yZSBvdGhlciBlbnRyeSB0eXBlcy5cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICBpZiAoZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkICYmIHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgICAgICBkZXNjcmlwdGlvbjogJ2V2YWx1YXRpb24nLFxuICAgICAgICBlbmRUaW1lc3RhbXA6IHRyYWNpbmdJbml0TWFya1N0YXJ0VGltZSxcbiAgICAgICAgb3A6ICdzY3JpcHQnLFxuICAgICAgICBzdGFydFRpbWVzdGFtcDogZW50cnlTY3JpcHRTdGFydFRpbWVzdGFtcCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuX3BlcmZvcm1hbmNlQ3Vyc29yID0gTWF0aC5tYXgocGVyZm9ybWFuY2UuZ2V0RW50cmllcygpLmxlbmd0aCAtIDEsIDApO1xuXG4gICAgdGhpcy5fdHJhY2tOYXZpZ2F0b3IodHJhbnNhY3Rpb24pO1xuXG4gICAgLy8gTWVhc3VyZW1lbnRzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgcGFnZWxvYWQgdHJhbnNhY3Rpb25zXG4gICAgaWYgKHRyYW5zYWN0aW9uLm9wID09PSAncGFnZWxvYWQnKSB7XG4gICAgICAvLyBub3JtYWxpemUgYXBwbGljYWJsZSB3ZWIgdml0YWwgdmFsdWVzIHRvIGJlIHJlbGF0aXZlIHRvIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wXG5cbiAgICAgIGNvbnN0IHRpbWVPcmlnaW4gPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4pO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBUVEZCIChUaW1lIHRvIEZpcnN0IEJ5dGUpLCB3aGljaCBtZWFzdXJlZCBhcyB0aGUgdGltZSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRyYW5zYWN0aW9uIGFuZCB0aGVcbiAgICAgIC8vIHN0YXJ0IG9mIHRoZSByZXNwb25zZSBpbiBtaWxsaXNlY29uZHNcbiAgICAgIGlmICh0eXBlb2YgcmVzcG9uc2VTdGFydFRpbWVzdGFtcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIFRURkInKTtcbiAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzWyd0dGZiJ10gPSB7IHZhbHVlOiAocmVzcG9uc2VTdGFydFRpbWVzdGFtcCAtIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wKSAqIDEwMDAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3RTdGFydFRpbWVzdGFtcCA9PT0gJ251bWJlcicgJiYgcmVxdWVzdFN0YXJ0VGltZXN0YW1wIDw9IHJlc3BvbnNlU3RhcnRUaW1lc3RhbXApIHtcbiAgICAgICAgICAvLyBDYXB0dXJlIHRoZSB0aW1lIHNwZW50IG1ha2luZyB0aGUgcmVxdWVzdCBhbmQgcmVjZWl2aW5nIHRoZSBmaXJzdCBieXRlIG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSB0aW1lIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSByZXF1ZXN0IGFuZCB0aGUgc3RhcnQgb2YgdGhlIHJlc3BvbnNlIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ3R0ZmIucmVxdWVzdFRpbWUnXSA9IHsgdmFsdWU6IChyZXNwb25zZVN0YXJ0VGltZXN0YW1wIC0gcmVxdWVzdFN0YXJ0VGltZXN0YW1wKSAqIDEwMDAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBbJ2ZjcCcsICdmcCcsICdsY3AnXS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX21lYXN1cmVtZW50c1tuYW1lXSB8fCB0aW1lT3JpZ2luID49IHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIHdlYiB2aXRhbHMsIGZjcCwgZnAsIGxjcCwgYW5kIHR0ZmIsIGFsbCBtZWFzdXJlIHJlbGF0aXZlIHRvIHRpbWVPcmlnaW4uXG4gICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRpbWVPcmlnaW4gaXMgbm90IGNhcHR1cmVkIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24gc3BhbiBkYXRhLCBzbyB0aGVzZSB3ZWIgdml0YWxzIHdpbGwgbmVlZFxuICAgICAgICAvLyB0byBiZSBhZGp1c3RlZCB0byBiZSByZWxhdGl2ZSB0byB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcC5cblxuICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuX21lYXN1cmVtZW50c1tuYW1lXS52YWx1ZTtcbiAgICAgICAgY29uc3QgbWVhc3VyZW1lbnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgbXNUb1NlYyhvbGRWYWx1ZSk7XG4gICAgICAgIC8vIG5vcm1hbGl6ZWRWYWx1ZSBzaG91bGQgYmUgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IE1hdGguYWJzKChtZWFzdXJlbWVudFRpbWVzdGFtcCAtIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wKSAqIDEwMDApO1xuXG4gICAgICAgIGNvbnN0IGRlbHRhID0gbm9ybWFsaXplZFZhbHVlIC0gb2xkVmFsdWU7XG4gICAgICAgIGxvZ2dlci5sb2coYFtNZWFzdXJlbWVudHNdIE5vcm1hbGl6ZWQgJHtuYW1lfSBmcm9tICR7b2xkVmFsdWV9IHRvICR7bm9ybWFsaXplZFZhbHVlfSAoJHtkZWx0YX0pYCk7XG5cbiAgICAgICAgdGhpcy5fbWVhc3VyZW1lbnRzW25hbWVdLnZhbHVlID0gbm9ybWFsaXplZFZhbHVlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmlkJ10gJiYgdGhpcy5fbWVhc3VyZW1lbnRzWydmaWQnXSkge1xuICAgICAgICAvLyBjcmVhdGUgc3BhbiBmb3IgRklEXG5cbiAgICAgICAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogJ2ZpcnN0IGlucHV0IGRlbGF5JyxcbiAgICAgICAgICBlbmRUaW1lc3RhbXA6IHRoaXMuX21lYXN1cmVtZW50c1snbWFyay5maWQnXS52YWx1ZSArIG1zVG9TZWModGhpcy5fbWVhc3VyZW1lbnRzWydmaWQnXS52YWx1ZSksXG4gICAgICAgICAgb3A6ICd3ZWIudml0YWxzJyxcbiAgICAgICAgICBzdGFydFRpbWVzdGFtcDogdGhpcy5fbWVhc3VyZW1lbnRzWydtYXJrLmZpZCddLnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgRkNQIGlzIG5vdCByZWNvcmRlZCB3ZSBzaG91bGQgbm90IHJlY29yZCB0aGUgY2xzIHZhbHVlXG4gICAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG5ldyBkZWZpbml0aW9uIG9mIENMUy5cbiAgICAgIGlmICghKCdmY3AnIGluIHRoaXMuX21lYXN1cmVtZW50cykpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuX21lYXN1cmVtZW50cy5jbHM7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldE1lYXN1cmVtZW50cyh0aGlzLl9tZWFzdXJlbWVudHMpO1xuICAgICAgdGhpcy5fdGFnTWV0cmljSW5mbyh0cmFuc2FjdGlvbik7XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnc2VudHJ5X3JlcG9ydEFsbENoYW5nZXMnLCB0aGlzLl9yZXBvcnRBbGxDaGFuZ2VzKTtcbiAgICB9XG4gIH1cblxuICAvKiogQWRkIExDUCAvIENMUyBkYXRhIHRvIHRyYW5zYWN0aW9uIHRvIGFsbG93IGRlYnVnZ2luZyAqL1xuICBwcml2YXRlIF90YWdNZXRyaWNJbmZvKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sY3BFbnRyeSkge1xuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIExDUCBEYXRhJyk7XG4gICAgICAvLyBDYXB0dXJlIFByb3BlcnRpZXMgb2YgdGhlIExDUCBlbGVtZW50IHRoYXQgY29udHJpYnV0ZXMgdG8gdGhlIExDUC5cblxuICAgICAgaWYgKHRoaXMuX2xjcEVudHJ5LmVsZW1lbnQpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdsY3AuZWxlbWVudCcsIGh0bWxUcmVlQXNTdHJpbmcodGhpcy5fbGNwRW50cnkuZWxlbWVudCkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fbGNwRW50cnkuaWQpIHtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdsY3AuaWQnLCB0aGlzLl9sY3BFbnRyeS5pZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9sY3BFbnRyeS51cmwpIHtcbiAgICAgICAgLy8gVHJpbSBVUkwgdG8gdGhlIGZpcnN0IDIwMCBjaGFyYWN0ZXJzLlxuICAgICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2xjcC51cmwnLCB0aGlzLl9sY3BFbnRyeS51cmwudHJpbSgpLnNsaWNlKDAsIDIwMCkpO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2xjcC5zaXplJywgdGhpcy5fbGNwRW50cnkuc2l6ZSk7XG4gICAgfVxuXG4gICAgLy8gU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTGF5b3V0U2hpZnRcbiAgICBpZiAodGhpcy5fY2xzRW50cnkgJiYgdGhpcy5fY2xzRW50cnkuc291cmNlcykge1xuICAgICAgbG9nZ2VyLmxvZygnW01lYXN1cmVtZW50c10gQWRkaW5nIENMUyBEYXRhJyk7XG4gICAgICB0aGlzLl9jbHNFbnRyeS5zb3VyY2VzLmZvckVhY2goKHNvdXJjZSwgaW5kZXgpID0+XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRhZyhgY2xzLnNvdXJjZS4ke2luZGV4ICsgMX1gLCBodG1sVHJlZUFzU3RyaW5nKHNvdXJjZS5ub2RlKSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdGFydHMgdHJhY2tpbmcgdGhlIEN1bXVsYXRpdmUgTGF5b3V0IFNoaWZ0IG9uIHRoZSBjdXJyZW50IHBhZ2UuICovXG4gIHByaXZhdGUgX3RyYWNrQ0xTKCk6IHZvaWQge1xuICAgIC8vIFNlZTpcbiAgICAvLyBodHRwczovL3dlYi5kZXYvZXZvbHZpbmctY2xzL1xuICAgIC8vIGh0dHBzOi8vd2ViLmRldi9jbHMtd2ViLXRvb2xpbmcvXG4gICAgZ2V0Q0xTKG1ldHJpYyA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IG1ldHJpYy5lbnRyaWVzLnBvcCgpO1xuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBDTFMnKTtcbiAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snY2xzJ10gPSB7IHZhbHVlOiBtZXRyaWMudmFsdWUgfTtcbiAgICAgIHRoaXMuX2Nsc0VudHJ5ID0gZW50cnkgYXMgTGF5b3V0U2hpZnQ7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FwdHVyZSB0aGUgaW5mb3JtYXRpb24gb2YgdGhlIHVzZXIgYWdlbnQuXG4gICAqL1xuICBwcml2YXRlIF90cmFja05hdmlnYXRvcih0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yIGFzIG51bGwgfCAoTmF2aWdhdG9yICYgTmF2aWdhdG9yTmV0d29ya0luZm9ybWF0aW9uICYgTmF2aWdhdG9yRGV2aWNlTWVtb3J5KTtcbiAgICBpZiAoIW5hdmlnYXRvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHRyYWNrIG5ldHdvcmsgY29ubmVjdGl2aXR5XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IG5hdmlnYXRvci5jb25uZWN0aW9uO1xuICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICBpZiAoY29ubmVjdGlvbi5lZmZlY3RpdmVUeXBlKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnZWZmZWN0aXZlQ29ubmVjdGlvblR5cGUnLCBjb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29ubmVjdGlvbi50eXBlKSB7XG4gICAgICAgIHRyYW5zYWN0aW9uLnNldFRhZygnY29ubmVjdGlvblR5cGUnLCBjb25uZWN0aW9uLnR5cGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNNZWFzdXJlbWVudFZhbHVlKGNvbm5lY3Rpb24ucnR0KSkge1xuICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2Nvbm5lY3Rpb24ucnR0J10gPSB7IHZhbHVlOiBjb25uZWN0aW9uLnJ0dCBhcyBudW1iZXIgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTWVhc3VyZW1lbnRWYWx1ZShjb25uZWN0aW9uLmRvd25saW5rKSkge1xuICAgICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2Nvbm5lY3Rpb24uZG93bmxpbmsnXSA9IHsgdmFsdWU6IGNvbm5lY3Rpb24uZG93bmxpbmsgYXMgbnVtYmVyIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTWVhc3VyZW1lbnRWYWx1ZShuYXZpZ2F0b3IuZGV2aWNlTWVtb3J5KSkge1xuICAgICAgdHJhbnNhY3Rpb24uc2V0VGFnKCdkZXZpY2VNZW1vcnknLCBTdHJpbmcobmF2aWdhdG9yLmRldmljZU1lbW9yeSkpO1xuICAgIH1cblxuICAgIGlmIChpc01lYXN1cmVtZW50VmFsdWUobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kpKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ2hhcmR3YXJlQ29uY3VycmVuY3knLCBTdHJpbmcobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kpKTtcbiAgICB9XG4gIH1cblxuICAvKiogU3RhcnRzIHRyYWNraW5nIHRoZSBMYXJnZXN0IENvbnRlbnRmdWwgUGFpbnQgb24gdGhlIGN1cnJlbnQgcGFnZS4gKi9cbiAgcHJpdmF0ZSBfdHJhY2tMQ1AoKTogdm9pZCB7XG4gICAgZ2V0TENQKG1ldHJpYyA9PiB7XG4gICAgICBjb25zdCBlbnRyeSA9IG1ldHJpYy5lbnRyaWVzLnBvcCgpO1xuXG4gICAgICBpZiAoIWVudHJ5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGltZU9yaWdpbiA9IG1zVG9TZWMoYnJvd3NlclBlcmZvcm1hbmNlVGltZU9yaWdpbiBhcyBudW1iZXIpO1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbXNUb1NlYyhlbnRyeS5zdGFydFRpbWUgYXMgbnVtYmVyKTtcbiAgICAgIGxvZ2dlci5sb2coJ1tNZWFzdXJlbWVudHNdIEFkZGluZyBMQ1AnKTtcbiAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snbGNwJ10gPSB7IHZhbHVlOiBtZXRyaWMudmFsdWUgfTtcbiAgICAgIHRoaXMuX21lYXN1cmVtZW50c1snbWFyay5sY3AnXSA9IHsgdmFsdWU6IHRpbWVPcmlnaW4gKyBzdGFydFRpbWUgfTtcbiAgICAgIHRoaXMuX2xjcEVudHJ5ID0gZW50cnkgYXMgTGFyZ2VzdENvbnRlbnRmdWxQYWludDtcbiAgICB9LCB0aGlzLl9yZXBvcnRBbGxDaGFuZ2VzKTtcbiAgfVxuXG4gIC8qKiBTdGFydHMgdHJhY2tpbmcgdGhlIEZpcnN0IElucHV0IERlbGF5IG9uIHRoZSBjdXJyZW50IHBhZ2UuICovXG4gIHByaXZhdGUgX3RyYWNrRklEKCk6IHZvaWQge1xuICAgIGdldEZJRChtZXRyaWMgPT4ge1xuICAgICAgY29uc3QgZW50cnkgPSBtZXRyaWMuZW50cmllcy5wb3AoKTtcblxuICAgICAgaWYgKCFlbnRyeSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWVPcmlnaW4gPSBtc1RvU2VjKGJyb3dzZXJQZXJmb3JtYW5jZVRpbWVPcmlnaW4gYXMgbnVtYmVyKTtcbiAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IG1zVG9TZWMoZW50cnkuc3RhcnRUaW1lIGFzIG51bWJlcik7XG4gICAgICBsb2dnZXIubG9nKCdbTWVhc3VyZW1lbnRzXSBBZGRpbmcgRklEJyk7XG4gICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ2ZpZCddID0geyB2YWx1ZTogbWV0cmljLnZhbHVlIH07XG4gICAgICB0aGlzLl9tZWFzdXJlbWVudHNbJ21hcmsuZmlkJ10gPSB7IHZhbHVlOiB0aW1lT3JpZ2luICsgc3RhcnRUaW1lIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEluc3RydW1lbnQgbmF2aWdhdGlvbiBlbnRyaWVzICovXG5mdW5jdGlvbiBhZGROYXZpZ2F0aW9uU3BhbnModHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uLCBlbnRyeTogUmVjb3JkPHN0cmluZywgYW55PiwgdGltZU9yaWdpbjogbnVtYmVyKTogdm9pZCB7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7IHRyYW5zYWN0aW9uLCBlbnRyeSwgZXZlbnQ6ICd1bmxvYWRFdmVudCcsIHRpbWVPcmlnaW4gfSk7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7IHRyYW5zYWN0aW9uLCBlbnRyeSwgZXZlbnQ6ICdyZWRpcmVjdCcsIHRpbWVPcmlnaW4gfSk7XG4gIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyh7IHRyYW5zYWN0aW9uLCBlbnRyeSwgZXZlbnQ6ICdkb21Db250ZW50TG9hZGVkRXZlbnQnLCB0aW1lT3JpZ2luIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50OiAnbG9hZEV2ZW50JywgdGltZU9yaWdpbiB9KTtcbiAgYWRkUGVyZm9ybWFuY2VOYXZpZ2F0aW9uVGltaW5nKHsgdHJhbnNhY3Rpb24sIGVudHJ5LCBldmVudDogJ2Nvbm5lY3QnLCB0aW1lT3JpZ2luIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoe1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIGVudHJ5LFxuICAgIGV2ZW50OiAnc2VjdXJlQ29ubmVjdGlvbicsXG4gICAgdGltZU9yaWdpbixcbiAgICBldmVudEVuZDogJ2Nvbm5lY3RFbmQnLFxuICAgIGRlc2NyaXB0aW9uOiAnVExTL1NTTCcsXG4gIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoe1xuICAgIHRyYW5zYWN0aW9uLFxuICAgIGVudHJ5LFxuICAgIGV2ZW50OiAnZmV0Y2gnLFxuICAgIHRpbWVPcmlnaW4sXG4gICAgZXZlbnRFbmQ6ICdkb21haW5Mb29rdXBTdGFydCcsXG4gICAgZGVzY3JpcHRpb246ICdjYWNoZScsXG4gIH0pO1xuICBhZGRQZXJmb3JtYW5jZU5hdmlnYXRpb25UaW1pbmcoeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50OiAnZG9tYWluTG9va3VwJywgdGltZU9yaWdpbiwgZGVzY3JpcHRpb246ICdETlMnIH0pO1xuICBhZGRSZXF1ZXN0KHRyYW5zYWN0aW9uLCBlbnRyeSwgdGltZU9yaWdpbik7XG59XG5cbi8qKiBDcmVhdGUgbWVhc3VyZSByZWxhdGVkIHNwYW5zICovXG5mdW5jdGlvbiBhZGRNZWFzdXJlU3BhbnMoXG4gIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbixcbiAgZW50cnk6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHN0YXJ0VGltZTogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICB0aW1lT3JpZ2luOiBudW1iZXIsXG4pOiBudW1iZXIge1xuICBjb25zdCBtZWFzdXJlU3RhcnRUaW1lc3RhbXAgPSB0aW1lT3JpZ2luICsgc3RhcnRUaW1lO1xuICBjb25zdCBtZWFzdXJlRW5kVGltZXN0YW1wID0gbWVhc3VyZVN0YXJ0VGltZXN0YW1wICsgZHVyYXRpb247XG5cbiAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICBkZXNjcmlwdGlvbjogZW50cnkubmFtZSBhcyBzdHJpbmcsXG4gICAgZW5kVGltZXN0YW1wOiBtZWFzdXJlRW5kVGltZXN0YW1wLFxuICAgIG9wOiBlbnRyeS5lbnRyeVR5cGUgYXMgc3RyaW5nLFxuICAgIHN0YXJ0VGltZXN0YW1wOiBtZWFzdXJlU3RhcnRUaW1lc3RhbXAsXG4gIH0pO1xuXG4gIHJldHVybiBtZWFzdXJlU3RhcnRUaW1lc3RhbXA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VFbnRyeSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaW5pdGlhdG9yVHlwZT86IHN0cmluZztcbiAgdHJhbnNmZXJTaXplPzogbnVtYmVyO1xuICBlbmNvZGVkQm9keVNpemU/OiBudW1iZXI7XG4gIGRlY29kZWRCb2R5U2l6ZT86IG51bWJlcjtcbn1cblxuLyoqIENyZWF0ZSByZXNvdXJjZS1yZWxhdGVkIHNwYW5zICovXG5leHBvcnQgZnVuY3Rpb24gYWRkUmVzb3VyY2VTcGFucyhcbiAgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uLFxuICBlbnRyeTogUmVzb3VyY2VFbnRyeSxcbiAgcmVzb3VyY2VOYW1lOiBzdHJpbmcsXG4gIHN0YXJ0VGltZTogbnVtYmVyLFxuICBkdXJhdGlvbjogbnVtYmVyLFxuICB0aW1lT3JpZ2luOiBudW1iZXIsXG4pOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAvLyB3ZSBhbHJlYWR5IGluc3RydW1lbnQgYmFzZWQgb24gZmV0Y2ggYW5kIHhociwgc28gd2UgZG9uJ3QgbmVlZCB0b1xuICAvLyBkdXBsaWNhdGUgc3BhbnMgaGVyZS5cbiAgaWYgKGVudHJ5LmluaXRpYXRvclR5cGUgPT09ICd4bWxodHRwcmVxdWVzdCcgfHwgZW50cnkuaW5pdGlhdG9yVHlwZSA9PT0gJ2ZldGNoJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGlmICgndHJhbnNmZXJTaXplJyBpbiBlbnRyeSkge1xuICAgIGRhdGFbJ1RyYW5zZmVyIFNpemUnXSA9IGVudHJ5LnRyYW5zZmVyU2l6ZTtcbiAgfVxuICBpZiAoJ2VuY29kZWRCb2R5U2l6ZScgaW4gZW50cnkpIHtcbiAgICBkYXRhWydFbmNvZGVkIEJvZHkgU2l6ZSddID0gZW50cnkuZW5jb2RlZEJvZHlTaXplO1xuICB9XG4gIGlmICgnZGVjb2RlZEJvZHlTaXplJyBpbiBlbnRyeSkge1xuICAgIGRhdGFbJ0RlY29kZWQgQm9keSBTaXplJ10gPSBlbnRyeS5kZWNvZGVkQm9keVNpemU7XG4gIH1cblxuICBjb25zdCBzdGFydFRpbWVzdGFtcCA9IHRpbWVPcmlnaW4gKyBzdGFydFRpbWU7XG4gIGNvbnN0IGVuZFRpbWVzdGFtcCA9IHN0YXJ0VGltZXN0YW1wICsgZHVyYXRpb247XG5cbiAgX3N0YXJ0Q2hpbGQodHJhbnNhY3Rpb24sIHtcbiAgICBkZXNjcmlwdGlvbjogcmVzb3VyY2VOYW1lLFxuICAgIGVuZFRpbWVzdGFtcCxcbiAgICBvcDogZW50cnkuaW5pdGlhdG9yVHlwZSA/IGByZXNvdXJjZS4ke2VudHJ5LmluaXRpYXRvclR5cGV9YCA6ICdyZXNvdXJjZScsXG4gICAgc3RhcnRUaW1lc3RhbXAsXG4gICAgZGF0YSxcbiAgfSk7XG5cbiAgcmV0dXJuIGVuZFRpbWVzdGFtcDtcbn1cblxuLyoqIENyZWF0ZSBwZXJmb3JtYW5jZSBuYXZpZ2F0aW9uIHJlbGF0ZWQgc3BhbnMgKi9cbmZ1bmN0aW9uIGFkZFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZyhwcm9wczoge1xuICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247XG4gIGVudHJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBldmVudDogc3RyaW5nO1xuICB0aW1lT3JpZ2luOiBudW1iZXI7XG4gIGV2ZW50RW5kPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn0pOiB2b2lkIHtcbiAgY29uc3QgeyB0cmFuc2FjdGlvbiwgZW50cnksIGV2ZW50LCB0aW1lT3JpZ2luLCBldmVudEVuZCwgZGVzY3JpcHRpb24gfSA9IHByb3BzO1xuXG4gIGNvbnN0IGVuZCA9IGV2ZW50RW5kID8gKGVudHJ5W2V2ZW50RW5kXSBhcyBudW1iZXIgfCB1bmRlZmluZWQpIDogKGVudHJ5W2Ake2V2ZW50fUVuZGBdIGFzIG51bWJlciB8IHVuZGVmaW5lZCk7XG4gIGNvbnN0IHN0YXJ0ID0gZW50cnlbYCR7ZXZlbnR9U3RhcnRgXSBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGlmICghc3RhcnQgfHwgIWVuZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgIG9wOiAnYnJvd3NlcicsXG4gICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uID8/IGV2ZW50LFxuICAgIHN0YXJ0VGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhzdGFydCksXG4gICAgZW5kVGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbmQpLFxuICB9KTtcbn1cblxuLyoqIENyZWF0ZSByZXF1ZXN0IGFuZCByZXNwb25zZSByZWxhdGVkIHNwYW5zICovXG5mdW5jdGlvbiBhZGRSZXF1ZXN0KHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiwgZW50cnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIHRpbWVPcmlnaW46IG51bWJlcik6IHZvaWQge1xuICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgIG9wOiAnYnJvd3NlcicsXG4gICAgZGVzY3JpcHRpb246ICdyZXF1ZXN0JyxcbiAgICBzdGFydFRpbWVzdGFtcDogdGltZU9yaWdpbiArIG1zVG9TZWMoZW50cnkucmVxdWVzdFN0YXJ0IGFzIG51bWJlciksXG4gICAgZW5kVGltZXN0YW1wOiB0aW1lT3JpZ2luICsgbXNUb1NlYyhlbnRyeS5yZXNwb25zZUVuZCBhcyBudW1iZXIpLFxuICB9KTtcblxuICBfc3RhcnRDaGlsZCh0cmFuc2FjdGlvbiwge1xuICAgIG9wOiAnYnJvd3NlcicsXG4gICAgZGVzY3JpcHRpb246ICdyZXNwb25zZScsXG4gICAgc3RhcnRUaW1lc3RhbXA6IHRpbWVPcmlnaW4gKyBtc1RvU2VjKGVudHJ5LnJlc3BvbnNlU3RhcnQgYXMgbnVtYmVyKSxcbiAgICBlbmRUaW1lc3RhbXA6IHRpbWVPcmlnaW4gKyBtc1RvU2VjKGVudHJ5LnJlc3BvbnNlRW5kIGFzIG51bWJlciksXG4gIH0pO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBzdGFydCBjaGlsZCBvbiB0cmFuc2FjdGlvbnMuIFRoaXMgZnVuY3Rpb24gd2lsbCBtYWtlIHN1cmUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2lsbFxuICogdXNlIHRoZSBzdGFydCB0aW1lc3RhbXAgb2YgdGhlIGNyZWF0ZWQgY2hpbGQgc3BhbiBpZiBpdCBpcyBlYXJsaWVyIHRoYW4gdGhlIHRyYW5zYWN0aW9ucyBhY3R1YWxcbiAqIHN0YXJ0IHRpbWVzdGFtcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9zdGFydENoaWxkKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbiwgeyBzdGFydFRpbWVzdGFtcCwgLi4uY3R4IH06IFNwYW5Db250ZXh0KTogU3BhbiB7XG4gIGlmIChzdGFydFRpbWVzdGFtcCAmJiB0cmFuc2FjdGlvbi5zdGFydFRpbWVzdGFtcCA+IHN0YXJ0VGltZXN0YW1wKSB7XG4gICAgdHJhbnNhY3Rpb24uc3RhcnRUaW1lc3RhbXAgPSBzdGFydFRpbWVzdGFtcDtcbiAgfVxuXG4gIHJldHVybiB0cmFuc2FjdGlvbi5zdGFydENoaWxkKHtcbiAgICBzdGFydFRpbWVzdGFtcCxcbiAgICAuLi5jdHgsXG4gIH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgbWVhc3VyZW1lbnQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzTWVhc3VyZW1lbnRWYWx1ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGlzRmluaXRlKHZhbHVlKTtcbn1cbiIsICJpbXBvcnQgeyBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBpc0luc3RhbmNlT2YsIGlzTWF0Y2hpbmdQYXR0ZXJuIH0gZnJvbSAnQHNlbnRyeS91dGlscyc7XG5cbmltcG9ydCB7IFNwYW4gfSBmcm9tICcuLi9zcGFuJztcbmltcG9ydCB7IFNwYW5TdGF0dXMgfSBmcm9tICcuLi9zcGFuc3RhdHVzJztcbmltcG9ydCB7IGdldEFjdGl2ZVRyYW5zYWN0aW9uLCBoYXNUcmFjaW5nRW5hYmxlZCB9IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVFJBQ0lOR19PUklHSU5TID0gWydsb2NhbGhvc3QnLCAvXlxcLy9dO1xuXG4vKiogT3B0aW9ucyBmb3IgUmVxdWVzdCBJbnN0cnVtZW50YXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogTGlzdCBvZiBzdHJpbmdzIC8gcmVnZXggd2hlcmUgdGhlIGludGVncmF0aW9uIHNob3VsZCBjcmVhdGUgU3BhbnMgb3V0IG9mLiBBZGRpdGlvbmFsbHkgdGhpcyB3aWxsIGJlIHVzZWRcbiAgICogdG8gZGVmaW5lIHdoaWNoIG91dGdvaW5nIHJlcXVlc3RzIHRoZSBgc2VudHJ5LXRyYWNlYCBoZWFkZXIgd2lsbCBiZSBhdHRhY2hlZCB0by5cbiAgICpcbiAgICogRGVmYXVsdDogWydsb2NhbGhvc3QnLCAvXlxcLy9dIHtAc2VlIERFRkFVTFRfVFJBQ0lOR19PUklHSU5TfVxuICAgKi9cbiAgdHJhY2luZ09yaWdpbnM6IEFycmF5PHN0cmluZyB8IFJlZ0V4cD47XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gZGlzYWJsZSBwYXRjaGluZyBhbGwgdG9nZXRoZXIgZm9yIGZldGNoIHJlcXVlc3RzLlxuICAgKlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICB0cmFjZUZldGNoOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIGRpc2FibGUgcGF0Y2hpbmcgYWxsIHRvZ2V0aGVyIGZvciB4aHIgcmVxdWVzdHMuXG4gICAqXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIHRyYWNlWEhSOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBjcmVhdGluZyBhIHNwYW4gZm9yIGEgcmVxdWVzdCB3aXRoIHRoZSBnaXZlbiB1cmwuXG4gICAqIFJldHVybiBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCBhIHNwYW4gZm9yIHRoZSBnaXZlbiB1cmwuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQgaXQgdXNlcyB0aGUgYHRyYWNpbmdPcmlnaW5zYCBvcHRpb25zIGFzIGEgdXJsIG1hdGNoLlxuICAgKi9cbiAgc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3Q/KHVybDogc3RyaW5nKTogYm9vbGVhbjtcbn1cblxuLyoqIERhdGEgcmV0dXJuZWQgZnJvbSBmZXRjaCBjYWxsYmFjayAqL1xuZXhwb3J0IGludGVyZmFjZSBGZXRjaERhdGEge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICBhcmdzOiBhbnlbXTsgLy8gdGhlIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIGZldGNoIGNhbGwgaXRzZWxmXG4gIGZldGNoRGF0YT86IHtcbiAgICBtZXRob2Q6IHN0cmluZztcbiAgICB1cmw6IHN0cmluZztcbiAgICAvLyBzcGFuX2lkXG4gICAgX19zcGFuPzogc3RyaW5nO1xuICB9O1xuXG4gIC8vIFRPRE8gU2hvdWxkIHRoaXMgYmUgdW5rbm93biBpbnN0ZWFkPyBJZiB3ZSB2ZW5kb3IgdHlwZXMsIG1ha2UgaXQgYSBSZXNwb25zZVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICByZXNwb25zZT86IGFueTtcbiAgZXJyb3I/OiB1bmtub3duO1xuXG4gIHN0YXJ0VGltZXN0YW1wOiBudW1iZXI7XG4gIGVuZFRpbWVzdGFtcD86IG51bWJlcjtcbn1cblxuLyoqIERhdGEgcmV0dXJuZWQgZnJvbSBYSFIgcmVxdWVzdCAqL1xuZXhwb3J0IGludGVyZmFjZSBYSFJEYXRhIHtcbiAgeGhyPzoge1xuICAgIF9fc2VudHJ5X3hocl9fPzoge1xuICAgICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgICB1cmw6IHN0cmluZztcbiAgICAgIHN0YXR1c19jb2RlOiBudW1iZXI7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICB9O1xuICAgIF9fc2VudHJ5X3hocl9zcGFuX2lkX18/OiBzdHJpbmc7XG4gICAgc2V0UmVxdWVzdEhlYWRlcj86IChrZXk6IHN0cmluZywgdmFsOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgX19zZW50cnlfb3duX3JlcXVlc3RfXz86IGJvb2xlYW47XG4gIH07XG4gIHN0YXJ0VGltZXN0YW1wOiBudW1iZXI7XG4gIGVuZFRpbWVzdGFtcD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9uczogUmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMgPSB7XG4gIHRyYWNlRmV0Y2g6IHRydWUsXG4gIHRyYWNlWEhSOiB0cnVlLFxuICB0cmFjaW5nT3JpZ2luczogREVGQVVMVF9UUkFDSU5HX09SSUdJTlMsXG59O1xuXG4vKiogUmVnaXN0ZXJzIHNwYW4gY3JlYXRvcnMgZm9yIHhociBhbmQgZmV0Y2ggcmVxdWVzdHMgICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMoX29wdGlvbnM/OiBQYXJ0aWFsPFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zPik6IHZvaWQge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gIGNvbnN0IHsgdHJhY2VGZXRjaCwgdHJhY2VYSFIsIHRyYWNpbmdPcmlnaW5zLCBzaG91bGRDcmVhdGVTcGFuRm9yUmVxdWVzdCB9ID0ge1xuICAgIC4uLmRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbiAgICAuLi5fb3B0aW9ucyxcbiAgfTtcblxuICAvLyBXZSBzaG91bGQgY2FjaGUgdXJsIC0+IGRlY2lzaW9uIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBjb21wdXRlXG4gIC8vIHJlZ2V4cCBldmVyeXRpbWUgd2UgY3JlYXRlIGEgcmVxdWVzdC5cbiAgY29uc3QgdXJsTWFwOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiA9IHt9O1xuXG4gIGNvbnN0IGRlZmF1bHRTaG91bGRDcmVhdGVTcGFuID0gKHVybDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHVybE1hcFt1cmxdKSB7XG4gICAgICByZXR1cm4gdXJsTWFwW3VybF07XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpbnMgPSB0cmFjaW5nT3JpZ2lucztcbiAgICB1cmxNYXBbdXJsXSA9XG4gICAgICBvcmlnaW5zLnNvbWUoKG9yaWdpbjogc3RyaW5nIHwgUmVnRXhwKSA9PiBpc01hdGNoaW5nUGF0dGVybih1cmwsIG9yaWdpbikpICYmXG4gICAgICAhaXNNYXRjaGluZ1BhdHRlcm4odXJsLCAnc2VudHJ5X2tleScpO1xuICAgIHJldHVybiB1cmxNYXBbdXJsXTtcbiAgfTtcblxuICAvLyBXZSB3YW50IHRoYXQgb3VyIHVzZXJzIGRvbid0IGhhdmUgdG8gcmUtaW1wbGVtZW50IHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0IHRoZW1zZWx2ZXNcbiAgLy8gVGhhdCdzIHdoeSB3ZSBmaWx0ZXIgb3V0IGFscmVhZHkgdW53YW50ZWQgU3BhbnMgZnJvbSB0cmFjaW5nT3JpZ2luc1xuICBsZXQgc2hvdWxkQ3JlYXRlU3BhbiA9IGRlZmF1bHRTaG91bGRDcmVhdGVTcGFuO1xuICBpZiAodHlwZW9mIHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgc2hvdWxkQ3JlYXRlU3BhbiA9ICh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIGRlZmF1bHRTaG91bGRDcmVhdGVTcGFuKHVybCkgJiYgc2hvdWxkQ3JlYXRlU3BhbkZvclJlcXVlc3QodXJsKTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3Qgc3BhbnM6IFJlY29yZDxzdHJpbmcsIFNwYW4+ID0ge307XG5cbiAgaWYgKHRyYWNlRmV0Y2gpIHtcbiAgICBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyKHtcbiAgICAgIGNhbGxiYWNrOiAoaGFuZGxlckRhdGE6IEZldGNoRGF0YSkgPT4ge1xuICAgICAgICBmZXRjaENhbGxiYWNrKGhhbmRsZXJEYXRhLCBzaG91bGRDcmVhdGVTcGFuLCBzcGFucyk7XG4gICAgICB9LFxuICAgICAgdHlwZTogJ2ZldGNoJyxcbiAgICB9KTtcbiAgfVxuXG4gIGlmICh0cmFjZVhIUikge1xuICAgIGFkZEluc3RydW1lbnRhdGlvbkhhbmRsZXIoe1xuICAgICAgY2FsbGJhY2s6IChoYW5kbGVyRGF0YTogWEhSRGF0YSkgPT4ge1xuICAgICAgICB4aHJDYWxsYmFjayhoYW5kbGVyRGF0YSwgc2hvdWxkQ3JlYXRlU3Bhbiwgc3BhbnMpO1xuICAgICAgfSxcbiAgICAgIHR5cGU6ICd4aHInLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCB0cmFjayBmZXRjaCByZXF1ZXN0IHNwYW5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaENhbGxiYWNrKFxuICBoYW5kbGVyRGF0YTogRmV0Y2hEYXRhLFxuICBzaG91bGRDcmVhdGVTcGFuOiAodXJsOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gIHNwYW5zOiBSZWNvcmQ8c3RyaW5nLCBTcGFuPixcbik6IHZvaWQge1xuICBpZiAoIWhhc1RyYWNpbmdFbmFibGVkKCkgfHwgIShoYW5kbGVyRGF0YS5mZXRjaERhdGEgJiYgc2hvdWxkQ3JlYXRlU3BhbihoYW5kbGVyRGF0YS5mZXRjaERhdGEudXJsKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGFuZGxlckRhdGEuZW5kVGltZXN0YW1wICYmIGhhbmRsZXJEYXRhLmZldGNoRGF0YS5fX3NwYW4pIHtcbiAgICBjb25zdCBzcGFuID0gc3BhbnNbaGFuZGxlckRhdGEuZmV0Y2hEYXRhLl9fc3Bhbl07XG4gICAgaWYgKHNwYW4pIHtcbiAgICAgIGlmIChoYW5kbGVyRGF0YS5yZXNwb25zZSkge1xuICAgICAgICAvLyBUT0RPIChrbWNsYikgcmVtb3ZlIHRoaXMgb25jZSB0eXBlcyBQUiBnb2VzIHRocm91Z2hcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBzcGFuLnNldEh0dHBTdGF0dXMoaGFuZGxlckRhdGEucmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlckRhdGEuZXJyb3IpIHtcbiAgICAgICAgc3Bhbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5JbnRlcm5hbEVycm9yKTtcbiAgICAgIH1cbiAgICAgIHNwYW4uZmluaXNoKCk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzcGFuc1toYW5kbGVyRGF0YS5mZXRjaERhdGEuX19zcGFuXTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCBzcGFuID0gYWN0aXZlVHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIC4uLmhhbmRsZXJEYXRhLmZldGNoRGF0YSxcbiAgICAgICAgdHlwZTogJ2ZldGNoJyxcbiAgICAgIH0sXG4gICAgICBkZXNjcmlwdGlvbjogYCR7aGFuZGxlckRhdGEuZmV0Y2hEYXRhLm1ldGhvZH0gJHtoYW5kbGVyRGF0YS5mZXRjaERhdGEudXJsfWAsXG4gICAgICBvcDogJ2h0dHAuY2xpZW50JyxcbiAgICB9KTtcblxuICAgIGhhbmRsZXJEYXRhLmZldGNoRGF0YS5fX3NwYW4gPSBzcGFuLnNwYW5JZDtcbiAgICBzcGFuc1tzcGFuLnNwYW5JZF0gPSBzcGFuO1xuXG4gICAgY29uc3QgcmVxdWVzdCA9IChoYW5kbGVyRGF0YS5hcmdzWzBdID0gaGFuZGxlckRhdGEuYXJnc1swXSBhcyBzdHJpbmcgfCBSZXF1ZXN0KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIGNvbnN0IG9wdGlvbnMgPSAoaGFuZGxlckRhdGEuYXJnc1sxXSA9IChoYW5kbGVyRGF0YS5hcmdzWzFdIGFzIHsgW2tleTogc3RyaW5nXTogYW55IH0pIHx8IHt9KTtcbiAgICBsZXQgaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVycztcbiAgICBpZiAoaXNJbnN0YW5jZU9mKHJlcXVlc3QsIFJlcXVlc3QpKSB7XG4gICAgICBoZWFkZXJzID0gKHJlcXVlc3QgYXMgUmVxdWVzdCkuaGVhZGVycztcbiAgICB9XG4gICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgIGlmICh0eXBlb2YgaGVhZGVycy5hcHBlbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBoZWFkZXJzLmFwcGVuZCgnc2VudHJ5LXRyYWNlJywgc3Bhbi50b1RyYWNlcGFyZW50KCkpO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGhlYWRlcnMpKSB7XG4gICAgICAgIGhlYWRlcnMgPSBbLi4uaGVhZGVycywgWydzZW50cnktdHJhY2UnLCBzcGFuLnRvVHJhY2VwYXJlbnQoKV1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaGVhZGVycyA9IHsgLi4uaGVhZGVycywgJ3NlbnRyeS10cmFjZSc6IHNwYW4udG9UcmFjZXBhcmVudCgpIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGhlYWRlcnMgPSB7ICdzZW50cnktdHJhY2UnOiBzcGFuLnRvVHJhY2VwYXJlbnQoKSB9O1xuICAgIH1cbiAgICBvcHRpb25zLmhlYWRlcnMgPSBoZWFkZXJzO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuZCB0cmFjayB4aHIgcmVxdWVzdCBzcGFuc1xuICovXG5leHBvcnQgZnVuY3Rpb24geGhyQ2FsbGJhY2soXG4gIGhhbmRsZXJEYXRhOiBYSFJEYXRhLFxuICBzaG91bGRDcmVhdGVTcGFuOiAodXJsOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gIHNwYW5zOiBSZWNvcmQ8c3RyaW5nLCBTcGFuPixcbik6IHZvaWQge1xuICBpZiAoXG4gICAgIWhhc1RyYWNpbmdFbmFibGVkKCkgfHxcbiAgICBoYW5kbGVyRGF0YS54aHI/Ll9fc2VudHJ5X293bl9yZXF1ZXN0X18gfHxcbiAgICAhKGhhbmRsZXJEYXRhLnhocj8uX19zZW50cnlfeGhyX18gJiYgc2hvdWxkQ3JlYXRlU3BhbihoYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX18udXJsKSlcbiAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeGhyID0gaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9fO1xuXG4gIC8vIGNoZWNrIGZpcnN0IGlmIHRoZSByZXF1ZXN0IGhhcyBmaW5pc2hlZCBhbmQgaXMgdHJhY2tlZCBieSBhbiBleGlzdGluZyBzcGFuIHdoaWNoIHNob3VsZCBub3cgZW5kXG4gIGlmIChoYW5kbGVyRGF0YS5lbmRUaW1lc3RhbXAgJiYgaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX18pIHtcbiAgICBjb25zdCBzcGFuID0gc3BhbnNbaGFuZGxlckRhdGEueGhyLl9fc2VudHJ5X3hocl9zcGFuX2lkX19dO1xuICAgIGlmIChzcGFuKSB7XG4gICAgICBzcGFuLnNldEh0dHBTdGF0dXMoeGhyLnN0YXR1c19jb2RlKTtcbiAgICAgIHNwYW4uZmluaXNoKCk7XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZHluYW1pYy1kZWxldGVcbiAgICAgIGRlbGV0ZSBzcGFuc1toYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX3NwYW5faWRfX107XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGlmIG5vdCwgY3JlYXRlIGEgbmV3IHNwYW4gdG8gdHJhY2sgaXRcbiAgY29uc3QgYWN0aXZlVHJhbnNhY3Rpb24gPSBnZXRBY3RpdmVUcmFuc2FjdGlvbigpO1xuICBpZiAoYWN0aXZlVHJhbnNhY3Rpb24pIHtcbiAgICBjb25zdCBzcGFuID0gYWN0aXZlVHJhbnNhY3Rpb24uc3RhcnRDaGlsZCh7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIC4uLnhoci5kYXRhLFxuICAgICAgICB0eXBlOiAneGhyJyxcbiAgICAgICAgbWV0aG9kOiB4aHIubWV0aG9kLFxuICAgICAgICB1cmw6IHhoci51cmwsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IGAke3hoci5tZXRob2R9ICR7eGhyLnVybH1gLFxuICAgICAgb3A6ICdodHRwLmNsaWVudCcsXG4gICAgfSk7XG5cbiAgICBoYW5kbGVyRGF0YS54aHIuX19zZW50cnlfeGhyX3NwYW5faWRfXyA9IHNwYW4uc3BhbklkO1xuICAgIHNwYW5zW2hhbmRsZXJEYXRhLnhoci5fX3NlbnRyeV94aHJfc3Bhbl9pZF9fXSA9IHNwYW47XG5cbiAgICBpZiAoaGFuZGxlckRhdGEueGhyLnNldFJlcXVlc3RIZWFkZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXJEYXRhLnhoci5zZXRSZXF1ZXN0SGVhZGVyKCdzZW50cnktdHJhY2UnLCBzcGFuLnRvVHJhY2VwYXJlbnQoKSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIC8vIEVycm9yOiBJbnZhbGlkU3RhdGVFcnJvcjogRmFpbGVkIHRvIGV4ZWN1dGUgJ3NldFJlcXVlc3RIZWFkZXInIG9uICdYTUxIdHRwUmVxdWVzdCc6IFRoZSBvYmplY3QncyBzdGF0ZSBtdXN0IGJlIE9QRU5FRC5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSAnQHNlbnRyeS90eXBlcyc7XG5pbXBvcnQgeyBhZGRJbnN0cnVtZW50YXRpb25IYW5kbGVyLCBnZXRHbG9iYWxPYmplY3QsIGxvZ2dlciB9IGZyb20gJ0BzZW50cnkvdXRpbHMnO1xuXG5jb25zdCBnbG9iYWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpO1xuXG4vKipcbiAqIERlZmF1bHQgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHBhZ2Vsb2FkIGFuZCBuYXZpZ2F0aW9uIHRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zdHJ1bWVudFJvdXRpbmdXaXRoRGVmYXVsdHM8VCBleHRlbmRzIFRyYW5zYWN0aW9uPihcbiAgY3VzdG9tU3RhcnRUcmFuc2FjdGlvbjogKGNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCxcbiAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQ6IGJvb2xlYW4gPSB0cnVlLFxuICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZTogYm9vbGVhbiA9IHRydWUsXG4pOiB2b2lkIHtcbiAgaWYgKCFnbG9iYWwgfHwgIWdsb2JhbC5sb2NhdGlvbikge1xuICAgIGxvZ2dlci53YXJuKCdDb3VsZCBub3QgaW5pdGlhbGl6ZSByb3V0aW5nIGluc3RydW1lbnRhdGlvbiBkdWUgdG8gaW52YWxpZCBsb2NhdGlvbicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBzdGFydGluZ1VybDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZ2xvYmFsLmxvY2F0aW9uLmhyZWY7XG5cbiAgbGV0IGFjdGl2ZVRyYW5zYWN0aW9uOiBUIHwgdW5kZWZpbmVkO1xuICBpZiAoc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQpIHtcbiAgICBhY3RpdmVUcmFuc2FjdGlvbiA9IGN1c3RvbVN0YXJ0VHJhbnNhY3Rpb24oeyBuYW1lOiBnbG9iYWwubG9jYXRpb24ucGF0aG5hbWUsIG9wOiAncGFnZWxvYWQnIH0pO1xuICB9XG5cbiAgaWYgKHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlKSB7XG4gICAgYWRkSW5zdHJ1bWVudGF0aW9uSGFuZGxlcih7XG4gICAgICBjYWxsYmFjazogKHsgdG8sIGZyb20gfTogeyB0bzogc3RyaW5nOyBmcm9tPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZWFybHkgcmV0dXJuIGlzIHRoZXJlIHRvIGFjY291bnQgZm9yIHNvbWUgY2FzZXMgd2hlcmUgYSBuYXZpZ2F0aW9uIHRyYW5zYWN0aW9uIHN0YXJ0cyByaWdodCBhZnRlclxuICAgICAgICAgKiBsb25nLXJ1bm5pbmcgcGFnZWxvYWQuIFdlIG1ha2Ugc3VyZSB0aGF0IGlmIGBmcm9tYCBpcyB1bmRlZmluZWQgYW5kIGEgdmFsaWQgYHN0YXJ0aW5nVVJMYCBleGlzdHMsIHdlIGRvbid0XG4gICAgICAgICAqIGNyZWF0ZSBhbiB1bmVjY2Vzc2FyeSBuYXZpZ2F0aW9uIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIHdhcyBoYXJkIHRvIGR1cGxpY2F0ZSwgYnV0IHRoaXMgYmVoYXZpb3Igc3RvcHBlZCBhcyBzb29uIGFzIHRoaXMgZml4IHdhcyBhcHBsaWVkLiBUaGlzIGlzc3VlIG1pZ2h0IGFsc29cbiAgICAgICAgICogb25seSBiZSBjYXVzZWQgaW4gY2VydGFpbiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIHVzYWdlIG9mIGEgaG90IG1vZHVsZSByZWxvYWRlciBpcyBjYXVzaW5nXG4gICAgICAgICAqIGVycm9ycy5cbiAgICAgICAgICovXG4gICAgICAgIGlmIChmcm9tID09PSB1bmRlZmluZWQgJiYgc3RhcnRpbmdVcmwgJiYgc3RhcnRpbmdVcmwuaW5kZXhPZih0bykgIT09IC0xKSB7XG4gICAgICAgICAgc3RhcnRpbmdVcmwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZyb20gIT09IHRvKSB7XG4gICAgICAgICAgc3RhcnRpbmdVcmwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGFjdGl2ZVRyYW5zYWN0aW9uKSB7XG4gICAgICAgICAgICBsb2dnZXIubG9nKGBbVHJhY2luZ10gRmluaXNoaW5nIGN1cnJlbnQgdHJhbnNhY3Rpb24gd2l0aCBvcDogJHthY3RpdmVUcmFuc2FjdGlvbi5vcH1gKTtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gb3BlbiB0cmFuc2FjdGlvbiBvbiB0aGUgc2NvcGUsIHdlIG5lZWQgdG8gZmluaXNoIGl0IGJlZm9yZSBjcmVhdGluZyBhbiBuZXcgb25lLlxuICAgICAgICAgICAgYWN0aXZlVHJhbnNhY3Rpb24uZmluaXNoKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uID0gY3VzdG9tU3RhcnRUcmFuc2FjdGlvbih7IG5hbWU6IGdsb2JhbC5sb2NhdGlvbi5wYXRobmFtZSwgb3A6ICduYXZpZ2F0aW9uJyB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHR5cGU6ICdoaXN0b3J5JyxcbiAgICB9KTtcbiAgfVxufVxuIiwgImltcG9ydCB7IEh1YiB9IGZyb20gJ0BzZW50cnkvaHViJztcbmltcG9ydCB7IEV2ZW50UHJvY2Vzc29yLCBJbnRlZ3JhdGlvbiwgVHJhbnNhY3Rpb24sIFRyYW5zYWN0aW9uQ29udGV4dCB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0R2xvYmFsT2JqZWN0LCBsb2dnZXIgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcblxuaW1wb3J0IHsgc3RhcnRJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9odWJleHRlbnNpb25zJztcbmltcG9ydCB7IERFRkFVTFRfSURMRV9USU1FT1VULCBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9pZGxldHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4uL3NwYW5zdGF0dXMnO1xuaW1wb3J0IHsgZXh0cmFjdFRyYWNlcGFyZW50RGF0YSwgc2VjVG9NcyB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IHJlZ2lzdGVyQmFja2dyb3VuZFRhYkRldGVjdGlvbiB9IGZyb20gJy4vYmFja2dyb3VuZHRhYic7XG5pbXBvcnQgeyBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uIH0gZnJvbSAnLi9tZXRyaWNzJztcbmltcG9ydCB7XG4gIGRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbiAgaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMsXG4gIFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLFxufSBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IHsgaW5zdHJ1bWVudFJvdXRpbmdXaXRoRGVmYXVsdHMgfSBmcm9tICcuL3JvdXRlcic7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9UUkFOU0FDVElPTl9EVVJBVElPTl9TRUNPTkRTID0gNjAwO1xuXG4vKiogT3B0aW9ucyBmb3IgQnJvd3NlciBUcmFjaW5nIGludGVncmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIEJyb3dzZXJUcmFjaW5nT3B0aW9ucyBleHRlbmRzIFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSB0aW1lIHRvIHdhaXQgaW4gbXMgdW50aWwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgYmUgZmluaXNoZWQuIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHVzZSB0aGUgZW5kIHRpbWVzdGFtcCBvZlxuICAgKiB0aGUgbGFzdCBmaW5pc2hlZCBzcGFuIGFzIHRoZSBlbmR0aW1lIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIFRpbWUgaXMgaW4gbXMuXG4gICAqXG4gICAqIERlZmF1bHQ6IDEwMDBcbiAgICovXG4gIGlkbGVUaW1lb3V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgY3JlYXRpb24gb2YgYG5hdmlnYXRpb25gIHRyYW5zYWN0aW9uIG9uIGhpc3RvcnkgY2hhbmdlcy5cbiAgICpcbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgc3RhcnRUcmFuc2FjdGlvbk9uTG9jYXRpb25DaGFuZ2U6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgY3JlYXRpb24gb2YgYHBhZ2Vsb2FkYCB0cmFuc2FjdGlvbiBvbiBmaXJzdCBwYWdlbG9hZC5cbiAgICpcbiAgICogRGVmYXVsdDogdHJ1ZVxuICAgKi9cbiAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIGR1cmF0aW9uIG9mIGEgdHJhbnNhY3Rpb24gYmVmb3JlIGl0IHdpbGwgYmUgbWFya2VkIGFzIFwiZGVhZGxpbmVfZXhjZWVkZWRcIi5cbiAgICogSWYgeW91IG5ldmVyIHdhbnQgdG8gbWFyayBhIHRyYW5zYWN0aW9uIHNldCBpdCB0byAwLlxuICAgKiBUaW1lIGlzIGluIHNlY29uZHMuXG4gICAqXG4gICAqIERlZmF1bHQ6IDYwMFxuICAgKi9cbiAgbWF4VHJhbnNhY3Rpb25EdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGbGFnIFRyYW5zYWN0aW9ucyB3aGVyZSB0YWJzIG1vdmVkIHRvIGJhY2tncm91bmQgd2l0aCBcImNhbmNlbGxlZFwiLiBCcm93c2VyIGJhY2tncm91bmQgdGFiIHRpbWluZyBpc1xuICAgKiBub3Qgc3VpdGVkIHRvd2FyZHMgZG9pbmcgcHJlY2lzZSBtZWFzdXJlbWVudHMgb2Ygb3BlcmF0aW9ucy4gQnkgZGVmYXVsdCwgd2UgcmVjb21tZW5kIHRoYXQgdGhpcyBvcHRpb25cbiAgICogYmUgZW5hYmxlZCBhcyBiYWNrZ3JvdW5kIHRyYW5zYWN0aW9ucyBjYW4gbWVzcyB1cCB5b3VyIHN0YXRpc3RpY3MgaW4gbm9uZGV0ZXJtaW5pc3RpYyB3YXlzLlxuICAgKlxuICAgKiBEZWZhdWx0OiB0cnVlXG4gICAqL1xuICBtYXJrQmFja2dyb3VuZFRyYW5zYWN0aW9uczogYm9vbGVhbjtcblxuICAvKipcbiAgICogX21ldHJpY09wdGlvbnMgYWxsb3dzIHRoZSB1c2VyIHRvIHNlbmQgb3B0aW9ucyB0byBjaGFuZ2UgaG93IG1ldHJpY3MgYXJlIGNvbGxlY3RlZC5cbiAgICpcbiAgICogX21ldHJpY09wdGlvbnMgaXMgY3VycmVudGx5IGV4cGVyaW1lbnRhbC5cbiAgICpcbiAgICogRGVmYXVsdDogdW5kZWZpbmVkXG4gICAqL1xuICBfbWV0cmljT3B0aW9ucz86IFBhcnRpYWw8eyBfcmVwb3J0QWxsQ2hhbmdlczogYm9vbGVhbiB9PjtcblxuICAvKipcbiAgICogYmVmb3JlTmF2aWdhdGUgaXMgY2FsbGVkIGJlZm9yZSBhIHBhZ2Vsb2FkL25hdmlnYXRpb24gdHJhbnNhY3Rpb24gaXMgY3JlYXRlZCBhbmQgYWxsb3dzIHVzZXJzIHRvIG1vZGlmeSB0cmFuc2FjdGlvblxuICAgKiBjb250ZXh0IGRhdGEsIG9yIGRyb3AgdGhlIHRyYW5zYWN0aW9uIGVudGlyZWx5IChieSBzZXR0aW5nIGBzYW1wbGVkID0gZmFsc2VgIGluIHRoZSBjb250ZXh0KS5cbiAgICpcbiAgICogTm90ZTogRm9yIGxlZ2FjeSByZWFzb25zLCB0cmFuc2FjdGlvbnMgY2FuIGFsc28gYmUgZHJvcHBlZCBieSByZXR1cm5pbmcgYHVuZGVmaW5lZGAuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0OiBUaGUgY29udGV4dCBkYXRhIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBzdGFydFRyYW5zYWN0aW9uYCBieSBkZWZhdWx0XG4gICAqXG4gICAqIEByZXR1cm5zIEEgKHBvdGVudGlhbGx5KSBtb2RpZmllZCBjb250ZXh0IG9iamVjdCwgd2l0aCBgc2FtcGxlZCA9IGZhbHNlYCBpZiB0aGUgdHJhbnNhY3Rpb24gc2hvdWxkIGJlIGRyb3BwZWQuXG4gICAqL1xuICBiZWZvcmVOYXZpZ2F0ZT8oY29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0KTogVHJhbnNhY3Rpb25Db250ZXh0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbnN0cnVtZW50YXRpb24gdGhhdCBjcmVhdGVzIHJvdXRpbmcgY2hhbmdlIHRyYW5zYWN0aW9ucy4gQnkgZGVmYXVsdCBjcmVhdGVzXG4gICAqIHBhZ2Vsb2FkIGFuZCBuYXZpZ2F0aW9uIHRyYW5zYWN0aW9ucy5cbiAgICovXG4gIHJvdXRpbmdJbnN0cnVtZW50YXRpb248VCBleHRlbmRzIFRyYW5zYWN0aW9uPihcbiAgICBjdXN0b21TdGFydFRyYW5zYWN0aW9uOiAoY29udGV4dDogVHJhbnNhY3Rpb25Db250ZXh0KSA9PiBUIHwgdW5kZWZpbmVkLFxuICAgIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkPzogYm9vbGVhbixcbiAgICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZT86IGJvb2xlYW4sXG4gICk6IHZvaWQ7XG59XG5cbmNvbnN0IERFRkFVTFRfQlJPV1NFUl9UUkFDSU5HX09QVElPTlMgPSB7XG4gIGlkbGVUaW1lb3V0OiBERUZBVUxUX0lETEVfVElNRU9VVCxcbiAgbWFya0JhY2tncm91bmRUcmFuc2FjdGlvbnM6IHRydWUsXG4gIG1heFRyYW5zYWN0aW9uRHVyYXRpb246IERFRkFVTFRfTUFYX1RSQU5TQUNUSU9OX0RVUkFUSU9OX1NFQ09ORFMsXG4gIHJvdXRpbmdJbnN0cnVtZW50YXRpb246IGluc3RydW1lbnRSb3V0aW5nV2l0aERlZmF1bHRzLFxuICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZTogdHJ1ZSxcbiAgc3RhcnRUcmFuc2FjdGlvbk9uUGFnZUxvYWQ6IHRydWUsXG4gIC4uLmRlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbn07XG5cbi8qKlxuICogVGhlIEJyb3dzZXIgVHJhY2luZyBpbnRlZ3JhdGlvbiBhdXRvbWF0aWNhbGx5IGluc3RydW1lbnRzIGJyb3dzZXIgcGFnZWxvYWQvbmF2aWdhdGlvblxuICogYWN0aW9ucyBhcyB0cmFuc2FjdGlvbnMsIGFuZCBjYXB0dXJlcyByZXF1ZXN0cywgbWV0cmljcyBhbmQgZXJyb3JzIGFzIHNwYW5zLlxuICpcbiAqIFRoZSBpbnRlZ3JhdGlvbiBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGEgdmFyaWV0eSBvZiBvcHRpb25zLCBhbmQgY2FuIGJlIGV4dGVuZGVkIHRvIHVzZVxuICogYW55IHJvdXRpbmcgbGlicmFyeS4gVGhpcyBpbnRlZ3JhdGlvbiB1c2VzIHtAc2VlIElkbGVUcmFuc2FjdGlvbn0gdG8gY3JlYXRlIHRyYW5zYWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyb3dzZXJUcmFjaW5nIGltcGxlbWVudHMgSW50ZWdyYXRpb24ge1xuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgaWQ6IHN0cmluZyA9ICdCcm93c2VyVHJhY2luZyc7XG5cbiAgLyoqIEJyb3dzZXIgVHJhY2luZyBpbnRlZ3JhdGlvbiBvcHRpb25zICovXG4gIHB1YmxpYyBvcHRpb25zOiBCcm93c2VyVHJhY2luZ09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBwdWJsaWMgbmFtZTogc3RyaW5nID0gQnJvd3NlclRyYWNpbmcuaWQ7XG5cbiAgcHJpdmF0ZSBfZ2V0Q3VycmVudEh1Yj86ICgpID0+IEh1YjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9tZXRyaWNzOiBNZXRyaWNzSW5zdHJ1bWVudGF0aW9uO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VtaXRPcHRpb25zV2FybmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBTdG9yZSBjb25maWd1cmVkIGlkbGUgdGltZW91dCBzbyB0aGF0IGl0IGNhbiBiZSBhZGRlZCBhcyBhIHRhZyB0byB0cmFuc2FjdGlvbnMgKi9cbiAgcHJpdmF0ZSBfY29uZmlndXJlZElkbGVUaW1lb3V0OiBCcm93c2VyVHJhY2luZ09wdGlvbnNbJ2lkbGVUaW1lb3V0J10gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKF9vcHRpb25zPzogUGFydGlhbDxCcm93c2VyVHJhY2luZ09wdGlvbnM+KSB7XG4gICAgbGV0IHRyYWNpbmdPcmlnaW5zID0gZGVmYXVsdFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLnRyYWNpbmdPcmlnaW5zO1xuICAgIC8vIE5PVEU6IExvZ2dlciBkb2Vzbid0IHdvcmsgaW4gY29uc3RydWN0b3JzLCBhcyBpdCdzIGluaXRpYWxpemVkIGFmdGVyIGludGVncmF0aW9ucyBpbnN0YW5jZXNcbiAgICBpZiAoX29wdGlvbnMpIHtcbiAgICAgIHRoaXMuX2NvbmZpZ3VyZWRJZGxlVGltZW91dCA9IF9vcHRpb25zLmlkbGVUaW1lb3V0O1xuICAgICAgaWYgKF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zICYmIEFycmF5LmlzQXJyYXkoX29wdGlvbnMudHJhY2luZ09yaWdpbnMpICYmIF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICB0cmFjaW5nT3JpZ2lucyA9IF9vcHRpb25zLnRyYWNpbmdPcmlnaW5zO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZW1pdE9wdGlvbnNXYXJuaW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0JST1dTRVJfVFJBQ0lOR19PUFRJT05TLFxuICAgICAgLi4uX29wdGlvbnMsXG4gICAgICB0cmFjaW5nT3JpZ2lucyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBfbWV0cmljT3B0aW9ucyB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMuX21ldHJpY3MgPSBuZXcgTWV0cmljc0luc3RydW1lbnRhdGlvbihfbWV0cmljT3B0aW9ucyAmJiBfbWV0cmljT3B0aW9ucy5fcmVwb3J0QWxsQ2hhbmdlcyk7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHB1YmxpYyBzZXR1cE9uY2UoXzogKGNhbGxiYWNrOiBFdmVudFByb2Nlc3NvcikgPT4gdm9pZCwgZ2V0Q3VycmVudEh1YjogKCkgPT4gSHViKTogdm9pZCB7XG4gICAgdGhpcy5fZ2V0Q3VycmVudEh1YiA9IGdldEN1cnJlbnRIdWI7XG5cbiAgICBpZiAodGhpcy5fZW1pdE9wdGlvbnNXYXJuaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgJ1tUcmFjaW5nXSBZb3UgbmVlZCB0byBkZWZpbmUgYHRyYWNpbmdPcmlnaW5zYCBpbiB0aGUgb3B0aW9ucy4gU2V0IGFuIGFycmF5IG9mIHVybHMgb3IgcGF0dGVybnMgdG8gdHJhY2UuJyxcbiAgICAgICk7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtUcmFjaW5nXSBXZSBhZGRlZCBhIHJlYXNvbmFibGUgZGVmYXVsdCBmb3IgeW91OiAke2RlZmF1bHRSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucy50cmFjaW5nT3JpZ2luc31gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3Qge1xuICAgICAgcm91dGluZ0luc3RydW1lbnRhdGlvbjogaW5zdHJ1bWVudFJvdXRpbmcsXG4gICAgICBzdGFydFRyYW5zYWN0aW9uT25Mb2NhdGlvbkNoYW5nZSxcbiAgICAgIHN0YXJ0VHJhbnNhY3Rpb25PblBhZ2VMb2FkLFxuICAgICAgbWFya0JhY2tncm91bmRUcmFuc2FjdGlvbnMsXG4gICAgICB0cmFjZUZldGNoLFxuICAgICAgdHJhY2VYSFIsXG4gICAgICB0cmFjaW5nT3JpZ2lucyxcbiAgICAgIHNob3VsZENyZWF0ZVNwYW5Gb3JSZXF1ZXN0LFxuICAgIH0gPSB0aGlzLm9wdGlvbnM7XG5cbiAgICBpbnN0cnVtZW50Um91dGluZyhcbiAgICAgIChjb250ZXh0OiBUcmFuc2FjdGlvbkNvbnRleHQpID0+IHRoaXMuX2NyZWF0ZVJvdXRlVHJhbnNhY3Rpb24oY29udGV4dCksXG4gICAgICBzdGFydFRyYW5zYWN0aW9uT25QYWdlTG9hZCxcbiAgICAgIHN0YXJ0VHJhbnNhY3Rpb25PbkxvY2F0aW9uQ2hhbmdlLFxuICAgICk7XG5cbiAgICBpZiAobWFya0JhY2tncm91bmRUcmFuc2FjdGlvbnMpIHtcbiAgICAgIHJlZ2lzdGVyQmFja2dyb3VuZFRhYkRldGVjdGlvbigpO1xuICAgIH1cblxuICAgIGluc3RydW1lbnRPdXRnb2luZ1JlcXVlc3RzKHsgdHJhY2VGZXRjaCwgdHJhY2VYSFIsIHRyYWNpbmdPcmlnaW5zLCBzaG91bGRDcmVhdGVTcGFuRm9yUmVxdWVzdCB9KTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgcm91dGluZyBpZGxlIHRyYW5zYWN0aW9uLiAqL1xuICBwcml2YXRlIF9jcmVhdGVSb3V0ZVRyYW5zYWN0aW9uKGNvbnRleHQ6IFRyYW5zYWN0aW9uQ29udGV4dCk6IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMuX2dldEN1cnJlbnRIdWIpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBbVHJhY2luZ10gRGlkIG5vdCBjcmVhdGUgJHtjb250ZXh0Lm9wfSB0cmFuc2FjdGlvbiBiZWNhdXNlIF9nZXRDdXJyZW50SHViIGlzIGludmFsaWQuYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RcbiAgICBjb25zdCB7IGJlZm9yZU5hdmlnYXRlLCBpZGxlVGltZW91dCwgbWF4VHJhbnNhY3Rpb25EdXJhdGlvbiB9ID0gdGhpcy5vcHRpb25zO1xuXG4gICAgY29uc3QgcGFyZW50Q29udGV4dEZyb21IZWFkZXIgPSBjb250ZXh0Lm9wID09PSAncGFnZWxvYWQnID8gZ2V0SGVhZGVyQ29udGV4dCgpIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgZXhwYW5kZWRDb250ZXh0ID0ge1xuICAgICAgLi4uY29udGV4dCxcbiAgICAgIC4uLnBhcmVudENvbnRleHRGcm9tSGVhZGVyLFxuICAgICAgdHJpbUVuZDogdHJ1ZSxcbiAgICB9O1xuICAgIGNvbnN0IG1vZGlmaWVkQ29udGV4dCA9IHR5cGVvZiBiZWZvcmVOYXZpZ2F0ZSA9PT0gJ2Z1bmN0aW9uJyA/IGJlZm9yZU5hdmlnYXRlKGV4cGFuZGVkQ29udGV4dCkgOiBleHBhbmRlZENvbnRleHQ7XG5cbiAgICAvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29ucywgYmVmb3JlTmF2aWdhdGUgY2FuIHJldHVybiB1bmRlZmluZWQgdG8gXCJkcm9wXCIgdGhlIHRyYW5zYWN0aW9uIChwcmV2ZW50IGl0XG4gICAgLy8gZnJvbSBiZWluZyBzZW50IHRvIFNlbnRyeSkuXG4gICAgY29uc3QgZmluYWxDb250ZXh0ID0gbW9kaWZpZWRDb250ZXh0ID09PSB1bmRlZmluZWQgPyB7IC4uLmV4cGFuZGVkQ29udGV4dCwgc2FtcGxlZDogZmFsc2UgfSA6IG1vZGlmaWVkQ29udGV4dDtcblxuICAgIGlmIChmaW5hbENvbnRleHQuc2FtcGxlZCA9PT0gZmFsc2UpIHtcbiAgICAgIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBXaWxsIG5vdCBzZW5kICR7ZmluYWxDb250ZXh0Lm9wfSB0cmFuc2FjdGlvbiBiZWNhdXNlIG9mIGJlZm9yZU5hdmlnYXRlLmApO1xuICAgIH1cblxuICAgIGxvZ2dlci5sb2coYFtUcmFjaW5nXSBTdGFydGluZyAke2ZpbmFsQ29udGV4dC5vcH0gdHJhbnNhY3Rpb24gb24gc2NvcGVgKTtcblxuICAgIGNvbnN0IGh1YiA9IHRoaXMuX2dldEN1cnJlbnRIdWIoKTtcbiAgICBjb25zdCB7IGxvY2F0aW9uIH0gPSBnZXRHbG9iYWxPYmplY3QoKSBhcyBXaW5kb3dPcldvcmtlckdsb2JhbFNjb3BlICYgeyBsb2NhdGlvbjogTG9jYXRpb24gfTtcblxuICAgIGNvbnN0IGlkbGVUcmFuc2FjdGlvbiA9IHN0YXJ0SWRsZVRyYW5zYWN0aW9uKFxuICAgICAgaHViLFxuICAgICAgZmluYWxDb250ZXh0LFxuICAgICAgaWRsZVRpbWVvdXQsXG4gICAgICB0cnVlLFxuICAgICAgeyBsb2NhdGlvbiB9LCAvLyBmb3IgdXNlIGluIHRoZSB0cmFjZXNTYW1wbGVyXG4gICAgKTtcbiAgICBpZGxlVHJhbnNhY3Rpb24ucmVnaXN0ZXJCZWZvcmVGaW5pc2hDYWxsYmFjaygodHJhbnNhY3Rpb24sIGVuZFRpbWVzdGFtcCkgPT4ge1xuICAgICAgdGhpcy5fbWV0cmljcy5hZGRQZXJmb3JtYW5jZUVudHJpZXModHJhbnNhY3Rpb24pO1xuICAgICAgYWRqdXN0VHJhbnNhY3Rpb25EdXJhdGlvbihzZWNUb01zKG1heFRyYW5zYWN0aW9uRHVyYXRpb24pLCB0cmFuc2FjdGlvbiwgZW5kVGltZXN0YW1wKTtcbiAgICB9KTtcblxuICAgIGlkbGVUcmFuc2FjdGlvbi5zZXRUYWcoJ2lkbGVUaW1lb3V0JywgdGhpcy5fY29uZmlndXJlZElkbGVUaW1lb3V0KTtcblxuICAgIHJldHVybiBpZGxlVHJhbnNhY3Rpb24gYXMgVHJhbnNhY3Rpb247XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRyYW5zYWN0aW9uIGNvbnRleHQgZnJvbSBhIHNlbnRyeS10cmFjZSBtZXRhLlxuICpcbiAqIEByZXR1cm5zIFRyYW5zYWN0aW9uIGNvbnRleHQgZGF0YSBmcm9tIHRoZSBoZWFkZXIgb3IgdW5kZWZpbmVkIGlmIHRoZXJlJ3Mgbm8gaGVhZGVyIG9yIHRoZSBoZWFkZXIgaXMgbWFsZm9ybWVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIZWFkZXJDb250ZXh0KCk6IFBhcnRpYWw8VHJhbnNhY3Rpb25Db250ZXh0PiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGhlYWRlciA9IGdldE1ldGFDb250ZW50KCdzZW50cnktdHJhY2UnKTtcbiAgaWYgKGhlYWRlcikge1xuICAgIHJldHVybiBleHRyYWN0VHJhY2VwYXJlbnREYXRhKGhlYWRlcik7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBtZXRhIHRhZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGFDb250ZW50KG1ldGFOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgZWwgPSBnZXRHbG9iYWxPYmplY3Q8V2luZG93PigpLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYG1ldGFbbmFtZT0ke21ldGFOYW1lfV1gKTtcbiAgcmV0dXJuIGVsID8gZWwuZ2V0QXR0cmlidXRlKCdjb250ZW50JykgOiBudWxsO1xufVxuXG4vKiogQWRqdXN0cyB0cmFuc2FjdGlvbiB2YWx1ZSBiYXNlZCBvbiBtYXggdHJhbnNhY3Rpb24gZHVyYXRpb24gKi9cbmZ1bmN0aW9uIGFkanVzdFRyYW5zYWN0aW9uRHVyYXRpb24obWF4RHVyYXRpb246IG51bWJlciwgdHJhbnNhY3Rpb246IElkbGVUcmFuc2FjdGlvbiwgZW5kVGltZXN0YW1wOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgZGlmZiA9IGVuZFRpbWVzdGFtcCAtIHRyYW5zYWN0aW9uLnN0YXJ0VGltZXN0YW1wO1xuICBjb25zdCBpc091dGRhdGVkVHJhbnNhY3Rpb24gPSBlbmRUaW1lc3RhbXAgJiYgKGRpZmYgPiBtYXhEdXJhdGlvbiB8fCBkaWZmIDwgMCk7XG4gIGlmIChpc091dGRhdGVkVHJhbnNhY3Rpb24pIHtcbiAgICB0cmFuc2FjdGlvbi5zZXRTdGF0dXMoU3BhblN0YXR1cy5EZWFkbGluZUV4Y2VlZGVkKTtcbiAgICB0cmFuc2FjdGlvbi5zZXRUYWcoJ21heFRyYW5zYWN0aW9uRHVyYXRpb25FeGNlZWRlZCcsICd0cnVlJyk7XG4gIH1cbn1cbiIsICJleHBvcnQgeyBCcm93c2VyVHJhY2luZyB9IGZyb20gJy4vYnJvd3NlcnRyYWNpbmcnO1xuZXhwb3J0IHtcbiAgaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMsXG4gIFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLFxuICBkZWZhdWx0UmVxdWVzdEluc3RydW1lbnRhdGlvbk9wdGlvbnMsXG59IGZyb20gJy4vcmVxdWVzdCc7XG4iLCAiZXhwb3J0IHsgRXhwcmVzcyB9IGZyb20gJy4vbm9kZS9leHByZXNzJztcbmV4cG9ydCB7IFBvc3RncmVzIH0gZnJvbSAnLi9ub2RlL3Bvc3RncmVzJztcbmV4cG9ydCB7IE15c3FsIH0gZnJvbSAnLi9ub2RlL215c3FsJztcbmV4cG9ydCB7IE1vbmdvIH0gZnJvbSAnLi9ub2RlL21vbmdvJztcblxuLy8gVE9ETyh2Nyk6IFJlbW92ZSB0aGlzIGV4cG9ydFxuLy8gUGxlYXNlIHNlZSBgc3JjL2luZGV4LnRzYCBmb3IgbW9yZSBkZXRhaWxzLlxuZXhwb3J0IHsgQnJvd3NlclRyYWNpbmcgfSBmcm9tICcuLi9icm93c2VyJztcbiIsICJpbXBvcnQgeyBhZGRFeHRlbnNpb25NZXRob2RzIH0gZnJvbSAnLi9odWJleHRlbnNpb25zJztcbmltcG9ydCAqIGFzIEludGVncmF0aW9ucyBmcm9tICcuL2ludGVncmF0aW9ucyc7XG5cbmV4cG9ydCB7IEludGVncmF0aW9ucyB9O1xuXG4vLyBUaGlzIGlzIGFscmVhZHkgZXhwb3J0ZWQgYXMgcGFydCBvZiBgSW50ZWdyYXRpb25zYCBhYm92ZSAoYW5kIGZvciB0aGUgbW9tZW50IHdpbGwgcmVtYWluIHNvIGZvclxuLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkpLCBidXQgdGhhdCBpbnRlcmZlcmVzIHdpdGggdHJlZXNoYWtpbmcsIHNvIHdlIGFsc28gZXhwb3J0IGl0IHNlcGFyYXRlbHlcbi8vIGhlcmUuXG4vL1xuLy8gUHJldmlvdXNseSB3ZSBleHBlY3RlZCB1c2VycyB0byBpbXBvcnQgdHJhY2luZyBpbnRlZ3JhdGlvbnMgbGlrZVxuLy9cbi8vIGltcG9ydCB7IEludGVncmF0aW9ucyB9IGZyb20gJ0BzZW50cnkvdHJhY2luZyc7XG4vLyBjb25zdCBpbnN0YW5jZSA9IG5ldyBJbnRlZ3JhdGlvbnMuQnJvd3NlclRyYWNpbmcoKTtcbi8vXG4vLyBUaGlzIG1ha2VzIHRoZSBpbnRlZ3JhdGlvbnMgdW5hYmxlIHRvIGJlIHRyZWVzaGFrZW4gdGhvdWdoLiBUbyBhZGRyZXNzIHRoaXMsIHdlIG5vdyBoYXZlXG4vLyB0aGlzIGluZGl2aWR1YWwgZXhwb3J0LiBXZSBub3cgZXhwZWN0IHVzZXJzIHRvIGNvbnN1bWUgQnJvd3NlclRyYWNpbmcgbGlrZSBzbzpcbi8vXG4vLyBpbXBvcnQgeyBCcm93c2VyVHJhY2luZyB9IGZyb20gJ0BzZW50cnkvdHJhY2luZyc7XG4vLyBjb25zdCBpbnN0YW5jZSA9IG5ldyBCcm93c2VyVHJhY2luZygpO1xuLy9cbi8vIEZvciBhbiBleGFtcGxlIG9mIG9mIHRoZSBuZXcgdXNhZ2Ugb2YgQnJvd3NlclRyYWNpbmcsIHNlZSBAc2VudHJ5L25leHRqcyBpbmRleC5jbGllbnQudHNcbmV4cG9ydCB7IEJyb3dzZXJUcmFjaW5nIH0gZnJvbSAnLi9icm93c2VyJztcblxuZXhwb3J0IHsgU3BhbiB9IGZyb20gJy4vc3Bhbic7XG5leHBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuZXhwb3J0IHtcbiAgLy8gVE9ETyBkZXByZWNhdGUgb2xkIG5hbWUgaW4gdjdcbiAgaW5zdHJ1bWVudE91dGdvaW5nUmVxdWVzdHMgYXMgcmVnaXN0ZXJSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uLFxuICBSZXF1ZXN0SW5zdHJ1bWVudGF0aW9uT3B0aW9ucyxcbiAgZGVmYXVsdFJlcXVlc3RJbnN0cnVtZW50YXRpb25PcHRpb25zLFxufSBmcm9tICcuL2Jyb3dzZXInO1xuZXhwb3J0IHsgU3BhblN0YXR1cyB9IGZyb20gJy4vc3BhbnN0YXR1cyc7XG5leHBvcnQgeyBJZGxlVHJhbnNhY3Rpb24gfSBmcm9tICcuL2lkbGV0cmFuc2FjdGlvbic7XG5leHBvcnQgeyBzdGFydElkbGVUcmFuc2FjdGlvbiB9IGZyb20gJy4vaHViZXh0ZW5zaW9ucyc7XG5cbi8vIFdlIGFyZSBwYXRjaGluZyB0aGUgZ2xvYmFsIG9iamVjdCB3aXRoIG91ciBodWIgZXh0ZW5zaW9uIG1ldGhvZHNcbmFkZEV4dGVuc2lvbk1ldGhvZHMoKTtcblxuZXhwb3J0IHsgYWRkRXh0ZW5zaW9uTWV0aG9kcyB9O1xuXG5leHBvcnQge1xuICBleHRyYWN0VHJhY2VwYXJlbnREYXRhLFxuICBnZXRBY3RpdmVUcmFuc2FjdGlvbixcbiAgaGFzVHJhY2luZ0VuYWJsZWQsXG4gIHN0cmlwVXJsUXVlcnlBbmRGcmFnbWVudCxcbiAgVFJBQ0VQQVJFTlRfUkVHRVhQLFxufSBmcm9tICcuL3V0aWxzJztcbiIsICIvKiFcbiAqIGNvb2tpZVxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxNCBSb21hbiBTaHR5bG1hblxuICogQ29weXJpZ2h0KGMpIDIwMTUgRG91Z2xhcyBDaHJpc3RvcGhlciBXaWxzb25cbiAqIE1JVCBMaWNlbnNlZFxuICovXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBNb2R1bGUgZXhwb3J0cy5cbiAqIEBwdWJsaWNcbiAqL1xuXG5leHBvcnRzLnBhcnNlID0gcGFyc2U7XG5leHBvcnRzLnNlcmlhbGl6ZSA9IHNlcmlhbGl6ZTtcblxuLyoqXG4gKiBNb2R1bGUgdmFyaWFibGVzLlxuICogQHByaXZhdGVcbiAqL1xuXG52YXIgZGVjb2RlID0gZGVjb2RlVVJJQ29tcG9uZW50O1xudmFyIGVuY29kZSA9IGVuY29kZVVSSUNvbXBvbmVudDtcbnZhciBwYWlyU3BsaXRSZWdFeHAgPSAvOyAqLztcblxuLyoqXG4gKiBSZWdFeHAgdG8gbWF0Y2ggZmllbGQtY29udGVudCBpbiBSRkMgNzIzMCBzZWMgMy4yXG4gKlxuICogZmllbGQtY29udGVudCA9IGZpZWxkLXZjaGFyIFsgMSooIFNQIC8gSFRBQiApIGZpZWxkLXZjaGFyIF1cbiAqIGZpZWxkLXZjaGFyICAgPSBWQ0hBUiAvIG9icy10ZXh0XG4gKiBvYnMtdGV4dCAgICAgID0gJXg4MC1GRlxuICovXG5cbnZhciBmaWVsZENvbnRlbnRSZWdFeHAgPSAvXltcXHUwMDA5XFx1MDAyMC1cXHUwMDdlXFx1MDA4MC1cXHUwMGZmXSskLztcblxuLyoqXG4gKiBQYXJzZSBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogUGFyc2UgdGhlIGdpdmVuIGNvb2tpZSBoZWFkZXIgc3RyaW5nIGludG8gYW4gb2JqZWN0XG4gKiBUaGUgb2JqZWN0IGhhcyB0aGUgdmFyaW91cyBjb29raWVzIGFzIGtleXMobmFtZXMpID0+IHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge29iamVjdH1cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBwYXJzZShzdHIsIG9wdGlvbnMpIHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgc3RyIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIHZhciBvYmogPSB7fVxuICB2YXIgb3B0ID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIHBhaXJzID0gc3RyLnNwbGl0KHBhaXJTcGxpdFJlZ0V4cCk7XG4gIHZhciBkZWMgPSBvcHQuZGVjb2RlIHx8IGRlY29kZTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHBhaXIgPSBwYWlyc1tpXTtcbiAgICB2YXIgZXFfaWR4ID0gcGFpci5pbmRleE9mKCc9Jyk7XG5cbiAgICAvLyBza2lwIHRoaW5ncyB0aGF0IGRvbid0IGxvb2sgbGlrZSBrZXk9dmFsdWVcbiAgICBpZiAoZXFfaWR4IDwgMCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGtleSA9IHBhaXIuc3Vic3RyKDAsIGVxX2lkeCkudHJpbSgpXG4gICAgdmFyIHZhbCA9IHBhaXIuc3Vic3RyKCsrZXFfaWR4LCBwYWlyLmxlbmd0aCkudHJpbSgpO1xuXG4gICAgLy8gcXVvdGVkIHZhbHVlc1xuICAgIGlmICgnXCInID09IHZhbFswXSkge1xuICAgICAgdmFsID0gdmFsLnNsaWNlKDEsIC0xKTtcbiAgICB9XG5cbiAgICAvLyBvbmx5IGFzc2lnbiBvbmNlXG4gICAgaWYgKHVuZGVmaW5lZCA9PSBvYmpba2V5XSkge1xuICAgICAgb2JqW2tleV0gPSB0cnlEZWNvZGUodmFsLCBkZWMpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGRhdGEgaW50byBhIGNvb2tpZSBoZWFkZXIuXG4gKlxuICogU2VyaWFsaXplIHRoZSBhIG5hbWUgdmFsdWUgcGFpciBpbnRvIGEgY29va2llIHN0cmluZyBzdWl0YWJsZSBmb3JcbiAqIGh0dHAgaGVhZGVycy4gQW4gb3B0aW9uYWwgb3B0aW9ucyBvYmplY3Qgc3BlY2lmaWVkIGNvb2tpZSBwYXJhbWV0ZXJzLlxuICpcbiAqIHNlcmlhbGl6ZSgnZm9vJywgJ2JhcicsIHsgaHR0cE9ubHk6IHRydWUgfSlcbiAqICAgPT4gXCJmb289YmFyOyBodHRwT25seVwiXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWxcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqIEBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBzZXJpYWxpemUobmFtZSwgdmFsLCBvcHRpb25zKSB7XG4gIHZhciBvcHQgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgZW5jID0gb3B0LmVuY29kZSB8fCBlbmNvZGU7XG5cbiAgaWYgKHR5cGVvZiBlbmMgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gZW5jb2RlIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3QobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBuYW1lIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciB2YWx1ZSA9IGVuYyh2YWwpO1xuXG4gIGlmICh2YWx1ZSAmJiAhZmllbGRDb250ZW50UmVnRXhwLnRlc3QodmFsdWUpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgdmFsIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHZhciBzdHIgPSBuYW1lICsgJz0nICsgdmFsdWU7XG5cbiAgaWYgKG51bGwgIT0gb3B0Lm1heEFnZSkge1xuICAgIHZhciBtYXhBZ2UgPSBvcHQubWF4QWdlIC0gMDtcblxuICAgIGlmIChpc05hTihtYXhBZ2UpIHx8ICFpc0Zpbml0ZShtYXhBZ2UpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gbWF4QWdlIGlzIGludmFsaWQnKVxuICAgIH1cblxuICAgIHN0ciArPSAnOyBNYXgtQWdlPScgKyBNYXRoLmZsb29yKG1heEFnZSk7XG4gIH1cblxuICBpZiAob3B0LmRvbWFpbikge1xuICAgIGlmICghZmllbGRDb250ZW50UmVnRXhwLnRlc3Qob3B0LmRvbWFpbikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBkb21haW4gaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBEb21haW49JyArIG9wdC5kb21haW47XG4gIH1cblxuICBpZiAob3B0LnBhdGgpIHtcbiAgICBpZiAoIWZpZWxkQ29udGVudFJlZ0V4cC50ZXN0KG9wdC5wYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uIHBhdGggaXMgaW52YWxpZCcpO1xuICAgIH1cblxuICAgIHN0ciArPSAnOyBQYXRoPScgKyBvcHQucGF0aDtcbiAgfVxuXG4gIGlmIChvcHQuZXhwaXJlcykge1xuICAgIGlmICh0eXBlb2Ygb3B0LmV4cGlyZXMudG9VVENTdHJpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ29wdGlvbiBleHBpcmVzIGlzIGludmFsaWQnKTtcbiAgICB9XG5cbiAgICBzdHIgKz0gJzsgRXhwaXJlcz0nICsgb3B0LmV4cGlyZXMudG9VVENTdHJpbmcoKTtcbiAgfVxuXG4gIGlmIChvcHQuaHR0cE9ubHkpIHtcbiAgICBzdHIgKz0gJzsgSHR0cE9ubHknO1xuICB9XG5cbiAgaWYgKG9wdC5zZWN1cmUpIHtcbiAgICBzdHIgKz0gJzsgU2VjdXJlJztcbiAgfVxuXG4gIGlmIChvcHQuc2FtZVNpdGUpIHtcbiAgICB2YXIgc2FtZVNpdGUgPSB0eXBlb2Ygb3B0LnNhbWVTaXRlID09PSAnc3RyaW5nJ1xuICAgICAgPyBvcHQuc2FtZVNpdGUudG9Mb3dlckNhc2UoKSA6IG9wdC5zYW1lU2l0ZTtcblxuICAgIHN3aXRjaCAoc2FtZVNpdGUpIHtcbiAgICAgIGNhc2UgdHJ1ZTpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbGF4JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPUxheCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RyaWN0JzpcbiAgICAgICAgc3RyICs9ICc7IFNhbWVTaXRlPVN0cmljdCc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgIHN0ciArPSAnOyBTYW1lU2l0ZT1Ob25lJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZCcpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdHI7XG59XG5cbi8qKlxuICogVHJ5IGRlY29kaW5nIGEgc3RyaW5nIHVzaW5nIGEgZGVjb2RpbmcgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtmdW5jdGlvbn0gZGVjb2RlXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHRyeURlY29kZShzdHIsIGRlY29kZSkge1xuICB0cnkge1xuICAgIHJldHVybiBkZWNvZGUoc3RyKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cbiIsICIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGluZXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbmltcG9ydCB7IGNhcHR1cmVFeGNlcHRpb24sIGdldEN1cnJlbnRIdWIsIHN0YXJ0VHJhbnNhY3Rpb24sIHdpdGhTY29wZSB9IGZyb20gJ0BzZW50cnkvY29yZSc7XG5pbXBvcnQgeyBleHRyYWN0VHJhY2VwYXJlbnREYXRhLCBTcGFuIH0gZnJvbSAnQHNlbnRyeS90cmFjaW5nJztcbmltcG9ydCB7IEV2ZW50LCBFeHRyYWN0ZWROb2RlUmVxdWVzdERhdGEsIFJlcXVlc3RTZXNzaW9uU3RhdHVzLCBUcmFuc2FjdGlvbiB9IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuaW1wb3J0IHsgaXNQbGFpbk9iamVjdCwgaXNTdHJpbmcsIGxvZ2dlciwgbm9ybWFsaXplLCBzdHJpcFVybFF1ZXJ5QW5kRnJhZ21lbnQgfSBmcm9tICdAc2VudHJ5L3V0aWxzJztcbmltcG9ydCAqIGFzIGNvb2tpZSBmcm9tICdjb29raWUnO1xuaW1wb3J0ICogYXMgZG9tYWluIGZyb20gJ2RvbWFpbic7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgdXJsIGZyb20gJ3VybCc7XG5cbmltcG9ydCB7IE5vZGVDbGllbnQgfSBmcm9tICcuL2NsaWVudCc7XG5pbXBvcnQgeyBmbHVzaCwgaXNBdXRvU2Vzc2lvblRyYWNraW5nRW5hYmxlZCB9IGZyb20gJy4vc2RrJztcblxuZXhwb3J0IGludGVyZmFjZSBFeHByZXNzUmVxdWVzdCB7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb24/OiB7XG4gICAgcmVtb3RlQWRkcmVzcz86IHN0cmluZztcbiAgfTtcbiAgaXA/OiBzdHJpbmc7XG4gIG1ldGhvZD86IHN0cmluZztcbiAgb3JpZ2luYWxVcmw/OiBzdHJpbmc7XG4gIHJvdXRlPzoge1xuICAgIHBhdGg6IHN0cmluZztcbiAgICBzdGFjazogW1xuICAgICAge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICB9LFxuICAgIF07XG4gIH07XG4gIHF1ZXJ5Pzoge1xuICAgIC8vIEl0IGNhbiBiZTogdW5kZWZpbmVkIHwgc3RyaW5nIHwgc3RyaW5nW10gfCBQYXJzZWRRcyB8IFBhcnNlZFFzW10gKGZyb20gYHFzYCBwYWNrYWdlKSwgYnV0IHdlIGRvbnQgd2FudCB0byBwdWxsIGl0LlxuICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gIH07XG4gIHVybD86IHN0cmluZztcbiAgdXNlcj86IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH07XG59XG5cbi8qKlxuICogRXhwcmVzcy1jb21wYXRpYmxlIHRyYWNpbmcgaGFuZGxlci5cbiAqIEBzZWUgRXhwb3NlZCBhcyBgSGFuZGxlcnMudHJhY2luZ0hhbmRsZXJgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFjaW5nSGFuZGxlcigpOiAoXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgbmV4dDogKGVycm9yPzogYW55KSA9PiB2b2lkLFxuKSA9PiB2b2lkIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNlbnRyeVRyYWNpbmdNaWRkbGV3YXJlKFxuICAgIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLFxuICAgIG5leHQ6IChlcnJvcj86IGFueSkgPT4gdm9pZCxcbiAgKTogdm9pZCB7XG4gICAgLy8gSWYgdGhlcmUgaXMgYSB0cmFjZSBoZWFkZXIgc2V0LCB3ZSBleHRyYWN0IHRoZSBkYXRhIGZyb20gaXQgKHBhcmVudFNwYW5JZCwgdHJhY2VJZCwgYW5kIHNhbXBsaW5nIGRlY2lzaW9uKVxuICAgIGxldCB0cmFjZXBhcmVudERhdGE7XG4gICAgaWYgKHJlcS5oZWFkZXJzICYmIGlzU3RyaW5nKHJlcS5oZWFkZXJzWydzZW50cnktdHJhY2UnXSkpIHtcbiAgICAgIHRyYWNlcGFyZW50RGF0YSA9IGV4dHJhY3RUcmFjZXBhcmVudERhdGEocmVxLmhlYWRlcnNbJ3NlbnRyeS10cmFjZSddIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBzdGFydFRyYW5zYWN0aW9uKFxuICAgICAge1xuICAgICAgICBuYW1lOiBleHRyYWN0RXhwcmVzc1RyYW5zYWN0aW9uTmFtZShyZXEsIHsgcGF0aDogdHJ1ZSwgbWV0aG9kOiB0cnVlIH0pLFxuICAgICAgICBvcDogJ2h0dHAuc2VydmVyJyxcbiAgICAgICAgLi4udHJhY2VwYXJlbnREYXRhLFxuICAgICAgfSxcbiAgICAgIC8vIGV4dHJhIGNvbnRleHQgcGFzc2VkIHRvIHRoZSB0cmFjZXNTYW1wbGVyXG4gICAgICB7IHJlcXVlc3Q6IGV4dHJhY3RSZXF1ZXN0RGF0YShyZXEpIH0sXG4gICAgKTtcblxuICAgIC8vIFdlIHB1dCB0aGUgdHJhbnNhY3Rpb24gb24gdGhlIHNjb3BlIHNvIHVzZXJzIGNhbiBhdHRhY2ggY2hpbGRyZW4gdG8gaXRcbiAgICBnZXRDdXJyZW50SHViKCkuY29uZmlndXJlU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgc2NvcGUuc2V0U3Bhbih0cmFuc2FjdGlvbik7XG4gICAgfSk7XG5cbiAgICAvLyBXZSBhbHNvIHNldCBfX3NlbnRyeV90cmFuc2FjdGlvbiBvbiB0aGUgcmVzcG9uc2Ugc28gcGVvcGxlIGNhbiBncmFiIHRoZSB0cmFuc2FjdGlvbiB0aGVyZSB0byBhZGRcbiAgICAvLyBzcGFucyB0byBpdCBsYXRlci5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgKHJlcyBhcyBhbnkpLl9fc2VudHJ5X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247XG5cbiAgICByZXMub25jZSgnZmluaXNoJywgKCkgPT4ge1xuICAgICAgLy8gUHVzaCBgdHJhbnNhY3Rpb24uZmluaXNoYCB0byB0aGUgbmV4dCBldmVudCBsb29wIHNvIG9wZW4gc3BhbnMgaGF2ZSBhIGNoYW5jZSB0byBmaW5pc2ggYmVmb3JlIHRoZSB0cmFuc2FjdGlvblxuICAgICAgLy8gY2xvc2VzXG4gICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICBhZGRFeHByZXNzUmVxVG9UcmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgcmVxKTtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2V0SHR0cFN0YXR1cyhyZXMuc3RhdHVzQ29kZSk7XG4gICAgICAgIHRyYW5zYWN0aW9uLmZpbmlzaCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59XG5cbi8qKlxuICogU2V0IHBhcmFtZXRlcml6ZWQgYXMgdHJhbnNhY3Rpb24gbmFtZSBlLmcuOiBgR0VUIC91c2Vycy86aWRgXG4gKiBBbHNvIGFkZHMgbW9yZSBjb250ZXh0IGRhdGEgb24gdGhlIHRyYW5zYWN0aW9uIGZyb20gdGhlIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gYWRkRXhwcmVzc1JlcVRvVHJhbnNhY3Rpb24odHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uIHwgdW5kZWZpbmVkLCByZXE6IEV4cHJlc3NSZXF1ZXN0KTogdm9pZCB7XG4gIGlmICghdHJhbnNhY3Rpb24pIHJldHVybjtcbiAgdHJhbnNhY3Rpb24ubmFtZSA9IGV4dHJhY3RFeHByZXNzVHJhbnNhY3Rpb25OYW1lKHJlcSwgeyBwYXRoOiB0cnVlLCBtZXRob2Q6IHRydWUgfSk7XG4gIHRyYW5zYWN0aW9uLnNldERhdGEoJ3VybCcsIHJlcS5vcmlnaW5hbFVybCk7XG4gIHRyYW5zYWN0aW9uLnNldERhdGEoJ2Jhc2VVcmwnLCByZXEuYmFzZVVybCk7XG4gIHRyYW5zYWN0aW9uLnNldERhdGEoJ3F1ZXJ5JywgcmVxLnF1ZXJ5KTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBjb21wbGV0ZSBnZW5lcmFsaXplZCBwYXRoIGZyb20gdGhlIHJlcXVlc3Qgb2JqZWN0IGFuZCB1c2VzIGl0IHRvIGNvbnN0cnVjdCB0cmFuc2FjdGlvbiBuYW1lLlxuICpcbiAqIGVnLiBHRVQgL21vdW50cG9pbnQvdXNlci86aWRcbiAqXG4gKiBAcGFyYW0gcmVxIFRoZSBFeHByZXNzUmVxdWVzdCBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zIFdoYXQgdG8gaW5jbHVkZSBpbiB0aGUgdHJhbnNhY3Rpb24gbmFtZSAobWV0aG9kLCBwYXRoLCBvciBib3RoKVxuICpcbiAqIEByZXR1cm5zIFRoZSBmdWxseSBjb25zdHJ1Y3RlZCB0cmFuc2FjdGlvbiBuYW1lXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeHByZXNzVHJhbnNhY3Rpb25OYW1lKFxuICByZXE6IEV4cHJlc3NSZXF1ZXN0LFxuICBvcHRpb25zOiB7IHBhdGg/OiBib29sZWFuOyBtZXRob2Q/OiBib29sZWFuIH0gPSB7fSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2Q/LnRvVXBwZXJDYXNlKCk7XG5cbiAgbGV0IHBhdGggPSAnJztcbiAgaWYgKHJlcS5yb3V0ZSkge1xuICAgIHBhdGggPSBgJHtyZXEuYmFzZVVybCB8fCAnJ30ke3JlcS5yb3V0ZS5wYXRofWA7XG4gIH0gZWxzZSBpZiAocmVxLm9yaWdpbmFsVXJsIHx8IHJlcS51cmwpIHtcbiAgICBwYXRoID0gc3RyaXBVcmxRdWVyeUFuZEZyYWdtZW50KHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsIHx8ICcnKTtcbiAgfVxuXG4gIGxldCBpbmZvID0gJyc7XG4gIGlmIChvcHRpb25zLm1ldGhvZCAmJiBtZXRob2QpIHtcbiAgICBpbmZvICs9IG1ldGhvZDtcbiAgfVxuICBpZiAob3B0aW9ucy5tZXRob2QgJiYgb3B0aW9ucy5wYXRoKSB7XG4gICAgaW5mbyArPSBgIGA7XG4gIH1cbiAgaWYgKG9wdGlvbnMucGF0aCAmJiBwYXRoKSB7XG4gICAgaW5mbyArPSBwYXRoO1xuICB9XG5cbiAgcmV0dXJuIGluZm87XG59XG5cbnR5cGUgVHJhbnNhY3Rpb25OYW1pbmdTY2hlbWUgPSAncGF0aCcgfCAnbWV0aG9kUGF0aCcgfCAnaGFuZGxlcic7XG5cbi8qKiBKU0RvYyAqL1xuZnVuY3Rpb24gZXh0cmFjdFRyYW5zYWN0aW9uKHJlcTogRXhwcmVzc1JlcXVlc3QsIHR5cGU6IGJvb2xlYW4gfCBUcmFuc2FjdGlvbk5hbWluZ1NjaGVtZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3BhdGgnOiB7XG4gICAgICByZXR1cm4gZXh0cmFjdEV4cHJlc3NUcmFuc2FjdGlvbk5hbWUocmVxLCB7IHBhdGg6IHRydWUgfSk7XG4gICAgfVxuICAgIGNhc2UgJ2hhbmRsZXInOiB7XG4gICAgICByZXR1cm4gcmVxLnJvdXRlPy5zdGFja1swXS5uYW1lIHx8ICc8YW5vbnltb3VzPic7XG4gICAgfVxuICAgIGNhc2UgJ21ldGhvZFBhdGgnOlxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiBleHRyYWN0RXhwcmVzc1RyYW5zYWN0aW9uTmFtZShyZXEsIHsgcGF0aDogdHJ1ZSwgbWV0aG9kOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKiogRGVmYXVsdCB1c2VyIGtleXMgdGhhdCdsbCBiZSB1c2VkIHRvIGV4dHJhY3QgZGF0YSBmcm9tIHRoZSByZXF1ZXN0ICovXG5jb25zdCBERUZBVUxUX1VTRVJfS0VZUyA9IFsnaWQnLCAndXNlcm5hbWUnLCAnZW1haWwnXTtcblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBleHRyYWN0VXNlckRhdGEoXG4gIHVzZXI6IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gIH0sXG4gIGtleXM6IGJvb2xlYW4gfCBzdHJpbmdbXSxcbik6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICBjb25zdCBleHRyYWN0ZWRVc2VyOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gIGNvbnN0IGF0dHJpYnV0ZXMgPSBBcnJheS5pc0FycmF5KGtleXMpID8ga2V5cyA6IERFRkFVTFRfVVNFUl9LRVlTO1xuXG4gIGF0dHJpYnV0ZXMuZm9yRWFjaChrZXkgPT4ge1xuICAgIGlmICh1c2VyICYmIGtleSBpbiB1c2VyKSB7XG4gICAgICBleHRyYWN0ZWRVc2VyW2tleV0gPSB1c2VyW2tleV07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZXh0cmFjdGVkVXNlcjtcbn1cblxuLyoqIERlZmF1bHQgcmVxdWVzdCBrZXlzIHRoYXQnbGwgYmUgdXNlZCB0byBleHRyYWN0IGRhdGEgZnJvbSB0aGUgcmVxdWVzdCAqL1xuY29uc3QgREVGQVVMVF9SRVFVRVNUX0tFWVMgPSBbJ2Nvb2tpZXMnLCAnZGF0YScsICdoZWFkZXJzJywgJ21ldGhvZCcsICdxdWVyeV9zdHJpbmcnLCAndXJsJ107XG5cbi8qKlxuICogTm9ybWFsaXplcyBkYXRhIGZyb20gdGhlIHJlcXVlc3Qgb2JqZWN0LCBhY2NvdW50aW5nIGZvciBmcmFtZXdvcmsgZGlmZmVyZW5jZXMuXG4gKlxuICogQHBhcmFtIHJlcSBUaGUgcmVxdWVzdCBvYmplY3QgZnJvbSB3aGljaCB0byBleHRyYWN0IGRhdGFcbiAqIEBwYXJhbSBrZXlzIEFuIG9wdGlvbmFsIGFycmF5IG9mIGtleXMgdG8gaW5jbHVkZSBpbiB0aGUgbm9ybWFsaXplZCBkYXRhLiBEZWZhdWx0cyB0byBERUZBVUxUX1JFUVVFU1RfS0VZUyBpZiBub3RcbiAqIHByb3ZpZGVkLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgbm9ybWFsaXplZCByZXF1ZXN0IGRhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RSZXF1ZXN0RGF0YShcbiAgcmVxOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LFxuICBrZXlzOiBzdHJpbmdbXSA9IERFRkFVTFRfUkVRVUVTVF9LRVlTLFxuKTogRXh0cmFjdGVkTm9kZVJlcXVlc3REYXRhIHtcbiAgY29uc3QgcmVxdWVzdERhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcblxuICAvLyBoZWFkZXJzOlxuICAvLyAgIG5vZGUsIGV4cHJlc3MsIG5leHRqczogcmVxLmhlYWRlcnNcbiAgLy8gICBrb2E6IHJlcS5oZWFkZXJcbiAgY29uc3QgaGVhZGVycyA9IChyZXEuaGVhZGVycyB8fCByZXEuaGVhZGVyIHx8IHt9KSBhcyB7XG4gICAgaG9zdD86IHN0cmluZztcbiAgICBjb29raWU/OiBzdHJpbmc7XG4gIH07XG4gIC8vIG1ldGhvZDpcbiAgLy8gICBub2RlLCBleHByZXNzLCBrb2EsIG5leHRqczogcmVxLm1ldGhvZFxuICBjb25zdCBtZXRob2QgPSByZXEubWV0aG9kO1xuICAvLyBob3N0OlxuICAvLyAgIGV4cHJlc3M6IHJlcS5ob3N0bmFtZSBpbiA+IDQgYW5kIHJlcS5ob3N0IGluIDwgNFxuICAvLyAgIGtvYTogcmVxLmhvc3RcbiAgLy8gICBub2RlLCBuZXh0anM6IHJlcS5oZWFkZXJzLmhvc3RcbiAgY29uc3QgaG9zdCA9IHJlcS5ob3N0bmFtZSB8fCByZXEuaG9zdCB8fCBoZWFkZXJzLmhvc3QgfHwgJzxubyBob3N0Pic7XG4gIC8vIHByb3RvY29sOlxuICAvLyAgIG5vZGUsIG5leHRqczogPG4vYT5cbiAgLy8gICBleHByZXNzLCBrb2E6IHJlcS5wcm90b2NvbFxuICBjb25zdCBwcm90b2NvbCA9XG4gICAgcmVxLnByb3RvY29sID09PSAnaHR0cHMnIHx8IHJlcS5zZWN1cmUgfHwgKChyZXEuc29ja2V0IHx8IHt9KSBhcyB7IGVuY3J5cHRlZD86IGJvb2xlYW4gfSkuZW5jcnlwdGVkXG4gICAgICA/ICdodHRwcydcbiAgICAgIDogJ2h0dHAnO1xuICAvLyB1cmwgKGluY2x1ZGluZyBwYXRoIGFuZCBxdWVyeSBzdHJpbmcpOlxuICAvLyAgIG5vZGUsIGV4cHJlc3M6IHJlcS5vcmlnaW5hbFVybFxuICAvLyAgIGtvYSwgbmV4dGpzOiByZXEudXJsXG4gIGNvbnN0IG9yaWdpbmFsVXJsID0gKHJlcS5vcmlnaW5hbFVybCB8fCByZXEudXJsIHx8ICcnKSBhcyBzdHJpbmc7XG4gIC8vIGFic29sdXRlIHVybFxuICBjb25zdCBhYnNvbHV0ZVVybCA9IGAke3Byb3RvY29sfTovLyR7aG9zdH0ke29yaWdpbmFsVXJsfWA7XG5cbiAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgc3dpdGNoIChrZXkpIHtcbiAgICAgIGNhc2UgJ2hlYWRlcnMnOlxuICAgICAgICByZXF1ZXN0RGF0YS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdtZXRob2QnOlxuICAgICAgICByZXF1ZXN0RGF0YS5tZXRob2QgPSBtZXRob2Q7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXJsJzpcbiAgICAgICAgcmVxdWVzdERhdGEudXJsID0gYWJzb2x1dGVVcmw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29va2llcyc6XG4gICAgICAgIC8vIGNvb2tpZXM6XG4gICAgICAgIC8vICAgbm9kZSwgZXhwcmVzcywga29hOiByZXEuaGVhZGVycy5jb29raWVcbiAgICAgICAgLy8gICB2ZXJjZWwsIHNhaWxzLmpzLCBleHByZXNzICh3LyBjb29raWUgbWlkZGxld2FyZSksIG5leHRqczogcmVxLmNvb2tpZXNcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXF1ZXN0RGF0YS5jb29raWVzID0gcmVxLmNvb2tpZXMgfHwgY29va2llLnBhcnNlKGhlYWRlcnMuY29va2llIHx8ICcnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdxdWVyeV9zdHJpbmcnOlxuICAgICAgICAvLyBxdWVyeSBzdHJpbmc6XG4gICAgICAgIC8vICAgbm9kZTogcmVxLnVybCAocmF3KVxuICAgICAgICAvLyAgIGV4cHJlc3MsIGtvYSwgbmV4dGpzOiByZXEucXVlcnlcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICByZXF1ZXN0RGF0YS5xdWVyeV9zdHJpbmcgPSByZXEucXVlcnkgfHwgdXJsLnBhcnNlKG9yaWdpbmFsVXJsIHx8ICcnLCBmYWxzZSkucXVlcnk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZGF0YSc6XG4gICAgICAgIGlmIChtZXRob2QgPT09ICdHRVQnIHx8IG1ldGhvZCA9PT0gJ0hFQUQnKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYm9keSBkYXRhOlxuICAgICAgICAvLyAgIGV4cHJlc3MsIGtvYSwgbmV4dGpzOiByZXEuYm9keVxuICAgICAgICAvL1xuICAgICAgICAvLyAgIHdoZW4gdXNpbmcgbm9kZSBieSBpdHNlbGYsIHlvdSBoYXZlIHRvIHJlYWQgdGhlIGluY29taW5nIHN0cmVhbShzZWVcbiAgICAgICAgLy8gICBodHRwczovL25vZGVqcy5kZXYvbGVhcm4vZ2V0LWh0dHAtcmVxdWVzdC1ib2R5LWRhdGEtdXNpbmctbm9kZWpzKTsgaWYgYSB1c2VyIGlzIGRvaW5nIHRoYXQsIHdlIGNhbid0IGtub3dcbiAgICAgICAgLy8gICB3aGVyZSB0aGV5J3JlIGdvaW5nIHRvIHN0b3JlIHRoZSBmaW5hbCByZXN1bHQsIHNvIHRoZXknbGwgaGF2ZSB0byBjYXB0dXJlIHRoaXMgZGF0YSB0aGVtc2VsdmVzXG4gICAgICAgIGlmIChyZXEuYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVxdWVzdERhdGEuZGF0YSA9IGlzU3RyaW5nKHJlcS5ib2R5KSA/IHJlcS5ib2R5IDogSlNPTi5zdHJpbmdpZnkobm9ybWFsaXplKHJlcS5ib2R5KSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChyZXEsIGtleSkpIHtcbiAgICAgICAgICByZXF1ZXN0RGF0YVtrZXldID0gKHJlcSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9KVtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVxdWVzdERhdGE7XG59XG5cbi8qKlxuICogT3B0aW9ucyBkZWNpZGluZyB3aGF0IHBhcnRzIG9mIHRoZSByZXF1ZXN0IHRvIHVzZSB3aGVuIGVuaGFuY2luZyBhbiBldmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlUmVxdWVzdE9wdGlvbnMge1xuICBpcD86IGJvb2xlYW47XG4gIHJlcXVlc3Q/OiBib29sZWFuIHwgc3RyaW5nW107XG4gIHNlcnZlck5hbWU/OiBib29sZWFuO1xuICB0cmFuc2FjdGlvbj86IGJvb2xlYW4gfCBUcmFuc2FjdGlvbk5hbWluZ1NjaGVtZTtcbiAgdXNlcj86IGJvb2xlYW4gfCBzdHJpbmdbXTtcbiAgdmVyc2lvbj86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5yaWNoZXMgcGFzc2VkIGV2ZW50IHdpdGggcmVxdWVzdCBkYXRhLlxuICpcbiAqIEBwYXJhbSBldmVudCBXaWxsIGJlIG11dGF0ZWQgYW5kIGVucmljaGVkIHdpdGggcmVxIGRhdGFcbiAqIEBwYXJhbSByZXEgUmVxdWVzdCBvYmplY3RcbiAqIEBwYXJhbSBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGZsYWdzIHRvIGVuYWJsZSBmdW5jdGlvbmFsaXR5XG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVJlcXVlc3QoZXZlbnQ6IEV2ZW50LCByZXE6IEV4cHJlc3NSZXF1ZXN0LCBvcHRpb25zPzogUGFyc2VSZXF1ZXN0T3B0aW9ucyk6IEV2ZW50IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIG9wdGlvbnMgPSB7XG4gICAgaXA6IGZhbHNlLFxuICAgIHJlcXVlc3Q6IHRydWUsXG4gICAgc2VydmVyTmFtZTogdHJ1ZSxcbiAgICB0cmFuc2FjdGlvbjogdHJ1ZSxcbiAgICB1c2VyOiB0cnVlLFxuICAgIHZlcnNpb246IHRydWUsXG4gICAgLi4ub3B0aW9ucyxcbiAgfTtcblxuICBpZiAob3B0aW9ucy52ZXJzaW9uKSB7XG4gICAgZXZlbnQuY29udGV4dHMgPSB7XG4gICAgICAuLi5ldmVudC5jb250ZXh0cyxcbiAgICAgIHJ1bnRpbWU6IHtcbiAgICAgICAgbmFtZTogJ25vZGUnLFxuICAgICAgICB2ZXJzaW9uOiBnbG9iYWwucHJvY2Vzcy52ZXJzaW9uLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucmVxdWVzdCkge1xuICAgIC8vIGlmIHRoZSBvcHRpb24gdmFsdWUgaXMgYHRydWVgLCB1c2UgdGhlIGRlZmF1bHQgc2V0IG9mIGtleXMgYnkgbm90IHBhc3NpbmcgYW55dGhpbmcgdG8gYGV4dHJhY3RSZXF1ZXN0RGF0YSgpYFxuICAgIGNvbnN0IGV4dHJhY3RlZFJlcXVlc3REYXRhID0gQXJyYXkuaXNBcnJheShvcHRpb25zLnJlcXVlc3QpXG4gICAgICA/IGV4dHJhY3RSZXF1ZXN0RGF0YShyZXEsIG9wdGlvbnMucmVxdWVzdClcbiAgICAgIDogZXh0cmFjdFJlcXVlc3REYXRhKHJlcSk7XG4gICAgZXZlbnQucmVxdWVzdCA9IHtcbiAgICAgIC4uLmV2ZW50LnJlcXVlc3QsXG4gICAgICAuLi5leHRyYWN0ZWRSZXF1ZXN0RGF0YSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2VydmVyTmFtZSAmJiAhZXZlbnQuc2VydmVyX25hbWUpIHtcbiAgICBldmVudC5zZXJ2ZXJfbmFtZSA9IGdsb2JhbC5wcm9jZXNzLmVudi5TRU5UUllfTkFNRSB8fCBvcy5ob3N0bmFtZSgpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMudXNlcikge1xuICAgIGNvbnN0IGV4dHJhY3RlZFVzZXIgPSByZXEudXNlciAmJiBpc1BsYWluT2JqZWN0KHJlcS51c2VyKSA/IGV4dHJhY3RVc2VyRGF0YShyZXEudXNlciwgb3B0aW9ucy51c2VyKSA6IHt9O1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGV4dHJhY3RlZFVzZXIpKSB7XG4gICAgICBldmVudC51c2VyID0ge1xuICAgICAgICAuLi5ldmVudC51c2VyLFxuICAgICAgICAuLi5leHRyYWN0ZWRVc2VyLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICAvLyBjbGllbnQgaXA6XG4gIC8vICAgbm9kZSwgbmV4dGpzOiByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gIC8vICAgZXhwcmVzcywga29hOiByZXEuaXBcbiAgaWYgKG9wdGlvbnMuaXApIHtcbiAgICBjb25zdCBpcCA9IHJlcS5pcCB8fCAocmVxLmNvbm5lY3Rpb24gJiYgcmVxLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzcyk7XG4gICAgaWYgKGlwKSB7XG4gICAgICBldmVudC51c2VyID0ge1xuICAgICAgICAuLi5ldmVudC51c2VyLFxuICAgICAgICBpcF9hZGRyZXNzOiBpcCxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKG9wdGlvbnMudHJhbnNhY3Rpb24gJiYgIWV2ZW50LnRyYW5zYWN0aW9uKSB7XG4gICAgLy8gVE9ETyBkbyB3ZSBldmVuIG5lZWQgdGhpcyBhbnltb3JlP1xuICAgIC8vIFRPRE8gbWFrZSB0aGlzIHdvcmsgZm9yIG5leHRqc1xuICAgIGV2ZW50LnRyYW5zYWN0aW9uID0gZXh0cmFjdFRyYW5zYWN0aW9uKHJlcSwgb3B0aW9ucy50cmFuc2FjdGlvbik7XG4gIH1cblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RIYW5kbGVyT3B0aW9ucyA9IFBhcnNlUmVxdWVzdE9wdGlvbnMgJiB7XG4gIGZsdXNoVGltZW91dD86IG51bWJlcjtcbn07XG5cbi8qKlxuICogRXhwcmVzcyBjb21wYXRpYmxlIHJlcXVlc3QgaGFuZGxlci5cbiAqIEBzZWUgRXhwb3NlZCBhcyBgSGFuZGxlcnMucmVxdWVzdEhhbmRsZXJgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0SGFuZGxlcihcbiAgb3B0aW9ucz86IFJlcXVlc3RIYW5kbGVyT3B0aW9ucyxcbik6IChyZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIG5leHQ6IChlcnJvcj86IGFueSkgPT4gdm9pZCkgPT4gdm9pZCB7XG4gIGNvbnN0IGN1cnJlbnRIdWIgPSBnZXRDdXJyZW50SHViKCk7XG4gIGNvbnN0IGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG4gIC8vIEluaXRpYWxpc2UgYW4gaW5zdGFuY2Ugb2YgU2Vzc2lvbkZsdXNoZXIgb24gdGhlIGNsaWVudCB3aGVuIGBhdXRvU2Vzc2lvblRyYWNraW5nYCBpcyBlbmFibGVkIGFuZCB0aGVcbiAgLy8gYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIHVzZWQgaW5kaWNhdGluZyB0aGF0IHdlIGFyZSBydW5uaW5nIGluIFNlc3Npb25BZ2dyZWdhdGVzIG1vZGVcbiAgaWYgKGNsaWVudCAmJiBpc0F1dG9TZXNzaW9uVHJhY2tpbmdFbmFibGVkKGNsaWVudCkpIHtcbiAgICBjbGllbnQuaW5pdFNlc3Npb25GbHVzaGVyKCk7XG5cbiAgICAvLyBJZiBTY29wZSBjb250YWlucyBhIFNpbmdsZSBtb2RlIFNlc3Npb24sIGl0IGlzIHJlbW92ZWQgaW4gZmF2b3Igb2YgdXNpbmcgU2Vzc2lvbiBBZ2dyZWdhdGVzIG1vZGVcbiAgICBjb25zdCBzY29wZSA9IGN1cnJlbnRIdWIuZ2V0U2NvcGUoKTtcbiAgICBpZiAoc2NvcGUgJiYgc2NvcGUuZ2V0U2Vzc2lvbigpKSB7XG4gICAgICBzY29wZS5zZXRTZXNzaW9uKCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBmdW5jdGlvbiBzZW50cnlSZXF1ZXN0TWlkZGxld2FyZShcbiAgICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgICBuZXh0OiAoZXJyb3I/OiBhbnkpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuZmx1c2hUaW1lb3V0ICYmIG9wdGlvbnMuZmx1c2hUaW1lb3V0ID4gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICAgICAgY29uc3QgX2VuZCA9IHJlcy5lbmQ7XG4gICAgICByZXMuZW5kID0gZnVuY3Rpb24oY2h1bms/OiBhbnkgfCAoKCkgPT4gdm9pZCksIGVuY29kaW5nPzogc3RyaW5nIHwgKCgpID0+IHZvaWQpLCBjYj86ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdm9pZCBmbHVzaChvcHRpb25zLmZsdXNoVGltZW91dClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBfZW5kLmNhbGwodGhpcywgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbihudWxsLCBlID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IGxvY2FsID0gZG9tYWluLmNyZWF0ZSgpO1xuICAgIGxvY2FsLmFkZChyZXEpO1xuICAgIGxvY2FsLmFkZChyZXMpO1xuICAgIGxvY2FsLm9uKCdlcnJvcicsIG5leHQpO1xuXG4gICAgbG9jYWwucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRIdWIgPSBnZXRDdXJyZW50SHViKCk7XG5cbiAgICAgIGN1cnJlbnRIdWIuY29uZmlndXJlU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICBzY29wZS5hZGRFdmVudFByb2Nlc3NvcigoZXZlbnQ6IEV2ZW50KSA9PiBwYXJzZVJlcXVlc3QoZXZlbnQsIHJlcSwgb3B0aW9ucykpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBjdXJyZW50SHViLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuICAgICAgICBpZiAoaXNBdXRvU2Vzc2lvblRyYWNraW5nRW5hYmxlZChjbGllbnQpKSB7XG4gICAgICAgICAgY29uc3Qgc2NvcGUgPSBjdXJyZW50SHViLmdldFNjb3BlKCk7XG4gICAgICAgICAgaWYgKHNjb3BlKSB7XG4gICAgICAgICAgICAvLyBTZXQgYHN0YXR1c2Agb2YgYFJlcXVlc3RTZXNzaW9uYCB0byBPaywgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVxdWVzdFxuICAgICAgICAgICAgc2NvcGUuc2V0UmVxdWVzdFNlc3Npb24oeyBzdGF0dXM6IFJlcXVlc3RTZXNzaW9uU3RhdHVzLk9rIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5vbmNlKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGN1cnJlbnRIdWIuZ2V0Q2xpZW50PE5vZGVDbGllbnQ+KCk7XG4gICAgICAgIGlmIChpc0F1dG9TZXNzaW9uVHJhY2tpbmdFbmFibGVkKGNsaWVudCkpIHtcbiAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgaWYgKGNsaWVudCAmJiAoY2xpZW50IGFzIGFueSkuX2NhcHR1cmVSZXF1ZXN0U2Vzc2lvbikge1xuICAgICAgICAgICAgICAvLyBDYWxsaW5nIF9jYXB0dXJlUmVxdWVzdFNlc3Npb24gdG8gY2FwdHVyZSByZXF1ZXN0IHNlc3Npb24gYXQgdGhlIGVuZCBvZiB0aGUgcmVxdWVzdCBieSBpbmNyZW1lbnRpbmdcbiAgICAgICAgICAgICAgLy8gdGhlIGNvcnJlY3QgU2Vzc2lvbkFnZ3JlZ2F0ZXMgYnVja2V0IGkuZS4gY3Jhc2hlZCwgZXJyb3JlZCBvciBleGl0ZWRcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgICAoY2xpZW50IGFzIGFueSkuX2NhcHR1cmVSZXF1ZXN0U2Vzc2lvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqIEpTRG9jICovXG5pbnRlcmZhY2UgTWlkZGxld2FyZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBzdGF0dXM/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXIgfCBzdHJpbmc7XG4gIHN0YXR1c19jb2RlPzogbnVtYmVyIHwgc3RyaW5nO1xuICBvdXRwdXQ/OiB7XG4gICAgc3RhdHVzQ29kZT86IG51bWJlciB8IHN0cmluZztcbiAgfTtcbn1cblxuLyoqIEpTRG9jICovXG5mdW5jdGlvbiBnZXRTdGF0dXNDb2RlRnJvbVJlc3BvbnNlKGVycm9yOiBNaWRkbGV3YXJlRXJyb3IpOiBudW1iZXIge1xuICBjb25zdCBzdGF0dXNDb2RlID0gZXJyb3Iuc3RhdHVzIHx8IGVycm9yLnN0YXR1c0NvZGUgfHwgZXJyb3Iuc3RhdHVzX2NvZGUgfHwgKGVycm9yLm91dHB1dCAmJiBlcnJvci5vdXRwdXQuc3RhdHVzQ29kZSk7XG4gIHJldHVybiBzdGF0dXNDb2RlID8gcGFyc2VJbnQoc3RhdHVzQ29kZSBhcyBzdHJpbmcsIDEwKSA6IDUwMDtcbn1cblxuLyoqIFJldHVybnMgdHJ1ZSBpZiByZXNwb25zZSBjb2RlIGlzIGludGVybmFsIHNlcnZlciBlcnJvciAqL1xuZnVuY3Rpb24gZGVmYXVsdFNob3VsZEhhbmRsZUVycm9yKGVycm9yOiBNaWRkbGV3YXJlRXJyb3IpOiBib29sZWFuIHtcbiAgY29uc3Qgc3RhdHVzID0gZ2V0U3RhdHVzQ29kZUZyb21SZXNwb25zZShlcnJvcik7XG4gIHJldHVybiBzdGF0dXMgPj0gNTAwO1xufVxuXG4vKipcbiAqIEV4cHJlc3MgY29tcGF0aWJsZSBlcnJvciBoYW5kbGVyLlxuICogQHNlZSBFeHBvc2VkIGFzIGBIYW5kbGVycy5lcnJvckhhbmRsZXJgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlcnJvckhhbmRsZXIob3B0aW9ucz86IHtcbiAgLyoqXG4gICAqIENhbGxiYWNrIG1ldGhvZCBkZWNpZGluZyB3aGV0aGVyIGVycm9yIHNob3VsZCBiZSBjYXB0dXJlZCBhbmQgc2VudCB0byBTZW50cnlcbiAgICogQHBhcmFtIGVycm9yIENhcHR1cmVkIG1pZGRsZXdhcmUgZXJyb3JcbiAgICovXG4gIHNob3VsZEhhbmRsZUVycm9yPyhlcnJvcjogTWlkZGxld2FyZUVycm9yKTogYm9vbGVhbjtcbn0pOiAoXG4gIGVycm9yOiBNaWRkbGV3YXJlRXJyb3IsXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSxcbiAgbmV4dDogKGVycm9yOiBNaWRkbGV3YXJlRXJyb3IpID0+IHZvaWQsXG4pID0+IHZvaWQge1xuICByZXR1cm4gZnVuY3Rpb24gc2VudHJ5RXJyb3JNaWRkbGV3YXJlKFxuICAgIGVycm9yOiBNaWRkbGV3YXJlRXJyb3IsXG4gICAgX3JlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gICAgcmVzOiBodHRwLlNlcnZlclJlc3BvbnNlLFxuICAgIG5leHQ6IChlcnJvcjogTWlkZGxld2FyZUVycm9yKSA9PiB2b2lkLFxuICApOiB2b2lkIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gICAgY29uc3Qgc2hvdWxkSGFuZGxlRXJyb3IgPSAob3B0aW9ucyAmJiBvcHRpb25zLnNob3VsZEhhbmRsZUVycm9yKSB8fCBkZWZhdWx0U2hvdWxkSGFuZGxlRXJyb3I7XG5cbiAgICBpZiAoc2hvdWxkSGFuZGxlRXJyb3IoZXJyb3IpKSB7XG4gICAgICB3aXRoU2NvcGUoX3Njb3BlID0+IHtcbiAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHdlIG5lZWQgdG8gc2V0IHRoZSB0cmFuc2FjdGlvbiBvbiB0aGUgc2NvcGUgYWdhaW5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IChyZXMgYXMgYW55KS5fX3NlbnRyeV90cmFuc2FjdGlvbiBhcyBTcGFuO1xuICAgICAgICBpZiAodHJhbnNhY3Rpb24gJiYgX3Njb3BlLmdldFNwYW4oKSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgX3Njb3BlLnNldFNwYW4odHJhbnNhY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xpZW50ID0gZ2V0Q3VycmVudEh1YigpLmdldENsaWVudDxOb2RlQ2xpZW50PigpO1xuICAgICAgICBpZiAoY2xpZW50ICYmIGlzQXV0b1Nlc3Npb25UcmFja2luZ0VuYWJsZWQoY2xpZW50KSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBgU2Vzc2lvbkZsdXNoZXJgIGlzIGluc3RhbnRpYXRlZCBvbiB0aGUgY2xpZW50IHRvIGdvIGludG8gdGhpcyBicmFuY2ggdGhhdCBtYXJrcyB0aGVcbiAgICAgICAgICAvLyBgcmVxdWVzdFNlc3Npb24uc3RhdHVzYCBhcyBgQ3Jhc2hlZGAsIGFuZCB0aGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBgU2Vzc2lvbkZsdXNoZXJgIGlzIG9ubHlcbiAgICAgICAgICAvLyBpbnN0YW50aWF0ZWQgd2hlbiB0aGUgdGhlYHJlcXVlc3RIYW5kbGVyYCBtaWRkbGV3YXJlIGlzIGluaXRpYWxpc2VkLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGQgYmVcbiAgICAgICAgICAvLyBydW5uaW5nIGluIFNlc3Npb25BZ2dyZWdhdGVzIG1vZGVcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1tZW1iZXItYWNjZXNzXG4gICAgICAgICAgY29uc3QgaXNTZXNzaW9uQWdncmVnYXRlc01vZGUgPSAoY2xpZW50IGFzIGFueSkuX3Nlc3Npb25GbHVzaGVyICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKGlzU2Vzc2lvbkFnZ3JlZ2F0ZXNNb2RlKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0U2Vzc2lvbiA9IF9zY29wZS5nZXRSZXF1ZXN0U2Vzc2lvbigpO1xuICAgICAgICAgICAgLy8gSWYgYW4gZXJyb3IgYnViYmxlcyB0byB0aGUgYGVycm9ySGFuZGxlcmAsIHRoZW4gdGhpcyBpcyBhbiB1bmhhbmRsZWQgZXJyb3IsIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgYXMgYVxuICAgICAgICAgICAgLy8gQ3Jhc2hlZCBzZXNzaW9uLiBUaGUgYF9yZXF1ZXN0U2Vzc2lvbi5zdGF0dXNgIGlzIGNoZWNrZWQgdG8gZW5zdXJlIHRoYXQgdGhpcyBlcnJvciBpcyBoYXBwZW5pbmcgd2l0aGluXG4gICAgICAgICAgICAvLyB0aGUgYm91bmRzIG9mIGEgcmVxdWVzdCwgYW5kIGlmIHNvIHRoZSBzdGF0dXMgaXMgdXBkYXRlZFxuICAgICAgICAgICAgaWYgKHJlcXVlc3RTZXNzaW9uICYmIHJlcXVlc3RTZXNzaW9uLnN0YXR1cyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICByZXF1ZXN0U2Vzc2lvbi5zdGF0dXMgPSBSZXF1ZXN0U2Vzc2lvblN0YXR1cy5DcmFzaGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGV2ZW50SWQgPSBjYXB0dXJlRXhjZXB0aW9uKGVycm9yKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAocmVzIGFzIGFueSkuc2VudHJ5ID0gZXZlbnRJZDtcbiAgICAgICAgbmV4dChlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5leHQoZXJyb3IpO1xuICB9O1xufVxuIiwgImV4cG9ydCB7XG4gIEJyZWFkY3J1bWIsXG4gIEJyZWFkY3J1bWJIaW50LFxuICBSZXF1ZXN0LFxuICBTZGtJbmZvLFxuICBFdmVudCxcbiAgRXZlbnRIaW50LFxuICBFeGNlcHRpb24sXG4gIFJlc3BvbnNlLFxuICBTZXZlcml0eSxcbiAgU3RhY2tGcmFtZSxcbiAgU3RhY2t0cmFjZSxcbiAgU3RhdHVzLFxuICBUaHJlYWQsXG4gIFVzZXIsXG59IGZyb20gJ0BzZW50cnkvdHlwZXMnO1xuXG5leHBvcnQge1xuICBhZGRHbG9iYWxFdmVudFByb2Nlc3NvcixcbiAgYWRkQnJlYWRjcnVtYixcbiAgY2FwdHVyZUV4Y2VwdGlvbixcbiAgY2FwdHVyZUV2ZW50LFxuICBjYXB0dXJlTWVzc2FnZSxcbiAgY29uZmlndXJlU2NvcGUsXG4gIGdldEh1YkZyb21DYXJyaWVyLFxuICBnZXRDdXJyZW50SHViLFxuICBIdWIsXG4gIG1ha2VNYWluLFxuICBTY29wZSxcbiAgc3RhcnRUcmFuc2FjdGlvbixcbiAgU0RLX1ZFUlNJT04sXG4gIHNldENvbnRleHQsXG4gIHNldEV4dHJhLFxuICBzZXRFeHRyYXMsXG4gIHNldFRhZyxcbiAgc2V0VGFncyxcbiAgc2V0VXNlcixcbiAgd2l0aFNjb3BlLFxufSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuXG5leHBvcnQgeyBOb2RlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IHsgTm9kZUJhY2tlbmQgfSBmcm9tICcuL2JhY2tlbmQnO1xuZXhwb3J0IHsgTm9kZUNsaWVudCB9IGZyb20gJy4vY2xpZW50JztcbmV4cG9ydCB7IGRlZmF1bHRJbnRlZ3JhdGlvbnMsIGluaXQsIGxhc3RFdmVudElkLCBmbHVzaCwgY2xvc2UsIGdldFNlbnRyeVJlbGVhc2UgfSBmcm9tICcuL3Nkayc7XG5leHBvcnQgeyBkZWVwUmVhZERpclN5bmMgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCB7IFNES19OQU1FIH0gZnJvbSAnLi92ZXJzaW9uJztcblxuaW1wb3J0IHsgSW50ZWdyYXRpb25zIGFzIENvcmVJbnRlZ3JhdGlvbnMgfSBmcm9tICdAc2VudHJ5L2NvcmUnO1xuaW1wb3J0IHsgZ2V0TWFpbkNhcnJpZXIgfSBmcm9tICdAc2VudHJ5L2h1Yic7XG5pbXBvcnQgKiBhcyBkb21haW4gZnJvbSAnZG9tYWluJztcblxuaW1wb3J0ICogYXMgSGFuZGxlcnMgZnJvbSAnLi9oYW5kbGVycyc7XG5pbXBvcnQgKiBhcyBOb2RlSW50ZWdyYXRpb25zIGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmltcG9ydCAqIGFzIFRyYW5zcG9ydHMgZnJvbSAnLi90cmFuc3BvcnRzJztcblxuY29uc3QgSU5URUdSQVRJT05TID0ge1xuICAuLi5Db3JlSW50ZWdyYXRpb25zLFxuICAuLi5Ob2RlSW50ZWdyYXRpb25zLFxufTtcblxuZXhwb3J0IHsgSU5URUdSQVRJT05TIGFzIEludGVncmF0aW9ucywgVHJhbnNwb3J0cywgSGFuZGxlcnMgfTtcblxuLy8gV2UgbmVlZCB0byBwYXRjaCBkb21haW4gb24gdGhlIGdsb2JhbCBfX1NFTlRSWV9fIG9iamVjdCB0byBtYWtlIGl0IHdvcmsgZm9yIG5vZGUgaW4gY3Jvc3MtcGxhdGZvcm0gcGFja2FnZXMgbGlrZVxuLy8gQHNlbnRyeS9odWIuIElmIHdlIGRvbid0IGRvIHRoaXMsIGJyb3dzZXIgYnVuZGxlcnMgd2lsbCBoYXZlIHRyb3VibGVzIHJlc29sdmluZyBgcmVxdWlyZSgnZG9tYWluJylgLlxuY29uc3QgY2FycmllciA9IGdldE1haW5DYXJyaWVyKCk7XG5pZiAoY2Fycmllci5fX1NFTlRSWV9fKSB7XG4gIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zID0gY2Fycmllci5fX1NFTlRSWV9fLmV4dGVuc2lvbnMgfHwge307XG4gIGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLmRvbWFpbiA9IGNhcnJpZXIuX19TRU5UUllfXy5leHRlbnNpb25zLmRvbWFpbiB8fCBkb21haW47XG59XG4iLCAiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuXG5pbXBvcnQgcHJvZ3JhbSBmcm9tICdjb21tYW5kZXInXG5cbmltcG9ydCB7IGdldENvdW50cnlGbGFnIH0gZnJvbSAnLi9pbmRleCdcbmltcG9ydCAqIGFzIFNlbnRyeSBmcm9tIFwiQHNlbnRyeS9ub2RlXCI7XG5cbi8vIEltcG9ydGluZyBAc2VudHJ5L3RyYWNpbmcgcGF0Y2hlcyB0aGUgZ2xvYmFsIGh1YiBmb3IgdHJhY2luZyB0byB3b3JrLlxuaW1wb3J0ICogYXMgVHJhY2luZyBmcm9tIFwiQHNlbnRyeS90cmFjaW5nXCI7XG5cblNlbnRyeS5pbml0KHtcbiAgZHNuOiBcImh0dHBzOi8vYWVjMDg3M2U3NTBjNDliMDgyZmUzNTk0ZGVmMTVhZjFAbzExMTYxMzIuaW5nZXN0LnNlbnRyeS5pby82MTQ5MjgwXCIsXG5cbiAgLy8gV2UgcmVjb21tZW5kIGFkanVzdGluZyB0aGlzIHZhbHVlIGluIHByb2R1Y3Rpb24sIG9yIHVzaW5nIHRyYWNlc1NhbXBsZXJcbiAgLy8gZm9yIGZpbmVyIGNvbnRyb2xcbiAgdHJhY2VzU2FtcGxlUmF0ZTogMS4wLFxufSk7XG5cbnByb2dyYW1cbiAgLnZlcnNpb24oJzAuMS4wJylcbiAgLm5hbWUoJ2NvdW50cnktZmxhZy1jbGknKVxuICAuY29tbWFuZCgnZ2V0IDxmbGFnPicpXG4gIC5hY3Rpb24oKGZsYWcpID0+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IFNlbnRyeS5zdGFydFRyYW5zYWN0aW9uKHtcbiAgICAgIG9wOiBcImdldCBmbGFnIGZyb20gMiBhbHBoYSBjb2RlXCIsXG4gICAgICBuYW1lOiBcIkdFVCBmbGFnIGZyb20gMiBhbHBoYSBjb2RlXCJcbiAgICB9KVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBnZXRDb3VudHJ5RmxhZyhmbGFnKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKGBGbGFnOiAke2ZsYWd9IFxcblJlc3VsdDogJHtyZXN1bHR9XFxuYClcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgU2VudHJ5LmNhcHR1cmVFeGNlcHRpb24oZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyYW5zYWN0aW9uLmZpbmlzaCgpXG4gICAgfVxuICB9KVxuXG5wcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndilcbiIsICJleHBvcnQgZnVuY3Rpb24gZ2V0Q291bnRyeUZsYWcgKGNvdW50cnlDb2RlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoY291bnRyeUNvZGUubGVuZ3RoICE9IDIpIHsgcmV0dXJuIHVuZGVmaW5lZH1cbiAgcmV0dXJuIGNvdW50cnlDb2RlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLi9nLCBjaGFyID0+IFxuICAgICAgU3RyaW5nLmZyb21Db2RlUG9pbnQoMTI3Mzk3ICsgY2hhci5jaGFyQ29kZUF0KDApKSk7XG59XG4gICJdLAogICJtYXBwaW5ncyI6ICI7cW1CQUFBLG1CQUlBLEdBQUksSUFBZSxRQUFRLFVBQVUsYUFDakMsR0FBUSxRQUFRLGlCQUFpQixNQUNqQyxHQUFPLFFBQVEsUUFDZixHQUFVLEdBQUssUUFDZixHQUFXLEdBQUssU0FDaEIsR0FBSyxRQUFRLE1BTWpCLFFBQVEsUUFBUSxTQUFTLEVBQVMsSUFNbEMsR0FBVSxHQUFPLFFBQVUsR0FBSSxHQU0vQixHQUFRLFFBQVUsRUFNbEIsR0FBUSxPQUFTLEdBVWpCLFlBQWdCLEVBQU8sRUFBYSxDQUNsQyxLQUFLLE1BQVEsRUFDYixLQUFLLFNBQVcsRUFBTSxRQUFRLE1BQVEsRUFDdEMsS0FBSyxTQUFXLEVB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