@cumulus/hello-world 9.7.0 → 9.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -8678,7 +8678,7 @@ const child_process_1 = __importDefault(__webpack_require__(/*! child_process */
8678
8678
  const message_1 = __webpack_require__(/*! ./message */ "./node_modules/@cumulus/cumulus-message-adapter-js/dist/message.js");
8679
8679
  const typeGuards_1 = __webpack_require__(/*! ./typeGuards */ "./node_modules/@cumulus/cumulus-message-adapter-js/dist/typeGuards.js");
8680
8680
  /**
8681
- * An error to be thrown when invokation of the cumulus-message-adapter fails
8681
+ * An error to be thrown when invocation of the cumulus-message-adapter fails
8682
8682
  */
8683
8683
  class CumulusMessageAdapterExecutionError extends Error {
8684
8684
  // eslint-disable-next-line require-jsdoc
@@ -8717,27 +8717,28 @@ exports.generateCMASpawnArguments = generateCMASpawnArguments;
8717
8717
  async function invokeCumulusMessageAdapter() {
8718
8718
  const spawnArguments = await generateCMASpawnArguments('stream');
8719
8719
  const errorObj = { stderrBuffer: '' };
8720
+ const statusObj = { close: false };
8720
8721
  try {
8721
8722
  const cmaProcess = child_process_1.default.spawn(...spawnArguments);
8722
- cmaProcess.on('error', () => { });
8723
+ cmaProcess.on('error', () => {
8724
+ console.log(`CMA (on error) StdErr: \n ${errorObj.stderrBuffer}`);
8725
+ });
8723
8726
  cmaProcess.stdin.setDefaultEncoding('utf8');
8724
8727
  cmaProcess.stdout.setEncoding('utf8');
8725
8728
  cmaProcess.stderr.setEncoding('utf8');
8726
- cmaProcess.on('close', () => {
8727
- if (cmaProcess.killed !== true) {
8728
- console.log(`CMA Exit Code: ${cmaProcess.exitCode} `);
8729
- if (cmaProcess.exitCode !== 0) {
8730
- console.log(`CMA Failure: ${errorObj.stderrBuffer}`);
8731
- }
8732
- }
8733
- else {
8734
- console.log('CMA process killed');
8729
+ cmaProcess.on('close', (code, signal) => {
8730
+ if (code !== 0) {
8731
+ console.log(`CMA Exit Code: ${code}`);
8732
+ console.log(`CMA Exit Signal: ${signal}`);
8733
+ console.log(`CMA Process Kill: ${cmaProcess.killed}`);
8734
+ console.log(`CMA StdErr: \n ${errorObj.stderrBuffer}\n`);
8735
8735
  }
8736
+ statusObj.close = true;
8736
8737
  });
8737
8738
  cmaProcess.stderr.on('data', (data) => {
8738
8739
  errorObj.stderrBuffer += String(data);
8739
8740
  });
8740
- return { cmaProcess, errorObj };
8741
+ return { cmaProcess, errorObj, statusObj };
8741
8742
  }
8742
8743
  catch (error) {
8743
8744
  const msg = `CMA process failed (${error.shortMessage})\n
@@ -8817,11 +8818,24 @@ async function getCmaOutput(readLine, errorObj) {
8817
8818
  */
8818
8819
  async function runCumulusTask(TaskFunction, cumulusMessage, context, schemas = null) {
8819
8820
  var _a;
8820
- const { cmaProcess, errorObj } = await invokeCumulusMessageAdapter();
8821
+ const { cmaProcess, errorObj, statusObj } = await invokeCumulusMessageAdapter();
8821
8822
  const cmaStdin = cmaProcess.stdin;
8822
8823
  const rl = readline.createInterface({
8823
8824
  input: cmaProcess.stdout
8824
8825
  });
8826
+ let lambdaTimer;
8827
+ let runningTask = false;
8828
+ if (typeof context.getRemainingTimeInMillis === 'function') {
8829
+ lambdaTimer = setTimeout(() => {
8830
+ console.log('Lambda timing out, writing CMA stderr to cloudwatch logs');
8831
+ console.log(`CMA (on start task timeout) StdErr: \n ${errorObj.stderrBuffer}`);
8832
+ }, context.getRemainingTimeInMillis() - 5 * 100);
8833
+ }
8834
+ else {
8835
+ console.log('Info: No CMA timeout buffer dump set, as lambda is not running as a lambda');
8836
+ lambdaTimer = setTimeout(() => {
8837
+ }, 0);
8838
+ }
8825
8839
  try {
8826
8840
  cmaStdin.write('loadAndUpdateRemoteEvent\n');
8827
8841
  cmaStdin.write(JSON.stringify({
@@ -8832,7 +8846,7 @@ async function runCumulusTask(TaskFunction, cumulusMessage, context, schemas = n
8832
8846
  cmaStdin.write('\n<EOC>\n');
8833
8847
  const loadAndUpdateRemoteEventOutput = await getCmaOutput(rl, errorObj);
8834
8848
  if (!typeGuards_1.isCumulusMessageWithAssignedPayload(loadAndUpdateRemoteEventOutput)) {
8835
- throw new Error(`Invalid output typing recieved from
8849
+ throw new Error(`Invalid output typing received from
8836
8850
  loadAndUpdateRemoteEvent ${JSON.stringify(loadAndUpdateRemoteEventOutput)}`);
8837
8851
  }
8838
8852
  setCumulusEnvironment(loadAndUpdateRemoteEventOutput, context);
@@ -8845,10 +8859,14 @@ async function runCumulusTask(TaskFunction, cumulusMessage, context, schemas = n
8845
8859
  cmaStdin.write('\n<EOC>\n');
8846
8860
  const loadNestedEventOutput = await getCmaOutput(rl, errorObj);
8847
8861
  if (!typeGuards_1.isLoadNestedEventInput(loadNestedEventOutput)) {
8848
- throw new Error(`Invalid output typing recieved from
8862
+ throw new Error(`Invalid output typing received from
8849
8863
  loadNestedEvent ${JSON.stringify(loadNestedEventOutput)}`);
8850
8864
  }
8865
+ console.log('Starting task function');
8866
+ runningTask = true;
8851
8867
  const taskOutput = await TaskFunction(loadNestedEventOutput, context);
8868
+ runningTask = false;
8869
+ console.log('Starting task function finished');
8852
8870
  cmaStdin.write('createNextEvent\n');
8853
8871
  cmaStdin.write(JSON.stringify({
8854
8872
  event: loadAndUpdateRemoteEventOutput,
@@ -8858,17 +8876,20 @@ async function runCumulusTask(TaskFunction, cumulusMessage, context, schemas = n
8858
8876
  }));
8859
8877
  cmaStdin.write('\n<EOC>\n');
8860
8878
  const createNextEventOutput = await getCmaOutput(rl, errorObj);
8861
- cmaStdin.write('\n<EXIT>\n');
8879
+ cmaStdin.write('<EXIT>\n');
8862
8880
  if (typeGuards_1.isLoadNestedEventInput(createNextEventOutput)) {
8863
- throw new Error(`Invalid typing recieved from
8881
+ throw new Error(`Invalid typing received from
8864
8882
  createNextEventOutput: ${JSON.stringify(createNextEventOutput)}`);
8865
8883
  }
8866
- return createNextEventOutput;
8884
+ const returnVal = createNextEventOutput;
8885
+ return returnVal;
8867
8886
  }
8868
8887
  catch (error) {
8869
8888
  try {
8870
- cmaStdin.write('\n<EOC>\n');
8871
- cmaStdin.write('\n<EXIT>\n');
8889
+ if (!runningTask) {
8890
+ cmaStdin.write('\n');
8891
+ }
8892
+ cmaStdin.write('<EXIT>\n');
8872
8893
  if (!cmaProcess.kill('SIGTERM')) {
8873
8894
  cmaProcess.kill('SIGKILL');
8874
8895
  }
@@ -8881,8 +8902,19 @@ async function runCumulusTask(TaskFunction, cumulusMessage, context, schemas = n
8881
8902
  ...cumulusMessage, payload: null, exception: error.name
8882
8903
  };
8883
8904
  }
8905
+ // Wait for .close process event to complete before throwing
8906
+ let waitIterations = 0;
8907
+ while (!statusObj.close && waitIterations < 20) {
8908
+ console.log('Waiting up to 2 seconds for CMA child process to exit');
8909
+ // eslint-disable-next-line no-await-in-loop
8910
+ await new Promise((r) => setTimeout(r, 100));
8911
+ waitIterations += 1;
8912
+ }
8884
8913
  throw error;
8885
8914
  }
8915
+ finally {
8916
+ clearTimeout(lambdaTimer);
8917
+ }
8886
8918
  }
8887
8919
  exports.runCumulusTask = runCumulusTask;
8888
8920
  //# sourceMappingURL=cma.js.map
@@ -9312,4 +9344,4 @@ module.exports = require("util");
9312
9344
  /***/ })
9313
9345
 
9314
9346
  /******/ });
9315
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyLWZyb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtc3VwcG9ydC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYXJyYXktc2V0LmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC12bHEuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtc3VwcG9ydC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2JpbmFyeS1zZWFyY2guanMiLCJ3ZWJwYWNrOi8vLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtc3VwcG9ydC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvbWFwcGluZy1saXN0LmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3F1aWNrLXNvcnQuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtc3VwcG9ydC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2Utbm9kZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi91dGlsLmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvc291cmNlLW1hcC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyLmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvc291cmNlLW1hcC1zdXBwb3J0LmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy93ZWJwYWNrL2J1aWxkaW4vbW9kdWxlLmpzIiwid2VicGFjazovL3NyYy9TMy50cyIsIndlYnBhY2s6Ly9zcmMvY2xpZW50LnRzIiwid2VicGFjazovLy4uL3NyYy9saWIvUzNNdWx0aXBhcnRVcGxvYWRzLnRzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2VuZC1vZi1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJhbmdlLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRyaW0uanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVSYW5nZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJdGVyYXRlZUNhbGwuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL190cmltbWVkRW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCb29sZWFuLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL3JhbmdlLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC90b0Zpbml0ZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9OdW1iZXIuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvb25jZS9vbmNlLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL3AtZmluYWxseS9pbmRleC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9wLW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9wLXJldHJ5L2luZGV4LmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL3AtdGltZW91dC9pbmRleC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9wLXdhaXQtZm9yL2luZGV4LmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL3B1bXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvcmV0cnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvcmV0cnkvbGliL3JldHJ5LmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL3JldHJ5L2xpYi9yZXRyeV9vcGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvd3JhcHB5L3dyYXBweS5qcyIsIndlYnBhY2s6Ly9zcmMvc2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vc3JjL3Rlc3QtdXRpbHMudHMiLCJ3ZWJwYWNrOi8vc3JjL3V0aWxzLnRzIiwid2VicGFjazovLy4uL3NyYy9jaGVja3N1bS50cyIsIndlYnBhY2s6Ly8uLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLi4vc3JjL3ZhbGlkYXRlLnRzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2NoZWNrc3VtL25vZGVfbW9kdWxlcy9ja3N1bS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zcmMvbG9nLnRzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9jb21tb24vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9jb21tb24vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc051bWJlci5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9jb21tb24vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvbG9nZ2VyL25vZGVfbW9kdWxlcy9sb2Rhc2guaXNlcnJvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9pbmRleC5qcyIsIndlYnBhY2s6Ly9ub2RlX21vZHVsZXMvQGN1bXVsdXMvY3VtdWx1cy1tZXNzYWdlLWFkYXB0ZXItanMvZGlzdC9jbWEuanMiLCJ3ZWJwYWNrOi8vbm9kZV9tb2R1bGVzL0BjdW11bHVzL2N1bXVsdXMtbWVzc2FnZS1hZGFwdGVyLWpzL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbm9kZV9tb2R1bGVzL0BjdW11bHVzL2N1bXVsdXMtbWVzc2FnZS1hZGFwdGVyLWpzL2Rpc3QvbWVzc2FnZS5qcyIsIndlYnBhY2s6Ly9ub2RlX21vZHVsZXMvQGN1bXVsdXMvY3VtdWx1cy1tZXNzYWdlLWFkYXB0ZXItanMvZGlzdC90eXBlR3VhcmRzLmpzIiwid2VicGFjazovL25vZGVfbW9kdWxlcy9AY3VtdWx1cy9jdW11bHVzLW1lc3NhZ2UtYWRhcHRlci1qcy9kaXN0L3R5cGVzLmpzIiwid2VicGFjazovL25vZGVfbW9kdWxlcy9sb29rcGF0aC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJhd3Mtc2RrXCIiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJjaGlsZF9wcm9jZXNzXCIiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJxdWVyeXN0cmluZ1wiIiwid2VicGFjazovL2V4dGVybmFsIFwicmVhZGxpbmVcIiIsIndlYnBhY2s6Ly9leHRlcm5hbCBcInN0cmVhbVwiIiwid2VicGFjazovL2V4dGVybmFsIFwidXRpbFwiIl0sIm5hbWVzIjpbImN1bXVsdXNNZXNzYWdlQWRhcHRlciIsInJlcXVpcmUiLCJkZWxldGVTM09iamVjdCIsInMzT2JqZWN0RXhpc3RzIiwiczNQdXRPYmplY3QiLCJsb2ciLCJ0aHJvd0Vycm9ySWZDb25maWd1cmVkIiwiZXZlbnQiLCJleGVjdXRpb24iLCJjb25maWciLCJyZXRyeUZpbGVuYW1lIiwiYnVja2V0IiwiaXNSZXRyeSIsInBhc3NPblJldHJ5IiwiQnVja2V0IiwiS2V5IiwiZGVidWciLCJmYWlsIiwiQm9keSIsIkVycm9yIiwiaGVsbG9Xb3JsZCIsImhlbGxvIiwiaGFuZGxlciIsImNvbnRleHQiLCJydW5DdW11bHVzVGFzayIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUN2RUEsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyx5RkFBUTtBQUMzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsU0FBUztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUN4SEEsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNELG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLG1CQUFPLENBQUMsNkZBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOzs7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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsTUFBTTtBQUNuQztBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsMkJBQTJCO0FBQzlDLHFCQUFxQiwrQ0FBK0M7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwyQkFBMkI7QUFDOUM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDJCQUEyQjtBQUM5QztBQUNBO0FBQ0EscUJBQXFCLDRCQUE0QjtBQUNqRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7O0FDeG5DQSxnQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsZ0JBQWdCLG1CQUFPLENBQUMscUdBQWM7QUFDdEMsV0FBVyxtQkFBTyxDQUFDLHlGQUFRO0FBQzNCLGVBQWUsbUJBQU8sQ0FBQyxtR0FBYTtBQUNwQyxrQkFBa0IsbUJBQU8sQ0FBQyx5R0FBZ0I7O0FBRTFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsU0FBUztBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7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QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJCQUEyQixRQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLG1CQUFPLENBQUMsNkhBQTRCO0FBQ2pFLDRCQUE0QixtQkFBTyxDQUFDLDJIQUEyQjtBQUMvRCxxQkFBcUIsbUJBQU8sQ0FBQywyR0FBbUI7Ozs7Ozs7Ozs7OztBQ1BoRCxtQkFBTyxDQUFDLHVFQUFJOzs7Ozs7Ozs7Ozs7QUNBWixzRUFBd0IsbUJBQU8sQ0FBQywrRkFBWTtBQUM1QyxXQUFXLG1CQUFPLENBQUMsa0JBQU07O0FBRXpCO0FBQ0E7QUFDQSxPQUFPLG1CQUFPLENBQUMsY0FBSTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLDREQUFhOztBQUV0QztBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixZQUFZLGtCQUFrQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxnQ0FBZ0MsRUFBRTtBQUM1RixHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsR0FBRyxzQkFBc0IsR0FBRztBQUN2RjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msd0JBQXdCO0FBQzVELHNDQUFzQyxzQkFBc0I7QUFDNUQsd0NBQXdDLDRCQUE0QjtBQUNwRSxpREFBaUQsd0JBQXdCO0FBQ3pFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxlQUFlO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlO0FBQ2Y7QUFDQSxnQ0FBZ0MsUUFBUTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkYsb0JBQW9CO0FBQy9HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNobkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNyQkE7O0FBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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LGdCQUFnQjtBQUM1QjtBQUNBO0FBQ0EseUJBQXlCLFFBQVEsWUFBWTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELDZDQUE2QyxFQUFFO0FBQ3pHO0FBQ0E7QUFDQTtBQUNBLGtGQUFrRixjQUFjLEVBQUU7QUFDbEc7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDMUtBLG9DOzs7Ozs7Ozs7OztBQ0FBLDBDOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLCtCOzs7Ozs7Ozs7OztBQ0FBLGlDOzs7Ozs7Ozs7OztBQ0FBLHdDOzs7Ozs7Ozs7OztBQ0FBLHFDOzs7Ozs7Ozs7OztBQ0FBLG1DOzs7Ozs7Ozs7OztBQ0FBLGlDIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9pbmRleC5qc1wiKTtcbiIsIi8qIGVzbGludC1kaXNhYmxlIG5vZGUvbm8tZGVwcmVjYXRlZC1hcGkgKi9cblxudmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ1xuXG52YXIgaXNNb2Rlcm4gPSAoXG4gIHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gIHR5cGVvZiBCdWZmZXIuYWxsb2MgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIEJ1ZmZlci5hbGxvY1Vuc2FmZSA9PT0gJ2Z1bmN0aW9uJyAmJlxuICB0eXBlb2YgQnVmZmVyLmZyb20gPT09ICdmdW5jdGlvbidcbilcblxuZnVuY3Rpb24gaXNBcnJheUJ1ZmZlciAoaW5wdXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaW5wdXQpLnNsaWNlKDgsIC0xKSA9PT0gJ0FycmF5QnVmZmVyJ1xufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKG9iaiwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGJ5dGVPZmZzZXQgPj4+PSAwXG5cbiAgdmFyIG1heExlbmd0aCA9IG9iai5ieXRlTGVuZ3RoIC0gYnl0ZU9mZnNldFxuXG4gIGlmIChtYXhMZW5ndGggPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzXCIpXG4gIH1cblxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSBtYXhMZW5ndGhcbiAgfSBlbHNlIHtcbiAgICBsZW5ndGggPj4+PSAwXG5cbiAgICBpZiAobGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHNcIilcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNNb2Rlcm5cbiAgICA/IEJ1ZmZlci5mcm9tKG9iai5zbGljZShieXRlT2Zmc2V0LCBieXRlT2Zmc2V0ICsgbGVuZ3RoKSlcbiAgICA6IG5ldyBCdWZmZXIobmV3IFVpbnQ4QXJyYXkob2JqLnNsaWNlKGJ5dGVPZmZzZXQsIGJ5dGVPZmZzZXQgKyBsZW5ndGgpKSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAoc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICByZXR1cm4gaXNNb2Rlcm5cbiAgICA/IEJ1ZmZlci5mcm9tKHN0cmluZywgZW5jb2RpbmcpXG4gICAgOiBuZXcgQnVmZmVyKHN0cmluZywgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlckZyb20gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG5cbiAgaWYgKGlzQXJyYXlCdWZmZXIodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBpc01vZGVyblxuICAgID8gQnVmZmVyLmZyb20odmFsdWUpXG4gICAgOiBuZXcgQnVmZmVyKHZhbHVlKVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlckZyb21cbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIGhhc05hdGl2ZU1hcCA9IHR5cGVvZiBNYXAgIT09IFwidW5kZWZpbmVkXCI7XG5cbi8qKlxuICogQSBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGFuIGFycmF5IGFuZCBhIHNldC4gQWRkaW5nIGEgbmV3XG4gKiBtZW1iZXIgaXMgTygxKSwgdGVzdGluZyBmb3IgbWVtYmVyc2hpcCBpcyBPKDEpLCBhbmQgZmluZGluZyB0aGUgaW5kZXggb2YgYW5cbiAqIGVsZW1lbnQgaXMgTygxKS4gUmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgc2V0IGlzIG5vdCBzdXBwb3J0ZWQuIE9ubHlcbiAqIHN0cmluZ3MgYXJlIHN1cHBvcnRlZCBmb3IgbWVtYmVyc2hpcC5cbiAqL1xuZnVuY3Rpb24gQXJyYXlTZXQoKSB7XG4gIHRoaXMuX2FycmF5ID0gW107XG4gIHRoaXMuX3NldCA9IGhhc05hdGl2ZU1hcCA/IG5ldyBNYXAoKSA6IE9iamVjdC5jcmVhdGUobnVsbCk7XG59XG5cbi8qKlxuICogU3RhdGljIG1ldGhvZCBmb3IgY3JlYXRpbmcgQXJyYXlTZXQgaW5zdGFuY2VzIGZyb20gYW4gZXhpc3RpbmcgYXJyYXkuXG4gKi9cbkFycmF5U2V0LmZyb21BcnJheSA9IGZ1bmN0aW9uIEFycmF5U2V0X2Zyb21BcnJheShhQXJyYXksIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgdmFyIHNldCA9IG5ldyBBcnJheVNldCgpO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gYUFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgc2V0LmFkZChhQXJyYXlbaV0sIGFBbGxvd0R1cGxpY2F0ZXMpO1xuICB9XG4gIHJldHVybiBzZXQ7XG59O1xuXG4vKipcbiAqIFJldHVybiBob3cgbWFueSB1bmlxdWUgaXRlbXMgYXJlIGluIHRoaXMgQXJyYXlTZXQuIElmIGR1cGxpY2F0ZXMgaGF2ZSBiZWVuXG4gKiBhZGRlZCwgdGhhbiB0aG9zZSBkbyBub3QgY291bnQgdG93YXJkcyB0aGUgc2l6ZS5cbiAqXG4gKiBAcmV0dXJucyBOdW1iZXJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiBBcnJheVNldF9zaXplKCkge1xuICByZXR1cm4gaGFzTmF0aXZlTWFwID8gdGhpcy5fc2V0LnNpemUgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLl9zZXQpLmxlbmd0aDtcbn07XG5cbi8qKlxuICogQWRkIHRoZSBnaXZlbiBzdHJpbmcgdG8gdGhpcyBzZXQuXG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBBcnJheVNldF9hZGQoYVN0ciwgYUFsbG93RHVwbGljYXRlcykge1xuICB2YXIgc1N0ciA9IGhhc05hdGl2ZU1hcCA/IGFTdHIgOiB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICB2YXIgaXNEdXBsaWNhdGUgPSBoYXNOYXRpdmVNYXAgPyB0aGlzLmhhcyhhU3RyKSA6IGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cik7XG4gIHZhciBpZHggPSB0aGlzLl9hcnJheS5sZW5ndGg7XG4gIGlmICghaXNEdXBsaWNhdGUgfHwgYUFsbG93RHVwbGljYXRlcykge1xuICAgIHRoaXMuX2FycmF5LnB1c2goYVN0cik7XG4gIH1cbiAgaWYgKCFpc0R1cGxpY2F0ZSkge1xuICAgIGlmIChoYXNOYXRpdmVNYXApIHtcbiAgICAgIHRoaXMuX3NldC5zZXQoYVN0ciwgaWR4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc2V0W3NTdHJdID0gaWR4O1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBJcyB0aGUgZ2l2ZW4gc3RyaW5nIGEgbWVtYmVyIG9mIHRoaXMgc2V0P1xuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gQXJyYXlTZXRfaGFzKGFTdHIpIHtcbiAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgIHJldHVybiB0aGlzLl9zZXQuaGFzKGFTdHIpO1xuICB9IGVsc2Uge1xuICAgIHZhciBzU3RyID0gdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgICByZXR1cm4gaGFzLmNhbGwodGhpcy5fc2V0LCBzU3RyKTtcbiAgfVxufTtcblxuLyoqXG4gKiBXaGF0IGlzIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGluIHRoZSBhcnJheT9cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbiBBcnJheVNldF9pbmRleE9mKGFTdHIpIHtcbiAgaWYgKGhhc05hdGl2ZU1hcCkge1xuICAgIHZhciBpZHggPSB0aGlzLl9zZXQuZ2V0KGFTdHIpO1xuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICByZXR1cm4gaWR4O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YXIgc1N0ciA9IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gICAgaWYgKGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cikpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXRbc1N0cl07XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU3RyICsgJ1wiIGlzIG5vdCBpbiB0aGUgc2V0LicpO1xufTtcblxuLyoqXG4gKiBXaGF0IGlzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleD9cbiAqXG4gKiBAcGFyYW0gTnVtYmVyIGFJZHhcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gQXJyYXlTZXRfYXQoYUlkeCkge1xuICBpZiAoYUlkeCA+PSAwICYmIGFJZHggPCB0aGlzLl9hcnJheS5sZW5ndGgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXJyYXlbYUlkeF07XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBlbGVtZW50IGluZGV4ZWQgYnkgJyArIGFJZHgpO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNldCAod2hpY2ggaGFzIHRoZSBwcm9wZXIgaW5kaWNlc1xuICogaW5kaWNhdGVkIGJ5IGluZGV4T2YpLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGNvcHkgb2YgdGhlIGludGVybmFsIGFycmF5IHVzZWRcbiAqIGZvciBzdG9yaW5nIHRoZSBtZW1iZXJzIHNvIHRoYXQgbm8gb25lIGNhbiBtZXNzIHdpdGggaW50ZXJuYWwgc3RhdGUuXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gQXJyYXlTZXRfdG9BcnJheSgpIHtcbiAgcmV0dXJuIHRoaXMuX2FycmF5LnNsaWNlKCk7XG59O1xuXG5leHBvcnRzLkFycmF5U2V0ID0gQXJyYXlTZXQ7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICpcbiAqIEJhc2VkIG9uIHRoZSBCYXNlIDY0IFZMUSBpbXBsZW1lbnRhdGlvbiBpbiBDbG9zdXJlIENvbXBpbGVyOlxuICogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jbG9zdXJlLWNvbXBpbGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL2NvbS9nb29nbGUvZGVidWdnaW5nL3NvdXJjZW1hcC9CYXNlNjRWTFEuamF2YVxuICpcbiAqIENvcHlyaWdodCAyMDExIFRoZSBDbG9zdXJlIENvbXBpbGVyIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRcbiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVcbiAqIG1ldDpcbiAqXG4gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLlxuICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZVxuICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmdcbiAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZFxuICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxuICogICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0c1xuICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkXG4gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXG4gKlxuICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SU1xuICogXCJBUyBJU1wiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SXG4gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVFxuICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsXG4gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UXG4gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSxcbiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWVxuICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxuICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFXG4gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLlxuICovXG5cbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xuXG4vLyBBIHNpbmdsZSBiYXNlIDY0IGRpZ2l0IGNhbiBjb250YWluIDYgYml0cyBvZiBkYXRhLiBGb3IgdGhlIGJhc2UgNjQgdmFyaWFibGVcbi8vIGxlbmd0aCBxdWFudGl0aWVzIHdlIHVzZSBpbiB0aGUgc291cmNlIG1hcCBzcGVjLCB0aGUgZmlyc3QgYml0IGlzIHRoZSBzaWduLFxuLy8gdGhlIG5leHQgZm91ciBiaXRzIGFyZSB0aGUgYWN0dWFsIHZhbHVlLCBhbmQgdGhlIDZ0aCBiaXQgaXMgdGhlXG4vLyBjb250aW51YXRpb24gYml0LiBUaGUgY29udGludWF0aW9uIGJpdCB0ZWxscyB1cyB3aGV0aGVyIHRoZXJlIGFyZSBtb3JlXG4vLyBkaWdpdHMgaW4gdGhpcyB2YWx1ZSBmb2xsb3dpbmcgdGhpcyBkaWdpdC5cbi8vXG4vLyAgIENvbnRpbnVhdGlvblxuLy8gICB8ICAgIFNpZ25cbi8vICAgfCAgICB8XG4vLyAgIFYgICAgVlxuLy8gICAxMDEwMTFcblxudmFyIFZMUV9CQVNFX1NISUZUID0gNTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQkFTRSA9IDEgPDwgVkxRX0JBU0VfU0hJRlQ7XG5cbi8vIGJpbmFyeTogMDExMTExXG52YXIgVkxRX0JBU0VfTUFTSyA9IFZMUV9CQVNFIC0gMTtcblxuLy8gYmluYXJ5OiAxMDAwMDBcbnZhciBWTFFfQ09OVElOVUFUSU9OX0JJVCA9IFZMUV9CQVNFO1xuXG4vKipcbiAqIENvbnZlcnRzIGZyb20gYSB0d28tY29tcGxlbWVudCB2YWx1ZSB0byBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDEgYmVjb21lcyAyICgxMCBiaW5hcnkpLCAtMSBiZWNvbWVzIDMgKDExIGJpbmFyeSlcbiAqICAgMiBiZWNvbWVzIDQgKDEwMCBiaW5hcnkpLCAtMiBiZWNvbWVzIDUgKDEwMSBiaW5hcnkpXG4gKi9cbmZ1bmN0aW9uIHRvVkxRU2lnbmVkKGFWYWx1ZSkge1xuICByZXR1cm4gYVZhbHVlIDwgMFxuICAgID8gKCgtYVZhbHVlKSA8PCAxKSArIDFcbiAgICA6IChhVmFsdWUgPDwgMSkgKyAwO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRvIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgZnJvbSBhIHZhbHVlIHdoZXJlIHRoZSBzaWduIGJpdCBpc1xuICogcGxhY2VkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICBGb3IgZXhhbXBsZSwgYXMgZGVjaW1hbHM6XG4gKiAgIDIgKDEwIGJpbmFyeSkgYmVjb21lcyAxLCAzICgxMSBiaW5hcnkpIGJlY29tZXMgLTFcbiAqICAgNCAoMTAwIGJpbmFyeSkgYmVjb21lcyAyLCA1ICgxMDEgYmluYXJ5KSBiZWNvbWVzIC0yXG4gKi9cbmZ1bmN0aW9uIGZyb21WTFFTaWduZWQoYVZhbHVlKSB7XG4gIHZhciBpc05lZ2F0aXZlID0gKGFWYWx1ZSAmIDEpID09PSAxO1xuICB2YXIgc2hpZnRlZCA9IGFWYWx1ZSA+PiAxO1xuICByZXR1cm4gaXNOZWdhdGl2ZVxuICAgID8gLXNoaWZ0ZWRcbiAgICA6IHNoaWZ0ZWQ7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYmFzZSA2NCBWTFEgZW5jb2RlZCB2YWx1ZS5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiBiYXNlNjRWTFFfZW5jb2RlKGFWYWx1ZSkge1xuICB2YXIgZW5jb2RlZCA9IFwiXCI7XG4gIHZhciBkaWdpdDtcblxuICB2YXIgdmxxID0gdG9WTFFTaWduZWQoYVZhbHVlKTtcblxuICBkbyB7XG4gICAgZGlnaXQgPSB2bHEgJiBWTFFfQkFTRV9NQVNLO1xuICAgIHZscSA+Pj49IFZMUV9CQVNFX1NISUZUO1xuICAgIGlmICh2bHEgPiAwKSB7XG4gICAgICAvLyBUaGVyZSBhcmUgc3RpbGwgbW9yZSBkaWdpdHMgaW4gdGhpcyB2YWx1ZSwgc28gd2UgbXVzdCBtYWtlIHN1cmUgdGhlXG4gICAgICAvLyBjb250aW51YXRpb24gYml0IGlzIG1hcmtlZC5cbiAgICAgIGRpZ2l0IHw9IFZMUV9DT05USU5VQVRJT05fQklUO1xuICAgIH1cbiAgICBlbmNvZGVkICs9IGJhc2U2NC5lbmNvZGUoZGlnaXQpO1xuICB9IHdoaWxlICh2bHEgPiAwKTtcblxuICByZXR1cm4gZW5jb2RlZDtcbn07XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgbmV4dCBiYXNlIDY0IFZMUSB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBzdHJpbmcgYW5kIHJldHVybnMgdGhlXG4gKiB2YWx1ZSBhbmQgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB2aWEgdGhlIG91dCBwYXJhbWV0ZXIuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2RlY29kZShhU3RyLCBhSW5kZXgsIGFPdXRQYXJhbSkge1xuICB2YXIgc3RyTGVuID0gYVN0ci5sZW5ndGg7XG4gIHZhciByZXN1bHQgPSAwO1xuICB2YXIgc2hpZnQgPSAwO1xuICB2YXIgY29udGludWF0aW9uLCBkaWdpdDtcblxuICBkbyB7XG4gICAgaWYgKGFJbmRleCA+PSBzdHJMZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkV4cGVjdGVkIG1vcmUgZGlnaXRzIGluIGJhc2UgNjQgVkxRIHZhbHVlLlwiKTtcbiAgICB9XG5cbiAgICBkaWdpdCA9IGJhc2U2NC5kZWNvZGUoYVN0ci5jaGFyQ29kZUF0KGFJbmRleCsrKSk7XG4gICAgaWYgKGRpZ2l0ID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiYXNlNjQgZGlnaXQ6IFwiICsgYVN0ci5jaGFyQXQoYUluZGV4IC0gMSkpO1xuICAgIH1cblxuICAgIGNvbnRpbnVhdGlvbiA9ICEhKGRpZ2l0ICYgVkxRX0NPTlRJTlVBVElPTl9CSVQpO1xuICAgIGRpZ2l0ICY9IFZMUV9CQVNFX01BU0s7XG4gICAgcmVzdWx0ID0gcmVzdWx0ICsgKGRpZ2l0IDw8IHNoaWZ0KTtcbiAgICBzaGlmdCArPSBWTFFfQkFTRV9TSElGVDtcbiAgfSB3aGlsZSAoY29udGludWF0aW9uKTtcblxuICBhT3V0UGFyYW0udmFsdWUgPSBmcm9tVkxRU2lnbmVkKHJlc3VsdCk7XG4gIGFPdXRQYXJhbS5yZXN0ID0gYUluZGV4O1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGludFRvQ2hhck1hcCA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJy5zcGxpdCgnJyk7XG5cbi8qKlxuICogRW5jb2RlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIG9mIDAgdG8gNjMgdG8gYSBzaW5nbGUgYmFzZSA2NCBkaWdpdC5cbiAqL1xuZXhwb3J0cy5lbmNvZGUgPSBmdW5jdGlvbiAobnVtYmVyKSB7XG4gIGlmICgwIDw9IG51bWJlciAmJiBudW1iZXIgPCBpbnRUb0NoYXJNYXAubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGludFRvQ2hhck1hcFtudW1iZXJdO1xuICB9XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJNdXN0IGJlIGJldHdlZW4gMCBhbmQgNjM6IFwiICsgbnVtYmVyKTtcbn07XG5cbi8qKlxuICogRGVjb2RlIGEgc2luZ2xlIGJhc2UgNjQgY2hhcmFjdGVyIGNvZGUgZGlnaXQgdG8gYW4gaW50ZWdlci4gUmV0dXJucyAtMSBvblxuICogZmFpbHVyZS5cbiAqL1xuZXhwb3J0cy5kZWNvZGUgPSBmdW5jdGlvbiAoY2hhckNvZGUpIHtcbiAgdmFyIGJpZ0EgPSA2NTsgICAgIC8vICdBJ1xuICB2YXIgYmlnWiA9IDkwOyAgICAgLy8gJ1onXG5cbiAgdmFyIGxpdHRsZUEgPSA5NzsgIC8vICdhJ1xuICB2YXIgbGl0dGxlWiA9IDEyMjsgLy8gJ3onXG5cbiAgdmFyIHplcm8gPSA0ODsgICAgIC8vICcwJ1xuICB2YXIgbmluZSA9IDU3OyAgICAgLy8gJzknXG5cbiAgdmFyIHBsdXMgPSA0MzsgICAgIC8vICcrJ1xuICB2YXIgc2xhc2ggPSA0NzsgICAgLy8gJy8nXG5cbiAgdmFyIGxpdHRsZU9mZnNldCA9IDI2O1xuICB2YXIgbnVtYmVyT2Zmc2V0ID0gNTI7XG5cbiAgLy8gMCAtIDI1OiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWlxuICBpZiAoYmlnQSA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSBiaWdaKSB7XG4gICAgcmV0dXJuIChjaGFyQ29kZSAtIGJpZ0EpO1xuICB9XG5cbiAgLy8gMjYgLSA1MTogYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpcbiAgaWYgKGxpdHRsZUEgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbGl0dGxlWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBsaXR0bGVBICsgbGl0dGxlT2Zmc2V0KTtcbiAgfVxuXG4gIC8vIDUyIC0gNjE6IDAxMjM0NTY3ODlcbiAgaWYgKHplcm8gPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gbmluZSkge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSB6ZXJvICsgbnVtYmVyT2Zmc2V0KTtcbiAgfVxuXG4gIC8vIDYyOiArXG4gIGlmIChjaGFyQ29kZSA9PSBwbHVzKSB7XG4gICAgcmV0dXJuIDYyO1xuICB9XG5cbiAgLy8gNjM6IC9cbiAgaWYgKGNoYXJDb2RlID09IHNsYXNoKSB7XG4gICAgcmV0dXJuIDYzO1xuICB9XG5cbiAgLy8gSW52YWxpZCBiYXNlNjQgZGlnaXQuXG4gIHJldHVybiAtMTtcbn07XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuR1JFQVRFU1RfTE9XRVJfQk9VTkQgPSAxO1xuZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogUmVjdXJzaXZlIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2guXG4gKlxuICogQHBhcmFtIGFMb3cgSW5kaWNlcyBoZXJlIGFuZCBsb3dlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFIaWdoIEluZGljZXMgaGVyZSBhbmQgaGlnaGVyIGRvIG5vdCBjb250YWluIHRoZSBuZWVkbGUuXG4gKiBAcGFyYW0gYU5lZWRsZSBUaGUgZWxlbWVudCBiZWluZyBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBub24tZW1wdHkgYXJyYXkgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgRnVuY3Rpb24gd2hpY2ggdGFrZXMgdHdvIGVsZW1lbnRzIGFuZCByZXR1cm5zIC0xLCAwLCBvciAxLlxuICogQHBhcmFtIGFCaWFzIEVpdGhlciAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICovXG5mdW5jdGlvbiByZWN1cnNpdmVTZWFyY2goYUxvdywgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIC8vIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB3aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gIC8vXG4gIC8vICAgMS4gV2UgZmluZCB0aGUgZXhhY3QgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gIC8vXG4gIC8vICAgMi4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBidXQgd2UgY2FuIHJldHVybiB0aGUgaW5kZXggb2ZcbiAgLy8gICAgICB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQuXG4gIC8vXG4gIC8vICAgMy4gV2UgZGlkIG5vdCBmaW5kIHRoZSBleGFjdCBlbGVtZW50LCBhbmQgdGhlcmUgaXMgbm8gbmV4dC1jbG9zZXN0XG4gIC8vICAgICAgZWxlbWVudCB0aGFuIHRoZSBvbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IsIHNvIHdlIHJldHVybiAtMS5cbiAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGFIaWdoIC0gYUxvdykgLyAyKSArIGFMb3c7XG4gIHZhciBjbXAgPSBhQ29tcGFyZShhTmVlZGxlLCBhSGF5c3RhY2tbbWlkXSwgdHJ1ZSk7XG4gIGlmIChjbXAgPT09IDApIHtcbiAgICAvLyBGb3VuZCB0aGUgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gICAgcmV0dXJuIG1pZDtcbiAgfVxuICBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBncmVhdGVyIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKGFIaWdoIC0gbWlkID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIHVwcGVyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKG1pZCwgYUhpZ2gsIGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgZXhhY3QgbmVlZGxlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZCBpbiB0aGlzIGhheXN0YWNrLiBEZXRlcm1pbmUgaWZcbiAgICAvLyB3ZSBhcmUgaW4gdGVybWluYXRpb24gY2FzZSAoMykgb3IgKDIpIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIHRoaW5nLlxuICAgIGlmIChhQmlhcyA9PSBleHBvcnRzLkxFQVNUX1VQUEVSX0JPVU5EKSB7XG4gICAgICByZXR1cm4gYUhpZ2ggPCBhSGF5c3RhY2subGVuZ3RoID8gYUhpZ2ggOiAtMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9XG4gIH1cbiAgZWxzZSB7XG4gICAgLy8gT3VyIG5lZWRsZSBpcyBsZXNzIHRoYW4gYUhheXN0YWNrW21pZF0uXG4gICAgaWYgKG1pZCAtIGFMb3cgPiAxKSB7XG4gICAgICAvLyBUaGUgZWxlbWVudCBpcyBpbiB0aGUgbG93ZXIgaGFsZi5cbiAgICAgIHJldHVybiByZWN1cnNpdmVTZWFyY2goYUxvdywgbWlkLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIG1pZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGFMb3cgPCAwID8gLTEgOiBhTG93O1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCB3aGljaCB3aWxsIGFsd2F5cyB0cnkgYW5kIHJldHVyblxuICogdGhlIGluZGV4IG9mIHRoZSBjbG9zZXN0IGVsZW1lbnQgaWYgdGhlcmUgaXMgbm8gZXhhY3QgaGl0LiBUaGlzIGlzIGJlY2F1c2VcbiAqIG1hcHBpbmdzIGJldHdlZW4gb3JpZ2luYWwgYW5kIGdlbmVyYXRlZCBsaW5lL2NvbCBwYWlycyBhcmUgc2luZ2xlIHBvaW50cyxcbiAqIGFuZCB0aGVyZSBpcyBhbiBpbXBsaWNpdCByZWdpb24gYmV0d2VlbiBlYWNoIG9mIHRoZW0sIHNvIGEgbWlzcyBqdXN0IG1lYW5zXG4gKiB0aGF0IHlvdSBhcmVuJ3Qgb24gdGhlIHZlcnkgc3RhcnQgb2YgYSByZWdpb24uXG4gKlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgeW91IGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSBhSGF5c3RhY2sgVGhlIGFycmF5IHRoYXQgaXMgYmVpbmcgc2VhcmNoZWQuXG4gKiBAcGFyYW0gYUNvbXBhcmUgQSBmdW5jdGlvbiB3aGljaCB0YWtlcyB0aGUgbmVlZGxlIGFuZCBhbiBlbGVtZW50IGluIHRoZVxuICogICAgIGFycmF5IGFuZCByZXR1cm5zIC0xLCAwLCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuZWVkbGUgaXMgbGVzc1xuICogICAgIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIGVsZW1lbnQsIHJlc3BlY3RpdmVseS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqICAgICBEZWZhdWx0cyB0byAnYmluYXJ5U2VhcmNoLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqL1xuZXhwb3J0cy5zZWFyY2ggPSBmdW5jdGlvbiBzZWFyY2goYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpIHtcbiAgaWYgKGFIYXlzdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICB2YXIgaW5kZXggPSByZWN1cnNpdmVTZWFyY2goLTEsIGFIYXlzdGFjay5sZW5ndGgsIGFOZWVkbGUsIGFIYXlzdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb21wYXJlLCBhQmlhcyB8fCBleHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EKTtcbiAgaWYgKGluZGV4IDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8vIFdlIGhhdmUgZm91bmQgZWl0aGVyIHRoZSBleGFjdCBlbGVtZW50LCBvciB0aGUgbmV4dC1jbG9zZXN0IGVsZW1lbnQgdGhhblxuICAvLyB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLiBIb3dldmVyLCB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBzdWNoXG4gIC8vIGVsZW1lbnQuIE1ha2Ugc3VyZSB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGVzZS5cbiAgd2hpbGUgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgaWYgKGFDb21wYXJlKGFIYXlzdGFja1tpbmRleF0sIGFIYXlzdGFja1tpbmRleCAtIDFdLCB0cnVlKSAhPT0gMCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC0taW5kZXg7XG4gIH1cblxuICByZXR1cm4gaW5kZXg7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDE0IE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgdXRpbCA9IHJlcXVpcmUoJy4vdXRpbCcpO1xuXG4vKipcbiAqIERldGVybWluZSB3aGV0aGVyIG1hcHBpbmdCIGlzIGFmdGVyIG1hcHBpbmdBIHdpdGggcmVzcGVjdCB0byBnZW5lcmF0ZWRcbiAqIHBvc2l0aW9uLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKG1hcHBpbmdBLCBtYXBwaW5nQikge1xuICAvLyBPcHRpbWl6ZWQgZm9yIG1vc3QgY29tbW9uIGNhc2VcbiAgdmFyIGxpbmVBID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZTtcbiAgdmFyIGxpbmVCID0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgdmFyIGNvbHVtbkEgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW47XG4gIHZhciBjb2x1bW5CID0gbWFwcGluZ0IuZ2VuZXJhdGVkQ29sdW1uO1xuICByZXR1cm4gbGluZUIgPiBsaW5lQSB8fCBsaW5lQiA9PSBsaW5lQSAmJiBjb2x1bW5CID49IGNvbHVtbkEgfHxcbiAgICAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSA8PSAwO1xufVxuXG4vKipcbiAqIEEgZGF0YSBzdHJ1Y3R1cmUgdG8gcHJvdmlkZSBhIHNvcnRlZCB2aWV3IG9mIGFjY3VtdWxhdGVkIG1hcHBpbmdzIGluIGFcbiAqIHBlcmZvcm1hbmNlIGNvbnNjaW91cyBtYW5uZXIuIEl0IHRyYWRlcyBhIG5lZ2xpYmFibGUgb3ZlcmhlYWQgaW4gZ2VuZXJhbFxuICogY2FzZSBmb3IgYSBsYXJnZSBzcGVlZHVwIGluIGNhc2Ugb2YgbWFwcGluZ3MgYmVpbmcgYWRkZWQgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIE1hcHBpbmdMaXN0KCkge1xuICB0aGlzLl9hcnJheSA9IFtdO1xuICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICAvLyBTZXJ2ZXMgYXMgaW5maW11bVxuICB0aGlzLl9sYXN0ID0ge2dlbmVyYXRlZExpbmU6IC0xLCBnZW5lcmF0ZWRDb2x1bW46IDB9O1xufVxuXG4vKipcbiAqIEl0ZXJhdGUgdGhyb3VnaCBpbnRlcm5hbCBpdGVtcy4gVGhpcyBtZXRob2QgdGFrZXMgdGhlIHNhbWUgYXJndW1lbnRzIHRoYXRcbiAqIGBBcnJheS5wcm90b3R5cGUuZm9yRWFjaGAgdGFrZXMuXG4gKlxuICogTk9URTogVGhlIG9yZGVyIG9mIHRoZSBtYXBwaW5ncyBpcyBOT1QgZ3VhcmFudGVlZC5cbiAqL1xuTWFwcGluZ0xpc3QucHJvdG90eXBlLnVuc29ydGVkRm9yRWFjaCA9XG4gIGZ1bmN0aW9uIE1hcHBpbmdMaXN0X2ZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZykge1xuICAgIHRoaXMuX2FycmF5LmZvckVhY2goYUNhbGxiYWNrLCBhVGhpc0FyZyk7XG4gIH07XG5cbi8qKlxuICogQWRkIHRoZSBnaXZlbiBzb3VyY2UgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0gT2JqZWN0IGFNYXBwaW5nXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBNYXBwaW5nTGlzdF9hZGQoYU1hcHBpbmcpIHtcbiAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uQWZ0ZXIodGhpcy5fbGFzdCwgYU1hcHBpbmcpKSB7XG4gICAgdGhpcy5fbGFzdCA9IGFNYXBwaW5nO1xuICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX3NvcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2FycmF5LnB1c2goYU1hcHBpbmcpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGZsYXQsIHNvcnRlZCBhcnJheSBvZiBtYXBwaW5ncy4gVGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQgYnlcbiAqIGdlbmVyYXRlZCBwb3NpdGlvbi5cbiAqXG4gKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCByZXR1cm5zIGludGVybmFsIGRhdGEgd2l0aG91dCBjb3B5aW5nLCBmb3JcbiAqIHBlcmZvcm1hbmNlLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgTk9UIGJlIG11dGF0ZWQsIGFuZCBzaG91bGQgYmUgdHJlYXRlZCBhc1xuICogYW4gaW1tdXRhYmxlIGJvcnJvdy4gSWYgeW91IHdhbnQgdG8gdGFrZSBvd25lcnNoaXAsIHlvdSBtdXN0IG1ha2UgeW91ciBvd25cbiAqIGNvcHkuXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfdG9BcnJheSgpIHtcbiAgaWYgKCF0aGlzLl9zb3J0ZWQpIHtcbiAgICB0aGlzLl9hcnJheS5zb3J0KHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQpO1xuICAgIHRoaXMuX3NvcnRlZCA9IHRydWU7XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FycmF5O1xufTtcblxuZXhwb3J0cy5NYXBwaW5nTGlzdCA9IE1hcHBpbmdMaXN0O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyBJdCB0dXJucyBvdXQgdGhhdCBzb21lIChtb3N0PykgSmF2YVNjcmlwdCBlbmdpbmVzIGRvbid0IHNlbGYtaG9zdFxuLy8gYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBtYWtlcyBzZW5zZSBiZWNhdXNlIEMrKyB3aWxsIGxpa2VseSByZW1haW5cbi8vIGZhc3RlciB0aGFuIEpTIHdoZW4gZG9pbmcgcmF3IENQVS1pbnRlbnNpdmUgc29ydGluZy4gSG93ZXZlciwgd2hlbiB1c2luZyBhXG4vLyBjdXN0b20gY29tcGFyYXRvciBmdW5jdGlvbiwgY2FsbGluZyBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSBWTSdzIEMrKyBhbmRcbi8vIEpJVCdkIEpTIGlzIHJhdGhlciBzbG93ICphbmQqIGxvc2VzIEpJVCB0eXBlIGluZm9ybWF0aW9uLCByZXN1bHRpbmcgaW5cbi8vIHdvcnNlIGdlbmVyYXRlZCBjb2RlIGZvciB0aGUgY29tcGFyYXRvciBmdW5jdGlvbiB0aGFuIHdvdWxkIGJlIG9wdGltYWwuIEluXG4vLyBmYWN0LCB3aGVuIHNvcnRpbmcgd2l0aCBhIGNvbXBhcmF0b3IsIHRoZXNlIGNvc3RzIG91dHdlaWdoIHRoZSBiZW5lZml0cyBvZlxuLy8gc29ydGluZyBpbiBDKysuIEJ5IHVzaW5nIG91ciBvd24gSlMtaW1wbGVtZW50ZWQgUXVpY2sgU29ydCAoYmVsb3cpLCB3ZSBnZXRcbi8vIGEgfjM1MDBtcyBtZWFuIHNwZWVkLXVwIGluIGBiZW5jaC9iZW5jaC5odG1sYC5cblxuLyoqXG4gKiBTd2FwIHRoZSBlbGVtZW50cyBpbmRleGVkIGJ5IGB4YCBhbmQgYHlgIGluIHRoZSBhcnJheSBgYXJ5YC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBUaGUgYXJyYXkuXG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogICAgICAgIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaXRlbS5cbiAqIEBwYXJhbSB7TnVtYmVyfSB5XG4gKiAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBzZWNvbmQgaXRlbS5cbiAqL1xuZnVuY3Rpb24gc3dhcChhcnksIHgsIHkpIHtcbiAgdmFyIHRlbXAgPSBhcnlbeF07XG4gIGFyeVt4XSA9IGFyeVt5XTtcbiAgYXJ5W3ldID0gdGVtcDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgd2l0aGluIHRoZSByYW5nZSBgbG93IC4uIGhpZ2hgIGluY2x1c2l2ZS5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbG93XG4gKiAgICAgICAgVGhlIGxvd2VyIGJvdW5kIG9uIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7TnVtYmVyfSBoaWdoXG4gKiAgICAgICAgVGhlIHVwcGVyIGJvdW5kIG9uIHRoZSByYW5nZS5cbiAqL1xuZnVuY3Rpb24gcmFuZG9tSW50SW5SYW5nZShsb3csIGhpZ2gpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQobG93ICsgKE1hdGgucmFuZG9tKCkgKiAoaGlnaCAtIGxvdykpKTtcbn1cblxuLyoqXG4gKiBUaGUgUXVpY2sgU29ydCBhbGdvcml0aG0uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJ5XG4gKiAgICAgICAgQW4gYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbXBhcmF0b3JcbiAqICAgICAgICBGdW5jdGlvbiB0byB1c2UgdG8gY29tcGFyZSB0d28gaXRlbXMuXG4gKiBAcGFyYW0ge051bWJlcn0gcFxuICogICAgICAgIFN0YXJ0IGluZGV4IG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IHJcbiAqICAgICAgICBFbmQgaW5kZXggb2YgdGhlIGFycmF5XG4gKi9cbmZ1bmN0aW9uIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcCwgcikge1xuICAvLyBJZiBvdXIgbG93ZXIgYm91bmQgaXMgbGVzcyB0aGFuIG91ciB1cHBlciBib3VuZCwgd2UgKDEpIHBhcnRpdGlvbiB0aGVcbiAgLy8gYXJyYXkgaW50byB0d28gcGllY2VzIGFuZCAoMikgcmVjdXJzZSBvbiBlYWNoIGhhbGYuIElmIGl0IGlzIG5vdCwgdGhpcyBpc1xuICAvLyB0aGUgZW1wdHkgYXJyYXkgYW5kIG91ciBiYXNlIGNhc2UuXG5cbiAgaWYgKHAgPCByKSB7XG4gICAgLy8gKDEpIFBhcnRpdGlvbmluZy5cbiAgICAvL1xuICAgIC8vIFRoZSBwYXJ0aXRpb25pbmcgY2hvb3NlcyBhIHBpdm90IGJldHdlZW4gYHBgIGFuZCBgcmAgYW5kIG1vdmVzIGFsbFxuICAgIC8vIGVsZW1lbnRzIHRoYXQgYXJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGl2b3QgdG8gdGhlIGJlZm9yZSBpdCwgYW5kXG4gICAgLy8gYWxsIHRoZSBlbGVtZW50cyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gaXQgYWZ0ZXIgaXQuIFRoZSBlZmZlY3QgaXMgdGhhdFxuICAgIC8vIG9uY2UgcGFydGl0aW9uIGlzIGRvbmUsIHRoZSBwaXZvdCBpcyBpbiB0aGUgZXhhY3QgcGxhY2UgaXQgd2lsbCBiZSB3aGVuXG4gICAgLy8gdGhlIGFycmF5IGlzIHB1dCBpbiBzb3J0ZWQgb3JkZXIsIGFuZCBpdCB3aWxsIG5vdCBuZWVkIHRvIGJlIG1vdmVkXG4gICAgLy8gYWdhaW4uIFRoaXMgcnVucyBpbiBPKG4pIHRpbWUuXG5cbiAgICAvLyBBbHdheXMgY2hvb3NlIGEgcmFuZG9tIHBpdm90IHNvIHRoYXQgYW4gaW5wdXQgYXJyYXkgd2hpY2ggaXMgcmV2ZXJzZVxuICAgIC8vIHNvcnRlZCBkb2VzIG5vdCBjYXVzZSBPKG5eMikgcnVubmluZyB0aW1lLlxuICAgIHZhciBwaXZvdEluZGV4ID0gcmFuZG9tSW50SW5SYW5nZShwLCByKTtcbiAgICB2YXIgaSA9IHAgLSAxO1xuXG4gICAgc3dhcChhcnksIHBpdm90SW5kZXgsIHIpO1xuICAgIHZhciBwaXZvdCA9IGFyeVtyXTtcblxuICAgIC8vIEltbWVkaWF0ZWx5IGFmdGVyIGBqYCBpcyBpbmNyZW1lbnRlZCBpbiB0aGlzIGxvb3AsIHRoZSBmb2xsb3dpbmcgaG9sZFxuICAgIC8vIHRydWU6XG4gICAgLy9cbiAgICAvLyAgICogRXZlcnkgZWxlbWVudCBpbiBgYXJ5W3AgLi4gaV1gIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcGl2b3QuXG4gICAgLy9cbiAgICAvLyAgICogRXZlcnkgZWxlbWVudCBpbiBgYXJ5W2krMSAuLiBqLTFdYCBpcyBncmVhdGVyIHRoYW4gdGhlIHBpdm90LlxuICAgIGZvciAodmFyIGogPSBwOyBqIDwgcjsgaisrKSB7XG4gICAgICBpZiAoY29tcGFyYXRvcihhcnlbal0sIHBpdm90KSA8PSAwKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgc3dhcChhcnksIGksIGopO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3YXAoYXJ5LCBpICsgMSwgaik7XG4gICAgdmFyIHEgPSBpICsgMTtcblxuICAgIC8vICgyKSBSZWN1cnNlIG9uIGVhY2ggaGFsZi5cblxuICAgIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcCwgcSAtIDEpO1xuICAgIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgcSArIDEsIHIpO1xuICB9XG59XG5cbi8qKlxuICogU29ydCB0aGUgZ2l2ZW4gYXJyYXkgaW4tcGxhY2Ugd2l0aCB0aGUgZ2l2ZW4gY29tcGFyYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhcnlcbiAqICAgICAgICBBbiBhcnJheSB0byBzb3J0LlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY29tcGFyYXRvclxuICogICAgICAgIEZ1bmN0aW9uIHRvIHVzZSB0byBjb21wYXJlIHR3byBpdGVtcy5cbiAqL1xuZXhwb3J0cy5xdWlja1NvcnQgPSBmdW5jdGlvbiAoYXJ5LCBjb21wYXJhdG9yKSB7XG4gIGRvUXVpY2tTb3J0KGFyeSwgY29tcGFyYXRvciwgMCwgYXJ5Lmxlbmd0aCAtIDEpO1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBiaW5hcnlTZWFyY2ggPSByZXF1aXJlKCcuL2JpbmFyeS1zZWFyY2gnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgYmFzZTY0VkxRID0gcmVxdWlyZSgnLi9iYXNlNjQtdmxxJyk7XG52YXIgcXVpY2tTb3J0ID0gcmVxdWlyZSgnLi9xdWljay1zb3J0JykucXVpY2tTb3J0O1xuXG5mdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIHNvdXJjZU1hcC5zZWN0aW9ucyAhPSBudWxsXG4gICAgPyBuZXcgSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTClcbiAgICA6IG5ldyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKHNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7XG59XG5cblNvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAgPSBmdW5jdGlvbihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHJldHVybiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLmZyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCk7XG59XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vLyBgX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kIGBfX29yaWdpbmFsTWFwcGluZ3NgIGFyZSBhcnJheXMgdGhhdCBob2xkIHRoZVxuLy8gcGFyc2VkIG1hcHBpbmcgY29vcmRpbmF0ZXMgZnJvbSB0aGUgc291cmNlIG1hcCdzIFwibWFwcGluZ3NcIiBhdHRyaWJ1dGUuIFRoZXlcbi8vIGFyZSBsYXppbHkgaW5zdGFudGlhdGVkLCBhY2Nlc3NlZCB2aWEgdGhlIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBnZXR0ZXJzIHJlc3BlY3RpdmVseSwgYW5kIHdlIG9ubHkgcGFyc2UgdGhlIG1hcHBpbmdzXG4vLyBhbmQgY3JlYXRlIHRoZXNlIGFycmF5cyBvbmNlIHF1ZXJpZWQgZm9yIGEgc291cmNlIGxvY2F0aW9uLiBXZSBqdW1wIHRocm91Z2hcbi8vIHRoZXNlIGhvb3BzIGJlY2F1c2UgdGhlcmUgY2FuIGJlIG1hbnkgdGhvdXNhbmRzIG9mIG1hcHBpbmdzLCBhbmQgcGFyc2luZ1xuLy8gdGhlbSBpcyBleHBlbnNpdmUsIHNvIHdlIG9ubHkgd2FudCB0byBkbyBpdCBpZiB3ZSBtdXN0LlxuLy9cbi8vIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheXMgaXMgb2YgdGhlIGZvcm06XG4vL1xuLy8gICAgIHtcbi8vICAgICAgIGdlbmVyYXRlZExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBnZW5lcmF0ZWRDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIHNvdXJjZTogVGhlIHBhdGggdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoYXQgZ2VuZXJhdGVkIHRoaXNcbi8vICAgICAgICAgICAgICAgY2h1bmsgb2YgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsTGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgb3JpZ2luYWxDb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgdGhhdFxuLy8gICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoaXMgY2h1bmsgb2YgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgc3ltYm9sIHdoaWNoIGdlbmVyYXRlZCB0aGlzIGNodW5rIG9mXG4vLyAgICAgICAgICAgICBjb2RlLlxuLy8gICAgIH1cbi8vXG4vLyBBbGwgcHJvcGVydGllcyBleGNlcHQgZm9yIGBnZW5lcmF0ZWRMaW5lYCBhbmQgYGdlbmVyYXRlZENvbHVtbmAgY2FuIGJlXG4vLyBgbnVsbGAuXG4vL1xuLy8gYF9nZW5lcmF0ZWRNYXBwaW5nc2AgaXMgb3JkZXJlZCBieSB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9ucy5cbi8vXG4vLyBgX29yaWdpbmFsTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIG9yaWdpbmFsIHBvc2l0aW9ucy5cblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19nZW5lcmF0ZWRNYXBwaW5ncycsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncykge1xuICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzO1xuICB9XG59KTtcblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9fb3JpZ2luYWxNYXBwaW5ncyA9IG51bGw7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnX29yaWdpbmFsTWFwcGluZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncykge1xuICAgICAgdGhpcy5fcGFyc2VNYXBwaW5ncyh0aGlzLl9tYXBwaW5ncywgdGhpcy5zb3VyY2VSb290KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fX29yaWdpbmFsTWFwcGluZ3M7XG4gIH1cbn0pO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yKGFTdHIsIGluZGV4KSB7XG4gICAgdmFyIGMgPSBhU3RyLmNoYXJBdChpbmRleCk7XG4gICAgcmV0dXJuIGMgPT09IFwiO1wiIHx8IGMgPT09IFwiLFwiO1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBtYXBwaW5ncyBpbiBhIHN0cmluZyBpbiB0byBhIGRhdGEgc3RydWN0dXJlIHdoaWNoIHdlIGNhbiBlYXNpbHlcbiAqIHF1ZXJ5ICh0aGUgb3JkZXJlZCBhcnJheXMgaW4gdGhlIGB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZFxuICogYHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzYCBwcm9wZXJ0aWVzKS5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgX3BhcnNlTWFwcGluZ3NcIik7XG4gIH07XG5cblNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUiA9IDE7XG5Tb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUiA9IDI7XG5cblNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcblNvdXJjZU1hcENvbnN1bWVyLkxFQVNUX1VQUEVSX0JPVU5EID0gMjtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgZWFjaCBtYXBwaW5nIGJldHdlZW4gYW4gb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uIGFuZCBhXG4gKiBnZW5lcmF0ZWQgbGluZS9jb2x1bW4gaW4gdGhpcyBzb3VyY2UgbWFwLlxuICpcbiAqIEBwYXJhbSBGdW5jdGlvbiBhQ2FsbGJhY2tcbiAqICAgICAgICBUaGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2l0aCBlYWNoIG1hcHBpbmcuXG4gKiBAcGFyYW0gT2JqZWN0IGFDb250ZXh0XG4gKiAgICAgICAgT3B0aW9uYWwuIElmIHNwZWNpZmllZCwgdGhpcyBvYmplY3Qgd2lsbCBiZSB0aGUgdmFsdWUgb2YgYHRoaXNgIGV2ZXJ5XG4gKiAgICAgICAgdGltZSB0aGF0IGBhQ2FsbGJhY2tgIGlzIGNhbGxlZC5cbiAqIEBwYXJhbSBhT3JkZXJcbiAqICAgICAgICBFaXRoZXIgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAgb3JcbiAqICAgICAgICBgU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVJgLiBTcGVjaWZpZXMgd2hldGhlciB5b3Ugd2FudCB0b1xuICogICAgICAgIGl0ZXJhdGUgb3ZlciB0aGUgbWFwcGluZ3Mgc29ydGVkIGJ5IHRoZSBnZW5lcmF0ZWQgZmlsZSdzIGxpbmUvY29sdW1uXG4gKiAgICAgICAgb3JkZXIgb3IgdGhlIG9yaWdpbmFsJ3Mgc291cmNlL2xpbmUvY29sdW1uIG9yZGVyLCByZXNwZWN0aXZlbHkuIERlZmF1bHRzIHRvXG4gKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUmAuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5lYWNoTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2VhY2hNYXBwaW5nKGFDYWxsYmFjaywgYUNvbnRleHQsIGFPcmRlcikge1xuICAgIHZhciBjb250ZXh0ID0gYUNvbnRleHQgfHwgbnVsbDtcbiAgICB2YXIgb3JkZXIgPSBhT3JkZXIgfHwgU291cmNlTWFwQ29uc3VtZXIuR0VORVJBVEVEX09SREVSO1xuXG4gICAgdmFyIG1hcHBpbmdzO1xuICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjpcbiAgICAgIG1hcHBpbmdzID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSOlxuICAgICAgbWFwcGluZ3MgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVua25vd24gb3JkZXIgb2YgaXRlcmF0aW9uLlwiKTtcbiAgICB9XG5cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuc291cmNlUm9vdDtcbiAgICBtYXBwaW5ncy5tYXAoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZSA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgIHNvdXJjZSA9IHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2UsIHRoaXMuX3NvdXJjZU1hcFVSTCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgZ2VuZXJhdGVkTGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uLFxuICAgICAgICBvcmlnaW5hbExpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICBvcmlnaW5hbENvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgbmFtZTogbWFwcGluZy5uYW1lID09PSBudWxsID8gbnVsbCA6IHRoaXMuX25hbWVzLmF0KG1hcHBpbmcubmFtZSlcbiAgICAgIH07XG4gICAgfSwgdGhpcykuZm9yRWFjaChhQ2FsbGJhY2ssIGNvbnRleHQpO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgYWxsIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hbCBzb3VyY2UsXG4gKiBsaW5lLCBhbmQgY29sdW1uIHByb3ZpZGVkLiBJZiBubyBjb2x1bW4gaXMgcHJvdmlkZWQsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gKiBjb3JyZXNwb25kaW5nIHRvIGEgZWl0aGVyIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yIG9yIHRoZSBuZXh0XG4gKiBjbG9zZXN0IGxpbmUgdGhhdCBoYXMgYW55IG1hcHBpbmdzLiBPdGhlcndpc2UsIHJldHVybnMgYWxsIG1hcHBpbmdzXG4gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBsaW5lIGFuZCBlaXRoZXIgdGhlIGNvbHVtbiB3ZSBhcmUgc2VhcmNoaW5nIGZvclxuICogb3IgdGhlIG5leHQgY2xvc2VzdCBjb2x1bW4gdGhhdCBoYXMgYW55IG9mZnNldHMuXG4gKlxuICogVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBPcHRpb25hbC4gdGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIGFycmF5IG9mIG9iamVjdHMgaXMgcmV0dXJuZWQsIGVhY2ggd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmFsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2FsbEdlbmVyYXRlZFBvc2l0aW9uc0ZvcihhQXJncykge1xuICAgIHZhciBsaW5lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyk7XG5cbiAgICAvLyBXaGVuIHRoZXJlIGlzIG5vIGV4YWN0IG1hdGNoLCBCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZE1hcHBpbmdcbiAgICAvLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBtYXBwaW5nIGxlc3MgdGhhbiB0aGUgbmVlZGxlLiBCeVxuICAgIC8vIHNldHRpbmcgbmVlZGxlLm9yaWdpbmFsQ29sdW1uIHRvIDAsIHdlIHRodXMgZmluZCB0aGUgbGFzdCBtYXBwaW5nIGZvclxuICAgIC8vIHRoZSBnaXZlbiBsaW5lLCBwcm92aWRlZCBzdWNoIGEgbWFwcGluZyBleGlzdHMuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKSxcbiAgICAgIG9yaWdpbmFsTGluZTogbGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicsIDApXG4gICAgfTtcblxuICAgIG5lZWRsZS5zb3VyY2UgPSB0aGlzLl9maW5kU291cmNlSW5kZXgobmVlZGxlLnNvdXJjZSk7XG4gICAgaWYgKG5lZWRsZS5zb3VyY2UgPCAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIG1hcHBpbmdzID0gW107XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhuZWVkbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwib3JpZ2luYWxDb2x1bW5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChhQXJncy5jb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgb3JpZ2luYWxMaW5lID0gbWFwcGluZy5vcmlnaW5hbExpbmU7XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSBmb3VuZC4gU2luY2VcbiAgICAgICAgLy8gbWFwcGluZ3MgYXJlIHNvcnRlZCwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGZpbmQgYWxsIG1hcHBpbmdzIGZvclxuICAgICAgICAvLyB0aGUgbGluZSB3ZSBmb3VuZC5cbiAgICAgICAgd2hpbGUgKG1hcHBpbmcgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IG9yaWdpbmFsTGluZSkge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB1bnRpbCBlaXRoZXIgd2UgcnVuIG91dCBvZiBtYXBwaW5ncywgb3Igd2UgcnVuIGludG9cbiAgICAgICAgLy8gYSBtYXBwaW5nIGZvciBhIGRpZmZlcmVudCBsaW5lIHRoYW4gdGhlIG9uZSB3ZSB3ZXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgIC8vIFNpbmNlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgYXJlIHNlYXJjaGluZyBmb3IuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmXG4gICAgICAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gbGluZSAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9PSBvcmlnaW5hbENvbHVtbikge1xuICAgICAgICAgIG1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgICAgbGFzdENvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2xhc3RHZW5lcmF0ZWRDb2x1bW4nLCBudWxsKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbKytpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWFwcGluZ3M7XG4gIH07XG5cbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBBIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBhcnNlZCBzb3VyY2UgbWFwIHdoaWNoIHdlIGNhblxuICogcXVlcnkgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBmaWxlIHBvc2l0aW9ucyBieSBnaXZpbmcgaXQgYSBmaWxlXG4gKiBwb3NpdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS5cbiAqXG4gKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yXG4gKiBhbHJlYWR5IHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHNvdXJjZSBtYXBzIGhhdmUgdGhlXG4gKiBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBzb3VyY2VzOiBBbiBhcnJheSBvZiBVUkxzIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZXMuXG4gKiAgIC0gbmFtZXM6IEFuIGFycmF5IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSByZWZlcnJlbmNlZCBieSBpbmRpdmlkdWFsIG1hcHBpbmdzLlxuICogICAtIHNvdXJjZVJvb3Q6IE9wdGlvbmFsLiBUaGUgVVJMIHJvb3QgZnJvbSB3aGljaCBhbGwgc291cmNlcyBhcmUgcmVsYXRpdmUuXG4gKiAgIC0gc291cmNlc0NvbnRlbnQ6IE9wdGlvbmFsLiBBbiBhcnJheSBvZiBjb250ZW50cyBvZiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG1hcHBpbmdzOiBBIHN0cmluZyBvZiBiYXNlNjQgVkxRcyB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgbWFwcGluZ3MuXG4gKiAgIC0gZmlsZTogT3B0aW9uYWwuIFRoZSBnZW5lcmF0ZWQgZmlsZSB0aGlzIHNvdXJjZSBtYXAgaXMgYXNzb2NpYXRlZCB3aXRoLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBzb3VyY2UgbWFwLCB0YWtlbiBmcm9tIHRoZSBzb3VyY2UgbWFwIHNwZWNbMF06XG4gKlxuICogICAgIHtcbiAqICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgZmlsZTogXCJvdXQuanNcIixcbiAqICAgICAgIHNvdXJjZVJvb3QgOiBcIlwiLFxuICogICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgbmFtZXM6IFtcInNyY1wiLCBcIm1hcHNcIiwgXCJhcmVcIiwgXCJmdW5cIl0sXG4gKiAgICAgICBtYXBwaW5nczogXCJBQSxBQjs7QUJDREU7XCJcbiAqICAgICB9XG4gKlxuICogVGhlIHNlY29uZCBwYXJhbWV0ZXIsIGlmIGdpdmVuLCBpcyBhIHN0cmluZyB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMXG4gKiBhdCB3aGljaCB0aGUgc291cmNlIG1hcCB3YXMgZm91bmQuICBUaGlzIFVSTCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlXG4gKiBzb3VyY2VzIGFycmF5LlxuICpcbiAqIFswXTogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xVTFSR0FlaFF3UnlwVVRvdkYxS1JscGlPRnplMGItXzJnYzZmQUgwS1kway9lZGl0P3BsaT0xI1xuICovXG5mdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpIHtcbiAgdmFyIHNvdXJjZU1hcCA9IGFTb3VyY2VNYXA7XG4gIGlmICh0eXBlb2YgYVNvdXJjZU1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICBzb3VyY2VNYXAgPSB1dGlsLnBhcnNlU291cmNlTWFwSW5wdXQoYVNvdXJjZU1hcCk7XG4gIH1cblxuICB2YXIgdmVyc2lvbiA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3ZlcnNpb24nKTtcbiAgdmFyIHNvdXJjZXMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzJyk7XG4gIC8vIFNhc3MgMy4zIGxlYXZlcyBvdXQgdGhlICduYW1lcycgYXJyYXksIHNvIHdlIGRldmlhdGUgZnJvbSB0aGUgc3BlYyAod2hpY2hcbiAgLy8gcmVxdWlyZXMgdGhlIGFycmF5KSB0byBwbGF5IG5pY2UgaGVyZS5cbiAgdmFyIG5hbWVzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbmFtZXMnLCBbXSk7XG4gIHZhciBzb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlUm9vdCcsIG51bGwpO1xuICB2YXIgc291cmNlc0NvbnRlbnQgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzb3VyY2VzQ29udGVudCcsIG51bGwpO1xuICB2YXIgbWFwcGluZ3MgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdtYXBwaW5ncycpO1xuICB2YXIgZmlsZSA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ2ZpbGUnLCBudWxsKTtcblxuICAvLyBPbmNlIGFnYWluLCBTYXNzIGRldmlhdGVzIGZyb20gdGhlIHNwZWMgYW5kIHN1cHBsaWVzIHRoZSB2ZXJzaW9uIGFzIGFcbiAgLy8gc3RyaW5nIHJhdGhlciB0aGFuIGEgbnVtYmVyLCBzbyB3ZSB1c2UgbG9vc2UgZXF1YWxpdHkgY2hlY2tpbmcgaGVyZS5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgaWYgKHNvdXJjZVJvb3QpIHtcbiAgICBzb3VyY2VSb290ID0gdXRpbC5ub3JtYWxpemUoc291cmNlUm9vdCk7XG4gIH1cblxuICBzb3VyY2VzID0gc291cmNlc1xuICAgIC5tYXAoU3RyaW5nKVxuICAgIC8vIFNvbWUgc291cmNlIG1hcHMgcHJvZHVjZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbGlrZSBcIi4vZm9vLmpzXCIgaW5zdGVhZCBvZlxuICAgIC8vIFwiZm9vLmpzXCIuICBOb3JtYWxpemUgdGhlc2UgZmlyc3Qgc28gdGhhdCBmdXR1cmUgY29tcGFyaXNvbnMgd2lsbCBzdWNjZWVkLlxuICAgIC8vIFNlZSBidWd6aWwubGEvMTA5MDc2OC5cbiAgICAubWFwKHV0aWwubm9ybWFsaXplKVxuICAgIC8vIEFsd2F5cyBlbnN1cmUgdGhhdCBhYnNvbHV0ZSBzb3VyY2VzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCByZWxhdGl2ZSB0b1xuICAgIC8vIHRoZSBzb3VyY2Ugcm9vdCwgaWYgdGhlIHNvdXJjZSByb290IGlzIGFic29sdXRlLiBOb3QgZG9pbmcgdGhpcyB3b3VsZFxuICAgIC8vIGJlIHBhcnRpY3VsYXJseSBwcm9ibGVtYXRpYyB3aGVuIHRoZSBzb3VyY2Ugcm9vdCBpcyBhIHByZWZpeCBvZiB0aGVcbiAgICAvLyBzb3VyY2UgKHZhbGlkLCBidXQgd2h5Pz8pLiBTZWUgZ2l0aHViIGlzc3VlICMxOTkgYW5kIGJ1Z3ppbC5sYS8xMTg4OTgyLlxuICAgIC5tYXAoZnVuY3Rpb24gKHNvdXJjZSkge1xuICAgICAgcmV0dXJuIHNvdXJjZVJvb3QgJiYgdXRpbC5pc0Fic29sdXRlKHNvdXJjZVJvb3QpICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2UpXG4gICAgICAgID8gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2UpXG4gICAgICAgIDogc291cmNlO1xuICAgIH0pO1xuXG4gIC8vIFBhc3MgYHRydWVgIGJlbG93IHRvIGFsbG93IGR1cGxpY2F0ZSBuYW1lcyBhbmQgc291cmNlcy4gV2hpbGUgc291cmNlIG1hcHNcbiAgLy8gYXJlIGludGVuZGVkIHRvIGJlIGNvbXByZXNzZWQgYW5kIGRlZHVwbGljYXRlZCwgdGhlIFR5cGVTY3JpcHQgY29tcGlsZXJcbiAgLy8gc29tZXRpbWVzIGdlbmVyYXRlcyBzb3VyY2UgbWFwcyB3aXRoIGR1cGxpY2F0ZXMgaW4gdGhlbS4gU2VlIEdpdGh1YiBpc3N1ZVxuICAvLyAjNzIgYW5kIGJ1Z3ppbC5sYS84ODk0OTIuXG4gIHRoaXMuX25hbWVzID0gQXJyYXlTZXQuZnJvbUFycmF5KG5hbWVzLm1hcChTdHJpbmcpLCB0cnVlKTtcbiAgdGhpcy5fc291cmNlcyA9IEFycmF5U2V0LmZyb21BcnJheShzb3VyY2VzLCB0cnVlKTtcblxuICB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMgPSB0aGlzLl9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICByZXR1cm4gdXRpbC5jb21wdXRlU291cmNlVVJMKHNvdXJjZVJvb3QsIHMsIGFTb3VyY2VNYXBVUkwpO1xuICB9KTtcblxuICB0aGlzLnNvdXJjZVJvb3QgPSBzb3VyY2VSb290O1xuICB0aGlzLnNvdXJjZXNDb250ZW50ID0gc291cmNlc0NvbnRlbnQ7XG4gIHRoaXMuX21hcHBpbmdzID0gbWFwcGluZ3M7XG4gIHRoaXMuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7XG4gIHRoaXMuZmlsZSA9IGZpbGU7XG59XG5cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3VtZXIgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGluZGV4IG9mIGEgc291cmNlLiAgUmV0dXJucyAtMSBpZiBub3RcbiAqIGZvdW5kLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fZmluZFNvdXJjZUluZGV4ID0gZnVuY3Rpb24oYVNvdXJjZSkge1xuICB2YXIgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlO1xuICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICByZWxhdGl2ZVNvdXJjZSA9IHV0aWwucmVsYXRpdmUodGhpcy5zb3VyY2VSb290LCByZWxhdGl2ZVNvdXJjZSk7XG4gIH1cblxuICBpZiAodGhpcy5fc291cmNlcy5oYXMocmVsYXRpdmVTb3VyY2UpKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZXMuaW5kZXhPZihyZWxhdGl2ZVNvdXJjZSk7XG4gIH1cblxuICAvLyBNYXliZSBhU291cmNlIGlzIGFuIGFic29sdXRlIFVSTCBhcyByZXR1cm5lZCBieSB8c291cmNlc3wuICBJblxuICAvLyB0aGlzIGNhc2Ugd2UgY2FuJ3Qgc2ltcGx5IHVuZG8gdGhlIHRyYW5zZm9ybS5cbiAgdmFyIGk7XG4gIGZvciAoaSA9IDA7IGkgPCB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAodGhpcy5fYWJzb2x1dGVTb3VyY2VzW2ldID09IGFTb3VyY2UpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMTtcbn07XG5cbi8qKlxuICogQ3JlYXRlIGEgQmFzaWNTb3VyY2VNYXBDb25zdW1lciBmcm9tIGEgU291cmNlTWFwR2VuZXJhdG9yLlxuICpcbiAqIEBwYXJhbSBTb3VyY2VNYXBHZW5lcmF0b3IgYVNvdXJjZU1hcFxuICogICAgICAgIFRoZSBzb3VyY2UgbWFwIHRoYXQgd2lsbCBiZSBjb25zdW1lZC5cbiAqIEBwYXJhbSBTdHJpbmcgYVNvdXJjZU1hcFVSTFxuICogICAgICAgIFRoZSBVUkwgYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgY2FuIGJlIGZvdW5kIChvcHRpb25hbClcbiAqIEByZXR1cm5zIEJhc2ljU291cmNlTWFwQ29uc3VtZXJcbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZnJvbVNvdXJjZU1hcChhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gICAgdmFyIHNtYyA9IE9iamVjdC5jcmVhdGUoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUpO1xuXG4gICAgdmFyIG5hbWVzID0gc21jLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9uYW1lcy50b0FycmF5KCksIHRydWUpO1xuICAgIHZhciBzb3VyY2VzID0gc21jLl9zb3VyY2VzID0gQXJyYXlTZXQuZnJvbUFycmF5KGFTb3VyY2VNYXAuX3NvdXJjZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICBzbWMuc291cmNlUm9vdCA9IGFTb3VyY2VNYXAuX3NvdXJjZVJvb3Q7XG4gICAgc21jLnNvdXJjZXNDb250ZW50ID0gYVNvdXJjZU1hcC5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChzbWMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21jLnNvdXJjZVJvb3QpO1xuICAgIHNtYy5maWxlID0gYVNvdXJjZU1hcC5fZmlsZTtcbiAgICBzbWMuX3NvdXJjZU1hcFVSTCA9IGFTb3VyY2VNYXBVUkw7XG4gICAgc21jLl9hYnNvbHV0ZVNvdXJjZXMgPSBzbWMuX3NvdXJjZXMudG9BcnJheSgpLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgcmV0dXJuIHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzbWMuc291cmNlUm9vdCwgcywgYVNvdXJjZU1hcFVSTCk7XG4gICAgfSk7XG5cbiAgICAvLyBCZWNhdXNlIHdlIGFyZSBtb2RpZnlpbmcgdGhlIGVudHJpZXMgKGJ5IGNvbnZlcnRpbmcgc3RyaW5nIHNvdXJjZXMgYW5kXG4gICAgLy8gbmFtZXMgdG8gaW5kaWNlcyBpbnRvIHRoZSBzb3VyY2VzIGFuZCBuYW1lcyBBcnJheVNldHMpLCB3ZSBoYXZlIHRvIG1ha2VcbiAgICAvLyBhIGNvcHkgb2YgdGhlIGVudHJ5IG9yIGVsc2UgYmFkIHRoaW5ncyBoYXBwZW4uIFNoYXJlZCBtdXRhYmxlIHN0YXRlXG4gICAgLy8gc3RyaWtlcyBhZ2FpbiEgU2VlIGdpdGh1YiBpc3N1ZSAjMTkxLlxuXG4gICAgdmFyIGdlbmVyYXRlZE1hcHBpbmdzID0gYVNvdXJjZU1hcC5fbWFwcGluZ3MudG9BcnJheSgpLnNsaWNlKCk7XG4gICAgdmFyIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncyA9IHNtYy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gW107XG4gICAgdmFyIGRlc3RPcmlnaW5hbE1hcHBpbmdzID0gc21jLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3JjTWFwcGluZyA9IGdlbmVyYXRlZE1hcHBpbmdzW2ldO1xuICAgICAgdmFyIGRlc3RNYXBwaW5nID0gbmV3IE1hcHBpbmc7XG4gICAgICBkZXN0TWFwcGluZy5nZW5lcmF0ZWRMaW5lID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRMaW5lO1xuICAgICAgZGVzdE1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uID0gc3JjTWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgIGlmIChzcmNNYXBwaW5nLnNvdXJjZSkge1xuICAgICAgICBkZXN0TWFwcGluZy5zb3VyY2UgPSBzb3VyY2VzLmluZGV4T2Yoc3JjTWFwcGluZy5zb3VyY2UpO1xuICAgICAgICBkZXN0TWFwcGluZy5vcmlnaW5hbExpbmUgPSBzcmNNYXBwaW5nLm9yaWdpbmFsTGluZTtcbiAgICAgICAgZGVzdE1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBzcmNNYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIGlmIChzcmNNYXBwaW5nLm5hbWUpIHtcbiAgICAgICAgICBkZXN0TWFwcGluZy5uYW1lID0gbmFtZXMuaW5kZXhPZihzcmNNYXBwaW5nLm5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzdE9yaWdpbmFsTWFwcGluZ3MucHVzaChkZXN0TWFwcGluZyk7XG4gICAgICB9XG5cbiAgICAgIGRlc3RHZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGRlc3RNYXBwaW5nKTtcbiAgICB9XG5cbiAgICBxdWlja1NvcnQoc21jLl9fb3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG5cbiAgICByZXR1cm4gc21jO1xuICB9O1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ3NvdXJjZXMnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzLl9hYnNvbHV0ZVNvdXJjZXMuc2xpY2UoKTtcbiAgfVxufSk7XG5cbi8qKlxuICogUHJvdmlkZSB0aGUgSklUIHdpdGggYSBuaWNlIHNoYXBlIC8gaGlkZGVuIGNsYXNzLlxuICovXG5mdW5jdGlvbiBNYXBwaW5nKCkge1xuICB0aGlzLmdlbmVyYXRlZExpbmUgPSAwO1xuICB0aGlzLmdlbmVyYXRlZENvbHVtbiA9IDA7XG4gIHRoaXMuc291cmNlID0gbnVsbDtcbiAgdGhpcy5vcmlnaW5hbExpbmUgPSBudWxsO1xuICB0aGlzLm9yaWdpbmFsQ29sdW1uID0gbnVsbDtcbiAgdGhpcy5uYW1lID0gbnVsbDtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHZhciBnZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsTGluZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c1NvdXJjZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzTmFtZSA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGFTdHIubGVuZ3RoO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGNhY2hlZFNlZ21lbnRzID0ge307XG4gICAgdmFyIHRlbXAgPSB7fTtcbiAgICB2YXIgb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBnZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBtYXBwaW5nLCBzdHIsIHNlZ21lbnQsIGVuZCwgdmFsdWU7XG5cbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgIGlmIChhU3RyLmNoYXJBdChpbmRleCkgPT09ICc7Jykge1xuICAgICAgICBnZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGFTdHIuY2hhckF0KGluZGV4KSA9PT0gJywnKSB7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgbWFwcGluZyA9IG5ldyBNYXBwaW5nKCk7XG4gICAgICAgIG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9IGdlbmVyYXRlZExpbmU7XG5cbiAgICAgICAgLy8gQmVjYXVzZSBlYWNoIG9mZnNldCBpcyBlbmNvZGVkIHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBvbmUsXG4gICAgICAgIC8vIG1hbnkgc2VnbWVudHMgb2Z0ZW4gaGF2ZSB0aGUgc2FtZSBlbmNvZGluZy4gV2UgY2FuIGV4cGxvaXQgdGhpc1xuICAgICAgICAvLyBmYWN0IGJ5IGNhY2hpbmcgdGhlIHBhcnNlZCB2YXJpYWJsZSBsZW5ndGggZmllbGRzIG9mIGVhY2ggc2VnbWVudCxcbiAgICAgICAgLy8gYWxsb3dpbmcgdXMgdG8gYXZvaWQgYSBzZWNvbmQgcGFyc2UgaWYgd2UgZW5jb3VudGVyIHRoZSBzYW1lXG4gICAgICAgIC8vIHNlZ21lbnQgYWdhaW4uXG4gICAgICAgIGZvciAoZW5kID0gaW5kZXg7IGVuZCA8IGxlbmd0aDsgZW5kKyspIHtcbiAgICAgICAgICBpZiAodGhpcy5fY2hhcklzTWFwcGluZ1NlcGFyYXRvcihhU3RyLCBlbmQpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyID0gYVN0ci5zbGljZShpbmRleCwgZW5kKTtcblxuICAgICAgICBzZWdtZW50ID0gY2FjaGVkU2VnbWVudHNbc3RyXTtcbiAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICBpbmRleCArPSBzdHIubGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlZ21lbnQgPSBbXTtcbiAgICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmQpIHtcbiAgICAgICAgICAgIGJhc2U2NFZMUS5kZWNvZGUoYVN0ciwgaW5kZXgsIHRlbXApO1xuICAgICAgICAgICAgdmFsdWUgPSB0ZW1wLnZhbHVlO1xuICAgICAgICAgICAgaW5kZXggPSB0ZW1wLnJlc3Q7XG4gICAgICAgICAgICBzZWdtZW50LnB1c2godmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSwgYnV0IG5vIGxpbmUgYW5kIGNvbHVtbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGb3VuZCBhIHNvdXJjZSBhbmQgbGluZSwgYnV0IG5vIGNvbHVtbicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNhY2hlZFNlZ21lbnRzW3N0cl0gPSBzZWdtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2VuZXJhdGVkIGNvbHVtbi5cbiAgICAgICAgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gPSBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiArIHNlZ21lbnRbMF07XG4gICAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgIC8vIE9yaWdpbmFsIHNvdXJjZS5cbiAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHByZXZpb3VzU291cmNlICsgc2VnbWVudFsxXTtcbiAgICAgICAgICBwcmV2aW91c1NvdXJjZSArPSBzZWdtZW50WzFdO1xuXG4gICAgICAgICAgLy8gT3JpZ2luYWwgbGluZS5cbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSA9IHByZXZpb3VzT3JpZ2luYWxMaW5lICsgc2VnbWVudFsyXTtcbiAgICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuICAgICAgICAgIC8vIExpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZFxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lICs9IDE7XG5cbiAgICAgICAgICAvLyBPcmlnaW5hbCBjb2x1bW4uXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbiA9IHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gKyBzZWdtZW50WzNdO1xuICAgICAgICAgIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgICAgaWYgKHNlZ21lbnQubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgLy8gT3JpZ2luYWwgbmFtZS5cbiAgICAgICAgICAgIG1hcHBpbmcubmFtZSA9IHByZXZpb3VzTmFtZSArIHNlZ21lbnRbNF07XG4gICAgICAgICAgICBwcmV2aW91c05hbWUgKz0gc2VnbWVudFs0XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBnZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKG1hcHBpbmcpO1xuICAgICAgICBpZiAodHlwZW9mIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIG9yaWdpbmFsTWFwcGluZ3MucHVzaChtYXBwaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHF1aWNrU29ydChnZW5lcmF0ZWRNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCk7XG4gICAgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzID0gZ2VuZXJhdGVkTWFwcGluZ3M7XG5cbiAgICBxdWlja1NvcnQob3JpZ2luYWxNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyk7XG4gICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MgPSBvcmlnaW5hbE1hcHBpbmdzO1xuICB9O1xuXG4vKipcbiAqIEZpbmQgdGhlIG1hcHBpbmcgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIGh5cG90aGV0aWNhbCBcIm5lZWRsZVwiIG1hcHBpbmcgdGhhdFxuICogd2UgYXJlIHNlYXJjaGluZyBmb3IgaW4gdGhlIGdpdmVuIFwiaGF5c3RhY2tcIiBvZiBtYXBwaW5ncy5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZmluZE1hcHBpbmcoYU5lZWRsZSwgYU1hcHBpbmdzLCBhTGluZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDb2x1bW5OYW1lLCBhQ29tcGFyYXRvciwgYUJpYXMpIHtcbiAgICAvLyBUbyByZXR1cm4gdGhlIHBvc2l0aW9uIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCB3ZSBtdXN0IGZpcnN0IGZpbmQgdGhlXG4gICAgLy8gbWFwcGluZyBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uIGFuZCB0aGVuIHJldHVybiB0aGUgb3Bwb3NpdGUgcG9zaXRpb24gaXRcbiAgICAvLyBwb2ludHMgdG8uIEJlY2F1c2UgdGhlIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHdlIGNhbiB1c2UgYmluYXJ5IHNlYXJjaCB0b1xuICAgIC8vIGZpbmQgdGhlIGJlc3QgbWFwcGluZy5cblxuICAgIGlmIChhTmVlZGxlW2FMaW5lTmFtZV0gPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignTGluZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUxpbmVOYW1lXSk7XG4gICAgfVxuICAgIGlmIChhTmVlZGxlW2FDb2x1bW5OYW1lXSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0NvbHVtbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLCBnb3QgJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICArIGFOZWVkbGVbYUNvbHVtbk5hbWVdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYmluYXJ5U2VhcmNoLnNlYXJjaChhTmVlZGxlLCBhTWFwcGluZ3MsIGFDb21wYXJhdG9yLCBhQmlhcyk7XG4gIH07XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgbGFzdCBjb2x1bW4gZm9yIGVhY2ggZ2VuZXJhdGVkIG1hcHBpbmcuIFRoZSBsYXN0IGNvbHVtbiBpc1xuICogaW5jbHVzaXZlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5jb21wdXRlQ29sdW1uU3BhbnMgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9jb21wdXRlQ29sdW1uU3BhbnMoKSB7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aDsgKytpbmRleCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIC8vIE1hcHBpbmdzIGRvIG5vdCBjb250YWluIGEgZmllbGQgZm9yIHRoZSBsYXN0IGdlbmVyYXRlZCBjb2x1bW50LiBXZVxuICAgICAgLy8gY2FuIGNvbWUgdXAgd2l0aCBhbiBvcHRpbWlzdGljIGVzdGltYXRlLCBob3dldmVyLCBieSBhc3N1bWluZyB0aGF0XG4gICAgICAvLyBtYXBwaW5ncyBhcmUgY29udGlndW91cyAoaS5lLiBnaXZlbiB0d28gY29uc2VjdXRpdmUgbWFwcGluZ3MsIHRoZVxuICAgICAgLy8gZmlyc3QgbWFwcGluZyBlbmRzIHdoZXJlIHRoZSBzZWNvbmQgb25lIHN0YXJ0cykuXG4gICAgICBpZiAoaW5kZXggKyAxIDwgdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3MubGVuZ3RoKSB7XG4gICAgICAgIHZhciBuZXh0TWFwcGluZyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzW2luZGV4ICsgMV07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9PT0gbmV4dE1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IG5leHRNYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtIDE7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGxhc3QgbWFwcGluZyBmb3IgZWFjaCBsaW5lIHNwYW5zIHRoZSBlbnRpcmUgbGluZS5cbiAgICAgIG1hcHBpbmcubGFzdEdlbmVyYXRlZENvbHVtbiA9IEluZmluaXR5O1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UsIGxpbmUsIGFuZCBjb2x1bW4gaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdFxuICogd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlclxuICogICAgIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSwgb3IgbnVsbC5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICogICAtIG5hbWU6IFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLCBvciBudWxsLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfb3JpZ2luYWxQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBnZW5lcmF0ZWRMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIGdlbmVyYXRlZENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLFxuICAgICAgXCJnZW5lcmF0ZWRMaW5lXCIsXG4gICAgICBcImdlbmVyYXRlZENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleF07XG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhtYXBwaW5nLCAnc291cmNlJywgbnVsbCk7XG4gICAgICAgIGlmIChzb3VyY2UgIT09IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmF0KHNvdXJjZSk7XG4gICAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHRoaXMuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcobWFwcGluZywgJ25hbWUnLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWUgIT09IG51bGwpIHtcbiAgICAgICAgICBuYW1lID0gdGhpcy5fbmFtZXMuYXQobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxMaW5lJywgbnVsbCksXG4gICAgICAgICAgY29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnb3JpZ2luYWxDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICBuYW1lOiBuYW1lXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGwsXG4gICAgICBuYW1lOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB3ZSBoYXZlIHRoZSBzb3VyY2UgY29udGVudCBmb3IgZXZlcnkgc291cmNlIGluIHRoZSBzb3VyY2VcbiAqIG1hcCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEJhc2ljU291cmNlTWFwQ29uc3VtZXJfaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50Lmxlbmd0aCA+PSB0aGlzLl9zb3VyY2VzLnNpemUoKSAmJlxuICAgICAgIXRoaXMuc291cmNlc0NvbnRlbnQuc29tZShmdW5jdGlvbiAoc2MpIHsgcmV0dXJuIHNjID09IG51bGw7IH0pO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICogb3JpZ2luYWwgc291cmNlIGZpbGUuIFJldHVybnMgbnVsbCBpZiBubyBvcmlnaW5hbCBzb3VyY2UgY29udGVudCBpc1xuICogYXZhaWxhYmxlLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfc291cmNlQ29udGVudEZvcihhU291cmNlLCBudWxsT25NaXNzaW5nKSB7XG4gICAgaWYgKCF0aGlzLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kU291cmNlSW5kZXgoYVNvdXJjZSk7XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNvdXJjZXNDb250ZW50W2luZGV4XTtcbiAgICB9XG5cbiAgICB2YXIgcmVsYXRpdmVTb3VyY2UgPSBhU291cmNlO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgcmVsYXRpdmVTb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgcmVsYXRpdmVTb3VyY2UpO1xuICAgIH1cblxuICAgIHZhciB1cmw7XG4gICAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsXG4gICAgICAgICYmICh1cmwgPSB1dGlsLnVybFBhcnNlKHRoaXMuc291cmNlUm9vdCkpKSB7XG4gICAgICAvLyBYWFg6IGZpbGU6Ly8gVVJJcyBhbmQgYWJzb2x1dGUgcGF0aHMgbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIGZvclxuICAgICAgLy8gbWFueSB1c2Vycy4gV2UgY2FuIGhlbHAgdGhlbSBvdXQgd2hlbiB0aGV5IGV4cGVjdCBmaWxlOi8vIFVSSXMgdG9cbiAgICAgIC8vIGJlaGF2ZSBsaWtlIGl0IHdvdWxkIGlmIHRoZXkgd2VyZSBydW5uaW5nIGEgbG9jYWwgSFRUUCBzZXJ2ZXIuIFNlZVxuICAgICAgLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9ODg1NTk3LlxuICAgICAgdmFyIGZpbGVVcmlBYnNQYXRoID0gcmVsYXRpdmVTb3VyY2UucmVwbGFjZSgvXmZpbGU6XFwvXFwvLywgXCJcIik7XG4gICAgICBpZiAodXJsLnNjaGVtZSA9PSBcImZpbGVcIlxuICAgICAgICAgICYmIHRoaXMuX3NvdXJjZXMuaGFzKGZpbGVVcmlBYnNQYXRoKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoZmlsZVVyaUFic1BhdGgpXVxuICAgICAgfVxuXG4gICAgICBpZiAoKCF1cmwucGF0aCB8fCB1cmwucGF0aCA9PSBcIi9cIilcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhcIi9cIiArIHJlbGF0aXZlU291cmNlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFt0aGlzLl9zb3VyY2VzLmluZGV4T2YoXCIvXCIgKyByZWxhdGl2ZVNvdXJjZSldO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCByZWN1cnNpdmVseSBmcm9tXG4gICAgLy8gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5zb3VyY2VDb250ZW50Rm9yLiBJbiB0aGF0IGNhc2UsIHdlXG4gICAgLy8gZG9uJ3Qgd2FudCB0byB0aHJvdyBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBzb3VyY2UgLSB3ZSBqdXN0IHdhbnQgdG9cbiAgICAvLyByZXR1cm4gbnVsbCwgc28gd2UgcHJvdmlkZSBhIGZsYWcgdG8gZXhpdCBncmFjZWZ1bGx5LlxuICAgIGlmIChudWxsT25NaXNzaW5nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIHJlbGF0aXZlU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBiaWFzOiBFaXRoZXIgJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJyBvclxuICogICAgICdTb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ1NvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EJy5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuXG4gKiAgICAgVGhlIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9nZW5lcmF0ZWRQb3NpdGlvbkZvcihhQXJncykge1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpO1xuICAgIHNvdXJjZSA9IHRoaXMuX2ZpbmRTb3VyY2VJbmRleChzb3VyY2UpO1xuICAgIGlmIChzb3VyY2UgPCAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW5lOiBudWxsLFxuICAgICAgICBjb2x1bW46IG51bGwsXG4gICAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgb3JpZ2luYWxMaW5lOiB1dGlsLmdldEFyZyhhQXJncywgJ2xpbmUnKSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIHZhciBpbmRleCA9IHRoaXMuX2ZpbmRNYXBwaW5nKFxuICAgICAgbmVlZGxlLFxuICAgICAgdGhpcy5fb3JpZ2luYWxNYXBwaW5ncyxcbiAgICAgIFwib3JpZ2luYWxMaW5lXCIsXG4gICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zLFxuICAgICAgdXRpbC5nZXRBcmcoYUFyZ3MsICdiaWFzJywgU291cmNlTWFwQ29uc3VtZXIuR1JFQVRFU1RfTE9XRVJfQk9VTkQpXG4gICAgKTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IG5lZWRsZS5zb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsaW5lOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnZ2VuZXJhdGVkTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZENvbHVtbicsIG51bGwpLFxuICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgIGxhc3RDb2x1bW46IG51bGxcbiAgICB9O1xuICB9O1xuXG5leHBvcnRzLkJhc2ljU291cmNlTWFwQ29uc3VtZXIgPSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyO1xuXG4vKipcbiAqIEFuIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciBpbnN0YW5jZSByZXByZXNlbnRzIGEgcGFyc2VkIHNvdXJjZSBtYXAgd2hpY2hcbiAqIHdlIGNhbiBxdWVyeSBmb3IgaW5mb3JtYXRpb24uIEl0IGRpZmZlcnMgZnJvbSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluXG4gKiB0aGF0IGl0IHRha2VzIFwiaW5kZXhlZFwiIHNvdXJjZSBtYXBzIChpLmUuIG9uZXMgd2l0aCBhIFwic2VjdGlvbnNcIiBmaWVsZCkgYXNcbiAqIGlucHV0LlxuICpcbiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSByYXcgc291cmNlIG1hcCAoZWl0aGVyIGFzIGEgSlNPTiBzdHJpbmcsIG9yIGFscmVhZHlcbiAqIHBhcnNlZCB0byBhbiBvYmplY3QpLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMgZm9yIGluZGV4ZWQgc291cmNlIG1hcHMsIHRoZXlcbiAqIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOlxuICpcbiAqICAgLSB2ZXJzaW9uOiBXaGljaCB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwIHNwZWMgdGhpcyBtYXAgaXMgZm9sbG93aW5nLlxuICogICAtIGZpbGU6IE9wdGlvbmFsLiBUaGUgZ2VuZXJhdGVkIGZpbGUgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqICAgLSBzZWN0aW9uczogQSBsaXN0IG9mIHNlY3Rpb24gZGVmaW5pdGlvbnMuXG4gKlxuICogRWFjaCB2YWx1ZSB1bmRlciB0aGUgXCJzZWN0aW9uc1wiIGZpZWxkIGhhcyB0d28gZmllbGRzOlxuICogICAtIG9mZnNldDogVGhlIG9mZnNldCBpbnRvIHRoZSBvcmlnaW5hbCBzcGVjaWZpZWQgYXQgd2hpY2ggdGhpcyBzZWN0aW9uXG4gKiAgICAgICBiZWdpbnMgdG8gYXBwbHksIGRlZmluZWQgYXMgYW4gb2JqZWN0IHdpdGggYSBcImxpbmVcIiBhbmQgXCJjb2x1bW5cIlxuICogICAgICAgZmllbGQuXG4gKiAgIC0gbWFwOiBBIHNvdXJjZSBtYXAgZGVmaW5pdGlvbi4gVGhpcyBzb3VyY2UgbWFwIGNvdWxkIGFsc28gYmUgaW5kZXhlZCxcbiAqICAgICAgIGJ1dCBkb2Vzbid0IGhhdmUgdG8gYmUuXG4gKlxuICogSW5zdGVhZCBvZiB0aGUgXCJtYXBcIiBmaWVsZCwgaXQncyBhbHNvIHBvc3NpYmxlIHRvIGhhdmUgYSBcInVybFwiIGZpZWxkXG4gKiBzcGVjaWZ5aW5nIGEgVVJMIHRvIHJldHJpZXZlIGEgc291cmNlIG1hcCBmcm9tLCBidXQgdGhhdCdzIGN1cnJlbnRseVxuICogdW5zdXBwb3J0ZWQuXG4gKlxuICogSGVyZSdzIGFuIGV4YW1wbGUgc291cmNlIG1hcCwgdGFrZW4gZnJvbSB0aGUgc291cmNlIG1hcCBzcGVjWzBdLCBidXRcbiAqIG1vZGlmaWVkIHRvIG9taXQgYSBzZWN0aW9uIHdoaWNoIHVzZXMgdGhlIFwidXJsXCIgZmllbGQuXG4gKlxuICogIHtcbiAqICAgIHZlcnNpb24gOiAzLFxuICogICAgZmlsZTogXCJhcHAuanNcIixcbiAqICAgIHNlY3Rpb25zOiBbe1xuICogICAgICBvZmZzZXQ6IHtsaW5lOjEwMCwgY29sdW1uOjEwfSxcbiAqICAgICAgbWFwOiB7XG4gKiAgICAgICAgdmVyc2lvbiA6IDMsXG4gKiAgICAgICAgZmlsZTogXCJzZWN0aW9uLmpzXCIsXG4gKiAgICAgICAgc291cmNlczogW1wiZm9vLmpzXCIsIFwiYmFyLmpzXCJdLFxuICogICAgICAgIG5hbWVzOiBbXCJzcmNcIiwgXCJtYXBzXCIsIFwiYXJlXCIsIFwiZnVuXCJdLFxuICogICAgICAgIG1hcHBpbmdzOiBcIkFBQUEsRTs7QUJDREU7XCJcbiAqICAgICAgfVxuICogICAgfV0sXG4gKiAgfVxuICpcbiAqIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpZiBnaXZlbiwgaXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgdGhlIFVSTFxuICogYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgd2FzIGZvdW5kLiAgVGhpcyBVUkwgaXMgdXNlZCB0byBjb21wdXRlIHRoZVxuICogc291cmNlcyBhcnJheS5cbiAqXG4gKiBbMF06IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdCNoZWFkaW5nPWguNTM1ZXMzeGVwcmd0XG4gKi9cbmZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgdmFyIHZlcnNpb24gPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICd2ZXJzaW9uJyk7XG4gIHZhciBzZWN0aW9ucyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NlY3Rpb25zJyk7XG5cbiAgaWYgKHZlcnNpb24gIT0gdGhpcy5fdmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgdmVyc2lvbjogJyArIHZlcnNpb24pO1xuICB9XG5cbiAgdGhpcy5fc291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICB0aGlzLl9uYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gIHZhciBsYXN0T2Zmc2V0ID0ge1xuICAgIGxpbmU6IC0xLFxuICAgIGNvbHVtbjogMFxuICB9O1xuICB0aGlzLl9zZWN0aW9ucyA9IHNlY3Rpb25zLm1hcChmdW5jdGlvbiAocykge1xuICAgIGlmIChzLnVybCkge1xuICAgICAgLy8gVGhlIHVybCBmaWVsZCB3aWxsIHJlcXVpcmUgc3VwcG9ydCBmb3IgYXN5bmNocm9uaWNpdHkuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMTZcbiAgICAgIHRocm93IG5ldyBFcnJvcignU3VwcG9ydCBmb3IgdXJsIGZpZWxkIGluIHNlY3Rpb25zIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG4gICAgdmFyIG9mZnNldCA9IHV0aWwuZ2V0QXJnKHMsICdvZmZzZXQnKTtcbiAgICB2YXIgb2Zmc2V0TGluZSA9IHV0aWwuZ2V0QXJnKG9mZnNldCwgJ2xpbmUnKTtcbiAgICB2YXIgb2Zmc2V0Q29sdW1uID0gdXRpbC5nZXRBcmcob2Zmc2V0LCAnY29sdW1uJyk7XG5cbiAgICBpZiAob2Zmc2V0TGluZSA8IGxhc3RPZmZzZXQubGluZSB8fFxuICAgICAgICAob2Zmc2V0TGluZSA9PT0gbGFzdE9mZnNldC5saW5lICYmIG9mZnNldENvbHVtbiA8IGxhc3RPZmZzZXQuY29sdW1uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWN0aW9uIG9mZnNldHMgbXVzdCBiZSBvcmRlcmVkIGFuZCBub24tb3ZlcmxhcHBpbmcuJyk7XG4gICAgfVxuICAgIGxhc3RPZmZzZXQgPSBvZmZzZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZ2VuZXJhdGVkT2Zmc2V0OiB7XG4gICAgICAgIC8vIFRoZSBvZmZzZXQgZmllbGRzIGFyZSAwLWJhc2VkLCBidXQgd2UgdXNlIDEtYmFzZWQgaW5kaWNlcyB3aGVuXG4gICAgICAgIC8vIGVuY29kaW5nL2RlY29kaW5nIGZyb20gVkxRLlxuICAgICAgICBnZW5lcmF0ZWRMaW5lOiBvZmZzZXRMaW5lICsgMSxcbiAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBvZmZzZXRDb2x1bW4gKyAxXG4gICAgICB9LFxuICAgICAgY29uc3VtZXI6IG5ldyBTb3VyY2VNYXBDb25zdW1lcih1dGlsLmdldEFyZyhzLCAnbWFwJyksIGFTb3VyY2VNYXBVUkwpXG4gICAgfVxuICB9KTtcbn1cblxuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIFRoZSBsaXN0IG9mIG9yaWdpbmFsIHNvdXJjZXMuXG4gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShJbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLCAnc291cmNlcycsIHtcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNvdXJjZXMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgc291cmNlcy5wdXNoKHRoaXMuX3NlY3Rpb25zW2ldLmNvbnN1bWVyLnNvdXJjZXNbal0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc291cmNlcztcbiAgfVxufSk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkXG4gKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3RcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgY29sdW1uXG4gKiAgICAgbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5vcmlnaW5hbFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgLy8gRmluZCB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24gd2UncmUgdHJ5aW5nIHRvIG1hcFxuICAgIC8vIHRvIGFuIG9yaWdpbmFsIHBvc2l0aW9uLlxuICAgIHZhciBzZWN0aW9uSW5kZXggPSBiaW5hcnlTZWFyY2guc2VhcmNoKG5lZWRsZSwgdGhpcy5fc2VjdGlvbnMsXG4gICAgICBmdW5jdGlvbihuZWVkbGUsIHNlY3Rpb24pIHtcbiAgICAgICAgdmFyIGNtcCA9IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC0gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZTtcbiAgICAgICAgaWYgKGNtcCkge1xuICAgICAgICAgIHJldHVybiBjbXA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKG5lZWRsZS5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbik7XG4gICAgICB9KTtcbiAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW3NlY3Rpb25JbmRleF07XG5cbiAgICBpZiAoIXNlY3Rpb24pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNvdXJjZTogbnVsbCxcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBuYW1lOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBzZWN0aW9uLmNvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgbGluZTogbmVlZGxlLmdlbmVyYXRlZExpbmUgLVxuICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgY29sdW1uOiBuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG5lZWRsZS5nZW5lcmF0ZWRMaW5lXG4gICAgICAgICA/IHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZENvbHVtbiAtIDFcbiAgICAgICAgIDogMCksXG4gICAgICBiaWFzOiBhQXJncy5iaWFzXG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5oYXNDb250ZW50c09mQWxsU291cmNlcyA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9oYXNDb250ZW50c09mQWxsU291cmNlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VjdGlvbnMuZXZlcnkoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiBzLmNvbnN1bWVyLmhhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCk7XG4gICAgfSk7XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlIGNvbnRlbnQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIHRoZSB1cmwgb2YgdGhlXG4gKiBvcmlnaW5hbCBzb3VyY2UgZmlsZS4gUmV0dXJucyBudWxsIGlmIG5vIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50IGlzXG4gKiBhdmFpbGFibGUuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9zb3VyY2VDb250ZW50Rm9yKGFTb3VyY2UsIG51bGxPbk1pc3NpbmcpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICB2YXIgY29udGVudCA9IHNlY3Rpb24uY29uc3VtZXIuc291cmNlQ29udGVudEZvcihhU291cmNlLCB0cnVlKTtcbiAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyBhU291cmNlICsgJ1wiIGlzIG5vdCBpbiB0aGUgU291cmNlTWFwLicpO1xuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwb3NpdGlvbnMgcHJvdmlkZWQuIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoXG4gKiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBjb2x1bW5cbiAqICAgICBudW1iZXIgaXMgMC1iYXNlZC5cbiAqXG4gKiBhbmQgYW4gb2JqZWN0IGlzIHJldHVybmVkIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLiBcbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZ2VuZXJhdGVkUG9zaXRpb25Gb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3NlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VjdGlvbiA9IHRoaXMuX3NlY3Rpb25zW2ldO1xuXG4gICAgICAvLyBPbmx5IGNvbnNpZGVyIHRoaXMgc2VjdGlvbiBpZiB0aGUgcmVxdWVzdGVkIHNvdXJjZSBpcyBpbiB0aGUgbGlzdCBvZlxuICAgICAgLy8gc291cmNlcyBvZiB0aGUgY29uc3VtZXIuXG4gICAgICBpZiAoc2VjdGlvbi5jb25zdW1lci5fZmluZFNvdXJjZUluZGV4KHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJykpID09PSAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBnZW5lcmF0ZWRQb3NpdGlvbiA9IHNlY3Rpb24uY29uc3VtZXIuZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpO1xuICAgICAgaWYgKGdlbmVyYXRlZFBvc2l0aW9uKSB7XG4gICAgICAgIHZhciByZXQgPSB7XG4gICAgICAgICAgbGluZTogZ2VuZXJhdGVkUG9zaXRpb24ubGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkUG9zaXRpb24uY29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBnZW5lcmF0ZWRQb3NpdGlvbi5saW5lXG4gICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICAgOiAwKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX3BhcnNlTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfcGFyc2VNYXBwaW5ncyhhU3RyLCBhU291cmNlUm9vdCkge1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcbiAgICAgIHZhciBzZWN0aW9uTWFwcGluZ3MgPSBzZWN0aW9uLmNvbnN1bWVyLl9nZW5lcmF0ZWRNYXBwaW5ncztcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VjdGlvbk1hcHBpbmdzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBtYXBwaW5nID0gc2VjdGlvbk1hcHBpbmdzW2pdO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBzZWN0aW9uLmNvbnN1bWVyLl9zb3VyY2VzLmF0KG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdXRpbC5jb21wdXRlU291cmNlVVJMKHNlY3Rpb24uY29uc3VtZXIuc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgICB0aGlzLl9zb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgICBzb3VyY2UgPSB0aGlzLl9zb3VyY2VzLmluZGV4T2Yoc291cmNlKTtcblxuICAgICAgICB2YXIgbmFtZSA9IG51bGw7XG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gc2VjdGlvbi5jb25zdW1lci5fbmFtZXMuYXQobWFwcGluZy5uYW1lKTtcbiAgICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgbWFwcGluZ3MgY29taW5nIGZyb20gdGhlIGNvbnN1bWVyIGZvciB0aGUgc2VjdGlvbiBoYXZlXG4gICAgICAgIC8vIGdlbmVyYXRlZCBwb3NpdGlvbnMgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLCBzbyB3ZVxuICAgICAgICAvLyBuZWVkIHRvIG9mZnNldCB0aGVtIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29uY2F0ZW5hdGVkXG4gICAgICAgIC8vIGdlbmVyYXRlZCBmaWxlLlxuICAgICAgICB2YXIgYWRqdXN0ZWRNYXBwaW5nID0ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSAtIDEpLFxuICAgICAgICAgIGdlbmVyYXRlZENvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgPT09IG1hcHBpbmcuZ2VuZXJhdGVkTGluZVxuICAgICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICAgICA6IDApLFxuICAgICAgICAgIG9yaWdpbmFsTGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgb3JpZ2luYWxDb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgIGlmICh0eXBlb2YgYWRqdXN0ZWRNYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncy5wdXNoKGFkanVzdGVkTWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWlja1NvcnQodGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKTtcbiAgICBxdWlja1NvcnQodGhpcy5fX29yaWdpbmFsTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuICB9O1xuXG5leHBvcnRzLkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lciA9IEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcjtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcbnZhciBBcnJheVNldCA9IHJlcXVpcmUoJy4vYXJyYXktc2V0JykuQXJyYXlTZXQ7XG52YXIgTWFwcGluZ0xpc3QgPSByZXF1aXJlKCcuL21hcHBpbmctbGlzdCcpLk1hcHBpbmdMaXN0O1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IgcmVwcmVzZW50cyBhIHNvdXJjZSBtYXAgd2hpY2ggaXNcbiAqIGJlaW5nIGJ1aWx0IGluY3JlbWVudGFsbHkuIFlvdSBtYXkgcGFzcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nXG4gKiBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBmaWxlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKiAgIC0gc291cmNlUm9vdDogQSByb290IGZvciBhbGwgcmVsYXRpdmUgVVJMcyBpbiB0aGlzIHNvdXJjZSBtYXAuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncykge1xuICBpZiAoIWFBcmdzKSB7XG4gICAgYUFyZ3MgPSB7fTtcbiAgfVxuICB0aGlzLl9maWxlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdmaWxlJywgbnVsbCk7XG4gIHRoaXMuX3NvdXJjZVJvb3QgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdGhpcy5fc2tpcFZhbGlkYXRpb24gPSB1dGlsLmdldEFyZyhhQXJncywgJ3NraXBWYWxpZGF0aW9uJywgZmFsc2UpO1xuICB0aGlzLl9zb3VyY2VzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX25hbWVzID0gbmV3IEFycmF5U2V0KCk7XG4gIHRoaXMuX21hcHBpbmdzID0gbmV3IE1hcHBpbmdMaXN0KCk7XG4gIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IG51bGw7XG59XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZlcnNpb24gPSAzO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgU291cmNlTWFwR2VuZXJhdG9yIGJhc2VkIG9uIGEgU291cmNlTWFwQ29uc3VtZXJcbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5mcm9tU291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyKSB7XG4gICAgdmFyIHNvdXJjZVJvb3QgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlUm9vdDtcbiAgICB2YXIgZ2VuZXJhdG9yID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcih7XG4gICAgICBmaWxlOiBhU291cmNlTWFwQ29uc3VtZXIuZmlsZSxcbiAgICAgIHNvdXJjZVJvb3Q6IHNvdXJjZVJvb3RcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuZWFjaE1hcHBpbmcoZnVuY3Rpb24gKG1hcHBpbmcpIHtcbiAgICAgIHZhciBuZXdNYXBwaW5nID0ge1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtblxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICBuZXdNYXBwaW5nLnNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG5ld01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5ld01hcHBpbmcub3JpZ2luYWwgPSB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgY29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmV3TWFwcGluZy5uYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGdlbmVyYXRvci5hZGRNYXBwaW5nKG5ld01hcHBpbmcpO1xuICAgIH0pO1xuICAgIGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VzLmZvckVhY2goZnVuY3Rpb24gKHNvdXJjZUZpbGUpIHtcbiAgICAgIHZhciBzb3VyY2VSZWxhdGl2ZSA9IHNvdXJjZUZpbGU7XG4gICAgICBpZiAoc291cmNlUm9vdCAhPT0gbnVsbCkge1xuICAgICAgICBzb3VyY2VSZWxhdGl2ZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2VuZXJhdG9yLl9zb3VyY2VzLmhhcyhzb3VyY2VSZWxhdGl2ZSkpIHtcbiAgICAgICAgZ2VuZXJhdG9yLl9zb3VyY2VzLmFkZChzb3VyY2VSZWxhdGl2ZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBjb250ZW50ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3Ioc291cmNlRmlsZSk7XG4gICAgICBpZiAoY29udGVudCAhPSBudWxsKSB7XG4gICAgICAgIGdlbmVyYXRvci5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH07XG5cbi8qKlxuICogQWRkIGEgc2luZ2xlIG1hcHBpbmcgZnJvbSBvcmlnaW5hbCBzb3VyY2UgbGluZSBhbmQgY29sdW1uIHRvIHRoZSBnZW5lcmF0ZWRcbiAqIHNvdXJjZSdzIGxpbmUgYW5kIGNvbHVtbiBmb3IgdGhpcyBzb3VyY2UgbWFwIGJlaW5nIGNyZWF0ZWQuIFRoZSBtYXBwaW5nXG4gKiBvYmplY3Qgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBnZW5lcmF0ZWQ6IEFuIG9iamVjdCB3aXRoIHRoZSBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucy5cbiAqICAgLSBvcmlnaW5hbDogQW4gb2JqZWN0IHdpdGggdGhlIG9yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUgKHJlbGF0aXZlIHRvIHRoZSBzb3VyY2VSb290KS5cbiAqICAgLSBuYW1lOiBBbiBvcHRpb25hbCBvcmlnaW5hbCB0b2tlbiBuYW1lIGZvciB0aGlzIG1hcHBpbmcuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYWRkTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9hZGRNYXBwaW5nKGFBcmdzKSB7XG4gICAgdmFyIGdlbmVyYXRlZCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZ2VuZXJhdGVkJyk7XG4gICAgdmFyIG9yaWdpbmFsID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdvcmlnaW5hbCcsIG51bGwpO1xuICAgIHZhciBzb3VyY2UgPSB1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScsIG51bGwpO1xuICAgIHZhciBuYW1lID0gdXRpbC5nZXRBcmcoYUFyZ3MsICduYW1lJywgbnVsbCk7XG5cbiAgICBpZiAoIXRoaXMuX3NraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLl92YWxpZGF0ZU1hcHBpbmcoZ2VuZXJhdGVkLCBvcmlnaW5hbCwgc291cmNlLCBuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoc291cmNlICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZSA9IFN0cmluZyhzb3VyY2UpO1xuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgbmFtZSA9IFN0cmluZyhuYW1lKTtcbiAgICAgIGlmICghdGhpcy5fbmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHRoaXMuX25hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9tYXBwaW5ncy5hZGQoe1xuICAgICAgZ2VuZXJhdGVkTGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IGdlbmVyYXRlZC5jb2x1bW4sXG4gICAgICBvcmlnaW5hbExpbmU6IG9yaWdpbmFsICE9IG51bGwgJiYgb3JpZ2luYWwubGluZSxcbiAgICAgIG9yaWdpbmFsQ29sdW1uOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmNvbHVtbixcbiAgICAgIHNvdXJjZTogc291cmNlLFxuICAgICAgbmFtZTogbmFtZVxuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHZhciBzb3VyY2UgPSBhU291cmNlRmlsZTtcbiAgICBpZiAodGhpcy5fc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuX3NvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgfVxuXG4gICAgaWYgKGFTb3VyY2VDb250ZW50ICE9IG51bGwpIHtcbiAgICAgIC8vIEFkZCB0aGUgc291cmNlIGNvbnRlbnQgdG8gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IF9zb3VyY2VzQ29udGVudHMgbWFwIGlmIHRoZSBwcm9wZXJ0eSBpcyBudWxsLlxuICAgICAgaWYgKCF0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50c1t1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9zb3VyY2VzQ29udGVudHMpIHtcbiAgICAgIC8vIFJlbW92ZSB0aGUgc291cmNlIGZpbGUgZnJvbSB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAuXG4gICAgICAvLyBJZiB0aGUgX3NvdXJjZXNDb250ZW50cyBtYXAgaXMgZW1wdHksIHNldCB0aGUgcHJvcGVydHkgdG8gbnVsbC5cbiAgICAgIGRlbGV0ZSB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXTtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9zb3VyY2VzQ29udGVudHMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBtYXBwaW5ncyBvZiBhIHN1Yi1zb3VyY2UtbWFwIGZvciBhIHNwZWNpZmljIHNvdXJjZSBmaWxlIHRvIHRoZVxuICogc291cmNlIG1hcCBiZWluZyBnZW5lcmF0ZWQuIEVhY2ggbWFwcGluZyB0byB0aGUgc3VwcGxpZWQgc291cmNlIGZpbGUgaXNcbiAqIHJld3JpdHRlbiB1c2luZyB0aGUgc3VwcGxpZWQgc291cmNlIG1hcC4gTm90ZTogVGhlIHJlc29sdXRpb24gZm9yIHRoZVxuICogcmVzdWx0aW5nIG1hcHBpbmdzIGlzIHRoZSBtaW5pbWl1bSBvZiB0aGlzIG1hcCBhbmQgdGhlIHN1cHBsaWVkIG1hcC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgT3B0aW9uYWwuIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGUuXG4gKiAgICAgICAgSWYgb21pdHRlZCwgU291cmNlTWFwQ29uc3VtZXIncyBmaWxlIHByb3BlcnR5IHdpbGwgYmUgdXNlZC5cbiAqIEBwYXJhbSBhU291cmNlTWFwUGF0aCBPcHRpb25hbC4gVGhlIGRpcm5hbWUgb2YgdGhlIHBhdGggdG8gdGhlIHNvdXJjZSBtYXBcbiAqICAgICAgICB0byBiZSBhcHBsaWVkLiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyLlxuICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIG5lZWRlZCB3aGVuIHRoZSB0d28gc291cmNlIG1hcHMgYXJlbid0IGluIHRoZSBzYW1lXG4gKiAgICAgICAgZGlyZWN0b3J5LCBhbmQgdGhlIHNvdXJjZSBtYXAgdG8gYmUgYXBwbGllZCBjb250YWlucyByZWxhdGl2ZSBzb3VyY2VcbiAqICAgICAgICBwYXRocy4gSWYgc28sIHRob3NlIHJlbGF0aXZlIHNvdXJjZSBwYXRocyBuZWVkIHRvIGJlIHJld3JpdHRlblxuICogICAgICAgIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3IuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuYXBwbHlTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYXBwbHlTb3VyY2VNYXAoYVNvdXJjZU1hcENvbnN1bWVyLCBhU291cmNlRmlsZSwgYVNvdXJjZU1hcFBhdGgpIHtcbiAgICB2YXIgc291cmNlRmlsZSA9IGFTb3VyY2VGaWxlO1xuICAgIC8vIElmIGFTb3VyY2VGaWxlIGlzIG9taXR0ZWQsIHdlIHdpbGwgdXNlIHRoZSBmaWxlIHByb3BlcnR5IG9mIHRoZSBTb3VyY2VNYXBcbiAgICBpZiAoYVNvdXJjZUZpbGUgPT0gbnVsbCkge1xuICAgICAgaWYgKGFTb3VyY2VNYXBDb25zdW1lci5maWxlID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdTb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwIHJlcXVpcmVzIGVpdGhlciBhbiBleHBsaWNpdCBzb3VyY2UgZmlsZSwgJyArXG4gICAgICAgICAgJ29yIHRoZSBzb3VyY2UgbWFwXFwncyBcImZpbGVcIiBwcm9wZXJ0eS4gQm90aCB3ZXJlIG9taXR0ZWQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgc291cmNlRmlsZSA9IGFTb3VyY2VNYXBDb25zdW1lci5maWxlO1xuICAgIH1cbiAgICB2YXIgc291cmNlUm9vdCA9IHRoaXMuX3NvdXJjZVJvb3Q7XG4gICAgLy8gTWFrZSBcInNvdXJjZUZpbGVcIiByZWxhdGl2ZSBpZiBhbiBhYnNvbHV0ZSBVcmwgaXMgcGFzc2VkLlxuICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgIH1cbiAgICAvLyBBcHBseWluZyB0aGUgU291cmNlTWFwIGNhbiBhZGQgYW5kIHJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzb3VyY2VzIGFuZFxuICAgIC8vIHRoZSBuYW1lcyBhcnJheS5cbiAgICB2YXIgbmV3U291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICAgIHZhciBuZXdOYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuXG4gICAgLy8gRmluZCBtYXBwaW5ncyBmb3IgdGhlIFwic291cmNlRmlsZVwiXG4gICAgdGhpcy5fbWFwcGluZ3MudW5zb3J0ZWRGb3JFYWNoKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobWFwcGluZy5zb3VyY2UgPT09IHNvdXJjZUZpbGUgJiYgbWFwcGluZy5vcmlnaW5hbExpbmUgIT0gbnVsbCkge1xuICAgICAgICAvLyBDaGVjayBpZiBpdCBjYW4gYmUgbWFwcGVkIGJ5IHRoZSBzb3VyY2UgbWFwLCB0aGVuIHVwZGF0ZSB0aGUgbWFwcGluZy5cbiAgICAgICAgdmFyIG9yaWdpbmFsID0gYVNvdXJjZU1hcENvbnN1bWVyLm9yaWdpbmFsUG9zaXRpb25Gb3Ioe1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgICAgLy8gQ29weSBtYXBwaW5nXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBvcmlnaW5hbC5saW5lO1xuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICAgICAgaWYgKG9yaWdpbmFsLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgbWFwcGluZy5uYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHNvdXJjZSA9IG1hcHBpbmcuc291cmNlO1xuICAgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmICFuZXdTb3VyY2VzLmhhcyhzb3VyY2UpKSB7XG4gICAgICAgIG5ld1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBuYW1lID0gbWFwcGluZy5uYW1lO1xuICAgICAgaWYgKG5hbWUgIT0gbnVsbCAmJiAhbmV3TmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIG5ld05hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cblxuICAgIH0sIHRoaXMpO1xuICAgIHRoaXMuX3NvdXJjZXMgPSBuZXdTb3VyY2VzO1xuICAgIHRoaXMuX25hbWVzID0gbmV3TmFtZXM7XG5cbiAgICAvLyBDb3B5IHNvdXJjZXNDb250ZW50cyBvZiBhcHBsaWVkIG1hcC5cbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVNvdXJjZU1hcFBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVNvdXJjZU1hcFBhdGgsIHNvdXJjZUZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogQSBtYXBwaW5nIGNhbiBoYXZlIG9uZSBvZiB0aGUgdGhyZWUgbGV2ZWxzIG9mIGRhdGE6XG4gKlxuICogICAxLiBKdXN0IHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKiAgIDIuIFRoZSBHZW5lcmF0ZWQgcG9zaXRpb24sIG9yaWdpbmFsIHBvc2l0aW9uLCBhbmQgb3JpZ2luYWwgc291cmNlLlxuICogICAzLiBHZW5lcmF0ZWQgYW5kIG9yaWdpbmFsIHBvc2l0aW9uLCBvcmlnaW5hbCBzb3VyY2UsIGFzIHdlbGwgYXMgYSBuYW1lXG4gKiAgICAgIHRva2VuLlxuICpcbiAqIFRvIG1haW50YWluIGNvbnNpc3RlbmN5LCB3ZSB2YWxpZGF0ZSB0aGF0IGFueSBuZXcgbWFwcGluZyBiZWluZyBhZGRlZCBmYWxsc1xuICogaW4gdG8gb25lIG9mIHRoZXNlIGNhdGVnb3JpZXMuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3ZhbGlkYXRlTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl92YWxpZGF0ZU1hcHBpbmcoYUdlbmVyYXRlZCwgYU9yaWdpbmFsLCBhU291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFOYW1lKSB7XG4gICAgLy8gV2hlbiBhT3JpZ2luYWwgaXMgdHJ1dGh5IGJ1dCBoYXMgZW1wdHkgdmFsdWVzIGZvciAubGluZSBhbmQgLmNvbHVtbixcbiAgICAvLyBpdCBpcyBtb3N0IGxpa2VseSBhIHByb2dyYW1tZXIgZXJyb3IuIEluIHRoaXMgY2FzZSB3ZSB0aHJvdyBhIHZlcnlcbiAgICAvLyBzcGVjaWZpYyBlcnJvciBtZXNzYWdlIHRvIHRyeSB0byBndWlkZSB0aGVtIHRoZSByaWdodCB3YXkuXG4gICAgLy8gRm9yIGV4YW1wbGU6IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXItYnVuZGxlci9wdWxsLzUxOVxuICAgIGlmIChhT3JpZ2luYWwgJiYgdHlwZW9mIGFPcmlnaW5hbC5saW5lICE9PSAnbnVtYmVyJyAmJiB0eXBlb2YgYU9yaWdpbmFsLmNvbHVtbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ29yaWdpbmFsLmxpbmUgYW5kIG9yaWdpbmFsLmNvbHVtbiBhcmUgbm90IG51bWJlcnMgLS0geW91IHByb2JhYmx5IG1lYW50IHRvIG9taXQgJyArXG4gICAgICAgICAgICAndGhlIG9yaWdpbmFsIG1hcHBpbmcgZW50aXJlbHkgYW5kIG9ubHkgbWFwIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb24uIElmIHNvLCBwYXNzICcgK1xuICAgICAgICAgICAgJ251bGwgZm9yIHRoZSBvcmlnaW5hbCBtYXBwaW5nIGluc3RlYWQgb2YgYW4gb2JqZWN0IHdpdGggZW1wdHkgb3IgbnVsbCB2YWx1ZXMuJ1xuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgJiYgYUdlbmVyYXRlZC5saW5lID4gMCAmJiBhR2VuZXJhdGVkLmNvbHVtbiA+PSAwXG4gICAgICAgICYmICFhT3JpZ2luYWwgJiYgIWFTb3VyY2UgJiYgIWFOYW1lKSB7XG4gICAgICAvLyBDYXNlIDEuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKGFHZW5lcmF0ZWQgJiYgJ2xpbmUnIGluIGFHZW5lcmF0ZWQgJiYgJ2NvbHVtbicgaW4gYUdlbmVyYXRlZFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbCAmJiAnbGluZScgaW4gYU9yaWdpbmFsICYmICdjb2x1bW4nIGluIGFPcmlnaW5hbFxuICAgICAgICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAgICAgICYmIGFPcmlnaW5hbC5saW5lID4gMCAmJiBhT3JpZ2luYWwuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhU291cmNlKSB7XG4gICAgICAvLyBDYXNlcyAyIGFuZCAzLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtYXBwaW5nOiAnICsgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnZW5lcmF0ZWQ6IGFHZW5lcmF0ZWQsXG4gICAgICAgIHNvdXJjZTogYVNvdXJjZSxcbiAgICAgICAgb3JpZ2luYWw6IGFPcmlnaW5hbCxcbiAgICAgICAgbmFtZTogYU5hbWVcbiAgICAgIH0pKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogU2VyaWFsaXplIHRoZSBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiB0byB0aGUgc3RyZWFtIG9mIGJhc2UgNjQgVkxRc1xuICogc3BlY2lmaWVkIGJ5IHRoZSBzb3VyY2UgbWFwIGZvcm1hdC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5fc2VyaWFsaXplTWFwcGluZ3MgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2VyaWFsaXplTWFwcGluZ3MoKSB7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNHZW5lcmF0ZWRMaW5lID0gMTtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxMaW5lID0gMDtcbiAgICB2YXIgcHJldmlvdXNOYW1lID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciByZXN1bHQgPSAnJztcbiAgICB2YXIgbmV4dDtcbiAgICB2YXIgbWFwcGluZztcbiAgICB2YXIgbmFtZUlkeDtcbiAgICB2YXIgc291cmNlSWR4O1xuXG4gICAgdmFyIG1hcHBpbmdzID0gdGhpcy5fbWFwcGluZ3MudG9BcnJheSgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBtYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgbWFwcGluZyA9IG1hcHBpbmdzW2ldO1xuICAgICAgbmV4dCA9ICcnXG5cbiAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgIHdoaWxlIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgIT09IHByZXZpb3VzR2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIG5leHQgKz0gJzsnO1xuICAgICAgICAgIHByZXZpb3VzR2VuZXJhdGVkTGluZSsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgaWYgKCF1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmcsIG1hcHBpbmdzW2kgLSAxXSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBuZXh0ICs9ICcsJztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbjtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlSWR4ID0gdGhpcy5fc291cmNlcy5pbmRleE9mKG1hcHBpbmcuc291cmNlKTtcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKHNvdXJjZUlkeCAtIHByZXZpb3VzU291cmNlKTtcbiAgICAgICAgcHJldmlvdXNTb3VyY2UgPSBzb3VyY2VJZHg7XG5cbiAgICAgICAgLy8gbGluZXMgYXJlIHN0b3JlZCAwLWJhc2VkIGluIFNvdXJjZU1hcCBzcGVjIHZlcnNpb24gM1xuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbExpbmUgLSAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcHJldmlvdXNPcmlnaW5hbExpbmUpO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMTtcblxuICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4pO1xuICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAobWFwcGluZy5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICBuYW1lSWR4ID0gdGhpcy5fbmFtZXMuaW5kZXhPZihtYXBwaW5nLm5hbWUpO1xuICAgICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShuYW1lSWR4IC0gcHJldmlvdXNOYW1lKTtcbiAgICAgICAgICBwcmV2aW91c05hbWUgPSBuYW1lSWR4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJlc3VsdCArPSBuZXh0O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfZ2VuZXJhdGVTb3VyY2VzQ29udGVudChhU291cmNlcywgYVNvdXJjZVJvb3QpIHtcbiAgICByZXR1cm4gYVNvdXJjZXMubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGFTb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZShhU291cmNlUm9vdCwgc291cmNlKTtcbiAgICAgIH1cbiAgICAgIHZhciBrZXkgPSB1dGlsLnRvU2V0U3RyaW5nKHNvdXJjZSk7XG4gICAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX3NvdXJjZXNDb250ZW50cywga2V5KVxuICAgICAgICA/IHRoaXMuX3NvdXJjZXNDb250ZW50c1trZXldXG4gICAgICAgIDogbnVsbDtcbiAgICB9LCB0aGlzKTtcbiAgfTtcblxuLyoqXG4gKiBFeHRlcm5hbGl6ZSB0aGUgc291cmNlIG1hcC5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b0pTT04gPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdG9KU09OKCkge1xuICAgIHZhciBtYXAgPSB7XG4gICAgICB2ZXJzaW9uOiB0aGlzLl92ZXJzaW9uLFxuICAgICAgc291cmNlczogdGhpcy5fc291cmNlcy50b0FycmF5KCksXG4gICAgICBuYW1lczogdGhpcy5fbmFtZXMudG9BcnJheSgpLFxuICAgICAgbWFwcGluZ3M6IHRoaXMuX3NlcmlhbGl6ZU1hcHBpbmdzKClcbiAgICB9O1xuICAgIGlmICh0aGlzLl9maWxlICE9IG51bGwpIHtcbiAgICAgIG1hcC5maWxlID0gdGhpcy5fZmlsZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgbWFwLnNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICBtYXAuc291cmNlc0NvbnRlbnQgPSB0aGlzLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50KG1hcC5zb3VyY2VzLCBtYXAuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcDtcbiAgfTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkIHRvIGEgc3RyaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnRvU3RyaW5nID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvU3RyaW5nKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKTtcbiAgfTtcblxuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSBTb3VyY2VNYXBHZW5lcmF0b3I7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBTb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLy8gTWF0Y2hlcyBhIFdpbmRvd3Mtc3R5bGUgYFxcclxcbmAgbmV3bGluZSBvciBhIGBcXG5gIG5ld2xpbmUgdXNlZCBieSBhbGwgb3RoZXJcbi8vIG9wZXJhdGluZyBzeXN0ZW1zIHRoZXNlIGRheXMgKGNhcHR1cmluZyB0aGUgcmVzdWx0KS5cbnZhciBSRUdFWF9ORVdMSU5FID0gLyhcXHI/XFxuKS87XG5cbi8vIE5ld2xpbmUgY2hhcmFjdGVyIGNvZGUgZm9yIGNoYXJDb2RlQXQoKSBjb21wYXJpc29uc1xudmFyIE5FV0xJTkVfQ09ERSA9IDEwO1xuXG4vLyBQcml2YXRlIHN5bWJvbCBmb3IgaWRlbnRpZnlpbmcgYFNvdXJjZU5vZGVgcyB3aGVuIG11bHRpcGxlIHZlcnNpb25zIG9mXG4vLyB0aGUgc291cmNlLW1hcCBsaWJyYXJ5IGFyZSBsb2FkZWQuIFRoaXMgTVVTVCBOT1QgQ0hBTkdFIGFjcm9zc1xuLy8gdmVyc2lvbnMhXG52YXIgaXNTb3VyY2VOb2RlID0gXCIkJCRpc1NvdXJjZU5vZGUkJCRcIjtcblxuLyoqXG4gKiBTb3VyY2VOb2RlcyBwcm92aWRlIGEgd2F5IHRvIGFic3RyYWN0IG92ZXIgaW50ZXJwb2xhdGluZy9jb25jYXRlbmF0aW5nXG4gKiBzbmlwcGV0cyBvZiBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBzb3VyY2UgY29kZSB3aGlsZSBtYWludGFpbmluZyB0aGUgbGluZSBhbmRcbiAqIGNvbHVtbiBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLlxuICpcbiAqIEBwYXJhbSBhTGluZSBUaGUgb3JpZ2luYWwgbGluZSBudW1iZXIuXG4gKiBAcGFyYW0gYUNvbHVtbiBUaGUgb3JpZ2luYWwgY29sdW1uIG51bWJlci5cbiAqIEBwYXJhbSBhU291cmNlIFRoZSBvcmlnaW5hbCBzb3VyY2UncyBmaWxlbmFtZS5cbiAqIEBwYXJhbSBhQ2h1bmtzIE9wdGlvbmFsLiBBbiBhcnJheSBvZiBzdHJpbmdzIHdoaWNoIGFyZSBzbmlwcGV0cyBvZlxuICogICAgICAgIGdlbmVyYXRlZCBKUywgb3Igb3RoZXIgU291cmNlTm9kZXMuXG4gKiBAcGFyYW0gYU5hbWUgVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIuXG4gKi9cbmZ1bmN0aW9uIFNvdXJjZU5vZGUoYUxpbmUsIGFDb2x1bW4sIGFTb3VyY2UsIGFDaHVua3MsIGFOYW1lKSB7XG4gIHRoaXMuY2hpbGRyZW4gPSBbXTtcbiAgdGhpcy5zb3VyY2VDb250ZW50cyA9IHt9O1xuICB0aGlzLmxpbmUgPSBhTGluZSA9PSBudWxsID8gbnVsbCA6IGFMaW5lO1xuICB0aGlzLmNvbHVtbiA9IGFDb2x1bW4gPT0gbnVsbCA/IG51bGwgOiBhQ29sdW1uO1xuICB0aGlzLnNvdXJjZSA9IGFTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiBhU291cmNlO1xuICB0aGlzLm5hbWUgPSBhTmFtZSA9PSBudWxsID8gbnVsbCA6IGFOYW1lO1xuICB0aGlzW2lzU291cmNlTm9kZV0gPSB0cnVlO1xuICBpZiAoYUNodW5rcyAhPSBudWxsKSB0aGlzLmFkZChhQ2h1bmtzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgU291cmNlTm9kZSBmcm9tIGdlbmVyYXRlZCBjb2RlIGFuZCBhIFNvdXJjZU1hcENvbnN1bWVyLlxuICpcbiAqIEBwYXJhbSBhR2VuZXJhdGVkQ29kZSBUaGUgZ2VuZXJhdGVkIGNvZGVcbiAqIEBwYXJhbSBhU291cmNlTWFwQ29uc3VtZXIgVGhlIFNvdXJjZU1hcCBmb3IgdGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVJlbGF0aXZlUGF0aCBPcHRpb25hbC4gVGhlIHBhdGggdGhhdCByZWxhdGl2ZSBzb3VyY2VzIGluIHRoZVxuICogICAgICAgIFNvdXJjZU1hcENvbnN1bWVyIHNob3VsZCBiZSByZWxhdGl2ZSB0by5cbiAqL1xuU291cmNlTm9kZS5mcm9tU3RyaW5nV2l0aFNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAoYUdlbmVyYXRlZENvZGUsIGFTb3VyY2VNYXBDb25zdW1lciwgYVJlbGF0aXZlUGF0aCkge1xuICAgIC8vIFRoZSBTb3VyY2VOb2RlIHdlIHdhbnQgdG8gZmlsbCB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZVxuICAgIC8vIGFuZCB0aGUgU291cmNlTWFwXG4gICAgdmFyIG5vZGUgPSBuZXcgU291cmNlTm9kZSgpO1xuXG4gICAgLy8gQWxsIGV2ZW4gaW5kaWNlcyBvZiB0aGlzIGFycmF5IGFyZSBvbmUgbGluZSBvZiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4gICAgLy8gd2hpbGUgYWxsIG9kZCBpbmRpY2VzIGFyZSB0aGUgbmV3bGluZXMgYmV0d2VlbiB0d28gYWRqYWNlbnQgbGluZXNcbiAgICAvLyAoc2luY2UgYFJFR0VYX05FV0xJTkVgIGNhcHR1cmVzIGl0cyBtYXRjaCkuXG4gICAgLy8gUHJvY2Vzc2VkIGZyYWdtZW50cyBhcmUgYWNjZXNzZWQgYnkgY2FsbGluZyBgc2hpZnROZXh0TGluZWAuXG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzID0gYUdlbmVyYXRlZENvZGUuc3BsaXQoUkVHRVhfTkVXTElORSk7XG4gICAgdmFyIHJlbWFpbmluZ0xpbmVzSW5kZXggPSAwO1xuICAgIHZhciBzaGlmdE5leHRMaW5lID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbGluZUNvbnRlbnRzID0gZ2V0TmV4dExpbmUoKTtcbiAgICAgIC8vIFRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIG1pZ2h0IG5vdCBoYXZlIGEgbmV3bGluZS5cbiAgICAgIHZhciBuZXdMaW5lID0gZ2V0TmV4dExpbmUoKSB8fCBcIlwiO1xuICAgICAgcmV0dXJuIGxpbmVDb250ZW50cyArIG5ld0xpbmU7XG5cbiAgICAgIGZ1bmN0aW9uIGdldE5leHRMaW5lKCkge1xuICAgICAgICByZXR1cm4gcmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA/XG4gICAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4KytdIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBwb3NpdGlvbiBvZiBcInJlbWFpbmluZ0xpbmVzXCJcbiAgICB2YXIgbGFzdEdlbmVyYXRlZExpbmUgPSAxLCBsYXN0R2VuZXJhdGVkQ29sdW1uID0gMDtcblxuICAgIC8vIFRoZSBnZW5lcmF0ZSBTb3VyY2VOb2RlcyB3ZSBuZWVkIGEgY29kZSByYW5nZS5cbiAgICAvLyBUbyBleHRyYWN0IGl0IGN1cnJlbnQgYW5kIGxhc3QgbWFwcGluZyBpcyB1c2VkLlxuICAgIC8vIEhlcmUgd2Ugc3RvcmUgdGhlIGxhc3QgbWFwcGluZy5cbiAgICB2YXIgbGFzdE1hcHBpbmcgPSBudWxsO1xuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcgIT09IG51bGwpIHtcbiAgICAgICAgLy8gV2UgYWRkIHRoZSBjb2RlIGZyb20gXCJsYXN0TWFwcGluZ1wiIHRvIFwibWFwcGluZ1wiOlxuICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGVyZSBpcyBhIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgIGlmIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICAgIC8vIEFzc29jaWF0ZSBmaXJzdCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICAgICAgLy8gVGhlIHJlbWFpbmluZyBjb2RlIGlzIGFkZGVkIHdpdGhvdXQgbWFwcGluZ1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5ldyBsaW5lIGluIGJldHdlZW4uXG4gICAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSBjb2RlIGJldHdlZW4gXCJsYXN0R2VuZXJhdGVkQ29sdW1uXCIgYW5kXG4gICAgICAgICAgLy8gXCJtYXBwaW5nLmdlbmVyYXRlZENvbHVtblwiIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgICAgdmFyIG5leHRMaW5lID0gcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gfHwgJyc7XG4gICAgICAgICAgdmFyIGNvZGUgPSBuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICAgICAgYWRkTWFwcGluZ1dpdGhDb2RlKGxhc3RNYXBwaW5nLCBjb2RlKTtcbiAgICAgICAgICAvLyBObyBtb3JlIHJlbWFpbmluZyBjb2RlLCBjb250aW51ZVxuICAgICAgICAgIGxhc3RNYXBwaW5nID0gbWFwcGluZztcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFdlIGFkZCB0aGUgZ2VuZXJhdGVkIGNvZGUgdW50aWwgdGhlIGZpcnN0IG1hcHBpbmdcbiAgICAgIC8vIHRvIHRoZSBTb3VyY2VOb2RlIHdpdGhvdXQgYW55IG1hcHBpbmcuXG4gICAgICAvLyBFYWNoIGxpbmUgaXMgYWRkZWQgYXMgc2VwYXJhdGUgc3RyaW5nLlxuICAgICAgd2hpbGUgKGxhc3RHZW5lcmF0ZWRMaW5lIDwgbWFwcGluZy5nZW5lcmF0ZWRMaW5lKSB7XG4gICAgICAgIG5vZGUuYWRkKHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICAgIGxhc3RHZW5lcmF0ZWRMaW5lKys7XG4gICAgICB9XG4gICAgICBpZiAobGFzdEdlbmVyYXRlZENvbHVtbiA8IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSB7XG4gICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICBub2RlLmFkZChuZXh0TGluZS5zdWJzdHIoMCwgbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pKTtcbiAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleF0gPSBuZXh0TGluZS5zdWJzdHIobWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG4gICAgICB9XG4gICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgfSwgdGhpcyk7XG4gICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG1hcHBpbmdzLlxuICAgIGlmIChyZW1haW5pbmdMaW5lc0luZGV4IDwgcmVtYWluaW5nTGluZXMubGVuZ3RoKSB7XG4gICAgICBpZiAobGFzdE1hcHBpbmcpIHtcbiAgICAgICAgLy8gQXNzb2NpYXRlIHRoZSByZW1haW5pbmcgY29kZSBpbiB0aGUgY3VycmVudCBsaW5lIHdpdGggXCJsYXN0TWFwcGluZ1wiXG4gICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgIH1cbiAgICAgIC8vIGFuZCBhZGQgdGhlIHJlbWFpbmluZyBsaW5lcyB3aXRob3V0IGFueSBtYXBwaW5nXG4gICAgICBub2RlLmFkZChyZW1haW5pbmdMaW5lcy5zcGxpY2UocmVtYWluaW5nTGluZXNJbmRleCkuam9pbihcIlwiKSk7XG4gICAgfVxuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudCBpbnRvIFNvdXJjZU5vZGVcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBpZiAoYVJlbGF0aXZlUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBub2RlLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgY29udGVudCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbm9kZTtcblxuICAgIGZ1bmN0aW9uIGFkZE1hcHBpbmdXaXRoQ29kZShtYXBwaW5nLCBjb2RlKSB7XG4gICAgICBpZiAobWFwcGluZyA9PT0gbnVsbCB8fCBtYXBwaW5nLnNvdXJjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuYWRkKGNvZGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHNvdXJjZSA9IGFSZWxhdGl2ZVBhdGhcbiAgICAgICAgICA/IHV0aWwuam9pbihhUmVsYXRpdmVQYXRoLCBtYXBwaW5nLnNvdXJjZSlcbiAgICAgICAgICA6IG1hcHBpbmcuc291cmNlO1xuICAgICAgICBub2RlLmFkZChuZXcgU291cmNlTm9kZShtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbENvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLm5hbWUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gU291cmNlTm9kZV9hZGQoYUNodW5rKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFDaHVuaykpIHtcbiAgICBhQ2h1bmsuZm9yRWFjaChmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgIHRoaXMuYWRkKGNodW5rKTtcbiAgICB9LCB0aGlzKTtcbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgaWYgKGFDaHVuaykge1xuICAgICAgdGhpcy5jaGlsZHJlbi5wdXNoKGFDaHVuayk7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQWRkIGEgY2h1bmsgb2YgZ2VuZXJhdGVkIEpTIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzb3VyY2Ugbm9kZS5cbiAqXG4gKiBAcGFyYW0gYUNodW5rIEEgc3RyaW5nIHNuaXBwZXQgb2YgZ2VuZXJhdGVkIEpTIGNvZGUsIGFub3RoZXIgaW5zdGFuY2Ugb2ZcbiAqICAgICAgICBTb3VyY2VOb2RlLCBvciBhbiBhcnJheSB3aGVyZSBlYWNoIG1lbWJlciBpcyBvbmUgb2YgdGhvc2UgdGhpbmdzLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5wcmVwZW5kID0gZnVuY3Rpb24gU291cmNlTm9kZV9wcmVwZW5kKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgZm9yICh2YXIgaSA9IGFDaHVuay5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHRoaXMucHJlcGVuZChhQ2h1bmtbaV0pO1xuICAgIH1cbiAgfVxuICBlbHNlIGlmIChhQ2h1bmtbaXNTb3VyY2VOb2RlXSB8fCB0eXBlb2YgYUNodW5rID09PSBcInN0cmluZ1wiKSB7XG4gICAgdGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFDaHVuayk7XG4gIH1cbiAgZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgIFwiRXhwZWN0ZWQgYSBTb3VyY2VOb2RlLCBzdHJpbmcsIG9yIGFuIGFycmF5IG9mIFNvdXJjZU5vZGVzIGFuZCBzdHJpbmdzLiBHb3QgXCIgKyBhQ2h1bmtcbiAgICApO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBXYWxrIG92ZXIgdGhlIHRyZWUgb2YgSlMgc25pcHBldHMgaW4gdGhpcyBub2RlIGFuZCBpdHMgY2hpbGRyZW4uIFRoZVxuICogd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBzbmlwcGV0IG9mIEpTIGFuZCBpcyBwYXNzZWQgdGhhdFxuICogc25pcHBldCBhbmQgdGhlIGl0cyBvcmlnaW5hbCBhc3NvY2lhdGVkIHNvdXJjZSdzIGxpbmUvY29sdW1uIGxvY2F0aW9uLlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2FsayA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2FsayhhRm4pIHtcbiAgdmFyIGNodW5rO1xuICBmb3IgKHZhciBpID0gMCwgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGNodW5rID0gdGhpcy5jaGlsZHJlbltpXTtcbiAgICBpZiAoY2h1bmtbaXNTb3VyY2VOb2RlXSkge1xuICAgICAgY2h1bmsud2FsayhhRm4pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGlmIChjaHVuayAhPT0gJycpIHtcbiAgICAgICAgYUZuKGNodW5rLCB7IHNvdXJjZTogdGhpcy5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmxpbmUsXG4gICAgICAgICAgICAgICAgICAgICBjb2x1bW46IHRoaXMuY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBMaWtlIGBTdHJpbmcucHJvdG90eXBlLmpvaW5gIGV4Y2VwdCBmb3IgU291cmNlTm9kZXMuIEluc2VydHMgYGFTdHJgIGJldHdlZW5cbiAqIGVhY2ggb2YgYHRoaXMuY2hpbGRyZW5gLlxuICpcbiAqIEBwYXJhbSBhU2VwIFRoZSBzZXBhcmF0b3IuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmpvaW4gPSBmdW5jdGlvbiBTb3VyY2VOb2RlX2pvaW4oYVNlcCkge1xuICB2YXIgbmV3Q2hpbGRyZW47XG4gIHZhciBpO1xuICB2YXIgbGVuID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7XG4gIGlmIChsZW4gPiAwKSB7XG4gICAgbmV3Q2hpbGRyZW4gPSBbXTtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuLTE7IGkrKykge1xuICAgICAgbmV3Q2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2ldKTtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2goYVNlcCk7XG4gICAgfVxuICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgdGhpcy5jaGlsZHJlbiA9IG5ld0NoaWxkcmVuO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBDYWxsIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZSBvbiB0aGUgdmVyeSByaWdodC1tb3N0IHNvdXJjZSBzbmlwcGV0LiBVc2VmdWxcbiAqIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlIGZyb20gdGhlIGVuZCBvZiBhIHNvdXJjZSBub2RlLCBldGMuXG4gKlxuICogQHBhcmFtIGFQYXR0ZXJuIFRoZSBwYXR0ZXJuIHRvIHJlcGxhY2UuXG4gKiBAcGFyYW0gYVJlcGxhY2VtZW50IFRoZSB0aGluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJuIHdpdGguXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnJlcGxhY2VSaWdodCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcmVwbGFjZVJpZ2h0KGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpIHtcbiAgdmFyIGxhc3RDaGlsZCA9IHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgaWYgKGxhc3RDaGlsZFtpc1NvdXJjZU5vZGVdKSB7XG4gICAgbGFzdENoaWxkLnJlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2YgbGFzdENoaWxkID09PSAnc3RyaW5nJykge1xuICAgIHRoaXMuY2hpbGRyZW5bdGhpcy5jaGlsZHJlbi5sZW5ndGggLSAxXSA9IGxhc3RDaGlsZC5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpO1xuICB9XG4gIGVsc2Uge1xuICAgIHRoaXMuY2hpbGRyZW4ucHVzaCgnJy5yZXBsYWNlKGFQYXR0ZXJuLCBhUmVwbGFjZW1lbnQpKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogU2V0IHRoZSBzb3VyY2UgY29udGVudCBmb3IgYSBzb3VyY2UgZmlsZS4gVGhpcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBTb3VyY2VNYXBHZW5lcmF0b3JcbiAqIGluIHRoZSBzb3VyY2VzQ29udGVudCBmaWVsZC5cbiAqXG4gKiBAcGFyYW0gYVNvdXJjZUZpbGUgVGhlIGZpbGVuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVxuICogQHBhcmFtIGFTb3VyY2VDb250ZW50IFRoZSBjb250ZW50IG9mIHRoZSBzb3VyY2UgZmlsZVxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5zZXRTb3VyY2VDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV9zZXRTb3VyY2VDb250ZW50KGFTb3VyY2VGaWxlLCBhU291cmNlQ29udGVudCkge1xuICAgIHRoaXMuc291cmNlQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhhU291cmNlRmlsZSldID0gYVNvdXJjZUNvbnRlbnQ7XG4gIH07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIFNvdXJjZU5vZGVzLiBUaGUgd2Fsa2luZyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGVhY2hcbiAqIHNvdXJjZSBmaWxlIGNvbnRlbnQgYW5kIGlzIHBhc3NlZCB0aGUgZmlsZW5hbWUgYW5kIHNvdXJjZSBjb250ZW50LlxuICpcbiAqIEBwYXJhbSBhRm4gVGhlIHRyYXZlcnNhbCBmdW5jdGlvbi5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUud2Fsa1NvdXJjZUNvbnRlbnRzID1cbiAgZnVuY3Rpb24gU291cmNlTm9kZV93YWxrU291cmNlQ29udGVudHMoYUZuKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuW2ldW2lzU291cmNlTm9kZV0pIHtcbiAgICAgICAgdGhpcy5jaGlsZHJlbltpXS53YWxrU291cmNlQ29udGVudHMoYUZuKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc291cmNlcyA9IE9iamVjdC5rZXlzKHRoaXMuc291cmNlQ29udGVudHMpO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBhRm4odXRpbC5mcm9tU2V0U3RyaW5nKHNvdXJjZXNbaV0pLCB0aGlzLnNvdXJjZUNvbnRlbnRzW3NvdXJjZXNbaV1dKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZS4gV2Fsa3Mgb3ZlciB0aGUgdHJlZVxuICogYW5kIGNvbmNhdGVuYXRlcyBhbGwgdGhlIHZhcmlvdXMgc25pcHBldHMgdG9nZXRoZXIgdG8gb25lIHN0cmluZy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3RvU3RyaW5nKCkge1xuICB2YXIgc3RyID0gXCJcIjtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHN0ciArPSBjaHVuaztcbiAgfSk7XG4gIHJldHVybiBzdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHNvdXJjZSBub2RlIGFsb25nIHdpdGggYSBzb3VyY2VcbiAqIG1hcC5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUudG9TdHJpbmdXaXRoU291cmNlTWFwID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZ1dpdGhTb3VyY2VNYXAoYUFyZ3MpIHtcbiAgdmFyIGdlbmVyYXRlZCA9IHtcbiAgICBjb2RlOiBcIlwiLFxuICAgIGxpbmU6IDEsXG4gICAgY29sdW1uOiAwXG4gIH07XG4gIHZhciBtYXAgPSBuZXcgU291cmNlTWFwR2VuZXJhdG9yKGFBcmdzKTtcbiAgdmFyIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgdmFyIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdmFyIGxhc3RPcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgdGhpcy53YWxrKGZ1bmN0aW9uIChjaHVuaywgb3JpZ2luYWwpIHtcbiAgICBnZW5lcmF0ZWQuY29kZSArPSBjaHVuaztcbiAgICBpZiAob3JpZ2luYWwuc291cmNlICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmxpbmUgIT09IG51bGxcbiAgICAgICAgJiYgb3JpZ2luYWwuY29sdW1uICE9PSBudWxsKSB7XG4gICAgICBpZihsYXN0T3JpZ2luYWxTb3VyY2UgIT09IG9yaWdpbmFsLnNvdXJjZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsTGluZSAhPT0gb3JpZ2luYWwubGluZVxuICAgICAgICAgfHwgbGFzdE9yaWdpbmFsQ29sdW1uICE9PSBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbE5hbWUgIT09IG9yaWdpbmFsLm5hbWUpIHtcbiAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgIG9yaWdpbmFsOiB7XG4gICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBvcmlnaW5hbC5zb3VyY2U7XG4gICAgICBsYXN0T3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgIGxhc3RPcmlnaW5hbENvbHVtbiA9IG9yaWdpbmFsLmNvbHVtbjtcbiAgICAgIGxhc3RPcmlnaW5hbE5hbWUgPSBvcmlnaW5hbC5uYW1lO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICBtYXAuYWRkTWFwcGluZyh7XG4gICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxhc3RPcmlnaW5hbFNvdXJjZSA9IG51bGw7XG4gICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIGZvciAodmFyIGlkeCA9IDAsIGxlbmd0aCA9IGNodW5rLmxlbmd0aDsgaWR4IDwgbGVuZ3RoOyBpZHgrKykge1xuICAgICAgaWYgKGNodW5rLmNoYXJDb2RlQXQoaWR4KSA9PT0gTkVXTElORV9DT0RFKSB7XG4gICAgICAgIGdlbmVyYXRlZC5saW5lKys7XG4gICAgICAgIGdlbmVyYXRlZC5jb2x1bW4gPSAwO1xuICAgICAgICAvLyBNYXBwaW5ncyBlbmQgYXQgZW9sXG4gICAgICAgIGlmIChpZHggKyAxID09PSBsZW5ndGgpIHtcbiAgICAgICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VNYXBwaW5nQWN0aXZlKSB7XG4gICAgICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICAgICAgc291cmNlOiBvcmlnaW5hbC5zb3VyY2UsXG4gICAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgICBsaW5lOiBvcmlnaW5hbC5saW5lLFxuICAgICAgICAgICAgICBjb2x1bW46IG9yaWdpbmFsLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbmVyYXRlZDoge1xuICAgICAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmFtZTogb3JpZ2luYWwubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uKys7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy53YWxrU291cmNlQ29udGVudHMoZnVuY3Rpb24gKHNvdXJjZUZpbGUsIHNvdXJjZUNvbnRlbnQpIHtcbiAgICBtYXAuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHsgY29kZTogZ2VuZXJhdGVkLmNvZGUsIG1hcDogbWFwIH07XG59O1xuXG5leHBvcnRzLlNvdXJjZU5vZGUgPSBTb3VyY2VOb2RlO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdmFsdWVzIGZyb20gcGFyYW1ldGVyL29wdGlvbnNcbiAqIG9iamVjdHMuXG4gKlxuICogQHBhcmFtIGFyZ3MgVGhlIG9iamVjdCB3ZSBhcmUgZXh0cmFjdGluZyB2YWx1ZXMgZnJvbVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHdlIGFyZSBnZXR0aW5nLlxuICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBBbiBvcHRpb25hbCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmdcbiAqIGZyb20gdGhlIG9iamVjdC4gSWYgdGhpcyBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgcHJvcGVydHkgaXMgbWlzc2luZywgYW5cbiAqIGVycm9yIHdpbGwgYmUgdGhyb3duLlxuICovXG5mdW5jdGlvbiBnZXRBcmcoYUFyZ3MsIGFOYW1lLCBhRGVmYXVsdFZhbHVlKSB7XG4gIGlmIChhTmFtZSBpbiBhQXJncykge1xuICAgIHJldHVybiBhQXJnc1thTmFtZV07XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIHJldHVybiBhRGVmYXVsdFZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYU5hbWUgKyAnXCIgaXMgYSByZXF1aXJlZCBhcmd1bWVudC4nKTtcbiAgfVxufVxuZXhwb3J0cy5nZXRBcmcgPSBnZXRBcmc7XG5cbnZhciB1cmxSZWdleHAgPSAvXig/OihbXFx3K1xcLS5dKyk6KT9cXC9cXC8oPzooXFx3KzpcXHcrKUApPyhbXFx3Li1dKikoPzo6KFxcZCspKT8oLiopJC87XG52YXIgZGF0YVVybFJlZ2V4cCA9IC9eZGF0YTouK1xcLC4rJC87XG5cbmZ1bmN0aW9uIHVybFBhcnNlKGFVcmwpIHtcbiAgdmFyIG1hdGNoID0gYVVybC5tYXRjaCh1cmxSZWdleHApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWU6IG1hdGNoWzFdLFxuICAgIGF1dGg6IG1hdGNoWzJdLFxuICAgIGhvc3Q6IG1hdGNoWzNdLFxuICAgIHBvcnQ6IG1hdGNoWzRdLFxuICAgIHBhdGg6IG1hdGNoWzVdXG4gIH07XG59XG5leHBvcnRzLnVybFBhcnNlID0gdXJsUGFyc2U7XG5cbmZ1bmN0aW9uIHVybEdlbmVyYXRlKGFQYXJzZWRVcmwpIHtcbiAgdmFyIHVybCA9ICcnO1xuICBpZiAoYVBhcnNlZFVybC5zY2hlbWUpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5zY2hlbWUgKyAnOic7XG4gIH1cbiAgdXJsICs9ICcvLyc7XG4gIGlmIChhUGFyc2VkVXJsLmF1dGgpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5hdXRoICsgJ0AnO1xuICB9XG4gIGlmIChhUGFyc2VkVXJsLmhvc3QpIHtcbiAgICB1cmwgKz0gYVBhcnNlZFVybC5ob3N0O1xuICB9XG4gIGlmIChhUGFyc2VkVXJsLnBvcnQpIHtcbiAgICB1cmwgKz0gXCI6XCIgKyBhUGFyc2VkVXJsLnBvcnRcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5wYXRoKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwucGF0aDtcbiAgfVxuICByZXR1cm4gdXJsO1xufVxuZXhwb3J0cy51cmxHZW5lcmF0ZSA9IHVybEdlbmVyYXRlO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBwYXRoLCBvciB0aGUgcGF0aCBwb3J0aW9uIG9mIGEgVVJMOlxuICpcbiAqIC0gUmVwbGFjZXMgY29uc2VjdXRpdmUgc2xhc2hlcyB3aXRoIG9uZSBzbGFzaC5cbiAqIC0gUmVtb3ZlcyB1bm5lY2Vzc2FyeSAnLicgcGFydHMuXG4gKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJzxkaXI+Ly4uJyBwYXJ0cy5cbiAqXG4gKiBCYXNlZCBvbiBjb2RlIGluIHRoZSBOb2RlLmpzICdwYXRoJyBjb3JlIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgdXJsIHRvIG5vcm1hbGl6ZS5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplKGFQYXRoKSB7XG4gIHZhciBwYXRoID0gYVBhdGg7XG4gIHZhciB1cmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gIGlmICh1cmwpIHtcbiAgICBpZiAoIXVybC5wYXRoKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuICAgIHBhdGggPSB1cmwucGF0aDtcbiAgfVxuICB2YXIgaXNBYnNvbHV0ZSA9IGV4cG9ydHMuaXNBYnNvbHV0ZShwYXRoKTtcblxuICB2YXIgcGFydHMgPSBwYXRoLnNwbGl0KC9cXC8rLyk7XG4gIGZvciAodmFyIHBhcnQsIHVwID0gMCwgaSA9IHBhcnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgcGFydCA9IHBhcnRzW2ldO1xuICAgIGlmIChwYXJ0ID09PSAnLicpIHtcbiAgICAgIHBhcnRzLnNwbGljZShpLCAxKTtcbiAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHtcbiAgICAgIHVwKys7XG4gICAgfSBlbHNlIGlmICh1cCA+IDApIHtcbiAgICAgIGlmIChwYXJ0ID09PSAnJykge1xuICAgICAgICAvLyBUaGUgZmlyc3QgcGFydCBpcyBibGFuayBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZS4gVHJ5aW5nIHRvIGdvXG4gICAgICAgIC8vIGFib3ZlIHRoZSByb290IGlzIGEgbm8tb3AuIFRoZXJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGFsbCAnLi4nIHBhcnRzXG4gICAgICAgIC8vIGRpcmVjdGx5IGFmdGVyIHRoZSByb290LlxuICAgICAgICBwYXJ0cy5zcGxpY2UoaSArIDEsIHVwKTtcbiAgICAgICAgdXAgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFydHMuc3BsaWNlKGksIDIpO1xuICAgICAgICB1cC0tO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBwYXRoID0gcGFydHMuam9pbignLycpO1xuXG4gIGlmIChwYXRoID09PSAnJykge1xuICAgIHBhdGggPSBpc0Fic29sdXRlID8gJy8nIDogJy4nO1xuICB9XG5cbiAgaWYgKHVybCkge1xuICAgIHVybC5wYXRoID0gcGF0aDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUodXJsKTtcbiAgfVxuICByZXR1cm4gcGF0aDtcbn1cbmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplO1xuXG4vKipcbiAqIEpvaW5zIHR3byBwYXRocy9VUkxzLlxuICpcbiAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgam9pbmVkIHdpdGggdGhlIHJvb3QuXG4gKlxuICogLSBJZiBhUGF0aCBpcyBhIFVSTCBvciBhIGRhdGEgVVJJLCBhUGF0aCBpcyByZXR1cm5lZCwgdW5sZXNzIGFQYXRoIGlzIGFcbiAqICAgc2NoZW1lLXJlbGF0aXZlIFVSTDogVGhlbiB0aGUgc2NoZW1lIG9mIGFSb290LCBpZiBhbnksIGlzIHByZXBlbmRlZFxuICogICBmaXJzdC5cbiAqIC0gT3RoZXJ3aXNlIGFQYXRoIGlzIGEgcGF0aC4gSWYgYVJvb3QgaXMgYSBVUkwsIHRoZW4gaXRzIHBhdGggcG9ydGlvblxuICogICBpcyB1cGRhdGVkIHdpdGggdGhlIHJlc3VsdCBhbmQgYVJvb3QgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgcmVzdWx0XG4gKiAgIGlzIHJldHVybmVkLlxuICogICAtIElmIGFQYXRoIGlzIGFic29sdXRlLCB0aGUgcmVzdWx0IGlzIGFQYXRoLlxuICogICAtIE90aGVyd2lzZSB0aGUgdHdvIHBhdGhzIGFyZSBqb2luZWQgd2l0aCBhIHNsYXNoLlxuICogLSBKb2luaW5nIGZvciBleGFtcGxlICdodHRwOi8vJyBhbmQgJ3d3dy5leGFtcGxlLmNvbScgaXMgYWxzbyBzdXBwb3J0ZWQuXG4gKi9cbmZ1bmN0aW9uIGpvaW4oYVJvb3QsIGFQYXRoKSB7XG4gIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgIGFSb290ID0gXCIuXCI7XG4gIH1cbiAgaWYgKGFQYXRoID09PSBcIlwiKSB7XG4gICAgYVBhdGggPSBcIi5cIjtcbiAgfVxuICB2YXIgYVBhdGhVcmwgPSB1cmxQYXJzZShhUGF0aCk7XG4gIHZhciBhUm9vdFVybCA9IHVybFBhcnNlKGFSb290KTtcbiAgaWYgKGFSb290VXJsKSB7XG4gICAgYVJvb3QgPSBhUm9vdFVybC5wYXRoIHx8ICcvJztcbiAgfVxuXG4gIC8vIGBqb2luKGZvbywgJy8vd3d3LmV4YW1wbGUub3JnJylgXG4gIGlmIChhUGF0aFVybCAmJiAhYVBhdGhVcmwuc2NoZW1lKSB7XG4gICAgaWYgKGFSb290VXJsKSB7XG4gICAgICBhUGF0aFVybC5zY2hlbWUgPSBhUm9vdFVybC5zY2hlbWU7XG4gICAgfVxuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUGF0aFVybCk7XG4gIH1cblxuICBpZiAoYVBhdGhVcmwgfHwgYVBhdGgubWF0Y2goZGF0YVVybFJlZ2V4cCkpIHtcbiAgICByZXR1cm4gYVBhdGg7XG4gIH1cblxuICAvLyBgam9pbignaHR0cDovLycsICd3d3cuZXhhbXBsZS5jb20nKWBcbiAgaWYgKGFSb290VXJsICYmICFhUm9vdFVybC5ob3N0ICYmICFhUm9vdFVybC5wYXRoKSB7XG4gICAgYVJvb3RVcmwuaG9zdCA9IGFQYXRoO1xuICAgIHJldHVybiB1cmxHZW5lcmF0ZShhUm9vdFVybCk7XG4gIH1cblxuICB2YXIgam9pbmVkID0gYVBhdGguY2hhckF0KDApID09PSAnLydcbiAgICA/IGFQYXRoXG4gICAgOiBub3JtYWxpemUoYVJvb3QucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyBhUGF0aCk7XG5cbiAgaWYgKGFSb290VXJsKSB7XG4gICAgYVJvb3RVcmwucGF0aCA9IGpvaW5lZDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICB9XG4gIHJldHVybiBqb2luZWQ7XG59XG5leHBvcnRzLmpvaW4gPSBqb2luO1xuXG5leHBvcnRzLmlzQWJzb2x1dGUgPSBmdW5jdGlvbiAoYVBhdGgpIHtcbiAgcmV0dXJuIGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nIHx8IHVybFJlZ2V4cC50ZXN0KGFQYXRoKTtcbn07XG5cbi8qKlxuICogTWFrZSBhIHBhdGggcmVsYXRpdmUgdG8gYSBVUkwgb3IgYW5vdGhlciBwYXRoLlxuICpcbiAqIEBwYXJhbSBhUm9vdCBUaGUgcm9vdCBwYXRoIG9yIFVSTC5cbiAqIEBwYXJhbSBhUGF0aCBUaGUgcGF0aCBvciBVUkwgdG8gYmUgbWFkZSByZWxhdGl2ZSB0byBhUm9vdC5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpdmUoYVJvb3QsIGFQYXRoKSB7XG4gIGlmIChhUm9vdCA9PT0gXCJcIikge1xuICAgIGFSb290ID0gXCIuXCI7XG4gIH1cblxuICBhUm9vdCA9IGFSb290LnJlcGxhY2UoL1xcLyQvLCAnJyk7XG5cbiAgLy8gSXQgaXMgcG9zc2libGUgZm9yIHRoZSBwYXRoIHRvIGJlIGFib3ZlIHRoZSByb290LiBJbiB0aGlzIGNhc2UsIHNpbXBseVxuICAvLyBjaGVja2luZyB3aGV0aGVyIHRoZSByb290IGlzIGEgcHJlZml4IG9mIHRoZSBwYXRoIHdvbid0IHdvcmsuIEluc3RlYWQsIHdlXG4gIC8vIG5lZWQgdG8gcmVtb3ZlIGNvbXBvbmVudHMgZnJvbSB0aGUgcm9vdCBvbmUgYnkgb25lLCB1bnRpbCBlaXRoZXIgd2UgZmluZFxuICAvLyBhIHByZWZpeCB0aGF0IGZpdHMsIG9yIHdlIHJ1biBvdXQgb2YgY29tcG9uZW50cyB0byByZW1vdmUuXG4gIHZhciBsZXZlbCA9IDA7XG4gIHdoaWxlIChhUGF0aC5pbmRleE9mKGFSb290ICsgJy8nKSAhPT0gMCkge1xuICAgIHZhciBpbmRleCA9IGFSb290Lmxhc3RJbmRleE9mKFwiL1wiKTtcbiAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gYVBhdGg7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIG9ubHkgcGFydCBvZiB0aGUgcm9vdCB0aGF0IGlzIGxlZnQgaXMgdGhlIHNjaGVtZSAoaS5lLiBodHRwOi8vLFxuICAgIC8vIGZpbGU6Ly8vLCBldGMuKSwgb25lIG9yIG1vcmUgc2xhc2hlcyAoLyksIG9yIHNpbXBseSBub3RoaW5nIGF0IGFsbCwgd2VcbiAgICAvLyBoYXZlIGV4aGF1c3RlZCBhbGwgY29tcG9uZW50cywgc28gdGhlIHBhdGggaXMgbm90IHJlbGF0aXZlIHRvIHRoZSByb290LlxuICAgIGFSb290ID0gYVJvb3Quc2xpY2UoMCwgaW5kZXgpO1xuICAgIGlmIChhUm9vdC5tYXRjaCgvXihbXlxcL10rOlxcLyk/XFwvKiQvKSkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cblxuICAgICsrbGV2ZWw7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgd2UgYWRkIGEgXCIuLi9cIiBmb3IgZWFjaCBjb21wb25lbnQgd2UgcmVtb3ZlZCBmcm9tIHRoZSByb290LlxuICByZXR1cm4gQXJyYXkobGV2ZWwgKyAxKS5qb2luKFwiLi4vXCIpICsgYVBhdGguc3Vic3RyKGFSb290Lmxlbmd0aCArIDEpO1xufVxuZXhwb3J0cy5yZWxhdGl2ZSA9IHJlbGF0aXZlO1xuXG52YXIgc3VwcG9ydHNOdWxsUHJvdG8gPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuICEoJ19fcHJvdG9fXycgaW4gb2JqKTtcbn0oKSk7XG5cbmZ1bmN0aW9uIGlkZW50aXR5IChzKSB7XG4gIHJldHVybiBzO1xufVxuXG4vKipcbiAqIEJlY2F1c2UgYmVoYXZpb3IgZ29lcyB3YWNreSB3aGVuIHlvdSBzZXQgYF9fcHJvdG9fX2Agb24gb2JqZWN0cywgd2VcbiAqIGhhdmUgdG8gcHJlZml4IGFsbCB0aGUgc3RyaW5ncyBpbiBvdXIgc2V0IHdpdGggYW4gYXJiaXRyYXJ5IGNoYXJhY3Rlci5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9wdWxsLzMxIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21vemlsbGEvc291cmNlLW1hcC9pc3N1ZXMvMzBcbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuZnVuY3Rpb24gdG9TZXRTdHJpbmcoYVN0cikge1xuICBpZiAoaXNQcm90b1N0cmluZyhhU3RyKSkge1xuICAgIHJldHVybiAnJCcgKyBhU3RyO1xuICB9XG5cbiAgcmV0dXJuIGFTdHI7XG59XG5leHBvcnRzLnRvU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IHRvU2V0U3RyaW5nO1xuXG5mdW5jdGlvbiBmcm9tU2V0U3RyaW5nKGFTdHIpIHtcbiAgaWYgKGlzUHJvdG9TdHJpbmcoYVN0cikpIHtcbiAgICByZXR1cm4gYVN0ci5zbGljZSgxKTtcbiAgfVxuXG4gIHJldHVybiBhU3RyO1xufVxuZXhwb3J0cy5mcm9tU2V0U3RyaW5nID0gc3VwcG9ydHNOdWxsUHJvdG8gPyBpZGVudGl0eSA6IGZyb21TZXRTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzUHJvdG9TdHJpbmcocykge1xuICBpZiAoIXMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgbGVuZ3RoID0gcy5sZW5ndGg7XG5cbiAgaWYgKGxlbmd0aCA8IDkgLyogXCJfX3Byb3RvX19cIi5sZW5ndGggKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAocy5jaGFyQ29kZUF0KGxlbmd0aCAtIDEpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMikgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSAzKSAhPT0gMTExIC8qICdvJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDQpICE9PSAxMTYgLyogJ3QnICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNSkgIT09IDExMSAvKiAnbycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA2KSAhPT0gMTE0IC8qICdyJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDcpICE9PSAxMTIgLyogJ3AnICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gOCkgIT09IDk1ICAvKiAnXycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA5KSAhPT0gOTUgIC8qICdfJyAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSBsZW5ndGggLSAxMDsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAocy5jaGFyQ29kZUF0KGkpICE9PSAzNiAvKiAnJCcgKi8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdoZXJlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgb3JpZ2luYWwgc291cmNlL2xpbmUvY29sdW1uLCBidXQgZGlmZmVyZW50IGdlbmVyYXRlZFxuICogbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGEgbWFwcGluZyB3aXRoIGFcbiAqIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICB2YXIgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZU9yaWdpbmFsKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyA9IGNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zO1xuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBkZWZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgaW5kaWNlcyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICpcbiAqIE9wdGlvbmFsbHkgcGFzcyBpbiBgdHJ1ZWAgYXMgYG9ubHlDb21wYXJlR2VuZXJhdGVkYCB0byBjb25zaWRlciB0d29cbiAqIG1hcHBpbmdzIHdpdGggdGhlIHNhbWUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiwgYnV0IGRpZmZlcmVudFxuICogc291cmNlL25hbWUvb3JpZ2luYWwgbGluZSBhbmQgY29sdW1uIHRoZSBzYW1lLiBVc2VmdWwgd2hlbiBzZWFyY2hpbmcgZm9yIGFcbiAqIG1hcHBpbmcgd2l0aCBhIHN0dWJiZWQgb3V0IG1hcHBpbmcuXG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQiwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCB8fCBvbmx5Q29tcGFyZUdlbmVyYXRlZCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQ7XG5cbmZ1bmN0aW9uIHN0cmNtcChhU3RyMSwgYVN0cjIpIHtcbiAgaWYgKGFTdHIxID09PSBhU3RyMikge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKGFTdHIxID09PSBudWxsKSB7XG4gICAgcmV0dXJuIDE7IC8vIGFTdHIyICE9PSBudWxsXG4gIH1cblxuICBpZiAoYVN0cjIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gLTE7IC8vIGFTdHIxICE9PSBudWxsXG4gIH1cblxuICBpZiAoYVN0cjEgPiBhU3RyMikge1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgcmV0dXJuIC0xO1xufVxuXG4vKipcbiAqIENvbXBhcmF0b3IgYmV0d2VlbiB0d28gbWFwcGluZ3Mgd2l0aCBpbmZsYXRlZCBzb3VyY2UgYW5kIG5hbWUgc3RyaW5ncyB3aGVyZVxuICogdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMgYXJlIGNvbXBhcmVkLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IpIHtcbiAgdmFyIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmUgLSBtYXBwaW5nQi5nZW5lcmF0ZWRMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLmdlbmVyYXRlZENvbHVtbiAtIG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBzdHJjbXAobWFwcGluZ0Euc291cmNlLCBtYXBwaW5nQi5zb3VyY2UpO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsTGluZSAtIG1hcHBpbmdCLm9yaWdpbmFsTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbENvbHVtbiAtIG1hcHBpbmdCLm9yaWdpbmFsQ29sdW1uO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIHJldHVybiBzdHJjbXAobWFwcGluZ0EubmFtZSwgbWFwcGluZ0IubmFtZSk7XG59XG5leHBvcnRzLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkID0gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQ7XG5cbi8qKlxuICogU3RyaXAgYW55IEpTT04gWFNTSSBhdm9pZGFuY2UgcHJlZml4IGZyb20gdGhlIHN0cmluZyAoYXMgZG9jdW1lbnRlZFxuICogaW4gdGhlIHNvdXJjZSBtYXBzIHNwZWNpZmljYXRpb24pLCBhbmQgdGhlbiBwYXJzZSB0aGUgc3RyaW5nIGFzXG4gKiBKU09OLlxuICovXG5mdW5jdGlvbiBwYXJzZVNvdXJjZU1hcElucHV0KHN0cikge1xuICByZXR1cm4gSlNPTi5wYXJzZShzdHIucmVwbGFjZSgvXlxcKV19J1teXFxuXSpcXG4vLCAnJykpO1xufVxuZXhwb3J0cy5wYXJzZVNvdXJjZU1hcElucHV0ID0gcGFyc2VTb3VyY2VNYXBJbnB1dDtcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBVUkwgb2YgYSBzb3VyY2UgZ2l2ZW4gdGhlIHRoZSBzb3VyY2Ugcm9vdCwgdGhlIHNvdXJjZSdzXG4gKiBVUkwsIGFuZCB0aGUgc291cmNlIG1hcCdzIFVSTC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzb3VyY2VVUkwsIHNvdXJjZU1hcFVSTCkge1xuICBzb3VyY2VVUkwgPSBzb3VyY2VVUkwgfHwgJyc7XG5cbiAgaWYgKHNvdXJjZVJvb3QpIHtcbiAgICAvLyBUaGlzIGZvbGxvd3Mgd2hhdCBDaHJvbWUgZG9lcy5cbiAgICBpZiAoc291cmNlUm9vdFtzb3VyY2VSb290Lmxlbmd0aCAtIDFdICE9PSAnLycgJiYgc291cmNlVVJMWzBdICE9PSAnLycpIHtcbiAgICAgIHNvdXJjZVJvb3QgKz0gJy8nO1xuICAgIH1cbiAgICAvLyBUaGUgc3BlYyBzYXlzOlxuICAgIC8vICAgTGluZSA0OiBBbiBvcHRpb25hbCBzb3VyY2Ugcm9vdCwgdXNlZnVsIGZvciByZWxvY2F0aW5nIHNvdXJjZVxuICAgIC8vICAgZmlsZXMgb24gYSBzZXJ2ZXIgb3IgcmVtb3ZpbmcgcmVwZWF0ZWQgdmFsdWVzIGluIHRoZVxuICAgIC8vICAg4oCcc291cmNlc+KAnSBlbnRyeS4gIFRoaXMgdmFsdWUgaXMgcHJlcGVuZGVkIHRvIHRoZSBpbmRpdmlkdWFsXG4gICAgLy8gICBlbnRyaWVzIGluIHRoZSDigJxzb3VyY2XigJ0gZmllbGQuXG4gICAgc291cmNlVVJMID0gc291cmNlUm9vdCArIHNvdXJjZVVSTDtcbiAgfVxuXG4gIC8vIEhpc3RvcmljYWxseSwgU291cmNlTWFwQ29uc3VtZXIgZGlkIG5vdCB0YWtlIHRoZSBzb3VyY2VNYXBVUkwgYXNcbiAgLy8gYSBwYXJhbWV0ZXIuICBUaGlzIG1vZGUgaXMgc3RpbGwgc29tZXdoYXQgc3VwcG9ydGVkLCB3aGljaCBpcyB3aHlcbiAgLy8gdGhpcyBjb2RlIGJsb2NrIGlzIGNvbmRpdGlvbmFsLiAgSG93ZXZlciwgaXQncyBwcmVmZXJhYmxlIHRvIHBhc3NcbiAgLy8gdGhlIHNvdXJjZSBtYXAgVVJMIHRvIFNvdXJjZU1hcENvbnN1bWVyLCBzbyB0aGF0IHRoaXMgZnVuY3Rpb25cbiAgLy8gY2FuIGltcGxlbWVudCB0aGUgc291cmNlIFVSTCByZXNvbHV0aW9uIGFsZ29yaXRobSBhcyBvdXRsaW5lZCBpblxuICAvLyB0aGUgc3BlYy4gIFRoaXMgYmxvY2sgaXMgYmFzaWNhbGx5IHRoZSBlcXVpdmFsZW50IG9mOlxuICAvLyAgICBuZXcgVVJMKHNvdXJjZVVSTCwgc291cmNlTWFwVVJMKS50b1N0cmluZygpXG4gIC8vIC4uLiBleGNlcHQgaXQgYXZvaWRzIHVzaW5nIFVSTCwgd2hpY2ggd2Fzbid0IGF2YWlsYWJsZSBpbiB0aGVcbiAgLy8gb2xkZXIgcmVsZWFzZXMgb2Ygbm9kZSBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5LlxuICAvL1xuICAvLyBUaGUgc3BlYyBzYXlzOlxuICAvLyAgIElmIHRoZSBzb3VyY2VzIGFyZSBub3QgYWJzb2x1dGUgVVJMcyBhZnRlciBwcmVwZW5kaW5nIG9mIHRoZVxuICAvLyAgIOKAnHNvdXJjZVJvb3TigJ0sIHRoZSBzb3VyY2VzIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGVcbiAgLy8gICBTb3VyY2VNYXAgKGxpa2UgcmVzb2x2aW5nIHNjcmlwdCBzcmMgaW4gYSBodG1sIGRvY3VtZW50KS5cbiAgaWYgKHNvdXJjZU1hcFVSTCkge1xuICAgIHZhciBwYXJzZWQgPSB1cmxQYXJzZShzb3VyY2VNYXBVUkwpO1xuICAgIGlmICghcGFyc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzb3VyY2VNYXBVUkwgY291bGQgbm90IGJlIHBhcnNlZFwiKTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5wYXRoKSB7XG4gICAgICAvLyBTdHJpcCB0aGUgbGFzdCBwYXRoIGNvbXBvbmVudCwgYnV0IGtlZXAgdGhlIFwiL1wiLlxuICAgICAgdmFyIGluZGV4ID0gcGFyc2VkLnBhdGgubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHBhcnNlZC5wYXRoID0gcGFyc2VkLnBhdGguc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNvdXJjZVVSTCA9IGpvaW4odXJsR2VuZXJhdGUocGFyc2VkKSwgc291cmNlVVJMKTtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemUoc291cmNlVVJMKTtcbn1cbmV4cG9ydHMuY29tcHV0ZVNvdXJjZVVSTCA9IGNvbXB1dGVTb3VyY2VVUkw7XG4iLCIvKlxuICogQ29weXJpZ2h0IDIwMDktMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0UudHh0IG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5leHBvcnRzLlNvdXJjZU1hcEdlbmVyYXRvciA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1tYXAtZ2VuZXJhdG9yJykuU291cmNlTWFwR2VuZXJhdG9yO1xuZXhwb3J0cy5Tb3VyY2VNYXBDb25zdW1lciA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1tYXAtY29uc3VtZXInKS5Tb3VyY2VNYXBDb25zdW1lcjtcbmV4cG9ydHMuU291cmNlTm9kZSA9IHJlcXVpcmUoJy4vbGliL3NvdXJjZS1ub2RlJykuU291cmNlTm9kZTtcbiIsInJlcXVpcmUoJy4vJykuaW5zdGFsbCgpO1xuIiwidmFyIFNvdXJjZU1hcENvbnN1bWVyID0gcmVxdWlyZSgnc291cmNlLW1hcCcpLlNvdXJjZU1hcENvbnN1bWVyO1xudmFyIHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbnZhciBmcztcbnRyeSB7XG4gIGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jIHx8ICFmcy5yZWFkRmlsZVN5bmMpIHtcbiAgICAvLyBmcyBkb2Vzbid0IGhhdmUgYWxsIG1ldGhvZHMgd2UgbmVlZFxuICAgIGZzID0gbnVsbDtcbiAgfVxufSBjYXRjaCAoZXJyKSB7XG4gIC8qIG5vcCAqL1xufVxuXG52YXIgYnVmZmVyRnJvbSA9IHJlcXVpcmUoJ2J1ZmZlci1mcm9tJyk7XG5cbi8qKlxuICogUmVxdWlyZXMgYSBtb2R1bGUgd2hpY2ggaXMgcHJvdGVjdGVkIGFnYWluc3QgYnVuZGxlciBtaW5pZmljYXRpb24uXG4gKlxuICogQHBhcmFtIHtOb2RlTW9kdWxlfSBtb2RcbiAqIEBwYXJhbSB7c3RyaW5nfSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGR5bmFtaWNSZXF1aXJlKG1vZCwgcmVxdWVzdCkge1xuICByZXR1cm4gbW9kLnJlcXVpcmUocmVxdWVzdCk7XG59XG5cbi8vIE9ubHkgaW5zdGFsbCBvbmNlIGlmIGNhbGxlZCBtdWx0aXBsZSB0aW1lc1xudmFyIGVycm9yRm9ybWF0dGVySW5zdGFsbGVkID0gZmFsc2U7XG52YXIgdW5jYXVnaHRTaGltSW5zdGFsbGVkID0gZmFsc2U7XG5cbi8vIElmIHRydWUsIHRoZSBjYWNoZXMgYXJlIHJlc2V0IGJlZm9yZSBhIHN0YWNrIHRyYWNlIGZvcm1hdHRpbmcgb3BlcmF0aW9uXG52YXIgZW1wdHlDYWNoZUJldHdlZW5PcGVyYXRpb25zID0gZmFsc2U7XG5cbi8vIFN1cHBvcnRzIHticm93c2VyLCBub2RlLCBhdXRvfVxudmFyIGVudmlyb25tZW50ID0gXCJhdXRvXCI7XG5cbi8vIE1hcHMgYSBmaWxlIHBhdGggdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZSBjb250ZW50c1xudmFyIGZpbGVDb250ZW50c0NhY2hlID0ge307XG5cbi8vIE1hcHMgYSBmaWxlIHBhdGggdG8gYSBzb3VyY2UgbWFwIGZvciB0aGF0IGZpbGVcbnZhciBzb3VyY2VNYXBDYWNoZSA9IHt9O1xuXG4vLyBSZWdleCBmb3IgZGV0ZWN0aW5nIHNvdXJjZSBtYXBzXG52YXIgcmVTb3VyY2VNYXAgPSAvXmRhdGE6YXBwbGljYXRpb25cXC9qc29uW14sXStiYXNlNjQsLztcblxuLy8gUHJpb3JpdHkgbGlzdCBvZiByZXRyaWV2ZSBoYW5kbGVyc1xudmFyIHJldHJpZXZlRmlsZUhhbmRsZXJzID0gW107XG52YXIgcmV0cmlldmVNYXBIYW5kbGVycyA9IFtdO1xuXG5mdW5jdGlvbiBpc0luQnJvd3NlcigpIHtcbiAgaWYgKGVudmlyb25tZW50ID09PSBcImJyb3dzZXJcIilcbiAgICByZXR1cm4gdHJ1ZTtcbiAgaWYgKGVudmlyb25tZW50ID09PSBcIm5vZGVcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAoKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFhNTEh0dHBSZXF1ZXN0ID09PSAnZnVuY3Rpb24nKSAmJiAhKHdpbmRvdy5yZXF1aXJlICYmIHdpbmRvdy5tb2R1bGUgJiYgd2luZG93LnByb2Nlc3MgJiYgd2luZG93LnByb2Nlc3MudHlwZSA9PT0gXCJyZW5kZXJlclwiKSk7XG59XG5cbmZ1bmN0aW9uIGhhc0dsb2JhbFByb2Nlc3NFdmVudEVtaXR0ZXIoKSB7XG4gIHJldHVybiAoKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JykgJiYgKHByb2Nlc3MgIT09IG51bGwpICYmICh0eXBlb2YgcHJvY2Vzcy5vbiA9PT0gJ2Z1bmN0aW9uJykpO1xufVxuXG5mdW5jdGlvbiBnbG9iYWxQcm9jZXNzVmVyc2lvbigpIHtcbiAgaWYgKCh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcpICYmIChwcm9jZXNzICE9PSBudWxsKSkge1xuICAgIHJldHVybiBwcm9jZXNzLnZlcnNpb247XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdsb2JhbFByb2Nlc3NTdGRlcnIoKSB7XG4gIGlmICgodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnKSAmJiAocHJvY2VzcyAhPT0gbnVsbCkpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2xvYmFsUHJvY2Vzc0V4aXQoY29kZSkge1xuICBpZiAoKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JykgJiYgKHByb2Nlc3MgIT09IG51bGwpICYmICh0eXBlb2YgcHJvY2Vzcy5leGl0ID09PSAnZnVuY3Rpb24nKSkge1xuICAgIHJldHVybiBwcm9jZXNzLmV4aXQoY29kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlckV4ZWMobGlzdCkge1xuICByZXR1cm4gZnVuY3Rpb24oYXJnKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcmV0ID0gbGlzdFtpXShhcmcpO1xuICAgICAgaWYgKHJldCkge1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbn1cblxudmFyIHJldHJpZXZlRmlsZSA9IGhhbmRsZXJFeGVjKHJldHJpZXZlRmlsZUhhbmRsZXJzKTtcblxucmV0cmlldmVGaWxlSGFuZGxlcnMucHVzaChmdW5jdGlvbihwYXRoKSB7XG4gIC8vIFRyaW0gdGhlIHBhdGggdG8gbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGV4dHJhIHdoaXRlc3BhY2UuXG4gIHBhdGggPSBwYXRoLnRyaW0oKTtcbiAgaWYgKC9eZmlsZTovLnRlc3QocGF0aCkpIHtcbiAgICAvLyBleGlzdHNTeW5jL3JlYWRGaWxlU3luYyBjYW4ndCBoYW5kbGUgZmlsZSBwcm90b2NvbCwgYnV0IG9uY2Ugc3RyaXBwZWQsIGl0IHdvcmtzXG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvZmlsZTpcXC9cXC9cXC8oXFx3Oik/LywgZnVuY3Rpb24ocHJvdG9jb2wsIGRyaXZlKSB7XG4gICAgICByZXR1cm4gZHJpdmUgP1xuICAgICAgICAnJyA6IC8vIGZpbGU6Ly8vQzovZGlyL2ZpbGUgLT4gQzovZGlyL2ZpbGVcbiAgICAgICAgJy8nOyAvLyBmaWxlOi8vL3Jvb3QtZGlyL2ZpbGUgLT4gL3Jvb3QtZGlyL2ZpbGVcbiAgICB9KTtcbiAgfVxuICBpZiAocGF0aCBpbiBmaWxlQ29udGVudHNDYWNoZSkge1xuICAgIHJldHVybiBmaWxlQ29udGVudHNDYWNoZVtwYXRoXTtcbiAgfVxuXG4gIHZhciBjb250ZW50cyA9ICcnO1xuICB0cnkge1xuICAgIGlmICghZnMpIHtcbiAgICAgIC8vIFVzZSBTSkFYIGlmIHdlIGFyZSBpbiB0aGUgYnJvd3NlclxuICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgeGhyLm9wZW4oJ0dFVCcsIHBhdGgsIC8qKiBhc3luYyAqLyBmYWxzZSk7XG4gICAgICB4aHIuc2VuZChudWxsKTtcbiAgICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PT0gNCAmJiB4aHIuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgY29udGVudHMgPSB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZnMuZXhpc3RzU3luYyhwYXRoKSkge1xuICAgICAgLy8gT3RoZXJ3aXNlLCB1c2UgdGhlIGZpbGVzeXN0ZW1cbiAgICAgIGNvbnRlbnRzID0gZnMucmVhZEZpbGVTeW5jKHBhdGgsICd1dGY4Jyk7XG4gICAgfVxuICB9IGNhdGNoIChlcikge1xuICAgIC8qIGlnbm9yZSBhbnkgZXJyb3JzICovXG4gIH1cblxuICByZXR1cm4gZmlsZUNvbnRlbnRzQ2FjaGVbcGF0aF0gPSBjb250ZW50cztcbn0pO1xuXG4vLyBTdXBwb3J0IFVSTHMgcmVsYXRpdmUgdG8gYSBkaXJlY3RvcnksIGJ1dCBiZSBjYXJlZnVsIGFib3V0IGEgcHJvdG9jb2wgcHJlZml4XG4vLyBpbiBjYXNlIHdlIGFyZSBpbiB0aGUgYnJvd3NlciAoaS5lLiBkaXJlY3RvcmllcyBtYXkgc3RhcnQgd2l0aCBcImh0dHA6Ly9cIiBvciBcImZpbGU6Ly8vXCIpXG5mdW5jdGlvbiBzdXBwb3J0UmVsYXRpdmVVUkwoZmlsZSwgdXJsKSB7XG4gIGlmICghZmlsZSkgcmV0dXJuIHVybDtcbiAgdmFyIGRpciA9IHBhdGguZGlybmFtZShmaWxlKTtcbiAgdmFyIG1hdGNoID0gL15cXHcrOlxcL1xcL1teXFwvXSovLmV4ZWMoZGlyKTtcbiAgdmFyIHByb3RvY29sID0gbWF0Y2ggPyBtYXRjaFswXSA6ICcnO1xuICB2YXIgc3RhcnRQYXRoID0gZGlyLnNsaWNlKHByb3RvY29sLmxlbmd0aCk7XG4gIGlmIChwcm90b2NvbCAmJiAvXlxcL1xcd1xcOi8udGVzdChzdGFydFBhdGgpKSB7XG4gICAgLy8gaGFuZGxlIGZpbGU6Ly8vQzovIHBhdGhzXG4gICAgcHJvdG9jb2wgKz0gJy8nO1xuICAgIHJldHVybiBwcm90b2NvbCArIHBhdGgucmVzb2x2ZShkaXIuc2xpY2UocHJvdG9jb2wubGVuZ3RoKSwgdXJsKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gIH1cbiAgcmV0dXJuIHByb3RvY29sICsgcGF0aC5yZXNvbHZlKGRpci5zbGljZShwcm90b2NvbC5sZW5ndGgpLCB1cmwpO1xufVxuXG5mdW5jdGlvbiByZXRyaWV2ZVNvdXJjZU1hcFVSTChzb3VyY2UpIHtcbiAgdmFyIGZpbGVEYXRhO1xuXG4gIGlmIChpc0luQnJvd3NlcigpKSB7XG4gICAgIHRyeSB7XG4gICAgICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgIHhoci5vcGVuKCdHRVQnLCBzb3VyY2UsIGZhbHNlKTtcbiAgICAgICB4aHIuc2VuZChudWxsKTtcbiAgICAgICBmaWxlRGF0YSA9IHhoci5yZWFkeVN0YXRlID09PSA0ID8geGhyLnJlc3BvbnNlVGV4dCA6IG51bGw7XG5cbiAgICAgICAvLyBTdXBwb3J0IHByb3ZpZGluZyBhIHNvdXJjZU1hcHBpbmdVUkwgdmlhIHRoZSBTb3VyY2VNYXAgaGVhZGVyXG4gICAgICAgdmFyIHNvdXJjZU1hcEhlYWRlciA9IHhoci5nZXRSZXNwb25zZUhlYWRlcihcIlNvdXJjZU1hcFwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJYLVNvdXJjZU1hcFwiKTtcbiAgICAgICBpZiAoc291cmNlTWFwSGVhZGVyKSB7XG4gICAgICAgICByZXR1cm4gc291cmNlTWFwSGVhZGVyO1xuICAgICAgIH1cbiAgICAgfSBjYXRjaCAoZSkge1xuICAgICB9XG4gIH1cblxuICAvLyBHZXQgdGhlIFVSTCBvZiB0aGUgc291cmNlIG1hcFxuICBmaWxlRGF0YSA9IHJldHJpZXZlRmlsZShzb3VyY2UpO1xuICB2YXIgcmUgPSAvKD86XFwvXFwvW0AjXVtcXHNdKnNvdXJjZU1hcHBpbmdVUkw9KFteXFxzJ1wiXSspW1xcc10qJCl8KD86XFwvXFwqW0AjXVtcXHNdKnNvdXJjZU1hcHBpbmdVUkw9KFteXFxzKidcIl0rKVtcXHNdKig/OlxcKlxcLylbXFxzXSokKS9tZztcbiAgLy8gS2VlcCBleGVjdXRpbmcgdGhlIHNlYXJjaCB0byBmaW5kIHRoZSAqbGFzdCogc291cmNlTWFwcGluZ1VSTCB0byBhdm9pZFxuICAvLyBwaWNraW5nIHVwIHNvdXJjZU1hcHBpbmdVUkxzIGZyb20gY29tbWVudHMsIHN0cmluZ3MsIGV0Yy5cbiAgdmFyIGxhc3RNYXRjaCwgbWF0Y2g7XG4gIHdoaWxlIChtYXRjaCA9IHJlLmV4ZWMoZmlsZURhdGEpKSBsYXN0TWF0Y2ggPSBtYXRjaDtcbiAgaWYgKCFsYXN0TWF0Y2gpIHJldHVybiBudWxsO1xuICByZXR1cm4gbGFzdE1hdGNoWzFdO1xufTtcblxuLy8gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIHJldHJpZXZlU291cmNlTWFwIG9wdGlvbiB0byBpbnN0YWxsLiBUYWtlcyBhXG4vLyBnZW5lcmF0ZWQgc291cmNlIGZpbGVuYW1lOyByZXR1cm5zIGEge21hcCwgb3B0aW9uYWwgdXJsfSBvYmplY3QsIG9yIG51bGwgaWZcbi8vIHRoZXJlIGlzIG5vIHNvdXJjZSBtYXAuICBUaGUgbWFwIGZpZWxkIG1heSBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgdGhlIHBhcnNlZFxuLy8gSlNPTiBvYmplY3QgKGllLCBpdCBtdXN0IGJlIGEgdmFsaWQgYXJndW1lbnQgdG8gdGhlIFNvdXJjZU1hcENvbnN1bWVyXG4vLyBjb25zdHJ1Y3RvcikuXG52YXIgcmV0cmlldmVTb3VyY2VNYXAgPSBoYW5kbGVyRXhlYyhyZXRyaWV2ZU1hcEhhbmRsZXJzKTtcbnJldHJpZXZlTWFwSGFuZGxlcnMucHVzaChmdW5jdGlvbihzb3VyY2UpIHtcbiAgdmFyIHNvdXJjZU1hcHBpbmdVUkwgPSByZXRyaWV2ZVNvdXJjZU1hcFVSTChzb3VyY2UpO1xuICBpZiAoIXNvdXJjZU1hcHBpbmdVUkwpIHJldHVybiBudWxsO1xuXG4gIC8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgbWFwXG4gIHZhciBzb3VyY2VNYXBEYXRhO1xuICBpZiAocmVTb3VyY2VNYXAudGVzdChzb3VyY2VNYXBwaW5nVVJMKSkge1xuICAgIC8vIFN1cHBvcnQgc291cmNlIG1hcCBVUkwgYXMgYSBkYXRhIHVybFxuICAgIHZhciByYXdEYXRhID0gc291cmNlTWFwcGluZ1VSTC5zbGljZShzb3VyY2VNYXBwaW5nVVJMLmluZGV4T2YoJywnKSArIDEpO1xuICAgIHNvdXJjZU1hcERhdGEgPSBidWZmZXJGcm9tKHJhd0RhdGEsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKCk7XG4gICAgc291cmNlTWFwcGluZ1VSTCA9IHNvdXJjZTtcbiAgfSBlbHNlIHtcbiAgICAvLyBTdXBwb3J0IHNvdXJjZSBtYXAgVVJMcyByZWxhdGl2ZSB0byB0aGUgc291cmNlIFVSTFxuICAgIHNvdXJjZU1hcHBpbmdVUkwgPSBzdXBwb3J0UmVsYXRpdmVVUkwoc291cmNlLCBzb3VyY2VNYXBwaW5nVVJMKTtcbiAgICBzb3VyY2VNYXBEYXRhID0gcmV0cmlldmVGaWxlKHNvdXJjZU1hcHBpbmdVUkwpO1xuICB9XG5cbiAgaWYgKCFzb3VyY2VNYXBEYXRhKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHVybDogc291cmNlTWFwcGluZ1VSTCxcbiAgICBtYXA6IHNvdXJjZU1hcERhdGFcbiAgfTtcbn0pO1xuXG5mdW5jdGlvbiBtYXBTb3VyY2VQb3NpdGlvbihwb3NpdGlvbikge1xuICB2YXIgc291cmNlTWFwID0gc291cmNlTWFwQ2FjaGVbcG9zaXRpb24uc291cmNlXTtcbiAgaWYgKCFzb3VyY2VNYXApIHtcbiAgICAvLyBDYWxsIHRoZSAob3ZlcnJpZGVhYmxlKSByZXRyaWV2ZVNvdXJjZU1hcCBmdW5jdGlvbiB0byBnZXQgdGhlIHNvdXJjZSBtYXAuXG4gICAgdmFyIHVybEFuZE1hcCA9IHJldHJpZXZlU291cmNlTWFwKHBvc2l0aW9uLnNvdXJjZSk7XG4gICAgaWYgKHVybEFuZE1hcCkge1xuICAgICAgc291cmNlTWFwID0gc291cmNlTWFwQ2FjaGVbcG9zaXRpb24uc291cmNlXSA9IHtcbiAgICAgICAgdXJsOiB1cmxBbmRNYXAudXJsLFxuICAgICAgICBtYXA6IG5ldyBTb3VyY2VNYXBDb25zdW1lcih1cmxBbmRNYXAubWFwKVxuICAgICAgfTtcblxuICAgICAgLy8gTG9hZCBhbGwgc291cmNlcyBzdG9yZWQgaW5saW5lIHdpdGggdGhlIHNvdXJjZSBtYXAgaW50byB0aGUgZmlsZSBjYWNoZVxuICAgICAgLy8gdG8gcHJldGVuZCBsaWtlIHRoZXkgYXJlIGFscmVhZHkgbG9hZGVkLiBUaGV5IG1heSBub3QgZXhpc3Qgb24gZGlzay5cbiAgICAgIGlmIChzb3VyY2VNYXAubWFwLnNvdXJjZXNDb250ZW50KSB7XG4gICAgICAgIHNvdXJjZU1hcC5tYXAuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uKHNvdXJjZSwgaSkge1xuICAgICAgICAgIHZhciBjb250ZW50cyA9IHNvdXJjZU1hcC5tYXAuc291cmNlc0NvbnRlbnRbaV07XG4gICAgICAgICAgaWYgKGNvbnRlbnRzKSB7XG4gICAgICAgICAgICB2YXIgdXJsID0gc3VwcG9ydFJlbGF0aXZlVVJMKHNvdXJjZU1hcC51cmwsIHNvdXJjZSk7XG4gICAgICAgICAgICBmaWxlQ29udGVudHNDYWNoZVt1cmxdID0gY29udGVudHM7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlTWFwID0gc291cmNlTWFwQ2FjaGVbcG9zaXRpb24uc291cmNlXSA9IHtcbiAgICAgICAgdXJsOiBudWxsLFxuICAgICAgICBtYXA6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzb2x2ZSB0aGUgc291cmNlIFVSTCByZWxhdGl2ZSB0byB0aGUgVVJMIG9mIHRoZSBzb3VyY2UgbWFwXG4gIGlmIChzb3VyY2VNYXAgJiYgc291cmNlTWFwLm1hcCAmJiB0eXBlb2Ygc291cmNlTWFwLm1hcC5vcmlnaW5hbFBvc2l0aW9uRm9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIG9yaWdpbmFsUG9zaXRpb24gPSBzb3VyY2VNYXAubWFwLm9yaWdpbmFsUG9zaXRpb25Gb3IocG9zaXRpb24pO1xuXG4gICAgLy8gT25seSByZXR1cm4gdGhlIG9yaWdpbmFsIHBvc2l0aW9uIGlmIGEgbWF0Y2hpbmcgbGluZSB3YXMgZm91bmQuIElmIG5vXG4gICAgLy8gbWF0Y2hpbmcgbGluZSBpcyBmb3VuZCB0aGVuIHdlIHJldHVybiBwb3NpdGlvbiBpbnN0ZWFkLCB3aGljaCB3aWxsIGNhdXNlXG4gICAgLy8gdGhlIHN0YWNrIHRyYWNlIHRvIHByaW50IHRoZSBwYXRoIGFuZCBsaW5lIGZvciB0aGUgY29tcGlsZWQgZmlsZS4gSXQgaXNcbiAgICAvLyBiZXR0ZXIgdG8gZ2l2ZSBhIHByZWNpc2UgbG9jYXRpb24gaW4gdGhlIGNvbXBpbGVkIGZpbGUgdGhhbiBhIHZhZ3VlXG4gICAgLy8gbG9jYXRpb24gaW4gdGhlIG9yaWdpbmFsIGZpbGUuXG4gICAgaWYgKG9yaWdpbmFsUG9zaXRpb24uc291cmNlICE9PSBudWxsKSB7XG4gICAgICBvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSA9IHN1cHBvcnRSZWxhdGl2ZVVSTChcbiAgICAgICAgc291cmNlTWFwLnVybCwgb3JpZ2luYWxQb3NpdGlvbi5zb3VyY2UpO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsUG9zaXRpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHBvc2l0aW9uO1xufVxuXG4vLyBQYXJzZXMgY29kZSBnZW5lcmF0ZWQgYnkgRm9ybWF0RXZhbE9yaWdpbigpLCBhIGZ1bmN0aW9uIGluc2lkZSBWODpcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avdjgvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvbWVzc2FnZXMuanNcbmZ1bmN0aW9uIG1hcEV2YWxPcmlnaW4ob3JpZ2luKSB7XG4gIC8vIE1vc3QgZXZhbCgpIGNhbGxzIGFyZSBpbiB0aGlzIGZvcm1hdFxuICB2YXIgbWF0Y2ggPSAvXmV2YWwgYXQgKFteKF0rKSBcXCgoLispOihcXGQrKTooXFxkKylcXCkkLy5leGVjKG9yaWdpbik7XG4gIGlmIChtYXRjaCkge1xuICAgIHZhciBwb3NpdGlvbiA9IG1hcFNvdXJjZVBvc2l0aW9uKHtcbiAgICAgIHNvdXJjZTogbWF0Y2hbMl0sXG4gICAgICBsaW5lOiArbWF0Y2hbM10sXG4gICAgICBjb2x1bW46IG1hdGNoWzRdIC0gMVxuICAgIH0pO1xuICAgIHJldHVybiAnZXZhbCBhdCAnICsgbWF0Y2hbMV0gKyAnICgnICsgcG9zaXRpb24uc291cmNlICsgJzonICtcbiAgICAgIHBvc2l0aW9uLmxpbmUgKyAnOicgKyAocG9zaXRpb24uY29sdW1uICsgMSkgKyAnKSc7XG4gIH1cblxuICAvLyBQYXJzZSBuZXN0ZWQgZXZhbCgpIGNhbGxzIHVzaW5nIHJlY3Vyc2lvblxuICBtYXRjaCA9IC9eZXZhbCBhdCAoW14oXSspIFxcKCguKylcXCkkLy5leGVjKG9yaWdpbik7XG4gIGlmIChtYXRjaCkge1xuICAgIHJldHVybiAnZXZhbCBhdCAnICsgbWF0Y2hbMV0gKyAnICgnICsgbWFwRXZhbE9yaWdpbihtYXRjaFsyXSkgKyAnKSc7XG4gIH1cblxuICAvLyBNYWtlIHN1cmUgd2Ugc3RpbGwgcmV0dXJuIHVzZWZ1bCBpbmZvcm1hdGlvbiBpZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZ1xuICByZXR1cm4gb3JpZ2luO1xufVxuXG4vLyBUaGlzIGlzIGNvcGllZCBhbG1vc3QgdmVyYmF0aW0gZnJvbSB0aGUgVjggc291cmNlIGNvZGUgYXRcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avdjgvc291cmNlL2Jyb3dzZS90cnVuay9zcmMvbWVzc2FnZXMuanMuIFRoZVxuLy8gaW1wbGVtZW50YXRpb24gb2Ygd3JhcENhbGxTaXRlKCkgdXNlZCB0byBqdXN0IGZvcndhcmQgdG8gdGhlIGFjdHVhbCBzb3VyY2Vcbi8vIGNvZGUgb2YgQ2FsbFNpdGUucHJvdG90eXBlLnRvU3RyaW5nIGJ1dCB1bmZvcnR1bmF0ZWx5IGEgbmV3IHJlbGVhc2Ugb2YgVjhcbi8vIGRpZCBzb21ldGhpbmcgdG8gdGhlIHByb3RvdHlwZSBjaGFpbiBhbmQgYnJva2UgdGhlIHNoaW0uIFRoZSBvbmx5IGZpeCBJXG4vLyBjb3VsZCBmaW5kIHdhcyBjb3B5L3Bhc3RlLlxuZnVuY3Rpb24gQ2FsbFNpdGVUb1N0cmluZygpIHtcbiAgdmFyIGZpbGVOYW1lO1xuICB2YXIgZmlsZUxvY2F0aW9uID0gXCJcIjtcbiAgaWYgKHRoaXMuaXNOYXRpdmUoKSkge1xuICAgIGZpbGVMb2NhdGlvbiA9IFwibmF0aXZlXCI7XG4gIH0gZWxzZSB7XG4gICAgZmlsZU5hbWUgPSB0aGlzLmdldFNjcmlwdE5hbWVPclNvdXJjZVVSTCgpO1xuICAgIGlmICghZmlsZU5hbWUgJiYgdGhpcy5pc0V2YWwoKSkge1xuICAgICAgZmlsZUxvY2F0aW9uID0gdGhpcy5nZXRFdmFsT3JpZ2luKCk7XG4gICAgICBmaWxlTG9jYXRpb24gKz0gXCIsIFwiOyAgLy8gRXhwZWN0aW5nIHNvdXJjZSBwb3NpdGlvbiB0byBmb2xsb3cuXG4gICAgfVxuXG4gICAgaWYgKGZpbGVOYW1lKSB7XG4gICAgICBmaWxlTG9jYXRpb24gKz0gZmlsZU5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNvdXJjZSBjb2RlIGRvZXMgbm90IG9yaWdpbmF0ZSBmcm9tIGEgZmlsZSBhbmQgaXMgbm90IG5hdGl2ZSwgYnV0IHdlXG4gICAgICAvLyBjYW4gc3RpbGwgZ2V0IHRoZSBzb3VyY2UgcG9zaXRpb24gaW5zaWRlIHRoZSBzb3VyY2Ugc3RyaW5nLCBlLmcuIGluXG4gICAgICAvLyBhbiBldmFsIHN0cmluZy5cbiAgICAgIGZpbGVMb2NhdGlvbiArPSBcIjxhbm9ueW1vdXM+XCI7XG4gICAgfVxuICAgIHZhciBsaW5lTnVtYmVyID0gdGhpcy5nZXRMaW5lTnVtYmVyKCk7XG4gICAgaWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkge1xuICAgICAgZmlsZUxvY2F0aW9uICs9IFwiOlwiICsgbGluZU51bWJlcjtcbiAgICAgIHZhciBjb2x1bW5OdW1iZXIgPSB0aGlzLmdldENvbHVtbk51bWJlcigpO1xuICAgICAgaWYgKGNvbHVtbk51bWJlcikge1xuICAgICAgICBmaWxlTG9jYXRpb24gKz0gXCI6XCIgKyBjb2x1bW5OdW1iZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdmFyIGxpbmUgPSBcIlwiO1xuICB2YXIgZnVuY3Rpb25OYW1lID0gdGhpcy5nZXRGdW5jdGlvbk5hbWUoKTtcbiAgdmFyIGFkZFN1ZmZpeCA9IHRydWU7XG4gIHZhciBpc0NvbnN0cnVjdG9yID0gdGhpcy5pc0NvbnN0cnVjdG9yKCk7XG4gIHZhciBpc01ldGhvZENhbGwgPSAhKHRoaXMuaXNUb3BsZXZlbCgpIHx8IGlzQ29uc3RydWN0b3IpO1xuICBpZiAoaXNNZXRob2RDYWxsKSB7XG4gICAgdmFyIHR5cGVOYW1lID0gdGhpcy5nZXRUeXBlTmFtZSgpO1xuICAgIC8vIEZpeGVzIHNoaW0gdG8gYmUgYmFja3dhcmQgY29tcGF0YWJsZSB3aXRoIE5vZGUgdjAgdG8gdjRcbiAgICBpZiAodHlwZU5hbWUgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICAgIHR5cGVOYW1lID0gXCJudWxsXCI7XG4gICAgfVxuICAgIHZhciBtZXRob2ROYW1lID0gdGhpcy5nZXRNZXRob2ROYW1lKCk7XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSkge1xuICAgICAgaWYgKHR5cGVOYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKHR5cGVOYW1lKSAhPSAwKSB7XG4gICAgICAgIGxpbmUgKz0gdHlwZU5hbWUgKyBcIi5cIjtcbiAgICAgIH1cbiAgICAgIGxpbmUgKz0gZnVuY3Rpb25OYW1lO1xuICAgICAgaWYgKG1ldGhvZE5hbWUgJiYgZnVuY3Rpb25OYW1lLmluZGV4T2YoXCIuXCIgKyBtZXRob2ROYW1lKSAhPSBmdW5jdGlvbk5hbWUubGVuZ3RoIC0gbWV0aG9kTmFtZS5sZW5ndGggLSAxKSB7XG4gICAgICAgIGxpbmUgKz0gXCIgW2FzIFwiICsgbWV0aG9kTmFtZSArIFwiXVwiO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lICs9IHR5cGVOYW1lICsgXCIuXCIgKyAobWV0aG9kTmFtZSB8fCBcIjxhbm9ueW1vdXM+XCIpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc0NvbnN0cnVjdG9yKSB7XG4gICAgbGluZSArPSBcIm5ldyBcIiArIChmdW5jdGlvbk5hbWUgfHwgXCI8YW5vbnltb3VzPlwiKTtcbiAgfSBlbHNlIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICBsaW5lICs9IGZ1bmN0aW9uTmFtZTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lICs9IGZpbGVMb2NhdGlvbjtcbiAgICBhZGRTdWZmaXggPSBmYWxzZTtcbiAgfVxuICBpZiAoYWRkU3VmZml4KSB7XG4gICAgbGluZSArPSBcIiAoXCIgKyBmaWxlTG9jYXRpb24gKyBcIilcIjtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gY2xvbmVDYWxsU2l0ZShmcmFtZSkge1xuICB2YXIgb2JqZWN0ID0ge307XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE9iamVjdC5nZXRQcm90b3R5cGVPZihmcmFtZSkpLmZvckVhY2goZnVuY3Rpb24obmFtZSkge1xuICAgIG9iamVjdFtuYW1lXSA9IC9eKD86aXN8Z2V0KS8udGVzdChuYW1lKSA/IGZ1bmN0aW9uKCkgeyByZXR1cm4gZnJhbWVbbmFtZV0uY2FsbChmcmFtZSk7IH0gOiBmcmFtZVtuYW1lXTtcbiAgfSk7XG4gIG9iamVjdC50b1N0cmluZyA9IENhbGxTaXRlVG9TdHJpbmc7XG4gIHJldHVybiBvYmplY3Q7XG59XG5cbmZ1bmN0aW9uIHdyYXBDYWxsU2l0ZShmcmFtZSwgc3RhdGUpIHtcbiAgLy8gcHJvdmlkZXMgaW50ZXJmYWNlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgaWYgKHN0YXRlID09PSB1bmRlZmluZWQpIHtcbiAgICBzdGF0ZSA9IHsgbmV4dFBvc2l0aW9uOiBudWxsLCBjdXJQb3NpdGlvbjogbnVsbCB9XG4gIH1cbiAgaWYoZnJhbWUuaXNOYXRpdmUoKSkge1xuICAgIHN0YXRlLmN1clBvc2l0aW9uID0gbnVsbDtcbiAgICByZXR1cm4gZnJhbWU7XG4gIH1cblxuICAvLyBNb3N0IGNhbGwgc2l0ZXMgd2lsbCByZXR1cm4gdGhlIHNvdXJjZSBmaWxlIGZyb20gZ2V0RmlsZU5hbWUoKSwgYnV0IGNvZGVcbiAgLy8gcGFzc2VkIHRvIGV2YWwoKSBlbmRpbmcgaW4gXCIvLyMgc291cmNlVVJMPS4uLlwiIHdpbGwgcmV0dXJuIHRoZSBzb3VyY2UgZmlsZVxuICAvLyBmcm9tIGdldFNjcmlwdE5hbWVPclNvdXJjZVVSTCgpIGluc3RlYWRcbiAgdmFyIHNvdXJjZSA9IGZyYW1lLmdldEZpbGVOYW1lKCkgfHwgZnJhbWUuZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMKCk7XG4gIGlmIChzb3VyY2UpIHtcbiAgICB2YXIgbGluZSA9IGZyYW1lLmdldExpbmVOdW1iZXIoKTtcbiAgICB2YXIgY29sdW1uID0gZnJhbWUuZ2V0Q29sdW1uTnVtYmVyKCkgLSAxO1xuXG4gICAgLy8gRml4IHBvc2l0aW9uIGluIE5vZGUgd2hlcmUgc29tZSAoaW50ZXJuYWwpIGNvZGUgaXMgcHJlcGVuZGVkLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXZhbncvbm9kZS1zb3VyY2UtbWFwLXN1cHBvcnQvaXNzdWVzLzM2XG4gICAgLy8gSGVhZGVyIHJlbW92ZWQgaW4gbm9kZSBhdCBeMTAuMTYgfHwgPj0xMS4xMS4wXG4gICAgLy8gdjExIGlzIG5vdCBhbiBMVFMgY2FuZGlkYXRlLCB3ZSBjYW4ganVzdCB0ZXN0IHRoZSBvbmUgdmVyc2lvbiB3aXRoIGl0LlxuICAgIC8vIFRlc3Qgbm9kZSB2ZXJzaW9ucyBmb3I6IDEwLjE2LTE5LCAxMC4yMCssIDEyLTE5LCAyMC05OSwgMTAwKywgb3IgMTEuMTFcbiAgICB2YXIgbm9IZWFkZXIgPSAvXnYoMTBcXC4xWzYtOV18MTBcXC5bMi05XVswLTldfDEwXFwuWzAtOV17Myx9fDFbMi05XVxcZCp8WzItOV1cXGR8XFxkezMsfXwxMVxcLjExKS87XG4gICAgdmFyIGhlYWRlckxlbmd0aCA9IG5vSGVhZGVyLnRlc3QoZ2xvYmFsUHJvY2Vzc1ZlcnNpb24oKSkgPyAwIDogNjI7XG4gICAgaWYgKGxpbmUgPT09IDEgJiYgY29sdW1uID4gaGVhZGVyTGVuZ3RoICYmICFpc0luQnJvd3NlcigpICYmICFmcmFtZS5pc0V2YWwoKSkge1xuICAgICAgY29sdW1uIC09IGhlYWRlckxlbmd0aDtcbiAgICB9XG5cbiAgICB2YXIgcG9zaXRpb24gPSBtYXBTb3VyY2VQb3NpdGlvbih7XG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgIGxpbmU6IGxpbmUsXG4gICAgICBjb2x1bW46IGNvbHVtblxuICAgIH0pO1xuICAgIHN0YXRlLmN1clBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgZnJhbWUgPSBjbG9uZUNhbGxTaXRlKGZyYW1lKTtcbiAgICB2YXIgb3JpZ2luYWxGdW5jdGlvbk5hbWUgPSBmcmFtZS5nZXRGdW5jdGlvbk5hbWU7XG4gICAgZnJhbWUuZ2V0RnVuY3Rpb25OYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoc3RhdGUubmV4dFBvc2l0aW9uID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25OYW1lKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RhdGUubmV4dFBvc2l0aW9uLm5hbWUgfHwgb3JpZ2luYWxGdW5jdGlvbk5hbWUoKTtcbiAgICB9O1xuICAgIGZyYW1lLmdldEZpbGVOYW1lID0gZnVuY3Rpb24oKSB7IHJldHVybiBwb3NpdGlvbi5zb3VyY2U7IH07XG4gICAgZnJhbWUuZ2V0TGluZU51bWJlciA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcG9zaXRpb24ubGluZTsgfTtcbiAgICBmcmFtZS5nZXRDb2x1bW5OdW1iZXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHBvc2l0aW9uLmNvbHVtbiArIDE7IH07XG4gICAgZnJhbWUuZ2V0U2NyaXB0TmFtZU9yU291cmNlVVJMID0gZnVuY3Rpb24oKSB7IHJldHVybiBwb3NpdGlvbi5zb3VyY2U7IH07XG4gICAgcmV0dXJuIGZyYW1lO1xuICB9XG5cbiAgLy8gQ29kZSBjYWxsZWQgdXNpbmcgZXZhbCgpIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmdcbiAgdmFyIG9yaWdpbiA9IGZyYW1lLmlzRXZhbCgpICYmIGZyYW1lLmdldEV2YWxPcmlnaW4oKTtcbiAgaWYgKG9yaWdpbikge1xuICAgIG9yaWdpbiA9IG1hcEV2YWxPcmlnaW4ob3JpZ2luKTtcbiAgICBmcmFtZSA9IGNsb25lQ2FsbFNpdGUoZnJhbWUpO1xuICAgIGZyYW1lLmdldEV2YWxPcmlnaW4gPSBmdW5jdGlvbigpIHsgcmV0dXJuIG9yaWdpbjsgfTtcbiAgICByZXR1cm4gZnJhbWU7XG4gIH1cblxuICAvLyBJZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIHdlcmUgdW5hYmxlIHRvIGNoYW5nZSB0aGUgc291cmNlIHBvc2l0aW9uXG4gIHJldHVybiBmcmFtZTtcbn1cblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBwYXJ0IG9mIHRoZSBWOCBzdGFjayB0cmFjZSBBUEksIGZvciBtb3JlIGluZm8gc2VlOlxuLy8gaHR0cHM6Ly92OC5kZXYvZG9jcy9zdGFjay10cmFjZS1hcGlcbmZ1bmN0aW9uIHByZXBhcmVTdGFja1RyYWNlKGVycm9yLCBzdGFjaykge1xuICBpZiAoZW1wdHlDYWNoZUJldHdlZW5PcGVyYXRpb25zKSB7XG4gICAgZmlsZUNvbnRlbnRzQ2FjaGUgPSB7fTtcbiAgICBzb3VyY2VNYXBDYWNoZSA9IHt9O1xuICB9XG5cbiAgdmFyIG5hbWUgPSBlcnJvci5uYW1lIHx8ICdFcnJvcic7XG4gIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZSB8fCAnJztcbiAgdmFyIGVycm9yU3RyaW5nID0gbmFtZSArIFwiOiBcIiArIG1lc3NhZ2U7XG5cbiAgdmFyIHN0YXRlID0geyBuZXh0UG9zaXRpb246IG51bGwsIGN1clBvc2l0aW9uOiBudWxsIH07XG4gIHZhciBwcm9jZXNzZWRTdGFjayA9IFtdO1xuICBmb3IgKHZhciBpID0gc3RhY2subGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBwcm9jZXNzZWRTdGFjay5wdXNoKCdcXG4gICAgYXQgJyArIHdyYXBDYWxsU2l0ZShzdGFja1tpXSwgc3RhdGUpKTtcbiAgICBzdGF0ZS5uZXh0UG9zaXRpb24gPSBzdGF0ZS5jdXJQb3NpdGlvbjtcbiAgfVxuICBzdGF0ZS5jdXJQb3NpdGlvbiA9IHN0YXRlLm5leHRQb3NpdGlvbiA9IG51bGw7XG4gIHJldHVybiBlcnJvclN0cmluZyArIHByb2Nlc3NlZFN0YWNrLnJldmVyc2UoKS5qb2luKCcnKTtcbn1cblxuLy8gR2VuZXJhdGUgcG9zaXRpb24gYW5kIHNuaXBwZXQgb2Ygb3JpZ2luYWwgc291cmNlIHdpdGggcG9pbnRlclxuZnVuY3Rpb24gZ2V0RXJyb3JTb3VyY2UoZXJyb3IpIHtcbiAgdmFyIG1hdGNoID0gL1xcbiAgICBhdCBbXihdKyBcXCgoLiopOihcXGQrKTooXFxkKylcXCkvLmV4ZWMoZXJyb3Iuc3RhY2spO1xuICBpZiAobWF0Y2gpIHtcbiAgICB2YXIgc291cmNlID0gbWF0Y2hbMV07XG4gICAgdmFyIGxpbmUgPSArbWF0Y2hbMl07XG4gICAgdmFyIGNvbHVtbiA9ICttYXRjaFszXTtcblxuICAgIC8vIFN1cHBvcnQgdGhlIGlubGluZSBzb3VyY2VDb250ZW50cyBpbnNpZGUgdGhlIHNvdXJjZSBtYXBcbiAgICB2YXIgY29udGVudHMgPSBmaWxlQ29udGVudHNDYWNoZVtzb3VyY2VdO1xuXG4gICAgLy8gU3VwcG9ydCBmaWxlcyBvbiBkaXNrXG4gICAgaWYgKCFjb250ZW50cyAmJiBmcyAmJiBmcy5leGlzdHNTeW5jKHNvdXJjZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnRlbnRzID0gZnMucmVhZEZpbGVTeW5jKHNvdXJjZSwgJ3V0ZjgnKTtcbiAgICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICAgIGNvbnRlbnRzID0gJyc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRm9ybWF0IHRoZSBsaW5lIGZyb20gdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGxpa2Ugbm9kZSBkb2VzXG4gICAgaWYgKGNvbnRlbnRzKSB7XG4gICAgICB2YXIgY29kZSA9IGNvbnRlbnRzLnNwbGl0KC8oPzpcXHJcXG58XFxyfFxcbikvKVtsaW5lIC0gMV07XG4gICAgICBpZiAoY29kZSkge1xuICAgICAgICByZXR1cm4gc291cmNlICsgJzonICsgbGluZSArICdcXG4nICsgY29kZSArICdcXG4nICtcbiAgICAgICAgICBuZXcgQXJyYXkoY29sdW1uKS5qb2luKCcgJykgKyAnXic7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBwcmludEVycm9yQW5kRXhpdCAoZXJyb3IpIHtcbiAgdmFyIHNvdXJjZSA9IGdldEVycm9yU291cmNlKGVycm9yKTtcblxuICAvLyBFbnN1cmUgZXJyb3IgaXMgcHJpbnRlZCBzeW5jaHJvbm91c2x5IGFuZCBub3QgdHJ1bmNhdGVkXG4gIHZhciBzdGRlcnIgPSBnbG9iYWxQcm9jZXNzU3RkZXJyKCk7XG4gIGlmIChzdGRlcnIgJiYgc3RkZXJyLl9oYW5kbGUgJiYgc3RkZXJyLl9oYW5kbGUuc2V0QmxvY2tpbmcpIHtcbiAgICBzdGRlcnIuX2hhbmRsZS5zZXRCbG9ja2luZyh0cnVlKTtcbiAgfVxuXG4gIGlmIChzb3VyY2UpIHtcbiAgICBjb25zb2xlLmVycm9yKCk7XG4gICAgY29uc29sZS5lcnJvcihzb3VyY2UpO1xuICB9XG5cbiAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gIGdsb2JhbFByb2Nlc3NFeGl0KDEpO1xufVxuXG5mdW5jdGlvbiBzaGltRW1pdFVuY2F1Z2h0RXhjZXB0aW9uICgpIHtcbiAgdmFyIG9yaWdFbWl0ID0gcHJvY2Vzcy5lbWl0O1xuXG4gIHByb2Nlc3MuZW1pdCA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHtcbiAgICAgIHZhciBoYXNTdGFjayA9IChhcmd1bWVudHNbMV0gJiYgYXJndW1lbnRzWzFdLnN0YWNrKTtcbiAgICAgIHZhciBoYXNMaXN0ZW5lcnMgPSAodGhpcy5saXN0ZW5lcnModHlwZSkubGVuZ3RoID4gMCk7XG5cbiAgICAgIGlmIChoYXNTdGFjayAmJiAhaGFzTGlzdGVuZXJzKSB7XG4gICAgICAgIHJldHVybiBwcmludEVycm9yQW5kRXhpdChhcmd1bWVudHNbMV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvcmlnRW1pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xufVxuXG52YXIgb3JpZ2luYWxSZXRyaWV2ZUZpbGVIYW5kbGVycyA9IHJldHJpZXZlRmlsZUhhbmRsZXJzLnNsaWNlKDApO1xudmFyIG9yaWdpbmFsUmV0cmlldmVNYXBIYW5kbGVycyA9IHJldHJpZXZlTWFwSGFuZGxlcnMuc2xpY2UoMCk7XG5cbmV4cG9ydHMud3JhcENhbGxTaXRlID0gd3JhcENhbGxTaXRlO1xuZXhwb3J0cy5nZXRFcnJvclNvdXJjZSA9IGdldEVycm9yU291cmNlO1xuZXhwb3J0cy5tYXBTb3VyY2VQb3NpdGlvbiA9IG1hcFNvdXJjZVBvc2l0aW9uO1xuZXhwb3J0cy5yZXRyaWV2ZVNvdXJjZU1hcCA9IHJldHJpZXZlU291cmNlTWFwO1xuXG5leHBvcnRzLmluc3RhbGwgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChvcHRpb25zLmVudmlyb25tZW50KSB7XG4gICAgZW52aXJvbm1lbnQgPSBvcHRpb25zLmVudmlyb25tZW50O1xuICAgIGlmIChbXCJub2RlXCIsIFwiYnJvd3NlclwiLCBcImF1dG9cIl0uaW5kZXhPZihlbnZpcm9ubWVudCkgPT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbnZpcm9ubWVudCBcIiArIGVudmlyb25tZW50ICsgXCIgd2FzIHVua25vd24uIEF2YWlsYWJsZSBvcHRpb25zIGFyZSB7YXV0bywgYnJvd3Nlciwgbm9kZX1cIilcbiAgICB9XG4gIH1cblxuICAvLyBBbGxvdyBzb3VyY2VzIHRvIGJlIGZvdW5kIGJ5IG1ldGhvZHMgb3RoZXIgdGhhbiByZWFkaW5nIHRoZSBmaWxlc1xuICAvLyBkaXJlY3RseSBmcm9tIGRpc2suXG4gIGlmIChvcHRpb25zLnJldHJpZXZlRmlsZSkge1xuICAgIGlmIChvcHRpb25zLm92ZXJyaWRlUmV0cmlldmVGaWxlKSB7XG4gICAgICByZXRyaWV2ZUZpbGVIYW5kbGVycy5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIHJldHJpZXZlRmlsZUhhbmRsZXJzLnVuc2hpZnQob3B0aW9ucy5yZXRyaWV2ZUZpbGUpO1xuICB9XG5cbiAgLy8gQWxsb3cgc291cmNlIG1hcHMgdG8gYmUgZm91bmQgYnkgbWV0aG9kcyBvdGhlciB0aGFuIHJlYWRpbmcgdGhlIGZpbGVzXG4gIC8vIGRpcmVjdGx5IGZyb20gZGlzay5cbiAgaWYgKG9wdGlvbnMucmV0cmlldmVTb3VyY2VNYXApIHtcbiAgICBpZiAob3B0aW9ucy5vdmVycmlkZVJldHJpZXZlU291cmNlTWFwKSB7XG4gICAgICByZXRyaWV2ZU1hcEhhbmRsZXJzLmxlbmd0aCA9IDA7XG4gICAgfVxuXG4gICAgcmV0cmlldmVNYXBIYW5kbGVycy51bnNoaWZ0KG9wdGlvbnMucmV0cmlldmVTb3VyY2VNYXApO1xuICB9XG5cbiAgLy8gU3VwcG9ydCBydW50aW1lIHRyYW5zcGlsZXJzIHRoYXQgaW5jbHVkZSBpbmxpbmUgc291cmNlIG1hcHNcbiAgaWYgKG9wdGlvbnMuaG9va1JlcXVpcmUgJiYgIWlzSW5Ccm93c2VyKCkpIHtcbiAgICAvLyBVc2UgZHluYW1pY1JlcXVpcmUgdG8gYXZvaWQgaW5jbHVkaW5nIGluIGJyb3dzZXIgYnVuZGxlc1xuICAgIHZhciBNb2R1bGUgPSBkeW5hbWljUmVxdWlyZShtb2R1bGUsICdtb2R1bGUnKTtcbiAgICB2YXIgJGNvbXBpbGUgPSBNb2R1bGUucHJvdG90eXBlLl9jb21waWxlO1xuXG4gICAgaWYgKCEkY29tcGlsZS5fX3NvdXJjZU1hcFN1cHBvcnQpIHtcbiAgICAgIE1vZHVsZS5wcm90b3R5cGUuX2NvbXBpbGUgPSBmdW5jdGlvbihjb250ZW50LCBmaWxlbmFtZSkge1xuICAgICAgICBmaWxlQ29udGVudHNDYWNoZVtmaWxlbmFtZV0gPSBjb250ZW50O1xuICAgICAgICBzb3VyY2VNYXBDYWNoZVtmaWxlbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiAkY29tcGlsZS5jYWxsKHRoaXMsIGNvbnRlbnQsIGZpbGVuYW1lKTtcbiAgICAgIH07XG5cbiAgICAgIE1vZHVsZS5wcm90b3R5cGUuX2NvbXBpbGUuX19zb3VyY2VNYXBTdXBwb3J0ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBDb25maWd1cmUgb3B0aW9uc1xuICBpZiAoIWVtcHR5Q2FjaGVCZXR3ZWVuT3BlcmF0aW9ucykge1xuICAgIGVtcHR5Q2FjaGVCZXR3ZWVuT3BlcmF0aW9ucyA9ICdlbXB0eUNhY2hlQmV0d2Vlbk9wZXJhdGlvbnMnIGluIG9wdGlvbnMgP1xuICAgICAgb3B0aW9ucy5lbXB0eUNhY2hlQmV0d2Vlbk9wZXJhdGlvbnMgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIEluc3RhbGwgdGhlIGVycm9yIHJlZm9ybWF0dGVyXG4gIGlmICghZXJyb3JGb3JtYXR0ZXJJbnN0YWxsZWQpIHtcbiAgICBlcnJvckZvcm1hdHRlckluc3RhbGxlZCA9IHRydWU7XG4gICAgRXJyb3IucHJlcGFyZVN0YWNrVHJhY2UgPSBwcmVwYXJlU3RhY2tUcmFjZTtcbiAgfVxuXG4gIGlmICghdW5jYXVnaHRTaGltSW5zdGFsbGVkKSB7XG4gICAgdmFyIGluc3RhbGxIYW5kbGVyID0gJ2hhbmRsZVVuY2F1Z2h0RXhjZXB0aW9ucycgaW4gb3B0aW9ucyA/XG4gICAgICBvcHRpb25zLmhhbmRsZVVuY2F1Z2h0RXhjZXB0aW9ucyA6IHRydWU7XG5cbiAgICAvLyBEbyBub3Qgb3ZlcnJpZGUgJ3VuY2F1Z2h0RXhjZXB0aW9uJyB3aXRoIG91ciBvd24gaGFuZGxlciBpbiBOb2RlLmpzXG4gICAgLy8gV29ya2VyIHRocmVhZHMuIFdvcmtlcnMgcGFzcyB0aGUgZXJyb3IgdG8gdGhlIG1haW4gdGhyZWFkIGFzIGFuIGV2ZW50LFxuICAgIC8vIHJhdGhlciB0aGFuIHByaW50aW5nIHNvbWV0aGluZyB0byBzdGRlcnIgYW5kIGV4aXRpbmcuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gdXNlIGBkeW5hbWljUmVxdWlyZWAgYmVjYXVzZSBgcmVxdWlyZWAgb24gaXQncyBvd24gd2lsbCBiZSBvcHRpbWl6ZWQgYnkgV2ViUGFjay9Ccm93c2VyaWZ5LlxuICAgICAgdmFyIHdvcmtlcl90aHJlYWRzID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAnd29ya2VyX3RocmVhZHMnKTtcbiAgICAgIGlmICh3b3JrZXJfdGhyZWFkcy5pc01haW5UaHJlYWQgPT09IGZhbHNlKSB7XG4gICAgICAgIGluc3RhbGxIYW5kbGVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaChlKSB7fVxuXG4gICAgLy8gUHJvdmlkZSB0aGUgb3B0aW9uIHRvIG5vdCBpbnN0YWxsIHRoZSB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlci4gVGhpcyBpc1xuICAgIC8vIHRvIHN1cHBvcnQgb3RoZXIgdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXJzIChpbiB0ZXN0IGZyYW1ld29ya3MsIGZvclxuICAgIC8vIGV4YW1wbGUpLiBJZiB0aGlzIGhhbmRsZXIgaXMgbm90IGluc3RhbGxlZCBhbmQgdGhlcmUgYXJlIG5vIG90aGVyIHVuY2F1Z2h0XG4gICAgLy8gZXhjZXB0aW9uIGhhbmRsZXJzLCB1bmNhdWdodCBleGNlcHRpb25zIHdpbGwgYmUgY2F1Z2h0IGJ5IG5vZGUncyBidWlsdC1pblxuICAgIC8vIGV4Y2VwdGlvbiBoYW5kbGVyIGFuZCB0aGUgcHJvY2VzcyB3aWxsIHN0aWxsIGJlIHRlcm1pbmF0ZWQuIEhvd2V2ZXIsIHRoZVxuICAgIC8vIGdlbmVyYXRlZCBKYXZhU2NyaXB0IGNvZGUgd2lsbCBiZSBzaG93biBhYm92ZSB0aGUgc3RhY2sgdHJhY2UgaW5zdGVhZCBvZlxuICAgIC8vIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS5cbiAgICBpZiAoaW5zdGFsbEhhbmRsZXIgJiYgaGFzR2xvYmFsUHJvY2Vzc0V2ZW50RW1pdHRlcigpKSB7XG4gICAgICB1bmNhdWdodFNoaW1JbnN0YWxsZWQgPSB0cnVlO1xuICAgICAgc2hpbUVtaXRVbmNhdWdodEV4Y2VwdGlvbigpO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0cy5yZXNldFJldHJpZXZlSGFuZGxlcnMgPSBmdW5jdGlvbigpIHtcbiAgcmV0cmlldmVGaWxlSGFuZGxlcnMubGVuZ3RoID0gMDtcbiAgcmV0cmlldmVNYXBIYW5kbGVycy5sZW5ndGggPSAwO1xuXG4gIHJldHJpZXZlRmlsZUhhbmRsZXJzID0gb3JpZ2luYWxSZXRyaWV2ZUZpbGVIYW5kbGVycy5zbGljZSgwKTtcbiAgcmV0cmlldmVNYXBIYW5kbGVycyA9IG9yaWdpbmFsUmV0cmlldmVNYXBIYW5kbGVycy5zbGljZSgwKTtcblxuICByZXRyaWV2ZVNvdXJjZU1hcCA9IGhhbmRsZXJFeGVjKHJldHJpZXZlTWFwSGFuZGxlcnMpO1xuICByZXRyaWV2ZUZpbGUgPSBoYW5kbGVyRXhlYyhyZXRyaWV2ZUZpbGVIYW5kbGVycyk7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuXHRpZiAoIW1vZHVsZS53ZWJwYWNrUG9seWZpbGwpIHtcblx0XHRtb2R1bGUuZGVwcmVjYXRlID0gZnVuY3Rpb24oKSB7fTtcblx0XHRtb2R1bGUucGF0aHMgPSBbXTtcblx0XHQvLyBtb2R1bGUucGFyZW50ID0gdW5kZWZpbmVkIGJ5IGRlZmF1bHRcblx0XHRpZiAoIW1vZHVsZS5jaGlsZHJlbikgbW9kdWxlLmNoaWxkcmVuID0gW107XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJsb2FkZWRcIiwge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBtb2R1bGUubDtcblx0XHRcdH1cblx0XHR9KTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlLCBcImlkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0bW9kdWxlLndlYnBhY2tQb2x5ZmlsbCA9IDE7XG5cdH1cblx0cmV0dXJuIG1vZHVsZTtcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qKlxuICogQG1vZHVsZSBTM1xuICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5tb3ZlT2JqZWN0ID0gZXhwb3J0cy5tdWx0aXBhcnRDb3B5T2JqZWN0ID0gZXhwb3J0cy5jcmVhdGVTM0J1Y2tldHMgPSBleHBvcnRzLmNyZWF0ZUJ1Y2tldCA9IGV4cG9ydHMuZ2V0RmlsZUJ1Y2tldEFuZEtleSA9IGV4cG9ydHMudmFsaWRhdGVTM09iamVjdENoZWNrc3VtID0gZXhwb3J0cy5jYWxjdWxhdGVPYmplY3RIYXNoID0gZXhwb3J0cy5saXN0UzNPYmplY3RzVjIgPSBleHBvcnRzLmxpc3RTM09iamVjdHMgPSBleHBvcnRzLnVwbG9hZFMzRmlsZVN0cmVhbSA9IGV4cG9ydHMudXBsb2FkUzNGaWxlcyA9IGV4cG9ydHMuZGVsZXRlUzNCdWNrZXRzID0gZXhwb3J0cy5yZWN1cnNpdmVseURlbGV0ZVMzQnVja2V0ID0gZXhwb3J0cy5kZWxldGVTM0ZpbGVzID0gZXhwb3J0cy5kb3dubG9hZFMzRmlsZXMgPSBleHBvcnRzLmZpbGVFeGlzdHMgPSBleHBvcnRzLmdldE9iamVjdFJlYWRTdHJlYW0gPSBleHBvcnRzLnB1dEpzb25TM09iamVjdCA9IGV4cG9ydHMuZ2V0SnNvblMzT2JqZWN0ID0gZXhwb3J0cy5nZXRUZXh0T2JqZWN0ID0gZXhwb3J0cy5nZXRTM09iamVjdCA9IGV4cG9ydHMud2FpdEZvck9iamVjdCA9IGV4cG9ydHMuZ2V0T2JqZWN0ID0gZXhwb3J0cy5zM1B1dE9iamVjdFRhZ2dpbmcgPSBleHBvcnRzLnMzR2V0T2JqZWN0VGFnZ2luZyA9IGV4cG9ydHMuZ2V0T2JqZWN0U2l6ZSA9IGV4cG9ydHMuZG93bmxvYWRTM0ZpbGUgPSBleHBvcnRzLnN0cmVhbVMzVXBsb2FkID0gZXhwb3J0cy5wcm9taXNlUzNVcGxvYWQgPSBleHBvcnRzLnMzQ29weU9iamVjdCA9IGV4cG9ydHMucHV0RmlsZSA9IGV4cG9ydHMuczNQdXRPYmplY3QgPSBleHBvcnRzLndhaXRGb3JPYmplY3RUb0V4aXN0ID0gZXhwb3J0cy5zM09iamVjdEV4aXN0cyA9IGV4cG9ydHMuaGVhZE9iamVjdCA9IGV4cG9ydHMuZGVsZXRlUzNPYmplY3QgPSBleHBvcnRzLnMzVGFnU2V0VG9RdWVyeVN0cmluZyA9IGV4cG9ydHMuYnVpbGRTM1VyaSA9IGV4cG9ydHMucGFyc2VTM1VyaSA9IGV4cG9ydHMuczNKb2luID0gdm9pZCAwO1xuY29uc3QgZnNfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiZnNcIikpO1xuY29uc3QgaXNCb29sZWFuXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImxvZGFzaC9pc0Jvb2xlYW5cIikpO1xuY29uc3QgcGF0aF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJwYXRoXCIpKTtcbmNvbnN0IHBfbWFwXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInAtbWFwXCIpKTtcbmNvbnN0IHBfcmV0cnlfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicC1yZXRyeVwiKSk7XG5jb25zdCBwX3dhaXRfZm9yXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInAtd2FpdC1mb3JcIikpO1xuY29uc3QgcHVtcF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJwdW1wXCIpKTtcbmNvbnN0IHF1ZXJ5c3RyaW5nXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInF1ZXJ5c3RyaW5nXCIpKTtcbmNvbnN0IHN0cmVhbV8xID0gcmVxdWlyZShcInN0cmVhbVwiKTtcbmNvbnN0IHV0aWxfMSA9IHJlcXVpcmUoXCJ1dGlsXCIpO1xuY29uc3QgY2hlY2tzdW1fMSA9IHJlcXVpcmUoXCJAY3VtdWx1cy9jaGVja3N1bVwiKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIkBjdW11bHVzL2Vycm9yc1wiKTtcbmNvbnN0IGxvZ2dlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJAY3VtdWx1cy9sb2dnZXJcIikpO1xuY29uc3QgUzNNdWx0aXBhcnRVcGxvYWRzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCIuL2xpYi9TM011bHRpcGFydFVwbG9hZHNcIikpO1xuY29uc3Qgc2VydmljZXNfMSA9IHJlcXVpcmUoXCIuL3NlcnZpY2VzXCIpO1xuY29uc3QgdGVzdF91dGlsc18xID0gcmVxdWlyZShcIi4vdGVzdC11dGlsc1wiKTtcbmNvbnN0IHV0aWxzXzEgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbmNvbnN0IGxvZyA9IG5ldyBsb2dnZXJfMS5kZWZhdWx0KHsgc2VuZGVyOiAnYXdzLWNsaWVudC9zMycgfSk7XG5jb25zdCBidWlsZERlcHJlY2F0aW9uTWVzc2FnZSA9IChuYW1lLCB2ZXJzaW9uLCBhbHRlcm5hdGl2ZSkgPT4ge1xuICAgIGxldCBtZXNzYWdlID0gYCR7bmFtZX0gaXMgZGVwcmVjYXRlZCBhZnRlciB2ZXJzaW9uICR7dmVyc2lvbn0gYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLmA7XG4gICAgaWYgKGFsdGVybmF0aXZlKVxuICAgICAgICBtZXNzYWdlICs9IGAgVXNlICR7YWx0ZXJuYXRpdmV9IGluc3RlYWQuYDtcbiAgICByZXR1cm4gbG9nLmJ1aWxkTWVzc2FnZSgnd2FybicsIG1lc3NhZ2UpO1xufTtcbmNvbnN0IFMzX1JBVEVfTElNSVQgPSB0ZXN0X3V0aWxzXzEuaW5UZXN0TW9kZSgpID8gMSA6IDIwO1xuLyoqXG4gKiBKb2luIHN0cmluZ3MgaW50byBhbiBTMyBrZXkgd2l0aG91dCBhIGxlYWRpbmcgc2xhc2hcbiAqXG4gKiBAcGFyYW0gey4uLnN0cmluZ3xBcnJheTxzdHJpbmc+fSBhcmdzIC0gdGhlIHN0cmluZ3MgdG8gam9pblxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZ1bGwgUzMga2V5XG4gKi9cbmV4cG9ydHMuczNKb2luID0gKC4uLmFyZ3MpID0+IHtcbiAgICBsZXQgdG9rZW5zO1xuICAgIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycpXG4gICAgICAgIHRva2VucyA9IGFyZ3M7XG4gICAgZWxzZVxuICAgICAgICB0b2tlbnMgPSBhcmdzWzBdO1xuICAgIGNvbnN0IHJlbW92ZUxlYWRpbmdTbGFzaCA9ICh0b2tlbikgPT4gdG9rZW4ucmVwbGFjZSgvXlxcLy8sICcnKTtcbiAgICBjb25zdCByZW1vdmVUcmFpbGluZ1NsYXNoID0gKHRva2VuKSA9PiB0b2tlbi5yZXBsYWNlKC9cXC8kLywgJycpO1xuICAgIGNvbnN0IGlzTm90RW1wdHlTdHJpbmcgPSAodG9rZW4pID0+IHRva2VuLmxlbmd0aCA+IDA7XG4gICAgY29uc3Qga2V5ID0gdG9rZW5zXG4gICAgICAgIC5tYXAocmVtb3ZlTGVhZGluZ1NsYXNoKVxuICAgICAgICAubWFwKHJlbW92ZVRyYWlsaW5nU2xhc2gpXG4gICAgICAgIC5maWx0ZXIoaXNOb3RFbXB0eVN0cmluZylcbiAgICAgICAgLmpvaW4oJy8nKTtcbiAgICBpZiAodG9rZW5zW3Rva2Vucy5sZW5ndGggLSAxXS5lbmRzV2l0aCgnLycpKVxuICAgICAgICByZXR1cm4gYCR7a2V5fS9gO1xuICAgIHJldHVybiBrZXk7XG59O1xuLyoqXG4qIHBhcnNlIGFuIHMzIHVyaSB0byBnZXQgdGhlIGJ1Y2tldCBhbmQga2V5XG4qXG4qIEBwYXJhbSB7c3RyaW5nfSB1cmkgLSBtdXN0IGJlIGEgdXJpIHdpdGggdGhlIGBzMzovL2AgcHJvdG9jb2xcbiogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBgQnVja2V0YCBhbmQgYEtleWAgcHJvcGVydGllc1xuKiovXG5leHBvcnRzLnBhcnNlUzNVcmkgPSAodXJpKSA9PiB7XG4gICAgY29uc3QgbWF0Y2ggPSB1cmkubWF0Y2goJ15zMzovLyhbXi9dKykvKC4qKSQnKTtcbiAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5hYmxlIHRvIHBhcnNlIFMzIFVSSTogJHt1cml9YCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIEJ1Y2tldDogbWF0Y2hbMV0sXG4gICAgICAgIEtleTogbWF0Y2hbMl0sXG4gICAgfTtcbn07XG4vKipcbiAqIEdpdmVuIGEgYnVja2V0IGFuZCBrZXksIHJldHVybiBhbiBTMyBVUklcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0IC0gYW4gUzMgYnVja2V0IG5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBhbiBTMyBrZXlcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGFuIFMzIFVSSVxuICovXG5leHBvcnRzLmJ1aWxkUzNVcmkgPSAoYnVja2V0LCBrZXkpID0+IGBzMzovLyR7YnVja2V0fS8ke2tleS5yZXBsYWNlKC9eXFwvKy8sICcnKX1gO1xuLyoqXG4qIENvbnZlcnQgUzMgVGFnU2V0IE9iamVjdCB0byBxdWVyeSBzdHJpbmdcbiogZS5nLiBbeyBLZXk6ICd0YWcnLCBWYWx1ZTogJ3ZhbHVlIH1dIHRvICd0YWc9dmFsdWUnXG4qXG4qIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gdGFnc2V0IC0gUzMgVGFnU2V0IGFycmF5XG4qIEByZXR1cm5zIHtzdHJpbmd9IHRhZ3MgcXVlcnkgc3RyaW5nXG4qL1xuZXhwb3J0cy5zM1RhZ1NldFRvUXVlcnlTdHJpbmcgPSAodGFnc2V0KSA9PiB0YWdzZXQubWFwKCh7IEtleSwgVmFsdWUgfSkgPT4gYCR7S2V5fT0ke1ZhbHVlfWApLmpvaW4oJyYnKTtcbi8qKlxuICogRGVsZXRlIGFuIG9iamVjdCBmcm9tIFMzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIGJ1Y2tldCB3aGVyZSB0aGUgb2JqZWN0IGV4aXN0c1xuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIGtleSBvZiB0aGUgb2JqZWN0IHRvIGJlIGRlbGV0ZWRcbiAqIHByb21pc2Ugb2YgdGhlIG9iamVjdCBiZWluZyBkZWxldGVkXG4gKi9cbmV4cG9ydHMuZGVsZXRlUzNPYmplY3QgPSB1dGlsc18xLmltcHJvdmVTdGFja1RyYWNlKChidWNrZXQsIGtleSkgPT4gc2VydmljZXNfMS5zMygpLmRlbGV0ZU9iamVjdCh7IEJ1Y2tldDogYnVja2V0LCBLZXk6IGtleSB9KS5wcm9taXNlKCkpO1xuLyoqXG4qIEdldCBhbiBvYmplY3QgaGVhZGVyIGZyb20gUzNcbipcbiogQHBhcmFtIHtzdHJpbmd9IEJ1Y2tldCAtIG5hbWUgb2YgYnVja2V0XG4qIEBwYXJhbSB7c3RyaW5nfSBLZXkgLSBrZXkgZm9yIG9iamVjdCAoZmlsZXBhdGggKyBmaWxlbmFtZSlcbiogQHBhcmFtIHtPYmplY3R9IHJldHJ5T3B0aW9ucyAtIG9wdGlvbnMgdG8gY29udHJvbCByZXRyeSBiZWhhdmlvciB3aGVuIGFuXG4qICAgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RpbS1rb3Mvbm9kZS1yZXRyeSNyZXRyeW9wZXJhdGlvbm9wdGlvbnNcbiogICBCeSBkZWZhdWx0LCByZXRyaWVzIHdpbGwgbm90IGJlIHBlcmZvcm1lZFxuKiBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyByZXNwb25zZSBmcm9tIGBTMy5oZWFkT2JqZWN0YCBhcyBhIHByb21pc2VcbioqL1xuZXhwb3J0cy5oZWFkT2JqZWN0ID0gdXRpbHNfMS5pbXByb3ZlU3RhY2tUcmFjZSgoQnVja2V0LCBLZXksIHJldHJ5T3B0aW9ucyA9IHsgcmV0cmllczogMCB9KSA9PiBwX3JldHJ5XzEuZGVmYXVsdChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHNlcnZpY2VzXzEuczMoKS5oZWFkT2JqZWN0KHsgQnVja2V0LCBLZXkgfSkucHJvbWlzZSgpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLmNvZGUgPT09ICdOb3RGb3VuZCcpXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgdGhyb3cgbmV3IHBfcmV0cnlfMS5kZWZhdWx0LkFib3J0RXJyb3IoZXJyb3IpO1xuICAgIH1cbn0sIHsgbWF4VGltZW91dDogMTAwMDAsIC4uLnJldHJ5T3B0aW9ucyB9KSk7XG4vKipcbiAqIFRlc3QgaWYgYW4gb2JqZWN0IGV4aXN0cyBpbiBTM1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBzYW1lIHBhcmFtcyBhcyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy9sYXRlc3QvQVdTL1MzLmh0bWwjaGVhZE9iamVjdC1wcm9wZXJ0eVxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IGEgUHJvbWlzZSB0aGF0IHdpbGwgcmVzb2x2ZSB0byBhIGJvb2xlYW4gaW5kaWNhdGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBleGlzdHNcbiAqL1xuZXhwb3J0cy5zM09iamVjdEV4aXN0cyA9IChwYXJhbXMpID0+IGV4cG9ydHMuaGVhZE9iamVjdChwYXJhbXMuQnVja2V0LCBwYXJhbXMuS2V5KVxuICAgIC50aGVuKCgpID0+IHRydWUpXG4gICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvci5jb2RlID09PSAnTm90Rm91bmQnKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdGhyb3cgZXJyb3I7XG59KTtcbi8qKlxuICogV2FpdCBmb3IgYW4gb2JqZWN0IHRvIGV4aXN0IGluIFMzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5idWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMua2V5XG4gKiBAcGFyYW0ge251bWJlcn0gW3BhcmFtcy5pbnRlcnZhbD0xMDAwXSAtIGludGVydmFsIGJlZm9yZSByZXRyaWVzLCBpbiBtc1xuICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbXMudGltZW91dD0zMDAwMF0gLSB0aW1lb3V0LCBpbiBtc1xuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqL1xuZXhwb3J0cy53YWl0Rm9yT2JqZWN0VG9FeGlzdCA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICBjb25zdCB7IGJ1Y2tldCwga2V5LCBpbnRlcnZhbCA9IDEwMDAsIHRpbWVvdXQgPSAzMCAqIDEwMDAsIH0gPSBwYXJhbXM7XG4gICAgYXdhaXQgcF93YWl0X2Zvcl8xLmRlZmF1bHQoKCkgPT4gZXhwb3J0cy5zM09iamVjdEV4aXN0cyh7IEJ1Y2tldDogYnVja2V0LCBLZXk6IGtleSB9KSwgeyBpbnRlcnZhbCwgdGltZW91dCB9KTtcbn07XG4vKipcbiogUHV0IGFuIG9iamVjdCBvbiBTM1xuKlxuKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gc2FtZSBwYXJhbXMgYXMgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9TMy5odG1sI3B1dE9iamVjdC1wcm9wZXJ0eVxuKiBwcm9taXNlIG9mIHRoZSBvYmplY3QgYmVpbmcgcHV0XG4qKi9cbmV4cG9ydHMuczNQdXRPYmplY3QgPSB1dGlsc18xLmltcHJvdmVTdGFja1RyYWNlKChwYXJhbXMpID0+IHNlcnZpY2VzXzEuczMoKS5wdXRPYmplY3Qoe1xuICAgIEFDTDogJ3ByaXZhdGUnLFxuICAgIC4uLnBhcmFtcyxcbn0pLnByb21pc2UoKSk7XG4vKipcbiAqIFVwbG9hZCBhIGZpbGUgdG8gUzNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0IC0gdGhlIGRlc3RpbmF0aW9uIFMzIGJ1Y2tldFxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIHRoZSBkZXN0aW5hdGlvbiBTMyBrZXlcbiAqIEBwYXJhbSB7ZmlsZW5hbWV9IGZpbGVuYW1lIC0gdGhlIGxvY2FsIGZpbGUgdG8gYmUgdXBsb2FkZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICovXG5leHBvcnRzLnB1dEZpbGUgPSAoYnVja2V0LCBrZXksIGZpbGVuYW1lKSA9PiBleHBvcnRzLnMzUHV0T2JqZWN0KHtcbiAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICBLZXk6IGtleSxcbiAgICBCb2R5OiBmc18xLmRlZmF1bHQuY3JlYXRlUmVhZFN0cmVhbShmaWxlbmFtZSksXG59KTtcbi8qKlxuKiBDb3B5IGFuIG9iamVjdCBmcm9tIG9uZSBsb2NhdGlvbiBvbiBTMyB0byBhbm90aGVyXG4qXG4qIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBzYW1lIHBhcmFtcyBhcyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy9sYXRlc3QvQVdTL1MzLmh0bWwjcHV0T2JqZWN0LXByb3BlcnR5XG4qIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIG9mIHRoZSBvYmplY3QgYmVpbmcgY29waWVkXG4qKi9cbmV4cG9ydHMuczNDb3B5T2JqZWN0ID0gdXRpbHNfMS5pbXByb3ZlU3RhY2tUcmFjZSgocGFyYW1zKSA9PiBzZXJ2aWNlc18xLnMzKCkuY29weU9iamVjdCh7XG4gICAgVGFnZ2luZ0RpcmVjdGl2ZTogJ0NPUFknLFxuICAgIC4uLnBhcmFtcyxcbn0pLnByb21pc2UoKSk7XG4vKipcbiAqIFVwbG9hZCBkYXRhIHRvIFMzXG4gKlxuICogTm90ZTogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgYGF3cy5zMygpLnVwbG9hZChwYXJhbXMpLnByb21pc2UoKWBcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gc2VlIFtTMy51cGxvYWQoKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9TMy5odG1sI3VwbG9hZC1wcm9wZXJ0eSlcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBzZWUgW1MzLnVwbG9hZCgpXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy9sYXRlc3QvQVdTL1MzLmh0bWwjdXBsb2FkLXByb3BlcnR5KVxuICovXG5leHBvcnRzLnByb21pc2VTM1VwbG9hZCA9IHV0aWxzXzEuaW1wcm92ZVN0YWNrVHJhY2UoKHBhcmFtcykgPT4gc2VydmljZXNfMS5zMygpLnVwbG9hZChwYXJhbXMpLnByb21pc2UoKSk7XG4vKipcbiAqIFVwbG9hZCBkYXRhIHRvIFMzIHVzaW5nIGEgc3RyZWFtXG4gKlxuICogV2UgYXJlIG5vdCB1c2luZyBgczMudXBsb2FkKCkucHJvbWlzZSgpYCBkdWUgdG8gZXJyb3JzIG9ic2VydmVkIGluIHRlc3RpbmdcbiAqIHdpdGggdW5jYXVnaHQgZXhjZXB0aW9ucy4gQnkgY3JlYXRpbmcgb3VyIG93biBwcm9taXNlLCB3ZSBjYW4gZW5zdXJlIGFueVxuICogZXJyb3JzIGZyb20gdGhlIHN0cmVhbXMgb3IgdXBsb2FkIGNhdXNlIHRoaXMgcHJvbWlzZSB0byByZWplY3QuXG4gKlxuICogQHBhcmFtIHtSZWFkYWJsZX0gdXBsb2FkU3RyZWFtIC0gU3RyZWFtIG9mIGRhdGEgdG8gdXBsb2FkXG4gKiBAcGFyYW0ge09iamVjdH0gdXBsb2FkUGFyYW1zIC0gc2VlIFtTMy51cGxvYWQoKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9TMy5odG1sI3VwbG9hZC1wcm9wZXJ0eSlcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICovXG5leHBvcnRzLnN0cmVhbVMzVXBsb2FkID0gKHVwbG9hZFN0cmVhbSwgdXBsb2FkUGFyYW1zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcGFzcyA9IG5ldyBzdHJlYW1fMS5QYXNzVGhyb3VnaCgpO1xuICAgIHVwbG9hZFN0cmVhbS5waXBlKHBhc3MpO1xuICAgIHVwbG9hZFN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgIHBhc3Mub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICByZXR1cm4gc2VydmljZXNfMS5zMygpLnVwbG9hZCh7XG4gICAgICAgIC4uLnVwbG9hZFBhcmFtcyxcbiAgICAgICAgQm9keTogcGFzcyxcbiAgICB9LCAoZXJyLCB1cGxvYWRSZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc29sdmUodXBsb2FkUmVzcG9uc2UpO1xuICAgIH0pO1xufSk7XG4vKipcbiAqIERvd25sb2FkcyB0aGUgZ2l2ZW4gczNPYmogdG8gdGhlIGdpdmVuIGZpbGVuYW1lIGluIGEgc3RyZWFtaW5nIG1hbm5lclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzM09iaiAtIFRoZSBwYXJhbWV0ZXJzIHRvIHNlbmQgdG8gUzMgZ2V0T2JqZWN0IGNhbGxcbiAqIEBwYXJhbSB7c3RyaW5nfSBmaWxlcGF0aCAtIFRoZSBmaWxlcGF0aCBvZiB0aGUgZmlsZSB0aGF0IGlzIGRvd25sb2FkZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IHJldHVybnMgZmlsZW5hbWUgaWYgc3VjY2Vzc2Z1bFxuICovXG5leHBvcnRzLmRvd25sb2FkUzNGaWxlID0gKHMzT2JqLCBmaWxlcGF0aCkgPT4ge1xuICAgIGNvbnN0IGZpbGVXcml0ZVN0cmVhbSA9IGZzXzEuZGVmYXVsdC5jcmVhdGVXcml0ZVN0cmVhbShmaWxlcGF0aCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3Qgb2JqZWN0UmVhZFN0cmVhbSA9IHNlcnZpY2VzXzEuczMoKS5nZXRPYmplY3QoczNPYmopLmNyZWF0ZVJlYWRTdHJlYW0oKTtcbiAgICAgICAgcHVtcF8xLmRlZmF1bHQob2JqZWN0UmVhZFN0cmVhbSwgZmlsZVdyaXRlU3RyZWFtLCAoZXJyKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyKVxuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHJlc29sdmUoZmlsZXBhdGgpO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG4vKipcbiAqIEdldCB0aGUgc2l6ZSBvZiBhbiBTMyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmJ1Y2tldFxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5rZXlcbiAqIEBwYXJhbSB7QVdTLlMzfSBwYXJhbXMuczMgLSBhbiBTMyBjbGllbnQgaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcnx1bmRlZmluZWQ+fSBvYmplY3Qgc2l6ZSwgaW4gYnl0ZXNcbiAqL1xuZXhwb3J0cy5nZXRPYmplY3RTaXplID0gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBjb25zdCB7IHMzLCBidWNrZXQsIGtleSB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGhlYWRPYmplY3RSZXNwb25zZSA9IGF3YWl0IHMzLmhlYWRPYmplY3Qoe1xuICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgS2V5OiBrZXksXG4gICAgfSkucHJvbWlzZSgpO1xuICAgIHJldHVybiBoZWFkT2JqZWN0UmVzcG9uc2UuQ29udGVudExlbmd0aDtcbn07XG4vKipcbiogR2V0IG9iamVjdCBUYWdnaW5nIGZyb20gUzNcbipcbiogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIG5hbWUgb2YgYnVja2V0XG4qIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBrZXkgZm9yIG9iamVjdCAoZmlsZXBhdGggKyBmaWxlbmFtZSlcbiogQHJldHVybnMge1Byb21pc2U8QVdTLlMzLkdldE9iamVjdFRhZ2dpbmdPdXRwdXQ+fSB0aGUgcHJvbWlzZWQgcmVzcG9uc2UgZnJvbSBgUzMuZ2V0T2JqZWN0VGFnZ2luZ2BcbioqL1xuZXhwb3J0cy5zM0dldE9iamVjdFRhZ2dpbmcgPSB1dGlsc18xLmltcHJvdmVTdGFja1RyYWNlKChidWNrZXQsIGtleSkgPT4gc2VydmljZXNfMS5zMygpLmdldE9iamVjdFRhZ2dpbmcoeyBCdWNrZXQ6IGJ1Y2tldCwgS2V5OiBrZXkgfSkucHJvbWlzZSgpKTtcbmNvbnN0IGdldE9iamVjdFRhZ3MgPSBhc3luYyAoYnVja2V0LCBrZXkpID0+IHtcbiAgICBjb25zdCB0YWdnaW5nUmVzcG9uc2UgPSBhd2FpdCBleHBvcnRzLnMzR2V0T2JqZWN0VGFnZ2luZyhidWNrZXQsIGtleSk7XG4gICAgcmV0dXJuIHRhZ2dpbmdSZXNwb25zZS5UYWdTZXQucmVkdWNlKChhY2MsIHsgS2V5LCBWYWx1ZSB9KSA9PiAoeyAuLi5hY2MsIFtLZXldOiBWYWx1ZSB9KSwge30pO1xufTtcbmNvbnN0IGdldE9iamVjdFRhZ2dpbmdTdHJpbmcgPSBhc3luYyAoYnVja2V0LCBrZXkpID0+IHtcbiAgICBjb25zdCB0YWdzID0gYXdhaXQgZ2V0T2JqZWN0VGFncyhidWNrZXQsIGtleSk7XG4gICAgcmV0dXJuIHF1ZXJ5c3RyaW5nXzEuZGVmYXVsdC5zdHJpbmdpZnkodGFncyk7XG59O1xuLyoqXG4qIFB1dHMgb2JqZWN0IFRhZ2dpbmcgaW4gUzNcbiogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9TMy5odG1sI3B1dE9iamVjdFRhZ2dpbmctcHJvcGVydHlcbipcbiogQHBhcmFtIHtzdHJpbmd9IEJ1Y2tldCAtIG5hbWUgb2YgYnVja2V0XG4qIEBwYXJhbSB7c3RyaW5nfSBLZXkgLSBrZXkgZm9yIG9iamVjdCAoZmlsZXBhdGggKyBmaWxlbmFtZSlcbiogQHBhcmFtIHtPYmplY3R9IFRhZ2dpbmcgLSB0YWdnaW5nIG9iamVjdFxuKiBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyByZXNwb25zZSBmcm9tIGBTMy5nZXRPYmplY3RUYWdnaW5nYCBhcyBhIHByb21pc2VcbioqL1xuZXhwb3J0cy5zM1B1dE9iamVjdFRhZ2dpbmcgPSB1dGlsc18xLmltcHJvdmVTdGFja1RyYWNlKChCdWNrZXQsIEtleSwgVGFnZ2luZykgPT4gc2VydmljZXNfMS5zMygpLnB1dE9iamVjdFRhZ2dpbmcoe1xuICAgIEJ1Y2tldCxcbiAgICBLZXksXG4gICAgVGFnZ2luZyxcbn0pLnByb21pc2UoKSk7XG4vKipcbiAqIEdldHMgYW4gb2JqZWN0IGZyb20gUzMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IG9iaiA9IGF3YWl0IGdldE9iamVjdChzMygpLCB7IEJ1Y2tldDogJ2InLCBLZXk6ICdrJyB9KVxuICpcbiAqIEBwYXJhbSB7QVdTLlMzfSBzMyAtIGFuIGBBV1MuUzNgIGluc3RhbmNlXG4gKiBAcGFyYW0ge0FXUy5TMy5HZXRPYmplY3RSZXF1ZXN0fSBwYXJhbXMgLSBwYXJhbWV0ZXJzIG9iamVjdCB0byBwYXNzIHRocm91Z2hcbiAqICAgdG8gYEFXUy5TMy5nZXRPYmplY3QoKWBcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFXUy5TMy5HZXRPYmplY3RPdXRwdXQ+fSByZXNwb25zZSBmcm9tIGBBV1MuUzMuZ2V0T2JqZWN0KClgXG4gKiAgIGFzIGEgUHJvbWlzZVxuICovXG5leHBvcnRzLmdldE9iamVjdCA9IChcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbnMzLCBwYXJhbXMpID0+IHMzLmdldE9iamVjdChwYXJhbXMpLnByb21pc2UoKTtcbi8qKlxuICogR2V0IGFuIG9iamVjdCBmcm9tIFMzLCB3YWl0aW5nIGZvciBpdCB0byBleGlzdCBhbmQsIGlmIHNwZWNpZmllZCwgaGF2ZSB0aGVcbiAqIGNvcnJlY3QgRVRhZy5cbiAqXG4gKiBAcGFyYW0ge0FXUy5TM30gczNDbGllbnRcbiAqIEBwYXJhbSB7QVdTLlMzLkdldE9iamVjdFJlcXVlc3R9IHBhcmFtc1xuICogQHBhcmFtIHtwUmV0cnkuT3B0aW9uc30gW3JldHJ5T3B0aW9ucz17fV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPEFXUy5TMy5HZXRPYmplY3RPdXRwdXQ+fVxuICovXG5leHBvcnRzLndhaXRGb3JPYmplY3QgPSAoczNDbGllbnQsIHBhcmFtcywgcmV0cnlPcHRpb25zID0ge30pID0+IHBfcmV0cnlfMS5kZWZhdWx0KGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZXhwb3J0cy5nZXRPYmplY3QoczNDbGllbnQsIHBhcmFtcyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBSZXRyeSBpZiB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnTm9TdWNoS2V5JylcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAvLyBSZXRyeSBpZiB0aGUgZXRhZyBkaWQgbm90IG1hdGNoXG4gICAgICAgIGlmIChwYXJhbXMuSWZNYXRjaCAmJiBlcnJvci5jb2RlID09PSAnUHJlY29uZGl0aW9uRmFpbGVkJylcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAvLyBGb3IgYW55IG90aGVyIGVycm9yLCBmYWlsIHdpdGhvdXQgcmV0cnlpbmdcbiAgICAgICAgdGhyb3cgbmV3IHBfcmV0cnlfMS5kZWZhdWx0LkFib3J0RXJyb3IoZXJyb3IpO1xuICAgIH1cbn0sIHJldHJ5T3B0aW9ucyk7XG4vKipcbiAqIEdldHMgYW4gb2JqZWN0IGZyb20gUzMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IEJ1Y2tldCAtIG5hbWUgb2YgYnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gS2V5IC0ga2V5IGZvciBvYmplY3QgKGZpbGVwYXRoICsgZmlsZW5hbWUpXG4gKiBAcGFyYW0ge09iamVjdH0gcmV0cnlPcHRpb25zIC0gb3B0aW9ucyB0byBjb250cm9sIHJldHJ5IGJlaGF2aW9yIHdoZW4gYW5cbiAqICAgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RpbS1rb3Mvbm9kZS1yZXRyeSNyZXRyeW9wZXJhdGlvbm9wdGlvbnNcbiAqICAgQnkgZGVmYXVsdCwgcmV0cmllcyB3aWxsIG5vdCBiZSBwZXJmb3JtZWRcbiAqIEByZXR1cm5zIHtQcm9taXNlfSByZXR1cm5zIHJlc3BvbnNlIGZyb20gYFMzLmdldE9iamVjdGAgYXMgYSBwcm9taXNlXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0cy5nZXRTM09iamVjdCA9IHV0aWxfMS5kZXByZWNhdGUodXRpbHNfMS5pbXByb3ZlU3RhY2tUcmFjZSgoQnVja2V0LCBLZXksIHJldHJ5T3B0aW9ucyA9IHsgcmV0cmllczogMCB9KSA9PiBleHBvcnRzLndhaXRGb3JPYmplY3Qoc2VydmljZXNfMS5zMygpLCB7IEJ1Y2tldCwgS2V5IH0sIHtcbiAgICBtYXhUaW1lb3V0OiAxMDAwMCxcbiAgICBvbkZhaWxlZEF0dGVtcHQ6IChlcnIpID0+IGxvZy5kZWJ1ZyhgZ2V0UzNPYmplY3QoJyR7QnVja2V0fScsICcke0tleX0nKSBmYWlsZWQgd2l0aCAke2Vyci5yZXRyaWVzTGVmdH0gcmV0cmllcyBsZWZ0OiAke2Vyci5tZXNzYWdlfWApLFxuICAgIC4uLnJldHJ5T3B0aW9ucyxcbn0pKSwgYnVpbGREZXByZWNhdGlvbk1lc3NhZ2UoJ0BjdW11bHVzL2F3cy1jbGllbnQvUzMuZ2V0UzNPYmplY3QnLCAnMi4wLjEnLCAnQGN1bXVsdXMvYXdzLWNsaWVudC9TMy5nZXRPYmplY3Qgb3IgQGN1bXVsdXMvYXdzLWNsaWVudC9TMy53YWl0Rm9yT2JqZWN0JykpO1xuLyoqXG4gKiBGZXRjaCB0aGUgY29udGVudHMgb2YgYW4gUzMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIHRoZSBTMyBvYmplY3QncyBidWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSB0aGUgUzMgb2JqZWN0J3Mga2V5XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSB0aGUgY29udGVudHMgb2YgdGhlIFMzIG9iamVjdFxuICovXG5leHBvcnRzLmdldFRleHRPYmplY3QgPSAoYnVja2V0LCBrZXkpID0+IGV4cG9ydHMuZ2V0UzNPYmplY3QoYnVja2V0LCBrZXkpXG4gICAgLnRoZW4oKHsgQm9keSB9KSA9PiB7XG4gICAgaWYgKEJvZHkgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gQm9keS50b1N0cmluZygpO1xufSk7XG4vKipcbiAqIEZldGNoIEpTT04gc3RvcmVkIGluIGFuIFMzIG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIHRoZSBTMyBvYmplY3QncyBidWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSB0aGUgUzMgb2JqZWN0J3Mga2V5XG4gKiBAcmV0dXJucyB7UHJvbWlzZTwqPn0gdGhlIGNvbnRlbnRzIG9mIHRoZSBTMyBvYmplY3QsIHBhcnNlZCBhcyBKU09OXG4gKi9cbmV4cG9ydHMuZ2V0SnNvblMzT2JqZWN0ID0gKGJ1Y2tldCwga2V5KSA9PiBleHBvcnRzLmdldFRleHRPYmplY3QoYnVja2V0LCBrZXkpXG4gICAgLnRoZW4oKHRleHQpID0+IHtcbiAgICBpZiAodGV4dCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBKU09OLnBhcnNlKHRleHQpO1xufSk7XG5leHBvcnRzLnB1dEpzb25TM09iamVjdCA9IChidWNrZXQsIGtleSwgZGF0YSkgPT4gZXhwb3J0cy5zM1B1dE9iamVjdCh7XG4gICAgQnVja2V0OiBidWNrZXQsXG4gICAgS2V5OiBrZXksXG4gICAgQm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG59KTtcbi8qKlxuICogR2V0IGEgcmVhZGFibGUgc3RyZWFtIGZvciBhbiBTMyBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge0FXUy5TM30gcGFyYW1zLnMzIC0gYW4gQVdTLlMzIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmJ1Y2tldCAtIHRoZSBidWNrZXQgb2YgdGhlIHJlcXVlc3RlZCBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMua2V5IC0gdGhlIGtleSBvZiB0aGUgcmVxdWVzdGVkIG9iamVjdFxuICogQHJldHVybnMge1JlYWRhYmxlfVxuICovXG5leHBvcnRzLmdldE9iamVjdFJlYWRTdHJlYW0gPSAocGFyYW1zKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGNvbnN0IHsgczMsIGJ1Y2tldCwga2V5IH0gPSBwYXJhbXM7XG4gICAgcmV0dXJuIHMzLmdldE9iamVjdCh7IEJ1Y2tldDogYnVja2V0LCBLZXk6IGtleSB9KS5jcmVhdGVSZWFkU3RyZWFtKCk7XG59O1xuLyoqXG4qIENoZWNrIGlmIGEgZmlsZSBleGlzdHMgaW4gYW4gUzMgb2JqZWN0XG4qXG4qIEBwYXJhbSB7c3RyaW5nfSBidWNrZXQgLSBuYW1lIG9mIHRoZSBTMyBidWNrZXRcbiogQHBhcmFtIHtzdHJpbmd9IGtleSAtIGtleSBvZiB0aGUgZmlsZSBpbiB0aGUgUzMgYnVja2V0XG4qIEByZXR1cm5zIHtQcm9taXNlfSByZXR1cm5zIHRoZSByZXNwb25zZSBmcm9tIGBTMy5oZWFkT2JqZWN0YCBhcyBhIHByb21pc2VcbioqL1xuZXhwb3J0cy5maWxlRXhpc3RzID0gYXN5bmMgKGJ1Y2tldCwga2V5KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlcnZpY2VzXzEuczMoKS5oZWFkT2JqZWN0KHsgS2V5OiBrZXksIEJ1Y2tldDogYnVja2V0IH0pLnByb21pc2UoKTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBpZiBmaWxlIGlzIG5vdCByZXR1cm4gZmFsc2VcbiAgICAgICAgaWYgKGVycm9yLnN0YWNrLm1hdGNoKC8oTm90Rm91bmQpLykgfHwgZXJyb3Iuc3RhY2subWF0Y2goLyhOb1N1Y2hCdWNrZXQpLykpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59O1xuZXhwb3J0cy5kb3dubG9hZFMzRmlsZXMgPSBhc3luYyAoczNPYmpzLCBkaXIsIHMzb3B0cyA9IHt9KSA9PiB7XG4gICAgLy8gU2NydWIgczNPamJzIHRvIGF2b2lkIGVycm9ycyBmcm9tIHRoZSBBV1MgU0RLXG4gICAgY29uc3Qgc2NydWJiZWRTM09ianMgPSBzM09ianMubWFwKChzM09iaikgPT4gKHtcbiAgICAgICAgQnVja2V0OiBzM09iai5CdWNrZXQsXG4gICAgICAgIEtleTogczNPYmouS2V5LFxuICAgIH0pKTtcbiAgICBsZXQgaSA9IDA7XG4gICAgY29uc3QgbiA9IHMzT2Jqcy5sZW5ndGg7XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nIGRvd25sb2FkIG9mICR7bn0ga2V5cyB0byAke2Rpcn1gKTtcbiAgICBjb25zdCBwcm9taXNlRG93bmxvYWQgPSAoczNPYmopID0+IHtcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBwYXRoXzEuZGVmYXVsdC5qb2luKGRpciwgcGF0aF8xLmRlZmF1bHQuYmFzZW5hbWUoczNPYmouS2V5KSk7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBmc18xLmRlZmF1bHQuY3JlYXRlV3JpdGVTdHJlYW0oZmlsZW5hbWUpO1xuICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbihzM09iaiwgczNvcHRzKTtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHNlcnZpY2VzXzEuczMoKS5nZXRPYmplY3Qob3B0cylcbiAgICAgICAgICAgICAgICAuY3JlYXRlUmVhZFN0cmVhbSgpXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsZSlcbiAgICAgICAgICAgICAgICAub24oJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsb2cuaW5mbyhgUHJvZ3Jlc3M6IFske2l9IG9mICR7bn1dIHMzOi8vJHtzM09iai5CdWNrZXR9LyR7czNPYmouS2V5fSAtPiAke2ZpbGVuYW1lfWApO1xuICAgICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZShzM09iai5LZXkpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICByZXR1cm4gYXdhaXQgcF9tYXBfMS5kZWZhdWx0KHNjcnViYmVkUzNPYmpzLCBwcm9taXNlRG93bmxvYWQsIHsgY29uY3VycmVuY3k6IFMzX1JBVEVfTElNSVQgfSk7XG59O1xuLyoqXG4gKiBEZWxldGUgZmlsZXMgZnJvbSBTM1xuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHMzT2JqcyAtIEFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyBrZXlzICdCdWNrZXQnIGFuZCAnS2V5J1xuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIEFycmF5IG9mIHRoZSBkYXRhIHJldHVybmVkXG4gKiAgIGZyb20gdGhlIGRlbGV0aW9uIG9wZXJhdGlvbnNcbiAqL1xuZXhwb3J0cy5kZWxldGVTM0ZpbGVzID0gYXN5bmMgKHMzT2JqcykgPT4gYXdhaXQgcF9tYXBfMS5kZWZhdWx0KHMzT2JqcywgKHMzT2JqKSA9PiBzZXJ2aWNlc18xLnMzKCkuZGVsZXRlT2JqZWN0KHMzT2JqKS5wcm9taXNlKCksIHsgY29uY3VycmVuY3k6IFMzX1JBVEVfTElNSVQgfSk7XG4vKipcbiogRGVsZXRlIGEgYnVja2V0IGFuZCBhbGwgb2YgaXRzIG9iamVjdHMgZnJvbSBTM1xuKlxuKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0IC0gbmFtZSBvZiB0aGUgYnVja2V0XG4qIEByZXR1cm5zIHtQcm9taXNlfSB0aGUgcHJvbWlzZWQgcmVzdWx0IG9mIGBTMy5kZWxldGVCdWNrZXRgXG4qKi9cbmV4cG9ydHMucmVjdXJzaXZlbHlEZWxldGVTM0J1Y2tldCA9IHV0aWxzXzEuaW1wcm92ZVN0YWNrVHJhY2UoYXN5bmMgKGJ1Y2tldCkgPT4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VydmljZXNfMS5zMygpLmxpc3RPYmplY3RzKHsgQnVja2V0OiBidWNrZXQgfSkucHJvbWlzZSgpO1xuICAgIGNvbnN0IHMzT2JqZWN0cyA9IChyZXNwb25zZS5Db250ZW50cyB8fCBbXSkubWFwKChvKSA9PiB7XG4gICAgICAgIGlmICghby5LZXkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRlcm1pbmUgUzMga2V5IG9mICR7SlNPTi5zdHJpbmdpZnkobyl9YCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICAgIEtleTogby5LZXksXG4gICAgICAgIH07XG4gICAgfSk7XG4gICAgYXdhaXQgZXhwb3J0cy5kZWxldGVTM0ZpbGVzKHMzT2JqZWN0cyk7XG4gICAgYXdhaXQgc2VydmljZXNfMS5zMygpLmRlbGV0ZUJ1Y2tldCh7IEJ1Y2tldDogYnVja2V0IH0pLnByb21pc2UoKTtcbn0pO1xuLyoqXG4qIERlbGV0ZSBhIGxpc3Qgb2YgYnVja2V0cyBhbmQgYWxsIG9mIHRoZWlyIG9iamVjdHMgZnJvbSBTM1xuKlxuKiBAcGFyYW0ge0FycmF5fSBidWNrZXRzIC0gbGlzdCBvZiBidWNrZXQgbmFtZXNcbiogQHJldHVybnMge1Byb21pc2V9IHRoZSBwcm9taXNlZCByZXN1bHQgb2YgYFMzLmRlbGV0ZUJ1Y2tldGBcbioqL1xuZXhwb3J0cy5kZWxldGVTM0J1Y2tldHMgPSBhc3luYyAoYnVja2V0cykgPT4gYXdhaXQgUHJvbWlzZS5hbGwoYnVja2V0cy5tYXAoZXhwb3J0cy5yZWN1cnNpdmVseURlbGV0ZVMzQnVja2V0KSk7XG5leHBvcnRzLnVwbG9hZFMzRmlsZXMgPSBhc3luYyAoZmlsZXMsIGRlZmF1bHRCdWNrZXQsIGtleVBhdGgsIHMzb3B0cyA9IHt9KSA9PiB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IG4gPSBmaWxlcy5sZW5ndGg7XG4gICAgaWYgKG4gPiAxKSB7XG4gICAgICAgIGxvZy5pbmZvKGBTdGFydGluZyB1cGxvYWQgb2YgJHtufSBrZXlzYCk7XG4gICAgfVxuICAgIGNvbnN0IHByb21pc2VVcGxvYWQgPSBhc3luYyAoZmlsZSkgPT4ge1xuICAgICAgICBsZXQgYnVja2V0O1xuICAgICAgICBsZXQgZmlsZW5hbWU7XG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIGlmICh0eXBlb2YgZmlsZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGJ1Y2tldCA9IGRlZmF1bHRCdWNrZXQ7XG4gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGtleVBhdGggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAga2V5ID0gZXhwb3J0cy5zM0pvaW4oa2V5UGF0aCwgcGF0aF8xLmRlZmF1bHQuYmFzZW5hbWUoZmlsZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAga2V5ID0ga2V5UGF0aChmaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1Y2tldCA9IGZpbGUuYnVja2V0IHx8IGRlZmF1bHRCdWNrZXQ7XG4gICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGUuZmlsZW5hbWU7XG4gICAgICAgICAgICBrZXkgPSBmaWxlLmtleTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBleHBvcnRzLnByb21pc2VTM1VwbG9hZCh7XG4gICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICAgIEtleToga2V5LFxuICAgICAgICAgICAgQm9keTogZnNfMS5kZWZhdWx0LmNyZWF0ZVJlYWRTdHJlYW0oZmlsZW5hbWUpLFxuICAgICAgICAgICAgLi4uczNvcHRzLFxuICAgICAgICB9KTtcbiAgICAgICAgaSArPSAxO1xuICAgICAgICBsb2cuaW5mbyhgUHJvZ3Jlc3M6IFske2l9IG9mICR7bn1dICR7ZmlsZW5hbWV9IC0+IHMzOi8vJHtidWNrZXR9LyR7a2V5fWApO1xuICAgICAgICByZXR1cm4geyBrZXksIGJ1Y2tldCB9O1xuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IHBfbWFwXzEuZGVmYXVsdChmaWxlcywgcHJvbWlzZVVwbG9hZCwgeyBjb25jdXJyZW5jeTogUzNfUkFURV9MSU1JVCB9KTtcbn07XG4vKipcbiAqIFVwbG9hZCB0aGUgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHN0cmVhbSB0byBhbiBTMyBidWNrZXRcbiAqXG4gKiBAcGFyYW0ge1JlYWRhYmxlU3RyZWFtfSBmaWxlU3RyZWFtIC0gVGhlIHN0cmVhbSBmb3IgdGhlIGZpbGUncyBjb250ZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIFRoZSBTMyBidWNrZXQgdG8gd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmUgdXBsb2FkZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHRoZSBmaWxlIGluIHRoZSBidWNrZXRcbiAqIEBwYXJhbSB7T2JqZWN0fSBzM29wdHMgLSBPcHRpb25zIHRvIHBhc3MgdG8gdGhlIEFXUyBzZGsgY2FsbCAoZGVmYXVsdHMgdG8gYHt9YClcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2VcbiAqL1xuZXhwb3J0cy51cGxvYWRTM0ZpbGVTdHJlYW0gPSAoZmlsZVN0cmVhbSwgYnVja2V0LCBrZXksIHMzb3B0cyA9IHt9KSA9PiBleHBvcnRzLnByb21pc2VTM1VwbG9hZCh7XG4gICAgQnVja2V0OiBidWNrZXQsXG4gICAgS2V5OiBrZXksXG4gICAgQm9keTogZmlsZVN0cmVhbSxcbiAgICAuLi5zM29wdHMsXG59KTtcbi8qKlxuICogTGlzdCB0aGUgb2JqZWN0cyBpbiBhbiBTMyBidWNrZXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0IC0gVGhlIG5hbWUgb2YgdGhlIGJ1Y2tldFxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeCAtIE9ubHkgb2JqZWN0cyB3aXRoIGtleXMgc3RhcnRpbmcgd2l0aCB0aGlzIHByZWZpeFxuICogICB3aWxsIGJlIGluY2x1ZGVkICh1c2VmdWwgZm9yIHNlYXJjaGluZyBmb2xkZXJzIGluIGJ1Y2tldHMsIGUuZy4sICcvUERSJylcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2tpcEZvbGRlcnMgLSBJZiB0cnVlIGRvbid0IHJldHVybiBvYmplY3RzIHRoYXQgYXJlIGZvbGRlcnNcbiAqICAgKGRlZmF1bHRzIHRvIHRydWUpXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cy4gRWFjaCBTM1xuICogICBvYmplY3QgaXMgcmVwcmVzZW50ZWQgYXMgYSBKUyBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6IGBLZXlgLFxuICogYEVUYWdgLCBgTGFzdE1vZGlmaWVkYCwgYE93bmVyYCwgYFNpemVgLCBgU3RvcmFnZUNsYXNzYC5cbiAqL1xuZXhwb3J0cy5saXN0UzNPYmplY3RzID0gYXN5bmMgKGJ1Y2tldCwgcHJlZml4LCBza2lwRm9sZGVycyA9IHRydWUpID0+IHtcbiAgICBsb2cuaW5mbyhgTGlzdGluZyBvYmplY3RzIGluIHMzOi8vJHtidWNrZXR9YCk7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICB9O1xuICAgIGlmIChwcmVmaXgpXG4gICAgICAgIHBhcmFtcy5QcmVmaXggPSBwcmVmaXg7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHNlcnZpY2VzXzEuczMoKS5saXN0T2JqZWN0cyhwYXJhbXMpLnByb21pc2UoKTtcbiAgICBsZXQgY29udGVudHMgPSBkYXRhLkNvbnRlbnRzIHx8IFtdO1xuICAgIGlmIChza2lwRm9sZGVycykge1xuICAgICAgICAvLyBGaWx0ZXIgb3V0IGFueSByZWZlcmVuY2VzIHRvIGZvbGRlcnNcbiAgICAgICAgY29udGVudHMgPSBjb250ZW50cy5maWx0ZXIoKG9iaikgPT4gb2JqLktleSAhPT0gdW5kZWZpbmVkICYmICFvYmouS2V5LmVuZHNXaXRoKCcvJykpO1xuICAgIH1cbiAgICByZXR1cm4gY29udGVudHM7XG59O1xuLyoqXG4gKiBGZXRjaCBjb21wbGV0ZSBsaXN0IG9mIFMzIG9iamVjdHNcbiAqXG4gKiBsaXN0T2JqZWN0c1YyIGlzIGxpbWl0ZWQgdG8gMSwwMDAgcmVzdWx0cyBwZXIgY2FsbC4gIFRoaXMgZnVuY3Rpb24gY29udGludWVzXG4gKiBsaXN0aW5nIG9iamVjdHMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgdG8gYmUgZmV0Y2hlZC5cbiAqXG4gKiBUaGUgcGFzc2VkIHBhcmFtcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgbGlzdE9iamVjdHNWMiBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvUzMuaHRtbCNsaXN0T2JqZWN0c1YyLXByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtcyBmb3IgdGhlIHMzLmxpc3RPYmplY3RzVjIgY2FsbFxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk+fSByZXNvbHZlcyB0byBhbiBhcnJheSBvZiBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG9cbiAqICAgdGhlIENvbnRlbnRzIHByb3BlcnR5IG9mIHRoZSBsaXN0T2JqZWN0c1YyIHJlc3BvbnNlXG4gKlxuICogQHN0YXRpY1xuICovXG5leHBvcnRzLmxpc3RTM09iamVjdHNWMiA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICAvLyBGZXRjaCB0aGUgZmlyc3QgbGlzdCBvZiBvYmplY3RzIGZyb20gUzNcbiAgICBsZXQgbGlzdE9iamVjdHNSZXNwb25zZSA9IChhd2FpdCBzZXJ2aWNlc18xLnMzKCkubGlzdE9iamVjdHNWMihwYXJhbXMpLnByb21pc2UoKSk7XG4gICAgbGV0IGRpc2NvdmVyZWRPYmplY3RzID0gbGlzdE9iamVjdHNSZXNwb25zZS5Db250ZW50cztcbiAgICAvLyBLZWVwIGxpc3RpbmcgbW9yZSBvYmplY3RzIGZyb20gUzMgdW50aWwgd2UgaGF2ZSBhbGwgb2YgdGhlbVxuICAgIHdoaWxlIChsaXN0T2JqZWN0c1Jlc3BvbnNlLklzVHJ1bmNhdGVkKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgIGxpc3RPYmplY3RzUmVzcG9uc2UgPSAoYXdhaXQgc2VydmljZXNfMS5zMygpLmxpc3RPYmplY3RzVjIoXG4gICAgICAgIC8vIFVwZGF0ZSB0aGUgcGFyYW1zIHdpdGggYSBDb250aW51YXRpb24gVG9rZW5cbiAgICAgICAge1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgQ29udGludWF0aW9uVG9rZW46IGxpc3RPYmplY3RzUmVzcG9uc2UuTmV4dENvbnRpbnVhdGlvblRva2VuLFxuICAgICAgICB9KS5wcm9taXNlKCkpO1xuICAgICAgICBkaXNjb3ZlcmVkT2JqZWN0cyA9IGRpc2NvdmVyZWRPYmplY3RzLmNvbmNhdChsaXN0T2JqZWN0c1Jlc3BvbnNlLkNvbnRlbnRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpc2NvdmVyZWRPYmplY3RzO1xufTtcbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBjcnlwdG9ncmFwaGljIGhhc2ggb2YgYW4gUzMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtBV1MuUzN9IHBhcmFtcy5zMyAtIGFuIEFXUy5TMyBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hbGdvcml0aG0gLSBgY2tzdW1gLCBvciBhbiBhbGdvcml0aG0gbGlzdGVkIGluXG4gKiAgIGBvcGVuc3NsIGxpc3QgLWRpZ2VzdC1hbGdvcml0aG1zYFxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5idWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMua2V5XG4gKi9cbmV4cG9ydHMuY2FsY3VsYXRlT2JqZWN0SGFzaCA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgY29uc3QgeyBhbGdvcml0aG0sIGJ1Y2tldCwga2V5LCBzMyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHN0cmVhbSA9IGV4cG9ydHMuZ2V0T2JqZWN0UmVhZFN0cmVhbSh7IHMzLCBidWNrZXQsIGtleSB9KTtcbiAgICByZXR1cm4gYXdhaXQgY2hlY2tzdW1fMS5nZW5lcmF0ZUNoZWNrc3VtRnJvbVN0cmVhbShhbGdvcml0aG0sIHN0cmVhbSk7XG59O1xuLyoqXG4gKiBWYWxpZGF0ZSBTMyBvYmplY3QgY2hlY2tzdW0gYWdhaW5zdCBleHBlY3RlZCBzdW1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmFsZ29yaXRobSAtIGNoZWNrc3VtIGFsZ29yaXRobVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5idWNrZXQgLSBTMyBidWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMua2V5IC0gUzMga2V5XG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHBhcmFtcy5leHBlY3RlZFN1bSAtIGV4cGVjdGVkIGNoZWNrc3VtXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5vcHRpb25zXSAtIGNyeXB0by5jcmVhdGVIYXNoIG9wdGlvbnNcbiAqXG4gKiBAdGhyb3dzIHtJbnZhbGlkQ2hlY2tzdW19IC0gVGhyb3dzIGVycm9yIGlmIHZhbGlkYXRpb24gZmFpbHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSByZXR1cm5zIHRydWUgZm9yIHN1Y2Nlc3NcbiAqL1xuZXhwb3J0cy52YWxpZGF0ZVMzT2JqZWN0Q2hlY2tzdW0gPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgeyBhbGdvcml0aG0sIGJ1Y2tldCwga2V5LCBleHBlY3RlZFN1bSwgb3B0aW9ucyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IGZpbGVTdHJlYW0gPSBleHBvcnRzLmdldE9iamVjdFJlYWRTdHJlYW0oeyBzMzogc2VydmljZXNfMS5zMygpLCBidWNrZXQsIGtleSB9KTtcbiAgICBpZiAoYXdhaXQgY2hlY2tzdW1fMS52YWxpZGF0ZUNoZWNrc3VtRnJvbVN0cmVhbShhbGdvcml0aG0sIGZpbGVTdHJlYW0sIGV4cGVjdGVkU3VtLCBvcHRpb25zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgbXNnID0gYEludmFsaWQgY2hlY2tzdW0gZm9yIFMzIG9iamVjdCBzMzovLyR7YnVja2V0fS8ke2tleX0gd2l0aCB0eXBlICR7YWxnb3JpdGhtfSBhbmQgZXhwZWN0ZWQgc3VtICR7ZXhwZWN0ZWRTdW19YDtcbiAgICB0aHJvdyBuZXcgZXJyb3JzXzEuSW52YWxpZENoZWNrc3VtKG1zZyk7XG59O1xuLyoqXG4gKiBFeHRyYWN0IHRoZSBTMyBidWNrZXQgYW5kIGtleSBmcm9tIHRoZSBVUkwgcGF0aCBwYXJhbWV0ZXJzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhQYXJhbXMgLSBwYXRoIHBhcmFtZXRlcnMgZnJvbSB0aGUgVVJMXG4gKiBidWNrZXQva2V5IGluIHRoZSBmb3JtIG9mXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gYFtCdWNrZXQsIEtleV1gXG4gKi9cbmV4cG9ydHMuZ2V0RmlsZUJ1Y2tldEFuZEtleSA9IChwYXRoUGFyYW1zKSA9PiB7XG4gICAgY29uc3QgW0J1Y2tldCwgLi4uZmllbGRzXSA9IHBhdGhQYXJhbXMuc3BsaXQoJy8nKTtcbiAgICBjb25zdCBLZXkgPSBmaWVsZHMuam9pbignLycpO1xuICAgIGlmIChCdWNrZXQubGVuZ3RoID09PSAwIHx8IEtleS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlVucGFyc2FibGVGaWxlTG9jYXRpb25FcnJvcihgRmlsZSBsb2NhdGlvbiBcIiR7cGF0aFBhcmFtc31cIiBjb3VsZCBub3QgYmUgcGFyc2VkYCk7XG4gICAgfVxuICAgIHJldHVybiBbQnVja2V0LCBLZXldO1xufTtcbi8qKlxuICogQ3JlYXRlIGFuIFMzIGJ1Y2tldFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBCdWNrZXQgLSB0aGUgbmFtZSBvZiB0aGUgUzMgYnVja2V0IHRvIGNyZWF0ZVxuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmV4cG9ydHMuY3JlYXRlQnVja2V0ID0gKEJ1Y2tldCkgPT4gc2VydmljZXNfMS5zMygpLmNyZWF0ZUJ1Y2tldCh7IEJ1Y2tldCB9KS5wcm9taXNlKCk7XG4vKipcbiAqIENyZWF0ZSBtdWx0aXBsZSBTMyBidWNrZXRzXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBidWNrZXRzIC0gdGhlIG5hbWVzIG9mIHRoZSBTMyBidWNrZXRzIHRvIGNyZWF0ZVxuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmV4cG9ydHMuY3JlYXRlUzNCdWNrZXRzID0gYXN5bmMgKGJ1Y2tldHMpID0+IGF3YWl0IFByb21pc2UuYWxsKGJ1Y2tldHMubWFwKGV4cG9ydHMuY3JlYXRlQnVja2V0KSk7XG5jb25zdCBjcmVhdGVNdWx0aXBhcnRVcGxvYWQgPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgdXBsb2FkUGFyYW1zID0ge1xuICAgICAgICBCdWNrZXQ6IHBhcmFtcy5kZXN0aW5hdGlvbkJ1Y2tldCxcbiAgICAgICAgS2V5OiBwYXJhbXMuZGVzdGluYXRpb25LZXksXG4gICAgICAgIEFDTDogcGFyYW1zLkFDTCxcbiAgICAgICAgQ29udGVudFR5cGU6IHBhcmFtcy5jb250ZW50VHlwZSxcbiAgICB9O1xuICAgIGlmIChwYXJhbXMuY29weVRhZ3MpIHtcbiAgICAgICAgdXBsb2FkUGFyYW1zLlRhZ2dpbmcgPSBhd2FpdCBnZXRPYmplY3RUYWdnaW5nU3RyaW5nKHBhcmFtcy5zb3VyY2VCdWNrZXQsIHBhcmFtcy5zb3VyY2VLZXkpO1xuICAgIH1cbiAgICAvLyBDcmVhdGUgYSBtdWx0aS1wYXJ0IHVwbG9hZCAoY29weSkgYW5kIGdldCBpdHMgVXBsb2FkSWRcbiAgICBjb25zdCB7IFVwbG9hZElkIH0gPSBhd2FpdCBTM011bHRpcGFydFVwbG9hZHMuY3JlYXRlTXVsdGlwYXJ0VXBsb2FkKHVwbG9hZFBhcmFtcyk7XG4gICAgaWYgKFVwbG9hZElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gY3JlYXRlIG11bHRpcGFydCB1cGxvYWQnKTtcbiAgICB9XG4gICAgcmV0dXJuIFVwbG9hZElkO1xufTtcbi8vIFRoaXMgcGVyZm9ybXMgYW4gUzMgYHVwbG9hZFBhcnRDb3B5YCBjYWxsLiBUaGF0IHJlc3BvbnNlIGluY2x1ZGVzIGFuIGBFVGFnYFxuLy8gdmFsdWUgc3BlY2lmaWMgdG8gdGhlIHBhcnQgdGhhdCB3YXMgdXBsb2FkZWQuIFdoZW4gYGNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkYFxuLy8gaXMgY2FsbGVkIGxhdGVyLCBpdCBuZWVkcyB0aGF0IGBFVGFnYCB2YWx1ZSwgYXMgd2VsbCBhcyB0aGUgYFBhcnROdW1iZXJgIGZvclxuLy8gZWFjaCBwYXJ0LiBTaW5jZSB0aGUgYFBhcnROdW1iZXJgIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYHVwbG9hZFBhcnRDb3B5YFxuLy8gcmVzcG9uc2UsIHdlIGFyZSBhZGRpbmcgaXQgaGVyZSB0byBtYWtlIG91ciBsaXZlcyBlYXNpZXIgd2hlbiB3ZSBldmVudHVhbGx5XG4vLyBjYWxsIGBjb21wbGV0ZU11bHRpcGFydFVwbG9hZGAuXG5jb25zdCB1cGxvYWRQYXJ0Q29weSA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IFMzTXVsdGlwYXJ0VXBsb2Fkcy51cGxvYWRQYXJ0Q29weSh7XG4gICAgICAgIFVwbG9hZElkOiBwYXJhbXMudXBsb2FkSWQsXG4gICAgICAgIEJ1Y2tldDogcGFyYW1zLmRlc3RpbmF0aW9uQnVja2V0LFxuICAgICAgICBLZXk6IHBhcmFtcy5kZXN0aW5hdGlvbktleSxcbiAgICAgICAgUGFydE51bWJlcjogcGFyYW1zLnBhcnROdW1iZXIsXG4gICAgICAgIENvcHlTb3VyY2U6IGAvJHtwYXJhbXMuc291cmNlQnVja2V0fS8ke3BhcmFtcy5zb3VyY2VLZXl9YCxcbiAgICAgICAgQ29weVNvdXJjZVJhbmdlOiBgYnl0ZXM9JHtwYXJhbXMuc3RhcnR9LSR7cGFyYW1zLmVuZH1gLFxuICAgIH0pO1xuICAgIGlmIChyZXNwb25zZS5Db3B5UGFydFJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRGlkIG5vdCBnZXQgRVRhZyBmcm9tIHVwbG9hZFBhcnRDb3B5Jyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIEVUYWc6IHJlc3BvbnNlLkNvcHlQYXJ0UmVzdWx0LkVUYWcsXG4gICAgICAgIFBhcnROdW1iZXI6IHBhcmFtcy5wYXJ0TnVtYmVyLFxuICAgIH07XG59O1xuLyoqXG4gKiBDb3B5IGFuIFMzIG9iamVjdCB0byBhbm90aGVyIGxvY2F0aW9uIGluIFMzIHVzaW5nIGEgbXVsdGlwYXJ0IGNvcHlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZUJ1Y2tldFxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zb3VyY2VLZXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuZGVzdGluYXRpb25CdWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuZGVzdGluYXRpb25LZXlcbiAqIEBwYXJhbSB7QVdTLlMzLkhlYWRPYmplY3RPdXRwdXR9IFtwYXJhbXMuc291cmNlT2JqZWN0XVxuICogICBPdXRwdXQgZnJvbSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy9sYXRlc3QvQVdTL1MzLmh0bWwjaGVhZE9iamVjdC1wcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuQUNMXSAtIGFuIFtTMyBDYW5uZWQgQUNMXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9hY2wtb3ZlcnZpZXcuaHRtbCNjYW5uZWQtYWNsKVxuICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1zLmNvcHlUYWdzPWZhbHNlXVxuICogQHJldHVybnMge1Byb21pc2UuPHsgZXRhZzogc3RyaW5nIH0+fSBvYmplY3QgY29udGFpbmluZyB0aGUgRVRhZyBvZiB0aGVcbiAqICAgIGRlc3RpbmF0aW9uIG9iamVjdFxuICovXG5leHBvcnRzLm11bHRpcGFydENvcHlPYmplY3QgPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHsgc291cmNlQnVja2V0LCBzb3VyY2VLZXksIGRlc3RpbmF0aW9uQnVja2V0LCBkZXN0aW5hdGlvbktleSwgQUNMLCBjb3B5VGFncyA9IGZhbHNlLCB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHNvdXJjZU9iamVjdCA9IChfYSA9IHBhcmFtcy5zb3VyY2VPYmplY3QpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGF3YWl0IGV4cG9ydHMuaGVhZE9iamVjdChzb3VyY2VCdWNrZXQsIHNvdXJjZUtleSk7XG4gICAgLy8gQ3JlYXRlIGEgbXVsdGktcGFydCB1cGxvYWQgKGNvcHkpIGFuZCBnZXQgaXRzIFVwbG9hZElkXG4gICAgY29uc3QgdXBsb2FkSWQgPSBhd2FpdCBjcmVhdGVNdWx0aXBhcnRVcGxvYWQoe1xuICAgICAgICBzb3VyY2VCdWNrZXQsXG4gICAgICAgIHNvdXJjZUtleSxcbiAgICAgICAgZGVzdGluYXRpb25CdWNrZXQsXG4gICAgICAgIGRlc3RpbmF0aW9uS2V5LFxuICAgICAgICBBQ0wsXG4gICAgICAgIGNvcHlUYWdzLFxuICAgICAgICBjb250ZW50VHlwZTogc291cmNlT2JqZWN0LkNvbnRlbnRUeXBlLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEJ1aWxkIHRoZSBzZXBhcmF0ZSBwYXJ0cyBvZiB0aGUgbXVsdGktcGFydCB1cGxvYWQgKGNvcHkpXG4gICAgICAgIGNvbnN0IG9iamVjdFNpemUgPSBzb3VyY2VPYmplY3QuQ29udGVudExlbmd0aDtcbiAgICAgICAgaWYgKG9iamVjdFNpemUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0ZXJtaW5lIHNpemUgb2YgczM6Ly8ke3NvdXJjZUJ1Y2tldH0vJHtzb3VyY2VLZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2h1bmtzID0gUzNNdWx0aXBhcnRVcGxvYWRzLmNyZWF0ZU11bHRpcGFydENodW5rcyhvYmplY3RTaXplKTtcbiAgICAgICAgLy8gU3VibWl0IGFsbCBvZiB0aGUgdXBsb2FkIChjb3B5KSBwYXJ0cyB0byBTM1xuICAgICAgICBjb25zdCB1cGxvYWRQYXJ0Q29weVJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKGNodW5rcy5tYXAoKHsgc3RhcnQsIGVuZCB9LCBpbmRleCkgPT4gdXBsb2FkUGFydENvcHkoe1xuICAgICAgICAgICAgdXBsb2FkSWQsXG4gICAgICAgICAgICBwYXJ0TnVtYmVyOiBpbmRleCArIDEsXG4gICAgICAgICAgICBzdGFydCxcbiAgICAgICAgICAgIGVuZCxcbiAgICAgICAgICAgIHNvdXJjZUJ1Y2tldCxcbiAgICAgICAgICAgIHNvdXJjZUtleSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0LFxuICAgICAgICAgICAgZGVzdGluYXRpb25LZXksXG4gICAgICAgIH0pKSk7XG4gICAgICAgIC8vIExldCBTMyBrbm93IHRoYXQgdGhlIG11bHRpLXBhcnQgdXBsb2FkIChjb3B5KSBpcyBjb21wbGV0ZWRcbiAgICAgICAgY29uc3QgeyBFVGFnOiBldGFnIH0gPSBhd2FpdCBTM011bHRpcGFydFVwbG9hZHMuY29tcGxldGVNdWx0aXBhcnRVcGxvYWQoe1xuICAgICAgICAgICAgVXBsb2FkSWQ6IHVwbG9hZElkLFxuICAgICAgICAgICAgQnVja2V0OiBkZXN0aW5hdGlvbkJ1Y2tldCxcbiAgICAgICAgICAgIEtleTogZGVzdGluYXRpb25LZXksXG4gICAgICAgICAgICBNdWx0aXBhcnRVcGxvYWQ6IHtcbiAgICAgICAgICAgICAgICBQYXJ0czogdXBsb2FkUGFydENvcHlSZXNwb25zZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHsgZXRhZyB9O1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gSWYgYW55dGhpbmcgd2VudCB3cm9uZywgbWFrZSBzdXJlIHRoYXQgdGhlIG11bHRpLXBhcnQgdXBsb2FkIChjb3B5KVxuICAgICAgICAvLyBpcyBhYm9ydGVkLlxuICAgICAgICBhd2FpdCBTM011bHRpcGFydFVwbG9hZHMuYWJvcnRNdWx0aXBhcnRVcGxvYWQoe1xuICAgICAgICAgICAgQnVja2V0OiBkZXN0aW5hdGlvbkJ1Y2tldCxcbiAgICAgICAgICAgIEtleTogZGVzdGluYXRpb25LZXksXG4gICAgICAgICAgICBVcGxvYWRJZDogdXBsb2FkSWQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG59O1xuLyoqXG4gKiBNb3ZlIGFuIFMzIG9iamVjdCB0byBhbm90aGVyIGxvY2F0aW9uIGluIFMzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zb3VyY2VCdWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmRlc3RpbmF0aW9uQnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmRlc3RpbmF0aW9uS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhcmFtcy5BQ0xdIC0gYW4gW1MzIENhbm5lZCBBQ0xdKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvZGV2L2FjbC1vdmVydmlldy5odG1sI2Nhbm5lZC1hY2wpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwYXJhbXMuY29weVRhZ3M9ZmFsc2VdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovXG5leHBvcnRzLm1vdmVPYmplY3QgPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgYXdhaXQgZXhwb3J0cy5tdWx0aXBhcnRDb3B5T2JqZWN0KHtcbiAgICAgICAgc291cmNlQnVja2V0OiBwYXJhbXMuc291cmNlQnVja2V0LFxuICAgICAgICBzb3VyY2VLZXk6IHBhcmFtcy5zb3VyY2VLZXksXG4gICAgICAgIGRlc3RpbmF0aW9uQnVja2V0OiBwYXJhbXMuZGVzdGluYXRpb25CdWNrZXQsXG4gICAgICAgIGRlc3RpbmF0aW9uS2V5OiBwYXJhbXMuZGVzdGluYXRpb25LZXksXG4gICAgICAgIEFDTDogcGFyYW1zLkFDTCxcbiAgICAgICAgY29weVRhZ3M6IGlzQm9vbGVhbl8xLmRlZmF1bHQocGFyYW1zLmNvcHlUYWdzKSA/IHBhcmFtcy5jb3B5VGFncyA6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgZXhwb3J0cy5kZWxldGVTM09iamVjdChwYXJhbXMuc291cmNlQnVja2V0LCBwYXJhbXMuc291cmNlS2V5KTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TMy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbmNvbnN0IGF3c19zZGtfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiYXdzLXNka1wiKSk7XG5jb25zdCB0ZXN0X3V0aWxzXzEgPSByZXF1aXJlKFwiLi90ZXN0LXV0aWxzXCIpO1xuY29uc3Qgbm9vcCA9ICgpID0+IHsgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBsb2Rhc2gvcHJlZmVyLW5vb3BcbmNvbnN0IGdldFJlZ2lvbiA9ICgpID0+IHByb2Nlc3MuZW52LkFXU19ERUZBVUxUX1JFR0lPTiB8fCBwcm9jZXNzLmVudi5BV1NfUkVHSU9OIHx8ICd1cy1lYXN0LTEnO1xuLy8gV29ya2Fyb3VuZCB1cGxvYWQgaGFuZ3MuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FuZHJld3JrL25vZGUtczMtY2xpZW50L2lzc3Vlcy83NFxuLy8gQHRzLWlnbm9yZSAtIEFXUy51dGlsIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGFuZCBtYXkgYnJlYWtcbmF3c19zZGtfMS5kZWZhdWx0LnV0aWwudXBkYXRlKGF3c19zZGtfMS5kZWZhdWx0LlMzLnByb3RvdHlwZSwgeyBhZGRFeHBlY3QxMDBDb250aW51ZTogbm9vcCB9KTtcbmF3c19zZGtfMS5kZWZhdWx0LmNvbmZpZy5zZXRQcm9taXNlc0RlcGVuZGVuY3koUHJvbWlzZSk7XG5jb25zdCBtZW1vaXplID0gKGZuKSA9PiB7XG4gICAgbGV0IG1lbW87XG4gICAgcmV0dXJuIChvcHRpb25zKSA9PiB7XG4gICAgICAgIGlmICghbWVtbylcbiAgICAgICAgICAgIG1lbW8gPSBmbihvcHRpb25zKTtcbiAgICAgICAgcmV0dXJuIG1lbW87XG4gICAgfTtcbn07XG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCByZXR1cm4gYW4gQVdTIHNlcnZpY2Ugb2JqZWN0XG4gKlxuICogTm90ZTogVGhlIHJldHVybmVkIHNlcnZpY2Ugb2JqZWN0cyBhcmUgY2FjaGVkLCBzbyB0aGVyZSB3aWxsIG9ubHkgYmUgb25lXG4gKiAgICAgICBpbnN0YW5jZSBvZiBlYWNoIHNlcnZpY2Ugb2JqZWN0IHBlciBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSB7QVdTLlNlcnZpY2V9IFNlcnZpY2UgLSBhbiBBV1Mgc2VydmljZSBvYmplY3QgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdmVyc2lvbl0gLSB0aGUgQVBJIHZlcnNpb24gdG8gdXNlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3NlcnZpY2VPcHRpb25zXSAtIGFkZGl0aW9uYWwgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBzZXJ2aWNlXG4gKlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGNhbGxlZCwgd2lsbCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYW4gQVdTIHNlcnZpY2VcbiAqIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGF3c0NsaWVudCA9IChTZXJ2aWNlLCB2ZXJzaW9uLCBzZXJ2aWNlT3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIHJlZ2lvbjogZ2V0UmVnaW9uKCksXG4gICAgICAgIC4uLnNlcnZpY2VPcHRpb25zLFxuICAgIH07XG4gICAgaWYgKHZlcnNpb24pXG4gICAgICAgIG9wdGlvbnMuYXBpVmVyc2lvbiA9IHZlcnNpb247XG4gICAgaWYgKHRlc3RfdXRpbHNfMS5pblRlc3RNb2RlKCkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtIHNlcnZpY2VJZGVudGlmaWVyIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIGFuZCBtYXkgYnJlYWsgYXQgYW55IHRpbWVcbiAgICAgICAgaWYgKGF3c19zZGtfMS5kZWZhdWx0LkR5bmFtb0RCLkRvY3VtZW50Q2xpZW50LnNlcnZpY2VJZGVudGlmaWVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgLSBzZXJ2aWNlSWRlbnRpZmllciBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGJyZWFrIGF0IGFueSB0aW1lXG4gICAgICAgICAgICBhd3Nfc2RrXzEuZGVmYXVsdC5EeW5hbW9EQi5Eb2N1bWVudENsaWVudC5zZXJ2aWNlSWRlbnRpZmllciA9ICdkeW5hbW9kYic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1lbW9pemUoKG8pID0+IHRlc3RfdXRpbHNfMS50ZXN0QXdzQ2xpZW50KFNlcnZpY2UsIE9iamVjdC5hc3NpZ24ob3B0aW9ucywgbykpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lbW9pemUoKG8pID0+IG5ldyBTZXJ2aWNlKE9iamVjdC5hc3NpZ24ob3B0aW9ucywgbykpKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IGF3c0NsaWVudDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsaWVudC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbi8vIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGhlbHAgd2l0aCBTMyBtdWx0aS1wYXJ0IHVwbG9hZHNcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudXBsb2FkUGFydENvcHkgPSBleHBvcnRzLmFib3J0TXVsdGlwYXJ0VXBsb2FkID0gZXhwb3J0cy5jb21wbGV0ZU11bHRpcGFydFVwbG9hZCA9IGV4cG9ydHMuY3JlYXRlTXVsdGlwYXJ0VXBsb2FkID0gZXhwb3J0cy5jcmVhdGVNdWx0aXBhcnRDaHVua3MgPSB2b2lkIDA7XG5jb25zdCByYW5nZV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvcmFuZ2VcIikpO1xuY29uc3Qgc2VydmljZXNfMSA9IHJlcXVpcmUoXCIuLi9zZXJ2aWNlc1wiKTtcbmNvbnN0IE1CID0gMTAyNCAqIDEwMjQ7XG4vLyBFYWNoIHBhcnQgb2YgYSBtdWx0aS1wYXJ0IGNvcHkgbmVlZHMgdG8gc3BlY2lmeSBhIGJ5dGUgcmFuZ2UgdG8gYmUgY29waWVkLlxuLy8gVGhpcyBieXRlIHJhbmdlIGhhcyBhIHN0YXJ0aW5nIGJ5dGUgYW5kIGFuIGVuZGluZyBieXRlIChpbmNsdXNpdmUpIHRoYXQgbWFrZXNcbi8vIHVwIHRoZSBwYXJ0LiBUaGUgbWF4aW11bSBhbGxvd2VkIGNodW5rIHNpemUgaXMgNTM2ODcwOTEyMCBieXRlcy5cbi8vXG4vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZmlsZSBzaXplIGFuZCBhbiBvcHRpb25hbCBtYXhTaXplLiBJdCByZXR1cm5zIGFuIGFycmF5XG4vLyBvZiBvYmplY3RzLCBlYWNoIGNvbnRhaW5pbmcgYSBgc3RhcnRgIGFuZCBhbiBgZW5kYCB2YWx1ZS4gVGhlc2Ugd2lsbCBtYWtlIHVwXG4vLyB0aGUgcmFuZ2VzIG9mIHRoZSBtdWx0aS1wYXJ0IGNvcHkuXG4vL1xuLy8gRnJvbSBhbmVjZG90YWwgdGVzdGluZywgYSBjaHVuayBzaXplIG9mIDI1MCBNQiBzZWVtcyB0byBwZXJmb3JtIGZhaXJseSB3ZWxsLlxuLy9cbi8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvQVBJL0FQSV9VcGxvYWRQYXJ0Q29weS5odG1sXG5leHBvcnRzLmNyZWF0ZU11bHRpcGFydENodW5rcyA9IChvYmplY3RTaXplLCBtYXhDaHVua1NpemUgPSAyNTAgKiBNQikgPT4gcmFuZ2VfMS5kZWZhdWx0KDAsIG9iamVjdFNpemUsIG1heENodW5rU2l6ZSlcbiAgICAubWFwKChzdGFydCkgPT4gKHtcbiAgICBzdGFydCxcbiAgICBlbmQ6IE1hdGgubWluKHN0YXJ0ICsgbWF4Q2h1bmtTaXplLCBvYmplY3RTaXplKSAtIDEsXG59KSk7XG5leHBvcnRzLmNyZWF0ZU11bHRpcGFydFVwbG9hZCA9IGFzeW5jIChwYXJhbXMpID0+IGF3YWl0IHNlcnZpY2VzXzEuczMoKS5jcmVhdGVNdWx0aXBhcnRVcGxvYWQocGFyYW1zKS5wcm9taXNlKCk7XG5leHBvcnRzLmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkID0gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlcnZpY2VzXzEuczMoKS5jb21wbGV0ZU11bHRpcGFydFVwbG9hZChwYXJhbXMpLnByb21pc2UoKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbmV4cG9ydHMuYWJvcnRNdWx0aXBhcnRVcGxvYWQgPSBhc3luYyAocGFyYW1zKSA9PiBhd2FpdCBzZXJ2aWNlc18xLnMzKCkuYWJvcnRNdWx0aXBhcnRVcGxvYWQocGFyYW1zKS5wcm9taXNlKCk7XG5leHBvcnRzLnVwbG9hZFBhcnRDb3B5ID0gYXN5bmMgKHBhcmFtcykgPT4gYXdhaXQgc2VydmljZXNfMS5zMygpLnVwbG9hZFBhcnRDb3B5KHBhcmFtcykucHJvbWlzZSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UzNNdWx0aXBhcnRVcGxvYWRzLmpzLm1hcCIsInZhciBvbmNlID0gcmVxdWlyZSgnb25jZScpO1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uKCkge307XG5cbnZhciBpc1JlcXVlc3QgPSBmdW5jdGlvbihzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgdHlwZW9mIHN0cmVhbS5hYm9ydCA9PT0gJ2Z1bmN0aW9uJztcbn07XG5cbnZhciBpc0NoaWxkUHJvY2VzcyA9IGZ1bmN0aW9uKHN0cmVhbSkge1xuXHRyZXR1cm4gc3RyZWFtLnN0ZGlvICYmIEFycmF5LmlzQXJyYXkoc3RyZWFtLnN0ZGlvKSAmJiBzdHJlYW0uc3RkaW8ubGVuZ3RoID09PSAzXG59O1xuXG52YXIgZW9zID0gZnVuY3Rpb24oc3RyZWFtLCBvcHRzLCBjYWxsYmFjaykge1xuXHRpZiAodHlwZW9mIG9wdHMgPT09ICdmdW5jdGlvbicpIHJldHVybiBlb3Moc3RyZWFtLCBudWxsLCBvcHRzKTtcblx0aWYgKCFvcHRzKSBvcHRzID0ge307XG5cblx0Y2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrIHx8IG5vb3ApO1xuXG5cdHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcblx0dmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuXHR2YXIgcmVhZGFibGUgPSBvcHRzLnJlYWRhYmxlIHx8IChvcHRzLnJlYWRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ucmVhZGFibGUpO1xuXHR2YXIgd3JpdGFibGUgPSBvcHRzLndyaXRhYmxlIHx8IChvcHRzLndyaXRhYmxlICE9PSBmYWxzZSAmJiBzdHJlYW0ud3JpdGFibGUpO1xuXHR2YXIgY2FuY2VsbGVkID0gZmFsc2U7XG5cblx0dmFyIG9ubGVnYWN5ZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCFzdHJlYW0ud3JpdGFibGUpIG9uZmluaXNoKCk7XG5cdH07XG5cblx0dmFyIG9uZmluaXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0d3JpdGFibGUgPSBmYWxzZTtcblx0XHRpZiAoIXJlYWRhYmxlKSBjYWxsYmFjay5jYWxsKHN0cmVhbSk7XG5cdH07XG5cblx0dmFyIG9uZW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0cmVhZGFibGUgPSBmYWxzZTtcblx0XHRpZiAoIXdyaXRhYmxlKSBjYWxsYmFjay5jYWxsKHN0cmVhbSk7XG5cdH07XG5cblx0dmFyIG9uZXhpdCA9IGZ1bmN0aW9uKGV4aXRDb2RlKSB7XG5cdFx0Y2FsbGJhY2suY2FsbChzdHJlYW0sIGV4aXRDb2RlID8gbmV3IEVycm9yKCdleGl0ZWQgd2l0aCBlcnJvciBjb2RlOiAnICsgZXhpdENvZGUpIDogbnVsbCk7XG5cdH07XG5cblx0dmFyIG9uZXJyb3IgPSBmdW5jdGlvbihlcnIpIHtcblx0XHRjYWxsYmFjay5jYWxsKHN0cmVhbSwgZXJyKTtcblx0fTtcblxuXHR2YXIgb25jbG9zZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHByb2Nlc3MubmV4dFRpY2sob25jbG9zZW5leHR0aWNrKTtcblx0fTtcblxuXHR2YXIgb25jbG9zZW5leHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKGNhbmNlbGxlZCkgcmV0dXJuO1xuXHRcdGlmIChyZWFkYWJsZSAmJiAhKHJzICYmIChycy5lbmRlZCAmJiAhcnMuZGVzdHJveWVkKSkpIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgbmV3IEVycm9yKCdwcmVtYXR1cmUgY2xvc2UnKSk7XG5cdFx0aWYgKHdyaXRhYmxlICYmICEod3MgJiYgKHdzLmVuZGVkICYmICF3cy5kZXN0cm95ZWQpKSkgcmV0dXJuIGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBuZXcgRXJyb3IoJ3ByZW1hdHVyZSBjbG9zZScpKTtcblx0fTtcblxuXHR2YXIgb25yZXF1ZXN0ID0gZnVuY3Rpb24oKSB7XG5cdFx0c3RyZWFtLnJlcS5vbignZmluaXNoJywgb25maW5pc2gpO1xuXHR9O1xuXG5cdGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkge1xuXHRcdHN0cmVhbS5vbignY29tcGxldGUnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLm9uKCdhYm9ydCcsIG9uY2xvc2UpO1xuXHRcdGlmIChzdHJlYW0ucmVxKSBvbnJlcXVlc3QoKTtcblx0XHRlbHNlIHN0cmVhbS5vbigncmVxdWVzdCcsIG9ucmVxdWVzdCk7XG5cdH0gZWxzZSBpZiAod3JpdGFibGUgJiYgIXdzKSB7IC8vIGxlZ2FjeSBzdHJlYW1zXG5cdFx0c3RyZWFtLm9uKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLm9uKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcblx0fVxuXG5cdGlmIChpc0NoaWxkUHJvY2VzcyhzdHJlYW0pKSBzdHJlYW0ub24oJ2V4aXQnLCBvbmV4aXQpO1xuXG5cdHN0cmVhbS5vbignZW5kJywgb25lbmQpO1xuXHRzdHJlYW0ub24oJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0aWYgKG9wdHMuZXJyb3IgIT09IGZhbHNlKSBzdHJlYW0ub24oJ2Vycm9yJywgb25lcnJvcik7XG5cdHN0cmVhbS5vbignY2xvc2UnLCBvbmNsb3NlKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0Y2FuY2VsbGVkID0gdHJ1ZTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignYWJvcnQnLCBvbmNsb3NlKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuXHRcdGlmIChzdHJlYW0ucmVxKSBzdHJlYW0ucmVxLnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdlbmQnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9ubGVnYWN5ZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2V4aXQnLCBvbmV4aXQpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCBvbmVycm9yKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG5cdH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVvcztcbiIsInZhciByb290ID0gcmVxdWlyZSgnLi9fcm9vdCcpO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBTeW1ib2wgPSByb290LlN5bWJvbDtcblxubW9kdWxlLmV4cG9ydHMgPSBTeW1ib2w7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyksXG4gICAgZ2V0UmF3VGFnID0gcmVxdWlyZSgnLi9fZ2V0UmF3VGFnJyksXG4gICAgb2JqZWN0VG9TdHJpbmcgPSByZXF1aXJlKCcuL19vYmplY3RUb1N0cmluZycpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJyxcbiAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJztcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGdldFRhZ2Agd2l0aG91dCBmYWxsYmFja3MgZm9yIGJ1Z2d5IGVudmlyb25tZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBiYXNlR2V0VGFnKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnO1xuICB9XG4gIHJldHVybiAoc3ltVG9TdHJpbmdUYWcgJiYgc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKSlcbiAgICA/IGdldFJhd1RhZyh2YWx1ZSlcbiAgICA6IG9iamVjdFRvU3RyaW5nKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlR2V0VGFnO1xuIiwiLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZUNlaWwgPSBNYXRoLmNlaWwsXG4gICAgbmF0aXZlTWF4ID0gTWF0aC5tYXg7XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0XG4gKiBjb2VyY2UgYXJndW1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICovXG5mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7XG4gIHZhciBpbmRleCA9IC0xLFxuICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KG5hdGl2ZUNlaWwoKGVuZCAtIHN0YXJ0KSAvIChzdGVwIHx8IDEpKSwgMCksXG4gICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpO1xuXG4gIHdoaWxlIChsZW5ndGgtLSkge1xuICAgIHJlc3VsdFtmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XSA9IHN0YXJ0O1xuICAgIHN0YXJ0ICs9IHN0ZXA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlUmFuZ2U7XG4iLCJ2YXIgdHJpbW1lZEVuZEluZGV4ID0gcmVxdWlyZSgnLi9fdHJpbW1lZEVuZEluZGV4Jyk7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgd2hpdGVzcGFjZS4gKi9cbnZhciByZVRyaW1TdGFydCA9IC9eXFxzKy87XG5cbi8qKlxuICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udHJpbWAuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byB0cmltLlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGJhc2VUcmltKHN0cmluZykge1xuICByZXR1cm4gc3RyaW5nXG4gICAgPyBzdHJpbmcuc2xpY2UoMCwgdHJpbW1lZEVuZEluZGV4KHN0cmluZykgKyAxKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LCAnJylcbiAgICA6IHN0cmluZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBiYXNlVHJpbTtcbiIsInZhciBiYXNlUmFuZ2UgPSByZXF1aXJlKCcuL19iYXNlUmFuZ2UnKSxcbiAgICBpc0l0ZXJhdGVlQ2FsbCA9IHJlcXVpcmUoJy4vX2lzSXRlcmF0ZWVDYWxsJyksXG4gICAgdG9GaW5pdGUgPSByZXF1aXJlKCcuL3RvRmluaXRlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGBfLnJhbmdlYCBvciBgXy5yYW5nZVJpZ2h0YCBmdW5jdGlvbi5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByYW5nZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUmFuZ2UoZnJvbVJpZ2h0KSB7XG4gIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kLCBzdGVwKSB7XG4gICAgaWYgKHN0ZXAgJiYgdHlwZW9mIHN0ZXAgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHtcbiAgICAgIGVuZCA9IHN0ZXAgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC5cbiAgICBzdGFydCA9IHRvRmluaXRlKHN0YXJ0KTtcbiAgICBpZiAoZW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVuZCA9IHN0YXJ0O1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpO1xuICAgIH1cbiAgICBzdGVwID0gc3RlcCA9PT0gdW5kZWZpbmVkID8gKHN0YXJ0IDwgZW5kID8gMSA6IC0xKSA6IHRvRmluaXRlKHN0ZXApO1xuICAgIHJldHVybiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KTtcbiAgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBjcmVhdGVSYW5nZTtcbiIsIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsIi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovXG52YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cXGQqKSQvO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBpbmRleC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD1NQVhfU0FGRV9JTlRFR0VSXSBUaGUgdXBwZXIgYm91bmRzIG9mIGEgdmFsaWQgaW5kZXguXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsIGxlbmd0aCkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgbGVuZ3RoID0gbGVuZ3RoID09IG51bGwgPyBNQVhfU0FGRV9JTlRFR0VSIDogbGVuZ3RoO1xuXG4gIHJldHVybiAhIWxlbmd0aCAmJlxuICAgICh0eXBlID09ICdudW1iZXInIHx8XG4gICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmXG4gICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0luZGV4O1xuIiwidmFyIGVxID0gcmVxdWlyZSgnLi9lcScpLFxuICAgIGlzQXJyYXlMaWtlID0gcmVxdWlyZSgnLi9pc0FycmF5TGlrZScpLFxuICAgIGlzSW5kZXggPSByZXF1aXJlKCcuL19pc0luZGV4JyksXG4gICAgaXNPYmplY3QgPSByZXF1aXJlKCcuL2lzT2JqZWN0Jyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIHZhbHVlIGFyZ3VtZW50LlxuICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gb2JqZWN0IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgb2JqZWN0IGFyZ3VtZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcmd1bWVudHMgYXJlIGZyb20gYW4gaXRlcmF0ZWUgY2FsbCxcbiAqICBlbHNlIGBmYWxzZWAuXG4gKi9cbmZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7XG4gIGlmICghaXNPYmplY3Qob2JqZWN0KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDtcbiAgaWYgKHR5cGUgPT0gJ251bWJlcidcbiAgICAgICAgPyAoaXNBcnJheUxpa2Uob2JqZWN0KSAmJiBpc0luZGV4KGluZGV4LCBvYmplY3QubGVuZ3RoKSlcbiAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpXG4gICAgICApIHtcbiAgICByZXR1cm4gZXEob2JqZWN0W2luZGV4XSwgdmFsdWUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0l0ZXJhdGVlQ2FsbDtcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByb290O1xuIiwiLyoqIFVzZWQgdG8gbWF0Y2ggYSBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuICovXG52YXIgcmVXaGl0ZXNwYWNlID0gL1xccy87XG5cbi8qKlxuICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZVxuICogY2hhcmFjdGVyIG9mIGBzdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlci5cbiAqL1xuZnVuY3Rpb24gdHJpbW1lZEVuZEluZGV4KHN0cmluZykge1xuICB2YXIgaW5kZXggPSBzdHJpbmcubGVuZ3RoO1xuXG4gIHdoaWxlIChpbmRleC0tICYmIHJlV2hpdGVzcGFjZS50ZXN0KHN0cmluZy5jaGFyQXQoaW5kZXgpKSkge31cbiAgcmV0dXJuIGluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRyaW1tZWRFbmRJbmRleDtcbiIsIi8qKlxuICogUGVyZm9ybXMgYVxuICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybylcbiAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9O1xuICogdmFyIG90aGVyID0geyAnYSc6IDEgfTtcbiAqXG4gKiBfLmVxKG9iamVjdCwgb2JqZWN0KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKG9iamVjdCwgb3RoZXIpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKCdhJywgJ2EnKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmVxKE5hTiwgTmFOKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGVxO1xuIiwidmFyIGlzRnVuY3Rpb24gPSByZXF1aXJlKCcuL2lzRnVuY3Rpb24nKSxcbiAgICBpc0xlbmd0aCA9IHJlcXVpcmUoJy4vaXNMZW5ndGgnKTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLiBBIHZhbHVlIGlzIGNvbnNpZGVyZWQgYXJyYXktbGlrZSBpZiBpdCdzXG4gKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yXG4gKiBlcXVhbCB0byBgMGAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0FycmF5TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZSgnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0FycmF5TGlrZShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheUxpa2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYm9vbGVhbiBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQm9vbGVhbihmYWxzZSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Jvb2xlYW4obnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGJvb2xUYWcpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQm9vbGVhbjtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsXG4gICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsXG4gICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJyxcbiAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBGdW5jdGlvbmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZnVuY3Rpb24sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Z1bmN0aW9uKF8pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNGdW5jdGlvbigvYWJjLyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvclxuICAvLyBpbiBTYWZhcmkgOSB3aGljaCByZXR1cm5zICdvYmplY3QnIGZvciB0eXBlZCBhcnJheXMgYW5kIG90aGVyIGNvbnN0cnVjdG9ycy5cbiAgdmFyIHRhZyA9IGJhc2VHZXRUYWcodmFsdWUpO1xuICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRnVuY3Rpb247XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLlxuICpcbiAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uXG4gKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNMZW5ndGgoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0xlbmd0aChJbmZpbml0eSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoJzMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiZcbiAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVI7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNMZW5ndGg7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZVxuICogW2xhbmd1YWdlIHR5cGVdKGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1lY21hc2NyaXB0LWxhbmd1YWdlLXR5cGVzKVxuICogb2YgYE9iamVjdGAuIChlLmcuIGFycmF5cywgZnVuY3Rpb25zLCBvYmplY3RzLCByZWdleGVzLCBgbmV3IE51bWJlcigwKWAsIGFuZCBgbmV3IFN0cmluZygnJylgKVxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzT2JqZWN0KHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChfLm5vb3ApO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgKHR5cGUgPT0gJ29iamVjdCcgfHwgdHlwZSA9PSAnZnVuY3Rpb24nKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN5bWJvbGAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHN5bWJvbCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzU3ltYm9sKFN5bWJvbC5pdGVyYXRvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N5bWJvbCgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N5bWJvbCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3ltYm9sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N5bWJvbDtcbiIsInZhciBjcmVhdGVSYW5nZSA9IHJlcXVpcmUoJy4vX2NyZWF0ZVJhbmdlJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb21cbiAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlXG4gKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCxcbiAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC5cbiAqXG4gKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nXG4gKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBVdGlsXG4gKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LlxuICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLlxuICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodFxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnJhbmdlKDQpO1xuICogLy8gPT4gWzAsIDEsIDIsIDNdXG4gKlxuICogXy5yYW5nZSgtNCk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDUpO1xuICogLy8gPT4gWzEsIDIsIDMsIDRdXG4gKlxuICogXy5yYW5nZSgwLCAyMCwgNSk7XG4gKiAvLyA9PiBbMCwgNSwgMTAsIDE1XVxuICpcbiAqIF8ucmFuZ2UoMCwgLTQsIC0xKTtcbiAqIC8vID0+IFswLCAtMSwgLTIsIC0zXVxuICpcbiAqIF8ucmFuZ2UoMSwgNCwgMCk7XG4gKiAvLyA9PiBbMSwgMSwgMV1cbiAqXG4gKiBfLnJhbmdlKDApO1xuICogLy8gPT4gW11cbiAqL1xudmFyIHJhbmdlID0gY3JlYXRlUmFuZ2UoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByYW5nZTtcbiIsInZhciB0b051bWJlciA9IHJlcXVpcmUoJy4vdG9OdW1iZXInKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgSU5GSU5JVFkgPSAxIC8gMCxcbiAgICBNQVhfSU5URUdFUiA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4xMi4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9GaW5pdGUoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvRmluaXRlKEluZmluaXR5KTtcbiAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4XG4gKlxuICogXy50b0Zpbml0ZSgnMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDtcbiAgfVxuICB2YWx1ZSA9IHRvTnVtYmVyKHZhbHVlKTtcbiAgaWYgKHZhbHVlID09PSBJTkZJTklUWSB8fCB2YWx1ZSA9PT0gLUlORklOSVRZKSB7XG4gICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTtcbiAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSO1xuICB9XG4gIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9GaW5pdGU7XG4iLCJ2YXIgYmFzZVRyaW0gPSByZXF1aXJlKCcuL19iYXNlVHJpbScpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpLFxuICAgIGlzU3ltYm9sID0gcmVxdWlyZSgnLi9pc1N5bWJvbCcpO1xuXG4vKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBOQU4gPSAwIC8gMDtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IGJhZCBzaWduZWQgaGV4YWRlY2ltYWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi9cbnZhciByZUlzT2N0YWwgPSAvXjBvWzAtN10rJC9pO1xuXG4vKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqL1xudmFyIGZyZWVQYXJzZUludCA9IHBhcnNlSW50O1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gYmFzZVRyaW0odmFsdWUpO1xuICB2YXIgaXNCaW5hcnkgPSByZUlzQmluYXJ5LnRlc3QodmFsdWUpO1xuICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSlcbiAgICA/IGZyZWVQYXJzZUludCh2YWx1ZS5zbGljZSgyKSwgaXNCaW5hcnkgPyAyIDogOClcbiAgICA6IChyZUlzQmFkSGV4LnRlc3QodmFsdWUpID8gTkFOIDogK3ZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0b051bWJlcjtcbiIsInZhciB3cmFwcHkgPSByZXF1aXJlKCd3cmFwcHknKVxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHkob25jZSlcbm1vZHVsZS5leHBvcnRzLnN0cmljdCA9IHdyYXBweShvbmNlU3RyaWN0KVxuXG5vbmNlLnByb3RvID0gb25jZShmdW5jdGlvbiAoKSB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlJywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZSh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bmN0aW9uLnByb3RvdHlwZSwgJ29uY2VTdHJpY3QnLCB7XG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBvbmNlU3RyaWN0KHRoaXMpXG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWVcbiAgfSlcbn0pXG5cbmZ1bmN0aW9uIG9uY2UgKGZuKSB7XG4gIHZhciBmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmLmNhbGxlZCkgcmV0dXJuIGYudmFsdWVcbiAgICBmLmNhbGxlZCA9IHRydWVcbiAgICByZXR1cm4gZi52YWx1ZSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxuICBmLmNhbGxlZCA9IGZhbHNlXG4gIHJldHVybiBmXG59XG5cbmZ1bmN0aW9uIG9uY2VTdHJpY3QgKGZuKSB7XG4gIHZhciBmID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChmLmNhbGxlZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihmLm9uY2VFcnJvcilcbiAgICBmLmNhbGxlZCA9IHRydWVcbiAgICByZXR1cm4gZi52YWx1ZSA9IGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbiAgfVxuICB2YXIgbmFtZSA9IGZuLm5hbWUgfHwgJ0Z1bmN0aW9uIHdyYXBwZWQgd2l0aCBgb25jZWAnXG4gIGYub25jZUVycm9yID0gbmFtZSArIFwiIHNob3VsZG4ndCBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2VcIlxuICBmLmNhbGxlZCA9IGZhbHNlXG4gIHJldHVybiBmXG59XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IChwcm9taXNlLCBvbkZpbmFsbHkpID0+IHtcblx0b25GaW5hbGx5ID0gb25GaW5hbGx5IHx8ICgoKSA9PiB7fSk7XG5cblx0cmV0dXJuIHByb21pc2UudGhlbihcblx0XHR2YWwgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRyZXNvbHZlKG9uRmluYWxseSgpKTtcblx0XHR9KS50aGVuKCgpID0+IHZhbCksXG5cdFx0ZXJyID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXHRcdFx0cmVzb2x2ZShvbkZpbmFsbHkoKSk7XG5cdFx0fSkudGhlbigoKSA9PiB7XG5cdFx0XHR0aHJvdyBlcnI7XG5cdFx0fSlcblx0KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5tb2R1bGUuZXhwb3J0cyA9IChpdGVyYWJsZSwgbWFwcGVyLCBvcHRzKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdG9wdHMgPSBPYmplY3QuYXNzaWduKHtcblx0XHRjb25jdXJyZW5jeTogSW5maW5pdHlcblx0fSwgb3B0cyk7XG5cblx0aWYgKHR5cGVvZiBtYXBwZXIgIT09ICdmdW5jdGlvbicpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdNYXBwZXIgZnVuY3Rpb24gaXMgcmVxdWlyZWQnKTtcblx0fVxuXG5cdGNvbnN0IGNvbmN1cnJlbmN5ID0gb3B0cy5jb25jdXJyZW5jeTtcblxuXHRpZiAoISh0eXBlb2YgY29uY3VycmVuY3kgPT09ICdudW1iZXInICYmIGNvbmN1cnJlbmN5ID49IDEpKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgXFxgY29uY3VycmVuY3lcXGAgdG8gYmUgYSBudW1iZXIgZnJvbSAxIGFuZCB1cCwgZ290IFxcYCR7Y29uY3VycmVuY3l9XFxgICgke3R5cGVvZiBjb25jdXJyZW5jeX0pYCk7XG5cdH1cblxuXHRjb25zdCByZXQgPSBbXTtcblx0Y29uc3QgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5cdGxldCBpc1JlamVjdGVkID0gZmFsc2U7XG5cdGxldCBpdGVyYWJsZURvbmUgPSBmYWxzZTtcblx0bGV0IHJlc29sdmluZ0NvdW50ID0gMDtcblx0bGV0IGN1cnJlbnRJZHggPSAwO1xuXG5cdGNvbnN0IG5leHQgPSAoKSA9PiB7XG5cdFx0aWYgKGlzUmVqZWN0ZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBuZXh0SXRlbSA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRjb25zdCBpID0gY3VycmVudElkeDtcblx0XHRjdXJyZW50SWR4Kys7XG5cblx0XHRpZiAobmV4dEl0ZW0uZG9uZSkge1xuXHRcdFx0aXRlcmFibGVEb25lID0gdHJ1ZTtcblxuXHRcdFx0aWYgKHJlc29sdmluZ0NvdW50ID09PSAwKSB7XG5cdFx0XHRcdHJlc29sdmUocmV0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHJlc29sdmluZ0NvdW50Kys7XG5cblx0XHRQcm9taXNlLnJlc29sdmUobmV4dEl0ZW0udmFsdWUpXG5cdFx0XHQudGhlbihlbCA9PiBtYXBwZXIoZWwsIGkpKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHZhbCA9PiB7XG5cdFx0XHRcdFx0cmV0W2ldID0gdmFsO1xuXHRcdFx0XHRcdHJlc29sdmluZ0NvdW50LS07XG5cdFx0XHRcdFx0bmV4dCgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnIgPT4ge1xuXHRcdFx0XHRcdGlzUmVqZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdHJlamVjdChlcnIpO1xuXHRcdFx0XHR9XG5cdFx0XHQpO1xuXHR9O1xuXG5cdGZvciAobGV0IGkgPSAwOyBpIDwgY29uY3VycmVuY3k7IGkrKykge1xuXHRcdG5leHQoKTtcblxuXHRcdGlmIChpdGVyYWJsZURvbmUpIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5jb25zdCByZXRyeSA9IHJlcXVpcmUoJ3JldHJ5Jyk7XG5cbmNvbnN0IG5ldHdvcmtFcnJvck1zZ3MgPSBbXG5cdCdGYWlsZWQgdG8gZmV0Y2gnLCAvLyBDaHJvbWVcblx0J05ldHdvcmtFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gZmV0Y2ggcmVzb3VyY2UuJywgLy8gRmlyZWZveFxuXHQnVGhlIEludGVybmV0IGNvbm5lY3Rpb24gYXBwZWFycyB0byBiZSBvZmZsaW5lLicsIC8vIFNhZmFyaVxuXHQnTmV0d29yayByZXF1ZXN0IGZhaWxlZCcgLy8gYGNyb3NzLWZldGNoYFxuXTtcblxuY2xhc3MgQWJvcnRFcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSkge1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0XHR0aGlzLm9yaWdpbmFsRXJyb3IgPSBtZXNzYWdlO1xuXHRcdFx0KHttZXNzYWdlfSA9IG1lc3NhZ2UpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm9yaWdpbmFsRXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG5cdFx0XHR0aGlzLm9yaWdpbmFsRXJyb3Iuc3RhY2sgPSB0aGlzLnN0YWNrO1xuXHRcdH1cblxuXHRcdHRoaXMubmFtZSA9ICdBYm9ydEVycm9yJztcblx0XHR0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuXHR9XG59XG5cbmNvbnN0IGRlY29yYXRlRXJyb3JXaXRoQ291bnRzID0gKGVycm9yLCBhdHRlbXB0TnVtYmVyLCBvcHRpb25zKSA9PiB7XG5cdC8vIE1pbnVzIDEgZnJvbSBhdHRlbXB0TnVtYmVyIGJlY2F1c2UgdGhlIGZpcnN0IGF0dGVtcHQgZG9lcyBub3QgY291bnQgYXMgYSByZXRyeVxuXHRjb25zdCByZXRyaWVzTGVmdCA9IG9wdGlvbnMucmV0cmllcyAtIChhdHRlbXB0TnVtYmVyIC0gMSk7XG5cblx0ZXJyb3IuYXR0ZW1wdE51bWJlciA9IGF0dGVtcHROdW1iZXI7XG5cdGVycm9yLnJldHJpZXNMZWZ0ID0gcmV0cmllc0xlZnQ7XG5cdHJldHVybiBlcnJvcjtcbn07XG5cbmNvbnN0IGlzTmV0d29ya0Vycm9yID0gZXJyb3JNZXNzYWdlID0+IG5ldHdvcmtFcnJvck1zZ3MuaW5jbHVkZXMoZXJyb3JNZXNzYWdlKTtcblxuY29uc3QgcFJldHJ5ID0gKGlucHV0LCBvcHRpb25zKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0b25GYWlsZWRBdHRlbXB0OiAoKSA9PiB7fSxcblx0XHRyZXRyaWVzOiAxMCxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cblx0Y29uc3Qgb3BlcmF0aW9uID0gcmV0cnkub3BlcmF0aW9uKG9wdGlvbnMpO1xuXG5cdG9wZXJhdGlvbi5hdHRlbXB0KGFzeW5jIGF0dGVtcHROdW1iZXIgPT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRyZXNvbHZlKGF3YWl0IGlucHV0KGF0dGVtcHROdW1iZXIpKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0aWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikpIHtcblx0XHRcdFx0cmVqZWN0KG5ldyBUeXBlRXJyb3IoYE5vbi1lcnJvciB3YXMgdGhyb3duOiBcIiR7ZXJyb3J9XCIuIFlvdSBzaG91bGQgb25seSB0aHJvdyBlcnJvcnMuYCkpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlcnJvciBpbnN0YW5jZW9mIEFib3J0RXJyb3IpIHtcblx0XHRcdFx0b3BlcmF0aW9uLnN0b3AoKTtcblx0XHRcdFx0cmVqZWN0KGVycm9yLm9yaWdpbmFsRXJyb3IpO1xuXHRcdFx0fSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvciAmJiAhaXNOZXR3b3JrRXJyb3IoZXJyb3IubWVzc2FnZSkpIHtcblx0XHRcdFx0b3BlcmF0aW9uLnN0b3AoKTtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlY29yYXRlRXJyb3JXaXRoQ291bnRzKGVycm9yLCBhdHRlbXB0TnVtYmVyLCBvcHRpb25zKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGF3YWl0IG9wdGlvbnMub25GYWlsZWRBdHRlbXB0KGVycm9yKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghb3BlcmF0aW9uLnJldHJ5KGVycm9yKSkge1xuXHRcdFx0XHRcdHJlamVjdChvcGVyYXRpb24ubWFpbkVycm9yKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBSZXRyeTtcbi8vIFRPRE86IHJlbW92ZSB0aGlzIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb25cbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBwUmV0cnk7XG5cbm1vZHVsZS5leHBvcnRzLkFib3J0RXJyb3IgPSBBYm9ydEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBwRmluYWxseSA9IHJlcXVpcmUoJ3AtZmluYWxseScpO1xuXG5jbGFzcyBUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLm5hbWUgPSAnVGltZW91dEVycm9yJztcblx0fVxufVxuXG5jb25zdCBwVGltZW91dCA9IChwcm9taXNlLCBtaWxsaXNlY29uZHMsIGZhbGxiYWNrKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdGlmICh0eXBlb2YgbWlsbGlzZWNvbmRzICE9PSAnbnVtYmVyJyB8fCBtaWxsaXNlY29uZHMgPCAwKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYG1pbGxpc2Vjb25kc2AgdG8gYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcblx0fVxuXG5cdGlmIChtaWxsaXNlY29uZHMgPT09IEluZmluaXR5KSB7XG5cdFx0cmVzb2x2ZShwcm9taXNlKTtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdGlmICh0eXBlb2YgZmFsbGJhY2sgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJlc29sdmUoZmFsbGJhY2soKSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWVzc2FnZSA9IHR5cGVvZiBmYWxsYmFjayA9PT0gJ3N0cmluZycgPyBmYWxsYmFjayA6IGBQcm9taXNlIHRpbWVkIG91dCBhZnRlciAke21pbGxpc2Vjb25kc30gbWlsbGlzZWNvbmRzYDtcblx0XHRjb25zdCB0aW1lb3V0RXJyb3IgPSBmYWxsYmFjayBpbnN0YW5jZW9mIEVycm9yID8gZmFsbGJhY2sgOiBuZXcgVGltZW91dEVycm9yKG1lc3NhZ2UpO1xuXG5cdFx0aWYgKHR5cGVvZiBwcm9taXNlLmNhbmNlbCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cHJvbWlzZS5jYW5jZWwoKTtcblx0XHR9XG5cblx0XHRyZWplY3QodGltZW91dEVycm9yKTtcblx0fSwgbWlsbGlzZWNvbmRzKTtcblxuXHQvLyBUT0RPOiBVc2UgbmF0aXZlIGBmaW5hbGx5YCBrZXl3b3JkIHdoZW4gdGFyZ2V0aW5nIE5vZGUuanMgMTBcblx0cEZpbmFsbHkoXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByb21pc2UvcHJlZmVyLWF3YWl0LXRvLXRoZW5cblx0XHRwcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KSxcblx0XHQoKSA9PiB7XG5cdFx0XHRjbGVhclRpbWVvdXQodGltZXIpO1xuXHRcdH1cblx0KTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHBUaW1lb3V0O1xuLy8gVE9ETzogUmVtb3ZlIHRoaXMgZm9yIHRoZSBuZXh0IG1ham9yIHJlbGVhc2Vcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBwVGltZW91dDtcblxubW9kdWxlLmV4cG9ydHMuVGltZW91dEVycm9yID0gVGltZW91dEVycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgcFRpbWVvdXQgPSByZXF1aXJlKCdwLXRpbWVvdXQnKTtcblxuY29uc3QgcFdhaXRGb3IgPSBhc3luYyAoY29uZGl0aW9uLCBvcHRpb25zKSA9PiB7XG5cdG9wdGlvbnMgPSB7XG5cdFx0aW50ZXJ2YWw6IDIwLFxuXHRcdHRpbWVvdXQ6IEluZmluaXR5LFxuXHRcdGxlYWRpbmdDaGVjazogdHJ1ZSxcblx0XHQuLi5vcHRpb25zXG5cdH07XG5cblx0bGV0IHJldHJ5VGltZW91dDtcblxuXHRjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdGNvbnN0IGNoZWNrID0gYXN5bmMgKCkgPT4ge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBhd2FpdCBjb25kaXRpb24oKTtcblxuXHRcdFx0XHRpZiAodHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBjb25kaXRpb24gdG8gcmV0dXJuIGEgYm9vbGVhbicpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSB0cnVlKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHJldHJ5VGltZW91dCA9IHNldFRpbWVvdXQoY2hlY2ssIG9wdGlvbnMuaW50ZXJ2YWwpO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRyZWplY3QoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRpZiAob3B0aW9ucy5sZWFkaW5nQ2hlY2spIHtcblx0XHRcdGNoZWNrKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHJ5VGltZW91dCA9IHNldFRpbWVvdXQoY2hlY2ssIG9wdGlvbnMuaW50ZXJ2YWwpO1xuXHRcdH1cblx0fSk7XG5cblx0aWYgKG9wdGlvbnMudGltZW91dCAhPT0gSW5maW5pdHkpIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGF3YWl0IHBUaW1lb3V0KHByb21pc2UsIG9wdGlvbnMudGltZW91dCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmIChyZXRyeVRpbWVvdXQpIHtcblx0XHRcdFx0Y2xlYXJUaW1lb3V0KHJldHJ5VGltZW91dCk7XG5cdFx0XHR9XG5cblx0XHRcdHRocm93IGVycm9yO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBwcm9taXNlO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBwV2FpdEZvcjtcbi8vIFRPRE86IFJlbW92ZSB0aGlzIGZvciB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gcFdhaXRGb3I7XG4iLCJ2YXIgb25jZSA9IHJlcXVpcmUoJ29uY2UnKVxudmFyIGVvcyA9IHJlcXVpcmUoJ2VuZC1vZi1zdHJlYW0nKVxudmFyIGZzID0gcmVxdWlyZSgnZnMnKSAvLyB3ZSBvbmx5IG5lZWQgZnMgdG8gZ2V0IHRoZSBSZWFkU3RyZWFtIGFuZCBXcml0ZVN0cmVhbSBwcm90b3R5cGVzXG5cbnZhciBub29wID0gZnVuY3Rpb24gKCkge31cbnZhciBhbmNpZW50ID0gL152P1xcLjAvLnRlc3QocHJvY2Vzcy52ZXJzaW9uKVxuXG52YXIgaXNGbiA9IGZ1bmN0aW9uIChmbikge1xuICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nXG59XG5cbnZhciBpc0ZTID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICBpZiAoIWFuY2llbnQpIHJldHVybiBmYWxzZSAvLyBuZXdlciBub2RlIHZlcnNpb24gZG8gbm90IG5lZWQgdG8gY2FyZSBhYm91dCBmcyBpcyBhIHNwZWNpYWwgd2F5XG4gIGlmICghZnMpIHJldHVybiBmYWxzZSAvLyBicm93c2VyXG4gIHJldHVybiAoc3RyZWFtIGluc3RhbmNlb2YgKGZzLlJlYWRTdHJlYW0gfHwgbm9vcCkgfHwgc3RyZWFtIGluc3RhbmNlb2YgKGZzLldyaXRlU3RyZWFtIHx8IG5vb3ApKSAmJiBpc0ZuKHN0cmVhbS5jbG9zZSlcbn1cblxudmFyIGlzUmVxdWVzdCA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgcmV0dXJuIHN0cmVhbS5zZXRIZWFkZXIgJiYgaXNGbihzdHJlYW0uYWJvcnQpXG59XG5cbnZhciBkZXN0cm95ZXIgPSBmdW5jdGlvbiAoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBjYWxsYmFjaykge1xuICBjYWxsYmFjayA9IG9uY2UoY2FsbGJhY2spXG5cbiAgdmFyIGNsb3NlZCA9IGZhbHNlXG4gIHN0cmVhbS5vbignY2xvc2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgY2xvc2VkID0gdHJ1ZVxuICB9KVxuXG4gIGVvcyhzdHJlYW0sIHtyZWFkYWJsZTogcmVhZGluZywgd3JpdGFibGU6IHdyaXRpbmd9LCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgaWYgKGVycikgcmV0dXJuIGNhbGxiYWNrKGVycilcbiAgICBjbG9zZWQgPSB0cnVlXG4gICAgY2FsbGJhY2soKVxuICB9KVxuXG4gIHZhciBkZXN0cm95ZWQgPSBmYWxzZVxuICByZXR1cm4gZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChjbG9zZWQpIHJldHVyblxuICAgIGlmIChkZXN0cm95ZWQpIHJldHVyblxuICAgIGRlc3Ryb3llZCA9IHRydWVcblxuICAgIGlmIChpc0ZTKHN0cmVhbSkpIHJldHVybiBzdHJlYW0uY2xvc2Uobm9vcCkgLy8gdXNlIGNsb3NlIGZvciBmcyBzdHJlYW1zIHRvIGF2b2lkIGZkIGxlYWtzXG4gICAgaWYgKGlzUmVxdWVzdChzdHJlYW0pKSByZXR1cm4gc3RyZWFtLmFib3J0KCkgLy8gcmVxdWVzdC5kZXN0cm95IGp1c3QgZG8gLmVuZCAtIC5hYm9ydCBpcyB3aGF0IHdlIHdhbnRcblxuICAgIGlmIChpc0ZuKHN0cmVhbS5kZXN0cm95KSkgcmV0dXJuIHN0cmVhbS5kZXN0cm95KClcblxuICAgIGNhbGxiYWNrKGVyciB8fCBuZXcgRXJyb3IoJ3N0cmVhbSB3YXMgZGVzdHJveWVkJykpXG4gIH1cbn1cblxudmFyIGNhbGwgPSBmdW5jdGlvbiAoZm4pIHtcbiAgZm4oKVxufVxuXG52YXIgcGlwZSA9IGZ1bmN0aW9uIChmcm9tLCB0bykge1xuICByZXR1cm4gZnJvbS5waXBlKHRvKVxufVxuXG52YXIgcHVtcCA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIHN0cmVhbXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG4gIHZhciBjYWxsYmFjayA9IGlzRm4oc3RyZWFtc1tzdHJlYW1zLmxlbmd0aCAtIDFdIHx8IG5vb3ApICYmIHN0cmVhbXMucG9wKCkgfHwgbm9vcFxuXG4gIGlmIChBcnJheS5pc0FycmF5KHN0cmVhbXNbMF0pKSBzdHJlYW1zID0gc3RyZWFtc1swXVxuICBpZiAoc3RyZWFtcy5sZW5ndGggPCAyKSB0aHJvdyBuZXcgRXJyb3IoJ3B1bXAgcmVxdWlyZXMgdHdvIHN0cmVhbXMgcGVyIG1pbmltdW0nKVxuXG4gIHZhciBlcnJvclxuICB2YXIgZGVzdHJveXMgPSBzdHJlYW1zLm1hcChmdW5jdGlvbiAoc3RyZWFtLCBpKSB7XG4gICAgdmFyIHJlYWRpbmcgPSBpIDwgc3RyZWFtcy5sZW5ndGggLSAxXG4gICAgdmFyIHdyaXRpbmcgPSBpID4gMFxuICAgIHJldHVybiBkZXN0cm95ZXIoc3RyZWFtLCByZWFkaW5nLCB3cml0aW5nLCBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoIWVycm9yKSBlcnJvciA9IGVyclxuICAgICAgaWYgKGVycikgZGVzdHJveXMuZm9yRWFjaChjYWxsKVxuICAgICAgaWYgKHJlYWRpbmcpIHJldHVyblxuICAgICAgZGVzdHJveXMuZm9yRWFjaChjYWxsKVxuICAgICAgY2FsbGJhY2soZXJyb3IpXG4gICAgfSlcbiAgfSlcblxuICByZXR1cm4gc3RyZWFtcy5yZWR1Y2UocGlwZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBwdW1wXG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL3JldHJ5Jyk7IiwidmFyIFJldHJ5T3BlcmF0aW9uID0gcmVxdWlyZSgnLi9yZXRyeV9vcGVyYXRpb24nKTtcblxuZXhwb3J0cy5vcGVyYXRpb24gPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gIHZhciB0aW1lb3V0cyA9IGV4cG9ydHMudGltZW91dHMob3B0aW9ucyk7XG4gIHJldHVybiBuZXcgUmV0cnlPcGVyYXRpb24odGltZW91dHMsIHtcbiAgICAgIGZvcmV2ZXI6IG9wdGlvbnMgJiYgKG9wdGlvbnMuZm9yZXZlciB8fCBvcHRpb25zLnJldHJpZXMgPT09IEluZmluaXR5KSxcbiAgICAgIHVucmVmOiBvcHRpb25zICYmIG9wdGlvbnMudW5yZWYsXG4gICAgICBtYXhSZXRyeVRpbWU6IG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhSZXRyeVRpbWVcbiAgfSk7XG59O1xuXG5leHBvcnRzLnRpbWVvdXRzID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdChvcHRpb25zKTtcbiAgfVxuXG4gIHZhciBvcHRzID0ge1xuICAgIHJldHJpZXM6IDEwLFxuICAgIGZhY3RvcjogMixcbiAgICBtaW5UaW1lb3V0OiAxICogMTAwMCxcbiAgICBtYXhUaW1lb3V0OiBJbmZpbml0eSxcbiAgICByYW5kb21pemU6IGZhbHNlXG4gIH07XG4gIGZvciAodmFyIGtleSBpbiBvcHRpb25zKSB7XG4gICAgb3B0c1trZXldID0gb3B0aW9uc1trZXldO1xuICB9XG5cbiAgaWYgKG9wdHMubWluVGltZW91dCA+IG9wdHMubWF4VGltZW91dCkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWluVGltZW91dCBpcyBncmVhdGVyIHRoYW4gbWF4VGltZW91dCcpO1xuICB9XG5cbiAgdmFyIHRpbWVvdXRzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0cy5yZXRyaWVzOyBpKyspIHtcbiAgICB0aW1lb3V0cy5wdXNoKHRoaXMuY3JlYXRlVGltZW91dChpLCBvcHRzKSk7XG4gIH1cblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmZvcmV2ZXIgJiYgIXRpbWVvdXRzLmxlbmd0aCkge1xuICAgIHRpbWVvdXRzLnB1c2godGhpcy5jcmVhdGVUaW1lb3V0KGksIG9wdHMpKTtcbiAgfVxuXG4gIC8vIHNvcnQgdGhlIGFycmF5IG51bWVyaWNhbGx5IGFzY2VuZGluZ1xuICB0aW1lb3V0cy5zb3J0KGZ1bmN0aW9uKGEsYikge1xuICAgIHJldHVybiBhIC0gYjtcbiAgfSk7XG5cbiAgcmV0dXJuIHRpbWVvdXRzO1xufTtcblxuZXhwb3J0cy5jcmVhdGVUaW1lb3V0ID0gZnVuY3Rpb24oYXR0ZW1wdCwgb3B0cykge1xuICB2YXIgcmFuZG9tID0gKG9wdHMucmFuZG9taXplKVxuICAgID8gKE1hdGgucmFuZG9tKCkgKyAxKVxuICAgIDogMTtcblxuICB2YXIgdGltZW91dCA9IE1hdGgucm91bmQocmFuZG9tICogTWF0aC5tYXgob3B0cy5taW5UaW1lb3V0LCAxKSAqIE1hdGgucG93KG9wdHMuZmFjdG9yLCBhdHRlbXB0KSk7XG4gIHRpbWVvdXQgPSBNYXRoLm1pbih0aW1lb3V0LCBvcHRzLm1heFRpbWVvdXQpO1xuXG4gIHJldHVybiB0aW1lb3V0O1xufTtcblxuZXhwb3J0cy53cmFwID0gZnVuY3Rpb24ob2JqLCBvcHRpb25zLCBtZXRob2RzKSB7XG4gIGlmIChvcHRpb25zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBtZXRob2RzID0gb3B0aW9ucztcbiAgICBvcHRpb25zID0gbnVsbDtcbiAgfVxuXG4gIGlmICghbWV0aG9kcykge1xuICAgIG1ldGhvZHMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9ialtrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG1ldGhvZHMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBtZXRob2QgICA9IG1ldGhvZHNbaV07XG4gICAgdmFyIG9yaWdpbmFsID0gb2JqW21ldGhvZF07XG5cbiAgICBvYmpbbWV0aG9kXSA9IGZ1bmN0aW9uIHJldHJ5V3JhcHBlcihvcmlnaW5hbCkge1xuICAgICAgdmFyIG9wICAgICAgID0gZXhwb3J0cy5vcGVyYXRpb24ob3B0aW9ucyk7XG4gICAgICB2YXIgYXJncyAgICAgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgdmFyIGNhbGxiYWNrID0gYXJncy5wb3AoKTtcblxuICAgICAgYXJncy5wdXNoKGZ1bmN0aW9uKGVycikge1xuICAgICAgICBpZiAob3AucmV0cnkoZXJyKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgYXJndW1lbnRzWzBdID0gb3AubWFpbkVycm9yKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FsbGJhY2suYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH0pO1xuXG4gICAgICBvcC5hdHRlbXB0KGZ1bmN0aW9uKCkge1xuICAgICAgICBvcmlnaW5hbC5hcHBseShvYmosIGFyZ3MpO1xuICAgICAgfSk7XG4gICAgfS5iaW5kKG9iaiwgb3JpZ2luYWwpO1xuICAgIG9ialttZXRob2RdLm9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG59O1xuIiwiZnVuY3Rpb24gUmV0cnlPcGVyYXRpb24odGltZW91dHMsIG9wdGlvbnMpIHtcbiAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgdGhlIG9sZCAodGltZW91dHMsIHJldHJ5Rm9yZXZlcikgc2lnbmF0dXJlXG4gIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgb3B0aW9ucyA9IHsgZm9yZXZlcjogb3B0aW9ucyB9O1xuICB9XG5cbiAgdGhpcy5fb3JpZ2luYWxUaW1lb3V0cyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGltZW91dHMpKTtcbiAgdGhpcy5fdGltZW91dHMgPSB0aW1lb3V0cztcbiAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHRoaXMuX21heFJldHJ5VGltZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5tYXhSZXRyeVRpbWUgfHwgSW5maW5pdHk7XG4gIHRoaXMuX2ZuID0gbnVsbDtcbiAgdGhpcy5fZXJyb3JzID0gW107XG4gIHRoaXMuX2F0dGVtcHRzID0gMTtcbiAgdGhpcy5fb3BlcmF0aW9uVGltZW91dCA9IG51bGw7XG4gIHRoaXMuX29wZXJhdGlvblRpbWVvdXRDYiA9IG51bGw7XG4gIHRoaXMuX3RpbWVvdXQgPSBudWxsO1xuICB0aGlzLl9vcGVyYXRpb25TdGFydCA9IG51bGw7XG4gIHRoaXMuX3RpbWVyID0gbnVsbDtcblxuICBpZiAodGhpcy5fb3B0aW9ucy5mb3JldmVyKSB7XG4gICAgdGhpcy5fY2FjaGVkVGltZW91dHMgPSB0aGlzLl90aW1lb3V0cy5zbGljZSgwKTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBSZXRyeU9wZXJhdGlvbjtcblxuUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX2F0dGVtcHRzID0gMTtcbiAgdGhpcy5fdGltZW91dHMgPSB0aGlzLl9vcmlnaW5hbFRpbWVvdXRzLnNsaWNlKDApO1xufVxuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fdGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgfVxuICBpZiAodGhpcy5fdGltZXIpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpO1xuICB9XG5cbiAgdGhpcy5fdGltZW91dHMgICAgICAgPSBbXTtcbiAgdGhpcy5fY2FjaGVkVGltZW91dHMgPSBudWxsO1xufTtcblxuUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnJldHJ5ID0gZnVuY3Rpb24oZXJyKSB7XG4gIGlmICh0aGlzLl90aW1lb3V0KSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuICB9XG5cbiAgaWYgKCFlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIGN1cnJlbnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gIGlmIChlcnIgJiYgY3VycmVudFRpbWUgLSB0aGlzLl9vcGVyYXRpb25TdGFydCA+PSB0aGlzLl9tYXhSZXRyeVRpbWUpIHtcbiAgICB0aGlzLl9lcnJvcnMucHVzaChlcnIpO1xuICAgIHRoaXMuX2Vycm9ycy51bnNoaWZ0KG5ldyBFcnJvcignUmV0cnlPcGVyYXRpb24gdGltZW91dCBvY2N1cnJlZCcpKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB0aGlzLl9lcnJvcnMucHVzaChlcnIpO1xuXG4gIHZhciB0aW1lb3V0ID0gdGhpcy5fdGltZW91dHMuc2hpZnQoKTtcbiAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLl9jYWNoZWRUaW1lb3V0cykge1xuICAgICAgLy8gcmV0cnkgZm9yZXZlciwgb25seSBrZWVwIGxhc3QgZXJyb3JcbiAgICAgIHRoaXMuX2Vycm9ycy5zcGxpY2UoMCwgdGhpcy5fZXJyb3JzLmxlbmd0aCAtIDEpO1xuICAgICAgdGltZW91dCA9IHRoaXMuX2NhY2hlZFRpbWVvdXRzLnNsaWNlKC0xKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgdGhpcy5fdGltZXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgIHNlbGYuX2F0dGVtcHRzKys7XG5cbiAgICBpZiAoc2VsZi5fb3BlcmF0aW9uVGltZW91dENiKSB7XG4gICAgICBzZWxmLl90aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgc2VsZi5fb3BlcmF0aW9uVGltZW91dENiKHNlbGYuX2F0dGVtcHRzKTtcbiAgICAgIH0sIHNlbGYuX29wZXJhdGlvblRpbWVvdXQpO1xuXG4gICAgICBpZiAoc2VsZi5fb3B0aW9ucy51bnJlZikge1xuICAgICAgICAgIHNlbGYuX3RpbWVvdXQudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZWxmLl9mbihzZWxmLl9hdHRlbXB0cyk7XG4gIH0sIHRpbWVvdXQpO1xuXG4gIGlmICh0aGlzLl9vcHRpb25zLnVucmVmKSB7XG4gICAgICB0aGlzLl90aW1lci51bnJlZigpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuYXR0ZW1wdCA9IGZ1bmN0aW9uKGZuLCB0aW1lb3V0T3BzKSB7XG4gIHRoaXMuX2ZuID0gZm47XG5cbiAgaWYgKHRpbWVvdXRPcHMpIHtcbiAgICBpZiAodGltZW91dE9wcy50aW1lb3V0KSB7XG4gICAgICB0aGlzLl9vcGVyYXRpb25UaW1lb3V0ID0gdGltZW91dE9wcy50aW1lb3V0O1xuICAgIH1cbiAgICBpZiAodGltZW91dE9wcy5jYikge1xuICAgICAgdGhpcy5fb3BlcmF0aW9uVGltZW91dENiID0gdGltZW91dE9wcy5jYjtcbiAgICB9XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIGlmICh0aGlzLl9vcGVyYXRpb25UaW1lb3V0Q2IpIHtcbiAgICB0aGlzLl90aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHNlbGYuX29wZXJhdGlvblRpbWVvdXRDYigpO1xuICAgIH0sIHNlbGYuX29wZXJhdGlvblRpbWVvdXQpO1xuICB9XG5cbiAgdGhpcy5fb3BlcmF0aW9uU3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuICB0aGlzLl9mbih0aGlzLl9hdHRlbXB0cyk7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUudHJ5ID0gZnVuY3Rpb24oZm4pIHtcbiAgY29uc29sZS5sb2coJ1VzaW5nIFJldHJ5T3BlcmF0aW9uLnRyeSgpIGlzIGRlcHJlY2F0ZWQnKTtcbiAgdGhpcy5hdHRlbXB0KGZuKTtcbn07XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5zdGFydCA9IGZ1bmN0aW9uKGZuKSB7XG4gIGNvbnNvbGUubG9nKCdVc2luZyBSZXRyeU9wZXJhdGlvbi5zdGFydCgpIGlzIGRlcHJlY2F0ZWQnKTtcbiAgdGhpcy5hdHRlbXB0KGZuKTtcbn07XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5zdGFydCA9IFJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS50cnk7XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5lcnJvcnMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2Vycm9ycztcbn07XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5hdHRlbXB0cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5fYXR0ZW1wdHM7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUubWFpbkVycm9yID0gZnVuY3Rpb24oKSB7XG4gIGlmICh0aGlzLl9lcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgY291bnRzID0ge307XG4gIHZhciBtYWluRXJyb3IgPSBudWxsO1xuICB2YXIgbWFpbkVycm9yQ291bnQgPSAwO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fZXJyb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGVycm9yID0gdGhpcy5fZXJyb3JzW2ldO1xuICAgIHZhciBtZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICB2YXIgY291bnQgPSAoY291bnRzW21lc3NhZ2VdIHx8IDApICsgMTtcblxuICAgIGNvdW50c1ttZXNzYWdlXSA9IGNvdW50O1xuXG4gICAgaWYgKGNvdW50ID49IG1haW5FcnJvckNvdW50KSB7XG4gICAgICBtYWluRXJyb3IgPSBlcnJvcjtcbiAgICAgIG1haW5FcnJvckNvdW50ID0gY291bnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1haW5FcnJvcjtcbn07XG4iLCIvLyBSZXR1cm5zIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB3cmFwcGVkIGNhbGxiYWNrXG4vLyBUaGUgd3JhcHBlciBmdW5jdGlvbiBzaG91bGQgZG8gc29tZSBzdHVmZiwgYW5kIHJldHVybiBhXG4vLyBwcmVzdW1hYmx5IGRpZmZlcmVudCBjYWxsYmFjayBmdW5jdGlvbi5cbi8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG93biBwcm9wZXJ0aWVzIGFyZSByZXRhaW5lZCwgc28gdGhhdFxuLy8gZGVjb3JhdGlvbnMgYW5kIHN1Y2ggYXJlIG5vdCBsb3N0IGFsb25nIHRoZSB3YXkuXG5tb2R1bGUuZXhwb3J0cyA9IHdyYXBweVxuZnVuY3Rpb24gd3JhcHB5IChmbiwgY2IpIHtcbiAgaWYgKGZuICYmIGNiKSByZXR1cm4gd3JhcHB5KGZuKShjYilcblxuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ25lZWQgd3JhcHBlciBmdW5jdGlvbicpXG5cbiAgT2JqZWN0LmtleXMoZm4pLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICB3cmFwcGVyW2tdID0gZm5ba11cbiAgfSlcblxuICByZXR1cm4gd3JhcHBlclxuXG4gIGZ1bmN0aW9uIHdyYXBwZXIoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aClcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFyZ3NbaV0gPSBhcmd1bWVudHNbaV1cbiAgICB9XG4gICAgdmFyIHJldCA9IGZuLmFwcGx5KHRoaXMsIGFyZ3MpXG4gICAgdmFyIGNiID0gYXJnc1thcmdzLmxlbmd0aC0xXVxuICAgIGlmICh0eXBlb2YgcmV0ID09PSAnZnVuY3Rpb24nICYmIHJldCAhPT0gY2IpIHtcbiAgICAgIE9iamVjdC5rZXlzKGNiKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICAgIHJldFtrXSA9IGNiW2tdXG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gcmV0XG4gIH1cbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RzID0gZXhwb3J0cy5lcyA9IGV4cG9ydHMua21zID0gZXhwb3J0cy5zeXN0ZW1zTWFuYWdlciA9IGV4cG9ydHMuc2VjcmV0c01hbmFnZXIgPSBleHBvcnRzLnNucyA9IGV4cG9ydHMuY2YgPSBleHBvcnRzLnNmbiA9IGV4cG9ydHMuZHluYW1vZGJEb2NDbGllbnQgPSBleHBvcnRzLmR5bmFtb2Ric3RyZWFtcyA9IGV4cG9ydHMuZHluYW1vZGIgPSBleHBvcnRzLmNsb3Vkd2F0Y2ggPSBleHBvcnRzLmNsb3Vkd2F0Y2hsb2dzID0gZXhwb3J0cy5jbG91ZHdhdGNoZXZlbnRzID0gZXhwb3J0cy5zcXMgPSBleHBvcnRzLmxhbWJkYSA9IGV4cG9ydHMua2luZXNpcyA9IGV4cG9ydHMuczMgPSBleHBvcnRzLmVjMiA9IGV4cG9ydHMuZWNzID0gZXhwb3J0cy5hcGlnYXRld2F5ID0gdm9pZCAwO1xuY29uc3QgQVdTID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJhd3Mtc2RrXCIpKTtcbmNvbnN0IGF3c0NsaWVudCA9IHJlcXVpcmUoXCIuL2NsaWVudFwiKTtcbmV4cG9ydHMuYXBpZ2F0ZXdheSA9IGF3c0NsaWVudChBV1MuQVBJR2F0ZXdheSwgJzIwMTUtMDctMDknKTtcbmV4cG9ydHMuZWNzID0gYXdzQ2xpZW50KEFXUy5FQ1MsICcyMDE0LTExLTEzJyk7XG5leHBvcnRzLmVjMiA9IGF3c0NsaWVudChBV1MuRUMyLCAnMjAxNi0xMS0xNScpO1xuZXhwb3J0cy5zMyA9IGF3c0NsaWVudChBV1MuUzMsICcyMDA2LTAzLTAxJyk7XG5leHBvcnRzLmtpbmVzaXMgPSBhd3NDbGllbnQoQVdTLktpbmVzaXMsICcyMDEzLTEyLTAyJyk7XG5leHBvcnRzLmxhbWJkYSA9IGF3c0NsaWVudChBV1MuTGFtYmRhLCAnMjAxNS0wMy0zMScpO1xuZXhwb3J0cy5zcXMgPSBhd3NDbGllbnQoQVdTLlNRUywgJzIwMTItMTEtMDUnKTtcbmV4cG9ydHMuY2xvdWR3YXRjaGV2ZW50cyA9IGF3c0NsaWVudChBV1MuQ2xvdWRXYXRjaEV2ZW50cywgJzIwMTQtMDItMDMnKTtcbmV4cG9ydHMuY2xvdWR3YXRjaGxvZ3MgPSBhd3NDbGllbnQoQVdTLkNsb3VkV2F0Y2hMb2dzLCAnMjAxNC0wMy0yOCcpO1xuZXhwb3J0cy5jbG91ZHdhdGNoID0gYXdzQ2xpZW50KEFXUy5DbG91ZFdhdGNoLCAnMjAxMC0wOC0wMScpO1xuZXhwb3J0cy5keW5hbW9kYiA9IGF3c0NsaWVudChBV1MuRHluYW1vREIsICcyMDEyLTA4LTEwJyk7XG5leHBvcnRzLmR5bmFtb2Ric3RyZWFtcyA9IGF3c0NsaWVudChBV1MuRHluYW1vREJTdHJlYW1zLCAnMjAxMi0wOC0xMCcpO1xuZXhwb3J0cy5keW5hbW9kYkRvY0NsaWVudCA9IGF3c0NsaWVudChBV1MuRHluYW1vREIuRG9jdW1lbnRDbGllbnQsICcyMDEyLTA4LTEwJyk7XG5leHBvcnRzLnNmbiA9IGF3c0NsaWVudChBV1MuU3RlcEZ1bmN0aW9ucywgJzIwMTYtMTEtMjMnKTtcbmV4cG9ydHMuY2YgPSBhd3NDbGllbnQoQVdTLkNsb3VkRm9ybWF0aW9uLCAnMjAxMC0wNS0xNScpO1xuZXhwb3J0cy5zbnMgPSBhd3NDbGllbnQoQVdTLlNOUywgJzIwMTAtMDMtMzEnKTtcbmV4cG9ydHMuc2VjcmV0c01hbmFnZXIgPSBhd3NDbGllbnQoQVdTLlNlY3JldHNNYW5hZ2VyLCAnMjAxNy0xMC0xNycpO1xuZXhwb3J0cy5zeXN0ZW1zTWFuYWdlciA9IGF3c0NsaWVudChBV1MuU1NNLCAnMjAxNy0xMC0xNycpO1xuZXhwb3J0cy5rbXMgPSBhd3NDbGllbnQoQVdTLktNUywgJzIwMTQtMTEtMDEnKTtcbmV4cG9ydHMuZXMgPSBhd3NDbGllbnQoQVdTLkVTLCAnMjAxNS0wMS0wMScpO1xuZXhwb3J0cy5zdHMgPSBhd3NDbGllbnQoQVdTLlNUUywgJzIwMTEtMDYtMTUnKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlcnZpY2VzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy50aHJvdHRsZU9uY2UgPSBleHBvcnRzLnRlc3RBd3NDbGllbnQgPSBleHBvcnRzLmdldExvY2Fsc3RhY2tFbmRwb2ludCA9IGV4cG9ydHMuaW5UZXN0TW9kZSA9IHZvaWQgMDtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIkBjdW11bHVzL2Vycm9yc1wiKTtcbmV4cG9ydHMuaW5UZXN0TW9kZSA9ICgpID0+IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCc7XG4vLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2NhbHN0YWNrL2xvY2Fsc3RhY2svYmxvYi9tYXN0ZXIvUkVBRE1FLm1kXG5jb25zdCBsb2NhbFN0YWNrUG9ydHMgPSB7XG4gICAgc3RlcGZ1bmN0aW9uczogNDU4NSxcbiAgICBhcGlnYXRld2F5OiA0NTY3LFxuICAgIGNsb3VkZm9ybWF0aW9uOiA0NTgxLFxuICAgIGNsb3Vkd2F0Y2g6IDQ1ODIsXG4gICAgY2xvdWR3YXRjaGV2ZW50czogNDU4MixcbiAgICBjbG91ZHdhdGNobG9nczogNDU4NixcbiAgICBkeW5hbW9kYjogNDU2NCxcbiAgICBlczogNDU3MSxcbiAgICBmaXJlaG9zZTogNDU3MyxcbiAgICBpYW06IDQ1OTMsXG4gICAga2luZXNpczogNDU2OCxcbiAgICBrbXM6IDQ1OTksXG4gICAgbGFtYmRhOiA0NTc0LFxuICAgIHJlZHNoaWZ0OiA0NTc3LFxuICAgIHJvdXRlNTM6IDQ1ODAsXG4gICAgczM6IDQ1NzIsXG4gICAgc2VjcmV0c21hbmFnZXI6IDQ1ODQsXG4gICAgc2VzOiA0NTc5LFxuICAgIHNuczogNDU3NSxcbiAgICBzcXM6IDQ1NzYsXG4gICAgc3NtOiA0NTgzLFxuICAgIHN0czogNDU5Mixcbn07XG4vKipcbiAqIFRlc3QgaWYgYSBnaXZlbiBBV1Mgc2VydmljZSBpcyBzdXBwb3J0ZWQgYnkgTG9jYWxTdGFjay5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBzZXJ2aWNlSWRlbnRpZmllciAtIGFuIEFXUyBzZXJ2aWNlIG9iamVjdCBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59IHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlcnZpY2UgaXNcbiAqICAgc3VwcG9ydGVkIGJ5IExvY2FsU3RhY2tcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2NhbHN0YWNrU3VwcG9ydGVkU2VydmljZShzZXJ2aWNlSWRlbnRpZmllcikge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhsb2NhbFN0YWNrUG9ydHMpLmluY2x1ZGVzKHNlcnZpY2VJZGVudGlmaWVyKTtcbn1cbi8qKlxuICogUmV0dXJucyB0aGUgcHJvcGVyIGVuZHBvaW50IGZvciBhIGdpdmVuIGF3cyBzZXJ2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlkZW50aWZpZXIgLSBzZXJ2aWNlIG5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBsb2NhbHN0YWNrIGVuZHBvaW50XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0TG9jYWxzdGFja0VuZHBvaW50KGlkZW50aWZpZXIpIHtcbiAgICBjb25zdCBrZXkgPSBgTE9DQUxfJHtpZGVudGlmaWVyLnRvVXBwZXJDYXNlKCl9X0hPU1RgO1xuICAgIGlmIChwcm9jZXNzLmVudltrZXldKSB7XG4gICAgICAgIHJldHVybiBgaHR0cDovLyR7cHJvY2Vzcy5lbnZba2V5XX06JHtsb2NhbFN0YWNrUG9ydHNbaWRlbnRpZmllcl19YDtcbiAgICB9XG4gICAgcmV0dXJuIGBodHRwOi8vJHtwcm9jZXNzLmVudi5MT0NBTFNUQUNLX0hPU1R9OiR7bG9jYWxTdGFja1BvcnRzW2lkZW50aWZpZXJdfWA7XG59XG5leHBvcnRzLmdldExvY2Fsc3RhY2tFbmRwb2ludCA9IGdldExvY2Fsc3RhY2tFbmRwb2ludDtcbi8qKlxuICogQ3JlYXRlIGFuIEFXUyBzZXJ2aWNlIG9iamVjdCB0aGF0IHRhbGtzIHRvIExvY2FsU3RhY2suXG4gKlxuICogVGhpcyBmdW5jdGlvbiBleHBlY3RzIHRoYXQgdGhlIExPQ0FMU1RBQ0tfSE9TVCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNldC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBTZXJ2aWNlIC0gYW4gQVdTIHNlcnZpY2Ugb2JqZWN0IGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgc2VydmljZSBvYmplY3QgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IGFuIEFXUyBzZXJ2aWNlIG9iamVjdFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGxvY2FsU3RhY2tBd3NDbGllbnQoU2VydmljZSwgb3B0aW9ucykge1xuICAgIGlmICghcHJvY2Vzcy5lbnYuTE9DQUxTVEFDS19IT1NUKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIExPQ0FMU1RBQ0tfSE9TVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBub3Qgc2V0LicpO1xuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3Qgc2VydmljZUlkZW50aWZpZXIgPSBTZXJ2aWNlLnNlcnZpY2VJZGVudGlmaWVyO1xuICAgIGNvbnN0IGxvY2FsU3RhY2tPcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBhY2Nlc3NLZXlJZDogJ215LWFjY2Vzcy1rZXktaWQnLFxuICAgICAgICBzZWNyZXRBY2Nlc3NLZXk6ICdteS1zZWNyZXQtYWNjZXNzLWtleScsXG4gICAgICAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gICAgICAgIGVuZHBvaW50OiBnZXRMb2NhbHN0YWNrRW5kcG9pbnQoc2VydmljZUlkZW50aWZpZXIpLFxuICAgIH07XG4gICAgaWYgKHNlcnZpY2VJZGVudGlmaWVyID09PSAnczMnKVxuICAgICAgICBsb2NhbFN0YWNrT3B0aW9ucy5zM0ZvcmNlUGF0aFN0eWxlID0gdHJ1ZTtcbiAgICByZXR1cm4gbmV3IFNlcnZpY2UobG9jYWxTdGFja09wdGlvbnMpO1xufVxuLyoqXG4gKiBDcmVhdGUgYW4gQVdTIHNlcnZpY2Ugb2JqZWN0IHRoYXQgZG9lcyBub3QgYWN0dWFsbHkgdGFsayB0byBBV1MuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gU2VydmljZSAtIGFuIEFXUyBzZXJ2aWNlIG9iamVjdCBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIHNlcnZpY2Ugb2JqZWN0IGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBhbiBBV1Mgc2VydmljZSBvYmplY3RcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB0ZXN0QXdzQ2xpZW50KFNlcnZpY2UsIG9wdGlvbnMpIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3Qgc2VydmljZUlkZW50aWZpZXIgPSBTZXJ2aWNlLnNlcnZpY2VJZGVudGlmaWVyO1xuICAgIGlmIChsb2NhbHN0YWNrU3VwcG9ydGVkU2VydmljZShzZXJ2aWNlSWRlbnRpZmllcikpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RhY2tBd3NDbGllbnQoU2VydmljZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbn1cbmV4cG9ydHMudGVzdEF3c0NsaWVudCA9IHRlc3RBd3NDbGllbnQ7XG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgdGhyb3dzIGEgVGhyb3R0bGluZ0V4Y2VwdGlvbiB0aGUgZmlyc3QgdGltZSBpdCBpcyBjYWxsZWQsIHRoZW4gcmV0dXJucyBhc1xuICogbm9ybWFsIGFueSBvdGhlciB0aW1lcy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMudGhyb3R0bGVPbmNlID0gKGZuKSA9PiB7XG4gICAgbGV0IHRocm90dGxlTmV4dENhbGwgPSB0cnVlO1xuICAgIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgICAgICBpZiAodGhyb3R0bGVOZXh0Q2FsbCkge1xuICAgICAgICAgICAgdGhyb3R0bGVOZXh0Q2FsbCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9yc18xLlRocm90dGxpbmdFeGNlcHRpb24oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD10ZXN0LXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5yZXRyeU9uVGhyb3R0bGluZ0V4Y2VwdGlvbiA9IGV4cG9ydHMuaW1wcm92ZVN0YWNrVHJhY2UgPSBleHBvcnRzLnNldEVycm9yU3RhY2sgPSB2b2lkIDA7XG5jb25zdCBwX3JldHJ5XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInAtcmV0cnlcIikpO1xuY29uc3QgZXJyb3JzXzEgPSByZXF1aXJlKFwiQGN1bXVsdXMvZXJyb3JzXCIpO1xuLy8gUmVwbGFjZSB0aGUgc3RhY2sgb2YgYW4gZXJyb3Jcbi8vIE5vdGU6IFRoaXMgbXV0YXRlcyB0aGUgZXJyb3IgdGhhdCB3YXMgcGFzc2VkIGluLlxuZXhwb3J0cy5zZXRFcnJvclN0YWNrID0gKGVycm9yLCBuZXdTdGFjaykgPT4ge1xuICAgIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBbXG4gICAgICAgICAgICBlcnJvci5zdGFjay5zcGxpdCgnXFxuJylbMF0sXG4gICAgICAgICAgICAuLi5uZXdTdGFjay5zcGxpdCgnXFxuJykuc2xpY2UoMSksXG4gICAgICAgIF0uam9pbignXFxuJyk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgZXJyb3Iuc3RhY2sgPSBuZXdTdGFjaztcbiAgICB9XG59O1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHZhbGlkLWpzZG9jXG4vKipcbiAqIFdyYXAgYSBmdW5jdGlvbiBhbmQgcHJvdmlkZSBhIGJldHRlciBzdGFjayB0cmFjZVxuICpcbiAqIElmIGEgY2FsbCBpcyBtYWRlIHRvIHRoZSBhd3Mtc2RrIGFuZCBpdCBjYXVzZXMgYW4gZXhjZXB0aW9uLCB0aGUgc3RhY2sgdHJhY2VcbiAqIHRoYXQgaXMgcmV0dXJuZWQgZ2l2ZXMgbm8gaW5kaWNhdGlvbiBvZiB3aGVyZSB0aGUgZXJyb3IgYWN0dWFsbHkgb2NjdXJyZWQuXG4gKlxuICogVGhpcyB1dGlsaXR5IHdpbGwgd3JhcCBhIGZ1bmN0aW9uIGFuZCwgd2hlbiBpdCBpcyBjYWxsZWQsIHVwZGF0ZSBhbnkgcmFpc2VkXG4gKiBlcnJvciB3aXRoIGEgYmV0dGVyIHN0YWNrIHRyYWNlLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydHMuaW1wcm92ZVN0YWNrVHJhY2UgPSAoZm4pID0+IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgdHJhY2VyRXJyb3IgPSBuZXcgRXJyb3IoKTtcbiAgICB0cnkge1xuICAgICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0cmFjZXJFcnJvcik7XG4gICAgICAgIHJldHVybiBhd2FpdCBmbiguLi5hcmdzKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZXhwb3J0cy5zZXRFcnJvclN0YWNrKGVycm9yLCB0cmFjZXJFcnJvci5zdGFjayk7XG4gICAgICAgIGVycm9yLm1lc3NhZ2UgPSBgJHtlcnJvci5tZXNzYWdlfTsgRnVuY3Rpb24gcGFyYW1zOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MsIHVuZGVmaW5lZCwgMil9YDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufTtcbmNvbnN0IHJldHJ5SWZUaHJvdHRsaW5nRXhjZXB0aW9uID0gKGVycikgPT4ge1xuICAgIGlmIChlcnJvcnNfMS5pc1Rocm90dGxpbmdFeGNlcHRpb24oZXJyKSlcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgIHRocm93IG5ldyBwX3JldHJ5XzEuZGVmYXVsdC5BYm9ydEVycm9yKGVycik7XG59O1xuLyoqXG4gKiBXcmFwIGEgZnVuY3Rpb24gc28gdGhhdCBpdCB3aWxsIHJldHJ5IHdoZW4gYSBUaHJvdHRsaW5nRXhjZXB0aW9uIGlzIGVuY291bnRlcmVkLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gdGhlIGZ1bmN0aW9uIHRvIHJldHJ5LiAgVGhpcyBmdW5jdGlvbiBtdXN0IHJldHVybiBhIFByb21pc2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIHJldHJ5IG9wdGlvbnMsIGRvY3VtZW50ZWQgaGVyZTpcbiAqICAgLSBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3AtcmV0cnkjb3B0aW9uc1xuICogICAtIGh0dHBzOi8vZ2l0aHViLmNvbS90aW0ta29zL25vZGUtcmV0cnkjcmV0cnlvcGVyYXRpb25vcHRpb25zXG4gKiAgIC0gaHR0cHM6Ly9naXRodWIuY29tL3RpbS1rb3Mvbm9kZS1yZXRyeSNyZXRyeXRpbWVvdXRzb3B0aW9uc1xuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZXRyeSBvbiBhIFRocm90dGxpbmdFeGNlcHRpb25cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLnJldHJ5T25UaHJvdHRsaW5nRXhjZXB0aW9uID0gKGZuLCBvcHRpb25zID0ge30pID0+ICguLi5hcmdzKSA9PiBwX3JldHJ5XzEuZGVmYXVsdCgoKSA9PiBmbiguLi5hcmdzKS5jYXRjaChyZXRyeUlmVGhyb3R0bGluZ0V4Y2VwdGlvbiksIHsgbWF4VGltZW91dDogNTAwMCwgLi4ub3B0aW9ucyB9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2VuZXJhdGVDaGVja3N1bUZyb21TdHJlYW0gPSB2b2lkIDA7XG5jb25zdCBja3N1bSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY2tzdW1cIikpO1xuY29uc3QgY3J5cHRvID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJjcnlwdG9cIikpO1xuLy8gQ2FsY3VsYXRlIHRoZSBja3N1bSBvZiBhIHJlYWRhYmxlIHN0cmVhbVxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2tzdW1Gcm9tU3RyZWFtKHN0cmVhbSkge1xuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiBzdHJlYW1cbiAgICAgICAgLnBpcGUoY2tzdW0uc3RyZWFtKCh2YWx1ZSkgPT4gcmVzb2x2ZSh2YWx1ZS5yZWFkVUludDMyQkUoMCkpKSlcbiAgICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCkpO1xufVxuLy8gQ2FsY3VsYXRlIHRoZSBoYXNoIG9mIGEgcmVhZGFibGUgc3RyZWFtIHVzaW5nIGBjcnlwdG8uY3JlYXRlSGFzaCgpYFxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hlY2tzdW1Gcm9tU3RyZWFtKGFsZ29yaXRobSwgc3RyZWFtLCBvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goYWxnb3JpdGhtLCBvcHRpb25zKTtcbiAgICAgICAgc3RyZWFtLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIHN0cmVhbS5vbignZGF0YScsIChjaHVuaykgPT4gaGFzaC51cGRhdGUoY2h1bmspKTtcbiAgICAgICAgc3RyZWFtLm9uKCdlbmQnLCAoKSA9PiByZXNvbHZlKGhhc2guZGlnZXN0KCdoZXgnKSkpO1xuICAgIH0pO1xufVxuLyoqXG4gKiBDcmVhdGUgPGFsZ29yaXRobT4gZmlsZSBjaGVja3N1bSBmcm9tIHJlYWRhYmxlIHN0cmVhbVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbGdvcml0aG0gLSBDaGVja3N1bSBhbGdvcml0aG0gdHlwZVxuICogQHBhcmFtIHtzdHJlYW0uUmVhZGFibGV9IHN0cmVhbSAtIEEgcmVhZGFibGUgZmlsZSBzdHJlYW1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBDaGVja3N1bSBvcHRpb25zLCBzZWUgYGNyeXB0by5jcmVhdGVIYXNoKClgXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyfHN0cmluZz59IHRoZSBmaWxlIGNoZWNrc3VtXG4gKlxuICogQGFsaWFzIG1vZHVsZTpjaGVja3N1bS5nZW5lcmF0ZUNoZWNrc3VtRnJvbVN0cmVhbVxuICovXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNoZWNrc3VtRnJvbVN0cmVhbShhbGdvcml0aG0sIHN0cmVhbSwgb3B0aW9ucykge1xuICAgIGlmIChhbGdvcml0aG0udG9Mb3dlckNhc2UoKSA9PT0gJ2Nrc3VtJykge1xuICAgICAgICByZXR1cm4gYXdhaXQgZ2V0Q2tzdW1Gcm9tU3RyZWFtKHN0cmVhbSk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCBnZXRDaGVja3N1bUZyb21TdHJlYW0oYWxnb3JpdGhtLCBzdHJlYW0sIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5nZW5lcmF0ZUNoZWNrc3VtRnJvbVN0cmVhbSA9IGdlbmVyYXRlQ2hlY2tzdW1Gcm9tU3RyZWFtO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y2hlY2tzdW0uanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5jb25zdCBpc0Vycm9yID0gcmVxdWlyZShcImxvZGFzaC5pc2Vycm9yXCIpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoXCJ1dGlsXCIpO1xuY2xhc3MgTG9nZ2VyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5hc3luY09wZXJhdGlvbklkID0gb3B0aW9ucy5hc3luY09wZXJhdGlvbklkO1xuICAgICAgICB0aGlzLmV4ZWN1dGlvbnMgPSBvcHRpb25zLmV4ZWN1dGlvbnM7XG4gICAgICAgIHRoaXMuZ3JhbnVsZXMgPSBvcHRpb25zLmdyYW51bGVzO1xuICAgICAgICB0aGlzLnBhcmVudEFybiA9IG9wdGlvbnMucGFyZW50QXJuO1xuICAgICAgICB0aGlzLnByZXR0eSA9IG9wdGlvbnMucHJldHR5IHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbmRlciA9IG9wdGlvbnMuc2VuZGVyIHx8ICd1bmtub3duJztcbiAgICAgICAgdGhpcy5zdGFja05hbWUgPSBvcHRpb25zLnN0YWNrTmFtZTtcbiAgICAgICAgdGhpcy5jb25zb2xlID0gb3B0aW9ucy5jb25zb2xlIHx8IGdsb2JhbC5jb25zb2xlO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSBvcHRpb25zLnZlcnNpb247XG4gICAgfVxuICAgIGJ1aWxkTWVzc2FnZShsZXZlbCwgLi4ubWVzc2FnZUFyZ3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRMb2dFdmVudE1lc3NhZ2UobGV2ZWwsIG1lc3NhZ2VBcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGEgZGVidWcgbWVzc2FnZVxuICAgICAqL1xuICAgIGRlYnVnKC4uLm1lc3NhZ2VBcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGVMb2dFdmVudCgnZGVidWcnLCBtZXNzYWdlQXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZyBhbiBlcnJvciBtZXNzYWdlXG4gICAgICovXG4gICAgZXJyb3IoLi4ubWVzc2FnZUFyZ3MpIHtcbiAgICAgICAgY29uc3QgbGFzdE1lc3NhZ2VBcmcgPSBtZXNzYWdlQXJnc1ttZXNzYWdlQXJncy5sZW5ndGggLSAxXTtcbiAgICAgICAgaWYgKGlzRXJyb3IobGFzdE1lc3NhZ2VBcmcpKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IGxhc3RNZXNzYWdlQXJnO1xuICAgICAgICAgICAgbGV0IGFjdHVhbE1lc3NhZ2VBcmdzID0gbWVzc2FnZUFyZ3Muc2xpY2UoMCwgbWVzc2FnZUFyZ3MubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgICBpZiAoYWN0dWFsTWVzc2FnZUFyZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgIGFjdHVhbE1lc3NhZ2VBcmdzID0gW2Vycm9yLm1lc3NhZ2VdO1xuICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEtleXMgPSB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGFjaylcbiAgICAgICAgICAgICAgICBhZGRpdGlvbmFsS2V5cy5lcnJvci5zdGFjayA9IGVycm9yLnN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIHRoaXMud3JpdGVMb2dFdmVudCgnZXJyb3InLCBhY3R1YWxNZXNzYWdlQXJncywgYWRkaXRpb25hbEtleXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy53cml0ZUxvZ0V2ZW50KCdlcnJvcicsIG1lc3NhZ2VBcmdzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2cgYSBmYXRhbCBtZXNzYWdlXG4gICAgICovXG4gICAgZmF0YWwoLi4ubWVzc2FnZUFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZUxvZ0V2ZW50KCdmYXRhbCcsIG1lc3NhZ2VBcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGFuIGluZm8gbWVzc2FnZVxuICAgICAqL1xuICAgIGluZm8oLi4ubWVzc2FnZUFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZUxvZ0V2ZW50KCdpbmZvJywgbWVzc2FnZUFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2cgYW4gZXZlbnQgd2l0aCBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhZGRpdGlvbmFsS2V5c1xuICAgICAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gbWVzc2FnZUFyZ3MgLSB0aGUgbWVzc2FnZSB0byBsb2dcbiAgICAgKi9cbiAgICBpbmZvV2l0aEFkZGl0aW9uYWxLZXlzKGFkZGl0aW9uYWxLZXlzLCAuLi5tZXNzYWdlQXJncykge1xuICAgICAgICB0aGlzLndyaXRlTG9nRXZlbnQoJ2luZm8nLCBtZXNzYWdlQXJncywgYWRkaXRpb25hbEtleXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2cgYSB0cmFjZSBtZXNzYWdlXG4gICAgICovXG4gICAgdHJhY2UoLi4ubWVzc2FnZUFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZUxvZ0V2ZW50KCd0cmFjZScsIG1lc3NhZ2VBcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGEgd2FybmluZyBtZXNzYWdlXG4gICAgICovXG4gICAgd2FybiguLi5tZXNzYWdlQXJncykge1xuICAgICAgICB0aGlzLndyaXRlTG9nRXZlbnQoJ3dhcm4nLCBtZXNzYWdlQXJncyk7XG4gICAgfVxuICAgIGJ1aWxkTG9nRXZlbnRNZXNzYWdlKGxldmVsLCBtZXNzYWdlQXJncywgYWRkaXRpb25hbEtleXMgPSB7fSkge1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgaWYgKG1lc3NhZ2VBcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgbWVzc2FnZSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbWVzc2FnZSA9IHV0aWwuZm9ybWF0KG1lc3NhZ2VBcmdzWzBdLCAuLi5tZXNzYWdlQXJncy5zbGljZSgxKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhbmRhcmRMb2dFdmVudCA9IHtcbiAgICAgICAgICAgIGFzeW5jT3BlcmF0aW9uSWQ6IHRoaXMuYXN5bmNPcGVyYXRpb25JZCxcbiAgICAgICAgICAgIGV4ZWN1dGlvbnM6IHRoaXMuZXhlY3V0aW9ucyxcbiAgICAgICAgICAgIGdyYW51bGVzOiB0aGlzLmdyYW51bGVzLFxuICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgcGFyZW50QXJuOiB0aGlzLnBhcmVudEFybixcbiAgICAgICAgICAgIHNlbmRlcjogdGhpcy5zZW5kZXIsXG4gICAgICAgICAgICBzdGFja05hbWU6IHRoaXMuc3RhY2tOYW1lLFxuICAgICAgICAgICAgdGltZXN0YW1wOiAobmV3IERhdGUoKSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgbG9nRXZlbnQgPSB7XG4gICAgICAgICAgICAuLi5hZGRpdGlvbmFsS2V5cyxcbiAgICAgICAgICAgIC4uLnN0YW5kYXJkTG9nRXZlbnQsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB0aGlzLnByZXR0eVxuICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShsb2dFdmVudCwgdW5kZWZpbmVkLCAyKVxuICAgICAgICAgICAgOiBKU09OLnN0cmluZ2lmeShsb2dFdmVudCk7XG4gICAgfVxuICAgIHdyaXRlTG9nRXZlbnQobGV2ZWwsIG1lc3NhZ2VBcmdzLCBhZGRpdGlvbmFsS2V5cyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGxvZ0V2ZW50U3RyaW5nID0gdGhpcy5idWlsZExvZ0V2ZW50TWVzc2FnZShsZXZlbCwgbWVzc2FnZUFyZ3MsIGFkZGl0aW9uYWxLZXlzKTtcbiAgICAgICAgaWYgKGxldmVsID09PSAnZXJyb3InKVxuICAgICAgICAgICAgdGhpcy5jb25zb2xlLmVycm9yKGxvZ0V2ZW50U3RyaW5nKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhpcy5jb25zb2xlLmxvZyhsb2dFdmVudFN0cmluZyk7XG4gICAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSBMb2dnZXI7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudmFsaWRhdGVDaGVja3N1bUZyb21TdHJlYW0gPSB2b2lkIDA7XG5jb25zdCBjaGVja3N1bV8xID0gcmVxdWlyZShcIi4vY2hlY2tzdW1cIik7XG4vKipcbiAqIFZhbGlkYXRlIGV4cGVjdGVkIGNoZWNrc3VtIGFnYWluc3QgY2FsY3VsYXRlZCBjaGVja3N1bVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbGdvcml0aG0gLSBDaGVja3N1bSBhbGdvcml0aG1cbiAqIEBwYXJhbSB7c3RyZWFtLlJlYWRhYmxlfSBzdHJlYW0gLSBBIHJlYWRhYmxlIGZpbGUgc3RyZWFtXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IGV4cGVjdGVkU3VtIC0gZXhwZWN0ZWQgY2hlY2tzdW1cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBDaGVja3N1bSBvcHRpb25zXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IHdoZXRoZXIgZXhwZWN0ZWRTdW0gPT09IGNhbGN1bGF0ZWRTdW1cbiAqXG4gKiBAYWxpYXMgbW9kdWxlOmNoZWNrc3VtLnZhbGlkYXRlQ2hlY2tzdW1Gcm9tU3RyZWFtXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQ2hlY2tzdW1Gcm9tU3RyZWFtKGFsZ29yaXRobSwgc3RyZWFtLCBleHBlY3RlZFN1bSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY2FsY3VsYXRlZFN1bSA9IGF3YWl0IGNoZWNrc3VtXzEuZ2VuZXJhdGVDaGVja3N1bUZyb21TdHJlYW0oYWxnb3JpdGhtLCBzdHJlYW0sIG9wdGlvbnMpO1xuICAgIHJldHVybiBleHBlY3RlZFN1bSA9PT0gY2FsY3VsYXRlZFN1bTtcbn1cbmV4cG9ydHMudmFsaWRhdGVDaGVja3N1bUZyb21TdHJlYW0gPSB2YWxpZGF0ZUNoZWNrc3VtRnJvbVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZhbGlkYXRlLmpzLm1hcCIsInZhciBzdHJlYW0gPSByZXF1aXJlKCdzdHJlYW0nKVxuXG52YXIgY3JjdGFiID0gW1xuICAweDAwMDAwMDAwLFxuICAweDA0YzExZGI3LCAweDA5ODIzYjZlLCAweDBkNDMyNmQ5LCAweDEzMDQ3NmRjLCAweDE3YzU2YjZiLFxuICAweDFhODY0ZGIyLCAweDFlNDc1MDA1LCAweDI2MDhlZGI4LCAweDIyYzlmMDBmLCAweDJmOGFkNmQ2LFxuICAweDJiNGJjYjYxLCAweDM1MGM5YjY0LCAweDMxY2Q4NmQzLCAweDNjOGVhMDBhLCAweDM4NGZiZGJkLFxuICAweDRjMTFkYjcwLCAweDQ4ZDBjNmM3LCAweDQ1OTNlMDFlLCAweDQxNTJmZGE5LCAweDVmMTVhZGFjLFxuICAweDViZDRiMDFiLCAweDU2OTc5NmMyLCAweDUyNTY4Yjc1LCAweDZhMTkzNmM4LCAweDZlZDgyYjdmLFxuICAweDYzOWIwZGE2LCAweDY3NWExMDExLCAweDc5MWQ0MDE0LCAweDdkZGM1ZGEzLCAweDcwOWY3YjdhLFxuICAweDc0NWU2NmNkLCAweDk4MjNiNmUwLCAweDljZTJhYjU3LCAweDkxYTE4ZDhlLCAweDk1NjA5MDM5LFxuICAweDhiMjdjMDNjLCAweDhmZTZkZDhiLCAweDgyYTVmYjUyLCAweDg2NjRlNmU1LCAweGJlMmI1YjU4LFxuICAweGJhZWE0NmVmLCAweGI3YTk2MDM2LCAweGIzNjg3ZDgxLCAweGFkMmYyZDg0LCAweGE5ZWUzMDMzLFxuICAweGE0YWQxNmVhLCAweGEwNmMwYjVkLCAweGQ0MzI2ZDkwLCAweGQwZjM3MDI3LCAweGRkYjA1NmZlLFxuICAweGQ5NzE0YjQ5LCAweGM3MzYxYjRjLCAweGMzZjcwNmZiLCAweGNlYjQyMDIyLCAweGNhNzUzZDk1LFxuICAweGYyM2E4MDI4LCAweGY2ZmI5ZDlmLCAweGZiYjhiYjQ2LCAweGZmNzlhNmYxLCAweGUxM2VmNmY0LFxuICAweGU1ZmZlYjQzLCAweGU4YmNjZDlhLCAweGVjN2RkMDJkLCAweDM0ODY3MDc3LCAweDMwNDc2ZGMwLFxuICAweDNkMDQ0YjE5LCAweDM5YzU1NmFlLCAweDI3ODIwNmFiLCAweDIzNDMxYjFjLCAweDJlMDAzZGM1LFxuICAweDJhYzEyMDcyLCAweDEyOGU5ZGNmLCAweDE2NGY4MDc4LCAweDFiMGNhNmExLCAweDFmY2RiYjE2LFxuICAweDAxOGFlYjEzLCAweDA1NGJmNmE0LCAweDA4MDhkMDdkLCAweDBjYzljZGNhLCAweDc4OTdhYjA3LFxuICAweDdjNTZiNmIwLCAweDcxMTU5MDY5LCAweDc1ZDQ4ZGRlLCAweDZiOTNkZGRiLCAweDZmNTJjMDZjLFxuICAweDYyMTFlNmI1LCAweDY2ZDBmYjAyLCAweDVlOWY0NmJmLCAweDVhNWU1YjA4LCAweDU3MWQ3ZGQxLFxuICAweDUzZGM2MDY2LCAweDRkOWIzMDYzLCAweDQ5NWEyZGQ0LCAweDQ0MTkwYjBkLCAweDQwZDgxNmJhLFxuICAweGFjYTVjNjk3LCAweGE4NjRkYjIwLCAweGE1MjdmZGY5LCAweGExZTZlMDRlLCAweGJmYTFiMDRiLFxuICAweGJiNjBhZGZjLCAweGI2MjM4YjI1LCAweGIyZTI5NjkyLCAweDhhYWQyYjJmLCAweDhlNmMzNjk4LFxuICAweDgzMmYxMDQxLCAweDg3ZWUwZGY2LCAweDk5YTk1ZGYzLCAweDlkNjg0MDQ0LCAweDkwMmI2NjlkLFxuICAweDk0ZWE3YjJhLCAweGUwYjQxZGU3LCAweGU0NzUwMDUwLCAweGU5MzYyNjg5LCAweGVkZjczYjNlLFxuICAweGYzYjA2YjNiLCAweGY3NzE3NjhjLCAweGZhMzI1MDU1LCAweGZlZjM0ZGUyLCAweGM2YmNmMDVmLFxuICAweGMyN2RlZGU4LCAweGNmM2VjYjMxLCAweGNiZmZkNjg2LCAweGQ1Yjg4NjgzLCAweGQxNzk5YjM0LFxuICAweGRjM2FiZGVkLCAweGQ4ZmJhMDVhLCAweDY5MGNlMGVlLCAweDZkY2RmZDU5LCAweDYwOGVkYjgwLFxuICAweDY0NGZjNjM3LCAweDdhMDg5NjMyLCAweDdlYzk4Yjg1LCAweDczOGFhZDVjLCAweDc3NGJiMGViLFxuICAweDRmMDQwZDU2LCAweDRiYzUxMGUxLCAweDQ2ODYzNjM4LCAweDQyNDcyYjhmLCAweDVjMDA3YjhhLFxuICAweDU4YzE2NjNkLCAweDU1ODI0MGU0LCAweDUxNDM1ZDUzLCAweDI1MWQzYjllLCAweDIxZGMyNjI5LFxuICAweDJjOWYwMGYwLCAweDI4NWUxZDQ3LCAweDM2MTk0ZDQyLCAweDMyZDg1MGY1LCAweDNmOWI3NjJjLFxuICAweDNiNWE2YjliLCAweDAzMTVkNjI2LCAweDA3ZDRjYjkxLCAweDBhOTdlZDQ4LCAweDBlNTZmMGZmLFxuICAweDEwMTFhMGZhLCAweDE0ZDBiZDRkLCAweDE5OTM5Yjk0LCAweDFkNTI4NjIzLCAweGYxMmY1NjBlLFxuICAweGY1ZWU0YmI5LCAweGY4YWQ2ZDYwLCAweGZjNmM3MGQ3LCAweGUyMmIyMGQyLCAweGU2ZWEzZDY1LFxuICAweGViYTkxYmJjLCAweGVmNjgwNjBiLCAweGQ3MjdiYmI2LCAweGQzZTZhNjAxLCAweGRlYTU4MGQ4LFxuICAweGRhNjQ5ZDZmLCAweGM0MjNjZDZhLCAweGMwZTJkMGRkLCAweGNkYTFmNjA0LCAweGM5NjBlYmIzLFxuICAweGJkM2U4ZDdlLCAweGI5ZmY5MGM5LCAweGI0YmNiNjEwLCAweGIwN2RhYmE3LCAweGFlM2FmYmEyLFxuICAweGFhZmJlNjE1LCAweGE3YjhjMGNjLCAweGEzNzlkZDdiLCAweDliMzY2MGM2LCAweDlmZjc3ZDcxLFxuICAweDkyYjQ1YmE4LCAweDk2NzU0NjFmLCAweDg4MzIxNjFhLCAweDhjZjMwYmFkLCAweDgxYjAyZDc0LFxuICAweDg1NzEzMGMzLCAweDVkOGE5MDk5LCAweDU5NGI4ZDJlLCAweDU0MDhhYmY3LCAweDUwYzliNjQwLFxuICAweDRlOGVlNjQ1LCAweDRhNGZmYmYyLCAweDQ3MGNkZDJiLCAweDQzY2RjMDljLCAweDdiODI3ZDIxLFxuICAweDdmNDM2MDk2LCAweDcyMDA0NjRmLCAweDc2YzE1YmY4LCAweDY4ODYwYmZkLCAweDZjNDcxNjRhLFxuICAweDYxMDQzMDkzLCAweDY1YzUyZDI0LCAweDExOWI0YmU5LCAweDE1NWE1NjVlLCAweDE4MTk3MDg3LFxuICAweDFjZDg2ZDMwLCAweDAyOWYzZDM1LCAweDA2NWUyMDgyLCAweDBiMWQwNjViLCAweDBmZGMxYmVjLFxuICAweDM3OTNhNjUxLCAweDMzNTJiYmU2LCAweDNlMTE5ZDNmLCAweDNhZDA4MDg4LCAweDI0OTdkMDhkLFxuICAweDIwNTZjZDNhLCAweDJkMTVlYmUzLCAweDI5ZDRmNjU0LCAweGM1YTkyNjc5LCAweGMxNjgzYmNlLFxuICAweGNjMmIxZDE3LCAweGM4ZWEwMGEwLCAweGQ2YWQ1MGE1LCAweGQyNmM0ZDEyLCAweGRmMmY2YmNiLFxuICAweGRiZWU3NjdjLCAweGUzYTFjYmMxLCAweGU3NjBkNjc2LCAweGVhMjNmMGFmLCAweGVlZTJlZDE4LFxuICAweGYwYTViZDFkLCAweGY0NjRhMGFhLCAweGY5Mjc4NjczLCAweGZkZTY5YmM0LCAweDg5YjhmZDA5LFxuICAweDhkNzllMGJlLCAweDgwM2FjNjY3LCAweDg0ZmJkYmQwLCAweDlhYmM4YmQ1LCAweDllN2Q5NjYyLFxuICAweDkzM2ViMGJiLCAweDk3ZmZhZDBjLCAweGFmYjAxMGIxLCAweGFiNzEwZDA2LCAweGE2MzIyYmRmLFxuICAweGEyZjMzNjY4LCAweGJjYjQ2NjZkLCAweGI4NzU3YmRhLCAweGI1MzY1ZDAzLCAweGIxZjc0MGI0XG5dXG5cbi8vIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbjogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL2Nrc3VtLmh0bWxcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYnVmKSB7XG4gIGlmICh0eXBlb2YgYnVmID09PSAnc3RyaW5nJykgYnVmID0gbmV3IEJ1ZmZlcihidWYpXG5cbiAgdmFyIGNyYyA9IDBcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICBjcmMgPSBjcmN0YWJbYnVmW2ldIF4gKChjcmMgPj4+IDI0KSAmIDB4RkYpXSBeIChjcmMgPDwgOClcbiAgfVxuXG4gIC8qIGNrc3VtLmMgYWxzbyBjYWxjdWxhdGVzIHRoZSBjcmMtMzIgb24gdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSAqL1xuICB2YXIgbnVtX2J5dGVzID0gYnVmLmxlbmd0aFxuICB3aGlsZSAobnVtX2J5dGVzID4gMCkge1xuICAgIGNyYyA9IGNyY3RhYlsobnVtX2J5dGVzICYgMHhGRikgXiAoKGNyYyA+Pj4gMjQpICYgMHhGRildIF4gKGNyYyA8PCA4KVxuICAgIG51bV9ieXRlcyA+Pj49IDhcbiAgfVxuXG4gIHJldHVybiBidWZmZXJpemVJbnQofmNyYylcbn1cblxubW9kdWxlLmV4cG9ydHMuc3RyZWFtID0gZnVuY3Rpb24gKGNiKSB7XG4gIHZhciB3cml0YWJsZSA9IG5ldyBzdHJlYW0uV3JpdGFibGUoKVxuICB2YXIgY3JjID0gMFxuICB2YXIgbGVuZ3RoID0gMFxuICB3cml0YWJsZS5fd3JpdGUgPSBmdW5jdGlvbiAoYnVmLCBlbmMsIGNiKSB7XG4gICAgbGVuZ3RoICs9IGJ1Zi5sZW5ndGhcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ1Zi5sZW5ndGg7IGkrKykge1xuICAgICAgY3JjID0gY3JjdGFiW2J1ZltpXSBeICgoY3JjID4+PiAyNCkgJiAweEZGKV0gXiAoY3JjIDw8IDgpXG4gICAgfVxuICAgIGNiKClcbiAgfVxuICB3cml0YWJsZS5vbignZmluaXNoJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBudW1fYnl0ZXMgPSBsZW5ndGhcbiAgICB3aGlsZSAobnVtX2J5dGVzID4gMCkge1xuICAgICAgY3JjID0gY3JjdGFiWyhudW1fYnl0ZXMgJiAweEZGKSBeICgoY3JjID4+PiAyNCkgJiAweEZGKV0gXiAoY3JjIDw8IDgpXG4gICAgICBudW1fYnl0ZXMgPj4+PSA4XG4gICAgfVxuICAgIGNiKGJ1ZmZlcml6ZUludCh+Y3JjKSwgbGVuZ3RoKVxuICB9KVxuICByZXR1cm4gd3JpdGFibGVcbn1cblxuZnVuY3Rpb24gYnVmZmVyaXplSW50IChudW0pIHtcbiAgdmFyIHRtcCA9IEJ1ZmZlcig0KVxuICB0bXAud3JpdGVJbnQzMkJFKG51bSwgMClcbiAgcmV0dXJuIHRtcFxufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNvbnZlcnRMb2dMZXZlbCA9IGV4cG9ydHMudHJhY2UgPSBleHBvcnRzLmZhdGFsID0gZXhwb3J0cy53YXJuID0gZXhwb3J0cy5kZWJ1ZyA9IGV4cG9ydHMuZXJyb3IgPSBleHBvcnRzLmluZm8gPSBleHBvcnRzLmxvZ0FkZGl0aW9uYWxLZXlzID0gdm9pZCAwO1xuY29uc3QgbG9nZ2VyXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcIkBjdW11bHVzL2xvZ2dlclwiKSk7XG5jb25zdCBpc051bWJlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvaXNOdW1iZXJcIikpO1xuY29uc3QgaXNTdHJpbmdfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibG9kYXNoL2lzU3RyaW5nXCIpKTtcbmZ1bmN0aW9uIGxvZ2dlcigpIHtcbiAgICByZXR1cm4gbmV3IGxvZ2dlcl8xLmRlZmF1bHQoe1xuICAgICAgICBhc3luY09wZXJhdGlvbklkOiBwcm9jZXNzLmVudi5BU1lOQ09QRVJBVElPTklELFxuICAgICAgICBleGVjdXRpb25zOiBwcm9jZXNzLmVudi5FWEVDVVRJT05TLFxuICAgICAgICBncmFudWxlczogcHJvY2Vzcy5lbnYuR1JBTlVMRVMsXG4gICAgICAgIHBhcmVudEFybjogcHJvY2Vzcy5lbnYuUEFSRU5UQVJOLFxuICAgICAgICBzZW5kZXI6IHByb2Nlc3MuZW52LlNFTkRFUixcbiAgICAgICAgc3RhY2tOYW1lOiBwcm9jZXNzLmVudi5TVEFDS05BTUUsXG4gICAgICAgIHZlcnNpb246IHByb2Nlc3MuZW52LlRBU0tWRVJTSU9OLFxuICAgIH0pO1xufVxuLyoqXG4gKiBDb25zdHJ1Y3RzIEpTT04gdG8gbG9nXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZGl0aW9uYWxLZXlzIC0gQW55IGFkZGl0aW9uYWwga2V5IHZhbHVlIHBhaXJzIHRoZSB1c2VyIGNob29zZXMgdG8gbG9nXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncyAtIE1lc3NhZ2UgdG8gbG9nIGFuZCBhbnkgb3RoZXIgaW5mb3JtYXRpb25cbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IC0gbG9nIGlzIHByaW50ZWQgdG8gc3Rkb3V0LCBub3RoaW5nIGlzIHJldHVybmVkXG4gKi9cbmZ1bmN0aW9uIGxvZ0FkZGl0aW9uYWxLZXlzKGFkZGl0aW9uYWxLZXlzLCAuLi5hcmdzKSB7XG4gICAgbG9nZ2VyKCkuaW5mb1dpdGhBZGRpdGlvbmFsS2V5cyhhZGRpdGlvbmFsS2V5cywgLi4uYXJncyk7XG59XG5leHBvcnRzLmxvZ0FkZGl0aW9uYWxLZXlzID0gbG9nQWRkaXRpb25hbEtleXM7XG4vKipcbiAqIExvZ3MgdGhlIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncyAtIEluY2x1ZGVzIG1lc3NhZ2UgYW5kIGFueSBvdGhlciBpbmZvcm1hdGlvbiB0byBsb2dcbiAqL1xuZnVuY3Rpb24gaW5mbyguLi5hcmdzKSB7XG4gICAgbG9nZ2VyKCkuaW5mbyguLi5hcmdzKTtcbn1cbmV4cG9ydHMuaW5mbyA9IGluZm87XG4vKipcbiAqIExvZ3MgdGhlIGVycm9yXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBJbmNsdWRlcyBlcnJvciBhbmQgYW55IG90aGVyIGluZm9ybWF0aW9uIHRvIGxvZ1xuICovXG5mdW5jdGlvbiBlcnJvciguLi5hcmdzKSB7XG4gICAgbG9nZ2VyKCkuZXJyb3IoLi4uYXJncyk7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG4vKipcbiAqIExvZ3MgdGhlIGRlYnVnZ2VyIG1lc3NzYWdlc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gSW5jbHVkZXMgZGVidWdnZXIgbWVzc2FnZSBhbmQgYW55IG90aGVyIGluZm9ybWF0aW9uIHRvIGxvZ1xuICovXG5mdW5jdGlvbiBkZWJ1ZyguLi5hcmdzKSB7XG4gICAgbG9nZ2VyKCkuZGVidWcoLi4uYXJncyk7XG59XG5leHBvcnRzLmRlYnVnID0gZGVidWc7XG4vKipcbiAqIExvZ3MgdGhlIFdhcm5pbmcgbWVzc3NhZ2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIEluY2x1ZGVzIFdhcm4gbWVzc2FnZSBhbmQgYW55IG90aGVyIGluZm9ybWF0aW9uIHRvIGxvZ1xuICovXG5mdW5jdGlvbiB3YXJuKC4uLmFyZ3MpIHtcbiAgICBsb2dnZXIoKS53YXJuKC4uLmFyZ3MpO1xufVxuZXhwb3J0cy53YXJuID0gd2Fybjtcbi8qKlxuICogTG9ncyB0aGUgRmF0YWwgbWVzc3NhZ2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIEluY2x1ZGVzIEZhdGFsIG1lc3NhZ2UgYW5kIGFueSBvdGhlciBpbmZvcm1hdGlvbiB0byBsb2dcbiAqL1xuZnVuY3Rpb24gZmF0YWwoLi4uYXJncykge1xuICAgIGxvZ2dlcigpLmZhdGFsKC4uLmFyZ3MpO1xufVxuZXhwb3J0cy5mYXRhbCA9IGZhdGFsO1xuLyoqXG4gKiBMb2dzIHRoZSBUcmFjZSBtZXNzc2FnZVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gSW5jbHVkZXMgVHJhY2UgbWVzc2FnZSBhbmQgYW55IG90aGVyIGluZm9ybWF0aW9uIHRvIGxvZ1xuICovXG5mdW5jdGlvbiB0cmFjZSguLi5hcmdzKSB7XG4gICAgbG9nZ2VyKCkudHJhY2UoLi4uYXJncyk7XG59XG5leHBvcnRzLnRyYWNlID0gdHJhY2U7XG4vKipcbiAqIGNvbnZlcnQgbG9nIGxldmVsIGZyb20gc3RyaW5nIHRvIG51bWJlciBvciBudW1iZXIgdG8gc3RyaW5nXG4gKlxuICogQHBhcmFtIHtzdHJpbmcvbnVtYmVyfSBsZXZlbCAtIGxvZyBsZXZlbCBpbiBzdHJpbmcgb3IgbnVtYmVyXG4gKiBAcmV0dXJucyB7bnVtYmVyL3N0cmluZ30gLSBsZXZlbCBpbiBudW1iZXIgb3Igc3RyaW5nXG4gKi9cbi8vIEB0cy1pZ25vcmVcbmZ1bmN0aW9uIGNvbnZlcnRMb2dMZXZlbChsZXZlbCkge1xuICAgIHdhcm4oJ0BjdW11bHVzL2NvbW1vbi9sb2cuY29udmVydExvZ0xldmVsKCkgaXMgZGVwcmVjYXRlZCBhZnRlciB2ZXJzaW9uIDEuMjMuMiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgY29uc3QgbWFwcGluZyA9IHtcbiAgICAgICAgZmF0YWw6IDYwLFxuICAgICAgICBlcnJvcjogNTAsXG4gICAgICAgIHdhcm46IDQwLFxuICAgICAgICBpbmZvOiAzMCxcbiAgICAgICAgZGVidWc6IDIwLFxuICAgICAgICB0cmFjZTogMTAsXG4gICAgfTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGlzU3RyaW5nXzEuZGVmYXVsdChsZXZlbCkpXG4gICAgICAgIHJldHVybiBtYXBwaW5nW2xldmVsXTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGlzTnVtYmVyXzEuZGVmYXVsdChsZXZlbCkpXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhtYXBwaW5nKS5maW5kKChrZXkpID0+IG1hcHBpbmdba2V5XSA9PT0gbGV2ZWwpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG59XG5leHBvcnRzLmNvbnZlcnRMb2dMZXZlbCA9IGNvbnZlcnRMb2dMZXZlbDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxvZy5qcy5tYXAiLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsIi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovXG52YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBnbG9iYWwgPT0gJ29iamVjdCcgJiYgZ2xvYmFsICYmIGdsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBnbG9iYWw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnJlZUdsb2JhbDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKTtcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovXG52YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlXG4gKiBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG5hdGl2ZU9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgcmF3IGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkge1xuICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksXG4gICAgICB0YWcgPSB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ107XG5cbiAgdHJ5IHtcbiAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgdmFyIHVubWFza2VkID0gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge31cblxuICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIGlmICh1bm1hc2tlZCkge1xuICAgIGlmIChpc093bikge1xuICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGdldFJhd1RhZztcbiIsIi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzdHJpbmcgdXNpbmcgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcodmFsdWUpIHtcbiAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG9iamVjdFRvU3RyaW5nO1xuIiwidmFyIGZyZWVHbG9iYWwgPSByZXF1aXJlKCcuL19mcmVlR2xvYmFsJyk7XG5cbi8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovXG52YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjtcblxuLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovXG52YXIgcm9vdCA9IGZyZWVHbG9iYWwgfHwgZnJlZVNlbGYgfHwgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblxubW9kdWxlLmV4cG9ydHMgPSByb290O1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGFuIGBBcnJheWAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc0FycmF5KF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbm1vZHVsZS5leHBvcnRzID0gaXNBcnJheTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzT2JqZWN0TGlrZSA9IHJlcXVpcmUoJy4vaXNPYmplY3RMaWtlJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYE51bWJlcmAgcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmVcbiAqIGNsYXNzaWZpZWQgYXMgbnVtYmVycywgdXNlIHRoZSBgXy5pc0Zpbml0ZWAgbWV0aG9kLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbnVtYmVyLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNOdW1iZXIoMyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihOdW1iZXIuTUlOX1ZBTFVFKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzTnVtYmVyKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8XG4gICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gbnVtYmVyVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc051bWJlcjtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzT2JqZWN0TGlrZTtcbiIsInZhciBiYXNlR2V0VGFnID0gcmVxdWlyZSgnLi9fYmFzZUdldFRhZycpLFxuICAgIGlzQXJyYXkgPSByZXF1aXJlKCcuL2lzQXJyYXknKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTdHJpbmdgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQHNpbmNlIDAuMS4wXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N0cmluZygnYWJjJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc1N0cmluZygxKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHxcbiAgICAoIWlzQXJyYXkodmFsdWUpICYmIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc1N0cmluZztcbiIsIi8qKlxuICogbG9kYXNoIDMuMS4xIChDdXN0b20gQnVpbGQpIDxodHRwczovL2xvZGFzaC5jb20vPlxuICogQnVpbGQ6IGBsb2Rhc2ggbW9kdWxhcml6ZSBleHBvcnRzPVwibnBtXCIgLW8gLi9gXG4gKiBDb3B5cmlnaHQgMjAxMi0yMDE2IFRoZSBEb2pvIEZvdW5kYXRpb24gPGh0dHA6Ly9kb2pvZm91bmRhdGlvbi5vcmcvPlxuICogQmFzZWQgb24gVW5kZXJzY29yZS5qcyAxLjguMyA8aHR0cDovL3VuZGVyc2NvcmVqcy5vcmcvTElDRU5TRT5cbiAqIENvcHlyaWdodCAyMDA5LTIwMTYgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIGFuZCBJbnZlc3RpZ2F0aXZlIFJlcG9ydGVycyAmIEVkaXRvcnNcbiAqIEF2YWlsYWJsZSB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKi9cblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJztcblxuLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqL1xudmFyIG9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxuLyoqXG4gKiBVc2VkIHRvIHJlc29sdmUgdGhlIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBgRXJyb3JgLCBgRXZhbEVycm9yYCwgYFJhbmdlRXJyb3JgLCBgUmVmZXJlbmNlRXJyb3JgLFxuICogYFN5bnRheEVycm9yYCwgYFR5cGVFcnJvcmAsIG9yIGBVUklFcnJvcmAgb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBlcnJvciBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Vycm9yKG5ldyBFcnJvcik7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc0Vycm9yKEVycm9yKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpIHtcbiAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT0gZXJyb3JUYWcpIHx8XG4gICAgKHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS5uYW1lID09ICdzdHJpbmcnKTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBvYmplY3QtbGlrZS4gQSB2YWx1ZSBpcyBvYmplY3QtbGlrZSBpZiBpdCdzIG5vdCBgbnVsbGBcbiAqIGFuZCBoYXMgYSBgdHlwZW9mYCByZXN1bHQgb2YgXCJvYmplY3RcIi5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzRXJyb3I7XG4iLCIndXNlIHN0cmljdCc7XG5cbmNvbnN0IGN1bXVsdXNNZXNzYWdlQWRhcHRlciA9IHJlcXVpcmUoJ0BjdW11bHVzL2N1bXVsdXMtbWVzc2FnZS1hZGFwdGVyLWpzJyk7XG5jb25zdCB7XG4gIGRlbGV0ZVMzT2JqZWN0LFxuICBzM09iamVjdEV4aXN0cyxcbiAgczNQdXRPYmplY3QsXG59ID0gcmVxdWlyZSgnQGN1bXVsdXMvYXdzLWNsaWVudC9TMycpO1xuY29uc3QgbG9nID0gcmVxdWlyZSgnQGN1bXVsdXMvY29tbW9uL2xvZycpO1xuXG4vKipcbiAqIFRocm93IGFuIGVycm9yIGlmIGhlbGxvIHdvcmxkIGlzIGNvbmZpZ3VyZWQgdG8gdGhyb3cgYW4gZXJyb3IgZm9yXG4gKiB0ZXN0aW5nL2V4YW1wbGUgcHVycG9zZXMuIFNldCB0aGUgcGFzcyBvbiByZXRyeSB2YWx1ZSB0byBzaW11bGF0ZVxuICogYSB0YXNrIHBhc3Npbmcgb24gYSByZXRyeS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgLSBpbnB1dCBmcm9tIHRoZSBtZXNzYWdlIGFkYXB0ZXJcbiAqIEByZXR1cm5zIHt1bmRlZmluZWR9IG5vbmVcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGhyb3dFcnJvcklmQ29uZmlndXJlZChldmVudCkge1xuICBjb25zdCBleGVjdXRpb24gPSBldmVudC5jb25maWcuZXhlY3V0aW9uO1xuICBjb25zdCByZXRyeUZpbGVuYW1lID0gYCR7ZXhlY3V0aW9ufV9yZXRyeS50eHRgO1xuICBjb25zdCBidWNrZXQgPSBldmVudC5jb25maWcuYnVja2V0O1xuXG4gIGxldCBpc1JldHJ5ID0gZmFsc2U7XG5cbiAgaWYgKGV2ZW50LmNvbmZpZy5wYXNzT25SZXRyeSkge1xuICAgIGlzUmV0cnkgPSBhd2FpdCBzM09iamVjdEV4aXN0cyh7XG4gICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgIEtleTogcmV0cnlGaWxlbmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChldmVudC5jb25maWcucGFzc09uUmV0cnkgJiYgaXNSZXRyeSkge1xuICAgIGxvZy5kZWJ1ZygnRGV0ZWN0ZWQgcmV0cnknKTtcblxuICAgIC8vIERlbGV0ZSBmaWxlXG4gICAgYXdhaXQgZGVsZXRlUzNPYmplY3QoYnVja2V0LCByZXRyeUZpbGVuYW1lKTtcbiAgfSBlbHNlIGlmIChldmVudC5jb25maWcuZmFpbCkge1xuICAgIGlmIChldmVudC5jb25maWcucGFzc09uUmV0cnkpIHtcbiAgICAgIGF3YWl0IHMzUHV0T2JqZWN0KHtcbiAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgIEtleTogcmV0cnlGaWxlbmFtZSxcbiAgICAgICAgQm9keTogJycsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0ZXAgY29uZmlndXJlZCB0byBmb3JjZSBmYWlsJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm4gc2FtcGxlICdoZWxsbyB3b3JsZCcgSlNPTlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCAtIGlucHV0IGZyb20gdGhlIG1lc3NhZ2UgYWRhcHRlclxuICogQHJldHVybnMge09iamVjdH0gc2FtcGxlIEpTT04gb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhlbGxvV29ybGQoZXZlbnQpIHtcbiAgYXdhaXQgdGhyb3dFcnJvcklmQ29uZmlndXJlZChldmVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICBoZWxsbzogJ0hlbGxvIFdvcmxkJyxcbiAgfTtcbn1cbi8qKlxuICogTGFtYmRhIGhhbmRsZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgICAgICAtIGEgQ3VtdWx1cyBNZXNzYWdlXG4gKiBAcGFyYW0ge09iamVjdH0gY29udGV4dCAgICAtIGFuIEFXUyBMYW1iZGEgY29udGV4dFxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gLSBzYW1wbGUgSlNPTiBvYmplY3RcbiAqL1xuYXN5bmMgZnVuY3Rpb24gaGFuZGxlcihldmVudCwgY29udGV4dCkge1xuICByZXR1cm4gYXdhaXQgY3VtdWx1c01lc3NhZ2VBZGFwdGVyLnJ1bkN1bXVsdXNUYXNrKGhlbGxvV29ybGQsIGV2ZW50LCBjb250ZXh0KTtcbn1cblxuZXhwb3J0cy5oYW5kbGVyID0gaGFuZGxlcjtcbmV4cG9ydHMuaGVsbG9Xb3JsZCA9IGhlbGxvV29ybGQ7IC8vIGV4cG9ydGVkIHRvIHN1cHBvcnQgdGVzdGluZ1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5ydW5DdW11bHVzVGFzayA9IGV4cG9ydHMuaW52b2tlQ3VtdWx1c01lc3NhZ2VBZGFwdGVyID0gZXhwb3J0cy5nZW5lcmF0ZUNNQVNwYXduQXJndW1lbnRzID0gdm9pZCAwO1xuY29uc3QgbG9va3BhdGhfMSA9IHJlcXVpcmUoXCJsb29rcGF0aFwiKTtcbmNvbnN0IHJlYWRsaW5lID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJyZWFkbGluZVwiKSk7XG5jb25zdCBjaGlsZF9wcm9jZXNzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImNoaWxkX3Byb2Nlc3NcIikpO1xuY29uc3QgbWVzc2FnZV8xID0gcmVxdWlyZShcIi4vbWVzc2FnZVwiKTtcbmNvbnN0IHR5cGVHdWFyZHNfMSA9IHJlcXVpcmUoXCIuL3R5cGVHdWFyZHNcIik7XG4vKipcbiAqIEFuIGVycm9yIHRvIGJlIHRocm93biB3aGVuIGludm9rYXRpb24gb2YgdGhlIGN1bXVsdXMtbWVzc2FnZS1hZGFwdGVyIGZhaWxzXG4gKi9cbmNsYXNzIEN1bXVsdXNNZXNzYWdlQWRhcHRlckV4ZWN1dGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWpzZG9jXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0N1bXVsdXNNZXNzYWdlQWRhcHRlckV4ZWN1dGlvbkVycm9yJztcbiAgICB9XG59XG4vKipcbiAqIEdlbmVyYXRlcyBDTUEgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gdGhlIGFjdGlvbiB0byBiZSBwZXJmb3JtZWQgYnkgdGhlIG1lc3NhZ2UtYWRhcHRlclxuICogQHJldHVybnMge1Byb21pc2UuPEFycmF5Pn0gLSBSZXR1cm5zIGFyZ3VtZW50cyB1c2VkIHRvIHNwYXduIHRoZSBDTUFcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDTUFTcGF3bkFyZ3VtZW50cyhjb21tYW5kKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGFkYXB0ZXJEaXIgPSAoX2EgPSBwcm9jZXNzLmVudi5DVU1VTFVTX01FU1NBR0VfQURBUFRFUl9ESVIpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICcuL2N1bXVsdXMtbWVzc2FnZS1hZGFwdGVyJztcbiAgICBjb25zdCBzeXN0ZW1QeXRob24gPSBhd2FpdCBsb29rcGF0aF8xLmxvb2twYXRoKCdweXRob24nKTtcbiAgICBpZiAoc3lzdGVtUHl0aG9uICYmIHByb2Nlc3MuZW52LlVTRV9DTUFfQklOQVJZICE9PSAndHJ1ZScpIHtcbiAgICAgICAgcmV0dXJuIFtzeXN0ZW1QeXRob24sIFtgJHthZGFwdGVyRGlyfWAsIGNvbW1hbmRdXTtcbiAgICB9XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gc3lzdGVtIHB5dGhvbiwgYXR0ZW1wdCB1c2Ugb2YgcHJlLXBhY2thZ2VkIENNQSBiaW5hcnlcbiAgICByZXR1cm4gW2Ake2FkYXB0ZXJEaXJ9L2NtYV9iaW4vY21hYCwgW2NvbW1hbmRdXTtcbn1cbmV4cG9ydHMuZ2VuZXJhdGVDTUFTcGF3bkFyZ3VtZW50cyA9IGdlbmVyYXRlQ01BU3Bhd25Bcmd1bWVudHM7XG4vKipcbiAqIEludm9rZSB0aGUgY3VtdWx1cy1tZXNzYWdlLWFkYXB0ZXJcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBjdW11bHVzTWVzc2FnZUFkYXB0ZXJPYmplY3QgLSBSZXR1cm5zIGFuIE9iamVjdCB3aXRoIGFcbiAqIGNoaWxkcHJvY2VzcyBhbmQgYSBzdGRlcnJvciBidWZmZXJcbiAqIEByZXR1cm5zIHtPYmplY3R9IGN1bXVsdXNNZXNzYWdlQWRhcHRlck9iamVjdC5jbWFQcm9jZXNzIC0gQSBDTUEgY2hpbGRQcm9jZXNzIE9iamVjdFxuICogQHJldHVybnMge09iamVjdH0gY3VtdWx1c01lc3NhZ2VBZGFwdGVyT2JqZWN0LmVycm9yT2JqIC0gIEEgT2JqZWN0IHdpdGggdGhlIHByb3BlcnR5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0ZGVyckJ1ZmZlcicgdG8gbWFrZSB0aGUgZW5jYXBzdWxhdGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgZXZlbnQgc3RvcmFnZSBvdXRzaWRlIHRoaXMgbWV0aG9kXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGludm9rZUN1bXVsdXNNZXNzYWdlQWRhcHRlcigpIHtcbiAgICBjb25zdCBzcGF3bkFyZ3VtZW50cyA9IGF3YWl0IGdlbmVyYXRlQ01BU3Bhd25Bcmd1bWVudHMoJ3N0cmVhbScpO1xuICAgIGNvbnN0IGVycm9yT2JqID0geyBzdGRlcnJCdWZmZXI6ICcnIH07XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY21hUHJvY2VzcyA9IGNoaWxkX3Byb2Nlc3NfMS5kZWZhdWx0LnNwYXduKC4uLnNwYXduQXJndW1lbnRzKTtcbiAgICAgICAgY21hUHJvY2Vzcy5vbignZXJyb3InLCAoKSA9PiB7IH0pO1xuICAgICAgICBjbWFQcm9jZXNzLnN0ZGluLnNldERlZmF1bHRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICBjbWFQcm9jZXNzLnN0ZG91dC5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICBjbWFQcm9jZXNzLnN0ZGVyci5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICBjbWFQcm9jZXNzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIGlmIChjbWFQcm9jZXNzLmtpbGxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDTUEgRXhpdCBDb2RlOiAke2NtYVByb2Nlc3MuZXhpdENvZGV9IGApO1xuICAgICAgICAgICAgICAgIGlmIChjbWFQcm9jZXNzLmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDTUEgRmFpbHVyZTogJHtlcnJvck9iai5zdGRlcnJCdWZmZXJ9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NNQSBwcm9jZXNzIGtpbGxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY21hUHJvY2Vzcy5zdGRlcnIub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgZXJyb3JPYmouc3RkZXJyQnVmZmVyICs9IFN0cmluZyhkYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGNtYVByb2Nlc3MsIGVycm9yT2JqIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBgQ01BIHByb2Nlc3MgZmFpbGVkICgke2Vycm9yLnNob3J0TWVzc2FnZX0pXFxuXG4gICAgICAgICAgICAgICAgIFRyYWNlOiAke2Vycm9yLm1lc3NhZ2V9fVxcblxcblxcblxuICAgICAgICAgICAgICAgICBTVERFUlI6ICR7ZXJyb3JPYmouc3RkZXJyQnVmZmVyfWA7XG4gICAgICAgIHRocm93IG5ldyBDdW11bHVzTWVzc2FnZUFkYXB0ZXJFeGVjdXRpb25FcnJvcihtc2cpO1xuICAgIH1cbn1cbmV4cG9ydHMuaW52b2tlQ3VtdWx1c01lc3NhZ2VBZGFwdGVyID0gaW52b2tlQ3VtdWx1c01lc3NhZ2VBZGFwdGVyO1xuLyoqXG4gKiBDb25kaXRpb25hbGx5IHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHRhcmdldGVkIHZhbHVlIGlzIG5vdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFZBUk5BTUUgLSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSB2YWx1ZSB0byBzZXQgdmFyaWFibGUgdG8gaWYgbm90IHVuZGVmaW5lZFxuICogQHJldHVybnMge3VuZGVmaW5lZH0gLSBub25lXG4gKi9cbmZ1bmN0aW9uIHNhZmVTZXRFbnYoVkFSTkFNRSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgcHJvY2Vzcy5lbnZbVkFSTkFNRV0gPSB2YWx1ZTtcbn1cbi8qKlxuICogU2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSB1c2VkIGluIGxvZ2dpbmcgYmFzZWQgb24gdGhlIEN1bXVsdXMgZXZlbnRcbiAqIG1lc3NhZ2UgYW5kIGNvbnRleHQgdGhhdCBydW5DdW11bHVzVGFzayB3YXMgaW52b2tlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3VtdWx1c01lc3NhZ2UgLSBjdW11bHVzIGV2ZW50IG1lc3NhZ2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IC0gbGFtYmRhIGNvbnRleHQgb2JqZWN0LlxuICogQHJldHVybnMge3VuZGVmaW5lZH0gLSBubyByZXR1cm4gdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIHNldEN1bXVsdXNFbnZpcm9ubWVudChjdW11bHVzTWVzc2FnZSwgY29udGV4dCkge1xuICAgIHNhZmVTZXRFbnYoJ0VYRUNVVElPTlMnLCBtZXNzYWdlXzEuZ2V0RXhlY3V0aW9ucyhjdW11bHVzTWVzc2FnZSkpO1xuICAgIHNhZmVTZXRFbnYoJ1NFTkRFUicsIGNvbnRleHQuZnVuY3Rpb25OYW1lKTtcbiAgICBzYWZlU2V0RW52KCdUQVNLVkVSU0lPTicsIGNvbnRleHQuZnVuY3Rpb25WZXJzaW9uKTtcbiAgICBzYWZlU2V0RW52KCdTVEFDS05BTUUnLCBtZXNzYWdlXzEuZ2V0U3RhY2tOYW1lKGN1bXVsdXNNZXNzYWdlKSk7XG4gICAgc2FmZVNldEVudignR1JBTlVMRVMnLCBKU09OLnN0cmluZ2lmeShtZXNzYWdlXzEuZ2V0TWVzc2FnZUdyYW51bGVzKGN1bXVsdXNNZXNzYWdlKSkpO1xuICAgIHNhZmVTZXRFbnYoJ1BBUkVOVEFSTicsIG1lc3NhZ2VfMS5nZXRQYXJlbnRBcm4oY3VtdWx1c01lc3NhZ2UpKTtcbiAgICBzYWZlU2V0RW52KCdBU1lOQ09QRVJBVElPTklEJywgbWVzc2FnZV8xLmdldEFzeW5jT3BlcmF0aW9uSWQoY3VtdWx1c01lc3NhZ2UpKTtcbn1cbi8qKlxuICogUmVhZCB0aGUgQ01BIG91dHB1dC9yZXN1bHRzIGFmdGVyIHNlbmRpbmcgYSBjb21tYW5kXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlYWRMaW5lIC0gY29uZmlndXJlZCByZWFkbGluZSBvYmplY3RcbiAqIEBwYXJhbSB7Kn0gZXJyb3JPYmogLSBjbWEgZXJyb3JPYmplY3Qgd2l0aCBzdGRlcnIgc3RyaW5nIGJ1ZmZlclxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gLSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBwYXJzZWQgSlNPTiBvYmplY3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgQ01BIG91dHB1dFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbWFPdXRwdXQocmVhZExpbmUsIGVycm9yT2JqKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9ICcnO1xuICAgICAgICByZWFkTGluZS5yZXN1bWUoKTtcbiAgICAgICAgcmVhZExpbmUub24oJ2xpbmUnLCAoaW5wdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5lbmRzV2l0aCgnPEVPQz4nKSkge1xuICAgICAgICAgICAgICAgIHJlYWRMaW5lLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgcmVhZExpbmUucmVtb3ZlQWxsTGlzdGVuZXJzKCdsaW5lJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSW5wdXQgPSBpbnB1dC5yZXBsYWNlKCc8RU9DPicsICcnKTtcbiAgICAgICAgICAgICAgICBidWZmZXIgKz0gZW5kSW5wdXQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKGJ1ZmZlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyICs9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVhZExpbmUub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBDdW11bHVzTWVzc2FnZUFkYXB0ZXJFeGVjdXRpb25FcnJvcihlcnJvck9iai5zdGRlcnJCdWZmZXIpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4vKipcbiAqIEJ1aWxkIGEgbmVzdGVkIEN1bXVsdXMgZXZlbnQgYW5kIHBhc3MgaXQgdG8gYSB0YXNrcydzIGJ1c2luZXNzIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gVGFza0Z1bmN0aW9uIC0gdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlIGJ1c2luZXNzIGxvZ2ljIG9mIHRoZSB0YXNrXG4gKiBAcGFyYW0ge09iamVjdH0gY3VtdWx1c01lc3NhZ2UgLSBlaXRoZXIgYSBmdWxsIEN1bXVsdXMgTWVzc2FnZSBvciBhIEN1bXVsdXMgUmVtb3RlIE1lc3NhZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSB3b3JrZmxvdyBjb25maWd1cmVkIENNQU1lc3NhZ2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgYSBDdW11bHVzIE1lc3NhZ2UgaW4gaXQncyBldmVudFxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgLSBhbiBBV1MgTGFtYmRhIGNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFzIC0gTG9jYXRpb24gb2Ygc2NoZW1hIGZpbGVzLCBkZWZhdWx0cyB0byBudWxsLlxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gLSBUaGUgcmVzcG9uc2UgZnJvbSB0aGUgY2FsbCB0byBjcmVhdGVOZXh0RXZlbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQ3VtdWx1c1Rhc2soVGFza0Z1bmN0aW9uLCBjdW11bHVzTWVzc2FnZSwgY29udGV4dCwgc2NoZW1hcyA9IG51bGwpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgeyBjbWFQcm9jZXNzLCBlcnJvck9iaiB9ID0gYXdhaXQgaW52b2tlQ3VtdWx1c01lc3NhZ2VBZGFwdGVyKCk7XG4gICAgY29uc3QgY21hU3RkaW4gPSBjbWFQcm9jZXNzLnN0ZGluO1xuICAgIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICAgICAgaW5wdXQ6IGNtYVByb2Nlc3Muc3Rkb3V0XG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoJ2xvYWRBbmRVcGRhdGVSZW1vdGVFdmVudFxcbicpO1xuICAgICAgICBjbWFTdGRpbi53cml0ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogY3VtdWx1c01lc3NhZ2UsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgc2NoZW1hc1xuICAgICAgICB9KSk7XG4gICAgICAgIGNtYVN0ZGluLndyaXRlKCdcXG48RU9DPlxcbicpO1xuICAgICAgICBjb25zdCBsb2FkQW5kVXBkYXRlUmVtb3RlRXZlbnRPdXRwdXQgPSBhd2FpdCBnZXRDbWFPdXRwdXQocmwsIGVycm9yT2JqKTtcbiAgICAgICAgaWYgKCF0eXBlR3VhcmRzXzEuaXNDdW11bHVzTWVzc2FnZVdpdGhBc3NpZ25lZFBheWxvYWQobG9hZEFuZFVwZGF0ZVJlbW90ZUV2ZW50T3V0cHV0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG91dHB1dCB0eXBpbmcgcmVjaWV2ZWQgZnJvbVxuICAgICAgbG9hZEFuZFVwZGF0ZVJlbW90ZUV2ZW50ICR7SlNPTi5zdHJpbmdpZnkobG9hZEFuZFVwZGF0ZVJlbW90ZUV2ZW50T3V0cHV0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBzZXRDdW11bHVzRW52aXJvbm1lbnQobG9hZEFuZFVwZGF0ZVJlbW90ZUV2ZW50T3V0cHV0LCBjb250ZXh0KTtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoJ2xvYWROZXN0ZWRFdmVudFxcbicpO1xuICAgICAgICBjbWFTdGRpbi53cml0ZShKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogbG9hZEFuZFVwZGF0ZVJlbW90ZUV2ZW50T3V0cHV0LFxuICAgICAgICAgICAgc2NoZW1hcyxcbiAgICAgICAgICAgIGNvbnRleHRcbiAgICAgICAgfSkpO1xuICAgICAgICBjbWFTdGRpbi53cml0ZSgnXFxuPEVPQz5cXG4nKTtcbiAgICAgICAgY29uc3QgbG9hZE5lc3RlZEV2ZW50T3V0cHV0ID0gYXdhaXQgZ2V0Q21hT3V0cHV0KHJsLCBlcnJvck9iaik7XG4gICAgICAgIGlmICghdHlwZUd1YXJkc18xLmlzTG9hZE5lc3RlZEV2ZW50SW5wdXQobG9hZE5lc3RlZEV2ZW50T3V0cHV0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIG91dHB1dCB0eXBpbmcgcmVjaWV2ZWQgZnJvbVxuICAgICAgbG9hZE5lc3RlZEV2ZW50ICR7SlNPTi5zdHJpbmdpZnkobG9hZE5lc3RlZEV2ZW50T3V0cHV0KX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0YXNrT3V0cHV0ID0gYXdhaXQgVGFza0Z1bmN0aW9uKGxvYWROZXN0ZWRFdmVudE91dHB1dCwgY29udGV4dCk7XG4gICAgICAgIGNtYVN0ZGluLndyaXRlKCdjcmVhdGVOZXh0RXZlbnRcXG4nKTtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6IGxvYWRBbmRVcGRhdGVSZW1vdGVFdmVudE91dHB1dCxcbiAgICAgICAgICAgIGhhbmRsZXJfcmVzcG9uc2U6IHRhc2tPdXRwdXQsXG4gICAgICAgICAgICBtZXNzYWdlX2NvbmZpZzogbG9hZE5lc3RlZEV2ZW50T3V0cHV0Lm1lc3NhZ2VDb25maWcsXG4gICAgICAgICAgICBzY2hlbWFzXG4gICAgICAgIH0pKTtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoJ1xcbjxFT0M+XFxuJyk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZU5leHRFdmVudE91dHB1dCA9IGF3YWl0IGdldENtYU91dHB1dChybCwgZXJyb3JPYmopO1xuICAgICAgICBjbWFTdGRpbi53cml0ZSgnXFxuPEVYSVQ+XFxuJyk7XG4gICAgICAgIGlmICh0eXBlR3VhcmRzXzEuaXNMb2FkTmVzdGVkRXZlbnRJbnB1dChjcmVhdGVOZXh0RXZlbnRPdXRwdXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwaW5nIHJlY2lldmVkIGZyb21cbiAgICAgIGNyZWF0ZU5leHRFdmVudE91dHB1dDogJHtKU09OLnN0cmluZ2lmeShjcmVhdGVOZXh0RXZlbnRPdXRwdXQpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjcmVhdGVOZXh0RXZlbnRPdXRwdXQ7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY21hU3RkaW4ud3JpdGUoJ1xcbjxFT0M+XFxuJyk7XG4gICAgICAgICAgICBjbWFTdGRpbi53cml0ZSgnXFxuPEVYSVQ+XFxuJyk7XG4gICAgICAgICAgICBpZiAoIWNtYVByb2Nlc3Mua2lsbCgnU0lHVEVSTScpKSB7XG4gICAgICAgICAgICAgICAgY21hUHJvY2Vzcy5raWxsKCdTSUdLSUxMJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDTUEgcHJvY2VzcyBmYWlsZWQgdG8ga2lsbCBvbiB0YXNrIGZhaWx1cmU6ICR7SlNPTi5zdHJpbmdpZnkoZSl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCgoX2EgPSBlcnJvciA9PT0gbnVsbCB8fCBlcnJvciA9PT0gdm9pZCAwID8gdm9pZCAwIDogZXJyb3IubmFtZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmluY2x1ZGVzKCdXb3JrZmxvd0Vycm9yJykpICYmICghdHlwZUd1YXJkc18xLmlzQ01BTWVzc2FnZShjdW11bHVzTWVzc2FnZSkpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmN1bXVsdXNNZXNzYWdlLCBwYXlsb2FkOiBudWxsLCBleGNlcHRpb246IGVycm9yLm5hbWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZXhwb3J0cy5ydW5DdW11bHVzVGFzayA9IHJ1bkN1bXVsdXNUYXNrO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y21hLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX2V4cG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9fZXhwb3J0U3RhcikgfHwgZnVuY3Rpb24obSwgZXhwb3J0cykge1xuICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKHAgIT09IFwiZGVmYXVsdFwiICYmICFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBfX2NyZWF0ZUJpbmRpbmcoZXhwb3J0cywgbSwgcCk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGNtYV8xID0gcmVxdWlyZShcIi4vY21hXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZ2VuZXJhdGVDTUFTcGF3bkFyZ3VtZW50c1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY21hXzEuZ2VuZXJhdGVDTUFTcGF3bkFyZ3VtZW50czsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImludm9rZUN1bXVsdXNNZXNzYWdlQWRhcHRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY21hXzEuaW52b2tlQ3VtdWx1c01lc3NhZ2VBZGFwdGVyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwicnVuQ3VtdWx1c1Rhc2tcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNtYV8xLnJ1bkN1bXVsdXNUYXNrOyB9IH0pO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuL3R5cGVzXCIpLCBleHBvcnRzKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRBc3luY09wZXJhdGlvbklkID0gZXhwb3J0cy5nZXRFeGVjdXRpb25zID0gZXhwb3J0cy5nZXRQYXJlbnRBcm4gPSBleHBvcnRzLmdldFN0YWNrTmFtZSA9IGV4cG9ydHMuZ2V0TWVzc2FnZUdyYW51bGVzID0gdm9pZCAwO1xuY29uc3QgR1JBTlVMRV9MT0dfTElNSVQgPSA1MDA7XG4vKipcbiAqIEdldCBncmFudWxlcyBmcm9tIGV4ZWN1dGlvbiBtZXNzYWdlLlxuICogICBVc2VzIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGFzIGRlZmluZWQgYnkgdGhlIGN1bXVsdXMvY29tbW9uL21lc3NhZ2VcbiAqICAgZGVzY3JpcHRpb24uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2UgLSBhIEN1bXVsdXMgbWVzc2FnZVxuICogQHBhcmFtIHtpbnRlZ2VyfSBncmFudWxlTGltaXQgLSBudW1iZXIgb2YgZ3JhbnVsZXMgdG8gbGltaXQgdGhlIGxvZyB0b1xuICogaW5jbHVkaW5nLCB0byBhdm9pZCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0cnVuY2F0aW9uXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gLSBBbiBhcnJheSBvZiBncmFudWxlIGlkc1xuICovXG5leHBvcnRzLmdldE1lc3NhZ2VHcmFudWxlcyA9IChtZXNzYWdlLCBncmFudWxlTGltaXQgPSBHUkFOVUxFX0xPR19MSU1JVCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgZ3JhbnVsZXMgPSAoKF9hID0gbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLnBheWxvYWQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ncmFudWxlcykgfHwgKChfYiA9IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5tZXRhKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaW5wdXRfZ3JhbnVsZXMpO1xuICAgIGlmIChncmFudWxlcykge1xuICAgICAgICByZXR1cm4gZ3JhbnVsZXMuc2xpY2UoMCwgZ3JhbnVsZUxpbWl0KVxuICAgICAgICAgICAgLm1hcCgoZ3JhbnVsZSkgPT4gZ3JhbnVsZS5ncmFudWxlSWQpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG59O1xuLyoqXG4gKiBHZXQgdGhlIHN0YWNrbmFtZSBwdWxsZWQgZnJvbSB0aGUgbWV0YSBvZiB0aGUgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2UgLSBBIGN1bXVsdXMgZXZlbnQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIGN1bXVsdXMgc3RhY2sgbmFtZS5cbiAqL1xuZXhwb3J0cy5nZXRTdGFja05hbWUgPSAobWVzc2FnZSkgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UubWV0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YWNrOyB9O1xuLyoqXG4gKiBHZXRzIHBhcmVudCBhcm4gZnJvbSBleGVjdXRpb24gbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZSAtIEFuIGV4ZWN1dGlvbiBtZXNzYWdlLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSB0aGUgcGFyZW50IGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0cy5nZXRQYXJlbnRBcm4gPSAobWVzc2FnZSkgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuY3VtdWx1c19tZXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGFyZW50RXhlY3V0aW9uQXJuOyB9O1xuLyoqXG4qIEdldCBjdXJyZW50IGV4ZWN1dGlvbiBuYW1lIGZyb20gQ3VtdWx1cyBtZXNzYWdlLlxuKlxuKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZSAtIEN1bXVsdXMgbWVzc2FnZS5cbiogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gY3VycmVudCBleGVjdXRpb24gbmFtZS5cbiovXG5leHBvcnRzLmdldEV4ZWN1dGlvbnMgPSAobWVzc2FnZSkgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuY3VtdWx1c19tZXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZXhlY3V0aW9uX25hbWU7IH07XG4vKipcbiAqIEdldCBjdXJyZW50IGFzeW5jIG9wZXJhdGlvbiBpZCBmcm9tIEN1bXVsdXMgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbWVzc2FnZSAtIEN1bXVsdXMgbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IGFzeW5jT3BlcmF0aW9uSWQgb3IgbnVsbFxuICovXG5leHBvcnRzLmdldEFzeW5jT3BlcmF0aW9uSWQgPSAobWVzc2FnZSkgPT4geyB2YXIgX2E7IHJldHVybiAoX2EgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UuY3VtdWx1c19tZXRhKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXN5bmNPcGVyYXRpb25JZDsgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPW1lc3NhZ2UuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmlzQ01BTWVzc2FnZSA9IGV4cG9ydHMuaXNMb2FkTmVzdGVkRXZlbnRJbnB1dCA9IGV4cG9ydHMuaXNDdW11bHVzTWVzc2FnZVdpdGhBc3NpZ25lZFBheWxvYWQgPSB2b2lkIDA7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gaXNDdW11bHVzTWVzc2FnZVdpdGhBc3NpZ25lZFBheWxvYWQobWVzc2FnZSkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIHJldHVybiAoKChfYSA9IG1lc3NhZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5wYXlsb2FkKSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmICgoX2IgPSBtZXNzYWdlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaW5wdXQpID09PSB1bmRlZmluZWRcbiAgICAgICAgJiYgKChfYyA9IG1lc3NhZ2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5jb25maWcpID09PSB1bmRlZmluZWQpO1xufVxuZXhwb3J0cy5pc0N1bXVsdXNNZXNzYWdlV2l0aEFzc2lnbmVkUGF5bG9hZCA9IGlzQ3VtdWx1c01lc3NhZ2VXaXRoQXNzaWduZWRQYXlsb2FkO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIGlzTG9hZE5lc3RlZEV2ZW50SW5wdXQobWVzc2FnZSkge1xuICAgIHJldHVybiAobWVzc2FnZS5pbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICYmIG1lc3NhZ2UuY29uZmlnICE9PSB1bmRlZmluZWQpO1xufVxuZXhwb3J0cy5pc0xvYWROZXN0ZWRFdmVudElucHV0ID0gaXNMb2FkTmVzdGVkRXZlbnRJbnB1dDtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBpc0NNQU1lc3NhZ2UobWVzc2FnZSkge1xuICAgIHJldHVybiAobWVzc2FnZS5jbWEgIT09IHVuZGVmaW5lZCk7XG59XG5leHBvcnRzLmlzQ01BTWVzc2FnZSA9IGlzQ01BTWVzc2FnZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXR5cGVHdWFyZHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUocmVzdWx0LnZhbHVlKTsgfSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xudmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHtcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnO1xuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xuICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfVxuICAgIGZ1bmN0aW9uIHN0ZXAob3ApIHtcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgICAgICB3aGlsZSAoXykgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcbiAgICAgICAgICAgIHN3aXRjaCAob3BbMF0pIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIGNhc2UgNTogXy5sYWJlbCsrOyB5ID0gb3BbMV07IG9wID0gWzBdOyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodCA9IF8udHJ5cywgdCA9IHQubGVuZ3RoID4gMCAmJiB0W3QubGVuZ3RoIC0gMV0pICYmIChvcFswXSA9PT0gNiB8fCBvcFswXSA9PT0gMikpIHsgXyA9IDA7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBfLmxhYmVsIDwgdFsyXSkgeyBfLmxhYmVsID0gdFsyXTsgXy5vcHMucHVzaChvcCk7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XG4gICAgICAgIGlmIChvcFswXSAmIDUpIHRocm93IG9wWzFdOyByZXR1cm4geyB2YWx1ZTogb3BbMF0gPyBvcFsxXSA6IHZvaWQgMCwgZG9uZTogdHJ1ZSB9O1xuICAgIH1cbn07XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgcmVzdWx0W2tdID0gbW9kW2tdO1xuICAgIHJlc3VsdFtcImRlZmF1bHRcIl0gPSBtb2Q7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG52YXIgX3RoaXMgPSB0aGlzO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIGZzID0gX19pbXBvcnRTdGFyKHJlcXVpcmUoXCJmc1wiKSk7XG52YXIgcGF0aCA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicGF0aFwiKSk7XG52YXIgaXNXaW5kb3dzID0gL153aW4vaS50ZXN0KHByb2Nlc3MucGxhdGZvcm0pO1xuLyoqXG4gKiBTb21ldGltZXMsIHBlb3BsZSB3YW50IHRvIGxvb2sgZm9yIGxvY2FsIGV4ZWN1dGFibGUgZmlsZXNcbiAqIHdoaWNoIGFyZSBzcGVjaWZpZWQgd2l0aCBlaXRoZXIgcmVsYXRpdmUgb3IgYWJzb2x1dGUgZmlsZSBwYXRoLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSBjbWRcbiAqIEByZXR1cm4ge3N0cmluZ30gQW4gYWJzb2x1dGUgcGF0aCBvZiBnaXZlbiBjb21tYW5kLCBvciB1bmRlZmluZWQuXG4gKi9cbnZhciBpc0ZpbGVwYXRoID0gZnVuY3Rpb24gKGNtZCkge1xuICAgIHJldHVybiBjbWQuaW5jbHVkZXMocGF0aC5zZXApID8gcGF0aC5yZXNvbHZlKGNtZCkgOiB1bmRlZmluZWQ7XG59O1xuLyoqXG4gKiBJbiBXaW5kb3dzIE9TLCB0aGVyZSBhcmUgYWxpYXNlcyB0byBleGVjdXRhYmxlIGZpbGVzLCBsaWtlIFwiLnNoXCIsIFwiLmJhc2hcIiBvciBcIi5weVwiLlxuICogQHByaXZhdGVcbiAqIEByZXR1cm4ge3N0cmluZ1tdfVxuICovXG52YXIgZ2V0QXBwbGljYWJsZUV4dGVuc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIChpc1dpbmRvd3MpID8gKHByb2Nlc3MuZW52LlBBVEhFWFQgfHwgJycpLnNwbGl0KHBhdGguZGVsaW1pdGVyKSA6IFsnJ107XG59O1xuLyoqXG4gKiBKdXN0IHByb21pc2lmaWVzIFwiZnMuYWNjZXNzXCJcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gYWJzV2l0aEV4dCBBbiBhYnNvbHV0ZSBmaWxlIHBhdGggd2l0aCBhbiBhcHBsaWNhYmxlIGV4dGVuc2lvbiBhcHBlbmRlZC5cbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUmVzb2x2ZXMgYWJzb2x1dGUgcGF0aCBvciBlbXB0eSBzdHJpbmcuXG4gKi9cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiAoYWJzV2l0aEV4dCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXR1cm4gZnMuYWNjZXNzKGFic1dpdGhFeHQsIGZzLmNvbnN0YW50cy5YX09LLCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiByZXNvbHZlKGVyciA/ICcnIDogYWJzV2l0aEV4dCk7IH0pOyB9KTtcbn07XG4vKipcbiAqIFJlc29sdmVzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGV4ZWN1dGFibGUgb3Igbm90LCByZWdhcmRpbmcgXCJQQVRIRVhUXCIgdG8gYmUgYXBwbGllZC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gYWJzcGF0aCBBIGZpbGUgcGF0aCB0byBiZSBjaGVja2VkLlxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlcyB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoIGp1c3QgY2hlY2tlZCwgb3IgdW5kZWZpbmVkLlxuICovXG52YXIgaXNFeGVjdXRhYmxlID0gZnVuY3Rpb24gKGFic3BhdGgpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2hlY2tzLCBhYnNwYXRoZXM7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgY2hlY2tzID0gZ2V0QXBwbGljYWJsZUV4dGVuc2lvbnMoKS5tYXAoZnVuY3Rpb24gKGV4dCkgeyByZXR1cm4gYWNjZXNzKGFic3BhdGggKyBleHQpOyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChjaGVja3MpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBhYnNwYXRoZXMgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UucmVzb2x2ZShhYnNwYXRoZXMuZmlsdGVyKGZ1bmN0aW9uIChhYnMpIHsgcmV0dXJuICEhYWJzOyB9KVswXSldO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogSnVzdCB0byBsaXN0IHVwIGFsbCB0aGUgZmlsZXMgdW5kZXIgdGhlIGRpcmVjdG9yeSBnaXZlbi5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgQW4gYWJzb2x1dGUgZGlyZWN0b3J5IHBhdGggdG8gbGlzdCB0aGUgY29udGVudHMuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZ1tdPn0gUmVzb2x2ZXMgdGhlIGxpc3Qgb2YgY29udGVudHMgb2YgdGhpcyBkaXJlY3RvcnkuXG4gKi9cbnZhciBscyA9IGZ1bmN0aW9uIChkaXIpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmV0dXJuIGZzLnJlYWRkaXIoZGlyLCBmdW5jdGlvbiAoZXJyLCBmaWxlcykgeyByZXR1cm4gcmVzb2x2ZShmaWxlcyB8fCBbXSk7IH0pOyB9KTtcbn07XG4vKipcbiAqIFJldHVybnMgYWxsIGV4ZWN1dGFibGUgZmlsZXMgd2hpY2ggaGF2ZSB0aGUgc2FtZSBuYW1lIHdpdGggdGhlIHRhcmdldCBjb21tYW5kLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWQgVGhlIHRhcmdldCBjb21tYW5kIHdlIGFyZSBsb29raW5nIGZvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBkaXIgVGhlIHRhcmdldCBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGNvbW1hbmQgd291bGQgYmUgbG9va2VkIGZvci5cbiAqL1xudmFyIGZpbmRFeGVjdXRhYmxlVW5kZXJEaXIgPSBmdW5jdGlvbiAoY21kLCBkaXIpIHsgcmV0dXJuIF9fYXdhaXRlcihfdGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZmlsZXMsIG1hdGNoZXM7XG4gICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkge1xuICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGxzKGRpcildO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgIGZpbGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIG1hdGNoZXMgPSBmaWxlcy5maWx0ZXIoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIHBhdGguYmFzZW5hbWUoZikuc3BsaXQoJy4nKVswXSA9PT0gY21kOyB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgUHJvbWlzZS5hbGwobWF0Y2hlcy5tYXAoZnVuY3Rpb24gKGYpIHsgcmV0dXJuIGlzRXhlY3V0YWJsZShwYXRoLmpvaW4oZGlyLCBmKSk7IH0pKV07XG4gICAgICAgIH1cbiAgICB9KTtcbn0pOyB9O1xuLyoqXG4gKiBSZXR1cm5zIGEgbGlzdCBvZiBkaXJlY3RvcmllcyBvbiB3aGljaCB0aGUgdGFyZ2V0IGNvbW1hbmQgc2hvdWxkIGJlIGxvb2tlZCBmb3IuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gYWRkaXRpb25hbCBBZGRpdGlvbmFsIHBhdGhlcyB0byBsb29vayBmb3IsIGFscmVhZHkgc3BsaXR0ZWQgYnkgT1MtZGVwZW5kaW5nIHBhdGggZGVsaW1pdGVyLlxuICogQHJldHVybiB7c3RyaW5nW119IERpcmVjdG9yaWVzIHRvIGRpZyBpbnRvLlxuICovXG52YXIgZ2V0RGlyc1RvV2Fsa1Rocm91Z2ggPSBmdW5jdGlvbiAoYWRkaXRpb25hbFBhdGhzKSB7XG4gICAgaWYgKGFkZGl0aW9uYWxQYXRocyA9PT0gdm9pZCAwKSB7IGFkZGl0aW9uYWxQYXRocyA9IFtdOyB9XG4gICAgdmFyIGVudm5hbWUgPSBpc1dpbmRvd3MgPyAnUGF0aCcgOiAnUEFUSCc7XG4gICAgcmV0dXJuIChwcm9jZXNzLmVudltlbnZuYW1lXSB8fCAnJykuc3BsaXQocGF0aC5kZWxpbWl0ZXIpLmNvbmNhdChhZGRpdGlvbmFsUGF0aHMpO1xufTtcbi8qKlxuICogSnVzdCB0byBmbGF0dGVuIG5lc3RlZCBsaXN0cy5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1RbXVtdfSBhcnJcbiAqIEByZXR1cm4ge1RbXX1cbiAqL1xudmFyIGZsYXR0ZW4gPSBmdW5jdGlvbiAoYXJyKSB7XG4gICAgcmV0dXJuIGFyci5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGN1cnIpIHsgcmV0dXJuIHByZXYuY29uY2F0KGN1cnIpOyB9LCBbXSk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGFzeW5jIHByb21pc2Ugd2l0aCBhYnNvbHV0ZSBmaWxlIHBhdGggb2YgZ2l2ZW4gY29tbWFuZCxcbiAqIGFuZCByZXNvbHZlcyB3aXRoIHVuZGVmaW5lZCBpZiB0aGUgY29tbWFuZCBub3QgZm91bmQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCBDb21tYW5kIG5hbWUgdG8gbG9vayBmb3IuXG4gKiBAcGFyYW0ge0xvb2tQYXRoT3B0aW9ufSBvcHQgT3B0aW9ucyBmb3IgbG9va3BhdGguXG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFJlc29sdmVzIGFic29sdXRlIGZpbGUgcGF0aCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gbG9va3BhdGgoY29tbWFuZCwgb3B0KSB7XG4gICAgaWYgKG9wdCA9PT0gdm9pZCAwKSB7IG9wdCA9IHsgcGF0aDogW10gfTsgfVxuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRpcmVjdHBhdGgsIGRpcnMsIGRldGVjdGlvbnMsIG1hdGNoZWQ7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdHBhdGggPSBpc0ZpbGVwYXRoKGNvbW1hbmQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0cGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBpc0V4ZWN1dGFibGUoZGlyZWN0cGF0aCldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdC5wYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0LnBhdGggPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgZGlycyA9IGdldERpcnNUb1dhbGtUaHJvdWdoKG9wdC5wYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9ucyA9IGRpcnMubWFwKGZ1bmN0aW9uIChkaXIpIHsgcmV0dXJuIGZpbmRFeGVjdXRhYmxlVW5kZXJEaXIoY29tbWFuZCwgZGlyKTsgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIFByb21pc2UuYWxsKGRldGVjdGlvbnMpXTtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWQgPSBfYS5zZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBmbGF0dGVuKG1hdGNoZWQpLmZpbHRlcihmdW5jdGlvbiAoYWJzKSB7IHJldHVybiAhIWFiczsgfSlbMF1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbn1cbmV4cG9ydHMubG9va3BhdGggPSBsb29rcGF0aDtcbjtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImF3cy1zZGtcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY2hpbGRfcHJvY2Vzc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG9cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJxdWVyeXN0cmluZ1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZWFkbGluZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzdHJlYW1cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwidXRpbFwiKTsiXSwic291cmNlUm9vdCI6IiJ9
9347
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvYnVmZmVyLWZyb20vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtc3VwcG9ydC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYXJyYXktc2V0LmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2Jhc2U2NC12bHEuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtc3VwcG9ydC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvYmFzZTY0LmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL2JpbmFyeS1zZWFyY2guanMiLCJ3ZWJwYWNrOi8vLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtc3VwcG9ydC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvbWFwcGluZy1saXN0LmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvbGliL3F1aWNrLXNvcnQuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAtc3VwcG9ydC9ub2RlX21vZHVsZXMvc291cmNlLW1hcC9saWIvc291cmNlLW1hcC1jb25zdW1lci5qcyIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvci5qcyIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi9zb3VyY2Utbm9kZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwL2xpYi91dGlsLmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvbm9kZV9tb2R1bGVzL3NvdXJjZS1tYXAvc291cmNlLW1hcC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9ub2RlX21vZHVsZXMvc291cmNlLW1hcC1zdXBwb3J0L3JlZ2lzdGVyLmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy9zb3VyY2UtbWFwLXN1cHBvcnQvc291cmNlLW1hcC1zdXBwb3J0LmpzIiwid2VicGFjazovLy4uLy4uL25vZGVfbW9kdWxlcy93ZWJwYWNrL2J1aWxkaW4vbW9kdWxlLmpzIiwid2VicGFjazovL3NyYy9TMy50cyIsIndlYnBhY2s6Ly9zcmMvY2xpZW50LnRzIiwid2VicGFjazovLy4uL3NyYy9saWIvUzNNdWx0aXBhcnRVcGxvYWRzLnRzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2VuZC1vZi1zdHJlYW0vaW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19iYXNlR2V0VGFnLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVJhbmdlLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9fYmFzZVRyaW0uanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19jcmVhdGVSYW5nZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19nZXRSYXdUYWcuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19pc0luZGV4LmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9faXNJdGVyYXRlZUNhbGwuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL19vYmplY3RUb1N0cmluZy5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL190cmltbWVkRW5kSW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL2VxLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0FycmF5TGlrZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNCb29sZWFuLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0Z1bmN0aW9uLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC9pc0xlbmd0aC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNPYmplY3QuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL2lzT2JqZWN0TGlrZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvbG9kYXNoL3JhbmdlLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL2xvZGFzaC90b0Zpbml0ZS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9sb2Rhc2gvdG9OdW1iZXIuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvb25jZS9vbmNlLmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL3AtZmluYWxseS9pbmRleC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9wLW1hcC9pbmRleC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9wLXJldHJ5L2luZGV4LmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL3AtdGltZW91dC9pbmRleC5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9hd3MtY2xpZW50L25vZGVfbW9kdWxlcy9wLXdhaXQtZm9yL2luZGV4LmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL3B1bXAvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvcmV0cnkvaW5kZXguanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvcmV0cnkvbGliL3JldHJ5LmpzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2F3cy1jbGllbnQvbm9kZV9tb2R1bGVzL3JldHJ5L2xpYi9yZXRyeV9vcGVyYXRpb24uanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvYXdzLWNsaWVudC9ub2RlX21vZHVsZXMvd3JhcHB5L3dyYXBweS5qcyIsIndlYnBhY2s6Ly9zcmMvc2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vc3JjL3Rlc3QtdXRpbHMudHMiLCJ3ZWJwYWNrOi8vc3JjL3V0aWxzLnRzIiwid2VicGFjazovLy4uL3NyYy9jaGVja3N1bS50cyIsIndlYnBhY2s6Ly8uLi9zcmMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vLi4vc3JjL3ZhbGlkYXRlLnRzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2NoZWNrc3VtL25vZGVfbW9kdWxlcy9ja3N1bS9pbmRleC5qcyIsIndlYnBhY2s6Ly9zcmMvbG9nLnRzIiwid2VicGFjazovLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9ub2RlX21vZHVsZXMvbG9kYXNoL19TeW1ib2wuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2Jhc2VHZXRUYWcuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2ZyZWVHbG9iYWwuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX2dldFJhd1RhZy5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9jb21tb24vbm9kZV9tb2R1bGVzL2xvZGFzaC9fb2JqZWN0VG9TdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvX3Jvb3QuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNBcnJheS5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9jb21tb24vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc051bWJlci5qcyIsIndlYnBhY2s6Ly8uLi8uLi9wYWNrYWdlcy9jb21tb24vbm9kZV9tb2R1bGVzL2xvZGFzaC9pc09iamVjdExpa2UuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvY29tbW9uL25vZGVfbW9kdWxlcy9sb2Rhc2gvaXNTdHJpbmcuanMiLCJ3ZWJwYWNrOi8vLi4vLi4vcGFja2FnZXMvbG9nZ2VyL25vZGVfbW9kdWxlcy9sb2Rhc2guaXNlcnJvci9pbmRleC5qcyIsIndlYnBhY2s6Ly9pbmRleC5qcyIsIndlYnBhY2s6Ly9ub2RlX21vZHVsZXMvQGN1bXVsdXMvY3VtdWx1cy1tZXNzYWdlLWFkYXB0ZXItanMvZGlzdC9jbWEuanMiLCJ3ZWJwYWNrOi8vbm9kZV9tb2R1bGVzL0BjdW11bHVzL2N1bXVsdXMtbWVzc2FnZS1hZGFwdGVyLWpzL2Rpc3QvaW5kZXguanMiLCJ3ZWJwYWNrOi8vbm9kZV9tb2R1bGVzL0BjdW11bHVzL2N1bXVsdXMtbWVzc2FnZS1hZGFwdGVyLWpzL2Rpc3QvbWVzc2FnZS5qcyIsIndlYnBhY2s6Ly9ub2RlX21vZHVsZXMvQGN1bXVsdXMvY3VtdWx1cy1tZXNzYWdlLWFkYXB0ZXItanMvZGlzdC90eXBlR3VhcmRzLmpzIiwid2VicGFjazovL25vZGVfbW9kdWxlcy9AY3VtdWx1cy9jdW11bHVzLW1lc3NhZ2UtYWRhcHRlci1qcy9kaXN0L3R5cGVzLmpzIiwid2VicGFjazovL25vZGVfbW9kdWxlcy9sb29rcGF0aC9saWIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJhd3Mtc2RrXCIiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJjaGlsZF9wcm9jZXNzXCIiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vZXh0ZXJuYWwgXCJxdWVyeXN0cmluZ1wiIiwid2VicGFjazovL2V4dGVybmFsIFwicmVhZGxpbmVcIiIsIndlYnBhY2s6Ly9leHRlcm5hbCBcInN0cmVhbVwiIiwid2VicGFjazovL2V4dGVybmFsIFwidXRpbFwiIl0sIm5hbWVzIjpbImN1bXVsdXNNZXNzYWdlQWRhcHRlciIsInJlcXVpcmUiLCJkZWxldGVTM09iamVjdCIsInMzT2JqZWN0RXhpc3RzIiwiczNQdXRPYmplY3QiLCJsb2ciLCJ0aHJvd0Vycm9ySWZDb25maWd1cmVkIiwiZXZlbnQiLCJleGVjdXRpb24iLCJjb25maWciLCJyZXRyeUZpbGVuYW1lIiwiYnVja2V0IiwiaXNSZXRyeSIsInBhc3NPblJldHJ5IiwiQnVja2V0IiwiS2V5IiwiZGVidWciLCJmYWlsIiwiQm9keSIsIkVycm9yIiwiaGVsbG9Xb3JsZCIsImhlbGxvIiwiaGFuZGxlciIsImNvbnRleHQiLCJydW5DdW11bHVzVGFzayIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9EOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQSx5Q0FBeUMsaUNBQWlDO1FBQzFFLGdIQUFnSCxtQkFBbUIsRUFBRTtRQUNySTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDJCQUEyQiwwQkFBMEIsRUFBRTtRQUN2RCxpQ0FBaUMsZUFBZTtRQUNoRDtRQUNBO1FBQ0E7O1FBRUE7UUFDQSxzREFBc0QsK0RBQStEOztRQUVySDtRQUNBOzs7UUFHQTtRQUNBOzs7Ozs7Ozs7Ozs7QUNsRkE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUN2RUEsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsbUJBQU8sQ0FBQyx5RkFBUTtBQUMzQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsU0FBUztBQUMvQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUN4SEEsZ0JBQWdCLG9CQUFvQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNELG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhLG1CQUFPLENBQUMsNkZBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOzs7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O0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7O0FBRVg7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVzs7QUFFWDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLE1BQU07QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0NBQWtDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLHNEQUFzRCxZQUFZO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHdDQUF3QztBQUMvRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxtQkFBbUIsRUFBRTtBQUNwRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsb0JBQW9CO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwwQ0FBMEMsU0FBUztBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7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QUFDdEQ7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJCQUEyQixRQUFRO0FBQ25DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0EsY0FBYztBQUNkOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3ZlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLG1CQUFPLENBQUMsNkhBQTRCO0FBQ2pFLDRCQUE0QixtQkFBTyxDQUFDLDJIQUEyQjtBQUMvRCxxQkFBcUIsbUJBQU8sQ0FBQywyR0FBbUI7Ozs7Ozs7Ozs7OztBQ1BoRCxtQkFBTyxDQUFDLHVFQUFJOzs7Ozs7Ozs7Ozs7QUNBWixzRUFBd0IsbUJBQU8sQ0FBQywrRkFBWTtBQUM1QyxXQUFXLG1CQUFPLENBQUMsa0JBQU07O0FBRXpCO0FBQ0E7QUFDQSxPQUFPLG1CQUFPLENBQUMsY0FBSTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBOztBQUVBLGlCQUFpQixtQkFBTyxDQUFDLDREQUFhOztBQUV0QztBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxPQUFPO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGFBQWE7QUFDYjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxtQkFBbUIsaUJBQWlCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixZQUFZLGtCQUFrQjtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7O0FBRUE7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxnQ0FBZ0MsRUFBRTtBQUM1RixHQUFHO0FBQ0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsR0FBRyxzQkFBc0IsR0FBRztBQUN2RjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0Msd0JBQXdCO0FBQzVELHNDQUFzQyxzQkFBc0I7QUFDNUQsd0NBQXdDLDRCQUE0QjtBQUNwRSxpREFBaUQsd0JBQXdCO0FBQ3pFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxlQUFlO0FBQ3JEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxlQUFlO0FBQ2Y7QUFDQSxnQ0FBZ0MsUUFBUTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkYsb0JBQW9CO0FBQy9HO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNobkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUNyQkE7O0FBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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SDtBQUNBO0FBQ0E7QUFDQSxXQUFXLFNBQVM7QUFDcEIsWUFBWSxTQUFTO0FBQ3JCO0FBQ0E7QUFDQSxxQ0FBcUMsc0JBQXNCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsTUFBTTtBQUNqQixZQUFZO0FBQ1o7QUFDQTtBQUNBLDZDQUE2QywwQkFBMEIsRUFBRTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQixXQUFXLGVBQWU7QUFDMUIsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBLHlCQUF5QixRQUFRLFlBQVk7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCw2Q0FBNkMsRUFBRTtBQUN6RztBQUNBO0FBQ0E7QUFDQSxrRkFBa0YsY0FBYyxFQUFFO0FBQ2xHO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQzFLQSxvQzs7Ozs7Ozs7Ozs7QUNBQSwwQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxpQzs7Ozs7Ozs7Ozs7QUNBQSx3Qzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxpQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vaW5kZXguanNcIik7XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcblxudmFyIGlzTW9kZXJuID0gKFxuICB0eXBlb2YgQnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICB0eXBlb2YgQnVmZmVyLmFsbG9jID09PSAnZnVuY3Rpb24nICYmXG4gIHR5cGVvZiBCdWZmZXIuYWxsb2NVbnNhZmUgPT09ICdmdW5jdGlvbicgJiZcbiAgdHlwZW9mIEJ1ZmZlci5mcm9tID09PSAnZnVuY3Rpb24nXG4pXG5cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIgKGlucHV0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGlucHV0KS5zbGljZSg4LCAtMSkgPT09ICdBcnJheUJ1ZmZlcidcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyIChvYmosIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICBieXRlT2Zmc2V0ID4+Pj0gMFxuXG4gIHZhciBtYXhMZW5ndGggPSBvYmouYnl0ZUxlbmd0aCAtIGJ5dGVPZmZzZXRcblxuICBpZiAobWF4TGVuZ3RoIDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kc1wiKVxuICB9XG5cbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gbWF4TGVuZ3RoXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID4+Pj0gMFxuXG4gICAgaWYgKGxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzXCIpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzTW9kZXJuXG4gICAgPyBCdWZmZXIuZnJvbShvYmouc2xpY2UoYnl0ZU9mZnNldCwgYnl0ZU9mZnNldCArIGxlbmd0aCkpXG4gICAgOiBuZXcgQnVmZmVyKG5ldyBVaW50OEFycmF5KG9iai5zbGljZShieXRlT2Zmc2V0LCBieXRlT2Zmc2V0ICsgbGVuZ3RoKSkpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgcmV0dXJuIGlzTW9kZXJuXG4gICAgPyBCdWZmZXIuZnJvbShzdHJpbmcsIGVuY29kaW5nKVxuICAgIDogbmV3IEJ1ZmZlcihzdHJpbmcsIGVuY29kaW5nKVxufVxuXG5mdW5jdGlvbiBidWZmZXJGcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmIChpc0FycmF5QnVmZmVyKHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICByZXR1cm4gaXNNb2Rlcm5cbiAgICA/IEJ1ZmZlci5mcm9tKHZhbHVlKVxuICAgIDogbmV3IEJ1ZmZlcih2YWx1ZSlcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBidWZmZXJGcm9tXG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBoYXNOYXRpdmVNYXAgPSB0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiO1xuXG4vKipcbiAqIEEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggaXMgYSBjb21iaW5hdGlvbiBvZiBhbiBhcnJheSBhbmQgYSBzZXQuIEFkZGluZyBhIG5ld1xuICogbWVtYmVyIGlzIE8oMSksIHRlc3RpbmcgZm9yIG1lbWJlcnNoaXAgaXMgTygxKSwgYW5kIGZpbmRpbmcgdGhlIGluZGV4IG9mIGFuXG4gKiBlbGVtZW50IGlzIE8oMSkuIFJlbW92aW5nIGVsZW1lbnRzIGZyb20gdGhlIHNldCBpcyBub3Qgc3VwcG9ydGVkLiBPbmx5XG4gKiBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQgZm9yIG1lbWJlcnNoaXAuXG4gKi9cbmZ1bmN0aW9uIEFycmF5U2V0KCkge1xuICB0aGlzLl9hcnJheSA9IFtdO1xuICB0aGlzLl9zZXQgPSBoYXNOYXRpdmVNYXAgPyBuZXcgTWFwKCkgOiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuXG4vKipcbiAqIFN0YXRpYyBtZXRob2QgZm9yIGNyZWF0aW5nIEFycmF5U2V0IGluc3RhbmNlcyBmcm9tIGFuIGV4aXN0aW5nIGFycmF5LlxuICovXG5BcnJheVNldC5mcm9tQXJyYXkgPSBmdW5jdGlvbiBBcnJheVNldF9mcm9tQXJyYXkoYUFycmF5LCBhQWxsb3dEdXBsaWNhdGVzKSB7XG4gIHZhciBzZXQgPSBuZXcgQXJyYXlTZXQoKTtcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGFBcnJheS5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIHNldC5hZGQoYUFycmF5W2ldLCBhQWxsb3dEdXBsaWNhdGVzKTtcbiAgfVxuICByZXR1cm4gc2V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm4gaG93IG1hbnkgdW5pcXVlIGl0ZW1zIGFyZSBpbiB0aGlzIEFycmF5U2V0LiBJZiBkdXBsaWNhdGVzIGhhdmUgYmVlblxuICogYWRkZWQsIHRoYW4gdGhvc2UgZG8gbm90IGNvdW50IHRvd2FyZHMgdGhlIHNpemUuXG4gKlxuICogQHJldHVybnMgTnVtYmVyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gQXJyYXlTZXRfc2l6ZSgpIHtcbiAgcmV0dXJuIGhhc05hdGl2ZU1hcCA/IHRoaXMuX3NldC5zaXplIDogT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcy5fc2V0KS5sZW5ndGg7XG59O1xuXG4vKipcbiAqIEFkZCB0aGUgZ2l2ZW4gc3RyaW5nIHRvIHRoaXMgc2V0LlxuICpcbiAqIEBwYXJhbSBTdHJpbmcgYVN0clxuICovXG5BcnJheVNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gQXJyYXlTZXRfYWRkKGFTdHIsIGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgdmFyIHNTdHIgPSBoYXNOYXRpdmVNYXAgPyBhU3RyIDogdXRpbC50b1NldFN0cmluZyhhU3RyKTtcbiAgdmFyIGlzRHVwbGljYXRlID0gaGFzTmF0aXZlTWFwID8gdGhpcy5oYXMoYVN0cikgOiBoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpO1xuICB2YXIgaWR4ID0gdGhpcy5fYXJyYXkubGVuZ3RoO1xuICBpZiAoIWlzRHVwbGljYXRlIHx8IGFBbGxvd0R1cGxpY2F0ZXMpIHtcbiAgICB0aGlzLl9hcnJheS5wdXNoKGFTdHIpO1xuICB9XG4gIGlmICghaXNEdXBsaWNhdGUpIHtcbiAgICBpZiAoaGFzTmF0aXZlTWFwKSB7XG4gICAgICB0aGlzLl9zZXQuc2V0KGFTdHIsIGlkeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NldFtzU3RyXSA9IGlkeDtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogSXMgdGhlIGdpdmVuIHN0cmluZyBhIG1lbWJlciBvZiB0aGlzIHNldD9cbiAqXG4gKiBAcGFyYW0gU3RyaW5nIGFTdHJcbiAqL1xuQXJyYXlTZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIEFycmF5U2V0X2hhcyhhU3RyKSB7XG4gIGlmIChoYXNOYXRpdmVNYXApIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0LmhhcyhhU3RyKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgc1N0ciA9IHV0aWwudG9TZXRTdHJpbmcoYVN0cik7XG4gICAgcmV0dXJuIGhhcy5jYWxsKHRoaXMuX3NldCwgc1N0cik7XG4gIH1cbn07XG5cbi8qKlxuICogV2hhdCBpcyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIHN0cmluZyBpbiB0aGUgYXJyYXk/XG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gQXJyYXlTZXRfaW5kZXhPZihhU3RyKSB7XG4gIGlmIChoYXNOYXRpdmVNYXApIHtcbiAgICB2YXIgaWR4ID0gdGhpcy5fc2V0LmdldChhU3RyKTtcbiAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNTdHIgPSB1dGlsLnRvU2V0U3RyaW5nKGFTdHIpO1xuICAgIGlmIChoYXMuY2FsbCh0aGlzLl9zZXQsIHNTdHIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2V0W3NTdHJdO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcignXCInICsgYVN0ciArICdcIiBpcyBub3QgaW4gdGhlIHNldC4nKTtcbn07XG5cbi8qKlxuICogV2hhdCBpcyB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXg/XG4gKlxuICogQHBhcmFtIE51bWJlciBhSWR4XG4gKi9cbkFycmF5U2V0LnByb3RvdHlwZS5hdCA9IGZ1bmN0aW9uIEFycmF5U2V0X2F0KGFJZHgpIHtcbiAgaWYgKGFJZHggPj0gMCAmJiBhSWR4IDwgdGhpcy5fYXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FycmF5W2FJZHhdO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcignTm8gZWxlbWVudCBpbmRleGVkIGJ5ICcgKyBhSWR4KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzZXQgKHdoaWNoIGhhcyB0aGUgcHJvcGVyIGluZGljZXNcbiAqIGluZGljYXRlZCBieSBpbmRleE9mKS4gTm90ZSB0aGF0IHRoaXMgaXMgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBhcnJheSB1c2VkXG4gKiBmb3Igc3RvcmluZyB0aGUgbWVtYmVycyBzbyB0aGF0IG5vIG9uZSBjYW4gbWVzcyB3aXRoIGludGVybmFsIHN0YXRlLlxuICovXG5BcnJheVNldC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIEFycmF5U2V0X3RvQXJyYXkoKSB7XG4gIHJldHVybiB0aGlzLl9hcnJheS5zbGljZSgpO1xufTtcblxuZXhwb3J0cy5BcnJheVNldCA9IEFycmF5U2V0O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFzZSA2NCBWTFEgaW1wbGVtZW50YXRpb24gaW4gQ2xvc3VyZSBDb21waWxlcjpcbiAqIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2xvc3VyZS1jb21waWxlci9zb3VyY2UvYnJvd3NlL3RydW5rL3NyYy9jb20vZ29vZ2xlL2RlYnVnZ2luZy9zb3VyY2VtYXAvQmFzZTY0VkxRLmphdmFcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSBUaGUgQ2xvc3VyZSBDb21waWxlciBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlXG4gKiBtZXQ6XG4gKlxuICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRcbiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cbiAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmVcbiAqICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nXG4gKiAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWRcbiAqICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi5cbiAqICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHNcbiAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZFxuICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuICpcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlNcbiAqIFwiQVMgSVNcIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1RcbiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUlxuICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFRcbiAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLFxuICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVFxuICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsXG4gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTllcbiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlRcbiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRVxuICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cbiAqL1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi9iYXNlNjQnKTtcblxuLy8gQSBzaW5nbGUgYmFzZSA2NCBkaWdpdCBjYW4gY29udGFpbiA2IGJpdHMgb2YgZGF0YS4gRm9yIHRoZSBiYXNlIDY0IHZhcmlhYmxlXG4vLyBsZW5ndGggcXVhbnRpdGllcyB3ZSB1c2UgaW4gdGhlIHNvdXJjZSBtYXAgc3BlYywgdGhlIGZpcnN0IGJpdCBpcyB0aGUgc2lnbixcbi8vIHRoZSBuZXh0IGZvdXIgYml0cyBhcmUgdGhlIGFjdHVhbCB2YWx1ZSwgYW5kIHRoZSA2dGggYml0IGlzIHRoZVxuLy8gY29udGludWF0aW9uIGJpdC4gVGhlIGNvbnRpbnVhdGlvbiBiaXQgdGVsbHMgdXMgd2hldGhlciB0aGVyZSBhcmUgbW9yZVxuLy8gZGlnaXRzIGluIHRoaXMgdmFsdWUgZm9sbG93aW5nIHRoaXMgZGlnaXQuXG4vL1xuLy8gICBDb250aW51YXRpb25cbi8vICAgfCAgICBTaWduXG4vLyAgIHwgICAgfFxuLy8gICBWICAgIFZcbi8vICAgMTAxMDExXG5cbnZhciBWTFFfQkFTRV9TSElGVCA9IDU7XG5cbi8vIGJpbmFyeTogMTAwMDAwXG52YXIgVkxRX0JBU0UgPSAxIDw8IFZMUV9CQVNFX1NISUZUO1xuXG4vLyBiaW5hcnk6IDAxMTExMVxudmFyIFZMUV9CQVNFX01BU0sgPSBWTFFfQkFTRSAtIDE7XG5cbi8vIGJpbmFyeTogMTAwMDAwXG52YXIgVkxRX0NPTlRJTlVBVElPTl9CSVQgPSBWTFFfQkFTRTtcblxuLyoqXG4gKiBDb252ZXJ0cyBmcm9tIGEgdHdvLWNvbXBsZW1lbnQgdmFsdWUgdG8gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXNcbiAqIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOlxuICogICAxIGJlY29tZXMgMiAoMTAgYmluYXJ5KSwgLTEgYmVjb21lcyAzICgxMSBiaW5hcnkpXG4gKiAgIDIgYmVjb21lcyA0ICgxMDAgYmluYXJ5KSwgLTIgYmVjb21lcyA1ICgxMDEgYmluYXJ5KVxuICovXG5mdW5jdGlvbiB0b1ZMUVNpZ25lZChhVmFsdWUpIHtcbiAgcmV0dXJuIGFWYWx1ZSA8IDBcbiAgICA/ICgoLWFWYWx1ZSkgPDwgMSkgKyAxXG4gICAgOiAoYVZhbHVlIDw8IDEpICsgMDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyB0byBhIHR3by1jb21wbGVtZW50IHZhbHVlIGZyb20gYSB2YWx1ZSB3aGVyZSB0aGUgc2lnbiBiaXQgaXNcbiAqIHBsYWNlZCBpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAgRm9yIGV4YW1wbGUsIGFzIGRlY2ltYWxzOlxuICogICAyICgxMCBiaW5hcnkpIGJlY29tZXMgMSwgMyAoMTEgYmluYXJ5KSBiZWNvbWVzIC0xXG4gKiAgIDQgKDEwMCBiaW5hcnkpIGJlY29tZXMgMiwgNSAoMTAxIGJpbmFyeSkgYmVjb21lcyAtMlxuICovXG5mdW5jdGlvbiBmcm9tVkxRU2lnbmVkKGFWYWx1ZSkge1xuICB2YXIgaXNOZWdhdGl2ZSA9IChhVmFsdWUgJiAxKSA9PT0gMTtcbiAgdmFyIHNoaWZ0ZWQgPSBhVmFsdWUgPj4gMTtcbiAgcmV0dXJuIGlzTmVnYXRpdmVcbiAgICA/IC1zaGlmdGVkXG4gICAgOiBzaGlmdGVkO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGJhc2UgNjQgVkxRIGVuY29kZWQgdmFsdWUuXG4gKi9cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gYmFzZTY0VkxRX2VuY29kZShhVmFsdWUpIHtcbiAgdmFyIGVuY29kZWQgPSBcIlwiO1xuICB2YXIgZGlnaXQ7XG5cbiAgdmFyIHZscSA9IHRvVkxRU2lnbmVkKGFWYWx1ZSk7XG5cbiAgZG8ge1xuICAgIGRpZ2l0ID0gdmxxICYgVkxRX0JBU0VfTUFTSztcbiAgICB2bHEgPj4+PSBWTFFfQkFTRV9TSElGVDtcbiAgICBpZiAodmxxID4gMCkge1xuICAgICAgLy8gVGhlcmUgYXJlIHN0aWxsIG1vcmUgZGlnaXRzIGluIHRoaXMgdmFsdWUsIHNvIHdlIG11c3QgbWFrZSBzdXJlIHRoZVxuICAgICAgLy8gY29udGludWF0aW9uIGJpdCBpcyBtYXJrZWQuXG4gICAgICBkaWdpdCB8PSBWTFFfQ09OVElOVUFUSU9OX0JJVDtcbiAgICB9XG4gICAgZW5jb2RlZCArPSBiYXNlNjQuZW5jb2RlKGRpZ2l0KTtcbiAgfSB3aGlsZSAodmxxID4gMCk7XG5cbiAgcmV0dXJuIGVuY29kZWQ7XG59O1xuXG4vKipcbiAqIERlY29kZXMgdGhlIG5leHQgYmFzZSA2NCBWTFEgdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCByZXR1cm5zIHRoZVxuICogdmFsdWUgYW5kIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgdmlhIHRoZSBvdXQgcGFyYW1ldGVyLlxuICovXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uIGJhc2U2NFZMUV9kZWNvZGUoYVN0ciwgYUluZGV4LCBhT3V0UGFyYW0pIHtcbiAgdmFyIHN0ckxlbiA9IGFTdHIubGVuZ3RoO1xuICB2YXIgcmVzdWx0ID0gMDtcbiAgdmFyIHNoaWZ0ID0gMDtcbiAgdmFyIGNvbnRpbnVhdGlvbiwgZGlnaXQ7XG5cbiAgZG8ge1xuICAgIGlmIChhSW5kZXggPj0gc3RyTGVuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBtb3JlIGRpZ2l0cyBpbiBiYXNlIDY0IFZMUSB2YWx1ZS5cIik7XG4gICAgfVxuXG4gICAgZGlnaXQgPSBiYXNlNjQuZGVjb2RlKGFTdHIuY2hhckNvZGVBdChhSW5kZXgrKykpO1xuICAgIGlmIChkaWdpdCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFzZTY0IGRpZ2l0OiBcIiArIGFTdHIuY2hhckF0KGFJbmRleCAtIDEpKTtcbiAgICB9XG5cbiAgICBjb250aW51YXRpb24gPSAhIShkaWdpdCAmIFZMUV9DT05USU5VQVRJT05fQklUKTtcbiAgICBkaWdpdCAmPSBWTFFfQkFTRV9NQVNLO1xuICAgIHJlc3VsdCA9IHJlc3VsdCArIChkaWdpdCA8PCBzaGlmdCk7XG4gICAgc2hpZnQgKz0gVkxRX0JBU0VfU0hJRlQ7XG4gIH0gd2hpbGUgKGNvbnRpbnVhdGlvbik7XG5cbiAgYU91dFBhcmFtLnZhbHVlID0gZnJvbVZMUVNpZ25lZChyZXN1bHQpO1xuICBhT3V0UGFyYW0ucmVzdCA9IGFJbmRleDtcbn07XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBpbnRUb0NoYXJNYXAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLycuc3BsaXQoJycpO1xuXG4vKipcbiAqIEVuY29kZSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBvZiAwIHRvIDYzIHRvIGEgc2luZ2xlIGJhc2UgNjQgZGlnaXQuXG4gKi9cbmV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24gKG51bWJlcikge1xuICBpZiAoMCA8PSBudW1iZXIgJiYgbnVtYmVyIDwgaW50VG9DaGFyTWFwLmxlbmd0aCkge1xuICAgIHJldHVybiBpbnRUb0NoYXJNYXBbbnVtYmVyXTtcbiAgfVxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDYzOiBcIiArIG51bWJlcik7XG59O1xuXG4vKipcbiAqIERlY29kZSBhIHNpbmdsZSBiYXNlIDY0IGNoYXJhY3RlciBjb2RlIGRpZ2l0IHRvIGFuIGludGVnZXIuIFJldHVybnMgLTEgb25cbiAqIGZhaWx1cmUuXG4gKi9cbmV4cG9ydHMuZGVjb2RlID0gZnVuY3Rpb24gKGNoYXJDb2RlKSB7XG4gIHZhciBiaWdBID0gNjU7ICAgICAvLyAnQSdcbiAgdmFyIGJpZ1ogPSA5MDsgICAgIC8vICdaJ1xuXG4gIHZhciBsaXR0bGVBID0gOTc7ICAvLyAnYSdcbiAgdmFyIGxpdHRsZVogPSAxMjI7IC8vICd6J1xuXG4gIHZhciB6ZXJvID0gNDg7ICAgICAvLyAnMCdcbiAgdmFyIG5pbmUgPSA1NzsgICAgIC8vICc5J1xuXG4gIHZhciBwbHVzID0gNDM7ICAgICAvLyAnKydcbiAgdmFyIHNsYXNoID0gNDc7ICAgIC8vICcvJ1xuXG4gIHZhciBsaXR0bGVPZmZzZXQgPSAyNjtcbiAgdmFyIG51bWJlck9mZnNldCA9IDUyO1xuXG4gIC8vIDAgLSAyNTogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcbiAgaWYgKGJpZ0EgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gYmlnWikge1xuICAgIHJldHVybiAoY2hhckNvZGUgLSBiaWdBKTtcbiAgfVxuXG4gIC8vIDI2IC0gNTE6IGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XG4gIGlmIChsaXR0bGVBIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IGxpdHRsZVopIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gbGl0dGxlQSArIGxpdHRsZU9mZnNldCk7XG4gIH1cblxuICAvLyA1MiAtIDYxOiAwMTIzNDU2Nzg5XG4gIGlmICh6ZXJvIDw9IGNoYXJDb2RlICYmIGNoYXJDb2RlIDw9IG5pbmUpIHtcbiAgICByZXR1cm4gKGNoYXJDb2RlIC0gemVybyArIG51bWJlck9mZnNldCk7XG4gIH1cblxuICAvLyA2MjogK1xuICBpZiAoY2hhckNvZGUgPT0gcGx1cykge1xuICAgIHJldHVybiA2MjtcbiAgfVxuXG4gIC8vIDYzOiAvXG4gIGlmIChjaGFyQ29kZSA9PSBzbGFzaCkge1xuICAgIHJldHVybiA2MztcbiAgfVxuXG4gIC8vIEludmFsaWQgYmFzZTY0IGRpZ2l0LlxuICByZXR1cm4gLTE7XG59O1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG5leHBvcnRzLkdSRUFURVNUX0xPV0VSX0JPVU5EID0gMTtcbmV4cG9ydHMuTEVBU1RfVVBQRVJfQk9VTkQgPSAyO1xuXG4vKipcbiAqIFJlY3Vyc2l2ZSBpbXBsZW1lbnRhdGlvbiBvZiBiaW5hcnkgc2VhcmNoLlxuICpcbiAqIEBwYXJhbSBhTG93IEluZGljZXMgaGVyZSBhbmQgbG93ZXIgZG8gbm90IGNvbnRhaW4gdGhlIG5lZWRsZS5cbiAqIEBwYXJhbSBhSGlnaCBJbmRpY2VzIGhlcmUgYW5kIGhpZ2hlciBkbyBub3QgY29udGFpbiB0aGUgbmVlZGxlLlxuICogQHBhcmFtIGFOZWVkbGUgVGhlIGVsZW1lbnQgYmVpbmcgc2VhcmNoZWQgZm9yLlxuICogQHBhcmFtIGFIYXlzdGFjayBUaGUgbm9uLWVtcHR5IGFycmF5IGJlaW5nIHNlYXJjaGVkLlxuICogQHBhcmFtIGFDb21wYXJlIEZ1bmN0aW9uIHdoaWNoIHRha2VzIHR3byBlbGVtZW50cyBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMS5cbiAqIEBwYXJhbSBhQmlhcyBFaXRoZXIgJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnYmluYXJ5U2VhcmNoLkxFQVNUX1VQUEVSX0JPVU5EJy4gU3BlY2lmaWVzIHdoZXRoZXIgdG8gcmV0dXJuIHRoZVxuICogICAgIGNsb3Nlc3QgZWxlbWVudCB0aGF0IGlzIHNtYWxsZXIgdGhhbiBvciBncmVhdGVyIHRoYW4gdGhlIG9uZSB3ZSBhcmVcbiAqICAgICBzZWFyY2hpbmcgZm9yLCByZXNwZWN0aXZlbHksIGlmIHRoZSBleGFjdCBlbGVtZW50IGNhbm5vdCBiZSBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gcmVjdXJzaXZlU2VhcmNoKGFMb3csIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcykge1xuICAvLyBUaGlzIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOlxuICAvL1xuICAvLyAgIDEuIFdlIGZpbmQgdGhlIGV4YWN0IGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAvL1xuICAvLyAgIDIuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYnV0IHdlIGNhbiByZXR1cm4gdGhlIGluZGV4IG9mXG4gIC8vICAgICAgdGhlIG5leHQtY2xvc2VzdCBlbGVtZW50LlxuICAvL1xuICAvLyAgIDMuIFdlIGRpZCBub3QgZmluZCB0aGUgZXhhY3QgZWxlbWVudCwgYW5kIHRoZXJlIGlzIG5vIG5leHQtY2xvc2VzdFxuICAvLyAgICAgIGVsZW1lbnQgdGhhbiB0aGUgb25lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLCBzbyB3ZSByZXR1cm4gLTEuXG4gIHZhciBtaWQgPSBNYXRoLmZsb29yKChhSGlnaCAtIGFMb3cpIC8gMikgKyBhTG93O1xuICB2YXIgY21wID0gYUNvbXBhcmUoYU5lZWRsZSwgYUhheXN0YWNrW21pZF0sIHRydWUpO1xuICBpZiAoY21wID09PSAwKSB7XG4gICAgLy8gRm91bmQgdGhlIGVsZW1lbnQgd2UgYXJlIGxvb2tpbmcgZm9yLlxuICAgIHJldHVybiBtaWQ7XG4gIH1cbiAgZWxzZSBpZiAoY21wID4gMCkge1xuICAgIC8vIE91ciBuZWVkbGUgaXMgZ3JlYXRlciB0aGFuIGFIYXlzdGFja1ttaWRdLlxuICAgIGlmIChhSGlnaCAtIG1pZCA+IDEpIHtcbiAgICAgIC8vIFRoZSBlbGVtZW50IGlzIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAgcmV0dXJuIHJlY3Vyc2l2ZVNlYXJjaChtaWQsIGFIaWdoLCBhTmVlZGxlLCBhSGF5c3RhY2ssIGFDb21wYXJlLCBhQmlhcyk7XG4gICAgfVxuXG4gICAgLy8gVGhlIGV4YWN0IG5lZWRsZSBlbGVtZW50IHdhcyBub3QgZm91bmQgaW4gdGhpcyBoYXlzdGFjay4gRGV0ZXJtaW5lIGlmXG4gICAgLy8gd2UgYXJlIGluIHRlcm1pbmF0aW9uIGNhc2UgKDMpIG9yICgyKSBhbmQgcmV0dXJuIHRoZSBhcHByb3ByaWF0ZSB0aGluZy5cbiAgICBpZiAoYUJpYXMgPT0gZXhwb3J0cy5MRUFTVF9VUFBFUl9CT1VORCkge1xuICAgICAgcmV0dXJuIGFIaWdoIDwgYUhheXN0YWNrLmxlbmd0aCA/IGFIaWdoIDogLTE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfVxuICB9XG4gIGVsc2Uge1xuICAgIC8vIE91ciBuZWVkbGUgaXMgbGVzcyB0aGFuIGFIYXlzdGFja1ttaWRdLlxuICAgIGlmIChtaWQgLSBhTG93ID4gMSkge1xuICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgaW4gdGhlIGxvd2VyIGhhbGYuXG4gICAgICByZXR1cm4gcmVjdXJzaXZlU2VhcmNoKGFMb3csIG1pZCwgYU5lZWRsZSwgYUhheXN0YWNrLCBhQ29tcGFyZSwgYUJpYXMpO1xuICAgIH1cblxuICAgIC8vIHdlIGFyZSBpbiB0ZXJtaW5hdGlvbiBjYXNlICgzKSBvciAoMikgYW5kIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgdGhpbmcuXG4gICAgaWYgKGFCaWFzID09IGV4cG9ydHMuTEVBU1RfVVBQRVJfQk9VTkQpIHtcbiAgICAgIHJldHVybiBtaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhTG93IDwgMCA/IC0xIDogYUxvdztcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGJpbmFyeSBzZWFyY2ggd2hpY2ggd2lsbCBhbHdheXMgdHJ5IGFuZCByZXR1cm5cbiAqIHRoZSBpbmRleCBvZiB0aGUgY2xvc2VzdCBlbGVtZW50IGlmIHRoZXJlIGlzIG5vIGV4YWN0IGhpdC4gVGhpcyBpcyBiZWNhdXNlXG4gKiBtYXBwaW5ncyBiZXR3ZWVuIG9yaWdpbmFsIGFuZCBnZW5lcmF0ZWQgbGluZS9jb2wgcGFpcnMgYXJlIHNpbmdsZSBwb2ludHMsXG4gKiBhbmQgdGhlcmUgaXMgYW4gaW1wbGljaXQgcmVnaW9uIGJldHdlZW4gZWFjaCBvZiB0aGVtLCBzbyBhIG1pc3MganVzdCBtZWFuc1xuICogdGhhdCB5b3UgYXJlbid0IG9uIHRoZSB2ZXJ5IHN0YXJ0IG9mIGEgcmVnaW9uLlxuICpcbiAqIEBwYXJhbSBhTmVlZGxlIFRoZSBlbGVtZW50IHlvdSBhcmUgbG9va2luZyBmb3IuXG4gKiBAcGFyYW0gYUhheXN0YWNrIFRoZSBhcnJheSB0aGF0IGlzIGJlaW5nIHNlYXJjaGVkLlxuICogQHBhcmFtIGFDb21wYXJlIEEgZnVuY3Rpb24gd2hpY2ggdGFrZXMgdGhlIG5lZWRsZSBhbmQgYW4gZWxlbWVudCBpbiB0aGVcbiAqICAgICBhcnJheSBhbmQgcmV0dXJucyAtMSwgMCwgb3IgMSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgbmVlZGxlIGlzIGxlc3NcbiAqICAgICB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBlbGVtZW50LCByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0gYUJpYXMgRWl0aGVyICdiaW5hcnlTZWFyY2guR1JFQVRFU1RfTE9XRVJfQk9VTkQnIG9yXG4gKiAgICAgJ2JpbmFyeVNlYXJjaC5MRUFTVF9VUFBFUl9CT1VORCcuIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJldHVybiB0aGVcbiAqICAgICBjbG9zZXN0IGVsZW1lbnQgdGhhdCBpcyBzbWFsbGVyIHRoYW4gb3IgZ3JlYXRlciB0aGFuIHRoZSBvbmUgd2UgYXJlXG4gKiAgICAgc2VhcmNoaW5nIGZvciwgcmVzcGVjdGl2ZWx5LCBpZiB0aGUgZXhhY3QgZWxlbWVudCBjYW5ub3QgYmUgZm91bmQuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ2JpbmFyeVNlYXJjaC5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKi9cbmV4cG9ydHMuc2VhcmNoID0gZnVuY3Rpb24gc2VhcmNoKGFOZWVkbGUsIGFIYXlzdGFjaywgYUNvbXBhcmUsIGFCaWFzKSB7XG4gIGlmIChhSGF5c3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgdmFyIGluZGV4ID0gcmVjdXJzaXZlU2VhcmNoKC0xLCBhSGF5c3RhY2subGVuZ3RoLCBhTmVlZGxlLCBhSGF5c3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ29tcGFyZSwgYUJpYXMgfHwgZXhwb3J0cy5HUkVBVEVTVF9MT1dFUl9CT1VORCk7XG4gIGlmIChpbmRleCA8IDApIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvLyBXZSBoYXZlIGZvdW5kIGVpdGhlciB0aGUgZXhhY3QgZWxlbWVudCwgb3IgdGhlIG5leHQtY2xvc2VzdCBlbGVtZW50IHRoYW5cbiAgLy8gdGhlIG9uZSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4gSG93ZXZlciwgdGhlcmUgbWF5IGJlIG1vcmUgdGhhbiBvbmUgc3VjaFxuICAvLyBlbGVtZW50LiBNYWtlIHN1cmUgd2UgYWx3YXlzIHJldHVybiB0aGUgc21hbGxlc3Qgb2YgdGhlc2UuXG4gIHdoaWxlIChpbmRleCAtIDEgPj0gMCkge1xuICAgIGlmIChhQ29tcGFyZShhSGF5c3RhY2tbaW5kZXhdLCBhSGF5c3RhY2tbaW5kZXggLSAxXSwgdHJ1ZSkgIT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICAtLWluZGV4O1xuICB9XG5cbiAgcmV0dXJuIGluZGV4O1xufTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxNCBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxudmFyIHV0aWwgPSByZXF1aXJlKCcuL3V0aWwnKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgd2hldGhlciBtYXBwaW5nQiBpcyBhZnRlciBtYXBwaW5nQSB3aXRoIHJlc3BlY3QgdG8gZ2VuZXJhdGVkXG4gKiBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVkUG9zaXRpb25BZnRlcihtYXBwaW5nQSwgbWFwcGluZ0IpIHtcbiAgLy8gT3B0aW1pemVkIGZvciBtb3N0IGNvbW1vbiBjYXNlXG4gIHZhciBsaW5lQSA9IG1hcHBpbmdBLmdlbmVyYXRlZExpbmU7XG4gIHZhciBsaW5lQiA9IG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIHZhciBjb2x1bW5BID0gbWFwcGluZ0EuZ2VuZXJhdGVkQ29sdW1uO1xuICB2YXIgY29sdW1uQiA9IG1hcHBpbmdCLmdlbmVyYXRlZENvbHVtbjtcbiAgcmV0dXJuIGxpbmVCID4gbGluZUEgfHwgbGluZUIgPT0gbGluZUEgJiYgY29sdW1uQiA+PSBjb2x1bW5BIHx8XG4gICAgICAgICB1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKG1hcHBpbmdBLCBtYXBwaW5nQikgPD0gMDtcbn1cblxuLyoqXG4gKiBBIGRhdGEgc3RydWN0dXJlIHRvIHByb3ZpZGUgYSBzb3J0ZWQgdmlldyBvZiBhY2N1bXVsYXRlZCBtYXBwaW5ncyBpbiBhXG4gKiBwZXJmb3JtYW5jZSBjb25zY2lvdXMgbWFubmVyLiBJdCB0cmFkZXMgYSBuZWdsaWJhYmxlIG92ZXJoZWFkIGluIGdlbmVyYWxcbiAqIGNhc2UgZm9yIGEgbGFyZ2Ugc3BlZWR1cCBpbiBjYXNlIG9mIG1hcHBpbmdzIGJlaW5nIGFkZGVkIGluIG9yZGVyLlxuICovXG5mdW5jdGlvbiBNYXBwaW5nTGlzdCgpIHtcbiAgdGhpcy5fYXJyYXkgPSBbXTtcbiAgdGhpcy5fc29ydGVkID0gdHJ1ZTtcbiAgLy8gU2VydmVzIGFzIGluZmltdW1cbiAgdGhpcy5fbGFzdCA9IHtnZW5lcmF0ZWRMaW5lOiAtMSwgZ2VuZXJhdGVkQ29sdW1uOiAwfTtcbn1cblxuLyoqXG4gKiBJdGVyYXRlIHRocm91Z2ggaW50ZXJuYWwgaXRlbXMuIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBzYW1lIGFyZ3VtZW50cyB0aGF0XG4gKiBgQXJyYXkucHJvdG90eXBlLmZvckVhY2hgIHRha2VzLlxuICpcbiAqIE5PVEU6IFRoZSBvcmRlciBvZiB0aGUgbWFwcGluZ3MgaXMgTk9UIGd1YXJhbnRlZWQuXG4gKi9cbk1hcHBpbmdMaXN0LnByb3RvdHlwZS51bnNvcnRlZEZvckVhY2ggPVxuICBmdW5jdGlvbiBNYXBwaW5nTGlzdF9mb3JFYWNoKGFDYWxsYmFjaywgYVRoaXNBcmcpIHtcbiAgICB0aGlzLl9hcnJheS5mb3JFYWNoKGFDYWxsYmFjaywgYVRoaXNBcmcpO1xuICB9O1xuXG4vKipcbiAqIEFkZCB0aGUgZ2l2ZW4gc291cmNlIG1hcHBpbmcuXG4gKlxuICogQHBhcmFtIE9iamVjdCBhTWFwcGluZ1xuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gTWFwcGluZ0xpc3RfYWRkKGFNYXBwaW5nKSB7XG4gIGlmIChnZW5lcmF0ZWRQb3NpdGlvbkFmdGVyKHRoaXMuX2xhc3QsIGFNYXBwaW5nKSkge1xuICAgIHRoaXMuX2xhc3QgPSBhTWFwcGluZztcbiAgICB0aGlzLl9hcnJheS5wdXNoKGFNYXBwaW5nKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLl9zb3J0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9hcnJheS5wdXNoKGFNYXBwaW5nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmbGF0LCBzb3J0ZWQgYXJyYXkgb2YgbWFwcGluZ3MuIFRoZSBtYXBwaW5ncyBhcmUgc29ydGVkIGJ5XG4gKiBnZW5lcmF0ZWQgcG9zaXRpb24uXG4gKlxuICogV0FSTklORzogVGhpcyBtZXRob2QgcmV0dXJucyBpbnRlcm5hbCBkYXRhIHdpdGhvdXQgY29weWluZywgZm9yXG4gKiBwZXJmb3JtYW5jZS4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IE5PVCBiZSBtdXRhdGVkLCBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXNcbiAqIGFuIGltbXV0YWJsZSBib3Jyb3cuIElmIHlvdSB3YW50IHRvIHRha2Ugb3duZXJzaGlwLCB5b3UgbXVzdCBtYWtlIHlvdXIgb3duXG4gKiBjb3B5LlxuICovXG5NYXBwaW5nTGlzdC5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIE1hcHBpbmdMaXN0X3RvQXJyYXkoKSB7XG4gIGlmICghdGhpcy5fc29ydGVkKSB7XG4gICAgdGhpcy5fYXJyYXkuc29ydCh1dGlsLmNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkKTtcbiAgICB0aGlzLl9zb3J0ZWQgPSB0cnVlO1xuICB9XG4gIHJldHVybiB0aGlzLl9hcnJheTtcbn07XG5cbmV4cG9ydHMuTWFwcGluZ0xpc3QgPSBNYXBwaW5nTGlzdDtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuLy8gSXQgdHVybnMgb3V0IHRoYXQgc29tZSAobW9zdD8pIEphdmFTY3JpcHQgZW5naW5lcyBkb24ndCBzZWxmLWhvc3Rcbi8vIGBBcnJheS5wcm90b3R5cGUuc29ydGAuIFRoaXMgbWFrZXMgc2Vuc2UgYmVjYXVzZSBDKysgd2lsbCBsaWtlbHkgcmVtYWluXG4vLyBmYXN0ZXIgdGhhbiBKUyB3aGVuIGRvaW5nIHJhdyBDUFUtaW50ZW5zaXZlIHNvcnRpbmcuIEhvd2V2ZXIsIHdoZW4gdXNpbmcgYVxuLy8gY3VzdG9tIGNvbXBhcmF0b3IgZnVuY3Rpb24sIGNhbGxpbmcgYmFjayBhbmQgZm9ydGggYmV0d2VlbiB0aGUgVk0ncyBDKysgYW5kXG4vLyBKSVQnZCBKUyBpcyByYXRoZXIgc2xvdyAqYW5kKiBsb3NlcyBKSVQgdHlwZSBpbmZvcm1hdGlvbiwgcmVzdWx0aW5nIGluXG4vLyB3b3JzZSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIGNvbXBhcmF0b3IgZnVuY3Rpb24gdGhhbiB3b3VsZCBiZSBvcHRpbWFsLiBJblxuLy8gZmFjdCwgd2hlbiBzb3J0aW5nIHdpdGggYSBjb21wYXJhdG9yLCB0aGVzZSBjb3N0cyBvdXR3ZWlnaCB0aGUgYmVuZWZpdHMgb2Zcbi8vIHNvcnRpbmcgaW4gQysrLiBCeSB1c2luZyBvdXIgb3duIEpTLWltcGxlbWVudGVkIFF1aWNrIFNvcnQgKGJlbG93KSwgd2UgZ2V0XG4vLyBhIH4zNTAwbXMgbWVhbiBzcGVlZC11cCBpbiBgYmVuY2gvYmVuY2guaHRtbGAuXG5cbi8qKlxuICogU3dhcCB0aGUgZWxlbWVudHMgaW5kZXhlZCBieSBgeGAgYW5kIGB5YCBpbiB0aGUgYXJyYXkgYGFyeWAuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJ5XG4gKiAgICAgICAgVGhlIGFycmF5LlxuICogQHBhcmFtIHtOdW1iZXJ9IHhcbiAqICAgICAgICBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGl0ZW0uXG4gKiBAcGFyYW0ge051bWJlcn0geVxuICogICAgICAgIFRoZSBpbmRleCBvZiB0aGUgc2Vjb25kIGl0ZW0uXG4gKi9cbmZ1bmN0aW9uIHN3YXAoYXJ5LCB4LCB5KSB7XG4gIHZhciB0ZW1wID0gYXJ5W3hdO1xuICBhcnlbeF0gPSBhcnlbeV07XG4gIGFyeVt5XSA9IHRlbXA7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIHdpdGhpbiB0aGUgcmFuZ2UgYGxvdyAuLiBoaWdoYCBpbmNsdXNpdmUuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGxvd1xuICogICAgICAgIFRoZSBsb3dlciBib3VuZCBvbiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge051bWJlcn0gaGlnaFxuICogICAgICAgIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgcmFuZ2UuXG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUludEluUmFuZ2UobG93LCBoaWdoKSB7XG4gIHJldHVybiBNYXRoLnJvdW5kKGxvdyArIChNYXRoLnJhbmRvbSgpICogKGhpZ2ggLSBsb3cpKSk7XG59XG5cbi8qKlxuICogVGhlIFF1aWNrIFNvcnQgYWxnb3JpdGhtLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFyeVxuICogICAgICAgIEFuIGFycmF5IHRvIHNvcnQuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjb21wYXJhdG9yXG4gKiAgICAgICAgRnVuY3Rpb24gdG8gdXNlIHRvIGNvbXBhcmUgdHdvIGl0ZW1zLlxuICogQHBhcmFtIHtOdW1iZXJ9IHBcbiAqICAgICAgICBTdGFydCBpbmRleCBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSByXG4gKiAgICAgICAgRW5kIGluZGV4IG9mIHRoZSBhcnJheVxuICovXG5mdW5jdGlvbiBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIHAsIHIpIHtcbiAgLy8gSWYgb3VyIGxvd2VyIGJvdW5kIGlzIGxlc3MgdGhhbiBvdXIgdXBwZXIgYm91bmQsIHdlICgxKSBwYXJ0aXRpb24gdGhlXG4gIC8vIGFycmF5IGludG8gdHdvIHBpZWNlcyBhbmQgKDIpIHJlY3Vyc2Ugb24gZWFjaCBoYWxmLiBJZiBpdCBpcyBub3QsIHRoaXMgaXNcbiAgLy8gdGhlIGVtcHR5IGFycmF5IGFuZCBvdXIgYmFzZSBjYXNlLlxuXG4gIGlmIChwIDwgcikge1xuICAgIC8vICgxKSBQYXJ0aXRpb25pbmcuXG4gICAgLy9cbiAgICAvLyBUaGUgcGFydGl0aW9uaW5nIGNob29zZXMgYSBwaXZvdCBiZXR3ZWVuIGBwYCBhbmQgYHJgIGFuZCBtb3ZlcyBhbGxcbiAgICAvLyBlbGVtZW50cyB0aGF0IGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBpdm90IHRvIHRoZSBiZWZvcmUgaXQsIGFuZFxuICAgIC8vIGFsbCB0aGUgZWxlbWVudHMgdGhhdCBhcmUgZ3JlYXRlciB0aGFuIGl0IGFmdGVyIGl0LiBUaGUgZWZmZWN0IGlzIHRoYXRcbiAgICAvLyBvbmNlIHBhcnRpdGlvbiBpcyBkb25lLCB0aGUgcGl2b3QgaXMgaW4gdGhlIGV4YWN0IHBsYWNlIGl0IHdpbGwgYmUgd2hlblxuICAgIC8vIHRoZSBhcnJheSBpcyBwdXQgaW4gc29ydGVkIG9yZGVyLCBhbmQgaXQgd2lsbCBub3QgbmVlZCB0byBiZSBtb3ZlZFxuICAgIC8vIGFnYWluLiBUaGlzIHJ1bnMgaW4gTyhuKSB0aW1lLlxuXG4gICAgLy8gQWx3YXlzIGNob29zZSBhIHJhbmRvbSBwaXZvdCBzbyB0aGF0IGFuIGlucHV0IGFycmF5IHdoaWNoIGlzIHJldmVyc2VcbiAgICAvLyBzb3J0ZWQgZG9lcyBub3QgY2F1c2UgTyhuXjIpIHJ1bm5pbmcgdGltZS5cbiAgICB2YXIgcGl2b3RJbmRleCA9IHJhbmRvbUludEluUmFuZ2UocCwgcik7XG4gICAgdmFyIGkgPSBwIC0gMTtcblxuICAgIHN3YXAoYXJ5LCBwaXZvdEluZGV4LCByKTtcbiAgICB2YXIgcGl2b3QgPSBhcnlbcl07XG5cbiAgICAvLyBJbW1lZGlhdGVseSBhZnRlciBgamAgaXMgaW5jcmVtZW50ZWQgaW4gdGhpcyBsb29wLCB0aGUgZm9sbG93aW5nIGhvbGRcbiAgICAvLyB0cnVlOlxuICAgIC8vXG4gICAgLy8gICAqIEV2ZXJ5IGVsZW1lbnQgaW4gYGFyeVtwIC4uIGldYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHBpdm90LlxuICAgIC8vXG4gICAgLy8gICAqIEV2ZXJ5IGVsZW1lbnQgaW4gYGFyeVtpKzEgLi4gai0xXWAgaXMgZ3JlYXRlciB0aGFuIHRoZSBwaXZvdC5cbiAgICBmb3IgKHZhciBqID0gcDsgaiA8IHI7IGorKykge1xuICAgICAgaWYgKGNvbXBhcmF0b3IoYXJ5W2pdLCBwaXZvdCkgPD0gMCkge1xuICAgICAgICBpICs9IDE7XG4gICAgICAgIHN3YXAoYXJ5LCBpLCBqKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzd2FwKGFyeSwgaSArIDEsIGopO1xuICAgIHZhciBxID0gaSArIDE7XG5cbiAgICAvLyAoMikgUmVjdXJzZSBvbiBlYWNoIGhhbGYuXG5cbiAgICBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIHAsIHEgLSAxKTtcbiAgICBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIHEgKyAxLCByKTtcbiAgfVxufVxuXG4vKipcbiAqIFNvcnQgdGhlIGdpdmVuIGFycmF5IGluLXBsYWNlIHdpdGggdGhlIGdpdmVuIGNvbXBhcmF0b3IgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJ5XG4gKiAgICAgICAgQW4gYXJyYXkgdG8gc29ydC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNvbXBhcmF0b3JcbiAqICAgICAgICBGdW5jdGlvbiB0byB1c2UgdG8gY29tcGFyZSB0d28gaXRlbXMuXG4gKi9cbmV4cG9ydHMucXVpY2tTb3J0ID0gZnVuY3Rpb24gKGFyeSwgY29tcGFyYXRvcikge1xuICBkb1F1aWNrU29ydChhcnksIGNvbXBhcmF0b3IsIDAsIGFyeS5sZW5ndGggLSAxKTtcbn07XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG52YXIgYmluYXJ5U2VhcmNoID0gcmVxdWlyZSgnLi9iaW5hcnktc2VhcmNoJyk7XG52YXIgQXJyYXlTZXQgPSByZXF1aXJlKCcuL2FycmF5LXNldCcpLkFycmF5U2V0O1xudmFyIGJhc2U2NFZMUSA9IHJlcXVpcmUoJy4vYmFzZTY0LXZscScpO1xudmFyIHF1aWNrU29ydCA9IHJlcXVpcmUoJy4vcXVpY2stc29ydCcpLnF1aWNrU29ydDtcblxuZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHJldHVybiBzb3VyY2VNYXAuc2VjdGlvbnMgIT0gbnVsbFxuICAgID8gbmV3IEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcihzb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpXG4gICAgOiBuZXcgQmFzaWNTb3VyY2VNYXBDb25zdW1lcihzb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpO1xufVxuXG5Tb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwID0gZnVuY3Rpb24oYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICByZXR1cm4gQmFzaWNTb3VyY2VNYXBDb25zdW1lci5mcm9tU291cmNlTWFwKGFTb3VyY2VNYXAsIGFTb3VyY2VNYXBVUkwpO1xufVxuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzb3VyY2UgbWFwcGluZyBzcGVjIHRoYXQgd2UgYXJlIGNvbnN1bWluZy5cbiAqL1xuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl92ZXJzaW9uID0gMztcblxuLy8gYF9fZ2VuZXJhdGVkTWFwcGluZ3NgIGFuZCBgX19vcmlnaW5hbE1hcHBpbmdzYCBhcmUgYXJyYXlzIHRoYXQgaG9sZCB0aGVcbi8vIHBhcnNlZCBtYXBwaW5nIGNvb3JkaW5hdGVzIGZyb20gdGhlIHNvdXJjZSBtYXAncyBcIm1hcHBpbmdzXCIgYXR0cmlidXRlLiBUaGV5XG4vLyBhcmUgbGF6aWx5IGluc3RhbnRpYXRlZCwgYWNjZXNzZWQgdmlhIHRoZSBgX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbi8vIGBfb3JpZ2luYWxNYXBwaW5nc2AgZ2V0dGVycyByZXNwZWN0aXZlbHksIGFuZCB3ZSBvbmx5IHBhcnNlIHRoZSBtYXBwaW5nc1xuLy8gYW5kIGNyZWF0ZSB0aGVzZSBhcnJheXMgb25jZSBxdWVyaWVkIGZvciBhIHNvdXJjZSBsb2NhdGlvbi4gV2UganVtcCB0aHJvdWdoXG4vLyB0aGVzZSBob29wcyBiZWNhdXNlIHRoZXJlIGNhbiBiZSBtYW55IHRob3VzYW5kcyBvZiBtYXBwaW5ncywgYW5kIHBhcnNpbmdcbi8vIHRoZW0gaXMgZXhwZW5zaXZlLCBzbyB3ZSBvbmx5IHdhbnQgdG8gZG8gaXQgaWYgd2UgbXVzdC5cbi8vXG4vLyBFYWNoIG9iamVjdCBpbiB0aGUgYXJyYXlzIGlzIG9mIHRoZSBmb3JtOlxuLy9cbi8vICAgICB7XG4vLyAgICAgICBnZW5lcmF0ZWRMaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUsXG4vLyAgICAgICBzb3VyY2U6IFRoZSBwYXRoIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSB0aGF0IGdlbmVyYXRlZCB0aGlzXG4vLyAgICAgICAgICAgICAgIGNodW5rIG9mIGNvZGUsXG4vLyAgICAgICBvcmlnaW5hbExpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoYXRcbi8vICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gdGhpcyBjaHVuayBvZiBnZW5lcmF0ZWQgY29kZSxcbi8vICAgICAgIG9yaWdpbmFsQ29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlIHRoYXRcbi8vICAgICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB0aGlzIGNodW5rIG9mIGdlbmVyYXRlZCBjb2RlLFxuLy8gICAgICAgbmFtZTogVGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIHN5bWJvbCB3aGljaCBnZW5lcmF0ZWQgdGhpcyBjaHVuayBvZlxuLy8gICAgICAgICAgICAgY29kZS5cbi8vICAgICB9XG4vL1xuLy8gQWxsIHByb3BlcnRpZXMgZXhjZXB0IGZvciBgZ2VuZXJhdGVkTGluZWAgYW5kIGBnZW5lcmF0ZWRDb2x1bW5gIGNhbiBiZVxuLy8gYG51bGxgLlxuLy9cbi8vIGBfZ2VuZXJhdGVkTWFwcGluZ3NgIGlzIG9yZGVyZWQgYnkgdGhlIGdlbmVyYXRlZCBwb3NpdGlvbnMuXG4vL1xuLy8gYF9vcmlnaW5hbE1hcHBpbmdzYCBpcyBvcmRlcmVkIGJ5IHRoZSBvcmlnaW5hbCBwb3NpdGlvbnMuXG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX2dlbmVyYXRlZE1hcHBpbmdzID0gbnVsbDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdfZ2VuZXJhdGVkTWFwcGluZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MpIHtcbiAgICAgIHRoaXMuX3BhcnNlTWFwcGluZ3ModGhpcy5fbWFwcGluZ3MsIHRoaXMuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncztcbiAgfVxufSk7XG5cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fX29yaWdpbmFsTWFwcGluZ3MgPSBudWxsO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ19vcmlnaW5hbE1hcHBpbmdzJywge1xuICBjb25maWd1cmFibGU6IHRydWUsXG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MpIHtcbiAgICAgIHRoaXMuX3BhcnNlTWFwcGluZ3ModGhpcy5fbWFwcGluZ3MsIHRoaXMuc291cmNlUm9vdCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzO1xuICB9XG59KTtcblxuU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9jaGFySXNNYXBwaW5nU2VwYXJhdG9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfY2hhcklzTWFwcGluZ1NlcGFyYXRvcihhU3RyLCBpbmRleCkge1xuICAgIHZhciBjID0gYVN0ci5jaGFyQXQoaW5kZXgpO1xuICAgIHJldHVybiBjID09PSBcIjtcIiB8fCBjID09PSBcIixcIjtcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSB0aGUgbWFwcGluZ3MgaW4gYSBzdHJpbmcgaW4gdG8gYSBkYXRhIHN0cnVjdHVyZSB3aGljaCB3ZSBjYW4gZWFzaWx5XG4gKiBxdWVyeSAodGhlIG9yZGVyZWQgYXJyYXlzIGluIHRoZSBgdGhpcy5fX2dlbmVyYXRlZE1hcHBpbmdzYCBhbmRcbiAqIGB0aGlzLl9fb3JpZ2luYWxNYXBwaW5nc2AgcHJvcGVydGllcykuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3BhcnNlTWFwcGluZ3MoYVN0ciwgYVNvdXJjZVJvb3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IF9wYXJzZU1hcHBpbmdzXCIpO1xuICB9O1xuXG5Tb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVIgPSAxO1xuU291cmNlTWFwQ29uc3VtZXIuT1JJR0lOQUxfT1JERVIgPSAyO1xuXG5Tb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCA9IDE7XG5Tb3VyY2VNYXBDb25zdW1lci5MRUFTVF9VUFBFUl9CT1VORCA9IDI7XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGVhY2ggbWFwcGluZyBiZXR3ZWVuIGFuIG9yaWdpbmFsIHNvdXJjZS9saW5lL2NvbHVtbiBhbmQgYVxuICogZ2VuZXJhdGVkIGxpbmUvY29sdW1uIGluIHRoaXMgc291cmNlIG1hcC5cbiAqXG4gKiBAcGFyYW0gRnVuY3Rpb24gYUNhbGxiYWNrXG4gKiAgICAgICAgVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIHdpdGggZWFjaCBtYXBwaW5nLlxuICogQHBhcmFtIE9iamVjdCBhQ29udGV4dFxuICogICAgICAgIE9wdGlvbmFsLiBJZiBzcGVjaWZpZWQsIHRoaXMgb2JqZWN0IHdpbGwgYmUgdGhlIHZhbHVlIG9mIGB0aGlzYCBldmVyeVxuICogICAgICAgIHRpbWUgdGhhdCBgYUNhbGxiYWNrYCBpcyBjYWxsZWQuXG4gKiBAcGFyYW0gYU9yZGVyXG4gKiAgICAgICAgRWl0aGVyIGBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVJgIG9yXG4gKiAgICAgICAgYFNvdXJjZU1hcENvbnN1bWVyLk9SSUdJTkFMX09SREVSYC4gU3BlY2lmaWVzIHdoZXRoZXIgeW91IHdhbnQgdG9cbiAqICAgICAgICBpdGVyYXRlIG92ZXIgdGhlIG1hcHBpbmdzIHNvcnRlZCBieSB0aGUgZ2VuZXJhdGVkIGZpbGUncyBsaW5lL2NvbHVtblxuICogICAgICAgIG9yZGVyIG9yIHRoZSBvcmlnaW5hbCdzIHNvdXJjZS9saW5lL2NvbHVtbiBvcmRlciwgcmVzcGVjdGl2ZWx5LiBEZWZhdWx0cyB0b1xuICogICAgICAgIGBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVJgLlxuICovXG5Tb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuZWFjaE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9lYWNoTWFwcGluZyhhQ2FsbGJhY2ssIGFDb250ZXh0LCBhT3JkZXIpIHtcbiAgICB2YXIgY29udGV4dCA9IGFDb250ZXh0IHx8IG51bGw7XG4gICAgdmFyIG9yZGVyID0gYU9yZGVyIHx8IFNvdXJjZU1hcENvbnN1bWVyLkdFTkVSQVRFRF9PUkRFUjtcblxuICAgIHZhciBtYXBwaW5ncztcbiAgICBzd2l0Y2ggKG9yZGVyKSB7XG4gICAgY2FzZSBTb3VyY2VNYXBDb25zdW1lci5HRU5FUkFURURfT1JERVI6XG4gICAgICBtYXBwaW5ncyA9IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBTb3VyY2VNYXBDb25zdW1lci5PUklHSU5BTF9PUkRFUjpcbiAgICAgIG1hcHBpbmdzID0gdGhpcy5fb3JpZ2luYWxNYXBwaW5ncztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG9yZGVyIG9mIGl0ZXJhdGlvbi5cIik7XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZVJvb3QgPSB0aGlzLnNvdXJjZVJvb3Q7XG4gICAgbWFwcGluZ3MubWFwKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICB2YXIgc291cmNlID0gbWFwcGluZy5zb3VyY2UgPT09IG51bGwgPyBudWxsIDogdGhpcy5fc291cmNlcy5hdChtYXBwaW5nLnNvdXJjZSk7XG4gICAgICBzb3VyY2UgPSB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgc291cmNlLCB0aGlzLl9zb3VyY2VNYXBVUkwpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgIGdlbmVyYXRlZExpbmU6IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSxcbiAgICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbixcbiAgICAgICAgb3JpZ2luYWxMaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgb3JpZ2luYWxDb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgIG5hbWU6IG1hcHBpbmcubmFtZSA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl9uYW1lcy5hdChtYXBwaW5nLm5hbWUpXG4gICAgICB9O1xuICAgIH0sIHRoaXMpLmZvckVhY2goYUNhbGxiYWNrLCBjb250ZXh0KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBnZW5lcmF0ZWQgbGluZSBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgb3JpZ2luYWwgc291cmNlLFxuICogbGluZSwgYW5kIGNvbHVtbiBwcm92aWRlZC4gSWYgbm8gY29sdW1uIGlzIHByb3ZpZGVkLCByZXR1cm5zIGFsbCBtYXBwaW5nc1xuICogY29ycmVzcG9uZGluZyB0byBhIGVpdGhlciB0aGUgbGluZSB3ZSBhcmUgc2VhcmNoaW5nIGZvciBvciB0aGUgbmV4dFxuICogY2xvc2VzdCBsaW5lIHRoYXQgaGFzIGFueSBtYXBwaW5ncy4gT3RoZXJ3aXNlLCByZXR1cm5zIGFsbCBtYXBwaW5nc1xuICogY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbGluZSBhbmQgZWl0aGVyIHRoZSBjb2x1bW4gd2UgYXJlIHNlYXJjaGluZyBmb3JcbiAqIG9yIHRoZSBuZXh0IGNsb3Nlc3QgY29sdW1uIHRoYXQgaGFzIGFueSBvZmZzZXRzLlxuICpcbiAqIFRoZSBvbmx5IGFyZ3VtZW50IGlzIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgZmlsZW5hbWUgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZS4gIFRoZSBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogT3B0aW9uYWwuIHRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuXG4gKiAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBhcnJheSBvZiBvYmplY3RzIGlzIHJldHVybmVkLCBlYWNoIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgIGxpbmUgbnVtYmVyIGlzIDEtYmFzZWQuXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKi9cblNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBDb25zdW1lcl9hbGxHZW5lcmF0ZWRQb3NpdGlvbnNGb3IoYUFyZ3MpIHtcbiAgICB2YXIgbGluZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpO1xuXG4gICAgLy8gV2hlbiB0aGVyZSBpcyBubyBleGFjdCBtYXRjaCwgQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRNYXBwaW5nXG4gICAgLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGNsb3Nlc3QgbWFwcGluZyBsZXNzIHRoYW4gdGhlIG5lZWRsZS4gQnlcbiAgICAvLyBzZXR0aW5nIG5lZWRsZS5vcmlnaW5hbENvbHVtbiB0byAwLCB3ZSB0aHVzIGZpbmQgdGhlIGxhc3QgbWFwcGluZyBmb3JcbiAgICAvLyB0aGUgZ2l2ZW4gbGluZSwgcHJvdmlkZWQgc3VjaCBhIG1hcHBpbmcgZXhpc3RzLlxuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBzb3VyY2U6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnc291cmNlJyksXG4gICAgICBvcmlnaW5hbExpbmU6IGxpbmUsXG4gICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nLCAwKVxuICAgIH07XG5cbiAgICBuZWVkbGUuc291cmNlID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KG5lZWRsZS5zb3VyY2UpO1xuICAgIGlmIChuZWVkbGUuc291cmNlIDwgMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciBtYXBwaW5ncyA9IFtdO1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcobmVlZGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcmlnaW5hbExpbmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm9yaWdpbmFsQ29sdW1uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnlTZWFyY2guTEVBU1RfVVBQRVJfQk9VTkQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB2YXIgbWFwcGluZyA9IHRoaXMuX29yaWdpbmFsTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAoYUFyZ3MuY29sdW1uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFyIG9yaWdpbmFsTGluZSA9IG1hcHBpbmcub3JpZ2luYWxMaW5lO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2UgZm91bmQuIFNpbmNlXG4gICAgICAgIC8vIG1hcHBpbmdzIGFyZSBzb3J0ZWQsIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBmaW5kIGFsbCBtYXBwaW5ncyBmb3JcbiAgICAgICAgLy8gdGhlIGxpbmUgd2UgZm91bmQuXG4gICAgICAgIHdoaWxlIChtYXBwaW5nICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lID09PSBvcmlnaW5hbExpbmUpIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgb3JpZ2luYWxDb2x1bW4gPSBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdW50aWwgZWl0aGVyIHdlIHJ1biBvdXQgb2YgbWFwcGluZ3MsIG9yIHdlIHJ1biBpbnRvXG4gICAgICAgIC8vIGEgbWFwcGluZyBmb3IgYSBkaWZmZXJlbnQgbGluZSB0aGFuIHRoZSBvbmUgd2Ugd2VyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICAvLyBTaW5jZSBtYXBwaW5ncyBhcmUgc29ydGVkLCB0aGlzIGlzIGd1YXJhbnRlZWQgdG8gZmluZCBhbGwgbWFwcGluZ3MgZm9yXG4gICAgICAgIC8vIHRoZSBsaW5lIHdlIGFyZSBzZWFyY2hpbmcgZm9yLlxuICAgICAgICB3aGlsZSAobWFwcGluZyAmJlxuICAgICAgICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPT09IGxpbmUgJiZcbiAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPT0gb3JpZ2luYWxDb2x1bW4pIHtcbiAgICAgICAgICBtYXBwaW5ncy5wdXNoKHtcbiAgICAgICAgICAgIGxpbmU6IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRMaW5lJywgbnVsbCksXG4gICAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICAgIGxhc3RDb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdsYXN0R2VuZXJhdGVkQ29sdW1uJywgbnVsbClcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzWysraW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hcHBpbmdzO1xuICB9O1xuXG5leHBvcnRzLlNvdXJjZU1hcENvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogQSBCYXNpY1NvdXJjZU1hcENvbnN1bWVyIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwYXJzZWQgc291cmNlIG1hcCB3aGljaCB3ZSBjYW5cbiAqIHF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgZmlsZSBwb3NpdGlvbnMgYnkgZ2l2aW5nIGl0IGEgZmlsZVxuICogcG9zaXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuXG4gKlxuICogVGhlIGZpcnN0IHBhcmFtZXRlciBpcyB0aGUgcmF3IHNvdXJjZSBtYXAgKGVpdGhlciBhcyBhIEpTT04gc3RyaW5nLCBvclxuICogYWxyZWFkeSBwYXJzZWQgdG8gYW4gb2JqZWN0KS4gQWNjb3JkaW5nIHRvIHRoZSBzcGVjLCBzb3VyY2UgbWFwcyBoYXZlIHRoZVxuICogZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKlxuICogICAtIHZlcnNpb246IFdoaWNoIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXAgc3BlYyB0aGlzIG1hcCBpcyBmb2xsb3dpbmcuXG4gKiAgIC0gc291cmNlczogQW4gYXJyYXkgb2YgVVJMcyB0byB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLlxuICogICAtIG5hbWVzOiBBbiBhcnJheSBvZiBpZGVudGlmaWVycyB3aGljaCBjYW4gYmUgcmVmZXJyZW5jZWQgYnkgaW5kaXZpZHVhbCBtYXBwaW5ncy5cbiAqICAgLSBzb3VyY2VSb290OiBPcHRpb25hbC4gVGhlIFVSTCByb290IGZyb20gd2hpY2ggYWxsIHNvdXJjZXMgYXJlIHJlbGF0aXZlLlxuICogICAtIHNvdXJjZXNDb250ZW50OiBPcHRpb25hbC4gQW4gYXJyYXkgb2YgY29udGVudHMgb2YgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy5cbiAqICAgLSBtYXBwaW5nczogQSBzdHJpbmcgb2YgYmFzZTY0IFZMUXMgd2hpY2ggY29udGFpbiB0aGUgYWN0dWFsIG1hcHBpbmdzLlxuICogICAtIGZpbGU6IE9wdGlvbmFsLiBUaGUgZ2VuZXJhdGVkIGZpbGUgdGhpcyBzb3VyY2UgbWFwIGlzIGFzc29jaWF0ZWQgd2l0aC5cbiAqXG4gKiBIZXJlIGlzIGFuIGV4YW1wbGUgc291cmNlIG1hcCwgdGFrZW4gZnJvbSB0aGUgc291cmNlIG1hcCBzcGVjWzBdOlxuICpcbiAqICAgICB7XG4gKiAgICAgICB2ZXJzaW9uIDogMyxcbiAqICAgICAgIGZpbGU6IFwib3V0LmpzXCIsXG4gKiAgICAgICBzb3VyY2VSb290IDogXCJcIixcbiAqICAgICAgIHNvdXJjZXM6IFtcImZvby5qc1wiLCBcImJhci5qc1wiXSxcbiAqICAgICAgIG5hbWVzOiBbXCJzcmNcIiwgXCJtYXBzXCIsIFwiYXJlXCIsIFwiZnVuXCJdLFxuICogICAgICAgbWFwcGluZ3M6IFwiQUEsQUI7O0FCQ0RFO1wiXG4gKiAgICAgfVxuICpcbiAqIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCBpZiBnaXZlbiwgaXMgYSBzdHJpbmcgd2hvc2UgdmFsdWUgaXMgdGhlIFVSTFxuICogYXQgd2hpY2ggdGhlIHNvdXJjZSBtYXAgd2FzIGZvdW5kLiAgVGhpcyBVUkwgaXMgdXNlZCB0byBjb21wdXRlIHRoZVxuICogc291cmNlcyBhcnJheS5cbiAqXG4gKiBbMF06IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVUxUkdBZWhRd1J5cFVUb3ZGMUtSbHBpT0Z6ZTBiLV8yZ2M2ZkFIMEtZMGsvZWRpdD9wbGk9MSNcbiAqL1xuZnVuY3Rpb24gQmFzaWNTb3VyY2VNYXBDb25zdW1lcihhU291cmNlTWFwLCBhU291cmNlTWFwVVJMKSB7XG4gIHZhciBzb3VyY2VNYXAgPSBhU291cmNlTWFwO1xuICBpZiAodHlwZW9mIGFTb3VyY2VNYXAgPT09ICdzdHJpbmcnKSB7XG4gICAgc291cmNlTWFwID0gdXRpbC5wYXJzZVNvdXJjZU1hcElucHV0KGFTb3VyY2VNYXApO1xuICB9XG5cbiAgdmFyIHZlcnNpb24gPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICd2ZXJzaW9uJyk7XG4gIHZhciBzb3VyY2VzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlcycpO1xuICAvLyBTYXNzIDMuMyBsZWF2ZXMgb3V0IHRoZSAnbmFtZXMnIGFycmF5LCBzbyB3ZSBkZXZpYXRlIGZyb20gdGhlIHNwZWMgKHdoaWNoXG4gIC8vIHJlcXVpcmVzIHRoZSBhcnJheSkgdG8gcGxheSBuaWNlIGhlcmUuXG4gIHZhciBuYW1lcyA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ25hbWVzJywgW10pO1xuICB2YXIgc291cmNlUm9vdCA9IHV0aWwuZ2V0QXJnKHNvdXJjZU1hcCwgJ3NvdXJjZVJvb3QnLCBudWxsKTtcbiAgdmFyIHNvdXJjZXNDb250ZW50ID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnc291cmNlc0NvbnRlbnQnLCBudWxsKTtcbiAgdmFyIG1hcHBpbmdzID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAnbWFwcGluZ3MnKTtcbiAgdmFyIGZpbGUgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdmaWxlJywgbnVsbCk7XG5cbiAgLy8gT25jZSBhZ2FpbiwgU2FzcyBkZXZpYXRlcyBmcm9tIHRoZSBzcGVjIGFuZCBzdXBwbGllcyB0aGUgdmVyc2lvbiBhcyBhXG4gIC8vIHN0cmluZyByYXRoZXIgdGhhbiBhIG51bWJlciwgc28gd2UgdXNlIGxvb3NlIGVxdWFsaXR5IGNoZWNraW5nIGhlcmUuXG4gIGlmICh2ZXJzaW9uICE9IHRoaXMuX3ZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHZlcnNpb246ICcgKyB2ZXJzaW9uKTtcbiAgfVxuXG4gIGlmIChzb3VyY2VSb290KSB7XG4gICAgc291cmNlUm9vdCA9IHV0aWwubm9ybWFsaXplKHNvdXJjZVJvb3QpO1xuICB9XG5cbiAgc291cmNlcyA9IHNvdXJjZXNcbiAgICAubWFwKFN0cmluZylcbiAgICAvLyBTb21lIHNvdXJjZSBtYXBzIHByb2R1Y2UgcmVsYXRpdmUgc291cmNlIHBhdGhzIGxpa2UgXCIuL2Zvby5qc1wiIGluc3RlYWQgb2ZcbiAgICAvLyBcImZvby5qc1wiLiAgTm9ybWFsaXplIHRoZXNlIGZpcnN0IHNvIHRoYXQgZnV0dXJlIGNvbXBhcmlzb25zIHdpbGwgc3VjY2VlZC5cbiAgICAvLyBTZWUgYnVnemlsLmxhLzEwOTA3NjguXG4gICAgLm1hcCh1dGlsLm5vcm1hbGl6ZSlcbiAgICAvLyBBbHdheXMgZW5zdXJlIHRoYXQgYWJzb2x1dGUgc291cmNlcyBhcmUgaW50ZXJuYWxseSBzdG9yZWQgcmVsYXRpdmUgdG9cbiAgICAvLyB0aGUgc291cmNlIHJvb3QsIGlmIHRoZSBzb3VyY2Ugcm9vdCBpcyBhYnNvbHV0ZS4gTm90IGRvaW5nIHRoaXMgd291bGRcbiAgICAvLyBiZSBwYXJ0aWN1bGFybHkgcHJvYmxlbWF0aWMgd2hlbiB0aGUgc291cmNlIHJvb3QgaXMgYSBwcmVmaXggb2YgdGhlXG4gICAgLy8gc291cmNlICh2YWxpZCwgYnV0IHdoeT8/KS4gU2VlIGdpdGh1YiBpc3N1ZSAjMTk5IGFuZCBidWd6aWwubGEvMTE4ODk4Mi5cbiAgICAubWFwKGZ1bmN0aW9uIChzb3VyY2UpIHtcbiAgICAgIHJldHVybiBzb3VyY2VSb290ICYmIHV0aWwuaXNBYnNvbHV0ZShzb3VyY2VSb290KSAmJiB1dGlsLmlzQWJzb2x1dGUoc291cmNlKVxuICAgICAgICA/IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlKVxuICAgICAgICA6IHNvdXJjZTtcbiAgICB9KTtcblxuICAvLyBQYXNzIGB0cnVlYCBiZWxvdyB0byBhbGxvdyBkdXBsaWNhdGUgbmFtZXMgYW5kIHNvdXJjZXMuIFdoaWxlIHNvdXJjZSBtYXBzXG4gIC8vIGFyZSBpbnRlbmRlZCB0byBiZSBjb21wcmVzc2VkIGFuZCBkZWR1cGxpY2F0ZWQsIHRoZSBUeXBlU2NyaXB0IGNvbXBpbGVyXG4gIC8vIHNvbWV0aW1lcyBnZW5lcmF0ZXMgc291cmNlIG1hcHMgd2l0aCBkdXBsaWNhdGVzIGluIHRoZW0uIFNlZSBHaXRodWIgaXNzdWVcbiAgLy8gIzcyIGFuZCBidWd6aWwubGEvODg5NDkyLlxuICB0aGlzLl9uYW1lcyA9IEFycmF5U2V0LmZyb21BcnJheShuYW1lcy5tYXAoU3RyaW5nKSwgdHJ1ZSk7XG4gIHRoaXMuX3NvdXJjZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoc291cmNlcywgdHJ1ZSk7XG5cbiAgdGhpcy5fYWJzb2x1dGVTb3VyY2VzID0gdGhpcy5fc291cmNlcy50b0FycmF5KCkubWFwKGZ1bmN0aW9uIChzKSB7XG4gICAgcmV0dXJuIHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzb3VyY2VSb290LCBzLCBhU291cmNlTWFwVVJMKTtcbiAgfSk7XG5cbiAgdGhpcy5zb3VyY2VSb290ID0gc291cmNlUm9vdDtcbiAgdGhpcy5zb3VyY2VzQ29udGVudCA9IHNvdXJjZXNDb250ZW50O1xuICB0aGlzLl9tYXBwaW5ncyA9IG1hcHBpbmdzO1xuICB0aGlzLl9zb3VyY2VNYXBVUkwgPSBhU291cmNlTWFwVVJMO1xuICB0aGlzLmZpbGUgPSBmaWxlO1xufVxuXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbnN1bWVyID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiB0byBmaW5kIHRoZSBpbmRleCBvZiBhIHNvdXJjZS4gIFJldHVybnMgLTEgaWYgbm90XG4gKiBmb3VuZC5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuX2ZpbmRTb3VyY2VJbmRleCA9IGZ1bmN0aW9uKGFTb3VyY2UpIHtcbiAgdmFyIHJlbGF0aXZlU291cmNlID0gYVNvdXJjZTtcbiAgaWYgKHRoaXMuc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgcmVsYXRpdmVTb3VyY2UgPSB1dGlsLnJlbGF0aXZlKHRoaXMuc291cmNlUm9vdCwgcmVsYXRpdmVTb3VyY2UpO1xuICB9XG5cbiAgaWYgKHRoaXMuX3NvdXJjZXMuaGFzKHJlbGF0aXZlU291cmNlKSkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2VzLmluZGV4T2YocmVsYXRpdmVTb3VyY2UpO1xuICB9XG5cbiAgLy8gTWF5YmUgYVNvdXJjZSBpcyBhbiBhYnNvbHV0ZSBVUkwgYXMgcmV0dXJuZWQgYnkgfHNvdXJjZXN8LiAgSW5cbiAgLy8gdGhpcyBjYXNlIHdlIGNhbid0IHNpbXBseSB1bmRvIHRoZSB0cmFuc2Zvcm0uXG4gIHZhciBpO1xuICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5fYWJzb2x1dGVTb3VyY2VzLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHRoaXMuX2Fic29sdXRlU291cmNlc1tpXSA9PSBhU291cmNlKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTE7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIEJhc2ljU291cmNlTWFwQ29uc3VtZXIgZnJvbSBhIFNvdXJjZU1hcEdlbmVyYXRvci5cbiAqXG4gKiBAcGFyYW0gU291cmNlTWFwR2VuZXJhdG9yIGFTb3VyY2VNYXBcbiAqICAgICAgICBUaGUgc291cmNlIG1hcCB0aGF0IHdpbGwgYmUgY29uc3VtZWQuXG4gKiBAcGFyYW0gU3RyaW5nIGFTb3VyY2VNYXBVUkxcbiAqICAgICAgICBUaGUgVVJMIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIGNhbiBiZSBmb3VuZCAob3B0aW9uYWwpXG4gKiBAcmV0dXJucyBCYXNpY1NvdXJjZU1hcENvbnN1bWVyXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIuZnJvbVNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2Zyb21Tb3VyY2VNYXAoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICAgIHZhciBzbWMgPSBPYmplY3QuY3JlYXRlKEJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlKTtcblxuICAgIHZhciBuYW1lcyA9IHNtYy5fbmFtZXMgPSBBcnJheVNldC5mcm9tQXJyYXkoYVNvdXJjZU1hcC5fbmFtZXMudG9BcnJheSgpLCB0cnVlKTtcbiAgICB2YXIgc291cmNlcyA9IHNtYy5fc291cmNlcyA9IEFycmF5U2V0LmZyb21BcnJheShhU291cmNlTWFwLl9zb3VyY2VzLnRvQXJyYXkoKSwgdHJ1ZSk7XG4gICAgc21jLnNvdXJjZVJvb3QgPSBhU291cmNlTWFwLl9zb3VyY2VSb290O1xuICAgIHNtYy5zb3VyY2VzQ29udGVudCA9IGFTb3VyY2VNYXAuX2dlbmVyYXRlU291cmNlc0NvbnRlbnQoc21jLl9zb3VyY2VzLnRvQXJyYXkoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYy5zb3VyY2VSb290KTtcbiAgICBzbWMuZmlsZSA9IGFTb3VyY2VNYXAuX2ZpbGU7XG4gICAgc21jLl9zb3VyY2VNYXBVUkwgPSBhU291cmNlTWFwVVJMO1xuICAgIHNtYy5fYWJzb2x1dGVTb3VyY2VzID0gc21jLl9zb3VyY2VzLnRvQXJyYXkoKS5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgIHJldHVybiB1dGlsLmNvbXB1dGVTb3VyY2VVUkwoc21jLnNvdXJjZVJvb3QsIHMsIGFTb3VyY2VNYXBVUkwpO1xuICAgIH0pO1xuXG4gICAgLy8gQmVjYXVzZSB3ZSBhcmUgbW9kaWZ5aW5nIHRoZSBlbnRyaWVzIChieSBjb252ZXJ0aW5nIHN0cmluZyBzb3VyY2VzIGFuZFxuICAgIC8vIG5hbWVzIHRvIGluZGljZXMgaW50byB0aGUgc291cmNlcyBhbmQgbmFtZXMgQXJyYXlTZXRzKSwgd2UgaGF2ZSB0byBtYWtlXG4gICAgLy8gYSBjb3B5IG9mIHRoZSBlbnRyeSBvciBlbHNlIGJhZCB0aGluZ3MgaGFwcGVuLiBTaGFyZWQgbXV0YWJsZSBzdGF0ZVxuICAgIC8vIHN0cmlrZXMgYWdhaW4hIFNlZSBnaXRodWIgaXNzdWUgIzE5MS5cblxuICAgIHZhciBnZW5lcmF0ZWRNYXBwaW5ncyA9IGFTb3VyY2VNYXAuX21hcHBpbmdzLnRvQXJyYXkoKS5zbGljZSgpO1xuICAgIHZhciBkZXN0R2VuZXJhdGVkTWFwcGluZ3MgPSBzbWMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IFtdO1xuICAgIHZhciBkZXN0T3JpZ2luYWxNYXBwaW5ncyA9IHNtYy5fX29yaWdpbmFsTWFwcGluZ3MgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNyY01hcHBpbmcgPSBnZW5lcmF0ZWRNYXBwaW5nc1tpXTtcbiAgICAgIHZhciBkZXN0TWFwcGluZyA9IG5ldyBNYXBwaW5nO1xuICAgICAgZGVzdE1hcHBpbmcuZ2VuZXJhdGVkTGluZSA9IHNyY01hcHBpbmcuZ2VuZXJhdGVkTGluZTtcbiAgICAgIGRlc3RNYXBwaW5nLmdlbmVyYXRlZENvbHVtbiA9IHNyY01hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICBpZiAoc3JjTWFwcGluZy5zb3VyY2UpIHtcbiAgICAgICAgZGVzdE1hcHBpbmcuc291cmNlID0gc291cmNlcy5pbmRleE9mKHNyY01hcHBpbmcuc291cmNlKTtcbiAgICAgICAgZGVzdE1hcHBpbmcub3JpZ2luYWxMaW5lID0gc3JjTWFwcGluZy5vcmlnaW5hbExpbmU7XG4gICAgICAgIGRlc3RNYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gc3JjTWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICBpZiAoc3JjTWFwcGluZy5uYW1lKSB7XG4gICAgICAgICAgZGVzdE1hcHBpbmcubmFtZSA9IG5hbWVzLmluZGV4T2Yoc3JjTWFwcGluZy5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlc3RPcmlnaW5hbE1hcHBpbmdzLnB1c2goZGVzdE1hcHBpbmcpO1xuICAgICAgfVxuXG4gICAgICBkZXN0R2VuZXJhdGVkTWFwcGluZ3MucHVzaChkZXN0TWFwcGluZyk7XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KHNtYy5fX29yaWdpbmFsTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNtYztcbiAgfTtcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcHBpbmcgc3BlYyB0aGF0IHdlIGFyZSBjb25zdW1pbmcuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl92ZXJzaW9uID0gMztcblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBvcmlnaW5hbCBzb3VyY2VzLlxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUsICdzb3VyY2VzJywge1xuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWJzb2x1dGVTb3VyY2VzLnNsaWNlKCk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIFByb3ZpZGUgdGhlIEpJVCB3aXRoIGEgbmljZSBzaGFwZSAvIGhpZGRlbiBjbGFzcy5cbiAqL1xuZnVuY3Rpb24gTWFwcGluZygpIHtcbiAgdGhpcy5nZW5lcmF0ZWRMaW5lID0gMDtcbiAgdGhpcy5nZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gIHRoaXMub3JpZ2luYWxMaW5lID0gbnVsbDtcbiAgdGhpcy5vcmlnaW5hbENvbHVtbiA9IG51bGw7XG4gIHRoaXMubmFtZSA9IG51bGw7XG59XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5CYXNpY1NvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZS5fcGFyc2VNYXBwaW5ncyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3BhcnNlTWFwcGluZ3MoYVN0ciwgYVNvdXJjZVJvb3QpIHtcbiAgICB2YXIgZ2VuZXJhdGVkTGluZSA9IDE7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNPcmlnaW5hbExpbmUgPSAwO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gMDtcbiAgICB2YXIgcHJldmlvdXNTb3VyY2UgPSAwO1xuICAgIHZhciBwcmV2aW91c05hbWUgPSAwO1xuICAgIHZhciBsZW5ndGggPSBhU3RyLmxlbmd0aDtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBjYWNoZWRTZWdtZW50cyA9IHt9O1xuICAgIHZhciB0ZW1wID0ge307XG4gICAgdmFyIG9yaWdpbmFsTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB2YXIgbWFwcGluZywgc3RyLCBzZWdtZW50LCBlbmQsIHZhbHVlO1xuXG4gICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7XG4gICAgICBpZiAoYVN0ci5jaGFyQXQoaW5kZXgpID09PSAnOycpIHtcbiAgICAgICAgZ2VuZXJhdGVkTGluZSsrO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChhU3RyLmNoYXJBdChpbmRleCkgPT09ICcsJykge1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIG1hcHBpbmcgPSBuZXcgTWFwcGluZygpO1xuICAgICAgICBtYXBwaW5nLmdlbmVyYXRlZExpbmUgPSBnZW5lcmF0ZWRMaW5lO1xuXG4gICAgICAgIC8vIEJlY2F1c2UgZWFjaCBvZmZzZXQgaXMgZW5jb2RlZCByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgb25lLFxuICAgICAgICAvLyBtYW55IHNlZ21lbnRzIG9mdGVuIGhhdmUgdGhlIHNhbWUgZW5jb2RpbmcuIFdlIGNhbiBleHBsb2l0IHRoaXNcbiAgICAgICAgLy8gZmFjdCBieSBjYWNoaW5nIHRoZSBwYXJzZWQgdmFyaWFibGUgbGVuZ3RoIGZpZWxkcyBvZiBlYWNoIHNlZ21lbnQsXG4gICAgICAgIC8vIGFsbG93aW5nIHVzIHRvIGF2b2lkIGEgc2Vjb25kIHBhcnNlIGlmIHdlIGVuY291bnRlciB0aGUgc2FtZVxuICAgICAgICAvLyBzZWdtZW50IGFnYWluLlxuICAgICAgICBmb3IgKGVuZCA9IGluZGV4OyBlbmQgPCBsZW5ndGg7IGVuZCsrKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2NoYXJJc01hcHBpbmdTZXBhcmF0b3IoYVN0ciwgZW5kKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHN0ciA9IGFTdHIuc2xpY2UoaW5kZXgsIGVuZCk7XG5cbiAgICAgICAgc2VnbWVudCA9IGNhY2hlZFNlZ21lbnRzW3N0cl07XG4gICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgaW5kZXggKz0gc3RyLmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZWdtZW50ID0gW107XG4gICAgICAgICAgd2hpbGUgKGluZGV4IDwgZW5kKSB7XG4gICAgICAgICAgICBiYXNlNjRWTFEuZGVjb2RlKGFTdHIsIGluZGV4LCB0ZW1wKTtcbiAgICAgICAgICAgIHZhbHVlID0gdGVtcC52YWx1ZTtcbiAgICAgICAgICAgIGluZGV4ID0gdGVtcC5yZXN0O1xuICAgICAgICAgICAgc2VnbWVudC5wdXNoKHZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgYSBzb3VyY2UsIGJ1dCBubyBsaW5lIGFuZCBjb2x1bW4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc2VnbWVudC5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm91bmQgYSBzb3VyY2UgYW5kIGxpbmUsIGJ1dCBubyBjb2x1bW4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWNoZWRTZWdtZW50c1tzdHJdID0gc2VnbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdlbmVyYXRlZCBjb2x1bW4uXG4gICAgICAgIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uID0gcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gKyBzZWdtZW50WzBdO1xuICAgICAgICBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuXG4gICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAvLyBPcmlnaW5hbCBzb3VyY2UuXG4gICAgICAgICAgbWFwcGluZy5zb3VyY2UgPSBwcmV2aW91c1NvdXJjZSArIHNlZ21lbnRbMV07XG4gICAgICAgICAgcHJldmlvdXNTb3VyY2UgKz0gc2VnbWVudFsxXTtcblxuICAgICAgICAgIC8vIE9yaWdpbmFsIGxpbmUuXG4gICAgICAgICAgbWFwcGluZy5vcmlnaW5hbExpbmUgPSBwcmV2aW91c09yaWdpbmFsTGluZSArIHNlZ21lbnRbMl07XG4gICAgICAgICAgcHJldmlvdXNPcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZTtcbiAgICAgICAgICAvLyBMaW5lcyBhcmUgc3RvcmVkIDAtYmFzZWRcbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsTGluZSArPSAxO1xuXG4gICAgICAgICAgLy8gT3JpZ2luYWwgY29sdW1uLlxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4gPSBwcmV2aW91c09yaWdpbmFsQ29sdW1uICsgc2VnbWVudFszXTtcbiAgICAgICAgICBwcmV2aW91c09yaWdpbmFsQ29sdW1uID0gbWFwcGluZy5vcmlnaW5hbENvbHVtbjtcblxuICAgICAgICAgIGlmIChzZWdtZW50Lmxlbmd0aCA+IDQpIHtcbiAgICAgICAgICAgIC8vIE9yaWdpbmFsIG5hbWUuXG4gICAgICAgICAgICBtYXBwaW5nLm5hbWUgPSBwcmV2aW91c05hbWUgKyBzZWdtZW50WzRdO1xuICAgICAgICAgICAgcHJldmlvdXNOYW1lICs9IHNlZ21lbnRbNF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZ2VuZXJhdGVkTWFwcGluZ3MucHVzaChtYXBwaW5nKTtcbiAgICAgICAgaWYgKHR5cGVvZiBtYXBwaW5nLm9yaWdpbmFsTGluZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICBvcmlnaW5hbE1hcHBpbmdzLnB1c2gobWFwcGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBxdWlja1NvcnQoZ2VuZXJhdGVkTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQpO1xuICAgIHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncyA9IGdlbmVyYXRlZE1hcHBpbmdzO1xuXG4gICAgcXVpY2tTb3J0KG9yaWdpbmFsTWFwcGluZ3MsIHV0aWwuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMpO1xuICAgIHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzID0gb3JpZ2luYWxNYXBwaW5ncztcbiAgfTtcblxuLyoqXG4gKiBGaW5kIHRoZSBtYXBwaW5nIHRoYXQgYmVzdCBtYXRjaGVzIHRoZSBoeXBvdGhldGljYWwgXCJuZWVkbGVcIiBtYXBwaW5nIHRoYXRcbiAqIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGluIHRoZSBnaXZlbiBcImhheXN0YWNrXCIgb2YgbWFwcGluZ3MuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9maW5kTWFwcGluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX2ZpbmRNYXBwaW5nKGFOZWVkbGUsIGFNYXBwaW5ncywgYUxpbmVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhQ29sdW1uTmFtZSwgYUNvbXBhcmF0b3IsIGFCaWFzKSB7XG4gICAgLy8gVG8gcmV0dXJuIHRoZSBwb3NpdGlvbiB3ZSBhcmUgc2VhcmNoaW5nIGZvciwgd2UgbXVzdCBmaXJzdCBmaW5kIHRoZVxuICAgIC8vIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBwb3NpdGlvbiBhbmQgdGhlbiByZXR1cm4gdGhlIG9wcG9zaXRlIHBvc2l0aW9uIGl0XG4gICAgLy8gcG9pbnRzIHRvLiBCZWNhdXNlIHRoZSBtYXBwaW5ncyBhcmUgc29ydGVkLCB3ZSBjYW4gdXNlIGJpbmFyeSBzZWFyY2ggdG9cbiAgICAvLyBmaW5kIHRoZSBiZXN0IG1hcHBpbmcuXG5cbiAgICBpZiAoYU5lZWRsZVthTGluZU5hbWVdIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0xpbmUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMSwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhTmVlZGxlW2FMaW5lTmFtZV0pO1xuICAgIH1cbiAgICBpZiAoYU5lZWRsZVthQ29sdW1uTmFtZV0gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb2x1bW4gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCwgZ290ICdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhTmVlZGxlW2FDb2x1bW5OYW1lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJpbmFyeVNlYXJjaC5zZWFyY2goYU5lZWRsZSwgYU1hcHBpbmdzLCBhQ29tcGFyYXRvciwgYUJpYXMpO1xuICB9O1xuXG4vKipcbiAqIENvbXB1dGUgdGhlIGxhc3QgY29sdW1uIGZvciBlYWNoIGdlbmVyYXRlZCBtYXBwaW5nLiBUaGUgbGFzdCBjb2x1bW4gaXNcbiAqIGluY2x1c2l2ZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuY29tcHV0ZUNvbHVtblNwYW5zID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfY29tcHV0ZUNvbHVtblNwYW5zKCkge1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICAvLyBNYXBwaW5ncyBkbyBub3QgY29udGFpbiBhIGZpZWxkIGZvciB0aGUgbGFzdCBnZW5lcmF0ZWQgY29sdW1udC4gV2VcbiAgICAgIC8vIGNhbiBjb21lIHVwIHdpdGggYW4gb3B0aW1pc3RpYyBlc3RpbWF0ZSwgaG93ZXZlciwgYnkgYXNzdW1pbmcgdGhhdFxuICAgICAgLy8gbWFwcGluZ3MgYXJlIGNvbnRpZ3VvdXMgKGkuZS4gZ2l2ZW4gdHdvIGNvbnNlY3V0aXZlIG1hcHBpbmdzLCB0aGVcbiAgICAgIC8vIGZpcnN0IG1hcHBpbmcgZW5kcyB3aGVyZSB0aGUgc2Vjb25kIG9uZSBzdGFydHMpLlxuICAgICAgaWYgKGluZGV4ICsgMSA8IHRoaXMuX2dlbmVyYXRlZE1hcHBpbmdzLmxlbmd0aCkge1xuICAgICAgICB2YXIgbmV4dE1hcHBpbmcgPSB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5nc1tpbmRleCArIDFdO1xuXG4gICAgICAgIGlmIChtYXBwaW5nLmdlbmVyYXRlZExpbmUgPT09IG5leHRNYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICBtYXBwaW5nLmxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBuZXh0TWFwcGluZy5nZW5lcmF0ZWRDb2x1bW4gLSAxO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBsYXN0IG1hcHBpbmcgZm9yIGVhY2ggbGluZSBzcGFucyB0aGUgZW50aXJlIGxpbmUuXG4gICAgICBtYXBwaW5nLmxhc3RHZW5lcmF0ZWRDb2x1bW4gPSBJbmZpbml0eTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgb3JpZ2luYWwgc291cmNlLCBsaW5lLCBhbmQgY29sdW1uIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkXG4gKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3RcbiAqIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBsaW5lOiBUaGUgbGluZSBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgbGluZSBudW1iZXJcbiAqICAgICBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuICBUaGUgY29sdW1uXG4gKiAgICAgbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gYmlhczogRWl0aGVyICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICogICAgIERlZmF1bHRzIHRvICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gc291cmNlOiBUaGUgb3JpZ2luYWwgc291cmNlIGZpbGUsIG9yIG51bGwuXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBsaW5lIG51bWJlciBpcyAxLWJhc2VkLlxuICogICAtIGNvbHVtbjogVGhlIGNvbHVtbiBudW1iZXIgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSwgb3IgbnVsbC4gIFRoZVxuICogICAgIGNvbHVtbiBudW1iZXIgaXMgMC1iYXNlZC5cbiAqICAgLSBuYW1lOiBUaGUgb3JpZ2luYWwgaWRlbnRpZmllciwgb3IgbnVsbC5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUub3JpZ2luYWxQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX29yaWdpbmFsUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgbmVlZGxlID0ge1xuICAgICAgZ2VuZXJhdGVkTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBnZW5lcmF0ZWRDb2x1bW46IHV0aWwuZ2V0QXJnKGFBcmdzLCAnY29sdW1uJylcbiAgICB9O1xuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZE1hcHBpbmcoXG4gICAgICBuZWVkbGUsXG4gICAgICB0aGlzLl9nZW5lcmF0ZWRNYXBwaW5ncyxcbiAgICAgIFwiZ2VuZXJhdGVkTGluZVwiLFxuICAgICAgXCJnZW5lcmF0ZWRDb2x1bW5cIixcbiAgICAgIHV0aWwuY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zRGVmbGF0ZWQsXG4gICAgICB1dGlsLmdldEFyZyhhQXJncywgJ2JpYXMnLCBTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORClcbiAgICApO1xuXG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHZhciBtYXBwaW5nID0gdGhpcy5fZ2VuZXJhdGVkTWFwcGluZ3NbaW5kZXhdO1xuXG4gICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lID09PSBuZWVkbGUuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICB2YXIgc291cmNlID0gdXRpbC5nZXRBcmcobWFwcGluZywgJ3NvdXJjZScsIG51bGwpO1xuICAgICAgICBpZiAoc291cmNlICE9PSBudWxsKSB7XG4gICAgICAgICAgc291cmNlID0gdGhpcy5fc291cmNlcy5hdChzb3VyY2UpO1xuICAgICAgICAgIHNvdXJjZSA9IHV0aWwuY29tcHV0ZVNvdXJjZVVSTCh0aGlzLnNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgbmFtZSA9IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICduYW1lJywgbnVsbCk7XG4gICAgICAgIGlmIChuYW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgbmFtZSA9IHRoaXMuX25hbWVzLmF0KG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsTGluZScsIG51bGwpLFxuICAgICAgICAgIGNvbHVtbjogdXRpbC5nZXRBcmcobWFwcGluZywgJ29yaWdpbmFsQ29sdW1uJywgbnVsbCksXG4gICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzb3VyY2U6IG51bGwsXG4gICAgICBsaW5lOiBudWxsLFxuICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgbmFtZTogbnVsbFxuICAgIH07XG4gIH07XG5cbi8qKlxuICogUmV0dXJuIHRydWUgaWYgd2UgaGF2ZSB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGV2ZXJ5IHNvdXJjZSBpbiB0aGUgc291cmNlXG4gKiBtYXAsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMgPVxuICBmdW5jdGlvbiBCYXNpY1NvdXJjZU1hcENvbnN1bWVyX2hhc0NvbnRlbnRzT2ZBbGxTb3VyY2VzKCkge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudC5sZW5ndGggPj0gdGhpcy5fc291cmNlcy5zaXplKCkgJiZcbiAgICAgICF0aGlzLnNvdXJjZXNDb250ZW50LnNvbWUoZnVuY3Rpb24gKHNjKSB7IHJldHVybiBzYyA9PSBudWxsOyB9KTtcbiAgfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29udGVudC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgdGhlIHVybCBvZiB0aGVcbiAqIG9yaWdpbmFsIHNvdXJjZSBmaWxlLiBSZXR1cm5zIG51bGwgaWYgbm8gb3JpZ2luYWwgc291cmNlIGNvbnRlbnQgaXNcbiAqIGF2YWlsYWJsZS5cbiAqL1xuQmFzaWNTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvciA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcENvbnN1bWVyX3NvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgbnVsbE9uTWlzc2luZykge1xuICAgIGlmICghdGhpcy5zb3VyY2VzQ29udGVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4ID0gdGhpcy5fZmluZFNvdXJjZUluZGV4KGFTb3VyY2UpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2VzQ29udGVudFtpbmRleF07XG4gICAgfVxuXG4gICAgdmFyIHJlbGF0aXZlU291cmNlID0gYVNvdXJjZTtcbiAgICBpZiAodGhpcy5zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIHJlbGF0aXZlU291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLnNvdXJjZVJvb3QsIHJlbGF0aXZlU291cmNlKTtcbiAgICB9XG5cbiAgICB2YXIgdXJsO1xuICAgIGlmICh0aGlzLnNvdXJjZVJvb3QgIT0gbnVsbFxuICAgICAgICAmJiAodXJsID0gdXRpbC51cmxQYXJzZSh0aGlzLnNvdXJjZVJvb3QpKSkge1xuICAgICAgLy8gWFhYOiBmaWxlOi8vIFVSSXMgYW5kIGFic29sdXRlIHBhdGhzIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvciBmb3JcbiAgICAgIC8vIG1hbnkgdXNlcnMuIFdlIGNhbiBoZWxwIHRoZW0gb3V0IHdoZW4gdGhleSBleHBlY3QgZmlsZTovLyBVUklzIHRvXG4gICAgICAvLyBiZWhhdmUgbGlrZSBpdCB3b3VsZCBpZiB0aGV5IHdlcmUgcnVubmluZyBhIGxvY2FsIEhUVFAgc2VydmVyLiBTZWVcbiAgICAgIC8vIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTg4NTU5Ny5cbiAgICAgIHZhciBmaWxlVXJpQWJzUGF0aCA9IHJlbGF0aXZlU291cmNlLnJlcGxhY2UoL15maWxlOlxcL1xcLy8sIFwiXCIpO1xuICAgICAgaWYgKHVybC5zY2hlbWUgPT0gXCJmaWxlXCJcbiAgICAgICAgICAmJiB0aGlzLl9zb3VyY2VzLmhhcyhmaWxlVXJpQWJzUGF0aCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKGZpbGVVcmlBYnNQYXRoKV1cbiAgICAgIH1cblxuICAgICAgaWYgKCghdXJsLnBhdGggfHwgdXJsLnBhdGggPT0gXCIvXCIpXG4gICAgICAgICAgJiYgdGhpcy5fc291cmNlcy5oYXMoXCIvXCIgKyByZWxhdGl2ZVNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlc0NvbnRlbnRbdGhpcy5fc291cmNlcy5pbmRleE9mKFwiL1wiICsgcmVsYXRpdmVTb3VyY2UpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgcmVjdXJzaXZlbHkgZnJvbVxuICAgIC8vIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuc291cmNlQ29udGVudEZvci4gSW4gdGhhdCBjYXNlLCB3ZVxuICAgIC8vIGRvbid0IHdhbnQgdG8gdGhyb3cgaWYgd2UgY2FuJ3QgZmluZCB0aGUgc291cmNlIC0gd2UganVzdCB3YW50IHRvXG4gICAgLy8gcmV0dXJuIG51bGwsIHNvIHdlIHByb3ZpZGUgYSBmbGFnIHRvIGV4aXQgZ3JhY2VmdWxseS5cbiAgICBpZiAobnVsbE9uTWlzc2luZykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIicgKyByZWxhdGl2ZVNvdXJjZSArICdcIiBpcyBub3QgaW4gdGhlIFNvdXJjZU1hcC4nKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aFxuICogdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgY29sdW1uXG4gKiAgICAgbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gYmlhczogRWl0aGVyICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcgb3JcbiAqICAgICAnU291cmNlTWFwQ29uc3VtZXIuTEVBU1RfVVBQRVJfQk9VTkQnLiBTcGVjaWZpZXMgd2hldGhlciB0byByZXR1cm4gdGhlXG4gKiAgICAgY2xvc2VzdCBlbGVtZW50IHRoYXQgaXMgc21hbGxlciB0aGFuIG9yIGdyZWF0ZXIgdGhhbiB0aGUgb25lIHdlIGFyZVxuICogICAgIHNlYXJjaGluZyBmb3IsIHJlc3BlY3RpdmVseSwgaWYgdGhlIGV4YWN0IGVsZW1lbnQgY2Fubm90IGJlIGZvdW5kLlxuICogICAgIERlZmF1bHRzIHRvICdTb3VyY2VNYXBDb25zdW1lci5HUkVBVEVTVF9MT1dFUl9CT1VORCcuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLlxuICogICAgIFRoZSBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKi9cbkJhc2ljU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gU291cmNlTWFwQ29uc3VtZXJfZ2VuZXJhdGVkUG9zaXRpb25Gb3IoYUFyZ3MpIHtcbiAgICB2YXIgc291cmNlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnKTtcbiAgICBzb3VyY2UgPSB0aGlzLl9maW5kU291cmNlSW5kZXgoc291cmNlKTtcbiAgICBpZiAoc291cmNlIDwgMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGluZTogbnVsbCxcbiAgICAgICAgY29sdW1uOiBudWxsLFxuICAgICAgICBsYXN0Q29sdW1uOiBudWxsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBuZWVkbGUgPSB7XG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgIG9yaWdpbmFsTGluZTogdXRpbC5nZXRBcmcoYUFyZ3MsICdsaW5lJyksXG4gICAgICBvcmlnaW5hbENvbHVtbjogdXRpbC5nZXRBcmcoYUFyZ3MsICdjb2x1bW4nKVxuICAgIH07XG5cbiAgICB2YXIgaW5kZXggPSB0aGlzLl9maW5kTWFwcGluZyhcbiAgICAgIG5lZWRsZSxcbiAgICAgIHRoaXMuX29yaWdpbmFsTWFwcGluZ3MsXG4gICAgICBcIm9yaWdpbmFsTGluZVwiLFxuICAgICAgXCJvcmlnaW5hbENvbHVtblwiLFxuICAgICAgdXRpbC5jb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyxcbiAgICAgIHV0aWwuZ2V0QXJnKGFBcmdzLCAnYmlhcycsIFNvdXJjZU1hcENvbnN1bWVyLkdSRUFURVNUX0xPV0VSX0JPVU5EKVxuICAgICk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdmFyIG1hcHBpbmcgPSB0aGlzLl9vcmlnaW5hbE1hcHBpbmdzW2luZGV4XTtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlID09PSBuZWVkbGUuc291cmNlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbGluZTogdXRpbC5nZXRBcmcobWFwcGluZywgJ2dlbmVyYXRlZExpbmUnLCBudWxsKSxcbiAgICAgICAgICBjb2x1bW46IHV0aWwuZ2V0QXJnKG1hcHBpbmcsICdnZW5lcmF0ZWRDb2x1bW4nLCBudWxsKSxcbiAgICAgICAgICBsYXN0Q29sdW1uOiB1dGlsLmdldEFyZyhtYXBwaW5nLCAnbGFzdEdlbmVyYXRlZENvbHVtbicsIG51bGwpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGxpbmU6IG51bGwsXG4gICAgICBjb2x1bW46IG51bGwsXG4gICAgICBsYXN0Q29sdW1uOiBudWxsXG4gICAgfTtcbiAgfTtcblxuZXhwb3J0cy5CYXNpY1NvdXJjZU1hcENvbnN1bWVyID0gQmFzaWNTb3VyY2VNYXBDb25zdW1lcjtcblxuLyoqXG4gKiBBbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBhcnNlZCBzb3VyY2UgbWFwIHdoaWNoXG4gKiB3ZSBjYW4gcXVlcnkgZm9yIGluZm9ybWF0aW9uLiBJdCBkaWZmZXJzIGZyb20gQmFzaWNTb3VyY2VNYXBDb25zdW1lciBpblxuICogdGhhdCBpdCB0YWtlcyBcImluZGV4ZWRcIiBzb3VyY2UgbWFwcyAoaS5lLiBvbmVzIHdpdGggYSBcInNlY3Rpb25zXCIgZmllbGQpIGFzXG4gKiBpbnB1dC5cbiAqXG4gKiBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgcmF3IHNvdXJjZSBtYXAgKGVpdGhlciBhcyBhIEpTT04gc3RyaW5nLCBvciBhbHJlYWR5XG4gKiBwYXJzZWQgdG8gYW4gb2JqZWN0KS4gQWNjb3JkaW5nIHRvIHRoZSBzcGVjIGZvciBpbmRleGVkIHNvdXJjZSBtYXBzLCB0aGV5XG4gKiBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqXG4gKiAgIC0gdmVyc2lvbjogV2hpY2ggdmVyc2lvbiBvZiB0aGUgc291cmNlIG1hcCBzcGVjIHRoaXMgbWFwIGlzIGZvbGxvd2luZy5cbiAqICAgLSBmaWxlOiBPcHRpb25hbC4gVGhlIGdlbmVyYXRlZCBmaWxlIHRoaXMgc291cmNlIG1hcCBpcyBhc3NvY2lhdGVkIHdpdGguXG4gKiAgIC0gc2VjdGlvbnM6IEEgbGlzdCBvZiBzZWN0aW9uIGRlZmluaXRpb25zLlxuICpcbiAqIEVhY2ggdmFsdWUgdW5kZXIgdGhlIFwic2VjdGlvbnNcIiBmaWVsZCBoYXMgdHdvIGZpZWxkczpcbiAqICAgLSBvZmZzZXQ6IFRoZSBvZmZzZXQgaW50byB0aGUgb3JpZ2luYWwgc3BlY2lmaWVkIGF0IHdoaWNoIHRoaXMgc2VjdGlvblxuICogICAgICAgYmVnaW5zIHRvIGFwcGx5LCBkZWZpbmVkIGFzIGFuIG9iamVjdCB3aXRoIGEgXCJsaW5lXCIgYW5kIFwiY29sdW1uXCJcbiAqICAgICAgIGZpZWxkLlxuICogICAtIG1hcDogQSBzb3VyY2UgbWFwIGRlZmluaXRpb24uIFRoaXMgc291cmNlIG1hcCBjb3VsZCBhbHNvIGJlIGluZGV4ZWQsXG4gKiAgICAgICBidXQgZG9lc24ndCBoYXZlIHRvIGJlLlxuICpcbiAqIEluc3RlYWQgb2YgdGhlIFwibWFwXCIgZmllbGQsIGl0J3MgYWxzbyBwb3NzaWJsZSB0byBoYXZlIGEgXCJ1cmxcIiBmaWVsZFxuICogc3BlY2lmeWluZyBhIFVSTCB0byByZXRyaWV2ZSBhIHNvdXJjZSBtYXAgZnJvbSwgYnV0IHRoYXQncyBjdXJyZW50bHlcbiAqIHVuc3VwcG9ydGVkLlxuICpcbiAqIEhlcmUncyBhbiBleGFtcGxlIHNvdXJjZSBtYXAsIHRha2VuIGZyb20gdGhlIHNvdXJjZSBtYXAgc3BlY1swXSwgYnV0XG4gKiBtb2RpZmllZCB0byBvbWl0IGEgc2VjdGlvbiB3aGljaCB1c2VzIHRoZSBcInVybFwiIGZpZWxkLlxuICpcbiAqICB7XG4gKiAgICB2ZXJzaW9uIDogMyxcbiAqICAgIGZpbGU6IFwiYXBwLmpzXCIsXG4gKiAgICBzZWN0aW9uczogW3tcbiAqICAgICAgb2Zmc2V0OiB7bGluZToxMDAsIGNvbHVtbjoxMH0sXG4gKiAgICAgIG1hcDoge1xuICogICAgICAgIHZlcnNpb24gOiAzLFxuICogICAgICAgIGZpbGU6IFwic2VjdGlvbi5qc1wiLFxuICogICAgICAgIHNvdXJjZXM6IFtcImZvby5qc1wiLCBcImJhci5qc1wiXSxcbiAqICAgICAgICBuYW1lczogW1wic3JjXCIsIFwibWFwc1wiLCBcImFyZVwiLCBcImZ1blwiXSxcbiAqICAgICAgICBtYXBwaW5nczogXCJBQUFBLEU7O0FCQ0RFO1wiXG4gKiAgICAgIH1cbiAqICAgIH1dLFxuICogIH1cbiAqXG4gKiBUaGUgc2Vjb25kIHBhcmFtZXRlciwgaWYgZ2l2ZW4sIGlzIGEgc3RyaW5nIHdob3NlIHZhbHVlIGlzIHRoZSBVUkxcbiAqIGF0IHdoaWNoIHRoZSBzb3VyY2UgbWFwIHdhcyBmb3VuZC4gIFRoaXMgVVJMIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGVcbiAqIHNvdXJjZXMgYXJyYXkuXG4gKlxuICogWzBdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFVMVJHQWVoUXdSeXBVVG92RjFLUmxwaU9GemUwYi1fMmdjNmZBSDBLWTBrL2VkaXQjaGVhZGluZz1oLjUzNWVzM3hlcHJndFxuICovXG5mdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXIoYVNvdXJjZU1hcCwgYVNvdXJjZU1hcFVSTCkge1xuICB2YXIgc291cmNlTWFwID0gYVNvdXJjZU1hcDtcbiAgaWYgKHR5cGVvZiBhU291cmNlTWFwID09PSAnc3RyaW5nJykge1xuICAgIHNvdXJjZU1hcCA9IHV0aWwucGFyc2VTb3VyY2VNYXBJbnB1dChhU291cmNlTWFwKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gdXRpbC5nZXRBcmcoc291cmNlTWFwLCAndmVyc2lvbicpO1xuICB2YXIgc2VjdGlvbnMgPSB1dGlsLmdldEFyZyhzb3VyY2VNYXAsICdzZWN0aW9ucycpO1xuXG4gIGlmICh2ZXJzaW9uICE9IHRoaXMuX3ZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIHZlcnNpb246ICcgKyB2ZXJzaW9uKTtcbiAgfVxuXG4gIHRoaXMuX3NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgdGhpcy5fbmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcblxuICB2YXIgbGFzdE9mZnNldCA9IHtcbiAgICBsaW5lOiAtMSxcbiAgICBjb2x1bW46IDBcbiAgfTtcbiAgdGhpcy5fc2VjdGlvbnMgPSBzZWN0aW9ucy5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICBpZiAocy51cmwpIHtcbiAgICAgIC8vIFRoZSB1cmwgZmllbGQgd2lsbCByZXF1aXJlIHN1cHBvcnQgZm9yIGFzeW5jaHJvbmljaXR5LlxuICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvaXNzdWVzLzE2XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgZm9yIHVybCBmaWVsZCBpbiBzZWN0aW9ucyBub3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuICAgIHZhciBvZmZzZXQgPSB1dGlsLmdldEFyZyhzLCAnb2Zmc2V0Jyk7XG4gICAgdmFyIG9mZnNldExpbmUgPSB1dGlsLmdldEFyZyhvZmZzZXQsICdsaW5lJyk7XG4gICAgdmFyIG9mZnNldENvbHVtbiA9IHV0aWwuZ2V0QXJnKG9mZnNldCwgJ2NvbHVtbicpO1xuXG4gICAgaWYgKG9mZnNldExpbmUgPCBsYXN0T2Zmc2V0LmxpbmUgfHxcbiAgICAgICAgKG9mZnNldExpbmUgPT09IGxhc3RPZmZzZXQubGluZSAmJiBvZmZzZXRDb2x1bW4gPCBsYXN0T2Zmc2V0LmNvbHVtbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU2VjdGlvbiBvZmZzZXRzIG11c3QgYmUgb3JkZXJlZCBhbmQgbm9uLW92ZXJsYXBwaW5nLicpO1xuICAgIH1cbiAgICBsYXN0T2Zmc2V0ID0gb2Zmc2V0O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGdlbmVyYXRlZE9mZnNldDoge1xuICAgICAgICAvLyBUaGUgb2Zmc2V0IGZpZWxkcyBhcmUgMC1iYXNlZCwgYnV0IHdlIHVzZSAxLWJhc2VkIGluZGljZXMgd2hlblxuICAgICAgICAvLyBlbmNvZGluZy9kZWNvZGluZyBmcm9tIFZMUS5cbiAgICAgICAgZ2VuZXJhdGVkTGluZTogb2Zmc2V0TGluZSArIDEsXG4gICAgICAgIGdlbmVyYXRlZENvbHVtbjogb2Zmc2V0Q29sdW1uICsgMVxuICAgICAgfSxcbiAgICAgIGNvbnN1bWVyOiBuZXcgU291cmNlTWFwQ29uc3VtZXIodXRpbC5nZXRBcmcocywgJ21hcCcpLCBhU291cmNlTWFwVVJMKVxuICAgIH1cbiAgfSk7XG59XG5cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSk7XG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU291cmNlTWFwQ29uc3VtZXI7XG5cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIHNvdXJjZSBtYXBwaW5nIHNwZWMgdGhhdCB3ZSBhcmUgY29uc3VtaW5nLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl92ZXJzaW9uID0gMztcblxuLyoqXG4gKiBUaGUgbGlzdCBvZiBvcmlnaW5hbCBzb3VyY2VzLlxuICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyLnByb3RvdHlwZSwgJ3NvdXJjZXMnLCB7XG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHZhciBzb3VyY2VzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0aGlzLl9zZWN0aW9uc1tpXS5jb25zdW1lci5zb3VyY2VzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHNvdXJjZXMucHVzaCh0aGlzLl9zZWN0aW9uc1tpXS5jb25zdW1lci5zb3VyY2VzW2pdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZXM7XG4gIH1cbn0pO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSwgbGluZSwgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGdlbmVyYXRlZFxuICogc291cmNlJ3MgbGluZSBhbmQgY29sdW1uIHBvc2l0aW9ucyBwcm92aWRlZC4gVGhlIG9ubHkgYXJndW1lbnQgaXMgYW4gb2JqZWN0XG4gKiB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLiAgVGhlIGNvbHVtblxuICogICAgIG51bWJlciBpcyAwLWJhc2VkLlxuICpcbiAqIGFuZCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlLCBvciBudWxsLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UsIG9yIG51bGwuICBUaGVcbiAqICAgICBjb2x1bW4gbnVtYmVyIGlzIDAtYmFzZWQuXG4gKiAgIC0gbmFtZTogVGhlIG9yaWdpbmFsIGlkZW50aWZpZXIsIG9yIG51bGwuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUub3JpZ2luYWxQb3NpdGlvbkZvciA9XG4gIGZ1bmN0aW9uIEluZGV4ZWRTb3VyY2VNYXBDb25zdW1lcl9vcmlnaW5hbFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgdmFyIG5lZWRsZSA9IHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbGluZScpLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiB1dGlsLmdldEFyZyhhQXJncywgJ2NvbHVtbicpXG4gICAgfTtcblxuICAgIC8vIEZpbmQgdGhlIHNlY3Rpb24gY29udGFpbmluZyB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9uIHdlJ3JlIHRyeWluZyB0byBtYXBcbiAgICAvLyB0byBhbiBvcmlnaW5hbCBwb3NpdGlvbi5cbiAgICB2YXIgc2VjdGlvbkluZGV4ID0gYmluYXJ5U2VhcmNoLnNlYXJjaChuZWVkbGUsIHRoaXMuX3NlY3Rpb25zLFxuICAgICAgZnVuY3Rpb24obmVlZGxlLCBzZWN0aW9uKSB7XG4gICAgICAgIHZhciBjbXAgPSBuZWVkbGUuZ2VuZXJhdGVkTGluZSAtIHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmU7XG4gICAgICAgIGlmIChjbXApIHtcbiAgICAgICAgICByZXR1cm4gY21wO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChuZWVkbGUuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4pO1xuICAgICAgfSk7XG4gICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tzZWN0aW9uSW5kZXhdO1xuXG4gICAgaWYgKCFzZWN0aW9uKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzb3VyY2U6IG51bGwsXG4gICAgICAgIGxpbmU6IG51bGwsXG4gICAgICAgIGNvbHVtbjogbnVsbCxcbiAgICAgICAgbmFtZTogbnVsbFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VjdGlvbi5jb25zdW1lci5vcmlnaW5hbFBvc2l0aW9uRm9yKHtcbiAgICAgIGxpbmU6IG5lZWRsZS5nZW5lcmF0ZWRMaW5lIC1cbiAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgLSAxKSxcbiAgICAgIGNvbHVtbjogbmVlZGxlLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBuZWVkbGUuZ2VuZXJhdGVkTGluZVxuICAgICAgICAgPyBzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRDb2x1bW4gLSAxXG4gICAgICAgICA6IDApLFxuICAgICAgYmlhczogYUFyZ3MuYmlhc1xuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgdGhlIHNvdXJjZSBjb250ZW50IGZvciBldmVyeSBzb3VyY2UgaW4gdGhlIHNvdXJjZVxuICogbWFwLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbkluZGV4ZWRTb3VyY2VNYXBDb25zdW1lci5wcm90b3R5cGUuaGFzQ29udGVudHNPZkFsbFNvdXJjZXMgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfaGFzQ29udGVudHNPZkFsbFNvdXJjZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlY3Rpb25zLmV2ZXJ5KGZ1bmN0aW9uIChzKSB7XG4gICAgICByZXR1cm4gcy5jb25zdW1lci5oYXNDb250ZW50c09mQWxsU291cmNlcygpO1xuICAgIH0pO1xuICB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb250ZW50LiBUaGUgb25seSBhcmd1bWVudCBpcyB0aGUgdXJsIG9mIHRoZVxuICogb3JpZ2luYWwgc291cmNlIGZpbGUuIFJldHVybnMgbnVsbCBpZiBubyBvcmlnaW5hbCBzb3VyY2UgY29udGVudCBpc1xuICogYXZhaWxhYmxlLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLnNvdXJjZUNvbnRlbnRGb3IgPVxuICBmdW5jdGlvbiBJbmRleGVkU291cmNlTWFwQ29uc3VtZXJfc291cmNlQ29udGVudEZvcihhU291cmNlLCBudWxsT25NaXNzaW5nKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcblxuICAgICAgdmFyIGNvbnRlbnQgPSBzZWN0aW9uLmNvbnN1bWVyLnNvdXJjZUNvbnRlbnRGb3IoYVNvdXJjZSwgdHJ1ZSk7XG4gICAgICBpZiAoY29udGVudCkge1xuICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG51bGxPbk1pc3NpbmcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignXCInICsgYVNvdXJjZSArICdcIiBpcyBub3QgaW4gdGhlIFNvdXJjZU1hcC4nKTtcbiAgICB9XG4gIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG9yaWdpbmFsIHNvdXJjZSxcbiAqIGxpbmUsIGFuZCBjb2x1bW4gcG9zaXRpb25zIHByb3ZpZGVkLiBUaGUgb25seSBhcmd1bWVudCBpcyBhbiBvYmplY3Qgd2l0aFxuICogdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqICAgLSBzb3VyY2U6IFRoZSBmaWxlbmFtZSBvZiB0aGUgb3JpZ2luYWwgc291cmNlLlxuICogICAtIGxpbmU6IFRoZSBsaW5lIG51bWJlciBpbiB0aGUgb3JpZ2luYWwgc291cmNlLiAgVGhlIGxpbmUgbnVtYmVyXG4gKiAgICAgaXMgMS1iYXNlZC5cbiAqICAgLSBjb2x1bW46IFRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSBvcmlnaW5hbCBzb3VyY2UuICBUaGUgY29sdW1uXG4gKiAgICAgbnVtYmVyIGlzIDAtYmFzZWQuXG4gKlxuICogYW5kIGFuIG9iamVjdCBpcyByZXR1cm5lZCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gbGluZTogVGhlIGxpbmUgbnVtYmVyIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlLCBvciBudWxsLiAgVGhlXG4gKiAgICAgbGluZSBudW1iZXIgaXMgMS1iYXNlZC4gXG4gKiAgIC0gY29sdW1uOiBUaGUgY29sdW1uIG51bWJlciBpbiB0aGUgZ2VuZXJhdGVkIHNvdXJjZSwgb3IgbnVsbC5cbiAqICAgICBUaGUgY29sdW1uIG51bWJlciBpcyAwLWJhc2VkLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLmdlbmVyYXRlZFBvc2l0aW9uRm9yID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX2dlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlY3Rpb24gPSB0aGlzLl9zZWN0aW9uc1tpXTtcblxuICAgICAgLy8gT25seSBjb25zaWRlciB0aGlzIHNlY3Rpb24gaWYgdGhlIHJlcXVlc3RlZCBzb3VyY2UgaXMgaW4gdGhlIGxpc3Qgb2ZcbiAgICAgIC8vIHNvdXJjZXMgb2YgdGhlIGNvbnN1bWVyLlxuICAgICAgaWYgKHNlY3Rpb24uY29uc3VtZXIuX2ZpbmRTb3VyY2VJbmRleCh1dGlsLmdldEFyZyhhQXJncywgJ3NvdXJjZScpKSA9PT0gLTEpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB2YXIgZ2VuZXJhdGVkUG9zaXRpb24gPSBzZWN0aW9uLmNvbnN1bWVyLmdlbmVyYXRlZFBvc2l0aW9uRm9yKGFBcmdzKTtcbiAgICAgIGlmIChnZW5lcmF0ZWRQb3NpdGlvbikge1xuICAgICAgICB2YXIgcmV0ID0ge1xuICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZFBvc2l0aW9uLmxpbmUgK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgLSAxKSxcbiAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZFBvc2l0aW9uLmNvbHVtbiArXG4gICAgICAgICAgICAoc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkTGluZSA9PT0gZ2VuZXJhdGVkUG9zaXRpb24ubGluZVxuICAgICAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgICAgIDogMClcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGluZTogbnVsbCxcbiAgICAgIGNvbHVtbjogbnVsbFxuICAgIH07XG4gIH07XG5cbi8qKlxuICogUGFyc2UgdGhlIG1hcHBpbmdzIGluIGEgc3RyaW5nIGluIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2ggd2UgY2FuIGVhc2lseVxuICogcXVlcnkgKHRoZSBvcmRlcmVkIGFycmF5cyBpbiB0aGUgYHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5nc2AgYW5kXG4gKiBgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3NgIHByb3BlcnRpZXMpLlxuICovXG5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIucHJvdG90eXBlLl9wYXJzZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gSW5kZXhlZFNvdXJjZU1hcENvbnN1bWVyX3BhcnNlTWFwcGluZ3MoYVN0ciwgYVNvdXJjZVJvb3QpIHtcbiAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MgPSBbXTtcbiAgICB0aGlzLl9fb3JpZ2luYWxNYXBwaW5ncyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fc2VjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzZWN0aW9uID0gdGhpcy5fc2VjdGlvbnNbaV07XG4gICAgICB2YXIgc2VjdGlvbk1hcHBpbmdzID0gc2VjdGlvbi5jb25zdW1lci5fZ2VuZXJhdGVkTWFwcGluZ3M7XG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHNlY3Rpb25NYXBwaW5ncy5sZW5ndGg7IGorKykge1xuICAgICAgICB2YXIgbWFwcGluZyA9IHNlY3Rpb25NYXBwaW5nc1tqXTtcblxuICAgICAgICB2YXIgc291cmNlID0gc2VjdGlvbi5jb25zdW1lci5fc291cmNlcy5hdChtYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIHNvdXJjZSA9IHV0aWwuY29tcHV0ZVNvdXJjZVVSTChzZWN0aW9uLmNvbnN1bWVyLnNvdXJjZVJvb3QsIHNvdXJjZSwgdGhpcy5fc291cmNlTWFwVVJMKTtcbiAgICAgICAgdGhpcy5fc291cmNlcy5hZGQoc291cmNlKTtcbiAgICAgICAgc291cmNlID0gdGhpcy5fc291cmNlcy5pbmRleE9mKHNvdXJjZSk7XG5cbiAgICAgICAgdmFyIG5hbWUgPSBudWxsO1xuICAgICAgICBpZiAobWFwcGluZy5uYW1lKSB7XG4gICAgICAgICAgbmFtZSA9IHNlY3Rpb24uY29uc3VtZXIuX25hbWVzLmF0KG1hcHBpbmcubmFtZSk7XG4gICAgICAgICAgdGhpcy5fbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgICAgIG5hbWUgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIG1hcHBpbmdzIGNvbWluZyBmcm9tIHRoZSBjb25zdW1lciBmb3IgdGhlIHNlY3Rpb24gaGF2ZVxuICAgICAgICAvLyBnZW5lcmF0ZWQgcG9zaXRpb25zIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgc2VjdGlvbiwgc28gd2VcbiAgICAgICAgLy8gbmVlZCB0byBvZmZzZXQgdGhlbSB0byBiZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbmNhdGVuYXRlZFxuICAgICAgICAvLyBnZW5lcmF0ZWQgZmlsZS5cbiAgICAgICAgdmFyIGFkanVzdGVkTWFwcGluZyA9IHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgICAgICBnZW5lcmF0ZWRMaW5lOiBtYXBwaW5nLmdlbmVyYXRlZExpbmUgK1xuICAgICAgICAgICAgKHNlY3Rpb24uZ2VuZXJhdGVkT2Zmc2V0LmdlbmVyYXRlZExpbmUgLSAxKSxcbiAgICAgICAgICBnZW5lcmF0ZWRDb2x1bW46IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uICtcbiAgICAgICAgICAgIChzZWN0aW9uLmdlbmVyYXRlZE9mZnNldC5nZW5lcmF0ZWRMaW5lID09PSBtYXBwaW5nLmdlbmVyYXRlZExpbmVcbiAgICAgICAgICAgID8gc2VjdGlvbi5nZW5lcmF0ZWRPZmZzZXQuZ2VuZXJhdGVkQ29sdW1uIC0gMVxuICAgICAgICAgICAgOiAwKSxcbiAgICAgICAgICBvcmlnaW5hbExpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIG9yaWdpbmFsQ29sdW1uOiBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uLFxuICAgICAgICAgIG5hbWU6IG5hbWVcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9fZ2VuZXJhdGVkTWFwcGluZ3MucHVzaChhZGp1c3RlZE1hcHBpbmcpO1xuICAgICAgICBpZiAodHlwZW9mIGFkanVzdGVkTWFwcGluZy5vcmlnaW5hbExpbmUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhpcy5fX29yaWdpbmFsTWFwcGluZ3MucHVzaChhZGp1c3RlZE1hcHBpbmcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcXVpY2tTb3J0KHRoaXMuX19nZW5lcmF0ZWRNYXBwaW5ncywgdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCk7XG4gICAgcXVpY2tTb3J0KHRoaXMuX19vcmlnaW5hbE1hcHBpbmdzLCB1dGlsLmNvbXBhcmVCeU9yaWdpbmFsUG9zaXRpb25zKTtcbiAgfTtcblxuZXhwb3J0cy5JbmRleGVkU291cmNlTWFwQ29uc3VtZXIgPSBJbmRleGVkU291cmNlTWFwQ29uc3VtZXI7XG4iLCIvKiAtKi0gTW9kZToganM7IGpzLWluZGVudC1sZXZlbDogMjsgLSotICovXG4vKlxuICogQ29weXJpZ2h0IDIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFIG9yOlxuICogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZVxuICovXG5cbnZhciBiYXNlNjRWTFEgPSByZXF1aXJlKCcuL2Jhc2U2NC12bHEnKTtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG52YXIgQXJyYXlTZXQgPSByZXF1aXJlKCcuL2FycmF5LXNldCcpLkFycmF5U2V0O1xudmFyIE1hcHBpbmdMaXN0ID0gcmVxdWlyZSgnLi9tYXBwaW5nLWxpc3QnKS5NYXBwaW5nTGlzdDtcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGUgU291cmNlTWFwR2VuZXJhdG9yIHJlcHJlc2VudHMgYSBzb3VyY2UgbWFwIHdoaWNoIGlzXG4gKiBiZWluZyBidWlsdCBpbmNyZW1lbnRhbGx5LiBZb3UgbWF5IHBhc3MgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZ1xuICogcHJvcGVydGllczpcbiAqXG4gKiAgIC0gZmlsZTogVGhlIGZpbGVuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgc291cmNlLlxuICogICAtIHNvdXJjZVJvb3Q6IEEgcm9vdCBmb3IgYWxsIHJlbGF0aXZlIFVSTHMgaW4gdGhpcyBzb3VyY2UgbWFwLlxuICovXG5mdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3IoYUFyZ3MpIHtcbiAgaWYgKCFhQXJncykge1xuICAgIGFBcmdzID0ge307XG4gIH1cbiAgdGhpcy5fZmlsZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnZmlsZScsIG51bGwpO1xuICB0aGlzLl9zb3VyY2VSb290ID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2VSb290JywgbnVsbCk7XG4gIHRoaXMuX3NraXBWYWxpZGF0aW9uID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdza2lwVmFsaWRhdGlvbicsIGZhbHNlKTtcbiAgdGhpcy5fc291cmNlcyA9IG5ldyBBcnJheVNldCgpO1xuICB0aGlzLl9uYW1lcyA9IG5ldyBBcnJheVNldCgpO1xuICB0aGlzLl9tYXBwaW5ncyA9IG5ldyBNYXBwaW5nTGlzdCgpO1xuICB0aGlzLl9zb3VyY2VzQ29udGVudHMgPSBudWxsO1xufVxuXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl92ZXJzaW9uID0gMztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFNvdXJjZU1hcEdlbmVyYXRvciBiYXNlZCBvbiBhIFNvdXJjZU1hcENvbnN1bWVyXG4gKlxuICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgU291cmNlTWFwLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IuZnJvbVNvdXJjZU1hcCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl9mcm9tU291cmNlTWFwKGFTb3VyY2VNYXBDb25zdW1lcikge1xuICAgIHZhciBzb3VyY2VSb290ID0gYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZVJvb3Q7XG4gICAgdmFyIGdlbmVyYXRvciA9IG5ldyBTb3VyY2VNYXBHZW5lcmF0b3Ioe1xuICAgICAgZmlsZTogYVNvdXJjZU1hcENvbnN1bWVyLmZpbGUsXG4gICAgICBzb3VyY2VSb290OiBzb3VyY2VSb290XG4gICAgfSk7XG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLmVhY2hNYXBwaW5nKGZ1bmN0aW9uIChtYXBwaW5nKSB7XG4gICAgICB2YXIgbmV3TWFwcGluZyA9IHtcbiAgICAgICAgZ2VuZXJhdGVkOiB7XG4gICAgICAgICAgbGluZTogbWFwcGluZy5nZW5lcmF0ZWRMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKG1hcHBpbmcuc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgbmV3TWFwcGluZy5zb3VyY2UgPSBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgaWYgKHNvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld01hcHBpbmcuc291cmNlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBuZXdNYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXdNYXBwaW5nLm9yaWdpbmFsID0ge1xuICAgICAgICAgIGxpbmU6IG1hcHBpbmcub3JpZ2luYWxMaW5lLFxuICAgICAgICAgIGNvbHVtbjogbWFwcGluZy5vcmlnaW5hbENvbHVtblxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChtYXBwaW5nLm5hbWUgIT0gbnVsbCkge1xuICAgICAgICAgIG5ld01hcHBpbmcubmFtZSA9IG1hcHBpbmcubmFtZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBnZW5lcmF0b3IuYWRkTWFwcGluZyhuZXdNYXBwaW5nKTtcbiAgICB9KTtcbiAgICBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzb3VyY2VGaWxlKSB7XG4gICAgICB2YXIgc291cmNlUmVsYXRpdmUgPSBzb3VyY2VGaWxlO1xuICAgICAgaWYgKHNvdXJjZVJvb3QgIT09IG51bGwpIHtcbiAgICAgICAgc291cmNlUmVsYXRpdmUgPSB1dGlsLnJlbGF0aXZlKHNvdXJjZVJvb3QsIHNvdXJjZUZpbGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWdlbmVyYXRvci5fc291cmNlcy5oYXMoc291cmNlUmVsYXRpdmUpKSB7XG4gICAgICAgIGdlbmVyYXRvci5fc291cmNlcy5hZGQoc291cmNlUmVsYXRpdmUpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGVudCA9IGFTb3VyY2VNYXBDb25zdW1lci5zb3VyY2VDb250ZW50Rm9yKHNvdXJjZUZpbGUpO1xuICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkge1xuICAgICAgICBnZW5lcmF0b3Iuc2V0U291cmNlQ29udGVudChzb3VyY2VGaWxlLCBjb250ZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZ2VuZXJhdG9yO1xuICB9O1xuXG4vKipcbiAqIEFkZCBhIHNpbmdsZSBtYXBwaW5nIGZyb20gb3JpZ2luYWwgc291cmNlIGxpbmUgYW5kIGNvbHVtbiB0byB0aGUgZ2VuZXJhdGVkXG4gKiBzb3VyY2UncyBsaW5lIGFuZCBjb2x1bW4gZm9yIHRoaXMgc291cmNlIG1hcCBiZWluZyBjcmVhdGVkLiBUaGUgbWFwcGluZ1xuICogb2JqZWN0IHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqXG4gKiAgIC0gZ2VuZXJhdGVkOiBBbiBvYmplY3Qgd2l0aCB0aGUgZ2VuZXJhdGVkIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbnMuXG4gKiAgIC0gb3JpZ2luYWw6IEFuIG9iamVjdCB3aXRoIHRoZSBvcmlnaW5hbCBsaW5lIGFuZCBjb2x1bW4gcG9zaXRpb25zLlxuICogICAtIHNvdXJjZTogVGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIChyZWxhdGl2ZSB0byB0aGUgc291cmNlUm9vdCkuXG4gKiAgIC0gbmFtZTogQW4gb3B0aW9uYWwgb3JpZ2luYWwgdG9rZW4gbmFtZSBmb3IgdGhpcyBtYXBwaW5nLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFkZE1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfYWRkTWFwcGluZyhhQXJncykge1xuICAgIHZhciBnZW5lcmF0ZWQgPSB1dGlsLmdldEFyZyhhQXJncywgJ2dlbmVyYXRlZCcpO1xuICAgIHZhciBvcmlnaW5hbCA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnb3JpZ2luYWwnLCBudWxsKTtcbiAgICB2YXIgc291cmNlID0gdXRpbC5nZXRBcmcoYUFyZ3MsICdzb3VyY2UnLCBudWxsKTtcbiAgICB2YXIgbmFtZSA9IHV0aWwuZ2V0QXJnKGFBcmdzLCAnbmFtZScsIG51bGwpO1xuXG4gICAgaWYgKCF0aGlzLl9za2lwVmFsaWRhdGlvbikge1xuICAgICAgdGhpcy5fdmFsaWRhdGVNYXBwaW5nKGdlbmVyYXRlZCwgb3JpZ2luYWwsIHNvdXJjZSwgbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHNvdXJjZSAhPSBudWxsKSB7XG4gICAgICBzb3VyY2UgPSBTdHJpbmcoc291cmNlKTtcbiAgICAgIGlmICghdGhpcy5fc291cmNlcy5oYXMoc291cmNlKSkge1xuICAgICAgICB0aGlzLl9zb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChuYW1lICE9IG51bGwpIHtcbiAgICAgIG5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgICBpZiAoIXRoaXMuX25hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICB0aGlzLl9uYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fbWFwcGluZ3MuYWRkKHtcbiAgICAgIGdlbmVyYXRlZExpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgZ2VuZXJhdGVkQ29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uLFxuICAgICAgb3JpZ2luYWxMaW5lOiBvcmlnaW5hbCAhPSBudWxsICYmIG9yaWdpbmFsLmxpbmUsXG4gICAgICBvcmlnaW5hbENvbHVtbjogb3JpZ2luYWwgIT0gbnVsbCAmJiBvcmlnaW5hbC5jb2x1bW4sXG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgIG5hbWU6IG5hbWVcbiAgICB9KTtcbiAgfTtcblxuLyoqXG4gKiBTZXQgdGhlIHNvdXJjZSBjb250ZW50IGZvciBhIHNvdXJjZSBmaWxlLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLnNldFNvdXJjZUNvbnRlbnQgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3Jfc2V0U291cmNlQ29udGVudChhU291cmNlRmlsZSwgYVNvdXJjZUNvbnRlbnQpIHtcbiAgICB2YXIgc291cmNlID0gYVNvdXJjZUZpbGU7XG4gICAgaWYgKHRoaXMuX3NvdXJjZVJvb3QgIT0gbnVsbCkge1xuICAgICAgc291cmNlID0gdXRpbC5yZWxhdGl2ZSh0aGlzLl9zb3VyY2VSb290LCBzb3VyY2UpO1xuICAgIH1cblxuICAgIGlmIChhU291cmNlQ29udGVudCAhPSBudWxsKSB7XG4gICAgICAvLyBBZGQgdGhlIHNvdXJjZSBjb250ZW50IHRvIHRoZSBfc291cmNlc0NvbnRlbnRzIG1hcC5cbiAgICAgIC8vIENyZWF0ZSBhIG5ldyBfc291cmNlc0NvbnRlbnRzIG1hcCBpZiB0aGUgcHJvcGVydHkgaXMgbnVsbC5cbiAgICAgIGlmICghdGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAgIHRoaXMuX3NvdXJjZXNDb250ZW50cyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9zb3VyY2VzQ29udGVudHNbdXRpbC50b1NldFN0cmluZyhzb3VyY2UpXSA9IGFTb3VyY2VDb250ZW50O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fc291cmNlc0NvbnRlbnRzKSB7XG4gICAgICAvLyBSZW1vdmUgdGhlIHNvdXJjZSBmaWxlIGZyb20gdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwLlxuICAgICAgLy8gSWYgdGhlIF9zb3VyY2VzQ29udGVudHMgbWFwIGlzIGVtcHR5LCBzZXQgdGhlIHByb3BlcnR5IHRvIG51bGwuXG4gICAgICBkZWxldGUgdGhpcy5fc291cmNlc0NvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoc291cmNlKV07XG4gICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5fc291cmNlc0NvbnRlbnRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5fc291cmNlc0NvbnRlbnRzID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbi8qKlxuICogQXBwbGllcyB0aGUgbWFwcGluZ3Mgb2YgYSBzdWItc291cmNlLW1hcCBmb3IgYSBzcGVjaWZpYyBzb3VyY2UgZmlsZSB0byB0aGVcbiAqIHNvdXJjZSBtYXAgYmVpbmcgZ2VuZXJhdGVkLiBFYWNoIG1hcHBpbmcgdG8gdGhlIHN1cHBsaWVkIHNvdXJjZSBmaWxlIGlzXG4gKiByZXdyaXR0ZW4gdXNpbmcgdGhlIHN1cHBsaWVkIHNvdXJjZSBtYXAuIE5vdGU6IFRoZSByZXNvbHV0aW9uIGZvciB0aGVcbiAqIHJlc3VsdGluZyBtYXBwaW5ncyBpcyB0aGUgbWluaW1pdW0gb2YgdGhpcyBtYXAgYW5kIHRoZSBzdXBwbGllZCBtYXAuXG4gKlxuICogQHBhcmFtIGFTb3VyY2VNYXBDb25zdW1lciBUaGUgc291cmNlIG1hcCB0byBiZSBhcHBsaWVkLlxuICogQHBhcmFtIGFTb3VyY2VGaWxlIE9wdGlvbmFsLiBUaGUgZmlsZW5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlLlxuICogICAgICAgIElmIG9taXR0ZWQsIFNvdXJjZU1hcENvbnN1bWVyJ3MgZmlsZSBwcm9wZXJ0eSB3aWxsIGJlIHVzZWQuXG4gKiBAcGFyYW0gYVNvdXJjZU1hcFBhdGggT3B0aW9uYWwuIFRoZSBkaXJuYW1lIG9mIHRoZSBwYXRoIHRvIHRoZSBzb3VyY2UgbWFwXG4gKiAgICAgICAgdG8gYmUgYXBwbGllZC4gSWYgcmVsYXRpdmUsIGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBTb3VyY2VNYXBDb25zdW1lci5cbiAqICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyBuZWVkZWQgd2hlbiB0aGUgdHdvIHNvdXJjZSBtYXBzIGFyZW4ndCBpbiB0aGUgc2FtZVxuICogICAgICAgIGRpcmVjdG9yeSwgYW5kIHRoZSBzb3VyY2UgbWFwIHRvIGJlIGFwcGxpZWQgY29udGFpbnMgcmVsYXRpdmUgc291cmNlXG4gKiAgICAgICAgcGF0aHMuIElmIHNvLCB0aG9zZSByZWxhdGl2ZSBzb3VyY2UgcGF0aHMgbmVlZCB0byBiZSByZXdyaXR0ZW5cbiAqICAgICAgICByZWxhdGl2ZSB0byB0aGUgU291cmNlTWFwR2VuZXJhdG9yLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLmFwcGx5U291cmNlTWFwID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2FwcGx5U291cmNlTWFwKGFTb3VyY2VNYXBDb25zdW1lciwgYVNvdXJjZUZpbGUsIGFTb3VyY2VNYXBQYXRoKSB7XG4gICAgdmFyIHNvdXJjZUZpbGUgPSBhU291cmNlRmlsZTtcbiAgICAvLyBJZiBhU291cmNlRmlsZSBpcyBvbWl0dGVkLCB3ZSB3aWxsIHVzZSB0aGUgZmlsZSBwcm9wZXJ0eSBvZiB0aGUgU291cmNlTWFwXG4gICAgaWYgKGFTb3VyY2VGaWxlID09IG51bGwpIHtcbiAgICAgIGlmIChhU291cmNlTWFwQ29uc3VtZXIuZmlsZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS5hcHBseVNvdXJjZU1hcCByZXF1aXJlcyBlaXRoZXIgYW4gZXhwbGljaXQgc291cmNlIGZpbGUsICcgK1xuICAgICAgICAgICdvciB0aGUgc291cmNlIG1hcFxcJ3MgXCJmaWxlXCIgcHJvcGVydHkuIEJvdGggd2VyZSBvbWl0dGVkLidcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHNvdXJjZUZpbGUgPSBhU291cmNlTWFwQ29uc3VtZXIuZmlsZTtcbiAgICB9XG4gICAgdmFyIHNvdXJjZVJvb3QgPSB0aGlzLl9zb3VyY2VSb290O1xuICAgIC8vIE1ha2UgXCJzb3VyY2VGaWxlXCIgcmVsYXRpdmUgaWYgYW4gYWJzb2x1dGUgVXJsIGlzIHBhc3NlZC5cbiAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICBzb3VyY2VGaWxlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBzb3VyY2VGaWxlKTtcbiAgICB9XG4gICAgLy8gQXBwbHlpbmcgdGhlIFNvdXJjZU1hcCBjYW4gYWRkIGFuZCByZW1vdmUgaXRlbXMgZnJvbSB0aGUgc291cmNlcyBhbmRcbiAgICAvLyB0aGUgbmFtZXMgYXJyYXkuXG4gICAgdmFyIG5ld1NvdXJjZXMgPSBuZXcgQXJyYXlTZXQoKTtcbiAgICB2YXIgbmV3TmFtZXMgPSBuZXcgQXJyYXlTZXQoKTtcblxuICAgIC8vIEZpbmQgbWFwcGluZ3MgZm9yIHRoZSBcInNvdXJjZUZpbGVcIlxuICAgIHRoaXMuX21hcHBpbmdzLnVuc29ydGVkRm9yRWFjaChmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgaWYgKG1hcHBpbmcuc291cmNlID09PSBzb3VyY2VGaWxlICYmIG1hcHBpbmcub3JpZ2luYWxMaW5lICE9IG51bGwpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgaXQgY2FuIGJlIG1hcHBlZCBieSB0aGUgc291cmNlIG1hcCwgdGhlbiB1cGRhdGUgdGhlIG1hcHBpbmcuXG4gICAgICAgIHZhciBvcmlnaW5hbCA9IGFTb3VyY2VNYXBDb25zdW1lci5vcmlnaW5hbFBvc2l0aW9uRm9yKHtcbiAgICAgICAgICBsaW5lOiBtYXBwaW5nLm9yaWdpbmFsTGluZSxcbiAgICAgICAgICBjb2x1bW46IG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvcmlnaW5hbC5zb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgIC8vIENvcHkgbWFwcGluZ1xuICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gb3JpZ2luYWwuc291cmNlO1xuICAgICAgICAgIGlmIChhU291cmNlTWFwUGF0aCAhPSBudWxsKSB7XG4gICAgICAgICAgICBtYXBwaW5nLnNvdXJjZSA9IHV0aWwuam9pbihhU291cmNlTWFwUGF0aCwgbWFwcGluZy5zb3VyY2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcuc291cmNlID0gdXRpbC5yZWxhdGl2ZShzb3VyY2VSb290LCBtYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxMaW5lID0gb3JpZ2luYWwubGluZTtcbiAgICAgICAgICBtYXBwaW5nLm9yaWdpbmFsQ29sdW1uID0gb3JpZ2luYWwuY29sdW1uO1xuICAgICAgICAgIGlmIChvcmlnaW5hbC5uYW1lICE9IG51bGwpIHtcbiAgICAgICAgICAgIG1hcHBpbmcubmFtZSA9IG9yaWdpbmFsLm5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzb3VyY2UgPSBtYXBwaW5nLnNvdXJjZTtcbiAgICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiAhbmV3U291cmNlcy5oYXMoc291cmNlKSkge1xuICAgICAgICBuZXdTb3VyY2VzLmFkZChzb3VyY2UpO1xuICAgICAgfVxuXG4gICAgICB2YXIgbmFtZSA9IG1hcHBpbmcubmFtZTtcbiAgICAgIGlmIChuYW1lICE9IG51bGwgJiYgIW5ld05hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICBuZXdOYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG5cbiAgICB9LCB0aGlzKTtcbiAgICB0aGlzLl9zb3VyY2VzID0gbmV3U291cmNlcztcbiAgICB0aGlzLl9uYW1lcyA9IG5ld05hbWVzO1xuXG4gICAgLy8gQ29weSBzb3VyY2VzQ29udGVudHMgb2YgYXBwbGllZCBtYXAuXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGFTb3VyY2VNYXBQYXRoICE9IG51bGwpIHtcbiAgICAgICAgICBzb3VyY2VGaWxlID0gdXRpbC5qb2luKGFTb3VyY2VNYXBQYXRoLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgICAgc291cmNlRmlsZSA9IHV0aWwucmVsYXRpdmUoc291cmNlUm9vdCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICB9O1xuXG4vKipcbiAqIEEgbWFwcGluZyBjYW4gaGF2ZSBvbmUgb2YgdGhlIHRocmVlIGxldmVscyBvZiBkYXRhOlxuICpcbiAqICAgMS4gSnVzdCB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9uLlxuICogICAyLiBUaGUgR2VuZXJhdGVkIHBvc2l0aW9uLCBvcmlnaW5hbCBwb3NpdGlvbiwgYW5kIG9yaWdpbmFsIHNvdXJjZS5cbiAqICAgMy4gR2VuZXJhdGVkIGFuZCBvcmlnaW5hbCBwb3NpdGlvbiwgb3JpZ2luYWwgc291cmNlLCBhcyB3ZWxsIGFzIGEgbmFtZVxuICogICAgICB0b2tlbi5cbiAqXG4gKiBUbyBtYWludGFpbiBjb25zaXN0ZW5jeSwgd2UgdmFsaWRhdGUgdGhhdCBhbnkgbmV3IG1hcHBpbmcgYmVpbmcgYWRkZWQgZmFsbHNcbiAqIGluIHRvIG9uZSBvZiB0aGVzZSBjYXRlZ29yaWVzLlxuICovXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl92YWxpZGF0ZU1hcHBpbmcgPVxuICBmdW5jdGlvbiBTb3VyY2VNYXBHZW5lcmF0b3JfdmFsaWRhdGVNYXBwaW5nKGFHZW5lcmF0ZWQsIGFPcmlnaW5hbCwgYVNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhTmFtZSkge1xuICAgIC8vIFdoZW4gYU9yaWdpbmFsIGlzIHRydXRoeSBidXQgaGFzIGVtcHR5IHZhbHVlcyBmb3IgLmxpbmUgYW5kIC5jb2x1bW4sXG4gICAgLy8gaXQgaXMgbW9zdCBsaWtlbHkgYSBwcm9ncmFtbWVyIGVycm9yLiBJbiB0aGlzIGNhc2Ugd2UgdGhyb3cgYSB2ZXJ5XG4gICAgLy8gc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSB0byB0cnkgdG8gZ3VpZGUgdGhlbSB0aGUgcmlnaHQgd2F5LlxuICAgIC8vIEZvciBleGFtcGxlOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyLWJ1bmRsZXIvcHVsbC81MTlcbiAgICBpZiAoYU9yaWdpbmFsICYmIHR5cGVvZiBhT3JpZ2luYWwubGluZSAhPT0gJ251bWJlcicgJiYgdHlwZW9mIGFPcmlnaW5hbC5jb2x1bW4gIT09ICdudW1iZXInKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdvcmlnaW5hbC5saW5lIGFuZCBvcmlnaW5hbC5jb2x1bW4gYXJlIG5vdCBudW1iZXJzIC0tIHlvdSBwcm9iYWJseSBtZWFudCB0byBvbWl0ICcgK1xuICAgICAgICAgICAgJ3RoZSBvcmlnaW5hbCBtYXBwaW5nIGVudGlyZWx5IGFuZCBvbmx5IG1hcCB0aGUgZ2VuZXJhdGVkIHBvc2l0aW9uLiBJZiBzbywgcGFzcyAnICtcbiAgICAgICAgICAgICdudWxsIGZvciB0aGUgb3JpZ2luYWwgbWFwcGluZyBpbnN0ZWFkIG9mIGFuIG9iamVjdCB3aXRoIGVtcHR5IG9yIG51bGwgdmFsdWVzLidcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYUdlbmVyYXRlZCAmJiAnbGluZScgaW4gYUdlbmVyYXRlZCAmJiAnY29sdW1uJyBpbiBhR2VuZXJhdGVkXG4gICAgICAgICYmIGFHZW5lcmF0ZWQubGluZSA+IDAgJiYgYUdlbmVyYXRlZC5jb2x1bW4gPj0gMFxuICAgICAgICAmJiAhYU9yaWdpbmFsICYmICFhU291cmNlICYmICFhTmFtZSkge1xuICAgICAgLy8gQ2FzZSAxLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbHNlIGlmIChhR2VuZXJhdGVkICYmICdsaW5lJyBpbiBhR2VuZXJhdGVkICYmICdjb2x1bW4nIGluIGFHZW5lcmF0ZWRcbiAgICAgICAgICAgICAmJiBhT3JpZ2luYWwgJiYgJ2xpbmUnIGluIGFPcmlnaW5hbCAmJiAnY29sdW1uJyBpbiBhT3JpZ2luYWxcbiAgICAgICAgICAgICAmJiBhR2VuZXJhdGVkLmxpbmUgPiAwICYmIGFHZW5lcmF0ZWQuY29sdW1uID49IDBcbiAgICAgICAgICAgICAmJiBhT3JpZ2luYWwubGluZSA+IDAgJiYgYU9yaWdpbmFsLmNvbHVtbiA+PSAwXG4gICAgICAgICAgICAgJiYgYVNvdXJjZSkge1xuICAgICAgLy8gQ2FzZXMgMiBhbmQgMy5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbWFwcGluZzogJyArIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgZ2VuZXJhdGVkOiBhR2VuZXJhdGVkLFxuICAgICAgICBzb3VyY2U6IGFTb3VyY2UsXG4gICAgICAgIG9yaWdpbmFsOiBhT3JpZ2luYWwsXG4gICAgICAgIG5hbWU6IGFOYW1lXG4gICAgICB9KSk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFNlcmlhbGl6ZSB0aGUgYWNjdW11bGF0ZWQgbWFwcGluZ3MgaW4gdG8gdGhlIHN0cmVhbSBvZiBiYXNlIDY0IFZMUXNcbiAqIHNwZWNpZmllZCBieSB0aGUgc291cmNlIG1hcCBmb3JtYXQuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUuX3NlcmlhbGl6ZU1hcHBpbmdzID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3NlcmlhbGl6ZU1hcHBpbmdzKCkge1xuICAgIHZhciBwcmV2aW91c0dlbmVyYXRlZENvbHVtbiA9IDA7XG4gICAgdmFyIHByZXZpb3VzR2VuZXJhdGVkTGluZSA9IDE7XG4gICAgdmFyIHByZXZpb3VzT3JpZ2luYWxDb2x1bW4gPSAwO1xuICAgIHZhciBwcmV2aW91c09yaWdpbmFsTGluZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzTmFtZSA9IDA7XG4gICAgdmFyIHByZXZpb3VzU291cmNlID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgdmFyIG5leHQ7XG4gICAgdmFyIG1hcHBpbmc7XG4gICAgdmFyIG5hbWVJZHg7XG4gICAgdmFyIHNvdXJjZUlkeDtcblxuICAgIHZhciBtYXBwaW5ncyA9IHRoaXMuX21hcHBpbmdzLnRvQXJyYXkoKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbWFwcGluZ3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIG1hcHBpbmcgPSBtYXBwaW5nc1tpXTtcbiAgICAgIG5leHQgPSAnJ1xuXG4gICAgICBpZiAobWFwcGluZy5nZW5lcmF0ZWRMaW5lICE9PSBwcmV2aW91c0dlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgcHJldmlvdXNHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICB3aGlsZSAobWFwcGluZy5nZW5lcmF0ZWRMaW5lICE9PSBwcmV2aW91c0dlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICBuZXh0ICs9ICc7JztcbiAgICAgICAgICBwcmV2aW91c0dlbmVyYXRlZExpbmUrKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGlmIChpID4gMCkge1xuICAgICAgICAgIGlmICghdXRpbC5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZChtYXBwaW5nLCBtYXBwaW5nc1tpIC0gMV0pKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbmV4dCArPSAnLCc7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgIHByZXZpb3VzR2VuZXJhdGVkQ29sdW1uID0gbWFwcGluZy5nZW5lcmF0ZWRDb2x1bW47XG5cbiAgICAgIGlmIChtYXBwaW5nLnNvdXJjZSAhPSBudWxsKSB7XG4gICAgICAgIHNvdXJjZUlkeCA9IHRoaXMuX3NvdXJjZXMuaW5kZXhPZihtYXBwaW5nLnNvdXJjZSk7XG4gICAgICAgIG5leHQgKz0gYmFzZTY0VkxRLmVuY29kZShzb3VyY2VJZHggLSBwcmV2aW91c1NvdXJjZSk7XG4gICAgICAgIHByZXZpb3VzU291cmNlID0gc291cmNlSWR4O1xuXG4gICAgICAgIC8vIGxpbmVzIGFyZSBzdG9yZWQgMC1iYXNlZCBpbiBTb3VyY2VNYXAgc3BlYyB2ZXJzaW9uIDNcbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcub3JpZ2luYWxMaW5lIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHByZXZpb3VzT3JpZ2luYWxMaW5lKTtcbiAgICAgICAgcHJldmlvdXNPcmlnaW5hbExpbmUgPSBtYXBwaW5nLm9yaWdpbmFsTGluZSAtIDE7XG5cbiAgICAgICAgbmV4dCArPSBiYXNlNjRWTFEuZW5jb2RlKG1hcHBpbmcub3JpZ2luYWxDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBwcmV2aW91c09yaWdpbmFsQ29sdW1uKTtcbiAgICAgICAgcHJldmlvdXNPcmlnaW5hbENvbHVtbiA9IG1hcHBpbmcub3JpZ2luYWxDb2x1bW47XG5cbiAgICAgICAgaWYgKG1hcHBpbmcubmFtZSAhPSBudWxsKSB7XG4gICAgICAgICAgbmFtZUlkeCA9IHRoaXMuX25hbWVzLmluZGV4T2YobWFwcGluZy5uYW1lKTtcbiAgICAgICAgICBuZXh0ICs9IGJhc2U2NFZMUS5lbmNvZGUobmFtZUlkeCAtIHByZXZpb3VzTmFtZSk7XG4gICAgICAgICAgcHJldmlvdXNOYW1lID0gbmFtZUlkeDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXN1bHQgKz0gbmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG5Tb3VyY2VNYXBHZW5lcmF0b3IucHJvdG90eXBlLl9nZW5lcmF0ZVNvdXJjZXNDb250ZW50ID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX2dlbmVyYXRlU291cmNlc0NvbnRlbnQoYVNvdXJjZXMsIGFTb3VyY2VSb290KSB7XG4gICAgcmV0dXJuIGFTb3VyY2VzLm1hcChmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgICBpZiAoIXRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChhU291cmNlUm9vdCAhPSBudWxsKSB7XG4gICAgICAgIHNvdXJjZSA9IHV0aWwucmVsYXRpdmUoYVNvdXJjZVJvb3QsIHNvdXJjZSk7XG4gICAgICB9XG4gICAgICB2YXIga2V5ID0gdXRpbC50b1NldFN0cmluZyhzb3VyY2UpO1xuICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9zb3VyY2VzQ29udGVudHMsIGtleSlcbiAgICAgICAgPyB0aGlzLl9zb3VyY2VzQ29udGVudHNba2V5XVxuICAgICAgICA6IG51bGw7XG4gICAgfSwgdGhpcyk7XG4gIH07XG5cbi8qKlxuICogRXh0ZXJuYWxpemUgdGhlIHNvdXJjZSBtYXAuXG4gKi9cblNvdXJjZU1hcEdlbmVyYXRvci5wcm90b3R5cGUudG9KU09OID1cbiAgZnVuY3Rpb24gU291cmNlTWFwR2VuZXJhdG9yX3RvSlNPTigpIHtcbiAgICB2YXIgbWFwID0ge1xuICAgICAgdmVyc2lvbjogdGhpcy5fdmVyc2lvbixcbiAgICAgIHNvdXJjZXM6IHRoaXMuX3NvdXJjZXMudG9BcnJheSgpLFxuICAgICAgbmFtZXM6IHRoaXMuX25hbWVzLnRvQXJyYXkoKSxcbiAgICAgIG1hcHBpbmdzOiB0aGlzLl9zZXJpYWxpemVNYXBwaW5ncygpXG4gICAgfTtcbiAgICBpZiAodGhpcy5fZmlsZSAhPSBudWxsKSB7XG4gICAgICBtYXAuZmlsZSA9IHRoaXMuX2ZpbGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VSb290ICE9IG51bGwpIHtcbiAgICAgIG1hcC5zb3VyY2VSb290ID0gdGhpcy5fc291cmNlUm9vdDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZXNDb250ZW50cykge1xuICAgICAgbWFwLnNvdXJjZXNDb250ZW50ID0gdGhpcy5fZ2VuZXJhdGVTb3VyY2VzQ29udGVudChtYXAuc291cmNlcywgbWFwLnNvdXJjZVJvb3QpO1xuICAgIH1cblxuICAgIHJldHVybiBtYXA7XG4gIH07XG5cbi8qKlxuICogUmVuZGVyIHRoZSBzb3VyY2UgbWFwIGJlaW5nIGdlbmVyYXRlZCB0byBhIHN0cmluZy5cbiAqL1xuU291cmNlTWFwR2VuZXJhdG9yLnByb3RvdHlwZS50b1N0cmluZyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU1hcEdlbmVyYXRvcl90b1N0cmluZygpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy50b0pTT04oKSk7XG4gIH07XG5cbmV4cG9ydHMuU291cmNlTWFwR2VuZXJhdG9yID0gU291cmNlTWFwR2VuZXJhdG9yO1xuIiwiLyogLSotIE1vZGU6IGpzOyBqcy1pbmRlbnQtbGV2ZWw6IDI7IC0qLSAqL1xuLypcbiAqIENvcHlyaWdodCAyMDExIE1vemlsbGEgRm91bmRhdGlvbiBhbmQgY29udHJpYnV0b3JzXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTmV3IEJTRCBsaWNlbnNlLiBTZWUgTElDRU5TRSBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuXG52YXIgU291cmNlTWFwR2VuZXJhdG9yID0gcmVxdWlyZSgnLi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbnZhciB1dGlsID0gcmVxdWlyZSgnLi91dGlsJyk7XG5cbi8vIE1hdGNoZXMgYSBXaW5kb3dzLXN0eWxlIGBcXHJcXG5gIG5ld2xpbmUgb3IgYSBgXFxuYCBuZXdsaW5lIHVzZWQgYnkgYWxsIG90aGVyXG4vLyBvcGVyYXRpbmcgc3lzdGVtcyB0aGVzZSBkYXlzIChjYXB0dXJpbmcgdGhlIHJlc3VsdCkuXG52YXIgUkVHRVhfTkVXTElORSA9IC8oXFxyP1xcbikvO1xuXG4vLyBOZXdsaW5lIGNoYXJhY3RlciBjb2RlIGZvciBjaGFyQ29kZUF0KCkgY29tcGFyaXNvbnNcbnZhciBORVdMSU5FX0NPREUgPSAxMDtcblxuLy8gUHJpdmF0ZSBzeW1ib2wgZm9yIGlkZW50aWZ5aW5nIGBTb3VyY2VOb2RlYHMgd2hlbiBtdWx0aXBsZSB2ZXJzaW9ucyBvZlxuLy8gdGhlIHNvdXJjZS1tYXAgbGlicmFyeSBhcmUgbG9hZGVkLiBUaGlzIE1VU1QgTk9UIENIQU5HRSBhY3Jvc3Ncbi8vIHZlcnNpb25zIVxudmFyIGlzU291cmNlTm9kZSA9IFwiJCQkaXNTb3VyY2VOb2RlJCQkXCI7XG5cbi8qKlxuICogU291cmNlTm9kZXMgcHJvdmlkZSBhIHdheSB0byBhYnN0cmFjdCBvdmVyIGludGVycG9sYXRpbmcvY29uY2F0ZW5hdGluZ1xuICogc25pcHBldHMgb2YgZ2VuZXJhdGVkIEphdmFTY3JpcHQgc291cmNlIGNvZGUgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIGxpbmUgYW5kXG4gKiBjb2x1bW4gaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS5cbiAqXG4gKiBAcGFyYW0gYUxpbmUgVGhlIG9yaWdpbmFsIGxpbmUgbnVtYmVyLlxuICogQHBhcmFtIGFDb2x1bW4gVGhlIG9yaWdpbmFsIGNvbHVtbiBudW1iZXIuXG4gKiBAcGFyYW0gYVNvdXJjZSBUaGUgb3JpZ2luYWwgc291cmNlJ3MgZmlsZW5hbWUuXG4gKiBAcGFyYW0gYUNodW5rcyBPcHRpb25hbC4gQW4gYXJyYXkgb2Ygc3RyaW5ncyB3aGljaCBhcmUgc25pcHBldHMgb2ZcbiAqICAgICAgICBnZW5lcmF0ZWQgSlMsIG9yIG90aGVyIFNvdXJjZU5vZGVzLlxuICogQHBhcmFtIGFOYW1lIFRoZSBvcmlnaW5hbCBpZGVudGlmaWVyLlxuICovXG5mdW5jdGlvbiBTb3VyY2VOb2RlKGFMaW5lLCBhQ29sdW1uLCBhU291cmNlLCBhQ2h1bmtzLCBhTmFtZSkge1xuICB0aGlzLmNoaWxkcmVuID0gW107XG4gIHRoaXMuc291cmNlQ29udGVudHMgPSB7fTtcbiAgdGhpcy5saW5lID0gYUxpbmUgPT0gbnVsbCA/IG51bGwgOiBhTGluZTtcbiAgdGhpcy5jb2x1bW4gPSBhQ29sdW1uID09IG51bGwgPyBudWxsIDogYUNvbHVtbjtcbiAgdGhpcy5zb3VyY2UgPSBhU291cmNlID09IG51bGwgPyBudWxsIDogYVNvdXJjZTtcbiAgdGhpcy5uYW1lID0gYU5hbWUgPT0gbnVsbCA/IG51bGwgOiBhTmFtZTtcbiAgdGhpc1tpc1NvdXJjZU5vZGVdID0gdHJ1ZTtcbiAgaWYgKGFDaHVua3MgIT0gbnVsbCkgdGhpcy5hZGQoYUNodW5rcyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFNvdXJjZU5vZGUgZnJvbSBnZW5lcmF0ZWQgY29kZSBhbmQgYSBTb3VyY2VNYXBDb25zdW1lci5cbiAqXG4gKiBAcGFyYW0gYUdlbmVyYXRlZENvZGUgVGhlIGdlbmVyYXRlZCBjb2RlXG4gKiBAcGFyYW0gYVNvdXJjZU1hcENvbnN1bWVyIFRoZSBTb3VyY2VNYXAgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZVxuICogQHBhcmFtIGFSZWxhdGl2ZVBhdGggT3B0aW9uYWwuIFRoZSBwYXRoIHRoYXQgcmVsYXRpdmUgc291cmNlcyBpbiB0aGVcbiAqICAgICAgICBTb3VyY2VNYXBDb25zdW1lciBzaG91bGQgYmUgcmVsYXRpdmUgdG8uXG4gKi9cblNvdXJjZU5vZGUuZnJvbVN0cmluZ1dpdGhTb3VyY2VNYXAgPVxuICBmdW5jdGlvbiBTb3VyY2VOb2RlX2Zyb21TdHJpbmdXaXRoU291cmNlTWFwKGFHZW5lcmF0ZWRDb2RlLCBhU291cmNlTWFwQ29uc3VtZXIsIGFSZWxhdGl2ZVBhdGgpIHtcbiAgICAvLyBUaGUgU291cmNlTm9kZSB3ZSB3YW50IHRvIGZpbGwgd2l0aCB0aGUgZ2VuZXJhdGVkIGNvZGVcbiAgICAvLyBhbmQgdGhlIFNvdXJjZU1hcFxuICAgIHZhciBub2RlID0gbmV3IFNvdXJjZU5vZGUoKTtcblxuICAgIC8vIEFsbCBldmVuIGluZGljZXMgb2YgdGhpcyBhcnJheSBhcmUgb25lIGxpbmUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLFxuICAgIC8vIHdoaWxlIGFsbCBvZGQgaW5kaWNlcyBhcmUgdGhlIG5ld2xpbmVzIGJldHdlZW4gdHdvIGFkamFjZW50IGxpbmVzXG4gICAgLy8gKHNpbmNlIGBSRUdFWF9ORVdMSU5FYCBjYXB0dXJlcyBpdHMgbWF0Y2gpLlxuICAgIC8vIFByb2Nlc3NlZCBmcmFnbWVudHMgYXJlIGFjY2Vzc2VkIGJ5IGNhbGxpbmcgYHNoaWZ0TmV4dExpbmVgLlxuICAgIHZhciByZW1haW5pbmdMaW5lcyA9IGFHZW5lcmF0ZWRDb2RlLnNwbGl0KFJFR0VYX05FV0xJTkUpO1xuICAgIHZhciByZW1haW5pbmdMaW5lc0luZGV4ID0gMDtcbiAgICB2YXIgc2hpZnROZXh0TGluZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxpbmVDb250ZW50cyA9IGdldE5leHRMaW5lKCk7XG4gICAgICAvLyBUaGUgbGFzdCBsaW5lIG9mIGEgZmlsZSBtaWdodCBub3QgaGF2ZSBhIG5ld2xpbmUuXG4gICAgICB2YXIgbmV3TGluZSA9IGdldE5leHRMaW5lKCkgfHwgXCJcIjtcbiAgICAgIHJldHVybiBsaW5lQ29udGVudHMgKyBuZXdMaW5lO1xuXG4gICAgICBmdW5jdGlvbiBnZXROZXh0TGluZSgpIHtcbiAgICAgICAgcmV0dXJuIHJlbWFpbmluZ0xpbmVzSW5kZXggPCByZW1haW5pbmdMaW5lcy5sZW5ndGggP1xuICAgICAgICAgICAgcmVtYWluaW5nTGluZXNbcmVtYWluaW5nTGluZXNJbmRleCsrXSA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gV2UgbmVlZCB0byByZW1lbWJlciB0aGUgcG9zaXRpb24gb2YgXCJyZW1haW5pbmdMaW5lc1wiXG4gICAgdmFyIGxhc3RHZW5lcmF0ZWRMaW5lID0gMSwgbGFzdEdlbmVyYXRlZENvbHVtbiA9IDA7XG5cbiAgICAvLyBUaGUgZ2VuZXJhdGUgU291cmNlTm9kZXMgd2UgbmVlZCBhIGNvZGUgcmFuZ2UuXG4gICAgLy8gVG8gZXh0cmFjdCBpdCBjdXJyZW50IGFuZCBsYXN0IG1hcHBpbmcgaXMgdXNlZC5cbiAgICAvLyBIZXJlIHdlIHN0b3JlIHRoZSBsYXN0IG1hcHBpbmcuXG4gICAgdmFyIGxhc3RNYXBwaW5nID0gbnVsbDtcblxuICAgIGFTb3VyY2VNYXBDb25zdW1lci5lYWNoTWFwcGluZyhmdW5jdGlvbiAobWFwcGluZykge1xuICAgICAgaWYgKGxhc3RNYXBwaW5nICE9PSBudWxsKSB7XG4gICAgICAgIC8vIFdlIGFkZCB0aGUgY29kZSBmcm9tIFwibGFzdE1hcHBpbmdcIiB0byBcIm1hcHBpbmdcIjpcbiAgICAgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSBuZXcgbGluZSBpbiBiZXR3ZWVuLlxuICAgICAgICBpZiAobGFzdEdlbmVyYXRlZExpbmUgPCBtYXBwaW5nLmdlbmVyYXRlZExpbmUpIHtcbiAgICAgICAgICAvLyBBc3NvY2lhdGUgZmlyc3QgbGluZSB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgc2hpZnROZXh0TGluZSgpKTtcbiAgICAgICAgICBsYXN0R2VuZXJhdGVkTGluZSsrO1xuICAgICAgICAgIGxhc3RHZW5lcmF0ZWRDb2x1bW4gPSAwO1xuICAgICAgICAgIC8vIFRoZSByZW1haW5pbmcgY29kZSBpcyBhZGRlZCB3aXRob3V0IG1hcHBpbmdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBuZXcgbGluZSBpbiBiZXR3ZWVuLlxuICAgICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgY29kZSBiZXR3ZWVuIFwibGFzdEdlbmVyYXRlZENvbHVtblwiIGFuZFxuICAgICAgICAgIC8vIFwibWFwcGluZy5nZW5lcmF0ZWRDb2x1bW5cIiB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICAgIHZhciBuZXh0TGluZSA9IHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdIHx8ICcnO1xuICAgICAgICAgIHZhciBjb2RlID0gbmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0R2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgICByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSA9IG5leHRMaW5lLnN1YnN0cihtYXBwaW5nLmdlbmVyYXRlZENvbHVtbiAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbik7XG4gICAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgICAgIGFkZE1hcHBpbmdXaXRoQ29kZShsYXN0TWFwcGluZywgY29kZSk7XG4gICAgICAgICAgLy8gTm8gbW9yZSByZW1haW5pbmcgY29kZSwgY29udGludWVcbiAgICAgICAgICBsYXN0TWFwcGluZyA9IG1hcHBpbmc7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBXZSBhZGQgdGhlIGdlbmVyYXRlZCBjb2RlIHVudGlsIHRoZSBmaXJzdCBtYXBwaW5nXG4gICAgICAvLyB0byB0aGUgU291cmNlTm9kZSB3aXRob3V0IGFueSBtYXBwaW5nLlxuICAgICAgLy8gRWFjaCBsaW5lIGlzIGFkZGVkIGFzIHNlcGFyYXRlIHN0cmluZy5cbiAgICAgIHdoaWxlIChsYXN0R2VuZXJhdGVkTGluZSA8IG1hcHBpbmcuZ2VuZXJhdGVkTGluZSkge1xuICAgICAgICBub2RlLmFkZChzaGlmdE5leHRMaW5lKCkpO1xuICAgICAgICBsYXN0R2VuZXJhdGVkTGluZSsrO1xuICAgICAgfVxuICAgICAgaWYgKGxhc3RHZW5lcmF0ZWRDb2x1bW4gPCBtYXBwaW5nLmdlbmVyYXRlZENvbHVtbikge1xuICAgICAgICB2YXIgbmV4dExpbmUgPSByZW1haW5pbmdMaW5lc1tyZW1haW5pbmdMaW5lc0luZGV4XSB8fCAnJztcbiAgICAgICAgbm9kZS5hZGQobmV4dExpbmUuc3Vic3RyKDAsIG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKSk7XG4gICAgICAgIHJlbWFpbmluZ0xpbmVzW3JlbWFpbmluZ0xpbmVzSW5kZXhdID0gbmV4dExpbmUuc3Vic3RyKG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uKTtcbiAgICAgICAgbGFzdEdlbmVyYXRlZENvbHVtbiA9IG1hcHBpbmcuZ2VuZXJhdGVkQ29sdW1uO1xuICAgICAgfVxuICAgICAgbGFzdE1hcHBpbmcgPSBtYXBwaW5nO1xuICAgIH0sIHRoaXMpO1xuICAgIC8vIFdlIGhhdmUgcHJvY2Vzc2VkIGFsbCBtYXBwaW5ncy5cbiAgICBpZiAocmVtYWluaW5nTGluZXNJbmRleCA8IHJlbWFpbmluZ0xpbmVzLmxlbmd0aCkge1xuICAgICAgaWYgKGxhc3RNYXBwaW5nKSB7XG4gICAgICAgIC8vIEFzc29jaWF0ZSB0aGUgcmVtYWluaW5nIGNvZGUgaW4gdGhlIGN1cnJlbnQgbGluZSB3aXRoIFwibGFzdE1hcHBpbmdcIlxuICAgICAgICBhZGRNYXBwaW5nV2l0aENvZGUobGFzdE1hcHBpbmcsIHNoaWZ0TmV4dExpbmUoKSk7XG4gICAgICB9XG4gICAgICAvLyBhbmQgYWRkIHRoZSByZW1haW5pbmcgbGluZXMgd2l0aG91dCBhbnkgbWFwcGluZ1xuICAgICAgbm9kZS5hZGQocmVtYWluaW5nTGluZXMuc3BsaWNlKHJlbWFpbmluZ0xpbmVzSW5kZXgpLmpvaW4oXCJcIikpO1xuICAgIH1cblxuICAgIC8vIENvcHkgc291cmNlc0NvbnRlbnQgaW50byBTb3VyY2VOb2RlXG4gICAgYVNvdXJjZU1hcENvbnN1bWVyLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbiAoc291cmNlRmlsZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSBhU291cmNlTWFwQ29uc3VtZXIuc291cmNlQ29udGVudEZvcihzb3VyY2VGaWxlKTtcbiAgICAgIGlmIChjb250ZW50ICE9IG51bGwpIHtcbiAgICAgICAgaWYgKGFSZWxhdGl2ZVBhdGggIT0gbnVsbCkge1xuICAgICAgICAgIHNvdXJjZUZpbGUgPSB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgc291cmNlRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5zZXRTb3VyY2VDb250ZW50KHNvdXJjZUZpbGUsIGNvbnRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5vZGU7XG5cbiAgICBmdW5jdGlvbiBhZGRNYXBwaW5nV2l0aENvZGUobWFwcGluZywgY29kZSkge1xuICAgICAgaWYgKG1hcHBpbmcgPT09IG51bGwgfHwgbWFwcGluZy5zb3VyY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBub2RlLmFkZChjb2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhUmVsYXRpdmVQYXRoXG4gICAgICAgICAgPyB1dGlsLmpvaW4oYVJlbGF0aXZlUGF0aCwgbWFwcGluZy5zb3VyY2UpXG4gICAgICAgICAgOiBtYXBwaW5nLnNvdXJjZTtcbiAgICAgICAgbm9kZS5hZGQobmV3IFNvdXJjZU5vZGUobWFwcGluZy5vcmlnaW5hbExpbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcub3JpZ2luYWxDb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZy5uYW1lKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEFkZCBhIGNodW5rIG9mIGdlbmVyYXRlZCBKUyB0byB0aGlzIHNvdXJjZSBub2RlLlxuICpcbiAqIEBwYXJhbSBhQ2h1bmsgQSBzdHJpbmcgc25pcHBldCBvZiBnZW5lcmF0ZWQgSlMgY29kZSwgYW5vdGhlciBpbnN0YW5jZSBvZlxuICogICAgICAgIFNvdXJjZU5vZGUsIG9yIGFuIGFycmF5IHdoZXJlIGVhY2ggbWVtYmVyIGlzIG9uZSBvZiB0aG9zZSB0aGluZ3MuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfYWRkKGFDaHVuaykge1xuICBpZiAoQXJyYXkuaXNBcnJheShhQ2h1bmspKSB7XG4gICAgYUNodW5rLmZvckVhY2goZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICB0aGlzLmFkZChjaHVuayk7XG4gICAgfSwgdGhpcyk7XG4gIH1cbiAgZWxzZSBpZiAoYUNodW5rW2lzU291cmNlTm9kZV0gfHwgdHlwZW9mIGFDaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgIGlmIChhQ2h1bmspIHtcbiAgICAgIHRoaXMuY2hpbGRyZW4ucHVzaChhQ2h1bmspO1xuICAgIH1cbiAgfVxuICBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgXCJFeHBlY3RlZCBhIFNvdXJjZU5vZGUsIHN0cmluZywgb3IgYW4gYXJyYXkgb2YgU291cmNlTm9kZXMgYW5kIHN0cmluZ3MuIEdvdCBcIiArIGFDaHVua1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIEFkZCBhIGNodW5rIG9mIGdlbmVyYXRlZCBKUyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc291cmNlIG5vZGUuXG4gKlxuICogQHBhcmFtIGFDaHVuayBBIHN0cmluZyBzbmlwcGV0IG9mIGdlbmVyYXRlZCBKUyBjb2RlLCBhbm90aGVyIGluc3RhbmNlIG9mXG4gKiAgICAgICAgU291cmNlTm9kZSwgb3IgYW4gYXJyYXkgd2hlcmUgZWFjaCBtZW1iZXIgaXMgb25lIG9mIHRob3NlIHRoaW5ncy5cbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUucHJlcGVuZCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfcHJlcGVuZChhQ2h1bmspIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYUNodW5rKSkge1xuICAgIGZvciAodmFyIGkgPSBhQ2h1bmsubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0aGlzLnByZXBlbmQoYUNodW5rW2ldKTtcbiAgICB9XG4gIH1cbiAgZWxzZSBpZiAoYUNodW5rW2lzU291cmNlTm9kZV0gfHwgdHlwZW9mIGFDaHVuayA9PT0gXCJzdHJpbmdcIikge1xuICAgIHRoaXMuY2hpbGRyZW4udW5zaGlmdChhQ2h1bmspO1xuICB9XG4gIGVsc2Uge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICBcIkV4cGVjdGVkIGEgU291cmNlTm9kZSwgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBTb3VyY2VOb2RlcyBhbmQgc3RyaW5ncy4gR290IFwiICsgYUNodW5rXG4gICAgKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogV2FsayBvdmVyIHRoZSB0cmVlIG9mIEpTIHNuaXBwZXRzIGluIHRoaXMgbm9kZSBhbmQgaXRzIGNoaWxkcmVuLiBUaGVcbiAqIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggc25pcHBldCBvZiBKUyBhbmQgaXMgcGFzc2VkIHRoYXRcbiAqIHNuaXBwZXQgYW5kIHRoZSBpdHMgb3JpZ2luYWwgYXNzb2NpYXRlZCBzb3VyY2UncyBsaW5lL2NvbHVtbiBsb2NhdGlvbi5cbiAqXG4gKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLndhbGsgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3dhbGsoYUZuKSB7XG4gIHZhciBjaHVuaztcbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBjaHVuayA9IHRoaXMuY2hpbGRyZW5baV07XG4gICAgaWYgKGNodW5rW2lzU291cmNlTm9kZV0pIHtcbiAgICAgIGNodW5rLndhbGsoYUZuKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAoY2h1bmsgIT09ICcnKSB7XG4gICAgICAgIGFGbihjaHVuaywgeyBzb3VyY2U6IHRoaXMuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgbGluZTogdGhpcy5saW5lLFxuICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbixcbiAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubmFtZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogTGlrZSBgU3RyaW5nLnByb3RvdHlwZS5qb2luYCBleGNlcHQgZm9yIFNvdXJjZU5vZGVzLiBJbnNlcnRzIGBhU3RyYCBiZXR3ZWVuXG4gKiBlYWNoIG9mIGB0aGlzLmNoaWxkcmVuYC5cbiAqXG4gKiBAcGFyYW0gYVNlcCBUaGUgc2VwYXJhdG9yLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5qb2luID0gZnVuY3Rpb24gU291cmNlTm9kZV9qb2luKGFTZXApIHtcbiAgdmFyIG5ld0NoaWxkcmVuO1xuICB2YXIgaTtcbiAgdmFyIGxlbiA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoO1xuICBpZiAobGVuID4gMCkge1xuICAgIG5ld0NoaWxkcmVuID0gW107XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbi0xOyBpKyspIHtcbiAgICAgIG5ld0NoaWxkcmVuLnB1c2godGhpcy5jaGlsZHJlbltpXSk7XG4gICAgICBuZXdDaGlsZHJlbi5wdXNoKGFTZXApO1xuICAgIH1cbiAgICBuZXdDaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5baV0pO1xuICAgIHRoaXMuY2hpbGRyZW4gPSBuZXdDaGlsZHJlbjtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogQ2FsbCBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Ugb24gdGhlIHZlcnkgcmlnaHQtbW9zdCBzb3VyY2Ugc25pcHBldC4gVXNlZnVsXG4gKiBmb3IgdHJpbW1pbmcgd2hpdGVzcGFjZSBmcm9tIHRoZSBlbmQgb2YgYSBzb3VyY2Ugbm9kZSwgZXRjLlxuICpcbiAqIEBwYXJhbSBhUGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLlxuICogQHBhcmFtIGFSZXBsYWNlbWVudCBUaGUgdGhpbmcgdG8gcmVwbGFjZSB0aGUgcGF0dGVybiB3aXRoLlxuICovXG5Tb3VyY2VOb2RlLnByb3RvdHlwZS5yZXBsYWNlUmlnaHQgPSBmdW5jdGlvbiBTb3VyY2VOb2RlX3JlcGxhY2VSaWdodChhUGF0dGVybiwgYVJlcGxhY2VtZW50KSB7XG4gIHZhciBsYXN0Q2hpbGQgPSB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV07XG4gIGlmIChsYXN0Q2hpbGRbaXNTb3VyY2VOb2RlXSkge1xuICAgIGxhc3RDaGlsZC5yZXBsYWNlUmlnaHQoYVBhdHRlcm4sIGFSZXBsYWNlbWVudCk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIGxhc3RDaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICB0aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoIC0gMV0gPSBsYXN0Q2hpbGQucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KTtcbiAgfVxuICBlbHNlIHtcbiAgICB0aGlzLmNoaWxkcmVuLnB1c2goJycucmVwbGFjZShhUGF0dGVybiwgYVJlcGxhY2VtZW50KSk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgc291cmNlIGNvbnRlbnQgZm9yIGEgc291cmNlIGZpbGUuIFRoaXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgU291cmNlTWFwR2VuZXJhdG9yXG4gKiBpbiB0aGUgc291cmNlc0NvbnRlbnQgZmllbGQuXG4gKlxuICogQHBhcmFtIGFTb3VyY2VGaWxlIFRoZSBmaWxlbmFtZSBvZiB0aGUgc291cmNlIGZpbGVcbiAqIEBwYXJhbSBhU291cmNlQ29udGVudCBUaGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGVcbiAqL1xuU291cmNlTm9kZS5wcm90b3R5cGUuc2V0U291cmNlQ29udGVudCA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfc2V0U291cmNlQ29udGVudChhU291cmNlRmlsZSwgYVNvdXJjZUNvbnRlbnQpIHtcbiAgICB0aGlzLnNvdXJjZUNvbnRlbnRzW3V0aWwudG9TZXRTdHJpbmcoYVNvdXJjZUZpbGUpXSA9IGFTb3VyY2VDb250ZW50O1xuICB9O1xuXG4vKipcbiAqIFdhbGsgb3ZlciB0aGUgdHJlZSBvZiBTb3VyY2VOb2Rlcy4gVGhlIHdhbGtpbmcgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoXG4gKiBzb3VyY2UgZmlsZSBjb250ZW50IGFuZCBpcyBwYXNzZWQgdGhlIGZpbGVuYW1lIGFuZCBzb3VyY2UgY29udGVudC5cbiAqXG4gKiBAcGFyYW0gYUZuIFRoZSB0cmF2ZXJzYWwgZnVuY3Rpb24uXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLndhbGtTb3VyY2VDb250ZW50cyA9XG4gIGZ1bmN0aW9uIFNvdXJjZU5vZGVfd2Fsa1NvdXJjZUNvbnRlbnRzKGFGbikge1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBpZiAodGhpcy5jaGlsZHJlbltpXVtpc1NvdXJjZU5vZGVdKSB7XG4gICAgICAgIHRoaXMuY2hpbGRyZW5baV0ud2Fsa1NvdXJjZUNvbnRlbnRzKGFGbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNvdXJjZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZUNvbnRlbnRzKTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gc291cmNlcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgYUZuKHV0aWwuZnJvbVNldFN0cmluZyhzb3VyY2VzW2ldKSwgdGhpcy5zb3VyY2VDb250ZW50c1tzb3VyY2VzW2ldXSk7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc291cmNlIG5vZGUuIFdhbGtzIG92ZXIgdGhlIHRyZWVcbiAqIGFuZCBjb25jYXRlbmF0ZXMgYWxsIHRoZSB2YXJpb3VzIHNuaXBwZXRzIHRvZ2V0aGVyIHRvIG9uZSBzdHJpbmcuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gU291cmNlTm9kZV90b1N0cmluZygpIHtcbiAgdmFyIHN0ciA9IFwiXCI7XG4gIHRoaXMud2FsayhmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBzdHIgKz0gY2h1bms7XG4gIH0pO1xuICByZXR1cm4gc3RyO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBzb3VyY2Ugbm9kZSBhbG9uZyB3aXRoIGEgc291cmNlXG4gKiBtYXAuXG4gKi9cblNvdXJjZU5vZGUucHJvdG90eXBlLnRvU3RyaW5nV2l0aFNvdXJjZU1hcCA9IGZ1bmN0aW9uIFNvdXJjZU5vZGVfdG9TdHJpbmdXaXRoU291cmNlTWFwKGFBcmdzKSB7XG4gIHZhciBnZW5lcmF0ZWQgPSB7XG4gICAgY29kZTogXCJcIixcbiAgICBsaW5lOiAxLFxuICAgIGNvbHVtbjogMFxuICB9O1xuICB2YXIgbWFwID0gbmV3IFNvdXJjZU1hcEdlbmVyYXRvcihhQXJncyk7XG4gIHZhciBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gIHZhciBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICB2YXIgbGFzdE9yaWdpbmFsTGluZSA9IG51bGw7XG4gIHZhciBsYXN0T3JpZ2luYWxDb2x1bW4gPSBudWxsO1xuICB2YXIgbGFzdE9yaWdpbmFsTmFtZSA9IG51bGw7XG4gIHRoaXMud2FsayhmdW5jdGlvbiAoY2h1bmssIG9yaWdpbmFsKSB7XG4gICAgZ2VuZXJhdGVkLmNvZGUgKz0gY2h1bms7XG4gICAgaWYgKG9yaWdpbmFsLnNvdXJjZSAhPT0gbnVsbFxuICAgICAgICAmJiBvcmlnaW5hbC5saW5lICE9PSBudWxsXG4gICAgICAgICYmIG9yaWdpbmFsLmNvbHVtbiAhPT0gbnVsbCkge1xuICAgICAgaWYobGFzdE9yaWdpbmFsU291cmNlICE9PSBvcmlnaW5hbC5zb3VyY2VcbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbExpbmUgIT09IG9yaWdpbmFsLmxpbmVcbiAgICAgICAgIHx8IGxhc3RPcmlnaW5hbENvbHVtbiAhPT0gb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICB8fCBsYXN0T3JpZ2luYWxOYW1lICE9PSBvcmlnaW5hbC5uYW1lKSB7XG4gICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICBzb3VyY2U6IG9yaWdpbmFsLnNvdXJjZSxcbiAgICAgICAgICBvcmlnaW5hbDoge1xuICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSxcbiAgICAgICAgICAgIGNvbHVtbjogb3JpZ2luYWwuY29sdW1uXG4gICAgICAgICAgfSxcbiAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgIGxpbmU6IGdlbmVyYXRlZC5saW5lLFxuICAgICAgICAgICAgY29sdW1uOiBnZW5lcmF0ZWQuY29sdW1uXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gb3JpZ2luYWwuc291cmNlO1xuICAgICAgbGFzdE9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmxpbmU7XG4gICAgICBsYXN0T3JpZ2luYWxDb2x1bW4gPSBvcmlnaW5hbC5jb2x1bW47XG4gICAgICBsYXN0T3JpZ2luYWxOYW1lID0gb3JpZ2luYWwubmFtZTtcbiAgICAgIHNvdXJjZU1hcHBpbmdBY3RpdmUgPSB0cnVlO1xuICAgIH0gZWxzZSBpZiAoc291cmNlTWFwcGluZ0FjdGl2ZSkge1xuICAgICAgbWFwLmFkZE1hcHBpbmcoe1xuICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICBsaW5lOiBnZW5lcmF0ZWQubGluZSxcbiAgICAgICAgICBjb2x1bW46IGdlbmVyYXRlZC5jb2x1bW5cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsYXN0T3JpZ2luYWxTb3VyY2UgPSBudWxsO1xuICAgICAgc291cmNlTWFwcGluZ0FjdGl2ZSA9IGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKHZhciBpZHggPSAwLCBsZW5ndGggPSBjaHVuay5sZW5ndGg7IGlkeCA8IGxlbmd0aDsgaWR4KyspIHtcbiAgICAgIGlmIChjaHVuay5jaGFyQ29kZUF0KGlkeCkgPT09IE5FV0xJTkVfQ09ERSkge1xuICAgICAgICBnZW5lcmF0ZWQubGluZSsrO1xuICAgICAgICBnZW5lcmF0ZWQuY29sdW1uID0gMDtcbiAgICAgICAgLy8gTWFwcGluZ3MgZW5kIGF0IGVvbFxuICAgICAgICBpZiAoaWR4ICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgbGFzdE9yaWdpbmFsU291cmNlID0gbnVsbDtcbiAgICAgICAgICBzb3VyY2VNYXBwaW5nQWN0aXZlID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoc291cmNlTWFwcGluZ0FjdGl2ZSkge1xuICAgICAgICAgIG1hcC5hZGRNYXBwaW5nKHtcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luYWwuc291cmNlLFxuICAgICAgICAgICAgb3JpZ2luYWw6IHtcbiAgICAgICAgICAgICAgbGluZTogb3JpZ2luYWwubGluZSxcbiAgICAgICAgICAgICAgY29sdW1uOiBvcmlnaW5hbC5jb2x1bW5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZW5lcmF0ZWQ6IHtcbiAgICAgICAgICAgICAgbGluZTogZ2VuZXJhdGVkLmxpbmUsXG4gICAgICAgICAgICAgIGNvbHVtbjogZ2VuZXJhdGVkLmNvbHVtblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZ2VuZXJhdGVkLmNvbHVtbisrO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHRoaXMud2Fsa1NvdXJjZUNvbnRlbnRzKGZ1bmN0aW9uIChzb3VyY2VGaWxlLCBzb3VyY2VDb250ZW50KSB7XG4gICAgbWFwLnNldFNvdXJjZUNvbnRlbnQoc291cmNlRmlsZSwgc291cmNlQ29udGVudCk7XG4gIH0pO1xuXG4gIHJldHVybiB7IGNvZGU6IGdlbmVyYXRlZC5jb2RlLCBtYXA6IG1hcCB9O1xufTtcblxuZXhwb3J0cy5Tb3VyY2VOb2RlID0gU291cmNlTm9kZTtcbiIsIi8qIC0qLSBNb2RlOiBqczsganMtaW5kZW50LWxldmVsOiAyOyAtKi0gKi9cbi8qXG4gKiBDb3B5cmlnaHQgMjAxMSBNb3ppbGxhIEZvdW5kYXRpb24gYW5kIGNvbnRyaWJ1dG9yc1xuICogTGljZW5zZWQgdW5kZXIgdGhlIE5ldyBCU0QgbGljZW5zZS4gU2VlIExJQ0VOU0Ugb3I6XG4gKiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHZhbHVlcyBmcm9tIHBhcmFtZXRlci9vcHRpb25zXG4gKiBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSBhcmdzIFRoZSBvYmplY3Qgd2UgYXJlIGV4dHJhY3RpbmcgdmFsdWVzIGZyb21cbiAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3ZSBhcmUgZ2V0dGluZy5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgQW4gb3B0aW9uYWwgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nXG4gKiBmcm9tIHRoZSBvYmplY3QuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIHByb3BlcnR5IGlzIG1pc3NpbmcsIGFuXG4gKiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAqL1xuZnVuY3Rpb24gZ2V0QXJnKGFBcmdzLCBhTmFtZSwgYURlZmF1bHRWYWx1ZSkge1xuICBpZiAoYU5hbWUgaW4gYUFyZ3MpIHtcbiAgICByZXR1cm4gYUFyZ3NbYU5hbWVdO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICByZXR1cm4gYURlZmF1bHRWYWx1ZTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1wiJyArIGFOYW1lICsgJ1wiIGlzIGEgcmVxdWlyZWQgYXJndW1lbnQuJyk7XG4gIH1cbn1cbmV4cG9ydHMuZ2V0QXJnID0gZ2V0QXJnO1xuXG52YXIgdXJsUmVnZXhwID0gL14oPzooW1xcdytcXC0uXSspOik/XFwvXFwvKD86KFxcdys6XFx3KylAKT8oW1xcdy4tXSopKD86OihcXGQrKSk/KC4qKSQvO1xudmFyIGRhdGFVcmxSZWdleHAgPSAvXmRhdGE6LitcXCwuKyQvO1xuXG5mdW5jdGlvbiB1cmxQYXJzZShhVXJsKSB7XG4gIHZhciBtYXRjaCA9IGFVcmwubWF0Y2godXJsUmVnZXhwKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiB7XG4gICAgc2NoZW1lOiBtYXRjaFsxXSxcbiAgICBhdXRoOiBtYXRjaFsyXSxcbiAgICBob3N0OiBtYXRjaFszXSxcbiAgICBwb3J0OiBtYXRjaFs0XSxcbiAgICBwYXRoOiBtYXRjaFs1XVxuICB9O1xufVxuZXhwb3J0cy51cmxQYXJzZSA9IHVybFBhcnNlO1xuXG5mdW5jdGlvbiB1cmxHZW5lcmF0ZShhUGFyc2VkVXJsKSB7XG4gIHZhciB1cmwgPSAnJztcbiAgaWYgKGFQYXJzZWRVcmwuc2NoZW1lKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuc2NoZW1lICsgJzonO1xuICB9XG4gIHVybCArPSAnLy8nO1xuICBpZiAoYVBhcnNlZFVybC5hdXRoKSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuYXV0aCArICdAJztcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5ob3N0KSB7XG4gICAgdXJsICs9IGFQYXJzZWRVcmwuaG9zdDtcbiAgfVxuICBpZiAoYVBhcnNlZFVybC5wb3J0KSB7XG4gICAgdXJsICs9IFwiOlwiICsgYVBhcnNlZFVybC5wb3J0XG4gIH1cbiAgaWYgKGFQYXJzZWRVcmwucGF0aCkge1xuICAgIHVybCArPSBhUGFyc2VkVXJsLnBhdGg7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cbmV4cG9ydHMudXJsR2VuZXJhdGUgPSB1cmxHZW5lcmF0ZTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgcGF0aCwgb3IgdGhlIHBhdGggcG9ydGlvbiBvZiBhIFVSTDpcbiAqXG4gKiAtIFJlcGxhY2VzIGNvbnNlY3V0aXZlIHNsYXNoZXMgd2l0aCBvbmUgc2xhc2guXG4gKiAtIFJlbW92ZXMgdW5uZWNlc3NhcnkgJy4nIHBhcnRzLlxuICogLSBSZW1vdmVzIHVubmVjZXNzYXJ5ICc8ZGlyPi8uLicgcGFydHMuXG4gKlxuICogQmFzZWQgb24gY29kZSBpbiB0aGUgTm9kZS5qcyAncGF0aCcgY29yZSBtb2R1bGUuXG4gKlxuICogQHBhcmFtIGFQYXRoIFRoZSBwYXRoIG9yIHVybCB0byBub3JtYWxpemUuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZShhUGF0aCkge1xuICB2YXIgcGF0aCA9IGFQYXRoO1xuICB2YXIgdXJsID0gdXJsUGFyc2UoYVBhdGgpO1xuICBpZiAodXJsKSB7XG4gICAgaWYgKCF1cmwucGF0aCkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cbiAgICBwYXRoID0gdXJsLnBhdGg7XG4gIH1cbiAgdmFyIGlzQWJzb2x1dGUgPSBleHBvcnRzLmlzQWJzb2x1dGUocGF0aCk7XG5cbiAgdmFyIHBhcnRzID0gcGF0aC5zcGxpdCgvXFwvKy8pO1xuICBmb3IgKHZhciBwYXJ0LCB1cCA9IDAsIGkgPSBwYXJ0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIHBhcnQgPSBwYXJ0c1tpXTtcbiAgICBpZiAocGFydCA9PT0gJy4nKSB7XG4gICAgICBwYXJ0cy5zcGxpY2UoaSwgMSk7XG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICB1cCsrO1xuICAgIH0gZWxzZSBpZiAodXAgPiAwKSB7XG4gICAgICBpZiAocGFydCA9PT0gJycpIHtcbiAgICAgICAgLy8gVGhlIGZpcnN0IHBhcnQgaXMgYmxhbmsgaWYgdGhlIHBhdGggaXMgYWJzb2x1dGUuIFRyeWluZyB0byBnb1xuICAgICAgICAvLyBhYm92ZSB0aGUgcm9vdCBpcyBhIG5vLW9wLiBUaGVyZWZvcmUgd2UgY2FuIHJlbW92ZSBhbGwgJy4uJyBwYXJ0c1xuICAgICAgICAvLyBkaXJlY3RseSBhZnRlciB0aGUgcm9vdC5cbiAgICAgICAgcGFydHMuc3BsaWNlKGkgKyAxLCB1cCk7XG4gICAgICAgIHVwID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhcnRzLnNwbGljZShpLCAyKTtcbiAgICAgICAgdXAtLTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcGF0aCA9IHBhcnRzLmpvaW4oJy8nKTtcblxuICBpZiAocGF0aCA9PT0gJycpIHtcbiAgICBwYXRoID0gaXNBYnNvbHV0ZSA/ICcvJyA6ICcuJztcbiAgfVxuXG4gIGlmICh1cmwpIHtcbiAgICB1cmwucGF0aCA9IHBhdGg7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKHVybCk7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5leHBvcnRzLm5vcm1hbGl6ZSA9IG5vcm1hbGl6ZTtcblxuLyoqXG4gKiBKb2lucyB0d28gcGF0aHMvVVJMcy5cbiAqXG4gKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIGpvaW5lZCB3aXRoIHRoZSByb290LlxuICpcbiAqIC0gSWYgYVBhdGggaXMgYSBVUkwgb3IgYSBkYXRhIFVSSSwgYVBhdGggaXMgcmV0dXJuZWQsIHVubGVzcyBhUGF0aCBpcyBhXG4gKiAgIHNjaGVtZS1yZWxhdGl2ZSBVUkw6IFRoZW4gdGhlIHNjaGVtZSBvZiBhUm9vdCwgaWYgYW55LCBpcyBwcmVwZW5kZWRcbiAqICAgZmlyc3QuXG4gKiAtIE90aGVyd2lzZSBhUGF0aCBpcyBhIHBhdGguIElmIGFSb290IGlzIGEgVVJMLCB0aGVuIGl0cyBwYXRoIHBvcnRpb25cbiAqICAgaXMgdXBkYXRlZCB3aXRoIHRoZSByZXN1bHQgYW5kIGFSb290IGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIHJlc3VsdFxuICogICBpcyByZXR1cm5lZC5cbiAqICAgLSBJZiBhUGF0aCBpcyBhYnNvbHV0ZSwgdGhlIHJlc3VsdCBpcyBhUGF0aC5cbiAqICAgLSBPdGhlcndpc2UgdGhlIHR3byBwYXRocyBhcmUgam9pbmVkIHdpdGggYSBzbGFzaC5cbiAqIC0gSm9pbmluZyBmb3IgZXhhbXBsZSAnaHR0cDovLycgYW5kICd3d3cuZXhhbXBsZS5jb20nIGlzIGFsc28gc3VwcG9ydGVkLlxuICovXG5mdW5jdGlvbiBqb2luKGFSb290LCBhUGF0aCkge1xuICBpZiAoYVJvb3QgPT09IFwiXCIpIHtcbiAgICBhUm9vdCA9IFwiLlwiO1xuICB9XG4gIGlmIChhUGF0aCA9PT0gXCJcIikge1xuICAgIGFQYXRoID0gXCIuXCI7XG4gIH1cbiAgdmFyIGFQYXRoVXJsID0gdXJsUGFyc2UoYVBhdGgpO1xuICB2YXIgYVJvb3RVcmwgPSB1cmxQYXJzZShhUm9vdCk7XG4gIGlmIChhUm9vdFVybCkge1xuICAgIGFSb290ID0gYVJvb3RVcmwucGF0aCB8fCAnLyc7XG4gIH1cblxuICAvLyBgam9pbihmb28sICcvL3d3dy5leGFtcGxlLm9yZycpYFxuICBpZiAoYVBhdGhVcmwgJiYgIWFQYXRoVXJsLnNjaGVtZSkge1xuICAgIGlmIChhUm9vdFVybCkge1xuICAgICAgYVBhdGhVcmwuc2NoZW1lID0gYVJvb3RVcmwuc2NoZW1lO1xuICAgIH1cbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVBhdGhVcmwpO1xuICB9XG5cbiAgaWYgKGFQYXRoVXJsIHx8IGFQYXRoLm1hdGNoKGRhdGFVcmxSZWdleHApKSB7XG4gICAgcmV0dXJuIGFQYXRoO1xuICB9XG5cbiAgLy8gYGpvaW4oJ2h0dHA6Ly8nLCAnd3d3LmV4YW1wbGUuY29tJylgXG4gIGlmIChhUm9vdFVybCAmJiAhYVJvb3RVcmwuaG9zdCAmJiAhYVJvb3RVcmwucGF0aCkge1xuICAgIGFSb290VXJsLmhvc3QgPSBhUGF0aDtcbiAgICByZXR1cm4gdXJsR2VuZXJhdGUoYVJvb3RVcmwpO1xuICB9XG5cbiAgdmFyIGpvaW5lZCA9IGFQYXRoLmNoYXJBdCgwKSA9PT0gJy8nXG4gICAgPyBhUGF0aFxuICAgIDogbm9ybWFsaXplKGFSb290LnJlcGxhY2UoL1xcLyskLywgJycpICsgJy8nICsgYVBhdGgpO1xuXG4gIGlmIChhUm9vdFVybCkge1xuICAgIGFSb290VXJsLnBhdGggPSBqb2luZWQ7XG4gICAgcmV0dXJuIHVybEdlbmVyYXRlKGFSb290VXJsKTtcbiAgfVxuICByZXR1cm4gam9pbmVkO1xufVxuZXhwb3J0cy5qb2luID0gam9pbjtcblxuZXhwb3J0cy5pc0Fic29sdXRlID0gZnVuY3Rpb24gKGFQYXRoKSB7XG4gIHJldHVybiBhUGF0aC5jaGFyQXQoMCkgPT09ICcvJyB8fCB1cmxSZWdleHAudGVzdChhUGF0aCk7XG59O1xuXG4vKipcbiAqIE1ha2UgYSBwYXRoIHJlbGF0aXZlIHRvIGEgVVJMIG9yIGFub3RoZXIgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYVJvb3QgVGhlIHJvb3QgcGF0aCBvciBVUkwuXG4gKiBAcGFyYW0gYVBhdGggVGhlIHBhdGggb3IgVVJMIHRvIGJlIG1hZGUgcmVsYXRpdmUgdG8gYVJvb3QuXG4gKi9cbmZ1bmN0aW9uIHJlbGF0aXZlKGFSb290LCBhUGF0aCkge1xuICBpZiAoYVJvb3QgPT09IFwiXCIpIHtcbiAgICBhUm9vdCA9IFwiLlwiO1xuICB9XG5cbiAgYVJvb3QgPSBhUm9vdC5yZXBsYWNlKC9cXC8kLywgJycpO1xuXG4gIC8vIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcGF0aCB0byBiZSBhYm92ZSB0aGUgcm9vdC4gSW4gdGhpcyBjYXNlLCBzaW1wbHlcbiAgLy8gY2hlY2tpbmcgd2hldGhlciB0aGUgcm9vdCBpcyBhIHByZWZpeCBvZiB0aGUgcGF0aCB3b24ndCB3b3JrLiBJbnN0ZWFkLCB3ZVxuICAvLyBuZWVkIHRvIHJlbW92ZSBjb21wb25lbnRzIGZyb20gdGhlIHJvb3Qgb25lIGJ5IG9uZSwgdW50aWwgZWl0aGVyIHdlIGZpbmRcbiAgLy8gYSBwcmVmaXggdGhhdCBmaXRzLCBvciB3ZSBydW4gb3V0IG9mIGNvbXBvbmVudHMgdG8gcmVtb3ZlLlxuICB2YXIgbGV2ZWwgPSAwO1xuICB3aGlsZSAoYVBhdGguaW5kZXhPZihhUm9vdCArICcvJykgIT09IDApIHtcbiAgICB2YXIgaW5kZXggPSBhUm9vdC5sYXN0SW5kZXhPZihcIi9cIik7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIGFQYXRoO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSBvbmx5IHBhcnQgb2YgdGhlIHJvb3QgdGhhdCBpcyBsZWZ0IGlzIHRoZSBzY2hlbWUgKGkuZS4gaHR0cDovLyxcbiAgICAvLyBmaWxlOi8vLywgZXRjLiksIG9uZSBvciBtb3JlIHNsYXNoZXMgKC8pLCBvciBzaW1wbHkgbm90aGluZyBhdCBhbGwsIHdlXG4gICAgLy8gaGF2ZSBleGhhdXN0ZWQgYWxsIGNvbXBvbmVudHMsIHNvIHRoZSBwYXRoIGlzIG5vdCByZWxhdGl2ZSB0byB0aGUgcm9vdC5cbiAgICBhUm9vdCA9IGFSb290LnNsaWNlKDAsIGluZGV4KTtcbiAgICBpZiAoYVJvb3QubWF0Y2goL14oW15cXC9dKzpcXC8pP1xcLyokLykpIHtcbiAgICAgIHJldHVybiBhUGF0aDtcbiAgICB9XG5cbiAgICArK2xldmVsO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHdlIGFkZCBhIFwiLi4vXCIgZm9yIGVhY2ggY29tcG9uZW50IHdlIHJlbW92ZWQgZnJvbSB0aGUgcm9vdC5cbiAgcmV0dXJuIEFycmF5KGxldmVsICsgMSkuam9pbihcIi4uL1wiKSArIGFQYXRoLnN1YnN0cihhUm9vdC5sZW5ndGggKyAxKTtcbn1cbmV4cG9ydHMucmVsYXRpdmUgPSByZWxhdGl2ZTtcblxudmFyIHN1cHBvcnRzTnVsbFByb3RvID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIG9iaiA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHJldHVybiAhKCdfX3Byb3RvX18nIGluIG9iaik7XG59KCkpO1xuXG5mdW5jdGlvbiBpZGVudGl0eSAocykge1xuICByZXR1cm4gcztcbn1cblxuLyoqXG4gKiBCZWNhdXNlIGJlaGF2aW9yIGdvZXMgd2Fja3kgd2hlbiB5b3Ugc2V0IGBfX3Byb3RvX19gIG9uIG9iamVjdHMsIHdlXG4gKiBoYXZlIHRvIHByZWZpeCBhbGwgdGhlIHN0cmluZ3MgaW4gb3VyIHNldCB3aXRoIGFuIGFyYml0cmFyeSBjaGFyYWN0ZXIuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvcHVsbC8zMSBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3NvdXJjZS1tYXAvaXNzdWVzLzMwXG4gKlxuICogQHBhcmFtIFN0cmluZyBhU3RyXG4gKi9cbmZ1bmN0aW9uIHRvU2V0U3RyaW5nKGFTdHIpIHtcbiAgaWYgKGlzUHJvdG9TdHJpbmcoYVN0cikpIHtcbiAgICByZXR1cm4gJyQnICsgYVN0cjtcbiAgfVxuXG4gIHJldHVybiBhU3RyO1xufVxuZXhwb3J0cy50b1NldFN0cmluZyA9IHN1cHBvcnRzTnVsbFByb3RvID8gaWRlbnRpdHkgOiB0b1NldFN0cmluZztcblxuZnVuY3Rpb24gZnJvbVNldFN0cmluZyhhU3RyKSB7XG4gIGlmIChpc1Byb3RvU3RyaW5nKGFTdHIpKSB7XG4gICAgcmV0dXJuIGFTdHIuc2xpY2UoMSk7XG4gIH1cblxuICByZXR1cm4gYVN0cjtcbn1cbmV4cG9ydHMuZnJvbVNldFN0cmluZyA9IHN1cHBvcnRzTnVsbFByb3RvID8gaWRlbnRpdHkgOiBmcm9tU2V0U3RyaW5nO1xuXG5mdW5jdGlvbiBpc1Byb3RvU3RyaW5nKHMpIHtcbiAgaWYgKCFzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIGxlbmd0aCA9IHMubGVuZ3RoO1xuXG4gIGlmIChsZW5ndGggPCA5IC8qIFwiX19wcm90b19fXCIubGVuZ3RoICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHMuY2hhckNvZGVBdChsZW5ndGggLSAxKSAhPT0gOTUgIC8qICdfJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDIpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gMykgIT09IDExMSAvKiAnbycgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA0KSAhPT0gMTE2IC8qICd0JyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDUpICE9PSAxMTEgLyogJ28nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gNikgIT09IDExNCAvKiAncicgKi8gfHxcbiAgICAgIHMuY2hhckNvZGVBdChsZW5ndGggLSA3KSAhPT0gMTEyIC8qICdwJyAqLyB8fFxuICAgICAgcy5jaGFyQ29kZUF0KGxlbmd0aCAtIDgpICE9PSA5NSAgLyogJ18nICovIHx8XG4gICAgICBzLmNoYXJDb2RlQXQobGVuZ3RoIC0gOSkgIT09IDk1ICAvKiAnXycgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKHZhciBpID0gbGVuZ3RoIC0gMTA7IGkgPj0gMDsgaS0tKSB7XG4gICAgaWYgKHMuY2hhckNvZGVBdChpKSAhPT0gMzYgLyogJyQnICovKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ29tcGFyYXRvciBiZXR3ZWVuIHR3byBtYXBwaW5ncyB3aGVyZSB0aGUgb3JpZ2luYWwgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAqXG4gKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gKiBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIG9yaWdpbmFsIHNvdXJjZS9saW5lL2NvbHVtbiwgYnV0IGRpZmZlcmVudCBnZW5lcmF0ZWRcbiAqIGxpbmUgYW5kIGNvbHVtbiB0aGUgc2FtZS4gVXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBhIG1hcHBpbmcgd2l0aCBhXG4gKiBzdHViYmVkIG91dCBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucyhtYXBwaW5nQSwgbWFwcGluZ0IsIG9ubHlDb21wYXJlT3JpZ2luYWwpIHtcbiAgdmFyIGNtcCA9IHN0cmNtcChtYXBwaW5nQS5zb3VyY2UsIG1hcHBpbmdCLnNvdXJjZSk7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxMaW5lIC0gbWFwcGluZ0Iub3JpZ2luYWxMaW5lO1xuICBpZiAoY21wICE9PSAwKSB7XG4gICAgcmV0dXJuIGNtcDtcbiAgfVxuXG4gIGNtcCA9IG1hcHBpbmdBLm9yaWdpbmFsQ29sdW1uIC0gbWFwcGluZ0Iub3JpZ2luYWxDb2x1bW47XG4gIGlmIChjbXAgIT09IDAgfHwgb25seUNvbXBhcmVPcmlnaW5hbCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0EuZ2VuZXJhdGVkTGluZSAtIG1hcHBpbmdCLmdlbmVyYXRlZExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgcmV0dXJuIHN0cmNtcChtYXBwaW5nQS5uYW1lLCBtYXBwaW5nQi5uYW1lKTtcbn1cbmV4cG9ydHMuY29tcGFyZUJ5T3JpZ2luYWxQb3NpdGlvbnMgPSBjb21wYXJlQnlPcmlnaW5hbFBvc2l0aW9ucztcblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdpdGggZGVmbGF0ZWQgc291cmNlIGFuZCBuYW1lIGluZGljZXMgd2hlcmVcbiAqIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAqXG4gKiBPcHRpb25hbGx5IHBhc3MgaW4gYHRydWVgIGFzIGBvbmx5Q29tcGFyZUdlbmVyYXRlZGAgdG8gY29uc2lkZXIgdHdvXG4gKiBtYXBwaW5ncyB3aXRoIHRoZSBzYW1lIGdlbmVyYXRlZCBsaW5lIGFuZCBjb2x1bW4sIGJ1dCBkaWZmZXJlbnRcbiAqIHNvdXJjZS9uYW1lL29yaWdpbmFsIGxpbmUgYW5kIGNvbHVtbiB0aGUgc2FtZS4gVXNlZnVsIHdoZW4gc2VhcmNoaW5nIGZvciBhXG4gKiBtYXBwaW5nIHdpdGggYSBzdHViYmVkIG91dCBtYXBwaW5nLlxuICovXG5mdW5jdGlvbiBjb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZChtYXBwaW5nQSwgbWFwcGluZ0IsIG9ubHlDb21wYXJlR2VuZXJhdGVkKSB7XG4gIHZhciBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDAgfHwgb25seUNvbXBhcmVHZW5lcmF0ZWQpIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNEZWZsYXRlZCA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0RlZmxhdGVkO1xuXG5mdW5jdGlvbiBzdHJjbXAoYVN0cjEsIGFTdHIyKSB7XG4gIGlmIChhU3RyMSA9PT0gYVN0cjIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChhU3RyMSA9PT0gbnVsbCkge1xuICAgIHJldHVybiAxOyAvLyBhU3RyMiAhPT0gbnVsbFxuICB9XG5cbiAgaWYgKGFTdHIyID09PSBudWxsKSB7XG4gICAgcmV0dXJuIC0xOyAvLyBhU3RyMSAhPT0gbnVsbFxuICB9XG5cbiAgaWYgKGFTdHIxID4gYVN0cjIpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuLyoqXG4gKiBDb21wYXJhdG9yIGJldHdlZW4gdHdvIG1hcHBpbmdzIHdpdGggaW5mbGF0ZWQgc291cmNlIGFuZCBuYW1lIHN0cmluZ3Mgd2hlcmVcbiAqIHRoZSBnZW5lcmF0ZWQgcG9zaXRpb25zIGFyZSBjb21wYXJlZC5cbiAqL1xuZnVuY3Rpb24gY29tcGFyZUJ5R2VuZXJhdGVkUG9zaXRpb25zSW5mbGF0ZWQobWFwcGluZ0EsIG1hcHBpbmdCKSB7XG4gIHZhciBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRMaW5lIC0gbWFwcGluZ0IuZ2VuZXJhdGVkTGluZTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5nZW5lcmF0ZWRDb2x1bW4gLSBtYXBwaW5nQi5nZW5lcmF0ZWRDb2x1bW47XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gc3RyY21wKG1hcHBpbmdBLnNvdXJjZSwgbWFwcGluZ0Iuc291cmNlKTtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICBjbXAgPSBtYXBwaW5nQS5vcmlnaW5hbExpbmUgLSBtYXBwaW5nQi5vcmlnaW5hbExpbmU7XG4gIGlmIChjbXAgIT09IDApIHtcbiAgICByZXR1cm4gY21wO1xuICB9XG5cbiAgY21wID0gbWFwcGluZ0Eub3JpZ2luYWxDb2x1bW4gLSBtYXBwaW5nQi5vcmlnaW5hbENvbHVtbjtcbiAgaWYgKGNtcCAhPT0gMCkge1xuICAgIHJldHVybiBjbXA7XG4gIH1cblxuICByZXR1cm4gc3RyY21wKG1hcHBpbmdBLm5hbWUsIG1hcHBpbmdCLm5hbWUpO1xufVxuZXhwb3J0cy5jb21wYXJlQnlHZW5lcmF0ZWRQb3NpdGlvbnNJbmZsYXRlZCA9IGNvbXBhcmVCeUdlbmVyYXRlZFBvc2l0aW9uc0luZmxhdGVkO1xuXG4vKipcbiAqIFN0cmlwIGFueSBKU09OIFhTU0kgYXZvaWRhbmNlIHByZWZpeCBmcm9tIHRoZSBzdHJpbmcgKGFzIGRvY3VtZW50ZWRcbiAqIGluIHRoZSBzb3VyY2UgbWFwcyBzcGVjaWZpY2F0aW9uKSwgYW5kIHRoZW4gcGFyc2UgdGhlIHN0cmluZyBhc1xuICogSlNPTi5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTb3VyY2VNYXBJbnB1dChzdHIpIHtcbiAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyLnJlcGxhY2UoL15cXCldfSdbXlxcbl0qXFxuLywgJycpKTtcbn1cbmV4cG9ydHMucGFyc2VTb3VyY2VNYXBJbnB1dCA9IHBhcnNlU291cmNlTWFwSW5wdXQ7XG5cbi8qKlxuICogQ29tcHV0ZSB0aGUgVVJMIG9mIGEgc291cmNlIGdpdmVuIHRoZSB0aGUgc291cmNlIHJvb3QsIHRoZSBzb3VyY2Unc1xuICogVVJMLCBhbmQgdGhlIHNvdXJjZSBtYXAncyBVUkwuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVTb3VyY2VVUkwoc291cmNlUm9vdCwgc291cmNlVVJMLCBzb3VyY2VNYXBVUkwpIHtcbiAgc291cmNlVVJMID0gc291cmNlVVJMIHx8ICcnO1xuXG4gIGlmIChzb3VyY2VSb290KSB7XG4gICAgLy8gVGhpcyBmb2xsb3dzIHdoYXQgQ2hyb21lIGRvZXMuXG4gICAgaWYgKHNvdXJjZVJvb3Rbc291cmNlUm9vdC5sZW5ndGggLSAxXSAhPT0gJy8nICYmIHNvdXJjZVVSTFswXSAhPT0gJy8nKSB7XG4gICAgICBzb3VyY2VSb290ICs9ICcvJztcbiAgICB9XG4gICAgLy8gVGhlIHNwZWMgc2F5czpcbiAgICAvLyAgIExpbmUgNDogQW4gb3B0aW9uYWwgc291cmNlIHJvb3QsIHVzZWZ1bCBmb3IgcmVsb2NhdGluZyBzb3VyY2VcbiAgICAvLyAgIGZpbGVzIG9uIGEgc2VydmVyIG9yIHJlbW92aW5nIHJlcGVhdGVkIHZhbHVlcyBpbiB0aGVcbiAgICAvLyAgIOKAnHNvdXJjZXPigJ0gZW50cnkuICBUaGlzIHZhbHVlIGlzIHByZXBlbmRlZCB0byB0aGUgaW5kaXZpZHVhbFxuICAgIC8vICAgZW50cmllcyBpbiB0aGUg4oCcc291cmNl4oCdIGZpZWxkLlxuICAgIHNvdXJjZVVSTCA9IHNvdXJjZVJvb3QgKyBzb3VyY2VVUkw7XG4gIH1cblxuICAvLyBIaXN0b3JpY2FsbHksIFNvdXJjZU1hcENvbnN1bWVyIGRpZCBub3QgdGFrZSB0aGUgc291cmNlTWFwVVJMIGFzXG4gIC8vIGEgcGFyYW1ldGVyLiAgVGhpcyBtb2RlIGlzIHN0aWxsIHNvbWV3aGF0IHN1cHBvcnRlZCwgd2hpY2ggaXMgd2h5XG4gIC8vIHRoaXMgY29kZSBibG9jayBpcyBjb25kaXRpb25hbC4gIEhvd2V2ZXIsIGl0J3MgcHJlZmVyYWJsZSB0byBwYXNzXG4gIC8vIHRoZSBzb3VyY2UgbWFwIFVSTCB0byBTb3VyY2VNYXBDb25zdW1lciwgc28gdGhhdCB0aGlzIGZ1bmN0aW9uXG4gIC8vIGNhbiBpbXBsZW1lbnQgdGhlIHNvdXJjZSBVUkwgcmVzb2x1dGlvbiBhbGdvcml0aG0gYXMgb3V0bGluZWQgaW5cbiAgLy8gdGhlIHNwZWMuICBUaGlzIGJsb2NrIGlzIGJhc2ljYWxseSB0aGUgZXF1aXZhbGVudCBvZjpcbiAgLy8gICAgbmV3IFVSTChzb3VyY2VVUkwsIHNvdXJjZU1hcFVSTCkudG9TdHJpbmcoKVxuICAvLyAuLi4gZXhjZXB0IGl0IGF2b2lkcyB1c2luZyBVUkwsIHdoaWNoIHdhc24ndCBhdmFpbGFibGUgaW4gdGhlXG4gIC8vIG9sZGVyIHJlbGVhc2VzIG9mIG5vZGUgc3RpbGwgc3VwcG9ydGVkIGJ5IHRoaXMgbGlicmFyeS5cbiAgLy9cbiAgLy8gVGhlIHNwZWMgc2F5czpcbiAgLy8gICBJZiB0aGUgc291cmNlcyBhcmUgbm90IGFic29sdXRlIFVSTHMgYWZ0ZXIgcHJlcGVuZGluZyBvZiB0aGVcbiAgLy8gICDigJxzb3VyY2VSb2904oCdLCB0aGUgc291cmNlcyBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlXG4gIC8vICAgU291cmNlTWFwIChsaWtlIHJlc29sdmluZyBzY3JpcHQgc3JjIGluIGEgaHRtbCBkb2N1bWVudCkuXG4gIGlmIChzb3VyY2VNYXBVUkwpIHtcbiAgICB2YXIgcGFyc2VkID0gdXJsUGFyc2Uoc291cmNlTWFwVVJMKTtcbiAgICBpZiAoIXBhcnNlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic291cmNlTWFwVVJMIGNvdWxkIG5vdCBiZSBwYXJzZWRcIik7XG4gICAgfVxuICAgIGlmIChwYXJzZWQucGF0aCkge1xuICAgICAgLy8gU3RyaXAgdGhlIGxhc3QgcGF0aCBjb21wb25lbnQsIGJ1dCBrZWVwIHRoZSBcIi9cIi5cbiAgICAgIHZhciBpbmRleCA9IHBhcnNlZC5wYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICBwYXJzZWQucGF0aCA9IHBhcnNlZC5wYXRoLnN1YnN0cmluZygwLCBpbmRleCArIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3VyY2VVUkwgPSBqb2luKHVybEdlbmVyYXRlKHBhcnNlZCksIHNvdXJjZVVSTCk7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplKHNvdXJjZVVSTCk7XG59XG5leHBvcnRzLmNvbXB1dGVTb3VyY2VVUkwgPSBjb21wdXRlU291cmNlVVJMO1xuIiwiLypcbiAqIENvcHlyaWdodCAyMDA5LTIwMTEgTW96aWxsYSBGb3VuZGF0aW9uIGFuZCBjb250cmlidXRvcnNcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBOZXcgQlNEIGxpY2Vuc2UuIFNlZSBMSUNFTlNFLnR4dCBvcjpcbiAqIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcbiAqL1xuZXhwb3J0cy5Tb3VyY2VNYXBHZW5lcmF0b3IgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWdlbmVyYXRvcicpLlNvdXJjZU1hcEdlbmVyYXRvcjtcbmV4cG9ydHMuU291cmNlTWFwQ29uc3VtZXIgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2UtbWFwLWNvbnN1bWVyJykuU291cmNlTWFwQ29uc3VtZXI7XG5leHBvcnRzLlNvdXJjZU5vZGUgPSByZXF1aXJlKCcuL2xpYi9zb3VyY2Utbm9kZScpLlNvdXJjZU5vZGU7XG4iLCJyZXF1aXJlKCcuLycpLmluc3RhbGwoKTtcbiIsInZhciBTb3VyY2VNYXBDb25zdW1lciA9IHJlcXVpcmUoJ3NvdXJjZS1tYXAnKS5Tb3VyY2VNYXBDb25zdW1lcjtcbnZhciBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG52YXIgZnM7XG50cnkge1xuICBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyB8fCAhZnMucmVhZEZpbGVTeW5jKSB7XG4gICAgLy8gZnMgZG9lc24ndCBoYXZlIGFsbCBtZXRob2RzIHdlIG5lZWRcbiAgICBmcyA9IG51bGw7XG4gIH1cbn0gY2F0Y2ggKGVycikge1xuICAvKiBub3AgKi9cbn1cblxudmFyIGJ1ZmZlckZyb20gPSByZXF1aXJlKCdidWZmZXItZnJvbScpO1xuXG4vKipcbiAqIFJlcXVpcmVzIGEgbW9kdWxlIHdoaWNoIGlzIHByb3RlY3RlZCBhZ2FpbnN0IGJ1bmRsZXIgbWluaWZpY2F0aW9uLlxuICpcbiAqIEBwYXJhbSB7Tm9kZU1vZHVsZX0gbW9kXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdFxuICovXG5mdW5jdGlvbiBkeW5hbWljUmVxdWlyZShtb2QsIHJlcXVlc3QpIHtcbiAgcmV0dXJuIG1vZC5yZXF1aXJlKHJlcXVlc3QpO1xufVxuXG4vLyBPbmx5IGluc3RhbGwgb25jZSBpZiBjYWxsZWQgbXVsdGlwbGUgdGltZXNcbnZhciBlcnJvckZvcm1hdHRlckluc3RhbGxlZCA9IGZhbHNlO1xudmFyIHVuY2F1Z2h0U2hpbUluc3RhbGxlZCA9IGZhbHNlO1xuXG4vLyBJZiB0cnVlLCB0aGUgY2FjaGVzIGFyZSByZXNldCBiZWZvcmUgYSBzdGFjayB0cmFjZSBmb3JtYXR0aW5nIG9wZXJhdGlvblxudmFyIGVtcHR5Q2FjaGVCZXR3ZWVuT3BlcmF0aW9ucyA9IGZhbHNlO1xuXG4vLyBTdXBwb3J0cyB7YnJvd3Nlciwgbm9kZSwgYXV0b31cbnZhciBlbnZpcm9ubWVudCA9IFwiYXV0b1wiO1xuXG4vLyBNYXBzIGEgZmlsZSBwYXRoIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGZpbGUgY29udGVudHNcbnZhciBmaWxlQ29udGVudHNDYWNoZSA9IHt9O1xuXG4vLyBNYXBzIGEgZmlsZSBwYXRoIHRvIGEgc291cmNlIG1hcCBmb3IgdGhhdCBmaWxlXG52YXIgc291cmNlTWFwQ2FjaGUgPSB7fTtcblxuLy8gUmVnZXggZm9yIGRldGVjdGluZyBzb3VyY2UgbWFwc1xudmFyIHJlU291cmNlTWFwID0gL15kYXRhOmFwcGxpY2F0aW9uXFwvanNvblteLF0rYmFzZTY0LC87XG5cbi8vIFByaW9yaXR5IGxpc3Qgb2YgcmV0cmlldmUgaGFuZGxlcnNcbnZhciByZXRyaWV2ZUZpbGVIYW5kbGVycyA9IFtdO1xudmFyIHJldHJpZXZlTWFwSGFuZGxlcnMgPSBbXTtcblxuZnVuY3Rpb24gaXNJbkJyb3dzZXIoKSB7XG4gIGlmIChlbnZpcm9ubWVudCA9PT0gXCJicm93c2VyXCIpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmIChlbnZpcm9ubWVudCA9PT0gXCJub2RlXCIpXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgJiYgKHR5cGVvZiBYTUxIdHRwUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJykgJiYgISh3aW5kb3cucmVxdWlyZSAmJiB3aW5kb3cubW9kdWxlICYmIHdpbmRvdy5wcm9jZXNzICYmIHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09IFwicmVuZGVyZXJcIikpO1xufVxuXG5mdW5jdGlvbiBoYXNHbG9iYWxQcm9jZXNzRXZlbnRFbWl0dGVyKCkge1xuICByZXR1cm4gKCh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcpICYmIChwcm9jZXNzICE9PSBudWxsKSAmJiAodHlwZW9mIHByb2Nlc3Mub24gPT09ICdmdW5jdGlvbicpKTtcbn1cblxuZnVuY3Rpb24gZ2xvYmFsUHJvY2Vzc1ZlcnNpb24oKSB7XG4gIGlmICgodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnKSAmJiAocHJvY2VzcyAhPT0gbnVsbCkpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy52ZXJzaW9uO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5mdW5jdGlvbiBnbG9iYWxQcm9jZXNzU3RkZXJyKCkge1xuICBpZiAoKHR5cGVvZiBwcm9jZXNzID09PSAnb2JqZWN0JykgJiYgKHByb2Nlc3MgIT09IG51bGwpKSB7XG4gICAgcmV0dXJuIHByb2Nlc3Muc3RkZXJyO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdsb2JhbFByb2Nlc3NFeGl0KGNvZGUpIHtcbiAgaWYgKCh0eXBlb2YgcHJvY2VzcyA9PT0gJ29iamVjdCcpICYmIChwcm9jZXNzICE9PSBudWxsKSAmJiAodHlwZW9mIHByb2Nlc3MuZXhpdCA9PT0gJ2Z1bmN0aW9uJykpIHtcbiAgICByZXR1cm4gcHJvY2Vzcy5leGl0KGNvZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGhhbmRsZXJFeGVjKGxpc3QpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uKGFyZykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHJldCA9IGxpc3RbaV0oYXJnKTtcbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG59XG5cbnZhciByZXRyaWV2ZUZpbGUgPSBoYW5kbGVyRXhlYyhyZXRyaWV2ZUZpbGVIYW5kbGVycyk7XG5cbnJldHJpZXZlRmlsZUhhbmRsZXJzLnB1c2goZnVuY3Rpb24ocGF0aCkge1xuICAvLyBUcmltIHRoZSBwYXRoIHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBleHRyYSB3aGl0ZXNwYWNlLlxuICBwYXRoID0gcGF0aC50cmltKCk7XG4gIGlmICgvXmZpbGU6Ly50ZXN0KHBhdGgpKSB7XG4gICAgLy8gZXhpc3RzU3luYy9yZWFkRmlsZVN5bmMgY2FuJ3QgaGFuZGxlIGZpbGUgcHJvdG9jb2wsIGJ1dCBvbmNlIHN0cmlwcGVkLCBpdCB3b3Jrc1xuICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL2ZpbGU6XFwvXFwvXFwvKFxcdzopPy8sIGZ1bmN0aW9uKHByb3RvY29sLCBkcml2ZSkge1xuICAgICAgcmV0dXJuIGRyaXZlID9cbiAgICAgICAgJycgOiAvLyBmaWxlOi8vL0M6L2Rpci9maWxlIC0+IEM6L2Rpci9maWxlXG4gICAgICAgICcvJzsgLy8gZmlsZTovLy9yb290LWRpci9maWxlIC0+IC9yb290LWRpci9maWxlXG4gICAgfSk7XG4gIH1cbiAgaWYgKHBhdGggaW4gZmlsZUNvbnRlbnRzQ2FjaGUpIHtcbiAgICByZXR1cm4gZmlsZUNvbnRlbnRzQ2FjaGVbcGF0aF07XG4gIH1cblxuICB2YXIgY29udGVudHMgPSAnJztcbiAgdHJ5IHtcbiAgICBpZiAoIWZzKSB7XG4gICAgICAvLyBVc2UgU0pBWCBpZiB3ZSBhcmUgaW4gdGhlIGJyb3dzZXJcbiAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgIHhoci5vcGVuKCdHRVQnLCBwYXRoLCAvKiogYXN5bmMgKi8gZmFsc2UpO1xuICAgICAgeGhyLnNlbmQobnVsbCk7XG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQgJiYgeGhyLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgIGNvbnRlbnRzID0geGhyLnJlc3BvbnNlVGV4dDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZzLmV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICAgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBmaWxlc3lzdGVtXG4gICAgICBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhwYXRoLCAndXRmOCcpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXIpIHtcbiAgICAvKiBpZ25vcmUgYW55IGVycm9ycyAqL1xuICB9XG5cbiAgcmV0dXJuIGZpbGVDb250ZW50c0NhY2hlW3BhdGhdID0gY29udGVudHM7XG59KTtcblxuLy8gU3VwcG9ydCBVUkxzIHJlbGF0aXZlIHRvIGEgZGlyZWN0b3J5LCBidXQgYmUgY2FyZWZ1bCBhYm91dCBhIHByb3RvY29sIHByZWZpeFxuLy8gaW4gY2FzZSB3ZSBhcmUgaW4gdGhlIGJyb3dzZXIgKGkuZS4gZGlyZWN0b3JpZXMgbWF5IHN0YXJ0IHdpdGggXCJodHRwOi8vXCIgb3IgXCJmaWxlOi8vL1wiKVxuZnVuY3Rpb24gc3VwcG9ydFJlbGF0aXZlVVJMKGZpbGUsIHVybCkge1xuICBpZiAoIWZpbGUpIHJldHVybiB1cmw7XG4gIHZhciBkaXIgPSBwYXRoLmRpcm5hbWUoZmlsZSk7XG4gIHZhciBtYXRjaCA9IC9eXFx3KzpcXC9cXC9bXlxcL10qLy5leGVjKGRpcik7XG4gIHZhciBwcm90b2NvbCA9IG1hdGNoID8gbWF0Y2hbMF0gOiAnJztcbiAgdmFyIHN0YXJ0UGF0aCA9IGRpci5zbGljZShwcm90b2NvbC5sZW5ndGgpO1xuICBpZiAocHJvdG9jb2wgJiYgL15cXC9cXHdcXDovLnRlc3Qoc3RhcnRQYXRoKSkge1xuICAgIC8vIGhhbmRsZSBmaWxlOi8vL0M6LyBwYXRoc1xuICAgIHByb3RvY29sICs9ICcvJztcbiAgICByZXR1cm4gcHJvdG9jb2wgKyBwYXRoLnJlc29sdmUoZGlyLnNsaWNlKHByb3RvY29sLmxlbmd0aCksIHVybCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICB9XG4gIHJldHVybiBwcm90b2NvbCArIHBhdGgucmVzb2x2ZShkaXIuc2xpY2UocHJvdG9jb2wubGVuZ3RoKSwgdXJsKTtcbn1cblxuZnVuY3Rpb24gcmV0cmlldmVTb3VyY2VNYXBVUkwoc291cmNlKSB7XG4gIHZhciBmaWxlRGF0YTtcblxuICBpZiAoaXNJbkJyb3dzZXIoKSkge1xuICAgICB0cnkge1xuICAgICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICB4aHIub3BlbignR0VUJywgc291cmNlLCBmYWxzZSk7XG4gICAgICAgeGhyLnNlbmQobnVsbCk7XG4gICAgICAgZmlsZURhdGEgPSB4aHIucmVhZHlTdGF0ZSA9PT0gNCA/IHhoci5yZXNwb25zZVRleHQgOiBudWxsO1xuXG4gICAgICAgLy8gU3VwcG9ydCBwcm92aWRpbmcgYSBzb3VyY2VNYXBwaW5nVVJMIHZpYSB0aGUgU291cmNlTWFwIGhlYWRlclxuICAgICAgIHZhciBzb3VyY2VNYXBIZWFkZXIgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJTb3VyY2VNYXBcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLmdldFJlc3BvbnNlSGVhZGVyKFwiWC1Tb3VyY2VNYXBcIik7XG4gICAgICAgaWYgKHNvdXJjZU1hcEhlYWRlcikge1xuICAgICAgICAgcmV0dXJuIHNvdXJjZU1hcEhlYWRlcjtcbiAgICAgICB9XG4gICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgfVxuICB9XG5cbiAgLy8gR2V0IHRoZSBVUkwgb2YgdGhlIHNvdXJjZSBtYXBcbiAgZmlsZURhdGEgPSByZXRyaWV2ZUZpbGUoc291cmNlKTtcbiAgdmFyIHJlID0gLyg/OlxcL1xcL1tAI11bXFxzXSpzb3VyY2VNYXBwaW5nVVJMPShbXlxccydcIl0rKVtcXHNdKiQpfCg/OlxcL1xcKltAI11bXFxzXSpzb3VyY2VNYXBwaW5nVVJMPShbXlxccyonXCJdKylbXFxzXSooPzpcXCpcXC8pW1xcc10qJCkvbWc7XG4gIC8vIEtlZXAgZXhlY3V0aW5nIHRoZSBzZWFyY2ggdG8gZmluZCB0aGUgKmxhc3QqIHNvdXJjZU1hcHBpbmdVUkwgdG8gYXZvaWRcbiAgLy8gcGlja2luZyB1cCBzb3VyY2VNYXBwaW5nVVJMcyBmcm9tIGNvbW1lbnRzLCBzdHJpbmdzLCBldGMuXG4gIHZhciBsYXN0TWF0Y2gsIG1hdGNoO1xuICB3aGlsZSAobWF0Y2ggPSByZS5leGVjKGZpbGVEYXRhKSkgbGFzdE1hdGNoID0gbWF0Y2g7XG4gIGlmICghbGFzdE1hdGNoKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGxhc3RNYXRjaFsxXTtcbn07XG5cbi8vIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSByZXRyaWV2ZVNvdXJjZU1hcCBvcHRpb24gdG8gaW5zdGFsbC4gVGFrZXMgYVxuLy8gZ2VuZXJhdGVkIHNvdXJjZSBmaWxlbmFtZTsgcmV0dXJucyBhIHttYXAsIG9wdGlvbmFsIHVybH0gb2JqZWN0LCBvciBudWxsIGlmXG4vLyB0aGVyZSBpcyBubyBzb3VyY2UgbWFwLiAgVGhlIG1hcCBmaWVsZCBtYXkgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIHRoZSBwYXJzZWRcbi8vIEpTT04gb2JqZWN0IChpZSwgaXQgbXVzdCBiZSBhIHZhbGlkIGFyZ3VtZW50IHRvIHRoZSBTb3VyY2VNYXBDb25zdW1lclxuLy8gY29uc3RydWN0b3IpLlxudmFyIHJldHJpZXZlU291cmNlTWFwID0gaGFuZGxlckV4ZWMocmV0cmlldmVNYXBIYW5kbGVycyk7XG5yZXRyaWV2ZU1hcEhhbmRsZXJzLnB1c2goZnVuY3Rpb24oc291cmNlKSB7XG4gIHZhciBzb3VyY2VNYXBwaW5nVVJMID0gcmV0cmlldmVTb3VyY2VNYXBVUkwoc291cmNlKTtcbiAgaWYgKCFzb3VyY2VNYXBwaW5nVVJMKSByZXR1cm4gbnVsbDtcblxuICAvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIG1hcFxuICB2YXIgc291cmNlTWFwRGF0YTtcbiAgaWYgKHJlU291cmNlTWFwLnRlc3Qoc291cmNlTWFwcGluZ1VSTCkpIHtcbiAgICAvLyBTdXBwb3J0IHNvdXJjZSBtYXAgVVJMIGFzIGEgZGF0YSB1cmxcbiAgICB2YXIgcmF3RGF0YSA9IHNvdXJjZU1hcHBpbmdVUkwuc2xpY2Uoc291cmNlTWFwcGluZ1VSTC5pbmRleE9mKCcsJykgKyAxKTtcbiAgICBzb3VyY2VNYXBEYXRhID0gYnVmZmVyRnJvbShyYXdEYXRhLCBcImJhc2U2NFwiKS50b1N0cmluZygpO1xuICAgIHNvdXJjZU1hcHBpbmdVUkwgPSBzb3VyY2U7XG4gIH0gZWxzZSB7XG4gICAgLy8gU3VwcG9ydCBzb3VyY2UgbWFwIFVSTHMgcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSBVUkxcbiAgICBzb3VyY2VNYXBwaW5nVVJMID0gc3VwcG9ydFJlbGF0aXZlVVJMKHNvdXJjZSwgc291cmNlTWFwcGluZ1VSTCk7XG4gICAgc291cmNlTWFwRGF0YSA9IHJldHJpZXZlRmlsZShzb3VyY2VNYXBwaW5nVVJMKTtcbiAgfVxuXG4gIGlmICghc291cmNlTWFwRGF0YSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB1cmw6IHNvdXJjZU1hcHBpbmdVUkwsXG4gICAgbWFwOiBzb3VyY2VNYXBEYXRhXG4gIH07XG59KTtcblxuZnVuY3Rpb24gbWFwU291cmNlUG9zaXRpb24ocG9zaXRpb24pIHtcbiAgdmFyIHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV07XG4gIGlmICghc291cmNlTWFwKSB7XG4gICAgLy8gQ2FsbCB0aGUgKG92ZXJyaWRlYWJsZSkgcmV0cmlldmVTb3VyY2VNYXAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzb3VyY2UgbWFwLlxuICAgIHZhciB1cmxBbmRNYXAgPSByZXRyaWV2ZVNvdXJjZU1hcChwb3NpdGlvbi5zb3VyY2UpO1xuICAgIGlmICh1cmxBbmRNYXApIHtcbiAgICAgIHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0gPSB7XG4gICAgICAgIHVybDogdXJsQW5kTWFwLnVybCxcbiAgICAgICAgbWFwOiBuZXcgU291cmNlTWFwQ29uc3VtZXIodXJsQW5kTWFwLm1hcClcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWQgYWxsIHNvdXJjZXMgc3RvcmVkIGlubGluZSB3aXRoIHRoZSBzb3VyY2UgbWFwIGludG8gdGhlIGZpbGUgY2FjaGVcbiAgICAgIC8vIHRvIHByZXRlbmQgbGlrZSB0aGV5IGFyZSBhbHJlYWR5IGxvYWRlZC4gVGhleSBtYXkgbm90IGV4aXN0IG9uIGRpc2suXG4gICAgICBpZiAoc291cmNlTWFwLm1hcC5zb3VyY2VzQ29udGVudCkge1xuICAgICAgICBzb3VyY2VNYXAubWFwLnNvdXJjZXMuZm9yRWFjaChmdW5jdGlvbihzb3VyY2UsIGkpIHtcbiAgICAgICAgICB2YXIgY29udGVudHMgPSBzb3VyY2VNYXAubWFwLnNvdXJjZXNDb250ZW50W2ldO1xuICAgICAgICAgIGlmIChjb250ZW50cykge1xuICAgICAgICAgICAgdmFyIHVybCA9IHN1cHBvcnRSZWxhdGl2ZVVSTChzb3VyY2VNYXAudXJsLCBzb3VyY2UpO1xuICAgICAgICAgICAgZmlsZUNvbnRlbnRzQ2FjaGVbdXJsXSA9IGNvbnRlbnRzO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZU1hcCA9IHNvdXJjZU1hcENhY2hlW3Bvc2l0aW9uLnNvdXJjZV0gPSB7XG4gICAgICAgIHVybDogbnVsbCxcbiAgICAgICAgbWFwOiBudWxsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIHNvdXJjZSBVUkwgcmVsYXRpdmUgdG8gdGhlIFVSTCBvZiB0aGUgc291cmNlIG1hcFxuICBpZiAoc291cmNlTWFwICYmIHNvdXJjZU1hcC5tYXAgJiYgdHlwZW9mIHNvdXJjZU1hcC5tYXAub3JpZ2luYWxQb3NpdGlvbkZvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHZhciBvcmlnaW5hbFBvc2l0aW9uID0gc291cmNlTWFwLm1hcC5vcmlnaW5hbFBvc2l0aW9uRm9yKHBvc2l0aW9uKTtcblxuICAgIC8vIE9ubHkgcmV0dXJuIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBpZiBhIG1hdGNoaW5nIGxpbmUgd2FzIGZvdW5kLiBJZiBub1xuICAgIC8vIG1hdGNoaW5nIGxpbmUgaXMgZm91bmQgdGhlbiB3ZSByZXR1cm4gcG9zaXRpb24gaW5zdGVhZCwgd2hpY2ggd2lsbCBjYXVzZVxuICAgIC8vIHRoZSBzdGFjayB0cmFjZSB0byBwcmludCB0aGUgcGF0aCBhbmQgbGluZSBmb3IgdGhlIGNvbXBpbGVkIGZpbGUuIEl0IGlzXG4gICAgLy8gYmV0dGVyIHRvIGdpdmUgYSBwcmVjaXNlIGxvY2F0aW9uIGluIHRoZSBjb21waWxlZCBmaWxlIHRoYW4gYSB2YWd1ZVxuICAgIC8vIGxvY2F0aW9uIGluIHRoZSBvcmlnaW5hbCBmaWxlLlxuICAgIGlmIChvcmlnaW5hbFBvc2l0aW9uLnNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgb3JpZ2luYWxQb3NpdGlvbi5zb3VyY2UgPSBzdXBwb3J0UmVsYXRpdmVVUkwoXG4gICAgICAgIHNvdXJjZU1hcC51cmwsIG9yaWdpbmFsUG9zaXRpb24uc291cmNlKTtcbiAgICAgIHJldHVybiBvcmlnaW5hbFBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBwb3NpdGlvbjtcbn1cblxuLy8gUGFyc2VzIGNvZGUgZ2VuZXJhdGVkIGJ5IEZvcm1hdEV2YWxPcmlnaW4oKSwgYSBmdW5jdGlvbiBpbnNpZGUgVjg6XG4vLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL21lc3NhZ2VzLmpzXG5mdW5jdGlvbiBtYXBFdmFsT3JpZ2luKG9yaWdpbikge1xuICAvLyBNb3N0IGV2YWwoKSBjYWxscyBhcmUgaW4gdGhpcyBmb3JtYXRcbiAgdmFyIG1hdGNoID0gL15ldmFsIGF0IChbXihdKykgXFwoKC4rKTooXFxkKyk6KFxcZCspXFwpJC8uZXhlYyhvcmlnaW4pO1xuICBpZiAobWF0Y2gpIHtcbiAgICB2YXIgcG9zaXRpb24gPSBtYXBTb3VyY2VQb3NpdGlvbih7XG4gICAgICBzb3VyY2U6IG1hdGNoWzJdLFxuICAgICAgbGluZTogK21hdGNoWzNdLFxuICAgICAgY29sdW1uOiBtYXRjaFs0XSAtIDFcbiAgICB9KTtcbiAgICByZXR1cm4gJ2V2YWwgYXQgJyArIG1hdGNoWzFdICsgJyAoJyArIHBvc2l0aW9uLnNvdXJjZSArICc6JyArXG4gICAgICBwb3NpdGlvbi5saW5lICsgJzonICsgKHBvc2l0aW9uLmNvbHVtbiArIDEpICsgJyknO1xuICB9XG5cbiAgLy8gUGFyc2UgbmVzdGVkIGV2YWwoKSBjYWxscyB1c2luZyByZWN1cnNpb25cbiAgbWF0Y2ggPSAvXmV2YWwgYXQgKFteKF0rKSBcXCgoLispXFwpJC8uZXhlYyhvcmlnaW4pO1xuICBpZiAobWF0Y2gpIHtcbiAgICByZXR1cm4gJ2V2YWwgYXQgJyArIG1hdGNoWzFdICsgJyAoJyArIG1hcEV2YWxPcmlnaW4obWF0Y2hbMl0pICsgJyknO1xuICB9XG5cbiAgLy8gTWFrZSBzdXJlIHdlIHN0aWxsIHJldHVybiB1c2VmdWwgaW5mb3JtYXRpb24gaWYgd2UgZGlkbid0IGZpbmQgYW55dGhpbmdcbiAgcmV0dXJuIG9yaWdpbjtcbn1cblxuLy8gVGhpcyBpcyBjb3BpZWQgYWxtb3N0IHZlcmJhdGltIGZyb20gdGhlIFY4IHNvdXJjZSBjb2RlIGF0XG4vLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L3NvdXJjZS9icm93c2UvdHJ1bmsvc3JjL21lc3NhZ2VzLmpzLiBUaGVcbi8vIGltcGxlbWVudGF0aW9uIG9mIHdyYXBDYWxsU2l0ZSgpIHVzZWQgdG8ganVzdCBmb3J3YXJkIHRvIHRoZSBhY3R1YWwgc291cmNlXG4vLyBjb2RlIG9mIENhbGxTaXRlLnByb3RvdHlwZS50b1N0cmluZyBidXQgdW5mb3J0dW5hdGVseSBhIG5ldyByZWxlYXNlIG9mIFY4XG4vLyBkaWQgc29tZXRoaW5nIHRvIHRoZSBwcm90b3R5cGUgY2hhaW4gYW5kIGJyb2tlIHRoZSBzaGltLiBUaGUgb25seSBmaXggSVxuLy8gY291bGQgZmluZCB3YXMgY29weS9wYXN0ZS5cbmZ1bmN0aW9uIENhbGxTaXRlVG9TdHJpbmcoKSB7XG4gIHZhciBmaWxlTmFtZTtcbiAgdmFyIGZpbGVMb2NhdGlvbiA9IFwiXCI7XG4gIGlmICh0aGlzLmlzTmF0aXZlKCkpIHtcbiAgICBmaWxlTG9jYXRpb24gPSBcIm5hdGl2ZVwiO1xuICB9IGVsc2Uge1xuICAgIGZpbGVOYW1lID0gdGhpcy5nZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwoKTtcbiAgICBpZiAoIWZpbGVOYW1lICYmIHRoaXMuaXNFdmFsKCkpIHtcbiAgICAgIGZpbGVMb2NhdGlvbiA9IHRoaXMuZ2V0RXZhbE9yaWdpbigpO1xuICAgICAgZmlsZUxvY2F0aW9uICs9IFwiLCBcIjsgIC8vIEV4cGVjdGluZyBzb3VyY2UgcG9zaXRpb24gdG8gZm9sbG93LlxuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZSkge1xuICAgICAgZmlsZUxvY2F0aW9uICs9IGZpbGVOYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb3VyY2UgY29kZSBkb2VzIG5vdCBvcmlnaW5hdGUgZnJvbSBhIGZpbGUgYW5kIGlzIG5vdCBuYXRpdmUsIGJ1dCB3ZVxuICAgICAgLy8gY2FuIHN0aWxsIGdldCB0aGUgc291cmNlIHBvc2l0aW9uIGluc2lkZSB0aGUgc291cmNlIHN0cmluZywgZS5nLiBpblxuICAgICAgLy8gYW4gZXZhbCBzdHJpbmcuXG4gICAgICBmaWxlTG9jYXRpb24gKz0gXCI8YW5vbnltb3VzPlwiO1xuICAgIH1cbiAgICB2YXIgbGluZU51bWJlciA9IHRoaXMuZ2V0TGluZU51bWJlcigpO1xuICAgIGlmIChsaW5lTnVtYmVyICE9IG51bGwpIHtcbiAgICAgIGZpbGVMb2NhdGlvbiArPSBcIjpcIiArIGxpbmVOdW1iZXI7XG4gICAgICB2YXIgY29sdW1uTnVtYmVyID0gdGhpcy5nZXRDb2x1bW5OdW1iZXIoKTtcbiAgICAgIGlmIChjb2x1bW5OdW1iZXIpIHtcbiAgICAgICAgZmlsZUxvY2F0aW9uICs9IFwiOlwiICsgY29sdW1uTnVtYmVyO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHZhciBsaW5lID0gXCJcIjtcbiAgdmFyIGZ1bmN0aW9uTmFtZSA9IHRoaXMuZ2V0RnVuY3Rpb25OYW1lKCk7XG4gIHZhciBhZGRTdWZmaXggPSB0cnVlO1xuICB2YXIgaXNDb25zdHJ1Y3RvciA9IHRoaXMuaXNDb25zdHJ1Y3RvcigpO1xuICB2YXIgaXNNZXRob2RDYWxsID0gISh0aGlzLmlzVG9wbGV2ZWwoKSB8fCBpc0NvbnN0cnVjdG9yKTtcbiAgaWYgKGlzTWV0aG9kQ2FsbCkge1xuICAgIHZhciB0eXBlTmFtZSA9IHRoaXMuZ2V0VHlwZU5hbWUoKTtcbiAgICAvLyBGaXhlcyBzaGltIHRvIGJlIGJhY2t3YXJkIGNvbXBhdGFibGUgd2l0aCBOb2RlIHYwIHRvIHY0XG4gICAgaWYgKHR5cGVOYW1lID09PSBcIltvYmplY3QgT2JqZWN0XVwiKSB7XG4gICAgICB0eXBlTmFtZSA9IFwibnVsbFwiO1xuICAgIH1cbiAgICB2YXIgbWV0aG9kTmFtZSA9IHRoaXMuZ2V0TWV0aG9kTmFtZSgpO1xuICAgIGlmIChmdW5jdGlvbk5hbWUpIHtcbiAgICAgIGlmICh0eXBlTmFtZSAmJiBmdW5jdGlvbk5hbWUuaW5kZXhPZih0eXBlTmFtZSkgIT0gMCkge1xuICAgICAgICBsaW5lICs9IHR5cGVOYW1lICsgXCIuXCI7XG4gICAgICB9XG4gICAgICBsaW5lICs9IGZ1bmN0aW9uTmFtZTtcbiAgICAgIGlmIChtZXRob2ROYW1lICYmIGZ1bmN0aW9uTmFtZS5pbmRleE9mKFwiLlwiICsgbWV0aG9kTmFtZSkgIT0gZnVuY3Rpb25OYW1lLmxlbmd0aCAtIG1ldGhvZE5hbWUubGVuZ3RoIC0gMSkge1xuICAgICAgICBsaW5lICs9IFwiIFthcyBcIiArIG1ldGhvZE5hbWUgKyBcIl1cIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgbGluZSArPSB0eXBlTmFtZSArIFwiLlwiICsgKG1ldGhvZE5hbWUgfHwgXCI8YW5vbnltb3VzPlwiKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNDb25zdHJ1Y3Rvcikge1xuICAgIGxpbmUgKz0gXCJuZXcgXCIgKyAoZnVuY3Rpb25OYW1lIHx8IFwiPGFub255bW91cz5cIik7XG4gIH0gZWxzZSBpZiAoZnVuY3Rpb25OYW1lKSB7XG4gICAgbGluZSArPSBmdW5jdGlvbk5hbWU7XG4gIH0gZWxzZSB7XG4gICAgbGluZSArPSBmaWxlTG9jYXRpb247XG4gICAgYWRkU3VmZml4ID0gZmFsc2U7XG4gIH1cbiAgaWYgKGFkZFN1ZmZpeCkge1xuICAgIGxpbmUgKz0gXCIgKFwiICsgZmlsZUxvY2F0aW9uICsgXCIpXCI7XG4gIH1cbiAgcmV0dXJuIGxpbmU7XG59XG5cbmZ1bmN0aW9uIGNsb25lQ2FsbFNpdGUoZnJhbWUpIHtcbiAgdmFyIG9iamVjdCA9IHt9O1xuICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPYmplY3QuZ2V0UHJvdG90eXBlT2YoZnJhbWUpKS5mb3JFYWNoKGZ1bmN0aW9uKG5hbWUpIHtcbiAgICBvYmplY3RbbmFtZV0gPSAvXig/OmlzfGdldCkvLnRlc3QobmFtZSkgPyBmdW5jdGlvbigpIHsgcmV0dXJuIGZyYW1lW25hbWVdLmNhbGwoZnJhbWUpOyB9IDogZnJhbWVbbmFtZV07XG4gIH0pO1xuICBvYmplY3QudG9TdHJpbmcgPSBDYWxsU2l0ZVRvU3RyaW5nO1xuICByZXR1cm4gb2JqZWN0O1xufVxuXG5mdW5jdGlvbiB3cmFwQ2FsbFNpdGUoZnJhbWUsIHN0YXRlKSB7XG4gIC8vIHByb3ZpZGVzIGludGVyZmFjZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gIGlmIChzdGF0ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhdGUgPSB7IG5leHRQb3NpdGlvbjogbnVsbCwgY3VyUG9zaXRpb246IG51bGwgfVxuICB9XG4gIGlmKGZyYW1lLmlzTmF0aXZlKCkpIHtcbiAgICBzdGF0ZS5jdXJQb3NpdGlvbiA9IG51bGw7XG4gICAgcmV0dXJuIGZyYW1lO1xuICB9XG5cbiAgLy8gTW9zdCBjYWxsIHNpdGVzIHdpbGwgcmV0dXJuIHRoZSBzb3VyY2UgZmlsZSBmcm9tIGdldEZpbGVOYW1lKCksIGJ1dCBjb2RlXG4gIC8vIHBhc3NlZCB0byBldmFsKCkgZW5kaW5nIGluIFwiLy8jIHNvdXJjZVVSTD0uLi5cIiB3aWxsIHJldHVybiB0aGUgc291cmNlIGZpbGVcbiAgLy8gZnJvbSBnZXRTY3JpcHROYW1lT3JTb3VyY2VVUkwoKSBpbnN0ZWFkXG4gIHZhciBzb3VyY2UgPSBmcmFtZS5nZXRGaWxlTmFtZSgpIHx8IGZyYW1lLmdldFNjcmlwdE5hbWVPclNvdXJjZVVSTCgpO1xuICBpZiAoc291cmNlKSB7XG4gICAgdmFyIGxpbmUgPSBmcmFtZS5nZXRMaW5lTnVtYmVyKCk7XG4gICAgdmFyIGNvbHVtbiA9IGZyYW1lLmdldENvbHVtbk51bWJlcigpIC0gMTtcblxuICAgIC8vIEZpeCBwb3NpdGlvbiBpbiBOb2RlIHdoZXJlIHNvbWUgKGludGVybmFsKSBjb2RlIGlzIHByZXBlbmRlZC5cbiAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2V2YW53L25vZGUtc291cmNlLW1hcC1zdXBwb3J0L2lzc3Vlcy8zNlxuICAgIC8vIEhlYWRlciByZW1vdmVkIGluIG5vZGUgYXQgXjEwLjE2IHx8ID49MTEuMTEuMFxuICAgIC8vIHYxMSBpcyBub3QgYW4gTFRTIGNhbmRpZGF0ZSwgd2UgY2FuIGp1c3QgdGVzdCB0aGUgb25lIHZlcnNpb24gd2l0aCBpdC5cbiAgICAvLyBUZXN0IG5vZGUgdmVyc2lvbnMgZm9yOiAxMC4xNi0xOSwgMTAuMjArLCAxMi0xOSwgMjAtOTksIDEwMCssIG9yIDExLjExXG4gICAgdmFyIG5vSGVhZGVyID0gL152KDEwXFwuMVs2LTldfDEwXFwuWzItOV1bMC05XXwxMFxcLlswLTldezMsfXwxWzItOV1cXGQqfFsyLTldXFxkfFxcZHszLH18MTFcXC4xMSkvO1xuICAgIHZhciBoZWFkZXJMZW5ndGggPSBub0hlYWRlci50ZXN0KGdsb2JhbFByb2Nlc3NWZXJzaW9uKCkpID8gMCA6IDYyO1xuICAgIGlmIChsaW5lID09PSAxICYmIGNvbHVtbiA+IGhlYWRlckxlbmd0aCAmJiAhaXNJbkJyb3dzZXIoKSAmJiAhZnJhbWUuaXNFdmFsKCkpIHtcbiAgICAgIGNvbHVtbiAtPSBoZWFkZXJMZW5ndGg7XG4gICAgfVxuXG4gICAgdmFyIHBvc2l0aW9uID0gbWFwU291cmNlUG9zaXRpb24oe1xuICAgICAgc291cmNlOiBzb3VyY2UsXG4gICAgICBsaW5lOiBsaW5lLFxuICAgICAgY29sdW1uOiBjb2x1bW5cbiAgICB9KTtcbiAgICBzdGF0ZS5jdXJQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgIGZyYW1lID0gY2xvbmVDYWxsU2l0ZShmcmFtZSk7XG4gICAgdmFyIG9yaWdpbmFsRnVuY3Rpb25OYW1lID0gZnJhbWUuZ2V0RnVuY3Rpb25OYW1lO1xuICAgIGZyYW1lLmdldEZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHN0YXRlLm5leHRQb3NpdGlvbiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uTmFtZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0YXRlLm5leHRQb3NpdGlvbi5uYW1lIHx8IG9yaWdpbmFsRnVuY3Rpb25OYW1lKCk7XG4gICAgfTtcbiAgICBmcmFtZS5nZXRGaWxlTmFtZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcG9zaXRpb24uc291cmNlOyB9O1xuICAgIGZyYW1lLmdldExpbmVOdW1iZXIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHBvc2l0aW9uLmxpbmU7IH07XG4gICAgZnJhbWUuZ2V0Q29sdW1uTnVtYmVyID0gZnVuY3Rpb24oKSB7IHJldHVybiBwb3NpdGlvbi5jb2x1bW4gKyAxOyB9O1xuICAgIGZyYW1lLmdldFNjcmlwdE5hbWVPclNvdXJjZVVSTCA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcG9zaXRpb24uc291cmNlOyB9O1xuICAgIHJldHVybiBmcmFtZTtcbiAgfVxuXG4gIC8vIENvZGUgY2FsbGVkIHVzaW5nIGV2YWwoKSBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nXG4gIHZhciBvcmlnaW4gPSBmcmFtZS5pc0V2YWwoKSAmJiBmcmFtZS5nZXRFdmFsT3JpZ2luKCk7XG4gIGlmIChvcmlnaW4pIHtcbiAgICBvcmlnaW4gPSBtYXBFdmFsT3JpZ2luKG9yaWdpbik7XG4gICAgZnJhbWUgPSBjbG9uZUNhbGxTaXRlKGZyYW1lKTtcbiAgICBmcmFtZS5nZXRFdmFsT3JpZ2luID0gZnVuY3Rpb24oKSB7IHJldHVybiBvcmlnaW47IH07XG4gICAgcmV0dXJuIGZyYW1lO1xuICB9XG5cbiAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiB3ZSB3ZXJlIHVuYWJsZSB0byBjaGFuZ2UgdGhlIHNvdXJjZSBwb3NpdGlvblxuICByZXR1cm4gZnJhbWU7XG59XG5cbi8vIFRoaXMgZnVuY3Rpb24gaXMgcGFydCBvZiB0aGUgVjggc3RhY2sgdHJhY2UgQVBJLCBmb3IgbW9yZSBpbmZvIHNlZTpcbi8vIGh0dHBzOi8vdjguZGV2L2RvY3Mvc3RhY2stdHJhY2UtYXBpXG5mdW5jdGlvbiBwcmVwYXJlU3RhY2tUcmFjZShlcnJvciwgc3RhY2spIHtcbiAgaWYgKGVtcHR5Q2FjaGVCZXR3ZWVuT3BlcmF0aW9ucykge1xuICAgIGZpbGVDb250ZW50c0NhY2hlID0ge307XG4gICAgc291cmNlTWFwQ2FjaGUgPSB7fTtcbiAgfVxuXG4gIHZhciBuYW1lID0gZXJyb3IubmFtZSB8fCAnRXJyb3InO1xuICB2YXIgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2UgfHwgJyc7XG4gIHZhciBlcnJvclN0cmluZyA9IG5hbWUgKyBcIjogXCIgKyBtZXNzYWdlO1xuXG4gIHZhciBzdGF0ZSA9IHsgbmV4dFBvc2l0aW9uOiBudWxsLCBjdXJQb3NpdGlvbjogbnVsbCB9O1xuICB2YXIgcHJvY2Vzc2VkU3RhY2sgPSBbXTtcbiAgZm9yICh2YXIgaSA9IHN0YWNrLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgcHJvY2Vzc2VkU3RhY2sucHVzaCgnXFxuICAgIGF0ICcgKyB3cmFwQ2FsbFNpdGUoc3RhY2tbaV0sIHN0YXRlKSk7XG4gICAgc3RhdGUubmV4dFBvc2l0aW9uID0gc3RhdGUuY3VyUG9zaXRpb247XG4gIH1cbiAgc3RhdGUuY3VyUG9zaXRpb24gPSBzdGF0ZS5uZXh0UG9zaXRpb24gPSBudWxsO1xuICByZXR1cm4gZXJyb3JTdHJpbmcgKyBwcm9jZXNzZWRTdGFjay5yZXZlcnNlKCkuam9pbignJyk7XG59XG5cbi8vIEdlbmVyYXRlIHBvc2l0aW9uIGFuZCBzbmlwcGV0IG9mIG9yaWdpbmFsIHNvdXJjZSB3aXRoIHBvaW50ZXJcbmZ1bmN0aW9uIGdldEVycm9yU291cmNlKGVycm9yKSB7XG4gIHZhciBtYXRjaCA9IC9cXG4gICAgYXQgW14oXSsgXFwoKC4qKTooXFxkKyk6KFxcZCspXFwpLy5leGVjKGVycm9yLnN0YWNrKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgdmFyIHNvdXJjZSA9IG1hdGNoWzFdO1xuICAgIHZhciBsaW5lID0gK21hdGNoWzJdO1xuICAgIHZhciBjb2x1bW4gPSArbWF0Y2hbM107XG5cbiAgICAvLyBTdXBwb3J0IHRoZSBpbmxpbmUgc291cmNlQ29udGVudHMgaW5zaWRlIHRoZSBzb3VyY2UgbWFwXG4gICAgdmFyIGNvbnRlbnRzID0gZmlsZUNvbnRlbnRzQ2FjaGVbc291cmNlXTtcblxuICAgIC8vIFN1cHBvcnQgZmlsZXMgb24gZGlza1xuICAgIGlmICghY29udGVudHMgJiYgZnMgJiYgZnMuZXhpc3RzU3luYyhzb3VyY2UpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb250ZW50cyA9IGZzLnJlYWRGaWxlU3luYyhzb3VyY2UsICd1dGY4Jyk7XG4gICAgICB9IGNhdGNoIChlcikge1xuICAgICAgICBjb250ZW50cyA9ICcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcm1hdCB0aGUgbGluZSBmcm9tIHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZSBsaWtlIG5vZGUgZG9lc1xuICAgIGlmIChjb250ZW50cykge1xuICAgICAgdmFyIGNvZGUgPSBjb250ZW50cy5zcGxpdCgvKD86XFxyXFxufFxccnxcXG4pLylbbGluZSAtIDFdO1xuICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgcmV0dXJuIHNvdXJjZSArICc6JyArIGxpbmUgKyAnXFxuJyArIGNvZGUgKyAnXFxuJyArXG4gICAgICAgICAgbmV3IEFycmF5KGNvbHVtbikuam9pbignICcpICsgJ14nO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gcHJpbnRFcnJvckFuZEV4aXQgKGVycm9yKSB7XG4gIHZhciBzb3VyY2UgPSBnZXRFcnJvclNvdXJjZShlcnJvcik7XG5cbiAgLy8gRW5zdXJlIGVycm9yIGlzIHByaW50ZWQgc3luY2hyb25vdXNseSBhbmQgbm90IHRydW5jYXRlZFxuICB2YXIgc3RkZXJyID0gZ2xvYmFsUHJvY2Vzc1N0ZGVycigpO1xuICBpZiAoc3RkZXJyICYmIHN0ZGVyci5faGFuZGxlICYmIHN0ZGVyci5faGFuZGxlLnNldEJsb2NraW5nKSB7XG4gICAgc3RkZXJyLl9oYW5kbGUuc2V0QmxvY2tpbmcodHJ1ZSk7XG4gIH1cblxuICBpZiAoc291cmNlKSB7XG4gICAgY29uc29sZS5lcnJvcigpO1xuICAgIGNvbnNvbGUuZXJyb3Ioc291cmNlKTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZXJyb3Iuc3RhY2spO1xuICBnbG9iYWxQcm9jZXNzRXhpdCgxKTtcbn1cblxuZnVuY3Rpb24gc2hpbUVtaXRVbmNhdWdodEV4Y2VwdGlvbiAoKSB7XG4gIHZhciBvcmlnRW1pdCA9IHByb2Nlc3MuZW1pdDtcblxuICBwcm9jZXNzLmVtaXQgPSBmdW5jdGlvbiAodHlwZSkge1xuICAgIGlmICh0eXBlID09PSAndW5jYXVnaHRFeGNlcHRpb24nKSB7XG4gICAgICB2YXIgaGFzU3RhY2sgPSAoYXJndW1lbnRzWzFdICYmIGFyZ3VtZW50c1sxXS5zdGFjayk7XG4gICAgICB2YXIgaGFzTGlzdGVuZXJzID0gKHRoaXMubGlzdGVuZXJzKHR5cGUpLmxlbmd0aCA+IDApO1xuXG4gICAgICBpZiAoaGFzU3RhY2sgJiYgIWhhc0xpc3RlbmVycykge1xuICAgICAgICByZXR1cm4gcHJpbnRFcnJvckFuZEV4aXQoYXJndW1lbnRzWzFdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3JpZ0VtaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxudmFyIG9yaWdpbmFsUmV0cmlldmVGaWxlSGFuZGxlcnMgPSByZXRyaWV2ZUZpbGVIYW5kbGVycy5zbGljZSgwKTtcbnZhciBvcmlnaW5hbFJldHJpZXZlTWFwSGFuZGxlcnMgPSByZXRyaWV2ZU1hcEhhbmRsZXJzLnNsaWNlKDApO1xuXG5leHBvcnRzLndyYXBDYWxsU2l0ZSA9IHdyYXBDYWxsU2l0ZTtcbmV4cG9ydHMuZ2V0RXJyb3JTb3VyY2UgPSBnZXRFcnJvclNvdXJjZTtcbmV4cG9ydHMubWFwU291cmNlUG9zaXRpb24gPSBtYXBTb3VyY2VQb3NpdGlvbjtcbmV4cG9ydHMucmV0cmlldmVTb3VyY2VNYXAgPSByZXRyaWV2ZVNvdXJjZU1hcDtcblxuZXhwb3J0cy5pbnN0YWxsID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICBpZiAob3B0aW9ucy5lbnZpcm9ubWVudCkge1xuICAgIGVudmlyb25tZW50ID0gb3B0aW9ucy5lbnZpcm9ubWVudDtcbiAgICBpZiAoW1wibm9kZVwiLCBcImJyb3dzZXJcIiwgXCJhdXRvXCJdLmluZGV4T2YoZW52aXJvbm1lbnQpID09PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZW52aXJvbm1lbnQgXCIgKyBlbnZpcm9ubWVudCArIFwiIHdhcyB1bmtub3duLiBBdmFpbGFibGUgb3B0aW9ucyBhcmUge2F1dG8sIGJyb3dzZXIsIG5vZGV9XCIpXG4gICAgfVxuICB9XG5cbiAgLy8gQWxsb3cgc291cmNlcyB0byBiZSBmb3VuZCBieSBtZXRob2RzIG90aGVyIHRoYW4gcmVhZGluZyB0aGUgZmlsZXNcbiAgLy8gZGlyZWN0bHkgZnJvbSBkaXNrLlxuICBpZiAob3B0aW9ucy5yZXRyaWV2ZUZpbGUpIHtcbiAgICBpZiAob3B0aW9ucy5vdmVycmlkZVJldHJpZXZlRmlsZSkge1xuICAgICAgcmV0cmlldmVGaWxlSGFuZGxlcnMubGVuZ3RoID0gMDtcbiAgICB9XG5cbiAgICByZXRyaWV2ZUZpbGVIYW5kbGVycy51bnNoaWZ0KG9wdGlvbnMucmV0cmlldmVGaWxlKTtcbiAgfVxuXG4gIC8vIEFsbG93IHNvdXJjZSBtYXBzIHRvIGJlIGZvdW5kIGJ5IG1ldGhvZHMgb3RoZXIgdGhhbiByZWFkaW5nIHRoZSBmaWxlc1xuICAvLyBkaXJlY3RseSBmcm9tIGRpc2suXG4gIGlmIChvcHRpb25zLnJldHJpZXZlU291cmNlTWFwKSB7XG4gICAgaWYgKG9wdGlvbnMub3ZlcnJpZGVSZXRyaWV2ZVNvdXJjZU1hcCkge1xuICAgICAgcmV0cmlldmVNYXBIYW5kbGVycy5sZW5ndGggPSAwO1xuICAgIH1cblxuICAgIHJldHJpZXZlTWFwSGFuZGxlcnMudW5zaGlmdChvcHRpb25zLnJldHJpZXZlU291cmNlTWFwKTtcbiAgfVxuXG4gIC8vIFN1cHBvcnQgcnVudGltZSB0cmFuc3BpbGVycyB0aGF0IGluY2x1ZGUgaW5saW5lIHNvdXJjZSBtYXBzXG4gIGlmIChvcHRpb25zLmhvb2tSZXF1aXJlICYmICFpc0luQnJvd3NlcigpKSB7XG4gICAgLy8gVXNlIGR5bmFtaWNSZXF1aXJlIHRvIGF2b2lkIGluY2x1ZGluZyBpbiBicm93c2VyIGJ1bmRsZXNcbiAgICB2YXIgTW9kdWxlID0gZHluYW1pY1JlcXVpcmUobW9kdWxlLCAnbW9kdWxlJyk7XG4gICAgdmFyICRjb21waWxlID0gTW9kdWxlLnByb3RvdHlwZS5fY29tcGlsZTtcblxuICAgIGlmICghJGNvbXBpbGUuX19zb3VyY2VNYXBTdXBwb3J0KSB7XG4gICAgICBNb2R1bGUucHJvdG90eXBlLl9jb21waWxlID0gZnVuY3Rpb24oY29udGVudCwgZmlsZW5hbWUpIHtcbiAgICAgICAgZmlsZUNvbnRlbnRzQ2FjaGVbZmlsZW5hbWVdID0gY29udGVudDtcbiAgICAgICAgc291cmNlTWFwQ2FjaGVbZmlsZW5hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gJGNvbXBpbGUuY2FsbCh0aGlzLCBjb250ZW50LCBmaWxlbmFtZSk7XG4gICAgICB9O1xuXG4gICAgICBNb2R1bGUucHJvdG90eXBlLl9jb21waWxlLl9fc291cmNlTWFwU3VwcG9ydCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gQ29uZmlndXJlIG9wdGlvbnNcbiAgaWYgKCFlbXB0eUNhY2hlQmV0d2Vlbk9wZXJhdGlvbnMpIHtcbiAgICBlbXB0eUNhY2hlQmV0d2Vlbk9wZXJhdGlvbnMgPSAnZW1wdHlDYWNoZUJldHdlZW5PcGVyYXRpb25zJyBpbiBvcHRpb25zID9cbiAgICAgIG9wdGlvbnMuZW1wdHlDYWNoZUJldHdlZW5PcGVyYXRpb25zIDogZmFsc2U7XG4gIH1cblxuICAvLyBJbnN0YWxsIHRoZSBlcnJvciByZWZvcm1hdHRlclxuICBpZiAoIWVycm9yRm9ybWF0dGVySW5zdGFsbGVkKSB7XG4gICAgZXJyb3JGb3JtYXR0ZXJJbnN0YWxsZWQgPSB0cnVlO1xuICAgIEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gcHJlcGFyZVN0YWNrVHJhY2U7XG4gIH1cblxuICBpZiAoIXVuY2F1Z2h0U2hpbUluc3RhbGxlZCkge1xuICAgIHZhciBpbnN0YWxsSGFuZGxlciA9ICdoYW5kbGVVbmNhdWdodEV4Y2VwdGlvbnMnIGluIG9wdGlvbnMgP1xuICAgICAgb3B0aW9ucy5oYW5kbGVVbmNhdWdodEV4Y2VwdGlvbnMgOiB0cnVlO1xuXG4gICAgLy8gRG8gbm90IG92ZXJyaWRlICd1bmNhdWdodEV4Y2VwdGlvbicgd2l0aCBvdXIgb3duIGhhbmRsZXIgaW4gTm9kZS5qc1xuICAgIC8vIFdvcmtlciB0aHJlYWRzLiBXb3JrZXJzIHBhc3MgdGhlIGVycm9yIHRvIHRoZSBtYWluIHRocmVhZCBhcyBhbiBldmVudCxcbiAgICAvLyByYXRoZXIgdGhhbiBwcmludGluZyBzb21ldGhpbmcgdG8gc3RkZXJyIGFuZCBleGl0aW5nLlxuICAgIHRyeSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHVzZSBgZHluYW1pY1JlcXVpcmVgIGJlY2F1c2UgYHJlcXVpcmVgIG9uIGl0J3Mgb3duIHdpbGwgYmUgb3B0aW1pemVkIGJ5IFdlYlBhY2svQnJvd3NlcmlmeS5cbiAgICAgIHZhciB3b3JrZXJfdGhyZWFkcyA9IGR5bmFtaWNSZXF1aXJlKG1vZHVsZSwgJ3dvcmtlcl90aHJlYWRzJyk7XG4gICAgICBpZiAod29ya2VyX3RocmVhZHMuaXNNYWluVGhyZWFkID09PSBmYWxzZSkge1xuICAgICAgICBpbnN0YWxsSGFuZGxlciA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZSkge31cblxuICAgIC8vIFByb3ZpZGUgdGhlIG9wdGlvbiB0byBub3QgaW5zdGFsbCB0aGUgdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXIuIFRoaXMgaXNcbiAgICAvLyB0byBzdXBwb3J0IG90aGVyIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVycyAoaW4gdGVzdCBmcmFtZXdvcmtzLCBmb3JcbiAgICAvLyBleGFtcGxlKS4gSWYgdGhpcyBoYW5kbGVyIGlzIG5vdCBpbnN0YWxsZWQgYW5kIHRoZXJlIGFyZSBubyBvdGhlciB1bmNhdWdodFxuICAgIC8vIGV4Y2VwdGlvbiBoYW5kbGVycywgdW5jYXVnaHQgZXhjZXB0aW9ucyB3aWxsIGJlIGNhdWdodCBieSBub2RlJ3MgYnVpbHQtaW5cbiAgICAvLyBleGNlcHRpb24gaGFuZGxlciBhbmQgdGhlIHByb2Nlc3Mgd2lsbCBzdGlsbCBiZSB0ZXJtaW5hdGVkLiBIb3dldmVyLCB0aGVcbiAgICAvLyBnZW5lcmF0ZWQgSmF2YVNjcmlwdCBjb2RlIHdpbGwgYmUgc2hvd24gYWJvdmUgdGhlIHN0YWNrIHRyYWNlIGluc3RlYWQgb2ZcbiAgICAvLyB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuXG4gICAgaWYgKGluc3RhbGxIYW5kbGVyICYmIGhhc0dsb2JhbFByb2Nlc3NFdmVudEVtaXR0ZXIoKSkge1xuICAgICAgdW5jYXVnaHRTaGltSW5zdGFsbGVkID0gdHJ1ZTtcbiAgICAgIHNoaW1FbWl0VW5jYXVnaHRFeGNlcHRpb24oKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydHMucmVzZXRSZXRyaWV2ZUhhbmRsZXJzID0gZnVuY3Rpb24oKSB7XG4gIHJldHJpZXZlRmlsZUhhbmRsZXJzLmxlbmd0aCA9IDA7XG4gIHJldHJpZXZlTWFwSGFuZGxlcnMubGVuZ3RoID0gMDtcblxuICByZXRyaWV2ZUZpbGVIYW5kbGVycyA9IG9yaWdpbmFsUmV0cmlldmVGaWxlSGFuZGxlcnMuc2xpY2UoMCk7XG4gIHJldHJpZXZlTWFwSGFuZGxlcnMgPSBvcmlnaW5hbFJldHJpZXZlTWFwSGFuZGxlcnMuc2xpY2UoMCk7XG5cbiAgcmV0cmlldmVTb3VyY2VNYXAgPSBoYW5kbGVyRXhlYyhyZXRyaWV2ZU1hcEhhbmRsZXJzKTtcbiAgcmV0cmlldmVGaWxlID0gaGFuZGxlckV4ZWMocmV0cmlldmVGaWxlSGFuZGxlcnMpO1xufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihtb2R1bGUpIHtcblx0aWYgKCFtb2R1bGUud2VicGFja1BvbHlmaWxsKSB7XG5cdFx0bW9kdWxlLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKCkge307XG5cdFx0bW9kdWxlLnBhdGhzID0gW107XG5cdFx0Ly8gbW9kdWxlLnBhcmVudCA9IHVuZGVmaW5lZCBieSBkZWZhdWx0XG5cdFx0aWYgKCFtb2R1bGUuY2hpbGRyZW4pIG1vZHVsZS5jaGlsZHJlbiA9IFtdO1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2R1bGUsIFwibG9hZGVkXCIsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gbW9kdWxlLmw7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG1vZHVsZSwgXCJpZFwiLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIG1vZHVsZS5pO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdG1vZHVsZS53ZWJwYWNrUG9seWZpbGwgPSAxO1xuXHR9XG5cdHJldHVybiBtb2R1bGU7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKipcbiAqIEBtb2R1bGUgUzNcbiAqL1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMubW92ZU9iamVjdCA9IGV4cG9ydHMubXVsdGlwYXJ0Q29weU9iamVjdCA9IGV4cG9ydHMuY3JlYXRlUzNCdWNrZXRzID0gZXhwb3J0cy5jcmVhdGVCdWNrZXQgPSBleHBvcnRzLmdldEZpbGVCdWNrZXRBbmRLZXkgPSBleHBvcnRzLnZhbGlkYXRlUzNPYmplY3RDaGVja3N1bSA9IGV4cG9ydHMuY2FsY3VsYXRlT2JqZWN0SGFzaCA9IGV4cG9ydHMubGlzdFMzT2JqZWN0c1YyID0gZXhwb3J0cy5saXN0UzNPYmplY3RzID0gZXhwb3J0cy51cGxvYWRTM0ZpbGVTdHJlYW0gPSBleHBvcnRzLnVwbG9hZFMzRmlsZXMgPSBleHBvcnRzLmRlbGV0ZVMzQnVja2V0cyA9IGV4cG9ydHMucmVjdXJzaXZlbHlEZWxldGVTM0J1Y2tldCA9IGV4cG9ydHMuZGVsZXRlUzNGaWxlcyA9IGV4cG9ydHMuZG93bmxvYWRTM0ZpbGVzID0gZXhwb3J0cy5maWxlRXhpc3RzID0gZXhwb3J0cy5nZXRPYmplY3RSZWFkU3RyZWFtID0gZXhwb3J0cy5wdXRKc29uUzNPYmplY3QgPSBleHBvcnRzLmdldEpzb25TM09iamVjdCA9IGV4cG9ydHMuZ2V0VGV4dE9iamVjdCA9IGV4cG9ydHMuZ2V0UzNPYmplY3QgPSBleHBvcnRzLndhaXRGb3JPYmplY3QgPSBleHBvcnRzLmdldE9iamVjdCA9IGV4cG9ydHMuczNQdXRPYmplY3RUYWdnaW5nID0gZXhwb3J0cy5zM0dldE9iamVjdFRhZ2dpbmcgPSBleHBvcnRzLmdldE9iamVjdFNpemUgPSBleHBvcnRzLmRvd25sb2FkUzNGaWxlID0gZXhwb3J0cy5zdHJlYW1TM1VwbG9hZCA9IGV4cG9ydHMucHJvbWlzZVMzVXBsb2FkID0gZXhwb3J0cy5zM0NvcHlPYmplY3QgPSBleHBvcnRzLnB1dEZpbGUgPSBleHBvcnRzLnMzUHV0T2JqZWN0ID0gZXhwb3J0cy53YWl0Rm9yT2JqZWN0VG9FeGlzdCA9IGV4cG9ydHMuczNPYmplY3RFeGlzdHMgPSBleHBvcnRzLmhlYWRPYmplY3QgPSBleHBvcnRzLmRlbGV0ZVMzT2JqZWN0ID0gZXhwb3J0cy5zM1RhZ1NldFRvUXVlcnlTdHJpbmcgPSBleHBvcnRzLmJ1aWxkUzNVcmkgPSBleHBvcnRzLnBhcnNlUzNVcmkgPSBleHBvcnRzLnMzSm9pbiA9IHZvaWQgMDtcbmNvbnN0IGZzXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImZzXCIpKTtcbmNvbnN0IGlzQm9vbGVhbl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJsb2Rhc2gvaXNCb29sZWFuXCIpKTtcbmNvbnN0IHBhdGhfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicGF0aFwiKSk7XG5jb25zdCBwX21hcF8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJwLW1hcFwiKSk7XG5jb25zdCBwX3JldHJ5XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcInAtcmV0cnlcIikpO1xuY29uc3QgcF93YWl0X2Zvcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJwLXdhaXQtZm9yXCIpKTtcbmNvbnN0IHB1bXBfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwicHVtcFwiKSk7XG5jb25zdCBxdWVyeXN0cmluZ18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJxdWVyeXN0cmluZ1wiKSk7XG5jb25zdCBzdHJlYW1fMSA9IHJlcXVpcmUoXCJzdHJlYW1cIik7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwidXRpbFwiKTtcbmNvbnN0IGNoZWNrc3VtXzEgPSByZXF1aXJlKFwiQGN1bXVsdXMvY2hlY2tzdW1cIik7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCJAY3VtdWx1cy9lcnJvcnNcIik7XG5jb25zdCBsb2dnZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwiQGN1bXVsdXMvbG9nZ2VyXCIpKTtcbmNvbnN0IFMzTXVsdGlwYXJ0VXBsb2FkcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiLi9saWIvUzNNdWx0aXBhcnRVcGxvYWRzXCIpKTtcbmNvbnN0IHNlcnZpY2VzXzEgPSByZXF1aXJlKFwiLi9zZXJ2aWNlc1wiKTtcbmNvbnN0IHRlc3RfdXRpbHNfMSA9IHJlcXVpcmUoXCIuL3Rlc3QtdXRpbHNcIik7XG5jb25zdCB1dGlsc18xID0gcmVxdWlyZShcIi4vdXRpbHNcIik7XG5jb25zdCBsb2cgPSBuZXcgbG9nZ2VyXzEuZGVmYXVsdCh7IHNlbmRlcjogJ2F3cy1jbGllbnQvczMnIH0pO1xuY29uc3QgYnVpbGREZXByZWNhdGlvbk1lc3NhZ2UgPSAobmFtZSwgdmVyc2lvbiwgYWx0ZXJuYXRpdmUpID0+IHtcbiAgICBsZXQgbWVzc2FnZSA9IGAke25hbWV9IGlzIGRlcHJlY2F0ZWQgYWZ0ZXIgdmVyc2lvbiAke3ZlcnNpb259IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5gO1xuICAgIGlmIChhbHRlcm5hdGl2ZSlcbiAgICAgICAgbWVzc2FnZSArPSBgIFVzZSAke2FsdGVybmF0aXZlfSBpbnN0ZWFkLmA7XG4gICAgcmV0dXJuIGxvZy5idWlsZE1lc3NhZ2UoJ3dhcm4nLCBtZXNzYWdlKTtcbn07XG5jb25zdCBTM19SQVRFX0xJTUlUID0gdGVzdF91dGlsc18xLmluVGVzdE1vZGUoKSA/IDEgOiAyMDtcbi8qKlxuICogSm9pbiBzdHJpbmdzIGludG8gYW4gUzMga2V5IHdpdGhvdXQgYSBsZWFkaW5nIHNsYXNoXG4gKlxuICogQHBhcmFtIHsuLi5zdHJpbmd8QXJyYXk8c3RyaW5nPn0gYXJncyAtIHRoZSBzdHJpbmdzIHRvIGpvaW5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBmdWxsIFMzIGtleVxuICovXG5leHBvcnRzLnMzSm9pbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgbGV0IHRva2VucztcbiAgICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKVxuICAgICAgICB0b2tlbnMgPSBhcmdzO1xuICAgIGVsc2VcbiAgICAgICAgdG9rZW5zID0gYXJnc1swXTtcbiAgICBjb25zdCByZW1vdmVMZWFkaW5nU2xhc2ggPSAodG9rZW4pID0+IHRva2VuLnJlcGxhY2UoL15cXC8vLCAnJyk7XG4gICAgY29uc3QgcmVtb3ZlVHJhaWxpbmdTbGFzaCA9ICh0b2tlbikgPT4gdG9rZW4ucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICBjb25zdCBpc05vdEVtcHR5U3RyaW5nID0gKHRva2VuKSA9PiB0b2tlbi5sZW5ndGggPiAwO1xuICAgIGNvbnN0IGtleSA9IHRva2Vuc1xuICAgICAgICAubWFwKHJlbW92ZUxlYWRpbmdTbGFzaClcbiAgICAgICAgLm1hcChyZW1vdmVUcmFpbGluZ1NsYXNoKVxuICAgICAgICAuZmlsdGVyKGlzTm90RW1wdHlTdHJpbmcpXG4gICAgICAgIC5qb2luKCcvJyk7XG4gICAgaWYgKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0uZW5kc1dpdGgoJy8nKSlcbiAgICAgICAgcmV0dXJuIGAke2tleX0vYDtcbiAgICByZXR1cm4ga2V5O1xufTtcbi8qKlxuKiBwYXJzZSBhbiBzMyB1cmkgdG8gZ2V0IHRoZSBidWNrZXQgYW5kIGtleVxuKlxuKiBAcGFyYW0ge3N0cmluZ30gdXJpIC0gbXVzdCBiZSBhIHVyaSB3aXRoIHRoZSBgczM6Ly9gIHByb3RvY29sXG4qIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYW4gb2JqZWN0IHdpdGggYEJ1Y2tldGAgYW5kIGBLZXlgIHByb3BlcnRpZXNcbioqL1xuZXhwb3J0cy5wYXJzZVMzVXJpID0gKHVyaSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoID0gdXJpLm1hdGNoKCdeczM6Ly8oW14vXSspLyguKikkJyk7XG4gICAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuYWJsZSB0byBwYXJzZSBTMyBVUkk6ICR7dXJpfWApO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBCdWNrZXQ6IG1hdGNoWzFdLFxuICAgICAgICBLZXk6IG1hdGNoWzJdLFxuICAgIH07XG59O1xuLyoqXG4gKiBHaXZlbiBhIGJ1Y2tldCBhbmQga2V5LCByZXR1cm4gYW4gUzMgVVJJXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIGFuIFMzIGJ1Y2tldCBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gYW4gUzMga2V5XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhbiBTMyBVUklcbiAqL1xuZXhwb3J0cy5idWlsZFMzVXJpID0gKGJ1Y2tldCwga2V5KSA9PiBgczM6Ly8ke2J1Y2tldH0vJHtrZXkucmVwbGFjZSgvXlxcLysvLCAnJyl9YDtcbi8qKlxuKiBDb252ZXJ0IFMzIFRhZ1NldCBPYmplY3QgdG8gcXVlcnkgc3RyaW5nXG4qIGUuZy4gW3sgS2V5OiAndGFnJywgVmFsdWU6ICd2YWx1ZSB9XSB0byAndGFnPXZhbHVlJ1xuKlxuKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IHRhZ3NldCAtIFMzIFRhZ1NldCBhcnJheVxuKiBAcmV0dXJucyB7c3RyaW5nfSB0YWdzIHF1ZXJ5IHN0cmluZ1xuKi9cbmV4cG9ydHMuczNUYWdTZXRUb1F1ZXJ5U3RyaW5nID0gKHRhZ3NldCkgPT4gdGFnc2V0Lm1hcCgoeyBLZXksIFZhbHVlIH0pID0+IGAke0tleX09JHtWYWx1ZX1gKS5qb2luKCcmJyk7XG4vKipcbiAqIERlbGV0ZSBhbiBvYmplY3QgZnJvbSBTM1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBidWNrZXQgLSBidWNrZXQgd2hlcmUgdGhlIG9iamVjdCBleGlzdHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBrZXkgb2YgdGhlIG9iamVjdCB0byBiZSBkZWxldGVkXG4gKiBwcm9taXNlIG9mIHRoZSBvYmplY3QgYmVpbmcgZGVsZXRlZFxuICovXG5leHBvcnRzLmRlbGV0ZVMzT2JqZWN0ID0gdXRpbHNfMS5pbXByb3ZlU3RhY2tUcmFjZSgoYnVja2V0LCBrZXkpID0+IHNlcnZpY2VzXzEuczMoKS5kZWxldGVPYmplY3QoeyBCdWNrZXQ6IGJ1Y2tldCwgS2V5OiBrZXkgfSkucHJvbWlzZSgpKTtcbi8qKlxuKiBHZXQgYW4gb2JqZWN0IGhlYWRlciBmcm9tIFMzXG4qXG4qIEBwYXJhbSB7c3RyaW5nfSBCdWNrZXQgLSBuYW1lIG9mIGJ1Y2tldFxuKiBAcGFyYW0ge3N0cmluZ30gS2V5IC0ga2V5IGZvciBvYmplY3QgKGZpbGVwYXRoICsgZmlsZW5hbWUpXG4qIEBwYXJhbSB7T2JqZWN0fSByZXRyeU9wdGlvbnMgLSBvcHRpb25zIHRvIGNvbnRyb2wgcmV0cnkgYmVoYXZpb3Igd2hlbiBhblxuKiAgIG9iamVjdCBkb2VzIG5vdCBleGlzdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aW0ta29zL25vZGUtcmV0cnkjcmV0cnlvcGVyYXRpb25vcHRpb25zXG4qICAgQnkgZGVmYXVsdCwgcmV0cmllcyB3aWxsIG5vdCBiZSBwZXJmb3JtZWRcbiogQHJldHVybnMge1Byb21pc2V9IHJldHVybnMgcmVzcG9uc2UgZnJvbSBgUzMuaGVhZE9iamVjdGAgYXMgYSBwcm9taXNlXG4qKi9cbmV4cG9ydHMuaGVhZE9iamVjdCA9IHV0aWxzXzEuaW1wcm92ZVN0YWNrVHJhY2UoKEJ1Y2tldCwgS2V5LCByZXRyeU9wdGlvbnMgPSB7IHJldHJpZXM6IDAgfSkgPT4gcF9yZXRyeV8xLmRlZmF1bHQoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBzZXJ2aWNlc18xLnMzKCkuaGVhZE9iamVjdCh7IEJ1Y2tldCwgS2V5IH0pLnByb21pc2UoKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnTm90Rm91bmQnKVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIHRocm93IG5ldyBwX3JldHJ5XzEuZGVmYXVsdC5BYm9ydEVycm9yKGVycm9yKTtcbiAgICB9XG59LCB7IG1heFRpbWVvdXQ6IDEwMDAwLCAuLi5yZXRyeU9wdGlvbnMgfSkpO1xuLyoqXG4gKiBUZXN0IGlmIGFuIG9iamVjdCBleGlzdHMgaW4gUzNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gc2FtZSBwYXJhbXMgYXMgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9TMy5odG1sI2hlYWRPYmplY3QtcHJvcGVydHlcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBhIFByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgdG8gYSBib29sZWFuIGluZGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgZXhpc3RzXG4gKi9cbmV4cG9ydHMuczNPYmplY3RFeGlzdHMgPSAocGFyYW1zKSA9PiBleHBvcnRzLmhlYWRPYmplY3QocGFyYW1zLkJ1Y2tldCwgcGFyYW1zLktleSlcbiAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ05vdEZvdW5kJylcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIHRocm93IGVycm9yO1xufSk7XG4vKipcbiAqIFdhaXQgZm9yIGFuIG9iamVjdCB0byBleGlzdCBpbiBTM1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuYnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmtleVxuICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbXMuaW50ZXJ2YWw9MTAwMF0gLSBpbnRlcnZhbCBiZWZvcmUgcmV0cmllcywgaW4gbXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBbcGFyYW1zLnRpbWVvdXQ9MzAwMDBdIC0gdGltZW91dCwgaW4gbXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi9cbmV4cG9ydHMud2FpdEZvck9iamVjdFRvRXhpc3QgPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgeyBidWNrZXQsIGtleSwgaW50ZXJ2YWwgPSAxMDAwLCB0aW1lb3V0ID0gMzAgKiAxMDAwLCB9ID0gcGFyYW1zO1xuICAgIGF3YWl0IHBfd2FpdF9mb3JfMS5kZWZhdWx0KCgpID0+IGV4cG9ydHMuczNPYmplY3RFeGlzdHMoeyBCdWNrZXQ6IGJ1Y2tldCwgS2V5OiBrZXkgfSksIHsgaW50ZXJ2YWwsIHRpbWVvdXQgfSk7XG59O1xuLyoqXG4qIFB1dCBhbiBvYmplY3Qgb24gUzNcbipcbiogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHNhbWUgcGFyYW1zIGFzIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvUzMuaHRtbCNwdXRPYmplY3QtcHJvcGVydHlcbiogcHJvbWlzZSBvZiB0aGUgb2JqZWN0IGJlaW5nIHB1dFxuKiovXG5leHBvcnRzLnMzUHV0T2JqZWN0ID0gdXRpbHNfMS5pbXByb3ZlU3RhY2tUcmFjZSgocGFyYW1zKSA9PiBzZXJ2aWNlc18xLnMzKCkucHV0T2JqZWN0KHtcbiAgICBBQ0w6ICdwcml2YXRlJyxcbiAgICAuLi5wYXJhbXMsXG59KS5wcm9taXNlKCkpO1xuLyoqXG4gKiBVcGxvYWQgYSBmaWxlIHRvIFMzXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIHRoZSBkZXN0aW5hdGlvbiBTMyBidWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSB0aGUgZGVzdGluYXRpb24gUzMga2V5XG4gKiBAcGFyYW0ge2ZpbGVuYW1lfSBmaWxlbmFtZSAtIHRoZSBsb2NhbCBmaWxlIHRvIGJlIHVwbG9hZGVkXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0cy5wdXRGaWxlID0gKGJ1Y2tldCwga2V5LCBmaWxlbmFtZSkgPT4gZXhwb3J0cy5zM1B1dE9iamVjdCh7XG4gICAgQnVja2V0OiBidWNrZXQsXG4gICAgS2V5OiBrZXksXG4gICAgQm9keTogZnNfMS5kZWZhdWx0LmNyZWF0ZVJlYWRTdHJlYW0oZmlsZW5hbWUpLFxufSk7XG4vKipcbiogQ29weSBhbiBvYmplY3QgZnJvbSBvbmUgbG9jYXRpb24gb24gUzMgdG8gYW5vdGhlclxuKlxuKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gc2FtZSBwYXJhbXMgYXMgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9TMy5odG1sI3B1dE9iamVjdC1wcm9wZXJ0eVxuKiBAcmV0dXJucyB7UHJvbWlzZX0gcHJvbWlzZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGNvcGllZFxuKiovXG5leHBvcnRzLnMzQ29weU9iamVjdCA9IHV0aWxzXzEuaW1wcm92ZVN0YWNrVHJhY2UoKHBhcmFtcykgPT4gc2VydmljZXNfMS5zMygpLmNvcHlPYmplY3Qoe1xuICAgIFRhZ2dpbmdEaXJlY3RpdmU6ICdDT1BZJyxcbiAgICAuLi5wYXJhbXMsXG59KS5wcm9taXNlKCkpO1xuLyoqXG4gKiBVcGxvYWQgZGF0YSB0byBTM1xuICpcbiAqIE5vdGU6IFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGBhd3MuczMoKS51cGxvYWQocGFyYW1zKS5wcm9taXNlKClgXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHNlZSBbUzMudXBsb2FkKCldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvUzMuaHRtbCN1cGxvYWQtcHJvcGVydHkpXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gc2VlIFtTMy51cGxvYWQoKV0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9TMy5odG1sI3VwbG9hZC1wcm9wZXJ0eSlcbiAqL1xuZXhwb3J0cy5wcm9taXNlUzNVcGxvYWQgPSB1dGlsc18xLmltcHJvdmVTdGFja1RyYWNlKChwYXJhbXMpID0+IHNlcnZpY2VzXzEuczMoKS51cGxvYWQocGFyYW1zKS5wcm9taXNlKCkpO1xuLyoqXG4gKiBVcGxvYWQgZGF0YSB0byBTMyB1c2luZyBhIHN0cmVhbVxuICpcbiAqIFdlIGFyZSBub3QgdXNpbmcgYHMzLnVwbG9hZCgpLnByb21pc2UoKWAgZHVlIHRvIGVycm9ycyBvYnNlcnZlZCBpbiB0ZXN0aW5nXG4gKiB3aXRoIHVuY2F1Z2h0IGV4Y2VwdGlvbnMuIEJ5IGNyZWF0aW5nIG91ciBvd24gcHJvbWlzZSwgd2UgY2FuIGVuc3VyZSBhbnlcbiAqIGVycm9ycyBmcm9tIHRoZSBzdHJlYW1zIG9yIHVwbG9hZCBjYXVzZSB0aGlzIHByb21pc2UgdG8gcmVqZWN0LlxuICpcbiAqIEBwYXJhbSB7UmVhZGFibGV9IHVwbG9hZFN0cmVhbSAtIFN0cmVhbSBvZiBkYXRhIHRvIHVwbG9hZFxuICogQHBhcmFtIHtPYmplY3R9IHVwbG9hZFBhcmFtcyAtIHNlZSBbUzMudXBsb2FkKCldKGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvUzMuaHRtbCN1cGxvYWQtcHJvcGVydHkpXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0cy5zdHJlYW1TM1VwbG9hZCA9ICh1cGxvYWRTdHJlYW0sIHVwbG9hZFBhcmFtcykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHBhc3MgPSBuZXcgc3RyZWFtXzEuUGFzc1Rocm91Z2goKTtcbiAgICB1cGxvYWRTdHJlYW0ucGlwZShwYXNzKTtcbiAgICB1cGxvYWRTdHJlYW0ub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICBwYXNzLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgcmV0dXJuIHNlcnZpY2VzXzEuczMoKS51cGxvYWQoe1xuICAgICAgICAuLi51cGxvYWRQYXJhbXMsXG4gICAgICAgIEJvZHk6IHBhc3MsXG4gICAgfSwgKGVyciwgdXBsb2FkUmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlKHVwbG9hZFJlc3BvbnNlKTtcbiAgICB9KTtcbn0pO1xuLyoqXG4gKiBEb3dubG9hZHMgdGhlIGdpdmVuIHMzT2JqIHRvIHRoZSBnaXZlbiBmaWxlbmFtZSBpbiBhIHN0cmVhbWluZyBtYW5uZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gczNPYmogLSBUaGUgcGFyYW1ldGVycyB0byBzZW5kIHRvIFMzIGdldE9iamVjdCBjYWxsXG4gKiBAcGFyYW0ge3N0cmluZ30gZmlsZXBhdGggLSBUaGUgZmlsZXBhdGggb2YgdGhlIGZpbGUgdGhhdCBpcyBkb3dubG9hZGVkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSByZXR1cm5zIGZpbGVuYW1lIGlmIHN1Y2Nlc3NmdWxcbiAqL1xuZXhwb3J0cy5kb3dubG9hZFMzRmlsZSA9IChzM09iaiwgZmlsZXBhdGgpID0+IHtcbiAgICBjb25zdCBmaWxlV3JpdGVTdHJlYW0gPSBmc18xLmRlZmF1bHQuY3JlYXRlV3JpdGVTdHJlYW0oZmlsZXBhdGgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IG9iamVjdFJlYWRTdHJlYW0gPSBzZXJ2aWNlc18xLnMzKCkuZ2V0T2JqZWN0KHMzT2JqKS5jcmVhdGVSZWFkU3RyZWFtKCk7XG4gICAgICAgIHB1bXBfMS5kZWZhdWx0KG9iamVjdFJlYWRTdHJlYW0sIGZpbGVXcml0ZVN0cmVhbSwgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycilcbiAgICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXNvbHZlKGZpbGVwYXRoKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBHZXQgdGhlIHNpemUgb2YgYW4gUzMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5idWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMua2V5XG4gKiBAcGFyYW0ge0FXUy5TM30gcGFyYW1zLnMzIC0gYW4gUzMgY2xpZW50IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxudW1iZXJ8dW5kZWZpbmVkPn0gb2JqZWN0IHNpemUsIGluIGJ5dGVzXG4gKi9cbmV4cG9ydHMuZ2V0T2JqZWN0U2l6ZSA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gICAgY29uc3QgeyBzMywgYnVja2V0LCBrZXkgfSA9IHBhcmFtcztcbiAgICBjb25zdCBoZWFkT2JqZWN0UmVzcG9uc2UgPSBhd2FpdCBzMy5oZWFkT2JqZWN0KHtcbiAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgIEtleToga2V5LFxuICAgIH0pLnByb21pc2UoKTtcbiAgICByZXR1cm4gaGVhZE9iamVjdFJlc3BvbnNlLkNvbnRlbnRMZW5ndGg7XG59O1xuLyoqXG4qIEdldCBvYmplY3QgVGFnZ2luZyBmcm9tIFMzXG4qXG4qIEBwYXJhbSB7c3RyaW5nfSBidWNrZXQgLSBuYW1lIG9mIGJ1Y2tldFxuKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0ga2V5IGZvciBvYmplY3QgKGZpbGVwYXRoICsgZmlsZW5hbWUpXG4qIEByZXR1cm5zIHtQcm9taXNlPEFXUy5TMy5HZXRPYmplY3RUYWdnaW5nT3V0cHV0Pn0gdGhlIHByb21pc2VkIHJlc3BvbnNlIGZyb20gYFMzLmdldE9iamVjdFRhZ2dpbmdgXG4qKi9cbmV4cG9ydHMuczNHZXRPYmplY3RUYWdnaW5nID0gdXRpbHNfMS5pbXByb3ZlU3RhY2tUcmFjZSgoYnVja2V0LCBrZXkpID0+IHNlcnZpY2VzXzEuczMoKS5nZXRPYmplY3RUYWdnaW5nKHsgQnVja2V0OiBidWNrZXQsIEtleToga2V5IH0pLnByb21pc2UoKSk7XG5jb25zdCBnZXRPYmplY3RUYWdzID0gYXN5bmMgKGJ1Y2tldCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFnZ2luZ1Jlc3BvbnNlID0gYXdhaXQgZXhwb3J0cy5zM0dldE9iamVjdFRhZ2dpbmcoYnVja2V0LCBrZXkpO1xuICAgIHJldHVybiB0YWdnaW5nUmVzcG9uc2UuVGFnU2V0LnJlZHVjZSgoYWNjLCB7IEtleSwgVmFsdWUgfSkgPT4gKHsgLi4uYWNjLCBbS2V5XTogVmFsdWUgfSksIHt9KTtcbn07XG5jb25zdCBnZXRPYmplY3RUYWdnaW5nU3RyaW5nID0gYXN5bmMgKGJ1Y2tldCwga2V5KSA9PiB7XG4gICAgY29uc3QgdGFncyA9IGF3YWl0IGdldE9iamVjdFRhZ3MoYnVja2V0LCBrZXkpO1xuICAgIHJldHVybiBxdWVyeXN0cmluZ18xLmRlZmF1bHQuc3RyaW5naWZ5KHRhZ3MpO1xufTtcbi8qKlxuKiBQdXRzIG9iamVjdCBUYWdnaW5nIGluIFMzXG4qIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NKYXZhU2NyaXB0U0RLL2xhdGVzdC9BV1MvUzMuaHRtbCNwdXRPYmplY3RUYWdnaW5nLXByb3BlcnR5XG4qXG4qIEBwYXJhbSB7c3RyaW5nfSBCdWNrZXQgLSBuYW1lIG9mIGJ1Y2tldFxuKiBAcGFyYW0ge3N0cmluZ30gS2V5IC0ga2V5IGZvciBvYmplY3QgKGZpbGVwYXRoICsgZmlsZW5hbWUpXG4qIEBwYXJhbSB7T2JqZWN0fSBUYWdnaW5nIC0gdGFnZ2luZyBvYmplY3RcbiogQHJldHVybnMge1Byb21pc2V9IHJldHVybnMgcmVzcG9uc2UgZnJvbSBgUzMuZ2V0T2JqZWN0VGFnZ2luZ2AgYXMgYSBwcm9taXNlXG4qKi9cbmV4cG9ydHMuczNQdXRPYmplY3RUYWdnaW5nID0gdXRpbHNfMS5pbXByb3ZlU3RhY2tUcmFjZSgoQnVja2V0LCBLZXksIFRhZ2dpbmcpID0+IHNlcnZpY2VzXzEuczMoKS5wdXRPYmplY3RUYWdnaW5nKHtcbiAgICBCdWNrZXQsXG4gICAgS2V5LFxuICAgIFRhZ2dpbmcsXG59KS5wcm9taXNlKCkpO1xuLyoqXG4gKiBHZXRzIGFuIG9iamVjdCBmcm9tIFMzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBvYmogPSBhd2FpdCBnZXRPYmplY3QoczMoKSwgeyBCdWNrZXQ6ICdiJywgS2V5OiAnaycgfSlcbiAqXG4gKiBAcGFyYW0ge0FXUy5TM30gczMgLSBhbiBgQVdTLlMzYCBpbnN0YW5jZVxuICogQHBhcmFtIHtBV1MuUzMuR2V0T2JqZWN0UmVxdWVzdH0gcGFyYW1zIC0gcGFyYW1ldGVycyBvYmplY3QgdG8gcGFzcyB0aHJvdWdoXG4gKiAgIHRvIGBBV1MuUzMuZ2V0T2JqZWN0KClgXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBV1MuUzMuR2V0T2JqZWN0T3V0cHV0Pn0gcmVzcG9uc2UgZnJvbSBgQVdTLlMzLmdldE9iamVjdCgpYFxuICogICBhcyBhIFByb21pc2VcbiAqL1xuZXhwb3J0cy5nZXRPYmplY3QgPSAoXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG5zMywgcGFyYW1zKSA9PiBzMy5nZXRPYmplY3QocGFyYW1zKS5wcm9taXNlKCk7XG4vKipcbiAqIEdldCBhbiBvYmplY3QgZnJvbSBTMywgd2FpdGluZyBmb3IgaXQgdG8gZXhpc3QgYW5kLCBpZiBzcGVjaWZpZWQsIGhhdmUgdGhlXG4gKiBjb3JyZWN0IEVUYWcuXG4gKlxuICogQHBhcmFtIHtBV1MuUzN9IHMzQ2xpZW50XG4gKiBAcGFyYW0ge0FXUy5TMy5HZXRPYmplY3RSZXF1ZXN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7cFJldHJ5Lk9wdGlvbnN9IFtyZXRyeU9wdGlvbnM9e31dXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBV1MuUzMuR2V0T2JqZWN0T3V0cHV0Pn1cbiAqL1xuZXhwb3J0cy53YWl0Rm9yT2JqZWN0ID0gKHMzQ2xpZW50LCBwYXJhbXMsIHJldHJ5T3B0aW9ucyA9IHt9KSA9PiBwX3JldHJ5XzEuZGVmYXVsdChhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGV4cG9ydHMuZ2V0T2JqZWN0KHMzQ2xpZW50LCBwYXJhbXMpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gUmV0cnkgaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdFxuICAgICAgICBpZiAoZXJyb3IuY29kZSA9PT0gJ05vU3VjaEtleScpXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgLy8gUmV0cnkgaWYgdGhlIGV0YWcgZGlkIG5vdCBtYXRjaFxuICAgICAgICBpZiAocGFyYW1zLklmTWF0Y2ggJiYgZXJyb3IuY29kZSA9PT0gJ1ByZWNvbmRpdGlvbkZhaWxlZCcpXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgLy8gRm9yIGFueSBvdGhlciBlcnJvciwgZmFpbCB3aXRob3V0IHJldHJ5aW5nXG4gICAgICAgIHRocm93IG5ldyBwX3JldHJ5XzEuZGVmYXVsdC5BYm9ydEVycm9yKGVycm9yKTtcbiAgICB9XG59LCByZXRyeU9wdGlvbnMpO1xuLyoqXG4gKiBHZXRzIGFuIG9iamVjdCBmcm9tIFMzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBCdWNrZXQgLSBuYW1lIG9mIGJ1Y2tldFxuICogQHBhcmFtIHtzdHJpbmd9IEtleSAtIGtleSBmb3Igb2JqZWN0IChmaWxlcGF0aCArIGZpbGVuYW1lKVxuICogQHBhcmFtIHtPYmplY3R9IHJldHJ5T3B0aW9ucyAtIG9wdGlvbnMgdG8gY29udHJvbCByZXRyeSBiZWhhdmlvciB3aGVuIGFuXG4gKiAgIG9iamVjdCBkb2VzIG5vdCBleGlzdC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90aW0ta29zL25vZGUtcmV0cnkjcmV0cnlvcGVyYXRpb25vcHRpb25zXG4gKiAgIEJ5IGRlZmF1bHQsIHJldHJpZXMgd2lsbCBub3QgYmUgcGVyZm9ybWVkXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyByZXNwb25zZSBmcm9tIGBTMy5nZXRPYmplY3RgIGFzIGEgcHJvbWlzZVxuICpcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydHMuZ2V0UzNPYmplY3QgPSB1dGlsXzEuZGVwcmVjYXRlKHV0aWxzXzEuaW1wcm92ZVN0YWNrVHJhY2UoKEJ1Y2tldCwgS2V5LCByZXRyeU9wdGlvbnMgPSB7IHJldHJpZXM6IDAgfSkgPT4gZXhwb3J0cy53YWl0Rm9yT2JqZWN0KHNlcnZpY2VzXzEuczMoKSwgeyBCdWNrZXQsIEtleSB9LCB7XG4gICAgbWF4VGltZW91dDogMTAwMDAsXG4gICAgb25GYWlsZWRBdHRlbXB0OiAoZXJyKSA9PiBsb2cuZGVidWcoYGdldFMzT2JqZWN0KCcke0J1Y2tldH0nLCAnJHtLZXl9JykgZmFpbGVkIHdpdGggJHtlcnIucmV0cmllc0xlZnR9IHJldHJpZXMgbGVmdDogJHtlcnIubWVzc2FnZX1gKSxcbiAgICAuLi5yZXRyeU9wdGlvbnMsXG59KSksIGJ1aWxkRGVwcmVjYXRpb25NZXNzYWdlKCdAY3VtdWx1cy9hd3MtY2xpZW50L1MzLmdldFMzT2JqZWN0JywgJzIuMC4xJywgJ0BjdW11bHVzL2F3cy1jbGllbnQvUzMuZ2V0T2JqZWN0IG9yIEBjdW11bHVzL2F3cy1jbGllbnQvUzMud2FpdEZvck9iamVjdCcpKTtcbi8qKlxuICogRmV0Y2ggdGhlIGNvbnRlbnRzIG9mIGFuIFMzIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBidWNrZXQgLSB0aGUgUzMgb2JqZWN0J3MgYnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gdGhlIFMzIG9iamVjdCdzIGtleVxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gdGhlIGNvbnRlbnRzIG9mIHRoZSBTMyBvYmplY3RcbiAqL1xuZXhwb3J0cy5nZXRUZXh0T2JqZWN0ID0gKGJ1Y2tldCwga2V5KSA9PiBleHBvcnRzLmdldFMzT2JqZWN0KGJ1Y2tldCwga2V5KVxuICAgIC50aGVuKCh7IEJvZHkgfSkgPT4ge1xuICAgIGlmIChCb2R5ID09PSB1bmRlZmluZWQpXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIEJvZHkudG9TdHJpbmcoKTtcbn0pO1xuLyoqXG4gKiBGZXRjaCBKU09OIHN0b3JlZCBpbiBhbiBTMyBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBidWNrZXQgLSB0aGUgUzMgb2JqZWN0J3MgYnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gdGhlIFMzIG9iamVjdCdzIGtleVxuICogQHJldHVybnMge1Byb21pc2U8Kj59IHRoZSBjb250ZW50cyBvZiB0aGUgUzMgb2JqZWN0LCBwYXJzZWQgYXMgSlNPTlxuICovXG5leHBvcnRzLmdldEpzb25TM09iamVjdCA9IChidWNrZXQsIGtleSkgPT4gZXhwb3J0cy5nZXRUZXh0T2JqZWN0KGJ1Y2tldCwga2V5KVxuICAgIC50aGVuKCh0ZXh0KSA9PiB7XG4gICAgaWYgKHRleHQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbn0pO1xuZXhwb3J0cy5wdXRKc29uUzNPYmplY3QgPSAoYnVja2V0LCBrZXksIGRhdGEpID0+IGV4cG9ydHMuczNQdXRPYmplY3Qoe1xuICAgIEJ1Y2tldDogYnVja2V0LFxuICAgIEtleToga2V5LFxuICAgIEJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxufSk7XG4vKipcbiAqIEdldCBhIHJlYWRhYmxlIHN0cmVhbSBmb3IgYW4gUzMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtBV1MuUzN9IHBhcmFtcy5zMyAtIGFuIEFXUy5TMyBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5idWNrZXQgLSB0aGUgYnVja2V0IG9mIHRoZSByZXF1ZXN0ZWQgb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmtleSAtIHRoZSBrZXkgb2YgdGhlIHJlcXVlc3RlZCBvYmplY3RcbiAqIEByZXR1cm5zIHtSZWFkYWJsZX1cbiAqL1xuZXhwb3J0cy5nZXRPYmplY3RSZWFkU3RyZWFtID0gKHBhcmFtcykgPT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbiAgICBjb25zdCB7IHMzLCBidWNrZXQsIGtleSB9ID0gcGFyYW1zO1xuICAgIHJldHVybiBzMy5nZXRPYmplY3QoeyBCdWNrZXQ6IGJ1Y2tldCwgS2V5OiBrZXkgfSkuY3JlYXRlUmVhZFN0cmVhbSgpO1xufTtcbi8qKlxuKiBDaGVjayBpZiBhIGZpbGUgZXhpc3RzIGluIGFuIFMzIG9iamVjdFxuKlxuKiBAcGFyYW0ge3N0cmluZ30gYnVja2V0IC0gbmFtZSBvZiB0aGUgUzMgYnVja2V0XG4qIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBrZXkgb2YgdGhlIGZpbGUgaW4gdGhlIFMzIGJ1Y2tldFxuKiBAcmV0dXJucyB7UHJvbWlzZX0gcmV0dXJucyB0aGUgcmVzcG9uc2UgZnJvbSBgUzMuaGVhZE9iamVjdGAgYXMgYSBwcm9taXNlXG4qKi9cbmV4cG9ydHMuZmlsZUV4aXN0cyA9IGFzeW5jIChidWNrZXQsIGtleSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZXJ2aWNlc18xLnMzKCkuaGVhZE9iamVjdCh7IEtleToga2V5LCBCdWNrZXQ6IGJ1Y2tldCB9KS5wcm9taXNlKCk7XG4gICAgICAgIHJldHVybiByO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gaWYgZmlsZSBpcyBub3QgcmV0dXJuIGZhbHNlXG4gICAgICAgIGlmIChlcnJvci5zdGFjay5tYXRjaCgvKE5vdEZvdW5kKS8pIHx8IGVycm9yLnN0YWNrLm1hdGNoKC8oTm9TdWNoQnVja2V0KS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufTtcbmV4cG9ydHMuZG93bmxvYWRTM0ZpbGVzID0gYXN5bmMgKHMzT2JqcywgZGlyLCBzM29wdHMgPSB7fSkgPT4ge1xuICAgIC8vIFNjcnViIHMzT2picyB0byBhdm9pZCBlcnJvcnMgZnJvbSB0aGUgQVdTIFNES1xuICAgIGNvbnN0IHNjcnViYmVkUzNPYmpzID0gczNPYmpzLm1hcCgoczNPYmopID0+ICh7XG4gICAgICAgIEJ1Y2tldDogczNPYmouQnVja2V0LFxuICAgICAgICBLZXk6IHMzT2JqLktleSxcbiAgICB9KSk7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IG4gPSBzM09ianMubGVuZ3RoO1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyBkb3dubG9hZCBvZiAke259IGtleXMgdG8gJHtkaXJ9YCk7XG4gICAgY29uc3QgcHJvbWlzZURvd25sb2FkID0gKHMzT2JqKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aF8xLmRlZmF1bHQuam9pbihkaXIsIHBhdGhfMS5kZWZhdWx0LmJhc2VuYW1lKHMzT2JqLktleSkpO1xuICAgICAgICBjb25zdCBmaWxlID0gZnNfMS5kZWZhdWx0LmNyZWF0ZVdyaXRlU3RyZWFtKGZpbGVuYW1lKTtcbiAgICAgICAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oczNPYmosIHMzb3B0cyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBzZXJ2aWNlc18xLnMzKCkuZ2V0T2JqZWN0KG9wdHMpXG4gICAgICAgICAgICAgICAgLmNyZWF0ZVJlYWRTdHJlYW0oKVxuICAgICAgICAgICAgICAgIC5waXBlKGZpbGUpXG4gICAgICAgICAgICAgICAgLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nLmluZm8oYFByb2dyZXNzOiBbJHtpfSBvZiAke259XSBzMzovLyR7czNPYmouQnVja2V0fS8ke3MzT2JqLktleX0gLT4gJHtmaWxlbmFtZX1gKTtcbiAgICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoczNPYmouS2V5KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgcmV0dXJuIGF3YWl0IHBfbWFwXzEuZGVmYXVsdChzY3J1YmJlZFMzT2JqcywgcHJvbWlzZURvd25sb2FkLCB7IGNvbmN1cnJlbmN5OiBTM19SQVRFX0xJTUlUIH0pO1xufTtcbi8qKlxuICogRGVsZXRlIGZpbGVzIGZyb20gUzNcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBzM09ianMgLSBBbiBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcga2V5cyAnQnVja2V0JyBhbmQgJ0tleSdcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhbiBBcnJheSBvZiB0aGUgZGF0YSByZXR1cm5lZFxuICogICBmcm9tIHRoZSBkZWxldGlvbiBvcGVyYXRpb25zXG4gKi9cbmV4cG9ydHMuZGVsZXRlUzNGaWxlcyA9IGFzeW5jIChzM09ianMpID0+IGF3YWl0IHBfbWFwXzEuZGVmYXVsdChzM09ianMsIChzM09iaikgPT4gc2VydmljZXNfMS5zMygpLmRlbGV0ZU9iamVjdChzM09iaikucHJvbWlzZSgpLCB7IGNvbmN1cnJlbmN5OiBTM19SQVRFX0xJTUlUIH0pO1xuLyoqXG4qIERlbGV0ZSBhIGJ1Y2tldCBhbmQgYWxsIG9mIGl0cyBvYmplY3RzIGZyb20gUzNcbipcbiogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIG5hbWUgb2YgdGhlIGJ1Y2tldFxuKiBAcmV0dXJucyB7UHJvbWlzZX0gdGhlIHByb21pc2VkIHJlc3VsdCBvZiBgUzMuZGVsZXRlQnVja2V0YFxuKiovXG5leHBvcnRzLnJlY3Vyc2l2ZWx5RGVsZXRlUzNCdWNrZXQgPSB1dGlsc18xLmltcHJvdmVTdGFja1RyYWNlKGFzeW5jIChidWNrZXQpID0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlcnZpY2VzXzEuczMoKS5saXN0T2JqZWN0cyh7IEJ1Y2tldDogYnVja2V0IH0pLnByb21pc2UoKTtcbiAgICBjb25zdCBzM09iamVjdHMgPSAocmVzcG9uc2UuQ29udGVudHMgfHwgW10pLm1hcCgobykgPT4ge1xuICAgICAgICBpZiAoIW8uS2V5KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gZGV0ZXJtaW5lIFMzIGtleSBvZiAke0pTT04uc3RyaW5naWZ5KG8pfWApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgICBLZXk6IG8uS2V5LFxuICAgICAgICB9O1xuICAgIH0pO1xuICAgIGF3YWl0IGV4cG9ydHMuZGVsZXRlUzNGaWxlcyhzM09iamVjdHMpO1xuICAgIGF3YWl0IHNlcnZpY2VzXzEuczMoKS5kZWxldGVCdWNrZXQoeyBCdWNrZXQ6IGJ1Y2tldCB9KS5wcm9taXNlKCk7XG59KTtcbi8qKlxuKiBEZWxldGUgYSBsaXN0IG9mIGJ1Y2tldHMgYW5kIGFsbCBvZiB0aGVpciBvYmplY3RzIGZyb20gUzNcbipcbiogQHBhcmFtIHtBcnJheX0gYnVja2V0cyAtIGxpc3Qgb2YgYnVja2V0IG5hbWVzXG4qIEByZXR1cm5zIHtQcm9taXNlfSB0aGUgcHJvbWlzZWQgcmVzdWx0IG9mIGBTMy5kZWxldGVCdWNrZXRgXG4qKi9cbmV4cG9ydHMuZGVsZXRlUzNCdWNrZXRzID0gYXN5bmMgKGJ1Y2tldHMpID0+IGF3YWl0IFByb21pc2UuYWxsKGJ1Y2tldHMubWFwKGV4cG9ydHMucmVjdXJzaXZlbHlEZWxldGVTM0J1Y2tldCkpO1xuZXhwb3J0cy51cGxvYWRTM0ZpbGVzID0gYXN5bmMgKGZpbGVzLCBkZWZhdWx0QnVja2V0LCBrZXlQYXRoLCBzM29wdHMgPSB7fSkgPT4ge1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCBuID0gZmlsZXMubGVuZ3RoO1xuICAgIGlmIChuID4gMSkge1xuICAgICAgICBsb2cuaW5mbyhgU3RhcnRpbmcgdXBsb2FkIG9mICR7bn0ga2V5c2ApO1xuICAgIH1cbiAgICBjb25zdCBwcm9taXNlVXBsb2FkID0gYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgICAgbGV0IGJ1Y2tldDtcbiAgICAgICAgbGV0IGZpbGVuYW1lO1xuICAgICAgICBsZXQga2V5O1xuICAgICAgICBpZiAodHlwZW9mIGZpbGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBidWNrZXQgPSBkZWZhdWx0QnVja2V0O1xuICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXlQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGtleSA9IGV4cG9ydHMuczNKb2luKGtleVBhdGgsIHBhdGhfMS5kZWZhdWx0LmJhc2VuYW1lKGZpbGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGtleSA9IGtleVBhdGgoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBidWNrZXQgPSBmaWxlLmJ1Y2tldCB8fCBkZWZhdWx0QnVja2V0O1xuICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlLmZpbGVuYW1lO1xuICAgICAgICAgICAga2V5ID0gZmlsZS5rZXk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgZXhwb3J0cy5wcm9taXNlUzNVcGxvYWQoe1xuICAgICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgICBLZXk6IGtleSxcbiAgICAgICAgICAgIEJvZHk6IGZzXzEuZGVmYXVsdC5jcmVhdGVSZWFkU3RyZWFtKGZpbGVuYW1lKSxcbiAgICAgICAgICAgIC4uLnMzb3B0cyxcbiAgICAgICAgfSk7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgbG9nLmluZm8oYFByb2dyZXNzOiBbJHtpfSBvZiAke259XSAke2ZpbGVuYW1lfSAtPiBzMzovLyR7YnVja2V0fS8ke2tleX1gKTtcbiAgICAgICAgcmV0dXJuIHsga2V5LCBidWNrZXQgfTtcbiAgICB9O1xuICAgIHJldHVybiBhd2FpdCBwX21hcF8xLmRlZmF1bHQoZmlsZXMsIHByb21pc2VVcGxvYWQsIHsgY29uY3VycmVuY3k6IFMzX1JBVEVfTElNSVQgfSk7XG59O1xuLyoqXG4gKiBVcGxvYWQgdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBzdHJlYW0gdG8gYW4gUzMgYnVja2V0XG4gKlxuICogQHBhcmFtIHtSZWFkYWJsZVN0cmVhbX0gZmlsZVN0cmVhbSAtIFRoZSBzdHJlYW0gZm9yIHRoZSBmaWxlJ3MgY29udGVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBidWNrZXQgLSBUaGUgUzMgYnVja2V0IHRvIHdoaWNoIHRoZSBmaWxlIGlzIHRvIGJlIHVwbG9hZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byB0aGUgZmlsZSBpbiB0aGUgYnVja2V0XG4gKiBAcGFyYW0ge09iamVjdH0gczNvcHRzIC0gT3B0aW9ucyB0byBwYXNzIHRvIHRoZSBBV1Mgc2RrIGNhbGwgKGRlZmF1bHRzIHRvIGB7fWApXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gQSBwcm9taXNlXG4gKi9cbmV4cG9ydHMudXBsb2FkUzNGaWxlU3RyZWFtID0gKGZpbGVTdHJlYW0sIGJ1Y2tldCwga2V5LCBzM29wdHMgPSB7fSkgPT4gZXhwb3J0cy5wcm9taXNlUzNVcGxvYWQoe1xuICAgIEJ1Y2tldDogYnVja2V0LFxuICAgIEtleToga2V5LFxuICAgIEJvZHk6IGZpbGVTdHJlYW0sXG4gICAgLi4uczNvcHRzLFxufSk7XG4vKipcbiAqIExpc3QgdGhlIG9iamVjdHMgaW4gYW4gUzMgYnVja2V0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJ1Y2tldCAtIFRoZSBuYW1lIG9mIHRoZSBidWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXggLSBPbmx5IG9iamVjdHMgd2l0aCBrZXlzIHN0YXJ0aW5nIHdpdGggdGhpcyBwcmVmaXhcbiAqICAgd2lsbCBiZSBpbmNsdWRlZCAodXNlZnVsIGZvciBzZWFyY2hpbmcgZm9sZGVycyBpbiBidWNrZXRzLCBlLmcuLCAnL1BEUicpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNraXBGb2xkZXJzIC0gSWYgdHJ1ZSBkb24ndCByZXR1cm4gb2JqZWN0cyB0aGF0IGFyZSBmb2xkZXJzXG4gKiAgIChkZWZhdWx0cyB0byB0cnVlKVxuICogQHJldHVybnMge1Byb21pc2V9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBsaXN0IG9mIG9iamVjdHMuIEVhY2ggUzNcbiAqICAgb2JqZWN0IGlzIHJlcHJlc2VudGVkIGFzIGEgSlMgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOiBgS2V5YCxcbiAqIGBFVGFnYCwgYExhc3RNb2RpZmllZGAsIGBPd25lcmAsIGBTaXplYCwgYFN0b3JhZ2VDbGFzc2AuXG4gKi9cbmV4cG9ydHMubGlzdFMzT2JqZWN0cyA9IGFzeW5jIChidWNrZXQsIHByZWZpeCwgc2tpcEZvbGRlcnMgPSB0cnVlKSA9PiB7XG4gICAgbG9nLmluZm8oYExpc3Rpbmcgb2JqZWN0cyBpbiBzMzovLyR7YnVja2V0fWApO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgfTtcbiAgICBpZiAocHJlZml4KVxuICAgICAgICBwYXJhbXMuUHJlZml4ID0gcHJlZml4O1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBzZXJ2aWNlc18xLnMzKCkubGlzdE9iamVjdHMocGFyYW1zKS5wcm9taXNlKCk7XG4gICAgbGV0IGNvbnRlbnRzID0gZGF0YS5Db250ZW50cyB8fCBbXTtcbiAgICBpZiAoc2tpcEZvbGRlcnMpIHtcbiAgICAgICAgLy8gRmlsdGVyIG91dCBhbnkgcmVmZXJlbmNlcyB0byBmb2xkZXJzXG4gICAgICAgIGNvbnRlbnRzID0gY29udGVudHMuZmlsdGVyKChvYmopID0+IG9iai5LZXkgIT09IHVuZGVmaW5lZCAmJiAhb2JqLktleS5lbmRzV2l0aCgnLycpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRlbnRzO1xufTtcbi8qKlxuICogRmV0Y2ggY29tcGxldGUgbGlzdCBvZiBTMyBvYmplY3RzXG4gKlxuICogbGlzdE9iamVjdHNWMiBpcyBsaW1pdGVkIHRvIDEsMDAwIHJlc3VsdHMgcGVyIGNhbGwuICBUaGlzIGZ1bmN0aW9uIGNvbnRpbnVlc1xuICogbGlzdGluZyBvYmplY3RzIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHRvIGJlIGZldGNoZWQuXG4gKlxuICogVGhlIHBhc3NlZCBwYXJhbXMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGxpc3RPYmplY3RzVjIgY2FsbC5cbiAqXG4gKiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTSmF2YVNjcmlwdFNESy9sYXRlc3QvQVdTL1MzLmh0bWwjbGlzdE9iamVjdHNWMi1wcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBwYXJhbXMgZm9yIHRoZSBzMy5saXN0T2JqZWN0c1YyIGNhbGxcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5Pn0gcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvXG4gKiAgIHRoZSBDb250ZW50cyBwcm9wZXJ0eSBvZiB0aGUgbGlzdE9iamVjdHNWMiByZXNwb25zZVxuICpcbiAqIEBzdGF0aWNcbiAqL1xuZXhwb3J0cy5saXN0UzNPYmplY3RzVjIgPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgLy8gRmV0Y2ggdGhlIGZpcnN0IGxpc3Qgb2Ygb2JqZWN0cyBmcm9tIFMzXG4gICAgbGV0IGxpc3RPYmplY3RzUmVzcG9uc2UgPSAoYXdhaXQgc2VydmljZXNfMS5zMygpLmxpc3RPYmplY3RzVjIocGFyYW1zKS5wcm9taXNlKCkpO1xuICAgIGxldCBkaXNjb3ZlcmVkT2JqZWN0cyA9IGxpc3RPYmplY3RzUmVzcG9uc2UuQ29udGVudHM7XG4gICAgLy8gS2VlcCBsaXN0aW5nIG1vcmUgb2JqZWN0cyBmcm9tIFMzIHVudGlsIHdlIGhhdmUgYWxsIG9mIHRoZW1cbiAgICB3aGlsZSAobGlzdE9iamVjdHNSZXNwb25zZS5Jc1RydW5jYXRlZCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICBsaXN0T2JqZWN0c1Jlc3BvbnNlID0gKGF3YWl0IHNlcnZpY2VzXzEuczMoKS5saXN0T2JqZWN0c1YyKFxuICAgICAgICAvLyBVcGRhdGUgdGhlIHBhcmFtcyB3aXRoIGEgQ29udGludWF0aW9uIFRva2VuXG4gICAgICAgIHtcbiAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgIENvbnRpbnVhdGlvblRva2VuOiBsaXN0T2JqZWN0c1Jlc3BvbnNlLk5leHRDb250aW51YXRpb25Ub2tlbixcbiAgICAgICAgfSkucHJvbWlzZSgpKTtcbiAgICAgICAgZGlzY292ZXJlZE9iamVjdHMgPSBkaXNjb3ZlcmVkT2JqZWN0cy5jb25jYXQobGlzdE9iamVjdHNSZXNwb25zZS5Db250ZW50cyk7XG4gICAgfVxuICAgIHJldHVybiBkaXNjb3ZlcmVkT2JqZWN0cztcbn07XG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgY3J5cHRvZ3JhcGhpYyBoYXNoIG9mIGFuIFMzIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7QVdTLlMzfSBwYXJhbXMuczMgLSBhbiBBV1MuUzMgaW5zdGFuY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuYWxnb3JpdGhtIC0gYGNrc3VtYCwgb3IgYW4gYWxnb3JpdGhtIGxpc3RlZCBpblxuICogICBgb3BlbnNzbCBsaXN0IC1kaWdlc3QtYWxnb3JpdGhtc2BcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuYnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmtleVxuICovXG5leHBvcnRzLmNhbGN1bGF0ZU9iamVjdEhhc2ggPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvd1xuICAgIGNvbnN0IHsgYWxnb3JpdGhtLCBidWNrZXQsIGtleSwgczMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBzdHJlYW0gPSBleHBvcnRzLmdldE9iamVjdFJlYWRTdHJlYW0oeyBzMywgYnVja2V0LCBrZXkgfSk7XG4gICAgcmV0dXJuIGF3YWl0IGNoZWNrc3VtXzEuZ2VuZXJhdGVDaGVja3N1bUZyb21TdHJlYW0oYWxnb3JpdGhtLCBzdHJlYW0pO1xufTtcbi8qKlxuICogVmFsaWRhdGUgUzMgb2JqZWN0IGNoZWNrc3VtIGFnYWluc3QgZXhwZWN0ZWQgc3VtXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyAtIHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5hbGdvcml0aG0gLSBjaGVja3N1bSBhbGdvcml0aG1cbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuYnVja2V0IC0gUzMgYnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmtleSAtIFMzIGtleVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBwYXJhbXMuZXhwZWN0ZWRTdW0gLSBleHBlY3RlZCBjaGVja3N1bVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXMub3B0aW9uc10gLSBjcnlwdG8uY3JlYXRlSGFzaCBvcHRpb25zXG4gKlxuICogQHRocm93cyB7SW52YWxpZENoZWNrc3VtfSAtIFRocm93cyBlcnJvciBpZiB2YWxpZGF0aW9uIGZhaWxzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gcmV0dXJucyB0cnVlIGZvciBzdWNjZXNzXG4gKi9cbmV4cG9ydHMudmFsaWRhdGVTM09iamVjdENoZWNrc3VtID0gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIGNvbnN0IHsgYWxnb3JpdGhtLCBidWNrZXQsIGtleSwgZXhwZWN0ZWRTdW0sIG9wdGlvbnMgfSA9IHBhcmFtcztcbiAgICBjb25zdCBmaWxlU3RyZWFtID0gZXhwb3J0cy5nZXRPYmplY3RSZWFkU3RyZWFtKHsgczM6IHNlcnZpY2VzXzEuczMoKSwgYnVja2V0LCBrZXkgfSk7XG4gICAgaWYgKGF3YWl0IGNoZWNrc3VtXzEudmFsaWRhdGVDaGVja3N1bUZyb21TdHJlYW0oYWxnb3JpdGhtLCBmaWxlU3RyZWFtLCBleHBlY3RlZFN1bSwgb3B0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG1zZyA9IGBJbnZhbGlkIGNoZWNrc3VtIGZvciBTMyBvYmplY3QgczM6Ly8ke2J1Y2tldH0vJHtrZXl9IHdpdGggdHlwZSAke2FsZ29yaXRobX0gYW5kIGV4cGVjdGVkIHN1bSAke2V4cGVjdGVkU3VtfWA7XG4gICAgdGhyb3cgbmV3IGVycm9yc18xLkludmFsaWRDaGVja3N1bShtc2cpO1xufTtcbi8qKlxuICogRXh0cmFjdCB0aGUgUzMgYnVja2V0IGFuZCBrZXkgZnJvbSB0aGUgVVJMIHBhdGggcGFyYW1ldGVyc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoUGFyYW1zIC0gcGF0aCBwYXJhbWV0ZXJzIGZyb20gdGhlIFVSTFxuICogYnVja2V0L2tleSBpbiB0aGUgZm9ybSBvZlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGBbQnVja2V0LCBLZXldYFxuICovXG5leHBvcnRzLmdldEZpbGVCdWNrZXRBbmRLZXkgPSAocGF0aFBhcmFtcykgPT4ge1xuICAgIGNvbnN0IFtCdWNrZXQsIC4uLmZpZWxkc10gPSBwYXRoUGFyYW1zLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgS2V5ID0gZmllbGRzLmpvaW4oJy8nKTtcbiAgICBpZiAoQnVja2V0Lmxlbmd0aCA9PT0gMCB8fCBLZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5VbnBhcnNhYmxlRmlsZUxvY2F0aW9uRXJyb3IoYEZpbGUgbG9jYXRpb24gXCIke3BhdGhQYXJhbXN9XCIgY291bGQgbm90IGJlIHBhcnNlZGApO1xuICAgIH1cbiAgICByZXR1cm4gW0J1Y2tldCwgS2V5XTtcbn07XG4vKipcbiAqIENyZWF0ZSBhbiBTMyBidWNrZXRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gQnVja2V0IC0gdGhlIG5hbWUgb2YgdGhlIFMzIGJ1Y2tldCB0byBjcmVhdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICovXG5leHBvcnRzLmNyZWF0ZUJ1Y2tldCA9IChCdWNrZXQpID0+IHNlcnZpY2VzXzEuczMoKS5jcmVhdGVCdWNrZXQoeyBCdWNrZXQgfSkucHJvbWlzZSgpO1xuLyoqXG4gKiBDcmVhdGUgbXVsdGlwbGUgUzMgYnVja2V0c1xuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gYnVja2V0cyAtIHRoZSBuYW1lcyBvZiB0aGUgUzMgYnVja2V0cyB0byBjcmVhdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICovXG5leHBvcnRzLmNyZWF0ZVMzQnVja2V0cyA9IGFzeW5jIChidWNrZXRzKSA9PiBhd2FpdCBQcm9taXNlLmFsbChidWNrZXRzLm1hcChleHBvcnRzLmNyZWF0ZUJ1Y2tldCkpO1xuY29uc3QgY3JlYXRlTXVsdGlwYXJ0VXBsb2FkID0gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIGNvbnN0IHVwbG9hZFBhcmFtcyA9IHtcbiAgICAgICAgQnVja2V0OiBwYXJhbXMuZGVzdGluYXRpb25CdWNrZXQsXG4gICAgICAgIEtleTogcGFyYW1zLmRlc3RpbmF0aW9uS2V5LFxuICAgICAgICBBQ0w6IHBhcmFtcy5BQ0wsXG4gICAgICAgIENvbnRlbnRUeXBlOiBwYXJhbXMuY29udGVudFR5cGUsXG4gICAgfTtcbiAgICBpZiAocGFyYW1zLmNvcHlUYWdzKSB7XG4gICAgICAgIHVwbG9hZFBhcmFtcy5UYWdnaW5nID0gYXdhaXQgZ2V0T2JqZWN0VGFnZ2luZ1N0cmluZyhwYXJhbXMuc291cmNlQnVja2V0LCBwYXJhbXMuc291cmNlS2V5KTtcbiAgICB9XG4gICAgLy8gQ3JlYXRlIGEgbXVsdGktcGFydCB1cGxvYWQgKGNvcHkpIGFuZCBnZXQgaXRzIFVwbG9hZElkXG4gICAgY29uc3QgeyBVcGxvYWRJZCB9ID0gYXdhaXQgUzNNdWx0aXBhcnRVcGxvYWRzLmNyZWF0ZU11bHRpcGFydFVwbG9hZCh1cGxvYWRQYXJhbXMpO1xuICAgIGlmIChVcGxvYWRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGNyZWF0ZSBtdWx0aXBhcnQgdXBsb2FkJyk7XG4gICAgfVxuICAgIHJldHVybiBVcGxvYWRJZDtcbn07XG4vLyBUaGlzIHBlcmZvcm1zIGFuIFMzIGB1cGxvYWRQYXJ0Q29weWAgY2FsbC4gVGhhdCByZXNwb25zZSBpbmNsdWRlcyBhbiBgRVRhZ2Bcbi8vIHZhbHVlIHNwZWNpZmljIHRvIHRoZSBwYXJ0IHRoYXQgd2FzIHVwbG9hZGVkLiBXaGVuIGBjb21wbGV0ZU11bHRpcGFydFVwbG9hZGBcbi8vIGlzIGNhbGxlZCBsYXRlciwgaXQgbmVlZHMgdGhhdCBgRVRhZ2AgdmFsdWUsIGFzIHdlbGwgYXMgdGhlIGBQYXJ0TnVtYmVyYCBmb3Jcbi8vIGVhY2ggcGFydC4gU2luY2UgdGhlIGBQYXJ0TnVtYmVyYCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGB1cGxvYWRQYXJ0Q29weWBcbi8vIHJlc3BvbnNlLCB3ZSBhcmUgYWRkaW5nIGl0IGhlcmUgdG8gbWFrZSBvdXIgbGl2ZXMgZWFzaWVyIHdoZW4gd2UgZXZlbnR1YWxseVxuLy8gY2FsbCBgY29tcGxldGVNdWx0aXBhcnRVcGxvYWRgLlxuY29uc3QgdXBsb2FkUGFydENvcHkgPSBhc3luYyAocGFyYW1zKSA9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBTM011bHRpcGFydFVwbG9hZHMudXBsb2FkUGFydENvcHkoe1xuICAgICAgICBVcGxvYWRJZDogcGFyYW1zLnVwbG9hZElkLFxuICAgICAgICBCdWNrZXQ6IHBhcmFtcy5kZXN0aW5hdGlvbkJ1Y2tldCxcbiAgICAgICAgS2V5OiBwYXJhbXMuZGVzdGluYXRpb25LZXksXG4gICAgICAgIFBhcnROdW1iZXI6IHBhcmFtcy5wYXJ0TnVtYmVyLFxuICAgICAgICBDb3B5U291cmNlOiBgLyR7cGFyYW1zLnNvdXJjZUJ1Y2tldH0vJHtwYXJhbXMuc291cmNlS2V5fWAsXG4gICAgICAgIENvcHlTb3VyY2VSYW5nZTogYGJ5dGVzPSR7cGFyYW1zLnN0YXJ0fS0ke3BhcmFtcy5lbmR9YCxcbiAgICB9KTtcbiAgICBpZiAocmVzcG9uc2UuQ29weVBhcnRSZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RpZCBub3QgZ2V0IEVUYWcgZnJvbSB1cGxvYWRQYXJ0Q29weScpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBFVGFnOiByZXNwb25zZS5Db3B5UGFydFJlc3VsdC5FVGFnLFxuICAgICAgICBQYXJ0TnVtYmVyOiBwYXJhbXMucGFydE51bWJlcixcbiAgICB9O1xufTtcbi8qKlxuICogQ29weSBhbiBTMyBvYmplY3QgdG8gYW5vdGhlciBsb2NhdGlvbiBpbiBTMyB1c2luZyBhIG11bHRpcGFydCBjb3B5XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5zb3VyY2VCdWNrZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlS2V5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmRlc3RpbmF0aW9uQnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLmRlc3RpbmF0aW9uS2V5XG4gKiBAcGFyYW0ge0FXUy5TMy5IZWFkT2JqZWN0T3V0cHV0fSBbcGFyYW1zLnNvdXJjZU9iamVjdF1cbiAqICAgT3V0cHV0IGZyb20gaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0phdmFTY3JpcHRTREsvbGF0ZXN0L0FXUy9TMy5odG1sI2hlYWRPYmplY3QtcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGFyYW1zLkFDTF0gLSBhbiBbUzMgQ2FubmVkIEFDTF0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvYWNsLW92ZXJ2aWV3Lmh0bWwjY2FubmVkLWFjbClcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3BhcmFtcy5jb3B5VGFncz1mYWxzZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlLjx7IGV0YWc6IHN0cmluZyB9Pn0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIEVUYWcgb2YgdGhlXG4gKiAgICBkZXN0aW5hdGlvbiBvYmplY3RcbiAqL1xuZXhwb3J0cy5tdWx0aXBhcnRDb3B5T2JqZWN0ID0gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB7IHNvdXJjZUJ1Y2tldCwgc291cmNlS2V5LCBkZXN0aW5hdGlvbkJ1Y2tldCwgZGVzdGluYXRpb25LZXksIEFDTCwgY29weVRhZ3MgPSBmYWxzZSwgfSA9IHBhcmFtcztcbiAgICBjb25zdCBzb3VyY2VPYmplY3QgPSAoX2EgPSBwYXJhbXMuc291cmNlT2JqZWN0KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBhd2FpdCBleHBvcnRzLmhlYWRPYmplY3Qoc291cmNlQnVja2V0LCBzb3VyY2VLZXkpO1xuICAgIC8vIENyZWF0ZSBhIG11bHRpLXBhcnQgdXBsb2FkIChjb3B5KSBhbmQgZ2V0IGl0cyBVcGxvYWRJZFxuICAgIGNvbnN0IHVwbG9hZElkID0gYXdhaXQgY3JlYXRlTXVsdGlwYXJ0VXBsb2FkKHtcbiAgICAgICAgc291cmNlQnVja2V0LFxuICAgICAgICBzb3VyY2VLZXksXG4gICAgICAgIGRlc3RpbmF0aW9uQnVja2V0LFxuICAgICAgICBkZXN0aW5hdGlvbktleSxcbiAgICAgICAgQUNMLFxuICAgICAgICBjb3B5VGFncyxcbiAgICAgICAgY29udGVudFR5cGU6IHNvdXJjZU9iamVjdC5Db250ZW50VHlwZSxcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgICAvLyBCdWlsZCB0aGUgc2VwYXJhdGUgcGFydHMgb2YgdGhlIG11bHRpLXBhcnQgdXBsb2FkIChjb3B5KVxuICAgICAgICBjb25zdCBvYmplY3RTaXplID0gc291cmNlT2JqZWN0LkNvbnRlbnRMZW5ndGg7XG4gICAgICAgIGlmIChvYmplY3RTaXplID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGVybWluZSBzaXplIG9mIHMzOi8vJHtzb3VyY2VCdWNrZXR9LyR7c291cmNlS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNodW5rcyA9IFMzTXVsdGlwYXJ0VXBsb2Fkcy5jcmVhdGVNdWx0aXBhcnRDaHVua3Mob2JqZWN0U2l6ZSk7XG4gICAgICAgIC8vIFN1Ym1pdCBhbGwgb2YgdGhlIHVwbG9hZCAoY29weSkgcGFydHMgdG8gUzNcbiAgICAgICAgY29uc3QgdXBsb2FkUGFydENvcHlSZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChjaHVua3MubWFwKCh7IHN0YXJ0LCBlbmQgfSwgaW5kZXgpID0+IHVwbG9hZFBhcnRDb3B5KHtcbiAgICAgICAgICAgIHVwbG9hZElkLFxuICAgICAgICAgICAgcGFydE51bWJlcjogaW5kZXggKyAxLFxuICAgICAgICAgICAgc3RhcnQsXG4gICAgICAgICAgICBlbmQsXG4gICAgICAgICAgICBzb3VyY2VCdWNrZXQsXG4gICAgICAgICAgICBzb3VyY2VLZXksXG4gICAgICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldCxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uS2V5LFxuICAgICAgICB9KSkpO1xuICAgICAgICAvLyBMZXQgUzMga25vdyB0aGF0IHRoZSBtdWx0aS1wYXJ0IHVwbG9hZCAoY29weSkgaXMgY29tcGxldGVkXG4gICAgICAgIGNvbnN0IHsgRVRhZzogZXRhZyB9ID0gYXdhaXQgUzNNdWx0aXBhcnRVcGxvYWRzLmNvbXBsZXRlTXVsdGlwYXJ0VXBsb2FkKHtcbiAgICAgICAgICAgIFVwbG9hZElkOiB1cGxvYWRJZCxcbiAgICAgICAgICAgIEJ1Y2tldDogZGVzdGluYXRpb25CdWNrZXQsXG4gICAgICAgICAgICBLZXk6IGRlc3RpbmF0aW9uS2V5LFxuICAgICAgICAgICAgTXVsdGlwYXJ0VXBsb2FkOiB7XG4gICAgICAgICAgICAgICAgUGFydHM6IHVwbG9hZFBhcnRDb3B5UmVzcG9uc2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IGV0YWcgfTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIElmIGFueXRoaW5nIHdlbnQgd3JvbmcsIG1ha2Ugc3VyZSB0aGF0IHRoZSBtdWx0aS1wYXJ0IHVwbG9hZCAoY29weSlcbiAgICAgICAgLy8gaXMgYWJvcnRlZC5cbiAgICAgICAgYXdhaXQgUzNNdWx0aXBhcnRVcGxvYWRzLmFib3J0TXVsdGlwYXJ0VXBsb2FkKHtcbiAgICAgICAgICAgIEJ1Y2tldDogZGVzdGluYXRpb25CdWNrZXQsXG4gICAgICAgICAgICBLZXk6IGRlc3RpbmF0aW9uS2V5LFxuICAgICAgICAgICAgVXBsb2FkSWQ6IHVwbG9hZElkLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufTtcbi8qKlxuICogTW92ZSBhbiBTMyBvYmplY3QgdG8gYW5vdGhlciBsb2NhdGlvbiBpbiBTM1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXJhbXMuc291cmNlQnVja2V0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1zLnNvdXJjZUtleVxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5kZXN0aW5hdGlvbkJ1Y2tldFxuICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtcy5kZXN0aW5hdGlvbktleVxuICogQHBhcmFtIHtzdHJpbmd9IFtwYXJhbXMuQUNMXSAtIGFuIFtTMyBDYW5uZWQgQUNMXShodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L2Rldi9hY2wtb3ZlcnZpZXcuaHRtbCNjYW5uZWQtYWNsKVxuICogQHBhcmFtIHtib29sZWFufSBbcGFyYW1zLmNvcHlUYWdzPWZhbHNlXVxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqL1xuZXhwb3J0cy5tb3ZlT2JqZWN0ID0gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIGF3YWl0IGV4cG9ydHMubXVsdGlwYXJ0Q29weU9iamVjdCh7XG4gICAgICAgIHNvdXJjZUJ1Y2tldDogcGFyYW1zLnNvdXJjZUJ1Y2tldCxcbiAgICAgICAgc291cmNlS2V5OiBwYXJhbXMuc291cmNlS2V5LFxuICAgICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogcGFyYW1zLmRlc3RpbmF0aW9uQnVja2V0LFxuICAgICAgICBkZXN0aW5hdGlvbktleTogcGFyYW1zLmRlc3RpbmF0aW9uS2V5LFxuICAgICAgICBBQ0w6IHBhcmFtcy5BQ0wsXG4gICAgICAgIGNvcHlUYWdzOiBpc0Jvb2xlYW5fMS5kZWZhdWx0KHBhcmFtcy5jb3B5VGFncykgPyBwYXJhbXMuY29weVRhZ3MgOiB0cnVlLFxuICAgIH0pO1xuICAgIGF3YWl0IGV4cG9ydHMuZGVsZXRlUzNPYmplY3QocGFyYW1zLnNvdXJjZUJ1Y2tldCwgcGFyYW1zLnNvdXJjZUtleSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UzMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5jb25zdCBhd3Nfc2RrXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImF3cy1zZGtcIikpO1xuY29uc3QgdGVzdF91dGlsc18xID0gcmVxdWlyZShcIi4vdGVzdC11dGlsc1wiKTtcbmNvbnN0IG5vb3AgPSAoKSA9PiB7IH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbG9kYXNoL3ByZWZlci1ub29wXG5jb25zdCBnZXRSZWdpb24gPSAoKSA9PiBwcm9jZXNzLmVudi5BV1NfREVGQVVMVF9SRUdJT04gfHwgcHJvY2Vzcy5lbnYuQVdTX1JFR0lPTiB8fCAndXMtZWFzdC0xJztcbi8vIFdvcmthcm91bmQgdXBsb2FkIGhhbmdzLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXdyay9ub2RlLXMzLWNsaWVudC9pc3N1ZXMvNzRcbi8vIEB0cy1pZ25vcmUgLSBBV1MudXRpbCBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGJyZWFrXG5hd3Nfc2RrXzEuZGVmYXVsdC51dGlsLnVwZGF0ZShhd3Nfc2RrXzEuZGVmYXVsdC5TMy5wcm90b3R5cGUsIHsgYWRkRXhwZWN0MTAwQ29udGludWU6IG5vb3AgfSk7XG5hd3Nfc2RrXzEuZGVmYXVsdC5jb25maWcuc2V0UHJvbWlzZXNEZXBlbmRlbmN5KFByb21pc2UpO1xuY29uc3QgbWVtb2l6ZSA9IChmbikgPT4ge1xuICAgIGxldCBtZW1vO1xuICAgIHJldHVybiAob3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoIW1lbW8pXG4gICAgICAgICAgICBtZW1vID0gZm4ob3B0aW9ucyk7XG4gICAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG59O1xuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgcmV0dXJuIGFuIEFXUyBzZXJ2aWNlIG9iamVjdFxuICpcbiAqIE5vdGU6IFRoZSByZXR1cm5lZCBzZXJ2aWNlIG9iamVjdHMgYXJlIGNhY2hlZCwgc28gdGhlcmUgd2lsbCBvbmx5IGJlIG9uZVxuICogICAgICAgaW5zdGFuY2Ugb2YgZWFjaCBzZXJ2aWNlIG9iamVjdCBwZXIgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0ge0FXUy5TZXJ2aWNlfSBTZXJ2aWNlIC0gYW4gQVdTIHNlcnZpY2Ugb2JqZWN0IGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3ZlcnNpb25dIC0gdGhlIEFQSSB2ZXJzaW9uIHRvIHVzZVxuICogQHBhcmFtIHtzdHJpbmd9IFtzZXJ2aWNlT3B0aW9uc10gLSBhZGRpdGlvbmFsIG9wdGlvbnMgdG8gcGFzcyB0byB0aGUgc2VydmljZVxuICpcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIGFuIEFXUyBzZXJ2aWNlXG4gKiBvYmplY3RcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBhd3NDbGllbnQgPSAoU2VydmljZSwgdmVyc2lvbiwgc2VydmljZU9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICByZWdpb246IGdldFJlZ2lvbigpLFxuICAgICAgICAuLi5zZXJ2aWNlT3B0aW9ucyxcbiAgICB9O1xuICAgIGlmICh2ZXJzaW9uKVxuICAgICAgICBvcHRpb25zLmFwaVZlcnNpb24gPSB2ZXJzaW9uO1xuICAgIGlmICh0ZXN0X3V0aWxzXzEuaW5UZXN0TW9kZSgpKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgLSBzZXJ2aWNlSWRlbnRpZmllciBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgbWF5IGJyZWFrIGF0IGFueSB0aW1lXG4gICAgICAgIGlmIChhd3Nfc2RrXzEuZGVmYXVsdC5EeW5hbW9EQi5Eb2N1bWVudENsaWVudC5zZXJ2aWNlSWRlbnRpZmllciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlIC0gc2VydmljZUlkZW50aWZpZXIgaXMgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkgYW5kIG1heSBicmVhayBhdCBhbnkgdGltZVxuICAgICAgICAgICAgYXdzX3Nka18xLmRlZmF1bHQuRHluYW1vREIuRG9jdW1lbnRDbGllbnQuc2VydmljZUlkZW50aWZpZXIgPSAnZHluYW1vZGInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZW1vaXplKChvKSA9PiB0ZXN0X3V0aWxzXzEudGVzdEF3c0NsaWVudChTZXJ2aWNlLCBPYmplY3QuYXNzaWduKG9wdGlvbnMsIG8pKSk7XG4gICAgfVxuICAgIHJldHVybiBtZW1vaXplKChvKSA9PiBuZXcgU2VydmljZShPYmplY3QuYXNzaWduKG9wdGlvbnMsIG8pKSk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBhd3NDbGllbnQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbGllbnQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vLyBVdGlsaXR5IGZ1bmN0aW9ucyB0byBoZWxwIHdpdGggUzMgbXVsdGktcGFydCB1cGxvYWRzXG52YXIgX19pbXBvcnREZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydERlZmF1bHQpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IFwiZGVmYXVsdFwiOiBtb2QgfTtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnVwbG9hZFBhcnRDb3B5ID0gZXhwb3J0cy5hYm9ydE11bHRpcGFydFVwbG9hZCA9IGV4cG9ydHMuY29tcGxldGVNdWx0aXBhcnRVcGxvYWQgPSBleHBvcnRzLmNyZWF0ZU11bHRpcGFydFVwbG9hZCA9IGV4cG9ydHMuY3JlYXRlTXVsdGlwYXJ0Q2h1bmtzID0gdm9pZCAwO1xuY29uc3QgcmFuZ2VfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibG9kYXNoL3JhbmdlXCIpKTtcbmNvbnN0IHNlcnZpY2VzXzEgPSByZXF1aXJlKFwiLi4vc2VydmljZXNcIik7XG5jb25zdCBNQiA9IDEwMjQgKiAxMDI0O1xuLy8gRWFjaCBwYXJ0IG9mIGEgbXVsdGktcGFydCBjb3B5IG5lZWRzIHRvIHNwZWNpZnkgYSBieXRlIHJhbmdlIHRvIGJlIGNvcGllZC5cbi8vIFRoaXMgYnl0ZSByYW5nZSBoYXMgYSBzdGFydGluZyBieXRlIGFuZCBhbiBlbmRpbmcgYnl0ZSAoaW5jbHVzaXZlKSB0aGF0IG1ha2VzXG4vLyB1cCB0aGUgcGFydC4gVGhlIG1heGltdW0gYWxsb3dlZCBjaHVuayBzaXplIGlzIDUzNjg3MDkxMjAgYnl0ZXMuXG4vL1xuLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZpbGUgc2l6ZSBhbmQgYW4gb3B0aW9uYWwgbWF4U2l6ZS4gSXQgcmV0dXJucyBhbiBhcnJheVxuLy8gb2Ygb2JqZWN0cywgZWFjaCBjb250YWluaW5nIGEgYHN0YXJ0YCBhbmQgYW4gYGVuZGAgdmFsdWUuIFRoZXNlIHdpbGwgbWFrZSB1cFxuLy8gdGhlIHJhbmdlcyBvZiB0aGUgbXVsdGktcGFydCBjb3B5LlxuLy9cbi8vIEZyb20gYW5lY2RvdGFsIHRlc3RpbmcsIGEgY2h1bmsgc2l6ZSBvZiAyNTAgTUIgc2VlbXMgdG8gcGVyZm9ybSBmYWlybHkgd2VsbC5cbi8vXG4vLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uUzMvbGF0ZXN0L0FQSS9BUElfVXBsb2FkUGFydENvcHkuaHRtbFxuZXhwb3J0cy5jcmVhdGVNdWx0aXBhcnRDaHVua3MgPSAob2JqZWN0U2l6ZSwgbWF4Q2h1bmtTaXplID0gMjUwICogTUIpID0+IHJhbmdlXzEuZGVmYXVsdCgwLCBvYmplY3RTaXplLCBtYXhDaHVua1NpemUpXG4gICAgLm1hcCgoc3RhcnQpID0+ICh7XG4gICAgc3RhcnQsXG4gICAgZW5kOiBNYXRoLm1pbihzdGFydCArIG1heENodW5rU2l6ZSwgb2JqZWN0U2l6ZSkgLSAxLFxufSkpO1xuZXhwb3J0cy5jcmVhdGVNdWx0aXBhcnRVcGxvYWQgPSBhc3luYyAocGFyYW1zKSA9PiBhd2FpdCBzZXJ2aWNlc18xLnMzKCkuY3JlYXRlTXVsdGlwYXJ0VXBsb2FkKHBhcmFtcykucHJvbWlzZSgpO1xuZXhwb3J0cy5jb21wbGV0ZU11bHRpcGFydFVwbG9hZCA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXJ2aWNlc18xLnMzKCkuY29tcGxldGVNdWx0aXBhcnRVcGxvYWQocGFyYW1zKS5wcm9taXNlKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5leHBvcnRzLmFib3J0TXVsdGlwYXJ0VXBsb2FkID0gYXN5bmMgKHBhcmFtcykgPT4gYXdhaXQgc2VydmljZXNfMS5zMygpLmFib3J0TXVsdGlwYXJ0VXBsb2FkKHBhcmFtcykucHJvbWlzZSgpO1xuZXhwb3J0cy51cGxvYWRQYXJ0Q29weSA9IGFzeW5jIChwYXJhbXMpID0+IGF3YWl0IHNlcnZpY2VzXzEuczMoKS51cGxvYWRQYXJ0Q29weShwYXJhbXMpLnByb21pc2UoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVMzTXVsdGlwYXJ0VXBsb2Fkcy5qcy5tYXAiLCJ2YXIgb25jZSA9IHJlcXVpcmUoJ29uY2UnKTtcblxudmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9O1xuXG52YXIgaXNSZXF1ZXN0ID0gZnVuY3Rpb24oc3RyZWFtKSB7XG5cdHJldHVybiBzdHJlYW0uc2V0SGVhZGVyICYmIHR5cGVvZiBzdHJlYW0uYWJvcnQgPT09ICdmdW5jdGlvbic7XG59O1xuXG52YXIgaXNDaGlsZFByb2Nlc3MgPSBmdW5jdGlvbihzdHJlYW0pIHtcblx0cmV0dXJuIHN0cmVhbS5zdGRpbyAmJiBBcnJheS5pc0FycmF5KHN0cmVhbS5zdGRpbykgJiYgc3RyZWFtLnN0ZGlvLmxlbmd0aCA9PT0gM1xufTtcblxudmFyIGVvcyA9IGZ1bmN0aW9uKHN0cmVhbSwgb3B0cywgY2FsbGJhY2spIHtcblx0aWYgKHR5cGVvZiBvcHRzID09PSAnZnVuY3Rpb24nKSByZXR1cm4gZW9zKHN0cmVhbSwgbnVsbCwgb3B0cyk7XG5cdGlmICghb3B0cykgb3B0cyA9IHt9O1xuXG5cdGNhbGxiYWNrID0gb25jZShjYWxsYmFjayB8fCBub29wKTtcblxuXHR2YXIgd3MgPSBzdHJlYW0uX3dyaXRhYmxlU3RhdGU7XG5cdHZhciBycyA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblx0dmFyIHJlYWRhYmxlID0gb3B0cy5yZWFkYWJsZSB8fCAob3B0cy5yZWFkYWJsZSAhPT0gZmFsc2UgJiYgc3RyZWFtLnJlYWRhYmxlKTtcblx0dmFyIHdyaXRhYmxlID0gb3B0cy53cml0YWJsZSB8fCAob3B0cy53cml0YWJsZSAhPT0gZmFsc2UgJiYgc3RyZWFtLndyaXRhYmxlKTtcblx0dmFyIGNhbmNlbGxlZCA9IGZhbHNlO1xuXG5cdHZhciBvbmxlZ2FjeWZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICghc3RyZWFtLndyaXRhYmxlKSBvbmZpbmlzaCgpO1xuXHR9O1xuXG5cdHZhciBvbmZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuXHRcdHdyaXRhYmxlID0gZmFsc2U7XG5cdFx0aWYgKCFyZWFkYWJsZSkgY2FsbGJhY2suY2FsbChzdHJlYW0pO1xuXHR9O1xuXG5cdHZhciBvbmVuZCA9IGZ1bmN0aW9uKCkge1xuXHRcdHJlYWRhYmxlID0gZmFsc2U7XG5cdFx0aWYgKCF3cml0YWJsZSkgY2FsbGJhY2suY2FsbChzdHJlYW0pO1xuXHR9O1xuXG5cdHZhciBvbmV4aXQgPSBmdW5jdGlvbihleGl0Q29kZSkge1xuXHRcdGNhbGxiYWNrLmNhbGwoc3RyZWFtLCBleGl0Q29kZSA/IG5ldyBFcnJvcignZXhpdGVkIHdpdGggZXJyb3IgY29kZTogJyArIGV4aXRDb2RlKSA6IG51bGwpO1xuXHR9O1xuXG5cdHZhciBvbmVycm9yID0gZnVuY3Rpb24oZXJyKSB7XG5cdFx0Y2FsbGJhY2suY2FsbChzdHJlYW0sIGVycik7XG5cdH07XG5cblx0dmFyIG9uY2xvc2UgPSBmdW5jdGlvbigpIHtcblx0XHRwcm9jZXNzLm5leHRUaWNrKG9uY2xvc2VuZXh0dGljayk7XG5cdH07XG5cblx0dmFyIG9uY2xvc2VuZXh0dGljayA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmIChjYW5jZWxsZWQpIHJldHVybjtcblx0XHRpZiAocmVhZGFibGUgJiYgIShycyAmJiAocnMuZW5kZWQgJiYgIXJzLmRlc3Ryb3llZCkpKSByZXR1cm4gY2FsbGJhY2suY2FsbChzdHJlYW0sIG5ldyBFcnJvcigncHJlbWF0dXJlIGNsb3NlJykpO1xuXHRcdGlmICh3cml0YWJsZSAmJiAhKHdzICYmICh3cy5lbmRlZCAmJiAhd3MuZGVzdHJveWVkKSkpIHJldHVybiBjYWxsYmFjay5jYWxsKHN0cmVhbSwgbmV3IEVycm9yKCdwcmVtYXR1cmUgY2xvc2UnKSk7XG5cdH07XG5cblx0dmFyIG9ucmVxdWVzdCA9IGZ1bmN0aW9uKCkge1xuXHRcdHN0cmVhbS5yZXEub24oJ2ZpbmlzaCcsIG9uZmluaXNoKTtcblx0fTtcblxuXHRpZiAoaXNSZXF1ZXN0KHN0cmVhbSkpIHtcblx0XHRzdHJlYW0ub24oJ2NvbXBsZXRlJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5vbignYWJvcnQnLCBvbmNsb3NlKTtcblx0XHRpZiAoc3RyZWFtLnJlcSkgb25yZXF1ZXN0KCk7XG5cdFx0ZWxzZSBzdHJlYW0ub24oJ3JlcXVlc3QnLCBvbnJlcXVlc3QpO1xuXHR9IGVsc2UgaWYgKHdyaXRhYmxlICYmICF3cykgeyAvLyBsZWdhY3kgc3RyZWFtc1xuXHRcdHN0cmVhbS5vbignZW5kJywgb25sZWdhY3lmaW5pc2gpO1xuXHRcdHN0cmVhbS5vbignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdH1cblxuXHRpZiAoaXNDaGlsZFByb2Nlc3Moc3RyZWFtKSkgc3RyZWFtLm9uKCdleGl0Jywgb25leGl0KTtcblxuXHRzdHJlYW0ub24oJ2VuZCcsIG9uZW5kKTtcblx0c3RyZWFtLm9uKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdGlmIChvcHRzLmVycm9yICE9PSBmYWxzZSkgc3RyZWFtLm9uKCdlcnJvcicsIG9uZXJyb3IpO1xuXHRzdHJlYW0ub24oJ2Nsb3NlJywgb25jbG9zZSk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdGNhbmNlbGxlZCA9IHRydWU7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjb21wbGV0ZScsIG9uZmluaXNoKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Fib3J0Jywgb25jbG9zZSk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdyZXF1ZXN0Jywgb25yZXF1ZXN0KTtcblx0XHRpZiAoc3RyZWFtLnJlcSkgc3RyZWFtLnJlcS5yZW1vdmVMaXN0ZW5lcignZmluaXNoJywgb25maW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25sZWdhY3lmaW5pc2gpO1xuXHRcdHN0cmVhbS5yZW1vdmVMaXN0ZW5lcignY2xvc2UnLCBvbmxlZ2FjeWZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdleGl0Jywgb25leGl0KTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uZW5kKTtcblx0XHRzdHJlYW0ucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG5cdFx0c3RyZWFtLnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuXHR9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBlb3M7XG4iLCJ2YXIgcm9vdCA9IHJlcXVpcmUoJy4vX3Jvb3QnKTtcblxuLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovXG52YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cbm1vZHVsZS5leHBvcnRzID0gU3ltYm9sO1xuIiwidmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX1N5bWJvbCcpLFxuICAgIGdldFJhd1RhZyA9IHJlcXVpcmUoJy4vX2dldFJhd1RhZycpLFxuICAgIG9iamVjdFRvU3RyaW5nID0gcmVxdWlyZSgnLi9fb2JqZWN0VG9TdHJpbmcnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsXG4gICAgdW5kZWZpbmVkVGFnID0gJ1tvYmplY3QgVW5kZWZpbmVkXSc7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIHN5bVRvU3RyaW5nVGFnID0gU3ltYm9sID8gU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgfVxuICByZXR1cm4gKHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSkpXG4gICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZUdldFRhZztcbiIsIi8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi9cbnZhciBuYXRpdmVDZWlsID0gTWF0aC5jZWlsLFxuICAgIG5hdGl2ZU1heCA9IE1hdGgubWF4O1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJhbmdlYCBhbmQgYF8ucmFuZ2VSaWdodGAgd2hpY2ggZG9lc24ndFxuICogY29lcmNlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuXG4gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgVGhlIHZhbHVlIHRvIGluY3JlbWVudCBvciBkZWNyZW1lbnQgYnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqL1xuZnVuY3Rpb24gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCkge1xuICB2YXIgaW5kZXggPSAtMSxcbiAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQgLSBzdGFydCkgLyAoc3RlcCB8fCAxKSksIDApLFxuICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTtcblxuICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDtcbiAgICBzdGFydCArPSBzdGVwO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVJhbmdlO1xuIiwidmFyIHRyaW1tZWRFbmRJbmRleCA9IHJlcXVpcmUoJy4vX3RyaW1tZWRFbmRJbmRleCcpO1xuXG4vKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltU3RhcnQgPSAvXlxccysvO1xuXG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRyaW1gLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gdHJpbS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHRyaW1tZWQgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBiYXNlVHJpbShzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZ1xuICAgID8gc3RyaW5nLnNsaWNlKDAsIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpICsgMSkucmVwbGFjZShyZVRyaW1TdGFydCwgJycpXG4gICAgOiBzdHJpbmc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZVRyaW07XG4iLCJ2YXIgYmFzZVJhbmdlID0gcmVxdWlyZSgnLi9fYmFzZVJhbmdlJyksXG4gICAgaXNJdGVyYXRlZUNhbGwgPSByZXF1aXJlKCcuL19pc0l0ZXJhdGVlQ2FsbCcpLFxuICAgIHRvRmluaXRlID0gcmVxdWlyZSgnLi90b0Zpbml0ZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgXy5yYW5nZWAgb3IgYF8ucmFuZ2VSaWdodGAgZnVuY3Rpb24uXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LlxuICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCkge1xuICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkge1xuICAgIGlmIChzdGVwICYmIHR5cGVvZiBzdGVwICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKHN0YXJ0LCBlbmQsIHN0ZXApKSB7XG4gICAgICBlbmQgPSBzdGVwID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuXG4gICAgc3RhcnQgPSB0b0Zpbml0ZShzdGFydCk7XG4gICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmQgPSBzdGFydDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kID0gdG9GaW5pdGUoZW5kKTtcbiAgICB9XG4gICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTtcbiAgICByZXR1cm4gYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlUmFuZ2U7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdUYWc7XG4iLCIvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi9cbnZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IHVuc2lnbmVkIGludGVnZXIgdmFsdWVzLiAqL1xudmFyIHJlSXNVaW50ID0gL14oPzowfFsxLTldXFxkKikkLztcblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDtcblxuICByZXR1cm4gISFsZW5ndGggJiZcbiAgICAodHlwZSA9PSAnbnVtYmVyJyB8fFxuICAgICAgKHR5cGUgIT0gJ3N5bWJvbCcgJiYgcmVJc1VpbnQudGVzdCh2YWx1ZSkpKSAmJlxuICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJbmRleDtcbiIsInZhciBlcSA9IHJlcXVpcmUoJy4vZXEnKSxcbiAgICBpc0FycmF5TGlrZSA9IHJlcXVpcmUoJy4vaXNBcnJheUxpa2UnKSxcbiAgICBpc0luZGV4ID0gcmVxdWlyZSgnLi9faXNJbmRleCcpLFxuICAgIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9pc09iamVjdCcpO1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSB2YWx1ZSBhcmd1bWVudC5cbiAqIEBwYXJhbSB7Kn0gaW5kZXggVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBpbmRleCBvciBrZXkgYXJndW1lbnQuXG4gKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJndW1lbnRzIGFyZSBmcm9tIGFuIGl0ZXJhdGVlIGNhbGwsXG4gKiAgZWxzZSBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJhdGVlQ2FsbCh2YWx1ZSwgaW5kZXgsIG9iamVjdCkge1xuICBpZiAoIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7XG4gIGlmICh0eXBlID09ICdudW1iZXInXG4gICAgICAgID8gKGlzQXJyYXlMaWtlKG9iamVjdCkgJiYgaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpXG4gICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KVxuICAgICAgKSB7XG4gICAgcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNJdGVyYXRlZUNhbGw7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8qKiBVc2VkIHRvIG1hdGNoIGEgc2luZ2xlIHdoaXRlc3BhY2UgY2hhcmFjdGVyLiAqL1xudmFyIHJlV2hpdGVzcGFjZSA9IC9cXHMvO1xuXG4vKipcbiAqIFVzZWQgYnkgYF8udHJpbWAgYW5kIGBfLnRyaW1FbmRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLXdoaXRlc3BhY2VcbiAqIGNoYXJhY3RlciBvZiBgc3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWRFbmRJbmRleChzdHJpbmcpIHtcbiAgdmFyIGluZGV4ID0gc3RyaW5nLmxlbmd0aDtcblxuICB3aGlsZSAoaW5kZXgtLSAmJiByZVdoaXRlc3BhY2UudGVzdChzdHJpbmcuY2hhckF0KGluZGV4KSkpIHt9XG4gIHJldHVybiBpbmRleDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0cmltbWVkRW5kSW5kZXg7XG4iLCIvKipcbiAqIFBlcmZvcm1zIGFcbiAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pXG4gKiBjb21wYXJpc29uIGJldHdlZW4gdHdvIHZhbHVlcyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgZXF1aXZhbGVudC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS5cbiAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTtcbiAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07XG4gKlxuICogXy5lcShvYmplY3QsIG9iamVjdCk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcShvYmplY3QsIG90aGVyKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcSgnYScsICdhJyk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5lcSgnYScsIE9iamVjdCgnYScpKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5lcShOYU4sIE5hTik7XG4gKiAvLyA9PiB0cnVlXG4gKi9cbmZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikge1xuICByZXR1cm4gdmFsdWUgPT09IG90aGVyIHx8ICh2YWx1ZSAhPT0gdmFsdWUgJiYgb3RoZXIgIT09IG90aGVyKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBlcTtcbiIsInZhciBpc0Z1bmN0aW9uID0gcmVxdWlyZSgnLi9pc0Z1bmN0aW9uJyksXG4gICAgaXNMZW5ndGggPSByZXF1aXJlKCcuL2lzTGVuZ3RoJyk7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQnc1xuICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoKHZhbHVlLmxlbmd0aCkgJiYgIWlzRnVuY3Rpb24odmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXlMaWtlO1xuIiwidmFyIGJhc2VHZXRUYWcgPSByZXF1aXJlKCcuL19iYXNlR2V0VGFnJyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGJvb2xUYWcgPSAnW29iamVjdCBCb29sZWFuXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGJvb2xlYW4gcHJpbWl0aXZlIG9yIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGJvb2xlYW4sIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc0Jvb2xlYW4oZmFsc2UpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNCb29sZWFuKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBib29sVGFnKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Jvb2xlYW47XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIGFzeW5jVGFnID0gJ1tvYmplY3QgQXN5bmNGdW5jdGlvbl0nLFxuICAgIGZ1bmNUYWcgPSAnW29iamVjdCBGdW5jdGlvbl0nLFxuICAgIGdlblRhZyA9ICdbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXScsXG4gICAgcHJveHlUYWcgPSAnW29iamVjdCBQcm94eV0nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIGZ1bmN0aW9uLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNGdW5jdGlvbihfKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzRnVuY3Rpb24oL2FiYy8pO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3JcbiAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuXG4gIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTtcbiAgcmV0dXJuIHRhZyA9PSBmdW5jVGFnIHx8IHRhZyA9PSBnZW5UYWcgfHwgdGFnID09IGFzeW5jVGFnIHx8IHRhZyA9PSBwcm94eVRhZztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Z1bmN0aW9uO1xuIiwiLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTUFYX1NBRkVfSU5URUdFUiA9IDkwMDcxOTkyNTQ3NDA5OTE7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBhcnJheS1saWtlIGxlbmd0aC5cbiAqXG4gKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvblxuICogW2BUb0xlbmd0aGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvbGVuZ3RoKS5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMC4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGxlbmd0aCwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTGVuZ3RoKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNMZW5ndGgoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNMZW5ndGgoSW5maW5pdHkpO1xuICogLy8gPT4gZmFsc2VcbiAqXG4gKiBfLmlzTGVuZ3RoKCczJyk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmXG4gICAgdmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGlzTGVuZ3RoO1xuIiwiLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNPYmplY3Q7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTeW1ib2woJ2FiYycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTeW1ib2w7XG4iLCJ2YXIgY3JlYXRlUmFuZ2UgPSByZXF1aXJlKCcuL19jcmVhdGVSYW5nZScpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tXG4gKiBgc3RhcnRgIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgYGVuZGAuIEEgc3RlcCBvZiBgLTFgIGlzIHVzZWQgaWYgYSBuZWdhdGl2ZVxuICogYHN0YXJ0YCBpcyBzcGVjaWZpZWQgd2l0aG91dCBhbiBgZW5kYCBvciBgc3RlcGAuIElmIGBlbmRgIGlzIG5vdCBzcGVjaWZpZWQsXG4gKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuXG4gKlxuICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZ1xuICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy5cbiAqXG4gKiBAc3RhdGljXG4gKiBAc2luY2UgMC4xLjBcbiAqIEBtZW1iZXJPZiBfXG4gKiBAY2F0ZWdvcnkgVXRpbFxuICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLlxuICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbc3RlcD0xXSBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS5cbiAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy5cbiAqIEBzZWUgXy5pblJhbmdlLCBfLnJhbmdlUmlnaHRcbiAqIEBleGFtcGxlXG4gKlxuICogXy5yYW5nZSg0KTtcbiAqIC8vID0+IFswLCAxLCAyLCAzXVxuICpcbiAqIF8ucmFuZ2UoLTQpO1xuICogLy8gPT4gWzAsIC0xLCAtMiwgLTNdXG4gKlxuICogXy5yYW5nZSgxLCA1KTtcbiAqIC8vID0+IFsxLCAyLCAzLCA0XVxuICpcbiAqIF8ucmFuZ2UoMCwgMjAsIDUpO1xuICogLy8gPT4gWzAsIDUsIDEwLCAxNV1cbiAqXG4gKiBfLnJhbmdlKDAsIC00LCAtMSk7XG4gKiAvLyA9PiBbMCwgLTEsIC0yLCAtM11cbiAqXG4gKiBfLnJhbmdlKDEsIDQsIDApO1xuICogLy8gPT4gWzEsIDEsIDFdXG4gKlxuICogXy5yYW5nZSgwKTtcbiAqIC8vID0+IFtdXG4gKi9cbnZhciByYW5nZSA9IGNyZWF0ZVJhbmdlKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcmFuZ2U7XG4iLCJ2YXIgdG9OdW1iZXIgPSByZXF1aXJlKCcuL3RvTnVtYmVyJyk7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIElORklOSVRZID0gMSAvIDAsXG4gICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwODtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgZmluaXRlIG51bWJlci5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDQuMTIuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvRmluaXRlKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvRmluaXRlKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b0Zpbml0ZShJbmZpbml0eSk7XG4gKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOFxuICpcbiAqIF8udG9GaW5pdGUoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvRmluaXRlKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6IDA7XG4gIH1cbiAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7XG4gIGlmICh2YWx1ZSA9PT0gSU5GSU5JVFkgfHwgdmFsdWUgPT09IC1JTkZJTklUWSkge1xuICAgIHZhciBzaWduID0gKHZhbHVlIDwgMCA/IC0xIDogMSk7XG4gICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjtcbiAgfVxuICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gdmFsdWUgOiAwO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHRvRmluaXRlO1xuIiwidmFyIGJhc2VUcmltID0gcmVxdWlyZSgnLi9fYmFzZVRyaW0nKSxcbiAgICBpc09iamVjdCA9IHJlcXVpcmUoJy4vaXNPYmplY3QnKSxcbiAgICBpc1N5bWJvbCA9IHJlcXVpcmUoJy4vaXNTeW1ib2wnKTtcblxuLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovXG52YXIgTkFOID0gMCAvIDA7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgbnVtYmVyLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLlxuICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLnRvTnVtYmVyKDMuMik7XG4gKiAvLyA9PiAzLjJcbiAqXG4gKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpO1xuICogLy8gPT4gNWUtMzI0XG4gKlxuICogXy50b051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiBJbmZpbml0eVxuICpcbiAqIF8udG9OdW1iZXIoJzMuMicpO1xuICogLy8gPT4gMy4yXG4gKi9cbmZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgaWYgKGlzU3ltYm9sKHZhbHVlKSkge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTtcbiAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTtcbiAgfVxuICB2YWx1ZSA9IGJhc2VUcmltKHZhbHVlKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdG9OdW1iZXI7XG4iLCJ2YXIgd3JhcHB5ID0gcmVxdWlyZSgnd3JhcHB5Jylcbm1vZHVsZS5leHBvcnRzID0gd3JhcHB5KG9uY2UpXG5tb2R1bGUuZXhwb3J0cy5zdHJpY3QgPSB3cmFwcHkob25jZVN0cmljdClcblxub25jZS5wcm90byA9IG9uY2UoZnVuY3Rpb24gKCkge1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCAnb25jZScsIHtcbiAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIG9uY2UodGhpcylcbiAgICB9LFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KVxuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsICdvbmNlU3RyaWN0Jywge1xuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gb25jZVN0cmljdCh0aGlzKVxuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pXG59KVxuXG5mdW5jdGlvbiBvbmNlIChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpIHJldHVybiBmLnZhbHVlXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuXG5mdW5jdGlvbiBvbmNlU3RyaWN0IChmbikge1xuICB2YXIgZiA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZi5jYWxsZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZi5vbmNlRXJyb3IpXG4gICAgZi5jYWxsZWQgPSB0cnVlXG4gICAgcmV0dXJuIGYudmFsdWUgPSBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG4gIH1cbiAgdmFyIG5hbWUgPSBmbi5uYW1lIHx8ICdGdW5jdGlvbiB3cmFwcGVkIHdpdGggYG9uY2VgJ1xuICBmLm9uY2VFcnJvciA9IG5hbWUgKyBcIiBzaG91bGRuJ3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlXCJcbiAgZi5jYWxsZWQgPSBmYWxzZVxuICByZXR1cm4gZlxufVxuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSAocHJvbWlzZSwgb25GaW5hbGx5KSA9PiB7XG5cdG9uRmluYWxseSA9IG9uRmluYWxseSB8fCAoKCkgPT4ge30pO1xuXG5cdHJldHVybiBwcm9taXNlLnRoZW4oXG5cdFx0dmFsID0+IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuXHRcdFx0cmVzb2x2ZShvbkZpbmFsbHkoKSk7XG5cdFx0fSkudGhlbigoKSA9PiB2YWwpLFxuXHRcdGVyciA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcblx0XHRcdHJlc29sdmUob25GaW5hbGx5KCkpO1xuXHRcdH0pLnRoZW4oKCkgPT4ge1xuXHRcdFx0dGhyb3cgZXJyO1xuXHRcdH0pXG5cdCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xubW9kdWxlLmV4cG9ydHMgPSAoaXRlcmFibGUsIG1hcHBlciwgb3B0cykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRvcHRzID0gT2JqZWN0LmFzc2lnbih7XG5cdFx0Y29uY3VycmVuY3k6IEluZmluaXR5XG5cdH0sIG9wdHMpO1xuXG5cdGlmICh0eXBlb2YgbWFwcGVyICE9PSAnZnVuY3Rpb24nKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignTWFwcGVyIGZ1bmN0aW9uIGlzIHJlcXVpcmVkJyk7XG5cdH1cblxuXHRjb25zdCBjb25jdXJyZW5jeSA9IG9wdHMuY29uY3VycmVuY3k7XG5cblx0aWYgKCEodHlwZW9mIGNvbmN1cnJlbmN5ID09PSAnbnVtYmVyJyAmJiBjb25jdXJyZW5jeSA+PSAxKSkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGNvbmN1cnJlbmN5XFxgIHRvIGJlIGEgbnVtYmVyIGZyb20gMSBhbmQgdXAsIGdvdCBcXGAke2NvbmN1cnJlbmN5fVxcYCAoJHt0eXBlb2YgY29uY3VycmVuY3l9KWApO1xuXHR9XG5cblx0Y29uc3QgcmV0ID0gW107XG5cdGNvbnN0IGl0ZXJhdG9yID0gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuXHRsZXQgaXNSZWplY3RlZCA9IGZhbHNlO1xuXHRsZXQgaXRlcmFibGVEb25lID0gZmFsc2U7XG5cdGxldCByZXNvbHZpbmdDb3VudCA9IDA7XG5cdGxldCBjdXJyZW50SWR4ID0gMDtcblxuXHRjb25zdCBuZXh0ID0gKCkgPT4ge1xuXHRcdGlmIChpc1JlamVjdGVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbmV4dEl0ZW0gPSBpdGVyYXRvci5uZXh0KCk7XG5cdFx0Y29uc3QgaSA9IGN1cnJlbnRJZHg7XG5cdFx0Y3VycmVudElkeCsrO1xuXG5cdFx0aWYgKG5leHRJdGVtLmRvbmUpIHtcblx0XHRcdGl0ZXJhYmxlRG9uZSA9IHRydWU7XG5cblx0XHRcdGlmIChyZXNvbHZpbmdDb3VudCA9PT0gMCkge1xuXHRcdFx0XHRyZXNvbHZlKHJldCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXNvbHZpbmdDb3VudCsrO1xuXG5cdFx0UHJvbWlzZS5yZXNvbHZlKG5leHRJdGVtLnZhbHVlKVxuXHRcdFx0LnRoZW4oZWwgPT4gbWFwcGVyKGVsLCBpKSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHR2YWwgPT4ge1xuXHRcdFx0XHRcdHJldFtpXSA9IHZhbDtcblx0XHRcdFx0XHRyZXNvbHZpbmdDb3VudC0tO1xuXHRcdFx0XHRcdG5leHQoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyID0+IHtcblx0XHRcdFx0XHRpc1JlamVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRyZWplY3QoZXJyKTtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0fTtcblxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGNvbmN1cnJlbmN5OyBpKyspIHtcblx0XHRuZXh0KCk7XG5cblx0XHRpZiAoaXRlcmFibGVEb25lKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgcmV0cnkgPSByZXF1aXJlKCdyZXRyeScpO1xuXG5jb25zdCBuZXR3b3JrRXJyb3JNc2dzID0gW1xuXHQnRmFpbGVkIHRvIGZldGNoJywgLy8gQ2hyb21lXG5cdCdOZXR3b3JrRXJyb3Igd2hlbiBhdHRlbXB0aW5nIHRvIGZldGNoIHJlc291cmNlLicsIC8vIEZpcmVmb3hcblx0J1RoZSBJbnRlcm5ldCBjb25uZWN0aW9uIGFwcGVhcnMgdG8gYmUgb2ZmbGluZS4nLCAvLyBTYWZhcmlcblx0J05ldHdvcmsgcmVxdWVzdCBmYWlsZWQnIC8vIGBjcm9zcy1mZXRjaGBcbl07XG5cbmNsYXNzIEFib3J0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcblx0XHRzdXBlcigpO1xuXG5cdFx0aWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdFx0dGhpcy5vcmlnaW5hbEVycm9yID0gbWVzc2FnZTtcblx0XHRcdCh7bWVzc2FnZX0gPSBtZXNzYWdlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5vcmlnaW5hbEVycm9yID0gbmV3IEVycm9yKG1lc3NhZ2UpO1xuXHRcdFx0dGhpcy5vcmlnaW5hbEVycm9yLnN0YWNrID0gdGhpcy5zdGFjaztcblx0XHR9XG5cblx0XHR0aGlzLm5hbWUgPSAnQWJvcnRFcnJvcic7XG5cdFx0dGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcblx0fVxufVxuXG5jb25zdCBkZWNvcmF0ZUVycm9yV2l0aENvdW50cyA9IChlcnJvciwgYXR0ZW1wdE51bWJlciwgb3B0aW9ucykgPT4ge1xuXHQvLyBNaW51cyAxIGZyb20gYXR0ZW1wdE51bWJlciBiZWNhdXNlIHRoZSBmaXJzdCBhdHRlbXB0IGRvZXMgbm90IGNvdW50IGFzIGEgcmV0cnlcblx0Y29uc3QgcmV0cmllc0xlZnQgPSBvcHRpb25zLnJldHJpZXMgLSAoYXR0ZW1wdE51bWJlciAtIDEpO1xuXG5cdGVycm9yLmF0dGVtcHROdW1iZXIgPSBhdHRlbXB0TnVtYmVyO1xuXHRlcnJvci5yZXRyaWVzTGVmdCA9IHJldHJpZXNMZWZ0O1xuXHRyZXR1cm4gZXJyb3I7XG59O1xuXG5jb25zdCBpc05ldHdvcmtFcnJvciA9IGVycm9yTWVzc2FnZSA9PiBuZXR3b3JrRXJyb3JNc2dzLmluY2x1ZGVzKGVycm9yTWVzc2FnZSk7XG5cbmNvbnN0IHBSZXRyeSA9IChpbnB1dCwgb3B0aW9ucykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdG9uRmFpbGVkQXR0ZW1wdDogKCkgPT4ge30sXG5cdFx0cmV0cmllczogMTAsXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGNvbnN0IG9wZXJhdGlvbiA9IHJldHJ5Lm9wZXJhdGlvbihvcHRpb25zKTtcblxuXHRvcGVyYXRpb24uYXR0ZW1wdChhc3luYyBhdHRlbXB0TnVtYmVyID0+IHtcblx0XHR0cnkge1xuXHRcdFx0cmVzb2x2ZShhd2FpdCBpbnB1dChhdHRlbXB0TnVtYmVyKSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG5cdFx0XHRcdHJlamVjdChuZXcgVHlwZUVycm9yKGBOb24tZXJyb3Igd2FzIHRocm93bjogXCIke2Vycm9yfVwiLiBZb3Ugc2hvdWxkIG9ubHkgdGhyb3cgZXJyb3JzLmApKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZXJyb3IgaW5zdGFuY2VvZiBBYm9ydEVycm9yKSB7XG5cdFx0XHRcdG9wZXJhdGlvbi5zdG9wKCk7XG5cdFx0XHRcdHJlamVjdChlcnJvci5vcmlnaW5hbEVycm9yKTtcblx0XHRcdH0gZWxzZSBpZiAoZXJyb3IgaW5zdGFuY2VvZiBUeXBlRXJyb3IgJiYgIWlzTmV0d29ya0Vycm9yKGVycm9yLm1lc3NhZ2UpKSB7XG5cdFx0XHRcdG9wZXJhdGlvbi5zdG9wKCk7XG5cdFx0XHRcdHJlamVjdChlcnJvcik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWNvcmF0ZUVycm9yV2l0aENvdW50cyhlcnJvciwgYXR0ZW1wdE51bWJlciwgb3B0aW9ucyk7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCBvcHRpb25zLm9uRmFpbGVkQXR0ZW1wdChlcnJvcik7XG5cdFx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIW9wZXJhdGlvbi5yZXRyeShlcnJvcikpIHtcblx0XHRcdFx0XHRyZWplY3Qob3BlcmF0aW9uLm1haW5FcnJvcigpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBwUmV0cnk7XG4vLyBUT0RPOiByZW1vdmUgdGhpcyBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gcFJldHJ5O1xuXG5tb2R1bGUuZXhwb3J0cy5BYm9ydEVycm9yID0gQWJvcnRFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuY29uc3QgcEZpbmFsbHkgPSByZXF1aXJlKCdwLWZpbmFsbHknKTtcblxuY2xhc3MgVGltZW91dEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gJ1RpbWVvdXRFcnJvcic7XG5cdH1cbn1cblxuY29uc3QgcFRpbWVvdXQgPSAocHJvbWlzZSwgbWlsbGlzZWNvbmRzLCBmYWxsYmFjaykgPT4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRpZiAodHlwZW9mIG1pbGxpc2Vjb25kcyAhPT0gJ251bWJlcicgfHwgbWlsbGlzZWNvbmRzIDwgMCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGBtaWxsaXNlY29uZHNgIHRvIGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG5cdH1cblxuXHRpZiAobWlsbGlzZWNvbmRzID09PSBJbmZpbml0eSkge1xuXHRcdHJlc29sdmUocHJvbWlzZSk7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRpZiAodHlwZW9mIGZhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXNvbHZlKGZhbGxiYWNrKCkpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgZmFsbGJhY2sgPT09ICdzdHJpbmcnID8gZmFsbGJhY2sgOiBgUHJvbWlzZSB0aW1lZCBvdXQgYWZ0ZXIgJHttaWxsaXNlY29uZHN9IG1pbGxpc2Vjb25kc2A7XG5cdFx0Y29uc3QgdGltZW91dEVycm9yID0gZmFsbGJhY2sgaW5zdGFuY2VvZiBFcnJvciA/IGZhbGxiYWNrIDogbmV3IFRpbWVvdXRFcnJvcihtZXNzYWdlKTtcblxuXHRcdGlmICh0eXBlb2YgcHJvbWlzZS5jYW5jZWwgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHByb21pc2UuY2FuY2VsKCk7XG5cdFx0fVxuXG5cdFx0cmVqZWN0KHRpbWVvdXRFcnJvcik7XG5cdH0sIG1pbGxpc2Vjb25kcyk7XG5cblx0Ly8gVE9ETzogVXNlIG5hdGl2ZSBgZmluYWxseWAga2V5d29yZCB3aGVuIHRhcmdldGluZyBOb2RlLmpzIDEwXG5cdHBGaW5hbGx5KFxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcm9taXNlL3ByZWZlci1hd2FpdC10by10aGVuXG5cdFx0cHJvbWlzZS50aGVuKHJlc29sdmUsIHJlamVjdCksXG5cdFx0KCkgPT4ge1xuXHRcdFx0Y2xlYXJUaW1lb3V0KHRpbWVyKTtcblx0XHR9XG5cdCk7XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBwVGltZW91dDtcbi8vIFRPRE86IFJlbW92ZSB0aGlzIGZvciB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gcFRpbWVvdXQ7XG5cbm1vZHVsZS5leHBvcnRzLlRpbWVvdXRFcnJvciA9IFRpbWVvdXRFcnJvcjtcbiIsIid1c2Ugc3RyaWN0JztcbmNvbnN0IHBUaW1lb3V0ID0gcmVxdWlyZSgncC10aW1lb3V0Jyk7XG5cbmNvbnN0IHBXYWl0Rm9yID0gYXN5bmMgKGNvbmRpdGlvbiwgb3B0aW9ucykgPT4ge1xuXHRvcHRpb25zID0ge1xuXHRcdGludGVydmFsOiAyMCxcblx0XHR0aW1lb3V0OiBJbmZpbml0eSxcblx0XHRsZWFkaW5nQ2hlY2s6IHRydWUsXG5cdFx0Li4ub3B0aW9uc1xuXHR9O1xuXG5cdGxldCByZXRyeVRpbWVvdXQ7XG5cblx0Y29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRjb25zdCBjaGVjayA9IGFzeW5jICgpID0+IHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IHZhbHVlID0gYXdhaXQgY29uZGl0aW9uKCk7XG5cblx0XHRcdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgY29uZGl0aW9uIHRvIHJldHVybiBhIGJvb2xlYW4nKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXRyeVRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrLCBvcHRpb25zLmludGVydmFsKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0cmVqZWN0KGVycm9yKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0aWYgKG9wdGlvbnMubGVhZGluZ0NoZWNrKSB7XG5cdFx0XHRjaGVjaygpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXRyeVRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrLCBvcHRpb25zLmludGVydmFsKTtcblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvcHRpb25zLnRpbWVvdXQgIT09IEluZmluaXR5KSB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBhd2FpdCBwVGltZW91dChwcm9taXNlLCBvcHRpb25zLnRpbWVvdXQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRpZiAocmV0cnlUaW1lb3V0KSB7XG5cdFx0XHRcdGNsZWFyVGltZW91dChyZXRyeVRpbWVvdXQpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aHJvdyBlcnJvcjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcHJvbWlzZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gcFdhaXRGb3I7XG4vLyBUT0RPOiBSZW1vdmUgdGhpcyBmb3IgdGhlIG5leHQgbWFqb3IgcmVsZWFzZVxubW9kdWxlLmV4cG9ydHMuZGVmYXVsdCA9IHBXYWl0Rm9yO1xuIiwidmFyIG9uY2UgPSByZXF1aXJlKCdvbmNlJylcbnZhciBlb3MgPSByZXF1aXJlKCdlbmQtb2Ytc3RyZWFtJylcbnZhciBmcyA9IHJlcXVpcmUoJ2ZzJykgLy8gd2Ugb25seSBuZWVkIGZzIHRvIGdldCB0aGUgUmVhZFN0cmVhbSBhbmQgV3JpdGVTdHJlYW0gcHJvdG90eXBlc1xuXG52YXIgbm9vcCA9IGZ1bmN0aW9uICgpIHt9XG52YXIgYW5jaWVudCA9IC9edj9cXC4wLy50ZXN0KHByb2Nlc3MudmVyc2lvbilcblxudmFyIGlzRm4gPSBmdW5jdGlvbiAoZm4pIHtcbiAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJ1xufVxuXG52YXIgaXNGUyA9IGZ1bmN0aW9uIChzdHJlYW0pIHtcbiAgaWYgKCFhbmNpZW50KSByZXR1cm4gZmFsc2UgLy8gbmV3ZXIgbm9kZSB2ZXJzaW9uIGRvIG5vdCBuZWVkIHRvIGNhcmUgYWJvdXQgZnMgaXMgYSBzcGVjaWFsIHdheVxuICBpZiAoIWZzKSByZXR1cm4gZmFsc2UgLy8gYnJvd3NlclxuICByZXR1cm4gKHN0cmVhbSBpbnN0YW5jZW9mIChmcy5SZWFkU3RyZWFtIHx8IG5vb3ApIHx8IHN0cmVhbSBpbnN0YW5jZW9mIChmcy5Xcml0ZVN0cmVhbSB8fCBub29wKSkgJiYgaXNGbihzdHJlYW0uY2xvc2UpXG59XG5cbnZhciBpc1JlcXVlc3QgPSBmdW5jdGlvbiAoc3RyZWFtKSB7XG4gIHJldHVybiBzdHJlYW0uc2V0SGVhZGVyICYmIGlzRm4oc3RyZWFtLmFib3J0KVxufVxuXG52YXIgZGVzdHJveWVyID0gZnVuY3Rpb24gKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZywgY2FsbGJhY2spIHtcbiAgY2FsbGJhY2sgPSBvbmNlKGNhbGxiYWNrKVxuXG4gIHZhciBjbG9zZWQgPSBmYWxzZVxuICBzdHJlYW0ub24oJ2Nsb3NlJywgZnVuY3Rpb24gKCkge1xuICAgIGNsb3NlZCA9IHRydWVcbiAgfSlcblxuICBlb3Moc3RyZWFtLCB7cmVhZGFibGU6IHJlYWRpbmcsIHdyaXRhYmxlOiB3cml0aW5nfSwgZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIpIHJldHVybiBjYWxsYmFjayhlcnIpXG4gICAgY2xvc2VkID0gdHJ1ZVxuICAgIGNhbGxiYWNrKClcbiAgfSlcblxuICB2YXIgZGVzdHJveWVkID0gZmFsc2VcbiAgcmV0dXJuIGZ1bmN0aW9uIChlcnIpIHtcbiAgICBpZiAoY2xvc2VkKSByZXR1cm5cbiAgICBpZiAoZGVzdHJveWVkKSByZXR1cm5cbiAgICBkZXN0cm95ZWQgPSB0cnVlXG5cbiAgICBpZiAoaXNGUyhzdHJlYW0pKSByZXR1cm4gc3RyZWFtLmNsb3NlKG5vb3ApIC8vIHVzZSBjbG9zZSBmb3IgZnMgc3RyZWFtcyB0byBhdm9pZCBmZCBsZWFrc1xuICAgIGlmIChpc1JlcXVlc3Qoc3RyZWFtKSkgcmV0dXJuIHN0cmVhbS5hYm9ydCgpIC8vIHJlcXVlc3QuZGVzdHJveSBqdXN0IGRvIC5lbmQgLSAuYWJvcnQgaXMgd2hhdCB3ZSB3YW50XG5cbiAgICBpZiAoaXNGbihzdHJlYW0uZGVzdHJveSkpIHJldHVybiBzdHJlYW0uZGVzdHJveSgpXG5cbiAgICBjYWxsYmFjayhlcnIgfHwgbmV3IEVycm9yKCdzdHJlYW0gd2FzIGRlc3Ryb3llZCcpKVxuICB9XG59XG5cbnZhciBjYWxsID0gZnVuY3Rpb24gKGZuKSB7XG4gIGZuKClcbn1cblxudmFyIHBpcGUgPSBmdW5jdGlvbiAoZnJvbSwgdG8pIHtcbiAgcmV0dXJuIGZyb20ucGlwZSh0bylcbn1cblxudmFyIHB1bXAgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdHJlYW1zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKVxuICB2YXIgY2FsbGJhY2sgPSBpc0ZuKHN0cmVhbXNbc3RyZWFtcy5sZW5ndGggLSAxXSB8fCBub29wKSAmJiBzdHJlYW1zLnBvcCgpIHx8IG5vb3BcblxuICBpZiAoQXJyYXkuaXNBcnJheShzdHJlYW1zWzBdKSkgc3RyZWFtcyA9IHN0cmVhbXNbMF1cbiAgaWYgKHN0cmVhbXMubGVuZ3RoIDwgMikgdGhyb3cgbmV3IEVycm9yKCdwdW1wIHJlcXVpcmVzIHR3byBzdHJlYW1zIHBlciBtaW5pbXVtJylcblxuICB2YXIgZXJyb3JcbiAgdmFyIGRlc3Ryb3lzID0gc3RyZWFtcy5tYXAoZnVuY3Rpb24gKHN0cmVhbSwgaSkge1xuICAgIHZhciByZWFkaW5nID0gaSA8IHN0cmVhbXMubGVuZ3RoIC0gMVxuICAgIHZhciB3cml0aW5nID0gaSA+IDBcbiAgICByZXR1cm4gZGVzdHJveWVyKHN0cmVhbSwgcmVhZGluZywgd3JpdGluZywgZnVuY3Rpb24gKGVycikge1xuICAgICAgaWYgKCFlcnJvcikgZXJyb3IgPSBlcnJcbiAgICAgIGlmIChlcnIpIGRlc3Ryb3lzLmZvckVhY2goY2FsbClcbiAgICAgIGlmIChyZWFkaW5nKSByZXR1cm5cbiAgICAgIGRlc3Ryb3lzLmZvckVhY2goY2FsbClcbiAgICAgIGNhbGxiYWNrKGVycm9yKVxuICAgIH0pXG4gIH0pXG5cbiAgcmV0dXJuIHN0cmVhbXMucmVkdWNlKHBpcGUpXG59XG5cbm1vZHVsZS5leHBvcnRzID0gcHVtcFxuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9yZXRyeScpOyIsInZhciBSZXRyeU9wZXJhdGlvbiA9IHJlcXVpcmUoJy4vcmV0cnlfb3BlcmF0aW9uJyk7XG5cbmV4cG9ydHMub3BlcmF0aW9uID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICB2YXIgdGltZW91dHMgPSBleHBvcnRzLnRpbWVvdXRzKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IFJldHJ5T3BlcmF0aW9uKHRpbWVvdXRzLCB7XG4gICAgICBmb3JldmVyOiBvcHRpb25zICYmIChvcHRpb25zLmZvcmV2ZXIgfHwgb3B0aW9ucy5yZXRyaWVzID09PSBJbmZpbml0eSksXG4gICAgICB1bnJlZjogb3B0aW9ucyAmJiBvcHRpb25zLnVucmVmLFxuICAgICAgbWF4UmV0cnlUaW1lOiBvcHRpb25zICYmIG9wdGlvbnMubWF4UmV0cnlUaW1lXG4gIH0pO1xufTtcblxuZXhwb3J0cy50aW1lb3V0cyA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBbXS5jb25jYXQob3B0aW9ucyk7XG4gIH1cblxuICB2YXIgb3B0cyA9IHtcbiAgICByZXRyaWVzOiAxMCxcbiAgICBmYWN0b3I6IDIsXG4gICAgbWluVGltZW91dDogMSAqIDEwMDAsXG4gICAgbWF4VGltZW91dDogSW5maW5pdHksXG4gICAgcmFuZG9taXplOiBmYWxzZVxuICB9O1xuICBmb3IgKHZhciBrZXkgaW4gb3B0aW9ucykge1xuICAgIG9wdHNba2V5XSA9IG9wdGlvbnNba2V5XTtcbiAgfVxuXG4gIGlmIChvcHRzLm1pblRpbWVvdXQgPiBvcHRzLm1heFRpbWVvdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pblRpbWVvdXQgaXMgZ3JlYXRlciB0aGFuIG1heFRpbWVvdXQnKTtcbiAgfVxuXG4gIHZhciB0aW1lb3V0cyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdHMucmV0cmllczsgaSsrKSB7XG4gICAgdGltZW91dHMucHVzaCh0aGlzLmNyZWF0ZVRpbWVvdXQoaSwgb3B0cykpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5mb3JldmVyICYmICF0aW1lb3V0cy5sZW5ndGgpIHtcbiAgICB0aW1lb3V0cy5wdXNoKHRoaXMuY3JlYXRlVGltZW91dChpLCBvcHRzKSk7XG4gIH1cblxuICAvLyBzb3J0IHRoZSBhcnJheSBudW1lcmljYWxseSBhc2NlbmRpbmdcbiAgdGltZW91dHMuc29ydChmdW5jdGlvbihhLGIpIHtcbiAgICByZXR1cm4gYSAtIGI7XG4gIH0pO1xuXG4gIHJldHVybiB0aW1lb3V0cztcbn07XG5cbmV4cG9ydHMuY3JlYXRlVGltZW91dCA9IGZ1bmN0aW9uKGF0dGVtcHQsIG9wdHMpIHtcbiAgdmFyIHJhbmRvbSA9IChvcHRzLnJhbmRvbWl6ZSlcbiAgICA/IChNYXRoLnJhbmRvbSgpICsgMSlcbiAgICA6IDE7XG5cbiAgdmFyIHRpbWVvdXQgPSBNYXRoLnJvdW5kKHJhbmRvbSAqIE1hdGgubWF4KG9wdHMubWluVGltZW91dCwgMSkgKiBNYXRoLnBvdyhvcHRzLmZhY3RvciwgYXR0ZW1wdCkpO1xuICB0aW1lb3V0ID0gTWF0aC5taW4odGltZW91dCwgb3B0cy5tYXhUaW1lb3V0KTtcblxuICByZXR1cm4gdGltZW91dDtcbn07XG5cbmV4cG9ydHMud3JhcCA9IGZ1bmN0aW9uKG9iaiwgb3B0aW9ucywgbWV0aG9kcykge1xuICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgbWV0aG9kcyA9IG9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG51bGw7XG4gIH1cblxuICBpZiAoIW1ldGhvZHMpIHtcbiAgICBtZXRob2RzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtZXRob2RzLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgbWV0aG9kICAgPSBtZXRob2RzW2ldO1xuICAgIHZhciBvcmlnaW5hbCA9IG9ialttZXRob2RdO1xuXG4gICAgb2JqW21ldGhvZF0gPSBmdW5jdGlvbiByZXRyeVdyYXBwZXIob3JpZ2luYWwpIHtcbiAgICAgIHZhciBvcCAgICAgICA9IGV4cG9ydHMub3BlcmF0aW9uKG9wdGlvbnMpO1xuICAgICAgdmFyIGFyZ3MgICAgID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3MucG9wKCk7XG5cbiAgICAgIGFyZ3MucHVzaChmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgaWYgKG9wLnJldHJ5KGVycikpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGFyZ3VtZW50c1swXSA9IG9wLm1haW5FcnJvcigpO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9KTtcblxuICAgICAgb3AuYXR0ZW1wdChmdW5jdGlvbigpIHtcbiAgICAgICAgb3JpZ2luYWwuYXBwbHkob2JqLCBhcmdzKTtcbiAgICAgIH0pO1xuICAgIH0uYmluZChvYmosIG9yaWdpbmFsKTtcbiAgICBvYmpbbWV0aG9kXS5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxufTtcbiIsImZ1bmN0aW9uIFJldHJ5T3BlcmF0aW9uKHRpbWVvdXRzLCBvcHRpb25zKSB7XG4gIC8vIENvbXBhdGliaWxpdHkgZm9yIHRoZSBvbGQgKHRpbWVvdXRzLCByZXRyeUZvcmV2ZXIpIHNpZ25hdHVyZVxuICBpZiAodHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJykge1xuICAgIG9wdGlvbnMgPSB7IGZvcmV2ZXI6IG9wdGlvbnMgfTtcbiAgfVxuXG4gIHRoaXMuX29yaWdpbmFsVGltZW91dHMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRpbWVvdXRzKSk7XG4gIHRoaXMuX3RpbWVvdXRzID0gdGltZW91dHM7XG4gIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB0aGlzLl9tYXhSZXRyeVRpbWUgPSBvcHRpb25zICYmIG9wdGlvbnMubWF4UmV0cnlUaW1lIHx8IEluZmluaXR5O1xuICB0aGlzLl9mbiA9IG51bGw7XG4gIHRoaXMuX2Vycm9ycyA9IFtdO1xuICB0aGlzLl9hdHRlbXB0cyA9IDE7XG4gIHRoaXMuX29wZXJhdGlvblRpbWVvdXQgPSBudWxsO1xuICB0aGlzLl9vcGVyYXRpb25UaW1lb3V0Q2IgPSBudWxsO1xuICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgdGhpcy5fb3BlcmF0aW9uU3RhcnQgPSBudWxsO1xuICB0aGlzLl90aW1lciA9IG51bGw7XG5cbiAgaWYgKHRoaXMuX29wdGlvbnMuZm9yZXZlcikge1xuICAgIHRoaXMuX2NhY2hlZFRpbWVvdXRzID0gdGhpcy5fdGltZW91dHMuc2xpY2UoMCk7XG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gUmV0cnlPcGVyYXRpb247XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9hdHRlbXB0cyA9IDE7XG4gIHRoaXMuX3RpbWVvdXRzID0gdGhpcy5fb3JpZ2luYWxUaW1lb3V0cy5zbGljZSgwKTtcbn1cblxuUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHRoaXMuX3RpbWVvdXQpIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gIH1cbiAgaWYgKHRoaXMuX3RpbWVyKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKTtcbiAgfVxuXG4gIHRoaXMuX3RpbWVvdXRzICAgICAgID0gW107XG4gIHRoaXMuX2NhY2hlZFRpbWVvdXRzID0gbnVsbDtcbn07XG5cblJldHJ5T3BlcmF0aW9uLnByb3RvdHlwZS5yZXRyeSA9IGZ1bmN0aW9uKGVycikge1xuICBpZiAodGhpcy5fdGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcbiAgfVxuXG4gIGlmICghZXJyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBjdXJyZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICBpZiAoZXJyICYmIGN1cnJlbnRUaW1lIC0gdGhpcy5fb3BlcmF0aW9uU3RhcnQgPj0gdGhpcy5fbWF4UmV0cnlUaW1lKSB7XG4gICAgdGhpcy5fZXJyb3JzLnB1c2goZXJyKTtcbiAgICB0aGlzLl9lcnJvcnMudW5zaGlmdChuZXcgRXJyb3IoJ1JldHJ5T3BlcmF0aW9uIHRpbWVvdXQgb2NjdXJyZWQnKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGhpcy5fZXJyb3JzLnB1c2goZXJyKTtcblxuICB2YXIgdGltZW91dCA9IHRoaXMuX3RpbWVvdXRzLnNoaWZ0KCk7XG4gIGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkVGltZW91dHMpIHtcbiAgICAgIC8vIHJldHJ5IGZvcmV2ZXIsIG9ubHkga2VlcCBsYXN0IGVycm9yXG4gICAgICB0aGlzLl9lcnJvcnMuc3BsaWNlKDAsIHRoaXMuX2Vycm9ycy5sZW5ndGggLSAxKTtcbiAgICAgIHRpbWVvdXQgPSB0aGlzLl9jYWNoZWRUaW1lb3V0cy5zbGljZSgtMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB2YXIgc2VsZiA9IHRoaXM7XG4gIHRoaXMuX3RpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICBzZWxmLl9hdHRlbXB0cysrO1xuXG4gICAgaWYgKHNlbGYuX29wZXJhdGlvblRpbWVvdXRDYikge1xuICAgICAgc2VsZi5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHNlbGYuX29wZXJhdGlvblRpbWVvdXRDYihzZWxmLl9hdHRlbXB0cyk7XG4gICAgICB9LCBzZWxmLl9vcGVyYXRpb25UaW1lb3V0KTtcblxuICAgICAgaWYgKHNlbGYuX29wdGlvbnMudW5yZWYpIHtcbiAgICAgICAgICBzZWxmLl90aW1lb3V0LnVucmVmKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc2VsZi5fZm4oc2VsZi5fYXR0ZW1wdHMpO1xuICB9LCB0aW1lb3V0KTtcblxuICBpZiAodGhpcy5fb3B0aW9ucy51bnJlZikge1xuICAgICAgdGhpcy5fdGltZXIudW5yZWYoKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLmF0dGVtcHQgPSBmdW5jdGlvbihmbiwgdGltZW91dE9wcykge1xuICB0aGlzLl9mbiA9IGZuO1xuXG4gIGlmICh0aW1lb3V0T3BzKSB7XG4gICAgaWYgKHRpbWVvdXRPcHMudGltZW91dCkge1xuICAgICAgdGhpcy5fb3BlcmF0aW9uVGltZW91dCA9IHRpbWVvdXRPcHMudGltZW91dDtcbiAgICB9XG4gICAgaWYgKHRpbWVvdXRPcHMuY2IpIHtcbiAgICAgIHRoaXMuX29wZXJhdGlvblRpbWVvdXRDYiA9IHRpbWVvdXRPcHMuY2I7XG4gICAgfVxuICB9XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBpZiAodGhpcy5fb3BlcmF0aW9uVGltZW91dENiKSB7XG4gICAgdGhpcy5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBzZWxmLl9vcGVyYXRpb25UaW1lb3V0Q2IoKTtcbiAgICB9LCBzZWxmLl9vcGVyYXRpb25UaW1lb3V0KTtcbiAgfVxuXG4gIHRoaXMuX29wZXJhdGlvblN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbiAgdGhpcy5fZm4odGhpcy5fYXR0ZW1wdHMpO1xufTtcblxuUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLnRyeSA9IGZ1bmN0aW9uKGZuKSB7XG4gIGNvbnNvbGUubG9nKCdVc2luZyBSZXRyeU9wZXJhdGlvbi50cnkoKSBpcyBkZXByZWNhdGVkJyk7XG4gIHRoaXMuYXR0ZW1wdChmbik7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuc3RhcnQgPSBmdW5jdGlvbihmbikge1xuICBjb25zb2xlLmxvZygnVXNpbmcgUmV0cnlPcGVyYXRpb24uc3RhcnQoKSBpcyBkZXByZWNhdGVkJyk7XG4gIHRoaXMuYXR0ZW1wdChmbik7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuc3RhcnQgPSBSZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUudHJ5O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuZXJyb3JzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLl9lcnJvcnM7XG59O1xuXG5SZXRyeU9wZXJhdGlvbi5wcm90b3R5cGUuYXR0ZW1wdHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuX2F0dGVtcHRzO1xufTtcblxuUmV0cnlPcGVyYXRpb24ucHJvdG90eXBlLm1haW5FcnJvciA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGNvdW50cyA9IHt9O1xuICB2YXIgbWFpbkVycm9yID0gbnVsbDtcbiAgdmFyIG1haW5FcnJvckNvdW50ID0gMDtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2Vycm9ycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlcnJvciA9IHRoaXMuX2Vycm9yc1tpXTtcbiAgICB2YXIgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgdmFyIGNvdW50ID0gKGNvdW50c1ttZXNzYWdlXSB8fCAwKSArIDE7XG5cbiAgICBjb3VudHNbbWVzc2FnZV0gPSBjb3VudDtcblxuICAgIGlmIChjb3VudCA+PSBtYWluRXJyb3JDb3VudCkge1xuICAgICAgbWFpbkVycm9yID0gZXJyb3I7XG4gICAgICBtYWluRXJyb3JDb3VudCA9IGNvdW50O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtYWluRXJyb3I7XG59O1xuIiwiLy8gUmV0dXJucyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgd3JhcHBlZCBjYWxsYmFja1xuLy8gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGRvIHNvbWUgc3R1ZmYsIGFuZCByZXR1cm4gYVxuLy8gcHJlc3VtYWJseSBkaWZmZXJlbnQgY2FsbGJhY2sgZnVuY3Rpb24uXG4vLyBUaGlzIG1ha2VzIHN1cmUgdGhhdCBvd24gcHJvcGVydGllcyBhcmUgcmV0YWluZWQsIHNvIHRoYXRcbi8vIGRlY29yYXRpb25zIGFuZCBzdWNoIGFyZSBub3QgbG9zdCBhbG9uZyB0aGUgd2F5LlxubW9kdWxlLmV4cG9ydHMgPSB3cmFwcHlcbmZ1bmN0aW9uIHdyYXBweSAoZm4sIGNiKSB7XG4gIGlmIChmbiAmJiBjYikgcmV0dXJuIHdyYXBweShmbikoY2IpXG5cbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCduZWVkIHdyYXBwZXIgZnVuY3Rpb24nKVxuXG4gIE9iamVjdC5rZXlzKGZuKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgd3JhcHBlcltrXSA9IGZuW2tdXG4gIH0pXG5cbiAgcmV0dXJuIHdyYXBwZXJcblxuICBmdW5jdGlvbiB3cmFwcGVyKCkge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldXG4gICAgfVxuICAgIHZhciByZXQgPSBmbi5hcHBseSh0aGlzLCBhcmdzKVxuICAgIHZhciBjYiA9IGFyZ3NbYXJncy5sZW5ndGgtMV1cbiAgICBpZiAodHlwZW9mIHJldCA9PT0gJ2Z1bmN0aW9uJyAmJiByZXQgIT09IGNiKSB7XG4gICAgICBPYmplY3Qua2V5cyhjYikuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuICAgICAgICByZXRba10gPSBjYltrXVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJldFxuICB9XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnN0cyA9IGV4cG9ydHMuZXMgPSBleHBvcnRzLmttcyA9IGV4cG9ydHMuc3lzdGVtc01hbmFnZXIgPSBleHBvcnRzLnNlY3JldHNNYW5hZ2VyID0gZXhwb3J0cy5zbnMgPSBleHBvcnRzLmNmID0gZXhwb3J0cy5zZm4gPSBleHBvcnRzLmR5bmFtb2RiRG9jQ2xpZW50ID0gZXhwb3J0cy5keW5hbW9kYnN0cmVhbXMgPSBleHBvcnRzLmR5bmFtb2RiID0gZXhwb3J0cy5jbG91ZHdhdGNoID0gZXhwb3J0cy5jbG91ZHdhdGNobG9ncyA9IGV4cG9ydHMuY2xvdWR3YXRjaGV2ZW50cyA9IGV4cG9ydHMuc3FzID0gZXhwb3J0cy5sYW1iZGEgPSBleHBvcnRzLmtpbmVzaXMgPSBleHBvcnRzLnMzID0gZXhwb3J0cy5lYzIgPSBleHBvcnRzLmVjcyA9IGV4cG9ydHMuYXBpZ2F0ZXdheSA9IHZvaWQgMDtcbmNvbnN0IEFXUyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiYXdzLXNka1wiKSk7XG5jb25zdCBhd3NDbGllbnQgPSByZXF1aXJlKFwiLi9jbGllbnRcIik7XG5leHBvcnRzLmFwaWdhdGV3YXkgPSBhd3NDbGllbnQoQVdTLkFQSUdhdGV3YXksICcyMDE1LTA3LTA5Jyk7XG5leHBvcnRzLmVjcyA9IGF3c0NsaWVudChBV1MuRUNTLCAnMjAxNC0xMS0xMycpO1xuZXhwb3J0cy5lYzIgPSBhd3NDbGllbnQoQVdTLkVDMiwgJzIwMTYtMTEtMTUnKTtcbmV4cG9ydHMuczMgPSBhd3NDbGllbnQoQVdTLlMzLCAnMjAwNi0wMy0wMScpO1xuZXhwb3J0cy5raW5lc2lzID0gYXdzQ2xpZW50KEFXUy5LaW5lc2lzLCAnMjAxMy0xMi0wMicpO1xuZXhwb3J0cy5sYW1iZGEgPSBhd3NDbGllbnQoQVdTLkxhbWJkYSwgJzIwMTUtMDMtMzEnKTtcbmV4cG9ydHMuc3FzID0gYXdzQ2xpZW50KEFXUy5TUVMsICcyMDEyLTExLTA1Jyk7XG5leHBvcnRzLmNsb3Vkd2F0Y2hldmVudHMgPSBhd3NDbGllbnQoQVdTLkNsb3VkV2F0Y2hFdmVudHMsICcyMDE0LTAyLTAzJyk7XG5leHBvcnRzLmNsb3Vkd2F0Y2hsb2dzID0gYXdzQ2xpZW50KEFXUy5DbG91ZFdhdGNoTG9ncywgJzIwMTQtMDMtMjgnKTtcbmV4cG9ydHMuY2xvdWR3YXRjaCA9IGF3c0NsaWVudChBV1MuQ2xvdWRXYXRjaCwgJzIwMTAtMDgtMDEnKTtcbmV4cG9ydHMuZHluYW1vZGIgPSBhd3NDbGllbnQoQVdTLkR5bmFtb0RCLCAnMjAxMi0wOC0xMCcpO1xuZXhwb3J0cy5keW5hbW9kYnN0cmVhbXMgPSBhd3NDbGllbnQoQVdTLkR5bmFtb0RCU3RyZWFtcywgJzIwMTItMDgtMTAnKTtcbmV4cG9ydHMuZHluYW1vZGJEb2NDbGllbnQgPSBhd3NDbGllbnQoQVdTLkR5bmFtb0RCLkRvY3VtZW50Q2xpZW50LCAnMjAxMi0wOC0xMCcpO1xuZXhwb3J0cy5zZm4gPSBhd3NDbGllbnQoQVdTLlN0ZXBGdW5jdGlvbnMsICcyMDE2LTExLTIzJyk7XG5leHBvcnRzLmNmID0gYXdzQ2xpZW50KEFXUy5DbG91ZEZvcm1hdGlvbiwgJzIwMTAtMDUtMTUnKTtcbmV4cG9ydHMuc25zID0gYXdzQ2xpZW50KEFXUy5TTlMsICcyMDEwLTAzLTMxJyk7XG5leHBvcnRzLnNlY3JldHNNYW5hZ2VyID0gYXdzQ2xpZW50KEFXUy5TZWNyZXRzTWFuYWdlciwgJzIwMTctMTAtMTcnKTtcbmV4cG9ydHMuc3lzdGVtc01hbmFnZXIgPSBhd3NDbGllbnQoQVdTLlNTTSwgJzIwMTctMTAtMTcnKTtcbmV4cG9ydHMua21zID0gYXdzQ2xpZW50KEFXUy5LTVMsICcyMDE0LTExLTAxJyk7XG5leHBvcnRzLmVzID0gYXdzQ2xpZW50KEFXUy5FUywgJzIwMTUtMDEtMDEnKTtcbmV4cG9ydHMuc3RzID0gYXdzQ2xpZW50KEFXUy5TVFMsICcyMDExLTA2LTE1Jyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZXJ2aWNlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMudGhyb3R0bGVPbmNlID0gZXhwb3J0cy50ZXN0QXdzQ2xpZW50ID0gZXhwb3J0cy5nZXRMb2NhbHN0YWNrRW5kcG9pbnQgPSBleHBvcnRzLmluVGVzdE1vZGUgPSB2b2lkIDA7XG5jb25zdCBlcnJvcnNfMSA9IHJlcXVpcmUoXCJAY3VtdWx1cy9lcnJvcnNcIik7XG5leHBvcnRzLmluVGVzdE1vZGUgPSAoKSA9PiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnO1xuLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20vbG9jYWxzdGFjay9sb2NhbHN0YWNrL2Jsb2IvbWFzdGVyL1JFQURNRS5tZFxuY29uc3QgbG9jYWxTdGFja1BvcnRzID0ge1xuICAgIHN0ZXBmdW5jdGlvbnM6IDQ1ODUsXG4gICAgYXBpZ2F0ZXdheTogNDU2NyxcbiAgICBjbG91ZGZvcm1hdGlvbjogNDU4MSxcbiAgICBjbG91ZHdhdGNoOiA0NTgyLFxuICAgIGNsb3Vkd2F0Y2hldmVudHM6IDQ1ODIsXG4gICAgY2xvdWR3YXRjaGxvZ3M6IDQ1ODYsXG4gICAgZHluYW1vZGI6IDQ1NjQsXG4gICAgZXM6IDQ1NzEsXG4gICAgZmlyZWhvc2U6IDQ1NzMsXG4gICAgaWFtOiA0NTkzLFxuICAgIGtpbmVzaXM6IDQ1NjgsXG4gICAga21zOiA0NTk5LFxuICAgIGxhbWJkYTogNDU3NCxcbiAgICByZWRzaGlmdDogNDU3NyxcbiAgICByb3V0ZTUzOiA0NTgwLFxuICAgIHMzOiA0NTcyLFxuICAgIHNlY3JldHNtYW5hZ2VyOiA0NTg0LFxuICAgIHNlczogNDU3OSxcbiAgICBzbnM6IDQ1NzUsXG4gICAgc3FzOiA0NTc2LFxuICAgIHNzbTogNDU4MyxcbiAgICBzdHM6IDQ1OTIsXG59O1xuLyoqXG4gKiBUZXN0IGlmIGEgZ2l2ZW4gQVdTIHNlcnZpY2UgaXMgc3VwcG9ydGVkIGJ5IExvY2FsU3RhY2suXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gc2VydmljZUlkZW50aWZpZXIgLSBhbiBBV1Mgc2VydmljZSBvYmplY3QgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIG9yIGZhbHNlIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBzZXJ2aWNlIGlzXG4gKiAgIHN1cHBvcnRlZCBieSBMb2NhbFN0YWNrXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gbG9jYWxzdGFja1N1cHBvcnRlZFNlcnZpY2Uoc2VydmljZUlkZW50aWZpZXIpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMobG9jYWxTdGFja1BvcnRzKS5pbmNsdWRlcyhzZXJ2aWNlSWRlbnRpZmllcik7XG59XG4vKipcbiAqIFJldHVybnMgdGhlIHByb3BlciBlbmRwb2ludCBmb3IgYSBnaXZlbiBhd3Mgc2VydmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpZGVudGlmaWVyIC0gc2VydmljZSBuYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgbG9jYWxzdGFjayBlbmRwb2ludFxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldExvY2Fsc3RhY2tFbmRwb2ludChpZGVudGlmaWVyKSB7XG4gICAgY29uc3Qga2V5ID0gYExPQ0FMXyR7aWRlbnRpZmllci50b1VwcGVyQ2FzZSgpfV9IT1NUYDtcbiAgICBpZiAocHJvY2Vzcy5lbnZba2V5XSkge1xuICAgICAgICByZXR1cm4gYGh0dHA6Ly8ke3Byb2Nlc3MuZW52W2tleV19OiR7bG9jYWxTdGFja1BvcnRzW2lkZW50aWZpZXJdfWA7XG4gICAgfVxuICAgIHJldHVybiBgaHR0cDovLyR7cHJvY2Vzcy5lbnYuTE9DQUxTVEFDS19IT1NUfToke2xvY2FsU3RhY2tQb3J0c1tpZGVudGlmaWVyXX1gO1xufVxuZXhwb3J0cy5nZXRMb2NhbHN0YWNrRW5kcG9pbnQgPSBnZXRMb2NhbHN0YWNrRW5kcG9pbnQ7XG4vKipcbiAqIENyZWF0ZSBhbiBBV1Mgc2VydmljZSBvYmplY3QgdGhhdCB0YWxrcyB0byBMb2NhbFN0YWNrLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHRoZSBMT0NBTFNUQUNLX0hPU1QgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBzZXQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gU2VydmljZSAtIGFuIEFXUyBzZXJ2aWNlIG9iamVjdCBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIHNlcnZpY2Ugb2JqZWN0IGNvbnN0cnVjdG9yIGZ1bmN0aW9uXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBhbiBBV1Mgc2VydmljZSBvYmplY3RcbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2NhbFN0YWNrQXdzQ2xpZW50KFNlcnZpY2UsIG9wdGlvbnMpIHtcbiAgICBpZiAoIXByb2Nlc3MuZW52LkxPQ0FMU1RBQ0tfSE9TVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBMT0NBTFNUQUNLX0hPU1QgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldC4nKTtcbiAgICB9XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNlcnZpY2VJZGVudGlmaWVyID0gU2VydmljZS5zZXJ2aWNlSWRlbnRpZmllcjtcbiAgICBjb25zdCBsb2NhbFN0YWNrT3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgYWNjZXNzS2V5SWQ6ICdteS1hY2Nlc3Mta2V5LWlkJyxcbiAgICAgICAgc2VjcmV0QWNjZXNzS2V5OiAnbXktc2VjcmV0LWFjY2Vzcy1rZXknLFxuICAgICAgICByZWdpb246ICd1cy1lYXN0LTEnLFxuICAgICAgICBlbmRwb2ludDogZ2V0TG9jYWxzdGFja0VuZHBvaW50KHNlcnZpY2VJZGVudGlmaWVyKSxcbiAgICB9O1xuICAgIGlmIChzZXJ2aWNlSWRlbnRpZmllciA9PT0gJ3MzJylcbiAgICAgICAgbG9jYWxTdGFja09wdGlvbnMuczNGb3JjZVBhdGhTdHlsZSA9IHRydWU7XG4gICAgcmV0dXJuIG5ldyBTZXJ2aWNlKGxvY2FsU3RhY2tPcHRpb25zKTtcbn1cbi8qKlxuICogQ3JlYXRlIGFuIEFXUyBzZXJ2aWNlIG9iamVjdCB0aGF0IGRvZXMgbm90IGFjdHVhbGx5IHRhbGsgdG8gQVdTLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFNlcnZpY2UgLSBhbiBBV1Mgc2VydmljZSBvYmplY3QgY29uc3RydWN0b3IgZnVuY3Rpb25cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBzZXJ2aWNlIG9iamVjdCBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICogQHJldHVybnMge09iamVjdH0gYW4gQVdTIHNlcnZpY2Ugb2JqZWN0XG4gKlxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gdGVzdEF3c0NsaWVudChTZXJ2aWNlLCBvcHRpb25zKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNlcnZpY2VJZGVudGlmaWVyID0gU2VydmljZS5zZXJ2aWNlSWRlbnRpZmllcjtcbiAgICBpZiAobG9jYWxzdGFja1N1cHBvcnRlZFNlcnZpY2Uoc2VydmljZUlkZW50aWZpZXIpKSB7XG4gICAgICAgIHJldHVybiBsb2NhbFN0YWNrQXdzQ2xpZW50KFNlcnZpY2UsIG9wdGlvbnMpO1xuICAgIH1cbiAgICByZXR1cm4ge307XG59XG5leHBvcnRzLnRlc3RBd3NDbGllbnQgPSB0ZXN0QXdzQ2xpZW50O1xuLyoqXG4gKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHRocm93cyBhIFRocm90dGxpbmdFeGNlcHRpb24gdGhlIGZpcnN0IHRpbWUgaXQgaXMgY2FsbGVkLCB0aGVuIHJldHVybnMgYXNcbiAqIG5vcm1hbCBhbnkgb3RoZXIgdGltZXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn1cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLnRocm90dGxlT25jZSA9IChmbikgPT4ge1xuICAgIGxldCB0aHJvdHRsZU5leHRDYWxsID0gdHJ1ZTtcbiAgICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKHRocm90dGxlTmV4dENhbGwpIHtcbiAgICAgICAgICAgIHRocm90dGxlTmV4dENhbGwgPSBmYWxzZTtcbiAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnNfMS5UaHJvdHRsaW5nRXhjZXB0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICAgIH07XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dGVzdC11dGlscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucmV0cnlPblRocm90dGxpbmdFeGNlcHRpb24gPSBleHBvcnRzLmltcHJvdmVTdGFja1RyYWNlID0gZXhwb3J0cy5zZXRFcnJvclN0YWNrID0gdm9pZCAwO1xuY29uc3QgcF9yZXRyeV8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJwLXJldHJ5XCIpKTtcbmNvbnN0IGVycm9yc18xID0gcmVxdWlyZShcIkBjdW11bHVzL2Vycm9yc1wiKTtcbi8vIFJlcGxhY2UgdGhlIHN0YWNrIG9mIGFuIGVycm9yXG4vLyBOb3RlOiBUaGlzIG11dGF0ZXMgdGhlIGVycm9yIHRoYXQgd2FzIHBhc3NlZCBpbi5cbmV4cG9ydHMuc2V0RXJyb3JTdGFjayA9IChlcnJvciwgbmV3U3RhY2spID0+IHtcbiAgICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGVycm9yLnN0YWNrID0gW1xuICAgICAgICAgICAgZXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpWzBdLFxuICAgICAgICAgICAgLi4ubmV3U3RhY2suc3BsaXQoJ1xcbicpLnNsaWNlKDEpLFxuICAgICAgICBdLmpvaW4oJ1xcbicpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgIGVycm9yLnN0YWNrID0gbmV3U3RhY2s7XG4gICAgfVxufTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB2YWxpZC1qc2RvY1xuLyoqXG4gKiBXcmFwIGEgZnVuY3Rpb24gYW5kIHByb3ZpZGUgYSBiZXR0ZXIgc3RhY2sgdHJhY2VcbiAqXG4gKiBJZiBhIGNhbGwgaXMgbWFkZSB0byB0aGUgYXdzLXNkayBhbmQgaXQgY2F1c2VzIGFuIGV4Y2VwdGlvbiwgdGhlIHN0YWNrIHRyYWNlXG4gKiB0aGF0IGlzIHJldHVybmVkIGdpdmVzIG5vIGluZGljYXRpb24gb2Ygd2hlcmUgdGhlIGVycm9yIGFjdHVhbGx5IG9jY3VycmVkLlxuICpcbiAqIFRoaXMgdXRpbGl0eSB3aWxsIHdyYXAgYSBmdW5jdGlvbiBhbmQsIHdoZW4gaXQgaXMgY2FsbGVkLCB1cGRhdGUgYW55IHJhaXNlZFxuICogZXJyb3Igd2l0aCBhIGJldHRlciBzdGFjayB0cmFjZS5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnRzLmltcHJvdmVTdGFja1RyYWNlID0gKGZuKSA9PiBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgIGNvbnN0IHRyYWNlckVycm9yID0gbmV3IEVycm9yKCk7XG4gICAgdHJ5IHtcbiAgICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodHJhY2VyRXJyb3IpO1xuICAgICAgICByZXR1cm4gYXdhaXQgZm4oLi4uYXJncyk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGV4cG9ydHMuc2V0RXJyb3JTdGFjayhlcnJvciwgdHJhY2VyRXJyb3Iuc3RhY2spO1xuICAgICAgICBlcnJvci5tZXNzYWdlID0gYCR7ZXJyb3IubWVzc2FnZX07IEZ1bmN0aW9uIHBhcmFtczogJHtKU09OLnN0cmluZ2lmeShhcmdzLCB1bmRlZmluZWQsIDIpfWA7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn07XG5jb25zdCByZXRyeUlmVGhyb3R0bGluZ0V4Y2VwdGlvbiA9IChlcnIpID0+IHtcbiAgICBpZiAoZXJyb3JzXzEuaXNUaHJvdHRsaW5nRXhjZXB0aW9uKGVycikpXG4gICAgICAgIHRocm93IGVycjtcbiAgICB0aHJvdyBuZXcgcF9yZXRyeV8xLmRlZmF1bHQuQWJvcnRFcnJvcihlcnIpO1xufTtcbi8qKlxuICogV3JhcCBhIGZ1bmN0aW9uIHNvIHRoYXQgaXQgd2lsbCByZXRyeSB3aGVuIGEgVGhyb3R0bGluZ0V4Y2VwdGlvbiBpcyBlbmNvdW50ZXJlZC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIHRoZSBmdW5jdGlvbiB0byByZXRyeS4gIFRoaXMgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSBQcm9taXNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSByZXRyeSBvcHRpb25zLCBkb2N1bWVudGVkIGhlcmU6XG4gKiAgIC0gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9wLXJldHJ5I29wdGlvbnNcbiAqICAgLSBodHRwczovL2dpdGh1Yi5jb20vdGltLWtvcy9ub2RlLXJldHJ5I3JldHJ5b3BlcmF0aW9ub3B0aW9uc1xuICogICAtIGh0dHBzOi8vZ2l0aHViLmNvbS90aW0ta29zL25vZGUtcmV0cnkjcmV0cnl0aW1lb3V0c29wdGlvbnNcbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gYSBmdW5jdGlvbiB0aGF0IHdpbGwgcmV0cnkgb24gYSBUaHJvdHRsaW5nRXhjZXB0aW9uXG4gKlxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0cy5yZXRyeU9uVGhyb3R0bGluZ0V4Y2VwdGlvbiA9IChmbiwgb3B0aW9ucyA9IHt9KSA9PiAoLi4uYXJncykgPT4gcF9yZXRyeV8xLmRlZmF1bHQoKCkgPT4gZm4oLi4uYXJncykuY2F0Y2gocmV0cnlJZlRocm90dGxpbmdFeGNlcHRpb24pLCB7IG1heFRpbWVvdXQ6IDUwMDAsIC4uLm9wdGlvbnMgfSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmdlbmVyYXRlQ2hlY2tzdW1Gcm9tU3RyZWFtID0gdm9pZCAwO1xuY29uc3QgY2tzdW0gPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcImNrc3VtXCIpKTtcbmNvbnN0IGNyeXB0byA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiY3J5cHRvXCIpKTtcbi8vIENhbGN1bGF0ZSB0aGUgY2tzdW0gb2YgYSByZWFkYWJsZSBzdHJlYW1cbmFzeW5jIGZ1bmN0aW9uIGdldENrc3VtRnJvbVN0cmVhbShzdHJlYW0pIHtcbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gc3RyZWFtXG4gICAgICAgIC5waXBlKGNrc3VtLnN0cmVhbSgodmFsdWUpID0+IHJlc29sdmUodmFsdWUucmVhZFVJbnQzMkJFKDApKSkpXG4gICAgICAgIC5vbignZXJyb3InLCByZWplY3QpKTtcbn1cbi8vIENhbGN1bGF0ZSB0aGUgaGFzaCBvZiBhIHJlYWRhYmxlIHN0cmVhbSB1c2luZyBgY3J5cHRvLmNyZWF0ZUhhc2goKWBcbmFzeW5jIGZ1bmN0aW9uIGdldENoZWNrc3VtRnJvbVN0cmVhbShhbGdvcml0aG0sIHN0cmVhbSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKGFsZ29yaXRobSwgb3B0aW9ucyk7XG4gICAgICAgIHN0cmVhbS5vbignZXJyb3InLCByZWplY3QpO1xuICAgICAgICBzdHJlYW0ub24oJ2RhdGEnLCAoY2h1bmspID0+IGhhc2gudXBkYXRlKGNodW5rKSk7XG4gICAgICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShoYXNoLmRpZ2VzdCgnaGV4JykpKTtcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlIDxhbGdvcml0aG0+IGZpbGUgY2hlY2tzdW0gZnJvbSByZWFkYWJsZSBzdHJlYW1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWxnb3JpdGhtIC0gQ2hlY2tzdW0gYWxnb3JpdGhtIHR5cGVcbiAqIEBwYXJhbSB7c3RyZWFtLlJlYWRhYmxlfSBzdHJlYW0gLSBBIHJlYWRhYmxlIGZpbGUgc3RyZWFtXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQ2hlY2tzdW0gb3B0aW9ucywgc2VlIGBjcnlwdG8uY3JlYXRlSGFzaCgpYFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlcnxzdHJpbmc+fSB0aGUgZmlsZSBjaGVja3N1bVxuICpcbiAqIEBhbGlhcyBtb2R1bGU6Y2hlY2tzdW0uZ2VuZXJhdGVDaGVja3N1bUZyb21TdHJlYW1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDaGVja3N1bUZyb21TdHJlYW0oYWxnb3JpdGhtLCBzdHJlYW0sIG9wdGlvbnMpIHtcbiAgICBpZiAoYWxnb3JpdGhtLnRvTG93ZXJDYXNlKCkgPT09ICdja3N1bScpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGdldENrc3VtRnJvbVN0cmVhbShzdHJlYW0pO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgZ2V0Q2hlY2tzdW1Gcm9tU3RyZWFtKGFsZ29yaXRobSwgc3RyZWFtLCBvcHRpb25zKTtcbn1cbmV4cG9ydHMuZ2VuZXJhdGVDaGVja3N1bUZyb21TdHJlYW0gPSBnZW5lcmF0ZUNoZWNrc3VtRnJvbVN0cmVhbTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNoZWNrc3VtLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuY29uc3QgaXNFcnJvciA9IHJlcXVpcmUoXCJsb2Rhc2guaXNlcnJvclwiKTtcbmNvbnN0IHV0aWwgPSByZXF1aXJlKFwidXRpbFwiKTtcbmNsYXNzIExvZ2dlciB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuYXN5bmNPcGVyYXRpb25JZCA9IG9wdGlvbnMuYXN5bmNPcGVyYXRpb25JZDtcbiAgICAgICAgdGhpcy5leGVjdXRpb25zID0gb3B0aW9ucy5leGVjdXRpb25zO1xuICAgICAgICB0aGlzLmdyYW51bGVzID0gb3B0aW9ucy5ncmFudWxlcztcbiAgICAgICAgdGhpcy5wYXJlbnRBcm4gPSBvcHRpb25zLnBhcmVudEFybjtcbiAgICAgICAgdGhpcy5wcmV0dHkgPSBvcHRpb25zLnByZXR0eSB8fCBmYWxzZTtcbiAgICAgICAgdGhpcy5zZW5kZXIgPSBvcHRpb25zLnNlbmRlciB8fCAndW5rbm93bic7XG4gICAgICAgIHRoaXMuc3RhY2tOYW1lID0gb3B0aW9ucy5zdGFja05hbWU7XG4gICAgICAgIHRoaXMuY29uc29sZSA9IG9wdGlvbnMuY29uc29sZSB8fCBnbG9iYWwuY29uc29sZTtcbiAgICAgICAgdGhpcy52ZXJzaW9uID0gb3B0aW9ucy52ZXJzaW9uO1xuICAgIH1cbiAgICBidWlsZE1lc3NhZ2UobGV2ZWwsIC4uLm1lc3NhZ2VBcmdzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkTG9nRXZlbnRNZXNzYWdlKGxldmVsLCBtZXNzYWdlQXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZyBhIGRlYnVnIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBkZWJ1ZyguLi5tZXNzYWdlQXJncykge1xuICAgICAgICB0aGlzLndyaXRlTG9nRXZlbnQoJ2RlYnVnJywgbWVzc2FnZUFyZ3MpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZVxuICAgICAqL1xuICAgIGVycm9yKC4uLm1lc3NhZ2VBcmdzKSB7XG4gICAgICAgIGNvbnN0IGxhc3RNZXNzYWdlQXJnID0gbWVzc2FnZUFyZ3NbbWVzc2FnZUFyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChpc0Vycm9yKGxhc3RNZXNzYWdlQXJnKSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBsYXN0TWVzc2FnZUFyZztcbiAgICAgICAgICAgIGxldCBhY3R1YWxNZXNzYWdlQXJncyA9IG1lc3NhZ2VBcmdzLnNsaWNlKDAsIG1lc3NhZ2VBcmdzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgaWYgKGFjdHVhbE1lc3NhZ2VBcmdzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICBhY3R1YWxNZXNzYWdlQXJncyA9IFtlcnJvci5tZXNzYWdlXTtcbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxLZXlzID0ge1xuICAgICAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhY2spXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbEtleXMuZXJyb3Iuc3RhY2sgPSBlcnJvci5zdGFjay5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICB0aGlzLndyaXRlTG9nRXZlbnQoJ2Vycm9yJywgYWN0dWFsTWVzc2FnZUFyZ3MsIGFkZGl0aW9uYWxLZXlzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMud3JpdGVMb2dFdmVudCgnZXJyb3InLCBtZXNzYWdlQXJncyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGEgZmF0YWwgbWVzc2FnZVxuICAgICAqL1xuICAgIGZhdGFsKC4uLm1lc3NhZ2VBcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGVMb2dFdmVudCgnZmF0YWwnLCBtZXNzYWdlQXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZyBhbiBpbmZvIG1lc3NhZ2VcbiAgICAgKi9cbiAgICBpbmZvKC4uLm1lc3NhZ2VBcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGVMb2dFdmVudCgnaW5mbycsIG1lc3NhZ2VBcmdzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGFuIGV2ZW50IHdpdGggYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYWRkaXRpb25hbEtleXNcbiAgICAgKiBAcGFyYW0ge0FycmF5PGFueT59IG1lc3NhZ2VBcmdzIC0gdGhlIG1lc3NhZ2UgdG8gbG9nXG4gICAgICovXG4gICAgaW5mb1dpdGhBZGRpdGlvbmFsS2V5cyhhZGRpdGlvbmFsS2V5cywgLi4ubWVzc2FnZUFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZUxvZ0V2ZW50KCdpbmZvJywgbWVzc2FnZUFyZ3MsIGFkZGl0aW9uYWxLZXlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTG9nIGEgdHJhY2UgbWVzc2FnZVxuICAgICAqL1xuICAgIHRyYWNlKC4uLm1lc3NhZ2VBcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGVMb2dFdmVudCgndHJhY2UnLCBtZXNzYWdlQXJncyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExvZyBhIHdhcm5pbmcgbWVzc2FnZVxuICAgICAqL1xuICAgIHdhcm4oLi4ubWVzc2FnZUFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZUxvZ0V2ZW50KCd3YXJuJywgbWVzc2FnZUFyZ3MpO1xuICAgIH1cbiAgICBidWlsZExvZ0V2ZW50TWVzc2FnZShsZXZlbCwgbWVzc2FnZUFyZ3MsIGFkZGl0aW9uYWxLZXlzID0ge30pIHtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIGlmIChtZXNzYWdlQXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSB1dGlsLmZvcm1hdChtZXNzYWdlQXJnc1swXSwgLi4ubWVzc2FnZUFyZ3Muc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YW5kYXJkTG9nRXZlbnQgPSB7XG4gICAgICAgICAgICBhc3luY09wZXJhdGlvbklkOiB0aGlzLmFzeW5jT3BlcmF0aW9uSWQsXG4gICAgICAgICAgICBleGVjdXRpb25zOiB0aGlzLmV4ZWN1dGlvbnMsXG4gICAgICAgICAgICBncmFudWxlczogdGhpcy5ncmFudWxlcyxcbiAgICAgICAgICAgIGxldmVsLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIHBhcmVudEFybjogdGhpcy5wYXJlbnRBcm4sXG4gICAgICAgICAgICBzZW5kZXI6IHRoaXMuc2VuZGVyLFxuICAgICAgICAgICAgc3RhY2tOYW1lOiB0aGlzLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogKG5ldyBEYXRlKCkpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxvZ0V2ZW50ID0ge1xuICAgICAgICAgICAgLi4uYWRkaXRpb25hbEtleXMsXG4gICAgICAgICAgICAuLi5zdGFuZGFyZExvZ0V2ZW50LFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5wcmV0dHlcbiAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkobG9nRXZlbnQsIHVuZGVmaW5lZCwgMilcbiAgICAgICAgICAgIDogSlNPTi5zdHJpbmdpZnkobG9nRXZlbnQpO1xuICAgIH1cbiAgICB3cml0ZUxvZ0V2ZW50KGxldmVsLCBtZXNzYWdlQXJncywgYWRkaXRpb25hbEtleXMgPSB7fSkge1xuICAgICAgICBjb25zdCBsb2dFdmVudFN0cmluZyA9IHRoaXMuYnVpbGRMb2dFdmVudE1lc3NhZ2UobGV2ZWwsIG1lc3NhZ2VBcmdzLCBhZGRpdGlvbmFsS2V5cyk7XG4gICAgICAgIGlmIChsZXZlbCA9PT0gJ2Vycm9yJylcbiAgICAgICAgICAgIHRoaXMuY29uc29sZS5lcnJvcihsb2dFdmVudFN0cmluZyk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHRoaXMuY29uc29sZS5sb2cobG9nRXZlbnRTdHJpbmcpO1xuICAgIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gTG9nZ2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLnZhbGlkYXRlQ2hlY2tzdW1Gcm9tU3RyZWFtID0gdm9pZCAwO1xuY29uc3QgY2hlY2tzdW1fMSA9IHJlcXVpcmUoXCIuL2NoZWNrc3VtXCIpO1xuLyoqXG4gKiBWYWxpZGF0ZSBleHBlY3RlZCBjaGVja3N1bSBhZ2FpbnN0IGNhbGN1bGF0ZWQgY2hlY2tzdW1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYWxnb3JpdGhtIC0gQ2hlY2tzdW0gYWxnb3JpdGhtXG4gKiBAcGFyYW0ge3N0cmVhbS5SZWFkYWJsZX0gc3RyZWFtIC0gQSByZWFkYWJsZSBmaWxlIHN0cmVhbVxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSBleHBlY3RlZFN1bSAtIGV4cGVjdGVkIGNoZWNrc3VtXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQ2hlY2tzdW0gb3B0aW9uc1xuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSB3aGV0aGVyIGV4cGVjdGVkU3VtID09PSBjYWxjdWxhdGVkU3VtXG4gKlxuICogQGFsaWFzIG1vZHVsZTpjaGVja3N1bS52YWxpZGF0ZUNoZWNrc3VtRnJvbVN0cmVhbVxuICovXG5hc3luYyBmdW5jdGlvbiB2YWxpZGF0ZUNoZWNrc3VtRnJvbVN0cmVhbShhbGdvcml0aG0sIHN0cmVhbSwgZXhwZWN0ZWRTdW0sIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IGNhbGN1bGF0ZWRTdW0gPSBhd2FpdCBjaGVja3N1bV8xLmdlbmVyYXRlQ2hlY2tzdW1Gcm9tU3RyZWFtKGFsZ29yaXRobSwgc3RyZWFtLCBvcHRpb25zKTtcbiAgICByZXR1cm4gZXhwZWN0ZWRTdW0gPT09IGNhbGN1bGF0ZWRTdW07XG59XG5leHBvcnRzLnZhbGlkYXRlQ2hlY2tzdW1Gcm9tU3RyZWFtID0gdmFsaWRhdGVDaGVja3N1bUZyb21TdHJlYW07XG4vLyMgc291cmNlTWFwcGluZ1VSTD12YWxpZGF0ZS5qcy5tYXAiLCJ2YXIgc3RyZWFtID0gcmVxdWlyZSgnc3RyZWFtJylcblxudmFyIGNyY3RhYiA9IFtcbiAgMHgwMDAwMDAwMCxcbiAgMHgwNGMxMWRiNywgMHgwOTgyM2I2ZSwgMHgwZDQzMjZkOSwgMHgxMzA0NzZkYywgMHgxN2M1NmI2YixcbiAgMHgxYTg2NGRiMiwgMHgxZTQ3NTAwNSwgMHgyNjA4ZWRiOCwgMHgyMmM5ZjAwZiwgMHgyZjhhZDZkNixcbiAgMHgyYjRiY2I2MSwgMHgzNTBjOWI2NCwgMHgzMWNkODZkMywgMHgzYzhlYTAwYSwgMHgzODRmYmRiZCxcbiAgMHg0YzExZGI3MCwgMHg0OGQwYzZjNywgMHg0NTkzZTAxZSwgMHg0MTUyZmRhOSwgMHg1ZjE1YWRhYyxcbiAgMHg1YmQ0YjAxYiwgMHg1Njk3OTZjMiwgMHg1MjU2OGI3NSwgMHg2YTE5MzZjOCwgMHg2ZWQ4MmI3ZixcbiAgMHg2MzliMGRhNiwgMHg2NzVhMTAxMSwgMHg3OTFkNDAxNCwgMHg3ZGRjNWRhMywgMHg3MDlmN2I3YSxcbiAgMHg3NDVlNjZjZCwgMHg5ODIzYjZlMCwgMHg5Y2UyYWI1NywgMHg5MWExOGQ4ZSwgMHg5NTYwOTAzOSxcbiAgMHg4YjI3YzAzYywgMHg4ZmU2ZGQ4YiwgMHg4MmE1ZmI1MiwgMHg4NjY0ZTZlNSwgMHhiZTJiNWI1OCxcbiAgMHhiYWVhNDZlZiwgMHhiN2E5NjAzNiwgMHhiMzY4N2Q4MSwgMHhhZDJmMmQ4NCwgMHhhOWVlMzAzMyxcbiAgMHhhNGFkMTZlYSwgMHhhMDZjMGI1ZCwgMHhkNDMyNmQ5MCwgMHhkMGYzNzAyNywgMHhkZGIwNTZmZSxcbiAgMHhkOTcxNGI0OSwgMHhjNzM2MWI0YywgMHhjM2Y3MDZmYiwgMHhjZWI0MjAyMiwgMHhjYTc1M2Q5NSxcbiAgMHhmMjNhODAyOCwgMHhmNmZiOWQ5ZiwgMHhmYmI4YmI0NiwgMHhmZjc5YTZmMSwgMHhlMTNlZjZmNCxcbiAgMHhlNWZmZWI0MywgMHhlOGJjY2Q5YSwgMHhlYzdkZDAyZCwgMHgzNDg2NzA3NywgMHgzMDQ3NmRjMCxcbiAgMHgzZDA0NGIxOSwgMHgzOWM1NTZhZSwgMHgyNzgyMDZhYiwgMHgyMzQzMWIxYywgMHgyZTAwM2RjNSxcbiAgMHgyYWMxMjA3MiwgMHgxMjhlOWRjZiwgMHgxNjRmODA3OCwgMHgxYjBjYTZhMSwgMHgxZmNkYmIxNixcbiAgMHgwMThhZWIxMywgMHgwNTRiZjZhNCwgMHgwODA4ZDA3ZCwgMHgwY2M5Y2RjYSwgMHg3ODk3YWIwNyxcbiAgMHg3YzU2YjZiMCwgMHg3MTE1OTA2OSwgMHg3NWQ0OGRkZSwgMHg2YjkzZGRkYiwgMHg2ZjUyYzA2YyxcbiAgMHg2MjExZTZiNSwgMHg2NmQwZmIwMiwgMHg1ZTlmNDZiZiwgMHg1YTVlNWIwOCwgMHg1NzFkN2RkMSxcbiAgMHg1M2RjNjA2NiwgMHg0ZDliMzA2MywgMHg0OTVhMmRkNCwgMHg0NDE5MGIwZCwgMHg0MGQ4MTZiYSxcbiAgMHhhY2E1YzY5NywgMHhhODY0ZGIyMCwgMHhhNTI3ZmRmOSwgMHhhMWU2ZTA0ZSwgMHhiZmExYjA0YixcbiAgMHhiYjYwYWRmYywgMHhiNjIzOGIyNSwgMHhiMmUyOTY5MiwgMHg4YWFkMmIyZiwgMHg4ZTZjMzY5OCxcbiAgMHg4MzJmMTA0MSwgMHg4N2VlMGRmNiwgMHg5OWE5NWRmMywgMHg5ZDY4NDA0NCwgMHg5MDJiNjY5ZCxcbiAgMHg5NGVhN2IyYSwgMHhlMGI0MWRlNywgMHhlNDc1MDA1MCwgMHhlOTM2MjY4OSwgMHhlZGY3M2IzZSxcbiAgMHhmM2IwNmIzYiwgMHhmNzcxNzY4YywgMHhmYTMyNTA1NSwgMHhmZWYzNGRlMiwgMHhjNmJjZjA1ZixcbiAgMHhjMjdkZWRlOCwgMHhjZjNlY2IzMSwgMHhjYmZmZDY4NiwgMHhkNWI4ODY4MywgMHhkMTc5OWIzNCxcbiAgMHhkYzNhYmRlZCwgMHhkOGZiYTA1YSwgMHg2OTBjZTBlZSwgMHg2ZGNkZmQ1OSwgMHg2MDhlZGI4MCxcbiAgMHg2NDRmYzYzNywgMHg3YTA4OTYzMiwgMHg3ZWM5OGI4NSwgMHg3MzhhYWQ1YywgMHg3NzRiYjBlYixcbiAgMHg0ZjA0MGQ1NiwgMHg0YmM1MTBlMSwgMHg0Njg2MzYzOCwgMHg0MjQ3MmI4ZiwgMHg1YzAwN2I4YSxcbiAgMHg1OGMxNjYzZCwgMHg1NTgyNDBlNCwgMHg1MTQzNWQ1MywgMHgyNTFkM2I5ZSwgMHgyMWRjMjYyOSxcbiAgMHgyYzlmMDBmMCwgMHgyODVlMWQ0NywgMHgzNjE5NGQ0MiwgMHgzMmQ4NTBmNSwgMHgzZjliNzYyYyxcbiAgMHgzYjVhNmI5YiwgMHgwMzE1ZDYyNiwgMHgwN2Q0Y2I5MSwgMHgwYTk3ZWQ0OCwgMHgwZTU2ZjBmZixcbiAgMHgxMDExYTBmYSwgMHgxNGQwYmQ0ZCwgMHgxOTkzOWI5NCwgMHgxZDUyODYyMywgMHhmMTJmNTYwZSxcbiAgMHhmNWVlNGJiOSwgMHhmOGFkNmQ2MCwgMHhmYzZjNzBkNywgMHhlMjJiMjBkMiwgMHhlNmVhM2Q2NSxcbiAgMHhlYmE5MWJiYywgMHhlZjY4MDYwYiwgMHhkNzI3YmJiNiwgMHhkM2U2YTYwMSwgMHhkZWE1ODBkOCxcbiAgMHhkYTY0OWQ2ZiwgMHhjNDIzY2Q2YSwgMHhjMGUyZDBkZCwgMHhjZGExZjYwNCwgMHhjOTYwZWJiMyxcbiAgMHhiZDNlOGQ3ZSwgMHhiOWZmOTBjOSwgMHhiNGJjYjYxMCwgMHhiMDdkYWJhNywgMHhhZTNhZmJhMixcbiAgMHhhYWZiZTYxNSwgMHhhN2I4YzBjYywgMHhhMzc5ZGQ3YiwgMHg5YjM2NjBjNiwgMHg5ZmY3N2Q3MSxcbiAgMHg5MmI0NWJhOCwgMHg5Njc1NDYxZiwgMHg4ODMyMTYxYSwgMHg4Y2YzMGJhZCwgMHg4MWIwMmQ3NCxcbiAgMHg4NTcxMzBjMywgMHg1ZDhhOTA5OSwgMHg1OTRiOGQyZSwgMHg1NDA4YWJmNywgMHg1MGM5YjY0MCxcbiAgMHg0ZThlZTY0NSwgMHg0YTRmZmJmMiwgMHg0NzBjZGQyYiwgMHg0M2NkYzA5YywgMHg3YjgyN2QyMSxcbiAgMHg3ZjQzNjA5NiwgMHg3MjAwNDY0ZiwgMHg3NmMxNWJmOCwgMHg2ODg2MGJmZCwgMHg2YzQ3MTY0YSxcbiAgMHg2MTA0MzA5MywgMHg2NWM1MmQyNCwgMHgxMTliNGJlOSwgMHgxNTVhNTY1ZSwgMHgxODE5NzA4NyxcbiAgMHgxY2Q4NmQzMCwgMHgwMjlmM2QzNSwgMHgwNjVlMjA4MiwgMHgwYjFkMDY1YiwgMHgwZmRjMWJlYyxcbiAgMHgzNzkzYTY1MSwgMHgzMzUyYmJlNiwgMHgzZTExOWQzZiwgMHgzYWQwODA4OCwgMHgyNDk3ZDA4ZCxcbiAgMHgyMDU2Y2QzYSwgMHgyZDE1ZWJlMywgMHgyOWQ0ZjY1NCwgMHhjNWE5MjY3OSwgMHhjMTY4M2JjZSxcbiAgMHhjYzJiMWQxNywgMHhjOGVhMDBhMCwgMHhkNmFkNTBhNSwgMHhkMjZjNGQxMiwgMHhkZjJmNmJjYixcbiAgMHhkYmVlNzY3YywgMHhlM2ExY2JjMSwgMHhlNzYwZDY3NiwgMHhlYTIzZjBhZiwgMHhlZWUyZWQxOCxcbiAgMHhmMGE1YmQxZCwgMHhmNDY0YTBhYSwgMHhmOTI3ODY3MywgMHhmZGU2OWJjNCwgMHg4OWI4ZmQwOSxcbiAgMHg4ZDc5ZTBiZSwgMHg4MDNhYzY2NywgMHg4NGZiZGJkMCwgMHg5YWJjOGJkNSwgMHg5ZTdkOTY2MixcbiAgMHg5MzNlYjBiYiwgMHg5N2ZmYWQwYywgMHhhZmIwMTBiMSwgMHhhYjcxMGQwNiwgMHhhNjMyMmJkZixcbiAgMHhhMmYzMzY2OCwgMHhiY2I0NjY2ZCwgMHhiODc1N2JkYSwgMHhiNTM2NWQwMywgMHhiMWY3NDBiNFxuXVxuXG4vLyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb246IGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9ja3N1bS5odG1sXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJ1Zikge1xuICBpZiAodHlwZW9mIGJ1ZiA9PT0gJ3N0cmluZycpIGJ1ZiA9IG5ldyBCdWZmZXIoYnVmKVxuXG4gIHZhciBjcmMgPSAwXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKSB7XG4gICAgY3JjID0gY3JjdGFiW2J1ZltpXSBeICgoY3JjID4+PiAyNCkgJiAweEZGKV0gXiAoY3JjIDw8IDgpXG4gIH1cblxuICAvKiBja3N1bS5jIGFsc28gY2FsY3VsYXRlcyB0aGUgY3JjLTMyIG9uIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUgKi9cbiAgdmFyIG51bV9ieXRlcyA9IGJ1Zi5sZW5ndGhcbiAgd2hpbGUgKG51bV9ieXRlcyA+IDApIHtcbiAgICBjcmMgPSBjcmN0YWJbKG51bV9ieXRlcyAmIDB4RkYpIF4gKChjcmMgPj4+IDI0KSAmIDB4RkYpXSBeIChjcmMgPDwgOClcbiAgICBudW1fYnl0ZXMgPj4+PSA4XG4gIH1cblxuICByZXR1cm4gYnVmZmVyaXplSW50KH5jcmMpXG59XG5cbm1vZHVsZS5leHBvcnRzLnN0cmVhbSA9IGZ1bmN0aW9uIChjYikge1xuICB2YXIgd3JpdGFibGUgPSBuZXcgc3RyZWFtLldyaXRhYmxlKClcbiAgdmFyIGNyYyA9IDBcbiAgdmFyIGxlbmd0aCA9IDBcbiAgd3JpdGFibGUuX3dyaXRlID0gZnVuY3Rpb24gKGJ1ZiwgZW5jLCBjYikge1xuICAgIGxlbmd0aCArPSBidWYubGVuZ3RoXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidWYubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNyYyA9IGNyY3RhYltidWZbaV0gXiAoKGNyYyA+Pj4gMjQpICYgMHhGRildIF4gKGNyYyA8PCA4KVxuICAgIH1cbiAgICBjYigpXG4gIH1cbiAgd3JpdGFibGUub24oJ2ZpbmlzaCcsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgbnVtX2J5dGVzID0gbGVuZ3RoXG4gICAgd2hpbGUgKG51bV9ieXRlcyA+IDApIHtcbiAgICAgIGNyYyA9IGNyY3RhYlsobnVtX2J5dGVzICYgMHhGRikgXiAoKGNyYyA+Pj4gMjQpICYgMHhGRildIF4gKGNyYyA8PCA4KVxuICAgICAgbnVtX2J5dGVzID4+Pj0gOFxuICAgIH1cbiAgICBjYihidWZmZXJpemVJbnQofmNyYyksIGxlbmd0aClcbiAgfSlcbiAgcmV0dXJuIHdyaXRhYmxlXG59XG5cbmZ1bmN0aW9uIGJ1ZmZlcml6ZUludCAobnVtKSB7XG4gIHZhciB0bXAgPSBCdWZmZXIoNClcbiAgdG1wLndyaXRlSW50MzJCRShudW0sIDApXG4gIHJldHVybiB0bXBcbn1cbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5jb252ZXJ0TG9nTGV2ZWwgPSBleHBvcnRzLnRyYWNlID0gZXhwb3J0cy5mYXRhbCA9IGV4cG9ydHMud2FybiA9IGV4cG9ydHMuZGVidWcgPSBleHBvcnRzLmVycm9yID0gZXhwb3J0cy5pbmZvID0gZXhwb3J0cy5sb2dBZGRpdGlvbmFsS2V5cyA9IHZvaWQgMDtcbmNvbnN0IGxvZ2dlcl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJAY3VtdWx1cy9sb2dnZXJcIikpO1xuY29uc3QgaXNOdW1iZXJfMSA9IF9faW1wb3J0RGVmYXVsdChyZXF1aXJlKFwibG9kYXNoL2lzTnVtYmVyXCIpKTtcbmNvbnN0IGlzU3RyaW5nXzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImxvZGFzaC9pc1N0cmluZ1wiKSk7XG5mdW5jdGlvbiBsb2dnZXIoKSB7XG4gICAgcmV0dXJuIG5ldyBsb2dnZXJfMS5kZWZhdWx0KHtcbiAgICAgICAgYXN5bmNPcGVyYXRpb25JZDogcHJvY2Vzcy5lbnYuQVNZTkNPUEVSQVRJT05JRCxcbiAgICAgICAgZXhlY3V0aW9uczogcHJvY2Vzcy5lbnYuRVhFQ1VUSU9OUyxcbiAgICAgICAgZ3JhbnVsZXM6IHByb2Nlc3MuZW52LkdSQU5VTEVTLFxuICAgICAgICBwYXJlbnRBcm46IHByb2Nlc3MuZW52LlBBUkVOVEFSTixcbiAgICAgICAgc2VuZGVyOiBwcm9jZXNzLmVudi5TRU5ERVIsXG4gICAgICAgIHN0YWNrTmFtZTogcHJvY2Vzcy5lbnYuU1RBQ0tOQU1FLFxuICAgICAgICB2ZXJzaW9uOiBwcm9jZXNzLmVudi5UQVNLVkVSU0lPTixcbiAgICB9KTtcbn1cbi8qKlxuICogQ29uc3RydWN0cyBKU09OIHRvIGxvZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRpdGlvbmFsS2V5cyAtIEFueSBhZGRpdGlvbmFsIGtleSB2YWx1ZSBwYWlycyB0aGUgdXNlciBjaG9vc2VzIHRvIGxvZ1xuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MgLSBNZXNzYWdlIHRvIGxvZyBhbmQgYW55IG90aGVyIGluZm9ybWF0aW9uXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfSAtIGxvZyBpcyBwcmludGVkIHRvIHN0ZG91dCwgbm90aGluZyBpcyByZXR1cm5lZFxuICovXG5mdW5jdGlvbiBsb2dBZGRpdGlvbmFsS2V5cyhhZGRpdGlvbmFsS2V5cywgLi4uYXJncykge1xuICAgIGxvZ2dlcigpLmluZm9XaXRoQWRkaXRpb25hbEtleXMoYWRkaXRpb25hbEtleXMsIC4uLmFyZ3MpO1xufVxuZXhwb3J0cy5sb2dBZGRpdGlvbmFsS2V5cyA9IGxvZ0FkZGl0aW9uYWxLZXlzO1xuLyoqXG4gKiBMb2dzIHRoZSBtZXNzYWdlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MgLSBJbmNsdWRlcyBtZXNzYWdlIGFuZCBhbnkgb3RoZXIgaW5mb3JtYXRpb24gdG8gbG9nXG4gKi9cbmZ1bmN0aW9uIGluZm8oLi4uYXJncykge1xuICAgIGxvZ2dlcigpLmluZm8oLi4uYXJncyk7XG59XG5leHBvcnRzLmluZm8gPSBpbmZvO1xuLyoqXG4gKiBMb2dzIHRoZSBlcnJvclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhcmdzIC0gSW5jbHVkZXMgZXJyb3IgYW5kIGFueSBvdGhlciBpbmZvcm1hdGlvbiB0byBsb2dcbiAqL1xuZnVuY3Rpb24gZXJyb3IoLi4uYXJncykge1xuICAgIGxvZ2dlcigpLmVycm9yKC4uLmFyZ3MpO1xufVxuZXhwb3J0cy5lcnJvciA9IGVycm9yO1xuLyoqXG4gKiBMb2dzIHRoZSBkZWJ1Z2dlciBtZXNzc2FnZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIEluY2x1ZGVzIGRlYnVnZ2VyIG1lc3NhZ2UgYW5kIGFueSBvdGhlciBpbmZvcm1hdGlvbiB0byBsb2dcbiAqL1xuZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuICAgIGxvZ2dlcigpLmRlYnVnKC4uLmFyZ3MpO1xufVxuZXhwb3J0cy5kZWJ1ZyA9IGRlYnVnO1xuLyoqXG4gKiBMb2dzIHRoZSBXYXJuaW5nIG1lc3NzYWdlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBJbmNsdWRlcyBXYXJuIG1lc3NhZ2UgYW5kIGFueSBvdGhlciBpbmZvcm1hdGlvbiB0byBsb2dcbiAqL1xuZnVuY3Rpb24gd2FybiguLi5hcmdzKSB7XG4gICAgbG9nZ2VyKCkud2FybiguLi5hcmdzKTtcbn1cbmV4cG9ydHMud2FybiA9IHdhcm47XG4vKipcbiAqIExvZ3MgdGhlIEZhdGFsIG1lc3NzYWdlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGFyZ3MgLSBJbmNsdWRlcyBGYXRhbCBtZXNzYWdlIGFuZCBhbnkgb3RoZXIgaW5mb3JtYXRpb24gdG8gbG9nXG4gKi9cbmZ1bmN0aW9uIGZhdGFsKC4uLmFyZ3MpIHtcbiAgICBsb2dnZXIoKS5mYXRhbCguLi5hcmdzKTtcbn1cbmV4cG9ydHMuZmF0YWwgPSBmYXRhbDtcbi8qKlxuICogTG9ncyB0aGUgVHJhY2UgbWVzc3NhZ2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIEluY2x1ZGVzIFRyYWNlIG1lc3NhZ2UgYW5kIGFueSBvdGhlciBpbmZvcm1hdGlvbiB0byBsb2dcbiAqL1xuZnVuY3Rpb24gdHJhY2UoLi4uYXJncykge1xuICAgIGxvZ2dlcigpLnRyYWNlKC4uLmFyZ3MpO1xufVxuZXhwb3J0cy50cmFjZSA9IHRyYWNlO1xuLyoqXG4gKiBjb252ZXJ0IGxvZyBsZXZlbCBmcm9tIHN0cmluZyB0byBudW1iZXIgb3IgbnVtYmVyIHRvIHN0cmluZ1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nL251bWJlcn0gbGV2ZWwgLSBsb2cgbGV2ZWwgaW4gc3RyaW5nIG9yIG51bWJlclxuICogQHJldHVybnMge251bWJlci9zdHJpbmd9IC0gbGV2ZWwgaW4gbnVtYmVyIG9yIHN0cmluZ1xuICovXG4vLyBAdHMtaWdub3JlXG5mdW5jdGlvbiBjb252ZXJ0TG9nTGV2ZWwobGV2ZWwpIHtcbiAgICB3YXJuKCdAY3VtdWx1cy9jb21tb24vbG9nLmNvbnZlcnRMb2dMZXZlbCgpIGlzIGRlcHJlY2F0ZWQgYWZ0ZXIgdmVyc2lvbiAxLjIzLjIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLicpO1xuICAgIGNvbnN0IG1hcHBpbmcgPSB7XG4gICAgICAgIGZhdGFsOiA2MCxcbiAgICAgICAgZXJyb3I6IDUwLFxuICAgICAgICB3YXJuOiA0MCxcbiAgICAgICAgaW5mbzogMzAsXG4gICAgICAgIGRlYnVnOiAyMCxcbiAgICAgICAgdHJhY2U6IDEwLFxuICAgIH07XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChpc1N0cmluZ18xLmRlZmF1bHQobGV2ZWwpKVxuICAgICAgICByZXR1cm4gbWFwcGluZ1tsZXZlbF07XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChpc051bWJlcl8xLmRlZmF1bHQobGV2ZWwpKVxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobWFwcGluZykuZmluZCgoa2V5KSA9PiBtYXBwaW5nW2tleV0gPT09IGxldmVsKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufVxuZXhwb3J0cy5jb252ZXJ0TG9nTGV2ZWwgPSBjb252ZXJ0TG9nTGV2ZWw7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sb2cuanMubWFwIiwidmFyIHJvb3QgPSByZXF1aXJlKCcuL19yb290Jyk7XG5cbi8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqL1xudmFyIFN5bWJvbCA9IHJvb3QuU3ltYm9sO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFN5bWJvbDtcbiIsInZhciBTeW1ib2wgPSByZXF1aXJlKCcuL19TeW1ib2wnKSxcbiAgICBnZXRSYXdUYWcgPSByZXF1aXJlKCcuL19nZXRSYXdUYWcnKSxcbiAgICBvYmplY3RUb1N0cmluZyA9IHJlcXVpcmUoJy4vX29iamVjdFRvU3RyaW5nJyk7XG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nLFxuICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuXG4gKi9cbmZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7XG4gIH1cbiAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKVxuICAgID8gZ2V0UmF3VGFnKHZhbHVlKVxuICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VHZXRUYWc7XG4iLCIvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqL1xudmFyIGZyZWVHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsID09ICdvYmplY3QnICYmIGdsb2JhbCAmJiBnbG9iYWwuT2JqZWN0ID09PSBPYmplY3QgJiYgZ2xvYmFsO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZyZWVHbG9iYWw7XG4iLCJ2YXIgU3ltYm9sID0gcmVxdWlyZSgnLi9fU3ltYm9sJyk7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqL1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZVxuICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpXG4gKiBvZiB2YWx1ZXMuXG4gKi9cbnZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nO1xuXG4vKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi9cbnZhciBzeW1Ub1N0cmluZ1RhZyA9IFN5bWJvbCA/IFN5bWJvbC50b1N0cmluZ1RhZyA6IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLFxuICAgICAgdGFnID0gdmFsdWVbc3ltVG9TdHJpbmdUYWddO1xuXG4gIHRyeSB7XG4gICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkO1xuICAgIHZhciB1bm1hc2tlZCA9IHRydWU7XG4gIH0gY2F0Y2ggKGUpIHt9XG5cbiAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICBpZiAodW5tYXNrZWQpIHtcbiAgICBpZiAoaXNPd24pIHtcbiAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZztcbiAgICB9IGVsc2Uge1xuICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBnZXRSYXdUYWc7XG4iLCIvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBvYmplY3RUb1N0cmluZztcbiIsInZhciBmcmVlR2xvYmFsID0gcmVxdWlyZSgnLi9fZnJlZUdsb2JhbCcpO1xuXG4vKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHNlbGZgLiAqL1xudmFyIGZyZWVTZWxmID0gdHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZiAmJiBzZWxmLk9iamVjdCA9PT0gT2JqZWN0ICYmIHNlbGY7XG5cbi8qKiBVc2VkIGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0LiAqL1xudmFyIHJvb3QgPSBmcmVlR2xvYmFsIHx8IGZyZWVTZWxmIHx8IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gcm9vdDtcbiIsIi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhbiBgQXJyYXlgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheSwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzQXJyYXkoWzEsIDIsIDNdKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzQXJyYXkoZG9jdW1lbnQuYm9keS5jaGlsZHJlbik7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheSgnYWJjJyk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNBcnJheShfLm5vb3ApO1xuICogLy8gPT4gZmFsc2VcbiAqL1xudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGlzQXJyYXk7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc09iamVjdExpa2UgPSByZXF1aXJlKCcuL2lzT2JqZWN0TGlrZScpO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgbnVtYmVyVGFnID0gJ1tvYmplY3QgTnVtYmVyXSc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuXG4gKlxuICogKipOb3RlOioqIFRvIGV4Y2x1ZGUgYEluZmluaXR5YCwgYC1JbmZpbml0eWAsIGFuZCBgTmFOYCwgd2hpY2ggYXJlXG4gKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG51bWJlciwgZWxzZSBgZmFsc2VgLlxuICogQGV4YW1wbGVcbiAqXG4gKiBfLmlzTnVtYmVyKDMpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNOdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcihJbmZpbml0eSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc051bWJlcignMycpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNOdW1iZXIodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyB8fFxuICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNOdW1iZXI7XG4iLCIvKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLiBBIHZhbHVlIGlzIG9iamVjdC1saWtlIGlmIGl0J3Mgbm90IGBudWxsYFxuICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiBcIm9iamVjdFwiLlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc09iamVjdExpa2U7XG4iLCJ2YXIgYmFzZUdldFRhZyA9IHJlcXVpcmUoJy4vX2Jhc2VHZXRUYWcnKSxcbiAgICBpc0FycmF5ID0gcmVxdWlyZSgnLi9pc0FycmF5JyksXG4gICAgaXNPYmplY3RMaWtlID0gcmVxdWlyZSgnLi9pc09iamVjdExpa2UnKTtcblxuLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqL1xudmFyIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nO1xuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBzaW5jZSAwLjEuMFxuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTdHJpbmcoJ2FiYycpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNTdHJpbmcoMSk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8XG4gICAgKCFpc0FycmF5KHZhbHVlKSAmJiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN0cmluZ1RhZyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gaXNTdHJpbmc7XG4iLCIvKipcbiAqIGxvZGFzaCAzLjEuMSAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IDIwMTItMjAxNiBUaGUgRG9qbyBGb3VuZGF0aW9uIDxodHRwOi8vZG9qb2ZvdW5kYXRpb24ub3JnLz5cbiAqIEJhc2VkIG9uIFVuZGVyc2NvcmUuanMgMS44LjMgPGh0dHA6Ly91bmRlcnNjb3JlanMub3JnL0xJQ0VOU0U+XG4gKiBDb3B5cmlnaHQgMjAwOS0yMDE2IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKiBBdmFpbGFibGUgdW5kZXIgTUlUIGxpY2Vuc2UgPGh0dHBzOi8vbG9kYXNoLmNvbS9saWNlbnNlPlxuICovXG5cbi8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi9cbnZhciBlcnJvclRhZyA9ICdbb2JqZWN0IEVycm9yXSc7XG5cbi8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi9cbnZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8qKlxuICogVXNlZCB0byByZXNvbHZlIHRoZSBbYHRvU3RyaW5nVGFnYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNi4wLyNzZWMtb2JqZWN0LnByb3RvdHlwZS50b3N0cmluZylcbiAqIG9mIHZhbHVlcy5cbiAqL1xudmFyIG9iamVjdFRvU3RyaW5nID0gb2JqZWN0UHJvdG8udG9TdHJpbmc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gYEVycm9yYCwgYEV2YWxFcnJvcmAsIGBSYW5nZUVycm9yYCwgYFJlZmVyZW5jZUVycm9yYCxcbiAqIGBTeW50YXhFcnJvcmAsIGBUeXBlRXJyb3JgLCBvciBgVVJJRXJyb3JgIG9iamVjdC5cbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gZXJyb3Igb2JqZWN0LCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNFcnJvcihuZXcgRXJyb3IpO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNFcnJvcihFcnJvcik7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Vycm9yKHZhbHVlKSB7XG4gIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpID09IGVycm9yVGFnKSB8fFxuICAgICh0eXBlb2YgdmFsdWUubWVzc2FnZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsdWUubmFtZSA9PSAnc3RyaW5nJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKHt9KTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7XG4gIHJldHVybiAhIXZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0Jztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBpc0Vycm9yO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjdW11bHVzTWVzc2FnZUFkYXB0ZXIgPSByZXF1aXJlKCdAY3VtdWx1cy9jdW11bHVzLW1lc3NhZ2UtYWRhcHRlci1qcycpO1xuY29uc3Qge1xuICBkZWxldGVTM09iamVjdCxcbiAgczNPYmplY3RFeGlzdHMsXG4gIHMzUHV0T2JqZWN0LFxufSA9IHJlcXVpcmUoJ0BjdW11bHVzL2F3cy1jbGllbnQvUzMnKTtcbmNvbnN0IGxvZyA9IHJlcXVpcmUoJ0BjdW11bHVzL2NvbW1vbi9sb2cnKTtcblxuLyoqXG4gKiBUaHJvdyBhbiBlcnJvciBpZiBoZWxsbyB3b3JsZCBpcyBjb25maWd1cmVkIHRvIHRocm93IGFuIGVycm9yIGZvclxuICogdGVzdGluZy9leGFtcGxlIHB1cnBvc2VzLiBTZXQgdGhlIHBhc3Mgb24gcmV0cnkgdmFsdWUgdG8gc2ltdWxhdGVcbiAqIGEgdGFzayBwYXNzaW5nIG9uIGEgcmV0cnkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IC0gaW5wdXQgZnJvbSB0aGUgbWVzc2FnZSBhZGFwdGVyXG4gKiBAcmV0dXJucyB7dW5kZWZpbmVkfSBub25lXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRocm93RXJyb3JJZkNvbmZpZ3VyZWQoZXZlbnQpIHtcbiAgY29uc3QgZXhlY3V0aW9uID0gZXZlbnQuY29uZmlnLmV4ZWN1dGlvbjtcbiAgY29uc3QgcmV0cnlGaWxlbmFtZSA9IGAke2V4ZWN1dGlvbn1fcmV0cnkudHh0YDtcbiAgY29uc3QgYnVja2V0ID0gZXZlbnQuY29uZmlnLmJ1Y2tldDtcblxuICBsZXQgaXNSZXRyeSA9IGZhbHNlO1xuXG4gIGlmIChldmVudC5jb25maWcucGFzc09uUmV0cnkpIHtcbiAgICBpc1JldHJ5ID0gYXdhaXQgczNPYmplY3RFeGlzdHMoe1xuICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICBLZXk6IHJldHJ5RmlsZW5hbWUsXG4gICAgfSk7XG4gIH1cblxuICBpZiAoZXZlbnQuY29uZmlnLnBhc3NPblJldHJ5ICYmIGlzUmV0cnkpIHtcbiAgICBsb2cuZGVidWcoJ0RldGVjdGVkIHJldHJ5Jyk7XG5cbiAgICAvLyBEZWxldGUgZmlsZVxuICAgIGF3YWl0IGRlbGV0ZVMzT2JqZWN0KGJ1Y2tldCwgcmV0cnlGaWxlbmFtZSk7XG4gIH0gZWxzZSBpZiAoZXZlbnQuY29uZmlnLmZhaWwpIHtcbiAgICBpZiAoZXZlbnQuY29uZmlnLnBhc3NPblJldHJ5KSB7XG4gICAgICBhd2FpdCBzM1B1dE9iamVjdCh7XG4gICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICBLZXk6IHJldHJ5RmlsZW5hbWUsXG4gICAgICAgIEJvZHk6ICcnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKCdTdGVwIGNvbmZpZ3VyZWQgdG8gZm9yY2UgZmFpbCcpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJuIHNhbXBsZSAnaGVsbG8gd29ybGQnIEpTT05cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgLSBpbnB1dCBmcm9tIHRoZSBtZXNzYWdlIGFkYXB0ZXJcbiAqIEByZXR1cm5zIHtPYmplY3R9IHNhbXBsZSBKU09OIG9iamVjdFxuICovXG5hc3luYyBmdW5jdGlvbiBoZWxsb1dvcmxkKGV2ZW50KSB7XG4gIGF3YWl0IHRocm93RXJyb3JJZkNvbmZpZ3VyZWQoZXZlbnQpO1xuXG4gIHJldHVybiB7XG4gICAgaGVsbG86ICdIZWxsbyBXb3JsZCcsXG4gIH07XG59XG4vKipcbiAqIExhbWJkYSBoYW5kbGVyXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGV2ZW50ICAgICAgLSBhIEN1bXVsdXMgTWVzc2FnZVxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgICAgLSBhbiBBV1MgTGFtYmRhIGNvbnRleHRcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IC0gc2FtcGxlIEpTT04gb2JqZWN0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpIHtcbiAgcmV0dXJuIGF3YWl0IGN1bXVsdXNNZXNzYWdlQWRhcHRlci5ydW5DdW11bHVzVGFzayhoZWxsb1dvcmxkLCBldmVudCwgY29udGV4dCk7XG59XG5cbmV4cG9ydHMuaGFuZGxlciA9IGhhbmRsZXI7XG5leHBvcnRzLmhlbGxvV29ybGQgPSBoZWxsb1dvcmxkOyAvLyBleHBvcnRlZCB0byBzdXBwb3J0IHRlc3RpbmdcbiIsIlwidXNlIHN0cmljdFwiO1xudmFyIF9fY3JlYXRlQmluZGluZyA9ICh0aGlzICYmIHRoaXMuX19jcmVhdGVCaW5kaW5nKSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH0pO1xufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIG9bazJdID0gbVtrXTtcbn0pKTtcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9fc2V0TW9kdWxlRGVmYXVsdCkgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcbn0pIDogZnVuY3Rpb24obywgdikge1xuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcbn0pO1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIF9fY3JlYXRlQmluZGluZyhyZXN1bHQsIG1vZCwgayk7XG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbnZhciBfX2ltcG9ydERlZmF1bHQgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0RGVmYXVsdCkgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIHJldHVybiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSA/IG1vZCA6IHsgXCJkZWZhdWx0XCI6IG1vZCB9O1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucnVuQ3VtdWx1c1Rhc2sgPSBleHBvcnRzLmludm9rZUN1bXVsdXNNZXNzYWdlQWRhcHRlciA9IGV4cG9ydHMuZ2VuZXJhdGVDTUFTcGF3bkFyZ3VtZW50cyA9IHZvaWQgMDtcbmNvbnN0IGxvb2twYXRoXzEgPSByZXF1aXJlKFwibG9va3BhdGhcIik7XG5jb25zdCByZWFkbGluZSA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwicmVhZGxpbmVcIikpO1xuY29uc3QgY2hpbGRfcHJvY2Vzc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJjaGlsZF9wcm9jZXNzXCIpKTtcbmNvbnN0IG1lc3NhZ2VfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VcIik7XG5jb25zdCB0eXBlR3VhcmRzXzEgPSByZXF1aXJlKFwiLi90eXBlR3VhcmRzXCIpO1xuLyoqXG4gKiBBbiBlcnJvciB0byBiZSB0aHJvd24gd2hlbiBpbnZvY2F0aW9uIG9mIHRoZSBjdW11bHVzLW1lc3NhZ2UtYWRhcHRlciBmYWlsc1xuICovXG5jbGFzcyBDdW11bHVzTWVzc2FnZUFkYXB0ZXJFeGVjdXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1qc2RvY1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdDdW11bHVzTWVzc2FnZUFkYXB0ZXJFeGVjdXRpb25FcnJvcic7XG4gICAgfVxufVxuLyoqXG4gKiBHZW5lcmF0ZXMgQ01BIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIHRoZSBhY3Rpb24gdG8gYmUgcGVyZm9ybWVkIGJ5IHRoZSBtZXNzYWdlLWFkYXB0ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlLjxBcnJheT59IC0gUmV0dXJucyBhcmd1bWVudHMgdXNlZCB0byBzcGF3biB0aGUgQ01BXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ01BU3Bhd25Bcmd1bWVudHMoY29tbWFuZCkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBhZGFwdGVyRGlyID0gKF9hID0gcHJvY2Vzcy5lbnYuQ1VNVUxVU19NRVNTQUdFX0FEQVBURVJfRElSKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAnLi9jdW11bHVzLW1lc3NhZ2UtYWRhcHRlcic7XG4gICAgY29uc3Qgc3lzdGVtUHl0aG9uID0gYXdhaXQgbG9va3BhdGhfMS5sb29rcGF0aCgncHl0aG9uJyk7XG4gICAgaWYgKHN5c3RlbVB5dGhvbiAmJiBwcm9jZXNzLmVudi5VU0VfQ01BX0JJTkFSWSAhPT0gJ3RydWUnKSB7XG4gICAgICAgIHJldHVybiBbc3lzdGVtUHl0aG9uLCBbYCR7YWRhcHRlckRpcn1gLCBjb21tYW5kXV07XG4gICAgfVxuICAgIC8vIElmIHRoZXJlIGlzIG5vIHN5c3RlbSBweXRob24sIGF0dGVtcHQgdXNlIG9mIHByZS1wYWNrYWdlZCBDTUEgYmluYXJ5XG4gICAgcmV0dXJuIFtgJHthZGFwdGVyRGlyfS9jbWFfYmluL2NtYWAsIFtjb21tYW5kXV07XG59XG5leHBvcnRzLmdlbmVyYXRlQ01BU3Bhd25Bcmd1bWVudHMgPSBnZW5lcmF0ZUNNQVNwYXduQXJndW1lbnRzO1xuLyoqXG4gKiBJbnZva2UgdGhlIGN1bXVsdXMtbWVzc2FnZS1hZGFwdGVyXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gY3VtdWx1c01lc3NhZ2VBZGFwdGVyT2JqZWN0IC0gUmV0dXJucyBhbiBPYmplY3Qgd2l0aCBhXG4gKiBjaGlsZHByb2Nlc3MgYW5kIGEgc3RkZXJyb3IgYnVmZmVyXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBjdW11bHVzTWVzc2FnZUFkYXB0ZXJPYmplY3QuY21hUHJvY2VzcyAtIEEgQ01BIGNoaWxkUHJvY2VzcyBPYmplY3RcbiAqIEByZXR1cm5zIHtPYmplY3R9IGN1bXVsdXNNZXNzYWdlQWRhcHRlck9iamVjdC5lcnJvck9iaiAtICBBIE9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0eVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGRlcnJCdWZmZXInIHRvIG1ha2UgdGhlIGVuY2Fwc3VsYXRlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIGV2ZW50IHN0b3JhZ2Ugb3V0c2lkZSB0aGlzIG1ldGhvZFxuICovXG5hc3luYyBmdW5jdGlvbiBpbnZva2VDdW11bHVzTWVzc2FnZUFkYXB0ZXIoKSB7XG4gICAgY29uc3Qgc3Bhd25Bcmd1bWVudHMgPSBhd2FpdCBnZW5lcmF0ZUNNQVNwYXduQXJndW1lbnRzKCdzdHJlYW0nKTtcbiAgICBjb25zdCBlcnJvck9iaiA9IHsgc3RkZXJyQnVmZmVyOiAnJyB9O1xuICAgIGNvbnN0IHN0YXR1c09iaiA9IHsgY2xvc2U6IGZhbHNlIH07XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY21hUHJvY2VzcyA9IGNoaWxkX3Byb2Nlc3NfMS5kZWZhdWx0LnNwYXduKC4uLnNwYXduQXJndW1lbnRzKTtcbiAgICAgICAgY21hUHJvY2Vzcy5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ01BIChvbiBlcnJvcikgU3RkRXJyOiBcXG4gJHtlcnJvck9iai5zdGRlcnJCdWZmZXJ9YCk7XG4gICAgICAgIH0pO1xuICAgICAgICBjbWFQcm9jZXNzLnN0ZGluLnNldERlZmF1bHRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICBjbWFQcm9jZXNzLnN0ZG91dC5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICBjbWFQcm9jZXNzLnN0ZGVyci5zZXRFbmNvZGluZygndXRmOCcpO1xuICAgICAgICBjbWFQcm9jZXNzLm9uKCdjbG9zZScsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYENNQSBFeGl0IENvZGU6ICR7Y29kZX1gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ01BIEV4aXQgU2lnbmFsOiAke3NpZ25hbH1gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ01BIFByb2Nlc3MgS2lsbDogJHtjbWFQcm9jZXNzLmtpbGxlZH1gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgQ01BIFN0ZEVycjogXFxuICR7ZXJyb3JPYmouc3RkZXJyQnVmZmVyfVxcbmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3RhdHVzT2JqLmNsb3NlID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNtYVByb2Nlc3Muc3RkZXJyLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGVycm9yT2JqLnN0ZGVyckJ1ZmZlciArPSBTdHJpbmcoZGF0YSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBjbWFQcm9jZXNzLCBlcnJvck9iaiwgc3RhdHVzT2JqIH07XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtc2cgPSBgQ01BIHByb2Nlc3MgZmFpbGVkICgke2Vycm9yLnNob3J0TWVzc2FnZX0pXFxuXG4gICAgICAgICAgICAgICAgIFRyYWNlOiAke2Vycm9yLm1lc3NhZ2V9fVxcblxcblxcblxuICAgICAgICAgICAgICAgICBTVERFUlI6ICR7ZXJyb3JPYmouc3RkZXJyQnVmZmVyfWA7XG4gICAgICAgIHRocm93IG5ldyBDdW11bHVzTWVzc2FnZUFkYXB0ZXJFeGVjdXRpb25FcnJvcihtc2cpO1xuICAgIH1cbn1cbmV4cG9ydHMuaW52b2tlQ3VtdWx1c01lc3NhZ2VBZGFwdGVyID0gaW52b2tlQ3VtdWx1c01lc3NhZ2VBZGFwdGVyO1xuLyoqXG4gKiBDb25kaXRpb25hbGx5IHNldCBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHRhcmdldGVkIHZhbHVlIGlzIG5vdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFZBUk5BTUUgLSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lXG4gKiBAcGFyYW0ge3N0cmluZyB8IHVuZGVmaW5lZH0gdmFsdWUgLSB2YWx1ZSB0byBzZXQgdmFyaWFibGUgdG8gaWYgbm90IHVuZGVmaW5lZFxuICogQHJldHVybnMge3VuZGVmaW5lZH0gLSBub25lXG4gKi9cbmZ1bmN0aW9uIHNhZmVTZXRFbnYoVkFSTkFNRSwgdmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAgICAgcHJvY2Vzcy5lbnZbVkFSTkFNRV0gPSB2YWx1ZTtcbn1cbi8qKlxuICogU2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSB1c2VkIGluIGxvZ2dpbmcgYmFzZWQgb24gdGhlIEN1bXVsdXMgZXZlbnRcbiAqIG1lc3NhZ2UgYW5kIGNvbnRleHQgdGhhdCBydW5DdW11bHVzVGFzayB3YXMgaW52b2tlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY3VtdWx1c01lc3NhZ2UgLSBjdW11bHVzIGV2ZW50IG1lc3NhZ2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IC0gbGFtYmRhIGNvbnRleHQgb2JqZWN0LlxuICogQHJldHVybnMge3VuZGVmaW5lZH0gLSBubyByZXR1cm4gdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIHNldEN1bXVsdXNFbnZpcm9ubWVudChjdW11bHVzTWVzc2FnZSwgY29udGV4dCkge1xuICAgIHNhZmVTZXRFbnYoJ0VYRUNVVElPTlMnLCBtZXNzYWdlXzEuZ2V0RXhlY3V0aW9ucyhjdW11bHVzTWVzc2FnZSkpO1xuICAgIHNhZmVTZXRFbnYoJ1NFTkRFUicsIGNvbnRleHQuZnVuY3Rpb25OYW1lKTtcbiAgICBzYWZlU2V0RW52KCdUQVNLVkVSU0lPTicsIGNvbnRleHQuZnVuY3Rpb25WZXJzaW9uKTtcbiAgICBzYWZlU2V0RW52KCdTVEFDS05BTUUnLCBtZXNzYWdlXzEuZ2V0U3RhY2tOYW1lKGN1bXVsdXNNZXNzYWdlKSk7XG4gICAgc2FmZVNldEVudignR1JBTlVMRVMnLCBKU09OLnN0cmluZ2lmeShtZXNzYWdlXzEuZ2V0TWVzc2FnZUdyYW51bGVzKGN1bXVsdXNNZXNzYWdlKSkpO1xuICAgIHNhZmVTZXRFbnYoJ1BBUkVOVEFSTicsIG1lc3NhZ2VfMS5nZXRQYXJlbnRBcm4oY3VtdWx1c01lc3NhZ2UpKTtcbiAgICBzYWZlU2V0RW52KCdBU1lOQ09QRVJBVElPTklEJywgbWVzc2FnZV8xLmdldEFzeW5jT3BlcmF0aW9uSWQoY3VtdWx1c01lc3NhZ2UpKTtcbn1cbi8qKlxuICogUmVhZCB0aGUgQ01BIG91dHB1dC9yZXN1bHRzIGFmdGVyIHNlbmRpbmcgYSBjb21tYW5kXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlYWRMaW5lIC0gY29uZmlndXJlZCByZWFkbGluZSBvYmplY3RcbiAqIEBwYXJhbSB7Kn0gZXJyb3JPYmogLSBjbWEgZXJyb3JPYmplY3Qgd2l0aCBzdGRlcnIgc3RyaW5nIGJ1ZmZlclxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gLSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBwYXJzZWQgSlNPTiBvYmplY3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgQ01BIG91dHB1dFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDbWFPdXRwdXQocmVhZExpbmUsIGVycm9yT2JqKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IGJ1ZmZlciA9ICcnO1xuICAgICAgICByZWFkTGluZS5yZXN1bWUoKTtcbiAgICAgICAgcmVhZExpbmUub24oJ2xpbmUnLCAoaW5wdXQpID0+IHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5lbmRzV2l0aCgnPEVPQz4nKSkge1xuICAgICAgICAgICAgICAgIHJlYWRMaW5lLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgcmVhZExpbmUucmVtb3ZlQWxsTGlzdGVuZXJzKCdsaW5lJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSW5wdXQgPSBpbnB1dC5yZXBsYWNlKCc8RU9DPicsICcnKTtcbiAgICAgICAgICAgICAgICBidWZmZXIgKz0gZW5kSW5wdXQ7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShKU09OLnBhcnNlKGJ1ZmZlcikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyICs9IGlucHV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmVhZExpbmUub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBDdW11bHVzTWVzc2FnZUFkYXB0ZXJFeGVjdXRpb25FcnJvcihlcnJvck9iai5zdGRlcnJCdWZmZXIpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4vKipcbiAqIEJ1aWxkIGEgbmVzdGVkIEN1bXVsdXMgZXZlbnQgYW5kIHBhc3MgaXQgdG8gYSB0YXNrcydzIGJ1c2luZXNzIGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gVGFza0Z1bmN0aW9uIC0gdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgdGhlIGJ1c2luZXNzIGxvZ2ljIG9mIHRoZSB0YXNrXG4gKiBAcGFyYW0ge09iamVjdH0gY3VtdWx1c01lc3NhZ2UgLSBlaXRoZXIgYSBmdWxsIEN1bXVsdXMgTWVzc2FnZSBvciBhIEN1bXVsdXMgUmVtb3RlIE1lc3NhZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgYSB3b3JrZmxvdyBjb25maWd1cmVkIENNQU1lc3NhZ2VcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgYSBDdW11bHVzIE1lc3NhZ2UgaW4gaXQncyBldmVudFxuICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgLSBhbiBBV1MgTGFtYmRhIGNvbnRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzY2hlbWFzIC0gTG9jYXRpb24gb2Ygc2NoZW1hIGZpbGVzLCBkZWZhdWx0cyB0byBudWxsLlxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gLSBUaGUgcmVzcG9uc2UgZnJvbSB0aGUgY2FsbCB0byBjcmVhdGVOZXh0RXZlbnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQ3VtdWx1c1Rhc2soVGFza0Z1bmN0aW9uLCBjdW11bHVzTWVzc2FnZSwgY29udGV4dCwgc2NoZW1hcyA9IG51bGwpIHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgeyBjbWFQcm9jZXNzLCBlcnJvck9iaiwgc3RhdHVzT2JqIH0gPSBhd2FpdCBpbnZva2VDdW11bHVzTWVzc2FnZUFkYXB0ZXIoKTtcbiAgICBjb25zdCBjbWFTdGRpbiA9IGNtYVByb2Nlc3Muc3RkaW47XG4gICAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgICAgICBpbnB1dDogY21hUHJvY2Vzcy5zdGRvdXRcbiAgICB9KTtcbiAgICBsZXQgbGFtYmRhVGltZXI7XG4gICAgbGV0IHJ1bm5pbmdUYXNrID0gZmFsc2U7XG4gICAgaWYgKHR5cGVvZiBjb250ZXh0LmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBsYW1iZGFUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0xhbWJkYSB0aW1pbmcgb3V0LCB3cml0aW5nIENNQSBzdGRlcnIgdG8gY2xvdWR3YXRjaCBsb2dzJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ01BIChvbiBzdGFydCB0YXNrIHRpbWVvdXQpIFN0ZEVycjogXFxuICR7ZXJyb3JPYmouc3RkZXJyQnVmZmVyfWApO1xuICAgICAgICB9LCBjb250ZXh0LmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcygpIC0gNSAqIDEwMCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZygnSW5mbzogTm8gQ01BIHRpbWVvdXQgYnVmZmVyIGR1bXAgc2V0LCBhcyBsYW1iZGEgaXMgbm90IHJ1bm5pbmcgYXMgYSBsYW1iZGEnKTtcbiAgICAgICAgbGFtYmRhVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgfSwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGNtYVN0ZGluLndyaXRlKCdsb2FkQW5kVXBkYXRlUmVtb3RlRXZlbnRcXG4nKTtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6IGN1bXVsdXNNZXNzYWdlLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHNjaGVtYXNcbiAgICAgICAgfSkpO1xuICAgICAgICBjbWFTdGRpbi53cml0ZSgnXFxuPEVPQz5cXG4nKTtcbiAgICAgICAgY29uc3QgbG9hZEFuZFVwZGF0ZVJlbW90ZUV2ZW50T3V0cHV0ID0gYXdhaXQgZ2V0Q21hT3V0cHV0KHJsLCBlcnJvck9iaik7XG4gICAgICAgIGlmICghdHlwZUd1YXJkc18xLmlzQ3VtdWx1c01lc3NhZ2VXaXRoQXNzaWduZWRQYXlsb2FkKGxvYWRBbmRVcGRhdGVSZW1vdGVFdmVudE91dHB1dCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvdXRwdXQgdHlwaW5nIHJlY2VpdmVkIGZyb21cbiAgICAgIGxvYWRBbmRVcGRhdGVSZW1vdGVFdmVudCAke0pTT04uc3RyaW5naWZ5KGxvYWRBbmRVcGRhdGVSZW1vdGVFdmVudE91dHB1dCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0Q3VtdWx1c0Vudmlyb25tZW50KGxvYWRBbmRVcGRhdGVSZW1vdGVFdmVudE91dHB1dCwgY29udGV4dCk7XG4gICAgICAgIGNtYVN0ZGluLndyaXRlKCdsb2FkTmVzdGVkRXZlbnRcXG4nKTtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6IGxvYWRBbmRVcGRhdGVSZW1vdGVFdmVudE91dHB1dCxcbiAgICAgICAgICAgIHNjaGVtYXMsXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgIH0pKTtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoJ1xcbjxFT0M+XFxuJyk7XG4gICAgICAgIGNvbnN0IGxvYWROZXN0ZWRFdmVudE91dHB1dCA9IGF3YWl0IGdldENtYU91dHB1dChybCwgZXJyb3JPYmopO1xuICAgICAgICBpZiAoIXR5cGVHdWFyZHNfMS5pc0xvYWROZXN0ZWRFdmVudElucHV0KGxvYWROZXN0ZWRFdmVudE91dHB1dCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBvdXRwdXQgdHlwaW5nIHJlY2VpdmVkIGZyb21cbiAgICAgIGxvYWROZXN0ZWRFdmVudCAke0pTT04uc3RyaW5naWZ5KGxvYWROZXN0ZWRFdmVudE91dHB1dCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5sb2coJ1N0YXJ0aW5nIHRhc2sgZnVuY3Rpb24nKTtcbiAgICAgICAgcnVubmluZ1Rhc2sgPSB0cnVlO1xuICAgICAgICBjb25zdCB0YXNrT3V0cHV0ID0gYXdhaXQgVGFza0Z1bmN0aW9uKGxvYWROZXN0ZWRFdmVudE91dHB1dCwgY29udGV4dCk7XG4gICAgICAgIHJ1bm5pbmdUYXNrID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUubG9nKCdTdGFydGluZyB0YXNrIGZ1bmN0aW9uIGZpbmlzaGVkJyk7XG4gICAgICAgIGNtYVN0ZGluLndyaXRlKCdjcmVhdGVOZXh0RXZlbnRcXG4nKTtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgZXZlbnQ6IGxvYWRBbmRVcGRhdGVSZW1vdGVFdmVudE91dHB1dCxcbiAgICAgICAgICAgIGhhbmRsZXJfcmVzcG9uc2U6IHRhc2tPdXRwdXQsXG4gICAgICAgICAgICBtZXNzYWdlX2NvbmZpZzogbG9hZE5lc3RlZEV2ZW50T3V0cHV0Lm1lc3NhZ2VDb25maWcsXG4gICAgICAgICAgICBzY2hlbWFzXG4gICAgICAgIH0pKTtcbiAgICAgICAgY21hU3RkaW4ud3JpdGUoJ1xcbjxFT0M+XFxuJyk7XG4gICAgICAgIGNvbnN0IGNyZWF0ZU5leHRFdmVudE91dHB1dCA9IGF3YWl0IGdldENtYU91dHB1dChybCwgZXJyb3JPYmopO1xuICAgICAgICBjbWFTdGRpbi53cml0ZSgnPEVYSVQ+XFxuJyk7XG4gICAgICAgIGlmICh0eXBlR3VhcmRzXzEuaXNMb2FkTmVzdGVkRXZlbnRJbnB1dChjcmVhdGVOZXh0RXZlbnRPdXRwdXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwaW5nIHJlY2VpdmVkIGZyb21cbiAgICAgIGNyZWF0ZU5leHRFdmVudE91dHB1dDogJHtKU09OLnN0cmluZ2lmeShjcmVhdGVOZXh0RXZlbnRPdXRwdXQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldHVyblZhbCA9IGNyZWF0ZU5leHRFdmVudE91dHB1dDtcbiAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXJ1bm5pbmdUYXNrKSB7XG4gICAgICAgICAgICAgICAgY21hU3RkaW4ud3JpdGUoJ1xcbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY21hU3RkaW4ud3JpdGUoJzxFWElUPlxcbicpO1xuICAgICAgICAgICAgaWYgKCFjbWFQcm9jZXNzLmtpbGwoJ1NJR1RFUk0nKSkge1xuICAgICAgICAgICAgICAgIGNtYVByb2Nlc3Mua2lsbCgnU0lHS0lMTCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ01BIHByb2Nlc3MgZmFpbGVkIHRvIGtpbGwgb24gdGFzayBmYWlsdXJlOiAke0pTT04uc3RyaW5naWZ5KGUpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoKF9hID0gZXJyb3IgPT09IG51bGwgfHwgZXJyb3IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVycm9yLm5hbWUpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pbmNsdWRlcygnV29ya2Zsb3dFcnJvcicpKSAmJiAoIXR5cGVHdWFyZHNfMS5pc0NNQU1lc3NhZ2UoY3VtdWx1c01lc3NhZ2UpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5jdW11bHVzTWVzc2FnZSwgcGF5bG9hZDogbnVsbCwgZXhjZXB0aW9uOiBlcnJvci5uYW1lXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFdhaXQgZm9yIC5jbG9zZSBwcm9jZXNzIGV2ZW50IHRvIGNvbXBsZXRlIGJlZm9yZSB0aHJvd2luZ1xuICAgICAgICBsZXQgd2FpdEl0ZXJhdGlvbnMgPSAwO1xuICAgICAgICB3aGlsZSAoIXN0YXR1c09iai5jbG9zZSAmJiB3YWl0SXRlcmF0aW9ucyA8IDIwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyB1cCB0byAyIHNlY29uZHMgZm9yIENNQSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQnKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMDApKTtcbiAgICAgICAgICAgIHdhaXRJdGVyYXRpb25zICs9IDE7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICBjbGVhclRpbWVvdXQobGFtYmRhVGltZXIpO1xuICAgIH1cbn1cbmV4cG9ydHMucnVuQ3VtdWx1c1Rhc2sgPSBydW5DdW11bHVzVGFzaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNtYS5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19leHBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2V4cG9ydFN0YXIpIHx8IGZ1bmN0aW9uKG0sIGV4cG9ydHMpIHtcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBjbWFfMSA9IHJlcXVpcmUoXCIuL2NtYVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdlbmVyYXRlQ01BU3Bhd25Bcmd1bWVudHNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNtYV8xLmdlbmVyYXRlQ01BU3Bhd25Bcmd1bWVudHM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJpbnZva2VDdW11bHVzTWVzc2FnZUFkYXB0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNtYV8xLmludm9rZUN1bXVsdXNNZXNzYWdlQWRhcHRlcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInJ1bkN1bXVsdXNUYXNrXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjbWFfMS5ydW5DdW11bHVzVGFzazsgfSB9KTtcbl9fZXhwb3J0U3RhcihyZXF1aXJlKFwiLi90eXBlc1wiKSwgZXhwb3J0cyk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZ2V0QXN5bmNPcGVyYXRpb25JZCA9IGV4cG9ydHMuZ2V0RXhlY3V0aW9ucyA9IGV4cG9ydHMuZ2V0UGFyZW50QXJuID0gZXhwb3J0cy5nZXRTdGFja05hbWUgPSBleHBvcnRzLmdldE1lc3NhZ2VHcmFudWxlcyA9IHZvaWQgMDtcbmNvbnN0IEdSQU5VTEVfTE9HX0xJTUlUID0gNTAwO1xuLyoqXG4gKiBHZXQgZ3JhbnVsZXMgZnJvbSBleGVjdXRpb24gbWVzc2FnZS5cbiAqICAgVXNlcyB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBhcyBkZWZpbmVkIGJ5IHRoZSBjdW11bHVzL2NvbW1vbi9tZXNzYWdlXG4gKiAgIGRlc2NyaXB0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlIC0gYSBDdW11bHVzIG1lc3NhZ2VcbiAqIEBwYXJhbSB7aW50ZWdlcn0gZ3JhbnVsZUxpbWl0IC0gbnVtYmVyIG9mIGdyYW51bGVzIHRvIGxpbWl0IHRoZSBsb2cgdG9cbiAqIGluY2x1ZGluZywgdG8gYXZvaWQgZW52aXJvbm1lbnQgdmFyaWFibGUgdHJ1bmNhdGlvblxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IC0gQW4gYXJyYXkgb2YgZ3JhbnVsZSBpZHNcbiAqL1xuZXhwb3J0cy5nZXRNZXNzYWdlR3JhbnVsZXMgPSAobWVzc2FnZSwgZ3JhbnVsZUxpbWl0ID0gR1JBTlVMRV9MT0dfTElNSVQpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IGdyYW51bGVzID0gKChfYSA9IG1lc3NhZ2UgPT09IG51bGwgfHwgbWVzc2FnZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWVzc2FnZS5wYXlsb2FkKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ3JhbnVsZXMpIHx8ICgoX2IgPSBtZXNzYWdlID09PSBudWxsIHx8IG1lc3NhZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lc3NhZ2UubWV0YSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmlucHV0X2dyYW51bGVzKTtcbiAgICBpZiAoZ3JhbnVsZXMpIHtcbiAgICAgICAgcmV0dXJuIGdyYW51bGVzLnNsaWNlKDAsIGdyYW51bGVMaW1pdClcbiAgICAgICAgICAgIC5tYXAoKGdyYW51bGUpID0+IGdyYW51bGUuZ3JhbnVsZUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xufTtcbi8qKlxuICogR2V0IHRoZSBzdGFja25hbWUgcHVsbGVkIGZyb20gdGhlIG1ldGEgb2YgdGhlIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBtZXNzYWdlIC0gQSBjdW11bHVzIGV2ZW50IG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSBjdW11bHVzIHN0YWNrIG5hbWUuXG4gKi9cbmV4cG9ydHMuZ2V0U3RhY2tOYW1lID0gKG1lc3NhZ2UpID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLm1ldGEpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zdGFjazsgfTtcbi8qKlxuICogR2V0cyBwYXJlbnQgYXJuIGZyb20gZXhlY3V0aW9uIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2UgLSBBbiBleGVjdXRpb24gbWVzc2FnZS5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gdGhlIHBhcmVudCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydHMuZ2V0UGFyZW50QXJuID0gKG1lc3NhZ2UpID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLmN1bXVsdXNfbWV0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhcmVudEV4ZWN1dGlvbkFybjsgfTtcbi8qKlxuKiBHZXQgY3VycmVudCBleGVjdXRpb24gbmFtZSBmcm9tIEN1bXVsdXMgbWVzc2FnZS5cbipcbiogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2UgLSBDdW11bHVzIG1lc3NhZ2UuXG4qIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IGN1cnJlbnQgZXhlY3V0aW9uIG5hbWUuXG4qL1xuZXhwb3J0cy5nZXRFeGVjdXRpb25zID0gKG1lc3NhZ2UpID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLmN1bXVsdXNfbWV0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmV4ZWN1dGlvbl9uYW1lOyB9O1xuLyoqXG4gKiBHZXQgY3VycmVudCBhc3luYyBvcGVyYXRpb24gaWQgZnJvbSBDdW11bHVzIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2UgLSBDdW11bHVzIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhc3luY09wZXJhdGlvbklkIG9yIG51bGxcbiAqL1xuZXhwb3J0cy5nZXRBc3luY09wZXJhdGlvbklkID0gKG1lc3NhZ2UpID0+IHsgdmFyIF9hOyByZXR1cm4gKF9hID0gbWVzc2FnZSA9PT0gbnVsbCB8fCBtZXNzYWdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXNzYWdlLmN1bXVsdXNfbWV0YSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFzeW5jT3BlcmF0aW9uSWQ7IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tZXNzYWdlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5pc0NNQU1lc3NhZ2UgPSBleHBvcnRzLmlzTG9hZE5lc3RlZEV2ZW50SW5wdXQgPSBleHBvcnRzLmlzQ3VtdWx1c01lc3NhZ2VXaXRoQXNzaWduZWRQYXlsb2FkID0gdm9pZCAwO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIGlzQ3VtdWx1c01lc3NhZ2VXaXRoQXNzaWduZWRQYXlsb2FkKG1lc3NhZ2UpIHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICByZXR1cm4gKCgoX2EgPSBtZXNzYWdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucGF5bG9hZCkgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiAoKF9iID0gbWVzc2FnZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmlucHV0KSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICYmICgoX2MgPSBtZXNzYWdlKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MuY29uZmlnKSA9PT0gdW5kZWZpbmVkKTtcbn1cbmV4cG9ydHMuaXNDdW11bHVzTWVzc2FnZVdpdGhBc3NpZ25lZFBheWxvYWQgPSBpc0N1bXVsdXNNZXNzYWdlV2l0aEFzc2lnbmVkUGF5bG9hZDtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBpc0xvYWROZXN0ZWRFdmVudElucHV0KG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gKG1lc3NhZ2UuaW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAmJiBtZXNzYWdlLmNvbmZpZyAhPT0gdW5kZWZpbmVkKTtcbn1cbmV4cG9ydHMuaXNMb2FkTmVzdGVkRXZlbnRJbnB1dCA9IGlzTG9hZE5lc3RlZEV2ZW50SW5wdXQ7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gaXNDTUFNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICByZXR1cm4gKG1lc3NhZ2UuY21hICE9PSB1bmRlZmluZWQpO1xufVxuZXhwb3J0cy5pc0NNQU1lc3NhZ2UgPSBpc0NNQU1lc3NhZ2U7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10eXBlR3VhcmRzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHlwZXMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHJlc3VsdC52YWx1ZSk7IH0pLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbnZhciBfX2dlbmVyYXRvciA9ICh0aGlzICYmIHRoaXMuX19nZW5lcmF0b3IpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBib2R5KSB7XG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcbiAgICByZXR1cm4gZyA9IHsgbmV4dDogdmVyYigwKSwgXCJ0aHJvd1wiOiB2ZXJiKDEpLCBcInJldHVyblwiOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiAoZ1tTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzOyB9KSwgZztcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBzdGVwKFtuLCB2XSk7IH07IH1cbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XG4gICAgICAgIGlmIChmKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLlwiKTtcbiAgICAgICAgd2hpbGUgKF8pIHRyeSB7XG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XG4gICAgICAgICAgICBpZiAoeSA9IDAsIHQpIG9wID0gW29wWzBdICYgMiwgdC52YWx1ZV07XG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XG4gICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfVxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgICB9XG59O1xudmFyIF9faW1wb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnRTdGFyKSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKG1vZCwgaykpIHJlc3VsdFtrXSA9IG1vZFtrXTtcbiAgICByZXN1bHRbXCJkZWZhdWx0XCJdID0gbW9kO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF90aGlzID0gdGhpcztcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbnZhciBmcyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwiZnNcIikpO1xudmFyIHBhdGggPSBfX2ltcG9ydFN0YXIocmVxdWlyZShcInBhdGhcIikpO1xudmFyIGlzV2luZG93cyA9IC9ed2luL2kudGVzdChwcm9jZXNzLnBsYXRmb3JtKTtcbi8qKlxuICogU29tZXRpbWVzLCBwZW9wbGUgd2FudCB0byBsb29rIGZvciBsb2NhbCBleGVjdXRhYmxlIGZpbGVzXG4gKiB3aGljaCBhcmUgc3BlY2lmaWVkIHdpdGggZWl0aGVyIHJlbGF0aXZlIG9yIGFic29sdXRlIGZpbGUgcGF0aC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gY21kXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEFuIGFic29sdXRlIHBhdGggb2YgZ2l2ZW4gY29tbWFuZCwgb3IgdW5kZWZpbmVkLlxuICovXG52YXIgaXNGaWxlcGF0aCA9IGZ1bmN0aW9uIChjbWQpIHtcbiAgICByZXR1cm4gY21kLmluY2x1ZGVzKHBhdGguc2VwKSA/IHBhdGgucmVzb2x2ZShjbWQpIDogdW5kZWZpbmVkO1xufTtcbi8qKlxuICogSW4gV2luZG93cyBPUywgdGhlcmUgYXJlIGFsaWFzZXMgdG8gZXhlY3V0YWJsZSBmaWxlcywgbGlrZSBcIi5zaFwiLCBcIi5iYXNoXCIgb3IgXCIucHlcIi5cbiAqIEBwcml2YXRlXG4gKiBAcmV0dXJuIHtzdHJpbmdbXX1cbiAqL1xudmFyIGdldEFwcGxpY2FibGVFeHRlbnNpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAoaXNXaW5kb3dzKSA/IChwcm9jZXNzLmVudi5QQVRIRVhUIHx8ICcnKS5zcGxpdChwYXRoLmRlbGltaXRlcikgOiBbJyddO1xufTtcbi8qKlxuICogSnVzdCBwcm9taXNpZmllcyBcImZzLmFjY2Vzc1wiXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGFic1dpdGhFeHQgQW4gYWJzb2x1dGUgZmlsZSBwYXRoIHdpdGggYW4gYXBwbGljYWJsZSBleHRlbnNpb24gYXBwZW5kZWQuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IFJlc29sdmVzIGFic29sdXRlIHBhdGggb3IgZW1wdHkgc3RyaW5nLlxuICovXG52YXIgYWNjZXNzID0gZnVuY3Rpb24gKGFic1dpdGhFeHQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmV0dXJuIGZzLmFjY2VzcyhhYnNXaXRoRXh0LCBmcy5jb25zdGFudHMuWF9PSywgZnVuY3Rpb24gKGVycikgeyByZXR1cm4gcmVzb2x2ZShlcnIgPyAnJyA6IGFic1dpdGhFeHQpOyB9KTsgfSk7XG59O1xuLyoqXG4gKiBSZXNvbHZlcyBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBleGVjdXRhYmxlIG9yIG5vdCwgcmVnYXJkaW5nIFwiUEFUSEVYVFwiIHRvIGJlIGFwcGxpZWQuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGFic3BhdGggQSBmaWxlIHBhdGggdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gUmVzb2x2ZXMgdGhlIGFic29sdXRlIGZpbGUgcGF0aCBqdXN0IGNoZWNrZWQsIG9yIHVuZGVmaW5lZC5cbiAqL1xudmFyIGlzRXhlY3V0YWJsZSA9IGZ1bmN0aW9uIChhYnNwYXRoKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGNoZWNrcywgYWJzcGF0aGVzO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGNoZWNrcyA9IGdldEFwcGxpY2FibGVFeHRlbnNpb25zKCkubWFwKGZ1bmN0aW9uIChleHQpIHsgcmV0dXJuIGFjY2VzcyhhYnNwYXRoICsgZXh0KTsgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgUHJvbWlzZS5hbGwoY2hlY2tzKV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgYWJzcGF0aGVzID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCBQcm9taXNlLnJlc29sdmUoYWJzcGF0aGVzLmZpbHRlcihmdW5jdGlvbiAoYWJzKSB7IHJldHVybiAhIWFiczsgfSlbMF0pXTtcbiAgICAgICAgfVxuICAgIH0pO1xufSk7IH07XG4vKipcbiAqIEp1c3QgdG8gbGlzdCB1cCBhbGwgdGhlIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcnkgZ2l2ZW4uXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyIEFuIGFic29sdXRlIGRpcmVjdG9yeSBwYXRoIHRvIGxpc3QgdGhlIGNvbnRlbnRzLlxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmdbXT59IFJlc29sdmVzIHRoZSBsaXN0IG9mIGNvbnRlbnRzIG9mIHRoaXMgZGlyZWN0b3J5LlxuICovXG52YXIgbHMgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJldHVybiBmcy5yZWFkZGlyKGRpciwgZnVuY3Rpb24gKGVyciwgZmlsZXMpIHsgcmV0dXJuIHJlc29sdmUoZmlsZXMgfHwgW10pOyB9KTsgfSk7XG59O1xuLyoqXG4gKiBSZXR1cm5zIGFsbCBleGVjdXRhYmxlIGZpbGVzIHdoaWNoIGhhdmUgdGhlIHNhbWUgbmFtZSB3aXRoIHRoZSB0YXJnZXQgY29tbWFuZC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kIFRoZSB0YXJnZXQgY29tbWFuZCB3ZSBhcmUgbG9va2luZyBmb3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gZGlyIFRoZSB0YXJnZXQgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21tYW5kIHdvdWxkIGJlIGxvb2tlZCBmb3IuXG4gKi9cbnZhciBmaW5kRXhlY3V0YWJsZVVuZGVyRGlyID0gZnVuY3Rpb24gKGNtZCwgZGlyKSB7IHJldHVybiBfX2F3YWl0ZXIoX3RoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGZpbGVzLCBtYXRjaGVzO1xuICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBscyhkaXIpXTtcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICBmaWxlcyA9IF9hLnNlbnQoKTtcbiAgICAgICAgICAgICAgICBtYXRjaGVzID0gZmlsZXMuZmlsdGVyKGZ1bmN0aW9uIChmKSB7IHJldHVybiBwYXRoLmJhc2VuYW1lKGYpLnNwbGl0KCcuJylbMF0gPT09IGNtZDsgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIFByb21pc2UuYWxsKG1hdGNoZXMubWFwKGZ1bmN0aW9uIChmKSB7IHJldHVybiBpc0V4ZWN1dGFibGUocGF0aC5qb2luKGRpciwgZikpOyB9KSldO1xuICAgICAgICB9XG4gICAgfSk7XG59KTsgfTtcbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgb24gd2hpY2ggdGhlIHRhcmdldCBjb21tYW5kIHNob3VsZCBiZSBsb29rZWQgZm9yLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7c3RyaW5nW119IGFkZGl0aW9uYWwgQWRkaXRpb25hbCBwYXRoZXMgdG8gbG9vb2sgZm9yLCBhbHJlYWR5IHNwbGl0dGVkIGJ5IE9TLWRlcGVuZGluZyBwYXRoIGRlbGltaXRlci5cbiAqIEByZXR1cm4ge3N0cmluZ1tdfSBEaXJlY3RvcmllcyB0byBkaWcgaW50by5cbiAqL1xudmFyIGdldERpcnNUb1dhbGtUaHJvdWdoID0gZnVuY3Rpb24gKGFkZGl0aW9uYWxQYXRocykge1xuICAgIGlmIChhZGRpdGlvbmFsUGF0aHMgPT09IHZvaWQgMCkgeyBhZGRpdGlvbmFsUGF0aHMgPSBbXTsgfVxuICAgIHZhciBlbnZuYW1lID0gaXNXaW5kb3dzID8gJ1BhdGgnIDogJ1BBVEgnO1xuICAgIHJldHVybiAocHJvY2Vzcy5lbnZbZW52bmFtZV0gfHwgJycpLnNwbGl0KHBhdGguZGVsaW1pdGVyKS5jb25jYXQoYWRkaXRpb25hbFBhdGhzKTtcbn07XG4vKipcbiAqIEp1c3QgdG8gZmxhdHRlbiBuZXN0ZWQgbGlzdHMuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtUW11bXX0gYXJyXG4gKiBAcmV0dXJuIHtUW119XG4gKi9cbnZhciBmbGF0dGVuID0gZnVuY3Rpb24gKGFycikge1xuICAgIHJldHVybiBhcnIucmVkdWNlKGZ1bmN0aW9uIChwcmV2LCBjdXJyKSB7IHJldHVybiBwcmV2LmNvbmNhdChjdXJyKTsgfSwgW10pO1xufTtcbi8qKlxuICogUmV0dXJucyBhc3luYyBwcm9taXNlIHdpdGggYWJzb2x1dGUgZmlsZSBwYXRoIG9mIGdpdmVuIGNvbW1hbmQsXG4gKiBhbmQgcmVzb2x2ZXMgd2l0aCB1bmRlZmluZWQgaWYgdGhlIGNvbW1hbmQgbm90IGZvdW5kLlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgQ29tbWFuZCBuYW1lIHRvIGxvb2sgZm9yLlxuICogQHBhcmFtIHtMb29rUGF0aE9wdGlvbn0gb3B0IE9wdGlvbnMgZm9yIGxvb2twYXRoLlxuICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlcyBhYnNvbHV0ZSBmaWxlIHBhdGgsIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGxvb2twYXRoKGNvbW1hbmQsIG9wdCkge1xuICAgIGlmIChvcHQgPT09IHZvaWQgMCkgeyBvcHQgPSB7IHBhdGg6IFtdIH07IH1cbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkaXJlY3RwYXRoLCBkaXJzLCBkZXRlY3Rpb25zLCBtYXRjaGVkO1xuICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3RwYXRoID0gaXNGaWxlcGF0aChjb21tYW5kKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpcmVjdHBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgaXNFeGVjdXRhYmxlKGRpcmVjdHBhdGgpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHQucGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdC5wYXRoID0gW107XG4gICAgICAgICAgICAgICAgICAgIGRpcnMgPSBnZXREaXJzVG9XYWxrVGhyb3VnaChvcHQucGF0aCk7XG4gICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbnMgPSBkaXJzLm1hcChmdW5jdGlvbiAoZGlyKSB7IHJldHVybiBmaW5kRXhlY3V0YWJsZVVuZGVyRGlyKGNvbW1hbmQsIGRpcik7IH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbChkZXRlY3Rpb25zKV07XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkID0gX2Euc2VudCgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gWzIgLypyZXR1cm4qLywgZmxhdHRlbihtYXRjaGVkKS5maWx0ZXIoZnVuY3Rpb24gKGFicykgeyByZXR1cm4gISFhYnM7IH0pWzBdXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG5leHBvcnRzLmxvb2twYXRoID0gbG9va3BhdGg7XG47XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJhd3Mtc2RrXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNoaWxkX3Byb2Nlc3NcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicXVlcnlzdHJpbmdcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVhZGxpbmVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwic3RyZWFtXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInV0aWxcIik7Il0sInNvdXJjZVJvb3QiOiIifQ==