@datagrok-libraries/bio 5.16.5 → 5.16.6

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/package.json CHANGED
@@ -4,11 +4,11 @@
4
4
  "access": "public"
5
5
  },
6
6
  "friendlyName": "Datagrok bio library",
7
- "version": "5.16.5",
7
+ "version": "5.16.6",
8
8
  "description": "",
9
9
  "dependencies": {
10
10
  "@datagrok-libraries/gridext": "^1.3.22",
11
- "@datagrok-libraries/utils": "^1.10.1",
11
+ "@datagrok-libraries/utils": "^2.1.3",
12
12
  "cash-dom": "latest",
13
13
  "datagrok-api": "^1.8.2",
14
14
  "dayjs": "latest",
@@ -1 +1 @@
1
- {"version":3,"file":"to-atomic-level.d.ts","sourceRoot":"","sources":["to-atomic-level.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAKtC,OAAO,EAAC,OAAO,EAAC,MAAM,UAAU,CAAC;AAuGjC,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,GACvE,OAAO,CAAC,IAAI,CAAC,CA8Df;AAqOD,wBAAgB,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAoB7D;AAw+BD,wBAAsB,2BAA2B,CAAC,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CA6BlH;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAmB1D;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAAE,EAAE,oDAAoD;AAC1E,qBAAqB,EAAE;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,GAAG,IAAI,CAkBf"}
1
+ {"version":3,"file":"to-atomic-level.d.ts","sourceRoot":"","sources":["to-atomic-level.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAKtC,OAAO,EAAC,OAAO,EAAC,MAAM,UAAU,CAAC;AAwGjC,wBAAsB,cAAc,CAClC,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,GACvE,OAAO,CAAC,IAAI,CAAC,CA8Df;AA8OD,wBAAgB,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAoB7D;AAy+BD,wBAAsB,2BAA2B,CAAC,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC,CA6BlH;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAmB1D;AAID;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAAE,EAAE,oDAAoD;AAC1E,qBAAqB,EAAE;IAAE,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAClD,MAAM,GAAG,IAAI,CAkBf"}
@@ -14,6 +14,7 @@ import { HELM_CORE_FIELDS } from '../utils/const';
14
14
  import { getSplitter } from '../utils/macromolecule';
15
15
  // import {UnitsHandler} from '../utils/units-handler';
16
16
  import { NotationConverter } from '../utils/notation-converter';
17
+ import { errorToConsole } from '@datagrok-libraries/utils/src/to-console';
17
18
  // constants for parsing molfile V2000
18
19
  const V2K_RGP_SHIFT = 8;
19
20
  const V2K_RGP_LINE = 'M RGP';
@@ -64,14 +65,14 @@ export function _toAtomicLevel(df, macroMolCol, monomersLibList) {
64
65
  // determine the polymer type according to HELM specifications
65
66
  let polymerType;
66
67
  // todo: an exception from dart comes before this check if the alphabet is UN
67
- if (alphabet === "PT" /* ALPHABET.PT */) {
68
+ if (alphabet === "PT" /* ALPHABET.PT */ || alphabet === "UN" /* ALPHABET.UN */) {
68
69
  polymerType = "PEPTIDE" /* HELM_POLYMER_TYPE.PEPTIDE */;
69
70
  }
70
71
  else if (alphabet === "RNA" /* ALPHABET.RNA */ || alphabet === "DNA" /* ALPHABET.DNA */) {
71
72
  polymerType = "RNA" /* HELM_POLYMER_TYPE.RNA */;
72
73
  }
73
74
  else {
74
- grok.shell.warning(`Only PT, DNA and RNA alphabets are supported, while the selected column has ${polymerType} alphabet`);
75
+ grok.shell.warning(`Unexpected column's '${macroMolCol.name}' alphabet '${alphabet}'.`);
75
76
  return;
76
77
  }
77
78
  // work in standard mode, where, as in HELMCoreLibrary:
@@ -155,8 +156,19 @@ function getMonomersDictFromLib(monomerSequencesArray, monomersLibList, polymerT
155
156
  }
156
157
  for (let row = 0; row < monomerSequencesArray.length; ++row) {
157
158
  const monomerSeq = monomerSequencesArray[row];
158
- for (const sym of monomerSeq)
159
- updateMonomersDict(monomersDict, sym, formattedMonomerLib, moduleRdkit, polymerType);
159
+ for (const sym of monomerSeq) {
160
+ if (sym === '')
161
+ continue; // Skip gap/empty monomer for MSA
162
+ try {
163
+ updateMonomersDict(monomersDict, sym, formattedMonomerLib, moduleRdkit, polymerType);
164
+ }
165
+ catch (err) {
166
+ const errTxt = errorToConsole(err);
167
+ console.error(`bio lib: getMonomersDictFromLib() sym='${sym}', error:\n` + errTxt);
168
+ const errMsg = `can't get monomer '${sym}' from library: ${errTxt}`; // Text for Datagrok error baloon
169
+ throw new Error(errMsg);
170
+ }
171
+ }
160
172
  }
161
173
  // console.log(monomersDict);
162
174
  return monomersDict;
@@ -1035,6 +1047,8 @@ function getResultingAtomBondCounts(monomerSeq, monomersDict, alphabet, polymerT
1035
1047
  let bondCount = 0;
1036
1048
  // sum up all the atoms/nodes provided by the sequence
1037
1049
  for (const monomerSymbol of monomerSeq) {
1050
+ if (monomerSymbol === '')
1051
+ continue; // Skip for gap/empty monomer in MSA
1038
1052
  const monomer = monomersDict.get(monomerSymbol);
1039
1053
  atomCount += monomer.atoms.x.length;
1040
1054
  bondCount += monomer.bonds.bondTypes.length;
@@ -1230,4 +1244,4 @@ function getResultingAtomBondCountsST(monomerSeq, monomersDict, alphabet, polyme
1230
1244
  }
1231
1245
  return { atomCount, bondCount };
1232
1246
  }
1233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tYXRvbWljLWxldmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidG8tYXRvbWljLWxldmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLHlGQUF5RjtBQUN6RixPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFjLGdCQUFnQixFQUE0RCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hILE9BQU8sRUFBVyxXQUFXLEVBQStCLE1BQU0sd0JBQXdCLENBQUM7QUFDM0YsdURBQXVEO0FBQ3ZELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRzlELHNDQUFzQztBQUN0QyxNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDeEIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDO0FBQzlCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQztBQUV6Qix3REFBd0Q7QUFDeEQsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDNUIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0scUJBQXFCLEdBQUcsc0NBQXNDLENBQUM7QUFDckUsTUFBTSxzQkFBc0IsR0FBRywyQ0FBMkMsQ0FBQztBQUMzRSxNQUFNLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDO0FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFDL0MsTUFBTSxxQkFBcUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUMvQyxNQUFNLHNCQUFzQixHQUFHLFVBQVUsQ0FBQztBQUMxQyxNQUFNLG9CQUFvQixHQUFHLHFCQUFxQixDQUFDO0FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsbUJBQW1CLENBQUM7QUFDL0MsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNuRCxNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO0FBQy9DLE1BQU0s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VSxDQUFDLE1BQU0sQ0FBQztLQUNoQztTQUFNLEVBQUUsY0FBYztRQUNyQixNQUFNLEtBQUssR0FBRyxDQUFDLFFBQVEsNkJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLFlBQVksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFFLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFFLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUUsQ0FBQztRQUUvQyxxREFBcUQ7UUFDckQsU0FBUyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkYsb0VBQW9FO1FBQ3BFLFNBQVMsSUFBSSxDQUFDLENBQUM7UUFFZixxQ0FBcUM7UUFDckMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFbkcsOEVBQThFO1FBQzlFLFNBQVMsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztLQUNwQztJQUVELE9BQU8sRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIERvIG5vdCBjaGFuZ2UgdGhlc2UgaW1wb3J0IGxpbmVzIHRvIG1hdGNoIGV4dGVybmFsIG1vZHVsZXMgaW4gd2VicGFjayBjb25maWd1cmF0aW9uICovXG5pbXBvcnQgKiBhcyBncm9rIGZyb20gJ2RhdGFncm9rLWFwaS9ncm9rJztcbmltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQge0hFTE1fRklFTERTLCBIRUxNX0NPUkVfRklFTERTLCBIRUxNX1BPTFlNRVJfVFlQRSwgSEVMTV9NT05PTUVSX1RZUEUsIFJHUk9VUF9GSUVMRFMsIE1PREV9IGZyb20gJy4uL3V0aWxzL2NvbnN0JztcbmltcG9ydCB7QUxQSEFCRVQsIGdldFNwbGl0dGVyLCBOT1RBVElPTiwgU3BsaXR0ZXJGdW5jLCBUQUdTfSBmcm9tICcuLi91dGlscy9tYWNyb21vbGVjdWxlJztcbi8vIGltcG9ydCB7VW5pdHNIYW5kbGVyfSBmcm9tICcuLi91dGlscy91bml0cy1oYW5kbGVyJztcbmltcG9ydCB7Tm90YXRpb25Db252ZXJ0ZXJ9IGZyb20gJy4uL3V0aWxzL25vdGF0aW9uLWNvbnZlcnRlcic7XG5pbXBvcnQge01vbm9tZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuLy8gY29uc3RhbnRzIGZvciBwYXJzaW5nIG1vbGZpbGUgVjIwMDBcbmNvbnN0IFYyS19SR1BfU0hJRlQgPSA4O1xuY29uc3QgVjJLX1JHUF9MSU5FID0gJ00gIFJHUCc7XG5jb25zdCBWMktfQV9MSU5FID0gJ0EgICc7XG5cbi8vIGNvbnN0YW50cyBmb3IgcGFyc2luZy9yZWNvbnN0cnVjdGlvbiBvZiBtb2xmaWxlIFYzMDAwXG5jb25zdCBWM0tfQ09VTlRTX1NISUZUID0gMTQ7XG5jb25zdCBWM0tfSURYX1NISUZUID0gNztcbmNvbnN0IFYzS19IRUFERVJfRklSU1RfTElORSA9ICdcXG5EYXRhZ3JvayBtYWNyb21vbGVjdWxlIGhhbmRsZXJcXG5cXG4nO1xuY29uc3QgVjNLX0hFQURFUl9TRUNPTkRfTElORSA9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuY29uc3QgVjNLX0JFR0lOX0NUQUJfQkxPQ0sgPSAnTSAgVjMwIEJFR0lOIENUQUJcXG4nO1xuY29uc3QgVjNLX0VORF9DVEFCX0JMT0NLID0gJ00gIFYzMCBFTkQgQ1RBQlxcbic7XG5jb25zdCBWM0tfQkVHSU5fQ09VTlRTX0xJTkUgPSAnTSAgVjMwIENPVU5UUyAnO1xuY29uc3QgVjNLX0NPVU5UU19MSU5FX0VORElORyA9ICcgMCAwIDBcXG4nO1xuY29uc3QgVjNLX0JFR0lOX0FUT01fQkxPQ0sgPSAnTSAgVjMwIEJFR0lOIEFUT01cXG4nO1xuY29uc3QgVjNLX0VORF9BVE9NX0JMT0NLID0gJ00gIFYzMCBFTkQgQVRPTVxcbic7XG5jb25zdCBWM0tfQkVHSU5fQk9ORF9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG5jb25zdCBWM0tfRU5EX0JPTkRfQkxPQ0sgPSAnTSAgVjMwIEVORCBCT05EXFxuJztcbmNvbnN0IFYzS19CT05EX0NPTkZJRyA9ICcgQ0ZHPSc7XG5jb25zdCBWM0tfQkVHSU5fREFUQV9MSU5FID0gJ00gIFYzMCAnO1xuY29uc3QgVjNLX0VORCA9ICdNICBFTkRcXG4nO1xuXG5jb25zdCBQUkVDSVNJT05fRkFDVE9SID0gMTBfMDAwOyAvLyBIRUxNQ29yZUxpYnJhcnkgaGFzIDQgc2lnbmlmaWNhbnQgZGlnaXRzIGFmdGVyIGRlY2ltYWwgcG9pbnQgaW4gYXRvbSBjb29yZGluYXRlc1xuXG4vLyBzeW1ib2xzIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb25vbWVycyBpbiBIRUxNIGxpYnJhcnlcbmNvbnN0IERFT1hZUklCT1NFID0gJ2QnO1xuY29uc3QgUklCT1NFID0gJ3InO1xuY29uc3QgUEhPU1BIQVRFID0gJ3AnO1xuXG5jb25zdCBPWFlHRU4gPSAnTyc7XG5jb25zdCBIWURST0dFTiA9ICdIJztcblxuLyogU3RvcmVzIG5lY2Vzc2FyeSBkYXRhIGFib3V0IGF0b21zIG9mIGEgbW9ub21lciBwYXJzZWQgZnJvbSBNb2xmaWxlICovXG50eXBlIEF0b21zID0ge1xuICAvKiBlbGVtZW50IHN5bWJvbHMgZm9yIG1vbm9tZXIncyBhdG9tcyAqL1xuICBhdG9tVHlwZXM6IHN0cmluZ1tdLFxuICAvKiBDYXJ0ZXNpYW4gY29vcmRpYW50ZXMgb2YgbW9ub21lcidzIGF0b21zICovXG4gIHg6IG51bWJlcltdLCAvLyB0b2RvOiBjb252ZXJ0IHRvIEZsb2F0MzJcbiAgeTogbnVtYmVyW10sXG4gIC8qIFYzSyBhdG9tIGxpbmUgbWF5IGNvbnRhaW4ga2V5d29yZCBhcmdzICovXG4gIGt3YXJnczogc3RyaW5nW10sXG59XG5cbi8qIFN0b3JlcyBuZWNlc3NhcnkgZGF0YSBhYm91dCBib25kcyBvZiBhIG1vbm9tZXIgcGFyc2VkIGZyb20gTW9sZmlsZSAqL1xudHlwZSBCb25kcyA9IHtcbiAgLyogYm9uZCB0eXBlcyBmb3IgYWxsIGxpbmVzIG9mIE1vbGZpbGUgYm9uZCBibG9jayAqL1xuICBib25kVHlwZXM6IG51bWJlcltdLCAvLyB0b2RvOiBjb252ZXJ0IHRvIEluZDMyXG4gIC8qIEluZGljZXMgb2YgYWxsIGF0b20gcGFpcnMsIGluZGV4aW5nIHN0YXJ0aW5nIGZyb20gMSAgKi9cbiAgYXRvbVBhaXJzOiBudW1iZXJbXVtdLFxuICAvKiBJZiBhIGJvbmQgaGFzIENGRz0uLi4ga2V5d29yZCBhcmd1bWVudCwgaXQgaXMgcGFyc2VkIGFuZCBzb3RyZWQgYXMgYVxuICAgKiB2YWx1ZSBvZiB0aGUgbWFwLCB3aXRoIHRoZSBrZXkgYmVpbmcgdGhlIGJvbmQncyBpbmRleCAgKi9cbiAgYm9uZENvbmZpZ3VyYXRpb246IE1hcDxudW1iZXIsIG51bWJlcj4sXG4gIC8qIFYzSyBib25kIGxpbmUgbWF5IGNvbnRhaW4ga2V5d29yZCBhcmdzICovXG4gIGt3YXJnczogTWFwPG51bWJlciwgc3RyaW5nPixcbn1cblxuLyogTWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb25vbWVyIG5lY2Vzc2FyeSB0byByZXN0b3JlIHRoZSByZXN1bHRpbmdcbiAqIG1vbGZpbGUgICovXG50eXBlIE1vbm9tZXJNZXRhZGF0YSA9IHtcbiAgLyogdGVybWluYWwgbm9kZXM6IDAtdGggY29ycmVzcG9uZHMgdG8gdGhlIFwibGVmdG1vc3RcIiBvbmUsIDFzdCwgdG8gdGhlIFwicmlnaHRtb3N0XCIsXG4gICAqIGUuZy4gTi10ZXJtaW51cyBhbmQgQy10ZXJtaW51cyBpbiBwZXB0aWRlcyAqL1xuICB0ZXJtaW5hbE5vZGVzOiBudW1iZXJbXSxcbiAgLyogci1ncm91cCBub2RlczogMC10aCBjb3JyZXNwb25kcyB0byB0aGUgXCJsZWZ0bW9zdFwiIG9uZSwgMXN0LCB0byB0aGUgXCJyaWdodG1vc3RcIiAqL1xuICByTm9kZXM6IG51bWJlcltdLFxuICAvKiBzaGlmdCBmcm9tIHRoZSBvcmlnaW4gdG8gdGhlIG5leHQgYmFja2JvbmUsIG51bGwgZm9yIGJyYW5jaCBtb25vbWVycyAqL1xuICBiYWNrYm9uZVNoaWZ0OiBudW1iZXJbXSB8IG51bGwsXG4gIC8qIHNoaWZ0IGZyb20gdGhlIG9yaWdpbiB0byB0aGUgbmV4dCBicmFuY2gsIG51bGwgZm9yIGJyYW5jaCBtb25vbWVycyAqL1xuICBicmFuY2hTaGlmdDogbnVtYmVyW10gfCBudWxsXG59XG5cbnR5cGUgTW9sR3JhcGggPSB7XG4gIGF0b21zOiBBdG9tcyxcbiAgYm9uZHM6IEJvbmRzLFxuICBtZXRhOiBNb25vbWVyTWV0YWRhdGEsXG59XG5cbi8qIEhlbHBlciBzdHJ1Y3R1cmUgd3JhcHBpbmcgY29tbW9uIGFyZ3VtZW50cyB0byBzZXZlcmFsIGZ1bmN0aW9ucyAqL1xudHlwZSBMb29wVmFyaWFibGVzID0ge1xuICBpOiBudW1iZXIsXG4gIG5vZGVTaGlmdDogbnVtYmVyLFxuICBib25kU2hpZnQ6IG51bWJlcixcbiAgYmFja2JvbmVQb3NpdGlvblNoaWZ0OiBudW1iZXJbXSxcbiAgYmFja2JvbmVBdHRhY2hOb2RlOiBudW1iZXI7IC8vIG5vZGUgdG8gd2hpY2ggdGhlIG5leHQgYmFja2JvbmUgaXMgYXR0YWNoZWRcbiAgYnJhbmNoUG9zaXRpb25TaGlmdDogbnVtYmVyW10sXG4gIGJyYW5jaEF0dGFjaE5vZGU6IG51bWJlcixcbiAgZmxpcEZhY3RvcjogbnVtYmVyLFxuICAvLyB0b2RvOiBzaG91bGQgd2UgY29uc2lkZXIgcmVwcmVzZW50YXRpb25zIG90aGVyIHRoYW4gcGxhbmFyP1xufVxuXG4vKiBIZWxwZXIgc3RydWN0dXJlIHdyYXBwaW5nIGNvbW1vbiBhcmd1bWVudHMgdG8gc2V2ZXJhbCBmdW5jdGlvbnMgKi9cbnR5cGUgTG9vcENvbnN0YW50cyA9IHtcbiAgc3VnYXI6IE1vbEdyYXBoIHwgbnVsbCxcbiAgcGhvc3BoYXRlOiBNb2xHcmFwaCB8IG51bGwsXG4gIHNlcUxlbmd0aDogbnVtYmVyLFxuICBhdG9tQ291bnQ6IG51bWJlcixcbiAgYm9uZENvdW50OiBudW1iZXIsXG59XG5cbi8vIHRvZG86IHZlcmlmeSB0aGF0IGFsbCBmdW5jdGlvbnMgaGF2ZSByZXR1cm4gdHlwZXNcblxuLyogQ29udmVydCBNYWNyb21vbGVjdWxlIGNvbHVtbiBpbnRvIE1vbGVjdWxlIGNvbHVtbiBzdG9yaW5nIG1vbGZpbGUgVjMwMDAgd2l0aCB0aGUgaGVscCBvZiBhIG1vbm9tZXIgbGlicmFyeSAgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfdG9BdG9taWNMZXZlbChcbiAgZGY6IERHLkRhdGFGcmFtZSwgbWFjcm9Nb2xDb2w6IERHLkNvbHVtbjxzdHJpbmc+LCBtb25vbWVyc0xpYkxpc3Q6IGFueVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKERHLkZ1bmMuZmluZCh7cGFja2FnZTogJ0NoZW0nLCBuYW1lOiAnZ2V0UmRLaXRNb2R1bGUnfSkubGVuZ3RoID09PSAwKSB7XG4gICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdUcmFuc2Zvcm1hdGlvbiB0byBhdG9taWMgbGV2ZWwgcmVxdWlyZXMgcGFja2FnZSBcIkNoZW1cIiBpbnN0YWxsZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG1hY3JvTW9sQ29sLnNlbVR5cGUgIT09IERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSkge1xuICAgIGdyb2suc2hlbGwud2FybmluZyhcbiAgICAgIGBPbmx5IHRoZSAke0RHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRX0gY29sdW1ucyBjYW4gYmUgY29udmVydGVkIHRvIGF0b21pY1xuICAgICAgbGV2ZWwsIHRoZSBjaG9zZW4gY29sdW1uIGhhcyBzZW1UeXBlICR7bWFjcm9Nb2xDb2wuc2VtVHlwZX1gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBjb252ZXJ0ICdoZWxtJyB0byAnc2VwYXJhdG9yJyB1bml0c1xuICBpZiAobWFjcm9Nb2xDb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpID09PSBOT1RBVElPTi5IRUxNKSB7XG4gICAgY29uc3QgY29udmVydGVyID0gbmV3IE5vdGF0aW9uQ29udmVydGVyKG1hY3JvTW9sQ29sKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSAnLyc7XG4gICAgbWFjcm9Nb2xDb2wgPSBjb252ZXJ0ZXIuY29udmVydChOT1RBVElPTi5TRVBBUkFUT1IsIHNlcGFyYXRvcik7XG4gIH1cblxuICBjb25zdCBhbHBoYWJldCA9IG1hY3JvTW9sQ29sLmdldFRhZyhUQUdTLmFscGhhYmV0KTtcblxuICAvLyBkZXRlcm1pbmUgdGhlIHBvbHltZXIgdHlwZSBhY2NvcmRpbmcgdG8gSEVMTSBzcGVjaWZpY2F0aW9uc1xuICBsZXQgcG9seW1lclR5cGU7XG4gIC8vIHRvZG86IGFuIGV4Y2VwdGlvbiBmcm9tIGRhcnQgY29tZXMgYmVmb3JlIHRoaXMgY2hlY2sgaWYgdGhlIGFscGhhYmV0IGlzIFVOXG4gIGlmIChhbHBoYWJldCA9PT0gQUxQSEFCRVQuUFQpIHtcbiAgICBwb2x5bWVyVHlwZSA9IEhFTE1fUE9MWU1FUl9UWVBFLlBFUFRJREU7XG4gIH0gZWxzZSBpZiAoYWxwaGFiZXQgPT09IEFMUEhBQkVULlJOQSB8fCBhbHBoYWJldCA9PT0gQUxQSEFCRVQuRE5BKSB7XG4gICAgcG9seW1lclR5cGUgPSBIRUxNX1BPTFlNRVJfVFlQRS5STkE7XG4gIH0gZWxzZSB7XG4gICAgZ3Jvay5zaGVsbC53YXJuaW5nKFxuICAgICAgYE9ubHkgUFQsIEROQSBhbmQgUk5BIGFscGhhYmV0cyBhcmUgc3VwcG9ydGVkLCB3aGlsZSB0aGUgc2VsZWN0ZWQgY29sdW1uIGhhcyAke3BvbHltZXJUeXBlfSBhbHBoYWJldGBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHdvcmsgaW4gc3RhbmRhcmQgbW9kZSwgd2hlcmUsIGFzIGluIEhFTE1Db3JlTGlicmFyeTpcbiAgLy8gLSBtb25vbWVycyB3aXRoIHBvbHltZXJUeXBlICdQRVBUSURFJyBoYXZlIG1vbm9tZXIgdHlwZSAnYmFja2JvbmUnXG4gIC8vIC0gbW9ub21lcnMgd2l0aCBwb2x5bWVyVHlwZSAnUk5BJyBoYXZlIG1vbm9tZXIgdHlwZSAnYnJhbmNoJyBhbmQgJ2JhY2tib25lJ1xuICAvLyAtIHRoZSBsaWJyYXJ5IHByb3ZpZGVzIG1vbGZpbGVzIGluIGZvcm1hdCBWMjAwMFxuICBjb25zdCBtb2RlID0gTU9ERS5TVEFOREFSRDtcblxuICBjb25zdCBtb25vbWVyU2VxdWVuY2VzQXJyYXk6IHN0cmluZ1tdW10gPSBnZXRNb25vbWVyU2VxdWVuY2VzQXJyYXkobWFjcm9Nb2xDb2wpO1xuICBjb25zdCBtb25vbWVyc0RpY3QgPSBhd2FpdCBnZXRNb25vbWVyc0RpY3RGcm9tTGliKG1vbm9tZXJTZXF1ZW5jZXNBcnJheSwgbW9ub21lcnNMaWJMaXN0LCBwb2x5bWVyVHlwZSwgYWxwaGFiZXQpO1xuICBjb25zdCBjb2x1bW5MZW5ndGggPSBtYWNyb01vbENvbC5sZW5ndGg7XG4gIGNvbnN0IHJlY29uc3RydWN0ZWQ6IHN0cmluZ1tdID0gbmV3IEFycmF5KGNvbHVtbkxlbmd0aCk7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvbHVtbkxlbmd0aDsgKytyb3cpIHtcbiAgICBjb25zdCBtb25vbWVyU2VxID0gbW9ub21lclNlcXVlbmNlc0FycmF5W3Jvd107XG4gICAgcmVjb25zdHJ1Y3RlZFtyb3ddID0gbW9ub21lclNlcVRvTW9sZmlsZShtb25vbWVyU2VxLCBtb25vbWVyc0RpY3QsIGFscGhhYmV0LCBwb2x5bWVyVHlwZSwgbW9kZSk7XG4gICAgLy8gY29uc29sZS5sb2cocmVjb25zdHJ1Y3RlZFtyb3ddKTtcbiAgfVxuXG4gIC8vIGV4Y2x1ZGUgbmFtZSBjb2xsaXNpb25zXG4gIGNvbnN0IG5hbWUgPSAnbW9sZmlsZSgnICsgbWFjcm9Nb2xDb2wubmFtZSArICcpJztcbiAgY29uc3QgbmV3Q29sTmFtZSA9IGRmLmNvbHVtbnMuZ2V0VW51c2VkTmFtZShuYW1lKTtcbiAgY29uc3QgbmV3Q29sID0gREcuQ29sdW1uLmZyb21TdHJpbmdzKG5ld0NvbE5hbWUsIHJlY29uc3RydWN0ZWQpO1xuXG4gIG5ld0NvbC5zZW1UeXBlID0gREcuU0VNVFlQRS5NT0xFQ1VMRTtcbiAgbmV3Q29sLnNldFRhZyhERy5UQUdTLlVOSVRTLCBERy5VTklUUy5Nb2xlY3VsZS5NT0xCTE9DSyk7XG4gIGRmLmNvbHVtbnMuYWRkKG5ld0NvbCwgdHJ1ZSk7XG4gIGF3YWl0IGdyb2suZGF0YS5kZXRlY3RTZW1hbnRpY1R5cGVzKGRmKTtcbn1cblxuLyoqIEdldCBhIG1hcHBpbmcgb2YgcGVwdGlkZSBzeW1ib2xzIHRvIEhFTE0gbW9ub21lciBsaWJyYXJ5XG4gKiBvYmplY3RzIHdpdGggc2VsZWN0ZWQgZmllbGRzLlxuICovXG5mdW5jdGlvbiBnZXRGb3JtYXR0ZWRNb25vbWVyTGliKFxuICBtb25vbWVyc0xpYkxpc3Q6IGFueVtdLCBwb2x5bWVyVHlwZTogSEVMTV9QT0xZTUVSX1RZUEUsIGFscGhhYmV0OiBBTFBIQUJFVFxuKTogTWFwPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIG1vbm9tZXJzTGliTGlzdC5mb3JFYWNoKFxuICAgIChpdCkgPT4ge1xuICAgICAgaWYgKGl0W0hFTE1fRklFTERTLlBPTFlNRVJfVFlQRV0gPT09IHBvbHltZXJUeXBlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUk5BICYmXG4gICAgICAgICAgKGl0W0hFTE1fRklFTERTLk1PTk9NRVJfVFlQRV0gPT09IEhFTE1fTU9OT01FUl9UWVBFLkJSQU5DSCB8fFxuICAgICAgICAgICAgYWxwaGFiZXQgPT09IEFMUEhBQkVULkROQSAmJiBpdFtIRUxNX0ZJRUxEUy5TWU1CT0xdID09PSBERU9YWVJJQk9TRSB8fFxuICAgICAgICAgICAgYWxwaGFiZXQgPT09IEFMUEhBQkVULlJOQSAmJiBpdFtIRUxNX0ZJRUxEUy5TWU1CT0xdID09PSBSSUJPU0UgfHxcbiAgICAgICAgICAgIGl0W0hFTE1fRklFTERTLlNZTUJPTF0gPT09IFBIT1NQSEFURSkgfHxcbiAgICAgICAgICBwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUEVQVElERSAmJlxuICAgICAgICAgIGl0W0hFTE1fRklFTERTLk1PTk9NRVJfVFlQRV0gIT09IEhFTE1fTU9OT01FUl9UWVBFLkJSQU5DSFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtb25vbWVyT2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgICAgSEVMTV9DT1JFX0ZJRUxEUy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgbW9ub21lck9iamVjdFtmaWVsZF0gPSBpdFtmaWVsZF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbWFwLnNldChpdFtIRUxNX0ZJRUxEUy5TWU1CT0xdLCBtb25vbWVyT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICByZXR1cm4gbWFwO1xufVxuXG4vKiBHZXQgamFnZ2VkIGFycmF5IG9mIG1vbm9tZXIgc3ltYm9scyBmb3IgdGhlIGRhdGFmcmFtZSAgKi9cbmZ1bmN0aW9uIGdldE1vbm9tZXJTZXF1ZW5jZXNBcnJheShtYWNyb01vbENvbDogREcuQ29sdW1uPHN0cmluZz4pOiBzdHJpbmdbXVtdIHtcbiAgY29uc3QgY29sdW1uTGVuZ3RoID0gbWFjcm9Nb2xDb2wubGVuZ3RoO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdW10gPSBuZXcgQXJyYXkoY29sdW1uTGVuZ3RoKTtcblxuICAvLyBzcGxpdCB0aGUgc3RyaW5nIGludG8gbW9ub21lcnNcbiAgY29uc3QgY29sVW5pdHMgPSBtYWNyb01vbENvbC5nZXRUYWcoREcuVEFHUy5VTklUUyk7XG4gIGNvbnN0IHNlcGFyYXRvciA9IG1hY3JvTW9sQ29sLmdldFRhZyhUQUdTLnNlcGFyYXRvcik7XG4gIGNvbnN0IHNwbGl0dGVyRnVuYzogU3BsaXR0ZXJGdW5jID0gZ2V0U3BsaXR0ZXIoY29sVW5pdHMsIHNlcGFyYXRvcik7XG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29sdW1uTGVuZ3RoOyArK3Jvdykge1xuICAgIGNvbnN0IG1hY3JvTW9sZWN1bGUgPSBtYWNyb01vbENvbC5nZXQocm93KTtcbiAgICAvLyB0b2RvOiBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBjYXNlIHdoZW4gbWFjcm9Nb2xlY3VsZSBpcyBudWxsXG4gICAgcmVzdWx0W3Jvd10gPSBtYWNyb01vbGVjdWxlID8gc3BsaXR0ZXJGdW5jKG1hY3JvTW9sZWN1bGUpIDogW107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyogR2V0IGEgbWFwcGluZyBvZiBtb25vbWVyIHN5bWJvbHMgdG8gTW9sR3JhcGggb2JqZWN0cy4gTm90aWNlLCB0aGVcbiAqIHRyYW5zZm9ybWF0aW9uIGZyb20gbW9sZmlsZSBWMjAwMCB0byBWMzAwMCB0YWtlcyBwbGFjZSxcbiAqIHdpdGggdGhlIGhlbHAgb2YgYXN5bmMgZnVuY3Rpb24gY2FsbCBmcm9tIENoZW0gKFJkS2l0IG1vZHVsZSkgKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1vbm9tZXJzRGljdEZyb21MaWIoXG4gIG1vbm9tZXJTZXF1ZW5jZXNBcnJheTogc3RyaW5nW11bXSwgbW9ub21lcnNMaWJMaXN0OiBhbnlbXSwgcG9seW1lclR5cGU6IEhFTE1fUE9MWU1FUl9UWVBFLCBhbHBoYWJldDogQUxQSEFCRVRcbik6IFByb21pc2U8TWFwPHN0cmluZywgTW9sR3JhcGg+PiB7XG4gIC8vIHRvZG86IGV4Y2VwdGlvbiAtIG5vIGdhcHMsIG5vIGVtcHR5IHN0cmluZyBtb25vbWVyc1xuICBjb25zdCBmb3JtYXR0ZWRNb25vbWVyTGliID0gZ2V0Rm9ybWF0dGVkTW9ub21lckxpYihtb25vbWVyc0xpYkxpc3QsIHBvbHltZXJUeXBlLCBhbHBoYWJldCk7XG4gIGNvbnN0IG1vbm9tZXJzRGljdCA9IG5ldyBNYXA8c3RyaW5nLCBNb2xHcmFwaD4oKTtcblxuICBjb25zdCBtb2R1bGVSZGtpdCA9IGF3YWl0IGdyb2suZnVuY3Rpb25zLmNhbGwoJ0NoZW06Z2V0UmRLaXRNb2R1bGUnKTtcblxuICAvLyBhZGQgZGVveHlyaWJvc2Uvcmlib3NlIGFuZCBwaG9zcGhhdGUgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzXG4gIGlmIChwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUk5BKSB7XG4gICAgY29uc3Qgc3ltYm9scyA9IChhbHBoYWJldCA9PT0gQUxQSEFCRVQuUk5BKSA/XG4gICAgICBbUklCT1NFLCBQSE9TUEhBVEVdIDogW0RFT1hZUklCT1NFLCBQSE9TUEhBVEVdO1xuICAgIGZvciAoY29uc3Qgc3ltIG9mIHN5bWJvbHMpXG4gICAgICB1cGRhdGVNb25vbWVyc0RpY3QobW9ub21lcnNEaWN0LCBzeW0sIGZvcm1hdHRlZE1vbm9tZXJMaWIsIG1vZHVsZVJka2l0LCBwb2x5bWVyVHlwZSk7XG4gIH1cblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBtb25vbWVyU2VxdWVuY2VzQXJyYXkubGVuZ3RoOyArK3Jvdykge1xuICAgIGNvbnN0IG1vbm9tZXJTZXE6IHN0cmluZ1tdID0gbW9ub21lclNlcXVlbmNlc0FycmF5W3Jvd107XG4gICAgZm9yIChjb25zdCBzeW0gb2YgbW9ub21lclNlcSlcbiAgICAgIHVwZGF0ZU1vbm9tZXJzRGljdChtb25vbWVyc0RpY3QsIHN5bSwgZm9ybWF0dGVkTW9ub21lckxpYiwgbW9kdWxlUmRraXQsIHBvbHltZXJUeXBlKTtcbiAgfVxuICAvLyBjb25zb2xlLmxvZyhtb25vbWVyc0RpY3QpO1xuXG4gIHJldHVybiBtb25vbWVyc0RpY3Q7XG59XG5cbi8qIEdldCBhIG1hcHBpbmcgb2YgbW9ub21lciBzeW1ib2xzIHRvIE1vbEdyYXBoIG9iamVjdHMgZnJvbSBhIG1hcCB3aG9zZSBrZXlzXG4gKiBhcmUgc3ltYm9scyBhbmQgdmFsdWVzLCBWMzAwMCBtb2xmaWxlcyAqL1xuZnVuY3Rpb24gZ2V0TW9ub21lcnNEaWN0RnJvbU1hcChzeW1ib2xUb01vbGZpbGVWM0tNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBNYXA8c3RyaW5nLCBNb2xHcmFwaD4ge1xuICBjb25zdCBtb25vbWVyc0RpY3QgPSBuZXcgTWFwPHN0cmluZywgTW9sR3JhcGg+KCk7XG4gIGNvbnN0IG1hcEtleUxpc3QgPSBBcnJheS5mcm9tKHN5bWJvbFRvTW9sZmlsZVYzS01hcC5rZXlzKCkpO1xuXG4gIGZvciAoY29uc3Qgc3ltIG9mIG1hcEtleUxpc3QpIHtcbiAgICBjb25zdCBtb2xmaWxlVjNLID0gc3ltYm9sVG9Nb2xmaWxlVjNLTWFwLmdldChzeW0pITsgLy8gISBpcyBndWFyYW50ZWVkXG5cbiAgICBjb25zdCBjb3VudHMgPSBwYXJzZUF0b21BbmRCb25kQ291bnRzKG1vbGZpbGVWM0spO1xuICAgIGNvbnN0IGF0b21zID0gcGFyc2VBdG9tQmxvY2sobW9sZmlsZVYzSywgY291bnRzLmF0b21Db3VudCk7XG4gICAgY29uc3QgYm9uZHMgPSBwYXJzZUJvbmRCbG9jayhtb2xmaWxlVjNLLCBjb3VudHMuYm9uZENvdW50KTtcblxuICAgIC8vIHRoZSByTm9kZXMgYXJlIHNldCB0byAwdGggYW5kIHRoZSBsYXN0IGF0b20hXG4gICAgLy8gdGhpcyBpcyB1c2VkIGJlY2F1c2UgYXMgZm9yIG5vdyBpdCBpcyB1bmNsZWFyIGhvdyB0byBpbmNsdWRlIHRoZSBSLWdyb3Vwc1xuICAgIC8vIGludG8gdGhlIFYzSyBtb2xmaWxlXG4gICAgY29uc3QgbWV0YSA9IGdldE1vbm9tZXJNZXRhZGF0YShhdG9tcywgYm9uZHMpO1xuXG4gICAgY29uc3QgbW9ub21lckdyYXBoOiBNb2xHcmFwaCA9IHthdG9tczogYXRvbXMsIGJvbmRzOiBib25kcywgbWV0YTogbWV0YX07XG5cbiAgICBjb25zdCBsZWZ0Tm9kZUlkeCA9IG1ldGEuck5vZGVzWzBdIC0gMTtcbiAgICBjb25zdCByaWdodE5vZGVJZHggPSBtZXRhLnRlcm1pbmFsTm9kZXNbMV0gLSAxO1xuICAgIC8vIHRvZG86IGNvbnNpZGVyIHJvdGF0aW9uP1xuICAgIGFkanVzdEJhY2tib25lTW9ub21lckdyYXBoKG1vbm9tZXJHcmFwaCwgbGVmdE5vZGVJZHgsIHJpZ2h0Tm9kZUlkeCk7XG5cbiAgICAvLyBzZXQgc2hpZnRzXG4gICAgLy8gdG9kbzogd3JhcCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uP1xuICAgIG1vbm9tZXJHcmFwaC5tZXRhLmJhY2tib25lU2hpZnQgPSBnZXRTaGlmdEJldHdlZW5Ob2Rlcyhtb25vbWVyR3JhcGgsIHJpZ2h0Tm9kZUlkeCwgbGVmdE5vZGVJZHgpO1xuXG4gICAgcmVtb3ZlTm9kZUFuZEJvbmRzKG1vbm9tZXJHcmFwaCwgbW9ub21lckdyYXBoLm1ldGEuck5vZGVzWzFdKTtcblxuICAgIG1vbm9tZXJzRGljdC5zZXQoc3ltLCBtb25vbWVyR3JhcGgpO1xuICB9XG4gIC8vIGNvbnNvbGUubG9nKG1vbm9tZXJzRGljdCk7XG5cbiAgcmV0dXJuIG1vbm9tZXJzRGljdDtcbn1cblxuLyogQWRkcyBNb2xHcmFwaCBvYmplY3QgZm9yICdzeW0nIHRvIHRoZSBtb25vbWVycyBkaWN0IHdoZW4gbmVjZXNzYXJ5ICAqL1xuZnVuY3Rpb24gdXBkYXRlTW9ub21lcnNEaWN0KFxuICBtb25vbWVyc0RpY3Q6IE1hcDxzdHJpbmcsIE1vbEdyYXBoPiwgc3ltOiBzdHJpbmcsXG4gIGZvcm1hdHRlZE1vbm9tZXJMaWI6IE1hcDxzdHJpbmcsIGFueT4sIG1vZHVsZVJka2l0OiBhbnksIHBvbHltZXJUeXBlOiBIRUxNX1BPTFlNRVJfVFlQRVxuKTogdm9pZCB7XG4gIGlmICghbW9ub21lcnNEaWN0LmhhcyhzeW0pKSB7XG4gICAgY29uc3QgbW9ub21lckRhdGE6IE1vbEdyYXBoIHwgbnVsbCA9IGdldE1vbEdyYXBoKHN5bSwgZm9ybWF0dGVkTW9ub21lckxpYiwgbW9kdWxlUmRraXQsIHBvbHltZXJUeXBlKTtcbiAgICBpZiAobW9ub21lckRhdGEpXG4gICAgICBtb25vbWVyc0RpY3Quc2V0KHN5bSwgbW9ub21lckRhdGEpO1xuICAgIGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTW9ub21lciB3aXRoIHN5bWJvbCAnJHtzeW19JyBpcyBhYnNlbnQgdGhlIG1vbm9tZXIgbGlicmFyeWApO1xuICAgIC8vIHRvZG86IGhhbmRsZSBleGNlcHRpb25cbiAgfVxufVxuXG4vKiBDb25zdHJ1Y3QgdGhlIE1vbEdyYXBoIG9iamVjdCBmb3Igc3BlY2lmaWVkIG1vbm9tZXJTeW1ib2w6IHRoZSBhc3NvY2lhdGVkXG4gKiBncmFwaCBpcyBhZGp1c3RlZCBpbiBYWSBwbGFuZSBhbmQgZmlsbGVkIHdpdGggZGVmYXVsdCBSLWdyb3VwcyAqL1xuZnVuY3Rpb24gZ2V0TW9sR3JhcGgoXG4gIG1vbm9tZXJTeW1ib2w6IHN0cmluZywgZm9ybWF0dGVkTW9ub21lckxpYjogTWFwPHN0cmluZywgYW55PixcbiAgbW9kdWxlUmRraXQ6IGFueSwgcG9seW1lclR5cGU6IEhFTE1fUE9MWU1FUl9UWVBFIC8vIHRvZG86IHNwZWNpZnkgdHlwZSBmb3IgbW9kdWxlUmRraXRcbik6IE1vbEdyYXBoIHwgbnVsbCB7XG4gIGlmICghZm9ybWF0dGVkTW9ub21lckxpYi5oYXMobW9ub21lclN5bWJvbCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBsaWJPYmplY3QgPSBmb3JtYXR0ZWRNb25vbWVyTGliLmdldChtb25vbWVyU3ltYm9sKTtcbiAgICBjb25zdCBjYXBHcm91cHMgPSBwYXJzZUNhcEdyb3VwcyhsaWJPYmplY3RbSEVMTV9GSUVMRFMuUkdST1VQU10pO1xuICAgIGNvbnN0IGNhcEdyb3VwSWR4TWFwID0gcGFyc2VDYXBHcm91cElkeE1hcChsaWJPYmplY3RbSEVMTV9GSUVMRFMuTU9MRklMRV0pO1xuICAgIGNvbnN0IG1vbGZpbGVWM0sgPSBjb252ZXJ0TW9sZmlsZVRvVjNLKHJlbW92ZVJHcm91cExpbmVzKGxpYk9iamVjdFtIRUxNX0ZJRUxEUy5NT0xGSUxFXSksIG1vZHVsZVJka2l0KTtcbiAgICBjb25zdCBjb3VudHMgPSBwYXJzZUF0b21BbmRCb25kQ291bnRzKG1vbGZpbGVWM0spO1xuXG4gICAgY29uc3QgYXRvbXMgPSBwYXJzZUF0b21CbG9jayhtb2xmaWxlVjNLLCBjb3VudHMuYXRvbUNvdW50KTtcbiAgICBjb25zdCBib25kcyA9IHBhcnNlQm9uZEJsb2NrKG1vbGZpbGVWM0ssIGNvdW50cy5ib25kQ291bnQpO1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNb25vbWVyTWV0YWRhdGEoYXRvbXMsIGJvbmRzLCBjYXBHcm91cHMsIGNhcEdyb3VwSWR4TWFwKTtcblxuICAgIGNvbnN0IG1vbm9tZXJHcmFwaDogTW9sR3JhcGggPSB7YXRvbXM6IGF0b21zLCBib25kczogYm9uZHMsIG1ldGE6IG1ldGF9O1xuXG4gICAgaWYgKHBvbHltZXJUeXBlID09PSBIRUxNX1BPTFlNRVJfVFlQRS5QRVBUSURFKSB7XG4gICAgICBhZGp1c3RQZXB0aWRlTW9ub21lckdyYXBoKG1vbm9tZXJHcmFwaCk7XG4gICAgfSBlbHNlIHsgLy8gbnVjbGVvdGlkZXNcbiAgICAgIGlmIChtb25vbWVyU3ltYm9sID09PSBSSUJPU0UgfHwgbW9ub21lclN5bWJvbCA9PT0gREVPWFlSSUJPU0UpXG4gICAgICAgIGFkanVzdFN1Z2FyTW9ub21lckdyYXBoKG1vbm9tZXJHcmFwaCk7XG4gICAgICBlbHNlIGlmIChtb25vbWVyU3ltYm9sID09PSBQSE9TUEhBVEUpXG4gICAgICAgIGFkanVzdFBob3NwaGF0ZU1vbm9tZXJHcmFwaChtb25vbWVyR3JhcGgpO1xuICAgICAgZWxzZVxuICAgICAgICBhZGp1c3RCYXNlTW9ub21lckdyYXBoKG1vbm9tZXJHcmFwaCk7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHRoZSAncmlnaHRtb3N0JyBjaGFpbi1leHRlbmRpbmcgci1ncm91cCBub2RlIGluIHRoZSBiYWNrYm9uZVxuICAgIGlmIChwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUEVQVElERSkge1xuICAgICAgc2V0U2hpZnRzKG1vbm9tZXJHcmFwaCwgcG9seW1lclR5cGUpO1xuICAgICAgcmVtb3ZlTm9kZUFuZEJvbmRzKG1vbm9tZXJHcmFwaCwgbW9ub21lckdyYXBoLm1ldGEuck5vZGVzWzFdKTtcbiAgICB9IGVsc2UgeyAvLyBudWNsZW90aWRlc1xuICAgICAgaWYgKG1vbm9tZXJTeW1ib2wgPT09IFJJQk9TRSB8fCBtb25vbWVyU3ltYm9sID09PSBERU9YWVJJQk9TRSkge1xuICAgICAgICAvLyByZW1vdmUgUjJcbiAgICAgICAgcmVtb3ZlTm9kZUFuZEJvbmRzKG1vbm9tZXJHcmFwaCwgbW9ub21lckdyYXBoLm1ldGEuck5vZGVzWzFdKTtcbiAgICAgICAgLy8gc2V0IHRlcm1pbmFsTm9kZTIgKG94eWdlbikgYXMgbmV3IFIyXG4gICAgICAgIG1vbm9tZXJHcmFwaC5tZXRhLnJOb2Rlc1sxXSA9IG1vbm9tZXJHcmFwaC5tZXRhLnRlcm1pbmFsTm9kZXNbMV07XG4gICAgICAgIHNldFRlcm1pbmFsTm9kZXMobW9ub21lckdyYXBoLmJvbmRzLCBtb25vbWVyR3JhcGgubWV0YSk7IC8vIHNldCB0ZXJtaW5hbCBub2RlcyBhbmV3XG4gICAgICAgIHNldFNoaWZ0cyhtb25vbWVyR3JhcGgsIHBvbHltZXJUeXBlKTtcbiAgICAgICAgLy8gcmVtb3ZlICduZXcnIFIyIChveHlnZW4pXG4gICAgICAgIHJlbW92ZU5vZGVBbmRCb25kcyhtb25vbWVyR3JhcGgsIG1vbm9tZXJHcmFwaC5tZXRhLnJOb2Rlc1sxXSk7XG4gICAgICAgIC8vIHJlbW92ZSBSMVxuICAgICAgICByZW1vdmVOb2RlQW5kQm9uZHMobW9ub21lckdyYXBoLCBtb25vbWVyR3JhcGgubWV0YS5yTm9kZXNbMF0pO1xuICAgICAgICAvLyByZW1vdmUgdGhlIGJyYW5jaGluZyByLWdyb3VwXG4gICAgICAgIHJlbW92ZU5vZGVBbmRCb25kcyhtb25vbWVyR3JhcGgsIG1vbm9tZXJHcmFwaC5tZXRhLnJOb2Rlc1syXSk7XG4gICAgICB9IGVsc2UgaWYgKG1vbm9tZXJTeW1ib2wgPT09IFBIT1NQSEFURSkge1xuICAgICAgICBtb25vbWVyR3JhcGgubWV0YS50ZXJtaW5hbE5vZGVzWzBdID0gbW9ub21lckdyYXBoLm1ldGEuck5vZGVzWzBdO1xuICAgICAgICBzaGlmdENvb3JkaW5hdGVzKFxuICAgICAgICAgIG1vbm9tZXJHcmFwaCxcbiAgICAgICAgICAtbW9ub21lckdyYXBoLmF0b21zLnhbbW9ub21lckdyYXBoLm1ldGEudGVybWluYWxOb2Rlc1swXSAtIDFdLFxuICAgICAgICAgIC1tb25vbWVyR3JhcGguYXRvbXMueVttb25vbWVyR3JhcGgubWV0YS50ZXJtaW5hbE5vZGVzWzBdIC0gMV1cbiAgICAgICAgKTtcbiAgICAgICAgc2V0U2hpZnRzKG1vbm9tZXJHcmFwaCwgcG9seW1lclR5cGUpO1xuICAgICAgICByZW1vdmVOb2RlQW5kQm9uZHMobW9ub21lckdyYXBoLCBtb25vbWVyR3JhcGgubWV0YS5yTm9kZXNbMV0pO1xuICAgICAgfSBlbHNlIHsgLy8gbnVjbGVvYmFzZXNcbiAgICAgICAgcmVtb3ZlTm9kZUFuZEJvbmRzKG1vbm9tZXJHcmFwaCwgbW9ub21lckdyYXBoLm1ldGEuck5vZGVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlSHlkcm9nZW4obW9ub21lckdyYXBoKTtcblxuICAgIHJldHVybiBtb25vbWVyR3JhcGg7XG4gIH1cbn1cblxuLy8gdG9kbzogc2RvY1xuZnVuY3Rpb24gZ2V0TW9ub21lck1ldGFkYXRhKGF0b21zOiBBdG9tcywgYm9uZHM6IEJvbmRzLCBjYXBHcm91cHM/OiBzdHJpbmdbXSwgY2FwR3JvdXBJZHhNYXA/OiBNYXA8bnVtYmVyLCBudW1iZXI+XG4pOiBNb25vbWVyTWV0YWRhdGEge1xuICBjb25zdCBtZXRhOiBNb25vbWVyTWV0YWRhdGEgPSB7XG4gICAgYmFja2JvbmVTaGlmdDogbnVsbCxcbiAgICBicmFuY2hTaGlmdDogbnVsbCxcbiAgICB0ZXJtaW5hbE5vZGVzOiBbXSxcbiAgICByTm9kZXM6IFtdLFxuICB9O1xuXG4gIC8vIGNvcnJlc3BvbmRzIHRvIE1PREUuU1RBTkRBUkRcbiAgY29uc3Qgc3RhbmRhcmRNb2RlID0gdHlwZW9mIGNhcEdyb3VwcyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNhcEdyb3VwSWR4TWFwICE9PSAndW5kZWZpbmVkJztcblxuICBpZiAoc3RhbmRhcmRNb2RlKSB7XG4gICAgc3Vic3RpdHV0ZUNhcEdyb3VwcyhhdG9tcywgY2FwR3JvdXBzISwgY2FwR3JvdXBJZHhNYXAhKTtcbiAgICBzZXRSTm9kZXMoY2FwR3JvdXBJZHhNYXAhLCBtZXRhKTtcbiAgfSBlbHNlIHsgLy8gdGhlIGNhc2UgdXNlZCBpbiBTZXF1ZW5jZVRyYW5zbGF0b3JcbiAgICAvLyB0b2RvOiB2ZXJpZnkgdGhhdCB0aGUgbW9ub21lcnMgYXJlIHByZXBhcmVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGlzIHdvcmtzXG4gICAgbWV0YS5yTm9kZXMgPSBbMCwgYXRvbXMueC5sZW5ndGhdO1xuICB9XG5cbiAgc2V0VGVybWluYWxOb2Rlcyhib25kcywgbWV0YSk7XG4gIHJldHVybiBtZXRhO1xufVxuXG4vKiBQYXJzZSBlbGVtZW50IHN5bWJvbHMgZm9yIFItZ3JvdXBzIGZyb20gdGhlIEhFTE0gbW9ub21lciBsaWJyYXJ5IFItZ3JvdXBzXG4gKiBmaWVsZCAgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUNhcEdyb3VwcyhyR3JvdXBPYmpMaXN0OiBhbnlbXSk6IHN0cmluZ1tdIHtcbiAgLy8gc3BlY2lmaWNhbGx5IGZvciBIRUxNQ29yZUxpYnJhcnlcbiAgLy8gY29uc2lkZXJlZCBvbmx5IG1vbm9hdG9taWMgcmdyb3Vwc1xuICAvLyBzdXBwb3NpbmcgdGhhdCBlbGVtZW50cyBpbiByR3JvdXBPYmpMaXN0IGFyZSBzb3J0ZWQgdy5yLnQuIHRoZSByZ3JvdXBzIGlkeFxuICAvLyB0b2RvOiBwb3NzaWJsZSBnZW5lcmFsaXphdGlvbnNcbiAgY29uc3QgY2FwR3JvdXBzQXJyYXk6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3Qgb2JqIG9mIHJHcm91cE9iakxpc3QpIHtcbiAgICBsZXQgY2FwR3JvdXA6IHN0cmluZyA9IG9ialtSR1JPVVBfRklFTERTLkNBUF9HUk9VUF9TTUlMRVNdO1xuXG4gICAgLy8gaW4gc29tZSBjYXNlcyB0aGUgc21pbGVzIGZpZWxkIGlzIHdyaXR0ZW4gd2l0aCB1cHBlcmNhc2VcbiAgICBpZiAoIWNhcEdyb3VwKVxuICAgICAgY2FwR3JvdXAgPSBvYmpbUkdST1VQX0ZJRUxEUy5DQVBfR1JPVVBfU01JTEVTX1VQUEVSQ0FTRV07XG4gICAgLy8gdG9kbzogdmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIG11bHRpLWVsZW1lbnQgY2FwIGdyb3Vwcywgb3IgY29uc2lkZXIgaG93IHRvXG4gICAgLy8gdHJhbnNmb3JtIHRoZW1cbiAgICBjYXBHcm91cCA9IGNhcEdyb3VwLnJlcGxhY2UoLyhcXFt8XFxdfFxcKnw6fFxcZCkvZywgJycpO1xuICAgIGlmIChjYXBHcm91cC5sZW5ndGggPiAxKSAvLyB0b2RvOiBjaGVjayBpZiBzdWNoIGNhc2VzIGFyZSBwb3NzaWJsZSwgcmVtb3ZlIGlmIG5vdFxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEZWZhdWx0IGNhcCBncm91cCBoYXMgbGVuZ3RoIG1vcmUgdGhhbiBvbmUnKTtcbiAgICBjYXBHcm91cHNBcnJheS5wdXNoKGNhcEdyb3VwKTtcbiAgfVxuICByZXR1cm4gY2FwR3JvdXBzQXJyYXk7XG59XG5cbi8qIFN1YnN0aXR1dGUgdGhlIGNhcCBncm91cCBlbGVtZW50cyBpbnN0ZWFkIG9mIFIjICovXG5mdW5jdGlvbiBzdWJzdGl0dXRlQ2FwR3JvdXBzKFxuICBhdG9tczogQXRvbXMsIGNhcEdyb3Vwczogc3RyaW5nW10sIGNhcEdyb3VwSWR4TWFwOiBNYXA8bnVtYmVyLCBudW1iZXI+XG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbbm9kZSwgY2FwSWR4XSBvZiBjYXBHcm91cElkeE1hcClcbiAgICBhdG9tcy5hdG9tVHlwZXNbbm9kZSAtIDFdID0gY2FwR3JvdXBzW2NhcElkeCAtIDFdOyAvLyAtMSBiZWNhdXNlIG1vbGZpbGUgaW5kZXhpbmcgc3RhcnRzIGZyb20gMVxufVxuXG4vL3RvZG86IGRvY1xuZnVuY3Rpb24gc2V0Uk5vZGVzKGNhcEdyb3VwSWR4TWFwOiBNYXA8bnVtYmVyLCBudW1iZXI+LCBtZXRhOiBNb25vbWVyTWV0YWRhdGEpOiB2b2lkIHtcbiAgbWV0YS5yTm9kZXMgPSBBcnJheS5mcm9tKGNhcEdyb3VwSWR4TWFwLmtleXMoKSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWV0YS5yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGNvbnN0IGogb2YgWzEsIDJdKSB7IC8vIDEgYW5kIDIgYnkgZGVmLiBjb3JyZXNwb25kIHRvICdsZWZ0L3JpZ2h0bW9zdCcgci1ub2Rlc1xuICAgICAgLy8gc3dhcCB0aGUgdmFsdWVzIGlmIG5lY2Vzc2FyeSwgc28gdGhhdCB0aGUgXCJsZWZ0bW9zdFwiIHItbm9kZSBpcyBhdCAwLFxuICAgICAgLy8gYW5kIHRoZSAncmlnaHRtb3N0JywgYXQgMVxuICAgICAgaWYgKGNhcEdyb3VwSWR4TWFwLmdldChtZXRhLnJOb2Rlc1tpXSkgPT09IGopIHtcbiAgICAgICAgY29uc3QgdG1wID0gbWV0YS5yTm9kZXNbaiAtIDFdO1xuICAgICAgICBtZXRhLnJOb2Rlc1tqIC0gMV0gPSBtZXRhLnJOb2Rlc1tpXTtcbiAgICAgICAgbWV0YS5yTm9kZXNbaV0gPSB0bXA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vdG9kbzogZG9jXG5mdW5jdGlvbiBzZXRUZXJtaW5hbE5vZGVzKGJvbmRzOiBCb25kcywgbWV0YTogTW9ub21lck1ldGFkYXRhKTogdm9pZCB7XG4gIGNvbnN0IHJOb2RlcyA9IG1ldGEuck5vZGVzO1xuICBtZXRhLnRlcm1pbmFsTm9kZXMgPSBuZXcgQXJyYXk8bnVtYmVyPihyTm9kZXMubGVuZ3RoKS5maWxsKDApO1xuICBjb25zdCB0ZXJtaW5hbE5vZGVzID0gbWV0YS50ZXJtaW5hbE5vZGVzO1xuICBjb25zdCBhdG9tUGFpcnMgPSBib25kcy5hdG9tUGFpcnM7XG4gIGxldCBpID0gMDtcbiAgbGV0IGogPSAwO1xuICB3aGlsZSAoKGkgPCBhdG9tUGFpcnMubGVuZ3RoKSAmJiBqIDwgdGVybWluYWxOb2Rlcy5sZW5ndGgpIHtcbiAgICAvLyByTm9kZXMgYXJyYXkgaXMgc29ydGVkIHNvIHRoYXQgaXRzIDB0aCBhbmQgMXN0IGVsZW1lbnRzIChpZiBib3RoXG4gICAgLy8gcHJlc2VudCkgY29ycmVzcG9uZCB0byB0aGUgY2hhaW4gZXh0ZW5kaW5nIChpLmUuIG5vdCBicmFuY2hpbmcpIHItZ3JvdXBzXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCB0ZXJtaW5hbE5vZGVzLmxlbmd0aDsgKytrKSB7XG4gICAgICBmb3IgKGxldCBsID0gMDsgbCA8IDI7ICsrbCkge1xuICAgICAgICBpZiAoYXRvbVBhaXJzW2ldW2xdID09PSByTm9kZXNba10pIHtcbiAgICAgICAgICB0ZXJtaW5hbE5vZGVzW2tdID0gYXRvbVBhaXJzW2ldWyhsICsgMSkgJSAyXTtcbiAgICAgICAgICBpZiAock5vZGVzLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgICB9XG4gICAgICAgICAgKytqO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgICsraTtcbiAgfVxufVxuXG4vL3RvZG86IGRvY1xuZnVuY3Rpb24gc2V0U2hpZnRzKG1vbEdyYXBoOiBNb2xHcmFwaCwgcG9seW1lclR5cGU6IEhFTE1fUE9MWU1FUl9UWVBFKTogdm9pZCB7XG4gIGlmIChtb2xHcmFwaC5tZXRhLnJOb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgbW9sR3JhcGgubWV0YS5iYWNrYm9uZVNoaWZ0ID0gZ2V0U2hpZnRCZXR3ZWVuTm9kZXMoXG4gICAgICBtb2xHcmFwaCwgbW9sR3JhcGgubWV0YS5yTm9kZXNbMV0gLSAxLFxuICAgICAgbW9sR3JhcGgubWV0YS50ZXJtaW5hbE5vZGVzWzBdIC0gMVxuICAgICk7XG4gIH1cblxuICBpZiAocG9seW1lclR5cGUgPT09IEhFTE1fUE9MWU1FUl9UWVBFLlJOQSAmJiBtb2xHcmFwaC5tZXRhLnJOb2Rlcy5sZW5ndGggPiAyKSB7XG4gICAgbW9sR3JhcGgubWV0YS5icmFuY2hTaGlmdCA9IGdldFNoaWZ0QmV0d2Vlbk5vZGVzKFxuICAgICAgbW9sR3JhcGgsIG1vbEdyYXBoLm1ldGEuck5vZGVzWzJdIC0gMSxcbiAgICAgIG1vbEdyYXBoLm1ldGEudGVybWluYWxOb2Rlc1swXSAtIDFcbiAgICApO1xuICB9XG59XG5cbi8qIFJldHVybnMgdGhlIHBhaXIgW3hTaGlmdCwgeVNoaWZ0XSBmb3Igc3BlY2lmaWVkIG5vZGUgaW5kaWNlcyAqL1xuZnVuY3Rpb24gZ2V0U2hpZnRCZXR3ZWVuTm9kZXMoXG4gIG1vbEdyYXBoOiBNb2xHcmFwaCwgcmlnaHROb2RlSWR4OiBudW1iZXIsIGxlZnROb2RlSWR4OiBudW1iZXJcbik6IG51bWJlcltdIHtcbiAgcmV0dXJuIFtcbiAgICBrZWVwUHJlY2lzaW9uKFxuICAgICAgbW9sR3JhcGguYXRvbXMueFtyaWdodE5vZGVJZHhdIC1cbiAgICAgIG1vbEdyYXBoLmF0b21zLnhbbGVmdE5vZGVJZHhdXG4gICAgKSxcbiAgICBrZWVwUHJlY2lzaW9uKFxuICAgICAgbW9sR3JhcGguYXRvbXMueVtyaWdodE5vZGVJZHhdIC1cbiAgICAgIG1vbEdyYXBoLmF0b21zLnlbbGVmdE5vZGVJZHhdXG4gICAgKSxcbiAgXTtcbn1cblxuLyogSGVscGVyIGZ1bmN0aW9uIG5lY2Vzc2FyeSB0byBidWlsZCBhIGNvcnJlY3QgVjMwMDAgbW9sZmlsZSBvdXQgb2YgVjIwMDAgd2l0aFxuICogc3BlY2lmaWVkIHItZ3JvdXBzKi9cbmZ1bmN0aW9uIHJlbW92ZVJHcm91cExpbmVzKG1vbGZpbGVWMks6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBiZWdpbiA9IG1vbGZpbGVWMksuaW5kZXhPZihWMktfQV9MSU5FLCAwKTtcbiAgaWYgKGJlZ2luID09PSAtMSlcbiAgICBiZWdpbiA9IG1vbGZpbGVWMksuaW5kZXhPZihWMktfUkdQX0xJTkUpO1xuICBjb25zdCBlbmQgPSBtb2xmaWxlVjJLLmluZGV4T2YoVjNLX0VORCwgYmVnaW4pO1xuICByZXR1cm4gbW9sZmlsZVYySy5zdWJzdHJpbmcoMCwgYmVnaW4pICsgbW9sZmlsZVYySy5zdWJzdHJpbmcoZW5kKTtcbn1cblxuLyogVjIwMDAgdG8gVjMwMDAgY29udmVydGVyICAqL1xuZnVuY3Rpb24gY29udmVydE1vbGZpbGVUb1YzSyhtb2xmaWxlVjJLOiBzdHJpbmcsIG1vZHVsZVJka2l0OiBhbnkpOiBzdHJpbmcge1xuICAvLyB0b2RvOiB0eXBlIG9mIG1vZHVsZVJka2l0XG4gIC8vIHRvZG86IGNvbnNpZGVyIHRoZSB1c2Ugb2Ygc3RhbmRhcmQgQ2hlbSBjb252ZXJ0ZXIgKHJlbGllcyBvbiBjcmVhdGlvbiBvZiBtb2R1bGVSZGtpdCBvbiBlYWNoIGl0ZXJhdGlvbiwgdGhvdWdoKVxuICBjb25zdCBtb2xPYmogPSBtb2R1bGVSZGtpdC5nZXRfbW9sKG1vbGZpbGVWMkspO1xuICBjb25zdCBtb2xmaWxlVjNLID0gbW9sT2JqLmdldF92M0ttb2xibG9jaygpO1xuICBtb2xPYmouZGVsZXRlKCk7XG4gIHJldHVybiBtb2xmaWxlVjNLO1xufVxuXG4vKiBQYXJzZSBWMzAwMCBib25kIGJsb2NrIGFuZCBjb25zdHJ1Y3QgdGhlIEJvbmRzIG9iamVjdCAqL1xuZnVuY3Rpb24gcGFyc2VCb25kQmxvY2sobW9sZmlsZVYzSzogc3RyaW5nLCBib25kQ291bnQ6IG51bWJlcik6IEJvbmRzIHtcbiAgLy8gdG9kbzogY29uc2lkZXIgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBzaW1wbGUgbGVmdG1vc3QvcmlnaHRtb3N0IGNob2ljZVxuICAvLyB0b2RvOiBjb25zaWRlciB0aGUgY2FzZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBjb25zZXF1ZW50IE0gIFJHUCBsaW5lcyxcbiAgLy8gbGlrZSBpbiBIRUxNQ29yZUxpYnJhcnkgbnVjbGVvdGlkZXNcblxuICBjb25zdCBib25kVHlwZXM6IG51bWJlcltdID0gbmV3IEFycmF5KGJvbmRDb3VudCk7XG4gIGNvbnN0IGF0b21QYWlyczogbnVtYmVyW11bXSA9IG5ldyBBcnJheShib25kQ291bnQpO1xuICBjb25zdCBib25kQ29uZmlndXJhdGlvbiA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIGNvbnN0IGt3YXJncyA9IG5ldyBNYXA8bnVtYmVyLCBzdHJpbmc+KCk7XG5cbiAgbGV0IGJlZ2luID0gbW9sZmlsZVYzSy5pbmRleE9mKFYzS19CRUdJTl9CT05EX0JMT0NLKTtcbiAgYmVnaW4gPSBtb2xmaWxlVjNLLmluZGV4T2YoJ1xcbicsIGJlZ2luKTtcbiAgbGV0IGVuZCA9IGJlZ2luO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJvbmRDb3VudDsgKytpKSB7XG4gICAgLy8gcGFyc2UgYm9uZCB0eXBlIGFuZCBhdG9tIHBhaXJcbiAgICBjb25zdCBwYXJzZWRWYWx1ZXM6IG51bWJlcltdID0gbmV3IEFycmF5KDMpO1xuICAgIGJlZ2luID0gbW9sZmlsZVYzSy5pbmRleE9mKFYzS19CRUdJTl9EQVRBX0xJTkUsIGVuZCkgKyBWM0tfSURYX1NISUZUO1xuICAgIGVuZCA9IG1vbGZpbGVWM0suaW5kZXhPZignICcsIGJlZ2luKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IDM7ICsraykge1xuICAgICAgYmVnaW4gPSBlbmQgKyAxO1xuICAgICAgZW5kID0gTWF0aC5taW4obW9sZmlsZVYzSy5pbmRleE9mKCdcXG4nLCBiZWdpbiksIG1vbGZpbGVWM0suaW5kZXhPZignICcsIGJlZ2luKSk7XG4gICAgICBwYXJzZWRWYWx1ZXNba10gPSBwYXJzZUludChtb2xmaWxlVjNLLnNsaWNlKGJlZ2luLCBlbmQpKTtcbiAgICB9XG4gICAgYm9uZFR5cGVzW2ldID0gcGFyc2VkVmFsdWVzWzBdO1xuICAgIGF0b21QYWlyc1tpXSA9IHBhcnNlZFZhbHVlcy5zbGljZSgxKTtcblxuICAgIC8vIHBhcnNlIGtleXdvcmQgYXJndW1lbnRzXG4gICAgY29uc3QgZW5kT2ZMaW5lID0gbW9sZmlsZVYzSy5pbmRleE9mKCdcXG4nLCBiZWdpbik7XG4gICAgbGV0IGxpbmVSZW1haW5kZXIgPSBtb2xmaWxlVjNLLnNsaWNlKGVuZCwgZW5kT2ZMaW5lKTtcbiAgICBsZXQgYmVnaW5DZmcgPSBsaW5lUmVtYWluZGVyLmluZGV4T2YoVjNLX0JPTkRfQ09ORklHKTtcbiAgICBpZiAoYmVnaW5DZmcgIT09IC0xKSB7XG4gICAgICBiZWdpbkNmZyA9IGxpbmVSZW1haW5kZXIuaW5kZXhPZignPScsIGJlZ2luQ2ZnKSArIDE7XG4gICAgICBsZXQgZW5kQ2ZnID0gbGluZVJlbWFpbmRlci5pbmRleE9mKCcgJywgYmVnaW5DZmcpO1xuICAgICAgaWYgKGVuZENmZyA9PT0gLTEpXG4gICAgICAgIGVuZENmZyA9IGxpbmVSZW1haW5kZXIubGVuZ3RoO1xuICAgICAgY29uc3QgYm9uZENvbmZpZyA9IHBhcnNlSW50KGxpbmVSZW1haW5kZXIuc2xpY2UoYmVnaW5DZmcsIGVuZENmZykpO1xuICAgICAgYm9uZENvbmZpZ3VyYXRpb24uc2V0KGksIGJvbmRDb25maWcpO1xuICAgICAgY29uc3QgcmVtb3ZlZFN1YnN0cmluZyA9IFYzS19CT05EX0NPTkZJRyArIGJvbmRDb25maWcudG9TdHJpbmcoKTtcbiAgICAgIGxpbmVSZW1haW5kZXIgPSBsaW5lUmVtYWluZGVyLnJlcGxhY2UocmVtb3ZlZFN1YnN0cmluZywgJycpO1xuICAgIH1cbiAgICBpZiAoIWxpbmVSZW1haW5kZXIpXG4gICAgICBrd2FyZ3Muc2V0KGksIGxpbmVSZW1haW5kZXIpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBib25kVHlwZXM6IGJvbmRUeXBlcyxcbiAgICBhdG9tUGFpcnM6IGF0b21QYWlycyxcbiAgICBib25kQ29uZmlndXJhdGlvbjogYm9uZENvbmZpZ3VyYXRpb24sXG4gICAga3dhcmdzOiBrd2FyZ3MsXG4gIH07XG59XG5cbi8qIENvbnN0cnVjdHMgbWFwcGluZyBvZiByLWdyb3VwIG5vZGVzIHRvIGRlZmF1bHQgY2FwR3JvdXBzLCBhbGwgbnVtZXJhdGlvbiBzdGFydGluZyBmcm9tIDEuXG4gKiBBY2NvcmRpbmcgdG8gaHR0cHM6Ly9wdWJzLmFjcy5vcmcvZG9pLzEwLjEwMjEvY2kzMDAxOTI1LCBSMSBhbmQgUjIgYXJlIHRoZSBjaGFpbiBleHRlbmRpbmcgYXR0YWNobWVudCBwb2ludHMsXG4gKiB3aGlsZSBSMyBpcyB0aGUgYnJhbmNoaW5nIGF0dGFjaG1lbnQgcG9pbnQuICovXG5mdW5jdGlvbiBwYXJzZUNhcEdyb3VwSWR4TWFwKG1vbGZpbGVWMks6IHN0cmluZyk6IE1hcDxudW1iZXIsIG51bWJlcj4ge1xuICBjb25zdCBjYXBHcm91cElkeE1hcCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG5cbiAgLy8gcGFyc2UgQS1saW5lcyAoUk5BKVxuICBsZXQgYmVnaW4gPSBtb2xmaWxlVjJLLmluZGV4T2YoVjJLX0FfTElORSwgMCk7XG4gIGxldCBlbmQgPSBiZWdpbjtcbiAgd2hpbGUgKGJlZ2luICE9PSAtMSkge1xuICAgIC8vIHBhcnNlIHRoZSByTm9kZSB0byB3aGljaCB0aGUgY2FwIGdyb3VwIGlzIGF0dGFjaGVkXG4gICAgZW5kID0gbW9sZmlsZVYySy5pbmRleE9mKCdcXG4nLCBiZWdpbik7XG4gICAgY29uc3Qgck5vZGUgPSBwYXJzZUludChtb2xmaWxlVjJLLnN1YnN0cmluZyhiZWdpbiwgZW5kKS5yZXBsYWNlKC9eQVxccysvLCAnJykpO1xuXG4gICAgLy8gcGFyc2UgdGhlIGNhcEdyb3VwIGluZGV4XG4gICAgYmVnaW4gPSBtb2xmaWxlVjJLLmluZGV4T2YoJ1InLCBlbmQpO1xuICAgIGVuZCA9IG1vbGZpbGVWMksuaW5kZXhPZignXFxuJywgYmVnaW4pO1xuICAgIGNvbnN0IGNhcEdyb3VwID0gcGFyc2VJbnQobW9sZmlsZVYySy5zdWJzdHJpbmcoYmVnaW4sIGVuZCkucmVwbGFjZSgvXlIvLCAnJykpO1xuICAgIGNhcEdyb3VwSWR4TWFwLnNldChyTm9kZSwgY2FwR3JvdXApO1xuXG4gICAgYmVnaW4gPSBtb2xmaWxlVjJLLmluZGV4T2YoVjJLX0FfTElORSwgZW5kKTtcbiAgfVxuXG4gIC8vIHBhcnNlIFJHUCBsaW5lcyAobWF5IGJlIG1vcmUgdGhhbiBvbmUgaW4gUk5BIG1vbm9tZXJzKVxuICBiZWdpbiA9IG1vbGZpbGVWMksuaW5kZXhPZihWMktfUkdQX0xJTkUsIDApO1xuICBlbmQgPSBtb2xmaWxlVjJLLmluZGV4T2YoJ1xcbicsIGJlZ2luKTtcbiAgd2hpbGUgKGJlZ2luICE9PSAtMSkge1xuICAgIGJlZ2luICs9IFYyS19SR1BfU0hJRlQ7XG4gICAgZW5kID0gbW9sZmlsZVYySy5pbmRleE9mKCdcXG4nLCBiZWdpbik7XG4gICAgY29uc3QgcmdwU3RyaW5nUGFyc2VkID0gbW9sZmlsZVYySy5zdWJzdHJpbmcoYmVnaW4sIGVuZClcbiAgICAgIC5yZXBsYWNlQWxsKC9cXHMrL2csICcgJylcbiAgICAgIC5zcGxpdCgnICcpO1xuICAgIGNvbnN0IHJncEluZGljZXNBcnJheSA9IHJncFN0cmluZ1BhcnNlZC5tYXAoKGVsKSA9PiBwYXJzZUludChlbCkpXG4gICAgICAuc2xpY2UoMSk7IC8vIHNsaWNlIGZyb20gMSBiZWNhdXNlIHRoZSAxc3QgdmFsdWUgaXMgdGhlIG51bWJlciBvZiBwYWlycyBpbiB0aGUgbGluZVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmdwSW5kaWNlc0FycmF5Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAvLyBub3RpY2U6IHRoZXJlIG1heSBiZSBjb25mbGljdGluZyBjYXAgZ3JvdXAgZGVmaW5pdGlvbnMsIGxpa2UgMy1PLU1ldGh5bHJpYm9zZSAoMiw1IGNvbm5lY3Rpdml0eSlcbiAgICAgIC8vICh0aGUgbGFzdCBtb25vbWVyIGluIEhFTE1Db3JlTGlicmFyeSlcbiAgICAgIC8vIHRoZXJlIHRoZSBpbmRpY2VzIG9mIGNhcCBncm91cHMgYXJlIHNlbGYtY29udHJhZGljdG9yeVxuICAgICAgLy8gdG9kbzogY2xhcmlmeSB3aHkgc3VjaCBzaXR1YXRpb25zIG9jY3VyIGluIHByaW5jaXBsZVxuICAgICAgaWYgKGNhcEdyb3VwSWR4TWFwLmhhcyhyZ3BJbmRpY2VzQXJyYXlbaV0pICYmIGNhcEdyb3VwSWR4TWFwLmdldChyZ3BJbmRpY2VzQXJyYXlbaV0pICE9PSByZ3BJbmRpY2VzQXJyYXlbaSArIDFdKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHItZ3JvdXAgaW5kZXggJHtyZ3BJbmRpY2VzQXJyYXlbaV19IGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZWApO1xuICAgICAgZWxzZVxuICAgICAgICBjYXBHcm91cElkeE1hcC5zZXQocmdwSW5kaWNlc0FycmF5W2ldLCByZ3BJbmRpY2VzQXJyYXlbaSArIDFdKTtcbiAgICB9XG5cbiAgICBiZWdpbiA9IG1vbGZpbGVWMksuaW5kZXhPZihWMktfUkdQX0xJTkUsIGVuZCk7XG4gIH1cblxuICByZXR1cm4gY2FwR3JvdXBJZHhNYXA7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQXRvbUFuZEJvbmRDb3VudHMobW9sZmlsZVYzSzogc3RyaW5nKTogeyBhdG9tQ291bnQ6IG51bWJlciwgYm9uZENvdW50OiBudW1iZXIgfSB7XG4gIG1vbGZpbGVWM0sgPSBtb2xmaWxlVjNLLnJlcGxhY2VBbGwoJ1xccicsICcnKTsgLy8gdG8gaGFuZGxlIG9sZCBhbmQgbmV3IHNkZiBzdGFuZGFyZHNcblxuICAvLyBwYXJzZSBhdG9tIGNvdW50XG4gIGxldCBiZWdpbiA9IG1vbGZpbGVWM0suaW5kZXhPZihWM0tfQkVHSU5fQ09VTlRTX0xJTkUpICsgVjNLX0NPVU5UU19TSElGVDtcbiAgbGV0IGVuZCA9IG1vbGZpbGVWM0suaW5kZXhPZignICcsIGJlZ2luICsgMSk7XG4gIGNvbnN0IG51bU9mQXRvbXMgPSBwYXJzZUludChtb2xmaWxlVjNLLnN1YnN0cmluZyhiZWdpbiwgZW5kKSk7XG5cbiAgLy8gcGFyc2UgYm9uZCBjb3VudFxuICBiZWdpbiA9IGVuZCArIDE7XG4gIGVuZCA9IG1vbGZpbGVWM0suaW5kZXhPZignICcsIGJlZ2luICsgMSk7XG4gIGNvbnN0IG51bU9mQm9uZHMgPSBwYXJzZUludChtb2xmaWxlVjNLLnN1YnN0cmluZyhiZWdpbiwgZW5kKSk7XG5cbiAgcmV0dXJuIHthdG9tQ291bnQ6IG51bU9mQXRvbXMsIGJvbmRDb3VudDogbnVtT2ZCb25kc307XG59XG5cbi8qIFBhcnNlIFYzMDAwIGF0b20gYmxvY2sgYW5kIHJldHVybiBBdG9tcyBvYmplY3QuIE5PVElDRTogb25seSBhdG9tVHlwZXMsIHgsIHlcbiAqIGFuZCBrd2FyZ3MgZmllbGRzIGFyZSBzZXQgaW4gdGhlIHJldHVybiB2YWx1ZSwgd2l0aCBvdGhlciBmaWVsZHMgZHVtbXkgKi9cbmZ1bmN0aW9uIHBhcnNlQXRvbUJsb2NrKG1vbGZpbGVWM0s6IHN0cmluZywgYXRvbUNvdW50OiBudW1iZXIpOiBBdG9tcyB7XG4gIGNvbnN0IGF0b21UeXBlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoYXRvbUNvdW50KTtcbiAgY29uc3QgeDogbnVtYmVyW10gPSBuZXcgQXJyYXkoYXRvbUNvdW50KTtcbiAgY29uc3QgeTogbnVtYmVyW10gPSBuZXcgQXJyYXkoYXRvbUNvdW50KTtcbiAgY29uc3Qga3dhcmdzOiBzdHJpbmdbXSA9IG5ldyBBcnJheShhdG9tQ291bnQpO1xuXG4gIGxldCBiZWdpbiA9IG1vbGZpbGVWM0suaW5kZXhPZihWM0tfQkVHSU5fQVRPTV9CTE9DSyk7IC8vIFYzMDAwIGF0b21zIGJsb2NrXG4gIGJlZ2luID0gbW9sZmlsZVYzSy5pbmRleE9mKCdcXG4nLCBiZWdpbik7XG4gIGxldCBlbmQgPSBiZWdpbjtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0b21Db3VudDsgaSsrKSB7XG4gICAgYmVnaW4gPSBtb2xmaWxlVjNLLmluZGV4T2YoVjNLX0JFR0lOX0RBVEFfTElORSwgYmVnaW4pICsgVjNLX0lEWF9TSElGVDtcbiAgICBlbmQgPSBtb2xmaWxlVjNLLmluZGV4T2YoJyAnLCBiZWdpbik7IC8vIHNraXAgdGhlIGlkeCByb3dcblxuICAgIC8vIHBhcnNlIGF0b20gdHlwZVxuICAgIGJlZ2luID0gZW5kICsgMTtcbiAgICBlbmQgPSBtb2xmaWxlVjNLLmluZGV4T2YoJyAnLCBiZWdpbik7XG4gICAgYXRvbVR5cGVzW2ldID0gbW9sZmlsZVYzSy5zdWJzdHJpbmcoYmVnaW4sIGVuZCk7XG5cbiAgICAvLyBwYXJzZSBYIGFuZCBZIGNvb3JkaW5hdGVzIG9mIHRoZSBhdG9tXG4gICAgY29uc3QgY29vcmRpbmF0ZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoMik7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCAyOyArK2spIHtcbiAgICAgIGJlZ2luID0gZW5kICsgMTtcbiAgICAgIGVuZCA9IG1vbGZpbGVWM0suaW5kZXhPZignICcsIGJlZ2luKTtcbiAgICAgIGNvb3JkaW5hdGVba10gPSBwYXJzZUZsb2F0KG1vbGZpbGVWM0suc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTtcbiAgICB9XG4gICAgeFtpXSA9IGNvb3JkaW5hdGVbMF07XG4gICAgeVtpXSA9IGNvb3JkaW5hdGVbMV07XG5cbiAgICAvLyBwYXJzZSB0aGUgcmVtYWluaW5nIHBvc3NpYmxlIGtleXdvcmQgYXJndW1lbnRzXG4gICAgYmVnaW4gPSBlbmQ7XG4gICAgZW5kID0gbW9sZmlsZVYzSy5pbmRleE9mKCdcXG4nLCBiZWdpbikgKyAxO1xuICAgIGt3YXJnc1tpXSA9IG1vbGZpbGVWM0suc2xpY2UoYmVnaW4sIGVuZCk7XG5cbiAgICBiZWdpbiA9IGVuZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXRvbVR5cGVzOiBhdG9tVHlwZXMsXG4gICAgeDogeCxcbiAgICB5OiB5LFxuICAgIGt3YXJnczoga3dhcmdzLFxuICB9O1xufVxuXG4vKiBSZW1vdmUgaHlkcm9nZW4gbm9kZXMgKi9cbmZ1bmN0aW9uIHJlbW92ZUh5ZHJvZ2VuKG1vbm9tZXJHcmFwaDogTW9sR3JhcGgpOiB2b2lkIHtcbiAgbGV0IGkgPSAwO1xuICB3aGlsZSAoaSA8IG1vbm9tZXJHcmFwaC5hdG9tcy5hdG9tVHlwZXMubGVuZ3RoKSB7XG4gICAgaWYgKG1vbm9tZXJHcmFwaC5hdG9tcy5hdG9tVHlwZXNbaV0gPT09IEhZRFJPR0VOKSB7XG4gICAgICByZW1vdmVOb2RlQW5kQm9uZHMobW9ub21lckdyYXBoLCBpICsgMSk7IC8vIGkgKyAxIGJlY2F1c2UgbW9sZmlsZSBub2RlIGluZGV4aW5nIHN0YXJ0cyBmcm9tIDFcbiAgICAgIC0taTtcbiAgICAgIC8vIG1vbm9tZXJHcmFwaC5hdG9tcy5hdG9tVHlwZXNbaV0gPSAnTGknO1xuICAgIH1cbiAgICArK2k7XG4gIH1cbn1cblxuLyogUmVtb3ZlIG5vZGUgJ3JlbW92ZWROb2RlJyBhbmQgdGhlIGFzc29jaWF0ZWQgYm9uZHMuIE5vdGljZSwgbnVtZXJhdGlvbiBvZlxuICogbm9kZXMgaW4gbW9sZmlsZXMgc3RhcnRzIGZyb20gMSwgbm90IDAgKi9cbmZ1bmN0aW9uIHJlbW92ZU5vZGVBbmRCb25kcyhtb25vbWVyR3JhcGg6IE1vbEdyYXBoLCByZW1vdmVkTm9kZT86IG51bWJlcik6IHZvaWQge1xuICBpZiAodHlwZW9mIHJlbW92ZWROb2RlICE9PSAndW5kZWZpbmVkJykge1xuICAgIGNvbnN0IHJlbW92ZWROb2RlSWR4ID0gcmVtb3ZlZE5vZGUgLSAxO1xuICAgIGNvbnN0IGF0b21zID0gbW9ub21lckdyYXBoLmF0b21zO1xuICAgIGNvbnN0IGJvbmRzID0gbW9ub21lckdyYXBoLmJvbmRzO1xuICAgIGNvbnN0IG1ldGEgPSBtb25vbWVyR3JhcGgubWV0YTtcblxuICAgIC8vIHJlbW92ZSB0aGUgbm9kZSBmcm9tIGF0b21zXG4gICAgYXRvbXMuYXRvbVR5cGVzLnNwbGljZShyZW1vdmVkTm9kZUlkeCwgMSk7XG4gICAgYXRvbXMueC5zcGxpY2UocmVtb3ZlZE5vZGVJZHgsIDEpO1xuICAgIGF0b21zLnkuc3BsaWNlKHJlbW92ZWROb2RlSWR4LCAxKTtcbiAgICBhdG9tcy5rd2FyZ3Muc3BsaWNlKHJlbW92ZWROb2RlSWR4LCAxKTtcblxuICAgIC8vIHVwZGF0ZSB0aGUgdmFsdWVzIG9mIHRlcm1pbmFsIGFuZCByLWdyb3VwIG5vZGVzIGlmIG5lY2Vzc2FyeVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWV0YS50ZXJtaW5hbE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAobWV0YS50ZXJtaW5hbE5vZGVzW2ldID4gcmVtb3ZlZE5vZGUpXG4gICAgICAgIC0tbWV0YS50ZXJtaW5hbE5vZGVzW2ldO1xuICAgICAgZWxzZSBpZiAobWV0YS50ZXJtaW5hbE5vZGVzW2ldID09PSByZW1vdmVkTm9kZSlcbiAgICAgICAgbWV0YS50ZXJtaW5hbE5vZGVzW2ldID0gLTE7IC8vIHNlbnRpbmVsIHRvIG1hcmsgdGhlIHZhbHVlIGFzIHJlbW92ZWRcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhLnJOb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKG1ldGEuck5vZGVzW2ldID4gcmVtb3ZlZE5vZGUpXG4gICAgICAgIC0tbWV0YS5yTm9kZXNbaV07XG4gICAgICBlbHNlIGlmIChtZXRhLnJOb2Rlc1tpXSA9PT0gcmVtb3ZlZE5vZGUpXG4gICAgICAgIG1ldGEuck5vZGVzW2ldID0gLTE7IC8vIHNlbnRpbmVsIHRvIG1hcmsgdGhlIHZhbHVlIGFzIHJlbW92ZWRcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgaW5kaWNlcyBvZiBhdG9tcyBpbiBib25kc1xuICAgIGxldCBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGJvbmRzLmF0b21QYWlycy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGZpcnN0QXRvbSA9IGJvbmRzLmF0b21QYWlyc1tpXVswXTtcbiAgICAgIGNvbnN0IHNlY29uZEF0b20gPSBib25kcy5hdG9tUGFpcnNbaV1bMV07XG4gICAgICBpZiAoZmlyc3RBdG9tID09PSByZW1vdmVkTm9kZSB8fCBzZWNvbmRBdG9tID09PSByZW1vdmVkTm9kZSkge1xuICAgICAgICBib25kcy5hdG9tUGFpcnMuc3BsaWNlKGksIDEpO1xuICAgICAgICBib25kcy5ib25kVHlwZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICBpZiAoYm9uZHMuYm9uZENvbmZpZ3VyYXRpb24uaGFzKGkpKVxuICAgICAgICAgIGJvbmRzLmJvbmRDb25maWd1cmF0aW9uLmRlbGV0ZShpKTtcbiAgICAgICAgaWYgKGJvbmRzLmt3YXJncy5oYXMoaSkpXG4gICAgICAgICAgYm9uZHMua3dhcmdzLmRlbGV0ZShpKTtcbiAgICAgICAgLS1pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYm9uZHMuYXRvbVBhaXJzW2ldWzBdID0gKGZpcnN0QXRvbSA+IHJlbW92ZWROb2RlKSA/IGZpcnN0QXRvbSAtIDEgOiBmaXJzdEF0b207XG4gICAgICAgIGJvbmRzLmF0b21QYWlyc1tpXVsxXSA9IChzZWNvbmRBdG9tID4gcmVtb3ZlZE5vZGUpID8gc2Vjb25kQXRvbSAtIDEgOiBzZWNvbmRBdG9tO1xuICAgICAgfVxuICAgICAgKytpO1xuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBib25kQ29uZmlndXJhdGlvbiBhbmQga3dhcmdzIGtleXNcbiAgICBsZXQga2V5cyA9IEFycmF5LmZyb20oYm9uZHMuYm9uZENvbmZpZ3VyYXRpb24ua2V5cygpKTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGJvbmRzLmJvbmRDb25maWd1cmF0aW9uLmhhcyhrZXkpICYmIGtleSA+IHJlbW92ZWROb2RlSWR4KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYm9uZHMuYm9uZENvbmZpZ3VyYXRpb24uZ2V0KGtleSkhO1xuICAgICAgICBib25kcy5ib25kQ29uZmlndXJhdGlvbi5kZWxldGUoa2V5KTtcbiAgICAgICAgYm9uZHMuYm9uZENvbmZpZ3VyYXRpb24uc2V0KGtleSAtIDEsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBrZXlzID0gQXJyYXkuZnJvbShib25kcy5rd2FyZ3Mua2V5cygpKTtcbiAgICBrZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKGJvbmRzLmt3YXJncy5oYXMoa2V5KSAmJiBrZXkgPiByZW1vdmVkTm9kZUlkeCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGJvbmRzLmt3YXJncy5nZXQoa2V5KSE7XG4gICAgICAgIGJvbmRzLmt3YXJncy5kZWxldGUoa2V5KTtcbiAgICAgICAgYm9uZHMua3dhcmdzLnNldChrZXkgLSAxLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLy8gdG9kbzogcmV3cml0ZSBkZXNjcmlwdGlvblxuLyogQWRqdXN0IHRoZSAocGVwdGlkZSkgbW9ub21lciBncmFwaCBzbyB0aGF0IGl0IGhhcyBzdGFuZGFyZCBmb3JtICAqL1xuZnVuY3Rpb24gYWRqdXN0UGVwdGlkZU1vbm9tZXJHcmFwaChtb25vbWVyOiBNb2xHcmFwaCk6IHZvaWQge1xuICBjb25zdCBub2RlT25lSWR4ID0gbW9ub21lci5tZXRhLnRlcm1pbmFsTm9kZXNbMF0gLSAxOyAvLyBub2RlIGluZGV4aW5nIGluIG1vbGZpbGVzIHN0YXJ0cyBmcm9tIDFcbiAgY29uc3Qgbm9kZVR3b0lkeCA9IG1vbm9tZXIubWV0YS5yTm9kZXNbMF0gLSAxO1xuICBjb25zdCB4ID0gbW9ub21lci5hdG9tcy54O1xuICBjb25zdCB5ID0gbW9ub21lci5hdG9tcy55O1xuXG4gIC8vIHBsYWNlIG5vZGVPbmUgYXQgb3JpZ2luXG4gIHNoaWZ0Q29vcmRpbmF0ZXMobW9ub21lciwgLXhbbm9kZU9uZUlkeF0sIC15W25vZGVPbmVJZHhdKTtcblxuICAvLyBhbmdsZSBpcyBtZWFzdXJlZCBiZXR3ZWVuIE9ZIGFuZCB0aGUgcm90YXRlZCBub2RlXG4gIGNvbnN0IGFuZ2xlID0gZmluZEFuZ2xlV2l0aE9ZKHhbbm9kZVR3b0lkeF0sIHlbbm9kZVR3b0lkeF0pO1xuXG4gIC8vIHJvdGF0ZSB0aGUgY2VudGVyZWQgZ3JhcGgsIHNvIHRoYXQgJ25vZGVUd28nIGVuZHMgdXAgb24gdGhlIHBvc2l0aXZlIHJheSBvZiBPWVxuICByb3RhdGVDZW50ZXJlZEdyYXBoKG1vbm9tZXIuYXRvbXMsIC1hbmdsZSk7XG5cbiAgaWYgKHhbbW9ub21lci5tZXRhLnJOb2Rlc1sxXSAtIDFdIDwgMClcbiAgICBmbGlwTW9ub21lckFyb3VuZE9ZKG1vbm9tZXIpO1xuXG4gIGNvbnN0IGRvdWJsZUJvbmRlZE94eWdlbiA9IGZpbmREb3VibGVCb25kZWRDYXJib255bE94eWdlbihtb25vbWVyKTtcblxuICAvLyBmbGlwIGNhcmJveHlsIGFuZCBSIGlmIG5lY2Vzc2FyeVxuICBmbGlwQ2FyYm94eWxBbmRSYWRpY2FsKG1vbm9tZXIsIGRvdWJsZUJvbmRlZE94eWdlbik7XG5cbiAgLy8gZmxpcCBoeWRyb3h5bCBncm91cCB3aXRoIGRvdWJsZS1ib3VuZCBPIGluc2lkZSBjYXJib3h5bCBncm91cCBpZiBuZWNlc3NhcnlcbiAgZmxpcEh5ZHJveGlsR3JvdXAobW9ub21lciwgZG91YmxlQm9uZGVkT3h5Z2VuKTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0UGhvc3BoYXRlTW9ub21lckdyYXBoKG1vbm9tZXI6IE1vbEdyYXBoKTogdm9pZCB7XG4gIGNvbnN0IG5vZGVPbmVJZHggPSBtb25vbWVyLm1ldGEudGVybWluYWxOb2Rlc1swXSAtIDE7IC8vIG5vZGUgaW5kZXhpbmcgaW4gbW9sZmlsZXMgc3RhcnRzIGZyb20gMVxuICAvLyBjb25zdCBub2RlVHdvSWR4ID0gbW9ub21lci5tZXRhLnJOb2Rlc1swXSAtIDE7XG4gIGNvbnN0IHggPSBtb25vbWVyLmF0b21zLng7XG4gIGNvbnN0IHkgPSBtb25vbWVyLmF0b21zLnk7XG5cbiAgLy8gcGxhY2Ugbm9kZU9uZSBhdCBvcmlnaW5cbiAgc2hpZnRDb29yZGluYXRlcyhtb25vbWVyLCAteFtub2RlT25lSWR4XSwgLXlbbm9kZU9uZUlkeF0pO1xuXG4gIC8vIC8vIGFuZ2xlIGlzIG1lYXN1cmVkIGJldHdlZW4gT1kgYW5kIHRoZSByb3RhdGVkIG5vZGVcbiAgLy8gY29uc3QgYW5nbGUgPSBmaW5kQW5nbGVXaXRoT1koeFtub2RlVHdvSWR4XSwgeVtub2RlVHdvSWR4XSk7XG5cbiAgLy8gLy8gcm90YXRlIHRoZSBjZW50ZXJlZCBncmFwaCwgc28gdGhhdCAnbm9kZVR3bycgZW5kcyB1cCBvbiB0aGUgcG9zaXRpdmUgcmF5IG9mIE9ZXG4gIC8vIHJvdGF0ZUNlbnRlcmVkR3JhcGgobW9ub21lci5hdG9tcywgLWFuZ2xlKTtcblxuICAvLyBpZiAoeFttb25vbWVyLm1ldGEuck5vZGVzWzFdIC0gMV0gPCAwKVxuICAvLyAgIGZsaXBNb25vbWVyQXJvdW5kT1kobW9ub21lcik7XG5cbiAgLy8gY29uc3QgZG91YmxlQm9uZGVkT3h5Z2VuID0gZmluZERvdWJsZUJvbmRlZENhcmJvbnlsT3h5Z2VuKG1vbm9tZXIpO1xuXG4gIC8vIC8vIGZsaXAgY2FyYm94eWwgYW5kIFIgaWYgbmVjZXNzYXJ5XG4gIC8vIGZsaXBDYXJib3h5bEFuZFJhZGljYWwobW9ub21lciwgZG91YmxlQm9uZGVkT3h5Z2VuKTtcblxuICAvLyAvLyBmbGlwIGh5ZHJveHlsIGdyb3VwIHdpdGggZG91YmxlLWJvdW5kIE8gaW5zaWRlIGNhcmJveHlsIGdyb3VwIGlmIG5lY2Vzc2FyeVxuICAvLyBmbGlwSHlkcm94aWxHcm91cChtb25vbWVyLCBkb3VibGVCb25kZWRPeHlnZW4pO1xufVxuXG4vKiBBZGp1c3QgYSBiYWNrYm9uZSBncmFwaCBzbyB0aGF0IG5vZGVPbmUgaXMgYXQgb3JpZ2luIGFuZCBub2RlVHdvIGlzIGF0IE9YLlxuICogTm90aWNlOiBub2RlIGluZGV4aW5nIGluIG1vbGZpbGVzIHN0YXJ0cyBmcm9tIDEgKi9cbmZ1bmN0aW9uIGFkanVzdEJhY2tib25lTW9ub21lckdyYXBoKFxuICBtb25vbWVyOiBNb2xHcmFwaCwgbm9kZU9uZUlkeDogbnVtYmVyLCBub2RlVHdvSWR4OiBudW1iZXJcbik6IHZvaWQge1xuICBjb25zdCB4ID0gbW9ub21lci5hdG9tcy54O1xuICBjb25zdCB5ID0gbW9ub21lci5hdG9tcy55O1xuXG4gIC8vIHBsYWNlIG5vZGVPbmUgYXQgb3JpZ2luXG4gIHNoaWZ0Q29vcmRpbmF0ZXMobW9ub21lciwgLXhbbm9kZU9uZUlkeF0sIC15W25vZGVPbmVJZHhdKTtcblxuICAvLyBhbmdsZSBpcyBtZWFzdXJlZCBiZXR3ZWVuIE9YIGFuZCB0aGUgcm90YXRlZCBub2RlXG4gIGNvbnN0IGFuZ2xlID0gZmluZEFuZ2xlV2l0aE9YKHhbbm9kZVR3b0lkeF0sIHlbbm9kZVR3b0lkeF0pO1xuXG4gIC8vIHJvdGF0ZSB0aGUgY2VudGVyZWQgZ3JhcGgsIHNvIHRoYXQgJ25vZGVUd28nIGVuZHMgdXAgb24gdGhlIHBvc2l0aXZlIHJheSBvZiBPWFxuICByb3RhdGVDZW50ZXJlZEdyYXBoKG1vbm9tZXIuYXRvbXMsIC1hbmdsZSk7XG59XG5cbmZ1bmN0aW9uIGFkanVzdFN1Z2FyTW9ub21lckdyYXBoKG1vbm9tZXI6IE1vbEdyYXBoKTogdm9pZCB7XG4gIGNvbnN0IG5vZGVPbmVJZHggPSBtb25vbWVyLm1ldGEudGVybWluYWxOb2Rlc1swXSAtIDE7IC8vIG5vZGUgaW5kZXhpbmcgaW4gbW9sZmlsZXMgc3RhcnRzIGZyb20gMVxuICAvLyBjb25zdCBub2RlVHdvSWR4ID0gbW9ub21lci5tZXRhLnJOb2Rlc1swXSAtIDE7XG4gIGNvbnN0IHggPSBtb25vbWVyLmF0b21zLng7XG4gIGNvbnN0IHkgPSBtb25vbWVyLmF0b21zLnk7XG5cbiAgLy8gcGxhY2Ugbm9kZU9uZSBhdCBvcmlnaW5cbiAgc2hpZnRDb29yZGluYXRlcyhtb25vbWVyLCAteFtub2RlT25lSWR4XSwgLXlbbm9kZU9uZUlkeF0pO1xuXG4gIC8vIC8vIGFuZ2xlIGlzIG1lYXN1cmVkIGJldHdlZW4gT1kgYW5kIHRoZSByb3RhdGVkIG5vZGVcbiAgLy8gY29uc3QgYW5nbGUgPSBmaW5kQW5nbGVXaXRoT1koeFtub2RlVHdvSWR4XSwgeVtub2RlVHdvSWR4XSk7XG5cbiAgLy8gLy8gcm90YXRlIHRoZSBjZW50ZXJlZCBncmFwaCwgc28gdGhhdCAnbm9kZVR3bycgZW5kcyB1cCBvbiB0aGUgcG9zaXRpdmUgcmF5IG9mIE9ZXG4gIC8vIHJvdGF0ZUNlbnRlcmVkR3JhcGgobW9ub21lci5hdG9tcywgLWFuZ2xlKTtcblxuICAvLyBpZiAoeFttb25vbWVyLm1ldGEuck5vZGVzWzFdIC0gMV0gPCAwKVxuICAvLyAgIGZsaXBNb25vbWVyQXJvdW5kT1kobW9ub21lcik7XG5cbiAgLy8gY29uc3QgZG91YmxlQm9uZGVkT3h5Z2VuID0gZmluZERvdWJsZUJvbmRlZENhcmJvbnlsT3h5Z2VuKG1vbm9tZXIpO1xuXG4gIC8vIC8vIGZsaXAgY2FyYm94eWwgYW5kIFIgaWYgbmVjZXNzYXJ5XG4gIC8vIGZsaXBDYXJib3h5bEFuZFJhZGljYWwobW9ub21lciwgZG91YmxlQm9uZGVkT3h5Z2VuKTtcblxuICAvLyAvLyBmbGlwIGh5ZHJveHlsIGdyb3VwIHdpdGggZG91YmxlLWJvdW5kIE8gaW5zaWRlIGNhcmJveHlsIGdyb3VwIGlmIG5lY2Vzc2FyeVxuICAvLyBmbGlwSHlkcm94aWxHcm91cChtb25vbWVyLCBkb3VibGVCb25kZWRPeHlnZW4pO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RCYXNlTW9ub21lckdyYXBoKG1vbm9tZXI6IE1vbEdyYXBoKTogdm9pZCB7XG4gIGNvbnN0IG5vZGVPbmVJZHggPSBtb25vbWVyLm1ldGEudGVybWluYWxOb2Rlc1swXSAtIDE7IC8vIG5vZGUgaW5kZXhpbmcgaW4gbW9sZmlsZXMgc3RhcnRzIGZyb20gMVxuICAvLyBjb25zdCBub2RlVHdvSWR4ID0gbW9ub21lci5tZXRhLnJOb2Rlc1swXSAtIDE7XG4gIGNvbnN0IHggPSBtb25vbWVyLmF0b21zLng7XG4gIGNvbnN0IHkgPSBtb25vbWVyLmF0b21zLnk7XG5cbiAgLy8gcGxhY2Ugbm9kZU9uZSBhdCBvcmlnaW5cbiAgc2hpZnRDb29yZGluYXRlcyhtb25vbWVyLCAteFtub2RlT25lSWR4XSwgLXlbbm9kZU9uZUlkeF0pO1xuXG4gIC8vIC8vIGFuZ2xlIGlzIG1lYXN1cmVkIGJldHdlZW4gT1kgYW5kIHRoZSByb3RhdGVkIG5vZGVcbiAgLy8gY29uc3QgYW5nbGUgPSBmaW5kQW5nbGVXaXRoT1koeFtub2RlVHdvSWR4XSwgeVtub2RlVHdvSWR4XSk7XG5cbiAgLy8gLy8gcm90YXRlIHRoZSBjZW50ZXJlZCBncmFwaCwgc28gdGhhdCAnbm9kZVR3bycgZW5kcyB1cCBvbiB0aGUgcG9zaXRpdmUgcmF5IG9mIE9ZXG4gIC8vIHJvdGF0ZUNlbnRlcmVkR3JhcGgobW9ub21lci5hdG9tcywgLWFuZ2xlKTtcblxuICAvLyBpZiAoeFttb25vbWVyLm1ldGEuck5vZGVzWzFdIC0gMV0gPCAwKVxuICAvLyAgIGZsaXBNb25vbWVyQXJvdW5kT1kobW9ub21lcik7XG5cbiAgLy8gY29uc3QgZG91YmxlQm9uZGVkT3h5Z2VuID0gZmluZERvdWJsZUJvbmRlZENhcmJvbnlsT3h5Z2VuKG1vbm9tZXIpO1xuXG4gIC8vIC8vIGZsaXAgY2FyYm94eWwgYW5kIFIgaWYgbmVjZXNzYXJ5XG4gIC8vIGZsaXBDYXJib3h5bEFuZFJhZGljYWwobW9ub21lciwgZG91YmxlQm9uZGVkT3h5Z2VuKTtcblxuICAvLyAvLyBmbGlwIGh5ZHJveHlsIGdyb3VwIHdpdGggZG91YmxlLWJvdW5kIE8gaW5zaWRlIGNhcmJveHlsIGdyb3VwIGlmIG5lY2Vzc2FyeVxuICAvLyBmbGlwSHlkcm94aWxHcm91cChtb25vbWVyLCBkb3VibGVCb25kZWRPeHlnZW4pO1xufVxuXG4vKiBGbGlwIGNhcmJveHlsIGdyb3VwIHdpdGggdGhlIHJhZGljYWwgaW4gYSBwZXB0aWRlIG1vbm9tZXIgaW4gY2FzZSB0aGVcbiAqIGNhcmJveHlsIGdyb3VwIGlzIGluIHRoZSBsb3dlciBoYWxmLXBsYW5lICovXG5mdW5jdGlvbiBmbGlwQ2FyYm94eWxBbmRSYWRpY2FsKG1vbm9tZXI6IE1vbEdyYXBoLCBkb3VibGVCb25kZWRPeHlnZW46IG51bWJlcik6IHZvaWQge1xuICAvLyB2ZXJpZnkgdGhhdCB0aGUgY2FyYm94eWwgZ3JvdXAgaXMgaW4gdGhlIGxvd2VyIGhhbGYtcGxhbmVcbiAgaWYgKG1vbm9tZXIuYXRvbXMueVttb25vbWVyLm1ldGEuck5vZGVzWzFdIC0gMV0gPCAwICYmXG4gICAgbW9ub21lci5hdG9tcy55W2RvdWJsZUJvbmRlZE94eWdlbiAtIDFdIDwgMCkge1xuICAgIGZsaXBNb25vbWVyQXJvdW5kT1gobW9ub21lcik7XG5cbiAgICByb3RhdGVDZW50ZXJlZEdyYXBoKG1vbm9tZXIuYXRvbXMsXG4gICAgICAtZmluZEFuZ2xlV2l0aE9YKFxuICAgICAgICBtb25vbWVyLmF0b21zLnhbbW9ub21lci5tZXRhLnRlcm1pbmFsTm9kZXNbMV0gLSAxXSxcbiAgICAgICAgbW9ub21lci5hdG9tcy55W21vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzFdIC0gMV1cbiAgICAgIClcbiAgICApO1xuICB9XG59XG5cbi8qIEZpbmRzIGFuZ2xlIGJldHdlZW4gT1kgYW5kIHRoZSByYXkgam9pbmluZyBvcmlnaW4gd2l0aCAoeCwgeSkgKi9cbmZ1bmN0aW9uIGZpbmRBbmdsZVdpdGhPWSh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBhbmdsZTtcbiAgaWYgKHggPT09IDApIHtcbiAgICBhbmdsZSA9IHkgPiAwID8gMCA6IE1hdGguUEk7XG4gIH0gZWxzZSBpZiAoeSA9PT0gMCkge1xuICAgIGFuZ2xlID0geCA+IDAgPyAtTWF0aC5QSSAvIDIgOiBNYXRoLlBJIC8gMjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0YW4gPSB5IC8geDtcbiAgICBjb25zdCBhdGFuID0gTWF0aC5hdGFuKHRhbik7XG4gICAgYW5nbGUgPSAoeCA8IDApID8gTWF0aC5QSSAvIDIgKyBhdGFuIDogLU1hdGguUEkgLyAyICsgYXRhbjtcbiAgfVxuICByZXR1cm4gYW5nbGU7XG59XG5cbi8qIEZpbmRzIGFuZ2xlIGJldHdlZW4gT1ggYW5kIHRoZSByYXkgam9pbmluZyBvcmlnaW4gd2l0aCAoeCwgeSkgKi9cbmZ1bmN0aW9uIGZpbmRBbmdsZVdpdGhPWCh4OiBudW1iZXIsIHk6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBmaW5kQW5nbGVXaXRoT1koeCwgeSkgKyBNYXRoLlBJIC8gMjtcbn1cblxuLyogIFJvdGF0ZSB0aGUgZ3JhcGggYXJvdW5kIHRoZSBvcmlnaW4gYnkgJ2FuZ2xlJyAqL1xuZnVuY3Rpb24gcm90YXRlQ2VudGVyZWRHcmFwaChhdG9tczogQXRvbXMsIGFuZ2xlOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKGFuZ2xlICE9PSAwKSB7XG4gICAgY29uc3QgeCA9IGF0b21zLng7XG4gICAgY29uc3QgeSA9IGF0b21zLnk7XG5cbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oYW5nbGUpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCB0bXAgPSB4W2ldO1xuICAgICAgeFtpXSA9IGtlZXBQcmVjaXNpb24odG1wICogY29zIC0geVtpXSAqIHNpbik7XG4gICAgICB5W2ldID0ga2VlcFByZWNpc2lvbih0bXAgKiBzaW4gKyB5W2ldICogY29zKTtcbiAgICB9XG4gIH1cbn1cblxuLyogRmxpcCBtb25vbWVyIGdyYXBoIGFyb3VuZCBPWCBheGlzIHByZXNlcnZpbmcgc3RlcmVvbWV0cnkgKi9cbmZ1bmN0aW9uIGZsaXBNb25vbWVyQXJvdW5kT1gobW9ub21lcjogTW9sR3JhcGgpOiB2b2lkIHtcbiAgZmxpcE1vbEdyYXBoKG1vbm9tZXIsIHRydWUpO1xufVxuXG4vKiBGbGlwIG1vbm9tZXIgZ3JhcGggYXJvdW5kIE9ZIGF4aXMgcHJlc2VydmluZyBzdGVyZW9tZXRyeSAqL1xuZnVuY3Rpb24gZmxpcE1vbm9tZXJBcm91bmRPWShtb25vbWVyOiBNb2xHcmFwaCk6IHZvaWQge1xuICBmbGlwTW9sR3JhcGgobW9ub21lciwgZmFsc2UpO1xufVxuXG4vKiBGbGlwIGdyYXBoIGFyb3VuZCBhIHNwZWNpZmllZCBheGlzOiAndHJ1ZScgY29ycmVzcG9uZHMgdG8gT1gsICdmYWxzZScgdG8gT1kgKi9cbmZ1bmN0aW9uIGZsaXBNb2xHcmFwaChtb2xHcmFwaDogTW9sR3JhcGgsIGF4aXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgaWYgKGF4aXMpIHsgLy8gZmxpcHBpbmcgYXJvdW5kIE9YXG4gICAgY29uc3QgeSA9IG1vbEdyYXBoLmF0b21zLnk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB5Lmxlbmd0aDsgaSsrKVxuICAgICAgeVtpXSA9IC15W2ldO1xuICB9IGVsc2UgeyAvLyBmbGlwcGluZyBhcm91bmQgT1lcbiAgICBjb25zdCB4ID0gbW9sR3JhcGguYXRvbXMueDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyBpKyspXG4gICAgICB4W2ldID0gLXhbaV07XG4gIH1cblxuICAvLyBwcmVzZXJ2ZSB0aGUgc3RlcmVvbWV0cnlcbiAgY29uc3Qgb3JpZW50YXRpb24gPSBtb2xHcmFwaC5ib25kcy5ib25kQ29uZmlndXJhdGlvbjtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2Ygb3JpZW50YXRpb24pIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IHZhbHVlID09PSAxID8gMyA6IDE7XG4gICAgb3JpZW50YXRpb24uc2V0KGtleSwgbmV3VmFsdWUpO1xuICB9XG59XG5cbi8qIEZsaXBzIGRvdWJsZS1ib25kZWQgJ08nIGluIGNhcmJvbnlsIGdyb3VwIHdpdGggJ09IJyBpbiBvcmRlciBmb3IgdGhlIG1vbm9tZXJzXG4gKiB0byBoYXZlIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uIHNpbXBsaWZ5aW5nIHRoZWlyIGNvbmNhdGVuYXRpb24uIFRoZVxuICogbW9ub21lciBtdXN0IGFscmVhZHkgYmUgYWRqdXN0ZWQgd2l0aCBhZGp1c3RQZXB0aWRlTW9ub21lckdyYXBoIGluIG9yZGVyIGZvciB0aGlzIGZ1bmN0aW9uIHRvIGJlIGltcGxlbWVudGVkICAqL1xuZnVuY3Rpb24gZmxpcEh5ZHJveGlsR3JvdXAobW9ub21lcjogTW9sR3JhcGgsIGRvdWJsZUJvbmRlZE94eWdlbjogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHggPSBtb25vbWVyLmF0b21zLng7XG4gIC8vIC0xIGJlbG93IGJlY2F1c2UgaW5kZXhpbmcgb2Ygbm9kZXMgaW4gbW9sZmlsZXMgc3RhcnRzIGZyb20gMSwgdW5saWtlIGFycmF5c1xuICBpZiAoeFttb25vbWVyLm1ldGEuck5vZGVzWzFdIC0gMV0gPiB4W2RvdWJsZUJvbmRlZE94eWdlbiAtIDFdKVxuICAgIHN3YXBOb2Rlcyhtb25vbWVyLCBkb3VibGVCb25kZWRPeHlnZW4sIG1vbm9tZXIubWV0YS5yTm9kZXNbMV0pO1xufVxuXG4vKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBub2RlIChzdGFydGluZyBmcm9tIDEpIGNvcnJlc3BvbmRpbmcgdG8gdGhlXG4gKiBkb3VibGUtYm9uZGVkIG94eWdlbiBvZiB0aGUgY2FyYm9ueWwgZ3JvdXAgICovXG5mdW5jdGlvbiBmaW5kRG91YmxlQm9uZGVkQ2FyYm9ueWxPeHlnZW4obW9ub21lcjogTW9sR3JhcGgpOiBudW1iZXIge1xuICBjb25zdCBib25kc01hcCA9IGNvbnN0cnVjdEJvbmRzTWFwKG1vbm9tZXIpO1xuICBsZXQgZG91YmxlQm9uZGVkT3h5Z2VuID0gMDtcbiAgbGV0IGkgPSAwO1xuICAvLyBpdGVyYXRlIG92ZXIgdGhlIG5vZGVzIGJvbmRlZCB0byB0aGUgY2FyYm9uIGFuZCBmaW5kIHRoZSBkb3VibGUgb25lXG4gIHdoaWxlIChkb3VibGVCb25kZWRPeHlnZW4gPT09IDApIHtcbiAgICBjb25zdCBub2RlID0gYm9uZHNNYXAuZ2V0KG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzFdKSFbaV07XG4gICAgaWYgKG1vbm9tZXIuYXRvbXMuYXRvbVR5cGVzW25vZGUgLSAxXSA9PT0gT1hZR0VOICYmIG5vZGUgIT09IG1vbm9tZXIubWV0YS5yTm9kZXNbMV0pXG4gICAgICBkb3VibGVCb25kZWRPeHlnZW4gPSBub2RlO1xuICAgIGkrKztcbiAgfVxuICByZXR1cm4gZG91YmxlQm9uZGVkT3h5Z2VuO1xufVxuXG4vKiBTd2FwIHRoZSBDYXJ0ZXNpYW4gY29vcmRpbmF0ZXMgb2YgdGhlIHR3byBzcGVjaWZpZWQgbm9kZXMgaW4gTW9sR3JhcGggICovXG5mdW5jdGlvbiBzd2FwTm9kZXMobW9ub21lcjogTW9sR3JhcGgsIG5vZGVPbmU6IG51bWJlciwgbm9kZVR3bzogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IG5vZGVPbmVJZHggPSBub2RlT25lIC0gMTtcbiAgY29uc3Qgbm9kZVR3b0lkeCA9IG5vZGVUd28gLSAxO1xuICBjb25zdCB4ID0gbW9ub21lci5hdG9tcy54O1xuICBjb25zdCB5ID0gbW9ub21lci5hdG9tcy55O1xuICBjb25zdCB0bXBYID0geFtub2RlT25lSWR4XTtcbiAgY29uc3QgdG1wWSA9IHlbbm9kZU9uZUlkeF07XG4gIHhbbm9kZU9uZUlkeF0gPSB4W25vZGVUd29JZHhdO1xuICB5W25vZGVPbmVJZHhdID0geVtub2RlVHdvSWR4XTtcbiAgeFtub2RlVHdvSWR4XSA9IHRtcFg7XG4gIHlbbm9kZVR3b0lkeF0gPSB0bXBZO1xufVxuXG4vLyB0b2RvOiBkb2NcbmZ1bmN0aW9uIGNvbnN0cnVjdEJvbmRzTWFwKG1vbm9tZXI6IE1vbEdyYXBoKTogTWFwPG51bWJlciwgQXJyYXk8bnVtYmVyPj4ge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPG51bWJlciwgQXJyYXk8bnVtYmVyPj4oKTtcbiAgZm9yIChjb25zdCBhdG9tUGFpcnMgb2YgbW9ub21lci5ib25kcy5hdG9tUGFpcnMpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gYXRvbVBhaXJzW2ldO1xuICAgICAgY29uc3QgdmFsdWUgPSBhdG9tUGFpcnNbKGkgKyAxKSAlIDJdO1xuICAgICAgaWYgKG1hcC5oYXMoa2V5KSlcbiAgICAgICAgbWFwLmdldChrZXkpPy5wdXNoKHZhbHVlKTtcbiAgICAgIGVsc2VcbiAgICAgICAgbWFwLnNldChrZXksIG5ldyBBcnJheTxudW1iZXI+KDEpLmZpbGwodmFsdWUpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxuLyogU2hpZnQgbW9sR3JhcGggaW4gdGhlIFhPWSBwbGFuZSAgKi9cbmZ1bmN0aW9uIHNoaWZ0Q29vcmRpbmF0ZXMobW9sR3JhcGg6IE1vbEdyYXBoLCB4U2hpZnQ6IG51bWJlciwgeVNoaWZ0PzogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHggPSBtb2xHcmFwaC5hdG9tcy54O1xuICBjb25zdCB5ID0gbW9sR3JhcGguYXRvbXMueTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgKytpKSB7XG4gICAgeFtpXSA9IGtlZXBQcmVjaXNpb24oeFtpXSArIHhTaGlmdCk7XG4gICAgaWYgKHR5cGVvZiB5U2hpZnQgIT09ICd1bmRlZmluZWQnKVxuICAgICAgeVtpXSA9IGtlZXBQcmVjaXNpb24oeVtpXSArIHlTaGlmdCk7XG4gIH1cbn1cblxuLyogVHJhbnNsYXRlIGEgc2VxdWVuY2Ugb2YgbW9ub21lciBzeW1ib2xzIGludG8gTW9sZmlsZSBWMzAwMCAqL1xuZnVuY3Rpb24gbW9ub21lclNlcVRvTW9sZmlsZShcbiAgbW9ub21lclNlcTogc3RyaW5nW10sIG1vbm9tZXJzRGljdDogTWFwPHN0cmluZywgTW9sR3JhcGg+LFxuICBhbHBoYWJldDogQUxQSEFCRVQsIHBvbHltZXJUeXBlOiBIRUxNX1BPTFlNRVJfVFlQRSwgbW9kZTogTU9ERVxuKTogc3RyaW5nIHtcbiAgLy8gdG9kbzogaGFuZGxlIHRoZSBjYXNlIHdoZW4gdGhlIHBvbHltZXIgaXMgZW1wdHlcbiAgaWYgKG1vbm9tZXJTZXEubGVuZ3RoID09PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcignbW9ub21lclNlcSBpcyBlbXB0eScpO1xuXG4gIC8vIGRlZmluZSBhdG9tIGFuZCBib25kIGNvdW50cywgdGFraW5nIGludG8gYWNjb3VudCB0aGUgYm9uZCB0eXBlXG4gIGNvbnN0IGdldEF0b21BbmRCb25kQ291bnRzID0gKG1vZGUgPT09IE1PREUuU1RBTkRBUkQpID9cbiAgICBnZXRSZXN1bHRpbmdBdG9tQm9uZENvdW50cyA6IGdldFJlc3VsdGluZ0F0b21Cb25kQ291bnRzU1Q7XG4gIGNvbnN0IHthdG9tQ291bnQsIGJvbmRDb3VudH0gPSBnZXRBdG9tQW5kQm9uZENvdW50cyhtb25vbWVyU2VxLCBtb25vbWVyc0RpY3QsIGFscGhhYmV0LCBwb2x5bWVyVHlwZSwgbW9kZSk7XG5cbiAgLy8gY3JlYXRlIGFycmF5cyB0byBzdG9yZSBsaW5lcyBvZiB0aGUgcmVzdWx0aW5nIG1vbGZpbGVcbiAgY29uc3QgbW9sZmlsZUF0b21CbG9jayA9IG5ldyBBcnJheTxzdHJpbmc+KGF0b21Db3VudCk7XG4gIGNvbnN0IG1vbGZpbGVCb25kQmxvY2sgPSBuZXcgQXJyYXk8c3RyaW5nPihib25kQ291bnQpO1xuXG4gIGxldCBhZGRNb25vbWVyVG9Nb2xibG9jazsgLy8gdG9kbzogdHlwZXM/XG5cbiAgbGV0IHN1Z2FyID0gbnVsbDtcbiAgbGV0IHBob3NwaGF0ZSA9IG51bGw7XG5cbiAgaWYgKG1vZGUgPT09IE1PREUuU1RBTkRBUkQpIHtcbiAgICBpZiAocG9seW1lclR5cGUgPT09IEhFTE1fUE9MWU1FUl9UWVBFLlBFUFRJREUpIHtcbiAgICAgIGFkZE1vbm9tZXJUb01vbGJsb2NrID0gYWRkQW1pbm9BY2lkVG9Nb2xibG9jaztcbiAgICB9IGVsc2UgeyAvLyBudWNsZW90aWRlc1xuICAgICAgYWRkTW9ub21lclRvTW9sYmxvY2sgPSBhZGROdWNsZW90aWRlVG9Nb2xibG9jaztcbiAgICAgIHN1Z2FyID0gKGFscGhhYmV0ID09PSBBTFBIQUJFVC5ETkEpID8gbW9ub21lcnNEaWN0LmdldChERU9YWVJJQk9TRSkgOiBtb25vbWVyc0RpY3QuZ2V0KFJJQk9TRSk7XG4gICAgICBwaG9zcGhhdGUgPSBtb25vbWVyc0RpY3QuZ2V0KFBIT1NQSEFURSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFkZE1vbm9tZXJUb01vbGJsb2NrID0gYWRkTW9ub21lclRvTW9sYmxvY2tTVDtcbiAgfVxuXG4gIGNvbnN0IHY6IExvb3BWYXJpYWJsZXMgPSB7XG4gICAgaTogMCxcbiAgICBub2RlU2hpZnQ6IDAsXG4gICAgYm9uZFNoaWZ0OiAwLFxuICAgIGJhY2tib25lUG9zaXRpb25TaGlmdDogbmV3IEFycmF5PG51bWJlcj4oMikuZmlsbCgwKSxcbiAgICBicmFuY2hQb3NpdGlvblNoaWZ0OiBuZXcgQXJyYXk8bnVtYmVyPigyKS5maWxsKDApLFxuICAgIGJhY2tib25lQXR0YWNoTm9kZTogMCxcbiAgICBicmFuY2hBdHRhY2hOb2RlOiAwLFxuICAgIGZsaXBGYWN0b3I6IDEsXG4gIH07XG5cbiAgY29uc3QgQzogTG9vcENvbnN0YW50cyA9IHtcbiAgICBzdWdhcjogc3VnYXIhLFxuICAgIHBob3NwaGF0ZTogcGhvc3BoYXRlISxcbiAgICBzZXFMZW5ndGg6IG1vbm9tZXJTZXEubGVuZ3RoLFxuICAgIGF0b21Db3VudDogYXRvbUNvdW50LFxuICAgIGJvbmRDb3VudDogYm9uZENvdW50LFxuICB9O1xuXG4gIGZvciAodi5pID0gMDsgdi5pIDwgQy5zZXFMZW5ndGg7ICsrdi5pKSB7XG4gICAgY29uc3QgbW9ub21lciA9IG1vbm9tZXJzRGljdC5nZXQobW9ub21lclNlcVt2LmldKSE7XG4gICAgYWRkTW9ub21lclRvTW9sYmxvY2sobW9ub21lciwgbW9sZmlsZUF0b21CbG9jaywgbW9sZmlsZUJvbmRCbG9jaywgdiwgQyk7XG4gIH1cblxuICBjYXBSZXN1bHRpbmdNb2xibG9jayhtb2xmaWxlQXRvbUJsb2NrLCBtb2xmaWxlQm9uZEJsb2NrLCB2LCBDLCBtb2RlKTtcblxuICBjb25zdCBtb2xmaWxlQ291bnRzTGluZSA9IFYzS19CRUdJTl9DT1VOVFNfTElORSArIGF0b21Db3VudCArICcgJyArIGJvbmRDb3VudCArIFYzS19DT1VOVFNfTElORV9FTkRJTkc7XG5cbiAgLy8gdG9kbzogb3B0aW1pemUgY29uY2F0ZW5hdGlvbiB1c2luZyBBbGV4YW5kZXIncyBoaW50XG4gIGNvbnN0IG1vbGZpbGVQYXJ0cyA9IFtcbiAgICBWM0tfSEVBREVSX0ZJUlNUX0xJTkUsXG4gICAgVjNLX0hFQURFUl9TRUNPTkRfTElORSxcbiAgICBWM0tfQkVHSU5fQ1RBQl9CTE9DSyxcbiAgICBtb2xmaWxlQ291bnRzTGluZSxcbiAgICBWM0tfQkVHSU5fQVRPTV9CTE9DSyxcbiAgICBtb2xmaWxlQXRvbUJsb2NrLmpvaW4oJycpLFxuICAgIFYzS19FTkRfQVRPTV9CTE9DSyxcbiAgICBWM0tfQkVHSU5fQk9ORF9CTE9DSyxcbiAgICBtb2xmaWxlQm9uZEJsb2NrLmpvaW4oJycpLFxuICAgIFYzS19FTkRfQk9ORF9CTE9DSyxcbiAgICBWM0tfRU5EX0NUQUJfQkxPQ0ssXG4gICAgVjNLX0VORCxcbiAgXTtcblxuICByZXR1cm4gbW9sZmlsZVBhcnRzLmpvaW4oJycpO1xufVxuXG4vKiBDYXAgdGhlIHJlc3VsdGluZyAoYWZ0ZXIgc2V3aW5nIHVwIGFsbCB0aGUgbW9ub21lcnMpIG1vbGZpbGUgd2l0aCAnTycgKi9cbmZ1bmN0aW9uIGNhcFJlc3VsdGluZ01vbGJsb2NrKFxuICBtb2xmaWxlQXRvbUJsb2NrOiBzdHJpbmdbXSwgbW9sZmlsZUJvbmRCbG9jazogc3RyaW5nW10sXG4gIHY6IExvb3BWYXJpYWJsZXMsIEM6IExvb3BDb25zdGFudHMsIG1vZGU6IE1PREVcbik6IHZvaWQge1xuICBpZiAobW9kZSA9PT0gTU9ERS5TVEFOREFSRCkge1xuICAgIC8vIGFkZCB0ZXJtaW5hbCBveHlnZW5cbiAgICBjb25zdCBhdG9tSWR4ID0gdi5ub2RlU2hpZnQgKyAxO1xuICAgIG1vbGZpbGVBdG9tQmxvY2tbQy5hdG9tQ291bnRdID0gVjNLX0JFR0lOX0RBVEFfTElORSArIGF0b21JZHggKyAnICcgK1xuICAgICAgT1hZR0VOICsgJyAnICsga2VlcFByZWNpc2lvbih2LmJhY2tib25lUG9zaXRpb25TaGlmdFswXSkgKyAnICcgK1xuICAgICAgdi5mbGlwRmFjdG9yICoga2VlcFByZWNpc2lvbih2LmJhY2tib25lUG9zaXRpb25TaGlmdFsxXSkgKyAnICcgKyAnMC4wMDAwMDAgMCcgKyAnXFxuJztcblxuICAgIC8vIGFkZCB0ZXJtaW5hbCBib25kXG4gICAgY29uc3QgZmlyc3RBdG9tID0gdi5iYWNrYm9uZUF0dGFjaE5vZGU7XG4gICAgY29uc3Qgc2Vjb25kQXRvbSA9IGF0b21JZHg7XG4gICAgbW9sZmlsZUJvbmRCbG9ja1tDLmJvbmRDb3VudF0gPSBWM0tfQkVHSU5fREFUQV9MSU5FICsgdi5ib25kU2hpZnQgKyAnICcgK1xuICAgICAgMSArICcgJyArIGZpcnN0QXRvbSArICcgJyArIHNlY29uZEF0b20gKyAnXFxuJztcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRBbWlub0FjaWRUb01vbGJsb2NrKG1vbm9tZXI6IE1vbEdyYXBoLCBtb2xmaWxlQXRvbUJsb2NrOiBzdHJpbmdbXSxcbiAgbW9sZmlsZUJvbmRCbG9jazogc3RyaW5nW10sIHY6IExvb3BWYXJpYWJsZXMsIEM6IExvb3BDb25zdGFudHNcbik6IHZvaWQge1xuICB2LmZsaXBGYWN0b3IgPSAoLTEpICoqICh2LmkgJSAyKTsgLy8gdG8gZmxpcCBldmVyeSBldmVuIG1vbm9tZXIgb3ZlciBPWFxuICBhZGRCYWNrYm9uZU1vbm9tZXJUb01vbGJsb2NrKG1vbm9tZXIsIG1vbGZpbGVBdG9tQmxvY2ssIG1vbGZpbGVCb25kQmxvY2ssIHYsIEMpO1xufVxuXG5mdW5jdGlvbiBhZGRNb25vbWVyVG9Nb2xibG9ja1NUKG1vbm9tZXI6IE1vbEdyYXBoLCBtb2xmaWxlQXRvbUJsb2NrOiBzdHJpbmdbXSxcbiAgbW9sZmlsZUJvbmRCbG9jazogc3RyaW5nW10sIHY6IExvb3BWYXJpYWJsZXMsIEM6IExvb3BDb25zdGFudHNcbik6IHZvaWQge1xuICBhZGRCcmFuY2hNb25vbWVyVG9Nb2xibG9jayhtb25vbWVyLCBtb2xmaWxlQXRvbUJsb2NrLCBtb2xmaWxlQm9uZEJsb2NrLCB2LCBDKTtcbn1cblxuZnVuY3Rpb24gYWRkQmFja2JvbmVNb25vbWVyVG9Nb2xibG9jayhcbiAgbW9ub21lcjogTW9sR3JhcGgsIG1vbGZpbGVBdG9tQmxvY2s6IHN0cmluZ1tdLCBtb2xmaWxlQm9uZEJsb2NrOiBzdHJpbmdbXSwgdjogTG9vcFZhcmlhYmxlcywgQzogTG9vcENvbnN0YW50c1xuKTogdm9pZCB7XG4gIC8vIHRvZG86IHJlbW92ZSB0aGVzZSBjb21tZW50cyB0byB0aGUgZG9jc3RyaW5ncyBvZiB0aGUgY29yci4gZnVuY3Rpb25zXG4gIC8vIGNvbnN0cnVuY3QgdGhlIGxpbmVzIG9mIFYzSyBtb2xmaWxlIGF0b20gYmxvY2tcbiAgZmlsbEF0b21MaW5lcyhtb25vbWVyLCBtb2xmaWxlQXRvbUJsb2NrLCB2KTtcblxuICAvLyBjb25zdHJ1Y3QgdGhlIGxpbmVzIG9mIFYzSyBtb2xmaWxlIGJvbmQgYmxvY2tcbiAgZmlsbEJvbmRMaW5lcyhtb25vbWVyLCBtb2xmaWxlQm9uZEJsb2NrLCB2KTtcblxuICAvLyBwZXB0aWRlIGJvbmRcbiAgZmlsbENoYWluRXh0ZW5kaW5nQm9uZChtb25vbWVyLCBtb2xmaWxlQm9uZEJsb2NrLCB2KTtcblxuICAvLyB1cGRhdGUgYnJhbmNoIHZhcmlhYmxlcyBpZiBuZWNlc3NhcnlcbiAgaWYgKG1vbm9tZXIubWV0YS5icmFuY2hTaGlmdCAhPT0gbnVsbCAmJiBtb25vbWVyLm1ldGEudGVybWluYWxOb2Rlcy5sZW5ndGggPiAyKVxuICAgIHVwZGF0ZUJyYW5jaFZhcmlhYmxlcyhtb25vbWVyLCB2KTtcblxuICAvLyB1cGRhdGUgbG9vcCB2YXJpYWJsZXNcbiAgdXBkYXRlQ2hhaW5FeHRlbmRpbmdWYXJpYWJsZXMobW9ub21lciwgdiwgQyk7XG59XG5cbi8qIERlZmluZWQgZm9yICdzdGFuZGFyZCBtb2RlJyBSTkEgbW9ub21lcnMsIGkuZS4gb2YgJ2JyYW5jaCcgdHlwZSwgYXMgaW5cbiAqIEhFTE1Db3JlTGlicmFyeS4gV2lsbCBub3Qgd29yayBpbiBTRVFfVFJBTiBtb2RlICovXG5mdW5jdGlvbiBhZGROdWNsZW90aWRlVG9Nb2xibG9jayhcbiAgbnVjbGVvYmFzZTogTW9sR3JhcGgsIG1vbGZpbGVBdG9tQmxvY2s6IHN0cmluZ1tdLCBtb2xmaWxlQm9uZEJsb2NrOiBzdHJpbmdbXSwgdjogTG9vcFZhcmlhYmxlcywgQzogTG9vcENvbnN0YW50c1xuKTogdm9pZCB7XG4gIC8vIGNvbnN0cnVuY3QgdGhlIGxpbmVzIG9mIFYzSyBtb2xmaWxlIGF0b20gYmxvY2sgY29ycmVzcG9uZGluZyB0byBwaG9zcGhhdGVcbiAgLy8gYW5kIHN1Z2FyXG4gIGZvciAoY29uc3QgbW9ub21lciBvZiBbQy5waG9zcGhhdGUsIEMuc3VnYXJdKVxuICAgIGFkZEJhY2tib25lTW9ub21lclRvTW9sYmxvY2sobW9ub21lciEsIG1vbGZpbGVBdG9tQmxvY2ssIG1vbGZpbGVCb25kQmxvY2ssIHYsIEMpO1xuXG4gIGFkZEJyYW5jaE1vbm9tZXJUb01vbGJsb2NrKG51Y2xlb2Jhc2UsIG1vbGZpbGVBdG9tQmxvY2ssIG1vbGZpbGVCb25kQmxvY2ssIHYsIEMpO1xufVxuXG5mdW5jdGlvbiBhZGRCcmFuY2hNb25vbWVyVG9Nb2xibG9jayhcbiAgbW9ub21lcjogTW9sR3JhcGgsIG1vbGZpbGVBdG9tQmxvY2s6IHN0cmluZ1tdLCBtb2xmaWxlQm9uZEJsb2NrOiBzdHJpbmdbXSwgdjogTG9vcFZhcmlhYmxlcywgQzogTG9vcENvbnN0YW50c1xuKTogdm9pZCB7XG4gIGZpbGxCcmFuY2hBdG9tTGluZXMobW9ub21lciwgbW9sZmlsZUF0b21CbG9jaywgdik7XG4gIGZpbGxCb25kTGluZXMobW9ub21lciwgbW9sZmlsZUJvbmRCbG9jaywgdik7XG4gIGZpbGxCYWNrYm9uZVRvQnJhbmNoQm9uZChtb25vbWVyLCBtb2xmaWxlQm9uZEJsb2NrLCB2KTtcblxuICAvLyBDLU4gYm9uZFxuICBjb25zdCBib25kSWR4ID0gdi5ib25kU2hpZnQ7XG4gIGNvbnN0IGZpcnN0QXRvbSA9IHYuYnJhbmNoQXR0YWNoTm9kZTtcbiAgY29uc3Qgc2Vjb25kQXRvbSA9IG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzBdICsgdi5ub2RlU2hpZnQ7XG4gIG1vbGZpbGVCb25kQmxvY2tbYm9uZElkeCAtIDFdID0gVjNLX0JFR0lOX0RBVEFfTElORSArIGJvbmRJZHggKyAnICcgK1xuICAgIDEgKyAnICcgKyBmaXJzdEF0b20gKyAnICcgKyBzZWNvbmRBdG9tICsgJ1xcbic7XG5cbiAgLy8gdXBkYXRlIGxvb3AgdmFyaWFibGVzXG4gIHYuYm9uZFNoaWZ0ICs9IG1vbm9tZXIuYm9uZHMuYXRvbVBhaXJzLmxlbmd0aCArIDE7XG4gIHYubm9kZVNoaWZ0ICs9IG1vbm9tZXIuYXRvbXMuYXRvbVR5cGVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQ2hhaW5FeHRlbmRpbmdWYXJpYWJsZXMobW9ub21lcjogTW9sR3JhcGgsIHY6IExvb3BWYXJpYWJsZXMsIEM6IExvb3BDb25zdGFudHMpOiB2b2lkIHtcbiAgdi5iYWNrYm9uZUF0dGFjaE5vZGUgPSB2Lm5vZGVTaGlmdCArIG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzFdO1xuICB2LmJvbmRTaGlmdCArPSBtb25vbWVyLmJvbmRzLmF0b21QYWlycy5sZW5ndGggKyAxO1xuXG4gIHYubm9kZVNoaWZ0ICs9IG1vbm9tZXIuYXRvbXMuYXRvbVR5cGVzLmxlbmd0aDtcbiAgdi5iYWNrYm9uZVBvc2l0aW9uU2hpZnRbMF0gKz0gbW9ub21lci5tZXRhLmJhY2tib25lU2hpZnQhWzBdOyAvLyB0b2RvOiBub24tbnVsbCBjaGVja1xuICB2LmJhY2tib25lUG9zaXRpb25TaGlmdFsxXSArPSB2LmZsaXBGYWN0b3IgKiBtb25vbWVyLm1ldGEuYmFja2JvbmVTaGlmdCFbMV07XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZUJyYW5jaFZhcmlhYmxlcyhtb25vbWVyOiBNb2xHcmFwaCwgdjogTG9vcFZhcmlhYmxlcykge1xuICB2LmJyYW5jaEF0dGFjaE5vZGUgPSB2Lm5vZGVTaGlmdCArIG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzJdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDI7ICsraSlcbiAgICB2LmJyYW5jaFBvc2l0aW9uU2hpZnRbaV0gPSB2LmJhY2tib25lUG9zaXRpb25TaGlmdFtpXSArIG1vbm9tZXIubWV0YS5icmFuY2hTaGlmdCFbaV07XG59XG5cbmZ1bmN0aW9uIGZpbGxBdG9tTGluZXMobW9ub21lcjogTW9sR3JhcGgsIG1vbGZpbGVBdG9tQmxvY2s6IHN0cmluZ1tdLCB2OiBMb29wVmFyaWFibGVzKTogdm9pZCB7XG4gIGZvciAobGV0IGogPSAwOyBqIDwgbW9ub21lci5hdG9tcy5hdG9tVHlwZXMubGVuZ3RoOyArK2opIHtcbiAgICBjb25zdCBhdG9tSWR4ID0gdi5ub2RlU2hpZnQgKyBqICsgMTtcbiAgICBtb2xmaWxlQXRvbUJsb2NrW3Yubm9kZVNoaWZ0ICsgal0gPSBWM0tfQkVHSU5fREFUQV9MSU5FICsgYXRvbUlkeCArICcgJyArXG4gICAgICBtb25vbWVyLmF0b21zLmF0b21UeXBlc1tqXSArICcgJyArXG4gICAgICBrZWVwUHJlY2lzaW9uKHYuYmFja2JvbmVQb3NpdGlvblNoaWZ0WzBdICsgbW9ub21lci5hdG9tcy54W2pdKSArICcgJyArXG4gICAgICBrZWVwUHJlY2lzaW9uKHYuYmFja2JvbmVQb3NpdGlvblNoaWZ0WzFdICsgdi5mbGlwRmFjdG9yICogbW9ub21lci5hdG9tcy55W2pdKSArXG4gICAgICAnICcgKyBtb25vbWVyLmF0b21zLmt3YXJnc1tqXTtcbiAgfVxufVxuXG4vLyB0b2RvOiByZW1vdmUgYXMgcXVpY2tmaXhcbmZ1bmN0aW9uIGZpbGxCcmFuY2hBdG9tTGluZXMobW9ub21lcjogTW9sR3JhcGgsIG1vbGZpbGVBdG9tQmxvY2s6IHN0cmluZ1tdLCB2OiBMb29wVmFyaWFibGVzKTogdm9pZCB7XG4gIGZvciAobGV0IGogPSAwOyBqIDwgbW9ub21lci5hdG9tcy5hdG9tVHlwZXMubGVuZ3RoOyArK2opIHtcbiAgICBjb25zdCBhdG9tSWR4ID0gdi5ub2RlU2hpZnQgKyBqICsgMTtcbiAgICBtb2xmaWxlQXRvbUJsb2NrW3Yubm9kZVNoaWZ0ICsgal0gPSBWM0tfQkVHSU5fREFUQV9MSU5FICsgYXRvbUlkeCArICcgJyArXG4gICAgICBtb25vbWVyLmF0b21zLmF0b21UeXBlc1tqXSArICcgJyArXG4gICAgICBrZWVwUHJlY2lzaW9uKHYuYnJhbmNoUG9zaXRpb25TaGlmdFswXSArIG1vbm9tZXIuYXRvbXMueFtqXSkgKyAnICcgK1xuICAgICAga2VlcFByZWNpc2lvbih2LmJyYW5jaFBvc2l0aW9uU2hpZnRbMV0gKyB2LmZsaXBGYWN0b3IgKiBtb25vbWVyLmF0b21zLnlbal0pICtcbiAgICAgICcgJyArIG1vbm9tZXIuYXRvbXMua3dhcmdzW2pdO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbGxCb25kTGluZXMobW9ub21lcjogTW9sR3JhcGgsIG1vbGZpbGVCb25kQmxvY2s6IHN0cmluZ1tdLCB2OiBMb29wVmFyaWFibGVzKTogdm9pZCB7XG4gIC8vIGNvbnN0cnVjdCB0aGUgbGluZXMgb2YgVjNLIG1vbGZpbGUgYm9uZCBibG9ja1xuICBmb3IgKGxldCBqID0gMDsgaiA8IG1vbm9tZXIuYm9uZHMuYXRvbVBhaXJzLmxlbmd0aDsgKytqKSB7XG4gICAgY29uc3QgYm9uZElkeCA9IHYuYm9uZFNoaWZ0ICsgaiArIDE7XG4gICAgY29uc3QgZmlyc3RBdG9tID0gbW9ub21lci5ib25kcy5hdG9tUGFpcnNbal1bMF0gKyB2Lm5vZGVTaGlmdDtcbiAgICBjb25zdCBzZWNvbmRBdG9tID0gbW9ub21lci5ib25kcy5hdG9tUGFpcnNbal1bMV0gKyB2Lm5vZGVTaGlmdDtcbiAgICBsZXQgYm9uZENmZyA9ICcnO1xuICAgIGlmIChtb25vbWVyLmJvbmRzLmJvbmRDb25maWd1cmF0aW9uLmhhcyhqKSkge1xuICAgICAgLy8gZmxpcCBvcmllbnRhdGlvbiB3aGVuIG5lY2Vzc2FyeVxuICAgICAgbGV0IG9yaWVudGF0aW9uID0gbW9ub21lci5ib25kcy5ib25kQ29uZmlndXJhdGlvbi5nZXQoaik7XG4gICAgICBpZiAodi5mbGlwRmFjdG9yIDwgMClcbiAgICAgICAgb3JpZW50YXRpb24gPSAob3JpZW50YXRpb24gPT09IDEpID8gMyA6IDE7XG4gICAgICBib25kQ2ZnID0gJyBDRkc9JyArIG9yaWVudGF0aW9uO1xuICAgIH1cbiAgICBjb25zdCBrd2FyZ3MgPSBtb25vbWVyLmJvbmRzLmt3YXJncy5oYXMoaikgP1xuICAgICAgJyAnICsgbW9ub21lci5ib25kcy5rd2FyZ3MuZ2V0KGopIDogJyc7XG4gICAgbW9sZmlsZUJvbmRCbG9ja1t2LmJvbmRTaGlmdCArIGpdID0gVjNLX0JFR0lOX0RBVEFfTElORSArIGJvbmRJZHggKyAnICcgK1xuICAgICAgbW9ub21lci5ib25kcy5ib25kVHlwZXNbal0gKyAnICcgK1xuICAgICAgZmlyc3RBdG9tICsgJyAnICsgc2Vjb25kQXRvbSArIGJvbmRDZmcgKyBrd2FyZ3MgKyAnXFxuJztcbiAgfVxufVxuXG5mdW5jdGlvbiBmaWxsQ2hhaW5FeHRlbmRpbmdCb25kKG1vbm9tZXI6IE1vbEdyYXBoLCBtb2xmaWxlQm9uZEJsb2NrOiBzdHJpbmdbXSwgdjogTG9vcFZhcmlhYmxlcyk6IHZvaWQge1xuICBpZiAodi5iYWNrYm9uZUF0dGFjaE5vZGUgIT09IDApIHtcbiAgICBjb25zdCBib25kSWR4ID0gdi5ib25kU2hpZnQ7XG4gICAgY29uc3QgZmlyc3RBdG9tID0gdi5iYWNrYm9uZUF0dGFjaE5vZGU7XG4gICAgY29uc3Qgc2Vjb25kQXRvbSA9IG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzBdICsgdi5ub2RlU2hpZnQ7XG4gICAgbW9sZmlsZUJvbmRCbG9ja1t2LmJvbmRTaGlmdCAtIDFdID0gVjNLX0JFR0lOX0RBVEFfTElORSArIGJvbmRJZHggKyAnICcgK1xuICAgICAgMSArICcgJyArIGZpcnN0QXRvbSArICcgJyArIHNlY29uZEF0b20gKyAnXFxuJztcbiAgfVxufVxuXG4vLyB0b2RvOiByZW1vdmVcbmZ1bmN0aW9uIGZpbGxCYWNrYm9uZVRvQnJhbmNoQm9uZChicmFuY2hNb25vbWVyOiBNb2xHcmFwaCwgbW9sZmlsZUJvbmRCbG9jazogc3RyaW5nW10sIHY6IExvb3BWYXJpYWJsZXMpOiB2b2lkIHtcbiAgY29uc3QgYm9uZElkeCA9IHYuYm9uZFNoaWZ0O1xuICBjb25zdCBmaXJzdEF0b20gPSB2LmJyYW5jaEF0dGFjaE5vZGU7XG4gIGNvbnN0IHNlY29uZEF0b20gPSBicmFuY2hNb25vbWVyLm1ldGEudGVybWluYWxOb2Rlc1swXSArIHYubm9kZVNoaWZ0O1xuICBtb2xmaWxlQm9uZEJsb2NrW2JvbmRJZHggLSAxXSA9IFYzS19CRUdJTl9EQVRBX0xJTkUgKyBib25kSWR4ICsgJyAnICtcbiAgICAxICsgJyAnICsgZmlyc3RBdG9tICsgJyAnICsgc2Vjb25kQXRvbSArICdcXG4nO1xufVxuXG4vKiBDb21wdXRlIHRoZSBhdG9tL2JvbmQgY291bnRzIGZvciB0aGUgcmVzdWx0aW5nIG1vbGZpbGUsIGRlcGVuZGluZyBvbiB0aGVcbiAqIHR5cGUgb2YgcG9seW1lciAocGVwdGlkZS9udWNsZW90aWRlKSAqL1xuZnVuY3Rpb24gZ2V0UmVzdWx0aW5nQXRvbUJvbmRDb3VudHMoXG4gIG1vbm9tZXJTZXE6IHN0cmluZ1tdLCBtb25vbWVyc0RpY3Q6IE1hcDxzdHJpbmcsIE1vbEdyYXBoPixcbiAgYWxwaGFiZXQ6IEFMUEhBQkVULCBwb2x5bWVyVHlwZTogSEVMTV9QT0xZTUVSX1RZUEUsXG4gIG1vZGU6IE1PREVcbik6IHsgYXRvbUNvdW50OiBudW1iZXIsIGJvbmRDb3VudDogbnVtYmVyIH0ge1xuICBsZXQgYXRvbUNvdW50ID0gMDtcbiAgbGV0IGJvbmRDb3VudCA9IDA7XG5cbiAgLy8gc3VtIHVwIGFsbCB0aGUgYXRvbXMvbm9kZXMgcHJvdmlkZWQgYnkgdGhlIHNlcXVlbmNlXG4gIGZvciAoY29uc3QgbW9ub21lclN5bWJvbCBvZiBtb25vbWVyU2VxKSB7XG4gICAgY29uc3QgbW9ub21lciA9IG1vbm9tZXJzRGljdC5nZXQobW9ub21lclN5bWJvbCkhO1xuICAgIGF0b21Db3VudCArPSBtb25vbWVyLmF0b21zLngubGVuZ3RoO1xuICAgIGJvbmRDb3VudCArPSBtb25vbWVyLmJvbmRzLmJvbmRUeXBlcy5sZW5ndGg7XG4gIH1cblxuICAvLyBhZGQgZXh0cmEgdmFsdWVzIGRlcGVuZGluZyBvbiB0aGUgcG9seW1lciB0eXBlXG4gIGlmIChtb2RlID09PSBNT0RFLlNUQU5EQVJEKSB7XG4gICAgaWYgKHBvbHltZXJUeXBlID09PSBIRUxNX1BPTFlNRVJfVFlQRS5QRVBUSURFKSB7XG4gICAgICAvLyBhZGQgdGhlIHJpZ2h0bW9zdC90ZXJtaW5hdGluZyBjYXAgZ3JvdXAgJ09IJyAoaS5lLiAnTycpXG4gICAgICBhdG9tQ291bnQgKz0gMTtcbiAgICAgIC8vIGFkZCBjaGFpbi1leHRlbmRpbmcgYm9uZHMgKEMtTkggcGVyIGVhY2ggbW9ub21lciBwYWlyIGFuZCB0ZXJtaW5hbCBDLU9IKVxuICAgICAgYm9uZENvdW50ICs9IG1vbm9tZXJTZXEubGVuZ3RoO1xuICAgIH0gZWxzZSB7IC8vIG51Y2xlb3RpZGVzXG4gICAgICBjb25zdCBzdWdhciA9IChhbHBoYWJldCA9PT0gQUxQSEFCRVQuRE5BKSA/XG4gICAgICAgIG1vbm9tZXJzRGljdC5nZXQoREVPWFlSSUJPU0UpISA6IG1vbm9tZXJzRGljdC5nZXQoUklCT1NFKSE7XG4gICAgICBjb25zdCBwaG9zcGhhdGUgPSBtb25vbWVyc0RpY3QuZ2V0KFBIT1NQSEFURSkhO1xuXG4gICAgICAvLyBhZGQgcGhvc3BoYXRlIGFuZCBzdWdhciBwZXIgZWFjaCBudWNsZW9iYXNlIHN5bWJvbFxuICAgICAgYXRvbUNvdW50ICs9IG1vbm9tZXJTZXEubGVuZ3RoICogKHBob3NwaGF0ZS5hdG9tcy54Lmxlbmd0aCArIHN1Z2FyLmF0b21zLngubGVuZ3RoKTtcbiAgICAgIC8vIGFkZCB0aGUgbGVmdG1vc3QgY2FwIGdyb3VwICdPSCcgKGkuZS4gJ08nKSB0byB0aGUgZmlyc3QgcGhvc3BoYXRlXG4gICAgICBhdG9tQ291bnQgKz0gMTtcblxuICAgICAgLy8gYWRkIGJvbmRzIGZyb20gcGhvc3BoYXRlIGFuZCBzdWdhclxuICAgICAgYm9uZENvdW50ICs9IG1vbm9tZXJTZXEubGVuZ3RoICogKHBob3NwaGF0ZS5ib25kcy5ib25kVHlwZXMubGVuZ3RoICsgc3VnYXIuYm9uZHMuYm9uZFR5cGVzLmxlbmd0aCk7XG5cbiAgICAgIC8vIGFkZCBjaGFpbi1leHRlbmRpbmcgYW5kIGJyYW5jaCBib25kcyAoTy1QLCBDLU8gYW5kIEMtTiBwZXIgZWFjaCBudWNsZW90aWRlKVxuICAgICAgYm9uZENvdW50ICs9IG1vbm9tZXJTZXEubGVuZ3RoICogMztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gdG9kbzogZmlsbCBmb3IgU2VxdWVuY2VUcmFuc2xhdG9yXG4gIH1cblxuICByZXR1cm4ge2F0b21Db3VudCwgYm9uZENvdW50fTtcbn1cblxuLyogS2VlcCBwcmVjaXNpb24gdXBvbiBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zIG92ZXIgYXRvbSBjb29yZGluYXRlcyAqL1xuZnVuY3Rpb24ga2VlcFByZWNpc2lvbih4OiBudW1iZXIpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoUFJFQ0lTSU9OX0ZBQ1RPUiAqIHgpIC8gUFJFQ0lTSU9OX0ZBQ1RPUjtcbn1cblxuZnVuY3Rpb24gY29udmVydE1vbEdyYXBoVG9Nb2xmaWxlVjNLKG1vbEdyYXBoOiBNb2xHcmFwaCk6IHN0cmluZyB7XG4gIC8vIGNvdW50cyBsaW5lXG4gIGNvbnN0IGF0b21UeXBlID0gbW9sR3JhcGguYXRvbXMuYXRvbVR5cGVzO1xuICBjb25zdCB4ID0gbW9sR3JhcGguYXRvbXMueDtcbiAgY29uc3QgeSA9IG1vbEdyYXBoLmF0b21zLnk7XG4gIGNvbnN0IGF0b21Ld2FyZ3MgPSBtb2xHcmFwaC5hdG9tcy5rd2FyZ3M7XG4gIGNvbnN0IGJvbmRUeXBlID0gbW9sR3JhcGguYm9uZHMuYm9uZFR5cGVzO1xuICBjb25zdCBhdG9tUGFpciA9IG1vbEdyYXBoLmJvbmRzLmF0b21QYWlycztcbiAgY29uc3QgYm9uZEt3YXJncyA9IG1vbEdyYXBoLmJvbmRzLmt3YXJncztcbiAgY29uc3QgYm9uZENvbmZpZyA9IG1vbEdyYXBoLmJvbmRzLmJvbmRDb25maWd1cmF0aW9uO1xuICBjb25zdCBhdG9tQ291bnQgPSBhdG9tVHlwZS5sZW5ndGg7XG4gIGNvbnN0IGJvbmRDb3VudCA9IG1vbEdyYXBoLmJvbmRzLmJvbmRUeXBlcy5sZW5ndGg7XG5cbiAgLy8gdG9kbyByZXdyaXRlIHVzaW5nIGNvbnN0YW50c1xuICBjb25zdCBtb2xmaWxlQ291bnRzTGluZSA9IFYzS19CRUdJTl9DT1VOVFNfTElORSArIGF0b21Db3VudCArICcgJyArIGJvbmRDb3VudCArIFYzS19DT1VOVFNfTElORV9FTkRJTkc7XG5cbiAgLy8gYXRvbSBibG9ja1xuICBsZXQgbW9sZmlsZUF0b21CbG9jayA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGF0b21Db3VudDsgKytpKSB7XG4gICAgY29uc3QgYXRvbUlkeCA9IGkgKyAxO1xuICAgIGNvbnN0IGNvb3JkaW5hdGUgPSBbeFtpXS50b1N0cmluZygpLCB5W2ldLnRvU3RyaW5nKCldO1xuXG4gICAgLy8gZm9ybWF0IGNvb3JkaW5hdGVzIHNvIHRoYXQgdGhleSBoYXZlIDYgZGlnaXRzIGFmdGVyIGRlY2ltYWwgcG9pbnRcbiAgICAvLyBmb3IgKGxldCBrID0gMDsgayA8IDI7ICsraykge1xuICAgIC8vICAgY29uc3QgZm9ybWF0dGVkID0gY29vcmRpbmF0ZVtrXS50b1N0cmluZygpLnNwbGl0KCcuJyk7XG4gICAgLy8gICBpZiAoZm9ybWF0dGVkLmxlbmd0aCA9PT0gMSlcbiAgICAvLyAgICAgZm9ybWF0dGVkLnB1c2goJzAnKTtcbiAgICAvLyAgIGZvcm1hdHRlZFsxXSA9IGZvcm1hdHRlZFsxXS5wYWRFbmQoVjNLX0FUT01fQ09PUkRJTkFURV9QUkVDSVNJT04sICcwJyk7XG4gICAgLy8gICBjb29yZGluYXRlW2tdID0gZm9ybWF0dGVkLmpvaW4oJy4nKTtcbiAgICAvLyB9XG5cbiAgICBjb25zdCBhdG9tTGluZSA9IFYzS19CRUdJTl9EQVRBX0xJTkUgKyBhdG9tSWR4ICsgJyAnICsgYXRvbVR5cGVbaV0gKyAnICcgK1xuICAgICAgY29vcmRpbmF0ZVswXSArICcgJyArIGNvb3JkaW5hdGVbMV0gKyAnICcgKyBhdG9tS3dhcmdzW2ldO1xuICAgIG1vbGZpbGVBdG9tQmxvY2sgKz0gYXRvbUxpbmU7XG4gIH1cblxuICAvLyBib25kIGJsb2NrXG4gIGxldCBtb2xmaWxlQm9uZEJsb2NrID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYm9uZENvdW50OyArK2kpIHtcbiAgICBjb25zdCBib25kSWR4ID0gaSArIDE7XG4gICAgY29uc3QgZmlyc3RBdG9tID0gYXRvbVBhaXJbaV1bMF07XG4gICAgY29uc3Qgc2Vjb25kQXRvbSA9IGF0b21QYWlyW2ldWzFdO1xuICAgIGNvbnN0IGt3YXJncyA9IGJvbmRLd2FyZ3MuaGFzKGkpID8gJyAnICsgYm9uZEt3YXJncy5nZXQoaSkgOiAnJztcbiAgICBjb25zdCBib25kQ2ZnID0gYm9uZENvbmZpZy5oYXMoaSkgPyAnIENGRz0nICsgYm9uZENvbmZpZy5nZXQoaSkgOiAnJztcbiAgICBjb25zdCBib25kTGluZSA9IFYzS19CRUdJTl9EQVRBX0xJTkUgKyBib25kSWR4ICsgJyAnICsgYm9uZFR5cGVbaV0gKyAnICcgK1xuICAgICAgZmlyc3RBdG9tICsgJyAnICsgc2Vjb25kQXRvbSArIGJvbmRDZmcgKyBrd2FyZ3MgKyAnXFxuJztcbiAgICBtb2xmaWxlQm9uZEJsb2NrICs9IGJvbmRMaW5lO1xuICB9XG5cbiAgY29uc3QgbW9sZmlsZVBhcnRzID0gW1xuICAgIFYzS19IRUFERVJfRklSU1RfTElORSxcbiAgICBWM0tfSEVBREVSX1NFQ09ORF9MSU5FLFxuICAgIFYzS19CRUdJTl9DVEFCX0JMT0NLLFxuICAgIG1vbGZpbGVDb3VudHNMaW5lLFxuICAgIFYzS19CRUdJTl9BVE9NX0JMT0NLLFxuICAgIG1vbGZpbGVBdG9tQmxvY2ssXG4gICAgVjNLX0VORF9BVE9NX0JMT0NLLFxuICAgIFYzS19CRUdJTl9CT05EX0JMT0NLLFxuICAgIG1vbGZpbGVCb25kQmxvY2ssXG4gICAgVjNLX0VORF9CT05EX0JMT0NLLFxuICAgIFYzS19FTkRfQ1RBQl9CTE9DSyxcbiAgICBWM0tfRU5ELFxuICBdO1xuICBjb25zdCByZXN1bHRpbmdNb2xmaWxlID0gbW9sZmlsZVBhcnRzLmpvaW4oJycpO1xuICAvLyBjb25zb2xlLmxvZyhyZXN1bHRpbmdNb2xmaWxlKTtcblxuICByZXR1cm4gcmVzdWx0aW5nTW9sZmlsZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFN5bWJvbFRvQ2FwcGVkTW9sZmlsZU1hcChtb25vbWVyc0xpYkxpc3Q6IGFueVtdKTogUHJvbWlzZTxNYXA8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkPiB7XG4gIGlmIChERy5GdW5jLmZpbmQoe3BhY2thZ2U6ICdDaGVtJywgbmFtZTogJ2dldFJkS2l0TW9kdWxlJ30pLmxlbmd0aCA9PT0gMCkge1xuICAgIGdyb2suc2hlbGwud2FybmluZygnVHJhbnNmb3JtYXRpb24gdG8gYXRvbWljIGxldmVsIHJlcXVpcmVzIHBhY2thZ2UgXCJDaGVtXCIgaW5zdGFsbGVkLicpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHN5bWJvbFRvQ2FwcGVkTW9sZmlsZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGNvbnN0IG1vZHVsZVJka2l0ID0gYXdhaXQgZ3Jvay5mdW5jdGlvbnMuY2FsbCgnQ2hlbTpnZXRSZEtpdE1vZHVsZScpO1xuXG4gIGZvciAoY29uc3QgbW9ub21lckxpYk9iamVjdCBvZiBtb25vbWVyc0xpYkxpc3QpIHtcbiAgICBjb25zdCBtb25vbWVyU3ltYm9sID0gbW9ub21lckxpYk9iamVjdFtIRUxNX0ZJRUxEUy5TWU1CT0xdO1xuICAgIGNvbnN0IGNhcEdyb3VwcyA9IHBhcnNlQ2FwR3JvdXBzKG1vbm9tZXJMaWJPYmplY3RbSEVMTV9GSUVMRFMuUkdST1VQU10pO1xuICAgIGNvbnN0IGNhcEdyb3VwSWR4TWFwID0gcGFyc2VDYXBHcm91cElkeE1hcChtb25vbWVyTGliT2JqZWN0W0hFTE1fRklFTERTLk1PTEZJTEVdKTtcblxuICAgIGNvbnN0IG1vbGZpbGVWM0sgPSBjb252ZXJ0TW9sZmlsZVRvVjNLKHJlbW92ZVJHcm91cExpbmVzKG1vbm9tZXJMaWJPYmplY3RbSEVMTV9GSUVMRFMuTU9MRklMRV0pLCBtb2R1bGVSZGtpdCk7XG4gICAgY29uc3QgY291bnRzID0gcGFyc2VBdG9tQW5kQm9uZENvdW50cyhtb2xmaWxlVjNLKTtcblxuICAgIGNvbnN0IGF0b21zID0gcGFyc2VBdG9tQmxvY2sobW9sZmlsZVYzSywgY291bnRzLmF0b21Db3VudCk7XG4gICAgY29uc3QgYm9uZHMgPSBwYXJzZUJvbmRCbG9jayhtb2xmaWxlVjNLLCBjb3VudHMuYm9uZENvdW50KTtcbiAgICBjb25zdCBtZXRhID0gZ2V0TW9ub21lck1ldGFkYXRhKGF0b21zLCBib25kcywgY2FwR3JvdXBzLCBjYXBHcm91cElkeE1hcCk7XG5cbiAgICBjb25zdCBtb25vbWVyR3JhcGg6IE1vbEdyYXBoID0ge2F0b21zOiBhdG9tcywgYm9uZHM6IGJvbmRzLCBtZXRhOiBtZXRhfTtcblxuICAgIHJlbW92ZUh5ZHJvZ2VuKG1vbm9tZXJHcmFwaCk7XG5cbiAgICBjb25zdCBtb2xmaWxlID0gY29udmVydE1vbEdyYXBoVG9Nb2xmaWxlVjNLKG1vbm9tZXJHcmFwaCk7XG4gICAgc3ltYm9sVG9DYXBwZWRNb2xmaWxlTWFwLnNldChtb25vbWVyU3ltYm9sLCBtb2xmaWxlKTtcbiAgfVxuICByZXR1cm4gc3ltYm9sVG9DYXBwZWRNb2xmaWxlTWFwO1xufVxuXG4vKiBHZXQgdGhlIFYzSyBtb2xmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhcHBlZCBNb25vbWVyIChkZWZhdWx0IGNhcCBncm91cHMpICAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhcFBlcHRpZGVNb25vbWVyKG1vbm9tZXI6IE1vbm9tZXIpOiBzdHJpbmcge1xuICBjb25zdCBmdW5jTGlzdDogREcuRnVuY1tdID0gREcuRnVuYy5maW5kKHtwYWNrYWdlOiAnQ2hlbScsIG5hbWU6ICdnZXRSZEtpdE1vZHVsZSd9KTtcbiAgY29uc3QgbW9kdWxlUmRraXQgPSBmdW5jTGlzdFswXS5hcHBseSgpO1xuXG4gIGNvbnN0IGNhcEdyb3VwcyA9IHBhcnNlQ2FwR3JvdXBzKG1vbm9tZXJbSEVMTV9GSUVMRFMuUkdST1VQU10pO1xuICBjb25zdCBjYXBHcm91cElkeE1hcCA9IHBhcnNlQ2FwR3JvdXBJZHhNYXAobW9ub21lcltIRUxNX0ZJRUxEUy5NT0xGSUxFXSk7XG4gIGNvbnN0IG1vbGZpbGVWM0sgPSBjb252ZXJ0TW9sZmlsZVRvVjNLKHJlbW92ZVJHcm91cExpbmVzKG1vbm9tZXJbSEVMTV9GSUVMRFMuTU9MRklMRV0pLCBtb2R1bGVSZGtpdCk7XG4gIGNvbnN0IGNvdW50cyA9IHBhcnNlQXRvbUFuZEJvbmRDb3VudHMobW9sZmlsZVYzSyk7XG5cbiAgY29uc3QgYXRvbXMgPSBwYXJzZUF0b21CbG9jayhtb2xmaWxlVjNLLCBjb3VudHMuYXRvbUNvdW50KTtcbiAgY29uc3QgYm9uZHMgPSBwYXJzZUJvbmRCbG9jayhtb2xmaWxlVjNLLCBjb3VudHMuYm9uZENvdW50KTtcbiAgY29uc3QgbWV0YSA9IGdldE1vbm9tZXJNZXRhZGF0YShhdG9tcywgYm9uZHMsIGNhcEdyb3VwcywgY2FwR3JvdXBJZHhNYXApO1xuXG4gIGNvbnN0IG1vbm9tZXJHcmFwaDogTW9sR3JhcGggPSB7YXRvbXM6IGF0b21zLCBib25kczogYm9uZHMsIG1ldGE6IG1ldGF9O1xuXG4gIGFkanVzdFBlcHRpZGVNb25vbWVyR3JhcGgobW9ub21lckdyYXBoKTtcblxuICBjb25zdCBtb2xmaWxlID0gY29udmVydE1vbEdyYXBoVG9Nb2xmaWxlVjNLKG1vbm9tZXJHcmFwaCk7XG4gIHJldHVybiBtb2xmaWxlO1xufVxuXG4vLy8vLy8vLy8vLy8vLy8gIFNlcXVlbmNlIHRyYW5zbGF0b3IgLy8vLy8vLy8vLy8vLy8vLy9cblxuLyoqIEN1cnJlbnRseSB0aGUgU1QgaGFzIHBlY3VsaWFyIHR5cGVzIG9mIG1vbm9tZXJzLCB3aGljaCBkbyBub3QgZml0IHRoZSBIRUxNXG4gKiBDb3JlIGxpYnJhcnkgdHlwZXMgKGluIHBhcnRpY3VsYXIsIHRoZSBSTkEgbW9ub21lcnMgYXJlIGJhY2tib25lcyBvbmx5LFxuICogYW5kIHByZXNlbnRlZCBpbiBNb2xmaWxlIFYzSyBmb3JtYXQpLlxuICogVE9ETzogaW50ZWdyYXRlIHRoaXMgcGFydCB3aXRoIHRoZSBhYm92ZSBmdW5jdGlvbmFsaXR5XG4gKiBDdXN0b20gX3RvQXRvbWljTGV2ZWwgdmVyc2lvbiBmb3IgU2VxdWVuY2VUcmFuc2xhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXF1ZW5jZVRvTW9sRmlsZVNUKFxuICBtb25vbWVyU2VxOiBzdHJpbmdbXSwgLy8gc2VxdWVuY2Ugb2YgdmFsdWVzIG9mICdzeW1ib2wnIGZpZWxkIGZvciBtb25vbWVyc1xuICBzeW1ib2xUb01vbGZpbGVWM0tPYmo6IHsgW3N5bWJvbDogc3RyaW5nXTogc3RyaW5nIH0gLy8gbWFwcGluZyBvZiBzeW1ib2wgdG8gbW9sZmlsZSBWMzAwMFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIC8vIHdvcmsgaW4gU0VRX1RSQU4gbW9kZSwgd2hlcmU6XG4gIC8vIC0gbW9ub21lcnMgd2l0aCBwb2x5bWVyVHlwZSAnUk5BJyBoYXZlIG1vbm9tZXIgdHlwZSAnYmFja2JvbmUnXG4gIC8vIC0gdGhlIGxpYnJhcnkgcHJvdmlkZXMgbW9sZmlsZXMgaW4gZm9ybWF0IFYzMDAwXG4gIGNvbnN0IG1vZGUgPSBNT0RFLlNFUV9UUkFOO1xuICBjb25zdCBhbHBoYWJldCA9IEFMUEhBQkVULlBUOyAvLyBkdW1teSB2YWx1ZSEgdG9kbzogbWFrZSB0aGUgYXJndW1lbnQgb3B0aW9uYWxcbiAgY29uc3QgcG9seW1lclR5cGUgPSBIRUxNX1BPTFlNRVJfVFlQRS5STkE7IC8vIGR1bW15IHZhbHVlISB0b2RvOiBtYWtlIHRoZSBhcmd1bWVudCBvcHRpb25hbFxuXG4gIC8vIHRvZG86IGNvbnNpZGVyIHJlZmFjdG9yaW5nIGZyb20gb2JqIHRvIG1hcCBpbiBtb25vbWVyLXdvcmxzXG4gIGNvbnN0IHN5bWJvbFRvTW9sZmlsZVYzS01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3Qgc3ltIGluIHN5bWJvbFRvTW9sZmlsZVYzS09iailcbiAgICBzeW1ib2xUb01vbGZpbGVWM0tNYXAuc2V0KHN5bSwgc3ltYm9sVG9Nb2xmaWxlVjNLT2JqW3N5bV0pO1xuXG4gIGNvbnN0IG1vbm9tZXJzRGljdCA9IGdldE1vbm9tZXJzRGljdEZyb21NYXAoc3ltYm9sVG9Nb2xmaWxlVjNLTWFwKTtcbiAgY29uc3QgcmVzdWx0ID0gbW9ub21lclNlcVRvTW9sZmlsZShtb25vbWVyU2VxLCBtb25vbWVyc0RpY3QsIGFscGhhYmV0LCBwb2x5bWVyVHlwZSwgbW9kZSk7XG4gIC8vIGNvbnNvbGUubG9nKHJlY29uc3RydWN0ZWRbcm93XSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyogQ29tcHV0ZSB0aGUgYXRvbS9ib25kIGNvdW50cyBmb3IgdGhlIHJlc3VsdGluZyBtb2xmaWxlLCBkZXBlbmRpbmcgb24gdGhlXG4gKiB0eXBlIG9mIHBvbHltZXIgKHBlcHRpZGUvbnVjbGVvdGlkZSkgKi9cbmZ1bmN0aW9uIGdldFJlc3VsdGluZ0F0b21Cb25kQ291bnRzU1QoXG4gIG1vbm9tZXJTZXE6IHN0cmluZ1tdLCBtb25vbWVyc0RpY3Q6IE1hcDxzdHJpbmcsIE1vbEdyYXBoPixcbiAgYWxwaGFiZXQ6IEFMUEhBQkVULCBwb2x5bWVyVHlwZTogSEVMTV9QT0xZTUVSX1RZUEVcbik6IHsgYXRvbUNvdW50OiBudW1iZXIsIGJvbmRDb3VudDogbnVtYmVyIH0ge1xuICBsZXQgYXRvbUNvdW50ID0gMDtcbiAgbGV0IGJvbmRDb3VudCA9IDA7XG5cbiAgLy8gc3VtIHVwIGFsbCB0aGUgYXRvbXMvbm9kZXMgcHJvdmlkZWQgYnkgdGhlIHNlcXVlbmNlXG4gIGZvciAoY29uc3QgbW9ub21lclN5bWJvbCBvZiBtb25vbWVyU2VxKSB7XG4gICAgY29uc3QgbW9ub21lciA9IG1vbm9tZXJzRGljdC5nZXQobW9ub21lclN5bWJvbCkhO1xuICAgIGF0b21Db3VudCArPSBtb25vbWVyLmF0b21zLngubGVuZ3RoO1xuICAgIGJvbmRDb3VudCArPSBtb25vbWVyLmJvbmRzLmJvbmRUeXBlcy5sZW5ndGg7XG4gIH1cblxuICAvLyBhZGQgZXh0cmEgdmFsdWVzIGRlcGVuZGluZyBvbiB0aGUgcG9seW1lciB0eXBlXG4gIGlmIChwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUEVQVElERSkge1xuICAgIC8vIGFkZCB0aGUgcmlnaHRtb3N0L3Rlcm1pbmF0aW5nIGNhcCBncm91cCAnT0gnIChpLmUuICdPJylcbiAgICBhdG9tQ291bnQgKz0gMTtcbiAgICAvLyBhZGQgY2hhaW4tZXh0ZW5kaW5nIGJvbmRzIChDLU5IIHBlciBlYWNoIG1vbm9tZXIgcGFpciBhbmQgdGVybWluYWwgQy1PSClcbiAgICBib25kQ291bnQgKz0gbW9ub21lclNlcS5sZW5ndGg7XG4gIH0gZWxzZSB7IC8vIG51Y2xlb3RpZGVzXG4gICAgY29uc3Qgc3VnYXIgPSAoYWxwaGFiZXQgPT09IEFMUEhBQkVULkROQSkgP1xuICAgICAgbW9ub21lcnNEaWN0LmdldChERU9YWVJJQk9TRSkhIDogbW9ub21lcnNEaWN0LmdldChSSUJPU0UpITtcbiAgICBjb25zdCBwaG9zcGhhdGUgPSBtb25vbWVyc0RpY3QuZ2V0KFBIT1NQSEFURSkhO1xuXG4gICAgLy8gYWRkIHBob3NwaGF0ZSBhbmQgc3VnYXIgcGVyIGVhY2ggbnVjbGVvYmFzZSBzeW1ib2xcbiAgICBhdG9tQ291bnQgKz0gbW9ub21lclNlcS5sZW5ndGggKiAocGhvc3BoYXRlLmF0b21zLngubGVuZ3RoICsgc3VnYXIuYXRvbXMueC5sZW5ndGgpO1xuICAgIC8vIGFkZCB0aGUgbGVmdG1vc3QgY2FwIGdyb3VwICdPSCcgKGkuZS4gJ08nKSB0byB0aGUgZmlyc3QgcGhvc3BoYXRlXG4gICAgYXRvbUNvdW50ICs9IDE7XG5cbiAgICAvLyBhZGQgYm9uZHMgZnJvbSBwaG9zcGhhdGUgYW5kIHN1Z2FyXG4gICAgYm9uZENvdW50ICs9IG1vbm9tZXJTZXEubGVuZ3RoICogKHBob3NwaGF0ZS5ib25kcy5ib25kVHlwZXMubGVuZ3RoICsgc3VnYXIuYm9uZHMuYm9uZFR5cGVzLmxlbmd0aCk7XG5cbiAgICAvLyBhZGQgY2hhaW4tZXh0ZW5kaW5nIGFuZCBicmFuY2ggYm9uZHMgKE8tUCwgQy1PIGFuZCBDLU4gcGVyIGVhY2ggbnVjbGVvdGlkZSlcbiAgICBib25kQ291bnQgKz0gbW9ub21lclNlcS5sZW5ndGggKiAzO1xuICB9XG5cbiAgcmV0dXJuIHthdG9tQ291bnQsIGJvbmRDb3VudH07XG59XG4iXX0=
1247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG8tYXRvbWljLWxldmVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidG8tYXRvbWljLWxldmVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLHlGQUF5RjtBQUN6RixPQUFPLEtBQUssSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFjLGdCQUFnQixFQUE0RCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hILE9BQU8sRUFBVyxXQUFXLEVBQStCLE1BQU0sd0JBQXdCLENBQUM7QUFDM0YsdURBQXVEO0FBQ3ZELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRTlELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUV4RSxzQ0FBc0M7QUFDdEMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUM5QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUM7QUFFekIsd0RBQXdEO0FBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBQzVCLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUN4QixNQUFNLHFCQUFxQixHQUFHLHNDQUFzQyxDQUFDO0FBQ3JFLE1BQU0sc0JBQXNCLEdBQUcsMkNBQTJDLENBQUM7QUFDM0UsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNuRCxNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO0FBQy9DLE1BQU0scUJBQXFCLEdBQUcsZ0JBQWdCLENBQUM7QUFDL0MsTUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUM7QUFDMUMsTUFBTSxvQkFBb0IsR0FBRyxxQkFBcUIsQ0FBQztBQUNuRCxNQUFNLGtCQUFrQixHQUFHLG1CQUFtQixDQUFDO0FBQy9DLE1BQU0sb0JBQW9CLEdBQUcscUJBQXFCLENBQUM7QUFD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QUMsTUFBTSxHQUFHLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRW5HLDhFQUE4RTtRQUM5RSxTQUFTLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDcEM7SUFFRCxPQUFPLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBEbyBub3QgY2hhbmdlIHRoZXNlIGltcG9ydCBsaW5lcyB0byBtYXRjaCBleHRlcm5hbCBtb2R1bGVzIGluIHdlYnBhY2sgY29uZmlndXJhdGlvbiAqL1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5pbXBvcnQgKiBhcyBERyBmcm9tICdkYXRhZ3Jvay1hcGkvZGcnO1xuaW1wb3J0IHtIRUxNX0ZJRUxEUywgSEVMTV9DT1JFX0ZJRUxEUywgSEVMTV9QT0xZTUVSX1RZUEUsIEhFTE1fTU9OT01FUl9UWVBFLCBSR1JPVVBfRklFTERTLCBNT0RFfSBmcm9tICcuLi91dGlscy9jb25zdCc7XG5pbXBvcnQge0FMUEhBQkVULCBnZXRTcGxpdHRlciwgTk9UQVRJT04sIFNwbGl0dGVyRnVuYywgVEFHU30gZnJvbSAnLi4vdXRpbHMvbWFjcm9tb2xlY3VsZSc7XG4vLyBpbXBvcnQge1VuaXRzSGFuZGxlcn0gZnJvbSAnLi4vdXRpbHMvdW5pdHMtaGFuZGxlcic7XG5pbXBvcnQge05vdGF0aW9uQ29udmVydGVyfSBmcm9tICcuLi91dGlscy9ub3RhdGlvbi1jb252ZXJ0ZXInO1xuaW1wb3J0IHtNb25vbWVyfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Vycm9yVG9Db25zb2xlfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL3V0aWxzL3NyYy90by1jb25zb2xlJztcblxuLy8gY29uc3RhbnRzIGZvciBwYXJzaW5nIG1vbGZpbGUgVjIwMDBcbmNvbnN0IFYyS19SR1BfU0hJRlQgPSA4O1xuY29uc3QgVjJLX1JHUF9MSU5FID0gJ00gIFJHUCc7XG5jb25zdCBWMktfQV9MSU5FID0gJ0EgICc7XG5cbi8vIGNvbnN0YW50cyBmb3IgcGFyc2luZy9yZWNvbnN0cnVjdGlvbiBvZiBtb2xmaWxlIFYzMDAwXG5jb25zdCBWM0tfQ09VTlRTX1NISUZUID0gMTQ7XG5jb25zdCBWM0tfSURYX1NISUZUID0gNztcbmNvbnN0IFYzS19IRUFERVJfRklSU1RfTElORSA9ICdcXG5EYXRhZ3JvayBtYWNyb21vbGVjdWxlIGhhbmRsZXJcXG5cXG4nO1xuY29uc3QgVjNLX0hFQURFUl9TRUNPTkRfTElORSA9ICcgIDAgIDAgIDAgIDAgIDAgIDAgICAgICAgICAgICA5OTkgVjMwMDBcXG4nO1xuY29uc3QgVjNLX0JFR0lOX0NUQUJfQkxPQ0sgPSAnTSAgVjMwIEJFR0lOIENUQUJcXG4nO1xuY29uc3QgVjNLX0VORF9DVEFCX0JMT0NLID0gJ00gIFYzMCBFTkQgQ1RBQlxcbic7XG5jb25zdCBWM0tfQkVHSU5fQ09VTlRTX0xJTkUgPSAnTSAgVjMwIENPVU5UUyAnO1xuY29uc3QgVjNLX0NPVU5UU19MSU5FX0VORElORyA9ICcgMCAwIDBcXG4nO1xuY29uc3QgVjNLX0JFR0lOX0FUT01fQkxPQ0sgPSAnTSAgVjMwIEJFR0lOIEFUT01cXG4nO1xuY29uc3QgVjNLX0VORF9BVE9NX0JMT0NLID0gJ00gIFYzMCBFTkQgQVRPTVxcbic7XG5jb25zdCBWM0tfQkVHSU5fQk9ORF9CTE9DSyA9ICdNICBWMzAgQkVHSU4gQk9ORFxcbic7XG5jb25zdCBWM0tfRU5EX0JPTkRfQkxPQ0sgPSAnTSAgVjMwIEVORCBCT05EXFxuJztcbmNvbnN0IFYzS19CT05EX0NPTkZJRyA9ICcgQ0ZHPSc7XG5jb25zdCBWM0tfQkVHSU5fREFUQV9MSU5FID0gJ00gIFYzMCAnO1xuY29uc3QgVjNLX0VORCA9ICdNICBFTkRcXG4nO1xuXG5jb25zdCBQUkVDSVNJT05fRkFDVE9SID0gMTBfMDAwOyAvLyBIRUxNQ29yZUxpYnJhcnkgaGFzIDQgc2lnbmlmaWNhbnQgZGlnaXRzIGFmdGVyIGRlY2ltYWwgcG9pbnQgaW4gYXRvbSBjb29yZGluYXRlc1xuXG4vLyBzeW1ib2xzIGZvciB0aGUgY29ycmVzcG9uZGluZyBtb25vbWVycyBpbiBIRUxNIGxpYnJhcnlcbmNvbnN0IERFT1hZUklCT1NFID0gJ2QnO1xuY29uc3QgUklCT1NFID0gJ3InO1xuY29uc3QgUEhPU1BIQVRFID0gJ3AnO1xuXG5jb25zdCBPWFlHRU4gPSAnTyc7XG5jb25zdCBIWURST0dFTiA9ICdIJztcblxuLyogU3RvcmVzIG5lY2Vzc2FyeSBkYXRhIGFib3V0IGF0b21zIG9mIGEgbW9ub21lciBwYXJzZWQgZnJvbSBNb2xmaWxlICovXG50eXBlIEF0b21zID0ge1xuICAvKiBlbGVtZW50IHN5bWJvbHMgZm9yIG1vbm9tZXIncyBhdG9tcyAqL1xuICBhdG9tVHlwZXM6IHN0cmluZ1tdLFxuICAvKiBDYXJ0ZXNpYW4gY29vcmRpYW50ZXMgb2YgbW9ub21lcidzIGF0b21zICovXG4gIHg6IG51bWJlcltdLCAvLyB0b2RvOiBjb252ZXJ0IHRvIEZsb2F0MzJcbiAgeTogbnVtYmVyW10sXG4gIC8qIFYzSyBhdG9tIGxpbmUgbWF5IGNvbnRhaW4ga2V5d29yZCBhcmdzICovXG4gIGt3YXJnczogc3RyaW5nW10sXG59XG5cbi8qIFN0b3JlcyBuZWNlc3NhcnkgZGF0YSBhYm91dCBib25kcyBvZiBhIG1vbm9tZXIgcGFyc2VkIGZyb20gTW9sZmlsZSAqL1xudHlwZSBCb25kcyA9IHtcbiAgLyogYm9uZCB0eXBlcyBmb3IgYWxsIGxpbmVzIG9mIE1vbGZpbGUgYm9uZCBibG9jayAqL1xuICBib25kVHlwZXM6IG51bWJlcltdLCAvLyB0b2RvOiBjb252ZXJ0IHRvIEluZDMyXG4gIC8qIEluZGljZXMgb2YgYWxsIGF0b20gcGFpcnMsIGluZGV4aW5nIHN0YXJ0aW5nIGZyb20gMSAgKi9cbiAgYXRvbVBhaXJzOiBudW1iZXJbXVtdLFxuICAvKiBJZiBhIGJvbmQgaGFzIENGRz0uLi4ga2V5d29yZCBhcmd1bWVudCwgaXQgaXMgcGFyc2VkIGFuZCBzb3RyZWQgYXMgYVxuICAgKiB2YWx1ZSBvZiB0aGUgbWFwLCB3aXRoIHRoZSBrZXkgYmVpbmcgdGhlIGJvbmQncyBpbmRleCAgKi9cbiAgYm9uZENvbmZpZ3VyYXRpb246IE1hcDxudW1iZXIsIG51bWJlcj4sXG4gIC8qIFYzSyBib25kIGxpbmUgbWF5IGNvbnRhaW4ga2V5d29yZCBhcmdzICovXG4gIGt3YXJnczogTWFwPG51bWJlciwgc3RyaW5nPixcbn1cblxuLyogTWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb25vbWVyIG5lY2Vzc2FyeSB0byByZXN0b3JlIHRoZSByZXN1bHRpbmdcbiAqIG1vbGZpbGUgICovXG50eXBlIE1vbm9tZXJNZXRhZGF0YSA9IHtcbiAgLyogdGVybWluYWwgbm9kZXM6IDAtdGggY29ycmVzcG9uZHMgdG8gdGhlIFwibGVmdG1vc3RcIiBvbmUsIDFzdCwgdG8gdGhlIFwicmlnaHRtb3N0XCIsXG4gICAqIGUuZy4gTi10ZXJtaW51cyBhbmQgQy10ZXJtaW51cyBpbiBwZXB0aWRlcyAqL1xuICB0ZXJtaW5hbE5vZGVzOiBudW1iZXJbXSxcbiAgLyogci1ncm91cCBub2RlczogMC10aCBjb3JyZXNwb25kcyB0byB0aGUgXCJsZWZ0bW9zdFwiIG9uZSwgMXN0LCB0byB0aGUgXCJyaWdodG1vc3RcIiAqL1xuICByTm9kZXM6IG51bWJlcltdLFxuICAvKiBzaGlmdCBmcm9tIHRoZSBvcmlnaW4gdG8gdGhlIG5leHQgYmFja2JvbmUsIG51bGwgZm9yIGJyYW5jaCBtb25vbWVycyAqL1xuICBiYWNrYm9uZVNoaWZ0OiBudW1iZXJbXSB8IG51bGwsXG4gIC8qIHNoaWZ0IGZyb20gdGhlIG9yaWdpbiB0byB0aGUgbmV4dCBicmFuY2gsIG51bGwgZm9yIGJyYW5jaCBtb25vbWVycyAqL1xuICBicmFuY2hTaGlmdDogbnVtYmVyW10gfCBudWxsXG59XG5cbnR5cGUgTW9sR3JhcGggPSB7XG4gIGF0b21zOiBBdG9tcyxcbiAgYm9uZHM6IEJvbmRzLFxuICBtZXRhOiBNb25vbWVyTWV0YWRhdGEsXG59XG5cbi8qIEhlbHBlciBzdHJ1Y3R1cmUgd3JhcHBpbmcgY29tbW9uIGFyZ3VtZW50cyB0byBzZXZlcmFsIGZ1bmN0aW9ucyAqL1xudHlwZSBMb29wVmFyaWFibGVzID0ge1xuICBpOiBudW1iZXIsXG4gIG5vZGVTaGlmdDogbnVtYmVyLFxuICBib25kU2hpZnQ6IG51bWJlcixcbiAgYmFja2JvbmVQb3NpdGlvblNoaWZ0OiBudW1iZXJbXSxcbiAgYmFja2JvbmVBdHRhY2hOb2RlOiBudW1iZXI7IC8vIG5vZGUgdG8gd2hpY2ggdGhlIG5leHQgYmFja2JvbmUgaXMgYXR0YWNoZWRcbiAgYnJhbmNoUG9zaXRpb25TaGlmdDogbnVtYmVyW10sXG4gIGJyYW5jaEF0dGFjaE5vZGU6IG51bWJlcixcbiAgZmxpcEZhY3RvcjogbnVtYmVyLFxuICAvLyB0b2RvOiBzaG91bGQgd2UgY29uc2lkZXIgcmVwcmVzZW50YXRpb25zIG90aGVyIHRoYW4gcGxhbmFyP1xufVxuXG4vKiBIZWxwZXIgc3RydWN0dXJlIHdyYXBwaW5nIGNvbW1vbiBhcmd1bWVudHMgdG8gc2V2ZXJhbCBmdW5jdGlvbnMgKi9cbnR5cGUgTG9vcENvbnN0YW50cyA9IHtcbiAgc3VnYXI6IE1vbEdyYXBoIHwgbnVsbCxcbiAgcGhvc3BoYXRlOiBNb2xHcmFwaCB8IG51bGwsXG4gIHNlcUxlbmd0aDogbnVtYmVyLFxuICBhdG9tQ291bnQ6IG51bWJlcixcbiAgYm9uZENvdW50OiBudW1iZXIsXG59XG5cbi8vIHRvZG86IHZlcmlmeSB0aGF0IGFsbCBmdW5jdGlvbnMgaGF2ZSByZXR1cm4gdHlwZXNcblxuLyogQ29udmVydCBNYWNyb21vbGVjdWxlIGNvbHVtbiBpbnRvIE1vbGVjdWxlIGNvbHVtbiBzdG9yaW5nIG1vbGZpbGUgVjMwMDAgd2l0aCB0aGUgaGVscCBvZiBhIG1vbm9tZXIgbGlicmFyeSAgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBfdG9BdG9taWNMZXZlbChcbiAgZGY6IERHLkRhdGFGcmFtZSwgbWFjcm9Nb2xDb2w6IERHLkNvbHVtbjxzdHJpbmc+LCBtb25vbWVyc0xpYkxpc3Q6IGFueVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKERHLkZ1bmMuZmluZCh7cGFja2FnZTogJ0NoZW0nLCBuYW1lOiAnZ2V0UmRLaXRNb2R1bGUnfSkubGVuZ3RoID09PSAwKSB7XG4gICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdUcmFuc2Zvcm1hdGlvbiB0byBhdG9taWMgbGV2ZWwgcmVxdWlyZXMgcGFja2FnZSBcIkNoZW1cIiBpbnN0YWxsZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG1hY3JvTW9sQ29sLnNlbVR5cGUgIT09IERHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRSkge1xuICAgIGdyb2suc2hlbGwud2FybmluZyhcbiAgICAgIGBPbmx5IHRoZSAke0RHLlNFTVRZUEUuTUFDUk9NT0xFQ1VMRX0gY29sdW1ucyBjYW4gYmUgY29udmVydGVkIHRvIGF0b21pY1xuICAgICAgbGV2ZWwsIHRoZSBjaG9zZW4gY29sdW1uIGhhcyBzZW1UeXBlICR7bWFjcm9Nb2xDb2wuc2VtVHlwZX1gXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBjb252ZXJ0ICdoZWxtJyB0byAnc2VwYXJhdG9yJyB1bml0c1xuICBpZiAobWFjcm9Nb2xDb2wuZ2V0VGFnKERHLlRBR1MuVU5JVFMpID09PSBOT1RBVElPTi5IRUxNKSB7XG4gICAgY29uc3QgY29udmVydGVyID0gbmV3IE5vdGF0aW9uQ29udmVydGVyKG1hY3JvTW9sQ29sKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSAnLyc7XG4gICAgbWFjcm9Nb2xDb2wgPSBjb252ZXJ0ZXIuY29udmVydChOT1RBVElPTi5TRVBBUkFUT1IsIHNlcGFyYXRvcik7XG4gIH1cblxuICBjb25zdCBhbHBoYWJldCA9IG1hY3JvTW9sQ29sLmdldFRhZyhUQUdTLmFscGhhYmV0KTtcblxuICAvLyBkZXRlcm1pbmUgdGhlIHBvbHltZXIgdHlwZSBhY2NvcmRpbmcgdG8gSEVMTSBzcGVjaWZpY2F0aW9uc1xuICBsZXQgcG9seW1lclR5cGU7XG4gIC8vIHRvZG86IGFuIGV4Y2VwdGlvbiBmcm9tIGRhcnQgY29tZXMgYmVmb3JlIHRoaXMgY2hlY2sgaWYgdGhlIGFscGhhYmV0IGlzIFVOXG4gIGlmIChhbHBoYWJldCA9PT0gQUxQSEFCRVQuUFQgfHwgYWxwaGFiZXQgPT09IEFMUEhBQkVULlVOKSB7XG4gICAgcG9seW1lclR5cGUgPSBIRUxNX1BPTFlNRVJfVFlQRS5QRVBUSURFO1xuICB9IGVsc2UgaWYgKGFscGhhYmV0ID09PSBBTFBIQUJFVC5STkEgfHwgYWxwaGFiZXQgPT09IEFMUEhBQkVULkROQSkge1xuICAgIHBvbHltZXJUeXBlID0gSEVMTV9QT0xZTUVSX1RZUEUuUk5BO1xuICB9IGVsc2Uge1xuICAgIGdyb2suc2hlbGwud2FybmluZyhcbiAgICAgIGBVbmV4cGVjdGVkIGNvbHVtbidzICcke21hY3JvTW9sQ29sLm5hbWV9JyBhbHBoYWJldCAnJHthbHBoYWJldH0nLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHdvcmsgaW4gc3RhbmRhcmQgbW9kZSwgd2hlcmUsIGFzIGluIEhFTE1Db3JlTGlicmFyeTpcbiAgLy8gLSBtb25vbWVycyB3aXRoIHBvbHltZXJUeXBlICdQRVBUSURFJyBoYXZlIG1vbm9tZXIgdHlwZSAnYmFja2JvbmUnXG4gIC8vIC0gbW9ub21lcnMgd2l0aCBwb2x5bWVyVHlwZSAnUk5BJyBoYXZlIG1vbm9tZXIgdHlwZSAnYnJhbmNoJyBhbmQgJ2JhY2tib25lJ1xuICAvLyAtIHRoZSBsaWJyYXJ5IHByb3ZpZGVzIG1vbGZpbGVzIGluIGZvcm1hdCBWMjAwMFxuICBjb25zdCBtb2RlID0gTU9ERS5TVEFOREFSRDtcblxuICBjb25zdCBtb25vbWVyU2VxdWVuY2VzQXJyYXk6IHN0cmluZ1tdW10gPSBnZXRNb25vbWVyU2VxdWVuY2VzQXJyYXkobWFjcm9Nb2xDb2wpO1xuICBjb25zdCBtb25vbWVyc0RpY3QgPSBhd2FpdCBnZXRNb25vbWVyc0RpY3RGcm9tTGliKG1vbm9tZXJTZXF1ZW5jZXNBcnJheSwgbW9ub21lcnNMaWJMaXN0LCBwb2x5bWVyVHlwZSwgYWxwaGFiZXQpO1xuICBjb25zdCBjb2x1bW5MZW5ndGggPSBtYWNyb01vbENvbC5sZW5ndGg7XG4gIGNvbnN0IHJlY29uc3RydWN0ZWQ6IHN0cmluZ1tdID0gbmV3IEFycmF5KGNvbHVtbkxlbmd0aCk7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvbHVtbkxlbmd0aDsgKytyb3cpIHtcbiAgICBjb25zdCBtb25vbWVyU2VxID0gbW9ub21lclNlcXVlbmNlc0FycmF5W3Jvd107XG4gICAgcmVjb25zdHJ1Y3RlZFtyb3ddID0gbW9ub21lclNlcVRvTW9sZmlsZShtb25vbWVyU2VxLCBtb25vbWVyc0RpY3QsIGFscGhhYmV0LCBwb2x5bWVyVHlwZSwgbW9kZSk7XG4gICAgLy8gY29uc29sZS5sb2cocmVjb25zdHJ1Y3RlZFtyb3ddKTtcbiAgfVxuXG4gIC8vIGV4Y2x1ZGUgbmFtZSBjb2xsaXNpb25zXG4gIGNvbnN0IG5hbWUgPSAnbW9sZmlsZSgnICsgbWFjcm9Nb2xDb2wubmFtZSArICcpJztcbiAgY29uc3QgbmV3Q29sTmFtZSA9IGRmLmNvbHVtbnMuZ2V0VW51c2VkTmFtZShuYW1lKTtcbiAgY29uc3QgbmV3Q29sID0gREcuQ29sdW1uLmZyb21TdHJpbmdzKG5ld0NvbE5hbWUsIHJlY29uc3RydWN0ZWQpO1xuXG4gIG5ld0NvbC5zZW1UeXBlID0gREcuU0VNVFlQRS5NT0xFQ1VMRTtcbiAgbmV3Q29sLnNldFRhZyhERy5UQUdTLlVOSVRTLCBERy5VTklUUy5Nb2xlY3VsZS5NT0xCTE9DSyk7XG4gIGRmLmNvbHVtbnMuYWRkKG5ld0NvbCwgdHJ1ZSk7XG4gIGF3YWl0IGdyb2suZGF0YS5kZXRlY3RTZW1hbnRpY1R5cGVzKGRmKTtcbn1cblxuLyoqIEdldCBhIG1hcHBpbmcgb2YgcGVwdGlkZSBzeW1ib2xzIHRvIEhFTE0gbW9ub21lciBsaWJyYXJ5XG4gKiBvYmplY3RzIHdpdGggc2VsZWN0ZWQgZmllbGRzLlxuICovXG5mdW5jdGlvbiBnZXRGb3JtYXR0ZWRNb25vbWVyTGliKFxuICBtb25vbWVyc0xpYkxpc3Q6IGFueVtdLCBwb2x5bWVyVHlwZTogSEVMTV9QT0xZTUVSX1RZUEUsIGFscGhhYmV0OiBBTFBIQUJFVFxuKTogTWFwPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIG1vbm9tZXJzTGliTGlzdC5mb3JFYWNoKFxuICAgIChpdCkgPT4ge1xuICAgICAgaWYgKGl0W0hFTE1fRklFTERTLlBPTFlNRVJfVFlQRV0gPT09IHBvbHltZXJUeXBlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUk5BICYmXG4gICAgICAgICAgKGl0W0hFTE1fRklFTERTLk1PTk9NRVJfVFlQRV0gPT09IEhFTE1fTU9OT01FUl9UWVBFLkJSQU5DSCB8fFxuICAgICAgICAgICAgYWxwaGFiZXQgPT09IEFMUEhBQkVULkROQSAmJiBpdFtIRUxNX0ZJRUxEUy5TWU1CT0xdID09PSBERU9YWVJJQk9TRSB8fFxuICAgICAgICAgICAgYWxwaGFiZXQgPT09IEFMUEhBQkVULlJOQSAmJiBpdFtIRUxNX0ZJRUxEUy5TWU1CT0xdID09PSBSSUJPU0UgfHxcbiAgICAgICAgICAgIGl0W0hFTE1fRklFTERTLlNZTUJPTF0gPT09IFBIT1NQSEFURSkgfHxcbiAgICAgICAgICBwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUEVQVElERSAmJlxuICAgICAgICAgIGl0W0hFTE1fRklFTERTLk1PTk9NRVJfVFlQRV0gIT09IEhFTE1fTU9OT01FUl9UWVBFLkJSQU5DSFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtb25vbWVyT2JqZWN0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgICAgSEVMTV9DT1JFX0ZJRUxEUy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgbW9ub21lck9iamVjdFtmaWVsZF0gPSBpdFtmaWVsZF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbWFwLnNldChpdFtIRUxNX0ZJRUxEUy5TWU1CT0xdLCBtb25vbWVyT2JqZWN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICByZXR1cm4gbWFwO1xufVxuXG4vKiBHZXQgamFnZ2VkIGFycmF5IG9mIG1vbm9tZXIgc3ltYm9scyBmb3IgdGhlIGRhdGFmcmFtZSAgKi9cbmZ1bmN0aW9uIGdldE1vbm9tZXJTZXF1ZW5jZXNBcnJheShtYWNyb01vbENvbDogREcuQ29sdW1uPHN0cmluZz4pOiBzdHJpbmdbXVtdIHtcbiAgY29uc3QgY29sdW1uTGVuZ3RoID0gbWFjcm9Nb2xDb2wubGVuZ3RoO1xuICBjb25zdCByZXN1bHQ6IHN0cmluZ1tdW10gPSBuZXcgQXJyYXkoY29sdW1uTGVuZ3RoKTtcblxuICAvLyBzcGxpdCB0aGUgc3RyaW5nIGludG8gbW9ub21lcnNcbiAgY29uc3QgY29sVW5pdHMgPSBtYWNyb01vbENvbC5nZXRUYWcoREcuVEFHUy5VTklUUyk7XG4gIGNvbnN0IHNlcGFyYXRvciA9IG1hY3JvTW9sQ29sLmdldFRhZyhUQUdTLnNlcGFyYXRvcik7XG4gIGNvbnN0IHNwbGl0dGVyRnVuYzogU3BsaXR0ZXJGdW5jID0gZ2V0U3BsaXR0ZXIoY29sVW5pdHMsIHNlcGFyYXRvcik7XG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29sdW1uTGVuZ3RoOyArK3Jvdykge1xuICAgIGNvbnN0IG1hY3JvTW9sZWN1bGUgPSBtYWNyb01vbENvbC5nZXQocm93KTtcbiAgICAvLyB0b2RvOiBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBjYXNlIHdoZW4gbWFjcm9Nb2xlY3VsZSBpcyBudWxsXG4gICAgcmVzdWx0W3Jvd10gPSBtYWNyb01vbGVjdWxlID8gc3BsaXR0ZXJGdW5jKG1hY3JvTW9sZWN1bGUpIDogW107XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyogR2V0IGEgbWFwcGluZyBvZiBtb25vbWVyIHN5bWJvbHMgdG8gTW9sR3JhcGggb2JqZWN0cy4gTm90aWNlLCB0aGVcbiAqIHRyYW5zZm9ybWF0aW9uIGZyb20gbW9sZmlsZSBWMjAwMCB0byBWMzAwMCB0YWtlcyBwbGFjZSxcbiAqIHdpdGggdGhlIGhlbHAgb2YgYXN5bmMgZnVuY3Rpb24gY2FsbCBmcm9tIENoZW0gKFJkS2l0IG1vZHVsZSkgKi9cbmFzeW5jIGZ1bmN0aW9uIGdldE1vbm9tZXJzRGljdEZyb21MaWIoXG4gIG1vbm9tZXJTZXF1ZW5jZXNBcnJheTogc3RyaW5nW11bXSwgbW9ub21lcnNMaWJMaXN0OiBhbnlbXSwgcG9seW1lclR5cGU6IEhFTE1fUE9MWU1FUl9UWVBFLCBhbHBoYWJldDogQUxQSEFCRVRcbik6IFByb21pc2U8TWFwPHN0cmluZywgTW9sR3JhcGg+PiB7XG4gIC8vIHRvZG86IGV4Y2VwdGlvbiAtIG5vIGdhcHMsIG5vIGVtcHR5IHN0cmluZyBtb25vbWVyc1xuICBjb25zdCBmb3JtYXR0ZWRNb25vbWVyTGliID0gZ2V0Rm9ybWF0dGVkTW9ub21lckxpYihtb25vbWVyc0xpYkxpc3QsIHBvbHltZXJUeXBlLCBhbHBoYWJldCk7XG4gIGNvbnN0IG1vbm9tZXJzRGljdCA9IG5ldyBNYXA8c3RyaW5nLCBNb2xHcmFwaD4oKTtcblxuICBjb25zdCBtb2R1bGVSZGtpdCA9IGF3YWl0IGdyb2suZnVuY3Rpb25zLmNhbGwoJ0NoZW06Z2V0UmRLaXRNb2R1bGUnKTtcblxuICAvLyBhZGQgZGVveHlyaWJvc2Uvcmlib3NlIGFuZCBwaG9zcGhhdGUgZm9yIG51Y2xlb3RpZGUgc2VxdWVuY2VzXG4gIGlmIChwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUk5BKSB7XG4gICAgY29uc3Qgc3ltYm9scyA9IChhbHBoYWJldCA9PT0gQUxQSEFCRVQuUk5BKSA/XG4gICAgICBbUklCT1NFLCBQSE9TUEhBVEVdIDogW0RFT1hZUklCT1NFLCBQSE9TUEhBVEVdO1xuICAgIGZvciAoY29uc3Qgc3ltIG9mIHN5bWJvbHMpXG4gICAgICB1cGRhdGVNb25vbWVyc0RpY3QobW9ub21lcnNEaWN0LCBzeW0sIGZvcm1hdHRlZE1vbm9tZXJMaWIsIG1vZHVsZVJka2l0LCBwb2x5bWVyVHlwZSk7XG4gIH1cblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBtb25vbWVyU2VxdWVuY2VzQXJyYXkubGVuZ3RoOyArK3Jvdykge1xuICAgIGNvbnN0IG1vbm9tZXJTZXE6IHN0cmluZ1tdID0gbW9ub21lclNlcXVlbmNlc0FycmF5W3Jvd107XG4gICAgZm9yIChjb25zdCBzeW0gb2YgbW9ub21lclNlcSkge1xuICAgICAgaWYgKHN5bSA9PT0gJycpIGNvbnRpbnVlOyAvLyBTa2lwIGdhcC9lbXB0eSBtb25vbWVyIGZvciBNU0FcbiAgICAgIHRyeSB7XG4gICAgICAgIHVwZGF0ZU1vbm9tZXJzRGljdChtb25vbWVyc0RpY3QsIHN5bSwgZm9ybWF0dGVkTW9ub21lckxpYiwgbW9kdWxlUmRraXQsIHBvbHltZXJUeXBlKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGNvbnN0IGVyclR4dCA9IGVycm9yVG9Db25zb2xlKGVycik7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYGJpbyBsaWI6IGdldE1vbm9tZXJzRGljdEZyb21MaWIoKSBzeW09JyR7c3ltfScsIGVycm9yOlxcbmAgKyBlcnJUeHQpO1xuICAgICAgICBjb25zdCBlcnJNc2cgPSBgY2FuJ3QgZ2V0IG1vbm9tZXIgJyR7c3ltfScgZnJvbSBsaWJyYXJ5OiAke2VyclR4dH1gOyAvLyBUZXh0IGZvciBEYXRhZ3JvayBlcnJvciBiYWxvb25cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVyck1zZyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIGNvbnNvbGUubG9nKG1vbm9tZXJzRGljdCk7XG5cbiAgcmV0dXJuIG1vbm9tZXJzRGljdDtcbn1cblxuLyogR2V0IGEgbWFwcGluZyBvZiBtb25vbWVyIHN5bWJvbHMgdG8gTW9sR3JhcGggb2JqZWN0cyBmcm9tIGEgbWFwIHdob3NlIGtleXNcbiAqIGFyZSBzeW1ib2xzIGFuZCB2YWx1ZXMsIFYzMDAwIG1vbGZpbGVzICovXG5mdW5jdGlvbiBnZXRNb25vbWVyc0RpY3RGcm9tTWFwKHN5bWJvbFRvTW9sZmlsZVYzS01hcDogTWFwPHN0cmluZywgc3RyaW5nPik6IE1hcDxzdHJpbmcsIE1vbEdyYXBoPiB7XG4gIGNvbnN0IG1vbm9tZXJzRGljdCA9IG5ldyBNYXA8c3RyaW5nLCBNb2xHcmFwaD4oKTtcbiAgY29uc3QgbWFwS2V5TGlzdCA9IEFycmF5LmZyb20oc3ltYm9sVG9Nb2xmaWxlVjNLTWFwLmtleXMoKSk7XG5cbiAgZm9yIChjb25zdCBzeW0gb2YgbWFwS2V5TGlzdCkge1xuICAgIGNvbnN0IG1vbGZpbGVWM0sgPSBzeW1ib2xUb01vbGZpbGVWM0tNYXAuZ2V0KHN5bSkhOyAvLyAhIGlzIGd1YXJhbnRlZWRcblxuICAgIGNvbnN0IGNvdW50cyA9IHBhcnNlQXRvbUFuZEJvbmRDb3VudHMobW9sZmlsZVYzSyk7XG4gICAgY29uc3QgYXRvbXMgPSBwYXJzZUF0b21CbG9jayhtb2xmaWxlVjNLLCBjb3VudHMuYXRvbUNvdW50KTtcbiAgICBjb25zdCBib25kcyA9IHBhcnNlQm9uZEJsb2NrKG1vbGZpbGVWM0ssIGNvdW50cy5ib25kQ291bnQpO1xuXG4gICAgLy8gdGhlIHJOb2RlcyBhcmUgc2V0IHRvIDB0aCBhbmQgdGhlIGxhc3QgYXRvbSFcbiAgICAvLyB0aGlzIGlzIHVzZWQgYmVjYXVzZSBhcyBmb3Igbm93IGl0IGlzIHVuY2xlYXIgaG93IHRvIGluY2x1ZGUgdGhlIFItZ3JvdXBzXG4gICAgLy8gaW50byB0aGUgVjNLIG1vbGZpbGVcbiAgICBjb25zdCBtZXRhID0gZ2V0TW9ub21lck1ldGFkYXRhKGF0b21zLCBib25kcyk7XG5cbiAgICBjb25zdCBtb25vbWVyR3JhcGg6IE1vbEdyYXBoID0ge2F0b21zOiBhdG9tcywgYm9uZHM6IGJvbmRzLCBtZXRhOiBtZXRhfTtcblxuICAgIGNvbnN0IGxlZnROb2RlSWR4ID0gbWV0YS5yTm9kZXNbMF0gLSAxO1xuICAgIGNvbnN0IHJpZ2h0Tm9kZUlkeCA9IG1ldGEudGVybWluYWxOb2Rlc1sxXSAtIDE7XG4gICAgLy8gdG9kbzogY29uc2lkZXIgcm90YXRpb24/XG4gICAgYWRqdXN0QmFja2JvbmVNb25vbWVyR3JhcGgobW9ub21lckdyYXBoLCBsZWZ0Tm9kZUlkeCwgcmlnaHROb2RlSWR4KTtcblxuICAgIC8vIHNldCBzaGlmdHNcbiAgICAvLyB0b2RvOiB3cmFwIGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24/XG4gICAgbW9ub21lckdyYXBoLm1ldGEuYmFja2JvbmVTaGlmdCA9IGdldFNoaWZ0QmV0d2Vlbk5vZGVzKG1vbm9tZXJHcmFwaCwgcmlnaHROb2RlSWR4LCBsZWZ0Tm9kZUlkeCk7XG5cbiAgICByZW1vdmVOb2RlQW5kQm9uZHMobW9ub21lckdyYXBoLCBtb25vbWVyR3JhcGgubWV0YS5yTm9kZXNbMV0pO1xuXG4gICAgbW9ub21lcnNEaWN0LnNldChzeW0sIG1vbm9tZXJHcmFwaCk7XG4gIH1cbiAgLy8gY29uc29sZS5sb2cobW9ub21lcnNEaWN0KTtcblxuICByZXR1cm4gbW9ub21lcnNEaWN0O1xufVxuXG4vKiBBZGRzIE1vbEdyYXBoIG9iamVjdCBmb3IgJ3N5bScgdG8gdGhlIG1vbm9tZXJzIGRpY3Qgd2hlbiBuZWNlc3NhcnkgICovXG5mdW5jdGlvbiB1cGRhdGVNb25vbWVyc0RpY3QoXG4gIG1vbm9tZXJzRGljdDogTWFwPHN0cmluZywgTW9sR3JhcGg+LCBzeW06IHN0cmluZyxcbiAgZm9ybWF0dGVkTW9ub21lckxpYjogTWFwPHN0cmluZywgYW55PiwgbW9kdWxlUmRraXQ6IGFueSwgcG9seW1lclR5cGU6IEhFTE1fUE9MWU1FUl9UWVBFXG4pOiB2b2lkIHtcbiAgaWYgKCFtb25vbWVyc0RpY3QuaGFzKHN5bSkpIHtcbiAgICBjb25zdCBtb25vbWVyRGF0YTogTW9sR3JhcGggfCBudWxsID0gZ2V0TW9sR3JhcGgoc3ltLCBmb3JtYXR0ZWRNb25vbWVyTGliLCBtb2R1bGVSZGtpdCwgcG9seW1lclR5cGUpO1xuICAgIGlmIChtb25vbWVyRGF0YSlcbiAgICAgIG1vbm9tZXJzRGljdC5zZXQoc3ltLCBtb25vbWVyRGF0YSk7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb25vbWVyIHdpdGggc3ltYm9sICcke3N5bX0nIGlzIGFic2VudCB0aGUgbW9ub21lciBsaWJyYXJ5YCk7XG4gICAgLy8gdG9kbzogaGFuZGxlIGV4Y2VwdGlvblxuICB9XG59XG5cbi8qIENvbnN0cnVjdCB0aGUgTW9sR3JhcGggb2JqZWN0IGZvciBzcGVjaWZpZWQgbW9ub21lclN5bWJvbDogdGhlIGFzc29jaWF0ZWRcbiAqIGdyYXBoIGlzIGFkanVzdGVkIGluIFhZIHBsYW5lIGFuZCBmaWxsZWQgd2l0aCBkZWZhdWx0IFItZ3JvdXBzICovXG5mdW5jdGlvbiBnZXRNb2xHcmFwaChcbiAgbW9ub21lclN5bWJvbDogc3RyaW5nLCBmb3JtYXR0ZWRNb25vbWVyTGliOiBNYXA8c3RyaW5nLCBhbnk+LFxuICBtb2R1bGVSZGtpdDogYW55LCBwb2x5bWVyVHlwZTogSEVMTV9QT0xZTUVSX1RZUEUgLy8gdG9kbzogc3BlY2lmeSB0eXBlIGZvciBtb2R1bGVSZGtpdFxuKTogTW9sR3JhcGggfCBudWxsIHtcbiAgaWYgKCFmb3JtYXR0ZWRNb25vbWVyTGliLmhhcyhtb25vbWVyU3ltYm9sKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxpYk9iamVjdCA9IGZvcm1hdHRlZE1vbm9tZXJMaWIuZ2V0KG1vbm9tZXJTeW1ib2wpO1xuICAgIGNvbnN0IGNhcEdyb3VwcyA9IHBhcnNlQ2FwR3JvdXBzKGxpYk9iamVjdFtIRUxNX0ZJRUxEUy5SR1JPVVBTXSk7XG4gICAgY29uc3QgY2FwR3JvdXBJZHhNYXAgPSBwYXJzZUNhcEdyb3VwSWR4TWFwKGxpYk9iamVjdFtIRUxNX0ZJRUxEUy5NT0xGSUxFXSk7XG4gICAgY29uc3QgbW9sZmlsZVYzSyA9IGNvbnZlcnRNb2xmaWxlVG9WM0socmVtb3ZlUkdyb3VwTGluZXMobGliT2JqZWN0W0hFTE1fRklFTERTLk1PTEZJTEVdKSwgbW9kdWxlUmRraXQpO1xuICAgIGNvbnN0IGNvdW50cyA9IHBhcnNlQXRvbUFuZEJvbmRDb3VudHMobW9sZmlsZVYzSyk7XG5cbiAgICBjb25zdCBhdG9tcyA9IHBhcnNlQXRvbUJsb2NrKG1vbGZpbGVWM0ssIGNvdW50cy5hdG9tQ291bnQpO1xuICAgIGNvbnN0IGJvbmRzID0gcGFyc2VCb25kQmxvY2sobW9sZmlsZVYzSywgY291bnRzLmJvbmRDb3VudCk7XG4gICAgY29uc3QgbWV0YSA9IGdldE1vbm9tZXJNZXRhZGF0YShhdG9tcywgYm9uZHMsIGNhcEdyb3VwcywgY2FwR3JvdXBJZHhNYXApO1xuXG4gICAgY29uc3QgbW9ub21lckdyYXBoOiBNb2xHcmFwaCA9IHthdG9tczogYXRvbXMsIGJvbmRzOiBib25kcywgbWV0YTogbWV0YX07XG5cbiAgICBpZiAocG9seW1lclR5cGUgPT09IEhFTE1fUE9MWU1FUl9UWVBFLlBFUFRJREUpIHtcbiAgICAgIGFkanVzdFBlcHRpZGVNb25vbWVyR3JhcGgobW9ub21lckdyYXBoKTtcbiAgICB9IGVsc2UgeyAvLyBudWNsZW90aWRlc1xuICAgICAgaWYgKG1vbm9tZXJTeW1ib2wgPT09IFJJQk9TRSB8fCBtb25vbWVyU3ltYm9sID09PSBERU9YWVJJQk9TRSlcbiAgICAgICAgYWRqdXN0U3VnYXJNb25vbWVyR3JhcGgobW9ub21lckdyYXBoKTtcbiAgICAgIGVsc2UgaWYgKG1vbm9tZXJTeW1ib2wgPT09IFBIT1NQSEFURSlcbiAgICAgICAgYWRqdXN0UGhvc3BoYXRlTW9ub21lckdyYXBoKG1vbm9tZXJHcmFwaCk7XG4gICAgICBlbHNlXG4gICAgICAgIGFkanVzdEJhc2VNb25vbWVyR3JhcGgobW9ub21lckdyYXBoKTtcbiAgICB9XG5cbiAgICAvLyByZW1vdmUgdGhlICdyaWdodG1vc3QnIGNoYWluLWV4dGVuZGluZyByLWdyb3VwIG5vZGUgaW4gdGhlIGJhY2tib25lXG4gICAgaWYgKHBvbHltZXJUeXBlID09PSBIRUxNX1BPTFlNRVJfVFlQRS5QRVBUSURFKSB7XG4gICAgICBzZXRTaGlmdHMobW9ub21lckdyYXBoLCBwb2x5bWVyVHlwZSk7XG4gICAgICByZW1vdmVOb2RlQW5kQm9uZHMobW9ub21lckdyYXBoLCBtb25vbWVyR3JhcGgubWV0YS5yTm9kZXNbMV0pO1xuICAgIH0gZWxzZSB7IC8vIG51Y2xlb3RpZGVzXG4gICAgICBpZiAobW9ub21lclN5bWJvbCA9PT0gUklCT1NFIHx8IG1vbm9tZXJTeW1ib2wgPT09IERFT1hZUklCT1NFKSB7XG4gICAgICAgIC8vIHJlbW92ZSBSMlxuICAgICAgICByZW1vdmVOb2RlQW5kQm9uZHMobW9ub21lckdyYXBoLCBtb25vbWVyR3JhcGgubWV0YS5yTm9kZXNbMV0pO1xuICAgICAgICAvLyBzZXQgdGVybWluYWxOb2RlMiAob3h5Z2VuKSBhcyBuZXcgUjJcbiAgICAgICAgbW9ub21lckdyYXBoLm1ldGEuck5vZGVzWzFdID0gbW9ub21lckdyYXBoLm1ldGEudGVybWluYWxOb2Rlc1sxXTtcbiAgICAgICAgc2V0VGVybWluYWxOb2Rlcyhtb25vbWVyR3JhcGguYm9uZHMsIG1vbm9tZXJHcmFwaC5tZXRhKTsgLy8gc2V0IHRlcm1pbmFsIG5vZGVzIGFuZXdcbiAgICAgICAgc2V0U2hpZnRzKG1vbm9tZXJHcmFwaCwgcG9seW1lclR5cGUpO1xuICAgICAgICAvLyByZW1vdmUgJ25ldycgUjIgKG94eWdlbilcbiAgICAgICAgcmVtb3ZlTm9kZUFuZEJvbmRzKG1vbm9tZXJHcmFwaCwgbW9ub21lckdyYXBoLm1ldGEuck5vZGVzWzFdKTtcbiAgICAgICAgLy8gcmVtb3ZlIFIxXG4gICAgICAgIHJlbW92ZU5vZGVBbmRCb25kcyhtb25vbWVyR3JhcGgsIG1vbm9tZXJHcmFwaC5tZXRhLnJOb2Rlc1swXSk7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgYnJhbmNoaW5nIHItZ3JvdXBcbiAgICAgICAgcmVtb3ZlTm9kZUFuZEJvbmRzKG1vbm9tZXJHcmFwaCwgbW9ub21lckdyYXBoLm1ldGEuck5vZGVzWzJdKTtcbiAgICAgIH0gZWxzZSBpZiAobW9ub21lclN5bWJvbCA9PT0gUEhPU1BIQVRFKSB7XG4gICAgICAgIG1vbm9tZXJHcmFwaC5tZXRhLnRlcm1pbmFsTm9kZXNbMF0gPSBtb25vbWVyR3JhcGgubWV0YS5yTm9kZXNbMF07XG4gICAgICAgIHNoaWZ0Q29vcmRpbmF0ZXMoXG4gICAgICAgICAgbW9ub21lckdyYXBoLFxuICAgICAgICAgIC1tb25vbWVyR3JhcGguYXRvbXMueFttb25vbWVyR3JhcGgubWV0YS50ZXJtaW5hbE5vZGVzWzBdIC0gMV0sXG4gICAgICAgICAgLW1vbm9tZXJHcmFwaC5hdG9tcy55W21vbm9tZXJHcmFwaC5tZXRhLnRlcm1pbmFsTm9kZXNbMF0gLSAxXVxuICAgICAgICApO1xuICAgICAgICBzZXRTaGlmdHMobW9ub21lckdyYXBoLCBwb2x5bWVyVHlwZSk7XG4gICAgICAgIHJlbW92ZU5vZGVBbmRCb25kcyhtb25vbWVyR3JhcGgsIG1vbm9tZXJHcmFwaC5tZXRhLnJOb2Rlc1sxXSk7XG4gICAgICB9IGVsc2UgeyAvLyBudWNsZW9iYXNlc1xuICAgICAgICByZW1vdmVOb2RlQW5kQm9uZHMobW9ub21lckdyYXBoLCBtb25vbWVyR3JhcGgubWV0YS5yTm9kZXNbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZW1vdmVIeWRyb2dlbihtb25vbWVyR3JhcGgpO1xuXG4gICAgcmV0dXJuIG1vbm9tZXJHcmFwaDtcbiAgfVxufVxuXG4vLyB0b2RvOiBzZG9jXG5mdW5jdGlvbiBnZXRNb25vbWVyTWV0YWRhdGEoYXRvbXM6IEF0b21zLCBib25kczogQm9uZHMsIGNhcEdyb3Vwcz86IHN0cmluZ1tdLCBjYXBHcm91cElkeE1hcD86IE1hcDxudW1iZXIsIG51bWJlcj5cbik6IE1vbm9tZXJNZXRhZGF0YSB7XG4gIGNvbnN0IG1ldGE6IE1vbm9tZXJNZXRhZGF0YSA9IHtcbiAgICBiYWNrYm9uZVNoaWZ0OiBudWxsLFxuICAgIGJyYW5jaFNoaWZ0OiBudWxsLFxuICAgIHRlcm1pbmFsTm9kZXM6IFtdLFxuICAgIHJOb2RlczogW10sXG4gIH07XG5cbiAgLy8gY29ycmVzcG9uZHMgdG8gTU9ERS5TVEFOREFSRFxuICBjb25zdCBzdGFuZGFyZE1vZGUgPSB0eXBlb2YgY2FwR3JvdXBzICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY2FwR3JvdXBJZHhNYXAgIT09ICd1bmRlZmluZWQnO1xuXG4gIGlmIChzdGFuZGFyZE1vZGUpIHtcbiAgICBzdWJzdGl0dXRlQ2FwR3JvdXBzKGF0b21zLCBjYXBHcm91cHMhLCBjYXBHcm91cElkeE1hcCEpO1xuICAgIHNldFJOb2RlcyhjYXBHcm91cElkeE1hcCEsIG1ldGEpO1xuICB9IGVsc2UgeyAvLyB0aGUgY2FzZSB1c2VkIGluIFNlcXVlbmNlVHJhbnNsYXRvclxuICAgIC8vIHRvZG86IHZlcmlmeSB0aGF0IHRoZSBtb25vbWVycyBhcmUgcHJlcGFyZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoaXMgd29ya3NcbiAgICBtZXRhLnJOb2RlcyA9IFswLCBhdG9tcy54Lmxlbmd0aF07XG4gIH1cblxuICBzZXRUZXJtaW5hbE5vZGVzKGJvbmRzLCBtZXRhKTtcbiAgcmV0dXJuIG1ldGE7XG59XG5cbi8qIFBhcnNlIGVsZW1lbnQgc3ltYm9scyBmb3IgUi1ncm91cHMgZnJvbSB0aGUgSEVMTSBtb25vbWVyIGxpYnJhcnkgUi1ncm91cHNcbiAqIGZpZWxkICAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQ2FwR3JvdXBzKHJHcm91cE9iakxpc3Q6IGFueVtdKTogc3RyaW5nW10ge1xuICAvLyBzcGVjaWZpY2FsbHkgZm9yIEhFTE1Db3JlTGlicmFyeVxuICAvLyBjb25zaWRlcmVkIG9ubHkgbW9ub2F0b21pYyByZ3JvdXBzXG4gIC8vIHN1cHBvc2luZyB0aGF0IGVsZW1lbnRzIGluIHJHcm91cE9iakxpc3QgYXJlIHNvcnRlZCB3LnIudC4gdGhlIHJncm91cHMgaWR4XG4gIC8vIHRvZG86IHBvc3NpYmxlIGdlbmVyYWxpemF0aW9uc1xuICBjb25zdCBjYXBHcm91cHNBcnJheTogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBvYmogb2Ygckdyb3VwT2JqTGlzdCkge1xuICAgIGxldCBjYXBHcm91cDogc3RyaW5nID0gb2JqW1JHUk9VUF9GSUVMRFMuQ0FQX0dST1VQX1NNSUxFU107XG5cbiAgICAvLyBpbiBzb21lIGNhc2VzIHRoZSBzbWlsZXMgZmllbGQgaXMgd3JpdHRlbiB3aXRoIHVwcGVyY2FzZVxuICAgIGlmICghY2FwR3JvdXApXG4gICAgICBjYXBHcm91cCA9IG9ialtSR1JPVVBfRklFTERTLkNBUF9HUk9VUF9TTUlMRVNfVVBQRVJDQVNFXTtcbiAgICAvLyB0b2RvOiB2ZXJpZnkgdGhhdCB0aGVyZSBhcmUgbm8gbXVsdGktZWxlbWVudCBjYXAgZ3JvdXBzLCBvciBjb25zaWRlciBob3cgdG9cbiAgICAvLyB0cmFuc2Zvcm0gdGhlbVxuICAgIGNhcEdyb3VwID0gY2FwR3JvdXAucmVwbGFjZSgvKFxcW3xcXF18XFwqfDp8XFxkKS9nLCAnJyk7XG4gICAgaWYgKGNhcEdyb3VwLmxlbmd0aCA+IDEpIC8vIHRvZG86IGNoZWNrIGlmIHN1Y2ggY2FzZXMgYXJlIHBvc3NpYmxlLCByZW1vdmUgaWYgbm90XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RlZmF1bHQgY2FwIGdyb3VwIGhhcyBsZW5ndGggbW9yZSB0aGFuIG9uZScpO1xuICAgIGNhcEdyb3Vwc0FycmF5LnB1c2goY2FwR3JvdXApO1xuICB9XG4gIHJldHVybiBjYXBHcm91cHNBcnJheTtcbn1cblxuLyogU3Vic3RpdHV0ZSB0aGUgY2FwIGdyb3VwIGVsZW1lbnRzIGluc3RlYWQgb2YgUiMgKi9cbmZ1bmN0aW9uIHN1YnN0aXR1dGVDYXBHcm91cHMoXG4gIGF0b21zOiBBdG9tcywgY2FwR3JvdXBzOiBzdHJpbmdbXSwgY2FwR3JvdXBJZHhNYXA6IE1hcDxudW1iZXIsIG51bWJlcj5cbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IFtub2RlLCBjYXBJZHhdIG9mIGNhcEdyb3VwSWR4TWFwKVxuICAgIGF0b21zLmF0b21UeXBlc1tub2RlIC0gMV0gPSBjYXBHcm91cHNbY2FwSWR4IC0gMV07IC8vIC0xIGJlY2F1c2UgbW9sZmlsZSBpbmRleGluZyBzdGFydHMgZnJvbSAxXG59XG5cbi8vdG9kbzogZG9jXG5mdW5jdGlvbiBzZXRSTm9kZXMoY2FwR3JvdXBJZHhNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4sIG1ldGE6IE1vbm9tZXJNZXRhZGF0YSk6IHZvaWQge1xuICBtZXRhLnJOb2RlcyA9IEFycmF5LmZyb20oY2FwR3JvdXBJZHhNYXAua2V5cygpKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhLnJOb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgIGZvciAoY29uc3QgaiBvZiBbMSwgMl0pIHsgLy8gMSBhbmQgMiBieSBkZWYuIGNvcnJlc3BvbmQgdG8gJ2xlZnQvcmlnaHRtb3N0JyByLW5vZGVzXG4gICAgICAvLyBzd2FwIHRoZSB2YWx1ZXMgaWYgbmVjZXNzYXJ5LCBzbyB0aGF0IHRoZSBcImxlZnRtb3N0XCIgci1ub2RlIGlzIGF0IDAsXG4gICAgICAvLyBhbmQgdGhlICdyaWdodG1vc3QnLCBhdCAxXG4gICAgICBpZiAoY2FwR3JvdXBJZHhNYXAuZ2V0KG1ldGEuck5vZGVzW2ldKSA9PT0gaikge1xuICAgICAgICBjb25zdCB0bXAgPSBtZXRhLnJOb2Rlc1tqIC0gMV07XG4gICAgICAgIG1ldGEuck5vZGVzW2ogLSAxXSA9IG1ldGEuck5vZGVzW2ldO1xuICAgICAgICBtZXRhLnJOb2Rlc1tpXSA9IHRtcDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLy90b2RvOiBkb2NcbmZ1bmN0aW9uIHNldFRlcm1pbmFsTm9kZXMoYm9uZHM6IEJvbmRzLCBtZXRhOiBNb25vbWVyTWV0YWRhdGEpOiB2b2lkIHtcbiAgY29uc3Qgck5vZGVzID0gbWV0YS5yTm9kZXM7XG4gIG1ldGEudGVybWluYWxOb2RlcyA9IG5ldyBBcnJheTxudW1iZXI+KHJOb2Rlcy5sZW5ndGgpLmZpbGwoMCk7XG4gIGNvbnN0IHRlcm1pbmFsTm9kZXMgPSBtZXRhLnRlcm1pbmFsTm9kZXM7XG4gIGNvbnN0IGF0b21QYWlycyA9IGJvbmRzLmF0b21QYWlycztcbiAgbGV0IGkgPSAwO1xuICBsZXQgaiA9IDA7XG4gIHdoaWxlICgoaSA8IGF0b21QYWlycy5sZW5ndGgpICYmIGogPCB0ZXJtaW5hbE5vZGVzLmxlbmd0aCkge1xuICAgIC8vIHJOb2RlcyBhcnJheSBpcyBzb3J0ZWQgc28gdGhhdCBpdHMgMHRoIGFuZCAxc3QgZWxlbWVudHMgKGlmIGJvdGhcbiAgICAvLyBwcmVzZW50KSBjb3JyZXNwb25kIHRvIHRoZSBjaGFpbiBleHRlbmRpbmcgKGkuZS4gbm90IGJyYW5jaGluZykgci1ncm91cHNcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHRlcm1pbmFsTm9kZXMubGVuZ3RoOyArK2spIHtcbiAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgMjsgKytsKSB7XG4gICAgICAgIGlmIChhdG9tUGFpcnNbaV1bbF0gPT09IHJOb2Rlc1trXSkge1xuICAgICAgICAgIHRlcm1pbmFsTm9kZXNba10gPSBhdG9tUGFpcnNbaV1bKGwgKyAxKSAlIDJdO1xuICAgICAgICAgIGlmIChyTm9kZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgIH1cbiAgICAgICAgICArK2o7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgKytpO1xuICB9XG59XG5cbi8vdG9kbzogZG9jXG5mdW5jdGlvbiBzZXRTaGlmdHMobW9sR3JhcGg6IE1vbEdyYXBoLCBwb2x5bWVyVHlwZTogSEVMTV9QT0xZTUVSX1RZUEUpOiB2b2lkIHtcbiAgaWYgKG1vbEdyYXBoLm1ldGEuck5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICBtb2xHcmFwaC5tZXRhLmJhY2tib25lU2hpZnQgPSBnZXRTaGlmdEJldHdlZW5Ob2RlcyhcbiAgICAgIG1vbEdyYXBoLCBtb2xHcmFwaC5tZXRhLnJOb2Rlc1sxXSAtIDEsXG4gICAgICBtb2xHcmFwaC5tZXRhLnRlcm1pbmFsTm9kZXNbMF0gLSAxXG4gICAgKTtcbiAgfVxuXG4gIGlmIChwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUk5BICYmIG1vbEdyYXBoLm1ldGEuck5vZGVzLmxlbmd0aCA+IDIpIHtcbiAgICBtb2xHcmFwaC5tZXRhLmJyYW5jaFNoaWZ0ID0gZ2V0U2hpZnRCZXR3ZWVuTm9kZXMoXG4gICAgICBtb2xHcmFwaCwgbW9sR3JhcGgubWV0YS5yTm9kZXNbMl0gLSAxLFxuICAgICAgbW9sR3JhcGgubWV0YS50ZXJtaW5hbE5vZGVzWzBdIC0gMVxuICAgICk7XG4gIH1cbn1cblxuLyogUmV0dXJucyB0aGUgcGFpciBbeFNoaWZ0LCB5U2hpZnRdIGZvciBzcGVjaWZpZWQgbm9kZSBpbmRpY2VzICovXG5mdW5jdGlvbiBnZXRTaGlmdEJldHdlZW5Ob2RlcyhcbiAgbW9sR3JhcGg6IE1vbEdyYXBoLCByaWdodE5vZGVJZHg6IG51bWJlciwgbGVmdE5vZGVJZHg6IG51bWJlclxuKTogbnVtYmVyW10ge1xuICByZXR1cm4gW1xuICAgIGtlZXBQcmVjaXNpb24oXG4gICAgICBtb2xHcmFwaC5hdG9tcy54W3JpZ2h0Tm9kZUlkeF0gLVxuICAgICAgbW9sR3JhcGguYXRvbXMueFtsZWZ0Tm9kZUlkeF1cbiAgICApLFxuICAgIGtlZXBQcmVjaXNpb24oXG4gICAgICBtb2xHcmFwaC5hdG9tcy55W3JpZ2h0Tm9kZUlkeF0gLVxuICAgICAgbW9sR3JhcGguYXRvbXMueVtsZWZ0Tm9kZUlkeF1cbiAgICApLFxuICBdO1xufVxuXG4vKiBIZWxwZXIgZnVuY3Rpb24gbmVjZXNzYXJ5IHRvIGJ1aWxkIGEgY29ycmVjdCBWMzAwMCBtb2xmaWxlIG91dCBvZiBWMjAwMCB3aXRoXG4gKiBzcGVjaWZpZWQgci1ncm91cHMqL1xuZnVuY3Rpb24gcmVtb3ZlUkdyb3VwTGluZXMobW9sZmlsZVYySzogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGJlZ2luID0gbW9sZmlsZVYySy5pbmRleE9mKFYyS19BX0xJTkUsIDApO1xuICBpZiAoYmVnaW4gPT09IC0xKVxuICAgIGJlZ2luID0gbW9sZmlsZVYySy5pbmRleE9mKFYyS19SR1BfTElORSk7XG4gIGNvbnN0IGVuZCA9IG1vbGZpbGVWMksuaW5kZXhPZihWM0tfRU5ELCBiZWdpbik7XG4gIHJldHVybiBtb2xmaWxlVjJLLnN1YnN0cmluZygwLCBiZWdpbikgKyBtb2xmaWxlVjJLLnN1YnN0cmluZyhlbmQpO1xufVxuXG4vKiBWMjAwMCB0byBWMzAwMCBjb252ZXJ0ZXIgICovXG5mdW5jdGlvbiBjb252ZXJ0TW9sZmlsZVRvVjNLKG1vbGZpbGVWMks6IHN0cmluZywgbW9kdWxlUmRraXQ6IGFueSk6IHN0cmluZyB7XG4gIC8vIHRvZG86IHR5cGUgb2YgbW9kdWxlUmRraXRcbiAgLy8gdG9kbzogY29uc2lkZXIgdGhlIHVzZSBvZiBzdGFuZGFyZCBDaGVtIGNvbnZlcnRlciAocmVsaWVzIG9uIGNyZWF0aW9uIG9mIG1vZHVsZVJka2l0IG9uIGVhY2ggaXRlcmF0aW9uLCB0aG91Z2gpXG4gIGNvbnN0IG1vbE9iaiA9IG1vZHVsZVJka2l0LmdldF9tb2wobW9sZmlsZVYySyk7XG4gIGNvbnN0IG1vbGZpbGVWM0sgPSBtb2xPYmouZ2V0X3YzS21vbGJsb2NrKCk7XG4gIG1vbE9iai5kZWxldGUoKTtcbiAgcmV0dXJuIG1vbGZpbGVWM0s7XG59XG5cbi8qIFBhcnNlIFYzMDAwIGJvbmQgYmxvY2sgYW5kIGNvbnN0cnVjdCB0aGUgQm9uZHMgb2JqZWN0ICovXG5mdW5jdGlvbiBwYXJzZUJvbmRCbG9jayhtb2xmaWxlVjNLOiBzdHJpbmcsIGJvbmRDb3VudDogbnVtYmVyKTogQm9uZHMge1xuICAvLyB0b2RvOiBjb25zaWRlciB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIG5vIHNpbXBsZSBsZWZ0bW9zdC9yaWdodG1vc3QgY2hvaWNlXG4gIC8vIHRvZG86IGNvbnNpZGVyIHRoZSBjYXNlIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGNvbnNlcXVlbnQgTSAgUkdQIGxpbmVzLFxuICAvLyBsaWtlIGluIEhFTE1Db3JlTGlicmFyeSBudWNsZW90aWRlc1xuXG4gIGNvbnN0IGJvbmRUeXBlczogbnVtYmVyW10gPSBuZXcgQXJyYXkoYm9uZENvdW50KTtcbiAgY29uc3QgYXRvbVBhaXJzOiBudW1iZXJbXVtdID0gbmV3IEFycmF5KGJvbmRDb3VudCk7XG4gIGNvbnN0IGJvbmRDb25maWd1cmF0aW9uID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgY29uc3Qga3dhcmdzID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcblxuICBsZXQgYmVnaW4gPSBtb2xmaWxlVjNLLmluZGV4T2YoVjNLX0JFR0lOX0JPTkRfQkxPQ0spO1xuICBiZWdpbiA9IG1vbGZpbGVWM0suaW5kZXhPZignXFxuJywgYmVnaW4pO1xuICBsZXQgZW5kID0gYmVnaW47XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYm9uZENvdW50OyArK2kpIHtcbiAgICAvLyBwYXJzZSBib25kIHR5cGUgYW5kIGF0b20gcGFpclxuICAgIGNvbnN0IHBhcnNlZFZhbHVlczogbnVtYmVyW10gPSBuZXcgQXJyYXkoMyk7XG4gICAgYmVnaW4gPSBtb2xmaWxlVjNLLmluZGV4T2YoVjNLX0JFR0lOX0RBVEFfTElORSwgZW5kKSArIFYzS19JRFhfU0hJRlQ7XG4gICAgZW5kID0gbW9sZmlsZVYzSy5pbmRleE9mKCcgJywgYmVnaW4pO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgMzsgKytrKSB7XG4gICAgICBiZWdpbiA9IGVuZCArIDE7XG4gICAgICBlbmQgPSBNYXRoLm1pbihtb2xmaWxlVjNLLmluZGV4T2YoJ1xcbicsIGJlZ2luKSwgbW9sZmlsZVYzSy5pbmRleE9mKCcgJywgYmVnaW4pKTtcbiAgICAgIHBhcnNlZFZhbHVlc1trXSA9IHBhcnNlSW50KG1vbGZpbGVWM0suc2xpY2UoYmVnaW4sIGVuZCkpO1xuICAgIH1cbiAgICBib25kVHlwZXNbaV0gPSBwYXJzZWRWYWx1ZXNbMF07XG4gICAgYXRvbVBhaXJzW2ldID0gcGFyc2VkVmFsdWVzLnNsaWNlKDEpO1xuXG4gICAgLy8gcGFyc2Uga2V5d29yZCBhcmd1bWVudHNcbiAgICBjb25zdCBlbmRPZkxpbmUgPSBtb2xmaWxlVjNLLmluZGV4T2YoJ1xcbicsIGJlZ2luKTtcbiAgICBsZXQgbGluZVJlbWFpbmRlciA9IG1vbGZpbGVWM0suc2xpY2UoZW5kLCBlbmRPZkxpbmUpO1xuICAgIGxldCBiZWdpbkNmZyA9IGxpbmVSZW1haW5kZXIuaW5kZXhPZihWM0tfQk9ORF9DT05GSUcpO1xuICAgIGlmIChiZWdpbkNmZyAhPT0gLTEpIHtcbiAgICAgIGJlZ2luQ2ZnID0gbGluZVJlbWFpbmRlci5pbmRleE9mKCc9JywgYmVnaW5DZmcpICsgMTtcbiAgICAgIGxldCBlbmRDZmcgPSBsaW5lUmVtYWluZGVyLmluZGV4T2YoJyAnLCBiZWdpbkNmZyk7XG4gICAgICBpZiAoZW5kQ2ZnID09PSAtMSlcbiAgICAgICAgZW5kQ2ZnID0gbGluZVJlbWFpbmRlci5sZW5ndGg7XG4gICAgICBjb25zdCBib25kQ29uZmlnID0gcGFyc2VJbnQobGluZVJlbWFpbmRlci5zbGljZShiZWdpbkNmZywgZW5kQ2ZnKSk7XG4gICAgICBib25kQ29uZmlndXJhdGlvbi5zZXQoaSwgYm9uZENvbmZpZyk7XG4gICAgICBjb25zdCByZW1vdmVkU3Vic3RyaW5nID0gVjNLX0JPTkRfQ09ORklHICsgYm9uZENvbmZpZy50b1N0cmluZygpO1xuICAgICAgbGluZVJlbWFpbmRlciA9IGxpbmVSZW1haW5kZXIucmVwbGFjZShyZW1vdmVkU3Vic3RyaW5nLCAnJyk7XG4gICAgfVxuICAgIGlmICghbGluZVJlbWFpbmRlcilcbiAgICAgIGt3YXJncy5zZXQoaSwgbGluZVJlbWFpbmRlcik7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJvbmRUeXBlczogYm9uZFR5cGVzLFxuICAgIGF0b21QYWlyczogYXRvbVBhaXJzLFxuICAgIGJvbmRDb25maWd1cmF0aW9uOiBib25kQ29uZmlndXJhdGlvbixcbiAgICBrd2FyZ3M6IGt3YXJncyxcbiAgfTtcbn1cblxuLyogQ29uc3RydWN0cyBtYXBwaW5nIG9mIHItZ3JvdXAgbm9kZXMgdG8gZGVmYXVsdCBjYXBHcm91cHMsIGFsbCBudW1lcmF0aW9uIHN0YXJ0aW5nIGZyb20gMS5cbiAqIEFjY29yZGluZyB0byBodHRwczovL3B1YnMuYWNzLm9yZy9kb2kvMTAuMTAyMS9jaTMwMDE5MjUsIFIxIGFuZCBSMiBhcmUgdGhlIGNoYWluIGV4dGVuZGluZyBhdHRhY2htZW50IHBvaW50cyxcbiAqIHdoaWxlIFIzIGlzIHRoZSBicmFuY2hpbmcgYXR0YWNobWVudCBwb2ludC4gKi9cbmZ1bmN0aW9uIHBhcnNlQ2FwR3JvdXBJZHhNYXAobW9sZmlsZVYySzogc3RyaW5nKTogTWFwPG51bWJlciwgbnVtYmVyPiB7XG4gIGNvbnN0IGNhcEdyb3VwSWR4TWFwID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcblxuICAvLyBwYXJzZSBBLWxpbmVzIChSTkEpXG4gIGxldCBiZWdpbiA9IG1vbGZpbGVWMksuaW5kZXhPZihWMktfQV9MSU5FLCAwKTtcbiAgbGV0IGVuZCA9IGJlZ2luO1xuICB3aGlsZSAoYmVnaW4gIT09IC0xKSB7XG4gICAgLy8gcGFyc2UgdGhlIHJOb2RlIHRvIHdoaWNoIHRoZSBjYXAgZ3JvdXAgaXMgYXR0YWNoZWRcbiAgICBlbmQgPSBtb2xmaWxlVjJLLmluZGV4T2YoJ1xcbicsIGJlZ2luKTtcbiAgICBjb25zdCByTm9kZSA9IHBhcnNlSW50KG1vbGZpbGVWMksuc3Vic3RyaW5nKGJlZ2luLCBlbmQpLnJlcGxhY2UoL15BXFxzKy8sICcnKSk7XG5cbiAgICAvLyBwYXJzZSB0aGUgY2FwR3JvdXAgaW5kZXhcbiAgICBiZWdpbiA9IG1vbGZpbGVWMksuaW5kZXhPZignUicsIGVuZCk7XG4gICAgZW5kID0gbW9sZmlsZVYySy5pbmRleE9mKCdcXG4nLCBiZWdpbik7XG4gICAgY29uc3QgY2FwR3JvdXAgPSBwYXJzZUludChtb2xmaWxlVjJLLnN1YnN0cmluZyhiZWdpbiwgZW5kKS5yZXBsYWNlKC9eUi8sICcnKSk7XG4gICAgY2FwR3JvdXBJZHhNYXAuc2V0KHJOb2RlLCBjYXBHcm91cCk7XG5cbiAgICBiZWdpbiA9IG1vbGZpbGVWMksuaW5kZXhPZihWMktfQV9MSU5FLCBlbmQpO1xuICB9XG5cbiAgLy8gcGFyc2UgUkdQIGxpbmVzIChtYXkgYmUgbW9yZSB0aGFuIG9uZSBpbiBSTkEgbW9ub21lcnMpXG4gIGJlZ2luID0gbW9sZmlsZVYySy5pbmRleE9mKFYyS19SR1BfTElORSwgMCk7XG4gIGVuZCA9IG1vbGZpbGVWMksuaW5kZXhPZignXFxuJywgYmVnaW4pO1xuICB3aGlsZSAoYmVnaW4gIT09IC0xKSB7XG4gICAgYmVnaW4gKz0gVjJLX1JHUF9TSElGVDtcbiAgICBlbmQgPSBtb2xmaWxlVjJLLmluZGV4T2YoJ1xcbicsIGJlZ2luKTtcbiAgICBjb25zdCByZ3BTdHJpbmdQYXJzZWQgPSBtb2xmaWxlVjJLLnN1YnN0cmluZyhiZWdpbiwgZW5kKVxuICAgICAgLnJlcGxhY2VBbGwoL1xccysvZywgJyAnKVxuICAgICAgLnNwbGl0KCcgJyk7XG4gICAgY29uc3QgcmdwSW5kaWNlc0FycmF5ID0gcmdwU3RyaW5nUGFyc2VkLm1hcCgoZWwpID0+IHBhcnNlSW50KGVsKSlcbiAgICAgIC5zbGljZSgxKTsgLy8gc2xpY2UgZnJvbSAxIGJlY2F1c2UgdGhlIDFzdCB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIHBhaXJzIGluIHRoZSBsaW5lXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZ3BJbmRpY2VzQXJyYXkubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIC8vIG5vdGljZTogdGhlcmUgbWF5IGJlIGNvbmZsaWN0aW5nIGNhcCBncm91cCBkZWZpbml0aW9ucywgbGlrZSAzLU8tTWV0aHlscmlib3NlICgyLDUgY29ubmVjdGl2aXR5KVxuICAgICAgLy8gKHRoZSBsYXN0IG1vbm9tZXIgaW4gSEVMTUNvcmVMaWJyYXJ5KVxuICAgICAgLy8gdGhlcmUgdGhlIGluZGljZXMgb2YgY2FwIGdyb3VwcyBhcmUgc2VsZi1jb250cmFkaWN0b3J5XG4gICAgICAvLyB0b2RvOiBjbGFyaWZ5IHdoeSBzdWNoIHNpdHVhdGlvbnMgb2NjdXIgaW4gcHJpbmNpcGxlXG4gICAgICBpZiAoY2FwR3JvdXBJZHhNYXAuaGFzKHJncEluZGljZXNBcnJheVtpXSkgJiYgY2FwR3JvdXBJZHhNYXAuZ2V0KHJncEluZGljZXNBcnJheVtpXSkgIT09IHJncEluZGljZXNBcnJheVtpICsgMV0pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgci1ncm91cCBpbmRleCAke3JncEluZGljZXNBcnJheVtpXX0gaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlYCk7XG4gICAgICBlbHNlXG4gICAgICAgIGNhcEdyb3VwSWR4TWFwLnNldChyZ3BJbmRpY2VzQXJyYXlbaV0sIHJncEluZGljZXNBcnJheVtpICsgMV0pO1xuICAgIH1cblxuICAgIGJlZ2luID0gbW9sZmlsZVYySy5pbmRleE9mKFYyS19SR1BfTElORSwgZW5kKTtcbiAgfVxuXG4gIHJldHVybiBjYXBHcm91cElkeE1hcDtcbn1cblxuZnVuY3Rpb24gcGFyc2VBdG9tQW5kQm9uZENvdW50cyhtb2xmaWxlVjNLOiBzdHJpbmcpOiB7IGF0b21Db3VudDogbnVtYmVyLCBib25kQ291bnQ6IG51bWJlciB9IHtcbiAgbW9sZmlsZVYzSyA9IG1vbGZpbGVWM0sucmVwbGFjZUFsbCgnXFxyJywgJycpOyAvLyB0byBoYW5kbGUgb2xkIGFuZCBuZXcgc2RmIHN0YW5kYXJkc1xuXG4gIC8vIHBhcnNlIGF0b20gY291bnRcbiAgbGV0IGJlZ2luID0gbW9sZmlsZVYzSy5pbmRleE9mKFYzS19CRUdJTl9DT1VOVFNfTElORSkgKyBWM0tfQ09VTlRTX1NISUZUO1xuICBsZXQgZW5kID0gbW9sZmlsZVYzSy5pbmRleE9mKCcgJywgYmVnaW4gKyAxKTtcbiAgY29uc3QgbnVtT2ZBdG9tcyA9IHBhcnNlSW50KG1vbGZpbGVWM0suc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTtcblxuICAvLyBwYXJzZSBib25kIGNvdW50XG4gIGJlZ2luID0gZW5kICsgMTtcbiAgZW5kID0gbW9sZmlsZVYzSy5pbmRleE9mKCcgJywgYmVnaW4gKyAxKTtcbiAgY29uc3QgbnVtT2ZCb25kcyA9IHBhcnNlSW50KG1vbGZpbGVWM0suc3Vic3RyaW5nKGJlZ2luLCBlbmQpKTtcblxuICByZXR1cm4ge2F0b21Db3VudDogbnVtT2ZBdG9tcywgYm9uZENvdW50OiBudW1PZkJvbmRzfTtcbn1cblxuLyogUGFyc2UgVjMwMDAgYXRvbSBibG9jayBhbmQgcmV0dXJuIEF0b21zIG9iamVjdC4gTk9USUNFOiBvbmx5IGF0b21UeXBlcywgeCwgeVxuICogYW5kIGt3YXJncyBmaWVsZHMgYXJlIHNldCBpbiB0aGUgcmV0dXJuIHZhbHVlLCB3aXRoIG90aGVyIGZpZWxkcyBkdW1teSAqL1xuZnVuY3Rpb24gcGFyc2VBdG9tQmxvY2sobW9sZmlsZVYzSzogc3RyaW5nLCBhdG9tQ291bnQ6IG51bWJlcik6IEF0b21zIHtcbiAgY29uc3QgYXRvbVR5cGVzOiBzdHJpbmdbXSA9IG5ldyBBcnJheShhdG9tQ291bnQpO1xuICBjb25zdCB4OiBudW1iZXJbXSA9IG5ldyBBcnJheShhdG9tQ291bnQpO1xuICBjb25zdCB5OiBudW1iZXJbXSA9IG5ldyBBcnJheShhdG9tQ291bnQpO1xuICBjb25zdCBrd2FyZ3M6IHN0cmluZ1tdID0gbmV3IEFycmF5KGF0b21Db3VudCk7XG5cbiAgbGV0IGJlZ2luID0gbW9sZmlsZVYzSy5pbmRleE9mKFYzS19CRUdJTl9BVE9NX0JMT0NLKTsgLy8gVjMwMDAgYXRvbXMgYmxvY2tcbiAgYmVnaW4gPSBtb2xmaWxlVjNLLmluZGV4T2YoJ1xcbicsIGJlZ2luKTtcbiAgbGV0IGVuZCA9IGJlZ2luO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXRvbUNvdW50OyBpKyspIHtcbiAgICBiZWdpbiA9IG1vbGZpbGVWM0suaW5kZXhPZihWM0tfQkVHSU5fREFUQV9MSU5FLCBiZWdpbikgKyBWM0tfSURYX1NISUZUO1xuICAgIGVuZCA9IG1vbGZpbGVWM0suaW5kZXhPZignICcsIGJlZ2luKTsgLy8gc2tpcCB0aGUgaWR4IHJvd1xuXG4gICAgLy8gcGFyc2UgYXRvbSB0eXBlXG4gICAgYmVnaW4gPSBlbmQgKyAxO1xuICAgIGVuZCA9IG1vbGZpbGVWM0suaW5kZXhPZignICcsIGJlZ2luKTtcbiAgICBhdG9tVHlwZXNbaV0gPSBtb2xmaWxlVjNLLnN1YnN0cmluZyhiZWdpbiwgZW5kKTtcblxuICAgIC8vIHBhcnNlIFggYW5kIFkgY29vcmRpbmF0ZXMgb2YgdGhlIGF0b21cbiAgICBjb25zdCBjb29yZGluYXRlOiBudW1iZXJbXSA9IG5ldyBBcnJheSgyKTtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IDI7ICsraykge1xuICAgICAgYmVnaW4gPSBlbmQgKyAxO1xuICAgICAgZW5kID0gbW9sZmlsZVYzSy5pbmRleE9mKCcgJywgYmVnaW4pO1xuICAgICAgY29vcmRpbmF0ZVtrXSA9IHBhcnNlRmxvYXQobW9sZmlsZVYzSy5zdWJzdHJpbmcoYmVnaW4sIGVuZCkpO1xuICAgIH1cbiAgICB4W2ldID0gY29vcmRpbmF0ZVswXTtcbiAgICB5W2ldID0gY29vcmRpbmF0ZVsxXTtcblxuICAgIC8vIHBhcnNlIHRoZSByZW1haW5pbmcgcG9zc2libGUga2V5d29yZCBhcmd1bWVudHNcbiAgICBiZWdpbiA9IGVuZDtcbiAgICBlbmQgPSBtb2xmaWxlVjNLLmluZGV4T2YoJ1xcbicsIGJlZ2luKSArIDE7XG4gICAga3dhcmdzW2ldID0gbW9sZmlsZVYzSy5zbGljZShiZWdpbiwgZW5kKTtcblxuICAgIGJlZ2luID0gZW5kO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhdG9tVHlwZXM6IGF0b21UeXBlcyxcbiAgICB4OiB4LFxuICAgIHk6IHksXG4gICAga3dhcmdzOiBrd2FyZ3MsXG4gIH07XG59XG5cbi8qIFJlbW92ZSBoeWRyb2dlbiBub2RlcyAqL1xuZnVuY3Rpb24gcmVtb3ZlSHlkcm9nZW4obW9ub21lckdyYXBoOiBNb2xHcmFwaCk6IHZvaWQge1xuICBsZXQgaSA9IDA7XG4gIHdoaWxlIChpIDwgbW9ub21lckdyYXBoLmF0b21zLmF0b21UeXBlcy5sZW5ndGgpIHtcbiAgICBpZiAobW9ub21lckdyYXBoLmF0b21zLmF0b21UeXBlc1tpXSA9PT0gSFlEUk9HRU4pIHtcbiAgICAgIHJlbW92ZU5vZGVBbmRCb25kcyhtb25vbWVyR3JhcGgsIGkgKyAxKTsgLy8gaSArIDEgYmVjYXVzZSBtb2xmaWxlIG5vZGUgaW5kZXhpbmcgc3RhcnRzIGZyb20gMVxuICAgICAgLS1pO1xuICAgICAgLy8gbW9ub21lckdyYXBoLmF0b21zLmF0b21UeXBlc1tpXSA9ICdMaSc7XG4gICAgfVxuICAgICsraTtcbiAgfVxufVxuXG4vKiBSZW1vdmUgbm9kZSAncmVtb3ZlZE5vZGUnIGFuZCB0aGUgYXNzb2NpYXRlZCBib25kcy4gTm90aWNlLCBudW1lcmF0aW9uIG9mXG4gKiBub2RlcyBpbiBtb2xmaWxlcyBzdGFydHMgZnJvbSAxLCBub3QgMCAqL1xuZnVuY3Rpb24gcmVtb3ZlTm9kZUFuZEJvbmRzKG1vbm9tZXJHcmFwaDogTW9sR3JhcGgsIHJlbW92ZWROb2RlPzogbnVtYmVyKTogdm9pZCB7XG4gIGlmICh0eXBlb2YgcmVtb3ZlZE5vZGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgY29uc3QgcmVtb3ZlZE5vZGVJZHggPSByZW1vdmVkTm9kZSAtIDE7XG4gICAgY29uc3QgYXRvbXMgPSBtb25vbWVyR3JhcGguYXRvbXM7XG4gICAgY29uc3QgYm9uZHMgPSBtb25vbWVyR3JhcGguYm9uZHM7XG4gICAgY29uc3QgbWV0YSA9IG1vbm9tZXJHcmFwaC5tZXRhO1xuXG4gICAgLy8gcmVtb3ZlIHRoZSBub2RlIGZyb20gYXRvbXNcbiAgICBhdG9tcy5hdG9tVHlwZXMuc3BsaWNlKHJlbW92ZWROb2RlSWR4LCAxKTtcbiAgICBhdG9tcy54LnNwbGljZShyZW1vdmVkTm9kZUlkeCwgMSk7XG4gICAgYXRvbXMueS5zcGxpY2UocmVtb3ZlZE5vZGVJZHgsIDEpO1xuICAgIGF0b21zLmt3YXJncy5zcGxpY2UocmVtb3ZlZE5vZGVJZHgsIDEpO1xuXG4gICAgLy8gdXBkYXRlIHRoZSB2YWx1ZXMgb2YgdGVybWluYWwgYW5kIHItZ3JvdXAgbm9kZXMgaWYgbmVjZXNzYXJ5XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXRhLnRlcm1pbmFsTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChtZXRhLnRlcm1pbmFsTm9kZXNbaV0gPiByZW1vdmVkTm9kZSlcbiAgICAgICAgLS1tZXRhLnRlcm1pbmFsTm9kZXNbaV07XG4gICAgICBlbHNlIGlmIChtZXRhLnRlcm1pbmFsTm9kZXNbaV0gPT09IHJlbW92ZWROb2RlKVxuICAgICAgICBtZXRhLnRlcm1pbmFsTm9kZXNbaV0gPSAtMTsgLy8gc2VudGluZWwgdG8gbWFyayB0aGUgdmFsdWUgYXMgcmVtb3ZlZFxuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1ldGEuck5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAobWV0YS5yTm9kZXNbaV0gPiByZW1vdmVkTm9kZSlcbiAgICAgICAgLS1tZXRhLnJOb2Rlc1tpXTtcbiAgICAgIGVsc2UgaWYgKG1ldGEuck5vZGVzW2ldID09PSByZW1vdmVkTm9kZSlcbiAgICAgICAgbWV0YS5yTm9kZXNbaV0gPSAtMTsgLy8gc2VudGluZWwgdG8gbWFyayB0aGUgdmFsdWUgYXMgcmVtb3ZlZFxuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBpbmRpY2VzIG9mIGF0b21zIGluIGJvbmRzXG4gICAgbGV0IGkgPSAwO1xuICAgIHdoaWxlIChpIDwgYm9uZHMuYXRvbVBhaXJzLmxlbmd0aCkge1xuICAgICAgY29uc3QgZmlyc3RBdG9tID0gYm9uZHMuYXRvbVBhaXJzW2ldWzBdO1xuICAgICAgY29uc3Qgc2Vjb25kQXRvbSA9IGJvbmRzLmF0b21QYWlyc1tpXVsxXTtcbiAgICAgIGlmIChmaXJzdEF0b20gPT09IHJlbW92ZWROb2RlIHx8IHNlY29uZEF0b20gPT09IHJlbW92ZWROb2RlKSB7XG4gICAgICAgIGJvbmRzLmF0b21QYWlycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJvbmRzLmJvbmRUeXBlcy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGlmIChib25kcy5ib25kQ29uZmlndXJhdGlvbi5oYXMoaSkpXG4gICAgICAgICAgYm9uZHMuYm9uZENvbmZpZ3VyYXRpb24uZGVsZXRlKGkpO1xuICAgICAgICBpZiAoYm9uZHMua3dhcmdzLmhhcyhpKSlcbiAgICAgICAgICBib25kcy5rd2FyZ3MuZGVsZXRlKGkpO1xuICAgICAgICAtLWk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBib25kcy5hdG9tUGFpcnNbaV1bMF0gPSAoZmlyc3RBdG9tID4gcmVtb3ZlZE5vZGUpID8gZmlyc3RBdG9tIC0gMSA6IGZpcnN0QXRvbTtcbiAgICAgICAgYm9uZHMuYXRvbVBhaXJzW2ldWzFdID0gKHNlY29uZEF0b20gPiByZW1vdmVkTm9kZSkgPyBzZWNvbmRBdG9tIC0gMSA6IHNlY29uZEF0b207XG4gICAgICB9XG4gICAgICArK2k7XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGJvbmRDb25maWd1cmF0aW9uIGFuZCBrd2FyZ3Mga2V5c1xuICAgIGxldCBrZXlzID0gQXJyYXkuZnJvbShib25kcy5ib25kQ29uZmlndXJhdGlvbi5rZXlzKCkpO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoYm9uZHMuYm9uZENvbmZpZ3VyYXRpb24uaGFzKGtleSkgJiYga2V5ID4gcmVtb3ZlZE5vZGVJZHgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBib25kcy5ib25kQ29uZmlndXJhdGlvbi5nZXQoa2V5KSE7XG4gICAgICAgIGJvbmRzLmJvbmRDb25maWd1cmF0aW9uLmRlbGV0ZShrZXkpO1xuICAgICAgICBib25kcy5ib25kQ29uZmlndXJhdGlvbi5zZXQoa2V5IC0gMSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGtleXMgPSBBcnJheS5mcm9tKGJvbmRzLmt3YXJncy5rZXlzKCkpO1xuICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBpZiAoYm9uZHMua3dhcmdzLmhhcyhrZXkpICYmIGtleSA+IHJlbW92ZWROb2RlSWR4KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gYm9uZHMua3dhcmdzLmdldChrZXkpITtcbiAgICAgICAgYm9uZHMua3dhcmdzLmRlbGV0ZShrZXkpO1xuICAgICAgICBib25kcy5rd2FyZ3Muc2V0KGtleSAtIDEsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vLyB0b2RvOiByZXdyaXRlIGRlc2NyaXB0aW9uXG4vKiBBZGp1c3QgdGhlIChwZXB0aWRlKSBtb25vbWVyIGdyYXBoIHNvIHRoYXQgaXQgaGFzIHN0YW5kYXJkIGZvcm0gICovXG5mdW5jdGlvbiBhZGp1c3RQZXB0aWRlTW9ub21lckdyYXBoKG1vbm9tZXI6IE1vbEdyYXBoKTogdm9pZCB7XG4gIGNvbnN0IG5vZGVPbmVJZHggPSBtb25vbWVyLm1ldGEudGVybWluYWxOb2Rlc1swXSAtIDE7IC8vIG5vZGUgaW5kZXhpbmcgaW4gbW9sZmlsZXMgc3RhcnRzIGZyb20gMVxuICBjb25zdCBub2RlVHdvSWR4ID0gbW9ub21lci5tZXRhLnJOb2Rlc1swXSAtIDE7XG4gIGNvbnN0IHggPSBtb25vbWVyLmF0b21zLng7XG4gIGNvbnN0IHkgPSBtb25vbWVyLmF0b21zLnk7XG5cbiAgLy8gcGxhY2Ugbm9kZU9uZSBhdCBvcmlnaW5cbiAgc2hpZnRDb29yZGluYXRlcyhtb25vbWVyLCAteFtub2RlT25lSWR4XSwgLXlbbm9kZU9uZUlkeF0pO1xuXG4gIC8vIGFuZ2xlIGlzIG1lYXN1cmVkIGJldHdlZW4gT1kgYW5kIHRoZSByb3RhdGVkIG5vZGVcbiAgY29uc3QgYW5nbGUgPSBmaW5kQW5nbGVXaXRoT1koeFtub2RlVHdvSWR4XSwgeVtub2RlVHdvSWR4XSk7XG5cbiAgLy8gcm90YXRlIHRoZSBjZW50ZXJlZCBncmFwaCwgc28gdGhhdCAnbm9kZVR3bycgZW5kcyB1cCBvbiB0aGUgcG9zaXRpdmUgcmF5IG9mIE9ZXG4gIHJvdGF0ZUNlbnRlcmVkR3JhcGgobW9ub21lci5hdG9tcywgLWFuZ2xlKTtcblxuICBpZiAoeFttb25vbWVyLm1ldGEuck5vZGVzWzFdIC0gMV0gPCAwKVxuICAgIGZsaXBNb25vbWVyQXJvdW5kT1kobW9ub21lcik7XG5cbiAgY29uc3QgZG91YmxlQm9uZGVkT3h5Z2VuID0gZmluZERvdWJsZUJvbmRlZENhcmJvbnlsT3h5Z2VuKG1vbm9tZXIpO1xuXG4gIC8vIGZsaXAgY2FyYm94eWwgYW5kIFIgaWYgbmVjZXNzYXJ5XG4gIGZsaXBDYXJib3h5bEFuZFJhZGljYWwobW9ub21lciwgZG91YmxlQm9uZGVkT3h5Z2VuKTtcblxuICAvLyBmbGlwIGh5ZHJveHlsIGdyb3VwIHdpdGggZG91YmxlLWJvdW5kIE8gaW5zaWRlIGNhcmJveHlsIGdyb3VwIGlmIG5lY2Vzc2FyeVxuICBmbGlwSHlkcm94aWxHcm91cChtb25vbWVyLCBkb3VibGVCb25kZWRPeHlnZW4pO1xufVxuXG5mdW5jdGlvbiBhZGp1c3RQaG9zcGhhdGVNb25vbWVyR3JhcGgobW9ub21lcjogTW9sR3JhcGgpOiB2b2lkIHtcbiAgY29uc3Qgbm9kZU9uZUlkeCA9IG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzBdIC0gMTsgLy8gbm9kZSBpbmRleGluZyBpbiBtb2xmaWxlcyBzdGFydHMgZnJvbSAxXG4gIC8vIGNvbnN0IG5vZGVUd29JZHggPSBtb25vbWVyLm1ldGEuck5vZGVzWzBdIC0gMTtcbiAgY29uc3QgeCA9IG1vbm9tZXIuYXRvbXMueDtcbiAgY29uc3QgeSA9IG1vbm9tZXIuYXRvbXMueTtcblxuICAvLyBwbGFjZSBub2RlT25lIGF0IG9yaWdpblxuICBzaGlmdENvb3JkaW5hdGVzKG1vbm9tZXIsIC14W25vZGVPbmVJZHhdLCAteVtub2RlT25lSWR4XSk7XG5cbiAgLy8gLy8gYW5nbGUgaXMgbWVhc3VyZWQgYmV0d2VlbiBPWSBhbmQgdGhlIHJvdGF0ZWQgbm9kZVxuICAvLyBjb25zdCBhbmdsZSA9IGZpbmRBbmdsZVdpdGhPWSh4W25vZGVUd29JZHhdLCB5W25vZGVUd29JZHhdKTtcblxuICAvLyAvLyByb3RhdGUgdGhlIGNlbnRlcmVkIGdyYXBoLCBzbyB0aGF0ICdub2RlVHdvJyBlbmRzIHVwIG9uIHRoZSBwb3NpdGl2ZSByYXkgb2YgT1lcbiAgLy8gcm90YXRlQ2VudGVyZWRHcmFwaChtb25vbWVyLmF0b21zLCAtYW5nbGUpO1xuXG4gIC8vIGlmICh4W21vbm9tZXIubWV0YS5yTm9kZXNbMV0gLSAxXSA8IDApXG4gIC8vICAgZmxpcE1vbm9tZXJBcm91bmRPWShtb25vbWVyKTtcblxuICAvLyBjb25zdCBkb3VibGVCb25kZWRPeHlnZW4gPSBmaW5kRG91YmxlQm9uZGVkQ2FyYm9ueWxPeHlnZW4obW9ub21lcik7XG5cbiAgLy8gLy8gZmxpcCBjYXJib3h5bCBhbmQgUiBpZiBuZWNlc3NhcnlcbiAgLy8gZmxpcENhcmJveHlsQW5kUmFkaWNhbChtb25vbWVyLCBkb3VibGVCb25kZWRPeHlnZW4pO1xuXG4gIC8vIC8vIGZsaXAgaHlkcm94eWwgZ3JvdXAgd2l0aCBkb3VibGUtYm91bmQgTyBpbnNpZGUgY2FyYm94eWwgZ3JvdXAgaWYgbmVjZXNzYXJ5XG4gIC8vIGZsaXBIeWRyb3hpbEdyb3VwKG1vbm9tZXIsIGRvdWJsZUJvbmRlZE94eWdlbik7XG59XG5cbi8qIEFkanVzdCBhIGJhY2tib25lIGdyYXBoIHNvIHRoYXQgbm9kZU9uZSBpcyBhdCBvcmlnaW4gYW5kIG5vZGVUd28gaXMgYXQgT1guXG4gKiBOb3RpY2U6IG5vZGUgaW5kZXhpbmcgaW4gbW9sZmlsZXMgc3RhcnRzIGZyb20gMSAqL1xuZnVuY3Rpb24gYWRqdXN0QmFja2JvbmVNb25vbWVyR3JhcGgoXG4gIG1vbm9tZXI6IE1vbEdyYXBoLCBub2RlT25lSWR4OiBudW1iZXIsIG5vZGVUd29JZHg6IG51bWJlclxuKTogdm9pZCB7XG4gIGNvbnN0IHggPSBtb25vbWVyLmF0b21zLng7XG4gIGNvbnN0IHkgPSBtb25vbWVyLmF0b21zLnk7XG5cbiAgLy8gcGxhY2Ugbm9kZU9uZSBhdCBvcmlnaW5cbiAgc2hpZnRDb29yZGluYXRlcyhtb25vbWVyLCAteFtub2RlT25lSWR4XSwgLXlbbm9kZU9uZUlkeF0pO1xuXG4gIC8vIGFuZ2xlIGlzIG1lYXN1cmVkIGJldHdlZW4gT1ggYW5kIHRoZSByb3RhdGVkIG5vZGVcbiAgY29uc3QgYW5nbGUgPSBmaW5kQW5nbGVXaXRoT1goeFtub2RlVHdvSWR4XSwgeVtub2RlVHdvSWR4XSk7XG5cbiAgLy8gcm90YXRlIHRoZSBjZW50ZXJlZCBncmFwaCwgc28gdGhhdCAnbm9kZVR3bycgZW5kcyB1cCBvbiB0aGUgcG9zaXRpdmUgcmF5IG9mIE9YXG4gIHJvdGF0ZUNlbnRlcmVkR3JhcGgobW9ub21lci5hdG9tcywgLWFuZ2xlKTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0U3VnYXJNb25vbWVyR3JhcGgobW9ub21lcjogTW9sR3JhcGgpOiB2b2lkIHtcbiAgY29uc3Qgbm9kZU9uZUlkeCA9IG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzBdIC0gMTsgLy8gbm9kZSBpbmRleGluZyBpbiBtb2xmaWxlcyBzdGFydHMgZnJvbSAxXG4gIC8vIGNvbnN0IG5vZGVUd29JZHggPSBtb25vbWVyLm1ldGEuck5vZGVzWzBdIC0gMTtcbiAgY29uc3QgeCA9IG1vbm9tZXIuYXRvbXMueDtcbiAgY29uc3QgeSA9IG1vbm9tZXIuYXRvbXMueTtcblxuICAvLyBwbGFjZSBub2RlT25lIGF0IG9yaWdpblxuICBzaGlmdENvb3JkaW5hdGVzKG1vbm9tZXIsIC14W25vZGVPbmVJZHhdLCAteVtub2RlT25lSWR4XSk7XG5cbiAgLy8gLy8gYW5nbGUgaXMgbWVhc3VyZWQgYmV0d2VlbiBPWSBhbmQgdGhlIHJvdGF0ZWQgbm9kZVxuICAvLyBjb25zdCBhbmdsZSA9IGZpbmRBbmdsZVdpdGhPWSh4W25vZGVUd29JZHhdLCB5W25vZGVUd29JZHhdKTtcblxuICAvLyAvLyByb3RhdGUgdGhlIGNlbnRlcmVkIGdyYXBoLCBzbyB0aGF0ICdub2RlVHdvJyBlbmRzIHVwIG9uIHRoZSBwb3NpdGl2ZSByYXkgb2YgT1lcbiAgLy8gcm90YXRlQ2VudGVyZWRHcmFwaChtb25vbWVyLmF0b21zLCAtYW5nbGUpO1xuXG4gIC8vIGlmICh4W21vbm9tZXIubWV0YS5yTm9kZXNbMV0gLSAxXSA8IDApXG4gIC8vICAgZmxpcE1vbm9tZXJBcm91bmRPWShtb25vbWVyKTtcblxuICAvLyBjb25zdCBkb3VibGVCb25kZWRPeHlnZW4gPSBmaW5kRG91YmxlQm9uZGVkQ2FyYm9ueWxPeHlnZW4obW9ub21lcik7XG5cbiAgLy8gLy8gZmxpcCBjYXJib3h5bCBhbmQgUiBpZiBuZWNlc3NhcnlcbiAgLy8gZmxpcENhcmJveHlsQW5kUmFkaWNhbChtb25vbWVyLCBkb3VibGVCb25kZWRPeHlnZW4pO1xuXG4gIC8vIC8vIGZsaXAgaHlkcm94eWwgZ3JvdXAgd2l0aCBkb3VibGUtYm91bmQgTyBpbnNpZGUgY2FyYm94eWwgZ3JvdXAgaWYgbmVjZXNzYXJ5XG4gIC8vIGZsaXBIeWRyb3hpbEdyb3VwKG1vbm9tZXIsIGRvdWJsZUJvbmRlZE94eWdlbik7XG59XG5cbmZ1bmN0aW9uIGFkanVzdEJhc2VNb25vbWVyR3JhcGgobW9ub21lcjogTW9sR3JhcGgpOiB2b2lkIHtcbiAgY29uc3Qgbm9kZU9uZUlkeCA9IG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzBdIC0gMTsgLy8gbm9kZSBpbmRleGluZyBpbiBtb2xmaWxlcyBzdGFydHMgZnJvbSAxXG4gIC8vIGNvbnN0IG5vZGVUd29JZHggPSBtb25vbWVyLm1ldGEuck5vZGVzWzBdIC0gMTtcbiAgY29uc3QgeCA9IG1vbm9tZXIuYXRvbXMueDtcbiAgY29uc3QgeSA9IG1vbm9tZXIuYXRvbXMueTtcblxuICAvLyBwbGFjZSBub2RlT25lIGF0IG9yaWdpblxuICBzaGlmdENvb3JkaW5hdGVzKG1vbm9tZXIsIC14W25vZGVPbmVJZHhdLCAteVtub2RlT25lSWR4XSk7XG5cbiAgLy8gLy8gYW5nbGUgaXMgbWVhc3VyZWQgYmV0d2VlbiBPWSBhbmQgdGhlIHJvdGF0ZWQgbm9kZVxuICAvLyBjb25zdCBhbmdsZSA9IGZpbmRBbmdsZVdpdGhPWSh4W25vZGVUd29JZHhdLCB5W25vZGVUd29JZHhdKTtcblxuICAvLyAvLyByb3RhdGUgdGhlIGNlbnRlcmVkIGdyYXBoLCBzbyB0aGF0ICdub2RlVHdvJyBlbmRzIHVwIG9uIHRoZSBwb3NpdGl2ZSByYXkgb2YgT1lcbiAgLy8gcm90YXRlQ2VudGVyZWRHcmFwaChtb25vbWVyLmF0b21zLCAtYW5nbGUpO1xuXG4gIC8vIGlmICh4W21vbm9tZXIubWV0YS5yTm9kZXNbMV0gLSAxXSA8IDApXG4gIC8vICAgZmxpcE1vbm9tZXJBcm91bmRPWShtb25vbWVyKTtcblxuICAvLyBjb25zdCBkb3VibGVCb25kZWRPeHlnZW4gPSBmaW5kRG91YmxlQm9uZGVkQ2FyYm9ueWxPeHlnZW4obW9ub21lcik7XG5cbiAgLy8gLy8gZmxpcCBjYXJib3h5bCBhbmQgUiBpZiBuZWNlc3NhcnlcbiAgLy8gZmxpcENhcmJveHlsQW5kUmFkaWNhbChtb25vbWVyLCBkb3VibGVCb25kZWRPeHlnZW4pO1xuXG4gIC8vIC8vIGZsaXAgaHlkcm94eWwgZ3JvdXAgd2l0aCBkb3VibGUtYm91bmQgTyBpbnNpZGUgY2FyYm94eWwgZ3JvdXAgaWYgbmVjZXNzYXJ5XG4gIC8vIGZsaXBIeWRyb3hpbEdyb3VwKG1vbm9tZXIsIGRvdWJsZUJvbmRlZE94eWdlbik7XG59XG5cbi8qIEZsaXAgY2FyYm94eWwgZ3JvdXAgd2l0aCB0aGUgcmFkaWNhbCBpbiBhIHBlcHRpZGUgbW9ub21lciBpbiBjYXNlIHRoZVxuICogY2FyYm94eWwgZ3JvdXAgaXMgaW4gdGhlIGxvd2VyIGhhbGYtcGxhbmUgKi9cbmZ1bmN0aW9uIGZsaXBDYXJib3h5bEFuZFJhZGljYWwobW9ub21lcjogTW9sR3JhcGgsIGRvdWJsZUJvbmRlZE94eWdlbjogbnVtYmVyKTogdm9pZCB7XG4gIC8vIHZlcmlmeSB0aGF0IHRoZSBjYXJib3h5bCBncm91cCBpcyBpbiB0aGUgbG93ZXIgaGFsZi1wbGFuZVxuICBpZiAobW9ub21lci5hdG9tcy55W21vbm9tZXIubWV0YS5yTm9kZXNbMV0gLSAxXSA8IDAgJiZcbiAgICBtb25vbWVyLmF0b21zLnlbZG91YmxlQm9uZGVkT3h5Z2VuIC0gMV0gPCAwKSB7XG4gICAgZmxpcE1vbm9tZXJBcm91bmRPWChtb25vbWVyKTtcblxuICAgIHJvdGF0ZUNlbnRlcmVkR3JhcGgobW9ub21lci5hdG9tcyxcbiAgICAgIC1maW5kQW5nbGVXaXRoT1goXG4gICAgICAgIG1vbm9tZXIuYXRvbXMueFttb25vbWVyLm1ldGEudGVybWluYWxOb2Rlc1sxXSAtIDFdLFxuICAgICAgICBtb25vbWVyLmF0b21zLnlbbW9ub21lci5tZXRhLnRlcm1pbmFsTm9kZXNbMV0gLSAxXVxuICAgICAgKVxuICAgICk7XG4gIH1cbn1cblxuLyogRmluZHMgYW5nbGUgYmV0d2VlbiBPWSBhbmQgdGhlIHJheSBqb2luaW5nIG9yaWdpbiB3aXRoICh4LCB5KSAqL1xuZnVuY3Rpb24gZmluZEFuZ2xlV2l0aE9ZKHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgbGV0IGFuZ2xlO1xuICBpZiAoeCA9PT0gMCkge1xuICAgIGFuZ2xlID0geSA+IDAgPyAwIDogTWF0aC5QSTtcbiAgfSBlbHNlIGlmICh5ID09PSAwKSB7XG4gICAgYW5nbGUgPSB4ID4gMCA/IC1NYXRoLlBJIC8gMiA6IE1hdGguUEkgLyAyO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHRhbiA9IHkgLyB4O1xuICAgIGNvbnN0IGF0YW4gPSBNYXRoLmF0YW4odGFuKTtcbiAgICBhbmdsZSA9ICh4IDwgMCkgPyBNYXRoLlBJIC8gMiArIGF0YW4gOiAtTWF0aC5QSSAvIDIgKyBhdGFuO1xuICB9XG4gIHJldHVybiBhbmdsZTtcbn1cblxuLyogRmluZHMgYW5nbGUgYmV0d2VlbiBPWCBhbmQgdGhlIHJheSBqb2luaW5nIG9yaWdpbiB3aXRoICh4LCB5KSAqL1xuZnVuY3Rpb24gZmluZEFuZ2xlV2l0aE9YKHg6IG51bWJlciwgeTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGZpbmRBbmdsZVdpdGhPWSh4LCB5KSArIE1hdGguUEkgLyAyO1xufVxuXG4vKiAgUm90YXRlIHRoZSBncmFwaCBhcm91bmQgdGhlIG9yaWdpbiBieSAnYW5nbGUnICovXG5mdW5jdGlvbiByb3RhdGVDZW50ZXJlZEdyYXBoKGF0b21zOiBBdG9tcywgYW5nbGU6IG51bWJlcik6IHZvaWQge1xuICBpZiAoYW5nbGUgIT09IDApIHtcbiAgICBjb25zdCB4ID0gYXRvbXMueDtcbiAgICBjb25zdCB5ID0gYXRvbXMueTtcblxuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHRtcCA9IHhbaV07XG4gICAgICB4W2ldID0ga2VlcFByZWNpc2lvbih0bXAgKiBjb3MgLSB5W2ldICogc2luKTtcbiAgICAgIHlbaV0gPSBrZWVwUHJlY2lzaW9uKHRtcCAqIHNpbiArIHlbaV0gKiBjb3MpO1xuICAgIH1cbiAgfVxufVxuXG4vKiBGbGlwIG1vbm9tZXIgZ3JhcGggYXJvdW5kIE9YIGF4aXMgcHJlc2VydmluZyBzdGVyZW9tZXRyeSAqL1xuZnVuY3Rpb24gZmxpcE1vbm9tZXJBcm91bmRPWChtb25vbWVyOiBNb2xHcmFwaCk6IHZvaWQge1xuICBmbGlwTW9sR3JhcGgobW9ub21lciwgdHJ1ZSk7XG59XG5cbi8qIEZsaXAgbW9ub21lciBncmFwaCBhcm91bmQgT1kgYXhpcyBwcmVzZXJ2aW5nIHN0ZXJlb21ldHJ5ICovXG5mdW5jdGlvbiBmbGlwTW9ub21lckFyb3VuZE9ZKG1vbm9tZXI6IE1vbEdyYXBoKTogdm9pZCB7XG4gIGZsaXBNb2xHcmFwaChtb25vbWVyLCBmYWxzZSk7XG59XG5cbi8qIEZsaXAgZ3JhcGggYXJvdW5kIGEgc3BlY2lmaWVkIGF4aXM6ICd0cnVlJyBjb3JyZXNwb25kcyB0byBPWCwgJ2ZhbHNlJyB0byBPWSAqL1xuZnVuY3Rpb24gZmxpcE1vbEdyYXBoKG1vbEdyYXBoOiBNb2xHcmFwaCwgYXhpczogYm9vbGVhbik6IHZvaWQge1xuICBpZiAoYXhpcykgeyAvLyBmbGlwcGluZyBhcm91bmQgT1hcbiAgICBjb25zdCB5ID0gbW9sR3JhcGguYXRvbXMueTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHkubGVuZ3RoOyBpKyspXG4gICAgICB5W2ldID0gLXlbaV07XG4gIH0gZWxzZSB7IC8vIGZsaXBwaW5nIGFyb3VuZCBPWVxuICAgIGNvbnN0IHggPSBtb2xHcmFwaC5hdG9tcy54O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKylcbiAgICAgIHhbaV0gPSAteFtpXTtcbiAgfVxuXG4gIC8vIHByZXNlcnZlIHRoZSBzdGVyZW9tZXRyeVxuICBjb25zdCBvcmllbnRhdGlvbiA9IG1vbEdyYXBoLmJvbmRzLmJvbmRDb25maWd1cmF0aW9uO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBvcmllbnRhdGlvbikge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gdmFsdWUgPT09IDEgPyAzIDogMTtcbiAgICBvcmllbnRhdGlvbi5zZXQoa2V5LCBuZXdWYWx1ZSk7XG4gIH1cbn1cblxuLyogRmxpcHMgZG91YmxlLWJvbmRlZCAnTycgaW4gY2FyYm9ueWwgZ3JvdXAgd2l0aCAnT0gnIGluIG9yZGVyIGZvciB0aGUgbW9ub21lcnNcbiAqIHRvIGhhdmUgc3RhbmRhcmQgcmVwcmVzZW50YXRpb24gc2ltcGxpZnlpbmcgdGhlaXIgY29uY2F0ZW5hdGlvbi4gVGhlXG4gKiBtb25vbWVyIG11c3QgYWxyZWFkeSBiZSBhZGp1c3RlZCB3aXRoIGFkanVzdFBlcHRpZGVNb25vbWVyR3JhcGggaW4gb3JkZXIgZm9yIHRoaXMgZnVuY3Rpb24gdG8gYmUgaW1wbGVtZW50ZWQgICovXG5mdW5jdGlvbiBmbGlwSHlkcm94aWxHcm91cChtb25vbWVyOiBNb2xHcmFwaCwgZG91YmxlQm9uZGVkT3h5Z2VuOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgeCA9IG1vbm9tZXIuYXRvbXMueDtcbiAgLy8gLTEgYmVsb3cgYmVjYXVzZSBpbmRleGluZyBvZiBub2RlcyBpbiBtb2xmaWxlcyBzdGFydHMgZnJvbSAxLCB1bmxpa2UgYXJyYXlzXG4gIGlmICh4W21vbm9tZXIubWV0YS5yTm9kZXNbMV0gLSAxXSA+IHhbZG91YmxlQm9uZGVkT3h5Z2VuIC0gMV0pXG4gICAgc3dhcE5vZGVzKG1vbm9tZXIsIGRvdWJsZUJvbmRlZE94eWdlbiwgbW9ub21lci5tZXRhLnJOb2Rlc1sxXSk7XG59XG5cbi8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIG5vZGUgKHN0YXJ0aW5nIGZyb20gMSkgY29ycmVzcG9uZGluZyB0byB0aGVcbiAqIGRvdWJsZS1ib25kZWQgb3h5Z2VuIG9mIHRoZSBjYXJib255bCBncm91cCAgKi9cbmZ1bmN0aW9uIGZpbmREb3VibGVCb25kZWRDYXJib255bE94eWdlbihtb25vbWVyOiBNb2xHcmFwaCk6IG51bWJlciB7XG4gIGNvbnN0IGJvbmRzTWFwID0gY29uc3RydWN0Qm9uZHNNYXAobW9ub21lcik7XG4gIGxldCBkb3VibGVCb25kZWRPeHlnZW4gPSAwO1xuICBsZXQgaSA9IDA7XG4gIC8vIGl0ZXJhdGUgb3ZlciB0aGUgbm9kZXMgYm9uZGVkIHRvIHRoZSBjYXJib24gYW5kIGZpbmQgdGhlIGRvdWJsZSBvbmVcbiAgd2hpbGUgKGRvdWJsZUJvbmRlZE94eWdlbiA9PT0gMCkge1xuICAgIGNvbnN0IG5vZGUgPSBib25kc01hcC5nZXQobW9ub21lci5tZXRhLnRlcm1pbmFsTm9kZXNbMV0pIVtpXTtcbiAgICBpZiAobW9ub21lci5hdG9tcy5hdG9tVHlwZXNbbm9kZSAtIDFdID09PSBPWFlHRU4gJiYgbm9kZSAhPT0gbW9ub21lci5tZXRhLnJOb2Rlc1sxXSlcbiAgICAgIGRvdWJsZUJvbmRlZE94eWdlbiA9IG5vZGU7XG4gICAgaSsrO1xuICB9XG4gIHJldHVybiBkb3VibGVCb25kZWRPeHlnZW47XG59XG5cbi8qIFN3YXAgdGhlIENhcnRlc2lhbiBjb29yZGluYXRlcyBvZiB0aGUgdHdvIHNwZWNpZmllZCBub2RlcyBpbiBNb2xHcmFwaCAgKi9cbmZ1bmN0aW9uIHN3YXBOb2Rlcyhtb25vbWVyOiBNb2xHcmFwaCwgbm9kZU9uZTogbnVtYmVyLCBub2RlVHdvOiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3Qgbm9kZU9uZUlkeCA9IG5vZGVPbmUgLSAxO1xuICBjb25zdCBub2RlVHdvSWR4ID0gbm9kZVR3byAtIDE7XG4gIGNvbnN0IHggPSBtb25vbWVyLmF0b21zLng7XG4gIGNvbnN0IHkgPSBtb25vbWVyLmF0b21zLnk7XG4gIGNvbnN0IHRtcFggPSB4W25vZGVPbmVJZHhdO1xuICBjb25zdCB0bXBZID0geVtub2RlT25lSWR4XTtcbiAgeFtub2RlT25lSWR4XSA9IHhbbm9kZVR3b0lkeF07XG4gIHlbbm9kZU9uZUlkeF0gPSB5W25vZGVUd29JZHhdO1xuICB4W25vZGVUd29JZHhdID0gdG1wWDtcbiAgeVtub2RlVHdvSWR4XSA9IHRtcFk7XG59XG5cbi8vIHRvZG86IGRvY1xuZnVuY3Rpb24gY29uc3RydWN0Qm9uZHNNYXAobW9ub21lcjogTW9sR3JhcGgpOiBNYXA8bnVtYmVyLCBBcnJheTxudW1iZXI+PiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8bnVtYmVyLCBBcnJheTxudW1iZXI+PigpO1xuICBmb3IgKGNvbnN0IGF0b21QYWlycyBvZiBtb25vbWVyLmJvbmRzLmF0b21QYWlycykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBhdG9tUGFpcnNbaV07XG4gICAgICBjb25zdCB2YWx1ZSA9IGF0b21QYWlyc1soaSArIDEpICUgMl07XG4gICAgICBpZiAobWFwLmhhcyhrZXkpKVxuICAgICAgICBtYXAuZ2V0KGtleSk/LnB1c2godmFsdWUpO1xuICAgICAgZWxzZVxuICAgICAgICBtYXAuc2V0KGtleSwgbmV3IEFycmF5PG51bWJlcj4oMSkuZmlsbCh2YWx1ZSkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWFwO1xufVxuXG4vKiBTaGlmdCBtb2xHcmFwaCBpbiB0aGUgWE9ZIHBsYW5lICAqL1xuZnVuY3Rpb24gc2hpZnRDb29yZGluYXRlcyhtb2xHcmFwaDogTW9sR3JhcGgsIHhTaGlmdDogbnVtYmVyLCB5U2hpZnQ/OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgeCA9IG1vbEdyYXBoLmF0b21zLng7XG4gIGNvbnN0IHkgPSBtb2xHcmFwaC5hdG9tcy55O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHgubGVuZ3RoOyArK2kpIHtcbiAgICB4W2ldID0ga2VlcFByZWNpc2lvbih4W2ldICsgeFNoaWZ0KTtcbiAgICBpZiAodHlwZW9mIHlTaGlmdCAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICB5W2ldID0ga2VlcFByZWNpc2lvbih5W2ldICsgeVNoaWZ0KTtcbiAgfVxufVxuXG4vKiBUcmFuc2xhdGUgYSBzZXF1ZW5jZSBvZiBtb25vbWVyIHN5bWJvbHMgaW50byBNb2xmaWxlIFYzMDAwICovXG5mdW5jdGlvbiBtb25vbWVyU2VxVG9Nb2xmaWxlKFxuICBtb25vbWVyU2VxOiBzdHJpbmdbXSwgbW9ub21lcnNEaWN0OiBNYXA8c3RyaW5nLCBNb2xHcmFwaD4sXG4gIGFscGhhYmV0OiBBTFBIQUJFVCwgcG9seW1lclR5cGU6IEhFTE1fUE9MWU1FUl9UWVBFLCBtb2RlOiBNT0RFXG4pOiBzdHJpbmcge1xuICAvLyB0b2RvOiBoYW5kbGUgdGhlIGNhc2Ugd2hlbiB0aGUgcG9seW1lciBpcyBlbXB0eVxuICBpZiAobW9ub21lclNlcS5sZW5ndGggPT09IDApXG4gICAgdGhyb3cgbmV3IEVycm9yKCdtb25vbWVyU2VxIGlzIGVtcHR5Jyk7XG5cbiAgLy8gZGVmaW5lIGF0b20gYW5kIGJvbmQgY291bnRzLCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBib25kIHR5cGVcbiAgY29uc3QgZ2V0QXRvbUFuZEJvbmRDb3VudHMgPSAobW9kZSA9PT0gTU9ERS5TVEFOREFSRCkgP1xuICAgIGdldFJlc3VsdGluZ0F0b21Cb25kQ291bnRzIDogZ2V0UmVzdWx0aW5nQXRvbUJvbmRDb3VudHNTVDtcbiAgY29uc3Qge2F0b21Db3VudCwgYm9uZENvdW50fSA9IGdldEF0b21BbmRCb25kQ291bnRzKG1vbm9tZXJTZXEsIG1vbm9tZXJzRGljdCwgYWxwaGFiZXQsIHBvbHltZXJUeXBlLCBtb2RlKTtcblxuICAvLyBjcmVhdGUgYXJyYXlzIHRvIHN0b3JlIGxpbmVzIG9mIHRoZSByZXN1bHRpbmcgbW9sZmlsZVxuICBjb25zdCBtb2xmaWxlQXRvbUJsb2NrID0gbmV3IEFycmF5PHN0cmluZz4oYXRvbUNvdW50KTtcbiAgY29uc3QgbW9sZmlsZUJvbmRCbG9jayA9IG5ldyBBcnJheTxzdHJpbmc+KGJvbmRDb3VudCk7XG5cbiAgbGV0IGFkZE1vbm9tZXJUb01vbGJsb2NrOyAvLyB0b2RvOiB0eXBlcz9cblxuICBsZXQgc3VnYXIgPSBudWxsO1xuICBsZXQgcGhvc3BoYXRlID0gbnVsbDtcblxuICBpZiAobW9kZSA9PT0gTU9ERS5TVEFOREFSRCkge1xuICAgIGlmIChwb2x5bWVyVHlwZSA9PT0gSEVMTV9QT0xZTUVSX1RZUEUuUEVQVElERSkge1xuICAgICAgYWRkTW9ub21lclRvTW9sYmxvY2sgPSBhZGRBbWlub0FjaWRUb01vbGJsb2NrO1xuICAgIH0gZWxzZSB7IC8vIG51Y2xlb3RpZGVzXG4gICAgICBhZGRNb25vbWVyVG9Nb2xibG9jayA9IGFkZE51Y2xlb3RpZGVUb01vbGJsb2NrO1xuICAgICAgc3VnYXIgPSAoYWxwaGFiZXQgPT09IEFMUEhBQkVULkROQSkgPyBtb25vbWVyc0RpY3QuZ2V0KERFT1hZUklCT1NFKSA6IG1vbm9tZXJzRGljdC5nZXQoUklCT1NFKTtcbiAgICAgIHBob3NwaGF0ZSA9IG1vbm9tZXJzRGljdC5nZXQoUEhPU1BIQVRFKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYWRkTW9ub21lclRvTW9sYmxvY2sgPSBhZGRNb25vbWVyVG9Nb2xibG9ja1NUO1xuICB9XG5cbiAgY29uc3QgdjogTG9vcFZhcmlhYmxlcyA9IHtcbiAgICBpOiAwLFxuICAgIG5vZGVTaGlmdDogMCxcbiAgICBib25kU2hpZnQ6IDAsXG4gICAgYmFja2JvbmVQb3NpdGlvblNoaWZ0OiBuZXcgQXJyYXk8bnVtYmVyPigyKS5maWxsKDApLFxuICAgIGJyYW5jaFBvc2l0aW9uU2hpZnQ6IG5ldyBBcnJheTxudW1iZXI+KDIpLmZpbGwoMCksXG4gICAgYmFja2JvbmVBdHRhY2hOb2RlOiAwLFxuICAgIGJyYW5jaEF0dGFjaE5vZGU6IDAsXG4gICAgZmxpcEZhY3RvcjogMSxcbiAgfTtcblxuICBjb25zdCBDOiBMb29wQ29uc3RhbnRzID0ge1xuICAgIHN1Z2FyOiBzdWdhciEsXG4gICAgcGhvc3BoYXRlOiBwaG9zcGhhdGUhLFxuICAgIHNlcUxlbmd0aDogbW9ub21lclNlcS5sZW5ndGgsXG4gICAgYXRvbUNvdW50OiBhdG9tQ291bnQsXG4gICAgYm9uZENvdW50OiBib25kQ291bnQsXG4gIH07XG5cbiAgZm9yICh2LmkgPSAwOyB2LmkgPCBDLnNlcUxlbmd0aDsgKyt2LmkpIHtcbiAgICBjb25zdCBtb25vbWVyID0gbW9ub21lcnNEaWN0LmdldChtb25vbWVyU2VxW3YuaV0pITtcbiAgICBhZGRNb25vbWVyVG9Nb2xibG9jayhtb25vbWVyLCBtb2xmaWxlQXRvbUJsb2NrLCBtb2xmaWxlQm9uZEJsb2NrLCB2LCBDKTtcbiAgfVxuXG4gIGNhcFJlc3VsdGluZ01vbGJsb2NrKG1vbGZpbGVBdG9tQmxvY2ssIG1vbGZpbGVCb25kQmxvY2ssIHYsIEMsIG1vZGUpO1xuXG4gIGNvbnN0IG1vbGZpbGVDb3VudHNMaW5lID0gVjNLX0JFR0lOX0NPVU5UU19MSU5FICsgYXRvbUNvdW50ICsgJyAnICsgYm9uZENvdW50ICsgVjNLX0NPVU5UU19MSU5FX0VORElORztcblxuICAvLyB0b2RvOiBvcHRpbWl6ZSBjb25jYXRlbmF0aW9uIHVzaW5nIEFsZXhhbmRlcidzIGhpbnRcbiAgY29uc3QgbW9sZmlsZVBhcnRzID0gW1xuICAgIFYzS19IRUFERVJfRklSU1RfTElORSxcbiAgICBWM0tfSEVBREVSX1NFQ09ORF9MSU5FLFxuICAgIFYzS19CRUdJTl9DVEFCX0JMT0NLLFxuICAgIG1vbGZpbGVDb3VudHNMaW5lLFxuICAgIFYzS19CRUdJTl9BVE9NX0JMT0NLLFxuICAgIG1vbGZpbGVBdG9tQmxvY2suam9pbignJyksXG4gICAgVjNLX0VORF9BVE9NX0JMT0NLLFxuICAgIFYzS19CRUdJTl9CT05EX0JMT0NLLFxuICAgIG1vbGZpbGVCb25kQmxvY2suam9pbignJyksXG4gICAgVjNLX0VORF9CT05EX0JMT0NLLFxuICAgIFYzS19FTkRfQ1RBQl9CTE9DSyxcbiAgICBWM0tfRU5ELFxuICBdO1xuXG4gIHJldHVybiBtb2xmaWxlUGFydHMuam9pbignJyk7XG59XG5cbi8qIENhcCB0aGUgcmVzdWx0aW5nIChhZnRlciBzZXdpbmcgdXAgYWxsIHRoZSBtb25vbWVycykgbW9sZmlsZSB3aXRoICdPJyAqL1xuZnVuY3Rpb24gY2FwUmVzdWx0aW5nTW9sYmxvY2soXG4gIG1vbGZpbGVBdG9tQmxvY2s6IHN0cmluZ1tdLCBtb2xmaWxlQm9uZEJsb2NrOiBzdHJpbmdbXSxcbiAgdjogTG9vcFZhcmlhYmxlcywgQzogTG9vcENvbnN0YW50cywgbW9kZTogTU9ERVxuKTogdm9pZCB7XG4gIGlmIChtb2RlID09PSBNT0RFLlNUQU5EQVJEKSB7XG4gICAgLy8gYWRkIHRlcm1pbmFsIG94eWdlblxuICAgIGNvbnN0IGF0b21JZHggPSB2Lm5vZGVTaGlmdCArIDE7XG4gICAgbW9sZmlsZUF0b21CbG9ja1tDLmF0b21Db3VudF0gPSBWM0tfQkVHSU5fREFUQV9MSU5FICsgYXRvbUlkeCArICcgJyArXG4gICAgICBPWFlHRU4gKyAnICcgKyBrZWVwUHJlY2lzaW9uKHYuYmFja2JvbmVQb3NpdGlvblNoaWZ0WzBdKSArICcgJyArXG4gICAgICB2LmZsaXBGYWN0b3IgKiBrZWVwUHJlY2lzaW9uKHYuYmFja2JvbmVQb3NpdGlvblNoaWZ0WzFdKSArICcgJyArICcwLjAwMDAwMCAwJyArICdcXG4nO1xuXG4gICAgLy8gYWRkIHRlcm1pbmFsIGJvbmRcbiAgICBjb25zdCBmaXJzdEF0b20gPSB2LmJhY2tib25lQXR0YWNoTm9kZTtcbiAgICBjb25zdCBzZWNvbmRBdG9tID0gYXRvbUlkeDtcbiAgICBtb2xmaWxlQm9uZEJsb2NrW0MuYm9uZENvdW50XSA9IFYzS19CRUdJTl9EQVRBX0xJTkUgKyB2LmJvbmRTaGlmdCArICcgJyArXG4gICAgICAxICsgJyAnICsgZmlyc3RBdG9tICsgJyAnICsgc2Vjb25kQXRvbSArICdcXG4nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZEFtaW5vQWNpZFRvTW9sYmxvY2sobW9ub21lcjogTW9sR3JhcGgsIG1vbGZpbGVBdG9tQmxvY2s6IHN0cmluZ1tdLFxuICBtb2xmaWxlQm9uZEJsb2NrOiBzdHJpbmdbXSwgdjogTG9vcFZhcmlhYmxlcywgQzogTG9vcENvbnN0YW50c1xuKTogdm9pZCB7XG4gIHYuZmxpcEZhY3RvciA9ICgtMSkgKiogKHYuaSAlIDIpOyAvLyB0byBmbGlwIGV2ZXJ5IGV2ZW4gbW9ub21lciBvdmVyIE9YXG4gIGFkZEJhY2tib25lTW9ub21lclRvTW9sYmxvY2sobW9ub21lciwgbW9sZmlsZUF0b21CbG9jaywgbW9sZmlsZUJvbmRCbG9jaywgdiwgQyk7XG59XG5cbmZ1bmN0aW9uIGFkZE1vbm9tZXJUb01vbGJsb2NrU1QobW9ub21lcjogTW9sR3JhcGgsIG1vbGZpbGVBdG9tQmxvY2s6IHN0cmluZ1tdLFxuICBtb2xmaWxlQm9uZEJsb2NrOiBzdHJpbmdbXSwgdjogTG9vcFZhcmlhYmxlcywgQzogTG9vcENvbnN0YW50c1xuKTogdm9pZCB7XG4gIGFkZEJyYW5jaE1vbm9tZXJUb01vbGJsb2NrKG1vbm9tZXIsIG1vbGZpbGVBdG9tQmxvY2ssIG1vbGZpbGVCb25kQmxvY2ssIHYsIEMpO1xufVxuXG5mdW5jdGlvbiBhZGRCYWNrYm9uZU1vbm9tZXJUb01vbGJsb2NrKFxuICBtb25vbWVyOiBNb2xHcmFwaCwgbW9sZmlsZUF0b21CbG9jazogc3RyaW5nW10sIG1vbGZpbGVCb25kQmxvY2s6IHN0cmluZ1tdLCB2OiBMb29wVmFyaWFibGVzLCBDOiBMb29wQ29uc3RhbnRzXG4pOiB2b2lkIHtcbiAgLy8gdG9kbzogcmVtb3ZlIHRoZXNlIGNvbW1lbnRzIHRvIHRoZSBkb2NzdHJpbmdzIG9mIHRoZSBjb3JyLiBmdW5jdGlvbnNcbiAgLy8gY29uc3RydW5jdCB0aGUgbGluZXMgb2YgVjNLIG1vbGZpbGUgYXRvbSBibG9ja1xuICBmaWxsQXRvbUxpbmVzKG1vbm9tZXIsIG1vbGZpbGVBdG9tQmxvY2ssIHYpO1xuXG4gIC8vIGNvbnN0cnVjdCB0aGUgbGluZXMgb2YgVjNLIG1vbGZpbGUgYm9uZCBibG9ja1xuICBmaWxsQm9uZExpbmVzKG1vbm9tZXIsIG1vbGZpbGVCb25kQmxvY2ssIHYpO1xuXG4gIC8vIHBlcHRpZGUgYm9uZFxuICBmaWxsQ2hhaW5FeHRlbmRpbmdCb25kKG1vbm9tZXIsIG1vbGZpbGVCb25kQmxvY2ssIHYpO1xuXG4gIC8vIHVwZGF0ZSBicmFuY2ggdmFyaWFibGVzIGlmIG5lY2Vzc2FyeVxuICBpZiAobW9ub21lci5tZXRhLmJyYW5jaFNoaWZ0ICE9PSBudWxsICYmIG1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzLmxlbmd0aCA+IDIpXG4gICAgdXBkYXRlQnJhbmNoVmFyaWFibGVzKG1vbm9tZXIsIHYpO1xuXG4gIC8vIHVwZGF0ZSBsb29wIHZhcmlhYmxlc1xuICB1cGRhdGVDaGFpbkV4dGVuZGluZ1ZhcmlhYmxlcyhtb25vbWVyLCB2LCBDKTtcbn1cblxuLyogRGVmaW5lZCBmb3IgJ3N0YW5kYXJkIG1vZGUnIFJOQSBtb25vbWVycywgaS5lLiBvZiAnYnJhbmNoJyB0eXBlLCBhcyBpblxuICogSEVMTUNvcmVMaWJyYXJ5LiBXaWxsIG5vdCB3b3JrIGluIFNFUV9UUkFOIG1vZGUgKi9cbmZ1bmN0aW9uIGFkZE51Y2xlb3RpZGVUb01vbGJsb2NrKFxuICBudWNsZW9iYXNlOiBNb2xHcmFwaCwgbW9sZmlsZUF0b21CbG9jazogc3RyaW5nW10sIG1vbGZpbGVCb25kQmxvY2s6IHN0cmluZ1tdLCB2OiBMb29wVmFyaWFibGVzLCBDOiBMb29wQ29uc3RhbnRzXG4pOiB2b2lkIHtcbiAgLy8gY29uc3RydW5jdCB0aGUgbGluZXMgb2YgVjNLIG1vbGZpbGUgYXRvbSBibG9jayBjb3JyZXNwb25kaW5nIHRvIHBob3NwaGF0ZVxuICAvLyBhbmQgc3VnYXJcbiAgZm9yIChjb25zdCBtb25vbWVyIG9mIFtDLnBob3NwaGF0ZSwgQy5zdWdhcl0pXG4gICAgYWRkQmFja2JvbmVNb25vbWVyVG9Nb2xibG9jayhtb25vbWVyISwgbW9sZmlsZUF0b21CbG9jaywgbW9sZmlsZUJvbmRCbG9jaywgdiwgQyk7XG5cbiAgYWRkQnJhbmNoTW9ub21lclRvTW9sYmxvY2sobnVjbGVvYmFzZSwgbW9sZmlsZUF0b21CbG9jaywgbW9sZmlsZUJvbmRCbG9jaywgdiwgQyk7XG59XG5cbmZ1bmN0aW9uIGFkZEJyYW5jaE1vbm9tZXJUb01vbGJsb2NrKFxuICBtb25vbWVyOiBNb2xHcmFwaCwgbW9sZmlsZUF0b21CbG9jazogc3RyaW5nW10sIG1vbGZpbGVCb25kQmxvY2s6IHN0cmluZ1tdLCB2OiBMb29wVmFyaWFibGVzLCBDOiBMb29wQ29uc3RhbnRzXG4pOiB2b2lkIHtcbiAgZmlsbEJyYW5jaEF0b21MaW5lcyhtb25vbWVyLCBtb2xmaWxlQXRvbUJsb2NrLCB2KTtcbiAgZmlsbEJvbmRMaW5lcyhtb25vbWVyLCBtb2xmaWxlQm9uZEJsb2NrLCB2KTtcbiAgZmlsbEJhY2tib25lVG9CcmFuY2hCb25kKG1vbm9tZXIsIG1vbGZpbGVCb25kQmxvY2ssIHYpO1xuXG4gIC8vIEMtTiBib25kXG4gIGNvbnN0IGJvbmRJZHggPSB2LmJvbmRTaGlmdDtcbiAgY29uc3QgZmlyc3RBdG9tID0gdi5icmFuY2hBdHRhY2hOb2RlO1xuICBjb25zdCBzZWNvbmRBdG9tID0gbW9ub21lci5tZXRhLnRlcm1pbmFsTm9kZXNbMF0gKyB2Lm5vZGVTaGlmdDtcbiAgbW9sZmlsZUJvbmRCbG9ja1tib25kSWR4IC0gMV0gPSBWM0tfQkVHSU5fREFUQV9MSU5FICsgYm9uZElkeCArICcgJyArXG4gICAgMSArICcgJyArIGZpcnN0QXRvbSArICcgJyArIHNlY29uZEF0b20gKyAnXFxuJztcblxuICAvLyB1cGRhdGUgbG9vcCB2YXJpYWJsZXNcbiAgdi5ib25kU2hpZnQgKz0gbW9ub21lci5ib25kcy5hdG9tUGFpcnMubGVuZ3RoICsgMTtcbiAgdi5ub2RlU2hpZnQgKz0gbW9ub21lci5hdG9tcy5hdG9tVHlwZXMubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVDaGFpbkV4dGVuZGluZ1ZhcmlhYmxlcyhtb25vbWVyOiBNb2xHcmFwaCwgdjogTG9vcFZhcmlhYmxlcywgQzogTG9vcENvbnN0YW50cyk6IHZvaWQge1xuICB2LmJhY2tib25lQXR0YWNoTm9kZSA9IHYubm9kZVNoaWZ0ICsgbW9ub21lci5tZXRhLnRlcm1pbmFsTm9kZXNbMV07XG4gIHYuYm9uZFNoaWZ0ICs9IG1vbm9tZXIuYm9uZHMuYXRvbVBhaXJzLmxlbmd0aCArIDE7XG5cbiAgdi5ub2RlU2hpZnQgKz0gbW9ub21lci5hdG9tcy5hdG9tVHlwZXMubGVuZ3RoO1xuICB2LmJhY2tib25lUG9zaXRpb25TaGlmdFswXSArPSBtb25vbWVyLm1ldGEuYmFja2JvbmVTaGlmdCFbMF07IC8vIHRvZG86IG5vbi1udWxsIGNoZWNrXG4gIHYuYmFja2JvbmVQb3NpdGlvblNoaWZ0WzFdICs9IHYuZmxpcEZhY3RvciAqIG1vbm9tZXIubWV0YS5iYWNrYm9uZVNoaWZ0IVsxXTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlQnJhbmNoVmFyaWFibGVzKG1vbm9tZXI6IE1vbEdyYXBoLCB2OiBMb29wVmFyaWFibGVzKSB7XG4gIHYuYnJhbmNoQXR0YWNoTm9kZSA9IHYubm9kZVNoaWZ0ICsgbW9ub21lci5tZXRhLnRlcm1pbmFsTm9kZXNbMl07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgMjsgKytpKVxuICAgIHYuYnJhbmNoUG9zaXRpb25TaGlmdFtpXSA9IHYuYmFja2JvbmVQb3NpdGlvblNoaWZ0W2ldICsgbW9ub21lci5tZXRhLmJyYW5jaFNoaWZ0IVtpXTtcbn1cblxuZnVuY3Rpb24gZmlsbEF0b21MaW5lcyhtb25vbWVyOiBNb2xHcmFwaCwgbW9sZmlsZUF0b21CbG9jazogc3RyaW5nW10sIHY6IExvb3BWYXJpYWJsZXMpOiB2b2lkIHtcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBtb25vbWVyLmF0b21zLmF0b21UeXBlcy5sZW5ndGg7ICsraikge1xuICAgIGNvbnN0IGF0b21JZHggPSB2Lm5vZGVTaGlmdCArIGogKyAxO1xuICAgIG1vbGZpbGVBdG9tQmxvY2tbdi5ub2RlU2hpZnQgKyBqXSA9IFYzS19CRUdJTl9EQVRBX0xJTkUgKyBhdG9tSWR4ICsgJyAnICtcbiAgICAgIG1vbm9tZXIuYXRvbXMuYXRvbVR5cGVzW2pdICsgJyAnICtcbiAgICAgIGtlZXBQcmVjaXNpb24odi5iYWNrYm9uZVBvc2l0aW9uU2hpZnRbMF0gKyBtb25vbWVyLmF0b21zLnhbal0pICsgJyAnICtcbiAgICAgIGtlZXBQcmVjaXNpb24odi5iYWNrYm9uZVBvc2l0aW9uU2hpZnRbMV0gKyB2LmZsaXBGYWN0b3IgKiBtb25vbWVyLmF0b21zLnlbal0pICtcbiAgICAgICcgJyArIG1vbm9tZXIuYXRvbXMua3dhcmdzW2pdO1xuICB9XG59XG5cbi8vIHRvZG86IHJlbW92ZSBhcyBxdWlja2ZpeFxuZnVuY3Rpb24gZmlsbEJyYW5jaEF0b21MaW5lcyhtb25vbWVyOiBNb2xHcmFwaCwgbW9sZmlsZUF0b21CbG9jazogc3RyaW5nW10sIHY6IExvb3BWYXJpYWJsZXMpOiB2b2lkIHtcbiAgZm9yIChsZXQgaiA9IDA7IGogPCBtb25vbWVyLmF0b21zLmF0b21UeXBlcy5sZW5ndGg7ICsraikge1xuICAgIGNvbnN0IGF0b21JZHggPSB2Lm5vZGVTaGlmdCArIGogKyAxO1xuICAgIG1vbGZpbGVBdG9tQmxvY2tbdi5ub2RlU2hpZnQgKyBqXSA9IFYzS19CRUdJTl9EQVRBX0xJTkUgKyBhdG9tSWR4ICsgJyAnICtcbiAgICAgIG1vbm9tZXIuYXRvbXMuYXRvbVR5cGVzW2pdICsgJyAnICtcbiAgICAgIGtlZXBQcmVjaXNpb24odi5icmFuY2hQb3NpdGlvblNoaWZ0WzBdICsgbW9ub21lci5hdG9tcy54W2pdKSArICcgJyArXG4gICAgICBrZWVwUHJlY2lzaW9uKHYuYnJhbmNoUG9zaXRpb25TaGlmdFsxXSArIHYuZmxpcEZhY3RvciAqIG1vbm9tZXIuYXRvbXMueVtqXSkgK1xuICAgICAgJyAnICsgbW9ub21lci5hdG9tcy5rd2FyZ3Nbal07XG4gIH1cbn1cblxuZnVuY3Rpb24gZmlsbEJvbmRMaW5lcyhtb25vbWVyOiBNb2xHcmFwaCwgbW9sZmlsZUJvbmRCbG9jazogc3RyaW5nW10sIHY6IExvb3BWYXJpYWJsZXMpOiB2b2lkIHtcbiAgLy8gY29uc3RydWN0IHRoZSBsaW5lcyBvZiBWM0sgbW9sZmlsZSBib25kIGJsb2NrXG4gIGZvciAobGV0IGogPSAwOyBqIDwgbW9ub21lci5ib25kcy5hdG9tUGFpcnMubGVuZ3RoOyArK2opIHtcbiAgICBjb25zdCBib25kSWR4ID0gdi5ib25kU2hpZnQgKyBqICsgMTtcbiAgICBjb25zdCBmaXJzdEF0b20gPSBtb25vbWVyLmJvbmRzLmF0b21QYWlyc1tqXVswXSArIHYubm9kZVNoaWZ0O1xuICAgIGNvbnN0IHNlY29uZEF0b20gPSBtb25vbWVyLmJvbmRzLmF0b21QYWlyc1tqXVsxXSArIHYubm9kZVNoaWZ0O1xuICAgIGxldCBib25kQ2ZnID0gJyc7XG4gICAgaWYgKG1vbm9tZXIuYm9uZHMuYm9uZENvbmZpZ3VyYXRpb24uaGFzKGopKSB7XG4gICAgICAvLyBmbGlwIG9yaWVudGF0aW9uIHdoZW4gbmVjZXNzYXJ5XG4gICAgICBsZXQgb3JpZW50YXRpb24gPSBtb25vbWVyLmJvbmRzLmJvbmRDb25maWd1cmF0aW9uLmdldChqKTtcbiAgICAgIGlmICh2LmZsaXBGYWN0b3IgPCAwKVxuICAgICAgICBvcmllbnRhdGlvbiA9IChvcmllbnRhdGlvbiA9PT0gMSkgPyAzIDogMTtcbiAgICAgIGJvbmRDZmcgPSAnIENGRz0nICsgb3JpZW50YXRpb247XG4gICAgfVxuICAgIGNvbnN0IGt3YXJncyA9IG1vbm9tZXIuYm9uZHMua3dhcmdzLmhhcyhqKSA/XG4gICAgICAnICcgKyBtb25vbWVyLmJvbmRzLmt3YXJncy5nZXQoaikgOiAnJztcbiAgICBtb2xmaWxlQm9uZEJsb2NrW3YuYm9uZFNoaWZ0ICsgal0gPSBWM0tfQkVHSU5fREFUQV9MSU5FICsgYm9uZElkeCArICcgJyArXG4gICAgICBtb25vbWVyLmJvbmRzLmJvbmRUeXBlc1tqXSArICcgJyArXG4gICAgICBmaXJzdEF0b20gKyAnICcgKyBzZWNvbmRBdG9tICsgYm9uZENmZyArIGt3YXJncyArICdcXG4nO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbGxDaGFpbkV4dGVuZGluZ0JvbmQobW9ub21lcjogTW9sR3JhcGgsIG1vbGZpbGVCb25kQmxvY2s6IHN0cmluZ1tdLCB2OiBMb29wVmFyaWFibGVzKTogdm9pZCB7XG4gIGlmICh2LmJhY2tib25lQXR0YWNoTm9kZSAhPT0gMCkge1xuICAgIGNvbnN0IGJvbmRJZHggPSB2LmJvbmRTaGlmdDtcbiAgICBjb25zdCBmaXJzdEF0b20gPSB2LmJhY2tib25lQXR0YWNoTm9kZTtcbiAgICBjb25zdCBzZWNvbmRBdG9tID0gbW9ub21lci5tZXRhLnRlcm1pbmFsTm9kZXNbMF0gKyB2Lm5vZGVTaGlmdDtcbiAgICBtb2xmaWxlQm9uZEJsb2NrW3YuYm9uZFNoaWZ0IC0gMV0gPSBWM0tfQkVHSU5fREFUQV9MSU5FICsgYm9uZElkeCArICcgJyArXG4gICAgICAxICsgJyAnICsgZmlyc3RBdG9tICsgJyAnICsgc2Vjb25kQXRvbSArICdcXG4nO1xuICB9XG59XG5cbi8vIHRvZG86IHJlbW92ZVxuZnVuY3Rpb24gZmlsbEJhY2tib25lVG9CcmFuY2hCb25kKGJyYW5jaE1vbm9tZXI6IE1vbEdyYXBoLCBtb2xmaWxlQm9uZEJsb2NrOiBzdHJpbmdbXSwgdjogTG9vcFZhcmlhYmxlcyk6IHZvaWQge1xuICBjb25zdCBib25kSWR4ID0gdi5ib25kU2hpZnQ7XG4gIGNvbnN0IGZpcnN0QXRvbSA9IHYuYnJhbmNoQXR0YWNoTm9kZTtcbiAgY29uc3Qgc2Vjb25kQXRvbSA9IGJyYW5jaE1vbm9tZXIubWV0YS50ZXJtaW5hbE5vZGVzWzBdICsgdi5ub2RlU2hpZnQ7XG4gIG1vbGZpbGVCb25kQmxvY2tbYm9uZElkeCAtIDFdID0gVjNLX0JFR0lOX0RBVEFfTElORSArIGJvbmRJZHggKyAnICcgK1xuICAgIDEgKyAnICcgKyBmaXJzdEF0b20gKyAnICcgKyBzZWNvbmRBdG9tICsgJ1xcbic7XG59XG5cbi8qIENvbXB1dGUgdGhlIGF0b20vYm9uZCBjb3VudHMgZm9yIHRoZSByZXN1bHRpbmcgbW9sZmlsZSwgZGVwZW5kaW5nIG9uIHRoZVxuICogdHlwZSBvZiBwb2x5bWVyIChwZXB0aWRlL251Y2xlb3RpZGUpICovXG5mdW5jdGlvbiBnZXRSZXN1bHRpbmdBdG9tQm9uZENvdW50cyhcbiAgbW9ub21lclNlcTogc3RyaW5nW10sIG1vbm9tZXJzRGljdDogTWFwPHN0cmluZywgTW9sR3JhcGg+LFxuICBhbHBoYWJldDogQUxQSEFCRVQsIHBvbHltZXJUeXBlOiBIRUxNX1BPTFlNRVJfVFlQRSxcbiAgbW9kZTogTU9ERVxuKTogeyBhdG9tQ291bnQ6IG51bWJlciwgYm9uZENvdW50OiBudW1iZXIgfSB7XG4gIGxldCBhdG9tQ291bnQgPSAwO1xuICBsZXQgYm9uZENvdW50ID0gMDtcblxuICAvLyBzdW0gdXAgYWxsIHRoZSBhdG9tcy9ub2RlcyBwcm92aWRlZCBieSB0aGUgc2VxdWVuY2VcbiAgZm9yIChjb25zdCBtb25vbWVyU3ltYm9sIG9mIG1vbm9tZXJTZXEpIHtcbiAgICBpZiAobW9ub21lclN5bWJvbCA9PT0gJycpIGNvbnRpbnVlOyAvLyBTa2lwIGZvciBnYXAvZW1wdHkgbW9ub21lciBpbiBNU0FcbiAgICBjb25zdCBtb25vbWVyID0gbW9ub21lcnNEaWN0LmdldChtb25vbWVyU3ltYm9sKSE7XG4gICAgYXRvbUNvdW50ICs9IG1vbm9tZXIuYXRvbXMueC5sZW5ndGg7XG4gICAgYm9uZENvdW50ICs9IG1vbm9tZXIuYm9uZHMuYm9uZFR5cGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIGFkZCBleHRyYSB2YWx1ZXMgZGVwZW5kaW5nIG9uIHRoZSBwb2x5bWVyIHR5cGVcbiAgaWYgKG1vZGUgPT09IE1PREUuU1RBTkRBUkQpIHtcbiAgICBpZiAocG9seW1lclR5cGUgPT09IEhFTE1fUE9MWU1FUl9UWVBFLlBFUFRJREUpIHtcbiAgICAgIC8vIGFkZCB0aGUgcmlnaHRtb3N0L3Rlcm1pbmF0aW5nIGNhcCBncm91cCAnT0gnIChpLmUuICdPJylcbiAgICAgIGF0b21Db3VudCArPSAxO1xuICAgICAgLy8gYWRkIGNoYWluLWV4dGVuZGluZyBib25kcyAoQy1OSCBwZXIgZWFjaCBtb25vbWVyIHBhaXIgYW5kIHRlcm1pbmFsIEMtT0gpXG4gICAgICBib25kQ291bnQgKz0gbW9ub21lclNlcS5sZW5ndGg7XG4gICAgfSBlbHNlIHsgLy8gbnVjbGVvdGlkZXNcbiAgICAgIGNvbnN0IHN1Z2FyID0gKGFscGhhYmV0ID09PSBBTFBIQUJFVC5ETkEpID9cbiAgICAgICAgbW9ub21lcnNEaWN0LmdldChERU9YWVJJQk9TRSkhIDogbW9ub21lcnNEaWN0LmdldChSSUJPU0UpITtcbiAgICAgIGNvbnN0IHBob3NwaGF0ZSA9IG1vbm9tZXJzRGljdC5nZXQoUEhPU1BIQVRFKSE7XG5cbiAgICAgIC8vIGFkZCBwaG9zcGhhdGUgYW5kIHN1Z2FyIHBlciBlYWNoIG51Y2xlb2Jhc2Ugc3ltYm9sXG4gICAgICBhdG9tQ291bnQgKz0gbW9ub21lclNlcS5sZW5ndGggKiAocGhvc3BoYXRlLmF0b21zLngubGVuZ3RoICsgc3VnYXIuYXRvbXMueC5sZW5ndGgpO1xuICAgICAgLy8gYWRkIHRoZSBsZWZ0bW9zdCBjYXAgZ3JvdXAgJ09IJyAoaS5lLiAnTycpIHRvIHRoZSBmaXJzdCBwaG9zcGhhdGVcbiAgICAgIGF0b21Db3VudCArPSAxO1xuXG4gICAgICAvLyBhZGQgYm9uZHMgZnJvbSBwaG9zcGhhdGUgYW5kIHN1Z2FyXG4gICAgICBib25kQ291bnQgKz0gbW9ub21lclNlcS5sZW5ndGggKiAocGhvc3BoYXRlLmJvbmRzLmJvbmRUeXBlcy5sZW5ndGggKyBzdWdhci5ib25kcy5ib25kVHlwZXMubGVuZ3RoKTtcblxuICAgICAgLy8gYWRkIGNoYWluLWV4dGVuZGluZyBhbmQgYnJhbmNoIGJvbmRzIChPLVAsIEMtTyBhbmQgQy1OIHBlciBlYWNoIG51Y2xlb3RpZGUpXG4gICAgICBib25kQ291bnQgKz0gbW9ub21lclNlcS5sZW5ndGggKiAzO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyB0b2RvOiBmaWxsIGZvciBTZXF1ZW5jZVRyYW5zbGF0b3JcbiAgfVxuXG4gIHJldHVybiB7YXRvbUNvdW50LCBib25kQ291bnR9O1xufVxuXG4vKiBLZWVwIHByZWNpc2lvbiB1cG9uIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbnMgb3ZlciBhdG9tIGNvb3JkaW5hdGVzICovXG5mdW5jdGlvbiBrZWVwUHJlY2lzaW9uKHg6IG51bWJlcikge1xuICByZXR1cm4gTWF0aC5yb3VuZChQUkVDSVNJT05fRkFDVE9SICogeCkgLyBQUkVDSVNJT05fRkFDVE9SO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0TW9sR3JhcGhUb01vbGZpbGVWM0sobW9sR3JhcGg6IE1vbEdyYXBoKTogc3RyaW5nIHtcbiAgLy8gY291bnRzIGxpbmVcbiAgY29uc3QgYXRvbVR5cGUgPSBtb2xHcmFwaC5hdG9tcy5hdG9tVHlwZXM7XG4gIGNvbnN0IHggPSBtb2xHcmFwaC5hdG9tcy54O1xuICBjb25zdCB5ID0gbW9sR3JhcGguYXRvbXMueTtcbiAgY29uc3QgYXRvbUt3YXJncyA9IG1vbEdyYXBoLmF0b21zLmt3YXJncztcbiAgY29uc3QgYm9uZFR5cGUgPSBtb2xHcmFwaC5ib25kcy5ib25kVHlwZXM7XG4gIGNvbnN0IGF0b21QYWlyID0gbW9sR3JhcGguYm9uZHMuYXRvbVBhaXJzO1xuICBjb25zdCBib25kS3dhcmdzID0gbW9sR3JhcGguYm9uZHMua3dhcmdzO1xuICBjb25zdCBib25kQ29uZmlnID0gbW9sR3JhcGguYm9uZHMuYm9uZENvbmZpZ3VyYXRpb247XG4gIGNvbnN0IGF0b21Db3VudCA9IGF0b21UeXBlLmxlbmd0aDtcbiAgY29uc3QgYm9uZENvdW50ID0gbW9sR3JhcGguYm9uZHMuYm9uZFR5cGVzLmxlbmd0aDtcblxuICAvLyB0b2RvIHJld3JpdGUgdXNpbmcgY29uc3RhbnRzXG4gIGNvbnN0IG1vbGZpbGVDb3VudHNMaW5lID0gVjNLX0JFR0lOX0NPVU5UU19MSU5FICsgYXRvbUNvdW50ICsgJyAnICsgYm9uZENvdW50ICsgVjNLX0NPVU5UU19MSU5FX0VORElORztcblxuICAvLyBhdG9tIGJsb2NrXG4gIGxldCBtb2xmaWxlQXRvbUJsb2NrID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXRvbUNvdW50OyArK2kpIHtcbiAgICBjb25zdCBhdG9tSWR4ID0gaSArIDE7XG4gICAgY29uc3QgY29vcmRpbmF0ZSA9IFt4W2ldLnRvU3RyaW5nKCksIHlbaV0udG9TdHJpbmcoKV07XG5cbiAgICAvLyBmb3JtYXQgY29vcmRpbmF0ZXMgc28gdGhhdCB0aGV5IGhhdmUgNiBkaWdpdHMgYWZ0ZXIgZGVjaW1hbCBwb2ludFxuICAgIC8vIGZvciAobGV0IGsgPSAwOyBrIDwgMjsgKytrKSB7XG4gICAgLy8gICBjb25zdCBmb3JtYXR0ZWQgPSBjb29yZGluYXRlW2tdLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcbiAgICAvLyAgIGlmIChmb3JtYXR0ZWQubGVuZ3RoID09PSAxKVxuICAgIC8vICAgICBmb3JtYXR0ZWQucHVzaCgnMCcpO1xuICAgIC8vICAgZm9ybWF0dGVkWzFdID0gZm9ybWF0dGVkWzFdLnBhZEVuZChWM0tfQVRPTV9DT09SRElOQVRFX1BSRUNJU0lPTiwgJzAnKTtcbiAgICAvLyAgIGNvb3JkaW5hdGVba10gPSBmb3JtYXR0ZWQuam9pbignLicpO1xuICAgIC8vIH1cblxuICAgIGNvbnN0IGF0b21MaW5lID0gVjNLX0JFR0lOX0RBVEFfTElORSArIGF0b21JZHggKyAnICcgKyBhdG9tVHlwZVtpXSArICcgJyArXG4gICAgICBjb29yZGluYXRlWzBdICsgJyAnICsgY29vcmRpbmF0ZVsxXSArICcgJyArIGF0b21Ld2FyZ3NbaV07XG4gICAgbW9sZmlsZUF0b21CbG9jayArPSBhdG9tTGluZTtcbiAgfVxuXG4gIC8vIGJvbmQgYmxvY2tcbiAgbGV0IG1vbGZpbGVCb25kQmxvY2sgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBib25kQ291bnQ7ICsraSkge1xuICAgIGNvbnN0IGJvbmRJZHggPSBpICsgMTtcbiAgICBjb25zdCBmaXJzdEF0b20gPSBhdG9tUGFpcltpXVswXTtcbiAgICBjb25zdCBzZWNvbmRBdG9tID0gYXRvbVBhaXJbaV1bMV07XG4gICAgY29uc3Qga3dhcmdzID0gYm9uZEt3YXJncy5oYXMoaSkgPyAnICcgKyBib25kS3dhcmdzLmdldChpKSA6ICcnO1xuICAgIGNvbnN0IGJvbmRDZmcgPSBib25kQ29uZmlnLmhhcyhpKSA/ICcgQ0ZHPScgKyBib25kQ29uZmlnLmdldChpKSA6ICcnO1xuICAgIGNvbnN0IGJvbmRMaW5lID0gVjNLX0JFR0lOX0RBVEFfTElORSArIGJvbmRJZHggKyAnICcgKyBib25kVHlwZVtpXSArICcgJyArXG4gICAgICBmaXJzdEF0b20gKyAnICcgKyBzZWNvbmRBdG9tICsgYm9uZENmZyArIGt3YXJncyArICdcXG4nO1xuICAgIG1vbGZpbGVCb25kQmxvY2sgKz0gYm9uZExpbmU7XG4gIH1cblxuICBjb25zdCBtb2xmaWxlUGFydHMgPSBbXG4gICAgVjNLX0hFQURFUl9GSVJTVF9MSU5FLFxuICAgIFYzS19IRUFERVJfU0VDT05EX0xJTkUsXG4gICAgVjNLX0JFR0lOX0NUQUJfQkxPQ0ssXG4gICAgbW9sZmlsZUNvdW50c0xpbmUsXG4gICAgVjNLX0JFR0lOX0FUT01fQkxPQ0ssXG4gICAgbW9sZmlsZUF0b21CbG9jayxcbiAgICBWM0tfRU5EX0FUT01fQkxPQ0ssXG4gICAgVjNLX0JFR0lOX0JPTkRfQkxPQ0ssXG4gICAgbW9sZmlsZUJvbmRCbG9jayxcbiAgICBWM0tfRU5EX0JPTkRfQkxPQ0ssXG4gICAgVjNLX0VORF9DVEFCX0JMT0NLLFxuICAgIFYzS19FTkQsXG4gIF07XG4gIGNvbnN0IHJlc3VsdGluZ01vbGZpbGUgPSBtb2xmaWxlUGFydHMuam9pbignJyk7XG4gIC8vIGNvbnNvbGUubG9nKHJlc3VsdGluZ01vbGZpbGUpO1xuXG4gIHJldHVybiByZXN1bHRpbmdNb2xmaWxlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3ltYm9sVG9DYXBwZWRNb2xmaWxlTWFwKG1vbm9tZXJzTGliTGlzdDogYW55W10pOiBQcm9taXNlPE1hcDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ+IHtcbiAgaWYgKERHLkZ1bmMuZmluZCh7cGFja2FnZTogJ0NoZW0nLCBuYW1lOiAnZ2V0UmRLaXRNb2R1bGUnfSkubGVuZ3RoID09PSAwKSB7XG4gICAgZ3Jvay5zaGVsbC53YXJuaW5nKCdUcmFuc2Zvcm1hdGlvbiB0byBhdG9taWMgbGV2ZWwgcmVxdWlyZXMgcGFja2FnZSBcIkNoZW1cIiBpbnN0YWxsZWQuJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3ltYm9sVG9DYXBwZWRNb2xmaWxlTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgY29uc3QgbW9kdWxlUmRraXQgPSBhd2FpdCBncm9rLmZ1bmN0aW9ucy5jYWxsKCdDaGVtOmdldFJkS2l0TW9kdWxlJyk7XG5cbiAgZm9yIChjb25zdCBtb25vbWVyTGliT2JqZWN0IG9mIG1vbm9tZXJzTGliTGlzdCkge1xuICAgIGNvbnN0IG1vbm9tZXJTeW1ib2wgPSBtb25vbWVyTGliT2JqZWN0W0hFTE1fRklFTERTLlNZTUJPTF07XG4gICAgY29uc3QgY2FwR3JvdXBzID0gcGFyc2VDYXBHcm91cHMobW9ub21lckxpYk9iamVjdFtIRUxNX0ZJRUxEUy5SR1JPVVBTXSk7XG4gICAgY29uc3QgY2FwR3JvdXBJZHhNYXAgPSBwYXJzZUNhcEdyb3VwSWR4TWFwKG1vbm9tZXJMaWJPYmplY3RbSEVMTV9GSUVMRFMuTU9MRklMRV0pO1xuXG4gICAgY29uc3QgbW9sZmlsZVYzSyA9IGNvbnZlcnRNb2xmaWxlVG9WM0socmVtb3ZlUkdyb3VwTGluZXMobW9ub21lckxpYk9iamVjdFtIRUxNX0ZJRUxEUy5NT0xGSUxFXSksIG1vZHVsZVJka2l0KTtcbiAgICBjb25zdCBjb3VudHMgPSBwYXJzZUF0b21BbmRCb25kQ291bnRzKG1vbGZpbGVWM0spO1xuXG4gICAgY29uc3QgYXRvbXMgPSBwYXJzZUF0b21CbG9jayhtb2xmaWxlVjNLLCBjb3VudHMuYXRvbUNvdW50KTtcbiAgICBjb25zdCBib25kcyA9IHBhcnNlQm9uZEJsb2NrKG1vbGZpbGVWM0ssIGNvdW50cy5ib25kQ291bnQpO1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNb25vbWVyTWV0YWRhdGEoYXRvbXMsIGJvbmRzLCBjYXBHcm91cHMsIGNhcEdyb3VwSWR4TWFwKTtcblxuICAgIGNvbnN0IG1vbm9tZXJHcmFwaDogTW9sR3JhcGggPSB7YXRvbXM6IGF0b21zLCBib25kczogYm9uZHMsIG1ldGE6IG1ldGF9O1xuXG4gICAgcmVtb3ZlSHlkcm9nZW4obW9ub21lckdyYXBoKTtcblxuICAgIGNvbnN0IG1vbGZpbGUgPSBjb252ZXJ0TW9sR3JhcGhUb01vbGZpbGVWM0sobW9ub21lckdyYXBoKTtcbiAgICBzeW1ib2xUb0NhcHBlZE1vbGZpbGVNYXAuc2V0KG1vbm9tZXJTeW1ib2wsIG1vbGZpbGUpO1xuICB9XG4gIHJldHVybiBzeW1ib2xUb0NhcHBlZE1vbGZpbGVNYXA7XG59XG5cbi8qIEdldCB0aGUgVjNLIG1vbGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgY2FwcGVkIE1vbm9tZXIgKGRlZmF1bHQgY2FwIGdyb3VwcykgICovXG5leHBvcnQgZnVuY3Rpb24gY2FwUGVwdGlkZU1vbm9tZXIobW9ub21lcjogTW9ub21lcik6IHN0cmluZyB7XG4gIGNvbnN0IGZ1bmNMaXN0OiBERy5GdW5jW10gPSBERy5GdW5jLmZpbmQoe3BhY2thZ2U6ICdDaGVtJywgbmFtZTogJ2dldFJkS2l0TW9kdWxlJ30pO1xuICBjb25zdCBtb2R1bGVSZGtpdCA9IGZ1bmNMaXN0WzBdLmFwcGx5KCk7XG5cbiAgY29uc3QgY2FwR3JvdXBzID0gcGFyc2VDYXBHcm91cHMobW9ub21lcltIRUxNX0ZJRUxEUy5SR1JPVVBTXSk7XG4gIGNvbnN0IGNhcEdyb3VwSWR4TWFwID0gcGFyc2VDYXBHcm91cElkeE1hcChtb25vbWVyW0hFTE1fRklFTERTLk1PTEZJTEVdKTtcbiAgY29uc3QgbW9sZmlsZVYzSyA9IGNvbnZlcnRNb2xmaWxlVG9WM0socmVtb3ZlUkdyb3VwTGluZXMobW9ub21lcltIRUxNX0ZJRUxEUy5NT0xGSUxFXSksIG1vZHVsZVJka2l0KTtcbiAgY29uc3QgY291bnRzID0gcGFyc2VBdG9tQW5kQm9uZENvdW50cyhtb2xmaWxlVjNLKTtcblxuICBjb25zdCBhdG9tcyA9IHBhcnNlQXRvbUJsb2NrKG1vbGZpbGVWM0ssIGNvdW50cy5hdG9tQ291bnQpO1xuICBjb25zdCBib25kcyA9IHBhcnNlQm9uZEJsb2NrKG1vbGZpbGVWM0ssIGNvdW50cy5ib25kQ291bnQpO1xuICBjb25zdCBtZXRhID0gZ2V0TW9ub21lck1ldGFkYXRhKGF0b21zLCBib25kcywgY2FwR3JvdXBzLCBjYXBHcm91cElkeE1hcCk7XG5cbiAgY29uc3QgbW9ub21lckdyYXBoOiBNb2xHcmFwaCA9IHthdG9tczogYXRvbXMsIGJvbmRzOiBib25kcywgbWV0YTogbWV0YX07XG5cbiAgYWRqdXN0UGVwdGlkZU1vbm9tZXJHcmFwaChtb25vbWVyR3JhcGgpO1xuXG4gIGNvbnN0IG1vbGZpbGUgPSBjb252ZXJ0TW9sR3JhcGhUb01vbGZpbGVWM0sobW9ub21lckdyYXBoKTtcbiAgcmV0dXJuIG1vbGZpbGU7XG59XG5cbi8vLy8vLy8vLy8vLy8vLyAgU2VxdWVuY2UgdHJhbnNsYXRvciAvLy8vLy8vLy8vLy8vLy8vL1xuXG4vKiogQ3VycmVudGx5IHRoZSBTVCBoYXMgcGVjdWxpYXIgdHlwZXMgb2YgbW9ub21lcnMsIHdoaWNoIGRvIG5vdCBmaXQgdGhlIEhFTE1cbiAqIENvcmUgbGlicmFyeSB0eXBlcyAoaW4gcGFydGljdWxhciwgdGhlIFJOQSBtb25vbWVycyBhcmUgYmFja2JvbmVzIG9ubHksXG4gKiBhbmQgcHJlc2VudGVkIGluIE1vbGZpbGUgVjNLIGZvcm1hdCkuXG4gKiBUT0RPOiBpbnRlZ3JhdGUgdGhpcyBwYXJ0IHdpdGggdGhlIGFib3ZlIGZ1bmN0aW9uYWxpdHlcbiAqIEN1c3RvbSBfdG9BdG9taWNMZXZlbCB2ZXJzaW9uIGZvciBTZXF1ZW5jZVRyYW5zbGF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlcXVlbmNlVG9Nb2xGaWxlU1QoXG4gIG1vbm9tZXJTZXE6IHN0cmluZ1tdLCAvLyBzZXF1ZW5jZSBvZiB2YWx1ZXMgb2YgJ3N5bWJvbCcgZmllbGQgZm9yIG1vbm9tZXJzXG4gIHN5bWJvbFRvTW9sZmlsZVYzS09iajogeyBbc3ltYm9sOiBzdHJpbmddOiBzdHJpbmcgfSAvLyBtYXBwaW5nIG9mIHN5bWJvbCB0byBtb2xmaWxlIFYzMDAwXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgLy8gd29yayBpbiBTRVFfVFJBTiBtb2RlLCB3aGVyZTpcbiAgLy8gLSBtb25vbWVycyB3aXRoIHBvbHltZXJUeXBlICdSTkEnIGhhdmUgbW9ub21lciB0eXBlICdiYWNrYm9uZSdcbiAgLy8gLSB0aGUgbGlicmFyeSBwcm92aWRlcyBtb2xmaWxlcyBpbiBmb3JtYXQgVjMwMDBcbiAgY29uc3QgbW9kZSA9IE1PREUuU0VRX1RSQU47XG4gIGNvbnN0IGFscGhhYmV0ID0gQUxQSEFCRVQuUFQ7IC8vIGR1bW15IHZhbHVlISB0b2RvOiBtYWtlIHRoZSBhcmd1bWVudCBvcHRpb25hbFxuICBjb25zdCBwb2x5bWVyVHlwZSA9IEhFTE1fUE9MWU1FUl9UWVBFLlJOQTsgLy8gZHVtbXkgdmFsdWUhIHRvZG86IG1ha2UgdGhlIGFyZ3VtZW50IG9wdGlvbmFsXG5cbiAgLy8gdG9kbzogY29uc2lkZXIgcmVmYWN0b3JpbmcgZnJvbSBvYmogdG8gbWFwIGluIG1vbm9tZXItd29ybHNcbiAgY29uc3Qgc3ltYm9sVG9Nb2xmaWxlVjNLTWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBzeW0gaW4gc3ltYm9sVG9Nb2xmaWxlVjNLT2JqKVxuICAgIHN5bWJvbFRvTW9sZmlsZVYzS01hcC5zZXQoc3ltLCBzeW1ib2xUb01vbGZpbGVWM0tPYmpbc3ltXSk7XG5cbiAgY29uc3QgbW9ub21lcnNEaWN0ID0gZ2V0TW9ub21lcnNEaWN0RnJvbU1hcChzeW1ib2xUb01vbGZpbGVWM0tNYXApO1xuICBjb25zdCByZXN1bHQgPSBtb25vbWVyU2VxVG9Nb2xmaWxlKG1vbm9tZXJTZXEsIG1vbm9tZXJzRGljdCwgYWxwaGFiZXQsIHBvbHltZXJUeXBlLCBtb2RlKTtcbiAgLy8gY29uc29sZS5sb2cocmVjb25zdHJ1Y3RlZFtyb3ddKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiBDb21wdXRlIHRoZSBhdG9tL2JvbmQgY291bnRzIGZvciB0aGUgcmVzdWx0aW5nIG1vbGZpbGUsIGRlcGVuZGluZyBvbiB0aGVcbiAqIHR5cGUgb2YgcG9seW1lciAocGVwdGlkZS9udWNsZW90aWRlKSAqL1xuZnVuY3Rpb24gZ2V0UmVzdWx0aW5nQXRvbUJvbmRDb3VudHNTVChcbiAgbW9ub21lclNlcTogc3RyaW5nW10sIG1vbm9tZXJzRGljdDogTWFwPHN0cmluZywgTW9sR3JhcGg+LFxuICBhbHBoYWJldDogQUxQSEFCRVQsIHBvbHltZXJUeXBlOiBIRUxNX1BPTFlNRVJfVFlQRVxuKTogeyBhdG9tQ291bnQ6IG51bWJlciwgYm9uZENvdW50OiBudW1iZXIgfSB7XG4gIGxldCBhdG9tQ291bnQgPSAwO1xuICBsZXQgYm9uZENvdW50ID0gMDtcblxuICAvLyBzdW0gdXAgYWxsIHRoZSBhdG9tcy9ub2RlcyBwcm92aWRlZCBieSB0aGUgc2VxdWVuY2VcbiAgZm9yIChjb25zdCBtb25vbWVyU3ltYm9sIG9mIG1vbm9tZXJTZXEpIHtcbiAgICBjb25zdCBtb25vbWVyID0gbW9ub21lcnNEaWN0LmdldChtb25vbWVyU3ltYm9sKSE7XG4gICAgYXRvbUNvdW50ICs9IG1vbm9tZXIuYXRvbXMueC5sZW5ndGg7XG4gICAgYm9uZENvdW50ICs9IG1vbm9tZXIuYm9uZHMuYm9uZFR5cGVzLmxlbmd0aDtcbiAgfVxuXG4gIC8vIGFkZCBleHRyYSB2YWx1ZXMgZGVwZW5kaW5nIG9uIHRoZSBwb2x5bWVyIHR5cGVcbiAgaWYgKHBvbHltZXJUeXBlID09PSBIRUxNX1BPTFlNRVJfVFlQRS5QRVBUSURFKSB7XG4gICAgLy8gYWRkIHRoZSByaWdodG1vc3QvdGVybWluYXRpbmcgY2FwIGdyb3VwICdPSCcgKGkuZS4gJ08nKVxuICAgIGF0b21Db3VudCArPSAxO1xuICAgIC8vIGFkZCBjaGFpbi1leHRlbmRpbmcgYm9uZHMgKEMtTkggcGVyIGVhY2ggbW9ub21lciBwYWlyIGFuZCB0ZXJtaW5hbCBDLU9IKVxuICAgIGJvbmRDb3VudCArPSBtb25vbWVyU2VxLmxlbmd0aDtcbiAgfSBlbHNlIHsgLy8gbnVjbGVvdGlkZXNcbiAgICBjb25zdCBzdWdhciA9IChhbHBoYWJldCA9PT0gQUxQSEFCRVQuRE5BKSA/XG4gICAgICBtb25vbWVyc0RpY3QuZ2V0KERFT1hZUklCT1NFKSEgOiBtb25vbWVyc0RpY3QuZ2V0KFJJQk9TRSkhO1xuICAgIGNvbnN0IHBob3NwaGF0ZSA9IG1vbm9tZXJzRGljdC5nZXQoUEhPU1BIQVRFKSE7XG5cbiAgICAvLyBhZGQgcGhvc3BoYXRlIGFuZCBzdWdhciBwZXIgZWFjaCBudWNsZW9iYXNlIHN5bWJvbFxuICAgIGF0b21Db3VudCArPSBtb25vbWVyU2VxLmxlbmd0aCAqIChwaG9zcGhhdGUuYXRvbXMueC5sZW5ndGggKyBzdWdhci5hdG9tcy54Lmxlbmd0aCk7XG4gICAgLy8gYWRkIHRoZSBsZWZ0bW9zdCBjYXAgZ3JvdXAgJ09IJyAoaS5lLiAnTycpIHRvIHRoZSBmaXJzdCBwaG9zcGhhdGVcbiAgICBhdG9tQ291bnQgKz0gMTtcblxuICAgIC8vIGFkZCBib25kcyBmcm9tIHBob3NwaGF0ZSBhbmQgc3VnYXJcbiAgICBib25kQ291bnQgKz0gbW9ub21lclNlcS5sZW5ndGggKiAocGhvc3BoYXRlLmJvbmRzLmJvbmRUeXBlcy5sZW5ndGggKyBzdWdhci5ib25kcy5ib25kVHlwZXMubGVuZ3RoKTtcblxuICAgIC8vIGFkZCBjaGFpbi1leHRlbmRpbmcgYW5kIGJyYW5jaCBib25kcyAoTy1QLCBDLU8gYW5kIEMtTiBwZXIgZWFjaCBudWNsZW90aWRlKVxuICAgIGJvbmRDb3VudCArPSBtb25vbWVyU2VxLmxlbmd0aCAqIDM7XG4gIH1cblxuICByZXR1cm4ge2F0b21Db3VudCwgYm9uZENvdW50fTtcbn1cbiJdfQ==