gemi 0.4.99 → 0.4.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/dist/bin/index.js +8 -4
  2. package/dist/chunk-05eed61c2b3a1b1e.js +8 -0
  3. package/dist/{chunk-ebd1b8ef83ffde0a.js.map → chunk-05eed61c2b3a1b1e.js.map} +2 -2
  4. package/dist/{chunk-934537cc925d759e.js → chunk-11e91fb588f807cc.js} +2 -2
  5. package/dist/{chunk-934537cc925d759e.js.map → chunk-11e91fb588f807cc.js.map} +1 -1
  6. package/dist/chunk-2837fdf890e898d3.js +4 -0
  7. package/dist/{chunk-c2eec0de415bd820.js.map → chunk-2837fdf890e898d3.js.map} +2 -2
  8. package/dist/{chunk-e5683d4213970b67.js → chunk-328ab1f3bb58ad38.js} +2 -2
  9. package/dist/{chunk-e5683d4213970b67.js.map → chunk-328ab1f3bb58ad38.js.map} +1 -1
  10. package/dist/chunk-3472ca43caf75a77.js +4 -0
  11. package/dist/{chunk-7a46d8409a08609d.js.map → chunk-3472ca43caf75a77.js.map} +2 -2
  12. package/dist/chunk-47ea31cb8b17e4e4.js +4 -0
  13. package/dist/chunk-47ea31cb8b17e4e4.js.map +10 -0
  14. package/dist/chunk-48810f352379bb60.js +4 -0
  15. package/dist/{chunk-874ce9ed3695d6dc.js.map → chunk-48810f352379bb60.js.map} +2 -2
  16. package/dist/chunk-4dc9368bb3d01114.js +4 -0
  17. package/dist/{chunk-7afadccff63d6a14.js.map → chunk-4dc9368bb3d01114.js.map} +6 -6
  18. package/dist/chunk-62b89bbbe1ac6296.js +3 -0
  19. package/dist/{chunk-280cabf2f360003f.js.map → chunk-62b89bbbe1ac6296.js.map} +7 -7
  20. package/dist/chunk-6da22e63227b8b7e.js +5 -0
  21. package/dist/{chunk-59b0df586fa6a917.js.map → chunk-6da22e63227b8b7e.js.map} +4 -4
  22. package/dist/chunk-86b01fbb73c14623.js +4 -0
  23. package/dist/{chunk-6177d9eb9e7bf615.js.map → chunk-86b01fbb73c14623.js.map} +5 -5
  24. package/dist/chunk-b4500c55791611ad.js +4 -0
  25. package/dist/{chunk-8fb697a1aeea8f96.js.map → chunk-b4500c55791611ad.js.map} +2 -2
  26. package/dist/chunk-b4d3adef0642635d.js +4 -0
  27. package/dist/{chunk-0f8949935ef3c862.js.map → chunk-b4d3adef0642635d.js.map} +2 -2
  28. package/dist/chunk-d5111ae7105df3f0.js +11 -0
  29. package/dist/{chunk-af12ac64b60b8669.js.map → chunk-d5111ae7105df3f0.js.map} +5 -5
  30. package/dist/chunk-e04a17515c94f90d.js +20 -0
  31. package/dist/{chunk-28689250fae96e36.js.map → chunk-e04a17515c94f90d.js.map} +11 -14
  32. package/dist/chunk-e97cbca373170441.js +4 -0
  33. package/dist/{chunk-df507e740b7ba846.js.map → chunk-e97cbca373170441.js.map} +6 -6
  34. package/dist/chunk-f8e684f6d3cc29c2.js +4 -0
  35. package/dist/{chunk-2b3b4a0aa3edf9ec.js.map → chunk-f8e684f6d3cc29c2.js.map} +2 -2
  36. package/dist/client/HttpReload.d.ts.map +1 -1
  37. package/dist/client/index.js +18 -11
  38. package/dist/client/index.js.map +1 -1
  39. package/dist/client/useQuery.d.ts.map +1 -1
  40. package/dist/kernel/index.js +1 -1
  41. package/dist/server/index.js +5 -5
  42. package/dist/server/index.js.map +3 -3
  43. package/dist/services/index.js +5 -5
  44. package/dist/services/index.js.map +2 -2
  45. package/dist/vite/{index-CePL3kqT.mjs → index-Bu4AXBt9.mjs} +1 -8
  46. package/dist/vite/index.mjs +1 -1
  47. package/dist/vite/{typescript-CaGEH4-o.mjs → typescript-D69Uqrn5.mjs} +1 -1
  48. package/package.json +1 -1
  49. package/dist/chunk-0f8949935ef3c862.js +0 -4
  50. package/dist/chunk-2214ecbc4b85c724.js +0 -3
  51. package/dist/chunk-2214ecbc4b85c724.js.map +0 -15
  52. package/dist/chunk-280cabf2f360003f.js +0 -4
  53. package/dist/chunk-28689250fae96e36.js +0 -20
  54. package/dist/chunk-2b3b4a0aa3edf9ec.js +0 -4
  55. package/dist/chunk-59b0df586fa6a917.js +0 -5
  56. package/dist/chunk-6177d9eb9e7bf615.js +0 -4
  57. package/dist/chunk-7a46d8409a08609d.js +0 -4
  58. package/dist/chunk-7afadccff63d6a14.js +0 -4
  59. package/dist/chunk-874ce9ed3695d6dc.js +0 -4
  60. package/dist/chunk-8fb697a1aeea8f96.js +0 -4
  61. package/dist/chunk-af12ac64b60b8669.js +0 -11
  62. package/dist/chunk-c2eec0de415bd820.js +0 -4
  63. package/dist/chunk-df507e740b7ba846.js +0 -4
  64. package/dist/chunk-ebd1b8ef83ffde0a.js +0 -8
package/dist/bin/index.js CHANGED
@@ -9225,9 +9225,9 @@ async function startDevServer() {
9225
9225
  return;
9226
9226
  }
9227
9227
  console.log(`[vite] ${fileRelativePath} changed. Reloading...`);
9228
- const modules = vite.moduleGraph.getModulesByFile(file);
9228
+ const modules = vite.moduleGraph.getModulesByFile(file) ?? [];
9229
9229
  for (const mod of Array.from(modules)) {
9230
- await vite.reloadModule(mod);
9230
+ vite.moduleGraph.invalidateModule(mod);
9231
9231
  }
9232
9232
  try {
9233
9233
  const app2 = await getApp();
@@ -9236,6 +9236,10 @@ async function startDevServer() {
9236
9236
  server.publish(topic, data, compress);
9237
9237
  });
9238
9238
  server.reload(serve2);
9239
+ vite.ws.send({
9240
+ type: "custom",
9241
+ event: "http-reload"
9242
+ });
9239
9243
  } catch (err) {
9240
9244
  console.log("Error on server reload");
9241
9245
  console.log(err);
@@ -10241,5 +10245,5 @@ program.command("start").action(async () => {
10241
10245
  });
10242
10246
  program.parse();
10243
10247
 
10244
- //# debugId=0609BED9872F822164756e2164756e21
10245
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1kZXYtcnVudGltZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2lzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2RlYnVnLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2NvbnN0YW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9wYXJzZS1vcHRpb25zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2lkZW50aWZpZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2NsYXNzZXMvc2VtdmVyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXJzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY29lcmNlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9ndGUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvbHJ1Y2FjaGUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2VxLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9uZXEuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9sdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvbHRlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jbXAuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9jb21wYXJhdG9yLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2NsYXNzZXMvcmFuZ2UuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3NhdGlzZmllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2xpYnZpcHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL2xpYi9zaGFycC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2NvbnN0cnVjdG9yLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9pcy1hcnJheWlzaC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2ltcGxlLXN3aXp6bGUvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbG9yLXN0cmluZy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY29sb3IvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL2xpYi9pbnB1dC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL3Jlc2l6ZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2NvbXBvc2l0ZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL29wZXJhdGlvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2NvbG91ci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2NoYW5uZWwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL2xpYi9vdXRwdXQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL2xpYi91dGlsaXR5LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvZXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvYXJndW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvaGVscC5qcyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9vcHRpb24uanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvc3VnZ2VzdFNpbWlsYXIuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvY29tbWFuZC5qcyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2luZGV4LmpzIiwgImJpbi9nZW1pLnRzIiwgInNlcnZlci9kZXYudHMiLCAic2VydmVyL3N0eWxlcy50c3giLCAic2VydmVyL2ltYWdlSGFuZGxlci50cyIsICJzZXJ2ZXIvcmVuZGVyRXJyb3JQYWdlLnRzIiwgInNlcnZlci9wcm9kLnRzIiwgInNlcnZlci9nZW5lcmF0ZUV0YWcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3VybHBhdHRlcm4tcG9seWZpbGwvZGlzdC91cmxwYXR0ZXJuLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy91cmxwYXR0ZXJuLXBvbHlmaWxsL2luZGV4LmpzIiwgImJpbi9jcmVhdGVSb2xsdXBJbnB1dC50cyIsICJjbGllbnQvaGVscGVycy9mbGF0dGVuQ29tcG9uZW50VHJlZS50cyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2VzbS5tanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXCJwcm9kdWN0aW9uXCIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBcIiVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzXCIsXG4gICAgICAgICAgICBpbmZvWzBdLFxuICAgICAgICAgICAgaW5mb1sxXVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICAgIGlmIChudWxsID09PSBtYXliZUl0ZXJhYmxlIHx8IFwib2JqZWN0XCIgIT09IHR5cGVvZiBtYXliZUl0ZXJhYmxlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIG1heWJlSXRlcmFibGUgPVxuICAgICAgICAoTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSkgfHxcbiAgICAgICAgbWF5YmVJdGVyYWJsZVtcIkBAaXRlcmF0b3JcIl07XG4gICAgICByZXR1cm4gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbWF5YmVJdGVyYWJsZSA/IG1heWJlSXRlcmFibGUgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgIGFyZ3MgPSBBcnJheSgxIDwgX2xlbiA/IF9sZW4gLSAxIDogMCksXG4gICAgICAgICAgX2tleSA9IDE7XG4gICAgICAgIF9rZXkgPCBfbGVuO1xuICAgICAgICBfa2V5KytcbiAgICAgIClcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICBwcmludFdhcm5pbmcoXCJ3YXJuXCIsIGZvcm1hdCwgYXJncywgRXJyb3IoXCJyZWFjdC1zdGFjay10b3AtZnJhbWVcIikpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBlcnJvciRqc2NvbXAkMChmb3JtYXQpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgYXJncyA9IEFycmF5KDEgPCBfbGVuMiA/IF9sZW4yIC0gMSA6IDApLFxuICAgICAgICAgIF9rZXkyID0gMTtcbiAgICAgICAgX2tleTIgPCBfbGVuMjtcbiAgICAgICAgX2tleTIrK1xuICAgICAgKVxuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgcHJpbnRXYXJuaW5nKFwiZXJyb3JcIiwgZm9ybWF0LCBhcmdzLCBFcnJvcihcInJlYWN0LXN0YWNrLXRvcC1mcmFtZVwiKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzLCBjdXJyZW50U3RhY2spIHtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayAmJlxuICAgICAgICAoKGN1cnJlbnRTdGFjayA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayhjdXJyZW50U3RhY2spKSxcbiAgICAgICAgXCJcIiAhPT0gY3VycmVudFN0YWNrICYmXG4gICAgICAgICAgKChmb3JtYXQgKz0gXCIlc1wiKSwgKGFyZ3MgPSBhcmdzLmNvbmNhdChbY3VycmVudFN0YWNrXSkpKSk7XG4gICAgICBhcmdzLnVuc2hpZnQoZm9ybWF0KTtcbiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAgICAgIHB1YmxpY0luc3RhbmNlID1cbiAgICAgICAgKChwdWJsaWNJbnN0YW5jZSA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yKSAmJlxuICAgICAgICAgIChwdWJsaWNJbnN0YW5jZS5kaXNwbGF5TmFtZSB8fCBwdWJsaWNJbnN0YW5jZS5uYW1lKSkgfHxcbiAgICAgICAgXCJSZWFjdENsYXNzXCI7XG4gICAgICB2YXIgd2FybmluZ0tleSA9IHB1YmxpY0luc3RhbmNlICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldIHx8XG4gICAgICAgIChlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICBcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFRoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEluc3RlYWQsIGFzc2lnbiB0byBgdGhpcy5zdGF0ZWAgZGlyZWN0bHkgb3IgZGVmaW5lIGEgYHN0YXRlID0ge307YCBjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuXCIsXG4gICAgICAgICAgY2FsbGVyTmFtZSxcbiAgICAgICAgICBwdWJsaWNJbnN0YW5jZVxuICAgICAgICApLFxuICAgICAgICAoZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gITApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gICAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBDb21wb25lbnREdW1teSgpIHt9XG4gICAgZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAgICAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gXCJcIiArIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gITE7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9ICEwO1xuICAgICAgfVxuICAgICAgaWYgKEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdClcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID1cbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBTeW1ib2wgJiZcbiAgICAgICAgICAgICAgU3ltYm9sLnRvU3RyaW5nVGFnICYmXG4gICAgICAgICAgICAgIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10pIHx8XG4gICAgICAgICAgICB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8XG4gICAgICAgICAgICBcIk9iamVjdFwiKSxcbiAgICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAgIFwiVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLiBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgdXNpbmcgaXQgaGVyZS5cIixcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdFxuICAgICAgICAgICksXG4gICAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKVxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICAgICAgaWYgKG51bGwgPT0gdHlwZSkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSlcbiAgICAgICAgcmV0dXJuIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMlxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIkZyYWdtZW50XCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiUG9ydGFsXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJQcm9maWxlclwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3RyaWN0TW9kZVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VMaXN0XCI7XG4gICAgICB9XG4gICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHR5cGUpXG4gICAgICAgIHN3aXRjaCAoXG4gICAgICAgICAgKFwibnVtYmVyXCIgPT09IHR5cGVvZiB0eXBlLnRhZyAmJlxuICAgICAgICAgICAgZXJyb3IkanNjb21wJDAoXG4gICAgICAgICAgICAgIFwiUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB0eXBlLiQkdHlwZW9mKVxuICAgICAgICApIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAodHlwZS5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Qcm92aWRlclwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OU1VNRVJfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAodHlwZS5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Db25zdW1lclwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgIHZhciBpbm5lclR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdHlwZSB8fFxuICAgICAgICAgICAgICAoKHR5cGUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgXCJcIiksXG4gICAgICAgICAgICAgICh0eXBlID0gXCJcIiAhPT0gdHlwZSA/IFwiRm9yd2FyZFJlZihcIiArIHR5cGUgKyBcIilcIiA6IFwiRm9yd2FyZFJlZlwiKSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChpbm5lclR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGwpLFxuICAgICAgICAgICAgICBudWxsICE9PSBpbm5lclR5cGVcbiAgICAgICAgICAgICAgICA/IGlubmVyVHlwZVxuICAgICAgICAgICAgICAgIDogZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgXCJNZW1vXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICBpbm5lclR5cGUgPSB0eXBlLl9wYXlsb2FkO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGUuX2luaXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUoaW5uZXJUeXBlKSk7XG4gICAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fFxuICAgICAgICB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8XG4gICAgICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICAgIG51bGwgIT09IHR5cGUgJiZcbiAgICAgICAgICAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8XG4gICAgICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHxcbiAgICAgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxIHx8XG4gICAgICAgICAgICB2b2lkIDAgIT09IHR5cGUuZ2V0TW9kdWxlSWQpKVxuICAgICAgICA/ICEwXG4gICAgICAgIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cbiAgICBmdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAgICAgIGlmICgwID09PSBkaXNhYmxlZERlcHRoKSB7XG4gICAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kO1xuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpc2FibGVkRGVwdGgrKztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICAgICAgZGlzYWJsZWREZXB0aC0tO1xuICAgICAgaWYgKDAgPT09IGRpc2FibGVkRGVwdGgpIHtcbiAgICAgICAgdmFyIHByb3BzID0geyBjb25maWd1cmFibGU6ICEwLCBlbnVtZXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZMb2cgfSksXG4gICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkluZm8gfSksXG4gICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldldhcm4gfSksXG4gICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZFcnJvciB9KSxcbiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkdyb3VwIH0pLFxuICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQgfSksXG4gICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZHcm91cEVuZCB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIDAgPiBkaXNhYmxlZERlcHRoICYmXG4gICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgIFwiZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHByZWZpeClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgICBwcmVmaXggPSAobWF0Y2ggJiYgbWF0Y2hbMV0pIHx8IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBcIlxcblwiICsgcHJlZml4ICsgbmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gICAgICBpZiAoIWZuIHx8IHJlZW50cnkpIHJldHVybiBcIlwiO1xuICAgICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuICAgICAgaWYgKHZvaWQgMCAhPT0gZnJhbWUpIHJldHVybiBmcmFtZTtcbiAgICAgIHJlZW50cnkgPSAhMDtcbiAgICAgIGZyYW1lID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcmV2aW91c0Rpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBudWxsO1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcbiAgICAgIHZhciBSdW5JblJvb3RGcmFtZSA9IHtcbiAgICAgICAgRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgICAgICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCBcInByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBSZWZsZWN0ICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHgkMCkge1xuICAgICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoeCQxKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAoRmFrZSA9IGZuKCkpICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgRmFrZS5jYXRjaCAmJlxuICAgICAgICAgICAgICAgIEZha2UuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgICAgICAgICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIFwic3RyaW5nXCIgPT09IHR5cGVvZiBzYW1wbGUuc3RhY2spXG4gICAgICAgICAgICAgIHJldHVybiBbc2FtcGxlLnN0YWNrLCBjb250cm9sLnN0YWNrXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdC5kaXNwbGF5TmFtZSA9XG4gICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCI7XG4gICAgICB2YXIgbmFtZVByb3BEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LFxuICAgICAgICBcIm5hbWVcIlxuICAgICAgKTtcbiAgICAgIG5hbWVQcm9wRGVzY3JpcHRvciAmJlxuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsXG4gICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgeyB2YWx1ZTogXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIiB9XG4gICAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgX1J1bkluUm9vdEZyYW1lJERldGVyID1cbiAgICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCgpLFxuICAgICAgICAgIHNhbXBsZVN0YWNrID0gX1J1bkluUm9vdEZyYW1lJERldGVyWzBdLFxuICAgICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcbiAgICAgICAgaWYgKHNhbXBsZVN0YWNrICYmIGNvbnRyb2xTdGFjaykge1xuICAgICAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuICAgICAgICAgICAgY29udHJvbExpbmVzID0gY29udHJvbFN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBzYW1wbGVTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlciA9IDA7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPCBzYW1wbGVMaW5lcy5sZW5ndGggJiZcbiAgICAgICAgICAgICFzYW1wbGVMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICBcIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdFwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgKVxuICAgICAgICAgICAgX1J1bkluUm9vdEZyYW1lJERldGVyKys7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIHNhbXBsZVN0YWNrIDwgY29udHJvbExpbmVzLmxlbmd0aCAmJlxuICAgICAgICAgICAgIWNvbnRyb2xMaW5lc1tzYW1wbGVTdGFja10uaW5jbHVkZXMoXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIik7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICBzYW1wbGVTdGFjaysrO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9PT0gc2FtcGxlTGluZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBzYW1wbGVTdGFjayA9PT0gY29udHJvbExpbmVzLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgc2FtcGxlU3RhY2sgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgMSA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgJiZcbiAgICAgICAgICAgICAgMCA8PSBzYW1wbGVTdGFjayAmJlxuICAgICAgICAgICAgICBzYW1wbGVMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdICE9PSBjb250cm9sTGluZXNbc2FtcGxlU3RhY2tdO1xuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNhbXBsZVN0YWNrLS07XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIDEgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyICYmIDAgPD0gc2FtcGxlU3RhY2s7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXItLSwgc2FtcGxlU3RhY2stLVxuICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc2FtcGxlTGluZXNbX1J1bkluUm9vdEZyYW1lJERldGVyXSAhPT0gY29udHJvbExpbmVzW3NhbXBsZVN0YWNrXVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICgxICE9PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgfHwgMSAhPT0gc2FtcGxlU3RhY2spIHtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoX1J1bkluUm9vdEZyYW1lJERldGVyLS0sXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZVN0YWNrLS0sXG4gICAgICAgICAgICAgICAgICAgIDAgPiBzYW1wbGVTdGFjayB8fFxuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sTGluZXNbc2FtcGxlU3RhY2tdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IG5ldyBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IFwiXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm4uZGlzcGxheU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfZnJhbWUuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChfZnJhbWUgPSBfZnJhbWUucmVwbGFjZShcIjxhbm9ueW1vdXM+XCIsIGZuLmRpc3BsYXlOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGZuICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyICYmIDAgPD0gc2FtcGxlU3RhY2spO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAocmVlbnRyeSA9ICExKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZpb3VzRGlzcGF0Y2hlciksXG4gICAgICAgICAgcmVlbmFibGVMb2dzKCksXG4gICAgICAgICAgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gZnJhbWUpO1xuICAgICAgfVxuICAgICAgc2FtcGxlTGluZXMgPSAoc2FtcGxlTGluZXMgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiBcIlwiKVxuICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHNhbXBsZUxpbmVzKVxuICAgICAgICA6IFwiXCI7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBmbiAmJiBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc2FtcGxlTGluZXMpO1xuICAgICAgcmV0dXJuIHNhbXBsZUxpbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSkge1xuICAgICAgaWYgKG51bGwgPT0gdHlwZSkgcmV0dXJuIFwiXCI7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSkge1xuICAgICAgICB2YXIgcHJvdG90eXBlID0gdHlwZS5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgISghcHJvdG90eXBlIHx8ICFwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZVwiKTtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKFwiU3VzcGVuc2VMaXN0XCIpO1xuICAgICAgfVxuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUgPSBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyLCAhMSkpLCB0eXBlO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUpO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgcHJvdG90eXBlID0gdHlwZS5fcGF5bG9hZDtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLl9pbml0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlKHByb3RvdHlwZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE93bmVyKCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5BO1xuICAgICAgcmV0dXJuIG51bGwgPT09IGRpc3BhdGNoZXIgPyBudWxsIDogZGlzcGF0Y2hlci5nZXRPd25lcigpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJyZWZcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcInJlZlwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcucmVmO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJrZXlcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcImtleVwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcua2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHdhcm5BYm91dEFjY2Vzc2luZ0tleSgpIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gfHxcbiAgICAgICAgICAoKHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gITApLFxuICAgICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgXCIlczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lIHZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgcHJvcC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvc3BlY2lhbC1wcm9wcylcIixcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSAhMDtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgXCJrZXlcIiwge1xuICAgICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVsZW1lbnRSZWZHZXR0ZXJXaXRoRGVwcmVjYXRpb25XYXJuaW5nKCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodGhpcy50eXBlKTtcbiAgICAgIGRpZFdhcm5BYm91dEVsZW1lbnRSZWZbY29tcG9uZW50TmFtZV0gfHxcbiAgICAgICAgKChkaWRXYXJuQWJvdXRFbGVtZW50UmVmW2NvbXBvbmVudE5hbWVdID0gITApLFxuICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICBcIkFjY2Vzc2luZyBlbGVtZW50LnJlZiB3YXMgcmVtb3ZlZCBpbiBSZWFjdCAxOS4gcmVmIGlzIG5vdyBhIHJlZ3VsYXIgcHJvcC4gSXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIEpTWCBFbGVtZW50IHR5cGUgaW4gYSBmdXR1cmUgcmVsZWFzZS5cIlxuICAgICAgICApKTtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSB0aGlzLnByb3BzLnJlZjtcbiAgICAgIHJldHVybiB2b2lkIDAgIT09IGNvbXBvbmVudE5hbWUgPyBjb21wb25lbnROYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgX3JlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgICAgIF9yZWYgPSBwcm9wcy5yZWY7XG4gICAgICB0eXBlID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICBfb3duZXI6IG93bmVyXG4gICAgICB9O1xuICAgICAgbnVsbCAhPT0gKHZvaWQgMCAhPT0gX3JlZiA/IF9yZWYgOiBudWxsKVxuICAgICAgICA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgICAgIGdldDogZWxlbWVudFJlZkdldHRlcldpdGhEZXByZWNhdGlvbldhcm5pbmdcbiAgICAgICAgICB9KVxuICAgICAgICA6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7IGVudW1lcmFibGU6ICExLCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgIHR5cGUuX3N0b3JlID0ge307XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZS5fc3RvcmUsIFwidmFsaWRhdGVkXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMSxcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIFwiX2RlYnVnSW5mb1wiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITEsXG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBudWxsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5mcmVlemUgJiYgKE9iamVjdC5mcmVlemUodHlwZS5wcm9wcyksIE9iamVjdC5mcmVlemUodHlwZSkpO1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgICAgIG5ld0tleSA9IFJlYWN0RWxlbWVudChcbiAgICAgICAgb2xkRWxlbWVudC50eXBlLFxuICAgICAgICBuZXdLZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBvbGRFbGVtZW50Ll9vd25lcixcbiAgICAgICAgb2xkRWxlbWVudC5wcm9wc1xuICAgICAgKTtcbiAgICAgIG5ld0tleS5fc3RvcmUudmFsaWRhdGVkID0gb2xkRWxlbWVudC5fc3RvcmUudmFsaWRhdGVkO1xuICAgICAgcmV0dXJuIG5ld0tleTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICAgICAgaWYgKFxuICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2Ygbm9kZSAmJlxuICAgICAgICBub2RlICYmXG4gICAgICAgIG5vZGUuJCR0eXBlb2YgIT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0VcbiAgICAgIClcbiAgICAgICAgaWYgKGlzQXJyYXlJbXBsKG5vZGUpKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcbiAgICAgICAgICAgIGlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKVxuICAgICAgICAgIG5vZGUuX3N0b3JlICYmIChub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSAxKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKChpID0gZ2V0SXRlcmF0b3JGbihub2RlKSksXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaSAmJlxuICAgICAgICAgICAgaSAhPT0gbm9kZS5lbnRyaWVzICYmXG4gICAgICAgICAgICAoKGkgPSBpLmNhbGwobm9kZSkpLCBpICE9PSBub2RlKSlcbiAgICAgICAgKVxuICAgICAgICAgIGZvciAoOyAhKG5vZGUgPSBpLm5leHQoKSkuZG9uZTsgKVxuICAgICAgICAgICAgaXNWYWxpZEVsZW1lbnQobm9kZS52YWx1ZSkgJiZcbiAgICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShub2RlLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2Ygb2JqZWN0ICYmXG4gICAgICAgIG51bGwgIT09IG9iamVjdCAmJlxuICAgICAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnQuX3N0b3JlICYmXG4gICAgICAgICFlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgJiZcbiAgICAgICAgbnVsbCA9PSBlbGVtZW50LmtleSAmJlxuICAgICAgICAoKGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IDEpLFxuICAgICAgICAocGFyZW50VHlwZSA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkpLFxuICAgICAgICAhb3duZXJIYXNLZXlVc2VXYXJuaW5nW3BhcmVudFR5cGVdKVxuICAgICAgKSB7XG4gICAgICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1twYXJlbnRUeXBlXSA9ICEwO1xuICAgICAgICB2YXIgY2hpbGRPd25lciA9IFwiXCI7XG4gICAgICAgIGVsZW1lbnQgJiZcbiAgICAgICAgICBudWxsICE9IGVsZW1lbnQuX293bmVyICYmXG4gICAgICAgICAgZWxlbWVudC5fb3duZXIgIT09IGdldE93bmVyKCkgJiZcbiAgICAgICAgICAoKGNoaWxkT3duZXIgPSBudWxsKSxcbiAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgZWxlbWVudC5fb3duZXIudGFnXG4gICAgICAgICAgICA/IChjaGlsZE93bmVyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGVsZW1lbnQuX293bmVyLnR5cGUpKVxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSB0eXBlb2YgZWxlbWVudC5fb3duZXIubmFtZSAmJlxuICAgICAgICAgICAgICAoY2hpbGRPd25lciA9IGVsZW1lbnQuX293bmVyLm5hbWUpLFxuICAgICAgICAgIChjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBjaGlsZE93bmVyICsgXCIuXCIpKTtcbiAgICAgICAgdmFyIHByZXZHZXRDdXJyZW50U3RhY2sgPSBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2s7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlKTtcbiAgICAgICAgICBwcmV2R2V0Q3VycmVudFN0YWNrICYmIChzdGFjayArPSBwcmV2R2V0Q3VycmVudFN0YWNrKCkgfHwgXCJcIik7XG4gICAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgICAgICB9O1xuICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAnRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLiVzJXMgU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgICAgICAgcGFyZW50VHlwZSxcbiAgICAgICAgICBjaGlsZE93bmVyXG4gICAgICAgICk7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayA9IHByZXZHZXRDdXJyZW50U3RhY2s7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICAgICAgdmFyIGluZm8gPSBcIlwiLFxuICAgICAgICBvd25lciA9IGdldE93bmVyKCk7XG4gICAgICBvd25lciAmJlxuICAgICAgICAob3duZXIgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkpICYmXG4gICAgICAgIChpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgXCIgKyBvd25lciArIFwiYC5cIik7XG4gICAgICBpbmZvIHx8XG4gICAgICAgICgocGFyZW50VHlwZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShwYXJlbnRUeXBlKSkgJiZcbiAgICAgICAgICAoaW5mbyA9XG4gICAgICAgICAgICBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50VHlwZSArIFwiPi5cIikpO1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgICAgIHZhciBlc2NhcGVyTG9va3VwID0geyBcIj1cIjogXCI9MFwiLCBcIjpcIjogXCI9MlwiIH07XG4gICAgICByZXR1cm4gKFxuICAgICAgICBcIiRcIiArXG4gICAgICAgIGtleS5yZXBsYWNlKC9bPTpdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBcIm9iamVjdFwiID09PSB0eXBlb2YgZWxlbWVudCAmJlxuICAgICAgICBudWxsICE9PSBlbGVtZW50ICYmXG4gICAgICAgIG51bGwgIT0gZWxlbWVudC5rZXlcbiAgICAgICAgPyAoY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihlbGVtZW50LmtleSksIGVzY2FwZShcIlwiICsgZWxlbWVudC5rZXkpKVxuICAgICAgICA6IGluZGV4LnRvU3RyaW5nKDM2KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbm9vcCQxKCkge31cbiAgICBmdW5jdGlvbiByZXNvbHZlVGhlbmFibGUodGhlbmFibGUpIHtcbiAgICAgIHN3aXRjaCAodGhlbmFibGUuc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgXCJmdWxmaWxsZWRcIjpcbiAgICAgICAgICByZXR1cm4gdGhlbmFibGUudmFsdWU7XG4gICAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICAgIHRocm93IHRoZW5hYmxlLnJlYXNvbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzd2l0Y2ggKFxuICAgICAgICAgICAgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB0aGVuYWJsZS5zdGF0dXNcbiAgICAgICAgICAgICAgPyB0aGVuYWJsZS50aGVuKG5vb3AkMSwgbm9vcCQxKVxuICAgICAgICAgICAgICA6ICgodGhlbmFibGUuc3RhdHVzID0gXCJwZW5kaW5nXCIpLFxuICAgICAgICAgICAgICAgIHRoZW5hYmxlLnRoZW4oXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZnVsZmlsbGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgXCJwZW5kaW5nXCIgPT09IHRoZW5hYmxlLnN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICgodGhlbmFibGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgKHRoZW5hYmxlLnZhbHVlID0gZnVsZmlsbGVkVmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgXCJwZW5kaW5nXCIgPT09IHRoZW5hYmxlLnN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICgodGhlbmFibGUuc3RhdHVzID0gXCJyZWplY3RlZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAodGhlbmFibGUucmVhc29uID0gZXJyb3IpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgIHRoZW5hYmxlLnN0YXR1cylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNhc2UgXCJmdWxmaWxsZWRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoZW5hYmxlLnZhbHVlO1xuICAgICAgICAgICAgY2FzZSBcInJlamVjdGVkXCI6XG4gICAgICAgICAgICAgIHRocm93IHRoZW5hYmxlLnJlYXNvbjtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyB0aGVuYWJsZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFwSW50b0FycmF5KGNoaWxkcmVuLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmFtZVNvRmFyLCBjYWxsYmFjaykge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG4gICAgICBpZiAoXCJ1bmRlZmluZWRcIiA9PT0gdHlwZSB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZSkgY2hpbGRyZW4gPSBudWxsO1xuICAgICAgdmFyIGludm9rZUNhbGxiYWNrID0gITE7XG4gICAgICBpZiAobnVsbCA9PT0gY2hpbGRyZW4pIGludm9rZUNhbGxiYWNrID0gITA7XG4gICAgICBlbHNlXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSAhMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSAhMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIChpbnZva2VDYWxsYmFjayA9IGNoaWxkcmVuLl9pbml0KSxcbiAgICAgICAgICAgICAgICAgIG1hcEludG9BcnJheShcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2soY2hpbGRyZW4uX3BheWxvYWQpLFxuICAgICAgICAgICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgICAgICBpbnZva2VDYWxsYmFjayA9IGNoaWxkcmVuO1xuICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGludm9rZUNhbGxiYWNrKTtcbiAgICAgICAgdmFyIGNoaWxkS2V5ID1cbiAgICAgICAgICBcIlwiID09PSBuYW1lU29GYXIgPyBcIi5cIiArIGdldEVsZW1lbnRLZXkoaW52b2tlQ2FsbGJhY2ssIDApIDogbmFtZVNvRmFyO1xuICAgICAgICBpc0FycmF5SW1wbChjYWxsYmFjaylcbiAgICAgICAgICA/ICgoZXNjYXBlZFByZWZpeCA9IFwiXCIpLFxuICAgICAgICAgICAgbnVsbCAhPSBjaGlsZEtleSAmJlxuICAgICAgICAgICAgICAoZXNjYXBlZFByZWZpeCA9XG4gICAgICAgICAgICAgICAgY2hpbGRLZXkucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgXCIkJi9cIikgKyBcIi9cIiksXG4gICAgICAgICAgICBtYXBJbnRvQXJyYXkoY2FsbGJhY2ssIGFycmF5LCBlc2NhcGVkUHJlZml4LCBcIlwiLCBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIDogbnVsbCAhPSBjYWxsYmFjayAmJlxuICAgICAgICAgICAgKGlzVmFsaWRFbGVtZW50KGNhbGxiYWNrKSAmJlxuICAgICAgICAgICAgICAobnVsbCAhPSBjYWxsYmFjay5rZXkgJiZcbiAgICAgICAgICAgICAgICAoKGludm9rZUNhbGxiYWNrICYmIGludm9rZUNhbGxiYWNrLmtleSA9PT0gY2FsbGJhY2sua2V5KSB8fFxuICAgICAgICAgICAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjYWxsYmFjay5rZXkpKSxcbiAgICAgICAgICAgICAgKGVzY2FwZWRQcmVmaXggPSBjbG9uZUFuZFJlcGxhY2VLZXkoXG4gICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCArXG4gICAgICAgICAgICAgICAgICAobnVsbCA9PSBjYWxsYmFjay5rZXkgfHxcbiAgICAgICAgICAgICAgICAgIChpbnZva2VDYWxsYmFjayAmJiBpbnZva2VDYWxsYmFjay5rZXkgPT09IGNhbGxiYWNrLmtleSlcbiAgICAgICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgICAgIDogKFwiXCIgKyBjYWxsYmFjay5rZXkpLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiJCYvXCJcbiAgICAgICAgICAgICAgICAgICAgICApICsgXCIvXCIpICtcbiAgICAgICAgICAgICAgICAgIGNoaWxkS2V5XG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBcIlwiICE9PSBuYW1lU29GYXIgJiZcbiAgICAgICAgICAgICAgICBudWxsICE9IGludm9rZUNhbGxiYWNrICYmXG4gICAgICAgICAgICAgICAgaXNWYWxpZEVsZW1lbnQoaW52b2tlQ2FsbGJhY2spICYmXG4gICAgICAgICAgICAgICAgbnVsbCA9PSBpbnZva2VDYWxsYmFjay5rZXkgJiZcbiAgICAgICAgICAgICAgICBpbnZva2VDYWxsYmFjay5fc3RvcmUgJiZcbiAgICAgICAgICAgICAgICAhaW52b2tlQ2FsbGJhY2suX3N0b3JlLnZhbGlkYXRlZCAmJlxuICAgICAgICAgICAgICAgIChlc2NhcGVkUHJlZml4Ll9zdG9yZS52YWxpZGF0ZWQgPSAyKSxcbiAgICAgICAgICAgICAgKGNhbGxiYWNrID0gZXNjYXBlZFByZWZpeCkpLFxuICAgICAgICAgICAgYXJyYXkucHVzaChjYWxsYmFjaykpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGludm9rZUNhbGxiYWNrID0gMDtcbiAgICAgIGNoaWxkS2V5ID0gXCJcIiA9PT0gbmFtZVNvRmFyID8gXCIuXCIgOiBuYW1lU29GYXIgKyBcIjpcIjtcbiAgICAgIGlmIChpc0FycmF5SW1wbChjaGlsZHJlbikpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgKG5hbWVTb0ZhciA9IGNoaWxkcmVuW2ldKSxcbiAgICAgICAgICAgICh0eXBlID0gY2hpbGRLZXkgKyBnZXRFbGVtZW50S2V5KG5hbWVTb0ZhciwgaSkpLFxuICAgICAgICAgICAgKGludm9rZUNhbGxiYWNrICs9IG1hcEludG9BcnJheShcbiAgICAgICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICkpO1xuICAgICAgZWxzZSBpZiAoKChpID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbikpLCBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpKSlcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBpID09PSBjaGlsZHJlbi5lbnRyaWVzICYmXG4gICAgICAgICAgICAoZGlkV2FybkFib3V0TWFwcyB8fFxuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwiVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLlwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAoZGlkV2FybkFib3V0TWFwcyA9ICEwKSksXG4gICAgICAgICAgICBjaGlsZHJlbiA9IGkuY2FsbChjaGlsZHJlbiksXG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAhKG5hbWVTb0ZhciA9IGNoaWxkcmVuLm5leHQoKSkuZG9uZTtcblxuICAgICAgICApXG4gICAgICAgICAgKG5hbWVTb0ZhciA9IG5hbWVTb0Zhci52YWx1ZSksXG4gICAgICAgICAgICAodHlwZSA9IGNoaWxkS2V5ICsgZ2V0RWxlbWVudEtleShuYW1lU29GYXIsIGkrKykpLFxuICAgICAgICAgICAgKGludm9rZUNhbGxiYWNrICs9IG1hcEludG9BcnJheShcbiAgICAgICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICkpO1xuICAgICAgZWxzZSBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZSkge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY2hpbGRyZW4udGhlbilcbiAgICAgICAgICByZXR1cm4gbWFwSW50b0FycmF5KFxuICAgICAgICAgICAgcmVzb2x2ZVRoZW5hYmxlKGNoaWxkcmVuKSxcbiAgICAgICAgICAgIGFycmF5LFxuICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgIG5hbWVTb0ZhcixcbiAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgKTtcbiAgICAgICAgYXJyYXkgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgK1xuICAgICAgICAgICAgKFwiW29iamVjdCBPYmplY3RdXCIgPT09IGFycmF5XG4gICAgICAgICAgICAgID8gXCJvYmplY3Qgd2l0aCBrZXlzIHtcIiArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKFwiLCBcIikgKyBcIn1cIlxuICAgICAgICAgICAgICA6IGFycmF5KSArXG4gICAgICAgICAgICBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGludm9rZUNhbGxiYWNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICAgICAgaWYgKG51bGwgPT0gY2hpbGRyZW4pIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIHZhciByZXN1bHQgPSBbXSxcbiAgICAgICAgY291bnQgPSAwO1xuICAgICAgbWFwSW50b0FycmF5KGNoaWxkcmVuLCByZXN1bHQsIFwiXCIsIFwiXCIsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgICAgIGlmICgtMSA9PT0gcGF5bG9hZC5fc3RhdHVzKSB7XG4gICAgICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgICAgICBjdG9yID0gY3RvcigpO1xuICAgICAgICBjdG9yLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkge1xuICAgICAgICAgICAgaWYgKDAgPT09IHBheWxvYWQuX3N0YXR1cyB8fCAtMSA9PT0gcGF5bG9hZC5fc3RhdHVzKVxuICAgICAgICAgICAgICAocGF5bG9hZC5fc3RhdHVzID0gMSksIChwYXlsb2FkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoMCA9PT0gcGF5bG9hZC5fc3RhdHVzIHx8IC0xID09PSBwYXlsb2FkLl9zdGF0dXMpXG4gICAgICAgICAgICAgIChwYXlsb2FkLl9zdGF0dXMgPSAyKSwgKHBheWxvYWQuX3Jlc3VsdCA9IGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC0xID09PSBwYXlsb2FkLl9zdGF0dXMgJiZcbiAgICAgICAgICAoKHBheWxvYWQuX3N0YXR1cyA9IDApLCAocGF5bG9hZC5fcmVzdWx0ID0gY3RvcikpO1xuICAgICAgfVxuICAgICAgaWYgKDEgPT09IHBheWxvYWQuX3N0YXR1cylcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoY3RvciA9IHBheWxvYWQuX3Jlc3VsdCksXG4gICAgICAgICAgdm9pZCAwID09PSBjdG9yICYmXG4gICAgICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAgICAgXCJsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiBJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gIGNvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXBvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5EaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0P1wiLFxuICAgICAgICAgICAgICBjdG9yXG4gICAgICAgICAgICApLFxuICAgICAgICAgIFwiZGVmYXVsdFwiIGluIGN0b3IgfHxcbiAgICAgICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgICBcImxhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcG9ydCgpIGNhbGwuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcG9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLFxuICAgICAgICAgICAgICBjdG9yXG4gICAgICAgICAgICApLFxuICAgICAgICAgIGN0b3IuZGVmYXVsdFxuICAgICAgICApO1xuICAgICAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgICAgIHZhciBkaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgIG51bGwgPT09IGRpc3BhdGNoZXIgJiZcbiAgICAgICAgZXJyb3IkanNjb21wJDAoXG4gICAgICAgICAgXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBkaXNwYXRjaGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub29wKCkge31cbiAgICBmdW5jdGlvbiBlbnF1ZXVlVGFzayh0YXNrKSB7XG4gICAgICBpZiAobnVsbCA9PT0gZW5xdWV1ZVRhc2tJbXBsKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKFwicmVxdWlyZVwiICsgTWF0aC5yYW5kb20oKSkuc2xpY2UoMCwgNyk7XG4gICAgICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gKG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ10pLmNhbGwoXG4gICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICBcInRpbWVyc1wiXG4gICAgICAgICAgKS5zZXRJbW1lZGlhdGU7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICBlbnF1ZXVlVGFza0ltcGwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICExID09PSBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCAmJlxuICAgICAgICAgICAgICAoKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gITApLFxuICAgICAgICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgJiZcbiAgICAgICAgICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAgICAgICAgIFwiVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgc28gZW5xdWV1aW5nIHRhc2tzIHZpYSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aWxsIGZhaWwuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuXCJcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh2b2lkIDApO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFnZ3JlZ2F0ZUVycm9ycyhlcnJvcnMpIHtcbiAgICAgIHJldHVybiAxIDwgZXJyb3JzLmxlbmd0aCAmJiBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBBZ2dyZWdhdGVFcnJvclxuICAgICAgICA/IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMpXG4gICAgICAgIDogZXJyb3JzWzBdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0UXVldWUsIHByZXZBY3RTY29wZURlcHRoKSB7XG4gICAgICBwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEgJiZcbiAgICAgICAgZXJyb3IkanNjb21wJDAoXG4gICAgICAgICAgXCJZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEJlIHN1cmUgdG8gYXdhaXQgcHJldmlvdXMgYWN0KCkgY2FsbHMgYmVmb3JlIG1ha2luZyBhIG5ldyBvbmUuIFwiXG4gICAgICAgICk7XG4gICAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWU7XG4gICAgICBpZiAobnVsbCAhPT0gcXVldWUpXG4gICAgICAgIGlmICgwICE9PSBxdWV1ZS5sZW5ndGgpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yJDUpIHtcbiAgICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5wdXNoKGVycm9yJDUpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSA9IG51bGw7XG4gICAgICAwIDwgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aFxuICAgICAgICA/ICgocXVldWUgPSBhZ2dyZWdhdGVFcnJvcnMoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGggPSAwKSxcbiAgICAgICAgICByZWplY3QocXVldWUpKVxuICAgICAgICA6IHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaEFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgICAgaXNGbHVzaGluZyA9ICEwO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmRpZFVzZVByb21pc2UgPSAhMTtcbiAgICAgICAgICAgICAgdmFyIGNvbnRpbnVhdGlvbiA9IGNhbGxiYWNrKCExKTtcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGNvbnRpbnVhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChSZWFjdFNoYXJlZEludGVybmFscy5kaWRVc2VQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBxdWV1ZVtpXSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgcXVldWUuc3BsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNvbnRpbnVhdGlvbjtcbiAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xuICAgICAgICAgICAgfSB3aGlsZSAoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yJDYpIHtcbiAgICAgICAgICBxdWV1ZS5zcGxpY2UoMCwgaSArIDEpLFxuICAgICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IkNik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaXNGbHVzaGluZyA9ICExO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgdmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudFwiKSxcbiAgICAgIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxcbiAgICAgIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIiksXG4gICAgICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLFxuICAgICAgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTtcbiAgICBTeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik7XG4gICAgdmFyIFJFQUNUX0NPTlNVTUVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29uc3VtZXJcIiksXG4gICAgICBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxcbiAgICAgIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksXG4gICAgICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLFxuICAgICAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIiksXG4gICAgICBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKSxcbiAgICAgIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpLFxuICAgICAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpLFxuICAgICAgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gICAgICAgIEg6IG51bGwsXG4gICAgICAgIEE6IG51bGwsXG4gICAgICAgIFQ6IG51bGwsXG4gICAgICAgIFM6IG51bGwsXG4gICAgICAgIGFjdFF1ZXVlOiBudWxsLFxuICAgICAgICBpc0JhdGNoaW5nTGVnYWN5OiAhMSxcbiAgICAgICAgZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGU6ICExLFxuICAgICAgICBkaWRVc2VQcm9taXNlOiAhMSxcbiAgICAgICAgdGhyb3duRXJyb3JzOiBbXSxcbiAgICAgICAgZ2V0Q3VycmVudFN0YWNrOiBudWxsXG4gICAgICB9LFxuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge30sXG4gICAgICBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgICAgICAgaXNNb3VudGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9LFxuICAgICAgICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgICAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBcImZvcmNlVXBkYXRlXCIpO1xuICAgICAgICB9LFxuICAgICAgICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICAgICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgXCJyZXBsYWNlU3RhdGVcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIFwic2V0U3RhdGVcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduLFxuICAgICAgZW1wdHlPYmplY3QgPSB7fTtcbiAgICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiAhPT0gdHlwZW9mIHBhcnRpYWxTdGF0ZSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBwYXJ0aWFsU3RhdGUgJiZcbiAgICAgICAgbnVsbCAhPSBwYXJ0aWFsU3RhdGVcbiAgICAgIClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJ0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy5cIlxuICAgICAgICApO1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBcInNldFN0YXRlXCIpO1xuICAgIH07XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgXCJmb3JjZVVwZGF0ZVwiKTtcbiAgICB9O1xuICAgIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICAgICAgaXNNb3VudGVkOiBbXG4gICAgICAgICAgXCJpc01vdW50ZWRcIixcbiAgICAgICAgICBcIkluc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluIGNvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLlwiXG4gICAgICAgIF0sXG4gICAgICAgIHJlcGxhY2VTdGF0ZTogW1xuICAgICAgICAgIFwicmVwbGFjZVN0YXRlXCIsXG4gICAgICAgICAgXCJSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLlwiXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBmbk5hbWU7XG4gICAgZm9yIChmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpXG4gICAgICBkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpICYmXG4gICAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIENvbXBvbmVudER1bW15LnByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gICAgZGVwcmVjYXRlZEFQSXMgPSBQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xuICAgIGRlcHJlY2F0ZWRBUElzLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDtcbiAgICBhc3NpZ24oZGVwcmVjYXRlZEFQSXMsIENvbXBvbmVudC5wcm90b3R5cGUpO1xuICAgIGRlcHJlY2F0ZWRBUElzLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gITA7XG4gICAgdmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheSxcbiAgICAgIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMiA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpLFxuICAgICAgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIiksXG4gICAgICBkaXNhYmxlZERlcHRoID0gMCxcbiAgICAgIHByZXZMb2csXG4gICAgICBwcmV2SW5mbyxcbiAgICAgIHByZXZXYXJuLFxuICAgICAgcHJldkVycm9yLFxuICAgICAgcHJldkdyb3VwLFxuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkLFxuICAgICAgcHJldkdyb3VwRW5kO1xuICAgIGRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9ICEwO1xuICAgIHZhciBwcmVmaXgsXG4gICAgICByZWVudHJ5ID0gITE7XG4gICAgdmFyIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgKFxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXBcbiAgICApKCk7XG4gICAgdmFyIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKSxcbiAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLFxuICAgICAgZGlkV2FybkFib3V0T2xkSlNYUnVudGltZTtcbiAgICB2YXIgZGlkV2FybkFib3V0RWxlbWVudFJlZiA9IHt9O1xuICAgIHZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fSxcbiAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSAhMSxcbiAgICAgIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZyxcbiAgICAgIHJlcG9ydEdsb2JhbEVycm9yID1cbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmVwb3J0RXJyb3JcbiAgICAgICAgICA/IHJlcG9ydEVycm9yXG4gICAgICAgICAgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB3aW5kb3cgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB3aW5kb3cuRXJyb3JFdmVudFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgd2luZG93LkVycm9yRXZlbnQoXCJlcnJvclwiLCB7XG4gICAgICAgICAgICAgICAgICBidWJibGVzOiAhMCxcbiAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6ICEwLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgIG51bGwgIT09IGVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcoZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KSkgcmV0dXJuO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBwcm9jZXNzICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcHJvY2Vzcy5lbWl0XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW1pdChcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9LFxuICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSAhMSxcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IG51bGwsXG4gICAgICBhY3RTY29wZURlcHRoID0gMCxcbiAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gITEsXG4gICAgICBpc0ZsdXNoaW5nID0gITEsXG4gICAgICBxdWV1ZVNldmVyYWxNaWNyb3Rhc2tzID1cbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcXVldWVNaWNyb3Rhc2tcbiAgICAgICAgICA/IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlTWljcm90YXNrKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBlbnF1ZXVlVGFzaztcbiAgICBleHBvcnRzLkNoaWxkcmVuID0ge1xuICAgICAgbWFwOiBtYXBDaGlsZHJlbixcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIChjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gICAgICAgIG1hcENoaWxkcmVuKFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvckVhY2hGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmb3JFYWNoQ29udGV4dFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGNvdW50OiBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG4rKztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfSxcbiAgICAgIHRvQXJyYXk6IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICB9KSB8fCBbXVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9ubHk6IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSlcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuXCJcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICB9XG4gICAgfTtcbiAgICBleHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbiAgICBleHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbiAgICBleHBvcnRzLlByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgICBleHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuICAgIGV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG4gICAgZXhwb3J0cy5TdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gICAgZXhwb3J0cy5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUgPVxuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHM7XG4gICAgZXhwb3J0cy5hY3QgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIHZhciBwcmV2QWN0UXVldWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSxcbiAgICAgICAgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgICAgYWN0U2NvcGVEZXB0aCsrO1xuICAgICAgdmFyIHF1ZXVlID0gKFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlID1cbiAgICAgICAgICBudWxsICE9PSBwcmV2QWN0UXVldWUgPyBwcmV2QWN0UXVldWUgOiBbXSksXG4gICAgICAgIGRpZEF3YWl0QWN0Q2FsbCA9ICExO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICB9IGNhdGNoIChlcnJvciQzKSB7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5wdXNoKGVycm9yJDMpO1xuICAgICAgfVxuICAgICAgaWYgKDAgPCBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgKHBvcEFjdFNjb3BlKHByZXZBY3RRdWV1ZSwgcHJldkFjdFNjb3BlRGVwdGgpLFxuICAgICAgICAgIChjYWxsYmFjayA9IGFnZ3JlZ2F0ZUVycm9ycyhSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMpKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aCA9IDApLFxuICAgICAgICAgIGNhbGxiYWNrKVxuICAgICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9PSByZXN1bHQgJiZcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJlc3VsdCAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXN1bHQudGhlblxuICAgICAgKSB7XG4gICAgICAgIHZhciB0aGVuYWJsZSA9IHJlc3VsdDtcbiAgICAgICAgcXVldWVTZXZlcmFsTWljcm90YXNrcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGlkQXdhaXRBY3RDYWxsIHx8XG4gICAgICAgICAgICBkaWRXYXJuTm9Bd2FpdEFjdCB8fFxuICAgICAgICAgICAgKChkaWRXYXJuTm9Bd2FpdEFjdCA9ICEwKSxcbiAgICAgICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgICBcIllvdSBjYWxsZWQgYWN0KGFzeW5jICgpID0+IC4uLikgd2l0aG91dCBhd2FpdC4gVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsIGludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciBzY29wZXMuIFlvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTtcIlxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGRpZEF3YWl0QWN0Q2FsbCA9ICEwO1xuICAgICAgICAgICAgdGhlbmFibGUudGhlbihcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKHJldHVyblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFF1ZXVlLCBwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICAgICAgaWYgKDAgPT09IHByZXZBY3RTY29wZURlcHRoKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yJDQpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IkNCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoMCA8IFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF90aHJvd25FcnJvciA9IGFnZ3JlZ2F0ZUVycm9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChfdGhyb3duRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFF1ZXVlLCBwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICAgICAgMCA8IFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgID8gKChlcnJvciA9IGFnZ3JlZ2F0ZUVycm9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMubGVuZ3RoID0gMCksXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcikpXG4gICAgICAgICAgICAgICAgICA6IHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIHJldHVyblZhbHVlJGpzY29tcCQwID0gcmVzdWx0O1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFF1ZXVlLCBwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAwID09PSBwcmV2QWN0U2NvcGVEZXB0aCAmJlxuICAgICAgICAoZmx1c2hBY3RRdWV1ZShxdWV1ZSksXG4gICAgICAgIDAgIT09IHF1ZXVlLmxlbmd0aCAmJlxuICAgICAgICAgIHF1ZXVlU2V2ZXJhbE1pY3JvdGFza3MoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGlkQXdhaXRBY3RDYWxsIHx8XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0IHx8XG4gICAgICAgICAgICAgICgoZGlkV2Fybk5vQXdhaXRBY3QgPSAhMCksXG4gICAgICAgICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgICAgIFwiQSBjb21wb25lbnQgc3VzcGVuZGVkIGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnV0IHRoZSBgYWN0YCBjYWxsIHdhcyBub3QgYXdhaXRlZC4gV2hlbiB0ZXN0aW5nIFJlYWN0IGNvbXBvbmVudHMgdGhhdCBkZXBlbmQgb24gYXN5bmNocm9ub3VzIGRhdGEsIHlvdSBtdXN0IGF3YWl0IHRoZSByZXN1bHQ6XFxuXFxuYXdhaXQgYWN0KCgpID0+IC4uLilcIlxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlID0gbnVsbCkpO1xuICAgICAgaWYgKDAgPCBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgKChjYWxsYmFjayA9IGFnZ3JlZ2F0ZUVycm9ycyhSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMpKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aCA9IDApLFxuICAgICAgICAgIGNhbGxiYWNrKVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGRpZEF3YWl0QWN0Q2FsbCA9ICEwO1xuICAgICAgICAgIDAgPT09IHByZXZBY3RTY29wZURlcHRoXG4gICAgICAgICAgICA/ICgoUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgPSBxdWV1ZSksXG4gICAgICAgICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhcbiAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlJGpzY29tcCQwLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiByZXNvbHZlKHJldHVyblZhbHVlJGpzY29tcCQwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4cG9ydHMuY2FjaGUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGV4cG9ydHMuY2xvbmVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChudWxsID09PSBlbGVtZW50IHx8IHZvaWQgMCA9PT0gZWxlbWVudClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICtcbiAgICAgICAgICAgIGVsZW1lbnQgK1xuICAgICAgICAgICAgXCIuXCJcbiAgICAgICAgKTtcbiAgICAgIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyksXG4gICAgICAgIGtleSA9IGVsZW1lbnQua2V5LFxuICAgICAgICBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgaWYgKG51bGwgIT0gY29uZmlnKVxuICAgICAgICBmb3IgKHByb3BOYW1lIGluIChoYXNWYWxpZFJlZihjb25maWcpICYmIChvd25lciA9IGdldE93bmVyKCkpLFxuICAgICAgICBoYXNWYWxpZEtleShjb25maWcpICYmXG4gICAgICAgICAgKGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSksIChrZXkgPSBcIlwiICsgY29uZmlnLmtleSkpLFxuICAgICAgICBjb25maWcpKVxuICAgICAgICAgICFoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpIHx8XG4gICAgICAgICAgICBcImtleVwiID09PSBwcm9wTmFtZSB8fFxuICAgICAgICAgICAgXCJfX3NlbGZcIiA9PT0gcHJvcE5hbWUgfHxcbiAgICAgICAgICAgIFwiX19zb3VyY2VcIiA9PT0gcHJvcE5hbWUgfHxcbiAgICAgICAgICAgIChcInJlZlwiID09PSBwcm9wTmFtZSAmJiB2b2lkIDAgPT09IGNvbmZpZy5yZWYpIHx8XG4gICAgICAgICAgICAocHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXSk7XG4gICAgICB2YXIgcHJvcE5hbWUgPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICAgIGlmICgxID09PSBwcm9wTmFtZSkgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgIGVsc2UgaWYgKDEgPCBwcm9wTmFtZSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZEFycmF5ID0gQXJyYXkocHJvcE5hbWUpLCBpID0gMDsgaSA8IHByb3BOYW1lOyBpKyspXG4gICAgICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgICAgIH1cbiAgICAgIHByb3BzID0gUmVhY3RFbGVtZW50KFxuICAgICAgICBlbGVtZW50LnR5cGUsXG4gICAgICAgIGtleSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBwcm9wc1xuICAgICAgKTtcbiAgICAgIGZvciAoa2V5ID0gMjsga2V5IDwgYXJndW1lbnRzLmxlbmd0aDsga2V5KyspXG4gICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1trZXldLCBwcm9wcy50eXBlKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuICAgIGV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGZ1bmN0aW9uIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IHtcbiAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgICAgICBfY3VycmVudFZhbHVlMjogZGVmYXVsdFZhbHVlLFxuICAgICAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgICAgIFByb3ZpZGVyOiBudWxsLFxuICAgICAgICBDb25zdW1lcjogbnVsbFxuICAgICAgfTtcbiAgICAgIGRlZmF1bHRWYWx1ZS5Qcm92aWRlciA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIGRlZmF1bHRWYWx1ZS5Db25zdW1lciA9IHtcbiAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlNVTUVSX1RZUEUsXG4gICAgICAgIF9jb250ZXh0OiBkZWZhdWx0VmFsdWVcbiAgICAgIH07XG4gICAgICBkZWZhdWx0VmFsdWUuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgICBkZWZhdWx0VmFsdWUuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9O1xuICAgIGV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKVxuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGkgPSBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdm9pZCAwID09PSB0eXBlIHx8XG4gICAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAwID09PSBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGgpXG4gICAgICAgIClcbiAgICAgICAgICBpICs9XG4gICAgICAgICAgICBcIiBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSBpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgICAgIGlmIChudWxsID09PSB0eXBlKSB2YXIgdHlwZVN0cmluZyA9IFwibnVsbFwiO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgaXNBcnJheUltcGwodHlwZSlcbiAgICAgICAgICAgID8gKHR5cGVTdHJpbmcgPSBcImFycmF5XCIpXG4gICAgICAgICAgICA6IHZvaWQgMCAhPT0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbiAgICAgICAgICAgID8gKCh0eXBlU3RyaW5nID1cbiAgICAgICAgICAgICAgICBcIjxcIiArXG4gICAgICAgICAgICAgICAgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8IFwiVW5rbm93blwiKSArXG4gICAgICAgICAgICAgICAgXCIgLz5cIiksXG4gICAgICAgICAgICAgIChpID1cbiAgICAgICAgICAgICAgICBcIiBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50P1wiKSlcbiAgICAgICAgICAgIDogKHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZSk7XG4gICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgIFwiUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiAlcy4lc1wiLFxuICAgICAgICAgIHR5cGVTdHJpbmcsXG4gICAgICAgICAgaVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaSA9IHt9O1xuICAgICAgdHlwZVN0cmluZyA9IG51bGw7XG4gICAgICBpZiAobnVsbCAhPSBjb25maWcpXG4gICAgICAgIGZvciAocHJvcE5hbWUgaW4gKGRpZFdhcm5BYm91dE9sZEpTWFJ1bnRpbWUgfHxcbiAgICAgICAgICAhKFwiX19zZWxmXCIgaW4gY29uZmlnKSB8fFxuICAgICAgICAgIFwia2V5XCIgaW4gY29uZmlnIHx8XG4gICAgICAgICAgKChkaWRXYXJuQWJvdXRPbGRKU1hSdW50aW1lID0gITApLFxuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBcIllvdXIgYXBwIChvciBvbmUgb2YgaXRzIGRlcGVuZGVuY2llcykgaXMgdXNpbmcgYW4gb3V0ZGF0ZWQgSlNYIHRyYW5zZm9ybS4gVXBkYXRlIHRvIHRoZSBtb2Rlcm4gSlNYIHRyYW5zZm9ybSBmb3IgZmFzdGVyIHBlcmZvcm1hbmNlOiBodHRwczovL3JlYWN0LmRldi9saW5rL25ldy1qc3gtdHJhbnNmb3JtXCJcbiAgICAgICAgICApKSxcbiAgICAgICAgaGFzVmFsaWRSZWYoY29uZmlnKSxcbiAgICAgICAgaGFzVmFsaWRLZXkoY29uZmlnKSAmJlxuICAgICAgICAgIChjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpLCAodHlwZVN0cmluZyA9IFwiXCIgKyBjb25maWcua2V5KSksXG4gICAgICAgIGNvbmZpZykpXG4gICAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJlxuICAgICAgICAgICAgXCJrZXlcIiAhPT0gcHJvcE5hbWUgJiZcbiAgICAgICAgICAgIFwiX19zZWxmXCIgIT09IHByb3BOYW1lICYmXG4gICAgICAgICAgICBcIl9fc291cmNlXCIgIT09IHByb3BOYW1lICYmXG4gICAgICAgICAgICAoaVtwcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdKTtcbiAgICAgIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuICAgICAgaWYgKDEgPT09IGNoaWxkcmVuTGVuZ3RoKSBpLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICBlbHNlIGlmICgxIDwgY2hpbGRyZW5MZW5ndGgpIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKSwgX2kgPSAwO1xuICAgICAgICAgIF9pIDwgY2hpbGRyZW5MZW5ndGg7XG4gICAgICAgICAgX2krK1xuICAgICAgICApXG4gICAgICAgICAgY2hpbGRBcnJheVtfaV0gPSBhcmd1bWVudHNbX2kgKyAyXTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgICBpLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKVxuICAgICAgICBmb3IgKHByb3BOYW1lIGluICgoY2hpbGRyZW5MZW5ndGggPSB0eXBlLmRlZmF1bHRQcm9wcyksIGNoaWxkcmVuTGVuZ3RoKSlcbiAgICAgICAgICB2b2lkIDAgPT09IGlbcHJvcE5hbWVdICYmIChpW3Byb3BOYW1lXSA9IGNoaWxkcmVuTGVuZ3RoW3Byb3BOYW1lXSk7XG4gICAgICBpZiAodHlwZVN0cmluZykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPVxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGVcbiAgICAgICAgICAgID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgXCJVbmtub3duXCJcbiAgICAgICAgICAgIDogdHlwZTtcbiAgICAgICAgdHlwZVN0cmluZyAmJiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihpLCBwcm9wTmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVhY3RFbGVtZW50KFxuICAgICAgICB0eXBlLFxuICAgICAgICB0eXBlU3RyaW5nLFxuICAgICAgICBudWxsLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgZ2V0T3duZXIoKSxcbiAgICAgICAgaVxuICAgICAgKTtcbiAgICB9O1xuICAgIGV4cG9ydHMuY3JlYXRlUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlZk9iamVjdCA9IHsgY3VycmVudDogbnVsbCB9O1xuICAgICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgICAgIHJldHVybiByZWZPYmplY3Q7XG4gICAgfTtcbiAgICBleHBvcnRzLmZvcndhcmRSZWYgPSBmdW5jdGlvbiAocmVuZGVyKSB7XG4gICAgICBudWxsICE9IHJlbmRlciAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRVxuICAgICAgICA/IGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgXCJmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCBjb21wb25lbnQuIEluc3RlYWQgb2YgZm9yd2FyZFJlZihtZW1vKC4uLikpLCB1c2UgbWVtbyhmb3J3YXJkUmVmKC4uLikpLlwiXG4gICAgICAgICAgKVxuICAgICAgICA6IFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHJlbmRlclxuICAgICAgICA/IGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgXCJmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuXCIsXG4gICAgICAgICAgICBudWxsID09PSByZW5kZXIgPyBcIm51bGxcIiA6IHR5cGVvZiByZW5kZXJcbiAgICAgICAgICApXG4gICAgICAgIDogMCAhPT0gcmVuZGVyLmxlbmd0aCAmJlxuICAgICAgICAgIDIgIT09IHJlbmRlci5sZW5ndGggJiZcbiAgICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAgIFwiZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlc1wiLFxuICAgICAgICAgICAgMSA9PT0gcmVuZGVyLmxlbmd0aFxuICAgICAgICAgICAgICA/IFwiRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyP1wiXG4gICAgICAgICAgICAgIDogXCJBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuXCJcbiAgICAgICAgICApO1xuICAgICAgbnVsbCAhPSByZW5kZXIgJiZcbiAgICAgICAgbnVsbCAhPSByZW5kZXIuZGVmYXVsdFByb3BzICYmXG4gICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgIFwiZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IGRlZmF1bHRQcm9wcy4gRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD9cIlxuICAgICAgICApO1xuICAgICAgdmFyIGVsZW1lbnRUeXBlID0geyAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSwgcmVuZGVyOiByZW5kZXIgfSxcbiAgICAgICAgb3duTmFtZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgXCJkaXNwbGF5TmFtZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgIG93bk5hbWUgPSBuYW1lO1xuICAgICAgICAgIHJlbmRlci5uYW1lIHx8XG4gICAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICAgIChPYmplY3QuZGVmaW5lUHJvcGVydHkocmVuZGVyLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KSxcbiAgICAgICAgICAgIChyZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlO1xuICAgIH07XG4gICAgZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuICAgIGV4cG9ydHMubGF6eSA9IGZ1bmN0aW9uIChjdG9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgICAgICBfcGF5bG9hZDogeyBfc3RhdHVzOiAtMSwgX3Jlc3VsdDogY3RvciB9LFxuICAgICAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gICAgICB9O1xuICAgIH07XG4gICAgZXhwb3J0cy5tZW1vID0gZnVuY3Rpb24gKHR5cGUsIGNvbXBhcmUpIHtcbiAgICAgIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB8fFxuICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICBcIm1lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkIHJlY2VpdmVkOiAlc1wiLFxuICAgICAgICAgIG51bGwgPT09IHR5cGUgPyBcIm51bGxcIiA6IHR5cGVvZiB0eXBlXG4gICAgICAgICk7XG4gICAgICBjb21wYXJlID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfTUVNT19UWVBFLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb21wYXJlOiB2b2lkIDAgPT09IGNvbXBhcmUgPyBudWxsIDogY29tcGFyZVxuICAgICAgfTtcbiAgICAgIHZhciBvd25OYW1lO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbXBhcmUsIFwiZGlzcGxheU5hbWVcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICBvd25OYW1lID0gbmFtZTtcbiAgICAgICAgICB0eXBlLm5hbWUgfHxcbiAgICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICAgIChPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSksXG4gICAgICAgICAgICAodHlwZS5kaXNwbGF5TmFtZSA9IG5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29tcGFyZTtcbiAgICB9O1xuICAgIGV4cG9ydHMuc3RhcnRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdFNoYXJlZEludGVybmFscy5ULFxuICAgICAgICB0cmFuc2l0aW9uID0ge307XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gdHJhbnNpdGlvbjtcbiAgICAgIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5ULl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gc2NvcGUoKSxcbiAgICAgICAgICBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlM7XG4gICAgICAgIG51bGwgIT09IG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoICYmXG4gICAgICAgICAgb25TdGFydFRyYW5zaXRpb25GaW5pc2godHJhbnNpdGlvbiwgcmV0dXJuVmFsdWUpO1xuICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgcmV0dXJuVmFsdWUgJiZcbiAgICAgICAgICBudWxsICE9PSByZXR1cm5WYWx1ZSAmJlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlLnRoZW4gJiZcbiAgICAgICAgICByZXR1cm5WYWx1ZS50aGVuKG5vb3AsIHJlcG9ydEdsb2JhbEVycm9yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yJDIpIHtcbiAgICAgICAgcmVwb3J0R2xvYmFsRXJyb3IoZXJyb3IkMik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBudWxsID09PSBwcmV2VHJhbnNpdGlvbiAmJlxuICAgICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzICYmXG4gICAgICAgICAgKChzY29wZSA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemUpLFxuICAgICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCksXG4gICAgICAgICAgMTAgPCBzY29wZSAmJlxuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgXCJEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uIElmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuIE90aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS5cIlxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX3VzZUNhY2hlUmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZUNhY2hlUmVmcmVzaCgpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2UgPSBmdW5jdGlvbiAodXNhYmxlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2UodXNhYmxlKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlQWN0aW9uU3RhdGUgPSBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUsIHBlcm1hbGluaykge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlQWN0aW9uU3RhdGUoXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICBwZXJtYWxpbmtcbiAgICAgICk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUNhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUNvbnRleHQgPSBmdW5jdGlvbiAoQ29udGV4dCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgICAgQ29udGV4dC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSAmJlxuICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICBcIkNhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGJ1Z3MuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD9cIlxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlRGVmZXJyZWRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgaW5pdGlhbFZhbHVlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VEZWZlcnJlZFZhbHVlKHZhbHVlLCBpbml0aWFsVmFsdWUpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VFZmZlY3QgPSBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VJZCgpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VNZW1vID0gZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VPcHRpbWlzdGljID0gZnVuY3Rpb24gKHBhc3N0aHJvdWdoLCByZWR1Y2VyKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VPcHRpbWlzdGljKHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlUmVkdWNlciA9IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VSZWYgPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlU3RhdGUgPSBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IGZ1bmN0aW9uIChcbiAgICAgIHN1YnNjcmliZSxcbiAgICAgIGdldFNuYXBzaG90LFxuICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICApIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZVRyYW5zaXRpb24oKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudmVyc2lvbiA9IFwiMTkuMC4wLXJjLWZiOWE5MGZhNDgtMjAyNDA2MTRcIjtcbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChFcnJvcigpKTtcbiAgfSkoKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICBhcmdzID0gQXJyYXkoMSA8IF9sZW4yID8gX2xlbjIgLSAxIDogMCksXG4gICAgICAgICAgX2tleTIgPSAxO1xuICAgICAgICBfa2V5MiA8IF9sZW4yO1xuICAgICAgICBfa2V5MisrXG4gICAgICApXG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICBfbGVuMiA9IGZvcm1hdDtcbiAgICAgIF9rZXkyID0gRXJyb3IoXCJyZWFjdC1zdGFjay10b3AtZnJhbWVcIik7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgJiZcbiAgICAgICAgKChfa2V5MiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayhfa2V5MikpLFxuICAgICAgICBcIlwiICE9PSBfa2V5MiAmJiAoKF9sZW4yICs9IFwiJXNcIiksIChhcmdzID0gYXJncy5jb25jYXQoW19rZXkyXSkpKSk7XG4gICAgICBhcmdzLnVuc2hpZnQoX2xlbjIpO1xuICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5lcnJvciwgY29uc29sZSwgYXJncyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gICAgICBpZiAobnVsbCA9PSB0eXBlKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICByZXR1cm4gdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQyXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlKSByZXR1cm4gdHlwZTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiRnJhZ21lbnRcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJQb3J0YWxcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlByb2ZpbGVyXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdHJpY3RNb2RlXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdXNwZW5zZVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdXNwZW5zZUxpc3RcIjtcbiAgICAgIH1cbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSlcbiAgICAgICAgc3dpdGNoIChcbiAgICAgICAgICAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIHR5cGUudGFnICYmXG4gICAgICAgICAgICBlcnJvcihcbiAgICAgICAgICAgICAgXCJSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgIHR5cGUuJCR0eXBlb2YpXG4gICAgICAgICkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuICh0eXBlLmRpc3BsYXlOYW1lIHx8IFwiQ29udGV4dFwiKSArIFwiLlByb3ZpZGVyXCI7XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05TVU1FUl9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuICh0eXBlLl9jb250ZXh0LmRpc3BsYXlOYW1lIHx8IFwiQ29udGV4dFwiKSArIFwiLkNvbnN1bWVyXCI7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgdmFyIGlubmVyVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGUuZGlzcGxheU5hbWU7XG4gICAgICAgICAgICB0eXBlIHx8XG4gICAgICAgICAgICAgICgodHlwZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCBcIlwiKSxcbiAgICAgICAgICAgICAgKHR5cGUgPSBcIlwiICE9PSB0eXBlID8gXCJGb3J3YXJkUmVmKFwiICsgdHlwZSArIFwiKVwiIDogXCJGb3J3YXJkUmVmXCIpKTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGlubmVyVHlwZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbCksXG4gICAgICAgICAgICAgIG51bGwgIT09IGlubmVyVHlwZVxuICAgICAgICAgICAgICAgID8gaW5uZXJUeXBlXG4gICAgICAgICAgICAgICAgOiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCBcIk1lbW9cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgIGlubmVyVHlwZSA9IHR5cGUuX3BheWxvYWQ7XG4gICAgICAgICAgICB0eXBlID0gdHlwZS5faW5pdDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZShpbm5lclR5cGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBcIlwiICsgdmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICAgIHZhciBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSAhMTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gITA7XG4gICAgICB9XG4gICAgICBpZiAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJlxuICAgICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcgJiZcbiAgICAgICAgICAgICAgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkgfHxcbiAgICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHxcbiAgICAgICAgICAgIFwiT2JqZWN0XCIpLFxuICAgICAgICAgIGVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLlwiLFxuICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0XG4gICAgICAgICAgKSxcbiAgICAgICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cbiAgICBmdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAgICAgIGlmICgwID09PSBkaXNhYmxlZERlcHRoKSB7XG4gICAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kO1xuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpc2FibGVkRGVwdGgrKztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICAgICAgZGlzYWJsZWREZXB0aC0tO1xuICAgICAgaWYgKDAgPT09IGRpc2FibGVkRGVwdGgpIHtcbiAgICAgICAgdmFyIHByb3BzID0geyBjb25maWd1cmFibGU6ICEwLCBlbnVtZXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZMb2cgfSksXG4gICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkluZm8gfSksXG4gICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldldhcm4gfSksXG4gICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZFcnJvciB9KSxcbiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkdyb3VwIH0pLFxuICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQgfSksXG4gICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZHcm91cEVuZCB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIDAgPiBkaXNhYmxlZERlcHRoICYmXG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIFwiZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHByZWZpeClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgICBwcmVmaXggPSAobWF0Y2ggJiYgbWF0Y2hbMV0pIHx8IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBcIlxcblwiICsgcHJlZml4ICsgbmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gICAgICBpZiAoIWZuIHx8IHJlZW50cnkpIHJldHVybiBcIlwiO1xuICAgICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuICAgICAgaWYgKHZvaWQgMCAhPT0gZnJhbWUpIHJldHVybiBmcmFtZTtcbiAgICAgIHJlZW50cnkgPSAhMDtcbiAgICAgIGZyYW1lID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcmV2aW91c0Rpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBudWxsO1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcbiAgICAgIHZhciBSdW5JblJvb3RGcmFtZSA9IHtcbiAgICAgICAgRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgICAgICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCBcInByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBSZWZsZWN0ICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHgkMCkge1xuICAgICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoeCQxKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAoRmFrZSA9IGZuKCkpICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgRmFrZS5jYXRjaCAmJlxuICAgICAgICAgICAgICAgIEZha2UuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgICAgICAgICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIFwic3RyaW5nXCIgPT09IHR5cGVvZiBzYW1wbGUuc3RhY2spXG4gICAgICAgICAgICAgIHJldHVybiBbc2FtcGxlLnN0YWNrLCBjb250cm9sLnN0YWNrXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdC5kaXNwbGF5TmFtZSA9XG4gICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCI7XG4gICAgICB2YXIgbmFtZVByb3BEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LFxuICAgICAgICBcIm5hbWVcIlxuICAgICAgKTtcbiAgICAgIG5hbWVQcm9wRGVzY3JpcHRvciAmJlxuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsXG4gICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgeyB2YWx1ZTogXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIiB9XG4gICAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgX1J1bkluUm9vdEZyYW1lJERldGVyID1cbiAgICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCgpLFxuICAgICAgICAgIHNhbXBsZVN0YWNrID0gX1J1bkluUm9vdEZyYW1lJERldGVyWzBdLFxuICAgICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcbiAgICAgICAgaWYgKHNhbXBsZVN0YWNrICYmIGNvbnRyb2xTdGFjaykge1xuICAgICAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuICAgICAgICAgICAgY29udHJvbExpbmVzID0gY29udHJvbFN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBzYW1wbGVTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlciA9IDA7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPCBzYW1wbGVMaW5lcy5sZW5ndGggJiZcbiAgICAgICAgICAgICFzYW1wbGVMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICBcIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdFwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgKVxuICAgICAgICAgICAgX1J1bkluUm9vdEZyYW1lJERldGVyKys7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIHNhbXBsZVN0YWNrIDwgY29udHJvbExpbmVzLmxlbmd0aCAmJlxuICAgICAgICAgICAgIWNvbnRyb2xMaW5lc1tzYW1wbGVTdGFja10uaW5jbHVkZXMoXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIik7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICBzYW1wbGVTdGFjaysrO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9PT0gc2FtcGxlTGluZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBzYW1wbGVTdGFjayA9PT0gY29udHJvbExpbmVzLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgc2FtcGxlU3RhY2sgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgMSA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgJiZcbiAgICAgICAgICAgICAgMCA8PSBzYW1wbGVTdGFjayAmJlxuICAgICAgICAgICAgICBzYW1wbGVMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdICE9PSBjb250cm9sTGluZXNbc2FtcGxlU3RhY2tdO1xuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNhbXBsZVN0YWNrLS07XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIDEgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyICYmIDAgPD0gc2FtcGxlU3RhY2s7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXItLSwgc2FtcGxlU3RhY2stLVxuICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc2FtcGxlTGluZXNbX1J1bkluUm9vdEZyYW1lJERldGVyXSAhPT0gY29udHJvbExpbmVzW3NhbXBsZVN0YWNrXVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICgxICE9PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgfHwgMSAhPT0gc2FtcGxlU3RhY2spIHtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoX1J1bkluUm9vdEZyYW1lJERldGVyLS0sXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZVN0YWNrLS0sXG4gICAgICAgICAgICAgICAgICAgIDAgPiBzYW1wbGVTdGFjayB8fFxuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sTGluZXNbc2FtcGxlU3RhY2tdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IG5ldyBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IFwiXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm4uZGlzcGxheU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfZnJhbWUuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChfZnJhbWUgPSBfZnJhbWUucmVwbGFjZShcIjxhbm9ueW1vdXM+XCIsIGZuLmRpc3BsYXlOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGZuICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyICYmIDAgPD0gc2FtcGxlU3RhY2spO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAocmVlbnRyeSA9ICExKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZpb3VzRGlzcGF0Y2hlciksXG4gICAgICAgICAgcmVlbmFibGVMb2dzKCksXG4gICAgICAgICAgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gZnJhbWUpO1xuICAgICAgfVxuICAgICAgc2FtcGxlTGluZXMgPSAoc2FtcGxlTGluZXMgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiBcIlwiKVxuICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHNhbXBsZUxpbmVzKVxuICAgICAgICA6IFwiXCI7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBmbiAmJiBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc2FtcGxlTGluZXMpO1xuICAgICAgcmV0dXJuIHNhbXBsZUxpbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSkge1xuICAgICAgaWYgKG51bGwgPT0gdHlwZSkgcmV0dXJuIFwiXCI7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSkge1xuICAgICAgICB2YXIgcHJvdG90eXBlID0gdHlwZS5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgISghcHJvdG90eXBlIHx8ICFwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZVwiKTtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKFwiU3VzcGVuc2VMaXN0XCIpO1xuICAgICAgfVxuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUgPSBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyLCAhMSkpLCB0eXBlO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUpO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgcHJvdG90eXBlID0gdHlwZS5fcGF5bG9hZDtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLl9pbml0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlKHByb3RvdHlwZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE93bmVyKCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5BO1xuICAgICAgcmV0dXJuIG51bGwgPT09IGRpc3BhdGNoZXIgPyBudWxsIDogZGlzcGF0Y2hlci5nZXRPd25lcigpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJyZWZcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcInJlZlwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcucmVmO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJrZXlcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcImtleVwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcua2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHdhcm5BYm91dEFjY2Vzc2luZ0tleSgpIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gfHxcbiAgICAgICAgICAoKHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gITApLFxuICAgICAgICAgIGVycm9yKFxuICAgICAgICAgICAgXCIlczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lIHZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgcHJvcC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvc3BlY2lhbC1wcm9wcylcIixcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSAhMDtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgXCJrZXlcIiwge1xuICAgICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVsZW1lbnRSZWZHZXR0ZXJXaXRoRGVwcmVjYXRpb25XYXJuaW5nKCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodGhpcy50eXBlKTtcbiAgICAgIGRpZFdhcm5BYm91dEVsZW1lbnRSZWZbY29tcG9uZW50TmFtZV0gfHxcbiAgICAgICAgKChkaWRXYXJuQWJvdXRFbGVtZW50UmVmW2NvbXBvbmVudE5hbWVdID0gITApLFxuICAgICAgICBlcnJvcihcbiAgICAgICAgICBcIkFjY2Vzc2luZyBlbGVtZW50LnJlZiB3YXMgcmVtb3ZlZCBpbiBSZWFjdCAxOS4gcmVmIGlzIG5vdyBhIHJlZ3VsYXIgcHJvcC4gSXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIEpTWCBFbGVtZW50IHR5cGUgaW4gYSBmdXR1cmUgcmVsZWFzZS5cIlxuICAgICAgICApKTtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSB0aGlzLnByb3BzLnJlZjtcbiAgICAgIHJldHVybiB2b2lkIDAgIT09IGNvbXBvbmVudE5hbWUgPyBjb21wb25lbnROYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgX3JlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgICAgIF9yZWYgPSBwcm9wcy5yZWY7XG4gICAgICB0eXBlID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICBfb3duZXI6IG93bmVyXG4gICAgICB9O1xuICAgICAgbnVsbCAhPT0gKHZvaWQgMCAhPT0gX3JlZiA/IF9yZWYgOiBudWxsKVxuICAgICAgICA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgICAgIGdldDogZWxlbWVudFJlZkdldHRlcldpdGhEZXByZWNhdGlvbldhcm5pbmdcbiAgICAgICAgICB9KVxuICAgICAgICA6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7IGVudW1lcmFibGU6ICExLCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgIHR5cGUuX3N0b3JlID0ge307XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZS5fc3RvcmUsIFwidmFsaWRhdGVkXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMSxcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIFwiX2RlYnVnSW5mb1wiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITEsXG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBudWxsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5mcmVlemUgJiYgKE9iamVjdC5mcmVlemUodHlwZS5wcm9wcyksIE9iamVjdC5mcmVlemUodHlwZSkpO1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGpzeERFVkltcGwoXG4gICAgICB0eXBlLFxuICAgICAgY29uZmlnLFxuICAgICAgbWF5YmVLZXksXG4gICAgICBpc1N0YXRpY0NoaWxkcmVuLFxuICAgICAgc291cmNlLFxuICAgICAgc2VsZlxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fFxuICAgICAgICB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8XG4gICAgICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICAgIG51bGwgIT09IHR5cGUgJiZcbiAgICAgICAgICAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8XG4gICAgICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHxcbiAgICAgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxIHx8XG4gICAgICAgICAgICB2b2lkIDAgIT09IHR5cGUuZ2V0TW9kdWxlSWQpKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGNvbmZpZy5jaGlsZHJlbjtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gY2hpbGRyZW4pXG4gICAgICAgICAgaWYgKGlzU3RhdGljQ2hpbGRyZW4pXG4gICAgICAgICAgICBpZiAoaXNBcnJheUltcGwoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgaXNTdGF0aWNDaGlsZHJlbiA9IDA7XG4gICAgICAgICAgICAgICAgaXNTdGF0aWNDaGlsZHJlbiA8IGNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpc1N0YXRpY0NoaWxkcmVuKytcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuW2lzU3RhdGljQ2hpbGRyZW5dLCB0eXBlKTtcbiAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICBlcnJvcihcbiAgICAgICAgICAgICAgICBcIlJlYWN0LmpzeDogU3RhdGljIGNoaWxkcmVuIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXkuIFlvdSBhcmUgbGlrZWx5IGV4cGxpY2l0bHkgY2FsbGluZyBSZWFjdC5qc3hzIG9yIFJlYWN0LmpzeERFVi4gVXNlIHRoZSBCYWJlbCB0cmFuc2Zvcm0gaW5zdGVhZC5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIGVsc2UgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4sIHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW4gPSBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdm9pZCAwID09PSB0eXBlIHx8XG4gICAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAwID09PSBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGgpXG4gICAgICAgIClcbiAgICAgICAgICBjaGlsZHJlbiArPVxuICAgICAgICAgICAgXCIgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgICAgICBudWxsID09PSB0eXBlXG4gICAgICAgICAgPyAoaXNTdGF0aWNDaGlsZHJlbiA9IFwibnVsbFwiKVxuICAgICAgICAgIDogaXNBcnJheUltcGwodHlwZSlcbiAgICAgICAgICA/IChpc1N0YXRpY0NoaWxkcmVuID0gXCJhcnJheVwiKVxuICAgICAgICAgIDogdm9pZCAwICE9PSB0eXBlICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuICAgICAgICAgID8gKChpc1N0YXRpY0NoaWxkcmVuID1cbiAgICAgICAgICAgICAgXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgXCJVbmtub3duXCIpICsgXCIgLz5cIiksXG4gICAgICAgICAgICAoY2hpbGRyZW4gPVxuICAgICAgICAgICAgICBcIiBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50P1wiKSlcbiAgICAgICAgICA6IChpc1N0YXRpY0NoaWxkcmVuID0gdHlwZW9mIHR5cGUpO1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBcIlJlYWN0LmpzeDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiAlcy4lc1wiLFxuICAgICAgICAgIGlzU3RhdGljQ2hpbGRyZW4sXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJrZXlcIikpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29uZmlnKS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICByZXR1cm4gXCJrZXlcIiAhPT0gaztcbiAgICAgICAgfSk7XG4gICAgICAgIGlzU3RhdGljQ2hpbGRyZW4gPVxuICAgICAgICAgIDAgPCBrZXlzLmxlbmd0aFxuICAgICAgICAgICAgPyBcIntrZXk6IHNvbWVLZXksIFwiICsga2V5cy5qb2luKFwiOiAuLi4sIFwiKSArIFwiOiAuLi59XCJcbiAgICAgICAgICAgIDogXCJ7a2V5OiBzb21lS2V5fVwiO1xuICAgICAgICBkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY2hpbGRyZW4gKyBpc1N0YXRpY0NoaWxkcmVuXSB8fFxuICAgICAgICAgICgoa2V5cyA9XG4gICAgICAgICAgICAwIDwga2V5cy5sZW5ndGggPyBcIntcIiArIGtleXMuam9pbihcIjogLi4uLCBcIikgKyBcIjogLi4ufVwiIDogXCJ7fVwiKSxcbiAgICAgICAgICBlcnJvcihcbiAgICAgICAgICAgICdBIHByb3BzIG9iamVjdCBjb250YWluaW5nIGEgXCJrZXlcIiBwcm9wIGlzIGJlaW5nIHNwcmVhZCBpbnRvIEpTWDpcXG4gIGxldCBwcm9wcyA9ICVzO1xcbiAgPCVzIHsuLi5wcm9wc30gLz5cXG5SZWFjdCBrZXlzIG11c3QgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEpTWCB3aXRob3V0IHVzaW5nIHNwcmVhZDpcXG4gIGxldCBwcm9wcyA9ICVzO1xcbiAgPCVzIGtleT17c29tZUtleX0gey4uLnByb3BzfSAvPicsXG4gICAgICAgICAgICBpc1N0YXRpY0NoaWxkcmVuLFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICApLFxuICAgICAgICAgIChkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY2hpbGRyZW4gKyBpc1N0YXRpY0NoaWxkcmVuXSA9ICEwKSk7XG4gICAgICB9XG4gICAgICBjaGlsZHJlbiA9IG51bGw7XG4gICAgICB2b2lkIDAgIT09IG1heWJlS2V5ICYmXG4gICAgICAgIChjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1heWJlS2V5KSwgKGNoaWxkcmVuID0gXCJcIiArIG1heWJlS2V5KSk7XG4gICAgICBoYXNWYWxpZEtleShjb25maWcpICYmXG4gICAgICAgIChjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpLCAoY2hpbGRyZW4gPSBcIlwiICsgY29uZmlnLmtleSkpO1xuICAgICAgaGFzVmFsaWRSZWYoY29uZmlnKTtcbiAgICAgIGlmIChcImtleVwiIGluIGNvbmZpZykge1xuICAgICAgICBtYXliZUtleSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBjb25maWcpXG4gICAgICAgICAgXCJrZXlcIiAhPT0gcHJvcE5hbWUgJiYgKG1heWJlS2V5W3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV0pO1xuICAgICAgfSBlbHNlIG1heWJlS2V5ID0gY29uZmlnO1xuICAgICAgY2hpbGRyZW4gJiZcbiAgICAgICAgKChjb25maWcgPVxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGVcbiAgICAgICAgICAgID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgXCJVbmtub3duXCJcbiAgICAgICAgICAgIDogdHlwZSksXG4gICAgICAgIGNoaWxkcmVuICYmIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKG1heWJlS2V5LCBjb25maWcpKTtcbiAgICAgIHJldHVybiBSZWFjdEVsZW1lbnQoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBudWxsLFxuICAgICAgICBzZWxmLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGdldE93bmVyKCksXG4gICAgICAgIG1heWJlS2V5XG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBub2RlICYmXG4gICAgICAgIG5vZGUgJiZcbiAgICAgICAgbm9kZS4kJHR5cGVvZiAhPT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRVxuICAgICAgKVxuICAgICAgICBpZiAoaXNBcnJheUltcGwobm9kZSkpXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuICAgICAgICAgICAgaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpXG4gICAgICAgICAgbm9kZS5fc3RvcmUgJiYgKG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IDEpO1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAobnVsbCA9PT0gbm9kZSB8fCBcIm9iamVjdFwiICE9PSB0eXBlb2Ygbm9kZVxuICAgICAgICAgICAgPyAoaSA9IG51bGwpXG4gICAgICAgICAgICA6ICgoaSA9XG4gICAgICAgICAgICAgICAgKE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBub2RlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0pIHx8XG4gICAgICAgICAgICAgICAgbm9kZVtcIkBAaXRlcmF0b3JcIl0pLFxuICAgICAgICAgICAgICAoaSA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGkgPyBpIDogbnVsbCkpLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGkgJiZcbiAgICAgICAgICAgIGkgIT09IG5vZGUuZW50cmllcyAmJlxuICAgICAgICAgICAgKChpID0gaS5jYWxsKG5vZGUpKSwgaSAhPT0gbm9kZSkpXG4gICAgICAgIClcbiAgICAgICAgICBmb3IgKDsgIShub2RlID0gaS5uZXh0KCkpLmRvbmU7IClcbiAgICAgICAgICAgIGlzVmFsaWRFbGVtZW50KG5vZGUudmFsdWUpICYmXG4gICAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkobm9kZS52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9iamVjdCAmJlxuICAgICAgICBudWxsICE9PSBvYmplY3QgJiZcbiAgICAgICAgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50Ll9zdG9yZSAmJlxuICAgICAgICAhZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkICYmXG4gICAgICAgIG51bGwgPT0gZWxlbWVudC5rZXkgJiZcbiAgICAgICAgKChlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSAxKSxcbiAgICAgICAgKHBhcmVudFR5cGUgPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpKSxcbiAgICAgICAgIW93bmVySGFzS2V5VXNlV2FybmluZ1twYXJlbnRUeXBlXSlcbiAgICAgICkge1xuICAgICAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbcGFyZW50VHlwZV0gPSAhMDtcbiAgICAgICAgdmFyIGNoaWxkT3duZXIgPSBcIlwiO1xuICAgICAgICBlbGVtZW50ICYmXG4gICAgICAgICAgbnVsbCAhPSBlbGVtZW50Ll9vd25lciAmJlxuICAgICAgICAgIGVsZW1lbnQuX293bmVyICE9PSBnZXRPd25lcigpICYmXG4gICAgICAgICAgKChjaGlsZE93bmVyID0gbnVsbCksXG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIGVsZW1lbnQuX293bmVyLnRhZ1xuICAgICAgICAgICAgPyAoY2hpbGRPd25lciA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSlcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVsZW1lbnQuX293bmVyLm5hbWUgJiZcbiAgICAgICAgICAgICAgKGNoaWxkT3duZXIgPSBlbGVtZW50Ll9vd25lci5uYW1lKSxcbiAgICAgICAgICAoY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgY2hpbGRPd25lciArIFwiLlwiKSk7XG4gICAgICAgIHZhciBwcmV2R2V0Q3VycmVudFN0YWNrID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuZ2V0Q3VycmVudFN0YWNrO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSk7XG4gICAgICAgICAgcHJldkdldEN1cnJlbnRTdGFjayAmJiAoc3RhY2sgKz0gcHJldkdldEN1cnJlbnRTdGFjaygpIHx8IFwiXCIpO1xuICAgICAgICAgIHJldHVybiBzdGFjaztcbiAgICAgICAgfTtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4lcyVzIFNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgY2hpbGRPd25lclxuICAgICAgICApO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPSBwcmV2R2V0Q3VycmVudFN0YWNrO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgICAgIHZhciBpbmZvID0gXCJcIixcbiAgICAgICAgb3duZXIgPSBnZXRPd25lcigpO1xuICAgICAgb3duZXIgJiZcbiAgICAgICAgKG93bmVyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG93bmVyLnR5cGUpKSAmJlxuICAgICAgICAoaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYFwiICsgb3duZXIgKyBcImAuXCIpO1xuICAgICAgaW5mbyB8fFxuICAgICAgICAoKHBhcmVudFR5cGUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUocGFyZW50VHlwZSkpICYmXG4gICAgICAgICAgKGluZm8gPVxuICAgICAgICAgICAgXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudFR5cGUgKyBcIj4uXCIpKTtcbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cbiAgICB2YXIgUmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIiksXG4gICAgICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnRcIiksXG4gICAgICBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIiksXG4gICAgICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLFxuICAgICAgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSxcbiAgICAgIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIik7XG4gICAgU3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpO1xuICAgIHZhciBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuICAgICAgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIiksXG4gICAgICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpLFxuICAgICAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcbiAgICAgIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpLFxuICAgICAgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIiksXG4gICAgICBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSxcbiAgICAgIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm9mZnNjcmVlblwiKSxcbiAgICAgIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcixcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzID1cbiAgICAgICAgUmVhY3QuX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFLFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQyID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIiksXG4gICAgICBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG4gICAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduLFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIiksXG4gICAgICBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXksXG4gICAgICBkaXNhYmxlZERlcHRoID0gMCxcbiAgICAgIHByZXZMb2csXG4gICAgICBwcmV2SW5mbyxcbiAgICAgIHByZXZXYXJuLFxuICAgICAgcHJldkVycm9yLFxuICAgICAgcHJldkdyb3VwLFxuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkLFxuICAgICAgcHJldkdyb3VwRW5kO1xuICAgIGRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9ICEwO1xuICAgIHZhciBwcmVmaXgsXG4gICAgICByZWVudHJ5ID0gITE7XG4gICAgdmFyIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgKFxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXBcbiAgICApKCk7XG4gICAgdmFyIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKSxcbiAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duO1xuICAgIHZhciBkaWRXYXJuQWJvdXRFbGVtZW50UmVmID0ge307XG4gICAgdmFyIGRpZFdhcm5BYm91dEtleVNwcmVhZCA9IHt9LFxuICAgICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG4gICAgZXhwb3J0cy5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG4gICAgZXhwb3J0cy5qc3hERVYgPSBmdW5jdGlvbiAoXG4gICAgICB0eXBlLFxuICAgICAgY29uZmlnLFxuICAgICAgbWF5YmVLZXksXG4gICAgICBpc1N0YXRpY0NoaWxkcmVuLFxuICAgICAgc291cmNlLFxuICAgICAgc2VsZlxuICAgICkge1xuICAgICAgcmV0dXJuIGpzeERFVkltcGwodHlwZSwgY29uZmlnLCBtYXliZUtleSwgaXNTdGF0aWNDaGlsZHJlbiwgc291cmNlLCBzZWxmKTtcbiAgICB9O1xuICB9KSgpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBJcyB0aGlzIHZhbHVlIGRlZmluZWQgYW5kIG5vdCBudWxsP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnICYmIHZhbCAhPT0gbnVsbDtcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSBhbiBvYmplY3Q/XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBvYmplY3QgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSBhIHBsYWluIG9iamVjdD9cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHBsYWluT2JqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufTtcblxuLyoqXG4gKiBJcyB0aGlzIHZhbHVlIGEgZnVuY3Rpb24/XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBmbiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbic7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgYSBib29sZWFuP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgYm9vbCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdib29sZWFuJztcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSBhIEJ1ZmZlciBvYmplY3Q/XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBidWZmZXIgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBCdWZmZXI7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgYSB0eXBlZCBhcnJheSBvYmplY3Q/LiBFLmcuIFVpbnQ4QXJyYXkgb3IgVWludDhDbGFtcGVkQXJyYXk/XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB0eXBlZEFycmF5ID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAoZGVmaW5lZCh2YWwpKSB7XG4gICAgc3dpdGNoICh2YWwuY29uc3RydWN0b3IpIHtcbiAgICAgIGNhc2UgVWludDhBcnJheTpcbiAgICAgIGNhc2UgVWludDhDbGFtcGVkQXJyYXk6XG4gICAgICBjYXNlIEludDhBcnJheTpcbiAgICAgIGNhc2UgVWludDE2QXJyYXk6XG4gICAgICBjYXNlIEludDE2QXJyYXk6XG4gICAgICBjYXNlIFVpbnQzMkFycmF5OlxuICAgICAgY2FzZSBJbnQzMkFycmF5OlxuICAgICAgY2FzZSBGbG9hdDMyQXJyYXk6XG4gICAgICBjYXNlIEZsb2F0NjRBcnJheTpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBJcyB0aGlzIHZhbHVlIGFuIEFycmF5QnVmZmVyIG9iamVjdD9cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGFycmF5QnVmZmVyID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgYSBub24tZW1wdHkgc3RyaW5nP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgc3RyaW5nID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDA7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgYSByZWFsIG51bWJlcj9cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IG51bWJlciA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odmFsKTtcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSBhbiBpbnRlZ2VyP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgaW50ZWdlciA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsKTtcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSB3aXRoaW4gYW4gaW5jbHVzaXZlIGdpdmVuIHJhbmdlP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgaW5SYW5nZSA9IGZ1bmN0aW9uICh2YWwsIG1pbiwgbWF4KSB7XG4gIHJldHVybiB2YWwgPj0gbWluICYmIHZhbCA8PSBtYXg7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgd2l0aGluIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheT9cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGluQXJyYXkgPSBmdW5jdGlvbiAodmFsLCBsaXN0KSB7XG4gIHJldHVybiBsaXN0LmluY2x1ZGVzKHZhbCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIGEgbWVzc2FnZSByZWxhdGluZyB0byBhbiBpbnZhbGlkIHBhcmFtZXRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHBhcmFtZXRlciBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkIC0gZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUvdmFsdWUvcmFuZ2UgZXhwZWN0ZWQuXG4gKiBAcGFyYW0geyp9IGFjdHVhbCAtIHRoZSB2YWx1ZSByZWNlaXZlZC5cbiAqIEByZXR1cm5zIHtFcnJvcn0gQ29udGFpbmluZyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBpbnZhbGlkUGFyYW1ldGVyRXJyb3IgPSBmdW5jdGlvbiAobmFtZSwgZXhwZWN0ZWQsIGFjdHVhbCkge1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBFeHBlY3RlZCAke2V4cGVjdGVkfSBmb3IgJHtuYW1lfSBidXQgcmVjZWl2ZWQgJHthY3R1YWx9IG9mIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWBcbiAgKTtcbn07XG5cbi8qKlxuICogRW5zdXJlcyBhbiBFcnJvciBmcm9tIEMrKyBjb250YWlucyBhIEpTIHN0YWNrLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IG5hdGl2ZSAtIEVycm9yIHdpdGggbWVzc2FnZSBmcm9tIEMrKy5cbiAqIEBwYXJhbSB7RXJyb3J9IGNvbnRleHQgLSBFcnJvciB3aXRoIHN0YWNrIGZyb20gSlMuXG4gKiBAcmV0dXJucyB7RXJyb3J9IEVycm9yIHdpdGggbWVzc2FnZSBhbmQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBuYXRpdmVFcnJvciA9IGZ1bmN0aW9uIChuYXRpdmUsIGNvbnRleHQpIHtcbiAgY29udGV4dC5tZXNzYWdlID0gbmF0aXZlLm1lc3NhZ2U7XG4gIHJldHVybiBjb250ZXh0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlZmluZWQsXG4gIG9iamVjdCxcbiAgcGxhaW5PYmplY3QsXG4gIGZuLFxuICBib29sLFxuICBidWZmZXIsXG4gIHR5cGVkQXJyYXksXG4gIGFycmF5QnVmZmVyLFxuICBzdHJpbmcsXG4gIG51bWJlcixcbiAgaW50ZWdlcixcbiAgaW5SYW5nZSxcbiAgaW5BcnJheSxcbiAgaW52YWxpZFBhcmFtZXRlckVycm9yLFxuICBuYXRpdmVFcnJvclxufTtcbiIsCiAgICAiY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwKICAgICIvLyBOb3RlOiB0aGlzIGlzIHRoZSBzZW12ZXIub3JnIHZlcnNpb24gb2YgdGhlIHNwZWMgdGhhdCBpdCBpbXBsZW1lbnRzXG4vLyBOb3QgbmVjZXNzYXJpbHkgdGhlIHBhY2thZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUuXG5jb25zdCBTRU1WRVJfU1BFQ19WRVJTSU9OID0gJzIuMC4wJ1xuXG5jb25zdCBNQVhfTEVOR1RIID0gMjU2XG5jb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHxcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIDkwMDcxOTkyNTQ3NDA5OTFcblxuLy8gTWF4IHNhZmUgc2VnbWVudCBsZW5ndGggZm9yIGNvZXJjaW9uLlxuY29uc3QgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCA9IDE2XG5cbi8vIE1heCBzYWZlIGxlbmd0aCBmb3IgYSBidWlsZCBpZGVudGlmaWVyLiBUaGUgbWF4IGxlbmd0aCBtaW51cyA2IGNoYXJhY3RlcnMgZm9yXG4vLyB0aGUgc2hvcnRlc3QgdmVyc2lvbiB3aXRoIGEgYnVpbGQgMC4wLjArQlVJTEQuXG5jb25zdCBNQVhfU0FGRV9CVUlMRF9MRU5HVEggPSBNQVhfTEVOR1RIIC0gNlxuXG5jb25zdCBSRUxFQVNFX1RZUEVTID0gW1xuICAnbWFqb3InLFxuICAncHJlbWFqb3InLFxuICAnbWlub3InLFxuICAncHJlbWlub3InLFxuICAncGF0Y2gnLFxuICAncHJlcGF0Y2gnLFxuICAncHJlcmVsZWFzZScsXG5dXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RILFxuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9TQUZFX0lOVEVHRVIsXG4gIFJFTEVBU0VfVFlQRVMsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT04sXG4gIEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFOiAwYjAwMSxcbiAgRkxBR19MT09TRTogMGIwMTAsXG59XG4iLAogICAgImNvbnN0IHtcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfTEVOR1RILFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi9kZWJ1ZycpXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB7fVxuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxuY29uc3QgcmUgPSBleHBvcnRzLnJlID0gW11cbmNvbnN0IHNhZmVSZSA9IGV4cG9ydHMuc2FmZVJlID0gW11cbmNvbnN0IHNyYyA9IGV4cG9ydHMuc3JjID0gW11cbmNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fVxubGV0IFIgPSAwXG5cbmNvbnN0IExFVFRFUkRBU0hOVU1CRVIgPSAnW2EtekEtWjAtOS1dJ1xuXG4vLyBSZXBsYWNlIHNvbWUgZ3JlZWR5IHJlZ2V4IHRva2VucyB0byBwcmV2ZW50IHJlZ2V4IGRvcyBpc3N1ZXMuIFRoZXNlIHJlZ2V4IGFyZVxuLy8gdXNlZCBpbnRlcm5hbGx5IHZpYSB0aGUgc2FmZVJlIG9iamVjdCBzaW5jZSBhbGwgaW5wdXRzIGluIHRoaXMgbGlicmFyeSBnZXRcbi8vIG5vcm1hbGl6ZWQgZmlyc3QgdG8gdHJpbSBhbmQgY29sbGFwc2UgYWxsIGV4dHJhIHdoaXRlc3BhY2UuIFRoZSBvcmlnaW5hbFxuLy8gcmVnZXhlcyBhcmUgZXhwb3J0ZWQgZm9yIHVzZXJsYW5kIGNvbnN1bXB0aW9uIGFuZCBsb3dlciBsZXZlbCB1c2FnZS4gQVxuLy8gZnV0dXJlIGJyZWFraW5nIGNoYW5nZSBjb3VsZCBleHBvcnQgdGhlIHNhZmVyIHJlZ2V4IG9ubHkgd2l0aCBhIG5vdGUgdGhhdFxuLy8gYWxsIGlucHV0IHNob3VsZCBoYXZlIGV4dHJhIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbmNvbnN0IHNhZmVSZWdleFJlcGxhY2VtZW50cyA9IFtcbiAgWydcXFxccycsIDFdLFxuICBbJ1xcXFxkJywgTUFYX0xFTkdUSF0sXG4gIFtMRVRURVJEQVNITlVNQkVSLCBNQVhfU0FGRV9CVUlMRF9MRU5HVEhdLFxuXVxuXG5jb25zdCBtYWtlU2FmZVJlZ2V4ID0gKHZhbHVlKSA9PiB7XG4gIGZvciAoY29uc3QgW3Rva2VuLCBtYXhdIG9mIHNhZmVSZWdleFJlcGxhY2VtZW50cykge1xuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0qYCkuam9pbihgJHt0b2tlbn17MCwke21heH19YClcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0rYCkuam9pbihgJHt0b2tlbn17MSwke21heH19YClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgY3JlYXRlVG9rZW4gPSAobmFtZSwgdmFsdWUsIGlzR2xvYmFsKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSBtYWtlU2FmZVJlZ2V4KHZhbHVlKVxuICBjb25zdCBpbmRleCA9IFIrK1xuICBkZWJ1ZyhuYW1lLCBpbmRleCwgdmFsdWUpXG4gIHRbbmFtZV0gPSBpbmRleFxuICBzcmNbaW5kZXhdID0gdmFsdWVcbiAgcmVbaW5kZXhdID0gbmV3IFJlZ0V4cCh2YWx1ZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG4gIHNhZmVSZVtpbmRleF0gPSBuZXcgUmVnRXhwKHNhZmUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVInLCAnMHxbMS05XVxcXFxkKicpXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVJMT09TRScsICdcXFxcZCsnKVxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignTk9OTlVNRVJJQ0lERU5USUZJRVInLCBgXFxcXGQqW2EtekEtWi1dJHtMRVRURVJEQVNITlVNQkVSfSpgKVxuXG4vLyAjIyBNYWluIFZlcnNpb25cbi8vIFRocmVlIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTkxPT1NFJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUicsIGAoPzoke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UnLCBgKD86JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXVxufXwke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuLy8gSHlwaGVuLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkb3Qtc2VwYXJhdGVkIHByZS1yZWxlYXNlIHZlcnNpb25cbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRScsIGAoPzotKCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXX0pKikpYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VMT09TRScsIGAoPzotPygke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdfSkqKSlgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignQlVJTERJREVOVElGSUVSJywgYCR7TEVUVEVSREFTSE5VTUJFUn0rYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGFcbi8vIFBsdXMgc2lnbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGVyaW9kLXNlcGFyYXRlZCBidWlsZCBtZXRhZGF0YVxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRCcsIGAoPzpcXFxcKygke3NyY1t0LkJVSUxESURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuQlVJTERJREVOVElGSUVSXX0pKikpYClcblxuLy8gIyMgRnVsbCBWZXJzaW9uIFN0cmluZ1xuLy8gQSBtYWluIHZlcnNpb24sIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uIGFuZFxuLy8gYnVpbGQgbWV0YWRhdGEuXG5cbi8vIE5vdGUgdGhhdCB0aGUgb25seSBtYWpvciwgbWlub3IsIHBhdGNoLCBhbmQgcHJlLXJlbGVhc2Ugc2VjdGlvbnMgb2Zcbi8vIHRoZSB2ZXJzaW9uIHN0cmluZyBhcmUgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZSBidWlsZCBtZXRhZGF0YSBpcyBub3QgYVxuLy8gY2FwdHVyaW5nIGdyb3VwLCBiZWNhdXNlIGl0IHNob3VsZCBub3QgZXZlciBiZSB1c2VkIGluIHZlcnNpb25cbi8vIGNvbXBhcmlzb24uXG5cbmNyZWF0ZVRva2VuKCdGVUxMUExBSU4nLCBgdj8ke3NyY1t0Lk1BSU5WRVJTSU9OXVxufSR7c3JjW3QuUFJFUkVMRUFTRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0ZVTEwnLCBgXiR7c3JjW3QuRlVMTFBMQUlOXX0kYClcblxuLy8gbGlrZSBmdWxsLCBidXQgYWxsb3dzIHYxLjIuMyBhbmQgPTEuMi4zLCB3aGljaCBwZW9wbGUgZG8gc29tZXRpbWVzLlxuLy8gYWxzbywgMS4wLjBhbHBoYTEgKHByZXJlbGVhc2Ugd2l0aG91dCB0aGUgaHlwaGVuKSB3aGljaCBpcyBwcmV0dHlcbi8vIGNvbW1vbiBpbiB0aGUgbnBtIHJlZ2lzdHJ5LlxuY3JlYXRlVG9rZW4oJ0xPT1NFUExBSU4nLCBgW3Y9XFxcXHNdKiR7c3JjW3QuTUFJTlZFUlNJT05MT09TRV1cbn0ke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0xPT1NFJywgYF4ke3NyY1t0LkxPT1NFUExBSU5dfSRgKVxuXG5jcmVhdGVUb2tlbignR1RMVCcsICcoKD86PHw+KT89PyknKVxuXG4vLyBTb21ldGhpbmcgbGlrZSBcIjIuKlwiIG9yIFwiMS4yLnhcIi5cbi8vIE5vdGUgdGhhdCBcIngueFwiIGlzIGEgdmFsaWQgeFJhbmdlIGlkZW50aWZlciwgbWVhbmluZyBcImFueSB2ZXJzaW9uXCJcbi8vIE9ubHkgdGhlIGZpcnN0IGl0ZW0gaXMgc3RyaWN0bHkgcmVxdWlyZWQuXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUkxPT1NFJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19fHh8WHxcXFxcKmApXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUicsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX18eHxYfFxcXFwqYClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOTE9PU0UnLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxuY3JlYXRlVG9rZW4oJ0NPRVJDRVBMQUlOJywgYCR7JyhefFteXFxcXGRdKScgK1xuICAgICAgICAgICAgICAnKFxcXFxkezEsJ30ke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSlgICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRScsIGAke3NyY1t0LkNPRVJDRVBMQUlOXX0oPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFRlVMTCcsIHNyY1t0LkNPRVJDRVBMQUlOXSArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LkJVSUxEXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTCcsIHNyY1t0LkNPRVJDRV0sIHRydWUpXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMRlVMTCcsIHNyY1t0LkNPRVJDRUZVTExdLCB0cnVlKVxuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxuY3JlYXRlVG9rZW4oJ0xPTkVUSUxERScsICcoPzp+Pj8pJylcblxuY3JlYXRlVG9rZW4oJ1RJTERFVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORVRJTERFXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy50aWxkZVRyaW1SZXBsYWNlID0gJyQxfidcblxuY3JlYXRlVG9rZW4oJ1RJTERFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignVElMREVMT09TRScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG5jcmVhdGVUb2tlbignTE9ORUNBUkVUJywgJyg/OlxcXFxeKScpXG5cbmNyZWF0ZVRva2VuKCdDQVJFVFRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVDQVJFVF19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMuY2FyZXRUcmltUmVwbGFjZSA9ICckMV4nXG5cbmNyZWF0ZVRva2VuKCdDQVJFVCcsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ0NBUkVUTE9PU0UnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX0pJHxeJGApXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUicsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5GVUxMUExBSU5dfSkkfF4kYClcblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuR1RMVF1cbn1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX18JHtzcmNbdC5YUkFOR0VQTEFJTl19KWAsIHRydWUpXG5leHBvcnRzLmNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRUxPT1NFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuLy8gU3RhciByYW5nZXMgYmFzaWNhbGx5IGp1c3QgYWxsb3cgYW55dGhpbmcgYXQgYWxsLlxuY3JlYXRlVG9rZW4oJ1NUQVInLCAnKDx8Pik/PT9cXFxccypcXFxcKicpXG4vLyA+PTAuMC4wIGlzIGxpa2UgYSBzdGFyXG5jcmVhdGVUb2tlbignR1RFMCcsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wXFxcXHMqJCcpXG5jcmVhdGVUb2tlbignR1RFMFBSRScsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wLTBcXFxccyokJylcbiIsCiAgICAiLy8gcGFyc2Ugb3V0IGp1c3QgdGhlIG9wdGlvbnMgd2UgY2FyZSBhYm91dFxuY29uc3QgbG9vc2VPcHRpb24gPSBPYmplY3QuZnJlZXplKHsgbG9vc2U6IHRydWUgfSlcbmNvbnN0IGVtcHR5T3B0cyA9IE9iamVjdC5mcmVlemUoeyB9KVxuY29uc3QgcGFyc2VPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBlbXB0eU9wdHNcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbG9vc2VPcHRpb25cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlT3B0aW9uc1xuIiwKICAgICJjb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICJjb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IHsgTUFYX0xFTkdUSCwgTUFYX1NBRkVfSU5URUdFUiB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgY29tcGFyZUlkZW50aWZpZXJzIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jbGFzcyBTZW1WZXIge1xuICBjb25zdHJ1Y3RvciAodmVyc2lvbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgICBpZiAodmVyc2lvbi5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgICAgdmVyc2lvbi5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmVyc2lvbi4gTXVzdCBiZSBhIHN0cmluZy4gR290IHR5cGUgXCIke3R5cGVvZiB2ZXJzaW9ufVwiLmApXG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYHZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSByZWxldmFudCBmb3IgdmVyc2lvbnMsIGJ1dCBrZWVwIGl0IHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICBjb25zdCBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gob3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXSlcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBWZXJzaW9uOiAke3ZlcnNpb259YClcbiAgICB9XG5cbiAgICB0aGlzLnJhdyA9IHZlcnNpb25cblxuICAgIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gICAgdGhpcy5tYWpvciA9ICttWzFdXG4gICAgdGhpcy5taW5vciA9ICttWzJdXG4gICAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgICBpZiAoIW1bNF0pIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK2lkXG4gICAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW11cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLnBhdGNofWBcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9uICs9IGAtJHt0aGlzLnByZXJlbGVhc2Uuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIGNvbXBhcmUgKG90aGVyKSB7XG4gICAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMsIG90aGVyKVxuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gJ3N0cmluZycgJiYgb3RoZXIgPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKG90aGVyLnZlcnNpb24gPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKVxuICB9XG5cbiAgY29tcGFyZU1haW4gKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKVxuICAgIClcbiAgfVxuXG4gIGNvbXBhcmVQcmUgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMucHJlcmVsZWFzZVtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIGNvbXBhcmVCdWlsZCAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV1cbiAgICAgIGRlYnVnKCdidWlsZCBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICAvLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4gIC8vIGRvd24gdG8gcHJlLXJlbGVhc2UuIHByZW1ham9yIGFuZCBwcmVwYXRjaCB3b3JrIHRoZSBzYW1lIHdheS5cbiAgaW5jIChyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkge1xuICAgIHN3aXRjaCAocmVsZWFzZSkge1xuICAgICAgY2FzZSAncHJlbWFqb3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlbWlub3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlcGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgICAvLyBkcm9wIGFueSBwcmVyZWxlYXNlcyB0aGF0IG1pZ2h0IGFscmVhZHkgZXhpc3QsIHNpbmNlIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyByZWxldmFudCBhdCB0aGlzIHBvaW50LlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgICAvLyBwcmVwYXRjaC5cbiAgICAgIGNhc2UgJ3ByZXJlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnbWFqb3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1ham9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWFqb3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtYWpvci5cbiAgICAgICAgLy8gMS4wLjAtNSBidW1wcyB0byAxLjAuMFxuICAgICAgICAvLyAxLjEuMCBidW1wcyB0byAyLjAuMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5taW5vciAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucGF0Y2ggIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdtaW5vcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1pbm9yLlxuICAgICAgICAvLyAxLjIuMC01IGJ1bXBzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICAgIGlmICh0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHByZS1yZWxlYXNlIHZlcnNpb24sIGl0IHdpbGwgaW5jcmVtZW50IHRoZSBwYXRjaC5cbiAgICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgICAgLy8gMS4yLjAtNSBwYXRjaGVzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4wIHBhdGNoZXMgdG8gMS4yLjFcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnBhdGNoKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgLy8gVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgdXNlZCBwdWJsaWNseS5cbiAgICAgIC8vIDEuMC4wICdwcmUnIHdvdWxkIGJlY29tZSAxLjAuMC0wIHdoaWNoIGlzIHRoZSB3cm9uZyBkaXJlY3Rpb24uXG4gICAgICBjYXNlICdwcmUnOiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBOdW1iZXIoaWRlbnRpZmllckJhc2UpID8gMSA6IDBcblxuICAgICAgICBpZiAoIWlkZW50aWZpZXIgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtiYXNlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBpID0gdGhpcy5wcmVyZWxlYXNlLmxlbmd0aFxuICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXJlbGVhc2VbaV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZVtpXSsrXG4gICAgICAgICAgICAgIGkgPSAtMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGRpZG4ndCBpbmNyZW1lbnQgYW55dGhpbmdcbiAgICAgICAgICAgIGlmIChpZGVudGlmaWVyID09PSB0aGlzLnByZXJlbGVhc2Uuam9pbignLicpICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5wdXNoKGJhc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLmZvb2JseiBvciAxLjIuMC1iZXRhIGJ1bXBzIHRvIDEuMi4wLWJldGEuMFxuICAgICAgICAgIGxldCBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIGJhc2VdXG4gICAgICAgICAgaWYgKGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucHJlcmVsZWFzZVswXSwgaWRlbnRpZmllcikgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogJHtyZWxlYXNlfWApXG4gICAgfVxuICAgIHRoaXMucmF3ID0gdGhpcy5mb3JtYXQoKVxuICAgIGlmICh0aGlzLmJ1aWxkLmxlbmd0aCkge1xuICAgICAgdGhpcy5yYXcgKz0gYCske3RoaXMuYnVpbGQuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbVZlclxuIiwKICAgICJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9ICh2ZXJzaW9uLCBvcHRpb25zLCB0aHJvd0Vycm9ycyA9IGZhbHNlKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKCF0aHJvd0Vycm9ycykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgdGhyb3cgZXJcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlXG4iLAogICAgImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgY29lcmNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBsZXQgbWF0Y2ggPSBudWxsXG4gIGlmICghb3B0aW9ucy5ydGwpIHtcbiAgICBtYXRjaCA9IHZlcnNpb24ubWF0Y2gob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFRlVMTF0gOiByZVt0LkNPRVJDRV0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRmluZCB0aGUgcmlnaHQtbW9zdCBjb2VyY2libGUgc3RyaW5nIHRoYXQgZG9lcyBub3Qgc2hhcmVcbiAgICAvLyBhIHRlcm1pbnVzIHdpdGggYSBtb3JlIGxlZnQtd2FyZCBjb2VyY2libGUgc3RyaW5nLlxuICAgIC8vIEVnLCAnMS4yLjMuNCcgd2FudHMgdG8gY29lcmNlICcyLjMuNCcsIG5vdCAnMy40JyBvciAnNCdcbiAgICAvLyBXaXRoIGluY2x1ZGVQcmVyZWxlYXNlIG9wdGlvbiBzZXQsICcxLjIuMy40LXJjJyB3YW50cyB0byBjb2VyY2UgJzIuMy40LXJjJywgbm90ICcyLjMuNCdcbiAgICAvL1xuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nIGNoZWNraW5nIHdpdGggYSAvZyByZWdleHBcbiAgICAvLyBNYW51YWxseSBzZXQgdGhlIGluZGV4IHNvIGFzIHRvIHBpY2sgdXAgb3ZlcmxhcHBpbmcgbWF0Y2hlcy5cbiAgICAvLyBTdG9wIHdoZW4gd2UgZ2V0IGEgbWF0Y2ggdGhhdCBlbmRzIGF0IHRoZSBzdHJpbmcgZW5kLCBzaW5jZSBub1xuICAgIC8vIGNvZXJjaWJsZSBzdHJpbmcgY2FuIGJlIG1vcmUgcmlnaHQtd2FyZCB3aXRob3V0IHRoZSBzYW1lIHRlcm1pbnVzLlxuICAgIGNvbnN0IGNvZXJjZVJ0bFJlZ2V4ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFUlRMRlVMTF0gOiByZVt0LkNPRVJDRVJUTF1cbiAgICBsZXQgbmV4dFxuICAgIHdoaWxlICgobmV4dCA9IGNvZXJjZVJ0bFJlZ2V4LmV4ZWModmVyc2lvbikpICYmXG4gICAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgICAgbmV4dC5pbmRleCArIG5leHRbMF0ubGVuZ3RoICE9PSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IG5leHRcbiAgICAgIH1cbiAgICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IG5leHQuaW5kZXggKyBuZXh0WzFdLmxlbmd0aCArIG5leHRbMl0ubGVuZ3RoXG4gICAgfVxuICAgIC8vIGxlYXZlIGl0IGluIGEgY2xlYW4gc3RhdGVcbiAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1ham9yID0gbWF0Y2hbMl1cbiAgY29uc3QgbWlub3IgPSBtYXRjaFszXSB8fCAnMCdcbiAgY29uc3QgcGF0Y2ggPSBtYXRjaFs0XSB8fCAnMCdcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNV0gPyBgLSR7bWF0Y2hbNV19YCA6ICcnXG4gIGNvbnN0IGJ1aWxkID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs2XSA/IGArJHttYXRjaFs2XX1gIDogJydcblxuICByZXR1cm4gcGFyc2UoYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9JHtwcmVyZWxlYXNlfSR7YnVpbGR9YCwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gY29lcmNlXG4iLAogICAgImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+XG4gIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZVxuIiwKICAgICJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPj0gMFxubW9kdWxlLmV4cG9ydHMgPSBndGVcbiIsCiAgICAiY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5tYXggPSAxMDAwXG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKClcbiAgfVxuXG4gIGdldCAoa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1hcC5nZXQoa2V5KVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIG1hcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmRcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZSAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gIH1cblxuICBzZXQgKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5kZWxldGUoa2V5KVxuXG4gICAgaWYgKCFkZWxldGVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIGNhY2hlIGlzIGZ1bGwsIGRlbGV0ZSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtXG4gICAgICBpZiAodGhpcy5tYXAuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMubWFwLmtleXMoKS5uZXh0KCkudmFsdWVcbiAgICAgICAgdGhpcy5kZWxldGUoZmlyc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZVxuIiwKICAgICJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMFxubW9kdWxlLmV4cG9ydHMgPSBlcVxuIiwKICAgICJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IG5lcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgIT09IDBcbm1vZHVsZS5leHBvcnRzID0gbmVxXG4iLAogICAgImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3QgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMFxubW9kdWxlLmV4cG9ydHMgPSBndFxuIiwKICAgICJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8IDBcbm1vZHVsZS5leHBvcnRzID0gbHRcbiIsCiAgICAiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDw9IDBcbm1vZHVsZS5leHBvcnRzID0gbHRlXG4iLAogICAgImNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiIsCiAgICAiY29uc3QgQU5ZID0gU3ltYm9sKCdTZW1WZXIgQU5ZJylcbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBDb21wYXJhdG9yIHtcbiAgc3RhdGljIGdldCBBTlkgKCkge1xuICAgIHJldHVybiBBTllcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChjb21wLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIHJldHVybiBjb21wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXAgPSBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMucGFyc2UoY29tcClcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICB0aGlzLnZhbHVlID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbXAnLCB0aGlzKVxuICB9XG5cbiAgcGFyc2UgKGNvbXApIHtcbiAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICAgIGNvbnN0IG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29tcGFyYXRvcjogJHtjb21wfWApXG4gICAgfVxuXG4gICAgdGhpcy5vcGVyYXRvciA9IG1bMV0gIT09IHVuZGVmaW5lZCA/IG1bMV0gOiAnJ1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICAgIGlmICghbVsyXSkge1xuICAgICAgdGhpcy5zZW12ZXIgPSBBTllcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5vcHRpb25zLmxvb3NlKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGludGVyc2VjdHMgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgb3B0aW9ucykudGVzdCh0aGlzLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmIChjb21wLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBvcHRpb25zKS50ZXN0KGNvbXAuc2VtdmVyKVxuICAgIH1cblxuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgbm90aGluZyBjYW4gcG9zc2libHkgYmUgbG93ZXJcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUgPT09ICc8MC4wLjAtMCcgfHwgY29tcC52YWx1ZSA9PT0gJzwwLjAuMC0wJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpIHx8IGNvbXAudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBpbmNyZWFzaW5nICg+IG9yID49KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gZGVjcmVhc2luZyAoPCBvciA8PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIHNhbWUgU2VtVmVyIGFuZCBib3RoIHNpZGVzIGFyZSBpbmNsdXNpdmUgKDw9IG9yID49KVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5pbmNsdWRlcygnPScpICYmIGNvbXAub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBsZXNzIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgZ3JlYXRlciB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBhcmF0b3JcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKVxuIiwKICAgICJjb25zdCBTUEFDRV9DSEFSQUNURVJTID0gL1xccysvZ1xuXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgUmFuZ2Uge1xuICBjb25zdHJ1Y3RvciAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICByYW5nZS5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHJhbmdlLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gcmFuZ2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UucmF3LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIC8vIGp1c3QgcHV0IGl0IGluIHRoZSBzZXQgYW5kIHJldHVyblxuICAgICAgdGhpcy5yYXcgPSByYW5nZS52YWx1ZVxuICAgICAgdGhpcy5zZXQgPSBbW3JhbmdlXV1cbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgLy8gRmlyc3QgcmVkdWNlIGFsbCB3aGl0ZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gd2UgZG8gbm90IGhhdmUgdG8gcmVseVxuICAgIC8vIG9uIHBvdGVudGlhbGx5IHNsb3cgcmVnZXhlcyBsaWtlIFxccyouIFRoaXMgaXMgdGhlbiBzdG9yZWQgYW5kIHVzZWQgZm9yXG4gICAgLy8gZnV0dXJlIGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwuXG4gICAgdGhpcy5yYXcgPSByYW5nZS50cmltKCkucmVwbGFjZShTUEFDRV9DSEFSQUNURVJTLCAnICcpXG5cbiAgICAvLyBGaXJzdCwgc3BsaXQgb24gfHxcbiAgICB0aGlzLnNldCA9IHRoaXMucmF3XG4gICAgICAuc3BsaXQoJ3x8JylcbiAgICAgIC8vIG1hcCB0aGUgcmFuZ2UgdG8gYSAyZCBhcnJheSBvZiBjb21wYXJhdG9yc1xuICAgICAgLm1hcChyID0+IHRoaXMucGFyc2VSYW5nZShyLnRyaW0oKSkpXG4gICAgICAvLyB0aHJvdyBvdXQgYW55IGNvbXBhcmF0b3IgbGlzdHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIC8vIHRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaXQgd2FzIG5vdCBhIHZhbGlkIHJhbmdlLCB3aGljaCBpcyBhbGxvd2VkXG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCBidXQgd2lsbCBzdGlsbCB0aHJvdyBpZiB0aGUgV0hPTEUgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICAgIC5maWx0ZXIoYyA9PiBjLmxlbmd0aClcblxuICAgIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFNlbVZlciBSYW5nZTogJHt0aGlzLnJhd31gKVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlIG5vdCB0aGUgbnVsbCBzZXQsIHRocm93IG91dCBudWxsIHNldHMuXG4gICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZSwgaW4gY2FzZSB0aGV5J3JlIGFsbCBudWxsIHNldHNcbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zZXRbMF1cbiAgICAgIHRoaXMuc2V0ID0gdGhpcy5zZXQuZmlsdGVyKGMgPT4gIWlzTnVsbFNldChjWzBdKSlcbiAgICAgIGlmICh0aGlzLnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXQgPSBbZmlyc3RdXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgKiwgdGhlbiB0aGUgcmFuZ2UgaXMganVzdCAqXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnNldCkge1xuICAgICAgICAgIGlmIChjLmxlbmd0aCA9PT0gMSAmJiBpc0FueShjWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBbY11cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXR0ZWQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCByYW5nZSAoKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0dGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gJydcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJ3x8J1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBzID0gdGhpcy5zZXRbaV1cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21wcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIGlmIChrID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJyAnXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9IGNvbXBzW2tdLnRvU3RyaW5nKCkudHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHBhcnNlUmFuZ2UgKHJhbmdlKSB7XG4gICAgLy8gbWVtb2l6ZSByYW5nZSBwYXJzaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyB0aGlzIGlzIGEgdmVyeSBob3QgcGF0aCwgYW5kIGZ1bGx5IGRldGVybWluaXN0aWMuXG4gICAgY29uc3QgbWVtb09wdHMgPVxuICAgICAgKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSkgfFxuICAgICAgKHRoaXMub3B0aW9ucy5sb29zZSAmJiBGTEFHX0xPT1NFKVxuICAgIGNvbnN0IG1lbW9LZXkgPSBtZW1vT3B0cyArICc6JyArIHJhbmdlXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1lbW9LZXkpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGxvb3NlID0gdGhpcy5vcHRpb25zLmxvb3NlXG4gICAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gICAgY29uc3QgaHIgPSBsb29zZSA/IHJlW3QuSFlQSEVOUkFOR0VMT09TRV0gOiByZVt0LkhZUEhFTlJBTkdFXVxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpKVxuICAgIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKVxuXG4gICAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygndGlsZGUgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY2FyZXQgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gICAgbGV0IHJhbmdlTGlzdCA9IHJhbmdlXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLm1hcChjb21wID0+IHBhcnNlQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC8vID49MC4wLjAgaXMgZXF1aXZhbGVudCB0byAqXG4gICAgICAubWFwKGNvbXAgPT4gcmVwbGFjZUdURTAoY29tcCwgdGhpcy5vcHRpb25zKSlcblxuICAgIGlmIChsb29zZSkge1xuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICAgIHJhbmdlTGlzdCA9IHJhbmdlTGlzdC5maWx0ZXIoY29tcCA9PiB7XG4gICAgICAgIGRlYnVnKCdsb29zZSBpbnZhbGlkIGZpbHRlcicsIGNvbXAsIHRoaXMub3B0aW9ucylcbiAgICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChyZVt0LkNPTVBBUkFUT1JMT09TRV0pXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWJ1ZygncmFuZ2UgbGlzdCcsIHJhbmdlTGlzdClcblxuICAgIC8vIGlmIGFueSBjb21wYXJhdG9ycyBhcmUgdGhlIG51bGwgc2V0LCB0aGVuIHJlcGxhY2Ugd2l0aCBKVVNUIG51bGwgc2V0XG4gICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBjb21wYXJhdG9yLCByZW1vdmUgYW55ICogY29tcGFyYXRvcnNcbiAgICAvLyBhbHNvLCBkb24ndCBpbmNsdWRlIHRoZSBzYW1lIGNvbXBhcmF0b3IgbW9yZSB0aGFuIG9uY2VcbiAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2VMaXN0Lm1hcChjb21wID0+IG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICBpZiAoaXNOdWxsU2V0KGNvbXApKSB7XG4gICAgICAgIHJldHVybiBbY29tcF1cbiAgICAgIH1cbiAgICAgIHJhbmdlTWFwLnNldChjb21wLnZhbHVlLCBjb21wKVxuICAgIH1cbiAgICBpZiAocmFuZ2VNYXAuc2l6ZSA+IDEgJiYgcmFuZ2VNYXAuaGFzKCcnKSkge1xuICAgICAgcmFuZ2VNYXAuZGVsZXRlKCcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5yYW5nZU1hcC52YWx1ZXMoKV1cbiAgICBjYWNoZS5zZXQobWVtb0tleSwgcmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGludGVyc2VjdHMgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldC5zb21lKCh0aGlzQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICByYW5nZS5zZXQuc29tZSgocmFuZ2VDb21wYXJhdG9ycykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgICB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoKHRoaXNDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KChyYW5nZUNvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlXG5cbmNvbnN0IExSVSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2xydWNhY2hlJylcbmNvbnN0IGNhY2hlID0gbmV3IExSVSgpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY29tcGFyYXRvcicpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IHtcbiAgc2FmZVJlOiByZSxcbiAgdCxcbiAgY29tcGFyYXRvclRyaW1SZXBsYWNlLFxuICB0aWxkZVRyaW1SZXBsYWNlLFxuICBjYXJldFRyaW1SZXBsYWNlLFxufSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IHsgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UsIEZMQUdfTE9PU0UgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5cbmNvbnN0IGlzTnVsbFNldCA9IGMgPT4gYy52YWx1ZSA9PT0gJzwwLjAuMC0wJ1xuY29uc3QgaXNBbnkgPSBjID0+IGMudmFsdWUgPT09ICcnXG5cbi8vIHRha2UgYSBzZXQgb2YgY29tcGFyYXRvcnMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXJlXG4vLyBleGlzdHMgYSB2ZXJzaW9uIHdoaWNoIGNhbiBzYXRpc2Z5IGl0XG5jb25zdCBpc1NhdGlzZmlhYmxlID0gKGNvbXBhcmF0b3JzLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQgPSB0cnVlXG4gIGNvbnN0IHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICBsZXQgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoKG90aGVyQ29tcGFyYXRvcikgPT4ge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmNvbnN0IHBhcnNlQ29tcGFyYXRvciA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjb21wJywgY29tcCwgb3B0aW9ucylcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ2NhcmV0JywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygneHJhbmdlJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBvcHRpb25zKVxuICBkZWJ1Zygnc3RhcnMnLCBjb21wKVxuICByZXR1cm4gY29tcFxufVxuXG5jb25zdCBpc1ggPSBpZCA9PiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKidcblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wLTBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjAtMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MC4wLjEgLS0+ID49MC4wLjEgPDAuMS4wLTBcbmNvbnN0IHJlcGxhY2VUaWxkZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VUaWxkZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VUaWxkZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5USUxERUxPT1NFXSA6IHJlW3QuVElMREVdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAgPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wLTBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjAuMC4xIC0tPiA+PTAuMC4xIDwwLjAuMi0wXG4vLyBeMC4xLjAgLS0+ID49MC4xLjAgPDAuMi4wLTBcbmNvbnN0IHJlcGxhY2VDYXJldHMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VDYXJldChjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VDYXJldCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5DQVJFVExPT1NFXSA6IHJlW3QuQ0FSRVRdXG4gIGNvbnN0IHogPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlWFJhbmdlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICBjb25zdCB4TSA9IGlzWChNKVxuICAgIGNvbnN0IHhtID0geE0gfHwgaXNYKG0pXG4gICAgY29uc3QgeHAgPSB4bSB8fCBpc1gocClcbiAgICBjb25zdCBhbnlYID0geHBcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WCkge1xuICAgICAgZ3RsdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgaW5jbHVkaW5nIHByZXJlbGVhc2VzIGluIHRoZSBtYXRjaCwgdGhlbiB3ZSBuZWVkXG4gICAgLy8gdG8gZml4IHRoaXMgdG8gLTAsIHRoZSBsb3dlc3QgcG9zc2libGUgcHJlcmVsZWFzZSB2YWx1ZVxuICAgIHByID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMC0wJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHdlIGtub3cgcGF0Y2ggaXMgYW4geCwgYmVjYXVzZSB3ZSBoYXZlIGFueSB4IGF0IGFsbC5cbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSkge1xuICAgICAgICBtID0gMFxuICAgICAgfVxuICAgICAgcCA9IDBcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICBndGx0ID0gJz49J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgICAgbSA9IDBcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIHByID0gJy0wJ1xuICAgICAgfVxuXG4gICAgICByZXQgPSBgJHtndGx0ICsgTX0uJHttfS4ke3B9JHtwcn1gXG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3ByfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KVxuXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuY29uc3QgcmVwbGFjZVN0YXJzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIG9wdGlvbnMpXG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVt0LlNUQVJdLCAnJylcbn1cblxuY29uc3QgcmVwbGFjZUdURTAgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZUdURTAnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVtvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gdC5HVEUwUFJFIDogdC5HVEUwXSwgJycpXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW3QuSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wXG4vLyBUT0RPIGJ1aWxkP1xuY29uc3QgaHlwaGVuUmVwbGFjZSA9IGluY1ByID0+ICgkMCxcbiAgZnJvbSwgZk0sIGZtLCBmcCwgZnByLCBmYixcbiAgdG8sIHRNLCB0bSwgdHAsIHRwcikgPT4ge1xuICBpZiAoaXNYKGZNKSkge1xuICAgIGZyb20gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWChmbSkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uMC4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoaXNYKGZwKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4ke2ZtfS4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoZnByKSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX1gXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX0ke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfVxuXG4gIGlmIChpc1godE0pKSB7XG4gICAgdG8gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWCh0bSkpIHtcbiAgICB0byA9IGA8JHsrdE0gKyAxfS4wLjAtMGBcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7K3RtICsgMX0uMC0wYFxuICB9IGVsc2UgaWYgKHRwcikge1xuICAgIHRvID0gYDw9JHt0TX0uJHt0bX0uJHt0cH0tJHt0cHJ9YFxuICB9IGVsc2UgaWYgKGluY1ByKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7dG19LiR7K3RwICsgMX0tMGBcbiAgfSBlbHNlIHtcbiAgICB0byA9IGA8PSR7dG99YFxuICB9XG5cbiAgcmV0dXJuIGAke2Zyb219ICR7dG99YC50cmltKClcbn1cblxuY29uc3QgdGVzdFNldCA9IChzZXQsIHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKVxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IENvbXBhcmF0b3IuQU5ZKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLAogICAgImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gcmFuZ2UudGVzdCh2ZXJzaW9uKVxufVxubW9kdWxlLmV4cG9ydHMgPSBzYXRpc2ZpZXNcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTMgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG5jb25zdCB7IGNyZWF0ZUhhc2ggfSA9IHJlcXVpcmUoJ25vZGU6Y3J5cHRvJyk7XG5jb25zdCBzZW12ZXJDb2VyY2UgPSByZXF1aXJlKCdzZW12ZXIvZnVuY3Rpb25zL2NvZXJjZScpO1xuY29uc3Qgc2VtdmVyR3JlYXRlclRoYW5PckVxdWFsVG8gPSByZXF1aXJlKCdzZW12ZXIvZnVuY3Rpb25zL2d0ZScpO1xuY29uc3Qgc2VtdmVyU2F0aXNmaWVzID0gcmVxdWlyZSgnc2VtdmVyL2Z1bmN0aW9ucy9zYXRpc2ZpZXMnKTtcbmNvbnN0IGRldGVjdExpYmMgPSByZXF1aXJlKCdkZXRlY3QtbGliYycpO1xuXG5jb25zdCB7IGNvbmZpZywgZW5naW5lcywgb3B0aW9uYWxEZXBlbmRlbmNpZXMgfSA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuXG5jb25zdCBtaW5pbXVtTGlidmlwc1ZlcnNpb25MYWJlbGxlZCA9IHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX2NvbmZpZ19saWJ2aXBzIHx8IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGNvbmZpZy5saWJ2aXBzO1xuY29uc3QgbWluaW11bUxpYnZpcHNWZXJzaW9uID0gc2VtdmVyQ29lcmNlKG1pbmltdW1MaWJ2aXBzVmVyc2lvbkxhYmVsbGVkKS52ZXJzaW9uO1xuXG5jb25zdCBwcmVidWlsdFBsYXRmb3JtcyA9IFtcbiAgJ2Rhcndpbi1hcm02NCcsICdkYXJ3aW4teDY0JyxcbiAgJ2xpbnV4LWFybScsICdsaW51eC1hcm02NCcsICdsaW51eC1zMzkweCcsICdsaW51eC14NjQnLFxuICAnbGludXhtdXNsLWFybTY0JywgJ2xpbnV4bXVzbC14NjQnLFxuICAnd2luMzItaWEzMicsICd3aW4zMi14NjQnXG5dO1xuXG5jb25zdCBzcGF3blN5bmNPcHRpb25zID0ge1xuICBlbmNvZGluZzogJ3V0ZjgnLFxuICBzaGVsbDogdHJ1ZVxufTtcblxuY29uc3QgbG9nID0gKGl0ZW0pID0+IHtcbiAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYHNoYXJwOiBJbnN0YWxsYXRpb24gZXJyb3I6ICR7aXRlbS5tZXNzYWdlfWApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGBzaGFycDogJHtpdGVtfWApO1xuICB9XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3QgcnVudGltZUxpYmMgPSAoKSA9PiBkZXRlY3RMaWJjLmlzTm9uR2xpYmNMaW51eFN5bmMoKSA/IGRldGVjdExpYmMuZmFtaWx5U3luYygpIDogJyc7XG5cbmNvbnN0IHJ1bnRpbWVQbGF0Zm9ybUFyY2ggPSAoKSA9PiBgJHtwcm9jZXNzLnBsYXRmb3JtfSR7cnVudGltZUxpYmMoKX0tJHtwcm9jZXNzLmFyY2h9YDtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNvbnN0IGJ1aWxkUGxhdGZvcm1BcmNoID0gKCkgPT4ge1xuICBpZiAoaXNFbXNjcmlwdGVuKCkpIHtcbiAgICByZXR1cm4gJ3dhc20zMic7XG4gIH1cbiAgLyogZXNsaW50IGNhbWVsY2FzZTogW1wiZXJyb3JcIiwgeyBhbGxvdzogW1wiXm5wbV9jb25maWdfXCJdIH1dICovXG4gIGNvbnN0IHsgbnBtX2NvbmZpZ19hcmNoLCBucG1fY29uZmlnX3BsYXRmb3JtLCBucG1fY29uZmlnX2xpYmMgfSA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBsaWJjID0gdHlwZW9mIG5wbV9jb25maWdfbGliYyA9PT0gJ3N0cmluZycgPyBucG1fY29uZmlnX2xpYmMgOiBydW50aW1lTGliYygpO1xuICByZXR1cm4gYCR7bnBtX2NvbmZpZ19wbGF0Zm9ybSB8fCBwcm9jZXNzLnBsYXRmb3JtfSR7bGliY30tJHtucG1fY29uZmlnX2FyY2ggfHwgcHJvY2Vzcy5hcmNofWA7XG59O1xuXG5jb25zdCBidWlsZFNoYXJwTGlidmlwc0luY2x1ZGVEaXIgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoYEBpbWcvc2hhcnAtbGlidmlwcy1kZXYtJHtidWlsZFBsYXRmb3JtQXJjaCgpfS9pbmNsdWRlYCk7XG4gIH0gY2F0Y2gge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSgnQGltZy9zaGFycC1saWJ2aXBzLWRldi9pbmNsdWRlJyk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJztcbn07XG5cbmNvbnN0IGJ1aWxkU2hhcnBMaWJ2aXBzQ1BsdXNQbHVzRGlyID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdAaW1nL3NoYXJwLWxpYnZpcHMtZGV2L2NwbHVzcGx1cycpO1xuICB9IGNhdGNoIHt9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJztcbn07XG5cbmNvbnN0IGJ1aWxkU2hhcnBMaWJ2aXBzTGliRGlyID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKGBAaW1nL3NoYXJwLWxpYnZpcHMtZGV2LSR7YnVpbGRQbGF0Zm9ybUFyY2goKX0vbGliYCk7XG4gIH0gY2F0Y2gge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVxdWlyZShgQGltZy9zaGFycC1saWJ2aXBzLSR7YnVpbGRQbGF0Zm9ybUFyY2goKX0vbGliYCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJztcbn07XG5cbmNvbnN0IGlzVW5zdXBwb3J0ZWROb2RlUnVudGltZSA9ICgpID0+IHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHByb2Nlc3MucmVsZWFzZT8ubmFtZSA9PT0gJ25vZGUnICYmIHByb2Nlc3MudmVyc2lvbnMpIHtcbiAgICBpZiAoIXNlbXZlclNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb25zLm5vZGUsIGVuZ2luZXMubm9kZSkpIHtcbiAgICAgIHJldHVybiB7IGZvdW5kOiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsIGV4cGVjdGVkOiBlbmdpbmVzLm5vZGUgfTtcbiAgICB9XG4gIH1cbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb25zdCBpc0Vtc2NyaXB0ZW4gPSAoKSA9PiB7XG4gIGNvbnN0IHsgQ0MgfSA9IHByb2Nlc3MuZW52O1xuICByZXR1cm4gQm9vbGVhbihDQyAmJiBDQy5lbmRzV2l0aCgnL2VtY2MnKSk7XG59O1xuXG5jb25zdCBpc1Jvc2V0dGEgPSAoKSA9PiB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJyAmJiBwcm9jZXNzLmFyY2ggPT09ICd4NjQnKSB7XG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHNwYXduU3luYygnc3lzY3RsIHN5c2N0bC5wcm9jX3RyYW5zbGF0ZWQnLCBzcGF3blN5bmNPcHRpb25zKS5zdGRvdXQ7XG4gICAgcmV0dXJuICh0cmFuc2xhdGVkIHx8ICcnKS50cmltKCkgPT09ICdzeXNjdGwucHJvY190cmFuc2xhdGVkOiAxJztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBzaGE1MTIgPSAocykgPT4gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHMpLmRpZ2VzdCgnaGV4Jyk7XG5cbmNvbnN0IHlhcm5Mb2NhdG9yID0gKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGlkZW50SGFzaCA9IHNoYTUxMihgaW1nc2hhcnAtbGlidmlwcy0ke2J1aWxkUGxhdGZvcm1BcmNoKCl9YCk7XG4gICAgY29uc3QgbnBtVmVyc2lvbiA9IHNlbXZlckNvZXJjZShvcHRpb25hbERlcGVuZGVuY2llc1tgQGltZy9zaGFycC1saWJ2aXBzLSR7YnVpbGRQbGF0Zm9ybUFyY2goKX1gXSkudmVyc2lvbjtcbiAgICByZXR1cm4gc2hhNTEyKGAke2lkZW50SGFzaH1ucG06JHtucG1WZXJzaW9ufWApLnNsaWNlKDAsIDEwKTtcbiAgfSBjYXRjaCB7fVxuICByZXR1cm4gJyc7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3Qgc3Bhd25SZWJ1aWxkID0gKCkgPT5cbiAgc3Bhd25TeW5jKGBub2RlLWd5cCByZWJ1aWxkIC0tZGlyZWN0b3J5PXNyYyAke2lzRW1zY3JpcHRlbigpID8gJy0tbm9kZWRpcj1lbXNjcmlwdGVuJyA6ICcnfWAsIHtcbiAgICAuLi5zcGF3blN5bmNPcHRpb25zLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgfSkuc3RhdHVzO1xuXG5jb25zdCBnbG9iYWxMaWJ2aXBzVmVyc2lvbiA9ICgpID0+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicpIHtcbiAgICBjb25zdCBnbG9iYWxMaWJ2aXBzVmVyc2lvbiA9IHNwYXduU3luYygncGtnLWNvbmZpZyAtLW1vZHZlcnNpb24gdmlwcy1jcHAnLCB7XG4gICAgICAuLi5zcGF3blN5bmNPcHRpb25zLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBQS0dfQ09ORklHX1BBVEg6IHBrZ0NvbmZpZ1BhdGgoKVxuICAgICAgfVxuICAgIH0pLnN0ZG91dDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiAoZ2xvYmFsTGlidmlwc1ZlcnNpb24gfHwgJycpLnRyaW0oKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb25zdCBwa2dDb25maWdQYXRoID0gKCkgPT4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGJyZXdQa2dDb25maWdQYXRoID0gc3Bhd25TeW5jKFxuICAgICAgJ3doaWNoIGJyZXcgPi9kZXYvbnVsbCAyPiYxICYmIGJyZXcgZW52aXJvbm1lbnQgLS1wbGFpbiB8IGdyZXAgUEtHX0NPTkZJR19MSUJESVIgfCBjdXQgLWRcIiBcIiAtZjInLFxuICAgICAgc3Bhd25TeW5jT3B0aW9uc1xuICAgICkuc3Rkb3V0IHx8ICcnO1xuICAgIHJldHVybiBbXG4gICAgICBicmV3UGtnQ29uZmlnUGF0aC50cmltKCksXG4gICAgICBwcm9jZXNzLmVudi5QS0dfQ09ORklHX1BBVEgsXG4gICAgICAnL3Vzci9sb2NhbC9saWIvcGtnY29uZmlnJyxcbiAgICAgICcvdXNyL2xpYi9wa2djb25maWcnLFxuICAgICAgJy91c3IvbG9jYWwvbGliZGF0YS9wa2djb25maWcnLFxuICAgICAgJy91c3IvbGliZGF0YS9wa2djb25maWcnXG4gICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignOicpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJztcbiAgfVxufTtcblxuY29uc3Qgc2tpcFNlYXJjaCA9IChzdGF0dXMsIHJlYXNvbiwgbG9nZ2VyKSA9PiB7XG4gIGlmIChsb2dnZXIpIHtcbiAgICBsb2dnZXIoYERldGVjdGVkICR7cmVhc29ufSwgc2tpcHBpbmcgc2VhcmNoIGZvciBnbG9iYWxseS1pbnN0YWxsZWQgbGlidmlwc2ApO1xuICB9XG4gIHJldHVybiBzdGF0dXM7XG59O1xuXG5jb25zdCB1c2VHbG9iYWxMaWJ2aXBzID0gKGxvZ2dlcikgPT4ge1xuICBpZiAoQm9vbGVhbihwcm9jZXNzLmVudi5TSEFSUF9JR05PUkVfR0xPQkFMX0xJQlZJUFMpID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHNraXBTZWFyY2goZmFsc2UsICdTSEFSUF9JR05PUkVfR0xPQkFMX0xJQlZJUFMnLCBsb2dnZXIpO1xuICB9XG4gIGlmIChCb29sZWFuKHByb2Nlc3MuZW52LlNIQVJQX0ZPUkNFX0dMT0JBTF9MSUJWSVBTKSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBza2lwU2VhcmNoKHRydWUsICdTSEFSUF9GT1JDRV9HTE9CQUxfTElCVklQUycsIGxvZ2dlcik7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKGlzUm9zZXR0YSgpKSB7XG4gICAgcmV0dXJuIHNraXBTZWFyY2goZmFsc2UsICdSb3NldHRhJywgbG9nZ2VyKTtcbiAgfVxuICBjb25zdCBnbG9iYWxWaXBzVmVyc2lvbiA9IGdsb2JhbExpYnZpcHNWZXJzaW9uKCk7XG4gIHJldHVybiAhIWdsb2JhbFZpcHNWZXJzaW9uICYmIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgc2VtdmVyR3JlYXRlclRoYW5PckVxdWFsVG8oZ2xvYmFsVmlwc1ZlcnNpb24sIG1pbmltdW1MaWJ2aXBzVmVyc2lvbik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWluaW11bUxpYnZpcHNWZXJzaW9uLFxuICBwcmVidWlsdFBsYXRmb3JtcyxcbiAgYnVpbGRQbGF0Zm9ybUFyY2gsXG4gIGJ1aWxkU2hhcnBMaWJ2aXBzSW5jbHVkZURpcixcbiAgYnVpbGRTaGFycExpYnZpcHNDUGx1c1BsdXNEaXIsXG4gIGJ1aWxkU2hhcnBMaWJ2aXBzTGliRGlyLFxuICBpc1Vuc3VwcG9ydGVkTm9kZVJ1bnRpbWUsXG4gIHJ1bnRpbWVQbGF0Zm9ybUFyY2gsXG4gIGxvZyxcbiAgeWFybkxvY2F0b3IsXG4gIHNwYXduUmVidWlsZCxcbiAgZ2xvYmFsTGlidmlwc1ZlcnNpb24sXG4gIHBrZ0NvbmZpZ1BhdGgsXG4gIHVzZUdsb2JhbExpYnZpcHNcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSW5zcGVjdHMgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGV4cG9ydHMgdGhlIHJlbGV2YW50IHNoYXJwLm5vZGUgYmluYXJ5XG5cbmNvbnN0IHsgZmFtaWx5U3luYywgdmVyc2lvblN5bmMgfSA9IHJlcXVpcmUoJ2RldGVjdC1saWJjJyk7XG5cbmNvbnN0IHsgcnVudGltZVBsYXRmb3JtQXJjaCwgaXNVbnN1cHBvcnRlZE5vZGVSdW50aW1lLCBwcmVidWlsdFBsYXRmb3JtcywgbWluaW11bUxpYnZpcHNWZXJzaW9uIH0gPSByZXF1aXJlKCcuL2xpYnZpcHMnKTtcbmNvbnN0IHJ1bnRpbWVQbGF0Zm9ybSA9IHJ1bnRpbWVQbGF0Zm9ybUFyY2goKTtcblxuY29uc3QgcGF0aHMgPSBbXG4gIGAuLi9zcmMvYnVpbGQvUmVsZWFzZS9zaGFycC0ke3J1bnRpbWVQbGF0Zm9ybX0ubm9kZWAsXG4gICcuLi9zcmMvYnVpbGQvUmVsZWFzZS9zaGFycC13YXNtMzIubm9kZScsXG4gIGBAaW1nL3NoYXJwLSR7cnVudGltZVBsYXRmb3JtfS9zaGFycC5ub2RlYCxcbiAgJ0BpbWcvc2hhcnAtd2FzbTMyL3NoYXJwLm5vZGUnXG5dO1xuXG5sZXQgc2hhcnA7XG5jb25zdCBlcnJvcnMgPSBbXTtcbmZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICB0cnkge1xuICAgIHNoYXJwID0gcmVxdWlyZShwYXRoKTtcbiAgICBicmVhaztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBlcnJvcnMucHVzaChlcnIpO1xuICB9XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pZiAoc2hhcnApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBzaGFycDtcbn0gZWxzZSB7XG4gIGNvbnN0IFtpc0xpbnV4LCBpc01hY09zLCBpc1dpbmRvd3NdID0gWydsaW51eCcsICdkYXJ3aW4nLCAnd2luMzInXS5tYXAob3MgPT4gcnVudGltZVBsYXRmb3JtLnN0YXJ0c1dpdGgob3MpKTtcblxuICBjb25zdCBoZWxwID0gW2BDb3VsZCBub3QgbG9hZCB0aGUgXCJzaGFycFwiIG1vZHVsZSB1c2luZyB0aGUgJHtydW50aW1lUGxhdGZvcm19IHJ1bnRpbWVgXTtcbiAgZXJyb3JzLmZvckVhY2goZXJyID0+IHtcbiAgICBpZiAoZXJyLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgaGVscC5wdXNoKGAke2Vyci5jb2RlfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBtZXNzYWdlcyA9IGVycm9ycy5tYXAoZXJyID0+IGVyci5tZXNzYWdlKS5qb2luKCcgJyk7XG4gIGhlbHAucHVzaCgnUG9zc2libGUgc29sdXRpb25zOicpO1xuICAvLyBDb21tb24gZXJyb3IgbWVzc2FnZXNcbiAgaWYgKGlzVW5zdXBwb3J0ZWROb2RlUnVudGltZSgpKSB7XG4gICAgY29uc3QgeyBmb3VuZCwgZXhwZWN0ZWQgfSA9IGlzVW5zdXBwb3J0ZWROb2RlUnVudGltZSgpO1xuICAgIGhlbHAucHVzaChcbiAgICAgICctIFBsZWFzZSB1cGdyYWRlIE5vZGUuanM6JyxcbiAgICAgIGAgICAgRm91bmQgJHtmb3VuZH1gLFxuICAgICAgYCAgICBSZXF1aXJlcyAke2V4cGVjdGVkfWBcbiAgICApO1xuICB9IGVsc2UgaWYgKHByZWJ1aWx0UGxhdGZvcm1zLmluY2x1ZGVzKHJ1bnRpbWVQbGF0Zm9ybSkpIHtcbiAgICBjb25zdCBbb3MsIGNwdV0gPSBydW50aW1lUGxhdGZvcm0uc3BsaXQoJy0nKTtcbiAgICBjb25zdCBsaWJjID0gb3MuZW5kc1dpdGgoJ211c2wnKSA/ICcgLS1saWJjPW11c2wnIDogJyc7XG4gICAgaGVscC5wdXNoKFxuICAgICAgJy0gRW5zdXJlIG9wdGlvbmFsIGRlcGVuZGVuY2llcyBjYW4gYmUgaW5zdGFsbGVkOicsXG4gICAgICAnICAgIG5wbSBpbnN0YWxsIC0taW5jbHVkZT1vcHRpb25hbCBzaGFycCcsXG4gICAgICAnLSBFbnN1cmUgeW91ciBwYWNrYWdlIG1hbmFnZXIgc3VwcG9ydHMgbXVsdGktcGxhdGZvcm0gaW5zdGFsbGF0aW9uOicsXG4gICAgICAnICAgIFNlZSBodHRwczovL3NoYXJwLnBpeGVscGx1bWJpbmcuY29tL2luc3RhbGwjY3Jvc3MtcGxhdGZvcm0nLFxuICAgICAgJy0gQWRkIHBsYXRmb3JtLXNwZWNpZmljIGRlcGVuZGVuY2llczonLFxuICAgICAgYCAgICBucG0gaW5zdGFsbCAtLW9zPSR7b3MucmVwbGFjZSgnbXVzbCcsICcnKX0ke2xpYmN9IC0tY3B1PSR7Y3B1fSBzaGFycGBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGhlbHAucHVzaChcbiAgICAgIGAtIE1hbnVhbGx5IGluc3RhbGwgbGlidmlwcyA+PSAke21pbmltdW1MaWJ2aXBzVmVyc2lvbn1gLFxuICAgICAgJy0gQWRkIGV4cGVyaW1lbnRhbCBXZWJBc3NlbWJseS1iYXNlZCBkZXBlbmRlbmNpZXM6JyxcbiAgICAgICcgICAgbnBtIGluc3RhbGwgLS1jcHU9d2FzbTMyIHNoYXJwJyxcbiAgICAgICcgICAgbnBtIGluc3RhbGwgQGltZy9zaGFycC13YXNtMzInXG4gICAgKTtcbiAgfVxuICBpZiAoaXNMaW51eCAmJiAvKHN5bWJvbCBub3QgZm91bmR8Q1hYQUJJXykvaS50ZXN0KG1lc3NhZ2VzKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGNvbmZpZyB9ID0gcmVxdWlyZShgQGltZy9zaGFycC1saWJ2aXBzLSR7cnVudGltZVBsYXRmb3JtfS9wYWNrYWdlYCk7XG4gICAgICBjb25zdCBsaWJjRm91bmQgPSBgJHtmYW1pbHlTeW5jKCl9ICR7dmVyc2lvblN5bmMoKX1gO1xuICAgICAgY29uc3QgbGliY1JlcXVpcmVzID0gYCR7Y29uZmlnLm11c2wgPyAnbXVzbCcgOiAnZ2xpYmMnfSAke2NvbmZpZy5tdXNsIHx8IGNvbmZpZy5nbGliY31gO1xuICAgICAgaGVscC5wdXNoKFxuICAgICAgICAnLSBVcGRhdGUgeW91ciBPUzonLFxuICAgICAgICBgICAgIEZvdW5kICR7bGliY0ZvdW5kfWAsXG4gICAgICAgIGAgICAgUmVxdWlyZXMgJHtsaWJjUmVxdWlyZXN9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJFbmdpbmVzKSB7fVxuICB9XG4gIGlmIChpc0xpbnV4ICYmIC9cXC9zbmFwXFwvY29yZVswLTldezJ9Ly50ZXN0KG1lc3NhZ2VzKSkge1xuICAgIGhlbHAucHVzaChcbiAgICAgICctIFJlbW92ZSB0aGUgTm9kZS5qcyBTbmFwLCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IG5hdGl2ZSBtb2R1bGVzJyxcbiAgICAgICcgICAgc25hcCByZW1vdmUgbm9kZSdcbiAgICApO1xuICB9XG4gIGlmIChpc01hY09zICYmIC9JbmNvbXBhdGlibGUgbGlicmFyeSB2ZXJzaW9uLy50ZXN0KG1lc3NhZ2VzKSkge1xuICAgIGhlbHAucHVzaChcbiAgICAgICctIFVwZGF0ZSBIb21lYnJldzonLFxuICAgICAgJyAgICBicmV3IHVwZGF0ZSAmJiBicmV3IHVwZ3JhZGUgdmlwcydcbiAgICApO1xuICB9XG4gIGlmIChlcnJvcnMuc29tZShlcnIgPT4gZXJyLmNvZGUgPT09ICdFUlJfRExPUEVOX0RJU0FCTEVEJykpIHtcbiAgICBoZWxwLnB1c2goJy0gUnVuIE5vZGUuanMgd2l0aG91dCB1c2luZyB0aGUgLS1uby1hZGRvbnMgZmxhZycpO1xuICB9XG4gIC8vIExpbmsgdG8gaW5zdGFsbGF0aW9uIGRvY3NcbiAgaWYgKGlzV2luZG93cyAmJiAvVGhlIHNwZWNpZmllZCBwcm9jZWR1cmUgY291bGQgbm90IGJlIGZvdW5kLy50ZXN0KG1lc3NhZ2VzKSkge1xuICAgIGhlbHAucHVzaChcbiAgICAgICctIFVzaW5nIHRoZSBjYW52YXMgcGFja2FnZSBvbiBXaW5kb3dzPycsXG4gICAgICAnICAgIFNlZSBodHRwczovL3NoYXJwLnBpeGVscGx1bWJpbmcuY29tL2luc3RhbGwjY2FudmFzLWFuZC13aW5kb3dzJyxcbiAgICAgICctIENoZWNrIGZvciBvdXRkYXRlZCB2ZXJzaW9ucyBvZiBzaGFycCBpbiB0aGUgZGVwZW5kZW5jeSB0cmVlOicsXG4gICAgICAnICAgIG5wbSBscyBzaGFycCdcbiAgICApO1xuICB9XG4gIGhlbHAucHVzaChcbiAgICAnLSBDb25zdWx0IHRoZSBpbnN0YWxsYXRpb24gZG9jdW1lbnRhdGlvbjonLFxuICAgICcgICAgU2VlIGh0dHBzOi8vc2hhcnAucGl4ZWxwbHVtYmluZy5jb20vaW5zdGFsbCdcbiAgKTtcbiAgdGhyb3cgbmV3IEVycm9yKGhlbHAuam9pbignXFxuJykpO1xufVxuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCdub2RlOnV0aWwnKTtcbmNvbnN0IHN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJyk7XG5jb25zdCBpcyA9IHJlcXVpcmUoJy4vaXMnKTtcblxucmVxdWlyZSgnLi9zaGFycCcpO1xuXG4vLyBVc2UgTk9ERV9ERUJVRz1zaGFycCB0byBlbmFibGUgbGlidmlwcyB3YXJuaW5nc1xuY29uc3QgZGVidWdsb2cgPSB1dGlsLmRlYnVnbG9nKCdzaGFycCcpO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIGZhY3RvcnkgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGBzaGFycGAsIHRvIHdoaWNoIGZ1cnRoZXIgbWV0aG9kcyBhcmUgY2hhaW5lZC5cbiAqXG4gKiBKUEVHLCBQTkcsIFdlYlAsIEdJRiwgQVZJRiBvciBUSUZGIGZvcm1hdCBpbWFnZSBkYXRhIGNhbiBiZSBzdHJlYW1lZCBvdXQgZnJvbSB0aGlzIG9iamVjdC5cbiAqIFdoZW4gdXNpbmcgU3RyZWFtIGJhc2VkIG91dHB1dCwgZGVyaXZlZCBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgYGluZm9gIGV2ZW50LlxuICpcbiAqIE5vbi1jcml0aWNhbCBwcm9ibGVtcyBlbmNvdW50ZXJlZCBkdXJpbmcgcHJvY2Vzc2luZyBhcmUgZW1pdHRlZCBhcyBgd2FybmluZ2AgZXZlbnRzLlxuICpcbiAqIEltcGxlbWVudHMgdGhlIFtzdHJlYW0uRHVwbGV4XShodHRwOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWwjc3RyZWFtX2NsYXNzX3N0cmVhbV9kdXBsZXgpIGNsYXNzLlxuICpcbiAqIFdoZW4gbG9hZGluZyBtb3JlIHRoYW4gb25lIHBhZ2UvZnJhbWUgb2YgYW4gYW5pbWF0ZWQgaW1hZ2UsXG4gKiB0aGVzZSBhcmUgY29tYmluZWQgYXMgYSB2ZXJ0aWNhbGx5LXN0YWNrZWQgXCJ0b2lsZXQgcm9sbFwiIGltYWdlXG4gKiB3aGVyZSB0aGUgb3ZlcmFsbCBoZWlnaHQgaXMgdGhlIGBwYWdlSGVpZ2h0YCBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgYHBhZ2VzYC5cbiAqXG4gKiBAY29uc3RydWN0cyBTaGFycFxuICpcbiAqIEBlbWl0cyBTaGFycCNpbmZvXG4gKiBAZW1pdHMgU2hhcnAjd2FybmluZ1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycCgnaW5wdXQuanBnJylcbiAqICAgLnJlc2l6ZSgzMDAsIDIwMClcbiAqICAgLnRvRmlsZSgnb3V0cHV0LmpwZycsIGZ1bmN0aW9uKGVycikge1xuICogICAgIC8vIG91dHB1dC5qcGcgaXMgYSAzMDAgcGl4ZWxzIHdpZGUgYW5kIDIwMCBwaXhlbHMgaGlnaCBpbWFnZVxuICogICAgIC8vIGNvbnRhaW5pbmcgYSBzY2FsZWQgYW5kIGNyb3BwZWQgdmVyc2lvbiBvZiBpbnB1dC5qcGdcbiAqICAgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlYWQgaW1hZ2UgZGF0YSBmcm9tIHJlbW90ZSBVUkwsXG4gKiAvLyByZXNpemUgdG8gMzAwIHBpeGVscyB3aWRlLFxuICogLy8gZW1pdCBhbiAnaW5mbycgZXZlbnQgd2l0aCBjYWxjdWxhdGVkIGRpbWVuc2lvbnNcbiAqIC8vIGFuZCBmaW5hbGx5IHdyaXRlIGltYWdlIGRhdGEgdG8gd3JpdGFibGVTdHJlYW1cbiAqIGNvbnN0IHsgYm9keSB9ID0gZmV0Y2goJ2h0dHBzOi8vLi4uJyk7XG4gKiBjb25zdCByZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlLmZyb21XZWIoYm9keSk7XG4gKiBjb25zdCB0cmFuc2Zvcm1lciA9IHNoYXJwKClcbiAqICAgLnJlc2l6ZSgzMDApXG4gKiAgIC5vbignaW5mbycsICh7IGhlaWdodCB9KSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coYEltYWdlIGhlaWdodCBpcyAke2hlaWdodH1gKTtcbiAqICAgfSk7XG4gKiByZWFkYWJsZVN0cmVhbS5waXBlKHRyYW5zZm9ybWVyKS5waXBlKHdyaXRhYmxlU3RyZWFtKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgYmxhbmsgMzAweDIwMCBQTkcgaW1hZ2Ugb2Ygc2VtaS10cmFuc2x1Y2VudCByZWQgcGl4ZWxzXG4gKiBzaGFycCh7XG4gKiAgIGNyZWF0ZToge1xuICogICAgIHdpZHRoOiAzMDAsXG4gKiAgICAgaGVpZ2h0OiAyMDAsXG4gKiAgICAgY2hhbm5lbHM6IDQsXG4gKiAgICAgYmFja2dyb3VuZDogeyByOiAyNTUsIGc6IDAsIGI6IDAsIGFscGhhOiAwLjUgfVxuICogICB9XG4gKiB9KVxuICogLnBuZygpXG4gKiAudG9CdWZmZXIoKVxuICogLnRoZW4oIC4uLiApO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IGFuIGFuaW1hdGVkIEdJRiB0byBhbiBhbmltYXRlZCBXZWJQXG4gKiBhd2FpdCBzaGFycCgnaW4uZ2lmJywgeyBhbmltYXRlZDogdHJ1ZSB9KS50b0ZpbGUoJ291dC53ZWJwJyk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlYWQgYSByYXcgYXJyYXkgb2YgcGl4ZWxzIGFuZCBzYXZlIGl0IHRvIGEgcG5nXG4gKiBjb25zdCBpbnB1dCA9IFVpbnQ4QXJyYXkuZnJvbShbMjU1LCAyNTUsIDI1NSwgMCwgMCwgMF0pOyAvLyBvciBVaW50OENsYW1wZWRBcnJheVxuICogY29uc3QgaW1hZ2UgPSBzaGFycChpbnB1dCwge1xuICogICAvLyBiZWNhdXNlIHRoZSBpbnB1dCBkb2VzIG5vdCBjb250YWluIGl0cyBkaW1lbnNpb25zIG9yIGhvdyBtYW55IGNoYW5uZWxzIGl0IGhhc1xuICogICAvLyB3ZSBuZWVkIHRvIHNwZWNpZnkgaXQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnNcbiAqICAgcmF3OiB7XG4gKiAgICAgd2lkdGg6IDIsXG4gKiAgICAgaGVpZ2h0OiAxLFxuICogICAgIGNoYW5uZWxzOiAzXG4gKiAgIH1cbiAqIH0pO1xuICogYXdhaXQgaW1hZ2UudG9GaWxlKCdteS10d28tcGl4ZWxzLnBuZycpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZW5lcmF0ZSBSR0IgR2F1c3NpYW4gbm9pc2VcbiAqIGF3YWl0IHNoYXJwKHtcbiAqICAgY3JlYXRlOiB7XG4gKiAgICAgd2lkdGg6IDMwMCxcbiAqICAgICBoZWlnaHQ6IDIwMCxcbiAqICAgICBjaGFubmVsczogMyxcbiAqICAgICBub2lzZToge1xuICogICAgICAgdHlwZTogJ2dhdXNzaWFuJyxcbiAqICAgICAgIG1lYW46IDEyOCxcbiAqICAgICAgIHNpZ21hOiAzMFxuICogICAgIH1cbiAqICB9XG4gKiB9KS50b0ZpbGUoJ25vaXNlLnBuZycpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZW5lcmF0ZSBhbiBpbWFnZSBmcm9tIHRleHRcbiAqIGF3YWl0IHNoYXJwKHtcbiAqICAgdGV4dDoge1xuICogICAgIHRleHQ6ICdIZWxsbywgd29ybGQhJyxcbiAqICAgICB3aWR0aDogNDAwLCAvLyBtYXggd2lkdGhcbiAqICAgICBoZWlnaHQ6IDMwMCAvLyBtYXggaGVpZ2h0XG4gKiAgIH1cbiAqIH0pLnRvRmlsZSgndGV4dF9idy5wbmcnKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2VuZXJhdGUgYW4gcmdiYSBpbWFnZSBmcm9tIHRleHQgdXNpbmcgcGFuZ28gbWFya3VwIGFuZCBmb250XG4gKiBhd2FpdCBzaGFycCh7XG4gKiAgIHRleHQ6IHtcbiAqICAgICB0ZXh0OiAnPHNwYW4gZm9yZWdyb3VuZD1cInJlZFwiPlJlZCE8L3NwYW4+PHNwYW4gYmFja2dyb3VuZD1cImN5YW5cIj5ibHVlPC9zcGFuPicsXG4gKiAgICAgZm9udDogJ3NhbnMnLFxuICogICAgIHJnYmE6IHRydWUsXG4gKiAgICAgZHBpOiAzMDBcbiAqICAgfVxuICogfSkudG9GaWxlKCd0ZXh0X3JnYmEucG5nJyk7XG4gKlxuICogQHBhcmFtIHsoQnVmZmVyfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fEludDE2QXJyYXl8VWludDMyQXJyYXl8SW50MzJBcnJheXxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fHN0cmluZyl9IFtpbnB1dF0gLSBpZiBwcmVzZW50LCBjYW4gYmVcbiAqICBhIEJ1ZmZlciAvIEFycmF5QnVmZmVyIC8gVWludDhBcnJheSAvIFVpbnQ4Q2xhbXBlZEFycmF5IGNvbnRhaW5pbmcgSlBFRywgUE5HLCBXZWJQLCBBVklGLCBHSUYsIFNWRyBvciBUSUZGIGltYWdlIGRhdGEsIG9yXG4gKiAgYSBUeXBlZEFycmF5IGNvbnRhaW5pbmcgcmF3IHBpeGVsIGltYWdlIGRhdGEsIG9yXG4gKiAgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZXN5c3RlbSBwYXRoIHRvIGFuIEpQRUcsIFBORywgV2ViUCwgQVZJRiwgR0lGLCBTVkcgb3IgVElGRiBpbWFnZSBmaWxlLlxuICogIEpQRUcsIFBORywgV2ViUCwgQVZJRiwgR0lGLCBTVkcsIFRJRkYgb3IgcmF3IHBpeGVsIGltYWdlIGRhdGEgY2FuIGJlIHN0cmVhbWVkIGludG8gdGhlIG9iamVjdCB3aGVuIG5vdCBwcmVzZW50LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGlmIHByZXNlbnQsIGlzIGFuIE9iamVjdCB3aXRoIG9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZmFpbE9uPSd3YXJuaW5nJ10gLSBXaGVuIHRvIGFib3J0IHByb2Nlc3Npbmcgb2YgaW52YWxpZCBwaXhlbCBkYXRhLCBvbmUgb2YgKGluIG9yZGVyIG9mIHNlbnNpdGl2aXR5LCBsZWFzdCB0byBtb3N0KTogJ25vbmUnLCAndHJ1bmNhdGVkJywgJ2Vycm9yJywgJ3dhcm5pbmcnLiBIaWdoZXIgbGV2ZWxzIGltcGx5IGxvd2VyIGxldmVscy4gSW52YWxpZCBtZXRhZGF0YSB3aWxsIGFsd2F5cyBhYm9ydC5cbiAqIEBwYXJhbSB7bnVtYmVyfGJvb2xlYW59IFtvcHRpb25zLmxpbWl0SW5wdXRQaXhlbHM9MjY4NDAyNjg5XSAtIERvIG5vdCBwcm9jZXNzIGlucHV0IGltYWdlcyB3aGVyZSB0aGUgbnVtYmVyIG9mIHBpeGVsc1xuICogICh3aWR0aCB4IGhlaWdodCkgZXhjZWVkcyB0aGlzIGxpbWl0LiBBc3N1bWVzIGltYWdlIGRpbWVuc2lvbnMgY29udGFpbmVkIGluIHRoZSBpbnB1dCBtZXRhZGF0YSBjYW4gYmUgdHJ1c3RlZC5cbiAqICBBbiBpbnRlZ3JhbCBOdW1iZXIgb2YgcGl4ZWxzLCB6ZXJvIG9yIGZhbHNlIHRvIHJlbW92ZSBsaW1pdCwgdHJ1ZSB0byB1c2UgZGVmYXVsdCBsaW1pdCBvZiAyNjg0MDI2ODkgKDB4M0ZGRiB4IDB4M0ZGRikuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnVubGltaXRlZD1mYWxzZV0gLSBTZXQgdGhpcyB0byBgdHJ1ZWAgdG8gcmVtb3ZlIHNhZmV0eSBmZWF0dXJlcyB0aGF0IGhlbHAgcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiAoSlBFRywgUE5HLCBTVkcsIEhFSUYpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW50aWFsUmVhZD10cnVlXSAtIFNldCB0aGlzIHRvIGBmYWxzZWAgdG8gdXNlIHJhbmRvbSBhY2Nlc3MgcmF0aGVyIHRoYW4gc2VxdWVudGlhbCByZWFkLiBTb21lIG9wZXJhdGlvbnMgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZGVuc2l0eT03Ml0gLSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBEUEkgZm9yIHZlY3RvciBpbWFnZXMgaW4gdGhlIHJhbmdlIDEgdG8gMTAwMDAwLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmlnbm9yZUljYz1mYWxzZV0gLSBzaG91bGQgdGhlIGVtYmVkZGVkIElDQyBwcm9maWxlLCBpZiBhbnksIGJlIGlnbm9yZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFnZXM9MV0gLSBOdW1iZXIgb2YgcGFnZXMgdG8gZXh0cmFjdCBmb3IgbXVsdGktcGFnZSBpbnB1dCAoR0lGLCBXZWJQLCBUSUZGKSwgdXNlIC0xIGZvciBhbGwgcGFnZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFnZT0wXSAtIFBhZ2UgbnVtYmVyIHRvIHN0YXJ0IGV4dHJhY3RpbmcgZnJvbSBmb3IgbXVsdGktcGFnZSBpbnB1dCAoR0lGLCBXZWJQLCBUSUZGKSwgemVybyBiYXNlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zdWJpZmQ9LTFdIC0gc3ViSUZEIChTdWIgSW1hZ2UgRmlsZSBEaXJlY3RvcnkpIHRvIGV4dHJhY3QgZm9yIE9NRS1USUZGLCBkZWZhdWx0cyB0byBtYWluIGltYWdlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxldmVsPTBdIC0gbGV2ZWwgdG8gZXh0cmFjdCBmcm9tIGEgbXVsdGktbGV2ZWwgaW5wdXQgKE9wZW5TbGlkZSksIHplcm8gYmFzZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFuaW1hdGVkPWZhbHNlXSAtIFNldCB0byBgdHJ1ZWAgdG8gcmVhZCBhbGwgZnJhbWVzL3BhZ2VzIG9mIGFuIGFuaW1hdGVkIGltYWdlIChHSUYsIFdlYlAsIFRJRkYpLCBlcXVpdmFsZW50IG9mIHNldHRpbmcgYHBhZ2VzYCB0byBgLTFgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJhd10gLSBkZXNjcmliZXMgcmF3IHBpeGVsIGlucHV0IGltYWdlIGRhdGEuIFNlZSBgcmF3KClgIGZvciBwaXhlbCBvcmRlcmluZy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5yYXcud2lkdGhdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyB3aWRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJhdy5oZWlnaHRdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyBoaWdoLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJhdy5jaGFubmVsc10gLSBpbnRlZ3JhbCBudW1iZXIgb2YgY2hhbm5lbHMsIGJldHdlZW4gMSBhbmQgNC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmF3LnByZW11bHRpcGxpZWRdIC0gc3BlY2lmaWVzIHRoYXQgdGhlIHJhdyBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByZW11bHRpcGxpZWQsIHNldCB0byBgdHJ1ZWBcbiAqICB0byBhdm9pZCBzaGFycCBwcmVtdWx0aXBseWluZyB0aGUgaW1hZ2UuIChvcHRpb25hbCwgZGVmYXVsdCBgZmFsc2VgKVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmNyZWF0ZV0gLSBkZXNjcmliZXMgYSBuZXcgaW1hZ2UgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jcmVhdGUud2lkdGhdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyB3aWRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNyZWF0ZS5oZWlnaHRdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyBoaWdoLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNyZWF0ZS5jaGFubmVsc10gLSBpbnRlZ3JhbCBudW1iZXIgb2YgY2hhbm5lbHMsIGVpdGhlciAzIChSR0IpIG9yIDQgKFJHQkEpLlxuICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBbb3B0aW9ucy5jcmVhdGUuYmFja2dyb3VuZF0gLSBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSB0byBleHRyYWN0IHZhbHVlcyBmb3IgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY3JlYXRlLm5vaXNlXSAtIGRlc2NyaWJlcyBhIG5vaXNlIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY3JlYXRlLm5vaXNlLnR5cGVdIC0gdHlwZSBvZiBnZW5lcmF0ZWQgbm9pc2UsIGN1cnJlbnRseSBvbmx5IGBnYXVzc2lhbmAgaXMgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNyZWF0ZS5ub2lzZS5tZWFuXSAtIG1lYW4gb2YgcGl4ZWxzIGluIGdlbmVyYXRlZCBub2lzZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jcmVhdGUubm9pc2Uuc2lnbWFdIC0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHBpeGVscyBpbiBnZW5lcmF0ZWQgbm9pc2UuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMudGV4dF0gLSBkZXNjcmliZXMgYSBuZXcgdGV4dCBpbWFnZSB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRleHQudGV4dF0gLSB0ZXh0IHRvIHJlbmRlciBhcyBhIFVURi04IHN0cmluZy4gSXQgY2FuIGNvbnRhaW4gUGFuZ28gbWFya3VwLCBmb3IgZXhhbXBsZSBgPGk+TGU8L2k+TW9uZGVgLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRleHQuZm9udF0gLSBmb250IG5hbWUgdG8gcmVuZGVyIHdpdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGV4dC5mb250ZmlsZV0gLSBhYnNvbHV0ZSBmaWxlc3lzdGVtIHBhdGggdG8gYSBmb250IGZpbGUgdGhhdCBjYW4gYmUgdXNlZCBieSBgZm9udGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGV4dC53aWR0aD0wXSAtIEludGVncmFsIG51bWJlciBvZiBwaXhlbHMgdG8gd29yZC13cmFwIGF0LiBMaW5lcyBvZiB0ZXh0IHdpZGVyIHRoYW4gdGhpcyB3aWxsIGJlIGJyb2tlbiBhdCB3b3JkIGJvdW5kYXJpZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGV4dC5oZWlnaHQ9MF0gLSBNYXhpbXVtIGludGVncmFsIG51bWJlciBvZiBwaXhlbHMgaGlnaC4gV2hlbiBkZWZpbmVkLCBgZHBpYCB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSB0ZXh0IHdpbGwgYXV0b21hdGljYWxseSBmaXQgdGhlIHBpeGVsIHJlc29sdXRpb24gZGVmaW5lZCBieSBgd2lkdGhgIGFuZCBgaGVpZ2h0YC4gV2lsbCBiZSBpZ25vcmVkIGlmIGB3aWR0aGAgaXMgbm90IHNwZWNpZmllZCBvciBzZXQgdG8gMC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50ZXh0LmFsaWduPSdsZWZ0J10gLSBBbGlnbm1lbnQgc3R5bGUgZm9yIG11bHRpLWxpbmUgdGV4dCAoYCdsZWZ0J2AsIGAnY2VudHJlJ2AsIGAnY2VudGVyJ2AsIGAncmlnaHQnYCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRleHQuanVzdGlmeT1mYWxzZV0gLSBzZXQgdGhpcyB0byB0cnVlIHRvIGFwcGx5IGp1c3RpZmljYXRpb24gdG8gdGhlIHRleHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGV4dC5kcGk9NzJdIC0gdGhlIHJlc29sdXRpb24gKHNpemUpIGF0IHdoaWNoIHRvIHJlbmRlciB0aGUgdGV4dC4gRG9lcyBub3QgdGFrZSBlZmZlY3QgaWYgYGhlaWdodGAgaXMgc3BlY2lmaWVkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50ZXh0LnJnYmE9ZmFsc2VdIC0gc2V0IHRoaXMgdG8gdHJ1ZSB0byBlbmFibGUgUkdCQSBvdXRwdXQuIFRoaXMgaXMgdXNlZnVsIGZvciBjb2xvdXIgZW1vamkgcmVuZGVyaW5nLCBvciBzdXBwb3J0IGZvciBwYW5nbyBtYXJrdXAgZmVhdHVyZXMgbGlrZSBgPHNwYW4gZm9yZWdyb3VuZD1cInJlZFwiPlJlZCE8L3NwYW4+YC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50ZXh0LnNwYWNpbmc9MF0gLSB0ZXh0IGxpbmUgaGVpZ2h0IGluIHBvaW50cy4gV2lsbCB1c2UgdGhlIGZvbnQgbGluZSBoZWlnaHQgaWYgbm9uZSBpcyBzcGVjaWZpZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGV4dC53cmFwPSd3b3JkJ10gLSB3b3JkIHdyYXBwaW5nIHN0eWxlIHdoZW4gd2lkdGggaXMgcHJvdmlkZWQsIG9uZSBvZjogJ3dvcmQnLCAnY2hhcicsICd3b3JkLWNoYXInIChwcmVmZXIgd29yZCwgZmFsbGJhY2sgdG8gY2hhcikgb3IgJ25vbmUnLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5jb25zdCBTaGFycCA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhaXMuZGVmaW5lZChpbnB1dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQnKTtcbiAgfVxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2hhcnApKSB7XG4gICAgcmV0dXJuIG5ldyBTaGFycChpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgc3RyZWFtLkR1cGxleC5jYWxsKHRoaXMpO1xuICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgLy8gcmVzaXplIG9wdGlvbnNcbiAgICB0b3BPZmZzZXRQcmU6IC0xLFxuICAgIGxlZnRPZmZzZXRQcmU6IC0xLFxuICAgIHdpZHRoUHJlOiAtMSxcbiAgICBoZWlnaHRQcmU6IC0xLFxuICAgIHRvcE9mZnNldFBvc3Q6IC0xLFxuICAgIGxlZnRPZmZzZXRQb3N0OiAtMSxcbiAgICB3aWR0aFBvc3Q6IC0xLFxuICAgIGhlaWdodFBvc3Q6IC0xLFxuICAgIHdpZHRoOiAtMSxcbiAgICBoZWlnaHQ6IC0xLFxuICAgIGNhbnZhczogJ2Nyb3AnLFxuICAgIHBvc2l0aW9uOiAwLFxuICAgIHJlc2l6ZUJhY2tncm91bmQ6IFswLCAwLCAwLCAyNTVdLFxuICAgIHVzZUV4aWZPcmllbnRhdGlvbjogZmFsc2UsXG4gICAgYW5nbGU6IDAsXG4gICAgcm90YXRpb25BbmdsZTogMCxcbiAgICByb3RhdGlvbkJhY2tncm91bmQ6IFswLCAwLCAwLCAyNTVdLFxuICAgIHJvdGF0ZUJlZm9yZVByZUV4dHJhY3Q6IGZhbHNlLFxuICAgIGZsaXA6IGZhbHNlLFxuICAgIGZsb3A6IGZhbHNlLFxuICAgIGV4dGVuZFRvcDogMCxcbiAgICBleHRlbmRCb3R0b206IDAsXG4gICAgZXh0ZW5kTGVmdDogMCxcbiAgICBleHRlbmRSaWdodDogMCxcbiAgICBleHRlbmRCYWNrZ3JvdW5kOiBbMCwgMCwgMCwgMjU1XSxcbiAgICBleHRlbmRXaXRoOiAnYmFja2dyb3VuZCcsXG4gICAgd2l0aG91dEVubGFyZ2VtZW50OiBmYWxzZSxcbiAgICB3aXRob3V0UmVkdWN0aW9uOiBmYWxzZSxcbiAgICBhZmZpbmVNYXRyaXg6IFtdLFxuICAgIGFmZmluZUJhY2tncm91bmQ6IFswLCAwLCAwLCAyNTVdLFxuICAgIGFmZmluZUlkeDogMCxcbiAgICBhZmZpbmVJZHk6IDAsXG4gICAgYWZmaW5lT2R4OiAwLFxuICAgIGFmZmluZU9keTogMCxcbiAgICBhZmZpbmVJbnRlcnBvbGF0b3I6IHRoaXMuY29uc3RydWN0b3IuaW50ZXJwb2xhdG9ycy5iaWxpbmVhcixcbiAgICBrZXJuZWw6ICdsYW5jem9zMycsXG4gICAgZmFzdFNocmlua09uTG9hZDogdHJ1ZSxcbiAgICAvLyBvcGVyYXRpb25zXG4gICAgdGludDogWy0xLCAwLCAwLCAwXSxcbiAgICBmbGF0dGVuOiBmYWxzZSxcbiAgICBmbGF0dGVuQmFja2dyb3VuZDogWzAsIDAsIDBdLFxuICAgIHVuZmxhdHRlbjogZmFsc2UsXG4gICAgbmVnYXRlOiBmYWxzZSxcbiAgICBuZWdhdGVBbHBoYTogdHJ1ZSxcbiAgICBtZWRpYW5TaXplOiAwLFxuICAgIGJsdXJTaWdtYTogMCxcbiAgICBwcmVjaXNpb246ICdpbnRlZ2VyJyxcbiAgICBtaW5BbXBsOiAwLjIsXG4gICAgc2hhcnBlblNpZ21hOiAwLFxuICAgIHNoYXJwZW5NMTogMSxcbiAgICBzaGFycGVuTTI6IDIsXG4gICAgc2hhcnBlblgxOiAyLFxuICAgIHNoYXJwZW5ZMjogMTAsXG4gICAgc2hhcnBlblkzOiAyMCxcbiAgICB0aHJlc2hvbGQ6IDAsXG4gICAgdGhyZXNob2xkR3JheXNjYWxlOiB0cnVlLFxuICAgIHRyaW1CYWNrZ3JvdW5kOiBbXSxcbiAgICB0cmltVGhyZXNob2xkOiAtMSxcbiAgICB0cmltTGluZUFydDogZmFsc2UsXG4gICAgZ2FtbWE6IDAsXG4gICAgZ2FtbWFPdXQ6IDAsXG4gICAgZ3JleXNjYWxlOiBmYWxzZSxcbiAgICBub3JtYWxpc2U6IGZhbHNlLFxuICAgIG5vcm1hbGlzZUxvd2VyOiAxLFxuICAgIG5vcm1hbGlzZVVwcGVyOiA5OSxcbiAgICBjbGFoZVdpZHRoOiAwLFxuICAgIGNsYWhlSGVpZ2h0OiAwLFxuICAgIGNsYWhlTWF4U2xvcGU6IDMsXG4gICAgYnJpZ2h0bmVzczogMSxcbiAgICBzYXR1cmF0aW9uOiAxLFxuICAgIGh1ZTogMCxcbiAgICBsaWdodG5lc3M6IDAsXG4gICAgYm9vbGVhbkJ1ZmZlckluOiBudWxsLFxuICAgIGJvb2xlYW5GaWxlSW46ICcnLFxuICAgIGpvaW5DaGFubmVsSW46IFtdLFxuICAgIGV4dHJhY3RDaGFubmVsOiAtMSxcbiAgICByZW1vdmVBbHBoYTogZmFsc2UsXG4gICAgZW5zdXJlQWxwaGE6IC0xLFxuICAgIGNvbG91cnNwYWNlOiAnc3JnYicsXG4gICAgY29sb3Vyc3BhY2VQaXBlbGluZTogJ2xhc3QnLFxuICAgIGNvbXBvc2l0ZTogW10sXG4gICAgLy8gb3V0cHV0XG4gICAgZmlsZU91dDogJycsXG4gICAgZm9ybWF0T3V0OiAnaW5wdXQnLFxuICAgIHN0cmVhbU91dDogZmFsc2UsXG4gICAga2VlcE1ldGFkYXRhOiAwLFxuICAgIHdpdGhNZXRhZGF0YU9yaWVudGF0aW9uOiAtMSxcbiAgICB3aXRoTWV0YWRhdGFEZW5zaXR5OiAwLFxuICAgIHdpdGhJY2NQcm9maWxlOiAnJyxcbiAgICB3aXRoRXhpZjoge30sXG4gICAgd2l0aEV4aWZNZXJnZTogdHJ1ZSxcbiAgICByZXNvbHZlV2l0aE9iamVjdDogZmFsc2UsXG4gICAgLy8gb3V0cHV0IGZvcm1hdFxuICAgIGpwZWdRdWFsaXR5OiA4MCxcbiAgICBqcGVnUHJvZ3Jlc3NpdmU6IGZhbHNlLFxuICAgIGpwZWdDaHJvbWFTdWJzYW1wbGluZzogJzQ6MjowJyxcbiAgICBqcGVnVHJlbGxpc1F1YW50aXNhdGlvbjogZmFsc2UsXG4gICAganBlZ092ZXJzaG9vdERlcmluZ2luZzogZmFsc2UsXG4gICAganBlZ09wdGltaXNlU2NhbnM6IGZhbHNlLFxuICAgIGpwZWdPcHRpbWlzZUNvZGluZzogdHJ1ZSxcbiAgICBqcGVnUXVhbnRpc2F0aW9uVGFibGU6IDAsXG4gICAgcG5nUHJvZ3Jlc3NpdmU6IGZhbHNlLFxuICAgIHBuZ0NvbXByZXNzaW9uTGV2ZWw6IDYsXG4gICAgcG5nQWRhcHRpdmVGaWx0ZXJpbmc6IGZhbHNlLFxuICAgIHBuZ1BhbGV0dGU6IGZhbHNlLFxuICAgIHBuZ1F1YWxpdHk6IDEwMCxcbiAgICBwbmdFZmZvcnQ6IDcsXG4gICAgcG5nQml0ZGVwdGg6IDgsXG4gICAgcG5nRGl0aGVyOiAxLFxuICAgIGpwMlF1YWxpdHk6IDgwLFxuICAgIGpwMlRpbGVIZWlnaHQ6IDUxMixcbiAgICBqcDJUaWxlV2lkdGg6IDUxMixcbiAgICBqcDJMb3NzbGVzczogZmFsc2UsXG4gICAganAyQ2hyb21hU3Vic2FtcGxpbmc6ICc0OjQ6NCcsXG4gICAgd2VicFF1YWxpdHk6IDgwLFxuICAgIHdlYnBBbHBoYVF1YWxpdHk6IDEwMCxcbiAgICB3ZWJwTG9zc2xlc3M6IGZhbHNlLFxuICAgIHdlYnBOZWFyTG9zc2xlc3M6IGZhbHNlLFxuICAgIHdlYnBTbWFydFN1YnNhbXBsZTogZmFsc2UsXG4gICAgd2VicFByZXNldDogJ2RlZmF1bHQnLFxuICAgIHdlYnBFZmZvcnQ6IDQsXG4gICAgd2VicE1pblNpemU6IGZhbHNlLFxuICAgIHdlYnBNaXhlZDogZmFsc2UsXG4gICAgZ2lmQml0ZGVwdGg6IDgsXG4gICAgZ2lmRWZmb3J0OiA3LFxuICAgIGdpZkRpdGhlcjogMSxcbiAgICBnaWZJbnRlckZyYW1lTWF4RXJyb3I6IDAsXG4gICAgZ2lmSW50ZXJQYWxldHRlTWF4RXJyb3I6IDMsXG4gICAgZ2lmUmV1c2U6IHRydWUsXG4gICAgZ2lmUHJvZ3Jlc3NpdmU6IGZhbHNlLFxuICAgIHRpZmZRdWFsaXR5OiA4MCxcbiAgICB0aWZmQ29tcHJlc3Npb246ICdqcGVnJyxcbiAgICB0aWZmUHJlZGljdG9yOiAnaG9yaXpvbnRhbCcsXG4gICAgdGlmZlB5cmFtaWQ6IGZhbHNlLFxuICAgIHRpZmZNaW5pc3doaXRlOiBmYWxzZSxcbiAgICB0aWZmQml0ZGVwdGg6IDgsXG4gICAgdGlmZlRpbGU6IGZhbHNlLFxuICAgIHRpZmZUaWxlSGVpZ2h0OiAyNTYsXG4gICAgdGlmZlRpbGVXaWR0aDogMjU2LFxuICAgIHRpZmZYcmVzOiAxLjAsXG4gICAgdGlmZllyZXM6IDEuMCxcbiAgICB0aWZmUmVzb2x1dGlvblVuaXQ6ICdpbmNoJyxcbiAgICBoZWlmUXVhbGl0eTogNTAsXG4gICAgaGVpZkxvc3NsZXNzOiBmYWxzZSxcbiAgICBoZWlmQ29tcHJlc3Npb246ICdhdjEnLFxuICAgIGhlaWZFZmZvcnQ6IDQsXG4gICAgaGVpZkNocm9tYVN1YnNhbXBsaW5nOiAnNDo0OjQnLFxuICAgIGhlaWZCaXRkZXB0aDogOCxcbiAgICBqeGxEaXN0YW5jZTogMSxcbiAgICBqeGxEZWNvZGluZ1RpZXI6IDAsXG4gICAganhsRWZmb3J0OiA3LFxuICAgIGp4bExvc3NsZXNzOiBmYWxzZSxcbiAgICByYXdEZXB0aDogJ3VjaGFyJyxcbiAgICB0aWxlU2l6ZTogMjU2LFxuICAgIHRpbGVPdmVybGFwOiAwLFxuICAgIHRpbGVDb250YWluZXI6ICdmcycsXG4gICAgdGlsZUxheW91dDogJ2R6JyxcbiAgICB0aWxlRm9ybWF0OiAnbGFzdCcsXG4gICAgdGlsZURlcHRoOiAnbGFzdCcsXG4gICAgdGlsZUFuZ2xlOiAwLFxuICAgIHRpbGVTa2lwQmxhbmtzOiAtMSxcbiAgICB0aWxlQmFja2dyb3VuZDogWzI1NSwgMjU1LCAyNTUsIDI1NV0sXG4gICAgdGlsZUNlbnRyZTogZmFsc2UsXG4gICAgdGlsZUlkOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9paWlmJyxcbiAgICB0aWxlQmFzZW5hbWU6ICcnLFxuICAgIHRpbWVvdXRTZWNvbmRzOiAwLFxuICAgIGxpbmVhckE6IFtdLFxuICAgIGxpbmVhckI6IFtdLFxuICAgIC8vIEZ1bmN0aW9uIHRvIG5vdGlmeSBvZiBsaWJ2aXBzIHdhcm5pbmdzXG4gICAgZGVidWdsb2c6IHdhcm5pbmcgPT4ge1xuICAgICAgdGhpcy5lbWl0KCd3YXJuaW5nJywgd2FybmluZyk7XG4gICAgICBkZWJ1Z2xvZyh3YXJuaW5nKTtcbiAgICB9LFxuICAgIC8vIEZ1bmN0aW9uIHRvIG5vdGlmeSBvZiBxdWV1ZSBsZW5ndGggY2hhbmdlc1xuICAgIHF1ZXVlTGlzdGVuZXI6IGZ1bmN0aW9uIChxdWV1ZUxlbmd0aCkge1xuICAgICAgU2hhcnAucXVldWUuZW1pdCgnY2hhbmdlJywgcXVldWVMZW5ndGgpO1xuICAgIH1cbiAgfTtcbiAgdGhpcy5vcHRpb25zLmlucHV0ID0gdGhpcy5fY3JlYXRlSW5wdXREZXNjcmlwdG9yKGlucHV0LCBvcHRpb25zLCB7IGFsbG93U3RyZWFtOiB0cnVlIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoU2hhcnAucHJvdG90eXBlLCBzdHJlYW0uRHVwbGV4LnByb3RvdHlwZSk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoU2hhcnAsIHN0cmVhbS5EdXBsZXgpO1xuXG4vKipcbiAqIFRha2UgYSBcInNuYXBzaG90XCIgb2YgdGhlIFNoYXJwIGluc3RhbmNlLCByZXR1cm5pbmcgYSBuZXcgaW5zdGFuY2UuXG4gKiBDbG9uZWQgaW5zdGFuY2VzIGluaGVyaXQgdGhlIGlucHV0IG9mIHRoZWlyIHBhcmVudCBpbnN0YW5jZS5cbiAqIFRoaXMgYWxsb3dzIG11bHRpcGxlIG91dHB1dCBTdHJlYW1zIGFuZCB0aGVyZWZvcmUgbXVsdGlwbGUgcHJvY2Vzc2luZyBwaXBlbGluZXMgdG8gc2hhcmUgYSBzaW5nbGUgaW5wdXQgU3RyZWFtLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBwaXBlbGluZSA9IHNoYXJwKCkucm90YXRlKCk7XG4gKiBwaXBlbGluZS5jbG9uZSgpLnJlc2l6ZSg4MDAsIDYwMCkucGlwZShmaXJzdFdyaXRhYmxlU3RyZWFtKTtcbiAqIHBpcGVsaW5lLmNsb25lKCkuZXh0cmFjdCh7IGxlZnQ6IDIwLCB0b3A6IDIwLCB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9KS5waXBlKHNlY29uZFdyaXRhYmxlU3RyZWFtKTtcbiAqIHJlYWRhYmxlU3RyZWFtLnBpcGUocGlwZWxpbmUpO1xuICogLy8gZmlyc3RXcml0YWJsZVN0cmVhbSByZWNlaXZlcyBhdXRvLXJvdGF0ZWQsIHJlc2l6ZWQgcmVhZGFibGVTdHJlYW1cbiAqIC8vIHNlY29uZFdyaXRhYmxlU3RyZWFtIHJlY2VpdmVzIGF1dG8tcm90YXRlZCwgZXh0cmFjdGVkIHJlZ2lvbiBvZiByZWFkYWJsZVN0cmVhbVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBwaXBlbGluZSB0aGF0IHdpbGwgZG93bmxvYWQgYW4gaW1hZ2UsIHJlc2l6ZSBpdCBhbmQgZm9ybWF0IGl0IHRvIGRpZmZlcmVudCBmaWxlc1xuICogLy8gVXNpbmcgUHJvbWlzZXMgdG8ga25vdyB3aGVuIHRoZSBwaXBlbGluZSBpcyBjb21wbGV0ZVxuICogY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gKiBjb25zdCBnb3QgPSByZXF1aXJlKFwiZ290XCIpO1xuICogY29uc3Qgc2hhcnBTdHJlYW0gPSBzaGFycCh7IGZhaWxPbjogJ25vbmUnIH0pO1xuICpcbiAqIGNvbnN0IHByb21pc2VzID0gW107XG4gKlxuICogcHJvbWlzZXMucHVzaChcbiAqICAgc2hhcnBTdHJlYW1cbiAqICAgICAuY2xvbmUoKVxuICogICAgIC5qcGVnKHsgcXVhbGl0eTogMTAwIH0pXG4gKiAgICAgLnRvRmlsZShcIm9yaWdpbmFsRmlsZS5qcGdcIilcbiAqICk7XG4gKlxuICogcHJvbWlzZXMucHVzaChcbiAqICAgc2hhcnBTdHJlYW1cbiAqICAgICAuY2xvbmUoKVxuICogICAgIC5yZXNpemUoeyB3aWR0aDogNTAwIH0pXG4gKiAgICAgLmpwZWcoeyBxdWFsaXR5OiA4MCB9KVxuICogICAgIC50b0ZpbGUoXCJvcHRpbWl6ZWQtNTAwLmpwZ1wiKVxuICogKTtcbiAqXG4gKiBwcm9taXNlcy5wdXNoKFxuICogICBzaGFycFN0cmVhbVxuICogICAgIC5jbG9uZSgpXG4gKiAgICAgLnJlc2l6ZSh7IHdpZHRoOiA1MDAgfSlcbiAqICAgICAud2VicCh7IHF1YWxpdHk6IDgwIH0pXG4gKiAgICAgLnRvRmlsZShcIm9wdGltaXplZC01MDAud2VicFwiKVxuICogKTtcbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2dvdC9ibG9iL21haW4vZG9jdW1lbnRhdGlvbi8zLXN0cmVhbXMubWRcbiAqIGdvdC5zdHJlYW0oXCJodHRwczovL3d3dy5leGFtcGxlLmNvbS9zb21lLWZpbGUuanBnXCIpLnBpcGUoc2hhcnBTdHJlYW0pO1xuICpcbiAqIFByb21pc2UuYWxsKHByb21pc2VzKVxuICogICAudGhlbihyZXMgPT4geyBjb25zb2xlLmxvZyhcIkRvbmUhXCIsIHJlcyk7IH0pXG4gKiAgIC5jYXRjaChlcnIgPT4ge1xuICogICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwcm9jZXNzaW5nIGZpbGVzLCBsZXQncyBjbGVhbiBpdCB1cFwiLCBlcnIpO1xuICogICAgIHRyeSB7XG4gKiAgICAgICBmcy51bmxpbmtTeW5jKFwib3JpZ2luYWxGaWxlLmpwZ1wiKTtcbiAqICAgICAgIGZzLnVubGlua1N5bmMoXCJvcHRpbWl6ZWQtNTAwLmpwZ1wiKTtcbiAqICAgICAgIGZzLnVubGlua1N5bmMoXCJvcHRpbWl6ZWQtNTAwLndlYnBcIik7XG4gKiAgICAgfSBjYXRjaCAoZSkge31cbiAqICAgfSk7XG4gKlxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBjbG9uZSAoKSB7XG4gIC8vIENsb25lIGV4aXN0aW5nIG9wdGlvbnNcbiAgY29uc3QgY2xvbmUgPSB0aGlzLmNvbnN0cnVjdG9yLmNhbGwoKTtcbiAgY29uc3QgeyBkZWJ1Z2xvZywgcXVldWVMaXN0ZW5lciwgLi4ub3B0aW9ucyB9ID0gdGhpcy5vcHRpb25zO1xuICBjbG9uZS5vcHRpb25zID0gc3RydWN0dXJlZENsb25lKG9wdGlvbnMpO1xuICBjbG9uZS5vcHRpb25zLmRlYnVnbG9nID0gZGVidWdsb2c7XG4gIGNsb25lLm9wdGlvbnMucXVldWVMaXN0ZW5lciA9IHF1ZXVlTGlzdGVuZXI7XG4gIC8vIFBhc3MgJ2ZpbmlzaCcgZXZlbnQgdG8gY2xvbmUgZm9yIFN0cmVhbS1iYXNlZCBpbnB1dFxuICBpZiAodGhpcy5faXNTdHJlYW1JbnB1dCgpKSB7XG4gICAgdGhpcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgLy8gQ2xvbmUgaW5oZXJpdHMgaW5wdXQgZGF0YVxuICAgICAgdGhpcy5fZmxhdHRlbkJ1ZmZlckluKCk7XG4gICAgICBjbG9uZS5vcHRpb25zLmlucHV0LmJ1ZmZlciA9IHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXI7XG4gICAgICBjbG9uZS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59XG5PYmplY3QuYXNzaWduKFNoYXJwLnByb3RvdHlwZSwgeyBjbG9uZSB9KTtcblxuLyoqXG4gKiBFeHBvcnQgY29uc3RydWN0b3IuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IFNoYXJwO1xuIiwKICAgICIndXNlIHN0cmljdCdcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcclxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXHJcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcclxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcclxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcclxuXHRcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXHJcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXHJcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXHJcblx0XCJibHVlXCI6IFswLCAwLCAyNTVdLFxyXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcclxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXHJcblx0XCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxyXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxyXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxyXG5cdFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxyXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXHJcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXHJcblx0XCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXHJcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXHJcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcclxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXHJcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxyXG5cdFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxyXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcclxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXHJcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxyXG5cdFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxyXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcclxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXHJcblx0XCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcclxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXHJcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXHJcblx0XCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxyXG5cdFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxyXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXHJcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxyXG5cdFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXHJcblx0XCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcclxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcclxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXHJcblx0XCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxyXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXHJcblx0XCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXHJcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXHJcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxyXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXHJcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcclxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxyXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXHJcblx0XCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxyXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxyXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxyXG5cdFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxyXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXHJcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcclxuXHRcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXHJcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxyXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXHJcblx0XCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxyXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxyXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxyXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXHJcblx0XCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXHJcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxyXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcclxuXHRcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcclxuXHRcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcclxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXHJcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcclxuXHRcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcclxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcclxuXHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxyXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcclxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcclxuXHRcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXHJcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcclxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXHJcblx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxyXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxyXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxyXG5cdFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXHJcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxyXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcclxuXHRcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcclxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcclxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXHJcblx0XCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcclxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXHJcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXHJcblx0XCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcclxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXHJcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxyXG5cdFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXHJcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxyXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXHJcblx0XCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcclxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxyXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcclxuXHRcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXHJcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcclxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxyXG5cdFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXHJcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcclxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXHJcblx0XCJyZWRcIjogWzI1NSwgMCwgMF0sXHJcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxyXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxyXG5cdFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcclxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXHJcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxyXG5cdFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcclxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcclxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxyXG5cdFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcclxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxyXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxyXG5cdFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcclxuXHRcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXHJcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXHJcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxyXG5cdFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxyXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXHJcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcclxuXHRcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcclxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXHJcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXHJcblx0XCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXHJcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcclxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxyXG5cdFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cclxufTtcclxuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBpc0FycmF5aXNoID0gcmVxdWlyZSgnaXMtYXJyYXlpc2gnKTtcblxudmFyIGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbnZhciBzd2l6emxlID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzd2l6emxlKGFyZ3MpIHtcblx0dmFyIHJlc3VsdHMgPSBbXTtcblxuXHRmb3IgKHZhciBpID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdHZhciBhcmcgPSBhcmdzW2ldO1xuXG5cdFx0aWYgKGlzQXJyYXlpc2goYXJnKSkge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vamF2YXNjcmlwdC1hcnJheS1jb25jYXQtdnMtcHVzaC85OFxuXHRcdFx0cmVzdWx0cyA9IGNvbmNhdC5jYWxsKHJlc3VsdHMsIHNsaWNlLmNhbGwoYXJnKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdHMucHVzaChhcmcpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuc3dpenpsZS53cmFwID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGZuKHN3aXp6bGUoYXJndW1lbnRzKSk7XG5cdH07XG59O1xuIiwKICAgICIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNvbG9yTmFtZXMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG52YXIgc3dpenpsZSA9IHJlcXVpcmUoJ3NpbXBsZS1zd2l6emxlJyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QuaGFzT3duUHJvcGVydHk7XG5cbnZhciByZXZlcnNlTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyBjcmVhdGUgYSBsaXN0IG9mIHJldmVyc2UgY29sb3IgbmFtZXNcbmZvciAodmFyIG5hbWUgaW4gY29sb3JOYW1lcykge1xuXHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBuYW1lKSkge1xuXHRcdHJldmVyc2VOYW1lc1tjb2xvck5hbWVzW25hbWVdXSA9IG5hbWU7XG5cdH1cbn1cblxudmFyIGNzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdHRvOiB7fSxcblx0Z2V0OiB7fVxufTtcblxuY3MuZ2V0ID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcHJlZml4ID0gc3RyaW5nLnN1YnN0cmluZygwLCAzKS50b0xvd2VyQ2FzZSgpO1xuXHR2YXIgdmFsO1xuXHR2YXIgbW9kZWw7XG5cdHN3aXRjaCAocHJlZml4KSB7XG5cdFx0Y2FzZSAnaHNsJzpcblx0XHRcdHZhbCA9IGNzLmdldC5oc2woc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ2hzbCc7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdod2InOlxuXHRcdFx0dmFsID0gY3MuZ2V0Lmh3YihzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAnaHdiJztcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR2YWwgPSBjcy5nZXQucmdiKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdyZ2InO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRpZiAoIXZhbCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmV0dXJuIHttb2RlbDogbW9kZWwsIHZhbHVlOiB2YWx9O1xufTtcblxuY3MuZ2V0LnJnYiA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBhYmJyID0gL14jKFthLWYwLTldezMsNH0pJC9pO1xuXHR2YXIgaGV4ID0gL14jKFthLWYwLTldezZ9KShbYS1mMC05XXsyfSk/JC9pO1xuXHR2YXIgcmdiYSA9IC9ecmdiYT9cXChcXHMqKFsrLV0/XFxkKykoPz1bXFxzLF0pXFxzKig/OixcXHMqKT8oWystXT9cXGQrKSg/PVtcXHMsXSlcXHMqKD86LFxccyopPyhbKy1dP1xcZCspXFxzKig/OlssfFxcL11cXHMqKFsrLV0/W1xcZFxcLl0rKSglPylcXHMqKT9cXCkkLztcblx0dmFyIHBlciA9IC9ecmdiYT9cXChcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosP1xccyooWystXT9bXFxkXFwuXSspXFwlXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqKD86Wyx8XFwvXVxccyooWystXT9bXFxkXFwuXSspKCU/KVxccyopP1xcKSQvO1xuXHR2YXIga2V5d29yZCA9IC9eKFxcdyspJC87XG5cblx0dmFyIHJnYiA9IFswLCAwLCAwLCAxXTtcblx0dmFyIG1hdGNoO1xuXHR2YXIgaTtcblx0dmFyIGhleEFscGhhO1xuXG5cdGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChoZXgpKSB7XG5cdFx0aGV4QWxwaGEgPSBtYXRjaFsyXTtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL3NsaWNlLXZzLXN1YnN0ci12cy1zdWJzdHJpbmctbWV0aG9kcy1sb25nLXN0cmluZy8xOVxuXHRcdFx0dmFyIGkyID0gaSAqIDI7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaC5zbGljZShpMiwgaTIgKyAyKSwgMTYpO1xuXHRcdH1cblxuXHRcdGlmIChoZXhBbHBoYSkge1xuXHRcdFx0cmdiWzNdID0gcGFyc2VJbnQoaGV4QWxwaGEsIDE2KSAvIDI1NTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goYWJicikpIHtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXHRcdGhleEFscGhhID0gbWF0Y2hbM107XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpXSArIG1hdGNoW2ldLCAxNik7XG5cdFx0fVxuXG5cdFx0aWYgKGhleEFscGhhKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUludChoZXhBbHBoYSArIGhleEFscGhhLCAxNikgLyAyNTU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHJnYmEpKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaSArIDFdLCAwKTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2hbNF0pIHtcblx0XHRcdGlmIChtYXRjaFs1XSkge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKSAqIDAuMDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRpZiAobWF0Y2hbNV0pIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSkgKiAwLjAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGtleXdvcmQpKSB7XG5cdFx0aWYgKG1hdGNoWzFdID09PSAndHJhbnNwYXJlbnQnKSB7XG5cdFx0XHRyZXR1cm4gWzAsIDAsIDAsIDBdO1xuXHRcdH1cblxuXHRcdGlmICghaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBtYXRjaFsxXSkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJnYiA9IGNvbG9yTmFtZXNbbWF0Y2hbMV1dO1xuXHRcdHJnYlszXSA9IDE7XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHJnYltpXSA9IGNsYW1wKHJnYltpXSwgMCwgMjU1KTtcblx0fVxuXHRyZ2JbM10gPSBjbGFtcChyZ2JbM10sIDAsIDEpO1xuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jcy5nZXQuaHNsID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGhzbCA9IC9eaHNsYT9cXChcXHMqKFsrLV0/KD86XFxkezAsM31cXC4pP1xcZCspKD86ZGVnKT9cXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86Wyx8XFwvXVxccyooWystXT8oPz1cXC5cXGR8XFxkKSg/OjB8WzEtOV1cXGQqKT8oPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pXFxzKik/XFwpJC87XG5cdHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChoc2wpO1xuXG5cdGlmIChtYXRjaCkge1xuXHRcdHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdHZhciBoID0gKChwYXJzZUZsb2F0KG1hdGNoWzFdKSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXHRcdHZhciBzID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCk7XG5cdFx0dmFyIGwgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKTtcblx0XHR2YXIgYSA9IGNsYW1wKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG5cblx0XHRyZXR1cm4gW2gsIHMsIGwsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy5nZXQuaHdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGh3YiA9IC9eaHdiXFwoXFxzKihbKy1dP1xcZHswLDN9KD86XFwuXFxkKyk/KSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dPyg/PVxcLlxcZHxcXGQpKD86MHxbMS05XVxcZCopPyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGh3Yik7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHcgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgYiA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblx0XHRyZXR1cm4gW2gsIHcsIGIsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy50by5oZXggPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiAoXG5cdFx0JyMnICtcblx0XHRoZXhEb3VibGUocmdiYVswXSkgK1xuXHRcdGhleERvdWJsZShyZ2JhWzFdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMl0pICtcblx0XHQocmdiYVszXSA8IDFcblx0XHRcdD8gKGhleERvdWJsZShNYXRoLnJvdW5kKHJnYmFbM10gKiAyNTUpKSlcblx0XHRcdDogJycpXG5cdCk7XG59O1xuXG5jcy50by5yZ2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiByZ2JhLmxlbmd0aCA8IDQgfHwgcmdiYVszXSA9PT0gMVxuXHRcdD8gJ3JnYignICsgTWF0aC5yb3VuZChyZ2JhWzBdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMV0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsyXSkgKyAnKSdcblx0XHQ6ICdyZ2JhKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcsICcgKyByZ2JhWzNdICsgJyknO1xufTtcblxuY3MudG8ucmdiLnBlcmNlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdIC8gMjU1ICogMTAwKTtcblx0dmFyIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0gLyAyNTUgKiAxMDApO1xuXHR2YXIgYiA9IE1hdGgucm91bmQocmdiYVsyXSAvIDI1NSAqIDEwMCk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyByICsgJyUsICcgKyBnICsgJyUsICcgKyBiICsgJyUpJ1xuXHRcdDogJ3JnYmEoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSwgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5oc2wgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBoc2xhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXHRyZXR1cm4gaHNsYS5sZW5ndGggPCA0IHx8IGhzbGFbM10gPT09IDFcblx0XHQ/ICdoc2woJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclKSdcblx0XHQ6ICdoc2xhKCcgKyBoc2xhWzBdICsgJywgJyArIGhzbGFbMV0gKyAnJSwgJyArIGhzbGFbMl0gKyAnJSwgJyArIGhzbGFbM10gKyAnKSc7XG59O1xuXG4vLyBod2IgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gcmdiKGEpICYgaHNsKGEpIHNpbmNlIHRoZXJlIGlzIG5vIGFscGhhIHNwZWNpZmljIHN5bnRheFxuLy8gKGh3YiBoYXZlIGFscGhhIG9wdGlvbmFsICYgMSBpcyBkZWZhdWx0IHZhbHVlKVxuY3MudG8uaHdiID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgaHdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHR2YXIgYSA9ICcnO1xuXHRpZiAoaHdiYS5sZW5ndGggPj0gNCAmJiBod2JhWzNdICE9PSAxKSB7XG5cdFx0YSA9ICcsICcgKyBod2JhWzNdO1xuXHR9XG5cblx0cmV0dXJuICdod2IoJyArIGh3YmFbMF0gKyAnLCAnICsgaHdiYVsxXSArICclLCAnICsgaHdiYVsyXSArICclJyArIGEgKyAnKSc7XG59O1xuXG5jcy50by5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gcmV2ZXJzZU5hbWVzW3JnYi5zbGljZSgwLCAzKV07XG59O1xuXG4vLyBoZWxwZXJzXG5mdW5jdGlvbiBjbGFtcChudW0sIG1pbiwgbWF4KSB7XG5cdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XG59XG5cbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcblx0dmFyIHN0ciA9IE1hdGgucm91bmQobnVtKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuIChzdHIubGVuZ3RoIDwgMikgPyAnMCcgKyBzdHIgOiBzdHI7XG59XG4iLAogICAgIi8qIE1JVCBsaWNlbnNlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1taXhlZC1vcGVyYXRvcnMgKi9cbmNvbnN0IGNzc0tleXdvcmRzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG4vLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4vLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4vLyAgICAgICBkbyBub3QgdXNlIGJveCB2YWx1ZXMgdHlwZXMgKGkuZS4gTnVtYmVyKCksIFN0cmluZygpLCBldGMuKVxuXG5jb25zdCByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNzc0tleXdvcmRzKSkge1xuXHRyZXZlcnNlS2V5d29yZHNbY3NzS2V5d29yZHNba2V5XV0gPSBrZXk7XG59XG5cbmNvbnN0IGNvbnZlcnQgPSB7XG5cdHJnYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdyZ2InfSxcblx0aHNsOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzbCd9LFxuXHRoc3Y6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHN2J30sXG5cdGh3Yjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdod2InfSxcblx0Y215azoge2NoYW5uZWxzOiA0LCBsYWJlbHM6ICdjbXlrJ30sXG5cdHh5ejoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICd4eXonfSxcblx0bGFiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xhYid9LFxuXHRsY2g6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGNoJ30sXG5cdGhleDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnaGV4J119LFxuXHRrZXl3b3JkOiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydrZXl3b3JkJ119LFxuXHRhbnNpMTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kxNiddfSxcblx0YW5zaTI1Njoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTI1NiddfSxcblx0aGNnOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydoJywgJ2MnLCAnZyddfSxcblx0YXBwbGU6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ3IxNicsICdnMTYnLCAnYjE2J119LFxuXHRncmF5OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydncmF5J119XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbi8vIEhpZGUgLmNoYW5uZWxzIGFuZCAubGFiZWxzIHByb3BlcnRpZXNcbmZvciAoY29uc3QgbW9kZWwgb2YgT2JqZWN0LmtleXMoY29udmVydCkpIHtcblx0aWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcblx0fVxuXG5cdGNvbnN0IHtjaGFubmVscywgbGFiZWxzfSA9IGNvbnZlcnRbbW9kZWxdO1xuXHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xufVxuXG5jb252ZXJ0LnJnYi5oc2wgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcblx0Y29uc3QgZGVsdGEgPSBtYXggLSBtaW47XG5cdGxldCBoO1xuXHRsZXQgcztcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgcmRpZjtcblx0bGV0IGdkaWY7XG5cdGxldCBiZGlmO1xuXHRsZXQgaDtcblx0bGV0IHM7XG5cblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblx0Y29uc3QgdiA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IDA7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRpZmYgLyB2O1xuXHRcdHJkaWYgPSBkaWZmYyhyKTtcblx0XHRnZGlmID0gZGlmZmMoZyk7XG5cdFx0YmRpZiA9IGRpZmZjKGIpO1xuXG5cdFx0aWYgKHIgPT09IHYpIHtcblx0XHRcdGggPSBiZGlmIC0gZ2RpZjtcblx0XHR9IGVsc2UgaWYgKGcgPT09IHYpIHtcblx0XHRcdGggPSAoMSAvIDMpICsgcmRpZiAtIGJkaWY7XG5cdFx0fSBlbHNlIGlmIChiID09PSB2KSB7XG5cdFx0XHRoID0gKDIgLyAzKSArIGdkaWYgLSByZGlmO1xuXHRcdH1cblxuXHRcdGlmIChoIDwgMCkge1xuXHRcdFx0aCArPSAxO1xuXHRcdH0gZWxzZSBpZiAoaCA+IDEpIHtcblx0XHRcdGggLT0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gW1xuXHRcdGggKiAzNjAsXG5cdFx0cyAqIDEwMCxcblx0XHR2ICogMTAwXG5cdF07XG59O1xuXG5jb252ZXJ0LnJnYi5od2IgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF07XG5cdGNvbnN0IGcgPSByZ2JbMV07XG5cdGxldCBiID0gcmdiWzJdO1xuXHRjb25zdCBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG5cdGNvbnN0IHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHRjb25zdCBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG5cdGNvbnN0IGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0Y29uc3QgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRjb25zdCB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cblx0cmV0dXJuIFtjICogMTAwLCBtICogMTAwLCB5ICogMTAwLCBrICogMTAwXTtcbn07XG5cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHQvKlxuXHRcdFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuXHQqL1xuXHRyZXR1cm4gKFxuXHRcdCgoeFswXSAtIHlbMF0pICoqIDIpICtcblx0XHQoKHhbMV0gLSB5WzFdKSAqKiAyKSArXG5cdFx0KCh4WzJdIC0geVsyXSkgKiogMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblx0aWYgKHJldmVyc2VkKSB7XG5cdFx0cmV0dXJuIHJldmVyc2VkO1xuXHR9XG5cblx0bGV0IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblx0bGV0IGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcblxuXHRmb3IgKGNvbnN0IGtleXdvcmQgb2YgT2JqZWN0LmtleXMoY3NzS2V5d29yZHMpKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcblxuXHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRjb25zdCBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHQvLyBDaGVjayBpZiBpdHMgbGVzcywgaWYgc28gc2V0IGFzIGNsb3Nlc3Rcblx0XHRpZiAoZGlzdGFuY2UgPCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlKSB7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdEtleXdvcmQgPSBrZXl3b3JkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG59O1xuXG5jb252ZXJ0LmtleXdvcmQucmdiID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0cmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufTtcblxuY29udmVydC5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgciA9IHJnYlswXSAvIDI1NTtcblx0bGV0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGxldCBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdC8vIEFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wNDA0NSA/ICgoKHIgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChyIC8gMTIuOTIpO1xuXHRnID0gZyA+IDAuMDQwNDUgPyAoKChnICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAoZyAvIDEyLjkyKTtcblx0YiA9IGIgPiAwLjA0MDQ1ID8gKCgoYiArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKGIgLyAxMi45Mik7XG5cblx0Y29uc3QgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0Y29uc3QgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcblx0Y29uc3QgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuXHRyZXR1cm4gW3ggKiAxMDAsIHkgKiAxMDAsIHogKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0bGV0IHggPSB4eXpbMF07XG5cdGxldCB5ID0geHl6WzFdO1xuXHRsZXQgeiA9IHh5elsyXTtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gKHggKiogKDEgLyAzKSkgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyAoeSAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/ICh6ICoqICgxIC8gMykpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGNvbnN0IGwgPSAoMTE2ICogeSkgLSAxNjtcblx0Y29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG5cdGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF0gLyAzNjA7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cdGxldCB0Mjtcblx0bGV0IHQzO1xuXHRsZXQgdmFsO1xuXG5cdGlmIChzID09PSAwKSB7XG5cdFx0dmFsID0gbCAqIDI1NTtcblx0XHRyZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuXHR9XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHR0MiA9IGwgKiAoMSArIHMpO1xuXHR9IGVsc2Uge1xuXHRcdHQyID0gbCArIHMgLSBsICogcztcblx0fVxuXG5cdGNvbnN0IHQxID0gMiAqIGwgLSB0MjtcblxuXHRjb25zdCByZ2IgPSBbMCwgMCwgMF07XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRpZiAodDMgPCAwKSB7XG5cdFx0XHR0MysrO1xuXHRcdH1cblxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF07XG5cdGxldCBzID0gaHNsWzFdIC8gMTAwO1xuXHRsZXQgbCA9IGhzbFsyXSAvIDEwMDtcblx0bGV0IHNtaW4gPSBzO1xuXHRjb25zdCBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG5cblx0bCAqPSAyO1xuXHRzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0Y29uc3QgdiA9IChsICsgcykgLyAyO1xuXHRjb25zdCBzdiA9IGwgPT09IDAgPyAoMiAqIHNtaW4pIC8gKGxtaW4gKyBzbWluKSA6ICgyICogcykgLyAobCArIHMpO1xuXG5cdHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBoID0gaHN2WzBdIC8gNjA7XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGxldCB2ID0gaHN2WzJdIC8gMTAwO1xuXHRjb25zdCBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuXG5cdGNvbnN0IGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0Y29uc3QgcCA9IDI1NSAqIHYgKiAoMSAtIHMpO1xuXHRjb25zdCBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSk7XG5cdGNvbnN0IHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IGggPSBoc3ZbMF07XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cdGNvbnN0IHZtaW4gPSBNYXRoLm1heCh2LCAwLjAxKTtcblx0bGV0IHNsO1xuXHRsZXQgbDtcblxuXHRsID0gKDIgLSBzKSAqIHY7XG5cdGNvbnN0IGxtaW4gPSAoMiAtIHMpICogdm1pbjtcblx0c2wgPSBzICogdm1pbjtcblx0c2wgLz0gKGxtaW4gPD0gMSkgPyBsbWluIDogMiAtIGxtaW47XG5cdHNsID0gc2wgfHwgMDtcblx0bCAvPSAyO1xuXG5cdHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5jb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdGNvbnN0IGggPSBod2JbMF0gLyAzNjA7XG5cdGxldCB3aCA9IGh3YlsxXSAvIDEwMDtcblx0bGV0IGJsID0gaHdiWzJdIC8gMTAwO1xuXHRjb25zdCByYXRpbyA9IHdoICsgYmw7XG5cdGxldCBmO1xuXG5cdC8vIFdoICsgYmwgY2FudCBiZSA+IDFcblx0aWYgKHJhdGlvID4gMSkge1xuXHRcdHdoIC89IHJhdGlvO1xuXHRcdGJsIC89IHJhdGlvO1xuXHR9XG5cblx0Y29uc3QgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuXHRjb25zdCB2ID0gMSAtIGJsO1xuXHRmID0gNiAqIGggLSBpO1xuXG5cdGlmICgoaSAmIDB4MDEpICE9PSAwKSB7XG5cdFx0ZiA9IDEgLSBmO1xuXHR9XG5cblx0Y29uc3QgbiA9IHdoICsgZiAqICh2IC0gd2gpOyAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuXG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cdC8qIGVzbGludC1kaXNhYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lLG5vLW11bHRpLXNwYWNlcyAqL1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyAgZyA9IG47ICBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMTogciA9IG47ICBnID0gdjsgIGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAyOiByID0gd2g7IGcgPSB2OyAgYiA9IG47IGJyZWFrO1xuXHRcdGNhc2UgMzogciA9IHdoOyBnID0gbjsgIGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyAgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA1OiByID0gdjsgIGcgPSB3aDsgYiA9IG47IGJyZWFrO1xuXHR9XG5cdC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUsbm8tbXVsdGktc3BhY2VzICovXG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQuY215ay5yZ2IgPSBmdW5jdGlvbiAoY215aykge1xuXHRjb25zdCBjID0gY215a1swXSAvIDEwMDtcblx0Y29uc3QgbSA9IGNteWtbMV0gLyAxMDA7XG5cdGNvbnN0IHkgPSBjbXlrWzJdIC8gMTAwO1xuXHRjb25zdCBrID0gY215a1szXSAvIDEwMDtcblxuXHRjb25zdCByID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG5cdGNvbnN0IGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcblx0Y29uc3QgYiA9IDEgLSBNYXRoLm1pbigxLCB5ICogKDEgLSBrKSArIGspO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdGNvbnN0IHggPSB4eXpbMF0gLyAxMDA7XG5cdGNvbnN0IHkgPSB4eXpbMV0gLyAxMDA7XG5cdGNvbnN0IHogPSB4eXpbMl0gLyAxMDA7XG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cblx0ciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuXHRnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcblx0YiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cblx0Ly8gQXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAociAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoZyAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBnICogMTIuOTI7XG5cblx0YiA9IGIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoYiAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBiICogMTIuOTI7XG5cblx0ciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcblx0ZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcblx0YiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoubGFiID0gZnVuY3Rpb24gKHh5eikge1xuXHRsZXQgeCA9IHh5elswXTtcblx0bGV0IHkgPSB4eXpbMV07XG5cdGxldCB6ID0geHl6WzJdO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyAoeCAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/ICh5ICoqICgxIC8gMykpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gKHogKiogKDEgLyAzKSkgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0Y29uc3QgbCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRjb25zdCBhID0gNTAwICogKHggLSB5KTtcblx0Y29uc3QgYiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IHg7XG5cdGxldCB5O1xuXHRsZXQgejtcblxuXHR5ID0gKGwgKyAxNikgLyAxMTY7XG5cdHggPSBhIC8gNTAwICsgeTtcblx0eiA9IHkgLSBiIC8gMjAwO1xuXG5cdGNvbnN0IHkyID0geSAqKiAzO1xuXHRjb25zdCB4MiA9IHggKiogMztcblx0Y29uc3QgejIgPSB6ICoqIDM7XG5cdHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cblx0eCAqPSA5NS4wNDc7XG5cdHkgKj0gMTAwO1xuXHR6ICo9IDEwOC44ODM7XG5cblx0cmV0dXJuIFt4LCB5LCB6XTtcbn07XG5cbmNvbnZlcnQubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IGg7XG5cblx0Y29uc3QgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuXHRoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cblx0cmV0dXJuIFtsLCBjLCBoXTtcbn07XG5cbmNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcblx0Y29uc3QgbCA9IGxjaFswXTtcblx0Y29uc3QgYyA9IGxjaFsxXTtcblx0Y29uc3QgaCA9IGxjaFsyXTtcblxuXHRjb25zdCBociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0Y29uc3QgYSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGNvbnN0IGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncywgc2F0dXJhdGlvbiA9IG51bGwpIHtcblx0Y29uc3QgW3IsIGcsIGJdID0gYXJncztcblx0bGV0IHZhbHVlID0gc2F0dXJhdGlvbiA9PT0gbnVsbCA/IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXSA6IHNhdHVyYXRpb247IC8vIEhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cblx0dmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAzMDtcblx0fVxuXG5cdGxldCBhbnNpID0gMzBcblx0XHQrICgoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyKVxuXHRcdHwgKE1hdGgucm91bmQoZyAvIDI1NSkgPDwgMSlcblx0XHR8IE1hdGgucm91bmQociAvIDI1NSkpO1xuXG5cdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdGFuc2kgKz0gNjA7XG5cdH1cblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIE9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuXHQvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuXHRyZXR1cm4gY29udmVydC5yZ2IuYW5zaTE2KGNvbnZlcnQuaHN2LnJnYihhcmdzKSwgYXJnc1syXSk7XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgciA9IGFyZ3NbMF07XG5cdGNvbnN0IGcgPSBhcmdzWzFdO1xuXHRjb25zdCBiID0gYXJnc1syXTtcblxuXHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0aWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuXHRcdGlmIChyIDwgOCkge1xuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdH1cblxuXHRcdGlmIChyID4gMjQ4KSB7XG5cdFx0XHRyZXR1cm4gMjMxO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCgociAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0fVxuXG5cdGNvbnN0IGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRsZXQgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gSGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0Y29uc3QgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG5cdGNvbnN0IHIgPSAoKGNvbG9yICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgYiA9ICgoKGNvbG9yID4+IDIpICYgMSkgKiBtdWx0KSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5hbnNpMjU2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIEhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGFyZ3MgPj0gMjMyKSB7XG5cdFx0Y29uc3QgYyA9IChhcmdzIC0gMjMyKSAqIDEwICsgODtcblx0XHRyZXR1cm4gW2MsIGMsIGNdO1xuXHR9XG5cblx0YXJncyAtPSAxNjtcblxuXHRsZXQgcmVtO1xuXHRjb25zdCByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0Y29uc3QgZyA9IE1hdGguZmxvb3IoKHJlbSA9IGFyZ3MgJSAzNikgLyA2KSAvIDUgKiAyNTU7XG5cdGNvbnN0IGIgPSAocmVtICUgNikgLyA1ICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuXHRjb25zdCBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cblx0bGV0IGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cblx0aWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChjaGFyID0+IHtcblx0XHRcdHJldHVybiBjaGFyICsgY2hhcjtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdGNvbnN0IGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXHRjb25zdCByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0Y29uc3QgZyA9IChpbnRlZ2VyID4+IDgpICYgMHhGRjtcblx0Y29uc3QgYiA9IGludGVnZXIgJiAweEZGO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0Y29uc3QgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuXHRjb25zdCBjaHJvbWEgPSAobWF4IC0gbWluKTtcblx0bGV0IGdyYXlzY2FsZTtcblx0bGV0IGh1ZTtcblxuXHRpZiAoY2hyb21hIDwgMSkge1xuXHRcdGdyYXlzY2FsZSA9IG1pbiAvICgxIC0gY2hyb21hKTtcblx0fSBlbHNlIHtcblx0XHRncmF5c2NhbGUgPSAwO1xuXHR9XG5cblx0aWYgKGNocm9tYSA8PSAwKSB7XG5cdFx0aHVlID0gMDtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IHIpIHtcblx0XHRodWUgPSAoKGcgLSBiKSAvIGNocm9tYSkgJSA2O1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gZykge1xuXHRcdGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuXHR9IGVsc2Uge1xuXHRcdGh1ZSA9IDQgKyAociAtIGcpIC8gY2hyb21hO1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cblx0Y29uc3QgYyA9IGwgPCAwLjUgPyAoMi4wICogcyAqIGwpIDogKDIuMCAqIHMgKiAoMS4wIC0gbCkpO1xuXG5cdGxldCBmID0gMDtcblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKGwgLSAwLjUgKiBjKSAvICgxLjAgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgcyA9IGhzdlsxXSAvIDEwMDtcblx0Y29uc3QgdiA9IGhzdlsyXSAvIDEwMDtcblxuXHRjb25zdCBjID0gcyAqIHY7XG5cdGxldCBmID0gMDtcblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLnJnYiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgaCA9IGhjZ1swXSAvIDM2MDtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRpZiAoYyA9PT0gMC4wKSB7XG5cdFx0cmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcblx0fVxuXG5cdGNvbnN0IHB1cmUgPSBbMCwgMCwgMF07XG5cdGNvbnN0IGhpID0gKGggJSAxKSAqIDY7XG5cdGNvbnN0IHYgPSBoaSAlIDE7XG5cdGNvbnN0IHcgPSAxIC0gdjtcblx0bGV0IG1nID0gMDtcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblx0LyogZXNsaW50LWVuYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG5cdG1nID0gKDEuMCAtIGMpICogZztcblxuXHRyZXR1cm4gW1xuXHRcdChjICogcHVyZVswXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMV0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzJdICsgbWcpICogMjU1XG5cdF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc3YgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRsZXQgZiA9IDA7XG5cblx0aWYgKHYgPiAwLjApIHtcblx0XHRmID0gYyAvIHY7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgZiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc2wgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgbCA9IGcgKiAoMS4wIC0gYykgKyAwLjUgKiBjO1xuXHRsZXQgcyA9IDA7XG5cblx0aWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuXHRcdHMgPSBjIC8gKDIgKiBsKTtcblx0fSBlbHNlXG5cdGlmIChsID49IDAuNSAmJiBsIDwgMS4wKSB7XG5cdFx0cyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHdiID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXHRjb25zdCB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHdiLmhjZyA9IGZ1bmN0aW9uIChod2IpIHtcblx0Y29uc3QgdyA9IGh3YlsxXSAvIDEwMDtcblx0Y29uc3QgYiA9IGh3YlsyXSAvIDEwMDtcblx0Y29uc3QgdiA9IDEgLSBiO1xuXHRjb25zdCBjID0gdiAtIHc7XG5cdGxldCBnID0gMDtcblxuXHRpZiAoYyA8IDEpIHtcblx0XHRnID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuXHRyZXR1cm4gWyhhcHBsZVswXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzFdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMl0gLyA2NTUzNSkgKiAyNTVdO1xufTtcblxuY29udmVydC5yZ2IuYXBwbGUgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiBbKHJnYlswXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsxXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsyXSAvIDI1NSkgKiA2NTUzNV07XG59O1xuXG5jb252ZXJ0LmdyYXkucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc2wgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmhzdiA9IGNvbnZlcnQuZ3JheS5oc2w7XG5cbmNvbnZlcnQuZ3JheS5od2IgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuY215ayA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oZXggPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0Y29uc3QgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwKICAgICJjb25zdCBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0VGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdGNvbnN0IGdyYXBoID0ge307XG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS9vYmplY3Qta2V5cy12cy1mb3ItaW4td2l0aC1jbG9zdXJlLzNcblx0Y29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAobGV0IGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHRjb25zdCBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0Y29uc3QgcXVldWUgPSBbZnJvbU1vZGVsXTsgLy8gVW5zaGlmdCAtPiBxdWV1ZSAtPiBwb3BcblxuXHRncmFwaFtmcm9tTW9kZWxdLmRpc3RhbmNlID0gMDtcblxuXHR3aGlsZSAocXVldWUubGVuZ3RoKSB7XG5cdFx0Y29uc3QgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdGNvbnN0IGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAobGV0IGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGNvbnN0IGFkamFjZW50ID0gYWRqYWNlbnRzW2ldO1xuXHRcdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0Y29uc3QgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHRsZXQgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdGxldCBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0Y29uc3QgZ3JhcGggPSBkZXJpdmVCRlMoZnJvbU1vZGVsKTtcblx0Y29uc3QgY29udmVyc2lvbiA9IHt9O1xuXG5cdGNvbnN0IG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yIChsZXQgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGNvbnN0IHRvTW9kZWwgPSBtb2RlbHNbaV07XG5cdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBObyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsCiAgICAiY29uc3QgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5jb25zdCByb3V0ZSA9IHJlcXVpcmUoJy4vcm91dGUnKTtcblxuY29uc3QgY29udmVydCA9IHt9O1xuXG5jb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cbmZ1bmN0aW9uIHdyYXBSYXcoZm4pIHtcblx0Y29uc3Qgd3JhcHBlZEZuID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBhcmcwID0gYXJnc1swXTtcblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdHJldHVybiBmbihhcmdzKTtcblx0fTtcblxuXHQvLyBQcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbmZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG5cdGNvbnN0IHdyYXBwZWRGbiA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdFx0Y29uc3QgYXJnMCA9IGFyZ3NbMF07XG5cblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gV2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAobGV0IGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gUHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmcm9tTW9kZWwgPT4ge1xuXHRjb252ZXJ0W2Zyb21Nb2RlbF0gPSB7fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0uY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5sYWJlbHN9KTtcblxuXHRjb25zdCByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHRjb25zdCByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG5cblx0cm91dGVNb2RlbHMuZm9yRWFjaCh0b01vZGVsID0+IHtcblx0XHRjb25zdCBmbiA9IHJvdXRlc1t0b01vZGVsXTtcblxuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXSA9IHdyYXBSb3VuZGVkKGZuKTtcblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG5cdH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbiIsCiAgICAiY29uc3QgY29sb3JTdHJpbmcgPSByZXF1aXJlKCdjb2xvci1zdHJpbmcnKTtcbmNvbnN0IGNvbnZlcnQgPSByZXF1aXJlKCdjb2xvci1jb252ZXJ0Jyk7XG5cbmNvbnN0IHNraXBwZWRNb2RlbHMgPSBbXG5cdC8vIFRvIGJlIGhvbmVzdCwgSSBkb24ndCByZWFsbHkgZmVlbCBsaWtlIGtleXdvcmQgYmVsb25ncyBpbiBjb2xvciBjb252ZXJ0LCBidXQgZWguXG5cdCdrZXl3b3JkJyxcblxuXHQvLyBHcmF5IGNvbmZsaWN0cyB3aXRoIHNvbWUgbWV0aG9kIG5hbWVzLCBhbmQgaGFzIGl0cyBvd24gbWV0aG9kIGRlZmluZWQuXG5cdCdncmF5JyxcblxuXHQvLyBTaG91bGRuJ3QgcmVhbGx5IGJlIGluIGNvbG9yLWNvbnZlcnQgZWl0aGVyLi4uXG5cdCdoZXgnLFxuXTtcblxuY29uc3QgaGFzaGVkTW9kZWxLZXlzID0ge307XG5mb3IgKGNvbnN0IG1vZGVsIG9mIE9iamVjdC5rZXlzKGNvbnZlcnQpKSB7XG5cdGhhc2hlZE1vZGVsS2V5c1tbLi4uY29udmVydFttb2RlbF0ubGFiZWxzXS5zb3J0KCkuam9pbignJyldID0gbW9kZWw7XG59XG5cbmNvbnN0IGxpbWl0ZXJzID0ge307XG5cbmZ1bmN0aW9uIENvbG9yKG9iamVjdCwgbW9kZWwpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbG9yKSkge1xuXHRcdHJldHVybiBuZXcgQ29sb3Iob2JqZWN0LCBtb2RlbCk7XG5cdH1cblxuXHRpZiAobW9kZWwgJiYgbW9kZWwgaW4gc2tpcHBlZE1vZGVscykge1xuXHRcdG1vZGVsID0gbnVsbDtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiAhKG1vZGVsIGluIGNvbnZlcnQpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGVsOiAnICsgbW9kZWwpO1xuXHR9XG5cblx0bGV0IGk7XG5cdGxldCBjaGFubmVscztcblxuXHRpZiAob2JqZWN0ID09IG51bGwpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuXHRcdHRoaXMubW9kZWwgPSAncmdiJztcblx0XHR0aGlzLmNvbG9yID0gWzAsIDAsIDBdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xvcikge1xuXHRcdHRoaXMubW9kZWwgPSBvYmplY3QubW9kZWw7XG5cdFx0dGhpcy5jb2xvciA9IFsuLi5vYmplY3QuY29sb3JdO1xuXHRcdHRoaXMudmFscGhhID0gb2JqZWN0LnZhbHBoYTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJykge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGNvbG9yU3RyaW5nLmdldChvYmplY3QpO1xuXHRcdGlmIChyZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gc3RyaW5nOiAnICsgb2JqZWN0KTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gcmVzdWx0Lm1vZGVsO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR0aGlzLmNvbG9yID0gcmVzdWx0LnZhbHVlLnNsaWNlKDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiByZXN1bHQudmFsdWVbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IHJlc3VsdC52YWx1ZVtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKG9iamVjdC5sZW5ndGggPiAwKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG1vZGVsIHx8ICdyZ2InO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHRjb25zdCBuZXdBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iamVjdCwgMCwgY2hhbm5lbHMpO1xuXHRcdHRoaXMuY29sb3IgPSB6ZXJvQXJyYXkobmV3QXJyYXksIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmplY3RbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IG9iamVjdFtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdudW1iZXInKSB7XG5cdFx0Ly8gVGhpcyBpcyBhbHdheXMgUkdCIC0gY2FuIGJlIGNvbnZlcnRlZCBsYXRlciBvbi5cblx0XHR0aGlzLm1vZGVsID0gJ3JnYic7XG5cdFx0dGhpcy5jb2xvciA9IFtcblx0XHRcdChvYmplY3QgPj4gMTYpICYgMHhGRixcblx0XHRcdChvYmplY3QgPj4gOCkgJiAweEZGLFxuXHRcdFx0b2JqZWN0ICYgMHhGRixcblx0XHRdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblx0XHRpZiAoJ2FscGhhJyBpbiBvYmplY3QpIHtcblx0XHRcdGtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignYWxwaGEnKSwgMSk7XG5cdFx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmplY3QuYWxwaGEgPT09ICdudW1iZXInID8gb2JqZWN0LmFscGhhIDogMDtcblx0XHR9XG5cblx0XHRjb25zdCBoYXNoZWRLZXlzID0ga2V5cy5zb3J0KCkuam9pbignJyk7XG5cdFx0aWYgKCEoaGFzaGVkS2V5cyBpbiBoYXNoZWRNb2RlbEtleXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KG9iamVjdCkpO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kZWwgPSBoYXNoZWRNb2RlbEtleXNbaGFzaGVkS2V5c107XG5cblx0XHRjb25zdCB7bGFiZWxzfSA9IGNvbnZlcnRbdGhpcy5tb2RlbF07XG5cdFx0Y29uc3QgY29sb3IgPSBbXTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb2xvci5wdXNoKG9iamVjdFtsYWJlbHNbaV1dKTtcblx0XHR9XG5cblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KGNvbG9yKTtcblx0fVxuXG5cdC8vIFBlcmZvcm0gbGltaXRhdGlvbnMgKGNsYW1waW5nLCBldGMuKVxuXHRpZiAobGltaXRlcnNbdGhpcy5tb2RlbF0pIHtcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdGNvbnN0IGxpbWl0ID0gbGltaXRlcnNbdGhpcy5tb2RlbF1baV07XG5cdFx0XHRpZiAobGltaXQpIHtcblx0XHRcdFx0dGhpcy5jb2xvcltpXSA9IGxpbWl0KHRoaXMuY29sb3JbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRoaXMudmFscGhhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdGhpcy52YWxwaGEpKTtcblxuXHRpZiAoT2JqZWN0LmZyZWV6ZSkge1xuXHRcdE9iamVjdC5mcmVlemUodGhpcyk7XG5cdH1cbn1cblxuQ29sb3IucHJvdG90eXBlID0ge1xuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5zdHJpbmcoKTtcblx0fSxcblxuXHR0b0pTT04oKSB7XG5cdFx0cmV0dXJuIHRoaXNbdGhpcy5tb2RlbF0oKTtcblx0fSxcblxuXHRzdHJpbmcocGxhY2VzKSB7XG5cdFx0bGV0IHNlbGYgPSB0aGlzLm1vZGVsIGluIGNvbG9yU3RyaW5nLnRvID8gdGhpcyA6IHRoaXMucmdiKCk7XG5cdFx0c2VsZiA9IHNlbGYucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHRjb25zdCBhcmdzID0gc2VsZi52YWxwaGEgPT09IDEgPyBzZWxmLmNvbG9yIDogWy4uLnNlbGYuY29sb3IsIHRoaXMudmFscGhhXTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG9bc2VsZi5tb2RlbF0oYXJncyk7XG5cdH0sXG5cblx0cGVyY2VudFN0cmluZyhwbGFjZXMpIHtcblx0XHRjb25zdCBzZWxmID0gdGhpcy5yZ2IoKS5yb3VuZCh0eXBlb2YgcGxhY2VzID09PSAnbnVtYmVyJyA/IHBsYWNlcyA6IDEpO1xuXHRcdGNvbnN0IGFyZ3MgPSBzZWxmLnZhbHBoYSA9PT0gMSA/IHNlbGYuY29sb3IgOiBbLi4uc2VsZi5jb2xvciwgdGhpcy52YWxwaGFdO1xuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5yZ2IucGVyY2VudChhcmdzKTtcblx0fSxcblxuXHRhcnJheSgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWxwaGEgPT09IDEgPyBbLi4udGhpcy5jb2xvcl0gOiBbLi4udGhpcy5jb2xvciwgdGhpcy52YWxwaGFdO1xuXHR9LFxuXG5cdG9iamVjdCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSB7fTtcblx0XHRjb25zdCB7Y2hhbm5lbHN9ID0gY29udmVydFt0aGlzLm1vZGVsXTtcblx0XHRjb25zdCB7bGFiZWxzfSA9IGNvbnZlcnRbdGhpcy5tb2RlbF07XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHJlc3VsdFtsYWJlbHNbaV1dID0gdGhpcy5jb2xvcltpXTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJlc3VsdC5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0dW5pdEFycmF5KCkge1xuXHRcdGNvbnN0IHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0cmdiWzBdIC89IDI1NTtcblx0XHRyZ2JbMV0gLz0gMjU1O1xuXHRcdHJnYlsyXSAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5wdXNoKHRoaXMudmFscGhhKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdHVuaXRPYmplY3QoKSB7XG5cdFx0Y29uc3QgcmdiID0gdGhpcy5yZ2IoKS5vYmplY3QoKTtcblx0XHRyZ2IuciAvPSAyNTU7XG5cdFx0cmdiLmcgLz0gMjU1O1xuXHRcdHJnYi5iIC89IDI1NTtcblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmdiLmFscGhhID0gdGhpcy52YWxwaGE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHRyb3VuZChwbGFjZXMpIHtcblx0XHRwbGFjZXMgPSBNYXRoLm1heChwbGFjZXMgfHwgMCwgMCk7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihbLi4udGhpcy5jb2xvci5tYXAocm91bmRUb1BsYWNlKHBsYWNlcykpLCB0aGlzLnZhbHBoYV0sIHRoaXMubW9kZWwpO1xuXHR9LFxuXG5cdGFscGhhKHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoWy4uLnRoaXMuY29sb3IsIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlKSldLCB0aGlzLm1vZGVsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy52YWxwaGE7XG5cdH0sXG5cblx0Ly8gUmdiXG5cdHJlZDogZ2V0c2V0KCdyZ2InLCAwLCBtYXhmbigyNTUpKSxcblx0Z3JlZW46IGdldHNldCgncmdiJywgMSwgbWF4Zm4oMjU1KSksXG5cdGJsdWU6IGdldHNldCgncmdiJywgMiwgbWF4Zm4oMjU1KSksXG5cblx0aHVlOiBnZXRzZXQoWydoc2wnLCAnaHN2JywgJ2hzbCcsICdod2InLCAnaGNnJ10sIDAsIHZhbHVlID0+ICgodmFsdWUgJSAzNjApICsgMzYwKSAlIDM2MCksXG5cblx0c2F0dXJhdGlvbmw6IGdldHNldCgnaHNsJywgMSwgbWF4Zm4oMTAwKSksXG5cdGxpZ2h0bmVzczogZ2V0c2V0KCdoc2wnLCAyLCBtYXhmbigxMDApKSxcblxuXHRzYXR1cmF0aW9udjogZ2V0c2V0KCdoc3YnLCAxLCBtYXhmbigxMDApKSxcblx0dmFsdWU6IGdldHNldCgnaHN2JywgMiwgbWF4Zm4oMTAwKSksXG5cblx0Y2hyb21hOiBnZXRzZXQoJ2hjZycsIDEsIG1heGZuKDEwMCkpLFxuXHRncmF5OiBnZXRzZXQoJ2hjZycsIDIsIG1heGZuKDEwMCkpLFxuXG5cdHdoaXRlOiBnZXRzZXQoJ2h3YicsIDEsIG1heGZuKDEwMCkpLFxuXHR3YmxhY2s6IGdldHNldCgnaHdiJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0Y3lhbjogZ2V0c2V0KCdjbXlrJywgMCwgbWF4Zm4oMTAwKSksXG5cdG1hZ2VudGE6IGdldHNldCgnY215aycsIDEsIG1heGZuKDEwMCkpLFxuXHR5ZWxsb3c6IGdldHNldCgnY215aycsIDIsIG1heGZuKDEwMCkpLFxuXHRibGFjazogZ2V0c2V0KCdjbXlrJywgMywgbWF4Zm4oMTAwKSksXG5cblx0eDogZ2V0c2V0KCd4eXonLCAwLCBtYXhmbig5NS4wNDcpKSxcblx0eTogZ2V0c2V0KCd4eXonLCAxLCBtYXhmbigxMDApKSxcblx0ejogZ2V0c2V0KCd4eXonLCAyLCBtYXhmbigxMDguODMzKSksXG5cblx0bDogZ2V0c2V0KCdsYWInLCAwLCBtYXhmbigxMDApKSxcblx0YTogZ2V0c2V0KCdsYWInLCAxKSxcblx0YjogZ2V0c2V0KCdsYWInLCAyKSxcblxuXHRrZXl3b3JkKHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb252ZXJ0W3RoaXMubW9kZWxdLmtleXdvcmQodGhpcy5jb2xvcik7XG5cdH0sXG5cblx0aGV4KHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5oZXgodGhpcy5yZ2IoKS5yb3VuZCgpLmNvbG9yKTtcblx0fSxcblxuXHRoZXhhKHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsdWUpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJnYkFycmF5ID0gdGhpcy5yZ2IoKS5yb3VuZCgpLmNvbG9yO1xuXG5cdFx0bGV0IGFscGhhSGV4ID0gTWF0aC5yb3VuZCh0aGlzLnZhbHBoYSAqIDI1NSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdFx0aWYgKGFscGhhSGV4Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0YWxwaGFIZXggPSAnMCcgKyBhbHBoYUhleDtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG8uaGV4KHJnYkFycmF5KSArIGFscGhhSGV4O1xuXHR9LFxuXG5cdHJnYk51bWJlcigpIHtcblx0XHRjb25zdCByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJldHVybiAoKHJnYlswXSAmIDB4RkYpIDw8IDE2KSB8ICgocmdiWzFdICYgMHhGRikgPDwgOCkgfCAocmdiWzJdICYgMHhGRik7XG5cdH0sXG5cblx0bHVtaW5vc2l0eSgpIHtcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG5cdFx0Y29uc3QgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblxuXHRcdGNvbnN0IGx1bSA9IFtdO1xuXHRcdGZvciAoY29uc3QgW2ksIGVsZW1lbnRdIG9mIHJnYi5lbnRyaWVzKCkpIHtcblx0XHRcdGNvbnN0IGNoYW4gPSBlbGVtZW50IC8gMjU1O1xuXHRcdFx0bHVtW2ldID0gKGNoYW4gPD0gMC4wNDA0NSkgPyBjaGFuIC8gMTIuOTIgOiAoKGNoYW4gKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40O1xuXHRcdH1cblxuXHRcdHJldHVybiAwLjIxMjYgKiBsdW1bMF0gKyAwLjcxNTIgKiBsdW1bMV0gKyAwLjA3MjIgKiBsdW1bMl07XG5cdH0sXG5cblx0Y29udHJhc3QoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdGNvbnN0IGx1bTEgPSB0aGlzLmx1bWlub3NpdHkoKTtcblx0XHRjb25zdCBsdW0yID0gY29sb3IyLmx1bWlub3NpdHkoKTtcblxuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobHVtMiArIDAuMDUpIC8gKGx1bTEgKyAwLjA1KTtcblx0fSxcblxuXHRsZXZlbChjb2xvcjIpIHtcblx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRy8jY29udHJhc3QtZW5oYW5jZWRcblx0XHRjb25zdCBjb250cmFzdFJhdGlvID0gdGhpcy5jb250cmFzdChjb2xvcjIpO1xuXHRcdGlmIChjb250cmFzdFJhdGlvID49IDcpIHtcblx0XHRcdHJldHVybiAnQUFBJztcblx0XHR9XG5cblx0XHRyZXR1cm4gKGNvbnRyYXN0UmF0aW8gPj0gNC41KSA/ICdBQScgOiAnJztcblx0fSxcblxuXHRpc0RhcmsoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdGNvbnN0IHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0Y29uc3QgeWlxID0gKHJnYlswXSAqIDIxMjYgKyByZ2JbMV0gKiA3MTUyICsgcmdiWzJdICogNzIyKSAvIDEwMDAwO1xuXHRcdHJldHVybiB5aXEgPCAxMjg7XG5cdH0sXG5cblx0aXNMaWdodCgpIHtcblx0XHRyZXR1cm4gIXRoaXMuaXNEYXJrKCk7XG5cdH0sXG5cblx0bmVnYXRlKCkge1xuXHRcdGNvbnN0IHJnYiA9IHRoaXMucmdiKCk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYi5jb2xvcltpXSA9IDI1NSAtIHJnYi5jb2xvcltpXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdGxpZ2h0ZW4ocmF0aW8pIHtcblx0XHRjb25zdCBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsyXSArPSBoc2wuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRhcmtlbihyYXRpbykge1xuXHRcdGNvbnN0IGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdIC09IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0c2F0dXJhdGUocmF0aW8pIHtcblx0XHRjb25zdCBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSArPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRlc2F0dXJhdGUocmF0aW8pIHtcblx0XHRjb25zdCBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSAtPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdHdoaXRlbihyYXRpbykge1xuXHRcdGNvbnN0IGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzFdICs9IGh3Yi5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0YmxhY2tlbihyYXRpbykge1xuXHRcdGNvbnN0IGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzJdICs9IGh3Yi5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0Z3JheXNjYWxlKCkge1xuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXG5cdFx0Y29uc3QgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHRjb25zdCB2YWx1ZSA9IHJnYlswXSAqIDAuMyArIHJnYlsxXSAqIDAuNTkgKyByZ2JbMl0gKiAwLjExO1xuXHRcdHJldHVybiBDb2xvci5yZ2IodmFsdWUsIHZhbHVlLCB2YWx1ZSk7XG5cdH0sXG5cblx0ZmFkZShyYXRpbykge1xuXHRcdHJldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhIC0gKHRoaXMudmFscGhhICogcmF0aW8pKTtcblx0fSxcblxuXHRvcGFxdWVyKHJhdGlvKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWxwaGEodGhpcy52YWxwaGEgKyAodGhpcy52YWxwaGEgKiByYXRpbykpO1xuXHR9LFxuXG5cdHJvdGF0ZShkZWdyZWVzKSB7XG5cdFx0Y29uc3QgaHNsID0gdGhpcy5oc2woKTtcblx0XHRsZXQgaHVlID0gaHNsLmNvbG9yWzBdO1xuXHRcdGh1ZSA9IChodWUgKyBkZWdyZWVzKSAlIDM2MDtcblx0XHRodWUgPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuXHRcdGhzbC5jb2xvclswXSA9IGh1ZTtcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdG1peChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcblx0XHQvLyBQb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9saWJzYXNzL2Jsb2IvMGU2YjRhMjg1MDA5MjM1NmFhM2VjZTA3YzZiMjQ5ZjAyMjFjYWNlZC9mdW5jdGlvbnMuY3BwI0wyMDlcblx0XHRpZiAoIW1peGluQ29sb3IgfHwgIW1peGluQ29sb3IucmdiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRvIFwibWl4XCIgd2FzIG5vdCBhIENvbG9yIGluc3RhbmNlLCBidXQgcmF0aGVyIGFuIGluc3RhbmNlIG9mICcgKyB0eXBlb2YgbWl4aW5Db2xvcik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sb3IxID0gbWl4aW5Db2xvci5yZ2IoKTtcblx0XHRjb25zdCBjb2xvcjIgPSB0aGlzLnJnYigpO1xuXHRcdGNvbnN0IHAgPSB3ZWlnaHQgPT09IHVuZGVmaW5lZCA/IDAuNSA6IHdlaWdodDtcblxuXHRcdGNvbnN0IHcgPSAyICogcCAtIDE7XG5cdFx0Y29uc3QgYSA9IGNvbG9yMS5hbHBoYSgpIC0gY29sb3IyLmFscGhhKCk7XG5cblx0XHRjb25zdCB3MSA9ICgoKHcgKiBhID09PSAtMSkgPyB3IDogKHcgKyBhKSAvICgxICsgdyAqIGEpKSArIDEpIC8gMjtcblx0XHRjb25zdCB3MiA9IDEgLSB3MTtcblxuXHRcdHJldHVybiBDb2xvci5yZ2IoXG5cdFx0XHR3MSAqIGNvbG9yMS5yZWQoKSArIHcyICogY29sb3IyLnJlZCgpLFxuXHRcdFx0dzEgKiBjb2xvcjEuZ3JlZW4oKSArIHcyICogY29sb3IyLmdyZWVuKCksXG5cdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKCksXG5cdFx0XHRjb2xvcjEuYWxwaGEoKSAqIHAgKyBjb2xvcjIuYWxwaGEoKSAqICgxIC0gcCkpO1xuXHR9LFxufTtcblxuLy8gTW9kZWwgY29udmVyc2lvbiBtZXRob2RzIGFuZCBzdGF0aWMgY29uc3RydWN0b3JzXG5mb3IgKGNvbnN0IG1vZGVsIG9mIE9iamVjdC5rZXlzKGNvbnZlcnQpKSB7XG5cdGlmIChza2lwcGVkTW9kZWxzLmluY2x1ZGVzKG1vZGVsKSkge1xuXHRcdGNvbnRpbnVlO1xuXHR9XG5cblx0Y29uc3Qge2NoYW5uZWxzfSA9IGNvbnZlcnRbbW9kZWxdO1xuXG5cdC8vIENvbnZlcnNpb24gbWV0aG9kc1xuXHRDb2xvci5wcm90b3R5cGVbbW9kZWxdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRpZiAodGhpcy5tb2RlbCA9PT0gbW9kZWwpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodGhpcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcihhcmdzLCBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBDb2xvcihbLi4uYXNzZXJ0QXJyYXkoY29udmVydFt0aGlzLm1vZGVsXVttb2RlbF0ucmF3KHRoaXMuY29sb3IpKSwgdGhpcy52YWxwaGFdLCBtb2RlbCk7XG5cdH07XG5cblx0Ly8gJ3N0YXRpYycgY29uc3RydWN0aW9uIG1ldGhvZHNcblx0Q29sb3JbbW9kZWxdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRsZXQgY29sb3IgPSBhcmdzWzBdO1xuXHRcdGlmICh0eXBlb2YgY29sb3IgPT09ICdudW1iZXInKSB7XG5cdFx0XHRjb2xvciA9IHplcm9BcnJheShhcmdzLCBjaGFubmVscyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBDb2xvcihjb2xvciwgbW9kZWwpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiByb3VuZFRvKG51bWJlciwgcGxhY2VzKSB7XG5cdHJldHVybiBOdW1iZXIobnVtYmVyLnRvRml4ZWQocGxhY2VzKSk7XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG9QbGFjZShwbGFjZXMpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChudW1iZXIpIHtcblx0XHRyZXR1cm4gcm91bmRUbyhudW1iZXIsIHBsYWNlcyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldHNldChtb2RlbCwgY2hhbm5lbCwgbW9kaWZpZXIpIHtcblx0bW9kZWwgPSBBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsIDogW21vZGVsXTtcblxuXHRmb3IgKGNvbnN0IG0gb2YgbW9kZWwpIHtcblx0XHQobGltaXRlcnNbbV0gfHwgKGxpbWl0ZXJzW21dID0gW10pKVtjaGFubmVsXSA9IG1vZGlmaWVyO1xuXHR9XG5cblx0bW9kZWwgPSBtb2RlbFswXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0bGV0IHJlc3VsdDtcblxuXHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAobW9kaWZpZXIpIHtcblx0XHRcdFx0dmFsdWUgPSBtb2RpZmllcih2YWx1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCk7XG5cdFx0XHRyZXN1bHQuY29sb3JbY2hhbm5lbF0gPSB2YWx1ZTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0cmVzdWx0ID0gdGhpc1ttb2RlbF0oKS5jb2xvcltjaGFubmVsXTtcblx0XHRpZiAobW9kaWZpZXIpIHtcblx0XHRcdHJlc3VsdCA9IG1vZGlmaWVyKHJlc3VsdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcbn1cblxuZnVuY3Rpb24gbWF4Zm4obWF4KSB7XG5cdHJldHVybiBmdW5jdGlvbiAodikge1xuXHRcdHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHYpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0QXJyYXkodmFsdWUpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiB6ZXJvQXJyYXkoYXJyYXksIGxlbmd0aCkge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHR5cGVvZiBhcnJheVtpXSAhPT0gJ251bWJlcicpIHtcblx0XHRcdGFycmF5W2ldID0gMDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sb3I7XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29sb3IgPSByZXF1aXJlKCdjb2xvcicpO1xuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5jb25zdCBzaGFycCA9IHJlcXVpcmUoJy4vc2hhcnAnKTtcblxuLyoqXG4gKiBKdXN0aWNhdGlvbiBhbGlnbm1lbnRcbiAqIEBtZW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGFsaWduID0ge1xuICBsZWZ0OiAnbG93JyxcbiAgY2VudGVyOiAnY2VudHJlJyxcbiAgY2VudHJlOiAnY2VudHJlJyxcbiAgcmlnaHQ6ICdoaWdoJ1xufTtcblxuLyoqXG4gKiBFeHRyYWN0IGlucHV0IG9wdGlvbnMsIGlmIGFueSwgZnJvbSBhbiBvYmplY3QuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfaW5wdXRPcHRpb25zRnJvbU9iamVjdCAob2JqKSB7XG4gIGNvbnN0IHsgcmF3LCBkZW5zaXR5LCBsaW1pdElucHV0UGl4ZWxzLCBpZ25vcmVJY2MsIHVubGltaXRlZCwgc2VxdWVudGlhbFJlYWQsIGZhaWxPbiwgZmFpbE9uRXJyb3IsIGFuaW1hdGVkLCBwYWdlLCBwYWdlcywgc3ViaWZkIH0gPSBvYmo7XG4gIHJldHVybiBbcmF3LCBkZW5zaXR5LCBsaW1pdElucHV0UGl4ZWxzLCBpZ25vcmVJY2MsIHVubGltaXRlZCwgc2VxdWVudGlhbFJlYWQsIGZhaWxPbiwgZmFpbE9uRXJyb3IsIGFuaW1hdGVkLCBwYWdlLCBwYWdlcywgc3ViaWZkXS5zb21lKGlzLmRlZmluZWQpXG4gICAgPyB7IHJhdywgZGVuc2l0eSwgbGltaXRJbnB1dFBpeGVscywgaWdub3JlSWNjLCB1bmxpbWl0ZWQsIHNlcXVlbnRpYWxSZWFkLCBmYWlsT24sIGZhaWxPbkVycm9yLCBhbmltYXRlZCwgcGFnZSwgcGFnZXMsIHN1YmlmZCB9XG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIE9iamVjdCBjb250YWluaW5nIGlucHV0IGFuZCBpbnB1dC1yZWxhdGVkIG9wdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfY3JlYXRlSW5wdXREZXNjcmlwdG9yIChpbnB1dCwgaW5wdXRPcHRpb25zLCBjb250YWluZXJPcHRpb25zKSB7XG4gIGNvbnN0IGlucHV0RGVzY3JpcHRvciA9IHtcbiAgICBmYWlsT246ICd3YXJuaW5nJyxcbiAgICBsaW1pdElucHV0UGl4ZWxzOiBNYXRoLnBvdygweDNGRkYsIDIpLFxuICAgIGlnbm9yZUljYzogZmFsc2UsXG4gICAgdW5saW1pdGVkOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVhZDogdHJ1ZVxuICB9O1xuICBpZiAoaXMuc3RyaW5nKGlucHV0KSkge1xuICAgIC8vIGZpbGVzeXN0ZW1cbiAgICBpbnB1dERlc2NyaXB0b3IuZmlsZSA9IGlucHV0O1xuICB9IGVsc2UgaWYgKGlzLmJ1ZmZlcihpbnB1dCkpIHtcbiAgICAvLyBCdWZmZXJcbiAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW5wdXQgQnVmZmVyIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlucHV0RGVzY3JpcHRvci5idWZmZXIgPSBpbnB1dDtcbiAgfSBlbHNlIGlmIChpcy5hcnJheUJ1ZmZlcihpbnB1dCkpIHtcbiAgICBpZiAoaW5wdXQuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0lucHV0IGJpdCBBcnJheSBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBpbnB1dERlc2NyaXB0b3IuYnVmZmVyID0gQnVmZmVyLmZyb20oaW5wdXQsIDAsIGlucHV0LmJ5dGVMZW5ndGgpO1xuICB9IGVsc2UgaWYgKGlzLnR5cGVkQXJyYXkoaW5wdXQpKSB7XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0lucHV0IEJpdCBBcnJheSBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBpbnB1dERlc2NyaXB0b3IuYnVmZmVyID0gQnVmZmVyLmZyb20oaW5wdXQuYnVmZmVyLCBpbnB1dC5ieXRlT2Zmc2V0LCBpbnB1dC5ieXRlTGVuZ3RoKTtcbiAgfSBlbHNlIGlmIChpcy5wbGFpbk9iamVjdChpbnB1dCkgJiYgIWlzLmRlZmluZWQoaW5wdXRPcHRpb25zKSkge1xuICAgIC8vIFBsYWluIE9iamVjdCBkZXNjcmlwdG9yLCBlLmcuIGNyZWF0ZVxuICAgIGlucHV0T3B0aW9ucyA9IGlucHV0O1xuICAgIGlmIChfaW5wdXRPcHRpb25zRnJvbU9iamVjdChpbnB1dE9wdGlvbnMpKSB7XG4gICAgICAvLyBTdHJlYW0gd2l0aCBvcHRpb25zXG4gICAgICBpbnB1dERlc2NyaXB0b3IuYnVmZmVyID0gW107XG4gICAgfVxuICB9IGVsc2UgaWYgKCFpcy5kZWZpbmVkKGlucHV0KSAmJiAhaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMpICYmIGlzLm9iamVjdChjb250YWluZXJPcHRpb25zKSAmJiBjb250YWluZXJPcHRpb25zLmFsbG93U3RyZWFtKSB7XG4gICAgLy8gU3RyZWFtIHdpdGhvdXQgb3B0aW9uc1xuICAgIGlucHV0RGVzY3JpcHRvci5idWZmZXIgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGlucHV0ICcke2lucHV0fScgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH0ke1xuICAgICAgaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMpID8gYCB3aGVuIGFsc28gcHJvdmlkaW5nIG9wdGlvbnMgb2YgdHlwZSAke3R5cGVvZiBpbnB1dE9wdGlvbnN9YCA6ICcnXG4gICAgfWApO1xuICB9XG4gIGlmIChpcy5vYmplY3QoaW5wdXRPcHRpb25zKSkge1xuICAgIC8vIERlcHJlY2F0ZWQ6IGZhaWxPbkVycm9yXG4gICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLmZhaWxPbkVycm9yKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLmZhaWxPbkVycm9yKSkge1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IuZmFpbE9uID0gaW5wdXRPcHRpb25zLmZhaWxPbkVycm9yID8gJ3dhcm5pbmcnIDogJ25vbmUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdmYWlsT25FcnJvcicsICdib29sZWFuJywgaW5wdXRPcHRpb25zLmZhaWxPbkVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZmFpbE9uXG4gICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLmZhaWxPbikpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcoaW5wdXRPcHRpb25zLmZhaWxPbikgJiYgaXMuaW5BcnJheShpbnB1dE9wdGlvbnMuZmFpbE9uLCBbJ25vbmUnLCAndHJ1bmNhdGVkJywgJ2Vycm9yJywgJ3dhcm5pbmcnXSkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmZhaWxPbiA9IGlucHV0T3B0aW9ucy5mYWlsT247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2ZhaWxPbicsICdvbmUgb2Y6IG5vbmUsIHRydW5jYXRlZCwgZXJyb3IsIHdhcm5pbmcnLCBpbnB1dE9wdGlvbnMuZmFpbE9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGVuc2l0eVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5kZW5zaXR5KSkge1xuICAgICAgaWYgKGlzLmluUmFuZ2UoaW5wdXRPcHRpb25zLmRlbnNpdHksIDEsIDEwMDAwMCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmRlbnNpdHkgPSBpbnB1dE9wdGlvbnMuZGVuc2l0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZGVuc2l0eScsICdudW1iZXIgYmV0d2VlbiAxIGFuZCAxMDAwMDAnLCBpbnB1dE9wdGlvbnMuZGVuc2l0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElnbm9yZSBlbWJlZGRkZWQgSUNDIHByb2ZpbGVcbiAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMuaWdub3JlSWNjKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLmlnbm9yZUljYykpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmlnbm9yZUljYyA9IGlucHV0T3B0aW9ucy5pZ25vcmVJY2M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2lnbm9yZUljYycsICdib29sZWFuJywgaW5wdXRPcHRpb25zLmlnbm9yZUljYyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGxpbWl0SW5wdXRQaXhlbHNcbiAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMubGltaXRJbnB1dFBpeGVscykpIHtcbiAgICAgIGlmIChpcy5ib29sKGlucHV0T3B0aW9ucy5saW1pdElucHV0UGl4ZWxzKSkge1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IubGltaXRJbnB1dFBpeGVscyA9IGlucHV0T3B0aW9ucy5saW1pdElucHV0UGl4ZWxzXG4gICAgICAgICAgPyBNYXRoLnBvdygweDNGRkYsIDIpXG4gICAgICAgICAgOiAwO1xuICAgICAgfSBlbHNlIGlmIChpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5saW1pdElucHV0UGl4ZWxzKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5saW1pdElucHV0UGl4ZWxzLCAwLCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmxpbWl0SW5wdXRQaXhlbHMgPSBpbnB1dE9wdGlvbnMubGltaXRJbnB1dFBpeGVscztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbGltaXRJbnB1dFBpeGVscycsICdwb3NpdGl2ZSBpbnRlZ2VyJywgaW5wdXRPcHRpb25zLmxpbWl0SW5wdXRQaXhlbHMpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmxpbWl0ZWRcbiAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMudW5saW1pdGVkKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLnVubGltaXRlZCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnVubGltaXRlZCA9IGlucHV0T3B0aW9ucy51bmxpbWl0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3VubGltaXRlZCcsICdib29sZWFuJywgaW5wdXRPcHRpb25zLnVubGltaXRlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNlcXVlbnRpYWxSZWFkXG4gICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnNlcXVlbnRpYWxSZWFkKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLnNlcXVlbnRpYWxSZWFkKSkge1xuICAgICAgICBpbnB1dERlc2NyaXB0b3Iuc2VxdWVudGlhbFJlYWQgPSBpbnB1dE9wdGlvbnMuc2VxdWVudGlhbFJlYWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3NlcXVlbnRpYWxSZWFkJywgJ2Jvb2xlYW4nLCBpbnB1dE9wdGlvbnMuc2VxdWVudGlhbFJlYWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSYXcgcGl4ZWwgaW5wdXRcbiAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMucmF3KSkge1xuICAgICAgaWYgKFxuICAgICAgICBpcy5vYmplY3QoaW5wdXRPcHRpb25zLnJhdykgJiZcbiAgICAgICAgaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMucmF3LndpZHRoKSAmJiBpbnB1dE9wdGlvbnMucmF3LndpZHRoID4gMCAmJlxuICAgICAgICBpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5yYXcuaGVpZ2h0KSAmJiBpbnB1dE9wdGlvbnMucmF3LmhlaWdodCA+IDAgJiZcbiAgICAgICAgaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMucmF3LmNoYW5uZWxzKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5yYXcuY2hhbm5lbHMsIDEsIDQpXG4gICAgICApIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnJhd1dpZHRoID0gaW5wdXRPcHRpb25zLnJhdy53aWR0aDtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnJhd0hlaWdodCA9IGlucHV0T3B0aW9ucy5yYXcuaGVpZ2h0O1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IucmF3Q2hhbm5lbHMgPSBpbnB1dE9wdGlvbnMucmF3LmNoYW5uZWxzO1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IucmF3UHJlbXVsdGlwbGllZCA9ICEhaW5wdXRPcHRpb25zLnJhdy5wcmVtdWx0aXBsaWVkO1xuXG4gICAgICAgIHN3aXRjaCAoaW5wdXQuY29uc3RydWN0b3IpIHtcbiAgICAgICAgICBjYXNlIFVpbnQ4QXJyYXk6XG4gICAgICAgICAgY2FzZSBVaW50OENsYW1wZWRBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICd1Y2hhcic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEludDhBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICdjaGFyJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVWludDE2QXJyYXk6XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IucmF3RGVwdGggPSAndXNob3J0JztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSW50MTZBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICdzaG9ydCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVpbnQzMkFycmF5OlxuICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLnJhd0RlcHRoID0gJ3VpbnQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBJbnQzMkFycmF5OlxuICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLnJhd0RlcHRoID0gJ2ludCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEZsb2F0MzJBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICdmbG9hdCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEZsb2F0NjRBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICdkb3VibGUnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICd1Y2hhcic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB3aWR0aCwgaGVpZ2h0IGFuZCBjaGFubmVscyBmb3IgcmF3IHBpeGVsIGlucHV0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE11bHRpLXBhZ2UgaW5wdXQgKEdJRiwgVElGRiwgUERGKVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5hbmltYXRlZCkpIHtcbiAgICAgIGlmIChpcy5ib29sKGlucHV0T3B0aW9ucy5hbmltYXRlZCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnBhZ2VzID0gaW5wdXRPcHRpb25zLmFuaW1hdGVkID8gLTEgOiAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhbmltYXRlZCcsICdib29sZWFuJywgaW5wdXRPcHRpb25zLmFuaW1hdGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnBhZ2VzKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIoaW5wdXRPcHRpb25zLnBhZ2VzKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5wYWdlcywgLTEsIDEwMDAwMCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnBhZ2VzID0gaW5wdXRPcHRpb25zLnBhZ2VzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdwYWdlcycsICdpbnRlZ2VyIGJldHdlZW4gLTEgYW5kIDEwMDAwMCcsIGlucHV0T3B0aW9ucy5wYWdlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5wYWdlKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIoaW5wdXRPcHRpb25zLnBhZ2UpICYmIGlzLmluUmFuZ2UoaW5wdXRPcHRpb25zLnBhZ2UsIDAsIDEwMDAwMCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnBhZ2UgPSBpbnB1dE9wdGlvbnMucGFnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncGFnZScsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwMDAwJywgaW5wdXRPcHRpb25zLnBhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBNdWx0aS1sZXZlbCBpbnB1dCAoT3BlblNsaWRlKVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5sZXZlbCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5sZXZlbCkgJiYgaXMuaW5SYW5nZShpbnB1dE9wdGlvbnMubGV2ZWwsIDAsIDI1NikpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmxldmVsID0gaW5wdXRPcHRpb25zLmxldmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdsZXZlbCcsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU2JywgaW5wdXRPcHRpb25zLmxldmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU3ViIEltYWdlIEZpbGUgRGlyZWN0b3J5IChUSUZGKVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5zdWJpZmQpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMuc3ViaWZkKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5zdWJpZmQsIC0xLCAxMDAwMDApKSB7XG4gICAgICAgIGlucHV0RGVzY3JpcHRvci5zdWJpZmQgPSBpbnB1dE9wdGlvbnMuc3ViaWZkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdzdWJpZmQnLCAnaW50ZWdlciBiZXR3ZWVuIC0xIGFuZCAxMDAwMDAnLCBpbnB1dE9wdGlvbnMuc3ViaWZkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ3JlYXRlIG5ldyBpbWFnZVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5jcmVhdGUpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzLm9iamVjdChpbnB1dE9wdGlvbnMuY3JlYXRlKSAmJlxuICAgICAgICBpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5jcmVhdGUud2lkdGgpICYmIGlucHV0T3B0aW9ucy5jcmVhdGUud2lkdGggPiAwICYmXG4gICAgICAgIGlzLmludGVnZXIoaW5wdXRPcHRpb25zLmNyZWF0ZS5oZWlnaHQpICYmIGlucHV0T3B0aW9ucy5jcmVhdGUuaGVpZ2h0ID4gMCAmJlxuICAgICAgICBpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5jcmVhdGUuY2hhbm5lbHMpXG4gICAgICApIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmNyZWF0ZVdpZHRoID0gaW5wdXRPcHRpb25zLmNyZWF0ZS53aWR0aDtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmNyZWF0ZUhlaWdodCA9IGlucHV0T3B0aW9ucy5jcmVhdGUuaGVpZ2h0O1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IuY3JlYXRlQ2hhbm5lbHMgPSBpbnB1dE9wdGlvbnMuY3JlYXRlLmNoYW5uZWxzO1xuICAgICAgICAvLyBOb2lzZVxuICAgICAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlKSkge1xuICAgICAgICAgIGlmICghaXMub2JqZWN0KGlucHV0T3B0aW9ucy5jcmVhdGUubm9pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG5vaXNlIHRvIGJlIGFuIG9iamVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzLmluQXJyYXkoaW5wdXRPcHRpb25zLmNyZWF0ZS5ub2lzZS50eXBlLCBbJ2dhdXNzaWFuJ10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgZ2F1c3NpYW4gbm9pc2UgaXMgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5jcmVhdGUuY2hhbm5lbHMsIDEsIDQpKSB7XG4gICAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NyZWF0ZS5jaGFubmVscycsICdudW1iZXIgYmV0d2VlbiAxIGFuZCA0JywgaW5wdXRPcHRpb25zLmNyZWF0ZS5jaGFubmVscyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5jcmVhdGVOb2lzZVR5cGUgPSBpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlLnR5cGU7XG4gICAgICAgICAgaWYgKGlzLm51bWJlcihpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlLm1lYW4pICYmIGlzLmluUmFuZ2UoaW5wdXRPcHRpb25zLmNyZWF0ZS5ub2lzZS5tZWFuLCAwLCAxMDAwMCkpIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5jcmVhdGVOb2lzZU1lYW4gPSBpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlLm1lYW47XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY3JlYXRlLm5vaXNlLm1lYW4nLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwMDAnLCBpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlLm1lYW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXMubnVtYmVyKGlucHV0T3B0aW9ucy5jcmVhdGUubm9pc2Uuc2lnbWEpICYmIGlzLmluUmFuZ2UoaW5wdXRPcHRpb25zLmNyZWF0ZS5ub2lzZS5zaWdtYSwgMCwgMTAwMDApKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IuY3JlYXRlTm9pc2VTaWdtYSA9IGlucHV0T3B0aW9ucy5jcmVhdGUubm9pc2Uuc2lnbWE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY3JlYXRlLm5vaXNlLnNpZ21hJywgJ251bWJlciBiZXR3ZWVuIDAgYW5kIDEwMDAwJywgaW5wdXRPcHRpb25zLmNyZWF0ZS5ub2lzZS5zaWdtYSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLmNyZWF0ZS5iYWNrZ3JvdW5kKSkge1xuICAgICAgICAgIGlmICghaXMuaW5SYW5nZShpbnB1dE9wdGlvbnMuY3JlYXRlLmNoYW5uZWxzLCAzLCA0KSkge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdjcmVhdGUuY2hhbm5lbHMnLCAnbnVtYmVyIGJldHdlZW4gMyBhbmQgNCcsIGlucHV0T3B0aW9ucy5jcmVhdGUuY2hhbm5lbHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gY29sb3IoaW5wdXRPcHRpb25zLmNyZWF0ZS5iYWNrZ3JvdW5kKTtcbiAgICAgICAgICBpbnB1dERlc2NyaXB0b3IuY3JlYXRlQmFja2dyb3VuZCA9IFtcbiAgICAgICAgICAgIGJhY2tncm91bmQucmVkKCksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLmdyZWVuKCksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLmJsdWUoKSxcbiAgICAgICAgICAgIE1hdGgucm91bmQoYmFja2dyb3VuZC5hbHBoYSgpICogMjU1KVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB2YWxpZCBub2lzZSBvciBiYWNrZ3JvdW5kIHRvIGNyZWF0ZSBhIG5ldyBpbnB1dCBpbWFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBpbnB1dERlc2NyaXB0b3IuYnVmZmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB2YWxpZCB3aWR0aCwgaGVpZ2h0IGFuZCBjaGFubmVscyB0byBjcmVhdGUgYSBuZXcgaW5wdXQgaW1hZ2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGltYWdlIHdpdGggdGV4dFxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0KSkge1xuICAgICAgaWYgKGlzLm9iamVjdChpbnB1dE9wdGlvbnMudGV4dCkgJiYgaXMuc3RyaW5nKGlucHV0T3B0aW9ucy50ZXh0LnRleHQpKSB7XG4gICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0VmFsdWUgPSBpbnB1dE9wdGlvbnMudGV4dC50ZXh0O1xuICAgICAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMudGV4dC5oZWlnaHQpICYmIGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnRleHQuZHBpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgb25seSBvbmUgb2YgZHBpIG9yIGhlaWdodCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LmZvbnQpKSB7XG4gICAgICAgICAgaWYgKGlzLnN0cmluZyhpbnB1dE9wdGlvbnMudGV4dC5mb250KSkge1xuICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLnRleHRGb250ID0gaW5wdXRPcHRpb25zLnRleHQuZm9udDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0ZXh0LmZvbnQnLCAnc3RyaW5nJywgaW5wdXRPcHRpb25zLnRleHQuZm9udCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LmZvbnRmaWxlKSkge1xuICAgICAgICAgIGlmIChpcy5zdHJpbmcoaW5wdXRPcHRpb25zLnRleHQuZm9udGZpbGUpKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IudGV4dEZvbnRmaWxlID0gaW5wdXRPcHRpb25zLnRleHQuZm9udGZpbGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGV4dC5mb250ZmlsZScsICdzdHJpbmcnLCBpbnB1dE9wdGlvbnMudGV4dC5mb250ZmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LndpZHRoKSkge1xuICAgICAgICAgIGlmIChpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy50ZXh0LndpZHRoKSAmJiBpbnB1dE9wdGlvbnMudGV4dC53aWR0aCA+IDApIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0V2lkdGggPSBpbnB1dE9wdGlvbnMudGV4dC53aWR0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0ZXh0LndpZHRoJywgJ3Bvc2l0aXZlIGludGVnZXInLCBpbnB1dE9wdGlvbnMudGV4dC53aWR0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LmhlaWdodCkpIHtcbiAgICAgICAgICBpZiAoaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMudGV4dC5oZWlnaHQpICYmIGlucHV0T3B0aW9ucy50ZXh0LmhlaWdodCA+IDApIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0SGVpZ2h0ID0gaW5wdXRPcHRpb25zLnRleHQuaGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3RleHQuaGVpZ2h0JywgJ3Bvc2l0aXZlIGludGVnZXInLCBpbnB1dE9wdGlvbnMudGV4dC5oZWlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMudGV4dC5hbGlnbikpIHtcbiAgICAgICAgICBpZiAoaXMuc3RyaW5nKGlucHV0T3B0aW9ucy50ZXh0LmFsaWduKSAmJiBpcy5zdHJpbmcodGhpcy5jb25zdHJ1Y3Rvci5hbGlnbltpbnB1dE9wdGlvbnMudGV4dC5hbGlnbl0pKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IudGV4dEFsaWduID0gdGhpcy5jb25zdHJ1Y3Rvci5hbGlnbltpbnB1dE9wdGlvbnMudGV4dC5hbGlnbl07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGV4dC5hbGlnbicsICd2YWxpZCBhbGlnbm1lbnQnLCBpbnB1dE9wdGlvbnMudGV4dC5hbGlnbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0Lmp1c3RpZnkpKSB7XG4gICAgICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLnRleHQuanVzdGlmeSkpIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0SnVzdGlmeSA9IGlucHV0T3B0aW9ucy50ZXh0Lmp1c3RpZnk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGV4dC5qdXN0aWZ5JywgJ2Jvb2xlYW4nLCBpbnB1dE9wdGlvbnMudGV4dC5qdXN0aWZ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnRleHQuZHBpKSkge1xuICAgICAgICAgIGlmIChpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy50ZXh0LmRwaSkgJiYgaXMuaW5SYW5nZShpbnB1dE9wdGlvbnMudGV4dC5kcGksIDEsIDEwMDAwMDApKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IudGV4dERwaSA9IGlucHV0T3B0aW9ucy50ZXh0LmRwaTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0ZXh0LmRwaScsICdpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAwMCcsIGlucHV0T3B0aW9ucy50ZXh0LmRwaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LnJnYmEpKSB7XG4gICAgICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLnRleHQucmdiYSkpIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0UmdiYSA9IGlucHV0T3B0aW9ucy50ZXh0LnJnYmE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGV4dC5yZ2JhJywgJ2Jvb2wnLCBpbnB1dE9wdGlvbnMudGV4dC5yZ2JhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnRleHQuc3BhY2luZykpIHtcbiAgICAgICAgICBpZiAoaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMudGV4dC5zcGFjaW5nKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy50ZXh0LnNwYWNpbmcsIC0xMDAwMDAwLCAxMDAwMDAwKSkge1xuICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLnRleHRTcGFjaW5nID0gaW5wdXRPcHRpb25zLnRleHQuc3BhY2luZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0ZXh0LnNwYWNpbmcnLCAnaW50ZWdlciBiZXR3ZWVuIC0xMDAwMDAwIGFuZCAxMDAwMDAwJywgaW5wdXRPcHRpb25zLnRleHQuc3BhY2luZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LndyYXApKSB7XG4gICAgICAgICAgaWYgKGlzLnN0cmluZyhpbnB1dE9wdGlvbnMudGV4dC53cmFwKSAmJiBpcy5pbkFycmF5KGlucHV0T3B0aW9ucy50ZXh0LndyYXAsIFsnd29yZCcsICdjaGFyJywgJ3dvcmQtY2hhcicsICdub25lJ10pKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IudGV4dFdyYXAgPSBpbnB1dE9wdGlvbnMudGV4dC53cmFwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3RleHQud3JhcCcsICdvbmUgb2Y6IHdvcmQsIGNoYXIsIHdvcmQtY2hhciwgbm9uZScsIGlucHV0T3B0aW9ucy50ZXh0LndyYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgaW5wdXREZXNjcmlwdG9yLmJ1ZmZlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB2YWxpZCBzdHJpbmcgdG8gY3JlYXRlIGFuIGltYWdlIHdpdGggdGV4dC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IG9wdGlvbnMgJyArIGlucHV0T3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0RGVzY3JpcHRvcjtcbn1cblxuLyoqXG4gKiBIYW5kbGUgaW5jb21pbmcgQnVmZmVyIGNodW5rIG9uIFdyaXRhYmxlIFN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmtcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZyAtIHVudXNlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gX3dyaXRlIChjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXIpKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXMuYnVmZmVyKGNodW5rKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUluRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ05vbi1CdWZmZXIgZGF0YSBvbiBXcml0YWJsZSBTdHJlYW0nKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcignVW5leHBlY3RlZCBkYXRhIG9uIFdyaXRhYmxlIFN0cmVhbScpKTtcbiAgfVxufVxuXG4vKipcbiAqIEZsYXR0ZW5zIHRoZSBhcnJheSBvZiBjaHVua3MgYWNjdW11bGF0ZWQgaW4gaW5wdXQuYnVmZmVyLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2ZsYXR0ZW5CdWZmZXJJbiAoKSB7XG4gIGlmICh0aGlzLl9pc1N0cmVhbUlucHV0KCkpIHtcbiAgICB0aGlzLm9wdGlvbnMuaW5wdXQuYnVmZmVyID0gQnVmZmVyLmNvbmNhdCh0aGlzLm9wdGlvbnMuaW5wdXQuYnVmZmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIEFyZSB3ZSBleHBlY3RpbmcgU3RyZWFtLWJhc2VkIGlucHV0P1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBfaXNTdHJlYW1JbnB1dCAoKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXIpO1xufVxuXG4vKipcbiAqIEZhc3QgYWNjZXNzIHRvICh1bmNhY2hlZCkgaW1hZ2UgbWV0YWRhdGEgd2l0aG91dCBkZWNvZGluZyBhbnkgY29tcHJlc3NlZCBwaXhlbCBkYXRhLlxuICpcbiAqIFRoaXMgaXMgcmVhZCBmcm9tIHRoZSBoZWFkZXIgb2YgdGhlIGlucHV0IGltYWdlLlxuICogSXQgZG9lcyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gYW55IG9wZXJhdGlvbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgb3V0cHV0IGltYWdlLFxuICogc3VjaCBhcyByZXNpemUgb3Igcm90YXRlLlxuICpcbiAqIERpbWVuc2lvbnMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgcmVzcGVjdCB0aGUgYHBhZ2VgIGFuZCBgcGFnZXNgIHByb3BlcnRpZXMgb2YgdGhlXG4gKiB7QGxpbmsgL2FwaS1jb25zdHJ1Y3RvciNwYXJhbWV0ZXJzfGNvbnN0cnVjdG9yIHBhcmFtZXRlcnN9LlxuICpcbiAqIEEgYFByb21pc2VgIGlzIHJldHVybmVkIHdoZW4gYGNhbGxiYWNrYCBpcyBub3QgcHJvdmlkZWQuXG4gKlxuICogLSBgZm9ybWF0YDogTmFtZSBvZiBkZWNvZGVyIHVzZWQgdG8gZGVjb21wcmVzcyBpbWFnZSBkYXRhIGUuZy4gYGpwZWdgLCBgcG5nYCwgYHdlYnBgLCBgZ2lmYCwgYHN2Z2BcbiAqIC0gYHNpemVgOiBUb3RhbCBzaXplIG9mIGltYWdlIGluIGJ5dGVzLCBmb3IgU3RyZWFtIGFuZCBCdWZmZXIgaW5wdXQgb25seVxuICogLSBgd2lkdGhgOiBOdW1iZXIgb2YgcGl4ZWxzIHdpZGUgKEVYSUYgb3JpZW50YXRpb24gaXMgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiwgc2VlIGV4YW1wbGUgYmVsb3cpXG4gKiAtIGBoZWlnaHRgOiBOdW1iZXIgb2YgcGl4ZWxzIGhpZ2ggKEVYSUYgb3JpZW50YXRpb24gaXMgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiwgc2VlIGV4YW1wbGUgYmVsb3cpXG4gKiAtIGBzcGFjZWA6IE5hbWUgb2YgY29sb3VyIHNwYWNlIGludGVycHJldGF0aW9uIGUuZy4gYHNyZ2JgLCBgcmdiYCwgYGNteWtgLCBgbGFiYCwgYGItd2AgWy4uLl0oaHR0cHM6Ly93d3cubGlidmlwcy5vcmcvQVBJL2N1cnJlbnQvVmlwc0ltYWdlLmh0bWwjVmlwc0ludGVycHJldGF0aW9uKVxuICogLSBgY2hhbm5lbHNgOiBOdW1iZXIgb2YgYmFuZHMgZS5nLiBgM2AgZm9yIHNSR0IsIGA0YCBmb3IgQ01ZS1xuICogLSBgZGVwdGhgOiBOYW1lIG9mIHBpeGVsIGRlcHRoIGZvcm1hdCBlLmcuIGB1Y2hhcmAsIGBjaGFyYCwgYHVzaG9ydGAsIGBmbG9hdGAgWy4uLl0oaHR0cHM6Ly93d3cubGlidmlwcy5vcmcvQVBJL2N1cnJlbnQvVmlwc0ltYWdlLmh0bWwjVmlwc0JhbmRGb3JtYXQpXG4gKiAtIGBkZW5zaXR5YDogTnVtYmVyIG9mIHBpeGVscyBwZXIgaW5jaCAoRFBJKSwgaWYgcHJlc2VudFxuICogLSBgY2hyb21hU3Vic2FtcGxpbmdgOiBTdHJpbmcgY29udGFpbmluZyBKUEVHIGNocm9tYSBzdWJzYW1wbGluZywgYDQ6MjowYCBvciBgNDo0OjRgIGZvciBSR0IsIGA0OjI6MDo0YCBvciBgNDo0OjQ6NGAgZm9yIENNWUtcbiAqIC0gYGlzUHJvZ3Jlc3NpdmVgOiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCB1c2luZyBhIHByb2dyZXNzaXZlIHNjYW5cbiAqIC0gYHBhZ2VzYDogTnVtYmVyIG9mIHBhZ2VzL2ZyYW1lcyBjb250YWluZWQgd2l0aGluIHRoZSBpbWFnZSwgd2l0aCBzdXBwb3J0IGZvciBUSUZGLCBIRUlGLCBQREYsIGFuaW1hdGVkIEdJRiBhbmQgYW5pbWF0ZWQgV2ViUFxuICogLSBgcGFnZUhlaWdodGA6IE51bWJlciBvZiBwaXhlbHMgaGlnaCBlYWNoIHBhZ2UgaW4gYSBtdWx0aS1wYWdlIGltYWdlIHdpbGwgYmUuXG4gKiAtIGBwYWxldHRlQml0RGVwdGhgOiBCaXQgZGVwdGggb2YgcGFsZXR0ZS1iYXNlZCBpbWFnZSAoR0lGLCBQTkcpLlxuICogLSBgbG9vcGA6IE51bWJlciBvZiB0aW1lcyB0byBsb29wIGFuIGFuaW1hdGVkIGltYWdlLCB6ZXJvIHJlZmVycyB0byBhIGNvbnRpbnVvdXMgbG9vcC5cbiAqIC0gYGRlbGF5YDogRGVsYXkgaW4gbXMgYmV0d2VlbiBlYWNoIHBhZ2UgaW4gYW4gYW5pbWF0ZWQgaW1hZ2UsIHByb3ZpZGVkIGFzIGFuIGFycmF5IG9mIGludGVnZXJzLlxuICogLSBgcGFnZVByaW1hcnlgOiBOdW1iZXIgb2YgdGhlIHByaW1hcnkgcGFnZSBpbiBhIEhFSUYgaW1hZ2VcbiAqIC0gYGxldmVsc2A6IERldGFpbHMgb2YgZWFjaCBsZXZlbCBpbiBhIG11bHRpLWxldmVsIGltYWdlIHByb3ZpZGVkIGFzIGFuIGFycmF5IG9mIG9iamVjdHMsIHJlcXVpcmVzIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBPcGVuU2xpZGVcbiAqIC0gYHN1YmlmZHNgOiBOdW1iZXIgb2YgU3ViIEltYWdlIEZpbGUgRGlyZWN0b3JpZXMgaW4gYW4gT01FLVRJRkYgaW1hZ2VcbiAqIC0gYGJhY2tncm91bmRgOiBEZWZhdWx0IGJhY2tncm91bmQgY29sb3VyLCBpZiBwcmVzZW50LCBmb3IgUE5HIChiS0dEKSBhbmQgR0lGIGltYWdlcywgZWl0aGVyIGFuIFJHQiBPYmplY3Qgb3IgYSBzaW5nbGUgZ3JleXNjYWxlIHZhbHVlXG4gKiAtIGBjb21wcmVzc2lvbmA6IFRoZSBlbmNvZGVyIHVzZWQgdG8gY29tcHJlc3MgYW4gSEVJRiBmaWxlLCBgYXYxYCAoQVZJRikgb3IgYGhldmNgIChIRUlDKVxuICogLSBgcmVzb2x1dGlvblVuaXRgOiBUaGUgdW5pdCBvZiByZXNvbHV0aW9uIChkZW5zaXR5KSwgZWl0aGVyIGBpbmNoYCBvciBgY21gLCBpZiBwcmVzZW50XG4gKiAtIGBoYXNQcm9maWxlYDogQm9vbGVhbiBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbiBlbWJlZGRlZCBJQ0MgcHJvZmlsZVxuICogLSBgaGFzQWxwaGFgOiBCb29sZWFuIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIGFuIGFscGhhIHRyYW5zcGFyZW5jeSBjaGFubmVsXG4gKiAtIGBvcmllbnRhdGlvbmA6IE51bWJlciB2YWx1ZSBvZiB0aGUgRVhJRiBPcmllbnRhdGlvbiBoZWFkZXIsIGlmIHByZXNlbnRcbiAqIC0gYGV4aWZgOiBCdWZmZXIgY29udGFpbmluZyByYXcgRVhJRiBkYXRhLCBpZiBwcmVzZW50XG4gKiAtIGBpY2NgOiBCdWZmZXIgY29udGFpbmluZyByYXcgW0lDQ10oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvaWNjKSBwcm9maWxlIGRhdGEsIGlmIHByZXNlbnRcbiAqIC0gYGlwdGNgOiBCdWZmZXIgY29udGFpbmluZyByYXcgSVBUQyBkYXRhLCBpZiBwcmVzZW50XG4gKiAtIGB4bXBgOiBCdWZmZXIgY29udGFpbmluZyByYXcgWE1QIGRhdGEsIGlmIHByZXNlbnRcbiAqIC0gYHRpZmZ0YWdQaG90b3Nob3BgOiBCdWZmZXIgY29udGFpbmluZyByYXcgVElGRlRBR19QSE9UT1NIT1AgZGF0YSwgaWYgcHJlc2VudFxuICogLSBgZm9ybWF0TWFnaWNrYDogU3RyaW5nIGNvbnRhaW5pbmcgZm9ybWF0IGZvciBpbWFnZXMgbG9hZGVkIHZpYSAqbWFnaWNrXG4gKiAtIGBjb21tZW50c2A6IEFycmF5IG9mIGtleXdvcmQvdGV4dCBwYWlycyByZXByZXNlbnRpbmcgUE5HIHRleHQgYmxvY2tzLCBpZiBwcmVzZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KS5tZXRhZGF0YSgpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBpbWFnZSA9IHNoYXJwKGlucHV0SnBnKTtcbiAqIGltYWdlXG4gKiAgIC5tZXRhZGF0YSgpXG4gKiAgIC50aGVuKGZ1bmN0aW9uKG1ldGFkYXRhKSB7XG4gKiAgICAgcmV0dXJuIGltYWdlXG4gKiAgICAgICAucmVzaXplKE1hdGgucm91bmQobWV0YWRhdGEud2lkdGggLyAyKSlcbiAqICAgICAgIC53ZWJwKClcbiAqICAgICAgIC50b0J1ZmZlcigpO1xuICogICB9KVxuICogICAudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gKiAgICAgLy8gZGF0YSBjb250YWlucyBhIFdlYlAgaW1hZ2UgaGFsZiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgSlBFR1xuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzZWQgb24gRVhJRiByb3RhdGlvbiBtZXRhZGF0YSwgZ2V0IHRoZSByaWdodC1zaWRlLXVwIHdpZHRoIGFuZCBoZWlnaHQ6XG4gKlxuICogY29uc3Qgc2l6ZSA9IGdldE5vcm1hbFNpemUoYXdhaXQgc2hhcnAoaW5wdXQpLm1ldGFkYXRhKCkpO1xuICpcbiAqIGZ1bmN0aW9uIGdldE5vcm1hbFNpemUoeyB3aWR0aCwgaGVpZ2h0LCBvcmllbnRhdGlvbiB9KSB7XG4gKiAgIHJldHVybiAob3JpZW50YXRpb24gfHwgMCkgPj0gNVxuICogICAgID8geyB3aWR0aDogaGVpZ2h0LCBoZWlnaHQ6IHdpZHRoIH1cbiAqICAgICA6IHsgd2lkdGgsIGhlaWdodCB9O1xuICogfVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnRzIGAoZXJyLCBtZXRhZGF0YSlgXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fFNoYXJwfVxuICovXG5mdW5jdGlvbiBtZXRhZGF0YSAoY2FsbGJhY2spIHtcbiAgY29uc3Qgc3RhY2sgPSBFcnJvcigpO1xuICBpZiAoaXMuZm4oY2FsbGJhY2spKSB7XG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgdGhpcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9mbGF0dGVuQnVmZmVySW4oKTtcbiAgICAgICAgc2hhcnAubWV0YWRhdGEodGhpcy5vcHRpb25zLCAoZXJyLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgbWV0YWRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hhcnAubWV0YWRhdGEodGhpcy5vcHRpb25zLCAoZXJyLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgY2FsbGJhY2soaXMubmF0aXZlRXJyb3IoZXJyLCBzdGFjaykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIGlmICh0aGlzLl9pc1N0cmVhbUlucHV0KCkpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZsYXR0ZW5CdWZmZXJJbigpO1xuICAgICAgICAgIHNoYXJwLm1ldGFkYXRhKHRoaXMub3B0aW9ucywgKGVyciwgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUobWV0YWRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy53cml0YWJsZUZpbmlzaGVkKSB7XG4gICAgICAgICAgZmluaXNoZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uY2UoJ2ZpbmlzaCcsIGZpbmlzaGVkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNoYXJwLm1ldGFkYXRhKHRoaXMub3B0aW9ucywgKGVyciwgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoaXMubmF0aXZlRXJyb3IoZXJyLCBzdGFjaykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG1ldGFkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjZXNzIHRvIHBpeGVsLWRlcml2ZWQgaW1hZ2Ugc3RhdGlzdGljcyBmb3IgZXZlcnkgY2hhbm5lbCBpbiB0aGUgaW1hZ2UuXG4gKiBBIGBQcm9taXNlYCBpcyByZXR1cm5lZCB3aGVuIGBjYWxsYmFja2AgaXMgbm90IHByb3ZpZGVkLlxuICpcbiAqIC0gYGNoYW5uZWxzYDogQXJyYXkgb2YgY2hhbm5lbCBzdGF0aXN0aWNzIGZvciBlYWNoIGNoYW5uZWwgaW4gdGhlIGltYWdlLiBFYWNoIGNoYW5uZWwgc3RhdGlzdGljIGNvbnRhaW5zXG4gKiAgICAgLSBgbWluYCAobWluaW11bSB2YWx1ZSBpbiB0aGUgY2hhbm5lbClcbiAqICAgICAtIGBtYXhgIChtYXhpbXVtIHZhbHVlIGluIHRoZSBjaGFubmVsKVxuICogICAgIC0gYHN1bWAgKHN1bSBvZiBhbGwgdmFsdWVzIGluIGEgY2hhbm5lbClcbiAqICAgICAtIGBzcXVhcmVzU3VtYCAoc3VtIG9mIHNxdWFyZWQgdmFsdWVzIGluIGEgY2hhbm5lbClcbiAqICAgICAtIGBtZWFuYCAobWVhbiBvZiB0aGUgdmFsdWVzIGluIGEgY2hhbm5lbClcbiAqICAgICAtIGBzdGRldmAgKHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgdGhlIHZhbHVlcyBpbiBhIGNoYW5uZWwpXG4gKiAgICAgLSBgbWluWGAgKHgtY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBpeGVsIHdoZXJlIHRoZSBtaW5pbXVtIGxpZXMpXG4gKiAgICAgLSBgbWluWWAgKHktY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBpeGVsIHdoZXJlIHRoZSBtaW5pbXVtIGxpZXMpXG4gKiAgICAgLSBgbWF4WGAgKHgtY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBpeGVsIHdoZXJlIHRoZSBtYXhpbXVtIGxpZXMpXG4gKiAgICAgLSBgbWF4WWAgKHktY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBpeGVsIHdoZXJlIHRoZSBtYXhpbXVtIGxpZXMpXG4gKiAtIGBpc09wYXF1ZWA6IElzIHRoZSBpbWFnZSBmdWxseSBvcGFxdWU/IFdpbGwgYmUgYHRydWVgIGlmIHRoZSBpbWFnZSBoYXMgbm8gYWxwaGEgY2hhbm5lbCBvciBpZiBldmVyeSBwaXhlbCBpcyBmdWxseSBvcGFxdWUuXG4gKiAtIGBlbnRyb3B5YDogSGlzdG9ncmFtLWJhc2VkIGVzdGltYXRpb24gb2YgZ3JleXNjYWxlIGVudHJvcHksIGRpc2NhcmRpbmcgYWxwaGEgY2hhbm5lbCBpZiBhbnkuXG4gKiAtIGBzaGFycG5lc3NgOiBFc3RpbWF0aW9uIG9mIGdyZXlzY2FsZSBzaGFycG5lc3MgYmFzZWQgb24gdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhIExhcGxhY2lhbiBjb252b2x1dGlvbiwgZGlzY2FyZGluZyBhbHBoYSBjaGFubmVsIGlmIGFueS5cbiAqIC0gYGRvbWluYW50YDogT2JqZWN0IGNvbnRhaW5pbmcgbW9zdCBkb21pbmFudCBzUkdCIGNvbG91ciBiYXNlZCBvbiBhIDQwOTYtYmluIDNEIGhpc3RvZ3JhbS5cbiAqXG4gKiAqKk5vdGUqKjogU3RhdGlzdGljcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCBpbWFnZS4gQW55IG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBpbWFnZSBtdXN0IGZpcnN0IGJlXG4gKiB3cml0dGVuIHRvIGEgYnVmZmVyIGluIG9yZGVyIHRvIHJ1biBgc3RhdHNgIG9uIHRoZSByZXN1bHQgKHNlZSB0aGlyZCBleGFtcGxlKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgaW1hZ2UgPSBzaGFycChpbnB1dEpwZyk7XG4gKiBpbWFnZVxuICogICAuc3RhdHMoKVxuICogICAudGhlbihmdW5jdGlvbihzdGF0cykge1xuICogICAgICAvLyBzdGF0cyBjb250YWlucyB0aGUgY2hhbm5lbC13aXNlIHN0YXRpc3RpY3MgYXJyYXkgYW5kIHRoZSBpc09wYXF1ZSB2YWx1ZVxuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgeyBlbnRyb3B5LCBzaGFycG5lc3MsIGRvbWluYW50IH0gPSBhd2FpdCBzaGFycChpbnB1dCkuc3RhdHMoKTtcbiAqIGNvbnN0IHsgciwgZywgYiB9ID0gZG9taW5hbnQ7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGltYWdlID0gc2hhcnAoaW5wdXQpO1xuICogLy8gc3RvcmUgaW50ZXJtZWRpYXRlIHJlc3VsdFxuICogY29uc3QgcGFydCA9IGF3YWl0IGltYWdlLmV4dHJhY3QocmVnaW9uKS50b0J1ZmZlcigpO1xuICogLy8gY3JlYXRlIG5ldyBpbnN0YW5jZSB0byBvYnRhaW4gc3RhdGlzdGljcyBvZiBleHRyYWN0ZWQgcmVnaW9uXG4gKiBjb25zdCBzdGF0cyA9IGF3YWl0IHNoYXJwKHBhcnQpLnN0YXRzKCk7XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudHMgYChlcnIsIHN0YXRzKWBcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gKi9cbmZ1bmN0aW9uIHN0YXRzIChjYWxsYmFjaykge1xuICBjb25zdCBzdGFjayA9IEVycm9yKCk7XG4gIGlmIChpcy5mbihjYWxsYmFjaykpIHtcbiAgICBpZiAodGhpcy5faXNTdHJlYW1JbnB1dCgpKSB7XG4gICAgICB0aGlzLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2ZsYXR0ZW5CdWZmZXJJbigpO1xuICAgICAgICBzaGFycC5zdGF0cyh0aGlzLm9wdGlvbnMsIChlcnIsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soaXMubmF0aXZlRXJyb3IoZXJyLCBzdGFjaykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBzdGF0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFycC5zdGF0cyh0aGlzLm9wdGlvbnMsIChlcnIsIHN0YXRzKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhpcy5uYXRpdmVFcnJvcihlcnIsIHN0YWNrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgc3RhdHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5vbignZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuX2ZsYXR0ZW5CdWZmZXJJbigpO1xuICAgICAgICAgIHNoYXJwLnN0YXRzKHRoaXMub3B0aW9ucywgKGVyciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoc3RhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBzaGFycC5zdGF0cyh0aGlzLm9wdGlvbnMsIChlcnIsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGF0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERlY29yYXRlIHRoZSBTaGFycCBwcm90b3R5cGUgd2l0aCBpbnB1dC1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFNoYXJwKSB7XG4gIE9iamVjdC5hc3NpZ24oU2hhcnAucHJvdG90eXBlLCB7XG4gICAgLy8gUHJpdmF0ZVxuICAgIF9pbnB1dE9wdGlvbnNGcm9tT2JqZWN0LFxuICAgIF9jcmVhdGVJbnB1dERlc2NyaXB0b3IsXG4gICAgX3dyaXRlLFxuICAgIF9mbGF0dGVuQnVmZmVySW4sXG4gICAgX2lzU3RyZWFtSW5wdXQsXG4gICAgLy8gUHVibGljXG4gICAgbWV0YWRhdGEsXG4gICAgc3RhdHNcbiAgfSk7XG4gIC8vIENsYXNzIGF0dHJpYnV0ZXNcbiAgU2hhcnAuYWxpZ24gPSBhbGlnbjtcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5cbi8qKlxuICogV2VpZ2h0aW5nIHRvIGFwcGx5IHdoZW4gdXNpbmcgY29udGFpbi9jb3ZlciBmaXQuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBncmF2aXR5ID0ge1xuICBjZW50ZXI6IDAsXG4gIGNlbnRyZTogMCxcbiAgbm9ydGg6IDEsXG4gIGVhc3Q6IDIsXG4gIHNvdXRoOiAzLFxuICB3ZXN0OiA0LFxuICBub3J0aGVhc3Q6IDUsXG4gIHNvdXRoZWFzdDogNixcbiAgc291dGh3ZXN0OiA3LFxuICBub3J0aHdlc3Q6IDhcbn07XG5cbi8qKlxuICogUG9zaXRpb24gdG8gYXBwbHkgd2hlbiB1c2luZyBjb250YWluL2NvdmVyIGZpdC5cbiAqIEBtZW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHBvc2l0aW9uID0ge1xuICB0b3A6IDEsXG4gIHJpZ2h0OiAyLFxuICBib3R0b206IDMsXG4gIGxlZnQ6IDQsXG4gICdyaWdodCB0b3AnOiA1LFxuICAncmlnaHQgYm90dG9tJzogNixcbiAgJ2xlZnQgYm90dG9tJzogNyxcbiAgJ2xlZnQgdG9wJzogOFxufTtcblxuLyoqXG4gKiBIb3cgdG8gZXh0ZW5kIHRoZSBpbWFnZS5cbiAqIEBtZW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGV4dGVuZFdpdGggPSB7XG4gIGJhY2tncm91bmQ6ICdiYWNrZ3JvdW5kJyxcbiAgY29weTogJ2NvcHknLFxuICByZXBlYXQ6ICdyZXBlYXQnLFxuICBtaXJyb3I6ICdtaXJyb3InXG59O1xuXG4vKipcbiAqIFN0cmF0ZWdpZXMgZm9yIGF1dG9tYWdpYyBjb3ZlciBiZWhhdmlvdXIuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBzdHJhdGVneSA9IHtcbiAgZW50cm9weTogMTYsXG4gIGF0dGVudGlvbjogMTdcbn07XG5cbi8qKlxuICogUmVkdWN0aW9uIGtlcm5lbHMuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBrZXJuZWwgPSB7XG4gIG5lYXJlc3Q6ICduZWFyZXN0JyxcbiAgbGluZWFyOiAnbGluZWFyJyxcbiAgY3ViaWM6ICdjdWJpYycsXG4gIG1pdGNoZWxsOiAnbWl0Y2hlbGwnLFxuICBsYW5jem9zMjogJ2xhbmN6b3MyJyxcbiAgbGFuY3pvczM6ICdsYW5jem9zMydcbn07XG5cbi8qKlxuICogTWV0aG9kcyBieSB3aGljaCBhbiBpbWFnZSBjYW4gYmUgcmVzaXplZCB0byBmaXQgdGhlIHByb3ZpZGVkIGRpbWVuc2lvbnMuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBmaXQgPSB7XG4gIGNvbnRhaW46ICdjb250YWluJyxcbiAgY292ZXI6ICdjb3ZlcicsXG4gIGZpbGw6ICdmaWxsJyxcbiAgaW5zaWRlOiAnaW5zaWRlJyxcbiAgb3V0c2lkZTogJ291dHNpZGUnXG59O1xuXG4vKipcbiAqIE1hcCBleHRlcm5hbCBmaXQgcHJvcGVydHkgdG8gaW50ZXJuYWwgY2FudmFzIHByb3BlcnR5LlxuICogQG1lbWJlclxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgbWFwRml0VG9DYW52YXMgPSB7XG4gIGNvbnRhaW46ICdlbWJlZCcsXG4gIGNvdmVyOiAnY3JvcCcsXG4gIGZpbGw6ICdpZ25vcmVfYXNwZWN0JyxcbiAgaW5zaWRlOiAnbWF4JyxcbiAgb3V0c2lkZTogJ21pbidcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNSb3RhdGlvbkV4cGVjdGVkIChvcHRpb25zKSB7XG4gIHJldHVybiAob3B0aW9ucy5hbmdsZSAlIDM2MCkgIT09IDAgfHwgb3B0aW9ucy51c2VFeGlmT3JpZW50YXRpb24gPT09IHRydWUgfHwgb3B0aW9ucy5yb3RhdGlvbkFuZ2xlICE9PSAwO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzUmVzaXplRXhwZWN0ZWQgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMud2lkdGggIT09IC0xIHx8IG9wdGlvbnMuaGVpZ2h0ICE9PSAtMTtcbn1cblxuLyoqXG4gKiBSZXNpemUgaW1hZ2UgdG8gYHdpZHRoYCwgYGhlaWdodGAgb3IgYHdpZHRoIHggaGVpZ2h0YC5cbiAqXG4gKiBXaGVuIGJvdGggYSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBhcmUgcHJvdmlkZWQsIHRoZSBwb3NzaWJsZSBtZXRob2RzIGJ5IHdoaWNoIHRoZSBpbWFnZSBzaG91bGQgKipmaXQqKiB0aGVzZSBhcmU6XG4gKiAtIGBjb3ZlcmA6IChkZWZhdWx0KSBQcmVzZXJ2aW5nIGFzcGVjdCByYXRpbywgYXR0ZW1wdCB0byBlbnN1cmUgdGhlIGltYWdlIGNvdmVycyBib3RoIHByb3ZpZGVkIGRpbWVuc2lvbnMgYnkgY3JvcHBpbmcvY2xpcHBpbmcgdG8gZml0LlxuICogLSBgY29udGFpbmA6IFByZXNlcnZpbmcgYXNwZWN0IHJhdGlvLCBjb250YWluIHdpdGhpbiBib3RoIHByb3ZpZGVkIGRpbWVuc2lvbnMgdXNpbmcgXCJsZXR0ZXJib3hpbmdcIiB3aGVyZSBuZWNlc3NhcnkuXG4gKiAtIGBmaWxsYDogSWdub3JlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGlucHV0IGFuZCBzdHJldGNoIHRvIGJvdGggcHJvdmlkZWQgZGltZW5zaW9ucy5cbiAqIC0gYGluc2lkZWA6IFByZXNlcnZpbmcgYXNwZWN0IHJhdGlvLCByZXNpemUgdGhlIGltYWdlIHRvIGJlIGFzIGxhcmdlIGFzIHBvc3NpYmxlIHdoaWxlIGVuc3VyaW5nIGl0cyBkaW1lbnNpb25zIGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYm90aCB0aG9zZSBzcGVjaWZpZWQuXG4gKiAtIGBvdXRzaWRlYDogUHJlc2VydmluZyBhc3BlY3QgcmF0aW8sIHJlc2l6ZSB0aGUgaW1hZ2UgdG8gYmUgYXMgc21hbGwgYXMgcG9zc2libGUgd2hpbGUgZW5zdXJpbmcgaXRzIGRpbWVuc2lvbnMgYXJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBib3RoIHRob3NlIHNwZWNpZmllZC5cbiAqXG4gKiBTb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIFtvYmplY3QtZml0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1Mvb2JqZWN0LWZpdCkgQ1NTIHByb3BlcnR5LlxuICpcbiAqIDxpbWcgYWx0PVwiRXhhbXBsZXMgb2YgdmFyaW91cyB2YWx1ZXMgZm9yIHRoZSBmaXQgcHJvcGVydHkgd2hlbiByZXNpemluZ1wiIHdpZHRoPVwiMTAwJVwiIHN0eWxlPVwiYXNwZWN0LXJhdGlvOiA5OTgvMjQzXCIgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2xvdmVsbC9zaGFycEBtYWluL2RvY3MvaW1hZ2UvYXBpLXJlc2l6ZS1maXQuc3ZnXCI+XG4gKlxuICogV2hlbiB1c2luZyBhICoqZml0Kiogb2YgYGNvdmVyYCBvciBgY29udGFpbmAsIHRoZSBkZWZhdWx0ICoqcG9zaXRpb24qKiBpcyBgY2VudHJlYC4gT3RoZXIgb3B0aW9ucyBhcmU6XG4gKiAtIGBzaGFycC5wb3NpdGlvbmA6IGB0b3BgLCBgcmlnaHQgdG9wYCwgYHJpZ2h0YCwgYHJpZ2h0IGJvdHRvbWAsIGBib3R0b21gLCBgbGVmdCBib3R0b21gLCBgbGVmdGAsIGBsZWZ0IHRvcGAuXG4gKiAtIGBzaGFycC5ncmF2aXR5YDogYG5vcnRoYCwgYG5vcnRoZWFzdGAsIGBlYXN0YCwgYHNvdXRoZWFzdGAsIGBzb3V0aGAsIGBzb3V0aHdlc3RgLCBgd2VzdGAsIGBub3J0aHdlc3RgLCBgY2VudGVyYCBvciBgY2VudHJlYC5cbiAqIC0gYHNoYXJwLnN0cmF0ZWd5YDogYGNvdmVyYCBvbmx5LCBkeW5hbWljYWxseSBjcm9wIHVzaW5nIGVpdGhlciB0aGUgYGVudHJvcHlgIG9yIGBhdHRlbnRpb25gIHN0cmF0ZWd5LlxuICpcbiAqIFNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgW29iamVjdC1wb3NpdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL29iamVjdC1wb3NpdGlvbikgQ1NTIHByb3BlcnR5LlxuICpcbiAqIFRoZSBzdHJhdGVneS1iYXNlZCBhcHByb2FjaCBpbml0aWFsbHkgcmVzaXplcyBzbyBvbmUgZGltZW5zaW9uIGlzIGF0IGl0cyB0YXJnZXQgbGVuZ3RoXG4gKiB0aGVuIHJlcGVhdGVkbHkgcmFua3MgZWRnZSByZWdpb25zLCBkaXNjYXJkaW5nIHRoZSBlZGdlIHdpdGggdGhlIGxvd2VzdCBzY29yZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kuXG4gKiAtIGBlbnRyb3B5YDogZm9jdXMgb24gdGhlIHJlZ2lvbiB3aXRoIHRoZSBoaWdoZXN0IFtTaGFubm9uIGVudHJvcHldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VudHJvcHlfJTI4aW5mb3JtYXRpb25fdGhlb3J5JTI5KS5cbiAqIC0gYGF0dGVudGlvbmA6IGZvY3VzIG9uIHRoZSByZWdpb24gd2l0aCB0aGUgaGlnaGVzdCBsdW1pbmFuY2UgZnJlcXVlbmN5LCBjb2xvdXIgc2F0dXJhdGlvbiBhbmQgcHJlc2VuY2Ugb2Ygc2tpbiB0b25lcy5cbiAqXG4gKiBQb3NzaWJsZSBkb3duc2l6aW5nIGtlcm5lbHMgYXJlOlxuICogLSBgbmVhcmVzdGA6IFVzZSBbbmVhcmVzdCBuZWlnaGJvdXIgaW50ZXJwb2xhdGlvbl0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OZWFyZXN0LW5laWdoYm9yX2ludGVycG9sYXRpb24pLlxuICogLSBgbGluZWFyYDogVXNlIGEgW3RyaWFuZ2xlIGZpbHRlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJpYW5ndWxhcl9mdW5jdGlvbikuXG4gKiAtIGBjdWJpY2A6IFVzZSBhIFtDYXRtdWxsLVJvbSBzcGxpbmVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NlbnRyaXBldGFsX0NhdG11bGwlRTIlODAlOTNSb21fc3BsaW5lKS5cbiAqIC0gYG1pdGNoZWxsYDogVXNlIGEgW01pdGNoZWxsLU5ldHJhdmFsaSBzcGxpbmVdKGh0dHBzOi8vd3d3LmNzLnV0ZXhhcy5lZHUvfmZ1c3NlbGwvY291cnNlcy9jczM4NGctZmFsbDIwMTMvbGVjdHVyZXMvbWl0Y2hlbGwvTWl0Y2hlbGwucGRmKS5cbiAqIC0gYGxhbmN6b3MyYDogVXNlIGEgW0xhbmN6b3Mga2VybmVsXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYW5jem9zX3Jlc2FtcGxpbmcjTGFuY3pvc19rZXJuZWwpIHdpdGggYGE9MmAuXG4gKiAtIGBsYW5jem9zM2A6IFVzZSBhIExhbmN6b3Mga2VybmVsIHdpdGggYGE9M2AgKHRoZSBkZWZhdWx0KS5cbiAqXG4gKiBXaGVuIHVwc2FtcGxpbmcsIHRoZXNlIGtlcm5lbHMgbWFwIHRvIGBuZWFyZXN0YCwgYGxpbmVhcmAgYW5kIGBjdWJpY2AgaW50ZXJwb2xhdG9ycy5cbiAqIERvd25zYW1wbGluZyBrZXJuZWxzIHdpdGhvdXQgYSBtYXRjaGluZyB1cHNhbXBsaW5nIGludGVycG9sYXRvciBtYXAgdG8gYGN1YmljYC5cbiAqXG4gKiBPbmx5IG9uZSByZXNpemUgY2FuIG9jY3VyIHBlciBwaXBlbGluZS5cbiAqIFByZXZpb3VzIGNhbGxzIHRvIGByZXNpemVgIGluIHRoZSBzYW1lIHBpcGVsaW5lIHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogc2hhcnAoaW5wdXQpXG4gKiAgIC5yZXNpemUoeyB3aWR0aDogMTAwIH0pXG4gKiAgIC50b0J1ZmZlcigpXG4gKiAgIC50aGVuKGRhdGEgPT4ge1xuICogICAgIC8vIDEwMCBwaXhlbHMgd2lkZSwgYXV0by1zY2FsZWQgaGVpZ2h0XG4gKiAgIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnJlc2l6ZSh7IGhlaWdodDogMTAwIH0pXG4gKiAgIC50b0J1ZmZlcigpXG4gKiAgIC50aGVuKGRhdGEgPT4ge1xuICogICAgIC8vIDEwMCBwaXhlbHMgaGlnaCwgYXV0by1zY2FsZWQgd2lkdGhcbiAqICAgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAucmVzaXplKDIwMCwgMzAwLCB7XG4gKiAgICAga2VybmVsOiBzaGFycC5rZXJuZWwubmVhcmVzdCxcbiAqICAgICBmaXQ6ICdjb250YWluJyxcbiAqICAgICBwb3NpdGlvbjogJ3JpZ2h0IHRvcCcsXG4gKiAgICAgYmFja2dyb3VuZDogeyByOiAyNTUsIGc6IDI1NSwgYjogMjU1LCBhbHBoYTogMC41IH1cbiAqICAgfSlcbiAqICAgLnRvRmlsZSgnb3V0cHV0LnBuZycpXG4gKiAgIC50aGVuKCgpID0+IHtcbiAqICAgICAvLyBvdXRwdXQucG5nIGlzIGEgMjAwIHBpeGVscyB3aWRlIGFuZCAzMDAgcGl4ZWxzIGhpZ2ggaW1hZ2VcbiAqICAgICAvLyBjb250YWluaW5nIGEgbmVhcmVzdC1uZWlnaGJvdXIgc2NhbGVkIHZlcnNpb25cbiAqICAgICAvLyBjb250YWluZWQgd2l0aGluIHRoZSBub3J0aC1lYXN0IGNvcm5lciBvZiBhIHNlbWktdHJhbnNwYXJlbnQgd2hpdGUgY2FudmFzXG4gKiAgIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0cmFuc2Zvcm1lciA9IHNoYXJwKClcbiAqICAgLnJlc2l6ZSh7XG4gKiAgICAgd2lkdGg6IDIwMCxcbiAqICAgICBoZWlnaHQ6IDIwMCxcbiAqICAgICBmaXQ6IHNoYXJwLmZpdC5jb3ZlcixcbiAqICAgICBwb3NpdGlvbjogc2hhcnAuc3RyYXRlZ3kuZW50cm9weVxuICogICB9KTtcbiAqIC8vIFJlYWQgaW1hZ2UgZGF0YSBmcm9tIHJlYWRhYmxlU3RyZWFtXG4gKiAvLyBXcml0ZSAyMDBweCBzcXVhcmUgYXV0by1jcm9wcGVkIGltYWdlIGRhdGEgdG8gd3JpdGFibGVTdHJlYW1cbiAqIHJlYWRhYmxlU3RyZWFtXG4gKiAgIC5waXBlKHRyYW5zZm9ybWVyKVxuICogICAucGlwZSh3cml0YWJsZVN0cmVhbSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAucmVzaXplKDIwMCwgMjAwLCB7XG4gKiAgICAgZml0OiBzaGFycC5maXQuaW5zaWRlLFxuICogICAgIHdpdGhvdXRFbmxhcmdlbWVudDogdHJ1ZVxuICogICB9KVxuICogICAudG9Gb3JtYXQoJ2pwZWcnKVxuICogICAudG9CdWZmZXIoKVxuICogICAudGhlbihmdW5jdGlvbihvdXRwdXRCdWZmZXIpIHtcbiAqICAgICAvLyBvdXRwdXRCdWZmZXIgY29udGFpbnMgSlBFRyBpbWFnZSBkYXRhXG4gKiAgICAgLy8gbm8gd2lkZXIgYW5kIG5vIGhpZ2hlciB0aGFuIDIwMCBwaXhlbHNcbiAqICAgICAvLyBhbmQgbm8gbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGltYWdlXG4gKiAgIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnJlc2l6ZSgyMDAsIDIwMCwge1xuICogICAgIGZpdDogc2hhcnAuZml0Lm91dHNpZGUsXG4gKiAgICAgd2l0aG91dFJlZHVjdGlvbjogdHJ1ZVxuICogICB9KVxuICogICAudG9Gb3JtYXQoJ2pwZWcnKVxuICogICAudG9CdWZmZXIoKVxuICogICAudGhlbihmdW5jdGlvbihvdXRwdXRCdWZmZXIpIHtcbiAqICAgICAvLyBvdXRwdXRCdWZmZXIgY29udGFpbnMgSlBFRyBpbWFnZSBkYXRhXG4gKiAgICAgLy8gb2YgYXQgbGVhc3QgMjAwIHBpeGVscyB3aWRlIGFuZCAyMDAgcGl4ZWxzIGhpZ2ggd2hpbGUgbWFpbnRhaW5pbmcgYXNwZWN0IHJhdGlvXG4gKiAgICAgLy8gYW5kIG5vIHNtYWxsZXIgdGhhbiB0aGUgaW5wdXQgaW1hZ2VcbiAqICAgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjYWxlQnlIYWxmID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5tZXRhZGF0YSgpXG4gKiAgIC50aGVuKCh7IHdpZHRoIH0pID0+IHNoYXJwKGlucHV0KVxuICogICAgIC5yZXNpemUoTWF0aC5yb3VuZCh3aWR0aCAqIDAuNSkpXG4gKiAgICAgLnRvQnVmZmVyKClcbiAqICAgKTtcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIEhvdyBtYW55IHBpeGVscyB3aWRlIHRoZSByZXN1bHRhbnQgaW1hZ2Ugc2hvdWxkIGJlLiBVc2UgYG51bGxgIG9yIGB1bmRlZmluZWRgIHRvIGF1dG8tc2NhbGUgdGhlIHdpZHRoIHRvIG1hdGNoIHRoZSBoZWlnaHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBIb3cgbWFueSBwaXhlbHMgaGlnaCB0aGUgcmVzdWx0YW50IGltYWdlIHNob3VsZCBiZS4gVXNlIGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBhdXRvLXNjYWxlIHRoZSBoZWlnaHQgdG8gbWF0Y2ggdGhlIHdpZHRoLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLndpZHRoXSAtIEFuIGFsdGVybmF0aXZlIG1lYW5zIG9mIHNwZWNpZnlpbmcgYHdpZHRoYC4gSWYgYm90aCBhcmUgcHJlc2VudCB0aGlzIHRha2VzIHByaW9yaXR5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmhlaWdodF0gLSBBbiBhbHRlcm5hdGl2ZSBtZWFucyBvZiBzcGVjaWZ5aW5nIGBoZWlnaHRgLiBJZiBib3RoIGFyZSBwcmVzZW50IHRoaXMgdGFrZXMgcHJpb3JpdHkuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZml0PSdjb3ZlciddIC0gSG93IHRoZSBpbWFnZSBzaG91bGQgYmUgcmVzaXplZC9jcm9wcGVkIHRvIGZpdCB0aGUgdGFyZ2V0IGRpbWVuc2lvbihzKSwgb25lIG9mIGBjb3ZlcmAsIGBjb250YWluYCwgYGZpbGxgLCBgaW5zaWRlYCBvciBgb3V0c2lkZWAuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucG9zaXRpb249J2NlbnRyZSddIC0gQSBwb3NpdGlvbiwgZ3Jhdml0eSBvciBzdHJhdGVneSB0byB1c2Ugd2hlbiBgZml0YCBpcyBgY292ZXJgIG9yIGBjb250YWluYC5cbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gW29wdGlvbnMuYmFja2dyb3VuZD17cjogMCwgZzogMCwgYjogMCwgYWxwaGE6IDF9XSAtIGJhY2tncm91bmQgY29sb3VyIHdoZW4gYGZpdGAgaXMgYGNvbnRhaW5gLCBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSwgZGVmYXVsdHMgdG8gYmxhY2sgd2l0aG91dCB0cmFuc3BhcmVuY3kuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMua2VybmVsPSdsYW5jem9zMyddIC0gVGhlIGtlcm5lbCB0byB1c2UgZm9yIGltYWdlIHJlZHVjdGlvbiBhbmQgdGhlIGluZmVycmVkIGludGVycG9sYXRvciB0byB1c2UgZm9yIHVwc2FtcGxpbmcuIFVzZSB0aGUgYGZhc3RTaHJpbmtPbkxvYWRgIG9wdGlvbiB0byBjb250cm9sIGtlcm5lbCB2cyBzaHJpbmstb24tbG9hZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMud2l0aG91dEVubGFyZ2VtZW50PWZhbHNlXSAtIERvIG5vdCBzY2FsZSB1cCBpZiB0aGUgd2lkdGggKm9yKiBoZWlnaHQgYXJlIGFscmVhZHkgbGVzcyB0aGFuIHRoZSB0YXJnZXQgZGltZW5zaW9ucywgZXF1aXZhbGVudCB0byBHcmFwaGljc01hZ2ljaydzIGA+YCBnZW9tZXRyeSBvcHRpb24uIFRoaXMgbWF5IHJlc3VsdCBpbiBvdXRwdXQgZGltZW5zaW9ucyBzbWFsbGVyIHRoYW4gdGhlIHRhcmdldCBkaW1lbnNpb25zLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy53aXRob3V0UmVkdWN0aW9uPWZhbHNlXSAtIERvIG5vdCBzY2FsZSBkb3duIGlmIHRoZSB3aWR0aCAqb3IqIGhlaWdodCBhcmUgYWxyZWFkeSBncmVhdGVyIHRoYW4gdGhlIHRhcmdldCBkaW1lbnNpb25zLCBlcXVpdmFsZW50IHRvIEdyYXBoaWNzTWFnaWNrJ3MgYDxgIGdlb21ldHJ5IG9wdGlvbi4gVGhpcyBtYXkgc3RpbGwgcmVzdWx0IGluIGEgY3JvcCB0byByZWFjaCB0aGUgdGFyZ2V0IGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZhc3RTaHJpbmtPbkxvYWQ9dHJ1ZV0gLSBUYWtlIGdyZWF0ZXIgYWR2YW50YWdlIG9mIHRoZSBKUEVHIGFuZCBXZWJQIHNocmluay1vbi1sb2FkIGZlYXR1cmUsIHdoaWNoIGNhbiBsZWFkIHRvIGEgc2xpZ2h0IG1vaXLDqSBwYXR0ZXJuIG9yIHJvdW5kLWRvd24gb2YgYW4gYXV0by1zY2FsZWQgZGltZW5zaW9uLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiByZXNpemUgKHdpZHRoT3JPcHRpb25zLCBoZWlnaHQsIG9wdGlvbnMpIHtcbiAgaWYgKGlzUmVzaXplRXhwZWN0ZWQodGhpcy5vcHRpb25zKSkge1xuICAgIHRoaXMub3B0aW9ucy5kZWJ1Z2xvZygnaWdub3JpbmcgcHJldmlvdXMgcmVzaXplIG9wdGlvbnMnKTtcbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLndpZHRoUG9zdCAhPT0gLTEpIHtcbiAgICB0aGlzLm9wdGlvbnMuZGVidWdsb2coJ29wZXJhdGlvbiBvcmRlciB3aWxsIGJlOiBleHRyYWN0LCByZXNpemUsIGV4dHJhY3QnKTtcbiAgfVxuICBpZiAoaXMuZGVmaW5lZCh3aWR0aE9yT3B0aW9ucykpIHtcbiAgICBpZiAoaXMub2JqZWN0KHdpZHRoT3JPcHRpb25zKSAmJiAhaXMuZGVmaW5lZChvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IHdpZHRoT3JPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAoaXMuaW50ZWdlcih3aWR0aE9yT3B0aW9ucykgJiYgd2lkdGhPck9wdGlvbnMgPiAwKSB7XG4gICAgICB0aGlzLm9wdGlvbnMud2lkdGggPSB3aWR0aE9yT3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd3aWR0aCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgd2lkdGhPck9wdGlvbnMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAtMTtcbiAgfVxuICBpZiAoaXMuZGVmaW5lZChoZWlnaHQpKSB7XG4gICAgaWYgKGlzLmludGVnZXIoaGVpZ2h0KSAmJiBoZWlnaHQgPiAwKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2hlaWdodCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgaGVpZ2h0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IC0xO1xuICB9XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICAvLyBXaWR0aFxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMud2lkdGgpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLndpZHRoKSAmJiBvcHRpb25zLndpZHRoID4gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMud2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd3aWR0aCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgb3B0aW9ucy53aWR0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhlaWdodFxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuaGVpZ2h0KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5oZWlnaHQpICYmIG9wdGlvbnMuaGVpZ2h0ID4gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2hlaWdodCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgb3B0aW9ucy5oZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaXRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmZpdCkpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IG1hcEZpdFRvQ2FudmFzW29wdGlvbnMuZml0XTtcbiAgICAgIGlmIChpcy5zdHJpbmcoY2FudmFzKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuY2FudmFzID0gY2FudmFzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdmaXQnLCAndmFsaWQgZml0Jywgb3B0aW9ucy5maXQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBQb3NpdGlvblxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucG9zaXRpb24pKSB7XG4gICAgICBjb25zdCBwb3MgPSBpcy5pbnRlZ2VyKG9wdGlvbnMucG9zaXRpb24pXG4gICAgICAgID8gb3B0aW9ucy5wb3NpdGlvblxuICAgICAgICA6IHN0cmF0ZWd5W29wdGlvbnMucG9zaXRpb25dIHx8IHBvc2l0aW9uW29wdGlvbnMucG9zaXRpb25dIHx8IGdyYXZpdHlbb3B0aW9ucy5wb3NpdGlvbl07XG4gICAgICBpZiAoaXMuaW50ZWdlcihwb3MpICYmIChpcy5pblJhbmdlKHBvcywgMCwgOCkgfHwgaXMuaW5SYW5nZShwb3MsIDE2LCAxNykpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IHBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncG9zaXRpb24nLCAndmFsaWQgcG9zaXRpb24vZ3Jhdml0eS9zdHJhdGVneScsIG9wdGlvbnMucG9zaXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYWNrZ3JvdW5kXG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG91ck9wdGlvbigncmVzaXplQmFja2dyb3VuZCcsIG9wdGlvbnMuYmFja2dyb3VuZCk7XG4gICAgLy8gS2VybmVsXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5rZXJuZWwpKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKGtlcm5lbFtvcHRpb25zLmtlcm5lbF0pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5rZXJuZWwgPSBrZXJuZWxbb3B0aW9ucy5rZXJuZWxdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdrZXJuZWwnLCAndmFsaWQga2VybmVsIG5hbWUnLCBvcHRpb25zLmtlcm5lbCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdpdGhvdXQgZW5sYXJnZW1lbnRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLndpdGhvdXRFbmxhcmdlbWVudCkpIHtcbiAgICAgIHRoaXMuX3NldEJvb2xlYW5PcHRpb24oJ3dpdGhvdXRFbmxhcmdlbWVudCcsIG9wdGlvbnMud2l0aG91dEVubGFyZ2VtZW50KTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCByZWR1Y3Rpb25cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLndpdGhvdXRSZWR1Y3Rpb24pKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd3aXRob3V0UmVkdWN0aW9uJywgb3B0aW9ucy53aXRob3V0UmVkdWN0aW9uKTtcbiAgICB9XG4gICAgLy8gU2hyaW5rIG9uIGxvYWRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmZhc3RTaHJpbmtPbkxvYWQpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdmYXN0U2hyaW5rT25Mb2FkJywgb3B0aW9ucy5mYXN0U2hyaW5rT25Mb2FkKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzUm90YXRpb25FeHBlY3RlZCh0aGlzLm9wdGlvbnMpICYmIGlzUmVzaXplRXhwZWN0ZWQodGhpcy5vcHRpb25zKSkge1xuICAgIHRoaXMub3B0aW9ucy5yb3RhdGVCZWZvcmVQcmVFeHRyYWN0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBFeHRlbmQgLyBwYWQgLyBleHRydWRlIG9uZSBvciBtb3JlIGVkZ2VzIG9mIHRoZSBpbWFnZSB3aXRoIGVpdGhlclxuICogdGhlIHByb3ZpZGVkIGJhY2tncm91bmQgY29sb3VyIG9yIHBpeGVscyBkZXJpdmVkIGZyb20gdGhlIGltYWdlLlxuICogVGhpcyBvcGVyYXRpb24gd2lsbCBhbHdheXMgb2NjdXIgYWZ0ZXIgcmVzaXppbmcgYW5kIGV4dHJhY3Rpb24sIGlmIGFueS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVzaXplIHRvIDE0MCBwaXhlbHMgd2lkZSwgdGhlbiBhZGQgMTAgdHJhbnNwYXJlbnQgcGl4ZWxzXG4gKiAvLyB0byB0aGUgdG9wLCBsZWZ0IGFuZCByaWdodCBlZGdlcyBhbmQgMjAgdG8gdGhlIGJvdHRvbSBlZGdlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnJlc2l6ZSgxNDApXG4gKiAgIC5leHRlbmQoe1xuICogICAgIHRvcDogMTAsXG4gKiAgICAgYm90dG9tOiAyMCxcbiAqICAgICBsZWZ0OiAxMCxcbiAqICAgICByaWdodDogMTAsXG4gKiAgICAgYmFja2dyb3VuZDogeyByOiAwLCBnOiAwLCBiOiAwLCBhbHBoYTogMCB9XG4gKiAgIH0pXG4gKiAgIC4uLlxuICpcbiogQGV4YW1wbGVcbiAqIC8vIEFkZCBhIHJvdyBvZiAxMCByZWQgcGl4ZWxzIHRvIHRoZSBib3R0b21cbiAqIHNoYXJwKGlucHV0KVxuICogICAuZXh0ZW5kKHtcbiAqICAgICBib3R0b206IDEwLFxuICogICAgIGJhY2tncm91bmQ6ICdyZWQnXG4gKiAgIH0pXG4gKiAgIC4uLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeHRydWRlIGltYWdlIGJ5IDggcGl4ZWxzIHRvIHRoZSByaWdodCwgbWlycm9yaW5nIGV4aXN0aW5nIHJpZ2h0IGhhbmQgZWRnZVxuICogc2hhcnAoaW5wdXQpXG4gKiAgIC5leHRlbmQoe1xuICogICAgIHJpZ2h0OiA4LFxuICogICAgIGJhY2tncm91bmQ6ICdtaXJyb3InXG4gKiAgIH0pXG4gKiAgIC4uLlxuICpcbiAqIEBwYXJhbSB7KG51bWJlcnxPYmplY3QpfSBleHRlbmQgLSBzaW5nbGUgcGl4ZWwgY291bnQgdG8gYWRkIHRvIGFsbCBlZGdlcyBvciBhbiBPYmplY3Qgd2l0aCBwZXItZWRnZSBjb3VudHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZXh0ZW5kLnRvcD0wXVxuICogQHBhcmFtIHtudW1iZXJ9IFtleHRlbmQubGVmdD0wXVxuICogQHBhcmFtIHtudW1iZXJ9IFtleHRlbmQuYm90dG9tPTBdXG4gKiBAcGFyYW0ge251bWJlcn0gW2V4dGVuZC5yaWdodD0wXVxuICogQHBhcmFtIHtTdHJpbmd9IFtleHRlbmQuZXh0ZW5kV2l0aD0nYmFja2dyb3VuZCddIC0gcG9wdWxhdGUgbmV3IHBpeGVscyB1c2luZyB0aGlzIG1ldGhvZCwgb25lIG9mOiBiYWNrZ3JvdW5kLCBjb3B5LCByZXBlYXQsIG1pcnJvci5cbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gW2V4dGVuZC5iYWNrZ3JvdW5kPXtyOiAwLCBnOiAwLCBiOiAwLCBhbHBoYTogMX1dIC0gYmFja2dyb3VuZCBjb2xvdXIsIHBhcnNlZCBieSB0aGUgW2NvbG9yXShodHRwczovL3d3dy5ucG1qcy5vcmcvcGFja2FnZS9jb2xvcikgbW9kdWxlLCBkZWZhdWx0cyB0byBibGFjayB3aXRob3V0IHRyYW5zcGFyZW5jeS5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiovXG5mdW5jdGlvbiBleHRlbmQgKGV4dGVuZCkge1xuICBpZiAoaXMuaW50ZWdlcihleHRlbmQpICYmIGV4dGVuZCA+IDApIHtcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kVG9wID0gZXh0ZW5kO1xuICAgIHRoaXMub3B0aW9ucy5leHRlbmRCb3R0b20gPSBleHRlbmQ7XG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZExlZnQgPSBleHRlbmQ7XG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZFJpZ2h0ID0gZXh0ZW5kO1xuICB9IGVsc2UgaWYgKGlzLm9iamVjdChleHRlbmQpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQoZXh0ZW5kLnRvcCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGV4dGVuZC50b3ApICYmIGV4dGVuZC50b3AgPj0gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kVG9wID0gZXh0ZW5kLnRvcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndG9wJywgJ3Bvc2l0aXZlIGludGVnZXInLCBleHRlbmQudG9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQoZXh0ZW5kLmJvdHRvbSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGV4dGVuZC5ib3R0b20pICYmIGV4dGVuZC5ib3R0b20gPj0gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQm90dG9tID0gZXh0ZW5kLmJvdHRvbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignYm90dG9tJywgJ3Bvc2l0aXZlIGludGVnZXInLCBleHRlbmQuYm90dG9tKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQoZXh0ZW5kLmxlZnQpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihleHRlbmQubGVmdCkgJiYgZXh0ZW5kLmxlZnQgPj0gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kTGVmdCA9IGV4dGVuZC5sZWZ0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdsZWZ0JywgJ3Bvc2l0aXZlIGludGVnZXInLCBleHRlbmQubGVmdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGV4dGVuZC5yaWdodCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGV4dGVuZC5yaWdodCkgJiYgZXh0ZW5kLnJpZ2h0ID49IDApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZFJpZ2h0ID0gZXh0ZW5kLnJpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdyaWdodCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgZXh0ZW5kLnJpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG91ck9wdGlvbignZXh0ZW5kQmFja2dyb3VuZCcsIGV4dGVuZC5iYWNrZ3JvdW5kKTtcbiAgICBpZiAoaXMuZGVmaW5lZChleHRlbmQuZXh0ZW5kV2l0aCkpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcoZXh0ZW5kV2l0aFtleHRlbmQuZXh0ZW5kV2l0aF0pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaXRoID0gZXh0ZW5kV2l0aFtleHRlbmQuZXh0ZW5kV2l0aF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2V4dGVuZFdpdGgnLCAnb25lIG9mOiBiYWNrZ3JvdW5kLCBjb3B5LCByZXBlYXQsIG1pcnJvcicsIGV4dGVuZC5leHRlbmRXaXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdleHRlbmQnLCAnaW50ZWdlciBvciBvYmplY3QnLCBleHRlbmQpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEV4dHJhY3QvY3JvcCBhIHJlZ2lvbiBvZiB0aGUgaW1hZ2UuXG4gKlxuICogLSBVc2UgYGV4dHJhY3RgIGJlZm9yZSBgcmVzaXplYCBmb3IgcHJlLXJlc2l6ZSBleHRyYWN0aW9uLlxuICogLSBVc2UgYGV4dHJhY3RgIGFmdGVyIGByZXNpemVgIGZvciBwb3N0LXJlc2l6ZSBleHRyYWN0aW9uLlxuICogLSBVc2UgYGV4dHJhY3RgIHR3aWNlIGFuZCBgcmVzaXplYCBvbmNlIGZvciBleHRyYWN0LXRoZW4tcmVzaXplLXRoZW4tZXh0cmFjdCBpbiBhIGZpeGVkIG9wZXJhdGlvbiBvcmRlci5cbiAqXG4gKiBAZXhhbXBsZVxuICogc2hhcnAoaW5wdXQpXG4gKiAgIC5leHRyYWN0KHsgbGVmdDogbGVmdCwgdG9wOiB0b3AsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSlcbiAqICAgLnRvRmlsZShvdXRwdXQsIGZ1bmN0aW9uKGVycikge1xuICogICAgIC8vIEV4dHJhY3QgYSByZWdpb24gb2YgdGhlIGlucHV0IGltYWdlLCBzYXZpbmcgaW4gdGhlIHNhbWUgZm9ybWF0LlxuICogICB9KTtcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLmV4dHJhY3QoeyBsZWZ0OiBsZWZ0T2Zmc2V0UHJlLCB0b3A6IHRvcE9mZnNldFByZSwgd2lkdGg6IHdpZHRoUHJlLCBoZWlnaHQ6IGhlaWdodFByZSB9KVxuICogICAucmVzaXplKHdpZHRoLCBoZWlnaHQpXG4gKiAgIC5leHRyYWN0KHsgbGVmdDogbGVmdE9mZnNldFBvc3QsIHRvcDogdG9wT2Zmc2V0UG9zdCwgd2lkdGg6IHdpZHRoUG9zdCwgaGVpZ2h0OiBoZWlnaHRQb3N0IH0pXG4gKiAgIC50b0ZpbGUob3V0cHV0LCBmdW5jdGlvbihlcnIpIHtcbiAqICAgICAvLyBFeHRyYWN0IGEgcmVnaW9uLCByZXNpemUsIHRoZW4gZXh0cmFjdCBmcm9tIHRoZSByZXNpemVkIGltYWdlXG4gKiAgIH0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gZGVzY3JpYmVzIHRoZSByZWdpb24gdG8gZXh0cmFjdCB1c2luZyBpbnRlZ3JhbCBwaXhlbCB2YWx1ZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLmxlZnQgLSB6ZXJvLWluZGV4ZWQgb2Zmc2V0IGZyb20gbGVmdCBlZGdlXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50b3AgLSB6ZXJvLWluZGV4ZWQgb2Zmc2V0IGZyb20gdG9wIGVkZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLndpZHRoIC0gd2lkdGggb2YgcmVnaW9uIHRvIGV4dHJhY3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLmhlaWdodCAtIGhlaWdodCBvZiByZWdpb24gdG8gZXh0cmFjdFxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiBleHRyYWN0IChvcHRpb25zKSB7XG4gIGNvbnN0IHN1ZmZpeCA9IGlzUmVzaXplRXhwZWN0ZWQodGhpcy5vcHRpb25zKSB8fCB0aGlzLm9wdGlvbnMud2lkdGhQcmUgIT09IC0xID8gJ1Bvc3QnIDogJ1ByZSc7XG4gIGlmICh0aGlzLm9wdGlvbnNbYHdpZHRoJHtzdWZmaXh9YF0gIT09IC0xKSB7XG4gICAgdGhpcy5vcHRpb25zLmRlYnVnbG9nKCdpZ25vcmluZyBwcmV2aW91cyBleHRyYWN0IG9wdGlvbnMnKTtcbiAgfVxuICBbJ2xlZnQnLCAndG9wJywgJ3dpZHRoJywgJ2hlaWdodCddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbbmFtZV07XG4gICAgaWYgKGlzLmludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDApIHtcbiAgICAgIHRoaXMub3B0aW9uc1tuYW1lICsgKG5hbWUgPT09ICdsZWZ0JyB8fCBuYW1lID09PSAndG9wJyA/ICdPZmZzZXQnIDogJycpICsgc3VmZml4XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IobmFtZSwgJ2ludGVnZXInLCB2YWx1ZSk7XG4gICAgfVxuICB9LCB0aGlzKTtcbiAgLy8gRW5zdXJlIGV4aXN0aW5nIHJvdGF0aW9uIG9jY3VycyBiZWZvcmUgcHJlLXJlc2l6ZSBleHRyYWN0aW9uXG4gIGlmIChpc1JvdGF0aW9uRXhwZWN0ZWQodGhpcy5vcHRpb25zKSAmJiAhaXNSZXNpemVFeHBlY3RlZCh0aGlzLm9wdGlvbnMpKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy53aWR0aFByZSA9PT0gLTEgfHwgdGhpcy5vcHRpb25zLndpZHRoUG9zdCA9PT0gLTEpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5yb3RhdGVCZWZvcmVQcmVFeHRyYWN0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogVHJpbSBwaXhlbHMgZnJvbSBhbGwgZWRnZXMgdGhhdCBjb250YWluIHZhbHVlcyBzaW1pbGFyIHRvIHRoZSBnaXZlbiBiYWNrZ3JvdW5kIGNvbG91ciwgd2hpY2ggZGVmYXVsdHMgdG8gdGhhdCBvZiB0aGUgdG9wLWxlZnQgcGl4ZWwuXG4gKlxuICogSW1hZ2VzIHdpdGggYW4gYWxwaGEgY2hhbm5lbCB3aWxsIHVzZSB0aGUgY29tYmluZWQgYm91bmRpbmcgYm94IG9mIGFscGhhIGFuZCBub24tYWxwaGEgY2hhbm5lbHMuXG4gKlxuICogSWYgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiB3b3VsZCB0cmltIGFuIGltYWdlIHRvIG5vdGhpbmcgdGhlbiBubyBjaGFuZ2UgaXMgbWFkZS5cbiAqXG4gKiBUaGUgYGluZm9gIHJlc3BvbnNlIE9iamVjdCB3aWxsIGNvbnRhaW4gYHRyaW1PZmZzZXRMZWZ0YCBhbmQgYHRyaW1PZmZzZXRUb3BgIHByb3BlcnRpZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRyaW0gcGl4ZWxzIHdpdGggYSBjb2xvdXIgc2ltaWxhciB0byB0aGF0IG9mIHRoZSB0b3AtbGVmdCBwaXhlbC5cbiAqIGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAudHJpbSgpXG4gKiAgIC50b0ZpbGUob3V0cHV0KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVHJpbSBwaXhlbHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBjb2xvdXIgYXMgdGhhdCBvZiB0aGUgdG9wLWxlZnQgcGl4ZWwuXG4gKiBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnRyaW0oe1xuICogICAgIHRocmVzaG9sZDogMFxuICogICB9KVxuICogICAudG9GaWxlKG91dHB1dCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFzc3VtZSBpbnB1dCBpcyBsaW5lIGFydCBhbmQgdHJpbSBvbmx5IHBpeGVscyB3aXRoIGEgc2ltaWxhciBjb2xvdXIgdG8gcmVkLlxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC50cmltKHtcbiAqICAgICBiYWNrZ3JvdW5kOiBcIiNGRjAwMDBcIixcbiAqICAgICBsaW5lQXJ0OiB0cnVlXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUcmltIGFsbCBcInllbGxvdy1pc2hcIiBwaXhlbHMsIGJlaW5nIG1vcmUgbGVuaWVudCB3aXRoIHRoZSBoaWdoZXIgdGhyZXNob2xkLlxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC50cmltKHtcbiAqICAgICBiYWNrZ3JvdW5kOiBcInllbGxvd1wiLFxuICogICAgIHRocmVzaG9sZDogNDIsXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gW29wdGlvbnMuYmFja2dyb3VuZD0ndG9wLWxlZnQgcGl4ZWwnXSAtIEJhY2tncm91bmQgY29sb3VyLCBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSwgZGVmYXVsdHMgdG8gdGhhdCBvZiB0aGUgdG9wLWxlZnQgcGl4ZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGhyZXNob2xkPTEwXSAtIEFsbG93ZWQgZGlmZmVyZW5jZSBmcm9tIHRoZSBhYm92ZSBjb2xvdXIsIGEgcG9zaXRpdmUgbnVtYmVyLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5saW5lQXJ0PWZhbHNlXSAtIERvZXMgdGhlIGlucHV0IG1vcmUgY2xvc2VseSByZXNlbWJsZSBsaW5lIGFydCAoZS5nLiB2ZWN0b3IpIHJhdGhlciB0aGFuIGJlaW5nIHBob3RvZ3JhcGhpYz9cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gdHJpbSAob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMudHJpbVRocmVzaG9sZCA9IDEwO1xuICBpZiAoaXMuZGVmaW5lZChvcHRpb25zKSkge1xuICAgIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuYmFja2dyb3VuZCkpIHtcbiAgICAgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG91ck9wdGlvbigndHJpbUJhY2tncm91bmQnLCBvcHRpb25zLmJhY2tncm91bmQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy50aHJlc2hvbGQpKSB7XG4gICAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy50aHJlc2hvbGQpICYmIG9wdGlvbnMudGhyZXNob2xkID49IDApIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMudHJpbVRocmVzaG9sZCA9IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGhyZXNob2xkJywgJ3Bvc2l0aXZlIG51bWJlcicsIG9wdGlvbnMudGhyZXNob2xkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5saW5lQXJ0KSkge1xuICAgICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd0cmltTGluZUFydCcsIG9wdGlvbnMubGluZUFydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndHJpbScsICdvYmplY3QnLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzUm90YXRpb25FeHBlY3RlZCh0aGlzLm9wdGlvbnMpKSB7XG4gICAgdGhpcy5vcHRpb25zLnJvdGF0ZUJlZm9yZVByZUV4dHJhY3QgPSB0cnVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIERlY29yYXRlIHRoZSBTaGFycCBwcm90b3R5cGUgd2l0aCByZXNpemUtcmVsYXRlZCBmdW5jdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTaGFycCkge1xuICBPYmplY3QuYXNzaWduKFNoYXJwLnByb3RvdHlwZSwge1xuICAgIHJlc2l6ZSxcbiAgICBleHRlbmQsXG4gICAgZXh0cmFjdCxcbiAgICB0cmltXG4gIH0pO1xuICAvLyBDbGFzcyBhdHRyaWJ1dGVzXG4gIFNoYXJwLmdyYXZpdHkgPSBncmF2aXR5O1xuICBTaGFycC5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBTaGFycC5rZXJuZWwgPSBrZXJuZWw7XG4gIFNoYXJwLmZpdCA9IGZpdDtcbiAgU2hhcnAucG9zaXRpb24gPSBwb3NpdGlvbjtcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5cbi8qKlxuICogQmxlbmQgbW9kZXMuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBibGVuZCA9IHtcbiAgY2xlYXI6ICdjbGVhcicsXG4gIHNvdXJjZTogJ3NvdXJjZScsXG4gIG92ZXI6ICdvdmVyJyxcbiAgaW46ICdpbicsXG4gIG91dDogJ291dCcsXG4gIGF0b3A6ICdhdG9wJyxcbiAgZGVzdDogJ2Rlc3QnLFxuICAnZGVzdC1vdmVyJzogJ2Rlc3Qtb3ZlcicsXG4gICdkZXN0LWluJzogJ2Rlc3QtaW4nLFxuICAnZGVzdC1vdXQnOiAnZGVzdC1vdXQnLFxuICAnZGVzdC1hdG9wJzogJ2Rlc3QtYXRvcCcsXG4gIHhvcjogJ3hvcicsXG4gIGFkZDogJ2FkZCcsXG4gIHNhdHVyYXRlOiAnc2F0dXJhdGUnLFxuICBtdWx0aXBseTogJ211bHRpcGx5JyxcbiAgc2NyZWVuOiAnc2NyZWVuJyxcbiAgb3ZlcmxheTogJ292ZXJsYXknLFxuICBkYXJrZW46ICdkYXJrZW4nLFxuICBsaWdodGVuOiAnbGlnaHRlbicsXG4gICdjb2xvdXItZG9kZ2UnOiAnY29sb3VyLWRvZGdlJyxcbiAgJ2NvbG9yLWRvZGdlJzogJ2NvbG91ci1kb2RnZScsXG4gICdjb2xvdXItYnVybic6ICdjb2xvdXItYnVybicsXG4gICdjb2xvci1idXJuJzogJ2NvbG91ci1idXJuJyxcbiAgJ2hhcmQtbGlnaHQnOiAnaGFyZC1saWdodCcsXG4gICdzb2Z0LWxpZ2h0JzogJ3NvZnQtbGlnaHQnLFxuICBkaWZmZXJlbmNlOiAnZGlmZmVyZW5jZScsXG4gIGV4Y2x1c2lvbjogJ2V4Y2x1c2lvbidcbn07XG5cbi8qKlxuICogQ29tcG9zaXRlIGltYWdlKHMpIG92ZXIgdGhlIHByb2Nlc3NlZCAocmVzaXplZCwgZXh0cmFjdGVkIGV0Yy4pIGltYWdlLlxuICpcbiAqIFRoZSBpbWFnZXMgdG8gY29tcG9zaXRlIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBvciBzbWFsbGVyIHRoYW4gdGhlIHByb2Nlc3NlZCBpbWFnZS5cbiAqIElmIGJvdGggYHRvcGAgYW5kIGBsZWZ0YCBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhleSB0YWtlIHByZWNlZGVuY2Ugb3ZlciBgZ3Jhdml0eWAuXG4gKlxuICogQW55IHJlc2l6ZSwgcm90YXRlIG9yIGV4dHJhY3Qgb3BlcmF0aW9ucyBpbiB0aGUgc2FtZSBwcm9jZXNzaW5nIHBpcGVsaW5lXG4gKiB3aWxsIGFsd2F5cyBiZSBhcHBsaWVkIHRvIHRoZSBpbnB1dCBpbWFnZSBiZWZvcmUgY29tcG9zaXRpb24uXG4gKlxuICogVGhlIGBibGVuZGAgb3B0aW9uIGNhbiBiZSBvbmUgb2YgYGNsZWFyYCwgYHNvdXJjZWAsIGBvdmVyYCwgYGluYCwgYG91dGAsIGBhdG9wYCxcbiAqIGBkZXN0YCwgYGRlc3Qtb3ZlcmAsIGBkZXN0LWluYCwgYGRlc3Qtb3V0YCwgYGRlc3QtYXRvcGAsXG4gKiBgeG9yYCwgYGFkZGAsIGBzYXR1cmF0ZWAsIGBtdWx0aXBseWAsIGBzY3JlZW5gLCBgb3ZlcmxheWAsIGBkYXJrZW5gLCBgbGlnaHRlbmAsXG4gKiBgY29sb3VyLWRvZGdlYCwgYGNvbG9yLWRvZGdlYCwgYGNvbG91ci1idXJuYCxgY29sb3ItYnVybmAsXG4gKiBgaGFyZC1saWdodGAsIGBzb2Z0LWxpZ2h0YCwgYGRpZmZlcmVuY2VgLCBgZXhjbHVzaW9uYC5cbiAqXG4gKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGJsZW5kIG1vZGVzIGNhbiBiZSBmb3VuZCBhdFxuICogaHR0cHM6Ly93d3cubGlidmlwcy5vcmcvQVBJL2N1cnJlbnQvbGlidmlwcy1jb252ZXJzaW9uLmh0bWwjVmlwc0JsZW5kTW9kZVxuICogYW5kIGh0dHBzOi8vd3d3LmNhaXJvZ3JhcGhpY3Mub3JnL29wZXJhdG9ycy9cbiAqXG4gKiBAc2luY2UgMC4yMi4wXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHNoYXJwKGJhY2tncm91bmQpXG4gKiAgIC5jb21wb3NpdGUoW1xuICogICAgIHsgaW5wdXQ6IGxheWVyMSwgZ3Jhdml0eTogJ25vcnRod2VzdCcgfSxcbiAqICAgICB7IGlucHV0OiBsYXllcjIsIGdyYXZpdHk6ICdzb3V0aGVhc3QnIH0sXG4gKiAgIF0pXG4gKiAgIC50b0ZpbGUoJ2NvbWJpbmVkLnBuZycpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycCgnaW5wdXQuZ2lmJywgeyBhbmltYXRlZDogdHJ1ZSB9KVxuICogICAuY29tcG9zaXRlKFtcbiAqICAgICB7IGlucHV0OiAnb3ZlcmxheS5wbmcnLCB0aWxlOiB0cnVlLCBibGVuZDogJ3NhdHVyYXRlJyB9XG4gKiAgIF0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycCgnaW5wdXQucG5nJylcbiAqICAgLnJvdGF0ZSgxODApXG4gKiAgIC5yZXNpemUoMzAwKVxuICogICAuZmxhdHRlbiggeyBiYWNrZ3JvdW5kOiAnI2ZmNjYwMCcgfSApXG4gKiAgIC5jb21wb3NpdGUoW3sgaW5wdXQ6ICdvdmVybGF5LnBuZycsIGdyYXZpdHk6ICdzb3V0aGVhc3QnIH1dKVxuICogICAuc2hhcnBlbigpXG4gKiAgIC53aXRoTWV0YWRhdGEoKVxuICogICAud2VicCggeyBxdWFsaXR5OiA5MCB9IClcbiAqICAgLnRvQnVmZmVyKClcbiAqICAgLnRoZW4oZnVuY3Rpb24ob3V0cHV0QnVmZmVyKSB7XG4gKiAgICAgLy8gb3V0cHV0QnVmZmVyIGNvbnRhaW5zIHVwc2lkZSBkb3duLCAzMDBweCB3aWRlLCBhbHBoYSBjaGFubmVsIGZsYXR0ZW5lZFxuICogICAgIC8vIG9udG8gb3JhbmdlIGJhY2tncm91bmQsIGNvbXBvc2l0ZWQgd2l0aCBvdmVybGF5LnBuZyB3aXRoIFNFIGdyYXZpdHksXG4gKiAgICAgLy8gc2hhcnBlbmVkLCB3aXRoIG1ldGFkYXRhLCA5MCUgcXVhbGl0eSBXZWJQIGltYWdlIGRhdGEuIFBoZXchXG4gKiAgIH0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0W119IGltYWdlcyAtIE9yZGVyZWQgbGlzdCBvZiBpbWFnZXMgdG8gY29tcG9zaXRlXG4gKiBAcGFyYW0ge0J1ZmZlcnxTdHJpbmd9IFtpbWFnZXNbXS5pbnB1dF0gLSBCdWZmZXIgY29udGFpbmluZyBpbWFnZSBkYXRhLCBTdHJpbmcgY29udGFpbmluZyB0aGUgcGF0aCB0byBhbiBpbWFnZSBmaWxlLCBvciBDcmVhdGUgb2JqZWN0IChzZWUgYmVsb3cpXG4gKiBAcGFyYW0ge09iamVjdH0gW2ltYWdlc1tdLmlucHV0LmNyZWF0ZV0gLSBkZXNjcmliZXMgYSBibGFuayBvdmVybGF5IHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlc1tdLmlucHV0LmNyZWF0ZS53aWR0aF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10uaW5wdXQuY3JlYXRlLmhlaWdodF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10uaW5wdXQuY3JlYXRlLmNoYW5uZWxzXSAtIDMtNFxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBbaW1hZ2VzW10uaW5wdXQuY3JlYXRlLmJhY2tncm91bmRdIC0gcGFyc2VkIGJ5IHRoZSBbY29sb3JdKGh0dHBzOi8vd3d3Lm5wbWpzLm9yZy9wYWNrYWdlL2NvbG9yKSBtb2R1bGUgdG8gZXh0cmFjdCB2YWx1ZXMgZm9yIHJlZCwgZ3JlZW4sIGJsdWUgYW5kIGFscGhhLlxuICogQHBhcmFtIHtPYmplY3R9IFtpbWFnZXNbXS5pbnB1dC50ZXh0XSAtIGRlc2NyaWJlcyBhIG5ldyB0ZXh0IGltYWdlIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ltYWdlc1tdLmlucHV0LnRleHQudGV4dF0gLSB0ZXh0IHRvIHJlbmRlciBhcyBhIFVURi04IHN0cmluZy4gSXQgY2FuIGNvbnRhaW4gUGFuZ28gbWFya3VwLCBmb3IgZXhhbXBsZSBgPGk+TGU8L2k+TW9uZGVgLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbWFnZXNbXS5pbnB1dC50ZXh0LmZvbnRdIC0gZm9udCBuYW1lIHRvIHJlbmRlciB3aXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbWFnZXNbXS5pbnB1dC50ZXh0LmZvbnRmaWxlXSAtIGFic29sdXRlIGZpbGVzeXN0ZW0gcGF0aCB0byBhIGZvbnQgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IGBmb250YC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW1hZ2VzW10uaW5wdXQudGV4dC53aWR0aD0wXSAtIGludGVncmFsIG51bWJlciBvZiBwaXhlbHMgdG8gd29yZC13cmFwIGF0LiBMaW5lcyBvZiB0ZXh0IHdpZGVyIHRoYW4gdGhpcyB3aWxsIGJlIGJyb2tlbiBhdCB3b3JkIGJvdW5kYXJpZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ltYWdlc1tdLmlucHV0LnRleHQuaGVpZ2h0PTBdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyBoaWdoLiBXaGVuIGRlZmluZWQsIGBkcGlgIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlIHRleHQgd2lsbCBhdXRvbWF0aWNhbGx5IGZpdCB0aGUgcGl4ZWwgcmVzb2x1dGlvbiBkZWZpbmVkIGJ5IGB3aWR0aGAgYW5kIGBoZWlnaHRgLiBXaWxsIGJlIGlnbm9yZWQgaWYgYHdpZHRoYCBpcyBub3Qgc3BlY2lmaWVkIG9yIHNldCB0byAwLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbWFnZXNbXS5pbnB1dC50ZXh0LmFsaWduPSdsZWZ0J10gLSB0ZXh0IGFsaWdubWVudCAoYCdsZWZ0J2AsIGAnY2VudHJlJ2AsIGAnY2VudGVyJ2AsIGAncmlnaHQnYCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbWFnZXNbXS5pbnB1dC50ZXh0Lmp1c3RpZnk9ZmFsc2VdIC0gc2V0IHRoaXMgdG8gdHJ1ZSB0byBhcHBseSBqdXN0aWZpY2F0aW9uIHRvIHRoZSB0ZXh0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbWFnZXNbXS5pbnB1dC50ZXh0LmRwaT03Ml0gLSB0aGUgcmVzb2x1dGlvbiAoc2l6ZSkgYXQgd2hpY2ggdG8gcmVuZGVyIHRoZSB0ZXh0LiBEb2VzIG5vdCB0YWtlIGVmZmVjdCBpZiBgaGVpZ2h0YCBpcyBzcGVjaWZpZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbWFnZXNbXS5pbnB1dC50ZXh0LnJnYmE9ZmFsc2VdIC0gc2V0IHRoaXMgdG8gdHJ1ZSB0byBlbmFibGUgUkdCQSBvdXRwdXQuIFRoaXMgaXMgdXNlZnVsIGZvciBjb2xvdXIgZW1vamkgcmVuZGVyaW5nLCBvciBzdXBwb3J0IGZvciBQYW5nbyBtYXJrdXAgZmVhdHVyZXMgbGlrZSBgPHNwYW4gZm9yZWdyb3VuZD1cInJlZFwiPlJlZCE8L3NwYW4+YC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW1hZ2VzW10uaW5wdXQudGV4dC5zcGFjaW5nPTBdIC0gdGV4dCBsaW5lIGhlaWdodCBpbiBwb2ludHMuIFdpbGwgdXNlIHRoZSBmb250IGxpbmUgaGVpZ2h0IGlmIG5vbmUgaXMgc3BlY2lmaWVkLlxuICogQHBhcmFtIHtTdHJpbmd9IFtpbWFnZXNbXS5ibGVuZD0nb3ZlciddIC0gaG93IHRvIGJsZW5kIHRoaXMgaW1hZ2Ugd2l0aCB0aGUgaW1hZ2UgYmVsb3cuXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ltYWdlc1tdLmdyYXZpdHk9J2NlbnRyZSddIC0gZ3Jhdml0eSBhdCB3aGljaCB0byBwbGFjZSB0aGUgb3ZlcmxheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10udG9wXSAtIHRoZSBwaXhlbCBvZmZzZXQgZnJvbSB0aGUgdG9wIGVkZ2UuXG4gKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlc1tdLmxlZnRdIC0gdGhlIHBpeGVsIG9mZnNldCBmcm9tIHRoZSBsZWZ0IGVkZ2UuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpbWFnZXNbXS50aWxlPWZhbHNlXSAtIHNldCB0byB0cnVlIHRvIHJlcGVhdCB0aGUgb3ZlcmxheSBpbWFnZSBhY3Jvc3MgdGhlIGVudGlyZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBgZ3Jhdml0eWAuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpbWFnZXNbXS5wcmVtdWx0aXBsaWVkPWZhbHNlXSAtIHNldCB0byB0cnVlIHRvIGF2b2lkIHByZW11bHRpcGx5aW5nIHRoZSBpbWFnZSBiZWxvdy4gRXF1aXZhbGVudCB0byB0aGUgYC0tcHJlbXVsdGlwbGllZGAgdmlwcyBvcHRpb24uXG4gKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlc1tdLmRlbnNpdHk9NzJdIC0gbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgRFBJIGZvciB2ZWN0b3Igb3ZlcmxheSBpbWFnZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW1hZ2VzW10ucmF3XSAtIGRlc2NyaWJlcyBvdmVybGF5IHdoZW4gdXNpbmcgcmF3IHBpeGVsIGRhdGEuXG4gKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlc1tdLnJhdy53aWR0aF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10ucmF3LmhlaWdodF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10ucmF3LmNoYW5uZWxzXVxuICogQHBhcmFtIHtib29sZWFufSBbaW1hZ2VzW10uYW5pbWF0ZWQ9ZmFsc2VdIC0gU2V0IHRvIGB0cnVlYCB0byByZWFkIGFsbCBmcmFtZXMvcGFnZXMgb2YgYW4gYW5pbWF0ZWQgaW1hZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ltYWdlc1tdLmZhaWxPbj0nd2FybmluZyddIC0gQHNlZSB7QGxpbmsgL2FwaS1jb25zdHJ1Y3RvciNwYXJhbWV0ZXJzfGNvbnN0cnVjdG9yIHBhcmFtZXRlcnN9XG4gKiBAcGFyYW0ge251bWJlcnxib29sZWFufSBbaW1hZ2VzW10ubGltaXRJbnB1dFBpeGVscz0yNjg0MDI2ODldIC0gQHNlZSB7QGxpbmsgL2FwaS1jb25zdHJ1Y3RvciNwYXJhbWV0ZXJzfGNvbnN0cnVjdG9yIHBhcmFtZXRlcnN9XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2l0ZSAoaW1hZ2VzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShpbWFnZXMpKSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdpbWFnZXMgdG8gY29tcG9zaXRlJywgJ2FycmF5JywgaW1hZ2VzKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMuY29tcG9zaXRlID0gaW1hZ2VzLm1hcChpbWFnZSA9PiB7XG4gICAgaWYgKCFpcy5vYmplY3QoaW1hZ2UpKSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2ltYWdlIHRvIGNvbXBvc2l0ZScsICdvYmplY3QnLCBpbWFnZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0T3B0aW9ucyA9IHRoaXMuX2lucHV0T3B0aW9uc0Zyb21PYmplY3QoaW1hZ2UpO1xuICAgIGNvbnN0IGNvbXBvc2l0ZSA9IHtcbiAgICAgIGlucHV0OiB0aGlzLl9jcmVhdGVJbnB1dERlc2NyaXB0b3IoaW1hZ2UuaW5wdXQsIGlucHV0T3B0aW9ucywgeyBhbGxvd1N0cmVhbTogZmFsc2UgfSksXG4gICAgICBibGVuZDogJ292ZXInLFxuICAgICAgdGlsZTogZmFsc2UsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgaGFzT2Zmc2V0OiBmYWxzZSxcbiAgICAgIGdyYXZpdHk6IDAsXG4gICAgICBwcmVtdWx0aXBsaWVkOiBmYWxzZVxuICAgIH07XG4gICAgaWYgKGlzLmRlZmluZWQoaW1hZ2UuYmxlbmQpKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKGJsZW5kW2ltYWdlLmJsZW5kXSkpIHtcbiAgICAgICAgY29tcG9zaXRlLmJsZW5kID0gYmxlbmRbaW1hZ2UuYmxlbmRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdibGVuZCcsICd2YWxpZCBibGVuZCBuYW1lJywgaW1hZ2UuYmxlbmQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChpbWFnZS50aWxlKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW1hZ2UudGlsZSkpIHtcbiAgICAgICAgY29tcG9zaXRlLnRpbGUgPSBpbWFnZS50aWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0aWxlJywgJ2Jvb2xlYW4nLCBpbWFnZS50aWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQoaW1hZ2UubGVmdCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGltYWdlLmxlZnQpKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5sZWZ0ID0gaW1hZ2UubGVmdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbGVmdCcsICdpbnRlZ2VyJywgaW1hZ2UubGVmdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGltYWdlLnRvcCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGltYWdlLnRvcCkpIHtcbiAgICAgICAgY29tcG9zaXRlLnRvcCA9IGltYWdlLnRvcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndG9wJywgJ2ludGVnZXInLCBpbWFnZS50b3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChpbWFnZS50b3ApICE9PSBpcy5kZWZpbmVkKGltYWdlLmxlZnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGJvdGggbGVmdCBhbmQgdG9wIHRvIGJlIHNldCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb3NpdGUuaGFzT2Zmc2V0ID0gaXMuaW50ZWdlcihpbWFnZS50b3ApICYmIGlzLmludGVnZXIoaW1hZ2UubGVmdCk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGltYWdlLmdyYXZpdHkpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihpbWFnZS5ncmF2aXR5KSAmJiBpcy5pblJhbmdlKGltYWdlLmdyYXZpdHksIDAsIDgpKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5ncmF2aXR5ID0gaW1hZ2UuZ3Jhdml0eTtcbiAgICAgIH0gZWxzZSBpZiAoaXMuc3RyaW5nKGltYWdlLmdyYXZpdHkpICYmIGlzLmludGVnZXIodGhpcy5jb25zdHJ1Y3Rvci5ncmF2aXR5W2ltYWdlLmdyYXZpdHldKSkge1xuICAgICAgICBjb21wb3NpdGUuZ3Jhdml0eSA9IHRoaXMuY29uc3RydWN0b3IuZ3Jhdml0eVtpbWFnZS5ncmF2aXR5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZ3Jhdml0eScsICd2YWxpZCBncmF2aXR5JywgaW1hZ2UuZ3Jhdml0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGltYWdlLnByZW11bHRpcGxpZWQpKSB7XG4gICAgICBpZiAoaXMuYm9vbChpbWFnZS5wcmVtdWx0aXBsaWVkKSkge1xuICAgICAgICBjb21wb3NpdGUucHJlbXVsdGlwbGllZCA9IGltYWdlLnByZW11bHRpcGxpZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3ByZW11bHRpcGxpZWQnLCAnYm9vbGVhbicsIGltYWdlLnByZW11bHRpcGxpZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tcG9zaXRlO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogRGVjb3JhdGUgdGhlIFNoYXJwIHByb3RvdHlwZSB3aXRoIGNvbXBvc2l0ZS1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFNoYXJwKSB7XG4gIFNoYXJwLnByb3RvdHlwZS5jb21wb3NpdGUgPSBjb21wb3NpdGU7XG4gIFNoYXJwLmJsZW5kID0gYmxlbmQ7XG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNvbG9yID0gcmVxdWlyZSgnY29sb3InKTtcbmNvbnN0IGlzID0gcmVxdWlyZSgnLi9pcycpO1xuXG4vKipcbiAqIEhvdyBhY2N1cmF0ZSBhbiBvcGVyYXRpb24gc2hvdWxkIGJlLlxuICogQG1lbWJlclxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgdmlwc1ByZWNpc2lvbiA9IHtcbiAgaW50ZWdlcjogJ2ludGVnZXInLFxuICBmbG9hdDogJ2Zsb2F0JyxcbiAgYXBwcm94aW1hdGU6ICdhcHByb3hpbWF0ZSdcbn07XG5cbi8qKlxuICogUm90YXRlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgZWl0aGVyIGFuIGV4cGxpY2l0IGFuZ2xlXG4gKiBvciBhdXRvLW9yaWVudCBiYXNlZCBvbiB0aGUgRVhJRiBgT3JpZW50YXRpb25gIHRhZy5cbiAqXG4gKiBJZiBhbiBhbmdsZSBpcyBwcm92aWRlZCwgaXQgaXMgY29udmVydGVkIHRvIGEgdmFsaWQgcG9zaXRpdmUgZGVncmVlIHJvdGF0aW9uLlxuICogRm9yIGV4YW1wbGUsIGAtNDUwYCB3aWxsIHByb2R1Y2UgYSAyNzAgZGVncmVlIHJvdGF0aW9uLlxuICpcbiAqIFdoZW4gcm90YXRpbmcgYnkgYW4gYW5nbGUgb3RoZXIgdGhhbiBhIG11bHRpcGxlIG9mIDkwLFxuICogdGhlIGJhY2tncm91bmQgY29sb3VyIGNhbiBiZSBwcm92aWRlZCB3aXRoIHRoZSBgYmFja2dyb3VuZGAgb3B0aW9uLlxuICpcbiAqIElmIG5vIGFuZ2xlIGlzIHByb3ZpZGVkLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIEVYSUYgZGF0YS5cbiAqIE1pcnJvcmluZyBpcyBzdXBwb3J0ZWQgYW5kIG1heSBpbmZlciB0aGUgdXNlIG9mIGEgZmxpcCBvcGVyYXRpb24uXG4gKlxuICogVGhlIHVzZSBvZiBgcm90YXRlYCB3aXRob3V0IGFuIGFuZ2xlIHdpbGwgcmVtb3ZlIHRoZSBFWElGIGBPcmllbnRhdGlvbmAgdGFnLCBpZiBhbnkuXG4gKlxuICogT25seSBvbmUgcm90YXRpb24gY2FuIG9jY3VyIHBlciBwaXBlbGluZS5cbiAqIFByZXZpb3VzIGNhbGxzIHRvIGByb3RhdGVgIGluIHRoZSBzYW1lIHBpcGVsaW5lIHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBNdWx0aS1wYWdlIGltYWdlcyBjYW4gb25seSBiZSByb3RhdGVkIGJ5IDE4MCBkZWdyZWVzLlxuICpcbiAqIE1ldGhvZCBvcmRlciBpcyBpbXBvcnRhbnQgd2hlbiByb3RhdGluZywgcmVzaXppbmcgYW5kL29yIGV4dHJhY3RpbmcgcmVnaW9ucyxcbiAqIGZvciBleGFtcGxlIGAucm90YXRlKHgpLmV4dHJhY3QoeSlgIHdpbGwgcHJvZHVjZSBhIGRpZmZlcmVudCByZXN1bHQgdG8gYC5leHRyYWN0KHkpLnJvdGF0ZSh4KWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHBpcGVsaW5lID0gc2hhcnAoKVxuICogICAucm90YXRlKClcbiAqICAgLnJlc2l6ZShudWxsLCAyMDApXG4gKiAgIC50b0J1ZmZlcihmdW5jdGlvbiAoZXJyLCBvdXRwdXRCdWZmZXIsIGluZm8pIHtcbiAqICAgICAvLyBvdXRwdXRCdWZmZXIgY29udGFpbnMgMjAwcHggaGlnaCBKUEVHIGltYWdlIGRhdGEsXG4gKiAgICAgLy8gYXV0by1yb3RhdGVkIHVzaW5nIEVYSUYgT3JpZW50YXRpb24gdGFnXG4gKiAgICAgLy8gaW5mby53aWR0aCBhbmQgaW5mby5oZWlnaHQgY29udGFpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcmVzaXplZCBpbWFnZVxuICogICB9KTtcbiAqIHJlYWRhYmxlU3RyZWFtLnBpcGUocGlwZWxpbmUpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByb3RhdGVUaGVuUmVzaXplID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5yb3RhdGUoOTApXG4gKiAgIC5yZXNpemUoeyB3aWR0aDogMTYsIGhlaWdodDogOCwgZml0OiAnZmlsbCcgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKiBjb25zdCByZXNpemVUaGVuUm90YXRlID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5yZXNpemUoeyB3aWR0aDogMTYsIGhlaWdodDogOCwgZml0OiAnZmlsbCcgfSlcbiAqICAgLnJvdGF0ZSg5MClcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFthbmdsZT1hdXRvXSBhbmdsZSBvZiByb3RhdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBpZiBwcmVzZW50LCBpcyBhbiBPYmplY3Qgd2l0aCBvcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBbb3B0aW9ucy5iYWNrZ3JvdW5kPVwiIzAwMDAwMFwiXSBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSB0byBleHRyYWN0IHZhbHVlcyBmb3IgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZSAoYW5nbGUsIG9wdGlvbnMpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy51c2VFeGlmT3JpZW50YXRpb24gfHwgdGhpcy5vcHRpb25zLmFuZ2xlIHx8IHRoaXMub3B0aW9ucy5yb3RhdGlvbkFuZ2xlKSB7XG4gICAgdGhpcy5vcHRpb25zLmRlYnVnbG9nKCdpZ25vcmluZyBwcmV2aW91cyByb3RhdGUgb3B0aW9ucycpO1xuICB9XG4gIGlmICghaXMuZGVmaW5lZChhbmdsZSkpIHtcbiAgICB0aGlzLm9wdGlvbnMudXNlRXhpZk9yaWVudGF0aW9uID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpcy5pbnRlZ2VyKGFuZ2xlKSAmJiAhKGFuZ2xlICUgOTApKSB7XG4gICAgdGhpcy5vcHRpb25zLmFuZ2xlID0gYW5nbGU7XG4gIH0gZWxzZSBpZiAoaXMubnVtYmVyKGFuZ2xlKSkge1xuICAgIHRoaXMub3B0aW9ucy5yb3RhdGlvbkFuZ2xlID0gYW5nbGU7XG4gICAgaWYgKGlzLm9iamVjdChvcHRpb25zKSAmJiBvcHRpb25zLmJhY2tncm91bmQpIHtcbiAgICAgIGNvbnN0IGJhY2tncm91bmRDb2xvdXIgPSBjb2xvcihvcHRpb25zLmJhY2tncm91bmQpO1xuICAgICAgdGhpcy5vcHRpb25zLnJvdGF0aW9uQmFja2dyb3VuZCA9IFtcbiAgICAgICAgYmFja2dyb3VuZENvbG91ci5yZWQoKSxcbiAgICAgICAgYmFja2dyb3VuZENvbG91ci5ncmVlbigpLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3VyLmJsdWUoKSxcbiAgICAgICAgTWF0aC5yb3VuZChiYWNrZ3JvdW5kQ29sb3VyLmFscGhhKCkgKiAyNTUpXG4gICAgICBdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2FuZ2xlJywgJ251bWVyaWMnLCBhbmdsZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogTWlycm9yIHRoZSBpbWFnZSB2ZXJ0aWNhbGx5ICh1cC1kb3duKSBhYm91dCB0aGUgeC1heGlzLlxuICogVGhpcyBhbHdheXMgb2NjdXJzIGJlZm9yZSByb3RhdGlvbiwgaWYgYW55LlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggbXVsdGktcGFnZSBpbWFnZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNoYXJwKGlucHV0KS5mbGlwKCkudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtmbGlwPXRydWVdXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIGZsaXAgKGZsaXApIHtcbiAgdGhpcy5vcHRpb25zLmZsaXAgPSBpcy5ib29sKGZsaXApID8gZmxpcCA6IHRydWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIE1pcnJvciB0aGUgaW1hZ2UgaG9yaXpvbnRhbGx5IChsZWZ0LXJpZ2h0KSBhYm91dCB0aGUgeS1heGlzLlxuICogVGhpcyBhbHdheXMgb2NjdXJzIGJlZm9yZSByb3RhdGlvbiwgaWYgYW55LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dCkuZmxvcCgpLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbZmxvcD10cnVlXVxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBmbG9wIChmbG9wKSB7XG4gIHRoaXMub3B0aW9ucy5mbG9wID0gaXMuYm9vbChmbG9wKSA/IGZsb3AgOiB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBQZXJmb3JtIGFuIGFmZmluZSB0cmFuc2Zvcm0gb24gYW4gaW1hZ2UuIFRoaXMgb3BlcmF0aW9uIHdpbGwgYWx3YXlzIG9jY3VyIGFmdGVyIHJlc2l6aW5nLCBleHRyYWN0aW9uIGFuZCByb3RhdGlvbiwgaWYgYW55LlxuICpcbiAqIFlvdSBtdXN0IHByb3ZpZGUgYW4gYXJyYXkgb2YgbGVuZ3RoIDQgb3IgYSAyeDIgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cbiAqIEJ5IGRlZmF1bHQsIG5ldyBwaXhlbHMgYXJlIGZpbGxlZCB3aXRoIGEgYmxhY2sgYmFja2dyb3VuZC4gWW91IGNhbiBwcm92aWRlIGEgYmFja2dyb3VuZCBjb2xvciB3aXRoIHRoZSBgYmFja2dyb3VuZGAgb3B0aW9uLlxuICogQSBwYXJ0aWN1bGFyIGludGVycG9sYXRvciBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuIFNldCB0aGUgYGludGVycG9sYXRvcmAgb3B0aW9uIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUgYHNoYXJwLmludGVycG9sYXRvcnNgIE9iamVjdCBlLmcuIGBzaGFycC5pbnRlcnBvbGF0b3JzLm5vaGFsb2AuXG4gKlxuICogSW4gdGhlIGNhc2Ugb2YgYSAyeDIgbWF0cml4LCB0aGUgdHJhbnNmb3JtIGlzOlxuICogLSBYID0gYG1hdHJpeFswLCAwXWAgXFwqICh4ICsgYGlkeGApICsgYG1hdHJpeFswLCAxXWAgXFwqICh5ICsgYGlkeWApICsgYG9keGBcbiAqIC0gWSA9IGBtYXRyaXhbMSwgMF1gIFxcKiAoeCArIGBpZHhgKSArIGBtYXRyaXhbMSwgMV1gIFxcKiAoeSArIGBpZHlgKSArIGBvZHlgXG4gKlxuICogd2hlcmU6XG4gKiAtIHggYW5kIHkgYXJlIHRoZSBjb29yZGluYXRlcyBpbiBpbnB1dCBpbWFnZS5cbiAqIC0gWCBhbmQgWSBhcmUgdGhlIGNvb3JkaW5hdGVzIGluIG91dHB1dCBpbWFnZS5cbiAqIC0gKDAsMCkgaXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyLlxuICpcbiAqIEBzaW5jZSAwLjI3LjBcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcGlwZWxpbmUgPSBzaGFycCgpXG4gKiAgIC5hZmZpbmUoW1sxLCAwLjNdLCBbMC4xLCAwLjddXSwge1xuICogICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxuICogICAgICBpbnRlcnBvbGF0b3I6IHNoYXJwLmludGVycG9sYXRvcnMubm9oYWxvXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigoZXJyLCBvdXRwdXRCdWZmZXIsIGluZm8pID0+IHtcbiAqICAgICAgLy8gb3V0cHV0QnVmZmVyIGNvbnRhaW5zIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZVxuICogICAgICAvLyBpbmZvLndpZHRoIGFuZCBpbmZvLmhlaWdodCBjb250YWluIHRoZSBuZXcgZGltZW5zaW9uc1xuICogICB9KTtcbiAqXG4gKiBpbnB1dFN0cmVhbVxuICogICAucGlwZShwaXBlbGluZSk7XG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+PnxBcnJheTxudW1iZXI+fSBtYXRyaXggLSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gaWYgcHJlc2VudCwgaXMgYW4gT2JqZWN0IHdpdGggb3B0aW9uYWwgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gW29wdGlvbnMuYmFja2dyb3VuZD1cIiMwMDAwMDBcIl0gLSBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSB0byBleHRyYWN0IHZhbHVlcyBmb3IgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaWR4PTBdIC0gaW5wdXQgaG9yaXpvbnRhbCBvZmZzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pZHk9MF0gLSBpbnB1dCB2ZXJ0aWNhbCBvZmZzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5vZHg9MF0gLSBvdXRwdXQgaG9yaXpvbnRhbCBvZmZzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5vZHk9MF0gLSBvdXRwdXQgdmVydGljYWwgb2Zmc2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaW50ZXJwb2xhdG9yPXNoYXJwLmludGVycG9sYXRvcnMuYmljdWJpY10gLSBpbnRlcnBvbGF0b3JcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gYWZmaW5lIChtYXRyaXgsIG9wdGlvbnMpIHtcbiAgY29uc3QgZmxhdE1hdHJpeCA9IFtdLmNvbmNhdCguLi5tYXRyaXgpO1xuICBpZiAoZmxhdE1hdHJpeC5sZW5ndGggPT09IDQgJiYgZmxhdE1hdHJpeC5ldmVyeShpcy5udW1iZXIpKSB7XG4gICAgdGhpcy5vcHRpb25zLmFmZmluZU1hdHJpeCA9IGZsYXRNYXRyaXg7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdtYXRyaXgnLCAnMXg0IG9yIDJ4MiBhcnJheScsIG1hdHJpeCk7XG4gIH1cblxuICBpZiAoaXMuZGVmaW5lZChvcHRpb25zKSkge1xuICAgIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvdXJPcHRpb24oJ2FmZmluZUJhY2tncm91bmQnLCBvcHRpb25zLmJhY2tncm91bmQpO1xuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5pZHgpKSB7XG4gICAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5pZHgpKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFmZmluZUlkeCA9IG9wdGlvbnMuaWR4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy5pZHgnLCAnbnVtYmVyJywgb3B0aW9ucy5pZHgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmlkeSkpIHtcbiAgICAgICAgaWYgKGlzLm51bWJlcihvcHRpb25zLmlkeSkpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYWZmaW5lSWR5ID0gb3B0aW9ucy5pZHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zLmlkeScsICdudW1iZXInLCBvcHRpb25zLmlkeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMub2R4KSkge1xuICAgICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMub2R4KSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5hZmZpbmVPZHggPSBvcHRpb25zLm9keDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMub2R4JywgJ251bWJlcicsIG9wdGlvbnMub2R4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5vZHkpKSB7XG4gICAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5vZHkpKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFmZmluZU9keSA9IG9wdGlvbnMub2R5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy5vZHknLCAnbnVtYmVyJywgb3B0aW9ucy5vZHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmludGVycG9sYXRvcikpIHtcbiAgICAgICAgaWYgKGlzLmluQXJyYXkob3B0aW9ucy5pbnRlcnBvbGF0b3IsIE9iamVjdC52YWx1ZXModGhpcy5jb25zdHJ1Y3Rvci5pbnRlcnBvbGF0b3JzKSkpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYWZmaW5lSW50ZXJwb2xhdG9yID0gb3B0aW9ucy5pbnRlcnBvbGF0b3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zLmludGVycG9sYXRvcicsICd2YWxpZCBpbnRlcnBvbGF0b3IgbmFtZScsIG9wdGlvbnMuaW50ZXJwb2xhdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMnLCAnb2JqZWN0Jywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogU2hhcnBlbiB0aGUgaW1hZ2UuXG4gKlxuICogV2hlbiB1c2VkIHdpdGhvdXQgcGFyYW1ldGVycywgcGVyZm9ybXMgYSBmYXN0LCBtaWxkIHNoYXJwZW4gb2YgdGhlIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBXaGVuIGEgYHNpZ21hYCBpcyBwcm92aWRlZCwgcGVyZm9ybXMgYSBzbG93ZXIsIG1vcmUgYWNjdXJhdGUgc2hhcnBlbiBvZiB0aGUgTCBjaGFubmVsIGluIHRoZSBMQUIgY29sb3VyIHNwYWNlLlxuICogRmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgbGV2ZWwgb2Ygc2hhcnBlbmluZyBpbiBcImZsYXRcIiAobTEpIGFuZCBcImphZ2dlZFwiIChtMikgYXJlYXMgaXMgYXZhaWxhYmxlLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly93d3cubGlidmlwcy5vcmcvQVBJL2N1cnJlbnQvbGlidmlwcy1jb252b2x1dGlvbi5odG1sI3ZpcHMtc2hhcnBlbnxsaWJ2aXBzIHNoYXJwZW59IG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KS5zaGFycGVuKCkudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KS5zaGFycGVuKHsgc2lnbWE6IDIgfSkudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuc2hhcnBlbih7XG4gKiAgICAgc2lnbWE6IDIsXG4gKiAgICAgbTE6IDAsXG4gKiAgICAgbTI6IDMsXG4gKiAgICAgeDE6IDMsXG4gKiAgICAgeTI6IDE1LFxuICogICAgIHkzOiAxNSxcbiAqICAgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R8bnVtYmVyfSBbb3B0aW9uc10gLSBpZiBwcmVzZW50LCBpcyBhbiBPYmplY3Qgd2l0aCBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2lnbWFdIC0gdGhlIHNpZ21hIG9mIHRoZSBHYXVzc2lhbiBtYXNrLCB3aGVyZSBgc2lnbWEgPSAxICsgcmFkaXVzIC8gMmAsIGJldHdlZW4gMC4wMDAwMDEgYW5kIDEwXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubTE9MS4wXSAtIHRoZSBsZXZlbCBvZiBzaGFycGVuaW5nIHRvIGFwcGx5IHRvIFwiZmxhdFwiIGFyZWFzLCBiZXR3ZWVuIDAgYW5kIDEwMDAwMDBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tMj0yLjBdIC0gdGhlIGxldmVsIG9mIHNoYXJwZW5pbmcgdG8gYXBwbHkgdG8gXCJqYWdnZWRcIiBhcmVhcywgYmV0d2VlbiAwIGFuZCAxMDAwMDAwXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMueDE9Mi4wXSAtIHRocmVzaG9sZCBiZXR3ZWVuIFwiZmxhdFwiIGFuZCBcImphZ2dlZFwiLCBiZXR3ZWVuIDAgYW5kIDEwMDAwMDBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy55Mj0xMC4wXSAtIG1heGltdW0gYW1vdW50IG9mIGJyaWdodGVuaW5nLCBiZXR3ZWVuIDAgYW5kIDEwMDAwMDBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy55Mz0yMC4wXSAtIG1heGltdW0gYW1vdW50IG9mIGRhcmtlbmluZywgYmV0d2VlbiAwIGFuZCAxMDAwMDAwXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZsYXRdIC0gKGRlcHJlY2F0ZWQpIHNlZSBgb3B0aW9ucy5tMWAuXG4gKiBAcGFyYW0ge251bWJlcn0gW2phZ2dlZF0gLSAoZGVwcmVjYXRlZCkgc2VlIGBvcHRpb25zLm0yYC5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gc2hhcnBlbiAob3B0aW9ucywgZmxhdCwgamFnZ2VkKSB7XG4gIGlmICghaXMuZGVmaW5lZChvcHRpb25zKSkge1xuICAgIC8vIE5vIGFyZ3VtZW50czogZGVmYXVsdCB0byBtaWxkIHNoYXJwZW5cbiAgICB0aGlzLm9wdGlvbnMuc2hhcnBlblNpZ21hID0gLTE7XG4gIH0gZWxzZSBpZiAoaXMuYm9vbChvcHRpb25zKSkge1xuICAgIC8vIERlcHJlY2F0ZWQgYm9vbGVhbiBhcmd1bWVudDogYXBwbHkgbWlsZCBzaGFycGVuP1xuICAgIHRoaXMub3B0aW9ucy5zaGFycGVuU2lnbWEgPSBvcHRpb25zID8gLTEgOiAwO1xuICB9IGVsc2UgaWYgKGlzLm51bWJlcihvcHRpb25zKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMsIDAuMDEsIDEwMDAwKSkge1xuICAgIC8vIERlcHJlY2F0ZWQgbnVtZXJpYyBhcmd1bWVudDogc3BlY2lmaWMgc2lnbWFcbiAgICB0aGlzLm9wdGlvbnMuc2hhcnBlblNpZ21hID0gb3B0aW9ucztcbiAgICAvLyBEZXByZWNhdGVkIGNvbnRyb2wgb3ZlciBmbGF0IGFyZWFzXG4gICAgaWYgKGlzLmRlZmluZWQoZmxhdCkpIHtcbiAgICAgIGlmIChpcy5udW1iZXIoZmxhdCkgJiYgaXMuaW5SYW5nZShmbGF0LCAwLCAxMDAwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5NMSA9IGZsYXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2ZsYXQnLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwMDAnLCBmbGF0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGVwcmVjYXRlZCBjb250cm9sIG92ZXIgamFnZ2VkIGFyZWFzXG4gICAgaWYgKGlzLmRlZmluZWQoamFnZ2VkKSkge1xuICAgICAgaWYgKGlzLm51bWJlcihqYWdnZWQpICYmIGlzLmluUmFuZ2UoamFnZ2VkLCAwLCAxMDAwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5NMiA9IGphZ2dlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignamFnZ2VkJywgJ251bWJlciBiZXR3ZWVuIDAgYW5kIDEwMDAwJywgamFnZ2VkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXMucGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMuc2lnbWEpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5zaWdtYSwgMC4wMDAwMDEsIDEwKSkge1xuICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5TaWdtYSA9IG9wdGlvbnMuc2lnbWE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy5zaWdtYScsICdudW1iZXIgYmV0d2VlbiAwLjAwMDAwMSBhbmQgMTAnLCBvcHRpb25zLnNpZ21hKTtcbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5tMSkpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5tMSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLm0xLCAwLCAxMDAwMDAwKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc2hhcnBlbk0xID0gb3B0aW9ucy5tMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy5tMScsICdudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAwMDAwJywgb3B0aW9ucy5tMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubTIpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMubTIpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5tMiwgMCwgMTAwMDAwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5NMiA9IG9wdGlvbnMubTI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMubTInLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwMDAwMCcsIG9wdGlvbnMubTIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLngxKSkge1xuICAgICAgaWYgKGlzLm51bWJlcihvcHRpb25zLngxKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMueDEsIDAsIDEwMDAwMDApKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zaGFycGVuWDEgPSBvcHRpb25zLngxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zLngxJywgJ251bWJlciBiZXR3ZWVuIDAgYW5kIDEwMDAwMDAnLCBvcHRpb25zLngxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy55MikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy55MikgJiYgaXMuaW5SYW5nZShvcHRpb25zLnkyLCAwLCAxMDAwMDAwKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc2hhcnBlblkyID0gb3B0aW9ucy55MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy55MicsICdudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAwMDAwJywgb3B0aW9ucy55Mik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMueTMpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMueTMpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy55MywgMCwgMTAwMDAwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5ZMyA9IG9wdGlvbnMueTM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMueTMnLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwMDAwMCcsIG9wdGlvbnMueTMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3NpZ21hJywgJ251bWJlciBiZXR3ZWVuIDAuMDEgYW5kIDEwMDAwJywgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQXBwbHkgbWVkaWFuIGZpbHRlci5cbiAqIFdoZW4gdXNlZCB3aXRob3V0IHBhcmFtZXRlcnMgdGhlIGRlZmF1bHQgd2luZG93IGlzIDN4My5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpLm1lZGlhbigpLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNoYXJwKGlucHV0KS5tZWRpYW4oNSkudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW3NpemU9M10gc3F1YXJlIG1hc2sgc2l6ZTogc2l6ZSB4IHNpemVcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gbWVkaWFuIChzaXplKSB7XG4gIGlmICghaXMuZGVmaW5lZChzaXplKSkge1xuICAgIC8vIE5vIGFyZ3VtZW50czogZGVmYXVsdCB0byAzeDNcbiAgICB0aGlzLm9wdGlvbnMubWVkaWFuU2l6ZSA9IDM7XG4gIH0gZWxzZSBpZiAoaXMuaW50ZWdlcihzaXplKSAmJiBpcy5pblJhbmdlKHNpemUsIDEsIDEwMDApKSB7XG4gICAgLy8gTnVtZXJpYyBhcmd1bWVudDogc3BlY2lmaWMgc2lnbWFcbiAgICB0aGlzLm9wdGlvbnMubWVkaWFuU2l6ZSA9IHNpemU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdzaXplJywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAwJywgc2l6ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQmx1ciB0aGUgaW1hZ2UuXG4gKlxuICogV2hlbiB1c2VkIHdpdGhvdXQgcGFyYW1ldGVycywgcGVyZm9ybXMgYSBmYXN0IDN4MyBib3ggYmx1ciAoZXF1aXZhbGVudCB0byBhIGJveCBsaW5lYXIgZmlsdGVyKS5cbiAqXG4gKiBXaGVuIGEgYHNpZ21hYCBpcyBwcm92aWRlZCwgcGVyZm9ybXMgYSBzbG93ZXIsIG1vcmUgYWNjdXJhdGUgR2F1c3NpYW4gYmx1ci5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYm94Qmx1cnJlZCA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuYmx1cigpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBnYXVzc2lhbkJsdXJyZWQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmJsdXIoNSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R8bnVtYmVyfEJvb2xlYW59IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNpZ21hXSBhIHZhbHVlIGJldHdlZW4gMC4zIGFuZCAxMDAwIHJlcHJlc2VudGluZyB0aGUgc2lnbWEgb2YgdGhlIEdhdXNzaWFuIG1hc2ssIHdoZXJlIGBzaWdtYSA9IDEgKyByYWRpdXMgLyAyYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5wcmVjaXNpb249J2ludGVnZXInXSBIb3cgYWNjdXJhdGUgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUsIG9uZSBvZjogaW50ZWdlciwgZmxvYXQsIGFwcHJveGltYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pbkFtcGxpdHVkZT0wLjJdIEEgdmFsdWUgYmV0d2VlbiAwLjAwMSBhbmQgMS4gQSBzbWFsbGVyIHZhbHVlIHdpbGwgZ2VuZXJhdGUgYSBsYXJnZXIsIG1vcmUgYWNjdXJhdGUgbWFzay5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gYmx1ciAob3B0aW9ucykge1xuICBsZXQgc2lnbWE7XG4gIGlmIChpcy5udW1iZXIob3B0aW9ucykpIHtcbiAgICBzaWdtYSA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAoaXMucGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICBpZiAoIWlzLm51bWJlcihvcHRpb25zLnNpZ21hKSkge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zLnNpZ21hJywgJ251bWJlciBiZXR3ZWVuIDAuMyBhbmQgMTAwMCcsIHNpZ21hKTtcbiAgICB9XG4gICAgc2lnbWEgPSBvcHRpb25zLnNpZ21hO1xuICAgIGlmICgncHJlY2lzaW9uJyBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKHZpcHNQcmVjaXNpb25bb3B0aW9ucy5wcmVjaXNpb25dKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMucHJlY2lzaW9uID0gdmlwc1ByZWNpc2lvbltvcHRpb25zLnByZWNpc2lvbl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3ByZWNpc2lvbicsICdvbmUgb2Y6IGludGVnZXIsIGZsb2F0LCBhcHByb3hpbWF0ZScsIG9wdGlvbnMucHJlY2lzaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCdtaW5BbXBsaXR1ZGUnIGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5taW5BbXBsaXR1ZGUpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5taW5BbXBsaXR1ZGUsIDAuMDAxLCAxKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWluQW1wbCA9IG9wdGlvbnMubWluQW1wbGl0dWRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdtaW5BbXBsaXR1ZGUnLCAnbnVtYmVyIGJldHdlZW4gMC4wMDEgYW5kIDEnLCBvcHRpb25zLm1pbkFtcGxpdHVkZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpcy5kZWZpbmVkKG9wdGlvbnMpKSB7XG4gICAgLy8gTm8gYXJndW1lbnRzOiBkZWZhdWx0IHRvIG1pbGQgYmx1clxuICAgIHRoaXMub3B0aW9ucy5ibHVyU2lnbWEgPSAtMTtcbiAgfSBlbHNlIGlmIChpcy5ib29sKG9wdGlvbnMpKSB7XG4gICAgLy8gQm9vbGVhbiBhcmd1bWVudDogYXBwbHkgbWlsZCBibHVyP1xuICAgIHRoaXMub3B0aW9ucy5ibHVyU2lnbWEgPSBvcHRpb25zID8gLTEgOiAwO1xuICB9IGVsc2UgaWYgKGlzLm51bWJlcihzaWdtYSkgJiYgaXMuaW5SYW5nZShzaWdtYSwgMC4zLCAxMDAwKSkge1xuICAgIC8vIE51bWVyaWMgYXJndW1lbnQ6IHNwZWNpZmljIHNpZ21hXG4gICAgdGhpcy5vcHRpb25zLmJsdXJTaWdtYSA9IHNpZ21hO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignc2lnbWEnLCAnbnVtYmVyIGJldHdlZW4gMC4zIGFuZCAxMDAwJywgc2lnbWEpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogTWVyZ2UgYWxwaGEgdHJhbnNwYXJlbmN5IGNoYW5uZWwsIGlmIGFueSwgd2l0aCBhIGJhY2tncm91bmQsIHRoZW4gcmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsLlxuICpcbiAqIFNlZSBhbHNvIHtAbGluayAvYXBpLWNoYW5uZWwjcmVtb3ZlYWxwaGF8cmVtb3ZlQWxwaGF9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBzaGFycChyZ2JhSW5wdXQpXG4gKiAgIC5mbGF0dGVuKHsgYmFja2dyb3VuZDogJyNGMEE3MDMnIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gW29wdGlvbnMuYmFja2dyb3VuZD17cjogMCwgZzogMCwgYjogMH1dIC0gYmFja2dyb3VuZCBjb2xvdXIsIHBhcnNlZCBieSB0aGUgW2NvbG9yXShodHRwczovL3d3dy5ucG1qcy5vcmcvcGFja2FnZS9jb2xvcikgbW9kdWxlLCBkZWZhdWx0cyB0byBibGFjay5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbiAob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMuZmxhdHRlbiA9IGlzLmJvb2wob3B0aW9ucykgPyBvcHRpb25zIDogdHJ1ZTtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvdXJPcHRpb24oJ2ZsYXR0ZW5CYWNrZ3JvdW5kJywgb3B0aW9ucy5iYWNrZ3JvdW5kKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhlIGltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsXG4gKiB3aXRoIGFsbCB3aGl0ZSBwaXhlbCB2YWx1ZXMgbWFkZSBmdWxseSB0cmFuc3BhcmVudC5cbiAqXG4gKiBFeGlzdGluZyBhbHBoYSBjaGFubmVsIHZhbHVlcyBmb3Igbm9uLXdoaXRlIHBpeGVscyByZW1haW4gdW5jaGFuZ2VkLlxuICpcbiAqIFRoaXMgZmVhdHVyZSBpcyBleHBlcmltZW50YWwgYW5kIHRoZSBBUEkgbWF5IGNoYW5nZS5cbiAqXG4gKiBAc2luY2UgMC4zMi4xXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHNoYXJwKHJnYklucHV0KVxuICogICAudW5mbGF0dGVuKClcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHNoYXJwKHJnYklucHV0KVxuICogICAudGhyZXNob2xkKDEyOCwgeyBncmF5c2NhbGU6IGZhbHNlIH0pIC8vIGNvbnZlcnRlciBicmlnaHQgcGl4ZWxzIHRvIHdoaXRlXG4gKiAgIC51bmZsYXR0ZW4oKVxuICogICAudG9CdWZmZXIoKTtcbiAqL1xuZnVuY3Rpb24gdW5mbGF0dGVuICgpIHtcbiAgdGhpcy5vcHRpb25zLnVuZmxhdHRlbiA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEFwcGx5IGEgZ2FtbWEgY29ycmVjdGlvbiBieSByZWR1Y2luZyB0aGUgZW5jb2RpbmcgKGRhcmtlbikgcHJlLXJlc2l6ZSBhdCBhIGZhY3RvciBvZiBgMS9nYW1tYWBcbiAqIHRoZW4gaW5jcmVhc2luZyB0aGUgZW5jb2RpbmcgKGJyaWdodGVuKSBwb3N0LXJlc2l6ZSBhdCBhIGZhY3RvciBvZiBgZ2FtbWFgLlxuICogVGhpcyBjYW4gaW1wcm92ZSB0aGUgcGVyY2VpdmVkIGJyaWdodG5lc3Mgb2YgYSByZXNpemVkIGltYWdlIGluIG5vbi1saW5lYXIgY29sb3VyIHNwYWNlcy5cbiAqIEpQRUcgYW5kIFdlYlAgaW5wdXQgaW1hZ2VzIHdpbGwgbm90IHRha2UgYWR2YW50YWdlIG9mIHRoZSBzaHJpbmstb24tbG9hZCBwZXJmb3JtYW5jZSBvcHRpbWlzYXRpb25cbiAqIHdoZW4gYXBwbHlpbmcgYSBnYW1tYSBjb3JyZWN0aW9uLlxuICpcbiAqIFN1cHBseSBhIHNlY29uZCBhcmd1bWVudCB0byB1c2UgYSBkaWZmZXJlbnQgb3V0cHV0IGdhbW1hIHZhbHVlLCBvdGhlcndpc2UgdGhlIGZpcnN0IHZhbHVlIGlzIHVzZWQgaW4gYm90aCBjYXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW2dhbW1hPTIuMl0gdmFsdWUgYmV0d2VlbiAxLjAgYW5kIDMuMC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZ2FtbWFPdXRdIHZhbHVlIGJldHdlZW4gMS4wIGFuZCAzLjAuIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gc2FtZSBhcyBgZ2FtbWFgKVxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiBnYW1tYSAoZ2FtbWEsIGdhbW1hT3V0KSB7XG4gIGlmICghaXMuZGVmaW5lZChnYW1tYSkpIHtcbiAgICAvLyBEZWZhdWx0IGdhbW1hIGNvcnJlY3Rpb24gb2YgMi4yIChzUkdCKVxuICAgIHRoaXMub3B0aW9ucy5nYW1tYSA9IDIuMjtcbiAgfSBlbHNlIGlmIChpcy5udW1iZXIoZ2FtbWEpICYmIGlzLmluUmFuZ2UoZ2FtbWEsIDEsIDMpKSB7XG4gICAgdGhpcy5vcHRpb25zLmdhbW1hID0gZ2FtbWE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdnYW1tYScsICdudW1iZXIgYmV0d2VlbiAxLjAgYW5kIDMuMCcsIGdhbW1hKTtcbiAgfVxuICBpZiAoIWlzLmRlZmluZWQoZ2FtbWFPdXQpKSB7XG4gICAgLy8gRGVmYXVsdCBnYW1tYSBjb3JyZWN0aW9uIGZvciBvdXRwdXQgaXMgc2FtZSBhcyBpbnB1dFxuICAgIHRoaXMub3B0aW9ucy5nYW1tYU91dCA9IHRoaXMub3B0aW9ucy5nYW1tYTtcbiAgfSBlbHNlIGlmIChpcy5udW1iZXIoZ2FtbWFPdXQpICYmIGlzLmluUmFuZ2UoZ2FtbWFPdXQsIDEsIDMpKSB7XG4gICAgdGhpcy5vcHRpb25zLmdhbW1hT3V0ID0gZ2FtbWFPdXQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdnYW1tYU91dCcsICdudW1iZXIgYmV0d2VlbiAxLjAgYW5kIDMuMCcsIGdhbW1hT3V0KTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBQcm9kdWNlIHRoZSBcIm5lZ2F0aXZlXCIgb2YgdGhlIGltYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm5lZ2F0ZSgpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm5lZ2F0ZSh7IGFscGhhOiBmYWxzZSB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFscGhhPXRydWVdIFdoZXRoZXIgb3Igbm90IHRvIG5lZ2F0ZSBhbnkgYWxwaGEgY2hhbm5lbFxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBuZWdhdGUgKG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zLm5lZ2F0ZSA9IGlzLmJvb2wob3B0aW9ucykgPyBvcHRpb25zIDogdHJ1ZTtcbiAgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvbnMpICYmICdhbHBoYScgaW4gb3B0aW9ucykge1xuICAgIGlmICghaXMuYm9vbChvcHRpb25zLmFscGhhKSkge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhbHBoYScsICdzaG91bGQgYmUgYm9vbGVhbiB2YWx1ZScsIG9wdGlvbnMuYWxwaGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnMubmVnYXRlQWxwaGEgPSBvcHRpb25zLmFscGhhO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBFbmhhbmNlIG91dHB1dCBpbWFnZSBjb250cmFzdCBieSBzdHJldGNoaW5nIGl0cyBsdW1pbmFuY2UgdG8gY292ZXIgYSBmdWxsIGR5bmFtaWMgcmFuZ2UuXG4gKlxuICogVXNlcyBhIGhpc3RvZ3JhbS1iYXNlZCBhcHByb2FjaCwgdGFraW5nIGEgZGVmYXVsdCByYW5nZSBvZiAxJSB0byA5OSUgdG8gcmVkdWNlIHNlbnNpdGl2aXR5IHRvIG5vaXNlIGF0IHRoZSBleHRyZW1lcy5cbiAqXG4gKiBMdW1pbmFuY2UgdmFsdWVzIGJlbG93IHRoZSBgbG93ZXJgIHBlcmNlbnRpbGUgd2lsbCBiZSB1bmRlcmV4cG9zZWQgYnkgY2xpcHBpbmcgdG8gemVyby5cbiAqIEx1bWluYW5jZSB2YWx1ZXMgYWJvdmUgdGhlIGB1cHBlcmAgcGVyY2VudGlsZSB3aWxsIGJlIG92ZXJleHBvc2VkIGJ5IGNsaXBwaW5nIHRvIHRoZSBtYXggcGl4ZWwgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAubm9ybWFsaXNlKClcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAubm9ybWFsaXNlKHsgbG93ZXI6IDAsIHVwcGVyOiAxMDAgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxvd2VyPTFdIC0gUGVyY2VudGlsZSBiZWxvdyB3aGljaCBsdW1pbmFuY2UgdmFsdWVzIHdpbGwgYmUgdW5kZXJleHBvc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnVwcGVyPTk5XSAtIFBlcmNlbnRpbGUgYWJvdmUgd2hpY2ggbHVtaW5hbmNlIHZhbHVlcyB3aWxsIGJlIG92ZXJleHBvc2VkLlxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBub3JtYWxpc2UgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5sb3dlcikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5sb3dlcikgJiYgaXMuaW5SYW5nZShvcHRpb25zLmxvd2VyLCAwLCA5OSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm5vcm1hbGlzZUxvd2VyID0gb3B0aW9ucy5sb3dlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbG93ZXInLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgOTknLCBvcHRpb25zLmxvd2VyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy51cHBlcikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy51cHBlcikgJiYgaXMuaW5SYW5nZShvcHRpb25zLnVwcGVyLCAxLCAxMDApKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5ub3JtYWxpc2VVcHBlciA9IG9wdGlvbnMudXBwZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3VwcGVyJywgJ251bWJlciBiZXR3ZWVuIDEgYW5kIDEwMCcsIG9wdGlvbnMudXBwZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLm5vcm1hbGlzZUxvd2VyID49IHRoaXMub3B0aW9ucy5ub3JtYWxpc2VVcHBlcikge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncmFuZ2UnLCAnbG93ZXIgdG8gYmUgbGVzcyB0aGFuIHVwcGVyJyxcbiAgICAgIGAke3RoaXMub3B0aW9ucy5ub3JtYWxpc2VMb3dlcn0gPj0gJHt0aGlzLm9wdGlvbnMubm9ybWFsaXNlVXBwZXJ9YCk7XG4gIH1cbiAgdGhpcy5vcHRpb25zLm5vcm1hbGlzZSA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEFsdGVybmF0aXZlIHNwZWxsaW5nIG9mIG5vcm1hbGlzZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5ub3JtYWxpemUoKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubG93ZXI9MV0gLSBQZXJjZW50aWxlIGJlbG93IHdoaWNoIGx1bWluYW5jZSB2YWx1ZXMgd2lsbCBiZSB1bmRlcmV4cG9zZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudXBwZXI9OTldIC0gUGVyY2VudGlsZSBhYm92ZSB3aGljaCBsdW1pbmFuY2UgdmFsdWVzIHdpbGwgYmUgb3ZlcmV4cG9zZWQuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZSAob3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5ub3JtYWxpc2Uob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUGVyZm9ybSBjb250cmFzdCBsaW1pdGluZyBhZGFwdGl2ZSBoaXN0b2dyYW0gZXF1YWxpemF0aW9uXG4gKiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWRhcHRpdmVfaGlzdG9ncmFtX2VxdWFsaXphdGlvbiNDb250cmFzdF9MaW1pdGVkX0FIRXxDTEFIRX0uXG4gKlxuICogVGhpcyB3aWxsLCBpbiBnZW5lcmFsLCBlbmhhbmNlIHRoZSBjbGFyaXR5IG9mIHRoZSBpbWFnZSBieSBicmluZ2luZyBvdXQgZGFya2VyIGRldGFpbHMuXG4gKlxuICogQHNpbmNlIDAuMjguM1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmNsYWhlKHtcbiAqICAgICB3aWR0aDogMyxcbiAqICAgICBoZWlnaHQ6IDMsXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy53aWR0aCAtIEludGVncmFsIHdpZHRoIG9mIHRoZSBzZWFyY2ggd2luZG93LCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5oZWlnaHQgLSBJbnRlZ3JhbCBoZWlnaHQgb2YgdGhlIHNlYXJjaCB3aW5kb3csIGluIHBpeGVscy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhTbG9wZT0zXSAtIEludGVncmFsIGxldmVsIG9mIGJyaWdodGVuaW5nLCBiZXR3ZWVuIDAgYW5kIDEwMCwgd2hlcmUgMCBkaXNhYmxlcyBjb250cmFzdCBsaW1pdGluZy5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gY2xhaGUgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy53aWR0aCkgJiYgb3B0aW9ucy53aWR0aCA+IDApIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jbGFoZVdpZHRoID0gb3B0aW9ucy53aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd3aWR0aCcsICdpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvJywgb3B0aW9ucy53aWR0aCk7XG4gICAgfVxuICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMuaGVpZ2h0KSAmJiBvcHRpb25zLmhlaWdodCA+IDApIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jbGFoZUhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2hlaWdodCcsICdpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvJywgb3B0aW9ucy5oZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLm1heFNsb3BlKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5tYXhTbG9wZSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLm1heFNsb3BlLCAwLCAxMDApKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5jbGFoZU1heFNsb3BlID0gb3B0aW9ucy5tYXhTbG9wZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbWF4U2xvcGUnLCAnaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMCcsIG9wdGlvbnMubWF4U2xvcGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMnLCAncGxhaW4gb2JqZWN0Jywgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQ29udm9sdmUgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBrZXJuZWwuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAuY29udm9sdmUoe1xuICogICAgIHdpZHRoOiAzLFxuICogICAgIGhlaWdodDogMyxcbiAqICAgICBrZXJuZWw6IFstMSwgMCwgMSwgLTIsIDAsIDIsIC0xLCAwLCAxXVxuICogICB9KVxuICogICAucmF3KClcbiAqICAgLnRvQnVmZmVyKGZ1bmN0aW9uKGVyciwgZGF0YSwgaW5mbykge1xuICogICAgIC8vIGRhdGEgY29udGFpbnMgdGhlIHJhdyBwaXhlbCBkYXRhIHJlcHJlc2VudGluZyB0aGUgY29udm9sdXRpb25cbiAqICAgICAvLyBvZiB0aGUgaW5wdXQgaW1hZ2Ugd2l0aCB0aGUgaG9yaXpvbnRhbCBTb2JlbCBvcGVyYXRvclxuICogICB9KTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0ga2VybmVsXG4gKiBAcGFyYW0ge251bWJlcn0ga2VybmVsLndpZHRoIC0gd2lkdGggb2YgdGhlIGtlcm5lbCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge251bWJlcn0ga2VybmVsLmhlaWdodCAtIGhlaWdodCBvZiB0aGUga2VybmVsIGluIHBpeGVscy5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0ga2VybmVsLmtlcm5lbCAtIEFycmF5IG9mIGxlbmd0aCBgd2lkdGgqaGVpZ2h0YCBjb250YWluaW5nIHRoZSBrZXJuZWwgdmFsdWVzLlxuICogQHBhcmFtIHtudW1iZXJ9IFtrZXJuZWwuc2NhbGU9c3VtXSAtIHRoZSBzY2FsZSBvZiB0aGUga2VybmVsIGluIHBpeGVscy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBba2VybmVsLm9mZnNldD0wXSAtIHRoZSBvZmZzZXQgb2YgdGhlIGtlcm5lbCBpbiBwaXhlbHMuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIGNvbnZvbHZlIChrZXJuZWwpIHtcbiAgaWYgKCFpcy5vYmplY3Qoa2VybmVsKSB8fCAhQXJyYXkuaXNBcnJheShrZXJuZWwua2VybmVsKSB8fFxuICAgICAgIWlzLmludGVnZXIoa2VybmVsLndpZHRoKSB8fCAhaXMuaW50ZWdlcihrZXJuZWwuaGVpZ2h0KSB8fFxuICAgICAgIWlzLmluUmFuZ2Uoa2VybmVsLndpZHRoLCAzLCAxMDAxKSB8fCAhaXMuaW5SYW5nZShrZXJuZWwuaGVpZ2h0LCAzLCAxMDAxKSB8fFxuICAgICAga2VybmVsLmhlaWdodCAqIGtlcm5lbC53aWR0aCAhPT0ga2VybmVsLmtlcm5lbC5sZW5ndGhcbiAgKSB7XG4gICAgLy8gbXVzdCBwYXNzIGluIGEga2VybmVsXG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnZvbHV0aW9uIGtlcm5lbCcpO1xuICB9XG4gIC8vIERlZmF1bHQgc2NhbGUgaXMgc3VtIG9mIGtlcm5lbCB2YWx1ZXNcbiAgaWYgKCFpcy5pbnRlZ2VyKGtlcm5lbC5zY2FsZSkpIHtcbiAgICBrZXJuZWwuc2NhbGUgPSBrZXJuZWwua2VybmVsLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH0sIDApO1xuICB9XG4gIC8vIENsaXAgc2NhbGUgdG8gYSBtaW5pbXVtIHZhbHVlIG9mIDFcbiAgaWYgKGtlcm5lbC5zY2FsZSA8IDEpIHtcbiAgICBrZXJuZWwuc2NhbGUgPSAxO1xuICB9XG4gIGlmICghaXMuaW50ZWdlcihrZXJuZWwub2Zmc2V0KSkge1xuICAgIGtlcm5lbC5vZmZzZXQgPSAwO1xuICB9XG4gIHRoaXMub3B0aW9ucy5jb252S2VybmVsID0ga2VybmVsO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBBbnkgcGl4ZWwgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB0aHJlc2hvbGQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gMjU1LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBzZXQgdG8gMC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGhyZXNob2xkPTEyOF0gLSBhIHZhbHVlIGluIHRoZSByYW5nZSAwLTI1NSByZXByZXNlbnRpbmcgdGhlIGxldmVsIGF0IHdoaWNoIHRoZSB0aHJlc2hvbGQgd2lsbCBiZSBhcHBsaWVkLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ncmV5c2NhbGU9dHJ1ZV0gLSBjb252ZXJ0IHRvIHNpbmdsZSBjaGFubmVsIGdyZXlzY2FsZS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZ3JheXNjYWxlPXRydWVdIC0gYWx0ZXJuYXRpdmUgc3BlbGxpbmcgZm9yIGdyZXlzY2FsZS5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gdGhyZXNob2xkICh0aHJlc2hvbGQsIG9wdGlvbnMpIHtcbiAgaWYgKCFpcy5kZWZpbmVkKHRocmVzaG9sZCkpIHtcbiAgICB0aGlzLm9wdGlvbnMudGhyZXNob2xkID0gMTI4O1xuICB9IGVsc2UgaWYgKGlzLmJvb2wodGhyZXNob2xkKSkge1xuICAgIHRoaXMub3B0aW9ucy50aHJlc2hvbGQgPSB0aHJlc2hvbGQgPyAxMjggOiAwO1xuICB9IGVsc2UgaWYgKGlzLmludGVnZXIodGhyZXNob2xkKSAmJiBpcy5pblJhbmdlKHRocmVzaG9sZCwgMCwgMjU1KSkge1xuICAgIHRoaXMub3B0aW9ucy50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0aHJlc2hvbGQnLCAnaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NScsIHRocmVzaG9sZCk7XG4gIH1cbiAgaWYgKCFpcy5vYmplY3Qob3B0aW9ucykgfHwgb3B0aW9ucy5ncmV5c2NhbGUgPT09IHRydWUgfHwgb3B0aW9ucy5ncmF5c2NhbGUgPT09IHRydWUpIHtcbiAgICB0aGlzLm9wdGlvbnMudGhyZXNob2xkR3JheXNjYWxlID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm9wdGlvbnMudGhyZXNob2xkR3JheXNjYWxlID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogUGVyZm9ybSBhIGJpdHdpc2UgYm9vbGVhbiBvcGVyYXRpb24gd2l0aCBvcGVyYW5kIGltYWdlLlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGNyZWF0ZXMgYW4gb3V0cHV0IGltYWdlIHdoZXJlIGVhY2ggcGl4ZWwgaXMgdGhlIHJlc3VsdCBvZlxuICogdGhlIHNlbGVjdGVkIGJpdHdpc2UgYm9vbGVhbiBgb3BlcmF0aW9uYCBiZXR3ZWVuIHRoZSBjb3JyZXNwb25kaW5nIHBpeGVscyBvZiB0aGUgaW5wdXQgaW1hZ2VzLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfHN0cmluZ30gb3BlcmFuZCAtIEJ1ZmZlciBjb250YWluaW5nIGltYWdlIGRhdGEgb3Igc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gYW4gaW1hZ2UgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIG9uZSBvZiBgYW5kYCwgYG9yYCBvciBgZW9yYCB0byBwZXJmb3JtIHRoYXQgYml0d2lzZSBvcGVyYXRpb24sIGxpa2UgdGhlIEMgbG9naWMgb3BlcmF0b3JzIGAmYCwgYHxgIGFuZCBgXmAgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJhd10gLSBkZXNjcmliZXMgb3BlcmFuZCB3aGVuIHVzaW5nIHJhdyBwaXhlbCBkYXRhLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJhdy53aWR0aF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5yYXcuaGVpZ2h0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJhdy5jaGFubmVsc11cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gYm9vbGVhbiAob3BlcmFuZCwgb3BlcmF0b3IsIG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zLmJvb2xlYW4gPSB0aGlzLl9jcmVhdGVJbnB1dERlc2NyaXB0b3Iob3BlcmFuZCwgb3B0aW9ucyk7XG4gIGlmIChpcy5zdHJpbmcob3BlcmF0b3IpICYmIGlzLmluQXJyYXkob3BlcmF0b3IsIFsnYW5kJywgJ29yJywgJ2VvciddKSkge1xuICAgIHRoaXMub3B0aW9ucy5ib29sZWFuT3AgPSBvcGVyYXRvcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wZXJhdG9yJywgJ29uZSBvZjogYW5kLCBvciwgZW9yJywgb3BlcmF0b3IpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEFwcGx5IHRoZSBsaW5lYXIgZm9ybXVsYSBgYWAgKiBpbnB1dCArIGBiYCB0byB0aGUgaW1hZ2UgdG8gYWRqdXN0IGltYWdlIGxldmVscy5cbiAqXG4gKiBXaGVuIGEgc2luZ2xlIG51bWJlciBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgaW1hZ2UgY2hhbm5lbHMuXG4gKiBXaGVuIGFuIGFycmF5IG9mIG51bWJlcnMgaXMgcHJvdmlkZWQsIHRoZSBhcnJheSBsZW5ndGggbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmxpbmVhcigwLjUsIDIpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBzaGFycChyZ2JJbnB1dClcbiAqICAgLmxpbmVhcihcbiAqICAgICBbMC4yNSwgMC41LCAwLjc1XSxcbiAqICAgICBbMTUwLCAxMDAsIDUwXVxuICogICApXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7KG51bWJlcnxudW1iZXJbXSl9IFthPVtdXSBtdWx0aXBsaWVyXG4gKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBbYj1bXV0gb2Zmc2V0XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIGxpbmVhciAoYSwgYikge1xuICBpZiAoIWlzLmRlZmluZWQoYSkgJiYgaXMubnVtYmVyKGIpKSB7XG4gICAgYSA9IDEuMDtcbiAgfSBlbHNlIGlmIChpcy5udW1iZXIoYSkgJiYgIWlzLmRlZmluZWQoYikpIHtcbiAgICBiID0gMC4wO1xuICB9XG4gIGlmICghaXMuZGVmaW5lZChhKSkge1xuICAgIHRoaXMub3B0aW9ucy5saW5lYXJBID0gW107XG4gIH0gZWxzZSBpZiAoaXMubnVtYmVyKGEpKSB7XG4gICAgdGhpcy5vcHRpb25zLmxpbmVhckEgPSBbYV07XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBhLmxlbmd0aCAmJiBhLmV2ZXJ5KGlzLm51bWJlcikpIHtcbiAgICB0aGlzLm9wdGlvbnMubGluZWFyQSA9IGE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhJywgJ251bWJlciBvciBhcnJheSBvZiBudW1iZXJzJywgYSk7XG4gIH1cbiAgaWYgKCFpcy5kZWZpbmVkKGIpKSB7XG4gICAgdGhpcy5vcHRpb25zLmxpbmVhckIgPSBbXTtcbiAgfSBlbHNlIGlmIChpcy5udW1iZXIoYikpIHtcbiAgICB0aGlzLm9wdGlvbnMubGluZWFyQiA9IFtiXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGIpICYmIGIubGVuZ3RoICYmIGIuZXZlcnkoaXMubnVtYmVyKSkge1xuICAgIHRoaXMub3B0aW9ucy5saW5lYXJCID0gYjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2InLCAnbnVtYmVyIG9yIGFycmF5IG9mIG51bWJlcnMnLCBiKTtcbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLmxpbmVhckEubGVuZ3RoICE9PSB0aGlzLm9wdGlvbnMubGluZWFyQi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgYW5kIGIgdG8gYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFJlY29tYmluZSB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG1hdHJpeC5cbiAqXG4gKiBAc2luY2UgMC4yMS4xXG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAucmVjb21iKFtcbiAqICAgIFswLjM1ODgsIDAuNzA0NCwgMC4xMzY4XSxcbiAqICAgIFswLjI5OTAsIDAuNTg3MCwgMC4xMTQwXSxcbiAqICAgIFswLjIzOTIsIDAuNDY5NiwgMC4wOTEyXSxcbiAqICAgXSlcbiAqICAgLnJhdygpXG4gKiAgIC50b0J1ZmZlcihmdW5jdGlvbihlcnIsIGRhdGEsIGluZm8pIHtcbiAqICAgICAvLyBkYXRhIGNvbnRhaW5zIHRoZSByYXcgcGl4ZWwgZGF0YSBhZnRlciBhcHBseWluZyB0aGUgbWF0cml4XG4gKiAgICAgLy8gV2l0aCB0aGlzIGV4YW1wbGUgaW5wdXQsIGEgc2VwaWEgZmlsdGVyIGhhcyBiZWVuIGFwcGxpZWRcbiAqICAgfSk7XG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gaW5wdXRNYXRyaXggLSAzeDMgb3IgNHg0IFJlY29tYmluYXRpb24gbWF0cml4XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlY29tYiAoaW5wdXRNYXRyaXgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0TWF0cml4KSkge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignaW5wdXRNYXRyaXgnLCAnYXJyYXknLCBpbnB1dE1hdHJpeCk7XG4gIH1cbiAgaWYgKGlucHV0TWF0cml4Lmxlbmd0aCAhPT0gMyAmJiBpbnB1dE1hdHJpeC5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2lucHV0TWF0cml4JywgJzN4MyBvciA0eDQgYXJyYXknLCBpbnB1dE1hdHJpeC5sZW5ndGgpO1xuICB9XG4gIGNvbnN0IHJlY29tYk1hdHJpeCA9IGlucHV0TWF0cml4LmZsYXQoKS5tYXAoTnVtYmVyKTtcbiAgaWYgKHJlY29tYk1hdHJpeC5sZW5ndGggIT09IDkgJiYgcmVjb21iTWF0cml4Lmxlbmd0aCAhPT0gMTYpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2lucHV0TWF0cml4JywgJ2NhcmRpbmFsaXR5IG9mIDkgb3IgMTYnLCByZWNvbWJNYXRyaXgubGVuZ3RoKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMucmVjb21iTWF0cml4ID0gcmVjb21iTWF0cml4O1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBpbWFnZSB1c2luZyBicmlnaHRuZXNzLCBzYXR1cmF0aW9uLCBodWUgcm90YXRpb24sIGFuZCBsaWdodG5lc3MuXG4gKiBCcmlnaHRuZXNzIGFuZCBsaWdodG5lc3MgYm90aCBvcGVyYXRlIG9uIGx1bWluYW5jZSwgd2l0aCB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0XG4gKiBicmlnaHRuZXNzIGlzIG11bHRpcGxpY2F0aXZlIHdoZXJlYXMgbGlnaHRuZXNzIGlzIGFkZGl0aXZlLlxuICpcbiAqIEBzaW5jZSAwLjIyLjFcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gaW5jcmVhc2UgYnJpZ2h0bmVzcyBieSBhIGZhY3RvciBvZiAyXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm1vZHVsYXRlKHtcbiAqICAgICBicmlnaHRuZXNzOiAyXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBodWUtcm90YXRlIGJ5IDE4MCBkZWdyZWVzXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm1vZHVsYXRlKHtcbiAqICAgICBodWU6IDE4MFxuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gaW5jcmVhc2UgbGlnaHRuZXNzIGJ5ICs1MFxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5tb2R1bGF0ZSh7XG4gKiAgICAgbGlnaHRuZXNzOiA1MFxuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gZGVjcmVhc2UgYnJpZ2h0bmVzcyBhbmQgc2F0dXJhdGlvbiB3aGlsZSBhbHNvIGh1ZS1yb3RhdGluZyBieSA5MCBkZWdyZWVzXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm1vZHVsYXRlKHtcbiAqICAgICBicmlnaHRuZXNzOiAwLjUsXG4gKiAgICAgc2F0dXJhdGlvbjogMC41LFxuICogICAgIGh1ZTogOTAsXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5icmlnaHRuZXNzXSBCcmlnaHRuZXNzIG11bHRpcGxpZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zYXR1cmF0aW9uXSBTYXR1cmF0aW9uIG11bHRpcGxpZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5odWVdIERlZ3JlZXMgZm9yIGh1ZSByb3RhdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxpZ2h0bmVzc10gTGlnaHRuZXNzIGFkZGVuZFxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBtb2R1bGF0ZSAob3B0aW9ucykge1xuICBpZiAoIWlzLnBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zJywgJ3BsYWluIG9iamVjdCcsIG9wdGlvbnMpO1xuICB9XG4gIGlmICgnYnJpZ2h0bmVzcycgaW4gb3B0aW9ucykge1xuICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5icmlnaHRuZXNzKSAmJiBvcHRpb25zLmJyaWdodG5lc3MgPj0gMCkge1xuICAgICAgdGhpcy5vcHRpb25zLmJyaWdodG5lc3MgPSBvcHRpb25zLmJyaWdodG5lc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignYnJpZ2h0bmVzcycsICdudW1iZXIgYWJvdmUgemVybycsIG9wdGlvbnMuYnJpZ2h0bmVzcyk7XG4gICAgfVxuICB9XG4gIGlmICgnc2F0dXJhdGlvbicgaW4gb3B0aW9ucykge1xuICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5zYXR1cmF0aW9uKSAmJiBvcHRpb25zLnNhdHVyYXRpb24gPj0gMCkge1xuICAgICAgdGhpcy5vcHRpb25zLnNhdHVyYXRpb24gPSBvcHRpb25zLnNhdHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignc2F0dXJhdGlvbicsICdudW1iZXIgYWJvdmUgemVybycsIG9wdGlvbnMuc2F0dXJhdGlvbik7XG4gICAgfVxuICB9XG4gIGlmICgnaHVlJyBpbiBvcHRpb25zKSB7XG4gICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5odWUpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaHVlID0gb3B0aW9ucy5odWUgJSAzNjA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignaHVlJywgJ251bWJlcicsIG9wdGlvbnMuaHVlKTtcbiAgICB9XG4gIH1cbiAgaWYgKCdsaWdodG5lc3MnIGluIG9wdGlvbnMpIHtcbiAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMubGlnaHRuZXNzKSkge1xuICAgICAgdGhpcy5vcHRpb25zLmxpZ2h0bmVzcyA9IG9wdGlvbnMubGlnaHRuZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2xpZ2h0bmVzcycsICdudW1iZXInLCBvcHRpb25zLmxpZ2h0bmVzcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIERlY29yYXRlIHRoZSBTaGFycCBwcm90b3R5cGUgd2l0aCBvcGVyYXRpb24tcmVsYXRlZCBmdW5jdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTaGFycCkge1xuICBPYmplY3QuYXNzaWduKFNoYXJwLnByb3RvdHlwZSwge1xuICAgIHJvdGF0ZSxcbiAgICBmbGlwLFxuICAgIGZsb3AsXG4gICAgYWZmaW5lLFxuICAgIHNoYXJwZW4sXG4gICAgbWVkaWFuLFxuICAgIGJsdXIsXG4gICAgZmxhdHRlbixcbiAgICB1bmZsYXR0ZW4sXG4gICAgZ2FtbWEsXG4gICAgbmVnYXRlLFxuICAgIG5vcm1hbGlzZSxcbiAgICBub3JtYWxpemUsXG4gICAgY2xhaGUsXG4gICAgY29udm9sdmUsXG4gICAgdGhyZXNob2xkLFxuICAgIGJvb2xlYW4sXG4gICAgbGluZWFyLFxuICAgIHJlY29tYixcbiAgICBtb2R1bGF0ZVxuICB9KTtcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29sb3IgPSByZXF1aXJlKCdjb2xvcicpO1xuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5cbi8qKlxuICogQ29sb3Vyc3BhY2VzLlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgY29sb3Vyc3BhY2UgPSB7XG4gIG11bHRpYmFuZDogJ211bHRpYmFuZCcsXG4gICdiLXcnOiAnYi13JyxcbiAgYnc6ICdiLXcnLFxuICBjbXlrOiAnY215aycsXG4gIHNyZ2I6ICdzcmdiJ1xufTtcblxuLyoqXG4gKiBUaW50IHRoZSBpbWFnZSB1c2luZyB0aGUgcHJvdmlkZWQgY29sb3VyLlxuICogQW4gYWxwaGEgY2hhbm5lbCBtYXkgYmUgcHJlc2VudCBhbmQgd2lsbCBiZSB1bmNoYW5nZWQgYnkgdGhlIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC50aW50KHsgcjogMjU1LCBnOiAyNDAsIGI6IDE2IH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gdGludCAtIFBhcnNlZCBieSB0aGUgW2NvbG9yXShodHRwczovL3d3dy5ucG1qcy5vcmcvcGFja2FnZS9jb2xvcikgbW9kdWxlLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyXG4gKi9cbmZ1bmN0aW9uIHRpbnQgKHRpbnQpIHtcbiAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG91ck9wdGlvbigndGludCcsIHRpbnQpO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHRvIDgtYml0IGdyZXlzY2FsZTsgMjU2IHNoYWRlcyBvZiBncmV5LlxuICogVGhpcyBpcyBhIGxpbmVhciBvcGVyYXRpb24uIElmIHRoZSBpbnB1dCBpbWFnZSBpcyBpbiBhIG5vbi1saW5lYXIgY29sb3VyIHNwYWNlIHN1Y2ggYXMgc1JHQiwgdXNlIGBnYW1tYSgpYCB3aXRoIGBncmV5c2NhbGUoKWAgZm9yIHRoZSBiZXN0IHJlc3VsdHMuXG4gKiBCeSBkZWZhdWx0IHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSB3ZWItZnJpZW5kbHkgc1JHQiBhbmQgY29udGFpbiB0aHJlZSAoaWRlbnRpY2FsKSBjb2xvciBjaGFubmVscy5cbiAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgb3RoZXIgc2hhcnAgb3BlcmF0aW9ucyBzdWNoIGFzIGB0b0NvbG91cnNwYWNlKCdiLXcnKWAsXG4gKiB3aGljaCB3aWxsIHByb2R1Y2UgYW4gb3V0cHV0IGltYWdlIGNvbnRhaW5pbmcgb25lIGNvbG9yIGNoYW5uZWwuXG4gKiBBbiBhbHBoYSBjaGFubmVsIG1heSBiZSBwcmVzZW50LCBhbmQgd2lsbCBiZSB1bmNoYW5nZWQgYnkgdGhlIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpLmdyZXlzY2FsZSgpLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbZ3JleXNjYWxlPXRydWVdXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIGdyZXlzY2FsZSAoZ3JleXNjYWxlKSB7XG4gIHRoaXMub3B0aW9ucy5ncmV5c2NhbGUgPSBpcy5ib29sKGdyZXlzY2FsZSkgPyBncmV5c2NhbGUgOiB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBgZ3JleXNjYWxlYC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2dyYXlzY2FsZT10cnVlXVxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBncmF5c2NhbGUgKGdyYXlzY2FsZSkge1xuICByZXR1cm4gdGhpcy5ncmV5c2NhbGUoZ3JheXNjYWxlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHBpcGVsaW5lIGNvbG91cnNwYWNlLlxuICpcbiAqIFRoZSBpbnB1dCBpbWFnZSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgcHJvdmlkZWQgY29sb3Vyc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwaXBlbGluZS5cbiAqIEFsbCBvcGVyYXRpb25zIHdpbGwgdXNlIHRoaXMgY29sb3Vyc3BhY2UgYmVmb3JlIGNvbnZlcnRpbmcgdG8gdGhlIG91dHB1dCBjb2xvdXJzcGFjZSxcbiAqIGFzIGRlZmluZWQgYnkge0BsaW5rICN0b2NvbG91cnNwYWNlfHRvQ29sb3Vyc3BhY2V9LlxuICpcbiAqIEBzaW5jZSAwLjI5LjBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUnVuIHBpcGVsaW5lIGluIDE2IGJpdHMgcGVyIGNoYW5uZWwgUkdCIHdoaWxlIGNvbnZlcnRpbmcgZmluYWwgcmVzdWx0IHRvIDggYml0cyBwZXIgY2hhbm5lbCBzUkdCLlxuICogYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgLnBpcGVsaW5lQ29sb3Vyc3BhY2UoJ3JnYjE2JylcbiAqICAudG9Db2xvdXJzcGFjZSgnc3JnYicpXG4gKiAgLnRvRmlsZSgnMTZicGMtcGlwZWxpbmUtdG8tOGJwYy1vdXRwdXQucG5nJylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbG91cnNwYWNlXSAtIHBpcGVsaW5lIGNvbG91cnNwYWNlIGUuZy4gYHJnYjE2YCwgYHNjcmdiYCwgYGxhYmAsIGBncmV5MTZgIFsuLi5dKGh0dHBzOi8vZ2l0aHViLmNvbS9saWJ2aXBzL2xpYnZpcHMvYmxvYi80MWNmZjRlOWQwODM4NDk4NDg3YTAwNjIzNDYyMjA0ZWIxMGVlNWI4L2xpYnZpcHMvaW9mdW5jcy9lbnVtdHlwZXMuYyNMNzc0KVxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiBwaXBlbGluZUNvbG91cnNwYWNlIChjb2xvdXJzcGFjZSkge1xuICBpZiAoIWlzLnN0cmluZyhjb2xvdXJzcGFjZSkpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbG91cnNwYWNlJywgJ3N0cmluZycsIGNvbG91cnNwYWNlKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMuY29sb3Vyc3BhY2VQaXBlbGluZSA9IGNvbG91cnNwYWNlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBgcGlwZWxpbmVDb2xvdXJzcGFjZWAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yc3BhY2VdIC0gcGlwZWxpbmUgY29sb3JzcGFjZS5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gcGlwZWxpbmVDb2xvcnNwYWNlIChjb2xvcnNwYWNlKSB7XG4gIHJldHVybiB0aGlzLnBpcGVsaW5lQ29sb3Vyc3BhY2UoY29sb3JzcGFjZSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBvdXRwdXQgY29sb3Vyc3BhY2UuXG4gKiBCeSBkZWZhdWx0IG91dHB1dCBpbWFnZSB3aWxsIGJlIHdlYi1mcmllbmRseSBzUkdCLCB3aXRoIGFkZGl0aW9uYWwgY2hhbm5lbHMgaW50ZXJwcmV0ZWQgYXMgYWxwaGEgY2hhbm5lbHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE91dHB1dCAxNiBiaXRzIHBlciBwaXhlbCBSR0JcbiAqIGF3YWl0IHNoYXJwKGlucHV0KVxuICogIC50b0NvbG91cnNwYWNlKCdyZ2IxNicpXG4gKiAgLnRvRmlsZSgnMTYtYnBwLnBuZycpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvdXJzcGFjZV0gLSBvdXRwdXQgY29sb3Vyc3BhY2UgZS5nLiBgc3JnYmAsIGByZ2JgLCBgY215a2AsIGBsYWJgLCBgYi13YCBbLi4uXShodHRwczovL2dpdGh1Yi5jb20vbGlidmlwcy9saWJ2aXBzL2Jsb2IvM2MwYmZkZjc0Y2UxZGMzN2E2NDI5YmVkNDdmYTc2ZjE2ZTJjZDcwYS9saWJ2aXBzL2lvZnVuY3MvZW51bXR5cGVzLmMjTDc3Ny1MNzk0KVxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiB0b0NvbG91cnNwYWNlIChjb2xvdXJzcGFjZSkge1xuICBpZiAoIWlzLnN0cmluZyhjb2xvdXJzcGFjZSkpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbG91cnNwYWNlJywgJ3N0cmluZycsIGNvbG91cnNwYWNlKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMuY29sb3Vyc3BhY2UgPSBjb2xvdXJzcGFjZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgc3BlbGxpbmcgb2YgYHRvQ29sb3Vyc3BhY2VgLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcnNwYWNlXSAtIG91dHB1dCBjb2xvcnNwYWNlLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiB0b0NvbG9yc3BhY2UgKGNvbG9yc3BhY2UpIHtcbiAgcmV0dXJuIHRoaXMudG9Db2xvdXJzcGFjZShjb2xvcnNwYWNlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYSBjb2xvdXIgYXR0cmlidXRlIG9mIHRoZSB0aGlzLm9wdGlvbnMgT2JqZWN0LlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gdmFsdWVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIF9zZXRCYWNrZ3JvdW5kQ29sb3VyT3B0aW9uIChrZXksIHZhbHVlKSB7XG4gIGlmIChpcy5kZWZpbmVkKHZhbHVlKSkge1xuICAgIGlmIChpcy5vYmplY3QodmFsdWUpIHx8IGlzLnN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGNvbG91ciA9IGNvbG9yKHZhbHVlKTtcbiAgICAgIHRoaXMub3B0aW9uc1trZXldID0gW1xuICAgICAgICBjb2xvdXIucmVkKCksXG4gICAgICAgIGNvbG91ci5ncmVlbigpLFxuICAgICAgICBjb2xvdXIuYmx1ZSgpLFxuICAgICAgICBNYXRoLnJvdW5kKGNvbG91ci5hbHBoYSgpICogMjU1KVxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdiYWNrZ3JvdW5kJywgJ29iamVjdCBvciBzdHJpbmcnLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGVjb3JhdGUgdGhlIFNoYXJwIHByb3RvdHlwZSB3aXRoIGNvbG91ci1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFNoYXJwKSB7XG4gIE9iamVjdC5hc3NpZ24oU2hhcnAucHJvdG90eXBlLCB7XG4gICAgLy8gUHVibGljXG4gICAgdGludCxcbiAgICBncmV5c2NhbGUsXG4gICAgZ3JheXNjYWxlLFxuICAgIHBpcGVsaW5lQ29sb3Vyc3BhY2UsXG4gICAgcGlwZWxpbmVDb2xvcnNwYWNlLFxuICAgIHRvQ29sb3Vyc3BhY2UsXG4gICAgdG9Db2xvcnNwYWNlLFxuICAgIC8vIFByaXZhdGVcbiAgICBfc2V0QmFja2dyb3VuZENvbG91ck9wdGlvblxuICB9KTtcbiAgLy8gQ2xhc3MgYXR0cmlidXRlc1xuICBTaGFycC5jb2xvdXJzcGFjZSA9IGNvbG91cnNwYWNlO1xuICBTaGFycC5jb2xvcnNwYWNlID0gY29sb3Vyc3BhY2U7XG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzID0gcmVxdWlyZSgnLi9pcycpO1xuXG4vKipcbiAqIEJvb2xlYW4gb3BlcmF0aW9ucyBmb3IgYmFuZGJvb2wuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBib29sID0ge1xuICBhbmQ6ICdhbmQnLFxuICBvcjogJ29yJyxcbiAgZW9yOiAnZW9yJ1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYWxwaGEgY2hhbm5lbCwgaWYgYW55LiBUaGlzIGlzIGEgbm8tb3AgaWYgdGhlIGltYWdlIGRvZXMgbm90IGhhdmUgYW4gYWxwaGEgY2hhbm5lbC5cbiAqXG4gKiBTZWUgYWxzbyB7QGxpbmsgL2FwaS1vcGVyYXRpb24jZmxhdHRlbnxmbGF0dGVufS5cbiAqXG4gKiBAZXhhbXBsZVxuICogc2hhcnAoJ3JnYmEucG5nJylcbiAqICAgLnJlbW92ZUFscGhhKClcbiAqICAgLnRvRmlsZSgncmdiLnBuZycsIGZ1bmN0aW9uKGVyciwgaW5mbykge1xuICogICAgIC8vIHJnYi5wbmcgaXMgYSAzIGNoYW5uZWwgaW1hZ2Ugd2l0aG91dCBhbiBhbHBoYSBjaGFubmVsXG4gKiAgIH0pO1xuICpcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQWxwaGEgKCkge1xuICB0aGlzLm9wdGlvbnMucmVtb3ZlQWxwaGEgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhlIG91dHB1dCBpbWFnZSBoYXMgYW4gYWxwaGEgdHJhbnNwYXJlbmN5IGNoYW5uZWwuXG4gKiBJZiBtaXNzaW5nLCB0aGUgYWRkZWQgYWxwaGEgY2hhbm5lbCB3aWxsIGhhdmUgdGhlIHNwZWNpZmllZFxuICogdHJhbnNwYXJlbmN5IGxldmVsLCBkZWZhdWx0aW5nIHRvIGZ1bGx5LW9wYXF1ZSAoMSkuXG4gKiBUaGlzIGlzIGEgbm8tb3AgaWYgdGhlIGltYWdlIGFscmVhZHkgaGFzIGFuIGFscGhhIGNoYW5uZWwuXG4gKlxuICogQHNpbmNlIDAuMjEuMlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyByZ2JhLnBuZyB3aWxsIGJlIGEgNCBjaGFubmVsIGltYWdlIHdpdGggYSBmdWxseS1vcGFxdWUgYWxwaGEgY2hhbm5lbFxuICogYXdhaXQgc2hhcnAoJ3JnYi5qcGcnKVxuICogICAuZW5zdXJlQWxwaGEoKVxuICogICAudG9GaWxlKCdyZ2JhLnBuZycpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIHJnYmEgaXMgYSA0IGNoYW5uZWwgaW1hZ2Ugd2l0aCBhIGZ1bGx5LXRyYW5zcGFyZW50IGFscGhhIGNoYW5uZWxcbiAqIGNvbnN0IHJnYmEgPSBhd2FpdCBzaGFycChyZ2IpXG4gKiAgIC5lbnN1cmVBbHBoYSgwKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gYWxwaGEgdHJhbnNwYXJlbmN5IGxldmVsICgwPWZ1bGx5LXRyYW5zcGFyZW50LCAxPWZ1bGx5LW9wYXF1ZSlcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIGFscGhhIHRyYW5zcGFyZW5jeSBsZXZlbFxuICovXG5mdW5jdGlvbiBlbnN1cmVBbHBoYSAoYWxwaGEpIHtcbiAgaWYgKGlzLmRlZmluZWQoYWxwaGEpKSB7XG4gICAgaWYgKGlzLm51bWJlcihhbHBoYSkgJiYgaXMuaW5SYW5nZShhbHBoYSwgMCwgMSkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5lbnN1cmVBbHBoYSA9IGFscGhhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2FscGhhJywgJ251bWJlciBiZXR3ZWVuIDAgYW5kIDEnLCBhbHBoYSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMub3B0aW9ucy5lbnN1cmVBbHBoYSA9IDE7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogRXh0cmFjdCBhIHNpbmdsZSBjaGFubmVsIGZyb20gYSBtdWx0aS1jaGFubmVsIGltYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBncmVlbi5qcGcgaXMgYSBncmV5c2NhbGUgaW1hZ2UgY29udGFpbmluZyB0aGUgZ3JlZW4gY2hhbm5lbCBvZiB0aGUgaW5wdXRcbiAqIGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuZXh0cmFjdENoYW5uZWwoJ2dyZWVuJylcbiAqICAgLnRvRmlsZSgnZ3JlZW4uanBnJyk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIHJlZDEgaXMgdGhlIHJlZCB2YWx1ZSBvZiB0aGUgZmlyc3QgcGl4ZWwsIHJlZDIgdGhlIHNlY29uZCBwaXhlbCBldGMuXG4gKiBjb25zdCBbcmVkMSwgcmVkMiwgLi4uXSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuZXh0cmFjdENoYW5uZWwoMClcbiAqICAgLnJhdygpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gY2hhbm5lbCAtIHplcm8taW5kZXhlZCBjaGFubmVsL2JhbmQgbnVtYmVyIHRvIGV4dHJhY3QsIG9yIGByZWRgLCBgZ3JlZW5gLCBgYmx1ZWAgb3IgYGFscGhhYC5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIGNoYW5uZWxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENoYW5uZWwgKGNoYW5uZWwpIHtcbiAgY29uc3QgY2hhbm5lbE1hcCA9IHsgcmVkOiAwLCBncmVlbjogMSwgYmx1ZTogMiwgYWxwaGE6IDMgfTtcbiAgaWYgKE9iamVjdC5rZXlzKGNoYW5uZWxNYXApLmluY2x1ZGVzKGNoYW5uZWwpKSB7XG4gICAgY2hhbm5lbCA9IGNoYW5uZWxNYXBbY2hhbm5lbF07XG4gIH1cbiAgaWYgKGlzLmludGVnZXIoY2hhbm5lbCkgJiYgaXMuaW5SYW5nZShjaGFubmVsLCAwLCA0KSkge1xuICAgIHRoaXMub3B0aW9ucy5leHRyYWN0Q2hhbm5lbCA9IGNoYW5uZWw7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdjaGFubmVsJywgJ2ludGVnZXIgb3Igb25lIG9mOiByZWQsIGdyZWVuLCBibHVlLCBhbHBoYScsIGNoYW5uZWwpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEpvaW4gb25lIG9yIG1vcmUgY2hhbm5lbHMgdG8gdGhlIGltYWdlLlxuICogVGhlIG1lYW5pbmcgb2YgdGhlIGFkZGVkIGNoYW5uZWxzIGRlcGVuZHMgb24gdGhlIG91dHB1dCBjb2xvdXJzcGFjZSwgc2V0IHdpdGggYHRvQ29sb3Vyc3BhY2UoKWAuXG4gKiBCeSBkZWZhdWx0IHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSB3ZWItZnJpZW5kbHkgc1JHQiwgd2l0aCBhZGRpdGlvbmFsIGNoYW5uZWxzIGludGVycHJldGVkIGFzIGFscGhhIGNoYW5uZWxzLlxuICogQ2hhbm5lbCBvcmRlcmluZyBmb2xsb3dzIHZpcHMgY29udmVudGlvbjpcbiAqIC0gc1JHQjogMDogUmVkLCAxOiBHcmVlbiwgMjogQmx1ZSwgMzogQWxwaGEuXG4gKiAtIENNWUs6IDA6IE1hZ2VudGEsIDE6IEN5YW4sIDI6IFllbGxvdywgMzogQmxhY2ssIDQ6IEFscGhhLlxuICpcbiAqIEJ1ZmZlcnMgbWF5IGJlIGFueSBvZiB0aGUgaW1hZ2UgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgc2hhcnAuXG4gKiBGb3IgcmF3IHBpeGVsIGlucHV0LCB0aGUgYG9wdGlvbnNgIG9iamVjdCBzaG91bGQgY29udGFpbiBhIGByYXdgIGF0dHJpYnV0ZSwgd2hpY2ggZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgYHNoYXJwKClgIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfEJ1ZmZlcj58c3RyaW5nfEJ1ZmZlcn0gaW1hZ2VzIC0gb25lIG9yIG1vcmUgaW1hZ2VzIChmaWxlIHBhdGhzLCBCdWZmZXJzKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gaW1hZ2Ugb3B0aW9ucywgc2VlIGBzaGFycCgpYCBjb25zdHJ1Y3Rvci5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gam9pbkNoYW5uZWwgKGltYWdlcywgb3B0aW9ucykge1xuICBpZiAoQXJyYXkuaXNBcnJheShpbWFnZXMpKSB7XG4gICAgaW1hZ2VzLmZvckVhY2goZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuam9pbkNoYW5uZWxJbi5wdXNoKHRoaXMuX2NyZWF0ZUlucHV0RGVzY3JpcHRvcihpbWFnZSwgb3B0aW9ucykpO1xuICAgIH0sIHRoaXMpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMub3B0aW9ucy5qb2luQ2hhbm5lbEluLnB1c2godGhpcy5fY3JlYXRlSW5wdXREZXNjcmlwdG9yKGltYWdlcywgb3B0aW9ucykpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFBlcmZvcm0gYSBiaXR3aXNlIGJvb2xlYW4gb3BlcmF0aW9uIG9uIGFsbCBpbnB1dCBpbWFnZSBjaGFubmVscyAoYmFuZHMpIHRvIHByb2R1Y2UgYSBzaW5nbGUgY2hhbm5lbCBvdXRwdXQgaW1hZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKCczLWNoYW5uZWwtcmdiLWlucHV0LnBuZycpXG4gKiAgIC5iYW5kYm9vbChzaGFycC5ib29sLmFuZClcbiAqICAgLnRvRmlsZSgnMS1jaGFubmVsLW91dHB1dC5wbmcnLCBmdW5jdGlvbiAoZXJyLCBpbmZvKSB7XG4gKiAgICAgLy8gVGhlIG91dHB1dCB3aWxsIGJlIGEgc2luZ2xlIGNoYW5uZWwgaW1hZ2Ugd2hlcmUgZWFjaCBwaXhlbCBgUCA9IFIgJiBHICYgQmAuXG4gKiAgICAgLy8gSWYgYEkoMSwxKSA9IFsyNDcsIDE3MCwgMTRdID0gWzBiMTExMTAxMTEsIDBiMTAxMDEwMTAsIDBiMDAwMDExMTFdYFxuICogICAgIC8vIHRoZW4gYE8oMSwxKSA9IDBiMTExMTAxMTEgJiAwYjEwMTAxMDEwICYgMGIwMDAwMTExMSA9IDBiMDAwMDAwMTAgPSAyYC5cbiAqICAgfSk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJvb2xPcCAtIG9uZSBvZiBgYW5kYCwgYG9yYCBvciBgZW9yYCB0byBwZXJmb3JtIHRoYXQgYml0d2lzZSBvcGVyYXRpb24sIGxpa2UgdGhlIEMgbG9naWMgb3BlcmF0b3JzIGAmYCwgYHxgIGFuZCBgXmAgcmVzcGVjdGl2ZWx5LlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiBiYW5kYm9vbCAoYm9vbE9wKSB7XG4gIGlmIChpcy5zdHJpbmcoYm9vbE9wKSAmJiBpcy5pbkFycmF5KGJvb2xPcCwgWydhbmQnLCAnb3InLCAnZW9yJ10pKSB7XG4gICAgdGhpcy5vcHRpb25zLmJhbmRCb29sT3AgPSBib29sT3A7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdib29sT3AnLCAnb25lIG9mOiBhbmQsIG9yLCBlb3InLCBib29sT3ApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIERlY29yYXRlIHRoZSBTaGFycCBwcm90b3R5cGUgd2l0aCBjaGFubmVsLXJlbGF0ZWQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoU2hhcnApIHtcbiAgT2JqZWN0LmFzc2lnbihTaGFycC5wcm90b3R5cGUsIHtcbiAgICAvLyBQdWJsaWMgaW5zdGFuY2UgZnVuY3Rpb25zXG4gICAgcmVtb3ZlQWxwaGEsXG4gICAgZW5zdXJlQWxwaGEsXG4gICAgZXh0cmFjdENoYW5uZWwsXG4gICAgam9pbkNoYW5uZWwsXG4gICAgYmFuZGJvb2xcbiAgfSk7XG4gIC8vIENsYXNzIGF0dHJpYnV0ZXNcbiAgU2hhcnAuYm9vbCA9IGJvb2w7XG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcbmNvbnN0IGlzID0gcmVxdWlyZSgnLi9pcycpO1xuY29uc3Qgc2hhcnAgPSByZXF1aXJlKCcuL3NoYXJwJyk7XG5cbmNvbnN0IGZvcm1hdHMgPSBuZXcgTWFwKFtcbiAgWydoZWljJywgJ2hlaWYnXSxcbiAgWydoZWlmJywgJ2hlaWYnXSxcbiAgWydhdmlmJywgJ2F2aWYnXSxcbiAgWydqcGVnJywgJ2pwZWcnXSxcbiAgWydqcGcnLCAnanBlZyddLFxuICBbJ2pwZScsICdqcGVnJ10sXG4gIFsndGlsZScsICd0aWxlJ10sXG4gIFsnZHonLCAndGlsZSddLFxuICBbJ3BuZycsICdwbmcnXSxcbiAgWydyYXcnLCAncmF3J10sXG4gIFsndGlmZicsICd0aWZmJ10sXG4gIFsndGlmJywgJ3RpZmYnXSxcbiAgWyd3ZWJwJywgJ3dlYnAnXSxcbiAgWydnaWYnLCAnZ2lmJ10sXG4gIFsnanAyJywgJ2pwMiddLFxuICBbJ2pweCcsICdqcDInXSxcbiAgWydqMmsnLCAnanAyJ10sXG4gIFsnajJjJywgJ2pwMiddLFxuICBbJ2p4bCcsICdqeGwnXVxuXSk7XG5cbmNvbnN0IGpwMlJlZ2V4ID0gL1xcLihqcFsyeF18ajJba2NdKSQvaTtcblxuY29uc3QgZXJySnAyU2F2ZSA9ICgpID0+IG5ldyBFcnJvcignSlAyIG91dHB1dCByZXF1aXJlcyBsaWJ2aXBzIHdpdGggc3VwcG9ydCBmb3IgT3BlbkpQRUcnKTtcblxuY29uc3QgYml0ZGVwdGhGcm9tQ29sb3VyQ291bnQgPSAoY29sb3VycykgPT4gMSA8PCAzMSAtIE1hdGguY2x6MzIoTWF0aC5jZWlsKE1hdGgubG9nMihjb2xvdXJzKSkpO1xuXG4vKipcbiAqIFdyaXRlIG91dHB1dCBpbWFnZSBkYXRhIHRvIGEgZmlsZS5cbiAqXG4gKiBJZiBhbiBleHBsaWNpdCBvdXRwdXQgZm9ybWF0IGlzIG5vdCBzZWxlY3RlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSBleHRlbnNpb24sXG4gKiB3aXRoIEpQRUcsIFBORywgV2ViUCwgQVZJRiwgVElGRiwgR0lGLCBEWkksIGFuZCBsaWJ2aXBzJyBWIGZvcm1hdCBzdXBwb3J0ZWQuXG4gKiBOb3RlIHRoYXQgcmF3IHBpeGVsIGRhdGEgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGJ1ZmZlciBvdXRwdXQuXG4gKlxuICogQnkgZGVmYXVsdCBhbGwgbWV0YWRhdGEgd2lsbCBiZSByZW1vdmVkLCB3aGljaCBpbmNsdWRlcyBFWElGLWJhc2VkIG9yaWVudGF0aW9uLlxuICogU2VlIHtAbGluayAjd2l0aG1ldGFkYXRhfHdpdGhNZXRhZGF0YX0gZm9yIGNvbnRyb2wgb3ZlciB0aGlzLlxuICpcbiAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIGFuZCBwZXJtaXNzaW9ucyBleGlzdC5cbiAqXG4gKiBBIGBQcm9taXNlYCBpcyByZXR1cm5lZCB3aGVuIGBjYWxsYmFja2AgaXMgbm90IHByb3ZpZGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnRvRmlsZSgnb3V0cHV0LnBuZycsIChlcnIsIGluZm8pID0+IHsgLi4uIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnRvRmlsZSgnb3V0cHV0LnBuZycpXG4gKiAgIC50aGVuKGluZm8gPT4geyAuLi4gfSlcbiAqICAgLmNhdGNoKGVyciA9PiB7IC4uLiB9KTtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU91dCAtIHRoZSBwYXRoIHRvIHdyaXRlIHRoZSBpbWFnZSBkYXRhIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIGNhbGxlZCBvbiBjb21wbGV0aW9uIHdpdGggdHdvIGFyZ3VtZW50cyBgKGVyciwgaW5mbylgLlxuICogYGluZm9gIGNvbnRhaW5zIHRoZSBvdXRwdXQgaW1hZ2UgYGZvcm1hdGAsIGBzaXplYCAoYnl0ZXMpLCBgd2lkdGhgLCBgaGVpZ2h0YCxcbiAqIGBjaGFubmVsc2AgYW5kIGBwcmVtdWx0aXBsaWVkYCAoaW5kaWNhdGluZyBpZiBwcmVtdWx0aXBsaWNhdGlvbiB3YXMgdXNlZCkuXG4gKiBXaGVuIHVzaW5nIGEgY3JvcCBzdHJhdGVneSBhbHNvIGNvbnRhaW5zIGBjcm9wT2Zmc2V0TGVmdGAgYW5kIGBjcm9wT2Zmc2V0VG9wYC5cbiAqIFdoZW4gdXNpbmcgdGhlIGF0dGVudGlvbiBjcm9wIHN0cmF0ZWd5IGFsc28gY29udGFpbnMgYGF0dGVudGlvblhgIGFuZCBgYXR0ZW50aW9uWWAsIHRoZSBmb2NhbCBwb2ludCBvZiB0aGUgY3JvcHBlZCByZWdpb24uXG4gKiBBbmltYXRlZCBvdXRwdXQgd2lsbCBhbHNvIGNvbnRhaW4gYHBhZ2VIZWlnaHRgIGFuZCBgcGFnZXNgLlxuICogTWF5IGFsc28gY29udGFpbiBgdGV4dEF1dG9maXREcGlgIChkcGkgdGhlIGZvbnQgd2FzIHJlbmRlcmVkIGF0KSBpZiBpbWFnZSB3YXMgY3JlYXRlZCBmcm9tIHRleHQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSAtIHdoZW4gbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gdG9GaWxlIChmaWxlT3V0LCBjYWxsYmFjaykge1xuICBsZXQgZXJyO1xuICBpZiAoIWlzLnN0cmluZyhmaWxlT3V0KSkge1xuICAgIGVyciA9IG5ldyBFcnJvcignTWlzc2luZyBvdXRwdXQgZmlsZSBwYXRoJyk7XG4gIH0gZWxzZSBpZiAoaXMuc3RyaW5nKHRoaXMub3B0aW9ucy5pbnB1dC5maWxlKSAmJiBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLmlucHV0LmZpbGUpID09PSBwYXRoLnJlc29sdmUoZmlsZU91dCkpIHtcbiAgICBlcnIgPSBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2Ugc2FtZSBmaWxlIGZvciBpbnB1dCBhbmQgb3V0cHV0Jyk7XG4gIH0gZWxzZSBpZiAoanAyUmVnZXgudGVzdChwYXRoLmV4dG5hbWUoZmlsZU91dCkpICYmICF0aGlzLmNvbnN0cnVjdG9yLmZvcm1hdC5qcDJrLm91dHB1dC5maWxlKSB7XG4gICAgZXJyID0gZXJySnAyU2F2ZSgpO1xuICB9XG4gIGlmIChlcnIpIHtcbiAgICBpZiAoaXMuZm4oY2FsbGJhY2spKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zLmZpbGVPdXQgPSBmaWxlT3V0O1xuICAgIGNvbnN0IHN0YWNrID0gRXJyb3IoKTtcbiAgICByZXR1cm4gdGhpcy5fcGlwZWxpbmUoY2FsbGJhY2ssIHN0YWNrKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBXcml0ZSBvdXRwdXQgdG8gYSBCdWZmZXIuXG4gKiBKUEVHLCBQTkcsIFdlYlAsIEFWSUYsIFRJRkYsIEdJRiBhbmQgcmF3IHBpeGVsIGRhdGEgb3V0cHV0IGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogVXNlIHtAbGluayAjdG9mb3JtYXR8dG9Gb3JtYXR9IG9yIG9uZSBvZiB0aGUgZm9ybWF0LXNwZWNpZmljIGZ1bmN0aW9ucyBzdWNoIGFzIHtAbGluayBqcGVnfSwge0BsaW5rIHBuZ30gZXRjLiB0byBzZXQgdGhlIG91dHB1dCBmb3JtYXQuXG4gKlxuICogSWYgbm8gZXhwbGljaXQgZm9ybWF0IGlzIHNldCwgdGhlIG91dHB1dCBmb3JtYXQgd2lsbCBtYXRjaCB0aGUgaW5wdXQgaW1hZ2UsIGV4Y2VwdCBTVkcgaW5wdXQgd2hpY2ggYmVjb21lcyBQTkcgb3V0cHV0LlxuICpcbiAqIEJ5IGRlZmF1bHQgYWxsIG1ldGFkYXRhIHdpbGwgYmUgcmVtb3ZlZCwgd2hpY2ggaW5jbHVkZXMgRVhJRi1iYXNlZCBvcmllbnRhdGlvbi5cbiAqIFNlZSB7QGxpbmsgI3dpdGhtZXRhZGF0YXx3aXRoTWV0YWRhdGF9IGZvciBjb250cm9sIG92ZXIgdGhpcy5cbiAqXG4gKiBgY2FsbGJhY2tgLCBpZiBwcmVzZW50LCBnZXRzIHRocmVlIGFyZ3VtZW50cyBgKGVyciwgZGF0YSwgaW5mbylgIHdoZXJlOlxuICogLSBgZXJyYCBpcyBhbiBlcnJvciwgaWYgYW55LlxuICogLSBgZGF0YWAgaXMgdGhlIG91dHB1dCBpbWFnZSBkYXRhLlxuICogLSBgaW5mb2AgY29udGFpbnMgdGhlIG91dHB1dCBpbWFnZSBgZm9ybWF0YCwgYHNpemVgIChieXRlcyksIGB3aWR0aGAsIGBoZWlnaHRgLFxuICogYGNoYW5uZWxzYCBhbmQgYHByZW11bHRpcGxpZWRgIChpbmRpY2F0aW5nIGlmIHByZW11bHRpcGxpY2F0aW9uIHdhcyB1c2VkKS5cbiAqIFdoZW4gdXNpbmcgYSBjcm9wIHN0cmF0ZWd5IGFsc28gY29udGFpbnMgYGNyb3BPZmZzZXRMZWZ0YCBhbmQgYGNyb3BPZmZzZXRUb3BgLlxuICogQW5pbWF0ZWQgb3V0cHV0IHdpbGwgYWxzbyBjb250YWluIGBwYWdlSGVpZ2h0YCBhbmQgYHBhZ2VzYC5cbiAqIE1heSBhbHNvIGNvbnRhaW4gYHRleHRBdXRvZml0RHBpYCAoZHBpIHRoZSBmb250IHdhcyByZW5kZXJlZCBhdCkgaWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgZnJvbSB0ZXh0LlxuICpcbiAqIEEgYFByb21pc2VgIGlzIHJldHVybmVkIHdoZW4gYGNhbGxiYWNrYCBpcyBub3QgcHJvdmlkZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAudG9CdWZmZXIoKGVyciwgZGF0YSwgaW5mbykgPT4geyAuLi4gfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAudG9CdWZmZXIoKVxuICogICAudGhlbihkYXRhID0+IHsgLi4uIH0pXG4gKiAgIC5jYXRjaChlcnIgPT4geyAuLi4gfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAucG5nKClcbiAqICAgLnRvQnVmZmVyKHsgcmVzb2x2ZVdpdGhPYmplY3Q6IHRydWUgfSlcbiAqICAgLnRoZW4oKHsgZGF0YSwgaW5mbyB9KSA9PiB7IC4uLiB9KVxuICogICAuY2F0Y2goZXJyID0+IHsgLi4uIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB7IGRhdGEsIGluZm8gfSA9IGF3YWl0IHNoYXJwKCdteS1pbWFnZS5qcGcnKVxuICogICAvLyBvdXRwdXQgdGhlIHJhdyBwaXhlbHNcbiAqICAgLnJhdygpXG4gKiAgIC50b0J1ZmZlcih7IHJlc29sdmVXaXRoT2JqZWN0OiB0cnVlIH0pO1xuICpcbiAqIC8vIGNyZWF0ZSBhIG1vcmUgdHlwZSBzYWZlIHdheSB0byB3b3JrIHdpdGggdGhlIHJhdyBwaXhlbCBkYXRhXG4gKiAvLyB0aGlzIHdpbGwgbm90IGNvcHkgdGhlIGRhdGEsIGluc3RlYWQgaXQgd2lsbCBjaGFuZ2UgYGRhdGFgcyB1bmRlcmx5aW5nIEFycmF5QnVmZmVyXG4gKiAvLyBzbyBgZGF0YWAgYW5kIGBwaXhlbEFycmF5YCBwb2ludCB0byB0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb25cbiAqIGNvbnN0IHBpeGVsQXJyYXkgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5idWZmZXIpO1xuICpcbiAqIC8vIFdoZW4geW91IGFyZSBkb25lIGNoYW5naW5nIHRoZSBwaXhlbEFycmF5LCBzaGFycCB0YWtlcyB0aGUgYHBpeGVsQXJyYXlgIGFzIGFuIGlucHV0XG4gKiBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzIH0gPSBpbmZvO1xuICogYXdhaXQgc2hhcnAocGl4ZWxBcnJheSwgeyByYXc6IHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHMgfSB9KVxuICogICAudG9GaWxlKCdteS1jaGFuZ2VkLWltYWdlLmpwZycpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVzb2x2ZVdpdGhPYmplY3RdIFJlc29sdmUgdGhlIFByb21pc2Ugd2l0aCBhbiBPYmplY3QgY29udGFpbmluZyBgZGF0YWAgYW5kIGBpbmZvYCBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgcmVzb2x2aW5nIG9ubHkgd2l0aCBgZGF0YWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSAtIHdoZW4gbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWRcbiAqL1xuZnVuY3Rpb24gdG9CdWZmZXIgKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdyZXNvbHZlV2l0aE9iamVjdCcsIG9wdGlvbnMucmVzb2x2ZVdpdGhPYmplY3QpO1xuICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5yZXNvbHZlV2l0aE9iamVjdCkge1xuICAgIHRoaXMub3B0aW9ucy5yZXNvbHZlV2l0aE9iamVjdCA9IGZhbHNlO1xuICB9XG4gIHRoaXMub3B0aW9ucy5maWxlT3V0ID0gJyc7XG4gIGNvbnN0IHN0YWNrID0gRXJyb3IoKTtcbiAgcmV0dXJuIHRoaXMuX3BpcGVsaW5lKGlzLmZuKG9wdGlvbnMpID8gb3B0aW9ucyA6IGNhbGxiYWNrLCBzdGFjayk7XG59XG5cbi8qKlxuICogS2VlcCBhbGwgRVhJRiBtZXRhZGF0YSBmcm9tIHRoZSBpbnB1dCBpbWFnZSBpbiB0aGUgb3V0cHV0IGltYWdlLlxuICpcbiAqIEVYSUYgbWV0YWRhdGEgaXMgdW5zdXBwb3J0ZWQgZm9yIFRJRkYgb3V0cHV0LlxuICpcbiAqIEBzaW5jZSAwLjMzLjBcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0V2l0aEV4aWYgPSBhd2FpdCBzaGFycChpbnB1dFdpdGhFeGlmKVxuICogICAua2VlcEV4aWYoKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIGtlZXBFeGlmICgpIHtcbiAgdGhpcy5vcHRpb25zLmtlZXBNZXRhZGF0YSB8PSAwYjAwMDAxO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBTZXQgRVhJRiBtZXRhZGF0YSBpbiB0aGUgb3V0cHV0IGltYWdlLCBpZ25vcmluZyBhbnkgRVhJRiBpbiB0aGUgaW5wdXQgaW1hZ2UuXG4gKlxuICogQHNpbmNlIDAuMzMuMFxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBkYXRhV2l0aEV4aWYgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLndpdGhFeGlmKHtcbiAqICAgICBJRkQwOiB7XG4gKiAgICAgICBDb3B5cmlnaHQ6ICdUaGUgTmF0aW9uYWwgR2FsbGVyeSdcbiAqICAgICB9LFxuICogICAgIElGRDM6IHtcbiAqICAgICAgIEdQU0xhdGl0dWRlUmVmOiAnTicsXG4gKiAgICAgICBHUFNMYXRpdHVkZTogJzUxLzEgMzAvMSAzMjMwLzEwMCcsXG4gKiAgICAgICBHUFNMb25naXR1ZGVSZWY6ICdXJyxcbiAqICAgICAgIEdQU0xvbmdpdHVkZTogJzAvMSA3LzEgNDM2Ni8xMDAnXG4gKiAgICAgfVxuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIE9iamVjdDxzdHJpbmcsIHN0cmluZz4+fSBleGlmIE9iamVjdCBrZXllZCBieSBJRkQwLCBJRkQxIGV0Yy4gb2Yga2V5L3ZhbHVlIHN0cmluZyBwYWlycyB0byB3cml0ZSBhcyBFWElGIGRhdGEuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIHdpdGhFeGlmIChleGlmKSB7XG4gIGlmIChpcy5vYmplY3QoZXhpZikpIHtcbiAgICBmb3IgKGNvbnN0IFtpZmQsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGV4aWYpKSB7XG4gICAgICBpZiAoaXMub2JqZWN0KGVudHJpZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgICAgaWYgKGlzLnN0cmluZyh2KSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndpdGhFeGlmW2BleGlmLSR7aWZkLnRvTG93ZXJDYXNlKCl9LSR7a31gXSA9IHY7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcihgJHtpZmR9LiR7a31gLCAnc3RyaW5nJywgdik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoaWZkLCAnb2JqZWN0JywgZW50cmllcyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZXhpZicsICdvYmplY3QnLCBleGlmKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMud2l0aEV4aWZNZXJnZSA9IGZhbHNlO1xuICByZXR1cm4gdGhpcy5rZWVwRXhpZigpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBFWElGIG1ldGFkYXRhIGZyb20gdGhlIGlucHV0IGltYWdlIGluIHRoZSBvdXRwdXQgaW1hZ2UuXG4gKlxuICogQHNpbmNlIDAuMzMuMFxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBkYXRhV2l0aE1lcmdlZEV4aWYgPSBhd2FpdCBzaGFycChpbnB1dFdpdGhFeGlmKVxuICogICAud2l0aEV4aWZNZXJnZSh7XG4gKiAgICAgSUZEMDoge1xuICogICAgICAgQ29weXJpZ2h0OiAnVGhlIE5hdGlvbmFsIEdhbGxlcnknXG4gKiAgICAgfVxuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIE9iamVjdDxzdHJpbmcsIHN0cmluZz4+fSBleGlmIE9iamVjdCBrZXllZCBieSBJRkQwLCBJRkQxIGV0Yy4gb2Yga2V5L3ZhbHVlIHN0cmluZyBwYWlycyB0byB3cml0ZSBhcyBFWElGIGRhdGEuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIHdpdGhFeGlmTWVyZ2UgKGV4aWYpIHtcbiAgdGhpcy53aXRoRXhpZihleGlmKTtcbiAgdGhpcy5vcHRpb25zLndpdGhFeGlmTWVyZ2UgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBLZWVwIElDQyBwcm9maWxlIGZyb20gdGhlIGlucHV0IGltYWdlIGluIHRoZSBvdXRwdXQgaW1hZ2UuXG4gKlxuICogV2hlcmUgbmVjZXNzYXJ5LCB3aWxsIGF0dGVtcHQgdG8gY29udmVydCB0aGUgb3V0cHV0IGNvbG91ciBzcGFjZSB0byBtYXRjaCB0aGUgcHJvZmlsZS5cbiAqXG4gKiBAc2luY2UgMC4zMy4wXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dFdpdGhJY2NQcm9maWxlID0gYXdhaXQgc2hhcnAoaW5wdXRXaXRoSWNjUHJvZmlsZSlcbiAqICAgLmtlZXBJY2NQcm9maWxlKClcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBrZWVwSWNjUHJvZmlsZSAoKSB7XG4gIHRoaXMub3B0aW9ucy5rZWVwTWV0YWRhdGEgfD0gMGIwMTAwMDtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtIHVzaW5nIGFuIElDQyBwcm9maWxlIGFuZCBhdHRhY2ggdG8gdGhlIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBUaGlzIGNhbiBlaXRoZXIgYmUgYW4gYWJzb2x1dGUgZmlsZXN5c3RlbSBwYXRoIG9yXG4gKiBidWlsdC1pbiBwcm9maWxlIG5hbWUgKGBzcmdiYCwgYHAzYCwgYGNteWtgKS5cbiAqXG4gKiBAc2luY2UgMC4zMy4wXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dFdpdGhQMyA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAud2l0aEljY1Byb2ZpbGUoJ3AzJylcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGljYyAtIEFic29sdXRlIGZpbGVzeXN0ZW0gcGF0aCB0byBvdXRwdXQgSUNDIHByb2ZpbGUgb3IgYnVpbHQtaW4gcHJvZmlsZSBuYW1lIChzcmdiLCBwMywgY215aykuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYXR0YWNoPXRydWVdIFNob3VsZCB0aGUgSUNDIHByb2ZpbGUgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBpbWFnZSBtZXRhZGF0YT9cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gd2l0aEljY1Byb2ZpbGUgKGljYywgb3B0aW9ucykge1xuICBpZiAoaXMuc3RyaW5nKGljYykpIHtcbiAgICB0aGlzLm9wdGlvbnMud2l0aEljY1Byb2ZpbGUgPSBpY2M7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdpY2MnLCAnc3RyaW5nJywgaWNjKTtcbiAgfVxuICB0aGlzLmtlZXBJY2NQcm9maWxlKCk7XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmF0dGFjaCkpIHtcbiAgICAgIGlmIChpcy5ib29sKG9wdGlvbnMuYXR0YWNoKSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuYXR0YWNoKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmtlZXBNZXRhZGF0YSAmPSB+MGIwMTAwMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhdHRhY2gnLCAnYm9vbGVhbicsIG9wdGlvbnMuYXR0YWNoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogS2VlcCBhbGwgbWV0YWRhdGEgKEVYSUYsIElDQywgWE1QLCBJUFRDKSBmcm9tIHRoZSBpbnB1dCBpbWFnZSBpbiB0aGUgb3V0cHV0IGltYWdlLlxuICpcbiAqIFRoZSBkZWZhdWx0IGJlaGF2aW91ciwgd2hlbiBga2VlcE1ldGFkYXRhYCBpcyBub3QgdXNlZCwgaXMgdG8gY29udmVydCB0byB0aGUgZGV2aWNlLWluZGVwZW5kZW50XG4gKiBzUkdCIGNvbG91ciBzcGFjZSBhbmQgc3RyaXAgYWxsIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHJlbW92YWwgb2YgYW55IElDQyBwcm9maWxlLlxuICpcbiAqIEBzaW5jZSAwLjMzLjBcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0V2l0aE1ldGFkYXRhID0gYXdhaXQgc2hhcnAoaW5wdXRXaXRoTWV0YWRhdGEpXG4gKiAgIC5rZWVwTWV0YWRhdGEoKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIGtlZXBNZXRhZGF0YSAoKSB7XG4gIHRoaXMub3B0aW9ucy5rZWVwTWV0YWRhdGEgPSAwYjExMTExO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBLZWVwIG1vc3QgbWV0YWRhdGEgKEVYSUYsIFhNUCwgSVBUQykgZnJvbSB0aGUgaW5wdXQgaW1hZ2UgaW4gdGhlIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBUaGlzIHdpbGwgYWxzbyBjb252ZXJ0IHRvIGFuZCBhZGQgYSB3ZWItZnJpZW5kbHkgc1JHQiBJQ0MgcHJvZmlsZSBpZiBhcHByb3ByaWF0ZS5cbiAqXG4gKiBBbGxvd3Mgb3JpZW50YXRpb24gYW5kIGRlbnNpdHkgdG8gYmUgc2V0IG9yIHVwZGF0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dFNyZ2JXaXRoTWV0YWRhdGEgPSBhd2FpdCBzaGFycChpbnB1dFJnYldpdGhNZXRhZGF0YSlcbiAqICAgLndpdGhNZXRhZGF0YSgpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgb3V0cHV0IG1ldGFkYXRhIHRvIDk2IERQSVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAud2l0aE1ldGFkYXRhKHsgZGVuc2l0eTogOTYgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm9yaWVudGF0aW9uXSBVc2VkIHRvIHVwZGF0ZSB0aGUgRVhJRiBgT3JpZW50YXRpb25gIHRhZywgaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDguXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZGVuc2l0eV0gTnVtYmVyIG9mIHBpeGVscyBwZXIgaW5jaCAoRFBJKS5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gd2l0aE1ldGFkYXRhIChvcHRpb25zKSB7XG4gIHRoaXMua2VlcE1ldGFkYXRhKCk7XG4gIHRoaXMud2l0aEljY1Byb2ZpbGUoJ3NyZ2InKTtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMub3JpZW50YXRpb24pKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLm9yaWVudGF0aW9uKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMub3JpZW50YXRpb24sIDEsIDgpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy53aXRoTWV0YWRhdGFPcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29yaWVudGF0aW9uJywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCA4Jywgb3B0aW9ucy5vcmllbnRhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZGVuc2l0eSkpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5kZW5zaXR5KSAmJiBvcHRpb25zLmRlbnNpdHkgPiAwKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy53aXRoTWV0YWRhdGFEZW5zaXR5ID0gb3B0aW9ucy5kZW5zaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdkZW5zaXR5JywgJ3Bvc2l0aXZlIG51bWJlcicsIG9wdGlvbnMuZGVuc2l0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuaWNjKSkge1xuICAgICAgdGhpcy53aXRoSWNjUHJvZmlsZShvcHRpb25zLmljYyk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZXhpZikpIHtcbiAgICAgIHRoaXMud2l0aEV4aWZNZXJnZShvcHRpb25zLmV4aWYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBGb3JjZSBvdXRwdXQgdG8gYSBnaXZlbiBmb3JtYXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgYW55IGlucHV0IHRvIFBORyBvdXRwdXRcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnRvRm9ybWF0KCdwbmcnKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0geyhzdHJpbmd8T2JqZWN0KX0gZm9ybWF0IC0gYXMgYSBzdHJpbmcgb3IgYW4gT2JqZWN0IHdpdGggYW4gJ2lkJyBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBmb3JtYXQgb3Igb3B0aW9uc1xuICovXG5mdW5jdGlvbiB0b0Zvcm1hdCAoZm9ybWF0LCBvcHRpb25zKSB7XG4gIGNvbnN0IGFjdHVhbEZvcm1hdCA9IGZvcm1hdHMuZ2V0KChpcy5vYmplY3QoZm9ybWF0KSAmJiBpcy5zdHJpbmcoZm9ybWF0LmlkKSA/IGZvcm1hdC5pZCA6IGZvcm1hdCkudG9Mb3dlckNhc2UoKSk7XG4gIGlmICghYWN0dWFsRm9ybWF0KSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdmb3JtYXQnLCBgb25lIG9mOiAke1suLi5mb3JtYXRzLmtleXMoKV0uam9pbignLCAnKX1gLCBmb3JtYXQpO1xuICB9XG4gIHJldHVybiB0aGlzW2FjdHVhbEZvcm1hdF0ob3B0aW9ucyk7XG59XG5cbi8qKlxuICogVXNlIHRoZXNlIEpQRUcgb3B0aW9ucyBmb3Igb3V0cHV0IGltYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IGFueSBpbnB1dCB0byB2ZXJ5IGhpZ2ggcXVhbGl0eSBKUEVHIG91dHB1dFxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuanBlZyh7XG4gKiAgICAgcXVhbGl0eTogMTAwLFxuICogICAgIGNocm9tYVN1YnNhbXBsaW5nOiAnNDo0OjQnXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2UgbW96anBlZyB0byByZWR1Y2Ugb3V0cHV0IEpQRUcgZmlsZSBzaXplIChzbG93ZXIpXG4gKiBjb25zdCBkYXRhID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5qcGVnKHsgbW96anBlZzogdHJ1ZSB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFsaXR5PTgwXSAtIHF1YWxpdHksIGludGVnZXIgMS0xMDBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJvZ3Jlc3NpdmU9ZmFsc2VdIC0gdXNlIHByb2dyZXNzaXZlIChpbnRlcmxhY2UpIHNjYW5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZz0nNDoyOjAnXSAtIHNldCB0byAnNDo0OjQnIHRvIHByZXZlbnQgY2hyb21hIHN1YnNhbXBsaW5nIG90aGVyd2lzZSBkZWZhdWx0cyB0byAnNDoyOjAnIGNocm9tYSBzdWJzYW1wbGluZ1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5vcHRpbWlzZUNvZGluZz10cnVlXSAtIG9wdGltaXNlIEh1ZmZtYW4gY29kaW5nIHRhYmxlc1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5vcHRpbWl6ZUNvZGluZz10cnVlXSAtIGFsdGVybmF0aXZlIHNwZWxsaW5nIG9mIG9wdGltaXNlQ29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm1vempwZWc9ZmFsc2VdIC0gdXNlIG1vempwZWcgZGVmYXVsdHMsIGVxdWl2YWxlbnQgdG8gYHsgdHJlbGxpc1F1YW50aXNhdGlvbjogdHJ1ZSwgb3ZlcnNob290RGVyaW5naW5nOiB0cnVlLCBvcHRpbWlzZVNjYW5zOiB0cnVlLCBxdWFudGlzYXRpb25UYWJsZTogMyB9YFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmVsbGlzUXVhbnRpc2F0aW9uPWZhbHNlXSAtIGFwcGx5IHRyZWxsaXMgcXVhbnRpc2F0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm92ZXJzaG9vdERlcmluZ2luZz1mYWxzZV0gLSBhcHBseSBvdmVyc2hvb3QgZGVyaW5naW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm9wdGltaXNlU2NhbnM9ZmFsc2VdIC0gb3B0aW1pc2UgcHJvZ3Jlc3NpdmUgc2NhbnMsIGZvcmNlcyBwcm9ncmVzc2l2ZVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5vcHRpbWl6ZVNjYW5zPWZhbHNlXSAtIGFsdGVybmF0aXZlIHNwZWxsaW5nIG9mIG9wdGltaXNlU2NhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFudGlzYXRpb25UYWJsZT0wXSAtIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UsIGludGVnZXIgMC04XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucXVhbnRpemF0aW9uVGFibGU9MF0gLSBhbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBxdWFudGlzYXRpb25UYWJsZVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JjZT10cnVlXSAtIGZvcmNlIEpQRUcgb3V0cHV0LCBvdGhlcndpc2UgYXR0ZW1wdCB0byB1c2UgaW5wdXQgZm9ybWF0XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGpwZWcgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucXVhbGl0eSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMucXVhbGl0eSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnF1YWxpdHksIDEsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdRdWFsaXR5ID0gb3B0aW9ucy5xdWFsaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnByb2dyZXNzaXZlKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignanBlZ1Byb2dyZXNzaXZlJywgb3B0aW9ucy5wcm9ncmVzc2l2ZSk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmcpKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmcpICYmIGlzLmluQXJyYXkob3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZywgWyc0OjI6MCcsICc0OjQ6NCddKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanBlZ0Nocm9tYVN1YnNhbXBsaW5nID0gb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY2hyb21hU3Vic2FtcGxpbmcnLCAnb25lIG9mOiA0OjI6MCwgNDo0OjQnLCBvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3B0aW1pc2VDb2RpbmcgPSBpcy5ib29sKG9wdGlvbnMub3B0aW1pemVDb2RpbmcpID8gb3B0aW9ucy5vcHRpbWl6ZUNvZGluZyA6IG9wdGlvbnMub3B0aW1pc2VDb2Rpbmc7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW1pc2VDb2RpbmcpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdqcGVnT3B0aW1pc2VDb2RpbmcnLCBvcHRpbWlzZUNvZGluZyk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubW96anBlZykpIHtcbiAgICAgIGlmIChpcy5ib29sKG9wdGlvbnMubW96anBlZykpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubW96anBlZykge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5qcGVnVHJlbGxpc1F1YW50aXNhdGlvbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdPdmVyc2hvb3REZXJpbmdpbmcgPSB0cnVlO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5qcGVnT3B0aW1pc2VTY2FucyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdQcm9ncmVzc2l2ZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdRdWFudGlzYXRpb25UYWJsZSA9IDM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbW96anBlZycsICdib29sZWFuJywgb3B0aW9ucy5tb3pqcGVnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdHJlbGxpc1F1YW50aXNhdGlvbiA9IGlzLmJvb2wob3B0aW9ucy50cmVsbGlzUXVhbnRpemF0aW9uKSA/IG9wdGlvbnMudHJlbGxpc1F1YW50aXphdGlvbiA6IG9wdGlvbnMudHJlbGxpc1F1YW50aXNhdGlvbjtcbiAgICBpZiAoaXMuZGVmaW5lZCh0cmVsbGlzUXVhbnRpc2F0aW9uKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignanBlZ1RyZWxsaXNRdWFudGlzYXRpb24nLCB0cmVsbGlzUXVhbnRpc2F0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5vdmVyc2hvb3REZXJpbmdpbmcpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdqcGVnT3ZlcnNob290RGVyaW5naW5nJywgb3B0aW9ucy5vdmVyc2hvb3REZXJpbmdpbmcpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpbWlzZVNjYW5zID0gaXMuYm9vbChvcHRpb25zLm9wdGltaXplU2NhbnMpID8gb3B0aW9ucy5vcHRpbWl6ZVNjYW5zIDogb3B0aW9ucy5vcHRpbWlzZVNjYW5zO1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGltaXNlU2NhbnMpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdqcGVnT3B0aW1pc2VTY2FucycsIG9wdGltaXNlU2NhbnMpO1xuICAgICAgaWYgKG9wdGltaXNlU2NhbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdQcm9ncmVzc2l2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHF1YW50aXNhdGlvblRhYmxlID0gaXMubnVtYmVyKG9wdGlvbnMucXVhbnRpemF0aW9uVGFibGUpID8gb3B0aW9ucy5xdWFudGl6YXRpb25UYWJsZSA6IG9wdGlvbnMucXVhbnRpc2F0aW9uVGFibGU7XG4gICAgaWYgKGlzLmRlZmluZWQocXVhbnRpc2F0aW9uVGFibGUpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihxdWFudGlzYXRpb25UYWJsZSkgJiYgaXMuaW5SYW5nZShxdWFudGlzYXRpb25UYWJsZSwgMCwgOCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdRdWFudGlzYXRpb25UYWJsZSA9IHF1YW50aXNhdGlvblRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFudGlzYXRpb25UYWJsZScsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgOCcsIHF1YW50aXNhdGlvblRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgnanBlZycsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFVzZSB0aGVzZSBQTkcgb3B0aW9ucyBmb3Igb3V0cHV0IGltYWdlLlxuICpcbiAqIEJ5IGRlZmF1bHQsIFBORyBvdXRwdXQgaXMgZnVsbCBjb2xvdXIgYXQgOCBiaXRzIHBlciBwaXhlbC5cbiAqXG4gKiBJbmRleGVkIFBORyBpbnB1dCBhdCAxLCAyIG9yIDQgYml0cyBwZXIgcGl4ZWwgaXMgY29udmVydGVkIHRvIDggYml0cyBwZXIgcGl4ZWwuXG4gKiBTZXQgYHBhbGV0dGVgIHRvIGB0cnVlYCBmb3Igc2xvd2VyLCBpbmRleGVkIFBORyBvdXRwdXQuXG4gKlxuICogRm9yIDE2IGJpdHMgcGVyIHBpeGVsIG91dHB1dCwgY29udmVydCB0byBgcmdiMTZgIHZpYVxuICoge0BsaW5rIC9hcGktY29sb3VyI3RvY29sb3Vyc3BhY2V8dG9Db2xvdXJzcGFjZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgYW55IGlucHV0IHRvIGZ1bGwgY29sb3VyIFBORyBvdXRwdXRcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnBuZygpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IGFueSBpbnB1dCB0byBpbmRleGVkIFBORyBvdXRwdXQgKHNsb3dlcilcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnBuZyh7IHBhbGV0dGU6IHRydWUgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE91dHB1dCAxNiBiaXRzIHBlciBwaXhlbCBSR0IoQSlcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAudG9Db2xvdXJzcGFjZSgncmdiMTYnKVxuICogIC5wbmcoKVxuICogIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJvZ3Jlc3NpdmU9ZmFsc2VdIC0gdXNlIHByb2dyZXNzaXZlIChpbnRlcmxhY2UpIHNjYW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jb21wcmVzc2lvbkxldmVsPTZdIC0gemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgMCAoZmFzdGVzdCwgbGFyZ2VzdCkgdG8gOSAoc2xvd2VzdCwgc21hbGxlc3QpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFkYXB0aXZlRmlsdGVyaW5nPWZhbHNlXSAtIHVzZSBhZGFwdGl2ZSByb3cgZmlsdGVyaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnBhbGV0dGU9ZmFsc2VdIC0gcXVhbnRpc2UgdG8gYSBwYWxldHRlLWJhc2VkIGltYWdlIHdpdGggYWxwaGEgdHJhbnNwYXJlbmN5IHN1cHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFsaXR5PTEwMF0gLSB1c2UgdGhlIGxvd2VzdCBudW1iZXIgb2YgY29sb3VycyBuZWVkZWQgdG8gYWNoaWV2ZSBnaXZlbiBxdWFsaXR5LCBzZXRzIGBwYWxldHRlYCB0byBgdHJ1ZWBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5lZmZvcnQ9N10gLSBDUFUgZWZmb3J0LCBiZXR3ZWVuIDEgKGZhc3Rlc3QpIGFuZCAxMCAoc2xvd2VzdCksIHNldHMgYHBhbGV0dGVgIHRvIGB0cnVlYFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNvbG91cnM9MjU2XSAtIG1heGltdW0gbnVtYmVyIG9mIHBhbGV0dGUgZW50cmllcywgc2V0cyBgcGFsZXR0ZWAgdG8gYHRydWVgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY29sb3JzPTI1Nl0gLSBhbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBgb3B0aW9ucy5jb2xvdXJzYCwgc2V0cyBgcGFsZXR0ZWAgdG8gYHRydWVgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZGl0aGVyPTEuMF0gLSBsZXZlbCBvZiBGbG95ZC1TdGVpbmJlcmcgZXJyb3IgZGlmZnVzaW9uLCBzZXRzIGBwYWxldHRlYCB0byBgdHJ1ZWBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZm9yY2U9dHJ1ZV0gLSBmb3JjZSBQTkcgb3V0cHV0LCBvdGhlcndpc2UgYXR0ZW1wdCB0byB1c2UgaW5wdXQgZm9ybWF0XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHBuZyAob3B0aW9ucykge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5wcm9ncmVzc2l2ZSkpIHtcbiAgICAgIHRoaXMuX3NldEJvb2xlYW5PcHRpb24oJ3BuZ1Byb2dyZXNzaXZlJywgb3B0aW9ucy5wcm9ncmVzc2l2ZSk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuY29tcHJlc3Npb25MZXZlbCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMuY29tcHJlc3Npb25MZXZlbCkgJiYgaXMuaW5SYW5nZShvcHRpb25zLmNvbXByZXNzaW9uTGV2ZWwsIDAsIDkpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5wbmdDb21wcmVzc2lvbkxldmVsID0gb3B0aW9ucy5jb21wcmVzc2lvbkxldmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdjb21wcmVzc2lvbkxldmVsJywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCA5Jywgb3B0aW9ucy5jb21wcmVzc2lvbkxldmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5hZGFwdGl2ZUZpbHRlcmluZykpIHtcbiAgICAgIHRoaXMuX3NldEJvb2xlYW5PcHRpb24oJ3BuZ0FkYXB0aXZlRmlsdGVyaW5nJywgb3B0aW9ucy5hZGFwdGl2ZUZpbHRlcmluZyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbG91cnMgPSBvcHRpb25zLmNvbG91cnMgfHwgb3B0aW9ucy5jb2xvcnM7XG4gICAgaWYgKGlzLmRlZmluZWQoY29sb3VycykpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGNvbG91cnMpICYmIGlzLmluUmFuZ2UoY29sb3VycywgMiwgMjU2KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMucG5nQml0ZGVwdGggPSBiaXRkZXB0aEZyb21Db2xvdXJDb3VudChjb2xvdXJzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY29sb3VycycsICdpbnRlZ2VyIGJldHdlZW4gMiBhbmQgMjU2JywgY29sb3Vycyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucGFsZXR0ZSkpIHtcbiAgICAgIHRoaXMuX3NldEJvb2xlYW5PcHRpb24oJ3BuZ1BhbGV0dGUnLCBvcHRpb25zLnBhbGV0dGUpO1xuICAgIH0gZWxzZSBpZiAoW29wdGlvbnMucXVhbGl0eSwgb3B0aW9ucy5lZmZvcnQsIG9wdGlvbnMuY29sb3Vycywgb3B0aW9ucy5jb2xvcnMsIG9wdGlvbnMuZGl0aGVyXS5zb21lKGlzLmRlZmluZWQpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdwbmdQYWxldHRlJywgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMucG5nUGFsZXR0ZSkge1xuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5xdWFsaXR5KSkge1xuICAgICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLnF1YWxpdHkpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5xdWFsaXR5LCAwLCAxMDApKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBuZ1F1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmVmZm9ydCkpIHtcbiAgICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5lZmZvcnQpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5lZmZvcnQsIDEsIDEwKSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5wbmdFZmZvcnQgPSBvcHRpb25zLmVmZm9ydDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2VmZm9ydCcsICdpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAnLCBvcHRpb25zLmVmZm9ydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZGl0aGVyKSkge1xuICAgICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMuZGl0aGVyKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuZGl0aGVyLCAwLCAxKSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5wbmdEaXRoZXIgPSBvcHRpb25zLmRpdGhlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2RpdGhlcicsICdudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDEuMCcsIG9wdGlvbnMuZGl0aGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fdXBkYXRlRm9ybWF0T3V0KCdwbmcnLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBVc2UgdGhlc2UgV2ViUCBvcHRpb25zIGZvciBvdXRwdXQgaW1hZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgYW55IGlucHV0IHRvIGxvc3NsZXNzIFdlYlAgb3V0cHV0XG4gKiBjb25zdCBkYXRhID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC53ZWJwKHsgbG9zc2xlc3M6IHRydWUgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE9wdGltaXNlIHRoZSBmaWxlIHNpemUgb2YgYW4gYW5pbWF0ZWQgV2ViUFxuICogY29uc3Qgb3V0cHV0V2VicCA9IGF3YWl0IHNoYXJwKGlucHV0V2VicCwgeyBhbmltYXRlZDogdHJ1ZSB9KVxuICogICAud2VicCh7IGVmZm9ydDogNiB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFsaXR5PTgwXSAtIHF1YWxpdHksIGludGVnZXIgMS0xMDBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5hbHBoYVF1YWxpdHk9MTAwXSAtIHF1YWxpdHkgb2YgYWxwaGEgbGF5ZXIsIGludGVnZXIgMC0xMDBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubG9zc2xlc3M9ZmFsc2VdIC0gdXNlIGxvc3NsZXNzIGNvbXByZXNzaW9uIG1vZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubmVhckxvc3NsZXNzPWZhbHNlXSAtIHVzZSBuZWFyX2xvc3NsZXNzIGNvbXByZXNzaW9uIG1vZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc21hcnRTdWJzYW1wbGU9ZmFsc2VdIC0gdXNlIGhpZ2ggcXVhbGl0eSBjaHJvbWEgc3Vic2FtcGxpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5wcmVzZXQ9J2RlZmF1bHQnXSAtIG5hbWVkIHByZXNldCBmb3IgcHJlcHJvY2Vzc2luZy9maWx0ZXJpbmcsIG9uZSBvZjogZGVmYXVsdCwgcGhvdG8sIHBpY3R1cmUsIGRyYXdpbmcsIGljb24sIHRleHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5lZmZvcnQ9NF0gLSBDUFUgZWZmb3J0LCBiZXR3ZWVuIDAgKGZhc3Rlc3QpIGFuZCA2IChzbG93ZXN0KVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxvb3A9MF0gLSBudW1iZXIgb2YgYW5pbWF0aW9uIGl0ZXJhdGlvbnMsIHVzZSAwIGZvciBpbmZpbml0ZSBhbmltYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfG51bWJlcltdfSBbb3B0aW9ucy5kZWxheV0gLSBkZWxheShzKSBiZXR3ZWVuIGFuaW1hdGlvbiBmcmFtZXMgKGluIG1pbGxpc2Vjb25kcylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubWluU2l6ZT1mYWxzZV0gLSBwcmV2ZW50IHVzZSBvZiBhbmltYXRpb24ga2V5IGZyYW1lcyB0byBtaW5pbWlzZSBmaWxlIHNpemUgKHNsb3cpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm1peGVkPWZhbHNlXSAtIGFsbG93IG1peHR1cmUgb2YgbG9zc3kgYW5kIGxvc3NsZXNzIGFuaW1hdGlvbiBmcmFtZXMgKHNsb3cpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmNlPXRydWVdIC0gZm9yY2UgV2ViUCBvdXRwdXQsIG90aGVyd2lzZSBhdHRlbXB0IHRvIHVzZSBpbnB1dCBmb3JtYXRcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gd2VicCAob3B0aW9ucykge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5xdWFsaXR5KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5xdWFsaXR5KSAmJiBpcy5pblJhbmdlKG9wdGlvbnMucXVhbGl0eSwgMSwgMTAwKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMud2VicFF1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3F1YWxpdHknLCAnaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCcsIG9wdGlvbnMucXVhbGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuYWxwaGFRdWFsaXR5KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5hbHBoYVF1YWxpdHkpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5hbHBoYVF1YWxpdHksIDAsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLndlYnBBbHBoYVF1YWxpdHkgPSBvcHRpb25zLmFscGhhUXVhbGl0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignYWxwaGFRdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAnLCBvcHRpb25zLmFscGhhUXVhbGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubG9zc2xlc3MpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd3ZWJwTG9zc2xlc3MnLCBvcHRpb25zLmxvc3NsZXNzKTtcbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5uZWFyTG9zc2xlc3MpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd3ZWJwTmVhckxvc3NsZXNzJywgb3B0aW9ucy5uZWFyTG9zc2xlc3MpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnNtYXJ0U3Vic2FtcGxlKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignd2VicFNtYXJ0U3Vic2FtcGxlJywgb3B0aW9ucy5zbWFydFN1YnNhbXBsZSk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucHJlc2V0KSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLnByZXNldCkgJiYgaXMuaW5BcnJheShvcHRpb25zLnByZXNldCwgWydkZWZhdWx0JywgJ3Bob3RvJywgJ3BpY3R1cmUnLCAnZHJhd2luZycsICdpY29uJywgJ3RleHQnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLndlYnBQcmVzZXQgPSBvcHRpb25zLnByZXNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncHJlc2V0JywgJ29uZSBvZjogZGVmYXVsdCwgcGhvdG8sIHBpY3R1cmUsIGRyYXdpbmcsIGljb24sIHRleHQnLCBvcHRpb25zLnByZXNldCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZWZmb3J0KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5lZmZvcnQpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5lZmZvcnQsIDAsIDYpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy53ZWJwRWZmb3J0ID0gb3B0aW9ucy5lZmZvcnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2VmZm9ydCcsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNicsIG9wdGlvbnMuZWZmb3J0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5taW5TaXplKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignd2VicE1pblNpemUnLCBvcHRpb25zLm1pblNpemUpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLm1peGVkKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignd2VicE1peGVkJywgb3B0aW9ucy5taXhlZCk7XG4gICAgfVxuICB9XG4gIHRyeVNldEFuaW1hdGlvbk9wdGlvbnMob3B0aW9ucywgdGhpcy5vcHRpb25zKTtcbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgnd2VicCcsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFVzZSB0aGVzZSBHSUYgb3B0aW9ucyBmb3IgdGhlIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIHBhbGV0dGUgaXMgcmVzZXJ2ZWQgZm9yIHRyYW5zcGFyZW5jeS5cbiAqXG4gKiBUaGUgcGFsZXR0ZSBvZiB0aGUgaW5wdXQgaW1hZ2Ugd2lsbCBiZSByZS11c2VkIGlmIHBvc3NpYmxlLlxuICpcbiAqIEBzaW5jZSAwLjMwLjBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBQTkcgdG8gR0lGXG4gKiBhd2FpdCBzaGFycChwbmdCdWZmZXIpXG4gKiAgIC5naWYoKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBhbmltYXRlZCBXZWJQIHRvIGFuaW1hdGVkIEdJRlxuICogYXdhaXQgc2hhcnAoJ2FuaW1hdGVkLndlYnAnLCB7IGFuaW1hdGVkOiB0cnVlIH0pXG4gKiAgIC50b0ZpbGUoJ2FuaW1hdGVkLmdpZicpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSAxMjh4MTI4LCBjcm9wcGVkLCBub24tZGl0aGVyZWQsIGFuaW1hdGVkIHRodW1ibmFpbCBvZiBhbiBhbmltYXRlZCBHSUZcbiAqIGNvbnN0IG91dCA9IGF3YWl0IHNoYXJwKCdpbi5naWYnLCB7IGFuaW1hdGVkOiB0cnVlIH0pXG4gKiAgIC5yZXNpemUoeyB3aWR0aDogMTI4LCBoZWlnaHQ6IDEyOCB9KVxuICogICAuZ2lmKHsgZGl0aGVyOiAwIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBMb3NzeSBmaWxlIHNpemUgcmVkdWN0aW9uIG9mIGFuaW1hdGVkIEdJRlxuICogYXdhaXQgc2hhcnAoJ2luLmdpZicsIHsgYW5pbWF0ZWQ6IHRydWUgfSlcbiAqICAgLmdpZih7IGludGVyRnJhbWVNYXhFcnJvcjogOCB9KVxuICogICAudG9GaWxlKCdvcHRpbS5naWYnKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmV1c2U9dHJ1ZV0gLSByZS11c2UgZXhpc3RpbmcgcGFsZXR0ZSwgb3RoZXJ3aXNlIGdlbmVyYXRlIG5ldyAoc2xvdylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJvZ3Jlc3NpdmU9ZmFsc2VdIC0gdXNlIHByb2dyZXNzaXZlIChpbnRlcmxhY2UpIHNjYW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jb2xvdXJzPTI1Nl0gLSBtYXhpbXVtIG51bWJlciBvZiBwYWxldHRlIGVudHJpZXMsIGluY2x1ZGluZyB0cmFuc3BhcmVuY3ksIGJldHdlZW4gMiBhbmQgMjU2XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY29sb3JzPTI1Nl0gLSBhbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBgb3B0aW9ucy5jb2xvdXJzYFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmVmZm9ydD03XSAtIENQVSBlZmZvcnQsIGJldHdlZW4gMSAoZmFzdGVzdCkgYW5kIDEwIChzbG93ZXN0KVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmRpdGhlcj0xLjBdIC0gbGV2ZWwgb2YgRmxveWQtU3RlaW5iZXJnIGVycm9yIGRpZmZ1c2lvbiwgYmV0d2VlbiAwIChsZWFzdCkgYW5kIDEgKG1vc3QpXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuaW50ZXJGcmFtZU1heEVycm9yPTBdIC0gbWF4aW11bSBpbnRlci1mcmFtZSBlcnJvciBmb3IgdHJhbnNwYXJlbmN5LCBiZXR3ZWVuIDAgKGxvc3NsZXNzKSBhbmQgMzJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5pbnRlclBhbGV0dGVNYXhFcnJvcj0zXSAtIG1heGltdW0gaW50ZXItcGFsZXR0ZSBlcnJvciBmb3IgcGFsZXR0ZSByZXVzZSwgYmV0d2VlbiAwIGFuZCAyNTZcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sb29wPTBdIC0gbnVtYmVyIG9mIGFuaW1hdGlvbiBpdGVyYXRpb25zLCB1c2UgMCBmb3IgaW5maW5pdGUgYW5pbWF0aW9uXG4gKiBAcGFyYW0ge251bWJlcnxudW1iZXJbXX0gW29wdGlvbnMuZGVsYXldIC0gZGVsYXkocykgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzIChpbiBtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmNlPXRydWVdIC0gZm9yY2UgR0lGIG91dHB1dCwgb3RoZXJ3aXNlIGF0dGVtcHQgdG8gdXNlIGlucHV0IGZvcm1hdFxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBnaWYgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucmV1c2UpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdnaWZSZXVzZScsIG9wdGlvbnMucmV1c2UpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnByb2dyZXNzaXZlKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignZ2lmUHJvZ3Jlc3NpdmUnLCBvcHRpb25zLnByb2dyZXNzaXZlKTtcbiAgICB9XG4gICAgY29uc3QgY29sb3VycyA9IG9wdGlvbnMuY29sb3VycyB8fCBvcHRpb25zLmNvbG9ycztcbiAgICBpZiAoaXMuZGVmaW5lZChjb2xvdXJzKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIoY29sb3VycykgJiYgaXMuaW5SYW5nZShjb2xvdXJzLCAyLCAyNTYpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5naWZCaXRkZXB0aCA9IGJpdGRlcHRoRnJvbUNvbG91ckNvdW50KGNvbG91cnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdjb2xvdXJzJywgJ2ludGVnZXIgYmV0d2VlbiAyIGFuZCAyNTYnLCBjb2xvdXJzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5lZmZvcnQpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMuZWZmb3J0KSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuZWZmb3J0LCAxLCAxMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmdpZkVmZm9ydCA9IG9wdGlvbnMuZWZmb3J0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdlZmZvcnQnLCAnaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwJywgb3B0aW9ucy5lZmZvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmRpdGhlcikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5kaXRoZXIpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5kaXRoZXIsIDAsIDEpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5naWZEaXRoZXIgPSBvcHRpb25zLmRpdGhlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZGl0aGVyJywgJ251bWJlciBiZXR3ZWVuIDAuMCBhbmQgMS4wJywgb3B0aW9ucy5kaXRoZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmludGVyRnJhbWVNYXhFcnJvcikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5pbnRlckZyYW1lTWF4RXJyb3IpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5pbnRlckZyYW1lTWF4RXJyb3IsIDAsIDMyKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ2lmSW50ZXJGcmFtZU1heEVycm9yID0gb3B0aW9ucy5pbnRlckZyYW1lTWF4RXJyb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2ludGVyRnJhbWVNYXhFcnJvcicsICdudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDMyLjAnLCBvcHRpb25zLmludGVyRnJhbWVNYXhFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuaW50ZXJQYWxldHRlTWF4RXJyb3IpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMuaW50ZXJQYWxldHRlTWF4RXJyb3IpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5pbnRlclBhbGV0dGVNYXhFcnJvciwgMCwgMjU2KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ2lmSW50ZXJQYWxldHRlTWF4RXJyb3IgPSBvcHRpb25zLmludGVyUGFsZXR0ZU1heEVycm9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdpbnRlclBhbGV0dGVNYXhFcnJvcicsICdudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDI1Ni4wJywgb3B0aW9ucy5pbnRlclBhbGV0dGVNYXhFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRyeVNldEFuaW1hdGlvbk9wdGlvbnMob3B0aW9ucywgdGhpcy5vcHRpb25zKTtcbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgnZ2lmJywgb3B0aW9ucyk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKipcbiAqIFVzZSB0aGVzZSBKUDIgb3B0aW9ucyBmb3Igb3V0cHV0IGltYWdlLlxuICpcbiAqIFJlcXVpcmVzIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBPcGVuSlBFRy5cbiAqIFRoZSBwcmVidWlsdCBiaW5hcmllcyBkbyBub3QgaW5jbHVkZSB0aGlzIC0gc2VlXG4gKiB7QGxpbmsgaHR0cHM6Ly9zaGFycC5waXhlbHBsdW1iaW5nLmNvbS9pbnN0YWxsI2N1c3RvbS1saWJ2aXBzIGluc3RhbGxpbmcgYSBjdXN0b20gbGlidmlwc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgYW55IGlucHV0IHRvIGxvc3NsZXNzIEpQMiBvdXRwdXRcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmpwMih7IGxvc3NsZXNzOiB0cnVlIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IGFueSBpbnB1dCB0byB2ZXJ5IGhpZ2ggcXVhbGl0eSBKUDIgb3V0cHV0XG4gKiBjb25zdCBkYXRhID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5qcDIoe1xuICogICAgIHF1YWxpdHk6IDEwMCxcbiAqICAgICBjaHJvbWFTdWJzYW1wbGluZzogJzQ6NDo0J1xuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAc2luY2UgMC4yOS4xXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIG91dHB1dCBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucXVhbGl0eT04MF0gLSBxdWFsaXR5LCBpbnRlZ2VyIDEtMTAwXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxvc3NsZXNzPWZhbHNlXSAtIHVzZSBsb3NzbGVzcyBjb21wcmVzc2lvbiBtb2RlXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGlsZVdpZHRoPTUxMl0gLSBob3Jpem9udGFsIHRpbGUgc2l6ZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpbGVIZWlnaHQ9NTEyXSAtIHZlcnRpY2FsIHRpbGUgc2l6ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nPSc0OjQ6NCddIC0gc2V0IHRvICc0OjI6MCcgdG8gdXNlIGNocm9tYSBzdWJzYW1wbGluZ1xuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBqcDIgKG9wdGlvbnMpIHtcbiAgaWYgKCF0aGlzLmNvbnN0cnVjdG9yLmZvcm1hdC5qcDJrLm91dHB1dC5idWZmZXIpIHtcbiAgICB0aHJvdyBlcnJKcDJTYXZlKCk7XG4gIH1cbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucXVhbGl0eSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMucXVhbGl0eSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnF1YWxpdHksIDEsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwMlF1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3F1YWxpdHknLCAnaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCcsIG9wdGlvbnMucXVhbGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubG9zc2xlc3MpKSB7XG4gICAgICBpZiAoaXMuYm9vbChvcHRpb25zLmxvc3NsZXNzKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanAyTG9zc2xlc3MgPSBvcHRpb25zLmxvc3NsZXNzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdsb3NzbGVzcycsICdib29sZWFuJywgb3B0aW9ucy5sb3NzbGVzcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMudGlsZVdpZHRoKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy50aWxlV2lkdGgpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy50aWxlV2lkdGgsIDEsIDMyNzY4KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanAyVGlsZVdpZHRoID0gb3B0aW9ucy50aWxlV2lkdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3RpbGVXaWR0aCcsICdpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzI3NjgnLCBvcHRpb25zLnRpbGVXaWR0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMudGlsZUhlaWdodCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMudGlsZUhlaWdodCkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnRpbGVIZWlnaHQsIDEsIDMyNzY4KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanAyVGlsZUhlaWdodCA9IG9wdGlvbnMudGlsZUhlaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGlsZUhlaWdodCcsICdpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzI3NjgnLCBvcHRpb25zLnRpbGVIZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmcsIFsnNDoyOjAnLCAnNDo0OjQnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwMkNocm9tYVN1YnNhbXBsaW5nID0gb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY2hyb21hU3Vic2FtcGxpbmcnLCAnb25lIG9mOiA0OjI6MCwgNDo0OjQnLCBvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgnanAyJywgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogU2V0IGFuaW1hdGlvbiBvcHRpb25zIGlmIGF2YWlsYWJsZS5cbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtzb3VyY2VdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc291cmNlLmxvb3A9MF0gLSBudW1iZXIgb2YgYW5pbWF0aW9uIGl0ZXJhdGlvbnMsIHVzZSAwIGZvciBpbmZpbml0ZSBhbmltYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyW119IFtzb3VyY2UuZGVsYXldIC0gbGlzdCBvZiBkZWxheXMgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzIChpbiBtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gLSB0YXJnZXQgb2JqZWN0IGZvciB2YWxpZCBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHRyeVNldEFuaW1hdGlvbk9wdGlvbnMgKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIGlmIChpcy5vYmplY3Qoc291cmNlKSAmJiBpcy5kZWZpbmVkKHNvdXJjZS5sb29wKSkge1xuICAgIGlmIChpcy5pbnRlZ2VyKHNvdXJjZS5sb29wKSAmJiBpcy5pblJhbmdlKHNvdXJjZS5sb29wLCAwLCA2NTUzNSkpIHtcbiAgICAgIHRhcmdldC5sb29wID0gc291cmNlLmxvb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbG9vcCcsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNjU1MzUnLCBzb3VyY2UubG9vcCk7XG4gICAgfVxuICB9XG4gIGlmIChpcy5vYmplY3Qoc291cmNlKSAmJiBpcy5kZWZpbmVkKHNvdXJjZS5kZWxheSkpIHtcbiAgICAvLyBXZSBhbGxvdyBzaW5ndWxhciB2YWx1ZXMgYXMgd2VsbFxuICAgIGlmIChpcy5pbnRlZ2VyKHNvdXJjZS5kZWxheSkgJiYgaXMuaW5SYW5nZShzb3VyY2UuZGVsYXksIDAsIDY1NTM1KSkge1xuICAgICAgdGFyZ2V0LmRlbGF5ID0gW3NvdXJjZS5kZWxheV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIEFycmF5LmlzQXJyYXkoc291cmNlLmRlbGF5KSAmJlxuICAgICAgc291cmNlLmRlbGF5LmV2ZXJ5KGlzLmludGVnZXIpICYmXG4gICAgICBzb3VyY2UuZGVsYXkuZXZlcnkodiA9PiBpcy5pblJhbmdlKHYsIDAsIDY1NTM1KSkpIHtcbiAgICAgIHRhcmdldC5kZWxheSA9IHNvdXJjZS5kZWxheTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdkZWxheScsICdpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIGludGVnZXJzIGJldHdlZW4gMCBhbmQgNjU1MzUnLCBzb3VyY2UuZGVsYXkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFVzZSB0aGVzZSBUSUZGIG9wdGlvbnMgZm9yIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBUaGUgYGRlbnNpdHlgIGNhbiBiZSBzZXQgaW4gcGl4ZWxzL2luY2ggdmlhIHtAbGluayAjd2l0aG1ldGFkYXRhfHdpdGhNZXRhZGF0YX1cbiAqIGluc3RlYWQgb2YgcHJvdmlkaW5nIGB4cmVzYCBhbmQgYHlyZXNgIGluIHBpeGVscy9tbS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBTVkcgaW5wdXQgdG8gTFpXLWNvbXByZXNzZWQsIDEgYml0IHBlciBwaXhlbCBUSUZGIG91dHB1dFxuICogc2hhcnAoJ2lucHV0LnN2ZycpXG4gKiAgIC50aWZmKHtcbiAqICAgICBjb21wcmVzc2lvbjogJ2x6dycsXG4gKiAgICAgYml0ZGVwdGg6IDFcbiAqICAgfSlcbiAqICAgLnRvRmlsZSgnMS1icHAtb3V0cHV0LnRpZmYnKVxuICogICAudGhlbihpbmZvID0+IHsgLi4uIH0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBvdXRwdXQgb3B0aW9uc1xuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnF1YWxpdHk9ODBdIC0gcXVhbGl0eSwgaW50ZWdlciAxLTEwMFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JjZT10cnVlXSAtIGZvcmNlIFRJRkYgb3V0cHV0LCBvdGhlcndpc2UgYXR0ZW1wdCB0byB1c2UgaW5wdXQgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29tcHJlc3Npb249J2pwZWcnXSAtIGNvbXByZXNzaW9uIG9wdGlvbnM6IG5vbmUsIGpwZWcsIGRlZmxhdGUsIHBhY2tiaXRzLCBjY2l0dGZheDQsIGx6dywgd2VicCwgenN0ZCwganAya1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnByZWRpY3Rvcj0naG9yaXpvbnRhbCddIC0gY29tcHJlc3Npb24gcHJlZGljdG9yIG9wdGlvbnM6IG5vbmUsIGhvcml6b250YWwsIGZsb2F0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnB5cmFtaWQ9ZmFsc2VdIC0gd3JpdGUgYW4gaW1hZ2UgcHlyYW1pZFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50aWxlPWZhbHNlXSAtIHdyaXRlIGEgdGlsZWQgdGlmZlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpbGVXaWR0aD0yNTZdIC0gaG9yaXpvbnRhbCB0aWxlIHNpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aWxlSGVpZ2h0PTI1Nl0gLSB2ZXJ0aWNhbCB0aWxlIHNpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy54cmVzPTEuMF0gLSBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gcGl4ZWxzL21tXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMueXJlcz0xLjBdIC0gdmVydGljYWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMvbW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5yZXNvbHV0aW9uVW5pdD0naW5jaCddIC0gcmVzb2x1dGlvbiB1bml0IG9wdGlvbnM6IGluY2gsIGNtXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYml0ZGVwdGg9OF0gLSByZWR1Y2UgYml0ZGVwdGggdG8gMSwgMiBvciA0IGJpdFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5taW5pc3doaXRlPWZhbHNlXSAtIHdyaXRlIDEtYml0IGltYWdlcyBhcyBtaW5pc3doaXRlXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHRpZmYgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucXVhbGl0eSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMucXVhbGl0eSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnF1YWxpdHksIDEsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZRdWFsaXR5ID0gb3B0aW9ucy5xdWFsaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmJpdGRlcHRoKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5iaXRkZXB0aCkgJiYgaXMuaW5BcnJheShvcHRpb25zLmJpdGRlcHRoLCBbMSwgMiwgNCwgOF0pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50aWZmQml0ZGVwdGggPSBvcHRpb25zLmJpdGRlcHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdiaXRkZXB0aCcsICcxLCAyLCA0IG9yIDgnLCBvcHRpb25zLmJpdGRlcHRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGlsaW5nXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy50aWxlKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbigndGlmZlRpbGUnLCBvcHRpb25zLnRpbGUpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnRpbGVXaWR0aCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMudGlsZVdpZHRoKSAmJiBvcHRpb25zLnRpbGVXaWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZUaWxlV2lkdGggPSBvcHRpb25zLnRpbGVXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGlsZVdpZHRoJywgJ2ludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8nLCBvcHRpb25zLnRpbGVXaWR0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMudGlsZUhlaWdodCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMudGlsZUhlaWdodCkgJiYgb3B0aW9ucy50aWxlSGVpZ2h0ID4gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlmZlRpbGVIZWlnaHQgPSBvcHRpb25zLnRpbGVIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3RpbGVIZWlnaHQnLCAnaW50ZWdlciBncmVhdGVyIHRoYW4gemVybycsIG9wdGlvbnMudGlsZUhlaWdodCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG1pbmlzd2hpdGVcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLm1pbmlzd2hpdGUpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd0aWZmTWluaXN3aGl0ZScsIG9wdGlvbnMubWluaXN3aGl0ZSk7XG4gICAgfVxuICAgIC8vIHB5cmFtaWRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnB5cmFtaWQpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd0aWZmUHlyYW1pZCcsIG9wdGlvbnMucHlyYW1pZCk7XG4gICAgfVxuICAgIC8vIHJlc29sdXRpb25cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnhyZXMpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMueHJlcykgJiYgb3B0aW9ucy54cmVzID4gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlmZlhyZXMgPSBvcHRpb25zLnhyZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3hyZXMnLCAnbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvJywgb3B0aW9ucy54cmVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy55cmVzKSkge1xuICAgICAgaWYgKGlzLm51bWJlcihvcHRpb25zLnlyZXMpICYmIG9wdGlvbnMueXJlcyA+IDApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZZcmVzID0gb3B0aW9ucy55cmVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd5cmVzJywgJ251bWJlciBncmVhdGVyIHRoYW4gemVybycsIG9wdGlvbnMueXJlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbXByZXNzaW9uXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5jb21wcmVzc2lvbikpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcob3B0aW9ucy5jb21wcmVzc2lvbikgJiYgaXMuaW5BcnJheShvcHRpb25zLmNvbXByZXNzaW9uLCBbJ25vbmUnLCAnanBlZycsICdkZWZsYXRlJywgJ3BhY2tiaXRzJywgJ2NjaXR0ZmF4NCcsICdsencnLCAnd2VicCcsICd6c3RkJywgJ2pwMmsnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZDb21wcmVzc2lvbiA9IG9wdGlvbnMuY29tcHJlc3Npb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbXByZXNzaW9uJywgJ29uZSBvZjogbm9uZSwganBlZywgZGVmbGF0ZSwgcGFja2JpdHMsIGNjaXR0ZmF4NCwgbHp3LCB3ZWJwLCB6c3RkLCBqcDJrJywgb3B0aW9ucy5jb21wcmVzc2lvbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHByZWRpY3RvclxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucHJlZGljdG9yKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLnByZWRpY3RvcikgJiYgaXMuaW5BcnJheShvcHRpb25zLnByZWRpY3RvciwgWydub25lJywgJ2hvcml6b250YWwnLCAnZmxvYXQnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZQcmVkaWN0b3IgPSBvcHRpb25zLnByZWRpY3RvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncHJlZGljdG9yJywgJ29uZSBvZjogbm9uZSwgaG9yaXpvbnRhbCwgZmxvYXQnLCBvcHRpb25zLnByZWRpY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHJlc29sdXRpb25Vbml0XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5yZXNvbHV0aW9uVW5pdCkpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcob3B0aW9ucy5yZXNvbHV0aW9uVW5pdCkgJiYgaXMuaW5BcnJheShvcHRpb25zLnJlc29sdXRpb25Vbml0LCBbJ2luY2gnLCAnY20nXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZSZXNvbHV0aW9uVW5pdCA9IG9wdGlvbnMucmVzb2x1dGlvblVuaXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3Jlc29sdXRpb25Vbml0JywgJ29uZSBvZjogaW5jaCwgY20nLCBvcHRpb25zLnJlc29sdXRpb25Vbml0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgndGlmZicsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFVzZSB0aGVzZSBBVklGIG9wdGlvbnMgZm9yIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBBVklGIGltYWdlIHNlcXVlbmNlcyBhcmUgbm90IHN1cHBvcnRlZC5cbiAqIFByZWJ1aWx0IGJpbmFyaWVzIHN1cHBvcnQgYSBiaXRkZXB0aCBvZiA4IG9ubHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmF2aWYoeyBlZmZvcnQ6IDIgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmF2aWYoeyBsb3NzbGVzczogdHJ1ZSB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAc2luY2UgMC4yNy4wXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIG91dHB1dCBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucXVhbGl0eT01MF0gLSBxdWFsaXR5LCBpbnRlZ2VyIDEtMTAwXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxvc3NsZXNzPWZhbHNlXSAtIHVzZSBsb3NzbGVzcyBjb21wcmVzc2lvblxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmVmZm9ydD00XSAtIENQVSBlZmZvcnQsIGJldHdlZW4gMCAoZmFzdGVzdCkgYW5kIDkgKHNsb3dlc3QpXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmc9JzQ6NDo0J10gLSBzZXQgdG8gJzQ6MjowJyB0byB1c2UgY2hyb21hIHN1YnNhbXBsaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYml0ZGVwdGg9OF0gLSBzZXQgYml0ZGVwdGggdG8gOCwgMTAgb3IgMTIgYml0XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGF2aWYgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuaGVpZih7IC4uLm9wdGlvbnMsIGNvbXByZXNzaW9uOiAnYXYxJyB9KTtcbn1cblxuLyoqXG4gKiBVc2UgdGhlc2UgSEVJRiBvcHRpb25zIGZvciBvdXRwdXQgaW1hZ2UuXG4gKlxuICogU3VwcG9ydCBmb3IgcGF0ZW50LWVuY3VtYmVyZWQgSEVJQyBpbWFnZXMgdXNpbmcgYGhldmNgIGNvbXByZXNzaW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYVxuICogZ2xvYmFsbHktaW5zdGFsbGVkIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBsaWJoZWlmLCBsaWJkZTI2NSBhbmQgeDI2NS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuaGVpZih7IGNvbXByZXNzaW9uOiAnaGV2YycgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHNpbmNlIDAuMjMuMFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmNvbXByZXNzaW9uIC0gY29tcHJlc3Npb24gZm9ybWF0OiBhdjEsIGhldmNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFsaXR5PTUwXSAtIHF1YWxpdHksIGludGVnZXIgMS0xMDBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubG9zc2xlc3M9ZmFsc2VdIC0gdXNlIGxvc3NsZXNzIGNvbXByZXNzaW9uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZWZmb3J0PTRdIC0gQ1BVIGVmZm9ydCwgYmV0d2VlbiAwIChmYXN0ZXN0KSBhbmQgOSAoc2xvd2VzdClcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZz0nNDo0OjQnXSAtIHNldCB0byAnNDoyOjAnIHRvIHVzZSBjaHJvbWEgc3Vic2FtcGxpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5iaXRkZXB0aD04XSAtIHNldCBiaXRkZXB0aCB0byA4LCAxMCBvciAxMiBiaXRcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gaGVpZiAob3B0aW9ucykge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmNvbXByZXNzaW9uKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuY29tcHJlc3Npb24sIFsnYXYxJywgJ2hldmMnXSkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlmQ29tcHJlc3Npb24gPSBvcHRpb25zLmNvbXByZXNzaW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbXByZXNzaW9uJywgJ29uZSBvZjogYXYxLCBoZXZjJywgb3B0aW9ucy5jb21wcmVzc2lvbik7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucXVhbGl0eSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMucXVhbGl0eSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnF1YWxpdHksIDEsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWZRdWFsaXR5ID0gb3B0aW9ucy5xdWFsaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmxvc3NsZXNzKSkge1xuICAgICAgaWYgKGlzLmJvb2wob3B0aW9ucy5sb3NzbGVzcykpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWZMb3NzbGVzcyA9IG9wdGlvbnMubG9zc2xlc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2xvc3NsZXNzJywgJ2Jvb2xlYW4nLCBvcHRpb25zLmxvc3NsZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5lZmZvcnQpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLmVmZm9ydCkgJiYgaXMuaW5SYW5nZShvcHRpb25zLmVmZm9ydCwgMCwgOSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWZFZmZvcnQgPSBvcHRpb25zLmVmZm9ydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZWZmb3J0JywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCA5Jywgb3B0aW9ucy5lZmZvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmcsIFsnNDoyOjAnLCAnNDo0OjQnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWZDaHJvbWFTdWJzYW1wbGluZyA9IG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2Nocm9tYVN1YnNhbXBsaW5nJywgJ29uZSBvZjogNDoyOjAsIDQ6NDo0Jywgb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuYml0ZGVwdGgpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLmJpdGRlcHRoKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuYml0ZGVwdGgsIFs4LCAxMCwgMTJdKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5iaXRkZXB0aCAhPT0gOCAmJiB0aGlzLmNvbnN0cnVjdG9yLnZlcnNpb25zLmhlaWYpIHtcbiAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2JpdGRlcHRoIHdoZW4gdXNpbmcgcHJlYnVpbHQgYmluYXJpZXMnLCA4LCBvcHRpb25zLmJpdGRlcHRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVpZkJpdGRlcHRoID0gb3B0aW9ucy5iaXRkZXB0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignYml0ZGVwdGgnLCAnOCwgMTAgb3IgMTInLCBvcHRpb25zLmJpdGRlcHRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zJywgJ09iamVjdCcsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiB0aGlzLl91cGRhdGVGb3JtYXRPdXQoJ2hlaWYnLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBVc2UgdGhlc2UgSlBFRy1YTCAoSlhMKSBvcHRpb25zIGZvciBvdXRwdXQgaW1hZ2UuXG4gKlxuICogVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbCwgcGxlYXNlIGRvIG5vdCB1c2UgaW4gcHJvZHVjdGlvbiBzeXN0ZW1zLlxuICpcbiAqIFJlcXVpcmVzIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBsaWJqeGwuXG4gKiBUaGUgcHJlYnVpbHQgYmluYXJpZXMgZG8gbm90IGluY2x1ZGUgdGhpcyAtIHNlZVxuICoge0BsaW5rIGh0dHBzOi8vc2hhcnAucGl4ZWxwbHVtYmluZy5jb20vaW5zdGFsbCNjdXN0b20tbGlidmlwcyBpbnN0YWxsaW5nIGEgY3VzdG9tIGxpYnZpcHN9LlxuICpcbiAqIEltYWdlIG1ldGFkYXRhIChFWElGLCBYTVApIGlzIHVuc3VwcG9ydGVkLlxuICpcbiAqIEBzaW5jZSAwLjMxLjNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5kaXN0YW5jZT0xLjBdIC0gbWF4aW11bSBlbmNvZGluZyBlcnJvciwgYmV0d2VlbiAwIChoaWdoZXN0IHF1YWxpdHkpIGFuZCAxNSAobG93ZXN0IHF1YWxpdHkpXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucXVhbGl0eV0gLSBjYWxjdWxhdGUgYGRpc3RhbmNlYCBiYXNlZCBvbiBKUEVHLWxpa2UgcXVhbGl0eSwgYmV0d2VlbiAxIGFuZCAxMDAsIG92ZXJyaWRlcyBkaXN0YW5jZSBpZiBzcGVjaWZpZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5kZWNvZGluZ1RpZXI9MF0gLSB0YXJnZXQgZGVjb2RlIHNwZWVkIHRpZXIsIGJldHdlZW4gMCAoaGlnaGVzdCBxdWFsaXR5KSBhbmQgNCAobG93ZXN0IHF1YWxpdHkpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxvc3NsZXNzPWZhbHNlXSAtIHVzZSBsb3NzbGVzcyBjb21wcmVzc2lvblxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmVmZm9ydD03XSAtIENQVSBlZmZvcnQsIGJldHdlZW4gMyAoZmFzdGVzdCkgYW5kIDkgKHNsb3dlc3QpXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGp4bCAob3B0aW9ucykge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5xdWFsaXR5KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5xdWFsaXR5KSAmJiBpcy5pblJhbmdlKG9wdGlvbnMucXVhbGl0eSwgMSwgMTAwKSkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGlianhsL2xpYmp4bC9ibG9iLzBhZWVhN2YxODBiYWZkNjg5M2MxZGI4MDcyZGNiNjdkMmFhNWIwM2QvdG9vbHMvY2p4bF9tYWluLmNjI0w2NDAtTDY0NFxuICAgICAgICB0aGlzLm9wdGlvbnMuanhsRGlzdGFuY2UgPSBvcHRpb25zLnF1YWxpdHkgPj0gMzBcbiAgICAgICAgICA/IDAuMSArICgxMDAgLSBvcHRpb25zLnF1YWxpdHkpICogMC4wOVxuICAgICAgICAgIDogNTMgLyAzMDAwICogb3B0aW9ucy5xdWFsaXR5ICogb3B0aW9ucy5xdWFsaXR5IC0gMjMgLyAyMCAqIG9wdGlvbnMucXVhbGl0eSArIDI1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmRpc3RhbmNlKSkge1xuICAgICAgaWYgKGlzLm51bWJlcihvcHRpb25zLmRpc3RhbmNlKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuZGlzdGFuY2UsIDAsIDE1KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanhsRGlzdGFuY2UgPSBvcHRpb25zLmRpc3RhbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdkaXN0YW5jZScsICdudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDE1LjAnLCBvcHRpb25zLmRpc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5kZWNvZGluZ1RpZXIpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLmRlY29kaW5nVGllcikgJiYgaXMuaW5SYW5nZShvcHRpb25zLmRlY29kaW5nVGllciwgMCwgNCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmp4bERlY29kaW5nVGllciA9IG9wdGlvbnMuZGVjb2RpbmdUaWVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdkZWNvZGluZ1RpZXInLCAnaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDQnLCBvcHRpb25zLmRlY29kaW5nVGllcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubG9zc2xlc3MpKSB7XG4gICAgICBpZiAoaXMuYm9vbChvcHRpb25zLmxvc3NsZXNzKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanhsTG9zc2xlc3MgPSBvcHRpb25zLmxvc3NsZXNzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdsb3NzbGVzcycsICdib29sZWFuJywgb3B0aW9ucy5sb3NzbGVzcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZWZmb3J0KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5lZmZvcnQpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5lZmZvcnQsIDMsIDkpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5qeGxFZmZvcnQgPSBvcHRpb25zLmVmZm9ydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZWZmb3J0JywgJ2ludGVnZXIgYmV0d2VlbiAzIGFuZCA5Jywgb3B0aW9ucy5lZmZvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fdXBkYXRlRm9ybWF0T3V0KCdqeGwnLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBGb3JjZSBvdXRwdXQgdG8gYmUgcmF3LCB1bmNvbXByZXNzZWQgcGl4ZWwgZGF0YS5cbiAqIFBpeGVsIG9yZGVyaW5nIGlzIGxlZnQtdG8tcmlnaHQsIHRvcC10by1ib3R0b20sIHdpdGhvdXQgcGFkZGluZy5cbiAqIENoYW5uZWwgb3JkZXJpbmcgd2lsbCBiZSBSR0Igb3IgUkdCQSBmb3Igbm9uLWdyZXlzY2FsZSBjb2xvdXJzcGFjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV4dHJhY3QgcmF3LCB1bnNpZ25lZCA4LWJpdCBSR0IgcGl4ZWwgZGF0YSBmcm9tIEpQRUcgaW5wdXRcbiAqIGNvbnN0IHsgZGF0YSwgaW5mbyB9ID0gYXdhaXQgc2hhcnAoJ2lucHV0LmpwZycpXG4gKiAgIC5yYXcoKVxuICogICAudG9CdWZmZXIoeyByZXNvbHZlV2l0aE9iamVjdDogdHJ1ZSB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXh0cmFjdCBhbHBoYSBjaGFubmVsIGFzIHJhdywgdW5zaWduZWQgMTYtYml0IHBpeGVsIGRhdGEgZnJvbSBQTkcgaW5wdXRcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycCgnaW5wdXQucG5nJylcbiAqICAgLmVuc3VyZUFscGhhKClcbiAqICAgLmV4dHJhY3RDaGFubmVsKDMpXG4gKiAgIC50b0NvbG91cnNwYWNlKCdiLXcnKVxuICogICAucmF3KHsgZGVwdGg6ICd1c2hvcnQnIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBvdXRwdXQgb3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRlcHRoPSd1Y2hhciddIC0gYml0IGRlcHRoLCBvbmUgb2Y6IGNoYXIsIHVjaGFyIChkZWZhdWx0KSwgc2hvcnQsIHVzaG9ydCwgaW50LCB1aW50LCBmbG9hdCwgY29tcGxleCwgZG91YmxlLCBkcGNvbXBsZXhcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gcmF3IChvcHRpb25zKSB7XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmRlcHRoKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmRlcHRoKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuZGVwdGgsXG4gICAgICAgIFsnY2hhcicsICd1Y2hhcicsICdzaG9ydCcsICd1c2hvcnQnLCAnaW50JywgJ3VpbnQnLCAnZmxvYXQnLCAnY29tcGxleCcsICdkb3VibGUnLCAnZHBjb21wbGV4J11cbiAgICAgICkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnJhd0RlcHRoID0gb3B0aW9ucy5kZXB0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZGVwdGgnLCAnb25lIG9mOiBjaGFyLCB1Y2hhciwgc2hvcnQsIHVzaG9ydCwgaW50LCB1aW50LCBmbG9hdCwgY29tcGxleCwgZG91YmxlLCBkcGNvbXBsZXgnLCBvcHRpb25zLmRlcHRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgncmF3Jyk7XG59XG5cbi8qKlxuICogVXNlIHRpbGUtYmFzZWQgZGVlcCB6b29tIChpbWFnZSBweXJhbWlkKSBvdXRwdXQuXG4gKlxuICogU2V0IHRoZSBmb3JtYXQgYW5kIG9wdGlvbnMgZm9yIHRpbGUgaW1hZ2VzIHZpYSB0aGUgYHRvRm9ybWF0YCwgYGpwZWdgLCBgcG5nYCBvciBgd2VicGAgZnVuY3Rpb25zLlxuICogVXNlIGEgYC56aXBgIG9yIGAuc3ppYCBmaWxlIGV4dGVuc2lvbiB3aXRoIGB0b0ZpbGVgIHRvIHdyaXRlIHRvIGEgY29tcHJlc3NlZCBhcmNoaXZlIGZpbGUgZm9ybWF0LlxuICpcbiAqIFRoZSBjb250YWluZXIgd2lsbCBiZSBzZXQgdG8gYHppcGAgd2hlbiB0aGUgb3V0cHV0IGlzIGEgQnVmZmVyIG9yIFN0cmVhbSwgb3RoZXJ3aXNlIGl0IHdpbGwgZGVmYXVsdCB0byBgZnNgLlxuICpcbiAqIFJlcXVpcmVzIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBsaWJnc2YuXG4gKiBUaGUgcHJlYnVpbHQgYmluYXJpZXMgZG8gbm90IGluY2x1ZGUgdGhpcyAtIHNlZVxuICoge0BsaW5rIGh0dHBzOi8vc2hhcnAucGl4ZWxwbHVtYmluZy5jb20vaW5zdGFsbCNjdXN0b20tbGlidmlwcyBpbnN0YWxsaW5nIGEgY3VzdG9tIGxpYnZpcHN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgc2hhcnAoJ2lucHV0LnRpZmYnKVxuICogICAucG5nKClcbiAqICAgLnRpbGUoe1xuICogICAgIHNpemU6IDUxMlxuICogICB9KVxuICogICAudG9GaWxlKCdvdXRwdXQuZHonLCBmdW5jdGlvbihlcnIsIGluZm8pIHtcbiAqICAgICAvLyBvdXRwdXQuZHppIGlzIHRoZSBEZWVwIFpvb20gWE1MIGRlZmluaXRpb25cbiAqICAgICAvLyBvdXRwdXRfZmlsZXMgY29udGFpbnMgNTEyeDUxMiB0aWxlcyBncm91cGVkIGJ5IHpvb20gbGV2ZWxcbiAqICAgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHppcEZpbGVXaXRoVGlsZXMgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnRpbGUoeyBiYXNlbmFtZTogXCJ0aWxlc1wiIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBpaWlmaWZpZXIgPSBzaGFycCgpLnRpbGUoeyBsYXlvdXQ6IFwiaWlpZlwiIH0pO1xuICogcmVhZGFibGVTdHJlYW1cbiAqICAgLnBpcGUoaWlpZmlmaWVyKVxuICogICAucGlwZSh3cml0ZWFibGVTdHJlYW0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zaXplPTI1Nl0gdGlsZSBzaXplIGluIHBpeGVscywgYSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDgxOTIuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMub3ZlcmxhcD0wXSB0aWxlIG92ZXJsYXAgaW4gcGl4ZWxzLCBhIHZhbHVlIGJldHdlZW4gMCBhbmQgODE5Mi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5hbmdsZT0wXSB0aWxlIGFuZ2xlIG9mIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAuXG4gKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IFtvcHRpb25zLmJhY2tncm91bmQ9e3I6IDI1NSwgZzogMjU1LCBiOiAyNTUsIGFscGhhOiAxfV0gLSBiYWNrZ3JvdW5kIGNvbG91ciwgcGFyc2VkIGJ5IHRoZSBbY29sb3JdKGh0dHBzOi8vd3d3Lm5wbWpzLm9yZy9wYWNrYWdlL2NvbG9yKSBtb2R1bGUsIGRlZmF1bHRzIHRvIHdoaXRlIHdpdGhvdXQgdHJhbnNwYXJlbmN5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRlcHRoXSBob3cgZGVlcCB0byBtYWtlIHRoZSBweXJhbWlkLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBvbmVwaXhlbGAsIGBvbmV0aWxlYCBvciBgb25lYCwgZGVmYXVsdCBiYXNlZCBvbiBsYXlvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2tpcEJsYW5rcz0tMV0gVGhyZXNob2xkIHRvIHNraXAgdGlsZSBnZW5lcmF0aW9uLiBSYW5nZSBpcyAwLTI1NSBmb3IgOC1iaXQgaW1hZ2VzLCAwLTY1NTM1IGZvciAxNi1iaXQgaW1hZ2VzLiBEZWZhdWx0IGlzIDUgZm9yIGBnb29nbGVgIGxheW91dCwgLTEgKG5vIHNraXApIG90aGVyd2lzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb250YWluZXI9J2ZzJ10gdGlsZSBjb250YWluZXIsIHdpdGggdmFsdWUgYGZzYCAoZmlsZXN5c3RlbSkgb3IgYHppcGAgKGNvbXByZXNzZWQgZmlsZSkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGF5b3V0PSdkeiddIGZpbGVzeXN0ZW0gbGF5b3V0LCBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBkemAsIGBpaWlmYCwgYGlpaWYzYCwgYHpvb21pZnlgIG9yIGBnb29nbGVgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jZW50cmU9ZmFsc2VdIGNlbnRyZSBpbWFnZSBpbiB0aWxlLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jZW50ZXI9ZmFsc2VdIGFsdGVybmF0aXZlIHNwZWxsaW5nIG9mIGNlbnRyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5pZD0naHR0cHM6Ly9leGFtcGxlLmNvbS9paWlmJ10gd2hlbiBgbGF5b3V0YCBpcyBgaWlpZmAvYGlpaWYzYCwgc2V0cyB0aGUgYEBpZGAvYGlkYCBhdHRyaWJ1dGUgb2YgYGluZm8uanNvbmBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5iYXNlbmFtZV0gdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHppcCBmaWxlIHdoZW4gY29udGFpbmVyIGlzIGB6aXBgLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiB0aWxlIChvcHRpb25zKSB7XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICAvLyBTaXplIG9mIHNxdWFyZSB0aWxlcywgaW4gcGl4ZWxzXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5zaXplKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5zaXplKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuc2l6ZSwgMSwgODE5MikpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpbGVTaXplID0gb3B0aW9ucy5zaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdzaXplJywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCA4MTkyJywgb3B0aW9ucy5zaXplKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gT3ZlcmxhcCBvZiB0aWxlcywgaW4gcGl4ZWxzXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5vdmVybGFwKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5vdmVybGFwKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMub3ZlcmxhcCwgMCwgODE5MikpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMub3ZlcmxhcCA+IHRoaXMub3B0aW9ucy50aWxlU2l6ZSkge1xuICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3ZlcmxhcCcsIGA8PSBzaXplICgke3RoaXMub3B0aW9ucy50aWxlU2l6ZX0pYCwgb3B0aW9ucy5vdmVybGFwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMudGlsZU92ZXJsYXAgPSBvcHRpb25zLm92ZXJsYXA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ292ZXJsYXAnLCAnaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDgxOTInLCBvcHRpb25zLm92ZXJsYXApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDb250YWluZXJcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmNvbnRhaW5lcikpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcob3B0aW9ucy5jb250YWluZXIpICYmIGlzLmluQXJyYXkob3B0aW9ucy5jb250YWluZXIsIFsnZnMnLCAnemlwJ10pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50aWxlQ29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbnRhaW5lcicsICdvbmUgb2Y6IGZzLCB6aXAnLCBvcHRpb25zLmNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExheW91dFxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubGF5b3V0KSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmxheW91dCkgJiYgaXMuaW5BcnJheShvcHRpb25zLmxheW91dCwgWydkeicsICdnb29nbGUnLCAnaWlpZicsICdpaWlmMycsICd6b29taWZ5J10pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50aWxlTGF5b3V0ID0gb3B0aW9ucy5sYXlvdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2xheW91dCcsICdvbmUgb2Y6IGR6LCBnb29nbGUsIGlpaWYsIGlpaWYzLCB6b29taWZ5Jywgb3B0aW9ucy5sYXlvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBbmdsZSBvZiByb3RhdGlvbixcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmFuZ2xlKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5hbmdsZSkgJiYgIShvcHRpb25zLmFuZ2xlICUgOTApKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50aWxlQW5nbGUgPSBvcHRpb25zLmFuZ2xlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhbmdsZScsICdwb3NpdGl2ZS9uZWdhdGl2ZSBtdWx0aXBsZSBvZiA5MCcsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYWNrZ3JvdW5kIGNvbG91clxuICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvdXJPcHRpb24oJ3RpbGVCYWNrZ3JvdW5kJywgb3B0aW9ucy5iYWNrZ3JvdW5kKTtcbiAgICAvLyBEZXB0aCBvZiB0aWxlc1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZGVwdGgpKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKG9wdGlvbnMuZGVwdGgpICYmIGlzLmluQXJyYXkob3B0aW9ucy5kZXB0aCwgWydvbmVwaXhlbCcsICdvbmV0aWxlJywgJ29uZSddKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlsZURlcHRoID0gb3B0aW9ucy5kZXB0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZGVwdGgnLCAnb25lIG9mOiBvbmVwaXhlbCwgb25ldGlsZSwgb25lJywgb3B0aW9ucy5kZXB0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRocmVzaG9sZCB0byBza2lwIGJsYW5rIHRpbGVzXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5za2lwQmxhbmtzKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5za2lwQmxhbmtzKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuc2tpcEJsYW5rcywgLTEsIDY1NTM1KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlsZVNraXBCbGFua3MgPSBvcHRpb25zLnNraXBCbGFua3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3NraXBCbGFua3MnLCAnaW50ZWdlciBiZXR3ZWVuIC0xIGFuZCAyNTUvNjU1MzUnLCBvcHRpb25zLnNraXBCbGFua3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmxheW91dCkgJiYgb3B0aW9ucy5sYXlvdXQgPT09ICdnb29nbGUnKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGlsZVNraXBCbGFua3MgPSA1O1xuICAgIH1cbiAgICAvLyBDZW50ZXIgaW1hZ2UgaW4gdGlsZVxuICAgIGNvbnN0IGNlbnRyZSA9IGlzLmJvb2wob3B0aW9ucy5jZW50ZXIpID8gb3B0aW9ucy5jZW50ZXIgOiBvcHRpb25zLmNlbnRyZTtcbiAgICBpZiAoaXMuZGVmaW5lZChjZW50cmUpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd0aWxlQ2VudHJlJywgY2VudHJlKTtcbiAgICB9XG4gICAgLy8gQGlkIGF0dHJpYnV0ZSBmb3IgSUlJRiBsYXlvdXRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmlkKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmlkKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlsZUlkID0gb3B0aW9ucy5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignaWQnLCAnc3RyaW5nJywgb3B0aW9ucy5pZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEJhc2VuYW1lIGZvciB6aXAgY29udGFpbmVyXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5iYXNlbmFtZSkpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcob3B0aW9ucy5iYXNlbmFtZSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpbGVCYXNlbmFtZSA9IG9wdGlvbnMuYmFzZW5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2Jhc2VuYW1lJywgJ3N0cmluZycsIG9wdGlvbnMuYmFzZW5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBGb3JtYXRcbiAgaWYgKGlzLmluQXJyYXkodGhpcy5vcHRpb25zLmZvcm1hdE91dCwgWydqcGVnJywgJ3BuZycsICd3ZWJwJ10pKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpbGVGb3JtYXQgPSB0aGlzLm9wdGlvbnMuZm9ybWF0T3V0O1xuICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXRPdXQgIT09ICdpbnB1dCcpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2Zvcm1hdCcsICdvbmUgb2Y6IGpwZWcsIHBuZywgd2VicCcsIHRoaXMub3B0aW9ucy5mb3JtYXRPdXQpO1xuICB9XG4gIHJldHVybiB0aGlzLl91cGRhdGVGb3JtYXRPdXQoJ2R6Jyk7XG59XG5cbi8qKlxuICogU2V0IGEgdGltZW91dCBmb3IgcHJvY2Vzc2luZywgaW4gc2Vjb25kcy5cbiAqIFVzZSBhIHZhbHVlIG9mIHplcm8gdG8gY29udGludWUgcHJvY2Vzc2luZyBpbmRlZmluaXRlbHksIHRoZSBkZWZhdWx0IGJlaGF2aW91ci5cbiAqXG4gKiBUaGUgY2xvY2sgc3RhcnRzIHdoZW4gbGlidmlwcyBvcGVucyBhbiBpbnB1dCBpbWFnZSBmb3IgcHJvY2Vzc2luZy5cbiAqIFRpbWUgc3BlbnQgd2FpdGluZyBmb3IgYSBsaWJ1diB0aHJlYWQgdG8gYmVjb21lIGF2YWlsYWJsZSBpcyBub3QgaW5jbHVkZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVuc3VyZSBwcm9jZXNzaW5nIHRha2VzIG5vIGxvbmdlciB0aGFuIDMgc2Vjb25kc1xuICogdHJ5IHtcbiAqICAgY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAgIC5ibHVyKDEwMDApXG4gKiAgICAgLnRpbWVvdXQoeyBzZWNvbmRzOiAzIH0pXG4gKiAgICAgLnRvQnVmZmVyKCk7XG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKCd0aW1lb3V0JykpIHsgLi4uIH1cbiAqIH1cbiAqXG4gKiBAc2luY2UgMC4yOS4yXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnNlY29uZHMgLSBOdW1iZXIgb2Ygc2Vjb25kcyBhZnRlciB3aGljaCBwcm9jZXNzaW5nIHdpbGwgYmUgc3RvcHBlZFxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiB0aW1lb3V0IChvcHRpb25zKSB7XG4gIGlmICghaXMucGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMnLCAnb2JqZWN0Jywgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5zZWNvbmRzKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuc2Vjb25kcywgMCwgMzYwMCkpIHtcbiAgICB0aGlzLm9wdGlvbnMudGltZW91dFNlY29uZHMgPSBvcHRpb25zLnNlY29uZHM7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdzZWNvbmRzJywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCAzNjAwJywgb3B0aW9ucy5zZWNvbmRzKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIG91dHB1dCBmb3JtYXQgdW5sZXNzIG9wdGlvbnMuZm9yY2UgaXMgZmFsc2UsXG4gKiBpbiB3aGljaCBjYXNlIHJldmVydCB0byBpbnB1dCBmb3JtYXQuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdE91dFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JjZT10cnVlXSAtIGZvcmNlIG91dHB1dCBmb3JtYXQsIG90aGVyd2lzZSBhdHRlbXB0IHRvIHVzZSBpbnB1dCBmb3JtYXRcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqL1xuZnVuY3Rpb24gX3VwZGF0ZUZvcm1hdE91dCAoZm9ybWF0T3V0LCBvcHRpb25zKSB7XG4gIGlmICghKGlzLm9iamVjdChvcHRpb25zKSAmJiBvcHRpb25zLmZvcmNlID09PSBmYWxzZSkpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9ybWF0T3V0ID0gZm9ybWF0T3V0O1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBhIGJvb2xlYW4gYXR0cmlidXRlIG9mIHRoZSB0aGlzLm9wdGlvbnMgT2JqZWN0LlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsXG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBrZXlcbiAqL1xuZnVuY3Rpb24gX3NldEJvb2xlYW5PcHRpb24gKGtleSwgdmFsKSB7XG4gIGlmIChpcy5ib29sKHZhbCkpIHtcbiAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3Ioa2V5LCAnYm9vbGVhbicsIHZhbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgYnkgYSBXcml0ZWFibGVTdHJlYW0gdG8gbm90aWZ5IHVzIGl0IGlzIHJlYWR5IGZvciBkYXRhLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX3JlYWQgKCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoIXRoaXMub3B0aW9ucy5zdHJlYW1PdXQpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3RyZWFtT3V0ID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFjayA9IEVycm9yKCk7XG4gICAgdGhpcy5fcGlwZWxpbmUodW5kZWZpbmVkLCBzdGFjayk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2UgdGhlIEMrKyBpbWFnZSBwcm9jZXNzaW5nIHBpcGVsaW5lXG4gKiBTdXBwb3J0cyBjYWxsYmFjaywgc3RyZWFtIGFuZCBwcm9taXNlIHZhcmlhbnRzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcGlwZWxpbmUgKGNhbGxiYWNrLCBzdGFjaykge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gb3V0cHV0PWZpbGUvYnVmZmVyXG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgLy8gb3V0cHV0PWZpbGUvYnVmZmVyLCBpbnB1dD1zdHJlYW1cbiAgICAgIHRoaXMub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5fZmxhdHRlbkJ1ZmZlckluKCk7XG4gICAgICAgIHNoYXJwLnBpcGVsaW5lKHRoaXMub3B0aW9ucywgKGVyciwgZGF0YSwgaW5mbykgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSwgaW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdXRwdXQ9ZmlsZS9idWZmZXIsIGlucHV0PWZpbGUvYnVmZmVyXG4gICAgICBzaGFycC5waXBlbGluZSh0aGlzLm9wdGlvbnMsIChlcnIsIGRhdGEsIGluZm8pID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGNhbGxiYWNrKGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhLCBpbmZvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zdHJlYW1PdXQpIHtcbiAgICAvLyBvdXRwdXQ9c3RyZWFtXG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgLy8gb3V0cHV0PXN0cmVhbSwgaW5wdXQ9c3RyZWFtXG4gICAgICB0aGlzLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5fZmxhdHRlbkJ1ZmZlckluKCk7XG4gICAgICAgIHNoYXJwLnBpcGVsaW5lKHRoaXMub3B0aW9ucywgKGVyciwgZGF0YSwgaW5mbykgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBpcy5uYXRpdmVFcnJvcihlcnIsIHN0YWNrKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnaW5mbycsIGluZm8pO1xuICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnB1c2gobnVsbCk7XG4gICAgICAgICAgdGhpcy5vbignZW5kJywgKCkgPT4gdGhpcy5lbWl0KCdjbG9zZScpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnN0cmVhbUluRmluaXNoZWQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdmaW5pc2gnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3V0cHV0PXN0cmVhbSwgaW5wdXQ9ZmlsZS9idWZmZXJcbiAgICAgIHNoYXJwLnBpcGVsaW5lKHRoaXMub3B0aW9ucywgKGVyciwgZGF0YSwgaW5mbykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2luZm8nLCBpbmZvKTtcbiAgICAgICAgICB0aGlzLnB1c2goZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgICB0aGlzLm9uKCdlbmQnLCAoKSA9PiB0aGlzLmVtaXQoJ2Nsb3NlJykpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIC8vIG91dHB1dD1wcm9taXNlXG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgLy8gb3V0cHV0PXByb21pc2UsIGlucHV0PXN0cmVhbVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5vbmNlKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZmxhdHRlbkJ1ZmZlckluKCk7XG4gICAgICAgICAgc2hhcnAucGlwZWxpbmUodGhpcy5vcHRpb25zLCAoZXJyLCBkYXRhLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIHJlamVjdChpcy5uYXRpdmVFcnJvcihlcnIsIHN0YWNrKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlc29sdmVXaXRoT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRhdGEsIGluZm8gfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdXRwdXQ9cHJvbWlzZSwgaW5wdXQ9ZmlsZS9idWZmZXJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNoYXJwLnBpcGVsaW5lKHRoaXMub3B0aW9ucywgKGVyciwgZGF0YSwgaW5mbykgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChpcy5uYXRpdmVFcnJvcihlcnIsIHN0YWNrKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb2x2ZVdpdGhPYmplY3QpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRhdGEsIGluZm8gfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNvcmF0ZSB0aGUgU2hhcnAgcHJvdG90eXBlIHdpdGggb3V0cHV0LXJlbGF0ZWQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoU2hhcnApIHtcbiAgT2JqZWN0LmFzc2lnbihTaGFycC5wcm90b3R5cGUsIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0b0ZpbGUsXG4gICAgdG9CdWZmZXIsXG4gICAga2VlcEV4aWYsXG4gICAgd2l0aEV4aWYsXG4gICAgd2l0aEV4aWZNZXJnZSxcbiAgICBrZWVwSWNjUHJvZmlsZSxcbiAgICB3aXRoSWNjUHJvZmlsZSxcbiAgICBrZWVwTWV0YWRhdGEsXG4gICAgd2l0aE1ldGFkYXRhLFxuICAgIHRvRm9ybWF0LFxuICAgIGpwZWcsXG4gICAganAyLFxuICAgIHBuZyxcbiAgICB3ZWJwLFxuICAgIHRpZmYsXG4gICAgYXZpZixcbiAgICBoZWlmLFxuICAgIGp4bCxcbiAgICBnaWYsXG4gICAgcmF3LFxuICAgIHRpbGUsXG4gICAgdGltZW91dCxcbiAgICAvLyBQcml2YXRlXG4gICAgX3VwZGF0ZUZvcm1hdE91dCxcbiAgICBfc2V0Qm9vbGVhbk9wdGlvbixcbiAgICBfcmVhZCxcbiAgICBfcGlwZWxpbmVcbiAgfSk7XG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGV2ZW50cyA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJyk7XG5jb25zdCBkZXRlY3RMaWJjID0gcmVxdWlyZSgnZGV0ZWN0LWxpYmMnKTtcblxuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5jb25zdCB7IHJ1bnRpbWVQbGF0Zm9ybUFyY2ggfSA9IHJlcXVpcmUoJy4vbGlidmlwcycpO1xuY29uc3Qgc2hhcnAgPSByZXF1aXJlKCcuL3NoYXJwJyk7XG5cbmNvbnN0IHJ1bnRpbWVQbGF0Zm9ybSA9IHJ1bnRpbWVQbGF0Zm9ybUFyY2goKTtcbmNvbnN0IGxpYnZpcHNWZXJzaW9uID0gc2hhcnAubGlidmlwc1ZlcnNpb24oKTtcblxuLyoqXG4gKiBBbiBPYmplY3QgY29udGFpbmluZyBuZXN0ZWQgYm9vbGVhbiB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzL21ldGhvZHMuXG4gKiBAbWVtYmVyXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2coc2hhcnAuZm9ybWF0KTtcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IGZvcm1hdCA9IHNoYXJwLmZvcm1hdCgpO1xuZm9ybWF0LmhlaWYub3V0cHV0LmFsaWFzID0gWydhdmlmJywgJ2hlaWMnXTtcbmZvcm1hdC5qcGVnLm91dHB1dC5hbGlhcyA9IFsnanBlJywgJ2pwZyddO1xuZm9ybWF0LnRpZmYub3V0cHV0LmFsaWFzID0gWyd0aWYnXTtcbmZvcm1hdC5qcDJrLm91dHB1dC5hbGlhcyA9IFsnajJjJywgJ2oyaycsICdqcDInLCAnanB4J107XG5cbi8qKlxuICogQW4gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZSBpbnRlcnBvbGF0b3JzIGFuZCB0aGVpciBwcm9wZXIgdmFsdWVzXG4gKiBAcmVhZG9ubHlcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGludGVycG9sYXRvcnMgPSB7XG4gIC8qKiBbTmVhcmVzdCBuZWlnaGJvdXIgaW50ZXJwb2xhdGlvbl0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OZWFyZXN0LW5laWdoYm9yX2ludGVycG9sYXRpb24pLiBTdWl0YWJsZSBmb3IgaW1hZ2UgZW5sYXJnZW1lbnQgb25seS4gKi9cbiAgbmVhcmVzdDogJ25lYXJlc3QnLFxuICAvKiogW0JpbGluZWFyIGludGVycG9sYXRpb25dKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmlsaW5lYXJfaW50ZXJwb2xhdGlvbikuIEZhc3RlciB0aGFuIGJpY3ViaWMgYnV0IHdpdGggbGVzcyBzbW9vdGggcmVzdWx0cy4gKi9cbiAgYmlsaW5lYXI6ICdiaWxpbmVhcicsXG4gIC8qKiBbQmljdWJpYyBpbnRlcnBvbGF0aW9uXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpY3ViaWNfaW50ZXJwb2xhdGlvbikgKHRoZSBkZWZhdWx0KS4gKi9cbiAgYmljdWJpYzogJ2JpY3ViaWMnLFxuICAvKiogW0xCQiBpbnRlcnBvbGF0aW9uXShodHRwczovL2dpdGh1Yi5jb20vbGlidmlwcy9saWJ2aXBzL2Jsb2IvbWFzdGVyL2xpYnZpcHMvcmVzYW1wbGUvbGJiLmNwcCNMMTAwKS4gUHJldmVudHMgc29tZSBcIlthY3V0YW5jZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BY3V0YW5jZSlcIiBidXQgdHlwaWNhbGx5IHJlZHVjZXMgcGVyZm9ybWFuY2UgYnkgYSBmYWN0b3Igb2YgMi4gKi9cbiAgbG9jYWxseUJvdW5kZWRCaWN1YmljOiAnbGJiJyxcbiAgLyoqIFtOb2hhbG8gaW50ZXJwb2xhdGlvbl0oaHR0cDovL2VwcmludHMuc290b24uYWMudWsvMjY4MDg2LykuIFByZXZlbnRzIGFjdXRhbmNlIGJ1dCB0eXBpY2FsbHkgcmVkdWNlcyBwZXJmb3JtYW5jZSBieSBhIGZhY3RvciBvZiAzLiAqL1xuICBub2hhbG86ICdub2hhbG8nLFxuICAvKiogW1ZTUUJTIGludGVycG9sYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9saWJ2aXBzL2xpYnZpcHMvYmxvYi9tYXN0ZXIvbGlidmlwcy9yZXNhbXBsZS92c3Ficy5jcHAjTDQ4KS4gUHJldmVudHMgXCJzdGFpcmNhc2luZ1wiIHdoZW4gZW5sYXJnaW5nLiAqL1xuICB2ZXJ0ZXhTcGxpdFF1YWRyYXRpY0Jhc2lzU3BsaW5lOiAndnNxYnMnXG59O1xuXG4vKipcbiAqIEFuIE9iamVjdCBjb250YWluaW5nIHRoZSB2ZXJzaW9uIG51bWJlcnMgb2Ygc2hhcnAsIGxpYnZpcHNcbiAqIGFuZCAod2hlbiB1c2luZyBwcmVidWlsdCBiaW5hcmllcykgaXRzIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbWVtYmVyXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2coc2hhcnAudmVyc2lvbnMpO1xuICovXG5sZXQgdmVyc2lvbnMgPSB7XG4gIHZpcHM6IGxpYnZpcHNWZXJzaW9uLnNlbXZlclxufTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pZiAoIWxpYnZpcHNWZXJzaW9uLmlzR2xvYmFsKSB7XG4gIGlmICghbGlidmlwc1ZlcnNpb24uaXNXYXNtKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZlcnNpb25zID0gcmVxdWlyZShgQGltZy9zaGFycC0ke3J1bnRpbWVQbGF0Zm9ybX0vdmVyc2lvbnNgKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9ucyA9IHJlcXVpcmUoYEBpbWcvc2hhcnAtbGlidmlwcy0ke3J1bnRpbWVQbGF0Zm9ybX0vdmVyc2lvbnNgKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICB2ZXJzaW9ucyA9IHJlcXVpcmUoJ0BpbWcvc2hhcnAtd2FzbTMyL3ZlcnNpb25zJyk7XG4gICAgfSBjYXRjaCAoXykge31cbiAgfVxufVxudmVyc2lvbnMuc2hhcnAgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKHZlcnNpb25zLmhlaWYgJiYgZm9ybWF0LmhlaWYpIHtcbiAgLy8gUHJlYnVpbHQgYmluYXJpZXMgcHJvdmlkZSBBVjFcbiAgZm9ybWF0LmhlaWYuaW5wdXQuZmlsZVN1ZmZpeCA9IFsnLmF2aWYnXTtcbiAgZm9ybWF0LmhlaWYub3V0cHV0LmFsaWFzID0gWydhdmlmJ107XG59XG5cbi8qKlxuICogR2V0cyBvciwgd2hlbiBvcHRpb25zIGFyZSBwcm92aWRlZCwgc2V0cyB0aGUgbGltaXRzIG9mIF9saWJ2aXBzJ18gb3BlcmF0aW9uIGNhY2hlLlxuICogRXhpc3RpbmcgZW50cmllcyBpbiB0aGUgY2FjaGUgd2lsbCBiZSB0cmltbWVkIGFmdGVyIGFueSBjaGFuZ2UgaW4gbGltaXRzLlxuICogVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgY2FjaGUgc3RhdGlzdGljcyxcbiAqIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaG93IG11Y2ggd29ya2luZyBtZW1vcnkgaXMgcmVxdWlyZWQgZm9yIGEgcGFydGljdWxhciB0YXNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzdGF0cyA9IHNoYXJwLmNhY2hlKCk7XG4gKiBAZXhhbXBsZVxuICogc2hhcnAuY2FjaGUoIHsgaXRlbXM6IDIwMCB9ICk7XG4gKiBzaGFycC5jYWNoZSggeyBmaWxlczogMCB9ICk7XG4gKiBzaGFycC5jYWNoZShmYWxzZSk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R8Ym9vbGVhbn0gW29wdGlvbnM9dHJ1ZV0gLSBPYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMsIG9yIGJvb2xlYW4gd2hlcmUgdHJ1ZSB1c2VzIGRlZmF1bHQgY2FjaGUgc2V0dGluZ3MgYW5kIGZhbHNlIHJlbW92ZXMgYWxsIGNhY2hpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tZW1vcnk9NTBdIC0gaXMgdGhlIG1heGltdW0gbWVtb3J5IGluIE1CIHRvIHVzZSBmb3IgdGhpcyBjYWNoZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmZpbGVzPTIwXSAtIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0byBob2xkIG9wZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5pdGVtcz0xMDBdIC0gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZXJhdGlvbnMgdG8gY2FjaGVcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNhY2hlIChvcHRpb25zKSB7XG4gIGlmIChpcy5ib29sKG9wdGlvbnMpKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIC8vIERlZmF1bHQgY2FjaGUgc2V0dGluZ3Mgb2YgNTBNQiwgMjAgZmlsZXMsIDEwMCBpdGVtc1xuICAgICAgcmV0dXJuIHNoYXJwLmNhY2hlKDUwLCAyMCwgMTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNoYXJwLmNhY2hlKDAsIDAsIDApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gc2hhcnAuY2FjaGUob3B0aW9ucy5tZW1vcnksIG9wdGlvbnMuZmlsZXMsIG9wdGlvbnMuaXRlbXMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzaGFycC5jYWNoZSgpO1xuICB9XG59XG5jYWNoZSh0cnVlKTtcblxuLyoqXG4gKiBHZXRzIG9yLCB3aGVuIGEgY29uY3VycmVuY3kgaXMgcHJvdmlkZWQsIHNldHNcbiAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIF9saWJ2aXBzXyBzaG91bGQgdXNlIHRvIHByb2Nlc3MgX2VhY2ggaW1hZ2VfLlxuICogVGhlc2UgYXJlIGZyb20gYSB0aHJlYWQgcG9vbCBtYW5hZ2VkIGJ5IGdsaWIsXG4gKiB3aGljaCBoZWxwcyBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgbmV3IHRocmVhZHMuXG4gKlxuICogVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgdGhlIGN1cnJlbnQgY29uY3VycmVuY3kuXG4gKlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBDUFUgY29yZXMsXG4gKiBleGNlcHQgd2hlbiB1c2luZyBnbGliYy1iYXNlZCBMaW51eCB3aXRob3V0IGplbWFsbG9jLFxuICogd2hlcmUgdGhlIGRlZmF1bHQgaXMgYDFgIHRvIGhlbHAgcmVkdWNlIG1lbW9yeSBmcmFnbWVudGF0aW9uLlxuICpcbiAqIEEgdmFsdWUgb2YgYDBgIHdpbGwgcmVzZXQgdGhpcyB0byB0aGUgbnVtYmVyIG9mIENQVSBjb3Jlcy5cbiAqXG4gKiBTb21lIGltYWdlIGZvcm1hdCBsaWJyYXJpZXMgc3Bhd24gYWRkaXRpb25hbCB0aHJlYWRzLFxuICogZS5nLiBsaWJhb20gbWFuYWdlcyBpdHMgb3duIDQgdGhyZWFkcyB3aGVuIGVuY29kaW5nIEFWSUYgaW1hZ2VzLFxuICogYW5kIHRoZXNlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgdmFsdWUgc2V0IGhlcmUuXG4gKlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyB0aGF0IHNoYXJwIGNhbiBwcm9jZXNzIGluIHBhcmFsbGVsXG4gKiBpcyBjb250cm9sbGVkIGJ5IGxpYnV2J3MgYFVWX1RIUkVBRFBPT0xfU0laRWAgZW52aXJvbm1lbnQgdmFyaWFibGUsXG4gKiB3aGljaCBkZWZhdWx0cyB0byA0LlxuICpcbiAqIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2xpLmh0bWwjdXZfdGhyZWFkcG9vbF9zaXplc2l6ZVxuICpcbiAqIEZvciBleGFtcGxlLCBieSBkZWZhdWx0LCBhIG1hY2hpbmUgd2l0aCA4IENQVSBjb3JlcyB3aWxsIHByb2Nlc3NcbiAqIDQgaW1hZ2VzIGluIHBhcmFsbGVsIGFuZCB1c2UgdXAgdG8gOCB0aHJlYWRzIHBlciBpbWFnZSxcbiAqIHNvIHRoZXJlIHdpbGwgYmUgdXAgdG8gMzIgY29uY3VycmVudCB0aHJlYWRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0aHJlYWRzID0gc2hhcnAuY29uY3VycmVuY3koKTsgLy8gNFxuICogc2hhcnAuY29uY3VycmVuY3koMik7IC8vIDJcbiAqIHNoYXJwLmNvbmN1cnJlbmN5KDApOyAvLyA0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtjb25jdXJyZW5jeV1cbiAqIEByZXR1cm5zIHtudW1iZXJ9IGNvbmN1cnJlbmN5XG4gKi9cbmZ1bmN0aW9uIGNvbmN1cnJlbmN5IChjb25jdXJyZW5jeSkge1xuICByZXR1cm4gc2hhcnAuY29uY3VycmVuY3koaXMuaW50ZWdlcihjb25jdXJyZW5jeSkgPyBjb25jdXJyZW5jeSA6IG51bGwpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChkZXRlY3RMaWJjLmZhbWlseVN5bmMoKSA9PT0gZGV0ZWN0TGliYy5HTElCQyAmJiAhc2hhcnAuX2lzVXNpbmdKZW1hbGxvYygpKSB7XG4gIC8vIFJlZHVjZSBkZWZhdWx0IGNvbmN1cnJlbmN5IHRvIDEgd2hlbiB1c2luZyBnbGliYyBtZW1vcnkgYWxsb2NhdG9yXG4gIHNoYXJwLmNvbmN1cnJlbmN5KDEpO1xufSBlbHNlIGlmIChkZXRlY3RMaWJjLmZhbWlseVN5bmMoKSA9PT0gZGV0ZWN0TGliYy5NVVNMICYmIHNoYXJwLmNvbmN1cnJlbmN5KCkgPT09IDEwMjQpIHtcbiAgLy8gUmVkdWNlIGRlZmF1bHQgY29uY3VycmVuY3kgd2hlbiBtdXNsIHRocmVhZCBvdmVyLXN1YnNjcmlwdGlvbiBkZXRlY3RlZFxuICBzaGFycC5jb25jdXJyZW5jeShyZXF1aXJlKCdub2RlOm9zJykuYXZhaWxhYmxlUGFyYWxsZWxpc20oKSk7XG59XG5cbi8qKlxuICogQW4gRXZlbnRFbWl0dGVyIHRoYXQgZW1pdHMgYSBgY2hhbmdlYCBldmVudCB3aGVuIGEgdGFzayBpcyBlaXRoZXI6XG4gKiAtIHF1ZXVlZCwgd2FpdGluZyBmb3IgX2xpYnV2XyB0byBwcm92aWRlIGEgd29ya2VyIHRocmVhZFxuICogLSBjb21wbGV0ZVxuICogQG1lbWJlclxuICogQGV4YW1wbGVcbiAqIHNoYXJwLnF1ZXVlLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbihxdWV1ZUxlbmd0aCkge1xuICogICBjb25zb2xlLmxvZygnUXVldWUgY29udGFpbnMgJyArIHF1ZXVlTGVuZ3RoICsgJyB0YXNrKHMpJyk7XG4gKiB9KTtcbiAqL1xuY29uc3QgcXVldWUgPSBuZXcgZXZlbnRzLkV2ZW50RW1pdHRlcigpO1xuXG4vKipcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byBpbnRlcm5hbCB0YXNrIGNvdW50ZXJzLlxuICogLSBxdWV1ZSBpcyB0aGUgbnVtYmVyIG9mIHRhc2tzIHRoaXMgbW9kdWxlIGhhcyBxdWV1ZWQgd2FpdGluZyBmb3IgX2xpYnV2XyB0byBwcm92aWRlIGEgd29ya2VyIHRocmVhZCBmcm9tIGl0cyBwb29sLlxuICogLSBwcm9jZXNzIGlzIHRoZSBudW1iZXIgb2YgcmVzaXplIHRhc2tzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNvdW50ZXJzID0gc2hhcnAuY291bnRlcnMoKTsgLy8geyBxdWV1ZTogMiwgcHJvY2VzczogNCB9XG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gY291bnRlcnMgKCkge1xuICByZXR1cm4gc2hhcnAuY291bnRlcnMoKTtcbn1cblxuLyoqXG4gKiBHZXQgYW5kIHNldCB1c2Ugb2YgU0lNRCB2ZWN0b3IgdW5pdCBpbnN0cnVjdGlvbnMuXG4gKiBSZXF1aXJlcyBsaWJ2aXBzIHRvIGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIGhpZ2h3YXkgc3VwcG9ydC5cbiAqXG4gKiBJbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgYHJlc2l6ZWAsIGBibHVyYCBhbmQgYHNoYXJwZW5gIG9wZXJhdGlvbnNcbiAqIGJ5IHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIFNJTUQgdmVjdG9yIHVuaXQgb2YgdGhlIENQVSwgZS5nLiBJbnRlbCBTU0UgYW5kIEFSTSBORU9OLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzaW1kID0gc2hhcnAuc2ltZCgpO1xuICogLy8gc2ltZCBpcyBgdHJ1ZWAgaWYgdGhlIHJ1bnRpbWUgdXNlIG9mIGhpZ2h3YXkgaXMgY3VycmVudGx5IGVuYWJsZWRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzaW1kID0gc2hhcnAuc2ltZChmYWxzZSk7XG4gKiAvLyBwcmV2ZW50IGxpYnZpcHMgZnJvbSB1c2luZyBoaWdod2F5IGF0IHJ1bnRpbWVcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzaW1kPXRydWVdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc2ltZCAoc2ltZCkge1xuICByZXR1cm4gc2hhcnAuc2ltZChpcy5ib29sKHNpbWQpID8gc2ltZCA6IG51bGwpO1xufVxuXG4vKipcbiAqIEJsb2NrIGxpYnZpcHMgb3BlcmF0aW9ucyBhdCBydW50aW1lLlxuICpcbiAqIFRoaXMgaXMgaW4gYWRkaXRpb24gdG8gdGhlIGBWSVBTX0JMT0NLX1VOVFJVU1RFRGAgZW52aXJvbm1lbnQgdmFyaWFibGUsXG4gKiB3aGljaCB3aGVuIHNldCB3aWxsIGJsb2NrIGFsbCBcInVudHJ1c3RlZFwiIG9wZXJhdGlvbnMuXG4gKlxuICogQHNpbmNlIDAuMzIuNFxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkJsb2NrIGFsbCBUSUZGIGlucHV0LjwvY2FwdGlvbj5cbiAqIHNoYXJwLmJsb2NrKHtcbiAqICAgb3BlcmF0aW9uOiBbJ1ZpcHNGb3JlaWduTG9hZFRpZmYnXVxuICogfSk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gb3B0aW9ucy5vcGVyYXRpb24gLSBMaXN0IG9mIGxpYnZpcHMgbG93LWxldmVsIG9wZXJhdGlvbiBuYW1lcyB0byBibG9jay5cbiAqL1xuZnVuY3Rpb24gYmxvY2sgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMub3BlcmF0aW9uKSAmJiBvcHRpb25zLm9wZXJhdGlvbi5ldmVyeShpcy5zdHJpbmcpKSB7XG4gICAgICBzaGFycC5ibG9jayhvcHRpb25zLm9wZXJhdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3BlcmF0aW9uJywgJ0FycmF5PHN0cmluZz4nLCBvcHRpb25zLm9wZXJhdGlvbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucycsICdvYmplY3QnLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFVuYmxvY2sgbGlidmlwcyBvcGVyYXRpb25zIGF0IHJ1bnRpbWUuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIGEgbGlzdCBvZiBhbGxvd2VkIG9wZXJhdGlvbnMuXG4gKlxuICogQHNpbmNlIDAuMzIuNFxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkJsb2NrIGFsbCBpbnB1dCBleGNlcHQgV2ViUCBmcm9tIHRoZSBmaWxlc3lzdGVtLjwvY2FwdGlvbj5cbiAqIHNoYXJwLmJsb2NrKHtcbiAqICAgb3BlcmF0aW9uOiBbJ1ZpcHNGb3JlaWduTG9hZCddXG4gKiB9KTtcbiAqIHNoYXJwLnVuYmxvY2soe1xuICogICBvcGVyYXRpb246IFsnVmlwc0ZvcmVpZ25Mb2FkV2VicEZpbGUnXVxuICogfSk7XG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+QmxvY2sgYWxsIGlucHV0IGV4Y2VwdCBKUEVHIGFuZCBQTkcgZnJvbSBhIEJ1ZmZlciBvciBTdHJlYW0uPC9jYXB0aW9uPlxuICogc2hhcnAuYmxvY2soe1xuICogICBvcGVyYXRpb246IFsnVmlwc0ZvcmVpZ25Mb2FkJ11cbiAqIH0pO1xuICogc2hhcnAudW5ibG9jayh7XG4gKiAgIG9wZXJhdGlvbjogWydWaXBzRm9yZWlnbkxvYWRKcGVnQnVmZmVyJywgJ1ZpcHNGb3JlaWduTG9hZFBuZ0J1ZmZlciddXG4gKiB9KTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBvcHRpb25zLm9wZXJhdGlvbiAtIExpc3Qgb2YgbGlidmlwcyBsb3ctbGV2ZWwgb3BlcmF0aW9uIG5hbWVzIHRvIHVuYmxvY2suXG4gKi9cbmZ1bmN0aW9uIHVuYmxvY2sgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMub3BlcmF0aW9uKSAmJiBvcHRpb25zLm9wZXJhdGlvbi5ldmVyeShpcy5zdHJpbmcpKSB7XG4gICAgICBzaGFycC5ibG9jayhvcHRpb25zLm9wZXJhdGlvbiwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wZXJhdGlvbicsICdBcnJheTxzdHJpbmc+Jywgb3B0aW9ucy5vcGVyYXRpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMnLCAnb2JqZWN0Jywgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNvcmF0ZSB0aGUgU2hhcnAgY2xhc3Mgd2l0aCB1dGlsaXR5LXJlbGF0ZWQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoU2hhcnApIHtcbiAgU2hhcnAuY2FjaGUgPSBjYWNoZTtcbiAgU2hhcnAuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgU2hhcnAuY291bnRlcnMgPSBjb3VudGVycztcbiAgU2hhcnAuc2ltZCA9IHNpbWQ7XG4gIFNoYXJwLmZvcm1hdCA9IGZvcm1hdDtcbiAgU2hhcnAuaW50ZXJwb2xhdG9ycyA9IGludGVycG9sYXRvcnM7XG4gIFNoYXJwLnZlcnNpb25zID0gdmVyc2lvbnM7XG4gIFNoYXJwLnF1ZXVlID0gcXVldWU7XG4gIFNoYXJwLmJsb2NrID0gYmxvY2s7XG4gIFNoYXJwLnVuYmxvY2sgPSB1bmJsb2NrO1xufTtcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTMgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBTaGFycCA9IHJlcXVpcmUoJy4vY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vaW5wdXQnKShTaGFycCk7XG5yZXF1aXJlKCcuL3Jlc2l6ZScpKFNoYXJwKTtcbnJlcXVpcmUoJy4vY29tcG9zaXRlJykoU2hhcnApO1xucmVxdWlyZSgnLi9vcGVyYXRpb24nKShTaGFycCk7XG5yZXF1aXJlKCcuL2NvbG91cicpKFNoYXJwKTtcbnJlcXVpcmUoJy4vY2hhbm5lbCcpKFNoYXJwKTtcbnJlcXVpcmUoJy4vb3V0cHV0JykoU2hhcnApO1xucmVxdWlyZSgnLi91dGlsaXR5JykoU2hhcnApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYXJwO1xuIiwKICAgICIvKipcbiAqIENvbW1hbmRlckVycm9yIGNsYXNzXG4gKi9cbmNsYXNzIENvbW1hbmRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgQ29tbWFuZGVyRXJyb3IgY2xhc3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIHN1Z2dlc3RlZCBleGl0IGNvZGUgd2hpY2ggY291bGQgYmUgdXNlZCB3aXRoIHByb2Nlc3MuZXhpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZSBhbiBpZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgLy8gcHJvcGVybHkgY2FwdHVyZSBzdGFjayB0cmFjZSBpbiBOb2RlLmpzXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5leGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgIHRoaXMubmVzdGVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZhbGlkQXJndW1lbnRFcnJvciBjbGFzc1xuICovXG5jbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIENvbW1hbmRlckVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIEludmFsaWRBcmd1bWVudEVycm9yIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZXhwbGFuYXRpb24gb2Ygd2h5IGFyZ3VtZW50IGlzIGludmFsaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcigxLCAnY29tbWFuZGVyLmludmFsaWRBcmd1bWVudCcsIG1lc3NhZ2UpO1xuICAgIC8vIHByb3Blcmx5IGNhcHR1cmUgc3RhY2sgdHJhY2UgaW4gTm9kZS5qc1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgfVxufVxuXG5leHBvcnRzLkNvbW1hbmRlckVycm9yID0gQ29tbWFuZGVyRXJyb3I7XG5leHBvcnRzLkludmFsaWRBcmd1bWVudEVycm9yID0gSW52YWxpZEFyZ3VtZW50RXJyb3I7XG4iLAogICAgImNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3IuanMnKTtcblxuY2xhc3MgQXJndW1lbnQge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIG5ldyBjb21tYW5kIGFyZ3VtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRlc2NyaXB0aW9uLlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGF0IHRoZSBhcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHlvdSBjYW4gZXhwbGljaXRseVxuICAgKiBpbmRpY2F0ZSB0aGlzIHdpdGggPD4gYXJvdW5kIHRoZSBuYW1lLiBQdXQgW10gYXJvdW5kIHRoZSBuYW1lIGZvciBhbiBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgdGhpcy52YXJpYWRpYyA9IGZhbHNlO1xuICAgIHRoaXMucGFyc2VBcmcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKG5hbWVbMF0pIHtcbiAgICAgIGNhc2UgJzwnOiAvLyBlLmcuIDxyZXF1aXJlZD5cbiAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdbJzogLy8gZS5nLiBbb3B0aW9uYWxdXG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWUuc2xpY2UoMSwgLTEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX25hbWUubGVuZ3RoID4gMyAmJiB0aGlzLl9uYW1lLnNsaWNlKC0zKSA9PT0gJy4uLicpIHtcbiAgICAgIHRoaXMudmFyaWFkaWMgPSB0cnVlO1xuICAgICAgdGhpcy5fbmFtZSA9IHRoaXMuX25hbWUuc2xpY2UoMCwgLTMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYXJndW1lbnQgbmFtZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9jb25jYXRWYWx1ZSh2YWx1ZSwgcHJldmlvdXMpIHtcbiAgICBpZiAocHJldmlvdXMgPT09IHRoaXMuZGVmYXVsdFZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHByZXZpb3VzKSkge1xuICAgICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpb3VzLmNvbmNhdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlLCBhbmQgb3B0aW9uYWxseSBzdXBwbHkgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtBcmd1bWVudH1cbiAgICovXG5cbiAgZGVmYXVsdCh2YWx1ZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1c3RvbSBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIENMSSBjb21tYW5kIGFyZ3VtZW50cyBpbnRvIGFyZ3VtZW50IHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICAgKiBAcmV0dXJuIHtBcmd1bWVudH1cbiAgICovXG5cbiAgYXJnUGFyc2VyKGZuKSB7XG4gICAgdGhpcy5wYXJzZUFyZyA9IGZuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgYWxsb3cgYXJndW1lbnQgdmFsdWUgdG8gYmUgb25lIG9mIGNob2ljZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHZhbHVlc1xuICAgKiBAcmV0dXJuIHtBcmd1bWVudH1cbiAgICovXG5cbiAgY2hvaWNlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB2YWx1ZXMuc2xpY2UoKTtcbiAgICB0aGlzLnBhcnNlQXJnID0gKGFyZywgcHJldmlvdXMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmdDaG9pY2VzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBBbGxvd2VkIGNob2ljZXMgYXJlICR7dGhpcy5hcmdDaG9pY2VzLmpvaW4oJywgJyl9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YXJpYWRpYykge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY2F0VmFsdWUoYXJnLCBwcmV2aW91cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhcmd1bWVudCByZXF1aXJlZC5cbiAgICpcbiAgICogQHJldHVybnMge0FyZ3VtZW50fVxuICAgKi9cbiAgYXJnUmVxdWlyZWQoKSB7XG4gICAgdGhpcy5yZXF1aXJlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhcmd1bWVudCBvcHRpb25hbC5cbiAgICpcbiAgICogQHJldHVybnMge0FyZ3VtZW50fVxuICAgKi9cbiAgYXJnT3B0aW9uYWwoKSB7XG4gICAgdGhpcy5yZXF1aXJlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8qKlxuICogVGFrZXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgaXRzIGh1bWFuIHJlYWRhYmxlIGVxdWl2YWxlbnQgZm9yIGhlbHAgdXNhZ2UuXG4gKlxuICogQHBhcmFtIHtBcmd1bWVudH0gYXJnXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykge1xuICBjb25zdCBuYW1lT3V0cHV0ID0gYXJnLm5hbWUoKSArIChhcmcudmFyaWFkaWMgPT09IHRydWUgPyAnLi4uJyA6ICcnKTtcblxuICByZXR1cm4gYXJnLnJlcXVpcmVkID8gJzwnICsgbmFtZU91dHB1dCArICc+JyA6ICdbJyArIG5hbWVPdXRwdXQgKyAnXSc7XG59XG5cbmV4cG9ydHMuQXJndW1lbnQgPSBBcmd1bWVudDtcbmV4cG9ydHMuaHVtYW5SZWFkYWJsZUFyZ05hbWUgPSBodW1hblJlYWRhYmxlQXJnTmFtZTtcbiIsCiAgICAiY29uc3QgeyBodW1hblJlYWRhYmxlQXJnTmFtZSB9ID0gcmVxdWlyZSgnLi9hcmd1bWVudC5qcycpO1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgaW1wb3J0IHR5cGVzIGZvciBKU0RvYywgdXNlZCBieSBWaXN1YWwgU3R1ZGlvIENvZGUgSW50ZWxsaVNlbnNlIGFuZCBgbnBtIHJ1biB0eXBlc2NyaXB0LWNoZWNrSlNgXG4gKiBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9qc2RvYy1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNpbXBvcnQtdHlwZXNcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KFwiLi9hcmd1bWVudC5qc1wiKS5Bcmd1bWVudCB9IEFyZ3VtZW50XG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vY29tbWFuZC5qc1wiKS5Db21tYW5kIH0gQ29tbWFuZFxuICogQHR5cGVkZWYgeyBpbXBvcnQoXCIuL29wdGlvbi5qc1wiKS5PcHRpb24gfSBPcHRpb25cbiAqL1xuXG4vLyBBbHRob3VnaCB0aGlzIGlzIGEgY2xhc3MsIG1ldGhvZHMgYXJlIHN0YXRpYyBpbiBzdHlsZSB0byBhbGxvdyBvdmVycmlkZSB1c2luZyBzdWJjbGFzcyBvciBqdXN0IGZ1bmN0aW9ucy5cbmNsYXNzIEhlbHAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhlbHBXaWR0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNvcnRTdWJjb21tYW5kcyA9IGZhbHNlO1xuICAgIHRoaXMuc29ydE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dHbG9iYWxPcHRpb25zID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSB2aXNpYmxlIHN1YmNvbW1hbmRzLiBJbmNsdWRlcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgaW1wbGljaXQgaGVscCBjb21tYW5kLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtDb21tYW5kW119XG4gICAqL1xuXG4gIHZpc2libGVDb21tYW5kcyhjbWQpIHtcbiAgICBjb25zdCB2aXNpYmxlQ29tbWFuZHMgPSBjbWQuY29tbWFuZHMuZmlsdGVyKChjbWQpID0+ICFjbWQuX2hpZGRlbik7XG4gICAgY29uc3QgaGVscENvbW1hbmQgPSBjbWQuX2dldEhlbHBDb21tYW5kKCk7XG4gICAgaWYgKGhlbHBDb21tYW5kICYmICFoZWxwQ29tbWFuZC5faGlkZGVuKSB7XG4gICAgICB2aXNpYmxlQ29tbWFuZHMucHVzaChoZWxwQ29tbWFuZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNvcnRTdWJjb21tYW5kcykge1xuICAgICAgdmlzaWJsZUNvbW1hbmRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgICAgIHJldHVybiBhLm5hbWUoKS5sb2NhbGVDb21wYXJlKGIubmFtZSgpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaWJsZUNvbW1hbmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgb3B0aW9ucyBmb3Igc29ydC5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IGFcbiAgICogQHBhcmFtIHtPcHRpb259IGJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGNvbXBhcmVPcHRpb25zKGEsIGIpIHtcbiAgICBjb25zdCBnZXRTb3J0S2V5ID0gKG9wdGlvbikgPT4ge1xuICAgICAgLy8gV1lTSVdZRyBmb3Igb3JkZXIgZGlzcGxheWVkIGluIGhlbHAuIFNob3J0IHVzZWQgZm9yIGNvbXBhcmlzb24gaWYgcHJlc2VudC4gTm8gc3BlY2lhbCBoYW5kbGluZyBmb3IgbmVnYXRlZC5cbiAgICAgIHJldHVybiBvcHRpb24uc2hvcnRcbiAgICAgICAgPyBvcHRpb24uc2hvcnQucmVwbGFjZSgvXi0vLCAnJylcbiAgICAgICAgOiBvcHRpb24ubG9uZy5yZXBsYWNlKC9eLS0vLCAnJyk7XG4gICAgfTtcbiAgICByZXR1cm4gZ2V0U29ydEtleShhKS5sb2NhbGVDb21wYXJlKGdldFNvcnRLZXkoYikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBvcHRpb25zLiBJbmNsdWRlcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgaW1wbGljaXQgaGVscCBvcHRpb24sIGlmIHRoZXJlIGlzIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge09wdGlvbltdfVxuICAgKi9cblxuICB2aXNpYmxlT3B0aW9ucyhjbWQpIHtcbiAgICBjb25zdCB2aXNpYmxlT3B0aW9ucyA9IGNtZC5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmhpZGRlbik7XG4gICAgLy8gQnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAgY29uc3QgaGVscE9wdGlvbiA9IGNtZC5fZ2V0SGVscE9wdGlvbigpO1xuICAgIGlmIChoZWxwT3B0aW9uICYmICFoZWxwT3B0aW9uLmhpZGRlbikge1xuICAgICAgLy8gQXV0b21hdGljYWxseSBoaWRlIGNvbmZsaWN0aW5nIGZsYWdzLiBCaXQgZHViaW91cyBidXQgYSBoaXN0b3JpY2FsIGJlaGF2aW91ciB0aGF0IGlzIGNvbnZlbmllbnQgZm9yIHNpbmdsZS1jb21tYW5kIHByb2dyYW1zLlxuICAgICAgY29uc3QgcmVtb3ZlU2hvcnQgPSBoZWxwT3B0aW9uLnNob3J0ICYmIGNtZC5fZmluZE9wdGlvbihoZWxwT3B0aW9uLnNob3J0KTtcbiAgICAgIGNvbnN0IHJlbW92ZUxvbmcgPSBoZWxwT3B0aW9uLmxvbmcgJiYgY21kLl9maW5kT3B0aW9uKGhlbHBPcHRpb24ubG9uZyk7XG4gICAgICBpZiAoIXJlbW92ZVNob3J0ICYmICFyZW1vdmVMb25nKSB7XG4gICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goaGVscE9wdGlvbik7IC8vIG5vIGNoYW5nZXMgbmVlZGVkXG4gICAgICB9IGVsc2UgaWYgKGhlbHBPcHRpb24ubG9uZyAmJiAhcmVtb3ZlTG9uZykge1xuICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKFxuICAgICAgICAgIGNtZC5jcmVhdGVPcHRpb24oaGVscE9wdGlvbi5sb25nLCBoZWxwT3B0aW9uLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaGVscE9wdGlvbi5zaG9ydCAmJiAhcmVtb3ZlU2hvcnQpIHtcbiAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChcbiAgICAgICAgICBjbWQuY3JlYXRlT3B0aW9uKGhlbHBPcHRpb24uc2hvcnQsIGhlbHBPcHRpb24uZGVzY3JpcHRpb24pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0T3B0aW9ucykge1xuICAgICAgdmlzaWJsZU9wdGlvbnMuc29ydCh0aGlzLmNvbXBhcmVPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBnbG9iYWwgb3B0aW9ucy4gKE5vdCBpbmNsdWRpbmcgaGVscC4pXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtPcHRpb25bXX1cbiAgICovXG5cbiAgdmlzaWJsZUdsb2JhbE9wdGlvbnMoY21kKSB7XG4gICAgaWYgKCF0aGlzLnNob3dHbG9iYWxPcHRpb25zKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBnbG9iYWxPcHRpb25zID0gW107XG4gICAgZm9yIChcbiAgICAgIGxldCBhbmNlc3RvckNtZCA9IGNtZC5wYXJlbnQ7XG4gICAgICBhbmNlc3RvckNtZDtcbiAgICAgIGFuY2VzdG9yQ21kID0gYW5jZXN0b3JDbWQucGFyZW50XG4gICAgKSB7XG4gICAgICBjb25zdCB2aXNpYmxlT3B0aW9ucyA9IGFuY2VzdG9yQ21kLm9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAob3B0aW9uKSA9PiAhb3B0aW9uLmhpZGRlbixcbiAgICAgICk7XG4gICAgICBnbG9iYWxPcHRpb25zLnB1c2goLi4udmlzaWJsZU9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0T3B0aW9ucykge1xuICAgICAgZ2xvYmFsT3B0aW9ucy5zb3J0KHRoaXMuY29tcGFyZU9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gZ2xvYmFsT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIGFyZ3VtZW50cyBpZiBhbnkgaGF2ZSBhIGRlc2NyaXB0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7QXJndW1lbnRbXX1cbiAgICovXG5cbiAgdmlzaWJsZUFyZ3VtZW50cyhjbWQpIHtcbiAgICAvLyBTaWRlIGVmZmVjdCEgQXBwbHkgdGhlIGxlZ2FjeSBkZXNjcmlwdGlvbnMgYmVmb3JlIHRoZSBhcmd1bWVudHMgYXJlIGRpc3BsYXllZC5cbiAgICBpZiAoY21kLl9hcmdzRGVzY3JpcHRpb24pIHtcbiAgICAgIGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzLmZvckVhY2goKGFyZ3VtZW50KSA9PiB7XG4gICAgICAgIGFyZ3VtZW50LmRlc2NyaXB0aW9uID1cbiAgICAgICAgICBhcmd1bWVudC5kZXNjcmlwdGlvbiB8fCBjbWQuX2FyZ3NEZXNjcmlwdGlvblthcmd1bWVudC5uYW1lKCldIHx8ICcnO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGFueSBhcmd1bWVudHMgd2l0aCBhIGRlc2NyaXB0aW9uIHRoZW4gcmV0dXJuIGFsbCB0aGUgYXJndW1lbnRzLlxuICAgIGlmIChjbWQucmVnaXN0ZXJlZEFyZ3VtZW50cy5maW5kKChhcmd1bWVudCkgPT4gYXJndW1lbnQuZGVzY3JpcHRpb24pKSB7XG4gICAgICByZXR1cm4gY21kLnJlZ2lzdGVyZWRBcmd1bWVudHM7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1hbmQgdGVybSB0byBzaG93IGluIHRoZSBsaXN0IG9mIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBzdWJjb21tYW5kVGVybShjbWQpIHtcbiAgICAvLyBMZWdhY3kuIElnbm9yZXMgY3VzdG9tIHVzYWdlIHN0cmluZywgYW5kIG5lc3RlZCBjb21tYW5kcy5cbiAgICBjb25zdCBhcmdzID0gY21kLnJlZ2lzdGVyZWRBcmd1bWVudHNcbiAgICAgIC5tYXAoKGFyZykgPT4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKSlcbiAgICAgIC5qb2luKCcgJyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGNtZC5fbmFtZSArXG4gICAgICAoY21kLl9hbGlhc2VzWzBdID8gJ3wnICsgY21kLl9hbGlhc2VzWzBdIDogJycpICtcbiAgICAgIChjbWQub3B0aW9ucy5sZW5ndGggPyAnIFtvcHRpb25zXScgOiAnJykgKyAvLyBzaW1wbGlzdGljIGNoZWNrIGZvciBub24taGVscCBvcHRpb25cbiAgICAgIChhcmdzID8gJyAnICsgYXJncyA6ICcnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb24gdGVybSB0byBzaG93IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgb3B0aW9uVGVybShvcHRpb24pIHtcbiAgICByZXR1cm4gb3B0aW9uLmZsYWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXJndW1lbnQgdGVybSB0byBzaG93IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtBcmd1bWVudH0gYXJndW1lbnRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgYXJndW1lbnRUZXJtKGFyZ3VtZW50KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50Lm5hbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgY29tbWFuZCB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdFN1YmNvbW1hbmRUZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlQ29tbWFuZHMoY21kKS5yZWR1Y2UoKG1heCwgY29tbWFuZCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLnN1YmNvbW1hbmRUZXJtKGNvbW1hbmQpLmxlbmd0aCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IG9wdGlvbiB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVPcHRpb25zKGNtZCkucmVkdWNlKChtYXgsIG9wdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBnbG9iYWwgb3B0aW9uIHRlcm0gbGVuZ3RoLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBsb25nZXN0R2xvYmFsT3B0aW9uVGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUdsb2JhbE9wdGlvbnMoY21kKS5yZWR1Y2UoKG1heCwgb3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLmxlbmd0aCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IGFyZ3VtZW50IHRlcm0gbGVuZ3RoLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBsb25nZXN0QXJndW1lbnRUZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlQXJndW1lbnRzKGNtZCkucmVkdWNlKChtYXgsIGFyZ3VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBoZWxwZXIuYXJndW1lbnRUZXJtKGFyZ3VtZW50KS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29tbWFuZCB1c2FnZSB0byBiZSBkaXNwbGF5ZWQgYXQgdGhlIHRvcCBvZiB0aGUgYnVpbHQtaW4gaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgY29tbWFuZFVzYWdlKGNtZCkge1xuICAgIC8vIFVzYWdlXG4gICAgbGV0IGNtZE5hbWUgPSBjbWQuX25hbWU7XG4gICAgaWYgKGNtZC5fYWxpYXNlc1swXSkge1xuICAgICAgY21kTmFtZSA9IGNtZE5hbWUgKyAnfCcgKyBjbWQuX2FsaWFzZXNbMF07XG4gICAgfVxuICAgIGxldCBhbmNlc3RvckNtZE5hbWVzID0gJyc7XG4gICAgZm9yIChcbiAgICAgIGxldCBhbmNlc3RvckNtZCA9IGNtZC5wYXJlbnQ7XG4gICAgICBhbmNlc3RvckNtZDtcbiAgICAgIGFuY2VzdG9yQ21kID0gYW5jZXN0b3JDbWQucGFyZW50XG4gICAgKSB7XG4gICAgICBhbmNlc3RvckNtZE5hbWVzID0gYW5jZXN0b3JDbWQubmFtZSgpICsgJyAnICsgYW5jZXN0b3JDbWROYW1lcztcbiAgICB9XG4gICAgcmV0dXJuIGFuY2VzdG9yQ21kTmFtZXMgKyBjbWROYW1lICsgJyAnICsgY21kLnVzYWdlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGNvbW1hbmREZXNjcmlwdGlvbihjbWQpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIG92ZXJsb2FkZWQgcmV0dXJuIHR5cGVcbiAgICByZXR1cm4gY21kLmRlc2NyaXB0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdWJjb21tYW5kIHN1bW1hcnkgdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcy5cbiAgICogKEZhbGxiYWNrIHRvIGRlc2NyaXB0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4pXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIHN1YmNvbW1hbmREZXNjcmlwdGlvbihjbWQpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIG92ZXJsb2FkZWQgcmV0dXJuIHR5cGVcbiAgICByZXR1cm4gY21kLnN1bW1hcnkoKSB8fCBjbWQuZGVzY3JpcHRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9wdGlvbiBkZXNjcmlwdGlvbiB0byBzaG93IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBvcHRpb25EZXNjcmlwdGlvbihvcHRpb24pIHtcbiAgICBjb25zdCBleHRyYUluZm8gPSBbXTtcblxuICAgIGlmIChvcHRpb24uYXJnQ2hvaWNlcykge1xuICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgIC8vIHVzZSBzdHJpbmdpZnkgdG8gbWF0Y2ggdGhlIGRpc3BsYXkgb2YgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgYGNob2ljZXM6ICR7b3B0aW9uLmFyZ0Nob2ljZXMubWFwKChjaG9pY2UpID0+IEpTT04uc3RyaW5naWZ5KGNob2ljZSkpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGRlZmF1bHQgZm9yIGJvb2xlYW4gYW5kIG5lZ2F0ZWQgbW9yZSBmb3IgcHJvZ3JhbW1lciB0aGFuIGVuZCB1c2VyLFxuICAgICAgLy8gYnV0IHNob3cgdHJ1ZS9mYWxzZSBmb3IgYm9vbGVhbiBvcHRpb24gYXMgbWF5IGJlIGZvciBoYW5kLXJvbGxlZCBlbnYgb3IgY29uZmlnIHByb2Nlc3NpbmcuXG4gICAgICBjb25zdCBzaG93RGVmYXVsdCA9XG4gICAgICAgIG9wdGlvbi5yZXF1aXJlZCB8fFxuICAgICAgICBvcHRpb24ub3B0aW9uYWwgfHxcbiAgICAgICAgKG9wdGlvbi5pc0Jvb2xlYW4oKSAmJiB0eXBlb2Ygb3B0aW9uLmRlZmF1bHRWYWx1ZSA9PT0gJ2Jvb2xlYW4nKTtcbiAgICAgIGlmIChzaG93RGVmYXVsdCkge1xuICAgICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgICBgZGVmYXVsdDogJHtvcHRpb24uZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gfHwgSlNPTi5zdHJpbmdpZnkob3B0aW9uLmRlZmF1bHRWYWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gcHJlc2V0IGZvciBib29sZWFuIGFuZCBuZWdhdGVkIGFyZSBtb3JlIGZvciBwcm9ncmFtbWVyIHRoYW4gZW5kIHVzZXJcbiAgICBpZiAob3B0aW9uLnByZXNldEFyZyAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgZXh0cmFJbmZvLnB1c2goYHByZXNldDogJHtKU09OLnN0cmluZ2lmeShvcHRpb24ucHJlc2V0QXJnKX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbi5lbnZWYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0cmFJbmZvLnB1c2goYGVudjogJHtvcHRpb24uZW52VmFyfWApO1xuICAgIH1cbiAgICBpZiAoZXh0cmFJbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgJHtvcHRpb24uZGVzY3JpcHRpb259ICgke2V4dHJhSW5mby5qb2luKCcsICcpfSlgO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb24uZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcmd1bWVudCBkZXNjcmlwdGlvbiB0byBzaG93IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtBcmd1bWVudH0gYXJndW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBhcmd1bWVudERlc2NyaXB0aW9uKGFyZ3VtZW50KSB7XG4gICAgY29uc3QgZXh0cmFJbmZvID0gW107XG4gICAgaWYgKGFyZ3VtZW50LmFyZ0Nob2ljZXMpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICAvLyB1c2Ugc3RyaW5naWZ5IHRvIG1hdGNoIHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGBjaG9pY2VzOiAke2FyZ3VtZW50LmFyZ0Nob2ljZXMubWFwKChjaG9pY2UpID0+IEpTT04uc3RyaW5naWZ5KGNob2ljZSkpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd1bWVudC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgIGBkZWZhdWx0OiAke2FyZ3VtZW50LmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uIHx8IEpTT04uc3RyaW5naWZ5KGFyZ3VtZW50LmRlZmF1bHRWYWx1ZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChleHRyYUluZm8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXh0cmFEZXNjcmlwdG9uID0gYCgke2V4dHJhSW5mby5qb2luKCcsICcpfSlgO1xuICAgICAgaWYgKGFyZ3VtZW50LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHJldHVybiBgJHthcmd1bWVudC5kZXNjcmlwdGlvbn0gJHtleHRyYURlc2NyaXB0b259YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleHRyYURlc2NyaXB0b247XG4gICAgfVxuICAgIHJldHVybiBhcmd1bWVudC5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgYnVpbHQtaW4gaGVscCB0ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBmb3JtYXRIZWxwKGNtZCwgaGVscGVyKSB7XG4gICAgY29uc3QgdGVybVdpZHRoID0gaGVscGVyLnBhZFdpZHRoKGNtZCwgaGVscGVyKTtcbiAgICBjb25zdCBoZWxwV2lkdGggPSBoZWxwZXIuaGVscFdpZHRoIHx8IDgwO1xuICAgIGNvbnN0IGl0ZW1JbmRlbnRXaWR0aCA9IDI7XG4gICAgY29uc3QgaXRlbVNlcGFyYXRvcldpZHRoID0gMjsgLy8gYmV0d2VlbiB0ZXJtIGFuZCBkZXNjcmlwdGlvblxuICAgIGZ1bmN0aW9uIGZvcm1hdEl0ZW0odGVybSwgZGVzY3JpcHRpb24pIHtcbiAgICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCBmdWxsVGV4dCA9IGAke3Rlcm0ucGFkRW5kKHRlcm1XaWR0aCArIGl0ZW1TZXBhcmF0b3JXaWR0aCl9JHtkZXNjcmlwdGlvbn1gO1xuICAgICAgICByZXR1cm4gaGVscGVyLndyYXAoXG4gICAgICAgICAgZnVsbFRleHQsXG4gICAgICAgICAgaGVscFdpZHRoIC0gaXRlbUluZGVudFdpZHRoLFxuICAgICAgICAgIHRlcm1XaWR0aCArIGl0ZW1TZXBhcmF0b3JXaWR0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXJtO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmb3JtYXRMaXN0KHRleHRBcnJheSkge1xuICAgICAgcmV0dXJuIHRleHRBcnJheS5qb2luKCdcXG4nKS5yZXBsYWNlKC9eL2dtLCAnICcucmVwZWF0KGl0ZW1JbmRlbnRXaWR0aCkpO1xuICAgIH1cblxuICAgIC8vIFVzYWdlXG4gICAgbGV0IG91dHB1dCA9IFtgVXNhZ2U6ICR7aGVscGVyLmNvbW1hbmRVc2FnZShjbWQpfWAsICcnXTtcblxuICAgIC8vIERlc2NyaXB0aW9uXG4gICAgY29uc3QgY29tbWFuZERlc2NyaXB0aW9uID0gaGVscGVyLmNvbW1hbmREZXNjcmlwdGlvbihjbWQpO1xuICAgIGlmIChjb21tYW5kRGVzY3JpcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbXG4gICAgICAgIGhlbHBlci53cmFwKGNvbW1hbmREZXNjcmlwdGlvbiwgaGVscFdpZHRoLCAwKSxcbiAgICAgICAgJycsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyBBcmd1bWVudHNcbiAgICBjb25zdCBhcmd1bWVudExpc3QgPSBoZWxwZXIudmlzaWJsZUFyZ3VtZW50cyhjbWQpLm1hcCgoYXJndW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIuYXJndW1lbnRUZXJtKGFyZ3VtZW50KSxcbiAgICAgICAgaGVscGVyLmFyZ3VtZW50RGVzY3JpcHRpb24oYXJndW1lbnQpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoYXJndW1lbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoWydBcmd1bWVudHM6JywgZm9ybWF0TGlzdChhcmd1bWVudExpc3QpLCAnJ10pO1xuICAgIH1cblxuICAgIC8vIE9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25MaXN0ID0gaGVscGVyLnZpc2libGVPcHRpb25zKGNtZCkubWFwKChvcHRpb24pID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLFxuICAgICAgICBoZWxwZXIub3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbJ09wdGlvbnM6JywgZm9ybWF0TGlzdChvcHRpb25MaXN0KSwgJyddKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG93R2xvYmFsT3B0aW9ucykge1xuICAgICAgY29uc3QgZ2xvYmFsT3B0aW9uTGlzdCA9IGhlbHBlclxuICAgICAgICAudmlzaWJsZUdsb2JhbE9wdGlvbnMoY21kKVxuICAgICAgICAubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgICAgIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbiksXG4gICAgICAgICAgICBoZWxwZXIub3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIGlmIChnbG9iYWxPcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbXG4gICAgICAgICAgJ0dsb2JhbCBPcHRpb25zOicsXG4gICAgICAgICAgZm9ybWF0TGlzdChnbG9iYWxPcHRpb25MaXN0KSxcbiAgICAgICAgICAnJyxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tbWFuZHNcbiAgICBjb25zdCBjb21tYW5kTGlzdCA9IGhlbHBlci52aXNpYmxlQ29tbWFuZHMoY21kKS5tYXAoKGNtZCkgPT4ge1xuICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgIGhlbHBlci5zdWJjb21tYW5kVGVybShjbWQpLFxuICAgICAgICBoZWxwZXIuc3ViY29tbWFuZERlc2NyaXB0aW9uKGNtZCksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChjb21tYW5kTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFsnQ29tbWFuZHM6JywgZm9ybWF0TGlzdChjb21tYW5kTGlzdCksICcnXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIHBhZCB3aWR0aCBmcm9tIHRoZSBtYXhpbXVtIHRlcm0gbGVuZ3RoLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBwYWRXaWR0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgIGhlbHBlci5sb25nZXN0T3B0aW9uVGVybUxlbmd0aChjbWQsIGhlbHBlciksXG4gICAgICBoZWxwZXIubG9uZ2VzdEdsb2JhbE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RTdWJjb21tYW5kVGVybUxlbmd0aChjbWQsIGhlbHBlciksXG4gICAgICBoZWxwZXIubG9uZ2VzdEFyZ3VtZW50VGVybUxlbmd0aChjbWQsIGhlbHBlciksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBnaXZlbiBzdHJpbmcgdG8gd2lkdGggY2hhcmFjdGVycyBwZXIgbGluZSwgd2l0aCBsaW5lcyBhZnRlciB0aGUgZmlyc3QgaW5kZW50ZWQuXG4gICAqIERvIG5vdCB3cmFwIGlmIGluc3VmZmljaWVudCByb29tIGZvciB3cmFwcGluZyAobWluQ29sdW1uV2lkdGgpLCBvciBzdHJpbmcgaXMgbWFudWFsbHkgZm9ybWF0dGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZW50XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluQ29sdW1uV2lkdGg9NDBdXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICpcbiAgICovXG5cbiAgd3JhcChzdHIsIHdpZHRoLCBpbmRlbnQsIG1pbkNvbHVtbldpZHRoID0gNDApIHtcbiAgICAvLyBGdWxsIFxccyBjaGFyYWN0ZXJzLCBtaW51cyB0aGUgbGluZWZlZWRzLlxuICAgIGNvbnN0IGluZGVudHMgPVxuICAgICAgJyBcXFxcZlxcXFx0XFxcXHZcXHUwMGEwXFx1MTY4MFxcdTIwMDAtXFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdWZlZmYnO1xuICAgIC8vIERldGVjdCBtYW51YWxseSB3cmFwcGVkIGFuZCBpbmRlbnRlZCBzdHJpbmdzIGJ5IHNlYXJjaGluZyBmb3IgbGluZSBicmVhayBmb2xsb3dlZCBieSBzcGFjZXMuXG4gICAgY29uc3QgbWFudWFsSW5kZW50ID0gbmV3IFJlZ0V4cChgW1xcXFxuXVske2luZGVudHN9XStgKTtcbiAgICBpZiAoc3RyLm1hdGNoKG1hbnVhbEluZGVudCkpIHJldHVybiBzdHI7XG4gICAgLy8gRG8gbm90IHdyYXAgaWYgbm90IGVub3VnaCByb29tIGZvciBhIHdyYXBwZWQgY29sdW1uIG9mIHRleHQgKGFzIGNvdWxkIGVuZCB1cCB3aXRoIGEgd29yZCBwZXIgbGluZSkuXG4gICAgY29uc3QgY29sdW1uV2lkdGggPSB3aWR0aCAtIGluZGVudDtcbiAgICBpZiAoY29sdW1uV2lkdGggPCBtaW5Db2x1bW5XaWR0aCkgcmV0dXJuIHN0cjtcblxuICAgIGNvbnN0IGxlYWRpbmdTdHIgPSBzdHIuc2xpY2UoMCwgaW5kZW50KTtcbiAgICBjb25zdCBjb2x1bW5UZXh0ID0gc3RyLnNsaWNlKGluZGVudCkucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpO1xuICAgIGNvbnN0IGluZGVudFN0cmluZyA9ICcgJy5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCB6ZXJvV2lkdGhTcGFjZSA9ICdcXHUyMDBCJztcbiAgICBjb25zdCBicmVha3MgPSBgXFxcXHMke3plcm9XaWR0aFNwYWNlfWA7XG4gICAgLy8gTWF0Y2ggbGluZSBlbmQgKHNvIGVtcHR5IGxpbmVzIGRvbid0IGNvbGxhcHNlKSxcbiAgICAvLyBvciBhcyBtdWNoIHRleHQgYXMgd2lsbCBmaXQgaW4gY29sdW1uLCBvciBleGNlc3MgdGV4dCB1cCB0byBmaXJzdCBicmVhay5cbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICBgXFxufC57MSwke2NvbHVtbldpZHRoIC0gMX19KFske2JyZWFrc31dfCQpfFteJHticmVha3N9XSs/KFske2JyZWFrc31dfCQpYCxcbiAgICAgICdnJyxcbiAgICApO1xuICAgIGNvbnN0IGxpbmVzID0gY29sdW1uVGV4dC5tYXRjaChyZWdleCkgfHwgW107XG4gICAgcmV0dXJuIChcbiAgICAgIGxlYWRpbmdTdHIgK1xuICAgICAgbGluZXNcbiAgICAgICAgLm1hcCgobGluZSwgaSkgPT4ge1xuICAgICAgICAgIGlmIChsaW5lID09PSAnXFxuJykgcmV0dXJuICcnOyAvLyBwcmVzZXJ2ZSBlbXB0eSBsaW5lc1xuICAgICAgICAgIHJldHVybiAoaSA+IDAgPyBpbmRlbnRTdHJpbmcgOiAnJykgKyBsaW5lLnRyaW1FbmQoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnRzLkhlbHAgPSBIZWxwO1xuIiwKICAgICJjb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5cbmNsYXNzIE9wdGlvbiB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgbmV3IGBPcHRpb25gIHdpdGggdGhlIGdpdmVuIGBmbGFnc2AgYW5kIGBkZXNjcmlwdGlvbmAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICcnO1xuXG4gICAgdGhpcy5yZXF1aXJlZCA9IGZsYWdzLmluY2x1ZGVzKCc8Jyk7IC8vIEEgdmFsdWUgbXVzdCBiZSBzdXBwbGllZCB3aGVuIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkLlxuICAgIHRoaXMub3B0aW9uYWwgPSBmbGFncy5pbmNsdWRlcygnWycpOyAvLyBBIHZhbHVlIGlzIG9wdGlvbmFsIHdoZW4gdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQuXG4gICAgLy8gdmFyaWFkaWMgdGVzdCBpZ25vcmVzIDx2YWx1ZSwuLi4+IGV0IGFsIHdoaWNoIG1pZ2h0IGJlIHVzZWQgdG8gZGVzY3JpYmUgY3VzdG9tIHNwbGl0dGluZyBvZiBzaW5nbGUgYXJndW1lbnRcbiAgICB0aGlzLnZhcmlhZGljID0gL1xcd1xcLlxcLlxcLls+XFxdXSQvLnRlc3QoZmxhZ3MpOyAvLyBUaGUgb3B0aW9uIGNhbiB0YWtlIG11bHRpcGxlIHZhbHVlcy5cbiAgICB0aGlzLm1hbmRhdG9yeSA9IGZhbHNlOyAvLyBUaGUgb3B0aW9uIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcsIHdoaWNoIHVzdWFsbHkgbWVhbnMgaXQgbXVzdCBiZSBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lLlxuICAgIGNvbnN0IG9wdGlvbkZsYWdzID0gc3BsaXRPcHRpb25GbGFncyhmbGFncyk7XG4gICAgdGhpcy5zaG9ydCA9IG9wdGlvbkZsYWdzLnNob3J0RmxhZztcbiAgICB0aGlzLmxvbmcgPSBvcHRpb25GbGFncy5sb25nRmxhZztcbiAgICB0aGlzLm5lZ2F0ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmxvbmcpIHtcbiAgICAgIHRoaXMubmVnYXRlID0gdGhpcy5sb25nLnN0YXJ0c1dpdGgoJy0tbm8tJyk7XG4gICAgfVxuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wcmVzZXRBcmcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnZWYXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYXJzZUFyZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuYXJnQ2hvaWNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbmZsaWN0c1dpdGggPSBbXTtcbiAgICB0aGlzLmltcGxpZWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlLCBhbmQgb3B0aW9uYWxseSBzdXBwbHkgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGRlZmF1bHQodmFsdWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUHJlc2V0IHRvIHVzZSB3aGVuIG9wdGlvbiB1c2VkIHdpdGhvdXQgb3B0aW9uLWFyZ3VtZW50LCBlc3BlY2lhbGx5IG9wdGlvbmFsIGJ1dCBhbHNvIGJvb2xlYW4gYW5kIG5lZ2F0ZWQuXG4gICAqIFRoZSBjdXN0b20gcHJvY2Vzc2luZyAocGFyc2VBcmcpIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbmV3IE9wdGlvbignLS1jb2xvcicpLmRlZmF1bHQoJ0dSRVlTQ0FMRScpLnByZXNldCgnUkdCJyk7XG4gICAqIG5ldyBPcHRpb24oJy0tZG9uYXRlIFthbW91bnRdJykucHJlc2V0KCcyMCcpLmFyZ1BhcnNlcihwYXJzZUZsb2F0KTtcbiAgICpcbiAgICogQHBhcmFtIHsqfSBhcmdcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBwcmVzZXQoYXJnKSB7XG4gICAgdGhpcy5wcmVzZXRBcmcgPSBhcmc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG9wdGlvbiBuYW1lKHMpIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGlzIG9wdGlvbi5cbiAgICogQW4gZXJyb3Igd2lsbCBiZSBkaXNwbGF5ZWQgaWYgY29uZmxpY3Rpbmcgb3B0aW9ucyBhcmUgZm91bmQgZHVyaW5nIHBhcnNpbmcuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG5ldyBPcHRpb24oJy0tcmdiJykuY29uZmxpY3RzKCdjbXlrJyk7XG4gICAqIG5ldyBPcHRpb24oJy0tanMnKS5jb25mbGljdHMoWyd0cycsICdqc3gnXSk7XG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHN0cmluZ1tdKX0gbmFtZXNcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBjb25mbGljdHMobmFtZXMpIHtcbiAgICB0aGlzLmNvbmZsaWN0c1dpdGggPSB0aGlzLmNvbmZsaWN0c1dpdGguY29uY2F0KG5hbWVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGltcGxpZWQgb3B0aW9uIHZhbHVlcyBmb3Igd2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQgYW5kIHRoZSBpbXBsaWVkIG9wdGlvbnMgYXJlIG5vdC5cbiAgICpcbiAgICogVGhlIGN1c3RvbSBwcm9jZXNzaW5nIChwYXJzZUFyZykgaXMgbm90IGNhbGxlZCBvbiB0aGUgaW1wbGllZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW1cbiAgICogICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tbG9nJywgJ3dyaXRlIGxvZ2dpbmcgaW5mb3JtYXRpb24gdG8gZmlsZScpKVxuICAgKiAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS10cmFjZScsICdsb2cgZXh0cmEgZGV0YWlscycpLmltcGxpZXMoeyBsb2c6ICd0cmFjZS50eHQnIH0pKTtcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGltcGxpZWRPcHRpb25WYWx1ZXNcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cbiAgaW1wbGllcyhpbXBsaWVkT3B0aW9uVmFsdWVzKSB7XG4gICAgbGV0IG5ld0ltcGxpZWQgPSBpbXBsaWVkT3B0aW9uVmFsdWVzO1xuICAgIGlmICh0eXBlb2YgaW1wbGllZE9wdGlvblZhbHVlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIHN0cmluZyBpcyBub3QgZG9jdW1lbnRlZCwgYnV0IGVhc3kgbWlzdGFrZSBhbmQgd2UgY2FuIGRvIHdoYXQgdXNlciBwcm9iYWJseSBpbnRlbmRlZC5cbiAgICAgIG5ld0ltcGxpZWQgPSB7IFtpbXBsaWVkT3B0aW9uVmFsdWVzXTogdHJ1ZSB9O1xuICAgIH1cbiAgICB0aGlzLmltcGxpZWQgPSBPYmplY3QuYXNzaWduKHRoaXMuaW1wbGllZCB8fCB7fSwgbmV3SW1wbGllZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGNoZWNrIGZvciBvcHRpb24gdmFsdWUuXG4gICAqXG4gICAqIEFuIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBpZiB3aGVuIHByb2Nlc3NlZCB0aGUgY3VycmVudCBvcHRpb24gdmFsdWUgaXNcbiAgICogdW5kZWZpbmVkLCBvciB0aGUgc291cmNlIG9mIHRoZSBjdXJyZW50IHZhbHVlIGlzICdkZWZhdWx0JyBvciAnY29uZmlnJyBvciAnZW52Jy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBlbnYobmFtZSkge1xuICAgIHRoaXMuZW52VmFyID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1c3RvbSBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIENMSSBvcHRpb24gYXJndW1lbnRzIGludG8gb3B0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGFyZ1BhcnNlcihmbikge1xuICAgIHRoaXMucGFyc2VBcmcgPSBmbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgbWFuZGF0b3J5IGFuZCBtdXN0IGhhdmUgYSB2YWx1ZSBhZnRlciBwYXJzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFttYW5kYXRvcnk9dHJ1ZV1cbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBtYWtlT3B0aW9uTWFuZGF0b3J5KG1hbmRhdG9yeSA9IHRydWUpIHtcbiAgICB0aGlzLm1hbmRhdG9yeSA9ICEhbWFuZGF0b3J5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgb3B0aW9uIGluIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hpZGU9dHJ1ZV1cbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBoaWRlSGVscChoaWRlID0gdHJ1ZSkge1xuICAgIHRoaXMuaGlkZGVuID0gISFoaWRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9jb25jYXRWYWx1ZSh2YWx1ZSwgcHJldmlvdXMpIHtcbiAgICBpZiAocHJldmlvdXMgPT09IHRoaXMuZGVmYXVsdFZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHByZXZpb3VzKSkge1xuICAgICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpb3VzLmNvbmNhdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogT25seSBhbGxvdyBvcHRpb24gdmFsdWUgdG8gYmUgb25lIG9mIGNob2ljZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHZhbHVlc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGNob2ljZXModmFsdWVzKSB7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdmFsdWVzLnNsaWNlKCk7XG4gICAgdGhpcy5wYXJzZUFyZyA9IChhcmcsIHByZXZpb3VzKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJnQ2hvaWNlcy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgQWxsb3dlZCBjaG9pY2VzIGFyZSAke3RoaXMuYXJnQ2hvaWNlcy5qb2luKCcsICcpfS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFyaWFkaWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmNhdFZhbHVlKGFyZywgcHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBvcHRpb24gbmFtZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBuYW1lKCkge1xuICAgIGlmICh0aGlzLmxvbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvbmcucmVwbGFjZSgvXi0tLywgJycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG9ydC5yZXBsYWNlKC9eLS8sICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gb3B0aW9uIG5hbWUsIGluIGEgY2FtZWxjYXNlIGZvcm1hdCB0aGF0IGNhbiBiZSB1c2VkXG4gICAqIGFzIGEgb2JqZWN0IGF0dHJpYnV0ZSBrZXkuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgYXR0cmlidXRlTmFtZSgpIHtcbiAgICByZXR1cm4gY2FtZWxjYXNlKHRoaXMubmFtZSgpLnJlcGxhY2UoL15uby0vLCAnJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGBhcmdgIG1hdGNoZXMgdGhlIHNob3J0IG9yIGxvbmcgZmxhZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBpcyhhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5zaG9ydCA9PT0gYXJnIHx8IHRoaXMubG9uZyA9PT0gYXJnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIGEgYm9vbGVhbiBvcHRpb24uXG4gICAqXG4gICAqIE9wdGlvbnMgYXJlIG9uZSBvZiBib29sZWFuLCBuZWdhdGVkLCByZXF1aXJlZCBhcmd1bWVudCwgb3Igb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIGlzQm9vbGVhbigpIHtcbiAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQgJiYgIXRoaXMub3B0aW9uYWwgJiYgIXRoaXMubmVnYXRlO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byB3b3JrIHdpdGggZHVhbCBvcHRpb25zLCB3aXRob3V0IGNoYW5naW5nIHRoZSBleGlzdGluZ1xuICogaW1wbGVtZW50YXRpb24uIFdlIHN1cHBvcnQgc2VwYXJhdGUgZHVhbCBvcHRpb25zIGZvciBzZXBhcmF0ZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgb3B0aW9ucyxcbiAqIGxpa2UgYC0tYnVpbGRgIGFuZCBgLS1uby1idWlsZGAsIHdoaWNoIHNoYXJlIGEgc2luZ2xlIG9wdGlvbiB2YWx1ZS4gVGhpcyB3b3JrcyBuaWNlbHkgZm9yIHNvbWVcbiAqIHVzZSBjYXNlcywgYnV0IGlzIHRyaWNreSBmb3Igb3RoZXJzIHdoZXJlIHdlIHdhbnQgc2VwYXJhdGUgYmVoYXZpb3VycyBkZXNwaXRlXG4gKiB0aGUgc2luZ2xlIHNoYXJlZCBvcHRpb24gdmFsdWUuXG4gKi9cbmNsYXNzIER1YWxPcHRpb25zIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7T3B0aW9uW119IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLnBvc2l0aXZlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm5lZ2F0aXZlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmR1YWxPcHRpb25zID0gbmV3IFNldCgpO1xuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAob3B0aW9uLm5lZ2F0ZSkge1xuICAgICAgICB0aGlzLm5lZ2F0aXZlT3B0aW9ucy5zZXQob3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSwgb3B0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9zaXRpdmVPcHRpb25zLnNldChvcHRpb24uYXR0cmlidXRlTmFtZSgpLCBvcHRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubmVnYXRpdmVPcHRpb25zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmICh0aGlzLnBvc2l0aXZlT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgICB0aGlzLmR1YWxPcHRpb25zLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgdmFsdWUgY29tZSBmcm9tIHRoZSBvcHRpb24sIGFuZCBub3QgZnJvbSBwb3NzaWJsZSBtYXRjaGluZyBkdWFsIG9wdGlvbj9cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgdmFsdWVGcm9tT3B0aW9uKHZhbHVlLCBvcHRpb24pIHtcbiAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgIGlmICghdGhpcy5kdWFsT3B0aW9ucy5oYXMob3B0aW9uS2V5KSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBVc2UgdGhlIHZhbHVlIHRvIGRlZHVjZSBpZiAocHJvYmFibHkpIGNhbWUgZnJvbSB0aGUgb3B0aW9uLlxuICAgIGNvbnN0IHByZXNldCA9IHRoaXMubmVnYXRpdmVPcHRpb25zLmdldChvcHRpb25LZXkpLnByZXNldEFyZztcbiAgICBjb25zdCBuZWdhdGl2ZVZhbHVlID0gcHJlc2V0ICE9PSB1bmRlZmluZWQgPyBwcmVzZXQgOiBmYWxzZTtcbiAgICByZXR1cm4gb3B0aW9uLm5lZ2F0ZSA9PT0gKG5lZ2F0aXZlVmFsdWUgPT09IHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgc3RyaW5nIGZyb20ga2ViYWItY2FzZSB0byBjYW1lbENhc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjYW1lbGNhc2Uoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoJy0nKS5yZWR1Y2UoKHN0ciwgd29yZCkgPT4ge1xuICAgIHJldHVybiBzdHIgKyB3b3JkWzBdLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTcGxpdCB0aGUgc2hvcnQgYW5kIGxvbmcgZmxhZyBvdXQgb2Ygc29tZXRoaW5nIGxpa2UgJy1tLC0tbWl4ZWQgPHZhbHVlPidcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNwbGl0T3B0aW9uRmxhZ3MoZmxhZ3MpIHtcbiAgbGV0IHNob3J0RmxhZztcbiAgbGV0IGxvbmdGbGFnO1xuICAvLyBVc2Ugb3JpZ2luYWwgdmVyeSBsb29zZSBwYXJzaW5nIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBub3csXG4gIC8vIHdoaWNoIGFsbG93ZWQgZm9yIGV4YW1wbGUgdW5pbnRlbmRlZCBgLXN3LCAtLXNob3J0LXdvcmRgIFtzaWNdLlxuICBjb25zdCBmbGFnUGFydHMgPSBmbGFncy5zcGxpdCgvWyB8LF0rLyk7XG4gIGlmIChmbGFnUGFydHMubGVuZ3RoID4gMSAmJiAhL15bWzxdLy50ZXN0KGZsYWdQYXJ0c1sxXSkpXG4gICAgc2hvcnRGbGFnID0gZmxhZ1BhcnRzLnNoaWZ0KCk7XG4gIGxvbmdGbGFnID0gZmxhZ1BhcnRzLnNoaWZ0KCk7XG4gIC8vIEFkZCBzdXBwb3J0IGZvciBsb25lIHNob3J0IGZsYWcgd2l0aG91dCBzaWduaWZpY2FudGx5IGNoYW5naW5nIHBhcnNpbmchXG4gIGlmICghc2hvcnRGbGFnICYmIC9eLVteLV0kLy50ZXN0KGxvbmdGbGFnKSkge1xuICAgIHNob3J0RmxhZyA9IGxvbmdGbGFnO1xuICAgIGxvbmdGbGFnID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHNob3J0RmxhZywgbG9uZ0ZsYWcgfTtcbn1cblxuZXhwb3J0cy5PcHRpb24gPSBPcHRpb247XG5leHBvcnRzLkR1YWxPcHRpb25zID0gRHVhbE9wdGlvbnM7XG4iLAogICAgImNvbnN0IG1heERpc3RhbmNlID0gMztcblxuZnVuY3Rpb24gZWRpdERpc3RhbmNlKGEsIGIpIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGFtZXJhdeKAk0xldmVuc2h0ZWluX2Rpc3RhbmNlXG4gIC8vIENhbGN1bGF0aW5nIG9wdGltYWwgc3RyaW5nIGFsaWdubWVudCBkaXN0YW5jZSwgbm8gc3Vic3RyaW5nIGlzIGVkaXRlZCBtb3JlIHRoYW4gb25jZS5cbiAgLy8gKFNpbXBsZSBpbXBsZW1lbnRhdGlvbi4pXG5cbiAgLy8gUXVpY2sgZWFybHkgZXhpdCwgcmV0dXJuIHdvcnN0IGNhc2UuXG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heERpc3RhbmNlKVxuICAgIHJldHVybiBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gIC8vIGRpc3RhbmNlIGJldHdlZW4gcHJlZml4IHN1YnN0cmluZ3Mgb2YgYSBhbmQgYlxuICBjb25zdCBkID0gW107XG5cbiAgLy8gcHVyZSBkZWxldGlvbnMgdHVybiBhIGludG8gZW1wdHkgc3RyaW5nXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICBkW2ldID0gW2ldO1xuICB9XG4gIC8vIHB1cmUgaW5zZXJ0aW9ucyB0dXJuIGVtcHR5IHN0cmluZyBpbnRvIGJcbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGRbMF1bal0gPSBqO1xuICB9XG5cbiAgLy8gZmlsbCBtYXRyaXhcbiAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjb3N0ID0gMTtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgY29zdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3N0ID0gMTtcbiAgICAgIH1cbiAgICAgIGRbaV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgZFtpIC0gMV1bal0gKyAxLCAvLyBkZWxldGlvblxuICAgICAgICBkW2ldW2ogLSAxXSArIDEsIC8vIGluc2VydGlvblxuICAgICAgICBkW2kgLSAxXVtqIC0gMV0gKyBjb3N0LCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICk7XG4gICAgICAvLyB0cmFuc3Bvc2l0aW9uXG4gICAgICBpZiAoaSA+IDEgJiYgaiA+IDEgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDJdICYmIGFbaSAtIDJdID09PSBiW2ogLSAxXSkge1xuICAgICAgICBkW2ldW2pdID0gTWF0aC5taW4oZFtpXVtqXSwgZFtpIC0gMl1baiAtIDJdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRbYS5sZW5ndGhdW2IubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBGaW5kIGNsb3NlIG1hdGNoZXMsIHJlc3RyaWN0ZWQgdG8gc2FtZSBudW1iZXIgb2YgZWRpdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gc3VnZ2VzdFNpbWlsYXIod29yZCwgY2FuZGlkYXRlcykge1xuICBpZiAoIWNhbmRpZGF0ZXMgfHwgY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgLy8gcmVtb3ZlIHBvc3NpYmxlIGR1cGxpY2F0ZXNcbiAgY2FuZGlkYXRlcyA9IEFycmF5LmZyb20obmV3IFNldChjYW5kaWRhdGVzKSk7XG5cbiAgY29uc3Qgc2VhcmNoaW5nT3B0aW9ucyA9IHdvcmQuc3RhcnRzV2l0aCgnLS0nKTtcbiAgaWYgKHNlYXJjaGluZ09wdGlvbnMpIHtcbiAgICB3b3JkID0gd29yZC5zbGljZSgyKTtcbiAgICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnNsaWNlKDIpKTtcbiAgfVxuXG4gIGxldCBzaW1pbGFyID0gW107XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBtYXhEaXN0YW5jZTtcbiAgY29uc3QgbWluU2ltaWxhcml0eSA9IDAuNDtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoY2FuZGlkYXRlLmxlbmd0aCA8PSAxKSByZXR1cm47IC8vIG5vIG9uZSBjaGFyYWN0ZXIgZ3Vlc3Nlc1xuXG4gICAgY29uc3QgZGlzdGFuY2UgPSBlZGl0RGlzdGFuY2Uod29yZCwgY2FuZGlkYXRlKTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh3b3JkLmxlbmd0aCwgY2FuZGlkYXRlLmxlbmd0aCk7XG4gICAgY29uc3Qgc2ltaWxhcml0eSA9IChsZW5ndGggLSBkaXN0YW5jZSkgLyBsZW5ndGg7XG4gICAgaWYgKHNpbWlsYXJpdHkgPiBtaW5TaW1pbGFyaXR5KSB7XG4gICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgLy8gYmV0dGVyIGVkaXQgZGlzdGFuY2UsIHRocm93IGF3YXkgcHJldmlvdXMgd29yc2UgbWF0Y2hlc1xuICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgc2ltaWxhciA9IFtjYW5kaWRhdGVdO1xuICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIHNpbWlsYXIucHVzaChjYW5kaWRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgc2ltaWxhci5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoc2VhcmNoaW5nT3B0aW9ucykge1xuICAgIHNpbWlsYXIgPSBzaW1pbGFyLm1hcCgoY2FuZGlkYXRlKSA9PiBgLS0ke2NhbmRpZGF0ZX1gKTtcbiAgfVxuXG4gIGlmIChzaW1pbGFyLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gb25lIG9mICR7c2ltaWxhci5qb2luKCcsICcpfT8pYDtcbiAgfVxuICBpZiAoc2ltaWxhci5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gJHtzaW1pbGFyWzBdfT8pYDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydHMuc3VnZ2VzdFNpbWlsYXIgPSBzdWdnZXN0U2ltaWxhcjtcbiIsCiAgICAiY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnbm9kZTpldmVudHMnKS5FdmVudEVtaXR0ZXI7XG5jb25zdCBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdub2RlOmNoaWxkX3Byb2Nlc3MnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnbm9kZTpmcycpO1xuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ25vZGU6cHJvY2VzcycpO1xuXG5jb25zdCB7IEFyZ3VtZW50LCBodW1hblJlYWRhYmxlQXJnTmFtZSB9ID0gcmVxdWlyZSgnLi9hcmd1bWVudC5qcycpO1xuY29uc3QgeyBDb21tYW5kZXJFcnJvciB9ID0gcmVxdWlyZSgnLi9lcnJvci5qcycpO1xuY29uc3QgeyBIZWxwIH0gPSByZXF1aXJlKCcuL2hlbHAuanMnKTtcbmNvbnN0IHsgT3B0aW9uLCBEdWFsT3B0aW9ucyB9ID0gcmVxdWlyZSgnLi9vcHRpb24uanMnKTtcbmNvbnN0IHsgc3VnZ2VzdFNpbWlsYXIgfSA9IHJlcXVpcmUoJy4vc3VnZ2VzdFNpbWlsYXInKTtcblxuY2xhc3MgQ29tbWFuZCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgbmV3IGBDb21tYW5kYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogQHR5cGUge0NvbW1hbmRbXX0gKi9cbiAgICB0aGlzLmNvbW1hbmRzID0gW107XG4gICAgLyoqIEB0eXBlIHtPcHRpb25bXX0gKi9cbiAgICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5fYWxsb3dVbmtub3duT3B0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMgPSB0cnVlO1xuICAgIC8qKiBAdHlwZSB7QXJndW1lbnRbXX0gKi9cbiAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMgPSBbXTtcbiAgICB0aGlzLl9hcmdzID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzOyAvLyBkZXByZWNhdGVkIG9sZCBuYW1lXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLmFyZ3MgPSBbXTsgLy8gY2xpIGFyZ3Mgd2l0aCBvcHRpb25zIHJlbW92ZWRcbiAgICB0aGlzLnJhd0FyZ3MgPSBbXTtcbiAgICB0aGlzLnByb2Nlc3NlZEFyZ3MgPSBbXTsgLy8gbGlrZSAuYXJncyBidXQgYWZ0ZXIgY3VzdG9tIHByb2Nlc3NpbmcgYW5kIGNvbGxlY3RpbmcgdmFyaWFkaWNcbiAgICB0aGlzLl9zY3JpcHRQYXRoID0gbnVsbDtcbiAgICB0aGlzLl9uYW1lID0gbmFtZSB8fCAnJztcbiAgICB0aGlzLl9vcHRpb25WYWx1ZXMgPSB7fTtcbiAgICB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXMgPSB7fTsgLy8gZGVmYXVsdCwgZW52LCBjbGkgZXRjXG4gICAgdGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlciA9IG51bGw7XG4gICAgdGhpcy5fZXhlY3V0YWJsZUhhbmRsZXIgPSBmYWxzZTtcbiAgICB0aGlzLl9leGVjdXRhYmxlRmlsZSA9IG51bGw7IC8vIGN1c3RvbSBuYW1lIGZvciBleGVjdXRhYmxlXG4gICAgdGhpcy5fZXhlY3V0YWJsZURpciA9IG51bGw7IC8vIGN1c3RvbSBzZWFyY2ggZGlyZWN0b3J5IGZvciBzdWJjb21tYW5kc1xuICAgIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSA9IG51bGw7XG4gICAgdGhpcy5fZXhpdENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9hbGlhc2VzID0gW107XG4gICAgdGhpcy5fY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9ICcnO1xuICAgIHRoaXMuX3N1bW1hcnkgPSAnJztcbiAgICB0aGlzLl9hcmdzRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7IC8vIGxlZ2FjeVxuICAgIHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5fbGlmZUN5Y2xlSG9va3MgPSB7fTsgLy8gYSBoYXNoIG9mIGFycmF5c1xuICAgIC8qKiBAdHlwZSB7KGJvb2xlYW4gfCBzdHJpbmcpfSAqL1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuX3Nob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvciA9IHRydWU7XG5cbiAgICAvLyBzZWUgLmNvbmZpZ3VyZU91dHB1dCgpIGZvciBkb2NzXG4gICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbiA9IHtcbiAgICAgIHdyaXRlT3V0OiAoc3RyKSA9PiBwcm9jZXNzLnN0ZG91dC53cml0ZShzdHIpLFxuICAgICAgd3JpdGVFcnI6IChzdHIpID0+IHByb2Nlc3Muc3RkZXJyLndyaXRlKHN0ciksXG4gICAgICBnZXRPdXRIZWxwV2lkdGg6ICgpID0+XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyA6IHVuZGVmaW5lZCxcbiAgICAgIGdldEVyckhlbHBXaWR0aDogKCkgPT5cbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIuaXNUVFkgPyBwcm9jZXNzLnN0ZGVyci5jb2x1bW5zIDogdW5kZWZpbmVkLFxuICAgICAgb3V0cHV0RXJyb3I6IChzdHIsIHdyaXRlKSA9PiB3cml0ZShzdHIpLFxuICAgIH07XG5cbiAgICB0aGlzLl9oaWRkZW4gPSBmYWxzZTtcbiAgICAvKiogQHR5cGUgeyhPcHRpb24gfCBudWxsIHwgdW5kZWZpbmVkKX0gKi9cbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gdW5kZWZpbmVkOyAvLyBMYXp5IGNyZWF0ZWQgb24gZGVtYW5kLiBNYXkgYmUgbnVsbCBpZiBoZWxwIG9wdGlvbiBpcyBkaXNhYmxlZC5cbiAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gdW5kZWZpbmVkOyAvLyB1bmRlY2lkZWQgd2hldGhlciB0cnVlIG9yIGZhbHNlIHlldCwgbm90IGluaGVyaXRlZFxuICAgIC8qKiBAdHlwZSB7Q29tbWFuZH0gKi9cbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IHVuZGVmaW5lZDsgLy8gbGF6eSBpbml0aWFsaXNlZCwgaW5oZXJpdGVkXG4gICAgdGhpcy5faGVscENvbmZpZ3VyYXRpb24gPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHNldHRpbmdzIHRoYXQgYXJlIHVzZWZ1bCB0byBoYXZlIGluIGNvbW1vbiBhY3Jvc3Mgcm9vdCBjb21tYW5kIGFuZCBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogKFVzZWQgaW50ZXJuYWxseSB3aGVuIGFkZGluZyBhIGNvbW1hbmQgdXNpbmcgYC5jb21tYW5kKClgIHNvIHN1YmNvbW1hbmRzIGluaGVyaXQgcGFyZW50IHNldHRpbmdzLilcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBzb3VyY2VDb21tYW5kXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgY29weUluaGVyaXRlZFNldHRpbmdzKHNvdXJjZUNvbW1hbmQpIHtcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uID0gc291cmNlQ29tbWFuZC5fb3V0cHV0Q29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gc291cmNlQ29tbWFuZC5faGVscE9wdGlvbjtcbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IHNvdXJjZUNvbW1hbmQuX2hlbHBDb21tYW5kO1xuICAgIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uID0gc291cmNlQ29tbWFuZC5faGVscENvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5fZXhpdENhbGxiYWNrID0gc291cmNlQ29tbWFuZC5fZXhpdENhbGxiYWNrO1xuICAgIHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcyA9IHNvdXJjZUNvbW1hbmQuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcztcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPVxuICAgICAgc291cmNlQ29tbWFuZC5fY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlO1xuICAgIHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzID0gc291cmNlQ29tbWFuZC5fYWxsb3dFeGNlc3NBcmd1bWVudHM7XG4gICAgdGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgPSBzb3VyY2VDb21tYW5kLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucztcbiAgICB0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IgPSBzb3VyY2VDb21tYW5kLl9zaG93SGVscEFmdGVyRXJyb3I7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gc291cmNlQ29tbWFuZC5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0NvbW1hbmRbXX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgZm9yIChsZXQgY29tbWFuZCA9IHRoaXM7IGNvbW1hbmQ7IGNvbW1hbmQgPSBjb21tYW5kLnBhcmVudCkge1xuICAgICAgcmVzdWx0LnB1c2goY29tbWFuZCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGEgY29tbWFuZC5cbiAgICpcbiAgICogVGhlcmUgYXJlIHR3byBzdHlsZXMgb2YgY29tbWFuZDogcGF5IGF0dGVudGlvbiB0byB3aGVyZSB0byBwdXQgdGhlIGRlc2NyaXB0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBDb21tYW5kIGltcGxlbWVudGVkIHVzaW5nIGFjdGlvbiBoYW5kbGVyIChkZXNjcmlwdGlvbiBpcyBzdXBwbGllZCBzZXBhcmF0ZWx5IHRvIGAuY29tbWFuZGApXG4gICAqIHByb2dyYW1cbiAgICogICAuY29tbWFuZCgnY2xvbmUgPHNvdXJjZT4gW2Rlc3RpbmF0aW9uXScpXG4gICAqICAgLmRlc2NyaXB0aW9uKCdjbG9uZSBhIHJlcG9zaXRvcnkgaW50byBhIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5JylcbiAgICogICAuYWN0aW9uKChzb3VyY2UsIGRlc3RpbmF0aW9uKSA9PiB7XG4gICAqICAgICBjb25zb2xlLmxvZygnY2xvbmUgY29tbWFuZCBjYWxsZWQnKTtcbiAgICogICB9KTtcbiAgICpcbiAgICogLy8gQ29tbWFuZCBpbXBsZW1lbnRlZCB1c2luZyBzZXBhcmF0ZSBleGVjdXRhYmxlIGZpbGUgKGRlc2NyaXB0aW9uIGlzIHNlY29uZCBwYXJhbWV0ZXIgdG8gYC5jb21tYW5kYClcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdzdGFydCA8c2VydmljZT4nLCAnc3RhcnQgbmFtZWQgc2VydmljZScpXG4gICAqICAgLmNvbW1hbmQoJ3N0b3AgW3NlcnZpY2VdJywgJ3N0b3AgbmFtZWQgc2VydmljZSwgb3IgYWxsIGlmIG5vIG5hbWUgc3VwcGxpZWQnKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVBbmRBcmdzIC0gY29tbWFuZCBuYW1lIGFuZCBhcmd1bWVudHMsIGFyZ3MgYXJlIGA8cmVxdWlyZWQ+YCBvciBgW29wdGlvbmFsXWAgYW5kIGxhc3QgbWF5IGFsc28gYmUgYHZhcmlhZGljLi4uYFxuICAgKiBAcGFyYW0geyhvYmplY3QgfCBzdHJpbmcpfSBbYWN0aW9uT3B0c09yRXhlY0Rlc2NdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIChmb3IgYWN0aW9uKSwgb3IgZGVzY3JpcHRpb24gKGZvciBleGVjdXRhYmxlKVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2V4ZWNPcHRzXSAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAoZm9yIGV4ZWN1dGFibGUpXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IHJldHVybnMgbmV3IGNvbW1hbmQgZm9yIGFjdGlvbiBoYW5kbGVyLCBvciBgdGhpc2AgZm9yIGV4ZWN1dGFibGUgY29tbWFuZFxuICAgKi9cblxuICBjb21tYW5kKG5hbWVBbmRBcmdzLCBhY3Rpb25PcHRzT3JFeGVjRGVzYywgZXhlY09wdHMpIHtcbiAgICBsZXQgZGVzYyA9IGFjdGlvbk9wdHNPckV4ZWNEZXNjO1xuICAgIGxldCBvcHRzID0gZXhlY09wdHM7XG4gICAgaWYgKHR5cGVvZiBkZXNjID09PSAnb2JqZWN0JyAmJiBkZXNjICE9PSBudWxsKSB7XG4gICAgICBvcHRzID0gZGVzYztcbiAgICAgIGRlc2MgPSBudWxsO1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBbLCBuYW1lLCBhcmdzXSA9IG5hbWVBbmRBcmdzLm1hdGNoKC8oW14gXSspICooLiopLyk7XG5cbiAgICBjb25zdCBjbWQgPSB0aGlzLmNyZWF0ZUNvbW1hbmQobmFtZSk7XG4gICAgaWYgKGRlc2MpIHtcbiAgICAgIGNtZC5kZXNjcmlwdGlvbihkZXNjKTtcbiAgICAgIGNtZC5fZXhlY3V0YWJsZUhhbmRsZXIgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0cy5pc0RlZmF1bHQpIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSA9IGNtZC5fbmFtZTtcbiAgICBjbWQuX2hpZGRlbiA9ICEhKG9wdHMubm9IZWxwIHx8IG9wdHMuaGlkZGVuKTsgLy8gbm9IZWxwIGlzIGRlcHJlY2F0ZWQgb2xkIG5hbWUgZm9yIGhpZGRlblxuICAgIGNtZC5fZXhlY3V0YWJsZUZpbGUgPSBvcHRzLmV4ZWN1dGFibGVGaWxlIHx8IG51bGw7IC8vIEN1c3RvbSBuYW1lIGZvciBleGVjdXRhYmxlIGZpbGUsIHNldCBtaXNzaW5nIHRvIG51bGwgdG8gbWF0Y2ggY29uc3RydWN0b3JcbiAgICBpZiAoYXJncykgY21kLmFyZ3VtZW50cyhhcmdzKTtcbiAgICB0aGlzLl9yZWdpc3RlckNvbW1hbmQoY21kKTtcbiAgICBjbWQucGFyZW50ID0gdGhpcztcbiAgICBjbWQuY29weUluaGVyaXRlZFNldHRpbmdzKHRoaXMpO1xuXG4gICAgaWYgKGRlc2MpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiBjbWQ7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSByb3V0aW5lIHRvIGNyZWF0ZSBhIG5ldyB1bmF0dGFjaGVkIGNvbW1hbmQuXG4gICAqXG4gICAqIFNlZSAuY29tbWFuZCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBzdWJjb21tYW5kLCB3aGljaCB1c2VzIHRoaXMgcm91dGluZSB0b1xuICAgKiBjcmVhdGUgdGhlIGNvbW1hbmQuIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlQ29tbWFuZCB0byBjdXN0b21pc2Ugc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gbmV3IGNvbW1hbmRcbiAgICovXG5cbiAgY3JlYXRlQ29tbWFuZChuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBDb21tYW5kKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY3VzdG9taXNlIHRoZSBoZWxwIHdpdGggYSBzdWJjbGFzcyBvZiBIZWxwIGJ5IG92ZXJyaWRpbmcgY3JlYXRlSGVscCxcbiAgICogb3IgYnkgb3ZlcnJpZGluZyBIZWxwIHByb3BlcnRpZXMgdXNpbmcgY29uZmlndXJlSGVscCgpLlxuICAgKlxuICAgKiBAcmV0dXJuIHtIZWxwfVxuICAgKi9cblxuICBjcmVhdGVIZWxwKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBIZWxwKCksIHRoaXMuY29uZmlndXJlSGVscCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIGN1c3RvbWlzZSB0aGUgaGVscCBieSBvdmVycmlkaW5nIEhlbHAgcHJvcGVydGllcyB1c2luZyBjb25maWd1cmVIZWxwKCksXG4gICAqIG9yIHdpdGggYSBzdWJjbGFzcyBvZiBIZWxwIGJ5IG92ZXJyaWRpbmcgY3JlYXRlSGVscCgpLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbmZpZ3VyYXRpb25dIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4geyhDb21tYW5kIHwgb2JqZWN0KX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciBzdG9yZWQgY29uZmlndXJhdGlvblxuICAgKi9cblxuICBjb25maWd1cmVIZWxwKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5faGVscENvbmZpZ3VyYXRpb247XG5cbiAgICB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCBzdGRlcnIuIFlvdSBjYW4gY3VzdG9taXNlIHRoaXMgZm9yIHNwZWNpYWxcbiAgICogYXBwbGljYXRpb25zLiBZb3UgY2FuIGFsc28gY3VzdG9taXNlIHRoZSBkaXNwbGF5IG9mIGVycm9ycyBieSBvdmVycmlkaW5nIG91dHB1dEVycm9yLlxuICAgKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGFyZSBhbGwgZnVuY3Rpb25zOlxuICAgKlxuICAgKiAgICAgLy8gZnVuY3Rpb25zIHRvIGNoYW5nZSB3aGVyZSBiZWluZyB3cml0dGVuLCBzdGRvdXQgYW5kIHN0ZGVyclxuICAgKiAgICAgd3JpdGVPdXQoc3RyKVxuICAgKiAgICAgd3JpdGVFcnIoc3RyKVxuICAgKiAgICAgLy8gbWF0Y2hpbmcgZnVuY3Rpb25zIHRvIHNwZWNpZnkgd2lkdGggZm9yIHdyYXBwaW5nIGhlbHBcbiAgICogICAgIGdldE91dEhlbHBXaWR0aCgpXG4gICAqICAgICBnZXRFcnJIZWxwV2lkdGgoKVxuICAgKiAgICAgLy8gZnVuY3Rpb25zIGJhc2VkIG9uIHdoYXQgaXMgYmVpbmcgd3JpdHRlbiBvdXRcbiAgICogICAgIG91dHB1dEVycm9yKHN0ciwgd3JpdGUpIC8vIHVzZWQgZm9yIGRpc3BsYXlpbmcgZXJyb3JzLCBhbmQgbm90IHVzZWQgZm9yIGRpc3BsYXlpbmcgaGVscFxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbmZpZ3VyYXRpb25dIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4geyhDb21tYW5kIHwgb2JqZWN0KX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciBzdG9yZWQgY29uZmlndXJhdGlvblxuICAgKi9cblxuICBjb25maWd1cmVPdXRwdXQoY29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uO1xuXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSBoZWxwIG9yIGEgY3VzdG9tIG1lc3NhZ2UgYWZ0ZXIgYW4gZXJyb3Igb2NjdXJzLlxuICAgKlxuICAgKiBAcGFyYW0geyhib29sZWFufHN0cmluZyl9IFtkaXNwbGF5SGVscF1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBzaG93SGVscEFmdGVyRXJyb3IoZGlzcGxheUhlbHAgPSB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiBkaXNwbGF5SGVscCAhPT0gJ3N0cmluZycpIGRpc3BsYXlIZWxwID0gISFkaXNwbGF5SGVscDtcbiAgICB0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IgPSBkaXNwbGF5SGVscDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHN1Z2dlc3Rpb24gb2Ygc2ltaWxhciBjb21tYW5kcyBmb3IgdW5rbm93biBjb21tYW5kcywgb3Igb3B0aW9ucyBmb3IgdW5rbm93biBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkaXNwbGF5U3VnZ2VzdGlvbl1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBzaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IoZGlzcGxheVN1Z2dlc3Rpb24gPSB0cnVlKSB7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gISFkaXNwbGF5U3VnZ2VzdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwcmVwYXJlZCBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBTZWUgLmNvbW1hbmQoKSBmb3IgY3JlYXRpbmcgYW4gYXR0YWNoZWQgc3ViY29tbWFuZCB3aGljaCBpbmhlcml0cyBzZXR0aW5ncyBmcm9tIGl0cyBwYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kIC0gbmV3IHN1YmNvbW1hbmRcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXSAtIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgYWRkQ29tbWFuZChjbWQsIG9wdHMpIHtcbiAgICBpZiAoIWNtZC5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21tYW5kIHBhc3NlZCB0byAuYWRkQ29tbWFuZCgpIG11c3QgaGF2ZSBhIG5hbWVcbi0gc3BlY2lmeSB0aGUgbmFtZSBpbiBDb21tYW5kIGNvbnN0cnVjdG9yIG9yIHVzaW5nIC5uYW1lKClgKTtcbiAgICB9XG5cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBpZiAob3B0cy5pc0RlZmF1bHQpIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSA9IGNtZC5fbmFtZTtcbiAgICBpZiAob3B0cy5ub0hlbHAgfHwgb3B0cy5oaWRkZW4pIGNtZC5faGlkZGVuID0gdHJ1ZTsgLy8gbW9kaWZ5aW5nIHBhc3NlZCBjb21tYW5kIGR1ZSB0byBleGlzdGluZyBpbXBsZW1lbnRhdGlvblxuXG4gICAgdGhpcy5fcmVnaXN0ZXJDb21tYW5kKGNtZCk7XG4gICAgY21kLnBhcmVudCA9IHRoaXM7XG4gICAgY21kLl9jaGVja0ZvckJyb2tlblBhc3NUaHJvdWdoKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgYXJndW1lbnQuXG4gICAqXG4gICAqIFNlZSAuYXJndW1lbnQoKSBmb3IgY3JlYXRpbmcgYW4gYXR0YWNoZWQgYXJndW1lbnQsIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgYXJndW1lbnQuIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlQXJndW1lbnQgdG8gcmV0dXJuIGEgY3VzdG9tIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtBcmd1bWVudH0gbmV3IGFyZ3VtZW50XG4gICAqL1xuXG4gIGNyZWF0ZUFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBBcmd1bWVudChuYW1lLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCB5b3UgY2FuIGV4cGxpY2l0bHlcbiAgICogaW5kaWNhdGUgdGhpcyB3aXRoIDw+IGFyb3VuZCB0aGUgbmFtZS4gUHV0IFtdIGFyb3VuZCB0aGUgbmFtZSBmb3IgYW4gb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uYXJndW1lbnQoJzxpbnB1dC1maWxlPicpO1xuICAgKiBwcm9ncmFtLmFyZ3VtZW50KCdbb3V0cHV0LWZpbGVdJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbZm5dIC0gY3VzdG9tIGFyZ3VtZW50IHByb2Nlc3NpbmcgZnVuY3Rpb25cbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gICAgY29uc3QgYXJndW1lbnQgPSB0aGlzLmNyZWF0ZUFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcmd1bWVudC5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJndW1lbnQuZGVmYXVsdChmbik7XG4gICAgfVxuICAgIHRoaXMuYWRkQXJndW1lbnQoYXJndW1lbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBhcmd1bWVudCBzeW50YXggZm9yIGNvbW1hbmQsIGFkZGluZyBtdWx0aXBsZSBhdCBvbmNlICh3aXRob3V0IGRlc2NyaXB0aW9ucykuXG4gICAqXG4gICAqIFNlZSBhbHNvIC5hcmd1bWVudCgpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLmFyZ3VtZW50cygnPGNtZD4gW2Vudl0nKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhcmd1bWVudHMobmFtZXMpIHtcbiAgICBuYW1lc1xuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KC8gKy8pXG4gICAgICAuZm9yRWFjaCgoZGV0YWlsKSA9PiB7XG4gICAgICAgIHRoaXMuYXJndW1lbnQoZGV0YWlsKTtcbiAgICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBhcmd1bWVudCBzeW50YXggZm9yIGNvbW1hbmQsIGFkZGluZyBhIHByZXBhcmVkIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0FyZ3VtZW50fSBhcmd1bWVudFxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEFyZ3VtZW50KGFyZ3VtZW50KSB7XG4gICAgY29uc3QgcHJldmlvdXNBcmd1bWVudCA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5zbGljZSgtMSlbMF07XG4gICAgaWYgKHByZXZpb3VzQXJndW1lbnQgJiYgcHJldmlvdXNBcmd1bWVudC52YXJpYWRpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb25seSB0aGUgbGFzdCBhcmd1bWVudCBjYW4gYmUgdmFyaWFkaWMgJyR7cHJldmlvdXNBcmd1bWVudC5uYW1lKCl9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBhcmd1bWVudC5yZXF1aXJlZCAmJlxuICAgICAgYXJndW1lbnQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGFyZ3VtZW50LnBhcnNlQXJnID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSByZXF1aXJlZCBhcmd1bWVudCBpcyBuZXZlciB1c2VkOiAnJHthcmd1bWVudC5uYW1lKCl9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMucHVzaChhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9taXNlIG9yIG92ZXJyaWRlIGRlZmF1bHQgaGVscCBjb21tYW5kLiBCeSBkZWZhdWx0IGEgaGVscCBjb21tYW5kIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgaWYgeW91ciBjb21tYW5kIGhhcyBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICAgcHJvZ3JhbS5oZWxwQ29tbWFuZCgnaGVscCBbY21kXScpO1xuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKCdoZWxwIFtjbWRdJywgJ3Nob3cgaGVscCcpO1xuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKGZhbHNlKTsgLy8gc3VwcHJlc3MgZGVmYXVsdCBoZWxwIGNvbW1hbmRcbiAgICogICAgcHJvZ3JhbS5oZWxwQ29tbWFuZCh0cnVlKTsgLy8gYWRkIGhlbHAgY29tbWFuZCBldmVuIGlmIG5vIHN1YmNvbW1hbmRzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGJvb2xlYW59IGVuYWJsZU9yTmFtZUFuZEFyZ3MgLSBlbmFibGUgd2l0aCBjdXN0b20gbmFtZSBhbmQvb3IgYXJndW1lbnRzLCBvciBib29sZWFuIHRvIG92ZXJyaWRlIHdoZXRoZXIgYWRkZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl0gLSBjdXN0b20gZGVzY3JpcHRpb25cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGhlbHBDb21tYW5kKGVuYWJsZU9yTmFtZUFuZEFyZ3MsIGRlc2NyaXB0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBlbmFibGVPck5hbWVBbmRBcmdzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSBlbmFibGVPck5hbWVBbmRBcmdzO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZW5hYmxlT3JOYW1lQW5kQXJncyA9IGVuYWJsZU9yTmFtZUFuZEFyZ3MgPz8gJ2hlbHAgW2NvbW1hbmRdJztcbiAgICBjb25zdCBbLCBoZWxwTmFtZSwgaGVscEFyZ3NdID0gZW5hYmxlT3JOYW1lQW5kQXJncy5tYXRjaCgvKFteIF0rKSAqKC4qKS8pO1xuICAgIGNvbnN0IGhlbHBEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID8/ICdkaXNwbGF5IGhlbHAgZm9yIGNvbW1hbmQnO1xuXG4gICAgY29uc3QgaGVscENvbW1hbmQgPSB0aGlzLmNyZWF0ZUNvbW1hbmQoaGVscE5hbWUpO1xuICAgIGhlbHBDb21tYW5kLmhlbHBPcHRpb24oZmFsc2UpO1xuICAgIGlmIChoZWxwQXJncykgaGVscENvbW1hbmQuYXJndW1lbnRzKGhlbHBBcmdzKTtcbiAgICBpZiAoaGVscERlc2NyaXB0aW9uKSBoZWxwQ29tbWFuZC5kZXNjcmlwdGlvbihoZWxwRGVzY3JpcHRpb24pO1xuXG4gICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IHRydWU7XG4gICAgdGhpcy5faGVscENvbW1hbmQgPSBoZWxwQ29tbWFuZDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBwcmVwYXJlZCBjdXN0b20gaGVscCBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0geyhDb21tYW5kfHN0cmluZ3xib29sZWFuKX0gaGVscENvbW1hbmQgLSBjdXN0b20gaGVscCBjb21tYW5kLCBvciBkZXByZWNhdGVkIGVuYWJsZU9yTmFtZUFuZEFyZ3MgYXMgZm9yIGAuaGVscENvbW1hbmQoKWBcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXByZWNhdGVkRGVzY3JpcHRpb25dIC0gZGVwcmVjYXRlZCBjdXN0b20gZGVzY3JpcHRpb24gdXNlZCB3aXRoIGN1c3RvbSBuYW1lIG9ubHlcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRIZWxwQ29tbWFuZChoZWxwQ29tbWFuZCwgZGVwcmVjYXRlZERlc2NyaXB0aW9uKSB7XG4gICAgLy8gSWYgbm90IHBhc3NlZCBhbiBvYmplY3QsIGNhbGwgdGhyb3VnaCB0byBoZWxwQ29tbWFuZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksXG4gICAgLy8gYXMgYWRkSGVscENvbW1hbmQgd2FzIG9yaWdpbmFsbHkgdXNlZCBsaWtlIGhlbHBDb21tYW5kIGlzIG5vdy5cbiAgICBpZiAodHlwZW9mIGhlbHBDb21tYW5kICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5oZWxwQ29tbWFuZChoZWxwQ29tbWFuZCwgZGVwcmVjYXRlZERlc2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSB0cnVlO1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gaGVscENvbW1hbmQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTGF6eSBjcmVhdGUgaGVscCBjb21tYW5kLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoQ29tbWFuZHxudWxsKX1cbiAgICogQHBhY2thZ2VcbiAgICovXG4gIF9nZXRIZWxwQ29tbWFuZCgpIHtcbiAgICBjb25zdCBoYXNJbXBsaWNpdEhlbHBDb21tYW5kID1cbiAgICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPz9cbiAgICAgICh0aGlzLmNvbW1hbmRzLmxlbmd0aCAmJlxuICAgICAgICAhdGhpcy5fYWN0aW9uSGFuZGxlciAmJlxuICAgICAgICAhdGhpcy5fZmluZENvbW1hbmQoJ2hlbHAnKSk7XG5cbiAgICBpZiAoaGFzSW1wbGljaXRIZWxwQ29tbWFuZCkge1xuICAgICAgaWYgKHRoaXMuX2hlbHBDb21tYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5oZWxwQ29tbWFuZCh1bmRlZmluZWQsIHVuZGVmaW5lZCk7IC8vIHVzZSBkZWZhdWx0IG5hbWUgYW5kIGRlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5faGVscENvbW1hbmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBob29rIGZvciBsaWZlIGN5Y2xlIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGhvb2soZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgY29uc3QgYWxsb3dlZFZhbHVlcyA9IFsncHJlU3ViY29tbWFuZCcsICdwcmVBY3Rpb24nLCAncG9zdEFjdGlvbiddO1xuICAgIGlmICghYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyhldmVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSBmb3IgZXZlbnQgcGFzc2VkIHRvIGhvb2sgOiAnJHtldmVudH0nLlxuRXhwZWN0aW5nIG9uZSBvZiAnJHthbGxvd2VkVmFsdWVzLmpvaW4oXCInLCAnXCIpfSdgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSkge1xuICAgICAgdGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0gPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBjYWxsYmFjayB0byB1c2UgYXMgcmVwbGFjZW1lbnQgZm9yIGNhbGxpbmcgcHJvY2Vzcy5leGl0LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dIG9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGEgQ29tbWFuZGVyRXJyb3IsIGRlZmF1bHRzIHRvIHRocm93aW5nXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBleGl0T3ZlcnJpZGUoZm4pIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IGZuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIuY29kZSAhPT0gJ2NvbW1hbmRlci5leGVjdXRlU3ViQ29tbWFuZEFzeW5jJykge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBc3luYyBjYWxsYmFjayBmcm9tIHNwYXduIGV2ZW50cywgbm90IHVzZWZ1bCB0byB0aHJvdy5cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBwcm9jZXNzLmV4aXQsIGFuZCBfZXhpdENhbGxiYWNrIGlmIGRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBleGl0Q29kZSBleGl0IGNvZGUgZm9yIHVzaW5nIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGFuIGlkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIG5ldmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9leGl0KGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMuX2V4aXRDYWxsYmFjaykge1xuICAgICAgdGhpcy5fZXhpdENhbGxiYWNrKG5ldyBDb21tYW5kZXJFcnJvcihleGl0Q29kZSwgY29kZSwgbWVzc2FnZSkpO1xuICAgICAgLy8gRXhwZWN0aW5nIHRoaXMgbGluZSBpcyBub3QgcmVhY2hlZC5cbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBjYWxsYmFjayBgZm5gIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdzZXJ2ZScpXG4gICAqICAgLmRlc2NyaXB0aW9uKCdzdGFydCBzZXJ2aWNlJylcbiAgICogICAuYWN0aW9uKGZ1bmN0aW9uKCkge1xuICAgKiAgICAgIC8vIGRvIHdvcmsgaGVyZVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgYWN0aW9uKGZuKSB7XG4gICAgY29uc3QgbGlzdGVuZXIgPSAoYXJncykgPT4ge1xuICAgICAgLy8gVGhlIC5hY3Rpb24gY2FsbGJhY2sgdGFrZXMgYW4gZXh0cmEgcGFyYW1ldGVyIHdoaWNoIGlzIHRoZSBjb21tYW5kIG9yIG9wdGlvbnMuXG4gICAgICBjb25zdCBleHBlY3RlZEFyZ3NDb3VudCA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBjb25zdCBhY3Rpb25BcmdzID0gYXJncy5zbGljZSgwLCBleHBlY3RlZEFyZ3NDb3VudCk7XG4gICAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGFjdGlvbkFyZ3NbZXhwZWN0ZWRBcmdzQ291bnRdID0gdGhpczsgLy8gYmFja3dhcmRzIGNvbXBhdGlibGUgXCJvcHRpb25zXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGlvbkFyZ3NbZXhwZWN0ZWRBcmdzQ291bnRdID0gdGhpcy5vcHRzKCk7XG4gICAgICB9XG4gICAgICBhY3Rpb25BcmdzLnB1c2godGhpcyk7XG5cbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhY3Rpb25BcmdzKTtcbiAgICB9O1xuICAgIHRoaXMuX2FjdGlvbkhhbmRsZXIgPSBsaXN0ZW5lcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgb3B0aW9uLlxuICAgKlxuICAgKiBTZWUgLm9wdGlvbigpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBvcHRpb24sIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgb3B0aW9uLiBZb3UgY2FuIG92ZXJyaWRlIGNyZWF0ZU9wdGlvbiB0byByZXR1cm4gYSBjdXN0b20gb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7T3B0aW9ufSBuZXcgb3B0aW9uXG4gICAqL1xuXG4gIGNyZWF0ZU9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbmV3IE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgcGFyc2VBcmdzIHRvIGNhdGNoICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50Jy5cbiAgICpcbiAgICogQHBhcmFtIHsoT3B0aW9uIHwgQXJndW1lbnQpfSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Kn0gcHJldmlvdXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGludmFsaWRBcmd1bWVudE1lc3NhZ2VcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NhbGxQYXJzZUFyZyh0YXJnZXQsIHZhbHVlLCBwcmV2aW91cywgaW52YWxpZEFyZ3VtZW50TWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LnBhcnNlQXJnKHZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50Jykge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYCR7aW52YWxpZEFyZ3VtZW50TWVzc2FnZX0gJHtlcnIubWVzc2FnZX1gO1xuICAgICAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgZXhpdENvZGU6IGVyci5leGl0Q29kZSwgY29kZTogZXJyLmNvZGUgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBvcHRpb24gZmxhZyBjb25mbGljdHMuXG4gICAqIFJlZ2lzdGVyIG9wdGlvbiBpZiBubyBjb25mbGljdHMgZm91bmQsIG9yIHRocm93IG9uIGNvbmZsaWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9yZWdpc3Rlck9wdGlvbihvcHRpb24pIHtcbiAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9XG4gICAgICAob3B0aW9uLnNob3J0ICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLnNob3J0KSkgfHxcbiAgICAgIChvcHRpb24ubG9uZyAmJiB0aGlzLl9maW5kT3B0aW9uKG9wdGlvbi5sb25nKSk7XG4gICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0ZsYWcgPVxuICAgICAgICBvcHRpb24ubG9uZyAmJiB0aGlzLl9maW5kT3B0aW9uKG9wdGlvbi5sb25nKVxuICAgICAgICAgID8gb3B0aW9uLmxvbmdcbiAgICAgICAgICA6IG9wdGlvbi5zaG9ydDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFkZCBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScke3RoaXMuX25hbWUgJiYgYCB0byBjb21tYW5kICcke3RoaXMuX25hbWV9J2B9IGR1ZSB0byBjb25mbGljdGluZyBmbGFnICcke21hdGNoaW5nRmxhZ30nXG4tICBhbHJlYWR5IHVzZWQgYnkgb3B0aW9uICcke21hdGNoaW5nT3B0aW9uLmZsYWdzfSdgKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMucHVzaChvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBjb21tYW5kIG5hbWUgYW5kIGFsaWFzIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGNvbW1hbmRzLlxuICAgKiBSZWdpc3RlciBjb21tYW5kIGlmIG5vIGNvbmZsaWN0cyBmb3VuZCwgb3IgdGhyb3cgb24gY29uZmxpY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY29tbWFuZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcmVnaXN0ZXJDb21tYW5kKGNvbW1hbmQpIHtcbiAgICBjb25zdCBrbm93bkJ5ID0gKGNtZCkgPT4ge1xuICAgICAgcmV0dXJuIFtjbWQubmFtZSgpXS5jb25jYXQoY21kLmFsaWFzZXMoKSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFscmVhZHlVc2VkID0ga25vd25CeShjb21tYW5kKS5maW5kKChuYW1lKSA9PlxuICAgICAgdGhpcy5fZmluZENvbW1hbmQobmFtZSksXG4gICAgKTtcbiAgICBpZiAoYWxyZWFkeVVzZWQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ21kID0ga25vd25CeSh0aGlzLl9maW5kQ29tbWFuZChhbHJlYWR5VXNlZCkpLmpvaW4oJ3wnKTtcbiAgICAgIGNvbnN0IG5ld0NtZCA9IGtub3duQnkoY29tbWFuZCkuam9pbignfCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2Fubm90IGFkZCBjb21tYW5kICcke25ld0NtZH0nIGFzIGFscmVhZHkgaGF2ZSBjb21tYW5kICcke2V4aXN0aW5nQ21kfSdgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbW1hbmRzLnB1c2goY29tbWFuZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZE9wdGlvbihvcHRpb24pIHtcbiAgICB0aGlzLl9yZWdpc3Rlck9wdGlvbihvcHRpb24pO1xuXG4gICAgY29uc3Qgb25hbWUgPSBvcHRpb24ubmFtZSgpO1xuICAgIGNvbnN0IG5hbWUgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuXG4gICAgLy8gc3RvcmUgZGVmYXVsdCB2YWx1ZVxuICAgIGlmIChvcHRpb24ubmVnYXRlKSB7XG4gICAgICAvLyAtLW5vLWZvbyBpcyBzcGVjaWFsIGFuZCBkZWZhdWx0cyBmb28gdG8gdHJ1ZSwgdW5sZXNzIGEgLS1mb28gb3B0aW9uIGlzIGFscmVhZHkgZGVmaW5lZFxuICAgICAgY29uc3QgcG9zaXRpdmVMb25nRmxhZyA9IG9wdGlvbi5sb25nLnJlcGxhY2UoL14tLW5vLS8sICctLScpO1xuICAgICAgaWYgKCF0aGlzLl9maW5kT3B0aW9uKHBvc2l0aXZlTG9uZ0ZsYWcpKSB7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgb3B0aW9uLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbi5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgJ2RlZmF1bHQnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldE9wdGlvblZhbHVlV2l0aFNvdXJjZShuYW1lLCBvcHRpb24uZGVmYXVsdFZhbHVlLCAnZGVmYXVsdCcpO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZXIgZm9yIGNsaSBhbmQgZW52IHN1cHBsaWVkIHZhbHVlc1xuICAgIGNvbnN0IGhhbmRsZU9wdGlvblZhbHVlID0gKHZhbCwgaW52YWxpZFZhbHVlTWVzc2FnZSwgdmFsdWVTb3VyY2UpID0+IHtcbiAgICAgIC8vIHZhbCBpcyBudWxsIGZvciBvcHRpb25hbCBvcHRpb24gdXNlZCB3aXRob3V0IGFuIG9wdGlvbmFsLWFyZ3VtZW50LlxuICAgICAgLy8gdmFsIGlzIHVuZGVmaW5lZCBmb3IgYm9vbGVhbiBhbmQgbmVnYXRlZCBvcHRpb24uXG4gICAgICBpZiAodmFsID09IG51bGwgJiYgb3B0aW9uLnByZXNldEFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbCA9IG9wdGlvbi5wcmVzZXRBcmc7XG4gICAgICB9XG5cbiAgICAgIC8vIGN1c3RvbSBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUobmFtZSk7XG4gICAgICBpZiAodmFsICE9PSBudWxsICYmIG9wdGlvbi5wYXJzZUFyZykge1xuICAgICAgICB2YWwgPSB0aGlzLl9jYWxsUGFyc2VBcmcob3B0aW9uLCB2YWwsIG9sZFZhbHVlLCBpbnZhbGlkVmFsdWVNZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsICE9PSBudWxsICYmIG9wdGlvbi52YXJpYWRpYykge1xuICAgICAgICB2YWwgPSBvcHRpb24uX2NvbmNhdFZhbHVlKHZhbCwgb2xkVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaWxsLWluIGFwcHJvcHJpYXRlIG1pc3NpbmcgdmFsdWVzLiBMb25nIHdpbmRlZCBidXQgZWFzeSB0byBmb2xsb3cuXG4gICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wdGlvbi5uZWdhdGUpIHtcbiAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uaXNCb29sZWFuKCkgfHwgb3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAnJzsgLy8gbm90IG5vcm1hbCwgcGFyc2VBcmcgbWlnaHQgaGF2ZSBmYWlsZWQgb3IgYmUgYSBtb2NrIGZ1bmN0aW9uIGZvciB0ZXN0aW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKG5hbWUsIHZhbCwgdmFsdWVTb3VyY2UpO1xuICAgIH07XG5cbiAgICB0aGlzLm9uKCdvcHRpb246JyArIG9uYW1lLCAodmFsKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgYXJndW1lbnQgJyR7dmFsfScgaXMgaW52YWxpZC5gO1xuICAgICAgaGFuZGxlT3B0aW9uVmFsdWUodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCAnY2xpJyk7XG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9uLmVudlZhcikge1xuICAgICAgdGhpcy5vbignb3B0aW9uRW52OicgKyBvbmFtZSwgKHZhbCkgPT4ge1xuICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgdmFsdWUgJyR7dmFsfScgZnJvbSBlbnYgJyR7b3B0aW9uLmVudlZhcn0nIGlzIGludmFsaWQuYDtcbiAgICAgICAgaGFuZGxlT3B0aW9uVmFsdWUodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCAnZW52Jyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYnkgLm9wdGlvbigpIGFuZCAucmVxdWlyZWRPcHRpb24oKVxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vcHRpb25FeChjb25maWcsIGZsYWdzLCBkZXNjcmlwdGlvbiwgZm4sIGRlZmF1bHRWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgZmxhZ3MgPT09ICdvYmplY3QnICYmIGZsYWdzIGluc3RhbmNlb2YgT3B0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUbyBhZGQgYW4gT3B0aW9uIG9iamVjdCB1c2UgYWRkT3B0aW9uKCkgaW5zdGVhZCBvZiBvcHRpb24oKSBvciByZXF1aXJlZE9wdGlvbigpJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gICAgb3B0aW9uLm1ha2VPcHRpb25NYW5kYXRvcnkoISFjb25maWcubWFuZGF0b3J5KTtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRpb24uZGVmYXVsdChkZWZhdWx0VmFsdWUpLmFyZ1BhcnNlcihmbik7XG4gICAgfSBlbHNlIGlmIChmbiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gZGVwcmVjYXRlZFxuICAgICAgY29uc3QgcmVnZXggPSBmbjtcbiAgICAgIGZuID0gKHZhbCwgZGVmKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSByZWdleC5leGVjKHZhbCk7XG4gICAgICAgIHJldHVybiBtID8gbVswXSA6IGRlZjtcbiAgICAgIH07XG4gICAgICBvcHRpb24uZGVmYXVsdChkZWZhdWx0VmFsdWUpLmFyZ1BhcnNlcihmbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hZGRPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgb3B0aW9uIHdpdGggYGZsYWdzYCwgYGRlc2NyaXB0aW9uYCwgYW5kIG9wdGlvbmFsIGFyZ3VtZW50IHBhcnNpbmcgZnVuY3Rpb24gb3IgYGRlZmF1bHRWYWx1ZWAgb3IgYm90aC5cbiAgICpcbiAgICogVGhlIGBmbGFnc2Agc3RyaW5nIGNvbnRhaW5zIHRoZSBzaG9ydCBhbmQvb3IgbG9uZyBmbGFncywgc2VwYXJhdGVkIGJ5IGNvbW1hLCBhIHBpcGUgb3Igc3BhY2UuIEEgcmVxdWlyZWRcbiAgICogb3B0aW9uLWFyZ3VtZW50IGlzIGluZGljYXRlZCBieSBgPD5gIGFuZCBhbiBvcHRpb25hbCBvcHRpb24tYXJndW1lbnQgYnkgYFtdYC5cbiAgICpcbiAgICogU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscywgYW5kIHNlZSBhbHNvIGFkZE9wdGlvbigpIGFuZCByZXF1aXJlZE9wdGlvbigpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtXG4gICAqICAgICAub3B0aW9uKCctcCwgLS1wZXBwZXInLCAnYWRkIHBlcHBlcicpXG4gICAqICAgICAub3B0aW9uKCctcCwgLS1waXp6YS10eXBlIDxUWVBFPicsICd0eXBlIG9mIHBpenphJykgLy8gcmVxdWlyZWQgb3B0aW9uLWFyZ3VtZW50XG4gICAqICAgICAub3B0aW9uKCctYywgLS1jaGVlc2UgW0NIRUVTRV0nLCAnYWRkIGV4dHJhIGNoZWVzZScsICdtb3p6YXJlbGxhJykgLy8gb3B0aW9uYWwgb3B0aW9uLWFyZ3VtZW50IHdpdGggZGVmYXVsdFxuICAgKiAgICAgLm9wdGlvbignLXQsIC0tdGlwIDxWQUxVRT4nLCAnYWRkIHRpcCB0byBwdXJjaGFzZSBjb3N0JywgcGFyc2VGbG9hdCkgLy8gY3VzdG9tIHBhcnNlIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnwqKX0gW3BhcnNlQXJnXSAtIGN1c3RvbSBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBvciBkZWZhdWx0IHZhbHVlXG4gICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIG9wdGlvbihmbGFncywgZGVzY3JpcHRpb24sIHBhcnNlQXJnLCBkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uRXgoe30sIGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcmVxdWlyZWQgb3B0aW9uIHdoaWNoIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcuIFRoaXMgdXN1YWxseSBtZWFuc1xuICAgKiB0aGUgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIChPdGhlcndpc2UgdGhlIHNhbWUgYXMgLm9wdGlvbigpLilcbiAgICpcbiAgICogVGhlIGBmbGFnc2Agc3RyaW5nIGNvbnRhaW5zIHRoZSBzaG9ydCBhbmQvb3IgbG9uZyBmbGFncywgc2VwYXJhdGVkIGJ5IGNvbW1hLCBhIHBpcGUgb3Igc3BhY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnwqKX0gW3BhcnNlQXJnXSAtIGN1c3RvbSBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBvciBkZWZhdWx0IHZhbHVlXG4gICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHJlcXVpcmVkT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25FeChcbiAgICAgIHsgbWFuZGF0b3J5OiB0cnVlIH0sXG4gICAgICBmbGFncyxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgcGFyc2VBcmcsXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbHRlciBwYXJzaW5nIG9mIHNob3J0IGZsYWdzIHdpdGggb3B0aW9uYWwgdmFsdWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBmb3IgYC5vcHRpb24oJy1mLC0tZmxhZyBbdmFsdWVdJyk6XG4gICAqIHByb2dyYW0uY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlKHRydWUpOyAgLy8gYC1mODBgIGlzIHRyZWF0ZWQgbGlrZSBgLS1mbGFnPTgwYCwgdGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXJcbiAgICogcHJvZ3JhbS5jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUoZmFsc2UpIC8vIGAtZmJgIGlzIHRyZWF0ZWQgbGlrZSBgLWYgLWJgXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbWJpbmVdIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIGFuIG9wdGlvbmFsIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGZsYWcuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlKGNvbWJpbmUgPSB0cnVlKSB7XG4gICAgdGhpcy5fY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlID0gISFjb21iaW5lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHVua25vd24gb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthbGxvd1Vua25vd25dIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIG5vIGVycm9yIHdpbGwgYmUgdGhyb3duIGZvciB1bmtub3duIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWxsb3dVbmtub3duT3B0aW9uKGFsbG93VW5rbm93biA9IHRydWUpIHtcbiAgICB0aGlzLl9hbGxvd1Vua25vd25PcHRpb24gPSAhIWFsbG93VW5rbm93bjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBleGNlc3MgY29tbWFuZC1hcmd1bWVudHMgb24gdGhlIGNvbW1hbmQgbGluZS4gUGFzcyBmYWxzZSB0byBtYWtlIGV4Y2VzcyBhcmd1bWVudHMgYW4gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93RXhjZXNzXSAtIGlmIGB0cnVlYCBvciBvbWl0dGVkLCBubyBlcnJvciB3aWxsIGJlIHRocm93biBmb3IgZXhjZXNzIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhbGxvd0V4Y2Vzc0FyZ3VtZW50cyhhbGxvd0V4Y2VzcyA9IHRydWUpIHtcbiAgICB0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cyA9ICEhYWxsb3dFeGNlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHBvc2l0aW9uYWwgb3B0aW9ucy4gUG9zaXRpb25hbCBtZWFucyBnbG9iYWwgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGJlZm9yZSBzdWJjb21tYW5kcyB3aGljaCBsZXRzXG4gICAqIHN1YmNvbW1hbmRzIHJldXNlIHRoZSBzYW1lIG9wdGlvbiBuYW1lcywgYW5kIGFsc28gZW5hYmxlcyBzdWJjb21tYW5kcyB0byB0dXJuIG9uIHBhc3NUaHJvdWdoT3B0aW9ucy5cbiAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5vbi1wb3NpdGlvbmFsIGFuZCBnbG9iYWwgb3B0aW9ucyBtYXkgYXBwZWFyIGFueXdoZXJlIG9uIHRoZSBjb21tYW5kIGxpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bvc2l0aW9uYWxdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMocG9zaXRpb25hbCA9IHRydWUpIHtcbiAgICB0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyA9ICEhcG9zaXRpb25hbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXNzIHRocm91Z2ggb3B0aW9ucyB0aGF0IGNvbWUgYWZ0ZXIgY29tbWFuZC1hcmd1bWVudHMgcmF0aGVyIHRoYW4gdHJlYXQgdGhlbSBhcyBjb21tYW5kLW9wdGlvbnMsXG4gICAqIHNvIGFjdHVhbCBjb21tYW5kLW9wdGlvbnMgY29tZSBiZWZvcmUgY29tbWFuZC1hcmd1bWVudHMuIFR1cm5pbmcgdGhpcyBvbiBmb3IgYSBzdWJjb21tYW5kIHJlcXVpcmVzXG4gICAqIHBvc2l0aW9uYWwgb3B0aW9ucyB0byBoYXZlIGJlZW4gZW5hYmxlZCBvbiB0aGUgcHJvZ3JhbSAocGFyZW50IGNvbW1hbmRzKS5cbiAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5vbi1wb3NpdGlvbmFsIGFuZCBvcHRpb25zIG1heSBhcHBlYXIgYmVmb3JlIG9yIGFmdGVyIGNvbW1hbmQtYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXNzVGhyb3VnaF0gZm9yIHVua25vd24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBwYXNzVGhyb3VnaE9wdGlvbnMocGFzc1Rocm91Z2ggPSB0cnVlKSB7XG4gICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zID0gISFwYXNzVGhyb3VnaDtcbiAgICB0aGlzLl9jaGVja0ZvckJyb2tlblBhc3NUaHJvdWdoKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wYXJlbnQgJiZcbiAgICAgIHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucyAmJlxuICAgICAgIXRoaXMucGFyZW50Ll9lbmFibGVQb3NpdGlvbmFsT3B0aW9uc1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcGFzc1Rocm91Z2hPcHRpb25zIGNhbm5vdCBiZSB1c2VkIGZvciAnJHt0aGlzLl9uYW1lfScgd2l0aG91dCB0dXJuaW5nIG9uIGVuYWJsZVBvc2l0aW9uYWxPcHRpb25zIGZvciBwYXJlbnQgY29tbWFuZChzKWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0b3JlIG9wdGlvbiB2YWx1ZXMgYXMgcHJvcGVydGllcyBvbiBjb21tYW5kIG9iamVjdCxcbiAgICogb3Igc3RvcmUgc2VwYXJhdGVseSAoc3BlY2lmeSBmYWxzZSkuIEluIGJvdGggY2FzZXMgdGhlIG9wdGlvbiB2YWx1ZXMgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIC5vcHRzKCkuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0b3JlQXNQcm9wZXJ0aWVzPXRydWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBzdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoc3RvcmVBc1Byb3BlcnRpZXMgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbCAuc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKCkgYmVmb3JlIGFkZGluZyBvcHRpb25zJyk7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9vcHRpb25WYWx1ZXMpLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnY2FsbCAuc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKCkgYmVmb3JlIHNldHRpbmcgb3B0aW9uIHZhbHVlcycsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMgPSAhIXN0b3JlQXNQcm9wZXJ0aWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtvYmplY3R9IHZhbHVlXG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlKGtleSkge1xuICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybiB0aGlzW2tleV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vcHRpb25WYWx1ZXNba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBvcHRpb24gdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBzZXRPcHRpb25WYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKGtleSwgdmFsdWUsIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgb3B0aW9uIHZhbHVlIGFuZCB3aGVyZSB0aGUgdmFsdWUgY2FtZSBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gZXhwZWN0ZWQgdmFsdWVzIGFyZSBkZWZhdWx0L2NvbmZpZy9lbnYvY2xpL2ltcGxpZWRcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHNldE9wdGlvblZhbHVlV2l0aFNvdXJjZShrZXksIHZhbHVlLCBzb3VyY2UpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb3B0aW9uVmFsdWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9uVmFsdWVTb3VyY2VzW2tleV0gPSBzb3VyY2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBvZiBvcHRpb24gdmFsdWUuXG4gICAqIEV4cGVjdGVkIHZhbHVlcyBhcmUgZGVmYXVsdCB8IGNvbmZpZyB8IGVudiB8IGNsaSB8IGltcGxpZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlU291cmNlKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXNba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIG9mIG9wdGlvbiB2YWx1ZS4gU2VlIGFsc28gLm9wdHNXaXRoR2xvYmFscygpLlxuICAgKiBFeHBlY3RlZCB2YWx1ZXMgYXJlIGRlZmF1bHQgfCBjb25maWcgfCBlbnYgfCBjbGkgfCBpbXBsaWVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBnZXRPcHRpb25WYWx1ZVNvdXJjZVdpdGhHbG9iYWxzKGtleSkge1xuICAgIC8vIGdsb2JhbCBvdmVyd3JpdGVzIGxvY2FsLCBsaWtlIG9wdHNXaXRoR2xvYmFsc1xuICAgIGxldCBzb3VyY2U7XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLmZvckVhY2goKGNtZCkgPT4ge1xuICAgICAgaWYgKGNtZC5nZXRPcHRpb25WYWx1ZVNvdXJjZShrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc291cmNlID0gY21kLmdldE9wdGlvblZhbHVlU291cmNlKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlciBhcmd1bWVudHMgZnJvbSBpbXBsaWVkIG9yIGV4cGxpY2l0IGFyZ3VtZW50cy5cbiAgICogU2lkZS1lZmZlY3RzOiBzZXQgX3NjcmlwdFBhdGggaWYgYXJncyBpbmNsdWRlZCBzY3JpcHQuIFVzZWQgZm9yIGRlZmF1bHQgcHJvZ3JhbSBuYW1lLCBhbmQgc3ViY29tbWFuZCBzZWFyY2hlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3ByZXBhcmVVc2VyQXJncyhhcmd2LCBwYXJzZU9wdGlvbnMpIHtcbiAgICBpZiAoYXJndiAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KGFyZ3YpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpcnN0IHBhcmFtZXRlciB0byBwYXJzZSBtdXN0IGJlIGFycmF5IG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICBwYXJzZU9wdGlvbnMgPSBwYXJzZU9wdGlvbnMgfHwge307XG5cbiAgICAvLyBhdXRvLWRldGVjdCBhcmd1bWVudCBjb252ZW50aW9ucyBpZiBub3RoaW5nIHN1cHBsaWVkXG4gICAgaWYgKGFyZ3YgPT09IHVuZGVmaW5lZCAmJiBwYXJzZU9wdGlvbnMuZnJvbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy52ZXJzaW9ucz8uZWxlY3Ryb24pIHtcbiAgICAgICAgcGFyc2VPcHRpb25zLmZyb20gPSAnZWxlY3Ryb24nO1xuICAgICAgfVxuICAgICAgLy8gY2hlY2sgbm9kZSBzcGVjaWZpYyBvcHRpb25zIGZvciBzY2VuYXJpb3Mgd2hlcmUgdXNlciBDTEkgYXJncyBmb2xsb3cgZXhlY3V0YWJsZSB3aXRob3V0IHNjcmlwdG5hbWVcbiAgICAgIGNvbnN0IGV4ZWNBcmd2ID0gcHJvY2Vzcy5leGVjQXJndiA/PyBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy1lJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy0tZXZhbCcpIHx8XG4gICAgICAgIGV4ZWNBcmd2LmluY2x1ZGVzKCctcCcpIHx8XG4gICAgICAgIGV4ZWNBcmd2LmluY2x1ZGVzKCctLXByaW50JylcbiAgICAgICkge1xuICAgICAgICBwYXJzZU9wdGlvbnMuZnJvbSA9ICdldmFsJzsgLy8gaW50ZXJuYWwgdXNhZ2UsIG5vdCBkb2N1bWVudGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGVmYXVsdCB0byB1c2luZyBwcm9jZXNzLmFyZ3ZcbiAgICBpZiAoYXJndiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmd2ID0gcHJvY2Vzcy5hcmd2O1xuICAgIH1cbiAgICB0aGlzLnJhd0FyZ3MgPSBhcmd2LnNsaWNlKCk7XG5cbiAgICAvLyBleHRyYWN0IHRoZSB1c2VyIGFyZ3MgYW5kIHNjcmlwdFBhdGhcbiAgICBsZXQgdXNlckFyZ3M7XG4gICAgc3dpdGNoIChwYXJzZU9wdGlvbnMuZnJvbSkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgdGhpcy5fc2NyaXB0UGF0aCA9IGFyZ3ZbMV07XG4gICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbGVjdHJvbic6XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2UgZGVmYXVsdEFwcCBpcyBhbiB1bmtub3duIHByb3BlcnR5XG4gICAgICAgIGlmIChwcm9jZXNzLmRlZmF1bHRBcHApIHtcbiAgICAgICAgICB0aGlzLl9zY3JpcHRQYXRoID0gYXJndlsxXTtcbiAgICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXNlcic6XG4gICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdldmFsJzpcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdW5leHBlY3RlZCBwYXJzZSBvcHRpb24geyBmcm9tOiAnJHtwYXJzZU9wdGlvbnMuZnJvbX0nIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZpbmQgZGVmYXVsdCBuYW1lIGZvciBwcm9ncmFtIGZyb20gYXJndW1lbnRzLlxuICAgIGlmICghdGhpcy5fbmFtZSAmJiB0aGlzLl9zY3JpcHRQYXRoKVxuICAgICAgdGhpcy5uYW1lRnJvbUZpbGVuYW1lKHRoaXMuX3NjcmlwdFBhdGgpO1xuICAgIHRoaXMuX25hbWUgPSB0aGlzLl9uYW1lIHx8ICdwcm9ncmFtJztcblxuICAgIHJldHVybiB1c2VyQXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBgYXJndmAsIHNldHRpbmcgb3B0aW9ucyBhbmQgaW52b2tpbmcgY29tbWFuZHMgd2hlbiBkZWZpbmVkLlxuICAgKlxuICAgKiBVc2UgcGFyc2VBc3luYyBpbnN0ZWFkIG9mIHBhcnNlIGlmIGFueSBvZiB5b3VyIGFjdGlvbiBoYW5kbGVycyBhcmUgYXN5bmMuXG4gICAqXG4gICAqIENhbGwgd2l0aCBubyBwYXJhbWV0ZXJzIHRvIHBhcnNlIGBwcm9jZXNzLmFyZ3ZgLiBEZXRlY3RzIEVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgb3B0aW9ucyBsaWtlIGBub2RlIC0tZXZhbGAuIEVhc3kgbW9kZSFcbiAgICpcbiAgICogT3IgY2FsbCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gcGFyc2UsIGFuZCBvcHRpb25hbGx5IHdoZXJlIHRoZSB1c2VyIGFyZ3VtZW50cyBzdGFydCBieSBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGBmcm9tYDpcbiAgICogLSBgJ25vZGUnYDogZGVmYXVsdCwgYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIGlzIHRoZSBzY3JpcHQgYmVpbmcgcnVuLCB3aXRoIHVzZXIgYXJndW1lbnRzIGFmdGVyIHRoYXRcbiAgICogLSBgJ2VsZWN0cm9uJ2A6IGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCB2YXJpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVsZWN0cm9uIGFwcGxpY2F0aW9uIGlzIHBhY2thZ2VkXG4gICAqIC0gYCd1c2VyJ2A6IGp1c3QgdXNlciBhcmd1bWVudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5wYXJzZSgpOyAvLyBwYXJzZSBwcm9jZXNzLmFyZ3YgYW5kIGF1dG8tZGV0ZWN0IGVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgZmxhZ3NcbiAgICogcHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpOyAvLyBhc3N1bWUgYXJndlswXSBpcyBhcHAgYW5kIGFyZ3ZbMV0gaXMgc2NyaXB0XG4gICAqIHByb2dyYW0ucGFyc2UobXktYXJncywgeyBmcm9tOiAndXNlcicgfSk7IC8vIGp1c3QgdXNlciBzdXBwbGllZCBhcmd1bWVudHMsIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBhcmd2WzBdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmd2XSAtIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBwcm9jZXNzLmFyZ3ZcbiAgICogQHBhcmFtIHtvYmplY3R9IFtwYXJzZU9wdGlvbnNdIC0gb3B0aW9uYWxseSBzcGVjaWZ5IHN0eWxlIG9mIG9wdGlvbnMgd2l0aCBmcm9tOiBub2RlL3VzZXIvZWxlY3Ryb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJzZU9wdGlvbnMuZnJvbV0gLSB3aGVyZSB0aGUgYXJncyBhcmUgZnJvbTogJ25vZGUnLCAndXNlcicsICdlbGVjdHJvbidcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHBhcnNlKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGNvbnN0IHVzZXJBcmdzID0gdGhpcy5fcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucyk7XG4gICAgdGhpcy5fcGFyc2VDb21tYW5kKFtdLCB1c2VyQXJncyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBgYXJndmAsIHNldHRpbmcgb3B0aW9ucyBhbmQgaW52b2tpbmcgY29tbWFuZHMgd2hlbiBkZWZpbmVkLlxuICAgKlxuICAgKiBDYWxsIHdpdGggbm8gcGFyYW1ldGVycyB0byBwYXJzZSBgcHJvY2Vzcy5hcmd2YC4gRGV0ZWN0cyBFbGVjdHJvbiBhbmQgc3BlY2lhbCBub2RlIG9wdGlvbnMgbGlrZSBgbm9kZSAtLWV2YWxgLiBFYXN5IG1vZGUhXG4gICAqXG4gICAqIE9yIGNhbGwgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIHBhcnNlLCBhbmQgb3B0aW9uYWxseSB3aGVyZSB0aGUgdXNlciBhcmd1bWVudHMgc3RhcnQgYnkgc3BlY2lmeWluZyB3aGVyZSB0aGUgYXJndW1lbnRzIGFyZSBgZnJvbWA6XG4gICAqIC0gYCdub2RlJ2A6IGRlZmF1bHQsIGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCBpcyB0aGUgc2NyaXB0IGJlaW5nIHJ1biwgd2l0aCB1c2VyIGFyZ3VtZW50cyBhZnRlciB0aGF0XG4gICAqIC0gYCdlbGVjdHJvbidgOiBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgdmFyaWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBlbGVjdHJvbiBhcHBsaWNhdGlvbiBpcyBwYWNrYWdlZFxuICAgKiAtIGAndXNlcidgOiBqdXN0IHVzZXIgYXJndW1lbnRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGF3YWl0IHByb2dyYW0ucGFyc2VBc3luYygpOyAvLyBwYXJzZSBwcm9jZXNzLmFyZ3YgYW5kIGF1dG8tZGV0ZWN0IGVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgZmxhZ3NcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKHByb2Nlc3MuYXJndik7IC8vIGFzc3VtZSBhcmd2WzBdIGlzIGFwcCBhbmQgYXJndlsxXSBpcyBzY3JpcHRcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKG15LWFyZ3MsIHsgZnJvbTogJ3VzZXInIH0pOyAvLyBqdXN0IHVzZXIgc3VwcGxpZWQgYXJndW1lbnRzLCBub3RoaW5nIHNwZWNpYWwgYWJvdXQgYXJndlswXVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJndl1cbiAgICogQHBhcmFtIHtvYmplY3R9IFtwYXJzZU9wdGlvbnNdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJzZU9wdGlvbnMuZnJvbSAtIHdoZXJlIHRoZSBhcmdzIGFyZSBmcm9tOiAnbm9kZScsICd1c2VyJywgJ2VsZWN0cm9uJ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cblxuICBhc3luYyBwYXJzZUFzeW5jKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGNvbnN0IHVzZXJBcmdzID0gdGhpcy5fcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucyk7XG4gICAgYXdhaXQgdGhpcy5fcGFyc2VDb21tYW5kKFtdLCB1c2VyQXJncyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc3ViLWNvbW1hbmQgZXhlY3V0YWJsZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4ZWN1dGVTdWJDb21tYW5kKHN1YmNvbW1hbmQsIGFyZ3MpIHtcbiAgICBhcmdzID0gYXJncy5zbGljZSgpO1xuICAgIGxldCBsYXVuY2hXaXRoTm9kZSA9IGZhbHNlOyAvLyBVc2Ugbm9kZSBmb3Igc291cmNlIHRhcmdldHMgc28gZG8gbm90IG5lZWQgdG8gZ2V0IHBlcm1pc3Npb25zIGNvcnJlY3QsIGFuZCBvbiBXaW5kb3dzLlxuICAgIGNvbnN0IHNvdXJjZUV4dCA9IFsnLmpzJywgJy50cycsICcudHN4JywgJy5tanMnLCAnLmNqcyddO1xuXG4gICAgZnVuY3Rpb24gZmluZEZpbGUoYmFzZURpciwgYmFzZU5hbWUpIHtcbiAgICAgIC8vIExvb2sgZm9yIHNwZWNpZmllZCBmaWxlXG4gICAgICBjb25zdCBsb2NhbEJpbiA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCBiYXNlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbEJpbikpIHJldHVybiBsb2NhbEJpbjtcblxuICAgICAgLy8gU3RvcCBsb29raW5nIGlmIGNhbmRpZGF0ZSBhbHJlYWR5IGhhcyBhbiBleHBlY3RlZCBleHRlbnNpb24uXG4gICAgICBpZiAoc291cmNlRXh0LmluY2x1ZGVzKHBhdGguZXh0bmFtZShiYXNlTmFtZSkpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBUcnkgYWxsIHRoZSBleHRlbnNpb25zLlxuICAgICAgY29uc3QgZm91bmRFeHQgPSBzb3VyY2VFeHQuZmluZCgoZXh0KSA9PlxuICAgICAgICBmcy5leGlzdHNTeW5jKGAke2xvY2FsQmlufSR7ZXh0fWApLFxuICAgICAgKTtcbiAgICAgIGlmIChmb3VuZEV4dCkgcmV0dXJuIGAke2xvY2FsQmlufSR7Zm91bmRFeHR9YDtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBOb3QgY2hlY2tpbmcgZm9yIGhlbHAgZmlyc3QuIFVubGlrZWx5IHRvIGhhdmUgbWFuZGF0b3J5IGFuZCBleGVjdXRhYmxlLCBhbmQgY2FuJ3Qgcm9idXN0bHkgdGVzdCBmb3IgaGVscCBmbGFncyBpbiBleHRlcm5hbCBjb21tYW5kLlxuICAgIHRoaXMuX2NoZWNrRm9yTWlzc2luZ01hbmRhdG9yeU9wdGlvbnMoKTtcbiAgICB0aGlzLl9jaGVja0ZvckNvbmZsaWN0aW5nT3B0aW9ucygpO1xuXG4gICAgLy8gZXhlY3V0YWJsZUZpbGUgYW5kIGV4ZWN1dGFibGVEaXIgbWlnaHQgYmUgZnVsbCBwYXRoLCBvciBqdXN0IGEgbmFtZVxuICAgIGxldCBleGVjdXRhYmxlRmlsZSA9XG4gICAgICBzdWJjb21tYW5kLl9leGVjdXRhYmxlRmlsZSB8fCBgJHt0aGlzLl9uYW1lfS0ke3N1YmNvbW1hbmQuX25hbWV9YDtcbiAgICBsZXQgZXhlY3V0YWJsZURpciA9IHRoaXMuX2V4ZWN1dGFibGVEaXIgfHwgJyc7XG4gICAgaWYgKHRoaXMuX3NjcmlwdFBhdGgpIHtcbiAgICAgIGxldCByZXNvbHZlZFNjcmlwdFBhdGg7IC8vIHJlc29sdmUgcG9zc2libGUgc3ltbGluayBmb3IgaW5zdGFsbGVkIG5wbSBiaW5hcnlcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVkU2NyaXB0UGF0aCA9IGZzLnJlYWxwYXRoU3luYyh0aGlzLl9zY3JpcHRQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXNvbHZlZFNjcmlwdFBhdGggPSB0aGlzLl9zY3JpcHRQYXRoO1xuICAgICAgfVxuICAgICAgZXhlY3V0YWJsZURpciA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgcGF0aC5kaXJuYW1lKHJlc29sdmVkU2NyaXB0UGF0aCksXG4gICAgICAgIGV4ZWN1dGFibGVEaXIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIExvb2sgZm9yIGEgbG9jYWwgZmlsZSBpbiBwcmVmZXJlbmNlIHRvIGEgY29tbWFuZCBpbiBQQVRILlxuICAgIGlmIChleGVjdXRhYmxlRGlyKSB7XG4gICAgICBsZXQgbG9jYWxGaWxlID0gZmluZEZpbGUoZXhlY3V0YWJsZURpciwgZXhlY3V0YWJsZUZpbGUpO1xuXG4gICAgICAvLyBMZWdhY3kgc2VhcmNoIHVzaW5nIHByZWZpeCBvZiBzY3JpcHQgbmFtZSBpbnN0ZWFkIG9mIGNvbW1hbmQgbmFtZVxuICAgICAgaWYgKCFsb2NhbEZpbGUgJiYgIXN1YmNvbW1hbmQuX2V4ZWN1dGFibGVGaWxlICYmIHRoaXMuX3NjcmlwdFBhdGgpIHtcbiAgICAgICAgY29uc3QgbGVnYWN5TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgICAgdGhpcy5fc2NyaXB0UGF0aCxcbiAgICAgICAgICBwYXRoLmV4dG5hbWUodGhpcy5fc2NyaXB0UGF0aCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsZWdhY3lOYW1lICE9PSB0aGlzLl9uYW1lKSB7XG4gICAgICAgICAgbG9jYWxGaWxlID0gZmluZEZpbGUoXG4gICAgICAgICAgICBleGVjdXRhYmxlRGlyLFxuICAgICAgICAgICAgYCR7bGVnYWN5TmFtZX0tJHtzdWJjb21tYW5kLl9uYW1lfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXhlY3V0YWJsZUZpbGUgPSBsb2NhbEZpbGUgfHwgZXhlY3V0YWJsZUZpbGU7XG4gICAgfVxuXG4gICAgbGF1bmNoV2l0aE5vZGUgPSBzb3VyY2VFeHQuaW5jbHVkZXMocGF0aC5leHRuYW1lKGV4ZWN1dGFibGVGaWxlKSk7XG5cbiAgICBsZXQgcHJvYztcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgICAgaWYgKGxhdW5jaFdpdGhOb2RlKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChleGVjdXRhYmxlRmlsZSk7XG4gICAgICAgIC8vIGFkZCBleGVjdXRhYmxlIGFyZ3VtZW50cyB0byBzcGF3blxuICAgICAgICBhcmdzID0gaW5jcmVtZW50Tm9kZUluc3BlY3RvclBvcnQocHJvY2Vzcy5leGVjQXJndikuY29uY2F0KGFyZ3MpO1xuXG4gICAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24ocHJvY2Vzcy5hcmd2WzBdLCBhcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jID0gY2hpbGRQcm9jZXNzLnNwYXduKGV4ZWN1dGFibGVGaWxlLCBhcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MudW5zaGlmdChleGVjdXRhYmxlRmlsZSk7XG4gICAgICAvLyBhZGQgZXhlY3V0YWJsZSBhcmd1bWVudHMgdG8gc3Bhd25cbiAgICAgIGFyZ3MgPSBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChwcm9jZXNzLmV4ZWNBcmd2KS5jb25jYXQoYXJncyk7XG4gICAgICBwcm9jID0gY2hpbGRQcm9jZXNzLnNwYXduKHByb2Nlc3MuZXhlY1BhdGgsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Mua2lsbGVkKSB7XG4gICAgICAvLyB0ZXN0aW5nIG1haW5seSB0byBhdm9pZCBsZWFrIHdhcm5pbmdzIGR1cmluZyB1bml0IHRlc3RzIHdpdGggbW9ja2VkIHNwYXduXG4gICAgICBjb25zdCBzaWduYWxzID0gWydTSUdVU1IxJywgJ1NJR1VTUjInLCAnU0lHVEVSTScsICdTSUdJTlQnLCAnU0lHSFVQJ107XG4gICAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4ge1xuICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgICAgIGlmIChwcm9jLmtpbGxlZCA9PT0gZmFsc2UgJiYgcHJvYy5leGl0Q29kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBiZWNhdXNlIHNpZ25hbHMgbm90IHR5cGVkIHRvIGtub3duIHN0cmluZ3NcbiAgICAgICAgICAgIHByb2Mua2lsbChzaWduYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0IHRlcm1pbmF0ZSBwcm9jZXNzIHdoZW4gc3Bhd25lZCBwcm9jZXNzIHRlcm1pbmF0ZXMuXG4gICAgY29uc3QgZXhpdENhbGxiYWNrID0gdGhpcy5fZXhpdENhbGxiYWNrO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgIGNvZGUgPSBjb2RlID8/IDE7IC8vIGNvZGUgaXMgbnVsbCBpZiBzcGF3bmVkIHByb2Nlc3MgdGVybWluYXRlZCBkdWUgdG8gYSBzaWduYWxcbiAgICAgIGlmICghZXhpdENhbGxiYWNrKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXRDYWxsYmFjayhcbiAgICAgICAgICBuZXcgQ29tbWFuZGVyRXJyb3IoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ2NvbW1hbmRlci5leGVjdXRlU3ViQ29tbWFuZEFzeW5jJyxcbiAgICAgICAgICAgICcoY2xvc2UpJyxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBlcnIuY29kZSBpcyBhbiB1bmtub3duIHByb3BlcnR5XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGFibGVEaXJNZXNzYWdlID0gZXhlY3V0YWJsZURpclxuICAgICAgICAgID8gYHNlYXJjaGVkIGZvciBsb2NhbCBzdWJjb21tYW5kIHJlbGF0aXZlIHRvIGRpcmVjdG9yeSAnJHtleGVjdXRhYmxlRGlyfSdgXG4gICAgICAgICAgOiAnbm8gZGlyZWN0b3J5IGZvciBzZWFyY2ggZm9yIGxvY2FsIHN1YmNvbW1hbmQsIHVzZSAuZXhlY3V0YWJsZURpcigpIHRvIHN1cHBseSBhIGN1c3RvbSBkaXJlY3RvcnknO1xuICAgICAgICBjb25zdCBleGVjdXRhYmxlTWlzc2luZyA9IGAnJHtleGVjdXRhYmxlRmlsZX0nIGRvZXMgbm90IGV4aXN0XG4gLSBpZiAnJHtzdWJjb21tYW5kLl9uYW1lfScgaXMgbm90IG1lYW50IHRvIGJlIGFuIGV4ZWN1dGFibGUgY29tbWFuZCwgcmVtb3ZlIGRlc2NyaXB0aW9uIHBhcmFtZXRlciBmcm9tICcuY29tbWFuZCgpJyBhbmQgdXNlICcuZGVzY3JpcHRpb24oKScgaW5zdGVhZFxuIC0gaWYgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBuYW1lIGlzIG5vdCBzdWl0YWJsZSwgdXNlIHRoZSBleGVjdXRhYmxlRmlsZSBvcHRpb24gdG8gc3VwcGx5IGEgY3VzdG9tIG5hbWUgb3IgcGF0aFxuIC0gJHtleGVjdXRhYmxlRGlyTWVzc2FnZX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXhlY3V0YWJsZU1pc3NpbmcpO1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIGVyci5jb2RlIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgIH0gZWxzZSBpZiAoZXJyLmNvZGUgPT09ICdFQUNDRVMnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZXhlY3V0YWJsZUZpbGV9JyBub3QgZXhlY3V0YWJsZWApO1xuICAgICAgfVxuICAgICAgaWYgKCFleGl0Q2FsbGJhY2spIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IENvbW1hbmRlckVycm9yKFxuICAgICAgICAgIDEsXG4gICAgICAgICAgJ2NvbW1hbmRlci5leGVjdXRlU3ViQ29tbWFuZEFzeW5jJyxcbiAgICAgICAgICAnKGVycm9yKScsXG4gICAgICAgICk7XG4gICAgICAgIHdyYXBwZWRFcnJvci5uZXN0ZWRFcnJvciA9IGVycjtcbiAgICAgICAgZXhpdENhbGxiYWNrKHdyYXBwZWRFcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCBwcm9jZXNzXG4gICAgdGhpcy5ydW5uaW5nQ29tbWFuZCA9IHByb2M7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2Rpc3BhdGNoU3ViY29tbWFuZChjb21tYW5kTmFtZSwgb3BlcmFuZHMsIHVua25vd24pIHtcbiAgICBjb25zdCBzdWJDb21tYW5kID0gdGhpcy5fZmluZENvbW1hbmQoY29tbWFuZE5hbWUpO1xuICAgIGlmICghc3ViQ29tbWFuZCkgdGhpcy5oZWxwKHsgZXJyb3I6IHRydWUgfSk7XG5cbiAgICBsZXQgcHJvbWlzZUNoYWluO1xuICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsU3ViQ29tbWFuZEhvb2soXG4gICAgICBwcm9taXNlQ2hhaW4sXG4gICAgICBzdWJDb21tYW5kLFxuICAgICAgJ3ByZVN1YmNvbW1hbmQnLFxuICAgICk7XG4gICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGwocHJvbWlzZUNoYWluLCAoKSA9PiB7XG4gICAgICBpZiAoc3ViQ29tbWFuZC5fZXhlY3V0YWJsZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZXhlY3V0ZVN1YkNvbW1hbmQoc3ViQ29tbWFuZCwgb3BlcmFuZHMuY29uY2F0KHVua25vd24pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdWJDb21tYW5kLl9wYXJzZUNvbW1hbmQob3BlcmFuZHMsIHVua25vd24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlQ2hhaW47XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIGhlbHAgZGlyZWN0bHkgaWYgcG9zc2libGUsIG9yIGRpc3BhdGNoIGlmIG5lY2Vzc2FyeS5cbiAgICogZS5nLiBoZWxwIGZvb1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZGlzcGF0Y2hIZWxwQ29tbWFuZChzdWJjb21tYW5kTmFtZSkge1xuICAgIGlmICghc3ViY29tbWFuZE5hbWUpIHtcbiAgICAgIHRoaXMuaGVscCgpO1xuICAgIH1cbiAgICBjb25zdCBzdWJDb21tYW5kID0gdGhpcy5fZmluZENvbW1hbmQoc3ViY29tbWFuZE5hbWUpO1xuICAgIGlmIChzdWJDb21tYW5kICYmICFzdWJDb21tYW5kLl9leGVjdXRhYmxlSGFuZGxlcikge1xuICAgICAgc3ViQ29tbWFuZC5oZWxwKCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gcGFyc2luZyB0aGUgaGVscCBmbGFnIHRvIGludm9rZSB0aGUgaGVscC5cbiAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hTdWJjb21tYW5kKFxuICAgICAgc3ViY29tbWFuZE5hbWUsXG4gICAgICBbXSxcbiAgICAgIFt0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LmxvbmcgPz8gdGhpcy5fZ2V0SGVscE9wdGlvbigpPy5zaG9ydCA/PyAnLS1oZWxwJ10sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGlzLmFyZ3MgYWdhaW5zdCBleHBlY3RlZCB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGVja051bWJlck9mQXJndW1lbnRzKCkge1xuICAgIC8vIHRvbyBmZXdcbiAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMuZm9yRWFjaCgoYXJnLCBpKSA9PiB7XG4gICAgICBpZiAoYXJnLnJlcXVpcmVkICYmIHRoaXMuYXJnc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubWlzc2luZ0FyZ3VtZW50KGFyZy5uYW1lKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIHRvbyBtYW55XG4gICAgaWYgKFxuICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50c1t0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoIC0gMV0udmFyaWFkaWNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXJncy5sZW5ndGggPiB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9leGNlc3NBcmd1bWVudHModGhpcy5hcmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGlzLmFyZ3MgdXNpbmcgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzIGFuZCBzYXZlIGFzIHRoaXMucHJvY2Vzc2VkQXJncyFcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3Byb2Nlc3NBcmd1bWVudHMoKSB7XG4gICAgY29uc3QgbXlQYXJzZUFyZyA9IChhcmd1bWVudCwgdmFsdWUsIHByZXZpb3VzKSA9PiB7XG4gICAgICAvLyBFeHRyYSBwcm9jZXNzaW5nIGZvciBuaWNlIGVycm9yIG1lc3NhZ2Ugb24gcGFyc2luZyBmYWlsdXJlLlxuICAgICAgbGV0IHBhcnNlZFZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgYXJndW1lbnQucGFyc2VBcmcpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFZhbHVlTWVzc2FnZSA9IGBlcnJvcjogY29tbWFuZC1hcmd1bWVudCB2YWx1ZSAnJHt2YWx1ZX0nIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50ICcke2FyZ3VtZW50Lm5hbWUoKX0nLmA7XG4gICAgICAgIHBhcnNlZFZhbHVlID0gdGhpcy5fY2FsbFBhcnNlQXJnKFxuICAgICAgICAgIGFyZ3VtZW50LFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzLFxuICAgICAgICAgIGludmFsaWRWYWx1ZU1lc3NhZ2UsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgfTtcblxuICAgIHRoaXMuX2NoZWNrTnVtYmVyT2ZBcmd1bWVudHMoKTtcblxuICAgIGNvbnN0IHByb2Nlc3NlZEFyZ3MgPSBbXTtcbiAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMuZm9yRWFjaCgoZGVjbGFyZWRBcmcsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBkZWNsYXJlZEFyZy5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoZGVjbGFyZWRBcmcudmFyaWFkaWMpIHtcbiAgICAgICAgLy8gQ29sbGVjdCB0b2dldGhlciByZW1haW5pbmcgYXJndW1lbnRzIGZvciBwYXNzaW5nIHRvZ2V0aGVyIGFzIGFuIGFycmF5LlxuICAgICAgICBpZiAoaW5kZXggPCB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmFyZ3Muc2xpY2UoaW5kZXgpO1xuICAgICAgICAgIGlmIChkZWNsYXJlZEFyZy5wYXJzZUFyZykge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZWR1Y2UoKHByb2Nlc3NlZCwgdikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gbXlQYXJzZUFyZyhkZWNsYXJlZEFyZywgdiwgcHJvY2Vzc2VkKTtcbiAgICAgICAgICAgIH0sIGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGluZGV4IDwgdGhpcy5hcmdzLmxlbmd0aCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuYXJnc1tpbmRleF07XG4gICAgICAgIGlmIChkZWNsYXJlZEFyZy5wYXJzZUFyZykge1xuICAgICAgICAgIHZhbHVlID0gbXlQYXJzZUFyZyhkZWNsYXJlZEFyZywgdmFsdWUsIGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByb2Nlc3NlZEFyZ3NbaW5kZXhdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9jZXNzZWRBcmdzID0gcHJvY2Vzc2VkQXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmNlIHdlIGhhdmUgYSBwcm9taXNlIHdlIGNoYWluLCBidXQgY2FsbCBzeW5jaHJvbm91c2x5IHVudGlsIHRoZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7KFByb21pc2V8dW5kZWZpbmVkKX0gcHJvbWlzZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJuIHsoUHJvbWlzZXx1bmRlZmluZWQpfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hhaW5PckNhbGwocHJvbWlzZSwgZm4pIHtcbiAgICAvLyB0aGVuYWJsZVxuICAgIGlmIChwcm9taXNlICYmIHByb21pc2UudGhlbiAmJiB0eXBlb2YgcHJvbWlzZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBhbHJlYWR5IGhhdmUgYSBwcm9taXNlLCBjaGFpbiBjYWxsYmFja1xuICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoKSA9PiBmbigpKTtcbiAgICB9XG4gICAgLy8gY2FsbGJhY2sgbWlnaHQgcmV0dXJuIGEgcHJvbWlzZVxuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7KFByb21pc2V8dW5kZWZpbmVkKX0gcHJvbWlzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybiB7KFByb21pc2V8dW5kZWZpbmVkKX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoYWluT3JDYWxsSG9va3MocHJvbWlzZSwgZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gcHJvbWlzZTtcbiAgICBjb25zdCBob29rcyA9IFtdO1xuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbHRlcigoY21kKSA9PiBjbWQuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLmZvckVhY2goKGhvb2tlZENvbW1hbmQpID0+IHtcbiAgICAgICAgaG9va2VkQ29tbWFuZC5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgaG9va3MucHVzaCh7IGhvb2tlZENvbW1hbmQsIGNhbGxiYWNrIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIGlmIChldmVudCA9PT0gJ3Bvc3RBY3Rpb24nKSB7XG4gICAgICBob29rcy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgaG9va3MuZm9yRWFjaCgoaG9va0RldGFpbCkgPT4ge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fY2hhaW5PckNhbGwocmVzdWx0LCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBob29rRGV0YWlsLmNhbGxiYWNrKGhvb2tEZXRhaWwuaG9va2VkQ29tbWFuZCwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7KFByb21pc2V8dW5kZWZpbmVkKX0gcHJvbWlzZVxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IHN1YkNvbW1hbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEByZXR1cm4geyhQcm9taXNlfHVuZGVmaW5lZCl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGFpbk9yQ2FsbFN1YkNvbW1hbmRIb29rKHByb21pc2UsIHN1YkNvbW1hbmQsIGV2ZW50KSB7XG4gICAgbGV0IHJlc3VsdCA9IHByb21pc2U7XG4gICAgaWYgKHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0uZm9yRWFjaCgoaG9vaykgPT4ge1xuICAgICAgICByZXN1bHQgPSB0aGlzLl9jaGFpbk9yQ2FsbChyZXN1bHQsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gaG9vayh0aGlzLCBzdWJDb21tYW5kKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFyZ3VtZW50cyBpbiBjb250ZXh0IG9mIHRoaXMgY29tbWFuZC5cbiAgICogUmV0dXJucyBhY3Rpb24gcmVzdWx0LCBpbiBjYXNlIGl0IGlzIGEgcHJvbWlzZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3BhcnNlQ29tbWFuZChvcGVyYW5kcywgdW5rbm93bikge1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VPcHRpb25zKHVua25vd24pO1xuICAgIHRoaXMuX3BhcnNlT3B0aW9uc0VudigpOyAvLyBhZnRlciBjbGksIHNvIHBhcnNlQXJnIG5vdCBjYWxsZWQgb24gYm90aCBjbGkgYW5kIGVudlxuICAgIHRoaXMuX3BhcnNlT3B0aW9uc0ltcGxpZWQoKTtcbiAgICBvcGVyYW5kcyA9IG9wZXJhbmRzLmNvbmNhdChwYXJzZWQub3BlcmFuZHMpO1xuICAgIHVua25vd24gPSBwYXJzZWQudW5rbm93bjtcbiAgICB0aGlzLmFyZ3MgPSBvcGVyYW5kcy5jb25jYXQodW5rbm93bik7XG5cbiAgICBpZiAob3BlcmFuZHMgJiYgdGhpcy5fZmluZENvbW1hbmQob3BlcmFuZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hTdWJjb21tYW5kKG9wZXJhbmRzWzBdLCBvcGVyYW5kcy5zbGljZSgxKSwgdW5rbm93bik7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuX2dldEhlbHBDb21tYW5kKCkgJiZcbiAgICAgIG9wZXJhbmRzWzBdID09PSB0aGlzLl9nZXRIZWxwQ29tbWFuZCgpLm5hbWUoKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoSGVscENvbW1hbmQob3BlcmFuZHNbMV0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVmYXVsdENvbW1hbmROYW1lKSB7XG4gICAgICB0aGlzLl9vdXRwdXRIZWxwSWZSZXF1ZXN0ZWQodW5rbm93bik7IC8vIFJ1biB0aGUgaGVscCBmb3IgZGVmYXVsdCBjb21tYW5kIGZyb20gcGFyZW50IHJhdGhlciB0aGFuIHBhc3NpbmcgdG8gZGVmYXVsdCBjb21tYW5kXG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hTdWJjb21tYW5kKFxuICAgICAgICB0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUsXG4gICAgICAgIG9wZXJhbmRzLFxuICAgICAgICB1bmtub3duLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggJiZcbiAgICAgIHRoaXMuYXJncy5sZW5ndGggPT09IDAgJiZcbiAgICAgICF0aGlzLl9hY3Rpb25IYW5kbGVyICYmXG4gICAgICAhdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lXG4gICAgKSB7XG4gICAgICAvLyBwcm9iYWJseSBtaXNzaW5nIHN1YmNvbW1hbmQgYW5kIG5vIGhhbmRsZXIsIHVzZXIgbmVlZHMgaGVscCAoYW5kIGV4aXQpXG4gICAgICB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9vdXRwdXRIZWxwSWZSZXF1ZXN0ZWQocGFyc2VkLnVua25vd24pO1xuICAgIHRoaXMuX2NoZWNrRm9yTWlzc2luZ01hbmRhdG9yeU9wdGlvbnMoKTtcbiAgICB0aGlzLl9jaGVja0ZvckNvbmZsaWN0aW5nT3B0aW9ucygpO1xuXG4gICAgLy8gV2UgZG8gbm90IGFsd2F5cyBjYWxsIHRoaXMgY2hlY2sgdG8gYXZvaWQgbWFza2luZyBhIFwiYmV0dGVyXCIgZXJyb3IsIGxpa2UgdW5rbm93biBjb21tYW5kLlxuICAgIGNvbnN0IGNoZWNrRm9yVW5rbm93bk9wdGlvbnMgPSAoKSA9PiB7XG4gICAgICBpZiAocGFyc2VkLnVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnVua25vd25PcHRpb24ocGFyc2VkLnVua25vd25bMF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjb21tYW5kRXZlbnQgPSBgY29tbWFuZDoke3RoaXMubmFtZSgpfWA7XG4gICAgaWYgKHRoaXMuX2FjdGlvbkhhbmRsZXIpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcblxuICAgICAgbGV0IHByb21pc2VDaGFpbjtcbiAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsSG9va3MocHJvbWlzZUNoYWluLCAncHJlQWN0aW9uJyk7XG4gICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+XG4gICAgICAgIHRoaXMuX2FjdGlvbkhhbmRsZXIodGhpcy5wcm9jZXNzZWRBcmdzKSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGwocHJvbWlzZUNoYWluLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdChjb21tYW5kRXZlbnQsIG9wZXJhbmRzLCB1bmtub3duKTsgLy8gbGVnYWN5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxIb29rcyhwcm9taXNlQ2hhaW4sICdwb3N0QWN0aW9uJyk7XG4gICAgICByZXR1cm4gcHJvbWlzZUNoYWluO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQubGlzdGVuZXJDb3VudChjb21tYW5kRXZlbnQpKSB7XG4gICAgICBjaGVja0ZvclVua25vd25PcHRpb25zKCk7XG4gICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG4gICAgICB0aGlzLnBhcmVudC5lbWl0KGNvbW1hbmRFdmVudCwgb3BlcmFuZHMsIHVua25vd24pOyAvLyBsZWdhY3lcbiAgICB9IGVsc2UgaWYgKG9wZXJhbmRzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2ZpbmRDb21tYW5kKCcqJykpIHtcbiAgICAgICAgLy8gbGVnYWN5IGRlZmF1bHQgY29tbWFuZFxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hTdWJjb21tYW5kKCcqJywgb3BlcmFuZHMsIHVua25vd24pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudCgnY29tbWFuZDoqJykpIHtcbiAgICAgICAgLy8gc2tpcCBvcHRpb24gY2hlY2ssIGVtaXQgZXZlbnQgZm9yIHBvc3NpYmxlIG1pc3NwZWxsaW5nIHN1Z2dlc3Rpb25cbiAgICAgICAgdGhpcy5lbWl0KCdjb21tYW5kOionLCBvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudW5rbm93bkNvbW1hbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIC8vIFRoaXMgY29tbWFuZCBoYXMgc3ViY29tbWFuZHMgYW5kIG5vdGhpbmcgaG9va2VkIHVwIGF0IHRoaXMgbGV2ZWwsIHNvIGRpc3BsYXkgaGVscCAoYW5kIGV4aXQpLlxuICAgICAgdGhpcy5oZWxwKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcbiAgICAgIC8vIGZhbGwgdGhyb3VnaCBmb3IgY2FsbGVyIHRvIGhhbmRsZSBhZnRlciBjYWxsaW5nIC5wYXJzZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgbWF0Y2hpbmcgY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybiB7Q29tbWFuZCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIF9maW5kQ29tbWFuZChuYW1lKSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmRzLmZpbmQoXG4gICAgICAoY21kKSA9PiBjbWQuX25hbWUgPT09IG5hbWUgfHwgY21kLl9hbGlhc2VzLmluY2x1ZGVzKG5hbWUpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIG9wdGlvbiBtYXRjaGluZyBgYXJnYCBpZiBhbnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBfZmluZE9wdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLmlzKGFyZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBhIG1hbmRhdG9yeSBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIHZhbHVlLlxuICAgKiBDYWxsZWQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGhlbHAgZmxhZ3MgaW4gbGVhZiBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpIHtcbiAgICAvLyBXYWxrIHVwIGhpZXJhcmNoeSBzbyBjYW4gY2FsbCBpbiBzdWJjb21tYW5kIGFmdGVyIGNoZWNraW5nIGZvciBkaXNwbGF5aW5nIGhlbHAuXG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLmZvckVhY2goKGNtZCkgPT4ge1xuICAgICAgY21kLm9wdGlvbnMuZm9yRWFjaCgoYW5PcHRpb24pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFuT3B0aW9uLm1hbmRhdG9yeSAmJlxuICAgICAgICAgIGNtZC5nZXRPcHRpb25WYWx1ZShhbk9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY21kLm1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZShhbk9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSB1c2VkIHRvZ2V0aGVyIGluIHRoaXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tGb3JDb25mbGljdGluZ0xvY2FsT3B0aW9ucygpIHtcbiAgICBjb25zdCBkZWZpbmVkTm9uRGVmYXVsdE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBpZiAodGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb25LZXkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSAhPT0gJ2RlZmF1bHQnO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb3B0aW9uc1dpdGhDb25mbGljdGluZyA9IGRlZmluZWROb25EZWZhdWx0T3B0aW9ucy5maWx0ZXIoXG4gICAgICAob3B0aW9uKSA9PiBvcHRpb24uY29uZmxpY3RzV2l0aC5sZW5ndGggPiAwLFxuICAgICk7XG5cbiAgICBvcHRpb25zV2l0aENvbmZsaWN0aW5nLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgY29uZmxpY3RpbmdBbmREZWZpbmVkID0gZGVmaW5lZE5vbkRlZmF1bHRPcHRpb25zLmZpbmQoKGRlZmluZWQpID0+XG4gICAgICAgIG9wdGlvbi5jb25mbGljdHNXaXRoLmluY2x1ZGVzKGRlZmluZWQuYXR0cmlidXRlTmFtZSgpKSxcbiAgICAgICk7XG4gICAgICBpZiAoY29uZmxpY3RpbmdBbmREZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2NvbmZsaWN0aW5nT3B0aW9uKG9wdGlvbiwgY29uZmxpY3RpbmdBbmREZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgaWYgY29uZmxpY3Rpbmcgb3B0aW9ucyBhcmUgdXNlZCB0b2dldGhlci5cbiAgICogQ2FsbGVkIGFmdGVyIGNoZWNraW5nIGZvciBoZWxwIGZsYWdzIGluIGxlYWYgc3ViY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0ZvckNvbmZsaWN0aW5nT3B0aW9ucygpIHtcbiAgICAvLyBXYWxrIHVwIGhpZXJhcmNoeSBzbyBjYW4gY2FsbCBpbiBzdWJjb21tYW5kIGFmdGVyIGNoZWNraW5nIGZvciBkaXNwbGF5aW5nIGhlbHAuXG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLmZvckVhY2goKGNtZCkgPT4ge1xuICAgICAgY21kLl9jaGVja0ZvckNvbmZsaWN0aW5nTG9jYWxPcHRpb25zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2Ugb3B0aW9ucyBmcm9tIGBhcmd2YCByZW1vdmluZyBrbm93biBvcHRpb25zLFxuICAgKiBhbmQgcmV0dXJuIGFyZ3Ygc3BsaXQgaW50byBvcGVyYW5kcyBhbmQgdW5rbm93biBhcmd1bWVudHMuXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKlxuICAgKiAgICAgYXJndiA9PiBvcGVyYW5kcywgdW5rbm93blxuICAgKiAgICAgLS1rbm93biBra2sgb3AgPT4gW29wXSwgW11cbiAgICogICAgIG9wIC0ta25vd24ga2trID0+IFtvcF0sIFtdXG4gICAqICAgICBzdWIgLS11bmtub3duIHV1dSBvcCA9PiBbc3ViXSwgWy0tdW5rbm93biB1dXUgb3BdXG4gICAqICAgICBzdWIgLS0gLS11bmtub3duIHV1dSBvcCA9PiBbc3ViIC0tdW5rbm93biB1dXUgb3BdLCBbXVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmd2XG4gICAqIEByZXR1cm4ge3tvcGVyYW5kczogc3RyaW5nW10sIHVua25vd246IHN0cmluZ1tdfX1cbiAgICovXG5cbiAgcGFyc2VPcHRpb25zKGFyZ3YpIHtcbiAgICBjb25zdCBvcGVyYW5kcyA9IFtdOyAvLyBvcGVyYW5kcywgbm90IG9wdGlvbnMgb3IgdmFsdWVzXG4gICAgY29uc3QgdW5rbm93biA9IFtdOyAvLyBmaXJzdCB1bmtub3duIG9wdGlvbiBhbmQgcmVtYWluaW5nIHVua25vd24gYXJnc1xuICAgIGxldCBkZXN0ID0gb3BlcmFuZHM7XG4gICAgY29uc3QgYXJncyA9IGFyZ3Yuc2xpY2UoKTtcblxuICAgIGZ1bmN0aW9uIG1heWJlT3B0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIGFyZy5sZW5ndGggPiAxICYmIGFyZ1swXSA9PT0gJy0nO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIG9wdGlvbnNcbiAgICBsZXQgYWN0aXZlVmFyaWFkaWNPcHRpb24gPSBudWxsO1xuICAgIHdoaWxlIChhcmdzLmxlbmd0aCkge1xuICAgICAgY29uc3QgYXJnID0gYXJncy5zaGlmdCgpO1xuXG4gICAgICAvLyBsaXRlcmFsXG4gICAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICAgIGlmIChkZXN0ID09PSB1bmtub3duKSBkZXN0LnB1c2goYXJnKTtcbiAgICAgICAgZGVzdC5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVZhcmlhZGljT3B0aW9uICYmICFtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7YWN0aXZlVmFyaWFkaWNPcHRpb24ubmFtZSgpfWAsIGFyZyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYWN0aXZlVmFyaWFkaWNPcHRpb24gPSBudWxsO1xuXG4gICAgICBpZiAobWF5YmVPcHRpb24oYXJnKSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9maW5kT3B0aW9uKGFyZyk7XG4gICAgICAgIC8vIHJlY29nbmlzZWQgb3B0aW9uLCBjYWxsIGxpc3RlbmVyIHRvIGFzc2lnbiB2YWx1ZSB3aXRoIHBvc3NpYmxlIGN1c3RvbSBwcm9jZXNzaW5nXG4gICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9uLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB0aGlzLm9wdGlvbk1pc3NpbmdBcmd1bWVudChvcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGhpc3RvcmljYWwgYmVoYXZpb3VyIGlzIG9wdGlvbmFsIHZhbHVlIGlzIGZvbGxvd2luZyBhcmcgdW5sZXNzIGFuIG9wdGlvblxuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCAmJiAhbWF5YmVPcHRpb24oYXJnc1swXSkpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBib29sZWFuIGZsYWdcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZlVmFyaWFkaWNPcHRpb24gPSBvcHRpb24udmFyaWFkaWMgPyBvcHRpb24gOiBudWxsO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb2sgZm9yIGNvbWJvIG9wdGlvbnMgZm9sbG93aW5nIHNpbmdsZSBkYXNoLCBlYXQgZmlyc3Qgb25lIGlmIGtub3duLlxuICAgICAgaWYgKGFyZy5sZW5ndGggPiAyICYmIGFyZ1swXSA9PT0gJy0nICYmIGFyZ1sxXSAhPT0gJy0nKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYC0ke2FyZ1sxXX1gKTtcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG9wdGlvbi5yZXF1aXJlZCB8fFxuICAgICAgICAgICAgKG9wdGlvbi5vcHRpb25hbCAmJiB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBvcHRpb24gd2l0aCB2YWx1ZSBmb2xsb3dpbmcgaW4gc2FtZSBhcmd1bWVudFxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIGFyZy5zbGljZSgyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJvb2xlYW4gb3B0aW9uLCBlbWl0IGFuZCBwdXQgYmFjayByZW1haW5kZXIgb2YgYXJnIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gKTtcbiAgICAgICAgICAgIGFyZ3MudW5zaGlmdChgLSR7YXJnLnNsaWNlKDIpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb29rIGZvciBrbm93biBsb25nIGZsYWcgd2l0aCB2YWx1ZSwgbGlrZSAtLWZvbz1iYXJcbiAgICAgIGlmICgvXi0tW149XSs9Ly50ZXN0KGFyZykpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhcmcuaW5kZXhPZignPScpO1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9maW5kT3B0aW9uKGFyZy5zbGljZSgwLCBpbmRleCkpO1xuICAgICAgICBpZiAob3B0aW9uICYmIChvcHRpb24ucmVxdWlyZWQgfHwgb3B0aW9uLm9wdGlvbmFsKSkge1xuICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCBhcmcuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTm90IGEgcmVjb2duaXNlZCBvcHRpb24gYnkgdGhpcyBjb21tYW5kLlxuICAgICAgLy8gTWlnaHQgYmUgYSBjb21tYW5kLWFyZ3VtZW50LCBvciBzdWJjb21tYW5kIG9wdGlvbiwgb3IgdW5rbm93biBvcHRpb24sIG9yIGhlbHAgY29tbWFuZCBvciBvcHRpb24uXG5cbiAgICAgIC8vIEFuIHVua25vd24gb3B0aW9uIG1lYW5zIGZ1cnRoZXIgYXJndW1lbnRzIGFsc28gY2xhc3NpZmllZCBhcyB1bmtub3duIHNvIGNhbiBiZSByZXByb2Nlc3NlZCBieSBzdWJjb21tYW5kcy5cbiAgICAgIGlmIChtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIGRlc3QgPSB1bmtub3duO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2luZyBwb3NpdGlvbmFsT3B0aW9ucywgc3RvcCBwcm9jZXNzaW5nIG91ciBvcHRpb25zIGF0IHN1YmNvbW1hbmQuXG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyB8fCB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMpICYmXG4gICAgICAgIG9wZXJhbmRzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICB1bmtub3duLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLl9maW5kQ29tbWFuZChhcmcpKSB7XG4gICAgICAgICAgb3BlcmFuZHMucHVzaChhcmcpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHVua25vd24ucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLl9nZXRIZWxwQ29tbWFuZCgpICYmXG4gICAgICAgICAgYXJnID09PSB0aGlzLl9nZXRIZWxwQ29tbWFuZCgpLm5hbWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKGFyZyk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgb3BlcmFuZHMucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUpIHtcbiAgICAgICAgICB1bmtub3duLnB1c2goYXJnKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB1bmtub3duLnB1c2goLi4uYXJncyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdXNpbmcgcGFzc1Rocm91Z2hPcHRpb25zLCBzdG9wIHByb2Nlc3Npbmcgb3B0aW9ucyBhdCBmaXJzdCBjb21tYW5kLWFyZ3VtZW50LlxuICAgICAgaWYgKHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucykge1xuICAgICAgICBkZXN0LnB1c2goYXJnKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgZGVzdC5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIGFyZ1xuICAgICAgZGVzdC5wdXNoKGFyZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgb3BlcmFuZHMsIHVua25vd24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbG9jYWwgb3B0aW9uIHZhbHVlcyBhcyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIG9wdHMoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgLy8gUHJlc2VydmUgb3JpZ2luYWwgYmVoYXZpb3VyIHNvIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdoZW4gc3RpbGwgdXNpbmcgcHJvcGVydGllc1xuICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICBjb25zdCBsZW4gPSB0aGlzLm9wdGlvbnMubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMub3B0aW9uc1tpXS5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICAgIHJlc3VsdFtrZXldID1cbiAgICAgICAgICBrZXkgPT09IHRoaXMuX3ZlcnNpb25PcHRpb25OYW1lID8gdGhpcy5fdmVyc2lvbiA6IHRoaXNba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWVyZ2VkIGxvY2FsIGFuZCBnbG9iYWwgb3B0aW9uIHZhbHVlcyBhcyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIG9wdHNXaXRoR2xvYmFscygpIHtcbiAgICAvLyBnbG9iYWxzIG92ZXJ3cml0ZSBsb2NhbHNcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLnJlZHVjZShcbiAgICAgIChjb21iaW5lZE9wdGlvbnMsIGNtZCkgPT4gT2JqZWN0LmFzc2lnbihjb21iaW5lZE9wdGlvbnMsIGNtZC5vcHRzKCkpLFxuICAgICAge30sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgKG9yIGNhbGwgZXhpdE92ZXJyaWRlKS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtvYmplY3R9IFtlcnJvck9wdGlvbnNdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXJyb3JPcHRpb25zLmNvZGVdIC0gYW4gaWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3JcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtlcnJvck9wdGlvbnMuZXhpdENvZGVdIC0gdXNlZCB3aXRoIHByb2Nlc3MuZXhpdFxuICAgKi9cbiAgZXJyb3IobWVzc2FnZSwgZXJyb3JPcHRpb25zKSB7XG4gICAgLy8gb3V0cHV0IGhhbmRsaW5nXG4gICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi5vdXRwdXRFcnJvcihcbiAgICAgIGAke21lc3NhZ2V9XFxuYCxcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIsXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoYCR7dGhpcy5fc2hvd0hlbHBBZnRlckVycm9yfVxcbmApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc2hvd0hlbHBBZnRlckVycm9yKSB7XG4gICAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlRXJyKCdcXG4nKTtcbiAgICAgIHRoaXMub3V0cHV0SGVscCh7IGVycm9yOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIGV4aXQgaGFuZGxpbmdcbiAgICBjb25zdCBjb25maWcgPSBlcnJvck9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZXhpdENvZGUgPSBjb25maWcuZXhpdENvZGUgfHwgMTtcbiAgICBjb25zdCBjb2RlID0gY29uZmlnLmNvZGUgfHwgJ2NvbW1hbmRlci5lcnJvcic7XG4gICAgdGhpcy5fZXhpdChleGl0Q29kZSwgY29kZSwgbWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYW55IG9wdGlvbiByZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcywgaWYgb3B0aW9uIGRvZXNcbiAgICogbm90IGhhdmUgYSB2YWx1ZSBmcm9tIGNsaSBvciBjbGllbnQgY29kZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYXJzZU9wdGlvbnNFbnYoKSB7XG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKG9wdGlvbi5lbnZWYXIgJiYgb3B0aW9uLmVudlZhciBpbiBwcm9jZXNzLmVudikge1xuICAgICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgICAgICAvLyBQcmlvcml0eSBjaGVjay4gRG8gbm90IG92ZXJ3cml0ZSBjbGkgb3Igb3B0aW9ucyBmcm9tIHVua25vd24gc291cmNlIChjbGllbnQtY29kZSkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIFsnZGVmYXVsdCcsICdjb25maWcnLCAnZW52J10uaW5jbHVkZXMoXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSksXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAob3B0aW9uLnJlcXVpcmVkIHx8IG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgICAgICAgLy8gb3B0aW9uIGNhbiB0YWtlIGEgdmFsdWVcbiAgICAgICAgICAgIC8vIGtlZXAgdmVyeSBzaW1wbGUsIG9wdGlvbmFsIGFsd2F5cyB0YWtlcyB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb25FbnY6JHtvcHRpb24ubmFtZSgpfWAsIHByb2Nlc3MuZW52W29wdGlvbi5lbnZWYXJdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYm9vbGVhblxuICAgICAgICAgICAgLy8ga2VlcCB2ZXJ5IHNpbXBsZSwgb25seSBjYXJlIHRoYXQgZW52VmFyIGRlZmluZWQgYW5kIG5vdCB0aGUgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uRW52OiR7b3B0aW9uLm5hbWUoKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbnkgaW1wbGllZCBvcHRpb24gdmFsdWVzLCBpZiBvcHRpb24gaXMgdW5kZWZpbmVkIG9yIGRlZmF1bHQgdmFsdWUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcGFyc2VPcHRpb25zSW1wbGllZCgpIHtcbiAgICBjb25zdCBkdWFsSGVscGVyID0gbmV3IER1YWxPcHRpb25zKHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3QgaGFzQ3VzdG9tT3B0aW9uVmFsdWUgPSAob3B0aW9uS2V5KSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhWydkZWZhdWx0JywgJ2ltcGxpZWQnXS5pbmNsdWRlcyh0aGlzLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSkpXG4gICAgICApO1xuICAgIH07XG4gICAgdGhpcy5vcHRpb25zXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAob3B0aW9uKSA9PlxuICAgICAgICAgIG9wdGlvbi5pbXBsaWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBoYXNDdXN0b21PcHRpb25WYWx1ZShvcHRpb24uYXR0cmlidXRlTmFtZSgpKSAmJlxuICAgICAgICAgIGR1YWxIZWxwZXIudmFsdWVGcm9tT3B0aW9uKFxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb24uYXR0cmlidXRlTmFtZSgpKSxcbiAgICAgICAgICAgIG9wdGlvbixcbiAgICAgICAgICApLFxuICAgICAgKVxuICAgICAgLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhvcHRpb24uaW1wbGllZClcbiAgICAgICAgICAuZmlsdGVyKChpbXBsaWVkS2V5KSA9PiAhaGFzQ3VzdG9tT3B0aW9uVmFsdWUoaW1wbGllZEtleSkpXG4gICAgICAgICAgLmZvckVhY2goKGltcGxpZWRLZXkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKFxuICAgICAgICAgICAgICBpbXBsaWVkS2V5LFxuICAgICAgICAgICAgICBvcHRpb24uaW1wbGllZFtpbXBsaWVkS2V5XSxcbiAgICAgICAgICAgICAgJ2ltcGxpZWQnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50IGBuYW1lYCBpcyBtaXNzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBtaXNzaW5nQXJndW1lbnQobmFtZSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgJyR7bmFtZX0nYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5taXNzaW5nQXJndW1lbnQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBPcHRpb25gIGlzIG1pc3NpbmcgYW4gYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgb3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyBhcmd1bWVudCBtaXNzaW5nYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5vcHRpb25NaXNzaW5nQXJndW1lbnQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBPcHRpb25gIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIGlzIGEgbWFuZGF0b3J5IG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBtaXNzaW5nTWFuZGF0b3J5T3B0aW9uVmFsdWUob3B0aW9uKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogcmVxdWlyZWQgb3B0aW9uICcke29wdGlvbi5mbGFnc30nIG5vdCBzcGVjaWZpZWRgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZScgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgY29uZmxpY3RzIHdpdGggYW5vdGhlciBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHBhcmFtIHtPcHRpb259IGNvbmZsaWN0aW5nT3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY29uZmxpY3RpbmdPcHRpb24ob3B0aW9uLCBjb25mbGljdGluZ09wdGlvbikge1xuICAgIC8vIFRoZSBjYWxsaW5nIGNvZGUgZG9lcyBub3Qga25vdyB3aGV0aGVyIGEgbmVnYXRlZCBvcHRpb24gaXMgdGhlIHNvdXJjZSBvZiB0aGVcbiAgICAvLyB2YWx1ZSwgc28gZG8gc29tZSB3b3JrIHRvIHRha2UgYW4gZWR1Y2F0ZWQgZ3Vlc3MuXG4gICAgY29uc3QgZmluZEJlc3RPcHRpb25Gcm9tVmFsdWUgPSAob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSk7XG4gICAgICBjb25zdCBuZWdhdGl2ZU9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKFxuICAgICAgICAodGFyZ2V0KSA9PiB0YXJnZXQubmVnYXRlICYmIG9wdGlvbktleSA9PT0gdGFyZ2V0LmF0dHJpYnV0ZU5hbWUoKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBwb3NpdGl2ZU9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKFxuICAgICAgICAodGFyZ2V0KSA9PiAhdGFyZ2V0Lm5lZ2F0ZSAmJiBvcHRpb25LZXkgPT09IHRhcmdldC5hdHRyaWJ1dGVOYW1lKCksXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBuZWdhdGl2ZU9wdGlvbiAmJlxuICAgICAgICAoKG5lZ2F0aXZlT3B0aW9uLnByZXNldEFyZyA9PT0gdW5kZWZpbmVkICYmIG9wdGlvblZhbHVlID09PSBmYWxzZSkgfHxcbiAgICAgICAgICAobmVnYXRpdmVPcHRpb24ucHJlc2V0QXJnICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG9wdGlvblZhbHVlID09PSBuZWdhdGl2ZU9wdGlvbi5wcmVzZXRBcmcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBuZWdhdGl2ZU9wdGlvbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3NpdGl2ZU9wdGlvbiB8fCBvcHRpb247XG4gICAgfTtcblxuICAgIGNvbnN0IGdldEVycm9yTWVzc2FnZSA9IChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IGJlc3RPcHRpb24gPSBmaW5kQmVzdE9wdGlvbkZyb21WYWx1ZShvcHRpb24pO1xuICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gYmVzdE9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSk7XG4gICAgICBpZiAoc291cmNlID09PSAnZW52Jykge1xuICAgICAgICByZXR1cm4gYGVudmlyb25tZW50IHZhcmlhYmxlICcke2Jlc3RPcHRpb24uZW52VmFyfSdgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBvcHRpb24gJyR7YmVzdE9wdGlvbi5mbGFnc30nYDtcbiAgICB9O1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogJHtnZXRFcnJvck1lc3NhZ2Uob3B0aW9uKX0gY2Fubm90IGJlIHVzZWQgd2l0aCAke2dldEVycm9yTWVzc2FnZShjb25mbGljdGluZ09wdGlvbil9YDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5jb25mbGljdGluZ09wdGlvbicgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5rbm93biBvcHRpb24gYGZsYWdgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB1bmtub3duT3B0aW9uKGZsYWcpIHtcbiAgICBpZiAodGhpcy5fYWxsb3dVbmtub3duT3B0aW9uKSByZXR1cm47XG4gICAgbGV0IHN1Z2dlc3Rpb24gPSAnJztcblxuICAgIGlmIChmbGFnLnN0YXJ0c1dpdGgoJy0tJykgJiYgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yKSB7XG4gICAgICAvLyBMb29waW5nIHRvIHBpY2sgdXAgdGhlIGdsb2JhbCBvcHRpb25zIHRvb1xuICAgICAgbGV0IGNhbmRpZGF0ZUZsYWdzID0gW107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGxldCBjb21tYW5kID0gdGhpcztcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgbW9yZUZsYWdzID0gY29tbWFuZFxuICAgICAgICAgIC5jcmVhdGVIZWxwKClcbiAgICAgICAgICAudmlzaWJsZU9wdGlvbnMoY29tbWFuZClcbiAgICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5sb25nKVxuICAgICAgICAgIC5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLmxvbmcpO1xuICAgICAgICBjYW5kaWRhdGVGbGFncyA9IGNhbmRpZGF0ZUZsYWdzLmNvbmNhdChtb3JlRmxhZ3MpO1xuICAgICAgICBjb21tYW5kID0gY29tbWFuZC5wYXJlbnQ7XG4gICAgICB9IHdoaWxlIChjb21tYW5kICYmICFjb21tYW5kLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyk7XG4gICAgICBzdWdnZXN0aW9uID0gc3VnZ2VzdFNpbWlsYXIoZmxhZywgY2FuZGlkYXRlRmxhZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHVua25vd24gb3B0aW9uICcke2ZsYWd9JyR7c3VnZ2VzdGlvbn1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLnVua25vd25PcHRpb24nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2VzcyBhcmd1bWVudHMsIG1vcmUgdGhhbiBleHBlY3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcmVjZWl2ZWRBcmdzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9leGNlc3NBcmd1bWVudHMocmVjZWl2ZWRBcmdzKSB7XG4gICAgaWYgKHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzKSByZXR1cm47XG5cbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGg7XG4gICAgY29uc3QgcyA9IGV4cGVjdGVkID09PSAxID8gJycgOiAncyc7XG4gICAgY29uc3QgZm9yU3ViY29tbWFuZCA9IHRoaXMucGFyZW50ID8gYCBmb3IgJyR7dGhpcy5uYW1lKCl9J2AgOiAnJztcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiB0b28gbWFueSBhcmd1bWVudHMke2ZvclN1YmNvbW1hbmR9LiBFeHBlY3RlZCAke2V4cGVjdGVkfSBhcmd1bWVudCR7c30gYnV0IGdvdCAke3JlY2VpdmVkQXJncy5sZW5ndGh9LmA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIuZXhjZXNzQXJndW1lbnRzJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmtub3duIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHVua25vd25Db21tYW5kKCkge1xuICAgIGNvbnN0IHVua25vd25OYW1lID0gdGhpcy5hcmdzWzBdO1xuICAgIGxldCBzdWdnZXN0aW9uID0gJyc7XG5cbiAgICBpZiAodGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVOYW1lcyA9IFtdO1xuICAgICAgdGhpcy5jcmVhdGVIZWxwKClcbiAgICAgICAgLnZpc2libGVDb21tYW5kcyh0aGlzKVxuICAgICAgICAuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgIGNhbmRpZGF0ZU5hbWVzLnB1c2goY29tbWFuZC5uYW1lKCkpO1xuICAgICAgICAgIC8vIGp1c3QgdmlzaWJsZSBhbGlhc1xuICAgICAgICAgIGlmIChjb21tYW5kLmFsaWFzKCkpIGNhbmRpZGF0ZU5hbWVzLnB1c2goY29tbWFuZC5hbGlhcygpKTtcbiAgICAgICAgfSk7XG4gICAgICBzdWdnZXN0aW9uID0gc3VnZ2VzdFNpbWlsYXIodW5rbm93bk5hbWUsIGNhbmRpZGF0ZU5hbWVzKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiB1bmtub3duIGNvbW1hbmQgJyR7dW5rbm93bk5hbWV9JyR7c3VnZ2VzdGlvbn1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLnVua25vd25Db21tYW5kJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBwcm9ncmFtIHZlcnNpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGF1dG8tcmVnaXN0ZXJzIHRoZSBcIi1WLCAtLXZlcnNpb25cIiBvcHRpb24gd2hpY2ggd2lsbCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIuXG4gICAqXG4gICAqIFlvdSBjYW4gb3B0aW9uYWxseSBzdXBwbHkgdGhlIGZsYWdzIGFuZCBkZXNjcmlwdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHsodGhpcyB8IHN0cmluZyB8IHVuZGVmaW5lZCl9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZywgb3IgdmVyc2lvbiBzdHJpbmcgaWYgbm8gYXJndW1lbnRzXG4gICAqL1xuXG4gIHZlcnNpb24oc3RyLCBmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIHRoaXMuX3ZlcnNpb24gPSBzdHI7XG4gICAgZmxhZ3MgPSBmbGFncyB8fCAnLVYsIC0tdmVyc2lvbic7XG4gICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiB8fCAnb3V0cHV0IHRoZSB2ZXJzaW9uIG51bWJlcic7XG4gICAgY29uc3QgdmVyc2lvbk9wdGlvbiA9IHRoaXMuY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gICAgdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPSB2ZXJzaW9uT3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICB0aGlzLl9yZWdpc3Rlck9wdGlvbih2ZXJzaW9uT3B0aW9uKTtcblxuICAgIHRoaXMub24oJ29wdGlvbjonICsgdmVyc2lvbk9wdGlvbi5uYW1lKCksICgpID0+IHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVPdXQoYCR7c3RyfVxcbmApO1xuICAgICAgdGhpcy5fZXhpdCgwLCAnY29tbWFuZGVyLnZlcnNpb24nLCBzdHIpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NEZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG4gIGRlc2NyaXB0aW9uKHN0ciwgYXJnc0Rlc2NyaXB0aW9uKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkICYmIGFyZ3NEZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gc3RyO1xuICAgIGlmIChhcmdzRGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX2FyZ3NEZXNjcmlwdGlvbiA9IGFyZ3NEZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzdW1tYXJ5LiBVc2VkIHdoZW4gbGlzdGVkIGFzIHN1YmNvbW1hbmQgb2YgcGFyZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG4gIHN1bW1hcnkoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fc3VtbWFyeTtcbiAgICB0aGlzLl9zdW1tYXJ5ID0gc3RyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBhbGlhcyBmb3IgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBtb3JlIHRoYW4gb25jZSB0byBhZGQgbXVsdGlwbGUgYWxpYXNlcy4gT25seSB0aGUgZmlyc3QgYWxpYXMgaXMgc2hvd24gaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdXG4gICAqIEByZXR1cm4geyhzdHJpbmd8Q29tbWFuZCl9XG4gICAqL1xuXG4gIGFsaWFzKGFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9hbGlhc2VzWzBdOyAvLyBqdXN0IHJldHVybiBmaXJzdCwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbiAgICAvKiogQHR5cGUge0NvbW1hbmR9ICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgbGV0IGNvbW1hbmQgPSB0aGlzO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29tbWFuZHMubGVuZ3RoICE9PSAwICYmXG4gICAgICB0aGlzLmNvbW1hbmRzW3RoaXMuY29tbWFuZHMubGVuZ3RoIC0gMV0uX2V4ZWN1dGFibGVIYW5kbGVyXG4gICAgKSB7XG4gICAgICAvLyBhc3N1bWUgYWRkaW5nIGFsaWFzIGZvciBsYXN0IGFkZGVkIGV4ZWN1dGFibGUgc3ViY29tbWFuZCwgcmF0aGVyIHRoYW4gdGhpc1xuICAgICAgY29tbWFuZCA9IHRoaXMuY29tbWFuZHNbdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICBpZiAoYWxpYXMgPT09IGNvbW1hbmQuX25hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21tYW5kIGFsaWFzIGNhbid0IGJlIHRoZSBzYW1lIGFzIGl0cyBuYW1lXCIpO1xuICAgIGNvbnN0IG1hdGNoaW5nQ29tbWFuZCA9IHRoaXMucGFyZW50Py5fZmluZENvbW1hbmQoYWxpYXMpO1xuICAgIGlmIChtYXRjaGluZ0NvbW1hbmQpIHtcbiAgICAgIC8vIGMuZi4gX3JlZ2lzdGVyQ29tbWFuZFxuICAgICAgY29uc3QgZXhpc3RpbmdDbWQgPSBbbWF0Y2hpbmdDb21tYW5kLm5hbWUoKV1cbiAgICAgICAgLmNvbmNhdChtYXRjaGluZ0NvbW1hbmQuYWxpYXNlcygpKVxuICAgICAgICAuam9pbignfCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2Fubm90IGFkZCBhbGlhcyAnJHthbGlhc30nIHRvIGNvbW1hbmQgJyR7dGhpcy5uYW1lKCl9JyBhcyBhbHJlYWR5IGhhdmUgY29tbWFuZCAnJHtleGlzdGluZ0NtZH0nYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29tbWFuZC5fYWxpYXNlcy5wdXNoKGFsaWFzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYWxpYXNlcyBmb3IgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIE9ubHkgdGhlIGZpcnN0IGFsaWFzIGlzIHNob3duIGluIHRoZSBhdXRvLWdlbmVyYXRlZCBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWxpYXNlc11cbiAgICogQHJldHVybiB7KHN0cmluZ1tdfENvbW1hbmQpfVxuICAgKi9cblxuICBhbGlhc2VzKGFsaWFzZXMpIHtcbiAgICAvLyBHZXR0ZXIgZm9yIHRoZSBhcnJheSBvZiBhbGlhc2VzIGlzIHRoZSBtYWluIHJlYXNvbiBmb3IgaGF2aW5nIGFsaWFzZXMoKSBpbiBhZGRpdGlvbiB0byBhbGlhcygpLlxuICAgIGlmIChhbGlhc2VzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9hbGlhc2VzO1xuXG4gICAgYWxpYXNlcy5mb3JFYWNoKChhbGlhcykgPT4gdGhpcy5hbGlhcyhhbGlhcykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCAvIGdldCB0aGUgY29tbWFuZCB1c2FnZSBgc3RyYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEByZXR1cm4geyhzdHJpbmd8Q29tbWFuZCl9XG4gICAqL1xuXG4gIHVzYWdlKHN0cikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuX3VzYWdlKSByZXR1cm4gdGhpcy5fdXNhZ2U7XG5cbiAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubWFwKChhcmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXVxuICAgICAgICAuY29uY2F0KFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sZW5ndGggfHwgdGhpcy5faGVscE9wdGlvbiAhPT0gbnVsbCA/ICdbb3B0aW9uc10nIDogW10sXG4gICAgICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggPyAnW2NvbW1hbmRdJyA6IFtdLFxuICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGggPyBhcmdzIDogW10sXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICB0aGlzLl91c2FnZSA9IHN0cjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgbmFtZShzdHIpIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIHRoaXMuX25hbWUgPSBzdHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGZyb20gc2NyaXB0IGZpbGVuYW1lLCBzdWNoIGFzIHByb2Nlc3MuYXJndlsxXSxcbiAgICogb3IgcmVxdWlyZS5tYWluLmZpbGVuYW1lLCBvciBfX2ZpbGVuYW1lLlxuICAgKlxuICAgKiAoVXNlZCBpbnRlcm5hbGx5IGFuZCBwdWJsaWMgYWx0aG91Z2ggbm90IGRvY3VtZW50ZWQgaW4gUkVBRE1FLilcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5uYW1lRnJvbUZpbGVuYW1lKHJlcXVpcmUubWFpbi5maWxlbmFtZSk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfVxuICAgKi9cblxuICBuYW1lRnJvbUZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gICAgdGhpcy5fbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZW5hbWUsIHBhdGguZXh0bmFtZShmaWxlbmFtZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgZGlyZWN0b3J5IGZvciBzZWFyY2hpbmcgZm9yIGV4ZWN1dGFibGUgc3ViY29tbWFuZHMgb2YgdGhpcyBjb21tYW5kLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLmV4ZWN1dGFibGVEaXIoX19kaXJuYW1lKTtcbiAgICogLy8gb3JcbiAgICogcHJvZ3JhbS5leGVjdXRhYmxlRGlyKCdzdWJjb21tYW5kcycpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqIEByZXR1cm4geyhzdHJpbmd8bnVsbHxDb21tYW5kKX1cbiAgICovXG5cbiAgZXhlY3V0YWJsZURpcihwYXRoKSB7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2V4ZWN1dGFibGVEaXI7XG4gICAgdGhpcy5fZXhlY3V0YWJsZURpciA9IHBhdGg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHByb2dyYW0gaGVscCBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3sgZXJyb3I6IGJvb2xlYW4gfX0gW2NvbnRleHRPcHRpb25zXSAtIHBhc3Mge2Vycm9yOnRydWV9IHRvIHdyYXAgZm9yIHN0ZGVyciBpbnN0ZWFkIG9mIHN0ZG91dFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGhlbHBJbmZvcm1hdGlvbihjb250ZXh0T3B0aW9ucykge1xuICAgIGNvbnN0IGhlbHBlciA9IHRoaXMuY3JlYXRlSGVscCgpO1xuICAgIGlmIChoZWxwZXIuaGVscFdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlbHBlci5oZWxwV2lkdGggPVxuICAgICAgICBjb250ZXh0T3B0aW9ucyAmJiBjb250ZXh0T3B0aW9ucy5lcnJvclxuICAgICAgICAgID8gdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRFcnJIZWxwV2lkdGgoKVxuICAgICAgICAgIDogdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRPdXRIZWxwV2lkdGgoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhlbHBlci5mb3JtYXRIZWxwKHRoaXMsIGhlbHBlcik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2dldEhlbHBDb250ZXh0KGNvbnRleHRPcHRpb25zKSB7XG4gICAgY29udGV4dE9wdGlvbnMgPSBjb250ZXh0T3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBjb250ZXh0ID0geyBlcnJvcjogISFjb250ZXh0T3B0aW9ucy5lcnJvciB9O1xuICAgIGxldCB3cml0ZTtcbiAgICBpZiAoY29udGV4dC5lcnJvcikge1xuICAgICAgd3JpdGUgPSAoYXJnKSA9PiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlRXJyKGFyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdyaXRlID0gKGFyZykgPT4gdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZU91dChhcmcpO1xuICAgIH1cbiAgICBjb250ZXh0LndyaXRlID0gY29udGV4dE9wdGlvbnMud3JpdGUgfHwgd3JpdGU7XG4gICAgY29udGV4dC5jb21tYW5kID0gdGhpcztcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21tYW5kLlxuICAgKlxuICAgKiBPdXRwdXRzIGJ1aWx0LWluIGhlbHAsIGFuZCBjdXN0b20gdGV4dCBhZGRlZCB1c2luZyBgLmFkZEhlbHBUZXh0KClgLlxuICAgKlxuICAgKiBAcGFyYW0ge3sgZXJyb3I6IGJvb2xlYW4gfSB8IEZ1bmN0aW9ufSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JpdGUgdG8gc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqL1xuXG4gIG91dHB1dEhlbHAoY29udGV4dE9wdGlvbnMpIHtcbiAgICBsZXQgZGVwcmVjYXRlZENhbGxiYWNrO1xuICAgIGlmICh0eXBlb2YgY29udGV4dE9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRlcHJlY2F0ZWRDYWxsYmFjayA9IGNvbnRleHRPcHRpb25zO1xuICAgICAgY29udGV4dE9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9nZXRIZWxwQ29udGV4dChjb250ZXh0T3B0aW9ucyk7XG5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiBjb21tYW5kLmVtaXQoJ2JlZm9yZUFsbEhlbHAnLCBjb250ZXh0KSk7XG4gICAgdGhpcy5lbWl0KCdiZWZvcmVIZWxwJywgY29udGV4dCk7XG5cbiAgICBsZXQgaGVscEluZm9ybWF0aW9uID0gdGhpcy5oZWxwSW5mb3JtYXRpb24oY29udGV4dCk7XG4gICAgaWYgKGRlcHJlY2F0ZWRDYWxsYmFjaykge1xuICAgICAgaGVscEluZm9ybWF0aW9uID0gZGVwcmVjYXRlZENhbGxiYWNrKGhlbHBJbmZvcm1hdGlvbik7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBoZWxwSW5mb3JtYXRpb24gIT09ICdzdHJpbmcnICYmXG4gICAgICAgICFCdWZmZXIuaXNCdWZmZXIoaGVscEluZm9ybWF0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3V0cHV0SGVscCBjYWxsYmFjayBtdXN0IHJldHVybiBhIHN0cmluZyBvciBhIEJ1ZmZlcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb250ZXh0LndyaXRlKGhlbHBJbmZvcm1hdGlvbik7XG5cbiAgICBpZiAodGhpcy5fZ2V0SGVscE9wdGlvbigpPy5sb25nKSB7XG4gICAgICB0aGlzLmVtaXQodGhpcy5fZ2V0SGVscE9wdGlvbigpLmxvbmcpOyAvLyBkZXByZWNhdGVkXG4gICAgfVxuICAgIHRoaXMuZW1pdCgnYWZ0ZXJIZWxwJywgY29udGV4dCk7XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLmZvckVhY2goKGNvbW1hbmQpID0+XG4gICAgICBjb21tYW5kLmVtaXQoJ2FmdGVyQWxsSGVscCcsIGNvbnRleHQpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogWW91IGNhbiBwYXNzIGluIGZsYWdzIGFuZCBhIGRlc2NyaXB0aW9uIHRvIGN1c3RvbWlzZSB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqIFBhc3MgaW4gZmFsc2UgdG8gZGlzYWJsZSB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uaGVscE9wdGlvbignLT8sIC0taGVscCcgJ3Nob3cgaGVscCcpOyAvLyBjdXN0b21pc2VcbiAgICogcHJvZ3JhbS5oZWxwT3B0aW9uKGZhbHNlKTsgLy8gZGlzYWJsZVxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBib29sZWFuKX0gZmxhZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGhlbHBPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKSB7XG4gICAgLy8gU3VwcG9ydCBkaXNhYmxpbmcgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBpZiAoZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5faGVscE9wdGlvbiA9IHRoaXMuX2hlbHBPcHRpb24gPz8gdW5kZWZpbmVkOyAvLyBwcmVzZXJ2ZSBleGlzdGluZyBvcHRpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hlbHBPcHRpb24gPSBudWxsOyAvLyBkaXNhYmxlXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBDdXN0b21pc2UgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uLlxuICAgIGZsYWdzID0gZmxhZ3MgPz8gJy1oLCAtLWhlbHAnO1xuICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPz8gJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCc7XG4gICAgdGhpcy5faGVscE9wdGlvbiA9IHRoaXMuY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXp5IGNyZWF0ZSBoZWxwIG9wdGlvbi5cbiAgICogUmV0dXJucyBudWxsIGlmIGhhcyBiZWVuIGRpc2FibGVkIHdpdGggLmhlbHBPcHRpb24oZmFsc2UpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7KE9wdGlvbiB8IG51bGwpfSB0aGUgaGVscCBvcHRpb25cbiAgICogQHBhY2thZ2VcbiAgICovXG4gIF9nZXRIZWxwT3B0aW9uKCkge1xuICAgIC8vIExhenkgY3JlYXRlIGhlbHAgb3B0aW9uIG9uIGRlbWFuZC5cbiAgICBpZiAodGhpcy5faGVscE9wdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmhlbHBPcHRpb24odW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faGVscE9wdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwbHkgeW91ciBvd24gb3B0aW9uIHRvIHVzZSBmb3IgdGhlIGJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgKiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHVzaW5nIGhlbHBPcHRpb24oKSB0byBjdXN0b21pc2UgdGhlIGZsYWdzIGFuZCBkZXNjcmlwdGlvbiBldGMuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRIZWxwT3B0aW9uKG9wdGlvbikge1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSBvcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gYW5kIGV4aXQuXG4gICAqXG4gICAqIE91dHB1dHMgYnVpbHQtaW4gaGVscCwgYW5kIGN1c3RvbSB0ZXh0IGFkZGVkIHVzaW5nIGAuYWRkSGVscFRleHQoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9fSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JpdGUgdG8gc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqL1xuXG4gIGhlbHAoY29udGV4dE9wdGlvbnMpIHtcbiAgICB0aGlzLm91dHB1dEhlbHAoY29udGV4dE9wdGlvbnMpO1xuICAgIGxldCBleGl0Q29kZSA9IHByb2Nlc3MuZXhpdENvZGUgfHwgMDtcbiAgICBpZiAoXG4gICAgICBleGl0Q29kZSA9PT0gMCAmJlxuICAgICAgY29udGV4dE9wdGlvbnMgJiZcbiAgICAgIHR5cGVvZiBjb250ZXh0T3B0aW9ucyAhPT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgY29udGV4dE9wdGlvbnMuZXJyb3JcbiAgICApIHtcbiAgICAgIGV4aXRDb2RlID0gMTtcbiAgICB9XG4gICAgLy8gbWVzc2FnZTogZG8gbm90IGhhdmUgYWxsIGRpc3BsYXllZCB0ZXh0IGF2YWlsYWJsZSBzbyBvbmx5IHBhc3NpbmcgcGxhY2Vob2xkZXIuXG4gICAgdGhpcy5fZXhpdChleGl0Q29kZSwgJ2NvbW1hbmRlci5oZWxwJywgJyhvdXRwdXRIZWxwKScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhZGRpdGlvbmFsIHRleHQgdG8gYmUgZGlzcGxheWVkIHdpdGggdGhlIGJ1aWx0LWluIGhlbHAuXG4gICAqXG4gICAqIFBvc2l0aW9uIGlzICdiZWZvcmUnIG9yICdhZnRlcicgdG8gYWZmZWN0IGp1c3QgdGhpcyBjb21tYW5kLFxuICAgKiBhbmQgJ2JlZm9yZUFsbCcgb3IgJ2FmdGVyQWxsJyB0byBhZmZlY3QgdGhpcyBjb21tYW5kIGFuZCBhbGwgaXRzIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcG9zaXRpb24gLSBiZWZvcmUgb3IgYWZ0ZXIgYnVpbHQtaW4gaGVscFxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBGdW5jdGlvbil9IHRleHQgLSBzdHJpbmcgdG8gYWRkLCBvciBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHN0cmluZ1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBUZXh0KHBvc2l0aW9uLCB0ZXh0KSB7XG4gICAgY29uc3QgYWxsb3dlZFZhbHVlcyA9IFsnYmVmb3JlQWxsJywgJ2JlZm9yZScsICdhZnRlcicsICdhZnRlckFsbCddO1xuICAgIGlmICghYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyhwb3NpdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSBmb3IgcG9zaXRpb24gdG8gYWRkSGVscFRleHQuXG5FeHBlY3Rpbmcgb25lIG9mICcke2FsbG93ZWRWYWx1ZXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBjb25zdCBoZWxwRXZlbnQgPSBgJHtwb3NpdGlvbn1IZWxwYDtcbiAgICB0aGlzLm9uKGhlbHBFdmVudCwgKGNvbnRleHQpID0+IHtcbiAgICAgIGxldCBoZWxwU3RyO1xuICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGhlbHBTdHIgPSB0ZXh0KHsgZXJyb3I6IGNvbnRleHQuZXJyb3IsIGNvbW1hbmQ6IGNvbnRleHQuY29tbWFuZCB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlbHBTdHIgPSB0ZXh0O1xuICAgICAgfVxuICAgICAgLy8gSWdub3JlIGZhbHN5IHZhbHVlIHdoZW4gbm90aGluZyB0byBvdXRwdXQuXG4gICAgICBpZiAoaGVscFN0cikge1xuICAgICAgICBjb250ZXh0LndyaXRlKGAke2hlbHBTdHJ9XFxuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gaWYgaGVscCBmbGFncyBzcGVjaWZpZWRcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyAtIGFycmF5IG9mIG9wdGlvbnMgdG8gc2VhcmNoIGZvciBoZWxwIGZsYWdzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9vdXRwdXRIZWxwSWZSZXF1ZXN0ZWQoYXJncykge1xuICAgIGNvbnN0IGhlbHBPcHRpb24gPSB0aGlzLl9nZXRIZWxwT3B0aW9uKCk7XG4gICAgY29uc3QgaGVscFJlcXVlc3RlZCA9IGhlbHBPcHRpb24gJiYgYXJncy5maW5kKChhcmcpID0+IGhlbHBPcHRpb24uaXMoYXJnKSk7XG4gICAgaWYgKGhlbHBSZXF1ZXN0ZWQpIHtcbiAgICAgIHRoaXMub3V0cHV0SGVscCgpO1xuICAgICAgLy8gKERvIG5vdCBoYXZlIGFsbCBkaXNwbGF5ZWQgdGV4dCBhdmFpbGFibGUgc28gb25seSBwYXNzaW5nIHBsYWNlaG9sZGVyLilcbiAgICAgIHRoaXMuX2V4aXQoMCwgJ2NvbW1hbmRlci5oZWxwRGlzcGxheWVkJywgJyhvdXRwdXRIZWxwKScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNjYW4gYXJndW1lbnRzIGFuZCBpbmNyZW1lbnQgcG9ydCBudW1iZXIgZm9yIGluc3BlY3QgY2FsbHMgKHRvIGF2b2lkIGNvbmZsaWN0cyB3aGVuIHNwYXduaW5nIG5ldyBjb21tYW5kKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIC0gYXJyYXkgb2YgYXJndW1lbnRzIGZyb20gbm9kZS5leGVjQXJndlxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChhcmdzKSB7XG4gIC8vIFRlc3RpbmcgZm9yIHRoZXNlIG9wdGlvbnM6XG4gIC8vICAtLWluc3BlY3RbPVtob3N0Ol1wb3J0XVxuICAvLyAgLS1pbnNwZWN0LWJya1s9W2hvc3Q6XXBvcnRdXG4gIC8vICAtLWluc3BlY3QtcG9ydD1baG9zdDpdcG9ydFxuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4ge1xuICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoJy0taW5zcGVjdCcpKSB7XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgICBsZXQgZGVidWdPcHRpb247XG4gICAgbGV0IGRlYnVnSG9zdCA9ICcxMjcuMC4wLjEnO1xuICAgIGxldCBkZWJ1Z1BvcnQgPSAnOTIyOSc7XG4gICAgbGV0IG1hdGNoO1xuICAgIGlmICgobWF0Y2ggPSBhcmcubWF0Y2goL14oLS1pbnNwZWN0KC1icmspPykkLykpICE9PSBudWxsKSB7XG4gICAgICAvLyBlLmcuIC0taW5zcGVjdFxuICAgICAgZGVidWdPcHRpb24gPSBtYXRjaFsxXTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKG1hdGNoID0gYXJnLm1hdGNoKC9eKC0taW5zcGVjdCgtYnJrfC1wb3J0KT8pPShbXjpdKykkLykpICE9PSBudWxsXG4gICAgKSB7XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgICAgaWYgKC9eXFxkKyQvLnRlc3QobWF0Y2hbM10pKSB7XG4gICAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PTEyMzRcbiAgICAgICAgZGVidWdQb3J0ID0gbWF0Y2hbM107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlLmcuIC0taW5zcGVjdD1sb2NhbGhvc3RcbiAgICAgICAgZGVidWdIb3N0ID0gbWF0Y2hbM107XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChtYXRjaCA9IGFyZy5tYXRjaCgvXigtLWluc3BlY3QoLWJya3wtcG9ydCk/KT0oW146XSspOihcXGQrKSQvKSkgIT09IG51bGxcbiAgICApIHtcbiAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PWxvY2FsaG9zdDoxMjM0XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgICAgZGVidWdIb3N0ID0gbWF0Y2hbM107XG4gICAgICBkZWJ1Z1BvcnQgPSBtYXRjaFs0XTtcbiAgICB9XG5cbiAgICBpZiAoZGVidWdPcHRpb24gJiYgZGVidWdQb3J0ICE9PSAnMCcpIHtcbiAgICAgIHJldHVybiBgJHtkZWJ1Z09wdGlvbn09JHtkZWJ1Z0hvc3R9OiR7cGFyc2VJbnQoZGVidWdQb3J0KSArIDF9YDtcbiAgICB9XG4gICAgcmV0dXJuIGFyZztcbiAgfSk7XG59XG5cbmV4cG9ydHMuQ29tbWFuZCA9IENvbW1hbmQ7XG4iLAogICAgImNvbnN0IHsgQXJndW1lbnQgfSA9IHJlcXVpcmUoJy4vbGliL2FyZ3VtZW50LmpzJyk7XG5jb25zdCB7IENvbW1hbmQgfSA9IHJlcXVpcmUoJy4vbGliL2NvbW1hbmQuanMnKTtcbmNvbnN0IHsgQ29tbWFuZGVyRXJyb3IsIEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2xpYi9lcnJvci5qcycpO1xuY29uc3QgeyBIZWxwIH0gPSByZXF1aXJlKCcuL2xpYi9oZWxwLmpzJyk7XG5jb25zdCB7IE9wdGlvbiB9ID0gcmVxdWlyZSgnLi9saWIvb3B0aW9uLmpzJyk7XG5cbmV4cG9ydHMucHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbmV4cG9ydHMuY3JlYXRlQ29tbWFuZCA9IChuYW1lKSA9PiBuZXcgQ29tbWFuZChuYW1lKTtcbmV4cG9ydHMuY3JlYXRlT3B0aW9uID0gKGZsYWdzLCBkZXNjcmlwdGlvbikgPT4gbmV3IE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pO1xuZXhwb3J0cy5jcmVhdGVBcmd1bWVudCA9IChuYW1lLCBkZXNjcmlwdGlvbikgPT4gbmV3IEFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcblxuLyoqXG4gKiBFeHBvc2UgY2xhc3Nlc1xuICovXG5cbmV4cG9ydHMuQ29tbWFuZCA9IENvbW1hbmQ7XG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcbmV4cG9ydHMuQXJndW1lbnQgPSBBcmd1bWVudDtcbmV4cG9ydHMuSGVscCA9IEhlbHA7XG5cbmV4cG9ydHMuQ29tbWFuZGVyRXJyb3IgPSBDb21tYW5kZXJFcnJvcjtcbmV4cG9ydHMuSW52YWxpZEFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbmV4cG9ydHMuSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjsgLy8gRGVwcmVjYXRlZFxuIiwKICAgICJpbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBzdGFydERldlNlcnZlciB9IGZyb20gXCIuLi9zZXJ2ZXIvZGV2XCI7XG5pbXBvcnQgeyBzdGFydFByb2RTZXJ2ZXIgfSBmcm9tIFwiLi4vc2VydmVyL3Byb2RcIjtcbmltcG9ydCBjcmVhdGVSb2xsdXBJbnB1dCBmcm9tIFwiLi9jcmVhdGVSb2xsdXBJbnB1dFwiO1xuaW1wb3J0IHsgYnVpbGQgfSBmcm9tIFwidml0ZVwiO1xuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuXG5wcm9ncmFtLmNvbW1hbmQoXCJkZXZcIikuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgY29uc29sZS5sb2coXCJTdGFydGluZyBkZXYgc2VydmVyLi4uXCIpO1xuICBhd2FpdCBzdGFydERldlNlcnZlcigpO1xufSk7XG5cbnByb2dyYW0uY29tbWFuZChcImJ1aWxkXCIpLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID0gXCJwcm9kdWN0aW9uXCI7XG4gIGNvbnN0IGlucHV0ID0gYXdhaXQgY3JlYXRlUm9sbHVwSW5wdXQoKTtcbiAgY29uc3Qgcm9vdERpciA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgYXBwRGlyID0gcGF0aC5qb2luKHJvb3REaXIsIFwiYXBwXCIpO1xuXG4gIGNvbnNvbGUubG9nKFwiQnVpbGRpbmcgY2xpZW50Li4uXCIpO1xuXG4gIGF3YWl0ICRgR0VNSV9JTlBVVD0ke0pTT04uc3RyaW5naWZ5KGlucHV0KX0gdml0ZSBidWlsZCAtLW91dERpciBkaXN0L2NsaWVudGA7XG5cbiAgY29uc29sZS5sb2coXCJCdWlsZGluZyBzZXJ2ZXIuLi5cIik7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5lbnYuR0VNSV9JTlBVVCA9IEpTT04uc3RyaW5naWZ5KGlucHV0KTtcbiAgICBhd2FpdCBidWlsZCh7XG4gICAgICBidWlsZDoge1xuICAgICAgICBzc3I6IHRydWUsXG4gICAgICAgIG91dERpcjogXCJkaXN0L3NlcnZlclwiLFxuICAgICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgICAgaW5wdXQ6IFwiYXBwL2Jvb3RzdHJhcC50c1wiLFxuICAgICAgICAgIGV4dGVybmFsOiBbXCJidW5cIiwgXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiLCBcInJlYWN0L2pzeC1ydW50aW1lXCIsIFwiZ2VtaVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiB7XG4gICAgICAgIGFsaWFzOiB7XG4gICAgICAgICAgXCJAL2FwcFwiOiBhcHBEaXIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJCdWlsZCBzdWNjZWVkZWRcIik7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKGVycik7XG4gIH1cbiAgcHJvY2Vzcy5leGl0KCk7XG59KTtcblxucHJvZ3JhbS5jb21tYW5kKFwic3RhcnRcIikuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPSBcInByb2R1Y3Rpb25cIjtcblxuICBhd2FpdCAkYGVjaG8gXCJTdGFydGluZyBzZXJ2ZXIuLi5cImA7XG4gIGF3YWl0IHN0YXJ0UHJvZFNlcnZlcigpO1xufSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiIsCiAgICAiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gXCIuLi9hcHAvQXBwXCI7XG5pbXBvcnQgeyBjcmVhdGVTdHlsZXMgfSBmcm9tIFwiLi9zdHlsZXNcIjtcbmltcG9ydCB7IGltYWdlSGFuZGxlciB9IGZyb20gXCIuL2ltYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgcmVuZGVyRXJyb3JQYWdlIH0gZnJvbSBcIi4vcmVuZGVyRXJyb3JQYWdlXCI7XG5pbXBvcnQgeyBTZXJ2ZSB9IGZyb20gXCJidW5cIjtcblxuY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG5jb25zdCBhcHBEaXIgPSBqb2luKHJvb3REaXIsIFwiYXBwXCIpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoKSB7XG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHZpdGUgPSBhd2FpdCAoXG4gICAgYXdhaXQgaW1wb3J0KFwidml0ZVwiKVxuICApLmNyZWF0ZVNlcnZlcih7XG4gICAgcm9vdCxcbiAgICBsb2dMZXZlbDogXCJlcnJvclwiLFxuICAgIHNlcnZlcjoge1xuICAgICAgd2F0Y2g6IHtcbiAgICAgICAgdXNlUG9sbGluZzogdHJ1ZSxcbiAgICAgICAgaW50ZXJ2YWw6IDEwMCxcbiAgICAgIH0sXG4gICAgICBobXI6IHtcbiAgICAgICAgY2xpZW50UG9ydDogNTE3NCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgIFwiQC9hcHBcIjogYXBwRGlyLFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBwcm9jZXNzLmVudi5ST09UX0RJUiA9IHJvb3REaXI7XG4gIHByb2Nlc3MuZW52LkFQUF9ESVIgPSBhcHBEaXI7XG5cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRGV2UmVxdWVzdHMocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcGF0aG5hbWUgfSA9IG5ldyBVUkwocmVxLnVybCk7XG4gICAgaWYgKHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvcmVmcmVzaC5qc1wiKSkge1xuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICAgICAgYFxuICAgICAgICAgIGltcG9ydCBSZWZyZXNoUnVudGltZSBmcm9tIFwiaHR0cDovL2xvY2FsaG9zdDo1MTczL0ByZWFjdC1yZWZyZXNoXCI7XG4gICAgICAgICAgUmVmcmVzaFJ1bnRpbWUuaW5qZWN0SW50b0dsb2JhbEhvb2sod2luZG93KTtcbiAgICAgICAgICB3aW5kb3cuJFJlZnJlc2hSZWckID0gKCkgPT4ge307XG4gICAgICAgICAgd2luZG93LiRSZWZyZXNoU2lnJCA9ICgpID0+ICh0eXBlKSA9PiB0eXBlO1xuICAgICAgICAgIHdpbmRvdy5fX3ZpdGVfcGx1Z2luX3JlYWN0X3ByZWFtYmxlX2luc3RhbGxlZF9fID0gdHJ1ZTtcbiAgICAgICAgYCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDo1MTc0JHtwYXRobmFtZX1gKTtcblxuICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRBcHAoKTogUHJvbWlzZTxBcHA+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB2aXRlLnNzckxvYWRNb2R1bGUoam9pbihhcHBEaXIsIFwiYm9vdHN0cmFwLnRzXCIpKSkuYXBwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coXCJDYW4ndCBsb2FkIGJvb3RzdHJhcC50c1wiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXJ2ZShhcHA6IEFwcCk6IFByb21pc2U8U2VydmU+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gYXBwLmZldGNoLmJpbmQoYXBwKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmV0Y2g6IGFzeW5jIChyZXEsIHNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoc2VydmVyLnVwZ3JhZGUocmVxLCB7IGRhdGE6IHsgaGVhZGVyczogcmVxLmhlYWRlcnMgfSB9KSkge1xuICAgICAgICAgIHJldHVybjsgLy8gZG8gbm90IHJldHVybiBhIFJlc3BvbnNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXEuaGVhZGVycy5nZXQoXCJ4LWZvcndhcmRlZC1mb3JcIikpIHtcbiAgICAgICAgICBjb25zdCBpcCA9IHNlcnZlci5yZXF1ZXN0SVAocmVxKTtcbiAgICAgICAgICByZXEuaGVhZGVycy5zZXQoXCJ4LWZvcndhcmRlZC1mb3JcIiwgaXAuYWRkcmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBuZXcgVVJMKHJlcS51cmwpO1xuXG4gICAgICAgIGNvbnN0IGRldlJlc3BvbnNlID0gYXdhaXQgaGFuZGxlRGV2UmVxdWVzdHMocmVxKTtcbiAgICAgICAgaWYgKGRldlJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGV2UmVzcG9uc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aChcIi9fX2dlbWkvaW1hZ2VcIikpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgaW1hZ2VIYW5kbGVyKHJlcSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdJbXBvcnRNYXAgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gKHZpZXdOYW1lOiBzdHJpbmcsIHBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgYFwiJHt2aWV3TmFtZX1cIjogKCkgPT4gaW1wb3J0KFwiJHtwYXRofVwiKWA7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbXG4gICAgICAgICAgICAgIFwiNDA0XCIsXG4gICAgICAgICAgICAgIC4uLmFwcC5nZXRGbGF0Q29tcG9uZW50VHJlZS5jYWxsKGFwcCksXG4gICAgICAgICAgICBdKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhcHBEaXIgPSBgJHtwcm9jZXNzLmVudi5BUFBfRElSfWA7XG4gICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IHZpdGUuc3NyTG9hZE1vZHVsZShcbiAgICAgICAgICAgICAgICBgJHthcHBEaXJ9L3ZpZXdzLyR7ZmlsZU5hbWV9LnRzeGAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHZpZXdJbXBvcnRNYXBbZmlsZU5hbWVdID0gbW9kLmRlZmF1bHQ7XG4gICAgICAgICAgICAgIHRlbXBsYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlKGZpbGVOYW1lLCBgJHthcHBEaXJ9L3ZpZXdzLyR7ZmlsZU5hbWV9LnRzeGApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2FkZXJzID0gYHske3RlbXBsYXRlcy5qb2luKFwiLFwiKX19YDtcbiAgICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdDogY3NzIH0gPSBhd2FpdCB2aXRlLnNzckxvYWRNb2R1bGUoXG4gICAgICAgICAgICAgIGAke2FwcERpcn0vYXBwLmNzc2AsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBbXTtcbiAgICAgICAgICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgaXNEZXY6IHRydWUsXG4gICAgICAgICAgICAgIGlkOiBgJHthcHBEaXJ9L2FwcC5jc3NgLFxuICAgICAgICAgICAgICBjb250ZW50OiBjc3MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQoe1xuICAgICAgICAgICAgICBzdHlsZXM6IGNyZWF0ZVN0eWxlcyhzdHlsZXMpLFxuICAgICAgICAgICAgICBib290c3RyYXBNb2R1bGVzOiBbXG4gICAgICAgICAgICAgICAgXCIvcmVmcmVzaC5qc1wiLFxuICAgICAgICAgICAgICAgIFwiL2FwcC9jbGllbnQudHN4XCIsXG4gICAgICAgICAgICAgICAgXCJodHRwOi8vbG9jYWxob3N0OjUxNzMvQHZpdGUvY2xpZW50XCIsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHZpZXdJbXBvcnRNYXAsXG4gICAgICAgICAgICAgIGxvYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aChcIi9hcGlcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSksIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlbmRlckVycm9yUGFnZShlcnIpLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9odG1sXCIgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBvcnQ6IHByb2Nlc3MuZW52LlBPUlQgfHwgNTE3MyxcbiAgICAgIHdlYnNvY2tldDogYXBwLndlYnNvY2tldCxcbiAgICB9O1xuICB9XG5cbiAgYXdhaXQgdml0ZS5saXN0ZW4oNTE3NCk7XG5cbiAgY29uc3QgYXBwID0gYXdhaXQgZ2V0QXBwKCk7XG4gIGNvbnN0IHNlcnZlID0gYXdhaXQgY3JlYXRlU2VydmUoYXBwKTtcbiAgY29uc3Qgc2VydmVyID0gQnVuLnNlcnZlKHNlcnZlKTtcbiAgYXBwLm9uUHVibGlzaChcbiAgICAoXG4gICAgICB0b3BpYzogc3RyaW5nLFxuICAgICAgZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXJWaWV3IHwgQXJyYXlCdWZmZXIgfCBTaGFyZWRBcnJheUJ1ZmZlcixcbiAgICAgIGNvbXByZXNzPzogYm9vbGVhbixcbiAgICApID0+IHtcbiAgICAgIHNlcnZlci5wdWJsaXNoKHRvcGljLCBkYXRhLCBjb21wcmVzcyk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zb2xlLmxvZyhgU2VydmVyIHN0YXJ0ZWQgb24gaHR0cDovL2xvY2FsaG9zdDoke3Byb2Nlc3MuZW52LlBPUlQgfHwgNTE3M31gKTtcblxuICB2aXRlLndhdGNoZXIub24oXCJjaGFuZ2VcIiwgYXN5bmMgKGZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUmVsYXRpdmVQYXRoID0gZmlsZS5yZXBsYWNlKHJvb3REaXIsIFwiXCIpO1xuICAgIGlmIChmaWxlUmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIvYXBwL3ZpZXdzXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3ZpdGVdICR7ZmlsZVJlbGF0aXZlUGF0aH0gY2hhbmdlZC4g8J+NnCBIb3QgcmVsb2FkaW5nLi4uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFt2aXRlXSAke2ZpbGVSZWxhdGl2ZVBhdGh9IGNoYW5nZWQuIFJlbG9hZGluZy4uLmApO1xuICAgIGNvbnN0IG1vZHVsZXMgPSB2aXRlLm1vZHVsZUdyYXBoLmdldE1vZHVsZXNCeUZpbGUoZmlsZSk7XG4gICAgZm9yIChjb25zdCBtb2Qgb2YgQXJyYXkuZnJvbShtb2R1bGVzKSkge1xuICAgICAgYXdhaXQgdml0ZS5yZWxvYWRNb2R1bGUobW9kKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYXBwID0gYXdhaXQgZ2V0QXBwKCk7XG4gICAgICBjb25zdCBzZXJ2ZSA9IGF3YWl0IGNyZWF0ZVNlcnZlKGFwcCk7XG4gICAgICBhcHAub25QdWJsaXNoKFxuICAgICAgICAoXG4gICAgICAgICAgdG9waWM6IHN0cmluZyxcbiAgICAgICAgICBkYXRhOiBzdHJpbmcgfCBBcnJheUJ1ZmZlclZpZXcgfCBBcnJheUJ1ZmZlciB8IFNoYXJlZEFycmF5QnVmZmVyLFxuICAgICAgICAgIGNvbXByZXNzPzogYm9vbGVhbixcbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgc2VydmVyLnB1Ymxpc2godG9waWMsIGRhdGEsIGNvbXByZXNzKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBzZXJ2ZXIucmVsb2FkKHNlcnZlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiRXJyb3Igb24gc2VydmVyIHJlbG9hZFwiKTtcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gY3JlYXRlU3R5bGVzKHN0eWxlcykge1xuICByZXR1cm4gc3R5bGVzLm1hcCgoc3R5bGUsIGkpID0+IHtcbiAgICBpZiAoc3R5bGUuaXNEZXYpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxzdHlsZSBrZXk9e3N0eWxlLmlkfSB0eXBlPVwidGV4dC9jc3NcIiBkYXRhLXZpdGUtZGV2LWlkPXtzdHlsZS5pZH0+XG4gICAgICAgICAge3N0eWxlLmNvbnRlbnR9XG4gICAgICAgIDwvc3R5bGU+XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c3R5bGUga2V5PXtpfSB0eXBlPVwidGV4dC9jc3NcIj5cbiAgICAgICAgICB7c3R5bGUuY29udGVudH1cbiAgICAgICAgPC9zdHlsZT5cbiAgICAgICk7XG4gICAgfVxuICB9KTtcbn1cbiIsCiAgICAiaW1wb3J0IHNoYXJwLCB7IHR5cGUgRml0RW51bSB9IGZyb20gXCJzaGFycFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1hZ2VIYW5kbGVyKHJlcTogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsKTtcbiAgY29uc3QgcmF3SW1hZ2VVcmwgPSB1cmwuc2VhcmNoUGFyYW1zLmdldChcInVybFwiKTtcbiAgY29uc3Qgd2lkdGggPSBOdW1iZXIodXJsLnNlYXJjaFBhcmFtcy5nZXQoXCJ3XCIpKTtcbiAgY29uc3QgaGVpZ2h0ID0gTnVtYmVyKHVybC5zZWFyY2hQYXJhbXMuZ2V0KFwiaFwiKSk7XG4gIGNvbnN0IGZpdCA9ICh1cmwuc2VhcmNoUGFyYW1zLmdldChcImZpdFwiKSA/P1xuICAgIFwiY292ZXJcIikgYXMgdW5rbm93biBhcyBrZXlvZiBGaXRFbnVtO1xuICBjb25zdCBxdWFsaXR5ID0gTnVtYmVyKHVybC5zZWFyY2hQYXJhbXMuZ2V0KFwicVwiKSk7XG5cbiAgaWYgKCFyYXdJbWFnZVVybCkge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UoXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGVycm9yOiBcInVybCBxdWVyeSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWRcIixcbiAgICAgIH0pLFxuICAgICAge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogNDA0LFxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IHJhd0ltYWdlVXJsLnN0YXJ0c1dpdGgoXCJodHRwXCIpXG4gICAgPyBcIlwiXG4gICAgOiBgaHR0cDovL2xvY2FsaG9zdDoke3Byb2Nlc3MuZW52LlBPUlQgfHwgNTE3M31gO1xuICBjb25zdCBmdWxsSW1hZ2VVcmwgPSBgJHtwcmVmaXh9JHtyYXdJbWFnZVVybH1gO1xuICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChmdWxsSW1hZ2VVcmwpO1xuICBpZiAoIXJlcy5vaykge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UoXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGVycm9yOiBcIkltYWdlIG5vdCBmb3VuZFwiLFxuICAgICAgICBpbmZvOiBmdWxsSW1hZ2VVcmwsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICBjb25zdCBpbWFnZUJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGF3YWl0IHJlcy5hcnJheUJ1ZmZlcigpKTtcblxuICBjb25zdCBidWZmZXIgPSBhd2FpdCBzaGFycChpbWFnZUJ1ZmZlcilcbiAgICAucmVzaXplKHdpZHRoID4gMCA/IHdpZHRoIDogdW5kZWZpbmVkLCBoZWlnaHQgPiAwID8gaGVpZ2h0IDogdW5kZWZpbmVkLCB7XG4gICAgICBmaXQsXG4gICAgfSlcbiAgICAud2VicCh7IHF1YWxpdHk6IHF1YWxpdHkgPiAwID8gcXVhbGl0eSA6IDgwLCBmb3JjZTogdHJ1ZSB9KVxuICAgIC50b0J1ZmZlcigpO1xuXG4gIHJlcy5oZWFkZXJzLmRlbGV0ZShcIkNvbnRlbnQtVHlwZVwiKTtcbiAgcmVzLmhlYWRlcnMuZGVsZXRlKFwiQ29udGVudC1MZW5ndGhcIik7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoYnVmZmVyLCB7XG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJpbWFnZS93ZWJwXCIsXG4gICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IGAke2J1ZmZlci5ieXRlTGVuZ3RofWAsXG4gICAgICAuLi5yZXMuaGVhZGVycy50b0pTT04oKSxcbiAgICB9LFxuICB9KTtcbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVycm9yUGFnZShlcnI6IGFueSkge1xuICByZXR1cm4gYFxuPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbiAgPGhlYWQ+XG4gICAgPG1ldGEgY2hhcnNldD1cIlVURi04XCIgLz5cbiAgICA8bWV0YVxuICAgICAgbmFtZT1cInZpZXdwb3J0XCJcbiAgICAgIGNvbnRlbnQ9XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MS4wXCJcbiAgICAvPlxuICAgIDx0aXRsZT5FcnJvcjwvdGl0bGU+XG4gICAgPHN0eWxlPlxuICAgICAgYm9keSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICAgICAgcGFkZGluZzogMjBweDtcbiAgICAgIH1cbiAgICAgIGgxIHtcbiAgICAgICAgY29sb3I6IHJlZDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICAgIDxoMT5FcnJvcjwvaDE+XG4gICAgPHByZT4ke0pTT04uc3RyaW5naWZ5KGVyciwgbnVsbCwgMil9PC9wcmU+XG4gICAgPHNjcmlwdCB0eXBlPVwibW9kdWxlXCIgc3JjPVwiL3JlZnJlc2guanNcIj48L3NjcmlwdD5cbiAgPC9ib2R5PlxuPC9odG1sPlxuYDtcbn1cbiIsCiAgICAiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBpbWFnZUhhbmRsZXIgfSBmcm9tIFwiLi9pbWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IGdlbmVyYXRlRVRhZyB9IGZyb20gXCIuL2dlbmVyYXRlRXRhZ1wiO1xuaW1wb3J0IHsgVVJMUGF0dGVybiB9IGZyb20gXCJ1cmxwYXR0ZXJuLXBvbHlmaWxsXCI7XG5pbXBvcnQgeyBjcmVhdGVTdHlsZXMgfSBmcm9tIFwiLi9zdHlsZXNcIjtcblxuY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG5cbmNvbnN0IGFwcERpciA9IGpvaW4ocm9vdERpciwgXCJhcHBcIik7XG5jb25zdCBkaXN0RGlyID0gam9pbihyb290RGlyLCBcImRpc3RcIik7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydFByb2RTZXJ2ZXIoKSB7XG4gIGNvbnN0IHsgYXBwIH0gPSBhd2FpdCBpbXBvcnQoYCR7ZGlzdERpcn0vc2VydmVyL2Jvb3RzdHJhcC5tanNgKTtcbiAgY29uc3QgbWFuaWZlc3QgPSBhd2FpdCBpbXBvcnQoYCR7ZGlzdERpcn0vY2xpZW50Ly52aXRlL21hbmlmZXN0Lmpzb25gKTtcbiAgY29uc3Qgc2VydmVyTWFuaWZlc3QgPSBhd2FpdCBpbXBvcnQoYCR7ZGlzdERpcn0vc2VydmVyLy52aXRlL21hbmlmZXN0Lmpzb25gKTtcblxuICBwcm9jZXNzLmVudi5ST09UX0RJUiA9IHJvb3REaXI7XG4gIHByb2Nlc3MuZW52LkFQUF9ESVIgPSBhcHBEaXI7XG4gIHByb2Nlc3MuZW52LkRJU1RfRElSID0gZGlzdERpcjtcblxuICBhc3luYyBmdW5jdGlvbiByZXF1ZXN0SGFuZGxlcihyZXE6IFJlcXVlc3QpIHtcbiAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBuZXcgVVJMKHJlcS51cmwpO1xuXG4gICAgaWYgKHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvX19nZW1pL2ltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gYXdhaXQgaW1hZ2VIYW5kbGVyKHJlcSk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybiA9IG5ldyBVUkxQYXR0ZXJuKHtcbiAgICAgIHBhdGhuYW1lOiBcIi8qLjpmaWxldHlwZShwbmd8dHh0fGpzfGNzc3xqcGd8c3ZnfGpwZWd8aWNvfHR0ZilcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IGlzQXBpID0gcGF0aG5hbWUuc3RhcnRzV2l0aChcIi9hcGlcIik7XG5cbiAgICBpZiAocGF0dGVybi50ZXN0KHsgcGF0aG5hbWUgfSkgJiYgIWlzQXBpKSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcS51cmwpO1xuICAgICAgY29uc3QgZmlsZVBhdGggPSByZXEudXJsLnJlcGxhY2UodXJsLm9yaWdpbiwgXCJcIikuc3BsaXQoXCI/XCIpWzBdO1xuICAgICAgY29uc3QgZmlsZSA9IEJ1bi5maWxlKFxuICAgICAgICBgZGlzdC9jbGllbnQke2ZpbGVQYXRoLnJlcGxhY2UoXCIvYXNzZXRzL2Fzc2V0c1wiLCBcIi9hc3NldHNcIil9YCxcbiAgICAgICk7XG4gICAgICBpZiAoIWZpbGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShcIk5vdCBmb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXRhZyA9IGdlbmVyYXRlRVRhZyhmaWxlLmxhc3RNb2RpZmllZCk7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGZpbGUuc3RyZWFtKCksIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IGZpbGUudHlwZSxcbiAgICAgICAgICBcIkNhY2hlLUNvbnRyb2xcIjogXCJwdWJsaWMsIG1heC1hZ2U9MzE1MzYwMDAsIG11c3QtcmV2YWxpZGF0ZVwiLFxuICAgICAgICAgIFwiQ29udGVudC1MZW5ndGhcIjogU3RyaW5nKGZpbGUuc2l6ZSksXG4gICAgICAgICAgRVRhZzogZXRhZyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0eWxlcyA9IFtdO1xuICAgIGNvbnN0IGNzc0ZpbGUgPSBCdW4uZmlsZShcbiAgICAgIGAke2Rpc3REaXJ9L2NsaWVudC8ke21hbmlmZXN0W1wiYXBwL2NsaWVudC50c3hcIl0uY3NzfWAsXG4gICAgKTtcbiAgICBjb25zdCBjc3NDb250ZW50ID0gYXdhaXQgY3NzRmlsZS50ZXh0KCk7XG4gICAgc3R5bGVzLnB1c2goe1xuICAgICAgY29udGVudDogY3NzQ29udGVudCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHZpZXdJbXBvcnRNYXAgPSB7fTtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9ICh2aWV3TmFtZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcpID0+XG4gICAgICBgXCIke3ZpZXdOYW1lfVwiOiAoKSA9PiBpbXBvcnQoXCIke3BhdGh9XCIpYDtcbiAgICBjb25zdCB0ZW1wbGF0ZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgW1wiNDA0XCIsIC4uLmFwcC5nZXRGbGF0Q29tcG9uZW50VHJlZS5jYWxsKGFwcCldKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJGaWxlID0gc2VydmVyTWFuaWZlc3RbYGFwcC92aWV3cy8ke2ZpbGVOYW1lfS50c3hgXTtcbiAgICAgIGlmICghc2VydmVyRmlsZT8uZmlsZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgU2VydmVyIGZpbGUgbm90IGZvdW5kIGZvciAke2ZpbGVOYW1lfWApO1xuICAgICAgICBjb25zb2xlLmxvZyhzZXJ2ZXJGaWxlKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBPYmplY3Qua2V5cyhzZXJ2ZXJNYW5pZmVzdCk7XG4gICAgICAgIGNvbnN0IHBhdGggPSBgYXBwL3ZpZXdzLyR7ZmlsZU5hbWV9LnRzeGA7XG4gICAgICAgIGNvbnNvbGUubG9nKGAke3BhdGh9IG5vdCBmb3VuZCBpbiBzZXJ2ZXIgbWFuaWZlc3RgKTtcbiAgICAgICAgY29uc29sZS5sb2coZmlsZXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICBgJHtwcm9jZXNzLmVudi5ESVNUX0RJUn0vc2VydmVyLyR7c2VydmVyRmlsZT8uZmlsZX1gXG4gICAgICApO1xuICAgICAgdmlld0ltcG9ydE1hcFtmaWxlTmFtZV0gPSBtb2QuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGNsaWVudEZpbGUgPSBtYW5pZmVzdFtgYXBwL3ZpZXdzLyR7ZmlsZU5hbWV9LnRzeGBdO1xuICAgICAgaWYgKGNsaWVudEZpbGUpIHtcbiAgICAgICAgdGVtcGxhdGVzLnB1c2godGVtcGxhdGUoZmlsZU5hbWUsIGAvJHtjbGllbnRGaWxlPy5maWxlfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZXJzID0gYHske3RlbXBsYXRlcy5qb2luKFwiLFwiKX19YDtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSBhcHAuZmV0Y2guYmluZChhcHApO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZXNwb25zZSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlc3VsdCh7XG4gICAgICAgICAgc3R5bGVzOiBjcmVhdGVTdHlsZXMoc3R5bGVzKSxcbiAgICAgICAgICBib290c3RyYXBNb2R1bGVzOiBbYC8ke21hbmlmZXN0W1wiYXBwL2NsaWVudC50c3hcIl0uZmlsZX1gXSxcbiAgICAgICAgICBsb2FkZXJzLFxuICAgICAgICAgIHZpZXdJbXBvcnRNYXAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgaWYgKHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSksIHtcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShlcnIuc3RhY2ssIHsgc3RhdHVzOiA1MDAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2VydmVyID0gQnVuLnNlcnZlKHtcbiAgICBmZXRjaDogYXN5bmMgKHJlcSwgc2VydmVyKSA9PiB7XG4gICAgICBpZiAoIXJlcS5oZWFkZXJzLmdldChcIngtZm9yd2FyZGVkLWZvclwiKSkge1xuICAgICAgICBjb25zdCBpcCA9IHNlcnZlci5yZXF1ZXN0SVAocmVxKTtcbiAgICAgICAgcmVxLmhlYWRlcnMuc2V0KFwieC1mb3J3YXJkZWQtZm9yXCIsIGlwLmFkZHJlc3MpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RIYW5kbGVyKHJlcSk7XG4gICAgfSxcbiAgICBwb3J0OiBwcm9jZXNzLmVudi5QT1JUIHx8IDUxNzMsXG4gIH0pO1xuXG4gIGNvbnNvbGUubG9nKFwiUHJvZHVjdGlvbiBzZXJ2ZXIgcnVubmluZyBvblwiLCBzZXJ2ZXIudXJsLmhyZWYpO1xuXG4gIHJldHVybiBzZXJ2ZXI7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZUVUYWcobGFzdE1vZGlmaWVkOiBudW1iZXIpOiBzdHJpbmcge1xuICAvLyBBc3N1bWluZyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lc3RhbXAgaXMgaW4gbWlsbGlzZWNvbmRzXG4gIGNvbnN0IGxhc3RNb2RpZmllZFN0ciA9IGxhc3RNb2RpZmllZC50b1N0cmluZygpO1xuXG4gIGNvbnN0IGhhc2hlciA9IG5ldyBCdW4uQ3J5cHRvSGFzaGVyKFwic2hhMVwiKTtcbiAgaGFzaGVyLnVwZGF0ZShsYXN0TW9kaWZpZWRTdHIpO1xuICBjb25zdCBoYXNoID0gaGFzaGVyLmRpZ2VzdChcImhleFwiKTtcblxuICByZXR1cm4gaGFzaDtcbn1cbiIsCiAgICAidmFyIFI9Y2xhc3N7dHlwZT0zO25hbWU9XCJcIjtwcmVmaXg9XCJcIjt2YWx1ZT1cIlwiO3N1ZmZpeD1cIlwiO21vZGlmaWVyPTM7Y29uc3RydWN0b3IodCxyLG4sbyxjLGwpe3RoaXMudHlwZT10LHRoaXMubmFtZT1yLHRoaXMucHJlZml4PW4sdGhpcy52YWx1ZT1vLHRoaXMuc3VmZml4PWMsdGhpcy5tb2RpZmllcj1sfWhhc0N1c3RvbU5hbWUoKXtyZXR1cm4gdGhpcy5uYW1lIT09XCJcIiYmdHlwZW9mIHRoaXMubmFtZSE9XCJudW1iZXJcIn19LGJlPS9bJF9cXHB7SURfU3RhcnR9XS91LFBlPS9bJF9cXHUyMDBDXFx1MjAwRFxccHtJRF9Db250aW51ZX1dL3UsTT1cIi4qXCI7ZnVuY3Rpb24gUmUoZSx0KXtyZXR1cm4odD8vXltcXHgwMC1cXHhGRl0qJC86L15bXFx4MDAtXFx4N0ZdKiQvKS50ZXN0KGUpfWZ1bmN0aW9uIHYoZSx0PSExKXtsZXQgcj1bXSxuPTA7Zm9yKDtuPGUubGVuZ3RoOyl7bGV0IG89ZVtuXSxjPWZ1bmN0aW9uKGwpe2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IobCk7ci5wdXNoKHt0eXBlOlwiSU5WQUxJRF9DSEFSXCIsaW5kZXg6bix2YWx1ZTplW24rK119KX07aWYobz09PVwiKlwiKXtyLnB1c2goe3R5cGU6XCJBU1RFUklTS1wiLGluZGV4Om4sdmFsdWU6ZVtuKytdfSk7Y29udGludWV9aWYobz09PVwiK1wifHxvPT09XCI/XCIpe3IucHVzaCh7dHlwZTpcIk9USEVSX01PRElGSUVSXCIsaW5kZXg6bix2YWx1ZTplW24rK119KTtjb250aW51ZX1pZihvPT09XCJcXFxcXCIpe3IucHVzaCh7dHlwZTpcIkVTQ0FQRURfQ0hBUlwiLGluZGV4Om4rKyx2YWx1ZTplW24rK119KTtjb250aW51ZX1pZihvPT09XCJ7XCIpe3IucHVzaCh7dHlwZTpcIk9QRU5cIixpbmRleDpuLHZhbHVlOmVbbisrXX0pO2NvbnRpbnVlfWlmKG89PT1cIn1cIil7ci5wdXNoKHt0eXBlOlwiQ0xPU0VcIixpbmRleDpuLHZhbHVlOmVbbisrXX0pO2NvbnRpbnVlfWlmKG89PT1cIjpcIil7bGV0IGw9XCJcIixzPW4rMTtmb3IoO3M8ZS5sZW5ndGg7KXtsZXQgaT1lLnN1YnN0cihzLDEpO2lmKHM9PT1uKzEmJmJlLnRlc3QoaSl8fHMhPT1uKzEmJlBlLnRlc3QoaSkpe2wrPWVbcysrXTtjb250aW51ZX1icmVha31pZighbCl7YyhgTWlzc2luZyBwYXJhbWV0ZXIgbmFtZSBhdCAke259YCk7Y29udGludWV9ci5wdXNoKHt0eXBlOlwiTkFNRVwiLGluZGV4Om4sdmFsdWU6bH0pLG49cztjb250aW51ZX1pZihvPT09XCIoXCIpe2xldCBsPTEscz1cIlwiLGk9bisxLGE9ITE7aWYoZVtpXT09PVwiP1wiKXtjKGBQYXR0ZXJuIGNhbm5vdCBzdGFydCB3aXRoIFwiP1wiIGF0ICR7aX1gKTtjb250aW51ZX1mb3IoO2k8ZS5sZW5ndGg7KXtpZighUmUoZVtpXSwhMSkpe2MoYEludmFsaWQgY2hhcmFjdGVyICcke2VbaV19JyBhdCAke2l9LmApLGE9ITA7YnJlYWt9aWYoZVtpXT09PVwiXFxcXFwiKXtzKz1lW2krK10rZVtpKytdO2NvbnRpbnVlfWlmKGVbaV09PT1cIilcIil7aWYobC0tLGw9PT0wKXtpKys7YnJlYWt9fWVsc2UgaWYoZVtpXT09PVwiKFwiJiYobCsrLGVbaSsxXSE9PVwiP1wiKSl7YyhgQ2FwdHVyaW5nIGdyb3VwcyBhcmUgbm90IGFsbG93ZWQgYXQgJHtpfWApLGE9ITA7YnJlYWt9cys9ZVtpKytdfWlmKGEpY29udGludWU7aWYobCl7YyhgVW5iYWxhbmNlZCBwYXR0ZXJuIGF0ICR7bn1gKTtjb250aW51ZX1pZighcyl7YyhgTWlzc2luZyBwYXR0ZXJuIGF0ICR7bn1gKTtjb250aW51ZX1yLnB1c2goe3R5cGU6XCJSRUdFWFwiLGluZGV4Om4sdmFsdWU6c30pLG49aTtjb250aW51ZX1yLnB1c2goe3R5cGU6XCJDSEFSXCIsaW5kZXg6bix2YWx1ZTplW24rK119KX1yZXR1cm4gci5wdXNoKHt0eXBlOlwiRU5EXCIsaW5kZXg6bix2YWx1ZTpcIlwifSkscn1mdW5jdGlvbiBEKGUsdD17fSl7bGV0IHI9dihlKTt0LmRlbGltaXRlcj8/PVwiLyM/XCIsdC5wcmVmaXhlcz8/PVwiLi9cIjtsZXQgbj1gW14ke1ModC5kZWxpbWl0ZXIpfV0rP2Asbz1bXSxjPTAsbD0wLHM9XCJcIixpPW5ldyBTZXQsYT1oPT57aWYobDxyLmxlbmd0aCYmcltsXS50eXBlPT09aClyZXR1cm4gcltsKytdLnZhbHVlfSxmPSgpPT5hKFwiT1RIRVJfTU9ESUZJRVJcIik/P2EoXCJBU1RFUklTS1wiKSxkPWg9PntsZXQgdT1hKGgpO2lmKHUhPT12b2lkIDApcmV0dXJuIHU7bGV0e3R5cGU6cCxpbmRleDpBfT1yW2xdO3Rocm93IG5ldyBUeXBlRXJyb3IoYFVuZXhwZWN0ZWQgJHtwfSBhdCAke0F9LCBleHBlY3RlZCAke2h9YCl9LFQ9KCk9PntsZXQgaD1cIlwiLHU7Zm9yKDt1PWEoXCJDSEFSXCIpPz9hKFwiRVNDQVBFRF9DSEFSXCIpOyloKz11O3JldHVybiBofSxTZT1oPT5oLEw9dC5lbmNvZGVQYXJ0fHxTZSxJPVwiXCIsVT1oPT57SSs9aH0sJD0oKT0+e0kubGVuZ3RoJiYoby5wdXNoKG5ldyBSKDMsXCJcIixcIlwiLEwoSSksXCJcIiwzKSksST1cIlwiKX0sVj0oaCx1LHAsQSxZKT0+e2xldCBnPTM7c3dpdGNoKFkpe2Nhc2VcIj9cIjpnPTE7YnJlYWs7Y2FzZVwiKlwiOmc9MDticmVhaztjYXNlXCIrXCI6Zz0yO2JyZWFrfWlmKCF1JiYhcCYmZz09PTMpe1UoaCk7cmV0dXJufWlmKCQoKSwhdSYmIXApe2lmKCFoKXJldHVybjtvLnB1c2gobmV3IFIoMyxcIlwiLFwiXCIsTChoKSxcIlwiLGcpKTtyZXR1cm59bGV0IG07cD9wPT09XCIqXCI/bT1NOm09cDptPW47bGV0IE89MjttPT09bj8oTz0xLG09XCJcIik6bT09PU0mJihPPTAsbT1cIlwiKTtsZXQgUDtpZih1P1A9dTpwJiYoUD1jKyspLGkuaGFzKFApKXRocm93IG5ldyBUeXBlRXJyb3IoYER1cGxpY2F0ZSBuYW1lICcke1B9Jy5gKTtpLmFkZChQKSxvLnB1c2gobmV3IFIoTyxQLEwoaCksbSxMKEEpLGcpKX07Zm9yKDtsPHIubGVuZ3RoOyl7bGV0IGg9YShcIkNIQVJcIiksdT1hKFwiTkFNRVwiKSxwPWEoXCJSRUdFWFwiKTtpZighdSYmIXAmJihwPWEoXCJBU1RFUklTS1wiKSksdXx8cCl7bGV0IGc9aD8/XCJcIjt0LnByZWZpeGVzLmluZGV4T2YoZyk9PT0tMSYmKFUoZyksZz1cIlwiKSwkKCk7bGV0IG09ZigpO1YoZyx1LHAsXCJcIixtKTtjb250aW51ZX1sZXQgQT1oPz9hKFwiRVNDQVBFRF9DSEFSXCIpO2lmKEEpe1UoQSk7Y29udGludWV9aWYoYShcIk9QRU5cIikpe2xldCBnPVQoKSxtPWEoXCJOQU1FXCIpLE89YShcIlJFR0VYXCIpOyFtJiYhTyYmKE89YShcIkFTVEVSSVNLXCIpKTtsZXQgUD1UKCk7ZChcIkNMT1NFXCIpO2xldCB4ZT1mKCk7VihnLG0sTyxQLHhlKTtjb250aW51ZX0kKCksZChcIkVORFwiKX1yZXR1cm4gb31mdW5jdGlvbiBTKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbLisqP14ke30oKVtcXF18L1xcXFxdKS9nLFwiXFxcXCQxXCIpfWZ1bmN0aW9uIFgoZSl7cmV0dXJuIGUmJmUuaWdub3JlQ2FzZT9cInVpXCI6XCJ1XCJ9ZnVuY3Rpb24gWihlLHQscil7cmV0dXJuIEYoRChlLHIpLHQscil9ZnVuY3Rpb24gayhlKXtzd2l0Y2goZSl7Y2FzZSAwOnJldHVyblwiKlwiO2Nhc2UgMTpyZXR1cm5cIj9cIjtjYXNlIDI6cmV0dXJuXCIrXCI7Y2FzZSAzOnJldHVyblwiXCJ9fWZ1bmN0aW9uIEYoZSx0LHI9e30pe3IuZGVsaW1pdGVyPz89XCIvIz9cIixyLnByZWZpeGVzPz89XCIuL1wiLHIuc2Vuc2l0aXZlPz89ITEsci5zdHJpY3Q/Pz0hMSxyLmVuZD8/PSEwLHIuc3RhcnQ/Pz0hMCxyLmVuZHNXaXRoPVwiXCI7bGV0IG49ci5zdGFydD9cIl5cIjpcIlwiO2ZvcihsZXQgcyBvZiBlKXtpZihzLnR5cGU9PT0zKXtzLm1vZGlmaWVyPT09Mz9uKz1TKHMudmFsdWUpOm4rPWAoPzoke1Mocy52YWx1ZSl9KSR7ayhzLm1vZGlmaWVyKX1gO2NvbnRpbnVlfXQmJnQucHVzaChzLm5hbWUpO2xldCBpPWBbXiR7UyhyLmRlbGltaXRlcil9XSs/YCxhPXMudmFsdWU7aWYocy50eXBlPT09MT9hPWk6cy50eXBlPT09MCYmKGE9TSksIXMucHJlZml4Lmxlbmd0aCYmIXMuc3VmZml4Lmxlbmd0aCl7cy5tb2RpZmllcj09PTN8fHMubW9kaWZpZXI9PT0xP24rPWAoJHthfSkke2socy5tb2RpZmllcil9YDpuKz1gKCg/OiR7YX0pJHtrKHMubW9kaWZpZXIpfSlgO2NvbnRpbnVlfWlmKHMubW9kaWZpZXI9PT0zfHxzLm1vZGlmaWVyPT09MSl7bis9YCg/OiR7UyhzLnByZWZpeCl9KCR7YX0pJHtTKHMuc3VmZml4KX0pYCxuKz1rKHMubW9kaWZpZXIpO2NvbnRpbnVlfW4rPWAoPzoke1Mocy5wcmVmaXgpfWAsbis9YCgoPzoke2F9KSg/OmAsbis9UyhzLnN1ZmZpeCksbis9UyhzLnByZWZpeCksbis9YCg/OiR7YX0pKSopJHtTKHMuc3VmZml4KX0pYCxzLm1vZGlmaWVyPT09MCYmKG4rPVwiP1wiKX1sZXQgbz1gWyR7UyhyLmVuZHNXaXRoKX1dfCRgLGM9YFske1Moci5kZWxpbWl0ZXIpfV1gO2lmKHIuZW5kKXJldHVybiByLnN0cmljdHx8KG4rPWAke2N9P2ApLHIuZW5kc1dpdGgubGVuZ3RoP24rPWAoPz0ke299KWA6bis9XCIkXCIsbmV3IFJlZ0V4cChuLFgocikpO3Iuc3RyaWN0fHwobis9YCg/OiR7Y30oPz0ke299KSk/YCk7bGV0IGw9ITE7aWYoZS5sZW5ndGgpe2xldCBzPWVbZS5sZW5ndGgtMV07cy50eXBlPT09MyYmcy5tb2RpZmllcj09PTMmJihsPXIuZGVsaW1pdGVyLmluZGV4T2Yocyk+LTEpfXJldHVybiBsfHwobis9YCg/PSR7Y318JHtvfSlgKSxuZXcgUmVnRXhwKG4sWChyKSl9dmFyIHg9e2RlbGltaXRlcjpcIlwiLHByZWZpeGVzOlwiXCIsc2Vuc2l0aXZlOiEwLHN0cmljdDohMH0sQj17ZGVsaW1pdGVyOlwiLlwiLHByZWZpeGVzOlwiXCIsc2Vuc2l0aXZlOiEwLHN0cmljdDohMH0scT17ZGVsaW1pdGVyOlwiL1wiLHByZWZpeGVzOlwiL1wiLHNlbnNpdGl2ZTohMCxzdHJpY3Q6ITB9O2Z1bmN0aW9uIEooZSx0KXtyZXR1cm4gZS5sZW5ndGg/ZVswXT09PVwiL1wiPyEwOiF0fHxlLmxlbmd0aDwyPyExOihlWzBdPT1cIlxcXFxcInx8ZVswXT09XCJ7XCIpJiZlWzFdPT1cIi9cIjohMX1mdW5jdGlvbiBRKGUsdCl7cmV0dXJuIGUuc3RhcnRzV2l0aCh0KT9lLnN1YnN0cmluZyh0Lmxlbmd0aCxlLmxlbmd0aCk6ZX1mdW5jdGlvbiBFZShlLHQpe3JldHVybiBlLmVuZHNXaXRoKHQpP2Uuc3Vic3RyKDAsZS5sZW5ndGgtdC5sZW5ndGgpOmV9ZnVuY3Rpb24gVyhlKXtyZXR1cm4hZXx8ZS5sZW5ndGg8Mj8hMTplWzBdPT09XCJbXCJ8fChlWzBdPT09XCJcXFxcXCJ8fGVbMF09PT1cIntcIikmJmVbMV09PT1cIltcIn12YXIgZWU9W1wiZnRwXCIsXCJmaWxlXCIsXCJodHRwXCIsXCJodHRwc1wiLFwid3NcIixcIndzc1wiXTtmdW5jdGlvbiBOKGUpe2lmKCFlKXJldHVybiEwO2ZvcihsZXQgdCBvZiBlZSlpZihlLnRlc3QodCkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdGUoZSx0KXtpZihlPVEoZSxcIiNcIiksdHx8ZT09PVwiXCIpcmV0dXJuIGU7bGV0IHI9bmV3IFVSTChcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7cmV0dXJuIHIuaGFzaD1lLHIuaGFzaD9yLmhhc2guc3Vic3RyaW5nKDEsci5oYXNoLmxlbmd0aCk6XCJcIn1mdW5jdGlvbiByZShlLHQpe2lmKGU9UShlLFwiP1wiKSx0fHxlPT09XCJcIilyZXR1cm4gZTtsZXQgcj1uZXcgVVJMKFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiKTtyZXR1cm4gci5zZWFyY2g9ZSxyLnNlYXJjaD9yLnNlYXJjaC5zdWJzdHJpbmcoMSxyLnNlYXJjaC5sZW5ndGgpOlwiXCJ9ZnVuY3Rpb24gbmUoZSx0KXtyZXR1cm4gdHx8ZT09PVwiXCI/ZTpXKGUpP2ooZSk6eihlKX1mdW5jdGlvbiBzZShlLHQpe2lmKHR8fGU9PT1cIlwiKXJldHVybiBlO2xldCByPW5ldyBVUkwoXCJodHRwczovL2V4YW1wbGUuY29tXCIpO3JldHVybiByLnBhc3N3b3JkPWUsci5wYXNzd29yZH1mdW5jdGlvbiBpZShlLHQpe2lmKHR8fGU9PT1cIlwiKXJldHVybiBlO2xldCByPW5ldyBVUkwoXCJodHRwczovL2V4YW1wbGUuY29tXCIpO3JldHVybiByLnVzZXJuYW1lPWUsci51c2VybmFtZX1mdW5jdGlvbiBhZShlLHQscil7aWYocnx8ZT09PVwiXCIpcmV0dXJuIGU7aWYodCYmIWVlLmluY2x1ZGVzKHQpKXJldHVybiBuZXcgVVJMKGAke3R9OiR7ZX1gKS5wYXRobmFtZTtsZXQgbj1lWzBdPT1cIi9cIjtyZXR1cm4gZT1uZXcgVVJMKG4/ZTpcIi8tXCIrZSxcImh0dHBzOi8vZXhhbXBsZS5jb21cIikucGF0aG5hbWUsbnx8KGU9ZS5zdWJzdHJpbmcoMixlLmxlbmd0aCkpLGV9ZnVuY3Rpb24gb2UoZSx0LHIpe3JldHVybiBfKHQpPT09ZSYmKGU9XCJcIikscnx8ZT09PVwiXCI/ZTpLKGUpfWZ1bmN0aW9uIGNlKGUsdCl7cmV0dXJuIGU9RWUoZSxcIjpcIiksdHx8ZT09PVwiXCI/ZTp5KGUpfWZ1bmN0aW9uIF8oZSl7c3dpdGNoKGUpe2Nhc2VcIndzXCI6Y2FzZVwiaHR0cFwiOnJldHVyblwiODBcIjtjYXNlXCJ3d3NcIjpjYXNlXCJodHRwc1wiOnJldHVyblwiNDQzXCI7Y2FzZVwiZnRwXCI6cmV0dXJuXCIyMVwiO2RlZmF1bHQ6cmV0dXJuXCJcIn19ZnVuY3Rpb24geShlKXtpZihlPT09XCJcIilyZXR1cm4gZTtpZigvXlstKy5BLVphLXowLTldKiQvLnRlc3QoZSkpcmV0dXJuIGUudG9Mb3dlckNhc2UoKTt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHByb3RvY29sICcke2V9Jy5gKX1mdW5jdGlvbiBsZShlKXtpZihlPT09XCJcIilyZXR1cm4gZTtsZXQgdD1uZXcgVVJMKFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiKTtyZXR1cm4gdC51c2VybmFtZT1lLHQudXNlcm5hbWV9ZnVuY3Rpb24gZmUoZSl7aWYoZT09PVwiXCIpcmV0dXJuIGU7bGV0IHQ9bmV3IFVSTChcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7cmV0dXJuIHQucGFzc3dvcmQ9ZSx0LnBhc3N3b3JkfWZ1bmN0aW9uIHooZSl7aWYoZT09PVwiXCIpcmV0dXJuIGU7aWYoL1tcXHRcXG5cXHIgIyUvOjw+P0BbXFxdXlxcXFx8XS9nLnRlc3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBob3N0bmFtZSAnJHtlfSdgKTtsZXQgdD1uZXcgVVJMKFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiKTtyZXR1cm4gdC5ob3N0bmFtZT1lLHQuaG9zdG5hbWV9ZnVuY3Rpb24gaihlKXtpZihlPT09XCJcIilyZXR1cm4gZTtpZigvW14wLTlhLWZBLUZbXFxdOl0vZy50ZXN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgSVB2NiBob3N0bmFtZSAnJHtlfSdgKTtyZXR1cm4gZS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIEsoZSl7aWYoZT09PVwiXCJ8fC9eWzAtOV0qJC8udGVzdChlKSYmcGFyc2VJbnQoZSk8PTY1NTM1KXJldHVybiBlO3Rocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgcG9ydCAnJHtlfScuYCl9ZnVuY3Rpb24gaGUoZSl7aWYoZT09PVwiXCIpcmV0dXJuIGU7bGV0IHQ9bmV3IFVSTChcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7cmV0dXJuIHQucGF0aG5hbWU9ZVswXSE9PVwiL1wiP1wiLy1cIitlOmUsZVswXSE9PVwiL1wiP3QucGF0aG5hbWUuc3Vic3RyaW5nKDIsdC5wYXRobmFtZS5sZW5ndGgpOnQucGF0aG5hbWV9ZnVuY3Rpb24gdWUoZSl7cmV0dXJuIGU9PT1cIlwiP2U6bmV3IFVSTChgZGF0YToke2V9YCkucGF0aG5hbWV9ZnVuY3Rpb24gZGUoZSl7aWYoZT09PVwiXCIpcmV0dXJuIGU7bGV0IHQ9bmV3IFVSTChcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7cmV0dXJuIHQuc2VhcmNoPWUsdC5zZWFyY2guc3Vic3RyaW5nKDEsdC5zZWFyY2gubGVuZ3RoKX1mdW5jdGlvbiBwZShlKXtpZihlPT09XCJcIilyZXR1cm4gZTtsZXQgdD1uZXcgVVJMKFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiKTtyZXR1cm4gdC5oYXNoPWUsdC5oYXNoLnN1YnN0cmluZygxLHQuaGFzaC5sZW5ndGgpfXZhciBIPWNsYXNzeyNpOyNuPVtdOyN0PXt9OyNlPTA7I3M9MTsjbD0wOyNvPTA7I2Q9MDsjcD0wOyNnPSExO2NvbnN0cnVjdG9yKHQpe3RoaXMuI2k9dH1nZXQgcmVzdWx0KCl7cmV0dXJuIHRoaXMuI3R9cGFyc2UoKXtmb3IodGhpcy4jbj12KHRoaXMuI2ksITApO3RoaXMuI2U8dGhpcy4jbi5sZW5ndGg7dGhpcy4jZSs9dGhpcy4jcyl7aWYodGhpcy4jcz0xLHRoaXMuI25bdGhpcy4jZV0udHlwZT09PVwiRU5EXCIpe2lmKHRoaXMuI289PT0wKXt0aGlzLiNiKCksdGhpcy4jZigpP3RoaXMuI3IoOSwxKTp0aGlzLiNoKCk/dGhpcy4jcig4LDEpOnRoaXMuI3IoNywwKTtjb250aW51ZX1lbHNlIGlmKHRoaXMuI289PT0yKXt0aGlzLiN1KDUpO2NvbnRpbnVlfXRoaXMuI3IoMTAsMCk7YnJlYWt9aWYodGhpcy4jZD4wKWlmKHRoaXMuI0EoKSl0aGlzLiNkLT0xO2Vsc2UgY29udGludWU7aWYodGhpcy4jVCgpKXt0aGlzLiNkKz0xO2NvbnRpbnVlfXN3aXRjaCh0aGlzLiNvKXtjYXNlIDA6dGhpcy4jUCgpJiZ0aGlzLiN1KDEpO2JyZWFrO2Nhc2UgMTppZih0aGlzLiNQKCkpe3RoaXMuI0MoKTtsZXQgdD03LHI9MTt0aGlzLiNFKCk/KHQ9MixyPTMpOnRoaXMuI2cmJih0PTIpLHRoaXMuI3IodCxyKX1icmVhaztjYXNlIDI6dGhpcy4jUygpP3RoaXMuI3UoMyk6KHRoaXMuI3goKXx8dGhpcy4jaCgpfHx0aGlzLiNmKCkpJiZ0aGlzLiN1KDUpO2JyZWFrO2Nhc2UgMzp0aGlzLiNPKCk/dGhpcy4jcig0LDEpOnRoaXMuI1MoKSYmdGhpcy4jcig1LDEpO2JyZWFrO2Nhc2UgNDp0aGlzLiNTKCkmJnRoaXMuI3IoNSwxKTticmVhaztjYXNlIDU6dGhpcy4jeSgpP3RoaXMuI3ArPTE6dGhpcy4jdygpJiYodGhpcy4jcC09MSksdGhpcy4jaygpJiYhdGhpcy4jcD90aGlzLiNyKDYsMSk6dGhpcy4jeCgpP3RoaXMuI3IoNywwKTp0aGlzLiNoKCk/dGhpcy4jcig4LDEpOnRoaXMuI2YoKSYmdGhpcy4jcig5LDEpO2JyZWFrO2Nhc2UgNjp0aGlzLiN4KCk/dGhpcy4jcig3LDApOnRoaXMuI2goKT90aGlzLiNyKDgsMSk6dGhpcy4jZigpJiZ0aGlzLiNyKDksMSk7YnJlYWs7Y2FzZSA3OnRoaXMuI2goKT90aGlzLiNyKDgsMSk6dGhpcy4jZigpJiZ0aGlzLiNyKDksMSk7YnJlYWs7Y2FzZSA4OnRoaXMuI2YoKSYmdGhpcy4jcig5LDEpO2JyZWFrO2Nhc2UgOTpicmVhaztjYXNlIDEwOmJyZWFrfX10aGlzLiN0Lmhvc3RuYW1lIT09dm9pZCAwJiZ0aGlzLiN0LnBvcnQ9PT12b2lkIDAmJih0aGlzLiN0LnBvcnQ9XCJcIil9I3IodCxyKXtzd2l0Y2godGhpcy4jbyl7Y2FzZSAwOmJyZWFrO2Nhc2UgMTp0aGlzLiN0LnByb3RvY29sPXRoaXMuI2MoKTticmVhaztjYXNlIDI6YnJlYWs7Y2FzZSAzOnRoaXMuI3QudXNlcm5hbWU9dGhpcy4jYygpO2JyZWFrO2Nhc2UgNDp0aGlzLiN0LnBhc3N3b3JkPXRoaXMuI2MoKTticmVhaztjYXNlIDU6dGhpcy4jdC5ob3N0bmFtZT10aGlzLiNjKCk7YnJlYWs7Y2FzZSA2OnRoaXMuI3QucG9ydD10aGlzLiNjKCk7YnJlYWs7Y2FzZSA3OnRoaXMuI3QucGF0aG5hbWU9dGhpcy4jYygpO2JyZWFrO2Nhc2UgODp0aGlzLiN0LnNlYXJjaD10aGlzLiNjKCk7YnJlYWs7Y2FzZSA5OnRoaXMuI3QuaGFzaD10aGlzLiNjKCk7YnJlYWs7Y2FzZSAxMDpicmVha310aGlzLiNvIT09MCYmdCE9PTEwJiYoWzEsMiwzLDRdLmluY2x1ZGVzKHRoaXMuI28pJiZbNiw3LDgsOV0uaW5jbHVkZXModCkmJih0aGlzLiN0Lmhvc3RuYW1lPz89XCJcIiksWzEsMiwzLDQsNSw2XS5pbmNsdWRlcyh0aGlzLiNvKSYmWzgsOV0uaW5jbHVkZXModCkmJih0aGlzLiN0LnBhdGhuYW1lPz89dGhpcy4jZz9cIi9cIjpcIlwiKSxbMSwyLDMsNCw1LDYsN10uaW5jbHVkZXModGhpcy4jbykmJnQ9PT05JiYodGhpcy4jdC5zZWFyY2g/Pz1cIlwiKSksdGhpcy4jUih0LHIpfSNSKHQscil7dGhpcy4jbz10LHRoaXMuI2w9dGhpcy4jZStyLHRoaXMuI2UrPXIsdGhpcy4jcz0wfSNiKCl7dGhpcy4jZT10aGlzLiNsLHRoaXMuI3M9MH0jdSh0KXt0aGlzLiNiKCksdGhpcy4jbz10fSNtKHQpe3JldHVybiB0PDAmJih0PXRoaXMuI24ubGVuZ3RoLXQpLHQ8dGhpcy4jbi5sZW5ndGg/dGhpcy4jblt0XTp0aGlzLiNuW3RoaXMuI24ubGVuZ3RoLTFdfSNhKHQscil7bGV0IG49dGhpcy4jbSh0KTtyZXR1cm4gbi52YWx1ZT09PXImJihuLnR5cGU9PT1cIkNIQVJcInx8bi50eXBlPT09XCJFU0NBUEVEX0NIQVJcInx8bi50eXBlPT09XCJJTlZBTElEX0NIQVJcIil9I1AoKXtyZXR1cm4gdGhpcy4jYSh0aGlzLiNlLFwiOlwiKX0jRSgpe3JldHVybiB0aGlzLiNhKHRoaXMuI2UrMSxcIi9cIikmJnRoaXMuI2EodGhpcy4jZSsyLFwiL1wiKX0jUygpe3JldHVybiB0aGlzLiNhKHRoaXMuI2UsXCJAXCIpfSNPKCl7cmV0dXJuIHRoaXMuI2EodGhpcy4jZSxcIjpcIil9I2soKXtyZXR1cm4gdGhpcy4jYSh0aGlzLiNlLFwiOlwiKX0jeCgpe3JldHVybiB0aGlzLiNhKHRoaXMuI2UsXCIvXCIpfSNoKCl7aWYodGhpcy4jYSh0aGlzLiNlLFwiP1wiKSlyZXR1cm4hMDtpZih0aGlzLiNuW3RoaXMuI2VdLnZhbHVlIT09XCI/XCIpcmV0dXJuITE7bGV0IHQ9dGhpcy4jbSh0aGlzLiNlLTEpO3JldHVybiB0LnR5cGUhPT1cIk5BTUVcIiYmdC50eXBlIT09XCJSRUdFWFwiJiZ0LnR5cGUhPT1cIkNMT1NFXCImJnQudHlwZSE9PVwiQVNURVJJU0tcIn0jZigpe3JldHVybiB0aGlzLiNhKHRoaXMuI2UsXCIjXCIpfSNUKCl7cmV0dXJuIHRoaXMuI25bdGhpcy4jZV0udHlwZT09XCJPUEVOXCJ9I0EoKXtyZXR1cm4gdGhpcy4jblt0aGlzLiNlXS50eXBlPT1cIkNMT1NFXCJ9I3koKXtyZXR1cm4gdGhpcy4jYSh0aGlzLiNlLFwiW1wiKX0jdygpe3JldHVybiB0aGlzLiNhKHRoaXMuI2UsXCJdXCIpfSNjKCl7bGV0IHQ9dGhpcy4jblt0aGlzLiNlXSxyPXRoaXMuI20odGhpcy4jbCkuaW5kZXg7cmV0dXJuIHRoaXMuI2kuc3Vic3RyaW5nKHIsdC5pbmRleCl9I0MoKXtsZXQgdD17fTtPYmplY3QuYXNzaWduKHQseCksdC5lbmNvZGVQYXJ0PXk7bGV0IHI9Wih0aGlzLiNjKCksdm9pZCAwLHQpO3RoaXMuI2c9TihyKX19O3ZhciBHPVtcInByb3RvY29sXCIsXCJ1c2VybmFtZVwiLFwicGFzc3dvcmRcIixcImhvc3RuYW1lXCIsXCJwb3J0XCIsXCJwYXRobmFtZVwiLFwic2VhcmNoXCIsXCJoYXNoXCJdLEU9XCIqXCI7ZnVuY3Rpb24gZ2UoZSx0KXtpZih0eXBlb2YgZSE9XCJzdHJpbmdcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwicGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ3N0cmluZycuXCIpO2xldCByPW5ldyBVUkwoZSx0KTtyZXR1cm57cHJvdG9jb2w6ci5wcm90b2NvbC5zdWJzdHJpbmcoMCxyLnByb3RvY29sLmxlbmd0aC0xKSx1c2VybmFtZTpyLnVzZXJuYW1lLHBhc3N3b3JkOnIucGFzc3dvcmQsaG9zdG5hbWU6ci5ob3N0bmFtZSxwb3J0OnIucG9ydCxwYXRobmFtZTpyLnBhdGhuYW1lLHNlYXJjaDpyLnNlYXJjaCE9PVwiXCI/ci5zZWFyY2guc3Vic3RyaW5nKDEsci5zZWFyY2gubGVuZ3RoKTp2b2lkIDAsaGFzaDpyLmhhc2ghPT1cIlwiP3IuaGFzaC5zdWJzdHJpbmcoMSxyLmhhc2gubGVuZ3RoKTp2b2lkIDB9fWZ1bmN0aW9uIGIoZSx0KXtyZXR1cm4gdD9DKGUpOmV9ZnVuY3Rpb24gdyhlLHQscil7bGV0IG47aWYodHlwZW9mIHQuYmFzZVVSTD09XCJzdHJpbmdcIil0cnl7bj1uZXcgVVJMKHQuYmFzZVVSTCksdC5wcm90b2NvbD09PXZvaWQgMCYmKGUucHJvdG9jb2w9YihuLnByb3RvY29sLnN1YnN0cmluZygwLG4ucHJvdG9jb2wubGVuZ3RoLTEpLHIpKSwhciYmdC5wcm90b2NvbD09PXZvaWQgMCYmdC5ob3N0bmFtZT09PXZvaWQgMCYmdC5wb3J0PT09dm9pZCAwJiZ0LnVzZXJuYW1lPT09dm9pZCAwJiYoZS51c2VybmFtZT1iKG4udXNlcm5hbWUscikpLCFyJiZ0LnByb3RvY29sPT09dm9pZCAwJiZ0Lmhvc3RuYW1lPT09dm9pZCAwJiZ0LnBvcnQ9PT12b2lkIDAmJnQudXNlcm5hbWU9PT12b2lkIDAmJnQucGFzc3dvcmQ9PT12b2lkIDAmJihlLnBhc3N3b3JkPWIobi5wYXNzd29yZCxyKSksdC5wcm90b2NvbD09PXZvaWQgMCYmdC5ob3N0bmFtZT09PXZvaWQgMCYmKGUuaG9zdG5hbWU9YihuLmhvc3RuYW1lLHIpKSx0LnByb3RvY29sPT09dm9pZCAwJiZ0Lmhvc3RuYW1lPT09dm9pZCAwJiZ0LnBvcnQ9PT12b2lkIDAmJihlLnBvcnQ9YihuLnBvcnQscikpLHQucHJvdG9jb2w9PT12b2lkIDAmJnQuaG9zdG5hbWU9PT12b2lkIDAmJnQucG9ydD09PXZvaWQgMCYmdC5wYXRobmFtZT09PXZvaWQgMCYmKGUucGF0aG5hbWU9YihuLnBhdGhuYW1lLHIpKSx0LnByb3RvY29sPT09dm9pZCAwJiZ0Lmhvc3RuYW1lPT09dm9pZCAwJiZ0LnBvcnQ9PT12b2lkIDAmJnQucGF0aG5hbWU9PT12b2lkIDAmJnQuc2VhcmNoPT09dm9pZCAwJiYoZS5zZWFyY2g9YihuLnNlYXJjaC5zdWJzdHJpbmcoMSxuLnNlYXJjaC5sZW5ndGgpLHIpKSx0LnByb3RvY29sPT09dm9pZCAwJiZ0Lmhvc3RuYW1lPT09dm9pZCAwJiZ0LnBvcnQ9PT12b2lkIDAmJnQucGF0aG5hbWU9PT12b2lkIDAmJnQuc2VhcmNoPT09dm9pZCAwJiZ0Lmhhc2g9PT12b2lkIDAmJihlLmhhc2g9YihuLmhhc2guc3Vic3RyaW5nKDEsbi5oYXNoLmxlbmd0aCkscikpfWNhdGNoe3Rocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgYmFzZVVSTCAnJHt0LmJhc2VVUkx9Jy5gKX1pZih0eXBlb2YgdC5wcm90b2NvbD09XCJzdHJpbmdcIiYmKGUucHJvdG9jb2w9Y2UodC5wcm90b2NvbCxyKSksdHlwZW9mIHQudXNlcm5hbWU9PVwic3RyaW5nXCImJihlLnVzZXJuYW1lPWllKHQudXNlcm5hbWUscikpLHR5cGVvZiB0LnBhc3N3b3JkPT1cInN0cmluZ1wiJiYoZS5wYXNzd29yZD1zZSh0LnBhc3N3b3JkLHIpKSx0eXBlb2YgdC5ob3N0bmFtZT09XCJzdHJpbmdcIiYmKGUuaG9zdG5hbWU9bmUodC5ob3N0bmFtZSxyKSksdHlwZW9mIHQucG9ydD09XCJzdHJpbmdcIiYmKGUucG9ydD1vZSh0LnBvcnQsZS5wcm90b2NvbCxyKSksdHlwZW9mIHQucGF0aG5hbWU9PVwic3RyaW5nXCIpe2lmKGUucGF0aG5hbWU9dC5wYXRobmFtZSxuJiYhSihlLnBhdGhuYW1lLHIpKXtsZXQgbz1uLnBhdGhuYW1lLmxhc3RJbmRleE9mKFwiL1wiKTtvPj0wJiYoZS5wYXRobmFtZT1iKG4ucGF0aG5hbWUuc3Vic3RyaW5nKDAsbysxKSxyKStlLnBhdGhuYW1lKX1lLnBhdGhuYW1lPWFlKGUucGF0aG5hbWUsZS5wcm90b2NvbCxyKX1yZXR1cm4gdHlwZW9mIHQuc2VhcmNoPT1cInN0cmluZ1wiJiYoZS5zZWFyY2g9cmUodC5zZWFyY2gscikpLHR5cGVvZiB0Lmhhc2g9PVwic3RyaW5nXCImJihlLmhhc2g9dGUodC5oYXNoLHIpKSxlfWZ1bmN0aW9uIEMoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFsrKj86e30oKVxcXFxdKS9nLFwiXFxcXCQxXCIpfWZ1bmN0aW9uIE9lKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbLisqP14ke30oKVtcXF18L1xcXFxdKS9nLFwiXFxcXCQxXCIpfWZ1bmN0aW9uIGtlKGUsdCl7dC5kZWxpbWl0ZXI/Pz1cIi8jP1wiLHQucHJlZml4ZXM/Pz1cIi4vXCIsdC5zZW5zaXRpdmU/Pz0hMSx0LnN0cmljdD8/PSExLHQuZW5kPz89ITAsdC5zdGFydD8/PSEwLHQuZW5kc1dpdGg9XCJcIjtsZXQgcj1cIi4qXCIsbj1gW14ke09lKHQuZGVsaW1pdGVyKX1dKz9gLG89L1skX1xcdTIwMENcXHUyMDBEXFxwe0lEX0NvbnRpbnVlfV0vdSxjPVwiXCI7Zm9yKGxldCBsPTA7bDxlLmxlbmd0aDsrK2wpe2xldCBzPWVbbF07aWYocy50eXBlPT09Myl7aWYocy5tb2RpZmllcj09PTMpe2MrPUMocy52YWx1ZSk7Y29udGludWV9Yys9YHske0Mocy52YWx1ZSl9fSR7ayhzLm1vZGlmaWVyKX1gO2NvbnRpbnVlfWxldCBpPXMuaGFzQ3VzdG9tTmFtZSgpLGE9ISFzLnN1ZmZpeC5sZW5ndGh8fCEhcy5wcmVmaXgubGVuZ3RoJiYocy5wcmVmaXgubGVuZ3RoIT09MXx8IXQucHJlZml4ZXMuaW5jbHVkZXMocy5wcmVmaXgpKSxmPWw+MD9lW2wtMV06bnVsbCxkPWw8ZS5sZW5ndGgtMT9lW2wrMV06bnVsbDtpZighYSYmaSYmcy50eXBlPT09MSYmcy5tb2RpZmllcj09PTMmJmQmJiFkLnByZWZpeC5sZW5ndGgmJiFkLnN1ZmZpeC5sZW5ndGgpaWYoZC50eXBlPT09Myl7bGV0IFQ9ZC52YWx1ZS5sZW5ndGg+MD9kLnZhbHVlWzBdOlwiXCI7YT1vLnRlc3QoVCl9ZWxzZSBhPSFkLmhhc0N1c3RvbU5hbWUoKTtpZighYSYmIXMucHJlZml4Lmxlbmd0aCYmZiYmZi50eXBlPT09Myl7bGV0IFQ9Zi52YWx1ZVtmLnZhbHVlLmxlbmd0aC0xXTthPXQucHJlZml4ZXMuaW5jbHVkZXMoVCl9YSYmKGMrPVwie1wiKSxjKz1DKHMucHJlZml4KSxpJiYoYys9YDoke3MubmFtZX1gKSxzLnR5cGU9PT0yP2MrPWAoJHtzLnZhbHVlfSlgOnMudHlwZT09PTE/aXx8KGMrPWAoJHtufSlgKTpzLnR5cGU9PT0wJiYoIWkmJighZnx8Zi50eXBlPT09M3x8Zi5tb2RpZmllciE9PTN8fGF8fHMucHJlZml4IT09XCJcIik/Yys9XCIqXCI6Yys9YCgke3J9KWApLHMudHlwZT09PTEmJmkmJnMuc3VmZml4Lmxlbmd0aCYmby50ZXN0KHMuc3VmZml4WzBdKSYmKGMrPVwiXFxcXFwiKSxjKz1DKHMuc3VmZml4KSxhJiYoYys9XCJ9XCIpLHMubW9kaWZpZXIhPT0zJiYoYys9ayhzLm1vZGlmaWVyKSl9cmV0dXJuIGN9dmFyIG1lPWNsYXNzeyNpOyNuPXt9OyN0PXt9OyNlPXt9OyNzPXt9OyNsPSExO2NvbnN0cnVjdG9yKHQ9e30scixuKXt0cnl7bGV0IG87aWYodHlwZW9mIHI9PVwic3RyaW5nXCI/bz1yOm49cix0eXBlb2YgdD09XCJzdHJpbmdcIil7bGV0IGk9bmV3IEgodCk7aWYoaS5wYXJzZSgpLHQ9aS5yZXN1bHQsbz09PXZvaWQgMCYmdHlwZW9mIHQucHJvdG9jb2whPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkEgYmFzZSBVUkwgbXVzdCBiZSBwcm92aWRlZCBmb3IgYSByZWxhdGl2ZSBjb25zdHJ1Y3RvciBzdHJpbmcuXCIpO3QuYmFzZVVSTD1vfWVsc2V7aWYoIXR8fHR5cGVvZiB0IT1cIm9iamVjdFwiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSAnc3RyaW5nJyBhbmQgY2Fubm90IGNvbnZlcnQgdG8gZGljdGlvbmFyeS5cIik7aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKFwicGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ3N0cmluZycuXCIpfXR5cGVvZiBuPlwidVwiJiYobj17aWdub3JlQ2FzZTohMX0pO2xldCBjPXtpZ25vcmVDYXNlOm4uaWdub3JlQ2FzZT09PSEwfSxsPXtwYXRobmFtZTpFLHByb3RvY29sOkUsdXNlcm5hbWU6RSxwYXNzd29yZDpFLGhvc3RuYW1lOkUscG9ydDpFLHNlYXJjaDpFLGhhc2g6RX07dGhpcy4jaT13KGwsdCwhMCksXyh0aGlzLiNpLnByb3RvY29sKT09PXRoaXMuI2kucG9ydCYmKHRoaXMuI2kucG9ydD1cIlwiKTtsZXQgcztmb3IocyBvZiBHKXtpZighKHMgaW4gdGhpcy4jaSkpY29udGludWU7bGV0IGk9e30sYT10aGlzLiNpW3NdO3N3aXRjaCh0aGlzLiN0W3NdPVtdLHMpe2Nhc2VcInByb3RvY29sXCI6T2JqZWN0LmFzc2lnbihpLHgpLGkuZW5jb2RlUGFydD15O2JyZWFrO2Nhc2VcInVzZXJuYW1lXCI6T2JqZWN0LmFzc2lnbihpLHgpLGkuZW5jb2RlUGFydD1sZTticmVhaztjYXNlXCJwYXNzd29yZFwiOk9iamVjdC5hc3NpZ24oaSx4KSxpLmVuY29kZVBhcnQ9ZmU7YnJlYWs7Y2FzZVwiaG9zdG5hbWVcIjpPYmplY3QuYXNzaWduKGksQiksVyhhKT9pLmVuY29kZVBhcnQ9ajppLmVuY29kZVBhcnQ9ejticmVhaztjYXNlXCJwb3J0XCI6T2JqZWN0LmFzc2lnbihpLHgpLGkuZW5jb2RlUGFydD1LO2JyZWFrO2Nhc2VcInBhdGhuYW1lXCI6Tih0aGlzLiNuLnByb3RvY29sKT8oT2JqZWN0LmFzc2lnbihpLHEsYyksaS5lbmNvZGVQYXJ0PWhlKTooT2JqZWN0LmFzc2lnbihpLHgsYyksaS5lbmNvZGVQYXJ0PXVlKTticmVhaztjYXNlXCJzZWFyY2hcIjpPYmplY3QuYXNzaWduKGkseCxjKSxpLmVuY29kZVBhcnQ9ZGU7YnJlYWs7Y2FzZVwiaGFzaFwiOk9iamVjdC5hc3NpZ24oaSx4LGMpLGkuZW5jb2RlUGFydD1wZTticmVha310cnl7dGhpcy4jc1tzXT1EKGEsaSksdGhpcy4jbltzXT1GKHRoaXMuI3Nbc10sdGhpcy4jdFtzXSxpKSx0aGlzLiNlW3NdPWtlKHRoaXMuI3Nbc10saSksdGhpcy4jbD10aGlzLiNsfHx0aGlzLiNzW3NdLnNvbWUoZj0+Zi50eXBlPT09Mil9Y2F0Y2h7dGhyb3cgbmV3IFR5cGVFcnJvcihgaW52YWxpZCAke3N9IHBhdHRlcm4gJyR7dGhpcy4jaVtzXX0nLmApfX19Y2F0Y2gobyl7dGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIGNvbnN0cnVjdCAnVVJMUGF0dGVybic6ICR7by5tZXNzYWdlfWApfX10ZXN0KHQ9e30scil7bGV0IG49e3BhdGhuYW1lOlwiXCIscHJvdG9jb2w6XCJcIix1c2VybmFtZTpcIlwiLHBhc3N3b3JkOlwiXCIsaG9zdG5hbWU6XCJcIixwb3J0OlwiXCIsc2VhcmNoOlwiXCIsaGFzaDpcIlwifTtpZih0eXBlb2YgdCE9XCJzdHJpbmdcIiYmcil0aHJvdyBuZXcgVHlwZUVycm9yKFwicGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ3N0cmluZycuXCIpO2lmKHR5cGVvZiB0PlwidVwiKXJldHVybiExO3RyeXt0eXBlb2YgdD09XCJvYmplY3RcIj9uPXcobix0LCExKTpuPXcobixnZSh0LHIpLCExKX1jYXRjaHtyZXR1cm4hMX1sZXQgbztmb3IobyBvZiBHKWlmKCF0aGlzLiNuW29dLmV4ZWMobltvXSkpcmV0dXJuITE7cmV0dXJuITB9ZXhlYyh0PXt9LHIpe2xldCBuPXtwYXRobmFtZTpcIlwiLHByb3RvY29sOlwiXCIsdXNlcm5hbWU6XCJcIixwYXNzd29yZDpcIlwiLGhvc3RuYW1lOlwiXCIscG9ydDpcIlwiLHNlYXJjaDpcIlwiLGhhc2g6XCJcIn07aWYodHlwZW9mIHQhPVwic3RyaW5nXCImJnIpdGhyb3cgbmV3IFR5cGVFcnJvcihcInBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdzdHJpbmcnLlwiKTtpZih0eXBlb2YgdD5cInVcIilyZXR1cm47dHJ5e3R5cGVvZiB0PT1cIm9iamVjdFwiP249dyhuLHQsITEpOm49dyhuLGdlKHQsciksITEpfWNhdGNoe3JldHVybiBudWxsfWxldCBvPXt9O3I/by5pbnB1dHM9W3Qscl06by5pbnB1dHM9W3RdO2xldCBjO2ZvcihjIG9mIEcpe2xldCBsPXRoaXMuI25bY10uZXhlYyhuW2NdKTtpZighbClyZXR1cm4gbnVsbDtsZXQgcz17fTtmb3IobGV0W2ksYV1vZiB0aGlzLiN0W2NdLmVudHJpZXMoKSlpZih0eXBlb2YgYT09XCJzdHJpbmdcInx8dHlwZW9mIGE9PVwibnVtYmVyXCIpe2xldCBmPWxbaSsxXTtzW2FdPWZ9b1tjXT17aW5wdXQ6bltjXT8/XCJcIixncm91cHM6c319cmV0dXJuIG99c3RhdGljIGNvbXBhcmVDb21wb25lbnQodCxyLG4pe2xldCBvPShpLGEpPT57Zm9yKGxldCBmIG9mW1widHlwZVwiLFwibW9kaWZpZXJcIixcInByZWZpeFwiLFwidmFsdWVcIixcInN1ZmZpeFwiXSl7aWYoaVtmXTxhW2ZdKXJldHVybi0xO2lmKGlbZl09PT1hW2ZdKWNvbnRpbnVlO3JldHVybiAxfXJldHVybiAwfSxjPW5ldyBSKDMsXCJcIixcIlwiLFwiXCIsXCJcIiwzKSxsPW5ldyBSKDAsXCJcIixcIlwiLFwiXCIsXCJcIiwzKSxzPShpLGEpPT57bGV0IGY9MDtmb3IoO2Y8TWF0aC5taW4oaS5sZW5ndGgsYS5sZW5ndGgpOysrZil7bGV0IGQ9byhpW2ZdLGFbZl0pO2lmKGQpcmV0dXJuIGR9cmV0dXJuIGkubGVuZ3RoPT09YS5sZW5ndGg/MDpvKGlbZl0/P2MsYVtmXT8/Yyl9O3JldHVybiFyLiNlW3RdJiYhbi4jZVt0XT8wOnIuI2VbdF0mJiFuLiNlW3RdP3Moci4jc1t0XSxbbF0pOiFyLiNlW3RdJiZuLiNlW3RdP3MoW2xdLG4uI3NbdF0pOnMoci4jc1t0XSxuLiNzW3RdKX1nZXQgcHJvdG9jb2woKXtyZXR1cm4gdGhpcy4jZS5wcm90b2NvbH1nZXQgdXNlcm5hbWUoKXtyZXR1cm4gdGhpcy4jZS51c2VybmFtZX1nZXQgcGFzc3dvcmQoKXtyZXR1cm4gdGhpcy4jZS5wYXNzd29yZH1nZXQgaG9zdG5hbWUoKXtyZXR1cm4gdGhpcy4jZS5ob3N0bmFtZX1nZXQgcG9ydCgpe3JldHVybiB0aGlzLiNlLnBvcnR9Z2V0IHBhdGhuYW1lKCl7cmV0dXJuIHRoaXMuI2UucGF0aG5hbWV9Z2V0IHNlYXJjaCgpe3JldHVybiB0aGlzLiNlLnNlYXJjaH1nZXQgaGFzaCgpe3JldHVybiB0aGlzLiNlLmhhc2h9Z2V0IGhhc1JlZ0V4cEdyb3Vwcygpe3JldHVybiB0aGlzLiNsfX07ZXhwb3J0e21lIGFzIFVSTFBhdHRlcm59O1xuIiwKICAgICJpbXBvcnQgeyBVUkxQYXR0ZXJuIH0gZnJvbSBcIi4vZGlzdC91cmxwYXR0ZXJuLmpzXCI7XG5cbmV4cG9ydCB7IFVSTFBhdHRlcm4gfTtcblxuaWYgKCFnbG9iYWxUaGlzLlVSTFBhdHRlcm4pIHtcbiAgZ2xvYmFsVGhpcy5VUkxQYXR0ZXJuID0gVVJMUGF0dGVybjtcbn1cbiIsCiAgICAiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnRUcmVlIH0gZnJvbSBcIi4uL2NsaWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZmxhdHRlbkNvbXBvbmVudFRyZWUgfSBmcm9tIFwiLi4vY2xpZW50L2hlbHBlcnMvZmxhdHRlbkNvbXBvbmVudFRyZWVcIjtcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gKCkge1xuICBjb25zdCB7IGFwcCB9ID0gYXdhaXQgaW1wb3J0KHBhdGgucmVzb2x2ZShcIi4vYXBwL2Jvb3RzdHJhcC50c1wiKSk7XG5cbiAgY29uc3QgZW50cmllcyA9IGFwcC5nZXRDb21wb25lbnRUcmVlKCk7XG5cbiAgZnVuY3Rpb24gZ2V0RW50cmllcyhjb21wb25lbnRUcmVlOiBDb21wb25lbnRUcmVlKSB7XG4gICAgY29uc3Qgb3V0OiBzdHJpbmdbXSA9IFtcIi9hcHAvY2xpZW50LnRzeFwiXTtcbiAgICBpZiAoIWNvbXBvbmVudFRyZWUpIHtcbiAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChmbGF0dGVuQ29tcG9uZW50VHJlZShjb21wb25lbnRUcmVlKSkpO1xuICB9XG5cbiAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgbmV3IFNldChbXG4gICAgICBcIi9hcHAvY2xpZW50LnRzeFwiLFxuICAgICAgLi4uZ2V0RW50cmllcyhlbnRyaWVzKS5tYXAoKGl0ZW0pID0+IGAvYXBwL3ZpZXdzLyR7aXRlbX0udHN4YCksXG4gICAgXSksXG4gICk7XG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ29tcG9uZW50VHJlZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlbkNvbXBvbmVudFRyZWUoY29tcG9uZW50VHJlZTogQ29tcG9uZW50VHJlZSk6IHN0cmluZ1tdIHtcbiAgbGV0IG91dDogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbcm9vdCwgYnJhbmNoZXNdIG9mIGNvbXBvbmVudFRyZWUpIHtcbiAgICBvdXQucHVzaChyb290LCAuLi5mbGF0dGVuQ29tcG9uZW50VHJlZShicmFuY2hlcykuZmxhdCgpKTtcbiAgfVxuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KG91dCkpO1xufVxuIiwKICAgICJpbXBvcnQgY29tbWFuZGVyIGZyb20gJy4vaW5kZXguanMnO1xuXG4vLyB3cmFwcGVyIHRvIHByb3ZpZGUgbmFtZWQgZXhwb3J0cyBmb3IgRVNNLlxuZXhwb3J0IGNvbnN0IHtcbiAgcHJvZ3JhbSxcbiAgY3JlYXRlQ29tbWFuZCxcbiAgY3JlYXRlQXJndW1lbnQsXG4gIGNyZWF0ZU9wdGlvbixcbiAgQ29tbWFuZGVyRXJyb3IsXG4gIEludmFsaWRBcmd1bWVudEVycm9yLFxuICBJbnZhbGlkT3B0aW9uQXJndW1lbnRFcnJvciwgLy8gZGVwcmVjYXRlZCBvbGQgbmFtZVxuICBDb21tYW5kLFxuICBBcmd1bWVudCxcbiAgT3B0aW9uLFxuICBIZWxwLFxufSA9IGNvbW1hbmRlcjtcbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdBLFdBQ1ksR0FBRztBQUNYLGFBQVMsd0JBQXdCLENBQUMsWUFBWSxNQUFNO0FBQ2xELGFBQU8sZUFBZSxVQUFVLFdBQVcsWUFBWTtBQUFBLFFBQ3JELGFBQWMsR0FBRztBQUNmLGVBQ0UsK0RBQ0EsS0FBSyxJQUNMLEtBQUssRUFDUDtB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QyxLQUFLLEtBQUssR0FBRztBQUFBLElBQzVCLFFBQVUsQ0FBQyxLQUFLLEdBQUcsR0FBRztBQUFBLElBQ3RCLGVBQWlCLENBQUMsS0FBSyxJQUFJLEdBQUc7QUFBQSxJQUM5QixLQUFPLENBQUMsS0FBSyxHQUFHLENBQUM7QUFBQSxJQUNqQixXQUFhLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUMzQixXQUFhLENBQUMsSUFBSSxLQUFLLEdBQUc7QUFBQSxJQUMxQixhQUFlLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFBQSxJQUMzQixRQUFVLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUN4QixZQUFjLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUMzQixVQUFZLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFBQSxJQUN4QixVQUFZLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUMxQixRQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFBQSxJQUN0QixRQUFVLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUN4QixTQUFXLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUN6QixXQUFhLENBQUMsS0FBSyxJQUFJLEdBQUc7QUFBQSxJQUMxQixXQUFhLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUMzQixXQUFhLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUMzQixNQUFRLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUN0QixhQUFlLENBQUMsR0FBRyxLQUFLLEdBQUc7QUFBQSxJQUMzQixXQUFhLENBQUMsSUFBSSxLQUFLLEdBQUc7QUFBQSxJQUMxQixLQUFPLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUNyQixNQUFRLENBQUMsR0FBRyxLQUFLLEdBQUc7QUFBQSxJQUNwQixTQUFXLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUN6QixRQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFBQSxJQUN0QixXQUFhLENBQUMsSUFBSSxLQUFLLEdBQUc7QUFBQSxJQUMxQixRQUFVLENB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QUFDLENBQUMsR0FBRSxJQUFFLE9BQUc7QUFBQyxNQUFJLElBQUUsQ0FBQyxHQUFFLElBQUU7QUFBRSxRQUFLLElBQUUsRUFBRSxVQUFRO0FBQUMsUUFBSSxJQUFFLEVBQUUsSUFBRyxZQUFVLENBQUMsR0FBRTtBQUFDLFdBQUk7QUFBRSxjQUFNLElBQUksVUFBVSxDQUFDO0FBQUUsUUFBRSxLQUFLLEVBQUMsTUFBSyxnQkFBZSxPQUFNLEdBQUUsT0FBTSxFQUFFLEtBQUksQ0FBQztBQUFBO0FBQUcsUUFBRyxNQUFJLEtBQUk7QUFBQyxRQUFFLEtBQUssRUFBQyxNQUFLLFlBQVcsT0FBTSxHQUFFLE9BQU0sRUFBRSxLQUFJLENBQUM7QUFBRTtBQUFBLElBQVE7QUFBQyxRQUFHLE1BQUksT0FBSyxNQUFJLEtBQUk7QUFBQyxRQUFFLEtBQUssRUFBQyxNQUFLLGtCQUFpQixPQUFNLEdBQUUsT0FBTSxFQUFFLEtBQUksQ0FBQztBQUFFO0FBQUEsSUFBUTtBQUFDLFFBQUcsTUFBSSxNQUFLO0FBQUMsUUFBRSxLQUFLLEVBQUMsTUFBSyxnQkFBZSxPQUFNLEtBQUksT0FBTSxFQUFFLEtBQUksQ0FBQztBQUFFO0FBQUEsSUFBUTtBQUFDLFFBQUcsTUFBSSxLQUFJO0FBQUMsUUFBRSxLQUFLLEVBQUMsTUFBSyxRQUFPLE9BQU0sR0FBRSxPQUFNLEVBQUUsS0FBSSxDQUFDO0FBQUU7QUFBQSxJQUFRO0FBQUMsUUFBRyxNQUFJLEtBQUk7QUFBQyxRQUFFLEtBQUssRUFBQyxNQUFLLFNBQVEsT0FBTSxHQUFFLE9BQU0sRUFBRSxLQUFJLENBQUM7QUFBRTtBQUFBLElBQVE7QUFBQyxRQUFHLE1BQUksS0FBSTtBQUFDLFVBQUksSUFBRSxJQUFHLElBQUUsSUFBRTtBQUFFLFlBQUssSUFBRSxFQUFFLFVBQVE7QUFBQyxZQUFJLElBQUUsRUFBRSxPQUFPLEdBQUUsQ0FBQztBQUFFLFlBQUcsTUFBSSxJQUFFLEtBQUcsR0FBRyxLQUFLLENBQUMsS0FBRyxNQUFJLElBQUUsS0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFFO0FB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RSxNQUFJO0FBQUMsUUFBSSxJQUFFO0FBQUUsWUFBTztBQUFBLFdBQU87QUFBSSxZQUFFO0FBQUU7QUFBQSxXQUFVO0FBQUksWUFBRTtBQUFFO0FBQUEsV0FBVTtBQUFJLFlBQUU7QUFBRTtBQUFBO0FBQU0sU0FBSSxNQUFJLEtBQUcsTUFBSSxHQUFFO0FBQUMsUUFBRSxDQUFDO0FBQUU7QUFBQSxJQUFNO0FBQUMsUUFBRyxFQUFFLElBQUcsTUFBSSxHQUFFO0FBQUMsV0FBSTtBQUFFO0FBQU8sUUFBRSxLQUFLLElBQUksRUFBRSxHQUFFLElBQUcsSUFBRyxFQUFFLENBQUMsR0FBRSxJQUFHLENBQUMsQ0FBQztBQUFFO0FBQUEsSUFBTTtBQUFDLFFBQUk7QUFBRSxRQUFFLE1BQUksTUFBSSxJQUFFLElBQUUsSUFBRSxJQUFFLElBQUU7QUFBRSxRQUFJLElBQUU7QUFBRSxVQUFJLEtBQUcsSUFBRSxHQUFFLElBQUUsTUFBSSxNQUFJLE1BQUksSUFBRSxHQUFFLElBQUU7QUFBSSxRQUFJO0FBQUUsUUFBRyxJQUFFLElBQUUsSUFBRSxNQUFJLElBQUUsTUFBSyxFQUFFLElBQUksQ0FBQztBQUFFLFlBQU0sSUFBSSxVQUFVLG1CQUFtQixLQUFLO0FBQUUsTUFBRSxJQUFJLENBQUMsR0FBRSxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUUsR0FBRSxFQUFFLENBQUMsR0FBRSxHQUFFLEVBQUUsQ0FBQyxHQUFFLENBQUMsQ0FBQztBQUFBO0FBQUcsUUFBSyxJQUFFLEVBQUUsVUFBUTtBQUFDLFFBQUksSUFBRSxFQUFFLE1BQU0sR0FBRSxJQUFFLEVBQUUsTUFBTSxHQUFFLElBQUUsRUFBRSxPQUFPO0FBQUUsU0FBSSxNQUFJLE1BQUksSUFBRSxFQUFFLFVBQVUsSUFBRyxLQUFHLEdBQUU7QUFBQyxVQUFJLElBQUUsS0FBRztBQUFHLFFBQUUsU0FBUyxRQUFRLENBQUMsT0FBSSxNQUFLLEVBQUUsQ0FBQyxHQUFFLElBQUUsS0FBSSxFQUFFO0FBQUUsVUFBSSxJQUFFLEVBQUU7QUFBRSxRQUFFLEdBQUUsR0FBRSxHQUFFLElBQUcsQ0FBQztBQUFFO0FBQUEsSUFBUTtBQUFDLFFBQUksSUFBRSxLQUFHLEVBQUUsY0FBYztBQUFFLFFBQUcsR0FBRTtBQUFDLFFBQUUsQ0FBQztBQUFFO0FBQUEsSUFBUTtBQUFDLFFBQUcsRUFBRSxNQUFNLEdBQUU7QUFBQyxVQUFJLElBQUUsRUFBRSxHQUFFLElBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxFQUFFLE9BQU87QUFBRSxPQUFDLE1BQUksTUFBSSxJQUFFLEVBQUUsVUFBVTtBQUFHLFVBQUksSUFBRSxFQUFFO0FBQUUsUUFBRSxPQUFPO0FBQUUsVUFBSSxLQUFHLEVBQUU7QUFBRSxRQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsRUFBRTtBQUFFO0FBQUEsSUFBUTtBQUFDLE1BQUUsR0FBRSxFQUFFLEtBQUs7QUFBQSxFQUFDO0FBQUMsU0FBTztBQUFBO0FBQUUsSUFBUyxZQUFDLENBQUMsR0FBRTtBQUFDLFNBQU8sRUFBRSxRQUFRLDBCQUF5QixNQUFNO0FBQUE7QUFBRSxJQUFTLFlBQUMsQ0FBQyxHQUFFO0FBQUMsU0FBTyxLQUFHLEVBQUUsYUFBVyxPQUFLO0FBQUE7QUFBSSxJQUFTLFlBQUMsQ0FBQyxHQUFFLEdBQUUsR0FBRTtBQUFDLFNBQU8sRUFBRSxFQUFFLEdBQUUsQ0FBQyxHQUFFLEdBQUUsQ0FBQztBQUFBO0FBQUUsSUFBUyxZQUFDLENBQUMsR0FBRTtBQUFDLFVBQU87QUFBQSxTQUFRO0FBQUUsYUFBTTtBQUFBLFNBQVM7QUFBRSxhQUFNO0FBQUEsU0FBUztBQUFFLGFBQU07QUFBQSxTQUFTO0FBQUUsYUFBTTtBQUFBO0FBQUE7QUFBSSxJQUFTLFlBQUMsQ0FBQyxHQUFFLEdBQUUsSUFBRSxDQUFDLEdBQUU7QUFBQyxJQUFFLGNBQVksT0FBTSxFQUFFLGFBQVcsTUFBSyxFQUFFLGNBQVksT0FBRyxFQUFFLFdBQVMsT0FBRyxFQUFFLFFBQU0sTUFBRyxFQUFFLFVBQVEsTUFBRyxFQUFFLFdBQVM7QUFBRyxNQUFJLElBQUUsRUFBRSxRQUFNLE1BQUk7QUFBRyxXQUFRLEtBQUssR0FBRTtBQUFDLFFBQUcsRUFBRSxTQUFPLEdBQUU7QUFBQyxRQUFFLGFBQVcsSUFBRSxLQUFHLEVBQUUsRUFBRSxLQUFLLElBQUUsS0FBRyxNQUFNLEVBQUUsRUFBRSxLQUFLLEtBQUssRUFBRSxFQUFFLFFBQVE7QUFBSTtBQUFBLElBQVE7QUFBQyxTQUFHLEVBQUUsS0FBSyxFQUFFLElBQUk7QUFBRSxRQUFJLElBQUUsS0FBSyxFQUFFLEVBQUUsU0FBUyxRQUFPLElBQUUsRUFBRTtBQUFNLFFBQUcsRUFBRSxTQUFPLElBQUUsSUFBRSxJQUFFLEVBQUUsU0FBTyxNQUFJLElBQUUsS0FBSSxFQUFFLE9BQU8sV0FBUyxFQUFFLE9BQU8sUUFBTztBQUFDLFFBQUUsYUFBVyxLQUFHLEVBQUUsYUFBVyxJQUFFLEtBQUcsSUFBSSxLQUFLLEVBQUUsRUFBRSxRQUFRLE1BQUksS0FBRyxPQUFPLEtBQUssRUFBRSxFQUFFLFFBQVE7QUFBSztBQUFBLElBQVE7QUFBQyxRQUFHLEVBQUUsYUFBVyxLQUFHLEVBQUUsYUFBVyxHQUFFO0FBQUMsV0FBRyxNQUFNLEVBQUUsRUFBRSxNQUFNLEtBQUssS0FBSyxFQUFFLEVBQUUsTUFBTSxNQUFLLEtBQUcsRUFBRSxFQUFFLFFBQVE7QUFBRTtBQUFBLElBQVE7QUFBQyxTQUFHLE1BQU0sRUFBRSxFQUFFLE1BQU0sS0FBSSxLQUFHLE9BQU8sU0FBUSxLQUFHLEVBQUUsRUFBRSxNQUFNLEdBQUUsS0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFFLEtBQUcsTUFBTSxRQUFRLEVBQUUsRUFBRSxNQUFNLE1BQUssRUFBRSxhQUFXLE1BQUksS0FBRztBQUFBLEVBQUk7QUFBQyxNQUFJLElBQUUsSUFBSSxFQUFFLEVBQUUsUUFBUSxTQUFPLElBQUUsSUFBSSxFQUFFLEVBQUUsU0FBUztBQUFLLE1BQUcsRUFBRTtBQUFJLFdBQU8sRUFBRSxXQUFTLEtBQUcsR0FBRyxPQUFNLEVBQUUsU0FBUyxTQUFPLEtBQUcsTUFBTSxPQUFLLEtBQUcsS0FBSSxJQUFJLE9BQU8sR0FBRSxFQUFFLENBQUMsQ0FBQztBQUFFLElBQUUsV0FBUyxLQUFHLE1BQU0sT0FBTztBQUFRLE1BQUksSUFBRTtBQUFHLE1BQUcsRUFBRSxRQUFPO0FBQUMsUUFBSSxJQUFFLEVBQUUsRUFBRSxTQUFPO0FBQUcsTUFBRSxTQUFPLEtBQUcsRUFBRSxhQUFXLE1BQUksSUFBRSxFQUFFLFVBQVUsUUFBUSxDQUFDLEtBQUU7QUFBQSxFQUFHO0FBQUMsU0FBTyxNQUFJLEtBQUcsTUFBTSxLQUFLLE9BQU0sSUFBSSxPQUFPLEdBQUUsRUFBRSxDQUFDLENBQUM7QUFBQTtBQUFxSyxJQUFTLFlBQUMsQ0FBQyxHQUFFLEdBQUU7QUFBQyxTQUFPLEVBQUUsU0FBTyxFQUFFLE9BQUssTUFBSSxRQUFJLEtBQUcsRUFBRSxTQUFPLElBQUUsU0FBSSxFQUFFLE1BQUksUUFBTSxFQUFFLE1BQUksUUFBTSxFQUFFLE1BQUksTUFBSTtBQUFBO0FBQUcsSUFBUyxZQUFDLENBQUMsR0FBRSxHQUFFO0FBQUMsU0FBTyxFQUFFLFdBQVcsQ0FBQyxJQUFFLEVBQUUsVUFBVSxFQUFFLFFBQU8sRUFBRSxNQUFNLElBQUU7QUFBQTtBQUFFLElBQVMsYUFBRSxDQUFDLEdBQUUsR0FBRTtBQUFDLFNBQU8sRUFBRSxTQUFTLENBQUMsSUFBRSxFQUFFLE9BQU8sR0FBRSxFQUFFLFNBQU8sRUFBRSxNQUFNLElBQUU7QUFBQTtBQUFFLElBQVMsWUFBQyxDQUFDLEdBQUU7QUFBQyxVQUFPLEtBQUcsRUFBRSxTQUFPLElBQUUsUUFBRyxFQUFFLE9BQUssUUFBTSxFQUFFLE9BQUssUUFBTSxFQUFFLE9BQUssUUFBTSxFQUFFLE9BQUs7QUFBQTtBQUFvRCxJQUFTLFlBQUMsQ0FBQyxHQUFFO0FBQUMsT0FBSTtBQUFFLFdBQU07QUFBRyxXQUFRLEtBQUs7QUFBRyxRQUFHLEVBQUUsS0FBSyxDQUFDO0FBQUUsYUFBTTtBQUFHLFNBQU07QUFBQTtBQUFHLElBQVMsYUFBRSxDQUFDLEdBQUUsR0FBRTtBQUFDLE1BQUcsSUFBRSxFQUFFLEdBQUUsR0FBRyxHQUFFLEtBQUcsTUFBSTtBQUFHLFdBQU87QUFBRSxNQUFJLElBQUUsSUFBSSxJQUFJLHFCQUFxQjtBQUFFLFNBQU8sRUFBRSxPQUFLLEdBQUUsRUFBRSxPQUFLLEVBQUUsS0FBSyxVQUFVLEdBQUUsRUFBRSxLQUFLLE1BQU0sSUFBRTtBQUFBO0FBQUcsSUFBUyxhQUFFLENBQUMsR0FBRSxHQUFFO0FBQUMsTUFBRyxJQUFFLEVBQUUsR0FBRSxHQUFHLEdBQUUsS0FBRyxNQUFJO0FBQUcsV0FBTztBQUFFLE1BQUksSUFBRSxJQUFJLElBQUkscUJBQXFCO0FBQUUsU0FBTyxFQUFFLFNBQU8sR0FBRSxFQUFFLFNBQU8sRUFBRSxPQUFPLFVBQVUsR0FBRSxFQUFFLE9BQU8sTUFBTSxJQUFFO0FBQUE7QUFBRyxJQUFTLGFBQUUsQ0FBQyxHQUFFLEdBQUU7QUFBQyxTQUFPLEtBQUcsTUFBSSxLQUFHLElBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDLElBQUUsRUFBRSxDQUFDO0FBQUE7QUFBRSxJQUFTLGFBQUUsQ0FBQyxHQUFFLEdBQUU7QUFBQyxNQUFHLEtBQUcsTUFBSTtBQUFHLFdBQU87QUFBRSxNQUFJLElBQUUsSUFBSSxJQUFJLHFCQUFxQjtBQUFFLFNBQU8sRUFBRSxXQUFTLEdBQUUsRUFBRTtBQUFBO0FBQVMsSUFBUyxhQUFFLENBQUMsR0FBRSxHQUFFO0FBQUMsTUFBRyxLQUFHLE1BQUk7QUFBRyxXQUFPO0FBQUUsTUFBSSxJQUFFLElBQUksSUFBSSxxQkFBcUI7QUFBRSxTQUFPLEVBQUUsV0FBUyxHQUFFLEVBQUU7QUFBQTtBQUFTLElBQVMsYUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFO0FBQUMsTUFBRyxLQUFHLE1BQUk7QUFBRyxXQUFPO0FBQUUsTUFBRyxNQUFJLEdBQUcsU0FBUyxDQUFDO0FBQUUsV0FBTyxJQUFJLElBQUksR0FBRyxLQUFLLEdBQUcsRUFBRTtBQUFTLE1BQUksSUFBRSxFQUFFLE1BQUk7QUFBSSxTQUFPLElBQUUsSUFBSSxJQUFJLElBQUUsSUFBRSxPQUFLLEdBQUUscUJBQXFCLEVB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QVMsTUFBSSxFQUFFLFNBQVMsU0FBUyxFQUFFLE1BQU0sSUFBRyxJQUFFLElBQUUsSUFBRSxFQUFFLElBQUUsS0FBRyxNQUFLLElBQUUsSUFBRSxFQUFFLFNBQU8sSUFBRSxFQUFFLElBQUUsS0FBRztBQUFLLFNBQUksS0FBRyxLQUFHLEVBQUUsU0FBTyxLQUFHLEVBQUUsYUFBVyxLQUFHLE1BQUksRUFBRSxPQUFPLFdBQVMsRUFBRSxPQUFPO0FBQU8sVUFBRyxFQUFFLFNBQU8sR0FBRTtBQUFDLFlBQUksSUFBRSxFQUFFLE1BQU0sU0FBTyxJQUFFLEVBQUUsTUFBTSxLQUFHO0FBQUcsWUFBRSxFQUFFLEtBQUssQ0FBQztBQUFBLE1BQUM7QUFBTSxhQUFHLEVBQUUsY0FBYztBQUFFLFNBQUksTUFBSSxFQUFFLE9BQU8sVUFBUSxLQUFHLEVBQUUsU0FBTyxHQUFFO0FBQUMsVUFBSSxJQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBTztBQUFHLFVBQUUsRUFBRSxTQUFTLFNBQVMsQ0FBQztBQUFBLElBQUM7QUFBQyxVQUFJLEtBQUcsTUFBSyxLQUFHLEVBQUUsRUFBRSxNQUFNLEdBQUUsTUFBSSxLQUFHLElBQUksRUFBRSxTQUFRLEVBQUUsU0FBTyxJQUFFLEtBQUcsSUFBSSxFQUFFLFdBQVMsRUFBRSxTQUFPLElBQUUsTUFBSSxLQUFHLElBQUksUUFBTSxFQUFFLFNBQU8sT0FBSyxPQUFLLEtBQUcsRUFBRSxTQUFPLEtBQUcsRUFBRSxhQUFXLEtBQUcsS0FBRyxFQUFFLFdBQVMsTUFBSSxLQUFHLE1BQUksS0FBRyxJQUFJLE9BQU0sRUFBRSxTQUFPLEtBQUcsS0FBRyxFQUFFLE9BQU8sVUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBSSxLQUFHLE9BQU0sS0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFFLE1BQUksS0FBRyxNQUFLLEVBQUUsYUFBVyxNQUFJLEtBQUcsRUFBRSxFQUFFLFFBQVE7QUFBQSxFQUFFO0FBQUMsU0FBTztBQUFBO0FBQXp5YSxJQUFJLElBQUUsTUFBSztBQUFBLEVBQUMsT0FBSztBQUFBLEVBQUUsT0FBSztBQUFBLEVBQUcsU0FBTztBQUFBLEVBQUcsUUFBTTtBQUFBLEVBQUcsU0FBTztBQUFBLEVBQUcsV0FBUztBQUFBLEVBQUUsV0FBVyxDQUFDLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFO0FBQUMsU0FBSyxPQUFLLEdBQUUsS0FBSyxPQUFLLEdBQUUsS0FBSyxTQUFPLEdBQUUsS0FBSyxRQUFNLEdBQUUsS0FBSyxTQUFPLEdBQUUsS0FBSyxXQUFTO0FBQUE7QUFBQSxFQUFFLGFBQWEsR0FBRTtBQUFDLFdBQU8sS0FBSyxTQUFPLGFBQVcsS0FBSyxRQUFNO0FBQUE7QUFBUztBQUEvTyxJQUFpUCxLQUFHO0FBQXBQLElBQXdRLEtBQUc7QUFBM1EsSUFBOFMsSUFBRTtBQUFtOEgsSUFBSSxJQUFFLEVBQUMsV0FBVSxJQUFHLFVBQVMsSUFBRyxXQUFVLE1BQUcsUUFBTyxLQUFFO0FBQXRELElBQXdELElBQUUsRUFBQyxXQUFVLEtBQUksVUFBUyxJQUFHLFdBQVUsTUFBRyxRQUFPLEtBQUU7QUFBM0csSUFBNkcsSUFBRSxFQUFDLFdBQVUsS0FBSSxVQUFTLEtBQUksV0FBVSxNQUFHLFFBQU8sS0FBRTtBQUE4VSxJQUFJLEtBQUcsQ0FBQyxPQUFNLFFBQU8sUUFBTyxTQUFRLE1BQUssS0FBSztBQUF1ekUsSUFBSSxJQUFFLE1BQUs7QUFBQSxFQUFDO0FBQUEsRUFBRyxLQUFHLENBQUM7QUFBQSxFQUFFLEtBQUcsQ0FBQztBQUFBLEVBQUUsS0FBRztBQUFBLEVBQUUsS0FBRztBQUFBLEVBQUUsS0FBRztBQUFBLEVBQUUsS0FBRztBQUFBLEVBQUUsS0FBRztBQUFBLEVBQUUsS0FBRztBQUFBLEVBQUUsS0FBRztBQUFBLEVBQUcsV0FBVyxDQUFDLEdBQUU7QUFBQyxTQUFLLEtBQUc7QUFBQTtBQUFBLE1BQU0sTUFBTSxHQUFFO0FBQUMsV0FBTyxLQUFLO0FBQUE7QUFBQSxFQUFHLEtBQUssR0FBRTtBQUFDLFNBQUksS0FBSyxLQUFHLEVBQUUsS0FBSyxJQUFHLElBQUUsRUFBRSxLQUFLLEtBQUcsS0FBSyxHQUFHLFFBQU8sS0FBSyxNQUFJLEtBQUssSUFBRztBQUFDLFVBQUcsS0FBSyxLQUFHLEdBQUUsS0FBSyxHQUFHLEtBQUssSUFBSSxTQUFPLE9BQU07QUFBQyxZQUFHLEtBQUssT0FBSyxHQUFFO0FBQUMsZUFBSyxHQUFHLEdBQUUsS0FBSyxHQUFHLElBQUUsS0FBSyxHQUFHLEdBQUUsQ0FBQyxJQUFFLEtBQUssR0FBRyxJQUFFLEtBQUssR0FBRyxHQUFFLENBQUMsSUFBRSxLQUFLLEdBQUcsR0FBRSxDQUFDO0FBQUU7QUFBQSxRQUFRLFdBQVMsS0FBSyxPQUFLLEdBQUU7QUFBQyxlQUFLLEdBQUcsQ0FBQztBQUFFO0FBQUEsUUFBUTtBQUFDLGFBQUssR0FBRyxJQUFHLENBQUM7QUFBRTtBQUFBLE1BQUs7QUFBQyxVQUFHLEtBQUssS0FBRztBQUFFLFlBQUcsS0FBSyxHQUFHO0FBQUUsZUFBSyxNQUFJO0FBQUE7QUFBTztBQUFTLFVBQUcsS0FBSyxHQUFHLEdBQUU7QUFBQyxhQUFLLE1BQUk7QUFBRTtBQUFBLE1BQVE7QUFBQyxjQUFPLEtBQUs7QUFBQSxhQUFTO0FBQUUsZUFBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLENBQUM7QUFBRTtBQUFBLGFBQVc7QUFBRSxjQUFHLEtBQUssR0FBRyxHQUFFO0FBQUMsaUJBQUssR0FBRztBQUFFLGdCQUFJLElBQUUsR0FBRSxJQUFFO0FBQUUsaUJBQUssR0FBRyxLQUFHLElBQUUsR0FBRSxJQUFFLEtBQUcsS0FBSyxPQUFLLElBQUUsSUFBRyxLQUFLLEdBQUcsR0FBRSxDQUFDO0FBQUEsVUFBQztBQUFDO0FBQUEsYUFBVztBQUFFLGVBQUssR0FBRyxJQUFFLEtBQUssR0FBRyxDQUFDLEtBQUcsS0FBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLE1BQUksS0FBSyxHQUFHLENBQUM7QUFBRTtBQUFBLGFBQVc7QUFBRSxlQUFLLEdBQUcsSUFBRSxLQUFLLEdBQUcsR0FBRSxDQUFDLElBQUUsS0FBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLEdBQUUsQ0FBQztBQUFFO0FBQUEsYUFBVztBQUFFLGVBQUssR0FBRyxLQUFHLEtBQUssR0FBRyxHQUFFLENBQUM7QUFBRTtBQUFBLGFBQVc7QUFBRSxlQUFLLEdBQUcsSUFBRSxLQUFLLE1BQUksSUFBRSxLQUFLLEdBQUcsTUFBSSxLQUFLLE1BQUksSUFBRyxLQUFLLEdBQUcsTUFBSSxLQUFLLEtBQUcsS0FBSyxHQUFHLEdBQUUsQ0FBQyxJQUFFLEtBQUssR0FBRyxJQUFFLEtBQUssR0FBRyxHQUFFLENBQUMsSUFBRSxLQUFLLEdBQUcsSUFBRSxLQUFLLEdBQUcsR0FBRSxDQUFDLElBQUUsS0FBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLEdBQUUsQ0FBQztBQUFFO0FBQUEsYUFBVztBQUFFLGVBQUssR0FBRyxJQUFFLEtBQUssR0FBRyxHQUFFLENBQUMsSUFBRSxLQUFLLEdBQUcsSUFBRSxLQUFLLEdBQUcsR0FBRSxDQUFDLElBQUUsS0FBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLEdBQUUsQ0FBQztBQUFFO0FBQUEsYUFBVztBQUFFLGVBQUssR0FBRyxJQUFFLEtBQUssR0FBRyxHQUFFLENBQUMsSUFBRSxLQUFLLEdBQUcsS0FBRyxLQUFLLEdBQUcsR0FBRSxDQUFDO0FBQUU7QUFBQSxhQUFXO0FBQUUsZUFBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLEdBQUUsQ0FBQztBQUFFO0FBQUEsYUFBVztBQUFFO0FBQUEsYUFBVztBQUFHO0FBQUE7QUFBQSxJQUFNO0FBQUMsU0FBSyxHQUFHLGFBQWdCLGFBQUcsS0FBSyxHQUFHLFNBQVksY0FBSSxLQUFLLEdBQUcsT0FBSztBQUFBO0FBQUEsRUFBSSxFQUFFLENBQUMsR0FBRSxHQUFFO0FBQUMsWUFBTyxLQUFLO0FBQUEsV0FBUztBQUFFO0FBQUEsV0FBVztBQUFFLGFBQUssR0FBRyxXQUFTLEtBQUssR0FBRztBQUFFO0FBQUEsV0FBVztBQUFFO0FBQUEsV0FBVztBQUFFLGFBQUssR0FBRyxXQUFTLEtBQUssR0FBRztBQUFFO0FBQUEsV0FBVztBQUFFLGFBQUssR0FBRyxXQUFTLEtBQUssR0FBRztBQUFFO0FBQUEsV0FBVztBQUFFLGFBQUssR0FBRyxXQUFTLEtBQUssR0FBRztBQUFFO0FBQUEsV0FBVztBQUFFLGFBQUssR0FBRyxPQUFLLEtBQUssR0FBRztBQUFFO0FBQUEsV0FBVztBQUFFLGFBQUssR0FBRyxXQUFTLEtBQUssR0FBRztBQUFFO0FBQUEsV0FBVztBQUFFLGFBQUssR0FBRyxTQUFPLEtBQUssR0FBRztBQUFFO0FBQUEsV0FBVztBQUFFLGFBQUssR0FBRyxPQUFLLEtBQUssR0FBRztBQUFFO0FBQUEsV0FBVztBQUFHO0FBQUE7QUFBTSxTQUFLLE9BQUssS0FBRyxNQUFJLE9BQUssQ0FBQyxHQUFFLEdBQUUsR0FBRSxDQUFDLEVBQUUsU0FBUyxLQUFLLEVBQUUsS0FBRyxDQUFDLEdBQUUsR0FBRSxHQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBSSxLQUFLLEdBQUcsYUFBVyxLQUFJLENBQUMsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUMsRUFBRSxTQUFTLEtBQUssRUFBRSxLQUFHLENBQUMsR0FBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQUksS0FBSyxHQUFHLGFBQVcsS0FBSyxLQUFHLE1BQUksS0FBSSxDQUFDLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLENBQUMsRUFBRSxTQUFTLEtBQUssRUFBRSxLQUFHLE1BQUksTUFBSSxLQUFLLEdBQUcsV0FBUyxNQUFLLEtBQUssR0FBRyxHQUFFLENBQUM7QUFBQTtBQUFBLEVBQUUsRUFBRSxDQUFDLEdBQUUsR0FBRTtBQUFDLFNBQUssS0FBRyxHQUFFLEtBQUssS0FBRyxLQUFLLEtBQUcsR0FBRSxLQUFLLE1BQUksR0FBRSxLQUFLLEtBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsU0FBSyxLQUFHLEtBQUssSUFBRyxLQUFLLEtBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxDQUFDLEdBQUU7QUFBQyxTQUFLLEdBQUcsR0FBRSxLQUFLLEtBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxDQUFDLEdBQUU7QUFBQyxXQUFPLElBQUUsTUFBSSxJQUFFLEtBQUssR0FBRyxTQUFPLElBQUcsSUFBRSxLQUFLLEdBQUcsU0FBTyxLQUFLLEdBQUcsS0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLFNBQU87QUFBQTtBQUFBLEVBQUcsRUFBRSxDQUFDLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxLQUFLLEdBQUcsQ0FBQztBQUFFLFdBQU8sRUFBRSxVQUFRLE1BQUksRUFBRSxTQUFPLFVBQVEsRUFBRSxTQUFPLGtCQUFnQixFQUFFLFNBQU87QUFBQTtBQUFBLEVBQWdCLEVBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxHQUFHLEtBQUssSUFBRyxHQUFHO0FBQUE7QUFBQSxFQUFFLEVBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxHQUFHLEtBQUssS0FBRyxHQUFFLEdBQUcsS0FBRyxLQUFLLEdBQUcsS0FBSyxLQUFHLEdBQUUsR0FBRztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssR0FBRyxLQUFLLElBQUcsR0FBRztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssR0FBRyxLQUFLLElBQUcsR0FBRztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssR0FBRyxLQUFLLElBQUcsR0FBRztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssR0FBRyxLQUFLLElBQUcsR0FBRztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUU7QUFBQyxRQUFHLEtBQUssR0FBRyxLQUFLLElBQUcsR0FBRztBQUFFLGFBQU07QUFBRyxRQUFHLEtBQUssR0FBRyxLQUFLLElBQUksVUFBUTtBQUFJLGFBQU07QUFBRyxRQUFJLElBQUUsS0FBSyxHQUFHLEtBQUssS0FBRyxDQUFDO0FBQUUsV0FBTyxFQUFFLFNBQU8sVUFBUSxFQUFFLFNBQU8sV0FBUyxFQUFFLFNBQU8sV0FBUyxFQUFFLFNBQU87QUFBQTtBQUFBLEVBQVcsRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFHLEdBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFJLFFBQU07QUFBQTtBQUFBLEVBQU8sRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFJLFFBQU07QUFBQTtBQUFBLEVBQVEsRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFHLEdBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFHLEdBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsUUFBSSxJQUFFLEtBQUssR0FBRyxLQUFLLEtBQUksSUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLEVBQUU7QUFBTSxXQUFPLEtBQUssR0FBRyxVQUFVLEdBQUUsRUFBRSxLQUFLO0FBQUE7QUFBQSxFQUFFLEVBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxDQUFDO0FBQUUsV0FBTyxPQUFPLEdBQUUsQ0FBQyxHQUFFLEVBQUUsYUFBVztBQUFFLFFBQUksSUFBRSxFQUFFLEtBQUssR0FBRyxHQUFPLFdBQUUsQ0FBQztBQUFFLFNBQUssS0FBRyxFQUFFLENBQUM7QUFBQTtBQUFFO0FBQUUsSUFBSSxJQUFFLENBQUMsWUFBVyxZQUFXLFlBQVcsWUFBVyxRQUFPLFlBQVcsVUFBUyxNQUFNO0FBQXBGLElBQXNGLElBQUU7QUFBcXZHLElBQUksS0FBRyxNQUFLO0FBQUEsRUFBQztBQUFBLEVBQUcsS0FBRyxDQUFDO0FBQUEsRUFBRSxLQUFHLENBQUM7QUFBQSxFQUFFLEtBQUcsQ0FBQztBQUFBLEVBQUUsS0FBRyxDQUFDO0FBQUEsRUFBRSxLQUFHO0FBQUEsRUFBRyxXQUFXLENBQUMsSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFO0FBQUMsUUFBRztBQUFDLFVBQUk7QUFBRSxpQkFBVSxLQUFHLFdBQVMsSUFBRSxJQUFFLElBQUUsVUFBUyxLQUFHLFVBQVM7QUFB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LEVBQUUsR0FBRSxHQUFFLEtBQUUsSUFBRSxJQUFFLEVBQUUsR0FBRSxHQUFHLEdBQUUsQ0FBQyxHQUFFLEtBQUU7QUFBQSxZQUFFO0FBQU0sYUFBTTtBQUFBO0FBQUcsUUFBSTtBQUFFLFNBQUksS0FBSztBQUFFLFdBQUksS0FBSyxHQUFHLEdBQUcsS0FBSyxFQUFFLEVBQUU7QUFBRSxlQUFNO0FBQUcsV0FBTTtBQUFBO0FBQUEsRUFBRyxJQUFJLENBQUMsSUFBRSxDQUFDLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxFQUFDLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxNQUFLLEdBQUU7QUFBRSxlQUFVLEtBQUcsWUFBVTtBQUFFLFlBQU0sSUFBSSxVQUFVLHNDQUFzQztBQUFFLGVBQVUsSUFBRTtBQUFJO0FBQU8sUUFBRztBQUFDLGFBQU8sS0FBRyxXQUFTLElBQUUsRUFBRSxHQUFFLEdBQUUsS0FBRSxJQUFFLElBQUUsRUFBRSxHQUFFLEdBQUcsR0FBRSxDQUFDLEdBQUUsS0FBRTtBQUFBLFlBQUU7QUFBTSxhQUFPO0FBQUE7QUFBSyxRQUFJLElBQUUsQ0FBQztBQUFFLFFBQUUsRUFBRSxTQUFPLENBQUMsR0FBRSxDQUFDLElBQUUsRUFBRSxTQUFPLENBQUMsQ0FBQztBQUFFLFFBQUk7QUFBRSxTQUFJLEtBQUssR0FBRTtBQUFDLFVBQUksSUFBRSxLQUFLLEdBQUcsR0FBRyxLQUFLLEVBQUUsRUFBRTtBQUFFLFdBQUk7QUFBRSxlQUFPO0FBQUssVUFBSSxJQUFFLENBQUM7QUFBRSxnQkFBUSxHQUFFLE1BQUssS0FBSyxHQUFHLEdBQUcsUUFBUTtBQUFFLG1CQUFVLEtBQUcsbUJBQWlCLEtBQUcsVUFBUztBQUFDLGNBQUksSUFBRSxFQUFFLElBQUU7QUFBRyxZQUFFLEtBQUc7QUFBQSxRQUFDO0FBQUMsUUFBRSxLQUFHLEVBQUMsT0FBTSxFQUFFLE1BQUksSUFBRyxRQUFPLEVBQUM7QUFBQSxJQUFDO0FBQUMsV0FBTztBQUFBO0FBQUEsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxDQUFDLEdBQUUsTUFBSTtBQUFDLGVBQVEsS0FBSSxDQUFDLFFBQU8sWUFBVyxVQUFTLFNBQVEsUUFBUSxHQUFFO0FBQUMsWUFBRyxFQUFFLEtBQUcsRUFBRTtBQUFHLGtCQUFNO0FBQUcsWUFBRyxFQUFFLE9BQUssRUFBRTtBQUFHO0FBQVMsZUFBTztBQUFBLE1BQUM7QUFBQyxhQUFPO0FBQUEsT0FBRyxJQUFFLElBQUksRUFBRSxHQUFFLElBQUcsSUFBRyxJQUFHLElBQUcsQ0FBQyxHQUFFLElBQUUsSUFBSSxFQUFFLEdBQUUsSUFBRyxJQUFHLElBQUcsSUFBRyxDQUFDLEdBQUUsSUFBRSxDQUFDLEdBQUUsTUFBSTtBQUFDLFVBQUksSUFBRTtBQUFFLFlBQUssSUFBRSxLQUFLLElBQUksRUFBRSxRQUFPLEVBQUUsTUFBTSxLQUFJLEdBQUU7QUFBQyxZQUFJLElBQUUsRUFBRSxFQUFFLElBQUcsRUFBRSxFQUFFO0FBQUUsWUFBRztBQUFFLGlCQUFPO0FBQUEsTUFBQztBQUFDLGFBQU8sRUFBRSxXQUFTLEVBQUUsU0FBTyxJQUFFLEVBQUUsRUFBRSxNQUFJLEdBQUUsRUFBRSxNQUFJLENBQUM7QUFBQTtBQUFHLFlBQU8sRUFBRSxHQUFHLE9BQUssRUFBRSxHQUFHLEtBQUcsSUFBRSxFQUFFLEdBQUcsT0FBSyxFQUFFLEdBQUcsS0FBRyxFQUFFLEVBQUUsR0FBRyxJQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUcsRUFBRSxHQUFHLE1BQUksRUFBRSxHQUFHLEtBQUcsRUFBRSxDQUFDLENBQUMsR0FBRSxFQUFFLEdBQUcsRUFBRSxJQUFFLEVBQUUsRUFBRSxHQUFHLElBQUcsRUFBRSxHQUFHLEVBQUU7QUFBQTtBQUFBLE1BQU0sUUFBUSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUc7QUFBQTtBQUFBLE1BQWEsUUFBUSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUc7QUFBQTtBQUFBLE1BQWEsUUFBUSxHQUFF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
10248
+ //# debugId=D1A61B506EA0D88264756e2164756e21
10249
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC5kZXZlbG9wbWVudC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvcmVhY3QvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3JlYWN0L2pzeC1kZXYtcnVudGltZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2lzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2RlYnVnLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2NvbnN0YW50cy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9yZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbm9kZV9tb2R1bGVzL3NlbXZlci9pbnRlcm5hbC9wYXJzZS1vcHRpb25zLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2ludGVybmFsL2lkZW50aWZpZXJzLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2NsYXNzZXMvc2VtdmVyLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9wYXJzZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvY29lcmNlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jb21wYXJlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9ndGUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvaW50ZXJuYWwvbHJ1Y2FjaGUuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2VxLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9uZXEuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL2d0LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9sdC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbm9kZV9tb2R1bGVzL3NlbXZlci9mdW5jdGlvbnMvbHRlLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2Z1bmN0aW9ucy9jbXAuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvY2xhc3Nlcy9jb21wYXJhdG9yLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9ub2RlX21vZHVsZXMvc2VtdmVyL2NsYXNzZXMvcmFuZ2UuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL25vZGVfbW9kdWxlcy9zZW12ZXIvZnVuY3Rpb25zL3NhdGlzZmllcy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2xpYnZpcHMuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL2xpYi9zaGFycC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2NvbnN0cnVjdG9yLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9jb2xvci1uYW1lL2luZGV4LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9pcy1hcnJheWlzaC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2ltcGxlLXN3aXp6bGUvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL2NvbG9yLXN0cmluZy9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9jb252ZXJzaW9ucy5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9yb3V0ZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY29sb3ItY29udmVydC9pbmRleC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvY29sb3IvaW5kZXguanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL2xpYi9pbnB1dC5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL3Jlc2l6ZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2NvbXBvc2l0ZS5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL29wZXJhdGlvbi5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2NvbG91ci5qcyIsICIuLi8uLi9ub2RlX21vZHVsZXMvc2hhcnAvbGliL2NoYW5uZWwuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL2xpYi9vdXRwdXQuanMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3NoYXJwL2xpYi91dGlsaXR5LmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy9zaGFycC9saWIvaW5kZXguanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvZXJyb3IuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvYXJndW1lbnQuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvaGVscC5qcyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2xpYi9vcHRpb24uanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvc3VnZ2VzdFNpbWlsYXIuanMiLCAibm9kZV9tb2R1bGVzL2NvbW1hbmRlci9saWIvY29tbWFuZC5qcyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2luZGV4LmpzIiwgImJpbi9nZW1pLnRzIiwgInNlcnZlci9kZXYudHMiLCAic2VydmVyL3N0eWxlcy50c3giLCAic2VydmVyL2ltYWdlSGFuZGxlci50cyIsICJzZXJ2ZXIvcmVuZGVyRXJyb3JQYWdlLnRzIiwgInNlcnZlci9wcm9kLnRzIiwgInNlcnZlci9nZW5lcmF0ZUV0YWcudHMiLCAiLi4vLi4vbm9kZV9tb2R1bGVzL3VybHBhdHRlcm4tcG9seWZpbGwvZGlzdC91cmxwYXR0ZXJuLmpzIiwgIi4uLy4uL25vZGVfbW9kdWxlcy91cmxwYXR0ZXJuLXBvbHlmaWxsL2luZGV4LmpzIiwgImJpbi9jcmVhdGVSb2xsdXBJbnB1dC50cyIsICJjbGllbnQvaGVscGVycy9mbGF0dGVuQ29tcG9uZW50VHJlZS50cyIsICJub2RlX21vZHVsZXMvY29tbWFuZGVyL2VzbS5tanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QuZGV2ZWxvcG1lbnQuanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cblwidXNlIHN0cmljdFwiO1xuXCJwcm9kdWN0aW9uXCIgIT09IHByb2Nlc3MuZW52Lk5PREVfRU5WICYmXG4gIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gZGVmaW5lRGVwcmVjYXRpb25XYXJuaW5nKG1ldGhvZE5hbWUsIGluZm8pIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb21wb25lbnQucHJvdG90eXBlLCBtZXRob2ROYW1lLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBcIiVzKC4uLikgaXMgZGVwcmVjYXRlZCBpbiBwbGFpbiBKYXZhU2NyaXB0IFJlYWN0IGNsYXNzZXMuICVzXCIsXG4gICAgICAgICAgICBpbmZvWzBdLFxuICAgICAgICAgICAgaW5mb1sxXVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRJdGVyYXRvckZuKG1heWJlSXRlcmFibGUpIHtcbiAgICAgIGlmIChudWxsID09PSBtYXliZUl0ZXJhYmxlIHx8IFwib2JqZWN0XCIgIT09IHR5cGVvZiBtYXliZUl0ZXJhYmxlKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIG1heWJlSXRlcmFibGUgPVxuICAgICAgICAoTUFZQkVfSVRFUkFUT1JfU1lNQk9MICYmIG1heWJlSXRlcmFibGVbTUFZQkVfSVRFUkFUT1JfU1lNQk9MXSkgfHxcbiAgICAgICAgbWF5YmVJdGVyYWJsZVtcIkBAaXRlcmF0b3JcIl07XG4gICAgICByZXR1cm4gXCJmdW5jdGlvblwiID09PSB0eXBlb2YgbWF5YmVJdGVyYWJsZSA/IG1heWJlSXRlcmFibGUgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3YXJuKGZvcm1hdCkge1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLFxuICAgICAgICAgIGFyZ3MgPSBBcnJheSgxIDwgX2xlbiA/IF9sZW4gLSAxIDogMCksXG4gICAgICAgICAgX2tleSA9IDE7XG4gICAgICAgIF9rZXkgPCBfbGVuO1xuICAgICAgICBfa2V5KytcbiAgICAgIClcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICBwcmludFdhcm5pbmcoXCJ3YXJuXCIsIGZvcm1hdCwgYXJncywgRXJyb3IoXCJyZWFjdC1zdGFjay10b3AtZnJhbWVcIikpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBlcnJvciRqc2NvbXAkMChmb3JtYXQpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsXG4gICAgICAgICAgYXJncyA9IEFycmF5KDEgPCBfbGVuMiA/IF9sZW4yIC0gMSA6IDApLFxuICAgICAgICAgIF9rZXkyID0gMTtcbiAgICAgICAgX2tleTIgPCBfbGVuMjtcbiAgICAgICAgX2tleTIrK1xuICAgICAgKVxuICAgICAgICBhcmdzW19rZXkyIC0gMV0gPSBhcmd1bWVudHNbX2tleTJdO1xuICAgICAgcHJpbnRXYXJuaW5nKFwiZXJyb3JcIiwgZm9ybWF0LCBhcmdzLCBFcnJvcihcInJlYWN0LXN0YWNrLXRvcC1mcmFtZVwiKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHByaW50V2FybmluZyhsZXZlbCwgZm9ybWF0LCBhcmdzLCBjdXJyZW50U3RhY2spIHtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayAmJlxuICAgICAgICAoKGN1cnJlbnRTdGFjayA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayhjdXJyZW50U3RhY2spKSxcbiAgICAgICAgXCJcIiAhPT0gY3VycmVudFN0YWNrICYmXG4gICAgICAgICAgKChmb3JtYXQgKz0gXCIlc1wiKSwgKGFyZ3MgPSBhcmdzLmNvbmNhdChbY3VycmVudFN0YWNrXSkpKSk7XG4gICAgICBhcmdzLnVuc2hpZnQoZm9ybWF0KTtcbiAgICAgIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKGNvbnNvbGVbbGV2ZWxdLCBjb25zb2xlLCBhcmdzKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIGNhbGxlck5hbWUpIHtcbiAgICAgIHB1YmxpY0luc3RhbmNlID1cbiAgICAgICAgKChwdWJsaWNJbnN0YW5jZSA9IHB1YmxpY0luc3RhbmNlLmNvbnN0cnVjdG9yKSAmJlxuICAgICAgICAgIChwdWJsaWNJbnN0YW5jZS5kaXNwbGF5TmFtZSB8fCBwdWJsaWNJbnN0YW5jZS5uYW1lKSkgfHxcbiAgICAgICAgXCJSZWFjdENsYXNzXCI7XG4gICAgICB2YXIgd2FybmluZ0tleSA9IHB1YmxpY0luc3RhbmNlICsgXCIuXCIgKyBjYWxsZXJOYW1lO1xuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldIHx8XG4gICAgICAgIChlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICBcIkNhbid0IGNhbGwgJXMgb24gYSBjb21wb25lbnQgdGhhdCBpcyBub3QgeWV0IG1vdW50ZWQuIFRoaXMgaXMgYSBuby1vcCwgYnV0IGl0IG1pZ2h0IGluZGljYXRlIGEgYnVnIGluIHlvdXIgYXBwbGljYXRpb24uIEluc3RlYWQsIGFzc2lnbiB0byBgdGhpcy5zdGF0ZWAgZGlyZWN0bHkgb3IgZGVmaW5lIGEgYHN0YXRlID0ge307YCBjbGFzcyBwcm9wZXJ0eSB3aXRoIHRoZSBkZXNpcmVkIHN0YXRlIGluIHRoZSAlcyBjb21wb25lbnQuXCIsXG4gICAgICAgICAgY2FsbGVyTmFtZSxcbiAgICAgICAgICBwdWJsaWNJbnN0YW5jZVxuICAgICAgICApLFxuICAgICAgICAoZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50W3dhcm5pbmdLZXldID0gITApKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gQ29tcG9uZW50KHByb3BzLCBjb250ZXh0LCB1cGRhdGVyKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgdGhpcy5yZWZzID0gZW1wdHlPYmplY3Q7XG4gICAgICB0aGlzLnVwZGF0ZXIgPSB1cGRhdGVyIHx8IFJlYWN0Tm9vcFVwZGF0ZVF1ZXVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBDb21wb25lbnREdW1teSgpIHt9XG4gICAgZnVuY3Rpb24gUHVyZUNvbXBvbmVudChwcm9wcywgY29udGV4dCwgdXBkYXRlcikge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgIHRoaXMucmVmcyA9IGVtcHR5T2JqZWN0O1xuICAgICAgdGhpcy51cGRhdGVyID0gdXBkYXRlciB8fCBSZWFjdE5vb3BVcGRhdGVRdWV1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gICAgICByZXR1cm4gXCJcIiArIHZhbHVlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBjaGVja0tleVN0cmluZ0NvZXJjaW9uKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpO1xuICAgICAgICB2YXIgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gITE7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9ICEwO1xuICAgICAgfVxuICAgICAgaWYgKEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdClcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID1cbiAgICAgICAgICAgIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBTeW1ib2wgJiZcbiAgICAgICAgICAgICAgU3ltYm9sLnRvU3RyaW5nVGFnICYmXG4gICAgICAgICAgICAgIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ10pIHx8XG4gICAgICAgICAgICB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lIHx8XG4gICAgICAgICAgICBcIk9iamVjdFwiKSxcbiAgICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAgIFwiVGhlIHByb3ZpZGVkIGtleSBpcyBhbiB1bnN1cHBvcnRlZCB0eXBlICVzLiBUaGlzIHZhbHVlIG11c3QgYmUgY29lcmNlZCB0byBhIHN0cmluZyBiZWZvcmUgdXNpbmcgaXQgaGVyZS5cIixcbiAgICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdFxuICAgICAgICAgICksXG4gICAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKVxuICAgICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSkge1xuICAgICAgaWYgKG51bGwgPT0gdHlwZSkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSlcbiAgICAgICAgcmV0dXJuIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMlxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIkZyYWdtZW50XCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiUG9ydGFsXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJQcm9maWxlclwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3RyaWN0TW9kZVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VMaXN0XCI7XG4gICAgICB9XG4gICAgICBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHR5cGUpXG4gICAgICAgIHN3aXRjaCAoXG4gICAgICAgICAgKFwibnVtYmVyXCIgPT09IHR5cGVvZiB0eXBlLnRhZyAmJlxuICAgICAgICAgICAgZXJyb3IkanNjb21wJDAoXG4gICAgICAgICAgICAgIFwiUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB0eXBlLiQkdHlwZW9mKVxuICAgICAgICApIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAodHlwZS5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Qcm92aWRlclwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OU1VNRVJfVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAodHlwZS5fY29udGV4dC5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIikgKyBcIi5Db25zdW1lclwiO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcbiAgICAgICAgICAgIHZhciBpbm5lclR5cGUgPSB0eXBlLnJlbmRlcjtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lO1xuICAgICAgICAgICAgdHlwZSB8fFxuICAgICAgICAgICAgICAoKHR5cGUgPSBpbm5lclR5cGUuZGlzcGxheU5hbWUgfHwgaW5uZXJUeXBlLm5hbWUgfHwgXCJcIiksXG4gICAgICAgICAgICAgICh0eXBlID0gXCJcIiAhPT0gdHlwZSA/IFwiRm9yd2FyZFJlZihcIiArIHR5cGUgKyBcIilcIiA6IFwiRm9yd2FyZFJlZlwiKSk7XG4gICAgICAgICAgICByZXR1cm4gdHlwZTtcbiAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIChpbm5lclR5cGUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IG51bGwpLFxuICAgICAgICAgICAgICBudWxsICE9PSBpbm5lclR5cGVcbiAgICAgICAgICAgICAgICA/IGlubmVyVHlwZVxuICAgICAgICAgICAgICAgIDogZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgXCJNZW1vXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICBpbm5lclR5cGUgPSB0eXBlLl9wYXlsb2FkO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGUuX2luaXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUoaW5uZXJUeXBlKSk7XG4gICAgICAgICAgICB9IGNhdGNoICh4KSB7fVxuICAgICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpIHtcbiAgICAgIHJldHVybiBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fFxuICAgICAgICB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8XG4gICAgICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICAgIG51bGwgIT09IHR5cGUgJiZcbiAgICAgICAgICAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8XG4gICAgICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHxcbiAgICAgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxIHx8XG4gICAgICAgICAgICB2b2lkIDAgIT09IHR5cGUuZ2V0TW9kdWxlSWQpKVxuICAgICAgICA/ICEwXG4gICAgICAgIDogITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cbiAgICBmdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAgICAgIGlmICgwID09PSBkaXNhYmxlZERlcHRoKSB7XG4gICAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kO1xuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpc2FibGVkRGVwdGgrKztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICAgICAgZGlzYWJsZWREZXB0aC0tO1xuICAgICAgaWYgKDAgPT09IGRpc2FibGVkRGVwdGgpIHtcbiAgICAgICAgdmFyIHByb3BzID0geyBjb25maWd1cmFibGU6ICEwLCBlbnVtZXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZMb2cgfSksXG4gICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkluZm8gfSksXG4gICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldldhcm4gfSksXG4gICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZFcnJvciB9KSxcbiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkdyb3VwIH0pLFxuICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQgfSksXG4gICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZHcm91cEVuZCB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIDAgPiBkaXNhYmxlZERlcHRoICYmXG4gICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgIFwiZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHByZWZpeClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgICBwcmVmaXggPSAobWF0Y2ggJiYgbWF0Y2hbMV0pIHx8IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBcIlxcblwiICsgcHJlZml4ICsgbmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gICAgICBpZiAoIWZuIHx8IHJlZW50cnkpIHJldHVybiBcIlwiO1xuICAgICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuICAgICAgaWYgKHZvaWQgMCAhPT0gZnJhbWUpIHJldHVybiBmcmFtZTtcbiAgICAgIHJlZW50cnkgPSAhMDtcbiAgICAgIGZyYW1lID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcmV2aW91c0Rpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBudWxsO1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcbiAgICAgIHZhciBSdW5JblJvb3RGcmFtZSA9IHtcbiAgICAgICAgRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgICAgICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCBcInByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBSZWZsZWN0ICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHgkMCkge1xuICAgICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoeCQxKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAoRmFrZSA9IGZuKCkpICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgRmFrZS5jYXRjaCAmJlxuICAgICAgICAgICAgICAgIEZha2UuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgICAgICAgICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIFwic3RyaW5nXCIgPT09IHR5cGVvZiBzYW1wbGUuc3RhY2spXG4gICAgICAgICAgICAgIHJldHVybiBbc2FtcGxlLnN0YWNrLCBjb250cm9sLnN0YWNrXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdC5kaXNwbGF5TmFtZSA9XG4gICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCI7XG4gICAgICB2YXIgbmFtZVByb3BEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LFxuICAgICAgICBcIm5hbWVcIlxuICAgICAgKTtcbiAgICAgIG5hbWVQcm9wRGVzY3JpcHRvciAmJlxuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsXG4gICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgeyB2YWx1ZTogXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIiB9XG4gICAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgX1J1bkluUm9vdEZyYW1lJERldGVyID1cbiAgICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCgpLFxuICAgICAgICAgIHNhbXBsZVN0YWNrID0gX1J1bkluUm9vdEZyYW1lJERldGVyWzBdLFxuICAgICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcbiAgICAgICAgaWYgKHNhbXBsZVN0YWNrICYmIGNvbnRyb2xTdGFjaykge1xuICAgICAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuICAgICAgICAgICAgY29udHJvbExpbmVzID0gY29udHJvbFN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBzYW1wbGVTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlciA9IDA7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPCBzYW1wbGVMaW5lcy5sZW5ndGggJiZcbiAgICAgICAgICAgICFzYW1wbGVMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICBcIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdFwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgKVxuICAgICAgICAgICAgX1J1bkluUm9vdEZyYW1lJERldGVyKys7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIHNhbXBsZVN0YWNrIDwgY29udHJvbExpbmVzLmxlbmd0aCAmJlxuICAgICAgICAgICAgIWNvbnRyb2xMaW5lc1tzYW1wbGVTdGFja10uaW5jbHVkZXMoXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIik7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICBzYW1wbGVTdGFjaysrO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9PT0gc2FtcGxlTGluZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBzYW1wbGVTdGFjayA9PT0gY29udHJvbExpbmVzLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgc2FtcGxlU3RhY2sgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgMSA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgJiZcbiAgICAgICAgICAgICAgMCA8PSBzYW1wbGVTdGFjayAmJlxuICAgICAgICAgICAgICBzYW1wbGVMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdICE9PSBjb250cm9sTGluZXNbc2FtcGxlU3RhY2tdO1xuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNhbXBsZVN0YWNrLS07XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIDEgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyICYmIDAgPD0gc2FtcGxlU3RhY2s7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXItLSwgc2FtcGxlU3RhY2stLVxuICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc2FtcGxlTGluZXNbX1J1bkluUm9vdEZyYW1lJERldGVyXSAhPT0gY29udHJvbExpbmVzW3NhbXBsZVN0YWNrXVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICgxICE9PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgfHwgMSAhPT0gc2FtcGxlU3RhY2spIHtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoX1J1bkluUm9vdEZyYW1lJERldGVyLS0sXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZVN0YWNrLS0sXG4gICAgICAgICAgICAgICAgICAgIDAgPiBzYW1wbGVTdGFjayB8fFxuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sTGluZXNbc2FtcGxlU3RhY2tdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IG5ldyBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IFwiXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm4uZGlzcGxheU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfZnJhbWUuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChfZnJhbWUgPSBfZnJhbWUucmVwbGFjZShcIjxhbm9ueW1vdXM+XCIsIGZuLmRpc3BsYXlOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGZuICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyICYmIDAgPD0gc2FtcGxlU3RhY2spO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAocmVlbnRyeSA9ICExKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZpb3VzRGlzcGF0Y2hlciksXG4gICAgICAgICAgcmVlbmFibGVMb2dzKCksXG4gICAgICAgICAgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gZnJhbWUpO1xuICAgICAgfVxuICAgICAgc2FtcGxlTGluZXMgPSAoc2FtcGxlTGluZXMgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiBcIlwiKVxuICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHNhbXBsZUxpbmVzKVxuICAgICAgICA6IFwiXCI7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBmbiAmJiBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc2FtcGxlTGluZXMpO1xuICAgICAgcmV0dXJuIHNhbXBsZUxpbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSkge1xuICAgICAgaWYgKG51bGwgPT0gdHlwZSkgcmV0dXJuIFwiXCI7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSkge1xuICAgICAgICB2YXIgcHJvdG90eXBlID0gdHlwZS5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgISghcHJvdG90eXBlIHx8ICFwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZVwiKTtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKFwiU3VzcGVuc2VMaXN0XCIpO1xuICAgICAgfVxuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUgPSBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyLCAhMSkpLCB0eXBlO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUpO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgcHJvdG90eXBlID0gdHlwZS5fcGF5bG9hZDtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLl9pbml0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlKHByb3RvdHlwZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE93bmVyKCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5BO1xuICAgICAgcmV0dXJuIG51bGwgPT09IGRpc3BhdGNoZXIgPyBudWxsIDogZGlzcGF0Y2hlci5nZXRPd25lcigpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJyZWZcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcInJlZlwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcucmVmO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJrZXlcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcImtleVwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcua2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHdhcm5BYm91dEFjY2Vzc2luZ0tleSgpIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gfHxcbiAgICAgICAgICAoKHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gITApLFxuICAgICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgXCIlczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lIHZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgcHJvcC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvc3BlY2lhbC1wcm9wcylcIixcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSAhMDtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgXCJrZXlcIiwge1xuICAgICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVsZW1lbnRSZWZHZXR0ZXJXaXRoRGVwcmVjYXRpb25XYXJuaW5nKCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodGhpcy50eXBlKTtcbiAgICAgIGRpZFdhcm5BYm91dEVsZW1lbnRSZWZbY29tcG9uZW50TmFtZV0gfHxcbiAgICAgICAgKChkaWRXYXJuQWJvdXRFbGVtZW50UmVmW2NvbXBvbmVudE5hbWVdID0gITApLFxuICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICBcIkFjY2Vzc2luZyBlbGVtZW50LnJlZiB3YXMgcmVtb3ZlZCBpbiBSZWFjdCAxOS4gcmVmIGlzIG5vdyBhIHJlZ3VsYXIgcHJvcC4gSXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIEpTWCBFbGVtZW50IHR5cGUgaW4gYSBmdXR1cmUgcmVsZWFzZS5cIlxuICAgICAgICApKTtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSB0aGlzLnByb3BzLnJlZjtcbiAgICAgIHJldHVybiB2b2lkIDAgIT09IGNvbXBvbmVudE5hbWUgPyBjb21wb25lbnROYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgX3JlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgICAgIF9yZWYgPSBwcm9wcy5yZWY7XG4gICAgICB0eXBlID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICBfb3duZXI6IG93bmVyXG4gICAgICB9O1xuICAgICAgbnVsbCAhPT0gKHZvaWQgMCAhPT0gX3JlZiA/IF9yZWYgOiBudWxsKVxuICAgICAgICA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgICAgIGdldDogZWxlbWVudFJlZkdldHRlcldpdGhEZXByZWNhdGlvbldhcm5pbmdcbiAgICAgICAgICB9KVxuICAgICAgICA6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7IGVudW1lcmFibGU6ICExLCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgIHR5cGUuX3N0b3JlID0ge307XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZS5fc3RvcmUsIFwidmFsaWRhdGVkXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMSxcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIFwiX2RlYnVnSW5mb1wiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITEsXG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBudWxsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5mcmVlemUgJiYgKE9iamVjdC5mcmVlemUodHlwZS5wcm9wcyksIE9iamVjdC5mcmVlemUodHlwZSkpO1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNsb25lQW5kUmVwbGFjZUtleShvbGRFbGVtZW50LCBuZXdLZXkpIHtcbiAgICAgIG5ld0tleSA9IFJlYWN0RWxlbWVudChcbiAgICAgICAgb2xkRWxlbWVudC50eXBlLFxuICAgICAgICBuZXdLZXksXG4gICAgICAgIG51bGwsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBvbGRFbGVtZW50Ll9vd25lcixcbiAgICAgICAgb2xkRWxlbWVudC5wcm9wc1xuICAgICAgKTtcbiAgICAgIG5ld0tleS5fc3RvcmUudmFsaWRhdGVkID0gb2xkRWxlbWVudC5fc3RvcmUudmFsaWRhdGVkO1xuICAgICAgcmV0dXJuIG5ld0tleTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSwgcGFyZW50VHlwZSkge1xuICAgICAgaWYgKFxuICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2Ygbm9kZSAmJlxuICAgICAgICBub2RlICYmXG4gICAgICAgIG5vZGUuJCR0eXBlb2YgIT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0VcbiAgICAgIClcbiAgICAgICAgaWYgKGlzQXJyYXlJbXBsKG5vZGUpKVxuICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNoaWxkID0gbm9kZVtpXTtcbiAgICAgICAgICAgIGlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJiB2YWxpZGF0ZUV4cGxpY2l0S2V5KGNoaWxkLCBwYXJlbnRUeXBlKTtcbiAgICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzVmFsaWRFbGVtZW50KG5vZGUpKVxuICAgICAgICAgIG5vZGUuX3N0b3JlICYmIChub2RlLl9zdG9yZS52YWxpZGF0ZWQgPSAxKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKChpID0gZ2V0SXRlcmF0b3JGbihub2RlKSksXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgaSAmJlxuICAgICAgICAgICAgaSAhPT0gbm9kZS5lbnRyaWVzICYmXG4gICAgICAgICAgICAoKGkgPSBpLmNhbGwobm9kZSkpLCBpICE9PSBub2RlKSlcbiAgICAgICAgKVxuICAgICAgICAgIGZvciAoOyAhKG5vZGUgPSBpLm5leHQoKSkuZG9uZTsgKVxuICAgICAgICAgICAgaXNWYWxpZEVsZW1lbnQobm9kZS52YWx1ZSkgJiZcbiAgICAgICAgICAgICAgdmFsaWRhdGVFeHBsaWNpdEtleShub2RlLnZhbHVlLCBwYXJlbnRUeXBlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZEVsZW1lbnQob2JqZWN0KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2Ygb2JqZWN0ICYmXG4gICAgICAgIG51bGwgIT09IG9iamVjdCAmJlxuICAgICAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVFeHBsaWNpdEtleShlbGVtZW50LCBwYXJlbnRUeXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGVsZW1lbnQuX3N0b3JlICYmXG4gICAgICAgICFlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgJiZcbiAgICAgICAgbnVsbCA9PSBlbGVtZW50LmtleSAmJlxuICAgICAgICAoKGVsZW1lbnQuX3N0b3JlLnZhbGlkYXRlZCA9IDEpLFxuICAgICAgICAocGFyZW50VHlwZSA9IGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkpLFxuICAgICAgICAhb3duZXJIYXNLZXlVc2VXYXJuaW5nW3BhcmVudFR5cGVdKVxuICAgICAgKSB7XG4gICAgICAgIG93bmVySGFzS2V5VXNlV2FybmluZ1twYXJlbnRUeXBlXSA9ICEwO1xuICAgICAgICB2YXIgY2hpbGRPd25lciA9IFwiXCI7XG4gICAgICAgIGVsZW1lbnQgJiZcbiAgICAgICAgICBudWxsICE9IGVsZW1lbnQuX293bmVyICYmXG4gICAgICAgICAgZWxlbWVudC5fb3duZXIgIT09IGdldE93bmVyKCkgJiZcbiAgICAgICAgICAoKGNoaWxkT3duZXIgPSBudWxsKSxcbiAgICAgICAgICBcIm51bWJlclwiID09PSB0eXBlb2YgZWxlbWVudC5fb3duZXIudGFnXG4gICAgICAgICAgICA/IChjaGlsZE93bmVyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKGVsZW1lbnQuX293bmVyLnR5cGUpKVxuICAgICAgICAgICAgOiBcInN0cmluZ1wiID09PSB0eXBlb2YgZWxlbWVudC5fb3duZXIubmFtZSAmJlxuICAgICAgICAgICAgICAoY2hpbGRPd25lciA9IGVsZW1lbnQuX293bmVyLm5hbWUpLFxuICAgICAgICAgIChjaGlsZE93bmVyID0gXCIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gXCIgKyBjaGlsZE93bmVyICsgXCIuXCIpKTtcbiAgICAgICAgdmFyIHByZXZHZXRDdXJyZW50U3RhY2sgPSBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2s7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgc3RhY2sgPSBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYoZWxlbWVudC50eXBlKTtcbiAgICAgICAgICBwcmV2R2V0Q3VycmVudFN0YWNrICYmIChzdGFjayArPSBwcmV2R2V0Q3VycmVudFN0YWNrKCkgfHwgXCJcIik7XG4gICAgICAgICAgcmV0dXJuIHN0YWNrO1xuICAgICAgICB9O1xuICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAnRWFjaCBjaGlsZCBpbiBhIGxpc3Qgc2hvdWxkIGhhdmUgYSB1bmlxdWUgXCJrZXlcIiBwcm9wLiVzJXMgU2VlIGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgICAgICAgcGFyZW50VHlwZSxcbiAgICAgICAgICBjaGlsZE93bmVyXG4gICAgICAgICk7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayA9IHByZXZHZXRDdXJyZW50U3RhY2s7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRDb21wb25lbnRFcnJvckluZm8ocGFyZW50VHlwZSkge1xuICAgICAgdmFyIGluZm8gPSBcIlwiLFxuICAgICAgICBvd25lciA9IGdldE93bmVyKCk7XG4gICAgICBvd25lciAmJlxuICAgICAgICAob3duZXIgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUob3duZXIudHlwZSkpICYmXG4gICAgICAgIChpbmZvID0gXCJcXG5cXG5DaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgXCIgKyBvd25lciArIFwiYC5cIik7XG4gICAgICBpbmZvIHx8XG4gICAgICAgICgocGFyZW50VHlwZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShwYXJlbnRUeXBlKSkgJiZcbiAgICAgICAgICAoaW5mbyA9XG4gICAgICAgICAgICBcIlxcblxcbkNoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPFwiICsgcGFyZW50VHlwZSArIFwiPi5cIikpO1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVzY2FwZShrZXkpIHtcbiAgICAgIHZhciBlc2NhcGVyTG9va3VwID0geyBcIj1cIjogXCI9MFwiLCBcIjpcIjogXCI9MlwiIH07XG4gICAgICByZXR1cm4gKFxuICAgICAgICBcIiRcIiArXG4gICAgICAgIGtleS5yZXBsYWNlKC9bPTpdL2csIGZ1bmN0aW9uIChtYXRjaCkge1xuICAgICAgICAgIHJldHVybiBlc2NhcGVyTG9va3VwW21hdGNoXTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldEVsZW1lbnRLZXkoZWxlbWVudCwgaW5kZXgpIHtcbiAgICAgIHJldHVybiBcIm9iamVjdFwiID09PSB0eXBlb2YgZWxlbWVudCAmJlxuICAgICAgICBudWxsICE9PSBlbGVtZW50ICYmXG4gICAgICAgIG51bGwgIT0gZWxlbWVudC5rZXlcbiAgICAgICAgPyAoY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihlbGVtZW50LmtleSksIGVzY2FwZShcIlwiICsgZWxlbWVudC5rZXkpKVxuICAgICAgICA6IGluZGV4LnRvU3RyaW5nKDM2KTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbm9vcCQxKCkge31cbiAgICBmdW5jdGlvbiByZXNvbHZlVGhlbmFibGUodGhlbmFibGUpIHtcbiAgICAgIHN3aXRjaCAodGhlbmFibGUuc3RhdHVzKSB7XG4gICAgICAgIGNhc2UgXCJmdWxmaWxsZWRcIjpcbiAgICAgICAgICByZXR1cm4gdGhlbmFibGUudmFsdWU7XG4gICAgICAgIGNhc2UgXCJyZWplY3RlZFwiOlxuICAgICAgICAgIHRocm93IHRoZW5hYmxlLnJlYXNvbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzd2l0Y2ggKFxuICAgICAgICAgICAgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB0aGVuYWJsZS5zdGF0dXNcbiAgICAgICAgICAgICAgPyB0aGVuYWJsZS50aGVuKG5vb3AkMSwgbm9vcCQxKVxuICAgICAgICAgICAgICA6ICgodGhlbmFibGUuc3RhdHVzID0gXCJwZW5kaW5nXCIpLFxuICAgICAgICAgICAgICAgIHRoZW5hYmxlLnRoZW4oXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZnVsZmlsbGVkVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgXCJwZW5kaW5nXCIgPT09IHRoZW5hYmxlLnN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICgodGhlbmFibGUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgKHRoZW5hYmxlLnZhbHVlID0gZnVsZmlsbGVkVmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgXCJwZW5kaW5nXCIgPT09IHRoZW5hYmxlLnN0YXR1cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICgodGhlbmFibGUuc3RhdHVzID0gXCJyZWplY3RlZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAodGhlbmFibGUucmVhc29uID0gZXJyb3IpKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApKSxcbiAgICAgICAgICAgIHRoZW5hYmxlLnN0YXR1cylcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNhc2UgXCJmdWxmaWxsZWRcIjpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoZW5hYmxlLnZhbHVlO1xuICAgICAgICAgICAgY2FzZSBcInJlamVjdGVkXCI6XG4gICAgICAgICAgICAgIHRocm93IHRoZW5hYmxlLnJlYXNvbjtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyB0aGVuYWJsZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbWFwSW50b0FycmF5KGNoaWxkcmVuLCBhcnJheSwgZXNjYXBlZFByZWZpeCwgbmFtZVNvRmFyLCBjYWxsYmFjaykge1xuICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgY2hpbGRyZW47XG4gICAgICBpZiAoXCJ1bmRlZmluZWRcIiA9PT0gdHlwZSB8fCBcImJvb2xlYW5cIiA9PT0gdHlwZSkgY2hpbGRyZW4gPSBudWxsO1xuICAgICAgdmFyIGludm9rZUNhbGxiYWNrID0gITE7XG4gICAgICBpZiAobnVsbCA9PT0gY2hpbGRyZW4pIGludm9rZUNhbGxiYWNrID0gITA7XG4gICAgICBlbHNlXG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSAhMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgICAgICAgIHN3aXRjaCAoY2hpbGRyZW4uJCR0eXBlb2YpIHtcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9FTEVNRU5UX1RZUEU6XG4gICAgICAgICAgICAgIGNhc2UgUkVBQ1RfUE9SVEFMX1RZUEU6XG4gICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sgPSAhMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIChpbnZva2VDYWxsYmFjayA9IGNoaWxkcmVuLl9pbml0KSxcbiAgICAgICAgICAgICAgICAgIG1hcEludG9BcnJheShcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2soY2hpbGRyZW4uX3BheWxvYWQpLFxuICAgICAgICAgICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja1xuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGlmIChpbnZva2VDYWxsYmFjaykge1xuICAgICAgICBpbnZva2VDYWxsYmFjayA9IGNoaWxkcmVuO1xuICAgICAgICBjYWxsYmFjayA9IGNhbGxiYWNrKGludm9rZUNhbGxiYWNrKTtcbiAgICAgICAgdmFyIGNoaWxkS2V5ID1cbiAgICAgICAgICBcIlwiID09PSBuYW1lU29GYXIgPyBcIi5cIiArIGdldEVsZW1lbnRLZXkoaW52b2tlQ2FsbGJhY2ssIDApIDogbmFtZVNvRmFyO1xuICAgICAgICBpc0FycmF5SW1wbChjYWxsYmFjaylcbiAgICAgICAgICA/ICgoZXNjYXBlZFByZWZpeCA9IFwiXCIpLFxuICAgICAgICAgICAgbnVsbCAhPSBjaGlsZEtleSAmJlxuICAgICAgICAgICAgICAoZXNjYXBlZFByZWZpeCA9XG4gICAgICAgICAgICAgICAgY2hpbGRLZXkucmVwbGFjZSh1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCwgXCIkJi9cIikgKyBcIi9cIiksXG4gICAgICAgICAgICBtYXBJbnRvQXJyYXkoY2FsbGJhY2ssIGFycmF5LCBlc2NhcGVkUHJlZml4LCBcIlwiLCBmdW5jdGlvbiAoYykge1xuICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIH0pKVxuICAgICAgICAgIDogbnVsbCAhPSBjYWxsYmFjayAmJlxuICAgICAgICAgICAgKGlzVmFsaWRFbGVtZW50KGNhbGxiYWNrKSAmJlxuICAgICAgICAgICAgICAobnVsbCAhPSBjYWxsYmFjay5rZXkgJiZcbiAgICAgICAgICAgICAgICAoKGludm9rZUNhbGxiYWNrICYmIGludm9rZUNhbGxiYWNrLmtleSA9PT0gY2FsbGJhY2sua2V5KSB8fFxuICAgICAgICAgICAgICAgICAgY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjYWxsYmFjay5rZXkpKSxcbiAgICAgICAgICAgICAgKGVzY2FwZWRQcmVmaXggPSBjbG9uZUFuZFJlcGxhY2VLZXkoXG4gICAgICAgICAgICAgICAgY2FsbGJhY2ssXG4gICAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCArXG4gICAgICAgICAgICAgICAgICAobnVsbCA9PSBjYWxsYmFjay5rZXkgfHxcbiAgICAgICAgICAgICAgICAgIChpbnZva2VDYWxsYmFjayAmJiBpbnZva2VDYWxsYmFjay5rZXkgPT09IGNhbGxiYWNrLmtleSlcbiAgICAgICAgICAgICAgICAgICAgPyBcIlwiXG4gICAgICAgICAgICAgICAgICAgIDogKFwiXCIgKyBjYWxsYmFjay5rZXkpLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyUHJvdmlkZWRLZXlFc2NhcGVSZWdleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiJCYvXCJcbiAgICAgICAgICAgICAgICAgICAgICApICsgXCIvXCIpICtcbiAgICAgICAgICAgICAgICAgIGNoaWxkS2V5XG4gICAgICAgICAgICAgICkpLFxuICAgICAgICAgICAgICBcIlwiICE9PSBuYW1lU29GYXIgJiZcbiAgICAgICAgICAgICAgICBudWxsICE9IGludm9rZUNhbGxiYWNrICYmXG4gICAgICAgICAgICAgICAgaXNWYWxpZEVsZW1lbnQoaW52b2tlQ2FsbGJhY2spICYmXG4gICAgICAgICAgICAgICAgbnVsbCA9PSBpbnZva2VDYWxsYmFjay5rZXkgJiZcbiAgICAgICAgICAgICAgICBpbnZva2VDYWxsYmFjay5fc3RvcmUgJiZcbiAgICAgICAgICAgICAgICAhaW52b2tlQ2FsbGJhY2suX3N0b3JlLnZhbGlkYXRlZCAmJlxuICAgICAgICAgICAgICAgIChlc2NhcGVkUHJlZml4Ll9zdG9yZS52YWxpZGF0ZWQgPSAyKSxcbiAgICAgICAgICAgICAgKGNhbGxiYWNrID0gZXNjYXBlZFByZWZpeCkpLFxuICAgICAgICAgICAgYXJyYXkucHVzaChjYWxsYmFjaykpO1xuICAgICAgICByZXR1cm4gMTtcbiAgICAgIH1cbiAgICAgIGludm9rZUNhbGxiYWNrID0gMDtcbiAgICAgIGNoaWxkS2V5ID0gXCJcIiA9PT0gbmFtZVNvRmFyID8gXCIuXCIgOiBuYW1lU29GYXIgKyBcIjpcIjtcbiAgICAgIGlmIChpc0FycmF5SW1wbChjaGlsZHJlbikpXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspXG4gICAgICAgICAgKG5hbWVTb0ZhciA9IGNoaWxkcmVuW2ldKSxcbiAgICAgICAgICAgICh0eXBlID0gY2hpbGRLZXkgKyBnZXRFbGVtZW50S2V5KG5hbWVTb0ZhciwgaSkpLFxuICAgICAgICAgICAgKGludm9rZUNhbGxiYWNrICs9IG1hcEludG9BcnJheShcbiAgICAgICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICkpO1xuICAgICAgZWxzZSBpZiAoKChpID0gZ2V0SXRlcmF0b3JGbihjaGlsZHJlbikpLCBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBpKSlcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBpID09PSBjaGlsZHJlbi5lbnRyaWVzICYmXG4gICAgICAgICAgICAoZGlkV2FybkFib3V0TWFwcyB8fFxuICAgICAgICAgICAgICB3YXJuKFxuICAgICAgICAgICAgICAgIFwiVXNpbmcgTWFwcyBhcyBjaGlsZHJlbiBpcyBub3Qgc3VwcG9ydGVkLiBVc2UgYW4gYXJyYXkgb2Yga2V5ZWQgUmVhY3RFbGVtZW50cyBpbnN0ZWFkLlwiXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAoZGlkV2FybkFib3V0TWFwcyA9ICEwKSksXG4gICAgICAgICAgICBjaGlsZHJlbiA9IGkuY2FsbChjaGlsZHJlbiksXG4gICAgICAgICAgICBpID0gMDtcbiAgICAgICAgICAhKG5hbWVTb0ZhciA9IGNoaWxkcmVuLm5leHQoKSkuZG9uZTtcblxuICAgICAgICApXG4gICAgICAgICAgKG5hbWVTb0ZhciA9IG5hbWVTb0Zhci52YWx1ZSksXG4gICAgICAgICAgICAodHlwZSA9IGNoaWxkS2V5ICsgZ2V0RWxlbWVudEtleShuYW1lU29GYXIsIGkrKykpLFxuICAgICAgICAgICAgKGludm9rZUNhbGxiYWNrICs9IG1hcEludG9BcnJheShcbiAgICAgICAgICAgICAgbmFtZVNvRmFyLFxuICAgICAgICAgICAgICBhcnJheSxcbiAgICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgICAgY2FsbGJhY2tcbiAgICAgICAgICAgICkpO1xuICAgICAgZWxzZSBpZiAoXCJvYmplY3RcIiA9PT0gdHlwZSkge1xuICAgICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY2hpbGRyZW4udGhlbilcbiAgICAgICAgICByZXR1cm4gbWFwSW50b0FycmF5KFxuICAgICAgICAgICAgcmVzb2x2ZVRoZW5hYmxlKGNoaWxkcmVuKSxcbiAgICAgICAgICAgIGFycmF5LFxuICAgICAgICAgICAgZXNjYXBlZFByZWZpeCxcbiAgICAgICAgICAgIG5hbWVTb0ZhcixcbiAgICAgICAgICAgIGNhbGxiYWNrXG4gICAgICAgICAgKTtcbiAgICAgICAgYXJyYXkgPSBTdHJpbmcoY2hpbGRyZW4pO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBcIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogXCIgK1xuICAgICAgICAgICAgKFwiW29iamVjdCBPYmplY3RdXCIgPT09IGFycmF5XG4gICAgICAgICAgICAgID8gXCJvYmplY3Qgd2l0aCBrZXlzIHtcIiArIE9iamVjdC5rZXlzKGNoaWxkcmVuKS5qb2luKFwiLCBcIikgKyBcIn1cIlxuICAgICAgICAgICAgICA6IGFycmF5KSArXG4gICAgICAgICAgICBcIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC5cIlxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGludm9rZUNhbGxiYWNrO1xuICAgIH1cbiAgICBmdW5jdGlvbiBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuYywgY29udGV4dCkge1xuICAgICAgaWYgKG51bGwgPT0gY2hpbGRyZW4pIHJldHVybiBjaGlsZHJlbjtcbiAgICAgIHZhciByZXN1bHQgPSBbXSxcbiAgICAgICAgY291bnQgPSAwO1xuICAgICAgbWFwSW50b0FycmF5KGNoaWxkcmVuLCByZXN1bHQsIFwiXCIsIFwiXCIsIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICByZXR1cm4gZnVuYy5jYWxsKGNvbnRleHQsIGNoaWxkLCBjb3VudCsrKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgZnVuY3Rpb24gbGF6eUluaXRpYWxpemVyKHBheWxvYWQpIHtcbiAgICAgIGlmICgtMSA9PT0gcGF5bG9hZC5fc3RhdHVzKSB7XG4gICAgICAgIHZhciBjdG9yID0gcGF5bG9hZC5fcmVzdWx0O1xuICAgICAgICBjdG9yID0gY3RvcigpO1xuICAgICAgICBjdG9yLnRoZW4oXG4gICAgICAgICAgZnVuY3Rpb24gKG1vZHVsZU9iamVjdCkge1xuICAgICAgICAgICAgaWYgKDAgPT09IHBheWxvYWQuX3N0YXR1cyB8fCAtMSA9PT0gcGF5bG9hZC5fc3RhdHVzKVxuICAgICAgICAgICAgICAocGF5bG9hZC5fc3RhdHVzID0gMSksIChwYXlsb2FkLl9yZXN1bHQgPSBtb2R1bGVPYmplY3QpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAoMCA9PT0gcGF5bG9hZC5fc3RhdHVzIHx8IC0xID09PSBwYXlsb2FkLl9zdGF0dXMpXG4gICAgICAgICAgICAgIChwYXlsb2FkLl9zdGF0dXMgPSAyKSwgKHBheWxvYWQuX3Jlc3VsdCA9IGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICAgIC0xID09PSBwYXlsb2FkLl9zdGF0dXMgJiZcbiAgICAgICAgICAoKHBheWxvYWQuX3N0YXR1cyA9IDApLCAocGF5bG9hZC5fcmVzdWx0ID0gY3RvcikpO1xuICAgICAgfVxuICAgICAgaWYgKDEgPT09IHBheWxvYWQuX3N0YXR1cylcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAoY3RvciA9IHBheWxvYWQuX3Jlc3VsdCksXG4gICAgICAgICAgdm9pZCAwID09PSBjdG9yICYmXG4gICAgICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAgICAgXCJsYXp5OiBFeHBlY3RlZCB0aGUgcmVzdWx0IG9mIGEgZHluYW1pYyBpbXBvcnQoKSBjYWxsLiBJbnN0ZWFkIHJlY2VpdmVkOiAlc1xcblxcbllvdXIgY29kZSBzaG91bGQgbG9vayBsaWtlOiBcXG4gIGNvbnN0IE15Q29tcG9uZW50ID0gbGF6eSgoKSA9PiBpbXBvcnQoJy4vTXlDb21wb25lbnQnKSlcXG5cXG5EaWQgeW91IGFjY2lkZW50YWxseSBwdXQgY3VybHkgYnJhY2VzIGFyb3VuZCB0aGUgaW1wb3J0P1wiLFxuICAgICAgICAgICAgICBjdG9yXG4gICAgICAgICAgICApLFxuICAgICAgICAgIFwiZGVmYXVsdFwiIGluIGN0b3IgfHxcbiAgICAgICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgICBcImxhenk6IEV4cGVjdGVkIHRoZSByZXN1bHQgb2YgYSBkeW5hbWljIGltcG9ydCgpIGNhbGwuIEluc3RlYWQgcmVjZWl2ZWQ6ICVzXFxuXFxuWW91ciBjb2RlIHNob3VsZCBsb29rIGxpa2U6IFxcbiAgY29uc3QgTXlDb21wb25lbnQgPSBsYXp5KCgpID0+IGltcG9ydCgnLi9NeUNvbXBvbmVudCcpKVwiLFxuICAgICAgICAgICAgICBjdG9yXG4gICAgICAgICAgICApLFxuICAgICAgICAgIGN0b3IuZGVmYXVsdFxuICAgICAgICApO1xuICAgICAgdGhyb3cgcGF5bG9hZC5fcmVzdWx0O1xuICAgIH1cbiAgICBmdW5jdGlvbiByZXNvbHZlRGlzcGF0Y2hlcigpIHtcbiAgICAgIHZhciBkaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgIG51bGwgPT09IGRpc3BhdGNoZXIgJiZcbiAgICAgICAgZXJyb3IkanNjb21wJDAoXG4gICAgICAgICAgXCJJbnZhbGlkIGhvb2sgY2FsbC4gSG9va3MgY2FuIG9ubHkgYmUgY2FsbGVkIGluc2lkZSBvZiB0aGUgYm9keSBvZiBhIGZ1bmN0aW9uIGNvbXBvbmVudC4gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6XFxuMS4gWW91IG1pZ2h0IGhhdmUgbWlzbWF0Y2hpbmcgdmVyc2lvbnMgb2YgUmVhY3QgYW5kIHRoZSByZW5kZXJlciAoc3VjaCBhcyBSZWFjdCBET00pXFxuMi4gWW91IG1pZ2h0IGJlIGJyZWFraW5nIHRoZSBSdWxlcyBvZiBIb29rc1xcbjMuIFlvdSBtaWdodCBoYXZlIG1vcmUgdGhhbiBvbmUgY29weSBvZiBSZWFjdCBpbiB0aGUgc2FtZSBhcHBcXG5TZWUgaHR0cHM6Ly9yZWFjdC5kZXYvbGluay9pbnZhbGlkLWhvb2stY2FsbCBmb3IgdGlwcyBhYm91dCBob3cgdG8gZGVidWcgYW5kIGZpeCB0aGlzIHByb2JsZW0uXCJcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBkaXNwYXRjaGVyO1xuICAgIH1cbiAgICBmdW5jdGlvbiBub29wKCkge31cbiAgICBmdW5jdGlvbiBlbnF1ZXVlVGFzayh0YXNrKSB7XG4gICAgICBpZiAobnVsbCA9PT0gZW5xdWV1ZVRhc2tJbXBsKVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciByZXF1aXJlU3RyaW5nID0gKFwicmVxdWlyZVwiICsgTWF0aC5yYW5kb20oKSkuc2xpY2UoMCwgNyk7XG4gICAgICAgICAgZW5xdWV1ZVRhc2tJbXBsID0gKG1vZHVsZSAmJiBtb2R1bGVbcmVxdWlyZVN0cmluZ10pLmNhbGwoXG4gICAgICAgICAgICBtb2R1bGUsXG4gICAgICAgICAgICBcInRpbWVyc1wiXG4gICAgICAgICAgKS5zZXRJbW1lZGlhdGU7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICBlbnF1ZXVlVGFza0ltcGwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICExID09PSBkaWRXYXJuQWJvdXRNZXNzYWdlQ2hhbm5lbCAmJlxuICAgICAgICAgICAgICAoKGRpZFdhcm5BYm91dE1lc3NhZ2VDaGFubmVsID0gITApLFxuICAgICAgICAgICAgICBcInVuZGVmaW5lZFwiID09PSB0eXBlb2YgTWVzc2FnZUNoYW5uZWwgJiZcbiAgICAgICAgICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAgICAgICAgIFwiVGhpcyBicm93c2VyIGRvZXMgbm90IGhhdmUgYSBNZXNzYWdlQ2hhbm5lbCBpbXBsZW1lbnRhdGlvbiwgc28gZW5xdWV1aW5nIHRhc2tzIHZpYSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKSB3aWxsIGZhaWwuIFBsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC9pc3N1ZXMgaWYgeW91IGVuY291bnRlciB0aGlzIHdhcm5pbmcuXCJcbiAgICAgICAgICAgICAgICApKTtcbiAgICAgICAgICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSh2b2lkIDApO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBlbnF1ZXVlVGFza0ltcGwodGFzayk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFnZ3JlZ2F0ZUVycm9ycyhlcnJvcnMpIHtcbiAgICAgIHJldHVybiAxIDwgZXJyb3JzLmxlbmd0aCAmJiBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBBZ2dyZWdhdGVFcnJvclxuICAgICAgICA/IG5ldyBBZ2dyZWdhdGVFcnJvcihlcnJvcnMpXG4gICAgICAgIDogZXJyb3JzWzBdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBwb3BBY3RTY29wZShwcmV2QWN0UXVldWUsIHByZXZBY3RTY29wZURlcHRoKSB7XG4gICAgICBwcmV2QWN0U2NvcGVEZXB0aCAhPT0gYWN0U2NvcGVEZXB0aCAtIDEgJiZcbiAgICAgICAgZXJyb3IkanNjb21wJDAoXG4gICAgICAgICAgXCJZb3Ugc2VlbSB0byBoYXZlIG92ZXJsYXBwaW5nIGFjdCgpIGNhbGxzLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQuIEJlIHN1cmUgdG8gYXdhaXQgcHJldmlvdXMgYWN0KCkgY2FsbHMgYmVmb3JlIG1ha2luZyBhIG5ldyBvbmUuIFwiXG4gICAgICAgICk7XG4gICAgICBhY3RTY29wZURlcHRoID0gcHJldkFjdFNjb3BlRGVwdGg7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5Rmx1c2hBc3luY0FjdFdvcmsocmV0dXJuVmFsdWUsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHF1ZXVlID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWU7XG4gICAgICBpZiAobnVsbCAhPT0gcXVldWUpXG4gICAgICAgIGlmICgwICE9PSBxdWV1ZS5sZW5ndGgpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZsdXNoQWN0UXVldWUocXVldWUpO1xuICAgICAgICAgICAgZW5xdWV1ZVRhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhyZXR1cm5WYWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yJDUpIHtcbiAgICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5wdXNoKGVycm9yJDUpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSA9IG51bGw7XG4gICAgICAwIDwgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aFxuICAgICAgICA/ICgocXVldWUgPSBhZ2dyZWdhdGVFcnJvcnMoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGggPSAwKSxcbiAgICAgICAgICByZWplY3QocXVldWUpKVxuICAgICAgICA6IHJlc29sdmUocmV0dXJuVmFsdWUpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmbHVzaEFjdFF1ZXVlKHF1ZXVlKSB7XG4gICAgICBpZiAoIWlzRmx1c2hpbmcpIHtcbiAgICAgICAgaXNGbHVzaGluZyA9ICEwO1xuICAgICAgICB2YXIgaSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yICg7IGkgPCBxdWV1ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGNhbGxiYWNrID0gcXVldWVbaV07XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLmRpZFVzZVByb21pc2UgPSAhMTtcbiAgICAgICAgICAgICAgdmFyIGNvbnRpbnVhdGlvbiA9IGNhbGxiYWNrKCExKTtcbiAgICAgICAgICAgICAgaWYgKG51bGwgIT09IGNvbnRpbnVhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChSZWFjdFNoYXJlZEludGVybmFscy5kaWRVc2VQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICBxdWV1ZVtpXSA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgICAgICAgcXVldWUuc3BsaWNlKDAsIGkpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNvbnRpbnVhdGlvbjtcbiAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xuICAgICAgICAgICAgfSB3aGlsZSAoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yJDYpIHtcbiAgICAgICAgICBxdWV1ZS5zcGxpY2UoMCwgaSArIDEpLFxuICAgICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IkNik7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgaXNGbHVzaGluZyA9ICExO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFwidW5kZWZpbmVkXCIgIT09IHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18gJiZcbiAgICAgIFwiZnVuY3Rpb25cIiA9PT1cbiAgICAgICAgdHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RhcnQoRXJyb3IoKSk7XG4gICAgdmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudFwiKSxcbiAgICAgIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxcbiAgICAgIFJFQUNUX0ZSQUdNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIiksXG4gICAgICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLFxuICAgICAgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKTtcbiAgICBTeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIik7XG4gICAgdmFyIFJFQUNUX0NPTlNVTUVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29uc3VtZXJcIiksXG4gICAgICBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxcbiAgICAgIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksXG4gICAgICBSRUFDVF9TVVNQRU5TRV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlXCIpLFxuICAgICAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIiksXG4gICAgICBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKSxcbiAgICAgIFJFQUNUX0xBWllfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5sYXp5XCIpLFxuICAgICAgUkVBQ1RfT0ZGU0NSRUVOX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpLFxuICAgICAgTUFZQkVfSVRFUkFUT1JfU1lNQk9MID0gU3ltYm9sLml0ZXJhdG9yLFxuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPSB7XG4gICAgICAgIEg6IG51bGwsXG4gICAgICAgIEE6IG51bGwsXG4gICAgICAgIFQ6IG51bGwsXG4gICAgICAgIFM6IG51bGwsXG4gICAgICAgIGFjdFF1ZXVlOiBudWxsLFxuICAgICAgICBpc0JhdGNoaW5nTGVnYWN5OiAhMSxcbiAgICAgICAgZGlkU2NoZWR1bGVMZWdhY3lVcGRhdGU6ICExLFxuICAgICAgICBkaWRVc2VQcm9taXNlOiAhMSxcbiAgICAgICAgdGhyb3duRXJyb3JzOiBbXSxcbiAgICAgICAgZ2V0Q3VycmVudFN0YWNrOiBudWxsXG4gICAgICB9LFxuICAgICAgZGlkV2FyblN0YXRlVXBkYXRlRm9yVW5tb3VudGVkQ29tcG9uZW50ID0ge30sXG4gICAgICBSZWFjdE5vb3BVcGRhdGVRdWV1ZSA9IHtcbiAgICAgICAgaXNNb3VudGVkOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICB9LFxuICAgICAgICBlbnF1ZXVlRm9yY2VVcGRhdGU6IGZ1bmN0aW9uIChwdWJsaWNJbnN0YW5jZSkge1xuICAgICAgICAgIHdhcm5Ob29wKHB1YmxpY0luc3RhbmNlLCBcImZvcmNlVXBkYXRlXCIpO1xuICAgICAgICB9LFxuICAgICAgICBlbnF1ZXVlUmVwbGFjZVN0YXRlOiBmdW5jdGlvbiAocHVibGljSW5zdGFuY2UpIHtcbiAgICAgICAgICB3YXJuTm9vcChwdWJsaWNJbnN0YW5jZSwgXCJyZXBsYWNlU3RhdGVcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGVucXVldWVTZXRTdGF0ZTogZnVuY3Rpb24gKHB1YmxpY0luc3RhbmNlKSB7XG4gICAgICAgICAgd2Fybk5vb3AocHVibGljSW5zdGFuY2UsIFwic2V0U3RhdGVcIik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduLFxuICAgICAgZW1wdHlPYmplY3QgPSB7fTtcbiAgICBPYmplY3QuZnJlZXplKGVtcHR5T2JqZWN0KTtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQgPSB7fTtcbiAgICBDb21wb25lbnQucHJvdG90eXBlLnNldFN0YXRlID0gZnVuY3Rpb24gKHBhcnRpYWxTdGF0ZSwgY2FsbGJhY2spIHtcbiAgICAgIGlmIChcbiAgICAgICAgXCJvYmplY3RcIiAhPT0gdHlwZW9mIHBhcnRpYWxTdGF0ZSAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgIT09IHR5cGVvZiBwYXJ0aWFsU3RhdGUgJiZcbiAgICAgICAgbnVsbCAhPSBwYXJ0aWFsU3RhdGVcbiAgICAgIClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJ0YWtlcyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzIHRvIHVwZGF0ZSBvciBhIGZ1bmN0aW9uIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IG9mIHN0YXRlIHZhcmlhYmxlcy5cIlxuICAgICAgICApO1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVTZXRTdGF0ZSh0aGlzLCBwYXJ0aWFsU3RhdGUsIGNhbGxiYWNrLCBcInNldFN0YXRlXCIpO1xuICAgIH07XG4gICAgQ29tcG9uZW50LnByb3RvdHlwZS5mb3JjZVVwZGF0ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgdGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzLCBjYWxsYmFjaywgXCJmb3JjZVVwZGF0ZVwiKTtcbiAgICB9O1xuICAgIHZhciBkZXByZWNhdGVkQVBJcyA9IHtcbiAgICAgICAgaXNNb3VudGVkOiBbXG4gICAgICAgICAgXCJpc01vdW50ZWRcIixcbiAgICAgICAgICBcIkluc3RlYWQsIG1ha2Ugc3VyZSB0byBjbGVhbiB1cCBzdWJzY3JpcHRpb25zIGFuZCBwZW5kaW5nIHJlcXVlc3RzIGluIGNvbXBvbmVudFdpbGxVbm1vdW50IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLlwiXG4gICAgICAgIF0sXG4gICAgICAgIHJlcGxhY2VTdGF0ZTogW1xuICAgICAgICAgIFwicmVwbGFjZVN0YXRlXCIsXG4gICAgICAgICAgXCJSZWZhY3RvciB5b3VyIGNvZGUgdG8gdXNlIHNldFN0YXRlIGluc3RlYWQgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QvaXNzdWVzLzMyMzYpLlwiXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICBmbk5hbWU7XG4gICAgZm9yIChmbk5hbWUgaW4gZGVwcmVjYXRlZEFQSXMpXG4gICAgICBkZXByZWNhdGVkQVBJcy5oYXNPd25Qcm9wZXJ0eShmbk5hbWUpICYmXG4gICAgICAgIGRlZmluZURlcHJlY2F0aW9uV2FybmluZyhmbk5hbWUsIGRlcHJlY2F0ZWRBUElzW2ZuTmFtZV0pO1xuICAgIENvbXBvbmVudER1bW15LnByb3RvdHlwZSA9IENvbXBvbmVudC5wcm90b3R5cGU7XG4gICAgZGVwcmVjYXRlZEFQSXMgPSBQdXJlQ29tcG9uZW50LnByb3RvdHlwZSA9IG5ldyBDb21wb25lbnREdW1teSgpO1xuICAgIGRlcHJlY2F0ZWRBUElzLmNvbnN0cnVjdG9yID0gUHVyZUNvbXBvbmVudDtcbiAgICBhc3NpZ24oZGVwcmVjYXRlZEFQSXMsIENvbXBvbmVudC5wcm90b3R5cGUpO1xuICAgIGRlcHJlY2F0ZWRBUElzLmlzUHVyZVJlYWN0Q29tcG9uZW50ID0gITA7XG4gICAgdmFyIGlzQXJyYXlJbXBsID0gQXJyYXkuaXNBcnJheSxcbiAgICAgIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UkMiA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpLFxuICAgICAgaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIiksXG4gICAgICBkaXNhYmxlZERlcHRoID0gMCxcbiAgICAgIHByZXZMb2csXG4gICAgICBwcmV2SW5mbyxcbiAgICAgIHByZXZXYXJuLFxuICAgICAgcHJldkVycm9yLFxuICAgICAgcHJldkdyb3VwLFxuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkLFxuICAgICAgcHJldkdyb3VwRW5kO1xuICAgIGRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9ICEwO1xuICAgIHZhciBwcmVmaXgsXG4gICAgICByZWVudHJ5ID0gITE7XG4gICAgdmFyIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgKFxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXBcbiAgICApKCk7XG4gICAgdmFyIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKSxcbiAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duLFxuICAgICAgZGlkV2FybkFib3V0T2xkSlNYUnVudGltZTtcbiAgICB2YXIgZGlkV2FybkFib3V0RWxlbWVudFJlZiA9IHt9O1xuICAgIHZhciBvd25lckhhc0tleVVzZVdhcm5pbmcgPSB7fSxcbiAgICAgIGRpZFdhcm5BYm91dE1hcHMgPSAhMSxcbiAgICAgIHVzZXJQcm92aWRlZEtleUVzY2FwZVJlZ2V4ID0gL1xcLysvZyxcbiAgICAgIHJlcG9ydEdsb2JhbEVycm9yID1cbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcmVwb3J0RXJyb3JcbiAgICAgICAgICA/IHJlcG9ydEVycm9yXG4gICAgICAgICAgOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB3aW5kb3cgJiZcbiAgICAgICAgICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB3aW5kb3cuRXJyb3JFdmVudFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB2YXIgZXZlbnQgPSBuZXcgd2luZG93LkVycm9yRXZlbnQoXCJlcnJvclwiLCB7XG4gICAgICAgICAgICAgICAgICBidWJibGVzOiAhMCxcbiAgICAgICAgICAgICAgICAgIGNhbmNlbGFibGU6ICEwLFxuICAgICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIGVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgIG51bGwgIT09IGVycm9yICYmXG4gICAgICAgICAgICAgICAgICAgIFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgICAgPyBTdHJpbmcoZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KSkgcmV0dXJuO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBwcm9jZXNzICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcHJvY2Vzcy5lbWl0XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZW1pdChcInVuY2F1Z2h0RXhjZXB0aW9uXCIsIGVycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9LFxuICAgICAgZGlkV2FybkFib3V0TWVzc2FnZUNoYW5uZWwgPSAhMSxcbiAgICAgIGVucXVldWVUYXNrSW1wbCA9IG51bGwsXG4gICAgICBhY3RTY29wZURlcHRoID0gMCxcbiAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0ID0gITEsXG4gICAgICBpc0ZsdXNoaW5nID0gITEsXG4gICAgICBxdWV1ZVNldmVyYWxNaWNyb3Rhc2tzID1cbiAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgcXVldWVNaWNyb3Rhc2tcbiAgICAgICAgICA/IGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICBxdWV1ZU1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHF1ZXVlTWljcm90YXNrKGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBlbnF1ZXVlVGFzaztcbiAgICBleHBvcnRzLkNoaWxkcmVuID0ge1xuICAgICAgbWFwOiBtYXBDaGlsZHJlbixcbiAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIChjaGlsZHJlbiwgZm9yRWFjaEZ1bmMsIGZvckVhY2hDb250ZXh0KSB7XG4gICAgICAgIG1hcENoaWxkcmVuKFxuICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGZvckVhY2hGdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmb3JFYWNoQ29udGV4dFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGNvdW50OiBmdW5jdGlvbiAoY2hpbGRyZW4pIHtcbiAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICBtYXBDaGlsZHJlbihjaGlsZHJlbiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIG4rKztcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuO1xuICAgICAgfSxcbiAgICAgIHRvQXJyYXk6IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG1hcENoaWxkcmVuKGNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiBjaGlsZDtcbiAgICAgICAgICB9KSB8fCBbXVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIG9ubHk6IGZ1bmN0aW9uIChjaGlsZHJlbikge1xuICAgICAgICBpZiAoIWlzVmFsaWRFbGVtZW50KGNoaWxkcmVuKSlcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuXCJcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gY2hpbGRyZW47XG4gICAgICB9XG4gICAgfTtcbiAgICBleHBvcnRzLkNvbXBvbmVudCA9IENvbXBvbmVudDtcbiAgICBleHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbiAgICBleHBvcnRzLlByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcbiAgICBleHBvcnRzLlB1cmVDb21wb25lbnQgPSBQdXJlQ29tcG9uZW50O1xuICAgIGV4cG9ydHMuU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG4gICAgZXhwb3J0cy5TdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG4gICAgZXhwb3J0cy5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUgPVxuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHM7XG4gICAgZXhwb3J0cy5hY3QgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgIHZhciBwcmV2QWN0UXVldWUgPSBSZWFjdFNoYXJlZEludGVybmFscy5hY3RRdWV1ZSxcbiAgICAgICAgcHJldkFjdFNjb3BlRGVwdGggPSBhY3RTY29wZURlcHRoO1xuICAgICAgYWN0U2NvcGVEZXB0aCsrO1xuICAgICAgdmFyIHF1ZXVlID0gKFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlID1cbiAgICAgICAgICBudWxsICE9PSBwcmV2QWN0UXVldWUgPyBwcmV2QWN0UXVldWUgOiBbXSksXG4gICAgICAgIGRpZEF3YWl0QWN0Q2FsbCA9ICExO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGNhbGxiYWNrKCk7XG4gICAgICB9IGNhdGNoIChlcnJvciQzKSB7XG4gICAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5wdXNoKGVycm9yJDMpO1xuICAgICAgfVxuICAgICAgaWYgKDAgPCBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgKHBvcEFjdFNjb3BlKHByZXZBY3RRdWV1ZSwgcHJldkFjdFNjb3BlRGVwdGgpLFxuICAgICAgICAgIChjYWxsYmFjayA9IGFnZ3JlZ2F0ZUVycm9ycyhSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMpKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aCA9IDApLFxuICAgICAgICAgIGNhbGxiYWNrKVxuICAgICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBudWxsICE9PSByZXN1bHQgJiZcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIHJlc3VsdCAmJlxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiByZXN1bHQudGhlblxuICAgICAgKSB7XG4gICAgICAgIHZhciB0aGVuYWJsZSA9IHJlc3VsdDtcbiAgICAgICAgcXVldWVTZXZlcmFsTWljcm90YXNrcyhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZGlkQXdhaXRBY3RDYWxsIHx8XG4gICAgICAgICAgICBkaWRXYXJuTm9Bd2FpdEFjdCB8fFxuICAgICAgICAgICAgKChkaWRXYXJuTm9Bd2FpdEFjdCA9ICEwKSxcbiAgICAgICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgICBcIllvdSBjYWxsZWQgYWN0KGFzeW5jICgpID0+IC4uLikgd2l0aG91dCBhd2FpdC4gVGhpcyBjb3VsZCBsZWFkIHRvIHVuZXhwZWN0ZWQgdGVzdGluZyBiZWhhdmlvdXIsIGludGVybGVhdmluZyBtdWx0aXBsZSBhY3QgY2FsbHMgYW5kIG1peGluZyB0aGVpciBzY29wZXMuIFlvdSBzaG91bGQgLSBhd2FpdCBhY3QoYXN5bmMgKCkgPT4gLi4uKTtcIlxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHRoZW46IGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICAgIGRpZEF3YWl0QWN0Q2FsbCA9ICEwO1xuICAgICAgICAgICAgdGhlbmFibGUudGhlbihcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKHJldHVyblZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFF1ZXVlLCBwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICAgICAgaWYgKDAgPT09IHByZXZBY3RTY29wZURlcHRoKSB7XG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBmbHVzaEFjdFF1ZXVlKHF1ZXVlKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yJDQpIHtcbiAgICAgICAgICAgICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLnB1c2goZXJyb3IkNCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBpZiAoMCA8IFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIF90aHJvd25FcnJvciA9IGFnZ3JlZ2F0ZUVycm9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChfdGhyb3duRXJyb3IpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFF1ZXVlLCBwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAgICAgICAgICAgMCA8IFJlYWN0U2hhcmVkSW50ZXJuYWxzLnRocm93bkVycm9ycy5sZW5ndGhcbiAgICAgICAgICAgICAgICAgID8gKChlcnJvciA9IGFnZ3JlZ2F0ZUVycm9ycyhcbiAgICAgICAgICAgICAgICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgKSksXG4gICAgICAgICAgICAgICAgICAgIChSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMubGVuZ3RoID0gMCksXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnJvcikpXG4gICAgICAgICAgICAgICAgICA6IHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdmFyIHJldHVyblZhbHVlJGpzY29tcCQwID0gcmVzdWx0O1xuICAgICAgcG9wQWN0U2NvcGUocHJldkFjdFF1ZXVlLCBwcmV2QWN0U2NvcGVEZXB0aCk7XG4gICAgICAwID09PSBwcmV2QWN0U2NvcGVEZXB0aCAmJlxuICAgICAgICAoZmx1c2hBY3RRdWV1ZShxdWV1ZSksXG4gICAgICAgIDAgIT09IHF1ZXVlLmxlbmd0aCAmJlxuICAgICAgICAgIHF1ZXVlU2V2ZXJhbE1pY3JvdGFza3MoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZGlkQXdhaXRBY3RDYWxsIHx8XG4gICAgICAgICAgICAgIGRpZFdhcm5Ob0F3YWl0QWN0IHx8XG4gICAgICAgICAgICAgICgoZGlkV2Fybk5vQXdhaXRBY3QgPSAhMCksXG4gICAgICAgICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgICAgIFwiQSBjb21wb25lbnQgc3VzcGVuZGVkIGluc2lkZSBhbiBgYWN0YCBzY29wZSwgYnV0IHRoZSBgYWN0YCBjYWxsIHdhcyBub3QgYXdhaXRlZC4gV2hlbiB0ZXN0aW5nIFJlYWN0IGNvbXBvbmVudHMgdGhhdCBkZXBlbmQgb24gYXN5bmNocm9ub3VzIGRhdGEsIHlvdSBtdXN0IGF3YWl0IHRoZSByZXN1bHQ6XFxuXFxuYXdhaXQgYWN0KCgpID0+IC4uLilcIlxuICAgICAgICAgICAgICApKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLmFjdFF1ZXVlID0gbnVsbCkpO1xuICAgICAgaWYgKDAgPCBSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMubGVuZ3RoKVxuICAgICAgICB0aHJvdyAoXG4gICAgICAgICAgKChjYWxsYmFjayA9IGFnZ3JlZ2F0ZUVycm9ycyhSZWFjdFNoYXJlZEludGVybmFscy50aHJvd25FcnJvcnMpKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMudGhyb3duRXJyb3JzLmxlbmd0aCA9IDApLFxuICAgICAgICAgIGNhbGxiYWNrKVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGhlbjogZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGRpZEF3YWl0QWN0Q2FsbCA9ICEwO1xuICAgICAgICAgIDAgPT09IHByZXZBY3RTY29wZURlcHRoXG4gICAgICAgICAgICA/ICgoUmVhY3RTaGFyZWRJbnRlcm5hbHMuYWN0UXVldWUgPSBxdWV1ZSksXG4gICAgICAgICAgICAgIGVucXVldWVUYXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzaXZlbHlGbHVzaEFzeW5jQWN0V29yayhcbiAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlJGpzY29tcCQwLFxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgOiByZXNvbHZlKHJldHVyblZhbHVlJGpzY29tcCQwKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIGV4cG9ydHMuY2FjaGUgPSBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmbi5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGV4cG9ydHMuY2xvbmVFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNvbmZpZywgY2hpbGRyZW4pIHtcbiAgICAgIGlmIChudWxsID09PSBlbGVtZW50IHx8IHZvaWQgMCA9PT0gZWxlbWVudClcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJUaGUgYXJndW1lbnQgbXVzdCBiZSBhIFJlYWN0IGVsZW1lbnQsIGJ1dCB5b3UgcGFzc2VkIFwiICtcbiAgICAgICAgICAgIGVsZW1lbnQgK1xuICAgICAgICAgICAgXCIuXCJcbiAgICAgICAgKTtcbiAgICAgIHZhciBwcm9wcyA9IGFzc2lnbih7fSwgZWxlbWVudC5wcm9wcyksXG4gICAgICAgIGtleSA9IGVsZW1lbnQua2V5LFxuICAgICAgICBvd25lciA9IGVsZW1lbnQuX293bmVyO1xuICAgICAgaWYgKG51bGwgIT0gY29uZmlnKVxuICAgICAgICBmb3IgKHByb3BOYW1lIGluIChoYXNWYWxpZFJlZihjb25maWcpICYmIChvd25lciA9IGdldE93bmVyKCkpLFxuICAgICAgICBoYXNWYWxpZEtleShjb25maWcpICYmXG4gICAgICAgICAgKGNoZWNrS2V5U3RyaW5nQ29lcmNpb24oY29uZmlnLmtleSksIChrZXkgPSBcIlwiICsgY29uZmlnLmtleSkpLFxuICAgICAgICBjb25maWcpKVxuICAgICAgICAgICFoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgcHJvcE5hbWUpIHx8XG4gICAgICAgICAgICBcImtleVwiID09PSBwcm9wTmFtZSB8fFxuICAgICAgICAgICAgXCJfX3NlbGZcIiA9PT0gcHJvcE5hbWUgfHxcbiAgICAgICAgICAgIFwiX19zb3VyY2VcIiA9PT0gcHJvcE5hbWUgfHxcbiAgICAgICAgICAgIChcInJlZlwiID09PSBwcm9wTmFtZSAmJiB2b2lkIDAgPT09IGNvbmZpZy5yZWYpIHx8XG4gICAgICAgICAgICAocHJvcHNbcHJvcE5hbWVdID0gY29uZmlnW3Byb3BOYW1lXSk7XG4gICAgICB2YXIgcHJvcE5hbWUgPSBhcmd1bWVudHMubGVuZ3RoIC0gMjtcbiAgICAgIGlmICgxID09PSBwcm9wTmFtZSkgcHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgIGVsc2UgaWYgKDEgPCBwcm9wTmFtZSkge1xuICAgICAgICBmb3IgKHZhciBjaGlsZEFycmF5ID0gQXJyYXkocHJvcE5hbWUpLCBpID0gMDsgaSA8IHByb3BOYW1lOyBpKyspXG4gICAgICAgICAgY2hpbGRBcnJheVtpXSA9IGFyZ3VtZW50c1tpICsgMl07XG4gICAgICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgICAgIH1cbiAgICAgIHByb3BzID0gUmVhY3RFbGVtZW50KFxuICAgICAgICBlbGVtZW50LnR5cGUsXG4gICAgICAgIGtleSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIG93bmVyLFxuICAgICAgICBwcm9wc1xuICAgICAgKTtcbiAgICAgIGZvciAoa2V5ID0gMjsga2V5IDwgYXJndW1lbnRzLmxlbmd0aDsga2V5KyspXG4gICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGFyZ3VtZW50c1trZXldLCBwcm9wcy50eXBlKTtcbiAgICAgIHJldHVybiBwcm9wcztcbiAgICB9O1xuICAgIGV4cG9ydHMuY3JlYXRlQ29udGV4dCA9IGZ1bmN0aW9uIChkZWZhdWx0VmFsdWUpIHtcbiAgICAgIGRlZmF1bHRWYWx1ZSA9IHtcbiAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlRFWFRfVFlQRSxcbiAgICAgICAgX2N1cnJlbnRWYWx1ZTogZGVmYXVsdFZhbHVlLFxuICAgICAgICBfY3VycmVudFZhbHVlMjogZGVmYXVsdFZhbHVlLFxuICAgICAgICBfdGhyZWFkQ291bnQ6IDAsXG4gICAgICAgIFByb3ZpZGVyOiBudWxsLFxuICAgICAgICBDb25zdW1lcjogbnVsbFxuICAgICAgfTtcbiAgICAgIGRlZmF1bHRWYWx1ZS5Qcm92aWRlciA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIGRlZmF1bHRWYWx1ZS5Db25zdW1lciA9IHtcbiAgICAgICAgJCR0eXBlb2Y6IFJFQUNUX0NPTlNVTUVSX1RZUEUsXG4gICAgICAgIF9jb250ZXh0OiBkZWZhdWx0VmFsdWVcbiAgICAgIH07XG4gICAgICBkZWZhdWx0VmFsdWUuX2N1cnJlbnRSZW5kZXJlciA9IG51bGw7XG4gICAgICBkZWZhdWx0VmFsdWUuX2N1cnJlbnRSZW5kZXJlcjIgPSBudWxsO1xuICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9O1xuICAgIGV4cG9ydHMuY3JlYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0eXBlLCBjb25maWcsIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoaXNWYWxpZEVsZW1lbnRUeXBlKHR5cGUpKVxuICAgICAgICBmb3IgKHZhciBpID0gMjsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcbiAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhhcmd1bWVudHNbaV0sIHR5cGUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGkgPSBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdm9pZCAwID09PSB0eXBlIHx8XG4gICAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAwID09PSBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGgpXG4gICAgICAgIClcbiAgICAgICAgICBpICs9XG4gICAgICAgICAgICBcIiBZb3UgbGlrZWx5IGZvcmdvdCB0byBleHBvcnQgeW91ciBjb21wb25lbnQgZnJvbSB0aGUgZmlsZSBpdCdzIGRlZmluZWQgaW4sIG9yIHlvdSBtaWdodCBoYXZlIG1peGVkIHVwIGRlZmF1bHQgYW5kIG5hbWVkIGltcG9ydHMuXCI7XG4gICAgICAgIGlmIChudWxsID09PSB0eXBlKSB2YXIgdHlwZVN0cmluZyA9IFwibnVsbFwiO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgaXNBcnJheUltcGwodHlwZSlcbiAgICAgICAgICAgID8gKHR5cGVTdHJpbmcgPSBcImFycmF5XCIpXG4gICAgICAgICAgICA6IHZvaWQgMCAhPT0gdHlwZSAmJiB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbiAgICAgICAgICAgID8gKCh0eXBlU3RyaW5nID1cbiAgICAgICAgICAgICAgICBcIjxcIiArXG4gICAgICAgICAgICAgICAgKGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8IFwiVW5rbm93blwiKSArXG4gICAgICAgICAgICAgICAgXCIgLz5cIiksXG4gICAgICAgICAgICAgIChpID1cbiAgICAgICAgICAgICAgICBcIiBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50P1wiKSlcbiAgICAgICAgICAgIDogKHR5cGVTdHJpbmcgPSB0eXBlb2YgdHlwZSk7XG4gICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgIFwiUmVhY3QuY3JlYXRlRWxlbWVudDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiAlcy4lc1wiLFxuICAgICAgICAgIHR5cGVTdHJpbmcsXG4gICAgICAgICAgaVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaSA9IHt9O1xuICAgICAgdHlwZVN0cmluZyA9IG51bGw7XG4gICAgICBpZiAobnVsbCAhPSBjb25maWcpXG4gICAgICAgIGZvciAocHJvcE5hbWUgaW4gKGRpZFdhcm5BYm91dE9sZEpTWFJ1bnRpbWUgfHxcbiAgICAgICAgICAhKFwiX19zZWxmXCIgaW4gY29uZmlnKSB8fFxuICAgICAgICAgIFwia2V5XCIgaW4gY29uZmlnIHx8XG4gICAgICAgICAgKChkaWRXYXJuQWJvdXRPbGRKU1hSdW50aW1lID0gITApLFxuICAgICAgICAgIHdhcm4oXG4gICAgICAgICAgICBcIllvdXIgYXBwIChvciBvbmUgb2YgaXRzIGRlcGVuZGVuY2llcykgaXMgdXNpbmcgYW4gb3V0ZGF0ZWQgSlNYIHRyYW5zZm9ybS4gVXBkYXRlIHRvIHRoZSBtb2Rlcm4gSlNYIHRyYW5zZm9ybSBmb3IgZmFzdGVyIHBlcmZvcm1hbmNlOiBodHRwczovL3JlYWN0LmRldi9saW5rL25ldy1qc3gtdHJhbnNmb3JtXCJcbiAgICAgICAgICApKSxcbiAgICAgICAgaGFzVmFsaWRSZWYoY29uZmlnKSxcbiAgICAgICAgaGFzVmFsaWRLZXkoY29uZmlnKSAmJlxuICAgICAgICAgIChjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpLCAodHlwZVN0cmluZyA9IFwiXCIgKyBjb25maWcua2V5KSksXG4gICAgICAgIGNvbmZpZykpXG4gICAgICAgICAgaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIHByb3BOYW1lKSAmJlxuICAgICAgICAgICAgXCJrZXlcIiAhPT0gcHJvcE5hbWUgJiZcbiAgICAgICAgICAgIFwiX19zZWxmXCIgIT09IHByb3BOYW1lICYmXG4gICAgICAgICAgICBcIl9fc291cmNlXCIgIT09IHByb3BOYW1lICYmXG4gICAgICAgICAgICAoaVtwcm9wTmFtZV0gPSBjb25maWdbcHJvcE5hbWVdKTtcbiAgICAgIHZhciBjaGlsZHJlbkxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggLSAyO1xuICAgICAgaWYgKDEgPT09IGNoaWxkcmVuTGVuZ3RoKSBpLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICBlbHNlIGlmICgxIDwgY2hpbGRyZW5MZW5ndGgpIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICB2YXIgY2hpbGRBcnJheSA9IEFycmF5KGNoaWxkcmVuTGVuZ3RoKSwgX2kgPSAwO1xuICAgICAgICAgIF9pIDwgY2hpbGRyZW5MZW5ndGg7XG4gICAgICAgICAgX2krK1xuICAgICAgICApXG4gICAgICAgICAgY2hpbGRBcnJheVtfaV0gPSBhcmd1bWVudHNbX2kgKyAyXTtcbiAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKGNoaWxkQXJyYXkpO1xuICAgICAgICBpLmNoaWxkcmVuID0gY2hpbGRBcnJheTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzKVxuICAgICAgICBmb3IgKHByb3BOYW1lIGluICgoY2hpbGRyZW5MZW5ndGggPSB0eXBlLmRlZmF1bHRQcm9wcyksIGNoaWxkcmVuTGVuZ3RoKSlcbiAgICAgICAgICB2b2lkIDAgPT09IGlbcHJvcE5hbWVdICYmIChpW3Byb3BOYW1lXSA9IGNoaWxkcmVuTGVuZ3RoW3Byb3BOYW1lXSk7XG4gICAgICBpZiAodHlwZVN0cmluZykge1xuICAgICAgICB2YXIgcHJvcE5hbWUgPVxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGVcbiAgICAgICAgICAgID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgXCJVbmtub3duXCJcbiAgICAgICAgICAgIDogdHlwZTtcbiAgICAgICAgdHlwZVN0cmluZyAmJiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihpLCBwcm9wTmFtZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gUmVhY3RFbGVtZW50KFxuICAgICAgICB0eXBlLFxuICAgICAgICB0eXBlU3RyaW5nLFxuICAgICAgICBudWxsLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgZ2V0T3duZXIoKSxcbiAgICAgICAgaVxuICAgICAgKTtcbiAgICB9O1xuICAgIGV4cG9ydHMuY3JlYXRlUmVmID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHJlZk9iamVjdCA9IHsgY3VycmVudDogbnVsbCB9O1xuICAgICAgT2JqZWN0LnNlYWwocmVmT2JqZWN0KTtcbiAgICAgIHJldHVybiByZWZPYmplY3Q7XG4gICAgfTtcbiAgICBleHBvcnRzLmZvcndhcmRSZWYgPSBmdW5jdGlvbiAocmVuZGVyKSB7XG4gICAgICBudWxsICE9IHJlbmRlciAmJiByZW5kZXIuJCR0eXBlb2YgPT09IFJFQUNUX01FTU9fVFlQRVxuICAgICAgICA/IGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgXCJmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCByZWNlaXZlZCBhIGBtZW1vYCBjb21wb25lbnQuIEluc3RlYWQgb2YgZm9yd2FyZFJlZihtZW1vKC4uLikpLCB1c2UgbWVtbyhmb3J3YXJkUmVmKC4uLikpLlwiXG4gICAgICAgICAgKVxuICAgICAgICA6IFwiZnVuY3Rpb25cIiAhPT0gdHlwZW9mIHJlbmRlclxuICAgICAgICA/IGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgICAgXCJmb3J3YXJkUmVmIHJlcXVpcmVzIGEgcmVuZGVyIGZ1bmN0aW9uIGJ1dCB3YXMgZ2l2ZW4gJXMuXCIsXG4gICAgICAgICAgICBudWxsID09PSByZW5kZXIgPyBcIm51bGxcIiA6IHR5cGVvZiByZW5kZXJcbiAgICAgICAgICApXG4gICAgICAgIDogMCAhPT0gcmVuZGVyLmxlbmd0aCAmJlxuICAgICAgICAgIDIgIT09IHJlbmRlci5sZW5ndGggJiZcbiAgICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICAgIFwiZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGFjY2VwdCBleGFjdGx5IHR3byBwYXJhbWV0ZXJzOiBwcm9wcyBhbmQgcmVmLiAlc1wiLFxuICAgICAgICAgICAgMSA9PT0gcmVuZGVyLmxlbmd0aFxuICAgICAgICAgICAgICA/IFwiRGlkIHlvdSBmb3JnZXQgdG8gdXNlIHRoZSByZWYgcGFyYW1ldGVyP1wiXG4gICAgICAgICAgICAgIDogXCJBbnkgYWRkaXRpb25hbCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQuXCJcbiAgICAgICAgICApO1xuICAgICAgbnVsbCAhPSByZW5kZXIgJiZcbiAgICAgICAgbnVsbCAhPSByZW5kZXIuZGVmYXVsdFByb3BzICYmXG4gICAgICAgIGVycm9yJGpzY29tcCQwKFxuICAgICAgICAgIFwiZm9yd2FyZFJlZiByZW5kZXIgZnVuY3Rpb25zIGRvIG5vdCBzdXBwb3J0IGRlZmF1bHRQcm9wcy4gRGlkIHlvdSBhY2NpZGVudGFsbHkgcGFzcyBhIFJlYWN0IGNvbXBvbmVudD9cIlxuICAgICAgICApO1xuICAgICAgdmFyIGVsZW1lbnRUeXBlID0geyAkJHR5cGVvZjogUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSwgcmVuZGVyOiByZW5kZXIgfSxcbiAgICAgICAgb3duTmFtZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlbGVtZW50VHlwZSwgXCJkaXNwbGF5TmFtZVwiLCB7XG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gb3duTmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgICAgICAgIG93bk5hbWUgPSBuYW1lO1xuICAgICAgICAgIHJlbmRlci5uYW1lIHx8XG4gICAgICAgICAgICByZW5kZXIuZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICAgIChPYmplY3QuZGVmaW5lUHJvcGVydHkocmVuZGVyLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KSxcbiAgICAgICAgICAgIChyZW5kZXIuZGlzcGxheU5hbWUgPSBuYW1lKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGVsZW1lbnRUeXBlO1xuICAgIH07XG4gICAgZXhwb3J0cy5pc1ZhbGlkRWxlbWVudCA9IGlzVmFsaWRFbGVtZW50O1xuICAgIGV4cG9ydHMubGF6eSA9IGZ1bmN0aW9uIChjdG9yKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfTEFaWV9UWVBFLFxuICAgICAgICBfcGF5bG9hZDogeyBfc3RhdHVzOiAtMSwgX3Jlc3VsdDogY3RvciB9LFxuICAgICAgICBfaW5pdDogbGF6eUluaXRpYWxpemVyXG4gICAgICB9O1xuICAgIH07XG4gICAgZXhwb3J0cy5tZW1vID0gZnVuY3Rpb24gKHR5cGUsIGNvbXBhcmUpIHtcbiAgICAgIGlzVmFsaWRFbGVtZW50VHlwZSh0eXBlKSB8fFxuICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICBcIm1lbW86IFRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgY29tcG9uZW50LiBJbnN0ZWFkIHJlY2VpdmVkOiAlc1wiLFxuICAgICAgICAgIG51bGwgPT09IHR5cGUgPyBcIm51bGxcIiA6IHR5cGVvZiB0eXBlXG4gICAgICAgICk7XG4gICAgICBjb21wYXJlID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfTUVNT19UWVBFLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBjb21wYXJlOiB2b2lkIDAgPT09IGNvbXBhcmUgPyBudWxsIDogY29tcGFyZVxuICAgICAgfTtcbiAgICAgIHZhciBvd25OYW1lO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbXBhcmUsIFwiZGlzcGxheU5hbWVcIiwge1xuICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG93bk5hbWU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5hbWUpIHtcbiAgICAgICAgICBvd25OYW1lID0gbmFtZTtcbiAgICAgICAgICB0eXBlLm5hbWUgfHxcbiAgICAgICAgICAgIHR5cGUuZGlzcGxheU5hbWUgfHxcbiAgICAgICAgICAgIChPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSksXG4gICAgICAgICAgICAodHlwZS5kaXNwbGF5TmFtZSA9IG5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29tcGFyZTtcbiAgICB9O1xuICAgIGV4cG9ydHMuc3RhcnRUcmFuc2l0aW9uID0gZnVuY3Rpb24gKHNjb3BlKSB7XG4gICAgICB2YXIgcHJldlRyYW5zaXRpb24gPSBSZWFjdFNoYXJlZEludGVybmFscy5ULFxuICAgICAgICB0cmFuc2l0aW9uID0ge307XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5UID0gdHJhbnNpdGlvbjtcbiAgICAgIHZhciBjdXJyZW50VHJhbnNpdGlvbiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQ7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5ULl91cGRhdGVkRmliZXJzID0gbmV3IFNldCgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJldHVyblZhbHVlID0gc2NvcGUoKSxcbiAgICAgICAgICBvblN0YXJ0VHJhbnNpdGlvbkZpbmlzaCA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLlM7XG4gICAgICAgIG51bGwgIT09IG9uU3RhcnRUcmFuc2l0aW9uRmluaXNoICYmXG4gICAgICAgICAgb25TdGFydFRyYW5zaXRpb25GaW5pc2godHJhbnNpdGlvbiwgcmV0dXJuVmFsdWUpO1xuICAgICAgICBcIm9iamVjdFwiID09PSB0eXBlb2YgcmV0dXJuVmFsdWUgJiZcbiAgICAgICAgICBudWxsICE9PSByZXR1cm5WYWx1ZSAmJlxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHJldHVyblZhbHVlLnRoZW4gJiZcbiAgICAgICAgICByZXR1cm5WYWx1ZS50aGVuKG5vb3AsIHJlcG9ydEdsb2JhbEVycm9yKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yJDIpIHtcbiAgICAgICAgcmVwb3J0R2xvYmFsRXJyb3IoZXJyb3IkMik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBudWxsID09PSBwcmV2VHJhbnNpdGlvbiAmJlxuICAgICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzICYmXG4gICAgICAgICAgKChzY29wZSA9IGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLnNpemUpLFxuICAgICAgICAgIGN1cnJlbnRUcmFuc2l0aW9uLl91cGRhdGVkRmliZXJzLmNsZWFyKCksXG4gICAgICAgICAgMTAgPCBzY29wZSAmJlxuICAgICAgICAgICAgd2FybihcbiAgICAgICAgICAgICAgXCJEZXRlY3RlZCBhIGxhcmdlIG51bWJlciBvZiB1cGRhdGVzIGluc2lkZSBzdGFydFRyYW5zaXRpb24uIElmIHRoaXMgaXMgZHVlIHRvIGEgc3Vic2NyaXB0aW9uIHBsZWFzZSByZS13cml0ZSBpdCB0byB1c2UgUmVhY3QgcHJvdmlkZWQgaG9va3MuIE90aGVyd2lzZSBjb25jdXJyZW50IG1vZGUgZ3VhcmFudGVlcyBhcmUgb2ZmIHRoZSB0YWJsZS5cIlxuICAgICAgICAgICAgKSksXG4gICAgICAgICAgKFJlYWN0U2hhcmVkSW50ZXJuYWxzLlQgPSBwcmV2VHJhbnNpdGlvbik7XG4gICAgICB9XG4gICAgfTtcbiAgICBleHBvcnRzLnVuc3RhYmxlX3VzZUNhY2hlUmVmcmVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZUNhY2hlUmVmcmVzaCgpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2UgPSBmdW5jdGlvbiAodXNhYmxlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2UodXNhYmxlKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlQWN0aW9uU3RhdGUgPSBmdW5jdGlvbiAoYWN0aW9uLCBpbml0aWFsU3RhdGUsIHBlcm1hbGluaykge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlQWN0aW9uU3RhdGUoXG4gICAgICAgIGFjdGlvbixcbiAgICAgICAgaW5pdGlhbFN0YXRlLFxuICAgICAgICBwZXJtYWxpbmtcbiAgICAgICk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUNhbGxiYWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VDYWxsYmFjayhjYWxsYmFjaywgZGVwcyk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUNvbnRleHQgPSBmdW5jdGlvbiAoQ29udGV4dCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSByZXNvbHZlRGlzcGF0Y2hlcigpO1xuICAgICAgQ29udGV4dC4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSAmJlxuICAgICAgICBlcnJvciRqc2NvbXAkMChcbiAgICAgICAgICBcIkNhbGxpbmcgdXNlQ29udGV4dChDb250ZXh0LkNvbnN1bWVyKSBpcyBub3Qgc3VwcG9ydGVkIGFuZCB3aWxsIGNhdXNlIGJ1Z3MuIERpZCB5b3UgbWVhbiB0byBjYWxsIHVzZUNvbnRleHQoQ29udGV4dCkgaW5zdGVhZD9cIlxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGRpc3BhdGNoZXIudXNlQ29udGV4dChDb250ZXh0KTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlRGVidWdWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgZm9ybWF0dGVyRm4pIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZURlYnVnVmFsdWUodmFsdWUsIGZvcm1hdHRlckZuKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlRGVmZXJyZWRWYWx1ZSA9IGZ1bmN0aW9uICh2YWx1ZSwgaW5pdGlhbFZhbHVlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VEZWZlcnJlZFZhbHVlKHZhbHVlLCBpbml0aWFsVmFsdWUpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VFZmZlY3QgPSBmdW5jdGlvbiAoY3JlYXRlLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VFZmZlY3QoY3JlYXRlLCBkZXBzKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VJZCgpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VJbXBlcmF0aXZlSGFuZGxlID0gZnVuY3Rpb24gKHJlZiwgY3JlYXRlLCBkZXBzKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VJbXBlcmF0aXZlSGFuZGxlKHJlZiwgY3JlYXRlLCBkZXBzKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlSW5zZXJ0aW9uRWZmZWN0ID0gZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlSW5zZXJ0aW9uRWZmZWN0KGNyZWF0ZSwgZGVwcyk7XG4gICAgfTtcbiAgICBleHBvcnRzLnVzZUxheW91dEVmZmVjdCA9IGZ1bmN0aW9uIChjcmVhdGUsIGRlcHMpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZUxheW91dEVmZmVjdChjcmVhdGUsIGRlcHMpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VNZW1vID0gZnVuY3Rpb24gKGNyZWF0ZSwgZGVwcykge1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXNwYXRjaGVyKCkudXNlTWVtbyhjcmVhdGUsIGRlcHMpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VPcHRpbWlzdGljID0gZnVuY3Rpb24gKHBhc3N0aHJvdWdoLCByZWR1Y2VyKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VPcHRpbWlzdGljKHBhc3N0aHJvdWdoLCByZWR1Y2VyKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlUmVkdWNlciA9IGZ1bmN0aW9uIChyZWR1Y2VyLCBpbml0aWFsQXJnLCBpbml0KSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VSZWR1Y2VyKHJlZHVjZXIsIGluaXRpYWxBcmcsIGluaXQpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VSZWYgPSBmdW5jdGlvbiAoaW5pdGlhbFZhbHVlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VSZWYoaW5pdGlhbFZhbHVlKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlU3RhdGUgPSBmdW5jdGlvbiAoaW5pdGlhbFN0YXRlKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3BhdGNoZXIoKS51c2VTdGF0ZShpbml0aWFsU3RhdGUpO1xuICAgIH07XG4gICAgZXhwb3J0cy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA9IGZ1bmN0aW9uIChcbiAgICAgIHN1YnNjcmliZSxcbiAgICAgIGdldFNuYXBzaG90LFxuICAgICAgZ2V0U2VydmVyU25hcHNob3RcbiAgICApIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIGdldFNuYXBzaG90LFxuICAgICAgICBnZXRTZXJ2ZXJTbmFwc2hvdFxuICAgICAgKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudXNlVHJhbnNpdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzcGF0Y2hlcigpLnVzZVRyYW5zaXRpb24oKTtcbiAgICB9O1xuICAgIGV4cG9ydHMudmVyc2lvbiA9IFwiMTkuMC4wLXJjLWZiOWE5MGZhNDgtMjAyNDA2MTRcIjtcbiAgICBcInVuZGVmaW5lZFwiICE9PSB0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fICYmXG4gICAgICBcImZ1bmN0aW9uXCIgPT09XG4gICAgICAgIHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18ucmVnaXN0ZXJJbnRlcm5hbE1vZHVsZVN0b3AgJiZcbiAgICAgIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5yZWdpc3RlckludGVybmFsTW9kdWxlU3RvcChFcnJvcigpKTtcbiAgfSkoKTtcbiIsCiAgICAiJ3VzZSBzdHJpY3QnO1xuXG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdwcm9kdWN0aW9uJykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vY2pzL3JlYWN0LnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QuZGV2ZWxvcG1lbnQuanMnKTtcbn1cbiIsCiAgICAiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGVycm9yKGZvcm1hdCkge1xuICAgICAgZm9yIChcbiAgICAgICAgdmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICBhcmdzID0gQXJyYXkoMSA8IF9sZW4yID8gX2xlbjIgLSAxIDogMCksXG4gICAgICAgICAgX2tleTIgPSAxO1xuICAgICAgICBfa2V5MiA8IF9sZW4yO1xuICAgICAgICBfa2V5MisrXG4gICAgICApXG4gICAgICAgIGFyZ3NbX2tleTIgLSAxXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICBfbGVuMiA9IGZvcm1hdDtcbiAgICAgIF9rZXkyID0gRXJyb3IoXCJyZWFjdC1zdGFjay10b3AtZnJhbWVcIik7XG4gICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgJiZcbiAgICAgICAgKChfa2V5MiA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLmdldEN1cnJlbnRTdGFjayhfa2V5MikpLFxuICAgICAgICBcIlwiICE9PSBfa2V5MiAmJiAoKF9sZW4yICs9IFwiJXNcIiksIChhcmdzID0gYXJncy5jb25jYXQoW19rZXkyXSkpKSk7XG4gICAgICBhcmdzLnVuc2hpZnQoX2xlbjIpO1xuICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LmNhbGwoY29uc29sZS5lcnJvciwgY29uc29sZSwgYXJncyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gICAgICBpZiAobnVsbCA9PSB0eXBlKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICByZXR1cm4gdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQyXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBudWxsO1xuICAgICAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlKSByZXR1cm4gdHlwZTtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiRnJhZ21lbnRcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJQb3J0YWxcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9QUk9GSUxFUl9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIlByb2ZpbGVyXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdHJpY3RNb2RlXCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdXNwZW5zZVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJTdXNwZW5zZUxpc3RcIjtcbiAgICAgIH1cbiAgICAgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSlcbiAgICAgICAgc3dpdGNoIChcbiAgICAgICAgICAoXCJudW1iZXJcIiA9PT0gdHlwZW9mIHR5cGUudGFnICYmXG4gICAgICAgICAgICBlcnJvcihcbiAgICAgICAgICAgICAgXCJSZWNlaXZlZCBhbiB1bmV4cGVjdGVkIG9iamVjdCBpbiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUoKS4gVGhpcyBpcyBsaWtlbHkgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICAgICApLFxuICAgICAgICAgIHR5cGUuJCR0eXBlb2YpXG4gICAgICAgICkge1xuICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuICh0eXBlLmRpc3BsYXlOYW1lIHx8IFwiQ29udGV4dFwiKSArIFwiLlByb3ZpZGVyXCI7XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05TVU1FUl9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuICh0eXBlLl9jb250ZXh0LmRpc3BsYXlOYW1lIHx8IFwiQ29udGV4dFwiKSArIFwiLkNvbnN1bWVyXCI7XG4gICAgICAgICAgY2FzZSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFOlxuICAgICAgICAgICAgdmFyIGlubmVyVHlwZSA9IHR5cGUucmVuZGVyO1xuICAgICAgICAgICAgdHlwZSA9IHR5cGUuZGlzcGxheU5hbWU7XG4gICAgICAgICAgICB0eXBlIHx8XG4gICAgICAgICAgICAgICgodHlwZSA9IGlubmVyVHlwZS5kaXNwbGF5TmFtZSB8fCBpbm5lclR5cGUubmFtZSB8fCBcIlwiKSxcbiAgICAgICAgICAgICAgKHR5cGUgPSBcIlwiICE9PSB0eXBlID8gXCJGb3J3YXJkUmVmKFwiICsgdHlwZSArIFwiKVwiIDogXCJGb3J3YXJkUmVmXCIpKTtcbiAgICAgICAgICAgIHJldHVybiB0eXBlO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgKGlubmVyVHlwZSA9IHR5cGUuZGlzcGxheU5hbWUgfHwgbnVsbCksXG4gICAgICAgICAgICAgIG51bGwgIT09IGlubmVyVHlwZVxuICAgICAgICAgICAgICAgID8gaW5uZXJUeXBlXG4gICAgICAgICAgICAgICAgOiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZS50eXBlKSB8fCBcIk1lbW9cIlxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcbiAgICAgICAgICAgIGlubmVyVHlwZSA9IHR5cGUuX3BheWxvYWQ7XG4gICAgICAgICAgICB0eXBlID0gdHlwZS5faW5pdDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJldHVybiBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZShpbm5lclR5cGUpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHgpIHt9XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgICAgIHJldHVybiBcIlwiICsgdmFsdWU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNoZWNrS2V5U3RyaW5nQ29lcmNpb24odmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSk7XG4gICAgICAgIHZhciBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSAhMTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gITA7XG4gICAgICB9XG4gICAgICBpZiAoSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0KVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPVxuICAgICAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJlxuICAgICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcgJiZcbiAgICAgICAgICAgICAgdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkgfHxcbiAgICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHxcbiAgICAgICAgICAgIFwiT2JqZWN0XCIpLFxuICAgICAgICAgIGVycm9yKFxuICAgICAgICAgICAgXCJUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLlwiLFxuICAgICAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0XG4gICAgICAgICAgKSxcbiAgICAgICAgICB0ZXN0U3RyaW5nQ29lcmNpb24odmFsdWUpXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRpc2FibGVkTG9nKCkge31cbiAgICBmdW5jdGlvbiBkaXNhYmxlTG9ncygpIHtcbiAgICAgIGlmICgwID09PSBkaXNhYmxlZERlcHRoKSB7XG4gICAgICAgIHByZXZMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgcHJldkluZm8gPSBjb25zb2xlLmluZm87XG4gICAgICAgIHByZXZXYXJuID0gY29uc29sZS53YXJuO1xuICAgICAgICBwcmV2RXJyb3IgPSBjb25zb2xlLmVycm9yO1xuICAgICAgICBwcmV2R3JvdXAgPSBjb25zb2xlLmdyb3VwO1xuICAgICAgICBwcmV2R3JvdXBDb2xsYXBzZWQgPSBjb25zb2xlLmdyb3VwQ29sbGFwc2VkO1xuICAgICAgICBwcmV2R3JvdXBFbmQgPSBjb25zb2xlLmdyb3VwRW5kO1xuICAgICAgICB2YXIgcHJvcHMgPSB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgICAgICB2YWx1ZTogZGlzYWJsZWRMb2csXG4gICAgICAgICAgd3JpdGFibGU6ICEwXG4gICAgICAgIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBpbmZvOiBwcm9wcyxcbiAgICAgICAgICBsb2c6IHByb3BzLFxuICAgICAgICAgIHdhcm46IHByb3BzLFxuICAgICAgICAgIGVycm9yOiBwcm9wcyxcbiAgICAgICAgICBncm91cDogcHJvcHMsXG4gICAgICAgICAgZ3JvdXBDb2xsYXBzZWQ6IHByb3BzLFxuICAgICAgICAgIGdyb3VwRW5kOiBwcm9wc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpc2FibGVkRGVwdGgrKztcbiAgICB9XG4gICAgZnVuY3Rpb24gcmVlbmFibGVMb2dzKCkge1xuICAgICAgZGlzYWJsZWREZXB0aC0tO1xuICAgICAgaWYgKDAgPT09IGRpc2FibGVkRGVwdGgpIHtcbiAgICAgICAgdmFyIHByb3BzID0geyBjb25maWd1cmFibGU6ICEwLCBlbnVtZXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwIH07XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNvbnNvbGUsIHtcbiAgICAgICAgICBsb2c6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZMb2cgfSksXG4gICAgICAgICAgaW5mbzogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkluZm8gfSksXG4gICAgICAgICAgd2FybjogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldldhcm4gfSksXG4gICAgICAgICAgZXJyb3I6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZFcnJvciB9KSxcbiAgICAgICAgICBncm91cDogYXNzaWduKHt9LCBwcm9wcywgeyB2YWx1ZTogcHJldkdyb3VwIH0pLFxuICAgICAgICAgIGdyb3VwQ29sbGFwc2VkOiBhc3NpZ24oe30sIHByb3BzLCB7IHZhbHVlOiBwcmV2R3JvdXBDb2xsYXBzZWQgfSksXG4gICAgICAgICAgZ3JvdXBFbmQ6IGFzc2lnbih7fSwgcHJvcHMsIHsgdmFsdWU6IHByZXZHcm91cEVuZCB9KVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIDAgPiBkaXNhYmxlZERlcHRoICYmXG4gICAgICAgIGVycm9yKFxuICAgICAgICAgIFwiZGlzYWJsZWREZXB0aCBmZWxsIGJlbG93IHplcm8uIFRoaXMgaXMgYSBidWcgaW4gUmVhY3QuIFBsZWFzZSBmaWxlIGFuIGlzc3VlLlwiXG4gICAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKG5hbWUpIHtcbiAgICAgIGlmICh2b2lkIDAgPT09IHByZWZpeClcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aHJvdyBFcnJvcigpO1xuICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgdmFyIG1hdGNoID0geC5zdGFjay50cmltKCkubWF0Y2goL1xcbiggKihhdCApPykvKTtcbiAgICAgICAgICBwcmVmaXggPSAobWF0Y2ggJiYgbWF0Y2hbMV0pIHx8IFwiXCI7XG4gICAgICAgIH1cbiAgICAgIHJldHVybiBcIlxcblwiICsgcHJlZml4ICsgbmFtZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVzY3JpYmVOYXRpdmVDb21wb25lbnRGcmFtZShmbiwgY29uc3RydWN0KSB7XG4gICAgICBpZiAoIWZuIHx8IHJlZW50cnkpIHJldHVybiBcIlwiO1xuICAgICAgdmFyIGZyYW1lID0gY29tcG9uZW50RnJhbWVDYWNoZS5nZXQoZm4pO1xuICAgICAgaWYgKHZvaWQgMCAhPT0gZnJhbWUpIHJldHVybiBmcmFtZTtcbiAgICAgIHJlZW50cnkgPSAhMDtcbiAgICAgIGZyYW1lID0gRXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7XG4gICAgICBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IHZvaWQgMDtcbiAgICAgIHZhciBwcmV2aW91c0Rpc3BhdGNoZXIgPSBudWxsO1xuICAgICAgcHJldmlvdXNEaXNwYXRjaGVyID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuSDtcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzLkggPSBudWxsO1xuICAgICAgZGlzYWJsZUxvZ3MoKTtcbiAgICAgIHZhciBSdW5JblJvb3RGcmFtZSA9IHtcbiAgICAgICAgRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChjb25zdHJ1Y3QpIHtcbiAgICAgICAgICAgICAgdmFyIEZha2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZha2UucHJvdG90eXBlLCBcInByb3BzXCIsIHtcbiAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBSZWZsZWN0ICYmIFJlZmxlY3QuY29uc3RydWN0KSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KEZha2UsIFtdKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoICh4KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgY29udHJvbCA9IHg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFJlZmxlY3QuY29uc3RydWN0KGZuLCBbXSwgRmFrZSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIEZha2UuY2FsbCgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHgkMCkge1xuICAgICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm4uY2FsbChGYWtlLnByb3RvdHlwZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoeCQxKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbCA9IHgkMTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAoRmFrZSA9IGZuKCkpICYmXG4gICAgICAgICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgRmFrZS5jYXRjaCAmJlxuICAgICAgICAgICAgICAgIEZha2UuY2F0Y2goZnVuY3Rpb24gKCkge30pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKHNhbXBsZSkge1xuICAgICAgICAgICAgaWYgKHNhbXBsZSAmJiBjb250cm9sICYmIFwic3RyaW5nXCIgPT09IHR5cGVvZiBzYW1wbGUuc3RhY2spXG4gICAgICAgICAgICAgIHJldHVybiBbc2FtcGxlLnN0YWNrLCBjb250cm9sLnN0YWNrXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtudWxsLCBudWxsXTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdC5kaXNwbGF5TmFtZSA9XG4gICAgICAgIFwiRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290XCI7XG4gICAgICB2YXIgbmFtZVByb3BEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgUnVuSW5Sb290RnJhbWUuRGV0ZXJtaW5lQ29tcG9uZW50RnJhbWVSb290LFxuICAgICAgICBcIm5hbWVcIlxuICAgICAgKTtcbiAgICAgIG5hbWVQcm9wRGVzY3JpcHRvciAmJlxuICAgICAgICBuYW1lUHJvcERlc2NyaXB0b3IuY29uZmlndXJhYmxlICYmXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcbiAgICAgICAgICBSdW5JblJvb3RGcmFtZS5EZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3QsXG4gICAgICAgICAgXCJuYW1lXCIsXG4gICAgICAgICAgeyB2YWx1ZTogXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIiB9XG4gICAgICAgICk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgX1J1bkluUm9vdEZyYW1lJERldGVyID1cbiAgICAgICAgICAgIFJ1bkluUm9vdEZyYW1lLkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdCgpLFxuICAgICAgICAgIHNhbXBsZVN0YWNrID0gX1J1bkluUm9vdEZyYW1lJERldGVyWzBdLFxuICAgICAgICAgIGNvbnRyb2xTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlclsxXTtcbiAgICAgICAgaWYgKHNhbXBsZVN0YWNrICYmIGNvbnRyb2xTdGFjaykge1xuICAgICAgICAgIHZhciBzYW1wbGVMaW5lcyA9IHNhbXBsZVN0YWNrLnNwbGl0KFwiXFxuXCIpLFxuICAgICAgICAgICAgY29udHJvbExpbmVzID0gY29udHJvbFN0YWNrLnNwbGl0KFwiXFxuXCIpO1xuICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICBzYW1wbGVTdGFjayA9IF9SdW5JblJvb3RGcmFtZSREZXRlciA9IDA7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgPCBzYW1wbGVMaW5lcy5sZW5ndGggJiZcbiAgICAgICAgICAgICFzYW1wbGVMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICBcIkRldGVybWluZUNvbXBvbmVudEZyYW1lUm9vdFwiXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgKVxuICAgICAgICAgICAgX1J1bkluUm9vdEZyYW1lJERldGVyKys7XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIHNhbXBsZVN0YWNrIDwgY29udHJvbExpbmVzLmxlbmd0aCAmJlxuICAgICAgICAgICAgIWNvbnRyb2xMaW5lc1tzYW1wbGVTdGFja10uaW5jbHVkZXMoXCJEZXRlcm1pbmVDb21wb25lbnRGcmFtZVJvb3RcIik7XG5cbiAgICAgICAgICApXG4gICAgICAgICAgICBzYW1wbGVTdGFjaysrO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9PT0gc2FtcGxlTGluZXMubGVuZ3RoIHx8XG4gICAgICAgICAgICBzYW1wbGVTdGFjayA9PT0gY29udHJvbExpbmVzLmxlbmd0aFxuICAgICAgICAgIClcbiAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgIF9SdW5JblJvb3RGcmFtZSREZXRlciA9IHNhbXBsZUxpbmVzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgICAgICAgc2FtcGxlU3RhY2sgPSBjb250cm9sTGluZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgMSA8PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgJiZcbiAgICAgICAgICAgICAgMCA8PSBzYW1wbGVTdGFjayAmJlxuICAgICAgICAgICAgICBzYW1wbGVMaW5lc1tfUnVuSW5Sb290RnJhbWUkRGV0ZXJdICE9PSBjb250cm9sTGluZXNbc2FtcGxlU3RhY2tdO1xuXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgIHNhbXBsZVN0YWNrLS07XG4gICAgICAgICAgZm9yIChcbiAgICAgICAgICAgIDtcbiAgICAgICAgICAgIDEgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyICYmIDAgPD0gc2FtcGxlU3RhY2s7XG4gICAgICAgICAgICBfUnVuSW5Sb290RnJhbWUkRGV0ZXItLSwgc2FtcGxlU3RhY2stLVxuICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgc2FtcGxlTGluZXNbX1J1bkluUm9vdEZyYW1lJERldGVyXSAhPT0gY29udHJvbExpbmVzW3NhbXBsZVN0YWNrXVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGlmICgxICE9PSBfUnVuSW5Sb290RnJhbWUkRGV0ZXIgfHwgMSAhPT0gc2FtcGxlU3RhY2spIHtcbiAgICAgICAgICAgICAgICBkb1xuICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAoX1J1bkluUm9vdEZyYW1lJERldGVyLS0sXG4gICAgICAgICAgICAgICAgICAgIHNhbXBsZVN0YWNrLS0sXG4gICAgICAgICAgICAgICAgICAgIDAgPiBzYW1wbGVTdGFjayB8fFxuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0gIT09XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sTGluZXNbc2FtcGxlU3RhY2tdKVxuICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBfZnJhbWUgPVxuICAgICAgICAgICAgICAgICAgICAgIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUxpbmVzW19SdW5JblJvb3RGcmFtZSREZXRlcl0ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IG5ldyBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIGF0IFwiXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgZm4uZGlzcGxheU5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICBfZnJhbWUuaW5jbHVkZXMoXCI8YW5vbnltb3VzPlwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgIChfZnJhbWUgPSBfZnJhbWUucmVwbGFjZShcIjxhbm9ueW1vdXM+XCIsIGZuLmRpc3BsYXlOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGZuICYmXG4gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RnJhbWVDYWNoZS5zZXQoZm4sIF9mcmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfZnJhbWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2hpbGUgKDEgPD0gX1J1bkluUm9vdEZyYW1lJERldGVyICYmIDAgPD0gc2FtcGxlU3RhY2spO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAocmVlbnRyeSA9ICExKSxcbiAgICAgICAgICAoUmVhY3RTaGFyZWRJbnRlcm5hbHMuSCA9IHByZXZpb3VzRGlzcGF0Y2hlciksXG4gICAgICAgICAgcmVlbmFibGVMb2dzKCksXG4gICAgICAgICAgKEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gZnJhbWUpO1xuICAgICAgfVxuICAgICAgc2FtcGxlTGluZXMgPSAoc2FtcGxlTGluZXMgPSBmbiA/IGZuLmRpc3BsYXlOYW1lIHx8IGZuLm5hbWUgOiBcIlwiKVxuICAgICAgICA/IGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHNhbXBsZUxpbmVzKVxuICAgICAgICA6IFwiXCI7XG4gICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiBmbiAmJiBjb21wb25lbnRGcmFtZUNhY2hlLnNldChmbiwgc2FtcGxlTGluZXMpO1xuICAgICAgcmV0dXJuIHNhbXBsZUxpbmVzO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZXNjcmliZVVua25vd25FbGVtZW50VHlwZUZyYW1lSW5ERVYodHlwZSkge1xuICAgICAgaWYgKG51bGwgPT0gdHlwZSkgcmV0dXJuIFwiXCI7XG4gICAgICBpZiAoXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSkge1xuICAgICAgICB2YXIgcHJvdG90eXBlID0gdHlwZS5wcm90b3R5cGU7XG4gICAgICAgIHJldHVybiBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgISghcHJvdG90eXBlIHx8ICFwcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudClcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKHR5cGUpO1xuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcbiAgICAgICAgICByZXR1cm4gZGVzY3JpYmVCdWlsdEluQ29tcG9uZW50RnJhbWUoXCJTdXNwZW5zZVwiKTtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIGRlc2NyaWJlQnVpbHRJbkNvbXBvbmVudEZyYW1lKFwiU3VzcGVuc2VMaXN0XCIpO1xuICAgICAgfVxuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICBzd2l0Y2ggKHR5cGUuJCR0eXBlb2YpIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUgPSBkZXNjcmliZU5hdGl2ZUNvbXBvbmVudEZyYW1lKHR5cGUucmVuZGVyLCAhMSkpLCB0eXBlO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTUVNT19UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlLnR5cGUpO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgcHJvdG90eXBlID0gdHlwZS5fcGF5bG9hZDtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLl9pbml0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlVW5rbm93bkVsZW1lbnRUeXBlRnJhbWVJbkRFVih0eXBlKHByb3RvdHlwZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGdldE93bmVyKCkge1xuICAgICAgdmFyIGRpc3BhdGNoZXIgPSBSZWFjdFNoYXJlZEludGVybmFscy5BO1xuICAgICAgcmV0dXJuIG51bGwgPT09IGRpc3BhdGNoZXIgPyBudWxsIDogZGlzcGF0Y2hlci5nZXRPd25lcigpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZFJlZihjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJyZWZcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcInJlZlwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcucmVmO1xuICAgIH1cbiAgICBmdW5jdGlvbiBoYXNWYWxpZEtleShjb25maWcpIHtcbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJrZXlcIikpIHtcbiAgICAgICAgdmFyIGdldHRlciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29uZmlnLCBcImtleVwiKS5nZXQ7XG4gICAgICAgIGlmIChnZXR0ZXIgJiYgZ2V0dGVyLmlzUmVhY3RXYXJuaW5nKSByZXR1cm4gITE7XG4gICAgICB9XG4gICAgICByZXR1cm4gdm9pZCAwICE9PSBjb25maWcua2V5O1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWZpbmVLZXlQcm9wV2FybmluZ0dldHRlcihwcm9wcywgZGlzcGxheU5hbWUpIHtcbiAgICAgIGZ1bmN0aW9uIHdhcm5BYm91dEFjY2Vzc2luZ0tleSgpIHtcbiAgICAgICAgc3BlY2lhbFByb3BLZXlXYXJuaW5nU2hvd24gfHxcbiAgICAgICAgICAoKHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duID0gITApLFxuICAgICAgICAgIGVycm9yKFxuICAgICAgICAgICAgXCIlczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lIHZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgcHJvcC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvc3BlY2lhbC1wcm9wcylcIixcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSAhMDtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgXCJrZXlcIiwge1xuICAgICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVsZW1lbnRSZWZHZXR0ZXJXaXRoRGVwcmVjYXRpb25XYXJuaW5nKCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodGhpcy50eXBlKTtcbiAgICAgIGRpZFdhcm5BYm91dEVsZW1lbnRSZWZbY29tcG9uZW50TmFtZV0gfHxcbiAgICAgICAgKChkaWRXYXJuQWJvdXRFbGVtZW50UmVmW2NvbXBvbmVudE5hbWVdID0gITApLFxuICAgICAgICBlcnJvcihcbiAgICAgICAgICBcIkFjY2Vzc2luZyBlbGVtZW50LnJlZiB3YXMgcmVtb3ZlZCBpbiBSZWFjdCAxOS4gcmVmIGlzIG5vdyBhIHJlZ3VsYXIgcHJvcC4gSXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIEpTWCBFbGVtZW50IHR5cGUgaW4gYSBmdXR1cmUgcmVsZWFzZS5cIlxuICAgICAgICApKTtcbiAgICAgIGNvbXBvbmVudE5hbWUgPSB0aGlzLnByb3BzLnJlZjtcbiAgICAgIHJldHVybiB2b2lkIDAgIT09IGNvbXBvbmVudE5hbWUgPyBjb21wb25lbnROYW1lIDogbnVsbDtcbiAgICB9XG4gICAgZnVuY3Rpb24gUmVhY3RFbGVtZW50KHR5cGUsIGtleSwgX3JlZiwgc2VsZiwgc291cmNlLCBvd25lciwgcHJvcHMpIHtcbiAgICAgIF9yZWYgPSBwcm9wcy5yZWY7XG4gICAgICB0eXBlID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICBfb3duZXI6IG93bmVyXG4gICAgICB9O1xuICAgICAgbnVsbCAhPT0gKHZvaWQgMCAhPT0gX3JlZiA/IF9yZWYgOiBudWxsKVxuICAgICAgICA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgICAgIGdldDogZWxlbWVudFJlZkdldHRlcldpdGhEZXByZWNhdGlvbldhcm5pbmdcbiAgICAgICAgICB9KVxuICAgICAgICA6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7IGVudW1lcmFibGU6ICExLCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgIHR5cGUuX3N0b3JlID0ge307XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZS5fc3RvcmUsIFwidmFsaWRhdGVkXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMSxcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIFwiX2RlYnVnSW5mb1wiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITEsXG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBudWxsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5mcmVlemUgJiYgKE9iamVjdC5mcmVlemUodHlwZS5wcm9wcyksIE9iamVjdC5mcmVlemUodHlwZSkpO1xuICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGpzeERFVkltcGwoXG4gICAgICB0eXBlLFxuICAgICAgY29uZmlnLFxuICAgICAgbWF5YmVLZXksXG4gICAgICBpc1N0YXRpY0NoaWxkcmVuLFxuICAgICAgc291cmNlLFxuICAgICAgc2VsZlxuICAgICkge1xuICAgICAgaWYgKFxuICAgICAgICBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuICAgICAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fFxuICAgICAgICB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEUgfHxcbiAgICAgICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8XG4gICAgICAgIHR5cGUgPT09IFJFQUNUX09GRlNDUkVFTl9UWVBFIHx8XG4gICAgICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSAmJlxuICAgICAgICAgIG51bGwgIT09IHR5cGUgJiZcbiAgICAgICAgICAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8XG4gICAgICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHxcbiAgICAgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NPTlRFWFRfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fFxuICAgICAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxIHx8XG4gICAgICAgICAgICB2b2lkIDAgIT09IHR5cGUuZ2V0TW9kdWxlSWQpKVxuICAgICAgKSB7XG4gICAgICAgIHZhciBjaGlsZHJlbiA9IGNvbmZpZy5jaGlsZHJlbjtcbiAgICAgICAgaWYgKHZvaWQgMCAhPT0gY2hpbGRyZW4pXG4gICAgICAgICAgaWYgKGlzU3RhdGljQ2hpbGRyZW4pXG4gICAgICAgICAgICBpZiAoaXNBcnJheUltcGwoY2hpbGRyZW4pKSB7XG4gICAgICAgICAgICAgIGZvciAoXG4gICAgICAgICAgICAgICAgaXNTdGF0aWNDaGlsZHJlbiA9IDA7XG4gICAgICAgICAgICAgICAgaXNTdGF0aWNDaGlsZHJlbiA8IGNoaWxkcmVuLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBpc1N0YXRpY0NoaWxkcmVuKytcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIHZhbGlkYXRlQ2hpbGRLZXlzKGNoaWxkcmVuW2lzU3RhdGljQ2hpbGRyZW5dLCB0eXBlKTtcbiAgICAgICAgICAgICAgT2JqZWN0LmZyZWV6ZSAmJiBPYmplY3QuZnJlZXplKGNoaWxkcmVuKTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICBlcnJvcihcbiAgICAgICAgICAgICAgICBcIlJlYWN0LmpzeDogU3RhdGljIGNoaWxkcmVuIHNob3VsZCBhbHdheXMgYmUgYW4gYXJyYXkuIFlvdSBhcmUgbGlrZWx5IGV4cGxpY2l0bHkgY2FsbGluZyBSZWFjdC5qc3hzIG9yIFJlYWN0LmpzeERFVi4gVXNlIHRoZSBCYWJlbCB0cmFuc2Zvcm0gaW5zdGVhZC5cIlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIGVsc2UgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4sIHR5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2hpbGRyZW4gPSBcIlwiO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdm9pZCAwID09PSB0eXBlIHx8XG4gICAgICAgICAgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAgICAgICBudWxsICE9PSB0eXBlICYmXG4gICAgICAgICAgICAwID09PSBPYmplY3Qua2V5cyh0eXBlKS5sZW5ndGgpXG4gICAgICAgIClcbiAgICAgICAgICBjaGlsZHJlbiArPVxuICAgICAgICAgICAgXCIgWW91IGxpa2VseSBmb3Jnb3QgdG8gZXhwb3J0IHlvdXIgY29tcG9uZW50IGZyb20gdGhlIGZpbGUgaXQncyBkZWZpbmVkIGluLCBvciB5b3UgbWlnaHQgaGF2ZSBtaXhlZCB1cCBkZWZhdWx0IGFuZCBuYW1lZCBpbXBvcnRzLlwiO1xuICAgICAgICBudWxsID09PSB0eXBlXG4gICAgICAgICAgPyAoaXNTdGF0aWNDaGlsZHJlbiA9IFwibnVsbFwiKVxuICAgICAgICAgIDogaXNBcnJheUltcGwodHlwZSlcbiAgICAgICAgICA/IChpc1N0YXRpY0NoaWxkcmVuID0gXCJhcnJheVwiKVxuICAgICAgICAgIDogdm9pZCAwICE9PSB0eXBlICYmIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuICAgICAgICAgID8gKChpc1N0YXRpY0NoaWxkcmVuID1cbiAgICAgICAgICAgICAgXCI8XCIgKyAoZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKHR5cGUudHlwZSkgfHwgXCJVbmtub3duXCIpICsgXCIgLz5cIiksXG4gICAgICAgICAgICAoY2hpbGRyZW4gPVxuICAgICAgICAgICAgICBcIiBEaWQgeW91IGFjY2lkZW50YWxseSBleHBvcnQgYSBKU1ggbGl0ZXJhbCBpbnN0ZWFkIG9mIGEgY29tcG9uZW50P1wiKSlcbiAgICAgICAgICA6IChpc1N0YXRpY0NoaWxkcmVuID0gdHlwZW9mIHR5cGUpO1xuICAgICAgICBlcnJvcihcbiAgICAgICAgICBcIlJlYWN0LmpzeDogdHlwZSBpcyBpbnZhbGlkIC0tIGV4cGVjdGVkIGEgc3RyaW5nIChmb3IgYnVpbHQtaW4gY29tcG9uZW50cykgb3IgYSBjbGFzcy9mdW5jdGlvbiAoZm9yIGNvbXBvc2l0ZSBjb21wb25lbnRzKSBidXQgZ290OiAlcy4lc1wiLFxuICAgICAgICAgIGlzU3RhdGljQ2hpbGRyZW4sXG4gICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZywgXCJrZXlcIikpIHtcbiAgICAgICAgY2hpbGRyZW4gPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodHlwZSk7XG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMoY29uZmlnKS5maWx0ZXIoZnVuY3Rpb24gKGspIHtcbiAgICAgICAgICByZXR1cm4gXCJrZXlcIiAhPT0gaztcbiAgICAgICAgfSk7XG4gICAgICAgIGlzU3RhdGljQ2hpbGRyZW4gPVxuICAgICAgICAgIDAgPCBrZXlzLmxlbmd0aFxuICAgICAgICAgICAgPyBcIntrZXk6IHNvbWVLZXksIFwiICsga2V5cy5qb2luKFwiOiAuLi4sIFwiKSArIFwiOiAuLi59XCJcbiAgICAgICAgICAgIDogXCJ7a2V5OiBzb21lS2V5fVwiO1xuICAgICAgICBkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY2hpbGRyZW4gKyBpc1N0YXRpY0NoaWxkcmVuXSB8fFxuICAgICAgICAgICgoa2V5cyA9XG4gICAgICAgICAgICAwIDwga2V5cy5sZW5ndGggPyBcIntcIiArIGtleXMuam9pbihcIjogLi4uLCBcIikgKyBcIjogLi4ufVwiIDogXCJ7fVwiKSxcbiAgICAgICAgICBlcnJvcihcbiAgICAgICAgICAgICdBIHByb3BzIG9iamVjdCBjb250YWluaW5nIGEgXCJrZXlcIiBwcm9wIGlzIGJlaW5nIHNwcmVhZCBpbnRvIEpTWDpcXG4gIGxldCBwcm9wcyA9ICVzO1xcbiAgPCVzIHsuLi5wcm9wc30gLz5cXG5SZWFjdCBrZXlzIG11c3QgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIEpTWCB3aXRob3V0IHVzaW5nIHNwcmVhZDpcXG4gIGxldCBwcm9wcyA9ICVzO1xcbiAgPCVzIGtleT17c29tZUtleX0gey4uLnByb3BzfSAvPicsXG4gICAgICAgICAgICBpc1N0YXRpY0NoaWxkcmVuLFxuICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICBrZXlzLFxuICAgICAgICAgICAgY2hpbGRyZW5cbiAgICAgICAgICApLFxuICAgICAgICAgIChkaWRXYXJuQWJvdXRLZXlTcHJlYWRbY2hpbGRyZW4gKyBpc1N0YXRpY0NoaWxkcmVuXSA9ICEwKSk7XG4gICAgICB9XG4gICAgICBjaGlsZHJlbiA9IG51bGw7XG4gICAgICB2b2lkIDAgIT09IG1heWJlS2V5ICYmXG4gICAgICAgIChjaGVja0tleVN0cmluZ0NvZXJjaW9uKG1heWJlS2V5KSwgKGNoaWxkcmVuID0gXCJcIiArIG1heWJlS2V5KSk7XG4gICAgICBoYXNWYWxpZEtleShjb25maWcpICYmXG4gICAgICAgIChjaGVja0tleVN0cmluZ0NvZXJjaW9uKGNvbmZpZy5rZXkpLCAoY2hpbGRyZW4gPSBcIlwiICsgY29uZmlnLmtleSkpO1xuICAgICAgaGFzVmFsaWRSZWYoY29uZmlnKTtcbiAgICAgIGlmIChcImtleVwiIGluIGNvbmZpZykge1xuICAgICAgICBtYXliZUtleSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBjb25maWcpXG4gICAgICAgICAgXCJrZXlcIiAhPT0gcHJvcE5hbWUgJiYgKG1heWJlS2V5W3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV0pO1xuICAgICAgfSBlbHNlIG1heWJlS2V5ID0gY29uZmlnO1xuICAgICAgY2hpbGRyZW4gJiZcbiAgICAgICAgKChjb25maWcgPVxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIHR5cGVcbiAgICAgICAgICAgID8gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgXCJVbmtub3duXCJcbiAgICAgICAgICAgIDogdHlwZSksXG4gICAgICAgIGNoaWxkcmVuICYmIGRlZmluZUtleVByb3BXYXJuaW5nR2V0dGVyKG1heWJlS2V5LCBjb25maWcpKTtcbiAgICAgIHJldHVybiBSZWFjdEVsZW1lbnQoXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgICBudWxsLFxuICAgICAgICBzZWxmLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGdldE93bmVyKCksXG4gICAgICAgIG1heWJlS2V5XG4gICAgICApO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZUNoaWxkS2V5cyhub2RlLCBwYXJlbnRUeXBlKSB7XG4gICAgICBpZiAoXG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBub2RlICYmXG4gICAgICAgIG5vZGUgJiZcbiAgICAgICAgbm9kZS4kJHR5cGVvZiAhPT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRVxuICAgICAgKVxuICAgICAgICBpZiAoaXNBcnJheUltcGwobm9kZSkpXG4gICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGQgPSBub2RlW2ldO1xuICAgICAgICAgICAgaXNWYWxpZEVsZW1lbnQoY2hpbGQpICYmIHZhbGlkYXRlRXhwbGljaXRLZXkoY2hpbGQsIHBhcmVudFR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNWYWxpZEVsZW1lbnQobm9kZSkpXG4gICAgICAgICAgbm9kZS5fc3RvcmUgJiYgKG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IDEpO1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAobnVsbCA9PT0gbm9kZSB8fCBcIm9iamVjdFwiICE9PSB0eXBlb2Ygbm9kZVxuICAgICAgICAgICAgPyAoaSA9IG51bGwpXG4gICAgICAgICAgICA6ICgoaSA9XG4gICAgICAgICAgICAgICAgKE1BWUJFX0lURVJBVE9SX1NZTUJPTCAmJiBub2RlW01BWUJFX0lURVJBVE9SX1NZTUJPTF0pIHx8XG4gICAgICAgICAgICAgICAgbm9kZVtcIkBAaXRlcmF0b3JcIl0pLFxuICAgICAgICAgICAgICAoaSA9IFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGkgPyBpIDogbnVsbCkpLFxuICAgICAgICAgIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIGkgJiZcbiAgICAgICAgICAgIGkgIT09IG5vZGUuZW50cmllcyAmJlxuICAgICAgICAgICAgKChpID0gaS5jYWxsKG5vZGUpKSwgaSAhPT0gbm9kZSkpXG4gICAgICAgIClcbiAgICAgICAgICBmb3IgKDsgIShub2RlID0gaS5uZXh0KCkpLmRvbmU7IClcbiAgICAgICAgICAgIGlzVmFsaWRFbGVtZW50KG5vZGUudmFsdWUpICYmXG4gICAgICAgICAgICAgIHZhbGlkYXRlRXhwbGljaXRLZXkobm9kZS52YWx1ZSwgcGFyZW50VHlwZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVmFsaWRFbGVtZW50KG9iamVjdCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9iamVjdCAmJlxuICAgICAgICBudWxsICE9PSBvYmplY3QgJiZcbiAgICAgICAgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcbiAgICAgICk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlRXhwbGljaXRLZXkoZWxlbWVudCwgcGFyZW50VHlwZSkge1xuICAgICAgaWYgKFxuICAgICAgICBlbGVtZW50Ll9zdG9yZSAmJlxuICAgICAgICAhZWxlbWVudC5fc3RvcmUudmFsaWRhdGVkICYmXG4gICAgICAgIG51bGwgPT0gZWxlbWVudC5rZXkgJiZcbiAgICAgICAgKChlbGVtZW50Ll9zdG9yZS52YWxpZGF0ZWQgPSAxKSxcbiAgICAgICAgKHBhcmVudFR5cGUgPSBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpKSxcbiAgICAgICAgIW93bmVySGFzS2V5VXNlV2FybmluZ1twYXJlbnRUeXBlXSlcbiAgICAgICkge1xuICAgICAgICBvd25lckhhc0tleVVzZVdhcm5pbmdbcGFyZW50VHlwZV0gPSAhMDtcbiAgICAgICAgdmFyIGNoaWxkT3duZXIgPSBcIlwiO1xuICAgICAgICBlbGVtZW50ICYmXG4gICAgICAgICAgbnVsbCAhPSBlbGVtZW50Ll9vd25lciAmJlxuICAgICAgICAgIGVsZW1lbnQuX293bmVyICE9PSBnZXRPd25lcigpICYmXG4gICAgICAgICAgKChjaGlsZE93bmVyID0gbnVsbCksXG4gICAgICAgICAgXCJudW1iZXJcIiA9PT0gdHlwZW9mIGVsZW1lbnQuX293bmVyLnRhZ1xuICAgICAgICAgICAgPyAoY2hpbGRPd25lciA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZShlbGVtZW50Ll9vd25lci50eXBlKSlcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIiA9PT0gdHlwZW9mIGVsZW1lbnQuX293bmVyLm5hbWUgJiZcbiAgICAgICAgICAgICAgKGNoaWxkT3duZXIgPSBlbGVtZW50Ll9vd25lci5uYW1lKSxcbiAgICAgICAgICAoY2hpbGRPd25lciA9IFwiIEl0IHdhcyBwYXNzZWQgYSBjaGlsZCBmcm9tIFwiICsgY2hpbGRPd25lciArIFwiLlwiKSk7XG4gICAgICAgIHZhciBwcmV2R2V0Q3VycmVudFN0YWNrID0gUmVhY3RTaGFyZWRJbnRlcm5hbHMuZ2V0Q3VycmVudFN0YWNrO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIHN0YWNrID0gZGVzY3JpYmVVbmtub3duRWxlbWVudFR5cGVGcmFtZUluREVWKGVsZW1lbnQudHlwZSk7XG4gICAgICAgICAgcHJldkdldEN1cnJlbnRTdGFjayAmJiAoc3RhY2sgKz0gcHJldkdldEN1cnJlbnRTdGFjaygpIHx8IFwiXCIpO1xuICAgICAgICAgIHJldHVybiBzdGFjaztcbiAgICAgICAgfTtcbiAgICAgICAgZXJyb3IoXG4gICAgICAgICAgJ0VhY2ggY2hpbGQgaW4gYSBsaXN0IHNob3VsZCBoYXZlIGEgdW5pcXVlIFwia2V5XCIgcHJvcC4lcyVzIFNlZSBodHRwczovL3JlYWN0LmRldi9saW5rL3dhcm5pbmcta2V5cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgICAgIHBhcmVudFR5cGUsXG4gICAgICAgICAgY2hpbGRPd25lclxuICAgICAgICApO1xuICAgICAgICBSZWFjdFNoYXJlZEludGVybmFscy5nZXRDdXJyZW50U3RhY2sgPSBwcmV2R2V0Q3VycmVudFN0YWNrO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBnZXRDdXJyZW50Q29tcG9uZW50RXJyb3JJbmZvKHBhcmVudFR5cGUpIHtcbiAgICAgIHZhciBpbmZvID0gXCJcIixcbiAgICAgICAgb3duZXIgPSBnZXRPd25lcigpO1xuICAgICAgb3duZXIgJiZcbiAgICAgICAgKG93bmVyID0gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKG93bmVyLnR5cGUpKSAmJlxuICAgICAgICAoaW5mbyA9IFwiXFxuXFxuQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYFwiICsgb3duZXIgKyBcImAuXCIpO1xuICAgICAgaW5mbyB8fFxuICAgICAgICAoKHBhcmVudFR5cGUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUocGFyZW50VHlwZSkpICYmXG4gICAgICAgICAgKGluZm8gPVxuICAgICAgICAgICAgXCJcXG5cXG5DaGVjayB0aGUgdG9wLWxldmVsIHJlbmRlciBjYWxsIHVzaW5nIDxcIiArIHBhcmVudFR5cGUgKyBcIj4uXCIpKTtcbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cbiAgICB2YXIgUmVhY3QgPSByZXF1aXJlKFwicmVhY3RcIiksXG4gICAgICBSRUFDVF9FTEVNRU5UX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QudHJhbnNpdGlvbmFsLmVsZW1lbnRcIiksXG4gICAgICBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIiksXG4gICAgICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLFxuICAgICAgUkVBQ1RfU1RSSUNUX01PREVfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdHJpY3RfbW9kZVwiKSxcbiAgICAgIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIik7XG4gICAgU3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpO1xuICAgIHZhciBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuICAgICAgUkVBQ1RfQ09OVEVYVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIiksXG4gICAgICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpLFxuICAgICAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcbiAgICAgIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpLFxuICAgICAgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIiksXG4gICAgICBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSxcbiAgICAgIFJFQUNUX09GRlNDUkVFTl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm9mZnNjcmVlblwiKSxcbiAgICAgIE1BWUJFX0lURVJBVE9SX1NZTUJPTCA9IFN5bWJvbC5pdGVyYXRvcixcbiAgICAgIFJlYWN0U2hhcmVkSW50ZXJuYWxzID1cbiAgICAgICAgUmVhY3QuX19DTElFTlRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfV0FSTl9VU0VSU19USEVZX0NBTk5PVF9VUEdSQURFLFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQyID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIiksXG4gICAgICBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG4gICAgICBhc3NpZ24gPSBPYmplY3QuYXNzaWduLFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSQxID0gU3ltYm9sLmZvcihcInJlYWN0LmNsaWVudC5yZWZlcmVuY2VcIiksXG4gICAgICBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXksXG4gICAgICBkaXNhYmxlZERlcHRoID0gMCxcbiAgICAgIHByZXZMb2csXG4gICAgICBwcmV2SW5mbyxcbiAgICAgIHByZXZXYXJuLFxuICAgICAgcHJldkVycm9yLFxuICAgICAgcHJldkdyb3VwLFxuICAgICAgcHJldkdyb3VwQ29sbGFwc2VkLFxuICAgICAgcHJldkdyb3VwRW5kO1xuICAgIGRpc2FibGVkTG9nLl9fcmVhY3REaXNhYmxlZExvZyA9ICEwO1xuICAgIHZhciBwcmVmaXgsXG4gICAgICByZWVudHJ5ID0gITE7XG4gICAgdmFyIGNvbXBvbmVudEZyYW1lQ2FjaGUgPSBuZXcgKFxuICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgV2Vha01hcCA/IFdlYWtNYXAgOiBNYXBcbiAgICApKCk7XG4gICAgdmFyIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKSxcbiAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duO1xuICAgIHZhciBkaWRXYXJuQWJvdXRFbGVtZW50UmVmID0ge307XG4gICAgdmFyIGRpZFdhcm5BYm91dEtleVNwcmVhZCA9IHt9LFxuICAgICAgb3duZXJIYXNLZXlVc2VXYXJuaW5nID0ge307XG4gICAgZXhwb3J0cy5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG4gICAgZXhwb3J0cy5qc3hERVYgPSBmdW5jdGlvbiAoXG4gICAgICB0eXBlLFxuICAgICAgY29uZmlnLFxuICAgICAgbWF5YmVLZXksXG4gICAgICBpc1N0YXRpY0NoaWxkcmVuLFxuICAgICAgc291cmNlLFxuICAgICAgc2VsZlxuICAgICkge1xuICAgICAgcmV0dXJuIGpzeERFVkltcGwodHlwZSwgY29uZmlnLCBtYXliZUtleSwgaXNTdGF0aWNDaGlsZHJlbiwgc291cmNlLCBzZWxmKTtcbiAgICB9O1xuICB9KSgpO1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBJcyB0aGlzIHZhbHVlIGRlZmluZWQgYW5kIG5vdCBudWxsP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgZGVmaW5lZCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgIT09ICd1bmRlZmluZWQnICYmIHZhbCAhPT0gbnVsbDtcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSBhbiBvYmplY3Q/XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBvYmplY3QgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jztcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSBhIHBsYWluIG9iamVjdD9cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHBsYWluT2JqZWN0ID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IE9iamVjdF0nO1xufTtcblxuLyoqXG4gKiBJcyB0aGlzIHZhbHVlIGEgZnVuY3Rpb24/XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBmbiA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbic7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgYSBib29sZWFuP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgYm9vbCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdib29sZWFuJztcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSBhIEJ1ZmZlciBvYmplY3Q/XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBidWZmZXIgPSBmdW5jdGlvbiAodmFsKSB7XG4gIHJldHVybiB2YWwgaW5zdGFuY2VvZiBCdWZmZXI7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgYSB0eXBlZCBhcnJheSBvYmplY3Q/LiBFLmcuIFVpbnQ4QXJyYXkgb3IgVWludDhDbGFtcGVkQXJyYXk/XG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCB0eXBlZEFycmF5ID0gZnVuY3Rpb24gKHZhbCkge1xuICBpZiAoZGVmaW5lZCh2YWwpKSB7XG4gICAgc3dpdGNoICh2YWwuY29uc3RydWN0b3IpIHtcbiAgICAgIGNhc2UgVWludDhBcnJheTpcbiAgICAgIGNhc2UgVWludDhDbGFtcGVkQXJyYXk6XG4gICAgICBjYXNlIEludDhBcnJheTpcbiAgICAgIGNhc2UgVWludDE2QXJyYXk6XG4gICAgICBjYXNlIEludDE2QXJyYXk6XG4gICAgICBjYXNlIFVpbnQzMkFycmF5OlxuICAgICAgY2FzZSBJbnQzMkFycmF5OlxuICAgICAgY2FzZSBGbG9hdDMyQXJyYXk6XG4gICAgICBjYXNlIEZsb2F0NjRBcnJheTpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBJcyB0aGlzIHZhbHVlIGFuIEFycmF5QnVmZmVyIG9iamVjdD9cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGFycmF5QnVmZmVyID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gdmFsIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgYSBub24tZW1wdHkgc3RyaW5nP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgc3RyaW5nID0gZnVuY3Rpb24gKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLmxlbmd0aCA+IDA7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgYSByZWFsIG51bWJlcj9cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IG51bWJlciA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdudW1iZXInICYmICFOdW1iZXIuaXNOYU4odmFsKTtcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSBhbiBpbnRlZ2VyP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgaW50ZWdlciA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgcmV0dXJuIE51bWJlci5pc0ludGVnZXIodmFsKTtcbn07XG5cbi8qKlxuICogSXMgdGhpcyB2YWx1ZSB3aXRoaW4gYW4gaW5jbHVzaXZlIGdpdmVuIHJhbmdlP1xuICogQHByaXZhdGVcbiAqL1xuY29uc3QgaW5SYW5nZSA9IGZ1bmN0aW9uICh2YWwsIG1pbiwgbWF4KSB7XG4gIHJldHVybiB2YWwgPj0gbWluICYmIHZhbCA8PSBtYXg7XG59O1xuXG4vKipcbiAqIElzIHRoaXMgdmFsdWUgd2l0aGluIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheT9cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGluQXJyYXkgPSBmdW5jdGlvbiAodmFsLCBsaXN0KSB7XG4gIHJldHVybiBsaXN0LmluY2x1ZGVzKHZhbCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhbiBFcnJvciB3aXRoIGEgbWVzc2FnZSByZWxhdGluZyB0byBhbiBpbnZhbGlkIHBhcmFtZXRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHBhcmFtZXRlciBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkIC0gZGVzY3JpcHRpb24gb2YgdGhlIHR5cGUvdmFsdWUvcmFuZ2UgZXhwZWN0ZWQuXG4gKiBAcGFyYW0geyp9IGFjdHVhbCAtIHRoZSB2YWx1ZSByZWNlaXZlZC5cbiAqIEByZXR1cm5zIHtFcnJvcn0gQ29udGFpbmluZyB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBpbnZhbGlkUGFyYW1ldGVyRXJyb3IgPSBmdW5jdGlvbiAobmFtZSwgZXhwZWN0ZWQsIGFjdHVhbCkge1xuICByZXR1cm4gbmV3IEVycm9yKFxuICAgIGBFeHBlY3RlZCAke2V4cGVjdGVkfSBmb3IgJHtuYW1lfSBidXQgcmVjZWl2ZWQgJHthY3R1YWx9IG9mIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWBcbiAgKTtcbn07XG5cbi8qKlxuICogRW5zdXJlcyBhbiBFcnJvciBmcm9tIEMrKyBjb250YWlucyBhIEpTIHN0YWNrLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IG5hdGl2ZSAtIEVycm9yIHdpdGggbWVzc2FnZSBmcm9tIEMrKy5cbiAqIEBwYXJhbSB7RXJyb3J9IGNvbnRleHQgLSBFcnJvciB3aXRoIHN0YWNrIGZyb20gSlMuXG4gKiBAcmV0dXJucyB7RXJyb3J9IEVycm9yIHdpdGggbWVzc2FnZSBhbmQgc3RhY2suXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBuYXRpdmVFcnJvciA9IGZ1bmN0aW9uIChuYXRpdmUsIGNvbnRleHQpIHtcbiAgY29udGV4dC5tZXNzYWdlID0gbmF0aXZlLm1lc3NhZ2U7XG4gIHJldHVybiBjb250ZXh0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGRlZmluZWQsXG4gIG9iamVjdCxcbiAgcGxhaW5PYmplY3QsXG4gIGZuLFxuICBib29sLFxuICBidWZmZXIsXG4gIHR5cGVkQXJyYXksXG4gIGFycmF5QnVmZmVyLFxuICBzdHJpbmcsXG4gIG51bWJlcixcbiAgaW50ZWdlcixcbiAgaW5SYW5nZSxcbiAgaW5BcnJheSxcbiAgaW52YWxpZFBhcmFtZXRlckVycm9yLFxuICBuYXRpdmVFcnJvclxufTtcbiIsCiAgICAiY29uc3QgZGVidWcgPSAoXG4gIHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JyAmJlxuICBwcm9jZXNzLmVudiAmJlxuICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gIC9cXGJzZW12ZXJcXGIvaS50ZXN0KHByb2Nlc3MuZW52Lk5PREVfREVCVUcpXG4pID8gKC4uLmFyZ3MpID0+IGNvbnNvbGUuZXJyb3IoJ1NFTVZFUicsIC4uLmFyZ3MpXG4gIDogKCkgPT4ge31cblxubW9kdWxlLmV4cG9ydHMgPSBkZWJ1Z1xuIiwKICAgICIvLyBOb3RlOiB0aGlzIGlzIHRoZSBzZW12ZXIub3JnIHZlcnNpb24gb2YgdGhlIHNwZWMgdGhhdCBpdCBpbXBsZW1lbnRzXG4vLyBOb3QgbmVjZXNzYXJpbHkgdGhlIHBhY2thZ2UgdmVyc2lvbiBvZiB0aGlzIGNvZGUuXG5jb25zdCBTRU1WRVJfU1BFQ19WRVJTSU9OID0gJzIuMC4wJ1xuXG5jb25zdCBNQVhfTEVOR1RIID0gMjU2XG5jb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgfHxcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIDkwMDcxOTkyNTQ3NDA5OTFcblxuLy8gTWF4IHNhZmUgc2VnbWVudCBsZW5ndGggZm9yIGNvZXJjaW9uLlxuY29uc3QgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCA9IDE2XG5cbi8vIE1heCBzYWZlIGxlbmd0aCBmb3IgYSBidWlsZCBpZGVudGlmaWVyLiBUaGUgbWF4IGxlbmd0aCBtaW51cyA2IGNoYXJhY3RlcnMgZm9yXG4vLyB0aGUgc2hvcnRlc3QgdmVyc2lvbiB3aXRoIGEgYnVpbGQgMC4wLjArQlVJTEQuXG5jb25zdCBNQVhfU0FGRV9CVUlMRF9MRU5HVEggPSBNQVhfTEVOR1RIIC0gNlxuXG5jb25zdCBSRUxFQVNFX1RZUEVTID0gW1xuICAnbWFqb3InLFxuICAncHJlbWFqb3InLFxuICAnbWlub3InLFxuICAncHJlbWlub3InLFxuICAncGF0Y2gnLFxuICAncHJlcGF0Y2gnLFxuICAncHJlcmVsZWFzZScsXG5dXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBNQVhfTEVOR1RILFxuICBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RILFxuICBNQVhfU0FGRV9CVUlMRF9MRU5HVEgsXG4gIE1BWF9TQUZFX0lOVEVHRVIsXG4gIFJFTEVBU0VfVFlQRVMsXG4gIFNFTVZFUl9TUEVDX1ZFUlNJT04sXG4gIEZMQUdfSU5DTFVERV9QUkVSRUxFQVNFOiAwYjAwMSxcbiAgRkxBR19MT09TRTogMGIwMTAsXG59XG4iLAogICAgImNvbnN0IHtcbiAgTUFYX1NBRkVfQ09NUE9ORU5UX0xFTkdUSCxcbiAgTUFYX1NBRkVfQlVJTERfTEVOR1RILFxuICBNQVhfTEVOR1RILFxufSA9IHJlcXVpcmUoJy4vY29uc3RhbnRzJylcbmNvbnN0IGRlYnVnID0gcmVxdWlyZSgnLi9kZWJ1ZycpXG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSB7fVxuXG4vLyBUaGUgYWN0dWFsIHJlZ2V4cHMgZ28gb24gZXhwb3J0cy5yZVxuY29uc3QgcmUgPSBleHBvcnRzLnJlID0gW11cbmNvbnN0IHNhZmVSZSA9IGV4cG9ydHMuc2FmZVJlID0gW11cbmNvbnN0IHNyYyA9IGV4cG9ydHMuc3JjID0gW11cbmNvbnN0IHQgPSBleHBvcnRzLnQgPSB7fVxubGV0IFIgPSAwXG5cbmNvbnN0IExFVFRFUkRBU0hOVU1CRVIgPSAnW2EtekEtWjAtOS1dJ1xuXG4vLyBSZXBsYWNlIHNvbWUgZ3JlZWR5IHJlZ2V4IHRva2VucyB0byBwcmV2ZW50IHJlZ2V4IGRvcyBpc3N1ZXMuIFRoZXNlIHJlZ2V4IGFyZVxuLy8gdXNlZCBpbnRlcm5hbGx5IHZpYSB0aGUgc2FmZVJlIG9iamVjdCBzaW5jZSBhbGwgaW5wdXRzIGluIHRoaXMgbGlicmFyeSBnZXRcbi8vIG5vcm1hbGl6ZWQgZmlyc3QgdG8gdHJpbSBhbmQgY29sbGFwc2UgYWxsIGV4dHJhIHdoaXRlc3BhY2UuIFRoZSBvcmlnaW5hbFxuLy8gcmVnZXhlcyBhcmUgZXhwb3J0ZWQgZm9yIHVzZXJsYW5kIGNvbnN1bXB0aW9uIGFuZCBsb3dlciBsZXZlbCB1c2FnZS4gQVxuLy8gZnV0dXJlIGJyZWFraW5nIGNoYW5nZSBjb3VsZCBleHBvcnQgdGhlIHNhZmVyIHJlZ2V4IG9ubHkgd2l0aCBhIG5vdGUgdGhhdFxuLy8gYWxsIGlucHV0IHNob3VsZCBoYXZlIGV4dHJhIHdoaXRlc3BhY2UgcmVtb3ZlZC5cbmNvbnN0IHNhZmVSZWdleFJlcGxhY2VtZW50cyA9IFtcbiAgWydcXFxccycsIDFdLFxuICBbJ1xcXFxkJywgTUFYX0xFTkdUSF0sXG4gIFtMRVRURVJEQVNITlVNQkVSLCBNQVhfU0FGRV9CVUlMRF9MRU5HVEhdLFxuXVxuXG5jb25zdCBtYWtlU2FmZVJlZ2V4ID0gKHZhbHVlKSA9PiB7XG4gIGZvciAoY29uc3QgW3Rva2VuLCBtYXhdIG9mIHNhZmVSZWdleFJlcGxhY2VtZW50cykge1xuICAgIHZhbHVlID0gdmFsdWVcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0qYCkuam9pbihgJHt0b2tlbn17MCwke21heH19YClcbiAgICAgIC5zcGxpdChgJHt0b2tlbn0rYCkuam9pbihgJHt0b2tlbn17MSwke21heH19YClcbiAgfVxuICByZXR1cm4gdmFsdWVcbn1cblxuY29uc3QgY3JlYXRlVG9rZW4gPSAobmFtZSwgdmFsdWUsIGlzR2xvYmFsKSA9PiB7XG4gIGNvbnN0IHNhZmUgPSBtYWtlU2FmZVJlZ2V4KHZhbHVlKVxuICBjb25zdCBpbmRleCA9IFIrK1xuICBkZWJ1ZyhuYW1lLCBpbmRleCwgdmFsdWUpXG4gIHRbbmFtZV0gPSBpbmRleFxuICBzcmNbaW5kZXhdID0gdmFsdWVcbiAgcmVbaW5kZXhdID0gbmV3IFJlZ0V4cCh2YWx1ZSwgaXNHbG9iYWwgPyAnZycgOiB1bmRlZmluZWQpXG4gIHNhZmVSZVtpbmRleF0gPSBuZXcgUmVnRXhwKHNhZmUsIGlzR2xvYmFsID8gJ2cnIDogdW5kZWZpbmVkKVxufVxuXG4vLyBUaGUgZm9sbG93aW5nIFJlZ3VsYXIgRXhwcmVzc2lvbnMgY2FuIGJlIHVzZWQgZm9yIHRva2VuaXppbmcsXG4vLyB2YWxpZGF0aW5nLCBhbmQgcGFyc2luZyBTZW1WZXIgdmVyc2lvbiBzdHJpbmdzLlxuXG4vLyAjIyBOdW1lcmljIElkZW50aWZpZXJcbi8vIEEgc2luZ2xlIGAwYCwgb3IgYSBub24temVybyBkaWdpdCBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgZGlnaXRzLlxuXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVInLCAnMHxbMS05XVxcXFxkKicpXG5jcmVhdGVUb2tlbignTlVNRVJJQ0lERU5USUZJRVJMT09TRScsICdcXFxcZCsnKVxuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignTk9OTlVNRVJJQ0lERU5USUZJRVInLCBgXFxcXGQqW2EtekEtWi1dJHtMRVRURVJEQVNITlVNQkVSfSpgKVxuXG4vLyAjIyBNYWluIFZlcnNpb25cbi8vIFRocmVlIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBpZGVudGlmaWVycy5cblxuY3JlYXRlVG9rZW4oJ01BSU5WRVJTSU9OJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX0pXFxcXC5gICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgIGAoJHtzcmNbdC5OVU1FUklDSURFTlRJRklFUl19KWApXG5cbmNyZWF0ZVRva2VuKCdNQUlOVkVSU0lPTkxPT1NFJywgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlcXFxcLmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdfSlgKVxuXG4vLyAjIyBQcmUtcmVsZWFzZSBWZXJzaW9uIElkZW50aWZpZXJcbi8vIEEgbnVtZXJpYyBpZGVudGlmaWVyLCBvciBhIG5vbi1udW1lcmljIGlkZW50aWZpZXIuXG5cbmNyZWF0ZVRva2VuKCdQUkVSRUxFQVNFSURFTlRJRklFUicsIGAoPzoke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXVxufXwke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VJREVOVElGSUVSTE9PU0UnLCBgKD86JHtzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXVxufXwke3NyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXX0pYClcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuLy8gSHlwaGVuLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkb3Qtc2VwYXJhdGVkIHByZS1yZWxlYXNlIHZlcnNpb25cbi8vIGlkZW50aWZpZXJzLlxuXG5jcmVhdGVUb2tlbignUFJFUkVMRUFTRScsIGAoPzotKCR7c3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXX0pKikpYClcblxuY3JlYXRlVG9rZW4oJ1BSRVJFTEVBU0VMT09TRScsIGAoPzotPygke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdXG59KD86XFxcXC4ke3NyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdfSkqKSlgKVxuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YSBJZGVudGlmaWVyXG4vLyBBbnkgY29tYmluYXRpb24gb2YgZGlnaXRzLCBsZXR0ZXJzLCBvciBoeXBoZW5zLlxuXG5jcmVhdGVUb2tlbignQlVJTERJREVOVElGSUVSJywgYCR7TEVUVEVSREFTSE5VTUJFUn0rYClcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGFcbi8vIFBsdXMgc2lnbiwgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgcGVyaW9kLXNlcGFyYXRlZCBidWlsZCBtZXRhZGF0YVxuLy8gaWRlbnRpZmllcnMuXG5cbmNyZWF0ZVRva2VuKCdCVUlMRCcsIGAoPzpcXFxcKygke3NyY1t0LkJVSUxESURFTlRJRklFUl1cbn0oPzpcXFxcLiR7c3JjW3QuQlVJTERJREVOVElGSUVSXX0pKikpYClcblxuLy8gIyMgRnVsbCBWZXJzaW9uIFN0cmluZ1xuLy8gQSBtYWluIHZlcnNpb24sIGZvbGxvd2VkIG9wdGlvbmFsbHkgYnkgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uIGFuZFxuLy8gYnVpbGQgbWV0YWRhdGEuXG5cbi8vIE5vdGUgdGhhdCB0aGUgb25seSBtYWpvciwgbWlub3IsIHBhdGNoLCBhbmQgcHJlLXJlbGVhc2Ugc2VjdGlvbnMgb2Zcbi8vIHRoZSB2ZXJzaW9uIHN0cmluZyBhcmUgY2FwdHVyaW5nIGdyb3Vwcy4gIFRoZSBidWlsZCBtZXRhZGF0YSBpcyBub3QgYVxuLy8gY2FwdHVyaW5nIGdyb3VwLCBiZWNhdXNlIGl0IHNob3VsZCBub3QgZXZlciBiZSB1c2VkIGluIHZlcnNpb25cbi8vIGNvbXBhcmlzb24uXG5cbmNyZWF0ZVRva2VuKCdGVUxMUExBSU4nLCBgdj8ke3NyY1t0Lk1BSU5WRVJTSU9OXVxufSR7c3JjW3QuUFJFUkVMRUFTRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0ZVTEwnLCBgXiR7c3JjW3QuRlVMTFBMQUlOXX0kYClcblxuLy8gbGlrZSBmdWxsLCBidXQgYWxsb3dzIHYxLjIuMyBhbmQgPTEuMi4zLCB3aGljaCBwZW9wbGUgZG8gc29tZXRpbWVzLlxuLy8gYWxzbywgMS4wLjBhbHBoYTEgKHByZXJlbGVhc2Ugd2l0aG91dCB0aGUgaHlwaGVuKSB3aGljaCBpcyBwcmV0dHlcbi8vIGNvbW1vbiBpbiB0aGUgbnBtIHJlZ2lzdHJ5LlxuY3JlYXRlVG9rZW4oJ0xPT1NFUExBSU4nLCBgW3Y9XFxcXHNdKiR7c3JjW3QuTUFJTlZFUlNJT05MT09TRV1cbn0ke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19PyR7XG4gIHNyY1t0LkJVSUxEXX0/YClcblxuY3JlYXRlVG9rZW4oJ0xPT1NFJywgYF4ke3NyY1t0LkxPT1NFUExBSU5dfSRgKVxuXG5jcmVhdGVUb2tlbignR1RMVCcsICcoKD86PHw+KT89PyknKVxuXG4vLyBTb21ldGhpbmcgbGlrZSBcIjIuKlwiIG9yIFwiMS4yLnhcIi5cbi8vIE5vdGUgdGhhdCBcIngueFwiIGlzIGEgdmFsaWQgeFJhbmdlIGlkZW50aWZlciwgbWVhbmluZyBcImFueSB2ZXJzaW9uXCJcbi8vIE9ubHkgdGhlIGZpcnN0IGl0ZW0gaXMgc3RyaWN0bHkgcmVxdWlyZWQuXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUkxPT1NFJywgYCR7c3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV19fHh8WHxcXFxcKmApXG5jcmVhdGVUb2tlbignWFJBTkdFSURFTlRJRklFUicsIGAke3NyY1t0Lk5VTUVSSUNJREVOVElGSUVSXX18eHxYfFxcXFwqYClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOJywgYFt2PVxcXFxzXSooJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUl19KWAgK1xuICAgICAgICAgICAgICAgICAgIGAoPzpcXFxcLigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJdfSlgICtcbiAgICAgICAgICAgICAgICAgICBgKD86JHtzcmNbdC5QUkVSRUxFQVNFXX0pPyR7XG4gICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgIGApPyk/YClcblxuY3JlYXRlVG9rZW4oJ1hSQU5HRVBMQUlOTE9PU0UnLCBgW3Y9XFxcXHNdKigke3NyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV19KWAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCg/OlxcXFwuKCR7c3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgKD86XFxcXC4oJHtzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VMT09TRV19KT8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbdC5CVUlMRF19P2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCk/KT9gKVxuXG5jcmVhdGVUb2tlbignWFJBTkdFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ1hSQU5HRUxPT1NFJywgYF4ke3NyY1t0LkdUTFRdfVxcXFxzKiR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxuY3JlYXRlVG9rZW4oJ0NPRVJDRVBMQUlOJywgYCR7JyhefFteXFxcXGRdKScgK1xuICAgICAgICAgICAgICAnKFxcXFxkezEsJ30ke01BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEh9fSlgICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gICtcbiAgICAgICAgICAgICAgYCg/OlxcXFwuKFxcXFxkezEsJHtNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIfX0pKT9gKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRScsIGAke3NyY1t0LkNPRVJDRVBMQUlOXX0oPzokfFteXFxcXGRdKWApXG5jcmVhdGVUb2tlbignQ09FUkNFRlVMTCcsIHNyY1t0LkNPRVJDRVBMQUlOXSArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LlBSRVJFTEVBU0VdfSk/YCArXG4gICAgICAgICAgICAgIGAoPzoke3NyY1t0LkJVSUxEXX0pP2AgK1xuICAgICAgICAgICAgICBgKD86JHxbXlxcXFxkXSlgKVxuY3JlYXRlVG9rZW4oJ0NPRVJDRVJUTCcsIHNyY1t0LkNPRVJDRV0sIHRydWUpXG5jcmVhdGVUb2tlbignQ09FUkNFUlRMRlVMTCcsIHNyY1t0LkNPRVJDRUZVTExdLCB0cnVlKVxuXG4vLyBUaWxkZSByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwicmVhc29uYWJseSBhdCBvciBncmVhdGVyIHRoYW5cIlxuY3JlYXRlVG9rZW4oJ0xPTkVUSUxERScsICcoPzp+Pj8pJylcblxuY3JlYXRlVG9rZW4oJ1RJTERFVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuTE9ORVRJTERFXX1cXFxccytgLCB0cnVlKVxuZXhwb3J0cy50aWxkZVRyaW1SZXBsYWNlID0gJyQxfidcblxuY3JlYXRlVG9rZW4oJ1RJTERFJywgYF4ke3NyY1t0LkxPTkVUSUxERV19JHtzcmNbdC5YUkFOR0VQTEFJTl19JGApXG5jcmVhdGVUb2tlbignVElMREVMT09TRScsIGBeJHtzcmNbdC5MT05FVElMREVdfSR7c3JjW3QuWFJBTkdFUExBSU5MT09TRV19JGApXG5cbi8vIENhcmV0IHJhbmdlcy5cbi8vIE1lYW5pbmcgaXMgXCJhdCBsZWFzdCBhbmQgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aFwiXG5jcmVhdGVUb2tlbignTE9ORUNBUkVUJywgJyg/OlxcXFxeKScpXG5cbmNyZWF0ZVRva2VuKCdDQVJFVFRSSU0nLCBgKFxcXFxzKikke3NyY1t0LkxPTkVDQVJFVF19XFxcXHMrYCwgdHJ1ZSlcbmV4cG9ydHMuY2FyZXRUcmltUmVwbGFjZSA9ICckMV4nXG5cbmNyZWF0ZVRva2VuKCdDQVJFVCcsIGBeJHtzcmNbdC5MT05FQ0FSRVRdfSR7c3JjW3QuWFJBTkdFUExBSU5dfSRgKVxuY3JlYXRlVG9rZW4oJ0NBUkVUTE9PU0UnLCBgXiR7c3JjW3QuTE9ORUNBUkVUXX0ke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSRgKVxuXG4vLyBBIHNpbXBsZSBndC9sdC9lcSB0aGluZywgb3IganVzdCBcIlwiIHRvIGluZGljYXRlIFwiYW55IHZlcnNpb25cIlxuY3JlYXRlVG9rZW4oJ0NPTVBBUkFUT1JMT09TRScsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX0pJHxeJGApXG5jcmVhdGVUb2tlbignQ09NUEFSQVRPUicsIGBeJHtzcmNbdC5HVExUXX1cXFxccyooJHtzcmNbdC5GVUxMUExBSU5dfSkkfF4kYClcblxuLy8gQW4gZXhwcmVzc2lvbiB0byBzdHJpcCBhbnkgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBndGx0IGFuZCB0aGUgdGhpbmdcbi8vIGl0IG1vZGlmaWVzLCBzbyB0aGF0IGA+IDEuMi4zYCA9PT4gYD4xLjIuM2BcbmNyZWF0ZVRva2VuKCdDT01QQVJBVE9SVFJJTScsIGAoXFxcXHMqKSR7c3JjW3QuR1RMVF1cbn1cXFxccyooJHtzcmNbdC5MT09TRVBMQUlOXX18JHtzcmNbdC5YUkFOR0VQTEFJTl19KWAsIHRydWUpXG5leHBvcnRzLmNvbXBhcmF0b3JUcmltUmVwbGFjZSA9ICckMSQyJDMnXG5cbi8vIFNvbWV0aGluZyBsaWtlIGAxLjIuMyAtIDEuMi40YFxuLy8gTm90ZSB0aGF0IHRoZXNlIGFsbCB1c2UgdGhlIGxvb3NlIGZvcm0sIGJlY2F1c2UgdGhleSdsbCBiZVxuLy8gY2hlY2tlZCBhZ2FpbnN0IGVpdGhlciB0aGUgc3RyaWN0IG9yIGxvb3NlIGNvbXBhcmF0b3IgZm9ybVxuLy8gbGF0ZXIuXG5jcmVhdGVUb2tlbignSFlQSEVOUkFOR0UnLCBgXlxcXFxzKigke3NyY1t0LlhSQU5HRVBMQUlOXX0pYCArXG4gICAgICAgICAgICAgICAgICAgYFxcXFxzKy1cXFxccytgICtcbiAgICAgICAgICAgICAgICAgICBgKCR7c3JjW3QuWFJBTkdFUExBSU5dfSlgICtcbiAgICAgICAgICAgICAgICAgICBgXFxcXHMqJGApXG5cbmNyZWF0ZVRva2VuKCdIWVBIRU5SQU5HRUxPT1NFJywgYF5cXFxccyooJHtzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXX0pYCArXG4gICAgICAgICAgICAgICAgICAgICAgICBgXFxcXHMrLVxcXFxzK2AgK1xuICAgICAgICAgICAgICAgICAgICAgICAgYCgke3NyY1t0LlhSQU5HRVBMQUlOTE9PU0VdfSlgICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGBcXFxccyokYClcblxuLy8gU3RhciByYW5nZXMgYmFzaWNhbGx5IGp1c3QgYWxsb3cgYW55dGhpbmcgYXQgYWxsLlxuY3JlYXRlVG9rZW4oJ1NUQVInLCAnKDx8Pik/PT9cXFxccypcXFxcKicpXG4vLyA+PTAuMC4wIGlzIGxpa2UgYSBzdGFyXG5jcmVhdGVUb2tlbignR1RFMCcsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wXFxcXHMqJCcpXG5jcmVhdGVUb2tlbignR1RFMFBSRScsICdeXFxcXHMqPj1cXFxccyowXFxcXC4wXFxcXC4wLTBcXFxccyokJylcbiIsCiAgICAiLy8gcGFyc2Ugb3V0IGp1c3QgdGhlIG9wdGlvbnMgd2UgY2FyZSBhYm91dFxuY29uc3QgbG9vc2VPcHRpb24gPSBPYmplY3QuZnJlZXplKHsgbG9vc2U6IHRydWUgfSlcbmNvbnN0IGVtcHR5T3B0cyA9IE9iamVjdC5mcmVlemUoeyB9KVxuY29uc3QgcGFyc2VPcHRpb25zID0gb3B0aW9ucyA9PiB7XG4gIGlmICghb3B0aW9ucykge1xuICAgIHJldHVybiBlbXB0eU9wdHNcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gbG9vc2VPcHRpb25cbiAgfVxuXG4gIHJldHVybiBvcHRpb25zXG59XG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlT3B0aW9uc1xuIiwKICAgICJjb25zdCBudW1lcmljID0gL15bMC05XSskL1xuY29uc3QgY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IHtcbiAgY29uc3QgYW51bSA9IG51bWVyaWMudGVzdChhKVxuICBjb25zdCBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5jb25zdCByY29tcGFyZUlkZW50aWZpZXJzID0gKGEsIGIpID0+IGNvbXBhcmVJZGVudGlmaWVycyhiLCBhKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgY29tcGFyZUlkZW50aWZpZXJzLFxuICByY29tcGFyZUlkZW50aWZpZXJzLFxufVxuIiwKICAgICJjb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IHsgTUFYX0xFTkdUSCwgTUFYX1NBRkVfSU5URUdFUiB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvY29uc3RhbnRzJylcbmNvbnN0IHsgc2FmZVJlOiByZSwgdCB9ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcmUnKVxuXG5jb25zdCBwYXJzZU9wdGlvbnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9wYXJzZS1vcHRpb25zJylcbmNvbnN0IHsgY29tcGFyZUlkZW50aWZpZXJzIH0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9pZGVudGlmaWVycycpXG5jbGFzcyBTZW1WZXIge1xuICBjb25zdHJ1Y3RvciAodmVyc2lvbiwgb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgICBpZiAodmVyc2lvbi5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgICAgdmVyc2lvbi5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbi52ZXJzaW9uXG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgdmVyc2lvbi4gTXVzdCBiZSBhIHN0cmluZy4gR290IHR5cGUgXCIke3R5cGVvZiB2ZXJzaW9ufVwiLmApXG4gICAgfVxuXG4gICAgaWYgKHZlcnNpb24ubGVuZ3RoID4gTUFYX0xFTkdUSCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYHZlcnNpb24gaXMgbG9uZ2VyIHRoYW4gJHtNQVhfTEVOR1RIfSBjaGFyYWN0ZXJzYFxuICAgICAgKVxuICAgIH1cblxuICAgIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgLy8gdGhpcyBpc24ndCBhY3R1YWxseSByZWxldmFudCBmb3IgdmVyc2lvbnMsIGJ1dCBrZWVwIGl0IHNvIHRoYXQgd2VcbiAgICAvLyBkb24ndCBydW4gaW50byB0cm91YmxlIHBhc3NpbmcgdGhpcy5vcHRpb25zIGFyb3VuZC5cbiAgICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgICBjb25zdCBtID0gdmVyc2lvbi50cmltKCkubWF0Y2gob3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXSlcblxuICAgIGlmICghbSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBWZXJzaW9uOiAke3ZlcnNpb259YClcbiAgICB9XG5cbiAgICB0aGlzLnJhdyA9IHZlcnNpb25cblxuICAgIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gICAgdGhpcy5tYWpvciA9ICttWzFdXG4gICAgdGhpcy5taW5vciA9ICttWzJdXG4gICAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgICBpZiAodGhpcy5tYWpvciA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5tYWpvciA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWFqb3IgdmVyc2lvbicpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMubWlub3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWlub3IgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG1pbm9yIHZlcnNpb24nKVxuICAgIH1cblxuICAgIGlmICh0aGlzLnBhdGNoID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLnBhdGNoIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBwYXRjaCB2ZXJzaW9uJylcbiAgICB9XG5cbiAgICAvLyBudW1iZXJpZnkgYW55IHByZXJlbGVhc2UgbnVtZXJpYyBpZHNcbiAgICBpZiAoIW1bNF0pIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IG1bNF0uc3BsaXQoJy4nKS5tYXAoKGlkKSA9PiB7XG4gICAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgICAgY29uc3QgbnVtID0gK2lkXG4gICAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICAgIHJldHVybiBudW1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuYnVpbGQgPSBtWzVdID8gbVs1XS5zcGxpdCgnLicpIDogW11cbiAgICB0aGlzLmZvcm1hdCgpXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHRoaXMudmVyc2lvbiA9IGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLnBhdGNofWBcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgICAgdGhpcy52ZXJzaW9uICs9IGAtJHt0aGlzLnByZXJlbGVhc2Uuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmVyc2lvblxuICB9XG5cbiAgdG9TdHJpbmcgKCkge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb25cbiAgfVxuXG4gIGNvbXBhcmUgKG90aGVyKSB7XG4gICAgZGVidWcoJ1NlbVZlci5jb21wYXJlJywgdGhpcy52ZXJzaW9uLCB0aGlzLm9wdGlvbnMsIG90aGVyKVxuICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgICAgaWYgKHR5cGVvZiBvdGhlciA9PT0gJ3N0cmluZycgJiYgb3RoZXIgPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfVxuICAgICAgb3RoZXIgPSBuZXcgU2VtVmVyKG90aGVyLCB0aGlzLm9wdGlvbnMpXG4gICAgfVxuXG4gICAgaWYgKG90aGVyLnZlcnNpb24gPT09IHRoaXMudmVyc2lvbikge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jb21wYXJlTWFpbihvdGhlcikgfHwgdGhpcy5jb21wYXJlUHJlKG90aGVyKVxuICB9XG5cbiAgY29tcGFyZU1haW4gKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWFqb3IsIG90aGVyLm1ham9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMubWlub3IsIG90aGVyLm1pbm9yKSB8fFxuICAgICAgY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucGF0Y2gsIG90aGVyLnBhdGNoKVxuICAgIClcbiAgfVxuXG4gIGNvbXBhcmVQcmUgKG90aGVyKSB7XG4gICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgICB9XG5cbiAgICAvLyBOT1QgaGF2aW5nIGEgcHJlcmVsZWFzZSBpcyA+IGhhdmluZyBvbmVcbiAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfVxuXG4gICAgbGV0IGkgPSAwXG4gICAgZG8ge1xuICAgICAgY29uc3QgYSA9IHRoaXMucHJlcmVsZWFzZVtpXVxuICAgICAgY29uc3QgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICAgIGRlYnVnKCdwcmVyZWxlYXNlIGNvbXBhcmUnLCBpLCBhLCBiKVxuICAgICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIDBcbiAgICAgIH0gZWxzZSBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAxXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCsraSlcbiAgfVxuXG4gIGNvbXBhcmVCdWlsZCAob3RoZXIpIHtcbiAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICAgIH1cblxuICAgIGxldCBpID0gMFxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmJ1aWxkW2ldXG4gICAgICBjb25zdCBiID0gb3RoZXIuYnVpbGRbaV1cbiAgICAgIGRlYnVnKCdidWlsZCBjb21wYXJlJywgaSwgYSwgYilcbiAgICAgIGlmIChhID09PSB1bmRlZmluZWQgJiYgYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiAwXG4gICAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gMVxuICAgICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9IGVsc2UgaWYgKGEgPT09IGIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYSwgYilcbiAgICAgIH1cbiAgICB9IHdoaWxlICgrK2kpXG4gIH1cblxuICAvLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4gIC8vIGRvd24gdG8gcHJlLXJlbGVhc2UuIHByZW1ham9yIGFuZCBwcmVwYXRjaCB3b3JrIHRoZSBzYW1lIHdheS5cbiAgaW5jIChyZWxlYXNlLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSkge1xuICAgIHN3aXRjaCAocmVsZWFzZSkge1xuICAgICAgY2FzZSAncHJlbWFqb3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgICB0aGlzLm1ham9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlbWlub3InOlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncHJlcGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGFscmVhZHkgYSBwcmVyZWxlYXNlLCBpdCB3aWxsIGJ1bXAgdG8gdGhlIG5leHQgdmVyc2lvblxuICAgICAgICAvLyBkcm9wIGFueSBwcmVyZWxlYXNlcyB0aGF0IG1pZ2h0IGFscmVhZHkgZXhpc3QsIHNpbmNlIHRoZXkgYXJlIG5vdFxuICAgICAgICAvLyByZWxldmFudCBhdCB0aGlzIHBvaW50LlxuICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID0gMFxuICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICBicmVha1xuICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgICAvLyBwcmVwYXRjaC5cbiAgICAgIGNhc2UgJ3ByZXJlbGVhc2UnOlxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIsIGlkZW50aWZpZXJCYXNlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5jKCdwcmUnLCBpZGVudGlmaWVyLCBpZGVudGlmaWVyQmFzZSlcbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSAnbWFqb3InOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcHJlLW1ham9yIHZlcnNpb24sIGJ1bXAgdXAgdG8gdGhlIHNhbWUgbWFqb3IgdmVyc2lvbi5cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtYWpvci5cbiAgICAgICAgLy8gMS4wLjAtNSBidW1wcyB0byAxLjAuMFxuICAgICAgICAvLyAxLjEuMCBidW1wcyB0byAyLjAuMFxuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5taW5vciAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucGF0Y2ggIT09IDAgfHxcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWlub3IgPSAwXG4gICAgICAgIHRoaXMucGF0Y2ggPSAwXG4gICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdtaW5vcic6XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1pbm9yLlxuICAgICAgICAvLyAxLjIuMC01IGJ1bXBzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICAgIGlmICh0aGlzLnBhdGNoICE9PSAwIHx8IHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLm1pbm9yKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAncGF0Y2gnOlxuICAgICAgICAvLyBJZiB0aGlzIGlzIG5vdCBhIHByZS1yZWxlYXNlIHZlcnNpb24sIGl0IHdpbGwgaW5jcmVtZW50IHRoZSBwYXRjaC5cbiAgICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgICAgLy8gMS4yLjAtNSBwYXRjaGVzIHRvIDEuMi4wXG4gICAgICAgIC8vIDEuMi4wIHBhdGNoZXMgdG8gMS4yLjFcbiAgICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnBhdGNoKytcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgICBicmVha1xuICAgICAgLy8gVGhpcyBwcm9iYWJseSBzaG91bGRuJ3QgYmUgdXNlZCBwdWJsaWNseS5cbiAgICAgIC8vIDEuMC4wICdwcmUnIHdvdWxkIGJlY29tZSAxLjAuMC0wIHdoaWNoIGlzIHRoZSB3cm9uZyBkaXJlY3Rpb24uXG4gICAgICBjYXNlICdwcmUnOiB7XG4gICAgICAgIGNvbnN0IGJhc2UgPSBOdW1iZXIoaWRlbnRpZmllckJhc2UpID8gMSA6IDBcblxuICAgICAgICBpZiAoIWlkZW50aWZpZXIgJiYgaWRlbnRpZmllckJhc2UgPT09IGZhbHNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogaWRlbnRpZmllciBpcyBlbXB0eScpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtiYXNlXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBpID0gdGhpcy5wcmVyZWxlYXNlLmxlbmd0aFxuICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXJlbGVhc2VbaV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZVtpXSsrXG4gICAgICAgICAgICAgIGkgPSAtMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGRpZG4ndCBpbmNyZW1lbnQgYW55dGhpbmdcbiAgICAgICAgICAgIGlmIChpZGVudGlmaWVyID09PSB0aGlzLnByZXJlbGVhc2Uuam9pbignLicpICYmIGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiBpZGVudGlmaWVyIGFscmVhZHkgZXhpc3RzJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5wdXNoKGJhc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpZGVudGlmaWVyKSB7XG4gICAgICAgICAgLy8gMS4yLjAtYmV0YS4xIGJ1bXBzIHRvIDEuMi4wLWJldGEuMixcbiAgICAgICAgICAvLyAxLjIuMC1iZXRhLmZvb2JseiBvciAxLjIuMC1iZXRhIGJ1bXBzIHRvIDEuMi4wLWJldGEuMFxuICAgICAgICAgIGxldCBwcmVyZWxlYXNlID0gW2lkZW50aWZpZXIsIGJhc2VdXG4gICAgICAgICAgaWYgKGlkZW50aWZpZXJCYXNlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyXVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY29tcGFyZUlkZW50aWZpZXJzKHRoaXMucHJlcmVsZWFzZVswXSwgaWRlbnRpZmllcikgPT09IDApIHtcbiAgICAgICAgICAgIGlmIChpc05hTih0aGlzLnByZXJlbGVhc2VbMV0pKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IHByZXJlbGVhc2VcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gcHJlcmVsZWFzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluY3JlbWVudCBhcmd1bWVudDogJHtyZWxlYXNlfWApXG4gICAgfVxuICAgIHRoaXMucmF3ID0gdGhpcy5mb3JtYXQoKVxuICAgIGlmICh0aGlzLmJ1aWxkLmxlbmd0aCkge1xuICAgICAgdGhpcy5yYXcgKz0gYCske3RoaXMuYnVpbGQuam9pbignLicpfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFNlbVZlclxuIiwKICAgICJjb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuLi9jbGFzc2VzL3NlbXZlcicpXG5jb25zdCBwYXJzZSA9ICh2ZXJzaW9uLCBvcHRpb25zLCB0aHJvd0Vycm9ycyA9IGZhbHNlKSA9PiB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgaWYgKCF0aHJvd0Vycm9ycykge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gICAgdGhyb3cgZXJcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHBhcnNlXG4iLAogICAgImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IHBhcnNlID0gcmVxdWlyZSgnLi9wYXJzZScpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcblxuY29uc3QgY29lcmNlID0gKHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJykge1xuICAgIHZlcnNpb24gPSBTdHJpbmcodmVyc2lvbilcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge31cblxuICBsZXQgbWF0Y2ggPSBudWxsXG4gIGlmICghb3B0aW9ucy5ydGwpIHtcbiAgICBtYXRjaCA9IHZlcnNpb24ubWF0Y2gob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFRlVMTF0gOiByZVt0LkNPRVJDRV0pXG4gIH0gZWxzZSB7XG4gICAgLy8gRmluZCB0aGUgcmlnaHQtbW9zdCBjb2VyY2libGUgc3RyaW5nIHRoYXQgZG9lcyBub3Qgc2hhcmVcbiAgICAvLyBhIHRlcm1pbnVzIHdpdGggYSBtb3JlIGxlZnQtd2FyZCBjb2VyY2libGUgc3RyaW5nLlxuICAgIC8vIEVnLCAnMS4yLjMuNCcgd2FudHMgdG8gY29lcmNlICcyLjMuNCcsIG5vdCAnMy40JyBvciAnNCdcbiAgICAvLyBXaXRoIGluY2x1ZGVQcmVyZWxlYXNlIG9wdGlvbiBzZXQsICcxLjIuMy40LXJjJyB3YW50cyB0byBjb2VyY2UgJzIuMy40LXJjJywgbm90ICcyLjMuNCdcbiAgICAvL1xuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc3RyaW5nIGNoZWNraW5nIHdpdGggYSAvZyByZWdleHBcbiAgICAvLyBNYW51YWxseSBzZXQgdGhlIGluZGV4IHNvIGFzIHRvIHBpY2sgdXAgb3ZlcmxhcHBpbmcgbWF0Y2hlcy5cbiAgICAvLyBTdG9wIHdoZW4gd2UgZ2V0IGEgbWF0Y2ggdGhhdCBlbmRzIGF0IHRoZSBzdHJpbmcgZW5kLCBzaW5jZSBub1xuICAgIC8vIGNvZXJjaWJsZSBzdHJpbmcgY2FuIGJlIG1vcmUgcmlnaHQtd2FyZCB3aXRob3V0IHRoZSBzYW1lIHRlcm1pbnVzLlxuICAgIGNvbnN0IGNvZXJjZVJ0bFJlZ2V4ID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/IHJlW3QuQ09FUkNFUlRMRlVMTF0gOiByZVt0LkNPRVJDRVJUTF1cbiAgICBsZXQgbmV4dFxuICAgIHdoaWxlICgobmV4dCA9IGNvZXJjZVJ0bFJlZ2V4LmV4ZWModmVyc2lvbikpICYmXG4gICAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgICAgbmV4dC5pbmRleCArIG5leHRbMF0ubGVuZ3RoICE9PSBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkge1xuICAgICAgICBtYXRjaCA9IG5leHRcbiAgICAgIH1cbiAgICAgIGNvZXJjZVJ0bFJlZ2V4Lmxhc3RJbmRleCA9IG5leHQuaW5kZXggKyBuZXh0WzFdLmxlbmd0aCArIG5leHRbMl0ubGVuZ3RoXG4gICAgfVxuICAgIC8vIGxlYXZlIGl0IGluIGEgY2xlYW4gc3RhdGVcbiAgICBjb2VyY2VSdGxSZWdleC5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IG1ham9yID0gbWF0Y2hbMl1cbiAgY29uc3QgbWlub3IgPSBtYXRjaFszXSB8fCAnMCdcbiAgY29uc3QgcGF0Y2ggPSBtYXRjaFs0XSB8fCAnMCdcbiAgY29uc3QgcHJlcmVsZWFzZSA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiYgbWF0Y2hbNV0gPyBgLSR7bWF0Y2hbNV19YCA6ICcnXG4gIGNvbnN0IGJ1aWxkID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBtYXRjaFs2XSA/IGArJHttYXRjaFs2XX1gIDogJydcblxuICByZXR1cm4gcGFyc2UoYCR7bWFqb3J9LiR7bWlub3J9LiR7cGF0Y2h9JHtwcmVyZWxlYXNlfSR7YnVpbGR9YCwgb3B0aW9ucylcbn1cbm1vZHVsZS5leHBvcnRzID0gY29lcmNlXG4iLAogICAgImNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4uL2NsYXNzZXMvc2VtdmVyJylcbmNvbnN0IGNvbXBhcmUgPSAoYSwgYiwgbG9vc2UpID0+XG4gIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpXG5cbm1vZHVsZS5leHBvcnRzID0gY29tcGFyZVxuIiwKICAgICJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGd0ZSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgPj0gMFxubW9kdWxlLmV4cG9ydHMgPSBndGVcbiIsCiAgICAiY2xhc3MgTFJVQ2FjaGUge1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5tYXggPSAxMDAwXG4gICAgdGhpcy5tYXAgPSBuZXcgTWFwKClcbiAgfVxuXG4gIGdldCAoa2V5KSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm1hcC5nZXQoa2V5KVxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUga2V5IGZyb20gdGhlIG1hcCBhbmQgYWRkIGl0IHRvIHRoZSBlbmRcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gICAgICB0aGlzLm1hcC5zZXQoa2V5LCB2YWx1ZSlcbiAgICAgIHJldHVybiB2YWx1ZVxuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZSAoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubWFwLmRlbGV0ZShrZXkpXG4gIH1cblxuICBzZXQgKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy5kZWxldGUoa2V5KVxuXG4gICAgaWYgKCFkZWxldGVkICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIGNhY2hlIGlzIGZ1bGwsIGRlbGV0ZSB0aGUgbGVhc3QgcmVjZW50bHkgdXNlZCBpdGVtXG4gICAgICBpZiAodGhpcy5tYXAuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgICBjb25zdCBmaXJzdEtleSA9IHRoaXMubWFwLmtleXMoKS5uZXh0KCkudmFsdWVcbiAgICAgICAgdGhpcy5kZWxldGUoZmlyc3RLZXkpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubWFwLnNldChrZXksIHZhbHVlKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzXG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBMUlVDYWNoZVxuIiwKICAgICJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGVxID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA9PT0gMFxubW9kdWxlLmV4cG9ydHMgPSBlcVxuIiwKICAgICJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IG5lcSA9IChhLCBiLCBsb29zZSkgPT4gY29tcGFyZShhLCBiLCBsb29zZSkgIT09IDBcbm1vZHVsZS5leHBvcnRzID0gbmVxXG4iLAogICAgImNvbnN0IGNvbXBhcmUgPSByZXF1aXJlKCcuL2NvbXBhcmUnKVxuY29uc3QgZ3QgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpID4gMFxubW9kdWxlLmV4cG9ydHMgPSBndFxuIiwKICAgICJjb25zdCBjb21wYXJlID0gcmVxdWlyZSgnLi9jb21wYXJlJylcbmNvbnN0IGx0ID0gKGEsIGIsIGxvb3NlKSA9PiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8IDBcbm1vZHVsZS5leHBvcnRzID0gbHRcbiIsCiAgICAiY29uc3QgY29tcGFyZSA9IHJlcXVpcmUoJy4vY29tcGFyZScpXG5jb25zdCBsdGUgPSAoYSwgYiwgbG9vc2UpID0+IGNvbXBhcmUoYSwgYiwgbG9vc2UpIDw9IDBcbm1vZHVsZS5leHBvcnRzID0gbHRlXG4iLAogICAgImNvbnN0IGVxID0gcmVxdWlyZSgnLi9lcScpXG5jb25zdCBuZXEgPSByZXF1aXJlKCcuL25lcScpXG5jb25zdCBndCA9IHJlcXVpcmUoJy4vZ3QnKVxuY29uc3QgZ3RlID0gcmVxdWlyZSgnLi9ndGUnKVxuY29uc3QgbHQgPSByZXF1aXJlKCcuL2x0JylcbmNvbnN0IGx0ZSA9IHJlcXVpcmUoJy4vbHRlJylcblxuY29uc3QgY21wID0gKGEsIG9wLCBiLCBsb29zZSkgPT4ge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSA9PT0gYlxuXG4gICAgY2FzZSAnIT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0Jykge1xuICAgICAgICBiID0gYi52ZXJzaW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gYSAhPT0gYlxuXG4gICAgY2FzZSAnJzpcbiAgICBjYXNlICc9JzpcbiAgICBjYXNlICc9PSc6XG4gICAgICByZXR1cm4gZXEoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gbmVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gZ3QoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gZ3RlKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gbHQoYSwgYiwgbG9vc2UpXG5cbiAgICBjYXNlICc8PSc6XG4gICAgICByZXR1cm4gbHRlKGEsIGIsIGxvb3NlKVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgb3BlcmF0b3I6ICR7b3B9YClcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBjbXBcbiIsCiAgICAiY29uc3QgQU5ZID0gU3ltYm9sKCdTZW1WZXIgQU5ZJylcbi8vIGhvaXN0ZWQgY2xhc3MgZm9yIGN5Y2xpYyBkZXBlbmRlbmN5XG5jbGFzcyBDb21wYXJhdG9yIHtcbiAgc3RhdGljIGdldCBBTlkgKCkge1xuICAgIHJldHVybiBBTllcbiAgfVxuXG4gIGNvbnN0cnVjdG9yIChjb21wLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHBhcnNlT3B0aW9ucyhvcHRpb25zKVxuXG4gICAgaWYgKGNvbXAgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSB7XG4gICAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICAgIHJldHVybiBjb21wXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbXAgPSBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuICAgIGRlYnVnKCdjb21wYXJhdG9yJywgY29tcCwgb3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICAgIHRoaXMucGFyc2UoY29tcClcblxuICAgIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgICB0aGlzLnZhbHVlID0gJydcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gICAgfVxuXG4gICAgZGVidWcoJ2NvbXAnLCB0aGlzKVxuICB9XG5cbiAgcGFyc2UgKGNvbXApIHtcbiAgICBjb25zdCByID0gdGhpcy5vcHRpb25zLmxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICAgIGNvbnN0IG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgICBpZiAoIW0pIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgY29tcGFyYXRvcjogJHtjb21wfWApXG4gICAgfVxuXG4gICAgdGhpcy5vcGVyYXRvciA9IG1bMV0gIT09IHVuZGVmaW5lZCA/IG1bMV0gOiAnJ1xuICAgIGlmICh0aGlzLm9wZXJhdG9yID09PSAnPScpIHtcbiAgICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIGl0IGxpdGVyYWxseSBpcyBqdXN0ICc+JyBvciAnJyB0aGVuIGFsbG93IGFueXRoaW5nLlxuICAgIGlmICghbVsyXSkge1xuICAgICAgdGhpcy5zZW12ZXIgPSBBTllcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgICB9XG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRlc3QgKHZlcnNpb24pIHtcbiAgICBkZWJ1ZygnQ29tcGFyYXRvci50ZXN0JywgdmVyc2lvbiwgdGhpcy5vcHRpb25zLmxvb3NlKVxuXG4gICAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIHRoaXMub3B0aW9ucylcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbXAodmVyc2lvbiwgdGhpcy5vcGVyYXRvciwgdGhpcy5zZW12ZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIGludGVyc2VjdHMgKGNvbXAsIG9wdGlvbnMpIHtcbiAgICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgQ29tcGFyYXRvciBpcyByZXF1aXJlZCcpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmFuZ2UoY29tcC52YWx1ZSwgb3B0aW9ucykudGVzdCh0aGlzLnZhbHVlKVxuICAgIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICAgIGlmIChjb21wLnZhbHVlID09PSAnJykge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnZhbHVlLCBvcHRpb25zKS50ZXN0KGNvbXAuc2VtdmVyKVxuICAgIH1cblxuICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnMob3B0aW9ucylcblxuICAgIC8vIFNwZWNpYWwgY2FzZXMgd2hlcmUgbm90aGluZyBjYW4gcG9zc2libHkgYmUgbG93ZXJcbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJlxuICAgICAgKHRoaXMudmFsdWUgPT09ICc8MC4wLjAtMCcgfHwgY29tcC52YWx1ZSA9PT0gJzwwLjAuMC0wJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgJiZcbiAgICAgICh0aGlzLnZhbHVlLnN0YXJ0c1dpdGgoJzwwLjAuMCcpIHx8IGNvbXAudmFsdWUuc3RhcnRzV2l0aCgnPDAuMC4wJykpKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICAvLyBTYW1lIGRpcmVjdGlvbiBpbmNyZWFzaW5nICg+IG9yID49KVxuICAgIGlmICh0aGlzLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSAmJiBjb21wLm9wZXJhdG9yLnN0YXJ0c1dpdGgoJz4nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gU2FtZSBkaXJlY3Rpb24gZGVjcmVhc2luZyAoPCBvciA8PSlcbiAgICBpZiAodGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIHNhbWUgU2VtVmVyIGFuZCBib3RoIHNpZGVzIGFyZSBpbmNsdXNpdmUgKDw9IG9yID49KVxuICAgIGlmIChcbiAgICAgICh0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5pbmNsdWRlcygnPScpICYmIGNvbXAub3BlcmF0b3IuaW5jbHVkZXMoJz0nKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgLy8gb3Bwb3NpdGUgZGlyZWN0aW9ucyBsZXNzIHRoYW5cbiAgICBpZiAoY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICAgdGhpcy5vcGVyYXRvci5zdGFydHNXaXRoKCc+JykgJiYgY29tcC5vcGVyYXRvci5zdGFydHNXaXRoKCc8JykpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIC8vIG9wcG9zaXRlIGRpcmVjdGlvbnMgZ3JlYXRlciB0aGFuXG4gICAgaWYgKGNtcCh0aGlzLnNlbXZlciwgJz4nLCBjb21wLnNlbXZlciwgb3B0aW9ucykgJiZcbiAgICAgIHRoaXMub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPCcpICYmIGNvbXAub3BlcmF0b3Iuc3RhcnRzV2l0aCgnPicpKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IENvbXBhcmF0b3JcblxuY29uc3QgcGFyc2VPcHRpb25zID0gcmVxdWlyZSgnLi4vaW50ZXJuYWwvcGFyc2Utb3B0aW9ucycpXG5jb25zdCB7IHNhZmVSZTogcmUsIHQgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IGNtcCA9IHJlcXVpcmUoJy4uL2Z1bmN0aW9ucy9jbXAnKVxuY29uc3QgZGVidWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbC9kZWJ1ZycpXG5jb25zdCBTZW1WZXIgPSByZXF1aXJlKCcuL3NlbXZlcicpXG5jb25zdCBSYW5nZSA9IHJlcXVpcmUoJy4vcmFuZ2UnKVxuIiwKICAgICJjb25zdCBTUEFDRV9DSEFSQUNURVJTID0gL1xccysvZ1xuXG4vLyBob2lzdGVkIGNsYXNzIGZvciBjeWNsaWMgZGVwZW5kZW5jeVxuY2xhc3MgUmFuZ2Uge1xuICBjb25zdHJ1Y3RvciAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gcGFyc2VPcHRpb25zKG9wdGlvbnMpXG5cbiAgICBpZiAocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkge1xuICAgICAgaWYgKFxuICAgICAgICByYW5nZS5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlICYmXG4gICAgICAgIHJhbmdlLmluY2x1ZGVQcmVyZWxlYXNlID09PSAhIW9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gcmFuZ2VcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UucmF3LCBvcHRpb25zKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChyYW5nZSBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICAgIC8vIGp1c3QgcHV0IGl0IGluIHRoZSBzZXQgYW5kIHJldHVyblxuICAgICAgdGhpcy5yYXcgPSByYW5nZS52YWx1ZVxuICAgICAgdGhpcy5zZXQgPSBbW3JhbmdlXV1cbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gdW5kZWZpbmVkXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgICB0aGlzLmxvb3NlID0gISFvcHRpb25zLmxvb3NlXG4gICAgdGhpcy5pbmNsdWRlUHJlcmVsZWFzZSA9ICEhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZVxuXG4gICAgLy8gRmlyc3QgcmVkdWNlIGFsbCB3aGl0ZXNwYWNlIGFzIG11Y2ggYXMgcG9zc2libGUgc28gd2UgZG8gbm90IGhhdmUgdG8gcmVseVxuICAgIC8vIG9uIHBvdGVudGlhbGx5IHNsb3cgcmVnZXhlcyBsaWtlIFxccyouIFRoaXMgaXMgdGhlbiBzdG9yZWQgYW5kIHVzZWQgZm9yXG4gICAgLy8gZnV0dXJlIGVycm9yIG1lc3NhZ2VzIGFzIHdlbGwuXG4gICAgdGhpcy5yYXcgPSByYW5nZS50cmltKCkucmVwbGFjZShTUEFDRV9DSEFSQUNURVJTLCAnICcpXG5cbiAgICAvLyBGaXJzdCwgc3BsaXQgb24gfHxcbiAgICB0aGlzLnNldCA9IHRoaXMucmF3XG4gICAgICAuc3BsaXQoJ3x8JylcbiAgICAgIC8vIG1hcCB0aGUgcmFuZ2UgdG8gYSAyZCBhcnJheSBvZiBjb21wYXJhdG9yc1xuICAgICAgLm1hcChyID0+IHRoaXMucGFyc2VSYW5nZShyLnRyaW0oKSkpXG4gICAgICAvLyB0aHJvdyBvdXQgYW55IGNvbXBhcmF0b3IgbGlzdHMgdGhhdCBhcmUgZW1wdHlcbiAgICAgIC8vIHRoaXMgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgaXQgd2FzIG5vdCBhIHZhbGlkIHJhbmdlLCB3aGljaCBpcyBhbGxvd2VkXG4gICAgICAvLyBpbiBsb29zZSBtb2RlLCBidXQgd2lsbCBzdGlsbCB0aHJvdyBpZiB0aGUgV0hPTEUgcmFuZ2UgaXMgaW52YWxpZC5cbiAgICAgIC5maWx0ZXIoYyA9PiBjLmxlbmd0aClcblxuICAgIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIFNlbVZlciBSYW5nZTogJHt0aGlzLnJhd31gKVxuICAgIH1cblxuICAgIC8vIGlmIHdlIGhhdmUgYW55IHRoYXQgYXJlIG5vdCB0aGUgbnVsbCBzZXQsIHRocm93IG91dCBudWxsIHNldHMuXG4gICAgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIGtlZXAgdGhlIGZpcnN0IG9uZSwgaW4gY2FzZSB0aGV5J3JlIGFsbCBudWxsIHNldHNcbiAgICAgIGNvbnN0IGZpcnN0ID0gdGhpcy5zZXRbMF1cbiAgICAgIHRoaXMuc2V0ID0gdGhpcy5zZXQuZmlsdGVyKGMgPT4gIWlzTnVsbFNldChjWzBdKSlcbiAgICAgIGlmICh0aGlzLnNldC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5zZXQgPSBbZmlyc3RdXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgLy8gaWYgd2UgaGF2ZSBhbnkgdGhhdCBhcmUgKiwgdGhlbiB0aGUgcmFuZ2UgaXMganVzdCAqXG4gICAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLnNldCkge1xuICAgICAgICAgIGlmIChjLmxlbmd0aCA9PT0gMSAmJiBpc0FueShjWzBdKSkge1xuICAgICAgICAgICAgdGhpcy5zZXQgPSBbY11cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtYXR0ZWQgPSB1bmRlZmluZWRcbiAgfVxuXG4gIGdldCByYW5nZSAoKSB7XG4gICAgaWYgKHRoaXMuZm9ybWF0dGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuZm9ybWF0dGVkID0gJydcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJ3x8J1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBzID0gdGhpcy5zZXRbaV1cbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21wcy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgIGlmIChrID4gMCkge1xuICAgICAgICAgICAgdGhpcy5mb3JtYXR0ZWQgKz0gJyAnXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZm9ybWF0dGVkICs9IGNvbXBzW2tdLnRvU3RyaW5nKCkudHJpbSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0dGVkXG4gIH1cblxuICBmb3JtYXQgKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmdlXG4gIH1cblxuICB0b1N0cmluZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZ2VcbiAgfVxuXG4gIHBhcnNlUmFuZ2UgKHJhbmdlKSB7XG4gICAgLy8gbWVtb2l6ZSByYW5nZSBwYXJzaW5nIGZvciBwZXJmb3JtYW5jZS5cbiAgICAvLyB0aGlzIGlzIGEgdmVyeSBob3QgcGF0aCwgYW5kIGZ1bGx5IGRldGVybWluaXN0aWMuXG4gICAgY29uc3QgbWVtb09wdHMgPVxuICAgICAgKHRoaXMub3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSAmJiBGTEFHX0lOQ0xVREVfUFJFUkVMRUFTRSkgfFxuICAgICAgKHRoaXMub3B0aW9ucy5sb29zZSAmJiBGTEFHX0xPT1NFKVxuICAgIGNvbnN0IG1lbW9LZXkgPSBtZW1vT3B0cyArICc6JyArIHJhbmdlXG4gICAgY29uc3QgY2FjaGVkID0gY2FjaGUuZ2V0KG1lbW9LZXkpXG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZFxuICAgIH1cblxuICAgIGNvbnN0IGxvb3NlID0gdGhpcy5vcHRpb25zLmxvb3NlXG4gICAgLy8gYDEuMi4zIC0gMS4yLjRgID0+IGA+PTEuMi4zIDw9MS4yLjRgXG4gICAgY29uc3QgaHIgPSBsb29zZSA/IHJlW3QuSFlQSEVOUkFOR0VMT09TRV0gOiByZVt0LkhZUEhFTlJBTkdFXVxuICAgIHJhbmdlID0gcmFuZ2UucmVwbGFjZShociwgaHlwaGVuUmVwbGFjZSh0aGlzLm9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UpKVxuICAgIGRlYnVnKCdoeXBoZW4gcmVwbGFjZScsIHJhbmdlKVxuXG4gICAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ09NUEFSQVRPUlRSSU1dLCBjb21wYXJhdG9yVHJpbVJlcGxhY2UpXG4gICAgZGVidWcoJ2NvbXBhcmF0b3IgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYH4gMS4yLjNgID0+IGB+MS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuVElMREVUUklNXSwgdGlsZGVUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygndGlsZGUgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gYF4gMS4yLjNgID0+IGBeMS4yLjNgXG4gICAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKHJlW3QuQ0FSRVRUUklNXSwgY2FyZXRUcmltUmVwbGFjZSlcbiAgICBkZWJ1ZygnY2FyZXQgdHJpbScsIHJhbmdlKVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHJhbmdlIGlzIGNvbXBsZXRlbHkgdHJpbW1lZCBhbmRcbiAgICAvLyByZWFkeSB0byBiZSBzcGxpdCBpbnRvIGNvbXBhcmF0b3JzLlxuXG4gICAgbGV0IHJhbmdlTGlzdCA9IHJhbmdlXG4gICAgICAuc3BsaXQoJyAnKVxuICAgICAgLm1hcChjb21wID0+IHBhcnNlQ29tcGFyYXRvcihjb21wLCB0aGlzLm9wdGlvbnMpKVxuICAgICAgLmpvaW4oJyAnKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC8vID49MC4wLjAgaXMgZXF1aXZhbGVudCB0byAqXG4gICAgICAubWFwKGNvbXAgPT4gcmVwbGFjZUdURTAoY29tcCwgdGhpcy5vcHRpb25zKSlcblxuICAgIGlmIChsb29zZSkge1xuICAgICAgLy8gaW4gbG9vc2UgbW9kZSwgdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgdmFsaWQgY29tcGFyYXRvcnNcbiAgICAgIHJhbmdlTGlzdCA9IHJhbmdlTGlzdC5maWx0ZXIoY29tcCA9PiB7XG4gICAgICAgIGRlYnVnKCdsb29zZSBpbnZhbGlkIGZpbHRlcicsIGNvbXAsIHRoaXMub3B0aW9ucylcbiAgICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChyZVt0LkNPTVBBUkFUT1JMT09TRV0pXG4gICAgICB9KVxuICAgIH1cbiAgICBkZWJ1ZygncmFuZ2UgbGlzdCcsIHJhbmdlTGlzdClcblxuICAgIC8vIGlmIGFueSBjb21wYXJhdG9ycyBhcmUgdGhlIG51bGwgc2V0LCB0aGVuIHJlcGxhY2Ugd2l0aCBKVVNUIG51bGwgc2V0XG4gICAgLy8gaWYgbW9yZSB0aGFuIG9uZSBjb21wYXJhdG9yLCByZW1vdmUgYW55ICogY29tcGFyYXRvcnNcbiAgICAvLyBhbHNvLCBkb24ndCBpbmNsdWRlIHRoZSBzYW1lIGNvbXBhcmF0b3IgbW9yZSB0aGFuIG9uY2VcbiAgICBjb25zdCByYW5nZU1hcCA9IG5ldyBNYXAoKVxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gcmFuZ2VMaXN0Lm1hcChjb21wID0+IG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucykpXG4gICAgZm9yIChjb25zdCBjb21wIG9mIGNvbXBhcmF0b3JzKSB7XG4gICAgICBpZiAoaXNOdWxsU2V0KGNvbXApKSB7XG4gICAgICAgIHJldHVybiBbY29tcF1cbiAgICAgIH1cbiAgICAgIHJhbmdlTWFwLnNldChjb21wLnZhbHVlLCBjb21wKVxuICAgIH1cbiAgICBpZiAocmFuZ2VNYXAuc2l6ZSA+IDEgJiYgcmFuZ2VNYXAuaGFzKCcnKSkge1xuICAgICAgcmFuZ2VNYXAuZGVsZXRlKCcnKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IFsuLi5yYW5nZU1hcC52YWx1ZXMoKV1cbiAgICBjYWNoZS5zZXQobWVtb0tleSwgcmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGludGVyc2VjdHMgKHJhbmdlLCBvcHRpb25zKSB7XG4gICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2EgUmFuZ2UgaXMgcmVxdWlyZWQnKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNldC5zb21lKCh0aGlzQ29tcGFyYXRvcnMpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgICByYW5nZS5zZXQuc29tZSgocmFuZ2VDb21wYXJhdG9ycykgPT4ge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgICB0aGlzQ29tcGFyYXRvcnMuZXZlcnkoKHRoaXNDb21wYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiByYW5nZUNvbXBhcmF0b3JzLmV2ZXJ5KChyYW5nZUNvbXBhcmF0b3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICB9KVxuICB9XG5cbiAgLy8gaWYgQU5ZIG9mIHRoZSBzZXRzIG1hdGNoIEFMTCBvZiBpdHMgY29tcGFyYXRvcnMsIHRoZW4gcGFzc1xuICB0ZXN0ICh2ZXJzaW9uKSB7XG4gICAgaWYgKCF2ZXJzaW9uKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJhbmdlXG5cbmNvbnN0IExSVSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2xydWNhY2hlJylcbmNvbnN0IGNhY2hlID0gbmV3IExSVSgpXG5cbmNvbnN0IHBhcnNlT3B0aW9ucyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3BhcnNlLW9wdGlvbnMnKVxuY29uc3QgQ29tcGFyYXRvciA9IHJlcXVpcmUoJy4vY29tcGFyYXRvcicpXG5jb25zdCBkZWJ1ZyA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2RlYnVnJylcbmNvbnN0IFNlbVZlciA9IHJlcXVpcmUoJy4vc2VtdmVyJylcbmNvbnN0IHtcbiAgc2FmZVJlOiByZSxcbiAgdCxcbiAgY29tcGFyYXRvclRyaW1SZXBsYWNlLFxuICB0aWxkZVRyaW1SZXBsYWNlLFxuICBjYXJldFRyaW1SZXBsYWNlLFxufSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL3JlJylcbmNvbnN0IHsgRkxBR19JTkNMVURFX1BSRVJFTEVBU0UsIEZMQUdfTE9PU0UgfSA9IHJlcXVpcmUoJy4uL2ludGVybmFsL2NvbnN0YW50cycpXG5cbmNvbnN0IGlzTnVsbFNldCA9IGMgPT4gYy52YWx1ZSA9PT0gJzwwLjAuMC0wJ1xuY29uc3QgaXNBbnkgPSBjID0+IGMudmFsdWUgPT09ICcnXG5cbi8vIHRha2UgYSBzZXQgb2YgY29tcGFyYXRvcnMgYW5kIGRldGVybWluZSB3aGV0aGVyIHRoZXJlXG4vLyBleGlzdHMgYSB2ZXJzaW9uIHdoaWNoIGNhbiBzYXRpc2Z5IGl0XG5jb25zdCBpc1NhdGlzZmlhYmxlID0gKGNvbXBhcmF0b3JzLCBvcHRpb25zKSA9PiB7XG4gIGxldCByZXN1bHQgPSB0cnVlXG4gIGNvbnN0IHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICBsZXQgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoKG90aGVyQ29tcGFyYXRvcikgPT4ge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmNvbnN0IHBhcnNlQ29tcGFyYXRvciA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjb21wJywgY29tcCwgb3B0aW9ucylcbiAgY29tcCA9IHJlcGxhY2VDYXJldHMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ2NhcmV0JywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VUaWxkZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3RpbGRlcycsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlWFJhbmdlcyhjb21wLCBvcHRpb25zKVxuICBkZWJ1ZygneHJhbmdlJywgY29tcClcbiAgY29tcCA9IHJlcGxhY2VTdGFycyhjb21wLCBvcHRpb25zKVxuICBkZWJ1Zygnc3RhcnMnLCBjb21wKVxuICByZXR1cm4gY29tcFxufVxuXG5jb25zdCBpc1ggPSBpZCA9PiAhaWQgfHwgaWQudG9Mb3dlckNhc2UoKSA9PT0gJ3gnIHx8IGlkID09PSAnKidcblxuLy8gfiwgfj4gLS0+ICogKGFueSwga2luZGEgc2lsbHkpXG4vLyB+MiwgfjIueCwgfjIueC54LCB+PjIsIH4+Mi54IH4+Mi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIH4yLjAsIH4yLjAueCwgfj4yLjAsIH4+Mi4wLnggLS0+ID49Mi4wLjAgPDIuMS4wLTBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wLTBcbi8vIH4xLjIuMywgfj4xLjIuMyAtLT4gPj0xLjIuMyA8MS4zLjAtMFxuLy8gfjEuMi4wLCB+PjEuMi4wIC0tPiA+PTEuMi4wIDwxLjMuMC0wXG4vLyB+MC4wLjEgLS0+ID49MC4wLjEgPDAuMS4wLTBcbmNvbnN0IHJlcGxhY2VUaWxkZXMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VUaWxkZShjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VUaWxkZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5USUxERUxPT1NFXSA6IHJlW3QuVElMREVdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ3RpbGRlJywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAgPCR7K00gKyAxfS4wLjAtMGBcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMC0wXG4gICAgICByZXQgPSBgPj0ke019LiR7bX0uMCA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gfjEuMi4zID09ID49MS4yLjMgPDEuMy4wLTBcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgIH0gPCR7TX0uJHsrbSArIDF9LjAtMGBcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wLTBcbi8vIF4yLjAsIF4yLjAueCAtLT4gPj0yLjAuMCA8My4wLjAtMFxuLy8gXjEuMiwgXjEuMi54IC0tPiA+PTEuMi4wIDwyLjAuMC0wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wLTBcbi8vIF4xLjIuMCAtLT4gPj0xLjIuMCA8Mi4wLjAtMFxuLy8gXjAuMC4xIC0tPiA+PTAuMC4xIDwwLjAuMi0wXG4vLyBeMC4xLjAgLS0+ID49MC4xLjAgPDAuMi4wLTBcbmNvbnN0IHJlcGxhY2VDYXJldHMgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAuc3BsaXQoL1xccysvKVxuICAgIC5tYXAoKGMpID0+IHJlcGxhY2VDYXJldChjLCBvcHRpb25zKSlcbiAgICAuam9pbignICcpXG59XG5cbmNvbnN0IHJlcGxhY2VDYXJldCA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdjYXJldCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbnN0IHIgPSBvcHRpb25zLmxvb3NlID8gcmVbdC5DQVJFVExPT1NFXSA6IHJlW3QuQ0FSRVRdXG4gIGNvbnN0IHogPSBvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gJy0wJyA6ICcnXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKF8sIE0sIG0sIHAsIHByKSA9PiB7XG4gICAgZGVidWcoJ2NhcmV0JywgY29tcCwgXywgTSwgbSwgcCwgcHIpXG4gICAgbGV0IHJldFxuXG4gICAgaWYgKGlzWChNKSkge1xuICAgICAgcmV0ID0gJydcbiAgICB9IGVsc2UgaWYgKGlzWChtKSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3p9IDwkeytNICsgMX0uMC4wLTBgXG4gICAgfSBlbHNlIGlmIChpc1gocCkpIHtcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LjAke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uMCR7en0gPCR7K00gKyAxfS4wLjAtMGBcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHByKSB7XG4gICAgICBkZWJ1ZygncmVwbGFjZUNhcmV0IHByJywgcHIpXG4gICAgICBpZiAoTSA9PT0gJzAnKSB7XG4gICAgICAgIGlmIChtID09PSAnMCcpIHtcbiAgICAgICAgICByZXQgPSBgPj0ke019LiR7bX0uJHtwfS0ke3ByXG4gICAgICAgICAgfSA8JHtNfS4ke219LiR7K3AgKyAxfS0wYFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgICB9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3B9LSR7cHJcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7bX0uJHsrcCArIDF9LTBgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0ID0gYD49JHtNfS4ke219LiR7cFxuICAgICAgICAgIH0ke3p9IDwke019LiR7K20gKyAxfS4wLTBgXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4ke3BcbiAgICAgICAgfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgICAgfVxuICAgIH1cblxuICAgIGRlYnVnKCdjYXJldCByZXR1cm4nLCByZXQpXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG5jb25zdCByZXBsYWNlWFJhbmdlcyA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wXG4gICAgLnNwbGl0KC9cXHMrLylcbiAgICAubWFwKChjKSA9PiByZXBsYWNlWFJhbmdlKGMsIG9wdGlvbnMpKVxuICAgIC5qb2luKCcgJylcbn1cblxuY29uc3QgcmVwbGFjZVhSYW5nZSA9IChjb21wLCBvcHRpb25zKSA9PiB7XG4gIGNvbXAgPSBjb21wLnRyaW0oKVxuICBjb25zdCByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpID0+IHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICBjb25zdCB4TSA9IGlzWChNKVxuICAgIGNvbnN0IHhtID0geE0gfHwgaXNYKG0pXG4gICAgY29uc3QgeHAgPSB4bSB8fCBpc1gocClcbiAgICBjb25zdCBhbnlYID0geHBcblxuICAgIGlmIChndGx0ID09PSAnPScgJiYgYW55WCkge1xuICAgICAgZ3RsdCA9ICcnXG4gICAgfVxuXG4gICAgLy8gaWYgd2UncmUgaW5jbHVkaW5nIHByZXJlbGVhc2VzIGluIHRoZSBtYXRjaCwgdGhlbiB3ZSBuZWVkXG4gICAgLy8gdG8gZml4IHRoaXMgdG8gLTAsIHRoZSBsb3dlc3QgcG9zc2libGUgcHJlcmVsZWFzZSB2YWx1ZVxuICAgIHByID0gb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSA/ICctMCcgOiAnJ1xuXG4gICAgaWYgKHhNKSB7XG4gICAgICBpZiAoZ3RsdCA9PT0gJz4nIHx8IGd0bHQgPT09ICc8Jykge1xuICAgICAgICAvLyBub3RoaW5nIGlzIGFsbG93ZWRcbiAgICAgICAgcmV0ID0gJzwwLjAuMC0wJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBmb3JiaWRkZW5cbiAgICAgICAgcmV0ID0gJyonXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChndGx0ICYmIGFueVgpIHtcbiAgICAgIC8vIHdlIGtub3cgcGF0Y2ggaXMgYW4geCwgYmVjYXVzZSB3ZSBoYXZlIGFueSB4IGF0IGFsbC5cbiAgICAgIC8vIHJlcGxhY2UgWCB3aXRoIDBcbiAgICAgIGlmICh4bSkge1xuICAgICAgICBtID0gMFxuICAgICAgfVxuICAgICAgcCA9IDBcblxuICAgICAgaWYgKGd0bHQgPT09ICc+Jykge1xuICAgICAgICAvLyA+MSA9PiA+PTIuMC4wXG4gICAgICAgIC8vID4xLjIgPT4gPj0xLjMuMFxuICAgICAgICBndGx0ID0gJz49J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgICAgbSA9IDBcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgICBwID0gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGd0bHQgPT09ICc8PScpIHtcbiAgICAgICAgLy8gPD0wLjcueCBpcyBhY3R1YWxseSA8MC44LjAsIHNpbmNlIGFueSAwLjcueCBzaG91bGRcbiAgICAgICAgLy8gcGFzcy4gIFNpbWlsYXJseSwgPD03LnggaXMgYWN0dWFsbHkgPDguMC4wLCBldGMuXG4gICAgICAgIGd0bHQgPSAnPCdcbiAgICAgICAgaWYgKHhtKSB7XG4gICAgICAgICAgTSA9ICtNICsgMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG0gPSArbSArIDFcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZ3RsdCA9PT0gJzwnKSB7XG4gICAgICAgIHByID0gJy0wJ1xuICAgICAgfVxuXG4gICAgICByZXQgPSBgJHtndGx0ICsgTX0uJHttfS4ke3B9JHtwcn1gXG4gICAgfSBlbHNlIGlmICh4bSkge1xuICAgICAgcmV0ID0gYD49JHtNfS4wLjAke3ByfSA8JHsrTSArIDF9LjAuMC0wYFxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9IGA+PSR7TX0uJHttfS4wJHtwclxuICAgICAgfSA8JHtNfS4keyttICsgMX0uMC0wYFxuICAgIH1cblxuICAgIGRlYnVnKCd4UmFuZ2UgcmV0dXJuJywgcmV0KVxuXG4gICAgcmV0dXJuIHJldFxuICB9KVxufVxuXG4vLyBCZWNhdXNlICogaXMgQU5ELWVkIHdpdGggZXZlcnl0aGluZyBlbHNlIGluIHRoZSBjb21wYXJhdG9yLFxuLy8gYW5kICcnIG1lYW5zIFwiYW55IHZlcnNpb25cIiwganVzdCByZW1vdmUgdGhlICpzIGVudGlyZWx5LlxuY29uc3QgcmVwbGFjZVN0YXJzID0gKGNvbXAsIG9wdGlvbnMpID0+IHtcbiAgZGVidWcoJ3JlcGxhY2VTdGFycycsIGNvbXAsIG9wdGlvbnMpXG4gIC8vIExvb3NlbmVzcyBpcyBpZ25vcmVkIGhlcmUuICBzdGFyIGlzIGFsd2F5cyBhcyBsb29zZSBhcyBpdCBnZXRzIVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVt0LlNUQVJdLCAnJylcbn1cblxuY29uc3QgcmVwbGFjZUdURTAgPSAoY29tcCwgb3B0aW9ucykgPT4ge1xuICBkZWJ1ZygncmVwbGFjZUdURTAnLCBjb21wLCBvcHRpb25zKVxuICByZXR1cm4gY29tcFxuICAgIC50cmltKClcbiAgICAucmVwbGFjZShyZVtvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlID8gdC5HVEUwUFJFIDogdC5HVEUwXSwgJycpXG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRvIHN0cmluZy5yZXBsYWNlKHJlW3QuSFlQSEVOUkFOR0VdKVxuLy8gTSwgbSwgcGF0Y2gsIHByZXJlbGVhc2UsIGJ1aWxkXG4vLyAxLjIgLSAzLjQuNSA9PiA+PTEuMi4wIDw9My40LjVcbi8vIDEuMi4zIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wLTAgQW55IDMuNC54IHdpbGwgZG9cbi8vIDEuMiAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMC0wXG4vLyBUT0RPIGJ1aWxkP1xuY29uc3QgaHlwaGVuUmVwbGFjZSA9IGluY1ByID0+ICgkMCxcbiAgZnJvbSwgZk0sIGZtLCBmcCwgZnByLCBmYixcbiAgdG8sIHRNLCB0bSwgdHAsIHRwcikgPT4ge1xuICBpZiAoaXNYKGZNKSkge1xuICAgIGZyb20gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWChmbSkpIHtcbiAgICBmcm9tID0gYD49JHtmTX0uMC4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoaXNYKGZwKSkge1xuICAgIGZyb20gPSBgPj0ke2ZNfS4ke2ZtfS4wJHtpbmNQciA/ICctMCcgOiAnJ31gXG4gIH0gZWxzZSBpZiAoZnByKSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX1gXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9IGA+PSR7ZnJvbX0ke2luY1ByID8gJy0wJyA6ICcnfWBcbiAgfVxuXG4gIGlmIChpc1godE0pKSB7XG4gICAgdG8gPSAnJ1xuICB9IGVsc2UgaWYgKGlzWCh0bSkpIHtcbiAgICB0byA9IGA8JHsrdE0gKyAxfS4wLjAtMGBcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7K3RtICsgMX0uMC0wYFxuICB9IGVsc2UgaWYgKHRwcikge1xuICAgIHRvID0gYDw9JHt0TX0uJHt0bX0uJHt0cH0tJHt0cHJ9YFxuICB9IGVsc2UgaWYgKGluY1ByKSB7XG4gICAgdG8gPSBgPCR7dE19LiR7dG19LiR7K3RwICsgMX0tMGBcbiAgfSBlbHNlIHtcbiAgICB0byA9IGA8PSR7dG99YFxuICB9XG5cbiAgcmV0dXJuIGAke2Zyb219ICR7dG99YC50cmltKClcbn1cblxuY29uc3QgdGVzdFNldCA9IChzZXQsIHZlcnNpb24sIG9wdGlvbnMpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXNldFtpXS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAodmVyc2lvbi5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3B0aW9ucy5pbmNsdWRlUHJlcmVsZWFzZSkge1xuICAgIC8vIEZpbmQgdGhlIHNldCBvZiB2ZXJzaW9ucyB0aGF0IGFyZSBhbGxvd2VkIHRvIGhhdmUgcHJlcmVsZWFzZXNcbiAgICAvLyBGb3IgZXhhbXBsZSwgXjEuMi4zLXByLjEgZGVzdWdhcnMgdG8gPj0xLjIuMy1wci4xIDwyLjAuMFxuICAgIC8vIFRoYXQgc2hvdWxkIGFsbG93IGAxLjIuMy1wci4yYCB0byBwYXNzLlxuICAgIC8vIEhvd2V2ZXIsIGAxLjIuNC1hbHBoYS5ub3RyZWFkeWAgc2hvdWxkIE5PVCBiZSBhbGxvd2VkLFxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0J3Mgd2l0aGluIHRoZSByYW5nZSBzZXQgYnkgdGhlIGNvbXBhcmF0b3JzLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZWJ1ZyhzZXRbaV0uc2VtdmVyKVxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIgPT09IENvbXBhcmF0b3IuQU5ZKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyLnByZXJlbGVhc2UubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG4iLAogICAgImNvbnN0IFJhbmdlID0gcmVxdWlyZSgnLi4vY2xhc3Nlcy9yYW5nZScpXG5jb25zdCBzYXRpc2ZpZXMgPSAodmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpID0+IHtcbiAgdHJ5IHtcbiAgICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gcmFuZ2UudGVzdCh2ZXJzaW9uKVxufVxubW9kdWxlLmV4cG9ydHMgPSBzYXRpc2ZpZXNcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTMgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCB7IHNwYXduU3luYyB9ID0gcmVxdWlyZSgnbm9kZTpjaGlsZF9wcm9jZXNzJyk7XG5jb25zdCB7IGNyZWF0ZUhhc2ggfSA9IHJlcXVpcmUoJ25vZGU6Y3J5cHRvJyk7XG5jb25zdCBzZW12ZXJDb2VyY2UgPSByZXF1aXJlKCdzZW12ZXIvZnVuY3Rpb25zL2NvZXJjZScpO1xuY29uc3Qgc2VtdmVyR3JlYXRlclRoYW5PckVxdWFsVG8gPSByZXF1aXJlKCdzZW12ZXIvZnVuY3Rpb25zL2d0ZScpO1xuY29uc3Qgc2VtdmVyU2F0aXNmaWVzID0gcmVxdWlyZSgnc2VtdmVyL2Z1bmN0aW9ucy9zYXRpc2ZpZXMnKTtcbmNvbnN0IGRldGVjdExpYmMgPSByZXF1aXJlKCdkZXRlY3QtbGliYycpO1xuXG5jb25zdCB7IGNvbmZpZywgZW5naW5lcywgb3B0aW9uYWxEZXBlbmRlbmNpZXMgfSA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuXG5jb25zdCBtaW5pbXVtTGlidmlwc1ZlcnNpb25MYWJlbGxlZCA9IHByb2Nlc3MuZW52Lm5wbV9wYWNrYWdlX2NvbmZpZ19saWJ2aXBzIHx8IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGNvbmZpZy5saWJ2aXBzO1xuY29uc3QgbWluaW11bUxpYnZpcHNWZXJzaW9uID0gc2VtdmVyQ29lcmNlKG1pbmltdW1MaWJ2aXBzVmVyc2lvbkxhYmVsbGVkKS52ZXJzaW9uO1xuXG5jb25zdCBwcmVidWlsdFBsYXRmb3JtcyA9IFtcbiAgJ2Rhcndpbi1hcm02NCcsICdkYXJ3aW4teDY0JyxcbiAgJ2xpbnV4LWFybScsICdsaW51eC1hcm02NCcsICdsaW51eC1zMzkweCcsICdsaW51eC14NjQnLFxuICAnbGludXhtdXNsLWFybTY0JywgJ2xpbnV4bXVzbC14NjQnLFxuICAnd2luMzItaWEzMicsICd3aW4zMi14NjQnXG5dO1xuXG5jb25zdCBzcGF3blN5bmNPcHRpb25zID0ge1xuICBlbmNvZGluZzogJ3V0ZjgnLFxuICBzaGVsbDogdHJ1ZVxufTtcblxuY29uc3QgbG9nID0gKGl0ZW0pID0+IHtcbiAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoYHNoYXJwOiBJbnN0YWxsYXRpb24gZXJyb3I6ICR7aXRlbS5tZXNzYWdlfWApO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGBzaGFycDogJHtpdGVtfWApO1xuICB9XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3QgcnVudGltZUxpYmMgPSAoKSA9PiBkZXRlY3RMaWJjLmlzTm9uR2xpYmNMaW51eFN5bmMoKSA/IGRldGVjdExpYmMuZmFtaWx5U3luYygpIDogJyc7XG5cbmNvbnN0IHJ1bnRpbWVQbGF0Zm9ybUFyY2ggPSAoKSA9PiBgJHtwcm9jZXNzLnBsYXRmb3JtfSR7cnVudGltZUxpYmMoKX0tJHtwcm9jZXNzLmFyY2h9YDtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmNvbnN0IGJ1aWxkUGxhdGZvcm1BcmNoID0gKCkgPT4ge1xuICBpZiAoaXNFbXNjcmlwdGVuKCkpIHtcbiAgICByZXR1cm4gJ3dhc20zMic7XG4gIH1cbiAgLyogZXNsaW50IGNhbWVsY2FzZTogW1wiZXJyb3JcIiwgeyBhbGxvdzogW1wiXm5wbV9jb25maWdfXCJdIH1dICovXG4gIGNvbnN0IHsgbnBtX2NvbmZpZ19hcmNoLCBucG1fY29uZmlnX3BsYXRmb3JtLCBucG1fY29uZmlnX2xpYmMgfSA9IHByb2Nlc3MuZW52O1xuICBjb25zdCBsaWJjID0gdHlwZW9mIG5wbV9jb25maWdfbGliYyA9PT0gJ3N0cmluZycgPyBucG1fY29uZmlnX2xpYmMgOiBydW50aW1lTGliYygpO1xuICByZXR1cm4gYCR7bnBtX2NvbmZpZ19wbGF0Zm9ybSB8fCBwcm9jZXNzLnBsYXRmb3JtfSR7bGliY30tJHtucG1fY29uZmlnX2FyY2ggfHwgcHJvY2Vzcy5hcmNofWA7XG59O1xuXG5jb25zdCBidWlsZFNoYXJwTGlidmlwc0luY2x1ZGVEaXIgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoYEBpbWcvc2hhcnAtbGlidmlwcy1kZXYtJHtidWlsZFBsYXRmb3JtQXJjaCgpfS9pbmNsdWRlYCk7XG4gIH0gY2F0Y2gge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVxdWlyZSgnQGltZy9zaGFycC1saWJ2aXBzLWRldi9pbmNsdWRlJyk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJztcbn07XG5cbmNvbnN0IGJ1aWxkU2hhcnBMaWJ2aXBzQ1BsdXNQbHVzRGlyID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdAaW1nL3NoYXJwLWxpYnZpcHMtZGV2L2NwbHVzcGx1cycpO1xuICB9IGNhdGNoIHt9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJztcbn07XG5cbmNvbnN0IGJ1aWxkU2hhcnBMaWJ2aXBzTGliRGlyID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKGBAaW1nL3NoYXJwLWxpYnZpcHMtZGV2LSR7YnVpbGRQbGF0Zm9ybUFyY2goKX0vbGliYCk7XG4gIH0gY2F0Y2gge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVxdWlyZShgQGltZy9zaGFycC1saWJ2aXBzLSR7YnVpbGRQbGF0Zm9ybUFyY2goKX0vbGliYCk7XG4gICAgfSBjYXRjaCB7fVxuICB9XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHJldHVybiAnJztcbn07XG5cbmNvbnN0IGlzVW5zdXBwb3J0ZWROb2RlUnVudGltZSA9ICgpID0+IHtcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKHByb2Nlc3MucmVsZWFzZT8ubmFtZSA9PT0gJ25vZGUnICYmIHByb2Nlc3MudmVyc2lvbnMpIHtcbiAgICBpZiAoIXNlbXZlclNhdGlzZmllcyhwcm9jZXNzLnZlcnNpb25zLm5vZGUsIGVuZ2luZXMubm9kZSkpIHtcbiAgICAgIHJldHVybiB7IGZvdW5kOiBwcm9jZXNzLnZlcnNpb25zLm5vZGUsIGV4cGVjdGVkOiBlbmdpbmVzLm5vZGUgfTtcbiAgICB9XG4gIH1cbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb25zdCBpc0Vtc2NyaXB0ZW4gPSAoKSA9PiB7XG4gIGNvbnN0IHsgQ0MgfSA9IHByb2Nlc3MuZW52O1xuICByZXR1cm4gQm9vbGVhbihDQyAmJiBDQy5lbmRzV2l0aCgnL2VtY2MnKSk7XG59O1xuXG5jb25zdCBpc1Jvc2V0dGEgPSAoKSA9PiB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJyAmJiBwcm9jZXNzLmFyY2ggPT09ICd4NjQnKSB7XG4gICAgY29uc3QgdHJhbnNsYXRlZCA9IHNwYXduU3luYygnc3lzY3RsIHN5c2N0bC5wcm9jX3RyYW5zbGF0ZWQnLCBzcGF3blN5bmNPcHRpb25zKS5zdGRvdXQ7XG4gICAgcmV0dXJuICh0cmFuc2xhdGVkIHx8ICcnKS50cmltKCkgPT09ICdzeXNjdGwucHJvY190cmFuc2xhdGVkOiAxJztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBzaGE1MTIgPSAocykgPT4gY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHMpLmRpZ2VzdCgnaGV4Jyk7XG5cbmNvbnN0IHlhcm5Mb2NhdG9yID0gKCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGlkZW50SGFzaCA9IHNoYTUxMihgaW1nc2hhcnAtbGlidmlwcy0ke2J1aWxkUGxhdGZvcm1BcmNoKCl9YCk7XG4gICAgY29uc3QgbnBtVmVyc2lvbiA9IHNlbXZlckNvZXJjZShvcHRpb25hbERlcGVuZGVuY2llc1tgQGltZy9zaGFycC1saWJ2aXBzLSR7YnVpbGRQbGF0Zm9ybUFyY2goKX1gXSkudmVyc2lvbjtcbiAgICByZXR1cm4gc2hhNTEyKGAke2lkZW50SGFzaH1ucG06JHtucG1WZXJzaW9ufWApLnNsaWNlKDAsIDEwKTtcbiAgfSBjYXRjaCB7fVxuICByZXR1cm4gJyc7XG59O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuY29uc3Qgc3Bhd25SZWJ1aWxkID0gKCkgPT5cbiAgc3Bhd25TeW5jKGBub2RlLWd5cCByZWJ1aWxkIC0tZGlyZWN0b3J5PXNyYyAke2lzRW1zY3JpcHRlbigpID8gJy0tbm9kZWRpcj1lbXNjcmlwdGVuJyA6ICcnfWAsIHtcbiAgICAuLi5zcGF3blN5bmNPcHRpb25zLFxuICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgfSkuc3RhdHVzO1xuXG5jb25zdCBnbG9iYWxMaWJ2aXBzVmVyc2lvbiA9ICgpID0+IHtcbiAgaWYgKHByb2Nlc3MucGxhdGZvcm0gIT09ICd3aW4zMicpIHtcbiAgICBjb25zdCBnbG9iYWxMaWJ2aXBzVmVyc2lvbiA9IHNwYXduU3luYygncGtnLWNvbmZpZyAtLW1vZHZlcnNpb24gdmlwcy1jcHAnLCB7XG4gICAgICAuLi5zcGF3blN5bmNPcHRpb25zLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBQS0dfQ09ORklHX1BBVEg6IHBrZ0NvbmZpZ1BhdGgoKVxuICAgICAgfVxuICAgIH0pLnN0ZG91dDtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiAoZ2xvYmFsTGlidmlwc1ZlcnNpb24gfHwgJycpLnRyaW0oKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn07XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5jb25zdCBwa2dDb25maWdQYXRoID0gKCkgPT4ge1xuICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgIGNvbnN0IGJyZXdQa2dDb25maWdQYXRoID0gc3Bhd25TeW5jKFxuICAgICAgJ3doaWNoIGJyZXcgPi9kZXYvbnVsbCAyPiYxICYmIGJyZXcgZW52aXJvbm1lbnQgLS1wbGFpbiB8IGdyZXAgUEtHX0NPTkZJR19MSUJESVIgfCBjdXQgLWRcIiBcIiAtZjInLFxuICAgICAgc3Bhd25TeW5jT3B0aW9uc1xuICAgICkuc3Rkb3V0IHx8ICcnO1xuICAgIHJldHVybiBbXG4gICAgICBicmV3UGtnQ29uZmlnUGF0aC50cmltKCksXG4gICAgICBwcm9jZXNzLmVudi5QS0dfQ09ORklHX1BBVEgsXG4gICAgICAnL3Vzci9sb2NhbC9saWIvcGtnY29uZmlnJyxcbiAgICAgICcvdXNyL2xpYi9wa2djb25maWcnLFxuICAgICAgJy91c3IvbG9jYWwvbGliZGF0YS9wa2djb25maWcnLFxuICAgICAgJy91c3IvbGliZGF0YS9wa2djb25maWcnXG4gICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignOicpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJztcbiAgfVxufTtcblxuY29uc3Qgc2tpcFNlYXJjaCA9IChzdGF0dXMsIHJlYXNvbiwgbG9nZ2VyKSA9PiB7XG4gIGlmIChsb2dnZXIpIHtcbiAgICBsb2dnZXIoYERldGVjdGVkICR7cmVhc29ufSwgc2tpcHBpbmcgc2VhcmNoIGZvciBnbG9iYWxseS1pbnN0YWxsZWQgbGlidmlwc2ApO1xuICB9XG4gIHJldHVybiBzdGF0dXM7XG59O1xuXG5jb25zdCB1c2VHbG9iYWxMaWJ2aXBzID0gKGxvZ2dlcikgPT4ge1xuICBpZiAoQm9vbGVhbihwcm9jZXNzLmVudi5TSEFSUF9JR05PUkVfR0xPQkFMX0xJQlZJUFMpID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHNraXBTZWFyY2goZmFsc2UsICdTSEFSUF9JR05PUkVfR0xPQkFMX0xJQlZJUFMnLCBsb2dnZXIpO1xuICB9XG4gIGlmIChCb29sZWFuKHByb2Nlc3MuZW52LlNIQVJQX0ZPUkNFX0dMT0JBTF9MSUJWSVBTKSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBza2lwU2VhcmNoKHRydWUsICdTSEFSUF9GT1JDRV9HTE9CQUxfTElCVklQUycsIGxvZ2dlcik7XG4gIH1cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgaWYgKGlzUm9zZXR0YSgpKSB7XG4gICAgcmV0dXJuIHNraXBTZWFyY2goZmFsc2UsICdSb3NldHRhJywgbG9nZ2VyKTtcbiAgfVxuICBjb25zdCBnbG9iYWxWaXBzVmVyc2lvbiA9IGdsb2JhbExpYnZpcHNWZXJzaW9uKCk7XG4gIHJldHVybiAhIWdsb2JhbFZpcHNWZXJzaW9uICYmIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgc2VtdmVyR3JlYXRlclRoYW5PckVxdWFsVG8oZ2xvYmFsVmlwc1ZlcnNpb24sIG1pbmltdW1MaWJ2aXBzVmVyc2lvbik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgbWluaW11bUxpYnZpcHNWZXJzaW9uLFxuICBwcmVidWlsdFBsYXRmb3JtcyxcbiAgYnVpbGRQbGF0Zm9ybUFyY2gsXG4gIGJ1aWxkU2hhcnBMaWJ2aXBzSW5jbHVkZURpcixcbiAgYnVpbGRTaGFycExpYnZpcHNDUGx1c1BsdXNEaXIsXG4gIGJ1aWxkU2hhcnBMaWJ2aXBzTGliRGlyLFxuICBpc1Vuc3VwcG9ydGVkTm9kZVJ1bnRpbWUsXG4gIHJ1bnRpbWVQbGF0Zm9ybUFyY2gsXG4gIGxvZyxcbiAgeWFybkxvY2F0b3IsXG4gIHNwYXduUmVidWlsZCxcbiAgZ2xvYmFsTGlidmlwc1ZlcnNpb24sXG4gIHBrZ0NvbmZpZ1BhdGgsXG4gIHVzZUdsb2JhbExpYnZpcHNcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSW5zcGVjdHMgdGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgYW5kIGV4cG9ydHMgdGhlIHJlbGV2YW50IHNoYXJwLm5vZGUgYmluYXJ5XG5cbmNvbnN0IHsgZmFtaWx5U3luYywgdmVyc2lvblN5bmMgfSA9IHJlcXVpcmUoJ2RldGVjdC1saWJjJyk7XG5cbmNvbnN0IHsgcnVudGltZVBsYXRmb3JtQXJjaCwgaXNVbnN1cHBvcnRlZE5vZGVSdW50aW1lLCBwcmVidWlsdFBsYXRmb3JtcywgbWluaW11bUxpYnZpcHNWZXJzaW9uIH0gPSByZXF1aXJlKCcuL2xpYnZpcHMnKTtcbmNvbnN0IHJ1bnRpbWVQbGF0Zm9ybSA9IHJ1bnRpbWVQbGF0Zm9ybUFyY2goKTtcblxuY29uc3QgcGF0aHMgPSBbXG4gIGAuLi9zcmMvYnVpbGQvUmVsZWFzZS9zaGFycC0ke3J1bnRpbWVQbGF0Zm9ybX0ubm9kZWAsXG4gICcuLi9zcmMvYnVpbGQvUmVsZWFzZS9zaGFycC13YXNtMzIubm9kZScsXG4gIGBAaW1nL3NoYXJwLSR7cnVudGltZVBsYXRmb3JtfS9zaGFycC5ub2RlYCxcbiAgJ0BpbWcvc2hhcnAtd2FzbTMyL3NoYXJwLm5vZGUnXG5dO1xuXG5sZXQgc2hhcnA7XG5jb25zdCBlcnJvcnMgPSBbXTtcbmZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICB0cnkge1xuICAgIHNoYXJwID0gcmVxdWlyZShwYXRoKTtcbiAgICBicmVhaztcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBlcnJvcnMucHVzaChlcnIpO1xuICB9XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pZiAoc2hhcnApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBzaGFycDtcbn0gZWxzZSB7XG4gIGNvbnN0IFtpc0xpbnV4LCBpc01hY09zLCBpc1dpbmRvd3NdID0gWydsaW51eCcsICdkYXJ3aW4nLCAnd2luMzInXS5tYXAob3MgPT4gcnVudGltZVBsYXRmb3JtLnN0YXJ0c1dpdGgob3MpKTtcblxuICBjb25zdCBoZWxwID0gW2BDb3VsZCBub3QgbG9hZCB0aGUgXCJzaGFycFwiIG1vZHVsZSB1c2luZyB0aGUgJHtydW50aW1lUGxhdGZvcm19IHJ1bnRpbWVgXTtcbiAgZXJyb3JzLmZvckVhY2goZXJyID0+IHtcbiAgICBpZiAoZXJyLmNvZGUgIT09ICdNT0RVTEVfTk9UX0ZPVU5EJykge1xuICAgICAgaGVscC5wdXNoKGAke2Vyci5jb2RlfTogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBtZXNzYWdlcyA9IGVycm9ycy5tYXAoZXJyID0+IGVyci5tZXNzYWdlKS5qb2luKCcgJyk7XG4gIGhlbHAucHVzaCgnUG9zc2libGUgc29sdXRpb25zOicpO1xuICAvLyBDb21tb24gZXJyb3IgbWVzc2FnZXNcbiAgaWYgKGlzVW5zdXBwb3J0ZWROb2RlUnVudGltZSgpKSB7XG4gICAgY29uc3QgeyBmb3VuZCwgZXhwZWN0ZWQgfSA9IGlzVW5zdXBwb3J0ZWROb2RlUnVudGltZSgpO1xuICAgIGhlbHAucHVzaChcbiAgICAgICctIFBsZWFzZSB1cGdyYWRlIE5vZGUuanM6JyxcbiAgICAgIGAgICAgRm91bmQgJHtmb3VuZH1gLFxuICAgICAgYCAgICBSZXF1aXJlcyAke2V4cGVjdGVkfWBcbiAgICApO1xuICB9IGVsc2UgaWYgKHByZWJ1aWx0UGxhdGZvcm1zLmluY2x1ZGVzKHJ1bnRpbWVQbGF0Zm9ybSkpIHtcbiAgICBjb25zdCBbb3MsIGNwdV0gPSBydW50aW1lUGxhdGZvcm0uc3BsaXQoJy0nKTtcbiAgICBjb25zdCBsaWJjID0gb3MuZW5kc1dpdGgoJ211c2wnKSA/ICcgLS1saWJjPW11c2wnIDogJyc7XG4gICAgaGVscC5wdXNoKFxuICAgICAgJy0gRW5zdXJlIG9wdGlvbmFsIGRlcGVuZGVuY2llcyBjYW4gYmUgaW5zdGFsbGVkOicsXG4gICAgICAnICAgIG5wbSBpbnN0YWxsIC0taW5jbHVkZT1vcHRpb25hbCBzaGFycCcsXG4gICAgICAnLSBFbnN1cmUgeW91ciBwYWNrYWdlIG1hbmFnZXIgc3VwcG9ydHMgbXVsdGktcGxhdGZvcm0gaW5zdGFsbGF0aW9uOicsXG4gICAgICAnICAgIFNlZSBodHRwczovL3NoYXJwLnBpeGVscGx1bWJpbmcuY29tL2luc3RhbGwjY3Jvc3MtcGxhdGZvcm0nLFxuICAgICAgJy0gQWRkIHBsYXRmb3JtLXNwZWNpZmljIGRlcGVuZGVuY2llczonLFxuICAgICAgYCAgICBucG0gaW5zdGFsbCAtLW9zPSR7b3MucmVwbGFjZSgnbXVzbCcsICcnKX0ke2xpYmN9IC0tY3B1PSR7Y3B1fSBzaGFycGBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGhlbHAucHVzaChcbiAgICAgIGAtIE1hbnVhbGx5IGluc3RhbGwgbGlidmlwcyA+PSAke21pbmltdW1MaWJ2aXBzVmVyc2lvbn1gLFxuICAgICAgJy0gQWRkIGV4cGVyaW1lbnRhbCBXZWJBc3NlbWJseS1iYXNlZCBkZXBlbmRlbmNpZXM6JyxcbiAgICAgICcgICAgbnBtIGluc3RhbGwgLS1jcHU9d2FzbTMyIHNoYXJwJyxcbiAgICAgICcgICAgbnBtIGluc3RhbGwgQGltZy9zaGFycC13YXNtMzInXG4gICAgKTtcbiAgfVxuICBpZiAoaXNMaW51eCAmJiAvKHN5bWJvbCBub3QgZm91bmR8Q1hYQUJJXykvaS50ZXN0KG1lc3NhZ2VzKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGNvbmZpZyB9ID0gcmVxdWlyZShgQGltZy9zaGFycC1saWJ2aXBzLSR7cnVudGltZVBsYXRmb3JtfS9wYWNrYWdlYCk7XG4gICAgICBjb25zdCBsaWJjRm91bmQgPSBgJHtmYW1pbHlTeW5jKCl9ICR7dmVyc2lvblN5bmMoKX1gO1xuICAgICAgY29uc3QgbGliY1JlcXVpcmVzID0gYCR7Y29uZmlnLm11c2wgPyAnbXVzbCcgOiAnZ2xpYmMnfSAke2NvbmZpZy5tdXNsIHx8IGNvbmZpZy5nbGliY31gO1xuICAgICAgaGVscC5wdXNoKFxuICAgICAgICAnLSBVcGRhdGUgeW91ciBPUzonLFxuICAgICAgICBgICAgIEZvdW5kICR7bGliY0ZvdW5kfWAsXG4gICAgICAgIGAgICAgUmVxdWlyZXMgJHtsaWJjUmVxdWlyZXN9YFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJFbmdpbmVzKSB7fVxuICB9XG4gIGlmIChpc0xpbnV4ICYmIC9cXC9zbmFwXFwvY29yZVswLTldezJ9Ly50ZXN0KG1lc3NhZ2VzKSkge1xuICAgIGhlbHAucHVzaChcbiAgICAgICctIFJlbW92ZSB0aGUgTm9kZS5qcyBTbmFwLCB3aGljaCBkb2VzIG5vdCBzdXBwb3J0IG5hdGl2ZSBtb2R1bGVzJyxcbiAgICAgICcgICAgc25hcCByZW1vdmUgbm9kZSdcbiAgICApO1xuICB9XG4gIGlmIChpc01hY09zICYmIC9JbmNvbXBhdGlibGUgbGlicmFyeSB2ZXJzaW9uLy50ZXN0KG1lc3NhZ2VzKSkge1xuICAgIGhlbHAucHVzaChcbiAgICAgICctIFVwZGF0ZSBIb21lYnJldzonLFxuICAgICAgJyAgICBicmV3IHVwZGF0ZSAmJiBicmV3IHVwZ3JhZGUgdmlwcydcbiAgICApO1xuICB9XG4gIGlmIChlcnJvcnMuc29tZShlcnIgPT4gZXJyLmNvZGUgPT09ICdFUlJfRExPUEVOX0RJU0FCTEVEJykpIHtcbiAgICBoZWxwLnB1c2goJy0gUnVuIE5vZGUuanMgd2l0aG91dCB1c2luZyB0aGUgLS1uby1hZGRvbnMgZmxhZycpO1xuICB9XG4gIC8vIExpbmsgdG8gaW5zdGFsbGF0aW9uIGRvY3NcbiAgaWYgKGlzV2luZG93cyAmJiAvVGhlIHNwZWNpZmllZCBwcm9jZWR1cmUgY291bGQgbm90IGJlIGZvdW5kLy50ZXN0KG1lc3NhZ2VzKSkge1xuICAgIGhlbHAucHVzaChcbiAgICAgICctIFVzaW5nIHRoZSBjYW52YXMgcGFja2FnZSBvbiBXaW5kb3dzPycsXG4gICAgICAnICAgIFNlZSBodHRwczovL3NoYXJwLnBpeGVscGx1bWJpbmcuY29tL2luc3RhbGwjY2FudmFzLWFuZC13aW5kb3dzJyxcbiAgICAgICctIENoZWNrIGZvciBvdXRkYXRlZCB2ZXJzaW9ucyBvZiBzaGFycCBpbiB0aGUgZGVwZW5kZW5jeSB0cmVlOicsXG4gICAgICAnICAgIG5wbSBscyBzaGFycCdcbiAgICApO1xuICB9XG4gIGhlbHAucHVzaChcbiAgICAnLSBDb25zdWx0IHRoZSBpbnN0YWxsYXRpb24gZG9jdW1lbnRhdGlvbjonLFxuICAgICcgICAgU2VlIGh0dHBzOi8vc2hhcnAucGl4ZWxwbHVtYmluZy5jb20vaW5zdGFsbCdcbiAgKTtcbiAgdGhyb3cgbmV3IEVycm9yKGhlbHAuam9pbignXFxuJykpO1xufVxuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV0aWwgPSByZXF1aXJlKCdub2RlOnV0aWwnKTtcbmNvbnN0IHN0cmVhbSA9IHJlcXVpcmUoJ25vZGU6c3RyZWFtJyk7XG5jb25zdCBpcyA9IHJlcXVpcmUoJy4vaXMnKTtcblxucmVxdWlyZSgnLi9zaGFycCcpO1xuXG4vLyBVc2UgTk9ERV9ERUJVRz1zaGFycCB0byBlbmFibGUgbGlidmlwcyB3YXJuaW5nc1xuY29uc3QgZGVidWdsb2cgPSB1dGlsLmRlYnVnbG9nKCdzaGFycCcpO1xuXG4vKipcbiAqIENvbnN0cnVjdG9yIGZhY3RvcnkgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIGBzaGFycGAsIHRvIHdoaWNoIGZ1cnRoZXIgbWV0aG9kcyBhcmUgY2hhaW5lZC5cbiAqXG4gKiBKUEVHLCBQTkcsIFdlYlAsIEdJRiwgQVZJRiBvciBUSUZGIGZvcm1hdCBpbWFnZSBkYXRhIGNhbiBiZSBzdHJlYW1lZCBvdXQgZnJvbSB0aGlzIG9iamVjdC5cbiAqIFdoZW4gdXNpbmcgU3RyZWFtIGJhc2VkIG91dHB1dCwgZGVyaXZlZCBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZnJvbSB0aGUgYGluZm9gIGV2ZW50LlxuICpcbiAqIE5vbi1jcml0aWNhbCBwcm9ibGVtcyBlbmNvdW50ZXJlZCBkdXJpbmcgcHJvY2Vzc2luZyBhcmUgZW1pdHRlZCBhcyBgd2FybmluZ2AgZXZlbnRzLlxuICpcbiAqIEltcGxlbWVudHMgdGhlIFtzdHJlYW0uRHVwbGV4XShodHRwOi8vbm9kZWpzLm9yZy9hcGkvc3RyZWFtLmh0bWwjc3RyZWFtX2NsYXNzX3N0cmVhbV9kdXBsZXgpIGNsYXNzLlxuICpcbiAqIFdoZW4gbG9hZGluZyBtb3JlIHRoYW4gb25lIHBhZ2UvZnJhbWUgb2YgYW4gYW5pbWF0ZWQgaW1hZ2UsXG4gKiB0aGVzZSBhcmUgY29tYmluZWQgYXMgYSB2ZXJ0aWNhbGx5LXN0YWNrZWQgXCJ0b2lsZXQgcm9sbFwiIGltYWdlXG4gKiB3aGVyZSB0aGUgb3ZlcmFsbCBoZWlnaHQgaXMgdGhlIGBwYWdlSGVpZ2h0YCBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgYHBhZ2VzYC5cbiAqXG4gKiBAY29uc3RydWN0cyBTaGFycFxuICpcbiAqIEBlbWl0cyBTaGFycCNpbmZvXG4gKiBAZW1pdHMgU2hhcnAjd2FybmluZ1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycCgnaW5wdXQuanBnJylcbiAqICAgLnJlc2l6ZSgzMDAsIDIwMClcbiAqICAgLnRvRmlsZSgnb3V0cHV0LmpwZycsIGZ1bmN0aW9uKGVycikge1xuICogICAgIC8vIG91dHB1dC5qcGcgaXMgYSAzMDAgcGl4ZWxzIHdpZGUgYW5kIDIwMCBwaXhlbHMgaGlnaCBpbWFnZVxuICogICAgIC8vIGNvbnRhaW5pbmcgYSBzY2FsZWQgYW5kIGNyb3BwZWQgdmVyc2lvbiBvZiBpbnB1dC5qcGdcbiAqICAgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlYWQgaW1hZ2UgZGF0YSBmcm9tIHJlbW90ZSBVUkwsXG4gKiAvLyByZXNpemUgdG8gMzAwIHBpeGVscyB3aWRlLFxuICogLy8gZW1pdCBhbiAnaW5mbycgZXZlbnQgd2l0aCBjYWxjdWxhdGVkIGRpbWVuc2lvbnNcbiAqIC8vIGFuZCBmaW5hbGx5IHdyaXRlIGltYWdlIGRhdGEgdG8gd3JpdGFibGVTdHJlYW1cbiAqIGNvbnN0IHsgYm9keSB9ID0gZmV0Y2goJ2h0dHBzOi8vLi4uJyk7XG4gKiBjb25zdCByZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlLmZyb21XZWIoYm9keSk7XG4gKiBjb25zdCB0cmFuc2Zvcm1lciA9IHNoYXJwKClcbiAqICAgLnJlc2l6ZSgzMDApXG4gKiAgIC5vbignaW5mbycsICh7IGhlaWdodCB9KSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coYEltYWdlIGhlaWdodCBpcyAke2hlaWdodH1gKTtcbiAqICAgfSk7XG4gKiByZWFkYWJsZVN0cmVhbS5waXBlKHRyYW5zZm9ybWVyKS5waXBlKHdyaXRhYmxlU3RyZWFtKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgYmxhbmsgMzAweDIwMCBQTkcgaW1hZ2Ugb2Ygc2VtaS10cmFuc2x1Y2VudCByZWQgcGl4ZWxzXG4gKiBzaGFycCh7XG4gKiAgIGNyZWF0ZToge1xuICogICAgIHdpZHRoOiAzMDAsXG4gKiAgICAgaGVpZ2h0OiAyMDAsXG4gKiAgICAgY2hhbm5lbHM6IDQsXG4gKiAgICAgYmFja2dyb3VuZDogeyByOiAyNTUsIGc6IDAsIGI6IDAsIGFscGhhOiAwLjUgfVxuICogICB9XG4gKiB9KVxuICogLnBuZygpXG4gKiAudG9CdWZmZXIoKVxuICogLnRoZW4oIC4uLiApO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IGFuIGFuaW1hdGVkIEdJRiB0byBhbiBhbmltYXRlZCBXZWJQXG4gKiBhd2FpdCBzaGFycCgnaW4uZ2lmJywgeyBhbmltYXRlZDogdHJ1ZSB9KS50b0ZpbGUoJ291dC53ZWJwJyk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlYWQgYSByYXcgYXJyYXkgb2YgcGl4ZWxzIGFuZCBzYXZlIGl0IHRvIGEgcG5nXG4gKiBjb25zdCBpbnB1dCA9IFVpbnQ4QXJyYXkuZnJvbShbMjU1LCAyNTUsIDI1NSwgMCwgMCwgMF0pOyAvLyBvciBVaW50OENsYW1wZWRBcnJheVxuICogY29uc3QgaW1hZ2UgPSBzaGFycChpbnB1dCwge1xuICogICAvLyBiZWNhdXNlIHRoZSBpbnB1dCBkb2VzIG5vdCBjb250YWluIGl0cyBkaW1lbnNpb25zIG9yIGhvdyBtYW55IGNoYW5uZWxzIGl0IGhhc1xuICogICAvLyB3ZSBuZWVkIHRvIHNwZWNpZnkgaXQgaW4gdGhlIGNvbnN0cnVjdG9yIG9wdGlvbnNcbiAqICAgcmF3OiB7XG4gKiAgICAgd2lkdGg6IDIsXG4gKiAgICAgaGVpZ2h0OiAxLFxuICogICAgIGNoYW5uZWxzOiAzXG4gKiAgIH1cbiAqIH0pO1xuICogYXdhaXQgaW1hZ2UudG9GaWxlKCdteS10d28tcGl4ZWxzLnBuZycpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZW5lcmF0ZSBSR0IgR2F1c3NpYW4gbm9pc2VcbiAqIGF3YWl0IHNoYXJwKHtcbiAqICAgY3JlYXRlOiB7XG4gKiAgICAgd2lkdGg6IDMwMCxcbiAqICAgICBoZWlnaHQ6IDIwMCxcbiAqICAgICBjaGFubmVsczogMyxcbiAqICAgICBub2lzZToge1xuICogICAgICAgdHlwZTogJ2dhdXNzaWFuJyxcbiAqICAgICAgIG1lYW46IDEyOCxcbiAqICAgICAgIHNpZ21hOiAzMFxuICogICAgIH1cbiAqICB9XG4gKiB9KS50b0ZpbGUoJ25vaXNlLnBuZycpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBHZW5lcmF0ZSBhbiBpbWFnZSBmcm9tIHRleHRcbiAqIGF3YWl0IHNoYXJwKHtcbiAqICAgdGV4dDoge1xuICogICAgIHRleHQ6ICdIZWxsbywgd29ybGQhJyxcbiAqICAgICB3aWR0aDogNDAwLCAvLyBtYXggd2lkdGhcbiAqICAgICBoZWlnaHQ6IDMwMCAvLyBtYXggaGVpZ2h0XG4gKiAgIH1cbiAqIH0pLnRvRmlsZSgndGV4dF9idy5wbmcnKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gR2VuZXJhdGUgYW4gcmdiYSBpbWFnZSBmcm9tIHRleHQgdXNpbmcgcGFuZ28gbWFya3VwIGFuZCBmb250XG4gKiBhd2FpdCBzaGFycCh7XG4gKiAgIHRleHQ6IHtcbiAqICAgICB0ZXh0OiAnPHNwYW4gZm9yZWdyb3VuZD1cInJlZFwiPlJlZCE8L3NwYW4+PHNwYW4gYmFja2dyb3VuZD1cImN5YW5cIj5ibHVlPC9zcGFuPicsXG4gKiAgICAgZm9udDogJ3NhbnMnLFxuICogICAgIHJnYmE6IHRydWUsXG4gKiAgICAgZHBpOiAzMDBcbiAqICAgfVxuICogfSkudG9GaWxlKCd0ZXh0X3JnYmEucG5nJyk7XG4gKlxuICogQHBhcmFtIHsoQnVmZmVyfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fEludDE2QXJyYXl8VWludDMyQXJyYXl8SW50MzJBcnJheXxGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fHN0cmluZyl9IFtpbnB1dF0gLSBpZiBwcmVzZW50LCBjYW4gYmVcbiAqICBhIEJ1ZmZlciAvIEFycmF5QnVmZmVyIC8gVWludDhBcnJheSAvIFVpbnQ4Q2xhbXBlZEFycmF5IGNvbnRhaW5pbmcgSlBFRywgUE5HLCBXZWJQLCBBVklGLCBHSUYsIFNWRyBvciBUSUZGIGltYWdlIGRhdGEsIG9yXG4gKiAgYSBUeXBlZEFycmF5IGNvbnRhaW5pbmcgcmF3IHBpeGVsIGltYWdlIGRhdGEsIG9yXG4gKiAgYSBTdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZXN5c3RlbSBwYXRoIHRvIGFuIEpQRUcsIFBORywgV2ViUCwgQVZJRiwgR0lGLCBTVkcgb3IgVElGRiBpbWFnZSBmaWxlLlxuICogIEpQRUcsIFBORywgV2ViUCwgQVZJRiwgR0lGLCBTVkcsIFRJRkYgb3IgcmF3IHBpeGVsIGltYWdlIGRhdGEgY2FuIGJlIHN0cmVhbWVkIGludG8gdGhlIG9iamVjdCB3aGVuIG5vdCBwcmVzZW50LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIGlmIHByZXNlbnQsIGlzIGFuIE9iamVjdCB3aXRoIG9wdGlvbmFsIGF0dHJpYnV0ZXMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZmFpbE9uPSd3YXJuaW5nJ10gLSBXaGVuIHRvIGFib3J0IHByb2Nlc3Npbmcgb2YgaW52YWxpZCBwaXhlbCBkYXRhLCBvbmUgb2YgKGluIG9yZGVyIG9mIHNlbnNpdGl2aXR5LCBsZWFzdCB0byBtb3N0KTogJ25vbmUnLCAndHJ1bmNhdGVkJywgJ2Vycm9yJywgJ3dhcm5pbmcnLiBIaWdoZXIgbGV2ZWxzIGltcGx5IGxvd2VyIGxldmVscy4gSW52YWxpZCBtZXRhZGF0YSB3aWxsIGFsd2F5cyBhYm9ydC5cbiAqIEBwYXJhbSB7bnVtYmVyfGJvb2xlYW59IFtvcHRpb25zLmxpbWl0SW5wdXRQaXhlbHM9MjY4NDAyNjg5XSAtIERvIG5vdCBwcm9jZXNzIGlucHV0IGltYWdlcyB3aGVyZSB0aGUgbnVtYmVyIG9mIHBpeGVsc1xuICogICh3aWR0aCB4IGhlaWdodCkgZXhjZWVkcyB0aGlzIGxpbWl0LiBBc3N1bWVzIGltYWdlIGRpbWVuc2lvbnMgY29udGFpbmVkIGluIHRoZSBpbnB1dCBtZXRhZGF0YSBjYW4gYmUgdHJ1c3RlZC5cbiAqICBBbiBpbnRlZ3JhbCBOdW1iZXIgb2YgcGl4ZWxzLCB6ZXJvIG9yIGZhbHNlIHRvIHJlbW92ZSBsaW1pdCwgdHJ1ZSB0byB1c2UgZGVmYXVsdCBsaW1pdCBvZiAyNjg0MDI2ODkgKDB4M0ZGRiB4IDB4M0ZGRikuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnVubGltaXRlZD1mYWxzZV0gLSBTZXQgdGhpcyB0byBgdHJ1ZWAgdG8gcmVtb3ZlIHNhZmV0eSBmZWF0dXJlcyB0aGF0IGhlbHAgcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiAoSlBFRywgUE5HLCBTVkcsIEhFSUYpLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW50aWFsUmVhZD10cnVlXSAtIFNldCB0aGlzIHRvIGBmYWxzZWAgdG8gdXNlIHJhbmRvbSBhY2Nlc3MgcmF0aGVyIHRoYW4gc2VxdWVudGlhbCByZWFkLiBTb21lIG9wZXJhdGlvbnMgd2lsbCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZGVuc2l0eT03Ml0gLSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBEUEkgZm9yIHZlY3RvciBpbWFnZXMgaW4gdGhlIHJhbmdlIDEgdG8gMTAwMDAwLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmlnbm9yZUljYz1mYWxzZV0gLSBzaG91bGQgdGhlIGVtYmVkZGVkIElDQyBwcm9maWxlLCBpZiBhbnksIGJlIGlnbm9yZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFnZXM9MV0gLSBOdW1iZXIgb2YgcGFnZXMgdG8gZXh0cmFjdCBmb3IgbXVsdGktcGFnZSBpbnB1dCAoR0lGLCBXZWJQLCBUSUZGKSwgdXNlIC0xIGZvciBhbGwgcGFnZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucGFnZT0wXSAtIFBhZ2UgbnVtYmVyIHRvIHN0YXJ0IGV4dHJhY3RpbmcgZnJvbSBmb3IgbXVsdGktcGFnZSBpbnB1dCAoR0lGLCBXZWJQLCBUSUZGKSwgemVybyBiYXNlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zdWJpZmQ9LTFdIC0gc3ViSUZEIChTdWIgSW1hZ2UgRmlsZSBEaXJlY3RvcnkpIHRvIGV4dHJhY3QgZm9yIE9NRS1USUZGLCBkZWZhdWx0cyB0byBtYWluIGltYWdlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxldmVsPTBdIC0gbGV2ZWwgdG8gZXh0cmFjdCBmcm9tIGEgbXVsdGktbGV2ZWwgaW5wdXQgKE9wZW5TbGlkZSksIHplcm8gYmFzZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFuaW1hdGVkPWZhbHNlXSAtIFNldCB0byBgdHJ1ZWAgdG8gcmVhZCBhbGwgZnJhbWVzL3BhZ2VzIG9mIGFuIGFuaW1hdGVkIGltYWdlIChHSUYsIFdlYlAsIFRJRkYpLCBlcXVpdmFsZW50IG9mIHNldHRpbmcgYHBhZ2VzYCB0byBgLTFgLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJhd10gLSBkZXNjcmliZXMgcmF3IHBpeGVsIGlucHV0IGltYWdlIGRhdGEuIFNlZSBgcmF3KClgIGZvciBwaXhlbCBvcmRlcmluZy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5yYXcud2lkdGhdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyB3aWRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJhdy5oZWlnaHRdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyBoaWdoLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJhdy5jaGFubmVsc10gLSBpbnRlZ3JhbCBudW1iZXIgb2YgY2hhbm5lbHMsIGJldHdlZW4gMSBhbmQgNC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmF3LnByZW11bHRpcGxpZWRdIC0gc3BlY2lmaWVzIHRoYXQgdGhlIHJhdyBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHByZW11bHRpcGxpZWQsIHNldCB0byBgdHJ1ZWBcbiAqICB0byBhdm9pZCBzaGFycCBwcmVtdWx0aXBseWluZyB0aGUgaW1hZ2UuIChvcHRpb25hbCwgZGVmYXVsdCBgZmFsc2VgKVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLmNyZWF0ZV0gLSBkZXNjcmliZXMgYSBuZXcgaW1hZ2UgdG8gYmUgY3JlYXRlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jcmVhdGUud2lkdGhdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyB3aWRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNyZWF0ZS5oZWlnaHRdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyBoaWdoLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNyZWF0ZS5jaGFubmVsc10gLSBpbnRlZ3JhbCBudW1iZXIgb2YgY2hhbm5lbHMsIGVpdGhlciAzIChSR0IpIG9yIDQgKFJHQkEpLlxuICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBbb3B0aW9ucy5jcmVhdGUuYmFja2dyb3VuZF0gLSBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSB0byBleHRyYWN0IHZhbHVlcyBmb3IgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuY3JlYXRlLm5vaXNlXSAtIGRlc2NyaWJlcyBhIG5vaXNlIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY3JlYXRlLm5vaXNlLnR5cGVdIC0gdHlwZSBvZiBnZW5lcmF0ZWQgbm9pc2UsIGN1cnJlbnRseSBvbmx5IGBnYXVzc2lhbmAgaXMgc3VwcG9ydGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNyZWF0ZS5ub2lzZS5tZWFuXSAtIG1lYW4gb2YgcGl4ZWxzIGluIGdlbmVyYXRlZCBub2lzZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jcmVhdGUubm9pc2Uuc2lnbWFdIC0gc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHBpeGVscyBpbiBnZW5lcmF0ZWQgbm9pc2UuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMudGV4dF0gLSBkZXNjcmliZXMgYSBuZXcgdGV4dCBpbWFnZSB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRleHQudGV4dF0gLSB0ZXh0IHRvIHJlbmRlciBhcyBhIFVURi04IHN0cmluZy4gSXQgY2FuIGNvbnRhaW4gUGFuZ28gbWFya3VwLCBmb3IgZXhhbXBsZSBgPGk+TGU8L2k+TW9uZGVgLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnRleHQuZm9udF0gLSBmb250IG5hbWUgdG8gcmVuZGVyIHdpdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGV4dC5mb250ZmlsZV0gLSBhYnNvbHV0ZSBmaWxlc3lzdGVtIHBhdGggdG8gYSBmb250IGZpbGUgdGhhdCBjYW4gYmUgdXNlZCBieSBgZm9udGAuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGV4dC53aWR0aD0wXSAtIEludGVncmFsIG51bWJlciBvZiBwaXhlbHMgdG8gd29yZC13cmFwIGF0LiBMaW5lcyBvZiB0ZXh0IHdpZGVyIHRoYW4gdGhpcyB3aWxsIGJlIGJyb2tlbiBhdCB3b3JkIGJvdW5kYXJpZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGV4dC5oZWlnaHQ9MF0gLSBNYXhpbXVtIGludGVncmFsIG51bWJlciBvZiBwaXhlbHMgaGlnaC4gV2hlbiBkZWZpbmVkLCBgZHBpYCB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZSB0ZXh0IHdpbGwgYXV0b21hdGljYWxseSBmaXQgdGhlIHBpeGVsIHJlc29sdXRpb24gZGVmaW5lZCBieSBgd2lkdGhgIGFuZCBgaGVpZ2h0YC4gV2lsbCBiZSBpZ25vcmVkIGlmIGB3aWR0aGAgaXMgbm90IHNwZWNpZmllZCBvciBzZXQgdG8gMC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy50ZXh0LmFsaWduPSdsZWZ0J10gLSBBbGlnbm1lbnQgc3R5bGUgZm9yIG11bHRpLWxpbmUgdGV4dCAoYCdsZWZ0J2AsIGAnY2VudHJlJ2AsIGAnY2VudGVyJ2AsIGAncmlnaHQnYCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnRleHQuanVzdGlmeT1mYWxzZV0gLSBzZXQgdGhpcyB0byB0cnVlIHRvIGFwcGx5IGp1c3RpZmljYXRpb24gdG8gdGhlIHRleHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGV4dC5kcGk9NzJdIC0gdGhlIHJlc29sdXRpb24gKHNpemUpIGF0IHdoaWNoIHRvIHJlbmRlciB0aGUgdGV4dC4gRG9lcyBub3QgdGFrZSBlZmZlY3QgaWYgYGhlaWdodGAgaXMgc3BlY2lmaWVkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50ZXh0LnJnYmE9ZmFsc2VdIC0gc2V0IHRoaXMgdG8gdHJ1ZSB0byBlbmFibGUgUkdCQSBvdXRwdXQuIFRoaXMgaXMgdXNlZnVsIGZvciBjb2xvdXIgZW1vamkgcmVuZGVyaW5nLCBvciBzdXBwb3J0IGZvciBwYW5nbyBtYXJrdXAgZmVhdHVyZXMgbGlrZSBgPHNwYW4gZm9yZWdyb3VuZD1cInJlZFwiPlJlZCE8L3NwYW4+YC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50ZXh0LnNwYWNpbmc9MF0gLSB0ZXh0IGxpbmUgaGVpZ2h0IGluIHBvaW50cy4gV2lsbCB1c2UgdGhlIGZvbnQgbGluZSBoZWlnaHQgaWYgbm9uZSBpcyBzcGVjaWZpZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMudGV4dC53cmFwPSd3b3JkJ10gLSB3b3JkIHdyYXBwaW5nIHN0eWxlIHdoZW4gd2lkdGggaXMgcHJvdmlkZWQsIG9uZSBvZjogJ3dvcmQnLCAnY2hhcicsICd3b3JkLWNoYXInIChwcmVmZXIgd29yZCwgZmFsbGJhY2sgdG8gY2hhcikgb3IgJ25vbmUnLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5jb25zdCBTaGFycCA9IGZ1bmN0aW9uIChpbnB1dCwgb3B0aW9ucykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhaXMuZGVmaW5lZChpbnB1dCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQnKTtcbiAgfVxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgU2hhcnApKSB7XG4gICAgcmV0dXJuIG5ldyBTaGFycChpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgc3RyZWFtLkR1cGxleC5jYWxsKHRoaXMpO1xuICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgLy8gcmVzaXplIG9wdGlvbnNcbiAgICB0b3BPZmZzZXRQcmU6IC0xLFxuICAgIGxlZnRPZmZzZXRQcmU6IC0xLFxuICAgIHdpZHRoUHJlOiAtMSxcbiAgICBoZWlnaHRQcmU6IC0xLFxuICAgIHRvcE9mZnNldFBvc3Q6IC0xLFxuICAgIGxlZnRPZmZzZXRQb3N0OiAtMSxcbiAgICB3aWR0aFBvc3Q6IC0xLFxuICAgIGhlaWdodFBvc3Q6IC0xLFxuICAgIHdpZHRoOiAtMSxcbiAgICBoZWlnaHQ6IC0xLFxuICAgIGNhbnZhczogJ2Nyb3AnLFxuICAgIHBvc2l0aW9uOiAwLFxuICAgIHJlc2l6ZUJhY2tncm91bmQ6IFswLCAwLCAwLCAyNTVdLFxuICAgIHVzZUV4aWZPcmllbnRhdGlvbjogZmFsc2UsXG4gICAgYW5nbGU6IDAsXG4gICAgcm90YXRpb25BbmdsZTogMCxcbiAgICByb3RhdGlvbkJhY2tncm91bmQ6IFswLCAwLCAwLCAyNTVdLFxuICAgIHJvdGF0ZUJlZm9yZVByZUV4dHJhY3Q6IGZhbHNlLFxuICAgIGZsaXA6IGZhbHNlLFxuICAgIGZsb3A6IGZhbHNlLFxuICAgIGV4dGVuZFRvcDogMCxcbiAgICBleHRlbmRCb3R0b206IDAsXG4gICAgZXh0ZW5kTGVmdDogMCxcbiAgICBleHRlbmRSaWdodDogMCxcbiAgICBleHRlbmRCYWNrZ3JvdW5kOiBbMCwgMCwgMCwgMjU1XSxcbiAgICBleHRlbmRXaXRoOiAnYmFja2dyb3VuZCcsXG4gICAgd2l0aG91dEVubGFyZ2VtZW50OiBmYWxzZSxcbiAgICB3aXRob3V0UmVkdWN0aW9uOiBmYWxzZSxcbiAgICBhZmZpbmVNYXRyaXg6IFtdLFxuICAgIGFmZmluZUJhY2tncm91bmQ6IFswLCAwLCAwLCAyNTVdLFxuICAgIGFmZmluZUlkeDogMCxcbiAgICBhZmZpbmVJZHk6IDAsXG4gICAgYWZmaW5lT2R4OiAwLFxuICAgIGFmZmluZU9keTogMCxcbiAgICBhZmZpbmVJbnRlcnBvbGF0b3I6IHRoaXMuY29uc3RydWN0b3IuaW50ZXJwb2xhdG9ycy5iaWxpbmVhcixcbiAgICBrZXJuZWw6ICdsYW5jem9zMycsXG4gICAgZmFzdFNocmlua09uTG9hZDogdHJ1ZSxcbiAgICAvLyBvcGVyYXRpb25zXG4gICAgdGludDogWy0xLCAwLCAwLCAwXSxcbiAgICBmbGF0dGVuOiBmYWxzZSxcbiAgICBmbGF0dGVuQmFja2dyb3VuZDogWzAsIDAsIDBdLFxuICAgIHVuZmxhdHRlbjogZmFsc2UsXG4gICAgbmVnYXRlOiBmYWxzZSxcbiAgICBuZWdhdGVBbHBoYTogdHJ1ZSxcbiAgICBtZWRpYW5TaXplOiAwLFxuICAgIGJsdXJTaWdtYTogMCxcbiAgICBwcmVjaXNpb246ICdpbnRlZ2VyJyxcbiAgICBtaW5BbXBsOiAwLjIsXG4gICAgc2hhcnBlblNpZ21hOiAwLFxuICAgIHNoYXJwZW5NMTogMSxcbiAgICBzaGFycGVuTTI6IDIsXG4gICAgc2hhcnBlblgxOiAyLFxuICAgIHNoYXJwZW5ZMjogMTAsXG4gICAgc2hhcnBlblkzOiAyMCxcbiAgICB0aHJlc2hvbGQ6IDAsXG4gICAgdGhyZXNob2xkR3JheXNjYWxlOiB0cnVlLFxuICAgIHRyaW1CYWNrZ3JvdW5kOiBbXSxcbiAgICB0cmltVGhyZXNob2xkOiAtMSxcbiAgICB0cmltTGluZUFydDogZmFsc2UsXG4gICAgZ2FtbWE6IDAsXG4gICAgZ2FtbWFPdXQ6IDAsXG4gICAgZ3JleXNjYWxlOiBmYWxzZSxcbiAgICBub3JtYWxpc2U6IGZhbHNlLFxuICAgIG5vcm1hbGlzZUxvd2VyOiAxLFxuICAgIG5vcm1hbGlzZVVwcGVyOiA5OSxcbiAgICBjbGFoZVdpZHRoOiAwLFxuICAgIGNsYWhlSGVpZ2h0OiAwLFxuICAgIGNsYWhlTWF4U2xvcGU6IDMsXG4gICAgYnJpZ2h0bmVzczogMSxcbiAgICBzYXR1cmF0aW9uOiAxLFxuICAgIGh1ZTogMCxcbiAgICBsaWdodG5lc3M6IDAsXG4gICAgYm9vbGVhbkJ1ZmZlckluOiBudWxsLFxuICAgIGJvb2xlYW5GaWxlSW46ICcnLFxuICAgIGpvaW5DaGFubmVsSW46IFtdLFxuICAgIGV4dHJhY3RDaGFubmVsOiAtMSxcbiAgICByZW1vdmVBbHBoYTogZmFsc2UsXG4gICAgZW5zdXJlQWxwaGE6IC0xLFxuICAgIGNvbG91cnNwYWNlOiAnc3JnYicsXG4gICAgY29sb3Vyc3BhY2VQaXBlbGluZTogJ2xhc3QnLFxuICAgIGNvbXBvc2l0ZTogW10sXG4gICAgLy8gb3V0cHV0XG4gICAgZmlsZU91dDogJycsXG4gICAgZm9ybWF0T3V0OiAnaW5wdXQnLFxuICAgIHN0cmVhbU91dDogZmFsc2UsXG4gICAga2VlcE1ldGFkYXRhOiAwLFxuICAgIHdpdGhNZXRhZGF0YU9yaWVudGF0aW9uOiAtMSxcbiAgICB3aXRoTWV0YWRhdGFEZW5zaXR5OiAwLFxuICAgIHdpdGhJY2NQcm9maWxlOiAnJyxcbiAgICB3aXRoRXhpZjoge30sXG4gICAgd2l0aEV4aWZNZXJnZTogdHJ1ZSxcbiAgICByZXNvbHZlV2l0aE9iamVjdDogZmFsc2UsXG4gICAgLy8gb3V0cHV0IGZvcm1hdFxuICAgIGpwZWdRdWFsaXR5OiA4MCxcbiAgICBqcGVnUHJvZ3Jlc3NpdmU6IGZhbHNlLFxuICAgIGpwZWdDaHJvbWFTdWJzYW1wbGluZzogJzQ6MjowJyxcbiAgICBqcGVnVHJlbGxpc1F1YW50aXNhdGlvbjogZmFsc2UsXG4gICAganBlZ092ZXJzaG9vdERlcmluZ2luZzogZmFsc2UsXG4gICAganBlZ09wdGltaXNlU2NhbnM6IGZhbHNlLFxuICAgIGpwZWdPcHRpbWlzZUNvZGluZzogdHJ1ZSxcbiAgICBqcGVnUXVhbnRpc2F0aW9uVGFibGU6IDAsXG4gICAgcG5nUHJvZ3Jlc3NpdmU6IGZhbHNlLFxuICAgIHBuZ0NvbXByZXNzaW9uTGV2ZWw6IDYsXG4gICAgcG5nQWRhcHRpdmVGaWx0ZXJpbmc6IGZhbHNlLFxuICAgIHBuZ1BhbGV0dGU6IGZhbHNlLFxuICAgIHBuZ1F1YWxpdHk6IDEwMCxcbiAgICBwbmdFZmZvcnQ6IDcsXG4gICAgcG5nQml0ZGVwdGg6IDgsXG4gICAgcG5nRGl0aGVyOiAxLFxuICAgIGpwMlF1YWxpdHk6IDgwLFxuICAgIGpwMlRpbGVIZWlnaHQ6IDUxMixcbiAgICBqcDJUaWxlV2lkdGg6IDUxMixcbiAgICBqcDJMb3NzbGVzczogZmFsc2UsXG4gICAganAyQ2hyb21hU3Vic2FtcGxpbmc6ICc0OjQ6NCcsXG4gICAgd2VicFF1YWxpdHk6IDgwLFxuICAgIHdlYnBBbHBoYVF1YWxpdHk6IDEwMCxcbiAgICB3ZWJwTG9zc2xlc3M6IGZhbHNlLFxuICAgIHdlYnBOZWFyTG9zc2xlc3M6IGZhbHNlLFxuICAgIHdlYnBTbWFydFN1YnNhbXBsZTogZmFsc2UsXG4gICAgd2VicFByZXNldDogJ2RlZmF1bHQnLFxuICAgIHdlYnBFZmZvcnQ6IDQsXG4gICAgd2VicE1pblNpemU6IGZhbHNlLFxuICAgIHdlYnBNaXhlZDogZmFsc2UsXG4gICAgZ2lmQml0ZGVwdGg6IDgsXG4gICAgZ2lmRWZmb3J0OiA3LFxuICAgIGdpZkRpdGhlcjogMSxcbiAgICBnaWZJbnRlckZyYW1lTWF4RXJyb3I6IDAsXG4gICAgZ2lmSW50ZXJQYWxldHRlTWF4RXJyb3I6IDMsXG4gICAgZ2lmUmV1c2U6IHRydWUsXG4gICAgZ2lmUHJvZ3Jlc3NpdmU6IGZhbHNlLFxuICAgIHRpZmZRdWFsaXR5OiA4MCxcbiAgICB0aWZmQ29tcHJlc3Npb246ICdqcGVnJyxcbiAgICB0aWZmUHJlZGljdG9yOiAnaG9yaXpvbnRhbCcsXG4gICAgdGlmZlB5cmFtaWQ6IGZhbHNlLFxuICAgIHRpZmZNaW5pc3doaXRlOiBmYWxzZSxcbiAgICB0aWZmQml0ZGVwdGg6IDgsXG4gICAgdGlmZlRpbGU6IGZhbHNlLFxuICAgIHRpZmZUaWxlSGVpZ2h0OiAyNTYsXG4gICAgdGlmZlRpbGVXaWR0aDogMjU2LFxuICAgIHRpZmZYcmVzOiAxLjAsXG4gICAgdGlmZllyZXM6IDEuMCxcbiAgICB0aWZmUmVzb2x1dGlvblVuaXQ6ICdpbmNoJyxcbiAgICBoZWlmUXVhbGl0eTogNTAsXG4gICAgaGVpZkxvc3NsZXNzOiBmYWxzZSxcbiAgICBoZWlmQ29tcHJlc3Npb246ICdhdjEnLFxuICAgIGhlaWZFZmZvcnQ6IDQsXG4gICAgaGVpZkNocm9tYVN1YnNhbXBsaW5nOiAnNDo0OjQnLFxuICAgIGhlaWZCaXRkZXB0aDogOCxcbiAgICBqeGxEaXN0YW5jZTogMSxcbiAgICBqeGxEZWNvZGluZ1RpZXI6IDAsXG4gICAganhsRWZmb3J0OiA3LFxuICAgIGp4bExvc3NsZXNzOiBmYWxzZSxcbiAgICByYXdEZXB0aDogJ3VjaGFyJyxcbiAgICB0aWxlU2l6ZTogMjU2LFxuICAgIHRpbGVPdmVybGFwOiAwLFxuICAgIHRpbGVDb250YWluZXI6ICdmcycsXG4gICAgdGlsZUxheW91dDogJ2R6JyxcbiAgICB0aWxlRm9ybWF0OiAnbGFzdCcsXG4gICAgdGlsZURlcHRoOiAnbGFzdCcsXG4gICAgdGlsZUFuZ2xlOiAwLFxuICAgIHRpbGVTa2lwQmxhbmtzOiAtMSxcbiAgICB0aWxlQmFja2dyb3VuZDogWzI1NSwgMjU1LCAyNTUsIDI1NV0sXG4gICAgdGlsZUNlbnRyZTogZmFsc2UsXG4gICAgdGlsZUlkOiAnaHR0cHM6Ly9leGFtcGxlLmNvbS9paWlmJyxcbiAgICB0aWxlQmFzZW5hbWU6ICcnLFxuICAgIHRpbWVvdXRTZWNvbmRzOiAwLFxuICAgIGxpbmVhckE6IFtdLFxuICAgIGxpbmVhckI6IFtdLFxuICAgIC8vIEZ1bmN0aW9uIHRvIG5vdGlmeSBvZiBsaWJ2aXBzIHdhcm5pbmdzXG4gICAgZGVidWdsb2c6IHdhcm5pbmcgPT4ge1xuICAgICAgdGhpcy5lbWl0KCd3YXJuaW5nJywgd2FybmluZyk7XG4gICAgICBkZWJ1Z2xvZyh3YXJuaW5nKTtcbiAgICB9LFxuICAgIC8vIEZ1bmN0aW9uIHRvIG5vdGlmeSBvZiBxdWV1ZSBsZW5ndGggY2hhbmdlc1xuICAgIHF1ZXVlTGlzdGVuZXI6IGZ1bmN0aW9uIChxdWV1ZUxlbmd0aCkge1xuICAgICAgU2hhcnAucXVldWUuZW1pdCgnY2hhbmdlJywgcXVldWVMZW5ndGgpO1xuICAgIH1cbiAgfTtcbiAgdGhpcy5vcHRpb25zLmlucHV0ID0gdGhpcy5fY3JlYXRlSW5wdXREZXNjcmlwdG9yKGlucHV0LCBvcHRpb25zLCB7IGFsbG93U3RyZWFtOiB0cnVlIH0pO1xuICByZXR1cm4gdGhpcztcbn07XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoU2hhcnAucHJvdG90eXBlLCBzdHJlYW0uRHVwbGV4LnByb3RvdHlwZSk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YoU2hhcnAsIHN0cmVhbS5EdXBsZXgpO1xuXG4vKipcbiAqIFRha2UgYSBcInNuYXBzaG90XCIgb2YgdGhlIFNoYXJwIGluc3RhbmNlLCByZXR1cm5pbmcgYSBuZXcgaW5zdGFuY2UuXG4gKiBDbG9uZWQgaW5zdGFuY2VzIGluaGVyaXQgdGhlIGlucHV0IG9mIHRoZWlyIHBhcmVudCBpbnN0YW5jZS5cbiAqIFRoaXMgYWxsb3dzIG11bHRpcGxlIG91dHB1dCBTdHJlYW1zIGFuZCB0aGVyZWZvcmUgbXVsdGlwbGUgcHJvY2Vzc2luZyBwaXBlbGluZXMgdG8gc2hhcmUgYSBzaW5nbGUgaW5wdXQgU3RyZWFtLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBwaXBlbGluZSA9IHNoYXJwKCkucm90YXRlKCk7XG4gKiBwaXBlbGluZS5jbG9uZSgpLnJlc2l6ZSg4MDAsIDYwMCkucGlwZShmaXJzdFdyaXRhYmxlU3RyZWFtKTtcbiAqIHBpcGVsaW5lLmNsb25lKCkuZXh0cmFjdCh7IGxlZnQ6IDIwLCB0b3A6IDIwLCB3aWR0aDogMTAwLCBoZWlnaHQ6IDEwMCB9KS5waXBlKHNlY29uZFdyaXRhYmxlU3RyZWFtKTtcbiAqIHJlYWRhYmxlU3RyZWFtLnBpcGUocGlwZWxpbmUpO1xuICogLy8gZmlyc3RXcml0YWJsZVN0cmVhbSByZWNlaXZlcyBhdXRvLXJvdGF0ZWQsIHJlc2l6ZWQgcmVhZGFibGVTdHJlYW1cbiAqIC8vIHNlY29uZFdyaXRhYmxlU3RyZWFtIHJlY2VpdmVzIGF1dG8tcm90YXRlZCwgZXh0cmFjdGVkIHJlZ2lvbiBvZiByZWFkYWJsZVN0cmVhbVxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBwaXBlbGluZSB0aGF0IHdpbGwgZG93bmxvYWQgYW4gaW1hZ2UsIHJlc2l6ZSBpdCBhbmQgZm9ybWF0IGl0IHRvIGRpZmZlcmVudCBmaWxlc1xuICogLy8gVXNpbmcgUHJvbWlzZXMgdG8ga25vdyB3aGVuIHRoZSBwaXBlbGluZSBpcyBjb21wbGV0ZVxuICogY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XG4gKiBjb25zdCBnb3QgPSByZXF1aXJlKFwiZ290XCIpO1xuICogY29uc3Qgc2hhcnBTdHJlYW0gPSBzaGFycCh7IGZhaWxPbjogJ25vbmUnIH0pO1xuICpcbiAqIGNvbnN0IHByb21pc2VzID0gW107XG4gKlxuICogcHJvbWlzZXMucHVzaChcbiAqICAgc2hhcnBTdHJlYW1cbiAqICAgICAuY2xvbmUoKVxuICogICAgIC5qcGVnKHsgcXVhbGl0eTogMTAwIH0pXG4gKiAgICAgLnRvRmlsZShcIm9yaWdpbmFsRmlsZS5qcGdcIilcbiAqICk7XG4gKlxuICogcHJvbWlzZXMucHVzaChcbiAqICAgc2hhcnBTdHJlYW1cbiAqICAgICAuY2xvbmUoKVxuICogICAgIC5yZXNpemUoeyB3aWR0aDogNTAwIH0pXG4gKiAgICAgLmpwZWcoeyBxdWFsaXR5OiA4MCB9KVxuICogICAgIC50b0ZpbGUoXCJvcHRpbWl6ZWQtNTAwLmpwZ1wiKVxuICogKTtcbiAqXG4gKiBwcm9taXNlcy5wdXNoKFxuICogICBzaGFycFN0cmVhbVxuICogICAgIC5jbG9uZSgpXG4gKiAgICAgLnJlc2l6ZSh7IHdpZHRoOiA1MDAgfSlcbiAqICAgICAud2VicCh7IHF1YWxpdHk6IDgwIH0pXG4gKiAgICAgLnRvRmlsZShcIm9wdGltaXplZC01MDAud2VicFwiKVxuICogKTtcbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL2dvdC9ibG9iL21haW4vZG9jdW1lbnRhdGlvbi8zLXN0cmVhbXMubWRcbiAqIGdvdC5zdHJlYW0oXCJodHRwczovL3d3dy5leGFtcGxlLmNvbS9zb21lLWZpbGUuanBnXCIpLnBpcGUoc2hhcnBTdHJlYW0pO1xuICpcbiAqIFByb21pc2UuYWxsKHByb21pc2VzKVxuICogICAudGhlbihyZXMgPT4geyBjb25zb2xlLmxvZyhcIkRvbmUhXCIsIHJlcyk7IH0pXG4gKiAgIC5jYXRjaChlcnIgPT4ge1xuICogICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBwcm9jZXNzaW5nIGZpbGVzLCBsZXQncyBjbGVhbiBpdCB1cFwiLCBlcnIpO1xuICogICAgIHRyeSB7XG4gKiAgICAgICBmcy51bmxpbmtTeW5jKFwib3JpZ2luYWxGaWxlLmpwZ1wiKTtcbiAqICAgICAgIGZzLnVubGlua1N5bmMoXCJvcHRpbWl6ZWQtNTAwLmpwZ1wiKTtcbiAqICAgICAgIGZzLnVubGlua1N5bmMoXCJvcHRpbWl6ZWQtNTAwLndlYnBcIik7XG4gKiAgICAgfSBjYXRjaCAoZSkge31cbiAqICAgfSk7XG4gKlxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBjbG9uZSAoKSB7XG4gIC8vIENsb25lIGV4aXN0aW5nIG9wdGlvbnNcbiAgY29uc3QgY2xvbmUgPSB0aGlzLmNvbnN0cnVjdG9yLmNhbGwoKTtcbiAgY29uc3QgeyBkZWJ1Z2xvZywgcXVldWVMaXN0ZW5lciwgLi4ub3B0aW9ucyB9ID0gdGhpcy5vcHRpb25zO1xuICBjbG9uZS5vcHRpb25zID0gc3RydWN0dXJlZENsb25lKG9wdGlvbnMpO1xuICBjbG9uZS5vcHRpb25zLmRlYnVnbG9nID0gZGVidWdsb2c7XG4gIGNsb25lLm9wdGlvbnMucXVldWVMaXN0ZW5lciA9IHF1ZXVlTGlzdGVuZXI7XG4gIC8vIFBhc3MgJ2ZpbmlzaCcgZXZlbnQgdG8gY2xvbmUgZm9yIFN0cmVhbS1iYXNlZCBpbnB1dFxuICBpZiAodGhpcy5faXNTdHJlYW1JbnB1dCgpKSB7XG4gICAgdGhpcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgLy8gQ2xvbmUgaW5oZXJpdHMgaW5wdXQgZGF0YVxuICAgICAgdGhpcy5fZmxhdHRlbkJ1ZmZlckluKCk7XG4gICAgICBjbG9uZS5vcHRpb25zLmlucHV0LmJ1ZmZlciA9IHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXI7XG4gICAgICBjbG9uZS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gY2xvbmU7XG59XG5PYmplY3QuYXNzaWduKFNoYXJwLnByb3RvdHlwZSwgeyBjbG9uZSB9KTtcblxuLyoqXG4gKiBFeHBvcnQgY29uc3RydWN0b3IuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IFNoYXJwO1xuIiwKICAgICIndXNlIHN0cmljdCdcclxuXHJcbm1vZHVsZS5leHBvcnRzID0ge1xyXG5cdFwiYWxpY2VibHVlXCI6IFsyNDAsIDI0OCwgMjU1XSxcclxuXHRcImFudGlxdWV3aGl0ZVwiOiBbMjUwLCAyMzUsIDIxNV0sXHJcblx0XCJhcXVhXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJhcXVhbWFyaW5lXCI6IFsxMjcsIDI1NSwgMjEyXSxcclxuXHRcImF6dXJlXCI6IFsyNDAsIDI1NSwgMjU1XSxcclxuXHRcImJlaWdlXCI6IFsyNDUsIDI0NSwgMjIwXSxcclxuXHRcImJpc3F1ZVwiOiBbMjU1LCAyMjgsIDE5Nl0sXHJcblx0XCJibGFja1wiOiBbMCwgMCwgMF0sXHJcblx0XCJibGFuY2hlZGFsbW9uZFwiOiBbMjU1LCAyMzUsIDIwNV0sXHJcblx0XCJibHVlXCI6IFswLCAwLCAyNTVdLFxyXG5cdFwiYmx1ZXZpb2xldFwiOiBbMTM4LCA0MywgMjI2XSxcclxuXHRcImJyb3duXCI6IFsxNjUsIDQyLCA0Ml0sXHJcblx0XCJidXJseXdvb2RcIjogWzIyMiwgMTg0LCAxMzVdLFxyXG5cdFwiY2FkZXRibHVlXCI6IFs5NSwgMTU4LCAxNjBdLFxyXG5cdFwiY2hhcnRyZXVzZVwiOiBbMTI3LCAyNTUsIDBdLFxyXG5cdFwiY2hvY29sYXRlXCI6IFsyMTAsIDEwNSwgMzBdLFxyXG5cdFwiY29yYWxcIjogWzI1NSwgMTI3LCA4MF0sXHJcblx0XCJjb3JuZmxvd2VyYmx1ZVwiOiBbMTAwLCAxNDksIDIzN10sXHJcblx0XCJjb3Juc2lsa1wiOiBbMjU1LCAyNDgsIDIyMF0sXHJcblx0XCJjcmltc29uXCI6IFsyMjAsIDIwLCA2MF0sXHJcblx0XCJjeWFuXCI6IFswLCAyNTUsIDI1NV0sXHJcblx0XCJkYXJrYmx1ZVwiOiBbMCwgMCwgMTM5XSxcclxuXHRcImRhcmtjeWFuXCI6IFswLCAxMzksIDEzOV0sXHJcblx0XCJkYXJrZ29sZGVucm9kXCI6IFsxODQsIDEzNCwgMTFdLFxyXG5cdFwiZGFya2dyYXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2dyZWVuXCI6IFswLCAxMDAsIDBdLFxyXG5cdFwiZGFya2dyZXlcIjogWzE2OSwgMTY5LCAxNjldLFxyXG5cdFwiZGFya2toYWtpXCI6IFsxODksIDE4MywgMTA3XSxcclxuXHRcImRhcmttYWdlbnRhXCI6IFsxMzksIDAsIDEzOV0sXHJcblx0XCJkYXJrb2xpdmVncmVlblwiOiBbODUsIDEwNywgNDddLFxyXG5cdFwiZGFya29yYW5nZVwiOiBbMjU1LCAxNDAsIDBdLFxyXG5cdFwiZGFya29yY2hpZFwiOiBbMTUzLCA1MCwgMjA0XSxcclxuXHRcImRhcmtyZWRcIjogWzEzOSwgMCwgMF0sXHJcblx0XCJkYXJrc2FsbW9uXCI6IFsyMzMsIDE1MCwgMTIyXSxcclxuXHRcImRhcmtzZWFncmVlblwiOiBbMTQzLCAxODgsIDE0M10sXHJcblx0XCJkYXJrc2xhdGVibHVlXCI6IFs3MiwgNjEsIDEzOV0sXHJcblx0XCJkYXJrc2xhdGVncmF5XCI6IFs0NywgNzksIDc5XSxcclxuXHRcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LCA3OSwgNzldLFxyXG5cdFwiZGFya3R1cnF1b2lzZVwiOiBbMCwgMjA2LCAyMDldLFxyXG5cdFwiZGFya3Zpb2xldFwiOiBbMTQ4LCAwLCAyMTFdLFxyXG5cdFwiZGVlcHBpbmtcIjogWzI1NSwgMjAsIDE0N10sXHJcblx0XCJkZWVwc2t5Ymx1ZVwiOiBbMCwgMTkxLCAyNTVdLFxyXG5cdFwiZGltZ3JheVwiOiBbMTA1LCAxMDUsIDEwNV0sXHJcblx0XCJkaW1ncmV5XCI6IFsxMDUsIDEwNSwgMTA1XSxcclxuXHRcImRvZGdlcmJsdWVcIjogWzMwLCAxNDQsIDI1NV0sXHJcblx0XCJmaXJlYnJpY2tcIjogWzE3OCwgMzQsIDM0XSxcclxuXHRcImZsb3JhbHdoaXRlXCI6IFsyNTUsIDI1MCwgMjQwXSxcclxuXHRcImZvcmVzdGdyZWVuXCI6IFszNCwgMTM5LCAzNF0sXHJcblx0XCJmdWNoc2lhXCI6IFsyNTUsIDAsIDI1NV0sXHJcblx0XCJnYWluc2Jvcm9cIjogWzIyMCwgMjIwLCAyMjBdLFxyXG5cdFwiZ2hvc3R3aGl0ZVwiOiBbMjQ4LCAyNDgsIDI1NV0sXHJcblx0XCJnb2xkXCI6IFsyNTUsIDIxNSwgMF0sXHJcblx0XCJnb2xkZW5yb2RcIjogWzIxOCwgMTY1LCAzMl0sXHJcblx0XCJncmF5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImdyZWVuXCI6IFswLCAxMjgsIDBdLFxyXG5cdFwiZ3JlZW55ZWxsb3dcIjogWzE3MywgMjU1LCA0N10sXHJcblx0XCJncmV5XCI6IFsxMjgsIDEyOCwgMTI4XSxcclxuXHRcImhvbmV5ZGV3XCI6IFsyNDAsIDI1NSwgMjQwXSxcclxuXHRcImhvdHBpbmtcIjogWzI1NSwgMTA1LCAxODBdLFxyXG5cdFwiaW5kaWFucmVkXCI6IFsyMDUsIDkyLCA5Ml0sXHJcblx0XCJpbmRpZ29cIjogWzc1LCAwLCAxMzBdLFxyXG5cdFwiaXZvcnlcIjogWzI1NSwgMjU1LCAyNDBdLFxyXG5cdFwia2hha2lcIjogWzI0MCwgMjMwLCAxNDBdLFxyXG5cdFwibGF2ZW5kZXJcIjogWzIzMCwgMjMwLCAyNTBdLFxyXG5cdFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LCAyNDAsIDI0NV0sXHJcblx0XCJsYXduZ3JlZW5cIjogWzEyNCwgMjUyLCAwXSxcclxuXHRcImxlbW9uY2hpZmZvblwiOiBbMjU1LCAyNTAsIDIwNV0sXHJcblx0XCJsaWdodGJsdWVcIjogWzE3MywgMjE2LCAyMzBdLFxyXG5cdFwibGlnaHRjb3JhbFwiOiBbMjQwLCAxMjgsIDEyOF0sXHJcblx0XCJsaWdodGN5YW5cIjogWzIyNCwgMjU1LCAyNTVdLFxyXG5cdFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwgMjUwLCAyMTBdLFxyXG5cdFwibGlnaHRncmF5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0Z3JlZW5cIjogWzE0NCwgMjM4LCAxNDRdLFxyXG5cdFwibGlnaHRncmV5XCI6IFsyMTEsIDIxMSwgMjExXSxcclxuXHRcImxpZ2h0cGlua1wiOiBbMjU1LCAxODIsIDE5M10sXHJcblx0XCJsaWdodHNhbG1vblwiOiBbMjU1LCAxNjAsIDEyMl0sXHJcblx0XCJsaWdodHNlYWdyZWVuXCI6IFszMiwgMTc4LCAxNzBdLFxyXG5cdFwibGlnaHRza3libHVlXCI6IFsxMzUsIDIwNiwgMjUwXSxcclxuXHRcImxpZ2h0c2xhdGVncmF5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksIDEzNiwgMTUzXSxcclxuXHRcImxpZ2h0c3RlZWxibHVlXCI6IFsxNzYsIDE5NiwgMjIyXSxcclxuXHRcImxpZ2h0eWVsbG93XCI6IFsyNTUsIDI1NSwgMjI0XSxcclxuXHRcImxpbWVcIjogWzAsIDI1NSwgMF0sXHJcblx0XCJsaW1lZ3JlZW5cIjogWzUwLCAyMDUsIDUwXSxcclxuXHRcImxpbmVuXCI6IFsyNTAsIDI0MCwgMjMwXSxcclxuXHRcIm1hZ2VudGFcIjogWzI1NSwgMCwgMjU1XSxcclxuXHRcIm1hcm9vblwiOiBbMTI4LCAwLCAwXSxcclxuXHRcIm1lZGl1bWFxdWFtYXJpbmVcIjogWzEwMiwgMjA1LCAxNzBdLFxyXG5cdFwibWVkaXVtYmx1ZVwiOiBbMCwgMCwgMjA1XSxcclxuXHRcIm1lZGl1bW9yY2hpZFwiOiBbMTg2LCA4NSwgMjExXSxcclxuXHRcIm1lZGl1bXB1cnBsZVwiOiBbMTQ3LCAxMTIsIDIxOV0sXHJcblx0XCJtZWRpdW1zZWFncmVlblwiOiBbNjAsIDE3OSwgMTEzXSxcclxuXHRcIm1lZGl1bXNsYXRlYmx1ZVwiOiBbMTIzLCAxMDQsIDIzOF0sXHJcblx0XCJtZWRpdW1zcHJpbmdncmVlblwiOiBbMCwgMjUwLCAxNTRdLFxyXG5cdFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwgMjA5LCAyMDRdLFxyXG5cdFwibWVkaXVtdmlvbGV0cmVkXCI6IFsxOTksIDIxLCAxMzNdLFxyXG5cdFwibWlkbmlnaHRibHVlXCI6IFsyNSwgMjUsIDExMl0sXHJcblx0XCJtaW50Y3JlYW1cIjogWzI0NSwgMjU1LCAyNTBdLFxyXG5cdFwibWlzdHlyb3NlXCI6IFsyNTUsIDIyOCwgMjI1XSxcclxuXHRcIm1vY2Nhc2luXCI6IFsyNTUsIDIyOCwgMTgxXSxcclxuXHRcIm5hdmFqb3doaXRlXCI6IFsyNTUsIDIyMiwgMTczXSxcclxuXHRcIm5hdnlcIjogWzAsIDAsIDEyOF0sXHJcblx0XCJvbGRsYWNlXCI6IFsyNTMsIDI0NSwgMjMwXSxcclxuXHRcIm9saXZlXCI6IFsxMjgsIDEyOCwgMF0sXHJcblx0XCJvbGl2ZWRyYWJcIjogWzEwNywgMTQyLCAzNV0sXHJcblx0XCJvcmFuZ2VcIjogWzI1NSwgMTY1LCAwXSxcclxuXHRcIm9yYW5nZXJlZFwiOiBbMjU1LCA2OSwgMF0sXHJcblx0XCJvcmNoaWRcIjogWzIxOCwgMTEyLCAyMTRdLFxyXG5cdFwicGFsZWdvbGRlbnJvZFwiOiBbMjM4LCAyMzIsIDE3MF0sXHJcblx0XCJwYWxlZ3JlZW5cIjogWzE1MiwgMjUxLCAxNTJdLFxyXG5cdFwicGFsZXR1cnF1b2lzZVwiOiBbMTc1LCAyMzgsIDIzOF0sXHJcblx0XCJwYWxldmlvbGV0cmVkXCI6IFsyMTksIDExMiwgMTQ3XSxcclxuXHRcInBhcGF5YXdoaXBcIjogWzI1NSwgMjM5LCAyMTNdLFxyXG5cdFwicGVhY2hwdWZmXCI6IFsyNTUsIDIxOCwgMTg1XSxcclxuXHRcInBlcnVcIjogWzIwNSwgMTMzLCA2M10sXHJcblx0XCJwaW5rXCI6IFsyNTUsIDE5MiwgMjAzXSxcclxuXHRcInBsdW1cIjogWzIyMSwgMTYwLCAyMjFdLFxyXG5cdFwicG93ZGVyYmx1ZVwiOiBbMTc2LCAyMjQsIDIzMF0sXHJcblx0XCJwdXJwbGVcIjogWzEyOCwgMCwgMTI4XSxcclxuXHRcInJlYmVjY2FwdXJwbGVcIjogWzEwMiwgNTEsIDE1M10sXHJcblx0XCJyZWRcIjogWzI1NSwgMCwgMF0sXHJcblx0XCJyb3N5YnJvd25cIjogWzE4OCwgMTQzLCAxNDNdLFxyXG5cdFwicm95YWxibHVlXCI6IFs2NSwgMTA1LCAyMjVdLFxyXG5cdFwic2FkZGxlYnJvd25cIjogWzEzOSwgNjksIDE5XSxcclxuXHRcInNhbG1vblwiOiBbMjUwLCAxMjgsIDExNF0sXHJcblx0XCJzYW5keWJyb3duXCI6IFsyNDQsIDE2NCwgOTZdLFxyXG5cdFwic2VhZ3JlZW5cIjogWzQ2LCAxMzksIDg3XSxcclxuXHRcInNlYXNoZWxsXCI6IFsyNTUsIDI0NSwgMjM4XSxcclxuXHRcInNpZW5uYVwiOiBbMTYwLCA4MiwgNDVdLFxyXG5cdFwic2lsdmVyXCI6IFsxOTIsIDE5MiwgMTkyXSxcclxuXHRcInNreWJsdWVcIjogWzEzNSwgMjA2LCAyMzVdLFxyXG5cdFwic2xhdGVibHVlXCI6IFsxMDYsIDkwLCAyMDVdLFxyXG5cdFwic2xhdGVncmF5XCI6IFsxMTIsIDEyOCwgMTQ0XSxcclxuXHRcInNsYXRlZ3JleVwiOiBbMTEyLCAxMjgsIDE0NF0sXHJcblx0XCJzbm93XCI6IFsyNTUsIDI1MCwgMjUwXSxcclxuXHRcInNwcmluZ2dyZWVuXCI6IFswLCAyNTUsIDEyN10sXHJcblx0XCJzdGVlbGJsdWVcIjogWzcwLCAxMzAsIDE4MF0sXHJcblx0XCJ0YW5cIjogWzIxMCwgMTgwLCAxNDBdLFxyXG5cdFwidGVhbFwiOiBbMCwgMTI4LCAxMjhdLFxyXG5cdFwidGhpc3RsZVwiOiBbMjE2LCAxOTEsIDIxNl0sXHJcblx0XCJ0b21hdG9cIjogWzI1NSwgOTksIDcxXSxcclxuXHRcInR1cnF1b2lzZVwiOiBbNjQsIDIyNCwgMjA4XSxcclxuXHRcInZpb2xldFwiOiBbMjM4LCAxMzAsIDIzOF0sXHJcblx0XCJ3aGVhdFwiOiBbMjQ1LCAyMjIsIDE3OV0sXHJcblx0XCJ3aGl0ZVwiOiBbMjU1LCAyNTUsIDI1NV0sXHJcblx0XCJ3aGl0ZXNtb2tlXCI6IFsyNDUsIDI0NSwgMjQ1XSxcclxuXHRcInllbGxvd1wiOiBbMjU1LCAyNTUsIDBdLFxyXG5cdFwieWVsbG93Z3JlZW5cIjogWzE1NCwgMjA1LCA1MF1cclxufTtcclxuIiwKICAgICJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQXJyYXlpc2gob2JqKSB7XG5cdGlmICghb2JqIHx8IHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIG9iaiBpbnN0YW5jZW9mIEFycmF5IHx8IEFycmF5LmlzQXJyYXkob2JqKSB8fFxuXHRcdChvYmoubGVuZ3RoID49IDAgJiYgKG9iai5zcGxpY2UgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fFxuXHRcdFx0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCAob2JqLmxlbmd0aCAtIDEpKSAmJiBvYmouY29uc3RydWN0b3IubmFtZSAhPT0gJ1N0cmluZycpKSk7XG59O1xuIiwKICAgICIndXNlIHN0cmljdCc7XG5cbnZhciBpc0FycmF5aXNoID0gcmVxdWlyZSgnaXMtYXJyYXlpc2gnKTtcblxudmFyIGNvbmNhdCA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQ7XG52YXIgc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbnZhciBzd2l6emxlID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBzd2l6emxlKGFyZ3MpIHtcblx0dmFyIHJlc3VsdHMgPSBbXTtcblxuXHRmb3IgKHZhciBpID0gMCwgbGVuID0gYXJncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuXHRcdHZhciBhcmcgPSBhcmdzW2ldO1xuXG5cdFx0aWYgKGlzQXJyYXlpc2goYXJnKSkge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vamF2YXNjcmlwdC1hcnJheS1jb25jYXQtdnMtcHVzaC85OFxuXHRcdFx0cmVzdWx0cyA9IGNvbmNhdC5jYWxsKHJlc3VsdHMsIHNsaWNlLmNhbGwoYXJnKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdHMucHVzaChhcmcpO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuc3dpenpsZS53cmFwID0gZnVuY3Rpb24gKGZuKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIGZuKHN3aXp6bGUoYXJndW1lbnRzKSk7XG5cdH07XG59O1xuIiwKICAgICIvKiBNSVQgbGljZW5zZSAqL1xudmFyIGNvbG9yTmFtZXMgPSByZXF1aXJlKCdjb2xvci1uYW1lJyk7XG52YXIgc3dpenpsZSA9IHJlcXVpcmUoJ3NpbXBsZS1zd2l6emxlJyk7XG52YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QuaGFzT3duUHJvcGVydHk7XG5cbnZhciByZXZlcnNlTmFtZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vLyBjcmVhdGUgYSBsaXN0IG9mIHJldmVyc2UgY29sb3IgbmFtZXNcbmZvciAodmFyIG5hbWUgaW4gY29sb3JOYW1lcykge1xuXHRpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBuYW1lKSkge1xuXHRcdHJldmVyc2VOYW1lc1tjb2xvck5hbWVzW25hbWVdXSA9IG5hbWU7XG5cdH1cbn1cblxudmFyIGNzID0gbW9kdWxlLmV4cG9ydHMgPSB7XG5cdHRvOiB7fSxcblx0Z2V0OiB7fVxufTtcblxuY3MuZ2V0ID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHR2YXIgcHJlZml4ID0gc3RyaW5nLnN1YnN0cmluZygwLCAzKS50b0xvd2VyQ2FzZSgpO1xuXHR2YXIgdmFsO1xuXHR2YXIgbW9kZWw7XG5cdHN3aXRjaCAocHJlZml4KSB7XG5cdFx0Y2FzZSAnaHNsJzpcblx0XHRcdHZhbCA9IGNzLmdldC5oc2woc3RyaW5nKTtcblx0XHRcdG1vZGVsID0gJ2hzbCc7XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICdod2InOlxuXHRcdFx0dmFsID0gY3MuZ2V0Lmh3YihzdHJpbmcpO1xuXHRcdFx0bW9kZWwgPSAnaHdiJztcblx0XHRcdGJyZWFrO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR2YWwgPSBjcy5nZXQucmdiKHN0cmluZyk7XG5cdFx0XHRtb2RlbCA9ICdyZ2InO1xuXHRcdFx0YnJlYWs7XG5cdH1cblxuXHRpZiAoIXZhbCkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cmV0dXJuIHttb2RlbDogbW9kZWwsIHZhbHVlOiB2YWx9O1xufTtcblxuY3MuZ2V0LnJnYiA9IGZ1bmN0aW9uIChzdHJpbmcpIHtcblx0aWYgKCFzdHJpbmcpIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHZhciBhYmJyID0gL14jKFthLWYwLTldezMsNH0pJC9pO1xuXHR2YXIgaGV4ID0gL14jKFthLWYwLTldezZ9KShbYS1mMC05XXsyfSk/JC9pO1xuXHR2YXIgcmdiYSA9IC9ecmdiYT9cXChcXHMqKFsrLV0/XFxkKykoPz1bXFxzLF0pXFxzKig/OixcXHMqKT8oWystXT9cXGQrKSg/PVtcXHMsXSlcXHMqKD86LFxccyopPyhbKy1dP1xcZCspXFxzKig/OlssfFxcL11cXHMqKFsrLV0/W1xcZFxcLl0rKSglPylcXHMqKT9cXCkkLztcblx0dmFyIHBlciA9IC9ecmdiYT9cXChcXHMqKFsrLV0/W1xcZFxcLl0rKVxcJVxccyosP1xccyooWystXT9bXFxkXFwuXSspXFwlXFxzKiw/XFxzKihbKy1dP1tcXGRcXC5dKylcXCVcXHMqKD86Wyx8XFwvXVxccyooWystXT9bXFxkXFwuXSspKCU/KVxccyopP1xcKSQvO1xuXHR2YXIga2V5d29yZCA9IC9eKFxcdyspJC87XG5cblx0dmFyIHJnYiA9IFswLCAwLCAwLCAxXTtcblx0dmFyIG1hdGNoO1xuXHR2YXIgaTtcblx0dmFyIGhleEFscGhhO1xuXG5cdGlmIChtYXRjaCA9IHN0cmluZy5tYXRjaChoZXgpKSB7XG5cdFx0aGV4QWxwaGEgPSBtYXRjaFsyXTtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL3NsaWNlLXZzLXN1YnN0ci12cy1zdWJzdHJpbmctbWV0aG9kcy1sb25nLXN0cmluZy8xOVxuXHRcdFx0dmFyIGkyID0gaSAqIDI7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaC5zbGljZShpMiwgaTIgKyAyKSwgMTYpO1xuXHRcdH1cblxuXHRcdGlmIChoZXhBbHBoYSkge1xuXHRcdFx0cmdiWzNdID0gcGFyc2VJbnQoaGV4QWxwaGEsIDE2KSAvIDI1NTtcblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2goYWJicikpIHtcblx0XHRtYXRjaCA9IG1hdGNoWzFdO1xuXHRcdGhleEFscGhhID0gbWF0Y2hbM107XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHRyZ2JbaV0gPSBwYXJzZUludChtYXRjaFtpXSArIG1hdGNoW2ldLCAxNik7XG5cdFx0fVxuXG5cdFx0aWYgKGhleEFscGhhKSB7XG5cdFx0XHRyZ2JbM10gPSBwYXJzZUludChoZXhBbHBoYSArIGhleEFscGhhLCAxNikgLyAyNTU7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKHJnYmEpKSB7XG5cdFx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdFx0cmdiW2ldID0gcGFyc2VJbnQobWF0Y2hbaSArIDFdLCAwKTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2hbNF0pIHtcblx0XHRcdGlmIChtYXRjaFs1XSkge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKSAqIDAuMDE7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZ2JbM10gPSBwYXJzZUZsb2F0KG1hdGNoWzRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJpbmcubWF0Y2gocGVyKSkge1xuXHRcdGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYltpXSA9IE1hdGgucm91bmQocGFyc2VGbG9hdChtYXRjaFtpICsgMV0pICogMi41NSk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoWzRdKSB7XG5cdFx0XHRpZiAobWF0Y2hbNV0pIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSkgKiAwLjAxO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmdiWzNdID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKG1hdGNoID0gc3RyaW5nLm1hdGNoKGtleXdvcmQpKSB7XG5cdFx0aWYgKG1hdGNoWzFdID09PSAndHJhbnNwYXJlbnQnKSB7XG5cdFx0XHRyZXR1cm4gWzAsIDAsIDAsIDBdO1xuXHRcdH1cblxuXHRcdGlmICghaGFzT3duUHJvcGVydHkuY2FsbChjb2xvck5hbWVzLCBtYXRjaFsxXSkpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdHJnYiA9IGNvbG9yTmFtZXNbbWF0Y2hbMV1dO1xuXHRcdHJnYlszXSA9IDE7XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9IGVsc2Uge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Zm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuXHRcdHJnYltpXSA9IGNsYW1wKHJnYltpXSwgMCwgMjU1KTtcblx0fVxuXHRyZ2JbM10gPSBjbGFtcChyZ2JbM10sIDAsIDEpO1xuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jcy5nZXQuaHNsID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGhzbCA9IC9eaHNsYT9cXChcXHMqKFsrLV0/KD86XFxkezAsM31cXC4pP1xcZCspKD86ZGVnKT9cXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLD9cXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqKD86Wyx8XFwvXVxccyooWystXT8oPz1cXC5cXGR8XFxkKSg/OjB8WzEtOV1cXGQqKT8oPzpcXC5cXGQqKT8oPzpbZUVdWystXT9cXGQrKT8pXFxzKik/XFwpJC87XG5cdHZhciBtYXRjaCA9IHN0cmluZy5tYXRjaChoc2wpO1xuXG5cdGlmIChtYXRjaCkge1xuXHRcdHZhciBhbHBoYSA9IHBhcnNlRmxvYXQobWF0Y2hbNF0pO1xuXHRcdHZhciBoID0gKChwYXJzZUZsb2F0KG1hdGNoWzFdKSAlIDM2MCkgKyAzNjApICUgMzYwO1xuXHRcdHZhciBzID0gY2xhbXAocGFyc2VGbG9hdChtYXRjaFsyXSksIDAsIDEwMCk7XG5cdFx0dmFyIGwgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzNdKSwgMCwgMTAwKTtcblx0XHR2YXIgYSA9IGNsYW1wKGlzTmFOKGFscGhhKSA/IDEgOiBhbHBoYSwgMCwgMSk7XG5cblx0XHRyZXR1cm4gW2gsIHMsIGwsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy5nZXQuaHdiID0gZnVuY3Rpb24gKHN0cmluZykge1xuXHRpZiAoIXN0cmluZykge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0dmFyIGh3YiA9IC9eaHdiXFwoXFxzKihbKy1dP1xcZHswLDN9KD86XFwuXFxkKyk/KSg/OmRlZyk/XFxzKixcXHMqKFsrLV0/W1xcZFxcLl0rKSVcXHMqLFxccyooWystXT9bXFxkXFwuXSspJVxccyooPzosXFxzKihbKy1dPyg/PVxcLlxcZHxcXGQpKD86MHxbMS05XVxcZCopPyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXHMqKT9cXCkkLztcblx0dmFyIG1hdGNoID0gc3RyaW5nLm1hdGNoKGh3Yik7XG5cblx0aWYgKG1hdGNoKSB7XG5cdFx0dmFyIGFscGhhID0gcGFyc2VGbG9hdChtYXRjaFs0XSk7XG5cdFx0dmFyIGggPSAoKHBhcnNlRmxvYXQobWF0Y2hbMV0pICUgMzYwKSArIDM2MCkgJSAzNjA7XG5cdFx0dmFyIHcgPSBjbGFtcChwYXJzZUZsb2F0KG1hdGNoWzJdKSwgMCwgMTAwKTtcblx0XHR2YXIgYiA9IGNsYW1wKHBhcnNlRmxvYXQobWF0Y2hbM10pLCAwLCAxMDApO1xuXHRcdHZhciBhID0gY2xhbXAoaXNOYU4oYWxwaGEpID8gMSA6IGFscGhhLCAwLCAxKTtcblx0XHRyZXR1cm4gW2gsIHcsIGIsIGFdO1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59O1xuXG5jcy50by5oZXggPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiAoXG5cdFx0JyMnICtcblx0XHRoZXhEb3VibGUocmdiYVswXSkgK1xuXHRcdGhleERvdWJsZShyZ2JhWzFdKSArXG5cdFx0aGV4RG91YmxlKHJnYmFbMl0pICtcblx0XHQocmdiYVszXSA8IDFcblx0XHRcdD8gKGhleERvdWJsZShNYXRoLnJvdW5kKHJnYmFbM10gKiAyNTUpKSlcblx0XHRcdDogJycpXG5cdCk7XG59O1xuXG5jcy50by5yZ2IgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHJldHVybiByZ2JhLmxlbmd0aCA8IDQgfHwgcmdiYVszXSA9PT0gMVxuXHRcdD8gJ3JnYignICsgTWF0aC5yb3VuZChyZ2JhWzBdKSArICcsICcgKyBNYXRoLnJvdW5kKHJnYmFbMV0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsyXSkgKyAnKSdcblx0XHQ6ICdyZ2JhKCcgKyBNYXRoLnJvdW5kKHJnYmFbMF0pICsgJywgJyArIE1hdGgucm91bmQocmdiYVsxXSkgKyAnLCAnICsgTWF0aC5yb3VuZChyZ2JhWzJdKSArICcsICcgKyByZ2JhWzNdICsgJyknO1xufTtcblxuY3MudG8ucmdiLnBlcmNlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciByZ2JhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXG5cdHZhciByID0gTWF0aC5yb3VuZChyZ2JhWzBdIC8gMjU1ICogMTAwKTtcblx0dmFyIGcgPSBNYXRoLnJvdW5kKHJnYmFbMV0gLyAyNTUgKiAxMDApO1xuXHR2YXIgYiA9IE1hdGgucm91bmQocmdiYVsyXSAvIDI1NSAqIDEwMCk7XG5cblx0cmV0dXJuIHJnYmEubGVuZ3RoIDwgNCB8fCByZ2JhWzNdID09PSAxXG5cdFx0PyAncmdiKCcgKyByICsgJyUsICcgKyBnICsgJyUsICcgKyBiICsgJyUpJ1xuXHRcdDogJ3JnYmEoJyArIHIgKyAnJSwgJyArIGcgKyAnJSwgJyArIGIgKyAnJSwgJyArIHJnYmFbM10gKyAnKSc7XG59O1xuXG5jcy50by5oc2wgPSBmdW5jdGlvbiAoKSB7XG5cdHZhciBoc2xhID0gc3dpenpsZShhcmd1bWVudHMpO1xuXHRyZXR1cm4gaHNsYS5sZW5ndGggPCA0IHx8IGhzbGFbM10gPT09IDFcblx0XHQ/ICdoc2woJyArIGhzbGFbMF0gKyAnLCAnICsgaHNsYVsxXSArICclLCAnICsgaHNsYVsyXSArICclKSdcblx0XHQ6ICdoc2xhKCcgKyBoc2xhWzBdICsgJywgJyArIGhzbGFbMV0gKyAnJSwgJyArIGhzbGFbMl0gKyAnJSwgJyArIGhzbGFbM10gKyAnKSc7XG59O1xuXG4vLyBod2IgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gcmdiKGEpICYgaHNsKGEpIHNpbmNlIHRoZXJlIGlzIG5vIGFscGhhIHNwZWNpZmljIHN5bnRheFxuLy8gKGh3YiBoYXZlIGFscGhhIG9wdGlvbmFsICYgMSBpcyBkZWZhdWx0IHZhbHVlKVxuY3MudG8uaHdiID0gZnVuY3Rpb24gKCkge1xuXHR2YXIgaHdiYSA9IHN3aXp6bGUoYXJndW1lbnRzKTtcblxuXHR2YXIgYSA9ICcnO1xuXHRpZiAoaHdiYS5sZW5ndGggPj0gNCAmJiBod2JhWzNdICE9PSAxKSB7XG5cdFx0YSA9ICcsICcgKyBod2JhWzNdO1xuXHR9XG5cblx0cmV0dXJuICdod2IoJyArIGh3YmFbMF0gKyAnLCAnICsgaHdiYVsxXSArICclLCAnICsgaHdiYVsyXSArICclJyArIGEgKyAnKSc7XG59O1xuXG5jcy50by5rZXl3b3JkID0gZnVuY3Rpb24gKHJnYikge1xuXHRyZXR1cm4gcmV2ZXJzZU5hbWVzW3JnYi5zbGljZSgwLCAzKV07XG59O1xuXG4vLyBoZWxwZXJzXG5mdW5jdGlvbiBjbGFtcChudW0sIG1pbiwgbWF4KSB7XG5cdHJldHVybiBNYXRoLm1pbihNYXRoLm1heChtaW4sIG51bSksIG1heCk7XG59XG5cbmZ1bmN0aW9uIGhleERvdWJsZShudW0pIHtcblx0dmFyIHN0ciA9IE1hdGgucm91bmQobnVtKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcblx0cmV0dXJuIChzdHIubGVuZ3RoIDwgMikgPyAnMCcgKyBzdHIgOiBzdHI7XG59XG4iLAogICAgIi8qIE1JVCBsaWNlbnNlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1taXhlZC1vcGVyYXRvcnMgKi9cbmNvbnN0IGNzc0tleXdvcmRzID0gcmVxdWlyZSgnY29sb3ItbmFtZScpO1xuXG4vLyBOT1RFOiBjb252ZXJzaW9ucyBzaG91bGQgb25seSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlcyAoaS5lLiBhcnJheXMsIG9yXG4vLyAgICAgICB2YWx1ZXMgdGhhdCBnaXZlIGNvcnJlY3QgYHR5cGVvZmAgcmVzdWx0cykuXG4vLyAgICAgICBkbyBub3QgdXNlIGJveCB2YWx1ZXMgdHlwZXMgKGkuZS4gTnVtYmVyKCksIFN0cmluZygpLCBldGMuKVxuXG5jb25zdCByZXZlcnNlS2V5d29yZHMgPSB7fTtcbmZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGNzc0tleXdvcmRzKSkge1xuXHRyZXZlcnNlS2V5d29yZHNbY3NzS2V5d29yZHNba2V5XV0gPSBrZXk7XG59XG5cbmNvbnN0IGNvbnZlcnQgPSB7XG5cdHJnYjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdyZ2InfSxcblx0aHNsOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2hzbCd9LFxuXHRoc3Y6IHtjaGFubmVsczogMywgbGFiZWxzOiAnaHN2J30sXG5cdGh3Yjoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICdod2InfSxcblx0Y215azoge2NoYW5uZWxzOiA0LCBsYWJlbHM6ICdjbXlrJ30sXG5cdHh5ejoge2NoYW5uZWxzOiAzLCBsYWJlbHM6ICd4eXonfSxcblx0bGFiOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogJ2xhYid9LFxuXHRsY2g6IHtjaGFubmVsczogMywgbGFiZWxzOiAnbGNoJ30sXG5cdGhleDoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnaGV4J119LFxuXHRrZXl3b3JkOiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydrZXl3b3JkJ119LFxuXHRhbnNpMTY6IHtjaGFubmVsczogMSwgbGFiZWxzOiBbJ2Fuc2kxNiddfSxcblx0YW5zaTI1Njoge2NoYW5uZWxzOiAxLCBsYWJlbHM6IFsnYW5zaTI1NiddfSxcblx0aGNnOiB7Y2hhbm5lbHM6IDMsIGxhYmVsczogWydoJywgJ2MnLCAnZyddfSxcblx0YXBwbGU6IHtjaGFubmVsczogMywgbGFiZWxzOiBbJ3IxNicsICdnMTYnLCAnYjE2J119LFxuXHRncmF5OiB7Y2hhbm5lbHM6IDEsIGxhYmVsczogWydncmF5J119XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZlcnQ7XG5cbi8vIEhpZGUgLmNoYW5uZWxzIGFuZCAubGFiZWxzIHByb3BlcnRpZXNcbmZvciAoY29uc3QgbW9kZWwgb2YgT2JqZWN0LmtleXMoY29udmVydCkpIHtcblx0aWYgKCEoJ2NoYW5uZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoISgnbGFiZWxzJyBpbiBjb252ZXJ0W21vZGVsXSkpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgY2hhbm5lbCBsYWJlbHMgcHJvcGVydHk6ICcgKyBtb2RlbCk7XG5cdH1cblxuXHRpZiAoY29udmVydFttb2RlbF0ubGFiZWxzLmxlbmd0aCAhPT0gY29udmVydFttb2RlbF0uY2hhbm5lbHMpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NoYW5uZWwgYW5kIGxhYmVsIGNvdW50cyBtaXNtYXRjaDogJyArIG1vZGVsKTtcblx0fVxuXG5cdGNvbnN0IHtjaGFubmVscywgbGFiZWxzfSA9IGNvbnZlcnRbbW9kZWxdO1xuXHRkZWxldGUgY29udmVydFttb2RlbF0uY2hhbm5lbHM7XG5cdGRlbGV0ZSBjb252ZXJ0W21vZGVsXS5sYWJlbHM7XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb252ZXJ0W21vZGVsXSwgJ2NoYW5uZWxzJywge3ZhbHVlOiBjaGFubmVsc30pO1xuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFttb2RlbF0sICdsYWJlbHMnLCB7dmFsdWU6IGxhYmVsc30pO1xufVxuXG5jb252ZXJ0LnJnYi5oc2wgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1pbiA9IE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBtYXggPSBNYXRoLm1heChyLCBnLCBiKTtcblx0Y29uc3QgZGVsdGEgPSBtYXggLSBtaW47XG5cdGxldCBoO1xuXHRsZXQgcztcblxuXHRpZiAobWF4ID09PSBtaW4pIHtcblx0XHRoID0gMDtcblx0fSBlbHNlIGlmIChyID09PSBtYXgpIHtcblx0XHRoID0gKGcgLSBiKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGcgPT09IG1heCkge1xuXHRcdGggPSAyICsgKGIgLSByKSAvIGRlbHRhO1xuXHR9IGVsc2UgaWYgKGIgPT09IG1heCkge1xuXHRcdGggPSA0ICsgKHIgLSBnKSAvIGRlbHRhO1xuXHR9XG5cblx0aCA9IE1hdGgubWluKGggKiA2MCwgMzYwKTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGwgPSAobWluICsgbWF4KSAvIDI7XG5cblx0aWYgKG1heCA9PT0gbWluKSB7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSBpZiAobCA8PSAwLjUpIHtcblx0XHRzID0gZGVsdGEgLyAobWF4ICsgbWluKTtcblx0fSBlbHNlIHtcblx0XHRzID0gZGVsdGEgLyAoMiAtIG1heCAtIG1pbik7XG5cdH1cblxuXHRyZXR1cm4gW2gsIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuaHN2ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgcmRpZjtcblx0bGV0IGdkaWY7XG5cdGxldCBiZGlmO1xuXHRsZXQgaDtcblx0bGV0IHM7XG5cblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblx0Y29uc3QgdiA9IE1hdGgubWF4KHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmID0gdiAtIE1hdGgubWluKHIsIGcsIGIpO1xuXHRjb25zdCBkaWZmYyA9IGZ1bmN0aW9uIChjKSB7XG5cdFx0cmV0dXJuICh2IC0gYykgLyA2IC8gZGlmZiArIDEgLyAyO1xuXHR9O1xuXG5cdGlmIChkaWZmID09PSAwKSB7XG5cdFx0aCA9IDA7XG5cdFx0cyA9IDA7XG5cdH0gZWxzZSB7XG5cdFx0cyA9IGRpZmYgLyB2O1xuXHRcdHJkaWYgPSBkaWZmYyhyKTtcblx0XHRnZGlmID0gZGlmZmMoZyk7XG5cdFx0YmRpZiA9IGRpZmZjKGIpO1xuXG5cdFx0aWYgKHIgPT09IHYpIHtcblx0XHRcdGggPSBiZGlmIC0gZ2RpZjtcblx0XHR9IGVsc2UgaWYgKGcgPT09IHYpIHtcblx0XHRcdGggPSAoMSAvIDMpICsgcmRpZiAtIGJkaWY7XG5cdFx0fSBlbHNlIGlmIChiID09PSB2KSB7XG5cdFx0XHRoID0gKDIgLyAzKSArIGdkaWYgLSByZGlmO1xuXHRcdH1cblxuXHRcdGlmIChoIDwgMCkge1xuXHRcdFx0aCArPSAxO1xuXHRcdH0gZWxzZSBpZiAoaCA+IDEpIHtcblx0XHRcdGggLT0gMTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gW1xuXHRcdGggKiAzNjAsXG5cdFx0cyAqIDEwMCxcblx0XHR2ICogMTAwXG5cdF07XG59O1xuXG5jb252ZXJ0LnJnYi5od2IgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF07XG5cdGNvbnN0IGcgPSByZ2JbMV07XG5cdGxldCBiID0gcmdiWzJdO1xuXHRjb25zdCBoID0gY29udmVydC5yZ2IuaHNsKHJnYilbMF07XG5cdGNvbnN0IHcgPSAxIC8gMjU1ICogTWF0aC5taW4ociwgTWF0aC5taW4oZywgYikpO1xuXG5cdGIgPSAxIC0gMSAvIDI1NSAqIE1hdGgubWF4KHIsIE1hdGgubWF4KGcsIGIpKTtcblxuXHRyZXR1cm4gW2gsIHcgKiAxMDAsIGIgKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IuY215ayA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgciA9IHJnYlswXSAvIDI1NTtcblx0Y29uc3QgZyA9IHJnYlsxXSAvIDI1NTtcblx0Y29uc3QgYiA9IHJnYlsyXSAvIDI1NTtcblxuXHRjb25zdCBrID0gTWF0aC5taW4oMSAtIHIsIDEgLSBnLCAxIC0gYik7XG5cdGNvbnN0IGMgPSAoMSAtIHIgLSBrKSAvICgxIC0gaykgfHwgMDtcblx0Y29uc3QgbSA9ICgxIC0gZyAtIGspIC8gKDEgLSBrKSB8fCAwO1xuXHRjb25zdCB5ID0gKDEgLSBiIC0gaykgLyAoMSAtIGspIHx8IDA7XG5cblx0cmV0dXJuIFtjICogMTAwLCBtICogMTAwLCB5ICogMTAwLCBrICogMTAwXTtcbn07XG5cbmZ1bmN0aW9uIGNvbXBhcmF0aXZlRGlzdGFuY2UoeCwgeSkge1xuXHQvKlxuXHRcdFNlZSBodHRwczovL2VuLm0ud2lraXBlZGlhLm9yZy93aWtpL0V1Y2xpZGVhbl9kaXN0YW5jZSNTcXVhcmVkX0V1Y2xpZGVhbl9kaXN0YW5jZVxuXHQqL1xuXHRyZXR1cm4gKFxuXHRcdCgoeFswXSAtIHlbMF0pICoqIDIpICtcblx0XHQoKHhbMV0gLSB5WzFdKSAqKiAyKSArXG5cdFx0KCh4WzJdIC0geVsyXSkgKiogMilcblx0KTtcbn1cblxuY29udmVydC5yZ2Iua2V5d29yZCA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgcmV2ZXJzZWQgPSByZXZlcnNlS2V5d29yZHNbcmdiXTtcblx0aWYgKHJldmVyc2VkKSB7XG5cdFx0cmV0dXJuIHJldmVyc2VkO1xuXHR9XG5cblx0bGV0IGN1cnJlbnRDbG9zZXN0RGlzdGFuY2UgPSBJbmZpbml0eTtcblx0bGV0IGN1cnJlbnRDbG9zZXN0S2V5d29yZDtcblxuXHRmb3IgKGNvbnN0IGtleXdvcmQgb2YgT2JqZWN0LmtleXMoY3NzS2V5d29yZHMpKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBjc3NLZXl3b3Jkc1trZXl3b3JkXTtcblxuXHRcdC8vIENvbXB1dGUgY29tcGFyYXRpdmUgZGlzdGFuY2Vcblx0XHRjb25zdCBkaXN0YW5jZSA9IGNvbXBhcmF0aXZlRGlzdGFuY2UocmdiLCB2YWx1ZSk7XG5cblx0XHQvLyBDaGVjayBpZiBpdHMgbGVzcywgaWYgc28gc2V0IGFzIGNsb3Nlc3Rcblx0XHRpZiAoZGlzdGFuY2UgPCBjdXJyZW50Q2xvc2VzdERpc3RhbmNlKSB7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdERpc3RhbmNlID0gZGlzdGFuY2U7XG5cdFx0XHRjdXJyZW50Q2xvc2VzdEtleXdvcmQgPSBrZXl3b3JkO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjdXJyZW50Q2xvc2VzdEtleXdvcmQ7XG59O1xuXG5jb252ZXJ0LmtleXdvcmQucmdiID0gZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0cmV0dXJuIGNzc0tleXdvcmRzW2tleXdvcmRdO1xufTtcblxuY29udmVydC5yZ2IueHl6ID0gZnVuY3Rpb24gKHJnYikge1xuXHRsZXQgciA9IHJnYlswXSAvIDI1NTtcblx0bGV0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGxldCBiID0gcmdiWzJdIC8gMjU1O1xuXG5cdC8vIEFzc3VtZSBzUkdCXG5cdHIgPSByID4gMC4wNDA0NSA/ICgoKHIgKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40KSA6IChyIC8gMTIuOTIpO1xuXHRnID0gZyA+IDAuMDQwNDUgPyAoKChnICsgMC4wNTUpIC8gMS4wNTUpICoqIDIuNCkgOiAoZyAvIDEyLjkyKTtcblx0YiA9IGIgPiAwLjA0MDQ1ID8gKCgoYiArIDAuMDU1KSAvIDEuMDU1KSAqKiAyLjQpIDogKGIgLyAxMi45Mik7XG5cblx0Y29uc3QgeCA9IChyICogMC40MTI0KSArIChnICogMC4zNTc2KSArIChiICogMC4xODA1KTtcblx0Y29uc3QgeSA9IChyICogMC4yMTI2KSArIChnICogMC43MTUyKSArIChiICogMC4wNzIyKTtcblx0Y29uc3QgeiA9IChyICogMC4wMTkzKSArIChnICogMC4xMTkyKSArIChiICogMC45NTA1KTtcblxuXHRyZXR1cm4gW3ggKiAxMDAsIHkgKiAxMDAsIHogKiAxMDBdO1xufTtcblxuY29udmVydC5yZ2IubGFiID0gZnVuY3Rpb24gKHJnYikge1xuXHRjb25zdCB4eXogPSBjb252ZXJ0LnJnYi54eXoocmdiKTtcblx0bGV0IHggPSB4eXpbMF07XG5cdGxldCB5ID0geHl6WzFdO1xuXHRsZXQgeiA9IHh5elsyXTtcblxuXHR4IC89IDk1LjA0Nztcblx0eSAvPSAxMDA7XG5cdHogLz0gMTA4Ljg4MztcblxuXHR4ID0geCA+IDAuMDA4ODU2ID8gKHggKiogKDEgLyAzKSkgOiAoNy43ODcgKiB4KSArICgxNiAvIDExNik7XG5cdHkgPSB5ID4gMC4wMDg4NTYgPyAoeSAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHkpICsgKDE2IC8gMTE2KTtcblx0eiA9IHogPiAwLjAwODg1NiA/ICh6ICoqICgxIC8gMykpIDogKDcuNzg3ICogeikgKyAoMTYgLyAxMTYpO1xuXG5cdGNvbnN0IGwgPSAoMTE2ICogeSkgLSAxNjtcblx0Y29uc3QgYSA9IDUwMCAqICh4IC0geSk7XG5cdGNvbnN0IGIgPSAyMDAgKiAoeSAtIHopO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LmhzbC5yZ2IgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF0gLyAzNjA7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cdGxldCB0Mjtcblx0bGV0IHQzO1xuXHRsZXQgdmFsO1xuXG5cdGlmIChzID09PSAwKSB7XG5cdFx0dmFsID0gbCAqIDI1NTtcblx0XHRyZXR1cm4gW3ZhbCwgdmFsLCB2YWxdO1xuXHR9XG5cblx0aWYgKGwgPCAwLjUpIHtcblx0XHR0MiA9IGwgKiAoMSArIHMpO1xuXHR9IGVsc2Uge1xuXHRcdHQyID0gbCArIHMgLSBsICogcztcblx0fVxuXG5cdGNvbnN0IHQxID0gMiAqIGwgLSB0MjtcblxuXHRjb25zdCByZ2IgPSBbMCwgMCwgMF07XG5cdGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0dDMgPSBoICsgMSAvIDMgKiAtKGkgLSAxKTtcblx0XHRpZiAodDMgPCAwKSB7XG5cdFx0XHR0MysrO1xuXHRcdH1cblxuXHRcdGlmICh0MyA+IDEpIHtcblx0XHRcdHQzLS07XG5cdFx0fVxuXG5cdFx0aWYgKDYgKiB0MyA8IDEpIHtcblx0XHRcdHZhbCA9IHQxICsgKHQyIC0gdDEpICogNiAqIHQzO1xuXHRcdH0gZWxzZSBpZiAoMiAqIHQzIDwgMSkge1xuXHRcdFx0dmFsID0gdDI7XG5cdFx0fSBlbHNlIGlmICgzICogdDMgPCAyKSB7XG5cdFx0XHR2YWwgPSB0MSArICh0MiAtIHQxKSAqICgyIC8gMyAtIHQzKSAqIDY7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhbCA9IHQxO1xuXHRcdH1cblxuXHRcdHJnYltpXSA9IHZhbCAqIDI1NTtcblx0fVxuXG5cdHJldHVybiByZ2I7XG59O1xuXG5jb252ZXJ0LmhzbC5oc3YgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IGggPSBoc2xbMF07XG5cdGxldCBzID0gaHNsWzFdIC8gMTAwO1xuXHRsZXQgbCA9IGhzbFsyXSAvIDEwMDtcblx0bGV0IHNtaW4gPSBzO1xuXHRjb25zdCBsbWluID0gTWF0aC5tYXgobCwgMC4wMSk7XG5cblx0bCAqPSAyO1xuXHRzICo9IChsIDw9IDEpID8gbCA6IDIgLSBsO1xuXHRzbWluICo9IGxtaW4gPD0gMSA/IGxtaW4gOiAyIC0gbG1pbjtcblx0Y29uc3QgdiA9IChsICsgcykgLyAyO1xuXHRjb25zdCBzdiA9IGwgPT09IDAgPyAoMiAqIHNtaW4pIC8gKGxtaW4gKyBzbWluKSA6ICgyICogcykgLyAobCArIHMpO1xuXG5cdHJldHVybiBbaCwgc3YgKiAxMDAsIHYgKiAxMDBdO1xufTtcblxuY29udmVydC5oc3YucmdiID0gZnVuY3Rpb24gKGhzdikge1xuXHRjb25zdCBoID0gaHN2WzBdIC8gNjA7XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGxldCB2ID0gaHN2WzJdIC8gMTAwO1xuXHRjb25zdCBoaSA9IE1hdGguZmxvb3IoaCkgJSA2O1xuXG5cdGNvbnN0IGYgPSBoIC0gTWF0aC5mbG9vcihoKTtcblx0Y29uc3QgcCA9IDI1NSAqIHYgKiAoMSAtIHMpO1xuXHRjb25zdCBxID0gMjU1ICogdiAqICgxIC0gKHMgKiBmKSk7XG5cdGNvbnN0IHQgPSAyNTUgKiB2ICogKDEgLSAocyAqICgxIC0gZikpKTtcblx0diAqPSAyNTU7XG5cblx0c3dpdGNoIChoaSkge1xuXHRcdGNhc2UgMDpcblx0XHRcdHJldHVybiBbdiwgdCwgcF07XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cmV0dXJuIFtxLCB2LCBwXTtcblx0XHRjYXNlIDI6XG5cdFx0XHRyZXR1cm4gW3AsIHYsIHRdO1xuXHRcdGNhc2UgMzpcblx0XHRcdHJldHVybiBbcCwgcSwgdl07XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cmV0dXJuIFt0LCBwLCB2XTtcblx0XHRjYXNlIDU6XG5cdFx0XHRyZXR1cm4gW3YsIHAsIHFdO1xuXHR9XG59O1xuXG5jb252ZXJ0Lmhzdi5oc2wgPSBmdW5jdGlvbiAoaHN2KSB7XG5cdGNvbnN0IGggPSBoc3ZbMF07XG5cdGNvbnN0IHMgPSBoc3ZbMV0gLyAxMDA7XG5cdGNvbnN0IHYgPSBoc3ZbMl0gLyAxMDA7XG5cdGNvbnN0IHZtaW4gPSBNYXRoLm1heCh2LCAwLjAxKTtcblx0bGV0IHNsO1xuXHRsZXQgbDtcblxuXHRsID0gKDIgLSBzKSAqIHY7XG5cdGNvbnN0IGxtaW4gPSAoMiAtIHMpICogdm1pbjtcblx0c2wgPSBzICogdm1pbjtcblx0c2wgLz0gKGxtaW4gPD0gMSkgPyBsbWluIDogMiAtIGxtaW47XG5cdHNsID0gc2wgfHwgMDtcblx0bCAvPSAyO1xuXG5cdHJldHVybiBbaCwgc2wgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuLy8gaHR0cDovL2Rldi53My5vcmcvY3Nzd2cvY3NzLWNvbG9yLyNod2ItdG8tcmdiXG5jb252ZXJ0Lmh3Yi5yZ2IgPSBmdW5jdGlvbiAoaHdiKSB7XG5cdGNvbnN0IGggPSBod2JbMF0gLyAzNjA7XG5cdGxldCB3aCA9IGh3YlsxXSAvIDEwMDtcblx0bGV0IGJsID0gaHdiWzJdIC8gMTAwO1xuXHRjb25zdCByYXRpbyA9IHdoICsgYmw7XG5cdGxldCBmO1xuXG5cdC8vIFdoICsgYmwgY2FudCBiZSA+IDFcblx0aWYgKHJhdGlvID4gMSkge1xuXHRcdHdoIC89IHJhdGlvO1xuXHRcdGJsIC89IHJhdGlvO1xuXHR9XG5cblx0Y29uc3QgaSA9IE1hdGguZmxvb3IoNiAqIGgpO1xuXHRjb25zdCB2ID0gMSAtIGJsO1xuXHRmID0gNiAqIGggLSBpO1xuXG5cdGlmICgoaSAmIDB4MDEpICE9PSAwKSB7XG5cdFx0ZiA9IDEgLSBmO1xuXHR9XG5cblx0Y29uc3QgbiA9IHdoICsgZiAqICh2IC0gd2gpOyAvLyBMaW5lYXIgaW50ZXJwb2xhdGlvblxuXG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cdC8qIGVzbGludC1kaXNhYmxlIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lLG5vLW11bHRpLXNwYWNlcyAqL1xuXHRzd2l0Y2ggKGkpIHtcblx0XHRkZWZhdWx0OlxuXHRcdGNhc2UgNjpcblx0XHRjYXNlIDA6IHIgPSB2OyAgZyA9IG47ICBiID0gd2g7IGJyZWFrO1xuXHRcdGNhc2UgMTogciA9IG47ICBnID0gdjsgIGIgPSB3aDsgYnJlYWs7XG5cdFx0Y2FzZSAyOiByID0gd2g7IGcgPSB2OyAgYiA9IG47IGJyZWFrO1xuXHRcdGNhc2UgMzogciA9IHdoOyBnID0gbjsgIGIgPSB2OyBicmVhaztcblx0XHRjYXNlIDQ6IHIgPSBuOyAgZyA9IHdoOyBiID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSA1OiByID0gdjsgIGcgPSB3aDsgYiA9IG47IGJyZWFrO1xuXHR9XG5cdC8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMtcGVyLWxpbmUsbm8tbXVsdGktc3BhY2VzICovXG5cblx0cmV0dXJuIFtyICogMjU1LCBnICogMjU1LCBiICogMjU1XTtcbn07XG5cbmNvbnZlcnQuY215ay5yZ2IgPSBmdW5jdGlvbiAoY215aykge1xuXHRjb25zdCBjID0gY215a1swXSAvIDEwMDtcblx0Y29uc3QgbSA9IGNteWtbMV0gLyAxMDA7XG5cdGNvbnN0IHkgPSBjbXlrWzJdIC8gMTAwO1xuXHRjb25zdCBrID0gY215a1szXSAvIDEwMDtcblxuXHRjb25zdCByID0gMSAtIE1hdGgubWluKDEsIGMgKiAoMSAtIGspICsgayk7XG5cdGNvbnN0IGcgPSAxIC0gTWF0aC5taW4oMSwgbSAqICgxIC0gaykgKyBrKTtcblx0Y29uc3QgYiA9IDEgLSBNYXRoLm1pbigxLCB5ICogKDEgLSBrKSArIGspO1xuXG5cdHJldHVybiBbciAqIDI1NSwgZyAqIDI1NSwgYiAqIDI1NV07XG59O1xuXG5jb252ZXJ0Lnh5ei5yZ2IgPSBmdW5jdGlvbiAoeHl6KSB7XG5cdGNvbnN0IHggPSB4eXpbMF0gLyAxMDA7XG5cdGNvbnN0IHkgPSB4eXpbMV0gLyAxMDA7XG5cdGNvbnN0IHogPSB4eXpbMl0gLyAxMDA7XG5cdGxldCByO1xuXHRsZXQgZztcblx0bGV0IGI7XG5cblx0ciA9ICh4ICogMy4yNDA2KSArICh5ICogLTEuNTM3MikgKyAoeiAqIC0wLjQ5ODYpO1xuXHRnID0gKHggKiAtMC45Njg5KSArICh5ICogMS44NzU4KSArICh6ICogMC4wNDE1KTtcblx0YiA9ICh4ICogMC4wNTU3KSArICh5ICogLTAuMjA0MCkgKyAoeiAqIDEuMDU3MCk7XG5cblx0Ly8gQXNzdW1lIHNSR0Jcblx0ciA9IHIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAociAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiByICogMTIuOTI7XG5cblx0ZyA9IGcgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoZyAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBnICogMTIuOTI7XG5cblx0YiA9IGIgPiAwLjAwMzEzMDhcblx0XHQ/ICgoMS4wNTUgKiAoYiAqKiAoMS4wIC8gMi40KSkpIC0gMC4wNTUpXG5cdFx0OiBiICogMTIuOTI7XG5cblx0ciA9IE1hdGgubWluKE1hdGgubWF4KDAsIHIpLCAxKTtcblx0ZyA9IE1hdGgubWluKE1hdGgubWF4KDAsIGcpLCAxKTtcblx0YiA9IE1hdGgubWluKE1hdGgubWF4KDAsIGIpLCAxKTtcblxuXHRyZXR1cm4gW3IgKiAyNTUsIGcgKiAyNTUsIGIgKiAyNTVdO1xufTtcblxuY29udmVydC54eXoubGFiID0gZnVuY3Rpb24gKHh5eikge1xuXHRsZXQgeCA9IHh5elswXTtcblx0bGV0IHkgPSB4eXpbMV07XG5cdGxldCB6ID0geHl6WzJdO1xuXG5cdHggLz0gOTUuMDQ3O1xuXHR5IC89IDEwMDtcblx0eiAvPSAxMDguODgzO1xuXG5cdHggPSB4ID4gMC4wMDg4NTYgPyAoeCAqKiAoMSAvIDMpKSA6ICg3Ljc4NyAqIHgpICsgKDE2IC8gMTE2KTtcblx0eSA9IHkgPiAwLjAwODg1NiA/ICh5ICoqICgxIC8gMykpIDogKDcuNzg3ICogeSkgKyAoMTYgLyAxMTYpO1xuXHR6ID0geiA+IDAuMDA4ODU2ID8gKHogKiogKDEgLyAzKSkgOiAoNy43ODcgKiB6KSArICgxNiAvIDExNik7XG5cblx0Y29uc3QgbCA9ICgxMTYgKiB5KSAtIDE2O1xuXHRjb25zdCBhID0gNTAwICogKHggLSB5KTtcblx0Y29uc3QgYiA9IDIwMCAqICh5IC0geik7XG5cblx0cmV0dXJuIFtsLCBhLCBiXTtcbn07XG5cbmNvbnZlcnQubGFiLnh5eiA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IHg7XG5cdGxldCB5O1xuXHRsZXQgejtcblxuXHR5ID0gKGwgKyAxNikgLyAxMTY7XG5cdHggPSBhIC8gNTAwICsgeTtcblx0eiA9IHkgLSBiIC8gMjAwO1xuXG5cdGNvbnN0IHkyID0geSAqKiAzO1xuXHRjb25zdCB4MiA9IHggKiogMztcblx0Y29uc3QgejIgPSB6ICoqIDM7XG5cdHkgPSB5MiA+IDAuMDA4ODU2ID8geTIgOiAoeSAtIDE2IC8gMTE2KSAvIDcuNzg3O1xuXHR4ID0geDIgPiAwLjAwODg1NiA/IHgyIDogKHggLSAxNiAvIDExNikgLyA3Ljc4Nztcblx0eiA9IHoyID4gMC4wMDg4NTYgPyB6MiA6ICh6IC0gMTYgLyAxMTYpIC8gNy43ODc7XG5cblx0eCAqPSA5NS4wNDc7XG5cdHkgKj0gMTAwO1xuXHR6ICo9IDEwOC44ODM7XG5cblx0cmV0dXJuIFt4LCB5LCB6XTtcbn07XG5cbmNvbnZlcnQubGFiLmxjaCA9IGZ1bmN0aW9uIChsYWIpIHtcblx0Y29uc3QgbCA9IGxhYlswXTtcblx0Y29uc3QgYSA9IGxhYlsxXTtcblx0Y29uc3QgYiA9IGxhYlsyXTtcblx0bGV0IGg7XG5cblx0Y29uc3QgaHIgPSBNYXRoLmF0YW4yKGIsIGEpO1xuXHRoID0gaHIgKiAzNjAgLyAyIC8gTWF0aC5QSTtcblxuXHRpZiAoaCA8IDApIHtcblx0XHRoICs9IDM2MDtcblx0fVxuXG5cdGNvbnN0IGMgPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYik7XG5cblx0cmV0dXJuIFtsLCBjLCBoXTtcbn07XG5cbmNvbnZlcnQubGNoLmxhYiA9IGZ1bmN0aW9uIChsY2gpIHtcblx0Y29uc3QgbCA9IGxjaFswXTtcblx0Y29uc3QgYyA9IGxjaFsxXTtcblx0Y29uc3QgaCA9IGxjaFsyXTtcblxuXHRjb25zdCBociA9IGggLyAzNjAgKiAyICogTWF0aC5QSTtcblx0Y29uc3QgYSA9IGMgKiBNYXRoLmNvcyhocik7XG5cdGNvbnN0IGIgPSBjICogTWF0aC5zaW4oaHIpO1xuXG5cdHJldHVybiBbbCwgYSwgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMTYgPSBmdW5jdGlvbiAoYXJncywgc2F0dXJhdGlvbiA9IG51bGwpIHtcblx0Y29uc3QgW3IsIGcsIGJdID0gYXJncztcblx0bGV0IHZhbHVlID0gc2F0dXJhdGlvbiA9PT0gbnVsbCA/IGNvbnZlcnQucmdiLmhzdihhcmdzKVsyXSA6IHNhdHVyYXRpb247IC8vIEhzdiAtPiBhbnNpMTYgb3B0aW1pemF0aW9uXG5cblx0dmFsdWUgPSBNYXRoLnJvdW5kKHZhbHVlIC8gNTApO1xuXG5cdGlmICh2YWx1ZSA9PT0gMCkge1xuXHRcdHJldHVybiAzMDtcblx0fVxuXG5cdGxldCBhbnNpID0gMzBcblx0XHQrICgoTWF0aC5yb3VuZChiIC8gMjU1KSA8PCAyKVxuXHRcdHwgKE1hdGgucm91bmQoZyAvIDI1NSkgPDwgMSlcblx0XHR8IE1hdGgucm91bmQociAvIDI1NSkpO1xuXG5cdGlmICh2YWx1ZSA9PT0gMikge1xuXHRcdGFuc2kgKz0gNjA7XG5cdH1cblxuXHRyZXR1cm4gYW5zaTtcbn07XG5cbmNvbnZlcnQuaHN2LmFuc2kxNiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIE9wdGltaXphdGlvbiBoZXJlOyB3ZSBhbHJlYWR5IGtub3cgdGhlIHZhbHVlIGFuZCBkb24ndCBuZWVkIHRvIGdldFxuXHQvLyBpdCBjb252ZXJ0ZWQgZm9yIHVzLlxuXHRyZXR1cm4gY29udmVydC5yZ2IuYW5zaTE2KGNvbnZlcnQuaHN2LnJnYihhcmdzKSwgYXJnc1syXSk7XG59O1xuXG5jb252ZXJ0LnJnYi5hbnNpMjU2ID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgciA9IGFyZ3NbMF07XG5cdGNvbnN0IGcgPSBhcmdzWzFdO1xuXHRjb25zdCBiID0gYXJnc1syXTtcblxuXHQvLyBXZSB1c2UgdGhlIGV4dGVuZGVkIGdyZXlzY2FsZSBwYWxldHRlIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZlxuXHQvLyBibGFjayBhbmQgd2hpdGUuIG5vcm1hbCBwYWxldHRlIG9ubHkgaGFzIDQgZ3JleXNjYWxlIHNoYWRlcy5cblx0aWYgKHIgPT09IGcgJiYgZyA9PT0gYikge1xuXHRcdGlmIChyIDwgOCkge1xuXHRcdFx0cmV0dXJuIDE2O1xuXHRcdH1cblxuXHRcdGlmIChyID4gMjQ4KSB7XG5cdFx0XHRyZXR1cm4gMjMxO1xuXHRcdH1cblxuXHRcdHJldHVybiBNYXRoLnJvdW5kKCgociAtIDgpIC8gMjQ3KSAqIDI0KSArIDIzMjtcblx0fVxuXG5cdGNvbnN0IGFuc2kgPSAxNlxuXHRcdCsgKDM2ICogTWF0aC5yb3VuZChyIC8gMjU1ICogNSkpXG5cdFx0KyAoNiAqIE1hdGgucm91bmQoZyAvIDI1NSAqIDUpKVxuXHRcdCsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSk7XG5cblx0cmV0dXJuIGFuc2k7XG59O1xuXG5jb252ZXJ0LmFuc2kxNi5yZ2IgPSBmdW5jdGlvbiAoYXJncykge1xuXHRsZXQgY29sb3IgPSBhcmdzICUgMTA7XG5cblx0Ly8gSGFuZGxlIGdyZXlzY2FsZVxuXHRpZiAoY29sb3IgPT09IDAgfHwgY29sb3IgPT09IDcpIHtcblx0XHRpZiAoYXJncyA+IDUwKSB7XG5cdFx0XHRjb2xvciArPSAzLjU7XG5cdFx0fVxuXG5cdFx0Y29sb3IgPSBjb2xvciAvIDEwLjUgKiAyNTU7XG5cblx0XHRyZXR1cm4gW2NvbG9yLCBjb2xvciwgY29sb3JdO1xuXHR9XG5cblx0Y29uc3QgbXVsdCA9ICh+fihhcmdzID4gNTApICsgMSkgKiAwLjU7XG5cdGNvbnN0IHIgPSAoKGNvbG9yICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgZyA9ICgoKGNvbG9yID4+IDEpICYgMSkgKiBtdWx0KSAqIDI1NTtcblx0Y29uc3QgYiA9ICgoKGNvbG9yID4+IDIpICYgMSkgKiBtdWx0KSAqIDI1NTtcblxuXHRyZXR1cm4gW3IsIGcsIGJdO1xufTtcblxuY29udmVydC5hbnNpMjU2LnJnYiA9IGZ1bmN0aW9uIChhcmdzKSB7XG5cdC8vIEhhbmRsZSBncmV5c2NhbGVcblx0aWYgKGFyZ3MgPj0gMjMyKSB7XG5cdFx0Y29uc3QgYyA9IChhcmdzIC0gMjMyKSAqIDEwICsgODtcblx0XHRyZXR1cm4gW2MsIGMsIGNdO1xuXHR9XG5cblx0YXJncyAtPSAxNjtcblxuXHRsZXQgcmVtO1xuXHRjb25zdCByID0gTWF0aC5mbG9vcihhcmdzIC8gMzYpIC8gNSAqIDI1NTtcblx0Y29uc3QgZyA9IE1hdGguZmxvb3IoKHJlbSA9IGFyZ3MgJSAzNikgLyA2KSAvIDUgKiAyNTU7XG5cdGNvbnN0IGIgPSAocmVtICUgNikgLyA1ICogMjU1O1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oZXggPSBmdW5jdGlvbiAoYXJncykge1xuXHRjb25zdCBpbnRlZ2VyID0gKChNYXRoLnJvdW5kKGFyZ3NbMF0pICYgMHhGRikgPDwgMTYpXG5cdFx0KyAoKE1hdGgucm91bmQoYXJnc1sxXSkgJiAweEZGKSA8PCA4KVxuXHRcdCsgKE1hdGgucm91bmQoYXJnc1syXSkgJiAweEZGKTtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5oZXgucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0Y29uc3QgbWF0Y2ggPSBhcmdzLnRvU3RyaW5nKDE2KS5tYXRjaCgvW2EtZjAtOV17Nn18W2EtZjAtOV17M30vaSk7XG5cdGlmICghbWF0Y2gpIHtcblx0XHRyZXR1cm4gWzAsIDAsIDBdO1xuXHR9XG5cblx0bGV0IGNvbG9yU3RyaW5nID0gbWF0Y2hbMF07XG5cblx0aWYgKG1hdGNoWzBdLmxlbmd0aCA9PT0gMykge1xuXHRcdGNvbG9yU3RyaW5nID0gY29sb3JTdHJpbmcuc3BsaXQoJycpLm1hcChjaGFyID0+IHtcblx0XHRcdHJldHVybiBjaGFyICsgY2hhcjtcblx0XHR9KS5qb2luKCcnKTtcblx0fVxuXG5cdGNvbnN0IGludGVnZXIgPSBwYXJzZUludChjb2xvclN0cmluZywgMTYpO1xuXHRjb25zdCByID0gKGludGVnZXIgPj4gMTYpICYgMHhGRjtcblx0Y29uc3QgZyA9IChpbnRlZ2VyID4+IDgpICYgMHhGRjtcblx0Y29uc3QgYiA9IGludGVnZXIgJiAweEZGO1xuXG5cdHJldHVybiBbciwgZywgYl07XG59O1xuXG5jb252ZXJ0LnJnYi5oY2cgPSBmdW5jdGlvbiAocmdiKSB7XG5cdGNvbnN0IHIgPSByZ2JbMF0gLyAyNTU7XG5cdGNvbnN0IGcgPSByZ2JbMV0gLyAyNTU7XG5cdGNvbnN0IGIgPSByZ2JbMl0gLyAyNTU7XG5cdGNvbnN0IG1heCA9IE1hdGgubWF4KE1hdGgubWF4KHIsIGcpLCBiKTtcblx0Y29uc3QgbWluID0gTWF0aC5taW4oTWF0aC5taW4ociwgZyksIGIpO1xuXHRjb25zdCBjaHJvbWEgPSAobWF4IC0gbWluKTtcblx0bGV0IGdyYXlzY2FsZTtcblx0bGV0IGh1ZTtcblxuXHRpZiAoY2hyb21hIDwgMSkge1xuXHRcdGdyYXlzY2FsZSA9IG1pbiAvICgxIC0gY2hyb21hKTtcblx0fSBlbHNlIHtcblx0XHRncmF5c2NhbGUgPSAwO1xuXHR9XG5cblx0aWYgKGNocm9tYSA8PSAwKSB7XG5cdFx0aHVlID0gMDtcblx0fSBlbHNlXG5cdGlmIChtYXggPT09IHIpIHtcblx0XHRodWUgPSAoKGcgLSBiKSAvIGNocm9tYSkgJSA2O1xuXHR9IGVsc2Vcblx0aWYgKG1heCA9PT0gZykge1xuXHRcdGh1ZSA9IDIgKyAoYiAtIHIpIC8gY2hyb21hO1xuXHR9IGVsc2Uge1xuXHRcdGh1ZSA9IDQgKyAociAtIGcpIC8gY2hyb21hO1xuXHR9XG5cblx0aHVlIC89IDY7XG5cdGh1ZSAlPSAxO1xuXG5cdHJldHVybiBbaHVlICogMzYwLCBjaHJvbWEgKiAxMDAsIGdyYXlzY2FsZSAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhzbC5oY2cgPSBmdW5jdGlvbiAoaHNsKSB7XG5cdGNvbnN0IHMgPSBoc2xbMV0gLyAxMDA7XG5cdGNvbnN0IGwgPSBoc2xbMl0gLyAxMDA7XG5cblx0Y29uc3QgYyA9IGwgPCAwLjUgPyAoMi4wICogcyAqIGwpIDogKDIuMCAqIHMgKiAoMS4wIC0gbCkpO1xuXG5cdGxldCBmID0gMDtcblx0aWYgKGMgPCAxLjApIHtcblx0XHRmID0gKGwgLSAwLjUgKiBjKSAvICgxLjAgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHNsWzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHN2LmhjZyA9IGZ1bmN0aW9uIChoc3YpIHtcblx0Y29uc3QgcyA9IGhzdlsxXSAvIDEwMDtcblx0Y29uc3QgdiA9IGhzdlsyXSAvIDEwMDtcblxuXHRjb25zdCBjID0gcyAqIHY7XG5cdGxldCBmID0gMDtcblxuXHRpZiAoYyA8IDEuMCkge1xuXHRcdGYgPSAodiAtIGMpIC8gKDEgLSBjKTtcblx0fVxuXG5cdHJldHVybiBbaHN2WzBdLCBjICogMTAwLCBmICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaGNnLnJnYiA9IGZ1bmN0aW9uIChoY2cpIHtcblx0Y29uc3QgaCA9IGhjZ1swXSAvIDM2MDtcblx0Y29uc3QgYyA9IGhjZ1sxXSAvIDEwMDtcblx0Y29uc3QgZyA9IGhjZ1syXSAvIDEwMDtcblxuXHRpZiAoYyA9PT0gMC4wKSB7XG5cdFx0cmV0dXJuIFtnICogMjU1LCBnICogMjU1LCBnICogMjU1XTtcblx0fVxuXG5cdGNvbnN0IHB1cmUgPSBbMCwgMCwgMF07XG5cdGNvbnN0IGhpID0gKGggJSAxKSAqIDY7XG5cdGNvbnN0IHYgPSBoaSAlIDE7XG5cdGNvbnN0IHcgPSAxIC0gdjtcblx0bGV0IG1nID0gMDtcblxuXHQvKiBlc2xpbnQtZGlzYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXHRzd2l0Y2ggKE1hdGguZmxvb3IoaGkpKSB7XG5cdFx0Y2FzZSAwOlxuXHRcdFx0cHVyZVswXSA9IDE7IHB1cmVbMV0gPSB2OyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAxOlxuXHRcdFx0cHVyZVswXSA9IHc7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gMDsgYnJlYWs7XG5cdFx0Y2FzZSAyOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSAxOyBwdXJlWzJdID0gdjsgYnJlYWs7XG5cdFx0Y2FzZSAzOlxuXHRcdFx0cHVyZVswXSA9IDA7IHB1cmVbMV0gPSB3OyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0Y2FzZSA0OlxuXHRcdFx0cHVyZVswXSA9IHY7IHB1cmVbMV0gPSAwOyBwdXJlWzJdID0gMTsgYnJlYWs7XG5cdFx0ZGVmYXVsdDpcblx0XHRcdHB1cmVbMF0gPSAxOyBwdXJlWzFdID0gMDsgcHVyZVsyXSA9IHc7XG5cdH1cblx0LyogZXNsaW50LWVuYWJsZSBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG5cdG1nID0gKDEuMCAtIGMpICogZztcblxuXHRyZXR1cm4gW1xuXHRcdChjICogcHVyZVswXSArIG1nKSAqIDI1NSxcblx0XHQoYyAqIHB1cmVbMV0gKyBtZykgKiAyNTUsXG5cdFx0KGMgKiBwdXJlWzJdICsgbWcpICogMjU1XG5cdF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc3YgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgdiA9IGMgKyBnICogKDEuMCAtIGMpO1xuXHRsZXQgZiA9IDA7XG5cblx0aWYgKHYgPiAwLjApIHtcblx0XHRmID0gYyAvIHY7XG5cdH1cblxuXHRyZXR1cm4gW2hjZ1swXSwgZiAqIDEwMCwgdiAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmhjZy5oc2wgPSBmdW5jdGlvbiAoaGNnKSB7XG5cdGNvbnN0IGMgPSBoY2dbMV0gLyAxMDA7XG5cdGNvbnN0IGcgPSBoY2dbMl0gLyAxMDA7XG5cblx0Y29uc3QgbCA9IGcgKiAoMS4wIC0gYykgKyAwLjUgKiBjO1xuXHRsZXQgcyA9IDA7XG5cblx0aWYgKGwgPiAwLjAgJiYgbCA8IDAuNSkge1xuXHRcdHMgPSBjIC8gKDIgKiBsKTtcblx0fSBlbHNlXG5cdGlmIChsID49IDAuNSAmJiBsIDwgMS4wKSB7XG5cdFx0cyA9IGMgLyAoMiAqICgxIC0gbCkpO1xuXHR9XG5cblx0cmV0dXJuIFtoY2dbMF0sIHMgKiAxMDAsIGwgKiAxMDBdO1xufTtcblxuY29udmVydC5oY2cuaHdiID0gZnVuY3Rpb24gKGhjZykge1xuXHRjb25zdCBjID0gaGNnWzFdIC8gMTAwO1xuXHRjb25zdCBnID0gaGNnWzJdIC8gMTAwO1xuXHRjb25zdCB2ID0gYyArIGcgKiAoMS4wIC0gYyk7XG5cdHJldHVybiBbaGNnWzBdLCAodiAtIGMpICogMTAwLCAoMSAtIHYpICogMTAwXTtcbn07XG5cbmNvbnZlcnQuaHdiLmhjZyA9IGZ1bmN0aW9uIChod2IpIHtcblx0Y29uc3QgdyA9IGh3YlsxXSAvIDEwMDtcblx0Y29uc3QgYiA9IGh3YlsyXSAvIDEwMDtcblx0Y29uc3QgdiA9IDEgLSBiO1xuXHRjb25zdCBjID0gdiAtIHc7XG5cdGxldCBnID0gMDtcblxuXHRpZiAoYyA8IDEpIHtcblx0XHRnID0gKHYgLSBjKSAvICgxIC0gYyk7XG5cdH1cblxuXHRyZXR1cm4gW2h3YlswXSwgYyAqIDEwMCwgZyAqIDEwMF07XG59O1xuXG5jb252ZXJ0LmFwcGxlLnJnYiA9IGZ1bmN0aW9uIChhcHBsZSkge1xuXHRyZXR1cm4gWyhhcHBsZVswXSAvIDY1NTM1KSAqIDI1NSwgKGFwcGxlWzFdIC8gNjU1MzUpICogMjU1LCAoYXBwbGVbMl0gLyA2NTUzNSkgKiAyNTVdO1xufTtcblxuY29udmVydC5yZ2IuYXBwbGUgPSBmdW5jdGlvbiAocmdiKSB7XG5cdHJldHVybiBbKHJnYlswXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsxXSAvIDI1NSkgKiA2NTUzNSwgKHJnYlsyXSAvIDI1NSkgKiA2NTUzNV07XG59O1xuXG5jb252ZXJ0LmdyYXkucmdiID0gZnVuY3Rpb24gKGFyZ3MpIHtcblx0cmV0dXJuIFthcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1LCBhcmdzWzBdIC8gMTAwICogMjU1XTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oc2wgPSBmdW5jdGlvbiAoYXJncykge1xuXHRyZXR1cm4gWzAsIDAsIGFyZ3NbMF1dO1xufTtcblxuY29udmVydC5ncmF5LmhzdiA9IGNvbnZlcnQuZ3JheS5oc2w7XG5cbmNvbnZlcnQuZ3JheS5od2IgPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRyZXR1cm4gWzAsIDEwMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkuY215ayA9IGZ1bmN0aW9uIChncmF5KSB7XG5cdHJldHVybiBbMCwgMCwgMCwgZ3JheVswXV07XG59O1xuXG5jb252ZXJ0LmdyYXkubGFiID0gZnVuY3Rpb24gKGdyYXkpIHtcblx0cmV0dXJuIFtncmF5WzBdLCAwLCAwXTtcbn07XG5cbmNvbnZlcnQuZ3JheS5oZXggPSBmdW5jdGlvbiAoZ3JheSkge1xuXHRjb25zdCB2YWwgPSBNYXRoLnJvdW5kKGdyYXlbMF0gLyAxMDAgKiAyNTUpICYgMHhGRjtcblx0Y29uc3QgaW50ZWdlciA9ICh2YWwgPDwgMTYpICsgKHZhbCA8PCA4KSArIHZhbDtcblxuXHRjb25zdCBzdHJpbmcgPSBpbnRlZ2VyLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuXHRyZXR1cm4gJzAwMDAwMCcuc3Vic3RyaW5nKHN0cmluZy5sZW5ndGgpICsgc3RyaW5nO1xufTtcblxuY29udmVydC5yZ2IuZ3JheSA9IGZ1bmN0aW9uIChyZ2IpIHtcblx0Y29uc3QgdmFsID0gKHJnYlswXSArIHJnYlsxXSArIHJnYlsyXSkgLyAzO1xuXHRyZXR1cm4gW3ZhbCAvIDI1NSAqIDEwMF07XG59O1xuIiwKICAgICJjb25zdCBjb252ZXJzaW9ucyA9IHJlcXVpcmUoJy4vY29udmVyc2lvbnMnKTtcblxuLypcblx0VGhpcyBmdW5jdGlvbiByb3V0ZXMgYSBtb2RlbCB0byBhbGwgb3RoZXIgbW9kZWxzLlxuXG5cdGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgcm91dGVkIGhhdmUgYSBwcm9wZXJ0eSBgLmNvbnZlcnNpb25gIGF0dGFjaGVkXG5cdHRvIHRoZSByZXR1cm5lZCBzeW50aGV0aWMgZnVuY3Rpb24uIFRoaXMgcHJvcGVydHkgaXMgYW4gYXJyYXlcblx0b2Ygc3RyaW5ncywgZWFjaCB3aXRoIHRoZSBzdGVwcyBpbiBiZXR3ZWVuIHRoZSAnZnJvbScgYW5kICd0bydcblx0Y29sb3IgbW9kZWxzIChpbmNsdXNpdmUpLlxuXG5cdGNvbnZlcnNpb25zIHRoYXQgYXJlIG5vdCBwb3NzaWJsZSBzaW1wbHkgYXJlIG5vdCBpbmNsdWRlZC5cbiovXG5cbmZ1bmN0aW9uIGJ1aWxkR3JhcGgoKSB7XG5cdGNvbnN0IGdyYXBoID0ge307XG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS9vYmplY3Qta2V5cy12cy1mb3ItaW4td2l0aC1jbG9zdXJlLzNcblx0Y29uc3QgbW9kZWxzID0gT2JqZWN0LmtleXMoY29udmVyc2lvbnMpO1xuXG5cdGZvciAobGV0IGxlbiA9IG1vZGVscy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRncmFwaFttb2RlbHNbaV1dID0ge1xuXHRcdFx0Ly8gaHR0cDovL2pzcGVyZi5jb20vMS12cy1pbmZpbml0eVxuXHRcdFx0Ly8gbWljcm8tb3B0LCBidXQgdGhpcyBpcyBzaW1wbGUuXG5cdFx0XHRkaXN0YW5jZTogLTEsXG5cdFx0XHRwYXJlbnQ6IG51bGxcblx0XHR9O1xuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG4vLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CcmVhZHRoLWZpcnN0X3NlYXJjaFxuZnVuY3Rpb24gZGVyaXZlQkZTKGZyb21Nb2RlbCkge1xuXHRjb25zdCBncmFwaCA9IGJ1aWxkR3JhcGgoKTtcblx0Y29uc3QgcXVldWUgPSBbZnJvbU1vZGVsXTsgLy8gVW5zaGlmdCAtPiBxdWV1ZSAtPiBwb3BcblxuXHRncmFwaFtmcm9tTW9kZWxdLmRpc3RhbmNlID0gMDtcblxuXHR3aGlsZSAocXVldWUubGVuZ3RoKSB7XG5cdFx0Y29uc3QgY3VycmVudCA9IHF1ZXVlLnBvcCgpO1xuXHRcdGNvbnN0IGFkamFjZW50cyA9IE9iamVjdC5rZXlzKGNvbnZlcnNpb25zW2N1cnJlbnRdKTtcblxuXHRcdGZvciAobGV0IGxlbiA9IGFkamFjZW50cy5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGNvbnN0IGFkamFjZW50ID0gYWRqYWNlbnRzW2ldO1xuXHRcdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW2FkamFjZW50XTtcblxuXHRcdFx0aWYgKG5vZGUuZGlzdGFuY2UgPT09IC0xKSB7XG5cdFx0XHRcdG5vZGUuZGlzdGFuY2UgPSBncmFwaFtjdXJyZW50XS5kaXN0YW5jZSArIDE7XG5cdFx0XHRcdG5vZGUucGFyZW50ID0gY3VycmVudDtcblx0XHRcdFx0cXVldWUudW5zaGlmdChhZGphY2VudCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGdyYXBoO1xufVxuXG5mdW5jdGlvbiBsaW5rKGZyb20sIHRvKSB7XG5cdHJldHVybiBmdW5jdGlvbiAoYXJncykge1xuXHRcdHJldHVybiB0byhmcm9tKGFyZ3MpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gd3JhcENvbnZlcnNpb24odG9Nb2RlbCwgZ3JhcGgpIHtcblx0Y29uc3QgcGF0aCA9IFtncmFwaFt0b01vZGVsXS5wYXJlbnQsIHRvTW9kZWxdO1xuXHRsZXQgZm4gPSBjb252ZXJzaW9uc1tncmFwaFt0b01vZGVsXS5wYXJlbnRdW3RvTW9kZWxdO1xuXG5cdGxldCBjdXIgPSBncmFwaFt0b01vZGVsXS5wYXJlbnQ7XG5cdHdoaWxlIChncmFwaFtjdXJdLnBhcmVudCkge1xuXHRcdHBhdGgudW5zaGlmdChncmFwaFtjdXJdLnBhcmVudCk7XG5cdFx0Zm4gPSBsaW5rKGNvbnZlcnNpb25zW2dyYXBoW2N1cl0ucGFyZW50XVtjdXJdLCBmbik7XG5cdFx0Y3VyID0gZ3JhcGhbY3VyXS5wYXJlbnQ7XG5cdH1cblxuXHRmbi5jb252ZXJzaW9uID0gcGF0aDtcblx0cmV0dXJuIGZuO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChmcm9tTW9kZWwpIHtcblx0Y29uc3QgZ3JhcGggPSBkZXJpdmVCRlMoZnJvbU1vZGVsKTtcblx0Y29uc3QgY29udmVyc2lvbiA9IHt9O1xuXG5cdGNvbnN0IG1vZGVscyA9IE9iamVjdC5rZXlzKGdyYXBoKTtcblx0Zm9yIChsZXQgbGVuID0gbW9kZWxzLmxlbmd0aCwgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuXHRcdGNvbnN0IHRvTW9kZWwgPSBtb2RlbHNbaV07XG5cdFx0Y29uc3Qgbm9kZSA9IGdyYXBoW3RvTW9kZWxdO1xuXG5cdFx0aWYgKG5vZGUucGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHQvLyBObyBwb3NzaWJsZSBjb252ZXJzaW9uLCBvciB0aGlzIG5vZGUgaXMgdGhlIHNvdXJjZSBtb2RlbC5cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25bdG9Nb2RlbF0gPSB3cmFwQ29udmVyc2lvbih0b01vZGVsLCBncmFwaCk7XG5cdH1cblxuXHRyZXR1cm4gY29udmVyc2lvbjtcbn07XG5cbiIsCiAgICAiY29uc3QgY29udmVyc2lvbnMgPSByZXF1aXJlKCcuL2NvbnZlcnNpb25zJyk7XG5jb25zdCByb3V0ZSA9IHJlcXVpcmUoJy4vcm91dGUnKTtcblxuY29uc3QgY29udmVydCA9IHt9O1xuXG5jb25zdCBtb2RlbHMgPSBPYmplY3Qua2V5cyhjb252ZXJzaW9ucyk7XG5cbmZ1bmN0aW9uIHdyYXBSYXcoZm4pIHtcblx0Y29uc3Qgd3JhcHBlZEZuID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRjb25zdCBhcmcwID0gYXJnc1swXTtcblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdHJldHVybiBmbihhcmdzKTtcblx0fTtcblxuXHQvLyBQcmVzZXJ2ZSAuY29udmVyc2lvbiBwcm9wZXJ0eSBpZiB0aGVyZSBpcyBvbmVcblx0aWYgKCdjb252ZXJzaW9uJyBpbiBmbikge1xuXHRcdHdyYXBwZWRGbi5jb252ZXJzaW9uID0gZm4uY29udmVyc2lvbjtcblx0fVxuXG5cdHJldHVybiB3cmFwcGVkRm47XG59XG5cbmZ1bmN0aW9uIHdyYXBSb3VuZGVkKGZuKSB7XG5cdGNvbnN0IHdyYXBwZWRGbiA9IGZ1bmN0aW9uICguLi5hcmdzKSB7XG5cdFx0Y29uc3QgYXJnMCA9IGFyZ3NbMF07XG5cblx0XHRpZiAoYXJnMCA9PT0gdW5kZWZpbmVkIHx8IGFyZzAgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBhcmcwO1xuXHRcdH1cblxuXHRcdGlmIChhcmcwLmxlbmd0aCA+IDEpIHtcblx0XHRcdGFyZ3MgPSBhcmcwO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdCA9IGZuKGFyZ3MpO1xuXG5cdFx0Ly8gV2UncmUgYXNzdW1pbmcgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBoZXJlLlxuXHRcdC8vIHNlZSBub3RpY2UgaW4gY29udmVyc2lvbnMuanM7IGRvbid0IHVzZSBib3ggdHlwZXNcblx0XHQvLyBpbiBjb252ZXJzaW9uIGZ1bmN0aW9ucy5cblx0XHRpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcpIHtcblx0XHRcdGZvciAobGV0IGxlbiA9IHJlc3VsdC5sZW5ndGgsIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gTWF0aC5yb3VuZChyZXN1bHRbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gUHJlc2VydmUgLmNvbnZlcnNpb24gcHJvcGVydHkgaWYgdGhlcmUgaXMgb25lXG5cdGlmICgnY29udmVyc2lvbicgaW4gZm4pIHtcblx0XHR3cmFwcGVkRm4uY29udmVyc2lvbiA9IGZuLmNvbnZlcnNpb247XG5cdH1cblxuXHRyZXR1cm4gd3JhcHBlZEZuO1xufVxuXG5tb2RlbHMuZm9yRWFjaChmcm9tTW9kZWwgPT4ge1xuXHRjb252ZXJ0W2Zyb21Nb2RlbF0gPSB7fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoY29udmVydFtmcm9tTW9kZWxdLCAnY2hhbm5lbHMnLCB7dmFsdWU6IGNvbnZlcnNpb25zW2Zyb21Nb2RlbF0uY2hhbm5lbHN9KTtcblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnZlcnRbZnJvbU1vZGVsXSwgJ2xhYmVscycsIHt2YWx1ZTogY29udmVyc2lvbnNbZnJvbU1vZGVsXS5sYWJlbHN9KTtcblxuXHRjb25zdCByb3V0ZXMgPSByb3V0ZShmcm9tTW9kZWwpO1xuXHRjb25zdCByb3V0ZU1vZGVscyA9IE9iamVjdC5rZXlzKHJvdXRlcyk7XG5cblx0cm91dGVNb2RlbHMuZm9yRWFjaCh0b01vZGVsID0+IHtcblx0XHRjb25zdCBmbiA9IHJvdXRlc1t0b01vZGVsXTtcblxuXHRcdGNvbnZlcnRbZnJvbU1vZGVsXVt0b01vZGVsXSA9IHdyYXBSb3VuZGVkKGZuKTtcblx0XHRjb252ZXJ0W2Zyb21Nb2RlbF1bdG9Nb2RlbF0ucmF3ID0gd3JhcFJhdyhmbik7XG5cdH0pO1xufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcbiIsCiAgICAiY29uc3QgY29sb3JTdHJpbmcgPSByZXF1aXJlKCdjb2xvci1zdHJpbmcnKTtcbmNvbnN0IGNvbnZlcnQgPSByZXF1aXJlKCdjb2xvci1jb252ZXJ0Jyk7XG5cbmNvbnN0IHNraXBwZWRNb2RlbHMgPSBbXG5cdC8vIFRvIGJlIGhvbmVzdCwgSSBkb24ndCByZWFsbHkgZmVlbCBsaWtlIGtleXdvcmQgYmVsb25ncyBpbiBjb2xvciBjb252ZXJ0LCBidXQgZWguXG5cdCdrZXl3b3JkJyxcblxuXHQvLyBHcmF5IGNvbmZsaWN0cyB3aXRoIHNvbWUgbWV0aG9kIG5hbWVzLCBhbmQgaGFzIGl0cyBvd24gbWV0aG9kIGRlZmluZWQuXG5cdCdncmF5JyxcblxuXHQvLyBTaG91bGRuJ3QgcmVhbGx5IGJlIGluIGNvbG9yLWNvbnZlcnQgZWl0aGVyLi4uXG5cdCdoZXgnLFxuXTtcblxuY29uc3QgaGFzaGVkTW9kZWxLZXlzID0ge307XG5mb3IgKGNvbnN0IG1vZGVsIG9mIE9iamVjdC5rZXlzKGNvbnZlcnQpKSB7XG5cdGhhc2hlZE1vZGVsS2V5c1tbLi4uY29udmVydFttb2RlbF0ubGFiZWxzXS5zb3J0KCkuam9pbignJyldID0gbW9kZWw7XG59XG5cbmNvbnN0IGxpbWl0ZXJzID0ge307XG5cbmZ1bmN0aW9uIENvbG9yKG9iamVjdCwgbW9kZWwpIHtcblx0aWYgKCEodGhpcyBpbnN0YW5jZW9mIENvbG9yKSkge1xuXHRcdHJldHVybiBuZXcgQ29sb3Iob2JqZWN0LCBtb2RlbCk7XG5cdH1cblxuXHRpZiAobW9kZWwgJiYgbW9kZWwgaW4gc2tpcHBlZE1vZGVscykge1xuXHRcdG1vZGVsID0gbnVsbDtcblx0fVxuXG5cdGlmIChtb2RlbCAmJiAhKG1vZGVsIGluIGNvbnZlcnQpKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1vZGVsOiAnICsgbW9kZWwpO1xuXHR9XG5cblx0bGV0IGk7XG5cdGxldCBjaGFubmVscztcblxuXHRpZiAob2JqZWN0ID09IG51bGwpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1lcS1udWxsLGVxZXFlcVxuXHRcdHRoaXMubW9kZWwgPSAncmdiJztcblx0XHR0aGlzLmNvbG9yID0gWzAsIDAsIDBdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb2xvcikge1xuXHRcdHRoaXMubW9kZWwgPSBvYmplY3QubW9kZWw7XG5cdFx0dGhpcy5jb2xvciA9IFsuLi5vYmplY3QuY29sb3JdO1xuXHRcdHRoaXMudmFscGhhID0gb2JqZWN0LnZhbHBoYTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb2JqZWN0ID09PSAnc3RyaW5nJykge1xuXHRcdGNvbnN0IHJlc3VsdCA9IGNvbG9yU3RyaW5nLmdldChvYmplY3QpO1xuXHRcdGlmIChyZXN1bHQgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIGNvbG9yIGZyb20gc3RyaW5nOiAnICsgb2JqZWN0KTtcblx0XHR9XG5cblx0XHR0aGlzLm1vZGVsID0gcmVzdWx0Lm1vZGVsO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHR0aGlzLmNvbG9yID0gcmVzdWx0LnZhbHVlLnNsaWNlKDAsIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiByZXN1bHQudmFsdWVbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IHJlc3VsdC52YWx1ZVtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKG9iamVjdC5sZW5ndGggPiAwKSB7XG5cdFx0dGhpcy5tb2RlbCA9IG1vZGVsIHx8ICdyZ2InO1xuXHRcdGNoYW5uZWxzID0gY29udmVydFt0aGlzLm1vZGVsXS5jaGFubmVscztcblx0XHRjb25zdCBuZXdBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG9iamVjdCwgMCwgY2hhbm5lbHMpO1xuXHRcdHRoaXMuY29sb3IgPSB6ZXJvQXJyYXkobmV3QXJyYXksIGNoYW5uZWxzKTtcblx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmplY3RbY2hhbm5lbHNdID09PSAnbnVtYmVyJyA/IG9iamVjdFtjaGFubmVsc10gOiAxO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvYmplY3QgPT09ICdudW1iZXInKSB7XG5cdFx0Ly8gVGhpcyBpcyBhbHdheXMgUkdCIC0gY2FuIGJlIGNvbnZlcnRlZCBsYXRlciBvbi5cblx0XHR0aGlzLm1vZGVsID0gJ3JnYic7XG5cdFx0dGhpcy5jb2xvciA9IFtcblx0XHRcdChvYmplY3QgPj4gMTYpICYgMHhGRixcblx0XHRcdChvYmplY3QgPj4gOCkgJiAweEZGLFxuXHRcdFx0b2JqZWN0ICYgMHhGRixcblx0XHRdO1xuXHRcdHRoaXMudmFscGhhID0gMTtcblx0fSBlbHNlIHtcblx0XHR0aGlzLnZhbHBoYSA9IDE7XG5cblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblx0XHRpZiAoJ2FscGhhJyBpbiBvYmplY3QpIHtcblx0XHRcdGtleXMuc3BsaWNlKGtleXMuaW5kZXhPZignYWxwaGEnKSwgMSk7XG5cdFx0XHR0aGlzLnZhbHBoYSA9IHR5cGVvZiBvYmplY3QuYWxwaGEgPT09ICdudW1iZXInID8gb2JqZWN0LmFscGhhIDogMDtcblx0XHR9XG5cblx0XHRjb25zdCBoYXNoZWRLZXlzID0ga2V5cy5zb3J0KCkuam9pbignJyk7XG5cdFx0aWYgKCEoaGFzaGVkS2V5cyBpbiBoYXNoZWRNb2RlbEtleXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSBjb2xvciBmcm9tIG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KG9iamVjdCkpO1xuXHRcdH1cblxuXHRcdHRoaXMubW9kZWwgPSBoYXNoZWRNb2RlbEtleXNbaGFzaGVkS2V5c107XG5cblx0XHRjb25zdCB7bGFiZWxzfSA9IGNvbnZlcnRbdGhpcy5tb2RlbF07XG5cdFx0Y29uc3QgY29sb3IgPSBbXTtcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb2xvci5wdXNoKG9iamVjdFtsYWJlbHNbaV1dKTtcblx0XHR9XG5cblx0XHR0aGlzLmNvbG9yID0gemVyb0FycmF5KGNvbG9yKTtcblx0fVxuXG5cdC8vIFBlcmZvcm0gbGltaXRhdGlvbnMgKGNsYW1waW5nLCBldGMuKVxuXHRpZiAobGltaXRlcnNbdGhpcy5tb2RlbF0pIHtcblx0XHRjaGFubmVscyA9IGNvbnZlcnRbdGhpcy5tb2RlbF0uY2hhbm5lbHM7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdGNvbnN0IGxpbWl0ID0gbGltaXRlcnNbdGhpcy5tb2RlbF1baV07XG5cdFx0XHRpZiAobGltaXQpIHtcblx0XHRcdFx0dGhpcy5jb2xvcltpXSA9IGxpbWl0KHRoaXMuY29sb3JbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHRoaXMudmFscGhhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdGhpcy52YWxwaGEpKTtcblxuXHRpZiAoT2JqZWN0LmZyZWV6ZSkge1xuXHRcdE9iamVjdC5mcmVlemUodGhpcyk7XG5cdH1cbn1cblxuQ29sb3IucHJvdG90eXBlID0ge1xuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gdGhpcy5zdHJpbmcoKTtcblx0fSxcblxuXHR0b0pTT04oKSB7XG5cdFx0cmV0dXJuIHRoaXNbdGhpcy5tb2RlbF0oKTtcblx0fSxcblxuXHRzdHJpbmcocGxhY2VzKSB7XG5cdFx0bGV0IHNlbGYgPSB0aGlzLm1vZGVsIGluIGNvbG9yU3RyaW5nLnRvID8gdGhpcyA6IHRoaXMucmdiKCk7XG5cdFx0c2VsZiA9IHNlbGYucm91bmQodHlwZW9mIHBsYWNlcyA9PT0gJ251bWJlcicgPyBwbGFjZXMgOiAxKTtcblx0XHRjb25zdCBhcmdzID0gc2VsZi52YWxwaGEgPT09IDEgPyBzZWxmLmNvbG9yIDogWy4uLnNlbGYuY29sb3IsIHRoaXMudmFscGhhXTtcblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG9bc2VsZi5tb2RlbF0oYXJncyk7XG5cdH0sXG5cblx0cGVyY2VudFN0cmluZyhwbGFjZXMpIHtcblx0XHRjb25zdCBzZWxmID0gdGhpcy5yZ2IoKS5yb3VuZCh0eXBlb2YgcGxhY2VzID09PSAnbnVtYmVyJyA/IHBsYWNlcyA6IDEpO1xuXHRcdGNvbnN0IGFyZ3MgPSBzZWxmLnZhbHBoYSA9PT0gMSA/IHNlbGYuY29sb3IgOiBbLi4uc2VsZi5jb2xvciwgdGhpcy52YWxwaGFdO1xuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5yZ2IucGVyY2VudChhcmdzKTtcblx0fSxcblxuXHRhcnJheSgpIHtcblx0XHRyZXR1cm4gdGhpcy52YWxwaGEgPT09IDEgPyBbLi4udGhpcy5jb2xvcl0gOiBbLi4udGhpcy5jb2xvciwgdGhpcy52YWxwaGFdO1xuXHR9LFxuXG5cdG9iamVjdCgpIHtcblx0XHRjb25zdCByZXN1bHQgPSB7fTtcblx0XHRjb25zdCB7Y2hhbm5lbHN9ID0gY29udmVydFt0aGlzLm1vZGVsXTtcblx0XHRjb25zdCB7bGFiZWxzfSA9IGNvbnZlcnRbdGhpcy5tb2RlbF07XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHtcblx0XHRcdHJlc3VsdFtsYWJlbHNbaV1dID0gdGhpcy5jb2xvcltpXTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJlc3VsdC5hbHBoYSA9IHRoaXMudmFscGhhO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH0sXG5cblx0dW5pdEFycmF5KCkge1xuXHRcdGNvbnN0IHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0cmdiWzBdIC89IDI1NTtcblx0XHRyZ2JbMV0gLz0gMjU1O1xuXHRcdHJnYlsyXSAvPSAyNTU7XG5cblx0XHRpZiAodGhpcy52YWxwaGEgIT09IDEpIHtcblx0XHRcdHJnYi5wdXNoKHRoaXMudmFscGhhKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdHVuaXRPYmplY3QoKSB7XG5cdFx0Y29uc3QgcmdiID0gdGhpcy5yZ2IoKS5vYmplY3QoKTtcblx0XHRyZ2IuciAvPSAyNTU7XG5cdFx0cmdiLmcgLz0gMjU1O1xuXHRcdHJnYi5iIC89IDI1NTtcblxuXHRcdGlmICh0aGlzLnZhbHBoYSAhPT0gMSkge1xuXHRcdFx0cmdiLmFscGhhID0gdGhpcy52YWxwaGE7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJnYjtcblx0fSxcblxuXHRyb3VuZChwbGFjZXMpIHtcblx0XHRwbGFjZXMgPSBNYXRoLm1heChwbGFjZXMgfHwgMCwgMCk7XG5cdFx0cmV0dXJuIG5ldyBDb2xvcihbLi4udGhpcy5jb2xvci5tYXAocm91bmRUb1BsYWNlKHBsYWNlcykpLCB0aGlzLnZhbHBoYV0sIHRoaXMubW9kZWwpO1xuXHR9LFxuXG5cdGFscGhhKHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IoWy4uLnRoaXMuY29sb3IsIE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHZhbHVlKSldLCB0aGlzLm1vZGVsKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy52YWxwaGE7XG5cdH0sXG5cblx0Ly8gUmdiXG5cdHJlZDogZ2V0c2V0KCdyZ2InLCAwLCBtYXhmbigyNTUpKSxcblx0Z3JlZW46IGdldHNldCgncmdiJywgMSwgbWF4Zm4oMjU1KSksXG5cdGJsdWU6IGdldHNldCgncmdiJywgMiwgbWF4Zm4oMjU1KSksXG5cblx0aHVlOiBnZXRzZXQoWydoc2wnLCAnaHN2JywgJ2hzbCcsICdod2InLCAnaGNnJ10sIDAsIHZhbHVlID0+ICgodmFsdWUgJSAzNjApICsgMzYwKSAlIDM2MCksXG5cblx0c2F0dXJhdGlvbmw6IGdldHNldCgnaHNsJywgMSwgbWF4Zm4oMTAwKSksXG5cdGxpZ2h0bmVzczogZ2V0c2V0KCdoc2wnLCAyLCBtYXhmbigxMDApKSxcblxuXHRzYXR1cmF0aW9udjogZ2V0c2V0KCdoc3YnLCAxLCBtYXhmbigxMDApKSxcblx0dmFsdWU6IGdldHNldCgnaHN2JywgMiwgbWF4Zm4oMTAwKSksXG5cblx0Y2hyb21hOiBnZXRzZXQoJ2hjZycsIDEsIG1heGZuKDEwMCkpLFxuXHRncmF5OiBnZXRzZXQoJ2hjZycsIDIsIG1heGZuKDEwMCkpLFxuXG5cdHdoaXRlOiBnZXRzZXQoJ2h3YicsIDEsIG1heGZuKDEwMCkpLFxuXHR3YmxhY2s6IGdldHNldCgnaHdiJywgMiwgbWF4Zm4oMTAwKSksXG5cblx0Y3lhbjogZ2V0c2V0KCdjbXlrJywgMCwgbWF4Zm4oMTAwKSksXG5cdG1hZ2VudGE6IGdldHNldCgnY215aycsIDEsIG1heGZuKDEwMCkpLFxuXHR5ZWxsb3c6IGdldHNldCgnY215aycsIDIsIG1heGZuKDEwMCkpLFxuXHRibGFjazogZ2V0c2V0KCdjbXlrJywgMywgbWF4Zm4oMTAwKSksXG5cblx0eDogZ2V0c2V0KCd4eXonLCAwLCBtYXhmbig5NS4wNDcpKSxcblx0eTogZ2V0c2V0KCd4eXonLCAxLCBtYXhmbigxMDApKSxcblx0ejogZ2V0c2V0KCd4eXonLCAyLCBtYXhmbigxMDguODMzKSksXG5cblx0bDogZ2V0c2V0KCdsYWInLCAwLCBtYXhmbigxMDApKSxcblx0YTogZ2V0c2V0KCdsYWInLCAxKSxcblx0YjogZ2V0c2V0KCdsYWInLCAyKSxcblxuXHRrZXl3b3JkKHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb252ZXJ0W3RoaXMubW9kZWxdLmtleXdvcmQodGhpcy5jb2xvcik7XG5cdH0sXG5cblx0aGV4KHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb2xvclN0cmluZy50by5oZXgodGhpcy5yZ2IoKS5yb3VuZCgpLmNvbG9yKTtcblx0fSxcblxuXHRoZXhhKHZhbHVlKSB7XG5cdFx0aWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodmFsdWUpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJnYkFycmF5ID0gdGhpcy5yZ2IoKS5yb3VuZCgpLmNvbG9yO1xuXG5cdFx0bGV0IGFscGhhSGV4ID0gTWF0aC5yb3VuZCh0aGlzLnZhbHBoYSAqIDI1NSkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG5cdFx0aWYgKGFscGhhSGV4Lmxlbmd0aCA9PT0gMSkge1xuXHRcdFx0YWxwaGFIZXggPSAnMCcgKyBhbHBoYUhleDtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29sb3JTdHJpbmcudG8uaGV4KHJnYkFycmF5KSArIGFscGhhSGV4O1xuXHR9LFxuXG5cdHJnYk51bWJlcigpIHtcblx0XHRjb25zdCByZ2IgPSB0aGlzLnJnYigpLmNvbG9yO1xuXHRcdHJldHVybiAoKHJnYlswXSAmIDB4RkYpIDw8IDE2KSB8ICgocmdiWzFdICYgMHhGRikgPDwgOCkgfCAocmdiWzJdICYgMHhGRik7XG5cdH0sXG5cblx0bHVtaW5vc2l0eSgpIHtcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9XQ0FHMjAvI3JlbGF0aXZlbHVtaW5hbmNlZGVmXG5cdFx0Y29uc3QgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblxuXHRcdGNvbnN0IGx1bSA9IFtdO1xuXHRcdGZvciAoY29uc3QgW2ksIGVsZW1lbnRdIG9mIHJnYi5lbnRyaWVzKCkpIHtcblx0XHRcdGNvbnN0IGNoYW4gPSBlbGVtZW50IC8gMjU1O1xuXHRcdFx0bHVtW2ldID0gKGNoYW4gPD0gMC4wNDA0NSkgPyBjaGFuIC8gMTIuOTIgOiAoKGNoYW4gKyAwLjA1NSkgLyAxLjA1NSkgKiogMi40O1xuXHRcdH1cblxuXHRcdHJldHVybiAwLjIxMjYgKiBsdW1bMF0gKyAwLjcxNTIgKiBsdW1bMV0gKyAwLjA3MjIgKiBsdW1bMl07XG5cdH0sXG5cblx0Y29udHJhc3QoY29sb3IyKSB7XG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvV0NBRzIwLyNjb250cmFzdC1yYXRpb2RlZlxuXHRcdGNvbnN0IGx1bTEgPSB0aGlzLmx1bWlub3NpdHkoKTtcblx0XHRjb25zdCBsdW0yID0gY29sb3IyLmx1bWlub3NpdHkoKTtcblxuXHRcdGlmIChsdW0xID4gbHVtMikge1xuXHRcdFx0cmV0dXJuIChsdW0xICsgMC4wNSkgLyAobHVtMiArIDAuMDUpO1xuXHRcdH1cblxuXHRcdHJldHVybiAobHVtMiArIDAuMDUpIC8gKGx1bTEgKyAwLjA1KTtcblx0fSxcblxuXHRsZXZlbChjb2xvcjIpIHtcblx0XHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvV0NBRy8jY29udHJhc3QtZW5oYW5jZWRcblx0XHRjb25zdCBjb250cmFzdFJhdGlvID0gdGhpcy5jb250cmFzdChjb2xvcjIpO1xuXHRcdGlmIChjb250cmFzdFJhdGlvID49IDcpIHtcblx0XHRcdHJldHVybiAnQUFBJztcblx0XHR9XG5cblx0XHRyZXR1cm4gKGNvbnRyYXN0UmF0aW8gPj0gNC41KSA/ICdBQScgOiAnJztcblx0fSxcblxuXHRpc0RhcmsoKSB7XG5cdFx0Ly8gWUlRIGVxdWF0aW9uIGZyb20gaHR0cDovLzI0d2F5cy5vcmcvMjAxMC9jYWxjdWxhdGluZy1jb2xvci1jb250cmFzdFxuXHRcdGNvbnN0IHJnYiA9IHRoaXMucmdiKCkuY29sb3I7XG5cdFx0Y29uc3QgeWlxID0gKHJnYlswXSAqIDIxMjYgKyByZ2JbMV0gKiA3MTUyICsgcmdiWzJdICogNzIyKSAvIDEwMDAwO1xuXHRcdHJldHVybiB5aXEgPCAxMjg7XG5cdH0sXG5cblx0aXNMaWdodCgpIHtcblx0XHRyZXR1cm4gIXRoaXMuaXNEYXJrKCk7XG5cdH0sXG5cblx0bmVnYXRlKCkge1xuXHRcdGNvbnN0IHJnYiA9IHRoaXMucmdiKCk7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcblx0XHRcdHJnYi5jb2xvcltpXSA9IDI1NSAtIHJnYi5jb2xvcltpXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmdiO1xuXHR9LFxuXG5cdGxpZ2h0ZW4ocmF0aW8pIHtcblx0XHRjb25zdCBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsyXSArPSBoc2wuY29sb3JbMl0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRhcmtlbihyYXRpbykge1xuXHRcdGNvbnN0IGhzbCA9IHRoaXMuaHNsKCk7XG5cdFx0aHNsLmNvbG9yWzJdIC09IGhzbC5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBoc2w7XG5cdH0sXG5cblx0c2F0dXJhdGUocmF0aW8pIHtcblx0XHRjb25zdCBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSArPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdGRlc2F0dXJhdGUocmF0aW8pIHtcblx0XHRjb25zdCBoc2wgPSB0aGlzLmhzbCgpO1xuXHRcdGhzbC5jb2xvclsxXSAtPSBoc2wuY29sb3JbMV0gKiByYXRpbztcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdHdoaXRlbihyYXRpbykge1xuXHRcdGNvbnN0IGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzFdICs9IGh3Yi5jb2xvclsxXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0YmxhY2tlbihyYXRpbykge1xuXHRcdGNvbnN0IGh3YiA9IHRoaXMuaHdiKCk7XG5cdFx0aHdiLmNvbG9yWzJdICs9IGh3Yi5jb2xvclsyXSAqIHJhdGlvO1xuXHRcdHJldHVybiBod2I7XG5cdH0sXG5cblx0Z3JheXNjYWxlKCkge1xuXHRcdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR3JheXNjYWxlI0NvbnZlcnRpbmdfY29sb3JfdG9fZ3JheXNjYWxlXG5cdFx0Y29uc3QgcmdiID0gdGhpcy5yZ2IoKS5jb2xvcjtcblx0XHRjb25zdCB2YWx1ZSA9IHJnYlswXSAqIDAuMyArIHJnYlsxXSAqIDAuNTkgKyByZ2JbMl0gKiAwLjExO1xuXHRcdHJldHVybiBDb2xvci5yZ2IodmFsdWUsIHZhbHVlLCB2YWx1ZSk7XG5cdH0sXG5cblx0ZmFkZShyYXRpbykge1xuXHRcdHJldHVybiB0aGlzLmFscGhhKHRoaXMudmFscGhhIC0gKHRoaXMudmFscGhhICogcmF0aW8pKTtcblx0fSxcblxuXHRvcGFxdWVyKHJhdGlvKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWxwaGEodGhpcy52YWxwaGEgKyAodGhpcy52YWxwaGEgKiByYXRpbykpO1xuXHR9LFxuXG5cdHJvdGF0ZShkZWdyZWVzKSB7XG5cdFx0Y29uc3QgaHNsID0gdGhpcy5oc2woKTtcblx0XHRsZXQgaHVlID0gaHNsLmNvbG9yWzBdO1xuXHRcdGh1ZSA9IChodWUgKyBkZWdyZWVzKSAlIDM2MDtcblx0XHRodWUgPSBodWUgPCAwID8gMzYwICsgaHVlIDogaHVlO1xuXHRcdGhzbC5jb2xvclswXSA9IGh1ZTtcblx0XHRyZXR1cm4gaHNsO1xuXHR9LFxuXG5cdG1peChtaXhpbkNvbG9yLCB3ZWlnaHQpIHtcblx0XHQvLyBQb3J0ZWQgZnJvbSBzYXNzIGltcGxlbWVudGF0aW9uIGluIENcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vc2Fzcy9saWJzYXNzL2Jsb2IvMGU2YjRhMjg1MDA5MjM1NmFhM2VjZTA3YzZiMjQ5ZjAyMjFjYWNlZC9mdW5jdGlvbnMuY3BwI0wyMDlcblx0XHRpZiAoIW1peGluQ29sb3IgfHwgIW1peGluQ29sb3IucmdiKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRvIFwibWl4XCIgd2FzIG5vdCBhIENvbG9yIGluc3RhbmNlLCBidXQgcmF0aGVyIGFuIGluc3RhbmNlIG9mICcgKyB0eXBlb2YgbWl4aW5Db2xvcik7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sb3IxID0gbWl4aW5Db2xvci5yZ2IoKTtcblx0XHRjb25zdCBjb2xvcjIgPSB0aGlzLnJnYigpO1xuXHRcdGNvbnN0IHAgPSB3ZWlnaHQgPT09IHVuZGVmaW5lZCA/IDAuNSA6IHdlaWdodDtcblxuXHRcdGNvbnN0IHcgPSAyICogcCAtIDE7XG5cdFx0Y29uc3QgYSA9IGNvbG9yMS5hbHBoYSgpIC0gY29sb3IyLmFscGhhKCk7XG5cblx0XHRjb25zdCB3MSA9ICgoKHcgKiBhID09PSAtMSkgPyB3IDogKHcgKyBhKSAvICgxICsgdyAqIGEpKSArIDEpIC8gMjtcblx0XHRjb25zdCB3MiA9IDEgLSB3MTtcblxuXHRcdHJldHVybiBDb2xvci5yZ2IoXG5cdFx0XHR3MSAqIGNvbG9yMS5yZWQoKSArIHcyICogY29sb3IyLnJlZCgpLFxuXHRcdFx0dzEgKiBjb2xvcjEuZ3JlZW4oKSArIHcyICogY29sb3IyLmdyZWVuKCksXG5cdFx0XHR3MSAqIGNvbG9yMS5ibHVlKCkgKyB3MiAqIGNvbG9yMi5ibHVlKCksXG5cdFx0XHRjb2xvcjEuYWxwaGEoKSAqIHAgKyBjb2xvcjIuYWxwaGEoKSAqICgxIC0gcCkpO1xuXHR9LFxufTtcblxuLy8gTW9kZWwgY29udmVyc2lvbiBtZXRob2RzIGFuZCBzdGF0aWMgY29uc3RydWN0b3JzXG5mb3IgKGNvbnN0IG1vZGVsIG9mIE9iamVjdC5rZXlzKGNvbnZlcnQpKSB7XG5cdGlmIChza2lwcGVkTW9kZWxzLmluY2x1ZGVzKG1vZGVsKSkge1xuXHRcdGNvbnRpbnVlO1xuXHR9XG5cblx0Y29uc3Qge2NoYW5uZWxzfSA9IGNvbnZlcnRbbW9kZWxdO1xuXG5cdC8vIENvbnZlcnNpb24gbWV0aG9kc1xuXHRDb2xvci5wcm90b3R5cGVbbW9kZWxdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRpZiAodGhpcy5tb2RlbCA9PT0gbW9kZWwpIHtcblx0XHRcdHJldHVybiBuZXcgQ29sb3IodGhpcyk7XG5cdFx0fVxuXG5cdFx0aWYgKGFyZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcihhcmdzLCBtb2RlbCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBDb2xvcihbLi4uYXNzZXJ0QXJyYXkoY29udmVydFt0aGlzLm1vZGVsXVttb2RlbF0ucmF3KHRoaXMuY29sb3IpKSwgdGhpcy52YWxwaGFdLCBtb2RlbCk7XG5cdH07XG5cblx0Ly8gJ3N0YXRpYycgY29uc3RydWN0aW9uIG1ldGhvZHNcblx0Q29sb3JbbW9kZWxdID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcblx0XHRsZXQgY29sb3IgPSBhcmdzWzBdO1xuXHRcdGlmICh0eXBlb2YgY29sb3IgPT09ICdudW1iZXInKSB7XG5cdFx0XHRjb2xvciA9IHplcm9BcnJheShhcmdzLCBjaGFubmVscyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBDb2xvcihjb2xvciwgbW9kZWwpO1xuXHR9O1xufVxuXG5mdW5jdGlvbiByb3VuZFRvKG51bWJlciwgcGxhY2VzKSB7XG5cdHJldHVybiBOdW1iZXIobnVtYmVyLnRvRml4ZWQocGxhY2VzKSk7XG59XG5cbmZ1bmN0aW9uIHJvdW5kVG9QbGFjZShwbGFjZXMpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChudW1iZXIpIHtcblx0XHRyZXR1cm4gcm91bmRUbyhudW1iZXIsIHBsYWNlcyk7XG5cdH07XG59XG5cbmZ1bmN0aW9uIGdldHNldChtb2RlbCwgY2hhbm5lbCwgbW9kaWZpZXIpIHtcblx0bW9kZWwgPSBBcnJheS5pc0FycmF5KG1vZGVsKSA/IG1vZGVsIDogW21vZGVsXTtcblxuXHRmb3IgKGNvbnN0IG0gb2YgbW9kZWwpIHtcblx0XHQobGltaXRlcnNbbV0gfHwgKGxpbWl0ZXJzW21dID0gW10pKVtjaGFubmVsXSA9IG1vZGlmaWVyO1xuXHR9XG5cblx0bW9kZWwgPSBtb2RlbFswXTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XG5cdFx0bGV0IHJlc3VsdDtcblxuXHRcdGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAobW9kaWZpZXIpIHtcblx0XHRcdFx0dmFsdWUgPSBtb2RpZmllcih2YWx1ZSk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IHRoaXNbbW9kZWxdKCk7XG5cdFx0XHRyZXN1bHQuY29sb3JbY2hhbm5lbF0gPSB2YWx1ZTtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0cmVzdWx0ID0gdGhpc1ttb2RlbF0oKS5jb2xvcltjaGFubmVsXTtcblx0XHRpZiAobW9kaWZpZXIpIHtcblx0XHRcdHJlc3VsdCA9IG1vZGlmaWVyKHJlc3VsdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcbn1cblxuZnVuY3Rpb24gbWF4Zm4obWF4KSB7XG5cdHJldHVybiBmdW5jdGlvbiAodikge1xuXHRcdHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXgsIHYpKTtcblx0fTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0QXJyYXkodmFsdWUpIHtcblx0cmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xufVxuXG5mdW5jdGlvbiB6ZXJvQXJyYXkoYXJyYXksIGxlbmd0aCkge1xuXHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0aWYgKHR5cGVvZiBhcnJheVtpXSAhPT0gJ251bWJlcicpIHtcblx0XHRcdGFycmF5W2ldID0gMDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYXJyYXk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29sb3I7XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29sb3IgPSByZXF1aXJlKCdjb2xvcicpO1xuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5jb25zdCBzaGFycCA9IHJlcXVpcmUoJy4vc2hhcnAnKTtcblxuLyoqXG4gKiBKdXN0aWNhdGlvbiBhbGlnbm1lbnRcbiAqIEBtZW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGFsaWduID0ge1xuICBsZWZ0OiAnbG93JyxcbiAgY2VudGVyOiAnY2VudHJlJyxcbiAgY2VudHJlOiAnY2VudHJlJyxcbiAgcmlnaHQ6ICdoaWdoJ1xufTtcblxuLyoqXG4gKiBFeHRyYWN0IGlucHV0IG9wdGlvbnMsIGlmIGFueSwgZnJvbSBhbiBvYmplY3QuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfaW5wdXRPcHRpb25zRnJvbU9iamVjdCAob2JqKSB7XG4gIGNvbnN0IHsgcmF3LCBkZW5zaXR5LCBsaW1pdElucHV0UGl4ZWxzLCBpZ25vcmVJY2MsIHVubGltaXRlZCwgc2VxdWVudGlhbFJlYWQsIGZhaWxPbiwgZmFpbE9uRXJyb3IsIGFuaW1hdGVkLCBwYWdlLCBwYWdlcywgc3ViaWZkIH0gPSBvYmo7XG4gIHJldHVybiBbcmF3LCBkZW5zaXR5LCBsaW1pdElucHV0UGl4ZWxzLCBpZ25vcmVJY2MsIHVubGltaXRlZCwgc2VxdWVudGlhbFJlYWQsIGZhaWxPbiwgZmFpbE9uRXJyb3IsIGFuaW1hdGVkLCBwYWdlLCBwYWdlcywgc3ViaWZkXS5zb21lKGlzLmRlZmluZWQpXG4gICAgPyB7IHJhdywgZGVuc2l0eSwgbGltaXRJbnB1dFBpeGVscywgaWdub3JlSWNjLCB1bmxpbWl0ZWQsIHNlcXVlbnRpYWxSZWFkLCBmYWlsT24sIGZhaWxPbkVycm9yLCBhbmltYXRlZCwgcGFnZSwgcGFnZXMsIHN1YmlmZCB9XG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ3JlYXRlIE9iamVjdCBjb250YWluaW5nIGlucHV0IGFuZCBpbnB1dC1yZWxhdGVkIG9wdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfY3JlYXRlSW5wdXREZXNjcmlwdG9yIChpbnB1dCwgaW5wdXRPcHRpb25zLCBjb250YWluZXJPcHRpb25zKSB7XG4gIGNvbnN0IGlucHV0RGVzY3JpcHRvciA9IHtcbiAgICBmYWlsT246ICd3YXJuaW5nJyxcbiAgICBsaW1pdElucHV0UGl4ZWxzOiBNYXRoLnBvdygweDNGRkYsIDIpLFxuICAgIGlnbm9yZUljYzogZmFsc2UsXG4gICAgdW5saW1pdGVkOiBmYWxzZSxcbiAgICBzZXF1ZW50aWFsUmVhZDogdHJ1ZVxuICB9O1xuICBpZiAoaXMuc3RyaW5nKGlucHV0KSkge1xuICAgIC8vIGZpbGVzeXN0ZW1cbiAgICBpbnB1dERlc2NyaXB0b3IuZmlsZSA9IGlucHV0O1xuICB9IGVsc2UgaWYgKGlzLmJ1ZmZlcihpbnB1dCkpIHtcbiAgICAvLyBCdWZmZXJcbiAgICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW5wdXQgQnVmZmVyIGlzIGVtcHR5Jyk7XG4gICAgfVxuICAgIGlucHV0RGVzY3JpcHRvci5idWZmZXIgPSBpbnB1dDtcbiAgfSBlbHNlIGlmIChpcy5hcnJheUJ1ZmZlcihpbnB1dCkpIHtcbiAgICBpZiAoaW5wdXQuYnl0ZUxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0lucHV0IGJpdCBBcnJheSBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBpbnB1dERlc2NyaXB0b3IuYnVmZmVyID0gQnVmZmVyLmZyb20oaW5wdXQsIDAsIGlucHV0LmJ5dGVMZW5ndGgpO1xuICB9IGVsc2UgaWYgKGlzLnR5cGVkQXJyYXkoaW5wdXQpKSB7XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0lucHV0IEJpdCBBcnJheSBpcyBlbXB0eScpO1xuICAgIH1cbiAgICBpbnB1dERlc2NyaXB0b3IuYnVmZmVyID0gQnVmZmVyLmZyb20oaW5wdXQuYnVmZmVyLCBpbnB1dC5ieXRlT2Zmc2V0LCBpbnB1dC5ieXRlTGVuZ3RoKTtcbiAgfSBlbHNlIGlmIChpcy5wbGFpbk9iamVjdChpbnB1dCkgJiYgIWlzLmRlZmluZWQoaW5wdXRPcHRpb25zKSkge1xuICAgIC8vIFBsYWluIE9iamVjdCBkZXNjcmlwdG9yLCBlLmcuIGNyZWF0ZVxuICAgIGlucHV0T3B0aW9ucyA9IGlucHV0O1xuICAgIGlmIChfaW5wdXRPcHRpb25zRnJvbU9iamVjdChpbnB1dE9wdGlvbnMpKSB7XG4gICAgICAvLyBTdHJlYW0gd2l0aCBvcHRpb25zXG4gICAgICBpbnB1dERlc2NyaXB0b3IuYnVmZmVyID0gW107XG4gICAgfVxuICB9IGVsc2UgaWYgKCFpcy5kZWZpbmVkKGlucHV0KSAmJiAhaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMpICYmIGlzLm9iamVjdChjb250YWluZXJPcHRpb25zKSAmJiBjb250YWluZXJPcHRpb25zLmFsbG93U3RyZWFtKSB7XG4gICAgLy8gU3RyZWFtIHdpdGhvdXQgb3B0aW9uc1xuICAgIGlucHV0RGVzY3JpcHRvci5idWZmZXIgPSBbXTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGlucHV0ICcke2lucHV0fScgb2YgdHlwZSAke3R5cGVvZiBpbnB1dH0ke1xuICAgICAgaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMpID8gYCB3aGVuIGFsc28gcHJvdmlkaW5nIG9wdGlvbnMgb2YgdHlwZSAke3R5cGVvZiBpbnB1dE9wdGlvbnN9YCA6ICcnXG4gICAgfWApO1xuICB9XG4gIGlmIChpcy5vYmplY3QoaW5wdXRPcHRpb25zKSkge1xuICAgIC8vIERlcHJlY2F0ZWQ6IGZhaWxPbkVycm9yXG4gICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLmZhaWxPbkVycm9yKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLmZhaWxPbkVycm9yKSkge1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IuZmFpbE9uID0gaW5wdXRPcHRpb25zLmZhaWxPbkVycm9yID8gJ3dhcm5pbmcnIDogJ25vbmUnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdmYWlsT25FcnJvcicsICdib29sZWFuJywgaW5wdXRPcHRpb25zLmZhaWxPbkVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZmFpbE9uXG4gICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLmZhaWxPbikpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcoaW5wdXRPcHRpb25zLmZhaWxPbikgJiYgaXMuaW5BcnJheShpbnB1dE9wdGlvbnMuZmFpbE9uLCBbJ25vbmUnLCAndHJ1bmNhdGVkJywgJ2Vycm9yJywgJ3dhcm5pbmcnXSkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmZhaWxPbiA9IGlucHV0T3B0aW9ucy5mYWlsT247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2ZhaWxPbicsICdvbmUgb2Y6IG5vbmUsIHRydW5jYXRlZCwgZXJyb3IsIHdhcm5pbmcnLCBpbnB1dE9wdGlvbnMuZmFpbE9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGVuc2l0eVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5kZW5zaXR5KSkge1xuICAgICAgaWYgKGlzLmluUmFuZ2UoaW5wdXRPcHRpb25zLmRlbnNpdHksIDEsIDEwMDAwMCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmRlbnNpdHkgPSBpbnB1dE9wdGlvbnMuZGVuc2l0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZGVuc2l0eScsICdudW1iZXIgYmV0d2VlbiAxIGFuZCAxMDAwMDAnLCBpbnB1dE9wdGlvbnMuZGVuc2l0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElnbm9yZSBlbWJlZGRkZWQgSUNDIHByb2ZpbGVcbiAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMuaWdub3JlSWNjKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLmlnbm9yZUljYykpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmlnbm9yZUljYyA9IGlucHV0T3B0aW9ucy5pZ25vcmVJY2M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2lnbm9yZUljYycsICdib29sZWFuJywgaW5wdXRPcHRpb25zLmlnbm9yZUljYyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGxpbWl0SW5wdXRQaXhlbHNcbiAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMubGltaXRJbnB1dFBpeGVscykpIHtcbiAgICAgIGlmIChpcy5ib29sKGlucHV0T3B0aW9ucy5saW1pdElucHV0UGl4ZWxzKSkge1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IubGltaXRJbnB1dFBpeGVscyA9IGlucHV0T3B0aW9ucy5saW1pdElucHV0UGl4ZWxzXG4gICAgICAgICAgPyBNYXRoLnBvdygweDNGRkYsIDIpXG4gICAgICAgICAgOiAwO1xuICAgICAgfSBlbHNlIGlmIChpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5saW1pdElucHV0UGl4ZWxzKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5saW1pdElucHV0UGl4ZWxzLCAwLCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmxpbWl0SW5wdXRQaXhlbHMgPSBpbnB1dE9wdGlvbnMubGltaXRJbnB1dFBpeGVscztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbGltaXRJbnB1dFBpeGVscycsICdwb3NpdGl2ZSBpbnRlZ2VyJywgaW5wdXRPcHRpb25zLmxpbWl0SW5wdXRQaXhlbHMpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB1bmxpbWl0ZWRcbiAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMudW5saW1pdGVkKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLnVubGltaXRlZCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnVubGltaXRlZCA9IGlucHV0T3B0aW9ucy51bmxpbWl0ZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3VubGltaXRlZCcsICdib29sZWFuJywgaW5wdXRPcHRpb25zLnVubGltaXRlZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHNlcXVlbnRpYWxSZWFkXG4gICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnNlcXVlbnRpYWxSZWFkKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLnNlcXVlbnRpYWxSZWFkKSkge1xuICAgICAgICBpbnB1dERlc2NyaXB0b3Iuc2VxdWVudGlhbFJlYWQgPSBpbnB1dE9wdGlvbnMuc2VxdWVudGlhbFJlYWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3NlcXVlbnRpYWxSZWFkJywgJ2Jvb2xlYW4nLCBpbnB1dE9wdGlvbnMuc2VxdWVudGlhbFJlYWQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBSYXcgcGl4ZWwgaW5wdXRcbiAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMucmF3KSkge1xuICAgICAgaWYgKFxuICAgICAgICBpcy5vYmplY3QoaW5wdXRPcHRpb25zLnJhdykgJiZcbiAgICAgICAgaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMucmF3LndpZHRoKSAmJiBpbnB1dE9wdGlvbnMucmF3LndpZHRoID4gMCAmJlxuICAgICAgICBpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5yYXcuaGVpZ2h0KSAmJiBpbnB1dE9wdGlvbnMucmF3LmhlaWdodCA+IDAgJiZcbiAgICAgICAgaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMucmF3LmNoYW5uZWxzKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5yYXcuY2hhbm5lbHMsIDEsIDQpXG4gICAgICApIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnJhd1dpZHRoID0gaW5wdXRPcHRpb25zLnJhdy53aWR0aDtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnJhd0hlaWdodCA9IGlucHV0T3B0aW9ucy5yYXcuaGVpZ2h0O1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IucmF3Q2hhbm5lbHMgPSBpbnB1dE9wdGlvbnMucmF3LmNoYW5uZWxzO1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IucmF3UHJlbXVsdGlwbGllZCA9ICEhaW5wdXRPcHRpb25zLnJhdy5wcmVtdWx0aXBsaWVkO1xuXG4gICAgICAgIHN3aXRjaCAoaW5wdXQuY29uc3RydWN0b3IpIHtcbiAgICAgICAgICBjYXNlIFVpbnQ4QXJyYXk6XG4gICAgICAgICAgY2FzZSBVaW50OENsYW1wZWRBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICd1Y2hhcic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEludDhBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICdjaGFyJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgVWludDE2QXJyYXk6XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IucmF3RGVwdGggPSAndXNob3J0JztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgSW50MTZBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICdzaG9ydCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFVpbnQzMkFycmF5OlxuICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLnJhd0RlcHRoID0gJ3VpbnQnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBJbnQzMkFycmF5OlxuICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLnJhd0RlcHRoID0gJ2ludCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEZsb2F0MzJBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICdmbG9hdCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIEZsb2F0NjRBcnJheTpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICdkb3VibGUnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5yYXdEZXB0aCA9ICd1Y2hhcic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB3aWR0aCwgaGVpZ2h0IGFuZCBjaGFubmVscyBmb3IgcmF3IHBpeGVsIGlucHV0Jyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIE11bHRpLXBhZ2UgaW5wdXQgKEdJRiwgVElGRiwgUERGKVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5hbmltYXRlZCkpIHtcbiAgICAgIGlmIChpcy5ib29sKGlucHV0T3B0aW9ucy5hbmltYXRlZCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnBhZ2VzID0gaW5wdXRPcHRpb25zLmFuaW1hdGVkID8gLTEgOiAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhbmltYXRlZCcsICdib29sZWFuJywgaW5wdXRPcHRpb25zLmFuaW1hdGVkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnBhZ2VzKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIoaW5wdXRPcHRpb25zLnBhZ2VzKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5wYWdlcywgLTEsIDEwMDAwMCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnBhZ2VzID0gaW5wdXRPcHRpb25zLnBhZ2VzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdwYWdlcycsICdpbnRlZ2VyIGJldHdlZW4gLTEgYW5kIDEwMDAwMCcsIGlucHV0T3B0aW9ucy5wYWdlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5wYWdlKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIoaW5wdXRPcHRpb25zLnBhZ2UpICYmIGlzLmluUmFuZ2UoaW5wdXRPcHRpb25zLnBhZ2UsIDAsIDEwMDAwMCkpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLnBhZ2UgPSBpbnB1dE9wdGlvbnMucGFnZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncGFnZScsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMTAwMDAwJywgaW5wdXRPcHRpb25zLnBhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBNdWx0aS1sZXZlbCBpbnB1dCAoT3BlblNsaWRlKVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5sZXZlbCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5sZXZlbCkgJiYgaXMuaW5SYW5nZShpbnB1dE9wdGlvbnMubGV2ZWwsIDAsIDI1NikpIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmxldmVsID0gaW5wdXRPcHRpb25zLmxldmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdsZXZlbCcsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU2JywgaW5wdXRPcHRpb25zLmxldmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gU3ViIEltYWdlIEZpbGUgRGlyZWN0b3J5IChUSUZGKVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5zdWJpZmQpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMuc3ViaWZkKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5zdWJpZmQsIC0xLCAxMDAwMDApKSB7XG4gICAgICAgIGlucHV0RGVzY3JpcHRvci5zdWJpZmQgPSBpbnB1dE9wdGlvbnMuc3ViaWZkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdzdWJpZmQnLCAnaW50ZWdlciBiZXR3ZWVuIC0xIGFuZCAxMDAwMDAnLCBpbnB1dE9wdGlvbnMuc3ViaWZkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ3JlYXRlIG5ldyBpbWFnZVxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy5jcmVhdGUpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGlzLm9iamVjdChpbnB1dE9wdGlvbnMuY3JlYXRlKSAmJlxuICAgICAgICBpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5jcmVhdGUud2lkdGgpICYmIGlucHV0T3B0aW9ucy5jcmVhdGUud2lkdGggPiAwICYmXG4gICAgICAgIGlzLmludGVnZXIoaW5wdXRPcHRpb25zLmNyZWF0ZS5oZWlnaHQpICYmIGlucHV0T3B0aW9ucy5jcmVhdGUuaGVpZ2h0ID4gMCAmJlxuICAgICAgICBpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy5jcmVhdGUuY2hhbm5lbHMpXG4gICAgICApIHtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmNyZWF0ZVdpZHRoID0gaW5wdXRPcHRpb25zLmNyZWF0ZS53aWR0aDtcbiAgICAgICAgaW5wdXREZXNjcmlwdG9yLmNyZWF0ZUhlaWdodCA9IGlucHV0T3B0aW9ucy5jcmVhdGUuaGVpZ2h0O1xuICAgICAgICBpbnB1dERlc2NyaXB0b3IuY3JlYXRlQ2hhbm5lbHMgPSBpbnB1dE9wdGlvbnMuY3JlYXRlLmNoYW5uZWxzO1xuICAgICAgICAvLyBOb2lzZVxuICAgICAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlKSkge1xuICAgICAgICAgIGlmICghaXMub2JqZWN0KGlucHV0T3B0aW9ucy5jcmVhdGUubm9pc2UpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIG5vaXNlIHRvIGJlIGFuIG9iamVjdCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzLmluQXJyYXkoaW5wdXRPcHRpb25zLmNyZWF0ZS5ub2lzZS50eXBlLCBbJ2dhdXNzaWFuJ10pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgZ2F1c3NpYW4gbm9pc2UgaXMgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpcy5pblJhbmdlKGlucHV0T3B0aW9ucy5jcmVhdGUuY2hhbm5lbHMsIDEsIDQpKSB7XG4gICAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NyZWF0ZS5jaGFubmVscycsICdudW1iZXIgYmV0d2VlbiAxIGFuZCA0JywgaW5wdXRPcHRpb25zLmNyZWF0ZS5jaGFubmVscyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5jcmVhdGVOb2lzZVR5cGUgPSBpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlLnR5cGU7XG4gICAgICAgICAgaWYgKGlzLm51bWJlcihpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlLm1lYW4pICYmIGlzLmluUmFuZ2UoaW5wdXRPcHRpb25zLmNyZWF0ZS5ub2lzZS5tZWFuLCAwLCAxMDAwMCkpIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci5jcmVhdGVOb2lzZU1lYW4gPSBpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlLm1lYW47XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY3JlYXRlLm5vaXNlLm1lYW4nLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwMDAnLCBpbnB1dE9wdGlvbnMuY3JlYXRlLm5vaXNlLm1lYW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXMubnVtYmVyKGlucHV0T3B0aW9ucy5jcmVhdGUubm9pc2Uuc2lnbWEpICYmIGlzLmluUmFuZ2UoaW5wdXRPcHRpb25zLmNyZWF0ZS5ub2lzZS5zaWdtYSwgMCwgMTAwMDApKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IuY3JlYXRlTm9pc2VTaWdtYSA9IGlucHV0T3B0aW9ucy5jcmVhdGUubm9pc2Uuc2lnbWE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY3JlYXRlLm5vaXNlLnNpZ21hJywgJ251bWJlciBiZXR3ZWVuIDAgYW5kIDEwMDAwJywgaW5wdXRPcHRpb25zLmNyZWF0ZS5ub2lzZS5zaWdtYSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLmNyZWF0ZS5iYWNrZ3JvdW5kKSkge1xuICAgICAgICAgIGlmICghaXMuaW5SYW5nZShpbnB1dE9wdGlvbnMuY3JlYXRlLmNoYW5uZWxzLCAzLCA0KSkge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdjcmVhdGUuY2hhbm5lbHMnLCAnbnVtYmVyIGJldHdlZW4gMyBhbmQgNCcsIGlucHV0T3B0aW9ucy5jcmVhdGUuY2hhbm5lbHMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kID0gY29sb3IoaW5wdXRPcHRpb25zLmNyZWF0ZS5iYWNrZ3JvdW5kKTtcbiAgICAgICAgICBpbnB1dERlc2NyaXB0b3IuY3JlYXRlQmFja2dyb3VuZCA9IFtcbiAgICAgICAgICAgIGJhY2tncm91bmQucmVkKCksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLmdyZWVuKCksXG4gICAgICAgICAgICBiYWNrZ3JvdW5kLmJsdWUoKSxcbiAgICAgICAgICAgIE1hdGgucm91bmQoYmFja2dyb3VuZC5hbHBoYSgpICogMjU1KVxuICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB2YWxpZCBub2lzZSBvciBiYWNrZ3JvdW5kIHRvIGNyZWF0ZSBhIG5ldyBpbnB1dCBpbWFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSBpbnB1dERlc2NyaXB0b3IuYnVmZmVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB2YWxpZCB3aWR0aCwgaGVpZ2h0IGFuZCBjaGFubmVscyB0byBjcmVhdGUgYSBuZXcgaW5wdXQgaW1hZ2UnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgbmV3IGltYWdlIHdpdGggdGV4dFxuICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0KSkge1xuICAgICAgaWYgKGlzLm9iamVjdChpbnB1dE9wdGlvbnMudGV4dCkgJiYgaXMuc3RyaW5nKGlucHV0T3B0aW9ucy50ZXh0LnRleHQpKSB7XG4gICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0VmFsdWUgPSBpbnB1dE9wdGlvbnMudGV4dC50ZXh0O1xuICAgICAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMudGV4dC5oZWlnaHQpICYmIGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnRleHQuZHBpKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgb25seSBvbmUgb2YgZHBpIG9yIGhlaWdodCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LmZvbnQpKSB7XG4gICAgICAgICAgaWYgKGlzLnN0cmluZyhpbnB1dE9wdGlvbnMudGV4dC5mb250KSkge1xuICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLnRleHRGb250ID0gaW5wdXRPcHRpb25zLnRleHQuZm9udDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0ZXh0LmZvbnQnLCAnc3RyaW5nJywgaW5wdXRPcHRpb25zLnRleHQuZm9udCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LmZvbnRmaWxlKSkge1xuICAgICAgICAgIGlmIChpcy5zdHJpbmcoaW5wdXRPcHRpb25zLnRleHQuZm9udGZpbGUpKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IudGV4dEZvbnRmaWxlID0gaW5wdXRPcHRpb25zLnRleHQuZm9udGZpbGU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGV4dC5mb250ZmlsZScsICdzdHJpbmcnLCBpbnB1dE9wdGlvbnMudGV4dC5mb250ZmlsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LndpZHRoKSkge1xuICAgICAgICAgIGlmIChpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy50ZXh0LndpZHRoKSAmJiBpbnB1dE9wdGlvbnMudGV4dC53aWR0aCA+IDApIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0V2lkdGggPSBpbnB1dE9wdGlvbnMudGV4dC53aWR0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0ZXh0LndpZHRoJywgJ3Bvc2l0aXZlIGludGVnZXInLCBpbnB1dE9wdGlvbnMudGV4dC53aWR0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LmhlaWdodCkpIHtcbiAgICAgICAgICBpZiAoaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMudGV4dC5oZWlnaHQpICYmIGlucHV0T3B0aW9ucy50ZXh0LmhlaWdodCA+IDApIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0SGVpZ2h0ID0gaW5wdXRPcHRpb25zLnRleHQuaGVpZ2h0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3RleHQuaGVpZ2h0JywgJ3Bvc2l0aXZlIGludGVnZXInLCBpbnB1dE9wdGlvbnMudGV4dC5oZWlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMudGV4dC5hbGlnbikpIHtcbiAgICAgICAgICBpZiAoaXMuc3RyaW5nKGlucHV0T3B0aW9ucy50ZXh0LmFsaWduKSAmJiBpcy5zdHJpbmcodGhpcy5jb25zdHJ1Y3Rvci5hbGlnbltpbnB1dE9wdGlvbnMudGV4dC5hbGlnbl0pKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IudGV4dEFsaWduID0gdGhpcy5jb25zdHJ1Y3Rvci5hbGlnbltpbnB1dE9wdGlvbnMudGV4dC5hbGlnbl07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGV4dC5hbGlnbicsICd2YWxpZCBhbGlnbm1lbnQnLCBpbnB1dE9wdGlvbnMudGV4dC5hbGlnbik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0Lmp1c3RpZnkpKSB7XG4gICAgICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLnRleHQuanVzdGlmeSkpIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0SnVzdGlmeSA9IGlucHV0T3B0aW9ucy50ZXh0Lmp1c3RpZnk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGV4dC5qdXN0aWZ5JywgJ2Jvb2xlYW4nLCBpbnB1dE9wdGlvbnMudGV4dC5qdXN0aWZ5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnRleHQuZHBpKSkge1xuICAgICAgICAgIGlmIChpcy5pbnRlZ2VyKGlucHV0T3B0aW9ucy50ZXh0LmRwaSkgJiYgaXMuaW5SYW5nZShpbnB1dE9wdGlvbnMudGV4dC5kcGksIDEsIDEwMDAwMDApKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IudGV4dERwaSA9IGlucHV0T3B0aW9ucy50ZXh0LmRwaTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0ZXh0LmRwaScsICdpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwMDAwMCcsIGlucHV0T3B0aW9ucy50ZXh0LmRwaSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LnJnYmEpKSB7XG4gICAgICAgICAgaWYgKGlzLmJvb2woaW5wdXRPcHRpb25zLnRleHQucmdiYSkpIHtcbiAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci50ZXh0UmdiYSA9IGlucHV0T3B0aW9ucy50ZXh0LnJnYmE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGV4dC5yZ2JhJywgJ2Jvb2wnLCBpbnB1dE9wdGlvbnMudGV4dC5yZ2JhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzLmRlZmluZWQoaW5wdXRPcHRpb25zLnRleHQuc3BhY2luZykpIHtcbiAgICAgICAgICBpZiAoaXMuaW50ZWdlcihpbnB1dE9wdGlvbnMudGV4dC5zcGFjaW5nKSAmJiBpcy5pblJhbmdlKGlucHV0T3B0aW9ucy50ZXh0LnNwYWNpbmcsIC0xMDAwMDAwLCAxMDAwMDAwKSkge1xuICAgICAgICAgICAgaW5wdXREZXNjcmlwdG9yLnRleHRTcGFjaW5nID0gaW5wdXRPcHRpb25zLnRleHQuc3BhY2luZztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0ZXh0LnNwYWNpbmcnLCAnaW50ZWdlciBiZXR3ZWVuIC0xMDAwMDAwIGFuZCAxMDAwMDAwJywgaW5wdXRPcHRpb25zLnRleHQuc3BhY2luZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpcy5kZWZpbmVkKGlucHV0T3B0aW9ucy50ZXh0LndyYXApKSB7XG4gICAgICAgICAgaWYgKGlzLnN0cmluZyhpbnB1dE9wdGlvbnMudGV4dC53cmFwKSAmJiBpcy5pbkFycmF5KGlucHV0T3B0aW9ucy50ZXh0LndyYXAsIFsnd29yZCcsICdjaGFyJywgJ3dvcmQtY2hhcicsICdub25lJ10pKSB7XG4gICAgICAgICAgICBpbnB1dERlc2NyaXB0b3IudGV4dFdyYXAgPSBpbnB1dE9wdGlvbnMudGV4dC53cmFwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3RleHQud3JhcCcsICdvbmUgb2Y6IHdvcmQsIGNoYXIsIHdvcmQtY2hhciwgbm9uZScsIGlucHV0T3B0aW9ucy50ZXh0LndyYXApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkZWxldGUgaW5wdXREZXNjcmlwdG9yLmJ1ZmZlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgYSB2YWxpZCBzdHJpbmcgdG8gY3JlYXRlIGFuIGltYWdlIHdpdGggdGV4dC4nKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXMuZGVmaW5lZChpbnB1dE9wdGlvbnMpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IG9wdGlvbnMgJyArIGlucHV0T3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0RGVzY3JpcHRvcjtcbn1cblxuLyoqXG4gKiBIYW5kbGUgaW5jb21pbmcgQnVmZmVyIGNodW5rIG9uIFdyaXRhYmxlIFN0cmVhbS5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0J1ZmZlcn0gY2h1bmtcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZyAtIHVudXNlZFxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAqL1xuZnVuY3Rpb24gX3dyaXRlIChjaHVuaywgZW5jb2RpbmcsIGNhbGxiYWNrKSB7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gIGlmIChBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXIpKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoaXMuYnVmZmVyKGNodW5rKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgICB0aGlzLnN0cmVhbUluRmluaXNoZWQgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXIucHVzaChjaHVuayk7XG4gICAgICBjYWxsYmFjaygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYWxsYmFjayhuZXcgRXJyb3IoJ05vbi1CdWZmZXIgZGF0YSBvbiBXcml0YWJsZSBTdHJlYW0nKSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKG5ldyBFcnJvcignVW5leHBlY3RlZCBkYXRhIG9uIFdyaXRhYmxlIFN0cmVhbScpKTtcbiAgfVxufVxuXG4vKipcbiAqIEZsYXR0ZW5zIHRoZSBhcnJheSBvZiBjaHVua3MgYWNjdW11bGF0ZWQgaW4gaW5wdXQuYnVmZmVyLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX2ZsYXR0ZW5CdWZmZXJJbiAoKSB7XG4gIGlmICh0aGlzLl9pc1N0cmVhbUlucHV0KCkpIHtcbiAgICB0aGlzLm9wdGlvbnMuaW5wdXQuYnVmZmVyID0gQnVmZmVyLmNvbmNhdCh0aGlzLm9wdGlvbnMuaW5wdXQuYnVmZmVyKTtcbiAgfVxufVxuXG4vKipcbiAqIEFyZSB3ZSBleHBlY3RpbmcgU3RyZWFtLWJhc2VkIGlucHV0P1xuICogQHByaXZhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBfaXNTdHJlYW1JbnB1dCAoKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHRoaXMub3B0aW9ucy5pbnB1dC5idWZmZXIpO1xufVxuXG4vKipcbiAqIEZhc3QgYWNjZXNzIHRvICh1bmNhY2hlZCkgaW1hZ2UgbWV0YWRhdGEgd2l0aG91dCBkZWNvZGluZyBhbnkgY29tcHJlc3NlZCBwaXhlbCBkYXRhLlxuICpcbiAqIFRoaXMgaXMgcmVhZCBmcm9tIHRoZSBoZWFkZXIgb2YgdGhlIGlucHV0IGltYWdlLlxuICogSXQgZG9lcyBub3QgdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gYW55IG9wZXJhdGlvbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgb3V0cHV0IGltYWdlLFxuICogc3VjaCBhcyByZXNpemUgb3Igcm90YXRlLlxuICpcbiAqIERpbWVuc2lvbnMgaW4gdGhlIHJlc3BvbnNlIHdpbGwgcmVzcGVjdCB0aGUgYHBhZ2VgIGFuZCBgcGFnZXNgIHByb3BlcnRpZXMgb2YgdGhlXG4gKiB7QGxpbmsgL2FwaS1jb25zdHJ1Y3RvciNwYXJhbWV0ZXJzfGNvbnN0cnVjdG9yIHBhcmFtZXRlcnN9LlxuICpcbiAqIEEgYFByb21pc2VgIGlzIHJldHVybmVkIHdoZW4gYGNhbGxiYWNrYCBpcyBub3QgcHJvdmlkZWQuXG4gKlxuICogLSBgZm9ybWF0YDogTmFtZSBvZiBkZWNvZGVyIHVzZWQgdG8gZGVjb21wcmVzcyBpbWFnZSBkYXRhIGUuZy4gYGpwZWdgLCBgcG5nYCwgYHdlYnBgLCBgZ2lmYCwgYHN2Z2BcbiAqIC0gYHNpemVgOiBUb3RhbCBzaXplIG9mIGltYWdlIGluIGJ5dGVzLCBmb3IgU3RyZWFtIGFuZCBCdWZmZXIgaW5wdXQgb25seVxuICogLSBgd2lkdGhgOiBOdW1iZXIgb2YgcGl4ZWxzIHdpZGUgKEVYSUYgb3JpZW50YXRpb24gaXMgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiwgc2VlIGV4YW1wbGUgYmVsb3cpXG4gKiAtIGBoZWlnaHRgOiBOdW1iZXIgb2YgcGl4ZWxzIGhpZ2ggKEVYSUYgb3JpZW50YXRpb24gaXMgbm90IHRha2VuIGludG8gY29uc2lkZXJhdGlvbiwgc2VlIGV4YW1wbGUgYmVsb3cpXG4gKiAtIGBzcGFjZWA6IE5hbWUgb2YgY29sb3VyIHNwYWNlIGludGVycHJldGF0aW9uIGUuZy4gYHNyZ2JgLCBgcmdiYCwgYGNteWtgLCBgbGFiYCwgYGItd2AgWy4uLl0oaHR0cHM6Ly93d3cubGlidmlwcy5vcmcvQVBJL2N1cnJlbnQvVmlwc0ltYWdlLmh0bWwjVmlwc0ludGVycHJldGF0aW9uKVxuICogLSBgY2hhbm5lbHNgOiBOdW1iZXIgb2YgYmFuZHMgZS5nLiBgM2AgZm9yIHNSR0IsIGA0YCBmb3IgQ01ZS1xuICogLSBgZGVwdGhgOiBOYW1lIG9mIHBpeGVsIGRlcHRoIGZvcm1hdCBlLmcuIGB1Y2hhcmAsIGBjaGFyYCwgYHVzaG9ydGAsIGBmbG9hdGAgWy4uLl0oaHR0cHM6Ly93d3cubGlidmlwcy5vcmcvQVBJL2N1cnJlbnQvVmlwc0ltYWdlLmh0bWwjVmlwc0JhbmRGb3JtYXQpXG4gKiAtIGBkZW5zaXR5YDogTnVtYmVyIG9mIHBpeGVscyBwZXIgaW5jaCAoRFBJKSwgaWYgcHJlc2VudFxuICogLSBgY2hyb21hU3Vic2FtcGxpbmdgOiBTdHJpbmcgY29udGFpbmluZyBKUEVHIGNocm9tYSBzdWJzYW1wbGluZywgYDQ6MjowYCBvciBgNDo0OjRgIGZvciBSR0IsIGA0OjI6MDo0YCBvciBgNDo0OjQ6NGAgZm9yIENNWUtcbiAqIC0gYGlzUHJvZ3Jlc3NpdmVgOiBCb29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgaW1hZ2UgaXMgaW50ZXJsYWNlZCB1c2luZyBhIHByb2dyZXNzaXZlIHNjYW5cbiAqIC0gYHBhZ2VzYDogTnVtYmVyIG9mIHBhZ2VzL2ZyYW1lcyBjb250YWluZWQgd2l0aGluIHRoZSBpbWFnZSwgd2l0aCBzdXBwb3J0IGZvciBUSUZGLCBIRUlGLCBQREYsIGFuaW1hdGVkIEdJRiBhbmQgYW5pbWF0ZWQgV2ViUFxuICogLSBgcGFnZUhlaWdodGA6IE51bWJlciBvZiBwaXhlbHMgaGlnaCBlYWNoIHBhZ2UgaW4gYSBtdWx0aS1wYWdlIGltYWdlIHdpbGwgYmUuXG4gKiAtIGBwYWxldHRlQml0RGVwdGhgOiBCaXQgZGVwdGggb2YgcGFsZXR0ZS1iYXNlZCBpbWFnZSAoR0lGLCBQTkcpLlxuICogLSBgbG9vcGA6IE51bWJlciBvZiB0aW1lcyB0byBsb29wIGFuIGFuaW1hdGVkIGltYWdlLCB6ZXJvIHJlZmVycyB0byBhIGNvbnRpbnVvdXMgbG9vcC5cbiAqIC0gYGRlbGF5YDogRGVsYXkgaW4gbXMgYmV0d2VlbiBlYWNoIHBhZ2UgaW4gYW4gYW5pbWF0ZWQgaW1hZ2UsIHByb3ZpZGVkIGFzIGFuIGFycmF5IG9mIGludGVnZXJzLlxuICogLSBgcGFnZVByaW1hcnlgOiBOdW1iZXIgb2YgdGhlIHByaW1hcnkgcGFnZSBpbiBhIEhFSUYgaW1hZ2VcbiAqIC0gYGxldmVsc2A6IERldGFpbHMgb2YgZWFjaCBsZXZlbCBpbiBhIG11bHRpLWxldmVsIGltYWdlIHByb3ZpZGVkIGFzIGFuIGFycmF5IG9mIG9iamVjdHMsIHJlcXVpcmVzIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBPcGVuU2xpZGVcbiAqIC0gYHN1YmlmZHNgOiBOdW1iZXIgb2YgU3ViIEltYWdlIEZpbGUgRGlyZWN0b3JpZXMgaW4gYW4gT01FLVRJRkYgaW1hZ2VcbiAqIC0gYGJhY2tncm91bmRgOiBEZWZhdWx0IGJhY2tncm91bmQgY29sb3VyLCBpZiBwcmVzZW50LCBmb3IgUE5HIChiS0dEKSBhbmQgR0lGIGltYWdlcywgZWl0aGVyIGFuIFJHQiBPYmplY3Qgb3IgYSBzaW5nbGUgZ3JleXNjYWxlIHZhbHVlXG4gKiAtIGBjb21wcmVzc2lvbmA6IFRoZSBlbmNvZGVyIHVzZWQgdG8gY29tcHJlc3MgYW4gSEVJRiBmaWxlLCBgYXYxYCAoQVZJRikgb3IgYGhldmNgIChIRUlDKVxuICogLSBgcmVzb2x1dGlvblVuaXRgOiBUaGUgdW5pdCBvZiByZXNvbHV0aW9uIChkZW5zaXR5KSwgZWl0aGVyIGBpbmNoYCBvciBgY21gLCBpZiBwcmVzZW50XG4gKiAtIGBoYXNQcm9maWxlYDogQm9vbGVhbiBpbmRpY2F0aW5nIHRoZSBwcmVzZW5jZSBvZiBhbiBlbWJlZGRlZCBJQ0MgcHJvZmlsZVxuICogLSBgaGFzQWxwaGFgOiBCb29sZWFuIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIGFuIGFscGhhIHRyYW5zcGFyZW5jeSBjaGFubmVsXG4gKiAtIGBvcmllbnRhdGlvbmA6IE51bWJlciB2YWx1ZSBvZiB0aGUgRVhJRiBPcmllbnRhdGlvbiBoZWFkZXIsIGlmIHByZXNlbnRcbiAqIC0gYGV4aWZgOiBCdWZmZXIgY29udGFpbmluZyByYXcgRVhJRiBkYXRhLCBpZiBwcmVzZW50XG4gKiAtIGBpY2NgOiBCdWZmZXIgY29udGFpbmluZyByYXcgW0lDQ10oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvaWNjKSBwcm9maWxlIGRhdGEsIGlmIHByZXNlbnRcbiAqIC0gYGlwdGNgOiBCdWZmZXIgY29udGFpbmluZyByYXcgSVBUQyBkYXRhLCBpZiBwcmVzZW50XG4gKiAtIGB4bXBgOiBCdWZmZXIgY29udGFpbmluZyByYXcgWE1QIGRhdGEsIGlmIHByZXNlbnRcbiAqIC0gYHRpZmZ0YWdQaG90b3Nob3BgOiBCdWZmZXIgY29udGFpbmluZyByYXcgVElGRlRBR19QSE9UT1NIT1AgZGF0YSwgaWYgcHJlc2VudFxuICogLSBgZm9ybWF0TWFnaWNrYDogU3RyaW5nIGNvbnRhaW5pbmcgZm9ybWF0IGZvciBpbWFnZXMgbG9hZGVkIHZpYSAqbWFnaWNrXG4gKiAtIGBjb21tZW50c2A6IEFycmF5IG9mIGtleXdvcmQvdGV4dCBwYWlycyByZXByZXNlbnRpbmcgUE5HIHRleHQgYmxvY2tzLCBpZiBwcmVzZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBtZXRhZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KS5tZXRhZGF0YSgpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBpbWFnZSA9IHNoYXJwKGlucHV0SnBnKTtcbiAqIGltYWdlXG4gKiAgIC5tZXRhZGF0YSgpXG4gKiAgIC50aGVuKGZ1bmN0aW9uKG1ldGFkYXRhKSB7XG4gKiAgICAgcmV0dXJuIGltYWdlXG4gKiAgICAgICAucmVzaXplKE1hdGgucm91bmQobWV0YWRhdGEud2lkdGggLyAyKSlcbiAqICAgICAgIC53ZWJwKClcbiAqICAgICAgIC50b0J1ZmZlcigpO1xuICogICB9KVxuICogICAudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gKiAgICAgLy8gZGF0YSBjb250YWlucyBhIFdlYlAgaW1hZ2UgaGFsZiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgb3JpZ2luYWwgSlBFR1xuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzZWQgb24gRVhJRiByb3RhdGlvbiBtZXRhZGF0YSwgZ2V0IHRoZSByaWdodC1zaWRlLXVwIHdpZHRoIGFuZCBoZWlnaHQ6XG4gKlxuICogY29uc3Qgc2l6ZSA9IGdldE5vcm1hbFNpemUoYXdhaXQgc2hhcnAoaW5wdXQpLm1ldGFkYXRhKCkpO1xuICpcbiAqIGZ1bmN0aW9uIGdldE5vcm1hbFNpemUoeyB3aWR0aCwgaGVpZ2h0LCBvcmllbnRhdGlvbiB9KSB7XG4gKiAgIHJldHVybiAob3JpZW50YXRpb24gfHwgMCkgPj0gNVxuICogICAgID8geyB3aWR0aDogaGVpZ2h0LCBoZWlnaHQ6IHdpZHRoIH1cbiAqICAgICA6IHsgd2lkdGgsIGhlaWdodCB9O1xuICogfVxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtjYWxsYmFja10gLSBjYWxsZWQgd2l0aCB0aGUgYXJndW1lbnRzIGAoZXJyLCBtZXRhZGF0YSlgXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fFNoYXJwfVxuICovXG5mdW5jdGlvbiBtZXRhZGF0YSAoY2FsbGJhY2spIHtcbiAgY29uc3Qgc3RhY2sgPSBFcnJvcigpO1xuICBpZiAoaXMuZm4oY2FsbGJhY2spKSB7XG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgdGhpcy5vbignZmluaXNoJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9mbGF0dGVuQnVmZmVySW4oKTtcbiAgICAgICAgc2hhcnAubWV0YWRhdGEodGhpcy5vcHRpb25zLCAoZXJyLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgbWV0YWRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2hhcnAubWV0YWRhdGEodGhpcy5vcHRpb25zLCAoZXJyLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgY2FsbGJhY2soaXMubmF0aXZlRXJyb3IoZXJyLCBzdGFjaykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrKG51bGwsIG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIGlmICh0aGlzLl9pc1N0cmVhbUlucHV0KCkpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbmlzaGVkID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2ZsYXR0ZW5CdWZmZXJJbigpO1xuICAgICAgICAgIHNoYXJwLm1ldGFkYXRhKHRoaXMub3B0aW9ucywgKGVyciwgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUobWV0YWRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy53cml0YWJsZUZpbmlzaGVkKSB7XG4gICAgICAgICAgZmluaXNoZWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uY2UoJ2ZpbmlzaCcsIGZpbmlzaGVkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNoYXJwLm1ldGFkYXRhKHRoaXMub3B0aW9ucywgKGVyciwgbWV0YWRhdGEpID0+IHtcbiAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZWplY3QoaXMubmF0aXZlRXJyb3IoZXJyLCBzdGFjaykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKG1ldGFkYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjZXNzIHRvIHBpeGVsLWRlcml2ZWQgaW1hZ2Ugc3RhdGlzdGljcyBmb3IgZXZlcnkgY2hhbm5lbCBpbiB0aGUgaW1hZ2UuXG4gKiBBIGBQcm9taXNlYCBpcyByZXR1cm5lZCB3aGVuIGBjYWxsYmFja2AgaXMgbm90IHByb3ZpZGVkLlxuICpcbiAqIC0gYGNoYW5uZWxzYDogQXJyYXkgb2YgY2hhbm5lbCBzdGF0aXN0aWNzIGZvciBlYWNoIGNoYW5uZWwgaW4gdGhlIGltYWdlLiBFYWNoIGNoYW5uZWwgc3RhdGlzdGljIGNvbnRhaW5zXG4gKiAgICAgLSBgbWluYCAobWluaW11bSB2YWx1ZSBpbiB0aGUgY2hhbm5lbClcbiAqICAgICAtIGBtYXhgIChtYXhpbXVtIHZhbHVlIGluIHRoZSBjaGFubmVsKVxuICogICAgIC0gYHN1bWAgKHN1bSBvZiBhbGwgdmFsdWVzIGluIGEgY2hhbm5lbClcbiAqICAgICAtIGBzcXVhcmVzU3VtYCAoc3VtIG9mIHNxdWFyZWQgdmFsdWVzIGluIGEgY2hhbm5lbClcbiAqICAgICAtIGBtZWFuYCAobWVhbiBvZiB0aGUgdmFsdWVzIGluIGEgY2hhbm5lbClcbiAqICAgICAtIGBzdGRldmAgKHN0YW5kYXJkIGRldmlhdGlvbiBmb3IgdGhlIHZhbHVlcyBpbiBhIGNoYW5uZWwpXG4gKiAgICAgLSBgbWluWGAgKHgtY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBpeGVsIHdoZXJlIHRoZSBtaW5pbXVtIGxpZXMpXG4gKiAgICAgLSBgbWluWWAgKHktY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBpeGVsIHdoZXJlIHRoZSBtaW5pbXVtIGxpZXMpXG4gKiAgICAgLSBgbWF4WGAgKHgtY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBpeGVsIHdoZXJlIHRoZSBtYXhpbXVtIGxpZXMpXG4gKiAgICAgLSBgbWF4WWAgKHktY29vcmRpbmF0ZSBvZiBvbmUgb2YgdGhlIHBpeGVsIHdoZXJlIHRoZSBtYXhpbXVtIGxpZXMpXG4gKiAtIGBpc09wYXF1ZWA6IElzIHRoZSBpbWFnZSBmdWxseSBvcGFxdWU/IFdpbGwgYmUgYHRydWVgIGlmIHRoZSBpbWFnZSBoYXMgbm8gYWxwaGEgY2hhbm5lbCBvciBpZiBldmVyeSBwaXhlbCBpcyBmdWxseSBvcGFxdWUuXG4gKiAtIGBlbnRyb3B5YDogSGlzdG9ncmFtLWJhc2VkIGVzdGltYXRpb24gb2YgZ3JleXNjYWxlIGVudHJvcHksIGRpc2NhcmRpbmcgYWxwaGEgY2hhbm5lbCBpZiBhbnkuXG4gKiAtIGBzaGFycG5lc3NgOiBFc3RpbWF0aW9uIG9mIGdyZXlzY2FsZSBzaGFycG5lc3MgYmFzZWQgb24gdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBhIExhcGxhY2lhbiBjb252b2x1dGlvbiwgZGlzY2FyZGluZyBhbHBoYSBjaGFubmVsIGlmIGFueS5cbiAqIC0gYGRvbWluYW50YDogT2JqZWN0IGNvbnRhaW5pbmcgbW9zdCBkb21pbmFudCBzUkdCIGNvbG91ciBiYXNlZCBvbiBhIDQwOTYtYmluIDNEIGhpc3RvZ3JhbS5cbiAqXG4gKiAqKk5vdGUqKjogU3RhdGlzdGljcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCBpbWFnZS4gQW55IG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBpbWFnZSBtdXN0IGZpcnN0IGJlXG4gKiB3cml0dGVuIHRvIGEgYnVmZmVyIGluIG9yZGVyIHRvIHJ1biBgc3RhdHNgIG9uIHRoZSByZXN1bHQgKHNlZSB0aGlyZCBleGFtcGxlKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgaW1hZ2UgPSBzaGFycChpbnB1dEpwZyk7XG4gKiBpbWFnZVxuICogICAuc3RhdHMoKVxuICogICAudGhlbihmdW5jdGlvbihzdGF0cykge1xuICogICAgICAvLyBzdGF0cyBjb250YWlucyB0aGUgY2hhbm5lbC13aXNlIHN0YXRpc3RpY3MgYXJyYXkgYW5kIHRoZSBpc09wYXF1ZSB2YWx1ZVxuICogICB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgeyBlbnRyb3B5LCBzaGFycG5lc3MsIGRvbWluYW50IH0gPSBhd2FpdCBzaGFycChpbnB1dCkuc3RhdHMoKTtcbiAqIGNvbnN0IHsgciwgZywgYiB9ID0gZG9taW5hbnQ7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGltYWdlID0gc2hhcnAoaW5wdXQpO1xuICogLy8gc3RvcmUgaW50ZXJtZWRpYXRlIHJlc3VsdFxuICogY29uc3QgcGFydCA9IGF3YWl0IGltYWdlLmV4dHJhY3QocmVnaW9uKS50b0J1ZmZlcigpO1xuICogLy8gY3JlYXRlIG5ldyBpbnN0YW5jZSB0byBvYnRhaW4gc3RhdGlzdGljcyBvZiBleHRyYWN0ZWQgcmVnaW9uXG4gKiBjb25zdCBzdGF0cyA9IGF3YWl0IHNoYXJwKHBhcnQpLnN0YXRzKCk7XG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIGNhbGxlZCB3aXRoIHRoZSBhcmd1bWVudHMgYChlcnIsIHN0YXRzKWBcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59XG4gKi9cbmZ1bmN0aW9uIHN0YXRzIChjYWxsYmFjaykge1xuICBjb25zdCBzdGFjayA9IEVycm9yKCk7XG4gIGlmIChpcy5mbihjYWxsYmFjaykpIHtcbiAgICBpZiAodGhpcy5faXNTdHJlYW1JbnB1dCgpKSB7XG4gICAgICB0aGlzLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX2ZsYXR0ZW5CdWZmZXJJbigpO1xuICAgICAgICBzaGFycC5zdGF0cyh0aGlzLm9wdGlvbnMsIChlcnIsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgY2FsbGJhY2soaXMubmF0aXZlRXJyb3IoZXJyLCBzdGFjaykpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWxsYmFjayhudWxsLCBzdGF0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFycC5zdGF0cyh0aGlzLm9wdGlvbnMsIChlcnIsIHN0YXRzKSA9PiB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjYWxsYmFjayhpcy5uYXRpdmVFcnJvcihlcnIsIHN0YWNrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbGJhY2sobnVsbCwgc3RhdHMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5vbignZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRoaXMuX2ZsYXR0ZW5CdWZmZXJJbigpO1xuICAgICAgICAgIHNoYXJwLnN0YXRzKHRoaXMub3B0aW9ucywgKGVyciwgc3RhdHMpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoc3RhdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBzaGFycC5zdGF0cyh0aGlzLm9wdGlvbnMsIChlcnIsIHN0YXRzKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZShzdGF0cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIERlY29yYXRlIHRoZSBTaGFycCBwcm90b3R5cGUgd2l0aCBpbnB1dC1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFNoYXJwKSB7XG4gIE9iamVjdC5hc3NpZ24oU2hhcnAucHJvdG90eXBlLCB7XG4gICAgLy8gUHJpdmF0ZVxuICAgIF9pbnB1dE9wdGlvbnNGcm9tT2JqZWN0LFxuICAgIF9jcmVhdGVJbnB1dERlc2NyaXB0b3IsXG4gICAgX3dyaXRlLFxuICAgIF9mbGF0dGVuQnVmZmVySW4sXG4gICAgX2lzU3RyZWFtSW5wdXQsXG4gICAgLy8gUHVibGljXG4gICAgbWV0YWRhdGEsXG4gICAgc3RhdHNcbiAgfSk7XG4gIC8vIENsYXNzIGF0dHJpYnV0ZXNcbiAgU2hhcnAuYWxpZ24gPSBhbGlnbjtcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5cbi8qKlxuICogV2VpZ2h0aW5nIHRvIGFwcGx5IHdoZW4gdXNpbmcgY29udGFpbi9jb3ZlciBmaXQuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBncmF2aXR5ID0ge1xuICBjZW50ZXI6IDAsXG4gIGNlbnRyZTogMCxcbiAgbm9ydGg6IDEsXG4gIGVhc3Q6IDIsXG4gIHNvdXRoOiAzLFxuICB3ZXN0OiA0LFxuICBub3J0aGVhc3Q6IDUsXG4gIHNvdXRoZWFzdDogNixcbiAgc291dGh3ZXN0OiA3LFxuICBub3J0aHdlc3Q6IDhcbn07XG5cbi8qKlxuICogUG9zaXRpb24gdG8gYXBwbHkgd2hlbiB1c2luZyBjb250YWluL2NvdmVyIGZpdC5cbiAqIEBtZW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IHBvc2l0aW9uID0ge1xuICB0b3A6IDEsXG4gIHJpZ2h0OiAyLFxuICBib3R0b206IDMsXG4gIGxlZnQ6IDQsXG4gICdyaWdodCB0b3AnOiA1LFxuICAncmlnaHQgYm90dG9tJzogNixcbiAgJ2xlZnQgYm90dG9tJzogNyxcbiAgJ2xlZnQgdG9wJzogOFxufTtcblxuLyoqXG4gKiBIb3cgdG8gZXh0ZW5kIHRoZSBpbWFnZS5cbiAqIEBtZW1iZXJcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGV4dGVuZFdpdGggPSB7XG4gIGJhY2tncm91bmQ6ICdiYWNrZ3JvdW5kJyxcbiAgY29weTogJ2NvcHknLFxuICByZXBlYXQ6ICdyZXBlYXQnLFxuICBtaXJyb3I6ICdtaXJyb3InXG59O1xuXG4vKipcbiAqIFN0cmF0ZWdpZXMgZm9yIGF1dG9tYWdpYyBjb3ZlciBiZWhhdmlvdXIuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBzdHJhdGVneSA9IHtcbiAgZW50cm9weTogMTYsXG4gIGF0dGVudGlvbjogMTdcbn07XG5cbi8qKlxuICogUmVkdWN0aW9uIGtlcm5lbHMuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBrZXJuZWwgPSB7XG4gIG5lYXJlc3Q6ICduZWFyZXN0JyxcbiAgbGluZWFyOiAnbGluZWFyJyxcbiAgY3ViaWM6ICdjdWJpYycsXG4gIG1pdGNoZWxsOiAnbWl0Y2hlbGwnLFxuICBsYW5jem9zMjogJ2xhbmN6b3MyJyxcbiAgbGFuY3pvczM6ICdsYW5jem9zMydcbn07XG5cbi8qKlxuICogTWV0aG9kcyBieSB3aGljaCBhbiBpbWFnZSBjYW4gYmUgcmVzaXplZCB0byBmaXQgdGhlIHByb3ZpZGVkIGRpbWVuc2lvbnMuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBmaXQgPSB7XG4gIGNvbnRhaW46ICdjb250YWluJyxcbiAgY292ZXI6ICdjb3ZlcicsXG4gIGZpbGw6ICdmaWxsJyxcbiAgaW5zaWRlOiAnaW5zaWRlJyxcbiAgb3V0c2lkZTogJ291dHNpZGUnXG59O1xuXG4vKipcbiAqIE1hcCBleHRlcm5hbCBmaXQgcHJvcGVydHkgdG8gaW50ZXJuYWwgY2FudmFzIHByb3BlcnR5LlxuICogQG1lbWJlclxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgbWFwRml0VG9DYW52YXMgPSB7XG4gIGNvbnRhaW46ICdlbWJlZCcsXG4gIGNvdmVyOiAnY3JvcCcsXG4gIGZpbGw6ICdpZ25vcmVfYXNwZWN0JyxcbiAgaW5zaWRlOiAnbWF4JyxcbiAgb3V0c2lkZTogJ21pbidcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gaXNSb3RhdGlvbkV4cGVjdGVkIChvcHRpb25zKSB7XG4gIHJldHVybiAob3B0aW9ucy5hbmdsZSAlIDM2MCkgIT09IDAgfHwgb3B0aW9ucy51c2VFeGlmT3JpZW50YXRpb24gPT09IHRydWUgfHwgb3B0aW9ucy5yb3RhdGlvbkFuZ2xlICE9PSAwO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGlzUmVzaXplRXhwZWN0ZWQgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG9wdGlvbnMud2lkdGggIT09IC0xIHx8IG9wdGlvbnMuaGVpZ2h0ICE9PSAtMTtcbn1cblxuLyoqXG4gKiBSZXNpemUgaW1hZ2UgdG8gYHdpZHRoYCwgYGhlaWdodGAgb3IgYHdpZHRoIHggaGVpZ2h0YC5cbiAqXG4gKiBXaGVuIGJvdGggYSBgd2lkdGhgIGFuZCBgaGVpZ2h0YCBhcmUgcHJvdmlkZWQsIHRoZSBwb3NzaWJsZSBtZXRob2RzIGJ5IHdoaWNoIHRoZSBpbWFnZSBzaG91bGQgKipmaXQqKiB0aGVzZSBhcmU6XG4gKiAtIGBjb3ZlcmA6IChkZWZhdWx0KSBQcmVzZXJ2aW5nIGFzcGVjdCByYXRpbywgYXR0ZW1wdCB0byBlbnN1cmUgdGhlIGltYWdlIGNvdmVycyBib3RoIHByb3ZpZGVkIGRpbWVuc2lvbnMgYnkgY3JvcHBpbmcvY2xpcHBpbmcgdG8gZml0LlxuICogLSBgY29udGFpbmA6IFByZXNlcnZpbmcgYXNwZWN0IHJhdGlvLCBjb250YWluIHdpdGhpbiBib3RoIHByb3ZpZGVkIGRpbWVuc2lvbnMgdXNpbmcgXCJsZXR0ZXJib3hpbmdcIiB3aGVyZSBuZWNlc3NhcnkuXG4gKiAtIGBmaWxsYDogSWdub3JlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGlucHV0IGFuZCBzdHJldGNoIHRvIGJvdGggcHJvdmlkZWQgZGltZW5zaW9ucy5cbiAqIC0gYGluc2lkZWA6IFByZXNlcnZpbmcgYXNwZWN0IHJhdGlvLCByZXNpemUgdGhlIGltYWdlIHRvIGJlIGFzIGxhcmdlIGFzIHBvc3NpYmxlIHdoaWxlIGVuc3VyaW5nIGl0cyBkaW1lbnNpb25zIGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYm90aCB0aG9zZSBzcGVjaWZpZWQuXG4gKiAtIGBvdXRzaWRlYDogUHJlc2VydmluZyBhc3BlY3QgcmF0aW8sIHJlc2l6ZSB0aGUgaW1hZ2UgdG8gYmUgYXMgc21hbGwgYXMgcG9zc2libGUgd2hpbGUgZW5zdXJpbmcgaXRzIGRpbWVuc2lvbnMgYXJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBib3RoIHRob3NlIHNwZWNpZmllZC5cbiAqXG4gKiBTb21lIG9mIHRoZXNlIHZhbHVlcyBhcmUgYmFzZWQgb24gdGhlIFtvYmplY3QtZml0XShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1Mvb2JqZWN0LWZpdCkgQ1NTIHByb3BlcnR5LlxuICpcbiAqIDxpbWcgYWx0PVwiRXhhbXBsZXMgb2YgdmFyaW91cyB2YWx1ZXMgZm9yIHRoZSBmaXQgcHJvcGVydHkgd2hlbiByZXNpemluZ1wiIHdpZHRoPVwiMTAwJVwiIHN0eWxlPVwiYXNwZWN0LXJhdGlvOiA5OTgvMjQzXCIgc3JjPVwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2xvdmVsbC9zaGFycEBtYWluL2RvY3MvaW1hZ2UvYXBpLXJlc2l6ZS1maXQuc3ZnXCI+XG4gKlxuICogV2hlbiB1c2luZyBhICoqZml0Kiogb2YgYGNvdmVyYCBvciBgY29udGFpbmAsIHRoZSBkZWZhdWx0ICoqcG9zaXRpb24qKiBpcyBgY2VudHJlYC4gT3RoZXIgb3B0aW9ucyBhcmU6XG4gKiAtIGBzaGFycC5wb3NpdGlvbmA6IGB0b3BgLCBgcmlnaHQgdG9wYCwgYHJpZ2h0YCwgYHJpZ2h0IGJvdHRvbWAsIGBib3R0b21gLCBgbGVmdCBib3R0b21gLCBgbGVmdGAsIGBsZWZ0IHRvcGAuXG4gKiAtIGBzaGFycC5ncmF2aXR5YDogYG5vcnRoYCwgYG5vcnRoZWFzdGAsIGBlYXN0YCwgYHNvdXRoZWFzdGAsIGBzb3V0aGAsIGBzb3V0aHdlc3RgLCBgd2VzdGAsIGBub3J0aHdlc3RgLCBgY2VudGVyYCBvciBgY2VudHJlYC5cbiAqIC0gYHNoYXJwLnN0cmF0ZWd5YDogYGNvdmVyYCBvbmx5LCBkeW5hbWljYWxseSBjcm9wIHVzaW5nIGVpdGhlciB0aGUgYGVudHJvcHlgIG9yIGBhdHRlbnRpb25gIHN0cmF0ZWd5LlxuICpcbiAqIFNvbWUgb2YgdGhlc2UgdmFsdWVzIGFyZSBiYXNlZCBvbiB0aGUgW29iamVjdC1wb3NpdGlvbl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL29iamVjdC1wb3NpdGlvbikgQ1NTIHByb3BlcnR5LlxuICpcbiAqIFRoZSBzdHJhdGVneS1iYXNlZCBhcHByb2FjaCBpbml0aWFsbHkgcmVzaXplcyBzbyBvbmUgZGltZW5zaW9uIGlzIGF0IGl0cyB0YXJnZXQgbGVuZ3RoXG4gKiB0aGVuIHJlcGVhdGVkbHkgcmFua3MgZWRnZSByZWdpb25zLCBkaXNjYXJkaW5nIHRoZSBlZGdlIHdpdGggdGhlIGxvd2VzdCBzY29yZSBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kuXG4gKiAtIGBlbnRyb3B5YDogZm9jdXMgb24gdGhlIHJlZ2lvbiB3aXRoIHRoZSBoaWdoZXN0IFtTaGFubm9uIGVudHJvcHldKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VudHJvcHlfJTI4aW5mb3JtYXRpb25fdGhlb3J5JTI5KS5cbiAqIC0gYGF0dGVudGlvbmA6IGZvY3VzIG9uIHRoZSByZWdpb24gd2l0aCB0aGUgaGlnaGVzdCBsdW1pbmFuY2UgZnJlcXVlbmN5LCBjb2xvdXIgc2F0dXJhdGlvbiBhbmQgcHJlc2VuY2Ugb2Ygc2tpbiB0b25lcy5cbiAqXG4gKiBQb3NzaWJsZSBkb3duc2l6aW5nIGtlcm5lbHMgYXJlOlxuICogLSBgbmVhcmVzdGA6IFVzZSBbbmVhcmVzdCBuZWlnaGJvdXIgaW50ZXJwb2xhdGlvbl0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OZWFyZXN0LW5laWdoYm9yX2ludGVycG9sYXRpb24pLlxuICogLSBgbGluZWFyYDogVXNlIGEgW3RyaWFuZ2xlIGZpbHRlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVHJpYW5ndWxhcl9mdW5jdGlvbikuXG4gKiAtIGBjdWJpY2A6IFVzZSBhIFtDYXRtdWxsLVJvbSBzcGxpbmVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NlbnRyaXBldGFsX0NhdG11bGwlRTIlODAlOTNSb21fc3BsaW5lKS5cbiAqIC0gYG1pdGNoZWxsYDogVXNlIGEgW01pdGNoZWxsLU5ldHJhdmFsaSBzcGxpbmVdKGh0dHBzOi8vd3d3LmNzLnV0ZXhhcy5lZHUvfmZ1c3NlbGwvY291cnNlcy9jczM4NGctZmFsbDIwMTMvbGVjdHVyZXMvbWl0Y2hlbGwvTWl0Y2hlbGwucGRmKS5cbiAqIC0gYGxhbmN6b3MyYDogVXNlIGEgW0xhbmN6b3Mga2VybmVsXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MYW5jem9zX3Jlc2FtcGxpbmcjTGFuY3pvc19rZXJuZWwpIHdpdGggYGE9MmAuXG4gKiAtIGBsYW5jem9zM2A6IFVzZSBhIExhbmN6b3Mga2VybmVsIHdpdGggYGE9M2AgKHRoZSBkZWZhdWx0KS5cbiAqXG4gKiBXaGVuIHVwc2FtcGxpbmcsIHRoZXNlIGtlcm5lbHMgbWFwIHRvIGBuZWFyZXN0YCwgYGxpbmVhcmAgYW5kIGBjdWJpY2AgaW50ZXJwb2xhdG9ycy5cbiAqIERvd25zYW1wbGluZyBrZXJuZWxzIHdpdGhvdXQgYSBtYXRjaGluZyB1cHNhbXBsaW5nIGludGVycG9sYXRvciBtYXAgdG8gYGN1YmljYC5cbiAqXG4gKiBPbmx5IG9uZSByZXNpemUgY2FuIG9jY3VyIHBlciBwaXBlbGluZS5cbiAqIFByZXZpb3VzIGNhbGxzIHRvIGByZXNpemVgIGluIHRoZSBzYW1lIHBpcGVsaW5lIHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogc2hhcnAoaW5wdXQpXG4gKiAgIC5yZXNpemUoeyB3aWR0aDogMTAwIH0pXG4gKiAgIC50b0J1ZmZlcigpXG4gKiAgIC50aGVuKGRhdGEgPT4ge1xuICogICAgIC8vIDEwMCBwaXhlbHMgd2lkZSwgYXV0by1zY2FsZWQgaGVpZ2h0XG4gKiAgIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnJlc2l6ZSh7IGhlaWdodDogMTAwIH0pXG4gKiAgIC50b0J1ZmZlcigpXG4gKiAgIC50aGVuKGRhdGEgPT4ge1xuICogICAgIC8vIDEwMCBwaXhlbHMgaGlnaCwgYXV0by1zY2FsZWQgd2lkdGhcbiAqICAgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAucmVzaXplKDIwMCwgMzAwLCB7XG4gKiAgICAga2VybmVsOiBzaGFycC5rZXJuZWwubmVhcmVzdCxcbiAqICAgICBmaXQ6ICdjb250YWluJyxcbiAqICAgICBwb3NpdGlvbjogJ3JpZ2h0IHRvcCcsXG4gKiAgICAgYmFja2dyb3VuZDogeyByOiAyNTUsIGc6IDI1NSwgYjogMjU1LCBhbHBoYTogMC41IH1cbiAqICAgfSlcbiAqICAgLnRvRmlsZSgnb3V0cHV0LnBuZycpXG4gKiAgIC50aGVuKCgpID0+IHtcbiAqICAgICAvLyBvdXRwdXQucG5nIGlzIGEgMjAwIHBpeGVscyB3aWRlIGFuZCAzMDAgcGl4ZWxzIGhpZ2ggaW1hZ2VcbiAqICAgICAvLyBjb250YWluaW5nIGEgbmVhcmVzdC1uZWlnaGJvdXIgc2NhbGVkIHZlcnNpb25cbiAqICAgICAvLyBjb250YWluZWQgd2l0aGluIHRoZSBub3J0aC1lYXN0IGNvcm5lciBvZiBhIHNlbWktdHJhbnNwYXJlbnQgd2hpdGUgY2FudmFzXG4gKiAgIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0cmFuc2Zvcm1lciA9IHNoYXJwKClcbiAqICAgLnJlc2l6ZSh7XG4gKiAgICAgd2lkdGg6IDIwMCxcbiAqICAgICBoZWlnaHQ6IDIwMCxcbiAqICAgICBmaXQ6IHNoYXJwLmZpdC5jb3ZlcixcbiAqICAgICBwb3NpdGlvbjogc2hhcnAuc3RyYXRlZ3kuZW50cm9weVxuICogICB9KTtcbiAqIC8vIFJlYWQgaW1hZ2UgZGF0YSBmcm9tIHJlYWRhYmxlU3RyZWFtXG4gKiAvLyBXcml0ZSAyMDBweCBzcXVhcmUgYXV0by1jcm9wcGVkIGltYWdlIGRhdGEgdG8gd3JpdGFibGVTdHJlYW1cbiAqIHJlYWRhYmxlU3RyZWFtXG4gKiAgIC5waXBlKHRyYW5zZm9ybWVyKVxuICogICAucGlwZSh3cml0YWJsZVN0cmVhbSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAucmVzaXplKDIwMCwgMjAwLCB7XG4gKiAgICAgZml0OiBzaGFycC5maXQuaW5zaWRlLFxuICogICAgIHdpdGhvdXRFbmxhcmdlbWVudDogdHJ1ZVxuICogICB9KVxuICogICAudG9Gb3JtYXQoJ2pwZWcnKVxuICogICAudG9CdWZmZXIoKVxuICogICAudGhlbihmdW5jdGlvbihvdXRwdXRCdWZmZXIpIHtcbiAqICAgICAvLyBvdXRwdXRCdWZmZXIgY29udGFpbnMgSlBFRyBpbWFnZSBkYXRhXG4gKiAgICAgLy8gbm8gd2lkZXIgYW5kIG5vIGhpZ2hlciB0aGFuIDIwMCBwaXhlbHNcbiAqICAgICAvLyBhbmQgbm8gbGFyZ2VyIHRoYW4gdGhlIGlucHV0IGltYWdlXG4gKiAgIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnJlc2l6ZSgyMDAsIDIwMCwge1xuICogICAgIGZpdDogc2hhcnAuZml0Lm91dHNpZGUsXG4gKiAgICAgd2l0aG91dFJlZHVjdGlvbjogdHJ1ZVxuICogICB9KVxuICogICAudG9Gb3JtYXQoJ2pwZWcnKVxuICogICAudG9CdWZmZXIoKVxuICogICAudGhlbihmdW5jdGlvbihvdXRwdXRCdWZmZXIpIHtcbiAqICAgICAvLyBvdXRwdXRCdWZmZXIgY29udGFpbnMgSlBFRyBpbWFnZSBkYXRhXG4gKiAgICAgLy8gb2YgYXQgbGVhc3QgMjAwIHBpeGVscyB3aWRlIGFuZCAyMDAgcGl4ZWxzIGhpZ2ggd2hpbGUgbWFpbnRhaW5pbmcgYXNwZWN0IHJhdGlvXG4gKiAgICAgLy8gYW5kIG5vIHNtYWxsZXIgdGhhbiB0aGUgaW5wdXQgaW1hZ2VcbiAqICAgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNjYWxlQnlIYWxmID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5tZXRhZGF0YSgpXG4gKiAgIC50aGVuKCh7IHdpZHRoIH0pID0+IHNoYXJwKGlucHV0KVxuICogICAgIC5yZXNpemUoTWF0aC5yb3VuZCh3aWR0aCAqIDAuNSkpXG4gKiAgICAgLnRvQnVmZmVyKClcbiAqICAgKTtcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSAtIEhvdyBtYW55IHBpeGVscyB3aWRlIHRoZSByZXN1bHRhbnQgaW1hZ2Ugc2hvdWxkIGJlLiBVc2UgYG51bGxgIG9yIGB1bmRlZmluZWRgIHRvIGF1dG8tc2NhbGUgdGhlIHdpZHRoIHRvIG1hdGNoIHRoZSBoZWlnaHQuXG4gKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gLSBIb3cgbWFueSBwaXhlbHMgaGlnaCB0aGUgcmVzdWx0YW50IGltYWdlIHNob3VsZCBiZS4gVXNlIGBudWxsYCBvciBgdW5kZWZpbmVkYCB0byBhdXRvLXNjYWxlIHRoZSBoZWlnaHQgdG8gbWF0Y2ggdGhlIHdpZHRoLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLndpZHRoXSAtIEFuIGFsdGVybmF0aXZlIG1lYW5zIG9mIHNwZWNpZnlpbmcgYHdpZHRoYC4gSWYgYm90aCBhcmUgcHJlc2VudCB0aGlzIHRha2VzIHByaW9yaXR5LlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmhlaWdodF0gLSBBbiBhbHRlcm5hdGl2ZSBtZWFucyBvZiBzcGVjaWZ5aW5nIGBoZWlnaHRgLiBJZiBib3RoIGFyZSBwcmVzZW50IHRoaXMgdGFrZXMgcHJpb3JpdHkuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuZml0PSdjb3ZlciddIC0gSG93IHRoZSBpbWFnZSBzaG91bGQgYmUgcmVzaXplZC9jcm9wcGVkIHRvIGZpdCB0aGUgdGFyZ2V0IGRpbWVuc2lvbihzKSwgb25lIG9mIGBjb3ZlcmAsIGBjb250YWluYCwgYGZpbGxgLCBgaW5zaWRlYCBvciBgb3V0c2lkZWAuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucG9zaXRpb249J2NlbnRyZSddIC0gQSBwb3NpdGlvbiwgZ3Jhdml0eSBvciBzdHJhdGVneSB0byB1c2Ugd2hlbiBgZml0YCBpcyBgY292ZXJgIG9yIGBjb250YWluYC5cbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gW29wdGlvbnMuYmFja2dyb3VuZD17cjogMCwgZzogMCwgYjogMCwgYWxwaGE6IDF9XSAtIGJhY2tncm91bmQgY29sb3VyIHdoZW4gYGZpdGAgaXMgYGNvbnRhaW5gLCBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSwgZGVmYXVsdHMgdG8gYmxhY2sgd2l0aG91dCB0cmFuc3BhcmVuY3kuXG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMua2VybmVsPSdsYW5jem9zMyddIC0gVGhlIGtlcm5lbCB0byB1c2UgZm9yIGltYWdlIHJlZHVjdGlvbiBhbmQgdGhlIGluZmVycmVkIGludGVycG9sYXRvciB0byB1c2UgZm9yIHVwc2FtcGxpbmcuIFVzZSB0aGUgYGZhc3RTaHJpbmtPbkxvYWRgIG9wdGlvbiB0byBjb250cm9sIGtlcm5lbCB2cyBzaHJpbmstb24tbG9hZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMud2l0aG91dEVubGFyZ2VtZW50PWZhbHNlXSAtIERvIG5vdCBzY2FsZSB1cCBpZiB0aGUgd2lkdGggKm9yKiBoZWlnaHQgYXJlIGFscmVhZHkgbGVzcyB0aGFuIHRoZSB0YXJnZXQgZGltZW5zaW9ucywgZXF1aXZhbGVudCB0byBHcmFwaGljc01hZ2ljaydzIGA+YCBnZW9tZXRyeSBvcHRpb24uIFRoaXMgbWF5IHJlc3VsdCBpbiBvdXRwdXQgZGltZW5zaW9ucyBzbWFsbGVyIHRoYW4gdGhlIHRhcmdldCBkaW1lbnNpb25zLlxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy53aXRob3V0UmVkdWN0aW9uPWZhbHNlXSAtIERvIG5vdCBzY2FsZSBkb3duIGlmIHRoZSB3aWR0aCAqb3IqIGhlaWdodCBhcmUgYWxyZWFkeSBncmVhdGVyIHRoYW4gdGhlIHRhcmdldCBkaW1lbnNpb25zLCBlcXVpdmFsZW50IHRvIEdyYXBoaWNzTWFnaWNrJ3MgYDxgIGdlb21ldHJ5IG9wdGlvbi4gVGhpcyBtYXkgc3RpbGwgcmVzdWx0IGluIGEgY3JvcCB0byByZWFjaCB0aGUgdGFyZ2V0IGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmZhc3RTaHJpbmtPbkxvYWQ9dHJ1ZV0gLSBUYWtlIGdyZWF0ZXIgYWR2YW50YWdlIG9mIHRoZSBKUEVHIGFuZCBXZWJQIHNocmluay1vbi1sb2FkIGZlYXR1cmUsIHdoaWNoIGNhbiBsZWFkIHRvIGEgc2xpZ2h0IG1vaXLDqSBwYXR0ZXJuIG9yIHJvdW5kLWRvd24gb2YgYW4gYXV0by1zY2FsZWQgZGltZW5zaW9uLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiByZXNpemUgKHdpZHRoT3JPcHRpb25zLCBoZWlnaHQsIG9wdGlvbnMpIHtcbiAgaWYgKGlzUmVzaXplRXhwZWN0ZWQodGhpcy5vcHRpb25zKSkge1xuICAgIHRoaXMub3B0aW9ucy5kZWJ1Z2xvZygnaWdub3JpbmcgcHJldmlvdXMgcmVzaXplIG9wdGlvbnMnKTtcbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLndpZHRoUG9zdCAhPT0gLTEpIHtcbiAgICB0aGlzLm9wdGlvbnMuZGVidWdsb2coJ29wZXJhdGlvbiBvcmRlciB3aWxsIGJlOiBleHRyYWN0LCByZXNpemUsIGV4dHJhY3QnKTtcbiAgfVxuICBpZiAoaXMuZGVmaW5lZCh3aWR0aE9yT3B0aW9ucykpIHtcbiAgICBpZiAoaXMub2JqZWN0KHdpZHRoT3JPcHRpb25zKSAmJiAhaXMuZGVmaW5lZChvcHRpb25zKSkge1xuICAgICAgb3B0aW9ucyA9IHdpZHRoT3JPcHRpb25zO1xuICAgIH0gZWxzZSBpZiAoaXMuaW50ZWdlcih3aWR0aE9yT3B0aW9ucykgJiYgd2lkdGhPck9wdGlvbnMgPiAwKSB7XG4gICAgICB0aGlzLm9wdGlvbnMud2lkdGggPSB3aWR0aE9yT3B0aW9ucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd3aWR0aCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgd2lkdGhPck9wdGlvbnMpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aGlzLm9wdGlvbnMud2lkdGggPSAtMTtcbiAgfVxuICBpZiAoaXMuZGVmaW5lZChoZWlnaHQpKSB7XG4gICAgaWYgKGlzLmludGVnZXIoaGVpZ2h0KSAmJiBoZWlnaHQgPiAwKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2hlaWdodCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgaGVpZ2h0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zLmhlaWdodCA9IC0xO1xuICB9XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICAvLyBXaWR0aFxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMud2lkdGgpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLndpZHRoKSAmJiBvcHRpb25zLndpZHRoID4gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMud2lkdGggPSBvcHRpb25zLndpZHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd3aWR0aCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgb3B0aW9ucy53aWR0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEhlaWdodFxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuaGVpZ2h0KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5oZWlnaHQpICYmIG9wdGlvbnMuaGVpZ2h0ID4gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuaGVpZ2h0ID0gb3B0aW9ucy5oZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2hlaWdodCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgb3B0aW9ucy5oZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBGaXRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmZpdCkpIHtcbiAgICAgIGNvbnN0IGNhbnZhcyA9IG1hcEZpdFRvQ2FudmFzW29wdGlvbnMuZml0XTtcbiAgICAgIGlmIChpcy5zdHJpbmcoY2FudmFzKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuY2FudmFzID0gY2FudmFzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdmaXQnLCAndmFsaWQgZml0Jywgb3B0aW9ucy5maXQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBQb3NpdGlvblxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucG9zaXRpb24pKSB7XG4gICAgICBjb25zdCBwb3MgPSBpcy5pbnRlZ2VyKG9wdGlvbnMucG9zaXRpb24pXG4gICAgICAgID8gb3B0aW9ucy5wb3NpdGlvblxuICAgICAgICA6IHN0cmF0ZWd5W29wdGlvbnMucG9zaXRpb25dIHx8IHBvc2l0aW9uW29wdGlvbnMucG9zaXRpb25dIHx8IGdyYXZpdHlbb3B0aW9ucy5wb3NpdGlvbl07XG4gICAgICBpZiAoaXMuaW50ZWdlcihwb3MpICYmIChpcy5pblJhbmdlKHBvcywgMCwgOCkgfHwgaXMuaW5SYW5nZShwb3MsIDE2LCAxNykpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5wb3NpdGlvbiA9IHBvcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncG9zaXRpb24nLCAndmFsaWQgcG9zaXRpb24vZ3Jhdml0eS9zdHJhdGVneScsIG9wdGlvbnMucG9zaXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYWNrZ3JvdW5kXG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG91ck9wdGlvbigncmVzaXplQmFja2dyb3VuZCcsIG9wdGlvbnMuYmFja2dyb3VuZCk7XG4gICAgLy8gS2VybmVsXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5rZXJuZWwpKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKGtlcm5lbFtvcHRpb25zLmtlcm5lbF0pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5rZXJuZWwgPSBrZXJuZWxbb3B0aW9ucy5rZXJuZWxdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdrZXJuZWwnLCAndmFsaWQga2VybmVsIG5hbWUnLCBvcHRpb25zLmtlcm5lbCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFdpdGhvdXQgZW5sYXJnZW1lbnRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLndpdGhvdXRFbmxhcmdlbWVudCkpIHtcbiAgICAgIHRoaXMuX3NldEJvb2xlYW5PcHRpb24oJ3dpdGhvdXRFbmxhcmdlbWVudCcsIG9wdGlvbnMud2l0aG91dEVubGFyZ2VtZW50KTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCByZWR1Y3Rpb25cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLndpdGhvdXRSZWR1Y3Rpb24pKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd3aXRob3V0UmVkdWN0aW9uJywgb3B0aW9ucy53aXRob3V0UmVkdWN0aW9uKTtcbiAgICB9XG4gICAgLy8gU2hyaW5rIG9uIGxvYWRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmZhc3RTaHJpbmtPbkxvYWQpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdmYXN0U2hyaW5rT25Mb2FkJywgb3B0aW9ucy5mYXN0U2hyaW5rT25Mb2FkKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzUm90YXRpb25FeHBlY3RlZCh0aGlzLm9wdGlvbnMpICYmIGlzUmVzaXplRXhwZWN0ZWQodGhpcy5vcHRpb25zKSkge1xuICAgIHRoaXMub3B0aW9ucy5yb3RhdGVCZWZvcmVQcmVFeHRyYWN0ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBFeHRlbmQgLyBwYWQgLyBleHRydWRlIG9uZSBvciBtb3JlIGVkZ2VzIG9mIHRoZSBpbWFnZSB3aXRoIGVpdGhlclxuICogdGhlIHByb3ZpZGVkIGJhY2tncm91bmQgY29sb3VyIG9yIHBpeGVscyBkZXJpdmVkIGZyb20gdGhlIGltYWdlLlxuICogVGhpcyBvcGVyYXRpb24gd2lsbCBhbHdheXMgb2NjdXIgYWZ0ZXIgcmVzaXppbmcgYW5kIGV4dHJhY3Rpb24sIGlmIGFueS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUmVzaXplIHRvIDE0MCBwaXhlbHMgd2lkZSwgdGhlbiBhZGQgMTAgdHJhbnNwYXJlbnQgcGl4ZWxzXG4gKiAvLyB0byB0aGUgdG9wLCBsZWZ0IGFuZCByaWdodCBlZGdlcyBhbmQgMjAgdG8gdGhlIGJvdHRvbSBlZGdlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnJlc2l6ZSgxNDApXG4gKiAgIC5leHRlbmQoe1xuICogICAgIHRvcDogMTAsXG4gKiAgICAgYm90dG9tOiAyMCxcbiAqICAgICBsZWZ0OiAxMCxcbiAqICAgICByaWdodDogMTAsXG4gKiAgICAgYmFja2dyb3VuZDogeyByOiAwLCBnOiAwLCBiOiAwLCBhbHBoYTogMCB9XG4gKiAgIH0pXG4gKiAgIC4uLlxuICpcbiogQGV4YW1wbGVcbiAqIC8vIEFkZCBhIHJvdyBvZiAxMCByZWQgcGl4ZWxzIHRvIHRoZSBib3R0b21cbiAqIHNoYXJwKGlucHV0KVxuICogICAuZXh0ZW5kKHtcbiAqICAgICBib3R0b206IDEwLFxuICogICAgIGJhY2tncm91bmQ6ICdyZWQnXG4gKiAgIH0pXG4gKiAgIC4uLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBFeHRydWRlIGltYWdlIGJ5IDggcGl4ZWxzIHRvIHRoZSByaWdodCwgbWlycm9yaW5nIGV4aXN0aW5nIHJpZ2h0IGhhbmQgZWRnZVxuICogc2hhcnAoaW5wdXQpXG4gKiAgIC5leHRlbmQoe1xuICogICAgIHJpZ2h0OiA4LFxuICogICAgIGJhY2tncm91bmQ6ICdtaXJyb3InXG4gKiAgIH0pXG4gKiAgIC4uLlxuICpcbiAqIEBwYXJhbSB7KG51bWJlcnxPYmplY3QpfSBleHRlbmQgLSBzaW5nbGUgcGl4ZWwgY291bnQgdG8gYWRkIHRvIGFsbCBlZGdlcyBvciBhbiBPYmplY3Qgd2l0aCBwZXItZWRnZSBjb3VudHNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbZXh0ZW5kLnRvcD0wXVxuICogQHBhcmFtIHtudW1iZXJ9IFtleHRlbmQubGVmdD0wXVxuICogQHBhcmFtIHtudW1iZXJ9IFtleHRlbmQuYm90dG9tPTBdXG4gKiBAcGFyYW0ge251bWJlcn0gW2V4dGVuZC5yaWdodD0wXVxuICogQHBhcmFtIHtTdHJpbmd9IFtleHRlbmQuZXh0ZW5kV2l0aD0nYmFja2dyb3VuZCddIC0gcG9wdWxhdGUgbmV3IHBpeGVscyB1c2luZyB0aGlzIG1ldGhvZCwgb25lIG9mOiBiYWNrZ3JvdW5kLCBjb3B5LCByZXBlYXQsIG1pcnJvci5cbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gW2V4dGVuZC5iYWNrZ3JvdW5kPXtyOiAwLCBnOiAwLCBiOiAwLCBhbHBoYTogMX1dIC0gYmFja2dyb3VuZCBjb2xvdXIsIHBhcnNlZCBieSB0aGUgW2NvbG9yXShodHRwczovL3d3dy5ucG1qcy5vcmcvcGFja2FnZS9jb2xvcikgbW9kdWxlLCBkZWZhdWx0cyB0byBibGFjayB3aXRob3V0IHRyYW5zcGFyZW5jeS5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiovXG5mdW5jdGlvbiBleHRlbmQgKGV4dGVuZCkge1xuICBpZiAoaXMuaW50ZWdlcihleHRlbmQpICYmIGV4dGVuZCA+IDApIHtcbiAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kVG9wID0gZXh0ZW5kO1xuICAgIHRoaXMub3B0aW9ucy5leHRlbmRCb3R0b20gPSBleHRlbmQ7XG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZExlZnQgPSBleHRlbmQ7XG4gICAgdGhpcy5vcHRpb25zLmV4dGVuZFJpZ2h0ID0gZXh0ZW5kO1xuICB9IGVsc2UgaWYgKGlzLm9iamVjdChleHRlbmQpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQoZXh0ZW5kLnRvcCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGV4dGVuZC50b3ApICYmIGV4dGVuZC50b3AgPj0gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kVG9wID0gZXh0ZW5kLnRvcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndG9wJywgJ3Bvc2l0aXZlIGludGVnZXInLCBleHRlbmQudG9wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQoZXh0ZW5kLmJvdHRvbSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGV4dGVuZC5ib3R0b20pICYmIGV4dGVuZC5ib3R0b20gPj0gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kQm90dG9tID0gZXh0ZW5kLmJvdHRvbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignYm90dG9tJywgJ3Bvc2l0aXZlIGludGVnZXInLCBleHRlbmQuYm90dG9tKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQoZXh0ZW5kLmxlZnQpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihleHRlbmQubGVmdCkgJiYgZXh0ZW5kLmxlZnQgPj0gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZXh0ZW5kTGVmdCA9IGV4dGVuZC5sZWZ0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdsZWZ0JywgJ3Bvc2l0aXZlIGludGVnZXInLCBleHRlbmQubGVmdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGV4dGVuZC5yaWdodCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGV4dGVuZC5yaWdodCkgJiYgZXh0ZW5kLnJpZ2h0ID49IDApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZFJpZ2h0ID0gZXh0ZW5kLnJpZ2h0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdyaWdodCcsICdwb3NpdGl2ZSBpbnRlZ2VyJywgZXh0ZW5kLnJpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG91ck9wdGlvbignZXh0ZW5kQmFja2dyb3VuZCcsIGV4dGVuZC5iYWNrZ3JvdW5kKTtcbiAgICBpZiAoaXMuZGVmaW5lZChleHRlbmQuZXh0ZW5kV2l0aCkpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcoZXh0ZW5kV2l0aFtleHRlbmQuZXh0ZW5kV2l0aF0pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRXaXRoID0gZXh0ZW5kV2l0aFtleHRlbmQuZXh0ZW5kV2l0aF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2V4dGVuZFdpdGgnLCAnb25lIG9mOiBiYWNrZ3JvdW5kLCBjb3B5LCByZXBlYXQsIG1pcnJvcicsIGV4dGVuZC5leHRlbmRXaXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdleHRlbmQnLCAnaW50ZWdlciBvciBvYmplY3QnLCBleHRlbmQpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEV4dHJhY3QvY3JvcCBhIHJlZ2lvbiBvZiB0aGUgaW1hZ2UuXG4gKlxuICogLSBVc2UgYGV4dHJhY3RgIGJlZm9yZSBgcmVzaXplYCBmb3IgcHJlLXJlc2l6ZSBleHRyYWN0aW9uLlxuICogLSBVc2UgYGV4dHJhY3RgIGFmdGVyIGByZXNpemVgIGZvciBwb3N0LXJlc2l6ZSBleHRyYWN0aW9uLlxuICogLSBVc2UgYGV4dHJhY3RgIHR3aWNlIGFuZCBgcmVzaXplYCBvbmNlIGZvciBleHRyYWN0LXRoZW4tcmVzaXplLXRoZW4tZXh0cmFjdCBpbiBhIGZpeGVkIG9wZXJhdGlvbiBvcmRlci5cbiAqXG4gKiBAZXhhbXBsZVxuICogc2hhcnAoaW5wdXQpXG4gKiAgIC5leHRyYWN0KHsgbGVmdDogbGVmdCwgdG9wOiB0b3AsIHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSlcbiAqICAgLnRvRmlsZShvdXRwdXQsIGZ1bmN0aW9uKGVycikge1xuICogICAgIC8vIEV4dHJhY3QgYSByZWdpb24gb2YgdGhlIGlucHV0IGltYWdlLCBzYXZpbmcgaW4gdGhlIHNhbWUgZm9ybWF0LlxuICogICB9KTtcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLmV4dHJhY3QoeyBsZWZ0OiBsZWZ0T2Zmc2V0UHJlLCB0b3A6IHRvcE9mZnNldFByZSwgd2lkdGg6IHdpZHRoUHJlLCBoZWlnaHQ6IGhlaWdodFByZSB9KVxuICogICAucmVzaXplKHdpZHRoLCBoZWlnaHQpXG4gKiAgIC5leHRyYWN0KHsgbGVmdDogbGVmdE9mZnNldFBvc3QsIHRvcDogdG9wT2Zmc2V0UG9zdCwgd2lkdGg6IHdpZHRoUG9zdCwgaGVpZ2h0OiBoZWlnaHRQb3N0IH0pXG4gKiAgIC50b0ZpbGUob3V0cHV0LCBmdW5jdGlvbihlcnIpIHtcbiAqICAgICAvLyBFeHRyYWN0IGEgcmVnaW9uLCByZXNpemUsIHRoZW4gZXh0cmFjdCBmcm9tIHRoZSByZXNpemVkIGltYWdlXG4gKiAgIH0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gZGVzY3JpYmVzIHRoZSByZWdpb24gdG8gZXh0cmFjdCB1c2luZyBpbnRlZ3JhbCBwaXhlbCB2YWx1ZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLmxlZnQgLSB6ZXJvLWluZGV4ZWQgb2Zmc2V0IGZyb20gbGVmdCBlZGdlXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50b3AgLSB6ZXJvLWluZGV4ZWQgb2Zmc2V0IGZyb20gdG9wIGVkZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLndpZHRoIC0gd2lkdGggb2YgcmVnaW9uIHRvIGV4dHJhY3RcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLmhlaWdodCAtIGhlaWdodCBvZiByZWdpb24gdG8gZXh0cmFjdFxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiBleHRyYWN0IChvcHRpb25zKSB7XG4gIGNvbnN0IHN1ZmZpeCA9IGlzUmVzaXplRXhwZWN0ZWQodGhpcy5vcHRpb25zKSB8fCB0aGlzLm9wdGlvbnMud2lkdGhQcmUgIT09IC0xID8gJ1Bvc3QnIDogJ1ByZSc7XG4gIGlmICh0aGlzLm9wdGlvbnNbYHdpZHRoJHtzdWZmaXh9YF0gIT09IC0xKSB7XG4gICAgdGhpcy5vcHRpb25zLmRlYnVnbG9nKCdpZ25vcmluZyBwcmV2aW91cyBleHRyYWN0IG9wdGlvbnMnKTtcbiAgfVxuICBbJ2xlZnQnLCAndG9wJywgJ3dpZHRoJywgJ2hlaWdodCddLmZvckVhY2goZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnNbbmFtZV07XG4gICAgaWYgKGlzLmludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDApIHtcbiAgICAgIHRoaXMub3B0aW9uc1tuYW1lICsgKG5hbWUgPT09ICdsZWZ0JyB8fCBuYW1lID09PSAndG9wJyA/ICdPZmZzZXQnIDogJycpICsgc3VmZml4XSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IobmFtZSwgJ2ludGVnZXInLCB2YWx1ZSk7XG4gICAgfVxuICB9LCB0aGlzKTtcbiAgLy8gRW5zdXJlIGV4aXN0aW5nIHJvdGF0aW9uIG9jY3VycyBiZWZvcmUgcHJlLXJlc2l6ZSBleHRyYWN0aW9uXG4gIGlmIChpc1JvdGF0aW9uRXhwZWN0ZWQodGhpcy5vcHRpb25zKSAmJiAhaXNSZXNpemVFeHBlY3RlZCh0aGlzLm9wdGlvbnMpKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy53aWR0aFByZSA9PT0gLTEgfHwgdGhpcy5vcHRpb25zLndpZHRoUG9zdCA9PT0gLTEpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5yb3RhdGVCZWZvcmVQcmVFeHRyYWN0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogVHJpbSBwaXhlbHMgZnJvbSBhbGwgZWRnZXMgdGhhdCBjb250YWluIHZhbHVlcyBzaW1pbGFyIHRvIHRoZSBnaXZlbiBiYWNrZ3JvdW5kIGNvbG91ciwgd2hpY2ggZGVmYXVsdHMgdG8gdGhhdCBvZiB0aGUgdG9wLWxlZnQgcGl4ZWwuXG4gKlxuICogSW1hZ2VzIHdpdGggYW4gYWxwaGEgY2hhbm5lbCB3aWxsIHVzZSB0aGUgY29tYmluZWQgYm91bmRpbmcgYm94IG9mIGFscGhhIGFuZCBub24tYWxwaGEgY2hhbm5lbHMuXG4gKlxuICogSWYgdGhlIHJlc3VsdCBvZiB0aGlzIG9wZXJhdGlvbiB3b3VsZCB0cmltIGFuIGltYWdlIHRvIG5vdGhpbmcgdGhlbiBubyBjaGFuZ2UgaXMgbWFkZS5cbiAqXG4gKiBUaGUgYGluZm9gIHJlc3BvbnNlIE9iamVjdCB3aWxsIGNvbnRhaW4gYHRyaW1PZmZzZXRMZWZ0YCBhbmQgYHRyaW1PZmZzZXRUb3BgIHByb3BlcnRpZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRyaW0gcGl4ZWxzIHdpdGggYSBjb2xvdXIgc2ltaWxhciB0byB0aGF0IG9mIHRoZSB0b3AtbGVmdCBwaXhlbC5cbiAqIGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAudHJpbSgpXG4gKiAgIC50b0ZpbGUob3V0cHV0KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gVHJpbSBwaXhlbHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBjb2xvdXIgYXMgdGhhdCBvZiB0aGUgdG9wLWxlZnQgcGl4ZWwuXG4gKiBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnRyaW0oe1xuICogICAgIHRocmVzaG9sZDogMFxuICogICB9KVxuICogICAudG9GaWxlKG91dHB1dCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEFzc3VtZSBpbnB1dCBpcyBsaW5lIGFydCBhbmQgdHJpbSBvbmx5IHBpeGVscyB3aXRoIGEgc2ltaWxhciBjb2xvdXIgdG8gcmVkLlxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC50cmltKHtcbiAqICAgICBiYWNrZ3JvdW5kOiBcIiNGRjAwMDBcIixcbiAqICAgICBsaW5lQXJ0OiB0cnVlXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUcmltIGFsbCBcInllbGxvdy1pc2hcIiBwaXhlbHMsIGJlaW5nIG1vcmUgbGVuaWVudCB3aXRoIHRoZSBoaWdoZXIgdGhyZXNob2xkLlxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC50cmltKHtcbiAqICAgICBiYWNrZ3JvdW5kOiBcInllbGxvd1wiLFxuICogICAgIHRocmVzaG9sZDogNDIsXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gW29wdGlvbnMuYmFja2dyb3VuZD0ndG9wLWxlZnQgcGl4ZWwnXSAtIEJhY2tncm91bmQgY29sb3VyLCBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSwgZGVmYXVsdHMgdG8gdGhhdCBvZiB0aGUgdG9wLWxlZnQgcGl4ZWwuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGhyZXNob2xkPTEwXSAtIEFsbG93ZWQgZGlmZmVyZW5jZSBmcm9tIHRoZSBhYm92ZSBjb2xvdXIsIGEgcG9zaXRpdmUgbnVtYmVyLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5saW5lQXJ0PWZhbHNlXSAtIERvZXMgdGhlIGlucHV0IG1vcmUgY2xvc2VseSByZXNlbWJsZSBsaW5lIGFydCAoZS5nLiB2ZWN0b3IpIHJhdGhlciB0aGFuIGJlaW5nIHBob3RvZ3JhcGhpYz9cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gdHJpbSAob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMudHJpbVRocmVzaG9sZCA9IDEwO1xuICBpZiAoaXMuZGVmaW5lZChvcHRpb25zKSkge1xuICAgIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuYmFja2dyb3VuZCkpIHtcbiAgICAgICAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG91ck9wdGlvbigndHJpbUJhY2tncm91bmQnLCBvcHRpb25zLmJhY2tncm91bmQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy50aHJlc2hvbGQpKSB7XG4gICAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy50aHJlc2hvbGQpICYmIG9wdGlvbnMudGhyZXNob2xkID49IDApIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMudHJpbVRocmVzaG9sZCA9IG9wdGlvbnMudGhyZXNob2xkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGhyZXNob2xkJywgJ3Bvc2l0aXZlIG51bWJlcicsIG9wdGlvbnMudGhyZXNob2xkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5saW5lQXJ0KSkge1xuICAgICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd0cmltTGluZUFydCcsIG9wdGlvbnMubGluZUFydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndHJpbScsICdvYmplY3QnLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzUm90YXRpb25FeHBlY3RlZCh0aGlzLm9wdGlvbnMpKSB7XG4gICAgdGhpcy5vcHRpb25zLnJvdGF0ZUJlZm9yZVByZUV4dHJhY3QgPSB0cnVlO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIERlY29yYXRlIHRoZSBTaGFycCBwcm90b3R5cGUgd2l0aCByZXNpemUtcmVsYXRlZCBmdW5jdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTaGFycCkge1xuICBPYmplY3QuYXNzaWduKFNoYXJwLnByb3RvdHlwZSwge1xuICAgIHJlc2l6ZSxcbiAgICBleHRlbmQsXG4gICAgZXh0cmFjdCxcbiAgICB0cmltXG4gIH0pO1xuICAvLyBDbGFzcyBhdHRyaWJ1dGVzXG4gIFNoYXJwLmdyYXZpdHkgPSBncmF2aXR5O1xuICBTaGFycC5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBTaGFycC5rZXJuZWwgPSBrZXJuZWw7XG4gIFNoYXJwLmZpdCA9IGZpdDtcbiAgU2hhcnAucG9zaXRpb24gPSBwb3NpdGlvbjtcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5cbi8qKlxuICogQmxlbmQgbW9kZXMuXG4gKiBAbWVtYmVyXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBibGVuZCA9IHtcbiAgY2xlYXI6ICdjbGVhcicsXG4gIHNvdXJjZTogJ3NvdXJjZScsXG4gIG92ZXI6ICdvdmVyJyxcbiAgaW46ICdpbicsXG4gIG91dDogJ291dCcsXG4gIGF0b3A6ICdhdG9wJyxcbiAgZGVzdDogJ2Rlc3QnLFxuICAnZGVzdC1vdmVyJzogJ2Rlc3Qtb3ZlcicsXG4gICdkZXN0LWluJzogJ2Rlc3QtaW4nLFxuICAnZGVzdC1vdXQnOiAnZGVzdC1vdXQnLFxuICAnZGVzdC1hdG9wJzogJ2Rlc3QtYXRvcCcsXG4gIHhvcjogJ3hvcicsXG4gIGFkZDogJ2FkZCcsXG4gIHNhdHVyYXRlOiAnc2F0dXJhdGUnLFxuICBtdWx0aXBseTogJ211bHRpcGx5JyxcbiAgc2NyZWVuOiAnc2NyZWVuJyxcbiAgb3ZlcmxheTogJ292ZXJsYXknLFxuICBkYXJrZW46ICdkYXJrZW4nLFxuICBsaWdodGVuOiAnbGlnaHRlbicsXG4gICdjb2xvdXItZG9kZ2UnOiAnY29sb3VyLWRvZGdlJyxcbiAgJ2NvbG9yLWRvZGdlJzogJ2NvbG91ci1kb2RnZScsXG4gICdjb2xvdXItYnVybic6ICdjb2xvdXItYnVybicsXG4gICdjb2xvci1idXJuJzogJ2NvbG91ci1idXJuJyxcbiAgJ2hhcmQtbGlnaHQnOiAnaGFyZC1saWdodCcsXG4gICdzb2Z0LWxpZ2h0JzogJ3NvZnQtbGlnaHQnLFxuICBkaWZmZXJlbmNlOiAnZGlmZmVyZW5jZScsXG4gIGV4Y2x1c2lvbjogJ2V4Y2x1c2lvbidcbn07XG5cbi8qKlxuICogQ29tcG9zaXRlIGltYWdlKHMpIG92ZXIgdGhlIHByb2Nlc3NlZCAocmVzaXplZCwgZXh0cmFjdGVkIGV0Yy4pIGltYWdlLlxuICpcbiAqIFRoZSBpbWFnZXMgdG8gY29tcG9zaXRlIG11c3QgYmUgdGhlIHNhbWUgc2l6ZSBvciBzbWFsbGVyIHRoYW4gdGhlIHByb2Nlc3NlZCBpbWFnZS5cbiAqIElmIGJvdGggYHRvcGAgYW5kIGBsZWZ0YCBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhleSB0YWtlIHByZWNlZGVuY2Ugb3ZlciBgZ3Jhdml0eWAuXG4gKlxuICogQW55IHJlc2l6ZSwgcm90YXRlIG9yIGV4dHJhY3Qgb3BlcmF0aW9ucyBpbiB0aGUgc2FtZSBwcm9jZXNzaW5nIHBpcGVsaW5lXG4gKiB3aWxsIGFsd2F5cyBiZSBhcHBsaWVkIHRvIHRoZSBpbnB1dCBpbWFnZSBiZWZvcmUgY29tcG9zaXRpb24uXG4gKlxuICogVGhlIGBibGVuZGAgb3B0aW9uIGNhbiBiZSBvbmUgb2YgYGNsZWFyYCwgYHNvdXJjZWAsIGBvdmVyYCwgYGluYCwgYG91dGAsIGBhdG9wYCxcbiAqIGBkZXN0YCwgYGRlc3Qtb3ZlcmAsIGBkZXN0LWluYCwgYGRlc3Qtb3V0YCwgYGRlc3QtYXRvcGAsXG4gKiBgeG9yYCwgYGFkZGAsIGBzYXR1cmF0ZWAsIGBtdWx0aXBseWAsIGBzY3JlZW5gLCBgb3ZlcmxheWAsIGBkYXJrZW5gLCBgbGlnaHRlbmAsXG4gKiBgY29sb3VyLWRvZGdlYCwgYGNvbG9yLWRvZGdlYCwgYGNvbG91ci1idXJuYCxgY29sb3ItYnVybmAsXG4gKiBgaGFyZC1saWdodGAsIGBzb2Z0LWxpZ2h0YCwgYGRpZmZlcmVuY2VgLCBgZXhjbHVzaW9uYC5cbiAqXG4gKiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IGJsZW5kIG1vZGVzIGNhbiBiZSBmb3VuZCBhdFxuICogaHR0cHM6Ly93d3cubGlidmlwcy5vcmcvQVBJL2N1cnJlbnQvbGlidmlwcy1jb252ZXJzaW9uLmh0bWwjVmlwc0JsZW5kTW9kZVxuICogYW5kIGh0dHBzOi8vd3d3LmNhaXJvZ3JhcGhpY3Mub3JnL29wZXJhdG9ycy9cbiAqXG4gKiBAc2luY2UgMC4yMi4wXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHNoYXJwKGJhY2tncm91bmQpXG4gKiAgIC5jb21wb3NpdGUoW1xuICogICAgIHsgaW5wdXQ6IGxheWVyMSwgZ3Jhdml0eTogJ25vcnRod2VzdCcgfSxcbiAqICAgICB7IGlucHV0OiBsYXllcjIsIGdyYXZpdHk6ICdzb3V0aGVhc3QnIH0sXG4gKiAgIF0pXG4gKiAgIC50b0ZpbGUoJ2NvbWJpbmVkLnBuZycpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycCgnaW5wdXQuZ2lmJywgeyBhbmltYXRlZDogdHJ1ZSB9KVxuICogICAuY29tcG9zaXRlKFtcbiAqICAgICB7IGlucHV0OiAnb3ZlcmxheS5wbmcnLCB0aWxlOiB0cnVlLCBibGVuZDogJ3NhdHVyYXRlJyB9XG4gKiAgIF0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycCgnaW5wdXQucG5nJylcbiAqICAgLnJvdGF0ZSgxODApXG4gKiAgIC5yZXNpemUoMzAwKVxuICogICAuZmxhdHRlbiggeyBiYWNrZ3JvdW5kOiAnI2ZmNjYwMCcgfSApXG4gKiAgIC5jb21wb3NpdGUoW3sgaW5wdXQ6ICdvdmVybGF5LnBuZycsIGdyYXZpdHk6ICdzb3V0aGVhc3QnIH1dKVxuICogICAuc2hhcnBlbigpXG4gKiAgIC53aXRoTWV0YWRhdGEoKVxuICogICAud2VicCggeyBxdWFsaXR5OiA5MCB9IClcbiAqICAgLnRvQnVmZmVyKClcbiAqICAgLnRoZW4oZnVuY3Rpb24ob3V0cHV0QnVmZmVyKSB7XG4gKiAgICAgLy8gb3V0cHV0QnVmZmVyIGNvbnRhaW5zIHVwc2lkZSBkb3duLCAzMDBweCB3aWRlLCBhbHBoYSBjaGFubmVsIGZsYXR0ZW5lZFxuICogICAgIC8vIG9udG8gb3JhbmdlIGJhY2tncm91bmQsIGNvbXBvc2l0ZWQgd2l0aCBvdmVybGF5LnBuZyB3aXRoIFNFIGdyYXZpdHksXG4gKiAgICAgLy8gc2hhcnBlbmVkLCB3aXRoIG1ldGFkYXRhLCA5MCUgcXVhbGl0eSBXZWJQIGltYWdlIGRhdGEuIFBoZXchXG4gKiAgIH0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0W119IGltYWdlcyAtIE9yZGVyZWQgbGlzdCBvZiBpbWFnZXMgdG8gY29tcG9zaXRlXG4gKiBAcGFyYW0ge0J1ZmZlcnxTdHJpbmd9IFtpbWFnZXNbXS5pbnB1dF0gLSBCdWZmZXIgY29udGFpbmluZyBpbWFnZSBkYXRhLCBTdHJpbmcgY29udGFpbmluZyB0aGUgcGF0aCB0byBhbiBpbWFnZSBmaWxlLCBvciBDcmVhdGUgb2JqZWN0IChzZWUgYmVsb3cpXG4gKiBAcGFyYW0ge09iamVjdH0gW2ltYWdlc1tdLmlucHV0LmNyZWF0ZV0gLSBkZXNjcmliZXMgYSBibGFuayBvdmVybGF5IHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlc1tdLmlucHV0LmNyZWF0ZS53aWR0aF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10uaW5wdXQuY3JlYXRlLmhlaWdodF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10uaW5wdXQuY3JlYXRlLmNoYW5uZWxzXSAtIDMtNFxuICogQHBhcmFtIHtTdHJpbmd8T2JqZWN0fSBbaW1hZ2VzW10uaW5wdXQuY3JlYXRlLmJhY2tncm91bmRdIC0gcGFyc2VkIGJ5IHRoZSBbY29sb3JdKGh0dHBzOi8vd3d3Lm5wbWpzLm9yZy9wYWNrYWdlL2NvbG9yKSBtb2R1bGUgdG8gZXh0cmFjdCB2YWx1ZXMgZm9yIHJlZCwgZ3JlZW4sIGJsdWUgYW5kIGFscGhhLlxuICogQHBhcmFtIHtPYmplY3R9IFtpbWFnZXNbXS5pbnB1dC50ZXh0XSAtIGRlc2NyaWJlcyBhIG5ldyB0ZXh0IGltYWdlIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ltYWdlc1tdLmlucHV0LnRleHQudGV4dF0gLSB0ZXh0IHRvIHJlbmRlciBhcyBhIFVURi04IHN0cmluZy4gSXQgY2FuIGNvbnRhaW4gUGFuZ28gbWFya3VwLCBmb3IgZXhhbXBsZSBgPGk+TGU8L2k+TW9uZGVgLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbWFnZXNbXS5pbnB1dC50ZXh0LmZvbnRdIC0gZm9udCBuYW1lIHRvIHJlbmRlciB3aXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbWFnZXNbXS5pbnB1dC50ZXh0LmZvbnRmaWxlXSAtIGFic29sdXRlIGZpbGVzeXN0ZW0gcGF0aCB0byBhIGZvbnQgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IGBmb250YC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW1hZ2VzW10uaW5wdXQudGV4dC53aWR0aD0wXSAtIGludGVncmFsIG51bWJlciBvZiBwaXhlbHMgdG8gd29yZC13cmFwIGF0LiBMaW5lcyBvZiB0ZXh0IHdpZGVyIHRoYW4gdGhpcyB3aWxsIGJlIGJyb2tlbiBhdCB3b3JkIGJvdW5kYXJpZXMuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ltYWdlc1tdLmlucHV0LnRleHQuaGVpZ2h0PTBdIC0gaW50ZWdyYWwgbnVtYmVyIG9mIHBpeGVscyBoaWdoLiBXaGVuIGRlZmluZWQsIGBkcGlgIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlIHRleHQgd2lsbCBhdXRvbWF0aWNhbGx5IGZpdCB0aGUgcGl4ZWwgcmVzb2x1dGlvbiBkZWZpbmVkIGJ5IGB3aWR0aGAgYW5kIGBoZWlnaHRgLiBXaWxsIGJlIGlnbm9yZWQgaWYgYHdpZHRoYCBpcyBub3Qgc3BlY2lmaWVkIG9yIHNldCB0byAwLlxuICogQHBhcmFtIHtzdHJpbmd9IFtpbWFnZXNbXS5pbnB1dC50ZXh0LmFsaWduPSdsZWZ0J10gLSB0ZXh0IGFsaWdubWVudCAoYCdsZWZ0J2AsIGAnY2VudHJlJ2AsIGAnY2VudGVyJ2AsIGAncmlnaHQnYCkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbWFnZXNbXS5pbnB1dC50ZXh0Lmp1c3RpZnk9ZmFsc2VdIC0gc2V0IHRoaXMgdG8gdHJ1ZSB0byBhcHBseSBqdXN0aWZpY2F0aW9uIHRvIHRoZSB0ZXh0LlxuICogQHBhcmFtIHtudW1iZXJ9IFtpbWFnZXNbXS5pbnB1dC50ZXh0LmRwaT03Ml0gLSB0aGUgcmVzb2x1dGlvbiAoc2l6ZSkgYXQgd2hpY2ggdG8gcmVuZGVyIHRoZSB0ZXh0LiBEb2VzIG5vdCB0YWtlIGVmZmVjdCBpZiBgaGVpZ2h0YCBpcyBzcGVjaWZpZWQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtpbWFnZXNbXS5pbnB1dC50ZXh0LnJnYmE9ZmFsc2VdIC0gc2V0IHRoaXMgdG8gdHJ1ZSB0byBlbmFibGUgUkdCQSBvdXRwdXQuIFRoaXMgaXMgdXNlZnVsIGZvciBjb2xvdXIgZW1vamkgcmVuZGVyaW5nLCBvciBzdXBwb3J0IGZvciBQYW5nbyBtYXJrdXAgZmVhdHVyZXMgbGlrZSBgPHNwYW4gZm9yZWdyb3VuZD1cInJlZFwiPlJlZCE8L3NwYW4+YC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbaW1hZ2VzW10uaW5wdXQudGV4dC5zcGFjaW5nPTBdIC0gdGV4dCBsaW5lIGhlaWdodCBpbiBwb2ludHMuIFdpbGwgdXNlIHRoZSBmb250IGxpbmUgaGVpZ2h0IGlmIG5vbmUgaXMgc3BlY2lmaWVkLlxuICogQHBhcmFtIHtTdHJpbmd9IFtpbWFnZXNbXS5ibGVuZD0nb3ZlciddIC0gaG93IHRvIGJsZW5kIHRoaXMgaW1hZ2Ugd2l0aCB0aGUgaW1hZ2UgYmVsb3cuXG4gKiBAcGFyYW0ge1N0cmluZ30gW2ltYWdlc1tdLmdyYXZpdHk9J2NlbnRyZSddIC0gZ3Jhdml0eSBhdCB3aGljaCB0byBwbGFjZSB0aGUgb3ZlcmxheS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10udG9wXSAtIHRoZSBwaXhlbCBvZmZzZXQgZnJvbSB0aGUgdG9wIGVkZ2UuXG4gKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlc1tdLmxlZnRdIC0gdGhlIHBpeGVsIG9mZnNldCBmcm9tIHRoZSBsZWZ0IGVkZ2UuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpbWFnZXNbXS50aWxlPWZhbHNlXSAtIHNldCB0byB0cnVlIHRvIHJlcGVhdCB0aGUgb3ZlcmxheSBpbWFnZSBhY3Jvc3MgdGhlIGVudGlyZSBpbWFnZSB3aXRoIHRoZSBnaXZlbiBgZ3Jhdml0eWAuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtpbWFnZXNbXS5wcmVtdWx0aXBsaWVkPWZhbHNlXSAtIHNldCB0byB0cnVlIHRvIGF2b2lkIHByZW11bHRpcGx5aW5nIHRoZSBpbWFnZSBiZWxvdy4gRXF1aXZhbGVudCB0byB0aGUgYC0tcHJlbXVsdGlwbGllZGAgdmlwcyBvcHRpb24uXG4gKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlc1tdLmRlbnNpdHk9NzJdIC0gbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgRFBJIGZvciB2ZWN0b3Igb3ZlcmxheSBpbWFnZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW1hZ2VzW10ucmF3XSAtIGRlc2NyaWJlcyBvdmVybGF5IHdoZW4gdXNpbmcgcmF3IHBpeGVsIGRhdGEuXG4gKiBAcGFyYW0ge051bWJlcn0gW2ltYWdlc1tdLnJhdy53aWR0aF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10ucmF3LmhlaWdodF1cbiAqIEBwYXJhbSB7TnVtYmVyfSBbaW1hZ2VzW10ucmF3LmNoYW5uZWxzXVxuICogQHBhcmFtIHtib29sZWFufSBbaW1hZ2VzW10uYW5pbWF0ZWQ9ZmFsc2VdIC0gU2V0IHRvIGB0cnVlYCB0byByZWFkIGFsbCBmcmFtZXMvcGFnZXMgb2YgYW4gYW5pbWF0ZWQgaW1hZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2ltYWdlc1tdLmZhaWxPbj0nd2FybmluZyddIC0gQHNlZSB7QGxpbmsgL2FwaS1jb25zdHJ1Y3RvciNwYXJhbWV0ZXJzfGNvbnN0cnVjdG9yIHBhcmFtZXRlcnN9XG4gKiBAcGFyYW0ge251bWJlcnxib29sZWFufSBbaW1hZ2VzW10ubGltaXRJbnB1dFBpeGVscz0yNjg0MDI2ODldIC0gQHNlZSB7QGxpbmsgL2FwaS1jb25zdHJ1Y3RvciNwYXJhbWV0ZXJzfGNvbnN0cnVjdG9yIHBhcmFtZXRlcnN9XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2l0ZSAoaW1hZ2VzKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShpbWFnZXMpKSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdpbWFnZXMgdG8gY29tcG9zaXRlJywgJ2FycmF5JywgaW1hZ2VzKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMuY29tcG9zaXRlID0gaW1hZ2VzLm1hcChpbWFnZSA9PiB7XG4gICAgaWYgKCFpcy5vYmplY3QoaW1hZ2UpKSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2ltYWdlIHRvIGNvbXBvc2l0ZScsICdvYmplY3QnLCBpbWFnZSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0T3B0aW9ucyA9IHRoaXMuX2lucHV0T3B0aW9uc0Zyb21PYmplY3QoaW1hZ2UpO1xuICAgIGNvbnN0IGNvbXBvc2l0ZSA9IHtcbiAgICAgIGlucHV0OiB0aGlzLl9jcmVhdGVJbnB1dERlc2NyaXB0b3IoaW1hZ2UuaW5wdXQsIGlucHV0T3B0aW9ucywgeyBhbGxvd1N0cmVhbTogZmFsc2UgfSksXG4gICAgICBibGVuZDogJ292ZXInLFxuICAgICAgdGlsZTogZmFsc2UsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgICAgaGFzT2Zmc2V0OiBmYWxzZSxcbiAgICAgIGdyYXZpdHk6IDAsXG4gICAgICBwcmVtdWx0aXBsaWVkOiBmYWxzZVxuICAgIH07XG4gICAgaWYgKGlzLmRlZmluZWQoaW1hZ2UuYmxlbmQpKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKGJsZW5kW2ltYWdlLmJsZW5kXSkpIHtcbiAgICAgICAgY29tcG9zaXRlLmJsZW5kID0gYmxlbmRbaW1hZ2UuYmxlbmRdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdibGVuZCcsICd2YWxpZCBibGVuZCBuYW1lJywgaW1hZ2UuYmxlbmQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChpbWFnZS50aWxlKSkge1xuICAgICAgaWYgKGlzLmJvb2woaW1hZ2UudGlsZSkpIHtcbiAgICAgICAgY29tcG9zaXRlLnRpbGUgPSBpbWFnZS50aWxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0aWxlJywgJ2Jvb2xlYW4nLCBpbWFnZS50aWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQoaW1hZ2UubGVmdCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGltYWdlLmxlZnQpKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5sZWZ0ID0gaW1hZ2UubGVmdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbGVmdCcsICdpbnRlZ2VyJywgaW1hZ2UubGVmdCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGltYWdlLnRvcCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGltYWdlLnRvcCkpIHtcbiAgICAgICAgY29tcG9zaXRlLnRvcCA9IGltYWdlLnRvcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndG9wJywgJ2ludGVnZXInLCBpbWFnZS50b3ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChpbWFnZS50b3ApICE9PSBpcy5kZWZpbmVkKGltYWdlLmxlZnQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGJvdGggbGVmdCBhbmQgdG9wIHRvIGJlIHNldCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb21wb3NpdGUuaGFzT2Zmc2V0ID0gaXMuaW50ZWdlcihpbWFnZS50b3ApICYmIGlzLmludGVnZXIoaW1hZ2UubGVmdCk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGltYWdlLmdyYXZpdHkpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihpbWFnZS5ncmF2aXR5KSAmJiBpcy5pblJhbmdlKGltYWdlLmdyYXZpdHksIDAsIDgpKSB7XG4gICAgICAgIGNvbXBvc2l0ZS5ncmF2aXR5ID0gaW1hZ2UuZ3Jhdml0eTtcbiAgICAgIH0gZWxzZSBpZiAoaXMuc3RyaW5nKGltYWdlLmdyYXZpdHkpICYmIGlzLmludGVnZXIodGhpcy5jb25zdHJ1Y3Rvci5ncmF2aXR5W2ltYWdlLmdyYXZpdHldKSkge1xuICAgICAgICBjb21wb3NpdGUuZ3Jhdml0eSA9IHRoaXMuY29uc3RydWN0b3IuZ3Jhdml0eVtpbWFnZS5ncmF2aXR5XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZ3Jhdml0eScsICd2YWxpZCBncmF2aXR5JywgaW1hZ2UuZ3Jhdml0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKGltYWdlLnByZW11bHRpcGxpZWQpKSB7XG4gICAgICBpZiAoaXMuYm9vbChpbWFnZS5wcmVtdWx0aXBsaWVkKSkge1xuICAgICAgICBjb21wb3NpdGUucHJlbXVsdGlwbGllZCA9IGltYWdlLnByZW11bHRpcGxpZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3ByZW11bHRpcGxpZWQnLCAnYm9vbGVhbicsIGltYWdlLnByZW11bHRpcGxpZWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tcG9zaXRlO1xuICB9KTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogRGVjb3JhdGUgdGhlIFNoYXJwIHByb3RvdHlwZSB3aXRoIGNvbXBvc2l0ZS1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFNoYXJwKSB7XG4gIFNoYXJwLnByb3RvdHlwZS5jb21wb3NpdGUgPSBjb21wb3NpdGU7XG4gIFNoYXJwLmJsZW5kID0gYmxlbmQ7XG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGNvbG9yID0gcmVxdWlyZSgnY29sb3InKTtcbmNvbnN0IGlzID0gcmVxdWlyZSgnLi9pcycpO1xuXG4vKipcbiAqIEhvdyBhY2N1cmF0ZSBhbiBvcGVyYXRpb24gc2hvdWxkIGJlLlxuICogQG1lbWJlclxuICogQHByaXZhdGVcbiAqL1xuY29uc3Qgdmlwc1ByZWNpc2lvbiA9IHtcbiAgaW50ZWdlcjogJ2ludGVnZXInLFxuICBmbG9hdDogJ2Zsb2F0JyxcbiAgYXBwcm94aW1hdGU6ICdhcHByb3hpbWF0ZSdcbn07XG5cbi8qKlxuICogUm90YXRlIHRoZSBvdXRwdXQgaW1hZ2UgYnkgZWl0aGVyIGFuIGV4cGxpY2l0IGFuZ2xlXG4gKiBvciBhdXRvLW9yaWVudCBiYXNlZCBvbiB0aGUgRVhJRiBgT3JpZW50YXRpb25gIHRhZy5cbiAqXG4gKiBJZiBhbiBhbmdsZSBpcyBwcm92aWRlZCwgaXQgaXMgY29udmVydGVkIHRvIGEgdmFsaWQgcG9zaXRpdmUgZGVncmVlIHJvdGF0aW9uLlxuICogRm9yIGV4YW1wbGUsIGAtNDUwYCB3aWxsIHByb2R1Y2UgYSAyNzAgZGVncmVlIHJvdGF0aW9uLlxuICpcbiAqIFdoZW4gcm90YXRpbmcgYnkgYW4gYW5nbGUgb3RoZXIgdGhhbiBhIG11bHRpcGxlIG9mIDkwLFxuICogdGhlIGJhY2tncm91bmQgY29sb3VyIGNhbiBiZSBwcm92aWRlZCB3aXRoIHRoZSBgYmFja2dyb3VuZGAgb3B0aW9uLlxuICpcbiAqIElmIG5vIGFuZ2xlIGlzIHByb3ZpZGVkLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIEVYSUYgZGF0YS5cbiAqIE1pcnJvcmluZyBpcyBzdXBwb3J0ZWQgYW5kIG1heSBpbmZlciB0aGUgdXNlIG9mIGEgZmxpcCBvcGVyYXRpb24uXG4gKlxuICogVGhlIHVzZSBvZiBgcm90YXRlYCB3aXRob3V0IGFuIGFuZ2xlIHdpbGwgcmVtb3ZlIHRoZSBFWElGIGBPcmllbnRhdGlvbmAgdGFnLCBpZiBhbnkuXG4gKlxuICogT25seSBvbmUgcm90YXRpb24gY2FuIG9jY3VyIHBlciBwaXBlbGluZS5cbiAqIFByZXZpb3VzIGNhbGxzIHRvIGByb3RhdGVgIGluIHRoZSBzYW1lIHBpcGVsaW5lIHdpbGwgYmUgaWdub3JlZC5cbiAqXG4gKiBNdWx0aS1wYWdlIGltYWdlcyBjYW4gb25seSBiZSByb3RhdGVkIGJ5IDE4MCBkZWdyZWVzLlxuICpcbiAqIE1ldGhvZCBvcmRlciBpcyBpbXBvcnRhbnQgd2hlbiByb3RhdGluZywgcmVzaXppbmcgYW5kL29yIGV4dHJhY3RpbmcgcmVnaW9ucyxcbiAqIGZvciBleGFtcGxlIGAucm90YXRlKHgpLmV4dHJhY3QoeSlgIHdpbGwgcHJvZHVjZSBhIGRpZmZlcmVudCByZXN1bHQgdG8gYC5leHRyYWN0KHkpLnJvdGF0ZSh4KWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHBpcGVsaW5lID0gc2hhcnAoKVxuICogICAucm90YXRlKClcbiAqICAgLnJlc2l6ZShudWxsLCAyMDApXG4gKiAgIC50b0J1ZmZlcihmdW5jdGlvbiAoZXJyLCBvdXRwdXRCdWZmZXIsIGluZm8pIHtcbiAqICAgICAvLyBvdXRwdXRCdWZmZXIgY29udGFpbnMgMjAwcHggaGlnaCBKUEVHIGltYWdlIGRhdGEsXG4gKiAgICAgLy8gYXV0by1yb3RhdGVkIHVzaW5nIEVYSUYgT3JpZW50YXRpb24gdGFnXG4gKiAgICAgLy8gaW5mby53aWR0aCBhbmQgaW5mby5oZWlnaHQgY29udGFpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcmVzaXplZCBpbWFnZVxuICogICB9KTtcbiAqIHJlYWRhYmxlU3RyZWFtLnBpcGUocGlwZWxpbmUpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByb3RhdGVUaGVuUmVzaXplID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5yb3RhdGUoOTApXG4gKiAgIC5yZXNpemUoeyB3aWR0aDogMTYsIGhlaWdodDogOCwgZml0OiAnZmlsbCcgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKiBjb25zdCByZXNpemVUaGVuUm90YXRlID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5yZXNpemUoeyB3aWR0aDogMTYsIGhlaWdodDogOCwgZml0OiAnZmlsbCcgfSlcbiAqICAgLnJvdGF0ZSg5MClcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFthbmdsZT1hdXRvXSBhbmdsZSBvZiByb3RhdGlvbi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBpZiBwcmVzZW50LCBpcyBhbiBPYmplY3Qgd2l0aCBvcHRpb25hbCBhdHRyaWJ1dGVzLlxuICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBbb3B0aW9ucy5iYWNrZ3JvdW5kPVwiIzAwMDAwMFwiXSBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSB0byBleHRyYWN0IHZhbHVlcyBmb3IgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZSAoYW5nbGUsIG9wdGlvbnMpIHtcbiAgaWYgKHRoaXMub3B0aW9ucy51c2VFeGlmT3JpZW50YXRpb24gfHwgdGhpcy5vcHRpb25zLmFuZ2xlIHx8IHRoaXMub3B0aW9ucy5yb3RhdGlvbkFuZ2xlKSB7XG4gICAgdGhpcy5vcHRpb25zLmRlYnVnbG9nKCdpZ25vcmluZyBwcmV2aW91cyByb3RhdGUgb3B0aW9ucycpO1xuICB9XG4gIGlmICghaXMuZGVmaW5lZChhbmdsZSkpIHtcbiAgICB0aGlzLm9wdGlvbnMudXNlRXhpZk9yaWVudGF0aW9uID0gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpcy5pbnRlZ2VyKGFuZ2xlKSAmJiAhKGFuZ2xlICUgOTApKSB7XG4gICAgdGhpcy5vcHRpb25zLmFuZ2xlID0gYW5nbGU7XG4gIH0gZWxzZSBpZiAoaXMubnVtYmVyKGFuZ2xlKSkge1xuICAgIHRoaXMub3B0aW9ucy5yb3RhdGlvbkFuZ2xlID0gYW5nbGU7XG4gICAgaWYgKGlzLm9iamVjdChvcHRpb25zKSAmJiBvcHRpb25zLmJhY2tncm91bmQpIHtcbiAgICAgIGNvbnN0IGJhY2tncm91bmRDb2xvdXIgPSBjb2xvcihvcHRpb25zLmJhY2tncm91bmQpO1xuICAgICAgdGhpcy5vcHRpb25zLnJvdGF0aW9uQmFja2dyb3VuZCA9IFtcbiAgICAgICAgYmFja2dyb3VuZENvbG91ci5yZWQoKSxcbiAgICAgICAgYmFja2dyb3VuZENvbG91ci5ncmVlbigpLFxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3VyLmJsdWUoKSxcbiAgICAgICAgTWF0aC5yb3VuZChiYWNrZ3JvdW5kQ29sb3VyLmFscGhhKCkgKiAyNTUpXG4gICAgICBdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2FuZ2xlJywgJ251bWVyaWMnLCBhbmdsZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogTWlycm9yIHRoZSBpbWFnZSB2ZXJ0aWNhbGx5ICh1cC1kb3duKSBhYm91dCB0aGUgeC1heGlzLlxuICogVGhpcyBhbHdheXMgb2NjdXJzIGJlZm9yZSByb3RhdGlvbiwgaWYgYW55LlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggbXVsdGktcGFnZSBpbWFnZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNoYXJwKGlucHV0KS5mbGlwKCkudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtmbGlwPXRydWVdXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIGZsaXAgKGZsaXApIHtcbiAgdGhpcy5vcHRpb25zLmZsaXAgPSBpcy5ib29sKGZsaXApID8gZmxpcCA6IHRydWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIE1pcnJvciB0aGUgaW1hZ2UgaG9yaXpvbnRhbGx5IChsZWZ0LXJpZ2h0KSBhYm91dCB0aGUgeS1heGlzLlxuICogVGhpcyBhbHdheXMgb2NjdXJzIGJlZm9yZSByb3RhdGlvbiwgaWYgYW55LlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dCkuZmxvcCgpLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbZmxvcD10cnVlXVxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBmbG9wIChmbG9wKSB7XG4gIHRoaXMub3B0aW9ucy5mbG9wID0gaXMuYm9vbChmbG9wKSA/IGZsb3AgOiB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBQZXJmb3JtIGFuIGFmZmluZSB0cmFuc2Zvcm0gb24gYW4gaW1hZ2UuIFRoaXMgb3BlcmF0aW9uIHdpbGwgYWx3YXlzIG9jY3VyIGFmdGVyIHJlc2l6aW5nLCBleHRyYWN0aW9uIGFuZCByb3RhdGlvbiwgaWYgYW55LlxuICpcbiAqIFlvdSBtdXN0IHByb3ZpZGUgYW4gYXJyYXkgb2YgbGVuZ3RoIDQgb3IgYSAyeDIgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC5cbiAqIEJ5IGRlZmF1bHQsIG5ldyBwaXhlbHMgYXJlIGZpbGxlZCB3aXRoIGEgYmxhY2sgYmFja2dyb3VuZC4gWW91IGNhbiBwcm92aWRlIGEgYmFja2dyb3VuZCBjb2xvciB3aXRoIHRoZSBgYmFja2dyb3VuZGAgb3B0aW9uLlxuICogQSBwYXJ0aWN1bGFyIGludGVycG9sYXRvciBtYXkgYWxzbyBiZSBzcGVjaWZpZWQuIFNldCB0aGUgYGludGVycG9sYXRvcmAgb3B0aW9uIHRvIGFuIGF0dHJpYnV0ZSBvZiB0aGUgYHNoYXJwLmludGVycG9sYXRvcnNgIE9iamVjdCBlLmcuIGBzaGFycC5pbnRlcnBvbGF0b3JzLm5vaGFsb2AuXG4gKlxuICogSW4gdGhlIGNhc2Ugb2YgYSAyeDIgbWF0cml4LCB0aGUgdHJhbnNmb3JtIGlzOlxuICogLSBYID0gYG1hdHJpeFswLCAwXWAgXFwqICh4ICsgYGlkeGApICsgYG1hdHJpeFswLCAxXWAgXFwqICh5ICsgYGlkeWApICsgYG9keGBcbiAqIC0gWSA9IGBtYXRyaXhbMSwgMF1gIFxcKiAoeCArIGBpZHhgKSArIGBtYXRyaXhbMSwgMV1gIFxcKiAoeSArIGBpZHlgKSArIGBvZHlgXG4gKlxuICogd2hlcmU6XG4gKiAtIHggYW5kIHkgYXJlIHRoZSBjb29yZGluYXRlcyBpbiBpbnB1dCBpbWFnZS5cbiAqIC0gWCBhbmQgWSBhcmUgdGhlIGNvb3JkaW5hdGVzIGluIG91dHB1dCBpbWFnZS5cbiAqIC0gKDAsMCkgaXMgdGhlIHVwcGVyIGxlZnQgY29ybmVyLlxuICpcbiAqIEBzaW5jZSAwLjI3LjBcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgcGlwZWxpbmUgPSBzaGFycCgpXG4gKiAgIC5hZmZpbmUoW1sxLCAwLjNdLCBbMC4xLCAwLjddXSwge1xuICogICAgICBiYWNrZ3JvdW5kOiAnd2hpdGUnLFxuICogICAgICBpbnRlcnBvbGF0b3I6IHNoYXJwLmludGVycG9sYXRvcnMubm9oYWxvXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigoZXJyLCBvdXRwdXRCdWZmZXIsIGluZm8pID0+IHtcbiAqICAgICAgLy8gb3V0cHV0QnVmZmVyIGNvbnRhaW5zIHRoZSB0cmFuc2Zvcm1lZCBpbWFnZVxuICogICAgICAvLyBpbmZvLndpZHRoIGFuZCBpbmZvLmhlaWdodCBjb250YWluIHRoZSBuZXcgZGltZW5zaW9uc1xuICogICB9KTtcbiAqXG4gKiBpbnB1dFN0cmVhbVxuICogICAucGlwZShwaXBlbGluZSk7XG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+PnxBcnJheTxudW1iZXI+fSBtYXRyaXggLSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gbWF0cml4XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gaWYgcHJlc2VudCwgaXMgYW4gT2JqZWN0IHdpdGggb3B0aW9uYWwgYXR0cmlidXRlcy5cbiAqIEBwYXJhbSB7U3RyaW5nfE9iamVjdH0gW29wdGlvbnMuYmFja2dyb3VuZD1cIiMwMDAwMDBcIl0gLSBwYXJzZWQgYnkgdGhlIFtjb2xvcl0oaHR0cHM6Ly93d3cubnBtanMub3JnL3BhY2thZ2UvY29sb3IpIG1vZHVsZSB0byBleHRyYWN0IHZhbHVlcyBmb3IgcmVkLCBncmVlbiwgYmx1ZSBhbmQgYWxwaGEuXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaWR4PTBdIC0gaW5wdXQgaG9yaXpvbnRhbCBvZmZzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pZHk9MF0gLSBpbnB1dCB2ZXJ0aWNhbCBvZmZzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5vZHg9MF0gLSBvdXRwdXQgaG9yaXpvbnRhbCBvZmZzZXRcbiAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5vZHk9MF0gLSBvdXRwdXQgdmVydGljYWwgb2Zmc2V0XG4gKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuaW50ZXJwb2xhdG9yPXNoYXJwLmludGVycG9sYXRvcnMuYmljdWJpY10gLSBpbnRlcnBvbGF0b3JcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gYWZmaW5lIChtYXRyaXgsIG9wdGlvbnMpIHtcbiAgY29uc3QgZmxhdE1hdHJpeCA9IFtdLmNvbmNhdCguLi5tYXRyaXgpO1xuICBpZiAoZmxhdE1hdHJpeC5sZW5ndGggPT09IDQgJiYgZmxhdE1hdHJpeC5ldmVyeShpcy5udW1iZXIpKSB7XG4gICAgdGhpcy5vcHRpb25zLmFmZmluZU1hdHJpeCA9IGZsYXRNYXRyaXg7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdtYXRyaXgnLCAnMXg0IG9yIDJ4MiBhcnJheScsIG1hdHJpeCk7XG4gIH1cblxuICBpZiAoaXMuZGVmaW5lZChvcHRpb25zKSkge1xuICAgIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvdXJPcHRpb24oJ2FmZmluZUJhY2tncm91bmQnLCBvcHRpb25zLmJhY2tncm91bmQpO1xuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5pZHgpKSB7XG4gICAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5pZHgpKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFmZmluZUlkeCA9IG9wdGlvbnMuaWR4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy5pZHgnLCAnbnVtYmVyJywgb3B0aW9ucy5pZHgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmlkeSkpIHtcbiAgICAgICAgaWYgKGlzLm51bWJlcihvcHRpb25zLmlkeSkpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYWZmaW5lSWR5ID0gb3B0aW9ucy5pZHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zLmlkeScsICdudW1iZXInLCBvcHRpb25zLmlkeSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMub2R4KSkge1xuICAgICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMub2R4KSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5hZmZpbmVPZHggPSBvcHRpb25zLm9keDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMub2R4JywgJ251bWJlcicsIG9wdGlvbnMub2R4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5vZHkpKSB7XG4gICAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5vZHkpKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmFmZmluZU9keSA9IG9wdGlvbnMub2R5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy5vZHknLCAnbnVtYmVyJywgb3B0aW9ucy5vZHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmludGVycG9sYXRvcikpIHtcbiAgICAgICAgaWYgKGlzLmluQXJyYXkob3B0aW9ucy5pbnRlcnBvbGF0b3IsIE9iamVjdC52YWx1ZXModGhpcy5jb25zdHJ1Y3Rvci5pbnRlcnBvbGF0b3JzKSkpIHtcbiAgICAgICAgICB0aGlzLm9wdGlvbnMuYWZmaW5lSW50ZXJwb2xhdG9yID0gb3B0aW9ucy5pbnRlcnBvbGF0b3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zLmludGVycG9sYXRvcicsICd2YWxpZCBpbnRlcnBvbGF0b3IgbmFtZScsIG9wdGlvbnMuaW50ZXJwb2xhdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMnLCAnb2JqZWN0Jywgb3B0aW9ucyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogU2hhcnBlbiB0aGUgaW1hZ2UuXG4gKlxuICogV2hlbiB1c2VkIHdpdGhvdXQgcGFyYW1ldGVycywgcGVyZm9ybXMgYSBmYXN0LCBtaWxkIHNoYXJwZW4gb2YgdGhlIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBXaGVuIGEgYHNpZ21hYCBpcyBwcm92aWRlZCwgcGVyZm9ybXMgYSBzbG93ZXIsIG1vcmUgYWNjdXJhdGUgc2hhcnBlbiBvZiB0aGUgTCBjaGFubmVsIGluIHRoZSBMQUIgY29sb3VyIHNwYWNlLlxuICogRmluZS1ncmFpbmVkIGNvbnRyb2wgb3ZlciB0aGUgbGV2ZWwgb2Ygc2hhcnBlbmluZyBpbiBcImZsYXRcIiAobTEpIGFuZCBcImphZ2dlZFwiIChtMikgYXJlYXMgaXMgYXZhaWxhYmxlLlxuICpcbiAqIFNlZSB7QGxpbmsgaHR0cHM6Ly93d3cubGlidmlwcy5vcmcvQVBJL2N1cnJlbnQvbGlidmlwcy1jb252b2x1dGlvbi5odG1sI3ZpcHMtc2hhcnBlbnxsaWJ2aXBzIHNoYXJwZW59IG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KS5zaGFycGVuKCkudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KS5zaGFycGVuKHsgc2lnbWE6IDIgfSkudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuc2hhcnBlbih7XG4gKiAgICAgc2lnbWE6IDIsXG4gKiAgICAgbTE6IDAsXG4gKiAgICAgbTI6IDMsXG4gKiAgICAgeDE6IDMsXG4gKiAgICAgeTI6IDE1LFxuICogICAgIHkzOiAxNSxcbiAqICAgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R8bnVtYmVyfSBbb3B0aW9uc10gLSBpZiBwcmVzZW50LCBpcyBhbiBPYmplY3Qgd2l0aCBhdHRyaWJ1dGVzXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2lnbWFdIC0gdGhlIHNpZ21hIG9mIHRoZSBHYXVzc2lhbiBtYXNrLCB3aGVyZSBgc2lnbWEgPSAxICsgcmFkaXVzIC8gMmAsIGJldHdlZW4gMC4wMDAwMDEgYW5kIDEwXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubTE9MS4wXSAtIHRoZSBsZXZlbCBvZiBzaGFycGVuaW5nIHRvIGFwcGx5IHRvIFwiZmxhdFwiIGFyZWFzLCBiZXR3ZWVuIDAgYW5kIDEwMDAwMDBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tMj0yLjBdIC0gdGhlIGxldmVsIG9mIHNoYXJwZW5pbmcgdG8gYXBwbHkgdG8gXCJqYWdnZWRcIiBhcmVhcywgYmV0d2VlbiAwIGFuZCAxMDAwMDAwXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMueDE9Mi4wXSAtIHRocmVzaG9sZCBiZXR3ZWVuIFwiZmxhdFwiIGFuZCBcImphZ2dlZFwiLCBiZXR3ZWVuIDAgYW5kIDEwMDAwMDBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy55Mj0xMC4wXSAtIG1heGltdW0gYW1vdW50IG9mIGJyaWdodGVuaW5nLCBiZXR3ZWVuIDAgYW5kIDEwMDAwMDBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy55Mz0yMC4wXSAtIG1heGltdW0gYW1vdW50IG9mIGRhcmtlbmluZywgYmV0d2VlbiAwIGFuZCAxMDAwMDAwXG4gKiBAcGFyYW0ge251bWJlcn0gW2ZsYXRdIC0gKGRlcHJlY2F0ZWQpIHNlZSBgb3B0aW9ucy5tMWAuXG4gKiBAcGFyYW0ge251bWJlcn0gW2phZ2dlZF0gLSAoZGVwcmVjYXRlZCkgc2VlIGBvcHRpb25zLm0yYC5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gc2hhcnBlbiAob3B0aW9ucywgZmxhdCwgamFnZ2VkKSB7XG4gIGlmICghaXMuZGVmaW5lZChvcHRpb25zKSkge1xuICAgIC8vIE5vIGFyZ3VtZW50czogZGVmYXVsdCB0byBtaWxkIHNoYXJwZW5cbiAgICB0aGlzLm9wdGlvbnMuc2hhcnBlblNpZ21hID0gLTE7XG4gIH0gZWxzZSBpZiAoaXMuYm9vbChvcHRpb25zKSkge1xuICAgIC8vIERlcHJlY2F0ZWQgYm9vbGVhbiBhcmd1bWVudDogYXBwbHkgbWlsZCBzaGFycGVuP1xuICAgIHRoaXMub3B0aW9ucy5zaGFycGVuU2lnbWEgPSBvcHRpb25zID8gLTEgOiAwO1xuICB9IGVsc2UgaWYgKGlzLm51bWJlcihvcHRpb25zKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMsIDAuMDEsIDEwMDAwKSkge1xuICAgIC8vIERlcHJlY2F0ZWQgbnVtZXJpYyBhcmd1bWVudDogc3BlY2lmaWMgc2lnbWFcbiAgICB0aGlzLm9wdGlvbnMuc2hhcnBlblNpZ21hID0gb3B0aW9ucztcbiAgICAvLyBEZXByZWNhdGVkIGNvbnRyb2wgb3ZlciBmbGF0IGFyZWFzXG4gICAgaWYgKGlzLmRlZmluZWQoZmxhdCkpIHtcbiAgICAgIGlmIChpcy5udW1iZXIoZmxhdCkgJiYgaXMuaW5SYW5nZShmbGF0LCAwLCAxMDAwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5NMSA9IGZsYXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2ZsYXQnLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwMDAnLCBmbGF0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gRGVwcmVjYXRlZCBjb250cm9sIG92ZXIgamFnZ2VkIGFyZWFzXG4gICAgaWYgKGlzLmRlZmluZWQoamFnZ2VkKSkge1xuICAgICAgaWYgKGlzLm51bWJlcihqYWdnZWQpICYmIGlzLmluUmFuZ2UoamFnZ2VkLCAwLCAxMDAwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5NMiA9IGphZ2dlZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignamFnZ2VkJywgJ251bWJlciBiZXR3ZWVuIDAgYW5kIDEwMDAwJywgamFnZ2VkKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSBpZiAoaXMucGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMuc2lnbWEpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5zaWdtYSwgMC4wMDAwMDEsIDEwKSkge1xuICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5TaWdtYSA9IG9wdGlvbnMuc2lnbWE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy5zaWdtYScsICdudW1iZXIgYmV0d2VlbiAwLjAwMDAwMSBhbmQgMTAnLCBvcHRpb25zLnNpZ21hKTtcbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5tMSkpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5tMSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLm0xLCAwLCAxMDAwMDAwKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc2hhcnBlbk0xID0gb3B0aW9ucy5tMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy5tMScsICdudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAwMDAwJywgb3B0aW9ucy5tMSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubTIpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMubTIpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5tMiwgMCwgMTAwMDAwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5NMiA9IG9wdGlvbnMubTI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMubTInLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwMDAwMCcsIG9wdGlvbnMubTIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLngxKSkge1xuICAgICAgaWYgKGlzLm51bWJlcihvcHRpb25zLngxKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMueDEsIDAsIDEwMDAwMDApKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5zaGFycGVuWDEgPSBvcHRpb25zLngxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zLngxJywgJ251bWJlciBiZXR3ZWVuIDAgYW5kIDEwMDAwMDAnLCBvcHRpb25zLngxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy55MikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy55MikgJiYgaXMuaW5SYW5nZShvcHRpb25zLnkyLCAwLCAxMDAwMDAwKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuc2hhcnBlblkyID0gb3B0aW9ucy55MjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucy55MicsICdudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAwMDAwJywgb3B0aW9ucy55Mik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMueTMpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMueTMpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy55MywgMCwgMTAwMDAwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnNoYXJwZW5ZMyA9IG9wdGlvbnMueTM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMueTMnLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgMTAwMDAwMCcsIG9wdGlvbnMueTMpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3NpZ21hJywgJ251bWJlciBiZXR3ZWVuIDAuMDEgYW5kIDEwMDAwJywgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQXBwbHkgbWVkaWFuIGZpbHRlci5cbiAqIFdoZW4gdXNlZCB3aXRob3V0IHBhcmFtZXRlcnMgdGhlIGRlZmF1bHQgd2luZG93IGlzIDN4My5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpLm1lZGlhbigpLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNoYXJwKGlucHV0KS5tZWRpYW4oNSkudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW3NpemU9M10gc3F1YXJlIG1hc2sgc2l6ZTogc2l6ZSB4IHNpemVcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gbWVkaWFuIChzaXplKSB7XG4gIGlmICghaXMuZGVmaW5lZChzaXplKSkge1xuICAgIC8vIE5vIGFyZ3VtZW50czogZGVmYXVsdCB0byAzeDNcbiAgICB0aGlzLm9wdGlvbnMubWVkaWFuU2l6ZSA9IDM7XG4gIH0gZWxzZSBpZiAoaXMuaW50ZWdlcihzaXplKSAmJiBpcy5pblJhbmdlKHNpemUsIDEsIDEwMDApKSB7XG4gICAgLy8gTnVtZXJpYyBhcmd1bWVudDogc3BlY2lmaWMgc2lnbWFcbiAgICB0aGlzLm9wdGlvbnMubWVkaWFuU2l6ZSA9IHNpemU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdzaXplJywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAwJywgc2l6ZSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQmx1ciB0aGUgaW1hZ2UuXG4gKlxuICogV2hlbiB1c2VkIHdpdGhvdXQgcGFyYW1ldGVycywgcGVyZm9ybXMgYSBmYXN0IDN4MyBib3ggYmx1ciAoZXF1aXZhbGVudCB0byBhIGJveCBsaW5lYXIgZmlsdGVyKS5cbiAqXG4gKiBXaGVuIGEgYHNpZ21hYCBpcyBwcm92aWRlZCwgcGVyZm9ybXMgYSBzbG93ZXIsIG1vcmUgYWNjdXJhdGUgR2F1c3NpYW4gYmx1ci5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYm94Qmx1cnJlZCA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuYmx1cigpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBnYXVzc2lhbkJsdXJyZWQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmJsdXIoNSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R8bnVtYmVyfEJvb2xlYW59IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnNpZ21hXSBhIHZhbHVlIGJldHdlZW4gMC4zIGFuZCAxMDAwIHJlcHJlc2VudGluZyB0aGUgc2lnbWEgb2YgdGhlIEdhdXNzaWFuIG1hc2ssIHdoZXJlIGBzaWdtYSA9IDEgKyByYWRpdXMgLyAyYC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5wcmVjaXNpb249J2ludGVnZXInXSBIb3cgYWNjdXJhdGUgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUsIG9uZSBvZjogaW50ZWdlciwgZmxvYXQsIGFwcHJveGltYXRlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm1pbkFtcGxpdHVkZT0wLjJdIEEgdmFsdWUgYmV0d2VlbiAwLjAwMSBhbmQgMS4gQSBzbWFsbGVyIHZhbHVlIHdpbGwgZ2VuZXJhdGUgYSBsYXJnZXIsIG1vcmUgYWNjdXJhdGUgbWFzay5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gYmx1ciAob3B0aW9ucykge1xuICBsZXQgc2lnbWE7XG4gIGlmIChpcy5udW1iZXIob3B0aW9ucykpIHtcbiAgICBzaWdtYSA9IG9wdGlvbnM7XG4gIH0gZWxzZSBpZiAoaXMucGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICBpZiAoIWlzLm51bWJlcihvcHRpb25zLnNpZ21hKSkge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zLnNpZ21hJywgJ251bWJlciBiZXR3ZWVuIDAuMyBhbmQgMTAwMCcsIHNpZ21hKTtcbiAgICB9XG4gICAgc2lnbWEgPSBvcHRpb25zLnNpZ21hO1xuICAgIGlmICgncHJlY2lzaW9uJyBpbiBvcHRpb25zKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKHZpcHNQcmVjaXNpb25bb3B0aW9ucy5wcmVjaXNpb25dKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMucHJlY2lzaW9uID0gdmlwc1ByZWNpc2lvbltvcHRpb25zLnByZWNpc2lvbl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3ByZWNpc2lvbicsICdvbmUgb2Y6IGludGVnZXIsIGZsb2F0LCBhcHByb3hpbWF0ZScsIG9wdGlvbnMucHJlY2lzaW9uKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCdtaW5BbXBsaXR1ZGUnIGluIG9wdGlvbnMpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5taW5BbXBsaXR1ZGUpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5taW5BbXBsaXR1ZGUsIDAuMDAxLCAxKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMubWluQW1wbCA9IG9wdGlvbnMubWluQW1wbGl0dWRlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdtaW5BbXBsaXR1ZGUnLCAnbnVtYmVyIGJldHdlZW4gMC4wMDEgYW5kIDEnLCBvcHRpb25zLm1pbkFtcGxpdHVkZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKCFpcy5kZWZpbmVkKG9wdGlvbnMpKSB7XG4gICAgLy8gTm8gYXJndW1lbnRzOiBkZWZhdWx0IHRvIG1pbGQgYmx1clxuICAgIHRoaXMub3B0aW9ucy5ibHVyU2lnbWEgPSAtMTtcbiAgfSBlbHNlIGlmIChpcy5ib29sKG9wdGlvbnMpKSB7XG4gICAgLy8gQm9vbGVhbiBhcmd1bWVudDogYXBwbHkgbWlsZCBibHVyP1xuICAgIHRoaXMub3B0aW9ucy5ibHVyU2lnbWEgPSBvcHRpb25zID8gLTEgOiAwO1xuICB9IGVsc2UgaWYgKGlzLm51bWJlcihzaWdtYSkgJiYgaXMuaW5SYW5nZShzaWdtYSwgMC4zLCAxMDAwKSkge1xuICAgIC8vIE51bWVyaWMgYXJndW1lbnQ6IHNwZWNpZmljIHNpZ21hXG4gICAgdGhpcy5vcHRpb25zLmJsdXJTaWdtYSA9IHNpZ21hO1xuICB9IGVsc2Uge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignc2lnbWEnLCAnbnVtYmVyIGJldHdlZW4gMC4zIGFuZCAxMDAwJywgc2lnbWEpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogTWVyZ2UgYWxwaGEgdHJhbnNwYXJlbmN5IGNoYW5uZWwsIGlmIGFueSwgd2l0aCBhIGJhY2tncm91bmQsIHRoZW4gcmVtb3ZlIHRoZSBhbHBoYSBjaGFubmVsLlxuICpcbiAqIFNlZSBhbHNvIHtAbGluayAvYXBpLWNoYW5uZWwjcmVtb3ZlYWxwaGF8cmVtb3ZlQWxwaGF9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBzaGFycChyZ2JhSW5wdXQpXG4gKiAgIC5mbGF0dGVuKHsgYmFja2dyb3VuZDogJyNGMEE3MDMnIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gW29wdGlvbnMuYmFja2dyb3VuZD17cjogMCwgZzogMCwgYjogMH1dIC0gYmFja2dyb3VuZCBjb2xvdXIsIHBhcnNlZCBieSB0aGUgW2NvbG9yXShodHRwczovL3d3dy5ucG1qcy5vcmcvcGFja2FnZS9jb2xvcikgbW9kdWxlLCBkZWZhdWx0cyB0byBibGFjay5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqL1xuZnVuY3Rpb24gZmxhdHRlbiAob3B0aW9ucykge1xuICB0aGlzLm9wdGlvbnMuZmxhdHRlbiA9IGlzLmJvb2wob3B0aW9ucykgPyBvcHRpb25zIDogdHJ1ZTtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvdXJPcHRpb24oJ2ZsYXR0ZW5CYWNrZ3JvdW5kJywgb3B0aW9ucy5iYWNrZ3JvdW5kKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhlIGltYWdlIGhhcyBhbiBhbHBoYSBjaGFubmVsXG4gKiB3aXRoIGFsbCB3aGl0ZSBwaXhlbCB2YWx1ZXMgbWFkZSBmdWxseSB0cmFuc3BhcmVudC5cbiAqXG4gKiBFeGlzdGluZyBhbHBoYSBjaGFubmVsIHZhbHVlcyBmb3Igbm9uLXdoaXRlIHBpeGVscyByZW1haW4gdW5jaGFuZ2VkLlxuICpcbiAqIFRoaXMgZmVhdHVyZSBpcyBleHBlcmltZW50YWwgYW5kIHRoZSBBUEkgbWF5IGNoYW5nZS5cbiAqXG4gKiBAc2luY2UgMC4zMi4xXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHNoYXJwKHJnYklucHV0KVxuICogICAudW5mbGF0dGVuKClcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHNoYXJwKHJnYklucHV0KVxuICogICAudGhyZXNob2xkKDEyOCwgeyBncmF5c2NhbGU6IGZhbHNlIH0pIC8vIGNvbnZlcnRlciBicmlnaHQgcGl4ZWxzIHRvIHdoaXRlXG4gKiAgIC51bmZsYXR0ZW4oKVxuICogICAudG9CdWZmZXIoKTtcbiAqL1xuZnVuY3Rpb24gdW5mbGF0dGVuICgpIHtcbiAgdGhpcy5vcHRpb25zLnVuZmxhdHRlbiA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEFwcGx5IGEgZ2FtbWEgY29ycmVjdGlvbiBieSByZWR1Y2luZyB0aGUgZW5jb2RpbmcgKGRhcmtlbikgcHJlLXJlc2l6ZSBhdCBhIGZhY3RvciBvZiBgMS9nYW1tYWBcbiAqIHRoZW4gaW5jcmVhc2luZyB0aGUgZW5jb2RpbmcgKGJyaWdodGVuKSBwb3N0LXJlc2l6ZSBhdCBhIGZhY3RvciBvZiBgZ2FtbWFgLlxuICogVGhpcyBjYW4gaW1wcm92ZSB0aGUgcGVyY2VpdmVkIGJyaWdodG5lc3Mgb2YgYSByZXNpemVkIGltYWdlIGluIG5vbi1saW5lYXIgY29sb3VyIHNwYWNlcy5cbiAqIEpQRUcgYW5kIFdlYlAgaW5wdXQgaW1hZ2VzIHdpbGwgbm90IHRha2UgYWR2YW50YWdlIG9mIHRoZSBzaHJpbmstb24tbG9hZCBwZXJmb3JtYW5jZSBvcHRpbWlzYXRpb25cbiAqIHdoZW4gYXBwbHlpbmcgYSBnYW1tYSBjb3JyZWN0aW9uLlxuICpcbiAqIFN1cHBseSBhIHNlY29uZCBhcmd1bWVudCB0byB1c2UgYSBkaWZmZXJlbnQgb3V0cHV0IGdhbW1hIHZhbHVlLCBvdGhlcndpc2UgdGhlIGZpcnN0IHZhbHVlIGlzIHVzZWQgaW4gYm90aCBjYXNlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW2dhbW1hPTIuMl0gdmFsdWUgYmV0d2VlbiAxLjAgYW5kIDMuMC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbZ2FtbWFPdXRdIHZhbHVlIGJldHdlZW4gMS4wIGFuZCAzLjAuIChvcHRpb25hbCwgZGVmYXVsdHMgdG8gc2FtZSBhcyBgZ2FtbWFgKVxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiBnYW1tYSAoZ2FtbWEsIGdhbW1hT3V0KSB7XG4gIGlmICghaXMuZGVmaW5lZChnYW1tYSkpIHtcbiAgICAvLyBEZWZhdWx0IGdhbW1hIGNvcnJlY3Rpb24gb2YgMi4yIChzUkdCKVxuICAgIHRoaXMub3B0aW9ucy5nYW1tYSA9IDIuMjtcbiAgfSBlbHNlIGlmIChpcy5udW1iZXIoZ2FtbWEpICYmIGlzLmluUmFuZ2UoZ2FtbWEsIDEsIDMpKSB7XG4gICAgdGhpcy5vcHRpb25zLmdhbW1hID0gZ2FtbWE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdnYW1tYScsICdudW1iZXIgYmV0d2VlbiAxLjAgYW5kIDMuMCcsIGdhbW1hKTtcbiAgfVxuICBpZiAoIWlzLmRlZmluZWQoZ2FtbWFPdXQpKSB7XG4gICAgLy8gRGVmYXVsdCBnYW1tYSBjb3JyZWN0aW9uIGZvciBvdXRwdXQgaXMgc2FtZSBhcyBpbnB1dFxuICAgIHRoaXMub3B0aW9ucy5nYW1tYU91dCA9IHRoaXMub3B0aW9ucy5nYW1tYTtcbiAgfSBlbHNlIGlmIChpcy5udW1iZXIoZ2FtbWFPdXQpICYmIGlzLmluUmFuZ2UoZ2FtbWFPdXQsIDEsIDMpKSB7XG4gICAgdGhpcy5vcHRpb25zLmdhbW1hT3V0ID0gZ2FtbWFPdXQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdnYW1tYU91dCcsICdudW1iZXIgYmV0d2VlbiAxLjAgYW5kIDMuMCcsIGdhbW1hT3V0KTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBQcm9kdWNlIHRoZSBcIm5lZ2F0aXZlXCIgb2YgdGhlIGltYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm5lZ2F0ZSgpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm5lZ2F0ZSh7IGFscGhhOiBmYWxzZSB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFscGhhPXRydWVdIFdoZXRoZXIgb3Igbm90IHRvIG5lZ2F0ZSBhbnkgYWxwaGEgY2hhbm5lbFxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBuZWdhdGUgKG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zLm5lZ2F0ZSA9IGlzLmJvb2wob3B0aW9ucykgPyBvcHRpb25zIDogdHJ1ZTtcbiAgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvbnMpICYmICdhbHBoYScgaW4gb3B0aW9ucykge1xuICAgIGlmICghaXMuYm9vbChvcHRpb25zLmFscGhhKSkge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhbHBoYScsICdzaG91bGQgYmUgYm9vbGVhbiB2YWx1ZScsIG9wdGlvbnMuYWxwaGEpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wdGlvbnMubmVnYXRlQWxwaGEgPSBvcHRpb25zLmFscGhhO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBFbmhhbmNlIG91dHB1dCBpbWFnZSBjb250cmFzdCBieSBzdHJldGNoaW5nIGl0cyBsdW1pbmFuY2UgdG8gY292ZXIgYSBmdWxsIGR5bmFtaWMgcmFuZ2UuXG4gKlxuICogVXNlcyBhIGhpc3RvZ3JhbS1iYXNlZCBhcHByb2FjaCwgdGFraW5nIGEgZGVmYXVsdCByYW5nZSBvZiAxJSB0byA5OSUgdG8gcmVkdWNlIHNlbnNpdGl2aXR5IHRvIG5vaXNlIGF0IHRoZSBleHRyZW1lcy5cbiAqXG4gKiBMdW1pbmFuY2UgdmFsdWVzIGJlbG93IHRoZSBgbG93ZXJgIHBlcmNlbnRpbGUgd2lsbCBiZSB1bmRlcmV4cG9zZWQgYnkgY2xpcHBpbmcgdG8gemVyby5cbiAqIEx1bWluYW5jZSB2YWx1ZXMgYWJvdmUgdGhlIGB1cHBlcmAgcGVyY2VudGlsZSB3aWxsIGJlIG92ZXJleHBvc2VkIGJ5IGNsaXBwaW5nIHRvIHRoZSBtYXggcGl4ZWwgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAubm9ybWFsaXNlKClcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dCA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAubm9ybWFsaXNlKHsgbG93ZXI6IDAsIHVwcGVyOiAxMDAgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxvd2VyPTFdIC0gUGVyY2VudGlsZSBiZWxvdyB3aGljaCBsdW1pbmFuY2UgdmFsdWVzIHdpbGwgYmUgdW5kZXJleHBvc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnVwcGVyPTk5XSAtIFBlcmNlbnRpbGUgYWJvdmUgd2hpY2ggbHVtaW5hbmNlIHZhbHVlcyB3aWxsIGJlIG92ZXJleHBvc2VkLlxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBub3JtYWxpc2UgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5sb3dlcikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5sb3dlcikgJiYgaXMuaW5SYW5nZShvcHRpb25zLmxvd2VyLCAwLCA5OSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLm5vcm1hbGlzZUxvd2VyID0gb3B0aW9ucy5sb3dlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbG93ZXInLCAnbnVtYmVyIGJldHdlZW4gMCBhbmQgOTknLCBvcHRpb25zLmxvd2VyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy51cHBlcikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy51cHBlcikgJiYgaXMuaW5SYW5nZShvcHRpb25zLnVwcGVyLCAxLCAxMDApKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5ub3JtYWxpc2VVcHBlciA9IG9wdGlvbnMudXBwZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3VwcGVyJywgJ251bWJlciBiZXR3ZWVuIDEgYW5kIDEwMCcsIG9wdGlvbnMudXBwZXIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLm5vcm1hbGlzZUxvd2VyID49IHRoaXMub3B0aW9ucy5ub3JtYWxpc2VVcHBlcikge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncmFuZ2UnLCAnbG93ZXIgdG8gYmUgbGVzcyB0aGFuIHVwcGVyJyxcbiAgICAgIGAke3RoaXMub3B0aW9ucy5ub3JtYWxpc2VMb3dlcn0gPj0gJHt0aGlzLm9wdGlvbnMubm9ybWFsaXNlVXBwZXJ9YCk7XG4gIH1cbiAgdGhpcy5vcHRpb25zLm5vcm1hbGlzZSA9IHRydWU7XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEFsdGVybmF0aXZlIHNwZWxsaW5nIG9mIG5vcm1hbGlzZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5ub3JtYWxpemUoKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubG93ZXI9MV0gLSBQZXJjZW50aWxlIGJlbG93IHdoaWNoIGx1bWluYW5jZSB2YWx1ZXMgd2lsbCBiZSB1bmRlcmV4cG9zZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudXBwZXI9OTldIC0gUGVyY2VudGlsZSBhYm92ZSB3aGljaCBsdW1pbmFuY2UgdmFsdWVzIHdpbGwgYmUgb3ZlcmV4cG9zZWQuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZSAob3B0aW9ucykge1xuICByZXR1cm4gdGhpcy5ub3JtYWxpc2Uob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUGVyZm9ybSBjb250cmFzdCBsaW1pdGluZyBhZGFwdGl2ZSBoaXN0b2dyYW0gZXF1YWxpemF0aW9uXG4gKiB7QGxpbmsgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWRhcHRpdmVfaGlzdG9ncmFtX2VxdWFsaXphdGlvbiNDb250cmFzdF9MaW1pdGVkX0FIRXxDTEFIRX0uXG4gKlxuICogVGhpcyB3aWxsLCBpbiBnZW5lcmFsLCBlbmhhbmNlIHRoZSBjbGFyaXR5IG9mIHRoZSBpbWFnZSBieSBicmluZ2luZyBvdXQgZGFya2VyIGRldGFpbHMuXG4gKlxuICogQHNpbmNlIDAuMjguM1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmNsYWhlKHtcbiAqICAgICB3aWR0aDogMyxcbiAqICAgICBoZWlnaHQ6IDMsXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy53aWR0aCAtIEludGVncmFsIHdpZHRoIG9mIHRoZSBzZWFyY2ggd2luZG93LCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5oZWlnaHQgLSBJbnRlZ3JhbCBoZWlnaHQgb2YgdGhlIHNlYXJjaCB3aW5kb3csIGluIHBpeGVscy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhTbG9wZT0zXSAtIEludGVncmFsIGxldmVsIG9mIGJyaWdodGVuaW5nLCBiZXR3ZWVuIDAgYW5kIDEwMCwgd2hlcmUgMCBkaXNhYmxlcyBjb250cmFzdCBsaW1pdGluZy5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gY2xhaGUgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLnBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy53aWR0aCkgJiYgb3B0aW9ucy53aWR0aCA+IDApIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jbGFoZVdpZHRoID0gb3B0aW9ucy53aWR0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd3aWR0aCcsICdpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvJywgb3B0aW9ucy53aWR0aCk7XG4gICAgfVxuICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMuaGVpZ2h0KSAmJiBvcHRpb25zLmhlaWdodCA+IDApIHtcbiAgICAgIHRoaXMub3B0aW9ucy5jbGFoZUhlaWdodCA9IG9wdGlvbnMuaGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2hlaWdodCcsICdpbnRlZ2VyIGdyZWF0ZXIgdGhhbiB6ZXJvJywgb3B0aW9ucy5oZWlnaHQpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLm1heFNsb3BlKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5tYXhTbG9wZSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLm1heFNsb3BlLCAwLCAxMDApKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5jbGFoZU1heFNsb3BlID0gb3B0aW9ucy5tYXhTbG9wZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbWF4U2xvcGUnLCAnaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDEwMCcsIG9wdGlvbnMubWF4U2xvcGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMnLCAncGxhaW4gb2JqZWN0Jywgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQ29udm9sdmUgdGhlIGltYWdlIHdpdGggdGhlIHNwZWNpZmllZCBrZXJuZWwuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAuY29udm9sdmUoe1xuICogICAgIHdpZHRoOiAzLFxuICogICAgIGhlaWdodDogMyxcbiAqICAgICBrZXJuZWw6IFstMSwgMCwgMSwgLTIsIDAsIDIsIC0xLCAwLCAxXVxuICogICB9KVxuICogICAucmF3KClcbiAqICAgLnRvQnVmZmVyKGZ1bmN0aW9uKGVyciwgZGF0YSwgaW5mbykge1xuICogICAgIC8vIGRhdGEgY29udGFpbnMgdGhlIHJhdyBwaXhlbCBkYXRhIHJlcHJlc2VudGluZyB0aGUgY29udm9sdXRpb25cbiAqICAgICAvLyBvZiB0aGUgaW5wdXQgaW1hZ2Ugd2l0aCB0aGUgaG9yaXpvbnRhbCBTb2JlbCBvcGVyYXRvclxuICogICB9KTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0ga2VybmVsXG4gKiBAcGFyYW0ge251bWJlcn0ga2VybmVsLndpZHRoIC0gd2lkdGggb2YgdGhlIGtlcm5lbCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge251bWJlcn0ga2VybmVsLmhlaWdodCAtIGhlaWdodCBvZiB0aGUga2VybmVsIGluIHBpeGVscy5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0ga2VybmVsLmtlcm5lbCAtIEFycmF5IG9mIGxlbmd0aCBgd2lkdGgqaGVpZ2h0YCBjb250YWluaW5nIHRoZSBrZXJuZWwgdmFsdWVzLlxuICogQHBhcmFtIHtudW1iZXJ9IFtrZXJuZWwuc2NhbGU9c3VtXSAtIHRoZSBzY2FsZSBvZiB0aGUga2VybmVsIGluIHBpeGVscy5cbiAqIEBwYXJhbSB7bnVtYmVyfSBba2VybmVsLm9mZnNldD0wXSAtIHRoZSBvZmZzZXQgb2YgdGhlIGtlcm5lbCBpbiBwaXhlbHMuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIGNvbnZvbHZlIChrZXJuZWwpIHtcbiAgaWYgKCFpcy5vYmplY3Qoa2VybmVsKSB8fCAhQXJyYXkuaXNBcnJheShrZXJuZWwua2VybmVsKSB8fFxuICAgICAgIWlzLmludGVnZXIoa2VybmVsLndpZHRoKSB8fCAhaXMuaW50ZWdlcihrZXJuZWwuaGVpZ2h0KSB8fFxuICAgICAgIWlzLmluUmFuZ2Uoa2VybmVsLndpZHRoLCAzLCAxMDAxKSB8fCAhaXMuaW5SYW5nZShrZXJuZWwuaGVpZ2h0LCAzLCAxMDAxKSB8fFxuICAgICAga2VybmVsLmhlaWdodCAqIGtlcm5lbC53aWR0aCAhPT0ga2VybmVsLmtlcm5lbC5sZW5ndGhcbiAgKSB7XG4gICAgLy8gbXVzdCBwYXNzIGluIGEga2VybmVsXG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvbnZvbHV0aW9uIGtlcm5lbCcpO1xuICB9XG4gIC8vIERlZmF1bHQgc2NhbGUgaXMgc3VtIG9mIGtlcm5lbCB2YWx1ZXNcbiAgaWYgKCFpcy5pbnRlZ2VyKGtlcm5lbC5zY2FsZSkpIHtcbiAgICBrZXJuZWwuc2NhbGUgPSBrZXJuZWwua2VybmVsLnJlZHVjZShmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGEgKyBiO1xuICAgIH0sIDApO1xuICB9XG4gIC8vIENsaXAgc2NhbGUgdG8gYSBtaW5pbXVtIHZhbHVlIG9mIDFcbiAgaWYgKGtlcm5lbC5zY2FsZSA8IDEpIHtcbiAgICBrZXJuZWwuc2NhbGUgPSAxO1xuICB9XG4gIGlmICghaXMuaW50ZWdlcihrZXJuZWwub2Zmc2V0KSkge1xuICAgIGtlcm5lbC5vZmZzZXQgPSAwO1xuICB9XG4gIHRoaXMub3B0aW9ucy5jb252S2VybmVsID0ga2VybmVsO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBBbnkgcGl4ZWwgdmFsdWUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSB0aHJlc2hvbGQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gMjU1LCBvdGhlcndpc2UgaXQgd2lsbCBiZSBzZXQgdG8gMC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbdGhyZXNob2xkPTEyOF0gLSBhIHZhbHVlIGluIHRoZSByYW5nZSAwLTI1NSByZXByZXNlbnRpbmcgdGhlIGxldmVsIGF0IHdoaWNoIHRoZSB0aHJlc2hvbGQgd2lsbCBiZSBhcHBsaWVkLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ncmV5c2NhbGU9dHJ1ZV0gLSBjb252ZXJ0IHRvIHNpbmdsZSBjaGFubmVsIGdyZXlzY2FsZS5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZ3JheXNjYWxlPXRydWVdIC0gYWx0ZXJuYXRpdmUgc3BlbGxpbmcgZm9yIGdyZXlzY2FsZS5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gdGhyZXNob2xkICh0aHJlc2hvbGQsIG9wdGlvbnMpIHtcbiAgaWYgKCFpcy5kZWZpbmVkKHRocmVzaG9sZCkpIHtcbiAgICB0aGlzLm9wdGlvbnMudGhyZXNob2xkID0gMTI4O1xuICB9IGVsc2UgaWYgKGlzLmJvb2wodGhyZXNob2xkKSkge1xuICAgIHRoaXMub3B0aW9ucy50aHJlc2hvbGQgPSB0aHJlc2hvbGQgPyAxMjggOiAwO1xuICB9IGVsc2UgaWYgKGlzLmludGVnZXIodGhyZXNob2xkKSAmJiBpcy5pblJhbmdlKHRocmVzaG9sZCwgMCwgMjU1KSkge1xuICAgIHRoaXMub3B0aW9ucy50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd0aHJlc2hvbGQnLCAnaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NScsIHRocmVzaG9sZCk7XG4gIH1cbiAgaWYgKCFpcy5vYmplY3Qob3B0aW9ucykgfHwgb3B0aW9ucy5ncmV5c2NhbGUgPT09IHRydWUgfHwgb3B0aW9ucy5ncmF5c2NhbGUgPT09IHRydWUpIHtcbiAgICB0aGlzLm9wdGlvbnMudGhyZXNob2xkR3JheXNjYWxlID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm9wdGlvbnMudGhyZXNob2xkR3JheXNjYWxlID0gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogUGVyZm9ybSBhIGJpdHdpc2UgYm9vbGVhbiBvcGVyYXRpb24gd2l0aCBvcGVyYW5kIGltYWdlLlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGNyZWF0ZXMgYW4gb3V0cHV0IGltYWdlIHdoZXJlIGVhY2ggcGl4ZWwgaXMgdGhlIHJlc3VsdCBvZlxuICogdGhlIHNlbGVjdGVkIGJpdHdpc2UgYm9vbGVhbiBgb3BlcmF0aW9uYCBiZXR3ZWVuIHRoZSBjb3JyZXNwb25kaW5nIHBpeGVscyBvZiB0aGUgaW5wdXQgaW1hZ2VzLlxuICpcbiAqIEBwYXJhbSB7QnVmZmVyfHN0cmluZ30gb3BlcmFuZCAtIEJ1ZmZlciBjb250YWluaW5nIGltYWdlIGRhdGEgb3Igc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdGggdG8gYW4gaW1hZ2UgZmlsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcGVyYXRvciAtIG9uZSBvZiBgYW5kYCwgYG9yYCBvciBgZW9yYCB0byBwZXJmb3JtIHRoYXQgYml0d2lzZSBvcGVyYXRpb24sIGxpa2UgdGhlIEMgbG9naWMgb3BlcmF0b3JzIGAmYCwgYHxgIGFuZCBgXmAgcmVzcGVjdGl2ZWx5LlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zLnJhd10gLSBkZXNjcmliZXMgb3BlcmFuZCB3aGVuIHVzaW5nIHJhdyBwaXhlbCBkYXRhLlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJhdy53aWR0aF1cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5yYXcuaGVpZ2h0XVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnJhdy5jaGFubmVsc11cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gYm9vbGVhbiAob3BlcmFuZCwgb3BlcmF0b3IsIG9wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zLmJvb2xlYW4gPSB0aGlzLl9jcmVhdGVJbnB1dERlc2NyaXB0b3Iob3BlcmFuZCwgb3B0aW9ucyk7XG4gIGlmIChpcy5zdHJpbmcob3BlcmF0b3IpICYmIGlzLmluQXJyYXkob3BlcmF0b3IsIFsnYW5kJywgJ29yJywgJ2VvciddKSkge1xuICAgIHRoaXMub3B0aW9ucy5ib29sZWFuT3AgPSBvcGVyYXRvcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wZXJhdG9yJywgJ29uZSBvZjogYW5kLCBvciwgZW9yJywgb3BlcmF0b3IpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEFwcGx5IHRoZSBsaW5lYXIgZm9ybXVsYSBgYWAgKiBpbnB1dCArIGBiYCB0byB0aGUgaW1hZ2UgdG8gYWRqdXN0IGltYWdlIGxldmVscy5cbiAqXG4gKiBXaGVuIGEgc2luZ2xlIG51bWJlciBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIGZvciBhbGwgaW1hZ2UgY2hhbm5lbHMuXG4gKiBXaGVuIGFuIGFycmF5IG9mIG51bWJlcnMgaXMgcHJvdmlkZWQsIHRoZSBhcnJheSBsZW5ndGggbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmxpbmVhcigwLjUsIDIpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCBzaGFycChyZ2JJbnB1dClcbiAqICAgLmxpbmVhcihcbiAqICAgICBbMC4yNSwgMC41LCAwLjc1XSxcbiAqICAgICBbMTUwLCAxMDAsIDUwXVxuICogICApXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7KG51bWJlcnxudW1iZXJbXSl9IFthPVtdXSBtdWx0aXBsaWVyXG4gKiBAcGFyYW0geyhudW1iZXJ8bnVtYmVyW10pfSBbYj1bXV0gb2Zmc2V0XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIGxpbmVhciAoYSwgYikge1xuICBpZiAoIWlzLmRlZmluZWQoYSkgJiYgaXMubnVtYmVyKGIpKSB7XG4gICAgYSA9IDEuMDtcbiAgfSBlbHNlIGlmIChpcy5udW1iZXIoYSkgJiYgIWlzLmRlZmluZWQoYikpIHtcbiAgICBiID0gMC4wO1xuICB9XG4gIGlmICghaXMuZGVmaW5lZChhKSkge1xuICAgIHRoaXMub3B0aW9ucy5saW5lYXJBID0gW107XG4gIH0gZWxzZSBpZiAoaXMubnVtYmVyKGEpKSB7XG4gICAgdGhpcy5vcHRpb25zLmxpbmVhckEgPSBbYV07XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhKSAmJiBhLmxlbmd0aCAmJiBhLmV2ZXJ5KGlzLm51bWJlcikpIHtcbiAgICB0aGlzLm9wdGlvbnMubGluZWFyQSA9IGE7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhJywgJ251bWJlciBvciBhcnJheSBvZiBudW1iZXJzJywgYSk7XG4gIH1cbiAgaWYgKCFpcy5kZWZpbmVkKGIpKSB7XG4gICAgdGhpcy5vcHRpb25zLmxpbmVhckIgPSBbXTtcbiAgfSBlbHNlIGlmIChpcy5udW1iZXIoYikpIHtcbiAgICB0aGlzLm9wdGlvbnMubGluZWFyQiA9IFtiXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGIpICYmIGIubGVuZ3RoICYmIGIuZXZlcnkoaXMubnVtYmVyKSkge1xuICAgIHRoaXMub3B0aW9ucy5saW5lYXJCID0gYjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2InLCAnbnVtYmVyIG9yIGFycmF5IG9mIG51bWJlcnMnLCBiKTtcbiAgfVxuICBpZiAodGhpcy5vcHRpb25zLmxpbmVhckEubGVuZ3RoICE9PSB0aGlzLm9wdGlvbnMubGluZWFyQi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIGEgYW5kIGIgdG8gYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCcpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFJlY29tYmluZSB0aGUgaW1hZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG1hdHJpeC5cbiAqXG4gKiBAc2luY2UgMC4yMS4xXG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAucmVjb21iKFtcbiAqICAgIFswLjM1ODgsIDAuNzA0NCwgMC4xMzY4XSxcbiAqICAgIFswLjI5OTAsIDAuNTg3MCwgMC4xMTQwXSxcbiAqICAgIFswLjIzOTIsIDAuNDY5NiwgMC4wOTEyXSxcbiAqICAgXSlcbiAqICAgLnJhdygpXG4gKiAgIC50b0J1ZmZlcihmdW5jdGlvbihlcnIsIGRhdGEsIGluZm8pIHtcbiAqICAgICAvLyBkYXRhIGNvbnRhaW5zIHRoZSByYXcgcGl4ZWwgZGF0YSBhZnRlciBhcHBseWluZyB0aGUgbWF0cml4XG4gKiAgICAgLy8gV2l0aCB0aGlzIGV4YW1wbGUgaW5wdXQsIGEgc2VwaWEgZmlsdGVyIGhhcyBiZWVuIGFwcGxpZWRcbiAqICAgfSk7XG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gaW5wdXRNYXRyaXggLSAzeDMgb3IgNHg0IFJlY29tYmluYXRpb24gbWF0cml4XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIHJlY29tYiAoaW5wdXRNYXRyaXgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0TWF0cml4KSkge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignaW5wdXRNYXRyaXgnLCAnYXJyYXknLCBpbnB1dE1hdHJpeCk7XG4gIH1cbiAgaWYgKGlucHV0TWF0cml4Lmxlbmd0aCAhPT0gMyAmJiBpbnB1dE1hdHJpeC5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2lucHV0TWF0cml4JywgJzN4MyBvciA0eDQgYXJyYXknLCBpbnB1dE1hdHJpeC5sZW5ndGgpO1xuICB9XG4gIGNvbnN0IHJlY29tYk1hdHJpeCA9IGlucHV0TWF0cml4LmZsYXQoKS5tYXAoTnVtYmVyKTtcbiAgaWYgKHJlY29tYk1hdHJpeC5sZW5ndGggIT09IDkgJiYgcmVjb21iTWF0cml4Lmxlbmd0aCAhPT0gMTYpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2lucHV0TWF0cml4JywgJ2NhcmRpbmFsaXR5IG9mIDkgb3IgMTYnLCByZWNvbWJNYXRyaXgubGVuZ3RoKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMucmVjb21iTWF0cml4ID0gcmVjb21iTWF0cml4O1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSBpbWFnZSB1c2luZyBicmlnaHRuZXNzLCBzYXR1cmF0aW9uLCBodWUgcm90YXRpb24sIGFuZCBsaWdodG5lc3MuXG4gKiBCcmlnaHRuZXNzIGFuZCBsaWdodG5lc3MgYm90aCBvcGVyYXRlIG9uIGx1bWluYW5jZSwgd2l0aCB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0XG4gKiBicmlnaHRuZXNzIGlzIG11bHRpcGxpY2F0aXZlIHdoZXJlYXMgbGlnaHRuZXNzIGlzIGFkZGl0aXZlLlxuICpcbiAqIEBzaW5jZSAwLjIyLjFcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gaW5jcmVhc2UgYnJpZ2h0bmVzcyBieSBhIGZhY3RvciBvZiAyXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm1vZHVsYXRlKHtcbiAqICAgICBicmlnaHRuZXNzOiAyXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBodWUtcm90YXRlIGJ5IDE4MCBkZWdyZWVzXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm1vZHVsYXRlKHtcbiAqICAgICBodWU6IDE4MFxuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gaW5jcmVhc2UgbGlnaHRuZXNzIGJ5ICs1MFxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5tb2R1bGF0ZSh7XG4gKiAgICAgbGlnaHRuZXNzOiA1MFxuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gZGVjcmVhc2UgYnJpZ2h0bmVzcyBhbmQgc2F0dXJhdGlvbiB3aGlsZSBhbHNvIGh1ZS1yb3RhdGluZyBieSA5MCBkZWdyZWVzXG4gKiBjb25zdCBvdXRwdXQgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLm1vZHVsYXRlKHtcbiAqICAgICBicmlnaHRuZXNzOiAwLjUsXG4gKiAgICAgc2F0dXJhdGlvbjogMC41LFxuICogICAgIGh1ZTogOTAsXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5icmlnaHRuZXNzXSBCcmlnaHRuZXNzIG11bHRpcGxpZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zYXR1cmF0aW9uXSBTYXR1cmF0aW9uIG11bHRpcGxpZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5odWVdIERlZ3JlZXMgZm9yIGh1ZSByb3RhdGlvblxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxpZ2h0bmVzc10gTGlnaHRuZXNzIGFkZGVuZFxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBtb2R1bGF0ZSAob3B0aW9ucykge1xuICBpZiAoIWlzLnBsYWluT2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zJywgJ3BsYWluIG9iamVjdCcsIG9wdGlvbnMpO1xuICB9XG4gIGlmICgnYnJpZ2h0bmVzcycgaW4gb3B0aW9ucykge1xuICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5icmlnaHRuZXNzKSAmJiBvcHRpb25zLmJyaWdodG5lc3MgPj0gMCkge1xuICAgICAgdGhpcy5vcHRpb25zLmJyaWdodG5lc3MgPSBvcHRpb25zLmJyaWdodG5lc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignYnJpZ2h0bmVzcycsICdudW1iZXIgYWJvdmUgemVybycsIG9wdGlvbnMuYnJpZ2h0bmVzcyk7XG4gICAgfVxuICB9XG4gIGlmICgnc2F0dXJhdGlvbicgaW4gb3B0aW9ucykge1xuICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5zYXR1cmF0aW9uKSAmJiBvcHRpb25zLnNhdHVyYXRpb24gPj0gMCkge1xuICAgICAgdGhpcy5vcHRpb25zLnNhdHVyYXRpb24gPSBvcHRpb25zLnNhdHVyYXRpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignc2F0dXJhdGlvbicsICdudW1iZXIgYWJvdmUgemVybycsIG9wdGlvbnMuc2F0dXJhdGlvbik7XG4gICAgfVxuICB9XG4gIGlmICgnaHVlJyBpbiBvcHRpb25zKSB7XG4gICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5odWUpKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuaHVlID0gb3B0aW9ucy5odWUgJSAzNjA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignaHVlJywgJ251bWJlcicsIG9wdGlvbnMuaHVlKTtcbiAgICB9XG4gIH1cbiAgaWYgKCdsaWdodG5lc3MnIGluIG9wdGlvbnMpIHtcbiAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMubGlnaHRuZXNzKSkge1xuICAgICAgdGhpcy5vcHRpb25zLmxpZ2h0bmVzcyA9IG9wdGlvbnMubGlnaHRuZXNzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2xpZ2h0bmVzcycsICdudW1iZXInLCBvcHRpb25zLmxpZ2h0bmVzcyk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIERlY29yYXRlIHRoZSBTaGFycCBwcm90b3R5cGUgd2l0aCBvcGVyYXRpb24tcmVsYXRlZCBmdW5jdGlvbnMuXG4gKiBAcHJpdmF0ZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChTaGFycCkge1xuICBPYmplY3QuYXNzaWduKFNoYXJwLnByb3RvdHlwZSwge1xuICAgIHJvdGF0ZSxcbiAgICBmbGlwLFxuICAgIGZsb3AsXG4gICAgYWZmaW5lLFxuICAgIHNoYXJwZW4sXG4gICAgbWVkaWFuLFxuICAgIGJsdXIsXG4gICAgZmxhdHRlbixcbiAgICB1bmZsYXR0ZW4sXG4gICAgZ2FtbWEsXG4gICAgbmVnYXRlLFxuICAgIG5vcm1hbGlzZSxcbiAgICBub3JtYWxpemUsXG4gICAgY2xhaGUsXG4gICAgY29udm9sdmUsXG4gICAgdGhyZXNob2xkLFxuICAgIGJvb2xlYW4sXG4gICAgbGluZWFyLFxuICAgIHJlY29tYixcbiAgICBtb2R1bGF0ZVxuICB9KTtcbn07XG4iLAogICAgIi8vIENvcHlyaWdodCAyMDEzIExvdmVsbCBGdWxsZXIgYW5kIG90aGVycy5cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbid1c2Ugc3RyaWN0JztcblxuY29uc3QgY29sb3IgPSByZXF1aXJlKCdjb2xvcicpO1xuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5cbi8qKlxuICogQ29sb3Vyc3BhY2VzLlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgY29sb3Vyc3BhY2UgPSB7XG4gIG11bHRpYmFuZDogJ211bHRpYmFuZCcsXG4gICdiLXcnOiAnYi13JyxcbiAgYnc6ICdiLXcnLFxuICBjbXlrOiAnY215aycsXG4gIHNyZ2I6ICdzcmdiJ1xufTtcblxuLyoqXG4gKiBUaW50IHRoZSBpbWFnZSB1c2luZyB0aGUgcHJvdmlkZWQgY29sb3VyLlxuICogQW4gYWxwaGEgY2hhbm5lbCBtYXkgYmUgcHJlc2VudCBhbmQgd2lsbCBiZSB1bmNoYW5nZWQgYnkgdGhlIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC50aW50KHsgcjogMjU1LCBnOiAyNDAsIGI6IDE2IH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gdGludCAtIFBhcnNlZCBieSB0aGUgW2NvbG9yXShodHRwczovL3d3dy5ucG1qcy5vcmcvcGFja2FnZS9jb2xvcikgbW9kdWxlLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyXG4gKi9cbmZ1bmN0aW9uIHRpbnQgKHRpbnQpIHtcbiAgdGhpcy5fc2V0QmFja2dyb3VuZENvbG91ck9wdGlvbigndGludCcsIHRpbnQpO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IHRvIDgtYml0IGdyZXlzY2FsZTsgMjU2IHNoYWRlcyBvZiBncmV5LlxuICogVGhpcyBpcyBhIGxpbmVhciBvcGVyYXRpb24uIElmIHRoZSBpbnB1dCBpbWFnZSBpcyBpbiBhIG5vbi1saW5lYXIgY29sb3VyIHNwYWNlIHN1Y2ggYXMgc1JHQiwgdXNlIGBnYW1tYSgpYCB3aXRoIGBncmV5c2NhbGUoKWAgZm9yIHRoZSBiZXN0IHJlc3VsdHMuXG4gKiBCeSBkZWZhdWx0IHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSB3ZWItZnJpZW5kbHkgc1JHQiBhbmQgY29udGFpbiB0aHJlZSAoaWRlbnRpY2FsKSBjb2xvciBjaGFubmVscy5cbiAqIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgb3RoZXIgc2hhcnAgb3BlcmF0aW9ucyBzdWNoIGFzIGB0b0NvbG91cnNwYWNlKCdiLXcnKWAsXG4gKiB3aGljaCB3aWxsIHByb2R1Y2UgYW4gb3V0cHV0IGltYWdlIGNvbnRhaW5pbmcgb25lIGNvbG9yIGNoYW5uZWwuXG4gKiBBbiBhbHBoYSBjaGFubmVsIG1heSBiZSBwcmVzZW50LCBhbmQgd2lsbCBiZSB1bmNoYW5nZWQgYnkgdGhlIG9wZXJhdGlvbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0ID0gYXdhaXQgc2hhcnAoaW5wdXQpLmdyZXlzY2FsZSgpLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbZ3JleXNjYWxlPXRydWVdXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIGdyZXlzY2FsZSAoZ3JleXNjYWxlKSB7XG4gIHRoaXMub3B0aW9ucy5ncmV5c2NhbGUgPSBpcy5ib29sKGdyZXlzY2FsZSkgPyBncmV5c2NhbGUgOiB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBgZ3JleXNjYWxlYC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2dyYXlzY2FsZT10cnVlXVxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBncmF5c2NhbGUgKGdyYXlzY2FsZSkge1xuICByZXR1cm4gdGhpcy5ncmV5c2NhbGUoZ3JheXNjYWxlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHBpcGVsaW5lIGNvbG91cnNwYWNlLlxuICpcbiAqIFRoZSBpbnB1dCBpbWFnZSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgcHJvdmlkZWQgY29sb3Vyc3BhY2UgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwaXBlbGluZS5cbiAqIEFsbCBvcGVyYXRpb25zIHdpbGwgdXNlIHRoaXMgY29sb3Vyc3BhY2UgYmVmb3JlIGNvbnZlcnRpbmcgdG8gdGhlIG91dHB1dCBjb2xvdXJzcGFjZSxcbiAqIGFzIGRlZmluZWQgYnkge0BsaW5rICN0b2NvbG91cnNwYWNlfHRvQ29sb3Vyc3BhY2V9LlxuICpcbiAqIEBzaW5jZSAwLjI5LjBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUnVuIHBpcGVsaW5lIGluIDE2IGJpdHMgcGVyIGNoYW5uZWwgUkdCIHdoaWxlIGNvbnZlcnRpbmcgZmluYWwgcmVzdWx0IHRvIDggYml0cyBwZXIgY2hhbm5lbCBzUkdCLlxuICogYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgLnBpcGVsaW5lQ29sb3Vyc3BhY2UoJ3JnYjE2JylcbiAqICAudG9Db2xvdXJzcGFjZSgnc3JnYicpXG4gKiAgLnRvRmlsZSgnMTZicGMtcGlwZWxpbmUtdG8tOGJwYy1vdXRwdXQucG5nJylcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbG91cnNwYWNlXSAtIHBpcGVsaW5lIGNvbG91cnNwYWNlIGUuZy4gYHJnYjE2YCwgYHNjcmdiYCwgYGxhYmAsIGBncmV5MTZgIFsuLi5dKGh0dHBzOi8vZ2l0aHViLmNvbS9saWJ2aXBzL2xpYnZpcHMvYmxvYi80MWNmZjRlOWQwODM4NDk4NDg3YTAwNjIzNDYyMjA0ZWIxMGVlNWI4L2xpYnZpcHMvaW9mdW5jcy9lbnVtdHlwZXMuYyNMNzc0KVxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiBwaXBlbGluZUNvbG91cnNwYWNlIChjb2xvdXJzcGFjZSkge1xuICBpZiAoIWlzLnN0cmluZyhjb2xvdXJzcGFjZSkpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbG91cnNwYWNlJywgJ3N0cmluZycsIGNvbG91cnNwYWNlKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMuY29sb3Vyc3BhY2VQaXBlbGluZSA9IGNvbG91cnNwYWNlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBBbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBgcGlwZWxpbmVDb2xvdXJzcGFjZWAuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvbG9yc3BhY2VdIC0gcGlwZWxpbmUgY29sb3JzcGFjZS5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gcGlwZWxpbmVDb2xvcnNwYWNlIChjb2xvcnNwYWNlKSB7XG4gIHJldHVybiB0aGlzLnBpcGVsaW5lQ29sb3Vyc3BhY2UoY29sb3JzcGFjZSk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBvdXRwdXQgY29sb3Vyc3BhY2UuXG4gKiBCeSBkZWZhdWx0IG91dHB1dCBpbWFnZSB3aWxsIGJlIHdlYi1mcmllbmRseSBzUkdCLCB3aXRoIGFkZGl0aW9uYWwgY2hhbm5lbHMgaW50ZXJwcmV0ZWQgYXMgYWxwaGEgY2hhbm5lbHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE91dHB1dCAxNiBiaXRzIHBlciBwaXhlbCBSR0JcbiAqIGF3YWl0IHNoYXJwKGlucHV0KVxuICogIC50b0NvbG91cnNwYWNlKCdyZ2IxNicpXG4gKiAgLnRvRmlsZSgnMTYtYnBwLnBuZycpXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvdXJzcGFjZV0gLSBvdXRwdXQgY29sb3Vyc3BhY2UgZS5nLiBgc3JnYmAsIGByZ2JgLCBgY215a2AsIGBsYWJgLCBgYi13YCBbLi4uXShodHRwczovL2dpdGh1Yi5jb20vbGlidmlwcy9saWJ2aXBzL2Jsb2IvM2MwYmZkZjc0Y2UxZGMzN2E2NDI5YmVkNDdmYTc2ZjE2ZTJjZDcwYS9saWJ2aXBzL2lvZnVuY3MvZW51bXR5cGVzLmMjTDc3Ny1MNzk0KVxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiB0b0NvbG91cnNwYWNlIChjb2xvdXJzcGFjZSkge1xuICBpZiAoIWlzLnN0cmluZyhjb2xvdXJzcGFjZSkpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbG91cnNwYWNlJywgJ3N0cmluZycsIGNvbG91cnNwYWNlKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMuY29sb3Vyc3BhY2UgPSBjb2xvdXJzcGFjZTtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogQWx0ZXJuYXRpdmUgc3BlbGxpbmcgb2YgYHRvQ29sb3Vyc3BhY2VgLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjb2xvcnNwYWNlXSAtIG91dHB1dCBjb2xvcnNwYWNlLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiB0b0NvbG9yc3BhY2UgKGNvbG9yc3BhY2UpIHtcbiAgcmV0dXJuIHRoaXMudG9Db2xvdXJzcGFjZShjb2xvcnNwYWNlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgYSBjb2xvdXIgYXR0cmlidXRlIG9mIHRoZSB0aGlzLm9wdGlvbnMgT2JqZWN0LlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gdmFsdWVcbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIF9zZXRCYWNrZ3JvdW5kQ29sb3VyT3B0aW9uIChrZXksIHZhbHVlKSB7XG4gIGlmIChpcy5kZWZpbmVkKHZhbHVlKSkge1xuICAgIGlmIChpcy5vYmplY3QodmFsdWUpIHx8IGlzLnN0cmluZyh2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IGNvbG91ciA9IGNvbG9yKHZhbHVlKTtcbiAgICAgIHRoaXMub3B0aW9uc1trZXldID0gW1xuICAgICAgICBjb2xvdXIucmVkKCksXG4gICAgICAgIGNvbG91ci5ncmVlbigpLFxuICAgICAgICBjb2xvdXIuYmx1ZSgpLFxuICAgICAgICBNYXRoLnJvdW5kKGNvbG91ci5hbHBoYSgpICogMjU1KVxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdiYWNrZ3JvdW5kJywgJ29iamVjdCBvciBzdHJpbmcnLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGVjb3JhdGUgdGhlIFNoYXJwIHByb3RvdHlwZSB3aXRoIGNvbG91ci1yZWxhdGVkIGZ1bmN0aW9ucy5cbiAqIEBwcml2YXRlXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKFNoYXJwKSB7XG4gIE9iamVjdC5hc3NpZ24oU2hhcnAucHJvdG90eXBlLCB7XG4gICAgLy8gUHVibGljXG4gICAgdGludCxcbiAgICBncmV5c2NhbGUsXG4gICAgZ3JheXNjYWxlLFxuICAgIHBpcGVsaW5lQ29sb3Vyc3BhY2UsXG4gICAgcGlwZWxpbmVDb2xvcnNwYWNlLFxuICAgIHRvQ29sb3Vyc3BhY2UsXG4gICAgdG9Db2xvcnNwYWNlLFxuICAgIC8vIFByaXZhdGVcbiAgICBfc2V0QmFja2dyb3VuZENvbG91ck9wdGlvblxuICB9KTtcbiAgLy8gQ2xhc3MgYXR0cmlidXRlc1xuICBTaGFycC5jb2xvdXJzcGFjZSA9IGNvbG91cnNwYWNlO1xuICBTaGFycC5jb2xvcnNwYWNlID0gY29sb3Vyc3BhY2U7XG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGlzID0gcmVxdWlyZSgnLi9pcycpO1xuXG4vKipcbiAqIEJvb2xlYW4gb3BlcmF0aW9ucyBmb3IgYmFuZGJvb2wuXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBib29sID0ge1xuICBhbmQ6ICdhbmQnLFxuICBvcjogJ29yJyxcbiAgZW9yOiAnZW9yJ1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYWxwaGEgY2hhbm5lbCwgaWYgYW55LiBUaGlzIGlzIGEgbm8tb3AgaWYgdGhlIGltYWdlIGRvZXMgbm90IGhhdmUgYW4gYWxwaGEgY2hhbm5lbC5cbiAqXG4gKiBTZWUgYWxzbyB7QGxpbmsgL2FwaS1vcGVyYXRpb24jZmxhdHRlbnxmbGF0dGVufS5cbiAqXG4gKiBAZXhhbXBsZVxuICogc2hhcnAoJ3JnYmEucG5nJylcbiAqICAgLnJlbW92ZUFscGhhKClcbiAqICAgLnRvRmlsZSgncmdiLnBuZycsIGZ1bmN0aW9uKGVyciwgaW5mbykge1xuICogICAgIC8vIHJnYi5wbmcgaXMgYSAzIGNoYW5uZWwgaW1hZ2Ugd2l0aG91dCBhbiBhbHBoYSBjaGFubmVsXG4gKiAgIH0pO1xuICpcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlQWxwaGEgKCkge1xuICB0aGlzLm9wdGlvbnMucmVtb3ZlQWxwaGEgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBFbnN1cmUgdGhlIG91dHB1dCBpbWFnZSBoYXMgYW4gYWxwaGEgdHJhbnNwYXJlbmN5IGNoYW5uZWwuXG4gKiBJZiBtaXNzaW5nLCB0aGUgYWRkZWQgYWxwaGEgY2hhbm5lbCB3aWxsIGhhdmUgdGhlIHNwZWNpZmllZFxuICogdHJhbnNwYXJlbmN5IGxldmVsLCBkZWZhdWx0aW5nIHRvIGZ1bGx5LW9wYXF1ZSAoMSkuXG4gKiBUaGlzIGlzIGEgbm8tb3AgaWYgdGhlIGltYWdlIGFscmVhZHkgaGFzIGFuIGFscGhhIGNoYW5uZWwuXG4gKlxuICogQHNpbmNlIDAuMjEuMlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyByZ2JhLnBuZyB3aWxsIGJlIGEgNCBjaGFubmVsIGltYWdlIHdpdGggYSBmdWxseS1vcGFxdWUgYWxwaGEgY2hhbm5lbFxuICogYXdhaXQgc2hhcnAoJ3JnYi5qcGcnKVxuICogICAuZW5zdXJlQWxwaGEoKVxuICogICAudG9GaWxlKCdyZ2JhLnBuZycpXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIHJnYmEgaXMgYSA0IGNoYW5uZWwgaW1hZ2Ugd2l0aCBhIGZ1bGx5LXRyYW5zcGFyZW50IGFscGhhIGNoYW5uZWxcbiAqIGNvbnN0IHJnYmEgPSBhd2FpdCBzaGFycChyZ2IpXG4gKiAgIC5lbnN1cmVBbHBoYSgwKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gW2FscGhhPTFdIC0gYWxwaGEgdHJhbnNwYXJlbmN5IGxldmVsICgwPWZ1bGx5LXRyYW5zcGFyZW50LCAxPWZ1bGx5LW9wYXF1ZSlcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIGFscGhhIHRyYW5zcGFyZW5jeSBsZXZlbFxuICovXG5mdW5jdGlvbiBlbnN1cmVBbHBoYSAoYWxwaGEpIHtcbiAgaWYgKGlzLmRlZmluZWQoYWxwaGEpKSB7XG4gICAgaWYgKGlzLm51bWJlcihhbHBoYSkgJiYgaXMuaW5SYW5nZShhbHBoYSwgMCwgMSkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5lbnN1cmVBbHBoYSA9IGFscGhhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2FscGhhJywgJ251bWJlciBiZXR3ZWVuIDAgYW5kIDEnLCBhbHBoYSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRoaXMub3B0aW9ucy5lbnN1cmVBbHBoYSA9IDE7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogRXh0cmFjdCBhIHNpbmdsZSBjaGFubmVsIGZyb20gYSBtdWx0aS1jaGFubmVsIGltYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBncmVlbi5qcGcgaXMgYSBncmV5c2NhbGUgaW1hZ2UgY29udGFpbmluZyB0aGUgZ3JlZW4gY2hhbm5lbCBvZiB0aGUgaW5wdXRcbiAqIGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuZXh0cmFjdENoYW5uZWwoJ2dyZWVuJylcbiAqICAgLnRvRmlsZSgnZ3JlZW4uanBnJyk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIHJlZDEgaXMgdGhlIHJlZCB2YWx1ZSBvZiB0aGUgZmlyc3QgcGl4ZWwsIHJlZDIgdGhlIHNlY29uZCBwaXhlbCBldGMuXG4gKiBjb25zdCBbcmVkMSwgcmVkMiwgLi4uXSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuZXh0cmFjdENoYW5uZWwoMClcbiAqICAgLnJhdygpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gY2hhbm5lbCAtIHplcm8taW5kZXhlZCBjaGFubmVsL2JhbmQgbnVtYmVyIHRvIGV4dHJhY3QsIG9yIGByZWRgLCBgZ3JlZW5gLCBgYmx1ZWAgb3IgYGFscGhhYC5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIGNoYW5uZWxcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENoYW5uZWwgKGNoYW5uZWwpIHtcbiAgY29uc3QgY2hhbm5lbE1hcCA9IHsgcmVkOiAwLCBncmVlbjogMSwgYmx1ZTogMiwgYWxwaGE6IDMgfTtcbiAgaWYgKE9iamVjdC5rZXlzKGNoYW5uZWxNYXApLmluY2x1ZGVzKGNoYW5uZWwpKSB7XG4gICAgY2hhbm5lbCA9IGNoYW5uZWxNYXBbY2hhbm5lbF07XG4gIH1cbiAgaWYgKGlzLmludGVnZXIoY2hhbm5lbCkgJiYgaXMuaW5SYW5nZShjaGFubmVsLCAwLCA0KSkge1xuICAgIHRoaXMub3B0aW9ucy5leHRyYWN0Q2hhbm5lbCA9IGNoYW5uZWw7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdjaGFubmVsJywgJ2ludGVnZXIgb3Igb25lIG9mOiByZWQsIGdyZWVuLCBibHVlLCBhbHBoYScsIGNoYW5uZWwpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIEpvaW4gb25lIG9yIG1vcmUgY2hhbm5lbHMgdG8gdGhlIGltYWdlLlxuICogVGhlIG1lYW5pbmcgb2YgdGhlIGFkZGVkIGNoYW5uZWxzIGRlcGVuZHMgb24gdGhlIG91dHB1dCBjb2xvdXJzcGFjZSwgc2V0IHdpdGggYHRvQ29sb3Vyc3BhY2UoKWAuXG4gKiBCeSBkZWZhdWx0IHRoZSBvdXRwdXQgaW1hZ2Ugd2lsbCBiZSB3ZWItZnJpZW5kbHkgc1JHQiwgd2l0aCBhZGRpdGlvbmFsIGNoYW5uZWxzIGludGVycHJldGVkIGFzIGFscGhhIGNoYW5uZWxzLlxuICogQ2hhbm5lbCBvcmRlcmluZyBmb2xsb3dzIHZpcHMgY29udmVudGlvbjpcbiAqIC0gc1JHQjogMDogUmVkLCAxOiBHcmVlbiwgMjogQmx1ZSwgMzogQWxwaGEuXG4gKiAtIENNWUs6IDA6IE1hZ2VudGEsIDE6IEN5YW4sIDI6IFllbGxvdywgMzogQmxhY2ssIDQ6IEFscGhhLlxuICpcbiAqIEJ1ZmZlcnMgbWF5IGJlIGFueSBvZiB0aGUgaW1hZ2UgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgc2hhcnAuXG4gKiBGb3IgcmF3IHBpeGVsIGlucHV0LCB0aGUgYG9wdGlvbnNgIG9iamVjdCBzaG91bGQgY29udGFpbiBhIGByYXdgIGF0dHJpYnV0ZSwgd2hpY2ggZm9sbG93cyB0aGUgZm9ybWF0IG9mIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgYHNoYXJwKClgIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nfEJ1ZmZlcj58c3RyaW5nfEJ1ZmZlcn0gaW1hZ2VzIC0gb25lIG9yIG1vcmUgaW1hZ2VzIChmaWxlIHBhdGhzLCBCdWZmZXJzKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gaW1hZ2Ugb3B0aW9ucywgc2VlIGBzaGFycCgpYCBjb25zdHJ1Y3Rvci5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gam9pbkNoYW5uZWwgKGltYWdlcywgb3B0aW9ucykge1xuICBpZiAoQXJyYXkuaXNBcnJheShpbWFnZXMpKSB7XG4gICAgaW1hZ2VzLmZvckVhY2goZnVuY3Rpb24gKGltYWdlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMuam9pbkNoYW5uZWxJbi5wdXNoKHRoaXMuX2NyZWF0ZUlucHV0RGVzY3JpcHRvcihpbWFnZSwgb3B0aW9ucykpO1xuICAgIH0sIHRoaXMpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMub3B0aW9ucy5qb2luQ2hhbm5lbEluLnB1c2godGhpcy5fY3JlYXRlSW5wdXREZXNjcmlwdG9yKGltYWdlcywgb3B0aW9ucykpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFBlcmZvcm0gYSBiaXR3aXNlIGJvb2xlYW4gb3BlcmF0aW9uIG9uIGFsbCBpbnB1dCBpbWFnZSBjaGFubmVscyAoYmFuZHMpIHRvIHByb2R1Y2UgYSBzaW5nbGUgY2hhbm5lbCBvdXRwdXQgaW1hZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKCczLWNoYW5uZWwtcmdiLWlucHV0LnBuZycpXG4gKiAgIC5iYW5kYm9vbChzaGFycC5ib29sLmFuZClcbiAqICAgLnRvRmlsZSgnMS1jaGFubmVsLW91dHB1dC5wbmcnLCBmdW5jdGlvbiAoZXJyLCBpbmZvKSB7XG4gKiAgICAgLy8gVGhlIG91dHB1dCB3aWxsIGJlIGEgc2luZ2xlIGNoYW5uZWwgaW1hZ2Ugd2hlcmUgZWFjaCBwaXhlbCBgUCA9IFIgJiBHICYgQmAuXG4gKiAgICAgLy8gSWYgYEkoMSwxKSA9IFsyNDcsIDE3MCwgMTRdID0gWzBiMTExMTAxMTEsIDBiMTAxMDEwMTAsIDBiMDAwMDExMTFdYFxuICogICAgIC8vIHRoZW4gYE8oMSwxKSA9IDBiMTExMTAxMTEgJiAwYjEwMTAxMDEwICYgMGIwMDAwMTExMSA9IDBiMDAwMDAwMTAgPSAyYC5cbiAqICAgfSk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJvb2xPcCAtIG9uZSBvZiBgYW5kYCwgYG9yYCBvciBgZW9yYCB0byBwZXJmb3JtIHRoYXQgYml0d2lzZSBvcGVyYXRpb24sIGxpa2UgdGhlIEMgbG9naWMgb3BlcmF0b3JzIGAmYCwgYHxgIGFuZCBgXmAgcmVzcGVjdGl2ZWx5LlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiBiYW5kYm9vbCAoYm9vbE9wKSB7XG4gIGlmIChpcy5zdHJpbmcoYm9vbE9wKSAmJiBpcy5pbkFycmF5KGJvb2xPcCwgWydhbmQnLCAnb3InLCAnZW9yJ10pKSB7XG4gICAgdGhpcy5vcHRpb25zLmJhbmRCb29sT3AgPSBib29sT3A7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdib29sT3AnLCAnb25lIG9mOiBhbmQsIG9yLCBlb3InLCBib29sT3ApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIERlY29yYXRlIHRoZSBTaGFycCBwcm90b3R5cGUgd2l0aCBjaGFubmVsLXJlbGF0ZWQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoU2hhcnApIHtcbiAgT2JqZWN0LmFzc2lnbihTaGFycC5wcm90b3R5cGUsIHtcbiAgICAvLyBQdWJsaWMgaW5zdGFuY2UgZnVuY3Rpb25zXG4gICAgcmVtb3ZlQWxwaGEsXG4gICAgZW5zdXJlQWxwaGEsXG4gICAgZXh0cmFjdENoYW5uZWwsXG4gICAgam9pbkNoYW5uZWwsXG4gICAgYmFuZGJvb2xcbiAgfSk7XG4gIC8vIENsYXNzIGF0dHJpYnV0ZXNcbiAgU2hhcnAuYm9vbCA9IGJvb2w7XG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IHBhdGggPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcbmNvbnN0IGlzID0gcmVxdWlyZSgnLi9pcycpO1xuY29uc3Qgc2hhcnAgPSByZXF1aXJlKCcuL3NoYXJwJyk7XG5cbmNvbnN0IGZvcm1hdHMgPSBuZXcgTWFwKFtcbiAgWydoZWljJywgJ2hlaWYnXSxcbiAgWydoZWlmJywgJ2hlaWYnXSxcbiAgWydhdmlmJywgJ2F2aWYnXSxcbiAgWydqcGVnJywgJ2pwZWcnXSxcbiAgWydqcGcnLCAnanBlZyddLFxuICBbJ2pwZScsICdqcGVnJ10sXG4gIFsndGlsZScsICd0aWxlJ10sXG4gIFsnZHonLCAndGlsZSddLFxuICBbJ3BuZycsICdwbmcnXSxcbiAgWydyYXcnLCAncmF3J10sXG4gIFsndGlmZicsICd0aWZmJ10sXG4gIFsndGlmJywgJ3RpZmYnXSxcbiAgWyd3ZWJwJywgJ3dlYnAnXSxcbiAgWydnaWYnLCAnZ2lmJ10sXG4gIFsnanAyJywgJ2pwMiddLFxuICBbJ2pweCcsICdqcDInXSxcbiAgWydqMmsnLCAnanAyJ10sXG4gIFsnajJjJywgJ2pwMiddLFxuICBbJ2p4bCcsICdqeGwnXVxuXSk7XG5cbmNvbnN0IGpwMlJlZ2V4ID0gL1xcLihqcFsyeF18ajJba2NdKSQvaTtcblxuY29uc3QgZXJySnAyU2F2ZSA9ICgpID0+IG5ldyBFcnJvcignSlAyIG91dHB1dCByZXF1aXJlcyBsaWJ2aXBzIHdpdGggc3VwcG9ydCBmb3IgT3BlbkpQRUcnKTtcblxuY29uc3QgYml0ZGVwdGhGcm9tQ29sb3VyQ291bnQgPSAoY29sb3VycykgPT4gMSA8PCAzMSAtIE1hdGguY2x6MzIoTWF0aC5jZWlsKE1hdGgubG9nMihjb2xvdXJzKSkpO1xuXG4vKipcbiAqIFdyaXRlIG91dHB1dCBpbWFnZSBkYXRhIHRvIGEgZmlsZS5cbiAqXG4gKiBJZiBhbiBleHBsaWNpdCBvdXRwdXQgZm9ybWF0IGlzIG5vdCBzZWxlY3RlZCwgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSBleHRlbnNpb24sXG4gKiB3aXRoIEpQRUcsIFBORywgV2ViUCwgQVZJRiwgVElGRiwgR0lGLCBEWkksIGFuZCBsaWJ2aXBzJyBWIGZvcm1hdCBzdXBwb3J0ZWQuXG4gKiBOb3RlIHRoYXQgcmF3IHBpeGVsIGRhdGEgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGJ1ZmZlciBvdXRwdXQuXG4gKlxuICogQnkgZGVmYXVsdCBhbGwgbWV0YWRhdGEgd2lsbCBiZSByZW1vdmVkLCB3aGljaCBpbmNsdWRlcyBFWElGLWJhc2VkIG9yaWVudGF0aW9uLlxuICogU2VlIHtAbGluayAjd2l0aG1ldGFkYXRhfHdpdGhNZXRhZGF0YX0gZm9yIGNvbnRyb2wgb3ZlciB0aGlzLlxuICpcbiAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIGFuZCBwZXJtaXNzaW9ucyBleGlzdC5cbiAqXG4gKiBBIGBQcm9taXNlYCBpcyByZXR1cm5lZCB3aGVuIGBjYWxsYmFja2AgaXMgbm90IHByb3ZpZGVkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnRvRmlsZSgnb3V0cHV0LnBuZycsIChlcnIsIGluZm8pID0+IHsgLi4uIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBzaGFycChpbnB1dClcbiAqICAgLnRvRmlsZSgnb3V0cHV0LnBuZycpXG4gKiAgIC50aGVuKGluZm8gPT4geyAuLi4gfSlcbiAqICAgLmNhdGNoKGVyciA9PiB7IC4uLiB9KTtcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZU91dCAtIHRoZSBwYXRoIHRvIHdyaXRlIHRoZSBpbWFnZSBkYXRhIHRvLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSAtIGNhbGxlZCBvbiBjb21wbGV0aW9uIHdpdGggdHdvIGFyZ3VtZW50cyBgKGVyciwgaW5mbylgLlxuICogYGluZm9gIGNvbnRhaW5zIHRoZSBvdXRwdXQgaW1hZ2UgYGZvcm1hdGAsIGBzaXplYCAoYnl0ZXMpLCBgd2lkdGhgLCBgaGVpZ2h0YCxcbiAqIGBjaGFubmVsc2AgYW5kIGBwcmVtdWx0aXBsaWVkYCAoaW5kaWNhdGluZyBpZiBwcmVtdWx0aXBsaWNhdGlvbiB3YXMgdXNlZCkuXG4gKiBXaGVuIHVzaW5nIGEgY3JvcCBzdHJhdGVneSBhbHNvIGNvbnRhaW5zIGBjcm9wT2Zmc2V0TGVmdGAgYW5kIGBjcm9wT2Zmc2V0VG9wYC5cbiAqIFdoZW4gdXNpbmcgdGhlIGF0dGVudGlvbiBjcm9wIHN0cmF0ZWd5IGFsc28gY29udGFpbnMgYGF0dGVudGlvblhgIGFuZCBgYXR0ZW50aW9uWWAsIHRoZSBmb2NhbCBwb2ludCBvZiB0aGUgY3JvcHBlZCByZWdpb24uXG4gKiBBbmltYXRlZCBvdXRwdXQgd2lsbCBhbHNvIGNvbnRhaW4gYHBhZ2VIZWlnaHRgIGFuZCBgcGFnZXNgLlxuICogTWF5IGFsc28gY29udGFpbiBgdGV4dEF1dG9maXREcGlgIChkcGkgdGhlIGZvbnQgd2FzIHJlbmRlcmVkIGF0KSBpZiBpbWFnZSB3YXMgY3JlYXRlZCBmcm9tIHRleHQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSAtIHdoZW4gbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWRcbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gdG9GaWxlIChmaWxlT3V0LCBjYWxsYmFjaykge1xuICBsZXQgZXJyO1xuICBpZiAoIWlzLnN0cmluZyhmaWxlT3V0KSkge1xuICAgIGVyciA9IG5ldyBFcnJvcignTWlzc2luZyBvdXRwdXQgZmlsZSBwYXRoJyk7XG4gIH0gZWxzZSBpZiAoaXMuc3RyaW5nKHRoaXMub3B0aW9ucy5pbnB1dC5maWxlKSAmJiBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLmlucHV0LmZpbGUpID09PSBwYXRoLnJlc29sdmUoZmlsZU91dCkpIHtcbiAgICBlcnIgPSBuZXcgRXJyb3IoJ0Nhbm5vdCB1c2Ugc2FtZSBmaWxlIGZvciBpbnB1dCBhbmQgb3V0cHV0Jyk7XG4gIH0gZWxzZSBpZiAoanAyUmVnZXgudGVzdChwYXRoLmV4dG5hbWUoZmlsZU91dCkpICYmICF0aGlzLmNvbnN0cnVjdG9yLmZvcm1hdC5qcDJrLm91dHB1dC5maWxlKSB7XG4gICAgZXJyID0gZXJySnAyU2F2ZSgpO1xuICB9XG4gIGlmIChlcnIpIHtcbiAgICBpZiAoaXMuZm4oY2FsbGJhY2spKSB7XG4gICAgICBjYWxsYmFjayhlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5vcHRpb25zLmZpbGVPdXQgPSBmaWxlT3V0O1xuICAgIGNvbnN0IHN0YWNrID0gRXJyb3IoKTtcbiAgICByZXR1cm4gdGhpcy5fcGlwZWxpbmUoY2FsbGJhY2ssIHN0YWNrKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBXcml0ZSBvdXRwdXQgdG8gYSBCdWZmZXIuXG4gKiBKUEVHLCBQTkcsIFdlYlAsIEFWSUYsIFRJRkYsIEdJRiBhbmQgcmF3IHBpeGVsIGRhdGEgb3V0cHV0IGFyZSBzdXBwb3J0ZWQuXG4gKlxuICogVXNlIHtAbGluayAjdG9mb3JtYXR8dG9Gb3JtYXR9IG9yIG9uZSBvZiB0aGUgZm9ybWF0LXNwZWNpZmljIGZ1bmN0aW9ucyBzdWNoIGFzIHtAbGluayBqcGVnfSwge0BsaW5rIHBuZ30gZXRjLiB0byBzZXQgdGhlIG91dHB1dCBmb3JtYXQuXG4gKlxuICogSWYgbm8gZXhwbGljaXQgZm9ybWF0IGlzIHNldCwgdGhlIG91dHB1dCBmb3JtYXQgd2lsbCBtYXRjaCB0aGUgaW5wdXQgaW1hZ2UsIGV4Y2VwdCBTVkcgaW5wdXQgd2hpY2ggYmVjb21lcyBQTkcgb3V0cHV0LlxuICpcbiAqIEJ5IGRlZmF1bHQgYWxsIG1ldGFkYXRhIHdpbGwgYmUgcmVtb3ZlZCwgd2hpY2ggaW5jbHVkZXMgRVhJRi1iYXNlZCBvcmllbnRhdGlvbi5cbiAqIFNlZSB7QGxpbmsgI3dpdGhtZXRhZGF0YXx3aXRoTWV0YWRhdGF9IGZvciBjb250cm9sIG92ZXIgdGhpcy5cbiAqXG4gKiBgY2FsbGJhY2tgLCBpZiBwcmVzZW50LCBnZXRzIHRocmVlIGFyZ3VtZW50cyBgKGVyciwgZGF0YSwgaW5mbylgIHdoZXJlOlxuICogLSBgZXJyYCBpcyBhbiBlcnJvciwgaWYgYW55LlxuICogLSBgZGF0YWAgaXMgdGhlIG91dHB1dCBpbWFnZSBkYXRhLlxuICogLSBgaW5mb2AgY29udGFpbnMgdGhlIG91dHB1dCBpbWFnZSBgZm9ybWF0YCwgYHNpemVgIChieXRlcyksIGB3aWR0aGAsIGBoZWlnaHRgLFxuICogYGNoYW5uZWxzYCBhbmQgYHByZW11bHRpcGxpZWRgIChpbmRpY2F0aW5nIGlmIHByZW11bHRpcGxpY2F0aW9uIHdhcyB1c2VkKS5cbiAqIFdoZW4gdXNpbmcgYSBjcm9wIHN0cmF0ZWd5IGFsc28gY29udGFpbnMgYGNyb3BPZmZzZXRMZWZ0YCBhbmQgYGNyb3BPZmZzZXRUb3BgLlxuICogQW5pbWF0ZWQgb3V0cHV0IHdpbGwgYWxzbyBjb250YWluIGBwYWdlSGVpZ2h0YCBhbmQgYHBhZ2VzYC5cbiAqIE1heSBhbHNvIGNvbnRhaW4gYHRleHRBdXRvZml0RHBpYCAoZHBpIHRoZSBmb250IHdhcyByZW5kZXJlZCBhdCkgaWYgaW1hZ2Ugd2FzIGNyZWF0ZWQgZnJvbSB0ZXh0LlxuICpcbiAqIEEgYFByb21pc2VgIGlzIHJldHVybmVkIHdoZW4gYGNhbGxiYWNrYCBpcyBub3QgcHJvdmlkZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAudG9CdWZmZXIoKGVyciwgZGF0YSwgaW5mbykgPT4geyAuLi4gfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAudG9CdWZmZXIoKVxuICogICAudGhlbihkYXRhID0+IHsgLi4uIH0pXG4gKiAgIC5jYXRjaChlcnIgPT4geyAuLi4gfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIHNoYXJwKGlucHV0KVxuICogICAucG5nKClcbiAqICAgLnRvQnVmZmVyKHsgcmVzb2x2ZVdpdGhPYmplY3Q6IHRydWUgfSlcbiAqICAgLnRoZW4oKHsgZGF0YSwgaW5mbyB9KSA9PiB7IC4uLiB9KVxuICogICAuY2F0Y2goZXJyID0+IHsgLi4uIH0pO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB7IGRhdGEsIGluZm8gfSA9IGF3YWl0IHNoYXJwKCdteS1pbWFnZS5qcGcnKVxuICogICAvLyBvdXRwdXQgdGhlIHJhdyBwaXhlbHNcbiAqICAgLnJhdygpXG4gKiAgIC50b0J1ZmZlcih7IHJlc29sdmVXaXRoT2JqZWN0OiB0cnVlIH0pO1xuICpcbiAqIC8vIGNyZWF0ZSBhIG1vcmUgdHlwZSBzYWZlIHdheSB0byB3b3JrIHdpdGggdGhlIHJhdyBwaXhlbCBkYXRhXG4gKiAvLyB0aGlzIHdpbGwgbm90IGNvcHkgdGhlIGRhdGEsIGluc3RlYWQgaXQgd2lsbCBjaGFuZ2UgYGRhdGFgcyB1bmRlcmx5aW5nIEFycmF5QnVmZmVyXG4gKiAvLyBzbyBgZGF0YWAgYW5kIGBwaXhlbEFycmF5YCBwb2ludCB0byB0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb25cbiAqIGNvbnN0IHBpeGVsQXJyYXkgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5idWZmZXIpO1xuICpcbiAqIC8vIFdoZW4geW91IGFyZSBkb25lIGNoYW5naW5nIHRoZSBwaXhlbEFycmF5LCBzaGFycCB0YWtlcyB0aGUgYHBpeGVsQXJyYXlgIGFzIGFuIGlucHV0XG4gKiBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGNoYW5uZWxzIH0gPSBpbmZvO1xuICogYXdhaXQgc2hhcnAocGl4ZWxBcnJheSwgeyByYXc6IHsgd2lkdGgsIGhlaWdodCwgY2hhbm5lbHMgfSB9KVxuICogICAudG9GaWxlKCdteS1jaGFuZ2VkLWltYWdlLmpwZycpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmVzb2x2ZVdpdGhPYmplY3RdIFJlc29sdmUgdGhlIFByb21pc2Ugd2l0aCBhbiBPYmplY3QgY29udGFpbmluZyBgZGF0YWAgYW5kIGBpbmZvYCBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgcmVzb2x2aW5nIG9ubHkgd2l0aCBgZGF0YWAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY2FsbGJhY2tdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCdWZmZXI+fSAtIHdoZW4gbm8gY2FsbGJhY2sgaXMgcHJvdmlkZWRcbiAqL1xuZnVuY3Rpb24gdG9CdWZmZXIgKG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdyZXNvbHZlV2l0aE9iamVjdCcsIG9wdGlvbnMucmVzb2x2ZVdpdGhPYmplY3QpO1xuICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5yZXNvbHZlV2l0aE9iamVjdCkge1xuICAgIHRoaXMub3B0aW9ucy5yZXNvbHZlV2l0aE9iamVjdCA9IGZhbHNlO1xuICB9XG4gIHRoaXMub3B0aW9ucy5maWxlT3V0ID0gJyc7XG4gIGNvbnN0IHN0YWNrID0gRXJyb3IoKTtcbiAgcmV0dXJuIHRoaXMuX3BpcGVsaW5lKGlzLmZuKG9wdGlvbnMpID8gb3B0aW9ucyA6IGNhbGxiYWNrLCBzdGFjayk7XG59XG5cbi8qKlxuICogS2VlcCBhbGwgRVhJRiBtZXRhZGF0YSBmcm9tIHRoZSBpbnB1dCBpbWFnZSBpbiB0aGUgb3V0cHV0IGltYWdlLlxuICpcbiAqIEVYSUYgbWV0YWRhdGEgaXMgdW5zdXBwb3J0ZWQgZm9yIFRJRkYgb3V0cHV0LlxuICpcbiAqIEBzaW5jZSAwLjMzLjBcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0V2l0aEV4aWYgPSBhd2FpdCBzaGFycChpbnB1dFdpdGhFeGlmKVxuICogICAua2VlcEV4aWYoKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIGtlZXBFeGlmICgpIHtcbiAgdGhpcy5vcHRpb25zLmtlZXBNZXRhZGF0YSB8PSAwYjAwMDAxO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBTZXQgRVhJRiBtZXRhZGF0YSBpbiB0aGUgb3V0cHV0IGltYWdlLCBpZ25vcmluZyBhbnkgRVhJRiBpbiB0aGUgaW5wdXQgaW1hZ2UuXG4gKlxuICogQHNpbmNlIDAuMzMuMFxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBkYXRhV2l0aEV4aWYgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLndpdGhFeGlmKHtcbiAqICAgICBJRkQwOiB7XG4gKiAgICAgICBDb3B5cmlnaHQ6ICdUaGUgTmF0aW9uYWwgR2FsbGVyeSdcbiAqICAgICB9LFxuICogICAgIElGRDM6IHtcbiAqICAgICAgIEdQU0xhdGl0dWRlUmVmOiAnTicsXG4gKiAgICAgICBHUFNMYXRpdHVkZTogJzUxLzEgMzAvMSAzMjMwLzEwMCcsXG4gKiAgICAgICBHUFNMb25naXR1ZGVSZWY6ICdXJyxcbiAqICAgICAgIEdQU0xvbmdpdHVkZTogJzAvMSA3LzEgNDM2Ni8xMDAnXG4gKiAgICAgfVxuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIE9iamVjdDxzdHJpbmcsIHN0cmluZz4+fSBleGlmIE9iamVjdCBrZXllZCBieSBJRkQwLCBJRkQxIGV0Yy4gb2Yga2V5L3ZhbHVlIHN0cmluZyBwYWlycyB0byB3cml0ZSBhcyBFWElGIGRhdGEuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIHdpdGhFeGlmIChleGlmKSB7XG4gIGlmIChpcy5vYmplY3QoZXhpZikpIHtcbiAgICBmb3IgKGNvbnN0IFtpZmQsIGVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGV4aWYpKSB7XG4gICAgICBpZiAoaXMub2JqZWN0KGVudHJpZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgICAgICAgaWYgKGlzLnN0cmluZyh2KSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLndpdGhFeGlmW2BleGlmLSR7aWZkLnRvTG93ZXJDYXNlKCl9LSR7a31gXSA9IHY7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcihgJHtpZmR9LiR7a31gLCAnc3RyaW5nJywgdik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoaWZkLCAnb2JqZWN0JywgZW50cmllcyk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZXhpZicsICdvYmplY3QnLCBleGlmKTtcbiAgfVxuICB0aGlzLm9wdGlvbnMud2l0aEV4aWZNZXJnZSA9IGZhbHNlO1xuICByZXR1cm4gdGhpcy5rZWVwRXhpZigpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBFWElGIG1ldGFkYXRhIGZyb20gdGhlIGlucHV0IGltYWdlIGluIHRoZSBvdXRwdXQgaW1hZ2UuXG4gKlxuICogQHNpbmNlIDAuMzMuMFxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBkYXRhV2l0aE1lcmdlZEV4aWYgPSBhd2FpdCBzaGFycChpbnB1dFdpdGhFeGlmKVxuICogICAud2l0aEV4aWZNZXJnZSh7XG4gKiAgICAgSUZEMDoge1xuICogICAgICAgQ29weXJpZ2h0OiAnVGhlIE5hdGlvbmFsIEdhbGxlcnknXG4gKiAgICAgfVxuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIE9iamVjdDxzdHJpbmcsIHN0cmluZz4+fSBleGlmIE9iamVjdCBrZXllZCBieSBJRkQwLCBJRkQxIGV0Yy4gb2Yga2V5L3ZhbHVlIHN0cmluZyBwYWlycyB0byB3cml0ZSBhcyBFWElGIGRhdGEuXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKi9cbmZ1bmN0aW9uIHdpdGhFeGlmTWVyZ2UgKGV4aWYpIHtcbiAgdGhpcy53aXRoRXhpZihleGlmKTtcbiAgdGhpcy5vcHRpb25zLndpdGhFeGlmTWVyZ2UgPSB0cnVlO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBLZWVwIElDQyBwcm9maWxlIGZyb20gdGhlIGlucHV0IGltYWdlIGluIHRoZSBvdXRwdXQgaW1hZ2UuXG4gKlxuICogV2hlcmUgbmVjZXNzYXJ5LCB3aWxsIGF0dGVtcHQgdG8gY29udmVydCB0aGUgb3V0cHV0IGNvbG91ciBzcGFjZSB0byBtYXRjaCB0aGUgcHJvZmlsZS5cbiAqXG4gKiBAc2luY2UgMC4zMy4wXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dFdpdGhJY2NQcm9maWxlID0gYXdhaXQgc2hhcnAoaW5wdXRXaXRoSWNjUHJvZmlsZSlcbiAqICAgLmtlZXBJY2NQcm9maWxlKClcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiBrZWVwSWNjUHJvZmlsZSAoKSB7XG4gIHRoaXMub3B0aW9ucy5rZWVwTWV0YWRhdGEgfD0gMGIwMTAwMDtcbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogVHJhbnNmb3JtIHVzaW5nIGFuIElDQyBwcm9maWxlIGFuZCBhdHRhY2ggdG8gdGhlIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBUaGlzIGNhbiBlaXRoZXIgYmUgYW4gYWJzb2x1dGUgZmlsZXN5c3RlbSBwYXRoIG9yXG4gKiBidWlsdC1pbiBwcm9maWxlIG5hbWUgKGBzcmdiYCwgYHAzYCwgYGNteWtgKS5cbiAqXG4gKiBAc2luY2UgMC4zMy4wXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dFdpdGhQMyA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAud2l0aEljY1Byb2ZpbGUoJ3AzJylcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGljYyAtIEFic29sdXRlIGZpbGVzeXN0ZW0gcGF0aCB0byBvdXRwdXQgSUNDIHByb2ZpbGUgb3IgYnVpbHQtaW4gcHJvZmlsZSBuYW1lIChzcmdiLCBwMywgY215aykuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYXR0YWNoPXRydWVdIFNob3VsZCB0aGUgSUNDIHByb2ZpbGUgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBpbWFnZSBtZXRhZGF0YT9cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gd2l0aEljY1Byb2ZpbGUgKGljYywgb3B0aW9ucykge1xuICBpZiAoaXMuc3RyaW5nKGljYykpIHtcbiAgICB0aGlzLm9wdGlvbnMud2l0aEljY1Byb2ZpbGUgPSBpY2M7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdpY2MnLCAnc3RyaW5nJywgaWNjKTtcbiAgfVxuICB0aGlzLmtlZXBJY2NQcm9maWxlKCk7XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmF0dGFjaCkpIHtcbiAgICAgIGlmIChpcy5ib29sKG9wdGlvbnMuYXR0YWNoKSkge1xuICAgICAgICBpZiAoIW9wdGlvbnMuYXR0YWNoKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmtlZXBNZXRhZGF0YSAmPSB+MGIwMTAwMDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhdHRhY2gnLCAnYm9vbGVhbicsIG9wdGlvbnMuYXR0YWNoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogS2VlcCBhbGwgbWV0YWRhdGEgKEVYSUYsIElDQywgWE1QLCBJUFRDKSBmcm9tIHRoZSBpbnB1dCBpbWFnZSBpbiB0aGUgb3V0cHV0IGltYWdlLlxuICpcbiAqIFRoZSBkZWZhdWx0IGJlaGF2aW91ciwgd2hlbiBga2VlcE1ldGFkYXRhYCBpcyBub3QgdXNlZCwgaXMgdG8gY29udmVydCB0byB0aGUgZGV2aWNlLWluZGVwZW5kZW50XG4gKiBzUkdCIGNvbG91ciBzcGFjZSBhbmQgc3RyaXAgYWxsIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHJlbW92YWwgb2YgYW55IElDQyBwcm9maWxlLlxuICpcbiAqIEBzaW5jZSAwLjMzLjBcbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3Qgb3V0cHV0V2l0aE1ldGFkYXRhID0gYXdhaXQgc2hhcnAoaW5wdXRXaXRoTWV0YWRhdGEpXG4gKiAgIC5rZWVwTWV0YWRhdGEoKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKi9cbmZ1bmN0aW9uIGtlZXBNZXRhZGF0YSAoKSB7XG4gIHRoaXMub3B0aW9ucy5rZWVwTWV0YWRhdGEgPSAwYjExMTExO1xuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBLZWVwIG1vc3QgbWV0YWRhdGEgKEVYSUYsIFhNUCwgSVBUQykgZnJvbSB0aGUgaW5wdXQgaW1hZ2UgaW4gdGhlIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBUaGlzIHdpbGwgYWxzbyBjb252ZXJ0IHRvIGFuZCBhZGQgYSB3ZWItZnJpZW5kbHkgc1JHQiBJQ0MgcHJvZmlsZSBpZiBhcHByb3ByaWF0ZS5cbiAqXG4gKiBBbGxvd3Mgb3JpZW50YXRpb24gYW5kIGRlbnNpdHkgdG8gYmUgc2V0IG9yIHVwZGF0ZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG91dHB1dFNyZ2JXaXRoTWV0YWRhdGEgPSBhd2FpdCBzaGFycChpbnB1dFJnYldpdGhNZXRhZGF0YSlcbiAqICAgLndpdGhNZXRhZGF0YSgpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBTZXQgb3V0cHV0IG1ldGFkYXRhIHRvIDk2IERQSVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAud2l0aE1ldGFkYXRhKHsgZGVuc2l0eTogOTYgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLm9yaWVudGF0aW9uXSBVc2VkIHRvIHVwZGF0ZSB0aGUgRVhJRiBgT3JpZW50YXRpb25gIHRhZywgaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDguXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZGVuc2l0eV0gTnVtYmVyIG9mIHBpeGVscyBwZXIgaW5jaCAoRFBJKS5cbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIHBhcmFtZXRlcnNcbiAqL1xuZnVuY3Rpb24gd2l0aE1ldGFkYXRhIChvcHRpb25zKSB7XG4gIHRoaXMua2VlcE1ldGFkYXRhKCk7XG4gIHRoaXMud2l0aEljY1Byb2ZpbGUoJ3NyZ2InKTtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMub3JpZW50YXRpb24pKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLm9yaWVudGF0aW9uKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMub3JpZW50YXRpb24sIDEsIDgpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy53aXRoTWV0YWRhdGFPcmllbnRhdGlvbiA9IG9wdGlvbnMub3JpZW50YXRpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29yaWVudGF0aW9uJywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCA4Jywgb3B0aW9ucy5vcmllbnRhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZGVuc2l0eSkpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5kZW5zaXR5KSAmJiBvcHRpb25zLmRlbnNpdHkgPiAwKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy53aXRoTWV0YWRhdGFEZW5zaXR5ID0gb3B0aW9ucy5kZW5zaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdkZW5zaXR5JywgJ3Bvc2l0aXZlIG51bWJlcicsIG9wdGlvbnMuZGVuc2l0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuaWNjKSkge1xuICAgICAgdGhpcy53aXRoSWNjUHJvZmlsZShvcHRpb25zLmljYyk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZXhpZikpIHtcbiAgICAgIHRoaXMud2l0aEV4aWZNZXJnZShvcHRpb25zLmV4aWYpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBGb3JjZSBvdXRwdXQgdG8gYSBnaXZlbiBmb3JtYXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgYW55IGlucHV0IHRvIFBORyBvdXRwdXRcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnRvRm9ybWF0KCdwbmcnKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0geyhzdHJpbmd8T2JqZWN0KX0gZm9ybWF0IC0gYXMgYSBzdHJpbmcgb3IgYW4gT2JqZWN0IHdpdGggYW4gJ2lkJyBhdHRyaWJ1dGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSB1bnN1cHBvcnRlZCBmb3JtYXQgb3Igb3B0aW9uc1xuICovXG5mdW5jdGlvbiB0b0Zvcm1hdCAoZm9ybWF0LCBvcHRpb25zKSB7XG4gIGNvbnN0IGFjdHVhbEZvcm1hdCA9IGZvcm1hdHMuZ2V0KChpcy5vYmplY3QoZm9ybWF0KSAmJiBpcy5zdHJpbmcoZm9ybWF0LmlkKSA/IGZvcm1hdC5pZCA6IGZvcm1hdCkudG9Mb3dlckNhc2UoKSk7XG4gIGlmICghYWN0dWFsRm9ybWF0KSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdmb3JtYXQnLCBgb25lIG9mOiAke1suLi5mb3JtYXRzLmtleXMoKV0uam9pbignLCAnKX1gLCBmb3JtYXQpO1xuICB9XG4gIHJldHVybiB0aGlzW2FjdHVhbEZvcm1hdF0ob3B0aW9ucyk7XG59XG5cbi8qKlxuICogVXNlIHRoZXNlIEpQRUcgb3B0aW9ucyBmb3Igb3V0cHV0IGltYWdlLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IGFueSBpbnB1dCB0byB2ZXJ5IGhpZ2ggcXVhbGl0eSBKUEVHIG91dHB1dFxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuanBlZyh7XG4gKiAgICAgcXVhbGl0eTogMTAwLFxuICogICAgIGNocm9tYVN1YnNhbXBsaW5nOiAnNDo0OjQnXG4gKiAgIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2UgbW96anBlZyB0byByZWR1Y2Ugb3V0cHV0IEpQRUcgZmlsZSBzaXplIChzbG93ZXIpXG4gKiBjb25zdCBkYXRhID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5qcGVnKHsgbW96anBlZzogdHJ1ZSB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFsaXR5PTgwXSAtIHF1YWxpdHksIGludGVnZXIgMS0xMDBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJvZ3Jlc3NpdmU9ZmFsc2VdIC0gdXNlIHByb2dyZXNzaXZlIChpbnRlcmxhY2UpIHNjYW5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZz0nNDoyOjAnXSAtIHNldCB0byAnNDo0OjQnIHRvIHByZXZlbnQgY2hyb21hIHN1YnNhbXBsaW5nIG90aGVyd2lzZSBkZWZhdWx0cyB0byAnNDoyOjAnIGNocm9tYSBzdWJzYW1wbGluZ1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5vcHRpbWlzZUNvZGluZz10cnVlXSAtIG9wdGltaXNlIEh1ZmZtYW4gY29kaW5nIHRhYmxlc1xuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5vcHRpbWl6ZUNvZGluZz10cnVlXSAtIGFsdGVybmF0aXZlIHNwZWxsaW5nIG9mIG9wdGltaXNlQ29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm1vempwZWc9ZmFsc2VdIC0gdXNlIG1vempwZWcgZGVmYXVsdHMsIGVxdWl2YWxlbnQgdG8gYHsgdHJlbGxpc1F1YW50aXNhdGlvbjogdHJ1ZSwgb3ZlcnNob290RGVyaW5naW5nOiB0cnVlLCBvcHRpbWlzZVNjYW5zOiB0cnVlLCBxdWFudGlzYXRpb25UYWJsZTogMyB9YFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmVsbGlzUXVhbnRpc2F0aW9uPWZhbHNlXSAtIGFwcGx5IHRyZWxsaXMgcXVhbnRpc2F0aW9uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm92ZXJzaG9vdERlcmluZ2luZz1mYWxzZV0gLSBhcHBseSBvdmVyc2hvb3QgZGVyaW5naW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm9wdGltaXNlU2NhbnM9ZmFsc2VdIC0gb3B0aW1pc2UgcHJvZ3Jlc3NpdmUgc2NhbnMsIGZvcmNlcyBwcm9ncmVzc2l2ZVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5vcHRpbWl6ZVNjYW5zPWZhbHNlXSAtIGFsdGVybmF0aXZlIHNwZWxsaW5nIG9mIG9wdGltaXNlU2NhbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFudGlzYXRpb25UYWJsZT0wXSAtIHF1YW50aXphdGlvbiB0YWJsZSB0byB1c2UsIGludGVnZXIgMC04XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucXVhbnRpemF0aW9uVGFibGU9MF0gLSBhbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBxdWFudGlzYXRpb25UYWJsZVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JjZT10cnVlXSAtIGZvcmNlIEpQRUcgb3V0cHV0LCBvdGhlcndpc2UgYXR0ZW1wdCB0byB1c2UgaW5wdXQgZm9ybWF0XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGpwZWcgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucXVhbGl0eSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMucXVhbGl0eSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnF1YWxpdHksIDEsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdRdWFsaXR5ID0gb3B0aW9ucy5xdWFsaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnByb2dyZXNzaXZlKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignanBlZ1Byb2dyZXNzaXZlJywgb3B0aW9ucy5wcm9ncmVzc2l2ZSk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmcpKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmcpICYmIGlzLmluQXJyYXkob3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZywgWyc0OjI6MCcsICc0OjQ6NCddKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanBlZ0Nocm9tYVN1YnNhbXBsaW5nID0gb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY2hyb21hU3Vic2FtcGxpbmcnLCAnb25lIG9mOiA0OjI6MCwgNDo0OjQnLCBvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb3B0aW1pc2VDb2RpbmcgPSBpcy5ib29sKG9wdGlvbnMub3B0aW1pemVDb2RpbmcpID8gb3B0aW9ucy5vcHRpbWl6ZUNvZGluZyA6IG9wdGlvbnMub3B0aW1pc2VDb2Rpbmc7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW1pc2VDb2RpbmcpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdqcGVnT3B0aW1pc2VDb2RpbmcnLCBvcHRpbWlzZUNvZGluZyk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubW96anBlZykpIHtcbiAgICAgIGlmIChpcy5ib29sKG9wdGlvbnMubW96anBlZykpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubW96anBlZykge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5qcGVnVHJlbGxpc1F1YW50aXNhdGlvbiA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdPdmVyc2hvb3REZXJpbmdpbmcgPSB0cnVlO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5qcGVnT3B0aW1pc2VTY2FucyA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdQcm9ncmVzc2l2ZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdRdWFudGlzYXRpb25UYWJsZSA9IDM7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbW96anBlZycsICdib29sZWFuJywgb3B0aW9ucy5tb3pqcGVnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgdHJlbGxpc1F1YW50aXNhdGlvbiA9IGlzLmJvb2wob3B0aW9ucy50cmVsbGlzUXVhbnRpemF0aW9uKSA/IG9wdGlvbnMudHJlbGxpc1F1YW50aXphdGlvbiA6IG9wdGlvbnMudHJlbGxpc1F1YW50aXNhdGlvbjtcbiAgICBpZiAoaXMuZGVmaW5lZCh0cmVsbGlzUXVhbnRpc2F0aW9uKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignanBlZ1RyZWxsaXNRdWFudGlzYXRpb24nLCB0cmVsbGlzUXVhbnRpc2F0aW9uKTtcbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5vdmVyc2hvb3REZXJpbmdpbmcpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdqcGVnT3ZlcnNob290RGVyaW5naW5nJywgb3B0aW9ucy5vdmVyc2hvb3REZXJpbmdpbmcpO1xuICAgIH1cbiAgICBjb25zdCBvcHRpbWlzZVNjYW5zID0gaXMuYm9vbChvcHRpb25zLm9wdGltaXplU2NhbnMpID8gb3B0aW9ucy5vcHRpbWl6ZVNjYW5zIDogb3B0aW9ucy5vcHRpbWlzZVNjYW5zO1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGltaXNlU2NhbnMpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdqcGVnT3B0aW1pc2VTY2FucycsIG9wdGltaXNlU2NhbnMpO1xuICAgICAgaWYgKG9wdGltaXNlU2NhbnMpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdQcm9ncmVzc2l2ZSA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHF1YW50aXNhdGlvblRhYmxlID0gaXMubnVtYmVyKG9wdGlvbnMucXVhbnRpemF0aW9uVGFibGUpID8gb3B0aW9ucy5xdWFudGl6YXRpb25UYWJsZSA6IG9wdGlvbnMucXVhbnRpc2F0aW9uVGFibGU7XG4gICAgaWYgKGlzLmRlZmluZWQocXVhbnRpc2F0aW9uVGFibGUpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihxdWFudGlzYXRpb25UYWJsZSkgJiYgaXMuaW5SYW5nZShxdWFudGlzYXRpb25UYWJsZSwgMCwgOCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwZWdRdWFudGlzYXRpb25UYWJsZSA9IHF1YW50aXNhdGlvblRhYmxlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFudGlzYXRpb25UYWJsZScsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgOCcsIHF1YW50aXNhdGlvblRhYmxlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgnanBlZycsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFVzZSB0aGVzZSBQTkcgb3B0aW9ucyBmb3Igb3V0cHV0IGltYWdlLlxuICpcbiAqIEJ5IGRlZmF1bHQsIFBORyBvdXRwdXQgaXMgZnVsbCBjb2xvdXIgYXQgOCBiaXRzIHBlciBwaXhlbC5cbiAqXG4gKiBJbmRleGVkIFBORyBpbnB1dCBhdCAxLCAyIG9yIDQgYml0cyBwZXIgcGl4ZWwgaXMgY29udmVydGVkIHRvIDggYml0cyBwZXIgcGl4ZWwuXG4gKiBTZXQgYHBhbGV0dGVgIHRvIGB0cnVlYCBmb3Igc2xvd2VyLCBpbmRleGVkIFBORyBvdXRwdXQuXG4gKlxuICogRm9yIDE2IGJpdHMgcGVyIHBpeGVsIG91dHB1dCwgY29udmVydCB0byBgcmdiMTZgIHZpYVxuICoge0BsaW5rIC9hcGktY29sb3VyI3RvY29sb3Vyc3BhY2V8dG9Db2xvdXJzcGFjZX0uXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgYW55IGlucHV0IHRvIGZ1bGwgY29sb3VyIFBORyBvdXRwdXRcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnBuZygpXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IGFueSBpbnB1dCB0byBpbmRleGVkIFBORyBvdXRwdXQgKHNsb3dlcilcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnBuZyh7IHBhbGV0dGU6IHRydWUgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE91dHB1dCAxNiBiaXRzIHBlciBwaXhlbCBSR0IoQSlcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAudG9Db2xvdXJzcGFjZSgncmdiMTYnKVxuICogIC5wbmcoKVxuICogIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJvZ3Jlc3NpdmU9ZmFsc2VdIC0gdXNlIHByb2dyZXNzaXZlIChpbnRlcmxhY2UpIHNjYW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jb21wcmVzc2lvbkxldmVsPTZdIC0gemxpYiBjb21wcmVzc2lvbiBsZXZlbCwgMCAoZmFzdGVzdCwgbGFyZ2VzdCkgdG8gOSAoc2xvd2VzdCwgc21hbGxlc3QpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFkYXB0aXZlRmlsdGVyaW5nPWZhbHNlXSAtIHVzZSBhZGFwdGl2ZSByb3cgZmlsdGVyaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnBhbGV0dGU9ZmFsc2VdIC0gcXVhbnRpc2UgdG8gYSBwYWxldHRlLWJhc2VkIGltYWdlIHdpdGggYWxwaGEgdHJhbnNwYXJlbmN5IHN1cHBvcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFsaXR5PTEwMF0gLSB1c2UgdGhlIGxvd2VzdCBudW1iZXIgb2YgY29sb3VycyBuZWVkZWQgdG8gYWNoaWV2ZSBnaXZlbiBxdWFsaXR5LCBzZXRzIGBwYWxldHRlYCB0byBgdHJ1ZWBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5lZmZvcnQ9N10gLSBDUFUgZWZmb3J0LCBiZXR3ZWVuIDEgKGZhc3Rlc3QpIGFuZCAxMCAoc2xvd2VzdCksIHNldHMgYHBhbGV0dGVgIHRvIGB0cnVlYFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmNvbG91cnM9MjU2XSAtIG1heGltdW0gbnVtYmVyIG9mIHBhbGV0dGUgZW50cmllcywgc2V0cyBgcGFsZXR0ZWAgdG8gYHRydWVgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY29sb3JzPTI1Nl0gLSBhbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBgb3B0aW9ucy5jb2xvdXJzYCwgc2V0cyBgcGFsZXR0ZWAgdG8gYHRydWVgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZGl0aGVyPTEuMF0gLSBsZXZlbCBvZiBGbG95ZC1TdGVpbmJlcmcgZXJyb3IgZGlmZnVzaW9uLCBzZXRzIGBwYWxldHRlYCB0byBgdHJ1ZWBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZm9yY2U9dHJ1ZV0gLSBmb3JjZSBQTkcgb3V0cHV0LCBvdGhlcndpc2UgYXR0ZW1wdCB0byB1c2UgaW5wdXQgZm9ybWF0XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHBuZyAob3B0aW9ucykge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5wcm9ncmVzc2l2ZSkpIHtcbiAgICAgIHRoaXMuX3NldEJvb2xlYW5PcHRpb24oJ3BuZ1Byb2dyZXNzaXZlJywgb3B0aW9ucy5wcm9ncmVzc2l2ZSk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuY29tcHJlc3Npb25MZXZlbCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMuY29tcHJlc3Npb25MZXZlbCkgJiYgaXMuaW5SYW5nZShvcHRpb25zLmNvbXByZXNzaW9uTGV2ZWwsIDAsIDkpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5wbmdDb21wcmVzc2lvbkxldmVsID0gb3B0aW9ucy5jb21wcmVzc2lvbkxldmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdjb21wcmVzc2lvbkxldmVsJywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCA5Jywgb3B0aW9ucy5jb21wcmVzc2lvbkxldmVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5hZGFwdGl2ZUZpbHRlcmluZykpIHtcbiAgICAgIHRoaXMuX3NldEJvb2xlYW5PcHRpb24oJ3BuZ0FkYXB0aXZlRmlsdGVyaW5nJywgb3B0aW9ucy5hZGFwdGl2ZUZpbHRlcmluZyk7XG4gICAgfVxuICAgIGNvbnN0IGNvbG91cnMgPSBvcHRpb25zLmNvbG91cnMgfHwgb3B0aW9ucy5jb2xvcnM7XG4gICAgaWYgKGlzLmRlZmluZWQoY29sb3VycykpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKGNvbG91cnMpICYmIGlzLmluUmFuZ2UoY29sb3VycywgMiwgMjU2KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMucG5nQml0ZGVwdGggPSBiaXRkZXB0aEZyb21Db2xvdXJDb3VudChjb2xvdXJzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY29sb3VycycsICdpbnRlZ2VyIGJldHdlZW4gMiBhbmQgMjU2JywgY29sb3Vycyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucGFsZXR0ZSkpIHtcbiAgICAgIHRoaXMuX3NldEJvb2xlYW5PcHRpb24oJ3BuZ1BhbGV0dGUnLCBvcHRpb25zLnBhbGV0dGUpO1xuICAgIH0gZWxzZSBpZiAoW29wdGlvbnMucXVhbGl0eSwgb3B0aW9ucy5lZmZvcnQsIG9wdGlvbnMuY29sb3Vycywgb3B0aW9ucy5jb2xvcnMsIG9wdGlvbnMuZGl0aGVyXS5zb21lKGlzLmRlZmluZWQpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdwbmdQYWxldHRlJywgdHJ1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLm9wdGlvbnMucG5nUGFsZXR0ZSkge1xuICAgICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5xdWFsaXR5KSkge1xuICAgICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLnF1YWxpdHkpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5xdWFsaXR5LCAwLCAxMDApKSB7XG4gICAgICAgICAgdGhpcy5vcHRpb25zLnBuZ1F1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmVmZm9ydCkpIHtcbiAgICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5lZmZvcnQpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5lZmZvcnQsIDEsIDEwKSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5wbmdFZmZvcnQgPSBvcHRpb25zLmVmZm9ydDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2VmZm9ydCcsICdpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAnLCBvcHRpb25zLmVmZm9ydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZGl0aGVyKSkge1xuICAgICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMuZGl0aGVyKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuZGl0aGVyLCAwLCAxKSkge1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5wbmdEaXRoZXIgPSBvcHRpb25zLmRpdGhlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2RpdGhlcicsICdudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDEuMCcsIG9wdGlvbnMuZGl0aGVyKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fdXBkYXRlRm9ybWF0T3V0KCdwbmcnLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBVc2UgdGhlc2UgV2ViUCBvcHRpb25zIGZvciBvdXRwdXQgaW1hZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgYW55IGlucHV0IHRvIGxvc3NsZXNzIFdlYlAgb3V0cHV0XG4gKiBjb25zdCBkYXRhID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC53ZWJwKHsgbG9zc2xlc3M6IHRydWUgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE9wdGltaXNlIHRoZSBmaWxlIHNpemUgb2YgYW4gYW5pbWF0ZWQgV2ViUFxuICogY29uc3Qgb3V0cHV0V2VicCA9IGF3YWl0IHNoYXJwKGlucHV0V2VicCwgeyBhbmltYXRlZDogdHJ1ZSB9KVxuICogICAud2VicCh7IGVmZm9ydDogNiB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFsaXR5PTgwXSAtIHF1YWxpdHksIGludGVnZXIgMS0xMDBcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5hbHBoYVF1YWxpdHk9MTAwXSAtIHF1YWxpdHkgb2YgYWxwaGEgbGF5ZXIsIGludGVnZXIgMC0xMDBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubG9zc2xlc3M9ZmFsc2VdIC0gdXNlIGxvc3NsZXNzIGNvbXByZXNzaW9uIG1vZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubmVhckxvc3NsZXNzPWZhbHNlXSAtIHVzZSBuZWFyX2xvc3NsZXNzIGNvbXByZXNzaW9uIG1vZGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc21hcnRTdWJzYW1wbGU9ZmFsc2VdIC0gdXNlIGhpZ2ggcXVhbGl0eSBjaHJvbWEgc3Vic2FtcGxpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5wcmVzZXQ9J2RlZmF1bHQnXSAtIG5hbWVkIHByZXNldCBmb3IgcHJlcHJvY2Vzc2luZy9maWx0ZXJpbmcsIG9uZSBvZjogZGVmYXVsdCwgcGhvdG8sIHBpY3R1cmUsIGRyYXdpbmcsIGljb24sIHRleHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5lZmZvcnQ9NF0gLSBDUFUgZWZmb3J0LCBiZXR3ZWVuIDAgKGZhc3Rlc3QpIGFuZCA2IChzbG93ZXN0KVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmxvb3A9MF0gLSBudW1iZXIgb2YgYW5pbWF0aW9uIGl0ZXJhdGlvbnMsIHVzZSAwIGZvciBpbmZpbml0ZSBhbmltYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyfG51bWJlcltdfSBbb3B0aW9ucy5kZWxheV0gLSBkZWxheShzKSBiZXR3ZWVuIGFuaW1hdGlvbiBmcmFtZXMgKGluIG1pbGxpc2Vjb25kcylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubWluU2l6ZT1mYWxzZV0gLSBwcmV2ZW50IHVzZSBvZiBhbmltYXRpb24ga2V5IGZyYW1lcyB0byBtaW5pbWlzZSBmaWxlIHNpemUgKHNsb3cpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLm1peGVkPWZhbHNlXSAtIGFsbG93IG1peHR1cmUgb2YgbG9zc3kgYW5kIGxvc3NsZXNzIGFuaW1hdGlvbiBmcmFtZXMgKHNsb3cpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmNlPXRydWVdIC0gZm9yY2UgV2ViUCBvdXRwdXQsIG90aGVyd2lzZSBhdHRlbXB0IHRvIHVzZSBpbnB1dCBmb3JtYXRcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gd2VicCAob3B0aW9ucykge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5xdWFsaXR5KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5xdWFsaXR5KSAmJiBpcy5pblJhbmdlKG9wdGlvbnMucXVhbGl0eSwgMSwgMTAwKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMud2VicFF1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3F1YWxpdHknLCAnaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCcsIG9wdGlvbnMucXVhbGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuYWxwaGFRdWFsaXR5KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5hbHBoYVF1YWxpdHkpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5hbHBoYVF1YWxpdHksIDAsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLndlYnBBbHBoYVF1YWxpdHkgPSBvcHRpb25zLmFscGhhUXVhbGl0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignYWxwaGFRdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCAxMDAnLCBvcHRpb25zLmFscGhhUXVhbGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubG9zc2xlc3MpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd3ZWJwTG9zc2xlc3MnLCBvcHRpb25zLmxvc3NsZXNzKTtcbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5uZWFyTG9zc2xlc3MpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd3ZWJwTmVhckxvc3NsZXNzJywgb3B0aW9ucy5uZWFyTG9zc2xlc3MpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnNtYXJ0U3Vic2FtcGxlKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignd2VicFNtYXJ0U3Vic2FtcGxlJywgb3B0aW9ucy5zbWFydFN1YnNhbXBsZSk7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucHJlc2V0KSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLnByZXNldCkgJiYgaXMuaW5BcnJheShvcHRpb25zLnByZXNldCwgWydkZWZhdWx0JywgJ3Bob3RvJywgJ3BpY3R1cmUnLCAnZHJhd2luZycsICdpY29uJywgJ3RleHQnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLndlYnBQcmVzZXQgPSBvcHRpb25zLnByZXNldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncHJlc2V0JywgJ29uZSBvZjogZGVmYXVsdCwgcGhvdG8sIHBpY3R1cmUsIGRyYXdpbmcsIGljb24sIHRleHQnLCBvcHRpb25zLnByZXNldCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZWZmb3J0KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5lZmZvcnQpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5lZmZvcnQsIDAsIDYpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy53ZWJwRWZmb3J0ID0gb3B0aW9ucy5lZmZvcnQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2VmZm9ydCcsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNicsIG9wdGlvbnMuZWZmb3J0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5taW5TaXplKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignd2VicE1pblNpemUnLCBvcHRpb25zLm1pblNpemUpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLm1peGVkKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignd2VicE1peGVkJywgb3B0aW9ucy5taXhlZCk7XG4gICAgfVxuICB9XG4gIHRyeVNldEFuaW1hdGlvbk9wdGlvbnMob3B0aW9ucywgdGhpcy5vcHRpb25zKTtcbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgnd2VicCcsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFVzZSB0aGVzZSBHSUYgb3B0aW9ucyBmb3IgdGhlIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBUaGUgZmlyc3QgZW50cnkgaW4gdGhlIHBhbGV0dGUgaXMgcmVzZXJ2ZWQgZm9yIHRyYW5zcGFyZW5jeS5cbiAqXG4gKiBUaGUgcGFsZXR0ZSBvZiB0aGUgaW5wdXQgaW1hZ2Ugd2lsbCBiZSByZS11c2VkIGlmIHBvc3NpYmxlLlxuICpcbiAqIEBzaW5jZSAwLjMwLjBcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBQTkcgdG8gR0lGXG4gKiBhd2FpdCBzaGFycChwbmdCdWZmZXIpXG4gKiAgIC5naWYoKVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBhbmltYXRlZCBXZWJQIHRvIGFuaW1hdGVkIEdJRlxuICogYXdhaXQgc2hhcnAoJ2FuaW1hdGVkLndlYnAnLCB7IGFuaW1hdGVkOiB0cnVlIH0pXG4gKiAgIC50b0ZpbGUoJ2FuaW1hdGVkLmdpZicpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSAxMjh4MTI4LCBjcm9wcGVkLCBub24tZGl0aGVyZWQsIGFuaW1hdGVkIHRodW1ibmFpbCBvZiBhbiBhbmltYXRlZCBHSUZcbiAqIGNvbnN0IG91dCA9IGF3YWl0IHNoYXJwKCdpbi5naWYnLCB7IGFuaW1hdGVkOiB0cnVlIH0pXG4gKiAgIC5yZXNpemUoeyB3aWR0aDogMTI4LCBoZWlnaHQ6IDEyOCB9KVxuICogICAuZ2lmKHsgZGl0aGVyOiAwIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBMb3NzeSBmaWxlIHNpemUgcmVkdWN0aW9uIG9mIGFuaW1hdGVkIEdJRlxuICogYXdhaXQgc2hhcnAoJ2luLmdpZicsIHsgYW5pbWF0ZWQ6IHRydWUgfSlcbiAqICAgLmdpZih7IGludGVyRnJhbWVNYXhFcnJvcjogOCB9KVxuICogICAudG9GaWxlKCdvcHRpbS5naWYnKTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucmV1c2U9dHJ1ZV0gLSByZS11c2UgZXhpc3RpbmcgcGFsZXR0ZSwgb3RoZXJ3aXNlIGdlbmVyYXRlIG5ldyAoc2xvdylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJvZ3Jlc3NpdmU9ZmFsc2VdIC0gdXNlIHByb2dyZXNzaXZlIChpbnRlcmxhY2UpIHNjYW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5jb2xvdXJzPTI1Nl0gLSBtYXhpbXVtIG51bWJlciBvZiBwYWxldHRlIGVudHJpZXMsIGluY2x1ZGluZyB0cmFuc3BhcmVuY3ksIGJldHdlZW4gMiBhbmQgMjU2XG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuY29sb3JzPTI1Nl0gLSBhbHRlcm5hdGl2ZSBzcGVsbGluZyBvZiBgb3B0aW9ucy5jb2xvdXJzYFxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmVmZm9ydD03XSAtIENQVSBlZmZvcnQsIGJldHdlZW4gMSAoZmFzdGVzdCkgYW5kIDEwIChzbG93ZXN0KVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmRpdGhlcj0xLjBdIC0gbGV2ZWwgb2YgRmxveWQtU3RlaW5iZXJnIGVycm9yIGRpZmZ1c2lvbiwgYmV0d2VlbiAwIChsZWFzdCkgYW5kIDEgKG1vc3QpXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuaW50ZXJGcmFtZU1heEVycm9yPTBdIC0gbWF4aW11bSBpbnRlci1mcmFtZSBlcnJvciBmb3IgdHJhbnNwYXJlbmN5LCBiZXR3ZWVuIDAgKGxvc3NsZXNzKSBhbmQgMzJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5pbnRlclBhbGV0dGVNYXhFcnJvcj0zXSAtIG1heGltdW0gaW50ZXItcGFsZXR0ZSBlcnJvciBmb3IgcGFsZXR0ZSByZXVzZSwgYmV0d2VlbiAwIGFuZCAyNTZcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5sb29wPTBdIC0gbnVtYmVyIG9mIGFuaW1hdGlvbiBpdGVyYXRpb25zLCB1c2UgMCBmb3IgaW5maW5pdGUgYW5pbWF0aW9uXG4gKiBAcGFyYW0ge251bWJlcnxudW1iZXJbXX0gW29wdGlvbnMuZGVsYXldIC0gZGVsYXkocykgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzIChpbiBtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmZvcmNlPXRydWVdIC0gZm9yY2UgR0lGIG91dHB1dCwgb3RoZXJ3aXNlIGF0dGVtcHQgdG8gdXNlIGlucHV0IGZvcm1hdFxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBnaWYgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucmV1c2UpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCdnaWZSZXVzZScsIG9wdGlvbnMucmV1c2UpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnByb2dyZXNzaXZlKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbignZ2lmUHJvZ3Jlc3NpdmUnLCBvcHRpb25zLnByb2dyZXNzaXZlKTtcbiAgICB9XG4gICAgY29uc3QgY29sb3VycyA9IG9wdGlvbnMuY29sb3VycyB8fCBvcHRpb25zLmNvbG9ycztcbiAgICBpZiAoaXMuZGVmaW5lZChjb2xvdXJzKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIoY29sb3VycykgJiYgaXMuaW5SYW5nZShjb2xvdXJzLCAyLCAyNTYpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5naWZCaXRkZXB0aCA9IGJpdGRlcHRoRnJvbUNvbG91ckNvdW50KGNvbG91cnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdjb2xvdXJzJywgJ2ludGVnZXIgYmV0d2VlbiAyIGFuZCAyNTYnLCBjb2xvdXJzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5lZmZvcnQpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMuZWZmb3J0KSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuZWZmb3J0LCAxLCAxMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmdpZkVmZm9ydCA9IG9wdGlvbnMuZWZmb3J0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdlZmZvcnQnLCAnaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwJywgb3B0aW9ucy5lZmZvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmRpdGhlcikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5kaXRoZXIpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5kaXRoZXIsIDAsIDEpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5naWZEaXRoZXIgPSBvcHRpb25zLmRpdGhlcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZGl0aGVyJywgJ251bWJlciBiZXR3ZWVuIDAuMCBhbmQgMS4wJywgb3B0aW9ucy5kaXRoZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmludGVyRnJhbWVNYXhFcnJvcikpIHtcbiAgICAgIGlmIChpcy5udW1iZXIob3B0aW9ucy5pbnRlckZyYW1lTWF4RXJyb3IpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5pbnRlckZyYW1lTWF4RXJyb3IsIDAsIDMyKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ2lmSW50ZXJGcmFtZU1heEVycm9yID0gb3B0aW9ucy5pbnRlckZyYW1lTWF4RXJyb3I7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2ludGVyRnJhbWVNYXhFcnJvcicsICdudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDMyLjAnLCBvcHRpb25zLmludGVyRnJhbWVNYXhFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuaW50ZXJQYWxldHRlTWF4RXJyb3IpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMuaW50ZXJQYWxldHRlTWF4RXJyb3IpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5pbnRlclBhbGV0dGVNYXhFcnJvciwgMCwgMjU2KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuZ2lmSW50ZXJQYWxldHRlTWF4RXJyb3IgPSBvcHRpb25zLmludGVyUGFsZXR0ZU1heEVycm9yO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdpbnRlclBhbGV0dGVNYXhFcnJvcicsICdudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDI1Ni4wJywgb3B0aW9ucy5pbnRlclBhbGV0dGVNYXhFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHRyeVNldEFuaW1hdGlvbk9wdGlvbnMob3B0aW9ucywgdGhpcy5vcHRpb25zKTtcbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgnZ2lmJywgb3B0aW9ucyk7XG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKipcbiAqIFVzZSB0aGVzZSBKUDIgb3B0aW9ucyBmb3Igb3V0cHV0IGltYWdlLlxuICpcbiAqIFJlcXVpcmVzIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBPcGVuSlBFRy5cbiAqIFRoZSBwcmVidWlsdCBiaW5hcmllcyBkbyBub3QgaW5jbHVkZSB0aGlzIC0gc2VlXG4gKiB7QGxpbmsgaHR0cHM6Ly9zaGFycC5waXhlbHBsdW1iaW5nLmNvbS9pbnN0YWxsI2N1c3RvbS1saWJ2aXBzIGluc3RhbGxpbmcgYSBjdXN0b20gbGlidmlwc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbnZlcnQgYW55IGlucHV0IHRvIGxvc3NsZXNzIEpQMiBvdXRwdXRcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmpwMih7IGxvc3NsZXNzOiB0cnVlIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb252ZXJ0IGFueSBpbnB1dCB0byB2ZXJ5IGhpZ2ggcXVhbGl0eSBKUDIgb3V0cHV0XG4gKiBjb25zdCBkYXRhID0gYXdhaXQgc2hhcnAoaW5wdXQpXG4gKiAgIC5qcDIoe1xuICogICAgIHF1YWxpdHk6IDEwMCxcbiAqICAgICBjaHJvbWFTdWJzYW1wbGluZzogJzQ6NDo0J1xuICogICB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAc2luY2UgMC4yOS4xXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIG91dHB1dCBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucXVhbGl0eT04MF0gLSBxdWFsaXR5LCBpbnRlZ2VyIDEtMTAwXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxvc3NsZXNzPWZhbHNlXSAtIHVzZSBsb3NzbGVzcyBjb21wcmVzc2lvbiBtb2RlXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMudGlsZVdpZHRoPTUxMl0gLSBob3Jpem9udGFsIHRpbGUgc2l6ZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpbGVIZWlnaHQ9NTEyXSAtIHZlcnRpY2FsIHRpbGUgc2l6ZVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nPSc0OjQ6NCddIC0gc2V0IHRvICc0OjI6MCcgdG8gdXNlIGNocm9tYSBzdWJzYW1wbGluZ1xuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgb3B0aW9uc1xuICovXG5mdW5jdGlvbiBqcDIgKG9wdGlvbnMpIHtcbiAgaWYgKCF0aGlzLmNvbnN0cnVjdG9yLmZvcm1hdC5qcDJrLm91dHB1dC5idWZmZXIpIHtcbiAgICB0aHJvdyBlcnJKcDJTYXZlKCk7XG4gIH1cbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucXVhbGl0eSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMucXVhbGl0eSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnF1YWxpdHksIDEsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwMlF1YWxpdHkgPSBvcHRpb25zLnF1YWxpdHk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3F1YWxpdHknLCAnaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCcsIG9wdGlvbnMucXVhbGl0eSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubG9zc2xlc3MpKSB7XG4gICAgICBpZiAoaXMuYm9vbChvcHRpb25zLmxvc3NsZXNzKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanAyTG9zc2xlc3MgPSBvcHRpb25zLmxvc3NsZXNzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdsb3NzbGVzcycsICdib29sZWFuJywgb3B0aW9ucy5sb3NzbGVzcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMudGlsZVdpZHRoKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy50aWxlV2lkdGgpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy50aWxlV2lkdGgsIDEsIDMyNzY4KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanAyVGlsZVdpZHRoID0gb3B0aW9ucy50aWxlV2lkdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3RpbGVXaWR0aCcsICdpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzI3NjgnLCBvcHRpb25zLnRpbGVXaWR0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMudGlsZUhlaWdodCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMudGlsZUhlaWdodCkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnRpbGVIZWlnaHQsIDEsIDMyNzY4KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanAyVGlsZUhlaWdodCA9IG9wdGlvbnMudGlsZUhlaWdodDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGlsZUhlaWdodCcsICdpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMzI3NjgnLCBvcHRpb25zLnRpbGVIZWlnaHQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmcsIFsnNDoyOjAnLCAnNDo0OjQnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmpwMkNocm9tYVN1YnNhbXBsaW5nID0gb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignY2hyb21hU3Vic2FtcGxpbmcnLCAnb25lIG9mOiA0OjI6MCwgNDo0OjQnLCBvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgnanAyJywgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogU2V0IGFuaW1hdGlvbiBvcHRpb25zIGlmIGF2YWlsYWJsZS5cbiAqIEBwcml2YXRlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtzb3VyY2VdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc291cmNlLmxvb3A9MF0gLSBudW1iZXIgb2YgYW5pbWF0aW9uIGl0ZXJhdGlvbnMsIHVzZSAwIGZvciBpbmZpbml0ZSBhbmltYXRpb25cbiAqIEBwYXJhbSB7bnVtYmVyW119IFtzb3VyY2UuZGVsYXldIC0gbGlzdCBvZiBkZWxheXMgYmV0d2VlbiBhbmltYXRpb24gZnJhbWVzIChpbiBtaWxsaXNlY29uZHMpXG4gKiBAcGFyYW0ge09iamVjdH0gW3RhcmdldF0gLSB0YXJnZXQgb2JqZWN0IGZvciB2YWxpZCBvcHRpb25zXG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHRyeVNldEFuaW1hdGlvbk9wdGlvbnMgKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIGlmIChpcy5vYmplY3Qoc291cmNlKSAmJiBpcy5kZWZpbmVkKHNvdXJjZS5sb29wKSkge1xuICAgIGlmIChpcy5pbnRlZ2VyKHNvdXJjZS5sb29wKSAmJiBpcy5pblJhbmdlKHNvdXJjZS5sb29wLCAwLCA2NTUzNSkpIHtcbiAgICAgIHRhcmdldC5sb29wID0gc291cmNlLmxvb3A7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignbG9vcCcsICdpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNjU1MzUnLCBzb3VyY2UubG9vcCk7XG4gICAgfVxuICB9XG4gIGlmIChpcy5vYmplY3Qoc291cmNlKSAmJiBpcy5kZWZpbmVkKHNvdXJjZS5kZWxheSkpIHtcbiAgICAvLyBXZSBhbGxvdyBzaW5ndWxhciB2YWx1ZXMgYXMgd2VsbFxuICAgIGlmIChpcy5pbnRlZ2VyKHNvdXJjZS5kZWxheSkgJiYgaXMuaW5SYW5nZShzb3VyY2UuZGVsYXksIDAsIDY1NTM1KSkge1xuICAgICAgdGFyZ2V0LmRlbGF5ID0gW3NvdXJjZS5kZWxheV07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIEFycmF5LmlzQXJyYXkoc291cmNlLmRlbGF5KSAmJlxuICAgICAgc291cmNlLmRlbGF5LmV2ZXJ5KGlzLmludGVnZXIpICYmXG4gICAgICBzb3VyY2UuZGVsYXkuZXZlcnkodiA9PiBpcy5pblJhbmdlKHYsIDAsIDY1NTM1KSkpIHtcbiAgICAgIHRhcmdldC5kZWxheSA9IHNvdXJjZS5kZWxheTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdkZWxheScsICdpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIGludGVnZXJzIGJldHdlZW4gMCBhbmQgNjU1MzUnLCBzb3VyY2UuZGVsYXkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFVzZSB0aGVzZSBUSUZGIG9wdGlvbnMgZm9yIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBUaGUgYGRlbnNpdHlgIGNhbiBiZSBzZXQgaW4gcGl4ZWxzL2luY2ggdmlhIHtAbGluayAjd2l0aG1ldGFkYXRhfHdpdGhNZXRhZGF0YX1cbiAqIGluc3RlYWQgb2YgcHJvdmlkaW5nIGB4cmVzYCBhbmQgYHlyZXNgIGluIHBpeGVscy9tbS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29udmVydCBTVkcgaW5wdXQgdG8gTFpXLWNvbXByZXNzZWQsIDEgYml0IHBlciBwaXhlbCBUSUZGIG91dHB1dFxuICogc2hhcnAoJ2lucHV0LnN2ZycpXG4gKiAgIC50aWZmKHtcbiAqICAgICBjb21wcmVzc2lvbjogJ2x6dycsXG4gKiAgICAgYml0ZGVwdGg6IDFcbiAqICAgfSlcbiAqICAgLnRvRmlsZSgnMS1icHAtb3V0cHV0LnRpZmYnKVxuICogICAudGhlbihpbmZvID0+IHsgLi4uIH0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBvdXRwdXQgb3B0aW9uc1xuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnF1YWxpdHk9ODBdIC0gcXVhbGl0eSwgaW50ZWdlciAxLTEwMFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JjZT10cnVlXSAtIGZvcmNlIFRJRkYgb3V0cHV0LCBvdGhlcndpc2UgYXR0ZW1wdCB0byB1c2UgaW5wdXQgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29tcHJlc3Npb249J2pwZWcnXSAtIGNvbXByZXNzaW9uIG9wdGlvbnM6IG5vbmUsIGpwZWcsIGRlZmxhdGUsIHBhY2tiaXRzLCBjY2l0dGZheDQsIGx6dywgd2VicCwgenN0ZCwganAya1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnByZWRpY3Rvcj0naG9yaXpvbnRhbCddIC0gY29tcHJlc3Npb24gcHJlZGljdG9yIG9wdGlvbnM6IG5vbmUsIGhvcml6b250YWwsIGZsb2F0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnB5cmFtaWQ9ZmFsc2VdIC0gd3JpdGUgYW4gaW1hZ2UgcHlyYW1pZFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50aWxlPWZhbHNlXSAtIHdyaXRlIGEgdGlsZWQgdGlmZlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLnRpbGVXaWR0aD0yNTZdIC0gaG9yaXpvbnRhbCB0aWxlIHNpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy50aWxlSGVpZ2h0PTI1Nl0gLSB2ZXJ0aWNhbCB0aWxlIHNpemVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy54cmVzPTEuMF0gLSBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gcGl4ZWxzL21tXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMueXJlcz0xLjBdIC0gdmVydGljYWwgcmVzb2x1dGlvbiBpbiBwaXhlbHMvbW1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5yZXNvbHV0aW9uVW5pdD0naW5jaCddIC0gcmVzb2x1dGlvbiB1bml0IG9wdGlvbnM6IGluY2gsIGNtXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYml0ZGVwdGg9OF0gLSByZWR1Y2UgYml0ZGVwdGggdG8gMSwgMiBvciA0IGJpdFxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5taW5pc3doaXRlPWZhbHNlXSAtIHdyaXRlIDEtYml0IGltYWdlcyBhcyBtaW5pc3doaXRlXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIHRpZmYgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucXVhbGl0eSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMucXVhbGl0eSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnF1YWxpdHksIDEsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZRdWFsaXR5ID0gb3B0aW9ucy5xdWFsaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmJpdGRlcHRoKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5iaXRkZXB0aCkgJiYgaXMuaW5BcnJheShvcHRpb25zLmJpdGRlcHRoLCBbMSwgMiwgNCwgOF0pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50aWZmQml0ZGVwdGggPSBvcHRpb25zLmJpdGRlcHRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdiaXRkZXB0aCcsICcxLCAyLCA0IG9yIDgnLCBvcHRpb25zLmJpdGRlcHRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGlsaW5nXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy50aWxlKSkge1xuICAgICAgdGhpcy5fc2V0Qm9vbGVhbk9wdGlvbigndGlmZlRpbGUnLCBvcHRpb25zLnRpbGUpO1xuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnRpbGVXaWR0aCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMudGlsZVdpZHRoKSAmJiBvcHRpb25zLnRpbGVXaWR0aCA+IDApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZUaWxlV2lkdGggPSBvcHRpb25zLnRpbGVXaWR0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigndGlsZVdpZHRoJywgJ2ludGVnZXIgZ3JlYXRlciB0aGFuIHplcm8nLCBvcHRpb25zLnRpbGVXaWR0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMudGlsZUhlaWdodCkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMudGlsZUhlaWdodCkgJiYgb3B0aW9ucy50aWxlSGVpZ2h0ID4gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlmZlRpbGVIZWlnaHQgPSBvcHRpb25zLnRpbGVIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3RpbGVIZWlnaHQnLCAnaW50ZWdlciBncmVhdGVyIHRoYW4gemVybycsIG9wdGlvbnMudGlsZUhlaWdodCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG1pbmlzd2hpdGVcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLm1pbmlzd2hpdGUpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd0aWZmTWluaXN3aGl0ZScsIG9wdGlvbnMubWluaXN3aGl0ZSk7XG4gICAgfVxuICAgIC8vIHB5cmFtaWRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnB5cmFtaWQpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd0aWZmUHlyYW1pZCcsIG9wdGlvbnMucHlyYW1pZCk7XG4gICAgfVxuICAgIC8vIHJlc29sdXRpb25cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLnhyZXMpKSB7XG4gICAgICBpZiAoaXMubnVtYmVyKG9wdGlvbnMueHJlcykgJiYgb3B0aW9ucy54cmVzID4gMCkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlmZlhyZXMgPSBvcHRpb25zLnhyZXM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3hyZXMnLCAnbnVtYmVyIGdyZWF0ZXIgdGhhbiB6ZXJvJywgb3B0aW9ucy54cmVzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy55cmVzKSkge1xuICAgICAgaWYgKGlzLm51bWJlcihvcHRpb25zLnlyZXMpICYmIG9wdGlvbnMueXJlcyA+IDApIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZZcmVzID0gb3B0aW9ucy55cmVzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCd5cmVzJywgJ251bWJlciBncmVhdGVyIHRoYW4gemVybycsIG9wdGlvbnMueXJlcyk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGNvbXByZXNzaW9uXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5jb21wcmVzc2lvbikpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcob3B0aW9ucy5jb21wcmVzc2lvbikgJiYgaXMuaW5BcnJheShvcHRpb25zLmNvbXByZXNzaW9uLCBbJ25vbmUnLCAnanBlZycsICdkZWZsYXRlJywgJ3BhY2tiaXRzJywgJ2NjaXR0ZmF4NCcsICdsencnLCAnd2VicCcsICd6c3RkJywgJ2pwMmsnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZDb21wcmVzc2lvbiA9IG9wdGlvbnMuY29tcHJlc3Npb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbXByZXNzaW9uJywgJ29uZSBvZjogbm9uZSwganBlZywgZGVmbGF0ZSwgcGFja2JpdHMsIGNjaXR0ZmF4NCwgbHp3LCB3ZWJwLCB6c3RkLCBqcDJrJywgb3B0aW9ucy5jb21wcmVzc2lvbik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHByZWRpY3RvclxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucHJlZGljdG9yKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLnByZWRpY3RvcikgJiYgaXMuaW5BcnJheShvcHRpb25zLnByZWRpY3RvciwgWydub25lJywgJ2hvcml6b250YWwnLCAnZmxvYXQnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZQcmVkaWN0b3IgPSBvcHRpb25zLnByZWRpY3RvcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcigncHJlZGljdG9yJywgJ29uZSBvZjogbm9uZSwgaG9yaXpvbnRhbCwgZmxvYXQnLCBvcHRpb25zLnByZWRpY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIHJlc29sdXRpb25Vbml0XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5yZXNvbHV0aW9uVW5pdCkpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcob3B0aW9ucy5yZXNvbHV0aW9uVW5pdCkgJiYgaXMuaW5BcnJheShvcHRpb25zLnJlc29sdXRpb25Vbml0LCBbJ2luY2gnLCAnY20nXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpZmZSZXNvbHV0aW9uVW5pdCA9IG9wdGlvbnMucmVzb2x1dGlvblVuaXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3Jlc29sdXRpb25Vbml0JywgJ29uZSBvZjogaW5jaCwgY20nLCBvcHRpb25zLnJlc29sdXRpb25Vbml0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgndGlmZicsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFVzZSB0aGVzZSBBVklGIG9wdGlvbnMgZm9yIG91dHB1dCBpbWFnZS5cbiAqXG4gKiBBVklGIGltYWdlIHNlcXVlbmNlcyBhcmUgbm90IHN1cHBvcnRlZC5cbiAqIFByZWJ1aWx0IGJpbmFyaWVzIHN1cHBvcnQgYSBiaXRkZXB0aCBvZiA4IG9ubHkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmF2aWYoeyBlZmZvcnQ6IDIgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLmF2aWYoeyBsb3NzbGVzczogdHJ1ZSB9KVxuICogICAudG9CdWZmZXIoKTtcbiAqXG4gKiBAc2luY2UgMC4yNy4wXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIG91dHB1dCBvcHRpb25zXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucXVhbGl0eT01MF0gLSBxdWFsaXR5LCBpbnRlZ2VyIDEtMTAwXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxvc3NsZXNzPWZhbHNlXSAtIHVzZSBsb3NzbGVzcyBjb21wcmVzc2lvblxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmVmZm9ydD00XSAtIENQVSBlZmZvcnQsIGJldHdlZW4gMCAoZmFzdGVzdCkgYW5kIDkgKHNsb3dlc3QpXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmc9JzQ6NDo0J10gLSBzZXQgdG8gJzQ6MjowJyB0byB1c2UgY2hyb21hIHN1YnNhbXBsaW5nXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuYml0ZGVwdGg9OF0gLSBzZXQgYml0ZGVwdGggdG8gOCwgMTAgb3IgMTIgYml0XG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGF2aWYgKG9wdGlvbnMpIHtcbiAgcmV0dXJuIHRoaXMuaGVpZih7IC4uLm9wdGlvbnMsIGNvbXByZXNzaW9uOiAnYXYxJyB9KTtcbn1cblxuLyoqXG4gKiBVc2UgdGhlc2UgSEVJRiBvcHRpb25zIGZvciBvdXRwdXQgaW1hZ2UuXG4gKlxuICogU3VwcG9ydCBmb3IgcGF0ZW50LWVuY3VtYmVyZWQgSEVJQyBpbWFnZXMgdXNpbmcgYGhldmNgIGNvbXByZXNzaW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYVxuICogZ2xvYmFsbHktaW5zdGFsbGVkIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBsaWJoZWlmLCBsaWJkZTI2NSBhbmQgeDI2NS5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAuaGVpZih7IGNvbXByZXNzaW9uOiAnaGV2YycgfSlcbiAqICAgLnRvQnVmZmVyKCk7XG4gKlxuICogQHNpbmNlIDAuMjMuMFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmNvbXByZXNzaW9uIC0gY29tcHJlc3Npb24gZm9ybWF0OiBhdjEsIGhldmNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5xdWFsaXR5PTUwXSAtIHF1YWxpdHksIGludGVnZXIgMS0xMDBcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubG9zc2xlc3M9ZmFsc2VdIC0gdXNlIGxvc3NsZXNzIGNvbXByZXNzaW9uXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuZWZmb3J0PTRdIC0gQ1BVIGVmZm9ydCwgYmV0d2VlbiAwIChmYXN0ZXN0KSBhbmQgOSAoc2xvd2VzdClcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZz0nNDo0OjQnXSAtIHNldCB0byAnNDoyOjAnIHRvIHVzZSBjaHJvbWEgc3Vic2FtcGxpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5iaXRkZXB0aD04XSAtIHNldCBiaXRkZXB0aCB0byA4LCAxMCBvciAxMiBiaXRcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gaGVpZiAob3B0aW9ucykge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmNvbXByZXNzaW9uKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuY29tcHJlc3Npb24sIFsnYXYxJywgJ2hldmMnXSkpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5oZWlmQ29tcHJlc3Npb24gPSBvcHRpb25zLmNvbXByZXNzaW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbXByZXNzaW9uJywgJ29uZSBvZjogYXYxLCBoZXZjJywgb3B0aW9ucy5jb21wcmVzc2lvbik7XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMucXVhbGl0eSkpIHtcbiAgICAgIGlmIChpcy5pbnRlZ2VyKG9wdGlvbnMucXVhbGl0eSkgJiYgaXMuaW5SYW5nZShvcHRpb25zLnF1YWxpdHksIDEsIDEwMCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWZRdWFsaXR5ID0gb3B0aW9ucy5xdWFsaXR5O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmxvc3NsZXNzKSkge1xuICAgICAgaWYgKGlzLmJvb2wob3B0aW9ucy5sb3NzbGVzcykpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWZMb3NzbGVzcyA9IG9wdGlvbnMubG9zc2xlc3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2xvc3NsZXNzJywgJ2Jvb2xlYW4nLCBvcHRpb25zLmxvc3NsZXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5lZmZvcnQpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLmVmZm9ydCkgJiYgaXMuaW5SYW5nZShvcHRpb25zLmVmZm9ydCwgMCwgOSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWZFZmZvcnQgPSBvcHRpb25zLmVmZm9ydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZWZmb3J0JywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCA5Jywgb3B0aW9ucy5lZmZvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmNocm9tYVN1YnNhbXBsaW5nKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmcsIFsnNDoyOjAnLCAnNDo0OjQnXSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmhlaWZDaHJvbWFTdWJzYW1wbGluZyA9IG9wdGlvbnMuY2hyb21hU3Vic2FtcGxpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2Nocm9tYVN1YnNhbXBsaW5nJywgJ29uZSBvZjogNDoyOjAsIDQ6NDo0Jywgb3B0aW9ucy5jaHJvbWFTdWJzYW1wbGluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuYml0ZGVwdGgpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLmJpdGRlcHRoKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuYml0ZGVwdGgsIFs4LCAxMCwgMTJdKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5iaXRkZXB0aCAhPT0gOCAmJiB0aGlzLmNvbnN0cnVjdG9yLnZlcnNpb25zLmhlaWYpIHtcbiAgICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2JpdGRlcHRoIHdoZW4gdXNpbmcgcHJlYnVpbHQgYmluYXJpZXMnLCA4LCBvcHRpb25zLmJpdGRlcHRoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVpZkJpdGRlcHRoID0gb3B0aW9ucy5iaXRkZXB0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignYml0ZGVwdGgnLCAnOCwgMTAgb3IgMTInLCBvcHRpb25zLmJpdGRlcHRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdvcHRpb25zJywgJ09iamVjdCcsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiB0aGlzLl91cGRhdGVGb3JtYXRPdXQoJ2hlaWYnLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBVc2UgdGhlc2UgSlBFRy1YTCAoSlhMKSBvcHRpb25zIGZvciBvdXRwdXQgaW1hZ2UuXG4gKlxuICogVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbCwgcGxlYXNlIGRvIG5vdCB1c2UgaW4gcHJvZHVjdGlvbiBzeXN0ZW1zLlxuICpcbiAqIFJlcXVpcmVzIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBsaWJqeGwuXG4gKiBUaGUgcHJlYnVpbHQgYmluYXJpZXMgZG8gbm90IGluY2x1ZGUgdGhpcyAtIHNlZVxuICoge0BsaW5rIGh0dHBzOi8vc2hhcnAucGl4ZWxwbHVtYmluZy5jb20vaW5zdGFsbCNjdXN0b20tbGlidmlwcyBpbnN0YWxsaW5nIGEgY3VzdG9tIGxpYnZpcHN9LlxuICpcbiAqIEltYWdlIG1ldGFkYXRhIChFWElGLCBYTVApIGlzIHVuc3VwcG9ydGVkLlxuICpcbiAqIEBzaW5jZSAwLjMxLjNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gb3V0cHV0IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5kaXN0YW5jZT0xLjBdIC0gbWF4aW11bSBlbmNvZGluZyBlcnJvciwgYmV0d2VlbiAwIChoaWdoZXN0IHF1YWxpdHkpIGFuZCAxNSAobG93ZXN0IHF1YWxpdHkpXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMucXVhbGl0eV0gLSBjYWxjdWxhdGUgYGRpc3RhbmNlYCBiYXNlZCBvbiBKUEVHLWxpa2UgcXVhbGl0eSwgYmV0d2VlbiAxIGFuZCAxMDAsIG92ZXJyaWRlcyBkaXN0YW5jZSBpZiBzcGVjaWZpZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5kZWNvZGluZ1RpZXI9MF0gLSB0YXJnZXQgZGVjb2RlIHNwZWVkIHRpZXIsIGJldHdlZW4gMCAoaGlnaGVzdCBxdWFsaXR5KSBhbmQgNCAobG93ZXN0IHF1YWxpdHkpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxvc3NsZXNzPWZhbHNlXSAtIHVzZSBsb3NzbGVzcyBjb21wcmVzc2lvblxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmVmZm9ydD03XSAtIENQVSBlZmZvcnQsIGJldHdlZW4gMyAoZmFzdGVzdCkgYW5kIDkgKHNsb3dlc3QpXG4gKiBAcmV0dXJucyB7U2hhcnB9XG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIGp4bCAob3B0aW9ucykge1xuICBpZiAoaXMub2JqZWN0KG9wdGlvbnMpKSB7XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5xdWFsaXR5KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5xdWFsaXR5KSAmJiBpcy5pblJhbmdlKG9wdGlvbnMucXVhbGl0eSwgMSwgMTAwKSkge1xuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbGlianhsL2xpYmp4bC9ibG9iLzBhZWVhN2YxODBiYWZkNjg5M2MxZGI4MDcyZGNiNjdkMmFhNWIwM2QvdG9vbHMvY2p4bF9tYWluLmNjI0w2NDAtTDY0NFxuICAgICAgICB0aGlzLm9wdGlvbnMuanhsRGlzdGFuY2UgPSBvcHRpb25zLnF1YWxpdHkgPj0gMzBcbiAgICAgICAgICA/IDAuMSArICgxMDAgLSBvcHRpb25zLnF1YWxpdHkpICogMC4wOVxuICAgICAgICAgIDogNTMgLyAzMDAwICogb3B0aW9ucy5xdWFsaXR5ICogb3B0aW9ucy5xdWFsaXR5IC0gMjMgLyAyMCAqIG9wdGlvbnMucXVhbGl0eSArIDI1O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdxdWFsaXR5JywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLCBvcHRpb25zLnF1YWxpdHkpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmRpc3RhbmNlKSkge1xuICAgICAgaWYgKGlzLm51bWJlcihvcHRpb25zLmRpc3RhbmNlKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuZGlzdGFuY2UsIDAsIDE1KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanhsRGlzdGFuY2UgPSBvcHRpb25zLmRpc3RhbmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdkaXN0YW5jZScsICdudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDE1LjAnLCBvcHRpb25zLmRpc3RhbmNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5kZWNvZGluZ1RpZXIpKSB7XG4gICAgICBpZiAoaXMuaW50ZWdlcihvcHRpb25zLmRlY29kaW5nVGllcikgJiYgaXMuaW5SYW5nZShvcHRpb25zLmRlY29kaW5nVGllciwgMCwgNCkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLmp4bERlY29kaW5nVGllciA9IG9wdGlvbnMuZGVjb2RpbmdUaWVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdkZWNvZGluZ1RpZXInLCAnaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDQnLCBvcHRpb25zLmRlY29kaW5nVGllcik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubG9zc2xlc3MpKSB7XG4gICAgICBpZiAoaXMuYm9vbChvcHRpb25zLmxvc3NsZXNzKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMuanhsTG9zc2xlc3MgPSBvcHRpb25zLmxvc3NsZXNzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdsb3NzbGVzcycsICdib29sZWFuJywgb3B0aW9ucy5sb3NzbGVzcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZWZmb3J0KSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5lZmZvcnQpICYmIGlzLmluUmFuZ2Uob3B0aW9ucy5lZmZvcnQsIDMsIDkpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5qeGxFZmZvcnQgPSBvcHRpb25zLmVmZm9ydDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZWZmb3J0JywgJ2ludGVnZXIgYmV0d2VlbiAzIGFuZCA5Jywgb3B0aW9ucy5lZmZvcnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fdXBkYXRlRm9ybWF0T3V0KCdqeGwnLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBGb3JjZSBvdXRwdXQgdG8gYmUgcmF3LCB1bmNvbXByZXNzZWQgcGl4ZWwgZGF0YS5cbiAqIFBpeGVsIG9yZGVyaW5nIGlzIGxlZnQtdG8tcmlnaHQsIHRvcC10by1ib3R0b20sIHdpdGhvdXQgcGFkZGluZy5cbiAqIENoYW5uZWwgb3JkZXJpbmcgd2lsbCBiZSBSR0Igb3IgUkdCQSBmb3Igbm9uLWdyZXlzY2FsZSBjb2xvdXJzcGFjZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEV4dHJhY3QgcmF3LCB1bnNpZ25lZCA4LWJpdCBSR0IgcGl4ZWwgZGF0YSBmcm9tIEpQRUcgaW5wdXRcbiAqIGNvbnN0IHsgZGF0YSwgaW5mbyB9ID0gYXdhaXQgc2hhcnAoJ2lucHV0LmpwZycpXG4gKiAgIC5yYXcoKVxuICogICAudG9CdWZmZXIoeyByZXNvbHZlV2l0aE9iamVjdDogdHJ1ZSB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRXh0cmFjdCBhbHBoYSBjaGFubmVsIGFzIHJhdywgdW5zaWduZWQgMTYtYml0IHBpeGVsIGRhdGEgZnJvbSBQTkcgaW5wdXRcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCBzaGFycCgnaW5wdXQucG5nJylcbiAqICAgLmVuc3VyZUFscGhhKClcbiAqICAgLmV4dHJhY3RDaGFubmVsKDMpXG4gKiAgIC50b0NvbG91cnNwYWNlKCdiLXcnKVxuICogICAucmF3KHsgZGVwdGg6ICd1c2hvcnQnIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBvdXRwdXQgb3B0aW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRlcHRoPSd1Y2hhciddIC0gYml0IGRlcHRoLCBvbmUgb2Y6IGNoYXIsIHVjaGFyIChkZWZhdWx0KSwgc2hvcnQsIHVzaG9ydCwgaW50LCB1aW50LCBmbG9hdCwgY29tcGxleCwgZG91YmxlLCBkcGNvbXBsZXhcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqIEB0aHJvd3Mge0Vycm9yfSBJbnZhbGlkIG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gcmF3IChvcHRpb25zKSB7XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmRlcHRoKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmRlcHRoKSAmJiBpcy5pbkFycmF5KG9wdGlvbnMuZGVwdGgsXG4gICAgICAgIFsnY2hhcicsICd1Y2hhcicsICdzaG9ydCcsICd1c2hvcnQnLCAnaW50JywgJ3VpbnQnLCAnZmxvYXQnLCAnY29tcGxleCcsICdkb3VibGUnLCAnZHBjb21wbGV4J11cbiAgICAgICkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnJhd0RlcHRoID0gb3B0aW9ucy5kZXB0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZGVwdGgnLCAnb25lIG9mOiBjaGFyLCB1Y2hhciwgc2hvcnQsIHVzaG9ydCwgaW50LCB1aW50LCBmbG9hdCwgY29tcGxleCwgZG91YmxlLCBkcGNvbXBsZXgnLCBvcHRpb25zLmRlcHRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX3VwZGF0ZUZvcm1hdE91dCgncmF3Jyk7XG59XG5cbi8qKlxuICogVXNlIHRpbGUtYmFzZWQgZGVlcCB6b29tIChpbWFnZSBweXJhbWlkKSBvdXRwdXQuXG4gKlxuICogU2V0IHRoZSBmb3JtYXQgYW5kIG9wdGlvbnMgZm9yIHRpbGUgaW1hZ2VzIHZpYSB0aGUgYHRvRm9ybWF0YCwgYGpwZWdgLCBgcG5nYCBvciBgd2VicGAgZnVuY3Rpb25zLlxuICogVXNlIGEgYC56aXBgIG9yIGAuc3ppYCBmaWxlIGV4dGVuc2lvbiB3aXRoIGB0b0ZpbGVgIHRvIHdyaXRlIHRvIGEgY29tcHJlc3NlZCBhcmNoaXZlIGZpbGUgZm9ybWF0LlxuICpcbiAqIFRoZSBjb250YWluZXIgd2lsbCBiZSBzZXQgdG8gYHppcGAgd2hlbiB0aGUgb3V0cHV0IGlzIGEgQnVmZmVyIG9yIFN0cmVhbSwgb3RoZXJ3aXNlIGl0IHdpbGwgZGVmYXVsdCB0byBgZnNgLlxuICpcbiAqIFJlcXVpcmVzIGxpYnZpcHMgY29tcGlsZWQgd2l0aCBzdXBwb3J0IGZvciBsaWJnc2YuXG4gKiBUaGUgcHJlYnVpbHQgYmluYXJpZXMgZG8gbm90IGluY2x1ZGUgdGhpcyAtIHNlZVxuICoge0BsaW5rIGh0dHBzOi8vc2hhcnAucGl4ZWxwbHVtYmluZy5jb20vaW5zdGFsbCNjdXN0b20tbGlidmlwcyBpbnN0YWxsaW5nIGEgY3VzdG9tIGxpYnZpcHN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiAgc2hhcnAoJ2lucHV0LnRpZmYnKVxuICogICAucG5nKClcbiAqICAgLnRpbGUoe1xuICogICAgIHNpemU6IDUxMlxuICogICB9KVxuICogICAudG9GaWxlKCdvdXRwdXQuZHonLCBmdW5jdGlvbihlcnIsIGluZm8pIHtcbiAqICAgICAvLyBvdXRwdXQuZHppIGlzIHRoZSBEZWVwIFpvb20gWE1MIGRlZmluaXRpb25cbiAqICAgICAvLyBvdXRwdXRfZmlsZXMgY29udGFpbnMgNTEyeDUxMiB0aWxlcyBncm91cGVkIGJ5IHpvb20gbGV2ZWxcbiAqICAgfSk7XG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHppcEZpbGVXaXRoVGlsZXMgPSBhd2FpdCBzaGFycChpbnB1dClcbiAqICAgLnRpbGUoeyBiYXNlbmFtZTogXCJ0aWxlc1wiIH0pXG4gKiAgIC50b0J1ZmZlcigpO1xuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBpaWlmaWZpZXIgPSBzaGFycCgpLnRpbGUoeyBsYXlvdXQ6IFwiaWlpZlwiIH0pO1xuICogcmVhZGFibGVTdHJlYW1cbiAqICAgLnBpcGUoaWlpZmlmaWVyKVxuICogICAucGlwZSh3cml0ZWFibGVTdHJlYW0pO1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5zaXplPTI1Nl0gdGlsZSBzaXplIGluIHBpeGVscywgYSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDgxOTIuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMub3ZlcmxhcD0wXSB0aWxlIG92ZXJsYXAgaW4gcGl4ZWxzLCBhIHZhbHVlIGJldHdlZW4gMCBhbmQgODE5Mi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5hbmdsZT0wXSB0aWxlIGFuZ2xlIG9mIHJvdGF0aW9uLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOTAuXG4gKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IFtvcHRpb25zLmJhY2tncm91bmQ9e3I6IDI1NSwgZzogMjU1LCBiOiAyNTUsIGFscGhhOiAxfV0gLSBiYWNrZ3JvdW5kIGNvbG91ciwgcGFyc2VkIGJ5IHRoZSBbY29sb3JdKGh0dHBzOi8vd3d3Lm5wbWpzLm9yZy9wYWNrYWdlL2NvbG9yKSBtb2R1bGUsIGRlZmF1bHRzIHRvIHdoaXRlIHdpdGhvdXQgdHJhbnNwYXJlbmN5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmRlcHRoXSBob3cgZGVlcCB0byBtYWtlIHRoZSBweXJhbWlkLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBvbmVwaXhlbGAsIGBvbmV0aWxlYCBvciBgb25lYCwgZGVmYXVsdCBiYXNlZCBvbiBsYXlvdXQuXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMuc2tpcEJsYW5rcz0tMV0gVGhyZXNob2xkIHRvIHNraXAgdGlsZSBnZW5lcmF0aW9uLiBSYW5nZSBpcyAwLTI1NSBmb3IgOC1iaXQgaW1hZ2VzLCAwLTY1NTM1IGZvciAxNi1iaXQgaW1hZ2VzLiBEZWZhdWx0IGlzIDUgZm9yIGBnb29nbGVgIGxheW91dCwgLTEgKG5vIHNraXApIG90aGVyd2lzZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb250YWluZXI9J2ZzJ10gdGlsZSBjb250YWluZXIsIHdpdGggdmFsdWUgYGZzYCAoZmlsZXN5c3RlbSkgb3IgYHppcGAgKGNvbXByZXNzZWQgZmlsZSkuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMubGF5b3V0PSdkeiddIGZpbGVzeXN0ZW0gbGF5b3V0LCBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBkemAsIGBpaWlmYCwgYGlpaWYzYCwgYHpvb21pZnlgIG9yIGBnb29nbGVgLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jZW50cmU9ZmFsc2VdIGNlbnRyZSBpbWFnZSBpbiB0aWxlLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jZW50ZXI9ZmFsc2VdIGFsdGVybmF0aXZlIHNwZWxsaW5nIG9mIGNlbnRyZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5pZD0naHR0cHM6Ly9leGFtcGxlLmNvbS9paWlmJ10gd2hlbiBgbGF5b3V0YCBpcyBgaWlpZmAvYGlpaWYzYCwgc2V0cyB0aGUgYEBpZGAvYGlkYCBhdHRyaWJ1dGUgb2YgYGluZm8uanNvbmBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5iYXNlbmFtZV0gdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHppcCBmaWxlIHdoZW4gY29udGFpbmVyIGlzIGB6aXBgLlxuICogQHJldHVybnMge1NoYXJwfVxuICogQHRocm93cyB7RXJyb3J9IEludmFsaWQgcGFyYW1ldGVyc1xuICovXG5mdW5jdGlvbiB0aWxlIChvcHRpb25zKSB7XG4gIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICAvLyBTaXplIG9mIHNxdWFyZSB0aWxlcywgaW4gcGl4ZWxzXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5zaXplKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5zaXplKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuc2l6ZSwgMSwgODE5MikpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpbGVTaXplID0gb3B0aW9ucy5zaXplO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdzaXplJywgJ2ludGVnZXIgYmV0d2VlbiAxIGFuZCA4MTkyJywgb3B0aW9ucy5zaXplKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gT3ZlcmxhcCBvZiB0aWxlcywgaW4gcGl4ZWxzXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5vdmVybGFwKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5vdmVybGFwKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMub3ZlcmxhcCwgMCwgODE5MikpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMub3ZlcmxhcCA+IHRoaXMub3B0aW9ucy50aWxlU2l6ZSkge1xuICAgICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3ZlcmxhcCcsIGA8PSBzaXplICgke3RoaXMub3B0aW9ucy50aWxlU2l6ZX0pYCwgb3B0aW9ucy5vdmVybGFwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wdGlvbnMudGlsZU92ZXJsYXAgPSBvcHRpb25zLm92ZXJsYXA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ292ZXJsYXAnLCAnaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDgxOTInLCBvcHRpb25zLm92ZXJsYXApO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDb250YWluZXJcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmNvbnRhaW5lcikpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcob3B0aW9ucy5jb250YWluZXIpICYmIGlzLmluQXJyYXkob3B0aW9ucy5jb250YWluZXIsIFsnZnMnLCAnemlwJ10pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50aWxlQ29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2NvbnRhaW5lcicsICdvbmUgb2Y6IGZzLCB6aXAnLCBvcHRpb25zLmNvbnRhaW5lcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIExheW91dFxuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMubGF5b3V0KSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmxheW91dCkgJiYgaXMuaW5BcnJheShvcHRpb25zLmxheW91dCwgWydkeicsICdnb29nbGUnLCAnaWlpZicsICdpaWlmMycsICd6b29taWZ5J10pKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50aWxlTGF5b3V0ID0gb3B0aW9ucy5sYXlvdXQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2xheW91dCcsICdvbmUgb2Y6IGR6LCBnb29nbGUsIGlpaWYsIGlpaWYzLCB6b29taWZ5Jywgb3B0aW9ucy5sYXlvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBBbmdsZSBvZiByb3RhdGlvbixcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmFuZ2xlKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5hbmdsZSkgJiYgIShvcHRpb25zLmFuZ2xlICUgOTApKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50aWxlQW5nbGUgPSBvcHRpb25zLmFuZ2xlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdhbmdsZScsICdwb3NpdGl2ZS9uZWdhdGl2ZSBtdWx0aXBsZSBvZiA5MCcsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCYWNrZ3JvdW5kIGNvbG91clxuICAgIHRoaXMuX3NldEJhY2tncm91bmRDb2xvdXJPcHRpb24oJ3RpbGVCYWNrZ3JvdW5kJywgb3B0aW9ucy5iYWNrZ3JvdW5kKTtcbiAgICAvLyBEZXB0aCBvZiB0aWxlc1xuICAgIGlmIChpcy5kZWZpbmVkKG9wdGlvbnMuZGVwdGgpKSB7XG4gICAgICBpZiAoaXMuc3RyaW5nKG9wdGlvbnMuZGVwdGgpICYmIGlzLmluQXJyYXkob3B0aW9ucy5kZXB0aCwgWydvbmVwaXhlbCcsICdvbmV0aWxlJywgJ29uZSddKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlsZURlcHRoID0gb3B0aW9ucy5kZXB0aDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignZGVwdGgnLCAnb25lIG9mOiBvbmVwaXhlbCwgb25ldGlsZSwgb25lJywgb3B0aW9ucy5kZXB0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIFRocmVzaG9sZCB0byBza2lwIGJsYW5rIHRpbGVzXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5za2lwQmxhbmtzKSkge1xuICAgICAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5za2lwQmxhbmtzKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuc2tpcEJsYW5rcywgLTEsIDY1NTM1KSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlsZVNraXBCbGFua3MgPSBvcHRpb25zLnNraXBCbGFua3M7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ3NraXBCbGFua3MnLCAnaW50ZWdlciBiZXR3ZWVuIC0xIGFuZCAyNTUvNjU1MzUnLCBvcHRpb25zLnNraXBCbGFua3MpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmxheW91dCkgJiYgb3B0aW9ucy5sYXlvdXQgPT09ICdnb29nbGUnKSB7XG4gICAgICB0aGlzLm9wdGlvbnMudGlsZVNraXBCbGFua3MgPSA1O1xuICAgIH1cbiAgICAvLyBDZW50ZXIgaW1hZ2UgaW4gdGlsZVxuICAgIGNvbnN0IGNlbnRyZSA9IGlzLmJvb2wob3B0aW9ucy5jZW50ZXIpID8gb3B0aW9ucy5jZW50ZXIgOiBvcHRpb25zLmNlbnRyZTtcbiAgICBpZiAoaXMuZGVmaW5lZChjZW50cmUpKSB7XG4gICAgICB0aGlzLl9zZXRCb29sZWFuT3B0aW9uKCd0aWxlQ2VudHJlJywgY2VudHJlKTtcbiAgICB9XG4gICAgLy8gQGlkIGF0dHJpYnV0ZSBmb3IgSUlJRiBsYXlvdXRcbiAgICBpZiAoaXMuZGVmaW5lZChvcHRpb25zLmlkKSkge1xuICAgICAgaWYgKGlzLnN0cmluZyhvcHRpb25zLmlkKSkge1xuICAgICAgICB0aGlzLm9wdGlvbnMudGlsZUlkID0gb3B0aW9ucy5pZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignaWQnLCAnc3RyaW5nJywgb3B0aW9ucy5pZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEJhc2VuYW1lIGZvciB6aXAgY29udGFpbmVyXG4gICAgaWYgKGlzLmRlZmluZWQob3B0aW9ucy5iYXNlbmFtZSkpIHtcbiAgICAgIGlmIChpcy5zdHJpbmcob3B0aW9ucy5iYXNlbmFtZSkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpbGVCYXNlbmFtZSA9IG9wdGlvbnMuYmFzZW5hbWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2Jhc2VuYW1lJywgJ3N0cmluZycsIG9wdGlvbnMuYmFzZW5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICAvLyBGb3JtYXRcbiAgaWYgKGlzLmluQXJyYXkodGhpcy5vcHRpb25zLmZvcm1hdE91dCwgWydqcGVnJywgJ3BuZycsICd3ZWJwJ10pKSB7XG4gICAgdGhpcy5vcHRpb25zLnRpbGVGb3JtYXQgPSB0aGlzLm9wdGlvbnMuZm9ybWF0T3V0O1xuICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5mb3JtYXRPdXQgIT09ICdpbnB1dCcpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ2Zvcm1hdCcsICdvbmUgb2Y6IGpwZWcsIHBuZywgd2VicCcsIHRoaXMub3B0aW9ucy5mb3JtYXRPdXQpO1xuICB9XG4gIHJldHVybiB0aGlzLl91cGRhdGVGb3JtYXRPdXQoJ2R6Jyk7XG59XG5cbi8qKlxuICogU2V0IGEgdGltZW91dCBmb3IgcHJvY2Vzc2luZywgaW4gc2Vjb25kcy5cbiAqIFVzZSBhIHZhbHVlIG9mIHplcm8gdG8gY29udGludWUgcHJvY2Vzc2luZyBpbmRlZmluaXRlbHksIHRoZSBkZWZhdWx0IGJlaGF2aW91ci5cbiAqXG4gKiBUaGUgY2xvY2sgc3RhcnRzIHdoZW4gbGlidmlwcyBvcGVucyBhbiBpbnB1dCBpbWFnZSBmb3IgcHJvY2Vzc2luZy5cbiAqIFRpbWUgc3BlbnQgd2FpdGluZyBmb3IgYSBsaWJ1diB0aHJlYWQgdG8gYmVjb21lIGF2YWlsYWJsZSBpcyBub3QgaW5jbHVkZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEVuc3VyZSBwcm9jZXNzaW5nIHRha2VzIG5vIGxvbmdlciB0aGFuIDMgc2Vjb25kc1xuICogdHJ5IHtcbiAqICAgY29uc3QgZGF0YSA9IGF3YWl0IHNoYXJwKGlucHV0KVxuICogICAgIC5ibHVyKDEwMDApXG4gKiAgICAgLnRpbWVvdXQoeyBzZWNvbmRzOiAzIH0pXG4gKiAgICAgLnRvQnVmZmVyKCk7XG4gKiB9IGNhdGNoIChlcnIpIHtcbiAqICAgaWYgKGVyci5tZXNzYWdlLmluY2x1ZGVzKCd0aW1lb3V0JykpIHsgLi4uIH1cbiAqIH1cbiAqXG4gKiBAc2luY2UgMC4yOS4yXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnNlY29uZHMgLSBOdW1iZXIgb2Ygc2Vjb25kcyBhZnRlciB3aGljaCBwcm9jZXNzaW5nIHdpbGwgYmUgc3RvcHBlZFxuICogQHJldHVybnMge1NoYXJwfVxuICovXG5mdW5jdGlvbiB0aW1lb3V0IChvcHRpb25zKSB7XG4gIGlmICghaXMucGxhaW5PYmplY3Qob3B0aW9ucykpIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMnLCAnb2JqZWN0Jywgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGlzLmludGVnZXIob3B0aW9ucy5zZWNvbmRzKSAmJiBpcy5pblJhbmdlKG9wdGlvbnMuc2Vjb25kcywgMCwgMzYwMCkpIHtcbiAgICB0aGlzLm9wdGlvbnMudGltZW91dFNlY29uZHMgPSBvcHRpb25zLnNlY29uZHM7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgaXMuaW52YWxpZFBhcmFtZXRlckVycm9yKCdzZWNvbmRzJywgJ2ludGVnZXIgYmV0d2VlbiAwIGFuZCAzNjAwJywgb3B0aW9ucy5zZWNvbmRzKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIG91dHB1dCBmb3JtYXQgdW5sZXNzIG9wdGlvbnMuZm9yY2UgaXMgZmFsc2UsXG4gKiBpbiB3aGljaCBjYXNlIHJldmVydCB0byBpbnB1dCBmb3JtYXQuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdE91dFxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5mb3JjZT10cnVlXSAtIGZvcmNlIG91dHB1dCBmb3JtYXQsIG90aGVyd2lzZSBhdHRlbXB0IHRvIHVzZSBpbnB1dCBmb3JtYXRcbiAqIEByZXR1cm5zIHtTaGFycH1cbiAqL1xuZnVuY3Rpb24gX3VwZGF0ZUZvcm1hdE91dCAoZm9ybWF0T3V0LCBvcHRpb25zKSB7XG4gIGlmICghKGlzLm9iamVjdChvcHRpb25zKSAmJiBvcHRpb25zLmZvcmNlID09PSBmYWxzZSkpIHtcbiAgICB0aGlzLm9wdGlvbnMuZm9ybWF0T3V0ID0gZm9ybWF0T3V0O1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBhIGJvb2xlYW4gYXR0cmlidXRlIG9mIHRoZSB0aGlzLm9wdGlvbnMgT2JqZWN0LlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsXG4gKiBAdGhyb3dzIHtFcnJvcn0gSW52YWxpZCBrZXlcbiAqL1xuZnVuY3Rpb24gX3NldEJvb2xlYW5PcHRpb24gKGtleSwgdmFsKSB7XG4gIGlmIChpcy5ib29sKHZhbCkpIHtcbiAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3Ioa2V5LCAnYm9vbGVhbicsIHZhbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsZWQgYnkgYSBXcml0ZWFibGVTdHJlYW0gdG8gbm90aWZ5IHVzIGl0IGlzIHJlYWR5IGZvciBkYXRhLlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gX3JlYWQgKCkge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoIXRoaXMub3B0aW9ucy5zdHJlYW1PdXQpIHtcbiAgICB0aGlzLm9wdGlvbnMuc3RyZWFtT3V0ID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFjayA9IEVycm9yKCk7XG4gICAgdGhpcy5fcGlwZWxpbmUodW5kZWZpbmVkLCBzdGFjayk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2UgdGhlIEMrKyBpbWFnZSBwcm9jZXNzaW5nIHBpcGVsaW5lXG4gKiBTdXBwb3J0cyBjYWxsYmFjaywgc3RyZWFtIGFuZCBwcm9taXNlIHZhcmlhbnRzXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBfcGlwZWxpbmUgKGNhbGxiYWNrLCBzdGFjaykge1xuICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gb3V0cHV0PWZpbGUvYnVmZmVyXG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgLy8gb3V0cHV0PWZpbGUvYnVmZmVyLCBpbnB1dD1zdHJlYW1cbiAgICAgIHRoaXMub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5fZmxhdHRlbkJ1ZmZlckluKCk7XG4gICAgICAgIHNoYXJwLnBpcGVsaW5lKHRoaXMub3B0aW9ucywgKGVyciwgZGF0YSwgaW5mbykgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgZGF0YSwgaW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdXRwdXQ9ZmlsZS9idWZmZXIsIGlucHV0PWZpbGUvYnVmZmVyXG4gICAgICBzaGFycC5waXBlbGluZSh0aGlzLm9wdGlvbnMsIChlcnIsIGRhdGEsIGluZm8pID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGNhbGxiYWNrKGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYWxsYmFjayhudWxsLCBkYXRhLCBpbmZvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2UgaWYgKHRoaXMub3B0aW9ucy5zdHJlYW1PdXQpIHtcbiAgICAvLyBvdXRwdXQ9c3RyZWFtXG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgLy8gb3V0cHV0PXN0cmVhbSwgaW5wdXQ9c3RyZWFtXG4gICAgICB0aGlzLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5fZmxhdHRlbkJ1ZmZlckluKCk7XG4gICAgICAgIHNoYXJwLnBpcGVsaW5lKHRoaXMub3B0aW9ucywgKGVyciwgZGF0YSwgaW5mbykgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBpcy5uYXRpdmVFcnJvcihlcnIsIHN0YWNrKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnaW5mbycsIGluZm8pO1xuICAgICAgICAgICAgdGhpcy5wdXNoKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnB1c2gobnVsbCk7XG4gICAgICAgICAgdGhpcy5vbignZW5kJywgKCkgPT4gdGhpcy5lbWl0KCdjbG9zZScpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnN0cmVhbUluRmluaXNoZWQpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdmaW5pc2gnKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb3V0cHV0PXN0cmVhbSwgaW5wdXQ9ZmlsZS9idWZmZXJcbiAgICAgIHNoYXJwLnBpcGVsaW5lKHRoaXMub3B0aW9ucywgKGVyciwgZGF0YSwgaW5mbykgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGlzLm5hdGl2ZUVycm9yKGVyciwgc3RhY2spKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2luZm8nLCBpbmZvKTtcbiAgICAgICAgICB0aGlzLnB1c2goZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wdXNoKG51bGwpO1xuICAgICAgICB0aGlzLm9uKCdlbmQnLCAoKSA9PiB0aGlzLmVtaXQoJ2Nsb3NlJykpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9IGVsc2Uge1xuICAgIC8vIG91dHB1dD1wcm9taXNlXG4gICAgaWYgKHRoaXMuX2lzU3RyZWFtSW5wdXQoKSkge1xuICAgICAgLy8gb3V0cHV0PXByb21pc2UsIGlucHV0PXN0cmVhbVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5vbmNlKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZmxhdHRlbkJ1ZmZlckluKCk7XG4gICAgICAgICAgc2hhcnAucGlwZWxpbmUodGhpcy5vcHRpb25zLCAoZXJyLCBkYXRhLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgIHJlamVjdChpcy5uYXRpdmVFcnJvcihlcnIsIHN0YWNrKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnJlc29sdmVXaXRoT2JqZWN0KSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRhdGEsIGluZm8gfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdXRwdXQ9cHJvbWlzZSwgaW5wdXQ9ZmlsZS9idWZmZXJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHNoYXJwLnBpcGVsaW5lKHRoaXMub3B0aW9ucywgKGVyciwgZGF0YSwgaW5mbykgPT4ge1xuICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChpcy5uYXRpdmVFcnJvcihlcnIsIHN0YWNrKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVzb2x2ZVdpdGhPYmplY3QpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh7IGRhdGEsIGluZm8gfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNvcmF0ZSB0aGUgU2hhcnAgcHJvdG90eXBlIHdpdGggb3V0cHV0LXJlbGF0ZWQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoU2hhcnApIHtcbiAgT2JqZWN0LmFzc2lnbihTaGFycC5wcm90b3R5cGUsIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0b0ZpbGUsXG4gICAgdG9CdWZmZXIsXG4gICAga2VlcEV4aWYsXG4gICAgd2l0aEV4aWYsXG4gICAgd2l0aEV4aWZNZXJnZSxcbiAgICBrZWVwSWNjUHJvZmlsZSxcbiAgICB3aXRoSWNjUHJvZmlsZSxcbiAgICBrZWVwTWV0YWRhdGEsXG4gICAgd2l0aE1ldGFkYXRhLFxuICAgIHRvRm9ybWF0LFxuICAgIGpwZWcsXG4gICAganAyLFxuICAgIHBuZyxcbiAgICB3ZWJwLFxuICAgIHRpZmYsXG4gICAgYXZpZixcbiAgICBoZWlmLFxuICAgIGp4bCxcbiAgICBnaWYsXG4gICAgcmF3LFxuICAgIHRpbGUsXG4gICAgdGltZW91dCxcbiAgICAvLyBQcml2YXRlXG4gICAgX3VwZGF0ZUZvcm1hdE91dCxcbiAgICBfc2V0Qm9vbGVhbk9wdGlvbixcbiAgICBfcmVhZCxcbiAgICBfcGlwZWxpbmVcbiAgfSk7XG59O1xuIiwKICAgICIvLyBDb3B5cmlnaHQgMjAxMyBMb3ZlbGwgRnVsbGVyIGFuZCBvdGhlcnMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4ndXNlIHN0cmljdCc7XG5cbmNvbnN0IGV2ZW50cyA9IHJlcXVpcmUoJ25vZGU6ZXZlbnRzJyk7XG5jb25zdCBkZXRlY3RMaWJjID0gcmVxdWlyZSgnZGV0ZWN0LWxpYmMnKTtcblxuY29uc3QgaXMgPSByZXF1aXJlKCcuL2lzJyk7XG5jb25zdCB7IHJ1bnRpbWVQbGF0Zm9ybUFyY2ggfSA9IHJlcXVpcmUoJy4vbGlidmlwcycpO1xuY29uc3Qgc2hhcnAgPSByZXF1aXJlKCcuL3NoYXJwJyk7XG5cbmNvbnN0IHJ1bnRpbWVQbGF0Zm9ybSA9IHJ1bnRpbWVQbGF0Zm9ybUFyY2goKTtcbmNvbnN0IGxpYnZpcHNWZXJzaW9uID0gc2hhcnAubGlidmlwc1ZlcnNpb24oKTtcblxuLyoqXG4gKiBBbiBPYmplY3QgY29udGFpbmluZyBuZXN0ZWQgYm9vbGVhbiB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCBmb3JtYXRzL21ldGhvZHMuXG4gKiBAbWVtYmVyXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2coc2hhcnAuZm9ybWF0KTtcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IGZvcm1hdCA9IHNoYXJwLmZvcm1hdCgpO1xuZm9ybWF0LmhlaWYub3V0cHV0LmFsaWFzID0gWydhdmlmJywgJ2hlaWMnXTtcbmZvcm1hdC5qcGVnLm91dHB1dC5hbGlhcyA9IFsnanBlJywgJ2pwZyddO1xuZm9ybWF0LnRpZmYub3V0cHV0LmFsaWFzID0gWyd0aWYnXTtcbmZvcm1hdC5qcDJrLm91dHB1dC5hbGlhcyA9IFsnajJjJywgJ2oyaycsICdqcDInLCAnanB4J107XG5cbi8qKlxuICogQW4gT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZSBpbnRlcnBvbGF0b3JzIGFuZCB0aGVpciBwcm9wZXIgdmFsdWVzXG4gKiBAcmVhZG9ubHlcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGludGVycG9sYXRvcnMgPSB7XG4gIC8qKiBbTmVhcmVzdCBuZWlnaGJvdXIgaW50ZXJwb2xhdGlvbl0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9OZWFyZXN0LW5laWdoYm9yX2ludGVycG9sYXRpb24pLiBTdWl0YWJsZSBmb3IgaW1hZ2UgZW5sYXJnZW1lbnQgb25seS4gKi9cbiAgbmVhcmVzdDogJ25lYXJlc3QnLFxuICAvKiogW0JpbGluZWFyIGludGVycG9sYXRpb25dKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmlsaW5lYXJfaW50ZXJwb2xhdGlvbikuIEZhc3RlciB0aGFuIGJpY3ViaWMgYnV0IHdpdGggbGVzcyBzbW9vdGggcmVzdWx0cy4gKi9cbiAgYmlsaW5lYXI6ICdiaWxpbmVhcicsXG4gIC8qKiBbQmljdWJpYyBpbnRlcnBvbGF0aW9uXShodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpY3ViaWNfaW50ZXJwb2xhdGlvbikgKHRoZSBkZWZhdWx0KS4gKi9cbiAgYmljdWJpYzogJ2JpY3ViaWMnLFxuICAvKiogW0xCQiBpbnRlcnBvbGF0aW9uXShodHRwczovL2dpdGh1Yi5jb20vbGlidmlwcy9saWJ2aXBzL2Jsb2IvbWFzdGVyL2xpYnZpcHMvcmVzYW1wbGUvbGJiLmNwcCNMMTAwKS4gUHJldmVudHMgc29tZSBcIlthY3V0YW5jZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BY3V0YW5jZSlcIiBidXQgdHlwaWNhbGx5IHJlZHVjZXMgcGVyZm9ybWFuY2UgYnkgYSBmYWN0b3Igb2YgMi4gKi9cbiAgbG9jYWxseUJvdW5kZWRCaWN1YmljOiAnbGJiJyxcbiAgLyoqIFtOb2hhbG8gaW50ZXJwb2xhdGlvbl0oaHR0cDovL2VwcmludHMuc290b24uYWMudWsvMjY4MDg2LykuIFByZXZlbnRzIGFjdXRhbmNlIGJ1dCB0eXBpY2FsbHkgcmVkdWNlcyBwZXJmb3JtYW5jZSBieSBhIGZhY3RvciBvZiAzLiAqL1xuICBub2hhbG86ICdub2hhbG8nLFxuICAvKiogW1ZTUUJTIGludGVycG9sYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9saWJ2aXBzL2xpYnZpcHMvYmxvYi9tYXN0ZXIvbGlidmlwcy9yZXNhbXBsZS92c3Ficy5jcHAjTDQ4KS4gUHJldmVudHMgXCJzdGFpcmNhc2luZ1wiIHdoZW4gZW5sYXJnaW5nLiAqL1xuICB2ZXJ0ZXhTcGxpdFF1YWRyYXRpY0Jhc2lzU3BsaW5lOiAndnNxYnMnXG59O1xuXG4vKipcbiAqIEFuIE9iamVjdCBjb250YWluaW5nIHRoZSB2ZXJzaW9uIG51bWJlcnMgb2Ygc2hhcnAsIGxpYnZpcHNcbiAqIGFuZCAod2hlbiB1c2luZyBwcmVidWlsdCBiaW5hcmllcykgaXRzIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBAbWVtYmVyXG4gKiBAZXhhbXBsZVxuICogY29uc29sZS5sb2coc2hhcnAudmVyc2lvbnMpO1xuICovXG5sZXQgdmVyc2lvbnMgPSB7XG4gIHZpcHM6IGxpYnZpcHNWZXJzaW9uLnNlbXZlclxufTtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pZiAoIWxpYnZpcHNWZXJzaW9uLmlzR2xvYmFsKSB7XG4gIGlmICghbGlidmlwc1ZlcnNpb24uaXNXYXNtKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZlcnNpb25zID0gcmVxdWlyZShgQGltZy9zaGFycC0ke3J1bnRpbWVQbGF0Zm9ybX0vdmVyc2lvbnNgKTtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICB0cnkge1xuICAgICAgICB2ZXJzaW9ucyA9IHJlcXVpcmUoYEBpbWcvc2hhcnAtbGlidmlwcy0ke3J1bnRpbWVQbGF0Zm9ybX0vdmVyc2lvbnNgKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRyeSB7XG4gICAgICB2ZXJzaW9ucyA9IHJlcXVpcmUoJ0BpbWcvc2hhcnAtd2FzbTMyL3ZlcnNpb25zJyk7XG4gICAgfSBjYXRjaCAoXykge31cbiAgfVxufVxudmVyc2lvbnMuc2hhcnAgPSByZXF1aXJlKCcuLi9wYWNrYWdlLmpzb24nKS52ZXJzaW9uO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuaWYgKHZlcnNpb25zLmhlaWYgJiYgZm9ybWF0LmhlaWYpIHtcbiAgLy8gUHJlYnVpbHQgYmluYXJpZXMgcHJvdmlkZSBBVjFcbiAgZm9ybWF0LmhlaWYuaW5wdXQuZmlsZVN1ZmZpeCA9IFsnLmF2aWYnXTtcbiAgZm9ybWF0LmhlaWYub3V0cHV0LmFsaWFzID0gWydhdmlmJ107XG59XG5cbi8qKlxuICogR2V0cyBvciwgd2hlbiBvcHRpb25zIGFyZSBwcm92aWRlZCwgc2V0cyB0aGUgbGltaXRzIG9mIF9saWJ2aXBzJ18gb3BlcmF0aW9uIGNhY2hlLlxuICogRXhpc3RpbmcgZW50cmllcyBpbiB0aGUgY2FjaGUgd2lsbCBiZSB0cmltbWVkIGFmdGVyIGFueSBjaGFuZ2UgaW4gbGltaXRzLlxuICogVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgY2FjaGUgc3RhdGlzdGljcyxcbiAqIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaG93IG11Y2ggd29ya2luZyBtZW1vcnkgaXMgcmVxdWlyZWQgZm9yIGEgcGFydGljdWxhciB0YXNrLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzdGF0cyA9IHNoYXJwLmNhY2hlKCk7XG4gKiBAZXhhbXBsZVxuICogc2hhcnAuY2FjaGUoIHsgaXRlbXM6IDIwMCB9ICk7XG4gKiBzaGFycC5jYWNoZSggeyBmaWxlczogMCB9ICk7XG4gKiBzaGFycC5jYWNoZShmYWxzZSk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R8Ym9vbGVhbn0gW29wdGlvbnM9dHJ1ZV0gLSBPYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMsIG9yIGJvb2xlYW4gd2hlcmUgdHJ1ZSB1c2VzIGRlZmF1bHQgY2FjaGUgc2V0dGluZ3MgYW5kIGZhbHNlIHJlbW92ZXMgYWxsIGNhY2hpbmdcbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tZW1vcnk9NTBdIC0gaXMgdGhlIG1heGltdW0gbWVtb3J5IGluIE1CIHRvIHVzZSBmb3IgdGhpcyBjYWNoZVxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRpb25zLmZpbGVzPTIwXSAtIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0byBob2xkIG9wZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5pdGVtcz0xMDBdIC0gaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG9wZXJhdGlvbnMgdG8gY2FjaGVcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIGNhY2hlIChvcHRpb25zKSB7XG4gIGlmIChpcy5ib29sKG9wdGlvbnMpKSB7XG4gICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgIC8vIERlZmF1bHQgY2FjaGUgc2V0dGluZ3Mgb2YgNTBNQiwgMjAgZmlsZXMsIDEwMCBpdGVtc1xuICAgICAgcmV0dXJuIHNoYXJwLmNhY2hlKDUwLCAyMCwgMTAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNoYXJwLmNhY2hlKDAsIDAsIDApO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpcy5vYmplY3Qob3B0aW9ucykpIHtcbiAgICByZXR1cm4gc2hhcnAuY2FjaGUob3B0aW9ucy5tZW1vcnksIG9wdGlvbnMuZmlsZXMsIG9wdGlvbnMuaXRlbXMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzaGFycC5jYWNoZSgpO1xuICB9XG59XG5jYWNoZSh0cnVlKTtcblxuLyoqXG4gKiBHZXRzIG9yLCB3aGVuIGEgY29uY3VycmVuY3kgaXMgcHJvdmlkZWQsIHNldHNcbiAqIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIF9saWJ2aXBzXyBzaG91bGQgdXNlIHRvIHByb2Nlc3MgX2VhY2ggaW1hZ2VfLlxuICogVGhlc2UgYXJlIGZyb20gYSB0aHJlYWQgcG9vbCBtYW5hZ2VkIGJ5IGdsaWIsXG4gKiB3aGljaCBoZWxwcyBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgbmV3IHRocmVhZHMuXG4gKlxuICogVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgdGhlIGN1cnJlbnQgY29uY3VycmVuY3kuXG4gKlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBDUFUgY29yZXMsXG4gKiBleGNlcHQgd2hlbiB1c2luZyBnbGliYy1iYXNlZCBMaW51eCB3aXRob3V0IGplbWFsbG9jLFxuICogd2hlcmUgdGhlIGRlZmF1bHQgaXMgYDFgIHRvIGhlbHAgcmVkdWNlIG1lbW9yeSBmcmFnbWVudGF0aW9uLlxuICpcbiAqIEEgdmFsdWUgb2YgYDBgIHdpbGwgcmVzZXQgdGhpcyB0byB0aGUgbnVtYmVyIG9mIENQVSBjb3Jlcy5cbiAqXG4gKiBTb21lIGltYWdlIGZvcm1hdCBsaWJyYXJpZXMgc3Bhd24gYWRkaXRpb25hbCB0aHJlYWRzLFxuICogZS5nLiBsaWJhb20gbWFuYWdlcyBpdHMgb3duIDQgdGhyZWFkcyB3aGVuIGVuY29kaW5nIEFWSUYgaW1hZ2VzLFxuICogYW5kIHRoZXNlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgdmFsdWUgc2V0IGhlcmUuXG4gKlxuICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGltYWdlcyB0aGF0IHNoYXJwIGNhbiBwcm9jZXNzIGluIHBhcmFsbGVsXG4gKiBpcyBjb250cm9sbGVkIGJ5IGxpYnV2J3MgYFVWX1RIUkVBRFBPT0xfU0laRWAgZW52aXJvbm1lbnQgdmFyaWFibGUsXG4gKiB3aGljaCBkZWZhdWx0cyB0byA0LlxuICpcbiAqIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvY2xpLmh0bWwjdXZfdGhyZWFkcG9vbF9zaXplc2l6ZVxuICpcbiAqIEZvciBleGFtcGxlLCBieSBkZWZhdWx0LCBhIG1hY2hpbmUgd2l0aCA4IENQVSBjb3JlcyB3aWxsIHByb2Nlc3NcbiAqIDQgaW1hZ2VzIGluIHBhcmFsbGVsIGFuZCB1c2UgdXAgdG8gOCB0aHJlYWRzIHBlciBpbWFnZSxcbiAqIHNvIHRoZXJlIHdpbGwgYmUgdXAgdG8gMzIgY29uY3VycmVudCB0aHJlYWRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0aHJlYWRzID0gc2hhcnAuY29uY3VycmVuY3koKTsgLy8gNFxuICogc2hhcnAuY29uY3VycmVuY3koMik7IC8vIDJcbiAqIHNoYXJwLmNvbmN1cnJlbmN5KDApOyAvLyA0XG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtjb25jdXJyZW5jeV1cbiAqIEByZXR1cm5zIHtudW1iZXJ9IGNvbmN1cnJlbmN5XG4gKi9cbmZ1bmN0aW9uIGNvbmN1cnJlbmN5IChjb25jdXJyZW5jeSkge1xuICByZXR1cm4gc2hhcnAuY29uY3VycmVuY3koaXMuaW50ZWdlcihjb25jdXJyZW5jeSkgPyBjb25jdXJyZW5jeSA6IG51bGwpO1xufVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChkZXRlY3RMaWJjLmZhbWlseVN5bmMoKSA9PT0gZGV0ZWN0TGliYy5HTElCQyAmJiAhc2hhcnAuX2lzVXNpbmdKZW1hbGxvYygpKSB7XG4gIC8vIFJlZHVjZSBkZWZhdWx0IGNvbmN1cnJlbmN5IHRvIDEgd2hlbiB1c2luZyBnbGliYyBtZW1vcnkgYWxsb2NhdG9yXG4gIHNoYXJwLmNvbmN1cnJlbmN5KDEpO1xufSBlbHNlIGlmIChkZXRlY3RMaWJjLmZhbWlseVN5bmMoKSA9PT0gZGV0ZWN0TGliYy5NVVNMICYmIHNoYXJwLmNvbmN1cnJlbmN5KCkgPT09IDEwMjQpIHtcbiAgLy8gUmVkdWNlIGRlZmF1bHQgY29uY3VycmVuY3kgd2hlbiBtdXNsIHRocmVhZCBvdmVyLXN1YnNjcmlwdGlvbiBkZXRlY3RlZFxuICBzaGFycC5jb25jdXJyZW5jeShyZXF1aXJlKCdub2RlOm9zJykuYXZhaWxhYmxlUGFyYWxsZWxpc20oKSk7XG59XG5cbi8qKlxuICogQW4gRXZlbnRFbWl0dGVyIHRoYXQgZW1pdHMgYSBgY2hhbmdlYCBldmVudCB3aGVuIGEgdGFzayBpcyBlaXRoZXI6XG4gKiAtIHF1ZXVlZCwgd2FpdGluZyBmb3IgX2xpYnV2XyB0byBwcm92aWRlIGEgd29ya2VyIHRocmVhZFxuICogLSBjb21wbGV0ZVxuICogQG1lbWJlclxuICogQGV4YW1wbGVcbiAqIHNoYXJwLnF1ZXVlLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbihxdWV1ZUxlbmd0aCkge1xuICogICBjb25zb2xlLmxvZygnUXVldWUgY29udGFpbnMgJyArIHF1ZXVlTGVuZ3RoICsgJyB0YXNrKHMpJyk7XG4gKiB9KTtcbiAqL1xuY29uc3QgcXVldWUgPSBuZXcgZXZlbnRzLkV2ZW50RW1pdHRlcigpO1xuXG4vKipcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byBpbnRlcm5hbCB0YXNrIGNvdW50ZXJzLlxuICogLSBxdWV1ZSBpcyB0aGUgbnVtYmVyIG9mIHRhc2tzIHRoaXMgbW9kdWxlIGhhcyBxdWV1ZWQgd2FpdGluZyBmb3IgX2xpYnV2XyB0byBwcm92aWRlIGEgd29ya2VyIHRocmVhZCBmcm9tIGl0cyBwb29sLlxuICogLSBwcm9jZXNzIGlzIHRoZSBudW1iZXIgb2YgcmVzaXplIHRhc2tzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGNvdW50ZXJzID0gc2hhcnAuY291bnRlcnMoKTsgLy8geyBxdWV1ZTogMiwgcHJvY2VzczogNCB9XG4gKlxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuZnVuY3Rpb24gY291bnRlcnMgKCkge1xuICByZXR1cm4gc2hhcnAuY291bnRlcnMoKTtcbn1cblxuLyoqXG4gKiBHZXQgYW5kIHNldCB1c2Ugb2YgU0lNRCB2ZWN0b3IgdW5pdCBpbnN0cnVjdGlvbnMuXG4gKiBSZXF1aXJlcyBsaWJ2aXBzIHRvIGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIGhpZ2h3YXkgc3VwcG9ydC5cbiAqXG4gKiBJbXByb3ZlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgYHJlc2l6ZWAsIGBibHVyYCBhbmQgYHNoYXJwZW5gIG9wZXJhdGlvbnNcbiAqIGJ5IHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIFNJTUQgdmVjdG9yIHVuaXQgb2YgdGhlIENQVSwgZS5nLiBJbnRlbCBTU0UgYW5kIEFSTSBORU9OLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzaW1kID0gc2hhcnAuc2ltZCgpO1xuICogLy8gc2ltZCBpcyBgdHJ1ZWAgaWYgdGhlIHJ1bnRpbWUgdXNlIG9mIGhpZ2h3YXkgaXMgY3VycmVudGx5IGVuYWJsZWRcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzaW1kID0gc2hhcnAuc2ltZChmYWxzZSk7XG4gKiAvLyBwcmV2ZW50IGxpYnZpcHMgZnJvbSB1c2luZyBoaWdod2F5IGF0IHJ1bnRpbWVcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzaW1kPXRydWVdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gc2ltZCAoc2ltZCkge1xuICByZXR1cm4gc2hhcnAuc2ltZChpcy5ib29sKHNpbWQpID8gc2ltZCA6IG51bGwpO1xufVxuXG4vKipcbiAqIEJsb2NrIGxpYnZpcHMgb3BlcmF0aW9ucyBhdCBydW50aW1lLlxuICpcbiAqIFRoaXMgaXMgaW4gYWRkaXRpb24gdG8gdGhlIGBWSVBTX0JMT0NLX1VOVFJVU1RFRGAgZW52aXJvbm1lbnQgdmFyaWFibGUsXG4gKiB3aGljaCB3aGVuIHNldCB3aWxsIGJsb2NrIGFsbCBcInVudHJ1c3RlZFwiIG9wZXJhdGlvbnMuXG4gKlxuICogQHNpbmNlIDAuMzIuNFxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkJsb2NrIGFsbCBUSUZGIGlucHV0LjwvY2FwdGlvbj5cbiAqIHNoYXJwLmJsb2NrKHtcbiAqICAgb3BlcmF0aW9uOiBbJ1ZpcHNGb3JlaWduTG9hZFRpZmYnXVxuICogfSk7XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gb3B0aW9ucy5vcGVyYXRpb24gLSBMaXN0IG9mIGxpYnZpcHMgbG93LWxldmVsIG9wZXJhdGlvbiBuYW1lcyB0byBibG9jay5cbiAqL1xuZnVuY3Rpb24gYmxvY2sgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMub3BlcmF0aW9uKSAmJiBvcHRpb25zLm9wZXJhdGlvbi5ldmVyeShpcy5zdHJpbmcpKSB7XG4gICAgICBzaGFycC5ibG9jayhvcHRpb25zLm9wZXJhdGlvbiwgdHJ1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3BlcmF0aW9uJywgJ0FycmF5PHN0cmluZz4nLCBvcHRpb25zLm9wZXJhdGlvbik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IGlzLmludmFsaWRQYXJhbWV0ZXJFcnJvcignb3B0aW9ucycsICdvYmplY3QnLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFVuYmxvY2sgbGlidmlwcyBvcGVyYXRpb25zIGF0IHJ1bnRpbWUuXG4gKlxuICogVGhpcyBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIGEgbGlzdCBvZiBhbGxvd2VkIG9wZXJhdGlvbnMuXG4gKlxuICogQHNpbmNlIDAuMzIuNFxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkJsb2NrIGFsbCBpbnB1dCBleGNlcHQgV2ViUCBmcm9tIHRoZSBmaWxlc3lzdGVtLjwvY2FwdGlvbj5cbiAqIHNoYXJwLmJsb2NrKHtcbiAqICAgb3BlcmF0aW9uOiBbJ1ZpcHNGb3JlaWduTG9hZCddXG4gKiB9KTtcbiAqIHNoYXJwLnVuYmxvY2soe1xuICogICBvcGVyYXRpb246IFsnVmlwc0ZvcmVpZ25Mb2FkV2VicEZpbGUnXVxuICogfSk7XG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+QmxvY2sgYWxsIGlucHV0IGV4Y2VwdCBKUEVHIGFuZCBQTkcgZnJvbSBhIEJ1ZmZlciBvciBTdHJlYW0uPC9jYXB0aW9uPlxuICogc2hhcnAuYmxvY2soe1xuICogICBvcGVyYXRpb246IFsnVmlwc0ZvcmVpZ25Mb2FkJ11cbiAqIH0pO1xuICogc2hhcnAudW5ibG9jayh7XG4gKiAgIG9wZXJhdGlvbjogWydWaXBzRm9yZWlnbkxvYWRKcGVnQnVmZmVyJywgJ1ZpcHNGb3JlaWduTG9hZFBuZ0J1ZmZlciddXG4gKiB9KTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBvcHRpb25zLm9wZXJhdGlvbiAtIExpc3Qgb2YgbGlidmlwcyBsb3ctbGV2ZWwgb3BlcmF0aW9uIG5hbWVzIHRvIHVuYmxvY2suXG4gKi9cbmZ1bmN0aW9uIHVuYmxvY2sgKG9wdGlvbnMpIHtcbiAgaWYgKGlzLm9iamVjdChvcHRpb25zKSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9wdGlvbnMub3BlcmF0aW9uKSAmJiBvcHRpb25zLm9wZXJhdGlvbi5ldmVyeShpcy5zdHJpbmcpKSB7XG4gICAgICBzaGFycC5ibG9jayhvcHRpb25zLm9wZXJhdGlvbiwgZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wZXJhdGlvbicsICdBcnJheTxzdHJpbmc+Jywgb3B0aW9ucy5vcGVyYXRpb24pO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBpcy5pbnZhbGlkUGFyYW1ldGVyRXJyb3IoJ29wdGlvbnMnLCAnb2JqZWN0Jywgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNvcmF0ZSB0aGUgU2hhcnAgY2xhc3Mgd2l0aCB1dGlsaXR5LXJlbGF0ZWQgZnVuY3Rpb25zLlxuICogQHByaXZhdGVcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoU2hhcnApIHtcbiAgU2hhcnAuY2FjaGUgPSBjYWNoZTtcbiAgU2hhcnAuY29uY3VycmVuY3kgPSBjb25jdXJyZW5jeTtcbiAgU2hhcnAuY291bnRlcnMgPSBjb3VudGVycztcbiAgU2hhcnAuc2ltZCA9IHNpbWQ7XG4gIFNoYXJwLmZvcm1hdCA9IGZvcm1hdDtcbiAgU2hhcnAuaW50ZXJwb2xhdG9ycyA9IGludGVycG9sYXRvcnM7XG4gIFNoYXJwLnZlcnNpb25zID0gdmVyc2lvbnM7XG4gIFNoYXJwLnF1ZXVlID0gcXVldWU7XG4gIFNoYXJwLmJsb2NrID0gYmxvY2s7XG4gIFNoYXJwLnVuYmxvY2sgPSB1bmJsb2NrO1xufTtcbiIsCiAgICAiLy8gQ29weXJpZ2h0IDIwMTMgTG92ZWxsIEZ1bGxlciBhbmQgb3RoZXJzLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBTaGFycCA9IHJlcXVpcmUoJy4vY29uc3RydWN0b3InKTtcbnJlcXVpcmUoJy4vaW5wdXQnKShTaGFycCk7XG5yZXF1aXJlKCcuL3Jlc2l6ZScpKFNoYXJwKTtcbnJlcXVpcmUoJy4vY29tcG9zaXRlJykoU2hhcnApO1xucmVxdWlyZSgnLi9vcGVyYXRpb24nKShTaGFycCk7XG5yZXF1aXJlKCcuL2NvbG91cicpKFNoYXJwKTtcbnJlcXVpcmUoJy4vY2hhbm5lbCcpKFNoYXJwKTtcbnJlcXVpcmUoJy4vb3V0cHV0JykoU2hhcnApO1xucmVxdWlyZSgnLi91dGlsaXR5JykoU2hhcnApO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFNoYXJwO1xuIiwKICAgICIvKipcbiAqIENvbW1hbmRlckVycm9yIGNsYXNzXG4gKi9cbmNsYXNzIENvbW1hbmRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ29uc3RydWN0cyB0aGUgQ29tbWFuZGVyRXJyb3IgY2xhc3NcbiAgICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIHN1Z2dlc3RlZCBleGl0IGNvZGUgd2hpY2ggY291bGQgYmUgdXNlZCB3aXRoIHByb2Nlc3MuZXhpdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZSBhbiBpZCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBlcnJvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3JcbiAgICovXG4gIGNvbnN0cnVjdG9yKGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgLy8gcHJvcGVybHkgY2FwdHVyZSBzdGFjayB0cmFjZSBpbiBOb2RlLmpzXG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgdGhpcy5leGl0Q29kZSA9IGV4aXRDb2RlO1xuICAgIHRoaXMubmVzdGVkRXJyb3IgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZhbGlkQXJndW1lbnRFcnJvciBjbGFzc1xuICovXG5jbGFzcyBJbnZhbGlkQXJndW1lbnRFcnJvciBleHRlbmRzIENvbW1hbmRlckVycm9yIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIEludmFsaWRBcmd1bWVudEVycm9yIGNsYXNzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gZXhwbGFuYXRpb24gb2Ygd2h5IGFyZ3VtZW50IGlzIGludmFsaWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcigxLCAnY29tbWFuZGVyLmludmFsaWRBcmd1bWVudCcsIG1lc3NhZ2UpO1xuICAgIC8vIHByb3Blcmx5IGNhcHR1cmUgc3RhY2sgdHJhY2UgaW4gTm9kZS5qc1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHRoaXMuY29uc3RydWN0b3IpO1xuICAgIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZTtcbiAgfVxufVxuXG5leHBvcnRzLkNvbW1hbmRlckVycm9yID0gQ29tbWFuZGVyRXJyb3I7XG5leHBvcnRzLkludmFsaWRBcmd1bWVudEVycm9yID0gSW52YWxpZEFyZ3VtZW50RXJyb3I7XG4iLAogICAgImNvbnN0IHsgSW52YWxpZEFyZ3VtZW50RXJyb3IgfSA9IHJlcXVpcmUoJy4vZXJyb3IuanMnKTtcblxuY2xhc3MgQXJndW1lbnQge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZSBhIG5ldyBjb21tYW5kIGFyZ3VtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIGRlc2NyaXB0aW9uLlxuICAgKiBUaGUgZGVmYXVsdCBpcyB0aGF0IHRoZSBhcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHlvdSBjYW4gZXhwbGljaXRseVxuICAgKiBpbmRpY2F0ZSB0aGlzIHdpdGggPD4gYXJvdW5kIHRoZSBuYW1lLiBQdXQgW10gYXJvdW5kIHRoZSBuYW1lIGZvciBhbiBvcHRpb25hbCBhcmd1bWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICovXG5cbiAgY29uc3RydWN0b3IobmFtZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgdGhpcy52YXJpYWRpYyA9IGZhbHNlO1xuICAgIHRoaXMucGFyc2VBcmcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWVEZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB1bmRlZmluZWQ7XG5cbiAgICBzd2l0Y2ggKG5hbWVbMF0pIHtcbiAgICAgIGNhc2UgJzwnOiAvLyBlLmcuIDxyZXF1aXJlZD5cbiAgICAgICAgdGhpcy5yZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX25hbWUgPSBuYW1lLnNsaWNlKDEsIC0xKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdbJzogLy8gZS5nLiBbb3B0aW9uYWxdXG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWUuc2xpY2UoMSwgLTEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMucmVxdWlyZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX25hbWUubGVuZ3RoID4gMyAmJiB0aGlzLl9uYW1lLnNsaWNlKC0zKSA9PT0gJy4uLicpIHtcbiAgICAgIHRoaXMudmFyaWFkaWMgPSB0cnVlO1xuICAgICAgdGhpcy5fbmFtZSA9IHRoaXMuX25hbWUuc2xpY2UoMCwgLTMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYXJndW1lbnQgbmFtZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9jb25jYXRWYWx1ZSh2YWx1ZSwgcHJldmlvdXMpIHtcbiAgICBpZiAocHJldmlvdXMgPT09IHRoaXMuZGVmYXVsdFZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHByZXZpb3VzKSkge1xuICAgICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpb3VzLmNvbmNhdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlLCBhbmQgb3B0aW9uYWxseSBzdXBwbHkgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtBcmd1bWVudH1cbiAgICovXG5cbiAgZGVmYXVsdCh2YWx1ZSwgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1c3RvbSBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIENMSSBjb21tYW5kIGFyZ3VtZW50cyBpbnRvIGFyZ3VtZW50IHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICAgKiBAcmV0dXJuIHtBcmd1bWVudH1cbiAgICovXG5cbiAgYXJnUGFyc2VyKGZuKSB7XG4gICAgdGhpcy5wYXJzZUFyZyA9IGZuO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ubHkgYWxsb3cgYXJndW1lbnQgdmFsdWUgdG8gYmUgb25lIG9mIGNob2ljZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHZhbHVlc1xuICAgKiBAcmV0dXJuIHtBcmd1bWVudH1cbiAgICovXG5cbiAgY2hvaWNlcyh2YWx1ZXMpIHtcbiAgICB0aGlzLmFyZ0Nob2ljZXMgPSB2YWx1ZXMuc2xpY2UoKTtcbiAgICB0aGlzLnBhcnNlQXJnID0gKGFyZywgcHJldmlvdXMpID0+IHtcbiAgICAgIGlmICghdGhpcy5hcmdDaG9pY2VzLmluY2x1ZGVzKGFyZykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEVycm9yKFxuICAgICAgICAgIGBBbGxvd2VkIGNob2ljZXMgYXJlICR7dGhpcy5hcmdDaG9pY2VzLmpvaW4oJywgJyl9LmAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy52YXJpYWRpYykge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY2F0VmFsdWUoYXJnLCBwcmV2aW91cyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhcmd1bWVudCByZXF1aXJlZC5cbiAgICpcbiAgICogQHJldHVybnMge0FyZ3VtZW50fVxuICAgKi9cbiAgYXJnUmVxdWlyZWQoKSB7XG4gICAgdGhpcy5yZXF1aXJlZCA9IHRydWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBhcmd1bWVudCBvcHRpb25hbC5cbiAgICpcbiAgICogQHJldHVybnMge0FyZ3VtZW50fVxuICAgKi9cbiAgYXJnT3B0aW9uYWwoKSB7XG4gICAgdGhpcy5yZXF1aXJlZCA9IGZhbHNlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbi8qKlxuICogVGFrZXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgaXRzIGh1bWFuIHJlYWRhYmxlIGVxdWl2YWxlbnQgZm9yIGhlbHAgdXNhZ2UuXG4gKlxuICogQHBhcmFtIHtBcmd1bWVudH0gYXJnXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZykge1xuICBjb25zdCBuYW1lT3V0cHV0ID0gYXJnLm5hbWUoKSArIChhcmcudmFyaWFkaWMgPT09IHRydWUgPyAnLi4uJyA6ICcnKTtcblxuICByZXR1cm4gYXJnLnJlcXVpcmVkID8gJzwnICsgbmFtZU91dHB1dCArICc+JyA6ICdbJyArIG5hbWVPdXRwdXQgKyAnXSc7XG59XG5cbmV4cG9ydHMuQXJndW1lbnQgPSBBcmd1bWVudDtcbmV4cG9ydHMuaHVtYW5SZWFkYWJsZUFyZ05hbWUgPSBodW1hblJlYWRhYmxlQXJnTmFtZTtcbiIsCiAgICAiY29uc3QgeyBodW1hblJlYWRhYmxlQXJnTmFtZSB9ID0gcmVxdWlyZSgnLi9hcmd1bWVudC5qcycpO1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgaW1wb3J0IHR5cGVzIGZvciBKU0RvYywgdXNlZCBieSBWaXN1YWwgU3R1ZGlvIENvZGUgSW50ZWxsaVNlbnNlIGFuZCBgbnBtIHJ1biB0eXBlc2NyaXB0LWNoZWNrSlNgXG4gKiBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9qc2RvYy1zdXBwb3J0ZWQtdHlwZXMuaHRtbCNpbXBvcnQtdHlwZXNcbiAqIEB0eXBlZGVmIHsgaW1wb3J0KFwiLi9hcmd1bWVudC5qc1wiKS5Bcmd1bWVudCB9IEFyZ3VtZW50XG4gKiBAdHlwZWRlZiB7IGltcG9ydChcIi4vY29tbWFuZC5qc1wiKS5Db21tYW5kIH0gQ29tbWFuZFxuICogQHR5cGVkZWYgeyBpbXBvcnQoXCIuL29wdGlvbi5qc1wiKS5PcHRpb24gfSBPcHRpb25cbiAqL1xuXG4vLyBBbHRob3VnaCB0aGlzIGlzIGEgY2xhc3MsIG1ldGhvZHMgYXJlIHN0YXRpYyBpbiBzdHlsZSB0byBhbGxvdyBvdmVycmlkZSB1c2luZyBzdWJjbGFzcyBvciBqdXN0IGZ1bmN0aW9ucy5cbmNsYXNzIEhlbHAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmhlbHBXaWR0aCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnNvcnRTdWJjb21tYW5kcyA9IGZhbHNlO1xuICAgIHRoaXMuc29ydE9wdGlvbnMgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dHbG9iYWxPcHRpb25zID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFycmF5IG9mIHRoZSB2aXNpYmxlIHN1YmNvbW1hbmRzLiBJbmNsdWRlcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgaW1wbGljaXQgaGVscCBjb21tYW5kLCBpZiB0aGVyZSBpcyBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtDb21tYW5kW119XG4gICAqL1xuXG4gIHZpc2libGVDb21tYW5kcyhjbWQpIHtcbiAgICBjb25zdCB2aXNpYmxlQ29tbWFuZHMgPSBjbWQuY29tbWFuZHMuZmlsdGVyKChjbWQpID0+ICFjbWQuX2hpZGRlbik7XG4gICAgY29uc3QgaGVscENvbW1hbmQgPSBjbWQuX2dldEhlbHBDb21tYW5kKCk7XG4gICAgaWYgKGhlbHBDb21tYW5kICYmICFoZWxwQ29tbWFuZC5faGlkZGVuKSB7XG4gICAgICB2aXNpYmxlQ29tbWFuZHMucHVzaChoZWxwQ29tbWFuZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNvcnRTdWJjb21tYW5kcykge1xuICAgICAgdmlzaWJsZUNvbW1hbmRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBvdmVybG9hZGVkIHJldHVybiB0eXBlXG4gICAgICAgIHJldHVybiBhLm5hbWUoKS5sb2NhbGVDb21wYXJlKGIubmFtZSgpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmlzaWJsZUNvbW1hbmRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgb3B0aW9ucyBmb3Igc29ydC5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IGFcbiAgICogQHBhcmFtIHtPcHRpb259IGJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG4gIGNvbXBhcmVPcHRpb25zKGEsIGIpIHtcbiAgICBjb25zdCBnZXRTb3J0S2V5ID0gKG9wdGlvbikgPT4ge1xuICAgICAgLy8gV1lTSVdZRyBmb3Igb3JkZXIgZGlzcGxheWVkIGluIGhlbHAuIFNob3J0IHVzZWQgZm9yIGNvbXBhcmlzb24gaWYgcHJlc2VudC4gTm8gc3BlY2lhbCBoYW5kbGluZyBmb3IgbmVnYXRlZC5cbiAgICAgIHJldHVybiBvcHRpb24uc2hvcnRcbiAgICAgICAgPyBvcHRpb24uc2hvcnQucmVwbGFjZSgvXi0vLCAnJylcbiAgICAgICAgOiBvcHRpb24ubG9uZy5yZXBsYWNlKC9eLS0vLCAnJyk7XG4gICAgfTtcbiAgICByZXR1cm4gZ2V0U29ydEtleShhKS5sb2NhbGVDb21wYXJlKGdldFNvcnRLZXkoYikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBvcHRpb25zLiBJbmNsdWRlcyBhIHBsYWNlaG9sZGVyIGZvciB0aGUgaW1wbGljaXQgaGVscCBvcHRpb24sIGlmIHRoZXJlIGlzIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge09wdGlvbltdfVxuICAgKi9cblxuICB2aXNpYmxlT3B0aW9ucyhjbWQpIHtcbiAgICBjb25zdCB2aXNpYmxlT3B0aW9ucyA9IGNtZC5vcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmhpZGRlbik7XG4gICAgLy8gQnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAgY29uc3QgaGVscE9wdGlvbiA9IGNtZC5fZ2V0SGVscE9wdGlvbigpO1xuICAgIGlmIChoZWxwT3B0aW9uICYmICFoZWxwT3B0aW9uLmhpZGRlbikge1xuICAgICAgLy8gQXV0b21hdGljYWxseSBoaWRlIGNvbmZsaWN0aW5nIGZsYWdzLiBCaXQgZHViaW91cyBidXQgYSBoaXN0b3JpY2FsIGJlaGF2aW91ciB0aGF0IGlzIGNvbnZlbmllbnQgZm9yIHNpbmdsZS1jb21tYW5kIHByb2dyYW1zLlxuICAgICAgY29uc3QgcmVtb3ZlU2hvcnQgPSBoZWxwT3B0aW9uLnNob3J0ICYmIGNtZC5fZmluZE9wdGlvbihoZWxwT3B0aW9uLnNob3J0KTtcbiAgICAgIGNvbnN0IHJlbW92ZUxvbmcgPSBoZWxwT3B0aW9uLmxvbmcgJiYgY21kLl9maW5kT3B0aW9uKGhlbHBPcHRpb24ubG9uZyk7XG4gICAgICBpZiAoIXJlbW92ZVNob3J0ICYmICFyZW1vdmVMb25nKSB7XG4gICAgICAgIHZpc2libGVPcHRpb25zLnB1c2goaGVscE9wdGlvbik7IC8vIG5vIGNoYW5nZXMgbmVlZGVkXG4gICAgICB9IGVsc2UgaWYgKGhlbHBPcHRpb24ubG9uZyAmJiAhcmVtb3ZlTG9uZykge1xuICAgICAgICB2aXNpYmxlT3B0aW9ucy5wdXNoKFxuICAgICAgICAgIGNtZC5jcmVhdGVPcHRpb24oaGVscE9wdGlvbi5sb25nLCBoZWxwT3B0aW9uLmRlc2NyaXB0aW9uKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoaGVscE9wdGlvbi5zaG9ydCAmJiAhcmVtb3ZlU2hvcnQpIHtcbiAgICAgICAgdmlzaWJsZU9wdGlvbnMucHVzaChcbiAgICAgICAgICBjbWQuY3JlYXRlT3B0aW9uKGhlbHBPcHRpb24uc2hvcnQsIGhlbHBPcHRpb24uZGVzY3JpcHRpb24pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0T3B0aW9ucykge1xuICAgICAgdmlzaWJsZU9wdGlvbnMuc29ydCh0aGlzLmNvbXBhcmVPcHRpb25zKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpc2libGVPcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiB0aGUgdmlzaWJsZSBnbG9iYWwgb3B0aW9ucy4gKE5vdCBpbmNsdWRpbmcgaGVscC4pXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtPcHRpb25bXX1cbiAgICovXG5cbiAgdmlzaWJsZUdsb2JhbE9wdGlvbnMoY21kKSB7XG4gICAgaWYgKCF0aGlzLnNob3dHbG9iYWxPcHRpb25zKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBnbG9iYWxPcHRpb25zID0gW107XG4gICAgZm9yIChcbiAgICAgIGxldCBhbmNlc3RvckNtZCA9IGNtZC5wYXJlbnQ7XG4gICAgICBhbmNlc3RvckNtZDtcbiAgICAgIGFuY2VzdG9yQ21kID0gYW5jZXN0b3JDbWQucGFyZW50XG4gICAgKSB7XG4gICAgICBjb25zdCB2aXNpYmxlT3B0aW9ucyA9IGFuY2VzdG9yQ21kLm9wdGlvbnMuZmlsdGVyKFxuICAgICAgICAob3B0aW9uKSA9PiAhb3B0aW9uLmhpZGRlbixcbiAgICAgICk7XG4gICAgICBnbG9iYWxPcHRpb25zLnB1c2goLi4udmlzaWJsZU9wdGlvbnMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zb3J0T3B0aW9ucykge1xuICAgICAgZ2xvYmFsT3B0aW9ucy5zb3J0KHRoaXMuY29tcGFyZU9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4gZ2xvYmFsT3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgdGhlIGFyZ3VtZW50cyBpZiBhbnkgaGF2ZSBhIGRlc2NyaXB0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7QXJndW1lbnRbXX1cbiAgICovXG5cbiAgdmlzaWJsZUFyZ3VtZW50cyhjbWQpIHtcbiAgICAvLyBTaWRlIGVmZmVjdCEgQXBwbHkgdGhlIGxlZ2FjeSBkZXNjcmlwdGlvbnMgYmVmb3JlIHRoZSBhcmd1bWVudHMgYXJlIGRpc3BsYXllZC5cbiAgICBpZiAoY21kLl9hcmdzRGVzY3JpcHRpb24pIHtcbiAgICAgIGNtZC5yZWdpc3RlcmVkQXJndW1lbnRzLmZvckVhY2goKGFyZ3VtZW50KSA9PiB7XG4gICAgICAgIGFyZ3VtZW50LmRlc2NyaXB0aW9uID1cbiAgICAgICAgICBhcmd1bWVudC5kZXNjcmlwdGlvbiB8fCBjbWQuX2FyZ3NEZXNjcmlwdGlvblthcmd1bWVudC5uYW1lKCldIHx8ICcnO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgYXJlIGFueSBhcmd1bWVudHMgd2l0aCBhIGRlc2NyaXB0aW9uIHRoZW4gcmV0dXJuIGFsbCB0aGUgYXJndW1lbnRzLlxuICAgIGlmIChjbWQucmVnaXN0ZXJlZEFyZ3VtZW50cy5maW5kKChhcmd1bWVudCkgPT4gYXJndW1lbnQuZGVzY3JpcHRpb24pKSB7XG4gICAgICByZXR1cm4gY21kLnJlZ2lzdGVyZWRBcmd1bWVudHM7XG4gICAgfVxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbW1hbmQgdGVybSB0byBzaG93IGluIHRoZSBsaXN0IG9mIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBzdWJjb21tYW5kVGVybShjbWQpIHtcbiAgICAvLyBMZWdhY3kuIElnbm9yZXMgY3VzdG9tIHVzYWdlIHN0cmluZywgYW5kIG5lc3RlZCBjb21tYW5kcy5cbiAgICBjb25zdCBhcmdzID0gY21kLnJlZ2lzdGVyZWRBcmd1bWVudHNcbiAgICAgIC5tYXAoKGFyZykgPT4gaHVtYW5SZWFkYWJsZUFyZ05hbWUoYXJnKSlcbiAgICAgIC5qb2luKCcgJyk7XG4gICAgcmV0dXJuIChcbiAgICAgIGNtZC5fbmFtZSArXG4gICAgICAoY21kLl9hbGlhc2VzWzBdID8gJ3wnICsgY21kLl9hbGlhc2VzWzBdIDogJycpICtcbiAgICAgIChjbWQub3B0aW9ucy5sZW5ndGggPyAnIFtvcHRpb25zXScgOiAnJykgKyAvLyBzaW1wbGlzdGljIGNoZWNrIGZvciBub24taGVscCBvcHRpb25cbiAgICAgIChhcmdzID8gJyAnICsgYXJncyA6ICcnKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBvcHRpb24gdGVybSB0byBzaG93IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgb3B0aW9uVGVybShvcHRpb24pIHtcbiAgICByZXR1cm4gb3B0aW9uLmZsYWdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgYXJndW1lbnQgdGVybSB0byBzaG93IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtBcmd1bWVudH0gYXJndW1lbnRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgYXJndW1lbnRUZXJtKGFyZ3VtZW50KSB7XG4gICAgcmV0dXJuIGFyZ3VtZW50Lm5hbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxvbmdlc3QgY29tbWFuZCB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdFN1YmNvbW1hbmRUZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlQ29tbWFuZHMoY21kKS5yZWR1Y2UoKG1heCwgY29tbWFuZCkgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLnN1YmNvbW1hbmRUZXJtKGNvbW1hbmQpLmxlbmd0aCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IG9wdGlvbiB0ZXJtIGxlbmd0aC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHBhcmFtIHtIZWxwfSBoZWxwZXJcbiAgICogQHJldHVybnMge251bWJlcn1cbiAgICovXG5cbiAgbG9uZ2VzdE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpIHtcbiAgICByZXR1cm4gaGVscGVyLnZpc2libGVPcHRpb25zKGNtZCkucmVkdWNlKChtYXgsIG9wdGlvbikgPT4ge1xuICAgICAgcmV0dXJuIE1hdGgubWF4KG1heCwgaGVscGVyLm9wdGlvblRlcm0ob3B0aW9uKS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbG9uZ2VzdCBnbG9iYWwgb3B0aW9uIHRlcm0gbGVuZ3RoLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBsb25nZXN0R2xvYmFsT3B0aW9uVGVybUxlbmd0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBoZWxwZXIudmlzaWJsZUdsb2JhbE9wdGlvbnMoY21kKS5yZWR1Y2UoKG1heCwgb3B0aW9uKSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLmxlbmd0aCk7XG4gICAgfSwgMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsb25nZXN0IGFyZ3VtZW50IHRlcm0gbGVuZ3RoLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBsb25nZXN0QXJndW1lbnRUZXJtTGVuZ3RoKGNtZCwgaGVscGVyKSB7XG4gICAgcmV0dXJuIGhlbHBlci52aXNpYmxlQXJndW1lbnRzKGNtZCkucmVkdWNlKChtYXgsIGFyZ3VtZW50KSA9PiB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgobWF4LCBoZWxwZXIuYXJndW1lbnRUZXJtKGFyZ3VtZW50KS5sZW5ndGgpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29tbWFuZCB1c2FnZSB0byBiZSBkaXNwbGF5ZWQgYXQgdGhlIHRvcCBvZiB0aGUgYnVpbHQtaW4gaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBjbWRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG5cbiAgY29tbWFuZFVzYWdlKGNtZCkge1xuICAgIC8vIFVzYWdlXG4gICAgbGV0IGNtZE5hbWUgPSBjbWQuX25hbWU7XG4gICAgaWYgKGNtZC5fYWxpYXNlc1swXSkge1xuICAgICAgY21kTmFtZSA9IGNtZE5hbWUgKyAnfCcgKyBjbWQuX2FsaWFzZXNbMF07XG4gICAgfVxuICAgIGxldCBhbmNlc3RvckNtZE5hbWVzID0gJyc7XG4gICAgZm9yIChcbiAgICAgIGxldCBhbmNlc3RvckNtZCA9IGNtZC5wYXJlbnQ7XG4gICAgICBhbmNlc3RvckNtZDtcbiAgICAgIGFuY2VzdG9yQ21kID0gYW5jZXN0b3JDbWQucGFyZW50XG4gICAgKSB7XG4gICAgICBhbmNlc3RvckNtZE5hbWVzID0gYW5jZXN0b3JDbWQubmFtZSgpICsgJyAnICsgYW5jZXN0b3JDbWROYW1lcztcbiAgICB9XG4gICAgcmV0dXJuIGFuY2VzdG9yQ21kTmFtZXMgKyBjbWROYW1lICsgJyAnICsgY21kLnVzYWdlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIGNvbW1hbmREZXNjcmlwdGlvbihjbWQpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIG92ZXJsb2FkZWQgcmV0dXJuIHR5cGVcbiAgICByZXR1cm4gY21kLmRlc2NyaXB0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBzdWJjb21tYW5kIHN1bW1hcnkgdG8gc2hvdyBpbiB0aGUgbGlzdCBvZiBzdWJjb21tYW5kcy5cbiAgICogKEZhbGxiYWNrIHRvIGRlc2NyaXB0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4pXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuXG4gIHN1YmNvbW1hbmREZXNjcmlwdGlvbihjbWQpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIG92ZXJsb2FkZWQgcmV0dXJuIHR5cGVcbiAgICByZXR1cm4gY21kLnN1bW1hcnkoKSB8fCBjbWQuZGVzY3JpcHRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9wdGlvbiBkZXNjcmlwdGlvbiB0byBzaG93IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBvcHRpb25EZXNjcmlwdGlvbihvcHRpb24pIHtcbiAgICBjb25zdCBleHRyYUluZm8gPSBbXTtcblxuICAgIGlmIChvcHRpb24uYXJnQ2hvaWNlcykge1xuICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgIC8vIHVzZSBzdHJpbmdpZnkgdG8gbWF0Y2ggdGhlIGRpc3BsYXkgb2YgdGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgYGNob2ljZXM6ICR7b3B0aW9uLmFyZ0Nob2ljZXMubWFwKChjaG9pY2UpID0+IEpTT04uc3RyaW5naWZ5KGNob2ljZSkpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb24uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGRlZmF1bHQgZm9yIGJvb2xlYW4gYW5kIG5lZ2F0ZWQgbW9yZSBmb3IgcHJvZ3JhbW1lciB0aGFuIGVuZCB1c2VyLFxuICAgICAgLy8gYnV0IHNob3cgdHJ1ZS9mYWxzZSBmb3IgYm9vbGVhbiBvcHRpb24gYXMgbWF5IGJlIGZvciBoYW5kLXJvbGxlZCBlbnYgb3IgY29uZmlnIHByb2Nlc3NpbmcuXG4gICAgICBjb25zdCBzaG93RGVmYXVsdCA9XG4gICAgICAgIG9wdGlvbi5yZXF1aXJlZCB8fFxuICAgICAgICBvcHRpb24ub3B0aW9uYWwgfHxcbiAgICAgICAgKG9wdGlvbi5pc0Jvb2xlYW4oKSAmJiB0eXBlb2Ygb3B0aW9uLmRlZmF1bHRWYWx1ZSA9PT0gJ2Jvb2xlYW4nKTtcbiAgICAgIGlmIChzaG93RGVmYXVsdCkge1xuICAgICAgICBleHRyYUluZm8ucHVzaChcbiAgICAgICAgICBgZGVmYXVsdDogJHtvcHRpb24uZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gfHwgSlNPTi5zdHJpbmdpZnkob3B0aW9uLmRlZmF1bHRWYWx1ZSl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gcHJlc2V0IGZvciBib29sZWFuIGFuZCBuZWdhdGVkIGFyZSBtb3JlIGZvciBwcm9ncmFtbWVyIHRoYW4gZW5kIHVzZXJcbiAgICBpZiAob3B0aW9uLnByZXNldEFyZyAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgZXh0cmFJbmZvLnB1c2goYHByZXNldDogJHtKU09OLnN0cmluZ2lmeShvcHRpb24ucHJlc2V0QXJnKX1gKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbi5lbnZWYXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0cmFJbmZvLnB1c2goYGVudjogJHtvcHRpb24uZW52VmFyfWApO1xuICAgIH1cbiAgICBpZiAoZXh0cmFJbmZvLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgJHtvcHRpb24uZGVzY3JpcHRpb259ICgke2V4dHJhSW5mby5qb2luKCcsICcpfSlgO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb24uZGVzY3JpcHRpb247XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhcmd1bWVudCBkZXNjcmlwdGlvbiB0byBzaG93IGluIHRoZSBsaXN0IG9mIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHtBcmd1bWVudH0gYXJndW1lbnRcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBhcmd1bWVudERlc2NyaXB0aW9uKGFyZ3VtZW50KSB7XG4gICAgY29uc3QgZXh0cmFJbmZvID0gW107XG4gICAgaWYgKGFyZ3VtZW50LmFyZ0Nob2ljZXMpIHtcbiAgICAgIGV4dHJhSW5mby5wdXNoKFxuICAgICAgICAvLyB1c2Ugc3RyaW5naWZ5IHRvIG1hdGNoIHRoZSBkaXNwbGF5IG9mIHRoZSBkZWZhdWx0IHZhbHVlXG4gICAgICAgIGBjaG9pY2VzOiAke2FyZ3VtZW50LmFyZ0Nob2ljZXMubWFwKChjaG9pY2UpID0+IEpTT04uc3RyaW5naWZ5KGNob2ljZSkpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChhcmd1bWVudC5kZWZhdWx0VmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXh0cmFJbmZvLnB1c2goXG4gICAgICAgIGBkZWZhdWx0OiAke2FyZ3VtZW50LmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uIHx8IEpTT04uc3RyaW5naWZ5KGFyZ3VtZW50LmRlZmF1bHRWYWx1ZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChleHRyYUluZm8ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZXh0cmFEZXNjcmlwdG9uID0gYCgke2V4dHJhSW5mby5qb2luKCcsICcpfSlgO1xuICAgICAgaWYgKGFyZ3VtZW50LmRlc2NyaXB0aW9uKSB7XG4gICAgICAgIHJldHVybiBgJHthcmd1bWVudC5kZXNjcmlwdGlvbn0gJHtleHRyYURlc2NyaXB0b259YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBleHRyYURlc2NyaXB0b247XG4gICAgfVxuICAgIHJldHVybiBhcmd1bWVudC5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0aGUgYnVpbHQtaW4gaGVscCB0ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cblxuICBmb3JtYXRIZWxwKGNtZCwgaGVscGVyKSB7XG4gICAgY29uc3QgdGVybVdpZHRoID0gaGVscGVyLnBhZFdpZHRoKGNtZCwgaGVscGVyKTtcbiAgICBjb25zdCBoZWxwV2lkdGggPSBoZWxwZXIuaGVscFdpZHRoIHx8IDgwO1xuICAgIGNvbnN0IGl0ZW1JbmRlbnRXaWR0aCA9IDI7XG4gICAgY29uc3QgaXRlbVNlcGFyYXRvcldpZHRoID0gMjsgLy8gYmV0d2VlbiB0ZXJtIGFuZCBkZXNjcmlwdGlvblxuICAgIGZ1bmN0aW9uIGZvcm1hdEl0ZW0odGVybSwgZGVzY3JpcHRpb24pIHtcbiAgICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCBmdWxsVGV4dCA9IGAke3Rlcm0ucGFkRW5kKHRlcm1XaWR0aCArIGl0ZW1TZXBhcmF0b3JXaWR0aCl9JHtkZXNjcmlwdGlvbn1gO1xuICAgICAgICByZXR1cm4gaGVscGVyLndyYXAoXG4gICAgICAgICAgZnVsbFRleHQsXG4gICAgICAgICAgaGVscFdpZHRoIC0gaXRlbUluZGVudFdpZHRoLFxuICAgICAgICAgIHRlcm1XaWR0aCArIGl0ZW1TZXBhcmF0b3JXaWR0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZXJtO1xuICAgIH1cbiAgICBmdW5jdGlvbiBmb3JtYXRMaXN0KHRleHRBcnJheSkge1xuICAgICAgcmV0dXJuIHRleHRBcnJheS5qb2luKCdcXG4nKS5yZXBsYWNlKC9eL2dtLCAnICcucmVwZWF0KGl0ZW1JbmRlbnRXaWR0aCkpO1xuICAgIH1cblxuICAgIC8vIFVzYWdlXG4gICAgbGV0IG91dHB1dCA9IFtgVXNhZ2U6ICR7aGVscGVyLmNvbW1hbmRVc2FnZShjbWQpfWAsICcnXTtcblxuICAgIC8vIERlc2NyaXB0aW9uXG4gICAgY29uc3QgY29tbWFuZERlc2NyaXB0aW9uID0gaGVscGVyLmNvbW1hbmREZXNjcmlwdGlvbihjbWQpO1xuICAgIGlmIChjb21tYW5kRGVzY3JpcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbXG4gICAgICAgIGhlbHBlci53cmFwKGNvbW1hbmREZXNjcmlwdGlvbiwgaGVscFdpZHRoLCAwKSxcbiAgICAgICAgJycsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyBBcmd1bWVudHNcbiAgICBjb25zdCBhcmd1bWVudExpc3QgPSBoZWxwZXIudmlzaWJsZUFyZ3VtZW50cyhjbWQpLm1hcCgoYXJndW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIuYXJndW1lbnRUZXJtKGFyZ3VtZW50KSxcbiAgICAgICAgaGVscGVyLmFyZ3VtZW50RGVzY3JpcHRpb24oYXJndW1lbnQpLFxuICAgICAgKTtcbiAgICB9KTtcbiAgICBpZiAoYXJndW1lbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIG91dHB1dCA9IG91dHB1dC5jb25jYXQoWydBcmd1bWVudHM6JywgZm9ybWF0TGlzdChhcmd1bWVudExpc3QpLCAnJ10pO1xuICAgIH1cblxuICAgIC8vIE9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25MaXN0ID0gaGVscGVyLnZpc2libGVPcHRpb25zKGNtZCkubWFwKChvcHRpb24pID0+IHtcbiAgICAgIHJldHVybiBmb3JtYXRJdGVtKFxuICAgICAgICBoZWxwZXIub3B0aW9uVGVybShvcHRpb24pLFxuICAgICAgICBoZWxwZXIub3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSxcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaWYgKG9wdGlvbkxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbJ09wdGlvbnM6JywgZm9ybWF0TGlzdChvcHRpb25MaXN0KSwgJyddKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zaG93R2xvYmFsT3B0aW9ucykge1xuICAgICAgY29uc3QgZ2xvYmFsT3B0aW9uTGlzdCA9IGhlbHBlclxuICAgICAgICAudmlzaWJsZUdsb2JhbE9wdGlvbnMoY21kKVxuICAgICAgICAubWFwKChvcHRpb24pID0+IHtcbiAgICAgICAgICByZXR1cm4gZm9ybWF0SXRlbShcbiAgICAgICAgICAgIGhlbHBlci5vcHRpb25UZXJtKG9wdGlvbiksXG4gICAgICAgICAgICBoZWxwZXIub3B0aW9uRGVzY3JpcHRpb24ob3B0aW9uKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIGlmIChnbG9iYWxPcHRpb25MaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3V0cHV0ID0gb3V0cHV0LmNvbmNhdChbXG4gICAgICAgICAgJ0dsb2JhbCBPcHRpb25zOicsXG4gICAgICAgICAgZm9ybWF0TGlzdChnbG9iYWxPcHRpb25MaXN0KSxcbiAgICAgICAgICAnJyxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tbWFuZHNcbiAgICBjb25zdCBjb21tYW5kTGlzdCA9IGhlbHBlci52aXNpYmxlQ29tbWFuZHMoY21kKS5tYXAoKGNtZCkgPT4ge1xuICAgICAgcmV0dXJuIGZvcm1hdEl0ZW0oXG4gICAgICAgIGhlbHBlci5zdWJjb21tYW5kVGVybShjbWQpLFxuICAgICAgICBoZWxwZXIuc3ViY29tbWFuZERlc2NyaXB0aW9uKGNtZCksXG4gICAgICApO1xuICAgIH0pO1xuICAgIGlmIChjb21tYW5kTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBvdXRwdXQgPSBvdXRwdXQuY29uY2F0KFsnQ29tbWFuZHM6JywgZm9ybWF0TGlzdChjb21tYW5kTGlzdCksICcnXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dC5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIHBhZCB3aWR0aCBmcm9tIHRoZSBtYXhpbXVtIHRlcm0gbGVuZ3RoLlxuICAgKlxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IGNtZFxuICAgKiBAcGFyYW0ge0hlbHB9IGhlbHBlclxuICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgKi9cblxuICBwYWRXaWR0aChjbWQsIGhlbHBlcikge1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgIGhlbHBlci5sb25nZXN0T3B0aW9uVGVybUxlbmd0aChjbWQsIGhlbHBlciksXG4gICAgICBoZWxwZXIubG9uZ2VzdEdsb2JhbE9wdGlvblRlcm1MZW5ndGgoY21kLCBoZWxwZXIpLFxuICAgICAgaGVscGVyLmxvbmdlc3RTdWJjb21tYW5kVGVybUxlbmd0aChjbWQsIGhlbHBlciksXG4gICAgICBoZWxwZXIubG9uZ2VzdEFyZ3VtZW50VGVybUxlbmd0aChjbWQsIGhlbHBlciksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwIHRoZSBnaXZlbiBzdHJpbmcgdG8gd2lkdGggY2hhcmFjdGVycyBwZXIgbGluZSwgd2l0aCBsaW5lcyBhZnRlciB0aGUgZmlyc3QgaW5kZW50ZWQuXG4gICAqIERvIG5vdCB3cmFwIGlmIGluc3VmZmljaWVudCByb29tIGZvciB3cmFwcGluZyAobWluQ29sdW1uV2lkdGgpLCBvciBzdHJpbmcgaXMgbWFudWFsbHkgZm9ybWF0dGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB3aWR0aFxuICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZW50XG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbWluQ29sdW1uV2lkdGg9NDBdXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICpcbiAgICovXG5cbiAgd3JhcChzdHIsIHdpZHRoLCBpbmRlbnQsIG1pbkNvbHVtbldpZHRoID0gNDApIHtcbiAgICAvLyBGdWxsIFxccyBjaGFyYWN0ZXJzLCBtaW51cyB0aGUgbGluZWZlZWRzLlxuICAgIGNvbnN0IGluZGVudHMgPVxuICAgICAgJyBcXFxcZlxcXFx0XFxcXHZcXHUwMGEwXFx1MTY4MFxcdTIwMDAtXFx1MjAwYVxcdTIwMmZcXHUyMDVmXFx1MzAwMFxcdWZlZmYnO1xuICAgIC8vIERldGVjdCBtYW51YWxseSB3cmFwcGVkIGFuZCBpbmRlbnRlZCBzdHJpbmdzIGJ5IHNlYXJjaGluZyBmb3IgbGluZSBicmVhayBmb2xsb3dlZCBieSBzcGFjZXMuXG4gICAgY29uc3QgbWFudWFsSW5kZW50ID0gbmV3IFJlZ0V4cChgW1xcXFxuXVske2luZGVudHN9XStgKTtcbiAgICBpZiAoc3RyLm1hdGNoKG1hbnVhbEluZGVudCkpIHJldHVybiBzdHI7XG4gICAgLy8gRG8gbm90IHdyYXAgaWYgbm90IGVub3VnaCByb29tIGZvciBhIHdyYXBwZWQgY29sdW1uIG9mIHRleHQgKGFzIGNvdWxkIGVuZCB1cCB3aXRoIGEgd29yZCBwZXIgbGluZSkuXG4gICAgY29uc3QgY29sdW1uV2lkdGggPSB3aWR0aCAtIGluZGVudDtcbiAgICBpZiAoY29sdW1uV2lkdGggPCBtaW5Db2x1bW5XaWR0aCkgcmV0dXJuIHN0cjtcblxuICAgIGNvbnN0IGxlYWRpbmdTdHIgPSBzdHIuc2xpY2UoMCwgaW5kZW50KTtcbiAgICBjb25zdCBjb2x1bW5UZXh0ID0gc3RyLnNsaWNlKGluZGVudCkucmVwbGFjZSgnXFxyXFxuJywgJ1xcbicpO1xuICAgIGNvbnN0IGluZGVudFN0cmluZyA9ICcgJy5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCB6ZXJvV2lkdGhTcGFjZSA9ICdcXHUyMDBCJztcbiAgICBjb25zdCBicmVha3MgPSBgXFxcXHMke3plcm9XaWR0aFNwYWNlfWA7XG4gICAgLy8gTWF0Y2ggbGluZSBlbmQgKHNvIGVtcHR5IGxpbmVzIGRvbid0IGNvbGxhcHNlKSxcbiAgICAvLyBvciBhcyBtdWNoIHRleHQgYXMgd2lsbCBmaXQgaW4gY29sdW1uLCBvciBleGNlc3MgdGV4dCB1cCB0byBmaXJzdCBicmVhay5cbiAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXG4gICAgICBgXFxufC57MSwke2NvbHVtbldpZHRoIC0gMX19KFske2JyZWFrc31dfCQpfFteJHticmVha3N9XSs/KFske2JyZWFrc31dfCQpYCxcbiAgICAgICdnJyxcbiAgICApO1xuICAgIGNvbnN0IGxpbmVzID0gY29sdW1uVGV4dC5tYXRjaChyZWdleCkgfHwgW107XG4gICAgcmV0dXJuIChcbiAgICAgIGxlYWRpbmdTdHIgK1xuICAgICAgbGluZXNcbiAgICAgICAgLm1hcCgobGluZSwgaSkgPT4ge1xuICAgICAgICAgIGlmIChsaW5lID09PSAnXFxuJykgcmV0dXJuICcnOyAvLyBwcmVzZXJ2ZSBlbXB0eSBsaW5lc1xuICAgICAgICAgIHJldHVybiAoaSA+IDAgPyBpbmRlbnRTdHJpbmcgOiAnJykgKyBsaW5lLnRyaW1FbmQoKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnRzLkhlbHAgPSBIZWxwO1xuIiwKICAgICJjb25zdCB7IEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2Vycm9yLmpzJyk7XG5cbmNsYXNzIE9wdGlvbiB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgbmV3IGBPcHRpb25gIHdpdGggdGhlIGdpdmVuIGBmbGFnc2AgYW5kIGBkZXNjcmlwdGlvbmAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uIHx8ICcnO1xuXG4gICAgdGhpcy5yZXF1aXJlZCA9IGZsYWdzLmluY2x1ZGVzKCc8Jyk7IC8vIEEgdmFsdWUgbXVzdCBiZSBzdXBwbGllZCB3aGVuIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkLlxuICAgIHRoaXMub3B0aW9uYWwgPSBmbGFncy5pbmNsdWRlcygnWycpOyAvLyBBIHZhbHVlIGlzIG9wdGlvbmFsIHdoZW4gdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQuXG4gICAgLy8gdmFyaWFkaWMgdGVzdCBpZ25vcmVzIDx2YWx1ZSwuLi4+IGV0IGFsIHdoaWNoIG1pZ2h0IGJlIHVzZWQgdG8gZGVzY3JpYmUgY3VzdG9tIHNwbGl0dGluZyBvZiBzaW5nbGUgYXJndW1lbnRcbiAgICB0aGlzLnZhcmlhZGljID0gL1xcd1xcLlxcLlxcLls+XFxdXSQvLnRlc3QoZmxhZ3MpOyAvLyBUaGUgb3B0aW9uIGNhbiB0YWtlIG11bHRpcGxlIHZhbHVlcy5cbiAgICB0aGlzLm1hbmRhdG9yeSA9IGZhbHNlOyAvLyBUaGUgb3B0aW9uIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcsIHdoaWNoIHVzdWFsbHkgbWVhbnMgaXQgbXVzdCBiZSBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lLlxuICAgIGNvbnN0IG9wdGlvbkZsYWdzID0gc3BsaXRPcHRpb25GbGFncyhmbGFncyk7XG4gICAgdGhpcy5zaG9ydCA9IG9wdGlvbkZsYWdzLnNob3J0RmxhZztcbiAgICB0aGlzLmxvbmcgPSBvcHRpb25GbGFncy5sb25nRmxhZztcbiAgICB0aGlzLm5lZ2F0ZSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmxvbmcpIHtcbiAgICAgIHRoaXMubmVnYXRlID0gdGhpcy5sb25nLnN0YXJ0c1dpdGgoJy0tbm8tJyk7XG4gICAgfVxuICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGVmYXVsdFZhbHVlRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wcmVzZXRBcmcgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbnZWYXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYXJzZUFyZyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmhpZGRlbiA9IGZhbHNlO1xuICAgIHRoaXMuYXJnQ2hvaWNlcyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNvbmZsaWN0c1dpdGggPSBbXTtcbiAgICB0aGlzLmltcGxpZWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBkZWZhdWx0IHZhbHVlLCBhbmQgb3B0aW9uYWxseSBzdXBwbHkgdGhlIGRlc2NyaXB0aW9uIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgaGVscC5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGRlZmF1bHQodmFsdWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgdGhpcy5kZWZhdWx0VmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLmRlZmF1bHRWYWx1ZURlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUHJlc2V0IHRvIHVzZSB3aGVuIG9wdGlvbiB1c2VkIHdpdGhvdXQgb3B0aW9uLWFyZ3VtZW50LCBlc3BlY2lhbGx5IG9wdGlvbmFsIGJ1dCBhbHNvIGJvb2xlYW4gYW5kIG5lZ2F0ZWQuXG4gICAqIFRoZSBjdXN0b20gcHJvY2Vzc2luZyAocGFyc2VBcmcpIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogbmV3IE9wdGlvbignLS1jb2xvcicpLmRlZmF1bHQoJ0dSRVlTQ0FMRScpLnByZXNldCgnUkdCJyk7XG4gICAqIG5ldyBPcHRpb24oJy0tZG9uYXRlIFthbW91bnRdJykucHJlc2V0KCcyMCcpLmFyZ1BhcnNlcihwYXJzZUZsb2F0KTtcbiAgICpcbiAgICogQHBhcmFtIHsqfSBhcmdcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBwcmVzZXQoYXJnKSB7XG4gICAgdGhpcy5wcmVzZXRBcmcgPSBhcmc7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG9wdGlvbiBuYW1lKHMpIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGlzIG9wdGlvbi5cbiAgICogQW4gZXJyb3Igd2lsbCBiZSBkaXNwbGF5ZWQgaWYgY29uZmxpY3Rpbmcgb3B0aW9ucyBhcmUgZm91bmQgZHVyaW5nIHBhcnNpbmcuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIG5ldyBPcHRpb24oJy0tcmdiJykuY29uZmxpY3RzKCdjbXlrJyk7XG4gICAqIG5ldyBPcHRpb24oJy0tanMnKS5jb25mbGljdHMoWyd0cycsICdqc3gnXSk7XG4gICAqXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHN0cmluZ1tdKX0gbmFtZXNcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBjb25mbGljdHMobmFtZXMpIHtcbiAgICB0aGlzLmNvbmZsaWN0c1dpdGggPSB0aGlzLmNvbmZsaWN0c1dpdGguY29uY2F0KG5hbWVzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IGltcGxpZWQgb3B0aW9uIHZhbHVlcyBmb3Igd2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQgYW5kIHRoZSBpbXBsaWVkIG9wdGlvbnMgYXJlIG5vdC5cbiAgICpcbiAgICogVGhlIGN1c3RvbSBwcm9jZXNzaW5nIChwYXJzZUFyZykgaXMgbm90IGNhbGxlZCBvbiB0aGUgaW1wbGllZCB2YWx1ZXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW1cbiAgICogICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tbG9nJywgJ3dyaXRlIGxvZ2dpbmcgaW5mb3JtYXRpb24gdG8gZmlsZScpKVxuICAgKiAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS10cmFjZScsICdsb2cgZXh0cmEgZGV0YWlscycpLmltcGxpZXMoeyBsb2c6ICd0cmFjZS50eHQnIH0pKTtcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IGltcGxpZWRPcHRpb25WYWx1ZXNcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cbiAgaW1wbGllcyhpbXBsaWVkT3B0aW9uVmFsdWVzKSB7XG4gICAgbGV0IG5ld0ltcGxpZWQgPSBpbXBsaWVkT3B0aW9uVmFsdWVzO1xuICAgIGlmICh0eXBlb2YgaW1wbGllZE9wdGlvblZhbHVlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIHN0cmluZyBpcyBub3QgZG9jdW1lbnRlZCwgYnV0IGVhc3kgbWlzdGFrZSBhbmQgd2UgY2FuIGRvIHdoYXQgdXNlciBwcm9iYWJseSBpbnRlbmRlZC5cbiAgICAgIG5ld0ltcGxpZWQgPSB7IFtpbXBsaWVkT3B0aW9uVmFsdWVzXTogdHJ1ZSB9O1xuICAgIH1cbiAgICB0aGlzLmltcGxpZWQgPSBPYmplY3QuYXNzaWduKHRoaXMuaW1wbGllZCB8fCB7fSwgbmV3SW1wbGllZCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIHRvIGNoZWNrIGZvciBvcHRpb24gdmFsdWUuXG4gICAqXG4gICAqIEFuIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIG9ubHkgdXNlZCBpZiB3aGVuIHByb2Nlc3NlZCB0aGUgY3VycmVudCBvcHRpb24gdmFsdWUgaXNcbiAgICogdW5kZWZpbmVkLCBvciB0aGUgc291cmNlIG9mIHRoZSBjdXJyZW50IHZhbHVlIGlzICdkZWZhdWx0JyBvciAnY29uZmlnJyBvciAnZW52Jy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBlbnYobmFtZSkge1xuICAgIHRoaXMuZW52VmFyID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1c3RvbSBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIENMSSBvcHRpb24gYXJndW1lbnRzIGludG8gb3B0aW9uIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2ZuXVxuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGFyZ1BhcnNlcihmbikge1xuICAgIHRoaXMucGFyc2VBcmcgPSBmbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgbWFuZGF0b3J5IGFuZCBtdXN0IGhhdmUgYSB2YWx1ZSBhZnRlciBwYXJzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFttYW5kYXRvcnk9dHJ1ZV1cbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBtYWtlT3B0aW9uTWFuZGF0b3J5KG1hbmRhdG9yeSA9IHRydWUpIHtcbiAgICB0aGlzLm1hbmRhdG9yeSA9ICEhbWFuZGF0b3J5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGUgb3B0aW9uIGluIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2hpZGU9dHJ1ZV1cbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKi9cblxuICBoaWRlSGVscChoaWRlID0gdHJ1ZSkge1xuICAgIHRoaXMuaGlkZGVuID0gISFoaWRlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIF9jb25jYXRWYWx1ZSh2YWx1ZSwgcHJldmlvdXMpIHtcbiAgICBpZiAocHJldmlvdXMgPT09IHRoaXMuZGVmYXVsdFZhbHVlIHx8ICFBcnJheS5pc0FycmF5KHByZXZpb3VzKSkge1xuICAgICAgcmV0dXJuIFt2YWx1ZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHByZXZpb3VzLmNvbmNhdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogT25seSBhbGxvdyBvcHRpb24gdmFsdWUgdG8gYmUgb25lIG9mIGNob2ljZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHZhbHVlc1xuICAgKiBAcmV0dXJuIHtPcHRpb259XG4gICAqL1xuXG4gIGNob2ljZXModmFsdWVzKSB7XG4gICAgdGhpcy5hcmdDaG9pY2VzID0gdmFsdWVzLnNsaWNlKCk7XG4gICAgdGhpcy5wYXJzZUFyZyA9IChhcmcsIHByZXZpb3VzKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuYXJnQ2hvaWNlcy5pbmNsdWRlcyhhcmcpKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFcnJvcihcbiAgICAgICAgICBgQWxsb3dlZCBjaG9pY2VzIGFyZSAke3RoaXMuYXJnQ2hvaWNlcy5qb2luKCcsICcpfS5gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudmFyaWFkaWMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmNhdFZhbHVlKGFyZywgcHJldmlvdXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFyZztcbiAgICB9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBvcHRpb24gbmFtZS5cbiAgICpcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBuYW1lKCkge1xuICAgIGlmICh0aGlzLmxvbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvbmcucmVwbGFjZSgvXi0tLywgJycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG9ydC5yZXBsYWNlKC9eLS8sICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gb3B0aW9uIG5hbWUsIGluIGEgY2FtZWxjYXNlIGZvcm1hdCB0aGF0IGNhbiBiZSB1c2VkXG4gICAqIGFzIGEgb2JqZWN0IGF0dHJpYnV0ZSBrZXkuXG4gICAqXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG5cbiAgYXR0cmlidXRlTmFtZSgpIHtcbiAgICByZXR1cm4gY2FtZWxjYXNlKHRoaXMubmFtZSgpLnJlcGxhY2UoL15uby0vLCAnJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGBhcmdgIG1hdGNoZXMgdGhlIHNob3J0IG9yIGxvbmcgZmxhZy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ1xuICAgKiBAcmV0dXJuIHtib29sZWFufVxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBpcyhhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5zaG9ydCA9PT0gYXJnIHx8IHRoaXMubG9uZyA9PT0gYXJnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB3aGV0aGVyIGEgYm9vbGVhbiBvcHRpb24uXG4gICAqXG4gICAqIE9wdGlvbnMgYXJlIG9uZSBvZiBib29sZWFuLCBuZWdhdGVkLCByZXF1aXJlZCBhcmd1bWVudCwgb3Igb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqIEBwYWNrYWdlXG4gICAqL1xuXG4gIGlzQm9vbGVhbigpIHtcbiAgICByZXR1cm4gIXRoaXMucmVxdWlyZWQgJiYgIXRoaXMub3B0aW9uYWwgJiYgIXRoaXMubmVnYXRlO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB0byBtYWtlIGl0IGVhc2llciB0byB3b3JrIHdpdGggZHVhbCBvcHRpb25zLCB3aXRob3V0IGNoYW5naW5nIHRoZSBleGlzdGluZ1xuICogaW1wbGVtZW50YXRpb24uIFdlIHN1cHBvcnQgc2VwYXJhdGUgZHVhbCBvcHRpb25zIGZvciBzZXBhcmF0ZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgb3B0aW9ucyxcbiAqIGxpa2UgYC0tYnVpbGRgIGFuZCBgLS1uby1idWlsZGAsIHdoaWNoIHNoYXJlIGEgc2luZ2xlIG9wdGlvbiB2YWx1ZS4gVGhpcyB3b3JrcyBuaWNlbHkgZm9yIHNvbWVcbiAqIHVzZSBjYXNlcywgYnV0IGlzIHRyaWNreSBmb3Igb3RoZXJzIHdoZXJlIHdlIHdhbnQgc2VwYXJhdGUgYmVoYXZpb3VycyBkZXNwaXRlXG4gKiB0aGUgc2luZ2xlIHNoYXJlZCBvcHRpb24gdmFsdWUuXG4gKi9cbmNsYXNzIER1YWxPcHRpb25zIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7T3B0aW9uW119IG9wdGlvbnNcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLnBvc2l0aXZlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLm5lZ2F0aXZlT3B0aW9ucyA9IG5ldyBNYXAoKTtcbiAgICB0aGlzLmR1YWxPcHRpb25zID0gbmV3IFNldCgpO1xuICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICBpZiAob3B0aW9uLm5lZ2F0ZSkge1xuICAgICAgICB0aGlzLm5lZ2F0aXZlT3B0aW9ucy5zZXQob3B0aW9uLmF0dHJpYnV0ZU5hbWUoKSwgb3B0aW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9zaXRpdmVPcHRpb25zLnNldChvcHRpb24uYXR0cmlidXRlTmFtZSgpLCBvcHRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubmVnYXRpdmVPcHRpb25zLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmICh0aGlzLnBvc2l0aXZlT3B0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgICB0aGlzLmR1YWxPcHRpb25zLmFkZChrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpZCB0aGUgdmFsdWUgY29tZSBmcm9tIHRoZSBvcHRpb24sIGFuZCBub3QgZnJvbSBwb3NzaWJsZSBtYXRjaGluZyBkdWFsIG9wdGlvbj9cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgdmFsdWVGcm9tT3B0aW9uKHZhbHVlLCBvcHRpb24pIHtcbiAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgIGlmICghdGhpcy5kdWFsT3B0aW9ucy5oYXMob3B0aW9uS2V5KSkgcmV0dXJuIHRydWU7XG5cbiAgICAvLyBVc2UgdGhlIHZhbHVlIHRvIGRlZHVjZSBpZiAocHJvYmFibHkpIGNhbWUgZnJvbSB0aGUgb3B0aW9uLlxuICAgIGNvbnN0IHByZXNldCA9IHRoaXMubmVnYXRpdmVPcHRpb25zLmdldChvcHRpb25LZXkpLnByZXNldEFyZztcbiAgICBjb25zdCBuZWdhdGl2ZVZhbHVlID0gcHJlc2V0ICE9PSB1bmRlZmluZWQgPyBwcmVzZXQgOiBmYWxzZTtcbiAgICByZXR1cm4gb3B0aW9uLm5lZ2F0ZSA9PT0gKG5lZ2F0aXZlVmFsdWUgPT09IHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgc3RyaW5nIGZyb20ga2ViYWItY2FzZSB0byBjYW1lbENhc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjYW1lbGNhc2Uoc3RyKSB7XG4gIHJldHVybiBzdHIuc3BsaXQoJy0nKS5yZWR1Y2UoKHN0ciwgd29yZCkgPT4ge1xuICAgIHJldHVybiBzdHIgKyB3b3JkWzBdLnRvVXBwZXJDYXNlKCkgKyB3b3JkLnNsaWNlKDEpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTcGxpdCB0aGUgc2hvcnQgYW5kIGxvbmcgZmxhZyBvdXQgb2Ygc29tZXRoaW5nIGxpa2UgJy1tLC0tbWl4ZWQgPHZhbHVlPidcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHNwbGl0T3B0aW9uRmxhZ3MoZmxhZ3MpIHtcbiAgbGV0IHNob3J0RmxhZztcbiAgbGV0IGxvbmdGbGFnO1xuICAvLyBVc2Ugb3JpZ2luYWwgdmVyeSBsb29zZSBwYXJzaW5nIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBub3csXG4gIC8vIHdoaWNoIGFsbG93ZWQgZm9yIGV4YW1wbGUgdW5pbnRlbmRlZCBgLXN3LCAtLXNob3J0LXdvcmRgIFtzaWNdLlxuICBjb25zdCBmbGFnUGFydHMgPSBmbGFncy5zcGxpdCgvWyB8LF0rLyk7XG4gIGlmIChmbGFnUGFydHMubGVuZ3RoID4gMSAmJiAhL15bWzxdLy50ZXN0KGZsYWdQYXJ0c1sxXSkpXG4gICAgc2hvcnRGbGFnID0gZmxhZ1BhcnRzLnNoaWZ0KCk7XG4gIGxvbmdGbGFnID0gZmxhZ1BhcnRzLnNoaWZ0KCk7XG4gIC8vIEFkZCBzdXBwb3J0IGZvciBsb25lIHNob3J0IGZsYWcgd2l0aG91dCBzaWduaWZpY2FudGx5IGNoYW5naW5nIHBhcnNpbmchXG4gIGlmICghc2hvcnRGbGFnICYmIC9eLVteLV0kLy50ZXN0KGxvbmdGbGFnKSkge1xuICAgIHNob3J0RmxhZyA9IGxvbmdGbGFnO1xuICAgIGxvbmdGbGFnID0gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB7IHNob3J0RmxhZywgbG9uZ0ZsYWcgfTtcbn1cblxuZXhwb3J0cy5PcHRpb24gPSBPcHRpb247XG5leHBvcnRzLkR1YWxPcHRpb25zID0gRHVhbE9wdGlvbnM7XG4iLAogICAgImNvbnN0IG1heERpc3RhbmNlID0gMztcblxuZnVuY3Rpb24gZWRpdERpc3RhbmNlKGEsIGIpIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGFtZXJhdeKAk0xldmVuc2h0ZWluX2Rpc3RhbmNlXG4gIC8vIENhbGN1bGF0aW5nIG9wdGltYWwgc3RyaW5nIGFsaWdubWVudCBkaXN0YW5jZSwgbm8gc3Vic3RyaW5nIGlzIGVkaXRlZCBtb3JlIHRoYW4gb25jZS5cbiAgLy8gKFNpbXBsZSBpbXBsZW1lbnRhdGlvbi4pXG5cbiAgLy8gUXVpY2sgZWFybHkgZXhpdCwgcmV0dXJuIHdvcnN0IGNhc2UuXG4gIGlmIChNYXRoLmFicyhhLmxlbmd0aCAtIGIubGVuZ3RoKSA+IG1heERpc3RhbmNlKVxuICAgIHJldHVybiBNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpO1xuXG4gIC8vIGRpc3RhbmNlIGJldHdlZW4gcHJlZml4IHN1YnN0cmluZ3Mgb2YgYSBhbmQgYlxuICBjb25zdCBkID0gW107XG5cbiAgLy8gcHVyZSBkZWxldGlvbnMgdHVybiBhIGludG8gZW1wdHkgc3RyaW5nXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICBkW2ldID0gW2ldO1xuICB9XG4gIC8vIHB1cmUgaW5zZXJ0aW9ucyB0dXJuIGVtcHR5IHN0cmluZyBpbnRvIGJcbiAgZm9yIChsZXQgaiA9IDA7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGRbMF1bal0gPSBqO1xuICB9XG5cbiAgLy8gZmlsbCBtYXRyaXhcbiAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjb3N0ID0gMTtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgY29zdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3N0ID0gMTtcbiAgICAgIH1cbiAgICAgIGRbaV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgZFtpIC0gMV1bal0gKyAxLCAvLyBkZWxldGlvblxuICAgICAgICBkW2ldW2ogLSAxXSArIDEsIC8vIGluc2VydGlvblxuICAgICAgICBkW2kgLSAxXVtqIC0gMV0gKyBjb3N0LCAvLyBzdWJzdGl0dXRpb25cbiAgICAgICk7XG4gICAgICAvLyB0cmFuc3Bvc2l0aW9uXG4gICAgICBpZiAoaSA+IDEgJiYgaiA+IDEgJiYgYVtpIC0gMV0gPT09IGJbaiAtIDJdICYmIGFbaSAtIDJdID09PSBiW2ogLSAxXSkge1xuICAgICAgICBkW2ldW2pdID0gTWF0aC5taW4oZFtpXVtqXSwgZFtpIC0gMl1baiAtIDJdICsgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRbYS5sZW5ndGhdW2IubGVuZ3RoXTtcbn1cblxuLyoqXG4gKiBGaW5kIGNsb3NlIG1hdGNoZXMsIHJlc3RyaWN0ZWQgdG8gc2FtZSBudW1iZXIgb2YgZWRpdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHdvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IGNhbmRpZGF0ZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuZnVuY3Rpb24gc3VnZ2VzdFNpbWlsYXIod29yZCwgY2FuZGlkYXRlcykge1xuICBpZiAoIWNhbmRpZGF0ZXMgfHwgY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybiAnJztcbiAgLy8gcmVtb3ZlIHBvc3NpYmxlIGR1cGxpY2F0ZXNcbiAgY2FuZGlkYXRlcyA9IEFycmF5LmZyb20obmV3IFNldChjYW5kaWRhdGVzKSk7XG5cbiAgY29uc3Qgc2VhcmNoaW5nT3B0aW9ucyA9IHdvcmQuc3RhcnRzV2l0aCgnLS0nKTtcbiAgaWYgKHNlYXJjaGluZ09wdGlvbnMpIHtcbiAgICB3b3JkID0gd29yZC5zbGljZSgyKTtcbiAgICBjYW5kaWRhdGVzID0gY2FuZGlkYXRlcy5tYXAoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLnNsaWNlKDIpKTtcbiAgfVxuXG4gIGxldCBzaW1pbGFyID0gW107XG4gIGxldCBiZXN0RGlzdGFuY2UgPSBtYXhEaXN0YW5jZTtcbiAgY29uc3QgbWluU2ltaWxhcml0eSA9IDAuNDtcbiAgY2FuZGlkYXRlcy5mb3JFYWNoKChjYW5kaWRhdGUpID0+IHtcbiAgICBpZiAoY2FuZGlkYXRlLmxlbmd0aCA8PSAxKSByZXR1cm47IC8vIG5vIG9uZSBjaGFyYWN0ZXIgZ3Vlc3Nlc1xuXG4gICAgY29uc3QgZGlzdGFuY2UgPSBlZGl0RGlzdGFuY2Uod29yZCwgY2FuZGlkYXRlKTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1heCh3b3JkLmxlbmd0aCwgY2FuZGlkYXRlLmxlbmd0aCk7XG4gICAgY29uc3Qgc2ltaWxhcml0eSA9IChsZW5ndGggLSBkaXN0YW5jZSkgLyBsZW5ndGg7XG4gICAgaWYgKHNpbWlsYXJpdHkgPiBtaW5TaW1pbGFyaXR5KSB7XG4gICAgICBpZiAoZGlzdGFuY2UgPCBiZXN0RGlzdGFuY2UpIHtcbiAgICAgICAgLy8gYmV0dGVyIGVkaXQgZGlzdGFuY2UsIHRocm93IGF3YXkgcHJldmlvdXMgd29yc2UgbWF0Y2hlc1xuICAgICAgICBiZXN0RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgc2ltaWxhciA9IFtjYW5kaWRhdGVdO1xuICAgICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gYmVzdERpc3RhbmNlKSB7XG4gICAgICAgIHNpbWlsYXIucHVzaChjYW5kaWRhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgc2ltaWxhci5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICBpZiAoc2VhcmNoaW5nT3B0aW9ucykge1xuICAgIHNpbWlsYXIgPSBzaW1pbGFyLm1hcCgoY2FuZGlkYXRlKSA9PiBgLS0ke2NhbmRpZGF0ZX1gKTtcbiAgfVxuXG4gIGlmIChzaW1pbGFyLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gb25lIG9mICR7c2ltaWxhci5qb2luKCcsICcpfT8pYDtcbiAgfVxuICBpZiAoc2ltaWxhci5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYFxcbihEaWQgeW91IG1lYW4gJHtzaW1pbGFyWzBdfT8pYDtcbiAgfVxuICByZXR1cm4gJyc7XG59XG5cbmV4cG9ydHMuc3VnZ2VzdFNpbWlsYXIgPSBzdWdnZXN0U2ltaWxhcjtcbiIsCiAgICAiY29uc3QgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgnbm9kZTpldmVudHMnKS5FdmVudEVtaXR0ZXI7XG5jb25zdCBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdub2RlOmNoaWxkX3Byb2Nlc3MnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdub2RlOnBhdGgnKTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnbm9kZTpmcycpO1xuY29uc3QgcHJvY2VzcyA9IHJlcXVpcmUoJ25vZGU6cHJvY2VzcycpO1xuXG5jb25zdCB7IEFyZ3VtZW50LCBodW1hblJlYWRhYmxlQXJnTmFtZSB9ID0gcmVxdWlyZSgnLi9hcmd1bWVudC5qcycpO1xuY29uc3QgeyBDb21tYW5kZXJFcnJvciB9ID0gcmVxdWlyZSgnLi9lcnJvci5qcycpO1xuY29uc3QgeyBIZWxwIH0gPSByZXF1aXJlKCcuL2hlbHAuanMnKTtcbmNvbnN0IHsgT3B0aW9uLCBEdWFsT3B0aW9ucyB9ID0gcmVxdWlyZSgnLi9vcHRpb24uanMnKTtcbmNvbnN0IHsgc3VnZ2VzdFNpbWlsYXIgfSA9IHJlcXVpcmUoJy4vc3VnZ2VzdFNpbWlsYXInKTtcblxuY2xhc3MgQ29tbWFuZCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGEgbmV3IGBDb21tYW5kYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXVxuICAgKi9cblxuICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gICAgc3VwZXIoKTtcbiAgICAvKiogQHR5cGUge0NvbW1hbmRbXX0gKi9cbiAgICB0aGlzLmNvbW1hbmRzID0gW107XG4gICAgLyoqIEB0eXBlIHtPcHRpb25bXX0gKi9cbiAgICB0aGlzLm9wdGlvbnMgPSBbXTtcbiAgICB0aGlzLnBhcmVudCA9IG51bGw7XG4gICAgdGhpcy5fYWxsb3dVbmtub3duT3B0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5fYWxsb3dFeGNlc3NBcmd1bWVudHMgPSB0cnVlO1xuICAgIC8qKiBAdHlwZSB7QXJndW1lbnRbXX0gKi9cbiAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMgPSBbXTtcbiAgICB0aGlzLl9hcmdzID0gdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzOyAvLyBkZXByZWNhdGVkIG9sZCBuYW1lXG4gICAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgICB0aGlzLmFyZ3MgPSBbXTsgLy8gY2xpIGFyZ3Mgd2l0aCBvcHRpb25zIHJlbW92ZWRcbiAgICB0aGlzLnJhd0FyZ3MgPSBbXTtcbiAgICB0aGlzLnByb2Nlc3NlZEFyZ3MgPSBbXTsgLy8gbGlrZSAuYXJncyBidXQgYWZ0ZXIgY3VzdG9tIHByb2Nlc3NpbmcgYW5kIGNvbGxlY3RpbmcgdmFyaWFkaWNcbiAgICB0aGlzLl9zY3JpcHRQYXRoID0gbnVsbDtcbiAgICB0aGlzLl9uYW1lID0gbmFtZSB8fCAnJztcbiAgICB0aGlzLl9vcHRpb25WYWx1ZXMgPSB7fTtcbiAgICB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXMgPSB7fTsgLy8gZGVmYXVsdCwgZW52LCBjbGkgZXRjXG4gICAgdGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgdGhpcy5fYWN0aW9uSGFuZGxlciA9IG51bGw7XG4gICAgdGhpcy5fZXhlY3V0YWJsZUhhbmRsZXIgPSBmYWxzZTtcbiAgICB0aGlzLl9leGVjdXRhYmxlRmlsZSA9IG51bGw7IC8vIGN1c3RvbSBuYW1lIGZvciBleGVjdXRhYmxlXG4gICAgdGhpcy5fZXhlY3V0YWJsZURpciA9IG51bGw7IC8vIGN1c3RvbSBzZWFyY2ggZGlyZWN0b3J5IGZvciBzdWJjb21tYW5kc1xuICAgIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSA9IG51bGw7XG4gICAgdGhpcy5fZXhpdENhbGxiYWNrID0gbnVsbDtcbiAgICB0aGlzLl9hbGlhc2VzID0gW107XG4gICAgdGhpcy5fY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlID0gdHJ1ZTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9ICcnO1xuICAgIHRoaXMuX3N1bW1hcnkgPSAnJztcbiAgICB0aGlzLl9hcmdzRGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7IC8vIGxlZ2FjeVxuICAgIHRoaXMuX2VuYWJsZVBvc2l0aW9uYWxPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zID0gZmFsc2U7XG4gICAgdGhpcy5fbGlmZUN5Y2xlSG9va3MgPSB7fTsgLy8gYSBoYXNoIG9mIGFycmF5c1xuICAgIC8qKiBAdHlwZSB7KGJvb2xlYW4gfCBzdHJpbmcpfSAqL1xuICAgIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9IGZhbHNlO1xuICAgIHRoaXMuX3Nob3dTdWdnZXN0aW9uQWZ0ZXJFcnJvciA9IHRydWU7XG5cbiAgICAvLyBzZWUgLmNvbmZpZ3VyZU91dHB1dCgpIGZvciBkb2NzXG4gICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbiA9IHtcbiAgICAgIHdyaXRlT3V0OiAoc3RyKSA9PiBwcm9jZXNzLnN0ZG91dC53cml0ZShzdHIpLFxuICAgICAgd3JpdGVFcnI6IChzdHIpID0+IHByb2Nlc3Muc3RkZXJyLndyaXRlKHN0ciksXG4gICAgICBnZXRPdXRIZWxwV2lkdGg6ICgpID0+XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8gcHJvY2Vzcy5zdGRvdXQuY29sdW1ucyA6IHVuZGVmaW5lZCxcbiAgICAgIGdldEVyckhlbHBXaWR0aDogKCkgPT5cbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIuaXNUVFkgPyBwcm9jZXNzLnN0ZGVyci5jb2x1bW5zIDogdW5kZWZpbmVkLFxuICAgICAgb3V0cHV0RXJyb3I6IChzdHIsIHdyaXRlKSA9PiB3cml0ZShzdHIpLFxuICAgIH07XG5cbiAgICB0aGlzLl9oaWRkZW4gPSBmYWxzZTtcbiAgICAvKiogQHR5cGUgeyhPcHRpb24gfCBudWxsIHwgdW5kZWZpbmVkKX0gKi9cbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gdW5kZWZpbmVkOyAvLyBMYXp5IGNyZWF0ZWQgb24gZGVtYW5kLiBNYXkgYmUgbnVsbCBpZiBoZWxwIG9wdGlvbiBpcyBkaXNhYmxlZC5cbiAgICB0aGlzLl9hZGRJbXBsaWNpdEhlbHBDb21tYW5kID0gdW5kZWZpbmVkOyAvLyB1bmRlY2lkZWQgd2hldGhlciB0cnVlIG9yIGZhbHNlIHlldCwgbm90IGluaGVyaXRlZFxuICAgIC8qKiBAdHlwZSB7Q29tbWFuZH0gKi9cbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IHVuZGVmaW5lZDsgLy8gbGF6eSBpbml0aWFsaXNlZCwgaW5oZXJpdGVkXG4gICAgdGhpcy5faGVscENvbmZpZ3VyYXRpb24gPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHNldHRpbmdzIHRoYXQgYXJlIHVzZWZ1bCB0byBoYXZlIGluIGNvbW1vbiBhY3Jvc3Mgcm9vdCBjb21tYW5kIGFuZCBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogKFVzZWQgaW50ZXJuYWxseSB3aGVuIGFkZGluZyBhIGNvbW1hbmQgdXNpbmcgYC5jb21tYW5kKClgIHNvIHN1YmNvbW1hbmRzIGluaGVyaXQgcGFyZW50IHNldHRpbmdzLilcbiAgICpcbiAgICogQHBhcmFtIHtDb21tYW5kfSBzb3VyY2VDb21tYW5kXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgY29weUluaGVyaXRlZFNldHRpbmdzKHNvdXJjZUNvbW1hbmQpIHtcbiAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uID0gc291cmNlQ29tbWFuZC5fb3V0cHV0Q29uZmlndXJhdGlvbjtcbiAgICB0aGlzLl9oZWxwT3B0aW9uID0gc291cmNlQ29tbWFuZC5faGVscE9wdGlvbjtcbiAgICB0aGlzLl9oZWxwQ29tbWFuZCA9IHNvdXJjZUNvbW1hbmQuX2hlbHBDb21tYW5kO1xuICAgIHRoaXMuX2hlbHBDb25maWd1cmF0aW9uID0gc291cmNlQ29tbWFuZC5faGVscENvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5fZXhpdENhbGxiYWNrID0gc291cmNlQ29tbWFuZC5fZXhpdENhbGxiYWNrO1xuICAgIHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcyA9IHNvdXJjZUNvbW1hbmQuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcztcbiAgICB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUgPVxuICAgICAgc291cmNlQ29tbWFuZC5fY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlO1xuICAgIHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzID0gc291cmNlQ29tbWFuZC5fYWxsb3dFeGNlc3NBcmd1bWVudHM7XG4gICAgdGhpcy5fZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMgPSBzb3VyY2VDb21tYW5kLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucztcbiAgICB0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IgPSBzb3VyY2VDb21tYW5kLl9zaG93SGVscEFmdGVyRXJyb3I7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gc291cmNlQ29tbWFuZC5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0NvbW1hbmRbXX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgZm9yIChsZXQgY29tbWFuZCA9IHRoaXM7IGNvbW1hbmQ7IGNvbW1hbmQgPSBjb21tYW5kLnBhcmVudCkge1xuICAgICAgcmVzdWx0LnB1c2goY29tbWFuZCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGEgY29tbWFuZC5cbiAgICpcbiAgICogVGhlcmUgYXJlIHR3byBzdHlsZXMgb2YgY29tbWFuZDogcGF5IGF0dGVudGlvbiB0byB3aGVyZSB0byBwdXQgdGhlIGRlc2NyaXB0aW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBDb21tYW5kIGltcGxlbWVudGVkIHVzaW5nIGFjdGlvbiBoYW5kbGVyIChkZXNjcmlwdGlvbiBpcyBzdXBwbGllZCBzZXBhcmF0ZWx5IHRvIGAuY29tbWFuZGApXG4gICAqIHByb2dyYW1cbiAgICogICAuY29tbWFuZCgnY2xvbmUgPHNvdXJjZT4gW2Rlc3RpbmF0aW9uXScpXG4gICAqICAgLmRlc2NyaXB0aW9uKCdjbG9uZSBhIHJlcG9zaXRvcnkgaW50byBhIG5ld2x5IGNyZWF0ZWQgZGlyZWN0b3J5JylcbiAgICogICAuYWN0aW9uKChzb3VyY2UsIGRlc3RpbmF0aW9uKSA9PiB7XG4gICAqICAgICBjb25zb2xlLmxvZygnY2xvbmUgY29tbWFuZCBjYWxsZWQnKTtcbiAgICogICB9KTtcbiAgICpcbiAgICogLy8gQ29tbWFuZCBpbXBsZW1lbnRlZCB1c2luZyBzZXBhcmF0ZSBleGVjdXRhYmxlIGZpbGUgKGRlc2NyaXB0aW9uIGlzIHNlY29uZCBwYXJhbWV0ZXIgdG8gYC5jb21tYW5kYClcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdzdGFydCA8c2VydmljZT4nLCAnc3RhcnQgbmFtZWQgc2VydmljZScpXG4gICAqICAgLmNvbW1hbmQoJ3N0b3AgW3NlcnZpY2VdJywgJ3N0b3AgbmFtZWQgc2VydmljZSwgb3IgYWxsIGlmIG5vIG5hbWUgc3VwcGxpZWQnKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVBbmRBcmdzIC0gY29tbWFuZCBuYW1lIGFuZCBhcmd1bWVudHMsIGFyZ3MgYXJlIGA8cmVxdWlyZWQ+YCBvciBgW29wdGlvbmFsXWAgYW5kIGxhc3QgbWF5IGFsc28gYmUgYHZhcmlhZGljLi4uYFxuICAgKiBAcGFyYW0geyhvYmplY3QgfCBzdHJpbmcpfSBbYWN0aW9uT3B0c09yRXhlY0Rlc2NdIC0gY29uZmlndXJhdGlvbiBvcHRpb25zIChmb3IgYWN0aW9uKSwgb3IgZGVzY3JpcHRpb24gKGZvciBleGVjdXRhYmxlKVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2V4ZWNPcHRzXSAtIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAoZm9yIGV4ZWN1dGFibGUpXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IHJldHVybnMgbmV3IGNvbW1hbmQgZm9yIGFjdGlvbiBoYW5kbGVyLCBvciBgdGhpc2AgZm9yIGV4ZWN1dGFibGUgY29tbWFuZFxuICAgKi9cblxuICBjb21tYW5kKG5hbWVBbmRBcmdzLCBhY3Rpb25PcHRzT3JFeGVjRGVzYywgZXhlY09wdHMpIHtcbiAgICBsZXQgZGVzYyA9IGFjdGlvbk9wdHNPckV4ZWNEZXNjO1xuICAgIGxldCBvcHRzID0gZXhlY09wdHM7XG4gICAgaWYgKHR5cGVvZiBkZXNjID09PSAnb2JqZWN0JyAmJiBkZXNjICE9PSBudWxsKSB7XG4gICAgICBvcHRzID0gZGVzYztcbiAgICAgIGRlc2MgPSBudWxsO1xuICAgIH1cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBjb25zdCBbLCBuYW1lLCBhcmdzXSA9IG5hbWVBbmRBcmdzLm1hdGNoKC8oW14gXSspICooLiopLyk7XG5cbiAgICBjb25zdCBjbWQgPSB0aGlzLmNyZWF0ZUNvbW1hbmQobmFtZSk7XG4gICAgaWYgKGRlc2MpIHtcbiAgICAgIGNtZC5kZXNjcmlwdGlvbihkZXNjKTtcbiAgICAgIGNtZC5fZXhlY3V0YWJsZUhhbmRsZXIgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAob3B0cy5pc0RlZmF1bHQpIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSA9IGNtZC5fbmFtZTtcbiAgICBjbWQuX2hpZGRlbiA9ICEhKG9wdHMubm9IZWxwIHx8IG9wdHMuaGlkZGVuKTsgLy8gbm9IZWxwIGlzIGRlcHJlY2F0ZWQgb2xkIG5hbWUgZm9yIGhpZGRlblxuICAgIGNtZC5fZXhlY3V0YWJsZUZpbGUgPSBvcHRzLmV4ZWN1dGFibGVGaWxlIHx8IG51bGw7IC8vIEN1c3RvbSBuYW1lIGZvciBleGVjdXRhYmxlIGZpbGUsIHNldCBtaXNzaW5nIHRvIG51bGwgdG8gbWF0Y2ggY29uc3RydWN0b3JcbiAgICBpZiAoYXJncykgY21kLmFyZ3VtZW50cyhhcmdzKTtcbiAgICB0aGlzLl9yZWdpc3RlckNvbW1hbmQoY21kKTtcbiAgICBjbWQucGFyZW50ID0gdGhpcztcbiAgICBjbWQuY29weUluaGVyaXRlZFNldHRpbmdzKHRoaXMpO1xuXG4gICAgaWYgKGRlc2MpIHJldHVybiB0aGlzO1xuICAgIHJldHVybiBjbWQ7XG4gIH1cblxuICAvKipcbiAgICogRmFjdG9yeSByb3V0aW5lIHRvIGNyZWF0ZSBhIG5ldyB1bmF0dGFjaGVkIGNvbW1hbmQuXG4gICAqXG4gICAqIFNlZSAuY29tbWFuZCgpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBzdWJjb21tYW5kLCB3aGljaCB1c2VzIHRoaXMgcm91dGluZSB0b1xuICAgKiBjcmVhdGUgdGhlIGNvbW1hbmQuIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlQ29tbWFuZCB0byBjdXN0b21pc2Ugc3ViY29tbWFuZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gbmV3IGNvbW1hbmRcbiAgICovXG5cbiAgY3JlYXRlQ29tbWFuZChuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBDb21tYW5kKG5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFlvdSBjYW4gY3VzdG9taXNlIHRoZSBoZWxwIHdpdGggYSBzdWJjbGFzcyBvZiBIZWxwIGJ5IG92ZXJyaWRpbmcgY3JlYXRlSGVscCxcbiAgICogb3IgYnkgb3ZlcnJpZGluZyBIZWxwIHByb3BlcnRpZXMgdXNpbmcgY29uZmlndXJlSGVscCgpLlxuICAgKlxuICAgKiBAcmV0dXJuIHtIZWxwfVxuICAgKi9cblxuICBjcmVhdGVIZWxwKCkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBIZWxwKCksIHRoaXMuY29uZmlndXJlSGVscCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBZb3UgY2FuIGN1c3RvbWlzZSB0aGUgaGVscCBieSBvdmVycmlkaW5nIEhlbHAgcHJvcGVydGllcyB1c2luZyBjb25maWd1cmVIZWxwKCksXG4gICAqIG9yIHdpdGggYSBzdWJjbGFzcyBvZiBIZWxwIGJ5IG92ZXJyaWRpbmcgY3JlYXRlSGVscCgpLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbmZpZ3VyYXRpb25dIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4geyhDb21tYW5kIHwgb2JqZWN0KX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciBzdG9yZWQgY29uZmlndXJhdGlvblxuICAgKi9cblxuICBjb25maWd1cmVIZWxwKGNvbmZpZ3VyYXRpb24pIHtcbiAgICBpZiAoY29uZmlndXJhdGlvbiA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5faGVscENvbmZpZ3VyYXRpb247XG5cbiAgICB0aGlzLl9oZWxwQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCBzdGRlcnIuIFlvdSBjYW4gY3VzdG9taXNlIHRoaXMgZm9yIHNwZWNpYWxcbiAgICogYXBwbGljYXRpb25zLiBZb3UgY2FuIGFsc28gY3VzdG9taXNlIHRoZSBkaXNwbGF5IG9mIGVycm9ycyBieSBvdmVycmlkaW5nIG91dHB1dEVycm9yLlxuICAgKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGFyZSBhbGwgZnVuY3Rpb25zOlxuICAgKlxuICAgKiAgICAgLy8gZnVuY3Rpb25zIHRvIGNoYW5nZSB3aGVyZSBiZWluZyB3cml0dGVuLCBzdGRvdXQgYW5kIHN0ZGVyclxuICAgKiAgICAgd3JpdGVPdXQoc3RyKVxuICAgKiAgICAgd3JpdGVFcnIoc3RyKVxuICAgKiAgICAgLy8gbWF0Y2hpbmcgZnVuY3Rpb25zIHRvIHNwZWNpZnkgd2lkdGggZm9yIHdyYXBwaW5nIGhlbHBcbiAgICogICAgIGdldE91dEhlbHBXaWR0aCgpXG4gICAqICAgICBnZXRFcnJIZWxwV2lkdGgoKVxuICAgKiAgICAgLy8gZnVuY3Rpb25zIGJhc2VkIG9uIHdoYXQgaXMgYmVpbmcgd3JpdHRlbiBvdXRcbiAgICogICAgIG91dHB1dEVycm9yKHN0ciwgd3JpdGUpIC8vIHVzZWQgZm9yIGRpc3BsYXlpbmcgZXJyb3JzLCBhbmQgbm90IHVzZWQgZm9yIGRpc3BsYXlpbmcgaGVscFxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gW2NvbmZpZ3VyYXRpb25dIC0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gICAqIEByZXR1cm4geyhDb21tYW5kIHwgb2JqZWN0KX0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nLCBvciBzdG9yZWQgY29uZmlndXJhdGlvblxuICAgKi9cblxuICBjb25maWd1cmVPdXRwdXQoY29uZmlndXJhdGlvbikge1xuICAgIGlmIChjb25maWd1cmF0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uO1xuXG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9uKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHRoZSBoZWxwIG9yIGEgY3VzdG9tIG1lc3NhZ2UgYWZ0ZXIgYW4gZXJyb3Igb2NjdXJzLlxuICAgKlxuICAgKiBAcGFyYW0geyhib29sZWFufHN0cmluZyl9IFtkaXNwbGF5SGVscF1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBzaG93SGVscEFmdGVyRXJyb3IoZGlzcGxheUhlbHAgPSB0cnVlKSB7XG4gICAgaWYgKHR5cGVvZiBkaXNwbGF5SGVscCAhPT0gJ3N0cmluZycpIGRpc3BsYXlIZWxwID0gISFkaXNwbGF5SGVscDtcbiAgICB0aGlzLl9zaG93SGVscEFmdGVyRXJyb3IgPSBkaXNwbGF5SGVscDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IHN1Z2dlc3Rpb24gb2Ygc2ltaWxhciBjb21tYW5kcyBmb3IgdW5rbm93biBjb21tYW5kcywgb3Igb3B0aW9ucyBmb3IgdW5rbm93biBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtkaXNwbGF5U3VnZ2VzdGlvbl1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBzaG93U3VnZ2VzdGlvbkFmdGVyRXJyb3IoZGlzcGxheVN1Z2dlc3Rpb24gPSB0cnVlKSB7XG4gICAgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yID0gISFkaXNwbGF5U3VnZ2VzdGlvbjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBwcmVwYXJlZCBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBTZWUgLmNvbW1hbmQoKSBmb3IgY3JlYXRpbmcgYW4gYXR0YWNoZWQgc3ViY29tbWFuZCB3aGljaCBpbmhlcml0cyBzZXR0aW5ncyBmcm9tIGl0cyBwYXJlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY21kIC0gbmV3IHN1YmNvbW1hbmRcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXSAtIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgYWRkQ29tbWFuZChjbWQsIG9wdHMpIHtcbiAgICBpZiAoIWNtZC5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21tYW5kIHBhc3NlZCB0byAuYWRkQ29tbWFuZCgpIG11c3QgaGF2ZSBhIG5hbWVcbi0gc3BlY2lmeSB0aGUgbmFtZSBpbiBDb21tYW5kIGNvbnN0cnVjdG9yIG9yIHVzaW5nIC5uYW1lKClgKTtcbiAgICB9XG5cbiAgICBvcHRzID0gb3B0cyB8fCB7fTtcbiAgICBpZiAob3B0cy5pc0RlZmF1bHQpIHRoaXMuX2RlZmF1bHRDb21tYW5kTmFtZSA9IGNtZC5fbmFtZTtcbiAgICBpZiAob3B0cy5ub0hlbHAgfHwgb3B0cy5oaWRkZW4pIGNtZC5faGlkZGVuID0gdHJ1ZTsgLy8gbW9kaWZ5aW5nIHBhc3NlZCBjb21tYW5kIGR1ZSB0byBleGlzdGluZyBpbXBsZW1lbnRhdGlvblxuXG4gICAgdGhpcy5fcmVnaXN0ZXJDb21tYW5kKGNtZCk7XG4gICAgY21kLnBhcmVudCA9IHRoaXM7XG4gICAgY21kLl9jaGVja0ZvckJyb2tlblBhc3NUaHJvdWdoKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgYXJndW1lbnQuXG4gICAqXG4gICAqIFNlZSAuYXJndW1lbnQoKSBmb3IgY3JlYXRpbmcgYW4gYXR0YWNoZWQgYXJndW1lbnQsIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgYXJndW1lbnQuIFlvdSBjYW4gb3ZlcnJpZGUgY3JlYXRlQXJndW1lbnQgdG8gcmV0dXJuIGEgY3VzdG9tIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHtBcmd1bWVudH0gbmV3IGFyZ3VtZW50XG4gICAqL1xuXG4gIGNyZWF0ZUFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBBcmd1bWVudChuYW1lLCBkZXNjcmlwdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogRGVmaW5lIGFyZ3VtZW50IHN5bnRheCBmb3IgY29tbWFuZC5cbiAgICpcbiAgICogVGhlIGRlZmF1bHQgaXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCB5b3UgY2FuIGV4cGxpY2l0bHlcbiAgICogaW5kaWNhdGUgdGhpcyB3aXRoIDw+IGFyb3VuZCB0aGUgbmFtZS4gUHV0IFtdIGFyb3VuZCB0aGUgbmFtZSBmb3IgYW4gb3B0aW9uYWwgYXJndW1lbnQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uYXJndW1lbnQoJzxpbnB1dC1maWxlPicpO1xuICAgKiBwcm9ncmFtLmFyZ3VtZW50KCdbb3V0cHV0LWZpbGVdJyk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dXG4gICAqIEBwYXJhbSB7KEZ1bmN0aW9ufCopfSBbZm5dIC0gY3VzdG9tIGFyZ3VtZW50IHByb2Nlc3NpbmcgZnVuY3Rpb25cbiAgICogQHBhcmFtIHsqfSBbZGVmYXVsdFZhbHVlXVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uLCBmbiwgZGVmYXVsdFZhbHVlKSB7XG4gICAgY29uc3QgYXJndW1lbnQgPSB0aGlzLmNyZWF0ZUFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBhcmd1bWVudC5kZWZhdWx0KGRlZmF1bHRWYWx1ZSkuYXJnUGFyc2VyKGZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXJndW1lbnQuZGVmYXVsdChmbik7XG4gICAgfVxuICAgIHRoaXMuYWRkQXJndW1lbnQoYXJndW1lbnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBhcmd1bWVudCBzeW50YXggZm9yIGNvbW1hbmQsIGFkZGluZyBtdWx0aXBsZSBhdCBvbmNlICh3aXRob3V0IGRlc2NyaXB0aW9ucykuXG4gICAqXG4gICAqIFNlZSBhbHNvIC5hcmd1bWVudCgpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLmFyZ3VtZW50cygnPGNtZD4gW2Vudl0nKTtcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBhcmd1bWVudHMobmFtZXMpIHtcbiAgICBuYW1lc1xuICAgICAgLnRyaW0oKVxuICAgICAgLnNwbGl0KC8gKy8pXG4gICAgICAuZm9yRWFjaCgoZGV0YWlsKSA9PiB7XG4gICAgICAgIHRoaXMuYXJndW1lbnQoZGV0YWlsKTtcbiAgICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmluZSBhcmd1bWVudCBzeW50YXggZm9yIGNvbW1hbmQsIGFkZGluZyBhIHByZXBhcmVkIGFyZ3VtZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge0FyZ3VtZW50fSBhcmd1bWVudFxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEFyZ3VtZW50KGFyZ3VtZW50KSB7XG4gICAgY29uc3QgcHJldmlvdXNBcmd1bWVudCA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5zbGljZSgtMSlbMF07XG4gICAgaWYgKHByZXZpb3VzQXJndW1lbnQgJiYgcHJldmlvdXNBcmd1bWVudC52YXJpYWRpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb25seSB0aGUgbGFzdCBhcmd1bWVudCBjYW4gYmUgdmFyaWFkaWMgJyR7cHJldmlvdXNBcmd1bWVudC5uYW1lKCl9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBhcmd1bWVudC5yZXF1aXJlZCAmJlxuICAgICAgYXJndW1lbnQuZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGFyZ3VtZW50LnBhcnNlQXJnID09PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSByZXF1aXJlZCBhcmd1bWVudCBpcyBuZXZlciB1c2VkOiAnJHthcmd1bWVudC5uYW1lKCl9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMucHVzaChhcmd1bWVudCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ3VzdG9taXNlIG9yIG92ZXJyaWRlIGRlZmF1bHQgaGVscCBjb21tYW5kLiBCeSBkZWZhdWx0IGEgaGVscCBjb21tYW5kIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgaWYgeW91ciBjb21tYW5kIGhhcyBzdWJjb21tYW5kcy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogICAgcHJvZ3JhbS5oZWxwQ29tbWFuZCgnaGVscCBbY21kXScpO1xuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKCdoZWxwIFtjbWRdJywgJ3Nob3cgaGVscCcpO1xuICAgKiAgICBwcm9ncmFtLmhlbHBDb21tYW5kKGZhbHNlKTsgLy8gc3VwcHJlc3MgZGVmYXVsdCBoZWxwIGNvbW1hbmRcbiAgICogICAgcHJvZ3JhbS5oZWxwQ29tbWFuZCh0cnVlKTsgLy8gYWRkIGhlbHAgY29tbWFuZCBldmVuIGlmIG5vIHN1YmNvbW1hbmRzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfGJvb2xlYW59IGVuYWJsZU9yTmFtZUFuZEFyZ3MgLSBlbmFibGUgd2l0aCBjdXN0b20gbmFtZSBhbmQvb3IgYXJndW1lbnRzLCBvciBib29sZWFuIHRvIG92ZXJyaWRlIHdoZXRoZXIgYWRkZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl0gLSBjdXN0b20gZGVzY3JpcHRpb25cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGhlbHBDb21tYW5kKGVuYWJsZU9yTmFtZUFuZEFyZ3MsIGRlc2NyaXB0aW9uKSB7XG4gICAgaWYgKHR5cGVvZiBlbmFibGVPck5hbWVBbmRBcmdzID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSBlbmFibGVPck5hbWVBbmRBcmdzO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZW5hYmxlT3JOYW1lQW5kQXJncyA9IGVuYWJsZU9yTmFtZUFuZEFyZ3MgPz8gJ2hlbHAgW2NvbW1hbmRdJztcbiAgICBjb25zdCBbLCBoZWxwTmFtZSwgaGVscEFyZ3NdID0gZW5hYmxlT3JOYW1lQW5kQXJncy5tYXRjaCgvKFteIF0rKSAqKC4qKS8pO1xuICAgIGNvbnN0IGhlbHBEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID8/ICdkaXNwbGF5IGhlbHAgZm9yIGNvbW1hbmQnO1xuXG4gICAgY29uc3QgaGVscENvbW1hbmQgPSB0aGlzLmNyZWF0ZUNvbW1hbmQoaGVscE5hbWUpO1xuICAgIGhlbHBDb21tYW5kLmhlbHBPcHRpb24oZmFsc2UpO1xuICAgIGlmIChoZWxwQXJncykgaGVscENvbW1hbmQuYXJndW1lbnRzKGhlbHBBcmdzKTtcbiAgICBpZiAoaGVscERlc2NyaXB0aW9uKSBoZWxwQ29tbWFuZC5kZXNjcmlwdGlvbihoZWxwRGVzY3JpcHRpb24pO1xuXG4gICAgdGhpcy5fYWRkSW1wbGljaXRIZWxwQ29tbWFuZCA9IHRydWU7XG4gICAgdGhpcy5faGVscENvbW1hbmQgPSBoZWxwQ29tbWFuZDtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBwcmVwYXJlZCBjdXN0b20gaGVscCBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0geyhDb21tYW5kfHN0cmluZ3xib29sZWFuKX0gaGVscENvbW1hbmQgLSBjdXN0b20gaGVscCBjb21tYW5kLCBvciBkZXByZWNhdGVkIGVuYWJsZU9yTmFtZUFuZEFyZ3MgYXMgZm9yIGAuaGVscENvbW1hbmQoKWBcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXByZWNhdGVkRGVzY3JpcHRpb25dIC0gZGVwcmVjYXRlZCBjdXN0b20gZGVzY3JpcHRpb24gdXNlZCB3aXRoIGN1c3RvbSBuYW1lIG9ubHlcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRIZWxwQ29tbWFuZChoZWxwQ29tbWFuZCwgZGVwcmVjYXRlZERlc2NyaXB0aW9uKSB7XG4gICAgLy8gSWYgbm90IHBhc3NlZCBhbiBvYmplY3QsIGNhbGwgdGhyb3VnaCB0byBoZWxwQ29tbWFuZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksXG4gICAgLy8gYXMgYWRkSGVscENvbW1hbmQgd2FzIG9yaWdpbmFsbHkgdXNlZCBsaWtlIGhlbHBDb21tYW5kIGlzIG5vdy5cbiAgICBpZiAodHlwZW9mIGhlbHBDb21tYW5kICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5oZWxwQ29tbWFuZChoZWxwQ29tbWFuZCwgZGVwcmVjYXRlZERlc2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPSB0cnVlO1xuICAgIHRoaXMuX2hlbHBDb21tYW5kID0gaGVscENvbW1hbmQ7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogTGF6eSBjcmVhdGUgaGVscCBjb21tYW5kLlxuICAgKlxuICAgKiBAcmV0dXJuIHsoQ29tbWFuZHxudWxsKX1cbiAgICogQHBhY2thZ2VcbiAgICovXG4gIF9nZXRIZWxwQ29tbWFuZCgpIHtcbiAgICBjb25zdCBoYXNJbXBsaWNpdEhlbHBDb21tYW5kID1cbiAgICAgIHRoaXMuX2FkZEltcGxpY2l0SGVscENvbW1hbmQgPz9cbiAgICAgICh0aGlzLmNvbW1hbmRzLmxlbmd0aCAmJlxuICAgICAgICAhdGhpcy5fYWN0aW9uSGFuZGxlciAmJlxuICAgICAgICAhdGhpcy5fZmluZENvbW1hbmQoJ2hlbHAnKSk7XG5cbiAgICBpZiAoaGFzSW1wbGljaXRIZWxwQ29tbWFuZCkge1xuICAgICAgaWYgKHRoaXMuX2hlbHBDb21tYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5oZWxwQ29tbWFuZCh1bmRlZmluZWQsIHVuZGVmaW5lZCk7IC8vIHVzZSBkZWZhdWx0IG5hbWUgYW5kIGRlc2NyaXB0aW9uXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5faGVscENvbW1hbmQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBob29rIGZvciBsaWZlIGN5Y2xlIGV2ZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXJcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGhvb2soZXZlbnQsIGxpc3RlbmVyKSB7XG4gICAgY29uc3QgYWxsb3dlZFZhbHVlcyA9IFsncHJlU3ViY29tbWFuZCcsICdwcmVBY3Rpb24nLCAncG9zdEFjdGlvbiddO1xuICAgIGlmICghYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyhldmVudCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSBmb3IgZXZlbnQgcGFzc2VkIHRvIGhvb2sgOiAnJHtldmVudH0nLlxuRXhwZWN0aW5nIG9uZSBvZiAnJHthbGxvd2VkVmFsdWVzLmpvaW4oXCInLCAnXCIpfSdgKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSkge1xuICAgICAgdGhpcy5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdLnB1c2gobGlzdGVuZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0gPSBbbGlzdGVuZXJdO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBjYWxsYmFjayB0byB1c2UgYXMgcmVwbGFjZW1lbnQgZm9yIGNhbGxpbmcgcHJvY2Vzcy5leGl0LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbZm5dIG9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGEgQ29tbWFuZGVyRXJyb3IsIGRlZmF1bHRzIHRvIHRocm93aW5nXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBleGl0T3ZlcnJpZGUoZm4pIHtcbiAgICBpZiAoZm4pIHtcbiAgICAgIHRoaXMuX2V4aXRDYWxsYmFjayA9IGZuO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9leGl0Q2FsbGJhY2sgPSAoZXJyKSA9PiB7XG4gICAgICAgIGlmIChlcnIuY29kZSAhPT0gJ2NvbW1hbmRlci5leGVjdXRlU3ViQ29tbWFuZEFzeW5jJykge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBc3luYyBjYWxsYmFjayBmcm9tIHNwYXduIGV2ZW50cywgbm90IHVzZWZ1bCB0byB0aHJvdy5cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBwcm9jZXNzLmV4aXQsIGFuZCBfZXhpdENhbGxiYWNrIGlmIGRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBleGl0Q29kZSBleGl0IGNvZGUgZm9yIHVzaW5nIHdpdGggcHJvY2Vzcy5leGl0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIGFuIGlkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGVycm9yXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvclxuICAgKiBAcmV0dXJuIG5ldmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9leGl0KGV4aXRDb2RlLCBjb2RlLCBtZXNzYWdlKSB7XG4gICAgaWYgKHRoaXMuX2V4aXRDYWxsYmFjaykge1xuICAgICAgdGhpcy5fZXhpdENhbGxiYWNrKG5ldyBDb21tYW5kZXJFcnJvcihleGl0Q29kZSwgY29kZSwgbWVzc2FnZSkpO1xuICAgICAgLy8gRXhwZWN0aW5nIHRoaXMgbGluZSBpcyBub3QgcmVhY2hlZC5cbiAgICB9XG4gICAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBjYWxsYmFjayBgZm5gIGZvciB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbVxuICAgKiAgIC5jb21tYW5kKCdzZXJ2ZScpXG4gICAqICAgLmRlc2NyaXB0aW9uKCdzdGFydCBzZXJ2aWNlJylcbiAgICogICAuYWN0aW9uKGZ1bmN0aW9uKCkge1xuICAgKiAgICAgIC8vIGRvIHdvcmsgaGVyZVxuICAgKiAgIH0pO1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG5cbiAgYWN0aW9uKGZuKSB7XG4gICAgY29uc3QgbGlzdGVuZXIgPSAoYXJncykgPT4ge1xuICAgICAgLy8gVGhlIC5hY3Rpb24gY2FsbGJhY2sgdGFrZXMgYW4gZXh0cmEgcGFyYW1ldGVyIHdoaWNoIGlzIHRoZSBjb21tYW5kIG9yIG9wdGlvbnMuXG4gICAgICBjb25zdCBleHBlY3RlZEFyZ3NDb3VudCA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBjb25zdCBhY3Rpb25BcmdzID0gYXJncy5zbGljZSgwLCBleHBlY3RlZEFyZ3NDb3VudCk7XG4gICAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICAgIGFjdGlvbkFyZ3NbZXhwZWN0ZWRBcmdzQ291bnRdID0gdGhpczsgLy8gYmFja3dhcmRzIGNvbXBhdGlibGUgXCJvcHRpb25zXCJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGlvbkFyZ3NbZXhwZWN0ZWRBcmdzQ291bnRdID0gdGhpcy5vcHRzKCk7XG4gICAgICB9XG4gICAgICBhY3Rpb25BcmdzLnB1c2godGhpcyk7XG5cbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhY3Rpb25BcmdzKTtcbiAgICB9O1xuICAgIHRoaXMuX2FjdGlvbkhhbmRsZXIgPSBsaXN0ZW5lcjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3J5IHJvdXRpbmUgdG8gY3JlYXRlIGEgbmV3IHVuYXR0YWNoZWQgb3B0aW9uLlxuICAgKlxuICAgKiBTZWUgLm9wdGlvbigpIGZvciBjcmVhdGluZyBhbiBhdHRhY2hlZCBvcHRpb24sIHdoaWNoIHVzZXMgdGhpcyByb3V0aW5lIHRvXG4gICAqIGNyZWF0ZSB0aGUgb3B0aW9uLiBZb3UgY2FuIG92ZXJyaWRlIGNyZWF0ZU9wdGlvbiB0byByZXR1cm4gYSBjdXN0b20gb3B0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7T3B0aW9ufSBuZXcgb3B0aW9uXG4gICAqL1xuXG4gIGNyZWF0ZU9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICByZXR1cm4gbmV3IE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXAgcGFyc2VBcmdzIHRvIGNhdGNoICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50Jy5cbiAgICpcbiAgICogQHBhcmFtIHsoT3B0aW9uIHwgQXJndW1lbnQpfSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG4gICAqIEBwYXJhbSB7Kn0gcHJldmlvdXNcbiAgICogQHBhcmFtIHtzdHJpbmd9IGludmFsaWRBcmd1bWVudE1lc3NhZ2VcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NhbGxQYXJzZUFyZyh0YXJnZXQsIHZhbHVlLCBwcmV2aW91cywgaW52YWxpZEFyZ3VtZW50TWVzc2FnZSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGFyZ2V0LnBhcnNlQXJnKHZhbHVlLCBwcmV2aW91cyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdjb21tYW5kZXIuaW52YWxpZEFyZ3VtZW50Jykge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYCR7aW52YWxpZEFyZ3VtZW50TWVzc2FnZX0gJHtlcnIubWVzc2FnZX1gO1xuICAgICAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgZXhpdENvZGU6IGVyci5leGl0Q29kZSwgY29kZTogZXJyLmNvZGUgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBvcHRpb24gZmxhZyBjb25mbGljdHMuXG4gICAqIFJlZ2lzdGVyIG9wdGlvbiBpZiBubyBjb25mbGljdHMgZm91bmQsIG9yIHRocm93IG9uIGNvbmZsaWN0LlxuICAgKlxuICAgKiBAcGFyYW0ge09wdGlvbn0gb3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9yZWdpc3Rlck9wdGlvbihvcHRpb24pIHtcbiAgICBjb25zdCBtYXRjaGluZ09wdGlvbiA9XG4gICAgICAob3B0aW9uLnNob3J0ICYmIHRoaXMuX2ZpbmRPcHRpb24ob3B0aW9uLnNob3J0KSkgfHxcbiAgICAgIChvcHRpb24ubG9uZyAmJiB0aGlzLl9maW5kT3B0aW9uKG9wdGlvbi5sb25nKSk7XG4gICAgaWYgKG1hdGNoaW5nT3B0aW9uKSB7XG4gICAgICBjb25zdCBtYXRjaGluZ0ZsYWcgPVxuICAgICAgICBvcHRpb24ubG9uZyAmJiB0aGlzLl9maW5kT3B0aW9uKG9wdGlvbi5sb25nKVxuICAgICAgICAgID8gb3B0aW9uLmxvbmdcbiAgICAgICAgICA6IG9wdGlvbi5zaG9ydDtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGFkZCBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScke3RoaXMuX25hbWUgJiYgYCB0byBjb21tYW5kICcke3RoaXMuX25hbWV9J2B9IGR1ZSB0byBjb25mbGljdGluZyBmbGFnICcke21hdGNoaW5nRmxhZ30nXG4tICBhbHJlYWR5IHVzZWQgYnkgb3B0aW9uICcke21hdGNoaW5nT3B0aW9uLmZsYWdzfSdgKTtcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnMucHVzaChvcHRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBjb21tYW5kIG5hbWUgYW5kIGFsaWFzIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIGNvbW1hbmRzLlxuICAgKiBSZWdpc3RlciBjb21tYW5kIGlmIG5vIGNvbmZsaWN0cyBmb3VuZCwgb3IgdGhyb3cgb24gY29uZmxpY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7Q29tbWFuZH0gY29tbWFuZFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfcmVnaXN0ZXJDb21tYW5kKGNvbW1hbmQpIHtcbiAgICBjb25zdCBrbm93bkJ5ID0gKGNtZCkgPT4ge1xuICAgICAgcmV0dXJuIFtjbWQubmFtZSgpXS5jb25jYXQoY21kLmFsaWFzZXMoKSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFscmVhZHlVc2VkID0ga25vd25CeShjb21tYW5kKS5maW5kKChuYW1lKSA9PlxuICAgICAgdGhpcy5fZmluZENvbW1hbmQobmFtZSksXG4gICAgKTtcbiAgICBpZiAoYWxyZWFkeVVzZWQpIHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQ21kID0ga25vd25CeSh0aGlzLl9maW5kQ29tbWFuZChhbHJlYWR5VXNlZCkpLmpvaW4oJ3wnKTtcbiAgICAgIGNvbnN0IG5ld0NtZCA9IGtub3duQnkoY29tbWFuZCkuam9pbignfCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2Fubm90IGFkZCBjb21tYW5kICcke25ld0NtZH0nIGFzIGFscmVhZHkgaGF2ZSBjb21tYW5kICcke2V4aXN0aW5nQ21kfSdgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbW1hbmRzLnB1c2goY29tbWFuZCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZE9wdGlvbihvcHRpb24pIHtcbiAgICB0aGlzLl9yZWdpc3Rlck9wdGlvbihvcHRpb24pO1xuXG4gICAgY29uc3Qgb25hbWUgPSBvcHRpb24ubmFtZSgpO1xuICAgIGNvbnN0IG5hbWUgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuXG4gICAgLy8gc3RvcmUgZGVmYXVsdCB2YWx1ZVxuICAgIGlmIChvcHRpb24ubmVnYXRlKSB7XG4gICAgICAvLyAtLW5vLWZvbyBpcyBzcGVjaWFsIGFuZCBkZWZhdWx0cyBmb28gdG8gdHJ1ZSwgdW5sZXNzIGEgLS1mb28gb3B0aW9uIGlzIGFscmVhZHkgZGVmaW5lZFxuICAgICAgY29uc3QgcG9zaXRpdmVMb25nRmxhZyA9IG9wdGlvbi5sb25nLnJlcGxhY2UoL14tLW5vLS8sICctLScpO1xuICAgICAgaWYgKCF0aGlzLl9maW5kT3B0aW9uKHBvc2l0aXZlTG9uZ0ZsYWcpKSB7XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgb3B0aW9uLmRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbi5kZWZhdWx0VmFsdWUsXG4gICAgICAgICAgJ2RlZmF1bHQnLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3B0aW9uLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnNldE9wdGlvblZhbHVlV2l0aFNvdXJjZShuYW1lLCBvcHRpb24uZGVmYXVsdFZhbHVlLCAnZGVmYXVsdCcpO1xuICAgIH1cblxuICAgIC8vIGhhbmRsZXIgZm9yIGNsaSBhbmQgZW52IHN1cHBsaWVkIHZhbHVlc1xuICAgIGNvbnN0IGhhbmRsZU9wdGlvblZhbHVlID0gKHZhbCwgaW52YWxpZFZhbHVlTWVzc2FnZSwgdmFsdWVTb3VyY2UpID0+IHtcbiAgICAgIC8vIHZhbCBpcyBudWxsIGZvciBvcHRpb25hbCBvcHRpb24gdXNlZCB3aXRob3V0IGFuIG9wdGlvbmFsLWFyZ3VtZW50LlxuICAgICAgLy8gdmFsIGlzIHVuZGVmaW5lZCBmb3IgYm9vbGVhbiBhbmQgbmVnYXRlZCBvcHRpb24uXG4gICAgICBpZiAodmFsID09IG51bGwgJiYgb3B0aW9uLnByZXNldEFyZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbCA9IG9wdGlvbi5wcmVzZXRBcmc7XG4gICAgICB9XG5cbiAgICAgIC8vIGN1c3RvbSBwcm9jZXNzaW5nXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMuZ2V0T3B0aW9uVmFsdWUobmFtZSk7XG4gICAgICBpZiAodmFsICE9PSBudWxsICYmIG9wdGlvbi5wYXJzZUFyZykge1xuICAgICAgICB2YWwgPSB0aGlzLl9jYWxsUGFyc2VBcmcob3B0aW9uLCB2YWwsIG9sZFZhbHVlLCBpbnZhbGlkVmFsdWVNZXNzYWdlKTtcbiAgICAgIH0gZWxzZSBpZiAodmFsICE9PSBudWxsICYmIG9wdGlvbi52YXJpYWRpYykge1xuICAgICAgICB2YWwgPSBvcHRpb24uX2NvbmNhdFZhbHVlKHZhbCwgb2xkVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBGaWxsLWluIGFwcHJvcHJpYXRlIG1pc3NpbmcgdmFsdWVzLiBMb25nIHdpbmRlZCBidXQgZWFzeSB0byBmb2xsb3cuXG4gICAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgICAgaWYgKG9wdGlvbi5uZWdhdGUpIHtcbiAgICAgICAgICB2YWwgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uaXNCb29sZWFuKCkgfHwgb3B0aW9uLm9wdGlvbmFsKSB7XG4gICAgICAgICAgdmFsID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YWwgPSAnJzsgLy8gbm90IG5vcm1hbCwgcGFyc2VBcmcgbWlnaHQgaGF2ZSBmYWlsZWQgb3IgYmUgYSBtb2NrIGZ1bmN0aW9uIGZvciB0ZXN0aW5nXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKG5hbWUsIHZhbCwgdmFsdWVTb3VyY2UpO1xuICAgIH07XG5cbiAgICB0aGlzLm9uKCdvcHRpb246JyArIG9uYW1lLCAodmFsKSA9PiB7XG4gICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgYXJndW1lbnQgJyR7dmFsfScgaXMgaW52YWxpZC5gO1xuICAgICAgaGFuZGxlT3B0aW9uVmFsdWUodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCAnY2xpJyk7XG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9uLmVudlZhcikge1xuICAgICAgdGhpcy5vbignb3B0aW9uRW52OicgKyBvbmFtZSwgKHZhbCkgPT4ge1xuICAgICAgICBjb25zdCBpbnZhbGlkVmFsdWVNZXNzYWdlID0gYGVycm9yOiBvcHRpb24gJyR7b3B0aW9uLmZsYWdzfScgdmFsdWUgJyR7dmFsfScgZnJvbSBlbnYgJyR7b3B0aW9uLmVudlZhcn0nIGlzIGludmFsaWQuYDtcbiAgICAgICAgaGFuZGxlT3B0aW9uVmFsdWUodmFsLCBpbnZhbGlkVmFsdWVNZXNzYWdlLCAnZW52Jyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYnkgLm9wdGlvbigpIGFuZCAucmVxdWlyZWRPcHRpb24oKVxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vcHRpb25FeChjb25maWcsIGZsYWdzLCBkZXNjcmlwdGlvbiwgZm4sIGRlZmF1bHRWYWx1ZSkge1xuICAgIGlmICh0eXBlb2YgZmxhZ3MgPT09ICdvYmplY3QnICYmIGZsYWdzIGluc3RhbmNlb2YgT3B0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdUbyBhZGQgYW4gT3B0aW9uIG9iamVjdCB1c2UgYWRkT3B0aW9uKCkgaW5zdGVhZCBvZiBvcHRpb24oKSBvciByZXF1aXJlZE9wdGlvbigpJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gICAgb3B0aW9uLm1ha2VPcHRpb25NYW5kYXRvcnkoISFjb25maWcubWFuZGF0b3J5KTtcbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvcHRpb24uZGVmYXVsdChkZWZhdWx0VmFsdWUpLmFyZ1BhcnNlcihmbik7XG4gICAgfSBlbHNlIGlmIChmbiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgICAgLy8gZGVwcmVjYXRlZFxuICAgICAgY29uc3QgcmVnZXggPSBmbjtcbiAgICAgIGZuID0gKHZhbCwgZGVmKSA9PiB7XG4gICAgICAgIGNvbnN0IG0gPSByZWdleC5leGVjKHZhbCk7XG4gICAgICAgIHJldHVybiBtID8gbVswXSA6IGRlZjtcbiAgICAgIH07XG4gICAgICBvcHRpb24uZGVmYXVsdChkZWZhdWx0VmFsdWUpLmFyZ1BhcnNlcihmbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbi5kZWZhdWx0KGZuKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hZGRPcHRpb24ob3B0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZpbmUgb3B0aW9uIHdpdGggYGZsYWdzYCwgYGRlc2NyaXB0aW9uYCwgYW5kIG9wdGlvbmFsIGFyZ3VtZW50IHBhcnNpbmcgZnVuY3Rpb24gb3IgYGRlZmF1bHRWYWx1ZWAgb3IgYm90aC5cbiAgICpcbiAgICogVGhlIGBmbGFnc2Agc3RyaW5nIGNvbnRhaW5zIHRoZSBzaG9ydCBhbmQvb3IgbG9uZyBmbGFncywgc2VwYXJhdGVkIGJ5IGNvbW1hLCBhIHBpcGUgb3Igc3BhY2UuIEEgcmVxdWlyZWRcbiAgICogb3B0aW9uLWFyZ3VtZW50IGlzIGluZGljYXRlZCBieSBgPD5gIGFuZCBhbiBvcHRpb25hbCBvcHRpb24tYXJndW1lbnQgYnkgYFtdYC5cbiAgICpcbiAgICogU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscywgYW5kIHNlZSBhbHNvIGFkZE9wdGlvbigpIGFuZCByZXF1aXJlZE9wdGlvbigpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtXG4gICAqICAgICAub3B0aW9uKCctcCwgLS1wZXBwZXInLCAnYWRkIHBlcHBlcicpXG4gICAqICAgICAub3B0aW9uKCctcCwgLS1waXp6YS10eXBlIDxUWVBFPicsICd0eXBlIG9mIHBpenphJykgLy8gcmVxdWlyZWQgb3B0aW9uLWFyZ3VtZW50XG4gICAqICAgICAub3B0aW9uKCctYywgLS1jaGVlc2UgW0NIRUVTRV0nLCAnYWRkIGV4dHJhIGNoZWVzZScsICdtb3p6YXJlbGxhJykgLy8gb3B0aW9uYWwgb3B0aW9uLWFyZ3VtZW50IHdpdGggZGVmYXVsdFxuICAgKiAgICAgLm9wdGlvbignLXQsIC0tdGlwIDxWQUxVRT4nLCAnYWRkIHRpcCB0byBwdXJjaGFzZSBjb3N0JywgcGFyc2VGbG9hdCkgLy8gY3VzdG9tIHBhcnNlIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnwqKX0gW3BhcnNlQXJnXSAtIGN1c3RvbSBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBvciBkZWZhdWx0IHZhbHVlXG4gICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIG9wdGlvbihmbGFncywgZGVzY3JpcHRpb24sIHBhcnNlQXJnLCBkZWZhdWx0VmFsdWUpIHtcbiAgICByZXR1cm4gdGhpcy5fb3B0aW9uRXgoe30sIGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgcmVxdWlyZWQgb3B0aW9uIHdoaWNoIG11c3QgaGF2ZSBhIHZhbHVlIGFmdGVyIHBhcnNpbmcuIFRoaXMgdXN1YWxseSBtZWFuc1xuICAgKiB0aGUgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIChPdGhlcndpc2UgdGhlIHNhbWUgYXMgLm9wdGlvbigpLilcbiAgICpcbiAgICogVGhlIGBmbGFnc2Agc3RyaW5nIGNvbnRhaW5zIHRoZSBzaG9ydCBhbmQvb3IgbG9uZyBmbGFncywgc2VwYXJhdGVkIGJ5IGNvbW1hLCBhIHBpcGUgb3Igc3BhY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGFnc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcGFyYW0geyhGdW5jdGlvbnwqKX0gW3BhcnNlQXJnXSAtIGN1c3RvbSBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBvciBkZWZhdWx0IHZhbHVlXG4gICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHJlcXVpcmVkT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbiwgcGFyc2VBcmcsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25FeChcbiAgICAgIHsgbWFuZGF0b3J5OiB0cnVlIH0sXG4gICAgICBmbGFncyxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgcGFyc2VBcmcsXG4gICAgICBkZWZhdWx0VmFsdWUsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbHRlciBwYXJzaW5nIG9mIHNob3J0IGZsYWdzIHdpdGggb3B0aW9uYWwgdmFsdWVzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBmb3IgYC5vcHRpb24oJy1mLC0tZmxhZyBbdmFsdWVdJyk6XG4gICAqIHByb2dyYW0uY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlKHRydWUpOyAgLy8gYC1mODBgIGlzIHRyZWF0ZWQgbGlrZSBgLS1mbGFnPTgwYCwgdGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvdXJcbiAgICogcHJvZ3JhbS5jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUoZmFsc2UpIC8vIGAtZmJgIGlzIHRyZWF0ZWQgbGlrZSBgLWYgLWJgXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2NvbWJpbmVdIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIGFuIG9wdGlvbmFsIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGZsYWcuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlKGNvbWJpbmUgPSB0cnVlKSB7XG4gICAgdGhpcy5fY29tYmluZUZsYWdBbmRPcHRpb25hbFZhbHVlID0gISFjb21iaW5lO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHVua25vd24gb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthbGxvd1Vua25vd25dIC0gaWYgYHRydWVgIG9yIG9taXR0ZWQsIG5vIGVycm9yIHdpbGwgYmUgdGhyb3duIGZvciB1bmtub3duIG9wdGlvbnMuXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgYWxsb3dVbmtub3duT3B0aW9uKGFsbG93VW5rbm93biA9IHRydWUpIHtcbiAgICB0aGlzLl9hbGxvd1Vua25vd25PcHRpb24gPSAhIWFsbG93VW5rbm93bjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBleGNlc3MgY29tbWFuZC1hcmd1bWVudHMgb24gdGhlIGNvbW1hbmQgbGluZS4gUGFzcyBmYWxzZSB0byBtYWtlIGV4Y2VzcyBhcmd1bWVudHMgYW4gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FsbG93RXhjZXNzXSAtIGlmIGB0cnVlYCBvciBvbWl0dGVkLCBubyBlcnJvciB3aWxsIGJlIHRocm93biBmb3IgZXhjZXNzIGFyZ3VtZW50cy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhbGxvd0V4Y2Vzc0FyZ3VtZW50cyhhbGxvd0V4Y2VzcyA9IHRydWUpIHtcbiAgICB0aGlzLl9hbGxvd0V4Y2Vzc0FyZ3VtZW50cyA9ICEhYWxsb3dFeGNlc3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHBvc2l0aW9uYWwgb3B0aW9ucy4gUG9zaXRpb25hbCBtZWFucyBnbG9iYWwgb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGJlZm9yZSBzdWJjb21tYW5kcyB3aGljaCBsZXRzXG4gICAqIHN1YmNvbW1hbmRzIHJldXNlIHRoZSBzYW1lIG9wdGlvbiBuYW1lcywgYW5kIGFsc28gZW5hYmxlcyBzdWJjb21tYW5kcyB0byB0dXJuIG9uIHBhc3NUaHJvdWdoT3B0aW9ucy5cbiAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5vbi1wb3NpdGlvbmFsIGFuZCBnbG9iYWwgb3B0aW9ucyBtYXkgYXBwZWFyIGFueXdoZXJlIG9uIHRoZSBjb21tYW5kIGxpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Bvc2l0aW9uYWxdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlUG9zaXRpb25hbE9wdGlvbnMocG9zaXRpb25hbCA9IHRydWUpIHtcbiAgICB0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyA9ICEhcG9zaXRpb25hbDtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXNzIHRocm91Z2ggb3B0aW9ucyB0aGF0IGNvbWUgYWZ0ZXIgY29tbWFuZC1hcmd1bWVudHMgcmF0aGVyIHRoYW4gdHJlYXQgdGhlbSBhcyBjb21tYW5kLW9wdGlvbnMsXG4gICAqIHNvIGFjdHVhbCBjb21tYW5kLW9wdGlvbnMgY29tZSBiZWZvcmUgY29tbWFuZC1hcmd1bWVudHMuIFR1cm5pbmcgdGhpcyBvbiBmb3IgYSBzdWJjb21tYW5kIHJlcXVpcmVzXG4gICAqIHBvc2l0aW9uYWwgb3B0aW9ucyB0byBoYXZlIGJlZW4gZW5hYmxlZCBvbiB0aGUgcHJvZ3JhbSAocGFyZW50IGNvbW1hbmRzKS5cbiAgICogVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5vbi1wb3NpdGlvbmFsIGFuZCBvcHRpb25zIG1heSBhcHBlYXIgYmVmb3JlIG9yIGFmdGVyIGNvbW1hbmQtYXJndW1lbnRzLlxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXNzVGhyb3VnaF0gZm9yIHVua25vd24gb3B0aW9ucy5cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBwYXNzVGhyb3VnaE9wdGlvbnMocGFzc1Rocm91Z2ggPSB0cnVlKSB7XG4gICAgdGhpcy5fcGFzc1Rocm91Z2hPcHRpb25zID0gISFwYXNzVGhyb3VnaDtcbiAgICB0aGlzLl9jaGVja0ZvckJyb2tlblBhc3NUaHJvdWdoKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoZWNrRm9yQnJva2VuUGFzc1Rocm91Z2goKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5wYXJlbnQgJiZcbiAgICAgIHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucyAmJlxuICAgICAgIXRoaXMucGFyZW50Ll9lbmFibGVQb3NpdGlvbmFsT3B0aW9uc1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcGFzc1Rocm91Z2hPcHRpb25zIGNhbm5vdCBiZSB1c2VkIGZvciAnJHt0aGlzLl9uYW1lfScgd2l0aG91dCB0dXJuaW5nIG9uIGVuYWJsZVBvc2l0aW9uYWxPcHRpb25zIGZvciBwYXJlbnQgY29tbWFuZChzKWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0b3JlIG9wdGlvbiB2YWx1ZXMgYXMgcHJvcGVydGllcyBvbiBjb21tYW5kIG9iamVjdCxcbiAgICogb3Igc3RvcmUgc2VwYXJhdGVseSAoc3BlY2lmeSBmYWxzZSkuIEluIGJvdGggY2FzZXMgdGhlIG9wdGlvbiB2YWx1ZXMgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIC5vcHRzKCkuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3N0b3JlQXNQcm9wZXJ0aWVzPXRydWVdXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBzdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMoc3RvcmVBc1Byb3BlcnRpZXMgPSB0cnVlKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY2FsbCAuc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKCkgYmVmb3JlIGFkZGluZyBvcHRpb25zJyk7XG4gICAgfVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9vcHRpb25WYWx1ZXMpLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnY2FsbCAuc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKCkgYmVmb3JlIHNldHRpbmcgb3B0aW9uIHZhbHVlcycsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMgPSAhIXN0b3JlQXNQcm9wZXJ0aWVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIG9wdGlvbiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtvYmplY3R9IHZhbHVlXG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlKGtleSkge1xuICAgIGlmICh0aGlzLl9zdG9yZU9wdGlvbnNBc1Byb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybiB0aGlzW2tleV07XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vcHRpb25WYWx1ZXNba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBvcHRpb24gdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHBhcmFtIHtvYmplY3R9IHZhbHVlXG4gICAqIEByZXR1cm4ge0NvbW1hbmR9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZ1xuICAgKi9cblxuICBzZXRPcHRpb25WYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKGtleSwgdmFsdWUsIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgb3B0aW9uIHZhbHVlIGFuZCB3aGVyZSB0aGUgdmFsdWUgY2FtZSBmcm9tLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSB2YWx1ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlIC0gZXhwZWN0ZWQgdmFsdWVzIGFyZSBkZWZhdWx0L2NvbmZpZy9lbnYvY2xpL2ltcGxpZWRcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHNldE9wdGlvblZhbHVlV2l0aFNvdXJjZShrZXksIHZhbHVlLCBzb3VyY2UpIHtcbiAgICBpZiAodGhpcy5fc3RvcmVPcHRpb25zQXNQcm9wZXJ0aWVzKSB7XG4gICAgICB0aGlzW2tleV0gPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb3B0aW9uVmFsdWVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgdGhpcy5fb3B0aW9uVmFsdWVTb3VyY2VzW2tleV0gPSBzb3VyY2U7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNvdXJjZSBvZiBvcHRpb24gdmFsdWUuXG4gICAqIEV4cGVjdGVkIHZhbHVlcyBhcmUgZGVmYXVsdCB8IGNvbmZpZyB8IGVudiB8IGNsaSB8IGltcGxpZWRcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGdldE9wdGlvblZhbHVlU291cmNlKGtleSkge1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25WYWx1ZVNvdXJjZXNba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgc291cmNlIG9mIG9wdGlvbiB2YWx1ZS4gU2VlIGFsc28gLm9wdHNXaXRoR2xvYmFscygpLlxuICAgKiBFeHBlY3RlZCB2YWx1ZXMgYXJlIGRlZmF1bHQgfCBjb25maWcgfCBlbnYgfCBjbGkgfCBpbXBsaWVkXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7c3RyaW5nfVxuICAgKi9cblxuICBnZXRPcHRpb25WYWx1ZVNvdXJjZVdpdGhHbG9iYWxzKGtleSkge1xuICAgIC8vIGdsb2JhbCBvdmVyd3JpdGVzIGxvY2FsLCBsaWtlIG9wdHNXaXRoR2xvYmFsc1xuICAgIGxldCBzb3VyY2U7XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLmZvckVhY2goKGNtZCkgPT4ge1xuICAgICAgaWYgKGNtZC5nZXRPcHRpb25WYWx1ZVNvdXJjZShrZXkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc291cmNlID0gY21kLmdldE9wdGlvblZhbHVlU291cmNlKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXNlciBhcmd1bWVudHMgZnJvbSBpbXBsaWVkIG9yIGV4cGxpY2l0IGFyZ3VtZW50cy5cbiAgICogU2lkZS1lZmZlY3RzOiBzZXQgX3NjcmlwdFBhdGggaWYgYXJncyBpbmNsdWRlZCBzY3JpcHQuIFVzZWQgZm9yIGRlZmF1bHQgcHJvZ3JhbSBuYW1lLCBhbmQgc3ViY29tbWFuZCBzZWFyY2hlcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3ByZXBhcmVVc2VyQXJncyhhcmd2LCBwYXJzZU9wdGlvbnMpIHtcbiAgICBpZiAoYXJndiAhPT0gdW5kZWZpbmVkICYmICFBcnJheS5pc0FycmF5KGFyZ3YpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpcnN0IHBhcmFtZXRlciB0byBwYXJzZSBtdXN0IGJlIGFycmF5IG9yIHVuZGVmaW5lZCcpO1xuICAgIH1cbiAgICBwYXJzZU9wdGlvbnMgPSBwYXJzZU9wdGlvbnMgfHwge307XG5cbiAgICAvLyBhdXRvLWRldGVjdCBhcmd1bWVudCBjb252ZW50aW9ucyBpZiBub3RoaW5nIHN1cHBsaWVkXG4gICAgaWYgKGFyZ3YgPT09IHVuZGVmaW5lZCAmJiBwYXJzZU9wdGlvbnMuZnJvbSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy52ZXJzaW9ucz8uZWxlY3Ryb24pIHtcbiAgICAgICAgcGFyc2VPcHRpb25zLmZyb20gPSAnZWxlY3Ryb24nO1xuICAgICAgfVxuICAgICAgLy8gY2hlY2sgbm9kZSBzcGVjaWZpYyBvcHRpb25zIGZvciBzY2VuYXJpb3Mgd2hlcmUgdXNlciBDTEkgYXJncyBmb2xsb3cgZXhlY3V0YWJsZSB3aXRob3V0IHNjcmlwdG5hbWVcbiAgICAgIGNvbnN0IGV4ZWNBcmd2ID0gcHJvY2Vzcy5leGVjQXJndiA/PyBbXTtcbiAgICAgIGlmIChcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy1lJykgfHxcbiAgICAgICAgZXhlY0FyZ3YuaW5jbHVkZXMoJy0tZXZhbCcpIHx8XG4gICAgICAgIGV4ZWNBcmd2LmluY2x1ZGVzKCctcCcpIHx8XG4gICAgICAgIGV4ZWNBcmd2LmluY2x1ZGVzKCctLXByaW50JylcbiAgICAgICkge1xuICAgICAgICBwYXJzZU9wdGlvbnMuZnJvbSA9ICdldmFsJzsgLy8gaW50ZXJuYWwgdXNhZ2UsIG5vdCBkb2N1bWVudGVkXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGVmYXVsdCB0byB1c2luZyBwcm9jZXNzLmFyZ3ZcbiAgICBpZiAoYXJndiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhcmd2ID0gcHJvY2Vzcy5hcmd2O1xuICAgIH1cbiAgICB0aGlzLnJhd0FyZ3MgPSBhcmd2LnNsaWNlKCk7XG5cbiAgICAvLyBleHRyYWN0IHRoZSB1c2VyIGFyZ3MgYW5kIHNjcmlwdFBhdGhcbiAgICBsZXQgdXNlckFyZ3M7XG4gICAgc3dpdGNoIChwYXJzZU9wdGlvbnMuZnJvbSkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgdGhpcy5fc2NyaXB0UGF0aCA9IGFyZ3ZbMV07XG4gICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbGVjdHJvbic6XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IGJlY2F1c2UgZGVmYXVsdEFwcCBpcyBhbiB1bmtub3duIHByb3BlcnR5XG4gICAgICAgIGlmIChwcm9jZXNzLmRlZmF1bHRBcHApIHtcbiAgICAgICAgICB0aGlzLl9zY3JpcHRQYXRoID0gYXJndlsxXTtcbiAgICAgICAgICB1c2VyQXJncyA9IGFyZ3Yuc2xpY2UoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndXNlcic6XG4gICAgICAgIHVzZXJBcmdzID0gYXJndi5zbGljZSgwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdldmFsJzpcbiAgICAgICAgdXNlckFyZ3MgPSBhcmd2LnNsaWNlKDEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgdW5leHBlY3RlZCBwYXJzZSBvcHRpb24geyBmcm9tOiAnJHtwYXJzZU9wdGlvbnMuZnJvbX0nIH1gLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8vIEZpbmQgZGVmYXVsdCBuYW1lIGZvciBwcm9ncmFtIGZyb20gYXJndW1lbnRzLlxuICAgIGlmICghdGhpcy5fbmFtZSAmJiB0aGlzLl9zY3JpcHRQYXRoKVxuICAgICAgdGhpcy5uYW1lRnJvbUZpbGVuYW1lKHRoaXMuX3NjcmlwdFBhdGgpO1xuICAgIHRoaXMuX25hbWUgPSB0aGlzLl9uYW1lIHx8ICdwcm9ncmFtJztcblxuICAgIHJldHVybiB1c2VyQXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBgYXJndmAsIHNldHRpbmcgb3B0aW9ucyBhbmQgaW52b2tpbmcgY29tbWFuZHMgd2hlbiBkZWZpbmVkLlxuICAgKlxuICAgKiBVc2UgcGFyc2VBc3luYyBpbnN0ZWFkIG9mIHBhcnNlIGlmIGFueSBvZiB5b3VyIGFjdGlvbiBoYW5kbGVycyBhcmUgYXN5bmMuXG4gICAqXG4gICAqIENhbGwgd2l0aCBubyBwYXJhbWV0ZXJzIHRvIHBhcnNlIGBwcm9jZXNzLmFyZ3ZgLiBEZXRlY3RzIEVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgb3B0aW9ucyBsaWtlIGBub2RlIC0tZXZhbGAuIEVhc3kgbW9kZSFcbiAgICpcbiAgICogT3IgY2FsbCB3aXRoIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gcGFyc2UsIGFuZCBvcHRpb25hbGx5IHdoZXJlIHRoZSB1c2VyIGFyZ3VtZW50cyBzdGFydCBieSBzcGVjaWZ5aW5nIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIGBmcm9tYDpcbiAgICogLSBgJ25vZGUnYDogZGVmYXVsdCwgYGFyZ3ZbMF1gIGlzIHRoZSBhcHBsaWNhdGlvbiBhbmQgYGFyZ3ZbMV1gIGlzIHRoZSBzY3JpcHQgYmVpbmcgcnVuLCB3aXRoIHVzZXIgYXJndW1lbnRzIGFmdGVyIHRoYXRcbiAgICogLSBgJ2VsZWN0cm9uJ2A6IGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCB2YXJpZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVsZWN0cm9uIGFwcGxpY2F0aW9uIGlzIHBhY2thZ2VkXG4gICAqIC0gYCd1c2VyJ2A6IGp1c3QgdXNlciBhcmd1bWVudHNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5wYXJzZSgpOyAvLyBwYXJzZSBwcm9jZXNzLmFyZ3YgYW5kIGF1dG8tZGV0ZWN0IGVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgZmxhZ3NcbiAgICogcHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpOyAvLyBhc3N1bWUgYXJndlswXSBpcyBhcHAgYW5kIGFyZ3ZbMV0gaXMgc2NyaXB0XG4gICAqIHByb2dyYW0ucGFyc2UobXktYXJncywgeyBmcm9tOiAndXNlcicgfSk7IC8vIGp1c3QgdXNlciBzdXBwbGllZCBhcmd1bWVudHMsIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBhcmd2WzBdXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmd2XSAtIG9wdGlvbmFsLCBkZWZhdWx0cyB0byBwcm9jZXNzLmFyZ3ZcbiAgICogQHBhcmFtIHtvYmplY3R9IFtwYXJzZU9wdGlvbnNdIC0gb3B0aW9uYWxseSBzcGVjaWZ5IHN0eWxlIG9mIG9wdGlvbnMgd2l0aCBmcm9tOiBub2RlL3VzZXIvZWxlY3Ryb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwYXJzZU9wdGlvbnMuZnJvbV0gLSB3aGVyZSB0aGUgYXJncyBhcmUgZnJvbTogJ25vZGUnLCAndXNlcicsICdlbGVjdHJvbidcbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIHBhcnNlKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGNvbnN0IHVzZXJBcmdzID0gdGhpcy5fcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucyk7XG4gICAgdGhpcy5fcGFyc2VDb21tYW5kKFtdLCB1c2VyQXJncyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBgYXJndmAsIHNldHRpbmcgb3B0aW9ucyBhbmQgaW52b2tpbmcgY29tbWFuZHMgd2hlbiBkZWZpbmVkLlxuICAgKlxuICAgKiBDYWxsIHdpdGggbm8gcGFyYW1ldGVycyB0byBwYXJzZSBgcHJvY2Vzcy5hcmd2YC4gRGV0ZWN0cyBFbGVjdHJvbiBhbmQgc3BlY2lhbCBub2RlIG9wdGlvbnMgbGlrZSBgbm9kZSAtLWV2YWxgLiBFYXN5IG1vZGUhXG4gICAqXG4gICAqIE9yIGNhbGwgd2l0aCBhbiBhcnJheSBvZiBzdHJpbmdzIHRvIHBhcnNlLCBhbmQgb3B0aW9uYWxseSB3aGVyZSB0aGUgdXNlciBhcmd1bWVudHMgc3RhcnQgYnkgc3BlY2lmeWluZyB3aGVyZSB0aGUgYXJndW1lbnRzIGFyZSBgZnJvbWA6XG4gICAqIC0gYCdub2RlJ2A6IGRlZmF1bHQsIGBhcmd2WzBdYCBpcyB0aGUgYXBwbGljYXRpb24gYW5kIGBhcmd2WzFdYCBpcyB0aGUgc2NyaXB0IGJlaW5nIHJ1biwgd2l0aCB1c2VyIGFyZ3VtZW50cyBhZnRlciB0aGF0XG4gICAqIC0gYCdlbGVjdHJvbidgOiBgYXJndlswXWAgaXMgdGhlIGFwcGxpY2F0aW9uIGFuZCBgYXJndlsxXWAgdmFyaWVzIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBlbGVjdHJvbiBhcHBsaWNhdGlvbiBpcyBwYWNrYWdlZFxuICAgKiAtIGAndXNlcidgOiBqdXN0IHVzZXIgYXJndW1lbnRzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGF3YWl0IHByb2dyYW0ucGFyc2VBc3luYygpOyAvLyBwYXJzZSBwcm9jZXNzLmFyZ3YgYW5kIGF1dG8tZGV0ZWN0IGVsZWN0cm9uIGFuZCBzcGVjaWFsIG5vZGUgZmxhZ3NcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKHByb2Nlc3MuYXJndik7IC8vIGFzc3VtZSBhcmd2WzBdIGlzIGFwcCBhbmQgYXJndlsxXSBpcyBzY3JpcHRcbiAgICogYXdhaXQgcHJvZ3JhbS5wYXJzZUFzeW5jKG15LWFyZ3MsIHsgZnJvbTogJ3VzZXInIH0pOyAvLyBqdXN0IHVzZXIgc3VwcGxpZWQgYXJndW1lbnRzLCBub3RoaW5nIHNwZWNpYWwgYWJvdXQgYXJndlswXVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJndl1cbiAgICogQHBhcmFtIHtvYmplY3R9IFtwYXJzZU9wdGlvbnNdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXJzZU9wdGlvbnMuZnJvbSAtIHdoZXJlIHRoZSBhcmdzIGFyZSBmcm9tOiAnbm9kZScsICd1c2VyJywgJ2VsZWN0cm9uJ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cblxuICBhc3luYyBwYXJzZUFzeW5jKGFyZ3YsIHBhcnNlT3B0aW9ucykge1xuICAgIGNvbnN0IHVzZXJBcmdzID0gdGhpcy5fcHJlcGFyZVVzZXJBcmdzKGFyZ3YsIHBhcnNlT3B0aW9ucyk7XG4gICAgYXdhaXQgdGhpcy5fcGFyc2VDb21tYW5kKFtdLCB1c2VyQXJncyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc3ViLWNvbW1hbmQgZXhlY3V0YWJsZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2V4ZWN1dGVTdWJDb21tYW5kKHN1YmNvbW1hbmQsIGFyZ3MpIHtcbiAgICBhcmdzID0gYXJncy5zbGljZSgpO1xuICAgIGxldCBsYXVuY2hXaXRoTm9kZSA9IGZhbHNlOyAvLyBVc2Ugbm9kZSBmb3Igc291cmNlIHRhcmdldHMgc28gZG8gbm90IG5lZWQgdG8gZ2V0IHBlcm1pc3Npb25zIGNvcnJlY3QsIGFuZCBvbiBXaW5kb3dzLlxuICAgIGNvbnN0IHNvdXJjZUV4dCA9IFsnLmpzJywgJy50cycsICcudHN4JywgJy5tanMnLCAnLmNqcyddO1xuXG4gICAgZnVuY3Rpb24gZmluZEZpbGUoYmFzZURpciwgYmFzZU5hbWUpIHtcbiAgICAgIC8vIExvb2sgZm9yIHNwZWNpZmllZCBmaWxlXG4gICAgICBjb25zdCBsb2NhbEJpbiA9IHBhdGgucmVzb2x2ZShiYXNlRGlyLCBiYXNlTmFtZSk7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhsb2NhbEJpbikpIHJldHVybiBsb2NhbEJpbjtcblxuICAgICAgLy8gU3RvcCBsb29raW5nIGlmIGNhbmRpZGF0ZSBhbHJlYWR5IGhhcyBhbiBleHBlY3RlZCBleHRlbnNpb24uXG4gICAgICBpZiAoc291cmNlRXh0LmluY2x1ZGVzKHBhdGguZXh0bmFtZShiYXNlTmFtZSkpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAvLyBUcnkgYWxsIHRoZSBleHRlbnNpb25zLlxuICAgICAgY29uc3QgZm91bmRFeHQgPSBzb3VyY2VFeHQuZmluZCgoZXh0KSA9PlxuICAgICAgICBmcy5leGlzdHNTeW5jKGAke2xvY2FsQmlufSR7ZXh0fWApLFxuICAgICAgKTtcbiAgICAgIGlmIChmb3VuZEV4dCkgcmV0dXJuIGAke2xvY2FsQmlufSR7Zm91bmRFeHR9YDtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvLyBOb3QgY2hlY2tpbmcgZm9yIGhlbHAgZmlyc3QuIFVubGlrZWx5IHRvIGhhdmUgbWFuZGF0b3J5IGFuZCBleGVjdXRhYmxlLCBhbmQgY2FuJ3Qgcm9idXN0bHkgdGVzdCBmb3IgaGVscCBmbGFncyBpbiBleHRlcm5hbCBjb21tYW5kLlxuICAgIHRoaXMuX2NoZWNrRm9yTWlzc2luZ01hbmRhdG9yeU9wdGlvbnMoKTtcbiAgICB0aGlzLl9jaGVja0ZvckNvbmZsaWN0aW5nT3B0aW9ucygpO1xuXG4gICAgLy8gZXhlY3V0YWJsZUZpbGUgYW5kIGV4ZWN1dGFibGVEaXIgbWlnaHQgYmUgZnVsbCBwYXRoLCBvciBqdXN0IGEgbmFtZVxuICAgIGxldCBleGVjdXRhYmxlRmlsZSA9XG4gICAgICBzdWJjb21tYW5kLl9leGVjdXRhYmxlRmlsZSB8fCBgJHt0aGlzLl9uYW1lfS0ke3N1YmNvbW1hbmQuX25hbWV9YDtcbiAgICBsZXQgZXhlY3V0YWJsZURpciA9IHRoaXMuX2V4ZWN1dGFibGVEaXIgfHwgJyc7XG4gICAgaWYgKHRoaXMuX3NjcmlwdFBhdGgpIHtcbiAgICAgIGxldCByZXNvbHZlZFNjcmlwdFBhdGg7IC8vIHJlc29sdmUgcG9zc2libGUgc3ltbGluayBmb3IgaW5zdGFsbGVkIG5wbSBiaW5hcnlcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc29sdmVkU2NyaXB0UGF0aCA9IGZzLnJlYWxwYXRoU3luYyh0aGlzLl9zY3JpcHRQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXNvbHZlZFNjcmlwdFBhdGggPSB0aGlzLl9zY3JpcHRQYXRoO1xuICAgICAgfVxuICAgICAgZXhlY3V0YWJsZURpciA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgcGF0aC5kaXJuYW1lKHJlc29sdmVkU2NyaXB0UGF0aCksXG4gICAgICAgIGV4ZWN1dGFibGVEaXIsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIExvb2sgZm9yIGEgbG9jYWwgZmlsZSBpbiBwcmVmZXJlbmNlIHRvIGEgY29tbWFuZCBpbiBQQVRILlxuICAgIGlmIChleGVjdXRhYmxlRGlyKSB7XG4gICAgICBsZXQgbG9jYWxGaWxlID0gZmluZEZpbGUoZXhlY3V0YWJsZURpciwgZXhlY3V0YWJsZUZpbGUpO1xuXG4gICAgICAvLyBMZWdhY3kgc2VhcmNoIHVzaW5nIHByZWZpeCBvZiBzY3JpcHQgbmFtZSBpbnN0ZWFkIG9mIGNvbW1hbmQgbmFtZVxuICAgICAgaWYgKCFsb2NhbEZpbGUgJiYgIXN1YmNvbW1hbmQuX2V4ZWN1dGFibGVGaWxlICYmIHRoaXMuX3NjcmlwdFBhdGgpIHtcbiAgICAgICAgY29uc3QgbGVnYWN5TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgICAgdGhpcy5fc2NyaXB0UGF0aCxcbiAgICAgICAgICBwYXRoLmV4dG5hbWUodGhpcy5fc2NyaXB0UGF0aCksXG4gICAgICAgICk7XG4gICAgICAgIGlmIChsZWdhY3lOYW1lICE9PSB0aGlzLl9uYW1lKSB7XG4gICAgICAgICAgbG9jYWxGaWxlID0gZmluZEZpbGUoXG4gICAgICAgICAgICBleGVjdXRhYmxlRGlyLFxuICAgICAgICAgICAgYCR7bGVnYWN5TmFtZX0tJHtzdWJjb21tYW5kLl9uYW1lfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXhlY3V0YWJsZUZpbGUgPSBsb2NhbEZpbGUgfHwgZXhlY3V0YWJsZUZpbGU7XG4gICAgfVxuXG4gICAgbGF1bmNoV2l0aE5vZGUgPSBzb3VyY2VFeHQuaW5jbHVkZXMocGF0aC5leHRuYW1lKGV4ZWN1dGFibGVGaWxlKSk7XG5cbiAgICBsZXQgcHJvYztcbiAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSAhPT0gJ3dpbjMyJykge1xuICAgICAgaWYgKGxhdW5jaFdpdGhOb2RlKSB7XG4gICAgICAgIGFyZ3MudW5zaGlmdChleGVjdXRhYmxlRmlsZSk7XG4gICAgICAgIC8vIGFkZCBleGVjdXRhYmxlIGFyZ3VtZW50cyB0byBzcGF3blxuICAgICAgICBhcmdzID0gaW5jcmVtZW50Tm9kZUluc3BlY3RvclBvcnQocHJvY2Vzcy5leGVjQXJndikuY29uY2F0KGFyZ3MpO1xuXG4gICAgICAgIHByb2MgPSBjaGlsZFByb2Nlc3Muc3Bhd24ocHJvY2Vzcy5hcmd2WzBdLCBhcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9jID0gY2hpbGRQcm9jZXNzLnNwYXduKGV4ZWN1dGFibGVGaWxlLCBhcmdzLCB7IHN0ZGlvOiAnaW5oZXJpdCcgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MudW5zaGlmdChleGVjdXRhYmxlRmlsZSk7XG4gICAgICAvLyBhZGQgZXhlY3V0YWJsZSBhcmd1bWVudHMgdG8gc3Bhd25cbiAgICAgIGFyZ3MgPSBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChwcm9jZXNzLmV4ZWNBcmd2KS5jb25jYXQoYXJncyk7XG4gICAgICBwcm9jID0gY2hpbGRQcm9jZXNzLnNwYXduKHByb2Nlc3MuZXhlY1BhdGgsIGFyZ3MsIHsgc3RkaW86ICdpbmhlcml0JyB9KTtcbiAgICB9XG5cbiAgICBpZiAoIXByb2Mua2lsbGVkKSB7XG4gICAgICAvLyB0ZXN0aW5nIG1haW5seSB0byBhdm9pZCBsZWFrIHdhcm5pbmdzIGR1cmluZyB1bml0IHRlc3RzIHdpdGggbW9ja2VkIHNwYXduXG4gICAgICBjb25zdCBzaWduYWxzID0gWydTSUdVU1IxJywgJ1NJR1VTUjInLCAnU0lHVEVSTScsICdTSUdJTlQnLCAnU0lHSFVQJ107XG4gICAgICBzaWduYWxzLmZvckVhY2goKHNpZ25hbCkgPT4ge1xuICAgICAgICBwcm9jZXNzLm9uKHNpZ25hbCwgKCkgPT4ge1xuICAgICAgICAgIGlmIChwcm9jLmtpbGxlZCA9PT0gZmFsc2UgJiYgcHJvYy5leGl0Q29kZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSBiZWNhdXNlIHNpZ25hbHMgbm90IHR5cGVkIHRvIGtub3duIHN0cmluZ3NcbiAgICAgICAgICAgIHByb2Mua2lsbChzaWduYWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCeSBkZWZhdWx0IHRlcm1pbmF0ZSBwcm9jZXNzIHdoZW4gc3Bhd25lZCBwcm9jZXNzIHRlcm1pbmF0ZXMuXG4gICAgY29uc3QgZXhpdENhbGxiYWNrID0gdGhpcy5fZXhpdENhbGxiYWNrO1xuICAgIHByb2Mub24oJ2Nsb3NlJywgKGNvZGUpID0+IHtcbiAgICAgIGNvZGUgPSBjb2RlID8/IDE7IC8vIGNvZGUgaXMgbnVsbCBpZiBzcGF3bmVkIHByb2Nlc3MgdGVybWluYXRlZCBkdWUgdG8gYSBzaWduYWxcbiAgICAgIGlmICghZXhpdENhbGxiYWNrKSB7XG4gICAgICAgIHByb2Nlc3MuZXhpdChjb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXRDYWxsYmFjayhcbiAgICAgICAgICBuZXcgQ29tbWFuZGVyRXJyb3IoXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgJ2NvbW1hbmRlci5leGVjdXRlU3ViQ29tbWFuZEFzeW5jJyxcbiAgICAgICAgICAgICcoY2xvc2UpJyxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHByb2Mub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgLy8gQHRzLWlnbm9yZTogYmVjYXVzZSBlcnIuY29kZSBpcyBhbiB1bmtub3duIHByb3BlcnR5XG4gICAgICBpZiAoZXJyLmNvZGUgPT09ICdFTk9FTlQnKSB7XG4gICAgICAgIGNvbnN0IGV4ZWN1dGFibGVEaXJNZXNzYWdlID0gZXhlY3V0YWJsZURpclxuICAgICAgICAgID8gYHNlYXJjaGVkIGZvciBsb2NhbCBzdWJjb21tYW5kIHJlbGF0aXZlIHRvIGRpcmVjdG9yeSAnJHtleGVjdXRhYmxlRGlyfSdgXG4gICAgICAgICAgOiAnbm8gZGlyZWN0b3J5IGZvciBzZWFyY2ggZm9yIGxvY2FsIHN1YmNvbW1hbmQsIHVzZSAuZXhlY3V0YWJsZURpcigpIHRvIHN1cHBseSBhIGN1c3RvbSBkaXJlY3RvcnknO1xuICAgICAgICBjb25zdCBleGVjdXRhYmxlTWlzc2luZyA9IGAnJHtleGVjdXRhYmxlRmlsZX0nIGRvZXMgbm90IGV4aXN0XG4gLSBpZiAnJHtzdWJjb21tYW5kLl9uYW1lfScgaXMgbm90IG1lYW50IHRvIGJlIGFuIGV4ZWN1dGFibGUgY29tbWFuZCwgcmVtb3ZlIGRlc2NyaXB0aW9uIHBhcmFtZXRlciBmcm9tICcuY29tbWFuZCgpJyBhbmQgdXNlICcuZGVzY3JpcHRpb24oKScgaW5zdGVhZFxuIC0gaWYgdGhlIGRlZmF1bHQgZXhlY3V0YWJsZSBuYW1lIGlzIG5vdCBzdWl0YWJsZSwgdXNlIHRoZSBleGVjdXRhYmxlRmlsZSBvcHRpb24gdG8gc3VwcGx5IGEgY3VzdG9tIG5hbWUgb3IgcGF0aFxuIC0gJHtleGVjdXRhYmxlRGlyTWVzc2FnZX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXhlY3V0YWJsZU1pc3NpbmcpO1xuICAgICAgICAvLyBAdHMtaWdub3JlOiBiZWNhdXNlIGVyci5jb2RlIGlzIGFuIHVua25vd24gcHJvcGVydHlcbiAgICAgIH0gZWxzZSBpZiAoZXJyLmNvZGUgPT09ICdFQUNDRVMnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZXhlY3V0YWJsZUZpbGV9JyBub3QgZXhlY3V0YWJsZWApO1xuICAgICAgfVxuICAgICAgaWYgKCFleGl0Q2FsbGJhY2spIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IENvbW1hbmRlckVycm9yKFxuICAgICAgICAgIDEsXG4gICAgICAgICAgJ2NvbW1hbmRlci5leGVjdXRlU3ViQ29tbWFuZEFzeW5jJyxcbiAgICAgICAgICAnKGVycm9yKScsXG4gICAgICAgICk7XG4gICAgICAgIHdyYXBwZWRFcnJvci5uZXN0ZWRFcnJvciA9IGVycjtcbiAgICAgICAgZXhpdENhbGxiYWNrKHdyYXBwZWRFcnJvcik7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCBwcm9jZXNzXG4gICAgdGhpcy5ydW5uaW5nQ29tbWFuZCA9IHByb2M7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2Rpc3BhdGNoU3ViY29tbWFuZChjb21tYW5kTmFtZSwgb3BlcmFuZHMsIHVua25vd24pIHtcbiAgICBjb25zdCBzdWJDb21tYW5kID0gdGhpcy5fZmluZENvbW1hbmQoY29tbWFuZE5hbWUpO1xuICAgIGlmICghc3ViQ29tbWFuZCkgdGhpcy5oZWxwKHsgZXJyb3I6IHRydWUgfSk7XG5cbiAgICBsZXQgcHJvbWlzZUNoYWluO1xuICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsU3ViQ29tbWFuZEhvb2soXG4gICAgICBwcm9taXNlQ2hhaW4sXG4gICAgICBzdWJDb21tYW5kLFxuICAgICAgJ3ByZVN1YmNvbW1hbmQnLFxuICAgICk7XG4gICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGwocHJvbWlzZUNoYWluLCAoKSA9PiB7XG4gICAgICBpZiAoc3ViQ29tbWFuZC5fZXhlY3V0YWJsZUhhbmRsZXIpIHtcbiAgICAgICAgdGhpcy5fZXhlY3V0ZVN1YkNvbW1hbmQoc3ViQ29tbWFuZCwgb3BlcmFuZHMuY29uY2F0KHVua25vd24pKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBzdWJDb21tYW5kLl9wYXJzZUNvbW1hbmQob3BlcmFuZHMsIHVua25vd24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlQ2hhaW47XG4gIH1cblxuICAvKipcbiAgICogSW52b2tlIGhlbHAgZGlyZWN0bHkgaWYgcG9zc2libGUsIG9yIGRpc3BhdGNoIGlmIG5lY2Vzc2FyeS5cbiAgICogZS5nLiBoZWxwIGZvb1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfZGlzcGF0Y2hIZWxwQ29tbWFuZChzdWJjb21tYW5kTmFtZSkge1xuICAgIGlmICghc3ViY29tbWFuZE5hbWUpIHtcbiAgICAgIHRoaXMuaGVscCgpO1xuICAgIH1cbiAgICBjb25zdCBzdWJDb21tYW5kID0gdGhpcy5fZmluZENvbW1hbmQoc3ViY29tbWFuZE5hbWUpO1xuICAgIGlmIChzdWJDb21tYW5kICYmICFzdWJDb21tYW5kLl9leGVjdXRhYmxlSGFuZGxlcikge1xuICAgICAgc3ViQ29tbWFuZC5oZWxwKCk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gcGFyc2luZyB0aGUgaGVscCBmbGFnIHRvIGludm9rZSB0aGUgaGVscC5cbiAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hTdWJjb21tYW5kKFxuICAgICAgc3ViY29tbWFuZE5hbWUsXG4gICAgICBbXSxcbiAgICAgIFt0aGlzLl9nZXRIZWxwT3B0aW9uKCk/LmxvbmcgPz8gdGhpcy5fZ2V0SGVscE9wdGlvbigpPy5zaG9ydCA/PyAnLS1oZWxwJ10sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGlzLmFyZ3MgYWdhaW5zdCBleHBlY3RlZCB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGVja051bWJlck9mQXJndW1lbnRzKCkge1xuICAgIC8vIHRvbyBmZXdcbiAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMuZm9yRWFjaCgoYXJnLCBpKSA9PiB7XG4gICAgICBpZiAoYXJnLnJlcXVpcmVkICYmIHRoaXMuYXJnc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubWlzc2luZ0FyZ3VtZW50KGFyZy5uYW1lKCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIHRvbyBtYW55XG4gICAgaWYgKFxuICAgICAgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzLmxlbmd0aCA+IDAgJiZcbiAgICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50c1t0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoIC0gMV0udmFyaWFkaWNcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXJncy5sZW5ndGggPiB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9leGNlc3NBcmd1bWVudHModGhpcy5hcmdzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGlzLmFyZ3MgdXNpbmcgdGhpcy5yZWdpc3RlcmVkQXJndW1lbnRzIGFuZCBzYXZlIGFzIHRoaXMucHJvY2Vzc2VkQXJncyFcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3Byb2Nlc3NBcmd1bWVudHMoKSB7XG4gICAgY29uc3QgbXlQYXJzZUFyZyA9IChhcmd1bWVudCwgdmFsdWUsIHByZXZpb3VzKSA9PiB7XG4gICAgICAvLyBFeHRyYSBwcm9jZXNzaW5nIGZvciBuaWNlIGVycm9yIG1lc3NhZ2Ugb24gcGFyc2luZyBmYWlsdXJlLlxuICAgICAgbGV0IHBhcnNlZFZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgYXJndW1lbnQucGFyc2VBcmcpIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFZhbHVlTWVzc2FnZSA9IGBlcnJvcjogY29tbWFuZC1hcmd1bWVudCB2YWx1ZSAnJHt2YWx1ZX0nIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50ICcke2FyZ3VtZW50Lm5hbWUoKX0nLmA7XG4gICAgICAgIHBhcnNlZFZhbHVlID0gdGhpcy5fY2FsbFBhcnNlQXJnKFxuICAgICAgICAgIGFyZ3VtZW50LFxuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIHByZXZpb3VzLFxuICAgICAgICAgIGludmFsaWRWYWx1ZU1lc3NhZ2UsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgfTtcblxuICAgIHRoaXMuX2NoZWNrTnVtYmVyT2ZBcmd1bWVudHMoKTtcblxuICAgIGNvbnN0IHByb2Nlc3NlZEFyZ3MgPSBbXTtcbiAgICB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMuZm9yRWFjaCgoZGVjbGFyZWRBcmcsIGluZGV4KSA9PiB7XG4gICAgICBsZXQgdmFsdWUgPSBkZWNsYXJlZEFyZy5kZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoZGVjbGFyZWRBcmcudmFyaWFkaWMpIHtcbiAgICAgICAgLy8gQ29sbGVjdCB0b2dldGhlciByZW1haW5pbmcgYXJndW1lbnRzIGZvciBwYXNzaW5nIHRvZ2V0aGVyIGFzIGFuIGFycmF5LlxuICAgICAgICBpZiAoaW5kZXggPCB0aGlzLmFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmFyZ3Muc2xpY2UoaW5kZXgpO1xuICAgICAgICAgIGlmIChkZWNsYXJlZEFyZy5wYXJzZUFyZykge1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZWR1Y2UoKHByb2Nlc3NlZCwgdikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gbXlQYXJzZUFyZyhkZWNsYXJlZEFyZywgdiwgcHJvY2Vzc2VkKTtcbiAgICAgICAgICAgIH0sIGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB2YWx1ZSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGluZGV4IDwgdGhpcy5hcmdzLmxlbmd0aCkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuYXJnc1tpbmRleF07XG4gICAgICAgIGlmIChkZWNsYXJlZEFyZy5wYXJzZUFyZykge1xuICAgICAgICAgIHZhbHVlID0gbXlQYXJzZUFyZyhkZWNsYXJlZEFyZywgdmFsdWUsIGRlY2xhcmVkQXJnLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByb2Nlc3NlZEFyZ3NbaW5kZXhdID0gdmFsdWU7XG4gICAgfSk7XG4gICAgdGhpcy5wcm9jZXNzZWRBcmdzID0gcHJvY2Vzc2VkQXJncztcbiAgfVxuXG4gIC8qKlxuICAgKiBPbmNlIHdlIGhhdmUgYSBwcm9taXNlIHdlIGNoYWluLCBidXQgY2FsbCBzeW5jaHJvbm91c2x5IHVudGlsIHRoZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7KFByb21pc2V8dW5kZWZpbmVkKX0gcHJvbWlzZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKiBAcmV0dXJuIHsoUHJvbWlzZXx1bmRlZmluZWQpfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hhaW5PckNhbGwocHJvbWlzZSwgZm4pIHtcbiAgICAvLyB0aGVuYWJsZVxuICAgIGlmIChwcm9taXNlICYmIHByb21pc2UudGhlbiAmJiB0eXBlb2YgcHJvbWlzZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyBhbHJlYWR5IGhhdmUgYSBwcm9taXNlLCBjaGFpbiBjYWxsYmFja1xuICAgICAgcmV0dXJuIHByb21pc2UudGhlbigoKSA9PiBmbigpKTtcbiAgICB9XG4gICAgLy8gY2FsbGJhY2sgbWlnaHQgcmV0dXJuIGEgcHJvbWlzZVxuICAgIHJldHVybiBmbigpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7KFByb21pc2V8dW5kZWZpbmVkKX0gcHJvbWlzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRcbiAgICogQHJldHVybiB7KFByb21pc2V8dW5kZWZpbmVkKX1cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2NoYWluT3JDYWxsSG9va3MocHJvbWlzZSwgZXZlbnQpIHtcbiAgICBsZXQgcmVzdWx0ID0gcHJvbWlzZTtcbiAgICBjb25zdCBob29rcyA9IFtdO1xuICAgIHRoaXMuX2dldENvbW1hbmRBbmRBbmNlc3RvcnMoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbHRlcigoY21kKSA9PiBjbWQuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSAhPT0gdW5kZWZpbmVkKVxuICAgICAgLmZvckVhY2goKGhvb2tlZENvbW1hbmQpID0+IHtcbiAgICAgICAgaG9va2VkQ29tbWFuZC5fbGlmZUN5Y2xlSG9va3NbZXZlbnRdLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICAgICAgaG9va3MucHVzaCh7IGhvb2tlZENvbW1hbmQsIGNhbGxiYWNrIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIGlmIChldmVudCA9PT0gJ3Bvc3RBY3Rpb24nKSB7XG4gICAgICBob29rcy5yZXZlcnNlKCk7XG4gICAgfVxuXG4gICAgaG9va3MuZm9yRWFjaCgoaG9va0RldGFpbCkgPT4ge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fY2hhaW5PckNhbGwocmVzdWx0LCAoKSA9PiB7XG4gICAgICAgIHJldHVybiBob29rRGV0YWlsLmNhbGxiYWNrKGhvb2tEZXRhaWwuaG9va2VkQ29tbWFuZCwgdGhpcyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7KFByb21pc2V8dW5kZWZpbmVkKX0gcHJvbWlzZVxuICAgKiBAcGFyYW0ge0NvbW1hbmR9IHN1YkNvbW1hbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEByZXR1cm4geyhQcm9taXNlfHVuZGVmaW5lZCl9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9jaGFpbk9yQ2FsbFN1YkNvbW1hbmRIb29rKHByb21pc2UsIHN1YkNvbW1hbmQsIGV2ZW50KSB7XG4gICAgbGV0IHJlc3VsdCA9IHByb21pc2U7XG4gICAgaWYgKHRoaXMuX2xpZmVDeWNsZUhvb2tzW2V2ZW50XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9saWZlQ3ljbGVIb29rc1tldmVudF0uZm9yRWFjaCgoaG9vaykgPT4ge1xuICAgICAgICByZXN1bHQgPSB0aGlzLl9jaGFpbk9yQ2FsbChyZXN1bHQsICgpID0+IHtcbiAgICAgICAgICByZXR1cm4gaG9vayh0aGlzLCBzdWJDb21tYW5kKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIGFyZ3VtZW50cyBpbiBjb250ZXh0IG9mIHRoaXMgY29tbWFuZC5cbiAgICogUmV0dXJucyBhY3Rpb24gcmVzdWx0LCBpbiBjYXNlIGl0IGlzIGEgcHJvbWlzZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX3BhcnNlQ29tbWFuZChvcGVyYW5kcywgdW5rbm93bikge1xuICAgIGNvbnN0IHBhcnNlZCA9IHRoaXMucGFyc2VPcHRpb25zKHVua25vd24pO1xuICAgIHRoaXMuX3BhcnNlT3B0aW9uc0VudigpOyAvLyBhZnRlciBjbGksIHNvIHBhcnNlQXJnIG5vdCBjYWxsZWQgb24gYm90aCBjbGkgYW5kIGVudlxuICAgIHRoaXMuX3BhcnNlT3B0aW9uc0ltcGxpZWQoKTtcbiAgICBvcGVyYW5kcyA9IG9wZXJhbmRzLmNvbmNhdChwYXJzZWQub3BlcmFuZHMpO1xuICAgIHVua25vd24gPSBwYXJzZWQudW5rbm93bjtcbiAgICB0aGlzLmFyZ3MgPSBvcGVyYW5kcy5jb25jYXQodW5rbm93bik7XG5cbiAgICBpZiAob3BlcmFuZHMgJiYgdGhpcy5fZmluZENvbW1hbmQob3BlcmFuZHNbMF0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hTdWJjb21tYW5kKG9wZXJhbmRzWzBdLCBvcGVyYW5kcy5zbGljZSgxKSwgdW5rbm93bik7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHRoaXMuX2dldEhlbHBDb21tYW5kKCkgJiZcbiAgICAgIG9wZXJhbmRzWzBdID09PSB0aGlzLl9nZXRIZWxwQ29tbWFuZCgpLm5hbWUoKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoSGVscENvbW1hbmQob3BlcmFuZHNbMV0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVmYXVsdENvbW1hbmROYW1lKSB7XG4gICAgICB0aGlzLl9vdXRwdXRIZWxwSWZSZXF1ZXN0ZWQodW5rbm93bik7IC8vIFJ1biB0aGUgaGVscCBmb3IgZGVmYXVsdCBjb21tYW5kIGZyb20gcGFyZW50IHJhdGhlciB0aGFuIHBhc3NpbmcgdG8gZGVmYXVsdCBjb21tYW5kXG4gICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hTdWJjb21tYW5kKFxuICAgICAgICB0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUsXG4gICAgICAgIG9wZXJhbmRzLFxuICAgICAgICB1bmtub3duLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggJiZcbiAgICAgIHRoaXMuYXJncy5sZW5ndGggPT09IDAgJiZcbiAgICAgICF0aGlzLl9hY3Rpb25IYW5kbGVyICYmXG4gICAgICAhdGhpcy5fZGVmYXVsdENvbW1hbmROYW1lXG4gICAgKSB7XG4gICAgICAvLyBwcm9iYWJseSBtaXNzaW5nIHN1YmNvbW1hbmQgYW5kIG5vIGhhbmRsZXIsIHVzZXIgbmVlZHMgaGVscCAoYW5kIGV4aXQpXG4gICAgICB0aGlzLmhlbHAoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLl9vdXRwdXRIZWxwSWZSZXF1ZXN0ZWQocGFyc2VkLnVua25vd24pO1xuICAgIHRoaXMuX2NoZWNrRm9yTWlzc2luZ01hbmRhdG9yeU9wdGlvbnMoKTtcbiAgICB0aGlzLl9jaGVja0ZvckNvbmZsaWN0aW5nT3B0aW9ucygpO1xuXG4gICAgLy8gV2UgZG8gbm90IGFsd2F5cyBjYWxsIHRoaXMgY2hlY2sgdG8gYXZvaWQgbWFza2luZyBhIFwiYmV0dGVyXCIgZXJyb3IsIGxpa2UgdW5rbm93biBjb21tYW5kLlxuICAgIGNvbnN0IGNoZWNrRm9yVW5rbm93bk9wdGlvbnMgPSAoKSA9PiB7XG4gICAgICBpZiAocGFyc2VkLnVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnVua25vd25PcHRpb24ocGFyc2VkLnVua25vd25bMF0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjb21tYW5kRXZlbnQgPSBgY29tbWFuZDoke3RoaXMubmFtZSgpfWA7XG4gICAgaWYgKHRoaXMuX2FjdGlvbkhhbmRsZXIpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcblxuICAgICAgbGV0IHByb21pc2VDaGFpbjtcbiAgICAgIHByb21pc2VDaGFpbiA9IHRoaXMuX2NoYWluT3JDYWxsSG9va3MocHJvbWlzZUNoYWluLCAncHJlQWN0aW9uJyk7XG4gICAgICBwcm9taXNlQ2hhaW4gPSB0aGlzLl9jaGFpbk9yQ2FsbChwcm9taXNlQ2hhaW4sICgpID0+XG4gICAgICAgIHRoaXMuX2FjdGlvbkhhbmRsZXIodGhpcy5wcm9jZXNzZWRBcmdzKSxcbiAgICAgICk7XG4gICAgICBpZiAodGhpcy5wYXJlbnQpIHtcbiAgICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGwocHJvbWlzZUNoYWluLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wYXJlbnQuZW1pdChjb21tYW5kRXZlbnQsIG9wZXJhbmRzLCB1bmtub3duKTsgLy8gbGVnYWN5XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcHJvbWlzZUNoYWluID0gdGhpcy5fY2hhaW5PckNhbGxIb29rcyhwcm9taXNlQ2hhaW4sICdwb3N0QWN0aW9uJyk7XG4gICAgICByZXR1cm4gcHJvbWlzZUNoYWluO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQubGlzdGVuZXJDb3VudChjb21tYW5kRXZlbnQpKSB7XG4gICAgICBjaGVja0ZvclVua25vd25PcHRpb25zKCk7XG4gICAgICB0aGlzLl9wcm9jZXNzQXJndW1lbnRzKCk7XG4gICAgICB0aGlzLnBhcmVudC5lbWl0KGNvbW1hbmRFdmVudCwgb3BlcmFuZHMsIHVua25vd24pOyAvLyBsZWdhY3lcbiAgICB9IGVsc2UgaWYgKG9wZXJhbmRzLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuX2ZpbmRDb21tYW5kKCcqJykpIHtcbiAgICAgICAgLy8gbGVnYWN5IGRlZmF1bHQgY29tbWFuZFxuICAgICAgICByZXR1cm4gdGhpcy5fZGlzcGF0Y2hTdWJjb21tYW5kKCcqJywgb3BlcmFuZHMsIHVua25vd24pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubGlzdGVuZXJDb3VudCgnY29tbWFuZDoqJykpIHtcbiAgICAgICAgLy8gc2tpcCBvcHRpb24gY2hlY2ssIGVtaXQgZXZlbnQgZm9yIHBvc3NpYmxlIG1pc3NwZWxsaW5nIHN1Z2dlc3Rpb25cbiAgICAgICAgdGhpcy5lbWl0KCdjb21tYW5kOionLCBvcGVyYW5kcywgdW5rbm93bik7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29tbWFuZHMubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMudW5rbm93bkNvbW1hbmQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgICAgdGhpcy5fcHJvY2Vzc0FyZ3VtZW50cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5jb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIC8vIFRoaXMgY29tbWFuZCBoYXMgc3ViY29tbWFuZHMgYW5kIG5vdGhpbmcgaG9va2VkIHVwIGF0IHRoaXMgbGV2ZWwsIHNvIGRpc3BsYXkgaGVscCAoYW5kIGV4aXQpLlxuICAgICAgdGhpcy5oZWxwKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrRm9yVW5rbm93bk9wdGlvbnMoKTtcbiAgICAgIHRoaXMuX3Byb2Nlc3NBcmd1bWVudHMoKTtcbiAgICAgIC8vIGZhbGwgdGhyb3VnaCBmb3IgY2FsbGVyIHRvIGhhbmRsZSBhZnRlciBjYWxsaW5nIC5wYXJzZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgbWF0Y2hpbmcgY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHJldHVybiB7Q29tbWFuZCB8IHVuZGVmaW5lZH1cbiAgICovXG4gIF9maW5kQ29tbWFuZChuYW1lKSB7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmNvbW1hbmRzLmZpbmQoXG4gICAgICAoY21kKSA9PiBjbWQuX25hbWUgPT09IG5hbWUgfHwgY21kLl9hbGlhc2VzLmluY2x1ZGVzKG5hbWUpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFuIG9wdGlvbiBtYXRjaGluZyBgYXJnYCBpZiBhbnkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdcbiAgICogQHJldHVybiB7T3B0aW9ufVxuICAgKiBAcGFja2FnZVxuICAgKi9cblxuICBfZmluZE9wdGlvbihhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpb25zLmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLmlzKGFyZykpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBhIG1hbmRhdG9yeSBvcHRpb24gZG9lcyBub3QgaGF2ZSBhIHZhbHVlLlxuICAgKiBDYWxsZWQgYWZ0ZXIgY2hlY2tpbmcgZm9yIGhlbHAgZmxhZ3MgaW4gbGVhZiBzdWJjb21tYW5kLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBfY2hlY2tGb3JNaXNzaW5nTWFuZGF0b3J5T3B0aW9ucygpIHtcbiAgICAvLyBXYWxrIHVwIGhpZXJhcmNoeSBzbyBjYW4gY2FsbCBpbiBzdWJjb21tYW5kIGFmdGVyIGNoZWNraW5nIGZvciBkaXNwbGF5aW5nIGhlbHAuXG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLmZvckVhY2goKGNtZCkgPT4ge1xuICAgICAgY21kLm9wdGlvbnMuZm9yRWFjaCgoYW5PcHRpb24pID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGFuT3B0aW9uLm1hbmRhdG9yeSAmJlxuICAgICAgICAgIGNtZC5nZXRPcHRpb25WYWx1ZShhbk9wdGlvbi5hdHRyaWJ1dGVOYW1lKCkpID09PSB1bmRlZmluZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY21kLm1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZShhbk9wdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBpZiBjb25mbGljdGluZyBvcHRpb25zIGFyZSB1c2VkIHRvZ2V0aGVyIGluIHRoaXMuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2hlY2tGb3JDb25mbGljdGluZ0xvY2FsT3B0aW9ucygpIHtcbiAgICBjb25zdCBkZWZpbmVkTm9uRGVmYXVsdE9wdGlvbnMgPSB0aGlzLm9wdGlvbnMuZmlsdGVyKChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IG9wdGlvbktleSA9IG9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBpZiAodGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb25LZXkpID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuZ2V0T3B0aW9uVmFsdWVTb3VyY2Uob3B0aW9uS2V5KSAhPT0gJ2RlZmF1bHQnO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgb3B0aW9uc1dpdGhDb25mbGljdGluZyA9IGRlZmluZWROb25EZWZhdWx0T3B0aW9ucy5maWx0ZXIoXG4gICAgICAob3B0aW9uKSA9PiBvcHRpb24uY29uZmxpY3RzV2l0aC5sZW5ndGggPiAwLFxuICAgICk7XG5cbiAgICBvcHRpb25zV2l0aENvbmZsaWN0aW5nLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgY29uc3QgY29uZmxpY3RpbmdBbmREZWZpbmVkID0gZGVmaW5lZE5vbkRlZmF1bHRPcHRpb25zLmZpbmQoKGRlZmluZWQpID0+XG4gICAgICAgIG9wdGlvbi5jb25mbGljdHNXaXRoLmluY2x1ZGVzKGRlZmluZWQuYXR0cmlidXRlTmFtZSgpKSxcbiAgICAgICk7XG4gICAgICBpZiAoY29uZmxpY3RpbmdBbmREZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2NvbmZsaWN0aW5nT3B0aW9uKG9wdGlvbiwgY29uZmxpY3RpbmdBbmREZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGFuIGVycm9yIG1lc3NhZ2UgaWYgY29uZmxpY3Rpbmcgb3B0aW9ucyBhcmUgdXNlZCB0b2dldGhlci5cbiAgICogQ2FsbGVkIGFmdGVyIGNoZWNraW5nIGZvciBoZWxwIGZsYWdzIGluIGxlYWYgc3ViY29tbWFuZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGVja0ZvckNvbmZsaWN0aW5nT3B0aW9ucygpIHtcbiAgICAvLyBXYWxrIHVwIGhpZXJhcmNoeSBzbyBjYW4gY2FsbCBpbiBzdWJjb21tYW5kIGFmdGVyIGNoZWNraW5nIGZvciBkaXNwbGF5aW5nIGhlbHAuXG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLmZvckVhY2goKGNtZCkgPT4ge1xuICAgICAgY21kLl9jaGVja0ZvckNvbmZsaWN0aW5nTG9jYWxPcHRpb25zKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2Ugb3B0aW9ucyBmcm9tIGBhcmd2YCByZW1vdmluZyBrbm93biBvcHRpb25zLFxuICAgKiBhbmQgcmV0dXJuIGFyZ3Ygc3BsaXQgaW50byBvcGVyYW5kcyBhbmQgdW5rbm93biBhcmd1bWVudHMuXG4gICAqXG4gICAqIEV4YW1wbGVzOlxuICAgKlxuICAgKiAgICAgYXJndiA9PiBvcGVyYW5kcywgdW5rbm93blxuICAgKiAgICAgLS1rbm93biBra2sgb3AgPT4gW29wXSwgW11cbiAgICogICAgIG9wIC0ta25vd24ga2trID0+IFtvcF0sIFtdXG4gICAqICAgICBzdWIgLS11bmtub3duIHV1dSBvcCA9PiBbc3ViXSwgWy0tdW5rbm93biB1dXUgb3BdXG4gICAqICAgICBzdWIgLS0gLS11bmtub3duIHV1dSBvcCA9PiBbc3ViIC0tdW5rbm93biB1dXUgb3BdLCBbXVxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmd2XG4gICAqIEByZXR1cm4ge3tvcGVyYW5kczogc3RyaW5nW10sIHVua25vd246IHN0cmluZ1tdfX1cbiAgICovXG5cbiAgcGFyc2VPcHRpb25zKGFyZ3YpIHtcbiAgICBjb25zdCBvcGVyYW5kcyA9IFtdOyAvLyBvcGVyYW5kcywgbm90IG9wdGlvbnMgb3IgdmFsdWVzXG4gICAgY29uc3QgdW5rbm93biA9IFtdOyAvLyBmaXJzdCB1bmtub3duIG9wdGlvbiBhbmQgcmVtYWluaW5nIHVua25vd24gYXJnc1xuICAgIGxldCBkZXN0ID0gb3BlcmFuZHM7XG4gICAgY29uc3QgYXJncyA9IGFyZ3Yuc2xpY2UoKTtcblxuICAgIGZ1bmN0aW9uIG1heWJlT3B0aW9uKGFyZykge1xuICAgICAgcmV0dXJuIGFyZy5sZW5ndGggPiAxICYmIGFyZ1swXSA9PT0gJy0nO1xuICAgIH1cblxuICAgIC8vIHBhcnNlIG9wdGlvbnNcbiAgICBsZXQgYWN0aXZlVmFyaWFkaWNPcHRpb24gPSBudWxsO1xuICAgIHdoaWxlIChhcmdzLmxlbmd0aCkge1xuICAgICAgY29uc3QgYXJnID0gYXJncy5zaGlmdCgpO1xuXG4gICAgICAvLyBsaXRlcmFsXG4gICAgICBpZiAoYXJnID09PSAnLS0nKSB7XG4gICAgICAgIGlmIChkZXN0ID09PSB1bmtub3duKSBkZXN0LnB1c2goYXJnKTtcbiAgICAgICAgZGVzdC5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZVZhcmlhZGljT3B0aW9uICYmICFtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7YWN0aXZlVmFyaWFkaWNPcHRpb24ubmFtZSgpfWAsIGFyZyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgYWN0aXZlVmFyaWFkaWNPcHRpb24gPSBudWxsO1xuXG4gICAgICBpZiAobWF5YmVPcHRpb24oYXJnKSkge1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9maW5kT3B0aW9uKGFyZyk7XG4gICAgICAgIC8vIHJlY29nbmlzZWQgb3B0aW9uLCBjYWxsIGxpc3RlbmVyIHRvIGFzc2lnbiB2YWx1ZSB3aXRoIHBvc3NpYmxlIGN1c3RvbSBwcm9jZXNzaW5nXG4gICAgICAgIGlmIChvcHRpb24pIHtcbiAgICAgICAgICBpZiAob3B0aW9uLnJlcXVpcmVkKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB0aGlzLm9wdGlvbk1pc3NpbmdBcmd1bWVudChvcHRpb24pO1xuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGhpc3RvcmljYWwgYmVoYXZpb3VyIGlzIG9wdGlvbmFsIHZhbHVlIGlzIGZvbGxvd2luZyBhcmcgdW5sZXNzIGFuIG9wdGlvblxuICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCAmJiAhbWF5YmVPcHRpb24oYXJnc1swXSkpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSBhcmdzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmVtaXQoYG9wdGlvbjoke29wdGlvbi5uYW1lKCl9YCwgdmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBib29sZWFuIGZsYWdcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYWN0aXZlVmFyaWFkaWNPcHRpb24gPSBvcHRpb24udmFyaWFkaWMgPyBvcHRpb24gOiBudWxsO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIExvb2sgZm9yIGNvbWJvIG9wdGlvbnMgZm9sbG93aW5nIHNpbmdsZSBkYXNoLCBlYXQgZmlyc3Qgb25lIGlmIGtub3duLlxuICAgICAgaWYgKGFyZy5sZW5ndGggPiAyICYmIGFyZ1swXSA9PT0gJy0nICYmIGFyZ1sxXSAhPT0gJy0nKSB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2ZpbmRPcHRpb24oYC0ke2FyZ1sxXX1gKTtcbiAgICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG9wdGlvbi5yZXF1aXJlZCB8fFxuICAgICAgICAgICAgKG9wdGlvbi5vcHRpb25hbCAmJiB0aGlzLl9jb21iaW5lRmxhZ0FuZE9wdGlvbmFsVmFsdWUpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBvcHRpb24gd2l0aCB2YWx1ZSBmb2xsb3dpbmcgaW4gc2FtZSBhcmd1bWVudFxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb246JHtvcHRpb24ubmFtZSgpfWAsIGFyZy5zbGljZSgyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGJvb2xlYW4gb3B0aW9uLCBlbWl0IGFuZCBwdXQgYmFjayByZW1haW5kZXIgb2YgYXJnIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmdcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gKTtcbiAgICAgICAgICAgIGFyZ3MudW5zaGlmdChgLSR7YXJnLnNsaWNlKDIpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMb29rIGZvciBrbm93biBsb25nIGZsYWcgd2l0aCB2YWx1ZSwgbGlrZSAtLWZvbz1iYXJcbiAgICAgIGlmICgvXi0tW149XSs9Ly50ZXN0KGFyZykpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBhcmcuaW5kZXhPZignPScpO1xuICAgICAgICBjb25zdCBvcHRpb24gPSB0aGlzLl9maW5kT3B0aW9uKGFyZy5zbGljZSgwLCBpbmRleCkpO1xuICAgICAgICBpZiAob3B0aW9uICYmIChvcHRpb24ucmVxdWlyZWQgfHwgb3B0aW9uLm9wdGlvbmFsKSkge1xuICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uOiR7b3B0aW9uLm5hbWUoKX1gLCBhcmcuc2xpY2UoaW5kZXggKyAxKSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTm90IGEgcmVjb2duaXNlZCBvcHRpb24gYnkgdGhpcyBjb21tYW5kLlxuICAgICAgLy8gTWlnaHQgYmUgYSBjb21tYW5kLWFyZ3VtZW50LCBvciBzdWJjb21tYW5kIG9wdGlvbiwgb3IgdW5rbm93biBvcHRpb24sIG9yIGhlbHAgY29tbWFuZCBvciBvcHRpb24uXG5cbiAgICAgIC8vIEFuIHVua25vd24gb3B0aW9uIG1lYW5zIGZ1cnRoZXIgYXJndW1lbnRzIGFsc28gY2xhc3NpZmllZCBhcyB1bmtub3duIHNvIGNhbiBiZSByZXByb2Nlc3NlZCBieSBzdWJjb21tYW5kcy5cbiAgICAgIGlmIChtYXliZU9wdGlvbihhcmcpKSB7XG4gICAgICAgIGRlc3QgPSB1bmtub3duO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB1c2luZyBwb3NpdGlvbmFsT3B0aW9ucywgc3RvcCBwcm9jZXNzaW5nIG91ciBvcHRpb25zIGF0IHN1YmNvbW1hbmQuXG4gICAgICBpZiAoXG4gICAgICAgICh0aGlzLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyB8fCB0aGlzLl9wYXNzVGhyb3VnaE9wdGlvbnMpICYmXG4gICAgICAgIG9wZXJhbmRzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICB1bmtub3duLmxlbmd0aCA9PT0gMFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLl9maW5kQ29tbWFuZChhcmcpKSB7XG4gICAgICAgICAgb3BlcmFuZHMucHVzaChhcmcpO1xuICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHVua25vd24ucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICB0aGlzLl9nZXRIZWxwQ29tbWFuZCgpICYmXG4gICAgICAgICAgYXJnID09PSB0aGlzLl9nZXRIZWxwQ29tbWFuZCgpLm5hbWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICBvcGVyYW5kcy5wdXNoKGFyZyk7XG4gICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgb3BlcmFuZHMucHVzaCguLi5hcmdzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kZWZhdWx0Q29tbWFuZE5hbWUpIHtcbiAgICAgICAgICB1bmtub3duLnB1c2goYXJnKTtcbiAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB1bmtub3duLnB1c2goLi4uYXJncyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgdXNpbmcgcGFzc1Rocm91Z2hPcHRpb25zLCBzdG9wIHByb2Nlc3Npbmcgb3B0aW9ucyBhdCBmaXJzdCBjb21tYW5kLWFyZ3VtZW50LlxuICAgICAgaWYgKHRoaXMuX3Bhc3NUaHJvdWdoT3B0aW9ucykge1xuICAgICAgICBkZXN0LnB1c2goYXJnKTtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgZGVzdC5wdXNoKC4uLmFyZ3MpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIGFyZ1xuICAgICAgZGVzdC5wdXNoKGFyZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgb3BlcmFuZHMsIHVua25vd24gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbG9jYWwgb3B0aW9uIHZhbHVlcyBhcyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIG9wdHMoKSB7XG4gICAgaWYgKHRoaXMuX3N0b3JlT3B0aW9uc0FzUHJvcGVydGllcykge1xuICAgICAgLy8gUHJlc2VydmUgb3JpZ2luYWwgYmVoYXZpb3VyIHNvIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdoZW4gc3RpbGwgdXNpbmcgcHJvcGVydGllc1xuICAgICAgY29uc3QgcmVzdWx0ID0ge307XG4gICAgICBjb25zdCBsZW4gPSB0aGlzLm9wdGlvbnMubGVuZ3RoO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMub3B0aW9uc1tpXS5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICAgIHJlc3VsdFtrZXldID1cbiAgICAgICAgICBrZXkgPT09IHRoaXMuX3ZlcnNpb25PcHRpb25OYW1lID8gdGhpcy5fdmVyc2lvbiA6IHRoaXNba2V5XTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvblZhbHVlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgbWVyZ2VkIGxvY2FsIGFuZCBnbG9iYWwgb3B0aW9uIHZhbHVlcyBhcyBrZXktdmFsdWUgcGFpcnMuXG4gICAqXG4gICAqIEByZXR1cm4ge29iamVjdH1cbiAgICovXG4gIG9wdHNXaXRoR2xvYmFscygpIHtcbiAgICAvLyBnbG9iYWxzIG92ZXJ3cml0ZSBsb2NhbHNcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLnJlZHVjZShcbiAgICAgIChjb21iaW5lZE9wdGlvbnMsIGNtZCkgPT4gT2JqZWN0LmFzc2lnbihjb21iaW5lZE9wdGlvbnMsIGNtZC5vcHRzKCkpLFxuICAgICAge30sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwbGF5IGVycm9yIG1lc3NhZ2UgYW5kIGV4aXQgKG9yIGNhbGwgZXhpdE92ZXJyaWRlKS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAgICogQHBhcmFtIHtvYmplY3R9IFtlcnJvck9wdGlvbnNdXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZXJyb3JPcHRpb25zLmNvZGVdIC0gYW4gaWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3JcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtlcnJvck9wdGlvbnMuZXhpdENvZGVdIC0gdXNlZCB3aXRoIHByb2Nlc3MuZXhpdFxuICAgKi9cbiAgZXJyb3IobWVzc2FnZSwgZXJyb3JPcHRpb25zKSB7XG4gICAgLy8gb3V0cHV0IGhhbmRsaW5nXG4gICAgdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi5vdXRwdXRFcnJvcihcbiAgICAgIGAke21lc3NhZ2V9XFxuYCxcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIsXG4gICAgKTtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3Nob3dIZWxwQWZ0ZXJFcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVFcnIoYCR7dGhpcy5fc2hvd0hlbHBBZnRlckVycm9yfVxcbmApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc2hvd0hlbHBBZnRlckVycm9yKSB7XG4gICAgICB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlRXJyKCdcXG4nKTtcbiAgICAgIHRoaXMub3V0cHV0SGVscCh7IGVycm9yOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIGV4aXQgaGFuZGxpbmdcbiAgICBjb25zdCBjb25maWcgPSBlcnJvck9wdGlvbnMgfHwge307XG4gICAgY29uc3QgZXhpdENvZGUgPSBjb25maWcuZXhpdENvZGUgfHwgMTtcbiAgICBjb25zdCBjb2RlID0gY29uZmlnLmNvZGUgfHwgJ2NvbW1hbmRlci5lcnJvcic7XG4gICAgdGhpcy5fZXhpdChleGl0Q29kZSwgY29kZSwgbWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYW55IG9wdGlvbiByZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcywgaWYgb3B0aW9uIGRvZXNcbiAgICogbm90IGhhdmUgYSB2YWx1ZSBmcm9tIGNsaSBvciBjbGllbnQgY29kZS5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9wYXJzZU9wdGlvbnNFbnYoKSB7XG4gICAgdGhpcy5vcHRpb25zLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgaWYgKG9wdGlvbi5lbnZWYXIgJiYgb3B0aW9uLmVudlZhciBpbiBwcm9jZXNzLmVudikge1xuICAgICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgICAgICAvLyBQcmlvcml0eSBjaGVjay4gRG8gbm90IG92ZXJ3cml0ZSBjbGkgb3Igb3B0aW9ucyBmcm9tIHVua25vd24gc291cmNlIChjbGllbnQtY29kZSkuXG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIFsnZGVmYXVsdCcsICdjb25maWcnLCAnZW52J10uaW5jbHVkZXMoXG4gICAgICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSksXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAob3B0aW9uLnJlcXVpcmVkIHx8IG9wdGlvbi5vcHRpb25hbCkge1xuICAgICAgICAgICAgLy8gb3B0aW9uIGNhbiB0YWtlIGEgdmFsdWVcbiAgICAgICAgICAgIC8vIGtlZXAgdmVyeSBzaW1wbGUsIG9wdGlvbmFsIGFsd2F5cyB0YWtlcyB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5lbWl0KGBvcHRpb25FbnY6JHtvcHRpb24ubmFtZSgpfWAsIHByb2Nlc3MuZW52W29wdGlvbi5lbnZWYXJdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYm9vbGVhblxuICAgICAgICAgICAgLy8ga2VlcCB2ZXJ5IHNpbXBsZSwgb25seSBjYXJlIHRoYXQgZW52VmFyIGRlZmluZWQgYW5kIG5vdCB0aGUgdmFsdWVcbiAgICAgICAgICAgIHRoaXMuZW1pdChgb3B0aW9uRW52OiR7b3B0aW9uLm5hbWUoKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBseSBhbnkgaW1wbGllZCBvcHRpb24gdmFsdWVzLCBpZiBvcHRpb24gaXMgdW5kZWZpbmVkIG9yIGRlZmF1bHQgdmFsdWUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcGFyc2VPcHRpb25zSW1wbGllZCgpIHtcbiAgICBjb25zdCBkdWFsSGVscGVyID0gbmV3IER1YWxPcHRpb25zKHRoaXMub3B0aW9ucyk7XG4gICAgY29uc3QgaGFzQ3VzdG9tT3B0aW9uVmFsdWUgPSAob3B0aW9uS2V5KSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAhWydkZWZhdWx0JywgJ2ltcGxpZWQnXS5pbmNsdWRlcyh0aGlzLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSkpXG4gICAgICApO1xuICAgIH07XG4gICAgdGhpcy5vcHRpb25zXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAob3B0aW9uKSA9PlxuICAgICAgICAgIG9wdGlvbi5pbXBsaWVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBoYXNDdXN0b21PcHRpb25WYWx1ZShvcHRpb24uYXR0cmlidXRlTmFtZSgpKSAmJlxuICAgICAgICAgIGR1YWxIZWxwZXIudmFsdWVGcm9tT3B0aW9uKFxuICAgICAgICAgICAgdGhpcy5nZXRPcHRpb25WYWx1ZShvcHRpb24uYXR0cmlidXRlTmFtZSgpKSxcbiAgICAgICAgICAgIG9wdGlvbixcbiAgICAgICAgICApLFxuICAgICAgKVxuICAgICAgLmZvckVhY2goKG9wdGlvbikgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhvcHRpb24uaW1wbGllZClcbiAgICAgICAgICAuZmlsdGVyKChpbXBsaWVkS2V5KSA9PiAhaGFzQ3VzdG9tT3B0aW9uVmFsdWUoaW1wbGllZEtleSkpXG4gICAgICAgICAgLmZvckVhY2goKGltcGxpZWRLZXkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0T3B0aW9uVmFsdWVXaXRoU291cmNlKFxuICAgICAgICAgICAgICBpbXBsaWVkS2V5LFxuICAgICAgICAgICAgICBvcHRpb24uaW1wbGllZFtpbXBsaWVkS2V5XSxcbiAgICAgICAgICAgICAgJ2ltcGxpZWQnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFyZ3VtZW50IGBuYW1lYCBpcyBtaXNzaW5nLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBtaXNzaW5nQXJndW1lbnQobmFtZSkge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IG1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgJyR7bmFtZX0nYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5taXNzaW5nQXJndW1lbnQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBPcHRpb25gIGlzIG1pc3NpbmcgYW4gYXJndW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgb3B0aW9uTWlzc2luZ0FyZ3VtZW50KG9wdGlvbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IG9wdGlvbiAnJHtvcHRpb24uZmxhZ3N9JyBhcmd1bWVudCBtaXNzaW5nYDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5vcHRpb25NaXNzaW5nQXJndW1lbnQnIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGBPcHRpb25gIGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwgYW5kIGlzIGEgbWFuZGF0b3J5IG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHtPcHRpb259IG9wdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICBtaXNzaW5nTWFuZGF0b3J5T3B0aW9uVmFsdWUob3B0aW9uKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogcmVxdWlyZWQgb3B0aW9uICcke29wdGlvbi5mbGFnc30nIG5vdCBzcGVjaWZpZWRgO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLm1pc3NpbmdNYW5kYXRvcnlPcHRpb25WYWx1ZScgfSk7XG4gIH1cblxuICAvKipcbiAgICogYE9wdGlvbmAgY29uZmxpY3RzIHdpdGggYW5vdGhlciBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHBhcmFtIHtPcHRpb259IGNvbmZsaWN0aW5nT3B0aW9uXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY29uZmxpY3RpbmdPcHRpb24ob3B0aW9uLCBjb25mbGljdGluZ09wdGlvbikge1xuICAgIC8vIFRoZSBjYWxsaW5nIGNvZGUgZG9lcyBub3Qga25vdyB3aGV0aGVyIGEgbmVnYXRlZCBvcHRpb24gaXMgdGhlIHNvdXJjZSBvZiB0aGVcbiAgICAvLyB2YWx1ZSwgc28gZG8gc29tZSB3b3JrIHRvIHRha2UgYW4gZWR1Y2F0ZWQgZ3Vlc3MuXG4gICAgY29uc3QgZmluZEJlc3RPcHRpb25Gcm9tVmFsdWUgPSAob3B0aW9uKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb25LZXkgPSBvcHRpb24uYXR0cmlidXRlTmFtZSgpO1xuICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLmdldE9wdGlvblZhbHVlKG9wdGlvbktleSk7XG4gICAgICBjb25zdCBuZWdhdGl2ZU9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKFxuICAgICAgICAodGFyZ2V0KSA9PiB0YXJnZXQubmVnYXRlICYmIG9wdGlvbktleSA9PT0gdGFyZ2V0LmF0dHJpYnV0ZU5hbWUoKSxcbiAgICAgICk7XG4gICAgICBjb25zdCBwb3NpdGl2ZU9wdGlvbiA9IHRoaXMub3B0aW9ucy5maW5kKFxuICAgICAgICAodGFyZ2V0KSA9PiAhdGFyZ2V0Lm5lZ2F0ZSAmJiBvcHRpb25LZXkgPT09IHRhcmdldC5hdHRyaWJ1dGVOYW1lKCksXG4gICAgICApO1xuICAgICAgaWYgKFxuICAgICAgICBuZWdhdGl2ZU9wdGlvbiAmJlxuICAgICAgICAoKG5lZ2F0aXZlT3B0aW9uLnByZXNldEFyZyA9PT0gdW5kZWZpbmVkICYmIG9wdGlvblZhbHVlID09PSBmYWxzZSkgfHxcbiAgICAgICAgICAobmVnYXRpdmVPcHRpb24ucHJlc2V0QXJnICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG9wdGlvblZhbHVlID09PSBuZWdhdGl2ZU9wdGlvbi5wcmVzZXRBcmcpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBuZWdhdGl2ZU9wdGlvbjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwb3NpdGl2ZU9wdGlvbiB8fCBvcHRpb247XG4gICAgfTtcblxuICAgIGNvbnN0IGdldEVycm9yTWVzc2FnZSA9IChvcHRpb24pID0+IHtcbiAgICAgIGNvbnN0IGJlc3RPcHRpb24gPSBmaW5kQmVzdE9wdGlvbkZyb21WYWx1ZShvcHRpb24pO1xuICAgICAgY29uc3Qgb3B0aW9uS2V5ID0gYmVzdE9wdGlvbi5hdHRyaWJ1dGVOYW1lKCk7XG4gICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLmdldE9wdGlvblZhbHVlU291cmNlKG9wdGlvbktleSk7XG4gICAgICBpZiAoc291cmNlID09PSAnZW52Jykge1xuICAgICAgICByZXR1cm4gYGVudmlyb25tZW50IHZhcmlhYmxlICcke2Jlc3RPcHRpb24uZW52VmFyfSdgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGBvcHRpb24gJyR7YmVzdE9wdGlvbi5mbGFnc30nYDtcbiAgICB9O1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IGBlcnJvcjogJHtnZXRFcnJvck1lc3NhZ2Uob3B0aW9uKX0gY2Fubm90IGJlIHVzZWQgd2l0aCAke2dldEVycm9yTWVzc2FnZShjb25mbGljdGluZ09wdGlvbil9YDtcbiAgICB0aGlzLmVycm9yKG1lc3NhZ2UsIHsgY29kZTogJ2NvbW1hbmRlci5jb25mbGljdGluZ09wdGlvbicgfSk7XG4gIH1cblxuICAvKipcbiAgICogVW5rbm93biBvcHRpb24gYGZsYWdgLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZmxhZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cblxuICB1bmtub3duT3B0aW9uKGZsYWcpIHtcbiAgICBpZiAodGhpcy5fYWxsb3dVbmtub3duT3B0aW9uKSByZXR1cm47XG4gICAgbGV0IHN1Z2dlc3Rpb24gPSAnJztcblxuICAgIGlmIChmbGFnLnN0YXJ0c1dpdGgoJy0tJykgJiYgdGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yKSB7XG4gICAgICAvLyBMb29waW5nIHRvIHBpY2sgdXAgdGhlIGdsb2JhbCBvcHRpb25zIHRvb1xuICAgICAgbGV0IGNhbmRpZGF0ZUZsYWdzID0gW107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXNcbiAgICAgIGxldCBjb21tYW5kID0gdGhpcztcbiAgICAgIGRvIHtcbiAgICAgICAgY29uc3QgbW9yZUZsYWdzID0gY29tbWFuZFxuICAgICAgICAgIC5jcmVhdGVIZWxwKClcbiAgICAgICAgICAudmlzaWJsZU9wdGlvbnMoY29tbWFuZClcbiAgICAgICAgICAuZmlsdGVyKChvcHRpb24pID0+IG9wdGlvbi5sb25nKVxuICAgICAgICAgIC5tYXAoKG9wdGlvbikgPT4gb3B0aW9uLmxvbmcpO1xuICAgICAgICBjYW5kaWRhdGVGbGFncyA9IGNhbmRpZGF0ZUZsYWdzLmNvbmNhdChtb3JlRmxhZ3MpO1xuICAgICAgICBjb21tYW5kID0gY29tbWFuZC5wYXJlbnQ7XG4gICAgICB9IHdoaWxlIChjb21tYW5kICYmICFjb21tYW5kLl9lbmFibGVQb3NpdGlvbmFsT3B0aW9ucyk7XG4gICAgICBzdWdnZXN0aW9uID0gc3VnZ2VzdFNpbWlsYXIoZmxhZywgY2FuZGlkYXRlRmxhZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgZXJyb3I6IHVua25vd24gb3B0aW9uICcke2ZsYWd9JyR7c3VnZ2VzdGlvbn1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLnVua25vd25PcHRpb24nIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4Y2VzcyBhcmd1bWVudHMsIG1vcmUgdGhhbiBleHBlY3RlZC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gcmVjZWl2ZWRBcmdzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9leGNlc3NBcmd1bWVudHMocmVjZWl2ZWRBcmdzKSB7XG4gICAgaWYgKHRoaXMuX2FsbG93RXhjZXNzQXJndW1lbnRzKSByZXR1cm47XG5cbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGg7XG4gICAgY29uc3QgcyA9IGV4cGVjdGVkID09PSAxID8gJycgOiAncyc7XG4gICAgY29uc3QgZm9yU3ViY29tbWFuZCA9IHRoaXMucGFyZW50ID8gYCBmb3IgJyR7dGhpcy5uYW1lKCl9J2AgOiAnJztcbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiB0b28gbWFueSBhcmd1bWVudHMke2ZvclN1YmNvbW1hbmR9LiBFeHBlY3RlZCAke2V4cGVjdGVkfSBhcmd1bWVudCR7c30gYnV0IGdvdCAke3JlY2VpdmVkQXJncy5sZW5ndGh9LmA7XG4gICAgdGhpcy5lcnJvcihtZXNzYWdlLCB7IGNvZGU6ICdjb21tYW5kZXIuZXhjZXNzQXJndW1lbnRzJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmtub3duIGNvbW1hbmQuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIHVua25vd25Db21tYW5kKCkge1xuICAgIGNvbnN0IHVua25vd25OYW1lID0gdGhpcy5hcmdzWzBdO1xuICAgIGxldCBzdWdnZXN0aW9uID0gJyc7XG5cbiAgICBpZiAodGhpcy5fc2hvd1N1Z2dlc3Rpb25BZnRlckVycm9yKSB7XG4gICAgICBjb25zdCBjYW5kaWRhdGVOYW1lcyA9IFtdO1xuICAgICAgdGhpcy5jcmVhdGVIZWxwKClcbiAgICAgICAgLnZpc2libGVDb21tYW5kcyh0aGlzKVxuICAgICAgICAuZm9yRWFjaCgoY29tbWFuZCkgPT4ge1xuICAgICAgICAgIGNhbmRpZGF0ZU5hbWVzLnB1c2goY29tbWFuZC5uYW1lKCkpO1xuICAgICAgICAgIC8vIGp1c3QgdmlzaWJsZSBhbGlhc1xuICAgICAgICAgIGlmIChjb21tYW5kLmFsaWFzKCkpIGNhbmRpZGF0ZU5hbWVzLnB1c2goY29tbWFuZC5hbGlhcygpKTtcbiAgICAgICAgfSk7XG4gICAgICBzdWdnZXN0aW9uID0gc3VnZ2VzdFNpbWlsYXIodW5rbm93bk5hbWUsIGNhbmRpZGF0ZU5hbWVzKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gYGVycm9yOiB1bmtub3duIGNvbW1hbmQgJyR7dW5rbm93bk5hbWV9JyR7c3VnZ2VzdGlvbn1gO1xuICAgIHRoaXMuZXJyb3IobWVzc2FnZSwgeyBjb2RlOiAnY29tbWFuZGVyLnVua25vd25Db21tYW5kJyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBwcm9ncmFtIHZlcnNpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGF1dG8tcmVnaXN0ZXJzIHRoZSBcIi1WLCAtLXZlcnNpb25cIiBvcHRpb24gd2hpY2ggd2lsbCBwcmludCB0aGUgdmVyc2lvbiBudW1iZXIuXG4gICAqXG4gICAqIFlvdSBjYW4gb3B0aW9uYWxseSBzdXBwbHkgdGhlIGZsYWdzIGFuZCBkZXNjcmlwdGlvbiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXVxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2Rlc2NyaXB0aW9uXVxuICAgKiBAcmV0dXJuIHsodGhpcyB8IHN0cmluZyB8IHVuZGVmaW5lZCl9IGB0aGlzYCBjb21tYW5kIGZvciBjaGFpbmluZywgb3IgdmVyc2lvbiBzdHJpbmcgaWYgbm8gYXJndW1lbnRzXG4gICAqL1xuXG4gIHZlcnNpb24oc3RyLCBmbGFncywgZGVzY3JpcHRpb24pIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIHRoaXMuX3ZlcnNpb24gPSBzdHI7XG4gICAgZmxhZ3MgPSBmbGFncyB8fCAnLVYsIC0tdmVyc2lvbic7XG4gICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbiB8fCAnb3V0cHV0IHRoZSB2ZXJzaW9uIG51bWJlcic7XG4gICAgY29uc3QgdmVyc2lvbk9wdGlvbiA9IHRoaXMuY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG4gICAgdGhpcy5fdmVyc2lvbk9wdGlvbk5hbWUgPSB2ZXJzaW9uT3B0aW9uLmF0dHJpYnV0ZU5hbWUoKTtcbiAgICB0aGlzLl9yZWdpc3Rlck9wdGlvbih2ZXJzaW9uT3B0aW9uKTtcblxuICAgIHRoaXMub24oJ29wdGlvbjonICsgdmVyc2lvbk9wdGlvbi5uYW1lKCksICgpID0+IHtcbiAgICAgIHRoaXMuX291dHB1dENvbmZpZ3VyYXRpb24ud3JpdGVPdXQoYCR7c3RyfVxcbmApO1xuICAgICAgdGhpcy5fZXhpdCgwLCAnY29tbWFuZGVyLnZlcnNpb24nLCBzdHIpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZGVzY3JpcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyXVxuICAgKiBAcGFyYW0ge29iamVjdH0gW2FyZ3NEZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG4gIGRlc2NyaXB0aW9uKHN0ciwgYXJnc0Rlc2NyaXB0aW9uKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkICYmIGFyZ3NEZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gc3RyO1xuICAgIGlmIChhcmdzRGVzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuX2FyZ3NEZXNjcmlwdGlvbiA9IGFyZ3NEZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzdW1tYXJ5LiBVc2VkIHdoZW4gbGlzdGVkIGFzIHN1YmNvbW1hbmQgb2YgcGFyZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG4gIHN1bW1hcnkoc3RyKSB7XG4gICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5fc3VtbWFyeTtcbiAgICB0aGlzLl9zdW1tYXJ5ID0gc3RyO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhbiBhbGlhcyBmb3IgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIFlvdSBtYXkgY2FsbCBtb3JlIHRoYW4gb25jZSB0byBhZGQgbXVsdGlwbGUgYWxpYXNlcy4gT25seSB0aGUgZmlyc3QgYWxpYXMgaXMgc2hvd24gaW4gdGhlIGF1dG8tZ2VuZXJhdGVkIGhlbHAuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdXG4gICAqIEByZXR1cm4geyhzdHJpbmd8Q29tbWFuZCl9XG4gICAqL1xuXG4gIGFsaWFzKGFsaWFzKSB7XG4gICAgaWYgKGFsaWFzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9hbGlhc2VzWzBdOyAvLyBqdXN0IHJldHVybiBmaXJzdCwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cbiAgICAvKiogQHR5cGUge0NvbW1hbmR9ICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgbGV0IGNvbW1hbmQgPSB0aGlzO1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29tbWFuZHMubGVuZ3RoICE9PSAwICYmXG4gICAgICB0aGlzLmNvbW1hbmRzW3RoaXMuY29tbWFuZHMubGVuZ3RoIC0gMV0uX2V4ZWN1dGFibGVIYW5kbGVyXG4gICAgKSB7XG4gICAgICAvLyBhc3N1bWUgYWRkaW5nIGFsaWFzIGZvciBsYXN0IGFkZGVkIGV4ZWN1dGFibGUgc3ViY29tbWFuZCwgcmF0aGVyIHRoYW4gdGhpc1xuICAgICAgY29tbWFuZCA9IHRoaXMuY29tbWFuZHNbdGhpcy5jb21tYW5kcy5sZW5ndGggLSAxXTtcbiAgICB9XG5cbiAgICBpZiAoYWxpYXMgPT09IGNvbW1hbmQuX25hbWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb21tYW5kIGFsaWFzIGNhbid0IGJlIHRoZSBzYW1lIGFzIGl0cyBuYW1lXCIpO1xuICAgIGNvbnN0IG1hdGNoaW5nQ29tbWFuZCA9IHRoaXMucGFyZW50Py5fZmluZENvbW1hbmQoYWxpYXMpO1xuICAgIGlmIChtYXRjaGluZ0NvbW1hbmQpIHtcbiAgICAgIC8vIGMuZi4gX3JlZ2lzdGVyQ29tbWFuZFxuICAgICAgY29uc3QgZXhpc3RpbmdDbWQgPSBbbWF0Y2hpbmdDb21tYW5kLm5hbWUoKV1cbiAgICAgICAgLmNvbmNhdChtYXRjaGluZ0NvbW1hbmQuYWxpYXNlcygpKVxuICAgICAgICAuam9pbignfCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgY2Fubm90IGFkZCBhbGlhcyAnJHthbGlhc30nIHRvIGNvbW1hbmQgJyR7dGhpcy5uYW1lKCl9JyBhcyBhbHJlYWR5IGhhdmUgY29tbWFuZCAnJHtleGlzdGluZ0NtZH0nYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29tbWFuZC5fYWxpYXNlcy5wdXNoKGFsaWFzKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYWxpYXNlcyBmb3IgdGhlIGNvbW1hbmQuXG4gICAqXG4gICAqIE9ubHkgdGhlIGZpcnN0IGFsaWFzIGlzIHNob3duIGluIHRoZSBhdXRvLWdlbmVyYXRlZCBoZWxwLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYWxpYXNlc11cbiAgICogQHJldHVybiB7KHN0cmluZ1tdfENvbW1hbmQpfVxuICAgKi9cblxuICBhbGlhc2VzKGFsaWFzZXMpIHtcbiAgICAvLyBHZXR0ZXIgZm9yIHRoZSBhcnJheSBvZiBhbGlhc2VzIGlzIHRoZSBtYWluIHJlYXNvbiBmb3IgaGF2aW5nIGFsaWFzZXMoKSBpbiBhZGRpdGlvbiB0byBhbGlhcygpLlxuICAgIGlmIChhbGlhc2VzID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9hbGlhc2VzO1xuXG4gICAgYWxpYXNlcy5mb3JFYWNoKChhbGlhcykgPT4gdGhpcy5hbGlhcyhhbGlhcykpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCAvIGdldCB0aGUgY29tbWFuZCB1c2FnZSBgc3RyYC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJdXG4gICAqIEByZXR1cm4geyhzdHJpbmd8Q29tbWFuZCl9XG4gICAqL1xuXG4gIHVzYWdlKHN0cikge1xuICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuX3VzYWdlKSByZXR1cm4gdGhpcy5fdXNhZ2U7XG5cbiAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLnJlZ2lzdGVyZWRBcmd1bWVudHMubWFwKChhcmcpID0+IHtcbiAgICAgICAgcmV0dXJuIGh1bWFuUmVhZGFibGVBcmdOYW1lKGFyZyk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXVxuICAgICAgICAuY29uY2F0KFxuICAgICAgICAgIHRoaXMub3B0aW9ucy5sZW5ndGggfHwgdGhpcy5faGVscE9wdGlvbiAhPT0gbnVsbCA/ICdbb3B0aW9uc10nIDogW10sXG4gICAgICAgICAgdGhpcy5jb21tYW5kcy5sZW5ndGggPyAnW2NvbW1hbmRdJyA6IFtdLFxuICAgICAgICAgIHRoaXMucmVnaXN0ZXJlZEFyZ3VtZW50cy5sZW5ndGggPyBhcmdzIDogW10sXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICB0aGlzLl91c2FnZSA9IHN0cjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cl1cbiAgICogQHJldHVybiB7KHN0cmluZ3xDb21tYW5kKX1cbiAgICovXG5cbiAgbmFtZShzdHIpIHtcbiAgICBpZiAoc3RyID09PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9uYW1lO1xuICAgIHRoaXMuX25hbWUgPSBzdHI7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGZyb20gc2NyaXB0IGZpbGVuYW1lLCBzdWNoIGFzIHByb2Nlc3MuYXJndlsxXSxcbiAgICogb3IgcmVxdWlyZS5tYWluLmZpbGVuYW1lLCBvciBfX2ZpbGVuYW1lLlxuICAgKlxuICAgKiAoVXNlZCBpbnRlcm5hbGx5IGFuZCBwdWJsaWMgYWx0aG91Z2ggbm90IGRvY3VtZW50ZWQgaW4gUkVBRE1FLilcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogcHJvZ3JhbS5uYW1lRnJvbUZpbGVuYW1lKHJlcXVpcmUubWFpbi5maWxlbmFtZSk7XG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlbmFtZVxuICAgKiBAcmV0dXJuIHtDb21tYW5kfVxuICAgKi9cblxuICBuYW1lRnJvbUZpbGVuYW1lKGZpbGVuYW1lKSB7XG4gICAgdGhpcy5fbmFtZSA9IHBhdGguYmFzZW5hbWUoZmlsZW5hbWUsIHBhdGguZXh0bmFtZShmaWxlbmFtZSkpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgZGlyZWN0b3J5IGZvciBzZWFyY2hpbmcgZm9yIGV4ZWN1dGFibGUgc3ViY29tbWFuZHMgb2YgdGhpcyBjb21tYW5kLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBwcm9ncmFtLmV4ZWN1dGFibGVEaXIoX19kaXJuYW1lKTtcbiAgICogLy8gb3JcbiAgICogcHJvZ3JhbS5leGVjdXRhYmxlRGlyKCdzdWJjb21tYW5kcycpO1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqIEByZXR1cm4geyhzdHJpbmd8bnVsbHxDb21tYW5kKX1cbiAgICovXG5cbiAgZXhlY3V0YWJsZURpcihwYXRoKSB7XG4gICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuX2V4ZWN1dGFibGVEaXI7XG4gICAgdGhpcy5fZXhlY3V0YWJsZURpciA9IHBhdGg7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHByb2dyYW0gaGVscCBkb2N1bWVudGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge3sgZXJyb3I6IGJvb2xlYW4gfX0gW2NvbnRleHRPcHRpb25zXSAtIHBhc3Mge2Vycm9yOnRydWV9IHRvIHdyYXAgZm9yIHN0ZGVyciBpbnN0ZWFkIG9mIHN0ZG91dFxuICAgKiBAcmV0dXJuIHtzdHJpbmd9XG4gICAqL1xuXG4gIGhlbHBJbmZvcm1hdGlvbihjb250ZXh0T3B0aW9ucykge1xuICAgIGNvbnN0IGhlbHBlciA9IHRoaXMuY3JlYXRlSGVscCgpO1xuICAgIGlmIChoZWxwZXIuaGVscFdpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlbHBlci5oZWxwV2lkdGggPVxuICAgICAgICBjb250ZXh0T3B0aW9ucyAmJiBjb250ZXh0T3B0aW9ucy5lcnJvclxuICAgICAgICAgID8gdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRFcnJIZWxwV2lkdGgoKVxuICAgICAgICAgIDogdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRPdXRIZWxwV2lkdGgoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhlbHBlci5mb3JtYXRIZWxwKHRoaXMsIGhlbHBlcik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgX2dldEhlbHBDb250ZXh0KGNvbnRleHRPcHRpb25zKSB7XG4gICAgY29udGV4dE9wdGlvbnMgPSBjb250ZXh0T3B0aW9ucyB8fCB7fTtcbiAgICBjb25zdCBjb250ZXh0ID0geyBlcnJvcjogISFjb250ZXh0T3B0aW9ucy5lcnJvciB9O1xuICAgIGxldCB3cml0ZTtcbiAgICBpZiAoY29udGV4dC5lcnJvcikge1xuICAgICAgd3JpdGUgPSAoYXJnKSA9PiB0aGlzLl9vdXRwdXRDb25maWd1cmF0aW9uLndyaXRlRXJyKGFyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdyaXRlID0gKGFyZykgPT4gdGhpcy5fb3V0cHV0Q29uZmlndXJhdGlvbi53cml0ZU91dChhcmcpO1xuICAgIH1cbiAgICBjb250ZXh0LndyaXRlID0gY29udGV4dE9wdGlvbnMud3JpdGUgfHwgd3JpdGU7XG4gICAgY29udGV4dC5jb21tYW5kID0gdGhpcztcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdXRwdXQgaGVscCBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21tYW5kLlxuICAgKlxuICAgKiBPdXRwdXRzIGJ1aWx0LWluIGhlbHAsIGFuZCBjdXN0b20gdGV4dCBhZGRlZCB1c2luZyBgLmFkZEhlbHBUZXh0KClgLlxuICAgKlxuICAgKiBAcGFyYW0ge3sgZXJyb3I6IGJvb2xlYW4gfSB8IEZ1bmN0aW9ufSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JpdGUgdG8gc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqL1xuXG4gIG91dHB1dEhlbHAoY29udGV4dE9wdGlvbnMpIHtcbiAgICBsZXQgZGVwcmVjYXRlZENhbGxiYWNrO1xuICAgIGlmICh0eXBlb2YgY29udGV4dE9wdGlvbnMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGRlcHJlY2F0ZWRDYWxsYmFjayA9IGNvbnRleHRPcHRpb25zO1xuICAgICAgY29udGV4dE9wdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLl9nZXRIZWxwQ29udGV4dChjb250ZXh0T3B0aW9ucyk7XG5cbiAgICB0aGlzLl9nZXRDb21tYW5kQW5kQW5jZXN0b3JzKClcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5mb3JFYWNoKChjb21tYW5kKSA9PiBjb21tYW5kLmVtaXQoJ2JlZm9yZUFsbEhlbHAnLCBjb250ZXh0KSk7XG4gICAgdGhpcy5lbWl0KCdiZWZvcmVIZWxwJywgY29udGV4dCk7XG5cbiAgICBsZXQgaGVscEluZm9ybWF0aW9uID0gdGhpcy5oZWxwSW5mb3JtYXRpb24oY29udGV4dCk7XG4gICAgaWYgKGRlcHJlY2F0ZWRDYWxsYmFjaykge1xuICAgICAgaGVscEluZm9ybWF0aW9uID0gZGVwcmVjYXRlZENhbGxiYWNrKGhlbHBJbmZvcm1hdGlvbik7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBoZWxwSW5mb3JtYXRpb24gIT09ICdzdHJpbmcnICYmXG4gICAgICAgICFCdWZmZXIuaXNCdWZmZXIoaGVscEluZm9ybWF0aW9uKVxuICAgICAgKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3V0cHV0SGVscCBjYWxsYmFjayBtdXN0IHJldHVybiBhIHN0cmluZyBvciBhIEJ1ZmZlcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb250ZXh0LndyaXRlKGhlbHBJbmZvcm1hdGlvbik7XG5cbiAgICBpZiAodGhpcy5fZ2V0SGVscE9wdGlvbigpPy5sb25nKSB7XG4gICAgICB0aGlzLmVtaXQodGhpcy5fZ2V0SGVscE9wdGlvbigpLmxvbmcpOyAvLyBkZXByZWNhdGVkXG4gICAgfVxuICAgIHRoaXMuZW1pdCgnYWZ0ZXJIZWxwJywgY29udGV4dCk7XG4gICAgdGhpcy5fZ2V0Q29tbWFuZEFuZEFuY2VzdG9ycygpLmZvckVhY2goKGNvbW1hbmQpID0+XG4gICAgICBjb21tYW5kLmVtaXQoJ2FmdGVyQWxsSGVscCcsIGNvbnRleHQpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogWW91IGNhbiBwYXNzIGluIGZsYWdzIGFuZCBhIGRlc2NyaXB0aW9uIHRvIGN1c3RvbWlzZSB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqIFBhc3MgaW4gZmFsc2UgdG8gZGlzYWJsZSB0aGUgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHByb2dyYW0uaGVscE9wdGlvbignLT8sIC0taGVscCcgJ3Nob3cgaGVscCcpOyAvLyBjdXN0b21pc2VcbiAgICogcHJvZ3JhbS5oZWxwT3B0aW9uKGZhbHNlKTsgLy8gZGlzYWJsZVxuICAgKlxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBib29sZWFuKX0gZmxhZ3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl1cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuXG4gIGhlbHBPcHRpb24oZmxhZ3MsIGRlc2NyaXB0aW9uKSB7XG4gICAgLy8gU3VwcG9ydCBkaXNhYmxpbmcgYnVpbHQtaW4gaGVscCBvcHRpb24uXG4gICAgaWYgKHR5cGVvZiBmbGFncyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBpZiAoZmxhZ3MpIHtcbiAgICAgICAgdGhpcy5faGVscE9wdGlvbiA9IHRoaXMuX2hlbHBPcHRpb24gPz8gdW5kZWZpbmVkOyAvLyBwcmVzZXJ2ZSBleGlzdGluZyBvcHRpb25cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hlbHBPcHRpb24gPSBudWxsOyAvLyBkaXNhYmxlXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBDdXN0b21pc2UgZmxhZ3MgYW5kIGRlc2NyaXB0aW9uLlxuICAgIGZsYWdzID0gZmxhZ3MgPz8gJy1oLCAtLWhlbHAnO1xuICAgIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24gPz8gJ2Rpc3BsYXkgaGVscCBmb3IgY29tbWFuZCc7XG4gICAgdGhpcy5faGVscE9wdGlvbiA9IHRoaXMuY3JlYXRlT3B0aW9uKGZsYWdzLCBkZXNjcmlwdGlvbik7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXp5IGNyZWF0ZSBoZWxwIG9wdGlvbi5cbiAgICogUmV0dXJucyBudWxsIGlmIGhhcyBiZWVuIGRpc2FibGVkIHdpdGggLmhlbHBPcHRpb24oZmFsc2UpLlxuICAgKlxuICAgKiBAcmV0dXJucyB7KE9wdGlvbiB8IG51bGwpfSB0aGUgaGVscCBvcHRpb25cbiAgICogQHBhY2thZ2VcbiAgICovXG4gIF9nZXRIZWxwT3B0aW9uKCkge1xuICAgIC8vIExhenkgY3JlYXRlIGhlbHAgb3B0aW9uIG9uIGRlbWFuZC5cbiAgICBpZiAodGhpcy5faGVscE9wdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmhlbHBPcHRpb24odW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faGVscE9wdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdXBwbHkgeW91ciBvd24gb3B0aW9uIHRvIHVzZSBmb3IgdGhlIGJ1aWx0LWluIGhlbHAgb3B0aW9uLlxuICAgKiBUaGlzIGlzIGFuIGFsdGVybmF0aXZlIHRvIHVzaW5nIGhlbHBPcHRpb24oKSB0byBjdXN0b21pc2UgdGhlIGZsYWdzIGFuZCBkZXNjcmlwdGlvbiBldGMuXG4gICAqXG4gICAqIEBwYXJhbSB7T3B0aW9ufSBvcHRpb25cbiAgICogQHJldHVybiB7Q29tbWFuZH0gYHRoaXNgIGNvbW1hbmQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBhZGRIZWxwT3B0aW9uKG9wdGlvbikge1xuICAgIHRoaXMuX2hlbHBPcHRpb24gPSBvcHRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gYW5kIGV4aXQuXG4gICAqXG4gICAqIE91dHB1dHMgYnVpbHQtaW4gaGVscCwgYW5kIGN1c3RvbSB0ZXh0IGFkZGVkIHVzaW5nIGAuYWRkSGVscFRleHQoKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7eyBlcnJvcjogYm9vbGVhbiB9fSBbY29udGV4dE9wdGlvbnNdIC0gcGFzcyB7ZXJyb3I6dHJ1ZX0gdG8gd3JpdGUgdG8gc3RkZXJyIGluc3RlYWQgb2Ygc3Rkb3V0XG4gICAqL1xuXG4gIGhlbHAoY29udGV4dE9wdGlvbnMpIHtcbiAgICB0aGlzLm91dHB1dEhlbHAoY29udGV4dE9wdGlvbnMpO1xuICAgIGxldCBleGl0Q29kZSA9IHByb2Nlc3MuZXhpdENvZGUgfHwgMDtcbiAgICBpZiAoXG4gICAgICBleGl0Q29kZSA9PT0gMCAmJlxuICAgICAgY29udGV4dE9wdGlvbnMgJiZcbiAgICAgIHR5cGVvZiBjb250ZXh0T3B0aW9ucyAhPT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgY29udGV4dE9wdGlvbnMuZXJyb3JcbiAgICApIHtcbiAgICAgIGV4aXRDb2RlID0gMTtcbiAgICB9XG4gICAgLy8gbWVzc2FnZTogZG8gbm90IGhhdmUgYWxsIGRpc3BsYXllZCB0ZXh0IGF2YWlsYWJsZSBzbyBvbmx5IHBhc3NpbmcgcGxhY2Vob2xkZXIuXG4gICAgdGhpcy5fZXhpdChleGl0Q29kZSwgJ2NvbW1hbmRlci5oZWxwJywgJyhvdXRwdXRIZWxwKScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhZGRpdGlvbmFsIHRleHQgdG8gYmUgZGlzcGxheWVkIHdpdGggdGhlIGJ1aWx0LWluIGhlbHAuXG4gICAqXG4gICAqIFBvc2l0aW9uIGlzICdiZWZvcmUnIG9yICdhZnRlcicgdG8gYWZmZWN0IGp1c3QgdGhpcyBjb21tYW5kLFxuICAgKiBhbmQgJ2JlZm9yZUFsbCcgb3IgJ2FmdGVyQWxsJyB0byBhZmZlY3QgdGhpcyBjb21tYW5kIGFuZCBhbGwgaXRzIHN1YmNvbW1hbmRzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcG9zaXRpb24gLSBiZWZvcmUgb3IgYWZ0ZXIgYnVpbHQtaW4gaGVscFxuICAgKiBAcGFyYW0geyhzdHJpbmcgfCBGdW5jdGlvbil9IHRleHQgLSBzdHJpbmcgdG8gYWRkLCBvciBhIGZ1bmN0aW9uIHJldHVybmluZyBhIHN0cmluZ1xuICAgKiBAcmV0dXJuIHtDb21tYW5kfSBgdGhpc2AgY29tbWFuZCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGFkZEhlbHBUZXh0KHBvc2l0aW9uLCB0ZXh0KSB7XG4gICAgY29uc3QgYWxsb3dlZFZhbHVlcyA9IFsnYmVmb3JlQWxsJywgJ2JlZm9yZScsICdhZnRlcicsICdhZnRlckFsbCddO1xuICAgIGlmICghYWxsb3dlZFZhbHVlcy5pbmNsdWRlcyhwb3NpdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSBmb3IgcG9zaXRpb24gdG8gYWRkSGVscFRleHQuXG5FeHBlY3Rpbmcgb25lIG9mICcke2FsbG93ZWRWYWx1ZXMuam9pbihcIicsICdcIil9J2ApO1xuICAgIH1cbiAgICBjb25zdCBoZWxwRXZlbnQgPSBgJHtwb3NpdGlvbn1IZWxwYDtcbiAgICB0aGlzLm9uKGhlbHBFdmVudCwgKGNvbnRleHQpID0+IHtcbiAgICAgIGxldCBoZWxwU3RyO1xuICAgICAgaWYgKHR5cGVvZiB0ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGhlbHBTdHIgPSB0ZXh0KHsgZXJyb3I6IGNvbnRleHQuZXJyb3IsIGNvbW1hbmQ6IGNvbnRleHQuY29tbWFuZCB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGhlbHBTdHIgPSB0ZXh0O1xuICAgICAgfVxuICAgICAgLy8gSWdub3JlIGZhbHN5IHZhbHVlIHdoZW4gbm90aGluZyB0byBvdXRwdXQuXG4gICAgICBpZiAoaGVscFN0cikge1xuICAgICAgICBjb250ZXh0LndyaXRlKGAke2hlbHBTdHJ9XFxuYCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0IGhlbHAgaW5mb3JtYXRpb24gaWYgaGVscCBmbGFncyBzcGVjaWZpZWRcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gYXJncyAtIGFycmF5IG9mIG9wdGlvbnMgdG8gc2VhcmNoIGZvciBoZWxwIGZsYWdzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuXG4gIF9vdXRwdXRIZWxwSWZSZXF1ZXN0ZWQoYXJncykge1xuICAgIGNvbnN0IGhlbHBPcHRpb24gPSB0aGlzLl9nZXRIZWxwT3B0aW9uKCk7XG4gICAgY29uc3QgaGVscFJlcXVlc3RlZCA9IGhlbHBPcHRpb24gJiYgYXJncy5maW5kKChhcmcpID0+IGhlbHBPcHRpb24uaXMoYXJnKSk7XG4gICAgaWYgKGhlbHBSZXF1ZXN0ZWQpIHtcbiAgICAgIHRoaXMub3V0cHV0SGVscCgpO1xuICAgICAgLy8gKERvIG5vdCBoYXZlIGFsbCBkaXNwbGF5ZWQgdGV4dCBhdmFpbGFibGUgc28gb25seSBwYXNzaW5nIHBsYWNlaG9sZGVyLilcbiAgICAgIHRoaXMuX2V4aXQoMCwgJ2NvbW1hbmRlci5oZWxwRGlzcGxheWVkJywgJyhvdXRwdXRIZWxwKScpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFNjYW4gYXJndW1lbnRzIGFuZCBpbmNyZW1lbnQgcG9ydCBudW1iZXIgZm9yIGluc3BlY3QgY2FsbHMgKHRvIGF2b2lkIGNvbmZsaWN0cyB3aGVuIHNwYXduaW5nIG5ldyBjb21tYW5kKS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhcmdzIC0gYXJyYXkgb2YgYXJndW1lbnRzIGZyb20gbm9kZS5leGVjQXJndlxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICogQHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBpbmNyZW1lbnROb2RlSW5zcGVjdG9yUG9ydChhcmdzKSB7XG4gIC8vIFRlc3RpbmcgZm9yIHRoZXNlIG9wdGlvbnM6XG4gIC8vICAtLWluc3BlY3RbPVtob3N0Ol1wb3J0XVxuICAvLyAgLS1pbnNwZWN0LWJya1s9W2hvc3Q6XXBvcnRdXG4gIC8vICAtLWluc3BlY3QtcG9ydD1baG9zdDpdcG9ydFxuICByZXR1cm4gYXJncy5tYXAoKGFyZykgPT4ge1xuICAgIGlmICghYXJnLnN0YXJ0c1dpdGgoJy0taW5zcGVjdCcpKSB7XG4gICAgICByZXR1cm4gYXJnO1xuICAgIH1cbiAgICBsZXQgZGVidWdPcHRpb247XG4gICAgbGV0IGRlYnVnSG9zdCA9ICcxMjcuMC4wLjEnO1xuICAgIGxldCBkZWJ1Z1BvcnQgPSAnOTIyOSc7XG4gICAgbGV0IG1hdGNoO1xuICAgIGlmICgobWF0Y2ggPSBhcmcubWF0Y2goL14oLS1pbnNwZWN0KC1icmspPykkLykpICE9PSBudWxsKSB7XG4gICAgICAvLyBlLmcuIC0taW5zcGVjdFxuICAgICAgZGVidWdPcHRpb24gPSBtYXRjaFsxXTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgKG1hdGNoID0gYXJnLm1hdGNoKC9eKC0taW5zcGVjdCgtYnJrfC1wb3J0KT8pPShbXjpdKykkLykpICE9PSBudWxsXG4gICAgKSB7XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgICAgaWYgKC9eXFxkKyQvLnRlc3QobWF0Y2hbM10pKSB7XG4gICAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PTEyMzRcbiAgICAgICAgZGVidWdQb3J0ID0gbWF0Y2hbM107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBlLmcuIC0taW5zcGVjdD1sb2NhbGhvc3RcbiAgICAgICAgZGVidWdIb3N0ID0gbWF0Y2hbM107XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIChtYXRjaCA9IGFyZy5tYXRjaCgvXigtLWluc3BlY3QoLWJya3wtcG9ydCk/KT0oW146XSspOihcXGQrKSQvKSkgIT09IG51bGxcbiAgICApIHtcbiAgICAgIC8vIGUuZy4gLS1pbnNwZWN0PWxvY2FsaG9zdDoxMjM0XG4gICAgICBkZWJ1Z09wdGlvbiA9IG1hdGNoWzFdO1xuICAgICAgZGVidWdIb3N0ID0gbWF0Y2hbM107XG4gICAgICBkZWJ1Z1BvcnQgPSBtYXRjaFs0XTtcbiAgICB9XG5cbiAgICBpZiAoZGVidWdPcHRpb24gJiYgZGVidWdQb3J0ICE9PSAnMCcpIHtcbiAgICAgIHJldHVybiBgJHtkZWJ1Z09wdGlvbn09JHtkZWJ1Z0hvc3R9OiR7cGFyc2VJbnQoZGVidWdQb3J0KSArIDF9YDtcbiAgICB9XG4gICAgcmV0dXJuIGFyZztcbiAgfSk7XG59XG5cbmV4cG9ydHMuQ29tbWFuZCA9IENvbW1hbmQ7XG4iLAogICAgImNvbnN0IHsgQXJndW1lbnQgfSA9IHJlcXVpcmUoJy4vbGliL2FyZ3VtZW50LmpzJyk7XG5jb25zdCB7IENvbW1hbmQgfSA9IHJlcXVpcmUoJy4vbGliL2NvbW1hbmQuanMnKTtcbmNvbnN0IHsgQ29tbWFuZGVyRXJyb3IsIEludmFsaWRBcmd1bWVudEVycm9yIH0gPSByZXF1aXJlKCcuL2xpYi9lcnJvci5qcycpO1xuY29uc3QgeyBIZWxwIH0gPSByZXF1aXJlKCcuL2xpYi9oZWxwLmpzJyk7XG5jb25zdCB7IE9wdGlvbiB9ID0gcmVxdWlyZSgnLi9saWIvb3B0aW9uLmpzJyk7XG5cbmV4cG9ydHMucHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbmV4cG9ydHMuY3JlYXRlQ29tbWFuZCA9IChuYW1lKSA9PiBuZXcgQ29tbWFuZChuYW1lKTtcbmV4cG9ydHMuY3JlYXRlT3B0aW9uID0gKGZsYWdzLCBkZXNjcmlwdGlvbikgPT4gbmV3IE9wdGlvbihmbGFncywgZGVzY3JpcHRpb24pO1xuZXhwb3J0cy5jcmVhdGVBcmd1bWVudCA9IChuYW1lLCBkZXNjcmlwdGlvbikgPT4gbmV3IEFyZ3VtZW50KG5hbWUsIGRlc2NyaXB0aW9uKTtcblxuLyoqXG4gKiBFeHBvc2UgY2xhc3Nlc1xuICovXG5cbmV4cG9ydHMuQ29tbWFuZCA9IENvbW1hbmQ7XG5leHBvcnRzLk9wdGlvbiA9IE9wdGlvbjtcbmV4cG9ydHMuQXJndW1lbnQgPSBBcmd1bWVudDtcbmV4cG9ydHMuSGVscCA9IEhlbHA7XG5cbmV4cG9ydHMuQ29tbWFuZGVyRXJyb3IgPSBDb21tYW5kZXJFcnJvcjtcbmV4cG9ydHMuSW52YWxpZEFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjtcbmV4cG9ydHMuSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IgPSBJbnZhbGlkQXJndW1lbnRFcnJvcjsgLy8gRGVwcmVjYXRlZFxuIiwKICAgICJpbXBvcnQgeyAkIH0gZnJvbSBcImJ1blwiO1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBzdGFydERldlNlcnZlciB9IGZyb20gXCIuLi9zZXJ2ZXIvZGV2XCI7XG5pbXBvcnQgeyBzdGFydFByb2RTZXJ2ZXIgfSBmcm9tIFwiLi4vc2VydmVyL3Byb2RcIjtcbmltcG9ydCBjcmVhdGVSb2xsdXBJbnB1dCBmcm9tIFwiLi9jcmVhdGVSb2xsdXBJbnB1dFwiO1xuaW1wb3J0IHsgYnVpbGQgfSBmcm9tIFwidml0ZVwiO1xuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSBcImNvbW1hbmRlclwiO1xuXG5wcm9ncmFtLmNvbW1hbmQoXCJkZXZcIikuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgY29uc29sZS5sb2coXCJTdGFydGluZyBkZXYgc2VydmVyLi4uXCIpO1xuICBhd2FpdCBzdGFydERldlNlcnZlcigpO1xufSk7XG5cbnByb2dyYW0uY29tbWFuZChcImJ1aWxkXCIpLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gIHByb2Nlc3MuZW52Lk5PREVfRU5WID0gXCJwcm9kdWN0aW9uXCI7XG4gIGNvbnN0IGlucHV0ID0gYXdhaXQgY3JlYXRlUm9sbHVwSW5wdXQoKTtcbiAgY29uc3Qgcm9vdERpciA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpKTtcbiAgY29uc3QgYXBwRGlyID0gcGF0aC5qb2luKHJvb3REaXIsIFwiYXBwXCIpO1xuXG4gIGNvbnNvbGUubG9nKFwiQnVpbGRpbmcgY2xpZW50Li4uXCIpO1xuXG4gIGF3YWl0ICRgR0VNSV9JTlBVVD0ke0pTT04uc3RyaW5naWZ5KGlucHV0KX0gdml0ZSBidWlsZCAtLW91dERpciBkaXN0L2NsaWVudGA7XG5cbiAgY29uc29sZS5sb2coXCJCdWlsZGluZyBzZXJ2ZXIuLi5cIik7XG4gIHRyeSB7XG4gICAgcHJvY2Vzcy5lbnYuR0VNSV9JTlBVVCA9IEpTT04uc3RyaW5naWZ5KGlucHV0KTtcbiAgICBhd2FpdCBidWlsZCh7XG4gICAgICBidWlsZDoge1xuICAgICAgICBzc3I6IHRydWUsXG4gICAgICAgIG91dERpcjogXCJkaXN0L3NlcnZlclwiLFxuICAgICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgICAgaW5wdXQ6IFwiYXBwL2Jvb3RzdHJhcC50c1wiLFxuICAgICAgICAgIGV4dGVybmFsOiBbXCJidW5cIiwgXCJyZWFjdFwiLCBcInJlYWN0LWRvbVwiLCBcInJlYWN0L2pzeC1ydW50aW1lXCIsIFwiZ2VtaVwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXNvbHZlOiB7XG4gICAgICAgIGFsaWFzOiB7XG4gICAgICAgICAgXCJAL2FwcFwiOiBhcHBEaXIsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coXCJCdWlsZCBzdWNjZWVkZWRcIik7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUubG9nKGVycik7XG4gIH1cbiAgcHJvY2Vzcy5leGl0KCk7XG59KTtcblxucHJvZ3JhbS5jb21tYW5kKFwic3RhcnRcIikuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPSBcInByb2R1Y3Rpb25cIjtcblxuICBhd2FpdCAkYGVjaG8gXCJTdGFydGluZyBzZXJ2ZXIuLi5cImA7XG4gIGF3YWl0IHN0YXJ0UHJvZFNlcnZlcigpO1xufSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiIsCiAgICAiaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gXCIuLi9hcHAvQXBwXCI7XG5pbXBvcnQgeyBjcmVhdGVTdHlsZXMgfSBmcm9tIFwiLi9zdHlsZXNcIjtcbmltcG9ydCB7IGltYWdlSGFuZGxlciB9IGZyb20gXCIuL2ltYWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgcmVuZGVyRXJyb3JQYWdlIH0gZnJvbSBcIi4vcmVuZGVyRXJyb3JQYWdlXCI7XG5pbXBvcnQgeyBTZXJ2ZSB9IGZyb20gXCJidW5cIjtcblxuY29uc3Qgcm9vdERpciA9IHByb2Nlc3MuY3dkKCk7XG5jb25zdCBhcHBEaXIgPSBqb2luKHJvb3REaXIsIFwiYXBwXCIpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoKSB7XG4gIGNvbnN0IHJvb3QgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gIGNvbnN0IHZpdGUgPSBhd2FpdCAoXG4gICAgYXdhaXQgaW1wb3J0KFwidml0ZVwiKVxuICApLmNyZWF0ZVNlcnZlcih7XG4gICAgcm9vdCxcbiAgICBsb2dMZXZlbDogXCJlcnJvclwiLFxuICAgIHNlcnZlcjoge1xuICAgICAgd2F0Y2g6IHtcbiAgICAgICAgdXNlUG9sbGluZzogdHJ1ZSxcbiAgICAgICAgaW50ZXJ2YWw6IDEwMCxcbiAgICAgIH0sXG4gICAgICBobXI6IHtcbiAgICAgICAgY2xpZW50UG9ydDogNTE3NCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgIFwiQC9hcHBcIjogYXBwRGlyLFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcblxuICBwcm9jZXNzLmVudi5ST09UX0RJUiA9IHJvb3REaXI7XG4gIHByb2Nlc3MuZW52LkFQUF9ESVIgPSBhcHBEaXI7XG5cbiAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlRGV2UmVxdWVzdHMocmVxOiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcGF0aG5hbWUgfSA9IG5ldyBVUkwocmVxLnVybCk7XG4gICAgaWYgKHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvcmVmcmVzaC5qc1wiKSkge1xuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICAgICAgYFxuICAgICAgICAgIGltcG9ydCBSZWZyZXNoUnVudGltZSBmcm9tIFwiaHR0cDovL2xvY2FsaG9zdDo1MTczL0ByZWFjdC1yZWZyZXNoXCI7XG4gICAgICAgICAgUmVmcmVzaFJ1bnRpbWUuaW5qZWN0SW50b0dsb2JhbEhvb2sod2luZG93KTtcbiAgICAgICAgICB3aW5kb3cuJFJlZnJlc2hSZWckID0gKCkgPT4ge307XG4gICAgICAgICAgd2luZG93LiRSZWZyZXNoU2lnJCA9ICgpID0+ICh0eXBlKSA9PiB0eXBlO1xuICAgICAgICAgIHdpbmRvdy5fX3ZpdGVfcGx1Z2luX3JlYWN0X3ByZWFtYmxlX2luc3RhbGxlZF9fID0gdHJ1ZTtcbiAgICAgICAgYCxcbiAgICAgICAge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDo1MTc0JHtwYXRobmFtZX1gKTtcblxuICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBnZXRBcHAoKTogUHJvbWlzZTxBcHA+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIChhd2FpdCB2aXRlLnNzckxvYWRNb2R1bGUoam9pbihhcHBEaXIsIFwiYm9vdHN0cmFwLnRzXCIpKSkuYXBwO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5sb2coXCJDYW4ndCBsb2FkIGJvb3RzdHJhcC50c1wiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVTZXJ2ZShhcHA6IEFwcCk6IFByb21pc2U8U2VydmU+IHtcbiAgICBjb25zdCBoYW5kbGVyID0gYXBwLmZldGNoLmJpbmQoYXBwKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmV0Y2g6IGFzeW5jIChyZXEsIHNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoc2VydmVyLnVwZ3JhZGUocmVxLCB7IGRhdGE6IHsgaGVhZGVyczogcmVxLmhlYWRlcnMgfSB9KSkge1xuICAgICAgICAgIHJldHVybjsgLy8gZG8gbm90IHJldHVybiBhIFJlc3BvbnNlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZXEuaGVhZGVycy5nZXQoXCJ4LWZvcndhcmRlZC1mb3JcIikpIHtcbiAgICAgICAgICBjb25zdCBpcCA9IHNlcnZlci5yZXF1ZXN0SVAocmVxKTtcbiAgICAgICAgICByZXEuaGVhZGVycy5zZXQoXCJ4LWZvcndhcmRlZC1mb3JcIiwgaXAuYWRkcmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IHBhdGhuYW1lIH0gPSBuZXcgVVJMKHJlcS51cmwpO1xuXG4gICAgICAgIGNvbnN0IGRldlJlc3BvbnNlID0gYXdhaXQgaGFuZGxlRGV2UmVxdWVzdHMocmVxKTtcbiAgICAgICAgaWYgKGRldlJlc3BvbnNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gZGV2UmVzcG9uc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aChcIi9fX2dlbWkvaW1hZ2VcIikpIHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgaW1hZ2VIYW5kbGVyKHJlcSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIocmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdJbXBvcnRNYXAgPSB7fTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gKHZpZXdOYW1lOiBzdHJpbmcsIHBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgYFwiJHt2aWV3TmFtZX1cIjogKCkgPT4gaW1wb3J0KFwiJHtwYXRofVwiKWA7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBmaWxlTmFtZSBvZiBbXG4gICAgICAgICAgICAgIFwiNDA0XCIsXG4gICAgICAgICAgICAgIC4uLmFwcC5nZXRGbGF0Q29tcG9uZW50VHJlZS5jYWxsKGFwcCksXG4gICAgICAgICAgICBdKSB7XG4gICAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhcHBEaXIgPSBgJHtwcm9jZXNzLmVudi5BUFBfRElSfWA7XG4gICAgICAgICAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IHZpdGUuc3NyTG9hZE1vZHVsZShcbiAgICAgICAgICAgICAgICBgJHthcHBEaXJ9L3ZpZXdzLyR7ZmlsZU5hbWV9LnRzeGAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHZpZXdJbXBvcnRNYXBbZmlsZU5hbWVdID0gbW9kLmRlZmF1bHQ7XG4gICAgICAgICAgICAgIHRlbXBsYXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlKGZpbGVOYW1lLCBgJHthcHBEaXJ9L3ZpZXdzLyR7ZmlsZU5hbWV9LnRzeGApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2FkZXJzID0gYHske3RlbXBsYXRlcy5qb2luKFwiLFwiKX19YDtcbiAgICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdDogY3NzIH0gPSBhd2FpdCB2aXRlLnNzckxvYWRNb2R1bGUoXG4gICAgICAgICAgICAgIGAke2FwcERpcn0vYXBwLmNzc2AsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBbXTtcbiAgICAgICAgICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgaXNEZXY6IHRydWUsXG4gICAgICAgICAgICAgIGlkOiBgJHthcHBEaXJ9L2FwcC5jc3NgLFxuICAgICAgICAgICAgICBjb250ZW50OiBjc3MsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQoe1xuICAgICAgICAgICAgICBzdHlsZXM6IGNyZWF0ZVN0eWxlcyhzdHlsZXMpLFxuICAgICAgICAgICAgICBib290c3RyYXBNb2R1bGVzOiBbXG4gICAgICAgICAgICAgICAgXCIvcmVmcmVzaC5qc1wiLFxuICAgICAgICAgICAgICAgIFwiL2FwcC9jbGllbnQudHN4XCIsXG4gICAgICAgICAgICAgICAgXCJodHRwOi8vbG9jYWxob3N0OjUxNzMvQHZpdGUvY2xpZW50XCIsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHZpZXdJbXBvcnRNYXAsXG4gICAgICAgICAgICAgIGxvYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICBpZiAocGF0aG5hbWUuc3RhcnRzV2l0aChcIi9hcGlcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogZXJyLm1lc3NhZ2UgfSksIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKHJlbmRlckVycm9yUGFnZShlcnIpLCB7XG4gICAgICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwidGV4dC9odG1sXCIgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHBvcnQ6IHByb2Nlc3MuZW52LlBPUlQgfHwgNTE3MyxcbiAgICAgIHdlYnNvY2tldDogYXBwLndlYnNvY2tldCxcbiAgICB9O1xuICB9XG5cbiAgYXdhaXQgdml0ZS5saXN0ZW4oNTE3NCk7XG5cbiAgY29uc3QgYXBwID0gYXdhaXQgZ2V0QXBwKCk7XG4gIGNvbnN0IHNlcnZlID0gYXdhaXQgY3JlYXRlU2VydmUoYXBwKTtcbiAgY29uc3Qgc2VydmVyID0gQnVuLnNlcnZlKHNlcnZlKTtcbiAgYXBwLm9uUHVibGlzaChcbiAgICAoXG4gICAgICB0b3BpYzogc3RyaW5nLFxuICAgICAgZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXJWaWV3IHwgQXJyYXlCdWZmZXIgfCBTaGFyZWRBcnJheUJ1ZmZlcixcbiAgICAgIGNvbXByZXNzPzogYm9vbGVhbixcbiAgICApID0+IHtcbiAgICAgIHNlcnZlci5wdWJsaXNoKHRvcGljLCBkYXRhLCBjb21wcmVzcyk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zb2xlLmxvZyhgU2VydmVyIHN0YXJ0ZWQgb24gaHR0cDovL2xvY2FsaG9zdDoke3Byb2Nlc3MuZW52LlBPUlQgfHwgNTE3M31gKTtcblxuICB2aXRlLndhdGNoZXIub24oXCJjaGFuZ2VcIiwgYXN5bmMgKGZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUmVsYXRpdmVQYXRoID0gZmlsZS5yZXBsYWNlKHJvb3REaXIsIFwiXCIpO1xuICAgIGlmIChmaWxlUmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIvYXBwL3ZpZXdzXCIpKSB7XG4gICAgICBjb25zb2xlLmxvZyhgW3ZpdGVdICR7ZmlsZVJlbGF0aXZlUGF0aH0gY2hhbmdlZC4g8J+NnCBIb3QgcmVsb2FkaW5nLi4uYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFt2aXRlXSAke2ZpbGVSZWxhdGl2ZVBhdGh9IGNoYW5nZWQuIFJlbG9hZGluZy4uLmApO1xuICAgIGNvbnN0IG1vZHVsZXMgPSB2aXRlLm1vZHVsZUdyYXBoLmdldE1vZHVsZXNCeUZpbGUoZmlsZSkgPz8gW107XG4gICAgZm9yIChjb25zdCBtb2Qgb2YgQXJyYXkuZnJvbShtb2R1bGVzKSkge1xuICAgICAgdml0ZS5tb2R1bGVHcmFwaC5pbnZhbGlkYXRlTW9kdWxlKG1vZCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IGdldEFwcCgpO1xuICAgICAgY29uc3Qgc2VydmUgPSBhd2FpdCBjcmVhdGVTZXJ2ZShhcHApO1xuICAgICAgYXBwLm9uUHVibGlzaChcbiAgICAgICAgKFxuICAgICAgICAgIHRvcGljOiBzdHJpbmcsXG4gICAgICAgICAgZGF0YTogc3RyaW5nIHwgQXJyYXlCdWZmZXJWaWV3IHwgQXJyYXlCdWZmZXIgfCBTaGFyZWRBcnJheUJ1ZmZlcixcbiAgICAgICAgICBjb21wcmVzcz86IGJvb2xlYW4sXG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIHNlcnZlci5wdWJsaXNoKHRvcGljLCBkYXRhLCBjb21wcmVzcyk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgc2VydmVyLnJlbG9hZChzZXJ2ZSk7XG4gICAgICB2aXRlLndzLnNlbmQoe1xuICAgICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgICBldmVudDogXCJodHRwLXJlbG9hZFwiLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIkVycm9yIG9uIHNlcnZlciByZWxvYWRcIik7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHNlcnZlcjtcbn1cbiIsCiAgICAiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0eWxlcyhzdHlsZXMpIHtcbiAgcmV0dXJuIHN0eWxlcy5tYXAoKHN0eWxlLCBpKSA9PiB7XG4gICAgaWYgKHN0eWxlLmlzRGV2KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c3R5bGUga2V5PXtzdHlsZS5pZH0gdHlwZT1cInRleHQvY3NzXCIgZGF0YS12aXRlLWRldi1pZD17c3R5bGUuaWR9PlxuICAgICAgICAgIHtzdHlsZS5jb250ZW50fVxuICAgICAgICA8L3N0eWxlPlxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHN0eWxlIGtleT17aX0gdHlwZT1cInRleHQvY3NzXCI+XG4gICAgICAgICAge3N0eWxlLmNvbnRlbnR9XG4gICAgICAgIDwvc3R5bGU+XG4gICAgICApO1xuICAgIH1cbiAgfSk7XG59XG4iLAogICAgImltcG9ydCBzaGFycCwgeyB0eXBlIEZpdEVudW0gfSBmcm9tIFwic2hhcnBcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltYWdlSGFuZGxlcihyZXE6IFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybCk7XG4gIGNvbnN0IHJhd0ltYWdlVXJsID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQoXCJ1cmxcIik7XG4gIGNvbnN0IHdpZHRoID0gTnVtYmVyKHVybC5zZWFyY2hQYXJhbXMuZ2V0KFwid1wiKSk7XG4gIGNvbnN0IGhlaWdodCA9IE51bWJlcih1cmwuc2VhcmNoUGFyYW1zLmdldChcImhcIikpO1xuICBjb25zdCBmaXQgPSAodXJsLnNlYXJjaFBhcmFtcy5nZXQoXCJmaXRcIikgPz9cbiAgICBcImNvdmVyXCIpIGFzIHVua25vd24gYXMga2V5b2YgRml0RW51bTtcbiAgY29uc3QgcXVhbGl0eSA9IE51bWJlcih1cmwuc2VhcmNoUGFyYW1zLmdldChcInFcIikpO1xuXG4gIGlmICghcmF3SW1hZ2VVcmwpIHtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBlcnJvcjogXCJ1cmwgcXVlcnkgcGFyYW1ldGVyIGlzIHJlcXVpcmVkXCIsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0dXM6IDQwNCxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSByYXdJbWFnZVVybC5zdGFydHNXaXRoKFwiaHR0cFwiKVxuICAgID8gXCJcIlxuICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwcm9jZXNzLmVudi5QT1JUIHx8IDUxNzN9YDtcbiAgY29uc3QgZnVsbEltYWdlVXJsID0gYCR7cHJlZml4fSR7cmF3SW1hZ2VVcmx9YDtcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goZnVsbEltYWdlVXJsKTtcbiAgaWYgKCFyZXMub2spIHtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBlcnJvcjogXCJJbWFnZSBub3QgZm91bmRcIixcbiAgICAgICAgaW5mbzogZnVsbEltYWdlVXJsLFxuICAgICAgfSksXG4gICAgICB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgICAgc3RhdHVzOiA0MDQsXG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgY29uc3QgaW1hZ2VCdWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCByZXMuYXJyYXlCdWZmZXIoKSk7XG5cbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgc2hhcnAoaW1hZ2VCdWZmZXIpXG4gICAgLnJlc2l6ZSh3aWR0aCA+IDAgPyB3aWR0aCA6IHVuZGVmaW5lZCwgaGVpZ2h0ID4gMCA/IGhlaWdodCA6IHVuZGVmaW5lZCwge1xuICAgICAgZml0LFxuICAgIH0pXG4gICAgLndlYnAoeyBxdWFsaXR5OiBxdWFsaXR5ID4gMCA/IHF1YWxpdHkgOiA4MCwgZm9yY2U6IHRydWUgfSlcbiAgICAudG9CdWZmZXIoKTtcblxuICByZXMuaGVhZGVycy5kZWxldGUoXCJDb250ZW50LVR5cGVcIik7XG4gIHJlcy5oZWFkZXJzLmRlbGV0ZShcIkNvbnRlbnQtTGVuZ3RoXCIpO1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKGJ1ZmZlciwge1xuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiaW1hZ2Uvd2VicFwiLFxuICAgICAgXCJDb250ZW50LUxlbmd0aFwiOiBgJHtidWZmZXIuYnl0ZUxlbmd0aH1gLFxuICAgICAgLi4ucmVzLmhlYWRlcnMudG9KU09OKCksXG4gICAgfSxcbiAgfSk7XG59XG4iLAogICAgImV4cG9ydCBmdW5jdGlvbiByZW5kZXJFcnJvclBhZ2UoZXJyOiBhbnkpIHtcbiAgcmV0dXJuIGBcbjwhRE9DVFlQRSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiIC8+XG4gICAgPG1ldGFcbiAgICAgIG5hbWU9XCJ2aWV3cG9ydFwiXG4gICAgICBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMFwiXG4gICAgLz5cbiAgICA8dGl0bGU+RXJyb3I8L3RpdGxlPlxuICAgIDxzdHlsZT5cbiAgICAgIGJvZHkge1xuICAgICAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7XG4gICAgICAgIHBhZGRpbmc6IDIwcHg7XG4gICAgICB9XG4gICAgICBoMSB7XG4gICAgICAgIGNvbG9yOiByZWQ7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC9oZWFkPlxuICA8Ym9keT5cbiAgICA8aDE+RXJyb3I8L2gxPlxuICAgIDxwcmU+JHtKU09OLnN0cmluZ2lmeShlcnIsIG51bGwsIDIpfTwvcHJlPlxuICAgIDxzY3JpcHQgdHlwZT1cIm1vZHVsZVwiIHNyYz1cIi9yZWZyZXNoLmpzXCI+PC9zY3JpcHQ+XG4gIDwvYm9keT5cbjwvaHRtbD5cbmA7XG59XG4iLAogICAgImltcG9ydCB7IGpvaW4gfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgaW1hZ2VIYW5kbGVyIH0gZnJvbSBcIi4vaW1hZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUVUYWcgfSBmcm9tIFwiLi9nZW5lcmF0ZUV0YWdcIjtcbmltcG9ydCB7IFVSTFBhdHRlcm4gfSBmcm9tIFwidXJscGF0dGVybi1wb2x5ZmlsbFwiO1xuaW1wb3J0IHsgY3JlYXRlU3R5bGVzIH0gZnJvbSBcIi4vc3R5bGVzXCI7XG5cbmNvbnN0IHJvb3REaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG5jb25zdCBhcHBEaXIgPSBqb2luKHJvb3REaXIsIFwiYXBwXCIpO1xuY29uc3QgZGlzdERpciA9IGpvaW4ocm9vdERpciwgXCJkaXN0XCIpO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRQcm9kU2VydmVyKCkge1xuICBjb25zdCB7IGFwcCB9ID0gYXdhaXQgaW1wb3J0KGAke2Rpc3REaXJ9L3NlcnZlci9ib290c3RyYXAubWpzYCk7XG4gIGNvbnN0IG1hbmlmZXN0ID0gYXdhaXQgaW1wb3J0KGAke2Rpc3REaXJ9L2NsaWVudC8udml0ZS9tYW5pZmVzdC5qc29uYCk7XG4gIGNvbnN0IHNlcnZlck1hbmlmZXN0ID0gYXdhaXQgaW1wb3J0KGAke2Rpc3REaXJ9L3NlcnZlci8udml0ZS9tYW5pZmVzdC5qc29uYCk7XG5cbiAgcHJvY2Vzcy5lbnYuUk9PVF9ESVIgPSByb290RGlyO1xuICBwcm9jZXNzLmVudi5BUFBfRElSID0gYXBwRGlyO1xuICBwcm9jZXNzLmVudi5ESVNUX0RJUiA9IGRpc3REaXI7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEhhbmRsZXIocmVxOiBSZXF1ZXN0KSB7XG4gICAgY29uc3QgeyBwYXRobmFtZSB9ID0gbmV3IFVSTChyZXEudXJsKTtcblxuICAgIGlmIChwYXRobmFtZS5zdGFydHNXaXRoKFwiL19fZ2VtaS9pbWFnZVwiKSkge1xuICAgICAgcmV0dXJuIGF3YWl0IGltYWdlSGFuZGxlcihyZXEpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgVVJMUGF0dGVybih7XG4gICAgICBwYXRobmFtZTogXCIvKi46ZmlsZXR5cGUocG5nfHR4dHxqc3xjc3N8anBnfHN2Z3xqcGVnfGljb3x0dGYpXCIsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpc0FwaSA9IHBhdGhuYW1lLnN0YXJ0c1dpdGgoXCIvYXBpXCIpO1xuXG4gICAgaWYgKHBhdHRlcm4udGVzdCh7IHBhdGhuYW1lIH0pICYmICFpc0FwaSkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsKTtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcmVxLnVybC5yZXBsYWNlKHVybC5vcmlnaW4sIFwiXCIpLnNwbGl0KFwiP1wiKVswXTtcbiAgICAgIGNvbnN0IGZpbGUgPSBCdW4uZmlsZShcbiAgICAgICAgYGRpc3QvY2xpZW50JHtmaWxlUGF0aC5yZXBsYWNlKFwiL2Fzc2V0cy9hc3NldHNcIiwgXCIvYXNzZXRzXCIpfWAsXG4gICAgICApO1xuICAgICAgaWYgKCFmaWxlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoXCJOb3QgZm91bmRcIiwgeyBzdGF0dXM6IDQwNCB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV0YWcgPSBnZW5lcmF0ZUVUYWcoZmlsZS5sYXN0TW9kaWZpZWQpO1xuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShmaWxlLnN0cmVhbSgpLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBmaWxlLnR5cGUsXG4gICAgICAgICAgXCJDYWNoZS1Db250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgICAgICBcIkNvbnRlbnQtTGVuZ3RoXCI6IFN0cmluZyhmaWxlLnNpemUpLFxuICAgICAgICAgIEVUYWc6IGV0YWcsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZXMgPSBbXTtcbiAgICBjb25zdCBjc3NGaWxlID0gQnVuLmZpbGUoXG4gICAgICBgJHtkaXN0RGlyfS9jbGllbnQvJHttYW5pZmVzdFtcImFwcC9jbGllbnQudHN4XCJdLmNzc31gLFxuICAgICk7XG4gICAgY29uc3QgY3NzQ29udGVudCA9IGF3YWl0IGNzc0ZpbGUudGV4dCgpO1xuICAgIHN0eWxlcy5wdXNoKHtcbiAgICAgIGNvbnRlbnQ6IGNzc0NvbnRlbnQsXG4gICAgfSk7XG5cbiAgICBjb25zdCB2aWV3SW1wb3J0TWFwID0ge307XG4gICAgY29uc3QgdGVtcGxhdGUgPSAodmlld05hbWU6IHN0cmluZywgcGF0aDogc3RyaW5nKSA9PlxuICAgICAgYFwiJHt2aWV3TmFtZX1cIjogKCkgPT4gaW1wb3J0KFwiJHtwYXRofVwiKWA7XG4gICAgY29uc3QgdGVtcGxhdGVzID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGZpbGVOYW1lIG9mIFtcIjQwNFwiLCAuLi5hcHAuZ2V0RmxhdENvbXBvbmVudFRyZWUuY2FsbChhcHApXSkge1xuICAgICAgY29uc3Qgc2VydmVyRmlsZSA9IHNlcnZlck1hbmlmZXN0W2BhcHAvdmlld3MvJHtmaWxlTmFtZX0udHN4YF07XG4gICAgICBpZiAoIXNlcnZlckZpbGU/LmZpbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFNlcnZlciBmaWxlIG5vdCBmb3VuZCBmb3IgJHtmaWxlTmFtZX1gKTtcbiAgICAgICAgY29uc29sZS5sb2coc2VydmVyRmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gT2JqZWN0LmtleXMoc2VydmVyTWFuaWZlc3QpO1xuICAgICAgICBjb25zdCBwYXRoID0gYGFwcC92aWV3cy8ke2ZpbGVOYW1lfS50c3hgO1xuICAgICAgICBjb25zb2xlLmxvZyhgJHtwYXRofSBub3QgZm91bmQgaW4gc2VydmVyIG1hbmlmZXN0YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGZpbGVzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1vZCA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgYCR7cHJvY2Vzcy5lbnYuRElTVF9ESVJ9L3NlcnZlci8ke3NlcnZlckZpbGU/LmZpbGV9YFxuICAgICAgKTtcbiAgICAgIHZpZXdJbXBvcnRNYXBbZmlsZU5hbWVdID0gbW9kLmRlZmF1bHQ7XG4gICAgICBjb25zdCBjbGllbnRGaWxlID0gbWFuaWZlc3RbYGFwcC92aWV3cy8ke2ZpbGVOYW1lfS50c3hgXTtcbiAgICAgIGlmIChjbGllbnRGaWxlKSB7XG4gICAgICAgIHRlbXBsYXRlcy5wdXNoKHRlbXBsYXRlKGZpbGVOYW1lLCBgLyR7Y2xpZW50RmlsZT8uZmlsZX1gKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9hZGVycyA9IGB7JHt0ZW1wbGF0ZXMuam9pbihcIixcIil9fWA7XG5cbiAgICBjb25zdCBoYW5kbGVyID0gYXBwLmZldGNoLmJpbmQoYXBwKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKHJlcSk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBhd2FpdCByZXN1bHQoe1xuICAgICAgICAgIHN0eWxlczogY3JlYXRlU3R5bGVzKHN0eWxlcyksXG4gICAgICAgICAgYm9vdHN0cmFwTW9kdWxlczogW2AvJHttYW5pZmVzdFtcImFwcC9jbGllbnQudHN4XCJdLmZpbGV9YF0sXG4gICAgICAgICAgbG9hZGVycyxcbiAgICAgICAgICB2aWV3SW1wb3J0TWFwLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIGlmIChwYXRobmFtZS5zdGFydHNXaXRoKFwiL2FwaVwiKSkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6IGVyci5tZXNzYWdlIH0pLCB7XG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoZXJyLnN0YWNrLCB7IHN0YXR1czogNTAwIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNlcnZlciA9IEJ1bi5zZXJ2ZSh7XG4gICAgZmV0Y2g6IGFzeW5jIChyZXEsIHNlcnZlcikgPT4ge1xuICAgICAgaWYgKCFyZXEuaGVhZGVycy5nZXQoXCJ4LWZvcndhcmRlZC1mb3JcIikpIHtcbiAgICAgICAgY29uc3QgaXAgPSBzZXJ2ZXIucmVxdWVzdElQKHJlcSk7XG4gICAgICAgIHJlcS5oZWFkZXJzLnNldChcIngtZm9yd2FyZGVkLWZvclwiLCBpcC5hZGRyZXNzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0SGFuZGxlcihyZXEpO1xuICAgIH0sXG4gICAgcG9ydDogcHJvY2Vzcy5lbnYuUE9SVCB8fCA1MTczLFxuICB9KTtcblxuICBjb25zb2xlLmxvZyhcIlByb2R1Y3Rpb24gc2VydmVyIHJ1bm5pbmcgb25cIiwgc2VydmVyLnVybC5ocmVmKTtcblxuICByZXR1cm4gc2VydmVyO1xufVxuIiwKICAgICJleHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVFVGFnKGxhc3RNb2RpZmllZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgLy8gQXNzdW1pbmcgdGhlIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wIGlzIGluIG1pbGxpc2Vjb25kc1xuICBjb25zdCBsYXN0TW9kaWZpZWRTdHIgPSBsYXN0TW9kaWZpZWQudG9TdHJpbmcoKTtcblxuICBjb25zdCBoYXNoZXIgPSBuZXcgQnVuLkNyeXB0b0hhc2hlcihcInNoYTFcIik7XG4gIGhhc2hlci51cGRhdGUobGFzdE1vZGlmaWVkU3RyKTtcbiAgY29uc3QgaGFzaCA9IGhhc2hlci5kaWdlc3QoXCJoZXhcIik7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG4iLAogICAgInZhciBSPWNsYXNze3R5cGU9MztuYW1lPVwiXCI7cHJlZml4PVwiXCI7dmFsdWU9XCJcIjtzdWZmaXg9XCJcIjttb2RpZmllcj0zO2NvbnN0cnVjdG9yKHQscixuLG8sYyxsKXt0aGlzLnR5cGU9dCx0aGlzLm5hbWU9cix0aGlzLnByZWZpeD1uLHRoaXMudmFsdWU9byx0aGlzLnN1ZmZpeD1jLHRoaXMubW9kaWZpZXI9bH1oYXNDdXN0b21OYW1lKCl7cmV0dXJuIHRoaXMubmFtZSE9PVwiXCImJnR5cGVvZiB0aGlzLm5hbWUhPVwibnVtYmVyXCJ9fSxiZT0vWyRfXFxwe0lEX1N0YXJ0fV0vdSxQZT0vWyRfXFx1MjAwQ1xcdTIwMERcXHB7SURfQ29udGludWV9XS91LE09XCIuKlwiO2Z1bmN0aW9uIFJlKGUsdCl7cmV0dXJuKHQ/L15bXFx4MDAtXFx4RkZdKiQvOi9eW1xceDAwLVxceDdGXSokLykudGVzdChlKX1mdW5jdGlvbiB2KGUsdD0hMSl7bGV0IHI9W10sbj0wO2Zvcig7bjxlLmxlbmd0aDspe2xldCBvPWVbbl0sYz1mdW5jdGlvbihsKXtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKGwpO3IucHVzaCh7dHlwZTpcIklOVkFMSURfQ0hBUlwiLGluZGV4Om4sdmFsdWU6ZVtuKytdfSl9O2lmKG89PT1cIipcIil7ci5wdXNoKHt0eXBlOlwiQVNURVJJU0tcIixpbmRleDpuLHZhbHVlOmVbbisrXX0pO2NvbnRpbnVlfWlmKG89PT1cIitcInx8bz09PVwiP1wiKXtyLnB1c2goe3R5cGU6XCJPVEhFUl9NT0RJRklFUlwiLGluZGV4Om4sdmFsdWU6ZVtuKytdfSk7Y29udGludWV9aWYobz09PVwiXFxcXFwiKXtyLnB1c2goe3R5cGU6XCJFU0NBUEVEX0NIQVJcIixpbmRleDpuKyssdmFsdWU6ZVtuKytdfSk7Y29udGludWV9aWYobz09PVwie1wiKXtyLnB1c2goe3R5cGU6XCJPUEVOXCIsaW5kZXg6bix2YWx1ZTplW24rK119KTtjb250aW51ZX1pZihvPT09XCJ9XCIpe3IucHVzaCh7dHlwZTpcIkNMT1NFXCIsaW5kZXg6bix2YWx1ZTplW24rK119KTtjb250aW51ZX1pZihvPT09XCI6XCIpe2xldCBsPVwiXCIscz1uKzE7Zm9yKDtzPGUubGVuZ3RoOyl7bGV0IGk9ZS5zdWJzdHIocywxKTtpZihzPT09bisxJiZiZS50ZXN0KGkpfHxzIT09bisxJiZQZS50ZXN0KGkpKXtsKz1lW3MrK107Y29udGludWV9YnJlYWt9aWYoIWwpe2MoYE1pc3NpbmcgcGFyYW1ldGVyIG5hbWUgYXQgJHtufWApO2NvbnRpbnVlfXIucHVzaCh7dHlwZTpcIk5BTUVcIixpbmRleDpuLHZhbHVlOmx9KSxuPXM7Y29udGludWV9aWYobz09PVwiKFwiKXtsZXQgbD0xLHM9XCJcIixpPW4rMSxhPSExO2lmKGVbaV09PT1cIj9cIil7YyhgUGF0dGVybiBjYW5ub3Qgc3RhcnQgd2l0aCBcIj9cIiBhdCAke2l9YCk7Y29udGludWV9Zm9yKDtpPGUubGVuZ3RoOyl7aWYoIVJlKGVbaV0sITEpKXtjKGBJbnZhbGlkIGNoYXJhY3RlciAnJHtlW2ldfScgYXQgJHtpfS5gKSxhPSEwO2JyZWFrfWlmKGVbaV09PT1cIlxcXFxcIil7cys9ZVtpKytdK2VbaSsrXTtjb250aW51ZX1pZihlW2ldPT09XCIpXCIpe2lmKGwtLSxsPT09MCl7aSsrO2JyZWFrfX1lbHNlIGlmKGVbaV09PT1cIihcIiYmKGwrKyxlW2krMV0hPT1cIj9cIikpe2MoYENhcHR1cmluZyBncm91cHMgYXJlIG5vdCBhbGxvd2VkIGF0ICR7aX1gKSxhPSEwO2JyZWFrfXMrPWVbaSsrXX1pZihhKWNvbnRpbnVlO2lmKGwpe2MoYFVuYmFsYW5jZWQgcGF0dGVybiBhdCAke259YCk7Y29udGludWV9aWYoIXMpe2MoYE1pc3NpbmcgcGF0dGVybiBhdCAke259YCk7Y29udGludWV9ci5wdXNoKHt0eXBlOlwiUkVHRVhcIixpbmRleDpuLHZhbHVlOnN9KSxuPWk7Y29udGludWV9ci5wdXNoKHt0eXBlOlwiQ0hBUlwiLGluZGV4Om4sdmFsdWU6ZVtuKytdfSl9cmV0dXJuIHIucHVzaCh7dHlwZTpcIkVORFwiLGluZGV4Om4sdmFsdWU6XCJcIn0pLHJ9ZnVuY3Rpb24gRChlLHQ9e30pe2xldCByPXYoZSk7dC5kZWxpbWl0ZXI/Pz1cIi8jP1wiLHQucHJlZml4ZXM/Pz1cIi4vXCI7bGV0IG49YFteJHtTKHQuZGVsaW1pdGVyKX1dKz9gLG89W10sYz0wLGw9MCxzPVwiXCIsaT1uZXcgU2V0LGE9aD0+e2lmKGw8ci5sZW5ndGgmJnJbbF0udHlwZT09PWgpcmV0dXJuIHJbbCsrXS52YWx1ZX0sZj0oKT0+YShcIk9USEVSX01PRElGSUVSXCIpPz9hKFwiQVNURVJJU0tcIiksZD1oPT57bGV0IHU9YShoKTtpZih1IT09dm9pZCAwKXJldHVybiB1O2xldHt0eXBlOnAsaW5kZXg6QX09cltsXTt0aHJvdyBuZXcgVHlwZUVycm9yKGBVbmV4cGVjdGVkICR7cH0gYXQgJHtBfSwgZXhwZWN0ZWQgJHtofWApfSxUPSgpPT57bGV0IGg9XCJcIix1O2Zvcig7dT1hKFwiQ0hBUlwiKT8/YShcIkVTQ0FQRURfQ0hBUlwiKTspaCs9dTtyZXR1cm4gaH0sU2U9aD0+aCxMPXQuZW5jb2RlUGFydHx8U2UsST1cIlwiLFU9aD0+e0krPWh9LCQ9KCk9PntJLmxlbmd0aCYmKG8ucHVzaChuZXcgUigzLFwiXCIsXCJcIixMKEkpLFwiXCIsMykpLEk9XCJcIil9LFY9KGgsdSxwLEEsWSk9PntsZXQgZz0zO3N3aXRjaChZKXtjYXNlXCI/XCI6Zz0xO2JyZWFrO2Nhc2VcIipcIjpnPTA7YnJlYWs7Y2FzZVwiK1wiOmc9MjticmVha31pZighdSYmIXAmJmc9PT0zKXtVKGgpO3JldHVybn1pZigkKCksIXUmJiFwKXtpZighaClyZXR1cm47by5wdXNoKG5ldyBSKDMsXCJcIixcIlwiLEwoaCksXCJcIixnKSk7cmV0dXJufWxldCBtO3A/cD09PVwiKlwiP209TTptPXA6bT1uO2xldCBPPTI7bT09PW4/KE89MSxtPVwiXCIpOm09PT1NJiYoTz0wLG09XCJcIik7bGV0IFA7aWYodT9QPXU6cCYmKFA9YysrKSxpLmhhcyhQKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBEdXBsaWNhdGUgbmFtZSAnJHtQfScuYCk7aS5hZGQoUCksby5wdXNoKG5ldyBSKE8sUCxMKGgpLG0sTChBKSxnKSl9O2Zvcig7bDxyLmxlbmd0aDspe2xldCBoPWEoXCJDSEFSXCIpLHU9YShcIk5BTUVcIikscD1hKFwiUkVHRVhcIik7aWYoIXUmJiFwJiYocD1hKFwiQVNURVJJU0tcIikpLHV8fHApe2xldCBnPWg/P1wiXCI7dC5wcmVmaXhlcy5pbmRleE9mKGcpPT09LTEmJihVKGcpLGc9XCJcIiksJCgpO2xldCBtPWYoKTtWKGcsdSxwLFwiXCIsbSk7Y29udGludWV9bGV0IEE9aD8/YShcIkVTQ0FQRURfQ0hBUlwiKTtpZihBKXtVKEEpO2NvbnRpbnVlfWlmKGEoXCJPUEVOXCIpKXtsZXQgZz1UKCksbT1hKFwiTkFNRVwiKSxPPWEoXCJSRUdFWFwiKTshbSYmIU8mJihPPWEoXCJBU1RFUklTS1wiKSk7bGV0IFA9VCgpO2QoXCJDTE9TRVwiKTtsZXQgeGU9ZigpO1YoZyxtLE8sUCx4ZSk7Y29udGludWV9JCgpLGQoXCJFTkRcIil9cmV0dXJuIG99ZnVuY3Rpb24gUyhlKXtyZXR1cm4gZS5yZXBsYWNlKC8oWy4rKj9eJHt9KClbXFxdfC9cXFxcXSkvZyxcIlxcXFwkMVwiKX1mdW5jdGlvbiBYKGUpe3JldHVybiBlJiZlLmlnbm9yZUNhc2U/XCJ1aVwiOlwidVwifWZ1bmN0aW9uIFooZSx0LHIpe3JldHVybiBGKEQoZSxyKSx0LHIpfWZ1bmN0aW9uIGsoZSl7c3dpdGNoKGUpe2Nhc2UgMDpyZXR1cm5cIipcIjtjYXNlIDE6cmV0dXJuXCI/XCI7Y2FzZSAyOnJldHVyblwiK1wiO2Nhc2UgMzpyZXR1cm5cIlwifX1mdW5jdGlvbiBGKGUsdCxyPXt9KXtyLmRlbGltaXRlcj8/PVwiLyM/XCIsci5wcmVmaXhlcz8/PVwiLi9cIixyLnNlbnNpdGl2ZT8/PSExLHIuc3RyaWN0Pz89ITEsci5lbmQ/Pz0hMCxyLnN0YXJ0Pz89ITAsci5lbmRzV2l0aD1cIlwiO2xldCBuPXIuc3RhcnQ/XCJeXCI6XCJcIjtmb3IobGV0IHMgb2YgZSl7aWYocy50eXBlPT09Myl7cy5tb2RpZmllcj09PTM/bis9UyhzLnZhbHVlKTpuKz1gKD86JHtTKHMudmFsdWUpfSkke2socy5tb2RpZmllcil9YDtjb250aW51ZX10JiZ0LnB1c2gocy5uYW1lKTtsZXQgaT1gW14ke1Moci5kZWxpbWl0ZXIpfV0rP2AsYT1zLnZhbHVlO2lmKHMudHlwZT09PTE/YT1pOnMudHlwZT09PTAmJihhPU0pLCFzLnByZWZpeC5sZW5ndGgmJiFzLnN1ZmZpeC5sZW5ndGgpe3MubW9kaWZpZXI9PT0zfHxzLm1vZGlmaWVyPT09MT9uKz1gKCR7YX0pJHtrKHMubW9kaWZpZXIpfWA6bis9YCgoPzoke2F9KSR7ayhzLm1vZGlmaWVyKX0pYDtjb250aW51ZX1pZihzLm1vZGlmaWVyPT09M3x8cy5tb2RpZmllcj09PTEpe24rPWAoPzoke1Mocy5wcmVmaXgpfSgke2F9KSR7UyhzLnN1ZmZpeCl9KWAsbis9ayhzLm1vZGlmaWVyKTtjb250aW51ZX1uKz1gKD86JHtTKHMucHJlZml4KX1gLG4rPWAoKD86JHthfSkoPzpgLG4rPVMocy5zdWZmaXgpLG4rPVMocy5wcmVmaXgpLG4rPWAoPzoke2F9KSkqKSR7UyhzLnN1ZmZpeCl9KWAscy5tb2RpZmllcj09PTAmJihuKz1cIj9cIil9bGV0IG89YFske1Moci5lbmRzV2l0aCl9XXwkYCxjPWBbJHtTKHIuZGVsaW1pdGVyKX1dYDtpZihyLmVuZClyZXR1cm4gci5zdHJpY3R8fChuKz1gJHtjfT9gKSxyLmVuZHNXaXRoLmxlbmd0aD9uKz1gKD89JHtvfSlgOm4rPVwiJFwiLG5ldyBSZWdFeHAobixYKHIpKTtyLnN0cmljdHx8KG4rPWAoPzoke2N9KD89JHtvfSkpP2ApO2xldCBsPSExO2lmKGUubGVuZ3RoKXtsZXQgcz1lW2UubGVuZ3RoLTFdO3MudHlwZT09PTMmJnMubW9kaWZpZXI9PT0zJiYobD1yLmRlbGltaXRlci5pbmRleE9mKHMpPi0xKX1yZXR1cm4gbHx8KG4rPWAoPz0ke2N9fCR7b30pYCksbmV3IFJlZ0V4cChuLFgocikpfXZhciB4PXtkZWxpbWl0ZXI6XCJcIixwcmVmaXhlczpcIlwiLHNlbnNpdGl2ZTohMCxzdHJpY3Q6ITB9LEI9e2RlbGltaXRlcjpcIi5cIixwcmVmaXhlczpcIlwiLHNlbnNpdGl2ZTohMCxzdHJpY3Q6ITB9LHE9e2RlbGltaXRlcjpcIi9cIixwcmVmaXhlczpcIi9cIixzZW5zaXRpdmU6ITAsc3RyaWN0OiEwfTtmdW5jdGlvbiBKKGUsdCl7cmV0dXJuIGUubGVuZ3RoP2VbMF09PT1cIi9cIj8hMDohdHx8ZS5sZW5ndGg8Mj8hMTooZVswXT09XCJcXFxcXCJ8fGVbMF09PVwie1wiKSYmZVsxXT09XCIvXCI6ITF9ZnVuY3Rpb24gUShlLHQpe3JldHVybiBlLnN0YXJ0c1dpdGgodCk/ZS5zdWJzdHJpbmcodC5sZW5ndGgsZS5sZW5ndGgpOmV9ZnVuY3Rpb24gRWUoZSx0KXtyZXR1cm4gZS5lbmRzV2l0aCh0KT9lLnN1YnN0cigwLGUubGVuZ3RoLXQubGVuZ3RoKTplfWZ1bmN0aW9uIFcoZSl7cmV0dXJuIWV8fGUubGVuZ3RoPDI/ITE6ZVswXT09PVwiW1wifHwoZVswXT09PVwiXFxcXFwifHxlWzBdPT09XCJ7XCIpJiZlWzFdPT09XCJbXCJ9dmFyIGVlPVtcImZ0cFwiLFwiZmlsZVwiLFwiaHR0cFwiLFwiaHR0cHNcIixcIndzXCIsXCJ3c3NcIl07ZnVuY3Rpb24gTihlKXtpZighZSlyZXR1cm4hMDtmb3IobGV0IHQgb2YgZWUpaWYoZS50ZXN0KHQpKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIHRlKGUsdCl7aWYoZT1RKGUsXCIjXCIpLHR8fGU9PT1cIlwiKXJldHVybiBlO2xldCByPW5ldyBVUkwoXCJodHRwczovL2V4YW1wbGUuY29tXCIpO3JldHVybiByLmhhc2g9ZSxyLmhhc2g/ci5oYXNoLnN1YnN0cmluZygxLHIuaGFzaC5sZW5ndGgpOlwiXCJ9ZnVuY3Rpb24gcmUoZSx0KXtpZihlPVEoZSxcIj9cIiksdHx8ZT09PVwiXCIpcmV0dXJuIGU7bGV0IHI9bmV3IFVSTChcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7cmV0dXJuIHIuc2VhcmNoPWUsci5zZWFyY2g/ci5zZWFyY2guc3Vic3RyaW5nKDEsci5zZWFyY2gubGVuZ3RoKTpcIlwifWZ1bmN0aW9uIG5lKGUsdCl7cmV0dXJuIHR8fGU9PT1cIlwiP2U6VyhlKT9qKGUpOnooZSl9ZnVuY3Rpb24gc2UoZSx0KXtpZih0fHxlPT09XCJcIilyZXR1cm4gZTtsZXQgcj1uZXcgVVJMKFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiKTtyZXR1cm4gci5wYXNzd29yZD1lLHIucGFzc3dvcmR9ZnVuY3Rpb24gaWUoZSx0KXtpZih0fHxlPT09XCJcIilyZXR1cm4gZTtsZXQgcj1uZXcgVVJMKFwiaHR0cHM6Ly9leGFtcGxlLmNvbVwiKTtyZXR1cm4gci51c2VybmFtZT1lLHIudXNlcm5hbWV9ZnVuY3Rpb24gYWUoZSx0LHIpe2lmKHJ8fGU9PT1cIlwiKXJldHVybiBlO2lmKHQmJiFlZS5pbmNsdWRlcyh0KSlyZXR1cm4gbmV3IFVSTChgJHt0fToke2V9YCkucGF0aG5hbWU7bGV0IG49ZVswXT09XCIvXCI7cmV0dXJuIGU9bmV3IFVSTChuP2U6XCIvLVwiK2UsXCJodHRwczovL2V4YW1wbGUuY29tXCIpLnBhdGhuYW1lLG58fChlPWUuc3Vic3RyaW5nKDIsZS5sZW5ndGgpKSxlfWZ1bmN0aW9uIG9lKGUsdCxyKXtyZXR1cm4gXyh0KT09PWUmJihlPVwiXCIpLHJ8fGU9PT1cIlwiP2U6SyhlKX1mdW5jdGlvbiBjZShlLHQpe3JldHVybiBlPUVlKGUsXCI6XCIpLHR8fGU9PT1cIlwiP2U6eShlKX1mdW5jdGlvbiBfKGUpe3N3aXRjaChlKXtjYXNlXCJ3c1wiOmNhc2VcImh0dHBcIjpyZXR1cm5cIjgwXCI7Y2FzZVwid3dzXCI6Y2FzZVwiaHR0cHNcIjpyZXR1cm5cIjQ0M1wiO2Nhc2VcImZ0cFwiOnJldHVyblwiMjFcIjtkZWZhdWx0OnJldHVyblwiXCJ9fWZ1bmN0aW9uIHkoZSl7aWYoZT09PVwiXCIpcmV0dXJuIGU7aWYoL15bLSsuQS1aYS16MC05XSokLy50ZXN0KGUpKXJldHVybiBlLnRvTG93ZXJDYXNlKCk7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBwcm90b2NvbCAnJHtlfScuYCl9ZnVuY3Rpb24gbGUoZSl7aWYoZT09PVwiXCIpcmV0dXJuIGU7bGV0IHQ9bmV3IFVSTChcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7cmV0dXJuIHQudXNlcm5hbWU9ZSx0LnVzZXJuYW1lfWZ1bmN0aW9uIGZlKGUpe2lmKGU9PT1cIlwiKXJldHVybiBlO2xldCB0PW5ldyBVUkwoXCJodHRwczovL2V4YW1wbGUuY29tXCIpO3JldHVybiB0LnBhc3N3b3JkPWUsdC5wYXNzd29yZH1mdW5jdGlvbiB6KGUpe2lmKGU9PT1cIlwiKXJldHVybiBlO2lmKC9bXFx0XFxuXFxyICMlLzo8Pj9AW1xcXV5cXFxcfF0vZy50ZXN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoYEludmFsaWQgaG9zdG5hbWUgJyR7ZX0nYCk7bGV0IHQ9bmV3IFVSTChcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7cmV0dXJuIHQuaG9zdG5hbWU9ZSx0Lmhvc3RuYW1lfWZ1bmN0aW9uIGooZSl7aWYoZT09PVwiXCIpcmV0dXJuIGU7aWYoL1teMC05YS1mQS1GW1xcXTpdL2cudGVzdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIElQdjYgaG9zdG5hbWUgJyR7ZX0nYCk7cmV0dXJuIGUudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBLKGUpe2lmKGU9PT1cIlwifHwvXlswLTldKiQvLnRlc3QoZSkmJnBhcnNlSW50KGUpPD02NTUzNSlyZXR1cm4gZTt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIHBvcnQgJyR7ZX0nLmApfWZ1bmN0aW9uIGhlKGUpe2lmKGU9PT1cIlwiKXJldHVybiBlO2xldCB0PW5ldyBVUkwoXCJodHRwczovL2V4YW1wbGUuY29tXCIpO3JldHVybiB0LnBhdGhuYW1lPWVbMF0hPT1cIi9cIj9cIi8tXCIrZTplLGVbMF0hPT1cIi9cIj90LnBhdGhuYW1lLnN1YnN0cmluZygyLHQucGF0aG5hbWUubGVuZ3RoKTp0LnBhdGhuYW1lfWZ1bmN0aW9uIHVlKGUpe3JldHVybiBlPT09XCJcIj9lOm5ldyBVUkwoYGRhdGE6JHtlfWApLnBhdGhuYW1lfWZ1bmN0aW9uIGRlKGUpe2lmKGU9PT1cIlwiKXJldHVybiBlO2xldCB0PW5ldyBVUkwoXCJodHRwczovL2V4YW1wbGUuY29tXCIpO3JldHVybiB0LnNlYXJjaD1lLHQuc2VhcmNoLnN1YnN0cmluZygxLHQuc2VhcmNoLmxlbmd0aCl9ZnVuY3Rpb24gcGUoZSl7aWYoZT09PVwiXCIpcmV0dXJuIGU7bGV0IHQ9bmV3IFVSTChcImh0dHBzOi8vZXhhbXBsZS5jb21cIik7cmV0dXJuIHQuaGFzaD1lLHQuaGFzaC5zdWJzdHJpbmcoMSx0Lmhhc2gubGVuZ3RoKX12YXIgSD1jbGFzc3sjaTsjbj1bXTsjdD17fTsjZT0wOyNzPTE7I2w9MDsjbz0wOyNkPTA7I3A9MDsjZz0hMTtjb25zdHJ1Y3Rvcih0KXt0aGlzLiNpPXR9Z2V0IHJlc3VsdCgpe3JldHVybiB0aGlzLiN0fXBhcnNlKCl7Zm9yKHRoaXMuI249dih0aGlzLiNpLCEwKTt0aGlzLiNlPHRoaXMuI24ubGVuZ3RoO3RoaXMuI2UrPXRoaXMuI3Mpe2lmKHRoaXMuI3M9MSx0aGlzLiNuW3RoaXMuI2VdLnR5cGU9PT1cIkVORFwiKXtpZih0aGlzLiNvPT09MCl7dGhpcy4jYigpLHRoaXMuI2YoKT90aGlzLiNyKDksMSk6dGhpcy4jaCgpP3RoaXMuI3IoOCwxKTp0aGlzLiNyKDcsMCk7Y29udGludWV9ZWxzZSBpZih0aGlzLiNvPT09Mil7dGhpcy4jdSg1KTtjb250aW51ZX10aGlzLiNyKDEwLDApO2JyZWFrfWlmKHRoaXMuI2Q+MClpZih0aGlzLiNBKCkpdGhpcy4jZC09MTtlbHNlIGNvbnRpbnVlO2lmKHRoaXMuI1QoKSl7dGhpcy4jZCs9MTtjb250aW51ZX1zd2l0Y2godGhpcy4jbyl7Y2FzZSAwOnRoaXMuI1AoKSYmdGhpcy4jdSgxKTticmVhaztjYXNlIDE6aWYodGhpcy4jUCgpKXt0aGlzLiNDKCk7bGV0IHQ9NyxyPTE7dGhpcy4jRSgpPyh0PTIscj0zKTp0aGlzLiNnJiYodD0yKSx0aGlzLiNyKHQscil9YnJlYWs7Y2FzZSAyOnRoaXMuI1MoKT90aGlzLiN1KDMpOih0aGlzLiN4KCl8fHRoaXMuI2goKXx8dGhpcy4jZigpKSYmdGhpcy4jdSg1KTticmVhaztjYXNlIDM6dGhpcy4jTygpP3RoaXMuI3IoNCwxKTp0aGlzLiNTKCkmJnRoaXMuI3IoNSwxKTticmVhaztjYXNlIDQ6dGhpcy4jUygpJiZ0aGlzLiNyKDUsMSk7YnJlYWs7Y2FzZSA1OnRoaXMuI3koKT90aGlzLiNwKz0xOnRoaXMuI3coKSYmKHRoaXMuI3AtPTEpLHRoaXMuI2soKSYmIXRoaXMuI3A/dGhpcy4jcig2LDEpOnRoaXMuI3goKT90aGlzLiNyKDcsMCk6dGhpcy4jaCgpP3RoaXMuI3IoOCwxKTp0aGlzLiNmKCkmJnRoaXMuI3IoOSwxKTticmVhaztjYXNlIDY6dGhpcy4jeCgpP3RoaXMuI3IoNywwKTp0aGlzLiNoKCk/dGhpcy4jcig4LDEpOnRoaXMuI2YoKSYmdGhpcy4jcig5LDEpO2JyZWFrO2Nhc2UgNzp0aGlzLiNoKCk/dGhpcy4jcig4LDEpOnRoaXMuI2YoKSYmdGhpcy4jcig5LDEpO2JyZWFrO2Nhc2UgODp0aGlzLiNmKCkmJnRoaXMuI3IoOSwxKTticmVhaztjYXNlIDk6YnJlYWs7Y2FzZSAxMDpicmVha319dGhpcy4jdC5ob3N0bmFtZSE9PXZvaWQgMCYmdGhpcy4jdC5wb3J0PT09dm9pZCAwJiYodGhpcy4jdC5wb3J0PVwiXCIpfSNyKHQscil7c3dpdGNoKHRoaXMuI28pe2Nhc2UgMDpicmVhaztjYXNlIDE6dGhpcy4jdC5wcm90b2NvbD10aGlzLiNjKCk7YnJlYWs7Y2FzZSAyOmJyZWFrO2Nhc2UgMzp0aGlzLiN0LnVzZXJuYW1lPXRoaXMuI2MoKTticmVhaztjYXNlIDQ6dGhpcy4jdC5wYXNzd29yZD10aGlzLiNjKCk7YnJlYWs7Y2FzZSA1OnRoaXMuI3QuaG9zdG5hbWU9dGhpcy4jYygpO2JyZWFrO2Nhc2UgNjp0aGlzLiN0LnBvcnQ9dGhpcy4jYygpO2JyZWFrO2Nhc2UgNzp0aGlzLiN0LnBhdGhuYW1lPXRoaXMuI2MoKTticmVhaztjYXNlIDg6dGhpcy4jdC5zZWFyY2g9dGhpcy4jYygpO2JyZWFrO2Nhc2UgOTp0aGlzLiN0Lmhhc2g9dGhpcy4jYygpO2JyZWFrO2Nhc2UgMTA6YnJlYWt9dGhpcy4jbyE9PTAmJnQhPT0xMCYmKFsxLDIsMyw0XS5pbmNsdWRlcyh0aGlzLiNvKSYmWzYsNyw4LDldLmluY2x1ZGVzKHQpJiYodGhpcy4jdC5ob3N0bmFtZT8/PVwiXCIpLFsxLDIsMyw0LDUsNl0uaW5jbHVkZXModGhpcy4jbykmJls4LDldLmluY2x1ZGVzKHQpJiYodGhpcy4jdC5wYXRobmFtZT8/PXRoaXMuI2c/XCIvXCI6XCJcIiksWzEsMiwzLDQsNSw2LDddLmluY2x1ZGVzKHRoaXMuI28pJiZ0PT09OSYmKHRoaXMuI3Quc2VhcmNoPz89XCJcIikpLHRoaXMuI1IodCxyKX0jUih0LHIpe3RoaXMuI289dCx0aGlzLiNsPXRoaXMuI2Urcix0aGlzLiNlKz1yLHRoaXMuI3M9MH0jYigpe3RoaXMuI2U9dGhpcy4jbCx0aGlzLiNzPTB9I3UodCl7dGhpcy4jYigpLHRoaXMuI289dH0jbSh0KXtyZXR1cm4gdDwwJiYodD10aGlzLiNuLmxlbmd0aC10KSx0PHRoaXMuI24ubGVuZ3RoP3RoaXMuI25bdF06dGhpcy4jblt0aGlzLiNuLmxlbmd0aC0xXX0jYSh0LHIpe2xldCBuPXRoaXMuI20odCk7cmV0dXJuIG4udmFsdWU9PT1yJiYobi50eXBlPT09XCJDSEFSXCJ8fG4udHlwZT09PVwiRVNDQVBFRF9DSEFSXCJ8fG4udHlwZT09PVwiSU5WQUxJRF9DSEFSXCIpfSNQKCl7cmV0dXJuIHRoaXMuI2EodGhpcy4jZSxcIjpcIil9I0UoKXtyZXR1cm4gdGhpcy4jYSh0aGlzLiNlKzEsXCIvXCIpJiZ0aGlzLiNhKHRoaXMuI2UrMixcIi9cIil9I1MoKXtyZXR1cm4gdGhpcy4jYSh0aGlzLiNlLFwiQFwiKX0jTygpe3JldHVybiB0aGlzLiNhKHRoaXMuI2UsXCI6XCIpfSNrKCl7cmV0dXJuIHRoaXMuI2EodGhpcy4jZSxcIjpcIil9I3goKXtyZXR1cm4gdGhpcy4jYSh0aGlzLiNlLFwiL1wiKX0jaCgpe2lmKHRoaXMuI2EodGhpcy4jZSxcIj9cIikpcmV0dXJuITA7aWYodGhpcy4jblt0aGlzLiNlXS52YWx1ZSE9PVwiP1wiKXJldHVybiExO2xldCB0PXRoaXMuI20odGhpcy4jZS0xKTtyZXR1cm4gdC50eXBlIT09XCJOQU1FXCImJnQudHlwZSE9PVwiUkVHRVhcIiYmdC50eXBlIT09XCJDTE9TRVwiJiZ0LnR5cGUhPT1cIkFTVEVSSVNLXCJ9I2YoKXtyZXR1cm4gdGhpcy4jYSh0aGlzLiNlLFwiI1wiKX0jVCgpe3JldHVybiB0aGlzLiNuW3RoaXMuI2VdLnR5cGU9PVwiT1BFTlwifSNBKCl7cmV0dXJuIHRoaXMuI25bdGhpcy4jZV0udHlwZT09XCJDTE9TRVwifSN5KCl7cmV0dXJuIHRoaXMuI2EodGhpcy4jZSxcIltcIil9I3coKXtyZXR1cm4gdGhpcy4jYSh0aGlzLiNlLFwiXVwiKX0jYygpe2xldCB0PXRoaXMuI25bdGhpcy4jZV0scj10aGlzLiNtKHRoaXMuI2wpLmluZGV4O3JldHVybiB0aGlzLiNpLnN1YnN0cmluZyhyLHQuaW5kZXgpfSNDKCl7bGV0IHQ9e307T2JqZWN0LmFzc2lnbih0LHgpLHQuZW5jb2RlUGFydD15O2xldCByPVoodGhpcy4jYygpLHZvaWQgMCx0KTt0aGlzLiNnPU4ocil9fTt2YXIgRz1bXCJwcm90b2NvbFwiLFwidXNlcm5hbWVcIixcInBhc3N3b3JkXCIsXCJob3N0bmFtZVwiLFwicG9ydFwiLFwicGF0aG5hbWVcIixcInNlYXJjaFwiLFwiaGFzaFwiXSxFPVwiKlwiO2Z1bmN0aW9uIGdlKGUsdCl7aWYodHlwZW9mIGUhPVwic3RyaW5nXCIpdGhyb3cgbmV3IFR5cGVFcnJvcihcInBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdzdHJpbmcnLlwiKTtsZXQgcj1uZXcgVVJMKGUsdCk7cmV0dXJue3Byb3RvY29sOnIucHJvdG9jb2wuc3Vic3RyaW5nKDAsci5wcm90b2NvbC5sZW5ndGgtMSksdXNlcm5hbWU6ci51c2VybmFtZSxwYXNzd29yZDpyLnBhc3N3b3JkLGhvc3RuYW1lOnIuaG9zdG5hbWUscG9ydDpyLnBvcnQscGF0aG5hbWU6ci5wYXRobmFtZSxzZWFyY2g6ci5zZWFyY2ghPT1cIlwiP3Iuc2VhcmNoLnN1YnN0cmluZygxLHIuc2VhcmNoLmxlbmd0aCk6dm9pZCAwLGhhc2g6ci5oYXNoIT09XCJcIj9yLmhhc2guc3Vic3RyaW5nKDEsci5oYXNoLmxlbmd0aCk6dm9pZCAwfX1mdW5jdGlvbiBiKGUsdCl7cmV0dXJuIHQ/QyhlKTplfWZ1bmN0aW9uIHcoZSx0LHIpe2xldCBuO2lmKHR5cGVvZiB0LmJhc2VVUkw9PVwic3RyaW5nXCIpdHJ5e249bmV3IFVSTCh0LmJhc2VVUkwpLHQucHJvdG9jb2w9PT12b2lkIDAmJihlLnByb3RvY29sPWIobi5wcm90b2NvbC5zdWJzdHJpbmcoMCxuLnByb3RvY29sLmxlbmd0aC0xKSxyKSksIXImJnQucHJvdG9jb2w9PT12b2lkIDAmJnQuaG9zdG5hbWU9PT12b2lkIDAmJnQucG9ydD09PXZvaWQgMCYmdC51c2VybmFtZT09PXZvaWQgMCYmKGUudXNlcm5hbWU9YihuLnVzZXJuYW1lLHIpKSwhciYmdC5wcm90b2NvbD09PXZvaWQgMCYmdC5ob3N0bmFtZT09PXZvaWQgMCYmdC5wb3J0PT09dm9pZCAwJiZ0LnVzZXJuYW1lPT09dm9pZCAwJiZ0LnBhc3N3b3JkPT09dm9pZCAwJiYoZS5wYXNzd29yZD1iKG4ucGFzc3dvcmQscikpLHQucHJvdG9jb2w9PT12b2lkIDAmJnQuaG9zdG5hbWU9PT12b2lkIDAmJihlLmhvc3RuYW1lPWIobi5ob3N0bmFtZSxyKSksdC5wcm90b2NvbD09PXZvaWQgMCYmdC5ob3N0bmFtZT09PXZvaWQgMCYmdC5wb3J0PT09dm9pZCAwJiYoZS5wb3J0PWIobi5wb3J0LHIpKSx0LnByb3RvY29sPT09dm9pZCAwJiZ0Lmhvc3RuYW1lPT09dm9pZCAwJiZ0LnBvcnQ9PT12b2lkIDAmJnQucGF0aG5hbWU9PT12b2lkIDAmJihlLnBhdGhuYW1lPWIobi5wYXRobmFtZSxyKSksdC5wcm90b2NvbD09PXZvaWQgMCYmdC5ob3N0bmFtZT09PXZvaWQgMCYmdC5wb3J0PT09dm9pZCAwJiZ0LnBhdGhuYW1lPT09dm9pZCAwJiZ0LnNlYXJjaD09PXZvaWQgMCYmKGUuc2VhcmNoPWIobi5zZWFyY2guc3Vic3RyaW5nKDEsbi5zZWFyY2gubGVuZ3RoKSxyKSksdC5wcm90b2NvbD09PXZvaWQgMCYmdC5ob3N0bmFtZT09PXZvaWQgMCYmdC5wb3J0PT09dm9pZCAwJiZ0LnBhdGhuYW1lPT09dm9pZCAwJiZ0LnNlYXJjaD09PXZvaWQgMCYmdC5oYXNoPT09dm9pZCAwJiYoZS5oYXNoPWIobi5oYXNoLnN1YnN0cmluZygxLG4uaGFzaC5sZW5ndGgpLHIpKX1jYXRjaHt0aHJvdyBuZXcgVHlwZUVycm9yKGBpbnZhbGlkIGJhc2VVUkwgJyR7dC5iYXNlVVJMfScuYCl9aWYodHlwZW9mIHQucHJvdG9jb2w9PVwic3RyaW5nXCImJihlLnByb3RvY29sPWNlKHQucHJvdG9jb2wscikpLHR5cGVvZiB0LnVzZXJuYW1lPT1cInN0cmluZ1wiJiYoZS51c2VybmFtZT1pZSh0LnVzZXJuYW1lLHIpKSx0eXBlb2YgdC5wYXNzd29yZD09XCJzdHJpbmdcIiYmKGUucGFzc3dvcmQ9c2UodC5wYXNzd29yZCxyKSksdHlwZW9mIHQuaG9zdG5hbWU9PVwic3RyaW5nXCImJihlLmhvc3RuYW1lPW5lKHQuaG9zdG5hbWUscikpLHR5cGVvZiB0LnBvcnQ9PVwic3RyaW5nXCImJihlLnBvcnQ9b2UodC5wb3J0LGUucHJvdG9jb2wscikpLHR5cGVvZiB0LnBhdGhuYW1lPT1cInN0cmluZ1wiKXtpZihlLnBhdGhuYW1lPXQucGF0aG5hbWUsbiYmIUooZS5wYXRobmFtZSxyKSl7bGV0IG89bi5wYXRobmFtZS5sYXN0SW5kZXhPZihcIi9cIik7bz49MCYmKGUucGF0aG5hbWU9YihuLnBhdGhuYW1lLnN1YnN0cmluZygwLG8rMSkscikrZS5wYXRobmFtZSl9ZS5wYXRobmFtZT1hZShlLnBhdGhuYW1lLGUucHJvdG9jb2wscil9cmV0dXJuIHR5cGVvZiB0LnNlYXJjaD09XCJzdHJpbmdcIiYmKGUuc2VhcmNoPXJlKHQuc2VhcmNoLHIpKSx0eXBlb2YgdC5oYXNoPT1cInN0cmluZ1wiJiYoZS5oYXNoPXRlKHQuaGFzaCxyKSksZX1mdW5jdGlvbiBDKGUpe3JldHVybiBlLnJlcGxhY2UoLyhbKyo/Ont9KClcXFxcXSkvZyxcIlxcXFwkMVwiKX1mdW5jdGlvbiBPZShlKXtyZXR1cm4gZS5yZXBsYWNlKC8oWy4rKj9eJHt9KClbXFxdfC9cXFxcXSkvZyxcIlxcXFwkMVwiKX1mdW5jdGlvbiBrZShlLHQpe3QuZGVsaW1pdGVyPz89XCIvIz9cIix0LnByZWZpeGVzPz89XCIuL1wiLHQuc2Vuc2l0aXZlPz89ITEsdC5zdHJpY3Q/Pz0hMSx0LmVuZD8/PSEwLHQuc3RhcnQ/Pz0hMCx0LmVuZHNXaXRoPVwiXCI7bGV0IHI9XCIuKlwiLG49YFteJHtPZSh0LmRlbGltaXRlcil9XSs/YCxvPS9bJF9cXHUyMDBDXFx1MjAwRFxccHtJRF9Db250aW51ZX1dL3UsYz1cIlwiO2ZvcihsZXQgbD0wO2w8ZS5sZW5ndGg7KytsKXtsZXQgcz1lW2xdO2lmKHMudHlwZT09PTMpe2lmKHMubW9kaWZpZXI9PT0zKXtjKz1DKHMudmFsdWUpO2NvbnRpbnVlfWMrPWB7JHtDKHMudmFsdWUpfX0ke2socy5tb2RpZmllcil9YDtjb250aW51ZX1sZXQgaT1zLmhhc0N1c3RvbU5hbWUoKSxhPSEhcy5zdWZmaXgubGVuZ3RofHwhIXMucHJlZml4Lmxlbmd0aCYmKHMucHJlZml4Lmxlbmd0aCE9PTF8fCF0LnByZWZpeGVzLmluY2x1ZGVzKHMucHJlZml4KSksZj1sPjA/ZVtsLTFdOm51bGwsZD1sPGUubGVuZ3RoLTE/ZVtsKzFdOm51bGw7aWYoIWEmJmkmJnMudHlwZT09PTEmJnMubW9kaWZpZXI9PT0zJiZkJiYhZC5wcmVmaXgubGVuZ3RoJiYhZC5zdWZmaXgubGVuZ3RoKWlmKGQudHlwZT09PTMpe2xldCBUPWQudmFsdWUubGVuZ3RoPjA/ZC52YWx1ZVswXTpcIlwiO2E9by50ZXN0KFQpfWVsc2UgYT0hZC5oYXNDdXN0b21OYW1lKCk7aWYoIWEmJiFzLnByZWZpeC5sZW5ndGgmJmYmJmYudHlwZT09PTMpe2xldCBUPWYudmFsdWVbZi52YWx1ZS5sZW5ndGgtMV07YT10LnByZWZpeGVzLmluY2x1ZGVzKFQpfWEmJihjKz1cIntcIiksYys9QyhzLnByZWZpeCksaSYmKGMrPWA6JHtzLm5hbWV9YCkscy50eXBlPT09Mj9jKz1gKCR7cy52YWx1ZX0pYDpzLnR5cGU9PT0xP2l8fChjKz1gKCR7bn0pYCk6cy50eXBlPT09MCYmKCFpJiYoIWZ8fGYudHlwZT09PTN8fGYubW9kaWZpZXIhPT0zfHxhfHxzLnByZWZpeCE9PVwiXCIpP2MrPVwiKlwiOmMrPWAoJHtyfSlgKSxzLnR5cGU9PT0xJiZpJiZzLnN1ZmZpeC5sZW5ndGgmJm8udGVzdChzLnN1ZmZpeFswXSkmJihjKz1cIlxcXFxcIiksYys9QyhzLnN1ZmZpeCksYSYmKGMrPVwifVwiKSxzLm1vZGlmaWVyIT09MyYmKGMrPWsocy5tb2RpZmllcikpfXJldHVybiBjfXZhciBtZT1jbGFzc3sjaTsjbj17fTsjdD17fTsjZT17fTsjcz17fTsjbD0hMTtjb25zdHJ1Y3Rvcih0PXt9LHIsbil7dHJ5e2xldCBvO2lmKHR5cGVvZiByPT1cInN0cmluZ1wiP289cjpuPXIsdHlwZW9mIHQ9PVwic3RyaW5nXCIpe2xldCBpPW5ldyBIKHQpO2lmKGkucGFyc2UoKSx0PWkucmVzdWx0LG89PT12b2lkIDAmJnR5cGVvZiB0LnByb3RvY29sIT1cInN0cmluZ1wiKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBIGJhc2UgVVJMIG11c3QgYmUgcHJvdmlkZWQgZm9yIGEgcmVsYXRpdmUgY29uc3RydWN0b3Igc3RyaW5nLlwiKTt0LmJhc2VVUkw9b31lbHNle2lmKCF0fHx0eXBlb2YgdCE9XCJvYmplY3RcIil0aHJvdyBuZXcgVHlwZUVycm9yKFwicGFyYW1ldGVyIDEgaXMgbm90IG9mIHR5cGUgJ3N0cmluZycgYW5kIGNhbm5vdCBjb252ZXJ0IHRvIGRpY3Rpb25hcnkuXCIpO2lmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcihcInBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdzdHJpbmcnLlwiKX10eXBlb2Ygbj5cInVcIiYmKG49e2lnbm9yZUNhc2U6ITF9KTtsZXQgYz17aWdub3JlQ2FzZTpuLmlnbm9yZUNhc2U9PT0hMH0sbD17cGF0aG5hbWU6RSxwcm90b2NvbDpFLHVzZXJuYW1lOkUscGFzc3dvcmQ6RSxob3N0bmFtZTpFLHBvcnQ6RSxzZWFyY2g6RSxoYXNoOkV9O3RoaXMuI2k9dyhsLHQsITApLF8odGhpcy4jaS5wcm90b2NvbCk9PT10aGlzLiNpLnBvcnQmJih0aGlzLiNpLnBvcnQ9XCJcIik7bGV0IHM7Zm9yKHMgb2YgRyl7aWYoIShzIGluIHRoaXMuI2kpKWNvbnRpbnVlO2xldCBpPXt9LGE9dGhpcy4jaVtzXTtzd2l0Y2godGhpcy4jdFtzXT1bXSxzKXtjYXNlXCJwcm90b2NvbFwiOk9iamVjdC5hc3NpZ24oaSx4KSxpLmVuY29kZVBhcnQ9eTticmVhaztjYXNlXCJ1c2VybmFtZVwiOk9iamVjdC5hc3NpZ24oaSx4KSxpLmVuY29kZVBhcnQ9bGU7YnJlYWs7Y2FzZVwicGFzc3dvcmRcIjpPYmplY3QuYXNzaWduKGkseCksaS5lbmNvZGVQYXJ0PWZlO2JyZWFrO2Nhc2VcImhvc3RuYW1lXCI6T2JqZWN0LmFzc2lnbihpLEIpLFcoYSk/aS5lbmNvZGVQYXJ0PWo6aS5lbmNvZGVQYXJ0PXo7YnJlYWs7Y2FzZVwicG9ydFwiOk9iamVjdC5hc3NpZ24oaSx4KSxpLmVuY29kZVBhcnQ9SzticmVhaztjYXNlXCJwYXRobmFtZVwiOk4odGhpcy4jbi5wcm90b2NvbCk/KE9iamVjdC5hc3NpZ24oaSxxLGMpLGkuZW5jb2RlUGFydD1oZSk6KE9iamVjdC5hc3NpZ24oaSx4LGMpLGkuZW5jb2RlUGFydD11ZSk7YnJlYWs7Y2FzZVwic2VhcmNoXCI6T2JqZWN0LmFzc2lnbihpLHgsYyksaS5lbmNvZGVQYXJ0PWRlO2JyZWFrO2Nhc2VcImhhc2hcIjpPYmplY3QuYXNzaWduKGkseCxjKSxpLmVuY29kZVBhcnQ9cGU7YnJlYWt9dHJ5e3RoaXMuI3Nbc109RChhLGkpLHRoaXMuI25bc109Rih0aGlzLiNzW3NdLHRoaXMuI3Rbc10saSksdGhpcy4jZVtzXT1rZSh0aGlzLiNzW3NdLGkpLHRoaXMuI2w9dGhpcy4jbHx8dGhpcy4jc1tzXS5zb21lKGY9PmYudHlwZT09PTIpfWNhdGNoe3Rocm93IG5ldyBUeXBlRXJyb3IoYGludmFsaWQgJHtzfSBwYXR0ZXJuICcke3RoaXMuI2lbc119Jy5gKX19fWNhdGNoKG8pe3Rocm93IG5ldyBUeXBlRXJyb3IoYEZhaWxlZCB0byBjb25zdHJ1Y3QgJ1VSTFBhdHRlcm4nOiAke28ubWVzc2FnZX1gKX19dGVzdCh0PXt9LHIpe2xldCBuPXtwYXRobmFtZTpcIlwiLHByb3RvY29sOlwiXCIsdXNlcm5hbWU6XCJcIixwYXNzd29yZDpcIlwiLGhvc3RuYW1lOlwiXCIscG9ydDpcIlwiLHNlYXJjaDpcIlwiLGhhc2g6XCJcIn07aWYodHlwZW9mIHQhPVwic3RyaW5nXCImJnIpdGhyb3cgbmV3IFR5cGVFcnJvcihcInBhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlICdzdHJpbmcnLlwiKTtpZih0eXBlb2YgdD5cInVcIilyZXR1cm4hMTt0cnl7dHlwZW9mIHQ9PVwib2JqZWN0XCI/bj13KG4sdCwhMSk6bj13KG4sZ2UodCxyKSwhMSl9Y2F0Y2h7cmV0dXJuITF9bGV0IG87Zm9yKG8gb2YgRylpZighdGhpcy4jbltvXS5leGVjKG5bb10pKXJldHVybiExO3JldHVybiEwfWV4ZWModD17fSxyKXtsZXQgbj17cGF0aG5hbWU6XCJcIixwcm90b2NvbDpcIlwiLHVzZXJuYW1lOlwiXCIscGFzc3dvcmQ6XCJcIixob3N0bmFtZTpcIlwiLHBvcnQ6XCJcIixzZWFyY2g6XCJcIixoYXNoOlwiXCJ9O2lmKHR5cGVvZiB0IT1cInN0cmluZ1wiJiZyKXRocm93IG5ldyBUeXBlRXJyb3IoXCJwYXJhbWV0ZXIgMSBpcyBub3Qgb2YgdHlwZSAnc3RyaW5nJy5cIik7aWYodHlwZW9mIHQ+XCJ1XCIpcmV0dXJuO3RyeXt0eXBlb2YgdD09XCJvYmplY3RcIj9uPXcobix0LCExKTpuPXcobixnZSh0LHIpLCExKX1jYXRjaHtyZXR1cm4gbnVsbH1sZXQgbz17fTtyP28uaW5wdXRzPVt0LHJdOm8uaW5wdXRzPVt0XTtsZXQgYztmb3IoYyBvZiBHKXtsZXQgbD10aGlzLiNuW2NdLmV4ZWMobltjXSk7aWYoIWwpcmV0dXJuIG51bGw7bGV0IHM9e307Zm9yKGxldFtpLGFdb2YgdGhpcy4jdFtjXS5lbnRyaWVzKCkpaWYodHlwZW9mIGE9PVwic3RyaW5nXCJ8fHR5cGVvZiBhPT1cIm51bWJlclwiKXtsZXQgZj1sW2krMV07c1thXT1mfW9bY109e2lucHV0Om5bY10/P1wiXCIsZ3JvdXBzOnN9fXJldHVybiBvfXN0YXRpYyBjb21wYXJlQ29tcG9uZW50KHQscixuKXtsZXQgbz0oaSxhKT0+e2ZvcihsZXQgZiBvZltcInR5cGVcIixcIm1vZGlmaWVyXCIsXCJwcmVmaXhcIixcInZhbHVlXCIsXCJzdWZmaXhcIl0pe2lmKGlbZl08YVtmXSlyZXR1cm4tMTtpZihpW2ZdPT09YVtmXSljb250aW51ZTtyZXR1cm4gMX1yZXR1cm4gMH0sYz1uZXcgUigzLFwiXCIsXCJcIixcIlwiLFwiXCIsMyksbD1uZXcgUigwLFwiXCIsXCJcIixcIlwiLFwiXCIsMykscz0oaSxhKT0+e2xldCBmPTA7Zm9yKDtmPE1hdGgubWluKGkubGVuZ3RoLGEubGVuZ3RoKTsrK2Ype2xldCBkPW8oaVtmXSxhW2ZdKTtpZihkKXJldHVybiBkfXJldHVybiBpLmxlbmd0aD09PWEubGVuZ3RoPzA6byhpW2ZdPz9jLGFbZl0/P2MpfTtyZXR1cm4hci4jZVt0XSYmIW4uI2VbdF0/MDpyLiNlW3RdJiYhbi4jZVt0XT9zKHIuI3NbdF0sW2xdKTohci4jZVt0XSYmbi4jZVt0XT9zKFtsXSxuLiNzW3RdKTpzKHIuI3NbdF0sbi4jc1t0XSl9Z2V0IHByb3RvY29sKCl7cmV0dXJuIHRoaXMuI2UucHJvdG9jb2x9Z2V0IHVzZXJuYW1lKCl7cmV0dXJuIHRoaXMuI2UudXNlcm5hbWV9Z2V0IHBhc3N3b3JkKCl7cmV0dXJuIHRoaXMuI2UucGFzc3dvcmR9Z2V0IGhvc3RuYW1lKCl7cmV0dXJuIHRoaXMuI2UuaG9zdG5hbWV9Z2V0IHBvcnQoKXtyZXR1cm4gdGhpcy4jZS5wb3J0fWdldCBwYXRobmFtZSgpe3JldHVybiB0aGlzLiNlLnBhdGhuYW1lfWdldCBzZWFyY2goKXtyZXR1cm4gdGhpcy4jZS5zZWFyY2h9Z2V0IGhhc2goKXtyZXR1cm4gdGhpcy4jZS5oYXNofWdldCBoYXNSZWdFeHBHcm91cHMoKXtyZXR1cm4gdGhpcy4jbH19O2V4cG9ydHttZSBhcyBVUkxQYXR0ZXJufTtcbiIsCiAgICAiaW1wb3J0IHsgVVJMUGF0dGVybiB9IGZyb20gXCIuL2Rpc3QvdXJscGF0dGVybi5qc1wiO1xuXG5leHBvcnQgeyBVUkxQYXR0ZXJuIH07XG5cbmlmICghZ2xvYmFsVGhpcy5VUkxQYXR0ZXJuKSB7XG4gIGdsb2JhbFRoaXMuVVJMUGF0dGVybiA9IFVSTFBhdHRlcm47XG59XG4iLAogICAgImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQ29tcG9uZW50VHJlZSB9IGZyb20gXCIuLi9jbGllbnQvdHlwZXNcIjtcbmltcG9ydCB7IGZsYXR0ZW5Db21wb25lbnRUcmVlIH0gZnJvbSBcIi4uL2NsaWVudC9oZWxwZXJzL2ZsYXR0ZW5Db21wb25lbnRUcmVlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgeyBhcHAgfSA9IGF3YWl0IGltcG9ydChwYXRoLnJlc29sdmUoXCIuL2FwcC9ib290c3RyYXAudHNcIikpO1xuXG4gIGNvbnN0IGVudHJpZXMgPSBhcHAuZ2V0Q29tcG9uZW50VHJlZSgpO1xuXG4gIGZ1bmN0aW9uIGdldEVudHJpZXMoY29tcG9uZW50VHJlZTogQ29tcG9uZW50VHJlZSkge1xuICAgIGNvbnN0IG91dDogc3RyaW5nW10gPSBbXCIvYXBwL2NsaWVudC50c3hcIl07XG4gICAgaWYgKCFjb21wb25lbnRUcmVlKSB7XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoZmxhdHRlbkNvbXBvbmVudFRyZWUoY29tcG9uZW50VHJlZSkpKTtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIG5ldyBTZXQoW1xuICAgICAgXCIvYXBwL2NsaWVudC50c3hcIixcbiAgICAgIC4uLmdldEVudHJpZXMoZW50cmllcykubWFwKChpdGVtKSA9PiBgL2FwcC92aWV3cy8ke2l0ZW19LnRzeGApLFxuICAgIF0pLFxuICApO1xufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENvbXBvbmVudFRyZWUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW5Db21wb25lbnRUcmVlKGNvbXBvbmVudFRyZWU6IENvbXBvbmVudFRyZWUpOiBzdHJpbmdbXSB7XG4gIGxldCBvdXQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgW3Jvb3QsIGJyYW5jaGVzXSBvZiBjb21wb25lbnRUcmVlKSB7XG4gICAgb3V0LnB1c2gocm9vdCwgLi4uZmxhdHRlbkNvbXBvbmVudFRyZWUoYnJhbmNoZXMpLmZsYXQoKSk7XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20obmV3IFNldChvdXQpKTtcbn1cbiIsCiAgICAiaW1wb3J0IGNvbW1hbmRlciBmcm9tICcuL2luZGV4LmpzJztcblxuLy8gd3JhcHBlciB0byBwcm92aWRlIG5hbWVkIGV4cG9ydHMgZm9yIEVTTS5cbmV4cG9ydCBjb25zdCB7XG4gIHByb2dyYW0sXG4gIGNyZWF0ZUNvbW1hbmQsXG4gIGNyZWF0ZUFyZ3VtZW50LFxuICBjcmVhdGVPcHRpb24sXG4gIENvbW1hbmRlckVycm9yLFxuICBJbnZhbGlkQXJndW1lbnRFcnJvcixcbiAgSW52YWxpZE9wdGlvbkFyZ3VtZW50RXJyb3IsIC8vIGRlcHJlY2F0ZWQgb2xkIG5hbWVcbiAgQ29tbWFuZCxcbiAgQXJndW1lbnQsXG4gIE9wdGlvbixcbiAgSGVscCxcbn0gPSBjb21tYW5kZXI7XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXQSxXQUNZLEdBQUc7QUFDWCxhQUFTLHdC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QUMsS0FBSyxLQUFLLEVBQUU7QUFBQSxJQUNyQixNQUFRLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUN0QixNQUFRLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUN0QixZQUFjLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxJQUM1QixRQUFVLENBQUMsS0FBSyxHQUFHLEdBQUc7QUFBQSxJQUN0QixlQUFpQixDQUFDLEtBQUssSUFBSSxHQUFHO0FBQUEsSUFDOUIsS0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDO0FBQUEsSUFDakIsV0FBYSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDM0IsV0FBYSxDQUFDLElBQUksS0FBSyxHQUFHO0FBQUEsSUFDMUIsYUFBZSxDQUFDLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDM0IsUUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDeEIsWUFBYyxDQUFDLEtBQUssS0FBSyxFQUFFO0FBQUEsSUFDM0IsVUFBWSxDQUFDLElBQUksS0FBSyxFQUFFO0FBQUEsSUFDeEIsVUFBWSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDMUIsUUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFO0FBQUEsSUFDdEIsUUFBVSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDeEIsU0FBVyxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDekIsV0FBYSxDQUFDLEtBQUssSUFBSSxHQUFHO0FBQUEsSUFDMUIsV0FBYSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDM0IsV0FBYSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDM0IsTUFBUSxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDdEIsYUFBZSxDQUFDLEdBQUcsS0FBSyxHQUFHO0FBQUEsSUFDM0IsV0FBYSxDQUFDLElBQUksS0FBSyxHQUFHO0FBQUEsSUFDMUIsS0FBTyxDQUFDLEtBQUssS0FBSyxHQUFHO0FBQUEsSUFDckIsTUFBUSxDQUFDLEdBQUcsS0FBSyxHQUFHO0FBQUEsSUFDcEIsU0FBVyxD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UUFBRyxNQUFJLEtBQUk7QUFBQyxVQUFJLElBQUUsSUFBRyxJQUFFLElBQUU7QUFBRSxZQUFLLElBQUUsRUFBRSxVQUFRO0FBQUMsWUFBSSxJQUFFLEVBQUUsT0FBTyxHQUFFLENBQUM7QUFBRSxZQUFHLE1BQUksSUFBRSxLQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUcsTUFBSSxJQUFFLEtBQUcsR0FBRyxLQUFLLENBQUMsR0FBRTtBQUFDLGVBQUcsRUFBRTtBQUFLO0FBQUEsUUFBUTtBQUFDO0FBQUEsTUFBSztBQUFDLFdBQUksR0FBRTtBQUFDLFVBQUUsNkJBQTZCLEdBQUc7QUFBRTtBQUFBLE1BQVE7QUFBQyxRQUFFLEtBQUssRUFBQyxNQUFLLFFBQU8sT0FBTSxHQUFFLE9BQU0sRUFBQyxDQUFDLEdBQUUsSUFBRTtBQUFFO0FBQUEsSUFBUTtBQUFDLFFBQUcsTUFBSSxLQUFJO0FBQUMsVUFBSSxJQUFFLEdBQUUsSUFBRSxJQUFHLElBQUUsSUFBRSxHQUFFLElBQUU7QUFBRyxVQUFHLEVBQUUsT0FBSyxLQUFJO0FBQUMsVUFBRSxvQ0FBb0MsR0FBRztBQUFFO0FBQUEsTUFBUTtBQUFDLFlBQUssSUFBRSxFQUFFLFVBQVE7QUFBQyxhQUFJLEdBQUcsRUFBRSxJQUFHLEtBQUUsR0FBRTtBQUFDLFlBQUUsc0JBQXNCLEVBQUUsVUFBVSxJQUFJLEdBQUUsSUFBRTtBQUFHO0FBQUEsUUFBSztBQUFDLFlBQUcsRUFBRSxPQUFLLE1BQUs7QUFBQyxlQUFHLEVBQUUsT0FBSyxFQUFFO0FBQUs7QUFBQSxRQUFRO0FBQUMsWUFBRyxFQUFFLE9BQUssS0FBSTtBQUFDLGNBQUcsS0FBSSxNQUFJLEdBQUU7QUFBQztBQUFJO0FBQUEsVUFBSztBQUFBLFFBQUMsV0FBUyxFQUFFLE9BQUssUUFBTSxLQUFJLEVBQUUsSUFBRSxPQUFLLE1BQUs7QUFBQyxZQUFFLHVDQUF1QyxHQUFHLEdBQUUsSUFBRTtBQUFHO0FBQUEsUUFBSztBQUFDLGFBQUcsRUFBRTtBQUFBLE1BQUk7QUFBQyxVQUFHO0FBQUU7QUFBUyxVQUFHLEdBQUU7QUFBQyxVQUFFLHlCQUF5QixHQUFHO0FBQUU7QUFBQSxNQUFRO0FBQUMsV0FBSSxHQUFFO0FBQUMsVUFBRSxzQkFBc0IsR0FBRztBQUFFO0FBQUEsTUFBUTtBQUFDLFFBQUUsS0FBSyxFQUFDLE1BQUssU0FBUSxPQUFNLEdBQUUsT0FBTSxFQUFDLENBQUMsR0FBRSxJQUFFO0FBQUU7QUFBQSxJQUFRO0FBQUMsTUFBRSxLQUFLLEVBQUMsTUFBSyxRQUFPLE9BQU0sR0FBRSxPQUFNLEVBQUUsS0FBSSxDQUFDO0FBQUEsRUFBQztBQUFDLFNBQU8sRUFBRSxLQUFLLEVBQUMsTUFBSyxPQUFNLE9BQU0sR0FBRSxPQUFNLEdBQUUsQ0FBQyxHQUFFO0FBQUE7QUFBRSxJQUFTLFlBQUMsQ0FBQyxHQUFFLElBQUUsQ0FBQyxHQUFFO0FBQUMsTUFBSSxJQUFFLEVBQUUsQ0FBQztBQUFFLElBQUUsY0FBWSxPQUFNLEVBQUUsYUFBVztBQUFLLE1BQUksSUFBRSxLQUFLLEVBQUUsRUFBRSxTQUFTLFFBQU8sSUFBRSxDQUFDLEdBQUUsSUFBRSxHQUFFLElBQUUsR0FBRSxJQUFFLElBQUcsSUFBRSxJQUFJLEtBQUksSUFBRSxPQUFHO0FBQUMsUUFBRyxJQUFFLEVBQUUsVUFBUSxFQUFFLEdBQUcsU0FBTztBQUFFLGFBQU8sRUFBRSxLQUFLO0FBQUEsS0FBTyxJQUFFLE1BQUksRUFBRSxnQkFBZ0IsS0FBRyxFQUFFLFVBQVUsR0FBRSxJQUFFLE9BQUc7QUFBQyxRQUFJLElBQUUsRUFBRSxDQUFDO0FBQUUsUUFBRyxNQUFTO0FBQUUsYUFBTztBQUFFLFVBQUksTUFBSyxHQUFFLE9BQU0sTUFBRyxFQUFFO0FBQUcsVUFBTSxJQUFJLFVBQVUsY0FBYyxRQUFRLGVBQWUsR0FBRztBQUFBLEtBQUcsSUFBRSxNQUFJO0FBQUMsUUFBSSxJQUFFLElBQUc7QUFBRSxVQUFLLElBQUUsRUFBRSxNQUFNLEtBQUcsRUFBRSxjQUFjO0FBQUcsV0FBRztBQUFFLFdBQU87QUFBQSxLQUFHLEtBQUcsT0FBRyxHQUFFLElBQUUsRUFBRSxjQUFZLElBQUcsSUFBRSxJQUFHLElBQUUsT0FBRztBQUFDLFNBQUc7QUFBQSxLQUFHLElBQUUsTUFBSTtBQUFDLE1BQUUsV0FBUyxFQUFFLEtBQUssSUFBSSxFQUFFLEdBQUUsSUFBRyxJQUFHLEVBQUUsQ0FBQyxHQUFFLElBQUcsQ0FBQyxDQUFDLEdBQUUsSUFBRTtBQUFBLEtBQUssSUFBRSxDQUFDLEdBQUUsR0FBRSxHQUFFLEdBQUUsTUFBSTtBQUFDLFFBQUksSUFBRTtBQUFFLFlBQU87QUFBQSxXQUFPO0FBQUksWUFBRTtBQUFFO0FBQUEsV0FBVTtBQUFJLFlBQUU7QUFBRTtBQUFBLFdBQVU7QUFBSSxZQUFFO0FBQUU7QUFBQTtBQUFNLFNBQUksTUFBSSxLQUFHLE1BQUksR0FBRTtBQUFDLFFBQUUsQ0FBQztBQUFFO0FBQUEsSUFBTTtBQUFDLFFBQUcsRUFBRSxJQUFHLE1BQUksR0FBRTtBQUFDLFdBQUk7QUFBRTtBQUFPLFFBQUUsS0FBSyxJQUFJLEVBQUUsR0FBRSxJQUFHLElBQUcsRUFBRSxDQUFDLEdBQUUsSUFBRyxDQUFDLENBQUM7QUFBRTtBQUFBLElBQU07QUFBQyxRQUFJO0FBQUUsUUFBRSxNQUFJLE1BQUksSUFBRSxJQUFFLElBQUUsSUFBRSxJQUFFO0FBQUUsUUFBSSxJQUFFO0FBQUUsVUFBSSxLQUFHLElBQUUsR0FBRSxJQUFFLE1BQUksTUFBSSxNQUFJLElBQUUsR0FBRSxJQUFFO0FBQUksUUFBSTtBQUFFLFFBQUcsSUFBRSxJQUFFLElBQUUsTUFBSSxJQUFFLE1BQUssRUFBRSxJQUFJLENBQUM7QUFBRSxZQUFNLElBQUksVUFBVSxtQkFBbUIsS0FBSztBQUFFLE1BQUUsSUFBSSxDQUFDLEdBQUUsRUFBRSxLQUFLLElBQUksRUFBRSxHQUFFLEdBQUUsRUFBRSxDQUFDLEdBQUUsR0FBRSxFQUFFLENBQUMsR0FBRSxDQUFDLENBQUM7QUFBQTtBQUFHLFFBQUssSUFBRSxFQUFFLFVBQVE7QUFBQyxRQUFJLElBQUUsRUFBRSxNQUFNLEdBQUUsSUFBRSxFQUFFLE1BQU0sR0FBRSxJQUFFLEVBQUUsT0FBTztBQUFFLFNBQUksTUFBSSxNQUFJLElBQUUsRUFBRSxVQUFVLElBQUcsS0FBRyxHQUFFO0FBQUMsVUFBSSxJQUFFLEtBQUc7QUFBRyxRQUFFLFNBQVMsUUFBUSxDQUFDLE9BQUksTUFBSyxFQUFFLENBQUMsR0FBRSxJQUFFLEtBQUksRUFBRTtBQUFFLFVBQUksSUFBRSxFQUFFO0FBQUUsUUFBRSxHQUFFLEdBQUUsR0FBRSxJQUFHLENBQUM7QUFBRTtBQUFBLElBQVE7QUFBQyxRQUFJLElBQUUsS0FBRyxFQUFFLGNBQWM7QUFBRSxRQUFHLEdBQUU7QUFBQyxRQUFFLENBQUM7QUFBRTtBQUFBLElBQVE7QUFBQyxRQUFHLEVBQUUsTUFBTSxHQUFFO0FBQUMsVUFBSSxJQUFFLEVBQUUsR0FBRSxJQUFFLEVBQUUsTUFBTSxHQUFFLElBQUUsRUFBRSxPQUFPO0FBQUUsT0FBQyxNQUFJLE1BQUksSUFBRSxFQUFFLFVBQVU7QUFBRyxVQUFJLElBQUUsRUFBRTtBQUFFLFFBQUUsT0FBTztBQUFFLFVBQUksS0FBRyxFQUFFO0FBQUUsUUFBRSxHQUFFLEdBQUUsR0FBRSxHQUFFLEVBQUU7QUFBRTtBQUFBLElBQVE7QUFBQyxNQUFFLEdBQUUsRUFBRSxLQUFLO0FBQUEsRUFBQztBQUFDLFNBQU87QUFBQTtBQUFFLElBQVMsWUFBQyxDQUFDLEdBQUU7QUFBQyxTQUFPLEVBQUUsUUFBUSwwQkFBeUIsTUFBTTtBQUFBO0FBQUUsSUFBUyxZQUFDLENBQUMsR0FBRTtBQUFDLFNBQU8sS0FBRyxFQUFFLGFBQVcsT0FBSztBQUFBO0FBQUksSUFBUyxZQUFDLENBQUMsR0FBRSxHQUFFLEdBQUU7QUFBQyxTQUFPLEVBQUUsRUFBRSxHQUFFLENBQUMsR0FBRSxHQUFFLENBQUM7QUFBQTtBQUFFLElBQVMsWUFBQyxDQUFDLEdBQUU7QUFBQyxVQUFPO0FBQUEsU0FBUTtBQUFFLGFBQU07QUFBQSxTQUFTO0FBQUUsYUFBTTtBQUFBLFNBQVM7QUFBRSxhQUFNO0FBQUEsU0FBUztBQUFFLGFBQU07QUFBQTtBQUFBO0FBQUksSUFBUyxZQUFDLENBQUMsR0FBRSxHQUFFLElBQUUsQ0FBQyxHQUFFO0FBQUMsSUFBRSxjQUFZLE9BQU0sRUFBRSxhQUFXLE1BQUssRUFBRSxjQUFZLE9BQUcsRUFBRSxXQUFTLE9BQUcsRUFBRSxRQUFNLE1BQUcsRUFBRSxVQUFRLE1BQUcsRUFBRSxXQUFTO0FBQUcsTUFBSSxJQUFFLEVBQUUsUUFBTSxNQUFJO0FBQUcsV0FBUSxLQUFLLEdBQUU7QUFBQyxRQUFHLEVBQUUsU0FBTyxHQUFFO0FBQUMsUUFBRSxhQUFXLElBQUUsS0FBRyxFQUFFLEVBQUUsS0FBSyxJQUFFLEtBQUcsTUFBTSxFQUFFLEVBQUUsS0FBSyxLQUFLLEVBQUUsRUFBRSxRQUFRO0FBQUk7QUFBQSxJQUFRO0FBQUMsU0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJO0FBQUUsUUFBSSxJQUFFLEtBQUssRUFBRSxFQUFFLFNBQVMsUUFBTyxJQUFFLEVBQUU7QUFBTSxRQUFHLEVBQUUsU0FBTyxJQUFFLElBQUUsSUFBRSxFQUFFLFNBQU8sTUFBSSxJQUFFLEtBQUksRUFBRSxPQUFPLFdBQVMsRUFBRSxPQUFPLFFBQU87QUFBQyxRQUFFLGFBQVcsS0FBRyxFQUFFLGFBQVcsSUFBRSxLQUFHLElBQUksS0FBSyxFQUFFLEVBQUUsUUFBUSxNQUFJLEtBQUcsT0FBTyxLQUFLLEVBQUUsRUFBRSxRQUFRO0FBQUs7QUFBQSxJQUFRO0FBQUMsUUFBRyxFQUFFLGFBQVcsS0FBRyxFQUFFLGFBQVcsR0FBRTtBQUFDLFdBQUcsTUFBTSxFQUFFLEVBQUUsTUFBTSxLQUFLLEtBQUssRUFBRSxFQUFFLE1BQU0sTUFBSyxLQUFHLEVBQUUsRUFBRSxRQUFRO0FBQUU7QUFBQSxJQUFRO0FBQUMsU0FBRyxNQUFNLEVBQUUsRUFBRSxNQUFNLEtBQUksS0FBRyxPQUFPLFNBQVEsS0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFFLEtBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRSxLQUFHLE1BQU0sUUFBUSxFQUFFLEVBQUUsTUFBTSxNQUFLLEVBQUUsYUFBVyxNQUFJLEtBQUc7QUFBQSxFQUFJO0FBQUMsTUFBSSxJQUFFLElBQUksRUFBRSxFQUFFLFFBQVEsU0FBTyxJQUFFLElBQUksRUFBRSxFQUFFLFNBQVM7QUFBSyxNQUFHLEVBQUU7QUFBSSxXQUFPLEVBQUUsV0FBUyxLQUFHLEdBQUcsT0FBTSxFQUFFLFNBQVMsU0FBTyxLQUFHLE1BQU0sT0FBSyxLQUFHLEtBQUksSUFBSSxPQUFPLEdBQUUsRUFBRSxDQUFDLENBQUM7QUFBRSxJQUFFLFdBQVMsS0FBRyxNQUFNLE9BQU87QUFBUSxNQUFJLElBQUU7QUFBRyxNQUFHLEVBQUUsUUFBTztBQUFDLFFBQUksSUFBRSxFQUFFLEVBQUUsU0FBTztBQUFHLE1BQUUsU0FBTyxLQUFHLEVBQUUsYUFBVyxNQUFJLElBQUUsRUFBRSxVQUFVLFFBQVEsQ0FBQyxLQUFFO0FBQUEsRUFBRztBQUFDLFNBQU8sTUFBSSxLQUFHLE1BQU0sS0FBSyxPQUFNLElBQUksT0FBTyxHQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQUE7QUFBcUssSUFBUyxZQUFDLENBQUMsR0FBRSxHQUFFO0FBQUMsU0FBTyxFQUFFLFNBQU8sRUFBRSxPQUFLLE1BQUksUUFBSSxLQUFHLEVBQUUsU0FBTyxJQUFFLFNBQUksRUFBRSxNQUFJLFFBQU0sRUFBRSxNQUFJLFFBQU0sRUFBRSxNQUFJLE1BQUk7QUFBQTtBQUFHLElBQVMsWUFBQyxDQUFDLEdBQUUsR0FBRTtBQUFDLFNBQU8sRUFBRSxXQUFXLENBQUMsSUFBRSxFQUFFLFVBQVUsRUFBRSxRQUFPLEVBQUUsTUFBTSxJQUFFO0FBQUE7QUFBRSxJQUFTLGFBQUUsQ0FBQyxHQUFFLEdBQUU7QUFBQyxTQUFPLEVBQUUsU0FBUyxDQUFDLElBQUUsRUFBRSxPQUFPLEdBQUUsRUFBRSxTQUFPLEVBQUUsTUFBTSxJQUFFO0FBQUE7QUFBRSxJQUFTLFlBQUMsQ0FBQyxHQUFFO0FBQUMsVUFBTyxLQUFHLEVBQUUsU0FBTyxJQUFFLFFBQUcsRUFBRSxPQUFLLFFBQU0sRUFBRSxPQUFLLFFBQU0sRUFBRSxPQUFLLFFBQU0sRUFBRSxP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R0FBRTtBQUFDLGFBQUcsRUFBRSxFQUFFLEtBQUs7QUFBRTtBQUFBLE1BQVE7QUFBQyxXQUFHLElBQUksRUFBRSxFQUFFLEtBQUssS0FBSyxFQUFFLEVBQUUsUUFBUTtBQUFJO0FBQUEsSUFBUTtBQUFDLFFBQUksSUFBRSxFQUFFLGNBQWMsR0FBRSxNQUFJLEVBQUUsT0FBTyxZQUFVLEVBQUUsT0FBTyxXQUFTLEVBQUUsT0FBTyxXQUFTLE1BQUksRUFBRSxTQUFTLFNBQVMsRUFBRSxNQUFNLElBQUcsSUFBRSxJQUFFLElBQUUsRUFBRSxJQUFFLEtBQUcsTUFBSyxJQUFFLElBQUUsRUFBRSxTQUFPLElBQUUsRUFBRSxJQUFFLEtBQUc7QUFBSyxTQUFJLEtBQUcsS0FBRyxFQUFFLFNBQU8sS0FBRyxFQUFFLGFBQVcsS0FBRyxNQUFJLEVBQUUsT0FBTyxXQUFTLEVBQUUsT0FBTztBQUFPLFVBQUcsRUFBRSxTQUFPLEdBQUU7QUFBQyxZQUFJLElBQUUsRUFBRSxNQUFNLFNBQU8sSUFBRSxFQUFFLE1BQU0sS0FBRztBQUFHLFlBQUUsRUFBRSxLQUFLLENBQUM7QUFBQSxNQUFDO0FBQU0sYUFBRyxFQUFFLGNBQWM7QUFBRSxTQUFJLE1BQUksRUFBRSxPQUFPLFVBQVEsS0FBRyxFQUFFLFNBQU8sR0FBRTtBQUFDLFVBQUksSUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQU87QUFBRyxVQUFFLEVBQUUsU0FBUyxTQUFTLENBQUM7QUFBQSxJQUFDO0FBQUMsVUFBSSxLQUFHLE1BQUssS0FBRyxFQUFFLEVBQUUsTUFBTSxHQUFFLE1BQUksS0FBRyxJQUFJLEVBQUUsU0FBUSxFQUFFLFNBQU8sSUFBRSxLQUFHLElBQUksRUFBRSxXQUFTLEVBQUUsU0FBTyxJQUFFLE1BQUksS0FBRyxJQUFJLFFBQU0sRUFBRSxTQUFPLE9BQUssT0FBSyxLQUFHLEVBQUUsU0FBTyxLQUFHLEVBQUUsYUFBVyxLQUFHLEtBQUcsRUFBRSxXQUFTLE1BQUksS0FBRyxNQUFJLEtBQUcsSUFBSSxPQUFNLEVBQUUsU0FBTyxLQUFHLEtBQUcsRUFBRSxPQUFPLFVBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQUksS0FBRyxPQUFNLEtBQUcsRUFBRSxFQUFFLE1BQU0sR0FBRSxNQUFJLEtBQUcsTUFBSyxFQUFFLGFBQVcsTUFBSSxLQUFHLEVBQUUsRUFBRSxRQUFRO0FBQUEsRUFBRTtBQUFDLFNBQU87QUFBQTtBQUF6eWEsSUFBSSxJQUFFLE1BQUs7QUFBQSxFQUFDLE9BQUs7QUFBQSxFQUFFLE9BQUs7QUFBQSxFQUFHLFNBQU87QUFBQSxFQUFHLFFBQU07QUFBQSxFQUFHLFNBQU87QUFBQSxFQUFHLFdBQVM7QUFBQSxFQUFFLFdBQVcsQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRTtBQUFDLFNBQUssT0FBSyxHQUFFLEtBQUssT0FBSyxHQUFFLEtBQUssU0FBTyxHQUFFLEtBQUssUUFBTSxHQUFFLEtBQUssU0FBTyxHQUFFLEtBQUssV0FBUztBQUFBO0FBQUEsRUFBRSxhQUFhLEdBQUU7QUFBQyxXQUFPLEtBQUssU0FBTyxhQUFXLEtBQUssUUFBTTtBQUFBO0FBQVM7QUFBL08sSUFBaVAsS0FBRztBQUFwUCxJQUF3USxLQUFHO0FBQTNRLElBQThTLElBQUU7QUFBbThILElBQUksSUFBRSxFQUFDLFdBQVUsSUFBRyxVQUFTLElBQUcsV0FBVSxNQUFHLFFBQU8sS0FBRTtBQUF0RCxJQUF3RCxJQUFFLEVBQUMsV0FBVSxLQUFJLFVBQVMsSUFBRyxXQUFVLE1BQUcsUUFBTyxLQUFFO0FBQTNHLElBQTZHLElBQUUsRUFBQyxXQUFVLEtBQUksVUFBUyxLQUFJLFdBQVUsTUFBRyxRQUFPLEtBQUU7QUFBOFUsSUFBSSxLQUFHLENBQUMsT0FBTSxRQUFPLFFBQU8sU0FBUSxNQUFLLEtBQUs7QUFBdXpFLElBQUksSUFBRSxNQUFLO0FBQUEsRUFBQztBQUFBLEVBQUcsS0FBRyxDQUFDO0FBQUEsRUFBRSxLQUFHLENBQUM7QUFBQSxFQUFFLEtBQUc7QUFBQSxFQUFFLEtBQUc7QUFBQSxFQUFFLEtBQUc7QUFBQSxFQUFFLEtBQUc7QUFBQSxFQUFFLEtBQUc7QUFBQSxFQUFFLEtBQUc7QUFBQSxFQUFFLEtBQUc7QUFBQSxFQUFHLFdBQVcsQ0FBQyxHQUFFO0FBQUMsU0FBSyxLQUFHO0FBQUE7QUFBQSxNQUFNLE1BQU0sR0FBRTtBQUFDLFdBQU8sS0FBSztBQUFBO0FBQUEsRUFBRyxLQUFLLEdBQUU7QUFBQyxTQUFJLEtBQUssS0FBRyxFQUFFLEtBQUssSUFBRyxJQUFFLEVBQUUsS0FBSyxLQUFHLEtBQUssR0FBRyxRQUFPLEtBQUssTUFBSSxLQUFLLElBQUc7QUFBQyxVQUFHLEtBQUssS0FBRyxHQUFFLEtBQUssR0FBRyxLQUFLLElBQUksU0FBTyxPQUFNO0FBQUMsWUFBRyxLQUFLLE9BQUssR0FBRTtBQUFDLGVBQUssR0FBRyxHQUFFLEtBQUssR0FBRyxJQUFFLEtBQUssR0FBRyxHQUFFLENBQUMsSUFBRSxLQUFLLEdBQUcsSUFBRSxLQUFLLEdBQUcsR0FBRSxDQUFDLElBQUUsS0FBSyxHQUFHLEdBQUUsQ0FBQztBQUFFO0FBQUEsUUFBUSxXQUFTLEtBQUssT0FBSyxHQUFFO0FBQUMsZUFBSyxHQUFHLENBQUM7QUFBRTtBQUFBLFFBQVE7QUFBQyxhQUFLLEdBQUcsSUFBRyxDQUFDO0FBQUU7QUFBQSxNQUFLO0FBQUMsVUFBRyxLQUFLLEtBQUc7QUFBRSxZQUFHLEtBQUssR0FBRztBQUFFLGVBQUssTUFBSTtBQUFBO0FBQU87QUFBUyxVQUFHLEtBQUssR0FBRyxHQUFFO0FBQUMsYUFBSyxNQUFJO0FBQUU7QUFBQSxNQUFRO0FBQUMsY0FBTyxLQUFLO0FBQUEsYUFBUztBQUFFLGVBQUssR0FBRyxLQUFHLEtBQUssR0FBRyxDQUFDO0FBQUU7QUFBQSxhQUFXO0FBQUUsY0FBRyxLQUFLLEdBQUcsR0FBRTtBQUFDLGlCQUFLLEdBQUc7QUFBRSxnQkFBSSxJQUFFLEdBQUUsSUFBRTtBQUFFLGlCQUFLLEdBQUcsS0FBRyxJQUFFLEdBQUUsSUFBRSxLQUFHLEtBQUssT0FBSyxJQUFFLElBQUcsS0FBSyxHQUFHLEdBQUUsQ0FBQztBQUFBLFVBQUM7QUFBQztBQUFBLGFBQVc7QUFBRSxlQUFLLEdBQUcsSUFBRSxLQUFLLEdBQUcsQ0FBQyxLQUFHLEtBQUssR0FBRyxLQUFHLEtBQUssR0FBRyxLQUFHLEtBQUssR0FBRyxNQUFJLEtBQUssR0FBRyxDQUFDO0FBQUU7QUFBQSxhQUFXO0FBQUUsZUFBSyxHQUFHLElBQUUsS0FBSyxHQUFHLEdBQUUsQ0FBQyxJQUFFLEtBQUssR0FBRyxLQUFHLEtBQUssR0FBRyxHQUFFLENBQUM7QUFBRTtBQUFBLGFBQVc7QUFBRSxlQUFLLEdBQUcsS0FBRyxLQUFLLEdBQUcsR0FBRSxDQUFDO0FBQUU7QUFBQSxhQUFXO0FBQUUsZUFBSyxHQUFHLElBQUUsS0FBSyxNQUFJLElBQUUsS0FBSyxHQUFHLE1BQUksS0FBSyxNQUFJLElBQUcsS0FBSyxHQUFHLE1BQUksS0FBSyxLQUFHLEtBQUssR0FBRyxHQUFFLENBQUMsSUFBRSxLQUFLLEdBQUcsSUFBRSxLQUFLLEdBQUcsR0FBRSxDQUFDLElBQUUsS0FBSyxHQUFHLElBQUUsS0FBSyxHQUFHLEdBQUUsQ0FBQyxJQUFFLEtBQUssR0FBRyxLQUFHLEtBQUssR0FBRyxHQUFFLENBQUM7QUFBRTtBQUFBLGFBQVc7QUFBRSxlQUFLLEdBQUcsSUFBRSxLQUFLLEdBQUcsR0FBRSxDQUFDLElBQUUsS0FBSyxHQUFHLElBQUUsS0FBSyxHQUFHLEdBQUUsQ0FBQyxJQUFFLEtBQUssR0FBRyxLQUFHLEtBQUssR0FBRyxHQUFFLENBQUM7QUFBRTtBQUFBLGFBQVc7QUFBRSxlQUFLLEdBQUcsSUFBRSxLQUFLLEdBQUcsR0FBRSxDQUFDLElBQUUsS0FBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLEdBQUUsQ0FBQztBQUFFO0FBQUEsYUFBVztBQUFFLGVBQUssR0FBRyxLQUFHLEtBQUssR0FBRyxHQUFFLENBQUM7QUFBRTtBQUFBLGFBQVc7QUFBRTtBQUFBLGFBQVc7QUFBRztBQUFBO0FBQUEsSUFBTTtBQUFDLFNBQUssR0FBRyxhQUFnQixhQUFHLEtBQUssR0FBRyxTQUFZLGNBQUksS0FBSyxHQUFHLE9BQUs7QUFBQTtBQUFBLEVBQUksRUFBRSxDQUFDLEdBQUUsR0FBRTtBQUFDLFlBQU8sS0FBSztBQUFBLFdBQVM7QUFBRTtBQUFBLFdBQVc7QUFBRSxhQUFLLEdBQUcsV0FBUyxLQUFLLEdBQUc7QUFBRTtBQUFBLFdBQVc7QUFBRTtBQUFBLFdBQVc7QUFBRSxhQUFLLEdBQUcsV0FBUyxLQUFLLEdBQUc7QUFBRTtBQUFBLFdBQVc7QUFBRSxhQUFLLEdBQUcsV0FBUyxLQUFLLEdBQUc7QUFBRTtBQUFBLFdBQVc7QUFBRSxhQUFLLEdBQUcsV0FBUyxLQUFLLEdBQUc7QUFBRTtBQUFBLFdBQVc7QUFBRSxhQUFLLEdBQUcsT0FBSyxLQUFLLEdBQUc7QUFBRTtBQUFBLFdBQVc7QUFBRSxhQUFLLEdBQUcsV0FBUyxLQUFLLEdBQUc7QUFBRTtBQUFBLFdBQVc7QUFBRSxhQUFLLEdBQUcsU0FBTyxLQUFLLEdBQUc7QUFBRTtBQUFBLFdBQVc7QUFBRSxhQUFLLEdBQUcsT0FBSyxLQUFLLEdBQUc7QUFBRTtBQUFBLFdBQVc7QUFBRztBQUFBO0FBQU0sU0FBSyxPQUFLLEtBQUcsTUFBSSxPQUFLLENBQUMsR0FBRSxHQUFFLEdBQUUsQ0FBQyxFQUFFLFNBQVMsS0FBSyxFQUFFLEtBQUcsQ0FBQyxHQUFFLEdBQUUsR0FBRSxDQUFDLEVBQUUsU0FBUyxDQUFDLE1BQUksS0FBSyxHQUFHLGFBQVcsS0FBSSxDQUFDLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDLEVBQUUsU0FBUyxLQUFLLEVBQUUsS0FBRyxDQUFDLEdBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxNQUFJLEtBQUssR0FBRyxhQUFXLEtBQUssS0FBRyxNQUFJLEtBQUksQ0FBQyxHQUFFLEdBQUUsR0FBRSxHQUFFLEdBQUUsR0FBRSxDQUFDLEVBQUUsU0FBUyxLQUFLLEVBQUUsS0FBRyxNQUFJLE1BQUksS0FBSyxHQUFHLFdBQVMsTUFBSyxLQUFLLEdBQUcsR0FBRSxDQUFDO0FBQUE7QUFBQSxFQUFFLEVBQUUsQ0FBQyxHQUFFLEdBQUU7QUFBQyxTQUFLLEtBQUcsR0FBRSxLQUFLLEtBQUcsS0FBSyxLQUFHLEdBQUUsS0FBSyxNQUFJLEdBQUUsS0FBSyxLQUFHO0FBQUE7QUFBQSxFQUFFLEVBQUUsR0FBRTtBQUFDLFNBQUssS0FBRyxLQUFLLElBQUcsS0FBSyxLQUFHO0FBQUE7QUFBQSxFQUFFLEVBQUUsQ0FBQyxHQUFFO0FBQUMsU0FBSyxHQUFHLEdBQUUsS0FBSyxLQUFHO0FBQUE7QUFBQSxFQUFFLEVBQUUsQ0FBQyxHQUFFO0FBQUMsV0FBTyxJQUFFLE1BQUksSUFBRSxLQUFLLEdBQUcsU0FBTyxJQUFHLElBQUUsS0FBSyxHQUFHLFNBQU8sS0FBSyxHQUFHLEtBQUcsS0FBSyxHQUFHLEtBQUssR0FBRyxTQUFPO0FBQUE7QUFBQSxFQUFHLEVBQUUsQ0FBQyxHQUFFLEdBQUU7QUFBQyxRQUFJLElBQUUsS0FBSyxHQUFHLENBQUM7QUFBRSxXQUFPLEVBQUUsVUFBUSxNQUFJLEVBQUUsU0FBTyxVQUFRLEVBQUUsU0FBTyxrQkFBZ0IsRUFBRSxTQUFPO0FBQUE7QUFBQSxFQUFnQixFQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssR0FBRyxLQUFLLElBQUcsR0FBRztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUU7QUFBQyxXQUFPLEtBQUssR0FBRyxLQUFLLEtBQUcsR0FBRSxHQUFHLEtBQUcsS0FBSyxHQUFHLEtBQUssS0FBRyxHQUFFLEdBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFHLEdBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFHLEdBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFHLEdBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsV0FBTyxLQUFLLEdBQUcsS0FBSyxJQUFHLEdBQUc7QUFBQTtBQUFBLEVBQUUsRUFBRSxHQUFFO0FBQUMsUUFBRyxLQUFLLEdBQUcsS0FBSyxJQUFHLEdBQUc7QUFBRSxhQUFNO0FBQUcsUUFBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLFVBQVE7QUFBSSxhQUFNO0FBQUcsUUFBSSxJQUFFLEtBQUssR0FBRyxLQUFLLEtBQUcsQ0FBQztBQUFFLFdBQU8sRUFBRSxTQUFPLFVBQVEsRUFBRSxTQUFPLFdBQVMsRUFBRSxTQUFPLFdBQVMsRUFBRSxTQUFPO0FBQUE7QUFBQSxFQUFXLEVBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxHQUFHLEtBQUssSUFBRyxHQUFHO0FBQUE7QUFBQSxFQUFFLEVBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxHQUFHLEtBQUssSUFBSSxRQUFNO0FBQUE7QUFBQSxFQUFPLEVBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxHQUFHLEtBQUssSUFBSSxRQUFNO0FBQUE7QUFBQSxFQUFRLEVBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxHQUFHLEtBQUssSUFBRyxHQUFHO0FBQUE7QUFBQSxFQUFFLEVBQUUsR0FBRTtBQUFDLFdBQU8sS0FBSyxHQUFHLEtBQUssSUFBRyxHQUFHO0FBQUE7QUFBQSxFQUFFLEVBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxLQUFLLEdBQUcsS0FBSyxLQUFJLElBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxFQUFFO0FBQU0sV0FBTyxLQUFLLEdBQUcsVUFBVSxHQUFFLEVBQUUsS0FBSztBQUFBO0FBQUEsRUFBRSxFQUFFLEdBQUU7QUFBQyxRQUFJLElBQUUsQ0FBQztBQUFFLFdBQU8sT0FBTyxHQUFFLENBQUMsR0FBRSxFQUFFLGFBQVc7QUFBRSxRQUFJLElBQUUsRUFBRSxLQUFLLEdBQUcsR0FBTyxXQUFFLENBQUM7QUFBRSxTQUFLLEtBQUcsRUFBRSxDQUFDO0FBQUE7QUFBRTtBQUFFLElBQUksSUFBRSxDQUFDLFlBQVcsWUFBVyxZQUFXLFlBQVcsUUFBTyxZQUFXLFVBQVMsTUFBTTtBQUFwRixJQUFzRixJQUFFO0FBQXF2RyxJQUFJLEtBQUcsTUFBSztBQUFBLEVBQUM7QUFBQSxFQUFHLEtBQUcsQ0FBQztBQUFBLEVBQUUsS0FBRyxDQUFDO0FBQUEsRUFBRSxLQUFHLENBQUM7QUFBQSxFQUFFLEtBQUcsQ0FBQztBQUFBLEVBQUUsS0FBRztBQUFBLEVBQUcsV0FBVyxDQUFDLElBQUUsQ0FBQyxHQUFFLEdBQUUsR0FBRTtBQUFDLFFBQUc7QUFBQyxVQUFJO0FBQUUsaUJBQVUsS0FBRyxXQUFTLElBQUUsSUFBRSxJQUFFLFVBQVMsS0FBRyxVQUFTO0FBQUMsWUFBSSxJQUFFLElBQUksRUFBRSxDQUFDO0FBQUUsWUFBRyxFQUFFLE1BQU0sR0FBRSxJQUFFLEVBQUUsUUFBTyxNQUFTLG9CQUFVLEVBQUUsWUFBVTtBQUFTLGdCQUFNLElBQUksVUFBVSxnRUFBZ0U7QUFBRSxVQUFFLFVBQVE7QUFBQSxNQUFDLE9BQUs7QUFBQyxhQUFJLFlBQVUsS0FBRztBQUFTLGdCQUFNLElBQUksVUFBVSx1RUFBdUU7QUFBRSxZQUFHO0FBQUUsZ0JBQU0sSUFBSSxVQUFVLHNDQUFzQztBQUFBO0FBQUUsYUFBTyxJQUFFLFFBQU0sSUFBRSxFQUFDLFlBQVcsTUFBRTtBQUFHLFVBQUksSUFBRSxFQUFDLFlBQVcsRUFBRSxlQUFhLEtBQUUsR0FBRSxJQUFFLEVBQUMsVUFBUyxHQUFFLFVBQVMsR0FBRSxVQUFTLEdBQUUsVUFBUyxHQUFFLFVBQVMsR0FBRSxNQUFLLEdBQUUsUUFBTyxHQUFFLE1BQUssRUFBQztBQUFFLFdBQUssS0FBRyxFQUFFLEdBQUUsR0FBRSxJQUFFLEdBQUUsRUFBRSxLQUFLLEdBQUcsUUFBUSxNQUFJLEtBQUssR0FBRyxTQUFPLEtBQUssR0FBRyxPQUFLO0FBQUksVUFBSTtBQUFFLFdBQUksS0FBSyxHQUFFO0FBQUMsY0FBSyxLQUFLLEtBQUs7QUFBSTtBQUFTLFlBQUksSUFBRSxDQUFDLEdBQUUsSUFBRSxLQUFLLEdBQUc7QUFBRyxnQkFBTyxLQUFLLEdBQUcsS0FBRyxDQUFDLEdBQUU7QUFBQSxlQUFPO0FBQVcsbUJBQU8sT0FBTyxHQUFFLENBQUMsR0FBRSxFQUFFLGFBQVc7QUFBRTtBQUFBLGVBQVU7QUFBVyxtQkFBTyxPQUFPLEdBQUUsQ0FBQyxHQUFFLEVBQUUsYUFBVztBQUFHO0FBQUEsZUFBVTtBQUFXLG1CQUFPLE9BQU8sR0FBRSxDQUFDLEdBQUUsRUFBRSxhQUFXO0FBQUc7QUFBQSxlQUFVO0FBQVcsbUJBQU8sT0FBTyxHQUFFLENBQUMsR0FBRSxFQUFFLENBQUMsSUFBRSxFQUFFLGFBQVcsSUFBRSxFQUFFLGFBQVc7QUFBRTtBQUFBLGVBQVU7QUFBTyxtQkFBTyxPQUFPLEdBQUUsQ0FBQyxHQUFFLEVBQUUsYUFBVztBQUFFO0FBQUEsZUFBVTtBQUFXLGNBQUUsS0FBSyxHQUFHLFFBQVEsS0FBRyxPQUFPLE9BQU8sR0FBRSxHQUFFLENBQUMsR0FBRSxFQUFFLGFBQVcsT0FBSyxPQUFPLE9BQU8sR0FBRSxHQUFFLENBQUMsR0FBRSxFQUFFLGFBQVc7QUFBSTtBQUFBLGVBQVU7QUFBUyxtQkFBTyxPQUFPLEdBQUUsR0FBRSxDQUFDLEdBQUUsRUFBRSxhQUFXO0FBQUc7QUFBQSxlQUFVO0FBQU8sbUJBQU8sT0FBTyxHQUFFLEdBQUUsQ0FBQyxHQUFFLEVBQUUsYUFBVztBQUFHO0FBQUE7QUFBTSxZQUFHO0FBQUMsZUFBSyxHQUFHLEtBQUcsRUFBRSxHQUFFLENBQUMsR0FBRSxLQUFLLEdBQUcsS0FBRyxFQUFFLEtBQUssR0FBRyxJQUFHLEtBQUssR0FBRyxJQUFHLENBQUMsR0FBRSxLQUFLLEdBQUcsS0FBRyxHQUFHLEtBQUssR0FBRyxJQUFHLENBQUMsR0FBRSxLQUFLLEtBQUcsS0FBSyxNQUFJLEtBQUssR0FBRyxHQUFHLEtBQUssT0FBRyxFQUFFLFNBQU8sQ0FBQztBQUFBLGdCQUFFO0FBQU0sZ0JBQU0sSUFBSSxVQUFVLFdBQVcsY0FBYyxLQUFLLEdBQUcsTUFBTTtBQUFBO0FBQUEsTUFBRTtBQUFBLGFBQVEsR0FBTjtBQUFTLFlBQU0sSUFBSSxVQUFVLHFDQUFxQyxFQUFFLFNBQVM7QUFBQTtBQUFBO0FBQUEsRUFBRyxJQUFJLENBQUMsSUFBRSxDQUFDLEdBQUUsR0FBRTtBQUFDLFFBQUksSUFBRSxFQUFDLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsTUFBSyxJQUFHLFFBQU8sSUFBRyxNQUFLLEdBQUU7QUFBRSxlQUFVLEtBQUcsWUFBVTtBQUFFLFlBQU0sSUFBSSxVQUFVLHNDQUFzQztBQUFFLGVBQVUsSUFBRTtBQUFJLGFBQU07QUFBRyxRQUFHO0FBQUMsYUFBTyxLQUFHLFdBQVMsSUFBRSxFQUFFLEdBQUUsR0FBRSxLQUFFLElBQUUsSUFBRSxFQUFFLEdBQUUsR0FBRyxHQUFFLENBQUMsR0FBRSxLQUFFO0FBQUEsWUFBRTtBQUFNLGFBQU07QUFBQTtBQUFHLFFBQUk7QUFBRSxTQUFJLEtBQUs7QUFBRSxXQUFJLEtBQUssR0FBRyxHQUFHLEtBQUssRUFBRSxFQUFFO0FBQUUsZUFBTTtBQUFHLFdBQU07QUFBQTtBQUFBLEVBQUcsSUFBSSxDQUFDLElBQUUsQ0FBQyxHQUFFLEdBQUU7QUFBQyxRQUFJLElBQUUsRUFBQyxVQUFTLElBQUcsVUFBUyxJQUFHLFVBQVMsSUFBRyxVQUFTLElBQUcsVUFBUyxJQUFHLE1BQUssSUFBRyxRQUFPLElBQUcsTUFBSyxHQUFFO0FBQUUsZUFBVSxLQUFHLFlBQVU7QUFBRSxZQUFNLElBQUksVUFBVSxzQ0FBc0M7QUFBRSxlQUFVLElBQUU7QUFBSTtBQUFPLFFBQUc7QUFBQyxhQUFPLEtBQUcsV0FBUyxJQUFFLEVBQUUsR0FBRSxHQUFFLEtBQUUsSUFBRSxJQUFFLEVBQUUsR0FBRSxHQUFHLEdBQUUsQ0FBQyxHQUFFLEtBQUU7QUFBQSxZQUFFO0FBQU0sYUFBTztBQUFBO0FBQUssUUFBSSxJQUFFLENBQUM7QUFBRSxRQUFFLEVBQUUsU0FBTyxDQUFDLEdBQUUsQ0FBQyxJQUFFLEVBQUUsU0FBTyxDQUFDLENBQUM7QUFBRSxRQUFJO0FBQUUsU0FBSSxLQUFLLEdBQUU7QUFBQyxVQUFJLElBQUUsS0FBSyxHQUFHLEdBQUcsS0FBSyxFQUFFLEVBQUU7QUFBRSxXQUFJO0FBQUUsZUFBTztBQUFLLFVBQUksSUFBRSxDQUFDO0FBQUUs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