milkio 1.0.0-beta.36 → 1.0.0-beta.38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.js CHANGED
@@ -2364,9 +2364,18 @@ function __initListener(generated, runtime, executer) {
2364
2364
  return new Response(response.body, response);
2365
2365
  }
2366
2366
  };
2367
+ const streamClosers = new Map;
2367
2368
  const handleMessage = async (port2, options) => {
2368
- if (options === "PING") {
2369
- port2.postMessage("PONG");
2369
+ if (typeof options === "string") {
2370
+ if (options === "PING") {
2371
+ port2.postMessage("PONG");
2372
+ }
2373
+ if (options.startsWith("CLOSE_STREAM:")) {
2374
+ const executeId = options.split("CLOSE_STREAM:")[1];
2375
+ const streamCloser = streamClosers.get(executeId);
2376
+ if (streamCloser)
2377
+ streamCloser("stream");
2378
+ }
2370
2379
  return;
2371
2380
  }
2372
2381
  let routeSchema = trie.get(options.path);
@@ -2395,7 +2404,9 @@ function __initListener(generated, runtime, executer) {
2395
2404
  throw reject("UNACCEPTABLE", { expected: "context.http", message: "This request was invoked through the execute method. Since no actual request was generated, the HTTP methods under the context cannot be accessed." });
2396
2405
  }
2397
2406
  });
2398
- const handleClose = async () => {
2407
+ const handleClose = async (type) => {
2408
+ if (type === "stream")
2409
+ streamClosers.delete(options.executeId);
2399
2410
  runtime.runtime.request.delete(options.executeId);
2400
2411
  for (const handler2 of finales) {
2401
2412
  try {
@@ -2417,7 +2428,7 @@ function __initListener(generated, runtime, executer) {
2417
2428
  paramsType: "raw"
2418
2429
  });
2419
2430
  finales = executed.finales;
2420
- await handleClose();
2431
+ await handleClose("action");
2421
2432
  if (executed.emptyResult) {
2422
2433
  port2.postMessage({
2423
2434
  executeId: options.executeId,
@@ -2445,6 +2456,7 @@ function __initListener(generated, runtime, executer) {
2445
2456
  finales = executed.finales;
2446
2457
  try {
2447
2458
  port2.postMessage({ success: true, data: undefined, executeId: options.executeId, done: false });
2459
+ streamClosers.set(options.executeId, handleClose);
2448
2460
  for await (const value of executed.results.value) {
2449
2461
  const data = { success: true, data: [null, value], executeId: options.executeId, done: false };
2450
2462
  port2.postMessage(data);
@@ -2456,7 +2468,7 @@ function __initListener(generated, runtime, executer) {
2456
2468
  result[exception.code] = exception.reject;
2457
2469
  port2.postMessage({ success: false, data: [c.encode(result), null], executeId: options.executeId, done: true });
2458
2470
  }
2459
- await handleClose();
2471
+ await handleClose("stream");
2460
2472
  }
2461
2473
  } catch (error) {
2462
2474
  throw exceptionHandler(options.executeId, logger, error);
@@ -2532,5 +2544,5 @@ export {
2532
2544
  c as TSON
2533
2545
  };
2534
2546
 
2535
- //# debugId=317A1043AEB4D15664756E2164756E21
2536
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHV0aWxzXFxwYXJ0LnRzIiwgIi4uXFx0eXBlLXNhZmV0eVxcaW5kZXgudHMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcQHNvdXRoZXJuLWF1cm9yYVxcdHNvblxcZGlzdFxcdHNvbi5qcyIsICIuLlxcY29uZmlnXFxpbmRleC50cyIsICIuLlxcdXRpbHNcXGhlYWRlcnMtdG8tanNvbi50cyIsICIuLlxcZXhlY3V0ZVxcaW5kZXgudHMiLCAiLi5cXGJvb3RzdHJhcFxcaW5kZXgudHMiLCAiLi5cXGV2ZW50XFxpbmRleC50cyIsICIuLlxcZmxvd1xcaW5kZXgudHMiLCAiLi5cXGhhbmRsZXJcXGluZGV4LnRzIiwgIi4uXFx1dGlsc1xcY3JlYXRlLWlkLnRzIiwgIi4uXFxleGVjdXRlXFxleGVjdXRlLWlkLWdlbmVyYXRvci50cyIsICIuLlxcd29ybGRcXGluZGV4LnRzIiwgIi4uXFxjb21tYW5kXFxpbmRleC50cyIsICIuLlxcYWN0aW9uXFxpbmRleC50cyIsICIuLlxcc3RyZWFtXFxpbmRleC50cyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcY29uc3RhbnRzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxjb25zdHJ1Y3RGcm9tLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFx0b0RhdGUuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGRlZmF1bHRPcHRpb25zLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mV2Vlay5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZklTT1dlZWsuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGdldElTT1dlZWtZZWFyLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxub3JtYWxpemVEYXRlcy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZkRheS5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mSVNPV2Vla1llYXIuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGlzRGF0ZS5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcaXNWYWxpZC5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZlllYXIuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXGZvcm1hdERpc3RhbmNlLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkRm9ybWF0TG9uZ0ZuLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxmb3JtYXRMb25nLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxmb3JtYXRSZWxhdGl2ZS5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxfbGliXFxidWlsZExvY2FsaXplRm4uanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXGxvY2FsaXplLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTWF0Y2hGbi5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxfbGliXFxidWlsZE1hdGNoUGF0dGVybkZuLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxtYXRjaC5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VUy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZ2V0RGF5T2ZZZWFyLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXRJU09XZWVrLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXRXZWVrWWVhci5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZldlZWtZZWFyLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXRXZWVrLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxhZGRMZWFkaW5nWmVyb3MuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGZvcm1hdFxcbGlnaHRGb3JtYXR0ZXJzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxmb3JtYXRcXGZvcm1hdHRlcnMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGZvcm1hdFxcbG9uZ0Zvcm1hdHRlcnMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXHByb3RlY3RlZFRva2Vucy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZm9ybWF0LmpzIiwgIi4uXFx1dGlsc1xcc2VuZC1jb29rYm9vay1ldmVudC50cyIsICIuLlxcbG9nZ2VyXFxpbmRleC50cyIsICIuLlxcc3RlcFxcaW5kZXgudHMiLCAiLi5cXHV0aWxzXFx0cmllLnRzIiwgIi4uXFxsaXN0ZW5lclxcaW5kZXgudHMiLCAiLi5cXGV4Y2VwdGlvblxcaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IGZ1bmN0aW9uIHBhcnQ8VCBleHRlbmRzICgpID0+IHVua25vd24+KGhhbmRsZXI6IFQpOiBSZXR1cm5UeXBlPFQ+IHtcclxuICByZXR1cm4gaGFuZGxlcigpIGFzIHVua25vd24gYXMgUmV0dXJuVHlwZTxUPjtcclxufVxyXG4iLAogICAgImV4cG9ydCB0eXBlIFR5cGVTYWZldHk8VmFsdWUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiA9ICh2YWx1ZTogVmFsdWUpID0+IFR5cGVTYWZldHlWYWx1ZTtcblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2FmZXR5VmFsdWUge1xuICB0eXBlOiA8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KCkgPT4gVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2FmZXR5VHlwZTxUeXBlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4ge1xuICAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiO1xuICB2YWx1ZTogVHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVTYWZldHk8VmFsdWUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+Pih2YWx1ZTogVmFsdWUpOiBUeXBlU2FmZXR5VmFsdWUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICgpID0+ICh7ICRtaWxraW9UeXBlOiBcInR5cGUtc2FmZXR5XCIsIHZhbHVlIH0pLFxuICB9IGFzIGFueTtcbn1cbiIsCiAgICAiY29uc3QgYyA9IHtcbiAgcnVsZXM6IHtcbiAgICBzdHJpbmdpZnk6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0eXBlb2YgdCA9PSBcImJpZ2ludFwiLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gYHQhYmlnaW50OiR7dC50b1N0cmluZygpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIERhdGUsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFEYXRlOiR7dC50b0lTT1N0cmluZygpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIFVSTCxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IVVSTDoke3QudG9TdHJpbmcoKX1gXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQgaW5zdGFuY2VvZiBSZWdFeHAsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFSZWdFeHA6JHt0LnRvU3RyaW5nKCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgVWludDhBcnJheSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IVVpbnQ4QXJyYXk6JHtuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUodCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFBcnJheUJ1ZmZlcjoke25ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh0KX1gXG4gICAgICB9XG4gICAgXSxcbiAgICBwYXJzZTogW1xuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhYmlnaW50OlwiKSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IEJpZ0ludCh0LnNsaWNlKDkpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IURhdGU6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IERhdGUodC5zbGljZSg3KSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdC5zdGFydHNXaXRoKFwidCFVUkw6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IFVSTCh0LnNsaWNlKDYpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IVJlZ0V4cDpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgUmVnRXhwKHQuc2xpY2UoOSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhVWludDhBcnJheTpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodC5zbGljZSgxMykpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhQXJyYXlCdWZmZXI6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQuc2xpY2UoMTQpKS5idWZmZXJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHN0cmluZ2lmeSh0KSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGMuZW5jb2RlKHQpKTtcbiAgfSxcbiAgcGFyc2UodCkge1xuICAgIHJldHVybiBjLmRlY29kZShKU09OLnBhcnNlKHQpKTtcbiAgfSxcbiAgZW5jb2RlKHQpIHtcbiAgICBmdW5jdGlvbiBuKGUpIHtcbiAgICAgIGlmICghZSB8fCB0eXBlb2YgZSAhPSBcIm9iamVjdFwiICYmIHR5cGVvZiBlICE9IFwiYmlnaW50XCIpXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgc1tpXSA9IG4oZVtpXSk7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIGZvciAoY29uc3QgcyBvZiBjLnJ1bGVzLnN0cmluZ2lmeSlcbiAgICAgICAgaWYgKHMubWF0Y2goZSkpXG4gICAgICAgICAgcmV0dXJuIHMuaGFuZGxlcihlKTtcbiAgICAgIGNvbnN0IHIgPSB7fTtcbiAgICAgIGZvciAodmFyIGEgaW4gZSlcbiAgICAgICAgclthXSA9IG4oZVthXSk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgcmV0dXJuIG4odCk7XG4gIH0sXG4gIGRlY29kZSh0KSB7XG4gICAgZnVuY3Rpb24gbihlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSlcbiAgICAgICAgcmV0dXJuIGUubWFwKG4pO1xuICAgICAgaWYgKHR5cGVvZiBlID09IFwib2JqZWN0XCIgJiYgZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByID0ge307XG4gICAgICAgIGZvciAoY29uc3QgYSBpbiBlKVxuICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkoYSkgJiYgKHJbYV0gPSBuKGVbYV0pKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCByIG9mIGMucnVsZXMucGFyc2UpXG4gICAgICAgICAgaWYgKHIubWF0Y2goZSkgPT09ICEwKVxuICAgICAgICAgICAgcmV0dXJuIHIuaGFuZGxlcihlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgcmV0dXJuIG4odCk7XG4gIH1cbn07XG5leHBvcnQge1xuICBjIGFzIFRTT05cbn07XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBjb25maWc8Q29uZmlnVCBleHRlbmRzIENvbmZpZz4oY29uZmlnOiBDb25maWdUKTogQ29uZmlnVCB7XG4gIHJldHVybiBjb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IChtb2RlOiBzdHJpbmcpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRW52aXJvbm1lbnRzPFQgZXh0ZW5kcyBDb25maWc+IHtcbiAgW2tleTogc3RyaW5nXTogKGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gUGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+PiB8IFByb21pc2U8UGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnZUb1N0cmluZyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gYCR7dmFsdWV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG4gIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvQm9vbGVhbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IGJvb2xlYW4pIHtcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodW5kZWZpbmVkID09PSB2YWx1ZSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBoZWFkZXJzVG9KU09OKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgY29uc3QganNvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoaGVhZGVycyBhcyBhbnkpLmVudHJpZXMoKSkge1xuICAgIGpzb25ba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IElWYWxpZGF0aW9uIH0gZnJvbSBcInR5cGlhXCI7XG5pbXBvcnQgeyBUU09OIH0gZnJvbSBcIkBzb3V0aGVybi1hdXJvcmEvdHNvblwiO1xuaW1wb3J0IHsgcmVqZWN0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7ICRjb250ZXh0LCAkbWV0YSwgTG9nZ2VyLCBSZXN1bHRzLCBHZW5lcmF0ZWRJbml0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBoZWFkZXJzVG9KU09OIH0gZnJvbSBcIi4uL3V0aWxzL2hlYWRlcnMtdG8tanNvbi50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbml0RXhlY3V0ZXIoZ2VuZXJhdGVkOiBHZW5lcmF0ZWRJbml0LCBydW50aW1lOiBhbnkpIHtcbiAgY29uc3QgX19leGVjdXRlID0gYXN5bmMgKFxuICAgIHJvdXRlU2NoZW1hOiBhbnksXG4gICAgb3B0aW9uczoge1xuICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogc3RyaW5nO1xuICAgICAgY3JlYXRlZExvZ2dlcjogTG9nZ2VyO1xuICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IEhlYWRlcnM7XG4gICAgICBtaXhpbkNvbnRleHQ6IFJlY29yZDxhbnksIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgfSAmIChcbiAgICAgIHwge1xuICAgICAgICAgIHBhcmFtczogUmVjb3JkPGFueSwgYW55PjtcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICBwYXJhbXM6IHN0cmluZztcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiO1xuICAgICAgICB9XG4gICAgKSxcbiAgKTogUHJvbWlzZTx7IGV4ZWN1dGVJZDogc3RyaW5nOyBoZWFkZXJzOiBIZWFkZXJzOyBwYXJhbXM6IFJlY29yZDxhbnksIHVua25vd24+OyByZXN1bHRzOiBSZXN1bHRzPGFueT47IGNvbnRleHQ6ICRjb250ZXh0OyBtZXRhOiBSZWFkb25seTwkbWV0YT47IHR5cGU6IFwiYWN0aW9uXCIgfCBcInN0cmVhbVwiOyBlbXB0eVJlc3VsdDogYm9vbGVhbjsgcmVzdWx0c1R5cGVTYWZldHk6IGJvb2xlYW47IGZpbmFsZXM6IEFycmF5PCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+PiB9PiA9PiB7XG4gICAgY29uc3QgZXhlY3V0ZUlkOiBzdHJpbmcgPSBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQ7XG4gICAgbGV0IGhlYWRlcnM6IEhlYWRlcnM7XG4gICAgaWYgKCEob3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuICAgIH1cbiAgICBpZiAoIShcInRvSlNPTlwiIGluIGhlYWRlcnMpKSAoaGVhZGVycyBhcyBhbnkpLnRvSlNPTiA9ICgpID0+IGhlYWRlcnNUb0pTT04oaGVhZGVycyk7XG5cbiAgICBjb25zdCBmaW5hbGVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgY29uc3Qgb25GaW5hbGx5ID0gKGhhbmRsZXI6IGFueSkgPT4gZmluYWxlcy51bnNoaWZ0KGhhbmRsZXIpO1xuXG4gICAgbGV0IHBhcmFtczogUmVjb3JkPGFueSwgdW5rbm93bj47XG4gICAgaWYgKG9wdGlvbnMucGFyYW1zVHlwZSA9PT0gXCJyYXdcIikge1xuICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XG4gICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zLnBhcmFtcyA9PT0gXCJcIikge1xuICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyYW1zID0gVFNPTi5wYXJzZShvcHRpb25zLnBhcmFtcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyYW1zKSkgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiB9KTtcbiAgICBpZiAoXCIkbWlsa2lvR2VuZXJhdGVQYXJhbXNcIiBpbiBwYXJhbXMgJiYgcGFyYW1zLiRtaWxraW9HZW5lcmF0ZVBhcmFtcyA9PT0gXCJlbmFibGVcIikge1xuICAgICAgaWYgKCFydW50aW1lLmRldmVsb3ApIHRocm93IHJlamVjdChcIk5PVF9ERVZFTE9QX01PREVcIiwgXCJUaGlzIGZlYXR1cmUgbXVzdCBiZSBpbiBjb29rYm9vayB0byB1c2UuXCIpO1xuICAgICAgZGVsZXRlIHBhcmFtcy4kbWlsa2lvR2VuZXJhdGVQYXJhbXM7XG4gICAgICBsZXQgcGFyYW1zUmFuZCA9IHJvdXRlU2NoZW1hLnJhbmRvbVBhcmFtcygpO1xuICAgICAgaWYgKHBhcmFtc1JhbmQgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXNSYW5kID09PSBudWxsKSBwYXJhbXNSYW5kID0ge307XG4gICAgICBwYXJhbXMgPSB7IC4uLnBhcmFtc1JhbmQsIC4uLnBhcmFtcyB9O1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMubWl4aW5Db250ZXh0Py5odHRwPy5ub3RGb3VuZCAmJiBvcHRpb25zLm1peGluQ29udGV4dD8uaHR0cD8ucGFyYW1zPy5zdHJpbmcpIG9wdGlvbnMubWl4aW5Db250ZXh0Lmh0dHAucGFyYW1zLnBhcnNlZCA9IHBhcmFtczsgLy8gbGlzdGVuIOOBp+ODkeODvOOCueOBl+OBn+ODkeODqeODoeODvOOCv+OCkua4oeOBmVxuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAuLi4ob3B0aW9ucy5taXhpbkNvbnRleHQgPyBvcHRpb25zLm1peGluQ29udGV4dCA6IHt9KSxcbiAgICAgIGRldmVsb3A6IHJ1bnRpbWUuZGV2ZWxvcCxcbiAgICAgIHBhdGg6IG9wdGlvbnMucGF0aCxcbiAgICAgIGxvZ2dlcjogb3B0aW9ucy5jcmVhdGVkTG9nZ2VyLFxuICAgICAgZW1pdDogcnVudGltZS5lbWl0LFxuICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQsXG4gICAgICBjb25maWc6IHJ1bnRpbWUucnVudGltZS5jb25maWcsXG4gICAgICBjYWxsOiAobW9kdWxlOiBhbnksIG9wdGlvbnM6IGFueSkgPT4gX19jYWxsKGNvbnRleHQsIG1vZHVsZSwgb3B0aW9ucyksXG4gICAgICBvbkZpbmFsbHk6IG9uRmluYWxseSxcbiAgICAgIF86IHJ1bnRpbWUsXG4gICAgfSBhcyB1bmtub3duIGFzICRjb250ZXh0O1xuICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8YW55PiA9IHsgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXG4gICAgY29uc3QgbW9kdWxlID0gcm91dGVTY2hlbWEubW9kdWxlO1xuICAgIGNvbnN0IG1ldGEgPSAobW9kdWxlLmRlZmF1bHQ/Lm1ldGEgPyBtb2R1bGUuZGVmYXVsdD8ubWV0YSA6IHt9KSBhcyB1bmtub3duIGFzIFJlYWRvbmx5PCRtZXRhPjtcblxuICAgIGlmIChtZXRhLnR5cGVTYWZldHkgPT09IHVuZGVmaW5lZCB8fCBtZXRhLnR5cGVTYWZldHkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSByb3V0ZVNjaGVtYS52YWxpZGF0ZVBhcmFtcyhwYXJhbXMpIGFzIElWYWxpZGF0aW9uPGFueT47XG4gICAgICBpZiAoIXZhbGlkYXRpb24uc3VjY2VzcykgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfSU5DT1JSRUNUXCIsIHsgLi4udmFsaWRhdGlvbi5lcnJvcnNbMF0sIG1lc3NhZ2U6IGBUaGUgdmFsdWUgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0ucGF0aH0nIGlzICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLnZhbHVlfScsIHdoaWNoIGRvZXMgbm90IG1lZXQgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0uZXhwZWN0ZWR9JyByZXF1aXJlbWVudHMuYCB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IGV4ZWN1dGVJZDogb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkLCBsb2dnZXI6IG9wdGlvbnMuY3JlYXRlZExvZ2dlciwgcGF0aDogb3B0aW9ucy5wYXRoLCBtZXRhLCBjb250ZXh0IH0pO1xuXG4gICAgcmVzdWx0cy52YWx1ZSA9IGF3YWl0IG1vZHVsZS5kZWZhdWx0LmhhbmRsZXIoY29udGV4dCwgcGFyYW1zKTtcblxuICAgIGxldCByZXN1bHRzVHlwZVNhZmV0eSA9IGZhbHNlO1xuICAgIGlmIChyZXN1bHRzPy52YWx1ZT8uJG1pbGtpb1R5cGUgPT09IFwidHlwZS1zYWZldHlcIikge1xuICAgICAgcmVzdWx0c1R5cGVTYWZldHkgPSB0cnVlO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUmVzdWx0cyhyZXN1bHRzLnZhbHVlLnZhbHVlKSBhcyBJVmFsaWRhdGlvbjxhbnk+O1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHRocm93IHJlamVjdChcIlJFU1VMVFNfVFlQRV9JTkNPUlJFQ1RcIiwgeyAuLi52YWxpZGF0aW9uLmVycm9yc1swXSwgbWVzc2FnZTogYFRoZSB2YWx1ZSAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS5wYXRofScgaXMgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0udmFsdWV9Jywgd2hpY2ggZG9lcyBub3QgbWVldCAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS5leHBlY3RlZH0nIHJlcXVpcmVtZW50cy5gIH0pO1xuICAgICAgcmVzdWx0cy52YWx1ZSA9IHJlc3VsdHMudmFsdWUudmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGVtcHR5UmVzdWx0ID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRzLnZhbHVlID09PSBudWxsIHx8IHJlc3VsdHMudmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIGVtcHR5UmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdHMudmFsdWUgPSB7fTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0cy52YWx1ZSkpIHtcbiAgICAgIHRocm93IHJlamVjdChcIkZBSUxcIiwgXCJUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBvYmplY3QsIHdoaWNoIGlzIGN1cnJlbnRseSBhbiBhcnJheS5cIik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0cy52YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgcmVqZWN0KFwiRkFJTFwiLCBcIlRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlIGFuIG9iamVjdCwgd2hpY2ggaXMgY3VycmVudGx5IGEgcHJpbWl0aXZlIHR5cGUuXCIpO1xuICAgIH1cblxuICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIiwgeyBleGVjdXRlSWQ6IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZCwgbG9nZ2VyOiBvcHRpb25zLmNyZWF0ZWRMb2dnZXIsIHBhdGg6IG9wdGlvbnMucGF0aCwgbWV0YSwgY29udGV4dCwgcmVzdWx0cyB9KTtcblxuICAgIHJldHVybiB7IGV4ZWN1dGVJZCwgaGVhZGVycywgcGFyYW1zLCByZXN1bHRzLCBjb250ZXh0LCBtZXRhLCB0eXBlOiBtb2R1bGUuJG1pbGtpb1R5cGUsIGVtcHR5UmVzdWx0LCByZXN1bHRzVHlwZVNhZmV0eSwgZmluYWxlcyB9O1xuICB9O1xuXG4gIGNvbnN0IF9fY2FsbCA9IGFzeW5jIChjb250ZXh0OiAkY29udGV4dCwgbW9kdWxlOiB7IGRlZmF1bHQ6IGFueSB9LCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgIGNvbnN0IG1vZHVsZUF3YWl0ZWQgPSBhd2FpdCBtb2R1bGU7XG4gICAgcmV0dXJuIGF3YWl0IG1vZHVsZUF3YWl0ZWQuZGVmYXVsdC5oYW5kbGVyKGNvbnRleHQsIHBhcmFtcyk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBfX2NhbGwsXG4gICAgX19leGVjdXRlLFxuICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE1pbGtpb1dvcmxkIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYm9vdHN0cmFwPEJvb3RzdHJhcEluaXRUIGV4dGVuZHMgQm9vdHN0cmFwSW5pdD4oaW5pdDogQm9vdHN0cmFwSW5pdFQpOiBCb290c3RyYXBJbml0VCB7XHJcbiAgcmV0dXJuIGluaXQ7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEJvb3RzdHJhcEluaXQgPSAod29ybGQ6IE1pbGtpb1dvcmxkKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcclxuIiwKICAgICJpbXBvcnQgdHlwZSB7ICRjb250ZXh0LCBDb250ZXh0SHR0cCwgUmVzdWx0cywgTG9nZ2VyLCAkbWV0YSB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlICRldmVudHMge1xuICBcIm1pbGtpbzpodHRwUmVxdWVzdFwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB9O1xuICBcIm1pbGtpbzpodHRwUmVzcG9uc2VcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj47IGNvbnRleHQ6ICRjb250ZXh0IH07XG4gIFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB9O1xuICBcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCI6IHsgZXhlY3V0ZUlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbG9nZ2VyOiBMb2dnZXI7IG1ldGE6ICRtZXRhOyBjb250ZXh0OiAkY29udGV4dCB9O1xuICBcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgbWV0YTogJG1ldGE7IGNvbnRleHQ6ICRjb250ZXh0OyByZXN1bHRzOiBSZXN1bHRzPGFueT4gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdEV2ZW50TWFuYWdlcigpIHtcbiAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGluZGV4ZWQgPSBuZXcgTWFwPHN0cmluZywgU2V0PChldmVudDogYW55KSA9PiB2b2lkPj4oKTtcblxuICBjb25zdCBldmVudE1hbmFnZXIgPSB7XG4gICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiAkZXZlbnRzW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB7XG4gICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICBpZiAoaW5kZXhlZC5oYXMoa2V5IGFzIHN0cmluZykgPT09IGZhbHNlKSB7XG4gICAgICAgIGluZGV4ZWQuc2V0KGtleSBhcyBzdHJpbmcsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICBzZXQuYWRkKGhhbmRsZXIpO1xuICAgICAgaGFuZGxlcnMuc2V0KGhhbmRsZXIsIGtleSBhcyBzdHJpbmcpO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICB9O1xuICAgIH0sXG4gICAgb2ZmOiA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogJGV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XG4gICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9LFxuICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBWYWx1ZSBleHRlbmRzICRldmVudHNbS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgaWYgKGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvRmxvdzxULCBUUmV0dXJuID0gYW55LCBUTmV4dCA9IGFueT4gPSB7XHJcbiAgZW1pdDogKGZsb3c6IFQpID0+IHZvaWQ7XHJcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gTWlsa2lvRmxvdzxUPjtcclxuICBuZXh0KC4uLlt2YWx1ZV06IFtdIHwgW1ROZXh0XSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xyXG4gIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcclxuICB0aHJvdyhlcnJvcjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvdzxUPigpOiBNaWxraW9GbG93PFQ+IHtcclxuICBsZXQgc3RhdHVzOiBcInBlbmRpbmdcIiB8IFwicmVzb2x2ZWRcIiB8IFwicmVqZWN0ZWRcIiA9IFwicGVuZGluZ1wiO1xyXG4gIGNvbnN0IGZsb3dzOiBBcnJheTx7XHJcbiAgICBibGFuazogYm9vbGVhbjtcclxuICAgIHByb21pc2U6IFByb21pc2U8VD47XHJcbiAgICByZXNvbHZlOiAodmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XHJcbiAgICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XHJcbiAgfT4gPSBbXTtcclxuXHJcbiAgY29uc3QgaXRlcmF0b3IgPSB7XHJcbiAgICBlbWl0OiAoZmxvdzogVCkgPT4ge1xyXG4gICAgICBpZiAoZmxvd3MuYXQoLTEpPy5ibGFuayA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBmbG93cy5hdCgtMSkhO1xyXG4gICAgICAgIGl0ZW0uYmxhbmsgPSBmYWxzZTtcclxuICAgICAgICBpdGVtLnJlc29sdmUoZmxvdyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVyczxUPigpO1xyXG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGZsb3cpO1xyXG4gICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiBmYWxzZSB9IGFzIGFueSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAuLi4oe1xyXG4gICAgICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcclxuICAgICAgICBpZiAoc3RhdHVzICE9PSBcInBlbmRpbmdcIikgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcclxuICAgICAgICBpZiAoZmxvd3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcclxuICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IGZsb3dzLmF0KDApITtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbG93LnByb21pc2U7XHJcbiAgICAgICAgZmxvd3Muc2hpZnQoKTtcclxuICAgICAgICByZXR1cm4geyBkb25lOiBzdGF0dXMgIT09IFwicGVuZGluZ1wiLCB2YWx1ZTogcmVzdWx0IH07XHJcbiAgICAgIH0sXHJcbiAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XHJcbiAgICAgICAgc3RhdHVzID0gXCJyZXNvbHZlZFwiO1xyXG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xyXG4gICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xyXG4gICAgICAgICAgZmxvdy5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XHJcbiAgICAgIH0sXHJcbiAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xyXG4gICAgICAgIHN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcclxuICAgICAgICBpZiAoZmxvd3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcclxuICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XHJcbiAgICAgICAgICBmbG93LmJsYW5rID0gZmFsc2U7XHJcbiAgICAgICAgICBmbG93LnJlamVjdChlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xyXG4gICAgICB9LFxyXG4gICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXHJcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIGl0ZXJhdG9yIGFzIE1pbGtpb0Zsb3c8VD47XHJcbn1cclxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE1pbGtpb1dvcmxkIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlcjxIYW5kbGVySW5pdFQgZXh0ZW5kcyBIYW5kbGVySW5pdD4oaW5pdDogSGFuZGxlckluaXRUKTogSGFuZGxlckluaXRUIHtcclxuICByZXR1cm4gaW5pdDtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSGFuZGxlckluaXQgPSAod29ybGQ6IE1pbGtpb1dvcmxkKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcclxuIiwKICAgICJ0eXBlIElkR2VuZXJhdG9yT3B0aW9ucyA9IHtcbiAgbGVuZ3RoPzogbnVtYmVyO1xuICB0aW1lc3RhbXA6IGJvb2xlYW47XG4gIHNlcXVlbnRpYWw6IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBkZWZpbmVJZEdlbmVyYXRvcihvcHRpb25zOiBJZEdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLmxlbmd0aCkgb3B0aW9ucy5sZW5ndGggPSAyNDtcbiAgaWYgKG9wdGlvbnMubGVuZ3RoIDwgMSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsZW5ndGhcIik7XG4gIGlmIChvcHRpb25zLmxlbmd0aCA+IDYxKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxlbmd0aFwiKTtcbiAgaWYgKG9wdGlvbnMudGltZXN0YW1wICYmIG9wdGlvbnMubGVuZ3RoIDwgOSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsZW5ndGhcIik7XG4gIGxldCBsYXN0VGltZSA9IDA7XG4gIGxldCBsYXN0RGVjaW1hbCA9IDBuO1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZUlkKCkge1xuICAgICAgbGV0IHJhbmRMZW5ndGggPSBvcHRpb25zLmxlbmd0aCE7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IGlkID0gXCJcIjtcbiAgICAgIGlmIChvcHRpb25zLnRpbWVzdGFtcCkge1xuICAgICAgICByYW5kTGVuZ3RoIC09IDg7XG4gICAgICAgIGlkID0gYCR7aWR9JHtfX2JpZ0ludFRvU3RyaW5nKEJpZ0ludChub3cpKS5wYWRTdGFydCg4LCBcIjBcIil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnNlcXVlbnRpYWwgJiYgbGFzdFRpbWUgPT09IG5vdykge1xuICAgICAgICBpZCA9IGAke2lkfSR7X19iaWdJbnRUb1N0cmluZygrK2xhc3REZWNpbWFsKS5wYWRTdGFydCgxLCBcIjBcIil9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxhc3RUaW1lID0gbm93O1xuICAgICAgICBjb25zdCBtaW4gPSAwbjtcbiAgICAgICAgY29uc3QgbWF4ID0gX19nZXRNYXhWYWx1ZShCaWdJbnQocmFuZExlbmd0aCkpO1xuICAgICAgICBsYXN0RGVjaW1hbCA9IF9fc2VjdXJlUmFuZG9tQmlnSW50KG1pbiwgbWF4KTtcbiAgICAgICAgaWQgPSBgJHtpZH0ke19fYmlnSW50VG9TdHJpbmcobGFzdERlY2ltYWwpLnBhZFN0YXJ0KHJhbmRMZW5ndGgsIFwiMFwiKX1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkO1xuICAgIH0sXG4gICAgZ2V0SWRUaW1lc3RhbXAoaWQ6IHN0cmluZykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMudGltZXN0YW1wID8gTnVtYmVyKF9fc3RyaW5nVG9CaWdJbnQoaWQuc2xpY2UoMCwgOCkucmVwbGFjZUFsbChcIjBcIiwgXCJcIikpKSA6IDA7XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgRU5DT0RJTkcgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG5cbmZ1bmN0aW9uIF9fc2VjdXJlUmFuZG9tQmlnSW50KG1pbjogYmlnaW50LCBtYXg6IGJpZ2ludCk6IGJpZ2ludCB7XG4gIGlmIChtaW4gPj0gbWF4KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJhbmdlXCIpO1xuXG4gIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluICsgMW47XG4gIGNvbnN0IGJ5dGVDb3VudCA9IE1hdGguY2VpbChOdW1iZXIoQmlnSW50KHJhbmdlLnRvU3RyaW5nKDIpLmxlbmd0aCkpIC8gOCk7XG4gIGNvbnN0IGVudHJvcHlCeXRlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVDb3VudCk7XG5cbiAgbGV0IHJhbmRvbVZhbHVlOiBiaWdpbnQ7XG4gIGRvIHtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGVudHJvcHlCeXRlcyk7XG4gICAgcmFuZG9tVmFsdWUgPVxuICAgICAgQmlnSW50KFxuICAgICAgICBgMHgke0FycmF5LmZyb20oZW50cm9weUJ5dGVzKVxuICAgICAgICAgIC5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSlcbiAgICAgICAgICAuam9pbihcIlwiKX1gLFxuICAgICAgKSAlIHJhbmdlO1xuICB9IHdoaWxlIChyYW5kb21WYWx1ZSA8IDBuKTtcblxuICByZXR1cm4gbWluICsgcmFuZG9tVmFsdWU7XG59XG5cbmZ1bmN0aW9uIF9fYmlnSW50VG9TdHJpbmcodmFsdWU6IGJpZ2ludCk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBCaWdJbnQoRU5DT0RJTkcubGVuZ3RoKTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCBjdXJyZW50ID0gdmFsdWU7XG5cbiAgaWYgKGN1cnJlbnQgPT09IDBuKSByZXR1cm4gRU5DT0RJTkdbMF07XG5cbiAgd2hpbGUgKGN1cnJlbnQgPiAwbikge1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IGN1cnJlbnQgJSBiYXNlO1xuICAgIHJlc3VsdCA9IEVOQ09ESU5HW051bWJlcihyZW1haW5kZXIpXSArIHJlc3VsdDtcbiAgICBjdXJyZW50ID0gY3VycmVudCAvIGJhc2U7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gX19zdHJpbmdUb0JpZ0ludChzdHI6IHN0cmluZyk6IGJpZ2ludCB7XG4gIGNvbnN0IGNoYXJNYXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBFTkNPRElORy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJNYXBbRU5DT0RJTkdbaV1dID0gaTtcbiAgfVxuXG4gIGNvbnN0IGJhc2UgPSBCaWdJbnQoRU5DT0RJTkcubGVuZ3RoKTtcbiAgbGV0IHJlc3VsdCA9IDBuO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhciA9IHN0cltpXTtcbiAgICBpZiAoIShjaGFyIGluIGNoYXJNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyICcke2NoYXJ9JyBpbiBpbnB1dCBzdHJpbmdgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBCaWdJbnQoY2hhck1hcFtjaGFyXSk7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gX19nZXRNYXhWYWx1ZShuOiBiaWdpbnQpOiBiaWdpbnQge1xuICByZXR1cm4gQmlnSW50KEVOQ09ESU5HLmxlbmd0aCkgKiogbiAtIDFuO1xufVxuXG5jb25zdCBpZEdlbmVyYXRvciA9IGRlZmluZUlkR2VuZXJhdG9yKHsgbGVuZ3RoOiAyNCwgdGltZXN0YW1wOiBmYWxzZSwgc2VxdWVudGlhbDogZmFsc2UgfSk7XG5cbmV4cG9ydCBjb25zdCBfX2NyZWF0ZUlkID0gaWRHZW5lcmF0b3IuY3JlYXRlSWQ7XG4iLAogICAgImltcG9ydCB7IF9fY3JlYXRlSWQgfSBmcm9tIFwiLi4vdXRpbHMvY3JlYXRlLWlkLnRzXCI7XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVJZEdlbmVyYXRvciA9IChoZWFkZXJzPzogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvcigpIHtcbiAgcmV0dXJuIF9fY3JlYXRlSWQ7XG59XG4iLAogICAgImltcG9ydCB7IHR5cGUgJHR5cGVzLCBfX2luaXRDb21tYW5kZXIsIF9faW5pdExpc3RlbmVyLCBfX2luaXRFeGVjdXRlciwgX19pbml0RXZlbnRNYW5hZ2VyLCB0eXBlIEV4ZWN1dGVJZCwgdHlwZSBMb2dnZXIsIHR5cGUgTWl4aW4sIHR5cGUgR2VuZXJhdGVkSW5pdCwgdHlwZSBQaW5nLCB0eXBlIExvZ2dlclN1Ym1pdHRpbmdIYW5kbGVyLCB0eXBlIExvZ2dlckluc2VydGluZ0hhbmRsZXIgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IgfSBmcm9tIFwiLi4vZXhlY3V0ZS9leGVjdXRlLWlkLWdlbmVyYXRvci50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pbGtpb0luaXQge1xuICBwb3J0OiBudW1iZXI7XG4gIGRldmVsb3A6IGJvb2xlYW47XG4gIGNvb2tib29rOiB7XG4gICAgY29va2Jvb2tQb3J0OiBudW1iZXI7XG4gIH07XG4gIGNvcnM/OiB7XG4gICAgY29yc0FsbG93TWV0aG9kcz86IHN0cmluZztcbiAgICBjb3JzQWxsb3dIZWFkZXJzPzogc3RyaW5nO1xuICAgIGNvcnNBbGxvd09yaWdpbj86IHN0cmluZztcbiAgfTtcbiAgaWdub3JlUGF0aExldmVsPzogbnVtYmVyO1xuICByZWFsSXA/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nO1xuICBleGVjdXRlSWQ/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICBvbkxvZ2dlclN1Ym1pdHRpbmc/OiBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlcjtcbiAgb25Mb2dnZXJJbnNlcnRpbmc/OiBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyO1xuICBib290c3RyYXBzPzogQXJyYXk8KHdvcmxkOiBNaWxraW9Xb3JsZCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+O1xufVxuXG5leHBvcnQgdHlwZSBNaWxraW9SdW50aW1lSW5pdDxUIGV4dGVuZHMgTWlsa2lvSW5pdD4gPSBNaXhpbjxcbiAgVCxcbiAge1xuICAgIGV4ZWN1dGVJZDogKGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgICBydW50aW1lOiB7XG4gICAgICByZXF1ZXN0OiBNYXA8RXhlY3V0ZUlkLCB7IGxvZ2dlcjogTG9nZ2VyIH0+O1xuICAgICAgY29uZmlnOiBBd2FpdGVkPFJldHVyblR5cGU8JHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wiY29uZmlnU2NoZW1hXCJdPj47XG4gICAgICBhcHA6IGFueTtcbiAgICB9O1xuICAgIG9uOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib25cIl07XG4gICAgb2ZmOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib2ZmXCJdO1xuICAgIGVtaXQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJlbWl0XCJdO1xuICB9XG4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ybGQ8TWlsa2lvT3B0aW9ucyBleHRlbmRzIE1pbGtpb0luaXQ+KGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgY29uZmlnU2NoZW1hOiB7IGdldDogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+PiB9LCBvcHRpb25zOiBNaWxraW9PcHRpb25zKTogUHJvbWlzZTxNaWxraW9Xb3JsZDxNaWxraW9PcHRpb25zPj4ge1xuICBjb25zdCBleGVjdXRlSWQgPSBvcHRpb25zLmV4ZWN1dGVJZCA/PyBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yKCk7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGNvbmZpZ1NjaGVtYS5nZXQoKTtcblxuICBjb25zdCBydW50aW1lID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBNYXAoKSxcbiAgICBjb25maWcsXG4gIH0gYXMgTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz5bXCJydW50aW1lXCJdO1xuXG4gIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xuXG4gIGNvbnN0IF86IE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb09wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZXhlY3V0ZUlkLFxuICAgIHJ1bnRpbWUsXG4gICAgb246IGV2ZW50TWFuYWdlci5vbixcbiAgICBvZmY6IGV2ZW50TWFuYWdlci5vZmYsXG4gICAgZW1pdDogZXZlbnRNYW5hZ2VyLmVtaXQsXG4gIH07XG5cbiAgY29uc3QgZXhlY3V0ZXIgPSBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQsIF8pO1xuICBjb25zdCBjb21tYW5kZXIgPSBfX2luaXRDb21tYW5kZXIoZ2VuZXJhdGVkLCBfKTtcbiAgY29uc3QgbGlzdGVuZXIgPSBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQsIF8sIGV4ZWN1dGVyKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSBhcHBcbiAgY29uc3Qgd29ybGQgPSB7XG4gICAgXyxcbiAgICAvLyBldmVudCBtYW5hZ2VyXG4gICAgb246IGV2ZW50TWFuYWdlci5vbixcbiAgICBvZmY6IGV2ZW50TWFuYWdlci5vZmYsXG4gICAgZW1pdDogZXZlbnRNYW5hZ2VyLmVtaXQsXG4gICAgLy8gY29tbWFuZGVyXG4gICAgY29tbWFuZGVyLFxuICAgIC8vIGxpc3RlbmVyXG4gICAgbGlzdGVuZXIsXG4gICAgLy8gZnVuY3Rpb25cbiAgICBjb25maWcsXG4gIH07XG5cbiAgcnVudGltZS5hcHAgPSB3b3JsZDtcblxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmJvb3RzdHJhcHMpKSB7XG4gICAgZm9yIChjb25zdCBib290c3RyYXAgb2Ygb3B0aW9ucy5ib290c3RyYXBzKSB7XG4gICAgICBhd2FpdCBib290c3RyYXAod29ybGQgYXMgTWlsa2lvV29ybGQ8TWlsa2lvT3B0aW9ucz4pO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKGdlbmVyYXRlZC5oYW5kbGVyU2NoZW1hLmxvYWRIYW5kbGVycyh3b3JsZCkpO1xuXG4gIHJldHVybiB3b3JsZCBhcyBNaWxraW9Xb3JsZDxNaWxraW9PcHRpb25zPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Xb3JsZDxNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdCA9IE1pbGtpb0luaXQ+IHtcbiAgXzogTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz47XG4gIC8vIGV2ZW50IG1hbmFnZXJcbiAgb246IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJvblwiXTtcbiAgb2ZmOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib2ZmXCJdO1xuICBlbWl0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiZW1pdFwiXTtcbiAgcGluZzogKG9wdGlvbnM/OiB7IHRpbWVvdXQ/OiBudW1iZXIgfSkgPT4gUHJvbWlzZTxQaW5nPjtcbiAgLy8gY29tbWFuZGVyXG4gIGNvbW1hbmRlcjogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRDb21tYW5kZXI+PjtcbiAgLy8gbGlzdGVuZXJcbiAgbGlzdGVuZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0TGlzdGVuZXI+PjtcbiAgY29uZmlnOiBSZWFkb25seTxBd2FpdGVkPFJldHVyblR5cGU8JHR5cGVzW1wiY29uZmlnU2NoZW1hXCJdW1wiZ2V0XCJdPj4+O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZEluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1hbmQ8Q29tbWFuZEluaXRUIGV4dGVuZHMgQ29tbWFuZEluaXQ+KGluaXQ6IENvbW1hbmRJbml0VCk6IENvbW1hbmQ8Q29tbWFuZEluaXRUPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBpbml0IGFzIHVua25vd24gYXMgQ29tbWFuZDxDb21tYW5kSW5pdFQ+O1xuICBjb21tYW5kLiRtaWxraW9UeXBlID0gXCJjb21tYW5kXCI7XG4gIHJldHVybiBjb21tYW5kO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRJbml0IHtcbiAgaGFuZGxlcjogKGNvbW1hbmRzOiBBcnJheTxzdHJpbmc+LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmQ8Q29tbWFuZEluaXRUIGV4dGVuZHMgQ29tbWFuZEluaXQ+IHtcbiAgJG1pbGtpb1R5cGU6IFwiY29tbWFuZFwiO1xuICBoYW5kbGVyOiBDb21tYW5kSW5pdFRbXCJoYW5kbGVyXCJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbml0Q29tbWFuZGVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55KSB7XG4gIGNvbnN0IGNvbW1hbmRlciA9IGFzeW5jIChhcmd2OiBBcnJheTxzdHJpbmc+LCBvcHRpb25zPzogeyBvbk5vdEZvdW5kPzogKCkgPT4gYW55IH0pID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBwYXRoOiBcImluZGV4XCIsXG4gICAgICBjb21tYW5kczogW10gYXMgQXJyYXk8c3RyaW5nPixcbiAgICAgIG9wdGlvbnM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHRydWU+LFxuICAgIH07XG4gICAgZm9yIChjb25zdCB2IG9mIGFyZ3Yuc2xpY2UoMykpIHtcbiAgICAgIGlmICh2LnN0YXJ0c1dpdGgoXCItLVwiKSAmJiB2LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCB2U3BsaXRlZCA9IHYuc3BsaXQoXCI9XCIpO1xuICAgICAgICBwYXJhbXMub3B0aW9uc1t2U3BsaXRlZFswXS5zbGljZSgyKV0gPSB2U3BsaXRlZC5zbGljZSgxLCB2U3BsaXRlZC5sZW5ndGgpLmpvaW4oXCI9XCIpO1xuICAgICAgfSBlbHNlIGlmICh2LnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgICBwYXJhbXMub3B0aW9uc1t2LnNsaWNlKDIpXSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIGlmICh2LnN0YXJ0c1dpdGgoXCItXCIpICYmIHYuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgIGNvbnN0IHZTcGxpdGVkID0gdi5zcGxpdChcIj1cIik7XG4gICAgICAgIHBhcmFtcy5vcHRpb25zW3ZTcGxpdGVkWzBdLnNsaWNlKDEpXSA9IHZTcGxpdGVkLnNsaWNlKDEsIHZTcGxpdGVkLmxlbmd0aCkuam9pbihcIj1cIik7XG4gICAgICB9IGVsc2UgaWYgKHYuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgcGFyYW1zLm9wdGlvbnNbdi5zbGljZSgxKV0gPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5jb21tYW5kcy5wdXNoKHYpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXJndi5sZW5ndGggPT09IDIpIHBhcmFtcy5wYXRoID0gXCJpbmRleFwiO1xuICAgIGVsc2UgcGFyYW1zLnBhdGggPSBgJHthcmd2WzJdID8/IFwiaW5kZXhcIn1gO1xuXG4gICAgaWYgKCEocGFyYW1zLnBhdGggaW4gZ2VuZXJhdGVkLmNvbW1hbmRTY2hlbWEuY29tbWFuZHMpKSB7XG4gICAgICBpZiAob3B0aW9ucz8ub25Ob3RGb3VuZCkgcmV0dXJuIGF3YWl0IG9wdGlvbnMub25Ob3RGb3VuZCgpO1xuICAgICAgY29uc29sZS5sb2coYFxceDFCWzQ0bSBVd1UgXFx4MUJbMG0gXFx4MUJbMm1Db21tYW5kIG5vdCBmb3VuZDpcXHgxQlswbSBcXHgxQlszMm0ke3BhcmFtcy5wYXRofVxceDFCWzBtYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZWQuY29tbWFuZFNjaGVtYS5jb21tYW5kc1twYXJhbXMucGF0aF0ubW9kdWxlLmhhbmRsZXIocGFyYW1zLmNvbW1hbmRzLCBwYXJhbXMub3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1hbmRlcjtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgJG1ldGEgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFjdGlvbjxBY3Rpb25Jbml0VCBleHRlbmRzIEFjdGlvbkluaXQ+KGluaXQ6IEFjdGlvbkluaXRUKTogQWN0aW9uPEFjdGlvbkluaXRUPiB7XG4gIGNvbnN0IGFjdGlvbiA9IGluaXQgYXMgdW5rbm93biBhcyBBY3Rpb248QWN0aW9uSW5pdFQ+O1xuICBhY3Rpb24uJG1pbGtpb1R5cGUgPSBcImFjdGlvblwiO1xuICBpZiAoYWN0aW9uLm1ldGEgPT09IHVuZGVmaW5lZCkgYWN0aW9uLm1ldGEgPSB7fTtcbiAgcmV0dXJuIGFjdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9uSW5pdCA9IHtcbiAgbWV0YT86ICRtZXRhO1xuICBoYW5kbGVyOiAoY29udGV4dDogJGNvbnRleHQsIHBhcmFtczogYW55KSA9PiBQcm9taXNlPHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgQWN0aW9uPEFjdGlvbkluaXRUIGV4dGVuZHMgQWN0aW9uSW5pdD4gPSB7XG4gICRtaWxraW9UeXBlOiBcImFjdGlvblwiO1xuICBtZXRhOiBBY3Rpb25Jbml0VFtcIm1ldGFcIl0gZXh0ZW5kcyB1bmRlZmluZWQgPyB7fSA6IEFjdGlvbkluaXRUW1wibWV0YVwiXTtcbiAgaGFuZGxlcjogQWN0aW9uSW5pdFRbXCJoYW5kbGVyXCJdO1xufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgJG1ldGEgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbTxTdHJlYW1Jbml0VCBleHRlbmRzIFN0cmVhbUluaXQ+KGluaXQ6IFN0cmVhbUluaXRUKTogU3RyZWFtPFN0cmVhbUluaXRUPiB7XG4gIGNvbnN0IHN0cmVhbSA9IGluaXQgYXMgdW5rbm93biBhcyBTdHJlYW08U3RyZWFtSW5pdFQ+O1xuICBzdHJlYW0uJG1pbGtpb1R5cGUgPSBcInN0cmVhbVwiO1xuICBpZiAoc3RyZWFtLm1ldGEgPT09IHVuZGVmaW5lZCkgc3RyZWFtLm1ldGEgPSB7fTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuZXhwb3J0IHR5cGUgU3RyZWFtSW5pdCA9IHtcbiAgbWV0YT86ICRtZXRhO1xuICBoYW5kbGVyOiAoY29udGV4dDogJGNvbnRleHQsIHBhcmFtczogYW55KSA9PiBBc3luY0dlbmVyYXRvcjx1bmtub3duPjtcbn07XG5cbmV4cG9ydCB0eXBlIFN0cmVhbTxTdHJlYW1Jbml0VCBleHRlbmRzIFN0cmVhbUluaXQ+ID0ge1xuICAkbWlsa2lvVHlwZTogXCJzdHJlYW1cIjtcbiAgbWV0YTogU3RyZWFtSW5pdFRbXCJtZXRhXCJdIGV4dGVuZHMgdW5kZWZpbmVkID8ge30gOiBTdHJlYW1Jbml0VFtcIm1ldGFcIl07XG4gIGhhbmRsZXI6IFN0cmVhbUluaXRUW1wiaGFuZGxlclwiXTtcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IFVzZWZ1bCBjb25zdGFudHNcbiAqIEBkZXNjcmlwdGlvblxuICogQ29sbGVjdGlvbiBvZiB1c2VmdWwgZGF0ZSBjb25zdGFudHMuXG4gKlxuICogVGhlIGNvbnN0YW50cyBjb3VsZCBiZSBpbXBvcnRlZCBmcm9tIGBkYXRlLWZucy9jb25zdGFudHNgOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtYXhUaW1lLCBtaW5UaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGZ1bmN0aW9uIGlzQWxsb3dlZFRpbWUodGltZSkge1xuICogICByZXR1cm4gdGltZSA8PSBtYXhUaW1lICYmIHRpbWUgPj0gbWluVGltZTtcbiAqIH1cbiAqIGBgYFxuICovXG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBkYXlzSW5XZWVrXG4gKiBAc3VtbWFyeSBEYXlzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IGRheXNJbldlZWsgPSA3O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luWWVhclxuICogQHN1bW1hcnkgRGF5cyBpbiAxIHllYXIuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIb3cgbWFueSBkYXlzIGluIGEgeWVhci5cbiAqXG4gKiBPbmUgeWVhcnMgZXF1YWxzIDM2NS4yNDI1IGRheXMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOlxuICpcbiAqID4gTGVhcCB5ZWFyIG9jY3VycyBldmVyeSA0IHllYXJzLCBleGNlcHQgZm9yIHllYXJzIHRoYXQgYXJlIGRpdmlzaWJsZSBieSAxMDAgYW5kIG5vdCBkaXZpc2libGUgYnkgNDAwLlxuICogPiAxIG1lYW4geWVhciA9ICgzNjUrMS80LTEvMTAwKzEvNDAwKSBkYXlzID0gMzY1LjI0MjUgZGF5c1xuICovXG5leHBvcnQgY29uc3QgZGF5c0luWWVhciA9IDM2NS4yNDI1O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWF4VGltZVxuICogQHN1bW1hcnkgTWF4aW11bSBhbGxvd2VkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IG1heFRpbWUgfSBmcm9tIFwiLi9jb25zdGFudHMvZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogY29uc3QgaXNWYWxpZCA9IDg2NDAwMDAwMDAwMDAwMDEgPD0gbWF4VGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSg4NjQwMDAwMDAwMDAwMDAxKTtcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmV4cG9ydCBjb25zdCBtYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pblRpbWVcbiAqIEBzdW1tYXJ5IE1pbmltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtaW5UaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSAtODY0MDAwMDAwMDAwMDAwMSA+PSBtaW5UaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKC04NjQwMDAwMDAwMDAwMDAxKVxuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IG1pblRpbWUgPSAtbWF4VGltZTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luV2VlayA9IDYwNDgwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbkRheSA9IDg2NDAwMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIG1pbnV0ZVxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5NaW51dGUgPSA2MDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgaG91clxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5Ib3VyID0gMzYwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luU2Vjb25kXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBzZWNvbmRcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luU2Vjb25kID0gMTAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJblllYXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luWWVhciA9IDUyNTYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbk1vbnRoXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgbW9udGguXG4gKi9cbmV4cG9ydCBjb25zdCBtaW51dGVzSW5Nb250aCA9IDQzMjAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luRGF5XG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luRGF5ID0gMTQ0MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBob3VyLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luSG91ciA9IDYwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbW9udGhzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBNb250aHMgaW4gMSBxdWFydGVyLlxuICovXG5leHBvcnQgY29uc3QgbW9udGhzSW5RdWFydGVyID0gMztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luWWVhclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vbnRoc0luWWVhciA9IDEyO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgcXVhcnRlcnNJblllYXJcbiAqIEBzdW1tYXJ5IFF1YXJ0ZXJzIGluIDEgeWVhclxuICovXG5leHBvcnQgY29uc3QgcXVhcnRlcnNJblllYXIgPSA0O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGhvdXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5Ib3VyID0gMzYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbk1pbnV0ZVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1pbnV0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbk1pbnV0ZSA9IDYwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luRGF5ID0gc2Vjb25kc0luSG91ciAqIDI0O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5XZWVrID0gc2Vjb25kc0luRGF5ICogNztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblllYXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXI7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5Nb250aFxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1vbnRoXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMjtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBxdWFydGVyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luUXVhcnRlciA9IHNlY29uZHNJbk1vbnRoICogMztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGNvbnN0cnVjdEZyb21TeW1ib2xcbiAqIEBzdW1tYXJ5IFN5bWJvbCBlbmFibGluZyBEYXRlIGV4dGVuc2lvbnMgdG8gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlLlxuICpcbiAqIFRoZSBzeW1ib2wgaXMgdXNlZCB0byBlbmFibGUgdGhlIGBjb25zdHJ1Y3RGcm9tYCBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBkYXRlXG4gKiB1c2luZyBhIHJlZmVyZW5jZSBkYXRlIGFuZCBhIHZhbHVlLiBJdCBhbGxvd3MgdG8gdHJhbnNmZXIgZXh0cmEgcHJvcGVydGllc1xuICogZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLiBJdCdzIHVzZWZ1bCBmb3IgZXh0ZW5zaW9ucyBsaWtlXG4gKiBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eikgdGhhdCBhY2NlcHQgYSB0aW1lIHpvbmUgYXNcbiAqIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3RGcm9tU3ltYm9sID0gU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tU3ltYm9sIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgY29uc3RydWN0RnJvbVxuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgQ29uc3RydWN0cyBhIGRhdGUgdXNpbmcgdGhlIHJlZmVyZW5jZSBkYXRlIGFuZCB0aGUgdmFsdWVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgbmV3IGRhdGUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIHJlZmVyZW5jZVxuICogZGF0ZSBhbmQgdGhlIGdpdmVuIHZhbHVlLiBJdCBoZWxwcyB0byBidWlsZCBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdFxuICogZGF0ZSBleHRlbnNpb25zLlxuICpcbiAqIEl0IGRlZmF1bHRzIHRvIGBEYXRlYCBpZiB0aGUgcGFzc2VkIHJlZmVyZW5jZSBkYXRlIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdjMuNy4wLCBpdCBhbGxvd3MgdG8gY29uc3RydWN0IGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRha2UgY29uc3RydWN0b3IgZnJvbVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNyZWF0ZSB0aGUgZGF0ZVxuICpcbiAqIEByZXR1cm5zIERhdGUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIGdpdmVuIGRhdGUgYW5kIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tL2RhdGUtZm5zXCI7XG4gKlxuICogLy8gQSBmdW5jdGlvbiB0aGF0IGNsb25lcyBhIGRhdGUgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgdHlwZVxuICogZnVuY3Rpb24gY2xvbmVEYXRlPERhdGVUeXBlIGV4dGVuZHMgRGF0ZT4oZGF0ZTogRGF0ZVR5cGUpOiBEYXRlVHlwZSB7XG4gKiAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKFxuICogICAgIGRhdGUsIC8vIFVzZSBjb25zdHJ1Y3RvciBmcm9tIHRoZSBnaXZlbiBkYXRlXG4gKiAgICAgZGF0ZS5nZXRUaW1lKCkgLy8gVXNlIHRoZSBkYXRlIHZhbHVlIHRvIGNyZWF0ZSBhIG5ldyBkYXRlXG4gKiAgICk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGF0ZSh2YWx1ZSk7XG5cbiAgaWYgKGRhdGUgJiYgdHlwZW9mIGRhdGUgPT09IFwib2JqZWN0XCIgJiYgY29uc3RydWN0RnJvbVN5bWJvbCBpbiBkYXRlKVxuICAgIHJldHVybiBkYXRlW2NvbnN0cnVjdEZyb21TeW1ib2xdKHZhbHVlKTtcblxuICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgZGF0ZS5jb25zdHJ1Y3Rvcih2YWx1ZSk7XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBjb25zdHJ1Y3RGcm9tO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBTdGFydGluZyBmcm9tIHYzLjcuMCwgaXQgY2xvbmVzIGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gIC8vIFtUT0RPXSBHZXQgcmlkIG9mIGB0b0RhdGVgIG9yIGBjb25zdHJ1Y3RGcm9tYD9cbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dCB8fCBhcmd1bWVudCwgYXJndW1lbnQpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHRvRGF0ZTtcbiIsCiAgICAibGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG4iLAogICAgImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTdW4gQXVnIDMxIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZXZWVrO1xuIiwKICAgICJpbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mSVNPV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mSVNPV2VlaztcbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0SVNPV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMjAwNFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhcik7XG5cbiAgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZ2V0SVNPV2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUpO1xuICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoXG4gICAgRGF0ZS5VVEMoXG4gICAgICBfZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgX2RhdGUuZ2V0TW9udGgoKSxcbiAgICAgIF9kYXRlLmdldERhdGUoKSxcbiAgICAgIF9kYXRlLmdldEhvdXJzKCksXG4gICAgICBfZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgICBfZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICApLFxuICApO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gK2RhdGUgLSArdXRjRGF0ZTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRlcyhjb250ZXh0LCAuLi5kYXRlcykge1xuICBjb25zdCBub3JtYWxpemUgPSBjb25zdHJ1Y3RGcm9tLmJpbmQoXG4gICAgbnVsbCxcbiAgICBjb250ZXh0IHx8IGRhdGVzLmZpbmQoKGRhdGUpID0+IHR5cGVvZiBkYXRlID09PSBcIm9iamVjdFwiKSxcbiAgKTtcbiAgcmV0dXJuIGRhdGVzLm1hcChub3JtYWxpemUpO1xufVxuIiwKICAgICJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZEYXl9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgZGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mRGF5KGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZEYXk7XG4iLAogICAgImltcG9ydCB7IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgfSBmcm9tIFwiLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5EYXkgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZEYXkgfSBmcm9tIFwiLi9zdGFydE9mRGF5LmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXMgYXJlIHJlbW92ZWRcbiAqIGZyb20gdGhlIGRhdGVzIGFuZCB0aGVuIHRoZSBkaWZmZXJlbmNlIGluIGRheXMgaXMgY2FsY3VsYXRlZC5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0XG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjAwOjAwIGFuZCAyIEp1bHkgMjAxMiAwMDowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMiwgNiwgMiwgMCwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCAwKVxuICogKVxuICogLy89PiAzNjZcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjU5OjAwIGFuZCAzIEp1bHkgMjAxMSAwMDowMTowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMywgMCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCA1OSlcbiAqIClcbiAqIC8vPT4gMVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcyhcbiAgICBvcHRpb25zPy5pbixcbiAgICBsYXRlckRhdGUsXG4gICAgZWFybGllckRhdGUsXG4gICk7XG5cbiAgY29uc3QgbGF0ZXJTdGFydE9mRGF5ID0gc3RhcnRPZkRheShsYXRlckRhdGVfKTtcbiAgY29uc3QgZWFybGllclN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5KGVhcmxpZXJEYXRlXyk7XG5cbiAgY29uc3QgbGF0ZXJUaW1lc3RhbXAgPVxuICAgICtsYXRlclN0YXJ0T2ZEYXkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyU3RhcnRPZkRheSk7XG4gIGNvbnN0IGVhcmxpZXJUaW1lc3RhbXAgPVxuICAgICtlYXJsaWVyU3RhcnRPZkRheSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllclN0YXJ0T2ZEYXkpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSBkYXkgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKChsYXRlclRpbWVzdGFtcCAtIGVhcmxpZXJUaW1lc3RhbXApIC8gbWlsbGlzZWNvbmRzSW5EYXkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cztcbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZJU09XZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcixcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1OlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHllYXIgPSBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZJU09XZWVrWWVhcjtcbiIsCiAgICAiLyoqXG4gKiBAbmFtZSBpc0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIHZhbHVlIGEgZGF0ZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZS4gVGhlIGZ1bmN0aW9uIHdvcmtzIGZvciBkYXRlcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgaWZyYW1lcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgRGF0ZV1cIilcbiAgKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBpc0RhdGU7XG4iLAogICAgImltcG9ydCB7IGlzRGF0ZSB9IGZyb20gXCIuL2lzRGF0ZS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgaXNWYWxpZFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gZGF0ZSB2YWxpZD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgZmFsc2UgaWYgYXJndW1lbnQgaXMgSW52YWxpZCBEYXRlIGFuZCB0cnVlIG90aGVyd2lzZS5cbiAqIEFyZ3VtZW50IGlzIGNvbnZlcnRlZCB0byBEYXRlIHVzaW5nIGB0b0RhdGVgLiBTZWUgW3RvRGF0ZV0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy90b0RhdGUpXG4gKiBJbnZhbGlkIERhdGUgaXMgYSBEYXRlLCB3aG9zZSB0aW1lIHZhbHVlIGlzIE5hTi5cbiAqXG4gKiBUaW1lIHZhbHVlIG9mIERhdGU6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS4xLjFcbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGUgaXMgdmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgyMDE0LCAxLCAzMSkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWx1ZSwgY29udmVydGlibGUgaW50byBhIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKDEzOTM4MDQ4MDAwMDApXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKCcnKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWQoZGF0ZSkge1xuICByZXR1cm4gISgoIWlzRGF0ZShkYXRlKSAmJiB0eXBlb2YgZGF0ZSAhPT0gXCJudW1iZXJcIikgfHwgaXNOYU4oK3RvRGF0ZShkYXRlKSkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGlzVmFsaWQ7XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgSmFuIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlXy5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgZGF0ZV8uc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlXztcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mWWVhcjtcbiIsCiAgICAiY29uc3QgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcImhhbGYgYSBtaW51dGVcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCJhYm91dCAxIGhvdXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwiMSBob3VyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeERheXM6IHtcbiAgICBvbmU6IFwiMSBkYXlcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gZGF5c1wiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcImFib3V0IDEgd2Vla1wiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCIxIHdlZWtcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBtb250aFwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIjEgbW9udGhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgb25lOiBcIjEgeWVhclwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6IFwib3ZlciAxIHllYXJcIixcbiAgICBvdGhlcjogXCJvdmVyIHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCJhbG1vc3QgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWxtb3N0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwiIGFnb1wiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykge1xuICByZXR1cm4gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8vIFRPRE86IFJlbW92ZSBTdHJpbmcoKVxuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgIGNvbnN0IGZvcm1hdCA9IGFyZ3MuZm9ybWF0c1t3aWR0aF0gfHwgYXJncy5mb3JtYXRzW2FyZ3MuZGVmYXVsdFdpZHRoXTtcbiAgICByZXR1cm4gZm9ybWF0O1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgeyBidWlsZEZvcm1hdExvbmdGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCI7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcIkVFRUUsIE1NTU0gZG8sIHlcIixcbiAgbG9uZzogXCJNTU1NIGRvLCB5XCIsXG4gIG1lZGl1bTogXCJNTU0gZCwgeVwiLFxuICBzaG9ydDogXCJNTS9kZC95eXl5XCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJoOm1tOnNzIGEgenp6elwiLFxuICBsb25nOiBcImg6bW06c3MgYSB6XCIsXG4gIG1lZGl1bTogXCJoOm1tOnNzIGFcIixcbiAgc2hvcnQ6IFwiaDptbSBhXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICBzaG9ydDogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufTtcbiIsCiAgICAiY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiBcIlBcIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRSZWxhdGl2ZSA9ICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpID0+XG4gIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbiIsCiAgICAiLyoqXG4gKiBUaGUgbG9jYWxpemUgZnVuY3Rpb24gYXJndW1lbnQgY2FsbGJhY2sgd2hpY2ggYWxsb3dzIHRvIGNvbnZlcnQgcmF3IHZhbHVlIHRvXG4gKiB0aGUgYWN0dWFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHZhbHVlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFwIG9mIGxvY2FsaXplZCB2YWx1ZXMgZm9yIGVhY2ggd2lkdGguXG4gKi9cblxuLyoqXG4gKiBUaGUgaW5kZXggdHlwZSBvZiB0aGUgbG9jYWxlIHVuaXQgdmFsdWUuIEl0IHR5cGVzIGNvbnZlcnNpb24gb2YgdW5pdHMgb2ZcbiAqIHZhbHVlcyB0aGF0IGRvbid0IHN0YXJ0IGF0IDAgKGkuZS4gcXVhcnRlcnMpLlxuICovXG5cbi8qKlxuICogQ29udmVydHMgdGhlIHVuaXQgdmFsdWUgdG8gdGhlIHR1cGxlIG9mIHZhbHVlcy5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZXJhIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBCQyxcbiAqIHRoZSBzZWNvbmQgZWxlbWVudCByZXByZXNlbnRzIEFELlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBxdWFydGVyIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBRMS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZGF5IHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBTdW5kYXkuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIG1vbnRoIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBKYW51YXJ5LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgbGV0IHZhbHVlc0FycmF5O1xuICAgIGlmIChjb250ZXh0ID09PSBcImZvcm1hdHRpbmdcIiAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBkZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID1cbiAgICAgICAgYXJncy5mb3JtYXR0aW5nVmFsdWVzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbd2lkdGhdIHx8IGFyZ3MudmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEZvciBzb21lIHJlYXNvbiBUeXBlU2NyaXB0IGp1c3QgZG9uJ3Qgd2FudCB0byBtYXRjaCBpdCwgbm8gbWF0dGVyIGhvdyBoYXJkIHdlIHRyeS4gSSBjaGFsbGVuZ2UgeW91IHRvIHRyeSB0byByZW1vdmUgaXQhXG4gICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4XTtcbiAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgYnVpbGRMb2NhbGl6ZUZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzXCI7XG5cbmNvbnN0IGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJCXCIsIFwiQVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIkJDXCIsIFwiQURcIl0sXG4gIHdpZGU6IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxc3QgcXVhcnRlclwiLCBcIjJuZCBxdWFydGVyXCIsIFwiM3JkIHF1YXJ0ZXJcIiwgXCI0dGggcXVhcnRlclwiXSxcbn07XG5cbi8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcbiAgICBcIkphblwiLFxuICAgIFwiRmViXCIsXG4gICAgXCJNYXJcIixcbiAgICBcIkFwclwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5cIixcbiAgICBcIkp1bFwiLFxuICAgIFwiQXVnXCIsXG4gICAgXCJTZXBcIixcbiAgICBcIk9jdFwiLFxuICAgIFwiTm92XCIsXG4gICAgXCJEZWNcIixcbiAgXSxcblxuICB3aWRlOiBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU3VcIiwgXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIHdpZGU6IFtcbiAgICBcIlN1bmRheVwiLFxuICAgIFwiTW9uZGF5XCIsXG4gICAgXCJUdWVzZGF5XCIsXG4gICAgXCJXZWRuZXNkYXlcIixcbiAgICBcIlRodXJzZGF5XCIsXG4gICAgXCJGcmlkYXlcIixcbiAgICBcIlNhdHVyZGF5XCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSA9PiB7XG4gIGNvbnN0IG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICBjb25zdCByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG4gIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkge1xuICAgIHN3aXRjaCAocmVtMTAwICUgMTApIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwic3RcIjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwibmRcIjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwicmRcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlciArIFwidGhcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxufTtcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPVxuICAgICAgKHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuXG4gICAgY29uc3Qga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKVxuICAgICAgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSlcbiAgICAgIDogLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgZmluZEtleShwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICBwcmVkaWNhdGUob2JqZWN0W2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKGxldCBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pO1xuICAgIGlmICghbWF0Y2hSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcblxuICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MucGFyc2VQYXR0ZXJuKTtcbiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBsZXQgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKVxuICAgICAgOiBwYXJzZVJlc3VsdFswXTtcblxuICAgIC8vIFtUT0RPXSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG4iLAogICAgImltcG9ydCB7IGJ1aWxkTWF0Y2hGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi5qc1wiO1xuaW1wb3J0IHsgYnVpbGRNYXRjaFBhdHRlcm5GbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanNcIjtcblxuY29uc3QgbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9eKFxcZCspKHRofHN0fG5kfHJkKT8vaTtcbmNvbnN0IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGJ8YSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGJcXC4/XFxzP2NcXC4/fGJcXC4/XFxzP2NcXC4/XFxzP2VcXC4/fGFcXC4/XFxzP2RcXC4/fGNcXC4/XFxzP2VcXC4/KS9pLFxuICB3aWRlOiAvXihiZWZvcmUgY2hyaXN0fGJlZm9yZSBjb21tb24gZXJhfGFubm8gZG9taW5pfGNvbW1vbiBlcmEpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL15iL2ksIC9eKGF8YykvaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxufTtcbmNvbnN0IHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbXG4gICAgL15qL2ksXG4gICAgL15mL2ksXG4gICAgL15tL2ksXG4gICAgL15hL2ksXG4gICAgL15tL2ksXG4gICAgL15qL2ksXG4gICAgL15qL2ksXG4gICAgL15hL2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL15qYS9pLFxuICAgIC9eZi9pLFxuICAgIC9ebWFyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWF5L2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgfSksXG5cbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcImFueVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRMb25nIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRSZWxhdGl2ZSB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanNcIjtcbmltcG9ydCB7IGxvY2FsaXplIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9sb2NhbGl6ZS5qc1wiO1xuaW1wb3J0IHsgbWF0Y2ggfSBmcm9tIFwiLi9lbi1VUy9fbGliL21hdGNoLmpzXCI7XG5cbi8qKlxuICogQGNhdGVnb3J5IExvY2FsZXNcbiAqIEBzdW1tYXJ5IEVuZ2xpc2ggbG9jYWxlIChVbml0ZWQgU3RhdGVzKS5cbiAqIEBsYW5ndWFnZSBFbmdsaXNoXG4gKiBAaXNvLTYzOS0yIGVuZ1xuICogQGF1dGhvciBTYXNoYSBLb3NzIFtAa29zc25vY29ycF0oaHR0cHM6Ly9naXRodWIuY29tL2tvc3Nub2NvcnApXG4gKiBAYXV0aG9yIExlc2hhIEtvc3MgW0BsZXNoYWtvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNoYWtvc3MpXG4gKi9cbmV4cG9ydCBjb25zdCBlblVTID0ge1xuICBjb2RlOiBcImVuLVVTXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufTtcblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBlblVTO1xuIiwKICAgICJpbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZlllYXIuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0RGF5T2ZZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIHllYXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXlPZlllYXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDE4M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKF9kYXRlLCBzdGFydE9mWWVhcihfZGF0ZSkpO1xuICBjb25zdCBkYXlPZlllYXIgPSBkaWZmICsgMTtcbiAgcmV0dXJuIGRheU9mWWVhcjtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXREYXlPZlllYXI7XG4iLAogICAgImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWsgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldElTT1dlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mSVNPV2VlayhfZGF0ZSkgLSArc3RhcnRPZklTT1dlZWtZZWFyKF9kYXRlKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRJU09XZWVrO1xuIiwKICAgICJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3M/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpKVxuICogLy89PiAyMDA1XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB3ZWVrIHN0YXJ0cyBvbiBTYXR1cmRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgd2Vla1N0YXJ0c09uOiA2IH0pXG4gKiAvLz0+IDIwMDRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHRoZSBmaXJzdCB3ZWVrIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pXG4gKiAvLz0+IDIwMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgZmlyc3RXZWVrT2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mVGhpc1llYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mVGhpc1llYXIsIG9wdGlvbnMpO1xuXG4gIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZOZXh0WWVhcikge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZUaGlzWWVhcikge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldFdlZWtZZWFyO1xuIiwKICAgICJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBnZXRXZWVrWWVhciB9IGZyb20gXCIuL2dldFdlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1IHdpdGggZGVmYXVsdCBzZXR0aW5nczpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSlcbiAqIC8vPT4gU3VuIERlYyAyNiAyMDA0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1XG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB3ZWVrXG4gKiAvLyBhbmQgNCBKYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhcjpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gTW9uIEphbiAwMyAyMDA1IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgeWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpO1xuICBjb25zdCBmaXJzdFdlZWsgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWsuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBfZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vlaywgb3B0aW9ucyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mV2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZldlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mV2VlayhfZGF0ZSwgb3B0aW9ucykgLSArc3RhcnRPZldlZWtZZWFyKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrO1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYWRkTGVhZGluZ1plcm9zKG51bWJlciwgdGFyZ2V0TGVuZ3RoKSB7XG4gIGNvbnN0IHNpZ24gPSBudW1iZXIgPCAwID8gXCItXCIgOiBcIlwiO1xuICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIpLnRvU3RyaW5nKCkucGFkU3RhcnQodGFyZ2V0TGVuZ3RoLCBcIjBcIik7XG4gIHJldHVybiBzaWduICsgb3V0cHV0O1xufVxuIiwKICAgICJpbXBvcnQgeyBhZGRMZWFkaW5nWmVyb3MgfSBmcm9tIFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCI7XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICovXG5cbmV4cG9ydCBjb25zdCBsaWdodEZvcm1hdHRlcnMgPSB7XG4gIC8vIFllYXJcbiAgeShkYXRlLCB0b2tlbikge1xuICAgIC8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfdG9rZW5zXG4gICAgLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuICAgIC8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbiAgICAvLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4gICAgLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuICAgIC8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbiAgICAvLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4gICAgLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuXG4gICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRva2VuID09PSBcInl5XCIgPyB5ZWFyICUgMTAwIDogeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNb250aFxuICBNKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHRva2VuID09PSBcIk1cIiA/IFN0cmluZyhtb250aCArIDEpIDogYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldERhdGUoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBBTSBvciBQTVxuICBhKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF0ZS5nZXRIb3VycygpIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWVbMF07XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gXCJhbVwiID8gXCJhLm0uXCIgOiBcInAubS5cIjtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRIb3VycygpICUgMTIgfHwgMTIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRIb3VycygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbnV0ZVxuICBtKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldE1pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBTZWNvbmRcbiAgcyhkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRTZWNvbmRzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFMoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYyhcbiAgICAgIG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpLFxuICAgICk7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG4iLAogICAgImltcG9ydCB7IGdldERheU9mWWVhciB9IGZyb20gXCIuLi8uLi9nZXREYXlPZlllYXIuanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0SVNPV2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IGdldFdlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0V2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vla1llYXIuanNcIjtcblxuaW1wb3J0IHsgYWRkTGVhZGluZ1plcm9zIH0gZnJvbSBcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiO1xuaW1wb3J0IHsgbGlnaHRGb3JtYXR0ZXJzIH0gZnJvbSBcIi4vbGlnaHRGb3JtYXR0ZXJzLmpzXCI7XG5cbmNvbnN0IGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiBcImFtXCIsXG4gIHBtOiBcInBtXCIsXG4gIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gIG5vb246IFwibm9vblwiLFxuICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgbmlnaHQ6IFwibmlnaHRcIixcbn07XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG5leHBvcnQgY29uc3QgZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBlcmEgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiAwID8gMSA6IDA7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSk7XG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIndpZGVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gWWVhclxuICB5OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwieW9cIikge1xuICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gXCJZWVwiKSB7XG4gICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDtcbiAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModHdvRGlnaXRZZWFyLCAyKTtcbiAgICB9XG5cbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJZb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpO1xuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJRUVwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIG1vbnRoXG4gIEw6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTG9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgd2VlayA9IGdldFdlZWsoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwid29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaXNvV2VlayA9IGdldElTT1dlZWsoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiSW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHllYXJcbiAgRDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mWWVhciA9IGdldERheU9mWWVhcihkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJEb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogXCJkYXlPZlllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiZWVcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChzYW1lIGFzIGluIGBlYClcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImNjXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJjY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIElTTyBkYXkgb2Ygd2Vla1xuICBpOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBpc29EYXlPZldlZWsgPSBkYXlPZldlZWsgPT09IDAgPyA3IDogZGF5T2ZXZWVrO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlIFwiaWlcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDApIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID49IDE3KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJob1wiKSB7XG4gICAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJIb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldEhvdXJzKCksIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJLb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEhvdXIgWzEtMjRdXG4gIGs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuXG4gICAgaWYgKHRva2VuID09PSBcImtvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwibW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcInNvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6IFwic2Vjb25kXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKVxuICBYOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJaXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGBcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICBjYXNlIFwieHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgY2FzZSBcInh4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJPXCI6XG4gICAgICBjYXNlIFwiT09cIjpcbiAgICAgIGNhc2UgXCJPT09cIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwiT09PT1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICBjYXNlIFwienpcIjpcbiAgICAgIGNhc2UgXCJ6enpcIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwienp6elwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGgudHJ1bmMoK2RhdGUgLyAxMDAwKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcygrZGF0ZSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTtcbiAgY29uc3QgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTtcbiAgfVxuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKSwgMik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbiIsCiAgICAiY29uc3QgZGF0ZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCB0aW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwicHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwicHBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJwcHBwXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107XG4gIGNvbnN0IGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07XG4gIGNvbnN0IHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07XG5cbiAgaWYgKCF0aW1lUGF0dGVybikge1xuICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKTtcbiAgfVxuXG4gIGxldCBkYXRlVGltZUZvcm1hdDtcblxuICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXRcbiAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSlcbiAgICAucmVwbGFjZShcInt7dGltZX19XCIsIHRpbWVMb25nRm9ybWF0dGVyKHRpbWVQYXR0ZXJuLCBmb3JtYXRMb25nKSk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9uZ0Zvcm1hdHRlcnMgPSB7XG4gIHA6IHRpbWVMb25nRm9ybWF0dGVyLFxuICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIsXG59O1xuIiwKICAgICJjb25zdCBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvO1xuY29uc3Qgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvO1xuXG5jb25zdCB0aHJvd1Rva2VucyA9IFtcIkRcIiwgXCJERFwiLCBcIllZXCIsIFwiWVlZWVwiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIGRheU9mWWVhclRva2VuUkUudGVzdCh0b2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHdlZWtZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3QgX21lc3NhZ2UgPSBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KTtcbiAgY29uc29sZS53YXJuKF9tZXNzYWdlKTtcbiAgaWYgKHRocm93VG9rZW5zLmluY2x1ZGVzKHRva2VuKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoX21lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gXCJZXCIgPyBcInllYXJzXCIgOiBcImRheXMgb2YgdGhlIG1vbnRoXCI7XG4gIHJldHVybiBgVXNlIFxcYCR7dG9rZW4udG9Mb3dlckNhc2UoKX1cXGAgaW5zdGVhZCBvZiBcXGAke3Rva2VufVxcYCAoaW4gXFxgJHtmb3JtYXR9XFxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcXGAke2lucHV0fVxcYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kYDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgZGVmYXVsdExvY2FsZSB9IGZyb20gXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXR0ZXJzIH0gZnJvbSBcIi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHsgbG9uZ0Zvcm1hdHRlcnMgfSBmcm9tIFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHtcbiAgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbixcbiAgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuLFxuICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yLFxufSBmcm9tIFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiO1xuaW1wb3J0IHsgaXNWYWxpZCB9IGZyb20gXCIuL2lzVmFsaWQuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5leHBvcnQgeyBmb3JtYXR0ZXJzLCBsb25nRm9ybWF0dGVycyB9O1xuXG4vLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcbmNvbnN0IGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPVxuICAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbi8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcbmNvbnN0IGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbmNvbnN0IGVzY2FwZWRTdHJpbmdSZWdFeHAgPSAvXicoW15dKj8pJz8kLztcbmNvbnN0IGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbmV4cG9ydCB7IGZvcm1hdCBhcyBmb3JtYXREYXRlIH07XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBhbGlhcyBmb3JtYXREYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEZvcm1hdCB0aGUgZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nIGluIHRoZSBnaXZlbiBmb3JtYXQuIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyKSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA5LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICpcbiAqIEB0aHJvd3MgYGRhdGVgIG11c3Qgbm90IGJlIEludmFsaWQgRGF0ZVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXRMb25nYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IGRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG5cbiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcInBcIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gXCJQXCIpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IGxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgICAgcmV0dXJuIGxvbmdGb3JtYXR0ZXIoc3Vic3RyaW5nLCBsb2NhbGUuZm9ybWF0TG9uZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RyaW5nO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbiAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmIChzdWJzdHJpbmcgPT09IFwiJydcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IFwiJ1wiIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXSkge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiB0cnVlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgIH0pO1xuXG4gIC8vIGludm9rZSBsb2NhbGl6ZSBwcmVwcm9jZXNzb3IgKG9ubHkgZm9yIGZyZW5jaCBsb2NhbGVzIGF0IHRoZSBtb21lbnQpXG4gIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7XG4gICAgcGFydHMgPSBsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKG9yaWdpbmFsRGF0ZSwgcGFydHMpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICByZXR1cm4gcGFydHNcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAoIXBhcnQuaXNUb2tlbikgcmV0dXJuIHBhcnQudmFsdWU7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikpIHx8XG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pKVxuICAgICAgKSB7XG4gICAgICAgIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdFN0ciwgU3RyaW5nKGRhdGUpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZm9ybWF0dGVyc1t0b2tlblswXV07XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG9yaWdpbmFsRGF0ZSwgdG9rZW4sIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZFsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZywgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IFRTT04gfSBmcm9tIFwiQHNvdXRoZXJuLWF1cm9yYS90c29uXCI7XG5cbmludGVyZmFjZSBDb29rYm9va0V2ZW50IHtcbiAgdHlwZTogXCJtaWxraW9AbG9nZ2VyXCI7XG4gIGxvZzogTG9nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZENvb2tib29rRXZlbnQocnVudGltZTogTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvSW5pdD4sIGV2ZW50OiBDb29rYm9va0V2ZW50KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDoke3J1bnRpbWUuY29va2Jvb2suY29va2Jvb2tQb3J0fS8kYWN0aW9uYCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogVFNPTi5zdHJpbmdpZnkoZXZlbnQpLFxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIFwiSXMgQ29va2Jvb2sgY2xvc2VkPyBUaGVyZSBpcyBhbiBhYm5vcm1hbGl0eSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIENvb2tib29rLlwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIGVycm9yKTtcbiAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJkYXRlLWZuc1wiO1xuaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IHNlbmRDb29rYm9va0V2ZW50IH0gZnJvbSBcIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHNcIjtcblxuZXhwb3J0IHR5cGUgTG9nID0gW1wiW0RFQlVHXVwiIHwgXCJbSU5GT11cIiB8IFwiW1dBUk5dXCIgfCBcIltFUlJPUl1cIiB8IFwiW1JFUVVFU1RdXCIgfCBcIltSRVNQT05TRV1cIiwgc3RyaW5nIC8qIGV4ZWN1dGVJZCAqLywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgLi4uQXJyYXk8dW5rbm93bj5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gIF86IHtcbiAgICBsb2dzOiBBcnJheTxMb2c+O1xuICAgIHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN1Ym1pdDogKGNvbnRleHQ6ICRjb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgfTtcbiAgc2V0VGFnOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICBzZXRMb2c6ICguLi5sb2c6IExvZykgPT4gdm9pZDtcbiAgZGVidWc6IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gIGluZm86IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gIHdhcm46IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gIGVycm9yOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICByZXF1ZXN0OiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICByZXNwb25zZTogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbn1cblxuZXhwb3J0IHR5cGUgTG9nZ2VySW5zZXJ0aW5nSGFuZGxlciA9IChsb2c6IExvZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXIgPSAoY29udGV4dDogJGNvbnRleHQsIGxvZ3M6IEFycmF5PExvZz4sIHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcjxNaWxraW9SdW50aW1lIGV4dGVuZHMgTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvUnVudGltZUluaXQ8TWlsa2lvSW5pdD4+ID0gTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvSW5pdD4+KHJ1bnRpbWU6IE1pbGtpb1J1bnRpbWUsIHBhdGg6IHN0cmluZywgZXhlY3V0ZUlkOiBzdHJpbmcpOiBMb2dnZXIge1xuICBjb25zdCBsb2dnZXIgPSB7fSBhcyBMb2dnZXI7XG5cbiAgbG9nZ2VyLl8gPSB7XG4gICAgbG9nczogW10sXG4gICAgdGFnczogbmV3IE1hcCgpLFxuICAgIHN1Ym1pdDogKGNvbnRleHQ6ICRjb250ZXh0KSA9PiB7XG4gICAgICBpZiAoIXJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgICByZXR1cm4gcnVudGltZS5vbkxvZ2dlclN1Ym1pdHRpbmcoY29udGV4dCwgbG9nZ2VyLl8ubG9ncywgbG9nZ2VyLl8udGFncyk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBfX3RhZ1B1c2ggPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgbG9nZ2VyLl8udGFncy5zZXQoa2V5LCB2YWx1ZSk7XG4gIH07XG4gIGNvbnN0IF9fbG9nUHVzaCA9IChsb2c6IExvZyk6IExvZyA9PiB7XG4gICAgY29uc3QgaW5zZXJ0aW5nID0gcnVudGltZS5vbkxvZ2dlckluc2VydGluZ1xuICAgICAgPyBydW50aW1lLm9uTG9nZ2VySW5zZXJ0aW5nXG4gICAgICA6IChsb2c6IExvZykgPT4ge1xuICAgICAgICAgIGxvZyA9IFsuLi5sb2ddO1xuICAgICAgICAgIGxvZ1swXSA9IGBcXG4ke2xvZ1swXX1gIGFzIGFueTtcbiAgICAgICAgICBjb25zb2xlLmxvZyguLi5sb2cpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgaWYgKCFpbnNlcnRpbmcobG9nKSkgcmV0dXJuIGxvZztcblxuICAgIGxvZ2dlci5fLmxvZ3MucHVzaChbLi4ubG9nXSk7XG4gICAgaWYgKHJ1bnRpbWUuZGV2ZWxvcCkge1xuICAgICAgdm9pZCBzZW5kQ29va2Jvb2tFdmVudChydW50aW1lLCB7XG4gICAgICAgIHR5cGU6IFwibWlsa2lvQGxvZ2dlclwiLFxuICAgICAgICBsb2csXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nO1xuICB9O1xuXG4gIGxvZ2dlci5zZXRUYWcgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiBfX3RhZ1B1c2goa2V5LCB2YWx1ZSk7XG4gIGxvZ2dlci5zZXRMb2cgPSAoLi4ubG9nOiBMb2cpID0+IF9fbG9nUHVzaChsb2cpO1xuXG4gIGNvbnN0IGdldE5vdyA9ICgpID0+IGAke2Zvcm1hdChuZXcgRGF0ZSgpLCBcIih5eXl5LU1NLWRkIGhoOm1tOnNzKVwiKX1gO1xuXG4gIGxvZ2dlci5kZWJ1ZyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiW0RFQlVHXVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgbG9nZ2VyLmluZm8gPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIltJTkZPXVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgbG9nZ2VyLndhcm4gPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIltXQVJOXVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgbG9nZ2VyLmVycm9yID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCJbRVJST1JdXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICBsb2dnZXIucmVxdWVzdCA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiW1JFUVVFU1RdXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICBsb2dnZXIucmVzcG9uc2UgPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIltSRVNQT05TRV1cIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG5cbiAgcmV0dXJuIGxvZ2dlcjtcbn1cbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBTdGVwczxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiB7XG4gIHN0ZXA6IFN0ZXBGdW5jdGlvbjxTdGFnZVQ+O1xuICBydW46ICgpID0+IFByb21pc2U8UmVtb3ZlXzxTdGFnZVQ+Pjtcbn1cblxudHlwZSBSZW1vdmVfPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgXyR7c3RyaW5nfWAgPyBuZXZlciA6IEtdOiBUW0tdO1xufTtcblxudHlwZSBUb0VtcHR5T2JqZWN0PFQ+ID0gVCBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgfCBuZXZlciA/IHt9IDogVCBleHRlbmRzIG9iamVjdCA/IFQgOiB7fTtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFN0YWdlVCBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+ID0gPEhhbmRsZXJUIGV4dGVuZHMgKHN0YWdlOiBSZWFkb25seTxTdGFnZVQ+KSA9PiBSZWNvcmQ8YW55LCBhbnk+IHwgUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+Pj4oaGFuZGxlcjogSGFuZGxlclQpID0+IFN0ZXBzPEF3YWl0ZWQ8U3RhZ2VUPiAmIFRvRW1wdHlPYmplY3Q8QXdhaXRlZDxSZXR1cm5UeXBlPEhhbmRsZXJUPj4+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0ZXAoKTogU3RlcHM8e30+IHtcbiAgY29uc3Qgc3RlcENvbnRyb2xsZXIgPSB7XG4gICAgJG1pbGtpb1R5cGU6IFwic3RlcFwiLFxuICAgIF9zdGVwczogW10gYXMgQXJyYXk8KHN0YWdlOiBhbnkpID0+IFByb21pc2U8YW55Pj4sXG4gICAgc3RlcChoYW5kbGVyOiAoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgICBzdGVwQ29udHJvbGxlci5fc3RlcHMucHVzaChoYW5kbGVyKTtcbiAgICAgIHJldHVybiBzdGVwQ29udHJvbGxlcjtcbiAgICB9LFxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgIGxldCBzdGFnZSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBDb250cm9sbGVyLl9zdGVwcykge1xuICAgICAgICBzdGFnZSA9IHsgLi4uc3RhZ2UsIC4uLihhd2FpdCBzdGVwKHN0YWdlKSkgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoc3RhZ2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwiX1wiKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN0ZXBDb250cm9sbGVyIGFzIGFueSBhcyBTdGVwczx7fT47XG59XG4iLAogICAgImV4cG9ydCBjbGFzcyBUcmllPFQ+IHtcclxuICBwcml2YXRlIHJvb3Q6IFRyaWVOb2RlPFQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMucm9vdCA9IG5ldyBUcmllTm9kZSgpO1xyXG4gIH1cclxuXHJcbiAgYWRkKHBhdGg6IHN0cmluZywgdmFsdWU6IFQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSB7XHJcbiAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIG5ldyBUcmllTm9kZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmNoaWxkcmVuLmdldChwYXJ0KSE7XHJcbiAgICB9XHJcbiAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0KHBhdGg6IHN0cmluZyk6IFQgfCBudWxsIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xyXG4gICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkgcmV0dXJuIG51bGw7XHJcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcclxuICB9XHJcblxyXG4gIGhhcyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSAhPT0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xyXG4gICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBlbHNlIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSAhPT0gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFRyaWVOb2RlPFQ+IHtcclxuICBjaGlsZHJlbjogTWFwPHN0cmluZywgVHJpZU5vZGU8VD4+O1xyXG4gIHZhbHVlOiBUIHwgbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xyXG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiIsCiAgICAiaW1wb3J0IHsgVFNPTiB9IGZyb20gXCJAc291dGhlcm4tYXVyb3JhL3Rzb25cIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXhjZXB0aW9uSGFuZGxlciwgcmVqZWN0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1peGluLCBHZW5lcmF0ZWRJbml0LCAkdHlwZXMsIENvbnRleHRIdHRwLCBNaWxraW9SZXNwb25zZVJlamVjdCwgUmVzdWx0cywgTWlsa2lvUmVzcG9uc2VTdWNjZXNzIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IF9faW5pdEV4ZWN1dGVyIH0gZnJvbSBcIi4uL2V4ZWN1dGUvaW5kZXgudHNcIjtcbmltcG9ydCB7IF9fY3JlYXRlSWQgfSBmcm9tIFwiLi4vdXRpbHMvY3JlYXRlLWlkLnRzXCI7XG5pbXBvcnQgeyBUcmllIH0gZnJvbSBcIi4uL3V0aWxzL3RyaWUudHNcIjtcblxuZXhwb3J0IHR5cGUgTWlsa2lvSHR0cFJlcXVlc3QgPSBSZXF1ZXN0O1xuXG5leHBvcnQgdHlwZSBNaWxraW9IdHRwUmVzcG9uc2UgPSBNaXhpbjxcbiAgUmVzcG9uc2VJbml0LFxuICB7XG4gICAgLy8gYm9keTogc3RyaW5nIHwgQmxvYiB8IEZvcm1EYXRhIHwgVVJMU2VhcmNoUGFyYW1zIHwgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT47XG4gICAgYm9keTogYW55O1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIHJ1bnRpbWU6IGFueSwgZXhlY3V0ZXI6IFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV4ZWN1dGVyPikge1xuICBjb25zdCBwb3J0ID0gcnVudGltZS5wb3J0O1xuICBjb25zdCB0cmllID0gbmV3IFRyaWU8YW55PigpO1xuICBjb25zdCBmZXRjaCA9IGFzeW5jIChvcHRpb25zOiB7XG4gICAgcmVxdWVzdDogTWlsa2lvSHR0cFJlcXVlc3Q7XG4gICAgZW52TW9kZT86IHN0cmluZztcbiAgICBlbnY/OiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIHJvdXRlU2NoZW1hPzogYW55O1xuICB9KTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgIGlmIChvcHRpb25zLnJlcXVlc3QubWV0aG9kID09PSBcIk9QVElPTlNcIikge1xuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh1bmRlZmluZWQsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd01ldGhvZHMgPz8gXCIqXCIsXG4gICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dPcmlnaW4gPz8gXCIqXCIsXG4gICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93SGVhZGVycyA/PyBcIipcIixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3QudXJsLmVuZHNXaXRoKFwiL2dlbmVyYXRlXzIwNFwiKSkge1xuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgIHN0YXR1czogMjA0LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93TWV0aG9kcyA/PyBcIipcIixcbiAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd09yaWdpbiA/PyBcIipcIixcbiAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dIZWFkZXJzID8/IFwiKlwiLFxuICAgICAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIsXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogYHRleHQvcGxhaW47IHRpbWU9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMucmVxdWVzdC51cmwpO1xuICAgIGxldCBwYXRoQXJyYXkgPSB1cmwucGF0aG5hbWUuc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKTtcbiAgICBpZiAocnVudGltZS5pZ25vcmVQYXRoTGV2ZWwgIT09IHVuZGVmaW5lZCAmJiBydW50aW1lLmlnbm9yZVBhdGhMZXZlbCAhPT0gMCkgcGF0aEFycmF5ID0gcGF0aEFycmF5LnNsaWNlKHJ1bnRpbWUuaWdub3JlUGF0aExldmVsKTtcbiAgICBjb25zdCBwYXRoU3RyaW5nID0gYC8ke3BhdGhBcnJheS5qb2luKFwiL1wiKX1gO1xuXG4gICAgY29uc3QgZXhlY3V0ZUlkID0gcnVudGltZT8uZXhlY3V0ZUlkID8gYXdhaXQgcnVudGltZS5leGVjdXRlSWQob3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMpIDogX19jcmVhdGVJZCgpO1xuXG4gICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIHBhdGhTdHJpbmcsIGV4ZWN1dGVJZCk7XG4gICAgcnVudGltZS5ydW50aW1lLnJlcXVlc3Quc2V0KGV4ZWN1dGVJZCwgeyBsb2dnZXIgfSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IE1pbGtpb0h0dHBSZXNwb25zZSA9IHtcbiAgICAgIGJvZHk6IFwiXCIsXG4gICAgICBzdGF0dXM6IDIwMCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93TWV0aG9kcyA/PyBcIipcIixcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dPcmlnaW4gPz8gXCIqXCIsXG4gICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd0hlYWRlcnMgPz8gXCIqXCIsXG4gICAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgbGV0IGZpbmFsZXM6IEFycmF5PCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+PiA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGh0dHAgPSAoYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgaXAgPSBydW50aW1lLnJlYWxJcCA/IHJ1bnRpbWUucmVhbElwKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzKSA6IFwiOjoxXCI7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICBzdHJpbmc6IGF3YWl0IG9wdGlvbnMucmVxdWVzdC50ZXh0KCksXG4gICAgICAgICAgcGFyc2VkOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgaXAsXG4gICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcgYXMga2V5b2YgJHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wicm91dGVTY2hlbWFcIl0sIGFycmF5OiBwYXRoQXJyYXkgfSxcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICB9IGFzIENvbnRleHRIdHRwO1xuICAgICAgfSkoKSkhO1xuXG4gICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlcXVlc3RcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAgfSk7XG5cbiAgICAgIGlmICghcnVudGltZS5kZXZlbG9wICYmIChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuc3RhcnRzV2l0aChcIi9fL1wiKSkge1xuICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwIH0pO1xuICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5nZXQoXCJBY2NlcHRcIik/LnN0YXJ0c1dpdGgoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSkge1xuICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xuICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAgfSk7XG4gICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgIHRyaWUuYWRkKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJvdXRlU2NoZW1hLnR5cGUgIT09IFwiYWN0aW9uXCIpIHRocm93IHJlamVjdChcIlVOQUNDRVBUQUJMRVwiLCB7IGV4cGVjdGVkOiBcInN0cmVhbVwiLCBtZXNzYWdlOiBgTm90IGFjY2VwdGFibGUsIHRoZSBBY2NlcHQgaW4gdGhlIHJlcXVlc3QgaGVhZGVyIHNob3VsZCBiZSBcInRleHQvZXZlbnQtc3RyZWFtXCIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIFwiQG1pbGtpby9zdGFyZ2F0ZVwiIHBhY2thZ2UsIHBsZWFzZSBhZGQgXFxgdHlwZTogXCJzdHJlYW1cIlxcYCB0byB0aGUgZXhlY3V0ZSBvcHRpb25zLmAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcbiAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcbiAgICAgICAgICBtaXhpbkNvbnRleHQ6IHsgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMgfSxcbiAgICAgICAgICBwYXJhbXM6IGh0dHAucGFyYW1zLnN0cmluZyxcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmJvZHkgPT09IFwiXCIgJiYgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGV4ZWN1dGVkLmVtcHR5UmVzdWx0KSB7XG4gICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjp7fSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXhlY3V0ZWQucmVzdWx0c1R5cGVTYWZldHkpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSBge1wiZGF0YVwiOiR7cm91dGVTY2hlbWEucmVzdWx0c1RvSlNPTihleGVjdXRlZC5yZXN1bHRzLnZhbHVlKX0sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6JHtUU09OLnN0cmluZ2lmeShleGVjdXRlZC5yZXN1bHRzLnZhbHVlKX0sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlc3BvbnNlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCBoZWFkZXJzOiBodHRwLnJlcXVlc3QuaGVhZGVycywgY29udGV4dDogZXhlY3V0ZWQuY29udGV4dCB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIGluc2lkZSBvbkZpbmFsbHkuXCIsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdHJlYW1cbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xuICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAgfSk7XG4gICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgIHRyaWUuYWRkKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlICE9PSBcInN0cmVhbVwiKSB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJzdHJlYW1cIiwgbWVzc2FnZTogYE5vdCBhY2NlcHRhYmxlLCB0aGUgQWNjZXB0IGluIHRoZSByZXF1ZXN0IGhlYWRlciBzaG91bGQgYmUgXCJhcHBsaWNhdGlvbi9qc29uXCIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIFwiQG1pbGtpby9zdGFyZ2F0ZVwiIHBhY2thZ2UsIHBsZWFzZSByZW1vdmUgXFxgdHlwZTogXCJzdHJlYW1cIlxcYCB0byB0aGUgZXhlY3V0ZSBvcHRpb25zLmAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVDbG9zZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcbiAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcbiAgICAgICAgICBtaXhpbkNvbnRleHQ6IHsgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMgfSxcbiAgICAgICAgICBwYXJhbXM6IGh0dHAucGFyYW1zLnN0cmluZyxcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICBsZXQgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgIGxldCBjb250cm9sOiBSZWFkYWJsZVN0cmVhbURpcmVjdENvbnRyb2xsZXIgfCBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICBpZiAodHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgICB0eXBlOiBcImRpcmVjdFwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXI6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlcikge1xuICAgICAgICAgICAgICBjb250cm9sID0gY29udHJvbGxlcjtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShbbnVsbCwgVFNPTi5lbmNvZGUodmFsdWUpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6JHtyZXN1bHR9XFxuXFxuYCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtleGNlcHRpb24uY29kZV0gPSBleGNlcHRpb24ucmVqZWN0O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6JHtKU09OLnN0cmluZ2lmeShbVFNPTi5lbmNvZGUocmVzdWx0KSwgbnVsbF0pfVxcblxcbmApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgY29udHJvbC5jbG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9kZS5qcyBvciBvdGhlcnNcbiAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShbbnVsbCwgVFNPTi5lbmNvZGUodmFsdWUpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUucmV0dXJuKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW1RTT04uZW5jb2RlKHJlc3VsdCksIG51bGxdKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2UuYm9keSA9IHN0cmVhbTtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwidGV4dC9ldmVudC1zdHJlYW1cIjtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVyc1tcIkNhY2hlLUNvbnRyb2xcIl0gPSBcIm5vLWNhY2hlXCI7XG5cbiAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMsIGNvbnRleHQ6IGV4ZWN1dGVkLmNvbnRleHQgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8TWlsa2lvUmVzcG9uc2VSZWplY3Q+ID0ge1xuICAgICAgICB2YWx1ZTogZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpLFxuICAgICAgfTtcbiAgICAgIGlmIChyZXN1bHRzLnZhbHVlICE9PSB1bmRlZmluZWQpIHJlc3BvbnNlLmJvZHkgPSBUU09OLnN0cmluZ2lmeShyZXN1bHRzLnZhbHVlKTtcblxuICAgICAgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHJlc3BvbnNlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlTWVzc2FnZSA9IGFzeW5jIChcbiAgICBwb3J0OiB7IHBvc3RNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQgfSxcbiAgICBvcHRpb25zOlxuICAgICAgfCB7XG4gICAgICAgICAgZXhlY3V0ZUlkOiBzdHJpbmc7XG4gICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIH1cbiAgICAgIHwgXCJQSU5HXCIsXG4gICkgPT4ge1xuICAgIGlmIChvcHRpb25zID09PSBcIlBJTkdcIikge1xuICAgICAgcG9ydC5wb3N0TWVzc2FnZShcIlBPTkdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KG9wdGlvbnMucGF0aCk7XG4gICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW29wdGlvbnMucGF0aF07XG4gICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBvcHRpb25zLnBhdGggfSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICBlbHNlIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xuICAgICAgdHJpZS5hZGQob3B0aW9ucy5wYXRoLCByb3V0ZVNjaGVtYSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXMgPz8ge307XG4gICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIG9wdGlvbnMucGF0aCwgb3B0aW9ucy5leGVjdXRlSWQpO1xuICAgIGxldCBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gPSBbXTtcblxuICAgIGNvbnN0IGh0dHAgPSBuZXcgUHJveHkoXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJub3RGb3VuZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJjb250ZXh0Lmh0dHBcIiwgbWVzc2FnZTogXCJUaGlzIHJlcXVlc3Qgd2FzIGludm9rZWQgdGhyb3VnaCB0aGUgZXhlY3V0ZSBtZXRob2QuIFNpbmNlIG5vIGFjdHVhbCByZXF1ZXN0IHdhcyBnZW5lcmF0ZWQsIHRoZSBIVFRQIG1ldGhvZHMgdW5kZXIgdGhlIGNvbnRleHQgY2Fubm90IGJlIGFjY2Vzc2VkLlwiIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJjb250ZXh0Lmh0dHBcIiwgbWVzc2FnZTogXCJUaGlzIHJlcXVlc3Qgd2FzIGludm9rZWQgdGhyb3VnaCB0aGUgZXhlY3V0ZSBtZXRob2QuIFNpbmNlIG5vIGFjdHVhbCByZXF1ZXN0IHdhcyBnZW5lcmF0ZWQsIHRoZSBIVFRQIG1ldGhvZHMgdW5kZXIgdGhlIGNvbnRleHQgY2Fubm90IGJlIGFjY2Vzc2VkLlwiIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSBhc3luYyAoKSA9PiB7XG4gICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUob3B0aW9ucy5leGVjdXRlSWQpO1xuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAocm91dGVTY2hlbWEudHlwZSA9PT0gXCJhY3Rpb25cIikge1xuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxuICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBtaXhpbkNvbnRleHQ6IHsgaHR0cDogaHR0cCwgaGVhZGVycyB9LFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcblxuICAgICAgICBpZiAoZXhlY3V0ZWQuZW1wdHlSZXN1bHQpIHtcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBvcnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBkYXRhOiBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocm91dGVTY2hlbWEudHlwZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxuICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBtaXhpbkNvbnRleHQ6IHsgaHR0cDogaHR0cCwgaGVhZGVycyB9LFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFtudWxsLCB2YWx1ZV0sIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIob3B0aW9ucy5leGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7IHN1Y2Nlc3M6IGZhbHNlLCBkYXRhOiBbVFNPTi5lbmNvZGUocmVzdWx0KSwgbnVsbF0sIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgZXhjZXB0aW9uSGFuZGxlcihvcHRpb25zLmV4ZWN1dGVJZCwgbG9nZ2VyLCBlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcG9ydCxcbiAgICBmZXRjaCxcbiAgICBoYW5kbGVNZXNzYWdlLFxuICB9O1xufVxuIiwKICAgICJpbXBvcnQgeyBUU09OIH0gZnJvbSBcIkBzb3V0aGVybi1hdXJvcmEvdHNvblwiO1xuaW1wb3J0IHR5cGUgeyBNaWxraW9SZXNwb25zZVJlamVjdCwgTG9nZ2VyIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgJHJlamVjdENvZGUge1xuICBGQUlMOiBzdHJpbmc7XG4gIFJFUVVFU1RfRkFJTDogYW55O1xuICBOT1RfREVWRUxPUF9NT0RFOiBzdHJpbmc7XG4gIFJFUVVFU1RfVElNRU9VVDogeyB0aW1lb3V0OiBudW1iZXI7IG1lc3NhZ2U6IHN0cmluZyB9O1xuICBOT1RfRk9VTkQ6IHsgcGF0aDogc3RyaW5nIH07XG4gIFBBUkFNU19UWVBFX0lOQ09SUkVDVDogeyBwYXRoOiBzdHJpbmc7IGV4cGVjdGVkOiBzdHJpbmc7IHZhbHVlOiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9IHwgbnVsbDtcbiAgUkVTVUxUU19UWVBFX0lOQ09SUkVDVDogeyBwYXRoOiBzdHJpbmc7IGV4cGVjdGVkOiBzdHJpbmc7IHZhbHVlOiBhbnk7IG1lc3NhZ2U6IHN0cmluZyB9IHwgbnVsbDtcbiAgVU5BQ0NFUFRBQkxFOiB7IGV4cGVjdGVkOiBzdHJpbmc7IG1lc3NhZ2U6IHN0cmluZyB9O1xuICBQQVJBTVNfVFlQRV9OT1RfU1VQUE9SVEVEOiB7IGV4cGVjdGVkOiBzdHJpbmcgfTtcbiAgUkVTVUxUU19UWVBFX05PVF9TVVBQT1JURUQ6IHsgZXhwZWN0ZWQ6IHN0cmluZyB9O1xuICBJTlRFUk5BTF9TRVJWRVJfRVJST1I6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlamVjdDxDb2RlIGV4dGVuZHMga2V5b2YgJHJlamVjdENvZGUsIFJlamVjdERhdGEgZXh0ZW5kcyAkcmVqZWN0Q29kZVtDb2RlXT4oY29kZTogQ29kZSwgZGF0YTogUmVqZWN0RGF0YSk6IE1pbGtpb1JlamVjdEVycm9yPENvZGUsIFJlamVjdERhdGE+IHtcbiAgY29uc3QgZXJyb3IgPSB7ICRtaWxraW9SZWplY3Q6IHRydWUsIGNvZGUsIGRhdGEgfSBhcyBNaWxraW9SZWplY3RFcnJvcjxDb2RlLCBSZWplY3REYXRhPjtcbiAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UoZXJyb3IpO1xuICByZXR1cm4gZXJyb3I7XG59XG5cbmV4cG9ydCB0eXBlIE1pbGtpb1JlamVjdEVycm9yPENvZGUgZXh0ZW5kcyBrZXlvZiAkcmVqZWN0Q29kZSA9IGtleW9mICRyZWplY3RDb2RlLCBSZWplY3REYXRhIGV4dGVuZHMgJHJlamVjdENvZGVbQ29kZV0gPSAkcmVqZWN0Q29kZVtDb2RlXT4gPSB7IGNvZGU6IENvZGU7IGRhdGE6IFJlamVjdERhdGE7IHN0YWNrOiBzdHJpbmc7ICRtaWxraW9SZWplY3Q6IHRydWUgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkOiBzdHJpbmcsIGxvZ2dlcjogTG9nZ2VyLCBlcnJvcjogTWlsa2lvUmVqZWN0RXJyb3I8YW55LCBhbnk+IHwgYW55KTogTWlsa2lvUmVzcG9uc2VSZWplY3Qge1xuICB0cnkge1xuICAgIGlmIChcInZpdGVTZXJ2ZXJcIiBpbiBnbG9iYWxUaGlzKSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlcnJvcik7IC8vIGZpeCB2aXRlIHNzciBzdGFja3RyYWNlXG4gIH0gY2F0Y2ggKGVycm9yKSB7fVxuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBcInZpdGVTZXJ2ZXJcIiBpbiBnbG9iYWxUaGlzKSAoZ2xvYmFsVGhpcyBhcyBhbnkpLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlcnJvcik7XG4gIGNvbnN0IG5hbWUgPSBlcnJvcj8uY29kZSA/PyBlcnJvcj8ubmFtZSA/PyBlcnJvcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gXCJVbm5hbWVkIEV4Y2VwdGlvblwiO1xuXG4gIGlmIChlcnJvcj8uJG1pbGtpb1JlamVjdCA9PT0gdHJ1ZSAmJiBlcnJvcj8uY29kZSA9PT0gXCJOT1RfRk9VTkRcIikge1xuICAgIGxvZ2dlci5pbmZvKG5hbWUsIGVycm9yPy5kYXRhPy5wYXRoID8/IFwiVW5rbm93biBwYXRoXCIpO1xuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFjayA9IGVycm9yPy4kbWlsa2lvUmVqZWN0ID8gKGVycm9yPy5zdGFjayA/PyBcIlwiKS5zcGxpdChcIlxcblwiKS5zbGljZSgyKS5qb2luKFwiXFxuXCIpIDogKGVycm9yPy5zdGFjayA/PyBcIlwiKTtcbiAgICAgIGxvZ2dlci5lcnJvcihuYW1lLCBgXFxuJHtUU09OLnN0cmluZ2lmeShlcnJvcj8uZGF0YSl9YCwgYFxcbiR7c3RhY2t9XFxuYCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgbG9nZ2VyLmVycm9yKG5hbWUsIGBcXG4ke2Vycm9yPy50b1N0cmluZygpfWAsIGBcXG4ke2Vycm9yPy5zdGFja31cXG5gKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcmVzdWx0OiBNaWxraW9SZXNwb25zZVJlamVjdDtcblxuICBpZiAoZXJyb3I/LiRtaWxraW9SZWplY3QgPT09IHRydWUpIHJlc3VsdCA9IHsgc3VjY2VzczogZmFsc2UsIGNvZGU6IGVycm9yLmNvZGUsIHJlamVjdDogZXJyb3IuZGF0YSwgZXhlY3V0ZUlkIH07XG4gIGVsc2UgcmVzdWx0ID0geyBzdWNjZXNzOiBmYWxzZSwgY29kZTogXCJJTlRFUk5BTF9TRVJWRVJfRVJST1JcIiwgcmVqZWN0OiB1bmRlZmluZWQsIGV4ZWN1dGVJZCB9O1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBQU8sU0FBUyxJQUE2QixDQUFDLFNBQTJCO0FBQUEsRUFDdkUsT0FBTyxRQUFRO0FBQUE7O0FDVVYsU0FBUyxVQUEwQyxDQUFDLE9BQStCO0FBQUEsRUFDeEYsT0FBTztBQUFBLElBQ0wsTUFBTSxPQUFPLEVBQUUsYUFBYSxlQUFlLE1BQU07QUFBQSxFQUNuRDtBQUFBOztBQ2RGLElBQU0sSUFBSTtBQUFBLEVBQ1IsT0FBTztBQUFBLElBQ0wsV0FBVztBQUFBLE1BQ1Q7QUFBQSxRQUNFLE9BQU8sQ0FBQyxNQUFNLE9BQU8sS0FBSztBQUFBLFFBQzFCLFNBQVMsQ0FBQyxNQUFNLFlBQVksRUFBRSxTQUFTO0FBQUEsTUFDekM7QUFBQSxNQUNBO0FBQUEsUUFDRSxPQUFPLENBQUMsTUFBTSxhQUFhO0FBQUEsUUFDM0IsU0FBUyxDQUFDLE1BQU0sVUFBVSxFQUFFLFlBQVk7QUFBQSxNQUMxQztBQUFBLE1BQ0E7QUFBQSxRQUNFLE9BQU8sQ0FBQyxNQUFNLGFBQWE7QUFBQSxRQUMzQixTQUFTLENBQUMsTUFBTSxTQUFTLEVBQUUsU0FBUztBQUFBLE1BQ3RDO0FBQUEsTUFDQTtBQUFBLFFBQ0UsT0FBTyxDQUFDLE1BQU0sYUFBYTtBQUFBLFFBQzNCLFNBQVMsQ0FBQyxNQUFNLFlBQVksRUFBRSxTQUFTO0FBQUEsTUFDekM7QUFBQSxNQUNBO0FBQUEsUUFDRSxPQUFPLENBQUMsTUFBTSxhQUFhO0FBQUEsUUFDM0IsU0FBUyxDQUFDLE1BQU0sZ0JBQWdCLElBQUksWUFBWSxFQUFFLE9BQU8sQ0FBQztB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QUEsRUFDdkQsRUFBTztBQUFBLElBQ0wsSUFBSTtBQUFBLE1BQ0YsTUFBTSxRQUFRLE9BQU8saUJBQWlCLE9BQU8sU0FBUyxJQUFJLE1BQU07QUFBQSxDQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSztBQUFBLENBQUksSUFBSyxPQUFPLFNBQVM7QUFBQSxNQUM3RyxPQUFPLE1BQU0sTUFBTTtBQUFBLEVBQUssRUFBSyxVQUFVLE9BQU8sSUFBSSxLQUFLO0FBQUEsRUFBSztBQUFBLENBQVM7QUFBQSxNQUNyRSxPQUFPLEdBQUc7QUFBQSxNQUNWLE9BQU8sTUFBTSxNQUFNO0FBQUEsRUFBSyxPQUFPLFNBQVMsS0FBSztBQUFBLEVBQUssT0FBTztBQUFBLENBQVM7QUFBQTtBQUFBO0FBQUEsRUFJdEUsSUFBSTtBQUFBLEVBRUosSUFBSSxPQUFPLGtCQUFrQjtBQUFBLElBQU0sU0FBUyxFQUFFLFNBQVMsT0FBTyxNQUFNLE1BQU0sTUFBTSxRQUFRLE1BQU0sTUFBTSxVQUFVO0FBQUEsRUFDekc7QUFBQSxhQUFTLEVBQUUsU0FBUyxPQUFPLE1BQU0seUJBQXlCLFFBQVEsV0FBVyxVQUFVO0FBQUEsRUFFNUYsT0FBTztBQUFBOyIsCiAgImRlYnVnSWQiOiAiMzE3QTEwNDNBRUI0RDE1NjY0NzU2RTIxNjQ3NTZFMjEiLAogICJuYW1lcyI6IFtdCn0=
2547
+ //# debugId=FCE56C231E7FB20A64756E2164756E21
2548
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi5cXHV0aWxzXFxwYXJ0LnRzIiwgIi4uXFx0eXBlLXNhZmV0eVxcaW5kZXgudHMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcQHNvdXRoZXJuLWF1cm9yYVxcdHNvblxcZGlzdFxcdHNvbi5qcyIsICIuLlxcY29uZmlnXFxpbmRleC50cyIsICIuLlxcdXRpbHNcXGhlYWRlcnMtdG8tanNvbi50cyIsICIuLlxcZXhlY3V0ZVxcaW5kZXgudHMiLCAiLi5cXGJvb3RzdHJhcFxcaW5kZXgudHMiLCAiLi5cXGV2ZW50XFxpbmRleC50cyIsICIuLlxcZmxvd1xcaW5kZXgudHMiLCAiLi5cXGhhbmRsZXJcXGluZGV4LnRzIiwgIi4uXFx1dGlsc1xcY3JlYXRlLWlkLnRzIiwgIi4uXFxleGVjdXRlXFxleGVjdXRlLWlkLWdlbmVyYXRvci50cyIsICIuLlxcd29ybGRcXGluZGV4LnRzIiwgIi4uXFxjb21tYW5kXFxpbmRleC50cyIsICIuLlxcYWN0aW9uXFxpbmRleC50cyIsICIuLlxcc3RyZWFtXFxpbmRleC50cyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcY29uc3RhbnRzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxjb25zdHJ1Y3RGcm9tLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFx0b0RhdGUuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGRlZmF1bHRPcHRpb25zLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mV2Vlay5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZklTT1dlZWsuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGdldElTT1dlZWtZZWFyLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxub3JtYWxpemVEYXRlcy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZkRheS5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxzdGFydE9mSVNPV2Vla1llYXIuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGlzRGF0ZS5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcaXNWYWxpZC5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZlllYXIuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXGZvcm1hdERpc3RhbmNlLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkRm9ybWF0TG9uZ0ZuLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxmb3JtYXRMb25nLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxmb3JtYXRSZWxhdGl2ZS5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxfbGliXFxidWlsZExvY2FsaXplRm4uanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXGxvY2FsZVxcZW4tVVNcXF9saWJcXGxvY2FsaXplLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXF9saWJcXGJ1aWxkTWF0Y2hGbi5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxfbGliXFxidWlsZE1hdGNoUGF0dGVybkZuLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxsb2NhbGVcXGVuLVVTXFxfbGliXFxtYXRjaC5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcbG9jYWxlXFxlbi1VUy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZ2V0RGF5T2ZZZWFyLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXRJU09XZWVrLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXRXZWVrWWVhci5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcc3RhcnRPZldlZWtZZWFyLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxnZXRXZWVrLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxhZGRMZWFkaW5nWmVyb3MuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGZvcm1hdFxcbGlnaHRGb3JtYXR0ZXJzLmpzIiwgIi4uXFxub2RlX21vZHVsZXNcXGRhdGUtZm5zXFxfbGliXFxmb3JtYXRcXGZvcm1hdHRlcnMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXGZvcm1hdFxcbG9uZ0Zvcm1hdHRlcnMuanMiLCAiLi5cXG5vZGVfbW9kdWxlc1xcZGF0ZS1mbnNcXF9saWJcXHByb3RlY3RlZFRva2Vucy5qcyIsICIuLlxcbm9kZV9tb2R1bGVzXFxkYXRlLWZuc1xcZm9ybWF0LmpzIiwgIi4uXFx1dGlsc1xcc2VuZC1jb29rYm9vay1ldmVudC50cyIsICIuLlxcbG9nZ2VyXFxpbmRleC50cyIsICIuLlxcc3RlcFxcaW5kZXgudHMiLCAiLi5cXHV0aWxzXFx0cmllLnRzIiwgIi4uXFxsaXN0ZW5lclxcaW5kZXgudHMiLCAiLi5cXGV4Y2VwdGlvblxcaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IGZ1bmN0aW9uIHBhcnQ8VCBleHRlbmRzICgpID0+IHVua25vd24+KGhhbmRsZXI6IFQpOiBSZXR1cm5UeXBlPFQ+IHtcclxuICByZXR1cm4gaGFuZGxlcigpIGFzIHVua25vd24gYXMgUmV0dXJuVHlwZTxUPjtcclxufVxyXG4iLAogICAgImV4cG9ydCB0eXBlIFR5cGVTYWZldHk8VmFsdWUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiA9ICh2YWx1ZTogVmFsdWUpID0+IFR5cGVTYWZldHlWYWx1ZTtcblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2FmZXR5VmFsdWUge1xuICB0eXBlOiA8VHlwZSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KCkgPT4gVHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlU2FmZXR5VHlwZTxUeXBlIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4ge1xuICAkbWlsa2lvVHlwZTogXCJ0eXBlLXNhZmV0eVwiO1xuICB2YWx1ZTogVHlwZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVTYWZldHk8VmFsdWUgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+Pih2YWx1ZTogVmFsdWUpOiBUeXBlU2FmZXR5VmFsdWUge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICgpID0+ICh7ICRtaWxraW9UeXBlOiBcInR5cGUtc2FmZXR5XCIsIHZhbHVlIH0pLFxuICB9IGFzIGFueTtcbn1cbiIsCiAgICAiY29uc3QgYyA9IHtcbiAgcnVsZXM6IHtcbiAgICBzdHJpbmdpZnk6IFtcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0eXBlb2YgdCA9PSBcImJpZ2ludFwiLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gYHQhYmlnaW50OiR7dC50b1N0cmluZygpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIERhdGUsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFEYXRlOiR7dC50b0lTT1N0cmluZygpfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdCBpbnN0YW5jZW9mIFVSTCxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IVVSTDoke3QudG9TdHJpbmcoKX1gXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQgaW5zdGFuY2VvZiBSZWdFeHAsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFSZWdFeHA6JHt0LnRvU3RyaW5nKCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgVWludDhBcnJheSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IGB0IVVpbnQ4QXJyYXk6JHtuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUodCl9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIsXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBgdCFBcnJheUJ1ZmZlcjoke25ldyBUZXh0RGVjb2RlcigpLmRlY29kZSh0KX1gXG4gICAgICB9XG4gICAgXSxcbiAgICBwYXJzZTogW1xuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhYmlnaW50OlwiKSxcbiAgICAgICAgaGFuZGxlcjogKHQpID0+IEJpZ0ludCh0LnNsaWNlKDkpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IURhdGU6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IERhdGUodC5zbGljZSg3KSlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG1hdGNoOiAodCkgPT4gdC5zdGFydHNXaXRoKFwidCFVUkw6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IFVSTCh0LnNsaWNlKDYpKVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbWF0Y2g6ICh0KSA9PiB0LnN0YXJ0c1dpdGgoXCJ0IVJlZ0V4cDpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgUmVnRXhwKHQuc2xpY2UoOSkpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhVWludDhBcnJheTpcIiksXG4gICAgICAgIGhhbmRsZXI6ICh0KSA9PiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodC5zbGljZSgxMykpXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBtYXRjaDogKHQpID0+IHQuc3RhcnRzV2l0aChcInQhQXJyYXlCdWZmZXI6XCIpLFxuICAgICAgICBoYW5kbGVyOiAodCkgPT4gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHQuc2xpY2UoMTQpKS5idWZmZXJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHN0cmluZ2lmeSh0KSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGMuZW5jb2RlKHQpKTtcbiAgfSxcbiAgcGFyc2UodCkge1xuICAgIHJldHVybiBjLmRlY29kZShKU09OLnBhcnNlKHQpKTtcbiAgfSxcbiAgZW5jb2RlKHQpIHtcbiAgICBmdW5jdGlvbiBuKGUpIHtcbiAgICAgIGlmICghZSB8fCB0eXBlb2YgZSAhPSBcIm9iamVjdFwiICYmIHR5cGVvZiBlICE9IFwiYmlnaW50XCIpXG4gICAgICAgIHJldHVybiBlO1xuICAgICAgaWYgKGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgICAgICBjb25zdCBzID0gW107XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgc1tpXSA9IG4oZVtpXSk7XG4gICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIGZvciAoY29uc3QgcyBvZiBjLnJ1bGVzLnN0cmluZ2lmeSlcbiAgICAgICAgaWYgKHMubWF0Y2goZSkpXG4gICAgICAgICAgcmV0dXJuIHMuaGFuZGxlcihlKTtcbiAgICAgIGNvbnN0IHIgPSB7fTtcbiAgICAgIGZvciAodmFyIGEgaW4gZSlcbiAgICAgICAgclthXSA9IG4oZVthXSk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgcmV0dXJuIG4odCk7XG4gIH0sXG4gIGRlY29kZSh0KSB7XG4gICAgZnVuY3Rpb24gbihlKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShlKSlcbiAgICAgICAgcmV0dXJuIGUubWFwKG4pO1xuICAgICAgaWYgKHR5cGVvZiBlID09IFwib2JqZWN0XCIgJiYgZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCByID0ge307XG4gICAgICAgIGZvciAoY29uc3QgYSBpbiBlKVxuICAgICAgICAgIGUuaGFzT3duUHJvcGVydHkoYSkgJiYgKHJbYV0gPSBuKGVbYV0pKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZm9yIChjb25zdCByIG9mIGMucnVsZXMucGFyc2UpXG4gICAgICAgICAgaWYgKHIubWF0Y2goZSkgPT09ICEwKVxuICAgICAgICAgICAgcmV0dXJuIHIuaGFuZGxlcihlKTtcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZTtcbiAgICB9XG4gICAgcmV0dXJuIG4odCk7XG4gIH1cbn07XG5leHBvcnQge1xuICBjIGFzIFRTT05cbn07XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBjb25maWc8Q29uZmlnVCBleHRlbmRzIENvbmZpZz4oY29uZmlnOiBDb25maWdUKTogQ29uZmlnVCB7XG4gIHJldHVybiBjb25maWc7XG59XG5cbmV4cG9ydCB0eXBlIENvbmZpZyA9IChtb2RlOiBzdHJpbmcpID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnRW52aXJvbm1lbnRzPFQgZXh0ZW5kcyBDb25maWc+IHtcbiAgW2tleTogc3RyaW5nXTogKGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPikgPT4gUGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+PiB8IFByb21pc2U8UGFydGlhbDxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pj47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnZUb1N0cmluZyh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IHN0cmluZykge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gYCR7dmFsdWV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvTnVtYmVyKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZTogbnVtYmVyKSB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuXG4gIHJldHVybiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVudlRvQm9vbGVhbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IGJvb2xlYW4pIHtcbiAgaWYgKHZhbHVlID09PSBcInRydWVcIikgcmV0dXJuIHRydWU7XG5cbiAgaWYgKHZhbHVlID09PSBcImZhbHNlXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodmFsdWUgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICBpZiAodW5kZWZpbmVkID09PSB2YWx1ZSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcblxuICByZXR1cm4gQm9vbGVhbih2YWx1ZSk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBoZWFkZXJzVG9KU09OKGhlYWRlcnM6IEhlYWRlcnMpIHtcbiAgY29uc3QganNvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAoaGVhZGVycyBhcyBhbnkpLmVudHJpZXMoKSkge1xuICAgIGpzb25ba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBqc29uO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IElWYWxpZGF0aW9uIH0gZnJvbSBcInR5cGlhXCI7XG5pbXBvcnQgeyBUU09OIH0gZnJvbSBcIkBzb3V0aGVybi1hdXJvcmEvdHNvblwiO1xuaW1wb3J0IHsgcmVqZWN0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7ICRjb250ZXh0LCAkbWV0YSwgTG9nZ2VyLCBSZXN1bHRzLCBHZW5lcmF0ZWRJbml0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgeyBoZWFkZXJzVG9KU09OIH0gZnJvbSBcIi4uL3V0aWxzL2hlYWRlcnMtdG8tanNvbi50c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gX19pbml0RXhlY3V0ZXIoZ2VuZXJhdGVkOiBHZW5lcmF0ZWRJbml0LCBydW50aW1lOiBhbnkpIHtcbiAgY29uc3QgX19leGVjdXRlID0gYXN5bmMgKFxuICAgIHJvdXRlU2NoZW1hOiBhbnksXG4gICAgb3B0aW9uczoge1xuICAgICAgY3JlYXRlZEV4ZWN1dGVJZDogc3RyaW5nO1xuICAgICAgY3JlYXRlZExvZ2dlcjogTG9nZ2VyO1xuICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IEhlYWRlcnM7XG4gICAgICBtaXhpbkNvbnRleHQ6IFJlY29yZDxhbnksIGFueT4gfCB1bmRlZmluZWQ7XG4gICAgfSAmIChcbiAgICAgIHwge1xuICAgICAgICAgIHBhcmFtczogUmVjb3JkPGFueSwgYW55PjtcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICBwYXJhbXM6IHN0cmluZztcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiO1xuICAgICAgICB9XG4gICAgKSxcbiAgKTogUHJvbWlzZTx7IGV4ZWN1dGVJZDogc3RyaW5nOyBoZWFkZXJzOiBIZWFkZXJzOyBwYXJhbXM6IFJlY29yZDxhbnksIHVua25vd24+OyByZXN1bHRzOiBSZXN1bHRzPGFueT47IGNvbnRleHQ6ICRjb250ZXh0OyBtZXRhOiBSZWFkb25seTwkbWV0YT47IHR5cGU6IFwiYWN0aW9uXCIgfCBcInN0cmVhbVwiOyBlbXB0eVJlc3VsdDogYm9vbGVhbjsgcmVzdWx0c1R5cGVTYWZldHk6IGJvb2xlYW47IGZpbmFsZXM6IEFycmF5PCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+PiB9PiA9PiB7XG4gICAgY29uc3QgZXhlY3V0ZUlkOiBzdHJpbmcgPSBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQ7XG4gICAgbGV0IGhlYWRlcnM6IEhlYWRlcnM7XG4gICAgaWYgKCEob3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSGVhZGVycykpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGhlYWRlcnMgPSBuZXcgSGVhZGVycyh7XG4gICAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzO1xuICAgIH1cbiAgICBpZiAoIShcInRvSlNPTlwiIGluIGhlYWRlcnMpKSAoaGVhZGVycyBhcyBhbnkpLnRvSlNPTiA9ICgpID0+IGhlYWRlcnNUb0pTT04oaGVhZGVycyk7XG5cbiAgICBjb25zdCBmaW5hbGVzOiBBcnJheTxhbnk+ID0gW107XG4gICAgY29uc3Qgb25GaW5hbGx5ID0gKGhhbmRsZXI6IGFueSkgPT4gZmluYWxlcy51bnNoaWZ0KGhhbmRsZXIpO1xuXG4gICAgbGV0IHBhcmFtczogUmVjb3JkPGFueSwgdW5rbm93bj47XG4gICAgaWYgKG9wdGlvbnMucGFyYW1zVHlwZSA9PT0gXCJyYXdcIikge1xuICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7XG4gICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvcHRpb25zLnBhcmFtcyA9PT0gXCJcIikge1xuICAgICAgICBwYXJhbXMgPSB7fTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyYW1zID0gVFNPTi5wYXJzZShvcHRpb25zLnBhcmFtcyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHBhcmFtcyA9PT0gXCJ1bmRlZmluZWRcIikgcGFyYW1zID0ge307XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGFyYW1zKSkgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRFwiLCB7IGV4cGVjdGVkOiBcImpzb25cIiB9KTtcbiAgICBpZiAoXCIkbWlsa2lvR2VuZXJhdGVQYXJhbXNcIiBpbiBwYXJhbXMgJiYgcGFyYW1zLiRtaWxraW9HZW5lcmF0ZVBhcmFtcyA9PT0gXCJlbmFibGVcIikge1xuICAgICAgaWYgKCFydW50aW1lLmRldmVsb3ApIHRocm93IHJlamVjdChcIk5PVF9ERVZFTE9QX01PREVcIiwgXCJUaGlzIGZlYXR1cmUgbXVzdCBiZSBpbiBjb29rYm9vayB0byB1c2UuXCIpO1xuICAgICAgZGVsZXRlIHBhcmFtcy4kbWlsa2lvR2VuZXJhdGVQYXJhbXM7XG4gICAgICBsZXQgcGFyYW1zUmFuZCA9IHJvdXRlU2NoZW1hLnJhbmRvbVBhcmFtcygpO1xuICAgICAgaWYgKHBhcmFtc1JhbmQgPT09IHVuZGVmaW5lZCB8fCBwYXJhbXNSYW5kID09PSBudWxsKSBwYXJhbXNSYW5kID0ge307XG4gICAgICBwYXJhbXMgPSB7IC4uLnBhcmFtc1JhbmQsIC4uLnBhcmFtcyB9O1xuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMubWl4aW5Db250ZXh0Py5odHRwPy5ub3RGb3VuZCAmJiBvcHRpb25zLm1peGluQ29udGV4dD8uaHR0cD8ucGFyYW1zPy5zdHJpbmcpIG9wdGlvbnMubWl4aW5Db250ZXh0Lmh0dHAucGFyYW1zLnBhcnNlZCA9IHBhcmFtczsgLy8gbGlzdGVuIOOBp+ODkeODvOOCueOBl+OBn+ODkeODqeODoeODvOOCv+OCkua4oeOBmVxuICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAuLi4ob3B0aW9ucy5taXhpbkNvbnRleHQgPyBvcHRpb25zLm1peGluQ29udGV4dCA6IHt9KSxcbiAgICAgIGRldmVsb3A6IHJ1bnRpbWUuZGV2ZWxvcCxcbiAgICAgIHBhdGg6IG9wdGlvbnMucGF0aCxcbiAgICAgIGxvZ2dlcjogb3B0aW9ucy5jcmVhdGVkTG9nZ2VyLFxuICAgICAgZW1pdDogcnVudGltZS5lbWl0LFxuICAgICAgZXhlY3V0ZUlkOiBvcHRpb25zLmNyZWF0ZWRFeGVjdXRlSWQsXG4gICAgICBjb25maWc6IHJ1bnRpbWUucnVudGltZS5jb25maWcsXG4gICAgICBjYWxsOiAobW9kdWxlOiBhbnksIG9wdGlvbnM6IGFueSkgPT4gX19jYWxsKGNvbnRleHQsIG1vZHVsZSwgb3B0aW9ucyksXG4gICAgICBvbkZpbmFsbHk6IG9uRmluYWxseSxcbiAgICAgIF86IHJ1bnRpbWUsXG4gICAgfSBhcyB1bmtub3duIGFzICRjb250ZXh0O1xuICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8YW55PiA9IHsgdmFsdWU6IHVuZGVmaW5lZCB9O1xuXG4gICAgY29uc3QgbW9kdWxlID0gcm91dGVTY2hlbWEubW9kdWxlO1xuICAgIGNvbnN0IG1ldGEgPSAobW9kdWxlLmRlZmF1bHQ/Lm1ldGEgPyBtb2R1bGUuZGVmYXVsdD8ubWV0YSA6IHt9KSBhcyB1bmtub3duIGFzIFJlYWRvbmx5PCRtZXRhPjtcblxuICAgIGlmIChtZXRhLnR5cGVTYWZldHkgPT09IHVuZGVmaW5lZCB8fCBtZXRhLnR5cGVTYWZldHkgPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSByb3V0ZVNjaGVtYS52YWxpZGF0ZVBhcmFtcyhwYXJhbXMpIGFzIElWYWxpZGF0aW9uPGFueT47XG4gICAgICBpZiAoIXZhbGlkYXRpb24uc3VjY2VzcykgdGhyb3cgcmVqZWN0KFwiUEFSQU1TX1RZUEVfSU5DT1JSRUNUXCIsIHsgLi4udmFsaWRhdGlvbi5lcnJvcnNbMF0sIG1lc3NhZ2U6IGBUaGUgdmFsdWUgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0ucGF0aH0nIGlzICcke3ZhbGlkYXRpb24uZXJyb3JzWzBdLnZhbHVlfScsIHdoaWNoIGRvZXMgbm90IG1lZXQgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0uZXhwZWN0ZWR9JyByZXF1aXJlbWVudHMuYCB9KTtcbiAgICB9XG5cbiAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86ZXhlY3V0ZUJlZm9yZVwiLCB7IGV4ZWN1dGVJZDogb3B0aW9ucy5jcmVhdGVkRXhlY3V0ZUlkLCBsb2dnZXI6IG9wdGlvbnMuY3JlYXRlZExvZ2dlciwgcGF0aDogb3B0aW9ucy5wYXRoLCBtZXRhLCBjb250ZXh0IH0pO1xuXG4gICAgcmVzdWx0cy52YWx1ZSA9IGF3YWl0IG1vZHVsZS5kZWZhdWx0LmhhbmRsZXIoY29udGV4dCwgcGFyYW1zKTtcblxuICAgIGxldCByZXN1bHRzVHlwZVNhZmV0eSA9IGZhbHNlO1xuICAgIGlmIChyZXN1bHRzPy52YWx1ZT8uJG1pbGtpb1R5cGUgPT09IFwidHlwZS1zYWZldHlcIikge1xuICAgICAgcmVzdWx0c1R5cGVTYWZldHkgPSB0cnVlO1xuICAgICAgY29uc3QgdmFsaWRhdGlvbiA9IHJvdXRlU2NoZW1hLnZhbGlkYXRlUmVzdWx0cyhyZXN1bHRzLnZhbHVlLnZhbHVlKSBhcyBJVmFsaWRhdGlvbjxhbnk+O1xuICAgICAgaWYgKCF2YWxpZGF0aW9uLnN1Y2Nlc3MpIHRocm93IHJlamVjdChcIlJFU1VMVFNfVFlQRV9JTkNPUlJFQ1RcIiwgeyAuLi52YWxpZGF0aW9uLmVycm9yc1swXSwgbWVzc2FnZTogYFRoZSB2YWx1ZSAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS5wYXRofScgaXMgJyR7dmFsaWRhdGlvbi5lcnJvcnNbMF0udmFsdWV9Jywgd2hpY2ggZG9lcyBub3QgbWVldCAnJHt2YWxpZGF0aW9uLmVycm9yc1swXS5leHBlY3RlZH0nIHJlcXVpcmVtZW50cy5gIH0pO1xuICAgICAgcmVzdWx0cy52YWx1ZSA9IHJlc3VsdHMudmFsdWUudmFsdWU7XG4gICAgfVxuXG4gICAgbGV0IGVtcHR5UmVzdWx0ID0gZmFsc2U7XG4gICAgaWYgKHJlc3VsdHMudmFsdWUgPT09IHVuZGVmaW5lZCB8fCByZXN1bHRzLnZhbHVlID09PSBudWxsIHx8IHJlc3VsdHMudmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIGVtcHR5UmVzdWx0ID0gdHJ1ZTtcbiAgICAgIHJlc3VsdHMudmFsdWUgPSB7fTtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0cy52YWx1ZSkpIHtcbiAgICAgIHRocm93IHJlamVjdChcIkZBSUxcIiwgXCJUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGhhbmRsZXIgbXVzdCBiZSBhbiBvYmplY3QsIHdoaWNoIGlzIGN1cnJlbnRseSBhbiBhcnJheS5cIik7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0cy52YWx1ZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgcmVqZWN0KFwiRkFJTFwiLCBcIlRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaGFuZGxlciBtdXN0IGJlIGFuIG9iamVjdCwgd2hpY2ggaXMgY3VycmVudGx5IGEgcHJpbWl0aXZlIHR5cGUuXCIpO1xuICAgIH1cblxuICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIiwgeyBleGVjdXRlSWQ6IG9wdGlvbnMuY3JlYXRlZEV4ZWN1dGVJZCwgbG9nZ2VyOiBvcHRpb25zLmNyZWF0ZWRMb2dnZXIsIHBhdGg6IG9wdGlvbnMucGF0aCwgbWV0YSwgY29udGV4dCwgcmVzdWx0cyB9KTtcblxuICAgIHJldHVybiB7IGV4ZWN1dGVJZCwgaGVhZGVycywgcGFyYW1zLCByZXN1bHRzLCBjb250ZXh0LCBtZXRhLCB0eXBlOiBtb2R1bGUuJG1pbGtpb1R5cGUsIGVtcHR5UmVzdWx0LCByZXN1bHRzVHlwZVNhZmV0eSwgZmluYWxlcyB9O1xuICB9O1xuXG4gIGNvbnN0IF9fY2FsbCA9IGFzeW5jIChjb250ZXh0OiAkY29udGV4dCwgbW9kdWxlOiB7IGRlZmF1bHQ6IGFueSB9LCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlPGFueT4gPT4ge1xuICAgIGNvbnN0IG1vZHVsZUF3YWl0ZWQgPSBhd2FpdCBtb2R1bGU7XG4gICAgcmV0dXJuIGF3YWl0IG1vZHVsZUF3YWl0ZWQuZGVmYXVsdC5oYW5kbGVyKGNvbnRleHQsIHBhcmFtcyk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBfX2NhbGwsXG4gICAgX19leGVjdXRlLFxuICB9O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE1pbGtpb1dvcmxkIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYm9vdHN0cmFwPEJvb3RzdHJhcEluaXRUIGV4dGVuZHMgQm9vdHN0cmFwSW5pdD4oaW5pdDogQm9vdHN0cmFwSW5pdFQpOiBCb290c3RyYXBJbml0VCB7XHJcbiAgcmV0dXJuIGluaXQ7XHJcbn1cclxuXHJcbmV4cG9ydCB0eXBlIEJvb3RzdHJhcEluaXQgPSAod29ybGQ6IE1pbGtpb1dvcmxkKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcclxuIiwKICAgICJpbXBvcnQgdHlwZSB7ICRjb250ZXh0LCBDb250ZXh0SHR0cCwgUmVzdWx0cywgTG9nZ2VyLCAkbWV0YSB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlICRldmVudHMge1xuICBcIm1pbGtpbzpodHRwUmVxdWVzdFwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB9O1xuICBcIm1pbGtpbzpodHRwUmVzcG9uc2VcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgaHR0cDogQ29udGV4dEh0dHA8UmVjb3JkPHN0cmluZywgYW55Pj47IGNvbnRleHQ6ICRjb250ZXh0IH07XG4gIFwibWlsa2lvOmh0dHBOb3RGb3VuZFwiOiB7IGV4ZWN1dGVJZDogc3RyaW5nOyBwYXRoOiBzdHJpbmc7IGxvZ2dlcjogTG9nZ2VyOyBodHRwOiBDb250ZXh0SHR0cDxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB9O1xuICBcIm1pbGtpbzpleGVjdXRlQmVmb3JlXCI6IHsgZXhlY3V0ZUlkOiBzdHJpbmc7IHBhdGg6IHN0cmluZzsgbG9nZ2VyOiBMb2dnZXI7IG1ldGE6ICRtZXRhOyBjb250ZXh0OiAkY29udGV4dCB9O1xuICBcIm1pbGtpbzpleGVjdXRlQWZ0ZXJcIjogeyBleGVjdXRlSWQ6IHN0cmluZzsgcGF0aDogc3RyaW5nOyBsb2dnZXI6IExvZ2dlcjsgbWV0YTogJG1ldGE7IGNvbnRleHQ6ICRjb250ZXh0OyByZXN1bHRzOiBSZXN1bHRzPGFueT4gfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdEV2ZW50TWFuYWdlcigpIHtcbiAgY29uc3QgaGFuZGxlcnMgPSBuZXcgTWFwPChldmVudDogYW55KSA9PiB2b2lkLCBzdHJpbmc+KCk7XG4gIGNvbnN0IGluZGV4ZWQgPSBuZXcgTWFwPHN0cmluZywgU2V0PChldmVudDogYW55KSA9PiB2b2lkPj4oKTtcblxuICBjb25zdCBldmVudE1hbmFnZXIgPSB7XG4gICAgb246IDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBIYW5kbGVyIGV4dGVuZHMgKGV2ZW50OiAkZXZlbnRzW0tleV0pID0+IHZvaWQ+KGtleTogS2V5LCBoYW5kbGVyOiBIYW5kbGVyKSA9PiB7XG4gICAgICBoYW5kbGVycy5zZXQoaGFuZGxlciwga2V5IGFzIHN0cmluZyk7XG4gICAgICBpZiAoaW5kZXhlZC5oYXMoa2V5IGFzIHN0cmluZykgPT09IGZhbHNlKSB7XG4gICAgICAgIGluZGV4ZWQuc2V0KGtleSBhcyBzdHJpbmcsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzZXQgPSBpbmRleGVkLmdldChrZXkgYXMgc3RyaW5nKSE7XG4gICAgICBzZXQuYWRkKGhhbmRsZXIpO1xuICAgICAgaGFuZGxlcnMuc2V0KGhhbmRsZXIsIGtleSBhcyBzdHJpbmcpO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBoYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHNldC5kZWxldGUoaGFuZGxlcik7XG4gICAgICB9O1xuICAgIH0sXG4gICAgb2ZmOiA8S2V5IGV4dGVuZHMga2V5b2YgJGV2ZW50cywgSGFuZGxlciBleHRlbmRzIChldmVudDogJGV2ZW50c1tLZXldKSA9PiB2b2lkPihrZXk6IEtleSwgaGFuZGxlcjogSGFuZGxlcikgPT4ge1xuICAgICAgY29uc3Qgc2V0ID0gaW5kZXhlZC5nZXQoa2V5IGFzIHN0cmluZyk7XG4gICAgICBpZiAoIXNldCkgcmV0dXJuO1xuICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgc2V0LmRlbGV0ZShoYW5kbGVyKTtcbiAgICB9LFxuICAgIGVtaXQ6IGFzeW5jIDxLZXkgZXh0ZW5kcyBrZXlvZiAkZXZlbnRzLCBWYWx1ZSBleHRlbmRzICRldmVudHNbS2V5XT4oa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgY29uc3QgaCA9IGluZGV4ZWQuZ2V0KGtleSBhcyBzdHJpbmcpO1xuICAgICAgaWYgKGgpIHtcbiAgICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGgpIHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVyKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGV2ZW50TWFuYWdlcjtcbn1cbiIsCiAgICAiZXhwb3J0IHR5cGUgTWlsa2lvRmxvdzxULCBUUmV0dXJuID0gYW55LCBUTmV4dCA9IGFueT4gPSB7XHJcbiAgZW1pdDogKGZsb3c6IFQpID0+IHZvaWQ7XHJcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gTWlsa2lvRmxvdzxUPjtcclxuICBuZXh0KC4uLlt2YWx1ZV06IFtdIHwgW1ROZXh0XSk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+O1xyXG4gIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PjtcclxuICB0aHJvdyhlcnJvcjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj47XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvdzxUPigpOiBNaWxraW9GbG93PFQ+IHtcclxuICBsZXQgc3RhdHVzOiBcInBlbmRpbmdcIiB8IFwicmVzb2x2ZWRcIiB8IFwicmVqZWN0ZWRcIiA9IFwicGVuZGluZ1wiO1xyXG4gIGNvbnN0IGZsb3dzOiBBcnJheTx7XHJcbiAgICBibGFuazogYm9vbGVhbjtcclxuICAgIHByb21pc2U6IFByb21pc2U8VD47XHJcbiAgICByZXNvbHZlOiAodmFsdWU/OiBUIHwgUHJvbWlzZUxpa2U8VD4pID0+IHZvaWQ7XHJcbiAgICByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+IHZvaWQ7XHJcbiAgfT4gPSBbXTtcclxuXHJcbiAgY29uc3QgaXRlcmF0b3IgPSB7XHJcbiAgICBlbWl0OiAoZmxvdzogVCkgPT4ge1xyXG4gICAgICBpZiAoZmxvd3MuYXQoLTEpPy5ibGFuayA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGNvbnN0IGl0ZW0gPSBmbG93cy5hdCgtMSkhO1xyXG4gICAgICAgIGl0ZW0uYmxhbmsgPSBmYWxzZTtcclxuICAgICAgICBpdGVtLnJlc29sdmUoZmxvdyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVycyA9IFByb21pc2Uud2l0aFJlc29sdmVyczxUPigpO1xyXG4gICAgICAgIHJlc29sdmVycy5yZXNvbHZlKGZsb3cpO1xyXG4gICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiBmYWxzZSB9IGFzIGFueSk7XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICAuLi4oe1xyXG4gICAgICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcclxuICAgICAgICBpZiAoc3RhdHVzICE9PSBcInBlbmRpbmdcIikgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG51bGwgfTtcclxuICAgICAgICBpZiAoZmxvd3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcclxuICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmxvdyA9IGZsb3dzLmF0KDApITtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbG93LnByb21pc2U7XHJcbiAgICAgICAgZmxvd3Muc2hpZnQoKTtcclxuICAgICAgICByZXR1cm4geyBkb25lOiBzdGF0dXMgIT09IFwicGVuZGluZ1wiLCB2YWx1ZTogcmVzdWx0IH07XHJcbiAgICAgIH0sXHJcbiAgICAgIGFzeW5jIHJldHVybigpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PHZvaWQ+PiB7XHJcbiAgICAgICAgc3RhdHVzID0gXCJyZXNvbHZlZFwiO1xyXG4gICAgICAgIGZvciAoY29uc3QgZmxvdyBvZiBmbG93cykge1xyXG4gICAgICAgICAgZmxvdy5ibGFuayA9IGZhbHNlO1xyXG4gICAgICAgICAgZmxvdy5yZXNvbHZlKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH07XHJcbiAgICAgIH0sXHJcbiAgICAgIGFzeW5jIHRocm93KGVycjogYW55KTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDx2b2lkPj4ge1xyXG4gICAgICAgIHN0YXR1cyA9IFwicmVqZWN0ZWRcIjtcclxuICAgICAgICBpZiAoZmxvd3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICBjb25zdCByZXNvbHZlcnMgPSBQcm9taXNlLndpdGhSZXNvbHZlcnM8VD4oKTtcclxuICAgICAgICAgIGZsb3dzLnB1c2goeyAuLi5yZXNvbHZlcnMsIGJsYW5rOiB0cnVlIH0gYXMgYW55KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChjb25zdCBmbG93IG9mIGZsb3dzKSB7XHJcbiAgICAgICAgICBmbG93LmJsYW5rID0gZmFsc2U7XHJcbiAgICAgICAgICBmbG93LnJlamVjdChlcnIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4geyBkb25lOiB0cnVlLCB2YWx1ZTogbnVsbCB9O1xyXG4gICAgICB9LFxyXG4gICAgfSBzYXRpc2ZpZXMgQXN5bmNJdGVyYXRvcjx1bmtub3duPiksXHJcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH0sXHJcbiAgfTtcclxuXHJcbiAgcmV0dXJuIGl0ZXJhdG9yIGFzIE1pbGtpb0Zsb3c8VD47XHJcbn1cclxuIiwKICAgICJpbXBvcnQgdHlwZSB7IE1pbGtpb1dvcmxkIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlcjxIYW5kbGVySW5pdFQgZXh0ZW5kcyBIYW5kbGVySW5pdD4oaW5pdDogSGFuZGxlckluaXRUKTogSGFuZGxlckluaXRUIHtcclxuICByZXR1cm4gaW5pdDtcclxufVxyXG5cclxuZXhwb3J0IHR5cGUgSGFuZGxlckluaXQgPSAod29ybGQ6IE1pbGtpb1dvcmxkKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcclxuIiwKICAgICJ0eXBlIElkR2VuZXJhdG9yT3B0aW9ucyA9IHtcbiAgbGVuZ3RoPzogbnVtYmVyO1xuICB0aW1lc3RhbXA6IGJvb2xlYW47XG4gIHNlcXVlbnRpYWw6IGJvb2xlYW47XG59O1xuXG5mdW5jdGlvbiBkZWZpbmVJZEdlbmVyYXRvcihvcHRpb25zOiBJZEdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zLmxlbmd0aCkgb3B0aW9ucy5sZW5ndGggPSAyNDtcbiAgaWYgKG9wdGlvbnMubGVuZ3RoIDwgMSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsZW5ndGhcIik7XG4gIGlmIChvcHRpb25zLmxlbmd0aCA+IDYxKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxlbmd0aFwiKTtcbiAgaWYgKG9wdGlvbnMudGltZXN0YW1wICYmIG9wdGlvbnMubGVuZ3RoIDwgOSkgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsZW5ndGhcIik7XG4gIGxldCBsYXN0VGltZSA9IDA7XG4gIGxldCBsYXN0RGVjaW1hbCA9IDBuO1xuICByZXR1cm4ge1xuICAgIGNyZWF0ZUlkKCkge1xuICAgICAgbGV0IHJhbmRMZW5ndGggPSBvcHRpb25zLmxlbmd0aCE7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgbGV0IGlkID0gXCJcIjtcbiAgICAgIGlmIChvcHRpb25zLnRpbWVzdGFtcCkge1xuICAgICAgICByYW5kTGVuZ3RoIC09IDg7XG4gICAgICAgIGlkID0gYCR7aWR9JHtfX2JpZ0ludFRvU3RyaW5nKEJpZ0ludChub3cpKS5wYWRTdGFydCg4LCBcIjBcIil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnNlcXVlbnRpYWwgJiYgbGFzdFRpbWUgPT09IG5vdykge1xuICAgICAgICBpZCA9IGAke2lkfSR7X19iaWdJbnRUb1N0cmluZygrK2xhc3REZWNpbWFsKS5wYWRTdGFydCgxLCBcIjBcIil9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxhc3RUaW1lID0gbm93O1xuICAgICAgICBjb25zdCBtaW4gPSAwbjtcbiAgICAgICAgY29uc3QgbWF4ID0gX19nZXRNYXhWYWx1ZShCaWdJbnQocmFuZExlbmd0aCkpO1xuICAgICAgICBsYXN0RGVjaW1hbCA9IF9fc2VjdXJlUmFuZG9tQmlnSW50KG1pbiwgbWF4KTtcbiAgICAgICAgaWQgPSBgJHtpZH0ke19fYmlnSW50VG9TdHJpbmcobGFzdERlY2ltYWwpLnBhZFN0YXJ0KHJhbmRMZW5ndGgsIFwiMFwiKX1gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkO1xuICAgIH0sXG4gICAgZ2V0SWRUaW1lc3RhbXAoaWQ6IHN0cmluZykge1xuICAgICAgcmV0dXJuIG9wdGlvbnMudGltZXN0YW1wID8gTnVtYmVyKF9fc3RyaW5nVG9CaWdJbnQoaWQuc2xpY2UoMCwgOCkucmVwbGFjZUFsbChcIjBcIiwgXCJcIikpKSA6IDA7XG4gICAgfSxcbiAgfTtcbn1cblxuY29uc3QgRU5DT0RJTkcgPSBcIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XCI7XG5cbmZ1bmN0aW9uIF9fc2VjdXJlUmFuZG9tQmlnSW50KG1pbjogYmlnaW50LCBtYXg6IGJpZ2ludCk6IGJpZ2ludCB7XG4gIGlmIChtaW4gPj0gbWF4KSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJhbmdlXCIpO1xuXG4gIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluICsgMW47XG4gIGNvbnN0IGJ5dGVDb3VudCA9IE1hdGguY2VpbChOdW1iZXIoQmlnSW50KHJhbmdlLnRvU3RyaW5nKDIpLmxlbmd0aCkpIC8gOCk7XG4gIGNvbnN0IGVudHJvcHlCeXRlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVDb3VudCk7XG5cbiAgbGV0IHJhbmRvbVZhbHVlOiBiaWdpbnQ7XG4gIGRvIHtcbiAgICBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGVudHJvcHlCeXRlcyk7XG4gICAgcmFuZG9tVmFsdWUgPVxuICAgICAgQmlnSW50KFxuICAgICAgICBgMHgke0FycmF5LmZyb20oZW50cm9weUJ5dGVzKVxuICAgICAgICAgIC5tYXAoKGIpID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsIFwiMFwiKSlcbiAgICAgICAgICAuam9pbihcIlwiKX1gLFxuICAgICAgKSAlIHJhbmdlO1xuICB9IHdoaWxlIChyYW5kb21WYWx1ZSA8IDBuKTtcblxuICByZXR1cm4gbWluICsgcmFuZG9tVmFsdWU7XG59XG5cbmZ1bmN0aW9uIF9fYmlnSW50VG9TdHJpbmcodmFsdWU6IGJpZ2ludCk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBCaWdJbnQoRU5DT0RJTkcubGVuZ3RoKTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCBjdXJyZW50ID0gdmFsdWU7XG5cbiAgaWYgKGN1cnJlbnQgPT09IDBuKSByZXR1cm4gRU5DT0RJTkdbMF07XG5cbiAgd2hpbGUgKGN1cnJlbnQgPiAwbikge1xuICAgIGNvbnN0IHJlbWFpbmRlciA9IGN1cnJlbnQgJSBiYXNlO1xuICAgIHJlc3VsdCA9IEVOQ09ESU5HW051bWJlcihyZW1haW5kZXIpXSArIHJlc3VsdDtcbiAgICBjdXJyZW50ID0gY3VycmVudCAvIGJhc2U7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gX19zdHJpbmdUb0JpZ0ludChzdHI6IHN0cmluZyk6IGJpZ2ludCB7XG4gIGNvbnN0IGNoYXJNYXA6IHsgW2tleTogc3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBFTkNPRElORy5sZW5ndGg7IGkrKykge1xuICAgIGNoYXJNYXBbRU5DT0RJTkdbaV1dID0gaTtcbiAgfVxuXG4gIGNvbnN0IGJhc2UgPSBCaWdJbnQoRU5DT0RJTkcubGVuZ3RoKTtcbiAgbGV0IHJlc3VsdCA9IDBuO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY2hhciA9IHN0cltpXTtcbiAgICBpZiAoIShjaGFyIGluIGNoYXJNYXApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyICcke2NoYXJ9JyBpbiBpbnB1dCBzdHJpbmdgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBCaWdJbnQoY2hhck1hcFtjaGFyXSk7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICogYmFzZSArIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gX19nZXRNYXhWYWx1ZShuOiBiaWdpbnQpOiBiaWdpbnQge1xuICByZXR1cm4gQmlnSW50KEVOQ09ESU5HLmxlbmd0aCkgKiogbiAtIDFuO1xufVxuXG5jb25zdCBpZEdlbmVyYXRvciA9IGRlZmluZUlkR2VuZXJhdG9yKHsgbGVuZ3RoOiAyNCwgdGltZXN0YW1wOiBmYWxzZSwgc2VxdWVudGlhbDogZmFsc2UgfSk7XG5cbmV4cG9ydCBjb25zdCBfX2NyZWF0ZUlkID0gaWRHZW5lcmF0b3IuY3JlYXRlSWQ7XG4iLAogICAgImltcG9ydCB7IF9fY3JlYXRlSWQgfSBmcm9tIFwiLi4vdXRpbHMvY3JlYXRlLWlkLnRzXCI7XG5cbmV4cG9ydCB0eXBlIEV4ZWN1dGVJZEdlbmVyYXRvciA9IChoZWFkZXJzPzogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lRGVmYXVsdEV4ZWN1dGVJZEdlbmVyYXRvcigpIHtcbiAgcmV0dXJuIF9fY3JlYXRlSWQ7XG59XG4iLAogICAgImltcG9ydCB7IHR5cGUgJHR5cGVzLCBfX2luaXRDb21tYW5kZXIsIF9faW5pdExpc3RlbmVyLCBfX2luaXRFeGVjdXRlciwgX19pbml0RXZlbnRNYW5hZ2VyLCB0eXBlIEV4ZWN1dGVJZCwgdHlwZSBMb2dnZXIsIHR5cGUgTWl4aW4sIHR5cGUgR2VuZXJhdGVkSW5pdCwgdHlwZSBQaW5nLCB0eXBlIExvZ2dlclN1Ym1pdHRpbmdIYW5kbGVyLCB0eXBlIExvZ2dlckluc2VydGluZ0hhbmRsZXIgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IGRlZmluZURlZmF1bHRFeGVjdXRlSWRHZW5lcmF0b3IgfSBmcm9tIFwiLi4vZXhlY3V0ZS9leGVjdXRlLWlkLWdlbmVyYXRvci50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pbGtpb0luaXQge1xuICBwb3J0OiBudW1iZXI7XG4gIGRldmVsb3A6IGJvb2xlYW47XG4gIGNvb2tib29rOiB7XG4gICAgY29va2Jvb2tQb3J0OiBudW1iZXI7XG4gIH07XG4gIGNvcnM/OiB7XG4gICAgY29yc0FsbG93TWV0aG9kcz86IHN0cmluZztcbiAgICBjb3JzQWxsb3dIZWFkZXJzPzogc3RyaW5nO1xuICAgIGNvcnNBbGxvd09yaWdpbj86IHN0cmluZztcbiAgfTtcbiAgaWdub3JlUGF0aExldmVsPzogbnVtYmVyO1xuICByZWFsSXA/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nO1xuICBleGVjdXRlSWQ/OiAoaGVhZGVyczogSGVhZGVycykgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICBvbkxvZ2dlclN1Ym1pdHRpbmc/OiBMb2dnZXJTdWJtaXR0aW5nSGFuZGxlcjtcbiAgb25Mb2dnZXJJbnNlcnRpbmc/OiBMb2dnZXJJbnNlcnRpbmdIYW5kbGVyO1xuICBib290c3RyYXBzPzogQXJyYXk8KHdvcmxkOiBNaWxraW9Xb3JsZCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQ+O1xufVxuXG5leHBvcnQgdHlwZSBNaWxraW9SdW50aW1lSW5pdDxUIGV4dGVuZHMgTWlsa2lvSW5pdD4gPSBNaXhpbjxcbiAgVCxcbiAge1xuICAgIGV4ZWN1dGVJZDogKGhlYWRlcnM6IEhlYWRlcnMpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgICBydW50aW1lOiB7XG4gICAgICByZXF1ZXN0OiBNYXA8RXhlY3V0ZUlkLCB7IGxvZ2dlcjogTG9nZ2VyIH0+O1xuICAgICAgY29uZmlnOiBBd2FpdGVkPFJldHVyblR5cGU8JHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wiY29uZmlnU2NoZW1hXCJdPj47XG4gICAgICBhcHA6IGFueTtcbiAgICB9O1xuICAgIG9uOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib25cIl07XG4gICAgb2ZmOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib2ZmXCJdO1xuICAgIGVtaXQ6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJlbWl0XCJdO1xuICB9XG4+O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ybGQ8TWlsa2lvT3B0aW9ucyBleHRlbmRzIE1pbGtpb0luaXQ+KGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgY29uZmlnU2NoZW1hOiB7IGdldDogKCkgPT4gUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+PiB9LCBvcHRpb25zOiBNaWxraW9PcHRpb25zKTogUHJvbWlzZTxNaWxraW9Xb3JsZDxNaWxraW9PcHRpb25zPj4ge1xuICBjb25zdCBleGVjdXRlSWQgPSBvcHRpb25zLmV4ZWN1dGVJZCA/PyBkZWZpbmVEZWZhdWx0RXhlY3V0ZUlkR2VuZXJhdG9yKCk7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGNvbmZpZ1NjaGVtYS5nZXQoKTtcblxuICBjb25zdCBydW50aW1lID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBNYXAoKSxcbiAgICBjb25maWcsXG4gIH0gYXMgTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz5bXCJydW50aW1lXCJdO1xuXG4gIGNvbnN0IGV2ZW50TWFuYWdlciA9IF9faW5pdEV2ZW50TWFuYWdlcigpO1xuXG4gIGNvbnN0IF86IE1pbGtpb1J1bnRpbWVJbml0PE1pbGtpb09wdGlvbnM+ID0ge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgZXhlY3V0ZUlkLFxuICAgIHJ1bnRpbWUsXG4gICAgb246IGV2ZW50TWFuYWdlci5vbixcbiAgICBvZmY6IGV2ZW50TWFuYWdlci5vZmYsXG4gICAgZW1pdDogZXZlbnRNYW5hZ2VyLmVtaXQsXG4gIH07XG5cbiAgY29uc3QgZXhlY3V0ZXIgPSBfX2luaXRFeGVjdXRlcihnZW5lcmF0ZWQsIF8pO1xuICBjb25zdCBjb21tYW5kZXIgPSBfX2luaXRDb21tYW5kZXIoZ2VuZXJhdGVkLCBfKTtcbiAgY29uc3QgbGlzdGVuZXIgPSBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQsIF8sIGV4ZWN1dGVyKTtcblxuICAvLyBJbml0aWFsaXplIHRoZSBhcHBcbiAgY29uc3Qgd29ybGQgPSB7XG4gICAgXyxcbiAgICAvLyBldmVudCBtYW5hZ2VyXG4gICAgb246IGV2ZW50TWFuYWdlci5vbixcbiAgICBvZmY6IGV2ZW50TWFuYWdlci5vZmYsXG4gICAgZW1pdDogZXZlbnRNYW5hZ2VyLmVtaXQsXG4gICAgLy8gY29tbWFuZGVyXG4gICAgY29tbWFuZGVyLFxuICAgIC8vIGxpc3RlbmVyXG4gICAgbGlzdGVuZXIsXG4gICAgLy8gZnVuY3Rpb25cbiAgICBjb25maWcsXG4gIH07XG5cbiAgcnVudGltZS5hcHAgPSB3b3JsZDtcblxuICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zLmJvb3RzdHJhcHMpKSB7XG4gICAgZm9yIChjb25zdCBib290c3RyYXAgb2Ygb3B0aW9ucy5ib290c3RyYXBzKSB7XG4gICAgICBhd2FpdCBib290c3RyYXAod29ybGQgYXMgTWlsa2lvV29ybGQ8TWlsa2lvT3B0aW9ucz4pO1xuICAgIH1cbiAgfVxuXG4gIGF3YWl0IFByb21pc2UuYWxsKGdlbmVyYXRlZC5oYW5kbGVyU2NoZW1hLmxvYWRIYW5kbGVycyh3b3JsZCkpO1xuXG4gIHJldHVybiB3b3JsZCBhcyBNaWxraW9Xb3JsZDxNaWxraW9PcHRpb25zPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNaWxraW9Xb3JsZDxNaWxraW9PcHRpb25zIGV4dGVuZHMgTWlsa2lvSW5pdCA9IE1pbGtpb0luaXQ+IHtcbiAgXzogTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvT3B0aW9ucz47XG4gIC8vIGV2ZW50IG1hbmFnZXJcbiAgb246IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0RXZlbnRNYW5hZ2VyPj5bXCJvblwiXTtcbiAgb2ZmOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wib2ZmXCJdO1xuICBlbWl0OiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV2ZW50TWFuYWdlcj4+W1wiZW1pdFwiXTtcbiAgcGluZzogKG9wdGlvbnM/OiB7IHRpbWVvdXQ/OiBudW1iZXIgfSkgPT4gUHJvbWlzZTxQaW5nPjtcbiAgLy8gY29tbWFuZGVyXG4gIGNvbW1hbmRlcjogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBfX2luaXRDb21tYW5kZXI+PjtcbiAgLy8gbGlzdGVuZXJcbiAgbGlzdGVuZXI6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgX19pbml0TGlzdGVuZXI+PjtcbiAgY29uZmlnOiBSZWFkb25seTxBd2FpdGVkPFJldHVyblR5cGU8JHR5cGVzW1wiY29uZmlnU2NoZW1hXCJdW1wiZ2V0XCJdPj4+O1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IEdlbmVyYXRlZEluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbW1hbmQ8Q29tbWFuZEluaXRUIGV4dGVuZHMgQ29tbWFuZEluaXQ+KGluaXQ6IENvbW1hbmRJbml0VCk6IENvbW1hbmQ8Q29tbWFuZEluaXRUPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBpbml0IGFzIHVua25vd24gYXMgQ29tbWFuZDxDb21tYW5kSW5pdFQ+O1xuICBjb21tYW5kLiRtaWxraW9UeXBlID0gXCJjb21tYW5kXCI7XG4gIHJldHVybiBjb21tYW5kO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRJbml0IHtcbiAgaGFuZGxlcjogKGNvbW1hbmRzOiBBcnJheTxzdHJpbmc+LCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PiBQcm9taXNlPHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmQ8Q29tbWFuZEluaXRUIGV4dGVuZHMgQ29tbWFuZEluaXQ+IHtcbiAgJG1pbGtpb1R5cGU6IFwiY29tbWFuZFwiO1xuICBoYW5kbGVyOiBDb21tYW5kSW5pdFRbXCJoYW5kbGVyXCJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gX19pbml0Q29tbWFuZGVyKGdlbmVyYXRlZDogR2VuZXJhdGVkSW5pdCwgcnVudGltZTogYW55KSB7XG4gIGNvbnN0IGNvbW1hbmRlciA9IGFzeW5jIChhcmd2OiBBcnJheTxzdHJpbmc+LCBvcHRpb25zPzogeyBvbk5vdEZvdW5kPzogKCkgPT4gYW55IH0pID0+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBwYXRoOiBcImluZGV4XCIsXG4gICAgICBjb21tYW5kczogW10gYXMgQXJyYXk8c3RyaW5nPixcbiAgICAgIG9wdGlvbnM6IHt9IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHRydWU+LFxuICAgIH07XG4gICAgZm9yIChjb25zdCB2IG9mIGFyZ3Yuc2xpY2UoMykpIHtcbiAgICAgIGlmICh2LnN0YXJ0c1dpdGgoXCItLVwiKSAmJiB2LmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICBjb25zdCB2U3BsaXRlZCA9IHYuc3BsaXQoXCI9XCIpO1xuICAgICAgICBwYXJhbXMub3B0aW9uc1t2U3BsaXRlZFswXS5zbGljZSgyKV0gPSB2U3BsaXRlZC5zbGljZSgxLCB2U3BsaXRlZC5sZW5ndGgpLmpvaW4oXCI9XCIpO1xuICAgICAgfSBlbHNlIGlmICh2LnN0YXJ0c1dpdGgoXCItLVwiKSkge1xuICAgICAgICBwYXJhbXMub3B0aW9uc1t2LnNsaWNlKDIpXSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIGlmICh2LnN0YXJ0c1dpdGgoXCItXCIpICYmIHYuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgIGNvbnN0IHZTcGxpdGVkID0gdi5zcGxpdChcIj1cIik7XG4gICAgICAgIHBhcmFtcy5vcHRpb25zW3ZTcGxpdGVkWzBdLnNsaWNlKDEpXSA9IHZTcGxpdGVkLnNsaWNlKDEsIHZTcGxpdGVkLmxlbmd0aCkuam9pbihcIj1cIik7XG4gICAgICB9IGVsc2UgaWYgKHYuc3RhcnRzV2l0aChcIi1cIikpIHtcbiAgICAgICAgcGFyYW1zLm9wdGlvbnNbdi5zbGljZSgxKV0gPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcmFtcy5jb21tYW5kcy5wdXNoKHYpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXJndi5sZW5ndGggPT09IDIpIHBhcmFtcy5wYXRoID0gXCJpbmRleFwiO1xuICAgIGVsc2UgcGFyYW1zLnBhdGggPSBgJHthcmd2WzJdID8/IFwiaW5kZXhcIn1gO1xuXG4gICAgaWYgKCEocGFyYW1zLnBhdGggaW4gZ2VuZXJhdGVkLmNvbW1hbmRTY2hlbWEuY29tbWFuZHMpKSB7XG4gICAgICBpZiAob3B0aW9ucz8ub25Ob3RGb3VuZCkgcmV0dXJuIGF3YWl0IG9wdGlvbnMub25Ob3RGb3VuZCgpO1xuICAgICAgY29uc29sZS5sb2coYFxceDFCWzQ0bSBVd1UgXFx4MUJbMG0gXFx4MUJbMm1Db21tYW5kIG5vdCBmb3VuZDpcXHgxQlswbSBcXHgxQlszMm0ke3BhcmFtcy5wYXRofVxceDFCWzBtYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZWQuY29tbWFuZFNjaGVtYS5jb21tYW5kc1twYXJhbXMucGF0aF0ubW9kdWxlLmhhbmRsZXIocGFyYW1zLmNvbW1hbmRzLCBwYXJhbXMub3B0aW9ucyk7XG4gIH07XG5cbiAgcmV0dXJuIGNvbW1hbmRlcjtcbn1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgJG1ldGEgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGFjdGlvbjxBY3Rpb25Jbml0VCBleHRlbmRzIEFjdGlvbkluaXQ+KGluaXQ6IEFjdGlvbkluaXRUKTogQWN0aW9uPEFjdGlvbkluaXRUPiB7XG4gIGNvbnN0IGFjdGlvbiA9IGluaXQgYXMgdW5rbm93biBhcyBBY3Rpb248QWN0aW9uSW5pdFQ+O1xuICBhY3Rpb24uJG1pbGtpb1R5cGUgPSBcImFjdGlvblwiO1xuICBpZiAoYWN0aW9uLm1ldGEgPT09IHVuZGVmaW5lZCkgYWN0aW9uLm1ldGEgPSB7fTtcbiAgcmV0dXJuIGFjdGlvbjtcbn1cblxuZXhwb3J0IHR5cGUgQWN0aW9uSW5pdCA9IHtcbiAgbWV0YT86ICRtZXRhO1xuICBoYW5kbGVyOiAoY29udGV4dDogJGNvbnRleHQsIHBhcmFtczogYW55KSA9PiBQcm9taXNlPHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgQWN0aW9uPEFjdGlvbkluaXRUIGV4dGVuZHMgQWN0aW9uSW5pdD4gPSB7XG4gICRtaWxraW9UeXBlOiBcImFjdGlvblwiO1xuICBtZXRhOiBBY3Rpb25Jbml0VFtcIm1ldGFcIl0gZXh0ZW5kcyB1bmRlZmluZWQgPyB7fSA6IEFjdGlvbkluaXRUW1wibWV0YVwiXTtcbiAgaGFuZGxlcjogQWN0aW9uSW5pdFRbXCJoYW5kbGVyXCJdO1xufTtcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgJG1ldGEgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmVhbTxTdHJlYW1Jbml0VCBleHRlbmRzIFN0cmVhbUluaXQ+KGluaXQ6IFN0cmVhbUluaXRUKTogU3RyZWFtPFN0cmVhbUluaXRUPiB7XG4gIGNvbnN0IHN0cmVhbSA9IGluaXQgYXMgdW5rbm93biBhcyBTdHJlYW08U3RyZWFtSW5pdFQ+O1xuICBzdHJlYW0uJG1pbGtpb1R5cGUgPSBcInN0cmVhbVwiO1xuICBpZiAoc3RyZWFtLm1ldGEgPT09IHVuZGVmaW5lZCkgc3RyZWFtLm1ldGEgPSB7fTtcbiAgcmV0dXJuIHN0cmVhbTtcbn1cblxuZXhwb3J0IHR5cGUgU3RyZWFtSW5pdCA9IHtcbiAgbWV0YT86ICRtZXRhO1xuICBoYW5kbGVyOiAoY29udGV4dDogJGNvbnRleHQsIHBhcmFtczogYW55KSA9PiBBc3luY0dlbmVyYXRvcjx1bmtub3duPjtcbn07XG5cbmV4cG9ydCB0eXBlIFN0cmVhbTxTdHJlYW1Jbml0VCBleHRlbmRzIFN0cmVhbUluaXQ+ID0ge1xuICAkbWlsa2lvVHlwZTogXCJzdHJlYW1cIjtcbiAgbWV0YTogU3RyZWFtSW5pdFRbXCJtZXRhXCJdIGV4dGVuZHMgdW5kZWZpbmVkID8ge30gOiBTdHJlYW1Jbml0VFtcIm1ldGFcIl07XG4gIGhhbmRsZXI6IFN0cmVhbUluaXRUW1wiaGFuZGxlclwiXTtcbn07XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb25zdGFudHNcbiAqIEBzdW1tYXJ5IFVzZWZ1bCBjb25zdGFudHNcbiAqIEBkZXNjcmlwdGlvblxuICogQ29sbGVjdGlvbiBvZiB1c2VmdWwgZGF0ZSBjb25zdGFudHMuXG4gKlxuICogVGhlIGNvbnN0YW50cyBjb3VsZCBiZSBpbXBvcnRlZCBmcm9tIGBkYXRlLWZucy9jb25zdGFudHNgOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBtYXhUaW1lLCBtaW5UaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGZ1bmN0aW9uIGlzQWxsb3dlZFRpbWUodGltZSkge1xuICogICByZXR1cm4gdGltZSA8PSBtYXhUaW1lICYmIHRpbWUgPj0gbWluVGltZTtcbiAqIH1cbiAqIGBgYFxuICovXG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBkYXlzSW5XZWVrXG4gKiBAc3VtbWFyeSBEYXlzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IGRheXNJbldlZWsgPSA3O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgZGF5c0luWWVhclxuICogQHN1bW1hcnkgRGF5cyBpbiAxIHllYXIuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBIb3cgbWFueSBkYXlzIGluIGEgeWVhci5cbiAqXG4gKiBPbmUgeWVhcnMgZXF1YWxzIDM2NS4yNDI1IGRheXMgYWNjb3JkaW5nIHRvIHRoZSBmb3JtdWxhOlxuICpcbiAqID4gTGVhcCB5ZWFyIG9jY3VycyBldmVyeSA0IHllYXJzLCBleGNlcHQgZm9yIHllYXJzIHRoYXQgYXJlIGRpdmlzaWJsZSBieSAxMDAgYW5kIG5vdCBkaXZpc2libGUgYnkgNDAwLlxuICogPiAxIG1lYW4geWVhciA9ICgzNjUrMS80LTEvMTAwKzEvNDAwKSBkYXlzID0gMzY1LjI0MjUgZGF5c1xuICovXG5leHBvcnQgY29uc3QgZGF5c0luWWVhciA9IDM2NS4yNDI1O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWF4VGltZVxuICogQHN1bW1hcnkgTWF4aW11bSBhbGxvd2VkIHRpbWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IG1heFRpbWUgfSBmcm9tIFwiLi9jb25zdGFudHMvZGF0ZS1mbnMvY29uc3RhbnRzXCI7XG4gKlxuICogY29uc3QgaXNWYWxpZCA9IDg2NDAwMDAwMDAwMDAwMDEgPD0gbWF4VGltZTtcbiAqIC8vPT4gZmFsc2VcbiAqXG4gKiBuZXcgRGF0ZSg4NjQwMDAwMDAwMDAwMDAxKTtcbiAqIC8vPT4gSW52YWxpZCBEYXRlXG4gKi9cbmV4cG9ydCBjb25zdCBtYXhUaW1lID0gTWF0aC5wb3coMTAsIDgpICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pblRpbWVcbiAqIEBzdW1tYXJ5IE1pbmltdW0gYWxsb3dlZCB0aW1lLlxuICpcbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBtaW5UaW1lIH0gZnJvbSBcIi4vY29uc3RhbnRzL2RhdGUtZm5zL2NvbnN0YW50c1wiO1xuICpcbiAqIGNvbnN0IGlzVmFsaWQgPSAtODY0MDAwMDAwMDAwMDAwMSA+PSBtaW5UaW1lO1xuICogLy89PiBmYWxzZVxuICpcbiAqIG5ldyBEYXRlKC04NjQwMDAwMDAwMDAwMDAxKVxuICogLy89PiBJbnZhbGlkIERhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IG1pblRpbWUgPSAtbWF4VGltZTtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgd2Vlay5cbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luV2VlayA9IDYwNDgwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBkYXkuXG4gKi9cbmV4cG9ydCBjb25zdCBtaWxsaXNlY29uZHNJbkRheSA9IDg2NDAwMDAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWlsbGlzZWNvbmRzSW5NaW51dGVcbiAqIEBzdW1tYXJ5IE1pbGxpc2Vjb25kcyBpbiAxIG1pbnV0ZVxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5NaW51dGUgPSA2MDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgTWlsbGlzZWNvbmRzIGluIDEgaG91clxuICovXG5leHBvcnQgY29uc3QgbWlsbGlzZWNvbmRzSW5Ib3VyID0gMzYwMDAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbGxpc2Vjb25kc0luU2Vjb25kXG4gKiBAc3VtbWFyeSBNaWxsaXNlY29uZHMgaW4gMSBzZWNvbmRcbiAqL1xuZXhwb3J0IGNvbnN0IG1pbGxpc2Vjb25kc0luU2Vjb25kID0gMTAwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJblllYXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luWWVhciA9IDUyNTYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbk1vbnRoXG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgbW9udGguXG4gKi9cbmV4cG9ydCBjb25zdCBtaW51dGVzSW5Nb250aCA9IDQzMjAwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbWludXRlc0luRGF5XG4gKiBAc3VtbWFyeSBNaW51dGVzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luRGF5ID0gMTQ0MDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1pbnV0ZXNJbkhvdXJcbiAqIEBzdW1tYXJ5IE1pbnV0ZXMgaW4gMSBob3VyLlxuICovXG5leHBvcnQgY29uc3QgbWludXRlc0luSG91ciA9IDYwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgbW9udGhzSW5RdWFydGVyXG4gKiBAc3VtbWFyeSBNb250aHMgaW4gMSBxdWFydGVyLlxuICovXG5leHBvcnQgY29uc3QgbW9udGhzSW5RdWFydGVyID0gMztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIG1vbnRoc0luWWVhclxuICogQHN1bW1hcnkgTW9udGhzIGluIDEgeWVhci5cbiAqL1xuZXhwb3J0IGNvbnN0IG1vbnRoc0luWWVhciA9IDEyO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgcXVhcnRlcnNJblllYXJcbiAqIEBzdW1tYXJ5IFF1YXJ0ZXJzIGluIDEgeWVhclxuICovXG5leHBvcnQgY29uc3QgcXVhcnRlcnNJblllYXIgPSA0O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luSG91clxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIGhvdXIuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5Ib3VyID0gMzYwMDtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJbk1pbnV0ZVxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1pbnV0ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlY29uZHNJbk1pbnV0ZSA9IDYwO1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luRGF5XG4gKiBAc3VtbWFyeSBTZWNvbmRzIGluIDEgZGF5LlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luRGF5ID0gc2Vjb25kc0luSG91ciAqIDI0O1xuXG4vKipcbiAqIEBjb25zdGFudFxuICogQG5hbWUgc2Vjb25kc0luV2Vla1xuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIHdlZWsuXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5XZWVrID0gc2Vjb25kc0luRGF5ICogNztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblllYXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSB5ZWFyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luWWVhciA9IHNlY29uZHNJbkRheSAqIGRheXNJblllYXI7XG5cbi8qKlxuICogQGNvbnN0YW50XG4gKiBAbmFtZSBzZWNvbmRzSW5Nb250aFxuICogQHN1bW1hcnkgU2Vjb25kcyBpbiAxIG1vbnRoXG4gKi9cbmV4cG9ydCBjb25zdCBzZWNvbmRzSW5Nb250aCA9IHNlY29uZHNJblllYXIgLyAxMjtcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIHNlY29uZHNJblF1YXJ0ZXJcbiAqIEBzdW1tYXJ5IFNlY29uZHMgaW4gMSBxdWFydGVyLlxuICovXG5leHBvcnQgY29uc3Qgc2Vjb25kc0luUXVhcnRlciA9IHNlY29uZHNJbk1vbnRoICogMztcblxuLyoqXG4gKiBAY29uc3RhbnRcbiAqIEBuYW1lIGNvbnN0cnVjdEZyb21TeW1ib2xcbiAqIEBzdW1tYXJ5IFN5bWJvbCBlbmFibGluZyBEYXRlIGV4dGVuc2lvbnMgdG8gaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlLlxuICpcbiAqIFRoZSBzeW1ib2wgaXMgdXNlZCB0byBlbmFibGUgdGhlIGBjb25zdHJ1Y3RGcm9tYCBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBkYXRlXG4gKiB1c2luZyBhIHJlZmVyZW5jZSBkYXRlIGFuZCBhIHZhbHVlLiBJdCBhbGxvd3MgdG8gdHJhbnNmZXIgZXh0cmEgcHJvcGVydGllc1xuICogZnJvbSB0aGUgcmVmZXJlbmNlIGRhdGUgdG8gdGhlIG5ldyBkYXRlLiBJdCdzIHVzZWZ1bCBmb3IgZXh0ZW5zaW9ucyBsaWtlXG4gKiBbYFRaRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy90eikgdGhhdCBhY2NlcHQgYSB0aW1lIHpvbmUgYXNcbiAqIGEgY29uc3RydWN0b3IgYXJndW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBjb25zdHJ1Y3RGcm9tU3ltYm9sID0gU3ltYm9sLmZvcihcImNvbnN0cnVjdERhdGVGcm9tXCIpO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tU3ltYm9sIH0gZnJvbSBcIi4vY29uc3RhbnRzLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgY29uc3RydWN0RnJvbVxuICogQGNhdGVnb3J5IEdlbmVyaWMgSGVscGVyc1xuICogQHN1bW1hcnkgQ29uc3RydWN0cyBhIGRhdGUgdXNpbmcgdGhlIHJlZmVyZW5jZSBkYXRlIGFuZCB0aGUgdmFsdWVcbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSBmdW5jdGlvbiBjb25zdHJ1Y3RzIGEgbmV3IGRhdGUgdXNpbmcgdGhlIGNvbnN0cnVjdG9yIGZyb20gdGhlIHJlZmVyZW5jZVxuICogZGF0ZSBhbmQgdGhlIGdpdmVuIHZhbHVlLiBJdCBoZWxwcyB0byBidWlsZCBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IGFjY2VwdFxuICogZGF0ZSBleHRlbnNpb25zLlxuICpcbiAqIEl0IGRlZmF1bHRzIHRvIGBEYXRlYCBpZiB0aGUgcGFzc2VkIHJlZmVyZW5jZSBkYXRlIGlzIGEgbnVtYmVyIG9yIGEgc3RyaW5nLlxuICpcbiAqIFN0YXJ0aW5nIGZyb20gdjMuNy4wLCBpdCBhbGxvd3MgdG8gY29uc3RydWN0IGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRha2UgY29uc3RydWN0b3IgZnJvbVxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNyZWF0ZSB0aGUgZGF0ZVxuICpcbiAqIEByZXR1cm5zIERhdGUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhlIGdpdmVuIGRhdGUgYW5kIHZhbHVlXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tL2RhdGUtZm5zXCI7XG4gKlxuICogLy8gQSBmdW5jdGlvbiB0aGF0IGNsb25lcyBhIGRhdGUgcHJlc2VydmluZyB0aGUgb3JpZ2luYWwgdHlwZVxuICogZnVuY3Rpb24gY2xvbmVEYXRlPERhdGVUeXBlIGV4dGVuZHMgRGF0ZT4oZGF0ZTogRGF0ZVR5cGUpOiBEYXRlVHlwZSB7XG4gKiAgIHJldHVybiBjb25zdHJ1Y3RGcm9tKFxuICogICAgIGRhdGUsIC8vIFVzZSBjb25zdHJ1Y3RvciBmcm9tIHRoZSBnaXZlbiBkYXRlXG4gKiAgICAgZGF0ZS5nZXRUaW1lKCkgLy8gVXNlIHRoZSBkYXRlIHZhbHVlIHRvIGNyZWF0ZSBhIG5ldyBkYXRlXG4gKiAgICk7XG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RGcm9tKGRhdGUsIHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgZGF0ZSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZGF0ZSh2YWx1ZSk7XG5cbiAgaWYgKGRhdGUgJiYgdHlwZW9mIGRhdGUgPT09IFwib2JqZWN0XCIgJiYgY29uc3RydWN0RnJvbVN5bWJvbCBpbiBkYXRlKVxuICAgIHJldHVybiBkYXRlW2NvbnN0cnVjdEZyb21TeW1ib2xdKHZhbHVlKTtcblxuICBpZiAoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHJldHVybiBuZXcgZGF0ZS5jb25zdHJ1Y3Rvcih2YWx1ZSk7XG5cbiAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBjb25zdHJ1Y3RGcm9tO1xuIiwKICAgICJpbXBvcnQgeyBjb25zdHJ1Y3RGcm9tIH0gZnJvbSBcIi4vY29uc3RydWN0RnJvbS5qc1wiO1xuXG4vKipcbiAqIEBuYW1lIHRvRGF0ZVxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBDb252ZXJ0IHRoZSBnaXZlbiBhcmd1bWVudCB0byBhbiBpbnN0YW5jZSBvZiBEYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogQ29udmVydCB0aGUgZ2l2ZW4gYXJndW1lbnQgdG8gYW4gaW5zdGFuY2Ugb2YgRGF0ZS5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgaXRzIGNsb25lLlxuICpcbiAqIElmIHRoZSBhcmd1bWVudCBpcyBhIG51bWJlciwgaXQgaXMgdHJlYXRlZCBhcyBhIHRpbWVzdGFtcC5cbiAqXG4gKiBJZiB0aGUgYXJndW1lbnQgaXMgbm9uZSBvZiB0aGUgYWJvdmUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEludmFsaWQgRGF0ZS5cbiAqXG4gKiBTdGFydGluZyBmcm9tIHYzLjcuMCwgaXQgY2xvbmVzIGEgZGF0ZSB1c2luZyBgW1N5bWJvbC5mb3IoXCJjb25zdHJ1Y3REYXRlRnJvbVwiKV1gXG4gKiBlbmFibGluZyB0byB0cmFuc2ZlciBleHRyYSBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlZmVyZW5jZSBkYXRlIHRvIHRoZSBuZXcgZGF0ZS5cbiAqIEl0J3MgdXNlZnVsIGZvciBleHRlbnNpb25zIGxpa2UgW2BUWkRhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdHopXG4gKiB0aGF0IGFjY2VwdCBhIHRpbWUgem9uZSBhcyBhIGNvbnN0cnVjdG9yIGFyZ3VtZW50LlxuICpcbiAqICoqTm90ZSoqOiAqYWxsKiBEYXRlIGFyZ3VtZW50cyBwYXNzZWQgdG8gYW55ICpkYXRlLWZucyogZnVuY3Rpb24gaXMgcHJvY2Vzc2VkIGJ5IGB0b0RhdGVgLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndW1lbnQgLSBUaGUgdmFsdWUgdG8gY29udmVydFxuICpcbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgZGF0ZSBpbiB0aGUgbG9jYWwgdGltZSB6b25lXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENsb25lIHRoZSBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKG5ldyBEYXRlKDIwMTQsIDEsIDExLCAxMSwgMzAsIDMwKSlcbiAqIC8vPT4gVHVlIEZlYiAxMSAyMDE0IDExOjMwOjMwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcCB0byBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gdG9EYXRlKDEzOTIwOTg0MzAwMDApXG4gKiAvLz0+IFR1ZSBGZWIgMTEgMjAxNCAxMTozMDozMFxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9EYXRlKGFyZ3VtZW50LCBjb250ZXh0KSB7XG4gIC8vIFtUT0RPXSBHZXQgcmlkIG9mIGB0b0RhdGVgIG9yIGBjb25zdHJ1Y3RGcm9tYD9cbiAgcmV0dXJuIGNvbnN0cnVjdEZyb20oY29udGV4dCB8fCBhcmd1bWVudCwgYXJndW1lbnQpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHRvRGF0ZTtcbiIsCiAgICAibGV0IGRlZmF1bHRPcHRpb25zID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZhdWx0T3B0aW9ucygpIHtcbiAgcmV0dXJuIGRlZmF1bHRPcHRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdE9wdGlvbnMobmV3T3B0aW9ucykge1xuICBkZWZhdWx0T3B0aW9ucyA9IG5ld09wdGlvbnM7XG59XG4iLAogICAgImltcG9ydCB7IGdldERlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vX2xpYi9kZWZhdWx0T3B0aW9ucy5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGEgd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWsgZm9yIDIgU2VwdGVtYmVyIDIwMTQgMTE6NTU6MDA6XG4gKiBjb25zdCByZXN1bHQgPSBzdGFydE9mV2VlayhuZXcgRGF0ZSgyMDE0LCA4LCAyLCAxMSwgNTUsIDApKVxuICogLy89PiBTdW4gQXVnIDMxIDIwMTQgMDA6MDA6MDBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gSWYgdGhlIHdlZWsgc3RhcnRzIG9uIE1vbmRheSwgdGhlIHN0YXJ0IG9mIHRoZSB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZldlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSwgeyB3ZWVrU3RhcnRzT246IDEgfSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gZ2V0RGVmYXVsdE9wdGlvbnMoKTtcbiAgY29uc3Qgd2Vla1N0YXJ0c09uID1cbiAgICBvcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLndlZWtTdGFydHNPbiA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgMDtcblxuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IGRheSA9IF9kYXRlLmdldERheSgpO1xuICBjb25zdCBkaWZmID0gKGRheSA8IHdlZWtTdGFydHNPbiA/IDcgOiAwKSArIGRheSAtIHdlZWtTdGFydHNPbjtcblxuICBfZGF0ZS5zZXREYXRlKF9kYXRlLmdldERhdGUoKSAtIGRpZmYpO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZXZWVrO1xuIiwKICAgICJpbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mSVNPV2Vla30gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2VlayBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBSZXR1cm4gdGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSByZXN1bHQgd2lsbCBiZSBpbiB0aGUgbG9jYWwgdGltZXpvbmUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGFuIElTTyB3ZWVrIGZvciAyIFNlcHRlbWJlciAyMDE0IDExOjU1OjAwOlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWsobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gTW9uIFNlcCAwMSAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mSVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIHJldHVybiBzdGFydE9mV2VlayhkYXRlLCB7IC4uLm9wdGlvbnMsIHdlZWtTdGFydHNPbjogMSB9KTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mSVNPV2VlaztcbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0SVNPV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLFxuICogd2hpY2ggYWx3YXlzIHN0YXJ0cyAzIGRheXMgYmVmb3JlIHRoZSB5ZWFyJ3MgZmlyc3QgVGh1cnNkYXkuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCAwLCAyKSlcbiAqIC8vPT4gMjAwNFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBfZGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG4gIGNvbnN0IHllYXIgPSBfZGF0ZS5nZXRGdWxsWWVhcigpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZOZXh0WWVhci5zZXRGdWxsWWVhcih5ZWFyICsgMSwgMCwgNCk7XG4gIGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZJU09XZWVrKGZvdXJ0aE9mSmFudWFyeU9mTmV4dFllYXIpO1xuXG4gIGNvbnN0IGZvdXJ0aE9mSmFudWFyeU9mVGhpc1llYXIgPSBjb25zdHJ1Y3RGcm9tKF9kYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRGdWxsWWVhcih5ZWFyLCAwLCA0KTtcbiAgZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhci5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgY29uc3Qgc3RhcnRPZlRoaXNZZWFyID0gc3RhcnRPZklTT1dlZWsoZm91cnRoT2ZKYW51YXJ5T2ZUaGlzWWVhcik7XG5cbiAgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mTmV4dFllYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXIgKyAxO1xuICB9IGVsc2UgaWYgKF9kYXRlLmdldFRpbWUoKSA+PSBzdGFydE9mVGhpc1llYXIuZ2V0VGltZSgpKSB7XG4gICAgcmV0dXJuIHllYXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHllYXIgLSAxO1xuICB9XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZ2V0SVNPV2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBHb29nbGUgQ2hyb21lIGFzIG9mIDY3LjAuMzM5Ni44NyBpbnRyb2R1Y2VkIHRpbWV6b25lcyB3aXRoIG9mZnNldCB0aGF0IGluY2x1ZGVzIHNlY29uZHMuXG4gKiBUaGV5IHVzdWFsbHkgYXBwZWFyIGZvciBkYXRlcyB0aGF0IGRlbm90ZSB0aW1lIGJlZm9yZSB0aGUgdGltZXpvbmVzIHdlcmUgaW50cm9kdWNlZFxuICogKGUuZy4gZm9yICdFdXJvcGUvUHJhZ3VlJyB0aW1lem9uZSB0aGUgb2Zmc2V0IGlzIEdNVCswMDo1Nzo0NCBiZWZvcmUgMSBPY3RvYmVyIDE4OTFcbiAqIGFuZCBHTVQrMDE6MDA6MDAgYWZ0ZXIgdGhhdCBkYXRlKVxuICpcbiAqIERhdGUjZ2V0VGltZXpvbmVPZmZzZXQgcmV0dXJucyB0aGUgb2Zmc2V0IGluIG1pbnV0ZXMgYW5kIHdvdWxkIHJldHVybiA1NyBmb3IgdGhlIGV4YW1wbGUgYWJvdmUsXG4gKiB3aGljaCB3b3VsZCBsZWFkIHRvIGluY29ycmVjdCBjYWxjdWxhdGlvbnMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB0aW1lem9uZSBvZmZzZXQgaW4gbWlsbGlzZWNvbmRzIHRoYXQgdGFrZXMgc2Vjb25kcyBpbiBhY2NvdW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZXpvbmVPZmZzZXRJbk1pbGxpc2Vjb25kcyhkYXRlKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUpO1xuICBjb25zdCB1dGNEYXRlID0gbmV3IERhdGUoXG4gICAgRGF0ZS5VVEMoXG4gICAgICBfZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgICAgX2RhdGUuZ2V0TW9udGgoKSxcbiAgICAgIF9kYXRlLmdldERhdGUoKSxcbiAgICAgIF9kYXRlLmdldEhvdXJzKCksXG4gICAgICBfZGF0ZS5nZXRNaW51dGVzKCksXG4gICAgICBfZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgICBfZGF0ZS5nZXRNaWxsaXNlY29uZHMoKSxcbiAgICApLFxuICApO1xuICB1dGNEYXRlLnNldFVUQ0Z1bGxZZWFyKF9kYXRlLmdldEZ1bGxZZWFyKCkpO1xuICByZXR1cm4gK2RhdGUgLSArdXRjRGF0ZTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRlcyhjb250ZXh0LCAuLi5kYXRlcykge1xuICBjb25zdCBub3JtYWxpemUgPSBjb25zdHJ1Y3RGcm9tLmJpbmQoXG4gICAgbnVsbCxcbiAgICBjb250ZXh0IHx8IGRhdGVzLmZpbmQoKGRhdGUpID0+IHR5cGVvZiBkYXRlID09PSBcIm9iamVjdFwiKSxcbiAgKTtcbiAgcmV0dXJuIGRhdGVzLm1hcChub3JtYWxpemUpO1xufVxuIiwKICAgICJpbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZEYXl9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mRGF5XG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBkYXkgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIGRheSBmb3IgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgcmVzdWx0IHdpbGwgYmUgaW4gdGhlIGxvY2FsIHRpbWV6b25lLlxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZSwgaXQgaXMgdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgY29udGV4dCBmdW5jdGlvbiBpZiBpdCBpcyBwYXNzZWQsIG9yIGluZmVycmVkIGZyb20gdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHN0YXJ0IG9mIGEgZGF5XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIGRheSBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZEYXkobmV3IERhdGUoMjAxNCwgOCwgMiwgMTEsIDU1LCAwKSlcbiAqIC8vPT4gVHVlIFNlcCAwMiAyMDE0IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mRGF5KGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBfZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgcmV0dXJuIF9kYXRlO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZEYXk7XG4iLAogICAgImltcG9ydCB7IGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMgfSBmcm9tIFwiLi9fbGliL2dldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMuanNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZURhdGVzIH0gZnJvbSBcIi4vX2xpYi9ub3JtYWxpemVEYXRlcy5qc1wiO1xuaW1wb3J0IHsgbWlsbGlzZWNvbmRzSW5EYXkgfSBmcm9tIFwiLi9jb25zdGFudHMuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZEYXkgfSBmcm9tIFwiLi9zdGFydE9mRGF5LmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXN9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXNcbiAqIEBjYXRlZ29yeSBEYXkgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBudW1iZXIgb2YgY2FsZW5kYXIgZGF5cyBiZXR3ZWVuIHRoZSBnaXZlbiBkYXRlcy5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbnVtYmVyIG9mIGNhbGVuZGFyIGRheXMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZXMuIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGltZXMgYXJlIHJlbW92ZWRcbiAqIGZyb20gdGhlIGRhdGVzIGFuZCB0aGVuIHRoZSBkaWZmZXJlbmNlIGluIGRheXMgaXMgY2FsY3VsYXRlZC5cbiAqXG4gKiBAcGFyYW0gbGF0ZXJEYXRlIC0gVGhlIGxhdGVyIGRhdGVcbiAqIEBwYXJhbSBlYXJsaWVyRGF0ZSAtIFRoZSBlYXJsaWVyIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0XG4gKlxuICogQHJldHVybnMgVGhlIG51bWJlciBvZiBjYWxlbmRhciBkYXlzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjAwOjAwIGFuZCAyIEp1bHkgMjAxMiAwMDowMDowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMiwgNiwgMiwgMCwgMCksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCAwKVxuICogKVxuICogLy89PiAzNjZcbiAqIC8vIEhvdyBtYW55IGNhbGVuZGFyIGRheXMgYXJlIGJldHdlZW5cbiAqIC8vIDIgSnVseSAyMDExIDIzOjU5OjAwIGFuZCAzIEp1bHkgMjAxMSAwMDowMTowMD9cbiAqIGNvbnN0IHJlc3VsdCA9IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cyhcbiAqICAgbmV3IERhdGUoMjAxMSwgNiwgMywgMCwgMSksXG4gKiAgIG5ldyBEYXRlKDIwMTEsIDYsIDIsIDIzLCA1OSlcbiAqIClcbiAqIC8vPT4gMVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKGxhdGVyRGF0ZSwgZWFybGllckRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgW2xhdGVyRGF0ZV8sIGVhcmxpZXJEYXRlX10gPSBub3JtYWxpemVEYXRlcyhcbiAgICBvcHRpb25zPy5pbixcbiAgICBsYXRlckRhdGUsXG4gICAgZWFybGllckRhdGUsXG4gICk7XG5cbiAgY29uc3QgbGF0ZXJTdGFydE9mRGF5ID0gc3RhcnRPZkRheShsYXRlckRhdGVfKTtcbiAgY29uc3QgZWFybGllclN0YXJ0T2ZEYXkgPSBzdGFydE9mRGF5KGVhcmxpZXJEYXRlXyk7XG5cbiAgY29uc3QgbGF0ZXJUaW1lc3RhbXAgPVxuICAgICtsYXRlclN0YXJ0T2ZEYXkgLSBnZXRUaW1lem9uZU9mZnNldEluTWlsbGlzZWNvbmRzKGxhdGVyU3RhcnRPZkRheSk7XG4gIGNvbnN0IGVhcmxpZXJUaW1lc3RhbXAgPVxuICAgICtlYXJsaWVyU3RhcnRPZkRheSAtIGdldFRpbWV6b25lT2Zmc2V0SW5NaWxsaXNlY29uZHMoZWFybGllclN0YXJ0T2ZEYXkpO1xuXG4gIC8vIFJvdW5kIHRoZSBudW1iZXIgb2YgZGF5cyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGJlY2F1c2UgdGhlIG51bWJlciBvZlxuICAvLyBtaWxsaXNlY29uZHMgaW4gYSBkYXkgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKChsYXRlclRpbWVzdGFtcCAtIGVhcmxpZXJUaW1lc3RhbXApIC8gbWlsbGlzZWNvbmRzSW5EYXkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGRpZmZlcmVuY2VJbkNhbGVuZGFyRGF5cztcbiIsCiAgICAiaW1wb3J0IHsgY29uc3RydWN0RnJvbSB9IGZyb20gXCIuL2NvbnN0cnVjdEZyb20uanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWtZZWFyIH0gZnJvbSBcIi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZJU09XZWVrIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWsuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIHN0YXJ0T2ZJU09XZWVrWWVhcn0gZnVuY3Rpb24gb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEBuYW1lIHN0YXJ0T2ZJU09XZWVrWWVhclxuICogQGNhdGVnb3J5IElTTyBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcixcbiAqIHdoaWNoIGFsd2F5cyBzdGFydHMgMyBkYXlzIGJlZm9yZSB0aGUgeWVhcidzIGZpcnN0IFRodXJzZGF5LlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBJU08gd2Vlay1udW1iZXJpbmcgeWVhcjogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fd2Vla19kYXRlXG4gKlxuICogQHR5cGVQYXJhbSBEYXRlVHlwZSAtIFRoZSBgRGF0ZWAgdHlwZSwgdGhlIGZ1bmN0aW9uIG9wZXJhdGVzIG9uLiBHZXRzIGluZmVycmVkIGZyb20gcGFzc2VkIGFyZ3VtZW50cy4gQWxsb3dzIHRvIHVzZSBleHRlbnNpb25zIGxpa2UgW2BVVENEYXRlYF0oaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL3V0YykuXG4gKiBAdHlwZVBhcmFtIFJlc3VsdERhdGUgLSBUaGUgcmVzdWx0IGBEYXRlYCB0eXBlLCBpdCBpcyB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBjb250ZXh0IGZ1bmN0aW9uIGlmIGl0IGlzIHBhc3NlZCwgb3IgaW5mZXJyZWQgZnJvbSB0aGUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gQW4gb2JqZWN0IHdpdGggb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhbiBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaGUgc3RhcnQgb2YgYW4gSVNPIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1OlxuICogY29uc3QgcmVzdWx0ID0gc3RhcnRPZklTT1dlZWtZZWFyKG5ldyBEYXRlKDIwMDUsIDYsIDIpKVxuICogLy89PiBNb24gSmFuIDAzIDIwMDUgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IHllYXIgPSBnZXRJU09XZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgY29uc3QgZm91cnRoT2ZKYW51YXJ5ID0gY29uc3RydWN0RnJvbShvcHRpb25zPy5pbiB8fCBkYXRlLCAwKTtcbiAgZm91cnRoT2ZKYW51YXJ5LnNldEZ1bGxZZWFyKHllYXIsIDAsIDQpO1xuICBmb3VydGhPZkphbnVhcnkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBzdGFydE9mSVNPV2Vlayhmb3VydGhPZkphbnVhcnkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IHN0YXJ0T2ZJU09XZWVrWWVhcjtcbiIsCiAgICAiLyoqXG4gKiBAbmFtZSBpc0RhdGVcbiAqIEBjYXRlZ29yeSBDb21tb24gSGVscGVyc1xuICogQHN1bW1hcnkgSXMgdGhlIGdpdmVuIHZhbHVlIGEgZGF0ZT9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgRGF0ZS4gVGhlIGZ1bmN0aW9uIHdvcmtzIGZvciBkYXRlcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgaWZyYW1lcy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIGRhdGVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgZGF0ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZShuZXcgRGF0ZSgpKVxuICogLy89PiB0cnVlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUobmV3IERhdGUoTmFOKSlcbiAqIC8vPT4gdHJ1ZVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBGb3Igc29tZSB2YWx1ZTpcbiAqIGNvbnN0IHJlc3VsdCA9IGlzRGF0ZSgnMjAxNC0wMi0zMScpXG4gKiAvLz0+IGZhbHNlXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEZvciBhbiBvYmplY3Q6XG4gKiBjb25zdCByZXN1bHQgPSBpc0RhdGUoe30pXG4gKiAvLz0+IGZhbHNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpID09PSBcIltvYmplY3QgRGF0ZV1cIilcbiAgKTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBpc0RhdGU7XG4iLAogICAgImltcG9ydCB7IGlzRGF0ZSB9IGZyb20gXCIuL2lzRGF0ZS5qc1wiO1xuaW1wb3J0IHsgdG9EYXRlIH0gZnJvbSBcIi4vdG9EYXRlLmpzXCI7XG5cbi8qKlxuICogQG5hbWUgaXNWYWxpZFxuICogQGNhdGVnb3J5IENvbW1vbiBIZWxwZXJzXG4gKiBAc3VtbWFyeSBJcyB0aGUgZ2l2ZW4gZGF0ZSB2YWxpZD9cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybnMgZmFsc2UgaWYgYXJndW1lbnQgaXMgSW52YWxpZCBEYXRlIGFuZCB0cnVlIG90aGVyd2lzZS5cbiAqIEFyZ3VtZW50IGlzIGNvbnZlcnRlZCB0byBEYXRlIHVzaW5nIGB0b0RhdGVgLiBTZWUgW3RvRGF0ZV0oaHR0cHM6Ly9kYXRlLWZucy5vcmcvZG9jcy90b0RhdGUpXG4gKiBJbnZhbGlkIERhdGUgaXMgYSBEYXRlLCB3aG9zZSB0aW1lIHZhbHVlIGlzIE5hTi5cbiAqXG4gKiBUaW1lIHZhbHVlIG9mIERhdGU6IGh0dHA6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS4xLjFcbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIHRvIGNoZWNrXG4gKlxuICogQHJldHVybnMgVGhlIGRhdGUgaXMgdmFsaWRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWxpZCBkYXRlOlxuICogY29uc3QgcmVzdWx0ID0gaXNWYWxpZChuZXcgRGF0ZSgyMDE0LCAxLCAzMSkpXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSB2YWx1ZSwgY29udmVydGlibGUgaW50byBhIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKDEzOTM4MDQ4MDAwMDApXG4gKiAvLz0+IHRydWVcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIHRoZSBpbnZhbGlkIGRhdGU6XG4gKiBjb25zdCByZXN1bHQgPSBpc1ZhbGlkKG5ldyBEYXRlKCcnKSlcbiAqIC8vPT4gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWQoZGF0ZSkge1xuICByZXR1cm4gISgoIWlzRGF0ZShkYXRlKSAmJiB0eXBlb2YgZGF0ZSAhPT0gXCJudW1iZXJcIikgfHwgaXNOYU4oK3RvRGF0ZShkYXRlKSkpO1xufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGlzVmFsaWQ7XG4iLAogICAgImltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgc3RhcnRPZlllYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mWWVhclxuICogQGNhdGVnb3J5IFllYXIgSGVscGVyc1xuICogQHN1bW1hcnkgUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogUmV0dXJuIHRoZSBzdGFydCBvZiBhIHllYXIgZm9yIHRoZSBnaXZlbiBkYXRlLlxuICogVGhlIHJlc3VsdCB3aWxsIGJlIGluIHRoZSBsb2NhbCB0aW1lem9uZS5cbiAqXG4gKiBAdHlwZVBhcmFtIERhdGVUeXBlIC0gVGhlIGBEYXRlYCB0eXBlLCB0aGUgZnVuY3Rpb24gb3BlcmF0ZXMgb24uIEdldHMgaW5mZXJyZWQgZnJvbSBwYXNzZWQgYXJndW1lbnRzLiBBbGxvd3MgdG8gdXNlIGV4dGVuc2lvbnMgbGlrZSBbYFVUQ0RhdGVgXShodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvdXRjKS5cbiAqIEB0eXBlUGFyYW0gUmVzdWx0RGF0ZSAtIFRoZSByZXN1bHQgYERhdGVgIHR5cGUsIGl0IGlzIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIGNvbnRleHQgZnVuY3Rpb24gaWYgaXQgaXMgcGFzc2VkLCBvciBpbmZlcnJlZCBmcm9tIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgb3JpZ2luYWwgZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBzdGFydCBvZiBhIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVGhlIHN0YXJ0IG9mIGEgeWVhciBmb3IgMiBTZXB0ZW1iZXIgMjAxNCAxMTo1NTowMDpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZZZWFyKG5ldyBEYXRlKDIwMTQsIDgsIDIsIDExLCA1NSwgMDApKVxuICogLy89PiBXZWQgSmFuIDAxIDIwMTQgMDA6MDA6MDBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGF0ZV8gPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBkYXRlXy5zZXRGdWxsWWVhcihkYXRlXy5nZXRGdWxsWWVhcigpLCAwLCAxKTtcbiAgZGF0ZV8uc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIHJldHVybiBkYXRlXztcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mWWVhcjtcbiIsCiAgICAiY29uc3QgZm9ybWF0RGlzdGFuY2VMb2NhbGUgPSB7XG4gIGxlc3NUaGFuWFNlY29uZHM6IHtcbiAgICBvbmU6IFwibGVzcyB0aGFuIGEgc2Vjb25kXCIsXG4gICAgb3RoZXI6IFwibGVzcyB0aGFuIHt7Y291bnR9fSBzZWNvbmRzXCIsXG4gIH0sXG5cbiAgeFNlY29uZHM6IHtcbiAgICBvbmU6IFwiMSBzZWNvbmRcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gc2Vjb25kc1wiLFxuICB9LFxuXG4gIGhhbGZBTWludXRlOiBcImhhbGYgYSBtaW51dGVcIixcblxuICBsZXNzVGhhblhNaW51dGVzOiB7XG4gICAgb25lOiBcImxlc3MgdGhhbiBhIG1pbnV0ZVwiLFxuICAgIG90aGVyOiBcImxlc3MgdGhhbiB7e2NvdW50fX0gbWludXRlc1wiLFxuICB9LFxuXG4gIHhNaW51dGVzOiB7XG4gICAgb25lOiBcIjEgbWludXRlXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IG1pbnV0ZXNcIixcbiAgfSxcblxuICBhYm91dFhIb3Vyczoge1xuICAgIG9uZTogXCJhYm91dCAxIGhvdXJcIixcbiAgICBvdGhlcjogXCJhYm91dCB7e2NvdW50fX0gaG91cnNcIixcbiAgfSxcblxuICB4SG91cnM6IHtcbiAgICBvbmU6IFwiMSBob3VyXCIsXG4gICAgb3RoZXI6IFwie3tjb3VudH19IGhvdXJzXCIsXG4gIH0sXG5cbiAgeERheXM6IHtcbiAgICBvbmU6IFwiMSBkYXlcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gZGF5c1wiLFxuICB9LFxuXG4gIGFib3V0WFdlZWtzOiB7XG4gICAgb25lOiBcImFib3V0IDEgd2Vla1wiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSB3ZWVrc1wiLFxuICB9LFxuXG4gIHhXZWVrczoge1xuICAgIG9uZTogXCIxIHdlZWtcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gd2Vla3NcIixcbiAgfSxcblxuICBhYm91dFhNb250aHM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSBtb250aFwiLFxuICAgIG90aGVyOiBcImFib3V0IHt7Y291bnR9fSBtb250aHNcIixcbiAgfSxcblxuICB4TW9udGhzOiB7XG4gICAgb25lOiBcIjEgbW9udGhcIixcbiAgICBvdGhlcjogXCJ7e2NvdW50fX0gbW9udGhzXCIsXG4gIH0sXG5cbiAgYWJvdXRYWWVhcnM6IHtcbiAgICBvbmU6IFwiYWJvdXQgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWJvdXQge3tjb3VudH19IHllYXJzXCIsXG4gIH0sXG5cbiAgeFllYXJzOiB7XG4gICAgb25lOiBcIjEgeWVhclwiLFxuICAgIG90aGVyOiBcInt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIG92ZXJYWWVhcnM6IHtcbiAgICBvbmU6IFwib3ZlciAxIHllYXJcIixcbiAgICBvdGhlcjogXCJvdmVyIHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxuXG4gIGFsbW9zdFhZZWFyczoge1xuICAgIG9uZTogXCJhbG1vc3QgMSB5ZWFyXCIsXG4gICAgb3RoZXI6IFwiYWxtb3N0IHt7Y291bnR9fSB5ZWFyc1wiLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdERpc3RhbmNlID0gKHRva2VuLCBjb3VudCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcmVzdWx0O1xuXG4gIGNvbnN0IHRva2VuVmFsdWUgPSBmb3JtYXREaXN0YW5jZUxvY2FsZVt0b2tlbl07XG4gIGlmICh0eXBlb2YgdG9rZW5WYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJlc3VsdCA9IHRva2VuVmFsdWU7XG4gIH0gZWxzZSBpZiAoY291bnQgPT09IDEpIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm9uZTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSB0b2tlblZhbHVlLm90aGVyLnJlcGxhY2UoXCJ7e2NvdW50fX1cIiwgY291bnQudG9TdHJpbmcoKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWRkU3VmZml4KSB7XG4gICAgaWYgKG9wdGlvbnMuY29tcGFyaXNvbiAmJiBvcHRpb25zLmNvbXBhcmlzb24gPiAwKSB7XG4gICAgICByZXR1cm4gXCJpbiBcIiArIHJlc3VsdDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc3VsdCArIFwiIGFnb1wiO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYnVpbGRGb3JtYXRMb25nRm4oYXJncykge1xuICByZXR1cm4gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8vIFRPRE86IFJlbW92ZSBTdHJpbmcoKVxuICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucy53aWR0aCA/IFN0cmluZyhvcHRpb25zLndpZHRoKSA6IGFyZ3MuZGVmYXVsdFdpZHRoO1xuICAgIGNvbnN0IGZvcm1hdCA9IGFyZ3MuZm9ybWF0c1t3aWR0aF0gfHwgYXJncy5mb3JtYXRzW2FyZ3MuZGVmYXVsdFdpZHRoXTtcbiAgICByZXR1cm4gZm9ybWF0O1xuICB9O1xufVxuIiwKICAgICJpbXBvcnQgeyBidWlsZEZvcm1hdExvbmdGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkRm9ybWF0TG9uZ0ZuLmpzXCI7XG5cbmNvbnN0IGRhdGVGb3JtYXRzID0ge1xuICBmdWxsOiBcIkVFRUUsIE1NTU0gZG8sIHlcIixcbiAgbG9uZzogXCJNTU1NIGRvLCB5XCIsXG4gIG1lZGl1bTogXCJNTU0gZCwgeVwiLFxuICBzaG9ydDogXCJNTS9kZC95eXl5XCIsXG59O1xuXG5jb25zdCB0aW1lRm9ybWF0cyA9IHtcbiAgZnVsbDogXCJoOm1tOnNzIGEgenp6elwiLFxuICBsb25nOiBcImg6bW06c3MgYSB6XCIsXG4gIG1lZGl1bTogXCJoOm1tOnNzIGFcIixcbiAgc2hvcnQ6IFwiaDptbSBhXCIsXG59O1xuXG5jb25zdCBkYXRlVGltZUZvcm1hdHMgPSB7XG4gIGZ1bGw6IFwie3tkYXRlfX0gJ2F0JyB7e3RpbWV9fVwiLFxuICBsb25nOiBcInt7ZGF0ZX19ICdhdCcge3t0aW1lfX1cIixcbiAgbWVkaXVtOiBcInt7ZGF0ZX19LCB7e3RpbWV9fVwiLFxuICBzaG9ydDogXCJ7e2RhdGV9fSwge3t0aW1lfX1cIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRMb25nID0ge1xuICBkYXRlOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZUZvcm1hdHMsXG4gICAgZGVmYXVsdFdpZHRoOiBcImZ1bGxcIixcbiAgfSksXG5cbiAgdGltZTogYnVpbGRGb3JtYXRMb25nRm4oe1xuICAgIGZvcm1hdHM6IHRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxuXG4gIGRhdGVUaW1lOiBidWlsZEZvcm1hdExvbmdGbih7XG4gICAgZm9ybWF0czogZGF0ZVRpbWVGb3JtYXRzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJmdWxsXCIsXG4gIH0pLFxufTtcbiIsCiAgICAiY29uc3QgZm9ybWF0UmVsYXRpdmVMb2NhbGUgPSB7XG4gIGxhc3RXZWVrOiBcIidsYXN0JyBlZWVlICdhdCcgcFwiLFxuICB5ZXN0ZXJkYXk6IFwiJ3llc3RlcmRheSBhdCcgcFwiLFxuICB0b2RheTogXCIndG9kYXkgYXQnIHBcIixcbiAgdG9tb3Jyb3c6IFwiJ3RvbW9ycm93IGF0JyBwXCIsXG4gIG5leHRXZWVrOiBcImVlZWUgJ2F0JyBwXCIsXG4gIG90aGVyOiBcIlBcIixcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRSZWxhdGl2ZSA9ICh0b2tlbiwgX2RhdGUsIF9iYXNlRGF0ZSwgX29wdGlvbnMpID0+XG4gIGZvcm1hdFJlbGF0aXZlTG9jYWxlW3Rva2VuXTtcbiIsCiAgICAiLyoqXG4gKiBUaGUgbG9jYWxpemUgZnVuY3Rpb24gYXJndW1lbnQgY2FsbGJhY2sgd2hpY2ggYWxsb3dzIHRvIGNvbnZlcnQgcmF3IHZhbHVlIHRvXG4gKiB0aGUgYWN0dWFsIHR5cGUuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnRcbiAqXG4gKiBAcmV0dXJucyBUaGUgY29udmVydGVkIHZhbHVlXG4gKi9cblxuLyoqXG4gKiBUaGUgbWFwIG9mIGxvY2FsaXplZCB2YWx1ZXMgZm9yIGVhY2ggd2lkdGguXG4gKi9cblxuLyoqXG4gKiBUaGUgaW5kZXggdHlwZSBvZiB0aGUgbG9jYWxlIHVuaXQgdmFsdWUuIEl0IHR5cGVzIGNvbnZlcnNpb24gb2YgdW5pdHMgb2ZcbiAqIHZhbHVlcyB0aGF0IGRvbid0IHN0YXJ0IGF0IDAgKGkuZS4gcXVhcnRlcnMpLlxuICovXG5cbi8qKlxuICogQ29udmVydHMgdGhlIHVuaXQgdmFsdWUgdG8gdGhlIHR1cGxlIG9mIHZhbHVlcy5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZXJhIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBCQyxcbiAqIHRoZSBzZWNvbmQgZWxlbWVudCByZXByZXNlbnRzIEFELlxuICovXG5cbi8qKlxuICogVGhlIHR1cGxlIG9mIGxvY2FsaXplZCBxdWFydGVyIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBRMS5cbiAqL1xuXG4vKipcbiAqIFRoZSB0dXBsZSBvZiBsb2NhbGl6ZWQgZGF5IHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBTdW5kYXkuXG4gKi9cblxuLyoqXG4gKiBUaGUgdHVwbGUgb2YgbG9jYWxpemVkIG1vbnRoIHZhbHVlcy4gVGhlIGZpcnN0IGVsZW1lbnQgcmVwcmVzZW50cyBKYW51YXJ5LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZExvY2FsaXplRm4oYXJncykge1xuICByZXR1cm4gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG9wdGlvbnM/LmNvbnRleHQgPyBTdHJpbmcob3B0aW9ucy5jb250ZXh0KSA6IFwic3RhbmRhbG9uZVwiO1xuXG4gICAgbGV0IHZhbHVlc0FycmF5O1xuICAgIGlmIChjb250ZXh0ID09PSBcImZvcm1hdHRpbmdcIiAmJiBhcmdzLmZvcm1hdHRpbmdWYWx1ZXMpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRXaWR0aCA9IGFyZ3MuZGVmYXVsdEZvcm1hdHRpbmdXaWR0aCB8fCBhcmdzLmRlZmF1bHRXaWR0aDtcbiAgICAgIGNvbnN0IHdpZHRoID0gb3B0aW9ucz8ud2lkdGggPyBTdHJpbmcob3B0aW9ucy53aWR0aCkgOiBkZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID1cbiAgICAgICAgYXJncy5mb3JtYXR0aW5nVmFsdWVzW3dpZHRoXSB8fCBhcmdzLmZvcm1hdHRpbmdWYWx1ZXNbZGVmYXVsdFdpZHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZGVmYXVsdFdpZHRoID0gYXJncy5kZWZhdWx0V2lkdGg7XG4gICAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnM/LndpZHRoID8gU3RyaW5nKG9wdGlvbnMud2lkdGgpIDogYXJncy5kZWZhdWx0V2lkdGg7XG5cbiAgICAgIHZhbHVlc0FycmF5ID0gYXJncy52YWx1ZXNbd2lkdGhdIHx8IGFyZ3MudmFsdWVzW2RlZmF1bHRXaWR0aF07XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gYXJncy5hcmd1bWVudENhbGxiYWNrID8gYXJncy5hcmd1bWVudENhbGxiYWNrKHZhbHVlKSA6IHZhbHVlO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEZvciBzb21lIHJlYXNvbiBUeXBlU2NyaXB0IGp1c3QgZG9uJ3Qgd2FudCB0byBtYXRjaCBpdCwgbm8gbWF0dGVyIGhvdyBoYXJkIHdlIHRyeS4gSSBjaGFsbGVuZ2UgeW91IHRvIHRyeSB0byByZW1vdmUgaXQhXG4gICAgcmV0dXJuIHZhbHVlc0FycmF5W2luZGV4XTtcbiAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgYnVpbGRMb2NhbGl6ZUZuIH0gZnJvbSBcIi4uLy4uL19saWIvYnVpbGRMb2NhbGl6ZUZuLmpzXCI7XG5cbmNvbnN0IGVyYVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJCXCIsIFwiQVwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIkJDXCIsIFwiQURcIl0sXG4gIHdpZGU6IFtcIkJlZm9yZSBDaHJpc3RcIiwgXCJBbm5vIERvbWluaVwiXSxcbn07XG5cbmNvbnN0IHF1YXJ0ZXJWYWx1ZXMgPSB7XG4gIG5hcnJvdzogW1wiMVwiLCBcIjJcIiwgXCIzXCIsIFwiNFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcIlExXCIsIFwiUTJcIiwgXCJRM1wiLCBcIlE0XCJdLFxuICB3aWRlOiBbXCIxc3QgcXVhcnRlclwiLCBcIjJuZCBxdWFydGVyXCIsIFwiM3JkIHF1YXJ0ZXJcIiwgXCI0dGggcXVhcnRlclwiXSxcbn07XG5cbi8vIE5vdGU6IGluIEVuZ2xpc2gsIHRoZSBuYW1lcyBvZiBkYXlzIG9mIHRoZSB3ZWVrIGFuZCBtb250aHMgYXJlIGNhcGl0YWxpemVkLlxuLy8gSWYgeW91IGFyZSBtYWtpbmcgYSBuZXcgbG9jYWxlIGJhc2VkIG9uIHRoaXMgb25lLCBjaGVjayBpZiB0aGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbGFuZ3VhZ2UgeW91J3JlIHdvcmtpbmcgb24uXG4vLyBHZW5lcmFsbHksIGZvcm1hdHRlZCBkYXRlcyBzaG91bGQgbG9vayBsaWtlIHRoZXkgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBzZW50ZW5jZSxcbi8vIGUuZy4gaW4gU3BhbmlzaCBsYW5ndWFnZSB0aGUgd2Vla2RheXMgYW5kIG1vbnRocyBzaG91bGQgYmUgaW4gdGhlIGxvd2VyY2FzZS5cbmNvbnN0IG1vbnRoVmFsdWVzID0ge1xuICBuYXJyb3c6IFtcIkpcIiwgXCJGXCIsIFwiTVwiLCBcIkFcIiwgXCJNXCIsIFwiSlwiLCBcIkpcIiwgXCJBXCIsIFwiU1wiLCBcIk9cIiwgXCJOXCIsIFwiRFwiXSxcbiAgYWJicmV2aWF0ZWQ6IFtcbiAgICBcIkphblwiLFxuICAgIFwiRmViXCIsXG4gICAgXCJNYXJcIixcbiAgICBcIkFwclwiLFxuICAgIFwiTWF5XCIsXG4gICAgXCJKdW5cIixcbiAgICBcIkp1bFwiLFxuICAgIFwiQXVnXCIsXG4gICAgXCJTZXBcIixcbiAgICBcIk9jdFwiLFxuICAgIFwiTm92XCIsXG4gICAgXCJEZWNcIixcbiAgXSxcblxuICB3aWRlOiBbXG4gICAgXCJKYW51YXJ5XCIsXG4gICAgXCJGZWJydWFyeVwiLFxuICAgIFwiTWFyY2hcIixcbiAgICBcIkFwcmlsXCIsXG4gICAgXCJNYXlcIixcbiAgICBcIkp1bmVcIixcbiAgICBcIkp1bHlcIixcbiAgICBcIkF1Z3VzdFwiLFxuICAgIFwiU2VwdGVtYmVyXCIsXG4gICAgXCJPY3RvYmVyXCIsXG4gICAgXCJOb3ZlbWJlclwiLFxuICAgIFwiRGVjZW1iZXJcIixcbiAgXSxcbn07XG5cbmNvbnN0IGRheVZhbHVlcyA9IHtcbiAgbmFycm93OiBbXCJTXCIsIFwiTVwiLCBcIlRcIiwgXCJXXCIsIFwiVFwiLCBcIkZcIiwgXCJTXCJdLFxuICBzaG9ydDogW1wiU3VcIiwgXCJNb1wiLCBcIlR1XCIsIFwiV2VcIiwgXCJUaFwiLCBcIkZyXCIsIFwiU2FcIl0sXG4gIGFiYnJldmlhdGVkOiBbXCJTdW5cIiwgXCJNb25cIiwgXCJUdWVcIiwgXCJXZWRcIiwgXCJUaHVcIiwgXCJGcmlcIiwgXCJTYXRcIl0sXG4gIHdpZGU6IFtcbiAgICBcIlN1bmRheVwiLFxuICAgIFwiTW9uZGF5XCIsXG4gICAgXCJUdWVzZGF5XCIsXG4gICAgXCJXZWRuZXNkYXlcIixcbiAgICBcIlRodXJzZGF5XCIsXG4gICAgXCJGcmlkYXlcIixcbiAgICBcIlNhdHVyZGF5XCIsXG4gIF0sXG59O1xuXG5jb25zdCBkYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgICBhZnRlcm5vb246IFwiYWZ0ZXJub29uXCIsXG4gICAgZXZlbmluZzogXCJldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwibmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMgPSB7XG4gIG5hcnJvdzoge1xuICAgIGFtOiBcImFcIixcbiAgICBwbTogXCJwXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlcIixcbiAgICBub29uOiBcIm5cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgYWJicmV2aWF0ZWQ6IHtcbiAgICBhbTogXCJBTVwiLFxuICAgIHBtOiBcIlBNXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbiAgd2lkZToge1xuICAgIGFtOiBcImEubS5cIixcbiAgICBwbTogXCJwLm0uXCIsXG4gICAgbWlkbmlnaHQ6IFwibWlkbmlnaHRcIixcbiAgICBub29uOiBcIm5vb25cIixcbiAgICBtb3JuaW5nOiBcImluIHRoZSBtb3JuaW5nXCIsXG4gICAgYWZ0ZXJub29uOiBcImluIHRoZSBhZnRlcm5vb25cIixcbiAgICBldmVuaW5nOiBcImluIHRoZSBldmVuaW5nXCIsXG4gICAgbmlnaHQ6IFwiYXQgbmlnaHRcIixcbiAgfSxcbn07XG5cbmNvbnN0IG9yZGluYWxOdW1iZXIgPSAoZGlydHlOdW1iZXIsIF9vcHRpb25zKSA9PiB7XG4gIGNvbnN0IG51bWJlciA9IE51bWJlcihkaXJ0eU51bWJlcik7XG5cbiAgLy8gSWYgb3JkaW5hbCBudW1iZXJzIGRlcGVuZCBvbiBjb250ZXh0LCBmb3IgZXhhbXBsZSxcbiAgLy8gaWYgdGhleSBhcmUgZGlmZmVyZW50IGZvciBkaWZmZXJlbnQgZ3JhbW1hdGljYWwgZ2VuZGVycyxcbiAgLy8gdXNlIGBvcHRpb25zLnVuaXRgLlxuICAvL1xuICAvLyBgdW5pdGAgY2FuIGJlICd5ZWFyJywgJ3F1YXJ0ZXInLCAnbW9udGgnLCAnd2VlaycsICdkYXRlJywgJ2RheU9mWWVhcicsXG4gIC8vICdkYXknLCAnaG91cicsICdtaW51dGUnLCAnc2Vjb25kJy5cblxuICBjb25zdCByZW0xMDAgPSBudW1iZXIgJSAxMDA7XG4gIGlmIChyZW0xMDAgPiAyMCB8fCByZW0xMDAgPCAxMCkge1xuICAgIHN3aXRjaCAocmVtMTAwICUgMTApIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwic3RcIjtcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwibmRcIjtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIG51bWJlciArIFwicmRcIjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bWJlciArIFwidGhcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2NhbGl6ZSA9IHtcbiAgb3JkaW5hbE51bWJlcixcblxuICBlcmE6IGJ1aWxkTG9jYWxpemVGbih7XG4gICAgdmFsdWVzOiBlcmFWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgcXVhcnRlcjogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IHF1YXJ0ZXJWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgICBhcmd1bWVudENhbGxiYWNrOiAocXVhcnRlcikgPT4gcXVhcnRlciAtIDEsXG4gIH0pLFxuXG4gIG1vbnRoOiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogbW9udGhWYWx1ZXMsXG4gICAgZGVmYXVsdFdpZHRoOiBcIndpZGVcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZExvY2FsaXplRm4oe1xuICAgIHZhbHVlczogZGF5VmFsdWVzLFxuICAgIGRlZmF1bHRXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRMb2NhbGl6ZUZuKHtcbiAgICB2YWx1ZXM6IGRheVBlcmlvZFZhbHVlcyxcbiAgICBkZWZhdWx0V2lkdGg6IFwid2lkZVwiLFxuICAgIGZvcm1hdHRpbmdWYWx1ZXM6IGZvcm1hdHRpbmdEYXlQZXJpb2RWYWx1ZXMsXG4gICAgZGVmYXVsdEZvcm1hdHRpbmdXaWR0aDogXCJ3aWRlXCIsXG4gIH0pLFxufTtcbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hGbihhcmdzKSB7XG4gIHJldHVybiAoc3RyaW5nLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IG9wdGlvbnMud2lkdGg7XG5cbiAgICBjb25zdCBtYXRjaFBhdHRlcm4gPVxuICAgICAgKHdpZHRoICYmIGFyZ3MubWF0Y2hQYXR0ZXJuc1t3aWR0aF0pIHx8XG4gICAgICBhcmdzLm1hdGNoUGF0dGVybnNbYXJncy5kZWZhdWx0TWF0Y2hXaWR0aF07XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2gobWF0Y2hQYXR0ZXJuKTtcblxuICAgIGlmICghbWF0Y2hSZXN1bHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG5cbiAgICBjb25zdCBwYXJzZVBhdHRlcm5zID1cbiAgICAgICh3aWR0aCAmJiBhcmdzLnBhcnNlUGF0dGVybnNbd2lkdGhdKSB8fFxuICAgICAgYXJncy5wYXJzZVBhdHRlcm5zW2FyZ3MuZGVmYXVsdFBhcnNlV2lkdGhdO1xuXG4gICAgY29uc3Qga2V5ID0gQXJyYXkuaXNBcnJheShwYXJzZVBhdHRlcm5zKVxuICAgICAgPyBmaW5kSW5kZXgocGFyc2VQYXR0ZXJucywgKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChtYXRjaGVkU3RyaW5nKSlcbiAgICAgIDogLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgZmluZEtleShwYXJzZVBhdHRlcm5zLCAocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KG1hdGNoZWRTdHJpbmcpKTtcblxuICAgIGxldCB2YWx1ZTtcblxuICAgIHZhbHVlID0gYXJncy52YWx1ZUNhbGxiYWNrID8gYXJncy52YWx1ZUNhbGxiYWNrKGtleSkgOiBrZXk7XG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gLy8gW1RPRE9dIC0tIEkgY2hhbGxlbmdlIHlvdSB0byBmaXggdGhlIHR5cGVcbiAgICAgICAgb3B0aW9ucy52YWx1ZUNhbGxiYWNrKHZhbHVlKVxuICAgICAgOiB2YWx1ZTtcblxuICAgIGNvbnN0IHJlc3QgPSBzdHJpbmcuc2xpY2UobWF0Y2hlZFN0cmluZy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHsgdmFsdWUsIHJlc3QgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZmluZEtleShvYmplY3QsIHByZWRpY2F0ZSkge1xuICBmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmXG4gICAgICBwcmVkaWNhdGUob2JqZWN0W2tleV0pXG4gICAgKSB7XG4gICAgICByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSkge1xuICBmb3IgKGxldCBrZXkgPSAwOyBrZXkgPCBhcnJheS5sZW5ndGg7IGtleSsrKSB7XG4gICAgaWYgKHByZWRpY2F0ZShhcnJheVtrZXldKSkge1xuICAgICAgcmV0dXJuIGtleTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWF0Y2hQYXR0ZXJuRm4oYXJncykge1xuICByZXR1cm4gKHN0cmluZywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hSZXN1bHQgPSBzdHJpbmcubWF0Y2goYXJncy5tYXRjaFBhdHRlcm4pO1xuICAgIGlmICghbWF0Y2hSZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG1hdGNoZWRTdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcblxuICAgIGNvbnN0IHBhcnNlUmVzdWx0ID0gc3RyaW5nLm1hdGNoKGFyZ3MucGFyc2VQYXR0ZXJuKTtcbiAgICBpZiAoIXBhcnNlUmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBsZXQgdmFsdWUgPSBhcmdzLnZhbHVlQ2FsbGJhY2tcbiAgICAgID8gYXJncy52YWx1ZUNhbGxiYWNrKHBhcnNlUmVzdWx0WzBdKVxuICAgICAgOiBwYXJzZVJlc3VsdFswXTtcblxuICAgIC8vIFtUT0RPXSBJIGNoYWxsZW5nZSB5b3UgdG8gZml4IHRoZSB0eXBlXG4gICAgdmFsdWUgPSBvcHRpb25zLnZhbHVlQ2FsbGJhY2sgPyBvcHRpb25zLnZhbHVlQ2FsbGJhY2sodmFsdWUpIDogdmFsdWU7XG5cbiAgICBjb25zdCByZXN0ID0gc3RyaW5nLnNsaWNlKG1hdGNoZWRTdHJpbmcubGVuZ3RoKTtcblxuICAgIHJldHVybiB7IHZhbHVlLCByZXN0IH07XG4gIH07XG59XG4iLAogICAgImltcG9ydCB7IGJ1aWxkTWF0Y2hGbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hGbi5qc1wiO1xuaW1wb3J0IHsgYnVpbGRNYXRjaFBhdHRlcm5GbiB9IGZyb20gXCIuLi8uLi9fbGliL2J1aWxkTWF0Y2hQYXR0ZXJuRm4uanNcIjtcblxuY29uc3QgbWF0Y2hPcmRpbmFsTnVtYmVyUGF0dGVybiA9IC9eKFxcZCspKHRofHN0fG5kfHJkKT8vaTtcbmNvbnN0IHBhcnNlT3JkaW5hbE51bWJlclBhdHRlcm4gPSAvXFxkKy9pO1xuXG5jb25zdCBtYXRjaEVyYVBhdHRlcm5zID0ge1xuICBuYXJyb3c6IC9eKGJ8YSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGJcXC4/XFxzP2NcXC4/fGJcXC4/XFxzP2NcXC4/XFxzP2VcXC4/fGFcXC4/XFxzP2RcXC4/fGNcXC4/XFxzP2VcXC4/KS9pLFxuICB3aWRlOiAvXihiZWZvcmUgY2hyaXN0fGJlZm9yZSBjb21tb24gZXJhfGFubm8gZG9taW5pfGNvbW1vbiBlcmEpL2ksXG59O1xuY29uc3QgcGFyc2VFcmFQYXR0ZXJucyA9IHtcbiAgYW55OiBbL15iL2ksIC9eKGF8YykvaV0sXG59O1xuXG5jb25zdCBtYXRjaFF1YXJ0ZXJQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXlsxMjM0XS9pLFxuICBhYmJyZXZpYXRlZDogL15xWzEyMzRdL2ksXG4gIHdpZGU6IC9eWzEyMzRdKHRofHN0fG5kfHJkKT8gcXVhcnRlci9pLFxufTtcbmNvbnN0IHBhcnNlUXVhcnRlclBhdHRlcm5zID0ge1xuICBhbnk6IFsvMS9pLCAvMi9pLCAvMy9pLCAvNC9pXSxcbn07XG5cbmNvbnN0IG1hdGNoTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXltqZm1hc29uZF0vaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjKS9pLFxuICB3aWRlOiAvXihqYW51YXJ5fGZlYnJ1YXJ5fG1hcmNofGFwcmlsfG1heXxqdW5lfGp1bHl8YXVndXN0fHNlcHRlbWJlcnxvY3RvYmVyfG5vdmVtYmVyfGRlY2VtYmVyKS9pLFxufTtcbmNvbnN0IHBhcnNlTW9udGhQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbXG4gICAgL15qL2ksXG4gICAgL15mL2ksXG4gICAgL15tL2ksXG4gICAgL15hL2ksXG4gICAgL15tL2ksXG4gICAgL15qL2ksXG4gICAgL15qL2ksXG4gICAgL15hL2ksXG4gICAgL15zL2ksXG4gICAgL15vL2ksXG4gICAgL15uL2ksXG4gICAgL15kL2ksXG4gIF0sXG5cbiAgYW55OiBbXG4gICAgL15qYS9pLFxuICAgIC9eZi9pLFxuICAgIC9ebWFyL2ksXG4gICAgL15hcC9pLFxuICAgIC9ebWF5L2ksXG4gICAgL15qdW4vaSxcbiAgICAvXmp1bC9pLFxuICAgIC9eYXUvaSxcbiAgICAvXnMvaSxcbiAgICAvXm8vaSxcbiAgICAvXm4vaSxcbiAgICAvXmQvaSxcbiAgXSxcbn07XG5cbmNvbnN0IG1hdGNoRGF5UGF0dGVybnMgPSB7XG4gIG5hcnJvdzogL15bc210d2ZdL2ksXG4gIHNob3J0OiAvXihzdXxtb3x0dXx3ZXx0aHxmcnxzYSkvaSxcbiAgYWJicmV2aWF0ZWQ6IC9eKHN1bnxtb258dHVlfHdlZHx0aHV8ZnJpfHNhdCkvaSxcbiAgd2lkZTogL14oc3VuZGF5fG1vbmRheXx0dWVzZGF5fHdlZG5lc2RheXx0aHVyc2RheXxmcmlkYXl8c2F0dXJkYXkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQYXR0ZXJucyA9IHtcbiAgbmFycm93OiBbL15zL2ksIC9ebS9pLCAvXnQvaSwgL153L2ksIC9edC9pLCAvXmYvaSwgL15zL2ldLFxuICBhbnk6IFsvXnN1L2ksIC9ebS9pLCAvXnR1L2ksIC9edy9pLCAvXnRoL2ksIC9eZi9pLCAvXnNhL2ldLFxufTtcblxuY29uc3QgbWF0Y2hEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgbmFycm93OiAvXihhfHB8bWl8bnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG4gIGFueTogL14oW2FwXVxcLj9cXHM/bVxcLj98bWlkbmlnaHR8bm9vbnwoaW4gdGhlfGF0KSAobW9ybmluZ3xhZnRlcm5vb258ZXZlbmluZ3xuaWdodCkpL2ksXG59O1xuY29uc3QgcGFyc2VEYXlQZXJpb2RQYXR0ZXJucyA9IHtcbiAgYW55OiB7XG4gICAgYW06IC9eYS9pLFxuICAgIHBtOiAvXnAvaSxcbiAgICBtaWRuaWdodDogL15taS9pLFxuICAgIG5vb246IC9ebm8vaSxcbiAgICBtb3JuaW5nOiAvbW9ybmluZy9pLFxuICAgIGFmdGVybm9vbjogL2FmdGVybm9vbi9pLFxuICAgIGV2ZW5pbmc6IC9ldmVuaW5nL2ksXG4gICAgbmlnaHQ6IC9uaWdodC9pLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IG1hdGNoID0ge1xuICBvcmRpbmFsTnVtYmVyOiBidWlsZE1hdGNoUGF0dGVybkZuKHtcbiAgICBtYXRjaFBhdHRlcm46IG1hdGNoT3JkaW5hbE51bWJlclBhdHRlcm4sXG4gICAgcGFyc2VQYXR0ZXJuOiBwYXJzZU9yZGluYWxOdW1iZXJQYXR0ZXJuLFxuICAgIHZhbHVlQ2FsbGJhY2s6ICh2YWx1ZSkgPT4gcGFyc2VJbnQodmFsdWUsIDEwKSxcbiAgfSksXG5cbiAgZXJhOiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRXJhUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIHF1YXJ0ZXI6IGJ1aWxkTWF0Y2hGbih7XG4gICAgbWF0Y2hQYXR0ZXJuczogbWF0Y2hRdWFydGVyUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlUXVhcnRlclBhdHRlcm5zLFxuICAgIGRlZmF1bHRQYXJzZVdpZHRoOiBcImFueVwiLFxuICAgIHZhbHVlQ2FsbGJhY2s6IChpbmRleCkgPT4gaW5kZXggKyAxLFxuICB9KSxcblxuICBtb250aDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaE1vbnRoUGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlTW9udGhQYXR0ZXJucyxcbiAgICBkZWZhdWx0UGFyc2VXaWR0aDogXCJhbnlcIixcbiAgfSksXG5cbiAgZGF5OiBidWlsZE1hdGNoRm4oe1xuICAgIG1hdGNoUGF0dGVybnM6IG1hdGNoRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdE1hdGNoV2lkdGg6IFwid2lkZVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxuXG4gIGRheVBlcmlvZDogYnVpbGRNYXRjaEZuKHtcbiAgICBtYXRjaFBhdHRlcm5zOiBtYXRjaERheVBlcmlvZFBhdHRlcm5zLFxuICAgIGRlZmF1bHRNYXRjaFdpZHRoOiBcImFueVwiLFxuICAgIHBhcnNlUGF0dGVybnM6IHBhcnNlRGF5UGVyaW9kUGF0dGVybnMsXG4gICAgZGVmYXVsdFBhcnNlV2lkdGg6IFwiYW55XCIsXG4gIH0pLFxufTtcbiIsCiAgICAiaW1wb3J0IHsgZm9ybWF0RGlzdGFuY2UgfSBmcm9tIFwiLi9lbi1VUy9fbGliL2Zvcm1hdERpc3RhbmNlLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRMb25nIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9mb3JtYXRMb25nLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXRSZWxhdGl2ZSB9IGZyb20gXCIuL2VuLVVTL19saWIvZm9ybWF0UmVsYXRpdmUuanNcIjtcbmltcG9ydCB7IGxvY2FsaXplIH0gZnJvbSBcIi4vZW4tVVMvX2xpYi9sb2NhbGl6ZS5qc1wiO1xuaW1wb3J0IHsgbWF0Y2ggfSBmcm9tIFwiLi9lbi1VUy9fbGliL21hdGNoLmpzXCI7XG5cbi8qKlxuICogQGNhdGVnb3J5IExvY2FsZXNcbiAqIEBzdW1tYXJ5IEVuZ2xpc2ggbG9jYWxlIChVbml0ZWQgU3RhdGVzKS5cbiAqIEBsYW5ndWFnZSBFbmdsaXNoXG4gKiBAaXNvLTYzOS0yIGVuZ1xuICogQGF1dGhvciBTYXNoYSBLb3NzIFtAa29zc25vY29ycF0oaHR0cHM6Ly9naXRodWIuY29tL2tvc3Nub2NvcnApXG4gKiBAYXV0aG9yIExlc2hhIEtvc3MgW0BsZXNoYWtvc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZXNoYWtvc3MpXG4gKi9cbmV4cG9ydCBjb25zdCBlblVTID0ge1xuICBjb2RlOiBcImVuLVVTXCIsXG4gIGZvcm1hdERpc3RhbmNlOiBmb3JtYXREaXN0YW5jZSxcbiAgZm9ybWF0TG9uZzogZm9ybWF0TG9uZyxcbiAgZm9ybWF0UmVsYXRpdmU6IGZvcm1hdFJlbGF0aXZlLFxuICBsb2NhbGl6ZTogbG9jYWxpemUsXG4gIG1hdGNoOiBtYXRjaCxcbiAgb3B0aW9uczoge1xuICAgIHdlZWtTdGFydHNPbjogMCAvKiBTdW5kYXkgKi8sXG4gICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiAxLFxuICB9LFxufTtcblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBlblVTO1xuIiwKICAgICJpbXBvcnQgeyBkaWZmZXJlbmNlSW5DYWxlbmRhckRheXMgfSBmcm9tIFwiLi9kaWZmZXJlbmNlSW5DYWxlbmRhckRheXMuanNcIjtcbmltcG9ydCB7IHN0YXJ0T2ZZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZlllYXIuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vKipcbiAqIFRoZSB7QGxpbmsgZ2V0RGF5T2ZZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0RGF5T2ZZZWFyXG4gKiBAY2F0ZWdvcnkgRGF5IEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgZGF5IG9mIHRoZSB5ZWFyIG9mIHRoZSBnaXZlbiBkYXRlLlxuICpcbiAqIEBkZXNjcmlwdGlvblxuICogR2V0IHRoZSBkYXkgb2YgdGhlIHllYXIgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIFRoZSBkYXkgb2YgeWVhclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBXaGljaCBkYXkgb2YgdGhlIHllYXIgaXMgMiBKdWx5IDIwMTQ/XG4gKiBjb25zdCByZXN1bHQgPSBnZXREYXlPZlllYXIobmV3IERhdGUoMjAxNCwgNiwgMikpXG4gKiAvLz0+IDE4M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGF5T2ZZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCBkaWZmID0gZGlmZmVyZW5jZUluQ2FsZW5kYXJEYXlzKF9kYXRlLCBzdGFydE9mWWVhcihfZGF0ZSkpO1xuICBjb25zdCBkYXlPZlllYXIgPSBkaWZmICsgMTtcbiAgcmV0dXJuIGRheU9mWWVhcjtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXREYXlPZlllYXI7XG4iLAogICAgImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWsgfSBmcm9tIFwiLi9zdGFydE9mSVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZklTT1dlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZklTT1dlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldElTT1dlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRJU09XZWVrXG4gKiBAY2F0ZWdvcnkgSVNPIFdlZWsgSGVscGVyc1xuICogQHN1bW1hcnkgR2V0IHRoZSBJU08gd2VlayBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgSVNPIHdlZWsgb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogSVNPIHdlZWstbnVtYmVyaW5nIHllYXI6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPX3dlZWtfZGF0ZVxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIGdpdmVuIGRhdGVcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgSVNPIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgSVNPLXdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMiBKYW51YXJ5IDIwMDU/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRJU09XZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpKVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0SVNPV2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mSVNPV2VlayhfZGF0ZSkgLSArc3RhcnRPZklTT1dlZWtZZWFyKF9kYXRlKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRJU09XZWVrO1xuIiwKICAgICJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWtZZWFyfSBmdW5jdGlvbiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQG5hbWUgZ2V0V2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEdldCB0aGUgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhciBvZiB0aGUgZ2l2ZW4gZGF0ZS5cbiAqIFRoZSBleGFjdCBjYWxjdWxhdGlvbiBkZXBlbmRzIG9uIHRoZSB2YWx1ZXMgb2ZcbiAqIGBvcHRpb25zLndlZWtTdGFydHNPbmAgKHdoaWNoIGlzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrKVxuICogYW5kIGBvcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZWAgKHdoaWNoIGlzIHRoZSBkYXkgb2YgSmFudWFyeSwgd2hpY2ggaXMgYWx3YXlzIGluXG4gKiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgd2Vlay1udW1iZXJpbmcgeWVhcilcbiAqXG4gKiBXZWVrIG51bWJlcmluZzogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2VlayNUaGVfSVNPX3dlZWtfZGF0ZV9zeXN0ZW1cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBnaXZlbiBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMgVGhlIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IHdpdGggdGhlIGRlZmF1bHQgc2V0dGluZ3M/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrWWVhcihuZXcgRGF0ZSgyMDA0LCAxMSwgMjYpKVxuICogLy89PiAyMDA1XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFdoaWNoIHdlZWsgbnVtYmVyaW5nIHllYXIgaXMgMjYgRGVjZW1iZXIgMjAwNCBpZiB3ZWVrIHN0YXJ0cyBvbiBTYXR1cmRheT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgd2Vla1N0YXJ0c09uOiA2IH0pXG4gKiAvLz0+IDIwMDRcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBudW1iZXJpbmcgeWVhciBpcyAyNiBEZWNlbWJlciAyMDA0IGlmIHRoZSBmaXJzdCB3ZWVrIGNvbnRhaW5zIDQgSmFudWFyeT9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWtZZWFyKG5ldyBEYXRlKDIwMDQsIDExLCAyNiksIHsgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0IH0pXG4gKiAvLz0+IDIwMDRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpIHtcbiAgY29uc3QgX2RhdGUgPSB0b0RhdGUoZGF0ZSwgb3B0aW9ucz8uaW4pO1xuICBjb25zdCB5ZWFyID0gX2RhdGUuZ2V0RnVsbFllYXIoKTtcblxuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgZmlyc3RXZWVrT2ZOZXh0WWVhciA9IGNvbnN0cnVjdEZyb20ob3B0aW9ucz8uaW4gfHwgZGF0ZSwgMCk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0RnVsbFllYXIoeWVhciArIDEsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mTmV4dFllYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZOZXh0WWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mTmV4dFllYXIsIG9wdGlvbnMpO1xuXG4gIGNvbnN0IGZpcnN0V2Vla09mVGhpc1llYXIgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWtPZlRoaXNZZWFyLnNldEZ1bGxZZWFyKHllYXIsIDAsIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSk7XG4gIGZpcnN0V2Vla09mVGhpc1llYXIuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gIGNvbnN0IHN0YXJ0T2ZUaGlzWWVhciA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vla09mVGhpc1llYXIsIG9wdGlvbnMpO1xuXG4gIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZOZXh0WWVhcikge1xuICAgIHJldHVybiB5ZWFyICsgMTtcbiAgfSBlbHNlIGlmICgrX2RhdGUgPj0gK3N0YXJ0T2ZUaGlzWWVhcikge1xuICAgIHJldHVybiB5ZWFyO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB5ZWFyIC0gMTtcbiAgfVxufVxuXG4vLyBGYWxsYmFjayBmb3IgbW9kdWxhcml6ZWQgaW1wb3J0czpcbmV4cG9ydCBkZWZhdWx0IGdldFdlZWtZZWFyO1xuIiwKICAgICJpbXBvcnQgeyBnZXREZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL19saWIvZGVmYXVsdE9wdGlvbnMuanNcIjtcbmltcG9ydCB7IGNvbnN0cnVjdEZyb20gfSBmcm9tIFwiLi9jb25zdHJ1Y3RGcm9tLmpzXCI7XG5pbXBvcnQgeyBnZXRXZWVrWWVhciB9IGZyb20gXCIuL2dldFdlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyBzdGFydE9mV2VlayB9IGZyb20gXCIuL3N0YXJ0T2ZXZWVrLmpzXCI7XG5cbi8qKlxuICogVGhlIHtAbGluayBzdGFydE9mV2Vla1llYXJ9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBzdGFydE9mV2Vla1llYXJcbiAqIEBjYXRlZ29yeSBXZWVrLU51bWJlcmluZyBZZWFyIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyIGZvciB0aGUgZ2l2ZW4gZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgc3RhcnQgb2YgYSBsb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyLlxuICogVGhlIGV4YWN0IGNhbGN1bGF0aW9uIGRlcGVuZHMgb24gdGhlIHZhbHVlcyBvZlxuICogYG9wdGlvbnMud2Vla1N0YXJ0c09uYCAod2hpY2ggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWspXG4gKiBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAod2hpY2ggaXMgdGhlIGRheSBvZiBKYW51YXJ5LCB3aGljaCBpcyBhbHdheXMgaW5cbiAqIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB3ZWVrLW51bWJlcmluZyB5ZWFyKVxuICpcbiAqIFdlZWsgbnVtYmVyaW5nOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9XZWVrI1RoZV9JU09fd2Vla19kYXRlX3N5c3RlbVxuICpcbiAqIEB0eXBlUGFyYW0gRGF0ZVR5cGUgLSBUaGUgYERhdGVgIHR5cGUsIHRoZSBmdW5jdGlvbiBvcGVyYXRlcyBvbi4gR2V0cyBpbmZlcnJlZCBmcm9tIHBhc3NlZCBhcmd1bWVudHMuIEFsbG93cyB0byB1c2UgZXh0ZW5zaW9ucyBsaWtlIFtgVVRDRGF0ZWBdKGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy91dGMpLlxuICogQHR5cGVQYXJhbSBSZXN1bHREYXRlIC0gVGhlIHJlc3VsdCBgRGF0ZWAgdHlwZS5cbiAqXG4gKiBAcGFyYW0gZGF0ZSAtIFRoZSBvcmlnaW5hbCBkYXRlXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEFuIG9iamVjdCB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyBUaGUgc3RhcnQgb2YgYSB3ZWVrLW51bWJlcmluZyB5ZWFyXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhbiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1IHdpdGggZGVmYXVsdCBzZXR0aW5nczpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSlcbiAqIC8vPT4gU3VuIERlYyAyNiAyMDA0IDAwOjAwOjAwXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRoZSBzdGFydCBvZiBhIHdlZWstbnVtYmVyaW5nIHllYXIgZm9yIDIgSnVseSAyMDA1XG4gKiAvLyBpZiBNb25kYXkgaXMgdGhlIGZpcnN0IGRheSBvZiB3ZWVrXG4gKiAvLyBhbmQgNCBKYW51YXJ5IGlzIGFsd2F5cyBpbiB0aGUgZmlyc3Qgd2VlayBvZiB0aGUgeWVhcjpcbiAqIGNvbnN0IHJlc3VsdCA9IHN0YXJ0T2ZXZWVrWWVhcihuZXcgRGF0ZSgyMDA1LCA2LCAyKSwge1xuICogICB3ZWVrU3RhcnRzT246IDEsXG4gKiAgIGZpcnN0V2Vla0NvbnRhaW5zRGF0ZTogNFxuICogfSlcbiAqIC8vPT4gTW9uIEphbiAwMyAyMDA1IDAwOjAwOjAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFydE9mV2Vla1llYXIoZGF0ZSwgb3B0aW9ucykge1xuICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldERlZmF1bHRPcHRpb25zKCk7XG4gIGNvbnN0IGZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA9XG4gICAgb3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgb3B0aW9ucz8ubG9jYWxlPy5vcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBkZWZhdWx0T3B0aW9ucy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIDE7XG5cbiAgY29uc3QgeWVhciA9IGdldFdlZWtZZWFyKGRhdGUsIG9wdGlvbnMpO1xuICBjb25zdCBmaXJzdFdlZWsgPSBjb25zdHJ1Y3RGcm9tKG9wdGlvbnM/LmluIHx8IGRhdGUsIDApO1xuICBmaXJzdFdlZWsuc2V0RnVsbFllYXIoeWVhciwgMCwgZmlyc3RXZWVrQ29udGFpbnNEYXRlKTtcbiAgZmlyc3RXZWVrLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICBjb25zdCBfZGF0ZSA9IHN0YXJ0T2ZXZWVrKGZpcnN0V2Vlaywgb3B0aW9ucyk7XG4gIHJldHVybiBfZGF0ZTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBzdGFydE9mV2Vla1llYXI7XG4iLAogICAgImltcG9ydCB7IG1pbGxpc2Vjb25kc0luV2VlayB9IGZyb20gXCIuL2NvbnN0YW50cy5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWsgfSBmcm9tIFwiLi9zdGFydE9mV2Vlay5qc1wiO1xuaW1wb3J0IHsgc3RhcnRPZldlZWtZZWFyIH0gZnJvbSBcIi4vc3RhcnRPZldlZWtZZWFyLmpzXCI7XG5pbXBvcnQgeyB0b0RhdGUgfSBmcm9tIFwiLi90b0RhdGUuanNcIjtcblxuLyoqXG4gKiBUaGUge0BsaW5rIGdldFdlZWt9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBnZXRXZWVrXG4gKiBAY2F0ZWdvcnkgV2VlayBIZWxwZXJzXG4gKiBAc3VtbWFyeSBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBHZXQgdGhlIGxvY2FsIHdlZWsgaW5kZXggb2YgdGhlIGdpdmVuIGRhdGUuXG4gKiBUaGUgZXhhY3QgY2FsY3VsYXRpb24gZGVwZW5kcyBvbiB0aGUgdmFsdWVzIG9mXG4gKiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gICh3aGljaCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaylcbiAqIGFuZCBgb3B0aW9ucy5maXJzdFdlZWtDb250YWluc0RhdGVgICh3aGljaCBpcyB0aGUgZGF5IG9mIEphbnVhcnksIHdoaWNoIGlzIGFsd2F5cyBpblxuICogdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHdlZWstbnVtYmVyaW5nIHllYXIpXG4gKlxuICogV2VlayBudW1iZXJpbmc6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1dlZWsjVGhlX0lTT193ZWVrX2RhdGVfc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGUgLSBUaGUgZ2l2ZW4gZGF0ZVxuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIHdlZWtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSB3aXRoIGRlZmF1bHQgb3B0aW9ucz9cbiAqIGNvbnN0IHJlc3VsdCA9IGdldFdlZWsobmV3IERhdGUoMjAwNSwgMCwgMikpXG4gKiAvLz0+IDJcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gV2hpY2ggd2VlayBvZiB0aGUgbG9jYWwgd2VlayBudW1iZXJpbmcgeWVhciBpcyAyIEphbnVhcnkgMjAwNSxcbiAqIC8vIGlmIE1vbmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLFxuICogLy8gYW5kIHRoZSBmaXJzdCB3ZWVrIG9mIHRoZSB5ZWFyIGFsd2F5cyBjb250YWlucyA0IEphbnVhcnk/XG4gKiBjb25zdCByZXN1bHQgPSBnZXRXZWVrKG5ldyBEYXRlKDIwMDUsIDAsIDIpLCB7XG4gKiAgIHdlZWtTdGFydHNPbjogMSxcbiAqICAgZmlyc3RXZWVrQ29udGFpbnNEYXRlOiA0XG4gKiB9KVxuICogLy89PiA1M1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VlayhkYXRlLCBvcHRpb25zKSB7XG4gIGNvbnN0IF9kYXRlID0gdG9EYXRlKGRhdGUsIG9wdGlvbnM/LmluKTtcbiAgY29uc3QgZGlmZiA9ICtzdGFydE9mV2VlayhfZGF0ZSwgb3B0aW9ucykgLSArc3RhcnRPZldlZWtZZWFyKF9kYXRlLCBvcHRpb25zKTtcblxuICAvLyBSb3VuZCB0aGUgbnVtYmVyIG9mIHdlZWtzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIgYmVjYXVzZSB0aGUgbnVtYmVyIG9mXG4gIC8vIG1pbGxpc2Vjb25kcyBpbiBhIHdlZWsgaXMgbm90IGNvbnN0YW50IChlLmcuIGl0J3MgZGlmZmVyZW50IGluIHRoZSB3ZWVrIG9mXG4gIC8vIHRoZSBkYXlsaWdodCBzYXZpbmcgdGltZSBjbG9jayBzaGlmdCkuXG4gIHJldHVybiBNYXRoLnJvdW5kKGRpZmYgLyBtaWxsaXNlY29uZHNJbldlZWspICsgMTtcbn1cblxuLy8gRmFsbGJhY2sgZm9yIG1vZHVsYXJpemVkIGltcG9ydHM6XG5leHBvcnQgZGVmYXVsdCBnZXRXZWVrO1xuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gYWRkTGVhZGluZ1plcm9zKG51bWJlciwgdGFyZ2V0TGVuZ3RoKSB7XG4gIGNvbnN0IHNpZ24gPSBudW1iZXIgPCAwID8gXCItXCIgOiBcIlwiO1xuICBjb25zdCBvdXRwdXQgPSBNYXRoLmFicyhudW1iZXIpLnRvU3RyaW5nKCkucGFkU3RhcnQodGFyZ2V0TGVuZ3RoLCBcIjBcIik7XG4gIHJldHVybiBzaWduICsgb3V0cHV0O1xufVxuIiwKICAgICJpbXBvcnQgeyBhZGRMZWFkaW5nWmVyb3MgfSBmcm9tIFwiLi4vYWRkTGVhZGluZ1plcm9zLmpzXCI7XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICovXG5cbmV4cG9ydCBjb25zdCBsaWdodEZvcm1hdHRlcnMgPSB7XG4gIC8vIFllYXJcbiAgeShkYXRlLCB0b2tlbikge1xuICAgIC8vIEZyb20gaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS0zMS90cjM1LWRhdGVzLmh0bWwjRGF0ZV9Gb3JtYXRfdG9rZW5zXG4gICAgLy8gfCBZZWFyICAgICB8ICAgICB5IHwgeXkgfCAgIHl5eSB8ICB5eXl5IHwgeXl5eXkgfFxuICAgIC8vIHwtLS0tLS0tLS0tfC0tLS0tLS18LS0tLXwtLS0tLS0tfC0tLS0tLS18LS0tLS0tLXxcbiAgICAvLyB8IEFEIDEgICAgIHwgICAgIDEgfCAwMSB8ICAgMDAxIHwgIDAwMDEgfCAwMDAwMSB8XG4gICAgLy8gfCBBRCAxMiAgICB8ICAgIDEyIHwgMTIgfCAgIDAxMiB8ICAwMDEyIHwgMDAwMTIgfFxuICAgIC8vIHwgQUQgMTIzICAgfCAgIDEyMyB8IDIzIHwgICAxMjMgfCAgMDEyMyB8IDAwMTIzIHxcbiAgICAvLyB8IEFEIDEyMzQgIHwgIDEyMzQgfCAzNCB8ICAxMjM0IHwgIDEyMzQgfCAwMTIzNCB8XG4gICAgLy8gfCBBRCAxMjM0NSB8IDEyMzQ1IHwgNDUgfCAxMjM0NSB8IDEyMzQ1IHwgMTIzNDUgfFxuXG4gICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHllYXIgPSBzaWduZWRZZWFyID4gMCA/IHNpZ25lZFllYXIgOiAxIC0gc2lnbmVkWWVhcjtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRva2VuID09PSBcInl5XCIgPyB5ZWFyICUgMTAwIDogeWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNb250aFxuICBNKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgbW9udGggPSBkYXRlLmdldE1vbnRoKCk7XG4gICAgcmV0dXJuIHRva2VuID09PSBcIk1cIiA/IFN0cmluZyhtb250aCArIDEpIDogYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldERhdGUoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBBTSBvciBQTVxuICBhKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF0ZS5nZXRIb3VycygpIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcblxuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgXCJhXCI6XG4gICAgICBjYXNlIFwiYWFcIjpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZS50b1VwcGVyQ2FzZSgpO1xuICAgICAgY2FzZSBcImFhYVwiOlxuICAgICAgICByZXR1cm4gZGF5UGVyaW9kRW51bVZhbHVlO1xuICAgICAgY2FzZSBcImFhYWFhXCI6XG4gICAgICAgIHJldHVybiBkYXlQZXJpb2RFbnVtVmFsdWVbMF07XG4gICAgICBjYXNlIFwiYWFhYVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGRheVBlcmlvZEVudW1WYWx1ZSA9PT0gXCJhbVwiID8gXCJhLm0uXCIgOiBcInAubS5cIjtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRIb3VycygpICUgMTIgfHwgMTIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSChkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRIb3VycygpLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIE1pbnV0ZVxuICBtKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhkYXRlLmdldE1pbnV0ZXMoKSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBTZWNvbmRcbiAgcyhkYXRlLCB0b2tlbikge1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoZGF0ZS5nZXRTZWNvbmRzKCksIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRnJhY3Rpb24gb2Ygc2Vjb25kXG4gIFMoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBudW1iZXJPZkRpZ2l0cyA9IHRva2VuLmxlbmd0aDtcbiAgICBjb25zdCBtaWxsaXNlY29uZHMgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpO1xuICAgIGNvbnN0IGZyYWN0aW9uYWxTZWNvbmRzID0gTWF0aC50cnVuYyhcbiAgICAgIG1pbGxpc2Vjb25kcyAqIE1hdGgucG93KDEwLCBudW1iZXJPZkRpZ2l0cyAtIDMpLFxuICAgICk7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhmcmFjdGlvbmFsU2Vjb25kcywgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG4iLAogICAgImltcG9ydCB7IGdldERheU9mWWVhciB9IGZyb20gXCIuLi8uLi9nZXREYXlPZlllYXIuanNcIjtcbmltcG9ydCB7IGdldElTT1dlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0SVNPV2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0SVNPV2Vla1llYXIuanNcIjtcbmltcG9ydCB7IGdldFdlZWsgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vlay5qc1wiO1xuaW1wb3J0IHsgZ2V0V2Vla1llYXIgfSBmcm9tIFwiLi4vLi4vZ2V0V2Vla1llYXIuanNcIjtcblxuaW1wb3J0IHsgYWRkTGVhZGluZ1plcm9zIH0gZnJvbSBcIi4uL2FkZExlYWRpbmdaZXJvcy5qc1wiO1xuaW1wb3J0IHsgbGlnaHRGb3JtYXR0ZXJzIH0gZnJvbSBcIi4vbGlnaHRGb3JtYXR0ZXJzLmpzXCI7XG5cbmNvbnN0IGRheVBlcmlvZEVudW0gPSB7XG4gIGFtOiBcImFtXCIsXG4gIHBtOiBcInBtXCIsXG4gIG1pZG5pZ2h0OiBcIm1pZG5pZ2h0XCIsXG4gIG5vb246IFwibm9vblwiLFxuICBtb3JuaW5nOiBcIm1vcm5pbmdcIixcbiAgYWZ0ZXJub29uOiBcImFmdGVybm9vblwiLFxuICBldmVuaW5nOiBcImV2ZW5pbmdcIixcbiAgbmlnaHQ6IFwibmlnaHRcIixcbn07XG5cbi8qXG4gKiB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICB8IFVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8ICBhICB8IEFNLCBQTSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBBKiB8IE1pbGxpc2Vjb25kcyBpbiBkYXkgICAgICAgICAgICB8XG4gKiB8ICBiICB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICB8ICBCICB8IEZsZXhpYmxlIGRheSBwZXJpb2QgICAgICAgICAgICB8XG4gKiB8ICBjICB8IFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrICB8ICBDKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8XG4gKiB8ICBkICB8IERheSBvZiBtb250aCAgICAgICAgICAgICAgICAgICB8ICBEICB8IERheSBvZiB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBlICB8IExvY2FsIGRheSBvZiB3ZWVrICAgICAgICAgICAgICB8ICBFICB8IERheSBvZiB3ZWVrICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBmICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBGKiB8IERheSBvZiB3ZWVrIGluIG1vbnRoICAgICAgICAgICB8XG4gKiB8ICBnKiB8IE1vZGlmaWVkIEp1bGlhbiBkYXkgICAgICAgICAgICB8ICBHICB8IEVyYSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBoICB8IEhvdXIgWzEtMTJdICAgICAgICAgICAgICAgICAgICB8ICBIICB8IEhvdXIgWzAtMjNdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBpISB8IElTTyBkYXkgb2Ygd2VlayAgICAgICAgICAgICAgICB8ICBJISB8IElTTyB3ZWVrIG9mIHllYXIgICAgICAgICAgICAgICB8XG4gKiB8ICBqKiB8IExvY2FsaXplZCBob3VyIHcvIGRheSBwZXJpb2QgICB8ICBKKiB8IExvY2FsaXplZCBob3VyIHcvbyBkYXkgcGVyaW9kICB8XG4gKiB8ICBrICB8IEhvdXIgWzEtMjRdICAgICAgICAgICAgICAgICAgICB8ICBLICB8IEhvdXIgWzAtMTFdICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBsKiB8IChkZXByZWNhdGVkKSAgICAgICAgICAgICAgICAgICB8ICBMICB8IFN0YW5kLWFsb25lIG1vbnRoICAgICAgICAgICAgICB8XG4gKiB8ICBtICB8IE1pbnV0ZSAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNICB8IE1vbnRoICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBuICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBOICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICBvISB8IE9yZGluYWwgbnVtYmVyIG1vZGlmaWVyICAgICAgICB8ICBPICB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICB8XG4gKiB8ICBwISB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICB8ICBQISB8IExvbmcgbG9jYWxpemVkIGRhdGUgICAgICAgICAgICB8XG4gKiB8ICBxICB8IFN0YW5kLWFsb25lIHF1YXJ0ZXIgICAgICAgICAgICB8ICBRICB8IFF1YXJ0ZXIgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICByKiB8IFJlbGF0ZWQgR3JlZ29yaWFuIHllYXIgICAgICAgICB8ICBSISB8IElTTyB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgICB8XG4gKiB8ICBzICB8IFNlY29uZCAgICAgICAgICAgICAgICAgICAgICAgICB8ICBTICB8IEZyYWN0aW9uIG9mIHNlY29uZCAgICAgICAgICAgICB8XG4gKiB8ICB0ISB8IFNlY29uZHMgdGltZXN0YW1wICAgICAgICAgICAgICB8ICBUISB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICB8XG4gKiB8ICB1ICB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICB8ICBVKiB8IEN5Y2xpYyB5ZWFyICAgICAgICAgICAgICAgICAgICB8XG4gKiB8ICB2KiB8IFRpbWV6b25lIChnZW5lcmljIG5vbi1sb2NhdC4pICB8ICBWKiB8IFRpbWV6b25lIChsb2NhdGlvbikgICAgICAgICAgICB8XG4gKiB8ICB3ICB8IExvY2FsIHdlZWsgb2YgeWVhciAgICAgICAgICAgICB8ICBXKiB8IFdlZWsgb2YgbW9udGggICAgICAgICAgICAgICAgICB8XG4gKiB8ICB4ICB8IFRpbWV6b25lIChJU08tODYwMSB3L28gWikgICAgICB8ICBYICB8IFRpbWV6b25lIChJU08tODYwMSkgICAgICAgICAgICB8XG4gKiB8ICB5ICB8IFllYXIgKGFicykgICAgICAgICAgICAgICAgICAgICB8ICBZICB8IExvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIgICAgICB8XG4gKiB8ICB6ICB8IFRpbWV6b25lIChzcGVjaWZpYyBub24tbG9jYXQuKSB8ICBaKiB8IFRpbWV6b25lIChhbGlhc2VzKSAgICAgICAgICAgICB8XG4gKlxuICogTGV0dGVycyBtYXJrZWQgYnkgKiBhcmUgbm90IGltcGxlbWVudGVkIGJ1dCByZXNlcnZlZCBieSBVbmljb2RlIHN0YW5kYXJkLlxuICpcbiAqIExldHRlcnMgbWFya2VkIGJ5ICEgYXJlIG5vbi1zdGFuZGFyZCwgYnV0IGltcGxlbWVudGVkIGJ5IGRhdGUtZm5zOlxuICogLSBgb2AgbW9kaWZpZXMgdGhlIHByZXZpb3VzIHRva2VuIHRvIHR1cm4gaXQgaW50byBhbiBvcmRpbmFsIChzZWUgYGZvcm1hdGAgZG9jcylcbiAqIC0gYGlgIGlzIElTTyBkYXkgb2Ygd2Vlay4gRm9yIGBpYCBhbmQgYGlpYCBpcyByZXR1cm5zIG51bWVyaWMgSVNPIHdlZWsgZGF5cyxcbiAqICAgaS5lLiA3IGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICogLSBgSWAgaXMgSVNPIHdlZWsgb2YgeWVhciwgYXMgb3Bwb3NlZCB0byBgd2Agd2hpY2ggaXMgbG9jYWwgd2VlayBvZiB5ZWFyLlxuICogLSBgUmAgaXMgSVNPIHdlZWstbnVtYmVyaW5nIHllYXIsIGFzIG9wcG9zZWQgdG8gYFlgIHdoaWNoIGlzIGxvY2FsIHdlZWstbnVtYmVyaW5nIHllYXIuXG4gKiAgIGBSYCBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYElgIGFuZCBgaWBcbiAqICAgZm9yIHVuaXZlcnNhbCBJU08gd2Vlay1udW1iZXJpbmcgZGF0ZSwgd2hlcmVhc1xuICogICBgWWAgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB3YCBhbmQgYGVgXG4gKiAgIGZvciB3ZWVrLW51bWJlcmluZyBkYXRlIHNwZWNpZmljIHRvIHRoZSBsb2NhbGUuXG4gKiAtIGBQYCBpcyBsb25nIGxvY2FsaXplZCBkYXRlIGZvcm1hdFxuICogLSBgcGAgaXMgbG9uZyBsb2NhbGl6ZWQgdGltZSBmb3JtYXRcbiAqL1xuXG5leHBvcnQgY29uc3QgZm9ybWF0dGVycyA9IHtcbiAgLy8gRXJhXG4gIEc6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBlcmEgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiAwID8gMSA6IDA7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gQUQsIEJDXG4gICAgICBjYXNlIFwiR1wiOlxuICAgICAgY2FzZSBcIkdHXCI6XG4gICAgICBjYXNlIFwiR0dHXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcImFiYnJldmlhdGVkXCIgfSk7XG4gICAgICAvLyBBLCBCXG4gICAgICBjYXNlIFwiR0dHR0dcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmVyYShlcmEsIHsgd2lkdGg6IFwibmFycm93XCIgfSk7XG4gICAgICAvLyBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdFxuICAgICAgY2FzZSBcIkdHR0dcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5lcmEoZXJhLCB7IHdpZHRoOiBcIndpZGVcIiB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gWWVhclxuICB5OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgLy8gT3JkaW5hbCBudW1iZXJcbiAgICBpZiAodG9rZW4gPT09IFwieW9cIikge1xuICAgICAgY29uc3Qgc2lnbmVkWWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIC8vIFJldHVybnMgMSBmb3IgMSBCQyAod2hpY2ggaXMgeWVhciAwIGluIEphdmFTY3JpcHQpXG4gICAgICBjb25zdCB5ZWFyID0gc2lnbmVkWWVhciA+IDAgPyBzaWduZWRZZWFyIDogMSAtIHNpZ25lZFllYXI7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih5ZWFyLCB7IHVuaXQ6IFwieWVhclwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMueShkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gTG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhclxuICBZOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgc2lnbmVkV2Vla1llYXIgPSBnZXRXZWVrWWVhcihkYXRlLCBvcHRpb25zKTtcbiAgICAvLyBSZXR1cm5zIDEgZm9yIDEgQkMgKHdoaWNoIGlzIHllYXIgMCBpbiBKYXZhU2NyaXB0KVxuICAgIGNvbnN0IHdlZWtZZWFyID0gc2lnbmVkV2Vla1llYXIgPiAwID8gc2lnbmVkV2Vla1llYXIgOiAxIC0gc2lnbmVkV2Vla1llYXI7XG5cbiAgICAvLyBUd28gZGlnaXQgeWVhclxuICAgIGlmICh0b2tlbiA9PT0gXCJZWVwiKSB7XG4gICAgICBjb25zdCB0d29EaWdpdFllYXIgPSB3ZWVrWWVhciAlIDEwMDtcbiAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3ModHdvRGlnaXRZZWFyLCAyKTtcbiAgICB9XG5cbiAgICAvLyBPcmRpbmFsIG51bWJlclxuICAgIGlmICh0b2tlbiA9PT0gXCJZb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcih3ZWVrWWVhciwgeyB1bml0OiBcInllYXJcIiB9KTtcbiAgICB9XG5cbiAgICAvLyBQYWRkaW5nXG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyh3ZWVrWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBJU08gd2Vlay1udW1iZXJpbmcgeWVhclxuICBSOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4pIHtcbiAgICBjb25zdCBpc29XZWVrWWVhciA9IGdldElTT1dlZWtZZWFyKGRhdGUpO1xuXG4gICAgLy8gUGFkZGluZ1xuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaXNvV2Vla1llYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRXh0ZW5kZWQgeWVhci4gVGhpcyBpcyBhIHNpbmdsZSBudW1iZXIgZGVzaWduYXRpbmcgdGhlIHllYXIgb2YgdGhpcyBjYWxlbmRhciBzeXN0ZW0uXG4gIC8vIFRoZSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBgeWAgYW5kIGB1YCBsb2NhbGl6ZXJzIGFyZSBCLkMuIHllYXJzOlxuICAvLyB8IFllYXIgfCBgeWAgfCBgdWAgfFxuICAvLyB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICAvLyB8IEFDIDEgfCAgIDEgfCAgIDEgfFxuICAvLyB8IEJDIDEgfCAgIDEgfCAgIDAgfFxuICAvLyB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICAvLyBBbHNvIGB5eWAgYWx3YXlzIHJldHVybnMgdGhlIGxhc3QgdHdvIGRpZ2l0cyBvZiBhIHllYXIsXG4gIC8vIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZC5cbiAgdTogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHllYXIsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gUXVhcnRlclxuICBROiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgcXVhcnRlciA9IE1hdGguY2VpbCgoZGF0ZS5nZXRNb250aCgpICsgMSkgLyAzKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAzLCA0XG4gICAgICBjYXNlIFwiUVwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKHF1YXJ0ZXIpO1xuICAgICAgLy8gMDEsIDAyLCAwMywgMDRcbiAgICAgIGNhc2UgXCJRUVwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHF1YXJ0ZXIsIDIpO1xuICAgICAgLy8gMXN0LCAybmQsIDNyZCwgNHRoXG4gICAgICBjYXNlIFwiUW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIocXVhcnRlciwgeyB1bml0OiBcInF1YXJ0ZXJcIiB9KTtcbiAgICAgIC8vIFExLCBRMiwgUTMsIFE0XG4gICAgICBjYXNlIFwiUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDEsIDIsIDMsIDQgKG5hcnJvdyBxdWFydGVyOyBjb3VsZCBiZSBub3QgbnVtZXJpY2FsKVxuICAgICAgY2FzZSBcIlFRUVFRXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJuYXJyb3dcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyAxc3QgcXVhcnRlciwgMm5kIHF1YXJ0ZXIsIC4uLlxuICAgICAgY2FzZSBcIlFRUVFcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5xdWFydGVyKHF1YXJ0ZXIsIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBTdGFuZC1hbG9uZSBxdWFydGVyXG4gIHE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBxdWFydGVyID0gTWF0aC5jZWlsKChkYXRlLmdldE1vbnRoKCkgKyAxKSAvIDMpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDEsIDIsIDMsIDRcbiAgICAgIGNhc2UgXCJxXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcocXVhcnRlcik7XG4gICAgICAvLyAwMSwgMDIsIDAzLCAwNFxuICAgICAgY2FzZSBcInFxXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MocXVhcnRlciwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgM3JkLCA0dGhcbiAgICAgIGNhc2UgXCJxb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihxdWFydGVyLCB7IHVuaXQ6IFwicXVhcnRlclwiIH0pO1xuICAgICAgLy8gUTEsIFEyLCBRMywgUTRcbiAgICAgIGNhc2UgXCJxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gMSwgMiwgMywgNCAobmFycm93IHF1YXJ0ZXI7IGNvdWxkIGJlIG5vdCBudW1lcmljYWwpXG4gICAgICBjYXNlIFwicXFxcXFcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIDFzdCBxdWFydGVyLCAybmQgcXVhcnRlciwgLi4uXG4gICAgICBjYXNlIFwicXFxcVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLnF1YXJ0ZXIocXVhcnRlciwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIE1vbnRoXG4gIE06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiTVwiOlxuICAgICAgY2FzZSBcIk1NXCI6XG4gICAgICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuTShkYXRlLCB0b2tlbik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTW9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIk1NTVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIk1NTU1NXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTU1NTVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJmb3JtYXR0aW5nXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIG1vbnRoXG4gIEw6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyAxLCAyLCAuLi4sIDEyXG4gICAgICBjYXNlIFwiTFwiOlxuICAgICAgICByZXR1cm4gU3RyaW5nKG1vbnRoICsgMSk7XG4gICAgICAvLyAwMSwgMDIsIC4uLiwgMTJcbiAgICAgIGNhc2UgXCJMTFwiOlxuICAgICAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKG1vbnRoICsgMSwgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCAxMnRoXG4gICAgICBjYXNlIFwiTG9cIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIobW9udGggKyAxLCB7IHVuaXQ6IFwibW9udGhcIiB9KTtcbiAgICAgIC8vIEphbiwgRmViLCAuLi4sIERlY1xuICAgICAgY2FzZSBcIkxMTFwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUubW9udGgobW9udGgsIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEosIEYsIC4uLiwgRFxuICAgICAgY2FzZSBcIkxMTExMXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5tb250aChtb250aCwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIEphbnVhcnksIEZlYnJ1YXJ5LCAuLi4sIERlY2VtYmVyXG4gICAgICBjYXNlIFwiTExMTFwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLm1vbnRoKG1vbnRoLCB7IHdpZHRoOiBcIndpZGVcIiwgY29udGV4dDogXCJzdGFuZGFsb25lXCIgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIExvY2FsIHdlZWsgb2YgeWVhclxuICB3OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3Qgd2VlayA9IGdldFdlZWsoZGF0ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwid29cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIod2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHdlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gSVNPIHdlZWsgb2YgeWVhclxuICBJOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaXNvV2VlayA9IGdldElTT1dlZWsoZGF0ZSk7XG5cbiAgICBpZiAodG9rZW4gPT09IFwiSW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoaXNvV2VlaywgeyB1bml0OiBcIndlZWtcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGlzb1dlZWssIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHRoZSBtb250aFxuICBkOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcImRvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0RGF0ZSgpLCB7IHVuaXQ6IFwiZGF0ZVwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuZChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gRGF5IG9mIHllYXJcbiAgRDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGRheU9mWWVhciA9IGdldERheU9mWWVhcihkYXRlKTtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJEb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXlPZlllYXIsIHsgdW5pdDogXCJkYXlPZlllYXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGRheU9mWWVhciwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBEYXkgb2Ygd2Vla1xuICBFOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICAvLyBUdWVcbiAgICAgIGNhc2UgXCJFXCI6XG4gICAgICBjYXNlIFwiRUVcIjpcbiAgICAgIGNhc2UgXCJFRUVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFRcbiAgICAgIGNhc2UgXCJFRUVFRVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1XG4gICAgICBjYXNlIFwiRUVFRUVFXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwic2hvcnRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICAvLyBUdWVzZGF5XG4gICAgICBjYXNlIFwiRUVFRVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJ3aWRlXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgfSxcblxuICAvLyBMb2NhbCBkYXkgb2Ygd2Vla1xuICBlOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplLCBvcHRpb25zKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBsb2NhbERheU9mV2VlayA9IChkYXlPZldlZWsgLSBvcHRpb25zLndlZWtTdGFydHNPbiArIDgpICUgNyB8fCA3O1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIE51bWVyaWNhbCB2YWx1ZSAoTnRoIGRheSBvZiB3ZWVrIHdpdGggY3VycmVudCBsb2NhbGUgb3Igd2Vla1N0YXJ0c09uKVxuICAgICAgY2FzZSBcImVcIjpcbiAgICAgICAgcmV0dXJuIFN0cmluZyhsb2NhbERheU9mV2Vlayk7XG4gICAgICAvLyBQYWRkZWQgbnVtZXJpY2FsIHZhbHVlXG4gICAgICBjYXNlIFwiZWVcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhsb2NhbERheU9mV2VlaywgMik7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJlb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImVlZVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImVlZWVlXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJlZWVlZWVcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJlZWVlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIFN0YW5kLWFsb25lIGxvY2FsIGRheSBvZiB3ZWVrXG4gIGM6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBkYXlPZldlZWsgPSBkYXRlLmdldERheSgpO1xuICAgIGNvbnN0IGxvY2FsRGF5T2ZXZWVrID0gKGRheU9mV2VlayAtIG9wdGlvbnMud2Vla1N0YXJ0c09uICsgOCkgJSA3IHx8IDc7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gTnVtZXJpY2FsIHZhbHVlIChzYW1lIGFzIGluIGBlYClcbiAgICAgIGNhc2UgXCJjXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcobG9jYWxEYXlPZldlZWspO1xuICAgICAgLy8gUGFkZGVkIG51bWVyaWNhbCB2YWx1ZVxuICAgICAgY2FzZSBcImNjXCI6XG4gICAgICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MobG9jYWxEYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAxc3QsIDJuZCwgLi4uLCA3dGhcbiAgICAgIGNhc2UgXCJjb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihsb2NhbERheU9mV2VlaywgeyB1bml0OiBcImRheVwiIH0pO1xuICAgICAgY2FzZSBcImNjY1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImNjY2NjXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJzdGFuZGFsb25lXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJjY2NjY2NcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwic3RhbmRhbG9uZVwiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJjY2NjXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcInN0YW5kYWxvbmVcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIElTTyBkYXkgb2Ygd2Vla1xuICBpOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgZGF5T2ZXZWVrID0gZGF0ZS5nZXREYXkoKTtcbiAgICBjb25zdCBpc29EYXlPZldlZWsgPSBkYXlPZldlZWsgPT09IDAgPyA3IDogZGF5T2ZXZWVrO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIC8vIDJcbiAgICAgIGNhc2UgXCJpXCI6XG4gICAgICAgIHJldHVybiBTdHJpbmcoaXNvRGF5T2ZXZWVrKTtcbiAgICAgIC8vIDAyXG4gICAgICBjYXNlIFwiaWlcIjpcbiAgICAgICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcyhpc29EYXlPZldlZWssIHRva2VuLmxlbmd0aCk7XG4gICAgICAvLyAybmRcbiAgICAgIGNhc2UgXCJpb1wiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihpc29EYXlPZldlZWssIHsgdW5pdDogXCJkYXlcIiB9KTtcbiAgICAgIC8vIFR1ZVxuICAgICAgY2FzZSBcImlpaVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVFxuICAgICAgY2FzZSBcImlpaWlpXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXkoZGF5T2ZXZWVrLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgLy8gVHVcbiAgICAgIGNhc2UgXCJpaWlpaWlcIjpcbiAgICAgICAgcmV0dXJuIGxvY2FsaXplLmRheShkYXlPZldlZWssIHtcbiAgICAgICAgICB3aWR0aDogXCJzaG9ydFwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIC8vIFR1ZXNkYXlcbiAgICAgIGNhc2UgXCJpaWlpXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5KGRheU9mV2Vlaywge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNIG9yIFBNXG4gIGE6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBjb25zdCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBjb25zdCBkYXlQZXJpb2RFbnVtVmFsdWUgPSBob3VycyAvIDEyID49IDEgPyBcInBtXCIgOiBcImFtXCI7XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYVwiOlxuICAgICAgY2FzZSBcImFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYWFhXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJhYWFhYVwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJhYWFhXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIEFNLCBQTSwgbWlkbmlnaHQsIG5vb25cbiAgYjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID09PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5ub29uO1xuICAgIH0gZWxzZSBpZiAoaG91cnMgPT09IDApIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubWlkbmlnaHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGhvdXJzIC8gMTIgPj0gMSA/IFwicG1cIiA6IFwiYW1cIjtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRva2VuKSB7XG4gICAgICBjYXNlIFwiYlwiOlxuICAgICAgY2FzZSBcImJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwiYWJicmV2aWF0ZWRcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgICBjYXNlIFwiYmJiXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZVxuICAgICAgICAgIC5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgICB3aWR0aDogXCJhYmJyZXZpYXRlZFwiLFxuICAgICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNhc2UgXCJiYmJiYlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIm5hcnJvd1wiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgIGNhc2UgXCJiYmJiXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcIndpZGVcIixcbiAgICAgICAgICBjb250ZXh0OiBcImZvcm1hdHRpbmdcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICB9LFxuXG4gIC8vIGluIHRoZSBtb3JuaW5nLCBpbiB0aGUgYWZ0ZXJub29uLCBpbiB0aGUgZXZlbmluZywgYXQgbmlnaHRcbiAgQjogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xuICAgIGxldCBkYXlQZXJpb2RFbnVtVmFsdWU7XG4gICAgaWYgKGhvdXJzID49IDE3KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLmV2ZW5pbmc7XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSAxMikge1xuICAgICAgZGF5UGVyaW9kRW51bVZhbHVlID0gZGF5UGVyaW9kRW51bS5hZnRlcm5vb247XG4gICAgfSBlbHNlIGlmIChob3VycyA+PSA0KSB7XG4gICAgICBkYXlQZXJpb2RFbnVtVmFsdWUgPSBkYXlQZXJpb2RFbnVtLm1vcm5pbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRheVBlcmlvZEVudW1WYWx1ZSA9IGRheVBlcmlvZEVudW0ubmlnaHQ7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSBcIkJcIjpcbiAgICAgIGNhc2UgXCJCQlwiOlxuICAgICAgY2FzZSBcIkJCQlwiOlxuICAgICAgICByZXR1cm4gbG9jYWxpemUuZGF5UGVyaW9kKGRheVBlcmlvZEVudW1WYWx1ZSwge1xuICAgICAgICAgIHdpZHRoOiBcImFiYnJldmlhdGVkXCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJCXCI6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwibmFycm93XCIsXG4gICAgICAgICAgY29udGV4dDogXCJmb3JtYXR0aW5nXCIsXG4gICAgICAgIH0pO1xuICAgICAgY2FzZSBcIkJCQkJcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBsb2NhbGl6ZS5kYXlQZXJpb2QoZGF5UGVyaW9kRW51bVZhbHVlLCB7XG4gICAgICAgICAgd2lkdGg6IFwid2lkZVwiLFxuICAgICAgICAgIGNvbnRleHQ6IFwiZm9ybWF0dGluZ1wiLFxuICAgICAgICB9KTtcbiAgICB9XG4gIH0sXG5cbiAgLy8gSG91ciBbMS0xMl1cbiAgaDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJob1wiKSB7XG4gICAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcbiAgICAgIGlmIChob3VycyA9PT0gMCkgaG91cnMgPSAxMjtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBsaWdodEZvcm1hdHRlcnMuaChkYXRlLCB0b2tlbik7XG4gIH0sXG5cbiAgLy8gSG91ciBbMC0yM11cbiAgSDogZnVuY3Rpb24gKGRhdGUsIHRva2VuLCBsb2NhbGl6ZSkge1xuICAgIGlmICh0b2tlbiA9PT0gXCJIb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihkYXRlLmdldEhvdXJzKCksIHsgdW5pdDogXCJob3VyXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5IKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBIb3VyIFswLTExXVxuICBLOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgY29uc3QgaG91cnMgPSBkYXRlLmdldEhvdXJzKCkgJSAxMjtcblxuICAgIGlmICh0b2tlbiA9PT0gXCJLb1wiKSB7XG4gICAgICByZXR1cm4gbG9jYWxpemUub3JkaW5hbE51bWJlcihob3VycywgeyB1bml0OiBcImhvdXJcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKGhvdXJzLCB0b2tlbi5sZW5ndGgpO1xuICB9LFxuXG4gIC8vIEhvdXIgWzEtMjRdXG4gIGs6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgaWYgKGhvdXJzID09PSAwKSBob3VycyA9IDI0O1xuXG4gICAgaWYgKHRva2VuID09PSBcImtvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGhvdXJzLCB7IHVuaXQ6IFwiaG91clwiIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRMZWFkaW5nWmVyb3MoaG91cnMsIHRva2VuLmxlbmd0aCk7XG4gIH0sXG5cbiAgLy8gTWludXRlXG4gIG06IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgbG9jYWxpemUpIHtcbiAgICBpZiAodG9rZW4gPT09IFwibW9cIikge1xuICAgICAgcmV0dXJuIGxvY2FsaXplLm9yZGluYWxOdW1iZXIoZGF0ZS5nZXRNaW51dGVzKCksIHsgdW5pdDogXCJtaW51dGVcIiB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlnaHRGb3JtYXR0ZXJzLm0oZGF0ZSwgdG9rZW4pO1xuICB9LFxuXG4gIC8vIFNlY29uZFxuICBzOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIGxvY2FsaXplKSB7XG4gICAgaWYgKHRva2VuID09PSBcInNvXCIpIHtcbiAgICAgIHJldHVybiBsb2NhbGl6ZS5vcmRpbmFsTnVtYmVyKGRhdGUuZ2V0U2Vjb25kcygpLCB7IHVuaXQ6IFwic2Vjb25kXCIgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5zKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBGcmFjdGlvbiBvZiBzZWNvbmRcbiAgUzogZnVuY3Rpb24gKGRhdGUsIHRva2VuKSB7XG4gICAgcmV0dXJuIGxpZ2h0Rm9ybWF0dGVycy5TKGRhdGUsIHRva2VuKTtcbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYWx3YXlzIGAnWidgKVxuICBYOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgaWYgKHRpbWV6b25lT2Zmc2V0ID09PSAwKSB7XG4gICAgICByZXR1cm4gXCJaXCI7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJYXCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGBYWGBcbiAgICAgIGNhc2UgXCJYWFhYXCI6XG4gICAgICBjYXNlIFwiWFhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYFhYWGBcbiAgICAgIGNhc2UgXCJYWFhYWFwiOlxuICAgICAgY2FzZSBcIlhYWFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoSVNPLTg2MDEuIElmIG9mZnNldCBpcyAwLCBvdXRwdXQgaXMgYCcrMDA6MDAnYCBvciBlcXVpdmFsZW50KVxuICB4OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gSG91cnMgYW5kIG9wdGlvbmFsIG1pbnV0ZXNcbiAgICAgIGNhc2UgXCJ4XCI6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZVdpdGhPcHRpb25hbE1pbnV0ZXModGltZXpvbmVPZmZzZXQpO1xuXG4gICAgICAvLyBIb3VycywgbWludXRlcyBhbmQgb3B0aW9uYWwgc2Vjb25kcyB3aXRob3V0IGA6YCBkZWxpbWl0ZXJcbiAgICAgIC8vIE5vdGU6IG5laXRoZXIgSVNPLTg2MDEgbm9yIEphdmFTY3JpcHQgc3VwcG9ydHMgc2Vjb25kcyBpbiB0aW1lem9uZSBvZmZzZXRzXG4gICAgICAvLyBzbyB0aGlzIHRva2VuIGFsd2F5cyBoYXMgdGhlIHNhbWUgb3V0cHV0IGFzIGB4eGBcbiAgICAgIGNhc2UgXCJ4eHh4XCI6XG4gICAgICBjYXNlIFwieHhcIjogLy8gSG91cnMgYW5kIG1pbnV0ZXMgd2l0aG91dCBgOmAgZGVsaW1pdGVyXG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCk7XG5cbiAgICAgIC8vIEhvdXJzLCBtaW51dGVzIGFuZCBvcHRpb25hbCBzZWNvbmRzIHdpdGggYDpgIGRlbGltaXRlclxuICAgICAgLy8gTm90ZTogbmVpdGhlciBJU08tODYwMSBub3IgSmF2YVNjcmlwdCBzdXBwb3J0cyBzZWNvbmRzIGluIHRpbWV6b25lIG9mZnNldHNcbiAgICAgIC8vIHNvIHRoaXMgdG9rZW4gYWx3YXlzIGhhcyB0aGUgc2FtZSBvdXRwdXQgYXMgYHh4eGBcbiAgICAgIGNhc2UgXCJ4eHh4eFwiOlxuICAgICAgY2FzZSBcInh4eFwiOiAvLyBIb3VycyBhbmQgbWludXRlcyB3aXRoIGA6YCBkZWxpbWl0ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoR01UKVxuICBPOiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJPXCI6XG4gICAgICBjYXNlIFwiT09cIjpcbiAgICAgIGNhc2UgXCJPT09cIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwiT09PT1wiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBUaW1lem9uZSAoc3BlY2lmaWMgbm9uLWxvY2F0aW9uKVxuICB6OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgLy8gU2hvcnRcbiAgICAgIGNhc2UgXCJ6XCI6XG4gICAgICBjYXNlIFwienpcIjpcbiAgICAgIGNhc2UgXCJ6enpcIjpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZVNob3J0KHRpbWV6b25lT2Zmc2V0LCBcIjpcIik7XG4gICAgICAvLyBMb25nXG4gICAgICBjYXNlIFwienp6elwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwiR01UXCIgKyBmb3JtYXRUaW1lem9uZSh0aW1lem9uZU9mZnNldCwgXCI6XCIpO1xuICAgIH1cbiAgfSxcblxuICAvLyBTZWNvbmRzIHRpbWVzdGFtcFxuICB0OiBmdW5jdGlvbiAoZGF0ZSwgdG9rZW4sIF9sb2NhbGl6ZSkge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IE1hdGgudHJ1bmMoK2RhdGUgLyAxMDAwKTtcbiAgICByZXR1cm4gYWRkTGVhZGluZ1plcm9zKHRpbWVzdGFtcCwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcblxuICAvLyBNaWxsaXNlY29uZHMgdGltZXN0YW1wXG4gIFQ6IGZ1bmN0aW9uIChkYXRlLCB0b2tlbiwgX2xvY2FsaXplKSB7XG4gICAgcmV0dXJuIGFkZExlYWRpbmdaZXJvcygrZGF0ZSwgdG9rZW4ubGVuZ3RoKTtcbiAgfSxcbn07XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lU2hvcnQob2Zmc2V0LCBkZWxpbWl0ZXIgPSBcIlwiKSB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXQgPiAwID8gXCItXCIgOiBcIitcIjtcbiAgY29uc3QgYWJzT2Zmc2V0ID0gTWF0aC5hYnMob2Zmc2V0KTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKTtcbiAgY29uc3QgbWludXRlcyA9IGFic09mZnNldCAlIDYwO1xuICBpZiAobWludXRlcyA9PT0gMCkge1xuICAgIHJldHVybiBzaWduICsgU3RyaW5nKGhvdXJzKTtcbiAgfVxuICByZXR1cm4gc2lnbiArIFN0cmluZyhob3VycykgKyBkZWxpbWl0ZXIgKyBhZGRMZWFkaW5nWmVyb3MobWludXRlcywgMik7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFRpbWV6b25lV2l0aE9wdGlvbmFsTWludXRlcyhvZmZzZXQsIGRlbGltaXRlcikge1xuICBpZiAob2Zmc2V0ICUgNjAgPT09IDApIHtcbiAgICBjb25zdCBzaWduID0gb2Zmc2V0ID4gMCA/IFwiLVwiIDogXCIrXCI7XG4gICAgcmV0dXJuIHNpZ24gKyBhZGRMZWFkaW5nWmVyb3MoTWF0aC5hYnMob2Zmc2V0KSAvIDYwLCAyKTtcbiAgfVxuICByZXR1cm4gZm9ybWF0VGltZXpvbmUob2Zmc2V0LCBkZWxpbWl0ZXIpO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRUaW1lem9uZShvZmZzZXQsIGRlbGltaXRlciA9IFwiXCIpIHtcbiAgY29uc3Qgc2lnbiA9IG9mZnNldCA+IDAgPyBcIi1cIiA6IFwiK1wiO1xuICBjb25zdCBhYnNPZmZzZXQgPSBNYXRoLmFicyhvZmZzZXQpO1xuICBjb25zdCBob3VycyA9IGFkZExlYWRpbmdaZXJvcyhNYXRoLnRydW5jKGFic09mZnNldCAvIDYwKSwgMik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBhZGRMZWFkaW5nWmVyb3MoYWJzT2Zmc2V0ICUgNjAsIDIpO1xuICByZXR1cm4gc2lnbiArIGhvdXJzICsgZGVsaW1pdGVyICsgbWludXRlcztcbn1cbiIsCiAgICAiY29uc3QgZGF0ZUxvbmdGb3JtYXR0ZXIgPSAocGF0dGVybiwgZm9ybWF0TG9uZykgPT4ge1xuICBzd2l0Y2ggKHBhdHRlcm4pIHtcbiAgICBjYXNlIFwiUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgY2FzZSBcIlBQXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwibWVkaXVtXCIgfSk7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgcmV0dXJuIGZvcm1hdExvbmcuZGF0ZSh7IHdpZHRoOiBcImxvbmdcIiB9KTtcbiAgICBjYXNlIFwiUFBQUFwiOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy5kYXRlKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICB9XG59O1xuXG5jb25zdCB0aW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIHN3aXRjaCAocGF0dGVybikge1xuICAgIGNhc2UgXCJwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwic2hvcnRcIiB9KTtcbiAgICBjYXNlIFwicHBcIjpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJtZWRpdW1cIiB9KTtcbiAgICBjYXNlIFwicHBwXCI6XG4gICAgICByZXR1cm4gZm9ybWF0TG9uZy50aW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgIGNhc2UgXCJwcHBwXCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmb3JtYXRMb25nLnRpbWUoeyB3aWR0aDogXCJmdWxsXCIgfSk7XG4gIH1cbn07XG5cbmNvbnN0IGRhdGVUaW1lTG9uZ0Zvcm1hdHRlciA9IChwYXR0ZXJuLCBmb3JtYXRMb25nKSA9PiB7XG4gIGNvbnN0IG1hdGNoUmVzdWx0ID0gcGF0dGVybi5tYXRjaCgvKFArKShwKyk/LykgfHwgW107XG4gIGNvbnN0IGRhdGVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMV07XG4gIGNvbnN0IHRpbWVQYXR0ZXJuID0gbWF0Y2hSZXN1bHRbMl07XG5cbiAgaWYgKCF0aW1lUGF0dGVybikge1xuICAgIHJldHVybiBkYXRlTG9uZ0Zvcm1hdHRlcihwYXR0ZXJuLCBmb3JtYXRMb25nKTtcbiAgfVxuXG4gIGxldCBkYXRlVGltZUZvcm1hdDtcblxuICBzd2l0Y2ggKGRhdGVQYXR0ZXJuKSB7XG4gICAgY2FzZSBcIlBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcInNob3J0XCIgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiUFBcIjpcbiAgICAgIGRhdGVUaW1lRm9ybWF0ID0gZm9ybWF0TG9uZy5kYXRlVGltZSh7IHdpZHRoOiBcIm1lZGl1bVwiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFwiOlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwibG9uZ1wiIH0pO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIlBQUFBcIjpcbiAgICBkZWZhdWx0OlxuICAgICAgZGF0ZVRpbWVGb3JtYXQgPSBmb3JtYXRMb25nLmRhdGVUaW1lKHsgd2lkdGg6IFwiZnVsbFwiIH0pO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gZGF0ZVRpbWVGb3JtYXRcbiAgICAucmVwbGFjZShcInt7ZGF0ZX19XCIsIGRhdGVMb25nRm9ybWF0dGVyKGRhdGVQYXR0ZXJuLCBmb3JtYXRMb25nKSlcbiAgICAucmVwbGFjZShcInt7dGltZX19XCIsIHRpbWVMb25nRm9ybWF0dGVyKHRpbWVQYXR0ZXJuLCBmb3JtYXRMb25nKSk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9uZ0Zvcm1hdHRlcnMgPSB7XG4gIHA6IHRpbWVMb25nRm9ybWF0dGVyLFxuICBQOiBkYXRlVGltZUxvbmdGb3JtYXR0ZXIsXG59O1xuIiwKICAgICJjb25zdCBkYXlPZlllYXJUb2tlblJFID0gL15EKyQvO1xuY29uc3Qgd2Vla1llYXJUb2tlblJFID0gL15ZKyQvO1xuXG5jb25zdCB0aHJvd1Rva2VucyA9IFtcIkRcIiwgXCJERFwiLCBcIllZXCIsIFwiWVlZWVwiXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIGRheU9mWWVhclRva2VuUkUudGVzdCh0b2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3RlY3RlZFdlZWtZZWFyVG9rZW4odG9rZW4pIHtcbiAgcmV0dXJuIHdlZWtZZWFyVG9rZW5SRS50ZXN0KHRva2VuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdCwgaW5wdXQpIHtcbiAgY29uc3QgX21lc3NhZ2UgPSBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KTtcbiAgY29uc29sZS53YXJuKF9tZXNzYWdlKTtcbiAgaWYgKHRocm93VG9rZW5zLmluY2x1ZGVzKHRva2VuKSkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoX21lc3NhZ2UpO1xufVxuXG5mdW5jdGlvbiBtZXNzYWdlKHRva2VuLCBmb3JtYXQsIGlucHV0KSB7XG4gIGNvbnN0IHN1YmplY3QgPSB0b2tlblswXSA9PT0gXCJZXCIgPyBcInllYXJzXCIgOiBcImRheXMgb2YgdGhlIG1vbnRoXCI7XG4gIHJldHVybiBgVXNlIFxcYCR7dG9rZW4udG9Mb3dlckNhc2UoKX1cXGAgaW5zdGVhZCBvZiBcXGAke3Rva2VufVxcYCAoaW4gXFxgJHtmb3JtYXR9XFxgKSBmb3IgZm9ybWF0dGluZyAke3N1YmplY3R9IHRvIHRoZSBpbnB1dCBcXGAke2lucHV0fVxcYDsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kYDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgZGVmYXVsdExvY2FsZSB9IGZyb20gXCIuL19saWIvZGVmYXVsdExvY2FsZS5qc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi9fbGliL2RlZmF1bHRPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBmb3JtYXR0ZXJzIH0gZnJvbSBcIi4vX2xpYi9mb3JtYXQvZm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHsgbG9uZ0Zvcm1hdHRlcnMgfSBmcm9tIFwiLi9fbGliL2Zvcm1hdC9sb25nRm9ybWF0dGVycy5qc1wiO1xuaW1wb3J0IHtcbiAgaXNQcm90ZWN0ZWREYXlPZlllYXJUb2tlbixcbiAgaXNQcm90ZWN0ZWRXZWVrWWVhclRva2VuLFxuICB3YXJuT3JUaHJvd1Byb3RlY3RlZEVycm9yLFxufSBmcm9tIFwiLi9fbGliL3Byb3RlY3RlZFRva2Vucy5qc1wiO1xuaW1wb3J0IHsgaXNWYWxpZCB9IGZyb20gXCIuL2lzVmFsaWQuanNcIjtcbmltcG9ydCB7IHRvRGF0ZSB9IGZyb20gXCIuL3RvRGF0ZS5qc1wiO1xuXG4vLyBSZXhwb3J0cyBvZiBpbnRlcm5hbCBmb3IgbGlicmFyaWVzIHRvIHVzZS5cbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2lzc3Vlcy8zNjM4I2lzc3VlY29tbWVudC0xODc3MDgyODc0XG5leHBvcnQgeyBmb3JtYXR0ZXJzLCBsb25nRm9ybWF0dGVycyB9O1xuXG4vLyBUaGlzIFJlZ0V4cCBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0cyBzZXBhcmF0ZWQgYnkgYHxgOlxuLy8gLSBbeVlRcU1Md0lkRGVjaWhIS2ttc11vIG1hdGNoZXMgYW55IGF2YWlsYWJsZSBvcmRpbmFsIG51bWJlciB0b2tlblxuLy8gICAob25lIG9mIHRoZSBjZXJ0YWluIGxldHRlcnMgZm9sbG93ZWQgYnkgYG9gKVxuLy8gLSAoXFx3KVxcMSogbWF0Y2hlcyBhbnkgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIGxldHRlclxuLy8gLSAnJyBtYXRjaGVzIHR3byBxdW90ZSBjaGFyYWN0ZXJzIGluIGEgcm93XG4vLyAtICcoJyd8W14nXSkrKCd8JCkgbWF0Y2hlcyBhbnl0aGluZyBzdXJyb3VuZGVkIGJ5IHR3byBxdW90ZSBjaGFyYWN0ZXJzICgnKSxcbi8vICAgZXhjZXB0IGEgc2luZ2xlIHF1b3RlIHN5bWJvbCwgd2hpY2ggZW5kcyB0aGUgc2VxdWVuY2UuXG4vLyAgIFR3byBxdW90ZSBjaGFyYWN0ZXJzIGRvIG5vdCBlbmQgdGhlIHNlcXVlbmNlLlxuLy8gICBJZiB0aGVyZSBpcyBubyBtYXRjaGluZyBzaW5nbGUgcXVvdGVcbi8vICAgdGhlbiB0aGUgc2VxdWVuY2Ugd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG4vLyAtIC4gbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlciB1bm1hdGNoZWQgYnkgcHJldmlvdXMgcGFydHMgb2YgdGhlIFJlZ0V4cHNcbmNvbnN0IGZvcm1hdHRpbmdUb2tlbnNSZWdFeHAgPVxuICAvW3lZUXFNTHdJZERlY2loSEtrbXNdb3woXFx3KVxcMSp8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbi8vIFRoaXMgUmVnRXhwIGNhdGNoZXMgc3ltYm9scyBlc2NhcGVkIGJ5IHF1b3RlcywgYW5kIGFsc29cbi8vIHNlcXVlbmNlcyBvZiBzeW1ib2xzIFAsIHAsIGFuZCB0aGUgY29tYmluYXRpb25zIGxpa2UgYFBQUFBQUFBwcHBwcGBcbmNvbnN0IGxvbmdGb3JtYXR0aW5nVG9rZW5zUmVnRXhwID0gL1ArcCt8UCt8cCt8Jyd8JygnJ3xbXiddKSsoJ3wkKXwuL2c7XG5cbmNvbnN0IGVzY2FwZWRTdHJpbmdSZWdFeHAgPSAvXicoW15dKj8pJz8kLztcbmNvbnN0IGRvdWJsZVF1b3RlUmVnRXhwID0gLycnL2c7XG5jb25zdCB1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCA9IC9bYS16QS1aXS87XG5cbmV4cG9ydCB7IGZvcm1hdCBhcyBmb3JtYXREYXRlIH07XG5cbi8qKlxuICogVGhlIHtAbGluayBmb3JtYXR9IGZ1bmN0aW9uIG9wdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAbmFtZSBmb3JtYXRcbiAqIEBhbGlhcyBmb3JtYXREYXRlXG4gKiBAY2F0ZWdvcnkgQ29tbW9uIEhlbHBlcnNcbiAqIEBzdW1tYXJ5IEZvcm1hdCB0aGUgZGF0ZS5cbiAqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHVybiB0aGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nIGluIHRoZSBnaXZlbiBmb3JtYXQuIFRoZSByZXN1bHQgbWF5IHZhcnkgYnkgbG9jYWxlLlxuICpcbiAqID4g4pqg77iPIFBsZWFzZSBub3RlIHRoYXQgdGhlIGBmb3JtYXRgIHRva2VucyBkaWZmZXIgZnJvbSBNb21lbnQuanMgYW5kIG90aGVyIGxpYnJhcmllcy5cbiAqID4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKlxuICogVGhlIGNoYXJhY3RlcnMgd3JhcHBlZCBiZXR3ZWVuIHR3byBzaW5nbGUgcXVvdGVzIGNoYXJhY3RlcnMgKCcpIGFyZSBlc2NhcGVkLlxuICogVHdvIHNpbmdsZSBxdW90ZXMgaW4gYSByb3csIHdoZXRoZXIgaW5zaWRlIG9yIG91dHNpZGUgYSBxdW90ZWQgc2VxdWVuY2UsIHJlcHJlc2VudCBhICdyZWFsJyBzaW5nbGUgcXVvdGUuXG4gKiAoc2VlIHRoZSBsYXN0IGV4YW1wbGUpXG4gKlxuICogRm9ybWF0IG9mIHRoZSBzdHJpbmcgaXMgYmFzZWQgb24gVW5pY29kZSBUZWNobmljYWwgU3RhbmRhcmQgIzM1OlxuICogaHR0cHM6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy90cjM1L3RyMzUtZGF0ZXMuaHRtbCNEYXRlX0ZpZWxkX1N5bWJvbF9UYWJsZVxuICogd2l0aCBhIGZldyBhZGRpdGlvbnMgKHNlZSBub3RlIDcgYmVsb3cgdGhlIHRhYmxlKS5cbiAqXG4gKiBBY2NlcHRlZCBwYXR0ZXJuczpcbiAqIHwgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBhdHRlcm4gfCBSZXN1bHQgZXhhbXBsZXMgICAgICAgICAgICAgICAgICAgfCBOb3RlcyB8XG4gKiB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tfFxuICogfCBFcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRy4uR0dHICB8IEFELCBCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdHR0cgICAgfCBBbm5vIERvbWluaSwgQmVmb3JlIENocmlzdCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHR0dHRyAgIHwgQSwgQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBDYWxlbmRhciB5ZWFyICAgICAgICAgICAgICAgICAgIHwgeSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHlvICAgICAgfCA0NHRoLCAxc3QsIDB0aCwgMTd0aCAgICAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeXl5ICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHl5eXkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5eXl5eSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBMb2NhbCB3ZWVrLW51bWJlcmluZyB5ZWFyICAgICAgIHwgWSAgICAgICB8IDQ0LCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlvICAgICAgfCA0NHRoLCAxc3QsIDE5MDB0aCwgMjAxN3RoICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWSAgICAgIHwgNDQsIDAxLCAwMCwgMTcgICAgICAgICAgICAgICAgICAgIHwgNSw4ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWVlZICAgICB8IDA0NCwgMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFlZWVkgICAgfCAwMDQ0LCAwMDAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgfCA1LDggICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBZWVlZWSAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyw1ICAgfFxuICogfCBJU08gd2Vlay1udW1iZXJpbmcgeWVhciAgICAgICAgIHwgUiAgICAgICB8IC00MywgMCwgMSwgMTkwMCwgMjAxNyAgICAgICAgICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSICAgICAgfCAtNDMsIDAwLCAwMSwgMTkwMCwgMjAxNyAgICAgICAgICAgfCA1LDcgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSUlIgICAgIHwgLTA0MywgMDAwLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgIHwgNSw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUlJSUiAgICB8IC0wMDQzLCAwMDAwLCAwMDAxLCAxOTAwLCAyMDE3ICAgICB8IDUsNyAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJSUlJSICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDUsNyB8XG4gKiB8IEV4dGVuZGVkIHllYXIgICAgICAgICAgICAgICAgICAgfCB1ICAgICAgIHwgLTQzLCAwLCAxLCAxOTAwLCAyMDE3ICAgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXUgICAgICB8IC00MywgMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgICB8IDUgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHV1dSAgICAgfCAtMDQzLCAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgICAgfCA1ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB1dXV1ICAgIHwgLTAwNDMsIDAwMDEsIDE5MDAsIDIwMTcgICAgICAgICAgIHwgNSAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdXV1dXUgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNSAgIHxcbiAqIHwgUXVhcnRlciAoZm9ybWF0dGluZykgICAgICAgICAgICB8IFEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFFRUSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBRUVFRICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUVFRUVEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgUXVhcnRlciAoc3RhbmQtYWxvbmUpICAgICAgICAgICB8IHEgICAgICAgfCAxLCAyLCAzLCA0ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxbyAgICAgIHwgMXN0LCAybmQsIDNyZCwgNHRoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXEgICAgICB8IDAxLCAwMiwgMDMsIDA0ICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHFxcSAgICAgfCBRMSwgUTIsIFEzLCBRNCAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBxcXFxICAgIHwgMXN0IHF1YXJ0ZXIsIDJuZCBxdWFydGVyLCAuLi4gICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcXFxcXEgICB8IDEsIDIsIDMsIDQgICAgICAgICAgICAgICAgICAgICAgICB8IDQgICAgIHxcbiAqIHwgTW9udGggKGZvcm1hdHRpbmcpICAgICAgICAgICAgICB8IE0gICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU0gICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1NTSAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTU1NTU0gICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTW9udGggKHN0YW5kLWFsb25lKSAgICAgICAgICAgICB8IEwgICAgICAgfCAxLCAyLCAuLi4sIDEyICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMTJ0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTEwgICAgICB8IDAxLCAwMiwgLi4uLCAxMiAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgfCBKYW4sIEZlYiwgLi4uLCBEZWMgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMTExMICAgIHwgSmFudWFyeSwgRmVicnVhcnksIC4uLiwgRGVjZW1iZXIgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTExMTEwgICB8IEosIEYsIC4uLiwgRCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgTG9jYWwgd2VlayBvZiB5ZWFyICAgICAgICAgICAgICB8IHcgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB3byAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIHdlZWsgb2YgeWVhciAgICAgICAgICAgICAgICB8IEkgICAgICAgfCAxLCAyLCAuLi4sIDUzICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgNTN0aCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSUkgICAgICB8IDAxLCAwMiwgLi4uLCA1MyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgRGF5IG9mIG1vbnRoICAgICAgICAgICAgICAgICAgICB8IGQgICAgICAgfCAxLCAyLCAuLi4sIDMxICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzFzdCAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICB8IDAxLCAwMiwgLi4uLCAzMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgRGF5IG9mIHllYXIgICAgICAgICAgICAgICAgICAgICB8IEQgICAgICAgfCAxLCAyLCAuLi4sIDM2NSwgMzY2ICAgICAgICAgICAgICAgfCA5ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgMzY1dGgsIDM2NnRoICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgREQgICAgICB8IDAxLCAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgICB8IDkgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERERCAgICAgfCAwMDEsIDAwMiwgLi4uLCAzNjUsIDM2NiAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEREREICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMyAgICAgfFxuICogfCBEYXkgb2Ygd2VlayAoZm9ybWF0dGluZykgICAgICAgIHwgRS4uRUVFICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVFRUUgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFRUVFRSAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgSVNPIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgICB8IGkgICAgICAgfCAxLCAyLCAzLCAuLi4sIDcgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpbyAgICAgIHwgMXN0LCAybmQsIC4uLiwgN3RoICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWkgICAgICB8IDAxLCAwMiwgLi4uLCAwNyAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaSAgICAgfCBNb24sIFR1ZSwgV2VkLCAuLi4sIFN1biAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpaWlpICAgIHwgTW9uZGF5LCBUdWVzZGF5LCAuLi4sIFN1bmRheSAgICAgIHwgMiw3ICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaWlpaWkgICB8IE0sIFQsIFcsIFQsIEYsIFMsIFMgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlpaWlpaSAgfCBNbywgVHUsIFdlLCBUaCwgRnIsIFNhLCBTdSAgICAgICAgfCA3ICAgICB8XG4gKiB8IExvY2FsIGRheSBvZiB3ZWVrIChmb3JtYXR0aW5nKSAgfCBlICAgICAgIHwgMiwgMywgNCwgLi4uLCAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW8gICAgICB8IDJuZCwgM3JkLCAuLi4sIDFzdCAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlICAgICAgfCAwMiwgMDMsIC4uLiwgMDEgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWUgICAgIHwgTW9uLCBUdWUsIFdlZCwgLi4uLCBTdW4gICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZWVlZSAgICB8IE1vbmRheSwgVHVlc2RheSwgLi4uLCBTdW5kYXkgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVlZWVlICAgfCBNLCBULCBXLCBULCBGLCBTLCBTICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlZWVlZWUgIHwgTW8sIFR1LCBXZSwgVGgsIEZyLCBTYSwgU3UgICAgICAgIHwgICAgICAgfFxuICogfCBMb2NhbCBkYXkgb2Ygd2VlayAoc3RhbmQtYWxvbmUpIHwgYyAgICAgICB8IDIsIDMsIDQsIC4uLiwgMSAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNvICAgICAgfCAybmQsIDNyZCwgLi4uLCAxc3QgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjYyAgICAgIHwgMDIsIDAzLCAuLi4sIDAxICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjICAgICB8IE1vbiwgVHVlLCBXZWQsIC4uLiwgU3VuICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGNjY2MgICAgfCBNb25kYXksIFR1ZXNkYXksIC4uLiwgU3VuZGF5ICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjY2NjYyAgIHwgTSwgVCwgVywgVCwgRiwgUywgUyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY2NjY2NjICB8IE1vLCBUdSwgV2UsIFRoLCBGciwgU2EsIFN1ICAgICAgICB8ICAgICAgIHxcbiAqIHwgQU0sIFBNICAgICAgICAgICAgICAgICAgICAgICAgICB8IGEuLmFhICAgfCBBTSwgUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhYWEgICAgIHwgYW0sIHBtICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWFhYSAgICB8IGEubS4sIHAubS4gICAgICAgICAgICAgICAgICAgICAgICB8IDIgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFhYWFhICAgfCBhLCBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8IEFNLCBQTSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgfCBiLi5iYiAgIHwgQU0sIFBNLCBub29uLCBtaWRuaWdodCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYmJiICAgICB8IGFtLCBwbSwgbm9vbiwgbWlkbmlnaHQgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgfCBhLm0uLCBwLm0uLCBub29uLCBtaWRuaWdodCAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBiYmJiYiAgIHwgYSwgcCwgbiwgbWkgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGbGV4aWJsZSBkYXkgcGVyaW9kICAgICAgICAgICAgIHwgQi4uQkJCICB8IGF0IG5pZ2h0LCBpbiB0aGUgbW9ybmluZywgLi4uICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgfCBhdCBuaWdodCwgaW4gdGhlIG1vcm5pbmcsIC4uLiAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCQkJCQiAgIHwgYXQgbmlnaHQsIGluIHRoZSBtb3JuaW5nLCAuLi4gICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTEyXSAgICAgICAgICAgICAgICAgICAgIHwgaCAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDEyICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAxMnRoICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoaCAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAxMiAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTIzXSAgICAgICAgICAgICAgICAgICAgIHwgSCAgICAgICB8IDAsIDEsIDIsIC4uLiwgMjMgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhvICAgICAgfCAwdGgsIDFzdCwgMm5kLCAuLi4sIDIzcmQgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgIHwgMDAsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFswLTExXSAgICAgICAgICAgICAgICAgICAgIHwgSyAgICAgICB8IDEsIDIsIC4uLiwgMTEsIDAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtvICAgICAgfCAxc3QsIDJuZCwgLi4uLCAxMXRoLCAwdGggICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBLSyAgICAgIHwgMDEsIDAyLCAuLi4sIDExLCAwMCAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBIb3VyIFsxLTI0XSAgICAgICAgICAgICAgICAgICAgIHwgayAgICAgICB8IDI0LCAxLCAyLCAuLi4sIDIzICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtvICAgICAgfCAyNHRoLCAxc3QsIDJuZCwgLi4uLCAyM3JkICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBrayAgICAgIHwgMjQsIDAxLCAwMiwgLi4uLCAyMyAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBNaW51dGUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbSAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG1vICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtbSAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBTZWNvbmQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcyAgICAgICB8IDAsIDEsIC4uLiwgNTkgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNvICAgICAgfCAwdGgsIDFzdCwgLi4uLCA1OXRoICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBzcyAgICAgIHwgMDAsIDAxLCAuLi4sIDU5ICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCBGcmFjdGlvbiBvZiBzZWNvbmQgICAgICAgICAgICAgIHwgUyAgICAgICB8IDAsIDEsIC4uLiwgOSAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNTICAgICAgfCAwMCwgMDEsIC4uLiwgOTkgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTU1MgICAgIHwgMDAwLCAwMDEsIC4uLiwgOTk5ICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU1NTUyAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMgICAgIHxcbiAqIHwgVGltZXpvbmUgKElTTy04NjAxIHcvIFopICAgICAgICB8IFggICAgICAgfCAtMDgsICswNTMwLCBaICAgICAgICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWCAgICAgIHwgLTA4MDAsICswNTMwLCBaICAgICAgICAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWFhYICAgICB8IC0wODowMCwgKzA1OjMwLCBaICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFhYWFggICAgfCAtMDgwMCwgKzA1MzAsIFosICsxMjM0NTYgICAgICAgICAgfCAyICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBYWFhYWCAgIHwgLTA4OjAwLCArMDU6MzAsIFosICsxMjozNDo1NiAgICAgIHwgICAgICAgfFxuICogfCBUaW1lem9uZSAoSVNPLTg2MDEgdy9vIFopICAgICAgIHwgeCAgICAgICB8IC0wOCwgKzA1MzAsICswMCAgICAgICAgICAgICAgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4ICAgICAgfCAtMDgwMCwgKzA1MzAsICswMDAwICAgICAgICAgICAgICAgfCAgICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB4eHggICAgIHwgLTA4OjAwLCArMDU6MzAsICswMDowMCAgICAgICAgICAgIHwgMiAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeHh4eCAgICB8IC0wODAwLCArMDUzMCwgKzAwMDAsICsxMjM0NTYgICAgICB8ICAgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHh4eHh4ICAgfCAtMDg6MDAsICswNTozMCwgKzAwOjAwLCArMTI6MzQ6NTYgfCAgICAgICB8XG4gKiB8IFRpbWV6b25lIChHTVQpICAgICAgICAgICAgICAgICAgfCBPLi4uT09PIHwgR01ULTgsIEdNVCs1OjMwLCBHTVQrMCAgICAgICAgICAgIHwgICAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICB8IEdNVC0wODowMCwgR01UKzA1OjMwLCBHTVQrMDA6MDAgICB8IDIgICAgIHxcbiAqIHwgVGltZXpvbmUgKHNwZWNpZmljIG5vbi1sb2NhdC4pICB8IHouLi56enogfCBHTVQtOCwgR01UKzU6MzAsIEdNVCswICAgICAgICAgICAgfCA2ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgIHwgR01ULTA4OjAwLCBHTVQrMDU6MzAsIEdNVCswMDowMCAgIHwgMiw2ICAgfFxuICogfCBTZWNvbmRzIHRpbWVzdGFtcCAgICAgICAgICAgICAgIHwgdCAgICAgICB8IDUxMjk2OTUyMCAgICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHR0ICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLDcgICB8XG4gKiB8IE1pbGxpc2Vjb25kcyB0aW1lc3RhbXAgICAgICAgICAgfCBUICAgICAgIHwgNTEyOTY5NTIwOTAwICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVFQgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMsNyAgIHxcbiAqIHwgTG9uZyBsb2NhbGl6ZWQgZGF0ZSAgICAgICAgICAgICB8IFAgICAgICAgfCAwNC8yOS8xNDUzICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUCAgICAgIHwgQXByIDI5LCAxNDUzICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQICAgICB8IEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQUFAgICAgfCBGcmlkYXksIEFwcmlsIDI5dGgsIDE0NTMgICAgICAgICAgfCAyLDcgICB8XG4gKiB8IExvbmcgbG9jYWxpemVkIHRpbWUgICAgICAgICAgICAgfCBwICAgICAgIHwgMTI6MDAgQU0gICAgICAgICAgICAgICAgICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcHAgICAgICB8IDEyOjAwOjAwIEFNICAgICAgICAgICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHBwcCAgICAgfCAxMjowMDowMCBBTSBHTVQrMiAgICAgICAgICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcHBwICAgIHwgMTI6MDA6MDAgQU0gR01UKzAyOjAwICAgICAgICAgICAgIHwgMiw3ICAgfFxuICogfCBDb21iaW5hdGlvbiBvZiBkYXRlIGFuZCB0aW1lICAgIHwgUHAgICAgICB8IDA0LzI5LzE0NTMsIDEyOjAwIEFNICAgICAgICAgICAgICB8IDcgICAgIHxcbiAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFBQcHAgICAgfCBBcHIgMjksIDE0NTMsIDEyOjAwOjAwIEFNICAgICAgICAgfCA3ICAgICB8XG4gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQUFBwcHAgIHwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICAgICAgICAgIHwgNyAgICAgfFxuICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUFBQUHBwcHB8IEZyaWRheSwgQXByaWwgMjl0aCwgMTQ1MyBhdCAuLi4gICB8IDIsNyAgIHxcbiAqIE5vdGVzOlxuICogMS4gXCJGb3JtYXR0aW5nXCIgdW5pdHMgKGUuZy4gZm9ybWF0dGluZyBxdWFydGVyKSBpbiB0aGUgZGVmYXVsdCBlbi1VUyBsb2NhbGVcbiAqICAgIGFyZSB0aGUgc2FtZSBhcyBcInN0YW5kLWFsb25lXCIgdW5pdHMsIGJ1dCBhcmUgZGlmZmVyZW50IGluIHNvbWUgbGFuZ3VhZ2VzLlxuICogICAgXCJGb3JtYXR0aW5nXCIgdW5pdHMgYXJlIGRlY2xpbmVkIGFjY29yZGluZyB0byB0aGUgcnVsZXMgb2YgdGhlIGxhbmd1YWdlXG4gKiAgICBpbiB0aGUgY29udGV4dCBvZiBhIGRhdGUuIFwiU3RhbmQtYWxvbmVcIiB1bml0cyBhcmUgYWx3YXlzIG5vbWluYXRpdmUgc2luZ3VsYXI6XG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBMTExMJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZCdgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdkbyBNTU1NJywge2xvY2FsZTogY3N9KSAvLz0+ICc2LiBsaXN0b3BhZHUnYFxuICpcbiAqIDIuIEFueSBzZXF1ZW5jZSBvZiB0aGUgaWRlbnRpY2FsIGxldHRlcnMgaXMgYSBwYXR0ZXJuLCB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieVxuICogICAgdGhlIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIChzZWUgYmVsb3cpLlxuICogICAgSWYgdGhlIHNlcXVlbmNlIGlzIGxvbmdlciB0aGFuIGxpc3RlZCBpbiB0YWJsZSAoZS5nLiBgRUVFRUVFRUVFRUVgKVxuICogICAgdGhlIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lIGFzIGRlZmF1bHQgcGF0dGVybiBmb3IgdGhpcyB1bml0LCB1c3VhbGx5XG4gKiAgICB0aGUgbG9uZ2VzdCBvbmUgKGluIGNhc2Ugb2YgSVNPIHdlZWtkYXlzLCBgRUVFRWApLiBEZWZhdWx0IHBhdHRlcm5zIGZvciB1bml0c1xuICogICAgYXJlIG1hcmtlZCB3aXRoIFwiMlwiIGluIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgdGFibGUuXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU0nKSAvLz0+ICdOb3YnYFxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAnTU1NTScpIC8vPT4gJ05vdmVtYmVyJ2BcbiAqXG4gKiAgICBgZm9ybWF0KG5ldyBEYXRlKDIwMTcsIDEwLCA2KSwgJ01NTU1NJykgLy89PiAnTidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU0nKSAvLz0+ICdOb3ZlbWJlcidgXG4gKlxuICogICAgYGZvcm1hdChuZXcgRGF0ZSgyMDE3LCAxMCwgNiksICdNTU1NTU1NJykgLy89PiAnTm92ZW1iZXInYFxuICpcbiAqIDMuIFNvbWUgcGF0dGVybnMgY291bGQgYmUgdW5saW1pdGVkIGxlbmd0aCAoc3VjaCBhcyBgeXl5eXl5eXlgKS5cbiAqICAgIFRoZSBvdXRwdXQgd2lsbCBiZSBwYWRkZWQgd2l0aCB6ZXJvcyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBwYXR0ZXJuLlxuICpcbiAqICAgIGBmb3JtYXQobmV3IERhdGUoMjAxNywgMTAsIDYpLCAneXl5eXl5eXknKSAvLz0+ICcwMDAwMjAxNydgXG4gKlxuICogNC4gYFFRUVFRYCBhbmQgYHFxcXFxYCBjb3VsZCBiZSBub3Qgc3RyaWN0bHkgbnVtZXJpY2FsIGluIHNvbWUgbG9jYWxlcy5cbiAqICAgIFRoZXNlIHRva2VucyByZXByZXNlbnQgdGhlIHNob3J0ZXN0IGZvcm0gb2YgdGhlIHF1YXJ0ZXIuXG4gKlxuICogNS4gVGhlIG1haW4gZGlmZmVyZW5jZSBiZXR3ZWVuIGB5YCBhbmQgYHVgIHBhdHRlcm5zIGFyZSBCLkMuIHllYXJzOlxuICpcbiAqICAgIHwgWWVhciB8IGB5YCB8IGB1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tfC0tLS0tfFxuICogICAgfCBBQyAxIHwgICAxIHwgICAxIHxcbiAqICAgIHwgQkMgMSB8ICAgMSB8ICAgMCB8XG4gKiAgICB8IEJDIDIgfCAgIDIgfCAgLTEgfFxuICpcbiAqICAgIEFsc28gYHl5YCBhbHdheXMgcmV0dXJucyB0aGUgbGFzdCB0d28gZGlnaXRzIG9mIGEgeWVhcixcbiAqICAgIHdoaWxlIGB1dWAgcGFkcyBzaW5nbGUgZGlnaXQgeWVhcnMgdG8gMiBjaGFyYWN0ZXJzIGFuZCByZXR1cm5zIG90aGVyIHllYXJzIHVuY2hhbmdlZDpcbiAqXG4gKiAgICB8IFllYXIgfCBgeXlgIHwgYHV1YCB8XG4gKiAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS18XG4gKiAgICB8IDEgICAgfCAgIDAxIHwgICAwMSB8XG4gKiAgICB8IDE0ICAgfCAgIDE0IHwgICAxNCB8XG4gKiAgICB8IDM3NiAgfCAgIDc2IHwgIDM3NiB8XG4gKiAgICB8IDE0NTMgfCAgIDUzIHwgMTQ1MyB8XG4gKlxuICogICAgVGhlIHNhbWUgZGlmZmVyZW5jZSBpcyB0cnVlIGZvciBsb2NhbCBhbmQgSVNPIHdlZWstbnVtYmVyaW5nIHllYXJzIChgWWAgYW5kIGBSYCksXG4gKiAgICBleGNlcHQgbG9jYWwgd2Vlay1udW1iZXJpbmcgeWVhcnMgYXJlIGRlcGVuZGVudCBvbiBgb3B0aW9ucy53ZWVrU3RhcnRzT25gXG4gKiAgICBhbmQgYG9wdGlvbnMuZmlyc3RXZWVrQ29udGFpbnNEYXRlYCAoY29tcGFyZSBbZ2V0SVNPV2Vla1llYXJdKGh0dHBzOi8vZGF0ZS1mbnMub3JnL2RvY3MvZ2V0SVNPV2Vla1llYXIpXG4gKiAgICBhbmQgW2dldFdlZWtZZWFyXShodHRwczovL2RhdGUtZm5zLm9yZy9kb2NzL2dldFdlZWtZZWFyKSkuXG4gKlxuICogNi4gU3BlY2lmaWMgbm9uLWxvY2F0aW9uIHRpbWV6b25lcyBhcmUgY3VycmVudGx5IHVuYXZhaWxhYmxlIGluIGBkYXRlLWZuc2AsXG4gKiAgICBzbyByaWdodCBub3cgdGhlc2UgdG9rZW5zIGZhbGwgYmFjayB0byBHTVQgdGltZXpvbmVzLlxuICpcbiAqIDcuIFRoZXNlIHBhdHRlcm5zIGFyZSBub3QgaW4gdGhlIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNTpcbiAqICAgIC0gYGlgOiBJU08gZGF5IG9mIHdlZWtcbiAqICAgIC0gYElgOiBJU08gd2VlayBvZiB5ZWFyXG4gKiAgICAtIGBSYDogSVNPIHdlZWstbnVtYmVyaW5nIHllYXJcbiAqICAgIC0gYHRgOiBzZWNvbmRzIHRpbWVzdGFtcFxuICogICAgLSBgVGA6IG1pbGxpc2Vjb25kcyB0aW1lc3RhbXBcbiAqICAgIC0gYG9gOiBvcmRpbmFsIG51bWJlciBtb2RpZmllclxuICogICAgLSBgUGA6IGxvbmcgbG9jYWxpemVkIGRhdGVcbiAqICAgIC0gYHBgOiBsb25nIGxvY2FsaXplZCB0aW1lXG4gKlxuICogOC4gYFlZYCBhbmQgYFlZWVlgIHRva2VucyByZXByZXNlbnQgd2Vlay1udW1iZXJpbmcgeWVhcnMgYnV0IHRoZXkgYXJlIG9mdGVuIGNvbmZ1c2VkIHdpdGggeWVhcnMuXG4gKiAgICBZb3Ugc2hvdWxkIGVuYWJsZSBgb3B0aW9ucy51c2VBZGRpdGlvbmFsV2Vla1llYXJUb2tlbnNgIHRvIHVzZSB0aGVtLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqXG4gKiA5LiBgRGAgYW5kIGBERGAgdG9rZW5zIHJlcHJlc2VudCBkYXlzIG9mIHRoZSB5ZWFyIGJ1dCB0aGV5IGFyZSBvZnRlbiBjb25mdXNlZCB3aXRoIGRheXMgb2YgdGhlIG1vbnRoLlxuICogICAgWW91IHNob3VsZCBlbmFibGUgYG9wdGlvbnMudXNlQWRkaXRpb25hbERheU9mWWVhclRva2Vuc2AgdG8gdXNlIHRoZW0uIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2RhdGUtZm5zL2RhdGUtZm5zL2Jsb2IvbWFzdGVyL2RvY3MvdW5pY29kZVRva2Vucy5tZFxuICpcbiAqIEBwYXJhbSBkYXRlIC0gVGhlIG9yaWdpbmFsIGRhdGVcbiAqIEBwYXJhbSBmb3JtYXQgLSBUaGUgc3RyaW5nIG9mIHRva2Vuc1xuICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvYmplY3Qgd2l0aCBvcHRpb25zXG4gKlxuICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBkYXRlIHN0cmluZ1xuICpcbiAqIEB0aHJvd3MgYGRhdGVgIG11c3Qgbm90IGJlIEludmFsaWQgRGF0ZVxuICogQHRocm93cyBgb3B0aW9ucy5sb2NhbGVgIG11c3QgY29udGFpbiBgbG9jYWxpemVgIHByb3BlcnR5XG4gKiBAdGhyb3dzIGBvcHRpb25zLmxvY2FsZWAgbXVzdCBjb250YWluIGBmb3JtYXRMb25nYCBwcm9wZXJ0eVxuICogQHRocm93cyB1c2UgYHl5eXlgIGluc3RlYWQgb2YgYFlZWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGB5eWAgaW5zdGVhZCBvZiBgWVlgIGZvciBmb3JtYXR0aW5nIHllYXJzIHVzaW5nIFtmb3JtYXQgcHJvdmlkZWRdIHRvIHRoZSBpbnB1dCBbaW5wdXQgcHJvdmlkZWRdOyBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRlLWZucy9kYXRlLWZucy9ibG9iL21hc3Rlci9kb2NzL3VuaWNvZGVUb2tlbnMubWRcbiAqIEB0aHJvd3MgdXNlIGBkYCBpbnN0ZWFkIG9mIGBEYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIHVzZSBgZGRgIGluc3RlYWQgb2YgYEREYCBmb3IgZm9ybWF0dGluZyBkYXlzIG9mIHRoZSBtb250aCB1c2luZyBbZm9ybWF0IHByb3ZpZGVkXSB0byB0aGUgaW5wdXQgW2lucHV0IHByb3ZpZGVkXTsgc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGF0ZS1mbnMvZGF0ZS1mbnMvYmxvYi9tYXN0ZXIvZG9jcy91bmljb2RlVG9rZW5zLm1kXG4gKiBAdGhyb3dzIGZvcm1hdCBzdHJpbmcgY29udGFpbnMgYW4gdW5lc2NhcGVkIGxhdGluIGFscGhhYmV0IGNoYXJhY3RlclxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZXByZXNlbnQgMTEgRmVicnVhcnkgMjAxNCBpbiBtaWRkbGUtZW5kaWFuIGZvcm1hdDpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCAxLCAxMSksICdNTS9kZC95eXl5JylcbiAqIC8vPT4gJzAyLzExLzIwMTQnXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlcHJlc2VudCAyIEp1bHkgMjAxNCBpbiBFc3BlcmFudG86XG4gKiBpbXBvcnQgeyBlb0xvY2FsZSB9IGZyb20gJ2RhdGUtZm5zL2xvY2FsZS9lbydcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyKSwgXCJkbyAnZGUnIE1NTU0geXl5eVwiLCB7XG4gKiAgIGxvY2FsZTogZW9Mb2NhbGVcbiAqIH0pXG4gKiAvLz0+ICcyLWEgZGUganVsaW8gMjAxNCdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXNjYXBlIHN0cmluZyBieSBzaW5nbGUgcXVvdGUgY2hhcmFjdGVyczpcbiAqIGNvbnN0IHJlc3VsdCA9IGZvcm1hdChuZXcgRGF0ZSgyMDE0LCA2LCAyLCAxNSksIFwiaCAnbycnY2xvY2snXCIpXG4gKiAvLz0+IFwiMyBvJ2Nsb2NrXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdChkYXRlLCBmb3JtYXRTdHIsIG9wdGlvbnMpIHtcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXREZWZhdWx0T3B0aW9ucygpO1xuICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgPz8gZGVmYXVsdE9wdGlvbnMubG9jYWxlID8/IGRlZmF1bHRMb2NhbGU7XG5cbiAgY29uc3QgZmlyc3RXZWVrQ29udGFpbnNEYXRlID1cbiAgICBvcHRpb25zPy5maXJzdFdlZWtDb250YWluc0RhdGUgPz9cbiAgICBvcHRpb25zPy5sb2NhbGU/Lm9wdGlvbnM/LmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmZpcnN0V2Vla0NvbnRhaW5zRGF0ZSA/P1xuICAgIGRlZmF1bHRPcHRpb25zLmxvY2FsZT8ub3B0aW9ucz8uZmlyc3RXZWVrQ29udGFpbnNEYXRlID8/XG4gICAgMTtcblxuICBjb25zdCB3ZWVrU3RhcnRzT24gPVxuICAgIG9wdGlvbnM/LndlZWtTdGFydHNPbiA/P1xuICAgIG9wdGlvbnM/LmxvY2FsZT8ub3B0aW9ucz8ud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMud2Vla1N0YXJ0c09uID8/XG4gICAgZGVmYXVsdE9wdGlvbnMubG9jYWxlPy5vcHRpb25zPy53ZWVrU3RhcnRzT24gPz9cbiAgICAwO1xuXG4gIGNvbnN0IG9yaWdpbmFsRGF0ZSA9IHRvRGF0ZShkYXRlLCBvcHRpb25zPy5pbik7XG5cbiAgaWYgKCFpc1ZhbGlkKG9yaWdpbmFsRGF0ZSkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgdGltZSB2YWx1ZVwiKTtcbiAgfVxuXG4gIGxldCBwYXJ0cyA9IGZvcm1hdFN0clxuICAgIC5tYXRjaChsb25nRm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcInBcIiB8fCBmaXJzdENoYXJhY3RlciA9PT0gXCJQXCIpIHtcbiAgICAgICAgY29uc3QgbG9uZ0Zvcm1hdHRlciA9IGxvbmdGb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXTtcbiAgICAgICAgcmV0dXJuIGxvbmdGb3JtYXR0ZXIoc3Vic3RyaW5nLCBsb2NhbGUuZm9ybWF0TG9uZyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3Vic3RyaW5nO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcIilcbiAgICAubWF0Y2goZm9ybWF0dGluZ1Rva2Vuc1JlZ0V4cClcbiAgICAubWFwKChzdWJzdHJpbmcpID0+IHtcbiAgICAgIC8vIFJlcGxhY2UgdHdvIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJzIHdpdGggb25lIHNpbmdsZSBxdW90ZSBjaGFyYWN0ZXJcbiAgICAgIGlmIChzdWJzdHJpbmcgPT09IFwiJydcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IFwiJ1wiIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpcnN0Q2hhcmFjdGVyID0gc3Vic3RyaW5nWzBdO1xuICAgICAgaWYgKGZpcnN0Q2hhcmFjdGVyID09PSBcIidcIikge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IGNsZWFuRXNjYXBlZFN0cmluZyhzdWJzdHJpbmcpIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmb3JtYXR0ZXJzW2ZpcnN0Q2hhcmFjdGVyXSkge1xuICAgICAgICByZXR1cm4geyBpc1Rva2VuOiB0cnVlLCB2YWx1ZTogc3Vic3RyaW5nIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChmaXJzdENoYXJhY3Rlci5tYXRjaCh1bmVzY2FwZWRMYXRpbkNoYXJhY3RlclJlZ0V4cCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgXCJGb3JtYXQgc3RyaW5nIGNvbnRhaW5zIGFuIHVuZXNjYXBlZCBsYXRpbiBhbHBoYWJldCBjaGFyYWN0ZXIgYFwiICtcbiAgICAgICAgICAgIGZpcnN0Q2hhcmFjdGVyICtcbiAgICAgICAgICAgIFwiYFwiLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyBpc1Rva2VuOiBmYWxzZSwgdmFsdWU6IHN1YnN0cmluZyB9O1xuICAgIH0pO1xuXG4gIC8vIGludm9rZSBsb2NhbGl6ZSBwcmVwcm9jZXNzb3IgKG9ubHkgZm9yIGZyZW5jaCBsb2NhbGVzIGF0IHRoZSBtb21lbnQpXG4gIGlmIChsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKSB7XG4gICAgcGFydHMgPSBsb2NhbGUubG9jYWxpemUucHJlcHJvY2Vzc29yKG9yaWdpbmFsRGF0ZSwgcGFydHMpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0dGVyT3B0aW9ucyA9IHtcbiAgICBmaXJzdFdlZWtDb250YWluc0RhdGUsXG4gICAgd2Vla1N0YXJ0c09uLFxuICAgIGxvY2FsZSxcbiAgfTtcblxuICByZXR1cm4gcGFydHNcbiAgICAubWFwKChwYXJ0KSA9PiB7XG4gICAgICBpZiAoIXBhcnQuaXNUb2tlbikgcmV0dXJuIHBhcnQudmFsdWU7XG5cbiAgICAgIGNvbnN0IHRva2VuID0gcGFydC52YWx1ZTtcblxuICAgICAgaWYgKFxuICAgICAgICAoIW9wdGlvbnM/LnVzZUFkZGl0aW9uYWxXZWVrWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkV2Vla1llYXJUb2tlbih0b2tlbikpIHx8XG4gICAgICAgICghb3B0aW9ucz8udXNlQWRkaXRpb25hbERheU9mWWVhclRva2VucyAmJlxuICAgICAgICAgIGlzUHJvdGVjdGVkRGF5T2ZZZWFyVG9rZW4odG9rZW4pKVxuICAgICAgKSB7XG4gICAgICAgIHdhcm5PclRocm93UHJvdGVjdGVkRXJyb3IodG9rZW4sIGZvcm1hdFN0ciwgU3RyaW5nKGRhdGUpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0dGVyID0gZm9ybWF0dGVyc1t0b2tlblswXV07XG4gICAgICByZXR1cm4gZm9ybWF0dGVyKG9yaWdpbmFsRGF0ZSwgdG9rZW4sIGxvY2FsZS5sb2NhbGl6ZSwgZm9ybWF0dGVyT3B0aW9ucyk7XG4gICAgfSlcbiAgICAuam9pbihcIlwiKTtcbn1cblxuZnVuY3Rpb24gY2xlYW5Fc2NhcGVkU3RyaW5nKGlucHV0KSB7XG4gIGNvbnN0IG1hdGNoZWQgPSBpbnB1dC5tYXRjaChlc2NhcGVkU3RyaW5nUmVnRXhwKTtcblxuICBpZiAoIW1hdGNoZWQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICByZXR1cm4gbWF0Y2hlZFsxXS5yZXBsYWNlKGRvdWJsZVF1b3RlUmVnRXhwLCBcIidcIik7XG59XG5cbi8vIEZhbGxiYWNrIGZvciBtb2R1bGFyaXplZCBpbXBvcnRzOlxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0O1xuIiwKICAgICJpbXBvcnQgdHlwZSB7IExvZywgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IFRTT04gfSBmcm9tIFwiQHNvdXRoZXJuLWF1cm9yYS90c29uXCI7XG5cbmludGVyZmFjZSBDb29rYm9va0V2ZW50IHtcbiAgdHlwZTogXCJtaWxraW9AbG9nZ2VyXCI7XG4gIGxvZzogTG9nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VuZENvb2tib29rRXZlbnQocnVudGltZTogTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvSW5pdD4sIGV2ZW50OiBDb29rYm9va0V2ZW50KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDoke3J1bnRpbWUuY29va2Jvb2suY29va2Jvb2tQb3J0fS8kYWN0aW9uYCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICB9LFxuICAgICAgYm9keTogVFNPTi5zdHJpbmdpZnkoZXZlbnQpLFxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW0NPT0tCT09LXVwiLCBhd2FpdCByZXNwb25zZS50ZXh0KCkpO1xuICAgICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIFwiSXMgQ29va2Jvb2sgY2xvc2VkPyBUaGVyZSBpcyBhbiBhYm5vcm1hbGl0eSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIENvb2tib29rLlwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coXCJbQ09PS0JPT0tdXCIsIGVycm9yKTtcbiAgICBjb25zb2xlLmxvZyhcIltDT09LQk9PS11cIiwgXCJJcyBDb29rYm9vayBjbG9zZWQ/IFRoZXJlIGlzIGFuIGFibm9ybWFsaXR5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggQ29va2Jvb2suXCIpO1xuICB9XG59XG4iLAogICAgImltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJkYXRlLWZuc1wiO1xuaW1wb3J0IHR5cGUgeyAkY29udGV4dCwgTWlsa2lvSW5pdCwgTWlsa2lvUnVudGltZUluaXQgfSBmcm9tIFwiLi4vaW5kZXgudHNcIjtcbmltcG9ydCB7IHNlbmRDb29rYm9va0V2ZW50IH0gZnJvbSBcIi4uL3V0aWxzL3NlbmQtY29va2Jvb2stZXZlbnQudHNcIjtcblxuZXhwb3J0IHR5cGUgTG9nID0gW1wiW0RFQlVHXVwiIHwgXCJbSU5GT11cIiB8IFwiW1dBUk5dXCIgfCBcIltFUlJPUl1cIiB8IFwiW1JFUVVFU1RdXCIgfCBcIltSRVNQT05TRV1cIiwgc3RyaW5nIC8qIGV4ZWN1dGVJZCAqLywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgLi4uQXJyYXk8dW5rbm93bj5dO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gIF86IHtcbiAgICBsb2dzOiBBcnJheTxMb2c+O1xuICAgIHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN1Ym1pdDogKGNvbnRleHQ6ICRjb250ZXh0KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbiAgfTtcbiAgc2V0VGFnOiAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiB2b2lkO1xuICBzZXRMb2c6ICguLi5sb2c6IExvZykgPT4gdm9pZDtcbiAgZGVidWc6IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gIGluZm86IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gIHdhcm46IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBMb2c7XG4gIGVycm9yOiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICByZXF1ZXN0OiAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gTG9nO1xuICByZXNwb25zZTogKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IExvZztcbn1cblxuZXhwb3J0IHR5cGUgTG9nZ2VySW5zZXJ0aW5nSGFuZGxlciA9IChsb2c6IExvZykgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgTG9nZ2VyU3VibWl0dGluZ0hhbmRsZXIgPSAoY29udGV4dDogJGNvbnRleHQsIGxvZ3M6IEFycmF5PExvZz4sIHRhZ3M6IE1hcDxzdHJpbmcsIHVua25vd24+KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxvZ2dlcjxNaWxraW9SdW50aW1lIGV4dGVuZHMgTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvUnVudGltZUluaXQ8TWlsa2lvSW5pdD4+ID0gTWlsa2lvUnVudGltZUluaXQ8TWlsa2lvSW5pdD4+KHJ1bnRpbWU6IE1pbGtpb1J1bnRpbWUsIHBhdGg6IHN0cmluZywgZXhlY3V0ZUlkOiBzdHJpbmcpOiBMb2dnZXIge1xuICBjb25zdCBsb2dnZXIgPSB7fSBhcyBMb2dnZXI7XG5cbiAgbG9nZ2VyLl8gPSB7XG4gICAgbG9nczogW10sXG4gICAgdGFnczogbmV3IE1hcCgpLFxuICAgIHN1Ym1pdDogKGNvbnRleHQ6ICRjb250ZXh0KSA9PiB7XG4gICAgICBpZiAoIXJ1bnRpbWUub25Mb2dnZXJTdWJtaXR0aW5nKSByZXR1cm47XG4gICAgICByZXR1cm4gcnVudGltZS5vbkxvZ2dlclN1Ym1pdHRpbmcoY29udGV4dCwgbG9nZ2VyLl8ubG9ncywgbG9nZ2VyLl8udGFncyk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBfX3RhZ1B1c2ggPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgbG9nZ2VyLl8udGFncy5zZXQoa2V5LCB2YWx1ZSk7XG4gIH07XG4gIGNvbnN0IF9fbG9nUHVzaCA9IChsb2c6IExvZyk6IExvZyA9PiB7XG4gICAgY29uc3QgaW5zZXJ0aW5nID0gcnVudGltZS5vbkxvZ2dlckluc2VydGluZ1xuICAgICAgPyBydW50aW1lLm9uTG9nZ2VySW5zZXJ0aW5nXG4gICAgICA6IChsb2c6IExvZykgPT4ge1xuICAgICAgICAgIGxvZyA9IFsuLi5sb2ddO1xuICAgICAgICAgIGxvZ1swXSA9IGBcXG4ke2xvZ1swXX1gIGFzIGFueTtcbiAgICAgICAgICBjb25zb2xlLmxvZyguLi5sb2cpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9O1xuXG4gICAgaWYgKCFpbnNlcnRpbmcobG9nKSkgcmV0dXJuIGxvZztcblxuICAgIGxvZ2dlci5fLmxvZ3MucHVzaChbLi4ubG9nXSk7XG4gICAgaWYgKHJ1bnRpbWUuZGV2ZWxvcCkge1xuICAgICAgdm9pZCBzZW5kQ29va2Jvb2tFdmVudChydW50aW1lLCB7XG4gICAgICAgIHR5cGU6IFwibWlsa2lvQGxvZ2dlclwiLFxuICAgICAgICBsb2csXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nO1xuICB9O1xuXG4gIGxvZ2dlci5zZXRUYWcgPSAoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSA9PiBfX3RhZ1B1c2goa2V5LCB2YWx1ZSk7XG4gIGxvZ2dlci5zZXRMb2cgPSAoLi4ubG9nOiBMb2cpID0+IF9fbG9nUHVzaChsb2cpO1xuXG4gIGNvbnN0IGdldE5vdyA9ICgpID0+IGAke2Zvcm1hdChuZXcgRGF0ZSgpLCBcIih5eXl5LU1NLWRkIGhoOm1tOnNzKVwiKX1gO1xuXG4gIGxvZ2dlci5kZWJ1ZyA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiW0RFQlVHXVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgbG9nZ2VyLmluZm8gPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIltJTkZPXVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgbG9nZ2VyLndhcm4gPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIltXQVJOXVwiLCBwYXRoLCBleGVjdXRlSWQsIGdldE5vdygpLCBgXFxuJHtkZXNjcmlwdGlvbn1gLCAuLi5wYXJhbXNdKTtcbiAgbG9nZ2VyLmVycm9yID0gKGRlc2NyaXB0aW9uOiBzdHJpbmcsIC4uLnBhcmFtczogQXJyYXk8dW5rbm93bj4pID0+IF9fbG9nUHVzaChbXCJbRVJST1JdXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICBsb2dnZXIucmVxdWVzdCA9IChkZXNjcmlwdGlvbjogc3RyaW5nLCAuLi5wYXJhbXM6IEFycmF5PHVua25vd24+KSA9PiBfX2xvZ1B1c2goW1wiW1JFUVVFU1RdXCIsIHBhdGgsIGV4ZWN1dGVJZCwgZ2V0Tm93KCksIGBcXG4ke2Rlc2NyaXB0aW9ufWAsIC4uLnBhcmFtc10pO1xuICBsb2dnZXIucmVzcG9uc2UgPSAoZGVzY3JpcHRpb246IHN0cmluZywgLi4ucGFyYW1zOiBBcnJheTx1bmtub3duPikgPT4gX19sb2dQdXNoKFtcIltSRVNQT05TRV1cIiwgcGF0aCwgZXhlY3V0ZUlkLCBnZXROb3coKSwgYFxcbiR7ZGVzY3JpcHRpb259YCwgLi4ucGFyYW1zXSk7XG5cbiAgcmV0dXJuIGxvZ2dlcjtcbn1cbiIsCiAgICAiZXhwb3J0IGludGVyZmFjZSBTdGVwczxTdGFnZVQgZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PiB7XG4gIHN0ZXA6IFN0ZXBGdW5jdGlvbjxTdGFnZVQ+O1xuICBydW46ICgpID0+IFByb21pc2U8UmVtb3ZlXzxTdGFnZVQ+Pjtcbn1cblxudHlwZSBSZW1vdmVfPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUIGFzIEsgZXh0ZW5kcyBgXyR7c3RyaW5nfWAgPyBuZXZlciA6IEtdOiBUW0tdO1xufTtcblxudHlwZSBUb0VtcHR5T2JqZWN0PFQ+ID0gVCBleHRlbmRzIHVuZGVmaW5lZCB8IG51bGwgfCBuZXZlciA/IHt9IDogVCBleHRlbmRzIG9iamVjdCA/IFQgOiB7fTtcblxuZXhwb3J0IHR5cGUgU3RlcEZ1bmN0aW9uPFN0YWdlVCBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+ID0gPEhhbmRsZXJUIGV4dGVuZHMgKHN0YWdlOiBSZWFkb25seTxTdGFnZVQ+KSA9PiBSZWNvcmQ8YW55LCBhbnk+IHwgUHJvbWlzZTxSZWNvcmQ8YW55LCBhbnk+Pj4oaGFuZGxlcjogSGFuZGxlclQpID0+IFN0ZXBzPEF3YWl0ZWQ8U3RhZ2VUPiAmIFRvRW1wdHlPYmplY3Q8QXdhaXRlZDxSZXR1cm5UeXBlPEhhbmRsZXJUPj4+PjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0ZXAoKTogU3RlcHM8e30+IHtcbiAgY29uc3Qgc3RlcENvbnRyb2xsZXIgPSB7XG4gICAgJG1pbGtpb1R5cGU6IFwic3RlcFwiLFxuICAgIF9zdGVwczogW10gYXMgQXJyYXk8KHN0YWdlOiBhbnkpID0+IFByb21pc2U8YW55Pj4sXG4gICAgc3RlcChoYW5kbGVyOiAoc3RhZ2U6IGFueSkgPT4gUHJvbWlzZTxhbnk+KSB7XG4gICAgICBzdGVwQ29udHJvbGxlci5fc3RlcHMucHVzaChoYW5kbGVyKTtcbiAgICAgIHJldHVybiBzdGVwQ29udHJvbGxlcjtcbiAgICB9LFxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgIGxldCBzdGFnZSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBzdGVwIG9mIHN0ZXBDb250cm9sbGVyLl9zdGVwcykge1xuICAgICAgICBzdGFnZSA9IHsgLi4uc3RhZ2UsIC4uLihhd2FpdCBzdGVwKHN0YWdlKSkgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdDogUmVjb3JkPGFueSwgYW55PiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RhZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAoc3RhZ2UgYXMgYW55KVtrZXldO1xuICAgICAgICBpZiAoIWtleS5zdGFydHNXaXRoKFwiX1wiKSkgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN0ZXBDb250cm9sbGVyIGFzIGFueSBhcyBTdGVwczx7fT47XG59XG4iLAogICAgImV4cG9ydCBjbGFzcyBUcmllPFQ+IHtcclxuICBwcml2YXRlIHJvb3Q6IFRyaWVOb2RlPFQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMucm9vdCA9IG5ldyBUcmllTm9kZSgpO1xyXG4gIH1cclxuXHJcbiAgYWRkKHBhdGg6IHN0cmluZywgdmFsdWU6IFQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHtcclxuICAgICAgY3VycmVudE5vZGUudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XHJcbiAgICAgIGlmICghY3VycmVudE5vZGUuY2hpbGRyZW4uaGFzKHBhcnQpKSB7XHJcbiAgICAgICAgY3VycmVudE5vZGUuY2hpbGRyZW4uc2V0KHBhcnQsIG5ldyBUcmllTm9kZSgpKTtcclxuICAgICAgfVxyXG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLmNoaWxkcmVuLmdldChwYXJ0KSE7XHJcbiAgICB9XHJcbiAgICBjdXJyZW50Tm9kZS52YWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0KHBhdGg6IHN0cmluZyk6IFQgfCBudWxsIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xyXG4gICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkgcmV0dXJuIG51bGw7XHJcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZTtcclxuICB9XHJcblxyXG4gIGhhcyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IHBhcnRzID0gcGF0aFxyXG4gICAgICAucmVwbGFjZSgvXlxcLyt8XFwvKyQvZywgXCJcIilcclxuICAgICAgLnNwbGl0KFwiL1wiKVxyXG4gICAgICAuZmlsdGVyKChwKSA9PiBwICE9PSBcIlwiKTtcclxuICAgIGxldCBjdXJyZW50Tm9kZSA9IHRoaXMucm9vdDtcclxuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSAhPT0gbnVsbDtcclxuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xyXG4gICAgICBpZiAoIWN1cnJlbnROb2RlLmNoaWxkcmVuLmhhcyhwYXJ0KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICBlbHNlIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpITtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50Tm9kZS52YWx1ZSAhPT0gbnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmNsYXNzIFRyaWVOb2RlPFQ+IHtcclxuICBjaGlsZHJlbjogTWFwPHN0cmluZywgVHJpZU5vZGU8VD4+O1xyXG4gIHZhbHVlOiBUIHwgbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLmNoaWxkcmVuID0gbmV3IE1hcCgpO1xyXG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgfVxyXG59XHJcbiIsCiAgICAiaW1wb3J0IHsgVFNPTiB9IGZyb20gXCJAc291dGhlcm4tYXVyb3JhL3Rzb25cIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgZXhjZXB0aW9uSGFuZGxlciwgcmVqZWN0IH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IE1peGluLCBHZW5lcmF0ZWRJbml0LCAkdHlwZXMsIENvbnRleHRIdHRwLCBNaWxraW9SZXNwb25zZVJlamVjdCwgUmVzdWx0cywgTWlsa2lvUmVzcG9uc2VTdWNjZXNzIH0gZnJvbSBcIi4uL2luZGV4LnRzXCI7XG5pbXBvcnQgdHlwZSB7IF9faW5pdEV4ZWN1dGVyIH0gZnJvbSBcIi4uL2V4ZWN1dGUvaW5kZXgudHNcIjtcbmltcG9ydCB7IF9fY3JlYXRlSWQgfSBmcm9tIFwiLi4vdXRpbHMvY3JlYXRlLWlkLnRzXCI7XG5pbXBvcnQgeyBUcmllIH0gZnJvbSBcIi4uL3V0aWxzL3RyaWUudHNcIjtcblxuZXhwb3J0IHR5cGUgTWlsa2lvSHR0cFJlcXVlc3QgPSBSZXF1ZXN0O1xuXG5leHBvcnQgdHlwZSBNaWxraW9IdHRwUmVzcG9uc2UgPSBNaXhpbjxcbiAgUmVzcG9uc2VJbml0LFxuICB7XG4gICAgLy8gYm9keTogc3RyaW5nIHwgQmxvYiB8IEZvcm1EYXRhIHwgVVJMU2VhcmNoUGFyYW1zIHwgUmVhZGFibGVTdHJlYW08VWludDhBcnJheT47XG4gICAgYm9keTogYW55O1xuICAgIHN0YXR1czogbnVtYmVyO1xuICAgIGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIH1cbj47XG5cbmV4cG9ydCBmdW5jdGlvbiBfX2luaXRMaXN0ZW5lcihnZW5lcmF0ZWQ6IEdlbmVyYXRlZEluaXQsIHJ1bnRpbWU6IGFueSwgZXhlY3V0ZXI6IFJldHVyblR5cGU8dHlwZW9mIF9faW5pdEV4ZWN1dGVyPikge1xuICBjb25zdCBwb3J0ID0gcnVudGltZS5wb3J0O1xuICBjb25zdCB0cmllID0gbmV3IFRyaWU8YW55PigpO1xuICBjb25zdCBmZXRjaCA9IGFzeW5jIChvcHRpb25zOiB7XG4gICAgcmVxdWVzdDogTWlsa2lvSHR0cFJlcXVlc3Q7XG4gICAgZW52TW9kZT86IHN0cmluZztcbiAgICBlbnY/OiBSZWNvcmQ8YW55LCBhbnk+O1xuICAgIHJvdXRlU2NoZW1hPzogYW55O1xuICB9KTogUHJvbWlzZTxSZXNwb25zZT4gPT4ge1xuICAgIGlmIChvcHRpb25zLnJlcXVlc3QubWV0aG9kID09PSBcIk9QVElPTlNcIikge1xuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSh1bmRlZmluZWQsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd01ldGhvZHMgPz8gXCIqXCIsXG4gICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dPcmlnaW4gPz8gXCIqXCIsXG4gICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93SGVhZGVycyA/PyBcIipcIixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnJlcXVlc3QudXJsLmVuZHNXaXRoKFwiL2dlbmVyYXRlXzIwNFwiKSkge1xuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShudWxsLCB7XG4gICAgICAgIHN0YXR1czogMjA0LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93TWV0aG9kcyA/PyBcIipcIixcbiAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpblwiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd09yaWdpbiA/PyBcIipcIixcbiAgICAgICAgICBcIkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnNcIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dIZWFkZXJzID8/IFwiKlwiLFxuICAgICAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIsXG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogYHRleHQvcGxhaW47IHRpbWU9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMucmVxdWVzdC51cmwpO1xuICAgIGxldCBwYXRoQXJyYXkgPSB1cmwucGF0aG5hbWUuc3Vic3RyaW5nKDEpLnNwbGl0KFwiL1wiKTtcbiAgICBpZiAocnVudGltZS5pZ25vcmVQYXRoTGV2ZWwgIT09IHVuZGVmaW5lZCAmJiBydW50aW1lLmlnbm9yZVBhdGhMZXZlbCAhPT0gMCkgcGF0aEFycmF5ID0gcGF0aEFycmF5LnNsaWNlKHJ1bnRpbWUuaWdub3JlUGF0aExldmVsKTtcbiAgICBjb25zdCBwYXRoU3RyaW5nID0gYC8ke3BhdGhBcnJheS5qb2luKFwiL1wiKX1gO1xuXG4gICAgY29uc3QgZXhlY3V0ZUlkID0gcnVudGltZT8uZXhlY3V0ZUlkID8gYXdhaXQgcnVudGltZS5leGVjdXRlSWQob3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMpIDogX19jcmVhdGVJZCgpO1xuXG4gICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIHBhdGhTdHJpbmcsIGV4ZWN1dGVJZCk7XG4gICAgcnVudGltZS5ydW50aW1lLnJlcXVlc3Quc2V0KGV4ZWN1dGVJZCwgeyBsb2dnZXIgfSk7XG4gICAgY29uc3QgcmVzcG9uc2U6IE1pbGtpb0h0dHBSZXNwb25zZSA9IHtcbiAgICAgIGJvZHk6IFwiXCIsXG4gICAgICBzdGF0dXM6IDIwMCxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzXCI6IHJ1bnRpbWUuY29ycz8uY29yc0FsbG93TWV0aG9kcyA/PyBcIipcIixcbiAgICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogcnVudGltZS5jb3JzPy5jb3JzQWxsb3dPcmlnaW4gPz8gXCIqXCIsXG4gICAgICAgIFwiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVyc1wiOiBydW50aW1lLmNvcnM/LmNvcnNBbGxvd0hlYWRlcnMgPz8gXCIqXCIsXG4gICAgICAgIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIsXG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgbGV0IGZpbmFsZXM6IEFycmF5PCgpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+PiA9IFtdO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGh0dHAgPSAoYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgaXAgPSBydW50aW1lLnJlYWxJcCA/IHJ1bnRpbWUucmVhbElwKG9wdGlvbnMucmVxdWVzdC5oZWFkZXJzKSA6IFwiOjoxXCI7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICBzdHJpbmc6IGF3YWl0IG9wdGlvbnMucmVxdWVzdC50ZXh0KCksXG4gICAgICAgICAgcGFyc2VkOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgaXAsXG4gICAgICAgICAgcGF0aDogeyBzdHJpbmc6IHBhdGhTdHJpbmcgYXMga2V5b2YgJHR5cGVzW1wiZ2VuZXJhdGVkXCJdW1wicm91dGVTY2hlbWFcIl0sIGFycmF5OiBwYXRoQXJyYXkgfSxcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgcmVxdWVzdDogb3B0aW9ucy5yZXF1ZXN0LFxuICAgICAgICAgIHJlc3BvbnNlLFxuICAgICAgICB9IGFzIENvbnRleHRIdHRwO1xuICAgICAgfSkoKSkhO1xuXG4gICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlcXVlc3RcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAgfSk7XG5cbiAgICAgIGlmICghcnVudGltZS5kZXZlbG9wICYmIChodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZykuc3RhcnRzV2l0aChcIi9fL1wiKSkge1xuICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cE5vdEZvdW5kXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwIH0pO1xuICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZyB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3QuaGVhZGVycy5nZXQoXCJBY2NlcHRcIik/LnN0YXJ0c1dpdGgoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKSkge1xuICAgICAgICAvLyBhY3Rpb25cbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xuICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAgfSk7XG4gICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgIHRyaWUuYWRkKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHJvdXRlU2NoZW1hLnR5cGUgIT09IFwiYWN0aW9uXCIpIHRocm93IHJlamVjdChcIlVOQUNDRVBUQUJMRVwiLCB7IGV4cGVjdGVkOiBcInN0cmVhbVwiLCBtZXNzYWdlOiBgTm90IGFjY2VwdGFibGUsIHRoZSBBY2NlcHQgaW4gdGhlIHJlcXVlc3QgaGVhZGVyIHNob3VsZCBiZSBcInRleHQvZXZlbnQtc3RyZWFtXCIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIFwiQG1pbGtpby9zdGFyZ2F0ZVwiIHBhY2thZ2UsIHBsZWFzZSBhZGQgXFxgdHlwZTogXCJzdHJlYW1cIlxcYCB0byB0aGUgZXhlY3V0ZSBvcHRpb25zLmAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcbiAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcbiAgICAgICAgICBtaXhpbkNvbnRleHQ6IHsgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMgfSxcbiAgICAgICAgICBwYXJhbXM6IGh0dHAucGFyYW1zLnN0cmluZyxcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmJvZHkgPT09IFwiXCIgJiYgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGV4ZWN1dGVkLmVtcHR5UmVzdWx0KSB7XG4gICAgICAgICAgICByZXNwb25zZS5ib2R5ID0gYHtcImRhdGFcIjp7fSxcImV4ZWN1dGVJZFwiOlwiJHtleGVjdXRlSWR9XCIsXCJzdWNjZXNzXCI6dHJ1ZX1gO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXhlY3V0ZWQucmVzdWx0c1R5cGVTYWZldHkpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlLmJvZHkgPSBge1wiZGF0YVwiOiR7cm91dGVTY2hlbWEucmVzdWx0c1RvSlNPTihleGVjdXRlZC5yZXN1bHRzLnZhbHVlKX0sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzcG9uc2UuYm9keSA9IGB7XCJkYXRhXCI6JHtUU09OLnN0cmluZ2lmeShleGVjdXRlZC5yZXN1bHRzLnZhbHVlKX0sXCJleGVjdXRlSWRcIjpcIiR7ZXhlY3V0ZUlkfVwiLFwic3VjY2Vzc1wiOnRydWV9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBydW50aW1lLmVtaXQoXCJtaWxraW86aHR0cFJlc3BvbnNlXCIsIHsgZXhlY3V0ZUlkLCBsb2dnZXIsIHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCBodHRwLCBoZWFkZXJzOiBodHRwLnJlcXVlc3QuaGVhZGVycywgY29udGV4dDogZXhlY3V0ZWQuY29udGV4dCB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkFuIGVycm9yIG9jY3VycmVkIGluc2lkZSBvbkZpbmFsbHkuXCIsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzdHJlYW1cbiAgICAgICAgbGV0IHJvdXRlU2NoZW1hID0gb3B0aW9ucy5yb3V0ZVNjaGVtYTtcbiAgICAgICAgaWYgKCFyb3V0ZVNjaGVtYSkge1xuICAgICAgICAgIHJvdXRlU2NoZW1hID0gdHJpZS5nZXQoaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcpO1xuICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcm91dGVTY2hlbWEgPSBnZW5lcmF0ZWQucm91dGVTY2hlbWE/LltodHRwLnBhdGguc3RyaW5nXTtcbiAgICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHJ1bnRpbWUuZW1pdChcIm1pbGtpbzpodHRwTm90Rm91bmRcIiwgeyBleGVjdXRlSWQsIGxvZ2dlciwgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsIGh0dHAgfSk7XG4gICAgICAgICAgICAgIHRocm93IHJlamVjdChcIk5PVF9GT1VORFwiLCB7IHBhdGg6IGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZVNjaGVtYS5tb2R1bGUgIT09IFwiZnVuY3Rpb25cIikgcm91dGVTY2hlbWEubW9kdWxlID0gYXdhaXQgcm91dGVTY2hlbWEubW9kdWxlO1xuICAgICAgICAgICAgZWxzZSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGUoKTtcbiAgICAgICAgICAgIHRyaWUuYWRkKGh0dHAucGF0aC5zdHJpbmcgYXMgc3RyaW5nLCByb3V0ZVNjaGVtYSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyb3V0ZVNjaGVtYS50eXBlICE9PSBcInN0cmVhbVwiKSB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJzdHJlYW1cIiwgbWVzc2FnZTogYE5vdCBhY2NlcHRhYmxlLCB0aGUgQWNjZXB0IGluIHRoZSByZXF1ZXN0IGhlYWRlciBzaG91bGQgYmUgXCJhcHBsaWNhdGlvbi9qc29uXCIuIElmIHlvdSBhcmUgdXNpbmcgdGhlIFwiQG1pbGtpby9zdGFyZ2F0ZVwiIHBhY2thZ2UsIHBsZWFzZSByZW1vdmUgXFxgdHlwZTogXCJzdHJlYW1cIlxcYCB0byB0aGUgZXhlY3V0ZSBvcHRpb25zLmAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVDbG9zZSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUoZXhlY3V0ZUlkKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgZmluYWxlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlcigpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IGV4ZWN1dGVJZCxcbiAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgcGF0aDogaHR0cC5wYXRoLnN0cmluZyBhcyBzdHJpbmcsXG4gICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5yZXF1ZXN0LmhlYWRlcnMgYXMgSGVhZGVycyxcbiAgICAgICAgICBtaXhpbkNvbnRleHQ6IHsgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMgfSxcbiAgICAgICAgICBwYXJhbXM6IGh0dHAucGFyYW1zLnN0cmluZyxcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICBsZXQgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgIGxldCBjb250cm9sOiBSZWFkYWJsZVN0cmVhbURpcmVjdENvbnRyb2xsZXIgfCBSZWFkYWJsZVN0cmVhbURlZmF1bHRDb250cm9sbGVyO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICBpZiAodHlwZW9mIEJ1biAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIC8vIEB0cy1pZ25vcmU6IGJ1blxuICAgICAgICAgIHN0cmVhbSA9IG5ldyBSZWFkYWJsZVN0cmVhbSh7XG4gICAgICAgICAgICB0eXBlOiBcImRpcmVjdFwiLFxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXI6IFJlYWRhYmxlU3RyZWFtRGlyZWN0Q29udHJvbGxlcikge1xuICAgICAgICAgICAgICBjb250cm9sID0gY29udHJvbGxlcjtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb250cm9sbGVyLndyaXRlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShbbnVsbCwgVFNPTi5lbmNvZGUodmFsdWUpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6JHtyZXN1bHR9XFxuXFxuYCk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBleGVjdXRlZC5yZXN1bHRzLnZhbHVlLnJldHVybih1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIoZXhlY3V0ZUlkLCBsb2dnZXIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICAgICAgICAgIHJlc3VsdFtleGNlcHRpb24uY29kZV0gPSBleGNlcHRpb24ucmVqZWN0O1xuICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIud3JpdGUoYGRhdGE6JHtKU09OLnN0cmluZ2lmeShbVFNPTi5lbmNvZGUocmVzdWx0KSwgbnVsbF0pfVxcblxcbmApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDApKTtcbiAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5jbG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIGNhbmNlbCgpIHtcbiAgICAgICAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgY29udHJvbC5jbG9zZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9IGFzIGFueSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9kZS5qcyBvciBvdGhlcnNcbiAgICAgICAgICAvLyBAdHMtaWdub3JlOiBidW5cbiAgICAgICAgICBzdHJlYW0gPSBuZXcgUmVhZGFibGVTdHJlYW0oe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZTogYnVuXG4gICAgICAgICAgICBhc3luYyBwdWxsKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgICAgICAgY29udHJvbCA9IGNvbnRyb2xsZXI7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOkAke0pTT04uc3RyaW5naWZ5KHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQgfSBzYXRpc2ZpZXMgTWlsa2lvUmVzcG9uc2VTdWNjZXNzPGFueT4pfVxcblxcbmApO1xuICAgICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnJlcXVlc3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBzdHJpbmcgPSBKU09OLnN0cmluZ2lmeShbbnVsbCwgVFNPTi5lbmNvZGUodmFsdWUpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuZW5xdWV1ZShgZGF0YToke3Jlc3VsdH1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUucmV0dXJuKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhjZXB0aW9uID0gZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgICAgICAgY29udHJvbGxlci5lbnF1ZXVlKGBkYXRhOiR7SlNPTi5zdHJpbmdpZnkoW1RTT04uZW5jb2RlKHJlc3VsdCksIG51bGxdKX1cXG5cXG5gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBhd2FpdCBoYW5kbGVDbG9zZSgpO1xuICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyBjYW5jZWwoKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGhhbmRsZUNsb3NlKCk7XG4gICAgICAgICAgICAgIGNvbnRyb2wuY2xvc2UoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSBhcyBhbnkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2UuYm9keSA9IHN0cmVhbTtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwidGV4dC9ldmVudC1zdHJlYW1cIjtcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVyc1tcIkNhY2hlLUNvbnRyb2xcIl0gPSBcIm5vLWNhY2hlXCI7XG5cbiAgICAgICAgYXdhaXQgcnVudGltZS5lbWl0KFwibWlsa2lvOmh0dHBSZXNwb25zZVwiLCB7IGV4ZWN1dGVJZCwgbG9nZ2VyLCBwYXRoOiBodHRwLnBhdGguc3RyaW5nIGFzIHN0cmluZywgaHR0cCwgaGVhZGVyczogaHR0cC5yZXF1ZXN0LmhlYWRlcnMsIGNvbnRleHQ6IGV4ZWN1dGVkLmNvbnRleHQgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShyZXNwb25zZS5ib2R5LCByZXNwb25zZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IHJlc3VsdHM6IFJlc3VsdHM8TWlsa2lvUmVzcG9uc2VSZWplY3Q+ID0ge1xuICAgICAgICB2YWx1ZTogZXhjZXB0aW9uSGFuZGxlcihleGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpLFxuICAgICAgfTtcbiAgICAgIGlmIChyZXN1bHRzLnZhbHVlICE9PSB1bmRlZmluZWQpIHJlc3BvbnNlLmJvZHkgPSBUU09OLnN0cmluZ2lmeShyZXN1bHRzLnZhbHVlKTtcblxuICAgICAgcnVudGltZS5ydW50aW1lLnJlcXVlc3QuZGVsZXRlKGV4ZWN1dGVJZCk7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlc3BvbnNlLmJvZHksIHJlc3BvbnNlKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgc3RyZWFtQ2xvc2VyczogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaGFuZGxlTWVzc2FnZSA9IGFzeW5jIChcbiAgICBwb3J0OiB7IHBvc3RNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQgfSxcbiAgICBvcHRpb25zOlxuICAgICAgfCB7XG4gICAgICAgICAgZXhlY3V0ZUlkOiBzdHJpbmc7XG4gICAgICAgICAgcGF0aDogc3RyaW5nO1xuICAgICAgICAgIHBhcmFtcz86IFJlY29yZDxhbnksIGFueT47XG4gICAgICAgICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgICAgIH1cbiAgICAgIHwgc3RyaW5nLFxuICApID0+IHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlmIChvcHRpb25zID09PSBcIlBJTkdcIikge1xuICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKFwiUE9OR1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zLnN0YXJ0c1dpdGgoXCJDTE9TRV9TVFJFQU06XCIpKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGVJZCA9IG9wdGlvbnMuc3BsaXQoXCJDTE9TRV9TVFJFQU06XCIpWzFdO1xuICAgICAgICBjb25zdCBzdHJlYW1DbG9zZXIgPSBzdHJlYW1DbG9zZXJzLmdldChleGVjdXRlSWQpO1xuICAgICAgICBpZiAoc3RyZWFtQ2xvc2VyKSBzdHJlYW1DbG9zZXIoXCJzdHJlYW1cIik7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCByb3V0ZVNjaGVtYSA9IHRyaWUuZ2V0KG9wdGlvbnMucGF0aCk7XG4gICAgaWYgKHJvdXRlU2NoZW1hID09PSBudWxsKSB7XG4gICAgICByb3V0ZVNjaGVtYSA9IGdlbmVyYXRlZC5yb3V0ZVNjaGVtYT8uW29wdGlvbnMucGF0aF07XG4gICAgICBpZiAocm91dGVTY2hlbWEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyByZWplY3QoXCJOT1RfRk9VTkRcIiwgeyBwYXRoOiBvcHRpb25zLnBhdGggfSk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHJvdXRlU2NoZW1hLm1vZHVsZSAhPT0gXCJmdW5jdGlvblwiKSByb3V0ZVNjaGVtYS5tb2R1bGUgPSBhd2FpdCByb3V0ZVNjaGVtYS5tb2R1bGU7XG4gICAgICBlbHNlIHJvdXRlU2NoZW1hLm1vZHVsZSA9IGF3YWl0IHJvdXRlU2NoZW1hLm1vZHVsZSgpO1xuICAgICAgdHJpZS5hZGQob3B0aW9ucy5wYXRoLCByb3V0ZVNjaGVtYSk7XG4gICAgfVxuXG4gICAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKG9wdGlvbnMuaGVhZGVycyk7XG4gICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXMgPz8ge307XG4gICAgY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKHJ1bnRpbWUsIG9wdGlvbnMucGF0aCwgb3B0aW9ucy5leGVjdXRlSWQpO1xuICAgIGxldCBmaW5hbGVzOiBBcnJheTwoKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPj4gPSBbXTtcblxuICAgIGNvbnN0IGh0dHAgPSBuZXcgUHJveHkoXG4gICAgICB7fSxcbiAgICAgIHtcbiAgICAgICAgZ2V0OiAodGFyZ2V0LCBwcm9wZXJ0eSkgPT4ge1xuICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gXCJub3RGb3VuZFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJjb250ZXh0Lmh0dHBcIiwgbWVzc2FnZTogXCJUaGlzIHJlcXVlc3Qgd2FzIGludm9rZWQgdGhyb3VnaCB0aGUgZXhlY3V0ZSBtZXRob2QuIFNpbmNlIG5vIGFjdHVhbCByZXF1ZXN0IHdhcyBnZW5lcmF0ZWQsIHRoZSBIVFRQIG1ldGhvZHMgdW5kZXIgdGhlIGNvbnRleHQgY2Fubm90IGJlIGFjY2Vzc2VkLlwiIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyByZWplY3QoXCJVTkFDQ0VQVEFCTEVcIiwgeyBleHBlY3RlZDogXCJjb250ZXh0Lmh0dHBcIiwgbWVzc2FnZTogXCJUaGlzIHJlcXVlc3Qgd2FzIGludm9rZWQgdGhyb3VnaCB0aGUgZXhlY3V0ZSBtZXRob2QuIFNpbmNlIG5vIGFjdHVhbCByZXF1ZXN0IHdhcyBnZW5lcmF0ZWQsIHRoZSBIVFRQIG1ldGhvZHMgdW5kZXIgdGhlIGNvbnRleHQgY2Fubm90IGJlIGFjY2Vzc2VkLlwiIH0pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgY29uc3QgaGFuZGxlQ2xvc2UgPSBhc3luYyAodHlwZTogXCJhY3Rpb25cIiB8IFwic3RyZWFtXCIpID0+IHtcbiAgICAgIGlmICh0eXBlID09PSBcInN0cmVhbVwiKSBzdHJlYW1DbG9zZXJzLmRlbGV0ZShvcHRpb25zLmV4ZWN1dGVJZCk7XG4gICAgICBydW50aW1lLnJ1bnRpbWUucmVxdWVzdC5kZWxldGUob3B0aW9ucy5leGVjdXRlSWQpO1xuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGZpbmFsZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBoYW5kbGVyKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFwiQW4gZXJyb3Igb2NjdXJyZWQgaW5zaWRlIG9uRmluYWxseS5cIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAocm91dGVTY2hlbWEudHlwZSA9PT0gXCJhY3Rpb25cIikge1xuICAgICAgICBjb25zdCBleGVjdXRlZCA9IGF3YWl0IGV4ZWN1dGVyLl9fZXhlY3V0ZShyb3V0ZVNjaGVtYSwge1xuICAgICAgICAgIGNyZWF0ZWRFeGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxuICAgICAgICAgIGNyZWF0ZWRMb2dnZXI6IGxvZ2dlcixcbiAgICAgICAgICBwYXRoOiBvcHRpb25zLnBhdGgsXG4gICAgICAgICAgaGVhZGVycyxcbiAgICAgICAgICBtaXhpbkNvbnRleHQ6IHsgaHR0cDogaHR0cCwgaGVhZGVycyB9LFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICBwYXJhbXNUeXBlOiBcInJhd1wiLFxuICAgICAgICB9KTtcbiAgICAgICAgZmluYWxlcyA9IGV4ZWN1dGVkLmZpbmFsZXM7XG5cbiAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoXCJhY3Rpb25cIik7XG5cbiAgICAgICAgaWYgKGV4ZWN1dGVkLmVtcHR5UmVzdWx0KSB7XG4gICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLFxuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsXG4gICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgZGF0YTogZXhlY3V0ZWQucmVzdWx0cy52YWx1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJvdXRlU2NoZW1hLnR5cGUgPT09IFwic3RyZWFtXCIpIHtcbiAgICAgICAgY29uc3QgZXhlY3V0ZWQgPSBhd2FpdCBleGVjdXRlci5fX2V4ZWN1dGUocm91dGVTY2hlbWEsIHtcbiAgICAgICAgICBjcmVhdGVkRXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCxcbiAgICAgICAgICBjcmVhdGVkTG9nZ2VyOiBsb2dnZXIsXG4gICAgICAgICAgcGF0aDogb3B0aW9ucy5wYXRoLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgbWl4aW5Db250ZXh0OiB7IGh0dHA6IGh0dHAsIGhlYWRlcnMgfSxcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgcGFyYW1zVHlwZTogXCJyYXdcIixcbiAgICAgICAgfSk7XG4gICAgICAgIGZpbmFsZXMgPSBleGVjdXRlZC5maW5hbGVzO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IHVuZGVmaW5lZCwgZXhlY3V0ZUlkOiBvcHRpb25zLmV4ZWN1dGVJZCwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgc3RyZWFtQ2xvc2Vycy5zZXQob3B0aW9ucy5leGVjdXRlSWQsIGhhbmRsZUNsb3NlKTtcbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIGV4ZWN1dGVkLnJlc3VsdHMudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7IHN1Y2Nlc3M6IHRydWUsIGRhdGE6IFtudWxsLCB2YWx1ZV0sIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwb3J0LnBvc3RNZXNzYWdlKHsgc3VjY2VzczogdHJ1ZSwgZGF0YTogdW5kZWZpbmVkLCBleGVjdXRlSWQ6IG9wdGlvbnMuZXhlY3V0ZUlkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnN0IGV4Y2VwdGlvbiA9IGV4Y2VwdGlvbkhhbmRsZXIob3B0aW9ucy5leGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0ge307XG4gICAgICAgICAgcmVzdWx0W2V4Y2VwdGlvbi5jb2RlXSA9IGV4Y2VwdGlvbi5yZWplY3Q7XG4gICAgICAgICAgcG9ydC5wb3N0TWVzc2FnZSh7IHN1Y2Nlc3M6IGZhbHNlLCBkYXRhOiBbVFNPTi5lbmNvZGUocmVzdWx0KSwgbnVsbF0sIGV4ZWN1dGVJZDogb3B0aW9ucy5leGVjdXRlSWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaGFuZGxlQ2xvc2UoXCJzdHJlYW1cIik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IGV4Y2VwdGlvbkhhbmRsZXIob3B0aW9ucy5leGVjdXRlSWQsIGxvZ2dlciwgZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBvcnQsXG4gICAgZmV0Y2gsXG4gICAgaGFuZGxlTWVzc2FnZSxcbiAgfTtcbn1cbiIsCiAgICAiaW1wb3J0IHsgVFNPTiB9IGZyb20gXCJAc291dGhlcm4tYXVyb3JhL3Rzb25cIjtcbmltcG9ydCB0eXBlIHsgTWlsa2lvUmVzcG9uc2VSZWplY3QsIExvZ2dlciB9IGZyb20gXCIuLi9pbmRleC50c1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlICRyZWplY3RDb2RlIHtcbiAgRkFJTDogc3RyaW5nO1xuICBSRVFVRVNUX0ZBSUw6IGFueTtcbiAgTk9UX0RFVkVMT1BfTU9ERTogc3RyaW5nO1xuICBSRVFVRVNUX1RJTUVPVVQ6IHsgdGltZW91dDogbnVtYmVyOyBtZXNzYWdlOiBzdHJpbmcgfTtcbiAgTk9UX0ZPVU5EOiB7IHBhdGg6IHN0cmluZyB9O1xuICBQQVJBTVNfVFlQRV9JTkNPUlJFQ1Q6IHsgcGF0aDogc3RyaW5nOyBleHBlY3RlZDogc3RyaW5nOyB2YWx1ZTogYW55OyBtZXNzYWdlOiBzdHJpbmcgfSB8IG51bGw7XG4gIFJFU1VMVFNfVFlQRV9JTkNPUlJFQ1Q6IHsgcGF0aDogc3RyaW5nOyBleHBlY3RlZDogc3RyaW5nOyB2YWx1ZTogYW55OyBtZXNzYWdlOiBzdHJpbmcgfSB8IG51bGw7XG4gIFVOQUNDRVBUQUJMRTogeyBleHBlY3RlZDogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfTtcbiAgUEFSQU1TX1RZUEVfTk9UX1NVUFBPUlRFRDogeyBleHBlY3RlZDogc3RyaW5nIH07XG4gIFJFU1VMVFNfVFlQRV9OT1RfU1VQUE9SVEVEOiB7IGV4cGVjdGVkOiBzdHJpbmcgfTtcbiAgSU5URVJOQUxfU0VSVkVSX0VSUk9SOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWplY3Q8Q29kZSBleHRlbmRzIGtleW9mICRyZWplY3RDb2RlLCBSZWplY3REYXRhIGV4dGVuZHMgJHJlamVjdENvZGVbQ29kZV0+KGNvZGU6IENvZGUsIGRhdGE6IFJlamVjdERhdGEpOiBNaWxraW9SZWplY3RFcnJvcjxDb2RlLCBSZWplY3REYXRhPiB7XG4gIGNvbnN0IGVycm9yID0geyAkbWlsa2lvUmVqZWN0OiB0cnVlLCBjb2RlLCBkYXRhIH0gYXMgTWlsa2lvUmVqZWN0RXJyb3I8Q29kZSwgUmVqZWN0RGF0YT47XG4gIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKGVycm9yKTtcbiAgcmV0dXJuIGVycm9yO1xufVxuXG5leHBvcnQgdHlwZSBNaWxraW9SZWplY3RFcnJvcjxDb2RlIGV4dGVuZHMga2V5b2YgJHJlamVjdENvZGUgPSBrZXlvZiAkcmVqZWN0Q29kZSwgUmVqZWN0RGF0YSBleHRlbmRzICRyZWplY3RDb2RlW0NvZGVdID0gJHJlamVjdENvZGVbQ29kZV0+ID0geyBjb2RlOiBDb2RlOyBkYXRhOiBSZWplY3REYXRhOyBzdGFjazogc3RyaW5nOyAkbWlsa2lvUmVqZWN0OiB0cnVlIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBleGNlcHRpb25IYW5kbGVyKGV4ZWN1dGVJZDogc3RyaW5nLCBsb2dnZXI6IExvZ2dlciwgZXJyb3I6IE1pbGtpb1JlamVjdEVycm9yPGFueSwgYW55PiB8IGFueSk6IE1pbGtpb1Jlc3BvbnNlUmVqZWN0IHtcbiAgdHJ5IHtcbiAgICBpZiAoXCJ2aXRlU2VydmVyXCIgaW4gZ2xvYmFsVGhpcykgKGdsb2JhbFRoaXMgYXMgYW55KS52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoZXJyb3IpOyAvLyBmaXggdml0ZSBzc3Igc3RhY2t0cmFjZVxuICB9IGNhdGNoIChlcnJvcikge31cbiAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgXCJ2aXRlU2VydmVyXCIgaW4gZ2xvYmFsVGhpcykgKGdsb2JhbFRoaXMgYXMgYW55KS52aXRlU2VydmVyLnNzckZpeFN0YWNrdHJhY2UoZXJyb3IpO1xuICBjb25zdCBuYW1lID0gZXJyb3I/LmNvZGUgPz8gZXJyb3I/Lm5hbWUgPz8gZXJyb3I/LmNvbnN0cnVjdG9yPy5uYW1lID8/IFwiVW5uYW1lZCBFeGNlcHRpb25cIjtcblxuICBpZiAoZXJyb3I/LiRtaWxraW9SZWplY3QgPT09IHRydWUgJiYgZXJyb3I/LmNvZGUgPT09IFwiTk9UX0ZPVU5EXCIpIHtcbiAgICBsb2dnZXIuaW5mbyhuYW1lLCBlcnJvcj8uZGF0YT8ucGF0aCA/PyBcIlVua25vd24gcGF0aFwiKTtcbiAgfSBlbHNlIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhY2sgPSBlcnJvcj8uJG1pbGtpb1JlamVjdCA/IChlcnJvcj8uc3RhY2sgPz8gXCJcIikuc3BsaXQoXCJcXG5cIikuc2xpY2UoMikuam9pbihcIlxcblwiKSA6IChlcnJvcj8uc3RhY2sgPz8gXCJcIik7XG4gICAgICBsb2dnZXIuZXJyb3IobmFtZSwgYFxcbiR7VFNPTi5zdHJpbmdpZnkoZXJyb3I/LmRhdGEpfWAsIGBcXG4ke3N0YWNrfVxcbmApO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIGxvZ2dlci5lcnJvcihuYW1lLCBgXFxuJHtlcnJvcj8udG9TdHJpbmcoKX1gLCBgXFxuJHtlcnJvcj8uc3RhY2t9XFxuYCk7XG4gICAgfVxuICB9XG5cbiAgbGV0IHJlc3VsdDogTWlsa2lvUmVzcG9uc2VSZWplY3Q7XG5cbiAgaWYgKGVycm9yPy4kbWlsa2lvUmVqZWN0ID09PSB0cnVlKSByZXN1bHQgPSB7IHN1Y2Nlc3M6IGZhbHNlLCBjb2RlOiBlcnJvci5jb2RlLCByZWplY3Q6IGVycm9yLmRhdGEsIGV4ZWN1dGVJZCB9O1xuICBlbHNlIHJlc3VsdCA9IHsgc3VjY2VzczogZmFsc2UsIGNvZGU6IFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCIsIHJlamVjdDogdW5kZWZpbmVkLCBleGVjdXRlSWQgfTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjtBQUFPLFNBQVMsSUFBNkIsQ0FBQyxTQUEyQjtBQUFBLEVBQ3ZFLE9BQU8sUUFBUTtBQUFBOztBQ1VWLFNBQVMsVUFBMEMsQ0FBQyxPQUErQjtBQUFBLEVBQ3hGLE9BQU87QUFBQSxJQUNMLE1BQU0sT0FBTyxFQUFFLGFBQWEsZUFBZSxNQUFNO0FBQUEs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QUFNLFFBQVEsT0FBTyxpQkFBaUIsT0FBTyxTQUFTLElBQUksTUFBTTtBQUFBLENBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLO0FBQUEsQ0FBSSxJQUFLLE9BQU8sU0FBUztBQUFBLE1BQzdHLE9BQU8sTUFBTSxNQUFNO0FBQUEsRUFBSyxFQUFLLFVBQVUsT0FBTyxJQUFJLEtBQUs7QUFBQSxFQUFLO0FBQUEsQ0FBUztBQUFBLE1BQ3JFLE9BQU8sR0FBRztBQUFBLE1BQ1YsT0FBTyxNQUFNLE1BQU07QUFBQSxFQUFLLE9BQU8sU0FBUyxLQUFLO0FBQUEsRUFBSyxPQUFPO0FBQUEsQ0FBUztBQUFBO0FBQUE7QUFBQSxFQUl0RSxJQUFJO0FBQUEsRUFFSixJQUFJLE9BQU8sa0JBQWtCO0FBQUEsSUFBTSxTQUFTLEVBQUUsU0FBUyxPQUFPLE1BQU0sTUFBTSxNQUFNLFFBQVEsTUFBTSxNQUFNLFVBQVU7QUFBQSxFQUN6RztBQUFBLGFBQVMsRUFBRSxTQUFTLE9BQU8sTUFBTSx5QkFBeUIsUUFBUSxXQUFXLFVBQVU7QUFBQSxFQUU1RixPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICJGQ0U1NkMyMzFFN0ZCMjBBNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==